Volver a la arquitectura

Tareas automáticas

Procesamiento en segundo plano

Celery, con Redis como cola. Hoy existen exactamente 2 tareas, ambas encoladas bajo demanda (nunca programadas): no hay Celery Beat ni ninguna tarea que corra "cada noche" o "cada hora".

¿Qué es?

Celery es una cola de tareas distribuida. El backend encola los trabajos en Redis y un worker (proceso Python aparte, contenedor leon-celery) los ejecuta sin bloquear la respuesta al usuario.

Las 2 tareas reales

emitir_comprobante_sunat(comprobante_id): se dispara al registrar un comprobante. Construye un JSON tipo UBL, y hoy simula el envío/aceptación de SUNAT (crea eventos generado→enviado→aceptado con datos de relleno) — es un stub declarado en el propio código, sin integración real. Ver Servicios externos.
procesar_imagen(render_id): se dispara al subir una foto de producto. Esta sí es real: abre la imagen con Pillow, la redimensiona si hace falta y la convierte a WebP calidad 80, sobrescribiendo el render.

Lo que NO existe

Sin Celery Beat ni ninguna tarea periódica/programada (nada "cada noche", "cada hora" o con cron).
Sin notificaciones al cliente (correo/SMS de confirmación de pedido o envío) en segundo plano — la única notificación por correo del sistema es el aviso de cuenta aprobada en Equipo, y es síncrona, no una tarea de Celery.
Sin generación de PDF, sin sincronización de stock con sistemas externos, sin reintento de webhooks (no hay webhooks entrantes que atender).
Sin Flower, Sentry ni APScheduler instalados — no están en requirements.txt.

Limitaciones y restricciones

Reintentos: ambas tareas usan max_retries=3, default_retry_delay=30 — si fallan, reintentan hasta 3 veces cada 30s.
Sin panel de monitoreo de colas: para ver el estado de una tarea hay que mirar los logs del contenedor leon-celery, no hay un dashboard tipo Flower.
Tiempo límite: CELERY_TASK_TIME_LIMIT=600 (10 min) global, por si alguna tarea se cuelga.

Propósito del componente

Que subir una foto o registrar un comprobante no obligue al usuario a esperar a que termine el procesado pesado (conversión de imagen) o simulado (SUNAT).

Stack

Celery 5.5 Redis (broker + result backend) Pillow (procesar_imagen)

El detalle de qué hace cada tarea al implementar SUNAT de verdad está pendiente — hoy es, deliberadamente, un simulacro. Ver Servicios externos para el detalle completo de esa limitación.