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-wspara 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.cssgigante 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-storagesyboto3) 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
CACHESen 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)
-
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.
- Conectar definitivamente Supabase (DB + Storage) mediante el
-
Fase 2: Refactorización Frontend (HDA)
- Instalar HTMX y configurarlo en
base.html. - Instalar
django-widget-tweakspara refactorizar los formularios. - Migrar el flujo de WebSockets en JS nativo hacia la extensión
htmx-ws.
- Instalar HTMX y configurarlo en
-
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.