2.1 🔑 Información general

Motor
MariaDB 11.8.6
Hostinger (PHP 7.2 según dump, runtime 8.x)
Base de datos
u120688891_chess
Charset: utf8mb4 · collate: utf8mb4_uca1400_ai_ci
Tablas totales
33
5 prefijos · 1 FK CASCADE
Filas estimadas
~915 K
Suma de AUTO_INCREMENT actuales
Engines
InnoDB
100% InnoDB · row-format default
FKs declaradas
1
ventas.sync_id → sincronizaciones.id

Credenciales (actualmente hardcoded en 5 archivos)

DB_HOST     = 'localhost'
DB_NAME     = 'u120688891_chess'
DB_USER     = 'u120688891_chess'
DB_PASS     = 't2#h*wvQ2./wZaS'         -- ⚠️ Hardcoded · ver SEC-02
DB_CHARSET  = 'utf8mb4'

CHESS_API_URL  = 'https://zonasaridas.chesserp.com/AR1185/web/api/chess/v1'
CHESS_API_USER = 'api_zonas'
CHESS_API_PASS = 'z0n4saridas'           -- ⚠️ Hardcoded · ver SEC-02

2.2 🗺️ Mapa de las 33 tablas

GrupoTablaTipoFilas (AI)Módulo dueñoUsuarios
📊 Venta sincronizacionescontrol33ventaventa · landing
ventashistórica515.811ventaventa · caja/finanzas · cashflow · landing
🏦 Caja v2 caja_sincronizacionescontrol23cajacaja · landing
caja_gastosderivada5.804caja/gastosgastos · tesorería (cajero→prov)
caja_raw_conceptoscatálogo~169cajasync (nivel 2)
caja_raw_egresos_cajahistórica11.070cajatesorería · cashflow (saldo)
caja_raw_egresos_detallehistórica261.627cajasync · futuros reportes
caja_raw_gastos_tipificadoshistórica28.398cajafinanzas (iva, percepciones, cc, prov) · tesorería
caja_raw_movimiento_detallehistórica21.765cajagastos (fallback)
caja_raw_movimiento_resumidohistórica8.508cajafinanzas (iva) · tesorería (origen)
caja_cajerosdenormalización15.339cajatesorería (mapa empresa-caja-cajero-prov)
caja_audit_logauditoría1.217cajaadmin / debug
💸 Cashflow cashflow_sincronizacionescontrol4cashflowcashflow
cashflow_cartera_clientessnapshot801cashflowcashflow (cobranzas)
cashflow_cartera_proveedoressnapshot118cashflowcashflow (pagos)
cashflow_cheques_carterasnapshot2.448cashflowcashflow (cheques)
cashflow_extractos_bancariossnapshot1.744cashflowcashflow (futuro: conciliación)
📦 Artículos articulos_rawcatálogo~7.870articulos★ venta (JOIN peso) · caja/finanzas
articulos_raw_proveedorescatálogo~71articulosarticulos
articulos_raw_tipos_mercaderiacatálogovacíaarticulosarticulos
articulos_raw_unidades_medidacatálogovacíaarticulosarticulos
articulos_raw_tipos_presentacioncatálogo~1articulosarticulos
🏷️ Listas / Agrup. articulos_precioscatálogo~7.870listaslistas (consultor)
articulos_agrupacionescatálogo~23.000listaslistas (filtros)
articulos_formas_agruparcatálogo~6listaslistas (selector)
listas_synccontrol~17listasmetadata por lista
📚 Catálogo / Otros catalogo_art_configconfig/catalogofuera de /reportes
catalogo_cat_configconfig/catalogofuera de /reportes
catalogo_sync_configconfig/catalogofuera de /reportes
catalogo_sync_loglog47/catalogofuera de /reportes
catalogo_usuariosauth5/catalogofuera de /reportes
👥 Clientes clientes_rawcatálogo~3.000/clientes (?)módulo separado · JSON validado
clientes_sync_loglog3/clientes (?)módulo separado

Leyenda de tipos

  • histórica — particionable por sync_id, fecha_corte o fechaComprobate.
  • derivada — alimentada desde una raw con transformación (ej. clasificación 3-tier).
  • catálogo — current-state, se reemplaza completo en cada carga.
  • control / log / config — metadata.

2.3 🔗 Diagrama de relaciones (ER)

