88 lines
3.3 KiB
PHP
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()
|
|
]);
|
|
}
|
|
?>
|