Tạo ticket tự động cho user khi user không check in, check out
This commit is contained in:
parent
7fa50478cc
commit
d0c1b6894b
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App\Jobs;
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
use App\Mail\TicketMail;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Illuminate\Bus\Queueable;
|
use Illuminate\Bus\Queueable;
|
||||||
|
|
@ -9,6 +10,9 @@ use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
use Illuminate\Foundation\Bus\Dispatchable;
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Support\Facades\Mail;
|
||||||
|
use Modules\Admin\app\Http\Controllers\CategoryController;
|
||||||
|
use Modules\Admin\app\Models\Admin;
|
||||||
use Modules\Admin\app\Models\Ticket;
|
use Modules\Admin\app\Models\Ticket;
|
||||||
use Modules\Admin\app\Models\Tracking;
|
use Modules\Admin\app\Models\Tracking;
|
||||||
|
|
||||||
|
|
@ -36,18 +40,82 @@ class CheckUserAttendanceJob implements ShouldQueue
|
||||||
$users = User::all();
|
$users = User::all();
|
||||||
|
|
||||||
foreach ($users as $key => $user) {
|
foreach ($users as $key => $user) {
|
||||||
// if($user->id != 2){
|
// if ($user->id != 2) {
|
||||||
// continue;
|
// continue;
|
||||||
// }
|
// }
|
||||||
// Kiểm tra dựa trên period (Sáng 'S' hoặc Chiều 'C')
|
// Kiểm tra dựa trên period (Sáng 'S' hoặc Chiều 'C')
|
||||||
if ($this->period === 'S') {
|
if ($this->period === 'S') {
|
||||||
$this->checkMorning($user->id);
|
$this->checkMorning($user);
|
||||||
} elseif ($this->period === 'C') {
|
} elseif ($this->period === 'C') {
|
||||||
$this->checkAfternoon($user->id);
|
$this->checkAfternoon($user);
|
||||||
} else {
|
} else {
|
||||||
// Nếu không có period, kiểm tra cả sáng và chiều
|
if ($this->period == null) {
|
||||||
$this->checkMorning($user->id);
|
// Nếu không có period, kiểm tra cả sáng và chiều
|
||||||
$this->checkAfternoon($user->id);
|
$this->checkMorning($user);
|
||||||
|
$this->checkAfternoon($user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function checkAttendance($user, $periodCode, $startTime, $endTime)
|
||||||
|
{
|
||||||
|
$today = Carbon::today();
|
||||||
|
$userId = $user->id;
|
||||||
|
// Lấy tất cả tracking của user trong khoảng thời gian được chỉ định
|
||||||
|
$records = Tracking::where('user_id', $userId)
|
||||||
|
->whereBetween('time_string', [$startTime, $endTime])
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$hasCheckIn = $records->where('status', 'check in')->isNotEmpty();
|
||||||
|
$hasCheckOut = $records->where('status', 'check out')->isNotEmpty();
|
||||||
|
|
||||||
|
// Kiểm tra nếu đã có ticket chờ xử lý hoặc đã được xác nhận
|
||||||
|
$existingTicket = Ticket::where('user_id', $userId)
|
||||||
|
->where('start_date', $today->format('Y-m-d'))
|
||||||
|
->where('start_period', $periodCode)
|
||||||
|
->where('end_date', $today->format('Y-m-d'))
|
||||||
|
->where('end_period', $periodCode)
|
||||||
|
->whereIn('status', ['WAITING', 'CONFIRMED'])
|
||||||
|
->first();
|
||||||
|
$type = 'ONLEAVE';
|
||||||
|
$reason = 'KHONG PHEP';
|
||||||
|
// Nếu không có check-in hoặc check-out, và chưa có ticket, tạo ticket mới
|
||||||
|
if (!$hasCheckIn && !$hasCheckOut && !$existingTicket) {
|
||||||
|
Ticket::create([
|
||||||
|
'user_id' => $userId,
|
||||||
|
'start_date' => $today->format('Y-m-d'),
|
||||||
|
'start_period' => $periodCode,
|
||||||
|
'end_date' => $today->format('Y-m-d'),
|
||||||
|
'end_period' => $periodCode,
|
||||||
|
'type' => $type,
|
||||||
|
'reason' => $reason,
|
||||||
|
'status' => 'WAITING',
|
||||||
|
'created_at' => Carbon::now(),
|
||||||
|
'updated_at' => Carbon::now()
|
||||||
|
]);
|
||||||
|
|
||||||
|
//Send mail
|
||||||
|
$dataMasterStartPeriod = CategoryController::getListMasterByCodeAndType("TIME_TYPE", $periodCode);
|
||||||
|
$dataMasterEndPeriod = CategoryController::getListMasterByCodeAndType("TIME_TYPE", $periodCode);
|
||||||
|
$dataMasterType = CategoryController::getListMasterByCodeAndType("REASON", $type);
|
||||||
|
|
||||||
|
$formattedStartDate = $today->format('d/m/Y');
|
||||||
|
$formattedEndDate = $today->format('d/m/Y');
|
||||||
|
|
||||||
|
$admins = Admin::where('permission', 'like', '%admin%')->get();
|
||||||
|
foreach ($admins as $key => $value) {
|
||||||
|
$data = array(
|
||||||
|
"email_template" => "email.notification_tickets",
|
||||||
|
"email" => $user->email,
|
||||||
|
"name" => $user->name,
|
||||||
|
"date" => $dataMasterStartPeriod->c_name . " (" . $formattedStartDate . ") - " . $dataMasterEndPeriod->c_name . " (" . $formattedEndDate . ")",
|
||||||
|
"type" => $dataMasterType->c_name,
|
||||||
|
"note" => $reason,
|
||||||
|
"link" => "/tickets-management", //link đến page admin
|
||||||
|
"subject" => "[Ticket request] Ticket From " . $user->name
|
||||||
|
);
|
||||||
|
Mail::to($value->email)->send(new TicketMail($data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -56,71 +124,21 @@ class CheckUserAttendanceJob implements ShouldQueue
|
||||||
* Kiểm tra check-in/check-out buổi sáng và tạo ticket nếu thiếu.
|
* Kiểm tra check-in/check-out buổi sáng và tạo ticket nếu thiếu.
|
||||||
* @param int $userId
|
* @param int $userId
|
||||||
*/
|
*/
|
||||||
public function checkMorning($userId)
|
public function checkMorning($user)
|
||||||
{
|
{
|
||||||
$morningCheckIn = Carbon::createFromTime(7, 30);
|
$startTime = Carbon::today()->setTime(6, 0); // Thời gian bắt đầu buổi sáng
|
||||||
$morningCheckOut = Carbon::createFromTime(11, 30);
|
$endTime = Carbon::createFromTime(12, 0); // Thời gian kết thúc buổi sáng
|
||||||
$checkDeadline = Carbon::createFromTime(12, 0); // Hạn kiểm tra cho buổi sáng
|
$this->checkAttendance($user, 'S', $startTime, $endTime);
|
||||||
$today = Carbon::today();
|
|
||||||
|
|
||||||
// Lấy tất cả tracking của user cho buổi sáng (từ 7:30 đến 12:00)
|
|
||||||
$morningRecords = Tracking::where('user_id', $userId)
|
|
||||||
->whereBetween('time_string', [$today->copy()->setTime(7, 30), $checkDeadline])
|
|
||||||
->get();
|
|
||||||
|
|
||||||
$hasMorningCheckIn = $morningRecords->where('status', 'check in')->isNotEmpty();
|
|
||||||
$hasMorningCheckOut = $morningRecords->where('status', 'check out')->isNotEmpty();
|
|
||||||
|
|
||||||
// Nếu không có check-in hoặc check-out, tạo ticket
|
|
||||||
if (!$hasMorningCheckIn && !$hasMorningCheckOut) {
|
|
||||||
Ticket::create([
|
|
||||||
'user_id' => $userId,
|
|
||||||
'start_date' => $today->format('Y-m-d'),
|
|
||||||
'start_period' => 'S', // Morning
|
|
||||||
'end_date' => $today->format('Y-m-d'),
|
|
||||||
'end_period' => 'S', // Morning
|
|
||||||
'type' => 'UNAUTHORIZEDLEAVE',
|
|
||||||
'reason' => 'No check in/out for morning',
|
|
||||||
'status' => 'WAITING',
|
|
||||||
'created_at' => Carbon::now(),
|
|
||||||
'updated_at' => Carbon::now()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kiểm tra check-in/check-out buổi chiều và tạo ticket nếu thiếu.
|
* Kiểm tra check-in/check-out buổi chiều và tạo ticket nếu thiếu.
|
||||||
* @param int $userId
|
* @param int $userId
|
||||||
*/
|
*/
|
||||||
public function checkAfternoon($userId)
|
public function checkAfternoon($user)
|
||||||
{
|
{
|
||||||
$afternoonCheckIn = Carbon::createFromTime(13, 0);
|
$startTime = Carbon::today()->setTime(12, 0); // Thời gian bắt đầu buổi chiều
|
||||||
$afternoonCheckOut = Carbon::createFromTime(17, 0);
|
$endTime = Carbon::createFromTime(17, 30); // Thời gian kết thúc buổi chiều
|
||||||
$checkDeadline = Carbon::createFromTime(17, 30); // Hạn kiểm tra cho buổi chiều
|
$this->checkAttendance($user, 'C', $startTime, $endTime);
|
||||||
$today = Carbon::today();
|
|
||||||
|
|
||||||
// Lấy tất cả tracking của user cho buổi chiều (từ 13:00 đến 17:30)
|
|
||||||
$afternoonRecords = Tracking::where('user_id', $userId)
|
|
||||||
->whereBetween('time_string', [$today->copy()->setTime(13, 0), $checkDeadline])
|
|
||||||
->get();
|
|
||||||
|
|
||||||
$hasAfternoonCheckIn = $afternoonRecords->where('status', 'check in')->isNotEmpty();
|
|
||||||
$hasAfternoonCheckOut = $afternoonRecords->where('status', 'check out')->isNotEmpty();
|
|
||||||
|
|
||||||
// Nếu không có check-in hoặc check-out, tạo ticket
|
|
||||||
if (!$hasAfternoonCheckIn && !$hasAfternoonCheckOut) {
|
|
||||||
Ticket::create([
|
|
||||||
'user_id' => $userId,
|
|
||||||
'start_date' => $today->format('Y-m-d'),
|
|
||||||
'start_period' => 'C', // Afternoon
|
|
||||||
'end_date' => $today->format('Y-m-d'),
|
|
||||||
'end_period' => 'C', // Afternoon
|
|
||||||
'type' => 'UNAUTHORIZEDLEAVE',
|
|
||||||
'reason' => 'No check in/out for afternoon',
|
|
||||||
'status' => 'WAITING',
|
|
||||||
'created_at' => Carbon::now(),
|
|
||||||
'updated_at' => Carbon::now()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue