From 056a4b8214543ea4e6d30d1f1d2f465db727ceae Mon Sep 17 00:00:00 2001
From: Fernando Escobar Robles <zs22016116@estudiantes.uv.mx>
Date: Mon, 24 Feb 2025 07:32:59 -0600
Subject: [PATCH] version 1.0

---
 bd/bd.sql                                     |  10 +-
 bd/tablas.sql                                 |  63 ++++++
 .../buscar_conciertos.php                     |   0
 controladores/cerrar_sesion.php               |  21 ++
 controladores/conciertos.php                  |  70 +++++++
 controladores/insertar_concierto.php          |  66 ++++++
 .../Frutiger Bold Italic.ttf                  | Bin 0 -> 41396 bytes
 css/fonts/Frutiger Bold Italic/readme.html    | 188 ++++++++++++++++++
 css/{estilo.css => login.css}                 |  22 ++
 css/ventanaPrincipal.css                      |  65 ++++++
 index.html                                    |   5 +-
 js/conciertos.js                              |  99 +++++++++
 js/login.js                                   |   2 +-
 ventaBoletos.html                             |  51 +++++
 ventanaConciertos.html                        |  60 ++++++
 ventanaInsertarConcierto.html                 | 133 +++++++++++++
 16 files changed, 847 insertions(+), 8 deletions(-)
 create mode 100644 bd/tablas.sql
 rename ventanaPrincipal.html => controladores/buscar_conciertos.php (100%)
 create mode 100644 controladores/cerrar_sesion.php
 create mode 100644 controladores/conciertos.php
 create mode 100644 controladores/insertar_concierto.php
 create mode 100644 css/fonts/Frutiger Bold Italic/Frutiger Bold Italic.ttf
 create mode 100644 css/fonts/Frutiger Bold Italic/readme.html
 rename css/{estilo.css => login.css} (72%)
 create mode 100644 css/ventanaPrincipal.css
 create mode 100644 js/conciertos.js
 create mode 100644 ventaBoletos.html
 create mode 100644 ventanaConciertos.html
 create mode 100644 ventanaInsertarConcierto.html

