Resolución de Pedidos No Completados en 3 Días
Documentación completa del comando `update_unfulfilled` que finaliza y resuelve los pedidos no completados después de 3 días de su creación.
¿Cuándo se ejecuta?
Este comando se ejecuta automáticamente dos veces al día (cada 12 horas) a través de un cron job configurado como 0 0,12 * * *. Las ejecuciones ocurren a las 00:00 (medianoche) y 12:00 (mediodía) todos los días. En cada ejecución procesa todos los pedidos no completados que fueron creados hace más de 3 días y están marcados como finished=False.
Criterios de Procesamiento
- Antigüedad: Pedidos con más de 3 días (72 horas) desde su creación
- Estado:
finished=False(no finalizados) - Alcance: Todos los países sin restricción geográfica específica
- Condición temporal:
created_at <= now() - 3 días
Funcionalidad Principal
1. Identificación de Pedidos Pendientes
Criterios de Búsqueda:
UnfulfilledOrder.objects.filter(
finished=False,
created_at__lte=datetime.now() - timedelta(days=3)
)Características:
- Procesa pedidos de cualquier país/región (ver Cencosud Unfulfilled)
- No discrimina por tipo de restaurante
- Aplica lógica universal de resolución
2. Lógica de Resolución por Combinación de Respuestas
El comando evalúa tres escenarios principales basados en las respuestas disponibles:
Escenario 1: Sin Respuestas (Beneficio de la Duda)
Condición: user_answer = null Y store_answer = null
Lógica de Resolución:
└── Ambos sin respuesta → PEDIDO COMPLETADO (beneficio de la duda)
Acciones:
- UnfulfilledOrder.status = "1" (COMPLETED)
- Order.status = "1" (COMPLETED)
- finished = True, user_finished_view = True, store_finished_view = True
- Resultado: Se considera entregado exitosamenteEscenario 2: Solo Respuesta de Tienda
Condición: user_answer = null Y store_answer != null
Sub-caso 2A: Tienda confirma entrega (store_answer = "0")
Acciones:
- Status: COMPLETED (1)
- Notificación al usuario: "El restaurante nos informó que tu pedido se ha completado"
- Mensaje: "¡No olvides deslizar tu pantalla la próxima vez!"
- finished = TrueSub-caso 2B: Tienda reporta no recogido (store_answer = "1")
Para Pagos con Tarjeta (payment_type = "0"):
Acciones:
- Status: UNFULFILLED_BY_USER (4)
- Notificación: "El restaurante informó que no se ha recogido"
- Mensaje: "Se te cobró el monto del pedido"
- Evento: ORDER_UNFULFILLED_BY_USERPara Pagos con Efectivo (payment_type = "1"):
Acciones:
- Status: UNFULFILLED_BY_USER (4)
- Genera deuda automáticamente (generate_debt())
- Notificación: "Se te cobrará en tu próxima compra"
- Evento: ORDER_UNFULFILLED_BY_USERSub-caso 2C: Tienda reporta no entrega (store_answer = "2")
Para Pagos con Tarjeta (payment_type = "0"):
Acciones:
- Status: UNFULFILLED_BY_STORE (12)
- Reembolso en créditos: cost + coupon_value + credits_used
- Notificación: "Disculpa esta mala experiencia - recibiste reembolso"
- Evento: ORDER_UNFULFILLED_BY_USERPara Pagos con Efectivo (payment_type = "1"):
Acciones:
- Status: UNFULFILLED_BY_STORE (12)
- Solo notificación (sin reembolso en créditos)
- Mensaje: "Nos aseguraremos que ya no pase más"
- Evento: ORDER_UNFULFILLED_BY_USEREscenario 3: Solo Respuesta de Usuario
Condición: store_answer = null Y user_answer != null
Sub-caso 3A: Usuario confirma recepción (user_answer = "0")
Acciones:
- Status: COMPLETED (1)
- finished = True
- Sin notificaciones adicionalesSub-caso 3B: Usuario reporta no recogió (user_answer = "1")
Para Pagos con Tarjeta (payment_type = "0"):
Acciones:
- Status: UNFULFILLED_BY_USER (4)
- Evento: ORDER_UNFULFILLED_BY_USER
- Sin penalización adicionalPara Pagos con Efectivo (payment_type = "1"):
Acciones:
- Status: UNFULFILLED_BY_USER (4)
- Genera deuda automáticamente
- Evento: ORDER_UNFULFILLED_BY_USERSub-caso 3C: Usuario reporta tienda no entregó (user_answer = "2")
Para Pagos con Tarjeta (payment_type = "0"):
Acciones:
- Status: UNFULFILLED_BY_STORE (12)
- Reembolso en créditos: cost + coupon_value + credits_used
- Evento: ORDER_UNFULFILLED_BY_USERPara Pagos con Efectivo (payment_type = "1"):
Acciones:
- Status: UNFULFILLED_BY_STORE (12)
- Sin reembolso en créditos
- Evento: ORDER_UNFULFILLED_BY_USER3. Sistema de Compensaciones
Reembolso en Créditos
Fórmula: cost + coupon_value + credits_used
Aplicable a:
- Pagos con tarjeta cuando tienda no entrega
- Usuario reporta que tienda no entregó
Generación de Deuda
Método: user.generate_debt(unfulfilled_order)
Aplicable a:
- Pagos con crédito cuando usuario no recoge
- Evaluación automática de elegibilidad para deuda
Impacto en el Negocio
Beneficios
- Cierre Automático: Garantiza que ningún pedido quede indefinidamente pendiente
- Justicia Procesal: Aplica compensaciones según responsabilidad determinada
- Diferenciación por Pago: Lógica específica para tarjeta vs crédito
- Comunicación Proactiva: Notifica resultados a todos los usuarios afectados
Casos de Uso Típicos
- Pedidos olvidados por ambas partes (beneficio de la duda)
- Disputas no resueltas después de 3 días
- Abandonos de proceso de resolución
- Casos complejos que requieren cierre forzado
Diferencias con Otros Comandos
vs cencosud_unfulfilled
- Tiempo de espera: 3 días vs 24 horas
- Geografía: Universal vs solo CL/AR
- Lógica: Más simple, basada en respuestas directas
- Compensaciones: Manejo diferenciado por tipo de pago
vs restart_stock_v2
- Función: Finalizador vs Creador de casos
- Timing: 3 días vs 15 minutos
- Alcance: Casos existentes vs nuevos casos
Reglas de Negocio Específicas
Priorización de Decisiones
- Sin respuestas: Beneficio de la duda → Completado
- Respuesta de tienda disponible: Prevalece sobre usuario
- Solo respuesta de usuario: Se acepta como válida
- Tipo de pago: Determina tipo de compensación/penalización
Manejo de Pagos
- Tarjeta (
payment_type = "0"): Reembolsos en créditos para fallas de tienda - Efectivo (
payment_type = "1"): Generación de deuda para fallas de usuario
Eventos Registrados
- Todos los casos no completados registran:
ORDER_UNFULFILLED_BY_USER - Integración con sistema de marketing automation
- Trazabilidad completa para análisis posterior
Modelos y Status Utilizados
Modelos Principales
UnfulfilledOrder: Registro principal que se procesaOrder: Pedido original que se actualizaAppUser: Usuario para créditos y deudaCreditsLogs: Registro de movimientos de créditos
Status Finales
| Status | Código | Descripción | Compensación |
|---|---|---|---|
| Completed | 1 | Pedido completado | Ninguna |
| Unfulfilled by User | 4 | Responsabilidad del usuario | Posible deuda |
| Unfulfilled by Store | 12 | Responsabilidad de tienda | Créditos (si tarjeta) |
Estados de Finalización
finished:Truepara todos los casos procesadosuser_finished_view:True- Usuario no necesita más accionesstore_finished_view:True- Tienda no necesita más acciones
Tipos de Pago
"0": Pago con tarjeta - Permite reembolsos en créditos"1": Pago con efectivo - Genera deuda en lugar de reembolso
Resolución de Pedidos No Completados en 24h
Documentación completa del comando `update_unfulfilled_every_6hours` que finaliza y resuelve los pedidos no completados después de 1 día de su última actualización, específicamente para las operaciones en México.
Creación de Pedidos No Completados
Documentación completa del comando `restart_stock_v2` que gestiona los pedidos no completados después del horario de recolección de los restaurantes. Su objetivo principal es mantener la integridad del sistema cuando los pedidos no pueden ser entregados por diversas razones.