From e454b86eedda791cc7dba97b086870aeea12a725 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?V=C3=ADctor=20Manuel=20Monge=20Morales?=
 <zs22016120@estudiantes.uv.mx>
Date: Wed, 12 Mar 2025 21:10:32 -0600
Subject: [PATCH] =?UTF-8?q?Generaci=C3=B3n=20de=20reportes,=20registro=20d?=
 =?UTF-8?q?e=20eventos=20y=20ajustes=20finales=20a=20la=20GUI.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ProyectoVentaBoletos/pom.xml                  |  17 ++
 .../java/controller/GeneradorComprobante.java |   2 +-
 .../main/java/controller/MenuController.java  |  25 +++
 .../java/controller/MenuSalaController.java   |  82 +++++++-
 .../controller/RegistrarEventoController.java |  48 +++++
 .../main/java/controller/ReporteVentas.java   | 199 ++++++++++++++++++
 .../src/main/java/model/ModeloSQL.java        |  59 ++++++
 .../src/main/java/view/Menu.form              |  43 ++--
 .../src/main/java/view/Menu.java              |  37 ++--
 .../src/main/java/view/MenuSala.form          |  87 +++++++-
 .../src/main/java/view/MenuSala.java          |  93 +++++++-
 .../src/main/java/view/RegistrarEvento.form   | 113 ++++++++++
 .../src/main/java/view/RegistrarEvento.java   | 112 ++++++++++
 13 files changed, 869 insertions(+), 48 deletions(-)
 create mode 100644 ProyectoVentaBoletos/src/main/java/controller/RegistrarEventoController.java
 create mode 100644 ProyectoVentaBoletos/src/main/java/controller/ReporteVentas.java
 create mode 100644 ProyectoVentaBoletos/src/main/java/view/RegistrarEvento.form
 create mode 100644 ProyectoVentaBoletos/src/main/java/view/RegistrarEvento.java

diff --git a/ProyectoVentaBoletos/pom.xml b/ProyectoVentaBoletos/pom.xml
index f81e706..d2cd12f 100644
--- a/ProyectoVentaBoletos/pom.xml
+++ b/ProyectoVentaBoletos/pom.xml
@@ -5,6 +5,13 @@
     <artifactId>ProyectoVentaBoletos</artifactId>
     <version>1.0-SNAPSHOT</version>
     <packaging>jar</packaging>
+    <repositories>
+        <repository>
+            <id>unknown-jars-temp-repo</id>
+            <name>A temporary repository created by NetBeans for libraries and jars it could not identify. Please replace the dependencies in this repository with correct ones and delete this repository.</name>
+            <url>file:${project.basedir}/lib</url>
+        </repository>
+    </repositories>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>20</maven.compiler.source>
@@ -27,5 +34,15 @@
             <artifactId>itextpdf</artifactId>
             <version>5.5.13.3</version>
         </dependency>
+        <dependency>
+            <groupId>com.toedter</groupId>
+            <artifactId>jcalendar</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>unknown.binary</groupId>
+            <artifactId>AbsoluteLayout</artifactId>
+            <version>SNAPSHOT</version>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/ProyectoVentaBoletos/src/main/java/controller/GeneradorComprobante.java b/ProyectoVentaBoletos/src/main/java/controller/GeneradorComprobante.java
index e9d858d..4c39804 100644
--- a/ProyectoVentaBoletos/src/main/java/controller/GeneradorComprobante.java
+++ b/ProyectoVentaBoletos/src/main/java/controller/GeneradorComprobante.java
@@ -23,7 +23,7 @@ import model.ModeloSQL;
 import model.Venta;
 
 public class GeneradorComprobante {
-    private static final String RUTA_COMPROBANTES = "C:\\Users\\vmonge\\Desktop\\";
+    private static final String RUTA_COMPROBANTES = "C:\\Users\\USER\\Desktop\\";
     
     // Fuentes para el documento
     private static final Font TITULO_FONT = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16);
diff --git a/ProyectoVentaBoletos/src/main/java/controller/MenuController.java b/ProyectoVentaBoletos/src/main/java/controller/MenuController.java
index f9c6e3c..3015617 100644
--- a/ProyectoVentaBoletos/src/main/java/controller/MenuController.java
+++ b/ProyectoVentaBoletos/src/main/java/controller/MenuController.java
@@ -1,6 +1,7 @@
 package controller;
 
 import java.awt.BorderLayout;
+import java.awt.Frame;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ItemEvent;
@@ -12,10 +13,12 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.swing.JDialog;
 import model.Evento;
 import model.ModeloSQL;
 import view.Menu;
 import view.MenuSala;
+import view.RegistrarEvento;
 
 public class MenuController extends WindowAdapter implements ActionListener, ItemListener {
     private Menu menu;
@@ -48,6 +51,27 @@ public class MenuController extends WindowAdapter implements ActionListener, Ite
                 menu.mensaje("Debe seleccionar un evento.");
             }
         }
