feat: Se mejoror logica de los graficos y se agregaron componenetes en el index.html

This commit is contained in:
Hector 2025-03-12 21:17:56 -06:00
parent 9bf4c64cda
commit 1fc55bf2bc
4 changed files with 146 additions and 27 deletions
corregido

View File

@ -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);
// 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);
}

View File

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

View File

@ -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>

View File

@ -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');
}
}
});