diff --git a/app/Http/Controllers/AttendanceController.php b/app/Http/Controllers/AttendanceController.php index 3196a666..0cd0ce58 100755 --- a/app/Http/Controllers/AttendanceController.php +++ b/app/Http/Controllers/AttendanceController.php @@ -71,7 +71,9 @@ class AttendanceController extends Controller } if ($user && !empty($user->attendances)) { foreach ($user->attendances as $att) { - $date = $att->entered_at != null ? Jalalian::fromCarbon(Carbon::parse($att->entered_at)) : null; + $date = $att->entered_at != null + ? \App\Support\JalaliHelper::fromDateTime($att->entered_at) + : null; $att->date = $date != null ? $date->format('Y/m/d') : null; if ($att->duration != null && $date != null && $now->getMonth() == $date->getMonth()) { [$h, $m, $sec] = explode(':', $att->duration); diff --git a/app/Services/LatePenaltyService.php b/app/Services/LatePenaltyService.php index e4659974..d246b62f 100644 --- a/app/Services/LatePenaltyService.php +++ b/app/Services/LatePenaltyService.php @@ -127,7 +127,12 @@ class LatePenaltyService public function jalaliMonthBounds(?Carbon $date = null): array { - $j = Jalalian::fromCarbon($date ?? Carbon::now()); + $carbon = $date ?? Carbon::now(); + if ($carbon->year < 1000 || $carbon->year > 3000) { + $carbon = Carbon::now(); + } + + $j = Jalalian::fromCarbon($carbon); $start = (new Jalalian($j->getYear(), $j->getMonth(), 1))->toCarbon()->startOfDay(); $endDay = $j->getMonth() <= 6 ? 31 : ($j->getMonth() <= 11 ? 30 : ($j->isLeapYear() ? 30 : 29)); $end = (new Jalalian($j->getYear(), $j->getMonth(), $endDay))->toCarbon()->endOfDay(); diff --git a/app/Support/JalaliHelper.php b/app/Support/JalaliHelper.php new file mode 100644 index 00000000..fd864abc --- /dev/null +++ b/app/Support/JalaliHelper.php @@ -0,0 +1,35 @@ +year < 1000 || $carbon->year > 3000) { + return null; + } + + return Jalalian::fromCarbon($carbon); + } catch (Throwable $e) { + return null; + } + } + + public static function format($value, string $format = 'Y/m/d', string $fallback = '-'): string + { + $jalali = self::fromDateTime($value); + + return $jalali ? $jalali->format($format) : $fallback; + } +} diff --git a/resources/views/attendance/index.blade.php b/resources/views/attendance/index.blade.php index d5613d1c..bbea98bf 100755 --- a/resources/views/attendance/index.blade.php +++ b/resources/views/attendance/index.blade.php @@ -146,10 +146,13 @@ if (!empty($user->tasks)) { // بررسی وجود داده $attendances = $user->attendances ?? collect(); - // گروه‌بندی داده‌ها بر اساس نام ماه (مثلا: مهر، آبان) - $groupedData = $attendances->groupBy(function($item) { - return \Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($item->entered_at))->format('%B'); - }); + // گروه‌بندی داده‌ها بر اساس نام ماه شمسی + $groupedData = $attendances + ->filter(fn ($item) => !empty($item->entered_at)) + ->groupBy(function ($item) { + $month = \App\Support\JalaliHelper::format($item->entered_at, '%B', ''); + return $month !== '' ? $month : 'نامعتبر'; + }); @endphp
@@ -188,10 +191,10 @@ if (!empty($user->tasks)) { @php $monthLateMinutes = 0; $monthDailyFine = 0; - $monthKey = $records->first()?->entered_at - ? \Carbon\Carbon::parse($records->first()->entered_at) - : null; - if ($monthKey) { + $monthKey = null; + $firstEntered = $records->first()?->entered_at; + if ($firstEntered && \App\Support\JalaliHelper::fromDateTime($firstEntered)) { + $monthKey = \Carbon\Carbon::parse($firstEntered); [$mStart, $mEnd] = app(\App\Services\LatePenaltyService::class)->jalaliMonthBounds($monthKey); $monthWeeklyFine = (int) \App\Models\LatePeriodFine::query() ->where('user_identity', $user->user_name) @@ -220,9 +223,9 @@ if (!empty($user->tasks)) { {{-- تاریخ --}} - {{ $item->entered_at ? \Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($item->entered_at))->format('m/d') : '-' }} + {{ \App\Support\JalaliHelper::format($item->entered_at, 'm/d') }} - {{ $item->entered_at ? \Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($item->entered_at))->format('%A') : '' }} + {{ \App\Support\JalaliHelper::format($item->entered_at, '%A', '') }}