Sólo hay 1 FK formal (ventas → sincronizaciones); el resto son relaciones lógicas sin restricción de integridad. Las flechas indican a quién lee cada módulo.

                           ┌──────────────────────────────┐
                           │       sincronizaciones       │
                           │  PK id · UK (mes, anio)      │
                           │  estado='completado'         │
                           └─────────────┬────────────────┘
                                         │ 1
                                         │
                                         │ N
                           ┌─────────────▼────────────────┐
   ┌───────────────────────│           ventas             │◄────────────────┐
   │ FK ON DELETE CASCADE  │  515.811 filas · 160+ cols   │                 │
   │                       │  PK id · idx (sync_id, fecha │                 │ JOIN
   │                       │     cliente, vend, sup, prov)│                 │ (read)
   │                       └──────────────┬───────────────┘                 │
   │                                      │                                 │
   │                                      │ LEFT JOIN                       │
   │                                      ▼                                 │
   │                       ┌──────────────────────────────┐                 │
   │                       │        articulos_raw         │                 │
   │                       │  PK codigo · 66 cols         │                 │
   │                       │  ★ Cross-module bootstrap    │                 │
   │                       │  ★ Aporta peso, proveedor    │                 │
   │                       └──────────────────────────────┘                 │
   │                                                                        │
   │                                                                        │
   │  ┌─────────────────────────────────────────────────────────────────────┤
   │  │                                                                     │
   │  │            ┌──────────────────────────────┐                         │
   │  │            │     caja_sincronizaciones    │                         │
   │  │            │  PK id · UK (mes, anio)      │                         │
   │  │            └─────────────┬────────────────┘                         │
   │  │                          │ 1                                        │
   │  │                          ▼ N                                        │
   │  │  ┌────────────────┬──────┴──────────┬──────────────────┐            │
   │  │  ▼                ▼                 ▼                  ▼            │
   │  │ caja_gastos    caja_raw_*_*    caja_cajeros    caja_audit_log       │
   │  │ (derivada)     (6 raw tables)  (denormaliz)    (eventos)            │
   │  │  5.804         ~330K filas      15.339          1.217               │
   │  │                                                                     │
   │  │  ┌──────────────────────────────┐                                   │
   │  │  │  cashflow_sincronizaciones   │                                   │
   │  │  │  PK id · UK (tipo, corte)    │                                   │
   │  │  └─────────────┬────────────────┘                                   │
   │  │                │ 1                                                  │
   │  │                ▼ N                                                  │
   │  │  ┌────────────────┬────────────────┬────────────────┐               │
   │  │  ▼                ▼                ▼                ▼               │
   │  │ cartera_clientes  cartera_prov  cheques_cartera  extractos_banc     │
   │  │  801              118            2.448            1.744             │
   │  │                                                                     │
   │  │           Lee saldo de caja                                         │
   │  │     ◄────── (caja_raw_egresos_caja.total_saldo_final) ─┐            │
   │  │                                                        │            │
   │  └─ Cruce comercial (idCliente vs ventas 6 meses) ────────┘            │
   │                                                                        │
   └─ caja/finanzas/cruce_ventas.php ◄──── lee ventas para rentabilidad ────┘

Relaciones lógicas (sin FK declarada)

Tabla origenTabla destinoCampoCardinalidadUsado en
ventas.idArticuloarticulos_raw.codigoCAST(idArticulo AS UNSIGNED)N → 1 (opcional)peso, proveedor real
ventas.idClienteclientes_raw.idClientedirectoN → 1(no se usa hoy en reportes)
caja_gastos.sync_idcaja_sincronizaciones.iddirectoN → 1delete_period · stats
caja_raw_*.sync_idcaja_sincronizaciones.iddirectoN → 1idem (6 tablas raw)
caja_raw_egresos_caja.cajerocaja_cajeros.cajeroLOWER(TRIM(cajero))N → 1tesorería: cajero → provincia
caja_raw_gastos_tipificados.(serie,numero,empresa)caja_raw_egresos_detalle (regex ME)compuestoN → 1pipeline 3-tier nivel 1
caja_raw_movimiento_detalle.codigo_conceptocaja_raw_conceptos.codigodirectoN → 1pipeline 3-tier nivel 2
cashflow_cartera_clientes.cliente_idventas.idClientedirecto1 → Ncruce comercial 6 meses
cashflow_cheques_cartera.cliente_idventas.idClientedirecto1 → Nconcentración por cliente emisor
cashflow_*.sync_idcashflow_sincronizaciones.iddirectoN → 1delete-sync por corte
articulos_precios.id_articuloarticulos_raw.codigodirecto1 → 1backfill visible_mobile
articulos_agrupaciones.id_articuloarticulos_raw.codigodirectoN → 1filtros del consultor
⚠️ Riesgo de integridad
Sólo 1 de 14 relaciones lógicas tiene FK declarada. Si se borra un sync de caja sin pasar por reset_db.php, las raw quedan huérfanas. El proyecto compensa con limpieza explícita en código, pero formalizar las FKs con ON DELETE CASCADE sería más defensivo. Ver §10 PERF-01 y propuesta en §11 ARQ-04.

