Files

5.0 KiB

Arquitectura y Stack Tecnológico - EFINTEL ERP

Este documento detalla la arquitectura técnica elegida para el desarrollo, escalabilidad y mantenimiento del ERP de EFINTEL. La selección del stack se basa en mantener una alta velocidad de desarrollo, aprovechando las capacidades asíncronas de Python moderno y evitando la sobrecarga de mantener un frontend y backend separados (SPA).


1. Stack Backend (Core)

Framework: Django 6.1 (Modo Asíncrono)

Mantenemos Django como pilar fundamental por su ORM, su panel de administración y su sistema de autenticación integrado.

  • Asincronismo (async def): Dado que corremos sobre un servidor ASGI, utilizaremos vistas asíncronas para operaciones que requieran alta concurrencia o tiempos de espera I/O (lectura de BD masiva, llamadas a APIs externas).
  • Programación Orientada a Objetos (POO): Todas las vistas de la aplicación deben basarse en Class-Based Views (CBV) para aprovechar la herencia y los Mixins (ej. RoleRequiredMixin).

API REST: Django Ninja

Para la comunicación interna del sistema y futuras integraciones de terceros.

  • Reemplaza a Django REST Framework (DRF).
  • Tipado estricto y validación automática mediante Pydantic.
  • Soporte nativo para rutas asíncronas, lo que incrementa el rendimiento.

Tareas en Segundo Plano: Celery + Redis

Para no bloquear el hilo de ejecución principal (ej. la interfaz del usuario), delegamos las tareas pesadas:

  • Generación de reportes PDF / Excel masivos.
  • Sincronización y cálculo de planillas de sueldos.
  • Envío masivo de correos de notificación.

WebSockets: Django Channels

Para actualizaciones en tiempo real (ej. cuando otro usuario aprueba un gasto o notificaciones del sistema), respaldado por Redis.


2. Stack Frontend (El patrón HDA)

Para evitar la complejidad de construir un Single Page Application (SPA) con React o Vue, adoptaremos el patrón HDA (HTMX + Django + Alpine.js).

HTMX

  • Propósito: Realizar peticiones AJAX, filtros dinámicos, paginación y mutaciones del DOM sin escribir JavaScript.
  • WebSockets: Utilizaremos la extensión htmx-ws para inyectar fragmentos HTML directamente al DOM cuando Channels emita un evento, eliminando el parseo manual de JSON en JS.

Alpine.js

  • Propósito: Manejo del estado efímero del lado del cliente.
  • Casos de uso: Modales, menús desplegables (dropdowns), alertas (toasts), y pestañas (tabs). Sustituye por completo al código espagueti en Vanilla JS o jQuery.

Tailwind CSS (Sugerido)

  • Propósito: Sistema de diseño basado en utilidades.
  • Permite estilizar componentes directamente en los templates de Django sin mantener un archivo style.css gigante y difícil de escalar.

Formularios: django-widget-tweaks

  • Herramienta para inyectar clases CSS (como las de Tailwind o Bootstrap) directamente en los campos del formulario desde el HTML, eliminando la necesidad de scripts globales que mutan el DOM (MutationObserver).

3. Infraestructura y Despliegue

Base de Datos y Storage: Supabase

Migramos de servicios locales a servicios administrados en la nube para garantizar disponibilidad y backups automáticos.

  • PostgreSQL: Base de datos principal conectada mediante un Connection Pooler transaccional.
  • S3 Storage: Almacenamiento en la nube (vía django-storages y boto3) para evidencias, facturas y comprobantes, garantizando que el contenedor Docker sea stateless (sin estado local).

Servidor de Aplicaciones: Gunicorn + Uvicorn

  • Para producción, reemplazaremos la ejecución directa de Daphne por Gunicorn usando UvicornWorker. Esto permite levantar múltiples procesos workers que aprovechan mejor los núcleos del servidor y se reinician automáticamente si fallan.

Caché: Redis

  • Además de ser el broker de Celery y Channels, habilitaremos Redis como el backend de la variable CACHES en Django. Esto permite almacenar en memoria resultados de consultas pesadas (como los KPIs del Dashboard) reduciendo la carga sobre Supabase.

Integración Continua (CI/CD)

  • GitHub Actions: Implementación de un pipeline que ejecute pruebas automáticas, verifique la calidad del código (Linting) y construya la imagen de Docker en cada Push a la rama main.

4. Hoja de Ruta (Roadmap de Implementación)

  1. Fase 1: Estabilización de Infraestructura

    • Conectar definitivamente Supabase (DB + Storage) mediante el .env.
    • Habilitar Redis como motor de Caché en Django.
    • Cambiar el servidor de desarrollo a Gunicorn/Uvicorn para producción.
  2. Fase 2: Refactorización Frontend (HDA)

    • Instalar HTMX y configurarlo en base.html.
    • Instalar django-widget-tweaks para refactorizar los formularios.
    • Migrar el flujo de WebSockets en JS nativo hacia la extensión htmx-ws.
  3. Fase 3: Optimización Backend

    • Implementar la primera tarea en segundo plano con Celery (ej. Exportar CSV).
    • Migrar el Dashboard a vistas asíncronas (async def) para acelerar la carga de KPIs.