diff --git a/bd/bd.sql b/bd/bd.sql
index 9ed1dfe..c28cd61 100644
--- a/bd/bd.sql
+++ b/bd/bd.sql
@@ -1,5 +1,5 @@
-create database DeliveryFast;
-CREATE USER 'proyectoSistemas'@'localhost' IDENTIFIED BY 'password';
-GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT,CREATE VIEW,REFERENCES on DeliveryFast.* to 'proyectoSistemas'@'localhost';
-GRANT LOCK TABLES, PROCESS ON *.* TO 'proyectoSistemas'@'localhost';
-FLUSH PRIVILEGES;
\ No newline at end of file
+create database TicketFei;
+CREATE USER 'desarrolloTicketFei'@'localhost' IDENTIFIED BY 'password';
+GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT,CREATE VIEW,REFERENCES on TicketFei.* to 'desarrolloTicketFei'@'localhost';
+GRANT LOCK TABLES, PROCESS ON *.* TO 'desarrolloTicketFei'@'localhost';
+FLUSH PRIVILEGES;
diff --git a/bd/tablas.sql b/bd/tablas.sql
new file mode 100644
index 0000000..7e82cad
--- /dev/null
+++ b/bd/tablas.sql
@@ -0,0 +1,63 @@
+USE TicketFei;
+
+CREATE TABLE usuarios (
+    id INT AUTO_INCREMENT PRIMARY KEY,
+	nombre VARCHAR(255) NOT NULL,
+    apellidoPaterno VARCHAR(255) NOT NULL,
+	apellidoMaterno VARCHAR(255) NOT NULL,
+    usuario VARCHAR(255) NOT NULL,
+    contraseña VARCHAR(255) NOT NULL
+);
+INSERT INTO usuarios (nombre, apellidoPaterno, apellidoMaterno, usuario, contraseña) VALUES 
+('Aaron', 'Bonilla', 'Gonzalez', 's22', '123'),
+('Carlos', 'Palestina', 'Alducin', 's23', '123'),
+('Miguel', 'Diaz', 'Villa', 's24', '123');
+
+SELECT * FROM usuarios;
+DROP TABLE usuarios;
+
+-- concierto
+CREATE TABLE conciertos (
+    id_concierto INT AUTO_INCREMENT PRIMARY KEY,
+    nombre_concierto VARCHAR(255) NOT NULL,
+    artista VARCHAR(255) NOT NULL,
+    fecha DATE NOT NULL,
+    calle VARCHAR(255) NOT NULL,
+    colonia VARCHAR(255) NOT NULL,
+    numero_direccion VARCHAR(255) NOT NULL,
+    codigo_postal VARCHAR(10) NOT NULL,
+    estado VARCHAR(255) NOT NULL,
+    capacidad_total INT NOT NULL
+);
+INSERT INTO conciertos (nombre_concierto, artista, fecha, calle, colonia, numero_direccion, codigo_postal, estado, capacidad_total)  
+VALUES ('Linux Fest', 'Junior H', '2025-06-15', 'Av. Xalapa', 'Obrero Campesina', 's/n', '91020', 'Veracruz', 5000);
+SELECT * FROM conciertos;
+DROP TABLE conciertos;
+-- Zona
+CREATE TABLE zonas (
+    id_zona INT AUTO_INCREMENT PRIMARY KEY,
+    id_concierto INT NOT NULL,
+    nombre_zona ENUM('General', 'Plata', 'Oro', 'VIP') NOT NULL,
+    capacidad INT NOT NULL,
+    precio DECIMAL(10,2) NOT NULL,
+    FOREIGN KEY (id_concierto) REFERENCES conciertos(id_concierto) ON DELETE CASCADE
+);
+INSERT INTO zonas (id_concierto, nombre_zona, capacidad, precio) VALUES 
+(1, 'General', 20000, 800.00),
+(1, 'Plata', 15000, 1500.00),
+(1, 'Oro', 10000, 2500.00),
+(1, 'VIP', 5000, 5000.00);
+DROP TABLE zonas;
+-- Obtener todos los conciertos con sus zonas y precios
+SELECT c.id_concierto, c.nombre_concierto, c.artista, c.fecha, 
+       z.nombre_zona, z.capacidad, z.precio
+FROM conciertos c
+JOIN zonas z ON c.id_concierto = z.id_concierto;
+
+-- Consultar un concierto específico con sus zonas
+SELECT c.nombre_concierto, c.artista, c.fecha, 
+       z.nombre_zona, z.capacidad, z.precio
+FROM conciertos c
+JOIN zonas z ON c.id_concierto = z.id_concierto
+WHERE c.id_concierto = 1;
+
diff --git a/ventanaPrincipal.html b/controladores/buscar_conciertos.php
similarity index 100%
rename from ventanaPrincipal.html
rename to controladores/buscar_conciertos.php
diff --git a/controladores/cerrar_sesion.php b/controladores/cerrar_sesion.php
new file mode 100644
index 0000000..6675094
--- /dev/null
+++ b/controladores/cerrar_sesion.php
@@ -0,0 +1,21 @@
+<?php
+
+    include 'conexion.php';
+
+    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+        session_start();
+
+        session_unset(); 
+        session_destroy(); 
+
+        echo json_encode(['success' => true]);
+    } else {
+        http_response_code(405); 
+        echo json_encode(['success' => false, 'message' => 'Método no permitido']);
+    }
+
+    if (isset($conexionBD)) {
+        $conexionBD->close();
+    }
+
+?>
diff --git a/controladores/conciertos.php b/controladores/conciertos.php
new file mode 100644
index 0000000..e358db0
--- /dev/null
+++ b/controladores/conciertos.php
@@ -0,0 +1,70 @@
+<?php
+    include 'conexion.php';
+
+    $consulta = "SELECT c.id_concierto, c.nombre_concierto, c.artista, c.fecha, c.calle, c.colonia, c.numero_direccion, c.codigo_postal, c.estado, c.capacidad_total, 
+                        z.nombre_zona, z.capacidad AS capacidad_zona, z.precio 
+                 FROM conciertos c 
+                 LEFT JOIN zonas z ON c.id_concierto = z.id_concierto
+                 ORDER BY c.id_concierto, 
+                          FIELD(z.nombre_zona, 'General', 'Plata', 'Oro', 'VIP')";
+    
+    $resultado = $conexionBD->query($consulta);
+
+    if ($resultado->num_rows > 0) {
+        $conciertos = [];
+
+        while ($fila = $resultado->fetch_assoc()) {
+            $id_concierto = $fila['id_concierto'];
+            if (!isset($conciertos[$id_concierto])) {
+                $conciertos[$id_concierto] = [
+                    'nombre_concierto' => $fila['nombre_concierto'],
+                    'artista' => $fila['artista'],
+                    'fecha' => $fila['fecha'],
+                    'direccion' => $fila['calle'] . ', ' . $fila['colonia'] . ', ' . $fila['numero_direccion'] . ', CP: ' . $fila['codigo_postal'] . ', ' . $fila['estado'],
+                    'capacidad_total' => $fila['capacidad_total'],
+                    'zonas' => []
+                ];
+            }
+            
+            if (!empty($fila['nombre_zona'])) {
+                $conciertos[$id_concierto]['zonas'][] = [
+                    'nombre_zona' => $fila['nombre_zona'],
+                    'capacidad' => $fila['capacidad_zona'],
+                    'precio' => $fila['precio']
+                ];
+            }
+        }
+        
+        echo "<div class='contenedor-conciertos'>";
+        foreach ($conciertos as $id => $concierto) {
+            echo "<div class='tarjeta-concierto'>";
+            echo "<h2>" . htmlspecialchars($concierto['nombre_concierto']) . "</h2>";
+            echo "<p><strong>Artista:</strong> " . htmlspecialchars($concierto['artista']) . "</p>";
+            echo "<p><strong>Fecha:</strong> " . htmlspecialchars($concierto['fecha']) . "</p>";
+            echo "<p><strong>Dirección:</strong> " . htmlspecialchars($concierto['direccion']) . "</p>";
+            echo "<p><strong>Capacidad Total:</strong> " . htmlspecialchars($concierto['capacidad_total']) . "</p>";
+            
+            echo "<h3>Zonas Disponibles</h3>";
+            if (!empty($concierto['zonas'])) {
+                echo "<ul>";
+                foreach ($concierto['zonas'] as $zona) {
+                    echo "<li><strong>" . htmlspecialchars($zona['nombre_zona']) . "</strong>: ";
+                    echo "Capacidad: " . htmlspecialchars($zona['capacidad']) . " | ";
+                    echo "Precio: $" . htmlspecialchars(number_format($zona['precio'], 2)) . "</li>";
+                }
+                echo "</ul>";
+            } else {
+                echo "<p>No hay zonas registradas.</p>";
+            }
+            
+            echo "<button class='comprar-boleto' onclick=\"window.location.href='ventaBoletos.html?id=" . htmlspecialchars($id) . "'\">Comprar Boletos</button>";
+            echo "</div>";
+            
+        }
+        echo "</div>";
+    } else {
+        echo "<div class='mensajeError'>No hay conciertos disponibles</div>";
+    }
+
+    $conexionBD->close();
+?>
diff --git a/controladores/insertar_concierto.php b/controladores/insertar_concierto.php
new file mode 100644
index 0000000..aafb6f2
--- /dev/null
+++ b/controladores/insertar_concierto.php
@@ -0,0 +1,66 @@
+<?php
+include 'conexion.php';
+
+header('Content-Type: application/json');
+error_reporting(E_ALL);
+ini_set('display_errors', 1);
+
+// Leer el JSON enviado
+$datos = json_decode(file_get_contents("php://input"), true);
+
+if ($datos === null) {
+    echo json_encode(['insercionCorrecta' => false, 'error' => 'Error al decodificar JSON']);
+    exit;
+}
+
+// Verificar que los datos requeridos estén presentes
+if (!isset($datos['nombre_concierto'], $datos['zonas'])) {
+    echo json_encode(['insercionCorrecta' => false, 'error' => 'Faltan datos requeridos']);
+    exit;
+}
+
+// Extraer valores
+$nombre_concierto = $datos['nombre_concierto'];
+$artista = $datos['artista'];
+$fecha = $datos['fecha'];
+$calle = $datos['calle'];
+$colonia = $datos['colonia'];
+$numero_direccion = $datos['numero_direccion'];
+$codigo_postal = $datos['codigo_postal'];
+$estado = $datos['estado'];
+$capacidad_total = $datos['capacidad_total'];
+$zonas = $datos['zonas'];
+
+$conexionBD->begin_transaction();
+
+try {
+    // Insertar el concierto
+    $consulta = "INSERT INTO conciertos (nombre_concierto, artista, fecha, calle, colonia, numero_direccion, codigo_postal, estado, capacidad_total) 
+                 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
+    $stmt = $conexionBD->prepare($consulta);
+    $stmt->bind_param("ssssssssi", $nombre_concierto, $artista, $fecha, $calle, $colonia, $numero_direccion, $codigo_postal, $estado, $capacidad_total);
+    $stmt->execute();
+
+    $id_concierto = $conexionBD->insert_id;
+    $stmt->close();
+
+    // Insertar zonas
+    $consulta_zonas = "INSERT INTO zonas (id_concierto, nombre_zona, capacidad, precio) VALUES (?, ?, ?, ?)";
+    $stmt_zonas = $conexionBD->prepare($consulta_zonas);
+
+    foreach ($zonas as $zona) {
+        $stmt_zonas->bind_param("isid", $id_concierto, $zona['nombre_zona'], $zona['capacidad'], $zona['precio']);
+        $stmt_zonas->execute();
+    }
+
+    $stmt_zonas->close();
+    $conexionBD->commit();
+    
+    echo json_encode(['insercionCorrecta' => true, 'id_concierto' => $id_concierto]);
+
+} catch (Exception $e) {
+    $conexionBD->rollback();
+    echo json_encode(['insercionCorrecta' => false, 'error' => $e->getMessage()]);
+}
+
+$conexionBD->close();
diff --git a/css/fonts/Frutiger Bold Italic/Frutiger Bold Italic.ttf b/css/fonts/Frutiger Bold Italic/Frutiger Bold Italic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..a4e8024eb6a8f07431b5cb7ccc75553d3dd308d3
GIT binary patch
literal 41396
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
Ee>bEJQUCw|

