this repo has no description
1<?php
2
3namespace App\Http\Controllers;
4
5use App\Models\UserAttendance;
6use App\Models\UserLog;
7use Carbon\Carbon;
8use Illuminate\Http\Request;
9
10class AttendanceController extends Controller
11{
12 public function check(Request $request)
13 {
14 $request->validate([
15 'latitude' => 'numeric|between:-90,90',
16 'longitude' => 'numeric|between:-180,180',
17 ]);
18
19 $user = $request->user();
20
21 $activeAttendance = UserAttendance::where("user_id", $user->id)->whereNull("check_out_at")->first();
22 if ($activeAttendance != null) {
23 if (UserAttendance::doesOverlap($activeAttendance->check_in_at, Carbon::now(), $activeAttendance->id)) {
24 return response()->json([
25 "message" => "You can't check out now since there is an active attendance already in place"
26 ], 400);
27 }
28
29 $activeAttendance->update([
30 "check_out_at" => now()
31 ]);
32
33 return response()->json([
34 "message" => "Checked out"
35 ]);
36 }
37
38 if (UserAttendance::doesOverlap(Carbon::now(), Carbon::now(), null)) {
39 return response()->json([
40 "message" => "You can't check in now since there is an active attendance already in place"
41 ], 400);
42 }
43
44 UserAttendance::create([
45 "user_id" => $user->id,
46 "check_in_at" => now(),
47 "check_out_at" => null,
48 "latitude" => $request->json("latitude"),
49 "longitude" => $request->json("longitude")
50 ]);
51
52 return response()->json([
53 "message" => "Checked in",
54 ]);
55 }
56
57 public function getActive(Request $request)
58 {
59 $user = $request->user();
60
61 $activeAttendance = UserAttendance::where("user_id", $user->id)->whereNull("check_out_at")->first();
62
63 return response()->json([
64 "message" => $activeAttendance != null ? "Found active" : "No active found",
65 "data" => $activeAttendance
66 ]);
67 }
68
69 public function show(Request $request)
70 {
71 $user = $request->user();
72
73 $attendances = UserAttendance::where("user_id", $user->id)
74 ->where("check_in_at", ">", now()->subDays(7))
75 ->orWhere('check_out_at', '>', now()->subDays(7))
76 ->get();
77
78 return response()->json([
79 "message" => "Found attendances",
80 "data" => $attendances
81 ]);
82 }
83
84 public function update(Request $request, UserAttendance $attendance)
85 {
86 $validated = $request->validate([
87 'check_in_at' => ['required', 'date'],
88 'check_out_at' => ['date', 'after:check_in_at'],
89 'reason' => ['required']
90 ]);
91
92
93 // Check for overlaps
94 if (UserAttendance::doesOverlap(Carbon::parse($validated['check_in_at']), Carbon::parse($validated['check_out_at']), $attendance->id)) {
95 return response()->json([
96 'message' => "The updated attendance can't overlap an existing attendance"
97 ], 400);
98 }
99
100 // Add update to user logs
101 $newCheckIn = Carbon::parse($validated['check_in_at'])->format('Y-m-d H:i:s');
102 $newCheckOut = Carbon::parse($validated['check_out_at'])->format('Y-m-d H:i:s');
103
104 $oldCheckoutMessage = "";
105 if ($attendance->check_out_at != null) {
106 $oldCheckoutMessage = " and " . $attendance->check_out_at->format('Y-m-d H:i:s');
107 }
108
109 UserLog::create([
110 "user_id" => $request->user()->id,
111 "message" => "Updated check in and check out time from {$attendance->check_in_at->format('Y-m-d H:i:s')}{$oldCheckoutMessage} to {$newCheckIn} and {$newCheckOut} because of {$request->json("reason")}"
112 ]);
113
114 $attendance->update([
115 'check_in_at' => $validated["check_in_at"],
116 'check_out_at' => $validated["check_out_at"],
117 ]);
118
119 return response()->json([
120 'message' => "Updated attendance"
121 ]);
122 }
123}