|
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
# 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.
|