Files
a.montask/app/Console/Commands/SendWeeklyLateReport.php
T

99 lines
4.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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;
}
}