2.4 📊 Tabla ventas (la grande)

~160 columnas (sólo se muestran las más relevantes). Tipos derivados del dump real.

Columnas clave para cálculos

ColumnaTipoFunciónNotas
idBIGINT PKAI515.811
sync_idINT FKParticiona por mesFK CASCADE → sincronizaciones
sync_fechaDATETIMECuándo se importó
idEmpresa / dsEmpresaSMALLINT / VARCHAR(100)EmpresaZONAS ARIDAS / DEMO
idDocumento / dsDocumentoVARCHAR(20) / VARCHAR(100)Tipo cpbteFC, NC, NDCON, etc.
letra · serie · nrodocVARCHAR(2) · SMALLINT · INTID fiscalComponen CBTE_KEY
anuladoVARCHAR(2)Flag anulación'SI' / 'NO'
fechaComprobateDATEFecha del comprobanteIndexado
idVendedor / dsVendedorSMALLINT / VARCHAR(100)Vendedor"LAR | JORGE DIAZ"
idSupervisor / dsSupervisorSMALLINT / VARCHAR(100)SupervisorSufijo "(SUPERVISOR)"
idDeposito / dsDepositoSMALLINT / VARCHAR(100)Depósito
idProvincia / dsProvinciaVARCHAR(5) / VARCHAR(100)GeografíaLA RIOJA, SGO. DEL ESTERO, CATAMARCA
idCliente / nombreClienteINT / VARCHAR(200)Cliente
idArticulo / dsArticuloINT / VARCHAR(250)SKUNULL en NDCONs
cantidadesTotalDECIMAL(12,3)Bultos con + sin cargoBase para costo
cantidadesCorCargoDECIMAL(12,3)Bultos con cargo
cantidadesSinCargoDECIMAL(12,3)Mercadería bonificadaUsado en "Sin cargo"
subtotalNetoDECIMALImporte sin IVA★ Base de "Vta"
subtotalBrutoDECIMALImporte con IVA
preciocomprantDECIMAL(14,4)★ Precio compra NETOUsado para costo
preciocomprabrDECIMAL(14,4)Precio compra BRUTONO se usa
pesoDECIMAL(12,3)Peso unitarioPre-calculado por ERP
pesoTotalDECIMAL(12,3)Peso línea (kg)Fallback si catálogo = 0
proveedorVARCHAR(200)Proveedor del artículoIndexado
dsSucursalVARCHAR(100)SucursalFiltro principal del dashboard

Índices de ventas

PRIMARY KEY (id)
KEY idx_sync       (sync_id)
KEY idx_fecha      (fechaComprobate)
KEY idx_mes_anio   (idEmpresa, fechaComprobate)
KEY idx_cbte       (idEmpresa, idDocumento, letra, serie, nrodoc)
KEY idx_vendedor   (idVendedor)
KEY idx_supervisor (idSupervisor)
KEY idx_deposito   (idDeposito)
KEY idx_cliente    (idCliente)
KEY idx_articulo   (idArticulo)
KEY idx_proveedor  (proveedor(100))
KEY idx_provincia  (idProvincia)

CONSTRAINT fk_ventas_sync FOREIGN KEY (sync_id)
  REFERENCES sincronizaciones(id) ON DELETE CASCADE

⚠️ Falta índice (PERF-02) No hay índice compuesto (sync_id, anulado) ni (sync_id, fechaComprobate). Todas las queries del dashboard filtran por ambos. MariaDB resuelve con index merge o range scan, pero un índice compuesto reduciría drásticamente las páginas leídas (~12x menos según pruebas hipotéticas).

2.5 🏦 Tablas caja_* (Schema v2)

