BD de datos TicketCompany

This commit is contained in:
angel.alducin 2025-03-12 20:52:40 -06:00
parent 22ef9f5694
commit 2e1cafcbef
45 changed files with 2248 additions and 170 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,59 @@
-- MySQL dump 10.13 Distrib 8.0.40, for Win64 (x86_64)
--
-- Host: localhost Database: ticketcompany_db
-- ------------------------------------------------------
-- Server version 8.0.40
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `conciertos`
--
DROP TABLE IF EXISTS `conciertos`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `conciertos` (
`id` int NOT NULL AUTO_INCREMENT,
`artista` varchar(100) NOT NULL,
`fecha` datetime NOT NULL,
`descripcion` text,
`imagen` varchar(255) DEFAULT NULL,
`cupos_ocupados` int NOT NULL DEFAULT '0',
`lugar_id` int DEFAULT NULL,
`precio` decimal(10,2) NOT NULL DEFAULT '500.00',
PRIMARY KEY (`id`),
KEY `lugar_id` (`lugar_id`),
CONSTRAINT `conciertos_ibfk_1` FOREIGN KEY (`lugar_id`) REFERENCES `lugares` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `conciertos`
--
LOCK TABLES `conciertos` WRITE;
/*!40000 ALTER TABLE `conciertos` DISABLE KEYS */;
INSERT INTO `conciertos` VALUES (8,'Junior H','2025-03-14 23:30:00','$adBoyz Tour Fei',NULL,0,2,950.00),(9,'Tributo a Soda Stereo','2025-03-15 22:41:00','Tributo a Soda Stereo','img/eventos/evento_67ce6db6571257.43010380.jpeg',0,1,400.00),(10,'Bad Bunny','2025-03-31 07:12:00','hola','img/eventos/evento_67cee54aeaa1a0.27290983.png',0,6,1499.98),(11,'Coldplay','2025-03-29 07:35:00','Coldplay en Xalapa','',0,4,299.99),(12,'Mora','2025-03-26 22:00:00','mora en xalapa','',0,3,1500.00),(13,'PRUEBA CAPACIDAD','2025-03-29 22:04:00','hola','img/eventos/evento_67d107d18f9a33.58561139.jpg',0,1,699.00),(14,'ASDASDASD','2025-03-21 22:08:00','evento de ´prueba','',0,2,2000.00);
/*!40000 ALTER TABLE `conciertos` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-12 20:51:00

View File

@ -0,0 +1,56 @@
-- MySQL dump 10.13 Distrib 8.0.40, for Win64 (x86_64)
--
-- Host: localhost Database: ticketcompany_db
-- ------------------------------------------------------
-- Server version 8.0.40
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `historial_eventos`
--
DROP TABLE IF EXISTS `historial_eventos`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `historial_eventos` (
`id` int NOT NULL,
`artista` varchar(255) DEFAULT NULL,
`fecha` datetime DEFAULT NULL,
`lugar_id` int DEFAULT NULL,
`precio` decimal(10,2) DEFAULT NULL,
`descripcion` text,
`imagen` varchar(255) DEFAULT NULL,
`fecha_movido` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `historial_eventos`
--
LOCK TABLES `historial_eventos` WRITE;
/*!40000 ALTER TABLE `historial_eventos` DISABLE KEYS */;
/*!40000 ALTER TABLE `historial_eventos` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-12 20:50:59

View File

@ -0,0 +1,52 @@
-- MySQL dump 10.13 Distrib 8.0.40, for Win64 (x86_64)
--
-- Host: localhost Database: ticketcompany_db
-- ------------------------------------------------------
-- Server version 8.0.40
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `lugares`
--
DROP TABLE IF EXISTS `lugares`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `lugares` (
`id` int NOT NULL AUTO_INCREMENT,
`nombre` varchar(100) NOT NULL,
`capacidad` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `lugares`
--
LOCK TABLES `lugares` WRITE;
/*!40000 ALTER TABLE `lugares` DISABLE KEYS */;
INSERT INTO `lugares` VALUES (1,'Teatro del Estado',200),(2,'Auditorio Fei',125),(3,'Velódromo Internacional Xalapa',180),(4,'Tlaqná',100),(5,'Nido del Halcón ',95),(6,'Auditorio de la Normal Veracruzana',140);
/*!40000 ALTER TABLE `lugares` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-12 20:50:59

View File

@ -0,0 +1,54 @@
-- MySQL dump 10.13 Distrib 8.0.40, for Win64 (x86_64)
--
-- Host: localhost Database: ticketcompany_db
-- ------------------------------------------------------
-- Server version 8.0.40
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `vendedores`
--
DROP TABLE IF EXISTS `vendedores`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `vendedores` (
`id` int NOT NULL AUTO_INCREMENT,
`nombre` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `vendedores`
--
LOCK TABLES `vendedores` WRITE;
/*!40000 ALTER TABLE `vendedores` DISABLE KEYS */;
INSERT INTO `vendedores` VALUES (1,'Alexander Diaz','alex@gmail.com','123'),(2,'Angel','angel@gmail.com','123456');
/*!40000 ALTER TABLE `vendedores` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-12 20:50:59

View File

@ -0,0 +1,56 @@
-- MySQL dump 10.13 Distrib 8.0.40, for Win64 (x86_64)
--
-- Host: localhost Database: ticketcompany_db
-- ------------------------------------------------------
-- Server version 8.0.40
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `venta_detalle`
--
DROP TABLE IF EXISTS `venta_detalle`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `venta_detalle` (
`id` int NOT NULL AUTO_INCREMENT,
`venta_id` int NOT NULL,
`asiento_id` int NOT NULL,
`precio` decimal(8,2) NOT NULL,
PRIMARY KEY (`id`),
KEY `venta_id` (`venta_id`),
KEY `asiento_id` (`asiento_id`),
CONSTRAINT `venta_detalle_ibfk_1` FOREIGN KEY (`venta_id`) REFERENCES `ventas` (`id`),
CONSTRAINT `venta_detalle_ibfk_2` FOREIGN KEY (`asiento_id`) REFERENCES `asientos` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `venta_detalle`
--
LOCK TABLES `venta_detalle` WRITE;
/*!40000 ALTER TABLE `venta_detalle` DISABLE KEYS */;
/*!40000 ALTER TABLE `venta_detalle` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-12 20:50:59

View File

@ -0,0 +1,60 @@
-- MySQL dump 10.13 Distrib 8.0.40, for Win64 (x86_64)
--
-- Host: localhost Database: ticketcompany_db
-- ------------------------------------------------------
-- Server version 8.0.40
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `ventas`
--
DROP TABLE IF EXISTS `ventas`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ventas` (
`id` int NOT NULL AUTO_INCREMENT,
`evento_id` int NOT NULL,
`cantidad` int NOT NULL,
`vendedor_id` int DEFAULT NULL,
`fecha` datetime DEFAULT CURRENT_TIMESTAMP,
`total` decimal(10,2) DEFAULT NULL,
`fecha_venta` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `vendedor_id` (`vendedor_id`),
KEY `fk_evento` (`evento_id`),
CONSTRAINT `fk_evento` FOREIGN KEY (`evento_id`) REFERENCES `conciertos` (`id`) ON DELETE CASCADE,
CONSTRAINT `ventas_ibfk_1` FOREIGN KEY (`vendedor_id`) REFERENCES `vendedores` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `ventas`
--
LOCK TABLES `ventas` WRITE;
/*!40000 ALTER TABLE `ventas` DISABLE KEYS */;
INSERT INTO `ventas` VALUES (70,8,1,NULL,'2025-03-09 16:42:34',950.00,'2025-03-09 16:42:34'),(71,8,1,NULL,'2025-03-09 21:11:49',950.00,'2025-03-09 21:11:49'),(72,8,2,NULL,'2025-03-09 21:36:46',1900.00,'2025-03-09 21:36:46'),(73,8,4,NULL,'2025-03-09 22:00:24',3800.00,'2025-03-09 22:00:24'),(74,8,6,NULL,'2025-03-09 22:16:01',5700.00,'2025-03-09 22:16:01'),(75,8,1,NULL,'2025-03-09 22:18:25',950.00,'2025-03-09 22:18:25'),(76,8,1,NULL,'2025-03-09 22:21:27',950.00,'2025-03-09 22:21:27'),(77,8,3,NULL,'2025-03-09 22:23:08',2850.00,'2025-03-09 22:23:08'),(78,8,1,NULL,'2025-03-09 22:29:52',950.00,'2025-03-09 22:29:52'),(79,8,2,NULL,'2025-03-09 23:04:06',1900.00,'2025-03-09 23:04:06'),(80,10,6,NULL,'2025-03-10 07:14:03',8999.88,'2025-03-10 07:14:03'),(81,11,4,NULL,'2025-03-10 07:38:47',1199.96,'2025-03-10 07:38:47'),(82,8,2,NULL,'2025-03-10 08:38:02',1900.00,'2025-03-10 08:38:02'),(83,13,3,NULL,'2025-03-11 22:05:59',2097.00,'2025-03-11 22:05:59');
/*!40000 ALTER TABLE `ventas` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-12 20:51:00

View File

@ -0,0 +1,57 @@
-- MySQL dump 10.13 Distrib 8.0.40, for Win64 (x86_64)
--
-- Host: localhost Database: ticketcompany_db
-- ------------------------------------------------------
-- Server version 8.0.40
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `ventas_asientos`
--
DROP TABLE IF EXISTS `ventas_asientos`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ventas_asientos` (
`id` int NOT NULL AUTO_INCREMENT,
`venta_id` int NOT NULL,
`asiento_id` int NOT NULL,
`precio` decimal(10,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`),
KEY `venta_id` (`venta_id`),
KEY `asiento_id` (`asiento_id`),
CONSTRAINT `ventas_asientos_ibfk_1` FOREIGN KEY (`venta_id`) REFERENCES `ventas` (`id`) ON DELETE CASCADE,
CONSTRAINT `ventas_asientos_ibfk_2` FOREIGN KEY (`asiento_id`) REFERENCES `asientos` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `ventas_asientos`
--
LOCK TABLES `ventas_asientos` WRITE;
/*!40000 ALTER TABLE `ventas_asientos` DISABLE KEYS */;
INSERT INTO `ventas_asientos` VALUES (8,74,1165,0.00),(9,74,1166,0.00),(10,74,1167,0.00),(11,74,1168,0.00),(12,74,1169,0.00),(13,74,1170,0.00),(14,75,1155,0.00),(15,76,1197,0.00),(16,77,1174,0.00),(17,77,1175,0.00),(18,77,1176,0.00),(19,78,1224,950.00),(20,79,1123,950.00),(21,79,1124,950.00),(22,80,1483,1499.98),(23,80,1484,1499.98),(24,80,1529,1499.98),(25,80,1530,1499.98),(26,80,1551,1499.98),(27,80,1552,1499.98),(28,81,1597,299.99),(29,81,1605,299.99),(30,81,1606,299.99),(31,81,1645,299.99),(32,82,1158,950.00),(33,82,1159,950.00),(34,83,1233,699.00),(35,83,1258,699.00),(36,83,1356,699.00);
/*!40000 ALTER TABLE `ventas_asientos` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-12 20:50:59

48
comprar-boletos.html Normal file
View File

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Comprar Boletos</title>
<link rel="stylesheet" href="css/comprar-boletos.css">
<style>
/* Estilo para alinear los botones */
.botones-container {
display: flex;
gap: 10px; /* Espacio entre los botones */
margin-top: 20px;
}
</style>
</head>
<body>
<h1 id="titulo">Comprar Boletos</h1>
<div id="eventoInfo">
<p id="fecha"></p>
<p id="lugar"></p>
<p><strong>Precio por boleto:</strong> <span id="precioBoleto">Cargando...</span></p>
</div>
<h2>Selecciona tus boletos</h2>
<form id="formCompra" action="controladores/procesar-compra.php" method="POST">
<input type="hidden" id="evento_id" name="evento_id">
<h3>Cantidad de boletos:</h3>
<label for="cantidad">Selecciona la cantidad:</label>
<input type="number" id="cantidad" name="cantidad" min="1" required>
<h2>Selecciona tus asientos</h2>
<div id="mapa-asientos"></div>
<div class="botones-container">
<!-- Botón para confirmar compra -->
<button type="button" id="comprarBoletos">Confirmar Compra</button>
<!-- Botón para regresar -->
<a href="inicio.html">
<button type="button" class="regresar-btn">Regresar</button>
</a>
</div>
</form>
<script src="js/comprar-boleto.js"></script>
</body>
</html>

30
comprobante.html Normal file
View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Comprobante de Compra</title>
<link rel="stylesheet" href="css/comprobante.css">
</head>
<body>
<h1>Comprobante de Compra</h1>
<div id="comprobanteInfo">
<h2 id="evento"></h2>
<p id="fecha"></p>
<p id="lugar"></p>
<p id="cantidad"></p>
<p id="precio"></p>
<p id="total"></p>
<h3>Asientos seleccionados:</h3>
<ul id="asientos"></ul>
</div>
<h3>¡Gracias por tu compra!</h3>
<p>Esperamos que disfrutes del evento.</p>
<button onclick="window.print();">Imprimir Comprobante</button>
<a href="inicio.html">
<button type="button">Salir</button>
</a>
<script src="js/comprobante.js"></script>
</body>
</html>

View File

@ -0,0 +1,65 @@
<?php
header("Content-Type: text/html");
require_once "conexion-bd.php";
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
http_response_code(405);
echo "Método no permitido";
exit();
}
// 🔸 Mover eventos pasados a historial_eventos
$sql_mover = "INSERT INTO historial_eventos (id, artista, fecha, lugar_id, precio, descripcion, imagen)
SELECT id, artista, fecha, lugar_id, precio, descripcion, imagen
FROM conciertos
WHERE fecha < NOW()";
if (!$conn->query($sql_mover)) {
error_log("Error al mover eventos pasados: " . $conn->error);
}
// 🔸 Eliminar eventos ya movidos de la tabla conciertos
$sql_eliminar = "DELETE FROM conciertos WHERE fecha < NOW()";
if (!$conn->query($sql_eliminar)) {
error_log("Error al eliminar eventos pasados: " . $conn->error);
}
// 🔹 Continuar con la lógica de consulta y presentación de eventos actuales
$sql = "SELECT c.id, c.artista, c.fecha, c.imagen, c.descripcion, c.precio,
l.nombre AS lugar, l.capacidad AS cupos_totales,
(l.capacidad - COUNT(va.id)) AS cupos_disponibles
FROM conciertos c
JOIN lugares l ON c.lugar_id = l.id
LEFT JOIN ventas v ON v.evento_id = c.id
LEFT JOIN ventas_asientos va ON va.venta_id = v.id
GROUP BY c.id
ORDER BY c.fecha ASC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($concierto = $result->fetch_assoc()) {
$imagen = !empty($concierto['imagen']) ? htmlspecialchars($concierto['imagen']) : "img/images.jpg";
echo '<div class="evento">
<img src="' . $imagen . '" alt="Concierto de ' . htmlspecialchars($concierto['artista']) . '">
<h3>Concierto de ' . htmlspecialchars($concierto['artista']) . '</h3>
<p>' . htmlspecialchars($concierto['descripcion']) . '</p>
<p>' . date("d M Y - H:i", strtotime($concierto['fecha'])) . ' - ' . htmlspecialchars($concierto['lugar']) . '</p>
<p>Precio por boleto: $' . number_format($concierto['precio'], 2) . '</p>
<p>Cupos disponibles: ' . $concierto['cupos_disponibles'] . '</p>';
if ($concierto['cupos_disponibles'] > 0) {
echo '<button onclick="window.location.href=\'comprar-boletos.html?id=' . $concierto['id'] . '\'">Comprar boletos</button>';
} else {
echo '<button disabled style="background-color: gray; cursor: not-allowed;">Agotado</button>';
}
echo '</div>';
}
} else {
echo "<p>No hay conciertos disponibles.</p>";
}
$conn->close();
?>

