Files
Complejo_Cap1tan/php/Ganacia_Neta.php
T
MarcosFlorSalcedo 8ec55e40fc 1ra Versión
2026-07-14 18:24:27 -03:00

88 lines
3.3 KiB
PHP

<?php
require_once 'conexion.php';
header('Content-Type: application/json');
try {
// 1. OBTENER LAS COLUMNAS DINÁMICAMENTE
// Le preguntamos a la base de datos qué gastos existen actualmente
$sql_columnas = "SHOW COLUMNS FROM gastos";
$result_columnas = $conexion->query($sql_columnas);
if (!$result_columnas) {
throw new Exception("Error al obtener las columnas de gastos: " . $conexion->error);
}
$columnas_suma = [];
while ($row = $result_columnas->fetch_assoc()) {
$col = $row['Field'];
// Ignoramos las columnas de control de historial
if (!in_array($col, ['ID_Gasto', 'Periodo_Desde', 'Periodo_Hasta'])) {
// Usamos COALESCE por si algún valor es NULL, para que la suma matemática no falle
$columnas_suma[] = "COALESCE(g.`$col`, 0)";
}
}
// Armamos el fragmento de la suma: "COALESCE(g.sueldo,0) + COALESCE(g.luz,0)..."
$suma_gastos_sql = empty($columnas_suma) ? "0" : implode(' + ', $columnas_suma);
// 2. CONSTRUIR LA CONSULTA PRINCIPAL
// Usamos LAST_DAY() para asegurar que tomamos la versión de gastos de fin de mes
// y evitamos duplicar los ingresos si hubo cambios a mitad de mes.
$sql_reporte = "
SELECT
ingresos.Mes,
COALESCE(ingresos.Ingreso_Bruto, 0) AS Ingreso_Bruto,
COALESCE(ingresos.Costo, 0) AS Costo,
COALESCE(ingresos.Ganancia_Bruta, 0) AS Ganancia_Bruta,
($suma_gastos_sql) AS Gastos_Totales,
COALESCE(ingresos.Ganancia_Bruta, 0) - ($suma_gastos_sql) AS Ganancia_Neta
FROM (
SELECT
DATE_FORMAT(v.Fecha, '%Y-%m') AS Mes,
LAST_DAY(MAX(v.Fecha)) AS Fin_De_Mes,
SUM(p.Precio_Venta * vp.Cantidad) AS Ingreso_Bruto,
SUM(p.Precio_Compra * vp.Cantidad) AS Costo,
SUM((p.Precio_Venta - p.Precio_Compra) * vp.Cantidad) AS Ganancia_Bruta
FROM ventas v
JOIN ventas_productos vp ON v.ID_Venta = vp.ID_Venta
JOIN productos p ON vp.ID_Producto = p.ID_Producto
GROUP BY Mes
) ingresos
LEFT JOIN gastos g
ON g.Periodo_Desde <= ingresos.Fin_De_Mes
AND (g.Periodo_Hasta IS NULL OR g.Periodo_Hasta > ingresos.Fin_De_Mes)
ORDER BY ingresos.Mes DESC;
";
// 3. EJECUTAR LA CONSULTA
$result_reporte = $conexion->query($sql_reporte);
if (!$result_reporte) {
throw new Exception("Error al generar el reporte: " . $conexion->error);
}
$reporte = [];
while ($row = $result_reporte->fetch_assoc()) {
// Convertimos los valores numéricos de strings a floats para el JSON
$reporte[] = [
'Mes' => $row['Mes'],
'Ingreso_Bruto' => floatval($row['Ingreso_Bruto']),
'Costo' => floatval($row['Costo']),
'Ganancia_Bruta' => floatval($row['Ganancia_Bruta']),
'Gastos_Totales' => floatval($row['Gastos_Totales']),
'Ganancia_Neta' => floatval($row['Ganancia_Neta'])
];
}
echo json_encode([
'success' => true,
'data' => $reporte
]);
} catch (Exception $e) {
echo json_encode([
'success' => false,
'message' => $e->getMessage()
]);
}
?>