Commit inicial con archivos existentes

This commit is contained in:
2026-01-17 16:14:00 -06:00
parent 48671dc88e
commit 4c48c279de
2539 changed files with 2412708 additions and 0 deletions

View 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');
}
}
?>