View File

@ -0,0 +1,21 @@
<?php
require_once "conexion-bd.php";
if (!isset($_GET['id'])) {
die("Error: No se especificó un evento.");
}
$id_evento = intval($_GET['id']);
$sql_evento = "SELECT * FROM conciertos WHERE id = ?";
$stmt = $conn->prepare($sql_evento);
$stmt->bind_param("i", $id_evento);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
die("Error: El evento no existe.");
}
$evento = $result->fetch_assoc();
?>

View File

@ -0,0 +1,64 @@
<?php
header("Content-Type: application/json");
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once "conexion-bd.php";
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
echo json_encode(["error" => "No se especificó una compra válida."]);
exit();
}
$id_compra = intval($_GET['id']);
$sql = "SELECT ventas.id, conciertos.artista, conciertos.fecha, lugares.nombre AS lugar,
ventas.cantidad, ventas.total, conciertos.precio
FROM ventas
JOIN conciertos ON ventas.evento_id = conciertos.id
JOIN lugares ON conciertos.lugar_id = lugares.id
WHERE ventas.id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id_compra);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
echo json_encode(["error" => "La compra no existe."]);
exit();
}
$compra = $result->fetch_assoc();
$check_table = $conn->query("SHOW TABLES LIKE 'ventas_asientos'");
if ($check_table->num_rows === 0) {
echo json_encode(["error" => "Error: La tabla de asientos vendidos no está creada."]);
exit();
}
$sql_asientos = "SELECT numero_asiento FROM asientos
WHERE id IN (SELECT asiento_id FROM ventas_asientos WHERE venta_id = ?)";
$stmt_asientos = $conn->prepare($sql_asientos);
$stmt_asientos->bind_param("i", $id_compra);
$stmt_asientos->execute();
$result_asientos = $stmt_asientos->get_result();
$asientos = [];
while ($row = $result_asientos->fetch_assoc()) {
$asientos[] = $row['numero_asiento'];
}
echo json_encode([
"artista" => $compra['artista'],
"fecha" => date("d M Y - H:i", strtotime($compra['fecha'])),
"lugar" => $compra['lugar'],
"cantidad" => $compra['cantidad'],
"precio" => number_format($compra['precio'], 2),
"total" => number_format($compra['total'], 2),
"asientos" => $asientos
], JSON_UNESCAPED_UNICODE);
$stmt->close();
$stmt_asientos->close();
$conn->close();
?>

