arquitectura · venta · articulosEl 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.
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.
✅ 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).
❌ Frágil — depende de operadores manuales.
❌ Overkill para 5 módulos chicos. Útil cuando hay 20+ módulos.
✅ Robusto y simple.
venta/includes/db_reportes.php
líneas 5, 27articulos/api/_schema.php
función articulos_ensure_schema