Cheaf Docs
Orders/Order Unfulfilled

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.

Nota: El nombre del comando no es completamente descriptivo. Una denominación más precisa sería create_unfulfilled_order, ya que su función principal es crear registros de pedidos no completados y gestionar las notificaciones correspondientes.

¿Cuándo se ejecuta?

Este comando se ejecuta automáticamente cada 15 minutos durante todo el día a través de un cron job. En cada ejecución evalúa si alguna tienda ha cerrado y si existen pedidos que quedaron en estado "solicitado" pero que ya no pueden ser completados debido a que el tiempo de recolección ha expirado.

Lógica de Evaluación Temporal

  • Revisa todas las zonas horarias donde operan los restaurantes
  • Compara la hora actual con los horarios de cierre configurados para cada tienda
  • Identifica pedidos que superaron el tiempo límite según el horario collect_before de cada restaurante

Funcionalidad Principal

1. Identificación de Pedidos No Completados

Proceso de Búsqueda:

  • Busca todos los pedidos en estado "solicitado" (STATUS_REQUESTED)
  • Aplica filtro temporal: after_recollection_time() por zona horaria
  • Considera todas las zonas horarias únicas de las ciudades donde opera la plataforma

Lógica de Filtrado Temporal: Por cada pedido encontrado, se valida:

Condición 1: Verificación de Horario de Cierre

  • Obtiene el día de la semana actual en la zona horaria del restaurante
  • Busca los horarios configurados (StoreHours) para ese día específico
  • Extrae la hora de local_timezone_collect_before

Condición 2: Comparación Temporal

  • Convierte la fecha de creación del pedido a la zona horaria local del restaurante
  • Compara order.created_at vs collect_before del mismo día
  • Regla de Inclusión: Solo se procesan pedidos donde created_at < collect_before

Ejemplo Práctico:

Pedido creado: 14:30 (zona horaria restaurante)
Horario collect_before: 15:00 (zona horaria restaurante)
Resultado: Se procesa (creado antes del límite)

Pedido creado: 15:30 (zona horaria restaurante)  
Horario collect_before: 15:00 (zona horaria restaurante)
Resultado: NO se procesa (creado después del límite)

Manejo de Errores:

  • Si no se encuentran horarios configurados para un día, se registra error y se omite el pedido
  • Errores de conversión de zona horaria se registran pero no detienen el proceso

2. Gestión por Tipo de Restaurante

Restaurantes Regulares

Condiciones de Evaluación:

  • Se verifica si el pedido fue completado por la tienda (order.completed_by_store)

Reglas de Negocio:

Caso 1: Pedido YA completado por la tienda

  • Status del pedido: 14 (Review)
  • Status UnfulfilledOrder: 14 (Review)
  • store_answer: "0" (indica que fue entregado)
  • Resultado: Se considera pedido completado, no requiere gestión adicional

Caso 2: Pedido NO completado por la tienda

  • Status del pedido: 9 (Unfulfilled)
  • Status UnfulfilledOrder: 9 (Unfulfilled)
  • store_answer: null (sin respuesta de la tienda)
  • Resultado: Requiere gestión manual, se envían notificaciones

Proceso Adicional:

  • Se evalúa si es el primer pedido no completado del usuario (is_first_unfulfilled())
  • Se regeneran códigos de barras para promociones
  • Solo se notifica al restaurante si store_answer es null

Restaurantes con Integración Deliverect

Condiciones Previas:

  • Debe tener deliverect_channel_id configurado
  • Debe tener use_deliverect_integration = True
  • Si no cumple estas condiciones, no se procesa

Reglas de Negocio:

Caso 1: Pedido completado por la tienda

  • Status del pedido: 1 (Completed)
  • Status UnfulfilledOrder: 1 (Completed)
  • store_answer: "0" (entregado)
  • Estados de finalización: finished=True, user_finished_view=True, store_finished_view=True

Caso 2: Pedido no completado por la tienda

  • Status del pedido: 4 (Unfulfilled by user)
  • Status UnfulfilledOrder: 4 (Unfulfilled by user)
  • store_answer: null
  • Estados de finalización: finished=True, user_finished_view=True, store_finished_view=True

Características Especiales:

  • Todos los registros se marcan como finalizados automáticamente
  • No requieren gestión manual posterior
  • No se envían notificaciones a restaurantes

Cuentas Corporativas (Cencosud/Falabella)

Condiciones de Identificación:

  • restaurant_name.is_cencosud_account = True OR
  • restaurant_name.is_falabella_account = True

Filosofía de Negocio:

La regla toma en cuenta únicamente la respuesta del partner. Si el pedido fue completado por el partner (ya sea por encuesta o por paso en caja), significa que fue entregado y se completa automáticamente sin dar opción al usuario de responder encuesta.

Reglas de Negocio:

Caso 1: Pedido completado por el partner

  • Status del pedido: 1 (Completed)
  • Status UnfulfilledOrder: 1 (Completed)
  • store_answer: "0" (confirmado como entregado)
  • user_answer: null (no se solicita respuesta del usuario)
  • Estados: finished=True, user_finished_view=True, store_finished_view=True
  • Resultado: Pedido automáticamente completado

Caso 2: Pedido NO completado por el partner

  • Status del pedido: 9 (Unfulfilled)
  • Status UnfulfilledOrder: 9 (Unfulfilled)
  • store_answer: null (sin confirmación del partner)
  • user_answer: null (pendiente de respuesta)
  • Estados: finished=False, user_finished_view=False, store_finished_view=False
  • Resultado: Requiere gestión manual, encuesta activa para ambos (partner y usuario)

Priorización:

  • La respuesta del partner prevalece sobre cualquier acción del usuario
  • Solo si el partner NO confirma, se permite la gestión bilateral

3. Sistema de Notificaciones

Para Usuarios Finales

  • Envía notificación push informando que el pedido no fue completado
  • Permite al usuario reportar qué ocurrió con su pedido

Para Restaurantes

  • Notifica a los administradores del restaurante sobre pedidos pendientes de resolver
  • Mensaje: "⚠️Tienes pedidos pendientes por resolver⚠️"
  • Solo se envía si hay pedidos que requieren atención manual

4. Regeneración de Códigos de Barras

Solo para Restaurantes Regulares:

  • Cuando se crea un registro UnfulfilledOrder, se ejecuta regenerate_barcodes_promotion()
  • Este proceso regenera los códigos de barras de las promociones asociadas al pedido
  • Garantiza que las promociones mantengan códigos únicos válidos para el seguimiento

Status de Pedidos

StatusCódigoDescripciónUso
Completed1Pedido completado exitosamenteDeliverect y Cencosud confirmados
Unfulfilled by User4No completado por parte del usuarioDeliverect sin confirmación
Unfulfilled9Pedido no completado, requiere gestiónRestaurantes regulares y Cencosud
Review14En revisión, considerado completadoRestaurantes regulares confirmados

Estados del UnfulfilledOrder

  • finished: Indica si el caso está cerrado
  • user_finished_view: Si el usuario completó su parte del proceso
  • store_finished_view: Si la tienda completó su parte del proceso
  • is_first_order: Identifica si es el primer pedido no completado del usuario
  • store_answer: Respuesta de la tienda (0 = entregado, null = sin respuesta)
  • user_answer: Respuesta del usuario sobre qué ocurrió

Configuraciones por Zona Horaria

El sistema utiliza el modelo Cities para identificar las diferentes zonas horarias y aplicar la lógica de cierre correspondiente a cada región operativa.