Modificado VentanaPago(agregue metodos de pago)

This commit is contained in:
Luis.Aguilar 2025-03-09 12:25:15 -06:00
parent 40188bfb53
commit ee1b46cadf
1 changed files with 113 additions and 9 deletions
src/main/java/org/example/saladeconciertos

View File

@ -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");