From 275bc149bd27c0f2c97134382a08f7644f4d0657 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Tue, 19 Jul 2016 21:03:44 +0800 Subject: [PATCH] Update 2016-07-19.20.56 Filter Payments only for logged in owner Create feature from other project's feature Filter project only for logged in owner Filter Report only for logged in owner Filter Home dashboard project summary only for logged in owner Add flash error on validator fails redirection Fix ManageProjectsTest and ManagPaymentsTest to manage only by owner --- app/Entities/Payments/PaymentsRepository.php | 1 + app/Entities/Projects/FeaturesRepository.php | 25 +++++++ app/Entities/Projects/ProjectsRepository.php | 1 + app/Entities/Reports/ReportsRepository.php | 3 + app/Http/Controllers/PagesController.php | 9 ++- .../Controllers/Projects/FeaturesController.php | 20 ++++++ app/Http/Requests/Projects/CreateRequest.php | 2 +- app/Http/Requests/Projects/DeleteRequest.php | 4 +- app/Http/Requests/Projects/UpdateRequest.php | 4 +- app/Http/Requests/Request.php | 10 ++- app/Http/routes/projects.php | 3 + app/Providers/AppServiceProvider.php | 5 -- app/Providers/AuthServiceProvider.php | 8 +++ app/Providers/FormFieldServiceProvider.php | 2 +- app/Services/FormField.php | 3 +- resources/lang/id/feature.php | 1 + .../features/add-from-other-project.blade.php | 80 ++++++++++++++++++++++ resources/views/layouts/partials/sidebar.blade.php | 9 ++- resources/views/pages/home.blade.php | 2 +- resources/views/projects/create.blade.php | 10 +-- resources/views/projects/features.blade.php | 1 + tests/ManageFeaturesTest.php | 70 +++++++++++++++++++ tests/ManagePaymentsTest.php | 4 +- tests/ManageProjectsTest.php | 72 +++++++++++++++++-- 24 files changed, 320 insertions(+), 29 deletions(-) create mode 100755 resources/views/features/add-from-other-project.blade.php diff --git a/app/Entities/Payments/PaymentsRepository.php b/app/Entities/Payments/PaymentsRepository.php index 824fef1..03b3011 100755 --- a/app/Entities/Payments/PaymentsRepository.php +++ b/app/Entities/Payments/PaymentsRepository.php @@ -20,6 +20,7 @@ class PaymentsRepository extends BaseRepository { return $this->model->orderBy('date','desc') ->with('customer','project') + ->whereOwnerId(auth()->id()) ->paginate($this->_paginate); } diff --git a/app/Entities/Projects/FeaturesRepository.php b/app/Entities/Projects/FeaturesRepository.php index be16bf2..dc2f8c2 100755 --- a/app/Entities/Projects/FeaturesRepository.php +++ b/app/Entities/Projects/FeaturesRepository.php @@ -4,6 +4,7 @@ namespace App\Entities\Projects; use App\Entities\BaseRepository; use App\Entities\Projects\Project; +use DB; /** * Features Repository Class @@ -29,6 +30,30 @@ class FeaturesRepository extends BaseRepository return $this->storeArray($featureData); } + public function createFeatures($featuresData, $projectId) + { + $selectedFeatures = $this->model->whereIn('id', $featuresData['feature_ids'])->get(); + + DB::beginTransaction(); + foreach ($selectedFeatures as $feature) { + $newFeature = $feature->replicate(); + $newFeature->project_id = $projectId; + $newFeature->save(); + + $selectedTasks = $feature->tasks()->whereIn('id', $featuresData[$feature->id . '_task_ids'])->get(); + + foreach ($selectedTasks as $task) { + $newTask = $task->replicate(); + $newTask->progress = 0; + $newTask->feature_id = $newFeature->id; + $newTask->save(); + } + } + DB::commit(); + + return 'ok'; + } + public function getTasksByFeatureId($featureId) { return Task::whereFeatureId($featureId)->get(); diff --git a/app/Entities/Projects/ProjectsRepository.php b/app/Entities/Projects/ProjectsRepository.php index d189e9b..ba033bb 100755 --- a/app/Entities/Projects/ProjectsRepository.php +++ b/app/Entities/Projects/ProjectsRepository.php @@ -30,6 +30,7 @@ class ProjectsRepository extends BaseRepository $query->where('status_id', $statusId); }) ->withCount('payments') + ->whereOwnerId(auth()->id()) ->paginate($this->_paginate); } diff --git a/app/Entities/Reports/ReportsRepository.php b/app/Entities/Reports/ReportsRepository.php index 2b1f34d..30ccdba 100755 --- a/app/Entities/Reports/ReportsRepository.php +++ b/app/Entities/Reports/ReportsRepository.php @@ -24,6 +24,7 @@ class ReportsRepository extends BaseRepository return Payment::orderBy('date','desc') ->where('date', $date) ->with('customer','project') + ->where('owner_id',auth()->id()) ->get(); } @@ -34,6 +35,7 @@ class ReportsRepository extends BaseRepository ->where(DB::raw('MONTH(date)'), $month) ->groupBy('date') ->orderBy('date','asc') + ->where('owner_id',auth()->id()) ->get(); } @@ -44,6 +46,7 @@ class ReportsRepository extends BaseRepository ->groupBy(DB::raw('YEAR(date)')) ->groupBy(DB::raw('MONTH(date)')) ->orderBy('date','asc') + ->where('owner_id',auth()->id()) ->get(); } diff --git a/app/Http/Controllers/PagesController.php b/app/Http/Controllers/PagesController.php index 49e3616..1a79753 100644 --- a/app/Http/Controllers/PagesController.php +++ b/app/Http/Controllers/PagesController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers; use App\Entities\Pages\PagesRepository; +use App\Entities\Projects\Project; +use DB; class PagesController extends Controller { private $repo; @@ -15,7 +17,12 @@ class PagesController extends Controller { public function home() { - return view('pages.home'); + $projectsCount = Project::select(DB::raw('status_id, count(id) as count')) + ->groupBy('status_id') + ->where('owner_id', auth()->id()) + ->lists('count','status_id') + ->all(); + return view('pages.home', compact('projectsCount')); } public function about() diff --git a/app/Http/Controllers/Projects/FeaturesController.php b/app/Http/Controllers/Projects/FeaturesController.php index ce415e9..fd871e6 100755 --- a/app/Http/Controllers/Projects/FeaturesController.php +++ b/app/Http/Controllers/Projects/FeaturesController.php @@ -26,6 +26,19 @@ class FeaturesController extends Controller { return view('features.create',compact('project','workers')); } + public function addFromOtherProject(Request $req, $projectId) + { + $selectedProject = null; + $project = $this->repo->requireProjectById($projectId); + $workers = $this->repo->getWorkersList(); + $projects = $this->repo->getProjectsList(); + + if ($req->has('project_id')) { + $selectedProject = $this->repo->requireProjectById($req->get('project_id')); + } + return view('features.add-from-other-project',compact('project','workers','projects','selectedProject')); + } + public function store(CreateRequest $req, $projectId) { $feature = $this->repo->createFeature($req->except('_token'), $projectId); @@ -33,6 +46,13 @@ class FeaturesController extends Controller { return redirect()->route('projects.features', $feature->project_id); } + public function storeFromOtherProject(Request $req, $projectId) + { + $this->repo->createFeatures($req->except('_token'), $projectId); + flash()->success(trans('feature.created_from_other_project')); + return redirect()->route('projects.features', $projectId); + } + public function show(Request $req, $featureId) { $editableTask = null; diff --git a/app/Http/Requests/Projects/CreateRequest.php b/app/Http/Requests/Projects/CreateRequest.php index 4e01bef..ffa693b 100644 --- a/app/Http/Requests/Projects/CreateRequest.php +++ b/app/Http/Requests/Projects/CreateRequest.php @@ -13,7 +13,7 @@ class CreateRequest extends Request { */ public function authorize() { - return auth()->user()->can('manage_projects'); + return auth()->user()->can('add_project'); } /** diff --git a/app/Http/Requests/Projects/DeleteRequest.php b/app/Http/Requests/Projects/DeleteRequest.php index 2b72995..c78eff4 100644 --- a/app/Http/Requests/Projects/DeleteRequest.php +++ b/app/Http/Requests/Projects/DeleteRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\Projects; +use App\Entities\Projects\Project; use App\Http\Requests\Request; class DeleteRequest extends Request { @@ -13,7 +14,8 @@ class DeleteRequest extends Request { */ public function authorize() { - return auth()->user()->can('manage_projects'); + $project = Project::findOrFail($this->segment(2)); + return auth()->user()->can('manage_project', $project); } /** diff --git a/app/Http/Requests/Projects/UpdateRequest.php b/app/Http/Requests/Projects/UpdateRequest.php index c2174d9..db071ad 100644 --- a/app/Http/Requests/Projects/UpdateRequest.php +++ b/app/Http/Requests/Projects/UpdateRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\Projects; +use App\Entities\Projects\Project; use App\Http\Requests\Request; class UpdateRequest extends Request { @@ -13,7 +14,8 @@ class UpdateRequest extends Request { */ public function authorize() { - return auth()->user()->can('manage_projects'); + $project = Project::findOrFail($this->segment(2)); + return auth()->user()->can('manage_project', $project); } /** diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php index 76b2ffd..cce96f6 100644 --- a/app/Http/Requests/Request.php +++ b/app/Http/Requests/Request.php @@ -2,9 +2,17 @@ namespace App\Http\Requests; +use Illuminate\Contracts\Validation\Validator; use Illuminate\Foundation\Http\FormRequest; abstract class Request extends FormRequest { - // + /** + * {@inheritdoc} + */ + protected function formatErrors(Validator $validator) + { + flash()->error('Mohon periksa kembali form isian Anda.'); + return $validator->errors()->all(); + } } diff --git a/app/Http/routes/projects.php b/app/Http/routes/projects.php index c07fb1e..115cab3 100644 --- a/app/Http/routes/projects.php +++ b/app/Http/routes/projects.php @@ -12,8 +12,11 @@ Route::group(['middleware' => ['web','role:admin'], 'namespace' => 'Projects'], /** * Features Routes */ + Route::get('projects/{id}/features/create', ['as'=>'features.create', 'uses'=>'FeaturesController@create']); + Route::get('projects/{id}/features/add-from-other-project', ['as'=>'features.add-from-other-project', 'uses'=>'FeaturesController@addFromOtherProject']); Route::post('projects/{id}/features', ['as'=>'features.store', 'uses'=>'FeaturesController@store']); + Route::post('projects/{id}/features/store-from-other-project', ['as'=>'features.store-from-other-project', 'uses'=>'FeaturesController@storeFromOtherProject']); Route::get('features/{id}/delete', ['as'=>'features.delete', 'uses'=>'FeaturesController@delete']); Route::resource('features','FeaturesController',['except' => ['index','create','store']]); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 3e3231f..ca8fe4c 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -16,11 +16,6 @@ class AppServiceProvider extends ServiceProvider public function boot() { require_once app_path() . '/helpers.php'; - $projectsCount = Project::select(DB::raw('status_id, count(id) as count')) - ->groupBy('status_id') - ->lists('count','status_id') - ->all(); - view()->share('projectsCount', $projectsCount); } /** diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 9dcabab..779385b 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -34,6 +34,14 @@ class AuthServiceProvider extends ServiceProvider }); } + $gate->define('add_project', function ($user) { + return $user->hasRole('admin'); + }); + + $gate->define('manage_project', function ($user, $project) { + return $user->id == $project->owner_id; + }); + $gate->define('manage_features', function ($user, $project) { return $user->id == $project->owner_id; }); diff --git a/app/Providers/FormFieldServiceProvider.php b/app/Providers/FormFieldServiceProvider.php index 888ff6b..866eeed 100644 --- a/app/Providers/FormFieldServiceProvider.php +++ b/app/Providers/FormFieldServiceProvider.php @@ -2,8 +2,8 @@ namespace App\Providers; -use Illuminate\Support\ServiceProvider; use App\Services\FormField; +use Illuminate\Support\ServiceProvider; class FormFieldServiceProvider extends ServiceProvider { diff --git a/app/Services/FormField.php b/app/Services/FormField.php index 56a9fda..787cda9 100644 --- a/app/Services/FormField.php +++ b/app/Services/FormField.php @@ -4,7 +4,6 @@ namespace App\Services; use Form; use Illuminate\Support\Collection; use Illuminate\Support\MessageBag; -use Session; /** * FormField Class (Site FormField Service) @@ -18,7 +17,7 @@ class FormField public function __construct() { - $this->errorBag = Session::get('errors', new MessageBag);; + $this->errorBag = session()->get('errors', new MessageBag); } public function text($name, $options = []) diff --git a/resources/lang/id/feature.php b/resources/lang/id/feature.php index 9200d4c..ac5d56a 100644 --- a/resources/lang/id/feature.php +++ b/resources/lang/id/feature.php @@ -26,4 +26,5 @@ return [ 'price_total' => 'Nilai Fitur Total', 'empty' => 'Belum ada Fitur', 'back_to_index' => 'Kembali ke daftar Fitur', + 'add_from_other_project' => 'Tambah Fitur dari Project Lain', ]; \ No newline at end of file diff --git a/resources/views/features/add-from-other-project.blade.php b/resources/views/features/add-from-other-project.blade.php new file mode 100755 index 0000000..a1d01b0 --- /dev/null +++ b/resources/views/features/add-from-other-project.blade.php @@ -0,0 +1,80 @@ +@extends('layouts.app') + +@section('title', trans('feature.add_from_other_project')) + +@section('content') +@include('projects.partials.breadcrumb',['title' => trans('feature.add_from_other_project')]) + +
+
+
+