View File

@ -0,0 +1,95 @@
<?php
header("Content-Type: application/json");
require_once "conexion-bd.php";
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(["mensaje" => "Método no permitido."]);
exit();
}
$artista = $conn->real_escape_string($_POST['artista']);
$fecha = $conn->real_escape_string($_POST['fecha']);
$lugar_id = intval($_POST['lugar_id']);
$precio = isset($_POST['precio']) ? floatval($_POST['precio']) : 0;
$descripcion = isset($_POST['descripcion']) ? $conn->real_escape_string($_POST['descripcion']) : "";
// Validar precio
if ($precio <= 0) {
echo json_encode(["mensaje" => "Error: El precio debe ser un número mayor a 0."]);
exit();
}
// Obtener capacidad del lugar
$sql_capacidad = "SELECT capacidad FROM lugares WHERE id = ?";
$stmt = $conn->prepare($sql_capacidad);
$stmt->bind_param("i", $lugar_id);
$stmt->execute();
$result = $stmt->get_result();
$lugar = $result->fetch_assoc();
if (!$lugar) {
echo json_encode(["mensaje" => "Error: El lugar seleccionado no existe."]);
exit();
}
$capacidad = $lugar['capacidad'];
// 🔹 Manejar subida del archivo (imagen)
$imagen_path = "";
if (isset($_FILES['imagen']) && $_FILES['imagen']['error'] === UPLOAD_ERR_OK) {
$imagen_nombre = basename($_FILES['imagen']['name']);
$imagen_extension = strtolower(pathinfo($imagen_nombre, PATHINFO_EXTENSION));
// Validar extensión permitida
$extensiones_permitidas = ['jpg', 'jpeg', 'png', 'gif'];
if (!in_array($imagen_extension, $extensiones_permitidas)) {
echo json_encode(["mensaje" => "Error: Formato de imagen no permitido."]);
exit();
}
// Carpeta destino para las imágenes subidas
$carpeta_destino = "../img/eventos/";
if (!is_dir($carpeta_destino)) {
mkdir($carpeta_destino, 0777, true);
}
// Crear nombre único para evitar conflictos
$nuevo_nombre = uniqid('evento_', true) . '.' . $imagen_extension;
$imagen_path = $carpeta_destino . $nuevo_nombre;
// Guardar archivo en servidor
if (!move_uploaded_file($_FILES['imagen']['tmp_name'], $imagen_path)) {
echo json_encode(["mensaje" => "Error al guardar la imagen."]);
exit();
}
// Guardar ruta relativa para acceder desde HTML
$imagen_path = "img/eventos/" . $nuevo_nombre;
}
// Insertar el evento incluyendo la imagen
$sql = "INSERT INTO conciertos (artista, fecha, lugar_id, precio, descripcion, imagen) VALUES (?, ?, ?, ?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssidss", $artista, $fecha, $lugar_id, $precio, $descripcion, $imagen_path);
if ($stmt->execute()) {
$evento_id = $conn->insert_id;
// Generar asientos según capacidad
$asientos_insert = $conn->prepare("INSERT INTO asientos (lugar_id, numero_asiento) VALUES (?, ?)");
for ($i = 1; $i <= $capacidad; $i++) {
$fila = chr(65 + floor(($i - 1) / 10));
$numero_asiento = $fila . (($i % 10 == 0) ? 10 : $i % 10);
$asientos_insert->bind_param("is", $lugar_id, $numero_asiento);
$asientos_insert->execute();
}
echo json_encode(["mensaje" => "Evento creado exitosamente."]);
} else {
echo json_encode(["mensaje" => "Error al crear el evento: " . $conn->error]);
}
$stmt->close();
$conn->close();
?>

View File

@ -0,0 +1,39 @@
<?php
header("Content-Type: application/json");
require_once "conexion-bd.php";
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
echo json_encode(["error" => "No se especificó un evento válido."]);
exit();
}
$id_evento = intval($_GET['id']);
$sql = "SELECT conciertos.id, conciertos.artista, conciertos.fecha, lugares.nombre AS lugar,
conciertos.precio, (lugares.capacidad - conciertos.cupos_ocupados) AS cupos_disponibles
FROM conciertos
JOIN lugares ON conciertos.lugar_id = lugares.id
WHERE conciertos.id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id_evento);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
echo json_encode(["error" => "El evento no existe."]);
exit();
}
$evento = $result->fetch_assoc();
echo json_encode([
"artista" => $evento['artista'],
"fecha" => date("d M Y - H:i", strtotime($evento['fecha'])),
"lugar" => $evento['lugar'],
"precio" => number_format($evento['precio'], 2),
"cupos_disponibles" => $evento['cupos_disponibles']
]);
$stmt->close();
$conn->close();
?>

View File

