Commit inicial con archivos existentes
This commit is contained in:
49
common/helpers/schedule_helpers.php
Executable file
49
common/helpers/schedule_helpers.php
Executable file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
if (!function_exists('calculateNextSendTime')) {
|
||||
/**
|
||||
* Calcula la próxima fecha y hora de envío para un mensaje recurrente.
|
||||
*
|
||||
* @param array $recurringDays Un array de enteros representando los días de la semana (0=Domingo, 6=Sábado).
|
||||
* @param string $recurringTime La hora del día en formato HH:MM.
|
||||
* @param string $timezone La zona horaria a utilizar.
|
||||
* @return string La próxima fecha y hora de envío en formato Y-m-d H:i:s.
|
||||
* @throws Exception Si no se puede determinar la próxima fecha de envío.
|
||||
*/
|
||||
function calculateNextSendTime(array $recurringDays, string $recurringTime, string $timezone = 'America/Mexico_City'): string {
|
||||
$tz = new DateTimeZone($timezone);
|
||||
$now = new DateTime('now', $tz);
|
||||
list($hour, $minute) = explode(':', $recurringTime);
|
||||
|
||||
sort($recurringDays); // Ensure days are sorted
|
||||
|
||||
$nextSendTime = null;
|
||||
|
||||
// 1. Check for today's occurrence first
|
||||
$todayDayOfWeek = (int)$now->format('w');
|
||||
$potentialTodaySendTime = (clone $now)->setTime((int)$hour, (int)$minute, 0);
|
||||
|
||||
if (in_array($todayDayOfWeek, $recurringDays) && $potentialTodaySendTime > $now) {
|
||||
// If today is a recurring day and the time hasn't passed yet, this is the next send time
|
||||
$nextSendTime = $potentialTodaySendTime;
|
||||
} else {
|
||||
// 2. Look for the next recurring day, starting from tomorrow
|
||||
for ($i = 1; $i <= 7; $i++) { // Check next 7 days
|
||||
$checkDate = (clone $now)->modify("+$i days");
|
||||
$dayOfWeek = (int)$checkDate->format('w');
|
||||
|
||||
if (in_array($dayOfWeek, $recurringDays)) {
|
||||
$nextSendTime = (clone $checkDate)->setTime((int)$hour, (int)$minute, 0);
|
||||
break; // Found the earliest future recurring day
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($nextSendTime === null) {
|
||||
throw new Exception('No se pudo determinar la próxima fecha de envío para la configuración recurrente proporcionada.');
|
||||
}
|
||||
|
||||
return $nextSendTime->format('Y-m-d H:i:s');
|
||||
}
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user