Skip to content
This repository was archived by the owner on Feb 8, 2025. It is now read-only.

Commit 8c02d9f

Browse files
authored
feat: discipline cases (#1423)
1 parent 1efb968 commit 8c02d9f

File tree

54 files changed

+3575
-223
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+3575
-223
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ OfficeLife has the following features, in 5 major domains:
7070
* Skills
7171
* Objectives Key Results (OKR) (coming soon)
7272
* e-Coffees
73+
* Discipline cases
7374

7475
<img src="docs/img/profile.png" alt="OfficeLife company" title="OfficeLife" />
7576

app/Http/Controllers/Company/Company/Project/ProjectIssuesController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public function show(Request $request, string $issueKey, string $issueSlug)
3434

3535
try {
3636
$issue = ProjectIssue::where('key', $issueKey)->where('slug', $issueSlug)
37-
->findOrFail();
37+
->firstOrFail();
3838
} catch (ModelNotFoundException $e) {
3939
return redirect('home');
4040
}
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Company\Dashboard\HR;
4+
5+
use Inertia\Inertia;
6+
use Illuminate\Http\Request;
7+
use App\Helpers\InstanceHelper;
8+
use Illuminate\Http\JsonResponse;
9+
use App\Helpers\NotificationHelper;
10+
use App\Http\Controllers\Controller;
11+
use App\Models\Company\DisciplineCase;
12+
use Illuminate\Database\Eloquent\ModelNotFoundException;
13+
use App\Services\Company\Employee\DisciplineCase\CreateDisciplineCase;
14+
use App\Services\Company\Employee\DisciplineCase\ToggleDisciplineCase;
15+
use App\Services\Company\Employee\DisciplineCase\DestroyDisciplineCase;
16+
use App\Http\ViewHelpers\Dashboard\HR\DashboardHRDisciplineCaseViewHelper;
17+
18+
class DashboardDisciplineCasesController extends Controller
19+
{
20+
/**
21+
* Show the list of discipline cases, opened or closed.
22+
*
23+
* @return mixed
24+
*/
25+
public function index()
26+
{
27+
$company = InstanceHelper::getLoggedCompany();
28+
$employee = InstanceHelper::getLoggedEmployee();
29+
30+
return Inertia::render('Dashboard/HR/DisciplineCases/Index', [
31+
'data' => DashboardHRDisciplineCaseViewHelper::index($company),
32+
'notifications' => NotificationHelper::getNotifications($employee),
33+
]);
34+
}
35+
36+
/**
37+
* Show the list of discipline cases, opened or closed.
38+
*
39+
* @param Request $request
40+
* @param int $companyId
41+
* @return mixed
42+
*/
43+
public function closed(Request $request, int $companyId)
44+
{
45+
$company = InstanceHelper::getLoggedCompany();
46+
$employee = InstanceHelper::getLoggedEmployee();
47+
48+
return Inertia::render('Dashboard/HR/DisciplineCases/Closed', [
49+
'data' => DashboardHRDisciplineCaseViewHelper::closed($company),
50+
'notifications' => NotificationHelper::getNotifications($employee),
51+
]);
52+
}
53+
54+
/**
55+
* Get the list of potential employees to have a discipline case.
56+
*
57+
* @param Request $request
58+
* @param int $companyId
59+
*
60+
* @return JsonResponse
61+
*/
62+
public function search(Request $request, int $companyId): JsonResponse
63+
{
64+
$company = InstanceHelper::getLoggedCompany();
65+
66+
$potentialEmployees = DashboardHRDisciplineCaseViewHelper::potentialEmployees(
67+
$company,
68+
$request->input('searchTerm')
69+
);
70+
71+
return response()->json([
72+
'data' => $potentialEmployees,
73+
]);
74+
}
75+
76+
/**
77+
* Create a new discipline case.
78+
*
79+
* @param Request $request
80+
* @param int $companyId
81+
*
82+
* @return JsonResponse
83+
*/
84+
public function store(Request $request, int $companyId): JsonResponse
85+
{
86+
$loggedCompany = InstanceHelper::getLoggedCompany();
87+
$loggedEmployee = InstanceHelper::getLoggedEmployee();
88+
89+
$case = (new CreateDisciplineCase)->execute([
90+
'company_id' => $loggedCompany->id,
91+
'author_id' => $loggedEmployee->id,
92+
'employee_id' => $request->input('employee'),
93+
]);
94+
95+
return response()->json([
96+
'data' => DashboardHRDisciplineCaseViewHelper::dto($loggedCompany, $case),
97+
]);
98+
}
99+
100+
/**
101+
* Show the discipline case.
102+
*
103+
* @param Request $request
104+
* @param int $companyId
105+
* @param int $caseId
106+
*/
107+
public function show(Request $request, int $companyId, int $caseId)
108+
{
109+
$company = InstanceHelper::getLoggedCompany();
110+
$employee = InstanceHelper::getLoggedEmployee();
111+
112+
try {
113+
$case = DisciplineCase::where('company_id', $company->id)
114+
->findOrFail($caseId);
115+
} catch (ModelNotFoundException $e) {
116+
return redirect('home');
117+
}
118+
119+
return Inertia::render('Dashboard/HR/DisciplineCases/Show', [
120+
'data' => DashboardHRDisciplineCaseViewHelper::show($company, $case),
121+
'notifications' => NotificationHelper::getNotifications($employee),
122+
]);
123+
}
124+
125+
/**
126+
* Close a discipline case.
127+
*
128+
* @param Request $request
129+
* @param int $companyId
130+
* @param int $caseId
131+
*
132+
* @return JsonResponse
133+
*/
134+
public function toggle(Request $request, int $companyId, int $caseId): JsonResponse
135+
{
136+
$loggedCompany = InstanceHelper::getLoggedCompany();
137+
$loggedEmployee = InstanceHelper::getLoggedEmployee();
138+
139+
$case = (new ToggleDisciplineCase)->execute([
140+
'company_id' => $loggedCompany->id,
141+
'author_id' => $loggedEmployee->id,
142+
'discipline_case_id' => $caseId,
143+
]);
144+
145+
return response()->json([
146+
'data' => DashboardHRDisciplineCaseViewHelper::dto($loggedCompany, $case),
147+
]);
148+
}
149+
150+
/**
151+
* Delete a discipline case.
152+
*
153+
* @param Request $request
154+
* @param int $companyId
155+
* @param int $caseId
156+
*
157+
* @return JsonResponse
158+
*/
159+
public function destroy(Request $request, int $companyId, int $caseId): JsonResponse
160+
{
161+
$loggedCompany = InstanceHelper::getLoggedCompany();
162+
$loggedEmployee = InstanceHelper::getLoggedEmployee();
163+
164+
(new DestroyDisciplineCase)->execute([
165+
'company_id' => $loggedCompany->id,
166+
'author_id' => $loggedEmployee->id,
167+
'discipline_case_id' => $caseId,
168+
]);
169+
170+
return response()->json([
171+
'data' => [
172+
'url' => route('dashboard.hr.disciplinecase.index', [
173+
'company' => $loggedCompany,
174+
]),
175+
],
176+
]);
177+
}
178+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Company\Dashboard\HR;
4+
5+
use Carbon\Carbon;
6+
use Illuminate\Http\Request;
7+
use App\Helpers\InstanceHelper;
8+
use Illuminate\Http\JsonResponse;
9+
use App\Http\Controllers\Controller;
10+
use App\Services\Company\Employee\DisciplineCase\CreateDisciplineEvent;
11+
use App\Services\Company\Employee\DisciplineCase\DestroyDisciplineEvent;
12+
use App\Http\ViewHelpers\Dashboard\HR\DashboardHRDisciplineEventViewHelper;
13+
14+
class DashboardDisciplineEventsController extends Controller
15+
{
16+
/**
17+
* Create a new discipline event.
18+
*
19+
* @param Request $request
20+
* @param int $companyId
21+
* @param int $caseId
22+
*
23+
* @return JsonResponse
24+
*/
25+
public function store(Request $request, int $companyId, int $caseId): JsonResponse
26+
{
27+
$loggedCompany = InstanceHelper::getLoggedCompany();
28+
$loggedEmployee = InstanceHelper::getLoggedEmployee();
29+
30+
$event = (new CreateDisciplineEvent)->execute([
31+
'company_id' => $loggedCompany->id,
32+
'author_id' => $loggedEmployee->id,
33+
'discipline_case_id' => $caseId,
34+
'happened_at' => Carbon::parse($request->input('happened_at'))->format('Y-m-d'),
35+
'description' => $request->input('description'),
36+
]);
37+
38+
return response()->json([
39+
'data' => DashboardHRDisciplineEventViewHelper::dto($loggedCompany, $event->case, $event),
40+
], 201);
41+
}
42+
43+
/**
44+
* Delete a discipline event.
45+
*
46+
* @param Request $request
47+
* @param int $companyId
48+
* @param int $caseId
49+
* @param int $eventId
50+
*
51+
* @return JsonResponse
52+
*/
53+
public function destroy(Request $request, int $companyId, int $caseId, int $eventId): JsonResponse
54+
{
55+
$loggedCompany = InstanceHelper::getLoggedCompany();
56+
$loggedEmployee = InstanceHelper::getLoggedEmployee();
57+
58+
(new DestroyDisciplineEvent)->execute([
59+
'company_id' => $loggedCompany->id,
60+
'author_id' => $loggedEmployee->id,
61+
'discipline_case_id' => $caseId,
62+
'discipline_event_id' => $eventId,
63+
]);
64+
65+
return response()->json([
66+
'data' => true,
67+
]);
68+
}
69+
}

app/Http/Controllers/Company/Dashboard/HR/DashboardHRController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public function index(Request $request)
4242
'notifications' => NotificationHelper::getNotifications($employee),
4343
'employeesWithoutManagersWithPendingTimesheets' => $employeesWithoutManagersWithPendingTimesheets,
4444
'statisticsAboutTimesheets' => $statisticsAboutTimesheets,
45+
'disciplineCases' => DashboardHRViewHelper::disciplineCases($company),
4546
]);
4647
}
4748
}