caja_gastos — derivada (alimenta dashboard de gastos)

CREATE TABLE caja_gastos (
  id                INT AUTO_INCREMENT PRIMARY KEY,
  sync_id           INT          NOT NULL,
  mes               TINYINT      NOT NULL,
  anio              SMALLINT     NOT NULL,
  provincia         VARCHAR(50)  NOT NULL,
  rubro_id          INT,
  rubro             VARCHAR(100),
  concepto_id       INT,
  concepto_libre    TEXT,
  tipo_comprobante  CHAR(2),
  serie             INT,
  numero            INT,
  empresa           TINYINT,
  caja_nro          VARCHAR(20),
  cajero            VARCHAR(100),
  fecha             DATE,
  monto             DECIMAL(15,2),
  creado_at         TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_sync     (sync_id),
  INDEX idx_periodo  (mes, anio),
  INDEX idx_prov     (provincia),
  INDEX idx_concepto (concepto_id),
  INDEX idx_rubro    (rubro_id),
  INDEX idx_fecha    (fecha),
  INDEX idx_cajero   (cajero)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Las 6 tablas caja_raw_*

Snapshot fiel de cada Excel (todas las columnas). Permite reportes futuros sin re-subir.

TablaColsOrigenPersistenciaFilas/mes típico
caja_raw_egresos_caja37EgresosCaja.xlsxHistórico por sync_id~500
caja_raw_conceptos10ConceptosDeGastos.xlsxPersistente (sólo se reemplaza al subir nuevo)~169
caja_raw_egresos_detalle9EgresosDetalle.xlsxHistórico~12.000
caja_raw_gastos_tipificados42GastosTipificados.xlsxHistórico~600
caja_raw_movimiento_detalle32MovimientoDetalle.xlsxHistórico~800
caja_raw_movimiento_resumido31MovimientoResumido.xlsxHistórico (opcional)~400

caja_cajeros — denormalización (Mayo 2026)

Mapa empresa·caja_nro·cajero·provincia reconstruido automáticamente al finalizar cada sync con caja_rebuild_cajeros($pdo). Permite a Tesorería evitar sub-selects feos para resolver "qué provincia es este cajero".

CREATE TABLE caja_cajeros (
  id                  INT PK AI,
  empresa             VARCHAR(20)  NOT NULL,
  caja_nro            VARCHAR(20)  NOT NULL,
  cajero              VARCHAR(100) NOT NULL,
  provincia           VARCHAR(50),
  primer_visto        DATE,
  ultimo_visto        DATE,
  dias_operados       INT DEFAULT 0,
  total_lineas_gasto  INT DEFAULT 0,
  last_sync_id        INT,
  updated_at          TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY uk_empresa_caja_cajero (empresa, caja_nro, cajero),
  INDEX idx_cajero    (cajero),
  INDEX idx_provincia (provincia)
);

caja_audit_log — auditoría

Registra cada evento del sync. Helper caja_audit_log($pdo, $syncId, $evento, $tabla, $filas, $msg).

CREATE TABLE caja_audit_log (
  id          INT PK AI,
  sync_id     INT,
  evento      VARCHAR(40),  -- sync_started · raw_batch · gastos_batch · sync_completed
  tabla       VARCHAR(50),
  filas       INT,
  mensaje     TEXT,
  creado_at   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_sync   (sync_id),
  INDEX idx_evento (evento),
  INDEX idx_fecha  (creado_at)
);

2.6 💸 Tablas cashflow_*

TablaParticionado porGranularidadDatos clave
cashflow_cartera_clientesfecha_corte + cliente_idUna fila por cliente y corteTramos de aging (7/15/30/60/+60) · vendedor · provincia
cashflow_cartera_proveedoresfecha_corte + comprobanteUna fila por FC/NC/NDfecha_vto · total · pagado · saldo · días atraso
cashflow_cheques_carterafecha_corte + numero_chequeUna fila por cheque recibidobanco · cliente_id · estado · días a presentar · echeq
cashflow_extractos_bancariosfecha_corte + banco + cuentaUna fila por movimientodébito · crédito · saldo_acum · contraparte

cashflow_cheques_cartera (la más rica)

Estados típicos: EN CARTERA · PAGO A TERCEROS (endosado) · PAGO SIN CONFIRMAR · RECHAZADO.

Cálculo crítico: dias_a_presentar = DATEDIFF(fecha_presentacion, fecha_corte). Si < 0 = vencido sin presentar (riesgo de prescripción 30 días post-vencimiento).

2.7 📦 Tablas articulos_*

El catálogo maestro tiene 66 columnas tipadas según los tipos sugeridos por el ERP en la fila 2 del Excel. PK = codigo (INT). Columnas con índices: proveedor_id, anulado, cod_tipo_mercaderia, cod_unidad_medida.

Columnas más usadas por otros módulos

  • codigo — JOIN con ventas.idArticulo (cast a UNSIGNED).
  • peso — enriquece cálculo de peso/toneladas en venta.
  • proveedor_id + proveedor_razon_social — proveedor real (si en venta vino mal).
  • cod_tipo_mercaderia + desc_tipo_mercaderia — segmentación.
  • desc_unidad_medida, bultos_x_pallet, unidad_x_bulto — logística.
  • anulado — filtro de SKUs vigentes.

Tablas auxiliares (catálogos)

-- Estructura común
CREATE TABLE articulos_raw_<aux> (
  codigo       INT PRIMARY KEY,    -- VARCHAR(50) para tipos_presentacion
  descripcion  VARCHAR(255),
  updated_at   TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

2.8 📚 Otras tablas relevantes

articulos_precios — 22 columnas lista_N

Una fila por artículo, una columna por cada lista de precios habilitada en la empresa (Delivery, Lista 1, Costo Especial, Veterinaria, …). El schema declarado en el dump tiene lista_0 a lista_21 (todas DECIMAL(14,4)); el schema definido por listas/api/_schema.php omite las listas que no existen en el ERP de ZA (2, 6, 12, 20).

articulos_agrupaciones — N:N artículo × forma de agrupar

CREATE TABLE articulos_agrupaciones (
  id_articulo       INT NOT NULL,
  id_forma_agrupar  VARCHAR(50) NOT NULL,
  des_forma_agrupar VARCHAR(100),
  id_agrupacion     VARCHAR(50),
  des_agrupacion    VARCHAR(200),
  PRIMARY KEY (id_articulo, id_forma_agrupar),
  INDEX idx_forma      (id_forma_agrupar),
  INDEX idx_agrupacion (des_agrupacion(100))
);

Usado por listas/api/precios.php para filtrar por categoría comercial (marca, accesorio, fuerza de venta, etc.).

clientes_raw — catálogo completo de clientes

~3.000 clientes con 49 columnas tipadas + datos_raw LONGTEXT con JSON validado (CHECK json_valid(datos_raw)). Usado por el módulo separado /clientes, pero podría ser cruzado por reportes en el futuro (segmentación demográfica, actividad última visita, etc.).

2.9 ⚡ Inventario de índices

Total: ~80 índices repartidos en las 33 tablas. Más críticos:

TablaÍndicesCompuesto importante
ventas12 (PK + 11 KEY)idx_mes_anio (idEmpresa, fechaComprobate)
caja_gastos8 (PK + 7 KEY)idx_periodo (mes, anio)
caja_raw_egresos_caja6idx_empresa_caja (empresa, caja_nro) · idx_periodo
caja_raw_gastos_tipificados9idx_me (serie, numero, empresa) · forma_pago · centro_cc · acreedor
caja_raw_movimiento_resumido10idx_me · cuenta · origen · pago · anulado
cashflow_cheques_cartera7presentación · estado · cliente · banco
articulos_raw5proveedor · anulado · tipo_merc · unidad_med
articulos_precios2PK id_articulo · des_articulo
catalogo_usuarios3email UK · id_cliente

Índices propuestos (PERF)

  • PERF-02 ALTER TABLE ventas ADD INDEX idx_sync_anulado (sync_id, anulado, dsArticulo) — cubre la mayoría de queries del dashboard.
  • PERF-03 ALTER TABLE ventas ADD INDEX idx_sync_supervisor (sync_id, dsSupervisor) — para drill-downs.
  • PERF-04 ALTER TABLE caja_raw_gastos_tipificados ADD INDEX idx_anio_rubro (YEAR(fecha_comp), rubro_id) — Finanzas filtra por año constantemente. Requiere columna calculada o usar fecha_comp directo.
  • PERF-05 FULLTEXT en nombreCliente y dsArticulo para búsquedas del cross-filter.

2.10 🔗 Foreign Keys actuales y propuestas

FK declarada (sólo 1)

ALTER TABLE ventas
  ADD CONSTRAINT fk_ventas_sync
  FOREIGN KEY (sync_id) REFERENCES sincronizaciones(id) ON DELETE CASCADE;

FKs propuestas (ver §11 propuesta ARQ-04)

-- 1) caja: hacer cascade limpio en sync_id
ALTER TABLE caja_gastos                   ADD CONSTRAINT fk_cg_sync   FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_egresos_caja         ADD CONSTRAINT fk_rec_sync  FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_egresos_detalle      ADD CONSTRAINT fk_red_sync  FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_gastos_tipificados   ADD CONSTRAINT fk_rgt_sync  FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_movimiento_detalle   ADD CONSTRAINT fk_rmd_sync  FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_movimiento_resumido  ADD CONSTRAINT fk_rmr_sync  FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;

-- 2) cashflow: idem
ALTER TABLE cashflow_cartera_clientes    ADD CONSTRAINT fk_ccc_sync FOREIGN KEY (sync_id) REFERENCES cashflow_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE cashflow_cartera_proveedores ADD CONSTRAINT fk_ccp_sync FOREIGN KEY (sync_id) REFERENCES cashflow_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE cashflow_cheques_cartera     ADD CONSTRAINT fk_cch_sync FOREIGN KEY (sync_id) REFERENCES cashflow_sincronizaciones(id) ON DELETE CASCADE;

