middleware('api')->except('create'); } public function get(Request $request) { $tracking = new Tracking; // Order by $this->orderByRequest($tracking, $request); $tracking->orderBy('created_at', 'desc'); // Filter $this->filterRequest( builder: $tracking, request: $request, filterKeys: [ 'created_at' => self::F_IN_DATETIME, 'time_string' => self::F_TEXT, 'name' => self::F_TEXT, 'status' => self::F_TEXT ] ); $this->searchRequest( builder: $tracking, value: $request->get('search'), fields: [ 'name', 'time_string', 'status' ] ); $responseData = array_merge( $tracking->paginate($request->get('per_page'))->toArray(), ['status' => true] ); // $users = Admin::where('permission', '!=', 'admin')->get(); $users = Admin::where('permission', 'like', '%staff%')->get(); $responseData['users'] = $users; return response()->json($responseData); } public function create(Request $request) { try { $validatedData = $request->validate([ 'name' => 'required', 'time_string' => 'required', 'status' => 'required', ]); $payload = $request->only(['name', 'time_string', 'status']); if ($request->has('created_at')) { $payload['created_at'] = Carbon::create($request->created_at)->setTimezone(env('TIME_ZONE')); } else { $payload['created_at'] = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE')); } $user = Admin::where('name', $payload['name'])->first(); $date = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE'))->format('Y-m-d'); if ($user) { $payload['user_id'] = $user->id; $latest = Tracking::where('name', $payload['name'])->whereDate('created_at', $date)->latest()->first(); if ($latest) { if ($payload['status'] == $this->CHECK_IN || $payload['status'] == $this->CHECK_OUT) { if ($latest->status == $this->CHECK_IN) { $payload['status'] = $this->CHECK_OUT; } if ($latest->status == $this->CHECK_OUT) { $payload['status'] = $this->CHECK_IN; } $tracking = Tracking::create($payload); $this->createOrUpdateRecordForCurrentMonth($payload['created_at']->month, $payload['created_at']->year); return response()->json([ 'data' => $tracking, 'check_status' => $payload['status'], 'status' => true ]); } else { return response()->json([ 'data' => "STATUS INVALID", 'status' => false ]); } } else { $payload['status'] = $this->CHECK_IN; $tracking = Tracking::create($payload); $this->createOrUpdateRecordForCurrentMonth($payload['created_at']->month, $payload['created_at']->year); return response()->json([ 'data' => $tracking, 'check_status' => $this->CHECK_IN, 'status' => true ]); } } return response()->json([ 'data' => "USER NOT EXIST", 'status' => false ]); } catch (\Illuminate\Validation\ValidationException $e) { return response()->json([ 'data' => "IMPORT DATA FAIL", 'status' => false ], 422); } } public function update(Request $request) { $id = $request->get('id'); $tracking = Tracking::find($id); $payload = $request->all(); if ($request->has('created_at')) { $payload['created_at'] = Carbon::create($request->created_at)->setTimezone(env('TIME_ZONE')); } else { $payload['created_at'] = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE')); } if ($tracking) { $tracking->update($payload); $this->createOrUpdateRecordForCurrentMonth($payload['created_at']->month, $payload['created_at']->year); } return response()->json([ 'data' => $tracking, 'status' => true ]); } public function saveImage(Request $request) { $id = $request->get('id'); $tracking = Tracking::find($id); $user = Admin::find($tracking->user_id); $this->sendCheckinLateMail($user, $tracking->created_at, $tracking->status); if ($request->hasFile('image')) { $file = $request->file('image'); $filename = $request->file_name; $path = 'screenshot' . "/$filename"; Storage::disk('public')->put( path: $path, contents: $file->get() ); $tracking->image = $path; $tracking->save(); $date = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE')); $this->createOrUpdateRecordForCurrentMonth($date->month, $date->year); } return response()->json([ 'data' => $tracking, 'status' => true ]); } public function delete(Request $request) { $id = $request->get('id'); Tracking::destroy($id); $date = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE')); $this->createOrUpdateRecordForCurrentMonth($date->month, $date->year); return response()->json([ 'status' => true ]); } // public function sendCheckinLateMail() private function sendCheckinLateMail($user, $time, $status) { // $status = $this->CHECK_IN; // $time =Tracking::find(1)->created_at; // $user = Admin::where('name', 'LE TAN LUAN')->first(); if($status === $this->CHECK_IN){ $morning_time = Carbon::createFromTimeString('07:30AM')->setTimezone(env('TIME_ZONE')); $morning_condition_time = Carbon::createFromTimeString('07:40AM')->setTimezone(env('TIME_ZONE')); $afternoon_time = Carbon::createFromTimeString('01:00PM')->setTimezone(env('TIME_ZONE')); $afternoon_condition_time = Carbon::createFromTimeString('01:10PM')->setTimezone(env('TIME_ZONE')); $admin_mails = Admin::where('permission', 'like', '%admin%')->pluck('email'); if ($time->greaterThan($morning_condition_time) && $time->lessThan($afternoon_time)) { $period = 'morning'; $minutes_late = $morning_time->diffInMinutes($time); $data = array( "email_template" => "email.checkin_late_notification", "email" => $user->email, "name" => $user->name, "admin_mails" => $admin_mails, "message1" => "Your ". $period ." starts ". $minutes_late ." minutes late", "message2" => "You checked in at [" . $time ."]", "url" => env('ADMIN_URL')."/tracking?search=&per_page=10&page=1&timezone=Asia%2FSaigon&name=".$user->name."&time_string=".$time->format("Y-m-d H:i")."&status=check+in", "subject" => "[Management System] Late warning - " . $user->name ); Mail::to($user->email)->cc($admin_mails)->send(new CheckinLateMail($data)); } // if ($time->greaterThan($afternoon_condition_time)) // { // $period = 'afternoon'; // $minutes_late = $afternoon_time->diffInMinutes($time); // $data = array( // "email_template" => "email.checkin_late_notification", // "email" => $user->email, // "name" => $user->name, // "message1" => "Your ". $period ." starts ". $minutes_late ." minutes late", // "message2" => "You checked in at [" . $time ."]", // "url" => env('ADMIN_URL')."/tracking?search=&per_page=10&page=1&timezone=Asia%2FSaigon&name=".$user->name."&time_string=".$time->format("Y-m-d H:i")."&status=check+in", // "subject" => "[Management System] Late warning" // ); // Mail::to($user->email)->cc($admin_mails)->send(new CheckinLateMail($data)); // } } } }