254 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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;
 | 
						|
        // $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 <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));
 | 
						|
            // }
 | 
						|
 | 
						|
            
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |