El módulo de Utilidades calcula automáticamente las ganancias del negocio comparando ventas vs compras, con análisis de márgenes de utilidad bruta y neta.
Los cálculos se realizan dinámicamente desde las tablas ventas y compras, sin almacenar datos redundantes.
Compara precio de venta vs costo de compra por producto:
SELECT p.codigo_producto, p.descripcion, p.precio_venta, p.precio_compra, (p.precio_venta - p.precio_compra) as utilidad_unitaria, ((p.precio_venta - p.precio_compra) / p.precio_venta * 100) as margen_porcentual, SUM(dv.cantidad) as cantidad_vendida, SUM(dv.cantidad * (dv.precio_unitario - p.precio_compra)) as utilidad_totalFROM productos pLEFT JOIN detalle_ventas dv ON p.id_producto = dv.id_productoLEFT JOIN ventas v ON dv.id_venta = v.id_ventaWHERE v.id_empresa = 1 AND v.estado = '1' AND v.fecha_emision BETWEEN '2026-01-01' AND '2026-03-31'GROUP BY p.id_productoORDER BY utilidad_total DESC;
SELECT c.nombre as categoria, COUNT(DISTINCT p.id_producto) as productos, SUM(dv.cantidad) as unidades_vendidas, SUM(dv.cantidad * dv.precio_unitario) as ventas_totales, SUM(dv.cantidad * p.precio_compra) as costo_total, SUM(dv.cantidad * (dv.precio_unitario - p.precio_compra)) as utilidad, (SUM(dv.cantidad * (dv.precio_unitario - p.precio_compra)) / SUM(dv.cantidad * dv.precio_unitario) * 100) as margenFROM categorias cJOIN productos p ON c.id_categoria = p.id_categoriaJOIN detalle_ventas dv ON p.id_producto = dv.id_productoJOIN ventas v ON dv.id_venta = v.id_ventaWHERE v.id_empresa = 1 AND v.estado = '1' AND v.fecha_emision BETWEEN '2026-01-01' AND '2026-03-31'GROUP BY c.id_categoriaORDER BY utilidad DESC;
// Periodo actual$utilidadActual = calcularUtilidad($fechaInicio, $fechaFin);// Periodo anterior (mismo rango de fechas, año anterior)$fechaInicioAnterior = (new \DateTime($fechaInicio))->modify('-1 year');$fechaFinAnterior = (new \DateTime($fechaFin))->modify('-1 year');$utilidadAnterior = calcularUtilidad($fechaInicioAnterior, $fechaFinAnterior);// Cálculo de variación$variacionAbsoluta = $utilidadActual - $utilidadAnterior;$variacionPorcentual = ($variacionAbsoluta / $utilidadAnterior) * 100;
Los cálculos de utilidad asumen que precio_compra en la tabla productos está actualizado. Si los costos varían en cada compra, considere usar el costo promedio ponderado.
Para análisis más precisos, registre los gastos operativos en movimientos de caja con categorías específicas (sueldos, alquileres, servicios, etc.).