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; } }