Agregue las opciones de pago y el generador de pdf

This commit is contained in:
Luis.Aguilar 2025-03-09 14:51:34 -06:00
parent a891a333c6
commit 4d91e64c2e
4 changed files with 68 additions and 7 deletions
src/main
java
resources

View File

@ -2,6 +2,7 @@ module org.example.saladeconciertos {
requires javafx.controls;
requires javafx.fxml;
requires java.sql;
requires org.apache.pdfbox;
opens org.example.saladeconciertos to javafx.fxml;

View File

@ -0,0 +1,59 @@
package org.example.saladeconciertos;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.Standard14Fonts;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.File;
import java.io.IOException;
public class PDFGenerator {
public static void generarPDF(String eventName, String eventDate, String clientName, double totalPrice, String qrImagePath) {
// Ruta donde se guardará el PDF
String downloadsPath = System.getProperty("user.home") + "/Downloads/";
String fileName = "Ticket_" + eventName.replace(" ", "_") + ".pdf";
String pdfPath = downloadsPath + fileName;
try (PDDocument document = new PDDocument()) {
// Crear una nueva página
PDPage page = new PDPage();
document.addPage(page);
// Crear un flujo de contenido para la página
try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
// Configurar la fuente y el tamaño (usando Standard14Fonts)
PDType1Font font = new PDType1Font(Standard14Fonts.FontName.HELVETICA_BOLD);
contentStream.setFont(font, 12);
// Escribir los detalles del ticket
contentStream.beginText();
contentStream.newLineAtOffset(50, 700);
contentStream.showText("Evento: " + eventName);
contentStream.newLineAtOffset(0, -20);
contentStream.showText("Fecha: " + eventDate);
contentStream.newLineAtOffset(0, -20);
contentStream.showText("Cliente: " + clientName);
contentStream.newLineAtOffset(0, -20);
contentStream.showText("Total: $" + String.format("%.2f", totalPrice));
contentStream.endText();
// Agregar la imagen del código QR (si existe)
if (qrImagePath != null && !qrImagePath.isEmpty()) {
PDImageXObject qrImage = PDImageXObject.createFromFile(qrImagePath, document);
contentStream.drawImage(qrImage, 50, 500, 150, 150); // Ajusta la posición y el tamaño de la imagen
}
}
// Guardar el PDF en la carpeta de descargas
document.save(pdfPath);
System.out.println("Ticket generado y guardado en: " + pdfPath);
} catch (IOException e) {
e.printStackTrace();
System.out.println("Error al generar el PDF del ticket.");
}
}
}

View File

@ -8,11 +8,9 @@ import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import java.sql.*;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public class VentanaPago {
private static final String DB_URL = "jdbc:mysql://sql10.freesqldatabase.com:3306/sql10766655";
@ -156,8 +154,8 @@ public class VentanaPago {
// Envolver el layout en un ScrollPane
ScrollPane scrollPane = new ScrollPane(paymentLayout);
scrollPane.setFitToWidth(true);
scrollPane.setFitToHeight(true);
scrollPane.setFitToWidth(true); // Ajustar el ancho del contenido al ScrollPane
scrollPane.setFitToHeight(true); // Ajustar la altura del contenido al ScrollPane
// Configurar la escena y mostrar la ventana
Scene paymentScene = new Scene(scrollPane, 400, 450);
@ -166,19 +164,18 @@ public class VentanaPago {
paymentStage.show();
}
// Método para validar tarjeta
private boolean validarTarjeta(String cardNumber, String expiryDate, String cvv) {
return cardNumber.matches("\\d{13}") && // 13 dígitos
expiryDate.matches("(0[1-9]|1[0-2])/[0-9]{2}") && // MM/YY
cvv.matches("\\d{3}"); // 3 dígitos
}
// Método para validar email
private boolean validarEmail(String email) {
return Pattern.compile("^[A-Za-z0-9+_.-]+@(.+)$").matcher(email).matches();
return email.matches("^[A-Za-z0-9+_.-]+@(.+)$"); // Validación básica de correo
}
private void generarTicket(String clientName, List<Integer> selectedSeats, Map<Integer, Double> seatPrices, String eventName, String eventDate, double totalPrice) {
// Mostrar el ticket en una ventana (como antes)
StringBuilder ticketDetails = new StringBuilder();
ticketDetails.append("Evento: ").append(eventName).append("\n");
ticketDetails.append("Fecha: ").append(eventDate).append("\n");
@ -191,6 +188,10 @@ public class VentanaPago {
mostrarAlerta("Ticket Generado", "Detalles del Ticket", ticketDetails.toString());
// Generar el PDF del ticket usando la clase PDFGenerator
String qrImagePath = "src/main/resources/qrcode.png"; // Cambia esto por la ruta de tu imagen QR
PDFGenerator.generarPDF(eventName, eventDate, clientName, totalPrice, qrImagePath);
// Actualizar el estado de los boletos comprados en la base de datos
actualizarEstadoBoletos(selectedSeats, 1); // Cambia el idevento según corresponda
}

Binary file not shown.

After

(image error) Size: 703 B