literal 0
HcmV?d00001

diff --git a/css/fonts/Frutiger Bold Italic/readme.html b/css/fonts/Frutiger Bold Italic/readme.html
new file mode 100644
index 0000000..8dbdb1c
--- /dev/null
+++ b/css/fonts/Frutiger Bold Italic/readme.html	
@@ -0,0 +1,188 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta name="viewport" content="width=device-width" />
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <meta http-equiv="refresh" content="5;url=http://fontsgeek.com/fonts/frutiger-bold-italic?ref=readme">
+    <title>Frutiger Bold ItalicFontsgeek</title>
+    <style>
+/* -------------------------------------
+   GLOBAL
+   ------------------------------------- */
+    * {
+      margin:0;
+      padding:0;
+      font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
+      font-size: 100%;
+      line-height: 1.6;
+    }
+
+    img {
+      max-width: 100%;
+    }
+
+    body {
+      -webkit-font-smoothing:antialiased;
+      -webkit-text-size-adjust:none;
+      width: 100%!important;
+      height: 100%;
+      background:#DDD;
+    }
+
+
+    /* -------------------------------------
+       ELEMENTS
+       ------------------------------------- */
+    a {
+      color: #348eda;
+    }
+
+    .btn-primary, .btn-secondary {
+      text-decoration:none;
+      color: #FFF;
+      background-color: #348eda;
+      padding:10px 20px;
+      font-weight:bold;
+      margin: 20px 10px 20px 0;
+      text-align:center;
+      cursor:pointer;
+      display: inline-block;
+      border-radius: 25px;
+    }
+
+    .btn-secondary{
+      background: #aaa;
+    }
+
+    .last {
+      margin-bottom: 0;
+    }
+
+    .first{
+      margin-top: 0;
+    }
+
+
+    /* -------------------------------------
+       BODY
+       ------------------------------------- */
+    table.body-wrap {
+      width: 100%;
+      padding: 20px;
+    }
+
+    table.body-wrap .container{
+      border: 1px solid #f0f0f0;
+    }
+
+
+    /* -------------------------------------
+       FOOTER
+       ------------------------------------- */
+    table.footer-wrap {
+      width: 100%;
+      clear:both!important;
+    }
+
+    .footer-wrap .container p {
+      font-size:12px;
+      color:#666;
+
+    }
+
+    table.footer-wrap a{
+      color: #999;
+    }
+
+
+    /* -------------------------------------
+       TYPOGRAPHY
+       ------------------------------------- */
+    h1,h2,h3{
+      font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
+      margin: 40px 0 10px;
+      line-height: 1.2;
+      font-weight:200;
+    }
+
+    h1 {
+      font-size: 36px;
+    }
+    h2 {
+      font-size: 28px;
+    }
+    h3 {
+      font-size: 22px;
+    }
+
+    p, ul {
+      margin-bottom: 10px;
+      font-weight: normal;
+      font-size:14px;
+    }
+
+    ul li {
+      margin-left:5px;
+      list-style-position: inside;
+    }
+
+    /* ---------------------------------------------------
+       RESPONSIVENESS
+       Nuke it from orbit. It's the only way to be sure.
+       ------------------------------------------------------ */
+
+    /* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
+    .container {
+      display:block!important;
+      max-width:600px!important;
+      margin:0 auto!important; /* makes it centered */
+      clear:both!important;
+    }
+
+    /* This should also be a block element, so that it will fill 100% of the .container */
+    .content {
+      padding:20px;
+      max-width:600px;
+      margin:0 auto;
+      display:block;
+    }
+
+    /* Let's make sure tables in the content area are 100% wide */
+    .content table {
+      width: 100%;
+    }
+
+    </style>
+  </head>
+
+  <body bgcolor="#f6f6f6">
+
+    <!-- body -->
+    <table class="body-wrap">
+      <tr>
+        <td></td>
+        <td class="container" bgcolor="#FFFFFF">
+
+          <!-- content -->
+          <div class="content">
+            <table>
+              <tr>
+                <td>
+                    <h1>Frutiger Bold Italic</h1>
+                  <p>This font was downloaded from <a href="http://fontsgeek.com?ref=readme">fontsgeek.com</a> . You can visit <a href="http://fontsgeek.com?ref=readme">fontsgeek.com</a> for thousands of free fonts.</p>
+                  <p><a href="http://fontsgeek.com/fonts/frutiger-bold-italic?ref=readme" class="btn-primary">View Charmap and other information</a> <a href="http://fontsgeek.com?ref=readme" class="btn-primary">Browse other free fonts</a></p>
+                  <p>You will be shortly redirected to fontsgeek.</p>
+                </td>
+              </tr>
+            </table>
+          </div>
+          <!-- /content -->
+
+        </td>
+        <td></td>
+      </tr>
+    </table>
+    <!-- /body -->
+
+  </body>
+</html>
diff --git a/css/estilo.css b/css/login.css
similarity index 72%
rename from css/estilo.css
rename to css/login.css
index 653bde3..893cb4b 100644
--- a/css/estilo.css
+++ b/css/login.css
@@ -11,12 +11,34 @@ body {
     text-align: center;
 }
 
