diff --git a/app/Entities/Payments/PaymentsRepository.php b/app/Entities/Payments/PaymentsRepository.php
index 4f957db..ee42f92 100755
--- a/app/Entities/Payments/PaymentsRepository.php
+++ b/app/Entities/Payments/PaymentsRepository.php
@@ -18,7 +18,7 @@ class PaymentsRepository extends BaseRepository
public function getAll($q)
{
- return $this->model->latest()
+ return $this->model->orderBy('date','desc')
->paginate($this->_paginate);
}
}
\ No newline at end of file
diff --git a/app/Entities/Projects/Feature.php b/app/Entities/Projects/Feature.php
index ab7eaa8..5bb4cfa 100755
--- a/app/Entities/Projects/Feature.php
+++ b/app/Entities/Projects/Feature.php
@@ -3,6 +3,8 @@
namespace App\Entities\Projects;
use App\Entities\Projects\FeaturePresenter;
+use App\Entities\Projects\Project;
+use App\Entities\Users\User;
use Illuminate\Database\Eloquent\Model;
use Laracasts\Presenter\PresentableTrait;
@@ -13,4 +15,19 @@ class Feature extends Model {
protected $presenter = FeaturePresenter::class;
protected $guarded = ['id','created_at','updated_at'];
+ public function project()
+ {
+ return $this->belongsTo(Project::class, 'project_id');
+ }
+
+ public function worker()
+ {
+ return $this->belongsTo(User::class, 'worker_id');
+ }
+
+ public function tasks()
+ {
+ return $this->hasMany(Task::class);
+ }
+
}
diff --git a/app/Entities/Projects/FeaturesRepository.php b/app/Entities/Projects/FeaturesRepository.php
index 5e484bf..c4ff837 100755
--- a/app/Entities/Projects/FeaturesRepository.php
+++ b/app/Entities/Projects/FeaturesRepository.php
@@ -3,6 +3,7 @@
namespace App\Entities\Projects;
use App\Entities\BaseRepository;
+use App\Entities\Projects\Project;
/**
* Features Repository Class
@@ -21,10 +22,9 @@ class FeaturesRepository extends BaseRepository
return Project::findOrFail($projectId);
}
- public function create($featureData)
+ public function createFeature($featureData, $projectId)
{
- dd($featureData);
- $featureData['feature_value'] = $featureData['proposal_value'];
+ $featureData['project_id'] = $projectId;
return $this->storeArray($featureData);
}
}
\ No newline at end of file
diff --git a/app/Entities/Projects/ProjectsRepository.php b/app/Entities/Projects/ProjectsRepository.php
index 48a2f10..bdc78a7 100755
--- a/app/Entities/Projects/ProjectsRepository.php
+++ b/app/Entities/Projects/ProjectsRepository.php
@@ -77,4 +77,9 @@ class ProjectsRepository extends BaseRepository
return $project->delete();
}
+
+ public function getProjectFeatures($projectId)
+ {
+ return Feature::whereProjectId($projectId)->with('worker')->get();
+ }
}
\ No newline at end of file
diff --git a/app/Http/Controllers/Projects/FeaturesController.php b/app/Http/Controllers/Projects/FeaturesController.php
index 1fd7f54..25d10d7 100755
--- a/app/Http/Controllers/Projects/FeaturesController.php
+++ b/app/Http/Controllers/Projects/FeaturesController.php
@@ -26,11 +26,11 @@ class FeaturesController extends Controller {
return view('features.create',compact('project','workers'));
}
- public function store(CreateRequest $req)
+ public function store(CreateRequest $req, $projectId)
{
- $feature = $this->repo->create($req->except('_token'));
+ $feature = $this->repo->createFeature($req->except('_token'), $projectId);
flash()->success(trans('feature.created'));
- return redirect()->route('features.show', $feature->id);
+ return redirect()->route('projects.features', $feature->project_id);
}
public function show($featureId)
@@ -42,14 +42,15 @@ class FeaturesController extends Controller {
public function edit($featureId)
{
$feature = $this->repo->requireById($featureId);
- return view('features.edit',compact('feature'));
+ $workers = $this->repo->getWorkersList();
+ return view('features.edit',compact('feature','workers'));
}
public function update(UpdateRequest $req, $featureId)
{
$feature = $this->repo->update($req->except(['_method','_token']), $featureId);
flash()->success(trans('feature.updated'));
- return redirect()->route('features.edit', $featureId);
+ return redirect()->route('projects.features', $feature->project_id);
}
public function delete($featureId)
@@ -60,15 +61,18 @@ class FeaturesController extends Controller {
public function destroy(DeleteRequest $req, $featureId)
{
+ $feature = $this->repo->requireById($featureId);
+ $projectId = $feature->project_id;
if ($featureId == $req->get('feature_id'))
{
- $this->repo->delete($featureId);
+ // $feature->tasks()->delete();
+ $feature->delete();
flash()->success(trans('feature.deleted'));
}
else
flash()->error(trans('feature.undeleted'));
- return redirect()->route('features.index');
+ return redirect()->route('projects.features', $projectId);
}
public function tasks($featureId)
diff --git a/app/Http/Controllers/Projects/ProjectsController.php b/app/Http/Controllers/Projects/ProjectsController.php
index 9284492..2c1f472 100755
--- a/app/Http/Controllers/Projects/ProjectsController.php
+++ b/app/Http/Controllers/Projects/ProjectsController.php
@@ -87,7 +87,8 @@ class ProjectsController extends Controller {
public function features($projectId)
{
$project = $this->repo->requireById($projectId);
- return view('projects.features', compact('project'));
+ $features = $this->repo->getProjectFeatures($projectId);
+ return view('projects.features', compact('project','features'));
}
public function payments($projectId)
diff --git a/app/Http/Requests/Features/CreateRequest.php b/app/Http/Requests/Features/CreateRequest.php
new file mode 100644
index 0000000..1c2cbbb
--- /dev/null
+++ b/app/Http/Requests/Features/CreateRequest.php
@@ -0,0 +1,36 @@
+segment(2));
+ return auth()->user()->can('manage_features', $project);
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'name' => 'required|max:60',
+ 'worker_id' => 'required|numeric',
+ 'price' => 'required|numeric',
+ 'description' => 'max:255',
+ ];
+ }
+
+}
diff --git a/app/Http/Requests/Features/DeleteRequest.php b/app/Http/Requests/Features/DeleteRequest.php
new file mode 100644
index 0000000..4ed539e
--- /dev/null
+++ b/app/Http/Requests/Features/DeleteRequest.php
@@ -0,0 +1,34 @@
+get('project_id'));
+ return auth()->user()->can('manage_features', $project);
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'feature_id' => 'required',
+ 'project_id' => 'required',
+ ];
+ }
+
+}
diff --git a/app/Http/Requests/Features/UpdateRequest.php b/app/Http/Requests/Features/UpdateRequest.php
new file mode 100644
index 0000000..f03bc7f
--- /dev/null
+++ b/app/Http/Requests/Features/UpdateRequest.php
@@ -0,0 +1,36 @@
+get('project_id'));
+ return auth()->user()->can('manage_features', $project);
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'name' => 'required|max:60',
+ 'worker_id' => 'required|numeric',
+ 'price' => 'required|numeric',
+ 'description' => 'max:255',
+ ];
+ }
+
+}
diff --git a/app/Http/routes/projects.php b/app/Http/routes/projects.php
index ecd139c..862e97f 100644
--- a/app/Http/routes/projects.php
+++ b/app/Http/routes/projects.php
@@ -13,5 +13,7 @@ Route::group(['middleware' => ['web','role:admin'], 'namespace' => 'Projects'],
* Features Routes
*/
Route::get('projects/{id}/features/create', ['as'=>'features.create', 'uses'=>'FeaturesController@create']);
- Route::resource('features','FeaturesController',['except' => ['index','create']]);
+ Route::post('projects/{id}/features', ['as'=>'features.store', 'uses'=>'FeaturesController@store']);
+ Route::get('features/{id}/delete', ['as'=>'features.delete', 'uses'=>'FeaturesController@delete']);
+ Route::resource('features','FeaturesController',['except' => ['index','create','store']]);
});
diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php
index 7941c57..c659e00 100644
--- a/app/Providers/AuthServiceProvider.php
+++ b/app/Providers/AuthServiceProvider.php
@@ -34,6 +34,11 @@ class AuthServiceProvider extends ServiceProvider
});
}
+ $gate->define('manage_features', function ($user, $project) {
+ return $user->id == $project->owner_id;
+ });
+
+
}
/**
diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php
index c3f8680..7b6ffb0 100644
--- a/database/factories/ModelFactory.php
+++ b/database/factories/ModelFactory.php
@@ -1,6 +1,7 @@
define(User::class, function (Faker\Generator $faker) {
});
$factory->define(Project::class, function (Faker\Generator $faker) {
+
$proposalDate = $faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d');
$startDate = Carbon::parse($proposalDate)->addDays(10);
$endDate = $startDate->addDays(rand(1,13) * 7);
+ $owner = factory(User::class)->create();
+ $owner->assignRole('admin');
$customer = factory(User::class)->create();
$customer->assignRole('customer');
return [
- 'name' => $faker->sentence,
+ 'name' => $faker->sentence(3),
'description' => $faker->paragraph,
'proposal_date' => $proposalDate,
'start_date' => $startDate->format('Y-m-d'),
@@ -42,29 +46,28 @@ $factory->define(Project::class, function (Faker\Generator $faker) {
'project_value' => $projectValue = rand(1,10) * 500000,
'proposal_value' => $projectValue,
'status_id' => rand(1,6),
+ 'owner_id' => $owner->id,
'customer_id' => $customer->id
];
});
$factory->define(Payment::class, function (Faker\Generator $faker) {
- $projectId = factory(Project::class)->create()->id;
-
- $customer = factory(User::class)->create();
- $customer->assignRole('customer');
- $customerId = $customer->id;
return [
- 'project_id' => $projectId,
+ 'project_id' => function() {
+ return factory(Project::class)->create()->id;
+ },
'amount' => rand(1,5) * 500000,
'type' => rand(0,1),
'date' => $faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d'),
'description' => $faker->paragraph,
- 'customer_id' => $customerId,
+ 'customer_id' => function() {
+ return factory(User::class)->create()->id;
+ },
];
});
$factory->define(Subscription::class, function (Faker\Generator $faker) {
- $projectId = factory(Project::class)->create()->id;
$customer = factory(User::class)->create();
$customer->assignRole('customer');
@@ -72,7 +75,9 @@ $factory->define(Subscription::class, function (Faker\Generator $faker) {
$startDate = Carbon::parse($faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d'));
return [
- 'project_id' => $projectId,
+ 'project_id' => function() {
+ return factory(Project::class)->create()->id;
+ },
'domain_name' => 'www.' . str_random(10) . '.com',
'domain_price' => 125000,
'epp_code' => str_random(10),
@@ -83,4 +88,19 @@ $factory->define(Subscription::class, function (Faker\Generator $faker) {
'remark' => $faker->paragraph,
'customer_id' => $customerId,
];
+});
+
+$factory->define(Feature::class, function (Faker\Generator $faker) {
+
+ return [
+ 'project_id' => function() {
+ return factory(Project::class)->create()->id;
+ },
+ 'name' => $faker->sentence(3),
+ 'price' => rand(1,10) * 100000,
+ 'description' => $faker->paragraph,
+ 'worker_id' => function() {
+ return factory(User::class)->create()->id;
+ },
+ ];
});
\ No newline at end of file
diff --git a/resources/lang/id/feature.php b/resources/lang/id/feature.php
index 3a3bce5..fd51704 100644
--- a/resources/lang/id/feature.php
+++ b/resources/lang/id/feature.php
@@ -6,7 +6,7 @@ return [
'name' => 'Nama Fitur',
'create' => 'Input Fitur Baru',
'created' => 'Input Fitur baru telah berhasil.',
- 'show' => 'Edit Fitur',
+ 'show' => 'Detail Fitur',
'edit' => 'Edit Fitur',
'update' => 'Update Fitur',
'updated' => 'Update data Fitur telah berhasil.',
@@ -21,6 +21,7 @@ return [
'progress' => 'Progress',
'worker' => 'Pekerja',
'price' => 'Nilai Fitur',
+ 'price_total' => 'Nilai Fitur Total',
'empty' => 'Belum ada Fitur',
'back_to_index' => 'Kembali ke daftar Fitur',
];
\ No newline at end of file
diff --git a/resources/views/features/create.blade.php b/resources/views/features/create.blade.php
index 9519e6d..7d017d3 100755
--- a/resources/views/features/create.blade.php
+++ b/resources/views/features/create.blade.php
@@ -6,15 +6,21 @@
@include('projects.partials.breadcrumb',['title' => trans('feature.create')])
-
- {!! Form::open(['route'=>'features.store']) !!}
+
+ {!! Form::open(['route'=>['features.store', $project->id]]) !!}
{{ trans('feature.create') }}
{!! FormField::text('name',['label'=> trans('feature.name')]) !!}
{!! FormField::textarea('description',['label'=> trans('feature.description')]) !!}
- {!! FormField::price('price', ['label'=> trans('feature.price')]) !!}
- {!! FormField::select('worker_id', $workers, ['label'=> trans('feature.worker')]) !!}
+
+
+ {!! FormField::price('price', ['label'=> trans('feature.price')]) !!}
+
+
+ {!! FormField::select('worker_id', $workers, ['label'=> trans('feature.worker'),'value' => 1]) !!}
+
+
{!! Form::close() !!}
+
+ @include('projects.partials.project-show')
+
@endsection
\ No newline at end of file
diff --git a/resources/views/features/delete.blade.php b/resources/views/features/delete.blade.php
index 41491b0..5d90b78 100755
--- a/resources/views/features/delete.blade.php
+++ b/resources/views/features/delete.blade.php
@@ -1,28 +1,25 @@
@extends('layouts.app')
-@section('title', trans('master.delete'))
+@section('title', trans('feature.delete'))
@section('content')
-
-
{{ trans('master.masters') }} Detail
-
-
-
- | {{ trans('app.name') }} | {{ $master->name }} |
- | {{ trans('app.description') }} | {{ $master->description }} |
-
-
-
-
+ @include('features.partials.feature-show')
@endsection
\ No newline at end of file
diff --git a/resources/views/features/edit.blade.php b/resources/views/features/edit.blade.php
index 6b7c800..8f1a6d1 100755
--- a/resources/views/features/edit.blade.php
+++ b/resources/views/features/edit.blade.php
@@ -1,26 +1,38 @@
@extends('layouts.app')
-@section('title', trans('master.edit'))
+@section('title', trans('feature.edit'))
@section('content')
-
- {!! Form::model($master, ['route'=>['masters.update', $master->id], 'method' => 'patch']) !!}
+
+ {!! Form::model($feature, ['route'=>['features.update', $feature->id], 'method' => 'patch']) !!}
-
{{ $master->name }} {{ trans('master.edit') }}
+
{{ $feature->name }} {{ trans('feature.edit') }}
- {!! FormField::text('name',['label'=> trans('app.name')]) !!}
- {!! FormField::textarea('description',['label'=> trans('app.description')]) !!}
+ {!! FormField::text('name',['label'=> trans('feature.name')]) !!}
+ {!! FormField::textarea('description',['label'=> trans('feature.description')]) !!}
+
+
+ {!! FormField::price('price', ['label'=> trans('feature.price')]) !!}
+
+
+ {!! FormField::select('worker_id', $workers, ['label'=> trans('feature.worker'),'value' => 1]) !!}
+
+
{!! Form::close() !!}
+
+ @include('projects.partials.project-show', ['project' => $feature->project])
+
@endsection
\ No newline at end of file
diff --git a/resources/views/features/partials/feature-show.blade.php b/resources/views/features/partials/feature-show.blade.php
new file mode 100644
index 0000000..9cec5f4
--- /dev/null
+++ b/resources/views/features/partials/feature-show.blade.php
@@ -0,0 +1,18 @@
+
+
{{ trans('feature.show') }}
+
+
+
+ | {{ trans('feature.name') }} | {{ $feature->name }} |
+ | {{ trans('feature.price') }} | {{ formatRp($feature->price) }} |
+ | {{ trans('feature.tasks_count') }} | 10 |
+ | {{ trans('feature.progress') }} | 100% |
+ | {{ trans('feature.worker') }} | {{ $feature->worker->name }} |
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/views/features/show.blade.php b/resources/views/features/show.blade.php
index 040e9b4..029c83e 100755
--- a/resources/views/features/show.blade.php
+++ b/resources/views/features/show.blade.php
@@ -1,26 +1,15 @@
@extends('layouts.app')
-@section('title', trans('master.show'))
+@section('title', trans('feature.show'))
@section('content')
-
+
-
-
-
{{ trans('master.show') }}
-
-
-
- | {{ trans('app.name') }} | {{ $master->name }} |
- | {{ trans('app.description') }} | {{ $master->description }} |
-
-
-
-
-
+
+ @include('features.partials.feature-show')
+
+
+ @include('projects.partials.project-show', ['project' => $feature->project])
@endsection
\ No newline at end of file
diff --git a/resources/views/masters/delete.blade.php b/resources/views/masters/delete.blade.php
index 41491b0..8290daa 100755
--- a/resources/views/masters/delete.blade.php
+++ b/resources/views/masters/delete.blade.php
@@ -13,11 +13,11 @@
-
{{ trans('master.masters') }} Detail
+
{{ trans('master.show') }}
- | {{ trans('app.name') }} | {{ $master->name }} |
+ | {{ trans('master.name') }} | {{ $master->name }} |
| {{ trans('app.description') }} | {{ $master->description }} |
diff --git a/resources/views/masters/show.blade.php b/resources/views/masters/show.blade.php
index 040e9b4..3a93991 100755
--- a/resources/views/masters/show.blade.php
+++ b/resources/views/masters/show.blade.php
@@ -11,7 +11,7 @@
- | {{ trans('app.name') }} | {{ $master->name }} |
+ | {{ trans('master.name') }} | {{ $master->name }} |
| {{ trans('app.description') }} | {{ $master->description }} |
diff --git a/resources/views/payments/index.blade.php b/resources/views/payments/index.blade.php
index 8e9c61e..80a9042 100755
--- a/resources/views/payments/index.blade.php
+++ b/resources/views/payments/index.blade.php
@@ -20,8 +20,9 @@
{{ trans('payment.project') }} |
{{ trans('app.date') }} |
{{ trans('payment.amount') }} |
-
{{ trans('payment.description') }} |
-
{{ trans('app.action') }} |
+
{{ trans('payment.description') }} |
+
{{ trans('payment.customer') }} |
+
{{ trans('app.action') }} |
@forelse($payments as $key => $payment)
@@ -31,8 +32,9 @@
{{ $payment->date }} |
{{ formatRp($payment->amount) }} |
{{ $payment->description }} |
+ {{ $payment->customer->name }} |
- {!! link_to_route('payments.show',trans('app.show'),[$payment->id],['class'=>'btn btn-info btn-xs']) !!}
+ {!! link_to_route('payments.show','Lihat',[$payment->id],['class'=>'btn btn-info btn-xs']) !!}
{!! link_to_route('payments.edit',trans('app.edit'),[$payment->id],['class'=>'btn btn-warning btn-xs']) !!}
|
diff --git a/resources/views/projects/edit.blade.php b/resources/views/projects/edit.blade.php
index d660dee..983ffef 100755
--- a/resources/views/projects/edit.blade.php
+++ b/resources/views/projects/edit.blade.php
@@ -46,7 +46,7 @@
diff --git a/resources/views/projects/features.blade.php b/resources/views/projects/features.blade.php
index 8f799d7..2b26faa 100755
--- a/resources/views/projects/features.blade.php
+++ b/resources/views/projects/features.blade.php
@@ -14,20 +14,37 @@
{{ trans('app.table_no') }} |
{{ trans('feature.name') }} |
- {{ trans('feature.tasks_count') }} |
- {{ trans('feature.progress') }} |
+ {{ trans('feature.tasks_count') }} |
+ {{ trans('feature.progress') }} |
+ {{ trans('feature.price') }} |
+ {{ trans('feature.worker') }} |
{{ trans('app.action') }} |
- @forelse($project->features as $feature)
+ @forelse($features as $key => $feature)
+ | {{ 1 + $key }} |
{{ $feature->name }} |
+ {{ $feature->tasks_count = rand(3, 7) }} |
+ {{ $feature->progress = rand(70, 100) }} % |
+ {{ formatRp($feature->price) }} |
+ {{ $feature->worker->name }} |
+ {!! link_to_route('features.show', trans('app.show'),[$feature->id],['class' => 'btn btn-info btn-xs']) !!} |
@empty
- | {{ trans('feature.empty') }} |
+ | {{ trans('feature.empty') }} |
@endforelse
- | {!! html_link_to_route('features.create', trans('feature.create'), [$project->id], ['class' => 'btn btn-primary','icon' => 'plus']) !!} |
+
+
+ | Total |
+ {{ $features->sum('tasks_count') }} |
+ {{ formatDecimal($features->avg('progress')) }} % |
+ {{ formatRp($features->sum('price')) }} |
+ |
+
+ | {!! html_link_to_route('features.create', trans('feature.create'), [$project->id], ['class' => 'btn btn-primary','icon' => 'plus']) !!} |
+
@endsection
\ No newline at end of file
diff --git a/resources/views/projects/partials/breadcrumb.blade.php b/resources/views/projects/partials/breadcrumb.blade.php
index df69945..b74e08c 100644
--- a/resources/views/projects/partials/breadcrumb.blade.php
+++ b/resources/views/projects/partials/breadcrumb.blade.php
@@ -1,5 +1,5 @@
- - {{ link_to_route('projects.index',trans('project.projects')) }}
+ - {{ link_to_route('projects.index',trans('project.projects'), ['status' => Request::get('status', $project->status_id)]) }}
- {{ $project->present()->projectLink }}
- {{ isset($title) ? $title : trans('project.show') }}
\ No newline at end of file
diff --git a/resources/views/projects/partials/project-show.blade.php b/resources/views/projects/partials/project-show.blade.php
index ca2bd81..9fb0883 100644
--- a/resources/views/projects/partials/project-show.blade.php
+++ b/resources/views/projects/partials/project-show.blade.php
@@ -24,6 +24,6 @@
\ No newline at end of file
diff --git a/tests/ManageFeaturesTest.php b/tests/ManageFeaturesTest.php
new file mode 100644
index 0000000..f86173c
--- /dev/null
+++ b/tests/ManageFeaturesTest.php
@@ -0,0 +1,135 @@
+create();
+ $user->assignRole('admin');
+ $this->actingAs($user);
+
+ $project = factory(Project::class)->create(['owner_id' => $user->id]);
+
+ $worker = factory(User::class)->create();
+ $worker->assignRole('worker');
+
+ $this->visit('projects/' . $project->id . '/features');
+ $this->seePageIs('projects/' . $project->id . '/features');
+ $this->see(trans('project.features'));
+ $this->click(trans('feature.create'));
+ $this->seePageIs('projects/' . $project->id . '/features/create');
+
+ // Fill Form
+ $this->type('Nama Fitur Baru','name');
+ $this->type(100000,'price');
+ $this->select($worker->id, 'worker_id');
+ $this->type('Similique, eligendi fuga animi? Ipsam magnam laboriosam distinctio officia facere sapiente eius corporis','description');
+ $this->press(trans('feature.create'));
+
+ $this->seePageIs('projects/' . $project->id . '/features');
+ $this->see(trans('feature.created'));
+ $this->seeInDatabase('features', [
+ 'name' => 'Nama Fitur Baru',
+ 'price' => 100000,
+ 'worker_id' => $worker->id,
+ 'project_id' => $project->id
+ ]);
+ }
+
+ /** @test */
+ public function admin_can_edit_feature_data()
+ {
+ $user = factory(User::class, 3)->create();
+ $user[0]->assignRole('admin');
+ $user[1]->assignRole('worker');
+ $user[2]->assignRole('worker');
+ $this->actingAs($user[0]);
+
+ $project = factory(Project::class)->create(['owner_id' => $user[0]->id]);
+
+ $feature = factory(Feature::class)->create(['worker_id' => $user[1]->id, 'project_id' => $project->id]);
+
+ $this->visit('features/' . $feature->id . '/edit');
+ $this->seePageIs('features/' . $feature->id . '/edit');
+
+ // Fill Form
+ $this->type('Nama Fitur Edit','name');
+ $this->type(33333,'price');
+ $this->select($user[2]->id,'worker_id');
+ $this->press(trans('feature.update'));
+
+ $this->seePageIs('projects/' . $project->id . '/features');
+ $this->see(trans('feature.updated'));
+ $this->seeInDatabase('features', [
+ 'name' => 'Nama Fitur Edit',
+ 'price' => 33333,
+ 'worker_id' => $user[2]->id,
+ 'project_id' => $project->id
+ ]);
+ }
+
+ /** @test */
+ public function admin_can_delete_a_feature()
+ {
+ $user = factory(User::class)->create();
+ $user->assignRole('admin');
+ $this->actingAs($user);
+
+ $project = factory(Project::class)->create(['owner_id' => $user->id]);
+ $feature = factory(Feature::class)->create(['project_id' => $project->id]);
+
+ $this->visit('projects/' . $feature->project_id . '/features');
+ $this->click(trans('app.show'));
+ $this->click(trans('app.edit'));
+ $this->click(trans('feature.delete'));
+ $this->press(trans('app.delete_confirm_button'));
+ $this->seePageIs('projects/' . $project->id . '/features');
+ $this->see(trans('feature.deleted'));
+ }
+
+ /** @test */
+ public function admin_can_see_a_feature()
+ {
+ $user = factory(User::class)->create();
+ $user->assignRole('admin');
+ $this->actingAs($user);
+
+ $project = factory(Project::class)->create(['owner_id' => $user->id]);
+ $feature = factory(Feature::class)->create(['project_id' => $project->id]);
+
+ $this->visit('projects/' . $project->id . '/features');
+ $this->click(trans('app.show'));
+ $this->seePageIs('features/' . $feature->id);
+ $this->see(trans('feature.show'));
+ $this->see($feature->name);
+ $this->see(formatRp($feature->price));
+ $this->see($feature->worker->name);
+ }
+
+ /** @test */
+ public function admin_can_see_all_features()
+ {
+ $user = factory(User::class)->create();
+ $user->assignRole('admin');
+ $this->actingAs($user);
+
+ $project = factory(Project::class)->create(['owner_id' => $user->id]);
+ $features = factory(Feature::class, 10)->create(['project_id' => $project->id]);
+ $this->assertEquals(10, $features->count());
+
+ $this->visit('projects/' . $project->id . '/features');
+ $this->see($features[1]->name);
+ $this->see($features[1]->worker->name);
+ $this->see(formatRp($features[1]->price));
+ }
+}
diff --git a/tests/ManagePaymentsTest.php b/tests/ManagePaymentsTest.php
index 1166b43..505e365 100644
--- a/tests/ManagePaymentsTest.php
+++ b/tests/ManagePaymentsTest.php
@@ -87,4 +87,42 @@ class ManagePaymentsTest extends TestCase
$this->seePageIs('payments');
$this->see(trans('payment.deleted'));
}
+
+ /** @test */
+ public function admin_can_see_a_payment()
+ {
+ $user = factory(User::class)->create();
+ $user->assignRole('admin');
+ $this->actingAs($user);
+
+ $project = factory(Project::class)->create(['owner_id' => $user->id]);
+ $payment = factory(Payment::class)->create(['project_id' => $project->id]);
+
+ $this->visit('/payments');
+ $this->click('Lihat');
+ $this->seePageIs('payments/' . $payment->id);
+ $this->see(trans('payment.show'));
+ $this->see($payment->date);
+ $this->see(formatRp($payment->amount));
+ $this->see($payment->description);
+ $this->see($payment->customer->name);
+ }
+
+ /** @test */
+ public function admin_can_see_all_payments()
+ {
+ $user = factory(User::class)->create();
+ $user->assignRole('admin');
+ $this->actingAs($user);
+
+ $payments = factory(Payment::class, 10)->create();
+ $this->assertEquals(10, $payments->count());
+
+ $this->visit('/payments');
+ $this->see($payments[9]->project->name);
+ $this->see($payments[9]->date);
+ $this->see(formatRp($payments[9]->amount));
+ $this->see($payments[9]->description);
+ $this->see($payments[9]->customer->name);
+ }
}