Alcance¶
Detrás del discurso de marketplace de excedentes, hartazone es un motor de
reservas con inventario perecedero, ventanas temporales estrictas y liquidación
fuera de línea. Todo el modelo gira alrededor de una única entidad crítica y de la publicación diaria que le da stock.
Las cuatro fuerzas que dominan el diseño:
- El tiempo es dato de negocio, no metadato. Una publicación tiene cinco instantes distintos. Casi todas las reglas son comparaciones contra esos instantes.
- El stock es contencioso. Retención de 2 minutos, confirmación, ajuste del comercio, cancelación, expiración y liberación concurren sobre el mismo contador. Esto se resuelve en la base de datos, no en el código de aplicación.
- Nada se borra.
Reservas y valoraciones son inmutables o
append-onlypor requerimiento explícito. - Todo es configurable sin desplegar. Los requerimientos definen ~25 parámetros que cambian el comportamiento del motor de reservas en caliente. Los estados del ciclo de vida se rigen por el mismo principio.
Restricciones del piloto¶
Cinco decisiones de alcance que simplifican el modelo de forma sustancial.
| Restricción | Origen | Consecuencia en el modelo |
|---|---|---|
| Pago exclusivamente en efectivo en el local | RF-U-26RF-C-45 |
No hay pasarela, métodos de pago ni conciliación; el cobro es un atributo de la validación |
| Retiro presencial obligatorio | RF-U-26 |
No hay direcciones de entrega, repartidores ni seguimiento |
| Horizonte de publicación de 48 h | RF-C-24 |
El volumen de publicaciones vivas es trivial; no requiere particionado |
| Sin aplicación nativa de comercio | RF-C-01 |
El modo contingencia es una cola de navegador; el servidor acepta la hora declarada del dispositivo pero nunca la usa para decidir |
| Reloj del servidor autoritativo | RF-C-02 |
La hora del dispositivo se guarda como dato declarado, jamás como fuente de verdad |
Fuera de alcance¶
| Funcionalidad | Estado |
|---|---|
| Programa de puntos por compra y canje | Sin requerimiento asociado |
| Puntos por reciclaje de envases | Sin requerimiento asociado |
| Regalos digitales entre usuarios | Sin requerimiento asociado |
| Pago con tarjeta o billetera en la app | Negado por RF-U-30 |
| Declaración estructurada de alérgenos | Retirado por decisión de negocio |
Invariantes críticos¶
Cuatro garantías que no pueden fallar. Todas son estructurales: si alguna se implementa en la capa de aplicación, el requerimiento correspondiente deja de ser una garantía y pasa a ser una aspiración.
| Invariante | Mecanismo | Requerimientos |
|---|---|---|
| El stock reservado nunca supera al publicado | chk_publicacion_stock_coherente |
RF-U-31RF-C-31 |
| El código de reserva es único en todo el sistema | unq_reserva_codigo |
RF-U-32RF-C-43 |
| Una reserva se valida a lo sumo una vez | Único por construcción (OneToOneField) |
RF-C-44 |
| Dos ventanas del mismo día nunca se solapan | excl_ventanarecogida_solape |
RF-C-20 |
CHECK (cantidad_reservada <= cantidad_total)sobrepublicacion, combinado con el ajuste del contador dentro de la misma transacción que crea la reserva, convierte la sobreventa en un error de transacción sin necesidad deSELECT ... FOR UPDATEexplícito y sin ventana de carrera entre la lectura y la escritura. Es el núcleo del control de concurrencia.
La primera de las cuatro depende de que algo mueva cantidad_reservada
dentro de esa transacción, y ese algo es trg_reserva_ajustar_stock. A la
quinta garantía estructural del modelo, la restricción maestra que obliga a toda ventana de recogida a caber en el
horario de atención de su día (RF-C-17), la impone
trg_ventanarecogida_dentro_horario.
El inventario completo de lo que la base impone hoy y de lo que falta está en
Triggers.
La prohibición de borrar una reserva es un régimen de tabla, no un invariante puntual. Lo impone el mismo mecanismo que protege cualquier otra tabla mutable protegida del modelo, descrito en Auditoría por tabla.