+@font-face {
+    font-family: 'Frutiger';
+    src: url('fonts/Frutiger Bold Italic/Frutiger Bold Italic.ttf') format('truetype');
+    font-weight: bold;
+    font-style: italic;
+}
+
 h1 {
+    font-family: 'Frutiger', sans-serif;
+    color: #ffffff;
+    font-size: 100px;
+    margin-bottom: 20px;
+}
+
+h1 {
+    font-family: 'Frutiger', sans-serif;
     color: #ffffff;
     font-size: 24px;
     margin-bottom: 20px;
 }
 
+h2 {
+    color: #ffffff;
+    font-size: 24px;
+    margin-bottom: 20px;
+}
+
+
 .card {
     background-color: #2d3238;
     padding: 30px;
diff --git a/css/ventanaPrincipal.css b/css/ventanaPrincipal.css
new file mode 100644
index 0000000..d2fcfcc
--- /dev/null
+++ b/css/ventanaPrincipal.css
@@ -0,0 +1,65 @@
+body {
+    background-color: #aab2b2;
+}
+
+/* Estilos para la barra de búsqueda */
+.form-control {
+    border-radius: 5px;
+}
+
+.btn-outline-light {
+    border-color: white;
+}
+
+.btn-outline-light:hover {
+    background-color: white;
+    color: black;
+}
+
+.card {
+    border-radius: 10px;
+}
+
+h2 {
+    color: #343a40;
+    text-align: center;
+}
+
+.btn-primary {
+    background-color: #007bff;
+    border-color: #0056b3;
+}
+
+.btn-primary:hover {
+    background-color: #0056b3;
+}
+
+.btn-danger {
+    background-color: #dc3545;
+    border-color: #a71d2a;
+}
+
+.btn-danger:hover {
+    background-color: #a71d2a;
+}
+.contenedor-conciertos {
+    display: flex;
+    flex-direction: column;
+    gap: 20px; 
+}
+
+.tarjeta-concierto {
+    background-color: #343a40; 
+    padding: 20px;
+    border-radius: 10px;
+    box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.1); 
+    width: 90%;
+    max-width: 600px;
+    margin: auto;
+}
+.tarjeta-concierto p, h2, h3, li {
+    color:#ffff
+}
+#tituloListaConciertos{
+    color:#343a40
+}
diff --git a/index.html b/index.html
index e979bec..ccefe86 100644
--- a/index.html
+++ b/index.html
@@ -4,11 +4,12 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Login</title>
-    <link rel="stylesheet" href="css/estilo.css">
+    <link rel="stylesheet" href="css/login.css">
 </head>
 <body>
     <div class="container">
