ADR-0006 · Bootstrap cross-module del schema de artículos

ADR-0006 · Bootstrap cross-module del schema de artículos

  • Status: ✅ Accepted
  • Fecha: 2026-05-12
  • Tags: arquitectura · venta · articulos

Contexto

El módulo Venta hace LEFT JOIN articulos_raw para enriquecer el peso de cada línea (venta/includes/data_api.php).

Problema: si nunca se subió el catálogo de artículos, la tabla articulos_raw no existe → todas las queries del dashboard de venta fallan con Error: Table 'articulos_raw' doesn't exist.

Decisión

venta/includes/db_reportes.php incluye el _schema.php de articulos y dispara articulos_ensure_schema($pdo) al crear el PDO:

require_once __DIR__ . '/../../articulos/api/_schema.php';

function getApiDB(): PDO {
    static $pdo = null;
    if ($pdo) return $pdo;

    $pdo = new PDO(/*...*/);

    // ★ Garantiza que articulos_raw exista aunque nunca se haya cargado
    articulos_ensure_schema($pdo);

    return $pdo;
}

articulos_ensure_schema usa CREATE TABLE IF NOT EXISTS para las 5 tablas. Si ya existen, no hace nada.

Consecuencias

El JOIN del peso nunca falla. Si la tabla está vacía, IFNULL cae al fallback pesoTotal que vino de la API. ✅ Idempotente — se puede llamar en cada request sin costo (CREATE IF NOT EXISTS). ✅ Acoplamiento manejado explícitamente — el módulo Venta "sabe" que necesita el schema de articulos. ⚠️ Acoplamiento real — si articulos cambia su schema sin coordinar con venta, puede romper. ⚠️ Pequeño costo de PDO query en cada hit (microsegundos, ignorable).

Alternativas consideradas

Opción A · Documentar dependencia y que el admin instale en orden

❌ Frágil — depende de operadores manuales.

Opción B · Schema único compartido con migraciones formales (tipo Phinx)

❌ Overkill para 5 módulos chicos. Útil cuando hay 20+ módulos.

Opción C · Bootstrap automático (★ elegida)

✅ Robusto y simple.

Referencias