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() ]); } ?>