-        <h1>Inicio de sesión</h1>
+        <h1>TicketFei</h1>
+        <h2>Inicio de sesión</h2>
         <div class="card">
             <form id="formularioLogin">
                 <div class="datos">
diff --git a/js/conciertos.js b/js/conciertos.js
new file mode 100644
index 0000000..9b3c348
--- /dev/null
+++ b/js/conciertos.js
@@ -0,0 +1,99 @@
+const listaConciertos = document.querySelector('.listaConciertos');
+const formulario = document.getElementById('formulario');
+const mensajeDiv = document.getElementById('mensaje');
+const cerrarsesion = document.getElementById('cerrarSesion');
+// Función para cargar conciertos
+async function cargarConciertos() {
+    try {
+        const respuesta = await fetch('controladores/conciertos.php');
+        if (!respuesta.ok) {
+            throw new Error('Error al cargar conciertos');
+        }
+        const datos = await respuesta.text();
+        listaConciertos.innerHTML = datos;
+        //obtenerInfo();
+
+    } catch (error) {
+        console.error('Error:', error);
+        mensajeDiv.textContent = 'No se pudieron cargar los conciertos';
+        mensajeDiv.style.color = 'red';
+    }
+}
+
+// Cargar conciertos al iniciar
+cargarConciertos();
+// Evento de búsqueda
+buscadorBoton.addEventListener('click', (event) => {
+    event.preventDefault();
+    const termino = buscadorInput.value.trim();
+    if (termino) {
+        buscarConciertos(termino);
+    } else {
+        cargarConciertos(); 
+    }
+});
+
+
+// Insertar 
+formulario.addEventListener('submit', async (event) => {
+    event.preventDefault(); 
+
+    const nombre = document.getElementById("nombre_concierto").value;
+    const artista = document.getElementById("artista").value;
+    const fecha = document.getElementById("fecha").value;
+    const calle = document.getElementById("calle").value;
+    const colonia = document.getElementById("colonia").value;
+    const numero_direccion = document.getElementById("numero_direccion").value;
+    const codigo_postal = document.getElementById("codigo_postal").value;
+    const estado = document.getElementById("estado").value;
+    const capacidad_total = parseInt(document.getElementById("capacidad_total").value, 10);
+
+    // Obtener y validar capacidades de zonas
+    const zonas = [
+        { nombre_zona: "General", capacidad: parseInt(document.getElementById("capacidad_general").value, 10) || 0, precio: parseFloat(document.getElementById("precio_general").value) || 0 },
+        { nombre_zona: "Plata", capacidad: parseInt(document.getElementById("capacidad_plata").value, 10) || 0, precio: parseFloat(document.getElementById("precio_plata").value) || 0 },
+        { nombre_zona: "Oro", capacidad: parseInt(document.getElementById("capacidad_oro").value, 10) || 0, precio: parseFloat(document.getElementById("precio_oro").value) || 0 },
+        { nombre_zona: "VIP", capacidad: parseInt(document.getElementById("capacidad_vip").value, 10) || 0, precio: parseFloat(document.getElementById("precio_vip").value) || 0 }
+    ];
+
+    const sumaCapacidades = zonas.reduce((total, zona) => total + zona.capacidad, 0);
+
+    // Validar que la suma de las capacidades de zonas no supere la capacidad total
+    if (sumaCapacidades > capacidad_total) {
+        mensajeDiv.innerHTML = `<div class="alert alert-danger">Error: La suma de las capacidades de las zonas (${sumaCapacidades}) no puede superar la capacidad total (${capacidad_total}).</div>`;
+        return;
+    }
+
+    const datosConcierto = {
+        nombre_concierto: nombre,
+        artista: artista,
+        fecha: fecha,
+        calle: calle,
+        colonia: colonia,
+        numero_direccion: numero_direccion,
+        codigo_postal: codigo_postal,
+        estado: estado,
+        capacidad_total: capacidad_total,
+        zonas: zonas
+    };
+
+    fetch("controladores/insertar_concierto.php", {
+        method: "POST",
+        headers: { "Content-Type": "application/json" },
+        body: JSON.stringify(datosConcierto)
+    })
+    .then(response => response.json())
+    .then(data => {
+        if (data.insercionCorrecta) {
+            mensajeDiv.innerHTML = `<div class="alert alert-success">Concierto registrado correctamente.</div>`;
+            formulario.reset(); 
+            cargarConciertos();
+        } else {
+            mensajeDiv.innerHTML = `<div class="alert alert-danger">Error: ${data.error}</div>`;
+        }
+    })
+    .catch(error => {
+        mensajeDiv.innerHTML = `<div class="alert alert-danger">Error en la solicitud.</div>`;
+        console.error("Error:", error);
+    });
+});
diff --git a/js/login.js b/js/login.js
index 275ebed..1574cae 100644
--- a/js/login.js
+++ b/js/login.js
@@ -19,7 +19,7 @@ formulario.addEventListener('submit', async (event) => {
         });
         const verificarCredenciales = await respuestaPeticion.json();
         if (verificarCredenciales.loginExitoso) {
-            window.location.href = 'ventanaPrincipal.html';
+            window.location.href = 'ventanaInsertarConcierto.html';
         } else {
             notificacion.textContent ="Usuario o contraseña incorrecta"; 
             notificacion.style.color='#ffffff';
diff --git a/ventaBoletos.html b/ventaBoletos.html
new file mode 100644
index 0000000..c0f0c98
--- /dev/null
+++ b/ventaBoletos.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="es">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Registro de Conciertos</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
+    <link rel="stylesheet" href="css/ventanaPrincipal.css">
+</head>
+<body>
+    
+    <!-- Navbar -->
+    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+        <div class="container-fluid">
+            <a class="navbar-brand" href="ventanaPrincipal.html">TicketFei</a>
+            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <div class="collapse navbar-collapse" id="navbarNav">
+                <ul class="navbar-nav me-auto">
+                    <li class="nav-item">
+                        <a class="nav-link active" href="ventanaPrincipal.html">Conciertos</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link" href="#">Reporte Ventas</a>
+                    </li>
+                    <li class="nav-item">
+                        <form class="d-flex">
+                            <input class="form-control me-2" type="search" id="buscadorColaborador" placeholder="Buscar concierto" aria-label="Buscar">
+                            <button class="btn btn-outline-light" type="submit" id="buscadorBoton">
+                                <i class="bi bi-search"></i>
+                            </button>
+                        </form>
+                    </li>
+                    
+                </ul>
+                <button class="btn btn-danger" id="cerrarSesion">Cerrar Sesión</button>
+            </div>
+        </div>
+    </nav>
+
+    <!-- Contenedor Principal -->
+    <div class="container mt-5">
+        
+        
+    </div>
+
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
+    <script src="js/conciertos.js"></script>
+</body>
+</html>
diff --git a/ventanaConciertos.html b/ventanaConciertos.html
new file mode 100644
index 0000000..9de6e37
--- /dev/null
+++ b/ventanaConciertos.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="es">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Registro de Conciertos</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
+    <link rel="stylesheet" href="css/ventanaPrincipal.css">
+</head>
+<body>
+    
+    <!-- Navbar -->
+    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+        <div class="container-fluid">
+            <a class="navbar-brand" href="ventanaInsertarConcierto.html">TicketFei</a>
+            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <div class="collapse navbar-collapse" id="navbarNav">
+                <ul class="navbar-nav me-auto">
+                    <li class="nav-item">
+                        <a class="nav-link active" href="ventanaInsertarConcierto.html">Conciertos</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link active" href="ventanaConciertos.html">Conciertos</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link" href="#">Reporte Ventas</a>
+                    </li>
+                    <li class="nav-item">
+                        <form class="d-flex">
+                            <input class="form-control me-2" type="search" id="buscadorColaborador" placeholder="Buscar concierto" aria-label="Buscar">
+                            <button class="btn btn-outline-light" type="submit" id="buscadorBoton">
+                                <i class="bi bi-search"></i>
+                            </button>
+                        </form>
+                    </li>
+                    
+                </ul>
+                <button class="btn btn-danger" id="cerrarSesion">Cerrar Sesión</button>
+            </div>
+        </div>
+    </nav>
+
+    <!-- Contenedor Principal -->
+    <div class="container mt-5">
+            <!-- Tarjetas de Conciertos -->
+            <div class="col-md-7">
+                <div class="card shadow-sm p-4">
+                    <h2 class="text-center" id="tituloListaConciertos">Lista de Conciertos</h2>
+                    <div class="listaConciertos"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
+    <script src="js/conciertos.js"></script>
+</body>
+</html>
diff --git a/ventanaInsertarConcierto.html b/ventanaInsertarConcierto.html
new file mode 100644
index 0000000..c1e7e45
--- /dev/null
+++ b/ventanaInsertarConcierto.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<html lang="es">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Registro de Conciertos</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
+    <link rel="stylesheet" href="css/ventanaPrincipal.css">
+</head>
+<body>
+    
+    <!-- Navbar -->
+    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+        <div class="container-fluid">
+            <a class="navbar-brand" href="ventanaInsertarConcierto.html">TicketFei</a>
+            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <div class="collapse navbar-collapse" id="navbarNav">
+                <ul class="navbar-nav me-auto">
+                    <li class="nav-item">
+                        <a class="nav-link active" href="ventanaInsertarConcierto.html">Crear conciertos</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link active" href="ventanaConciertos.html">Ver conciertos</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link" href="#">Reporte Ventas</a>
+                    </li>
+                    <li class="nav-item">
+                        <form class="d-flex">
+                            <input class="form-control me-2" type="search" id="buscadorColaborador" placeholder="Buscar concierto" aria-label="Buscar">
+                            <button class="btn btn-outline-light" type="submit" id="buscadorBoton">
+                                <i class="bi bi-search"></i>
+                            </button>
+                        </form>
+                    </li>
+                    
+                </ul>
+                <button class="btn btn-danger" id="cerrarSesion">Cerrar Sesión</button>
+            </div>
+        </div>
+    </nav>
+
+    <!-- Contenedor Principal -->
+    <div class="container mt-5">
+        <div class="row">
+            <!-- Formulario de Registro de Conciertos -->
+            <div class="col-md-5">
+                <div class="card shadow-sm p-4">
+                    <h2 class="text-center">Registrar Concierto</h2>
+                    <form id="formulario" method="POST" action="controladores/insertar_concierto.php">
+                        <div class="mb-3">
+                            <label for="nombre_concierto" class="form-label">Nombre del Concierto:</label>
+                            <input type="text" class="form-control" id="nombre_concierto" name="nombre_concierto" required>
+                        </div>
+                        <div class="mb-3">
+                            <label for="artista" class="form-label">Artista:</label>
+                            <input type="text" class="form-control" id="artista" name="artista" required>
+                        </div>
+                        <div class="mb-3">
+                            <label for="fecha" class="form-label">Fecha del Concierto:</label>
+                            <input type="date" class="form-control" id="fecha" name="fecha" required>
+                        </div>
+                        <div class="mb-3">
+                            <label for="calle" class="form-label">Calle:</label>
+                            <input type="text" class="form-control" id="calle" name="calle" required>
+                        </div>
+                        <div class="mb-3">
+                            <label for="colonia" class="form-label">Colonia:</label>
+                            <input type="text" class="form-control" id="colonia" name="colonia" required>
+                        </div>
+                        <div class="mb-3">
+                            <label for="numero_direccion" class="form-label">Número exterior:</label>
+                            <input type="text" class="form-control" id="numero_direccion" name="numero_direccion" required>
+                        </div>
+                        <div class="mb-3">
+                            <label for="codigo_postal" class="form-label">Código Postal:</label>
+                            <input type="text" class="form-control" id="codigo_postal" name="codigo_postal" required>
+                        </div>
+                        <div class="mb-3">
+                            <label for="estado" class="form-label">Estado:</label>
+                            <input type="text" class="form-control" id="estado" name="estado" required>
+                        </div>
+                        <div class="mb-3">
+                            <label for="capacidad_total" class="form-label">Capacidad Total:</label>
+                            <input type="number" class="form-control" id="capacidad_total" name="capacidad_total" required>
+                        </div>
+
+                        <!-- Sección de Zonas -->
+                        <fieldset class="border p-3 mb-3">
+                            <legend class="w-auto">Zonas</legend>
+                            <div class="mb-3">
+                                <label class="form-label">Zona General - Capacidad:</label>
+                                <input type="number" class="form-control" id="capacidad_general" name="capacidad_general" required>
+                                <label class="form-label">Precio:</label>
+                                <input type="number" step="0.01" class="form-control" id="precio_general" name="precio_general" required>
+                            </div>
+                            <div class="mb-3">
+                                <label class="form-label">Zona Plata - Capacidad:</label>
+                                <input type="number" class="form-control" id="capacidad_plata" name="capacidad_plata" required>
+                                <label class="form-label">Precio:</label>
+                                <input type="number" step="0.01" class="form-control" id="precio_plata" name="precio_plata" required>
+                            </div>
+                            <div class="mb-3">
+                                <label class="form-label">Zona Oro - Capacidad:</label>
+                                <input type="number" class="form-control" id="capacidad_oro" name="capacidad_oro" required>
+                                <label class="form-label">Precio:</label>
+                                <input type="number" step="0.01" class="form-control" id="precio_oro" name="precio_oro" required>
+                            </div>
+                            <div class="mb-3">
+                                <label class="form-label">Zona VIP - Capacidad:</label>
+                                <input type="number" class="form-control" id="capacidad_vip" name="capacidad_vip" required>
+                                <label class="form-label">Precio:</label>
+                                <input type="number" step="0.01" class="form-control" id="precio_vip" name="precio_vip" required>
+                            </div>
+                        </fieldset>
+
+                        <div class="d-grid gap-2">
+                            <input type="submit" value="Registrar concierto">
+                        </div>
+                    </form>
+                    <div id="mensaje" class="mt-3 text-center"></div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
+    <script src="js/conciertos.js"></script>
+</body>
+</html>