this repo has no description
at master 4.1 kB view raw
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}