feat: Se mejoror logica de los graficos y se agregaron componenetes en el index.html
This commit is contained in:
parent
9bf4c64cda
commit
1fc55bf2bc
corregido
|
@ -10,29 +10,61 @@ require_once 'VendedorController.php';
|
||||||
|
|
||||||
header('Content-Type: application/json');
|
header('Content-Type: application/json');
|
||||||
|
|
||||||
// Conexión a base de datos
|
try {
|
||||||
$db = new BaseDatos('localhost:3306', 'root', 'password', 'boletos_db');
|
// Conexión a base de datos
|
||||||
|
$db = new BaseDatos('localhost', 'root', 'password', 'boletos_db');
|
||||||
|
|
||||||
// Inicializar el controlador
|
// Inicializar el controlador
|
||||||
$vendedorController = new VendedorController($db);
|
$vendedorController = new VendedorController($db);
|
||||||
|
|
||||||
// Cargar sala (solo hay una sala con id=1)
|
// Cargar sala (solo hay una sala con id=1)
|
||||||
$sala = $vendedorController->cargarSala(1);
|
$sala = $vendedorController->cargarSala(1);
|
||||||
|
|
||||||
// Si no hay sala, podríamos inicializarla para desarrollo
|
// Si no hay sala, podríamos inicializarla para desarrollo
|
||||||
if (!$sala) {
|
if (!$sala) {
|
||||||
$sala = new Sala(1, 'Sala Principal');
|
$sala = new Sala(1, 'Sala Principal');
|
||||||
$sala->inicializarBoletos(10, 15, 50.00); // 10 filas, 15 asientos por fila, $50 cada uno
|
$sala->inicializarBoletos(10, 15, 50.00); // 10 filas, 15 asientos por fila, $50 cada uno
|
||||||
}
|
}
|
||||||
|
|
||||||
// Obtener mapa de asientos
|
// Obtener parámetros de fecha
|
||||||
$mapaAsientos = $vendedorController->mostrarDisponibilidadAsientos();
|
$fechaInicio = isset($_GET['fechaInicio']) ? $_GET['fechaInicio'] : null;
|
||||||
|
$fechaFin = isset($_GET['fechaFin']) ? $_GET['fechaFin'] : null;
|
||||||
|
|
||||||
// Preparar respuesta
|
// Obtener mapa de asientos
|
||||||
$response = [
|
$mapaAsientos = $vendedorController->mostrarDisponibilidadAsientos();
|
||||||
'success' => true,
|
|
||||||
'mapa' => $mapaAsientos,
|
|
||||||
'precio' => 50.00 // Agregamos el precio de los boletos a la respuesta
|
|
||||||
];
|
|
||||||
|
|
||||||
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);
|
||||||
|
}
|
|
@ -87,7 +87,15 @@ class BaseDatos {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getConexion() {
|
||||||
|
return $this->conexion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __destruct() {
|
||||||
|
$this->conexion->close();
|
||||||
|
}
|
||||||
|
|
||||||
public function cerrarConexion() {
|
public function cerrarConexion() {
|
||||||
$this->conexion->close();
|
$this->conexion->close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,6 +99,22 @@
|
||||||
<canvas id="graficoLibres"></canvas>
|
<canvas id="graficoLibres"></canvas>
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<script src="js/index.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -50,20 +50,28 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
// Agregar manejador para el formulario
|
// Agregar manejador para el formulario
|
||||||
const formulario = document.getElementById('formularioVenta');
|
const formulario = document.getElementById('formularioVenta');
|
||||||
formulario.addEventListener('submit', validarYEnviarFormulario);
|
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
|
// Función para cargar el mapa de asientos desde la API
|
||||||
async function cargarMapaAsientos() {
|
async function cargarMapaAsientos() {
|
||||||
try {
|
try {
|
||||||
const response = await fetch('../controlador/asientos.php');
|
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) {
|
if (!data.success) {
|
||||||
mostrarMensaje('Error al cargar el mapa de asientos', 'error');
|
mostrarMensaje('Error al cargar el mapa de asientos: ' + data.message, 'error');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderizarMapaAsientos(data.mapa);
|
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) {
|
} catch (error) {
|
||||||
console.error('Error al cargar el mapa de asientos:', error);
|
console.error('Error al cargar el mapa de asientos:', error);
|
||||||
mostrarMensaje('Error de conexión con el servidor', '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
|
// Función para actualizar los gráficos
|
||||||
function actualizarGraficos(mapa) {
|
function actualizarGraficos(mapa, precioBoleto) {
|
||||||
let totalVendidos = 0;
|
let totalVendidos = 0;
|
||||||
let totalLibres = 0;
|
let totalLibres = 0;
|
||||||
|
let totalVenta = 0;
|
||||||
|
|
||||||
Object.values(mapa).forEach(asientosEnFila => {
|
Object.values(mapa).forEach(asientosEnFila => {
|
||||||
Object.values(asientosEnFila).forEach(estado => {
|
Object.values(asientosEnFila).forEach(estado => {
|
||||||
if (estado === 'vendido') {
|
if (estado === 'vendido') {
|
||||||
totalVendidos++;
|
totalVendidos++;
|
||||||
|
totalVenta += precioBoleto; // Sumar el precio del boleto vendido
|
||||||
} else if (estado === 'disponible') {
|
} else if (estado === 'disponible') {
|
||||||
totalLibres++;
|
totalLibres++;
|
||||||
}
|
}
|
||||||
|
@ -265,5 +275,58 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
graficoVendidos.update();
|
graficoVendidos.update();
|
||||||
graficoLibres.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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
Loading…
Reference in New Issue