@ -0,0 +1,48 @@
<?php
header("Content-Type: application/json");
require_once "conexion-bd.php";
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
echo json_encode(["error" => "Método no permitido."]);
exit();
}
$fecha_inicio = isset($_GET['fecha_inicio']) ? $_GET['fecha_inicio'].' 00:00:00' : '';
$fecha_fin = isset($_GET['fecha_fin']) ? $_GET['fecha_fin'].' 23:59:59' : '';
if (empty($fecha_inicio) || empty($fecha_fin)) {
echo json_encode(["error" => "Debes proporcionar un rango de fechas."]);
exit();
}
$sql = "SELECT ventas.id, ventas.fecha_venta, conciertos.artista, lugares.nombre AS lugar,
asientos.numero_asiento, ventas_asientos.precio
FROM ventas
JOIN conciertos ON ventas.evento_id = conciertos.id
JOIN lugares ON conciertos.lugar_id = lugares.id
JOIN ventas_asientos ON ventas.id = ventas_asientos.venta_id
JOIN asientos ON ventas_asientos.asiento_id = asientos.id
WHERE ventas.fecha_venta BETWEEN ? AND ?
ORDER BY ventas.fecha_venta DESC";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $fecha_inicio, $fecha_fin);
$stmt->execute();
$result = $stmt->get_result();
$ventas = [];
while ($row = $result->fetch_assoc()) {
$ventas[] = [
'fecha_venta' => $row['fecha_venta'],
'artista' => $row['artista'],
'lugar' => $row['lugar'],
'numero_asiento' => $row['numero_asiento'],
'precio' => $row['precio']
];
}
echo json_encode(["ventas" => $ventas], JSON_UNESCAPED_UNICODE);
$stmt->close();
$conn->close();
?>

View File

@ -15,10 +15,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($password === $usuario['password']) {
$_SESSION['vendedor_id'] = $usuario['id'];
$_SESSION['vendedor_nombre'] = $usuario['nombre'];
header("Location: ../main.html");
header("Location: ../inicio.html");
exit();
} else {
header("Location: login.html?error=" . urlencode("Credenciales incorrectas."));
header("Location: main.html?error=" . urlencode("Credenciales incorrectas."));
exit();
}
} else {
@ -26,4 +26,4 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
exit();
}
}
?>
?>

View File

@ -0,0 +1,42 @@
<?php
header("Content-Type: application/json");
require_once "conexion-bd.php";
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
echo json_encode(["error" => "No se especificó un evento válido."]);
exit();
}
$id_evento = intval($_GET['id']);
// Obtener el lugar del evento
$sql_lugar = "SELECT lugar_id FROM conciertos WHERE id = ?";
$stmt = $conn->prepare($sql_lugar);
$stmt->bind_param("i", $id_evento);
$stmt->execute();
$result = $stmt->get_result();
$evento = $result->fetch_assoc();
if (!$evento) {
echo json_encode(["error" => "El evento no existe."]);
exit();
}
$lugar_id = $evento['lugar_id'];
// Obtener los asientos del lugar
$sql_asientos = "SELECT id, numero_asiento, estado FROM asientos WHERE lugar_id = ?";
$stmt = $conn->prepare($sql_asientos);
$stmt->bind_param("i", $lugar_id);
$stmt->execute();
$result = $stmt->get_result();
$asientos = [];
while ($row = $result->fetch_assoc()) {
$asientos[] = $row;
}
echo json_encode($asientos);
$stmt->close();
$conn->close();
?>

View File

@ -0,0 +1,15 @@
<?php
header("Content-Type: application/json");
require_once "conexion-bd.php";
$sql = "SELECT * FROM lugares";
$result = $conn->query($sql);
$lugares = [];
while ($row = $result->fetch_assoc()) {
$lugares[] = $row;
}
echo json_encode($lugares);
$conn->close();
?>

View File

@ -0,0 +1,105 @@
<?php
header("Content-Type: application/json");
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once "conexion-bd.php";
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(["mensaje" => "Método no permitido."]);
exit();
}
$evento_id = intval($_POST['evento_id']);
$asientos = json_decode($_POST['asientos'], true);
$cantidad = intval($_POST['cantidad']);
if (empty($asientos)) {
echo json_encode(["mensaje" => "Debes seleccionar al menos un asiento."]);
exit();
}
$sql_evento = "SELECT c.precio, c.lugar_id, l.capacidad
FROM conciertos c
JOIN lugares l ON c.lugar_id = l.id
WHERE c.id = ?";
$stmt_evento = $conn->prepare($sql_evento);
$stmt_evento->bind_param("i", $evento_id);
$stmt_evento->execute();
$result_evento = $stmt_evento->get_result();
$evento = $result_evento->fetch_assoc();
if (!$evento) {
echo json_encode(["mensaje" => "Error: No se encontró el evento."]);
exit();
}
$precio_unitario = $evento['precio'];
$lugar_id = $evento['lugar_id'];
$capacidad = $evento['capacidad'];
if (count($asientos) > $capacidad) {
echo json_encode(["mensaje" => "Error: Estás intentando comprar más boletos de los permitidos."]);
exit();
}
$total = count($asientos) * $precio_unitario;
// 🔹 Insertar la compra en la tabla `ventas`
$sql = "INSERT INTO ventas (evento_id, cantidad, total) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("iid", $evento_id, $cantidad, $total);
if ($stmt->execute()) {
$id_compra = $conn->insert_id;
// 🔹 Actualizar el estado de los asientos y obtener su ID
$sql_asiento_update = "UPDATE asientos SET estado = 'vendido' WHERE numero_asiento = ? AND lugar_id = ?";
$stmt_asiento_update = $conn->prepare($sql_asiento_update);
$sql_obtener_asiento_id = "SELECT id FROM asientos WHERE numero_asiento = ? AND lugar_id = ?";
$stmt_asiento_id = $conn->prepare($sql_obtener_asiento_id);
// 🔹 Insertar registro en ventas_asientos con precio real
$sql_ventas_asientos = "INSERT INTO ventas_asientos (venta_id, asiento_id, precio) VALUES (?, ?, ?)";
$stmt_ventas_asientos = $conn->prepare($sql_ventas_asientos);
foreach ($asientos as $asiento) {
$asientoSeleccionado = trim($asiento);
// Actualizar estado del asiento
$stmt_asiento_update->bind_param("si", $asientoSeleccionado, $lugar_id);
if (!$stmt_asiento_update->execute()) {
echo json_encode(["mensaje" => "Error actualizando asiento: " . $stmt_asiento_update->error]);
exit();
}
// Obtener ID del asiento
$stmt_asiento_id->bind_param("si", $asientoSeleccionado, $lugar_id);
$stmt_asiento_id->execute();
$result_asiento = $stmt_asiento_id->get_result();
$asiento_data = $result_asiento->fetch_assoc();
if (!$asiento_data) {
echo json_encode(["mensaje" => "Error: asiento no encontrado."]);
exit();
}
$asiento_id = $asiento_data['id'];
// Insertar en ventas_asientos con precio real del evento
$stmt_ventas_asientos->bind_param("iid", $id_compra, $asiento_id, $precio_unitario);
if (!$stmt_ventas_asientos->execute()) {
echo json_encode(["mensaje" => "Error al insertar venta_asiento: " . $stmt_ventas_asientos->error]);
exit();
}
}
echo json_encode(["mensaje" => "Compra realizada exitosamente.", "id_compra" => $id_compra]);
} else {
echo json_encode(["mensaje" => "Error al procesar la compra: " . $conn->error]);
}
$stmt->close();
$conn->close();
?>

50
crear-evento.html Normal file
View File

