v1.0.0 · Auditoría técnica

Mapa completo del sistema
de Reportes Zonas Áridas

Análisis integral de los 5 módulos productivos (Venta · Caja · Cashflow · Artículos · Listas) sobre una base u120688891_chess con 33 tablas y más de 515.000 líneas de ventas en producción. Incluye mapeo de archivos, relaciones BD ↔ código, diagramas de flujo, análisis de errores, propuestas de mejora y plan de escalabilidad a un segundo nivel.

§1 🎯 Resumen ejecutivo

El sistema de reportes de Zonas Áridas es una BI casera modular construida sobre PHP 8 + MariaDB en hosting compartido (Hostinger), con frontend vanilla JS + Tabulator 6.3 + Chart.js 4.4. Está funcionando en producción, alineado al milímetro con ChessERP, y resuelve análisis de venta, gastos, tesorería, cashflow e impuestos.

Módulos productivos
5
+ 6 submódulos (caja/gastos · caja/tesorería · caja/finanzas …)
Archivos PHP/HTML/JS
~65
~1,5 MB de código fuente
Tablas en BD
33
5 prefijos · ventas · caja_* · cashflow_* · articulos_* · catalogo_*
Filas de venta cargadas
515.810
22 períodos (Ago 2024 → May 2026)
Fórmula margen verificada
100%
25,20 % SAMARELLI · 21,09 % MOLINA ✓ ChessERP
Riesgos detectados
17
3 críticos · 6 altos · 8 medios — ver §10

Fortalezas

  • Arquitectura modular bien definida: cada módulo tiene su config/database.php, api/_schema.php idempotente y sync independiente.
  • Fórmula ChessERP unificada como constantes PHP reutilizables en data_api.php y filter.php.
  • Bootstrap cross-module: venta/db_reportes.php dispara articulos_ensure_schema() para que los JOINs no fallen.
  • Schema v2 de caja con todas las tablas raw históricas + caja_audit_log + caja_cajeros denormalizado.
  • Tabulator + Chart.js eliminó ~500 KB de bundle React manteniendo todas las features (árbol, virtual scroll, bottomCalc).
  • Documentación markdown extensa y versionado semver real en cada módulo (version.php con changelog inline).

Riesgos principales

  • CRÍTICO Credenciales hardcoded en config/database.php (multiplicado en 5 archivos) — incluye API ChessERP.
  • CRÍTICO Sin autenticación: los endpoints reset_db.php, sync.php, save.php son públicos. El session_start está comentado.
  • CRÍTICO Dump SQL completo (765 MB) servido como archivo estático en /reportes/u120688891_chess.sql — descargable por cualquiera.
  • ALTO Algunas queries interpolan variables: WHERE sync_id=$sid en caja/api/save.php:63 y otros (mitigado por cast a int, pero es mala práctica).
  • ALTO 5 copias de las constantes de BD (venta · caja · cashflow · articulos · listas) — divergen ya (ej. UPLOAD_MAX_MB solo en venta).
  • ALTO caja/dashboard.jsx (~22 KB) sigue versionado en producción aunque ya no se usa (legado React).

§2 📐 Alcance del análisis

Esta auditoría cubre todo lo que vive bajo /public_html/reportes/:

Incluido

  • Mapa de archivos con tamaños y propósito.
  • Schema completo de BD (33 tablas) con FKs e índices.
  • Relaciones archivo ↔ tabla ↔ endpoint.
  • Fórmulas y cálculos clave (margen, peso, runway, aging).
  • Diagramas de flujo de los syncs.
  • Hallazgos de seguridad, performance, mantenibilidad.
  • Propuestas concretas de escalabilidad y mejoras visuales.

Fuera de alcance

  • Análisis de tráfico real / logs de Hostinger.
  • Pen-testing activo (sólo revisión estática).
  • Auditoría de los Excel de origen (formatos exactos).
  • Comparativa de TCO con SaaS BI (Metabase, Superset, Looker).
  • Reescritura del backend a frameworks (Laravel, Symfony).
  • Otros módulos del sitio (/intranet, /catalogo, /freddo).

§3 📈 Métricas del proyecto

Volumen de código por módulo

