From ee1b46cadfa7ded8a249e90558c76a682e5cf5b6 Mon Sep 17 00:00:00 2001 From: "Luis.Aguilar" <aguilar.luiseder27@gmail.com> Date: Sun, 9 Mar 2025 12:25:15 -0600 Subject: [PATCH] Modificado VentanaPago(agregue metodos de pago) --- .../example/saladeconciertos/VentanaPago.java | 122 ++++++++++++++++-- 1 file changed, 113 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/example/saladeconciertos/VentanaPago.java b/src/main/java/org/example/saladeconciertos/VentanaPago.java index 312a6b8..c7a2741 100644 --- a/src/main/java/org/example/saladeconciertos/VentanaPago.java +++ b/src/main/java/org/example/saladeconciertos/VentanaPago.java @@ -1,14 +1,18 @@ package org.example.saladeconciertos; + import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.VBox; import javafx.stage.Stage; 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"; @@ -28,7 +32,7 @@ public class VentanaPago { VBox paymentLayout = new VBox(20); paymentLayout.setPadding(new Insets(20)); paymentLayout.getStyleClass().add("payment-window"); // Aplicar clase CSS - paymentLayout.setAlignment(Pos.CENTER); + paymentLayout.setAlignment(Pos.TOP_CENTER); // Título de la ventana Label titleLabel = new Label("Confirmar Compra"); @@ -47,33 +51,133 @@ public class VentanaPago { nameField.setPromptText("Nombre del cliente"); nameField.setMaxWidth(200); + // Selección de método de pago + ChoiceBox<String> paymentMethod = new ChoiceBox<>(); + paymentMethod.getItems().addAll("Tarjeta de Crédito/Débito", "PayPal"); + paymentMethod.setValue(null); // No seleccionar ningún método por defecto + + // Campos para tarjeta de crédito/débito + VBox cardFields = new VBox(10); + cardFields.setAlignment(Pos.TOP_CENTER); // Centrar los campos + TextField cardNumberField = new TextField(); + cardNumberField.setPromptText("Número de tarjeta (13 dígitos)"); + cardNumberField.setMaxWidth(200); + + TextField expiryDateField = new TextField(); + expiryDateField.setPromptText("MM/YY"); + expiryDateField.setMaxWidth(200); + + TextField cvvField = new TextField(); + cvvField.setPromptText("CVV"); + cvvField.setMaxWidth(200); + + cardFields.getChildren().addAll(cardNumberField, expiryDateField, cvvField); + cardFields.setVisible(false); // Ocultar al inicio + + // Campo para PayPal + VBox paypalFields = new VBox(10); + paypalFields.setAlignment(Pos.TOP_CENTER); // Centrar los campos + TextField emailField = new TextField(); + emailField.setPromptText("Correo electrónico de PayPal"); + emailField.setMaxWidth(200); + + paypalFields.getChildren().add(emailField); + paypalFields.setVisible(false); // Ocultar al inicio + // Botón para confirmar el pago Button payButton = new Button("Pagar"); payButton.getStyleClass().add("button"); // Aplicar clase CSS + payButton.setDisable(true); // Deshabilitar al inicio + + // Contenedor dinámico para campos y botón + VBox dynamicContainer = new VBox(10); + dynamicContainer.setAlignment(Pos.TOP_CENTER); // Centrar el contenido + + // Mostrar u ocultar campos según el método de pago seleccionado + paymentMethod.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> { + boolean isCard = newVal != null && newVal.equals("Tarjeta de Crédito/Débito"); + boolean isPayPal = newVal != null && newVal.equals("PayPal"); + + cardFields.setVisible(isCard); + paypalFields.setVisible(isPayPal); + + // Habilitar el botón de pago si se selecciona un método + payButton.setDisable(newVal == null); + + // Actualizar el contenedor dinámico + dynamicContainer.getChildren().clear(); + if (isCard) { + dynamicContainer.getChildren().addAll(cardFields, payButton); + } else if (isPayPal) { + dynamicContainer.getChildren().addAll(paypalFields, payButton); + } else { + dynamicContainer.getChildren().add(payButton); + } + }); payButton.setOnAction(e -> { String clientName = nameField.getText(); if (clientName.isEmpty()) { mostrarAlerta("Advertencia", "Nombre del cliente vacío", "Por favor, ingrese el nombre del cliente."); - } else { - generarTicket(clientName, selectedSeats, seatPrices, eventName, eventDate, totalPrice); - paymentStage.close(); - - // Refrescar la interfaz de VentaBoletos después de cerrar la ventana de pago - ventaBoletos.refrescarInterfaz(); + return; } + + String method = paymentMethod.getValue(); + if (method.equals("Tarjeta de Crédito/Débito")) { + String cardNumber = cardNumberField.getText(); + String expiryDate = expiryDateField.getText(); + String cvv = cvvField.getText(); + + if (!validarTarjeta(cardNumber, expiryDate, cvv)) { + mostrarAlerta("Error", "Datos de tarjeta inválidos", "Por favor, ingrese un número de tarjeta válido (13 dígitos), fecha (MM/YY) y CVV."); + return; + } + } else if (method.equals("PayPal")) { + String email = emailField.getText(); + if (!validarEmail(email)) { + mostrarAlerta("Error", "Correo inválido", "Por favor, ingrese un correo electrónico válido."); + return; + } + } + + // Si todo está correcto, generar el ticket + generarTicket(clientName, selectedSeats, seatPrices, eventName, eventDate, totalPrice); + paymentStage.close(); + ventaBoletos.refrescarInterfaz(); }); // Agregar elementos al layout - paymentLayout.getChildren().addAll(titleLabel, eventLabel, dateLabel, totalLabel, new Label("Nombre del cliente:"), nameField, payButton); + paymentLayout.getChildren().addAll( + titleLabel, eventLabel, dateLabel, totalLabel, + new Label("Nombre del cliente:"), nameField, + new Label("Método de pago:"), paymentMethod, + dynamicContainer + ); + + // Envolver el layout en un ScrollPane + ScrollPane scrollPane = new ScrollPane(paymentLayout); + scrollPane.setFitToWidth(true); + scrollPane.setFitToHeight(true); // Configurar la escena y mostrar la ventana - Scene paymentScene = new Scene(paymentLayout, 400, 300); + Scene paymentScene = new Scene(scrollPane, 400, 450); paymentScene.getStylesheets().add(getClass().getResource("/styles.css").toExternalForm()); // Aplicar CSS paymentStage.setScene(paymentScene); 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(); + } + private void generarTicket(String clientName, List<Integer> selectedSeats, Map<Integer, Double> seatPrices, String eventName, String eventDate, double totalPrice) { StringBuilder ticketDetails = new StringBuilder(); ticketDetails.append("Evento: ").append(eventName).append("\n");