259 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace Modules\Admin\app\Http\Controllers;
 | 
						|
 | 
						|
use App\Helper\Cache\CurrentMonthTimekeeping;
 | 
						|
use App\Http\Controllers\Controller;
 | 
						|
use App\Models\Notes;
 | 
						|
use App\Traits\AnalyzeData;
 | 
						|
use App\Traits\HasFilterRequest;
 | 
						|
use App\Traits\HasOrderByRequest;
 | 
						|
use App\Traits\HasSearchRequest;
 | 
						|
use Carbon\Carbon;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\Mail;
 | 
						|
use App\Mail\TicketMail;
 | 
						|
use Modules\Admin\app\Models\Admin;
 | 
						|
use Modules\Admin\app\Models\MonthlyTimekeeping;
 | 
						|
use Modules\Admin\app\Models\Tracking;
 | 
						|
use Maatwebsite\Excel\Facades\Excel;
 | 
						|
use App\Exports\TimekeepingExport;
 | 
						|
use Modules\Admin\app\Models\Ticket;
 | 
						|
 | 
						|
class TimekeepingController extends Controller
 | 
						|
{
 | 
						|
    use HasOrderByRequest;
 | 
						|
    use HasFilterRequest;
 | 
						|
    use HasSearchRequest;
 | 
						|
    use AnalyzeData;
 | 
						|
 | 
						|
    public function get(Request $request)
 | 
						|
    {
 | 
						|
        $currentDate = Carbon::now();
 | 
						|
        $currentMonth = $currentDate->month;
 | 
						|
        $currentYear = $currentDate->year;
 | 
						|
        $data = MonthlyTimekeeping::where('month', '=', $request->month)->where('year', '=', $request->year)->first();
 | 
						|
        if ($currentMonth == (int)$request->month && $currentYear == (int)$request->year) {
 | 
						|
            $cacheData = CurrentMonthTimekeeping::getCacheCurrentMonthTimekeeping();
 | 
						|
            if ($cacheData) {
 | 
						|
                $cacheData->data = json_decode($cacheData->data, true);
 | 
						|
                return response()->json(['status' => true, 'data' => $this->appendUsersInformation($cacheData->data), 'working_days' => $cacheData->working_days, 'message' => 'Get from cache']);
 | 
						|
            } else {
 | 
						|
                $result = $this->analyzeCurrentMonthTimeKeepingData($currentMonth, $currentYear);
 | 
						|
                if ($data) {
 | 
						|
                    $data->update(['data' => json_encode($result)]);
 | 
						|
                    return response()->json(['status' => true, 'data' => $this->appendUsersInformation($result), 'message' => 'Get from analyzeCurrentMonthTimeKeepingData + update record']);
 | 
						|
                }
 | 
						|
                MonthlyTimekeeping::create(['month' => $currentMonth, 'year' => $currentYear, 'working_days' => $currentDate->daysInMonth, 'data' => json_encode($result)]);
 | 
						|
                return response()->json(['status' => true, 'data' => $this->appendUsersInformation($result), 'message' => 'Get from analyzeCurrentMonthTimeKeepingData + create record']);
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            if ($data) {
 | 
						|
                $data['data'] = json_decode($data['data']);
 | 
						|
                return response()->json(['status' => true, 'data' => $this->appendUsersInformation($data['data']), 'working_days' => $data['working_days'], 'message' => 'Get from DB']);
 | 
						|
            } else {
 | 
						|
                $result = $this->analyzeCurrentMonthTimeKeepingData($request->month, $request->year);
 | 
						|
                MonthlyTimekeeping::create(['month' => $request->month, 'year' => $request->year, 'working_days' => Carbon::create((int)$request->year, (int)$request->month)->daysInMonth, 'data' => json_encode($result)]);
 | 
						|
                return response()->json(['status' => true, 'data' => $this->appendUsersInformation($result), 'message' => 'Get from analyzeCurrentMonthTimeKeepingData']);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return response()->json(['status' => false, 'mewssage' => 'Get data failed!']);
 | 
						|
    }
 | 
						|
 | 
						|
    public function addWorkingTimeForMultipleUser(Request $request)
 | 
						|
    {
 | 
						|
        $user_ids = $request->users;
 | 
						|
        $year = $request->year;
 | 
						|
        $month = $request->month;
 | 
						|
        $day = $request->day;
 | 
						|
        $type = $request->type;
 | 
						|
        foreach ($user_ids as $id) {
 | 
						|
            $user = Admin::find($id);
 | 
						|
            $date = Carbon::create($year, $month, $day)->setTimezone(env('TIME_ZONE'));
 | 
						|
            $start = $date->copy()->setTime(7, 31, 11);
 | 
						|
            $end = $type == 'half' ? $date->copy()->setTime(11, 31, 11) : $date->copy()->setTime(17, 1, 11);
 | 
						|
            Tracking::insert([
 | 
						|
                [
 | 
						|
                    'name' => $user->name,
 | 
						|
                    'user_id' => $user->id,
 | 
						|
                    'status' => 'check in',
 | 
						|
                    'time_string' => $start->format('Y-m-d H:i:s'),
 | 
						|
                    'created_at' => $start->setTimezone('UTC')
 | 
						|
                ],
 | 
						|
                [
 | 
						|
                    'name' => $user->name,
 | 
						|
                    'user_id' => $user->id,
 | 
						|
                    'status' => 'check out',
 | 
						|
                    'time_string' => $end->format('Y-m-d H:i:s'),
 | 
						|
                    'created_at' => $end->setTimezone('UTC')
 | 
						|
                ]
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
        $this->createOrUpdateRecordForCurrentMonth($month, $year);
 | 
						|
        return response()->json(['status' => true, 'message' => 'Add successfully']);
 | 
						|
    }
 | 
						|
 | 
						|
    public function saveWorkingDays(Request $request)
 | 
						|
    {
 | 
						|
        $data = MonthlyTimekeeping::where('month', '=', $request->month)->where('year', '=', $request->year)->first();
 | 
						|
        if ($data) {
 | 
						|
            $data->update(['working_days' => $request->working_days]);
 | 
						|
            $this->createOrUpdateRecordForCurrentMonth($request->month, $request->year);
 | 
						|
            return response()->json(['status' => true, 'message' => 'Update successful']);
 | 
						|
        }
 | 
						|
 | 
						|
        return response()->json(['status' => false, 'message' => 'Update failed']);
 | 
						|
    }
 | 
						|
 | 
						|
    public function addNoteForUser(Request $request)
 | 
						|
    {
 | 
						|
        $user_id = $request->users["id"] ?? "";
 | 
						|
        $month = $request->month;
 | 
						|
        $year = $request->year;
 | 
						|
        $day = $request->day;
 | 
						|
        $time_type = $request->type;
 | 
						|
        $reason = $request->reason;
 | 
						|
        $note = $request->note;
 | 
						|
 | 
						|
        if ($user_id == "") {
 | 
						|
            return response()->json(['status' => false, 'message' => 'User not found!']);
 | 
						|
        }
 | 
						|
 | 
						|
        $existingNote = Notes::where('n_user_id', $user_id)
 | 
						|
            ->where('n_day', $day)
 | 
						|
            ->where('n_month', $month)
 | 
						|
            ->where('n_year', $year)
 | 
						|
            ->where('n_reason', $reason)
 | 
						|
            ->first();
 | 
						|
 | 
						|
        if ($existingNote) {
 | 
						|
            // Cập nhật bản ghi nếu đã tồn tại
 | 
						|
            $existingNote->update([
 | 
						|
                'n_day' => $day,
 | 
						|
                'n_month' => $month,
 | 
						|
                'n_year' => $year,
 | 
						|
                'n_time_type' => $time_type,
 | 
						|
                'n_reason' => $reason,
 | 
						|
                'n_note' => $note
 | 
						|
            ]);
 | 
						|
        } else {
 | 
						|
            // Chèn bản ghi mới nếu không tồn tại
 | 
						|
            Notes::create([
 | 
						|
                'n_user_id' => $user_id,
 | 
						|
                'n_day' => $day,
 | 
						|
                'n_month' => $month,
 | 
						|
                'n_year' => $year,
 | 
						|
                'n_time_type' => $time_type,
 | 
						|
                'n_reason' => $reason,
 | 
						|
                'n_note' => $note
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
 | 
						|
        $this->createOrUpdateRecordForCurrentMonth($month, $year);
 | 
						|
 | 
						|
        return response()->json(['status' => true, 'message' => 'Add successfully']);
 | 
						|
    }
 | 
						|
 | 
						|
    public function updateCacheMonth(Request $request)
 | 
						|
    {
 | 
						|
        $month = $request->month;
 | 
						|
        $year = $request->year;
 | 
						|
 | 
						|
        $this->createOrUpdateRecordForCurrentMonth($month, $year);
 | 
						|
 | 
						|
        return response()->json(['status' => true, 'message' => 'Update successfully']);
 | 
						|
    }
 | 
						|
 | 
						|
    public function deleteNote(Request $request)
 | 
						|
    {
 | 
						|
        $rules = [
 | 
						|
            'id' => 'required'
 | 
						|
        ];
 | 
						|
 | 
						|
        // Validate the request
 | 
						|
        $request->validate($rules);
 | 
						|
        $id = $request->input('id');
 | 
						|
 | 
						|
        $note = Notes::find($id);
 | 
						|
        if (!$note) {
 | 
						|
            return response()->json(['message' => 'Note not found', 'status' => false]);
 | 
						|
        }
 | 
						|
 | 
						|
        $ticket = Ticket::find($note->ticket_id);
 | 
						|
        if (!$ticket) {
 | 
						|
            return response()->json(['message' => 'Ticket not found, can not delete note', 'status' => false]);
 | 
						|
        }
 | 
						|
 | 
						|
        $admin = auth('admins')->user();
 | 
						|
 | 
						|
        // Handle send mail
 | 
						|
        $dataMasterStartPeriod = CategoryController::getListMasterByCodeAndType("TIME_TYPE", $ticket->start_period);
 | 
						|
        $dataMasterEndPeriod = CategoryController::getListMasterByCodeAndType("TIME_TYPE", $ticket->end_period);
 | 
						|
        $dataMasterType = CategoryController::getListMasterByCodeAndType("REASON", $ticket->type);
 | 
						|
        $formattedStartDate = Carbon::createFromFormat('Y-m-d', $ticket->start_date)->format('d/m/Y');
 | 
						|
        $formattedEndDate = Carbon::createFromFormat('Y-m-d', $ticket->end_date)->format('d/m/Y');
 | 
						|
 | 
						|
        $user = Admin::find($ticket->user_id);
 | 
						|
 | 
						|
        $data = array(
 | 
						|
            "email_template" => "email.notification_tickets_user",
 | 
						|
            "user_name" => $user->name,
 | 
						|
            "email" => $user->email,
 | 
						|
            "name" => $admin->name, //name admin duyệt
 | 
						|
            "date" => $dataMasterStartPeriod->c_name . " (" . $formattedStartDate . ") - " . $dataMasterEndPeriod->c_name . " (" . $formattedEndDate . ")",
 | 
						|
            "type" => $dataMasterType->c_name,
 | 
						|
            "note" => $ticket->reason,
 | 
						|
            "admin_note" => $ticket->admin_note,
 | 
						|
            "link" => "/tickets", //link đến page admin
 | 
						|
            "status" => "refused",
 | 
						|
            "subject" => "[Ticket response] Ticket From " . $admin->name
 | 
						|
        );
 | 
						|
        Mail::to($user->email)->send(new TicketMail($data));
 | 
						|
 | 
						|
        // Update
 | 
						|
        $ticket->updated_by = $admin->name;
 | 
						|
        $ticket->status = "REFUSED";
 | 
						|
        $ticket->save();
 | 
						|
        Notes::where('ticket_id', $ticket->id)->delete();
 | 
						|
 | 
						|
        // Clear Timekeeping cache
 | 
						|
        $this->createOrUpdateRecordForCurrentMonth(Carbon::parse($ticket->start_date)->month, Carbon::parse($ticket->start_date)->year);
 | 
						|
        $this->createOrUpdateRecordForCurrentMonth(Carbon::parse($ticket->end_date)->month, Carbon::parse($ticket->end_date)->year);
 | 
						|
        return response()->json(['message' => 'Delete success', 'status' => true]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function export(Request $request)
 | 
						|
    {
 | 
						|
        // Validate request
 | 
						|
        $request->validate([
 | 
						|
            'month' => 'required|numeric|between:1,12',
 | 
						|
            'year' => 'required|numeric|min:2000',
 | 
						|
            'working_days' => 'required|numeric|between:1,31'
 | 
						|
        ]);
 | 
						|
 | 
						|
        // Reuse get() function to fetch data
 | 
						|
        $response = $this->get($request);
 | 
						|
        $responseData = json_decode($response->getContent(), true);
 | 
						|
 | 
						|
        if (!$responseData['status']) {
 | 
						|
            return response()->json(['status' => false, 'message' => 'No data found']);
 | 
						|
        }
 | 
						|
 | 
						|
        // Lọc chỉ lấy user có permission bao gồm staff
 | 
						|
        $staffData = array_filter($responseData['data'], function ($user) {
 | 
						|
            return isset($user['user']['permission']) && strpos($user['user']['permission'], 'staff') !== false;
 | 
						|
        });
 | 
						|
 | 
						|
        $currentDate = date('d_His');
 | 
						|
        return Excel::download(
 | 
						|
            new TimekeepingExport(
 | 
						|
                array_values($staffData), // Convert to indexed array after filtering
 | 
						|
                $request->month,
 | 
						|
                $request->year,
 | 
						|
                $request->working_days
 | 
						|
            ),
 | 
						|
            "Timekeeping_{$request->month}_{$request->year}_{$currentDate}.xlsx"
 | 
						|
        );
 | 
						|
    }
 | 
						|
}
 |