99 lines
4.0 KiB
PHP
99 lines
4.0 KiB
PHP
<?php
|
||||
|
|
|
|||
|
|
namespace App\Console\Commands;
|
|||
|
|
|
|||
|
|
use App\Models\User;
|
|||
|
|
use App\Services\LatePenaltyService;
|
|||
|
|
use Carbon\Carbon;
|
|||
|
|
use Illuminate\Console\Command;
|
|||
|
|
use Morilog\Jalali\Jalalian;
|
|||
|
|
|
|||
|
|
class SendWeeklyLateReport extends Command
|
|||
|
|
{
|
|||
|
|
protected $signature = 'late:weekly-report {--date=}';
|
|||
|
|
|
|||
|
|
protected $description = 'Send weekly late-penalty report to admins via Bale';
|
|||
|
|
|
|||
|
|
public function handle(LatePenaltyService $service): int
|
|||
|
|
{
|
|||
|
|
$anchor = $this->option('date')
|
|||
|
|
? Carbon::parse($this->option('date'))
|
|||
|
|
: Carbon::yesterday();
|
|||
|
|
|
|||
|
|
[$start, $end] = $service->weekBounds($anchor);
|
|||
|
|
$startLabel = Jalalian::fromCarbon($start)->format('Y/m/d');
|
|||
|
|
$endLabel = Jalalian::fromCarbon($end)->format('Y/m/d');
|
|||
|
|
|
|||
|
|
$users = User::query()
|
|||
|
|
->whereNotNull('user_name')
|
|||
|
|
->whereNull('deleted_at')
|
|||
|
|
->get(['user_name', 'name']);
|
|||
|
|
|
|||
|
|
$lines = [
|
|||
|
|
"📊 گزارش تأخیر هفتگی",
|
|||
|
|
"بازه: {$startLabel} تا {$endLabel}",
|
|||
|
|
"ارفاق هفتگی: " . LatePenaltyService::WEEKLY_ALLOWANCE_MINUTES . " دقیقه (از جمع تأخیرهای ۸:۳۰ تا ۸:۴۵)",
|
|||
|
|
"",
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
$any = false;
|
|||
|
|
$sumWeeklyFine = 0;
|
|||
|
|
$sumDailyFine = 0;
|
|||
|
|
$sumReportTotal = 0;
|
|||
|
|
|
|||
|
|
foreach ($users as $user) {
|
|||
|
|
$summary = $service->summarizeUserPeriod($user->user_name, $start, $end);
|
|||
|
|
if ($summary['grace_late_minutes'] <= 0 && $summary['daily_fine_amount'] <= 0) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$any = true;
|
|||
|
|
// فقط تأخیر بازه ۸:۳۰–۸:۴۵ برای جریمه هفتگی
|
|||
|
|
$weekly = $service->computeWeeklyFine($summary['grace_late_minutes']);
|
|||
|
|
$reportTotal = $weekly['fine_amount'] + $summary['daily_fine_amount'];
|
|||
|
|
|
|||
|
|
$sumWeeklyFine += $weekly['fine_amount'];
|
|||
|
|
$sumDailyFine += $summary['daily_fine_amount'];
|
|||
|
|
$sumReportTotal += $reportTotal;
|
|||
|
|
|
|||
|
|
$service->storePeriodFine([
|
|||
|
|
'user_identity' => $user->user_name,
|
|||
|
|
'period_type' => 'weekly',
|
|||
|
|
'period_start' => $start->toDateString(),
|
|||
|
|
'period_end' => $end->toDateString(),
|
|||
|
|
'late_minutes' => $summary['grace_late_minutes'],
|
|||
|
|
'allowance_minutes' => $weekly['allowance_minutes'],
|
|||
|
|
'fine_minutes' => $weekly['fine_minutes'],
|
|||
|
|
'fine_amount' => $weekly['fine_amount'],
|
|||
|
|
'daily_fine_amount' => $summary['daily_fine_amount'],
|
|||
|
|
'weekly_fine_amount' => $weekly['fine_amount'],
|
|||
|
|
'total_fine_amount' => $reportTotal,
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
$name = $user->name ?: $user->user_name;
|
|||
|
|
$lines[] = "• {$name}";
|
|||
|
|
$lines[] = " جمع تأخیر ۸:۳۰–۸:۴۵: {$summary['grace_late_minutes']} دقیقه";
|
|||
|
|
$lines[] = " ارفاق هفتگی: {$weekly['allowance_minutes']} دقیقه";
|
|||
|
|
$lines[] = $weekly['fine_minutes'] > 0
|
|||
|
|
? " جریمه هفتگی: {$weekly['fine_minutes']} × " . number_format(LatePenaltyService::FINE_PER_MINUTE) . " = " . $service->formatAmount($weekly['fine_amount'])
|
|||
|
|
: " جریمه هفتگی: ۰";
|
|||
|
|
$lines[] = " جریمه روزانه این هفته: " . $service->formatAmount($summary['daily_fine_amount']);
|
|||
|
|
$lines[] = " جمع گزارش: " . $service->formatAmount($reportTotal);
|
|||
|
|
$lines[] = "";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!$any) {
|
|||
|
|
$lines[] = "در این هفته تأخیری ثبت نشده است.";
|
|||
|
|
} else {
|
|||
|
|
$lines[] = "جمع جریمه هفتگی: " . $service->formatAmount($sumWeeklyFine);
|
|||
|
|
$lines[] = "جمع جریمه روزانه: " . $service->formatAmount($sumDailyFine);
|
|||
|
|
$lines[] = "جمع کل گزارش هفته: " . $service->formatAmount($sumReportTotal);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$service->sendToAdmins(implode("\n", $lines));
|
|||
|
|
$this->info('Weekly late report sent.');
|
|||
|
|
|
|||
|
|
return self::SUCCESS;
|
|||
|
|
}
|
|||
|
|
}
|