DOCS: agregar informe de auditoria de codigo y deuda tecnica

This commit is contained in:
Nachou-u
2026-09-09 08:23:20 -03:00
parent 06edac1275
commit 1417cff823
4 changed files with 40 additions and 0 deletions
+1
View File
@@ -226,3 +226,4 @@ Los mensajes de commit deben estar en español, ser descriptivos y concentrarse
- [Manual de Usuario Final](docs/MANUAL_USUARIO.md): Guía paso a paso sobre cómo utilizar el ERP, registrar gastos, el flujo de aprobación y monitorear proyectos. - [Manual de Usuario Final](docs/MANUAL_USUARIO.md): Guía paso a paso sobre cómo utilizar el ERP, registrar gastos, el flujo de aprobación y monitorear proyectos.
- [Arquitectura y Stack Tecnológico](docs/STACK_ARCHITECTURE.md): Documentación del stack técnico elegido (HTMX, Alpine, Supabase, Django Asíncrono, Celery) y la hoja de ruta de implementación. - [Arquitectura y Stack Tecnológico](docs/STACK_ARCHITECTURE.md): Documentación del stack técnico elegido (HTMX, Alpine, Supabase, Django Asíncrono, Celery) y la hoja de ruta de implementación.
- [Auditoría de Código](docs/CODE_AUDIT.md): Informe consolidado de deuda técnica, vulnerabilidades y cuellos de botella (N+1) hallados por los agentes de calidad.
+1
View File
File diff suppressed because one or more lines are too long
+37
View File
@@ -0,0 +1,37 @@
# Auditoría de Código y Mejores Prácticas
Este documento consolida los hallazgos de los agentes de validación (Calidad de Código y Mejores Prácticas Django) tras analizar el ERP.
## 🔴 Riesgos Críticos (Corregir Inmediatamente)
### 1. Peligro de Pérdida de Datos Financieros
Se están utilizando relaciones de base de datos con `on_delete=models.CASCADE` en registros críticos.
- **Riesgo**: Si se elimina un Proveedor, Django eliminará silenciosamente todas las Órdenes de Compra asociadas a él. Si se elimina el perfil de un Empleado, se borrarán todos sus registros de sueldo (`SalarySlip`) del sistema.
- **Solución**: Cambiar a `models.PROTECT` para prohibir la eliminación de entidades si tienen transacciones asociadas, o implementar un modelo de *Soft-Delete* (borrado lógico).
### 2. Cuellos de Botella (Consultas N+1)
Supabase (y las bases de datos en la nube en general) son muy sensibles a la latencia de red. El código actual realiza demasiadas consultas ocultas a la base de datos:
- **`project_list.html`**: La vista hace el trabajo correcto al usar `.annotate(total_expenses=Sum(...))` para calcular los gastos totales de un proyecto en una sola consulta. Sin embargo, **el template HTML ignora esta anotación** y llama a `{{ project.total_expenses_clp }}`, el cual es un `@property` del modelo que dispara un `.aggregate()` por cada proyecto en la pantalla. Si hay 50 proyectos, se hacen 100 consultas SQL a Supabase en lugar de 1.
- **CSV Export**: Falta hacer `select_related('vendor')`, lo que dispara consultas N+1 al exportar los gastos.
### 3. Excepciones Silenciosas (Código Traga-Errores)
En `expenses/views.py` y `expenses/forms.py` se abusa de `except Exception: pass`.
- **Riesgo**: Si falla la eliminación de un archivo en S3 o si hay un error de validación, el código falla silenciosamente. Será imposible encontrar el error porque no quedará registrado en ningún Log.
- **Solución**: Capturar excepciones específicas y utilizar el módulo `logging`.
---
## 🟡 Deuda Técnica (Refactorización)
### 1. Desorden en la Raíz del Proyecto
La carpeta raíz del proyecto tiene mucha "basura" (`seed_all.py`, `patch_models.py`, `refactor_oop.py`).
- **Solución**: Mover todos los scripts de parcheo a una carpeta temporal, y los scripts de inicialización de datos (seeds) refactorizarlos hacia Comandos de Administración de Django (`management/commands/`).
### 2. Plantillas Faltantes (Templates 404)
El módulo de Adquisiciones (`procurement/views.py`) intenta renderizar `requisition_detail.html` y `purchase_order_detail.html`, pero estos **archivos no existen**. Al navegar a esas rutas, la aplicación se caerá con un error `TemplateDoesNotExist`.
### 3. Índices de Base de Datos
Falta añadir `db_index=True` a campos de búsqueda intensiva, como la `fecha` de los Gastos o el `status` de las órdenes.
### 4. Falta de consistencia en Herencia
Algunos módulos (Nóminas y Adquisiciones) reescriben los campos `created_at` y `updated_at` manualmente en cada modelo, en lugar de heredar del `TimeStampedModel` base que ya se programó en la App de Gastos.
+1
View File
@@ -54,3 +54,4 @@ zope.interface==8.5
whitenoise==6.7.0 whitenoise==6.7.0
django-storages==2.14.2 django-storages==2.14.2
boto3==1.34.69 boto3==1.34.69
requests==2.31.0