Fix Jalali year-0 crash on /tasks from invalid target_date.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-22 17:56:39 +03:30
co-authored by Cursor
parent dc276dfbb5
commit 6caee30d9b
7 changed files with 37 additions and 15 deletions
+4 -1
View File
@@ -107,7 +107,10 @@ class User extends Authenticatable
foreach ($data->attendances as $att) {
if ($att->entered_at) {
$date = \Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($att->entered_at));
$date = \App\Support\JalaliHelper::fromDateTime($att->entered_at);
if (!$date) {
continue;
}
$month = $date->format('%B');
if (!isset($result[$month])) {
+19
View File
@@ -39,4 +39,23 @@ class JalaliHelper
return $jalali ? $jalali->format($format) : $fallback;
}
/** تاریخ میلادی امن به صورت Y-m-d */
public static function toGregorianDate($value, string $fallback = ''): string
{
if ($value === null || $value === '' || str_starts_with((string) $value, '0000-00-00')) {
return $fallback;
}
try {
$carbon = $value instanceof Carbon ? $value->copy() : Carbon::parse($value);
if ($carbon->year < 1000 || $carbon->year > 3000) {
return $fallback;
}
return $carbon->format('Y-m-d');
} catch (Throwable $e) {
return $fallback;
}
}
}
+2 -2
View File
@@ -307,8 +307,8 @@ foreach ($data as $employee) {
<tbody>
@foreach($records as $row)
<tr>
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('m/d') ?? '-' }}</td>
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('%A') ?? '-' }}</td>
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, 'm/d') }}</td>
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, '%A') }}</td>
<td>{{ Carbon::parse($row->entered_at)->format('H:i') ?? '-' }}</td>
<td>{{ $row->exited_at ? Carbon::parse($row->exited_at)->format('H:i') : '-' }}</td>
<td>{{ $row->duration ? Carbon::parse($row->duration)->format('H:i') : '-' }}</td>
+1 -1
View File
@@ -39,7 +39,7 @@
<label class="pb-3">تاریخ تولد:</label>
<div class="flex flex-col gap-1">
<input type="text" id="birthday_display"
value="{{ $user->birthday ? \Morilog\Jalali\Jalalian::fromCarbon($user->birthday)->format('Y/m/d') : '' }}"
value="{{ $user->birthday ? \App\Support\JalaliHelper::format($user->birthday) : '' }}"
placeholder="اختیاری — انتخاب تاریخ"
class="border border-gray-300 rounded-md text-center"
autocomplete="off" readonly>
+2 -2
View File
@@ -52,8 +52,8 @@ foreach ($data as $month => $attendances) {
<tbody>
@foreach($records as $row)
<tr>
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('m/d') ?? '-' }}</td>
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('%A') ?? '-' }}</td>
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, 'm/d') }}</td>
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, '%A') }}</td>
<td>{{ Carbon::parse($row->entered_at)->format('H:i') ?? '-' }}</td>
<td>{{ $row->exited_at ? Carbon::parse($row->exited_at)->format('H:i') : '-' }}</td>
<td>{{ $row->exited_at ? Carbon::parse($row->duration)->format('H:i') : '-' }}</td>
+4 -4
View File
@@ -246,12 +246,12 @@ if (isset($task)) {
// اگر مقدار اولیه از دیتابیس آمده، فیلد مخفی میلادی را هم پر کن
@if(!empty($task?->start_date))
$('#start_date_gregorian').val(@json(\Carbon\Carbon::parse($task->start_date)->format('Y-m-d')));
$('#start_date').val(@json(\Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($task->start_date))->format('Y/m/d')));
$('#start_date_gregorian').val(@json(\App\Support\JalaliHelper::toGregorianDate($task->start_date)));
$('#start_date').val(@json(\App\Support\JalaliHelper::format($task->start_date, 'Y/m/d', '')));
@endif
@if(!empty($task?->target_date))
$('#target_date_gregorian').val(@json(\Carbon\Carbon::parse($task->target_date)->format('Y-m-d')));
$('#target_date').val(@json(\Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($task->target_date))->format('Y/m/d')));
$('#target_date_gregorian').val(@json(\App\Support\JalaliHelper::toGregorianDate($task->target_date)));
$('#target_date').val(@json(\App\Support\JalaliHelper::format($task->target_date, 'Y/m/d', '')));
@endif
$('form').on('submit', function (e) {
+5 -5
View File
@@ -584,10 +584,10 @@ $state = [
<article class="task-card task-row {{ $task->active ? 'is-active' : '' }}"
data-task-id="{{ $task->id }}"
data-assignee-ids='@json($task->assignee_ids ?? [])'
data-start-date="{{ $task->start_date ? \Carbon\Carbon::parse($task->start_date)->format('Y-m-d') : '' }}"
data-target-date="{{ $task->target_date ? \Carbon\Carbon::parse($task->target_date)->format('Y-m-d') : '' }}"
data-finished-date="{{ $task->finished_at ? \Carbon\Carbon::parse($task->finished_at)->format('Y-m-d') : '' }}"
data-created-date="{{ $task->created_at ? \Carbon\Carbon::parse($task->created_at)->format('Y-m-d') : '' }}"
data-start-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->start_date) }}"
data-target-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->target_date) }}"
data-finished-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->finished_at) }}"
data-created-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->created_at) }}"
onclick="openTaskDetailsModal({{ $task->id }})"
role="button"
tabindex="0"
@@ -626,7 +626,7 @@ $state = [
@else
<div class="task-card-field">
<dt class="task-card-label">مهلت</dt>
<dd class="task-card-value">{{ $task->target_date ? Jalalian::fromCarbon(Carbon::parse($task->target_date))->format('Y/m/d') : '-' }}</dd>
<dd class="task-card-value">{{ \App\Support\JalaliHelper::format($task->target_date) }}</dd>
</div>
@endif