3.1 KiB
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.PROTECTpara 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@propertydel 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.