Cheaf Docs
Orders/Order Unfulfilled

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 exitosamente

Escenario 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 = True

Sub-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_USER

Para 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_USER

Sub-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_USER

Para 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_USER

Escenario 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 adicionales

Sub-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 adicional

Para Pagos con Efectivo (payment_type = "1"):

Acciones:
- Status: UNFULFILLED_BY_USER (4)
- Genera deuda automáticamente
- Evento: ORDER_UNFULFILLED_BY_USER

Sub-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_USER

Para Pagos con Efectivo (payment_type = "1"):

Acciones:
- Status: UNFULFILLED_BY_STORE (12)
- Sin reembolso en créditos
- Evento: ORDER_UNFULFILLED_BY_USER

3. 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

  1. Sin respuestas: Beneficio de la duda → Completado
  2. Respuesta de tienda disponible: Prevalece sobre usuario
  3. Solo respuesta de usuario: Se acepta como válida
  4. 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 procesa
  • Order: Pedido original que se actualiza
  • AppUser: Usuario para créditos y deuda
  • CreditsLogs: Registro de movimientos de créditos

Status Finales

StatusCódigoDescripciónCompensación
Completed1Pedido completadoNinguna
Unfulfilled by User4Responsabilidad del usuarioPosible deuda
Unfulfilled by Store12Responsabilidad de tiendaCréditos (si tarjeta)

Estados de Finalización

  • finished: True para todos los casos procesados
  • user_finished_view: True - Usuario no necesita más acciones
  • store_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