<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Commander une Boîte Vocale — 5sur5Séjour</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap" rel="stylesheet">
<link href="{{ asset('Accueil/vendors/bootstrap/bootstrap.min.css') }}" rel="stylesheet">
<link href="{{ asset('Accueil/vendors/bootstrap-icons/font/bootstrap-icons.min.css') }}" rel="stylesheet">
<style>
:root {
--orange5sur5: #FF6B35;
--orange-dark: #e65a2a;
--teal5sur5: #41A2AA;
--teal-dark: #369da6;
--ink: #0E1726;
--muted: #6c757d;
--soft: #f8f9fa;
}
body {
font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial;
background: linear-gradient(135deg, #fff5f2 0%, #e3f2f3 100%);
min-height: 100vh;
padding: 20px 0;
}
.checkout-container {
max-width: 1200px;
margin: 0 auto;
}
.checkout-header {
text-align: center;
margin-bottom: 40px;
color: var(--ink);
}
.checkout-header .logo {
max-width: 180px;
margin-bottom: 20px;
}
.checkout-header h1 {
font-size: 2rem;
font-weight: 800;
margin-bottom: 8px;
color: var(--ink);
}
.checkout-header .subtitle {
color: var(--muted);
font-size: 1rem;
}
.checkout-card {
background: #fff;
border-radius: 20px;
box-shadow: 0 8px 32px rgba(0,0,0,.08);
padding: 40px;
margin-bottom: 24px;
}
.step-indicator {
display: flex;
justify-content: center;
align-items: center;
gap: 12px;
margin-bottom: 40px;
flex-wrap: wrap;
}
.step {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
border-radius: 999px;
background: #e9ecef;
color: #6c757d;
font-size: 0.9rem;
font-weight: 600;
}
.step.active {
background: var(--orange5sur5);
color: #fff;
}
.step.completed {
background: var(--teal5sur5);
color: #fff;
}
.step-number {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 50%;
background: rgba(255,255,255,.25);
font-size: 0.85rem;
font-weight: 700;
}
.section-title {
font-size: 1.5rem;
font-weight: 700;
color: var(--ink);
margin-bottom: 24px;
display: flex;
align-items: center;
gap: 12px;
}
.section-title i {
color: var(--orange5sur5);
}
.form-label {
font-weight: 600;
color: var(--ink);
margin-bottom: 8px;
}
.form-control, .form-select {
border: 2px solid #e9ecef;
border-radius: 10px;
padding: 12px 16px;
font-size: 0.95rem;
transition: all 0.2s;
}
.form-control:focus, .form-select:focus {
border-color: var(--orange5sur5);
box-shadow: 0 0 0 0.2rem rgba(255,107,53,0.15);
}
.payment-option {
border: 3px solid #e9ecef;
border-radius: 16px;
padding: 24px;
cursor: pointer;
transition: all 0.25s;
position: relative;
height: 100%;
}
.payment-option:hover {
border-color: var(--orange5sur5);
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(255,107,53,0.15);
}
.payment-option input[type="radio"] {
position: absolute;
top: 20px;
right: 20px;
width: 24px;
height: 24px;
cursor: pointer;
}
.payment-option.selected {
border-color: var(--orange5sur5);
background: rgba(255,107,53,0.03);
}
.payment-option .badge-recommended {
position: absolute;
top: -12px;
left: 20px;
background: linear-gradient(135deg, var(--orange5sur5) 0%, var(--orange-dark) 100%);
color: #fff;
padding: 4px 12px;
border-radius: 999px;
font-size: 0.75rem;
font-weight: 700;
}
.payment-title {
font-size: 1.25rem;
font-weight: 700;
color: var(--ink);
margin-bottom: 8px;
}
.payment-subtitle {
color: var(--muted);
font-size: 0.9rem;
margin-bottom: 16px;
}
.payment-features {
list-style: none;
padding: 0;
margin: 0;
}
.payment-features li {
display: flex;
align-items: start;
gap: 8px;
margin: 8px 0;
font-size: 0.9rem;
color: #495057;
}
.payment-features i {
color: var(--teal5sur5);
margin-top: 2px;
font-size: 1rem;
}
.summary-card {
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
border-radius: 16px;
padding: 24px;
position: sticky;
top: 20px;
}
.summary-title {
font-size: 1.25rem;
font-weight: 700;
color: var(--ink);
margin-bottom: 20px;
}
.summary-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid #dee2e6;
}
.summary-row:last-child {
border-bottom: none;
padding-top: 16px;
font-size: 1.25rem;
font-weight: 700;
}
.summary-label {
color: #6c757d;
font-size: 0.95rem;
}
.summary-value {
font-weight: 600;
color: var(--ink);
}
.btn-primary-custom {
background: linear-gradient(135deg, var(--orange5sur5) 0%, var(--orange-dark) 100%);
border: none;
color: #fff;
padding: 16px 32px;
border-radius: 14px;
font-weight: 700;
font-size: 1.1rem;
width: 100%;
transition: all 0.25s;
}
.btn-primary-custom:hover {
transform: translateY(-2px);
box-shadow: 0 12px 28px rgba(255,107,53,0.3);
color: #fff;
}
.btn-primary-custom:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
}
.btn-secondary-custom {
background: transparent;
border: 2px solid #dee2e6;
color: var(--muted);
padding: 14px 32px;
border-radius: 14px;
font-weight: 600;
transition: all 0.2s;
}
.btn-secondary-custom:hover {
border-color: var(--orange5sur5);
color: var(--orange5sur5);
}
.security-badge {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 12px;
background: rgba(65, 162, 170, 0.1);
border-radius: 10px;
margin-top: 20px;
font-size: 0.85rem;
color: var(--teal5sur5);
font-weight: 600;
}
.form-check-input:checked {
background-color: var(--orange5sur5);
border-color: var(--orange5sur5);
}
.info-box {
background: #e7f3ff;
border-left: 4px solid #0066cc;
padding: 16px;
border-radius: 8px;
margin: 20px 0;
}
.info-box i {
color: #0066cc;
margin-right: 8px;
}
.loader {
display: inline-block;
width: 20px;
height: 20px;
border: 3px solid rgba(255,255,255,.3);
border-radius: 50%;
border-top-color: #fff;
animation: spin 1s ease-in-out infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
@media (max-width: 768px) {
.checkout-card {
padding: 24px;
}
.section-title {
font-size: 1.25rem;
}
.summary-card {
position: static;
margin-top: 24px;
}
}
/* Style du bouton personnalisé */
.btn-boite-vocale {
background: color-mix(in srgb, var(--bs-secondary), transparent 70%);
color: #41a2aa;
border: none;
padding: 16px 32px;
border-radius: 14px;
font-weight: 700;
font-size: 1.1rem;
width: 100%;
transition: all 0.25s;
display: inline-flex;
align-items: center;
justify-content: center;
}
.btn-boite-vocale:hover {
background: color-mix(in srgb, var(--bs-secondary), transparent 50%);
color: #41a2aa;
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(65, 162, 170, 0.2);
}
.btn-boite-vocale svg {
margin-left: 8px;
}
</style>
</head>
<body>
<div class="checkout-container">
<!-- Header -->
<div class="checkout-header">
<img src="{{ asset('/Accueil/imagesAccueil/logoHeader.svg') }}" alt="5sur5 Séjour" class="logo">
<h1><i class="bi bi-mic-fill"></i> Commander une Boîte Vocale</h1>
<p class="subtitle">Remplissez vos informations pour activer votre boîte vocale</p>
</div>
<!-- Step Indicator -->
<div class="step-indicator">
<div class="step active" id="step1-indicator">
<span class="step-number">1</span>
<span>Informations</span>
</div>
<i class="bi bi-chevron-right text-muted"></i>
<div class="step" id="step2-indicator">
<span class="step-number">2</span>
<span>Paiement</span>
</div>
<i class="bi bi-chevron-right text-muted"></i>
<div class="step" id="step3-indicator">
<span class="step-number">3</span>
<span>Confirmation</span>
</div>
</div>
<form id="checkoutForm" method="post" action="{{ path('checkout_process_boite_vocale') }}">
<div class="row g-4">
<!-- Main Content -->
<div class="col-lg-8">
<!-- Step 1: Account Information -->
<div class="checkout-card" id="step1">
<div class="section-title">
<i class="bi bi-building"></i>
Informations de la structure
</div>
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">Nom de la structure *</label>
<input type="text" class="form-control" name="company_name" required placeholder="Ex: Association des Voyageurs">
</div>
<div class="col-md-6">
<label class="form-label">Type de structure *</label>
<select class="form-select" name="company_type" required>
<option value="">Sélectionnez...</option>
<option value="ecole_publique">École publique</option>
<option value="ecole_privee">École privée</option>
<option value="college">Collège</option>
<option value="lycee">Lycée</option>
<option value="association">Association</option>
<option value="collectivite">Collectivité</option>
<option value="centre_loisirs">Centre de loisirs</option>
<option value="autre">Autre</option>
</select>
</div>
<div class="col-md-6">
<label class="form-label">SIREN / SIRET</label>
<input type="text" class="form-control" name="siren" placeholder="Ex: 123 456 789 00012">
<small class="text-muted">Optionnel, pour la facturation</small>
</div>
<div class="col-md-6">
<label class="form-label">Téléphone *</label>
<input type="tel" class="form-control" name="phone" required placeholder="06 12 34 56 78">
</div>
<div class="col-12">
<label class="form-label">Adresse *</label>
<input type="text" class="form-control" name="address" required placeholder="12 rue de la République">
</div>
<div class="col-md-4">
<label class="form-label">Code postal *</label>
<input type="text" class="form-control" name="postal_code" required placeholder="75001">
</div>
<div class="col-md-8">
<label class="form-label">Ville *</label>
<input type="text" class="form-control" name="city" required placeholder="Paris">
</div>
</div>
<hr class="my-4">
<!-- Section Informations du séjour -->
<div class="section-title">
<i class="bi bi-calendar-event"></i>
Informations du séjour
</div>
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">Date de début *</label>
<input type="date" class="form-control" name="date_debut" required id="date_debut">
</div>
<div class="col-md-6">
<label class="form-label">Date de fin *</label>
<input type="date" class="form-control" name="date_fin" required id="date_fin">
</div>
<div class="col-md-6">
<label class="form-label">Nombre de participants *</label>
<input type="number" class="form-control" name="nombre_participants" required id="nombre_participants" min="1" placeholder="Nombre de participants">
<small class="text-muted" id="participants_hint"></small>
</div>
<div class="col-md-6">
<label class="form-label">Thème du séjour *</label>
<input type="text" class="form-control" name="theme_sejour" required placeholder="Ex: Classe verte, Camp d'été, Séjour ski">
</div>
<div class="col-12">
<label class="form-label">Adresse du séjour *</label>
<input type="text" class="form-control" name="adresse_sejour" required placeholder="Adresse complète du lieu du séjour">
</div>
</div>
<hr class="my-4">
<div class="section-title">
<i class="bi bi-person-badge"></i>
Contact principal
</div>
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">Prénom *</label>
<input type="text" class="form-control" name="first_name" required placeholder="Jean">
</div>
<div class="col-md-6">
<label class="form-label">Nom *</label>
<input type="text" class="form-control" name="last_name" required placeholder="Dupont">
</div>
<div class="col-md-6">
<label class="form-label">Email *</label>
<input type="email" class="form-control" name="email" required placeholder="j.dupont@structure.fr">
<small class="text-muted">Utilisé pour la confirmation</small>
</div>
<div class="col-md-6">
<label class="form-label">Fonction / Rôle *</label>
<input type="text" class="form-control" name="role" required placeholder="Ex: Directeur, Animateur">
</div>
</div>
<div class="info-box mt-4">
<i class="bi bi-shield-lock-fill"></i>
<strong>Sécurisé :</strong> Vos informations sont protégées et utilisées uniquement pour la commande.
</div>
<div class="d-flex justify-content-end mt-4">
<button type="button" class="btn btn-primary-custom" id="nextStepBtn">
Continuer vers le paiement <i class="bi bi-arrow-right ms-2"></i>
</button>
</div>
</div>
<!-- Step 2: Payment Method -->
<div class="checkout-card" id="step2" style="display: none;">
<div class="section-title">
<i class="bi bi-credit-card-2-front"></i>
Choisissez votre mode de paiement
</div>
<p class="text-muted mb-4">Sélectionnez le mode de règlement qui convient le mieux à votre structure</p>
<div class="row g-4">
<!-- Option 1: Paiement en ligne -->
<div class="col-md-6">
<div class="payment-option" data-payment="online">
<span class="badge-recommended">Recommandé</span>
<input type="radio" name="payment_method" value="online" id="payment-online" required>
<div class="payment-title">Payer en ligne</div>
<div class="payment-subtitle">CB / SEPA — activation immédiate</div>
<ul class="payment-features">
<li><i class="bi bi-check-circle-fill"></i> Paiement sécurisé Stripe</li>
<li><i class="bi bi-check-circle-fill"></i> Facture automatique</li>
<li><i class="bi bi-check-circle-fill"></i> Activation immédiate</li>
<li><i class="bi bi-check-circle-fill"></i> Configuration incluse</li>
</ul>
</div>
</div>
<!-- Option 2: Virement bancaire -->
<div class="col-md-6">
<div class="payment-option" data-payment="bank">
<input type="radio" name="payment_method" value="bank" id="payment-bank" required>
<div class="payment-title">Virement bancaire</div>
<div class="payment-subtitle">Paiement par virement — activation sous 48h</div>
<ul class="payment-features">
<li><i class="bi bi-check-circle-fill"></i> RIB fourni automatiquement</li>
<li><i class="bi bi-check-circle-fill"></i> Facture proforma envoyée</li>
<li><i class="bi bi-check-circle-fill"></i> Activation après réception</li>
</ul>
</div>
</div>
</div>
<div class="mt-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="acceptTerms" required>
<label class="form-check-label" for="acceptTerms">
J'accepte les conditions générales d'utilisation et la politique de confidentialité *
</label>
</div>
</div>
<div id="submitWarning" class="alert alert-warning mt-3" style="display: none;">
<i class="bi bi-exclamation-triangle me-2"></i>
<strong>Pour continuer :</strong> Sélectionnez un mode de paiement et acceptez les conditions générales.
</div>
<div class="d-flex justify-content-between mt-4">
<button type="button" class="btn btn-secondary-custom" id="prevStepBtn">
<i class="bi bi-arrow-left me-2"></i>Retour
</button>
<button type="submit" class="btn btn-primary-custom" id="submitBtn" disabled>
<span id="submitText">Finaliser la commande</span>
<span id="submitLoader" class="loader" style="display: none;"></span>
</button>
</div>
</div>
</div>
<!-- Sidebar: Summary -->
<div class="col-lg-4">
<div class="summary-card">
<div class="summary-title">
<i class="bi bi-receipt"></i> Récapitulatif
</div>
<div class="summary-row">
<div>
<div class="fw-bold" id="pack-name">Boîte Vocale</div>
<small class="text-muted" id="pack-subtitle">Pack sélectionné</small>
</div>
<div class="summary-value" id="pack-price">- </div>
</div>
<div class="summary-row">
<div class="summary-label">Configuration incluse</div>
<div class="summary-value text-success">Inclus</div>
</div>
<div class="summary-row">
<div class="summary-label">Support</div>
<div class="summary-value text-success">Inclus</div>
</div>
<div class="summary-row">
<div class="summary-label">Total HT</div>
<div class="summary-value text-success" id="total-price">-</div>
</div>
<hr class="my-3">
<div style="font-size: 0.85rem; color: var(--muted);">
<p class="mb-2"><i class="bi bi-check-circle text-success me-2"></i> Messages illimités</p>
<p class="mb-2"><i class="bi bi-check-circle text-success me-2"></i> Appels automatiques</p>
<p class="mb-2"><i class="bi bi-check-circle text-success me-2"></i> Configuration par notre équipe</p>
<p class="mb-2"><i class="bi bi-check-circle text-success me-2"></i> Support pendant le séjour</p>
</div>
<div class="alert alert-info mt-3 small mb-0">
<i class="bi bi-info-circle me-2"></i>
La boîte vocale sera activée dès réception du paiement.
</div>
</div>
</div>
</div>
<input type="hidden" name="pack_type" id="pack_type" value="{{ pack_type|default('35') }}">
</form>
</div>
<script src="{{ asset('Accueil/vendors/bootstrap/bootstrap.bundle.min.js') }}"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const form = document.getElementById('checkoutForm');
const step1 = document.getElementById('step1');
const step2 = document.getElementById('step2');
const step1Indicator = document.getElementById('step1-indicator');
const step2Indicator = document.getElementById('step2-indicator');
const nextStepBtn = document.getElementById('nextStepBtn');
const prevStepBtn = document.getElementById('prevStepBtn');
const submitBtn = document.getElementById('submitBtn');
const acceptTerms = document.getElementById('acceptTerms');
const nombreParticipants = document.getElementById('nombre_participants');
const participantsHint = document.getElementById('participants_hint');
const packType = document.getElementById('pack_type').value;
// Configuration des packs selon le type
const packConfigs = {
'35': { name: 'Pack 35 enfants', price: 40, max: 35 },
'70': { name: 'Pack 70 enfants', price: 70, max: 70 },
'plus': { name: 'Grand séjour', price: 0, max: null }
};
// Initialiser selon le pack sélectionné (depuis le serveur ou par défaut)
const currentPack = packConfigs[packType] || packConfigs['35'];
document.getElementById('pack-name').textContent = currentPack.name;
document.getElementById('pack-price').textContent = currentPack.price > 0 ? currentPack.price + ' € HT' : 'Sur devis';
document.getElementById('total-price').textContent = currentPack.price > 0 ? currentPack.price + ' € HT' : 'Sur devis';
if (currentPack.max) {
nombreParticipants.setAttribute('max', currentPack.max);
nombreParticipants.setAttribute('placeholder', 'Jusqu\'à ' + currentPack.max + ' participants');
participantsHint.textContent = 'Maximum ' + currentPack.max + ' participants pour ce pack';
} else {
nombreParticipants.removeAttribute('max');
nombreParticipants.setAttribute('placeholder', 'Nombre de participants');
participantsHint.textContent = 'Plus de 70 participants - devis personnalisé';
}
// Validation de la date de fin après la date de début
const dateDebut = document.getElementById('date_debut');
const dateFin = document.getElementById('date_fin');
dateDebut.addEventListener('change', function() {
if (this.value) {
dateFin.setAttribute('min', this.value);
}
});
// Payment option selection
const paymentOptions = document.querySelectorAll('.payment-option');
const paymentRadios = document.querySelectorAll('input[name="payment_method"]');
paymentOptions.forEach(option => {
option.addEventListener('click', function() {
const radio = this.querySelector('input[type="radio"]');
radio.checked = true;
paymentOptions.forEach(opt => opt.classList.remove('selected'));
this.classList.add('selected');
updateSubmitButton();
});
});
// Step navigation
nextStepBtn.addEventListener('click', function() {
if (!validateStep1()) {
return;
}
step1.style.display = 'none';
step2.style.display = 'block';
step1Indicator.classList.remove('active');
step1Indicator.classList.add('completed');
step2Indicator.classList.add('active');
window.scrollTo({ top: 0, behavior: 'smooth' });
});
prevStepBtn.addEventListener('click', function() {
step2.style.display = 'none';
step1.style.display = 'block';
step1Indicator.classList.add('active');
step1Indicator.classList.remove('completed');
step2Indicator.classList.remove('active');
window.scrollTo({ top: 0, behavior: 'smooth' });
});
// Validate step 1
function validateStep1() {
const requiredFields = step1.querySelectorAll('[required]');
let isValid = true;
requiredFields.forEach(field => {
if (!field.value.trim()) {
field.classList.add('is-invalid');
isValid = false;
} else {
field.classList.remove('is-invalid');
}
});
// Validation spécifique pour le nombre de participants
if (currentPack.max && parseInt(nombreParticipants.value) > currentPack.max) {
nombreParticipants.classList.add('is-invalid');
alert('Le nombre de participants ne peut pas dépasser ' + currentPack.max + ' pour ce pack.');
isValid = false;
}
// Validation des dates
if (dateDebut.value && dateFin.value && dateFin.value < dateDebut.value) {
dateFin.classList.add('is-invalid');
alert('La date de fin doit être postérieure à la date de début.');
isValid = false;
}
if (!isValid) {
alert('Veuillez remplir tous les champs obligatoires (*) correctement');
}
return isValid;
}
// Update submit button state
function updateSubmitButton() {
const paymentSelected = document.querySelector('input[name="payment_method"]:checked');
const termsAccepted = acceptTerms.checked;
const submitWarning = document.getElementById('submitWarning');
const canSubmit = paymentSelected && termsAccepted;
submitBtn.disabled = !canSubmit;
if (!canSubmit && (step2.style.display !== 'none')) {
submitWarning.style.display = 'block';
} else {
submitWarning.style.display = 'none';
}
}
acceptTerms.addEventListener('change', updateSubmitButton);
paymentRadios.forEach(radio => radio.addEventListener('change', updateSubmitButton));
// Form submission
form.addEventListener('submit', function(e) {
e.preventDefault();
const submitText = document.getElementById('submitText');
const submitLoader = document.getElementById('submitLoader');
submitBtn.disabled = true;
submitText.style.display = 'none';
submitLoader.style.display = 'inline-block';
// Récupérer les données du formulaire
const formData = new FormData(form);
// Envoyer la requête AJAX
fetch(form.action, {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
if (data.paymentType === 'stripe' && data.redirectUrl) {
// Redirection vers Payplug
window.location.href = data.redirectUrl;
} else if (data.paymentType === 'rib') {
// Afficher popup de confirmation pour RIB
showSuccessModal(data.message);
// Rediriger après 3 secondes
setTimeout(() => {
if (data.redirectUrl) {
window.location.href = data.redirectUrl;
}
}, 3000);
} else if (data.redirectUrl) {
window.location.href = data.redirectUrl;
}
} else {
alert(data.error || 'Une erreur est survenue. Veuillez réessayer.');
submitBtn.disabled = false;
submitText.style.display = 'inline';
submitLoader.style.display = 'none';
}
})
.catch(error => {
console.error('Erreur:', error);
alert('Une erreur est survenue lors de l\'envoi de votre demande. Veuillez réessayer.');
submitBtn.disabled = false;
submitText.style.display = 'inline';
submitLoader.style.display = 'none';
});
});
// Fonction pour afficher le modal de succès
function showSuccessModal(message) {
// Créer le modal si il n'existe pas
let modal = document.getElementById('successModal');
if (!modal) {
modal = document.createElement('div');
modal.id = 'successModal';
modal.className = 'modal fade';
modal.innerHTML = `
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-body text-center p-5">
<div class="mb-3">
<i class="bi bi-check-circle-fill text-success" style="font-size: 4rem;"></i>
</div>
<h4 class="mb-3">Commande prise en compte</h4>
<p class="mb-4">${message}</p>
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">Fermer</button>
</div>
</div>
</div>
`;
document.body.appendChild(modal);
}
// Mettre à jour le message
const modalBody = modal.querySelector('.modal-body p');
if (modalBody) {
modalBody.textContent = message;
}
// Afficher le modal
const bsModal = new bootstrap.Modal(modal);
bsModal.show();
}
});
</script>
</body>
</html>