MóduloArchivosLíneas aprox.Peso totalVersión
📊 venta/13~10.500375 KBv2.4.0
🏦 caja/ (+ submódulos)27~12.000505 KBv2.0.2
💸 cashflow/8~3.200132 KBv1.1.0
📦 articulos/6~1.60068 KBs/v
🏷️ listas/6~90036 KBs/v
landing + docs3~1.10055 KB
TOTAL63 ~29.300 1,17 MB

Volumen de datos en BD (Mayo 2026)

TablaAUTO_INCREMENTTipoComentario
ventas515.811histórica22 períodos · ~23K filas/mes
caja_raw_egresos_detalle261.627histórica~12K filas/mes promedio
caja_raw_gastos_tipificados28.398histórica~600 filas/mes
caja_raw_movimiento_detalle21.765histórica~800 filas/mes
caja_raw_movimiento_resumido8.508histórica~400 filas/mes
caja_raw_egresos_caja11.070histórica~500 filas/mes
caja_gastos (derivada)5.804derivadalínea de gasto clasificada
caja_cajeros15.339denormalizaciónmapa empresa·caja·cajero
caja_audit_log1.217auditoríalogs de cada sync
cashflow_cheques_cartera2.448snapshot~3 cortes
cashflow_cartera_clientes801snapshot
cashflow_extractos_bancarios1.744snapshot
cashflow_cartera_proveedores118snapshot
articulos_raw~7.870catálogoPK codigo
articulos_precios~7.870catálogo22 columnas lista_N
clientes_raw~3.000catálogoJSON datos_raw validado
sincronizaciones33control22 completadas

📊 Dump SQL en producción El archivo u120688891_chess.sql pesa 765 MB (volcado completo con datos). Sirve como respaldo manual pero no debe quedar accesible en el doc root (riesgo de exfiltración total). Ver §10 hallazgo SEC-03.

§4 🧩 Mapa de módulos

Cada tarjeta linkea a la sección detallada con flujos, fórmulas, BD y mejoras.

Dependencias cross-module

                        ┌──────────────────────────┐
                        │   u120688891_chess (BD)  │
                        └────────────┬─────────────┘
                                     │
       ┌───────────┬──────────┬──────┴──────┬──────────┬────────────┐
       ▼           ▼          ▼             ▼          ▼            ▼
  ┌────────┐  ┌────────┐  ┌────────┐  ┌──────────┐ ┌─────────┐ ┌──────────┐
  │ VENTA  │  │  CAJA  │  │CASHFLOW│  │ARTICULOS │ │ LISTAS  │ │  Hub /   │
  │        │  │ (hub)  │  │        │  │ catálogo │ │ precios │ │ landing  │
  └───┬────┘  └───┬────┘  └───┬────┘  └────┬─────┘ └────┬────┘ └─────┬────┘
      │           │           │            │            │            │
      │           │           │            │            │            │
      ▼ JOIN articulos_raw ───┘            │            │            │
      │                                    │            │            │
      ▼ db_reportes.php → articulos_ensure_schema() ◄───┘            │
      │                                                              │
      ▼ filter.php / dashboard.php                                   │
                                                                     │
  CAJA   ──► cashflow lee caja_raw_egresos_caja (saldo de caja) ─────┤
  CAJA   ──► finanzas lee ventas (cruce rentabilidad)                │
  CASHFLOW ► lee ventas (cruce comercial 6 meses)                    │
                                                                     │
  landing (/reportes/index.php) ── usa stats de los 3 grandes ───────┘

§5 ⚠️ Hallazgos prioritarios

Top issues que valen la pena resolver primero. Detalle completo en §10 Análisis de errores.

