diff --git a/BACKEND/Modules/Admin/app/Http/Controllers/TicketController.php b/BACKEND/Modules/Admin/app/Http/Controllers/TicketController.php index d8e6c13..96556de 100644 --- a/BACKEND/Modules/Admin/app/Http/Controllers/TicketController.php +++ b/BACKEND/Modules/Admin/app/Http/Controllers/TicketController.php @@ -229,40 +229,71 @@ class TicketController extends Controller return AbstractController::ResultError('Không thể tính toán khoảng thời gian nghỉ hợp lệ.'); } // Lây thông tin tickets đang ở trạng thái WAITING - $ticketsWaiting = Ticket::where('user_id', $user->id)->where('status', 'WAITING')->where('type', 'ONLEAVE')->get(); + $ticketsWaiting = Ticket::where('user_id', $user->id)->where('status', 'WAITING')->where('type', 'ONLEAVE') + ->get(); $dataListPeriodWaiting = []; if ($ticketsWaiting->count() > 0) { foreach ($ticketsWaiting as $ticket) { $dataListPeriodWaiting = array_merge($dataListPeriodWaiting, $this->getAllPeriodNew($ticket->start_date, $ticket->start_period, $ticket->end_date, $ticket->end_period)); } } + + // Lấy thông tin tickets đang ở trạng thái CONFIRMED + $ticketsConfirmed = Ticket::where('user_id', $user->id)->where('status', 'CONFIRMED') + ->whereIn('type', ['ONLEAVE', 'LEAVE_WITHOUT_PAY']) + ->where(DB::raw('DATE(start_date)'), '>=', $start_date->toDateString()) + ->where(DB::raw('DATE(end_date)'), '<=', $end_date->toDateString()) + ->get(); + + $dataListPeriodConfirmed = []; + if ($ticketsConfirmed->count() > 0) { + foreach ($ticketsConfirmed as $ticket) { + $dataListPeriodConfirmed = array_merge($dataListPeriodConfirmed, $this->getAllPeriodNew($ticket->start_date, $ticket->start_period, $ticket->end_date, $ticket->end_period)); + } + } + // Chuyển đổi mảng đa chiều thành mảng chuỗi để có thể so sánh $periodStrings = []; $waitingPeriodStrings = []; + $confirmedPeriodStrings = []; foreach ($dataListPeriod as $period) { - if($period['period'] == 'ALL'){ + if ($period['period'] == 'ALL') { $periodStrings[] = $period['date'] . '_S'; $periodStrings[] = $period['date'] . '_C'; - }else{ + } else { $periodStrings[] = $period['date'] . '_' . $period['period']; } } foreach ($dataListPeriodWaiting as $period) { - if($period['period'] == 'ALL'){ + if ($period['period'] == 'ALL') { $waitingPeriodStrings[] = $period['date'] . '_S'; $waitingPeriodStrings[] = $period['date'] . '_C'; - }else{ + } else { $waitingPeriodStrings[] = $period['date'] . '_' . $period['period']; } } - - // Kiểm tra xem có sự trùng lặp giữa hai mảng không + + foreach ($dataListPeriodConfirmed as $period) { + if ($period['period'] == 'ALL') { + $confirmedPeriodStrings[] = $period['date'] . '_S'; + $confirmedPeriodStrings[] = $period['date'] . '_C'; + } else { + $confirmedPeriodStrings[] = $period['date'] . '_' . $period['period']; + } + } + + // Kiểm tra xem có sự trùng lặp giữa request mới và tickets đang chờ duyệt if (count(array_intersect($periodStrings, $waitingPeriodStrings)) > 0) { - return AbstractController::ResultError('Đã tồn tại ticket đang trong thời gian chọn, không thể tạo ticket mới!'); + return AbstractController::ResultError('Đã có ticket đang chờ duyệt trong thời gian này, không thể tạo ticket mới!'); } + // Kiểm tra xem có sự trùng lặp giữa request mới và tickets đã được duyệt + if (count(array_intersect($periodStrings, $confirmedPeriodStrings)) > 0) { + return AbstractController::ResultError('Đã có ticket được duyệt trong thời gian này, không thể tạo ticket mới!'); + } + // Tạo thông báo về tickets waiting nếu có $waitingTicketsMessage = ''; if (!empty($dataListPeriodWaiting)) {