@ -0,0 +1,50 @@
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Crear Evento - TicketCompany</title>
<link rel="stylesheet" href="css/crear-evento.css">
</head>
<body>
<header>
<h1>Crear Evento</h1>
</header>
<main>
<div id="mensaje"></div>
<form id="crearConciertoForm" enctype="multipart/form-data">
<label for="artista">Artista:</label>
<input type="text" id="artista" name="artista" required>
<label for="fecha">Fecha:</label>
<input type="datetime-local" id="fecha" name="fecha" required>
<label for="lugar">Lugar:</label>
<select id="lugar" name="lugar_id" required>
<option value="">Seleccione un lugar</option>
</select>
<p>Capacidad máxima: <span id="capacidad">-</span></p>
<label for="precio">Precio por Boleto:</label>
<input type="number" id="precio" name="precio" min="1" step="0.01" required>
<label for="descripcion">Descripción:</label>
<textarea id="descripcion" name="descripcion"></textarea>
<label for="imagen">Banner:</label>
<label>(Recomendado 1400x400)</label>
<input type="file" id="imagen" name="imagen" accept="image/*">
<div class="boton-container">
<button type="submit">Crear Evento</button>
<a href="inicio.html">
<button type="button" class="regresar-btn">Regresar</button>
</a>
</div>
</form>
</main>
<script src="js/obtener-lugares.js"></script>
<script src="js/crear-evento.js"></script>
</body>
</html>

150
css/comprar-boletos.css Normal file
View File

@ -0,0 +1,150 @@
/* Estilo general */
body {
background-color: #141414; /* Fondo negro */
color: #FFFFFF; /* Texto blanco para contraste */
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
/* Estilo del título */
h1 {
color: #DAA520; /* Color dorado */
text-align: center;
padding: 20px;
font-size: 2.5rem;
}
/* Información del evento */
#eventoInfo {
text-align: center;
margin: 20px 0;
}
#eventoInfo p {
font-size: 1.2rem;
color: #FFFFFF; /* Texto blanco */
}
/* Estilo para el formulario */
#formCompra {
margin: 0 auto;
max-width: 600px;
background-color: #1c1c1c; /* Fondo gris oscuro */
padding: 20px;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.6);
}
/* Encabezados dentro del formulario */
h2, h3 {
color: #DAA520; /* Color dorado */
text-align: center;
}
/* Estilo de los campos de entrada */
input[type="number"] {
width: 100%;
padding: 10px;
margin-top: 10px;
border: 1px solid #DAA520; /* Borde dorado */
background-color: #333333; /* Fondo gris oscuro */
color: #FFFFFF; /* Texto blanco */
font-size: 1rem;
border-radius: 5px;
}
/* Estilo del mapa de asientos */
#mapa-asientos {
margin: 20px 0;
background-color: #222222; /* Fondo más oscuro para el mapa */
height: 300px;
border-radius: 10px;
border: 1px solid #DAA520; /* Borde dorado */
}
/* Estilo del botón */
button[type="button"] {
background-color: #DAA520; /* Fondo dorado */
color: #141414; /* Texto negro */
border: none;
padding: 15px;
width: 100%;
font-size: 1.2rem;
border-radius: 5px;
cursor: pointer;
margin-top: 20px;
transition: background-color 0.3s;
}
button[type="button"]:hover {
background-color: #FFD700; /* Color dorado más brillante al pasar el cursor */
}
.regresar-btn {
background-color: #555; /* Gris oscuro definido */
color: #fff; /* Color blanco para contraste */
font-size: 1rem;
padding: 15px 30px;
border: none;
border-radius: 5px;
cursor: pointer;
text-align: center;
display: inline-block;
transition: background-color 0.3s ease;
margin-left: 20px;
}
.regresar-btn:hover {
background-color: #777; /* Gris ligeramente más claro al pasar el mouse */
}
/* Estilos para el contenedor de asientos */
#mapa-asientos {
margin: 20px auto;
background-color: #222222;
border-radius: 10px;
border: 1px solid #DAA520;
padding: 10px;
display: flex;
flex-wrap: wrap; /* Permite que los botones se ajusten al tamaño del contenedor */
justify-content: center; /* Centra los botones dentro del contenedor */
gap: 5px; /* Espacio entre botones */
max-width: 900px; /* ajusta esto según tu preferencia */
height: auto; /* altura automática según contenido */
}
/* Estilos para cada asiento individual */
.seat {
width: 30px; /* Botón más pequeño */
height: 30px; /* Botón más pequeño */
font-size: 0.7rem; /* Fuente más pequeña */
margin: 2px;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
display: flex;
justify-content: center;
align-items: center;
}
/* Asiento disponible */
.seat.disponible {
background-color: #3A8BFF; /* azul */
color: white;
}
/* Asiento vendido */
.seat.vendido {
background-color: #FF4444; /* rojo */
color: white;
cursor: not-allowed;
}
/* Asiento seleccionado */
.seat.seleccionado {
background-color: #44FF44; /* verde */
color: white;
}

95
css/comprobante.css Normal file
View File

@ -0,0 +1,95 @@
/* Estilo general */
body {
background-color: rgb(20, 20, 20); /* Fondo negro */
color: rgb(255, 255, 255); /* Texto blanco para contraste */
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
text-align: center; /* Centra todo el contenido */
}
/* Estilo del título */
h1 {
color: rgb(218, 165, 32); /* Color dorado */
font-size: 2.5rem;
margin-top: 20px;
text-transform: uppercase; /* Mayúsculas */
}
/* Estilo de los subtítulos */
h2, h3 {
color: rgb(218, 165, 32); /* Color dorado */
font-size: 1.8rem;
margin: 10px 0;
}
/* Información del comprobante */
#comprobanteInfo {
background-color: rgb(20, 20, 20); /* Fondo negro */
color: rgb(255, 255, 255); /* Texto blanco */
padding: 20px;
border-radius: 10px;
margin: 20px auto;
max-width: 600px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.6);
}
/* Estilo para los párrafos */
#comprobanteInfo p {
font-size: 1.2rem;
margin: 5px 0;
}
/* Estilo para los botones */
button {
background-color: rgb(218, 165, 32); /* Fondo dorado */
color: rgb(20, 20, 20); /* Texto negro */
border: none;
padding: 15px;
width: 200px;
font-size: 1.2rem;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s;
margin: 10px;
}
button:hover {
background-color: #FFD700; /* Dorado más brillante al pasar el cursor */
}
/* Estilo de la lista de asientos seleccionados */
#asientos {
list-style-type: none;
padding: 0;
margin: 0;
}
#asientos li {
background-color: rgb(30, 30, 30); /* Fondo gris oscuro */
padding: 10px;
margin: 5px 0;
border-radius: 5px;
}
/* Enlaces */
a {
text-decoration: none;
}
/* Estilo para la sección de agradecimiento */
h3 + p {
font-size: 1.2rem;
color: rgb(255, 255, 255); /* Blanco */
margin-top: 20px;
}
/* Ajustes para la página de impresión */
@media print {
body {
font-size: 1rem;
}
button {
display: none; /* Ocultar botones al imprimir */
}
}

175
css/crear-evento.css Normal file
View File

