option('date') ? Carbon::parse($this->option('date'))->startOfDay() : Carbon::yesterday()->startOfDay(); $start = $date->copy()->startOfDay(); $end = $date->copy()->endOfDay(); $jalali = Jalalian::fromCarbon($date)->format('Y/m/d'); $entries = $service->firstEntriesBetween($start, $end) ->filter(fn ($att) => (int) ($att->late_minutes ?? 0) > 0 || (int) ($att->daily_fine_amount ?? 0) > 0) ->values(); if ($entries->isEmpty()) { $message = "📋 گزارش تأخیر روزانه\nتاریخ: {$jalali}\n\nامروز تأخیر مشمول جریمه ثبت نشده است."; $service->sendToAdmins($message); $this->info('Daily late report sent (empty).'); return self::SUCCESS; } $lines = ["📋 گزارش تأخیر روزانه", "تاریخ: {$jalali}", ""]; $totalFine = 0; foreach ($entries as $att) { $name = $service->userName($att->user_identity); $enter = Carbon::parse($att->entered_at)->format('H:i'); $late = (int) $att->late_minutes; $fineMin = (int) $att->daily_fine_minutes; $fine = (int) $att->daily_fine_amount; $totalFine += $fine; $lines[] = "• {$name}"; $lines[] = " ورود: {$enter} | تأخیر: {$late} دقیقه"; $lines[] = $fineMin > 0 ? " جریمه روزانه: {$fineMin} دقیقه × " . number_format(LatePenaltyService::FINE_PER_MINUTE) . " = " . $service->formatAmount($fine) : " جریمه روزانه: ۰ (داخل ارفاق ۱۵ دقیقه‌ای)"; $lines[] = ""; } $lines[] = "جمع جریمه روز: " . $service->formatAmount($totalFine); $service->sendToAdmins(implode("\n", $lines)); $this->info('Daily late report sent.'); return self::SUCCESS; } }