diff --git a/app/Modules/Pim/Http/Controllers/EmployeeTasksController.php b/app/Modules/Pim/Http/Controllers/EmployeeTasksController.php new file mode 100644 index 0000000..0fb4f26 --- /dev/null +++ b/app/Modules/Pim/Http/Controllers/EmployeeTasksController.php @@ -0,0 +1,149 @@ +employeeTasksRepository = $employeeTasksRepository; + $this->userRepository = $userRepository; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index($employeeId) + { + $employee = $this->userRepository->getById($employeeId); + $breadcrumb = [ + 'parent_id' => $employeeId, + 'parent_title' => $employee->first_name.' '.$employee->last_name, + 'parent_type' => get_user_role($employee->role) + ]; + return view('pim::employee_tasks.index', compact('breadcrumb')); + } + + /** + * Return data for the resource list + * + * @return \Illuminate\Http\Response + */ + public function getDatatable() + { + return Datatables::of($this->employeeTasksRepository->getCollection([], + ['id', 'task_name', 'task_description', 'assigned_to', 'creator_id', 'due_date'])) + ->editColumn('assigned_to', function($task) { + return $task->assignee->first_name.' '.$task->assignee->last_name; + }) + ->editColumn('creator_id', function($task) { + return $task->creator->first_name.' '.$task->creator->last_name; + }) + ->addColumn('actions', function($task){ + return view('includes._datatable_actions', [ + 'deleteUrl' => route('pim.employees.tasks.destroy', ['employeeId' => Route::input('employeeId'), 'task' => $task->id]), + 'editUrl' => route('pim.employees.tasks.edit', ['employeeId' => Route::input('employeeId'), 'task' => $task->id]) + ]); + }) + ->make(); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + $admins = $this->userRepository->pluckAdminNames(); + return view('pim::employee_tasks.create', compact('admins')); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Modules\Pim\Http\Requests\EmployeeTaskRequest $request + * @return \Illuminate\Http\Response + */ + public function store(EmployeeTaskRequest $request) + { + $taskData = $request->all() + ['candidate_id' => Route::input('employeeId'), 'creator_id' => Auth::user()->id]; + $taskData = $this->employeeTasksRepository->create($taskData); + $request->session()->flash('success', trans('app.pim.candidates.tasks.store_success')); + return redirect()->route('pim.employees.tasks.edit', ['employeeId' => Route::input('employeeId'), 'task' => $taskData->id]); + } + + /** + * Display the specified resource. + * + * @param integer unique identifier for the resource + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param integer unique identifier for the resource + * @return \Illuminate\Http\Response + */ + public function edit($employeeId, $id) + { + $task = $this->employeeTasksRepository->getById($id); + $employee = $this->userRepository->getById($employeeId); + $breadcrumb = [ + 'parent_id' => $employeeId, + 'parent_title' => $employee->first_name.' '.$employee->last_name, + 'task_id' => $id + ]; + $admins = $this->userRepository->pluckAdminNames(); + + return view('pim::employee_tasks.edit', ['admins' => $admins, 'task' => $task, 'breadcrumb' => $breadcrumb]); + } + + /** + * Update the specified resource in storage. + * + * @param integer unique identifier for the resource + * @param \App\Modules\Pim\Http\Requests\EmployeeTaskRequest $request + * @return \Illuminate\Http\Response + */ + public function update($employeeId, $id, EmployeeTaskRequest $request) + { + $task = $this->employeeTasksRepository->update($id, $request->all()); + $request->session()->flash('success', trans('app.pim.candidates.tasks.update_success')); + return redirect()->route('pim.employees.tasks.edit', ['employeeId' => $employeeId, 'task' => $id]); + } + + /** + * Remove the specified resource from storage. + * + * @param integer unique identifier for the resource + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function destroy($employeeId, $id, Request $request) + { + $this->employeeTasksRepository->delete($id); + $request->session()->flash('success', trans('app.pim.candidates.tasks.delete_success')); + return redirect()->route('pim.employees.tasks.index', ['employeeId' => $employeeId, 'task' => $id]); + } +} \ No newline at end of file diff --git a/app/Modules/Pim/Http/Requests/EmployeeTaskRequest.php b/app/Modules/Pim/Http/Requests/EmployeeTaskRequest.php new file mode 100644 index 0000000..413ac5e --- /dev/null +++ b/app/Modules/Pim/Http/Requests/EmployeeTaskRequest.php @@ -0,0 +1,34 @@ + ['required'], + 'assigned_to' => ['required'], + 'due_date' => ['required'] + ]; + + return $rules; + } +} diff --git a/app/Modules/Pim/Models/UserTask.php b/app/Modules/Pim/Models/UserTask.php new file mode 100644 index 0000000..60c93a5 --- /dev/null +++ b/app/Modules/Pim/Models/UserTask.php @@ -0,0 +1,27 @@ +belongsTo(User::class, 'candidate_id'); + } + + public function assignee() + { + return $this->belongsTo(User::class, 'assigned_to'); + } + + public function creator() + { + return $this->belongsTo(User::class, 'creator_id'); + } +} diff --git a/app/Modules/Pim/Repositories/EmployeeTasksRepository.php b/app/Modules/Pim/Repositories/EmployeeTasksRepository.php new file mode 100644 index 0000000..a65d63c --- /dev/null +++ b/app/Modules/Pim/Repositories/EmployeeTasksRepository.php @@ -0,0 +1,15 @@ +model = $model; + } +} diff --git a/app/Modules/Pim/Repositories/Interfaces/EmployeeTasksRepositoryInterface.php b/app/Modules/Pim/Repositories/Interfaces/EmployeeTasksRepositoryInterface.php new file mode 100644 index 0000000..ec005e5 --- /dev/null +++ b/app/Modules/Pim/Repositories/Interfaces/EmployeeTasksRepositoryInterface.php @@ -0,0 +1,7 @@ +{{trans('app.pim.candidates.preferences.main')}} +
+ +

{{trans('app.pim.candidates.tasks.main')}}

+
+
diff --git a/app/Modules/Pim/resources/views/employee_tasks/_form.blade.php b/app/Modules/Pim/resources/views/employee_tasks/_form.blade.php new file mode 100644 index 0000000..8891e20 --- /dev/null +++ b/app/Modules/Pim/resources/views/employee_tasks/_form.blade.php @@ -0,0 +1,41 @@ +
+ {!! Form::label('task_name', trans('app.pim.candidates.tasks.name').':', ['class' => 'col-sm-3']) !!} +
+ {!! Form::text('task_name', null, ['class' => 'form-control']) !!} +
+
+
+ {!! Form::label('task_description', trans('app.pim.candidates.tasks.description').':', ['class' => 'col-sm-3']) !!} +
+ {!! Form::text('task_description', null, ['class' => 'form-control']) !!} +
+
+
+ {!! Form::label('assigned_to', trans('app.pim.candidates.tasks.assigned_to').':', ['class' => 'col-sm-3']) !!} +
+ {!! Form::select('assigned_to', $admins, null, ['class' => 'form-control admins']) !!} +
+
+
+ {!! Form::label('due_date', trans('app.pim.candidates.tasks.due_date').':', ['class' => 'col-sm-3']) !!} +
+ {!! Form::date('due_date', null, ['class' => 'form-control']) !!} +
+
+@include('errors._form-errors') +
+
+
+ {{trans('app.cancel')}} + {!! Form::submit($submitName, ['class' => 'btn btn-primary']) !!} +
+
+@section('additionalCSS') + +@endsection +@section('additionalJS') + + +@endsection \ No newline at end of file diff --git a/app/Modules/Pim/resources/views/employee_tasks/create.blade.php b/app/Modules/Pim/resources/views/employee_tasks/create.blade.php new file mode 100644 index 0000000..ab555d5 --- /dev/null +++ b/app/Modules/Pim/resources/views/employee_tasks/create.blade.php @@ -0,0 +1,13 @@ +@extends('layouts.main') +@section('content') +
+
+
+
{{trans('app.pim.employees.external_accounts.add_new')}}
+ {!! Form::open(['route' => ['pim.employees.tasks.store', Route::input('employeeId')], 'class' => 'form-horizontal', 'enctype' => 'multipart/form-data']) !!} + @include('pim::employee_tasks._form', ['submitName' => trans('app.submit')]) + {!! Form::close() !!} +
+
+
+@endsection \ No newline at end of file diff --git a/app/Modules/Pim/resources/views/employee_tasks/edit.blade.php b/app/Modules/Pim/resources/views/employee_tasks/edit.blade.php new file mode 100644 index 0000000..6b828d4 --- /dev/null +++ b/app/Modules/Pim/resources/views/employee_tasks/edit.blade.php @@ -0,0 +1,13 @@ +@extends('layouts.main') +@section('content') +
+
+
+
{{trans('app.pim.candidates.tasks.main')}}
+ {!! Form::model($task, ['method' => 'PUT', 'route' => ['pim.employees.tasks.update', Route::input('employeeId'), $task->id], 'class' => 'form-horizontal', 'enctype' => 'multipart/form-data']) !!} + @include('pim::employee_tasks._form', ['submitName' => trans('app.submit')]) + {!! Form::close() !!} +
+
+
+@endsection \ No newline at end of file diff --git a/app/Modules/Pim/resources/views/employee_tasks/index.blade.php b/app/Modules/Pim/resources/views/employee_tasks/index.blade.php new file mode 100644 index 0000000..9a4d7dd --- /dev/null +++ b/app/Modules/Pim/resources/views/employee_tasks/index.blade.php @@ -0,0 +1,73 @@ +@extends('layouts.main') +@section('content') +
+
+ {{trans('app.pim.candidates.tasks.add_new')}} +
+
+
+
+
+
{{trans('app.pim.candidates.tasks.main')}}
+ + + + + + + + + + + + + + + + + + + +
{{trans('app.id')}}{{trans('app.pim.candidates.tasks.name')}}{{trans('app.pim.candidates.tasks.description')}}{{trans('app.pim.candidates.tasks.assigned_to')}}{{trans('app.pim.candidates.tasks.creator')}}{{trans('app.pim.candidates.tasks.due_date')}}
+ + + + + +
+
+
+
+@endsection +@section('additionalCSS') + +@endsection +@section('additionalJS') + + +@endsection \ No newline at end of file diff --git a/app/Providers/RepositoryServiceProvider.php b/app/Providers/RepositoryServiceProvider.php index 97c2a54..0e7bee3 100644 --- a/app/Providers/RepositoryServiceProvider.php +++ b/app/Providers/RepositoryServiceProvider.php @@ -34,6 +34,7 @@ public function register() Pim\Repositories\EmployeeLanguageRepository::class => [Pim\Repositories\Interfaces\EmployeeLanguageRepositoryInterface::class], Pim\Repositories\EmployeeSalaryRepository::class => [Pim\Repositories\Interfaces\EmployeeSalaryRepositoryInterface::class], Pim\Repositories\EmployeePreferencesRepository::class => [Pim\Repositories\Interfaces\EmployeePreferencesRepositoryInterface::class], + Pim\Repositories\EmployeeTasksRepository::class => [Pim\Repositories\Interfaces\EmployeeTasksRepositoryInterface::class], Pim\Repositories\EmployeeDocumentRepository::class => [Pim\Repositories\Interfaces\EmployeeDocumentRepositoryInterface::class], Pim\Repositories\SalariesSalaryComponentsRepository::class => [Pim\Repositories\Interfaces\SalariesSalaryComponentsRepositoryInterface::class], Leave\Repositories\LeaveTypeRepository::class => [Leave\Repositories\Interfaces\LeaveTypeRepositoryInterface::class], diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php new file mode 100644 index 0000000..c125b13 --- /dev/null +++ b/app/Repositories/UserRepository.php @@ -0,0 +1,30 @@ +model = $model; + } + + public function pluckName() + { + return $this->model->select(DB::raw('CONCAT(first_name, " ", last_name) as name, id')) + ->pluck('name', 'id'); + } + + public function pluckAdminNames() + { + return $this->model->select(DB::raw('CONCAT(first_name, " ", last_name) as name, id')) + ->where('role', $this->model::USER_ROLE_ADMIN) + ->pluck('name', 'id'); + } +} diff --git a/database/migrations/2017_08_15_111625_create_user_tasks_table.php b/database/migrations/2017_08_15_111625_create_user_tasks_table.php new file mode 100644 index 0000000..75f4565 --- /dev/null +++ b/database/migrations/2017_08_15_111625_create_user_tasks_table.php @@ -0,0 +1,41 @@ +increments('id'); + $table->string('task_name'); + $table->string('task_description'); + $table->integer('assigned_to')->unsigned(); + $table->foreign('assigned_to')->references('id')->on('users')->onDelete('cascade'); + $table->integer('candidate_id')->unsigned(); + $table->foreign('candidate_id')->references('id')->on('users')->onDelete('cascade'); + $table->integer('creator_id')->unsigned(); + $table->foreign('creator_id')->references('id')->on('users')->onDelete('cascade'); + $table->date('due_date'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_tasks'); + } +} diff --git a/resources/lang/en/app.php b/resources/lang/en/app.php index cc53971..67f6042 100644 --- a/resources/lang/en/app.php +++ b/resources/lang/en/app.php @@ -291,6 +291,18 @@ 'store_success' => 'The candidate preferences were successfully added.', 'update_success' => 'The candidate preferences were successfully updated.', 'delete_success' => 'The candidate preferences were successfully removed.', + ], + 'tasks' => [ + 'main' => 'Tasks', + 'add_new' => 'Add new task', + 'name' => 'Task name', + 'description' => 'Task description', + 'assigned_to' => 'Assigned to', + 'creator' => 'Creator', + 'due_date' => 'Due date', + 'store_success' => 'The task was successfully added.', + 'update_success' => 'The task was successfully updated.', + 'delete_success' => 'The task was successfully removed.', ] ] ], diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index bbdccc4..df59ea0 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -524,6 +524,34 @@ * Employee preferences breadcrumbs end here */ +/** + * Employee tasks breadcrumbs start here + */ + +// Home > PIM > Candidates > Candidate > Tasks +Breadcrumbs::register('pim.employees.tasks.index', function($breadcrumbs, $breadcrumb) +{ + $breadcrumbs->parent('pim.candidates.edit', ['id' => $breadcrumb['parent_id'], 'title' => $breadcrumb['parent_title']]); + $breadcrumbs->push(trans('app.pim.candidates.tasks.main'), route('pim.employees.tasks.index', $breadcrumb['parent_id'])); +}); + +// Home > PIM > Candidates > Candidate > Tasks > Create +Breadcrumbs::register('pim.employees.tasks.create', function($breadcrumbs, $breadcrumb) +{ + $breadcrumbs->parent('pim.employees.tasks.index', $breadcrumb); + $breadcrumbs->push(trans('app.add_record'), route('pim.employees.tasks.create', $breadcrumb['parent_id'])); +}); + +// Home > PIM > Candidates > Candidate > Tasks > Edit +Breadcrumbs::register('pim.employees.tasks.edit', function($breadcrumbs, $breadcrumb) +{ + $breadcrumbs->parent('pim.employees.tasks.index', $breadcrumb); + $breadcrumbs->push(trans('app.edit').': #'.$breadcrumb['task_id'], route('pim.employees.tasks.edit', ['employeeId' => $breadcrumb['parent_id'], 'task' => $breadcrumb['task_id']])); +}); +/** + * Employee tasks breadcrumbs end here + */ + /** * Employee qualifications breadcrumbs start here */ diff --git a/routes/web.php b/routes/web.php index 31b0570..b2c4494 100644 --- a/routes/web.php +++ b/routes/web.php @@ -116,6 +116,7 @@ 'update' => 'salary_components.update', 'destroy' => 'salary_components.destroy' ]]); + }); Route::group(['prefix' => 'pim', 'as' => 'pim.', 'middleware' => ['auth', 'admin']], function() { Route::get('/', function() { @@ -261,7 +262,19 @@ 'store' => 'preferences.store', 'update' => 'preferences.update', 'destroy' => 'preferences.destroy' - ]]); + ]]); + + Route::get('tasks/datatable', '\App\Modules\Pim\Http\Controllers\EmployeeTasksController@getDatatable') + ->name('tasks.datatable'); + Route::resource('tasks', '\App\Modules\Pim\Http\Controllers\EmployeeTasksController', ['names' => [ + 'index' => 'tasks.index', + 'create' => 'tasks.create', + 'show' => 'tasks.show', + 'edit' => 'tasks.edit', + 'store' => 'tasks.store', + 'update' => 'tasks.update', + 'destroy' => 'tasks.destroy' + ]]); }); }); Route::group(['prefix' => 'leave', 'as' => 'leave.', 'middleware' => ['auth', 'admin']], function() {