Fix recurring ticket schedule edge cases in API and model
- manage_recurring.php calculateNextRun(): expand monthly cap from 28→31 with proper last-day-of-month clamping (matches model fix); use split with ':00' append to handle malformed time strings without crashing; fix weekly day array to start at index 1 (not 0) so day=0 never maps to empty string and blows up DateTime - RecurringTicketModel::calculateNextRunTime(): same weekly day array fix (start at index 1) to eliminate '' → DateTime exception on day=0 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -147,18 +147,21 @@ function calculateNextRun($scheduleType, $scheduleDay, $scheduleTime) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'weekly':
|
case 'weekly':
|
||||||
$days = ['', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
|
$days = [1 => 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
|
||||||
$dayName = $days[$scheduleDay] ?? 'Monday';
|
$dayName = $days[(int)$scheduleDay] ?? 'Monday';
|
||||||
$next = new DateTime("next {$dayName} " . $time);
|
$next = new DateTime("next {$dayName} " . $time);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'monthly':
|
case 'monthly':
|
||||||
$day = max(1, min(28, (int)$scheduleDay));
|
$day = max(1, min(31, (int)$scheduleDay));
|
||||||
$next = new DateTime();
|
$next = new DateTime();
|
||||||
$next->modify('first day of next month');
|
$next->modify('first day of next month');
|
||||||
$next->setDate($next->format('Y'), $next->format('m'), $day);
|
// Clamp to last day of target month (handles Feb, 30-day months)
|
||||||
list($h, $m) = explode(':', $time);
|
$daysInMonth = (int)$next->format('t');
|
||||||
$next->setTime((int)$h, (int)$m, 0);
|
$day = min($day, $daysInMonth);
|
||||||
|
$next->setDate((int)$next->format('Y'), (int)$next->format('m'), $day);
|
||||||
|
$parts = explode(':', $time . ':00'); // ensure at least H:M
|
||||||
|
$next->setTime((int)$parts[0], (int)$parts[1], 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -176,7 +176,8 @@ class RecurringTicketModel {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'weekly':
|
case 'weekly':
|
||||||
$dayName = ['', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][$scheduleDay] ?? 'Monday';
|
$dayNames = [1 => 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
|
||||||
|
$dayName = $dayNames[(int)$scheduleDay] ?? 'Monday';
|
||||||
$next = new DateTime("next {$dayName} " . $scheduleTime);
|
$next = new DateTime("next {$dayName} " . $scheduleTime);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user