ManagementSystem/BACKEND/Modules/Admin/app/Http/Controllers/TrackingController.php

254 lines
9.8 KiB
PHP
Executable File

<?php
namespace Modules\Admin\app\Http\Controllers;
use App\Events\WarningChekinLate;
use App\Http\Controllers\Controller;
use App\Mail\CheckinLateMail;
use App\Traits\AnalyzeData;
use App\Traits\HasFilterRequest;
use App\Traits\HasOrderByRequest;
use App\Traits\HasSearchRequest;
use Carbon\Carbon;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
use Modules\Admin\app\Models\Admin;
use Modules\Admin\app\Models\MonthlyTimekeeping;
use Modules\Admin\app\Models\Tracking;
class TrackingController extends Controller
{
use HasOrderByRequest;
use HasFilterRequest;
use HasSearchRequest;
use AnalyzeData;
private $CHECK_IN = 'check in';
private $CHECK_OUT = 'check out';
public function __construct()
{
// Bỏ qua middleware 'checkApiToken' cho hàm 'myFunction'
$this->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;
// $lastCheck =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('11:30AM')->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 <b>". $minutes_late ."</b> minutes late",
// "message2" => "You checked in at <b>[" . $time ."]</b>",
// "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));
// }
}
}
}