app/Http/Controllers/Company/Dashboard/Manager/DashboardManagerController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public function index()
5757
$oneOnOnes = DashboardManagerViewHelper::oneOnOnes($employee, $directReports);
5858
$contractRenewals = DashboardManagerViewHelper::contractRenewals($employee, $directReports);
5959
$timesheetsStats = DashboardManagerViewHelper::employeesWithTimesheetsToApprove($employee, $directReports);
60+
$disciplineCases = DashboardManagerViewHelper::activeDisciplineCases($company, $directReports);
6061

6162
return Inertia::render('Dashboard/Manager/Index', [
6263
'employee' => DashboardViewHelper::information($employee, 'manager'),
@@ -66,6 +67,7 @@ public function index()
6667
'contractRenewals' => $contractRenewals,
6768
'timesheetsStats' => $timesheetsStats,
6869
'defaultCompanyCurrency' => $company->currency,
70+
'disciplinesCases' => $disciplineCases,
6971
]);
7072
}
7173

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Company\Dashboard\Manager;
4+
5+
use Inertia\Inertia;
6+
use Illuminate\Http\Request;
7+
use App\Helpers\InstanceHelper;
8+
use App\Helpers\NotificationHelper;
9+
use App\Http\Controllers\Controller;
10+
use App\Models\Company\DirectReport;
11+
use App\Models\Company\DisciplineCase;
12+
use Illuminate\Database\Eloquent\ModelNotFoundException;
13+
use App\Http\ViewHelpers\Dashboard\HR\DashboardHRDisciplineCaseViewHelper;
14+
15+
class DashboardManagerDisciplineCaseController extends Controller
16+
{
17+
/**
18+
* Show the discipline case.
19+
*
20+
* @param Request $request
21+
* @param int $companyId
22+
* @param int $caseId
23+
*/
24+
public function show(Request $request, int $companyId, int $caseId)
25+
{
26+
$company = InstanceHelper::getLoggedCompany();
27+
$employee = InstanceHelper::getLoggedEmployee();
28+
29+
try {
30+
$case = DisciplineCase::where('company_id', $company->id)
31+
->findOrFail($caseId);
32+
} catch (ModelNotFoundException $e) {
33+
return redirect('home');
34+
}
35+
36+
// is the user a manager?
37+
$directReports = DirectReport::where('company_id', $company->id)
38+
->where('manager_id', $employee->id)
39+
->with('directReport')
40+
->with('directReport.expenses')
41+
->get();
42+
43+
if ($directReports->count() == 0) {
44+
return redirect('home');
45+
}
46+
47+
// can the manager see this case?
48+
if (! $employee->isManagerOf($case->employee->id)) {
49+
return redirect('home');
50+
}
51+
52+
return Inertia::render('Dashboard/HR/DisciplineCases/Show', [
53+
'data' => DashboardHRDisciplineCaseViewHelper::show($company, $case),
54+
'notifications' => NotificationHelper::getNotifications($employee),
55+
]);
56+
}
57+
}

app/Http/ViewHelpers/Dashboard/DashboardHRViewHelper.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,18 @@ public static function statisticsAboutTimesheets(Company $company)
7878
'rejected' => $totals->rejected,
7979
];
8080
}
81+
82+
/**
83+
* Get information about the discipline cases.
84+
*/
85+
public static function disciplineCases(Company $company)
86+
{
87+
return [
88+
'url' => [
89+
'index' => route('dashboard.hr.disciplinecase.index', [
90+
'company' => $company,
91+
]),
92+
],
93+
];
94+
}
8195
}

0 commit comments

Comments
 (0)