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')}}
+
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 @@
+
+
+
+
+@include('errors._form-errors')
+
+
+@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.main')}}
+
+
+
+
+@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() {