IDCategoríaHallazgoImpactoEsfuerzoPrioridad
SEC-01 Seguridad Endpoints reset_db.php, sync.php, save*.php sin auth. El session_start() está comentado. Cualquiera con la URL puede borrar la base. 2–4 h Crítico
SEC-02 Seguridad Credenciales DB + API ChessERP hardcoded en 5 config/database.php. Si se publica el repo o se filtra un archivo, expone todo. 3 h Crítico
SEC-03 Seguridad u120688891_chess.sql (765 MB con datos) accesible desde la web. Exfiltración total de la BD vía HTTP GET. 15 min Crítico
SEC-04 Seguridad Algunas queries con interpolación de variables: WHERE sync_id=$sid. Bajo (var casteada a int) pero mala práctica. 2 h Alto
ARQ-01 Arquitectura Las constantes de BD se redefinen en 5 archivos. DB_HOST, DB_NAME, etc. Riesgo de divergencia / errores duplicados al rotar password. 3 h Alto
ARQ-02 Arquitectura caja/dashboard.jsx (22 KB) legado React quedó en producción. Confusión + riesgo de servir un archivo obsoleto. 30 min Alto
ARQ-03 Arquitectura Mapeo CAJERO_PROV hardcoded en JS, duplicado entre sync.php y sync_bulk.php. Cada cajero nuevo requiere editar 2 archivos. 4 h Medio
PERF-01 Performance Landing /reportes/index.php hace N+1 queries: 12 prepares secuenciales para totales por mes de caja. ~12 round-trips innecesarios cada hit a la landing. 1 h Medio
PERF-02 Performance Falta índice compuesto (sync_id, anulado) en ventas. Cada query del dashboard escanea por sync_id y luego filtra anulado='NO'. 30 min Medio
PERF-03 Performance JOIN CAST(idArticulo AS UNSIGNED) en cada query del dashboard inhibe uso de índice en articulos_raw.codigo. Aceptable hoy (~7K SKUs) pero degradará con escala. 2 h Medio
UX-01 UX No hay empty state consistente en dashboards. Cuando un período está vacío se ve "0,00" en vez de mensaje. Confusión del usuario. 4 h Medio
DOC-01 Docs Algunas funciones de data_api.php no tienen docstring (50+ funciones). Onboarding lento de nuevos devs. 6 h Bajo

§6 🚀 Roadmap propuesto al segundo nivel

Plan en 4 fases ordenadas por impacto y dependencias. Detalle completo en §11 y §12.

Fase 0 — Hardening (1–2 semanas)

🔒 Bloqueante de cualquier crecimiento
  • Implementar auth (session + roles) en todos los endpoints administrativos.
  • Mover credenciales a .env + un db_shared.php único en /reportes/_shared/.
  • Mover el dump SQL fuera del doc root o bloquear con .htaccess.
  • Reemplazar interpolaciones $sid por prepared statements (aunque casteado).
  • Eliminar dashboard.jsx obsoleto.
  • Crear robots.txt y .htaccess con bloqueo de *.sql, *.md, *.bak, config/.

Fase 1 — Refactor de plataforma compartida (3–4 semanas)

🏗️ Reducir duplicación y preparar escala
  • Crear paquete /reportes/_shared/: PDO singleton, logger, helpers de formato, validators.
  • Migrar los 5 config/database.php a un único cargador.
  • Extraer CAJERO_PROV a tabla DB editable desde UI (admin).
  • Estandarizar respuesta de APIs: envelope {ok, data, meta, error}.
  • Crear contratos JSON Schema para cada endpoint (autodocumentación).
  • Añadir composer.json mínimo si crece la cantidad de helpers.

Fase 2 — Capa BI estable (4–6 semanas)

📊 Profesionalización del análisis
  • Vistas materializadas (caja_gastos_mensual, ventas_mensual_supervisor) con refresh nocturno.
  • Cron job para syncs automáticos: cron daily 03:00 → /reportes/venta/sync_api_cron.php?mes=….
  • Cache HTTP (ETag + Last-Modified) en endpoints JSON pesados.
  • Exportación a Excel/CSV con descargas firmadas (token + expiración).
  • Dashboard multi-período comparativo (overlay de 2 meses lado a lado).
  • Drill-down universal: clic en cualquier KPI → tabla detallada filtrada.

Fase 3 — Inteligencia y proyecciones (6–8 semanas)

🤖 Valor agregado real
  • Forecast de cashflow a 30/60/90d con regresión sobre estacionalidad por rubro.
  • Alertas activas: enviar email/WhatsApp cuando "saldo proyectado < X" o "margen mes baja > Y%".
  • Detección de anomalías en gastos (z-score sobre media histórica por rubro × provincia).
  • Recomendador de límite de crédito por cliente (basado en histórico de cobranza + cheques rechazados).
  • Reporte ejecutivo PDF mensual generado automáticamente.
  • API pública (read-only) con tokens para integraciones futuras (Power BI, Looker, etc).

Esfuerzo total estimado: 14–20 semanas-persona. ROI esperado: reducción del 70% en horas mensuales dedicadas a consolidar reportes manualmente + detección temprana de problemas de cobranza/margen.