document.addEventListener('DOMContentLoaded', function() { var inputChanged = false let assetVersion = null; function getAssetVersion() { if (assetVersion) return assetVersion; assetVersion = String(Date.now()); return assetVersion; } function openModalUpdate(selectedSubmenu, numParcours) { const elem = document.getElementById('modalUpdate'); const instance = M.Modal.getInstance(elem); document.getElementById('update-OK').addEventListener("click", function () { instance.close() loadForm(selectedSubmenu, numParcours); inputChanged = false }) instance.open(); } // Fonction pour charger le contenu du formulaire function loadForm(submenu, numParcours) { const navLinks = document.querySelectorAll('#navParcoursSelect li a'); const formContainer = document.querySelector('#formContainer'); // Supprimer la classe 'active' de tous les liens navLinks.forEach(navLink => navLink.parentNode.classList.remove('active')); // Ajouter la classe 'active' au lien sélectionné const activeLink = document.querySelector(`#navParcoursSelect li a[href="${submenu}"]`); if (activeLink) { activeLink.parentNode.classList.add('active'); } const parcours = JSON.parse(sessionStorage.getItem('parcours')); const contrat = JSON.parse(sessionStorage.getItem('contrat')); let produit = parcours["@expand"].contrat.produit const produitObj = contrat?.["@expand"]?.enCours || null; // RC utilise tarifRC/projetRC, les autres produits utilisent tarif/projet let tarif, projet; if (produit === "rc") { tarif = produitObj?.["@expand"]?.tarifRC || null; projet = produitObj?.["@expand"]?.projetRC || null; } else { tarif = produitObj?.["@expand"]?.tarif || null; projet = produitObj?.["@expand"]?.projet || null; } let scriptSrc; // let newScriptModuloSrc; // Mettre à jour l'URL sans recharger la page const newUrl = `/navParcours?numParcours=${numParcours}&submenu=${submenu}`; history.pushState({numParcours: numParcours, submenu: submenu}, '', newUrl); if (submenu === "projet") { fetchUrl = `/navParcours/${submenu}${produit}?numParcours=${numParcours}`; scriptSrc = `/js/projet-form-${produit}.js`; } else if (submenu === "tarif") { fetchUrl = `/navParcours/${submenu}${produit}?numParcours=${numParcours}`; scriptSrc = `/js/tarif-form-${produit}.js`; } else { fetchUrl = `/navParcours/${submenu}?numParcours=${numParcours}`; scriptSrc = `/js/${submenu}-form.js`; } // RC utilise tarifRC/projetRC, les autres produits utilisent tarif/projet let tarifId, projetId; if (produit === "rc") { tarifId = contrat?.["@expand"]?.enCours?.["@expand"]?.tarifRC?.id || null; projetId = contrat?.["@expand"]?.enCours?.["@expand"]?.projetRC?.id || null; } else { tarifId = contrat?.["@expand"]?.enCours?.["@expand"]?.tarif?.id || null; projetId = contrat?.["@expand"]?.enCours?.["@expand"]?.projet?.id || null; } const etapes = { "client": contrat?.client || null, "intermediaire": contrat?.intermediaire || null, "tarif": tarifId, "projet": projetId, "contrat": null } for (const [key, value] of Object.entries(etapes)) { document.getElementById('step-' + key).classList = (value) ? 'stepper-item line' : 'stepper-item' if(key == submenu){ document.getElementById('step-' + key).classList.add('active') } else { if (value){ document.getElementById('step-' + key).classList.add('completed') } else if (key == "client" || key == "intermediaire") { document.getElementById('step-' + key).classList.add('empty') } } if (key == "tarif" && etapes['projet']){ document.getElementById('step-' + key).classList.add('line') } } // Charger le formulaire associé fetch(fetchUrl) .then(response => response.text()) .then(html => { formContainer.innerHTML = html; // Suppression de tout script précédemment chargé const oldScript = document.querySelector('script.dynamic-script'); if (oldScript) { oldScript.remove(); } // Création et ajout du nouveau script correspondant au sous-menu const script = document.createElement('script'); script.src = `${scriptSrc}?v=${encodeURIComponent(getAssetVersion())}`; script.className = 'dynamic-script'; script.onload = async function() { if (submenu === "tarif" || submenu == "projet") { try { // Recharger les donnees avant d'initialiser le script du formulaire. await loadParcours(numParcours); const latestParcours = JSON.parse(sessionStorage.getItem('parcours')); const contratId = latestParcours?.["@expand"]?.contrat?.id || null; if (contratId) { await loadContrat(contratId); } } catch (error) { console.error('Erreur lors du rafraichissement parcours/contrat:', error); } } if (typeof window.initSubmenuForm === 'function') { window.initSubmenuForm(); } }; document.body.appendChild(script); document.querySelectorAll('input').forEach((input) => { input.addEventListener('input', function () { inputChanged = true }) }) }) .catch(error => console.error('Error:', error)); // Gestion des boutons de génération pour tous les produits const hasClient = parcours["@expand"]?.contrat?.client != ''; const hasIntermediaire = parcours["@expand"]?.contrat?.intermediaire != ''; const hasProduit = produitObj != undefined; // Bouton génération déclinaison tarifaire if (hasClient && hasIntermediaire && hasProduit && tarif != null) { document.getElementById('generateDeclinaison').disabled = false; } else { document.getElementById('generateDeclinaison').disabled = true; } // Bouton génération projet if (hasClient && hasIntermediaire && hasProduit && projet != null) { document.getElementById('generateProject').disabled = false; } else { document.getElementById('generateProject').disabled = true; } } // Gestionnaire d'événements 'popstate' window.addEventListener('popstate', function (event) { const numParcours = event.state?.numParcours || getNumParcoursFromURL(); const submenu = event.state?.submenu || getSubmenuFromURL(); if (numParcours && submenu) { loadForm(submenu, numParcours); } }); document.getElementById('recueilClauses').addEventListener('click', function() { const parcours = JSON.parse(sessionStorage.getItem('parcours')); var produit = parcours["@expand"].contrat.produit var fileName switch (produit.toLowerCase()) { case 'fac': fileName = "CLAUSES_RECUEIL_FAC_VALIDE_AU_22_11_2022.docx"; break; case 'rc' : fileName = 'CLAUSES_RECUEIL_RC_TRANSPORT_VALIDE_AU_02_04_2025.docx'; break; case 'tppc': fileName = "CLAUSES_RECUEIL_TPPC_VALIDE_AU_01_2022.docx"; break; } const url = `/download/${fileName}`; fetch(url) .then(response => response.blob()) .then(blob => { const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = fileName; link.click(); }) .catch(error => console.error('Error downloading file:', error)); }); // Fonction de génération de projet document.getElementById('generateProject').addEventListener('click', async function() { const numParcours = getNumParcoursFromURL(); let filename; const parcours = JSON.parse(sessionStorage.getItem('parcours')); let produit = parcours["@expand"].contrat.produit // Sauvegarder les données du projet avant de générer le document (si RC) if (produit.toLowerCase() === 'rc' && typeof window.saveProjetRC === 'function') { console.log('Sauvegarde des données projet RC avant génération...'); const saveResult = await window.saveProjetRC(); if (!saveResult || !saveResult.valid) { console.error('Échec de la sauvegarde du projet RC'); M.toast({html: 'Erreur lors de la sauvegarde du projet. Veuillez réessayer.'}); return; } } // Envoi de la requête POST au serveur pour générer le projet fetch(`/generate/${produit}/projet/${numParcours}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, }) .then(response => { if (!response.ok) { throw new Error('Erreur réseau ou serveur'); } const disposition = response.headers.get('content-disposition'); filename = disposition.split(';')[1].trim().split('=')[1]; return response.blob(); // On attend une réponse sous forme de blob pour un fichier }) .then(blob => { // Crée un URL pour le blob const url = window.URL.createObjectURL(blob); // Crée un élément a temporaire pour simuler un clic pour téléchargement const a = document.createElement('a'); a.href = url; a.download = filename; // Nomme le fichier téléchargé document.body.appendChild(a); // Ajoute l'élément au document a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement window.URL.revokeObjectURL(url); // Nettoie l'URL objet a.remove(); // Supprime l'élément a du document }) .catch(error => console.error('Erreur lors de la génération du projet:', error)); }); document.getElementById('generateDeclinaison').addEventListener('click', async function() { const numParcours = getNumParcoursFromURL(); let filename; const parcours = JSON.parse(sessionStorage.getItem('parcours')); let produit = parcours["@expand"].contrat.produit // Envoi de la requête POST au serveur pour générer la déclinaison tarifaire fetch(`/generate/${produit}/tarif/${numParcours}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, }) .then(response => { if (!response.ok) { throw new Error('Erreur réseau ou serveur'); } const disposition = response.headers.get('content-disposition'); filename = disposition.split(';')[1].trim().split('=')[1]; return response.blob(); // On attend une réponse sous forme de blob pour un fichier }) .then(blob => { // Crée un URL pour le blob const url = window.URL.createObjectURL(blob); // Crée un élément a temporaire pour simuler un clic pour téléchargement const a = document.createElement('a'); a.href = url; a.download = filename; // Nomme le fichier téléchargé document.body.appendChild(a); // Ajoute l'élément au document a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement window.URL.revokeObjectURL(url); // Nettoie l'URL objet a.remove(); // Supprime l'élément a du document }) .catch(error => console.error('Erreur lors de la génération du projet:', error)); }); // Fonction d'initialisation async function init() { const numParcours = getNumParcoursFromURL(); const submenu = getSubmenuFromURL(); await loadParcours(numParcours); // Accéder aux informations stockées du parcours const parcours = JSON.parse(sessionStorage.getItem('parcours')); if (parcours) { // Mise à jour de l'interface avec les informations du parcours document.getElementById("displayedNumParcours").innerText = parcours.numParcours; await loadContrat(parcours["@expand"].contrat.id); // Accéder aux informations stockées du contrat const contrat = JSON.parse(sessionStorage.getItem('contrat')); const client = contrat?.["@expand"]?.client || null; document.getElementById("displayedClient").innerText = client?.nom ?? "Information non disponible"; // Attacher les écouteurs de clic aux liens de sous-menu document.querySelectorAll('#navParcoursSelect li a').forEach(link => { link.addEventListener('click', function(event) { event.preventDefault(); const selectedSubmenu = this.getAttribute('href'); if (inputChanged) { openModalUpdate(selectedSubmenu, numParcours) } else { loadForm(selectedSubmenu, numParcours); } }); }); // Charger le sous-menu spécifié dans l'URL s'il existe if (submenu) { loadForm(submenu, numParcours); } } } // Exécutez init et gérez les erreurs potentielles init().catch(error => console.error('Error initializing the form:', error)); });