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 @@