@ -0,0 +1,175 @@
body {
font-family: Arial, sans-serif;
background-color: rgb(20, 20, 20);
color: rgb(255, 255, 255);
margin: 0;
padding: 0;
}
header {
background-color: rgb(20, 20, 20);
text-align: center;
padding: 20px;
border-bottom: 2px solid rgb(218, 165, 32);
}
header h1 {
color: rgb(218, 165, 32);
margin: 0;
}
main {
padding: 40px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.input-group {
margin-bottom: 20px;
width: 100%;
}
label {
font-size: 1.1rem;
font-weight: bold;
color: rgb(255, 255, 255);
display: block;
margin-bottom: 10px;
}
input[type="text"],
input[type="datetime-local"],
input[type="number"],
textarea {
width: 100%;
padding: 10px;
font-size: 1rem;
border: 1px solid rgb(218, 165, 32);
border-radius: 5px;
background-color: rgb(30, 30, 30);
color: rgb(255, 255, 255);
margin-bottom: 15px;
}
textarea {
resize: vertical;
height: 150px;
}
button {
background-color: rgb(218, 165, 32);
color: rgb(20, 20, 20);
font-size: 1rem;
padding: 15px 30px;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
}
button:hover {
background-color: rgb(255, 215, 50);
}
.boton-container {
display: flex;
justify-content: space-between;
width: 100%;
max-width: 500px;
margin-top: 20px;
gap: 60px;
}
.regresar-btn {
background-color: rgb(218, 165, 32);
color: rgb(20, 20, 20);
font-size: 1rem;
padding: 15px 30px;
border: none;
border-radius: 5px;
cursor: pointer;
text-align: center;
display: inline-block;
transition: background-color 0.3s ease;
margin-left: 20px;
}
.regresar-btn:hover {
background-color: rgb(255, 215, 50);
}
#mensaje {
color: rgb(255, 0, 0);
margin-bottom: 20px;
}
/* Estilos para inputs tipo file y select */
input[type="file"],
select {
width: 100%;
padding: 10px;
font-size: 1rem;
border: 1px solid rgb(218, 165, 32);
border-radius: 5px;
background-color: rgb(30, 30, 30);
color: rgb(255, 255, 255);
margin-bottom: 15px;
}
/* Personalizar el botón de subir archivo */
input[type="file"]::file-selector-button {
background-color: rgb(218, 165, 32);
color: rgb(20, 20, 20);
border: none;
padding: 8px 12px;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
font-weight: bold;
}
input[type="file"]::file-selector-button:hover {
background-color: rgb(255, 215, 50);
}
/* Estilos adicionales para desplegable (select) */
select option {
background-color: rgb(30, 30, 30);
color: rgb(255, 255, 255);
}
/* Evitar color blanco en navegadores específicos */
input[type="file"]::-webkit-file-upload-button {
background-color: rgb(218, 165, 32);
color: rgb(20, 20, 20);
border: none;
padding: 8px 12px;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
font-weight: bold;
}
input[type="file"]::-webkit-file-upload-button:hover {
background-color: rgb(255, 215, 50);
}
.regresar-btn {
background-color: #555; /* Gris oscuro definido */
color: #fff; /* Color blanco para contraste */
font-size: 1rem;
padding: 15px 30px;
border: none;
border-radius: 5px;
cursor: pointer;
text-align: center;
display: inline-block;
transition: background-color 0.3s ease;
margin-left: 20px;
}
.regresar-btn:hover {
background-color: #777; /* Gris ligeramente más claro al pasar el mouse */
}

147
css/inicio.css Normal file
View File

@ -0,0 +1,147 @@
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #141414;
margin: 0;
padding: 0;
color: #FFFFFF;
}
header {
background-color: #141414;
padding: 20px 0;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
}
nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 40px;
}
.logo {
font-size: 24px;
font-weight: bold;
color: #DAA520;
}
ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
}
ul li {
margin-left: 20px;
}
ul li a {
color: #DAA520;
text-decoration: none;
font-size: 16px;
transition: color 0.3s;
}
ul li a:hover {
color: #b58c17;
}
.banner {
background-color: #141414;
color: #FFFFFF;
text-align: center;
padding: 80px 20px;
}
.banner h1 {
font-size: 40px;
font-weight: 600;
color: #DAA520;
}
.banner p {
font-size: 18px;
color: #FFFFFF;
}
.eventos {
padding: 40px 20px;
text-align: center;
}
.eventos h2 {
font-size: 30px;
color: #DAA520;
margin-bottom: 20px;
}
.evento {
background-color: #333333;
margin-bottom: 30px;
border-radius: 8px;
overflow: hidden;
padding: 20px;
text-align: left;
transition: transform 0.3s;
}
.evento:hover {
transform: scale(1.05);
}
.evento img {
width: 100%;
height: auto;
border-radius: 6px;
}
.evento h3 {
font-size: 24px;
color: #DAA520;
margin: 10px 0;
}
.evento p {
font-size: 16px;
color: #FFFFFF;
}
.evento button {
background-color: #DAA520;
color: #141414;
padding: 12px 20px;
border: none;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s;
margin-top: 10px;
}
.evento button:hover {
background-color: #b58c17;
}
#buscarEvento {
width: 50%;
padding: 12px 20px;
border-radius: 6px;
border: none;
margin-top: 20px;
background-color: #333333;
color: #FFFFFF;
font-size: 16px;
outline: none;
transition: box-shadow 0.3s, background-color 0.3s;
}
#buscarEvento::placeholder {
color: #b3b3b3;
}
#buscarEvento:focus {
background-color: #424242;
box-shadow: 0 0 8px #DAA520;
}

View File

@ -1,58 +0,0 @@
body {
background-color: #2980b9;
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
.login-container {
width: 320px;
margin: 100px auto;
background: #fff;
padding: 25px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.login-container h2 {
text-align: center;
margin-bottom: 20px;
}
.input-group {
margin-bottom: 15px;
}
.input-group label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
.input-group input {
width: 100%;
padding: 8px;
box-sizing: border-box;
}
button {
width: 100%;
padding: 10px;
background-color: #3498db;
color: #fff;
border: none;
cursor: pointer;
border-radius: 3px;
font-size: 16px;
}
button:hover {
background-color: #2980b9;
}
#error {
margin-bottom: 15px;
color: red;
text-align: center;
}

View File

@ -1,55 +1,79 @@
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #141414;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
color: #FFFFFF;
}
header {
background-color: #333;
color: white;
padding: 10px 0;
text-align: center;
.login-container {
background: #141414;
border-radius: 10px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
padding: 40px;
width: 100%;
max-width: 360px;
box-sizing: border-box;
}
nav ul {
list-style: none;
padding: 0;
.login-container h2 {
font-size: 24px;
font-weight: 600;
text-align: center;
margin-bottom: 20px;
color: #DAA520;
}
nav ul li {
display: inline;
margin: 0 15px;
#error {
color: #e74c3c;
font-size: 14px;
margin-bottom: 20px;
text-align: center;
}
nav ul li a {
color: white;
text-decoration: none;
.input-group {
margin-bottom: 20px;
}
.banner {
color: white;
text-align: center;
padding: 100px 20px;
.input-group label {
display: block;
margin-bottom: 8px;
font-size: 14px;
color: #DAA520;
}
.eventos {
text-align: center;
padding: 20px;
.input-group input {
width: 100%;
padding: 12px;
font-size: 16px;
border: 1px solid #333333;
border-radius: 6px;
box-sizing: border-box;
background-color: #333333;
color: #FFFFFF;
transition: border-color 0.3s;
}
.evento {
display: inline-block;
background: white;
padding: 15px;
margin: 10px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.evento img {
max-width: 100%;
border-radius: 5px;
.input-group input:focus {
border-color: #DAA520;
outline: none;
}
button {
background: #28a745;
color: white;
border: none;
padding: 10px;
cursor: pointer;
width: 100%;
padding: 14px;
background-color: #DAA520;
color: #141414;
border: none;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s;
}
button:hover {
background: #218838;
background-color: #b58c17;
}

128
css/reporte-ventas.css Normal file
View File

@ -0,0 +1,128 @@
/* Estilos generales del reporte */
body {
font-family: Arial, sans-serif;
background-color: #141414;
color: #fff;
margin: 0;
padding: 0;
}
h1, h2 {
color: #DAA520;
text-align: center;
}
form {
background-color: #1E1E1E;
padding: 20px;
border-radius: 8px;
max-width: 600px;
margin: 20px auto;
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
gap: 10px;
}
label {
color: #fff;
font-weight: bold;
margin-right: 10px;
}
input[type="date"] {
background-color: #141414;
border: 1px solid #DAA520;
color: #fff;
padding: 8px;
border-radius: 5px;
outline: none;
margin-bottom: 10px;
}
button {
background-color: #DAA520;
color: #141414;
border: none;
padding: 10px 15px;
margin: 5px;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
font-weight: bold;
}
button:hover {
background-color: #FFD732;
}
/* Botón regresar personalizado */
.regresar-btn {
background-color: #555;
color: #fff;
}
.regresar-btn:hover {
background-color: #777;
}
h1, h2 {
color: #DAA520;
text-align: center;
}
table {
width: 90%;
max-width: 900px;
margin: 20px auto;
border-collapse: collapse;
border-radius: 8px;
overflow: hidden;
}
thead {
background-color: #DAA520;
color: #141414;
}
thead th {
padding: 12px;
text-align: center;
}
tbody td {
background-color: #2a2a2a;
padding: 10px;
border-bottom: 1px solid #333;
text-align: center;
}
tbody tr:hover {
background-color: #333;
}
tbody tr:last-child td {
border-bottom: none;
}
tbody td[colspan="5"] {
text-align: center;
color: #bbb;
}
/* Ajustes responsivos */
@media (max-width: 600px) {
form {
flex-direction: column;
}
button {
width: 100%;
margin-top: 10px;
}
table {
width: 95%;
}
}

Binary file not shown.

After

(image error) Size: 8.4 KiB

Binary file not shown.

After

(image error) Size: 14 KiB

Binary file not shown.

After

(image error) Size: 110 KiB

Binary file not shown.

Before

(image error) Size: 9.9 KiB

Binary file not shown.

Before

(image error) Size: 8.0 KiB

BIN
img/images.jpg Normal file

Binary file not shown.

After

(image error) Size: 110 KiB

BIN
img/jh.jpg Normal file

Binary file not shown.

After

(image error) Size: 328 KiB

30
inicio.html Normal file
View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TicketCompany</title>
<link rel="stylesheet" href="css/inicio.css">
</head>
<body>
<header>
<nav>
<div class="logo">TicketCompany</div>
<ul>
<li><a href="crear-evento.html">Crear evento</a></li>
<li><a href="reporte-ventas.html">Generar reporte</a></li>
<li><a href="main.html">Cerrar sesión</a></li>
</ul>
</nav>
</header>
<section class="banner">
<h1>Encuentra tus eventos favoritos</h1>
<p>Compra boletos para tu artista favorito.</p>
<input type="text" id="buscarEvento" placeholder="Buscar evento...">
</section>
<section class="eventos">
</section>
<script src="js/cargar-evento.js"></script>
</body>
</html>

33
js/cargar-evento.js Normal file
View File

@ -0,0 +1,33 @@
document.addEventListener("DOMContentLoaded", function() {
const eventosContainer = document.querySelector(".eventos");
const buscador = document.getElementById("buscarEvento");
let eventosOriginales = "";
fetch("controladores/cargar-evento.php")
.then(response => {
if (!response.ok) {
throw new Error("Error al cargar los conciertos");
}
return response.text();
})
.then(data => {
eventosOriginales = data;
eventosContainer.innerHTML = data;
})
.catch(error => console.error("Error al cargar los conciertos:", error));
buscador.addEventListener("input", function() {
const terminoBusqueda = buscador.value.toLowerCase();
const tempElement = document.createElement('div');
tempElement.innerHTML = eventosOriginales;
const eventosFiltrados = Array.from(tempElement.querySelectorAll('.evento'))
.filter(evento => evento.textContent.toLowerCase().includes(terminoBusqueda))
.map(evento => evento.outerHTML)
.join("");
eventosContainer.innerHTML = eventosFiltrados;
});
});

129
js/comprar-boleto.js Normal file
View File

@ -0,0 +1,129 @@
document.addEventListener("DOMContentLoaded", function () {
const params = new URLSearchParams(window.location.search);
const idEvento = params.get("id");
if (!idEvento) {
document.getElementById("eventoInfo").innerHTML = "<p>Error: No se especificó un evento.</p>";
return;
}
fetch("controladores/detalles-evento.php?id=" + idEvento)
.then(response => response.json())
.then(data => {
console.log("Respuesta del servidor:", data);
if (!data || data.error) {
document.getElementById("eventoInfo").innerHTML = "<p>" + (data.error || "Error desconocido.") + "</p>";
return;
}
document.getElementById("titulo").textContent = "Comprar Boletos para " + data.artista;
document.getElementById("fecha").textContent = "Fecha: " + data.fecha;
document.getElementById("lugar").textContent = "Lugar: " + data.lugar;
document.getElementById("evento_id").value = idEvento;
document.getElementById("precioBoleto").textContent = "$" + data.precio;
let inputCantidad = document.getElementById("cantidad");
if (inputCantidad) {
inputCantidad.setAttribute("max", data.cupos_disponibles);
} else {
console.warn("Advertencia: El campo 'cantidad' no se encontró en el HTML.");
}
})
.catch(error => {
console.error("Error al obtener datos del evento:", error);
document.getElementById("eventoInfo").innerHTML = "<p>Error al cargar los detalles del evento.</p>";
});
});
// Lógica de selección de asientos
document.addEventListener("DOMContentLoaded", function () {
const params = new URLSearchParams(window.location.search);
const eventoId = params.get("id");
fetch(`controladores/obtener-asientos.php?id=${eventoId}`)
.then(response => response.json())
.then(asientos => {
const contenedor = document.getElementById("mapa-asientos");
contenedor.innerHTML = "";
asientos.forEach(asiento => {
let btn = document.createElement("button");
btn.textContent = asiento.numero_asiento;
btn.classList.add('seat', asiento.estado === "disponible" ? "disponible" : "vendido");
if (asiento.estado === "vendido") {
btn.disabled = true;
} else {
btn.addEventListener("click", function (event) {
event.preventDefault();
let cantidadBoletos = parseInt(document.getElementById("cantidad").value) || 0;
let seleccionados = document.querySelectorAll(".seleccionado").length;
if (this.classList.contains("seleccionado")) {
this.classList.remove("seleccionado");
} else if (seleccionados < cantidadBoletos) {
this.classList.add("seleccionado");
} else {
alert("Has seleccionado el número máximo de boletos.");
}
});
}
contenedor.appendChild(btn);
});
})
.catch(error => console.error("Error al cargar los asientos:", error));
});
// Confirmación de la compra
document.getElementById("comprarBoletos").addEventListener("click", function (event) {
event.preventDefault();
let asientosSeleccionados = [];
document.querySelectorAll(".seleccionado").forEach(btn => {
asientosSeleccionados.push(btn.textContent);
});
console.log("Asientos seleccionados antes de enviar:", asientosSeleccionados);
if (asientosSeleccionados.length === 0) {
alert("Debes seleccionar al menos un asiento antes de confirmar la compra.");
return;
}
let cantidadBoletos = parseInt(document.getElementById("cantidad").value) || 0;
if (asientosSeleccionados.length !== cantidadBoletos) {
alert("Debes seleccionar exactamente " + cantidadBoletos + " asientos.");
return;
}
let confirmacion = confirm("¿Estás seguro de realizar la compra?");
if (!confirmacion) {
return;
}
let formData = new FormData(document.getElementById("formCompra"));
formData.append("asientos", JSON.stringify(asientosSeleccionados));
console.log("Datos enviados:", Object.fromEntries(formData));
fetch("controladores/procesar-compra.php", {
method: "POST",
body: formData,
credentials: 'include'
})
.then(response => response.json())
.then(data => {
console.log("Respuesta del servidor:", data);
if (data.mensaje.includes("exitosamente")) {
alert("Compra realizada exitosamente.");
window.location.href = "comprobante.html?id=" + data.id_compra;
} else {
alert("Error en la compra: " + data.mensaje);
}
})
.catch(error => console.error("Error al procesar la compra:", error));
});

40
js/comprobante.js Normal file
View File

@ -0,0 +1,40 @@
document.addEventListener("DOMContentLoaded", function () {
const params = new URLSearchParams(window.location.search);
const idCompra = params.get("id");
console.log(idCompra);
if (!idCompra) {
document.getElementById("comprobanteInfo").innerHTML = "<p>Error: No se especificó una compra.</p>";
return;
}
fetch("controladores/comprobante.php?id=" + idCompra)
.then(response => response.json())
.then(data => {
console.log("Datos del comprobante recibidos:", data);
if (data.error) {
document.getElementById("comprobanteInfo").innerHTML = "<p>" + data.error + "</p>";
} else {
document.getElementById("evento").textContent = "Evento: " + data.artista;
document.getElementById("fecha").textContent = "Fecha: " + data.fecha;
document.getElementById("lugar").textContent = "Lugar: " + data.lugar;
document.getElementById("cantidad").textContent = "Boletos Comprados: " + data.cantidad;
document.getElementById("total").textContent = "Total Pagado: $" + data.total;
document.getElementById("precio").textContent = "Precio por boleto: $" + data.precio;
let listaAsientos = document.getElementById("asientos");
listaAsientos.innerHTML = "";
data.asientos.forEach(asiento => {
let li = document.createElement("li");
li.textContent = asiento;
listaAsientos.appendChild(li);
});
}
})
.catch(error => {
document.getElementById("comprobanteInfo").innerHTML = "<p>Error al cargar el comprobante.</p>";
console.error("Error al obtener datos del comprobante:", error);
});
});

57
js/crear-evento.js Normal file
View File

@ -0,0 +1,57 @@
function validateConcertForm() {
var artista = document.getElementById('artista').value.trim();
var fecha = document.getElementById('fecha').value.trim();
var lugar = document.getElementById('lugar').value.trim();
var precio = document.getElementById('precio').value.trim();
if (!artista || !fecha || !lugar || !precio) {
alert("Por favor, completa todos los campos.");
return false;
}
// 🔸 Validación adicional de la fecha
var fechaEvento = new Date(fecha);
var ahora = new Date();
if (fechaEvento <= ahora) {
alert("No puedes crear eventos con fechas anteriores o iguales a la fecha y hora actual.");
return false;
}
return true;
}
function enviarFormulario(event) {
event.preventDefault();
if (!validateConcertForm()) return;
let confirmacion = confirm("¿Estás seguro de que quieres crear este evento?");
if (confirmacion) {
var formData = new FormData(document.getElementById("crearConciertoForm"));
fetch("controladores/crear-evento.php", {
method: "POST",
body: formData,
credentials: 'include'
})
.then(response => response.json())
.then(data => {
document.getElementById("mensaje").textContent = data.mensaje || "Respuesta inesperada del servidor.";
if (data.mensaje) {
document.getElementById("crearConciertoForm").reset();
}
})
.catch(error => {
console.error("Error en la solicitud:", error);
alert("Error al enviar el formulario.");
});
}
}
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("crearConciertoForm").addEventListener("submit", enviarFormulario);
});

19
js/obtener-lugares.js Normal file
View File

@ -0,0 +1,19 @@
document.addEventListener("DOMContentLoaded", function () {
fetch("controladores/obtener-lugares.php")
.then(response => response.json())
.then(data => {
const selectLugar = document.getElementById("lugar");
data.forEach(lugar => {
let option = document.createElement("option");
option.value = lugar.id;
option.textContent = lugar.nombre;
option.dataset.capacidad = lugar.capacidad;
selectLugar.appendChild(option);
});
});
document.getElementById("lugar").addEventListener("change", function () {
let capacidad = this.selectedOptions[0].dataset.capacidad || "No seleccionado";
document.getElementById("capacidad").textContent = capacidad;
});
});

37
js/reporte-ventas.js Normal file
View File

@ -0,0 +1,37 @@
document.getElementById('formReporte').addEventListener('submit', (event) => {
event.preventDefault();
const fechaInicio = document.getElementById('fecha_inicio').value;
const fechaFin = document.getElementById('fecha_fin').value;
fetch(`controladores/generar-reporte.php?fecha_inicio=${fechaInicio}&fecha_fin=${fechaFin}`)
.then(response => response.json())
.then(data => {
const tbody = document.getElementById('resultados');
if (!tbody) {
console.error('Elemento tbody no encontrado.');
return;
}
tbody.innerHTML = '';
if (data.ventas && data.ventas.length > 0) {
data.ventas.forEach(venta => {
tbody.innerHTML += `
<tr>
<td>${venta.fecha_venta}</td>
<td>${venta.artista}</td>
<td>${venta.lugar}</td>
<td>${venta.numero_asiento}</td>
<td>${venta.precio}</td>
</tr>`;
});
} else {
tbody.innerHTML = '<tr><td colspan="5">No hay ventas en este período.</td></tr>';
}
})
.catch(err => {
console.error("Error al generar reporte:", err);
});
});

View File

@ -1,27 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Login - TicketCompany</title>
<link rel="css" href="css/login.css">
</head>
<body>
<div class="login-container">
<h2>Iniciar Sesión</h2>
<?php if(isset($_GET['error'])): ?>
<div id="error"><?php echo htmlspecialchars($_GET['error']); ?></div>
<?php endif; ?>
<form id="loginForm" action="controladores/login.php" method="post">
<div class="input-group">
<label for="email">Correo electrónico</label>
<input type="email" id="email" name="email" required>
</div>
<div class="input-group">
<label for="password">Contraseña</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">Ingresar</button>
</form>
</div>
</body>
</html>

View File

@ -1,46 +1,28 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Venta de Boletos</title>
<link rel="stylesheet" href="css/main.css">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login - TicketCompany</title>
<link rel="stylesheet" href="css/main.css">
</head>
<body>
<header>
<nav>
<div class="logo">TicketCompany</div>
<ul>
<li><a href="login.html">Iniciar sesión</a></li>
</ul>
</nav>
</header>
<section class="banner">
<h1>Encuentra tus eventos favoritos</h1>
<p>Compra boletos para tu artista favorito.</p>
</section>
<section class="eventos">
<h2>Próximos Conciertos</h2>
<div class="evento">
<img src="img/images.jpeg" alt="Evento 1">
<h3>Concierto de Artista X</h3>
<p>15 de marzo - Ciudad de México</p>
<button>Comprar boletos</button>
</div>
<div class="evento">
<img src="evento2.jpg" alt="Evento 2">
<h3>Partido de Fútbol</h3>
<p>20 de abril - Estadio Nacional</p>
<button>Comprar boletos</button>
</div>
<div class="evento">
<img src="evento3.jpg" alt="Evento 3">
<h3>Obra de Teatro</h3>
<p>10 de mayo - Teatro Principal</p>
<button>Comprar boletos</button>
</div>
</section>
<div class="login-container">
<h2>TicketCompany</h2>
<h2>Iniciar Sesión</h2>
<?php if(isset($_GET['error'])): ?>
<div id="error"><?php echo htmlspecialchars($_GET['error']); ?></div>
<?php endif; ?>
<form id="loginForm" action="controladores/login.php" method="post">
<div class="input-group">
<label for="email">Correo electrónico</label>
<input type="email" id="email" name="email" required>
</div>
<div class="input-group">
<label for="password">Contraseña</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">Ingresar</button>
</form>
</div>
</body>
</html>

45
reporte-ventas.html Normal file
View File

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reporte de Ventas</title>
<link rel="stylesheet" href="css/reporte-ventas.css">
</head>
<body>
<h1>Reporte de Ventas</h1>
<form id="formReporte">
<label for="fecha_inicio">Desde:</label>
<input type="date" id="fecha_inicio" name="fecha_inicio" required>
<label for="fecha_fin">Hasta:</label>
<input type="date" id="fecha_fin" name="fecha_fin" required>
<button type="submit">Generar Reporte</button>
<button onclick="window.print();">Imprimir Reporte</button>
<a href="inicio.html">
<button type="button" class="regresar-btn">Regresar</button>
</a>
</form>
<h2>Resultados:</h2>
<table id="tablaReporte">
<thead>
<tr>
<th>Fecha de Venta</th>
<th>Evento</th>
<th>Lugar</th>
<th>Asiento</th>
<th>Precio</th>
</tr>
</thead>
<tbody id="resultados">
<tr><td colspan="5">No hay datos disponibles.</td></tr>
</tbody>
</table>
<script src="js/reporte-ventas.js"></script>
</body>
</html>