Tạo ticket tự động cho user khi user không check in, check out
This commit is contained in:
parent
f55ac7e65c
commit
7fa50478cc
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Jobs\CheckUserAttendanceJob;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class CheckUserAttendanceCommand extends Command
|
||||||
|
{
|
||||||
|
// Định nghĩa command signature
|
||||||
|
protected $signature = 'attendance:check {period?}';
|
||||||
|
protected $description = 'Kiểm tra check in và check out của người dùng và tạo ticket nếu thiếu';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new command instance.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
// Lấy argument period (Sáng "S" hoặc Chiều "C")
|
||||||
|
$period = $this->argument('period');
|
||||||
|
|
||||||
|
// Dispatch job để kiểm tra check in và check out
|
||||||
|
CheckUserAttendanceJob::dispatch($period);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -26,6 +26,12 @@ class Kernel extends ConsoleKernel
|
||||||
// Chạy command vào ngày 31/12 lúc 23:59:59 mỗi năm
|
// Chạy command vào ngày 31/12 lúc 23:59:59 mỗi năm
|
||||||
$schedule->command('initialize:leavedays')->yearlyOn(12, 31, '23:59:59');
|
$schedule->command('initialize:leavedays')->yearlyOn(12, 31, '23:59:59');
|
||||||
$schedule->command('leave:deduct')->yearlyOn(3, 31, '23:59:59');
|
$schedule->command('leave:deduct')->yearlyOn(3, 31, '23:59:59');
|
||||||
|
|
||||||
|
// Chạy buổi sáng lúc 12:00
|
||||||
|
$schedule->command('attendance:check S')->dailyAt('12:00');
|
||||||
|
|
||||||
|
// Chạy buổi chiều lúc 17:30
|
||||||
|
$schedule->command('attendance:check C')->dailyAt('17:30');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,126 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Modules\Admin\app\Models\Ticket;
|
||||||
|
use Modules\Admin\app\Models\Tracking;
|
||||||
|
|
||||||
|
class CheckUserAttendanceJob implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
protected $period;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new job instance.
|
||||||
|
* @param string|null $period
|
||||||
|
*/
|
||||||
|
public function __construct($period = null)
|
||||||
|
{
|
||||||
|
$this->period = $period;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
// Lấy tất cả người dùng
|
||||||
|
$users = User::all();
|
||||||
|
|
||||||
|
foreach ($users as $key => $user) {
|
||||||
|
// if($user->id != 2){
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// Kiểm tra dựa trên period (Sáng 'S' hoặc Chiều 'C')
|
||||||
|
if ($this->period === 'S') {
|
||||||
|
$this->checkMorning($user->id);
|
||||||
|
} elseif ($this->period === 'C') {
|
||||||
|
$this->checkAfternoon($user->id);
|
||||||
|
} else {
|
||||||
|
// Nếu không có period, kiểm tra cả sáng và chiều
|
||||||
|
$this->checkMorning($user->id);
|
||||||
|
$this->checkAfternoon($user->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kiểm tra check-in/check-out buổi sáng và tạo ticket nếu thiếu.
|
||||||
|
* @param int $userId
|
||||||
|
*/
|
||||||
|
public function checkMorning($userId)
|
||||||
|
{
|
||||||
|
$morningCheckIn = Carbon::createFromTime(7, 30);
|
||||||
|
$morningCheckOut = Carbon::createFromTime(11, 30);
|
||||||
|
$checkDeadline = Carbon::createFromTime(12, 0); // Hạn kiểm tra cho buổi sáng
|
||||||
|
$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.
|
||||||
|
* @param int $userId
|
||||||
|
*/
|
||||||
|
public function checkAfternoon($userId)
|
||||||
|
{
|
||||||
|
$afternoonCheckIn = Carbon::createFromTime(13, 0);
|
||||||
|
$afternoonCheckOut = Carbon::createFromTime(17, 0);
|
||||||
|
$checkDeadline = Carbon::createFromTime(17, 30); // Hạn kiểm tra cho buổi chiều
|
||||||
|
$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()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -67,7 +67,7 @@ class DeductLeaveDays implements ShouldQueue
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//Nếu không sử dụng ngày nghỉ còn lại ở nằm rồi thì xóa => theo luật ld
|
//Nếu không sử dụng ngày nghỉ còn lại ở năm rồi thì xóa => theo luật ld
|
||||||
LeaveDays::where('ld_year', $this->year)
|
LeaveDays::where('ld_year', $this->year)
|
||||||
->where('ld_user_id', $user->id)
|
->where('ld_user_id', $user->id)
|
||||||
->update([
|
->update([
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue