venta · formula · chesserpChessERP (el ERP fuente) calcula Vta y Compra con criterios distintos:
Si calculamos Margen = Vta − Compra de forma ingenua, los NDCONs (que no
tienen costo) inflan el margen aparentemente al 100% — completamente
incorrecto desde el punto de vista comercial.
Cliente SGO | PABLO MOLINA (Abril 2026):
| Vta total | Compra | Margen ingenuo | Margen real | |
|---|---|---|---|---|
| Sin filtrar NDCONs | $16.059.265 | $10.587.444 | 34,07 % ❌ | — |
| Filtrando NDCONs | $13.417.695 | $10.587.444 | — | 21,09 % ✅ |
El margen ingenuo dice 34% pero el real (alineado con ChessERP) es 21%.
WHERE dsArticulo IS NOT NULLSELECT SUM(subtotalNeto) AS vta,
SUM(preciocomprant * cantidadesTotal) AS costo
FROM ventas
WHERE anulado = 'NO' AND dsArticulo IS NOT NULL;
❌ Rechazado: pierde la Vta total. El cliente comercial vio ingresos
que después no aparecen en el reporte.
❌ Rechazado: confunde a la gerencia. ChessERP muestra UNO solo.
-- Vta total (con NDCONs)
SUM(subtotalNeto) AS vta_total
-- Vta para denominador del margen (sin NDCONs)
SUM(CASE WHEN dsArticulo IS NOT NULL AND dsArticulo != ''
THEN subtotalNeto ELSE 0 END) AS vta_reales
-- Costo
SUM(preciocomprant * cantidadesTotal) AS costo
-- Margen y contribución
contribucion = vta_reales − costo
%_margen = contribucion / vta_reales
✅ Aceptado: coincide con ChessERP al peso.
Adoptamos la fórmula compuesta como constantes SQL reutilizables en
venta/includes/data_api.php
(líneas 27-30):
const SUM_VENTAS_REALES = "SUM(CASE WHEN dsArticulo IS NOT NULL AND dsArticulo != ''
THEN subtotalNeto ELSE 0 END)";
const SUM_COSTO_NETO = "SUM(preciocomprant * cantidadesTotal)";
const EXPR_CONTRIBUCION = "(" . SUM_VENTAS_REALES . " - " . SUM_COSTO_NETO . ")";
const EXPR_MARGEN_PCT = "CASE WHEN " . SUM_VENTAS_REALES . " > 0
THEN " . EXPR_CONTRIBUCION . " / " . SUM_VENTAS_REALES . "
ELSE 0 END";
Estas constantes se usan en todas las funciones _apiMargen* y _apiKpis.
(SIN ARTÍCULO) en tablas que agrupan por proveedor/artículo. Son los NDCONs.COALESCE en GROUP BY para mantener coherencia (ver ADR-0009).data_api.php y filter.php (corregido en refactor F1-4 del roadmap).venta/includes/data_api.php
líneas 27-30venta/DOCUMENTACION.md §13