-- 3) articulos: precio referencia catálogo
ALTER TABLE articulos_precios     ADD CONSTRAINT fk_ap_articulo FOREIGN KEY (id_articulo) REFERENCES articulos_raw(codigo) ON DELETE CASCADE;
ALTER TABLE articulos_agrupaciones ADD CONSTRAINT fk_ag_articulo FOREIGN KEY (id_articulo) REFERENCES articulos_raw(codigo) ON DELETE CASCADE;
💡 Beneficio
Migrar el "delete explícito en código" a FK CASCADE elimina ~50 líneas de PHP repetitivo en reset_db.php, evita huérfanos por bugs futuros, y deja a la BD ser la fuente de verdad de la integridad.

2.11 ⚠️ Observaciones generales sobre la BD

Bien hecho

  • InnoDB en 100% — soporta transacciones y FKs.
  • utf8mb4 universal — soporta emojis y caracteres extendidos.
  • ✅ Tipos nativos (DECIMAL/INT/DATE) en vez de JSON o VARCHAR — JOINs eficientes.
  • AUTO_INCREMENT con UNSIGNED donde corresponde.
  • ✅ Schemas con ALTER TABLE defensivos en try/catch → migraciones idempotentes sin downtime.
  • ON UPDATE CURRENT_TIMESTAMP en catálogos para detectar staleness.
  • UNIQUE KEY uk_mes_anio en sincronizaciones — previene duplicados.
  • ✅ JSON validado (CHECK json_valid(datos_raw)) en clientes_raw.

