feat(ticketing): resolve validity in tenant timezone
This commit is contained in:
@@ -17,6 +17,29 @@ Genera, valida, consulta y exporta entradas asociadas a compras pagadas de produ
|
||||
se combinan con OR y las dimensiones diferentes se combinan con AND. El modelo calcula si un ticket está
|
||||
vigente, vencido o usado, y resuelve sus fechas efectivas de inicio y fin sin persistir vigencias en el ticket.
|
||||
|
||||
## Zona horaria y vigencias
|
||||
|
||||
La zona se configura por tenant mediante `timezone` (identificador IANA, por ejemplo
|
||||
`America/Argentina/Buenos_Aires`), configurado mediante seeders o base de datos y expuesto en la respuesta de tenants.
|
||||
Ese es el valor por defecto. La aplicación mantiene su zona global en UTC.
|
||||
|
||||
Las fechas y horas de `EventDate` y los horarios de `time_window` son locales al tenant.
|
||||
Las ventanas `fixed_window` se guardan en UTC. El resolver pasa la zona del tenant del producto
|
||||
al grupo de vigencia: antes de combinar fecha y hora, convierte el ancla a esa zona.
|
||||
Sin fecha de evento, utiliza el día local del instante consultado; contempla ventanas nocturnas.
|
||||
El inicio es inclusivo y el vencimiento exclusivo.
|
||||
|
||||
Para validar una ventana horaria directamente, pasar la zona explícitamente:
|
||||
`$validityTime->isValid(now(), $tenant->timezone)`. Un `ValidityTime` aislado no tiene tenant;
|
||||
los métodos mantienen UTC como valor por defecto para usos sin contexto.
|
||||
|
||||
La migración `2026_09_21_040000_add_timezone_to_tenants.php` asigna la zona inicial y reconstruye
|
||||
una sola vez las ventanas asociadas a fechas existentes, usando las fechas y horas locales originales.
|
||||
No modifica ventanas independientes. Los cambios posteriores de zona son responsabilidad del tenant:
|
||||
reinterpretan los horarios locales, pero no reescriben los instantes UTC guardados. Editar la fecha
|
||||
u horas de un evento sí vuelve a calcular su ventana. El rollback elimina la columna, sin deshacer
|
||||
la corrección de los instantes. Ya no se utiliza `EVENT_TIMEZONE`.
|
||||
|
||||
## Flujo de generación
|
||||
|
||||
1. `Purchase` emite `PurchasePaid` al confirmarse el pago.
|
||||
|
||||
Reference in New Issue
Block a user