Saltar a contenido

6. Automatización y tareas asíncronas

6.1. Servicios Celery + Beat

/etc/systemd/system/tienda-celery.service:

[Unit]
Description=Tienda ERP Celery Worker
After=network.target redis-server.service

[Service]
User=tienda
Group=tienda
WorkingDirectory=/opt/tienda
EnvironmentFile=/opt/tienda/.env
ExecStart=/opt/tienda/.venv/bin/celery -A tienda worker \
    --loglevel=info --concurrency=4 --max-tasks-per-child=200
Restart=on-failure

[Install]
WantedBy=multi-user.target

/etc/systemd/system/tienda-celerybeat.service:

[Unit]
Description=Tienda ERP Celery Beat
After=network.target redis-server.service

[Service]
User=tienda
Group=tienda
WorkingDirectory=/opt/tienda
EnvironmentFile=/opt/tienda/.env
ExecStart=/opt/tienda/.venv/bin/celery -A tienda beat \
    --loglevel=info --scheduler django_celery_beat.schedulers:DatabaseScheduler
Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now tienda-celery tienda-celerybeat

6.2. Tareas periódicas críticas

Configurar desde admin Django (/admin/django_celery_beat/periodictask/) o en código:

Tarea Frecuencia Propósito
accounting.tasks.ecf_check_pending cada 5 min Reenvía e-CF en estado EN_COLA
accounting.tasks.ecf_retry_failed cada 15 min Reintenta los ERROR/RECHAZADO con backoff
accounting.tasks.ecf_poll_trackids cada 10 min Consulta estado de los ENVIADO/EN_PROCESO
accounting.tasks.acr_check_deadline diario 08:00 Detecta facturas próximas al límite de ACR (24 h)
accounting.tasks.cert_expiry_alert diario 09:00 Alerta si certificado vence en <60 días
accounting.tasks.padron_refresh semanal domingo 03:00 Actualiza tabla PadronDGII
accounting.tasks.exportar_reportes_dgii_mensual día 1 09:00 Genera 606/607/608/IT-1 mensuales
inventory.tasks.expirar_reservas_stock cada 5 min Libera StockReservation expiradas (TTL 30min)

6.3. Contingencia

accounting/contingencia.py:

  • health_check_dgii() → ping cada N minutos
  • marcar_factura_contingencia(invoice) → asigna estado REGISTRADO_EN_CONTINGENCIA
  • regularizar_factura(invoice) → reintento cuando DGII se recupera
  • Comando: python manage.py ecf_contingencia_status

Buena práctica: integrar alertas a Slack/Telegram/email cuando >5 facturas queden en contingencia.