{{ trans('feature.add_from_other_project') }}

+
+ {!! Form::open(['method'=>'get']) !!} + $selectedProject : ', print_r($selectedProject, true), ''; ?> +
+ +
+ {!! Form::select('project_id', $projects, Request::get('project_id'), [ + 'class' => 'form-control customer-select', + 'placeholder' => '-- Pilih Project --' + ]) !!} + +
+
+ {!! Form::close() !!} + @if ($selectedProject) + {!! Form::open(['route'=>['features.store-from-other-project', $project->id]]) !!} +
    + @forelse($selectedProject->features as $key => $feature) +
  • + +
      + @foreach($feature->tasks as $task) +
    • + +
    • + @endforeach +
    +
  • + @empty +
  • Tidak ada fitur
  • + @endforelse +
+ @else +
Pilih salah satu project
+ @endif + {!! Form::submit(trans('feature.create'), ['class'=>'btn btn-primary']) !!} + {!! Form::close() !!} +
+ + +
+
+
+ @include('projects.partials.project-show') +
+
+@endsection + +@section('ext_js') + {!! Html::script(url('assets/js/plugins/autoNumeric.min.js')) !!} +@endsection + +@section('script') + +@endsection \ No newline at end of file diff --git a/resources/views/layouts/partials/sidebar.blade.php b/resources/views/layouts/partials/sidebar.blade.php index 2978992..5dd79be 100755 --- a/resources/views/layouts/partials/sidebar.blade.php +++ b/resources/views/layouts/partials/sidebar.blade.php @@ -5,10 +5,15 @@