diff --git a/corregido/controlador/asientos.php b/corregido/controlador/asientos.php index 3d770e6..eb415b3 100644 --- a/corregido/controlador/asientos.php +++ b/corregido/controlador/asientos.php @@ -10,29 +10,61 @@ require_once 'VendedorController.php'; header('Content-Type: application/json'); -// Conexión a base de datos -$db = new BaseDatos('localhost:3306', 'root', 'password', 'boletos_db'); +try { + // Conexión a base de datos + $db = new BaseDatos('localhost', 'root', 'password', 'boletos_db'); -// Inicializar el controlador -$vendedorController = new VendedorController($db); + // Inicializar el controlador + $vendedorController = new VendedorController($db); -// Cargar sala (solo hay una sala con id=1) -$sala = $vendedorController->cargarSala(1); + // Cargar sala (solo hay una sala con id=1) + $sala = $vendedorController->cargarSala(1); -// Si no hay sala, podríamos inicializarla para desarrollo -if (!$sala) { - $sala = new Sala(1, 'Sala Principal'); - $sala->inicializarBoletos(10, 15, 50.00); // 10 filas, 15 asientos por fila, $50 cada uno -} + // Si no hay sala, podríamos inicializarla para desarrollo + if (!$sala) { + $sala = new Sala(1, 'Sala Principal'); + $sala->inicializarBoletos(10, 15, 50.00); // 10 filas, 15 asientos por fila, $50 cada uno + } -// Obtener mapa de asientos -$mapaAsientos = $vendedorController->mostrarDisponibilidadAsientos(); + // Obtener parámetros de fecha + $fechaInicio = isset($_GET['fechaInicio']) ? $_GET['fechaInicio'] : null; + $fechaFin = isset($_GET['fechaFin']) ? $_GET['fechaFin'] : null; -// Preparar respuesta -$response = [ - 'success' => true, - 'mapa' => $mapaAsientos, - 'precio' => 50.00 // Agregamos el precio de los boletos a la respuesta -]; + // Obtener mapa de asientos + $mapaAsientos = $vendedorController->mostrarDisponibilidadAsientos(); -echo json_encode($response); \ No newline at end of file + // Filtrar por fecha si se proporcionan las fechas + if ($fechaInicio && $fechaFin) { + $query = "SELECT b.id, b.fila, b.numero, b.precio, b.estado + FROM boletos b + JOIN venta_boletos vb ON b.id = vb.id_boleto + JOIN ventas v ON vb.id_venta = v.id + WHERE DATE(v.fecha) BETWEEN ? AND ?"; + $stmt = $db->getConexion()->prepare($query); + $stmt->bind_param("ss", $fechaInicio, $fechaFin); + $stmt->execute(); + $result = $stmt->get_result(); + + $mapaAsientos = []; + while ($fila = $result->fetch_assoc()) { + $mapaAsientos[$fila['fila']][$fila['numero']] = $fila['estado']; + } + } + + // Preparar respuesta + $response = [ + 'success' => true, + 'mapa' => $mapaAsientos, + 'precio' => 50.00 // Agregamos el precio de los boletos a la respuesta + ]; + + echo json_encode($response); + +} catch (Exception $e) { + // Manejar errores y devolver una respuesta JSON + $response = [ + 'success' => false, + 'message' => 'Error al obtener el mapa de asientos: ' . $e->getMessage() + ]; + echo json_encode($response); +} \ No newline at end of file diff --git a/corregido/modelo/BaseDatos.php b/corregido/modelo/BaseDatos.php index c27b5a1..c7b4590 100644 --- a/corregido/modelo/BaseDatos.php +++ b/corregido/modelo/BaseDatos.php @@ -87,7 +87,15 @@ class BaseDatos { return false; } } - + + public function getConexion() { + return $this->conexion; + } + + public function __destruct() { + $this->conexion->close(); + } + public function cerrarConexion() { $this->conexion->close(); } diff --git a/corregido/vista/index.html b/corregido/vista/index.html index f88d23a..4fd0efa 100644 --- a/corregido/vista/index.html +++ b/corregido/vista/index.html @@ -99,6 +99,22 @@ <canvas id="graficoLibres"></canvas> </div> </div> + + <div class="row mt-4"> + <div class="col-md-6"> + <label for="fechaInicio">Fecha de Inicio:</label> + <input type="date" id="fechaInicio" class="form-control"> + </div> + <div class="col-md-6"> + <label for="fechaFin">Fecha de Fin:</label> + <input type="date" id="fechaFin" class="form-control"> + </div> + </div> + <div class="row mt-2"> + <div class="col-md-12"> + <button id="btnFiltrar" class="btn btn-primary">Filtrar</button> + </div> + </div> <script src="js/index.js"></script> </body> diff --git a/corregido/vista/js/index.js b/corregido/vista/js/index.js index 69b1fcf..ad156dd 100644 --- a/corregido/vista/js/index.js +++ b/corregido/vista/js/index.js @@ -50,20 +50,28 @@ document.addEventListener('DOMContentLoaded', function() { // Agregar manejador para el formulario const formulario = document.getElementById('formularioVenta'); formulario.addEventListener('submit', validarYEnviarFormulario); + + // Agregar manejador para el botón de filtrar + const btnFiltrar = document.getElementById('btnFiltrar'); + btnFiltrar.addEventListener('click', filtrarPorFecha); // Función para cargar el mapa de asientos desde la API async function cargarMapaAsientos() { try { const response = await fetch('../controlador/asientos.php'); - const data = await response.json(); - + const responseText = await response.text(); // Capturar respuesta como texto para depurar + console.log('Respuesta del servidor:', responseText); + + // Intentar parsear como JSON + const data = JSON.parse(responseText); + if (!data.success) { - mostrarMensaje('Error al cargar el mapa de asientos', 'error'); + mostrarMensaje('Error al cargar el mapa de asientos: ' + data.message, 'error'); return; } - + renderizarMapaAsientos(data.mapa); - actualizarGraficos(data.mapa); // Asegúrate de llamar a actualizarGraficos aquí + actualizarGraficos(data.mapa, data.precio); // Asegúrate de llamar a actualizarGraficos aquí } catch (error) { console.error('Error al cargar el mapa de asientos:', error); mostrarMensaje('Error de conexión con el servidor', 'error'); @@ -246,14 +254,16 @@ document.addEventListener('DOMContentLoaded', function() { } // Función para actualizar los gráficos - function actualizarGraficos(mapa) { + function actualizarGraficos(mapa, precioBoleto) { let totalVendidos = 0; let totalLibres = 0; + let totalVenta = 0; Object.values(mapa).forEach(asientosEnFila => { Object.values(asientosEnFila).forEach(estado => { if (estado === 'vendido') { totalVendidos++; + totalVenta += precioBoleto; // Sumar el precio del boleto vendido } else if (estado === 'disponible') { totalLibres++; } @@ -265,5 +275,58 @@ document.addEventListener('DOMContentLoaded', function() { graficoVendidos.update(); graficoLibres.update(); + + // Mostrar la suma total de boletos vendidos debajo del gráfico de asientos vendidos + const totalVendidosElement = document.getElementById('totalVendidos'); + if (totalVendidosElement) { + totalVendidosElement.textContent = `Total boletos vendidos: ${totalVendidos}`; + } else { + const totalVendidosLabel = document.createElement('p'); + totalVendidosLabel.id = 'totalVendidos'; + totalVendidosLabel.textContent = `Total boletos vendidos: ${totalVendidos}`; + graficoVendidos.canvas.parentNode.appendChild(totalVendidosLabel); + } + + // Mostrar la suma total vendida debajo del gráfico de asientos vendidos + const totalVentaElement = document.getElementById('totalVentaDia'); + if (totalVentaElement) { + totalVentaElement.textContent = `Total vendido: $${totalVenta.toFixed(2)}`; + } else { + const totalVentaLabel = document.createElement('p'); + totalVentaLabel.id = 'totalVentaDia'; + totalVentaLabel.textContent = `Total vendido: $${totalVenta.toFixed(2)}`; + graficoVendidos.canvas.parentNode.appendChild(totalVentaLabel); + } + } + + // Función para filtrar los datos por fecha + async function filtrarPorFecha() { + const fechaInicio = document.getElementById('fechaInicio').value; + const fechaFin = document.getElementById('fechaFin').value; + + if (!fechaInicio || !fechaFin) { + mostrarMensaje('Por favor, seleccione un rango de fechas válido.', 'warning'); + return; + } + + try { + const response = await fetch(`../controlador/asientos.php?fechaInicio=${fechaInicio}&fechaFin=${fechaFin}`); + const responseText = await response.text(); // Capturar respuesta como texto para depurar + console.log('Respuesta del servidor:', responseText); + + // Intentar parsear como JSON + const data = JSON.parse(responseText); + + if (!data.success) { + mostrarMensaje('Error al filtrar los datos por fecha', 'error'); + return; + } + + renderizarMapaAsientos(data.mapa); // Asegúrate de renderizar el mapa de asientos filtrado + actualizarGraficos(data.mapa, data.precio); + } catch (error) { + console.error('Error al filtrar los datos por fecha:', error); + mostrarMensaje('Error de conexión con el servidor', 'error'); + } } }); \ No newline at end of file