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;
|
||||
|
||||
case 'weekly':
|
||||
$days = ['', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
|
||||
$dayName = $days[$scheduleDay] ?? 'Monday';
|
||||
$days = [1 => 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
|
||||
$dayName = $days[(int)$scheduleDay] ?? 'Monday';
|
||||
$next = new DateTime("next {$dayName} " . $time);
|
||||
break;
|
||||
|
||||
case 'monthly':
|
||||
$day = max(1, min(28, (int)$scheduleDay));
|
||||
$day = max(1, min(31, (int)$scheduleDay));
|
||||
$next = new DateTime();
|
||||
$next->modify('first day of next month');
|
||||
$next->setDate($next->format('Y'), $next->format('m'), $day);
|
||||
list($h, $m) = explode(':', $time);
|
||||
$next->setTime((int)$h, (int)$m, 0);
|
||||
// Clamp to last day of target month (handles Feb, 30-day months)
|
||||
$daysInMonth = (int)$next->format('t');
|
||||
$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;
|
||||
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user