1ra Versión
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
<?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()
|
||||
]);
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user