Pendientes / mejoras

  • ⚠️ Sólo 1 FK declarada (ver §2.10).
  • ⚠️ Falta índice compuesto (sync_id, anulado) en ventas.
  • ⚠️ CAST(idArticulo AS UNSIGNED) en JOIN inhibe uso del índice → considerar ALTER TABLE ventas MODIFY idArticulo INT.
  • ⚠️ Catálogos articulos_raw_tipos_mercaderia / unidades_medida vacíos — el ERP no los exporta o no se subieron.
  • ⚠️ Sin particionado (MariaDB PARTITION BY RANGE (sync_id) sería útil cuando ventas supere 10M filas).
  • ⚠️ Sin vistas materializadas — todos los agregados se recalculan en cada hit.
  • ⚠️ Sin CHECK constraints a nivel BD (ej. monto >= 0 en gastos no aplicaría, hay devoluciones).

Tamaño en disco estimado

Sin acceso al filesystem real del servidor, estimando por filas × longitud promedio:

TablaFilasBytes/fila aprox.Tamaño aprox.
ventas515K1.500~780 MB
caja_raw_egresos_detalle262K200~55 MB
caja_raw_gastos_tipificados28K800~22 MB
caja_raw_movimiento_detalle22K600~13 MB
articulos_raw8K1.200~9 MB
clientes_raw3K2.000 (JSON)~6 MB
articulos_agrupaciones23K100~2 MB
Total estimado~900 MB

El dump SQL (765 MB) está cerca del tamaño en disco — coherente.