+        if(o.equals(menu.jButtonRegistrarEvento)){
+            menu.dialog = new JDialog((Frame) null, "Registrar evento", true);
+            menu.dialog.setSize(400, 200);
+            menu.dialog.setLocationRelativeTo(null);
+            menu.dialog.addWindowListener(new WindowAdapter() {
+                @Override
+                public void windowClosed(WindowEvent e) {
+                    System.out.println("MenuController.dialog.windowClosed(): cerrado.");
+                    obtenerEventosDefaultComboBoxMoldel();
+                }
+
+                @Override
+                public void windowClosing(WindowEvent e) {
+                    System.out.println("MenuController.dialog.windowClosed(): cerrado.");
+                    obtenerEventosDefaultComboBoxMoldel();
+                }
+            });
+            RegistrarEvento registrarEvento = new RegistrarEvento();
+            menu.dialog.add(registrarEvento);
+            menu.dialog.setVisible(true);
+        }
     }
     
     public void itemStateChanged(ItemEvent e) {
@@ -67,6 +91,7 @@ public class MenuController extends WindowAdapter implements ActionListener, Ite
     // Obtener ResultSet de ModeloSQL y añádir eventos al ComboBoxModel del ComboBox de eventos
     public void obtenerEventosDefaultComboBoxMoldel(){
         ResultSet rs = modeloSQL.obtenerEventos();
+        menu.defaultComboBoxModel.removeAllElements();
         menu.defaultComboBoxModel.addElement("Seleccione un evento");
         try {
             while ( rs.next() ){
diff --git a/ProyectoVentaBoletos/src/main/java/controller/MenuSalaController.java b/ProyectoVentaBoletos/src/main/java/controller/MenuSalaController.java
index f50d7db..5fcb06b 100644
--- a/ProyectoVentaBoletos/src/main/java/controller/MenuSalaController.java
+++ b/ProyectoVentaBoletos/src/main/java/controller/MenuSalaController.java
@@ -1,5 +1,6 @@
 package controller;
 
+import com.toedter.calendar.JDateChooser;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.event.ActionEvent;
@@ -19,11 +20,17 @@ import model.Evento;
 import view.MenuSala;
 import model.ModeloSQL;
 import model.Venta;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
 
-public class MenuSalaController implements ActionListener, ItemListener{
+public class MenuSalaController implements ActionListener, ItemListener, PropertyChangeListener {
     private int idEvento;
     private MenuSala menuSala;
     private ModeloSQL modeloSQL = new ModeloSQL();
+    private ReporteVentas reporteVentas;
     
     private ArrayList<JToggleButton> arrayListAsientosSeleccionados;
     
@@ -41,6 +48,7 @@ public class MenuSalaController implements ActionListener, ItemListener{
         this.idEvento = menuSala.getIdEvento();
         obtenerAsientos(idEvento);// Obtener información del evento seleccionado desde la BD y añadir botones
         arrayListAsientosSeleccionados = new ArrayList<>();
+        this.reporteVentas = new ReporteVentas(modeloSQL);
     }
 
     public void obtenerAsientos(int idEvento){
@@ -140,6 +148,19 @@ public class MenuSalaController implements ActionListener, ItemListener{
             }
         }
         
+        if(o.equals(menuSala.jButtonGenerarReporte)){
+            if(menuSala.fechaInicioReporte.getDate() == null || menuSala.fechaFinalReporte.getDate() == null){
+                menuSala.mensaje("Debe introducir tanto la fecha de inicio como la fecha final para generar un reporte.");
+            } else {
+                String fechaReporteInicio = convertirFechaInicioParaMySQL(menuSala.fechaInicioReporte.getDate());
+                String fechaReporteFinal = convertirFechaFinalParaMySQL(menuSala.fechaFinalReporte.getDate());
+                System.out.println("controller.MenuSalaController.actionPerformed(): fechaReporteInicio: " + fechaReporteInicio + " fechaReporteFinal: " + fechaReporteFinal);
+                reporteVentas.reporte(idEvento, fechaReporteInicio, fechaReporteFinal);
+                menuSala.fechaInicioReporte.setDate(null);
+                menuSala.fechaFinalReporte.setDate(null);
+                menuSala.mensaje("Reporte generado.");
+            }
+        }
     }
     
     @Override
@@ -223,7 +244,7 @@ public class MenuSalaController implements ActionListener, ItemListener{
         menuSala.jButtonRealizarVenta.setEnabled(false);
         menuSala.jPanelBotones.setBackground(Color.decode("#F6F6F6"));
         menuSala.jButtonSeleccionarAsientosVenta.setBackground(Color.WHITE);
-        
+        menuSala.mensaje("Comprobante generado.");
     }
     
     public void generarComprobante(int idVenta){
@@ -235,7 +256,62 @@ public class MenuSalaController implements ActionListener, ItemListener{
             ArrayList<Boleto> boletos = modeloSQL.obtenerBoletosVenta(idVenta);
             GeneradorComprobante.generarComprobantePDF(venta, evento, boletos);
         }
-
     }
     
+    @Override
+    public void propertyChange(PropertyChangeEvent evt) {
+        // Verifica que el evento sea sobre la fecha
+        if ("date".equals(evt.getPropertyName())) {
+            
+            // Para saber quién disparó el evento guardamos el objeto
+            JDateChooser source = (JDateChooser) evt.getSource();
+
+            // Si el evento vino de la fecha de inicio
+            if (source == menuSala.fechaInicioReporte) {
+                Date fecha = menuSala.fechaInicioReporte.getDate();
+                //System.out.println("controller.MenuSalaController.propertyChange(): fecha de inicio seleccionada " + fecha);
+            } else if (source == menuSala.fechaFinalReporte) { // Si el evento vino de la fecha final
+                Date fecha = menuSala.fechaFinalReporte.getDate();
+                //System.out.println("controller.MenuSalaController.propertyChange(): fecha de inicio seleccionada " + fecha);
+            }
+            
+        }
+    }
+    
+    public String convertirFechaInicioParaMySQL(Date fecha) {
+        // Crear una instancia de Calendar y establecer la fecha
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(fecha);
+
+        // Resetear la hora a 00:00:00.000
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+
+        // Obtener la fecha con hora 00:00:00
+        Date fechaConHoraReseteada = calendar.getTime();
+
+        // El formato DATETIME de MySQL es: YYYY-MM-DD HH:MM:SS
+        SimpleDateFormat formatoMySQL = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return formatoMySQL.format(fechaConHoraReseteada);
+    }
+    public String convertirFechaFinalParaMySQL(Date fecha) {
+        // Crear una instancia de Calendar y establecer la fecha
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(fecha);
+
+        // Establecer la hora a 23:59:59.999 (final del día)
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+
+        // Obtener la fecha con hora 23:59:59
+        Date fechaFinDia = calendar.getTime();
+
+        // El formato DATETIME de MySQL es: YYYY-MM-DD HH:MM:SS
+        SimpleDateFormat formatoMySQL = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return formatoMySQL.format(fechaFinDia);
+    }
 }
diff --git a/ProyectoVentaBoletos/src/main/java/controller/RegistrarEventoController.java b/ProyectoVentaBoletos/src/main/java/controller/RegistrarEventoController.java
new file mode 100644
index 0000000..c276e14
--- /dev/null
+++ b/ProyectoVentaBoletos/src/main/java/controller/RegistrarEventoController.java
@@ -0,0 +1,48 @@
+package controller;
+
+import view.RegistrarEvento;
+import model.ModeloSQL;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.time.LocalDate;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+public class RegistrarEventoController implements ActionListener{
+    private ModeloSQL modeloSQL;
+    RegistrarEvento registrarEvento;
+    
+    public RegistrarEventoController(RegistrarEvento re){
+        this.registrarEvento = re;
+        modeloSQL = new ModeloSQL();
+    }
+    
+    @Override
+    public void actionPerformed(ActionEvent e) {
+         Object o = e.getSource();
+         if(o.equals(registrarEvento.jButtonRegistrarEvento)){
+             // Validar campos
+            String nombre = registrarEvento.jTextFieldNombre.getText().trim();
+            if(nombre.isEmpty()){
+                registrarEvento.mensaje("Ingrese un nombre valido.");
+                return;
+            }
+            if(registrarEvento.fecha.getDate() == null){
+                registrarEvento.mensaje("Ingrese una fecha.");
+                return;
+            }
+            
+            Date fechaEvento = registrarEvento.fecha.getDate();
+            SimpleDateFormat formatoMySQL = new SimpleDateFormat("yyyy-MM-dd");
+            String fechaFormateada = formatoMySQL.format(fechaEvento);
+            
+            modeloSQL.insertarEvento(nombre, fechaFormateada);
+            registrarEvento.jTextFieldNombre.setText("");
+            registrarEvento.fecha.setDate(null);
+            registrarEvento.mensaje("Evento registrado.");
+
+         }
+    }
+    
+}
diff --git a/ProyectoVentaBoletos/src/main/java/controller/ReporteVentas.java b/ProyectoVentaBoletos/src/main/java/controller/ReporteVentas.java
new file mode 100644
index 0000000..9744a36
--- /dev/null
+++ b/ProyectoVentaBoletos/src/main/java/controller/ReporteVentas.java
@@ -0,0 +1,199 @@
+
+package controller;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import model.Evento;
+import model.Venta;
+import model.ModeloSQL;
+
+import com.itextpdf.text.Document;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.FontFactory;
+import com.itextpdf.text.Paragraph;
+import com.itextpdf.text.Phrase;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
+
+public class ReporteVentas {
+    ModeloSQL modeloSQL;
+    private static final String RUTA = "C:\\Users\\USER\\Desktop\\";
+    
+    public ReporteVentas(ModeloSQL modeloSQL) {
+        this.modeloSQL = modeloSQL;
+    }
+    
+    // Método para formatear fechas String al formato dd/mm/yyyy
+    private String formatearFechaString(String fechaOriginal) {
+        try {
+            SimpleDateFormat formatoOriginal = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat formatoNuevo = new SimpleDateFormat("dd/MM/yyyy");
+            Date fecha = formatoOriginal.parse(fechaOriginal);
+            return formatoNuevo.format(fecha);
+        } catch (ParseException e) {
+            // Si hay error, devolver la fecha original
+            return fechaOriginal;
+        }
+    }
+    
+    // Método para formatear objetos Date al formato dd/mm/yyyy
+    private String formatearFecha(Date fecha) {
+        if (fecha == null) {
+            return "Fecha no disponible";
+        }
+        SimpleDateFormat formatoNuevo = new SimpleDateFormat("dd/MM/yyyy");
+        return formatoNuevo.format(fecha);
+    }
+    
+    // Método para formatear objetos LocalDateTime al formato dd/mm/yyyy hh:mm:ss
+    private String formatearFechaHora(LocalDateTime fechaHora) {
+        if (fechaHora == null) {
+            return "Fecha no disponible";
+        }
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
+        return fechaHora.format(formatter);
+    }
+    
+    // Generar el reporte de ventas
+    public void reporte(int idEvento, String fechaInicio, String fechaFinal) {
+        Document documento = new Document();
+        try {
+            // Crear el archivo PDF
+            String rutaArchivo = RUTA + "Reporte_ventas_evento_" + idEvento + ".pdf";
+            PdfWriter.getInstance(documento, new FileOutputStream(rutaArchivo));
+            documento.open();
+            
+            // Definir fuentes
+            Font fuenteTitulo = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16);
+            Font fuenteSubtitulo = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 12);
+            Font fuenteNormal = FontFactory.getFont(FontFactory.HELVETICA, 10);
+            
+            // Obtener la información del evento
+            Evento evento = modeloSQL.obteneEvento(idEvento);
+            
+            if (evento == null) {
+                Paragraph parrafoError = new Paragraph("No se encontró el evento con id: " + idEvento, fuenteSubtitulo);
+                documento.add(parrafoError);
+                documento.close();
+                return;
+            }
+            
+            // Agregar título del reporte
+            Paragraph titulo = new Paragraph("Reporte de ventas", fuenteTitulo);
+            titulo.setAlignment(Element.ALIGN_CENTER);
+            documento.add(titulo);
+            documento.add(new Paragraph("\n"));
+            
+            // Información del evento con fecha formateada (getFecha() retorna Date)
+            String fechaEventoFormateada = formatearFecha(evento.getFecha());
+            Paragraph infoEvento = new Paragraph("Evento: " + evento.getNombre() + ", Fecha: " + fechaEventoFormateada, fuenteSubtitulo);
+            documento.add(infoEvento);
+            
+            // Período del reporte con fechas formateadas
+            String fechaInicioFormateada = formatearFechaString(fechaInicio);
+            String fechaFinalFormateada = formatearFechaString(fechaFinal);
+            Paragraph periodo = new Paragraph("Reporte de ventas de " + fechaInicioFormateada + " a " + fechaFinalFormateada, fuenteSubtitulo);
+            documento.add(periodo);
+            documento.add(new Paragraph("\n"));
+            
+            // Obtener las ventas para el evento en el rango de fechas (usando fechas originales)
+            ArrayList<Venta> ventasList = modeloSQL.obtenerVentas(idEvento, fechaInicio, fechaFinal);
+            
+            for (Venta venta : ventasList) {
+                // Información de la venta
+                Paragraph ventaInfo = new Paragraph("Venta ID: " + venta.getIdVenta(), fuenteSubtitulo);
+                documento.add(ventaInfo);
+                
+                // Formatear fecha de venta (getFechaVenta() retorna LocalDateTime)
+                String fechaVentaFormateada = formatearFechaHora(venta.getFechaVenta());
+                documento.add(new Paragraph("Fecha de venta: " + fechaVentaFormateada, fuenteNormal));
+                documento.add(new Paragraph("Boletos vendidos: " + venta.getTotalBoletos(), fuenteNormal));
+                documento.add(new Paragraph("Monto total: " + venta.getTotalMonto(), fuenteNormal));
+                
+                // Agregar tabla de boletos
+                documento.add(new Paragraph("\nBoletos:", fuenteSubtitulo));
+                documento.add(new Paragraph("\n"));
+                agregarTablaBoletosVenta(documento, venta.getIdVenta());
+                documento.add(new Paragraph("\n"));
+            }
+            
+            System.out.println("Reporte PDF generado correctamente: " + rutaArchivo);
+            
+        } catch (DocumentException | IOException e) {
+            System.out.println("Error al generar el PDF: " + e.getMessage());
+            e.printStackTrace();
+        } catch (SQLException e) {
+            System.out.println("Error en la consulta SQL: " + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (documento.isOpen()) {
+                documento.close();
+            }
+        }
+    }
+    
+    // Función para agregar una tabla con los boletos asociados a una venta
+    private void agregarTablaBoletosVenta(Document documento, int idVenta) throws DocumentException {
+        PdfPTable tabla = new PdfPTable(4);
+        tabla.setWidthPercentage(100);
+        
+        // Establecer anchos relativos de las columnas
+        try {
+            tabla.setWidths(new float[]{1, 1, 1, 1});
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        
+        // Agregar encabezados de la tabla
+        PdfPCell celdaId = new PdfPCell(new Phrase("ID Boleto"));
+        PdfPCell celdaPrecio = new PdfPCell(new Phrase("Precio"));
+        PdfPCell celdaFila = new PdfPCell(new Phrase("Fila"));
+        PdfPCell celdaNumero = new PdfPCell(new Phrase("Número"));
+        
+        // Centrar encabezados
+        celdaId.setHorizontalAlignment(Element.ALIGN_CENTER);
+        celdaPrecio.setHorizontalAlignment(Element.ALIGN_CENTER);
+        celdaFila.setHorizontalAlignment(Element.ALIGN_CENTER);
+        celdaNumero.setHorizontalAlignment(Element.ALIGN_CENTER);
+        
+        tabla.addCell(celdaId);
+        tabla.addCell(celdaPrecio);
+        tabla.addCell(celdaFila);
+        tabla.addCell(celdaNumero);
+        
+        ResultSet rs = modeloSQL.consultarBoletosVenta(idVenta);
+        try {
+            while (rs.next()) {
+                int idBoleto = rs.getInt("idBoleto");
+                double precio = rs.getDouble("precio");
+                String fila = rs.getString("fila");
+                int numero = rs.getInt("numero");
+                
+                tabla.addCell(String.valueOf(idBoleto));
+                tabla.addCell(String.valueOf(precio));
+                tabla.addCell(fila);
+                tabla.addCell(String.valueOf(numero));
+            }
+        } catch (SQLException e) {
+            try {
+                documento.add(new Paragraph("Error al obtener información de boletos: " + e.getMessage()));
+            } catch (DocumentException ex) {
+                ex.printStackTrace();
+            }
+            e.printStackTrace();
+        }
+        
+        documento.add(tabla);
+    }
+}
\ No newline at end of file
diff --git a/ProyectoVentaBoletos/src/main/java/model/ModeloSQL.java b/ProyectoVentaBoletos/src/main/java/model/ModeloSQL.java
index e649af5..10f7c4b 100644
--- a/ProyectoVentaBoletos/src/main/java/model/ModeloSQL.java
+++ b/ProyectoVentaBoletos/src/main/java/model/ModeloSQL.java
@@ -2,6 +2,7 @@ package model;
 
 import controller.ConexionSingleton;
 import java.sql.*;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.logging.Level;
@@ -13,6 +14,20 @@ public class ModeloSQL {
     public ModeloSQL(){
         con = ConexionSingleton.getInstance();
     }
+    public void insertarEvento(String nombre, String fecha) {
+        String sql = "INSERT INTO eventos (nombre, fecha) VALUES (?, ?)";
+        try (PreparedStatement stmt = con.prepareStatement(sql)) {
+            stmt.setString(1, nombre);
+            stmt.setString(2, fecha);
+
+            int rowsInserted = stmt.executeUpdate();
+            if (rowsInserted > 0) {
+                System.out.println("model.ModeloSQL.insertarEvento(): El evento fue insertado exitosamente.");
+            }
+        } catch (SQLException e) {
+            System.out.println("model.ModeloSQL.insertarEvento(): Error al insertar el evento " + e.getMessage());
+        }
+    }
     
     // Eventos
     public ResultSet obtenerEventos(){
@@ -206,4 +221,48 @@ public class ModeloSQL {
         System.out.println("[!] model.ModeloSQL.obtenerVenta(): no hay ninguna venta asociado a esa id.");
         return null;
     }
+    
+    // Función para obtener las ventas de un evento en un rango de fechas
+    public ArrayList<Venta> obtenerVentas(int idEvento, String fechaInicio, String fechaFinal) throws SQLException {
+        String sqlVentas = "SELECT * FROM ventas WHERE idEvento = ? AND fechaVenta BETWEEN ? AND ?";
+        ArrayList<Venta> ventasList = new ArrayList<>();
+        try (PreparedStatement pst = con.prepareStatement(sqlVentas)) {
+            pst.setInt(1, idEvento);
+            pst.setString(2, fechaInicio);
+            pst.setString(3, fechaFinal);
+            try (ResultSet rsVentas = pst.executeQuery()) {
+                while (rsVentas.next()) {
+                    Venta venta = new Venta();
+                    venta.setIdVenta(rsVentas.getInt("idVenta"));
+                    venta.setIdEvento(rsVentas.getInt("idEvento"));
+                    Timestamp ts = rsVentas.getTimestamp("fechaVenta");
+                    if (ts != null) {
+                        venta.setFechaVenta(ts.toLocalDateTime());
+                    }
+                    venta.setTotalBoletos(rsVentas.getInt("totalBoletos"));
+                    venta.setTotalMonto(rsVentas.getDouble("totalMonto"));
+                    ventasList.add(venta);
+                }
+            }
+        }
+        return ventasList;
+    }
+
+    public ResultSet consultarBoletosVenta(int idVenta) {
+        ResultSet rs = null;
+        try {
+            String sql = "SELECT b.idBoleto, b.precio, a.fila, a.numero " +
+                         "FROM boletos b " +
+                         "JOIN asientos a ON b.idAsiento = a.idAsiento " +
+                         "WHERE b.idVenta = ?";
+            PreparedStatement pst = con.prepareStatement(sql);
+            pst.setInt(1, idVenta);
+            rs = pst.executeQuery();
+        } catch (SQLException ex) {
+            System.out.println("model.ModeloSQL.consultarBoletosVenta(): error " + ex);
+            ex.printStackTrace();
+        }
+        return rs;
+    }
+    
 }
diff --git a/ProyectoVentaBoletos/src/main/java/view/Menu.form b/ProyectoVentaBoletos/src/main/java/view/Menu.form
index 9b82742..408793d 100644
--- a/ProyectoVentaBoletos/src/main/java/view/Menu.form
+++ b/ProyectoVentaBoletos/src/main/java/view/Menu.form
@@ -37,20 +37,23 @@
   <Layout>
     <DimensionLayout dim="0">
       <Group type="103" groupAlignment="0" attributes="0">
-          <Group type="102" alignment="0" attributes="0">
+          <Group type="102" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
-              <Component id="jPanelMenuSala" max="32767" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="jPanelMenuSala" alignment="0" max="32767" attributes="0"/>
+                  <Group type="102" alignment="0" attributes="0">
+                      <Component id="jButtonRegistrarEvento" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="224" max="-2" attributes="0"/>
+                      <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="jComboBoxEventos" min="-2" pref="170" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="jButtonVisualizar" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
               <EmptySpace max="-2" attributes="0"/>
           </Group>
-          <Group type="102" alignment="0" attributes="0">
-              <EmptySpace min="-2" pref="349" max="-2" attributes="0"/>
-              <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
-              <EmptySpace max="-2" attributes="0"/>
-              <Component id="jComboBoxEventos" min="-2" pref="170" max="-2" attributes="0"/>
-              <EmptySpace max="-2" attributes="0"/>
-              <Component id="jButtonVisualizar" min="-2" max="-2" attributes="0"/>
-              <EmptySpace max="32767" attributes="0"/>
-          </Group>
       </Group>
     </DimensionLayout>
     <DimensionLayout dim="1">
@@ -61,6 +64,7 @@
                   <Component id="jComboBoxEventos" alignment="3" min="-2" max="-2" attributes="0"/>
                   <Component id="jButtonVisualizar" alignment="3" min="-2" max="-2" attributes="0"/>
                   <Component id="jLabel1" alignment="3" max="32767" attributes="0"/>
+                  <Component id="jButtonRegistrarEvento" alignment="3" min="-2" max="-2" attributes="0"/>
               </Group>
               <EmptySpace max="-2" attributes="0"/>
               <Component id="jPanelMenuSala" max="32767" attributes="0"/>
@@ -95,6 +99,11 @@
       </AuxValues>
     </Component>
     <Container class="javax.swing.JPanel" name="jPanelMenuSala">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+          <Connection component="jButtonVisualizar" name="border" type="property"/>
+        </Property>
+      </Properties>
       <AuxValues>
         <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
       </AuxValues>
@@ -102,15 +111,23 @@
       <Layout>
         <DimensionLayout dim="0">
           <Group type="103" groupAlignment="0" attributes="0">
-              <EmptySpace min="0" pref="1168" max="32767" attributes="0"/>
+              <EmptySpace min="0" pref="1162" max="32767" attributes="0"/>
           </Group>
         </DimensionLayout>
         <DimensionLayout dim="1">
           <Group type="103" groupAlignment="0" attributes="0">
-              <EmptySpace min="0" pref="255" max="32767" attributes="0"/>
+              <EmptySpace min="0" pref="249" max="32767" attributes="0"/>
           </Group>
         </DimensionLayout>
       </Layout>
     </Container>
+    <Component class="javax.swing.JButton" name="jButtonRegistrarEvento">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="Registrar evento"/>
+      </Properties>
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
+      </AuxValues>
+    </Component>
   </SubComponents>
 </Form>
diff --git a/ProyectoVentaBoletos/src/main/java/view/Menu.java b/ProyectoVentaBoletos/src/main/java/view/Menu.java
index 99e7961..f59489a 100644
--- a/ProyectoVentaBoletos/src/main/java/view/Menu.java
+++ b/ProyectoVentaBoletos/src/main/java/view/Menu.java
@@ -3,10 +3,11 @@ package view;
 import java.awt.BorderLayout;
 import controller.MenuController;
 import javax.swing.DefaultComboBoxModel;
+import javax.swing.JDialog;
 import javax.swing.JOptionPane;
 
 public class Menu extends javax.swing.JFrame {
-    
+    public JDialog dialog;
     public DefaultComboBoxModel<String> defaultComboBoxModel;
     
     public Menu() {
@@ -20,6 +21,7 @@ public class Menu extends javax.swing.JFrame {
         this.jButtonVisualizar.addActionListener(menuController);
         this.jComboBoxEventos.addItemListener(menuController);
         addWindowListener(menuController);
+        this.jButtonRegistrarEvento.addActionListener(menuController);
     }
     
     public void mensaje(String mensaje){
@@ -34,6 +36,7 @@ public class Menu extends javax.swing.JFrame {
         jComboBoxEventos = new javax.swing.JComboBox<>();
         jButtonVisualizar = new javax.swing.JButton();
         jPanelMenuSala = new javax.swing.JPanel();
+        jButtonRegistrarEvento = new javax.swing.JButton();
 
         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
         setTitle("Aplicación de venta de boletos");
@@ -49,33 +52,39 @@ public class Menu extends javax.swing.JFrame {
 
         jButtonVisualizar.setText("Visualizar");
 
+        jPanelMenuSala.setBorder(jButtonVisualizar.getBorder());
+
         javax.swing.GroupLayout jPanelMenuSalaLayout = new javax.swing.GroupLayout(jPanelMenuSala);
         jPanelMenuSala.setLayout(jPanelMenuSalaLayout);
         jPanelMenuSalaLayout.setHorizontalGroup(
             jPanelMenuSalaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 1168, Short.MAX_VALUE)
+            .addGap(0, 1162, Short.MAX_VALUE)
         );
         jPanelMenuSalaLayout.setVerticalGroup(
             jPanelMenuSalaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 255, Short.MAX_VALUE)
+            .addGap(0, 249, Short.MAX_VALUE)
         );
 
+        jButtonRegistrarEvento.setText("Registrar evento");
+
         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
         getContentPane().setLayout(layout);
         layout.setHorizontalGroup(
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
-                .addComponent(jPanelMenuSala, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jPanelMenuSala, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(jButtonRegistrarEvento)
+                        .addGap(224, 224, 224)
+                        .addComponent(jLabel1)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jComboBoxEventos, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jButtonVisualizar)
+                        .addGap(0, 0, Short.MAX_VALUE)))
                 .addContainerGap())
-            .addGroup(layout.createSequentialGroup()
-                .addGap(349, 349, 349)
-                .addComponent(jLabel1)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(jComboBoxEventos, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(jButtonVisualizar)
-                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
         layout.setVerticalGroup(
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -84,7 +93,8 @@ public class Menu extends javax.swing.JFrame {
                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                     .addComponent(jComboBoxEventos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                     .addComponent(jButtonVisualizar)
-                    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addComponent(jButtonRegistrarEvento))
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                 .addComponent(jPanelMenuSala, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                 .addContainerGap())
@@ -95,6 +105,7 @@ public class Menu extends javax.swing.JFrame {
  
     
     // Variables declaration - do not modify//GEN-BEGIN:variables
+    public javax.swing.JButton jButtonRegistrarEvento;
     public javax.swing.JButton jButtonVisualizar;
     public javax.swing.JComboBox<String> jComboBoxEventos;
     private javax.swing.JLabel jLabel1;
diff --git a/ProyectoVentaBoletos/src/main/java/view/MenuSala.form b/ProyectoVentaBoletos/src/main/java/view/MenuSala.form
index 8af62da..e124b56 100644
--- a/ProyectoVentaBoletos/src/main/java/view/MenuSala.form
+++ b/ProyectoVentaBoletos/src/main/java/view/MenuSala.form
@@ -51,7 +51,7 @@
         </DimensionLayout>
         <DimensionLayout dim="1">
           <Group type="103" groupAlignment="0" attributes="0">
-              <EmptySpace min="0" pref="448" max="32767" attributes="0"/>
+              <EmptySpace min="0" pref="436" max="32767" attributes="0"/>
           </Group>
         </DimensionLayout>
       </Layout>
@@ -62,6 +62,9 @@
           <Color blue="0" green="0" red="0" type="rgb"/>
         </Property>
       </Properties>
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
+      </AuxValues>
 
       <Layout>
         <DimensionLayout dim="0">
@@ -73,20 +76,45 @@
                       <Component id="jButtonSeleccionarAsientosVenta" alignment="0" max="32767" attributes="0"/>
                       <Component id="jButtonRealizarVenta" alignment="0" max="32767" attributes="0"/>
                   </Group>
-                  <EmptySpace pref="444" max="32767" attributes="0"/>
+                  <EmptySpace type="separate" max="-2" attributes="0"/>
+                  <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace type="separate" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jPanelFechaReporte" max="32767" attributes="0"/>
+                      <Group type="102" alignment="1" attributes="0">
+                          <EmptySpace min="0" pref="64" max="32767" attributes="0"/>
+                          <Component id="jButtonGenerarReporte" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
               </Group>
           </Group>
         </DimensionLayout>
         <DimensionLayout dim="1">
           <Group type="103" groupAlignment="0" attributes="0">
-              <Group type="102" alignment="0" attributes="0">
+              <Group type="102" attributes="0">
                   <EmptySpace max="-2" attributes="0"/>
-                  <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
-                  <EmptySpace max="-2" attributes="0"/>
-                  <Component id="jButtonSeleccionarAsientosVenta" min="-2" max="-2" attributes="0"/>
-                  <EmptySpace max="-2" attributes="0"/>
-                  <Component id="jButtonRealizarVenta" min="-2" max="-2" attributes="0"/>
-                  <EmptySpace pref="12" max="32767" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" attributes="0">
+                          <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Component id="jButtonSeleccionarAsientosVenta" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Component id="jButtonRealizarVenta" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace pref="24" max="32767" attributes="0"/>
+                      </Group>
+                      <Group type="102" alignment="1" attributes="0">
+                          <Group type="103" groupAlignment="1" attributes="0">
+                              <Group type="102" attributes="0">
+                                  <Component id="jPanelFechaReporte" min="-2" max="-2" attributes="0"/>
+                                  <EmptySpace max="32767" attributes="0"/>
+                                  <Component id="jButtonGenerarReporte" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                              <Component id="jPanel1" max="32767" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="6" pref="6" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
               </Group>
           </Group>
         </DimensionLayout>
@@ -116,6 +144,47 @@
             <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
           </AuxValues>
         </Component>
+        <Container class="javax.swing.JPanel" name="jPanelFechaReporte">
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
+          </AuxValues>
+
+          <Layout>
+            <DimensionLayout dim="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+              </Group>
+            </DimensionLayout>
+            <DimensionLayout dim="1">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <EmptySpace min="0" pref="66" max="32767" attributes="0"/>
+              </Group>
+            </DimensionLayout>
+          </Layout>
+        </Container>
+        <Component class="javax.swing.JButton" name="jButtonGenerarReporte">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Generar reporte"/>
+          </Properties>
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
+          </AuxValues>
+        </Component>
+        <Container class="javax.swing.JPanel" name="jPanel1">
+
+          <Layout>
+            <DimensionLayout dim="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <EmptySpace min="0" pref="638" max="32767" attributes="0"/>
+              </Group>
+            </DimensionLayout>
+            <DimensionLayout dim="1">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+              </Group>
+            </DimensionLayout>
+          </Layout>
+        </Container>
       </SubComponents>
     </Container>
   </SubComponents>
diff --git a/ProyectoVentaBoletos/src/main/java/view/MenuSala.java b/ProyectoVentaBoletos/src/main/java/view/MenuSala.java
index 73d3549..d588c17 100644
--- a/ProyectoVentaBoletos/src/main/java/view/MenuSala.java
+++ b/ProyectoVentaBoletos/src/main/java/view/MenuSala.java
@@ -3,24 +3,38 @@ package view;
 import controller.MenuSalaController;
 import java.awt.BorderLayout;
 import java.awt.Color;
+import java.awt.FlowLayout;
 import java.util.ArrayList;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JToggleButton;
 import model.Boleto;
+import com.toedter.calendar.JDateChooser;
+import java.awt.GridBagLayout;
+import java.awt.GridLayout;
+import javax.swing.JLabel;
 
 public class MenuSala extends javax.swing.JPanel {
     
     private int idEvento;
     private String nombre;
     
+    public JDateChooser fechaInicioReporte;
+    public JDateChooser fechaFinalReporte;
+    private JLabel labelFechaInicio;
+    private JLabel labelFechaFinal;
+    
     public MenuSala(int idEvento, String nombre) {
         this.idEvento = idEvento;
         this.nombre = nombre;
         initComponents();
+        iniciarPanelFechaReporte();
         MenuSalaController menuSalaController = new MenuSalaController(this);
         jButtonSeleccionarAsientosVenta.addActionListener(menuSalaController);
         jButtonRealizarVenta.addActionListener(menuSalaController);
+        jButtonGenerarReporte.addActionListener(menuSalaController);
+        fechaInicioReporte.addPropertyChangeListener(menuSalaController);
+        fechaFinalReporte.addPropertyChangeListener(menuSalaController);
     }
     
     public int getIdEvento() {
@@ -41,6 +55,19 @@ public class MenuSala extends javax.swing.JPanel {
         return opcion;
     }
     
+    public void iniciarPanelFechaReporte(){
+        jPanelFechaReporte.setLayout(new GridLayout(2,2));
+        fechaInicioReporte = new JDateChooser();
+        fechaFinalReporte = new JDateChooser();
+        labelFechaInicio = new JLabel("Fecha inicio: ");
+        labelFechaFinal= new JLabel("Fecha final: ");
+        
+        jPanelFechaReporte.add(labelFechaInicio);
+        jPanelFechaReporte.add(fechaInicioReporte);
+        jPanelFechaReporte.add(labelFechaFinal);
+        jPanelFechaReporte.add(fechaFinalReporte);
+    }
+    
     @SuppressWarnings("unchecked")
     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
     private void initComponents() {
@@ -50,6 +77,9 @@ public class MenuSala extends javax.swing.JPanel {
         jLabel1 = new javax.swing.JLabel();
         jButtonSeleccionarAsientosVenta = new javax.swing.JButton();
         jButtonRealizarVenta = new javax.swing.JButton();
+        jPanelFechaReporte = new javax.swing.JPanel();
+        jButtonGenerarReporte = new javax.swing.JButton();
+        jPanel1 = new javax.swing.JPanel();
 
         javax.swing.GroupLayout jPanelBotonesLayout = new javax.swing.GroupLayout(jPanelBotones);
         jPanelBotones.setLayout(jPanelBotonesLayout);
@@ -59,7 +89,7 @@ public class MenuSala extends javax.swing.JPanel {
         );
         jPanelBotonesLayout.setVerticalGroup(
             jPanelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 448, Short.MAX_VALUE)
+            .addGap(0, 436, Short.MAX_VALUE)
         );
 
         jPanel2.setForeground(new java.awt.Color(0, 0, 0));
@@ -71,6 +101,30 @@ public class MenuSala extends javax.swing.JPanel {
         jButtonRealizarVenta.setText("Realizar venta");
         jButtonRealizarVenta.setEnabled(false);
 
+        javax.swing.GroupLayout jPanelFechaReporteLayout = new javax.swing.GroupLayout(jPanelFechaReporte);
+        jPanelFechaReporte.setLayout(jPanelFechaReporteLayout);
+        jPanelFechaReporteLayout.setHorizontalGroup(
+            jPanelFechaReporteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 0, Short.MAX_VALUE)
+        );
+        jPanelFechaReporteLayout.setVerticalGroup(
+            jPanelFechaReporteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 66, Short.MAX_VALUE)
+        );
+
+        jButtonGenerarReporte.setText("Generar reporte");
+
+        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 638, Short.MAX_VALUE)
+        );
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 0, Short.MAX_VALUE)
+        );
+
         javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
         jPanel2.setLayout(jPanel2Layout);
         jPanel2Layout.setHorizontalGroup(
@@ -81,18 +135,36 @@ public class MenuSala extends javax.swing.JPanel {
                     .addComponent(jLabel1)
                     .addComponent(jButtonSeleccionarAsientosVenta, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                     .addComponent(jButtonRealizarVenta, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
-                .addContainerGap(444, Short.MAX_VALUE))
+                .addGap(18, 18, 18)
+                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addGap(18, 18, 18)
+                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jPanelFechaReporte, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
+                        .addGap(0, 64, Short.MAX_VALUE)
+                        .addComponent(jButtonGenerarReporte)))
+                .addContainerGap())
         );
         jPanel2Layout.setVerticalGroup(
             jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(jPanel2Layout.createSequentialGroup()
                 .addContainerGap()
-                .addComponent(jLabel1)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(jButtonSeleccionarAsientosVenta)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(jButtonRealizarVenta)
-                .addContainerGap(12, Short.MAX_VALUE))
+                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanel2Layout.createSequentialGroup()
+                        .addComponent(jLabel1)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jButtonSeleccionarAsientosVenta)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jButtonRealizarVenta)
+                        .addContainerGap(24, Short.MAX_VALUE))
+                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
+                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                            .addGroup(jPanel2Layout.createSequentialGroup()
+                                .addComponent(jPanelFechaReporte, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                                .addComponent(jButtonGenerarReporte))
+                            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                        .addGap(6, 6, 6))))
         );
 
         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
@@ -118,10 +190,13 @@ public class MenuSala extends javax.swing.JPanel {
 
 
     // Variables declaration - do not modify//GEN-BEGIN:variables
+    public javax.swing.JButton jButtonGenerarReporte;
     public javax.swing.JButton jButtonRealizarVenta;
     public javax.swing.JButton jButtonSeleccionarAsientosVenta;
     private javax.swing.JLabel jLabel1;
-    private javax.swing.JPanel jPanel2;
+    private javax.swing.JPanel jPanel1;
+    public javax.swing.JPanel jPanel2;
     public javax.swing.JPanel jPanelBotones;
+    public javax.swing.JPanel jPanelFechaReporte;
     // End of variables declaration//GEN-END:variables
 }
diff --git a/ProyectoVentaBoletos/src/main/java/view/RegistrarEvento.form b/ProyectoVentaBoletos/src/main/java/view/RegistrarEvento.form
new file mode 100644
index 0000000..99594c8
--- /dev/null
+++ b/ProyectoVentaBoletos/src/main/java/view/RegistrarEvento.form
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="jTextFieldNombre" min="-2" pref="179" max="-2" attributes="0"/>
+                  </Group>
+                  <Component id="jPanelFecha" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <Component id="jButtonRegistrarEvento" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="0" pref="76" max="32767" attributes="0"/>
+                  </Group>
+                  <Component id="jPanel1" max="32767" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="jTextFieldNombre" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jButtonRegistrarEvento" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="jPanelFecha" max="32767" attributes="0"/>
+                  <Group type="102" alignment="1" attributes="0">
+                      <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+                      <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="jLabel1">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="Nombre:"/>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="jTextFieldNombre">
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
+      </AuxValues>
+    </Component>
+    <Container class="javax.swing.JPanel" name="jPanelFecha">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="232" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+    </Container>
+    <Component class="javax.swing.JButton" name="jButtonRegistrarEvento">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="Registrar"/>
+      </Properties>
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="1"/>
+      </AuxValues>
+    </Component>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="94" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+    </Container>
+  </SubComponents>
+</Form>
diff --git a/ProyectoVentaBoletos/src/main/java/view/RegistrarEvento.java b/ProyectoVentaBoletos/src/main/java/view/RegistrarEvento.java
new file mode 100644
index 0000000..86c583b
--- /dev/null
+++ b/ProyectoVentaBoletos/src/main/java/view/RegistrarEvento.java
@@ -0,0 +1,112 @@
+package view;
+import com.toedter.calendar.JDateChooser;
+import java.awt.FlowLayout;
+import javax.swing.JApplet;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import controller.RegistrarEventoController;
+import java.awt.BorderLayout;
+
+public class RegistrarEvento extends javax.swing.JPanel {
+    private RegistrarEventoController registrarEventoController;
+    public JDateChooser fecha;
+
+    public RegistrarEvento() {
+        initComponents();
+        jPanelFecha.setLayout(new FlowLayout());
+        JLabel labelFecha = new JLabel("Fecha: ");
+        fecha = new JDateChooser();
+        jPanelFecha.add(labelFecha);
+        jPanelFecha.add(fecha);
+        
+        registrarEventoController = new RegistrarEventoController(this);
+        jButtonRegistrarEvento.addActionListener(registrarEventoController);
+    }
+    
+    public void mensaje(String mensaje){
+        JOptionPane.showMessageDialog(this, mensaje);
+    }
+    
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jLabel1 = new javax.swing.JLabel();
+        jTextFieldNombre = new javax.swing.JTextField();
+        jPanelFecha = new javax.swing.JPanel();
+        jButtonRegistrarEvento = new javax.swing.JButton();
+        jPanel1 = new javax.swing.JPanel();
+
+        jLabel1.setText("Nombre:");
+
+        javax.swing.GroupLayout jPanelFechaLayout = new javax.swing.GroupLayout(jPanelFecha);
+        jPanelFecha.setLayout(jPanelFechaLayout);
+        jPanelFechaLayout.setHorizontalGroup(
+            jPanelFechaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 232, Short.MAX_VALUE)
+        );
+        jPanelFechaLayout.setVerticalGroup(
+            jPanelFechaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 0, Short.MAX_VALUE)
+        );
+
+        jButtonRegistrarEvento.setText("Registrar");
+
+        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 0, Short.MAX_VALUE)
+        );
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 94, Short.MAX_VALUE)
+        );
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(jLabel1)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jTextFieldNombre, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addComponent(jPanelFecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addGap(18, 18, 18)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(jButtonRegistrarEvento)
+                        .addGap(0, 76, Short.MAX_VALUE))
+                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jTextFieldNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel1)
+                    .addComponent(jButtonRegistrarEvento))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jPanelFecha, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+                        .addGap(0, 0, Short.MAX_VALUE)
+                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                .addContainerGap())
+        );
+    }// </editor-fold>//GEN-END:initComponents
+
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    public javax.swing.JButton jButtonRegistrarEvento;
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JPanel jPanelFecha;
+    public javax.swing.JTextField jTextFieldNombre;
+    // End of variables declaration//GEN-END:variables
+}