From 4919940a268143f7babfa885eacc53df01803020 Mon Sep 17 00:00:00 2001 From: Alexis Burnaz <48258099+alxsbrz@users.noreply.github.com> Date: Thu, 19 Mar 2026 10:26:15 +0100 Subject: [PATCH] RC: nouveaux formulaires et synchro --- ecole/public/css/global.css | 3 + ecole/public/js/nav-parcours.js | 95 +- ecole/public/js/projet-form-rc.js | 2244 +++++++++-- ecole/public/js/rc-data-manager.js | 647 ++++ ecole/public/js/rc-orchestrator.js | 388 ++ ecole/public/js/rc-sync-utils.js | 464 +++ ecole/public/js/tarif-form-rc.js | 3376 +++++++++++++++++ ecole/src/constantes/json-modulateur-rc.js | 1434 +++++++ ecole/src/controllers/generateRcController.js | 640 +++- .../src/controllers/navParcoursController.js | 2 +- ecole/src/controllers/rcController.js | 146 +- ecole/src/db/pb_data/data.db | Bin 1318912 -> 905216 bytes ecole/src/db/pb_data/data.db-shm | Bin 32768 -> 32768 bytes ecole/src/db/pb_data/data.db-wal | Bin 0 -> 1297832 bytes ecole/src/db/pb_data/logs.db | Bin 4767744 -> 1884160 bytes ecole/src/db/pb_data/logs.db-shm | Bin 32768 -> 32768 bytes ecole/src/db/pb_data/logs.db-wal | Bin 4136512 -> 4185952 bytes ecole/src/services/contratService.js | 33 +- ecole/src/services/rcService.js | 47 +- .../template-declinaison-tarifaire-rc.docx | Bin 0 -> 41760 bytes ecole/src/templates/template-projet-rc.docx | Bin 175534 -> 178116 bytes ecole/views/layout.ejs | 6 + ecole/views/projetformrc.ejs | 31 +- ecole/views/tarifformrc.ejs | 1252 ++++++ 24 files changed, 10322 insertions(+), 486 deletions(-) create mode 100644 ecole/public/js/rc-data-manager.js create mode 100644 ecole/public/js/rc-orchestrator.js create mode 100644 ecole/public/js/rc-sync-utils.js create mode 100644 ecole/public/js/tarif-form-rc.js create mode 100644 ecole/src/constantes/json-modulateur-rc.js create mode 100644 ecole/src/templates/template-declinaison-tarifaire-rc.docx create mode 100644 ecole/views/tarifformrc.ejs diff --git a/ecole/public/css/global.css b/ecole/public/css/global.css index 1413772f..50f196b0 100644 --- a/ecole/public/css/global.css +++ b/ecole/public/css/global.css @@ -1,5 +1,8 @@ body { font-family: 'Roboto', sans-serif; + background-color: white; + color: black; + color-scheme: light; } h1, h2, h3, h4, h5, h6 { diff --git a/ecole/public/js/nav-parcours.js b/ecole/public/js/nav-parcours.js index bb6ed373..0deb1071 100644 --- a/ecole/public/js/nav-parcours.js +++ b/ecole/public/js/nav-parcours.js @@ -33,8 +33,16 @@ document.addEventListener('DOMContentLoaded', function() { let produit = parcours["@expand"].contrat.produit const produitObj = contrat?.["@expand"]?.enCours || null; - const tarif = produitObj?.["@expand"]?.tarif || null; - const projet = produitObj?.["@expand"]?.projet || 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; @@ -54,11 +62,21 @@ document.addEventListener('DOMContentLoaded', function() { 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": contrat?.["@expand"]?.enCours?.["@expand"]?.tarif?.id || null, - "projet": contrat?.["@expand"]?.enCours?.["@expand"]?.projet?.id || null, + "tarif": tarifId, + "projet": projetId, "contrat": null } @@ -79,7 +97,6 @@ document.addEventListener('DOMContentLoaded', function() { document.getElementById('step-' + key).classList.add('line') } } - showLoader(); // Charger le formulaire associé fetch(fetchUrl) @@ -89,6 +106,7 @@ document.addEventListener('DOMContentLoaded', function() { // Suppression de tout script précédemment chargé const oldScript = document.querySelector('script.dynamic-script'); + if (oldScript) { oldScript.remove(); } @@ -120,26 +138,26 @@ document.addEventListener('DOMContentLoaded', function() { inputChanged = true }) }) - hideLoader(); }) .catch(error => console.error('Error:', error)); - //A MODIFIER UNE FOIS QUE RC SERA ADAPTé AU PARCOURS - if (produit == "RC") { - if (Object.keys(contrat?.["@expand"]?.enCours).length > 1) { - document.getElementById('generateProject').disabled = false; - } + // 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 { - // Enable / disable bouton generate project - if (parcours["@expand"].contrat.client != '' && parcours["@expand"].contrat.intermediaire != '' && produitObj != undefined && projet != null) { - document.getElementById('generateProject').disabled = false; - } - - // Enable / disable bouton generate déclinaison - if (parcours["@expand"].contrat.client != '' && parcours["@expand"].contrat.intermediaire != '' && produitObj != undefined && tarif != null) { - document.getElementById('generateDeclinaison').disabled = false; - } - + 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; } } @@ -157,9 +175,6 @@ document.addEventListener('DOMContentLoaded', function() { const parcours = JSON.parse(sessionStorage.getItem('parcours')); var produit = parcours["@expand"].contrat.produit - const btn = this // bouton "générer projet" - btn.disabled = true; // le desactiver le temps du téléchargement - var fileName switch (produit.toLowerCase()) { case 'fac': @@ -183,21 +198,26 @@ document.addEventListener('DOMContentLoaded', function() { link.download = fileName; link.click(); }) - .finally(() => { - btn.disabled = false; // réactiver le bouton a la fin du téléchargement - }) .catch(error => console.error('Error downloading file:', error)); }); // Fonction de génération de projet - document.getElementById('generateProject').addEventListener('click', function() { + 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 - const btn = this // bouton "générer projet" - btn.disabled = true; // le desactiver le temps du téléchargement + // 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}`, { @@ -228,23 +248,17 @@ document.addEventListener('DOMContentLoaded', function() { window.URL.revokeObjectURL(url); // Nettoie l'URL objet a.remove(); // Supprime l'élément a du document }) - .finally(() => { - btn.disabled = false; // réactiver le bouton a la fin du téléchargement - }) .catch(error => console.error('Erreur lors de la génération du projet:', error)); }); - document.getElementById('generateDeclinaison').addEventListener('click', function() { + 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 - const btn = this // bouton "générer déclinaison tarifaire" - btn.disabled = true; // le desactiver le temps du téléchargement - - // Envoi de la requête POST au serveur pour générer le projet + // Envoi de la requête POST au serveur pour générer la déclinaison tarifaire fetch(`/generate/${produit}/tarif/${numParcours}`, { method: 'POST', headers: { @@ -274,9 +288,6 @@ document.addEventListener('DOMContentLoaded', function() { window.URL.revokeObjectURL(url); // Nettoie l'URL objet a.remove(); // Supprime l'élément a du document }) - .finally(() => { - btn.disabled = false; // réactiver le bouton a la fin du téléchargement - }) .catch(error => console.error('Erreur lors de la génération du projet:', error)); }); @@ -323,4 +334,4 @@ document.addEventListener('DOMContentLoaded', function() { // Exécutez init et gérez les erreurs potentielles init().catch(error => console.error('Error initializing the form:', error)); -}); +}); \ No newline at end of file diff --git a/ecole/public/js/projet-form-rc.js b/ecole/public/js/projet-form-rc.js index cdaadaa7..37352452 100644 --- a/ecole/public/js/projet-form-rc.js +++ b/ecole/public/js/projet-form-rc.js @@ -7,7 +7,10 @@ function initSubmenuForm() { window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollution de l'espace global (function () { // Variables globales du module - let parcours, contrat, client, intermediaire; + let parcours, contrat, client, intermediaire, rc, projet, tarif; + + let modRCActRCC, modRCMar, modRCZone, modRCActCompl, modRCGarAdd; + let hasSavedGrilleData = false; // évite d'écraser une grille déjà enregistrée // Initialisation des tag pour select var tagAnimauxVivants = false; @@ -35,16 +38,1089 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio contrat = JSON.parse(sessionStorage.getItem('contrat')); client = contrat?.["@expand"]?.client || null; intermediaire = contrat?.["@expand"]?.intermediaire || null; - rc = contrat?.["@expand"]?.enCours || null; + + // Récupérer les données RC depuis la nouvelle structure (EXACTEMENT comme TPPC) + rc = contrat?.["@expand"]?.enCours || null; // RC principal + projet = rc?.["@expand"]?.projet || null; // Données projet (normalized by contratService) + tarif = rc?.["@expand"]?.tarif || null; // Données tarif (normalized by contratService) + + // Exposer ces variables globalement pour que rc-orchestrator puisse y accéder + window.rc = rc; + window.tarif = tarif; + window.projet = projet; console.log("Initialisation pour formulaire projet :", parcours); + console.log("📊 RC:", rc); + console.log("📊 Tarif:", tarif); + console.log("📊 Projet:", projet); + + loadModulateurs(); // Appel des différentes fonctions d'initialisation setupEventListeners(); populateFormData(); + setupTarifImpactListeners(); updateSubmitButtonState('projetForm'); } + let tarifOriginalData = null; + + async function loadModulateurs() { + try { + const response = await fetch('/rc/modulo/activiteRCC'); + const data = await response.json(); + if (data.valid) { + modRCActRCC = data.objRetourne; + } + const response2 = await fetch('/rc/modulo/marchandiseRC'); + const data2 = await response2.json(); + if (data2.valid) { + modRCMar = data2.objRetourne; + } + const response3 = await fetch('/rc/modulo/zoneRC'); + const data3 = await response3.json(); + if (data3.valid) { + modRCZone = data3.objRetourne; + } + const response4 = await fetch('/rc/modulo/activiteComplRC'); + const data4 = await response4.json(); + if (data4.valid) { + modRCActCompl = data4.objRetourne; + } + const response5 = await fetch('/rc/modulo/garAdditionelRC'); + const data5 = await response5.json(); + if (data5.valid) { + modRCGarAdd = data5.objRetourne; + } + } catch (error) { + console.error('Erreur lors du chargement des modulateurs:', error); + } + } + + function saveOriginalTarifData() { + if (!tarif || !tarif.id) return; + + const garantieRCCSelector = document.getElementById('garantieRCC-selector'); + let garantiesRCC = []; + if (garantieRCCSelector) { + garantiesRCC = Array.from(garantieRCCSelector.selectedOptions).map(opt => opt.value); + } else if (projet) { + if (projet.extRCCConfie) garantiesRCC.push('contenant-confie'); + if (projet.extRCCTPPC) garantiesRCC.push('tppc'); + if (projet.extRCCModifCalArrim) garantiesRCC.push('modif-calage-arrimage'); + if (projet.extRCCFerroutage) garantiesRCC.push('ferroutage'); + if (projet.extRCCFraisRecons) garantiesRCC.push('frais-reconstitution'); + if (projet.extRCCRegie) garantiesRCC.push('regie'); + if (projet.extRCCSansMontageDemontage) garantiesRCC.push('sans-montage-demontage'); + } + + const parseArray = (value) => { + if (Array.isArray(value)) return value; + if (typeof value === 'string') { + try { + return JSON.parse(value); + } catch { + return []; + } + } + return []; + }; + + tarifOriginalData = { + checkVoiturier: rc?.checkVoiturier || false, + checkLoueur: rc?.checkLoueur || false, + checkCommissionnaire: rc?.checkCommissionnaire || false, + checkDemenageur: rc?.checkDemenageur || false, + checkLogistique: rc?.checkLogistique || false, + checkAutocariste: rc?.checkAutocariste || false, + checkAutres: rc?.checkAutres || false, + capitalVoiturier: rc?.capitalVoiturier || 0, + capitalCommissionnaire: rc?.capitalCommissionnaire || 0, + capitalDemenageur: rc?.capitalDemenageur || 0, + capitalLogistique: rc?.capitalLogistique || 0, + capitalAutocariste: rc?.capitalAutocariste || 0, + capitalAutres: rc?.capitalAutres || 0, + marchandisesVoiturier: parseArray(rc?.marchandisesVoiturier), + marchandisesCommissionnaire: parseArray(rc?.marchandisesCommissionnaire), + marchandisesDemenageur: parseArray(rc?.marchandisesDemenageur), + marchandisesLogistique: parseArray(rc?.marchandisesLogistique), + marchandisesAutocariste: parseArray(rc?.marchandisesAutocariste), + marchandisesAutres: parseArray(rc?.marchandisesAutres), + activitesVoiturier: parseArray(rc?.activitesVoiturier), + activitesCommissionnaire: parseArray(rc?.activitesCommissionnaire), + activitesDemenageur: parseArray(rc?.activitesDemenageur), + activitesLogistique: parseArray(rc?.activitesLogistique), + zone1: rc?.zone1 || false, + zone2: rc?.zone2 || false, + zone3: rc?.zone3 || false, + zone4: rc?.zone4 || false, + zone5: rc?.zone5 || false, + zone6: rc?.zone6 || false, + typeCotisation: rc?.typeCotisation || 'revisable', + checkRCE: rc?.checkRCE || false, + garantiesRCC: garantiesRCC, + ca: rc?.chiffreAffaires || tarif?.ca || '', + pj: tarif?.checkPJ || false + }; + } + + function checkTarifImpact(fieldType, fieldValue) { + if (!tarif || !tarif.id || !tarifOriginalData) return false; + + switch(fieldType) { + case 'activity': + return checkActivityImpact(fieldValue); + case 'marchandise': + return checkMarchandiseImpact(fieldValue); + case 'zone': + return checkZoneImpact(fieldValue); + case 'activiteCompl': + return checkActiviteComplImpact(fieldValue); + case 'typeCotisation': + return fieldValue === 'forfaitaire' && tarifOriginalData.typeCotisation === 'forfaitaire'; + default: + return false; + } + } + + function checkActivityImpact(activityData) { + if (!modRCActRCC) return false; + + const activities = ['checkVoiturier', 'checkCommissionnaire', 'checkDemenageur', 'checkLogistique', 'checkAutocariste', 'checkAutres']; + for (let act of activities) { + if (activityData[act] !== tarifOriginalData[act]) return true; + const capitalKey = act.replace('check', 'capital'); + const originalCapital = parseFloat(tarifOriginalData[capitalKey]) || 0; + const currentCapital = parseFloat(activityData[capitalKey]) || 0; + if (Math.abs(originalCapital - currentCapital) > 0.01) return true; + } + return false; + } + + function checkMarchandiseImpact(marchandiseData) { + if (!modRCMar) return false; + + const normalizeArray = (arr) => { + if (!arr) return []; + const normalized = Array.isArray(arr) ? arr : (typeof arr === 'string' ? JSON.parse(arr) : []); + return normalized.map(item => String(item).trim()).sort(); + }; + + const marchandiseKeys = ['marchandisesVoiturier', 'marchandisesCommissionnaire', 'marchandisesDemenageur', + 'marchandisesLogistique', 'marchandisesAutocariste', 'marchandisesAutres']; + for (let key of marchandiseKeys) { + const original = normalizeArray(tarifOriginalData[key]); + const current = normalizeArray(marchandiseData[key]); + if (JSON.stringify(original) !== JSON.stringify(current)) return true; + } + return false; + } + + function checkZoneImpact(zoneData) { + if (!modRCZone) return false; + + function getMaxZoneCoefficient(zones) { + let maxRCC = 1; + let maxRCE = 1; + + const zoneLabels = [ + "France Métropolitaine et pays limitrophes", + "Union Européenne", + "Autres pays européens sauf Russie et Ukraine (y compris UK et Norvège)", + "Pays du Maghreb et Amérique du Nord ( USA / Canada / Mexique )", + "Amérique Centrale et Sud / Caraïbes, Asie et Océanie", + "Afrique Hors Maghreb / Proche Orient / Moyen Orient" + ]; + + for (let i = 1; i <= 6; i++) { + if (zones[`zone${i}`]) { + const zoneKey = zoneLabels[i - 1]; + if (modRCZone[zoneKey]) { + if (typeof modRCZone[zoneKey].modRCC === "number") { + maxRCC = Math.max(maxRCC, modRCZone[zoneKey].modRCC); + } + if (typeof modRCZone[zoneKey].modRCE === "number") { + maxRCE = Math.max(maxRCE, modRCZone[zoneKey].modRCE); + } + } + } + } + + return { maxRCC, maxRCE }; + } + + const originalMax = getMaxZoneCoefficient(tarifOriginalData); + const currentMax = getMaxZoneCoefficient(zoneData); + + return originalMax.maxRCC !== currentMax.maxRCC || originalMax.maxRCE !== currentMax.maxRCE; + } + + function checkActiviteComplImpact(activiteComplData) { + if (!modRCActCompl) return false; + + const activiteKeys = ['activitesVoiturier', 'activitesCommissionnaire', 'activitesDemenageur', 'activitesLogistique']; + for (let key of activiteKeys) { + const original = Array.isArray(tarifOriginalData[key]) ? tarifOriginalData[key] : (tarifOriginalData[key] ? JSON.parse(tarifOriginalData[key]) : []); + const current = Array.isArray(activiteComplData[key]) ? activiteComplData[key] : (activiteComplData[key] ? JSON.parse(activiteComplData[key]) : []); + if (JSON.stringify(original.sort()) !== JSON.stringify(current.sort())) return true; + } + return false; + } + + function getCurrentActiviteComplData() { + const activitesCompl = { + activitesVoiturier: getActivitesComplFromForm('actComplVoiturier/Loueur'), + activitesCommissionnaire: getActivitesComplFromForm('actComplCommissionnaire de Transport'), + activitesDemenageur: getActivitesComplFromForm('actComplDéménageur'), + activitesLogistique: getActivitesComplFromForm('actComplLogistique') + }; + return activitesCompl; + } + + function getActivitesComplFromForm(containerName) { + const container = document.querySelector(`[name="${containerName}"]`); + if (!container) return []; + const checkboxes = container.querySelectorAll('input[type="checkbox"]:checked'); + const activites = []; + checkboxes.forEach(cb => { + const text = cb.nextElementSibling ? cb.nextElementSibling.textContent.trim() : cb.value; + activites.push(text); + }); + return activites; + } + + let lastChangedField = null; + let lastChangedValue = null; + let isRestoringValue = false; + + function showTarifImpactModal(callback, fieldElement, originalValue) { + const modal = document.getElementById('modalModif'); + if (!modal) return; + + const instance = M.Modal.getInstance(modal); + + lastChangedField = fieldElement; + lastChangedValue = originalValue; + + const okBtn = document.getElementById('modif-OK'); + const noBtn = document.getElementById('modif-NO'); + + if (okBtn) { + okBtn.onclick = function() { + instance.close(); + if (callback) callback(true); + }; + } + + if (noBtn) { + noBtn.onclick = function() { + instance.close(); + isRestoringValue = true; + + if (lastChangedField && lastChangedValue !== null) { + if (lastChangedField.tagName === 'INPUT') { + lastChangedField.value = lastChangedValue; + } else if (lastChangedField.tagName === 'SELECT') { + if (lastChangedField.multiple && Array.isArray(lastChangedValue)) { + Array.from(lastChangedField.options).forEach(opt => { + opt.selected = lastChangedValue.includes(opt.value); + }); + } else { + lastChangedField.value = lastChangedValue; + } + M.FormSelect.init(lastChangedField); + + if (lastChangedField.id === 'activity-selector') { + handleActivitySelection(); + } + } else if (lastChangedField.type === 'checkbox' || lastChangedField.type === 'radio') { + lastChangedField.checked = lastChangedValue; + } + } + + setTimeout(() => { + isRestoringValue = false; + }, 100); + + if (callback) callback(false); + }; + } + + instance.open(); + } + + function setupTarifImpactListeners() { + if (!tarif || !tarif.id) return; + + setTimeout(() => { + saveOriginalTarifData(); + }, 500); + + const activitySelector = document.getElementById('activity-selector'); + if (activitySelector) { + activitySelector.addEventListener('change', function(e) { + if (isRestoringValue) return; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + const currentData = getCurrentActivityData(); + if (checkTarifImpact('activity', currentData)) { + e.stopImmediatePropagation(); + e.preventDefault(); + const originalSelection = Array.from(this.options).filter(opt => { + const wasSelected = tarifOriginalData.checkVoiturier && (opt.value === 'voiturier' || opt.value === 'loueur') || + tarifOriginalData.checkCommissionnaire && opt.value === 'commissionnaire-multimodal' || + tarifOriginalData.checkDemenageur && (opt.value === 'demenageur-particulier' || opt.value === 'demenageur-entreprise' || opt.value === 'demenageur-interne') || + tarifOriginalData.checkLogistique && (opt.value === 'entrepositaire-depositaire' || opt.value === 'prestataire-logistique') || + tarifOriginalData.checkAutocariste && opt.value === 'autocariste' || + tarifOriginalData.checkAutres && opt.value === 'autres'; + return wasSelected; + }).map(opt => opt.value); + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalSelection); + return false; + } + }, 200); + }, true); + } + + const marchandiseSelector = document.getElementById('marchandise-selector'); + if (marchandiseSelector) { + let lastMarchandiseSelection = Array.from(marchandiseSelector.selectedOptions).map(opt => opt.value); + + marchandiseSelector.addEventListener('mousedown', function() { + if (!isRestoringValue) { + lastMarchandiseSelection = Array.from(this.selectedOptions).map(opt => opt.value); + } + }, true); + + marchandiseSelector.addEventListener('change', function(e) { + if (isRestoringValue) { + handleMarchandiseSelection(); + return; + } + + const originalSelection = lastMarchandiseSelection; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + const currentData = getCurrentMarchandiseData(); + if (checkTarifImpact('marchandise', currentData)) { + e.stopImmediatePropagation(); + e.preventDefault(); + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalSelection); + } else { + lastMarchandiseSelection = Array.from(this.selectedOptions).map(opt => opt.value); + handleMarchandiseSelection(); + } + }, 200); + }, true); + } + + for (let i = 1; i <= 6; i++) { + const zoneCheckbox = document.getElementById(`zone${i}`); + if (zoneCheckbox) { + zoneCheckbox.addEventListener('change', function(e) { + if (isRestoringValue) return; + + const checkboxId = this.id; + const originalChecked = tarifOriginalData[checkboxId] || false; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + e.stopImmediatePropagation(); + e.preventDefault(); + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalChecked); + } + }, 200); + }, true); + } + } + + const garantieRCCSelector = document.getElementById('garantieRCC-selector'); + if (garantieRCCSelector) { + garantieRCCSelector.addEventListener('change', function(e) { + if (isRestoringValue) return; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + const currentData = getCurrentGarantieRCCData(); + if (checkGarantieRCCImpact(currentData)) { + e.stopImmediatePropagation(); + const originalSelection = Array.from(this.selectedOptions).map(opt => opt.value); + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalSelection); + } + }, 200); + }, true); + } + + const activiteComplContainers = [ + 'actComplVoiturier/Loueur', + 'actComplCommissionnaire de Transport', + 'actComplDéménageur', + 'actComplLogistique' + ]; + + activiteComplContainers.forEach(containerName => { + const container = document.querySelector(`[name="${containerName}"]`); + if (container) { + const checkboxes = container.querySelectorAll('input[type="checkbox"]'); + checkboxes.forEach(checkbox => { + checkbox.addEventListener('change', function(e) { + if (isRestoringValue) return; + + const originalChecked = !this.checked; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + const currentData = getCurrentActiviteComplData(); + if (checkTarifImpact('activiteCompl', currentData)) { + e.stopImmediatePropagation(); + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalChecked); + } + }, 200); + }, true); + }); + } + }); + + const radioButtonsCot = document.getElementsByName('cotisation'); + for (let i = 0; i < radioButtonsCot.length; i++) { + radioButtonsCot[i].addEventListener('change', function(e) { + if (isRestoringValue) return; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + const originalValue = tarifOriginalData.typeCotisation; + if (this.value !== originalValue) { + e.stopImmediatePropagation(); + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalValue); + } + }, 200); + }, true); + } + + const capitalFields = ['voiturier', 'loueur', 'commissionnaire-multimodal', 'demenageur-particulier', + 'demenageur-particulier-dommage', 'demenageur-particulier-advalorem', + 'demenageur-entreprise', 'demenageur-interne', 'entrepositaire-depositaire', + 'prestataire-logistique', 'autocariste', 'autres']; + + capitalFields.forEach(fieldId => { + const field = document.getElementById(fieldId); + if (field) { + let originalValue = field.value || field.dataset.defaultValue || ''; + field.addEventListener('input', function(e) { + if (isRestoringValue) return; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + const currentData = getCurrentActivityData(); + if (checkTarifImpact('activity', currentData)) { + const currentValue = this.value; + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalValue); + } else { + originalValue = this.value; + } + }, 200); + }); + } + }); + + const observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.addedNodes.length) { + capitalFields.forEach(fieldId => { + const field = document.getElementById(fieldId); + if (field && !field.hasAttribute('data-tarif-listener')) { + field.setAttribute('data-tarif-listener', 'true'); + let originalValue = field.value || field.dataset.defaultValue || ''; + field.addEventListener('input', function(e) { + if (isRestoringValue) return; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + const currentData = getCurrentActivityData(); + if (checkTarifImpact('activity', currentData)) { + const currentValue = this.value; + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalValue); + } else { + originalValue = this.value; + } + }, 200); + }); + } + }); + } + }); + }); + + observer.observe(document.body, { + childList: true, + subtree: true + }); + + const switchPJ = document.getElementById('switchPJ'); + if (switchPJ) { + switchPJ.addEventListener('change', function(e) { + if (isRestoringValue) return; + + const originalChecked = tarifOriginalData.pj || false; + + setTimeout(() => { + if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return; + if (this.checked !== originalChecked) { + e.stopImmediatePropagation(); + e.preventDefault(); + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalChecked); + } + }, 200); + }, true); + } + } + + function checkGarantieRCCImpact(garantieData) { + if (!modRCActCompl && !modRCGarAdd) return false; + + const garantiesImpactantes = ['contenant-confie', 'tppc']; + const originalGaranties = tarifOriginalData?.garantiesRCC || []; + const currentGaranties = garantieData || []; + + for (let garantie of garantiesImpactantes) { + const wasSelected = originalGaranties.includes(garantie); + const isSelected = currentGaranties.includes(garantie); + if (wasSelected !== isSelected) return true; + } + + return false; + } + + function getCurrentActivityData() { + const activitySelector = document.getElementById('activity-selector'); + const selectedActivities = Array.from(activitySelector.selectedOptions).map(opt => opt.value); + + return { + checkVoiturier: selectedActivities.includes('voiturier') || selectedActivities.includes('loueur'), + checkCommissionnaire: selectedActivities.includes('commissionnaire-multimodal'), + checkDemenageur: selectedActivities.includes('demenageur-particulier') || selectedActivities.includes('demenageur-entreprise') || selectedActivities.includes('demenageur-interne'), + checkLogistique: selectedActivities.includes('entrepositaire-depositaire') || selectedActivities.includes('prestataire-logistique'), + checkAutocariste: selectedActivities.includes('autocariste'), + checkAutres: selectedActivities.includes('autres'), + capitalVoiturier: document.getElementById("voiturier") ? parseFloat(document.getElementById("voiturier").value) || 0 : (document.getElementById("select-voiturier")?.dataset.defaultValue ? parseFloat(document.getElementById("select-voiturier").dataset.defaultValue) : 0), + capitalCommissionnaire: document.getElementById("commissionnaire-multimodal") ? parseFloat(document.getElementById("commissionnaire-multimodal").value) || 0 : (document.getElementById("select-commissionnaire-multimodal")?.dataset.defaultValue ? parseFloat(document.getElementById("select-commissionnaire-multimodal").dataset.defaultValue) : 0), + capitalDemenageur: document.getElementById("demenageur-particulier") ? parseFloat(document.getElementById("demenageur-particulier").value) || 0 : (document.getElementById("select-demenageur-particulier")?.dataset.defaultValue ? parseFloat(document.getElementById("select-demenageur-particulier").dataset.defaultValue) : 0), + capitalLogistique: document.getElementById("entrepositaire-depositaire") ? parseFloat(document.getElementById("entrepositaire-depositaire").value) || 0 : (document.getElementById("select-entrepositaire-depositaire")?.dataset.defaultValue ? parseFloat(document.getElementById("select-entrepositaire-depositaire").dataset.defaultValue) : 0) + }; + } + + function getCurrentMarchandiseData() { + const selectedMarchandises = getSelectedMarchandises(); + const marchandiseTexts = selectedMarchandises.map(val => { + const option = document.querySelector(`#marchandise-selector option[value="${val}"]`); + return option ? option.textContent.trim() : val; + }); + + return { + marchandisesVoiturier: marchandiseTexts, + marchandisesCommissionnaire: marchandiseTexts, + marchandisesDemenageur: marchandiseTexts, + marchandisesLogistique: marchandiseTexts, + marchandisesAutocariste: marchandiseTexts, + marchandisesAutres: marchandiseTexts + }; + } + + function getCurrentZoneData() { + const zone1 = document.getElementById("zone1"); + const zone2 = document.getElementById("zone2"); + return { + zone1: zone1 && (zone1.checked || zone1.disabled), + zone2: zone2 && (zone2.checked || zone2.disabled), + zone3: document.getElementById("zone3") && document.getElementById("zone3").checked, + zone4: document.getElementById("zone4") && document.getElementById("zone4").checked, + zone5: document.getElementById("zone5") && document.getElementById("zone5").checked, + zone6: document.getElementById("zone6") && document.getElementById("zone6").checked + }; + } + + function getCurrentGarantieRCCData() { + const selector = document.getElementById('garantieRCC-selector'); + return Array.from(selector.selectedOptions).map(opt => opt.value); + } + + function getSelectedMarchandises() { + const selector = document.getElementById('marchandise-selector'); + return Array.from(selector.selectedOptions).map(opt => opt.value); + } + + function prefillFromTarif() { + if (!tarif || !rc) { + console.log('⚠️ Pas de données tarif/rc pour pré-remplir'); + return; + } + + console.log('📝 Pré-remplissage depuis tarif...', { rc, tarif }); + + function parseArray(value) { + if (Array.isArray(value)) return value; + if (typeof value === 'string') { + try { + return JSON.parse(value); + } catch { + return []; + } + } + return []; + } + + const activitySelector = document.getElementById('activity-selector'); + const marchandiseSelector = document.getElementById('marchandise-selector'); + + // ===== ACTIVITÉS ===== + + // Voiturier + if (rc.checkVoiturier && !projet?.actVoiturier && activitySelector) { + console.log(' ✓ Sélection Voiturier, capital:', rc.capitalVoiturier); + const voiturierOption = activitySelector.querySelector('option[value="voiturier"]'); + if (voiturierOption) { + voiturierOption.selected = true; + if (rc.capitalVoiturier) { + voiturierOption.setAttribute('data-default-value', rc.capitalVoiturier); + } + } + } + + // Loueur (souvent coché avec Voiturier) + if (rc.checkVoiturier && !projet?.actLoueur && activitySelector) { + console.log(' ✓ Sélection Loueur (car Voiturier coché)'); + const loueurOption = activitySelector.querySelector('option[value="loueur"]'); + if (loueurOption) { + loueurOption.selected = true; + } + } + + // Commissionnaire → Commissionnaire multimodal + if (rc.checkCommissionnaire && !projet?.actMultimodal && activitySelector) { + console.log(' ✓ Sélection Commissionnaire multimodal, capital:', rc.capitalCommissionnaire); + const multimodalOption = activitySelector.querySelector('option[value="commissionnaire-multimodal"]'); + if (multimodalOption) { + multimodalOption.selected = true; + if (rc.capitalCommissionnaire) { + multimodalOption.setAttribute('data-default-value', rc.capitalCommissionnaire); + } + } + } + + // Déménageur → Déménageur d'entreprises (pas particuliers) + if (rc.checkDemenageur && !projet?.actDemEntr && activitySelector) { + console.log(' ✓ Sélection Déménageur d\'entreprises, capital:', rc.capitalDemenageur); + const demenageurOption = activitySelector.querySelector('option[value="demenageur-entreprise"]'); + if (demenageurOption) { + demenageurOption.selected = true; + if (rc.capitalDemenageur) { + demenageurOption.setAttribute('data-default-value', rc.capitalDemenageur); + } + } + } + + // Logistique → Prestataire logistique + if (rc.checkLogistique && !projet?.actPrestaLog && activitySelector) { + console.log(' ✓ Sélection Prestataire logistique, capital:', rc.capitalLogistique); + const logistiqueOption = activitySelector.querySelector('option[value="prestataire-logistique"]'); + if (logistiqueOption) { + logistiqueOption.selected = true; + if (rc.capitalLogistique) { + logistiqueOption.setAttribute('data-default-value', rc.capitalLogistique); + } + } + } + + // Autocariste + if (rc.checkAutocariste && activitySelector) { + console.log(' ✓ Sélection Autocariste, capital:', rc.capitalAutocariste); + const autocaristeOption = activitySelector.querySelector('option[value="autocariste"]'); + if (autocaristeOption) { + autocaristeOption.selected = true; + if (rc.capitalAutocariste) { + autocaristeOption.setAttribute('data-default-value', rc.capitalAutocariste); + } + } + } + + // Autres + if (rc.checkAutres && activitySelector) { + console.log(' ✓ Sélection Autres activités, capital:', rc.capitalAutres); + const autresOption = activitySelector.querySelector('option[value="autres"]'); + if (autresOption) { + autresOption.selected = true; + if (rc.capitalAutres) { + autresOption.setAttribute('data-default-value', rc.capitalAutres); + } + } + } + + // IMPORTANT : Trigger change event pour que Materialize mette à jour l'affichage + if (activitySelector) { + console.log(' 🔄 Trigger change event sur activity-selector'); + const changeEvent = new Event('change', { bubbles: true }); + activitySelector.dispatchEvent(changeEvent); + + // Réinitialiser Materialize FormSelect + setTimeout(() => { + if (window.M && window.M.FormSelect) { + window.M.FormSelect.init(activitySelector); + console.log(' ✅ Materialize FormSelect réinitialisé'); + } + }, 100); + } + + // ===== MARCHANDISES ===== + + if (marchandiseSelector) { + const allMarchandises = [ + ...(parseArray(rc.marchandisesVoiturier)), + ...(parseArray(rc.marchandisesCommissionnaire)), + ...(parseArray(rc.marchandisesDemenageur)), + ...(parseArray(rc.marchandisesLogistique)), + ...(parseArray(rc.marchandisesAutocariste)), + ...(parseArray(rc.marchandisesAutres)) + ]; + + const uniqueMarchandises = [...new Set(allMarchandises)]; + console.log(' 📦 Marchandises:', uniqueMarchandises); + + const marchandiseMapping = { + 'Marchandises ordinaires': 'ordinaire', + 'Marchandises ordinaires et assimilées, les marchandises dangereuses dans le respect de la réglementation': 'ordinaire', + 'Véhicules roulants': 'roulant', + 'Engins de chantier et engins agricoles': 'engins-chantier-agricole', + 'Engins de chantier': 'engins-chantier-agricole', + 'Véhicules roulants dans le cadre d\'une activité de déménagement': 'roulant-demenagement', + 'Mobiliers usagés – Objets et effets personnels en déménagement': 'mobilier-usages', + 'Mobiliers en déménagement': 'mobilier-usages', + 'Marchandises périssables sous température dirigée': 'perissable-temperature-dirigee', + 'Marchandises périssables': 'perissable-temperature-dirigee', + 'Animaux vivants': 'animaux-vivant', + 'Marchandises en citerne': 'citerne', + 'Transports de béton': 'beton', + 'Transport de béton': 'beton', + 'Transports exceptionnels': 'exceptionnels', + 'Marchandises en vrac transportées en benne': 'vrac', + 'Marchandises en benne': 'vrac' + }; + + uniqueMarchandises.forEach(marchText => { + const mappedValue = marchandiseMapping[marchText] || marchText.toLowerCase().replace(/\s+/g, '-'); + const option = marchandiseSelector.querySelector(`option[value="${mappedValue}"]`); + if (option && !option.selected) { + option.selected = true; + } else if (!option) { + // Recherche floue si mapping exact échoue + const options = marchandiseSelector.querySelectorAll('option'); + options.forEach(opt => { + if (opt.textContent.trim().includes(marchText) || marchText.includes(opt.textContent.trim().substring(0, 20))) { + if (!opt.selected) opt.selected = true; + } + }); + } + }); + + // Trigger change event pour Materialize + const changeEvent = new Event('change', { bubbles: true }); + marchandiseSelector.dispatchEvent(changeEvent); + + setTimeout(() => { + if (window.M && window.M.FormSelect) { + window.M.FormSelect.init(marchandiseSelector); + } + }, 100); + } + + // ===== ZONES GÉOGRAPHIQUES ===== + + if (rc.zone1 !== undefined && !projet?.zone1) { + const zone1El = document.getElementById("zone1"); + if (zone1El) { + zone1El.checked = rc.zone1; + console.log(' ✓ Zone 1:', rc.zone1); + } + } + if (rc.zone2 !== undefined && !projet?.zone2) { + const zone2El = document.getElementById("zone2"); + if (zone2El) { + zone2El.checked = rc.zone2; + console.log(' ✓ Zone 2:', rc.zone2); + } + } + if (rc.zone3 !== undefined && !projet?.zone3) { + const zone3El = document.getElementById("zone3"); + if (zone3El) { + zone3El.checked = rc.zone3; + console.log(' ✓ Zone 3:', rc.zone3); + } + } + if (rc.zone4 !== undefined && !projet?.zone4) { + const zone4El = document.getElementById("zone4"); + if (zone4El) { + zone4El.checked = rc.zone4; + console.log(' ✓ Zone 4:', rc.zone4); + } + } + if (rc.zone5 !== undefined && !projet?.zone5) { + const zone5El = document.getElementById("zone5"); + if (zone5El) { + zone5El.checked = rc.zone5; + console.log(' ✓ Zone 5:', rc.zone5); + } + } + if (rc.zone6 !== undefined && !projet?.zone6) { + const zone6El = document.getElementById("zone6"); + if (zone6El) { + zone6El.checked = rc.zone6; + console.log(' ✓ Zone 6:', rc.zone6); + } + } + + // ===== TYPE DE COTISATION ===== + + if (rc.typeCotisation && !projet?.typeCot) { + const radioCot = document.querySelector(`input[name="typeCot"][value="${rc.typeCotisation}"]`); + if (radioCot) { + radioCot.checked = true; + console.log(' ✓ Type cotisation:', rc.typeCotisation); + } + } + + // ===== CA ===== + + if (rc.chiffreAffaires && !projet?.ca) { + const caEl = document.getElementById("CA"); + if (caEl) { + caEl.value = rc.chiffreAffaires; + console.log(' ✓ CA:', rc.chiffreAffaires); + } + } + + // ===== RCE (INCLURE LES AUTRES RC) ===== + + const hasRCEFromRC = rc && rc.checkRCE; + const hasRCEFromTarif = tarif && tarif.checkRCE; + if (hasRCEFromRC || hasRCEFromTarif) { + console.log(' ✓ RCE activée (checkRCE)'); + const choixRCEEl = document.getElementById("choixRCE"); + if (choixRCEEl) { + choixRCEEl.checked = true; + const garantieRCEEl = document.getElementById('garantieRCE'); + if (garantieRCEEl) garantieRCEEl.style.display = 'block'; + const rce1El = document.getElementById('RCE1'); + if (rce1El) rce1El.style.display = ''; + const rce2El = document.getElementById('RCE2'); + if (rce2El) rce2El.style.display = ''; + } + } + + // ===== PROTECTION JURIDIQUE ===== + + if (tarif && tarif.checkPJ && !projet?.pj) { + console.log(' ✓ Protection Juridique activée'); + const switchPJEl = document.getElementById("switchPJ"); + if (switchPJEl) { + switchPJEl.checked = true; + + // Afficher la section PJ + const pj1El = document.getElementById('PJ1'); + if (pj1El) pj1El.style.display = ''; + const pj2El = document.getElementById('PJ2'); + if (pj2El) pj2El.style.display = ''; + + // Pré-remplir les cotisations PJ si disponibles + if (tarif.cotPJHT && !projet?.cotPJHT) { + const cotPJHTEl = document.getElementById('cotPJHT'); + if (cotPJHTEl) { + cotPJHTEl.value = tarif.cotPJHT; + console.log(' ├─ Cotisation PJ HT:', tarif.cotPJHT); + } + } + if (tarif.cotPJTTC && !projet?.cotPJTTC) { + const cotPJTTCEl = document.getElementById('cotPJTTC'); + if (cotPJTTCEl) { + cotPJTTCEl.value = tarif.cotPJTTC; + console.log(' └─ Cotisation PJ TTC:', tarif.cotPJTTC); + } + } + } + } + + // Appliquer les capitaux APRÈS trigger (les inputs sont créés dynamiquement) + setTimeout(() => { + console.log(' 💰 Application des capitaux sur les inputs créés...'); + + // Mapping des activités vers leurs capitaux + const capitalMapping = { + 'voiturier': rc.capitalVoiturier, + 'commissionnaire-multimodal': rc.capitalCommissionnaire, + 'demenageur-entreprise': rc.capitalDemenageur, + 'prestataire-logistique': rc.capitalLogistique, + 'autocariste': rc.capitalAutocariste, + 'autres': rc.capitalAutres + }; + + for (const [activity, capital] of Object.entries(capitalMapping)) { + if (capital) { + const input = document.getElementById(activity); + if (input && !input.value) { + input.value = capital; + console.log(` ├─ ${activity}: ${capital}`); + } + } + } + + console.log(' ✅ Capitaux appliqués'); + }, 300); + + // Autres champs (garanties RCC, etc.) + const garantieRCCSelector = document.getElementById('garantieRCC-selector'); + if (garantieRCCSelector && !projet) { + if (rc.extRCCModifCalArrim) { + const option = garantieRCCSelector.querySelector('option[value="modif-calage-arrimage"]'); + if (option) option.selected = true; + } + if (rc.extRCCFerroutage) { + const option = garantieRCCSelector.querySelector('option[value="ferroutage"]'); + if (option) option.selected = true; + } + if (rc.extRCCFraisRecons) { + const option = garantieRCCSelector.querySelector('option[value="frais-reconstitution"]'); + if (option) option.selected = true; + } + if (rc.extRCCConfie) { + const option = garantieRCCSelector.querySelector('option[value="confie"]'); + if (option) option.selected = true; + } + if (rc.extRCCTPPC) { + const option = garantieRCCSelector.querySelector('option[value="tppc"]'); + if (option) option.selected = true; + } + if (rc.extRCCRegie) { + const option = garantieRCCSelector.querySelector('option[value="regie"]'); + if (option) option.selected = true; + } + if (rc.extRCCSansMontageDemontage) { + const option = garantieRCCSelector.querySelector('option[value="sans-montage-demontage"]'); + if (option) option.selected = true; + } + } + + // ===== ACTIVITÉS COMPLÉMENTAIRES ===== + + const activitesVoiturier = parseArray(rc.activitesVoiturier); + if (activitesVoiturier.length > 0) { + const container = document.querySelector('[name="actComplVoiturier/Loueur"]'); + if (container) { + activitesVoiturier.forEach(activite => { + const checkboxes = container.querySelectorAll('input[type="checkbox"]'); + checkboxes.forEach(cb => { + const label = cb.nextElementSibling; + if (label && label.textContent.trim() === activite) { + cb.checked = true; + } + }); + }); + } + } + + const activitesCommissionnaire = parseArray(rc.activitesCommissionnaire); + if (activitesCommissionnaire.length > 0) { + const container = document.querySelector('[name="actComplCommissionnaire de Transport"]'); + if (container) { + activitesCommissionnaire.forEach(activite => { + const checkboxes = container.querySelectorAll('input[type="checkbox"]'); + checkboxes.forEach(cb => { + const label = cb.nextElementSibling; + if (label && label.textContent.trim() === activite) { + cb.checked = true; + } + }); + }); + } + } + + const activitesDemenageur = parseArray(rc.activitesDemenageur); + if (activitesDemenageur.length > 0) { + const container = document.querySelector('[name="actComplDéménageur"]'); + if (container) { + activitesDemenageur.forEach(activite => { + const checkboxes = container.querySelectorAll('input[type="checkbox"]'); + checkboxes.forEach(cb => { + const label = cb.nextElementSibling; + if (label && label.textContent.trim() === activite) { + cb.checked = true; + } + }); + }); + } + } + + const activitesLogistique = parseArray(rc.activitesLogistique); + if (activitesLogistique.length > 0) { + const container = document.querySelector('[name="actComplLogistique"]'); + if (container) { + activitesLogistique.forEach(activite => { + const checkboxes = container.querySelectorAll('input[type="checkbox"]'); + checkboxes.forEach(cb => { + const label = cb.nextElementSibling; + if (label && label.textContent.trim() === activite) { + cb.checked = true; + } + }); + }); + } + } + + if (activitySelector) { + activitySelector.dispatchEvent(new Event('change')); + } + if (marchandiseSelector) { + marchandiseSelector.dispatchEvent(new Event('change')); + } + } + // Configuration des écouteurs d'événements function setupEventListeners() { document.getElementById('projetFormBtn').addEventListener('click', handleSubmitForm); @@ -133,10 +1209,20 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio document.getElementById('cotPJHT').value = ''; document.getElementById('cotPJTTC').value = ''; } - calcCotTotal(); }); + function restoreZonesFromOriginal() { + const orig = tarifOriginalData || {}; + ['zone1','zone2','zone3','zone4','zone5','zone6'].forEach(z => { + const el = document.getElementById(z); + if (el) { + el.disabled = false; + el.checked = Boolean(orig[z]); + } + }); + } + document.getElementById('btnMondeEntier').addEventListener('click', function () { document.getElementById('zone1').checked = true; document.getElementById('zone1').disabled = true; @@ -147,6 +1233,20 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio document.getElementById('zone5').checked = true; document.getElementById('zone6').checked = true; + // Détection impact tarif : zones + if (tarif && tarif.id && tarifOriginalData) { + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, null, null); + // Revenir à l'état original visuel + restoreZonesFromOriginal(); + } + } + handleGrAdvalo(); }); @@ -160,6 +1260,20 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio document.getElementById('zone5').checked = false; document.getElementById('zone6').checked = false; + // Détection impact tarif : zones + if (tarif && tarif.id && tarifOriginalData) { + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, null, null); + // Revenir à l'état original visuel + restoreZonesFromOriginal(); + } + } + handleGrAdvalo(); }); @@ -207,6 +1321,18 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio document.getElementById('zone1').addEventListener('click', function () { handleGrAdvalo(); + + if (tarif && tarif.id && tarifOriginalData) { + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, null, null); + restoreZonesFromOriginal(); + } + } }); document.getElementById('zone2').addEventListener('click', function () { @@ -219,6 +1345,18 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio } handleGrAdvalo(); + + if (tarif && tarif.id && tarifOriginalData) { + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, null, null); + restoreZonesFromOriginal(); + } + } }); document.getElementById('zone3').addEventListener('click', function () { @@ -235,18 +1373,66 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio } handleGrAdvalo(); + + if (tarif && tarif.id && tarifOriginalData) { + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, null, null); + restoreZonesFromOriginal(); + } + } }); document.getElementById('zone4').addEventListener('click', function () { handleGrAdvalo(); + + if (tarif && tarif.id && tarifOriginalData) { + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, null, null); + restoreZonesFromOriginal(); + } + } }); document.getElementById('zone5').addEventListener('click', function () { handleGrAdvalo(); + + if (tarif && tarif.id && tarifOriginalData) { + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, null, null); + restoreZonesFromOriginal(); + } + } }); document.getElementById('zone6').addEventListener('click', function () { handleGrAdvalo(); + + if (tarif && tarif.id && tarifOriginalData) { + const currentData = getCurrentZoneData(); + if (checkTarifImpact('zone', currentData)) { + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, null, null); + restoreZonesFromOriginal(); + } + } }); var radioButtonsCot = document.getElementsByName('cotisation'); @@ -365,6 +1551,33 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio }); document.getElementById('CA').addEventListener('input', function () { + if (isRestoringValue) { + validateField('CA', true); + updateSubmitButtonState('projetForm'); + calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT'); + calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC'); + calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT'); + calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC'); + calcCotIrreductible(); + calcCotTotal(); + return; + } + + if (tarif && tarif.id && tarifOriginalData) { + const currentValue = this.value.trim(); + const originalValue = tarifOriginalData.ca || ''; + + if (currentValue !== originalValue) { + const originalValueToRestore = originalValue; + showTarifImpactModal((confirmed) => { + if (confirmed) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`; + } + }, this, originalValueToRestore); + return; + } + } + validateField('CA', true); updateSubmitButtonState('projetForm'); calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT'); @@ -536,14 +1749,13 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio tagDemenageur = true; } else { - if (!(currentSelection.includes(("demenageur-particulier" || "demenageur-particulier-dommage" || "demenageur-particulier-advalorem") && "demenageur-entreprise" && "demenageur-interne"))) { - document.getElementById('marchandise-selector').querySelector('option[value="roulant-demenagement"]').selected = false; - document.getElementById('marchandise-selector').querySelector('option[value="mobilier-usages"]').selected = false; - document.getElementById('marchandise-selector').querySelector('option[value="ordinaire"]').selected = true; - document.getElementById('marchandise-selector').dispatchEvent(new Event('change')); - - tagDemenageur = false; - } + // Aucune activité déménageur n'est sélectionnée + document.getElementById('marchandise-selector').querySelector('option[value="roulant-demenagement"]').selected = false; + document.getElementById('marchandise-selector').querySelector('option[value="mobilier-usages"]').selected = false; + document.getElementById('marchandise-selector').querySelector('option[value="ordinaire"]').selected = true; + document.getElementById('marchandise-selector').dispatchEvent(new Event('change')); + + tagDemenageur = false; } if (currentSelection.includes("garde-meubles")) { @@ -617,10 +1829,9 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio document.getElementById('selected-voiturier-error').style.display = "block"; } } else { - if (!(currentSelection.includes("entrepositaire-depositaire" && "prestataire-logistique" && "manutentionnaire-levageur"))) { - tagVoiturier = false; - document.getElementById('selected-voiturier-error').style.display = "none"; - } + // Aucune activité nécessitant voiturier n'est sélectionnée + tagVoiturier = false; + document.getElementById('selected-voiturier-error').style.display = "none"; } if (currentSelection.length == 1) { @@ -723,22 +1934,71 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio M.FormSelect.init(idSelect); } + // Pré-remplir depuis le tarif si disponible (même si projet existe, on complète avec les données du tarif) + if (tarif && tarif.id) { + setTimeout(() => { + prefillFromTarif(); + + // S'assurer que "Inclure les autres RC" est coché après prefillFromTarif + setTimeout(() => { + const hasRCEProjet = projet && (projet.autresRC || projet.extRCEBraDebra || projet.extRCEMontageDemontage); + const hasRCERC = rc && rc.checkRCE; + const hasRCETarif = tarif && tarif.checkRCE; + const hasRCE = hasRCEProjet || hasRCERC || hasRCETarif; + + if (hasRCE) { + const choixRCEEl = document.getElementById("choixRCE"); + if (choixRCEEl) { + choixRCEEl.checked = true; + const garantieRCEEl = document.getElementById('garantieRCE'); + if (garantieRCEEl) garantieRCEEl.style.display = 'block'; + const rce1El = document.getElementById('RCE1'); + if (rce1El) rce1El.style.display = ''; + const rce2El = document.getElementById('RCE2'); + if (rce2El) rce2El.style.display = ''; + } + } + }, 200); + }, 300); + } + + // S'assurer que "Inclure les autres RC" est coché si nécessaire (après le chargement de toutes les données projet) + setTimeout(() => { + const hasRCEProjet = projet && (projet.autresRC || projet.extRCEBraDebra || projet.extRCEMontageDemontage); + const hasRCERC = rc && rc.checkRCE; + const hasRCETarif = tarif && tarif.checkRCE; + const hasRCE = hasRCEProjet || hasRCERC || hasRCETarif; + + if (hasRCE) { + const choixRCEEl = document.getElementById("choixRCE"); + if (choixRCEEl && !choixRCEEl.checked) { + choixRCEEl.checked = true; + const garantieRCEEl = document.getElementById('garantieRCE'); + if (garantieRCEEl) garantieRCEEl.style.display = 'block'; + const rce1El = document.getElementById('RCE1'); + if (rce1El) rce1El.style.display = ''; + const rce2El = document.getElementById('RCE2'); + if (rce2El) rce2El.style.display = ''; + } + } + }, 600); + // Populate par défaut Voiturier / Loueur - if (!rc) { + if (!projet && !tarif) { document.getElementById('activity-selector').querySelector('option[value="voiturier"]').selected = true; document.getElementById('activity-selector').querySelector('option[value="loueur"]').selected = true; document.getElementById('activity-selector').dispatchEvent(new Event('change')); } // Populate assurés additionnel - if (!rc || !rc.assureAdditionnel || Object.keys(rc.assureAdditionnel).length === 0) { + if (!projet || !projet.assureAdditionnel || Object.keys(projet.assureAdditionnel).length === 0) { console.log("Le JSON est vide, pas d'assurés additionnels à pré-remplir."); } else { document.getElementById('additionel').checked = true; document.getElementById('checkAdditionnel').style.display = "block"; - for (let i = 0; i < rc.assureAdditionnel.length; i++) { - const row = rc.assureAdditionnel[i]; + for (let i = 0; i < projet.assureAdditionnel.length; i++) { + const row = projet.assureAdditionnel[i]; addRowAdditionnel(row.nom, row.adresse, row.siret); } } @@ -746,20 +2006,20 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio // Populate activite const activitySelector = document.getElementById('activity-selector'); - if (rc.actVoiturier) { + if (projet && projet.actVoiturier) { activitySelector.querySelector('option[value="voiturier"]').selected = true; - document.getElementById("select-voiturier").dataset.defaultValue = rc.valueActVoiturier; + document.getElementById("select-voiturier").dataset.defaultValue = projet.valueActVoiturier; }; - if (rc.actLoueur) { + if (projet && projet.actLoueur) { activitySelector.querySelector('option[value="loueur"]').selected = true; - document.getElementById("select-loueur").dataset.defaultValue = rc.valueActLoueur; + document.getElementById("select-loueur").dataset.defaultValue = projet.valueActLoueur; }; - if (rc.actMultimodal) { + if (projet && projet.actMultimodal) { tagMultimodal = true; activitySelector.querySelector('option[value="commissionnaire-multimodal"]').selected = true; - document.getElementById("select-commissionnaire-multimodal").dataset.defaultValue = rc.valueActMultimodal; + document.getElementById("select-commissionnaire-multimodal").dataset.defaultValue = projet.valueActMultimodal; document.getElementById("btnAdvaloMultimodal").style.display = 'block'; document.getElementById("btnAdvaloAerien").style.display = 'block'; document.getElementById("btnAdvaloTerrestre").style.display = 'block'; @@ -768,59 +2028,59 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio document.getElementById('divAdvaloMultimodal').style.display = "block"; }; - if (rc.actDouane) { + if (projet && projet.actDouane) { activitySelector.querySelector('option[value="représentant-douane"]').selected = true; - document.getElementById("select-représentant-douane").dataset.defaultValue = rc.valueActDouane; + document.getElementById("select-représentant-douane").dataset.defaultValue = projet.valueActDouane; }; - if (rc.actDemPar) { + if (projet && projet.actDemPar) { activitySelector.querySelector('option[value="demenageur-particulier"]').selected = true; - document.getElementById("select-demenageur-particulier").dataset.defaultValue = rc.valueActDemPar; + document.getElementById("select-demenageur-particulier").dataset.defaultValue = projet.valueActDemPar; } - if (rc.actDemParDom) { + if (projet && projet.actDemParDom) { activitySelector.querySelector('option[value="demenageur-particulier-dommage"]').selected = true; - document.getElementById("select-demenageur-particulier-dommage").dataset.defaultValue = rc.valueActDemParDom; + document.getElementById("select-demenageur-particulier-dommage").dataset.defaultValue = projet.valueActDemParDom; } - if (rc.actDemParAdv) { + if (projet && projet.actDemParAdv) { activitySelector.querySelector('option[value="demenageur-particulier-advalorem"]').selected = true; - document.getElementById("select-demenageur-particulier-advalorem").dataset.defaultValue = rc.valueActDemParAdv; + document.getElementById("select-demenageur-particulier-advalorem").dataset.defaultValue = projet.valueActDemParAdv; } - if (rc.actDemEntr) { + if (projet && projet.actDemEntr) { activitySelector.querySelector('option[value="demenageur-entreprise"]').selected = true; - document.getElementById("select-demenageur-entreprise").dataset.defaultValue = rc.valueActDemEntr; + document.getElementById("select-demenageur-entreprise").dataset.defaultValue = projet.valueActDemEntr; } - if (rc.actDemInterne) { + if (projet && projet.actDemInterne) { activitySelector.querySelector('option[value="demenageur-interne"]').selected = true; - document.getElementById("select-demenageur-interne").dataset.defaultValue = rc.valueActDemInterne; + document.getElementById("select-demenageur-interne").dataset.defaultValue = projet.valueActDemInterne; } - if (rc.actGardeMeuble) { + if (projet && projet.actGardeMeuble) { activitySelector.querySelector('option[value="garde-meubles"]').selected = true; - document.getElementById("select-garde-meubles").dataset.defaultValue = rc.valueActGardeMeuble; + document.getElementById("select-garde-meubles").dataset.defaultValue = projet.valueActGardeMeuble; } - if (rc.actEntDep) { + if (projet && projet.actEntDep) { activitySelector.querySelector('option[value="entrepositaire-depositaire"]').selected = true; - document.getElementById("select-entrepositaire-depositaire").dataset.defaultValue = rc.valueActEntDep; + document.getElementById("select-entrepositaire-depositaire").dataset.defaultValue = projet.valueActEntDep; } - if (rc.actPrestaLog) { + if (projet && projet.actPrestaLog) { activitySelector.querySelector('option[value="prestataire-logistique"]').selected = true; - document.getElementById("select-prestataire-logistique").dataset.defaultValue = rc.valueActPrestaLog; + document.getElementById("select-prestataire-logistique").dataset.defaultValue = projet.valueActPrestaLog; } - if (rc.actLevageur) { + if (projet && projet.actLevageur) { activitySelector.querySelector('option[value="manutentionnaire-levageur"]').selected = true; - document.getElementById("select-manutentionnaire-levageur").dataset.defaultValue = rc.valueActLevageur; + document.getElementById("select-manutentionnaire-levageur").dataset.defaultValue = projet.valueActLevageur; } - if (rc.actTransitaire) { + if (projet && projet.actTransitaire) { activitySelector.querySelector('option[value="transitaire"]').selected = true; - document.getElementById("select-transitaire").dataset.defaultValue = rc.valueActTransitaire; + document.getElementById("select-transitaire").dataset.defaultValue = projet.valueActTransitaire; } document.getElementById('activity-selector').dispatchEvent(new Event('change')); @@ -828,98 +2088,156 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio // Populate marchandises const marchandiseSelector = document.getElementById('marchandise-selector'); - if (rc.marOrdinaire) { marchandiseSelector.querySelector('option[value="ordinaire"]').selected = true; }; - if (rc.marRoulant) { marchandiseSelector.querySelector('option[value="roulant"]').selected = true; }; - if (rc.marEngins) { marchandiseSelector.querySelector('option[value="engins-chantier-agricole"]').selected = true; }; - if (rc.marRoulantDem) { marchandiseSelector.querySelector('option[value="roulant-demenagement"]').selected = true; }; - if (rc.marMobilerUsag) { marchandiseSelector.querySelector('option[value="mobilier-usages"]').selected = true; }; - if (rc.marPerissable) { marchandiseSelector.querySelector('option[value="perissable-temperature-dirigee"]').selected = true; }; - if (rc.marAnimaux) { + if (projet && projet.marOrdinaire) { marchandiseSelector.querySelector('option[value="ordinaire"]').selected = true; }; + if (projet && projet.marRoulant) { marchandiseSelector.querySelector('option[value="roulant"]').selected = true; }; + if (projet && projet.marEngins) { marchandiseSelector.querySelector('option[value="engins-chantier-agricole"]').selected = true; }; + if (projet && projet.marRoulantDem) { marchandiseSelector.querySelector('option[value="roulant-demenagement"]').selected = true; }; + if (projet && projet.marMobilerUsag) { marchandiseSelector.querySelector('option[value="mobilier-usages"]').selected = true; }; + if (projet && projet.marPerissable) { marchandiseSelector.querySelector('option[value="perissable-temperature-dirigee"]').selected = true; }; + if (projet && projet.marAnimaux) { tagAnimauxVivants = true; marchandiseSelector.querySelector('option[value="animaux-vivant"]').selected = true; }; - if (rc.marCiterne) { marchandiseSelector.querySelector('option[value="citerne"]').selected = true; }; - if (rc.marBeton) { marchandiseSelector.querySelector('option[value="beton"]').selected = true; }; - if (rc.marExceptionnels) { marchandiseSelector.querySelector('option[value="exceptionnels"]').selected = true; }; - if (rc.marVrac) { marchandiseSelector.querySelector('option[value="vrac"]').selected = true; }; + if (projet && projet.marCiterne) { marchandiseSelector.querySelector('option[value="citerne"]').selected = true; }; + if (projet && projet.marBeton) { marchandiseSelector.querySelector('option[value="beton"]').selected = true; }; + if (projet && projet.marExceptionnels) { marchandiseSelector.querySelector('option[value="exceptionnels"]').selected = true; }; + if (projet && projet.marVrac) { marchandiseSelector.querySelector('option[value="vrac"]').selected = true; }; document.getElementById('marchandise-selector').dispatchEvent(new Event('change')); - // Populate territorialité - if (rc.zone1) { document.getElementById("zone1").checked = true }; - if (rc.zone2) { - document.getElementById("zone2").checked = true; - document.getElementById("zone1").checked = true; - document.getElementById("zone1").disabled = true; - }; - if (rc.zone3) { - document.getElementById("zone3").checked = true; - document.getElementById("zone2").checked = true; - document.getElementById("zone2").disabled = true; - document.getElementById("zone1").checked = true; - document.getElementById("zone1").disabled = true; - }; - if (rc.zone4) { document.getElementById("zone4").checked = true }; - if (rc.zone5) { document.getElementById("zone5").checked = true }; - if (rc.zone6) { document.getElementById("zone6").checked = true }; + // Populate territorialité - depuis projet OU depuis rc (tarif) en fallback + const zonesSource = projet || rc; + if (zonesSource) { + if (zonesSource.zone1) { + document.getElementById("zone1").checked = true; + document.getElementById("zone1").disabled = false; + } + if (zonesSource.zone2) { + document.getElementById("zone2").checked = true; + document.getElementById("zone2").disabled = false; + if (!zonesSource.zone1) { + document.getElementById("zone1").checked = true; + document.getElementById("zone1").disabled = true; + } + } + if (zonesSource.zone3) { + document.getElementById("zone3").checked = true; + document.getElementById("zone3").disabled = false; + if (!zonesSource.zone2) { + document.getElementById("zone2").checked = true; + document.getElementById("zone2").disabled = true; + } + if (!zonesSource.zone1) { + document.getElementById("zone1").checked = true; + document.getElementById("zone1").disabled = true; + } + } + if (zonesSource.zone4) { + document.getElementById("zone4").checked = true; + document.getElementById("zone4").disabled = false; + } + if (zonesSource.zone5) { + document.getElementById("zone5").checked = true; + document.getElementById("zone5").disabled = false; + } + if (zonesSource.zone6) { + document.getElementById("zone6").checked = true; + document.getElementById("zone6").disabled = false; + } + } // Populate extensions de garantie RCC const garantieRCCSelector = document.getElementById('garantieRCC-selector'); - if (rc.extRCCModifCalArrim) { garantieRCCSelector.querySelector('option[value="modif-calage-arrimage"]').selected = true; }; - if (rc.extRCCFerroutage) { garantieRCCSelector.querySelector('option[value="ferroutage"]').selected = true; }; - if (rc.extRCCFraisRecons) { garantieRCCSelector.querySelector('option[value="frais-reconstitution"]').selected = true; }; - if (rc.extRCCConfie) { + if (projet && projet.extRCCModifCalArrim) { garantieRCCSelector.querySelector('option[value="modif-calage-arrimage"]').selected = true; }; + if (projet && projet.extRCCFerroutage) { garantieRCCSelector.querySelector('option[value="ferroutage"]').selected = true; }; + if (projet && projet.extRCCFraisRecons) { garantieRCCSelector.querySelector('option[value="frais-reconstitution"]').selected = true; }; + if (projet && projet.extRCCConfie) { garantieRCCSelector.querySelector('option[value="contenant-confie"]').selected = true; - if (rc.typeExtConfies == "ADVALOREM") { + if (projet.typeExtConfies == "ADVALOREM") { document.getElementById("AdValorem").checked = true; } else { document.getElementById("ValeurDeclaree").checked = true; } }; - if (rc.extRCCTPPC) { garantieRCCSelector.querySelector('option[value="tppc"]').selected = true; }; - if (rc.extRCCRegie) { garantieRCCSelector.querySelector('option[value="regie"]').selected = true; }; - if (rc.extRCCSansMontageDemontage) { garantieRCCSelector.querySelector('option[value="sans-montage-demontage"]').selected = true; }; + if (projet && projet.extRCCTPPC) { garantieRCCSelector.querySelector('option[value="tppc"]').selected = true; }; + if (projet && projet.extRCCRegie) { garantieRCCSelector.querySelector('option[value="regie"]').selected = true; }; + if (projet && projet.extRCCSansMontageDemontage) { garantieRCCSelector.querySelector('option[value="sans-montage-demontage"]').selected = true; }; document.getElementById('garantieRCC-selector').dispatchEvent(new Event('change')); - // Populate extensions de garantie RCC - if (rc.autresRC) { - document.getElementById("choixRCE").checked = true; - document.getElementById('garantieRCE').style.display = 'block'; - document.getElementById('RCE1').style.display = ''; - document.getElementById('RCE2').style.display = ''; - } + // Populate extensions de garantie RCE - DOIT être fait APRÈS le chargement des données projet + setTimeout(() => { + const hasRCEProjet = projet && (projet.autresRC || projet.extRCEBraDebra || projet.extRCEMontageDemontage); + const hasRCERC = rc && rc.checkRCE; + const hasRCETarif = tarif && tarif.checkRCE; + const hasRCE = hasRCEProjet || hasRCERC || hasRCETarif; + + if (hasRCE) { + const choixRCEEl = document.getElementById("choixRCE"); + if (choixRCEEl) { + choixRCEEl.checked = true; + const garantieRCEEl = document.getElementById('garantieRCE'); + if (garantieRCEEl) { + garantieRCEEl.style.display = 'block'; + } + const rce1El = document.getElementById('RCE1'); + if (rce1El) { + rce1El.style.display = ''; + } + const rce2El = document.getElementById('RCE2'); + if (rce2El) { + rce2El.style.display = ''; + } + } + } + }, 100); const garantieRCESelector = document.getElementById('garantieRCE-selector'); - - if (rc.extRCEBraDebra) { garantieRCESelector.querySelector('option[value="branchement-debranchement"]').selected = true; }; - if (rc.extRCEMontageDemontage) { garantieRCESelector.querySelector('option[value="montage-demontage"]').selected = true; }; - - document.getElementById('garantieRCE-selector').dispatchEvent(new Event('change')); + if (garantieRCESelector) { + if (projet && projet.extRCEBraDebra) { + const option = garantieRCESelector.querySelector('option[value="branchement-debranchement"]'); + if (option) option.selected = true; + } + if (projet && projet.extRCEMontageDemontage) { + const option = garantieRCESelector.querySelector('option[value="montage-demontage"]'); + if (option) option.selected = true; + } + garantieRCESelector.dispatchEvent(new Event('change')); + } // Populate temporalité - if (rc.tempo) { document.getElementById(rc.tempo).checked = true }; - if (rc.dateEffet) { document.getElementById("dateEffet").value = rc.dateEffet }; - if (rc.dateEcheance) { document.getElementById("dateEcheance").value = rc.dateEcheance }; + if (projet && projet.tempo) { document.getElementById(projet.tempo).checked = true }; + if (projet && projet.dateEffet) { document.getElementById("dateEffet").value = projet.dateEffet }; + if (projet && projet.dateEcheance) { document.getElementById("dateEcheance").value = projet.dateEcheance }; if (contrat.type == "TEMPORAIRE") { document.getElementById("rowDateFin").style.display = 'block'; } - if (rc.dateFin) { document.getElementById("dateFin").value = rc.dateFin }; + if (projet && projet.dateFin) { document.getElementById("dateFin").value = projet.dateFin }; - if (rc.programmeInternationale) { document.getElementById("programmeInternationale").checked = true; } - if (rc.participationResultat) { document.getElementById("participationResultat").checked = true; } + if (projet && projet.programmeInternationale) { document.getElementById("programmeInternationale").checked = true; } + if (projet && projet.participationResultat) { document.getElementById("participationResultat").checked = true; } - if (rc.pj) { + if (projet && projet.pj) { document.getElementById("switchPJ").checked = true; document.getElementById('PJ1').style.display = ''; document.getElementById('PJ2').style.display = ''; } - // Populate Cotisation - if (rc.typeCot) { document.getElementById(rc.typeCot).checked = true }; + // Populate Cotisation - charger depuis RC principal si existe + const typeCotFromRC = rc?.typeCotisation || projet?.typeCot; + if (typeCotFromRC) { + const radioCot = document.getElementById(typeCotFromRC); + if (radioCot) radioCot.checked = true; + } - if (rc.typeCot == "forfaitaire") { + // Populate CA depuis RC principal + const caFromRC = rc?.chiffreAffaires || projet?.ca; + if (caFromRC) { + document.getElementById("CA").value = caFromRC; + } + + if ((typeCotFromRC || projet?.typeCot) == "forfaitaire") { document.getElementById("checkVehicules").style.display = 'block'; document.getElementById("colTauxAjustement").style.display = 'none'; document.getElementById("colCotMini").style.display = 'none'; @@ -939,60 +2257,71 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio document.getElementById("colTypeCot").style.float = "left"; } - if (rc.ca) { document.getElementById("CA").value = rc.ca }; - if (rc.cotIrreductible) { document.getElementById("cotisationIrreductible").value = rc.cotIrreductible }; - if (rc.tauxRCCHT) { document.getElementById("tauxRCCHT").value = rc.tauxRCCHT }; - if (rc.tauxRCCTTC) { document.getElementById("tauxRCCTTC").value = rc.tauxRCCTTC }; - if (rc.tauxRCEHT) { document.getElementById("tauxRCEHT").value = rc.tauxRCEHT }; - if (rc.tauxRCETTC) { document.getElementById("tauxRCETTC").value = rc.tauxRCETTC }; - if (rc.tauxTotalHT) { document.getElementById("tauxTotalHT").value = rc.tauxTotalHT }; - if (rc.tauxTotalTTC) { document.getElementById("tauxTotalTTC").value = rc.tauxTotalTTC }; - if (rc.cotRCCHT) { document.getElementById("cotRCCHT").value = rc.cotRCCHT }; - if (rc.cotRCCTTC) { document.getElementById("cotRCCTTC").value = rc.cotRCCTTC }; - if (rc.cotRCEHT) { document.getElementById("cotRCEHT").value = rc.cotRCEHT }; - if (rc.cotRCETTC) { document.getElementById("cotRCETTC").value = rc.cotRCETTC }; - if (rc.cotPJHT) { document.getElementById("cotPJHT").value = rc.cotPJHT }; - if (rc.cotPJTTC) { document.getElementById("cotPJTTC").value = rc.cotPJTTC }; - if (rc.cotTotalHT) { document.getElementById("cotTotalHT").value = rc.cotTotalHT }; - if (rc.cotTotalTTC) { document.getElementById("cotTotalTTC").value = rc.cotTotalTTC }; - if (rc.cotFraisHT) { document.getElementById("cotFraisHT").value = rc.cotFraisHT }; - if (rc.cotFraisTTC) { document.getElementById("cotFraisTTC").value = rc.cotFraisTTC }; + if (projet && projet.ca) { document.getElementById("CA").value = projet.ca }; + if (projet && projet.cotIrreductible) { document.getElementById("cotisationIrreductible").value = projet.cotIrreductible }; + if (projet && projet.tauxRCCHT) { document.getElementById("tauxRCCHT").value = projet.tauxRCCHT }; + if (projet && projet.tauxRCCTTC) { document.getElementById("tauxRCCTTC").value = projet.tauxRCCTTC }; + if (projet && projet.tauxRCEHT) { document.getElementById("tauxRCEHT").value = projet.tauxRCEHT }; + if (projet && projet.tauxRCETTC) { document.getElementById("tauxRCETTC").value = projet.tauxRCETTC }; + if (projet && projet.tauxTotalHT) { document.getElementById("tauxTotalHT").value = projet.tauxTotalHT }; + if (projet && projet.tauxTotalTTC) { document.getElementById("tauxTotalTTC").value = projet.tauxTotalTTC }; + if (projet && projet.cotRCCHT) { document.getElementById("cotRCCHT").value = projet.cotRCCHT }; + if (projet && projet.cotRCCTTC) { document.getElementById("cotRCCTTC").value = projet.cotRCCTTC }; + if (projet && projet.cotRCEHT) { document.getElementById("cotRCEHT").value = projet.cotRCEHT }; + if (projet && projet.cotRCETTC) { document.getElementById("cotRCETTC").value = projet.cotRCETTC }; + if (projet && projet.cotPJHT) { document.getElementById("cotPJHT").value = projet.cotPJHT }; + if (projet && projet.cotPJTTC) { document.getElementById("cotPJTTC").value = projet.cotPJTTC }; + if (projet && projet.cotTotalHT) { document.getElementById("cotTotalHT").value = projet.cotTotalHT }; + if (projet && projet.cotTotalTTC) { document.getElementById("cotTotalTTC").value = projet.cotTotalTTC }; + if (projet && projet.cotFraisHT) { document.getElementById("cotFraisHT").value = projet.cotFraisHT }; + if (projet && projet.cotFraisTTC) { document.getElementById("cotFraisTTC").value = projet.cotFraisTTC }; // Populate tableau vehicule - if (!rc || !rc.designationVehicule || Object.keys(rc.designationVehicule).length === 0) { + if (!rc || !projet.designationVehicule || Object.keys(projet.designationVehicule).length === 0) { console.log("Le JSON est vide, pas de véhicules à pré-remplir."); } else { - for (let i = 0; i < rc.designationVehicule.length; i++) { - const row = rc.designationVehicule[i]; + for (let i = 0; i < projet.designationVehicule.length; i++) { + const row = projet.designationVehicule[i]; addRowVehicule(row.marque, row.genre, row.type, row.immat, row.capital); } } // Populate Grille Advalorem - if (rc.actMultimodal) { - if (rc.grilleAerien) { - populateGrAdvalo(rc.grilleAerien, "tabAdvaloAerien"); + hasSavedGrilleData = Boolean( + (projet?.grilleMultimodal && (Array.isArray(projet.grilleMultimodal) ? projet.grilleMultimodal.length : true)) || + (projet?.grilleTerrestre && (Array.isArray(projet.grilleTerrestre) ? projet.grilleTerrestre.length : true)) || + (projet?.grilleAerien && (Array.isArray(projet.grilleAerien) ? projet.grilleAerien.length : true)) + ); + + const isMultimodal = Boolean(projet?.actMultimodal || rc?.actMultimodal); + if (isMultimodal) { + if (projet?.grilleAerien) { + const grilleAerien = Array.isArray(projet.grilleAerien) ? projet.grilleAerien : (typeof projet.grilleAerien === 'string' ? JSON.parse(projet.grilleAerien) : []); + populateGrAdvalo(grilleAerien, "tabAdvaloAerien"); document.getElementById('divAdvaloAerien').style.display = "block"; document.getElementById('divAdvaloTerrestre').style.display = "none"; document.getElementById('divAdvaloMultimodal').style.display = "none"; }; - if (rc.grilleTerrestre) { - populateGrAdvalo(rc.grilleTerrestre, "tabAdvaloTerrestre"); + if (projet?.grilleTerrestre) { + const grilleTerrestre = Array.isArray(projet.grilleTerrestre) ? projet.grilleTerrestre : (typeof projet.grilleTerrestre === 'string' ? JSON.parse(projet.grilleTerrestre) : []); + populateGrAdvalo(grilleTerrestre, "tabAdvaloTerrestre"); document.getElementById('divAdvaloTerrestre').style.display = "block"; document.getElementById('divAdvaloAerien').style.display = "none"; document.getElementById('divAdvaloMultimodal').style.display = "none"; }; - if (rc.grilleMultimodal) { - populateGrAdvalo(rc.grilleMultimodal, "tabAdvaloMultimodal"); + if (projet?.grilleMultimodal) { + const grilleMultimodal = Array.isArray(projet.grilleMultimodal) ? projet.grilleMultimodal : (typeof projet.grilleMultimodal === 'string' ? JSON.parse(projet.grilleMultimodal) : []); + populateGrAdvalo(grilleMultimodal, "tabAdvaloMultimodal"); document.getElementById('divAdvaloMultimodal').style.display = "block"; document.getElementById('divAdvaloAerien').style.display = "none"; document.getElementById('divAdvaloTerrestre').style.display = "none"; }; } else { - if (rc.grilleTerrestre) { - populateGrAdvalo(rc.grilleTerrestre, "tabAdvaloTerrestre"); + if (projet?.grilleTerrestre) { + const grilleTerrestre = Array.isArray(projet.grilleTerrestre) ? projet.grilleTerrestre : (typeof projet.grilleTerrestre === 'string' ? JSON.parse(projet.grilleTerrestre) : []); + populateGrAdvalo(grilleTerrestre, "tabAdvaloTerrestre"); document.getElementById('divAdvaloTerrestre').style.display = "block"; document.getElementById('divAdvaloAerien').style.display = "none"; document.getElementById('divAdvaloMultimodal').style.display = "none"; @@ -1002,20 +2331,35 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio function populateGrAdvalo(jsonData, tableID) { var table = document.getElementById(tableID); + if (!table) { + console.warn('Table non trouvée:', tableID); + return; + } + + if (!jsonData || !Array.isArray(jsonData) || jsonData.length === 0) { + console.warn('Données grille vides ou invalides pour', tableID, ':', jsonData); + return; + } + + console.log('Remplissage de la grille', tableID, 'avec', jsonData.length, 'catégories'); for (var i = 0; i < jsonData.length; i++) { var category = jsonData[i].name; + if (!category) continue; for (var j = 1; j < table.rows.length; j++) { - var categoryName = table.rows[j].cells[0].innerText.trim(); + var categoryName = table.rows[j].cells[0] ? table.rows[j].cells[0].innerText.trim() : ''; if (categoryName === category) { var categoryRow = table.rows[j]; for (var k = 1; k <= 6; k++) { var zoneKey = "zone" + k; - var zoneInput = categoryRow.cells[k].querySelector("input[type='text']"); - zoneInput.value = jsonData[i][zoneKey]; + var zoneInput = categoryRow.cells[k] ? categoryRow.cells[k].querySelector("input[type='text']") : null; + if (zoneInput && jsonData[i][zoneKey]) { + zoneInput.value = jsonData[i][zoneKey]; + console.log('Rempli:', category, zoneKey, '=', jsonData[i][zoneKey]); + } } break; @@ -1078,10 +2422,10 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio for (let k = 1; k <= 8; k++) { const element = document.getElementById(`${mode}Cat${k}Zone${zone}`); const marPerissable = document.getElementById("perissable-temperature-dirigee-chip") || null; - const marEngins = document.getElementById("engins-chantier-agricole-chip" || null); - const marMobilier = document.getElementById("mobilier-usages-chip" || null); - const marRoulantDem = document.getElementById("roulant-demenagement-chip" || null); - const marRoulant = document.getElementById("roulant-chip" || null); + const marEngins = document.getElementById("engins-chantier-agricole-chip") || null; + const marMobilier = document.getElementById("mobilier-usages-chip") || null; + const marRoulantDem = document.getElementById("roulant-demenagement-chip") || null; + const marRoulant = document.getElementById("roulant-chip") || null; let value = "Nous consulter"; // Par défaut @@ -1108,6 +2452,10 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio value = categories[mode][`Cat${k}`][zone - 1]; } } + // Si une grille enregistrée existe déjà, ne pas écraser les valeurs pré-remplies + if (hasSavedGrilleData && element && element.value && element.value.trim() !== '') { + continue; + } element.value = value; } } @@ -1154,21 +2502,32 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio // Iterate over each selected option Array.from(select.options).forEach(option => { - if (option.selected && option.value && !document.getElementById(option.value + "-chip")) { - const activityName = option.textContent; - const activityDiv = document.createElement('div'); - activityDiv.classList.add('activity-input', 'row'); - activityDiv.style.marginBottom = '10px'; - activityDiv.innerHTML = ` -
- - -
-
- -
- `; - activityFormsContainer.appendChild(activityDiv); + if (option.selected && option.value) { + const existingChip = document.getElementById(option.value + "-chip"); + if (!existingChip) { + const activityName = option.textContent; + const activityDiv = document.createElement('div'); + activityDiv.classList.add('activity-input', 'row'); + activityDiv.style.marginBottom = '10px'; + activityDiv.innerHTML = ` +
+ + +
+
+ +
+ `; + activityFormsContainer.appendChild(activityDiv); + } + } else { + const existingChip = document.getElementById(option.value + "-chip"); + if (existingChip) { + const activityDiv = existingChip.closest('.activity-input'); + if (activityDiv) { + activityDiv.remove(); + } + } } }); } @@ -1229,22 +2588,33 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio const marchandiseFormsContainer = document.getElementById('selected-marchandises'); // Clear previous entries - marchandiseFormsContainer.innerHTML = ''; // Clear any existing entries + marchandiseFormsContainer.innerHTML = ''; - // Iterate over each selected option + // Iterate over each option Array.from(select.options).forEach(option => { if (option.selected && option.value) { - const marchandiseName = option.textContent; - const marchandiseDiv = document.createElement('div'); - marchandiseDiv.classList.add('marchandise-input', 'row'); - marchandiseDiv.style.display = 'flex'; - marchandiseDiv.style.alignItems = 'center'; - marchandiseDiv.style.justifyContent = 'start'; - marchandiseDiv.style.marginBottom = '10px'; - marchandiseDiv.innerHTML = ` - ${marchandiseName} - `; - marchandiseFormsContainer.appendChild(marchandiseDiv); + const existingChip = document.getElementById(`${option.value}-chip`); + if (!existingChip) { + const marchandiseName = option.textContent; + const marchandiseDiv = document.createElement('div'); + marchandiseDiv.classList.add('marchandise-input', 'row'); + marchandiseDiv.style.display = 'flex'; + marchandiseDiv.style.alignItems = 'center'; + marchandiseDiv.style.justifyContent = 'start'; + marchandiseDiv.style.marginBottom = '10px'; + marchandiseDiv.innerHTML = ` + ${marchandiseName} + `; + marchandiseFormsContainer.appendChild(marchandiseDiv); + } + } else { + const existingChip = document.getElementById(`${option.value}-chip`); + if (existingChip) { + const chipContainer = existingChip.closest('.marchandise-input'); + if (chipContainer) { + chipContainer.remove(); + } + } } }); } @@ -1382,19 +2752,81 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio function extractGrilleAdvalo(tableID) { var jsonData = []; var table = document.getElementById(tableID); - var zonesCount = table.rows[0].cells.length - 1; - - for (var i = 1; i < table.rows.length; i++) { - var category = table.rows[i].cells[0].innerText.trim(); - var categoryData = { "name": category }; - - for (var j = 1; j <= zonesCount; j++) { - var zoneKey = "zone" + j; - var zoneValue = table.rows[i].cells[j].querySelector("input[type='text']").value || "Nous consulter"; - categoryData[zoneKey] = zoneValue; + if (!table) { + return jsonData; + } + + var parentDiv = table.closest('div'); + var wasHidden = false; + var originalDisplay = ''; + var originalVisibility = ''; + var originalPosition = ''; + var originalLeft = ''; + + if (parentDiv) { + originalDisplay = parentDiv.style.display || ''; + originalVisibility = parentDiv.style.visibility || ''; + originalPosition = parentDiv.style.position || ''; + originalLeft = parentDiv.style.left || ''; + + if (parentDiv.style.display === 'none' || window.getComputedStyle(parentDiv).display === 'none') { + wasHidden = true; + parentDiv.style.display = 'block'; + parentDiv.style.visibility = 'hidden'; + parentDiv.style.position = 'absolute'; + parentDiv.style.left = '-9999px'; + } + } + + try { + if (!table.rows || table.rows.length < 2) { + return jsonData; + } + + var zonesCount = table.rows[0] ? table.rows[0].cells.length - 1 : 0; + if (zonesCount === 0) { + return jsonData; } - jsonData.push(categoryData); + for (var i = 1; i < table.rows.length; i++) { + var row = table.rows[i]; + if (!row || !row.cells || row.cells.length === 0) continue; + + var category = row.cells[0] ? (row.cells[0].innerText || row.cells[0].textContent || '').trim() : ''; + if (!category) continue; + + var categoryData = { "name": category }; + + for (var j = 1; j <= zonesCount && j < row.cells.length; j++) { + var zoneKey = "zone" + j; + var cell = row.cells[j]; + if (!cell) { + categoryData[zoneKey] = "Nous consulter"; + continue; + } + + var input = cell.querySelector("input[type='text']"); + if (input) { + var zoneValue = (input.value || '').trim(); + categoryData[zoneKey] = zoneValue || "Nous consulter"; + } else { + categoryData[zoneKey] = "Nous consulter"; + } + } + + if (Object.keys(categoryData).length > 1) { + jsonData.push(categoryData); + } + } + } catch (error) { + console.error('Erreur lors de l\'extraction de la grille Ad Valorem:', error); + } finally { + if (wasHidden && parentDiv) { + parentDiv.style.display = originalDisplay; + parentDiv.style.visibility = originalVisibility; + parentDiv.style.position = originalPosition; + parentDiv.style.left = originalLeft; + } } return jsonData; @@ -1482,46 +2914,48 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio async function handleSubmitForm(event) { event.preventDefault(); - // Création d'une nouvelle saisie dans la collection RC - const responseRC = await fetch(`/rc/create`, { - method: 'POST', - body: JSON.stringify({ + // Étape 1: Créer d'abord un enregistrement dans projetRC + const grilleMultimodal = extractGrilleAdvalo('tabAdvaloMultimodal'); + const grilleTerrestre = extractGrilleAdvalo('tabAdvaloTerrestre'); + const grilleAerien = extractGrilleAdvalo('tabAdvaloAerien'); + + const projetRCData = { // Tableaux "assureAdditionnel": extractAssureAdditionnel('empTableAdditionnel'), "designationVehicule": extractDesignationVehicule('empTableVehicules'), - "grilleMultimodal": extractGrilleAdvalo('tabAdvaloMultimodal'), - "grilleTerrestre": extractGrilleAdvalo('tabAdvaloTerrestre'), - "grilleAerien": extractGrilleAdvalo('tabAdvaloAerien'), + "grilleMultimodal": grilleMultimodal, + "grilleTerrestre": grilleTerrestre, + "grilleAerien": grilleAerien, - // Activitées + // Activitées - avec gestion "Nous consulter" "actVoiturier": document.getElementById("voiturier-chip") ? true : false, - "valueActVoiturier": document.getElementById("voiturier-chip") ? document.getElementById("voiturier").value : false, + "valueActVoiturier": document.getElementById("voiturier-chip") ? getValueOrConsulter("voiturier") : false, "actLoueur": document.getElementById("loueur-chip") ? true : false, - "valueActLoueur": document.getElementById("loueur-chip") ? document.getElementById("loueur").value : false, + "valueActLoueur": document.getElementById("loueur-chip") ? getValueOrConsulter("loueur") : false, "actMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? true : false, - "valueActMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? document.getElementById("commissionnaire-multimodal").value : false, + "valueActMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? getValueOrConsulter("commissionnaire-multimodal") : false, "actDouane": document.getElementById("représentant-douane-chip") ? true : false, - "valueActDouane": document.getElementById("représentant-douane-chip") ? document.getElementById("représentant-douane").value : false, + "valueActDouane": document.getElementById("représentant-douane-chip") ? getValueOrConsulter("représentant-douane") : false, "actDemPar": document.getElementById("demenageur-particulier-chip") ? true : false, - "valueActDemPar": document.getElementById("demenageur-particulier-chip") ? document.getElementById("demenageur-particulier").value : false, + "valueActDemPar": document.getElementById("demenageur-particulier-chip") ? getValueOrConsulter("demenageur-particulier") : false, "actDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? true : false, - "valueActDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? document.getElementById("demenageur-particulier-dommage").value : false, + "valueActDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? getValueOrConsulter("demenageur-particulier-dommage") : false, "actDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? true : false, - "valueActDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? document.getElementById("demenageur-particulier-advalorem").value : false, + "valueActDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? getValueOrConsulter("demenageur-particulier-advalorem") : false, "actDemEntr": document.getElementById("demenageur-entreprise-chip") ? true : false, - "valueActDemEntr": document.getElementById("demenageur-entreprise-chip") ? document.getElementById("demenageur-entreprise").value : false, + "valueActDemEntr": document.getElementById("demenageur-entreprise-chip") ? getValueOrConsulter("demenageur-entreprise") : false, "actDemInterne": document.getElementById("demenageur-interne-chip") ? true : false, - "valueActDemInterne": document.getElementById("demenageur-interne-chip") ? document.getElementById("demenageur-interne").value : false, + "valueActDemInterne": document.getElementById("demenageur-interne-chip") ? getValueOrConsulter("demenageur-interne") : false, "actGardeMeuble": document.getElementById("garde-meubles-chip") ? true : false, - "valueActGardeMeuble": document.getElementById("garde-meubles-chip") ? document.getElementById("garde-meubles").value : false, + "valueActGardeMeuble": document.getElementById("garde-meubles-chip") ? getValueOrConsulter("garde-meubles") : false, "actEntDep": document.getElementById("entrepositaire-depositaire-chip") ? true : false, - "valueActEntDep": document.getElementById("entrepositaire-depositaire-chip") ? document.getElementById("entrepositaire-depositaire").value : false, + "valueActEntDep": document.getElementById("entrepositaire-depositaire-chip") ? getValueOrConsulter("entrepositaire-depositaire") : false, "actPrestaLog": document.getElementById("prestataire-logistique-chip") ? true : false, - "valueActPrestaLog": document.getElementById("prestataire-logistique-chip") ? document.getElementById("prestataire-logistique").value : false, + "valueActPrestaLog": document.getElementById("prestataire-logistique-chip") ? getValueOrConsulter("prestataire-logistique") : false, "actLevageur": document.getElementById("manutentionnaire-levageur-chip") ? true : false, - "valueActLevageur": document.getElementById("manutentionnaire-levageur-chip") ? document.getElementById("manutentionnaire-levageur").value : false, + "valueActLevageur": document.getElementById("manutentionnaire-levageur-chip") ? getValueOrConsulter("manutentionnaire-levageur") : false, "actTransitaire": document.getElementById("transitaire-chip") ? true : false, - "valueActTransitaire": document.getElementById("transitaire-chip") ? document.getElementById("transitaire").value : false, + "valueActTransitaire": document.getElementById("transitaire-chip") ? getValueOrConsulter("transitaire") : false, //Marchandises "marOrdinaire": document.getElementById("ordinaire-chip") ? true : false, @@ -1536,13 +2970,13 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio "marExceptionnels": document.getElementById("exceptionnels-chip") ? true : false, "marVrac": document.getElementById("vrac-chip") ? true : false, - // Territorialités - "zone1": document.getElementById("zone1").checked ? true : false, - "zone2": document.getElementById("zone2").checked ? true : false, - "zone3": document.getElementById("zone3").checked ? true : false, - "zone4": document.getElementById("zone4").checked ? true : false, - "zone5": document.getElementById("zone5").checked ? true : false, - "zone6": document.getElementById("zone6").checked ? true : false, + // Territorialités - vérifier checked même si disabled + "zone1": document.getElementById("zone1") && (document.getElementById("zone1").checked || document.getElementById("zone1").disabled) ? true : false, + "zone2": document.getElementById("zone2") && (document.getElementById("zone2").checked || document.getElementById("zone2").disabled) ? true : false, + "zone3": document.getElementById("zone3") && document.getElementById("zone3").checked ? true : false, + "zone4": document.getElementById("zone4") && document.getElementById("zone4").checked ? true : false, + "zone5": document.getElementById("zone5") && document.getElementById("zone5").checked ? true : false, + "zone6": document.getElementById("zone6") && document.getElementById("zone6").checked ? true : false, // Extensions de garantie RCC "extRCCModifCalArrim": document.getElementById("modif-calage-arrimage-chip") ? true : false, @@ -1559,6 +2993,12 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio "extRCEBraDebra": document.getElementById("branchement-debranchement-chip") ? true : false, "extRCEMontageDemontage": document.getElementById("montage-demontage-chip") ? true : false, + // Activités complémentaires + "activitesVoiturier": JSON.stringify(getActivitesComplFromForm('actComplVoiturier/Loueur')), + "activitesCommissionnaire": JSON.stringify(getActivitesComplFromForm('actComplCommissionnaire de Transport')), + "activitesDemenageur": JSON.stringify(getActivitesComplFromForm('actComplDéménageur')), + "activitesLogistique": JSON.stringify(getActivitesComplFromForm('actComplLogistique')), + // Temporalités "tempo": extractTempo(), "dateEffet": document.getElementById("dateEffet").value, @@ -1568,39 +3008,108 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio "programmeInternationale": document.getElementById("programmeInternationale").checked ? true : false, "participationResultat": document.getElementById("participationResultat").checked ? true : false, - // Cotisations + // Cotisations - avec gestion "Nous consulter" "typeCot": extractTypeCot(), - "ca": document.getElementById("CA").value, - "cotIrreductible": document.getElementById("cotisationIrreductible").value, - "tauxRCCHT": document.getElementById("tauxRCCHT").value, - "tauxRCCTTC": document.getElementById("tauxRCCTTC").value, - "tauxRCEHT": document.getElementById("tauxRCEHT").value, - "tauxRCETTC": document.getElementById("tauxRCETTC").value, - "tauxTotalHT": document.getElementById("tauxTotalHT").value, - "tauxTotalTTC": document.getElementById("tauxTotalTTC").value, - "cotRCCHT": document.getElementById("cotRCCHT").value, - "cotRCCTTC": document.getElementById("cotRCCTTC").value, - "cotRCEHT": document.getElementById("cotRCEHT").value, - "cotRCETTC": document.getElementById("cotRCETTC").value, - "cotPJHT": document.getElementById("cotPJHT").value, - "cotPJTTC": document.getElementById("cotPJTTC").value, - "cotTotalHT": document.getElementById("cotTotalHT").value, - "cotTotalTTC": document.getElementById("cotTotalTTC").value, - "cotFraisHT": document.getElementById("cotFraisHT").value, - "cotFraisTTC": document.getElementById("cotFraisTTC").value + "ca": getValueOrConsulter("CA"), + "cotIrreductible": getValueOrConsulter("cotisationIrreductible"), + "tauxRCCHT": getValueOrConsulter("tauxRCCHT"), + "tauxRCCTTC": getValueOrConsulter("tauxRCCTTC"), + "tauxRCEHT": getValueOrConsulter("tauxRCEHT"), + "tauxRCETTC": getValueOrConsulter("tauxRCETTC"), + "tauxTotalHT": getValueOrConsulter("tauxTotalHT"), + "tauxTotalTTC": getValueOrConsulter("tauxTotalTTC"), + "cotRCCHT": getValueOrConsulter("cotRCCHT"), + "cotRCCTTC": getValueOrConsulter("cotRCCTTC"), + "cotRCEHT": getValueOrConsulter("cotRCEHT"), + "cotRCETTC": getValueOrConsulter("cotRCETTC"), + "cotPJHT": getValueOrConsulter("cotPJHT"), + "cotPJTTC": getValueOrConsulter("cotPJTTC"), + "cotTotalHT": getValueOrConsulter("cotTotalHT"), + "cotTotalTTC": getValueOrConsulter("cotTotalTTC"), + "cotFraisHT": getValueOrConsulter("cotFraisHT"), + "cotFraisTTC": getValueOrConsulter("cotFraisTTC") + }; - // Vous pouvez ajouter d'autres données pour la saisie dans la collection RC ici + // Créer ou mettre à jour l'enregistrement projetRC + let idProjetRC; + if (projet && projet.id) { + // Mettre à jour l'enregistrement projetRC existant + const responseProjetRC = await fetch(`/rc/projet/update/${projet.id}`, { + method: 'POST', + body: JSON.stringify(projetRCData), + headers: { + 'Content-Type': 'application/json', + }, + }); + const dataProjetRC = await responseProjetRC.json(); + if (dataProjetRC.valid) { + idProjetRC = dataProjetRC.projetRc.id; + } else { + console.log('Échec lors de la mise à jour de l\'enregistrement ProjetRC :', dataProjetRC.message); + return; + } + } else { + // Créer un nouvel enregistrement projetRC + const responseProjetRC = await fetch(`/rc/projet/create`, { + method: 'POST', + body: JSON.stringify(projetRCData), + headers: { + 'Content-Type': 'application/json', + }, + }); + const dataProjetRC = await responseProjetRC.json(); + if (dataProjetRC.valid) { + idProjetRC = dataProjetRC.projetRc.id; + } else { + console.log('Échec lors de la création de l\'enregistrement ProjetRC :', dataProjetRC.message); + return; + } + } + + if (idProjetRC) { + + // Étape 2: Créer ou mettre à jour l'enregistrement RC principal + let idRC; + if (rc && rc.id) { + // Mettre à jour l'enregistrement RC existant avec la nouvelle référence projetRC + const responseRC = await fetch(`/rc/update/${rc.id}`, { + method: 'POST', + body: JSON.stringify({ + projetRC: idProjetRC }), headers: { 'Content-Type': 'application/json', }, }); const dataRC = await responseRC.json(); - if (dataRC.valid) { - const idRC = dataRC.rc.id; + idRC = dataRC.rc.id; + } else { + console.log('Échec lors de la mise à jour de l\'enregistrement RC :', dataRC.message); + return; + } + } else { + // Créer un nouvel enregistrement RC + const responseRC = await fetch(`/rc/create`, { + method: 'POST', + body: JSON.stringify({ + projetRC: idProjetRC, + typeCotisation: extractTypeCot() + }), + headers: { + 'Content-Type': 'application/json', + }, + }); + const dataRC = await responseRC.json(); + if (dataRC.valid) { + idRC = dataRC.rc.id; + } else { + console.log('Échec lors de la création de l\'enregistrement RC :', dataRC.message); + return; + } + } - // Mettre à jour le champ "enCours" dans le contrat avec l'ID de la nouvelle saisie RC + // Étape 3: Mettre à jour le champ "rc" dans le contrat avec l'ID de la saisie RC const responseContratEnCours = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idRC}`, { method: 'POST', headers: { @@ -1666,47 +3175,264 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio 'Content-Type': 'application/json', }, }) - .then(response => { - if (!response.ok) { - throw new Error('Erreur réseau ou serveur'); - } + .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]; + 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 + 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 - window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`; - }) - .catch(error => console.error('Erreur lors de la génération du projet:', error)); + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`; + }) + .catch(error => console.error('Erreur lors de la génération du projet 111:', error)); /// TODO FIN Génération fichier à l'enregistrement A RETIRER QUAND MODE CONTRAT /////////////////////////////////////////////////////////////////////////////////////////////////////// // TODO NE PAS OUBLIER LE HREF QUI EST DANS LE GEN ACTUELLEMENT // window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`; } else { - console.log('Echec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message); + console.log('Échec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message); } } else { - console.log('Echec lors de la mise à jour du champ "enCours" dans le contrat :', dataContratEnCours.message); + console.log('Échec lors de la mise à jour du champ "rc" dans le contrat :', dataContratEnCours.message); } } else { - console.log('Echec lors de la création de la saisie dans la collection RC :', dataRC.message); + console.log('Échec lors de la création de l\'enregistrement ProjetRC :', dataProjetRC.message); } } - // Exposer init globalement pour y accéder depuis l'extérieur + // Fonction helper pour récupérer valeur ou "Nous consulter" + function getValueOrConsulter(id) { + const element = document.getElementById(id); + if (!element) return 'Nous consulter'; + const value = element.value?.trim(); + return value || 'Nous consulter'; + } + + // Fonction exposée pour sauvegarder le projet sans générer le document + async function saveProjetRC() { + try { + // Étape 1: Créer d'abord un enregistrement dans projetRC + const grilleMultimodal = extractGrilleAdvalo('tabAdvaloMultimodal'); + const grilleTerrestre = extractGrilleAdvalo('tabAdvaloTerrestre'); + const grilleAerien = extractGrilleAdvalo('tabAdvaloAerien'); + + const projetRCData = { + // Tableaux + "assureAdditionnel": extractAssureAdditionnel('empTableAdditionnel'), + "designationVehicule": extractDesignationVehicule('empTableVehicules'), + "grilleMultimodal": grilleMultimodal, + "grilleTerrestre": grilleTerrestre, + "grilleAerien": grilleAerien, + + // Activitées + "actVoiturier": document.getElementById("voiturier-chip") ? true : false, + "valueActVoiturier": document.getElementById("voiturier-chip") ? getValueOrConsulter("voiturier") : false, + "actLoueur": document.getElementById("loueur-chip") ? true : false, + "valueActLoueur": document.getElementById("loueur-chip") ? document.getElementById("loueur").value : false, + "actMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? true : false, + "valueActMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? document.getElementById("commissionnaire-multimodal").value : false, + "actDouane": document.getElementById("représentant-douane-chip") ? true : false, + "valueActDouane": document.getElementById("représentant-douane-chip") ? document.getElementById("représentant-douane").value : false, + "actDemPar": document.getElementById("demenageur-particulier-chip") ? true : false, + "valueActDemPar": document.getElementById("demenageur-particulier-chip") ? document.getElementById("demenageur-particulier").value : false, + "actDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? true : false, + "valueActDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? document.getElementById("demenageur-particulier-dommage").value : false, + "actDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? true : false, + "valueActDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? document.getElementById("demenageur-particulier-advalorem").value : false, + "actDemEntr": document.getElementById("demenageur-entreprise-chip") ? true : false, + "valueActDemEntr": document.getElementById("demenageur-entreprise-chip") ? document.getElementById("demenageur-entreprise").value : false, + "actDemInterne": document.getElementById("demenageur-interne-chip") ? true : false, + "valueActDemInterne": document.getElementById("demenageur-interne-chip") ? document.getElementById("demenageur-interne").value : false, + "actGardeMeuble": document.getElementById("garde-meubles-chip") ? true : false, + "valueActGardeMeuble": document.getElementById("garde-meubles-chip") ? document.getElementById("garde-meubles").value : false, + "actEntDep": document.getElementById("entrepositaire-depositaire-chip") ? true : false, + "valueActEntDep": document.getElementById("entrepositaire-depositaire-chip") ? document.getElementById("entrepositaire-depositaire").value : false, + "actPrestaLog": document.getElementById("prestataire-logistique-chip") ? true : false, + "valueActPrestaLog": document.getElementById("prestataire-logistique-chip") ? document.getElementById("prestataire-logistique").value : false, + "actLevageur": document.getElementById("manutentionnaire-levageur-chip") ? true : false, + "valueActLevageur": document.getElementById("manutentionnaire-levageur-chip") ? document.getElementById("manutentionnaire-levageur").value : false, + "actTransitaire": document.getElementById("transitaire-chip") ? true : false, + "valueActTransitaire": document.getElementById("transitaire-chip") ? document.getElementById("transitaire").value : false, + + //Marchandises + "marOrdinaire": document.getElementById("ordinaire-chip") ? true : false, + "marRoulant": document.getElementById("roulant-chip") ? true : false, + "marEngins": document.getElementById("engins-chantier-agricole-chip") ? true : false, + "marRoulantDem": document.getElementById("roulant-demenagement-chip") ? true : false, + "marMobilerUsag": document.getElementById("mobilier-usages-chip") ? true : false, + "marPerissable": document.getElementById("perissable-temperature-dirigee-chip") ? true : false, + "marAnimaux": document.getElementById("animaux-vivant-chip") ? true : false, + "marCiterne": document.getElementById("citerne-chip") ? true : false, + "marBeton": document.getElementById("beton-chip") ? true : false, + "marExceptionnels": document.getElementById("exceptionnels-chip") ? true : false, + "marVrac": document.getElementById("vrac-chip") ? true : false, + + // Territorialités - vérifier checked même si disabled + "zone1": document.getElementById("zone1") && (document.getElementById("zone1").checked || document.getElementById("zone1").disabled) ? true : false, + "zone2": document.getElementById("zone2") && (document.getElementById("zone2").checked || document.getElementById("zone2").disabled) ? true : false, + "zone3": document.getElementById("zone3") && document.getElementById("zone3").checked ? true : false, + "zone4": document.getElementById("zone4") && document.getElementById("zone4").checked ? true : false, + "zone5": document.getElementById("zone5") && document.getElementById("zone5").checked ? true : false, + "zone6": document.getElementById("zone6") && document.getElementById("zone6").checked ? true : false, + + // Extensions de garantie RCC + "extRCCModifCalArrim": document.getElementById("modif-calage-arrimage-chip") ? true : false, + "extRCCFerroutage": document.getElementById("ferroutage-chip") ? true : false, + "extRCCFraisRecons": document.getElementById("frais-reconstitution-chip") ? true : false, + "extRCCConfie": document.getElementById("contenant-confie-chip") ? true : false, + "typeExtConfies": document.getElementById("contenant-confie-chip") ? (document.getElementById('ValeurDeclaree').checked ? "VALEUR DECLAREE" : "ADVALOREM") : "", + "extRCCTPPC": document.getElementById("tppc-chip") ? true : false, + "extRCCRegie": document.getElementById("regie-chip") ? true : false, + "extRCCSansMontageDemontage": document.getElementById("sans-montage-demontage-chip") ? true : false, + + // Extensions de garantie RCE + "autresRC": document.getElementById("choixRCE").checked ? true : false, + "extRCEBraDebra": document.getElementById("branchement-debranchement-chip") ? true : false, + "extRCEMontageDemontage": document.getElementById("montage-demontage-chip") ? true : false, + + // Activités complémentaires + "activitesVoiturier": JSON.stringify(getActivitesComplFromForm('actComplVoiturier/Loueur')), + "activitesCommissionnaire": JSON.stringify(getActivitesComplFromForm('actComplCommissionnaire de Transport')), + "activitesDemenageur": JSON.stringify(getActivitesComplFromForm('actComplDéménageur')), + "activitesLogistique": JSON.stringify(getActivitesComplFromForm('actComplLogistique')), + + // Temporalités + "tempo": extractTempo(), + "dateEffet": document.getElementById("dateEffet").value, + "dateEcheance": document.getElementById("dateEcheance").value, + "dateFin": document.getElementById("dateFin").value, + "pj": document.getElementById("switchPJ").checked ? true : false, + "programmeInternationale": document.getElementById("programmeInternationale").checked ? true : false, + "participationResultat": document.getElementById("participationResultat").checked ? true : false, + + // Cotisations - avec gestion "Nous consulter" + "typeCot": extractTypeCot(), + "ca": getValueOrConsulter("CA"), + "cotIrreductible": getValueOrConsulter("cotisationIrreductible"), + "tauxRCCHT": getValueOrConsulter("tauxRCCHT"), + "tauxRCCTTC": getValueOrConsulter("tauxRCCTTC"), + "tauxRCEHT": getValueOrConsulter("tauxRCEHT"), + "tauxRCETTC": getValueOrConsulter("tauxRCETTC"), + "tauxTotalHT": getValueOrConsulter("tauxTotalHT"), + "tauxTotalTTC": getValueOrConsulter("tauxTotalTTC"), + "cotRCCHT": getValueOrConsulter("cotRCCHT"), + "cotRCCTTC": getValueOrConsulter("cotRCCTTC"), + "cotRCEHT": getValueOrConsulter("cotRCEHT"), + "cotRCETTC": getValueOrConsulter("cotRCETTC"), + "cotPJHT": getValueOrConsulter("cotPJHT"), + "cotPJTTC": getValueOrConsulter("cotPJTTC"), + "cotTotalHT": getValueOrConsulter("cotTotalHT"), + "cotTotalTTC": getValueOrConsulter("cotTotalTTC"), + "cotFraisHT": getValueOrConsulter("cotFraisHT"), + "cotFraisTTC": getValueOrConsulter("cotFraisTTC") + }; + + // Créer ou mettre à jour l'enregistrement projetRC + let idProjetRC; + if (projet && projet.id) { + // Mettre à jour l'enregistrement projetRC existant + const responseProjetRC = await fetch(`/rc/projet/update/${projet.id}`, { + method: 'POST', + body: JSON.stringify(projetRCData), + headers: { + 'Content-Type': 'application/json', + }, + }); + const dataProjetRC = await responseProjetRC.json(); + if (dataProjetRC.valid) { + idProjetRC = dataProjetRC.projetRc.id; + } else { + console.log('Échec lors de la mise à jour de l\'enregistrement ProjetRC :', dataProjetRC.message); + return { valid: false, message: 'Échec mise à jour ProjetRC' }; + } + } else { + // Créer un nouvel enregistrement projetRC + const responseProjetRC = await fetch(`/rc/projet/create`, { + method: 'POST', + body: JSON.stringify(projetRCData), + headers: { + 'Content-Type': 'application/json', + }, + }); + const dataProjetRC = await responseProjetRC.json(); + if (dataProjetRC.valid) { + idProjetRC = dataProjetRC.projetRc.id; + } else { + console.log('Échec lors de la création de l\'enregistrement ProjetRC :', dataProjetRC.message); + return { valid: false, message: 'Échec création ProjetRC' }; + } + } + + if (idProjetRC) { + + // Étape 2: Créer ou mettre à jour l'enregistrement RC principal + let idRC; + + if (rc && rc.id) { + // Mettre à jour l'enregistrement RC existant + const responseRC = await fetch(`/rc/update/${rc.id}`, { + method: 'POST', + body: JSON.stringify({ projetRC: idProjetRC }), + headers: { 'Content-Type': 'application/json' }, + }); + const dataRC = await responseRC.json(); + if (dataRC.valid) { + idRC = dataRC.rc.id; + } else { + return { valid: false, message: 'Échec mise à jour RC' }; + } + } else { + // Créer un nouvel enregistrement RC + const responseRC = await fetch(`/rc/create`, { + method: 'POST', + body: JSON.stringify({ + projetRC: idProjetRC, + typeCotisation: extractTypeCot() + }), + headers: { 'Content-Type': 'application/json' }, + }); + const dataRC = await responseRC.json(); + if (dataRC.valid) { + idRC = dataRC.rc.id; + } else { + return { valid: false, message: 'Échec création RC' }; + } + } + + // Étape 3: Mettre à jour le contrat + const responseContrat = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idRC}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }); + const dataContrat = await responseContrat.json(); + + return { valid: dataContrat.valid, idRC, idProjetRC }; + } else { + return { valid: false, message: 'Échec création ProjetRC' }; + } + } catch (error) { + console.error('Erreur lors de la sauvegarde:', error); + return { valid: false, message: error.message }; + } + } + + // Exposer les fonctions globalement pour y accéder depuis l'extérieur window.initSubmenuForm = init; + window.saveProjetRC = saveProjetRC; })(); \ No newline at end of file diff --git a/ecole/public/js/rc-data-manager.js b/ecole/public/js/rc-data-manager.js new file mode 100644 index 00000000..283e2f54 --- /dev/null +++ b/ecole/public/js/rc-data-manager.js @@ -0,0 +1,647 @@ +/** + * ═══════════════════════════════════════════════════════════════════════════ + * RC DATA MANAGER + * ═══════════════════════════════════════════════════════════════════════════ + * + * Ce module gère la collecte, la sauvegarde et le pré-remplissage des données + * RC entre les formulaires Tarif et Projet. + * + * @requires rc-sync-utils.js + * @author AXA Transport Team + * @version 2.0.0 + * @since 2026-02-17 + */ + +(function(window) { + 'use strict'; + + const { toNumber, getValue, setValue, getElementByIdFlexible } = window.RCSync; + + // ═══════════════════════════════════════════════════════════════════════ + // MAPPING DES CHAMPS TARIF ↔ PROJET + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Mapping complet des champs entre Tarif et Projet. + * Permet la synchronisation bidirectionnelle. + * + * Structure: { tarifFieldId: projetFieldId } + */ + const FIELD_MAPPING = { + // Informations générales + 'CA': 'CA', + 'chiffreAffaire': 'CA', + 'nbVehicules': 'nombreVehicules', + 'nbrVehicule': 'nombreVehicules', + + // Type de cotisation + 'cotisation': 'typeCot', + + // Activités RCC - Voiturier + 'checkVoiturier': 'actVoiturier', + 'capitalVoiturier': 'valueActVoiturier', + + // Activités RCC - Commissionnaire (Multimodal) + 'checkCommissionnaire': 'actMultimodal', + 'capitalCommissionnaire': 'valueActMultimodal', + + // Activités RCC - Déménageur + 'checkDemenageur': 'actDemEntr', + 'capitalDemenageur': 'valueActDemEntr', + + // Activités RCC - Logistique + 'checkLogistique': 'actPrestaLog', + 'capitalLogistique': 'valueActPrestaLog', + + // RCE + 'checkRCE': 'autresRC', + + // Zones géographiques + 'zone1': 'zone1', + 'zone2': 'zone2', + 'zone3': 'zone3', + 'zone4': 'zone4', + 'zone5': 'zone5', + 'zone6': 'zone6', + + // Protection Juridique + 'checkPJ': 'pj', + + // Garanties additionnelles - Engagements complémentaires + 'checkDomImmat': 'extRCCConfie', // Simplifié + 'checkContConf': 'extRCCConfie', + 'checkTPPC': 'extRCCTPPC', + + // Extensions RCC + 'checkStationLavage': 'extRCCModifCalArrim', + + // Extensions RCE + // (géré séparément car structure différente) + + // Sinistralité + 'sinistre': 'nbSinistres3ans' + }; + + // ═══════════════════════════════════════════════════════════════════════ + // COLLECTE DES DONNÉES COMPLÈTES + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Collecte toutes les données du formulaire Tarif RC. + * Cette fonction est exhaustive et capture TOUS les champs nécessaires. + * + * @returns {Object} Objet contenant toutes les données du tarif + * + * @example + * const tarifData = collectAllTarifData(); + * console.log(tarifData.ca, tarifData.zones, tarifData.marchandises); + */ + function collectAllTarifData() { + // Références flexibles aux éléments + const getEl = getElementByIdFlexible; + + const data = { + // ═══ INFORMATIONS GÉNÉRALES ═══ + typeCotisation: document.querySelector('input[name="cotisation"]:checked')?.value || null, + ca: toNumber(getValue('CA') || getValue('chiffreAffaire')), + nombreVehicules: Math.max(0, Math.round(toNumber(getValue('nbVehicules') || getValue('nbrVehicule')))), + + // ═══ ACTIVITÉS RCC ═══ + activites: { + voiturier: { + checked: getValue('checkVoiturier') || false, + capital: toNumber(getValue('capitalVoiturier')), + pourcentage: toNumber(getValue('pourcent_voiturier') || getValue('pourcentVoiturier/Loueur')), + isSet: Boolean(getValue('pourcent_voiturier')?.trim()) + }, + commissionnaire: { + checked: getValue('checkCommissionnaire') || false, + capital: toNumber(getValue('capitalCommissionnaire')), + pourcentage: toNumber(getValue('pourcent_commissionnaire')), + isSet: Boolean(getValue('pourcent_commissionnaire')?.trim()) + }, + demenageur: { + checked: getValue('checkDemenageur') || false, + capital: toNumber(getValue('capitalDemenageur')), + pourcentage: toNumber(getValue('pourcent_demenageur')), + isSet: Boolean(getValue('pourcent_demenageur')?.trim()) + }, + logistique: { + checked: getValue('checkLogistique') || false, + capital: toNumber(getValue('capitalLogistique')), + pourcentage: toNumber(getValue('pourcent_logistique')), + isSet: Boolean(getValue('pourcent_logistique')?.trim()) + }, + autocariste: { + checked: getValue('checkAutocariste') || false, + capital: toNumber(getValue('capitalAutocariste')), + pourcentage: toNumber(getValue('pourcent_autocariste')), + isSet: Boolean(getValue('pourcent_autocariste')?.trim()) + }, + autres: { + checked: getValue('checkAutres') || false, + capital: toNumber(getValue('capitalAutres')), + pourcentage: toNumber(getValue('pourcent_autres')), + isSet: Boolean(getValue('pourcent_autres')?.trim()) + } + }, + + // ═══ RCE ═══ + rce: { + checked: getValue('checkRCE') || false + }, + + // ═══ ACTIVITÉS COMPLÉMENTAIRES (JSON) ═══ + activitesComplementaires: { + voiturier: collectActivitesComplJSON('voiturier'), + commissionnaire: collectActivitesComplJSON('commissionnaire'), + demenageur: collectActivitesComplJSON('demenageur'), + logistique: collectActivitesComplJSON('logistique') + }, + + // ═══ MARCHANDISES (JSON) ═══ + marchandises: { + voiturier: collectMarchandisesJSON('voiturier'), + commissionnaire: collectMarchandisesJSON('commissionnaire'), + demenageur: collectMarchandisesJSON('demenageur'), + logistique: collectMarchandisesJSON('logistique'), + autocariste: collectMarchandisesJSON('autocariste'), + autres: collectMarchandisesJSON('autres') + }, + + // ═══ ZONES GÉOGRAPHIQUES ═══ + zones: { + zone1: getValue('zone1') || false, + zone2: getValue('zone2') || false, + zone3: getValue('zone3') || false, + zone4: getValue('zone4') || false, + zone5: getValue('zone5') || false, + zone6: getValue('zone6') || false + }, + + // ═══ ENGAGEMENTS COMPLÉMENTAIRES ═══ + engagementsComplementaires: { + domicileImmatriculation: { + checked: getValue('checkDomImmat') || false, + capital: toNumber(getValue('inputDomImmat')) + }, + contenantConfie: { + checked: getValue('checkContConf') || false, + capital: toNumber(getValue('inputContConf')) + }, + differenceInventaire: { + checked: getValue('checkDiffInv') || false, + capital: toNumber(getValue('inputDiffInv')) + } + }, + + // ═══ GARANTIES ADDITIONNELLES ═══ + garantiesAdditionnelles: { + stationLavage: getValue('checkStationLavage') || false, + garageInterne: getValue('checkGarageInterne') || false, + cse: getValue('checkCSE') || false, + tppc: { + checked: getValue('checkTPPC') || false, + capital: toNumber(getValue('selTPPCcapital')), + vehicules: Math.max(0, Math.round(toNumber(getValue('selTPPCveh')))) + }, + pj: getValue('checkPJ') || false + }, + + // ═══ SINISTRALITÉ ═══ + sinistralite: { + nombre3ans: toNumber(getValue('sinistre')), + montant3ans: 0 // TODO: ajouter si champ existe + }, + + // ═══ RÉSULTATS DE CALCUL ═══ + resultats: { + // Franchise 250 + fr250: { + primeRCC: toNumber(getEl('rccFr250')?.textContent), + primeRCE: toNumber(getEl('rceFr250')?.textContent), + primePJ: toNumber(getEl('pjFr250')?.textContent), + primeTotal: toNumber(getEl('priceFr250')?.textContent), + tauxRCC: toNumber(getEl('tauxRccFr250')?.textContent), + tauxRCE: toNumber(getEl('tauxRceFr250')?.textContent), + tauxGlobal: toNumber(getEl('tauxGlobalFr250')?.textContent) + }, + // Franchise 400 + fr400: { + primeRCC: toNumber(getEl('rccFr400')?.textContent), + primeRCE: toNumber(getEl('rceFr400')?.textContent), + primePJ: toNumber(getEl('pjFr400')?.textContent), + primeTotal: toNumber(getEl('priceFr400')?.textContent), + tauxRCC: toNumber(getEl('tauxRccFr400')?.textContent), + tauxRCE: toNumber(getEl('tauxRceFr400')?.textContent), + tauxGlobal: toNumber(getEl('tauxGlobalFr400')?.textContent) + }, + // Franchise 2000 + fr2000: { + primeRCC: toNumber(getEl('rccFr2000')?.textContent), + primeRCE: toNumber(getEl('rceFr2000')?.textContent), + primePJ: toNumber(getEl('pjFr2000')?.textContent), + primeTotal: toNumber(getEl('priceFr2000')?.textContent), + tauxRCC: toNumber(getEl('tauxRccFr2000')?.textContent), + tauxRCE: toNumber(getEl('tauxRceFr2000')?.textContent), + tauxGlobal: toNumber(getEl('tauxGlobalFr2000')?.textContent) + }, + franchiseChoisie: window.franchiseChoisie || null, + tarifCommercial: toNumber(getValue('tarifCom')) + }, + + // ═══ COMMENTAIRE ═══ + commentaire: getValue('commentaire') || '' + }; + + console.log('📊 Données Tarif collectées:', data); + return data; + } + + /** + * Fonction helper pour collecter les activités complémentaires depuis le formulaire. + * + * @param {string} typeActivite - Type d'activité ('voiturier', 'commissionnaire', etc.) + * @returns {string} JSON array des activités cochées + * @private + */ + function collectActivitesComplJSON(typeActivite) { + let name; + switch(typeActivite.toLowerCase()) { + case 'voiturier': + name = 'actComplVoiturier/Loueur'; + break; + case 'commissionnaire': + name = 'actComplCommissionnaire de Transport'; + break; + case 'demenageur': + name = 'actComplDéménageur'; + break; + case 'logistique': + name = 'actComplLogistique'; + break; + default: + return JSON.stringify([]); + } + + const checkboxes = document.querySelectorAll(`[name="${name}"] input[type="checkbox"]:checked`); + const activites = []; + checkboxes.forEach(cb => { + const text = cb.nextElementSibling ? cb.nextElementSibling.textContent.trim() : cb.value; + activites.push(text); + }); + return JSON.stringify(activites); + } + + /** + * Fonction helper pour collecter les marchandises depuis le formulaire. + * + * @param {string} typeActivite - Type d'activité + * @returns {string} JSON array des marchandises cochées + * @private + */ + function collectMarchandisesJSON(typeActivite) { + let name; + switch(typeActivite.toLowerCase()) { + case 'voiturier': + name = 'marVoiturier/Loueur'; + break; + case 'commissionnaire': + name = 'marCommissionnaire de Transport'; + break; + case 'demenageur': + name = 'marDéménageur'; + break; + case 'logistique': + name = 'marLogistique'; + break; + case 'autocariste': + name = 'marAutocariste'; + break; + case 'autres': + name = 'marAutres activites'; + break; + default: + return JSON.stringify([]); + } + + const checkboxes = document.querySelectorAll(`[name="${name}"] input[type="checkbox"]:checked`); + const marchandises = []; + checkboxes.forEach(cb => { + const text = cb.nextElementSibling ? cb.nextElementSibling.textContent.trim() : cb.value; + marchandises.push(text); + }); + return JSON.stringify(marchandises); + } + + // ═══════════════════════════════════════════════════════════════════════ + // PRÉ-REMPLISSAGE TARIF → PROJET + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Pré-remplit le formulaire Projet avec les données du Tarif. + * Cette fonction est appelée quand l'utilisateur passe du Tarif au Projet. + * + * @param {Object} tarifData - Données complètes du tarif (de collectAllTarifData) + * + * @example + * const tarifData = collectAllTarifData(); + * prefillProjetFromTarif(tarifData); + */ + function prefillProjetFromTarif(tarifData) { + if (!tarifData) { + console.warn('Pas de données tarif à pré-remplir'); + return; + } + + console.log('📝 Pré-remplissage Projet depuis Tarif...'); + + try { + // ═══ INFORMATIONS GÉNÉRALES ═══ + + // CA + if (tarifData.ca) { + setValue('CA', tarifData.ca); + console.log(' ✓ CA:', tarifData.ca); + } + + // Type de cotisation + if (tarifData.typeCotisation) { + const radio = document.querySelector(`input[name="typeCot"][value="${tarifData.typeCotisation}"]`); + if (radio) { + radio.checked = true; + console.log(' ✓ Type cotisation:', tarifData.typeCotisation); + } + } + + // Nombre de véhicules + if (tarifData.nombreVehicules) { + setValue('nombreVehicules', tarifData.nombreVehicules); + console.log(' ✓ Véhicules:', tarifData.nombreVehicules); + } + + // ═══ ACTIVITÉS ═══ + + const activitySelector = document.getElementById('activity-selector'); + if (activitySelector && tarifData.activites) { + const activitesToAdd = []; + + if (tarifData.activites.voiturier?.checked) { + activitesToAdd.push('Voiturier/Loueur'); + } + if (tarifData.activites.commissionnaire?.checked) { + activitesToAdd.push('Commissionnaire de Transport'); + } + if (tarifData.activites.demenageur?.checked) { + activitesToAdd.push('Déménageur d\'entreprises'); + } + if (tarifData.activites.logistique?.checked) { + activitesToAdd.push('Prestataire logistique'); + } + if (tarifData.activites.autocariste?.checked) { + activitesToAdd.push('Autocariste'); + } + if (tarifData.activites.autres?.checked) { + activitesToAdd.push('Autres activités'); + } + + // Sélectionner les options dans le select + Array.from(activitySelector.options).forEach(option => { + if (activitesToAdd.includes(option.value)) { + option.selected = true; + } + }); + + // Trigger change pour créer les chips Materialize + const event = new Event('change', { bubbles: true }); + activitySelector.dispatchEvent(event); + + console.log(' ✓ Activités:', activitesToAdd.length); + } + + // ═══ MARCHANDISES ═══ + + const marchandiseSelector = document.getElementById('marchandise-selector'); + if (marchandiseSelector && tarifData.marchandises) { + const marchandisesToSelect = []; + + // Parser les marchandises de chaque type + ['voiturier', 'commissionnaire', 'demenageur', 'logistique', 'autocariste', 'autres'].forEach(type => { + const marchArray = tarifData.marchandises[type]; + if (Array.isArray(marchArray)) { + marchArray.forEach(m => marchandisesToSelect.push(m)); + } + }); + + // Sélectionner dans le select + Array.from(marchandiseSelector.options).forEach(option => { + if (marchandisesToSelect.includes(option.text) || marchandisesToSelect.includes(option.value)) { + option.selected = true; + } + }); + + const event = new Event('change', { bubbles: true }); + marchandiseSelector.dispatchEvent(event); + + console.log(' ✓ Marchandises:', marchandisesToSelect.length); + } + + // ═══ ZONES GÉOGRAPHIQUES ═══ + + if (tarifData.zones) { + let zonesCount = 0; + Object.keys(tarifData.zones).forEach(zoneKey => { + const checkbox = document.getElementById(zoneKey); + if (checkbox && tarifData.zones[zoneKey]) { + checkbox.checked = true; + zonesCount++; + } + }); + console.log(' ✓ Zones:', zonesCount); + } + + // ═══ PROTECTION JURIDIQUE ═══ + + if (tarifData.garantiesAdditionnelles?.pj) { + const switchPJ = document.getElementById('switchPJ'); + if (switchPJ) { + switchPJ.checked = true; + console.log(' ✓ PJ activée'); + + // Afficher la section PJ + const pjSection = document.getElementById('pj-section'); + if (pjSection) pjSection.style.display = 'block'; + } + } + + // ═══ RCE ═══ + + if (tarifData.rce?.checked) { + const choixRCE = document.getElementById('choixRCE'); + if (choixRCE) { + choixRCE.checked = true; + console.log(' ✓ RCE activée'); + + // Afficher la section RCE + const rceSection = document.getElementById('section-rce'); + if (rceSection) rceSection.style.display = 'block'; + } + } + + // ═══ TPPC ═══ + + if (tarifData.garantiesAdditionnelles?.tppc?.checked) { + const checkTPPC = document.getElementById('checkTPPC'); + if (checkTPPC) { + checkTPPC.checked = true; + + if (tarifData.garantiesAdditionnelles.tppc.capital) { + setValue('capitalTPPC', tarifData.garantiesAdditionnelles.tppc.capital); + } + if (tarifData.garantiesAdditionnelles.tppc.vehicules) { + setValue('vehiculesTPPC', tarifData.garantiesAdditionnelles.tppc.vehicules); + } + + console.log(' ✓ TPPC'); + } + } + + // ═══ ENGAGEMENTS COMPLÉMENTAIRES ═══ + + const engagements = tarifData.engagementsComplementaires; + if (engagements) { + if (engagements.domicileImmatriculation?.checked) { + setValue('checkDomImmat', true); + console.log(' ✓ Domicile immatriculation'); + } + if (engagements.contenantConfie?.checked) { + setValue('checkContConf', true); + console.log(' ✓ Contenant confié'); + } + } + + // ═══ SINISTRALITÉ ═══ + + if (tarifData.sinistralite) { + if (tarifData.sinistralite.nombre3ans) { + setValue('nbSinistres3ans', tarifData.sinistralite.nombre3ans); + } + if (tarifData.sinistralite.montant3ans) { + setValue('montantSinistres3ans', tarifData.sinistralite.montant3ans); + } + console.log(' ✓ Sinistralité'); + } + + // ═══ RÉSULTATS TARIFAIRES ═══ + + if (tarifData.resultats) { + const res = tarifData.resultats; + + // Taux + if (res.tauxRCCHT) setValue('tauxRCCHT', res.tauxRCCHT); + if (res.tauxRCCTTC) setValue('tauxRCCTTC', res.tauxRCCTTC); + if (res.tauxRCEHT) setValue('tauxRCEHT', res.tauxRCEHT); + if (res.tauxRCETTC) setValue('tauxRCETTC', res.tauxRCETTC); + if (res.tauxTotalHT) setValue('tauxTotalHT', res.tauxTotalHT); + if (res.tauxTotalTTC) setValue('tauxTotalTTC', res.tauxTotalTTC); + + // Cotisations + if (res.cotRCCHT) setValue('cotRCCHT', res.cotRCCHT); + if (res.cotRCCTTC) setValue('cotRCCTTC', res.cotRCCTTC); + if (res.cotRCEHT) setValue('cotRCEHT', res.cotRCEHT); + if (res.cotRCETTC) setValue('cotRCETTC', res.cotRCETTC); + if (res.cotPJHT) setValue('cotPJHT', res.cotPJHT); + if (res.cotPJTTC) setValue('cotPJTTC', res.cotPJTTC); + if (res.cotTotalHT) setValue('cotTotalHT', res.cotTotalHT); + if (res.cotTotalTTC) setValue('cotTotalTTC', res.cotTotalTTC); + + console.log(' ✓ Résultats tarifaires'); + } + + // Forcer la mise à jour des éléments Materialize + if (window.M && window.M.FormSelect) { + const selects = document.querySelectorAll('select'); + window.M.FormSelect.init(selects); + } + if (window.M && window.M.updateTextFields) { + window.M.updateTextFields(); + } + + console.log('✅ Pré-remplissage Projet terminé'); + + } catch (error) { + console.error('❌ Erreur lors du pré-remplissage Projet:', error); + } + } + + // ═══════════════════════════════════════════════════════════════════════ + // PRÉ-REMPLISSAGE PROJET → TARIF + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Pré-remplit le formulaire Tarif avec les données du Projet. + * Cette fonction est appelée quand l'utilisateur passe du Projet au Tarif. + * + * @param {Object} projetData - Données complètes du projet + * + * @example + * prefillTarifFromProjet(projetData); + */ + function prefillTarifFromProjet(projetData) { + if (!projetData) { + console.warn('Pas de données projet à pré-remplir'); + return; + } + + console.log('📝 Pré-remplissage Tarif depuis Projet...'); + + try { + // CA + if (projetData.ca) { + setValue('CA', projetData.ca); + } + + // Type de cotisation + if (projetData.typeCot) { + const radio = document.querySelector(`input[name="cotisation"][value="${projetData.typeCot}"]`); + if (radio) radio.checked = true; + } + + // Zones géographiques + ['zone1', 'zone2', 'zone3', 'zone4', 'zone5', 'zone6'].forEach(zone => { + if (projetData[zone]) { + setValue(zone, true); + } + }); + + // PJ + if (projetData.pj) { + setValue('checkPJ', true); + } + + // RCE + if (projetData.autresRC) { + setValue('checkRCE', true); + } + + console.log('✅ Pré-remplissage Tarif terminé'); + + } catch (error) { + console.error('❌ Erreur lors du pré-remplissage Tarif:', error); + } + } + + // ═══════════════════════════════════════════════════════════════════════ + // EXPORT PUBLIC + // ═══════════════════════════════════════════════════════════════════════ + + window.RCDataManager = { + collectAllTarifData, + prefillProjetFromTarif, + prefillTarifFromProjet, + FIELD_MAPPING + }; + + console.log('✅ RC Data Manager loaded'); + +})(window); diff --git a/ecole/public/js/rc-orchestrator.js b/ecole/public/js/rc-orchestrator.js new file mode 100644 index 00000000..43d54242 --- /dev/null +++ b/ecole/public/js/rc-orchestrator.js @@ -0,0 +1,388 @@ +/** + * ═══════════════════════════════════════════════════════════════════════════ + * RC SYNC ORCHESTRATOR + * ═══════════════════════════════════════════════════════════════════════════ + * + * Ce module orchestre la synchronisation entre Tarif RC et Projet RC. + * Il s'intègre avec les formulaires existants sans les modifier. + * + * @requires rc-sync-utils.js + * @requires rc-data-manager.js + * @author AXA Transport Team + * @version 2.0.0 + * @since 2026-02-17 + */ + +(function(window) { + 'use strict'; + + // Attendre que les dépendances soient chargées + if (!window.RCSync || !window.RCDataManager) { + console.error('❌ Dépendances RC Sync manquantes'); + return; + } + + const { isChangeImpactingTarif, showReturnToTarifModal } = window.RCSync; + const { collectAllTarifData, prefillProjetFromTarif, prefillTarifFromProjet } = window.RCDataManager; + + // ═══════════════════════════════════════════════════════════════════════ + // CONFIGURATION + // ═══════════════════════════════════════════════════════════════════════ + + const SESSION_STORAGE_KEYS = { + TARIF_DATA: 'rc_tarif_validated_data', + PROJET_DATA: 'rc_projet_data', + TARIF_ORIGINAL: 'rc_tarif_original_for_comparison' + }; + + // ═══════════════════════════════════════════════════════════════════════ + // DÉTECTION DE LA PAGE ACTIVE + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Détecte la page active (tarif ou projet) depuis l'URL. + * + * @returns {'tarif'|'projet'|null} Page active ou null + */ + function detectActivePage() { + const params = new URLSearchParams(window.location.search); + const submenu = params.get('submenu'); + + if (submenu === 'tarif' || submenu === 'tarifrc') { + return 'tarif'; + } else if (submenu === 'projet' || submenu === 'projetrc') { + return 'projet'; + } + + return null; + } + + // ═══════════════════════════════════════════════════════════════════════ + // GESTION SESSIONSTORAGE + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Sauvegarde les données du tarif validé dans sessionStorage. + * + * @param {Object} tarifData - Données complètes du tarif + */ + function saveTarifDataToSession(tarifData) { + try { + sessionStorage.setItem(SESSION_STORAGE_KEYS.TARIF_DATA, JSON.stringify(tarifData)); + sessionStorage.setItem(SESSION_STORAGE_KEYS.TARIF_ORIGINAL, JSON.stringify(tarifData)); + console.log('✅ Données tarif sauvegardées en session'); + } catch (error) { + console.error('❌ Erreur sauvegarde session:', error); + } + } + + /** + * Récupère les données du tarif depuis sessionStorage. + * + * @returns {Object|null} Données du tarif ou null + */ + function getTarifDataFromSession() { + try { + const data = sessionStorage.getItem(SESSION_STORAGE_KEYS.TARIF_DATA); + return data ? JSON.parse(data) : null; + } catch (error) { + console.error('❌ Erreur lecture session:', error); + return null; + } + } + + /** + * Récupère les données originales du tarif pour comparaison. + * + * @returns {Object|null} Données originales du tarif + */ + function getTarifOriginalDataFromSession() { + try { + const data = sessionStorage.getItem(SESSION_STORAGE_KEYS.TARIF_ORIGINAL); + return data ? JSON.parse(data) : null; + } catch (error) { + return null; + } + } + + // ═══════════════════════════════════════════════════════════════════════ + // HOOK: APRÈS VALIDATION TARIF + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Hook appelé après la validation du tarif commercial. + * Collecte toutes les données et les sauvegarde en session. + * + * Cette fonction doit être appelée juste avant la redirection vers le projet. + */ + function onTarifValidated() { + console.log('🎯 Hook: Tarif validé, collecte des données...'); + + try { + // Collecter toutes les données du tarif + const tarifData = collectAllTarifData(); + + // Sauvegarder en session pour le pré-remplissage projet + saveTarifDataToSession(tarifData); + + console.log('✅ Données tarif prêtes pour le projet'); + } catch (error) { + console.error('❌ Erreur hook tarif validé:', error); + } + } + + // ═══════════════════════════════════════════════════════════════════════ + // INITIALISATION PAGE PROJET + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Initialise le formulaire projet au chargement. + * Configure UNIQUEMENT la détection des changements impactants. + * Le pré-remplissage est géré par prefillFromTarif() existant dans projet-form-RC.js + */ + function initProjetPage() { + console.log('🚀 Initialisation RC Orchestrator pour page Projet...'); + + // Les données rc/tarif/projet sont DÉJÀ chargées depuis la base + // par le code existant dans projet-form-RC.js + // On configure juste la détection des changements + + setTimeout(() => { + setupProjetChangeDetection(); + }, 1000); // Attendre que prefillFromTarif() ait fini + } + + /** + * Configure la détection des changements impactants dans le projet. + * Affiche un modal si l'utilisateur modifie un champ qui impacte le tarif. + * Utilise les variables globales rc/tarif depuis projet-form-RC.js + */ + function setupProjetChangeDetection() { + // Les données originales sont dans les variables globales window.tarif et window.rc + // définies par projet-form-RC.js + const tarifOriginal = window.tarif; + const rcOriginal = window.rc; + + if (!tarifOriginal && !rcOriginal) { + console.log('ℹ️ Pas de tarif/rc, pas de détection'); + return; + } + + console.log('👁️ Configuration détection changements...'); + console.log('📋 Données originales:', { tarif: tarifOriginal, rc: rcOriginal }); + + // Liste COMPLÈTE des éléments à surveiller (tous les champs impactants) + const elementsToWatch = [ + // CA et infos générales + 'CA', 'chiffreAffaire', 'nombreVehicules', 'nbrVehicule', + + // Zones géographiques + 'zone1', 'zone2', 'zone3', 'zone4', 'zone5', 'zone6', + + // Protection Juridique + 'switchPJ', 'checkPJ', + + // RCE + 'choixRCE', 'checkRCE', + + // TPPC + 'checkTPPC', 'capitalTPPC', 'vehiculesTPPC', + + // Engagements complémentaires + 'checkDomImmat', 'checkContConf', 'checkDiffInv', + + // Garanties additionnelles + 'checkStationLavage', 'checkGarageInterne', 'checkCSE', + + // Sinistralité + 'nbSinistres3ans', 'montantSinistres3ans', + + // Autres + 'programmeInternationale', 'participationResultat' + ]; + + // Ajouter des listeners sur tous les éléments surveillés + elementsToWatch.forEach(elementId => { + const element = document.getElementById(elementId); + if (!element) return; + + const eventType = element.type === 'checkbox' ? 'change' : 'blur'; + + element.addEventListener(eventType, function(e) { + const fieldName = this.id; + const newValue = this.type === 'checkbox' ? this.checked : this.value; + + console.log(`🔍 Changement détecté: ${fieldName} = ${newValue}`); + + // Vérifier si c'est un champ impactant + if (isFieldImpactingTarif(fieldName)) { + console.warn(`⚠️ "${fieldName}" impacte le tarif !`); + showReturnToTarifModal(fieldName); + } else { + console.log(`ℹ️ "${fieldName}" n'impacte pas le tarif`); + } + }); + }); + + // Surveiller les radio buttons (type de cotisation) + const radioTypeCot = document.querySelectorAll('input[name="typeCot"]'); + radioTypeCot.forEach(radio => { + radio.addEventListener('change', function() { + console.log(`🔍 Changement type cotisation: ${this.value}`); + console.warn(`⚠️ Type de cotisation impacte le tarif !`); + showReturnToTarifModal('Type de cotisation'); + }); + }); + + // Surveiller le select activités + const activitySelector = document.getElementById('activity-selector'); + if (activitySelector) { + activitySelector.addEventListener('change', function() { + const selectedValues = Array.from(this.selectedOptions).map(opt => opt.value); + console.log(`🔍 Changement activités:`, selectedValues); + console.warn(`⚠️ Activités impactent le tarif !`); + showReturnToTarifModal('Activités'); + }); + } + + // Surveiller le select marchandises + const marchandiseSelector = document.getElementById('marchandise-selector'); + if (marchandiseSelector) { + marchandiseSelector.addEventListener('change', function() { + const selectedValues = Array.from(this.selectedOptions).map(opt => opt.value); + console.log(`🔍 Changement marchandises:`, selectedValues); + console.warn(`⚠️ Marchandises impactent le tarif !`); + showReturnToTarifModal('Marchandises'); + }); + } + + // Surveiller les boutons d'action sur les zones (Monde entier / Reset) + ['btnMondeEntier', 'btnReset'].forEach(btnId => { + const btn = document.getElementById(btnId); + if (!btn) return; + btn.addEventListener('click', () => { + console.log(`🔍 Changement zones via ${btnId}`); + console.warn('⚠️ Zones géographiques impactent le tarif !'); + showReturnToTarifModal('Zones géographiques'); + }); + }); + + console.log('✅ Détection changements configurée sur tous les champs impactants'); + } + + // ═══════════════════════════════════════════════════════════════════════ + // INITIALISATION PAGE TARIF + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Initialise le formulaire tarif au chargement. + * Pré-remplit depuis le projet si l'utilisateur vient du projet. + */ + function initTarifPage() { + console.log('🚀 Initialisation page Tarif...'); + + // Vérifier si on vient du projet + const projetData = JSON.parse(sessionStorage.getItem(SESSION_STORAGE_KEYS.PROJET_DATA) || 'null'); + + if (projetData && !getTarifDataFromSession()) { + // On a des données projet mais pas de tarif validé + // = L'utilisateur a commencé par le projet + console.log('📥 Pré-remplissage depuis projet...'); + + setTimeout(() => { + prefillTarifFromProjet(projetData); + }, 500); + } + } + + // ═══════════════════════════════════════════════════════════════════════ + // INTERCEPTION DES FONCTIONS EXISTANTES + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Intercepte la fonction de validation du tarif commercial existante. + * Ajoute notre hook avant la redirection. + */ + function interceptTarifValidation() { + // Attendre que la fonction window.saveTarifRC soit disponible + const checkInterval = setInterval(() => { + if (window.saveTarifRC) { + clearInterval(checkInterval); + + // Sauvegarder la fonction originale + const originalSaveTarifRC = window.saveTarifRC; + + // Remplacer par notre version wrappée + window.saveTarifRC = async function(...args) { + console.log('🎯 Interception saveTarifRC...'); + + // Appeler la fonction originale + const result = await originalSaveTarifRC.apply(this, args); + + // Si succès, appeler notre hook + if (result && result.valid) { + onTarifValidated(); + } + + return result; + }; + + console.log('✅ saveTarifRC intercepté'); + } + }, 100); + + // Timeout après 5 secondes + setTimeout(() => clearInterval(checkInterval), 5000); + } + + // ═══════════════════════════════════════════════════════════════════════ + // DÉMARRAGE AUTOMATIQUE + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Initialise l'orchestrateur au chargement de la page. + */ + function init() { + console.log('🎼 RC Sync Orchestrator: Démarrage...'); + + const activePage = detectActivePage(); + console.log(`📄 Page active détectée: ${activePage || 'aucune'}`); + + if (activePage === 'tarif') { + interceptTarifValidation(); + + // Attendre que le formulaire soit initialisé + setTimeout(() => { + initTarifPage(); + }, 1000); + + } else if (activePage === 'projet') { + // Attendre que le formulaire soit initialisé + setTimeout(() => { + initProjetPage(); + }, 1000); + } + } + + // Démarrage au chargement du DOM + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } + + // ═══════════════════════════════════════════════════════════════════════ + // EXPORT PUBLIC + // ═══════════════════════════════════════════════════════════════════════ + + window.RCOrchestrator = { + onTarifValidated, + initProjetPage, + initTarifPage, + saveTarifDataToSession, + getTarifDataFromSession + }; + + console.log('✅ RC Sync Orchestrator loaded'); + +})(window); diff --git a/ecole/public/js/rc-sync-utils.js b/ecole/public/js/rc-sync-utils.js new file mode 100644 index 00000000..0939ba32 --- /dev/null +++ b/ecole/public/js/rc-sync-utils.js @@ -0,0 +1,464 @@ +/** + * ═══════════════════════════════════════════════════════════════════════════ + * RC SYNCHRONIZATION UTILITIES + * ═══════════════════════════════════════════════════════════════════════════ + * + * Ce module contient toutes les fonctions utilitaires pour la synchronisation + * bidirectionnelle entre les formulaires Tarif RC et Projet RC. + * + * @author AXA Transport Team + * @version 2.0.0 + * @since 2026-02-17 + */ + +(function(window) { + 'use strict'; + + // ═══════════════════════════════════════════════════════════════════════ + // CONSTANTES + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Liste exhaustive des champs qui impactent le calcul du tarif. + * Si l'un de ces champs est modifié dans le projet, un modal + * demandera à l'utilisateur de retourner au tarif. + * + * @constant {Array} + */ + const TARIF_IMPACTING_FIELDS = [ + // Chiffre d'affaires et type de contrat + 'ca', 'chiffreAffaires', 'CA', + 'typeCotisation', 'cotisation', + 'nombreVehicules', 'nbVehicules', + + // Activités RCC + 'checkVoiturier', 'capitalVoiturier', 'actVoiturier', + 'checkCommissionnaire', 'capitalCommissionnaire', 'actMultimodal', + 'checkDemenageur', 'capitalDemenageur', + 'checkLogistique', 'capitalLogistique', + 'checkAutocariste', 'capitalAutocariste', + 'checkAutres', 'capitalAutres', + + // RCE + 'checkRCE', 'autresRC', + + // Activités complémentaires + 'actComplVoiturier', 'actComplCommissionnaire', 'actComplDemenageur', 'actComplLogistique', + 'activitesVoiturier', 'activitesCommissionnaire', 'activitesDemenageur', 'activitesLogistique', + + // Marchandises + 'marchandisesVoiturier', 'marchandisesCommissionnaire', 'marchandisesDemenageur', + 'marchandisesLogistique', 'marchandisesAutocariste', 'marchandisesAutres', + 'marOrdinaire', 'marRoulant', 'marEngins', 'marRoulantDem', 'marMobilerUsag', + 'marPerissable', 'marAnimaux', 'marCiterne', 'marBeton', 'marExceptionnels', 'marVrac', + + // Zones géographiques + 'zone1', 'zone2', 'zone3', 'zone4', 'zone5', 'zone6', + + // Extensions de garantie RCC + 'extRCCModifCalArrim', 'extRCCFerroutage', 'extRCCFraisRecons', + 'extRCCConfie', 'typeExtConfies', 'extRCCTPPC', 'extRCCRegie', 'extRCCSansMontageDemontage', + 'checkDomImmat', 'capitalDomImmat', 'checkContConf', 'capitalContConf', + 'checkDiffInv', 'capitalDiffInv', 'checkTPPC', 'capitalTPPC', 'vehiculesTPPC', + + // Extensions de garantie RCE + 'extRCEBraDebra', 'extRCEMontageDemontage', + + // Garanties additionnelles + 'checkStationLavage', 'checkGarageInterne', 'checkCSE', 'checkPJ', 'pj', + + // Sinistralité + 'sinistre', 'nbSinistres3ans', 'montantSinistres3ans' + ]; + + // ═══════════════════════════════════════════════════════════════════════ + // HELPERS - MANIPULATION DE VALEURS + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Convertit une valeur en nombre en gérant les formats français et internationaux. + * Gère les espaces, virgules, points, et valeurs nulles/undefined. + * + * @param {string|number|null|undefined} x - Valeur à convertir + * @returns {number} Nombre converti ou 0 si impossible + * + * @example + * toNumber("1 234,56") // 1234.56 + * toNumber("1.234,56") // 1234.56 + * toNumber("1,234.56") // 1234.56 + * toNumber(null) // 0 + */ + function toNumber(x) { + if (x == null) return 0; + + let value = String(x).trim(); + if (!value) return 0; + + value = value + .replace(/\s/g, '') + .replace(/[^\d.,-]/g, ''); + + if (!value) return 0; + + const isNegative = value.startsWith('-'); + value = value.replace(/-/g, ''); + if (isNegative && value) { + value = '-' + value; + } + + const hasComma = value.includes(','); + const hasDot = value.includes('.'); + + if (hasComma) { + value = value.replace(/\./g, '').replace(/,/g, '.'); + } else if (hasDot) { + const dotMatches = value.match(/\./g); + const dotCount = dotMatches ? dotMatches.length : 0; + if (dotCount > 1) { + const parts = value.split('.'); + const lastSegment = parts[parts.length - 1]; + if (lastSegment.length === 3) { + value = parts.join(''); + } else { + value = parts.slice(0, -1).join('') + '.' + lastSegment; + } + } + } + + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : 0; + } + + /** + * Récupère la valeur d'un élément par son ID de manière flexible. + * Gère les différents types d'éléments (input, select, textarea, etc.) + * et les cas où l'ID contient des caractères spéciaux. + * + * @param {string} id - ID de l'élément + * @returns {HTMLElement|null} Élément trouvé ou null + * + * @example + * const element = getElementByIdFlexible("my-element"); + */ + function getElementByIdFlexible(id) { + if (!id) return null; + const direct = document.getElementById(id); + if (direct) return direct; + try { + return document.querySelector(`[id="${id.replace(/"/g, '\\"')}"]`); + } catch (err) { + return null; + } + } + + /** + * Récupère la valeur d'un champ de formulaire de manière sécurisée. + * Gère les inputs, selects, textareas, checkboxes, et contenus textuels. + * + * @param {string} elementId - ID de l'élément + * @returns {string|number|boolean|null} Valeur du champ + * + * @example + * getValue("ca") // "100000" + * getValue("checkPJ") // true + */ + function getValue(elementId) { + const element = getElementByIdFlexible(elementId); + if (!element) return null; + + if (element.type === 'checkbox') { + return element.checked; + } else if (element.type === 'radio') { + const checked = document.querySelector(`input[name="${element.name}"]:checked`); + return checked ? checked.value : null; + } else if (element.tagName === 'SELECT') { + return element.value; + } else if (element.value !== undefined) { + return element.value; + } else { + return element.textContent || element.innerText || null; + } + } + + /** + * Définit la valeur d'un champ de formulaire. + * Gère automatiquement le type de champ et met à jour l'interface. + * + * @param {string} elementId - ID de l'élément + * @param {any} value - Valeur à définir + * + * @example + * setValue("ca", 100000); + * setValue("checkPJ", true); + */ + function setValue(elementId, value) { + const element = getElementByIdFlexible(elementId); + if (!element) { + console.warn(`Élément non trouvé: ${elementId}`); + return; + } + + if (element.type === 'checkbox') { + element.checked = Boolean(value); + } else if (element.type === 'radio') { + const radio = document.querySelector(`input[name="${element.name}"][value="${value}"]`); + if (radio) radio.checked = true; + } else if (element.tagName === 'SELECT') { + element.value = value; + // Réinitialiser Materialize select si présent + if (window.M && window.M.FormSelect) { + const instance = window.M.FormSelect.getInstance(element); + if (instance) instance.destroy(); + window.M.FormSelect.init(element); + } + } else if (element.value !== undefined) { + element.value = value; + } else { + element.textContent = value; + } + } + + // ═══════════════════════════════════════════════════════════════════════ + // COMPARAISON DE DONNÉES + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Compare deux tableaux pour vérifier leur égalité. + * Effectue une comparaison profonde élément par élément. + * + * @param {Array} arr1 - Premier tableau + * @param {Array} arr2 - Deuxième tableau + * @returns {boolean} true si les tableaux sont égaux + * + * @example + * arraysEqual([1,2,3], [1,2,3]) // true + * arraysEqual([1,2], [1,2,3]) // false + */ + function arraysEqual(arr1, arr2) { + if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false; + if (arr1.length !== arr2.length) return false; + + const sorted1 = [...arr1].sort(); + const sorted2 = [...arr2].sort(); + + return sorted1.every((val, idx) => val === sorted2[idx]); + } + + /** + * Compare deux valeurs en tenant compte de leur type. + * Gère les tableaux, objets, null, undefined, et valeurs primitives. + * + * @param {any} value1 - Première valeur + * @param {any} value2 - Deuxième valeur + * @returns {boolean} true si les valeurs sont égales + * + * @example + * valuesEqual([1,2], [2,1]) // true (ordre indépendant) + * valuesEqual(null, undefined) // true + * valuesEqual(100, "100") // true (conversion automatique) + */ + function valuesEqual(value1, value2) { + // Normaliser null et undefined + if (value1 == null && value2 == null) return true; + if (value1 == null || value2 == null) return false; + + // Comparer les tableaux + if (Array.isArray(value1) && Array.isArray(value2)) { + return arraysEqual(value1, value2); + } + + // Comparer les objets + if (typeof value1 === 'object' && typeof value2 === 'object') { + return JSON.stringify(value1) === JSON.stringify(value2); + } + + // Comparer les nombres (avec conversion) + if (!isNaN(value1) && !isNaN(value2)) { + return toNumber(value1) === toNumber(value2); + } + + // Comparaison standard + return value1 === value2; + } + + // ═══════════════════════════════════════════════════════════════════════ + // DÉTECTION DE CHANGEMENTS IMPACTANTS + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Vérifie si un champ donné impacte le calcul du tarif. + * Se base sur la liste TARIF_IMPACTING_FIELDS. + * + * @param {string} fieldName - Nom du champ + * @returns {boolean} true si le champ impacte le tarif + * + * @example + * isFieldImpactingTarif("ca") // true + * isFieldImpactingTarif("dateEffet") // false + */ + function isFieldImpactingTarif(fieldName) { + return TARIF_IMPACTING_FIELDS.some(field => + fieldName.includes(field) || field.includes(fieldName) + ); + } + + /** + * Vérifie si un changement de valeur impacte le tarif. + * Compare la nouvelle valeur avec les données originales du tarif. + * + * @param {string} fieldName - Nom du champ modifié + * @param {any} newValue - Nouvelle valeur + * @param {Object} tarifOriginalData - Données originales du tarif + * @returns {boolean} true si le changement impacte le tarif + * + * @example + * const impacted = isChangeImpactingTarif("ca", 200000, tarifData); + * if (impacted) showReturnToTarifModal(); + */ + function isChangeImpactingTarif(fieldName, newValue, tarifOriginalData) { + // Vérifier si le champ est dans la liste des champs impactants + if (!isFieldImpactingTarif(fieldName)) { + return false; + } + + // Si pas de données originales, pas d'impact possible + if (!tarifOriginalData) { + return false; + } + + // Récupérer la valeur originale + const originalValue = tarifOriginalData[fieldName]; + + // Comparer les valeurs + return !valuesEqual(newValue, originalValue); + } + + // ═══════════════════════════════════════════════════════════════════════ + // MODAL DE RETOUR AU TARIF + // ═══════════════════════════════════════════════════════════════════════ + + /** + * Affiche le modal demandant à l'utilisateur de retourner au tarif. + * Ce modal s'affiche quand une modification dans le projet impacte + * le calcul du tarif. + * + * @param {string} [fieldName] - Nom du champ modifié (optionnel, pour info) + * + * @example + * showReturnToTarifModal("ca"); + */ + function showReturnToTarifModal(fieldName) { + const modalId = 'modalRetourTarif'; + let modal = document.getElementById(modalId); + + // Créer le modal s'il n'existe pas + if (!modal) { + modal = createReturnToTarifModal(); + document.body.appendChild(modal); + } + + // Mettre à jour le message si un champ est spécifié + if (fieldName) { + const messageEl = modal.querySelector('#modalRetourTarifMessage'); + if (messageEl) { + messageEl.innerHTML = ` + Vous avez modifié "${fieldName}" qui impacte le calcul du tarif. +

+ Vous devez retourner sur le formulaire Tarif pour recalculer et valider le nouveau tarif. + `; + } + } + + // Ouvrir le modal + if (window.M && window.M.Modal) { + const instance = window.M.Modal.getInstance(modal) || window.M.Modal.init(modal); + instance.open(); + } + } + + /** + * Crée l'élément DOM du modal de retour au tarif. + * + * @returns {HTMLElement} Élément modal créé + * @private + */ + function createReturnToTarifModal() { + const modal = document.createElement('div'); + modal.id = 'modalRetourTarif'; + modal.className = 'modal'; + + modal.innerHTML = ` + + + `; + + return modal; + } + + /** + * Navigate vers l'onglet Tarif depuis le Projet. + * + * @example + * navigateToTarif(); + */ + function navigateToTarif() { + // Fermer le modal + const modal = document.getElementById('modalRetourTarif'); + if (modal && window.M) { + const instance = window.M.Modal.getInstance(modal); + if (instance) instance.close(); + } + + // Naviguer vers le tarif + const numParcours = new URLSearchParams(window.location.search).get('numParcours'); + if (numParcours) { + window.location.href = `/navParcours?numParcours=${numParcours}&submenu=tarif`; + } + } + + // ═══════════════════════════════════════════════════════════════════════ + // EXPORT PUBLIC + // ═══════════════════════════════════════════════════════════════════════ + + /** + * API publique du module RC Sync. + * Toutes les fonctions exportées ici sont accessibles via window.RCSync. + */ + window.RCSync = { + // Helpers + toNumber, + getValue, + setValue, + getElementByIdFlexible, + + // Comparaison + arraysEqual, + valuesEqual, + + // Détection changements + isFieldImpactingTarif, + isChangeImpactingTarif, + + // Modal + showReturnToTarifModal, + navigateToTarif, + + // Constantes + TARIF_IMPACTING_FIELDS + }; + + console.log('✅ RC Sync Utils loaded'); + +})(window); diff --git a/ecole/public/js/tarif-form-rc.js b/ecole/public/js/tarif-form-rc.js new file mode 100644 index 00000000..aa29160e --- /dev/null +++ b/ecole/public/js/tarif-form-rc.js @@ -0,0 +1,3376 @@ +function initSubmenuForm() { + // Accéder aux informations stockées du parcours + const parcours = JSON.parse(sessionStorage.getItem('parcours')); +} + +function toNumber(x) { + if (x == null) return 0; + + let value = String(x).trim(); + if (!value) return 0; + + value = value + .replace(/\s/g, '') + .replace(/[^\d.,-]/g, ''); + + if (!value) return 0; + + const isNegative = value.startsWith('-'); + value = value.replace(/-/g, ''); + if (isNegative && value) { + value = '-' + value; + } + + const hasComma = value.includes(','); + const hasDot = value.includes('.'); + + if (hasComma) { + value = value.replace(/\./g, '').replace(/,/g, '.'); + } else if (hasDot) { + const dotMatches = value.match(/\./g); + const dotCount = dotMatches ? dotMatches.length : 0; + if (dotCount > 1) { + const parts = value.split('.'); + const lastSegment = parts[parts.length - 1]; + if (lastSegment.length === 3) { + value = parts.join(''); + } else { + value = parts.slice(0, -1).join('') + '.' + lastSegment; + } + } + } + + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : 0; +} + +// Fonction pour formater un nombre avec X décimales max (sans décimales si entier) +function formatNumber(num, decimals = 2) { + if (!num || isNaN(num)) return '0.' + '0'.repeat(decimals); + const factor = Math.pow(10, decimals); + const rounded = Math.round(num * factor) / factor; + // Si c'est un nombre entier, ne pas afficher les décimales + if (Number.isInteger(rounded)) { + return rounded.toString(); + } + return rounded.toFixed(decimals); +} + +function getElementByIdFlexible(id) { + if (!id) return null; + const direct = document.getElementById(id); + if (direct) return direct; + try { + return document.querySelector(`[id="${id.replace(/"/g, '\\"')}"]`); + } catch (err) { + return null; + } +} + +// Exposer initSubmenuForm globalement pour y accéder depuis l'extérieur +window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollution de l'espace global +(function () { + // Variables globales du module + let parcours, contrat, client, intermediaire, rc, projet, tarif; + + //Variables modulos et liste + let modRCCA, modRCActRCC, modRCActRCE, modRCActCompl, modRCMar, modRCZone, modRCEngagCompl, modRCGarAdd, modRCSinistre, modRCFranchise, modRCPrimeMini + + // ═══════════════════════════════════════════════════════════════ + // FONCTIONS HELPERS + // ═══════════════════════════════════════════════════════════════ + + // Fonction helper : trouver la tranche la plus proche + function findClosestTranche(val, tranches) { + if (val <= tranches[0]) return tranches[0]; + if (val >= tranches[tranches.length - 1]) return tranches[tranches.length - 1]; + + for (let i = 0; i < tranches.length - 1; i++) { + if (val >= tranches[i] && val < tranches[i + 1]) { + return tranches[i]; + } + } + return tranches[tranches.length - 1]; + } + + // Fonction pour afficher un avertissement visuel de dépassement % + function showPercentageWarning(excess) { + let warningDiv = document.getElementById('percentageWarning'); + if (!warningDiv) { + warningDiv = document.createElement('div'); + warningDiv.id = 'percentageWarning'; + warningDiv.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + background: #f44336; + color: white; + padding: 15px 25px; + border-radius: 5px; + box-shadow: 0 4px 6px rgba(0,0,0,0.3); + z-index: 9999; + font-weight: bold; + `; + document.body.appendChild(warningDiv); + } + + warningDiv.innerHTML = `Plafonnement à 100% (vous dépassiez de ${excess.toFixed(1)}%)`; + warningDiv.style.display = 'block'; + + setTimeout(() => { + warningDiv.style.display = 'none'; + }, 3000); + } + + // Fonction pour masquer toutes les primes (quand % invalide) + function hideAllPrimes() { + const primeElements = [ + 'primeChapActRCC', 'primeChapActRCE', + 'primeChapActComplRCC', 'primeChapActComplRCE', + 'primeChapMarchRCC', 'primeChapMarchRCE', + 'primeChapZonesRCC', 'primeChapZonesRCE', + 'primeEngValue', 'primeChapGarAddRCC', 'primeChapGarAddRCE', + 'priceFr250', 'priceFr400', 'priceFr2000' + ]; + + primeElements.forEach(id => { + const el = document.getElementById(id); + if (el) { + el.innerHTML = ' % invalide (> 100%)'; + } + }); + } + + // Fonction pour mettre à jour l'indicateur visuel du total des pourcentages + function updatePercentageIndicator(total) { + const indicator = document.getElementById('pourcentageTotal'); + if (!indicator) return; + + const displayTotal = total.toFixed(1); + indicator.textContent = `Total : ${displayTotal}%`; + + if (total > 100) { + indicator.style.background = '#f44336'; + indicator.style.color = 'white'; + indicator.style.border = '3px solid #c62828'; + } else if (total === 100 || Math.abs(total - 100) < 0.1) { + indicator.style.background = '#4caf50'; + indicator.style.color = 'white'; + indicator.style.border = '3px solid #2e7d32'; + } else if (total >= 95) { + indicator.style.background = '#ff9800'; + indicator.style.color = 'white'; + indicator.style.border = '3px solid #ef6c00'; + } else { + indicator.style.background = 'white'; + indicator.style.color = 'darkblue'; + indicator.style.border = '2px solid darkblue'; + } + } + + // ═══════════════════════════════════════════════════════════════ + + // Initialisation du formulaire et des données + function init() { + // Materialize init select + var select = document.querySelectorAll('select'); + M.FormSelect.init(select); + + // Materialize init Modal + var modals = document.querySelectorAll('.modal'); + M.Modal.init(modals); + + // Initialiser les modals spécifiques + window.modalAnimauxVivants = M.Modal.getInstance(document.getElementById('modalAnimauxVivants')); + window.modalTransportBeton = M.Modal.getInstance(document.getElementById('modalTransportBeton')); + window.modalAutocaristeRCE = M.Modal.getInstance(document.getElementById('modalAutocaristeRCE')); + window.modalTarifCom = M.Modal.getInstance(document.getElementById('modalTarifCom')); + + // Accéder aux informations stockées du parcours + parcours = JSON.parse(sessionStorage.getItem('parcours')); + contrat = JSON.parse(sessionStorage.getItem('contrat')); + client = contrat?.["@expand"]?.client || null; + intermediaire = contrat?.["@expand"]?.intermediaire || null; + + // Récupérer les données RC depuis la nouvelle structure (EXACTEMENT comme TPPC) + rc = contrat?.["@expand"]?.enCours || null; // RC principal + projet = rc?.["@expand"]?.projetRC || null; // Données projetRC + tarif = rc?.["@expand"]?.tarifRC || null; // Données tarifRC + + console.log("Initialisation pour formulaire tarif :", parcours); + + constantsJSON().then(() => { + //TODO à virer après les tests + console.log("--- Initialisation modulateur RC ---" + , "\nCA : ", modRCCA + , "\nactRCC : ", modRCActRCC + , "\nactRCE : ", modRCActRCE + , "\nactCompl : ", modRCActCompl + , "\nmar : ", modRCMar + , "\nengagComple : ", modRCEngagCompl + , "\nfranchise : ", modRCFranchise + , "\ngarAdd : ", modRCGarAdd + , "\nprimeMini : ", modRCPrimeMini + , "\nzone : ", modRCZone + , "\nantecedantSinistre: ", modRCSinistre + ); + + // Appel des différentes fonctions d'initialisation + setupEventListeners(); + setupTarifetteButtons(); + populateFormData(); + updatePercentageIndicator(100); // Initialiser à 100% + calcGlobal(); + }) + } + + // Configuration des listeners d'événements + function setupEventListeners() { + // Empêcher la soumission du formulaire avec la touche Enter + const form = document.getElementById('projetForm'); + if (form) { + form.addEventListener('keydown', function(e) { + // Si Enter est pressée et que ce n'est pas sur un bouton submit + if (e.key === 'Enter' && e.target.type !== 'submit' && e.target.tagName !== 'BUTTON') { + // Si c'est un input de pourcentage, on passe au suivant + if (e.target.classList.contains('input-pourcent')) { + e.preventDefault(); + // Déclencher l'événement input pour forcer le calcul + e.target.dispatchEvent(new Event('input', { bubbles: true })); + // Passer au champ suivant + const inputs = Array.from(document.querySelectorAll('.input-pourcent')).filter(inp => inp.offsetParent !== null); + const currentIndex = inputs.indexOf(e.target); + if (currentIndex >= 0 && currentIndex < inputs.length - 1) { + inputs[currentIndex + 1].focus(); + inputs[currentIndex + 1].select(); + } + } else { + // Pour les autres inputs, empêcher le submit mais permettre la navigation + e.preventDefault(); + } + } + }); + } + + document.getElementById('loadHistoriqueBtn').addEventListener('click', function () { + handleLoadHistoriqueBtn(); + }); + + resetInputs(); + + var radioButtonsCot = document.getElementsByName('cotisation'); + for (var i = 0; i < radioButtonsCot.length; i++) { + radioButtonsCot[i].addEventListener('change', function () { + if (this.value == "forfaitaire") { + document.getElementById("rowNbrVehicule").style.display = "block"; + document.getElementById("labelVoiturier").style.display = "block"; + document.getElementById("labelCommissionnaire").style.display = "none"; + document.getElementById("labelDemenageur").style.display = "block"; + document.getElementById("labelLogistique").style.display = "none"; + document.getElementById("labelAutocariste").style.display = "block"; + document.getElementById("labelAutres").style.display = "none"; + + document.getElementById("nbrVehicule").value = null; + + // Lancement du calcul forfaitaire + calcForfaitaire(); + } else if (this.value == "revisable") { + document.getElementById("rowNbrVehicule").style.display = "none"; + document.getElementById("labelVoiturier").style.display = "block"; + document.getElementById("labelCommissionnaire").style.display = "block"; + document.getElementById("labelDemenageur").style.display = "block"; + document.getElementById("labelLogistique").style.display = "block"; + document.getElementById("labelAutocariste").style.display = "none"; + document.getElementById("labelAutres").style.display = "block"; + + // Lancement du calcul revisable + calcRevisable(); + } + }); + }; + + document.getElementById('chiffreAffaire').addEventListener('input', function () { + const cot = document.querySelector('input[name="cotisation"]:checked')?.value; + + if (document.getElementById('chiffreAffaire').value.trim() == '') { + document.getElementById("modCA").style.display = "none"; + } else { + // Masquer modCA en forfaitaire car il n'est pas utilisé + if (cot === 'forfaitaire') { + document.getElementById("modCA").style.display = "none"; + } else { + document.getElementById("modCA").style.display = "block"; + } + } + + calcGlobal(); + // Validation conditionnelle : CA obligatoire seulement en revisable + if (typeof validateField === 'function') { + if (cot === 'revisable') { + validateField('chiffreAffaire', true); + } else { + // En forfaitaire, CA optionnel + validateField('chiffreAffaire', false); + } + } + if (document.getElementById('projetForm')) { + updateSubmitButtonState('projetForm'); + } + }); + + document.getElementById('nbrVehicule').addEventListener('input', function () { + // Validation : forcer entre 1 et 2 véhicules (comme ancienne plateforme) + let nbVeh = parseInt(this.value); + if (nbVeh < 1) { + this.value = 1; + } else if (nbVeh > 2) { + this.value = 2; + } else if (isNaN(nbVeh)) { + this.value = 1; + } + + calcGlobal(); + validateField('nbrVehicule', true); + if (document.getElementById('projetForm')) { + updateSubmitButtonState('projetForm'); + } + }); + + document.getElementById('sinistre').addEventListener('input', function () { + if (document.getElementById('sinistre').value.trim() == '') { + document.getElementById("modSinistre").style.display = "none"; + } else { + document.getElementById("modSinistre").style.display = "block"; + } + }); + + document.getElementById('checkRCE').addEventListener('click', function () { + var RCE = document.querySelectorAll('[name="RCE"]'); + + if (document.getElementById('checkRCE').checked == true) { + for (var i = 0; i < RCE.length; i++) { + RCE[i].style.display = "block"; + } + } else { + for (var i = 0; i < RCE.length; i++) { + RCE[i].style.display = "none"; + } + } + + calcGlobal(); + }); + + // Ajouter des styles dynamiques pour améliorer le feedback visuel + const style = document.createElement('style'); + style.textContent = ` + .input-pourcent:focus { + border-color: #1976d2 !important; + box-shadow: 0 0 8px rgba(25, 118, 210, 0.5) !important; + outline: none; + transform: scale(1.05); + transition: all 0.2s ease; + } + .input-pourcent:hover { + border-color: #5c6bc0 !important; + transition: all 0.2s ease; + } + .input-pourcent.set { + background-color: #e8f5e9 !important; + border-color: #4caf50 !important; + } + `; + document.head.appendChild(style); + + // Ajout d'un écouteur d'événement à chaque champ pourcentage + document.querySelectorAll('.input-pourcent').forEach(input => { + // Sélectionner automatiquement le contenu au focus pour faciliter la saisie + input.addEventListener('focus', function() { + this.select(); + }); + + // Validation automatique lors de la perte de focus (clic ailleurs) + input.addEventListener('blur', function() { + // Déclencher le recalcul si la valeur a changé + if (this.value !== this.defaultValue) { + this.dispatchEvent(new Event('input', { bubbles: true })); + } + }); + + input.addEventListener('input', function() { + // Récupérer l'ID de l'input modifié pour accéder à son isSet + const isSetInputId = 'isSet' + input.id.replace('pourcent', ''); + const isSetInput = document.getElementById(isSetInputId); + + // Mettre à jour isSet correspondant à true si l'input a une valeur + if (input.value != '') { + isSetInput.value = 'true'; + input.classList.add('set'); // Changer le fond + } else { + isSetInput.value = 'false'; // Réinitialiser isSet si l'input est vide + input.classList.remove('set'); // Remettre le fond d'origine + } + + // Réinitialiser les inputs non set à vide avant de recalculer + document.querySelectorAll('.input-pourcent').forEach(p => { + const correspondingIsSetInput = document.getElementById('isSet' + p.id.replace('pourcent', '')); + if (correspondingIsSetInput.value == 'false') { + p.value = ''; // Réinitialiser la valeur + } + }); + + // Calcul de la somme des pourcentages des champs actuellement modifiés + let totalPourcent = 0; + document.querySelectorAll('.input-pourcent').forEach(pourcentInput => { + if (pourcentInput.value != '' && pourcentInput.offsetParent != null) { + totalPourcent += toNumber(pourcentInput.value); + } + }); + + // PLAFONNEMENT STRICT À 100% + if (totalPourcent > 100) { + const excess = totalPourcent - 100; + + // Plafonnement : empêcher de dépasser + // Réduire la valeur qui vient d'être modifiée + const currentInputVal = toNumber(input.value); + const maxPossible = currentInputVal - excess; + + if (maxPossible >= 0) { + // Plafonner la valeur actuelle + input.value = maxPossible.toFixed(2); + totalPourcent = 100; + } else { + // La valeur est trop grande, la limiter au restant + const otherTotal = totalPourcent - currentInputVal; + input.value = (100 - otherTotal).toFixed(2); + totalPourcent = 100; + } + + // Afficher message d'avertissement visuel + showPercentageWarning(excess); + + // Masquer les primes pour montrer que c'est invalide + const allInputs = document.querySelectorAll('.input-pourcent'); + let finalTotal = 0; + allInputs.forEach(p => { + if (p.offsetParent != null) { + finalTotal += toNumber(p.value); + } + }); + + if (finalTotal > 100.01) { // Tolérance de 0.01 pour les arrondis + // BLOQUER les calculs - afficher erreur + hideAllPrimes(); + return; + } + } + + // Calcul de la différence à répartir + const remainingPourcent = 100 - totalPourcent; + + // Répartition de la différence sur les champs restants non marqués isSet + const nonModifiedInputs = Array.from(document.querySelectorAll('.input-pourcent')).filter(p => { + const correspondingIsSetInput = document.getElementById('isSet' + p.id.replace('pourcent', '')); + return p.value == '' && correspondingIsSetInput.value == 'false' && p.offsetParent != null; + }); + + // Vérifier si nous avons des inputs non modifiés pour répartir le pourcentage restant + if (remainingPourcent > 0 && nonModifiedInputs.length > 0) { + const pourcentToAdd = remainingPourcent / nonModifiedInputs.length; + + nonModifiedInputs.forEach(p => { + p.value = pourcentToAdd.toFixed(2); + }); + } else if (remainingPourcent > 0 && nonModifiedInputs.length === 0) { + // Tous les champs sont remplis mais total < 100 + // Trouver le dernier champ non-set et lui ajouter le restant + const allInputs = Array.from(document.querySelectorAll('.input-pourcent')).filter(p => p.offsetParent != null); + const lastNonSet = allInputs.filter(p => { + const correspondingIsSetInput = document.getElementById('isSet' + p.id.replace('pourcent', '')); + return correspondingIsSetInput.value == 'false'; + }).pop(); + + if (lastNonSet) { + const currentVal = toNumber(lastNonSet.value); + lastNonSet.value = (currentVal + remainingPourcent).toFixed(2); + } + } + + // Mettre à jour l'indicateur visuel du total + updatePercentageIndicator(totalPourcent); + + calcGlobal(); + }); + }); + + // Bouton reset de l'équilibrage pourcentage + document.getElementById('resetPourcent').addEventListener('click', function() { + resetInputs(); + updatePercentageIndicator(100); // Après reset = 100% + calcGlobal(); + }); + + document.getElementById('checkVoiturier').addEventListener('click', function () { + var actVoiturier = document.querySelectorAll('[name="actVoiturier/Loueur"]'); + var actComplVoiturier = document.querySelectorAll('[name="actComplVoiturier/Loueur"]'); + var marVoiturier = document.querySelectorAll('[name="marVoiturier/Loueur"]'); + + if (document.getElementById('checkVoiturier').checked == true) { + for (var i = 0; i < actVoiturier.length; i++) { + actVoiturier[i].style.display = "block"; + actComplVoiturier[i].style.display = "block"; + marVoiturier[i].style.display = "block"; + } + } else { + for (var i = 0; i < actVoiturier.length; i++) { + actVoiturier[i].style.display = "none"; + actComplVoiturier[i].style.display = "none"; + marVoiturier[i].style.display = "none"; + } + } + + // Reset de l'équilibrage pourcentage + resetInputs(); + updatePercentageIndicator(100); + calcGlobal(); + }); + + document.getElementById('checkCommissionnaire').addEventListener('click', function () { + var actCommissionnaire = document.querySelectorAll('[name="actCommissionnaire de Transport"]'); + var actComplCommissionnaire = document.querySelectorAll('[name="actComplCommissionnaire de Transport"]'); + var marCommissionnaire = document.querySelectorAll('[name="marCommissionnaire de Transport"]'); + + if (document.getElementById('checkCommissionnaire').checked == true) { + for (var i = 0; i < actCommissionnaire.length; i++) { + actCommissionnaire[i].style.display = "block"; + actComplCommissionnaire[i].style.display = "block"; + marCommissionnaire[i].style.display = "block"; + } + } else { + for (var i = 0; i < actCommissionnaire.length; i++) { + actCommissionnaire[i].style.display = "none"; + actComplCommissionnaire[i].style.display = "none"; + marCommissionnaire[i].style.display = "none"; + } + } + + // Reset de l'équilibrage pourcentage + resetInputs(); + updatePercentageIndicator(100); + calcGlobal(); + }); + + document.getElementById('checkDemenageur').addEventListener('click', function () { + var actDemenageur = document.querySelectorAll('[name="actDéménageur"]'); + var actComplDemenageur = document.querySelectorAll('[name="actComplDéménageur"]'); + var marDemenageur = document.querySelectorAll('[name="marDéménageur"]'); + + if (document.getElementById('checkDemenageur').checked == true) { + for (var i = 0; i < actDemenageur.length; i++) { + actDemenageur[i].style.display = "block"; + actComplDemenageur[i].style.display = "block"; + marDemenageur[i].style.display = "block"; + } + } else { + for (var i = 0; i < actDemenageur.length; i++) { + actDemenageur[i].style.display = "none"; + actComplDemenageur[i].style.display = "none"; + marDemenageur[i].style.display = "none"; + } + } + + // Reset de l'équilibrage pourcentage + resetInputs(); + updatePercentageIndicator(100); + calcGlobal(); + }); + + document.getElementById('checkLogistique').addEventListener('click', function () { + var actLogistique = document.querySelectorAll('[name="actLogistique"]'); + var actComplLogistique = document.querySelectorAll('[name="actComplLogistique"]'); + var marLogistique = document.querySelectorAll('[name="marLogistique"]'); + + if (document.getElementById('checkLogistique').checked == true) { + for (var i = 0; i < actLogistique.length; i++) { + actLogistique[i].style.display = "block"; + actComplLogistique[i].style.display = "block"; + marLogistique[i].style.display = "block"; + } + } else { + for (var i = 0; i < actLogistique.length; i++) { + actLogistique[i].style.display = "none"; + actComplLogistique[i].style.display = "none"; + marLogistique[i].style.display = "none"; + } + } + + // Reset de l'équilibrage pourcentage + resetInputs(); + updatePercentageIndicator(100); + calcGlobal(); + }); + + document.getElementById('checkAutocariste').addEventListener('click', function () { + var actAutocariste = document.querySelectorAll('[name="actAutocariste"]'); + var marAutocariste = document.querySelectorAll('[name="marAutocariste"]'); + + if (document.getElementById('checkAutocariste').checked == true) { + for (var i = 0; i < actAutocariste.length; i++) { + actAutocariste[i].style.display = "block"; + marAutocariste[i].style.display = "block"; + } + } else { + for (var i = 0; i < actAutocariste.length; i++) { + actAutocariste[i].style.display = "none"; + marAutocariste[i].style.display = "none"; + } + } + + // Reset de l'équilibrage pourcentage + resetInputs(); + updatePercentageIndicator(100); + calcGlobal(); + }); + + document.getElementById('checkAutres').addEventListener('click', function () { + var actAutres = document.querySelectorAll('[name="actAutres activites"]'); + var marAutres = document.querySelectorAll('[name="marAutres activites"]'); + + if (document.getElementById('checkAutres').checked == true) { + for (var i = 0; i < actAutres.length; i++) { + actAutres[i].style.display = "block"; + marAutres[i].style.display = "block"; + } + } else { + for (var i = 0; i < actAutres.length; i++) { + actAutres[i].style.display = "none"; + marAutres[i].style.display = "none"; + } + } + + // Reset de l'équilibrage pourcentage + resetInputs(); + updatePercentageIndicator(100); + calcGlobal(); + }); + + // Event listeners pour les inputs capital (au lieu de selects) + const capitalInputs = [ + 'selectActVoiturier/Loueur', + 'selectActCommissionnaire de Transport', + 'selectActDéménageur', + 'selectActLogistique', + 'selectActAutocariste', + 'selectActAutres activites' + ]; + + capitalInputs.forEach(name => { + const el = document.getElementsByName(name)[0]; + if (el) { + el.addEventListener('input', function() { + calcGlobal(); + }); + } + }); + + const checkboxesActComplVoiturier = document.querySelectorAll('div[name="actComplVoiturier/Loueur"] input[type="checkbox"]'); + checkboxesActComplVoiturier.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + const checkboxesActCompltComDeTransport = document.querySelectorAll('div[name="actComplCommissionnaire de Transport"] input[type="checkbox"]'); + checkboxesActCompltComDeTransport.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + const checkboxesActComplDem = document.querySelectorAll('div[name="actComplDéménageur"] input[type="checkbox"]'); + checkboxesActComplDem.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + const checkboxesActComplLogistique = document.querySelectorAll('div[name="actComplLogistique"] input[type="checkbox"]'); + checkboxesActComplLogistique.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + const checkboxesMarVoiturier = document.querySelectorAll('div[name="marVoiturier/Loueur"] input[type="checkbox"]'); + checkboxesMarVoiturier.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + const checkboxesMarComDeTransport = document.querySelectorAll('div[name="marCommissionnaire de Transport"] input[type="checkbox"]'); + checkboxesMarComDeTransport.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + const checkboxesMarDem = document.querySelectorAll('div[name="marDéménageur"] input[type="checkbox"]'); + checkboxesMarDem.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + const checkboxesMarLogistique = document.querySelectorAll('div[name="marLogistique"] input[type="checkbox"]'); + checkboxesMarLogistique.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + const checkboxesMarAutres = document.querySelectorAll('div[name="marAutres activites"] input[type="checkbox"]'); + checkboxesMarAutres.forEach(checkbox => { + checkbox.addEventListener('change', function () { + calcGlobal(); + }); + }); + + document.getElementById('btnMondeEntier').addEventListener('click', function () { + document.getElementById('zone1').checked = true; + document.getElementById('zone1').disabled = true; + document.getElementById('zone2').checked = true; + document.getElementById('zone2').disabled = true; + document.getElementById('zone3').checked = true; + document.getElementById('zone4').checked = true; + document.getElementById('zone5').checked = true; + document.getElementById('zone6').checked = true; + }); + + document.getElementById('btnReset').addEventListener('click', function () { + document.getElementById('zone1').checked = false; + document.getElementById('zone1').disabled = false; + document.getElementById('zone2').checked = false; + document.getElementById('zone2').disabled = false; + document.getElementById('zone3').checked = false; + document.getElementById('zone4').checked = false; + document.getElementById('zone5').checked = false; + document.getElementById('zone6').checked = false; + }); + + document.getElementById('btnZone1').addEventListener('click', function () { + const elem = document.getElementById('modalZone1'); + const instance = M.Modal.getInstance(elem); + instance.open(); + }); + + document.getElementById('btnZone2').addEventListener('click', function () { + const elem = document.getElementById('modalZone2'); + const instance = M.Modal.getInstance(elem); + instance.open(); + }); + + document.getElementById('btnZone3').addEventListener('click', function () { + const elem = document.getElementById('modalZone3'); + const instance = M.Modal.getInstance(elem); + instance.open(); + }); + + document.getElementById('btnZone4').addEventListener('click', function () { + const elem = document.getElementById('modalZone4'); + const instance = M.Modal.getInstance(elem); + instance.open(); + }); + + document.getElementById('btnZone5').addEventListener('click', function () { + const elem = document.getElementById('modalZone5'); + const instance = M.Modal.getInstance(elem); + instance.open(); + }); + + document.getElementById('btnZone6').addEventListener('click', function () { + const elem = document.getElementById('modalZone6'); + const instance = M.Modal.getInstance(elem); + instance.open(); + }); + + document.getElementById('btnZone7').addEventListener('click', function () { + const elem = document.getElementById('modalZoneExclus'); + const instance = M.Modal.getInstance(elem); + instance.open(); + }); + + document.getElementById('zone2').addEventListener('click', function () { + if (document.getElementById('zone2').checked == true) { + document.getElementById('zone1').checked = true; + document.getElementById('zone1').disabled = true; + } else if (document.getElementById('zone2').checked == false) { + document.getElementById('zone1').checked = true; + document.getElementById('zone1').disabled = false; + } + }); + + document.getElementById('zone3').addEventListener('click', function () { + if (document.getElementById('zone3').checked == true) { + document.getElementById('zone2').checked = true; + document.getElementById('zone1').checked = true; + document.getElementById('zone2').disabled = true; + document.getElementById('zone1').disabled = true; + } else if (document.getElementById('zone3').checked == false) { + document.getElementById('zone1').checked = true; + document.getElementById('zone1').disabled = true; + document.getElementById('zone2').checked = true; + document.getElementById('zone2').disabled = false; + } + }); + + // === Brancher toutes les cases zones sur calcGlobal === + document.querySelectorAll('input[id^="zone"]').forEach(cb => { + cb.addEventListener('change', calcGlobal); + }); + + // Dommages immatériels + document.getElementById('checkDomImmat').addEventListener('click', function () { + document.getElementById('selectDomImmat').style.display = this.checked ? "block" : "none"; + calcGlobal(); + }); + const inputDomImmat = document.getElementById('inputDomImmat'); + if (inputDomImmat) inputDomImmat.addEventListener('input', calcGlobal); + + // Contenants confiés + document.getElementById('checkContConf').addEventListener('click', function () { + document.getElementById('selectContConf').style.display = this.checked ? "block" : "none"; + calcGlobal(); + }); + const inputContConf = document.getElementById('inputContConf'); + if (inputContConf) inputContConf.addEventListener('input', calcGlobal); + + // Différence inventaire + document.getElementById('checkDiffInv').addEventListener('click', function () { + document.getElementById('selectDiffInv').style.display = this.checked ? "block" : "none"; + calcGlobal(); + }); + const inputDiffInv = document.getElementById('inputDiffInv'); + if (inputDiffInv) inputDiffInv.addEventListener('input', calcGlobal); + + // TPPC show/hide + recalc + const checkTPPC = document.getElementById('checkTPPC'); + const selectTPPC = document.getElementById('selectTPPC'); + + + + if (checkTPPC && selectTPPC) { + checkTPPC.addEventListener('click', function () { + console.log('TPPC checkbox clicked:', this.checked); + selectTPPC.style.display = this.checked ? "block" : "none"; + + if (!this.checked) { + // reset des valeurs si décoché + const cap = document.getElementById('selTPPCcapital'); + const veh = document.getElementById('selTPPCveh'); + if (cap) cap.value = ""; + if (veh) veh.value = ""; + } + + calcGlobal(); + }); + } else { + console.error('TPPC elements not found!', { checkTPPC, selectTPPC }); + } + + const inputTPPCcap = document.getElementById('selTPPCcapital'); + const inputTPPCveh = document.getElementById('selTPPCveh'); + if (inputTPPCcap) { + inputTPPCcap.addEventListener('input', calcGlobal); + console.log('TPPC capital input listener attached'); + } + if (inputTPPCveh) { + inputTPPCveh.addEventListener('input', calcGlobal); + console.log('TPPC véhicules input listener attached'); + } + + // Protection juridique + document.getElementById('checkPJ').addEventListener('click', calcGlobal); + + // RCE + document.getElementById('checkStationLavage').addEventListener('click', calcGlobal); + document.getElementById('checkGarageInterne').addEventListener('click', calcGlobal); + document.getElementById('checkCSE').addEventListener('click', calcGlobal); + // Dès que l’utilisateur tape ou modifie le champ sinistre, on recalcule + const elSin = document.getElementById('sinistre'); + if (elSin) { + elSin.addEventListener('input', () => { + console.log('[event] valeur sinistre modifiée =', elSin.value); + calcGlobal(); + }); + elSin.addEventListener('change', () => { + console.log('[event] valeur sinistre validée =', elSin.value); + calcGlobal(); + }); + } + + document.querySelectorAll('.franchise-card .btn').forEach(btn => { + btn.addEventListener('click', () => { + const selectedFr = btn.getAttribute('name'); // "250", "400", "mini300" + window.franchiseChoisie = selectedFr; + console.log('[tarifette] franchise choisie =', selectedFr); + document.querySelectorAll('.franchise-card').forEach(c => c.classList.remove('selected')); + btn.closest('.franchise-card').classList.add('selected'); + }); + }); + + // Event listeners pour les modals d'alerte + setupMarchandiseAlerts(); + setupActiviteAlerts(); + + // Event listener pour le bouton Valider du modal tarif commercial + document.getElementById('comm-OK').addEventListener('click', handleValidateTarifCom); + + // Le bouton Annuler ferme automatiquement le modal grâce à la classe "modal-close" + } + + // Peupler le formulaire avec les données + function populateFormData() { + //Poupulate select historique + if (!contrat.historique) { + document.getElementById('historiqueDiv').style.display = "none"; + } else { + document.getElementById('historiqueDiv').style.display = "block"; + + const idSelect = document.getElementById('idSelect'); + + contrat.historique.forEach(function (item) { + var option = document.createElement('option'); + option.value = item.id; + option.textContent = item.type + " " + item.produit + " - " + item.date + " - " + item.heure; + + if (item.nom != undefined && item.prenom != undefined) { + option.textContent += " - " + item.nom + " " + item.prenom; + } + + idSelect.appendChild(option); + }); + + M.FormSelect.init(idSelect); + } + + // ===== PRÉ-REMPLIR LE FORMULAIRE AVEC LES DONNÉES RC DE LA BASE ===== + if (!rc) { + console.log('Aucune donnée RC à pré-remplir'); + return; + } + + console.log('🔄 Pré-remplissage du formulaire tarif avec les données RC:', rc); + + // Type de cotisation + if (rc.typeCotisation) { + const radioBtn = document.getElementById(rc.typeCotisation); + if (radioBtn) { + radioBtn.checked = true; + radioBtn.dispatchEvent(new Event('change')); + } + } + + // Chiffre d'affaires et nombre de véhicules + const caField = getElementByIdFlexible('CA') || getElementByIdFlexible('chiffreAffaire'); + if (rc.chiffreAffaires && caField) caField.value = rc.chiffreAffaires; + + const nbVehiculeField = getElementByIdFlexible('nbVehicules') || getElementByIdFlexible('nbrVehicule'); + if (rc.nombreVehicules && nbVehiculeField) nbVehiculeField.value = rc.nombreVehicules; + + // Sinistralité (depuis tarifRC) + if (tarif && tarif.sinistre) { + document.getElementById('sinistre').value = tarif.sinistre; + } + + // Checkbox RCE + if (rc.checkRCE !== undefined) { + document.getElementById('checkRCE').checked = rc.checkRCE; + document.getElementById('checkRCE').dispatchEvent(new Event('click')); + } + + // Activité Voiturier/Loueur + if (rc.checkVoiturier !== undefined) { + const checkVoiturierEl = getElementByIdFlexible('checkVoiturier'); + if (checkVoiturierEl) { + checkVoiturierEl.checked = rc.checkVoiturier; + const capitalVoiturierEl = getElementByIdFlexible('capitalVoiturier') || document.querySelector('input[name="selectActVoiturier/Loueur"]'); + if (rc.capitalVoiturier && capitalVoiturierEl) capitalVoiturierEl.value = rc.capitalVoiturier; + checkVoiturierEl.dispatchEvent(new Event('click')); + } + } + + // Activité Commissionnaire + if (rc.checkCommissionnaire !== undefined) { + const checkCommissionnaireEl = getElementByIdFlexible('checkCommissionnaire'); + if (checkCommissionnaireEl) { + checkCommissionnaireEl.checked = rc.checkCommissionnaire; + const capitalCommissionnaireEl = getElementByIdFlexible('capitalCommissionnaire') || document.querySelector('input[name="selectActCommissionnaire de Transport"]') || document.querySelector('input[name="selectActCommissionnaireDeTransport"]'); + if (rc.capitalCommissionnaire && capitalCommissionnaireEl) capitalCommissionnaireEl.value = rc.capitalCommissionnaire; + checkCommissionnaireEl.dispatchEvent(new Event('click')); + } + } + + // Activité Déménageur + if (rc.checkDemenageur !== undefined) { + const checkDemenageurEl = getElementByIdFlexible('checkDemenageur'); + if (checkDemenageurEl) { + checkDemenageurEl.checked = rc.checkDemenageur; + const capitalDemenageurEl = getElementByIdFlexible('capitalDemenageur') || document.querySelector('input[name="selectActDéménageur"]') || document.querySelector('input[name="selectActDemenageur"]'); + if (rc.capitalDemenageur && capitalDemenageurEl) capitalDemenageurEl.value = rc.capitalDemenageur; + checkDemenageurEl.dispatchEvent(new Event('click')); + } + } + + // Activité Logistique + if (rc.checkLogistique !== undefined) { + const checkLogistiqueEl = getElementByIdFlexible('checkLogistique'); + if (checkLogistiqueEl) { + checkLogistiqueEl.checked = rc.checkLogistique; + const capitalLogistiqueEl = getElementByIdFlexible('capitalLogistique') || document.querySelector('input[name="selectActLogistique"]'); + if (rc.capitalLogistique && capitalLogistiqueEl) capitalLogistiqueEl.value = rc.capitalLogistique; + checkLogistiqueEl.dispatchEvent(new Event('click')); + } + } + + // Activité Autocariste + if (rc.checkAutocariste !== undefined) { + const checkAutocaristeEl = getElementByIdFlexible('checkAutocariste'); + if (checkAutocaristeEl) { + checkAutocaristeEl.checked = rc.checkAutocariste; + const capitalAutocaristeEl = getElementByIdFlexible('capitalAutocariste') || document.querySelector('input[name="selectActAutocariste"]'); + if (rc.capitalAutocariste && capitalAutocaristeEl) capitalAutocaristeEl.value = rc.capitalAutocariste; + checkAutocaristeEl.dispatchEvent(new Event('click')); + } + } + + // Activité Autres + if (rc.checkAutres !== undefined) { + const checkAutresEl = getElementByIdFlexible('checkAutres'); + if (checkAutresEl) { + checkAutresEl.checked = rc.checkAutres; + const capitalAutresEl = getElementByIdFlexible('capitalAutres') || document.querySelector('input[name="selectActAutres activites"]') || document.querySelector('input[name="selectActAutresActivites"]'); + if (rc.capitalAutres && capitalAutresEl) capitalAutresEl.value = rc.capitalAutres; + checkAutresEl.dispatchEvent(new Event('click')); + } + } + + // Zones géographiques + if (rc.zone1) document.getElementById('zone1').checked = rc.zone1; + if (rc.zone2) document.getElementById('zone2').checked = rc.zone2; + if (rc.zone3) document.getElementById('zone3').checked = rc.zone3; + if (rc.zone4) document.getElementById('zone4').checked = rc.zone4; + if (rc.zone5) document.getElementById('zone5').checked = rc.zone5; + if (rc.zone6) document.getElementById('zone6').checked = rc.zone6; + + // Pré-remplir les activités complémentaires (JSON) pour TOUTES les activités + const activitiesTypes = [ + { field: 'actComplVoiturier', name: 'actComplVoiturier/Loueur' }, + { field: 'actComplCommissionnaire', name: 'actComplCommissionnaire de Transport' }, + { field: 'actComplDemenageur', name: 'actComplDéménageur' }, + { field: 'actComplLogistique', name: 'actComplLogistique' } + ]; + + console.log('🔄 Pré-remplissage des activités complémentaires...'); + activitiesTypes.forEach(({ field, name }) => { + // D'abord DÉCOCHER toutes les checkboxes de cette activité + const allCheckboxes = document.querySelectorAll(`[name="${name}"] input[type="checkbox"]`); + allCheckboxes.forEach(cb => cb.checked = false); + + if (rc[field]) { + try { + // PocketBase parse automatiquement les champs JSON, donc rc[field] est déjà un array + const activites = Array.isArray(rc[field]) ? rc[field] : JSON.parse(rc[field]); + console.log(` ✓ ${field}:`, activites); + activites.forEach(actText => { + // Chercher la checkbox dont le span adjacent contient ce texte + allCheckboxes.forEach(cb => { + const label = cb.nextElementSibling?.textContent.trim(); + if (label === actText) { + cb.checked = true; + console.log(` ✓ Coché: ${actText}`); + } + }); + }); + } catch (e) { console.error(`❌ Erreur parsing ${field}:`, e); } + } + }); + + // Pré-remplir les marchandises (JSON) pour TOUTES les activités + const marchandisesTypes = [ + { field: 'marchandisesVoiturier', name: 'marVoiturier/Loueur' }, + { field: 'marchandisesCommissionnaire', name: 'marCommissionnaire de Transport' }, + { field: 'marchandisesDemenageur', name: 'marDéménageur' }, + { field: 'marchandisesLogistique', name: 'marLogistique' }, + { field: 'marchandisesAutocariste', name: 'marAutocariste' }, + { field: 'marchandisesAutres', name: 'marAutres activites' } + ]; + + console.log('🔄 Pré-remplissage des marchandises...'); + marchandisesTypes.forEach(({ field, name }) => { + // D'abord DÉCOCHER toutes les checkboxes de cette marchandise + const allCheckboxes = document.querySelectorAll(`[name="${name}"] input[type="checkbox"]`); + allCheckboxes.forEach(cb => cb.checked = false); + + if (rc[field]) { + try { + // PocketBase parse automatiquement les champs JSON, donc rc[field] est déjà un array + const marchandises = Array.isArray(rc[field]) ? rc[field] : JSON.parse(rc[field]); + console.log(` ✓ ${field}:`, marchandises); + marchandises.forEach(marText => { + // Chercher la checkbox dont le span adjacent contient ce texte + allCheckboxes.forEach(cb => { + const label = cb.nextElementSibling?.textContent.trim(); + if (label === marText) { + cb.checked = true; + console.log(` ✓ Coché: ${marText}`); + } + }); + }); + } catch (e) { console.error(`❌ Erreur parsing ${field}:`, e); } + } + }); + + // Pré-remplir les pourcentages (depuis tarifRC) + // Préférer l'objet tarif si présent, sinon retomber sur l'expansion RC + const tarifSource = tarif || rc?.["@expand"]?.tarifRC || rc?.tarifRC || rc || null; + // Fallback ultime : données de session (hook RC orchestrator) si tout est vide + let sessionTarifData = null; + try { + const stored = sessionStorage.getItem('rc_tarif_validated_data'); + sessionTarifData = stored ? JSON.parse(stored) : null; + } catch (e) { + sessionTarifData = null; + } + if (tarifSource || sessionTarifData) { + const pctVoiturierEl = getElementByIdFlexible('pourcent_voiturier') || getElementByIdFlexible('pourcentVoiturier/Loueur'); + if (tarifSource?.pourcentageVoiturier && pctVoiturierEl) pctVoiturierEl.value = tarifSource.pourcentageVoiturier; + + const pctCommissionnaireEl = getElementByIdFlexible('pourcent_commissionnaire') || getElementByIdFlexible('pourcentCommissionnaire de Transport') || getElementByIdFlexible('pourcentCommissionnaireDeTransport'); + if (tarifSource?.pourcentageCommissionnaire && pctCommissionnaireEl) pctCommissionnaireEl.value = tarifSource.pourcentageCommissionnaire; + + const pctDemenageurEl = getElementByIdFlexible('pourcent_demenageur') || getElementByIdFlexible('pourcentDéménageur') || getElementByIdFlexible('pourcentDemenageur'); + if (tarifSource?.pourcentageDemenageur && pctDemenageurEl) pctDemenageurEl.value = tarifSource.pourcentageDemenageur; + + const pctLogistiqueEl = getElementByIdFlexible('pourcent_logistique') || getElementByIdFlexible('pourcentLogistique'); + if (tarifSource?.pourcentageLogistique && pctLogistiqueEl) pctLogistiqueEl.value = tarifSource.pourcentageLogistique; + + const pctAutocaristeEl = getElementByIdFlexible('pourcent_autocariste') || getElementByIdFlexible('pourcentAutocariste'); + if (tarifSource?.pourcentageAutocariste && pctAutocaristeEl) pctAutocaristeEl.value = tarifSource.pourcentageAutocariste; + + const pctAutresEl = getElementByIdFlexible('pourcent_autres') || getElementByIdFlexible('pourcentAutres activites') || getElementByIdFlexible('pourcentAutresActivites'); + if (tarifSource?.pourcentageAutres && pctAutresEl) pctAutresEl.value = tarifSource.pourcentageAutres; + + // ===== ENGAGEMENTS COMPLÉMENTAIRES (depuis tarifRC) ===== + // Dommages immatériels + const engagementSrc = tarifSource || sessionTarifData?.engagementsComplementaires; + if (tarifSource?.checkDomImmat || engagementSrc?.domicileImmatriculation?.checked) { + document.getElementById('checkDomImmat').checked = true; + document.getElementById('selectDomImmat').style.display = 'block'; + const cap = tarifSource?.capitalDomImmat ?? engagementSrc?.domicileImmatriculation?.capital; + if (cap) { + document.getElementById('inputDomImmat').value = cap; + } + } + + // Contenants confiés + if (tarifSource?.checkContConf || engagementSrc?.contenantConfie?.checked) { + document.getElementById('checkContConf').checked = true; + document.getElementById('selectContConf').style.display = 'block'; + const cap = tarifSource?.capitalContConf ?? engagementSrc?.contenantConfie?.capital; + if (cap) { + document.getElementById('inputContConf').value = cap; + } + } + + // Différence inventaire + if (tarifSource?.checkDiffInv || engagementSrc?.differenceInventaire?.checked) { + document.getElementById('checkDiffInv').checked = true; + document.getElementById('selectDiffInv').style.display = 'block'; + const cap = tarifSource?.capitalDiffInv ?? engagementSrc?.differenceInventaire?.capital; + if (cap) { + document.getElementById('inputDiffInv').value = cap; + } + } + + // ===== GARANTIES ADDITIONNELLES (depuis tarifRC) ===== + // TPPC + const garantiesSrc = tarifSource || sessionTarifData?.garantiesAdditionnelles; + if (tarifSource?.checkTPPC || garantiesSrc?.tppc?.checked) { + document.getElementById('checkTPPC').checked = true; + document.getElementById('selectTPPC').style.display = 'block'; + const cap = tarifSource?.capitalTPPC ?? garantiesSrc?.tppc?.capital; + if (cap) { + document.getElementById('selTPPCcapital').value = cap; + } + const veh = tarifSource?.vehiculesTPPC ?? garantiesSrc?.tppc?.vehicules; + if (veh) { + document.getElementById('selTPPCveh').value = veh; + } + } + + // Protection juridique + if (tarifSource?.checkPJ || garantiesSrc?.pj) { + document.getElementById('checkPJ').checked = true; + } + + // RCE - Station lavage + if (tarifSource?.checkStationLavage || garantiesSrc?.stationLavage) { + document.getElementById('checkStationLavage').checked = true; + } + + // RCE - Garage interne + if (tarifSource?.checkGarageInterne || garantiesSrc?.garageInterne) { + document.getElementById('checkGarageInterne').checked = true; + } + + // RCE - CSE + if (tarifSource?.checkCSE || garantiesSrc?.cse) { + document.getElementById('checkCSE').checked = true; + } + + // ===== FRANCHISE CHOISIE ===== + if (tarifSource?.franchiseChoisie) { + window.franchiseChoisie = tarifSource.franchiseChoisie; + // Mettre en surbrillance la carte sélectionnée + const selectedButton = document.querySelector(`.franchise-card button[name="${tarifSource.franchiseChoisie}"]`); + if (selectedButton) { + selectedButton.closest('.franchise-card').classList.add('selected'); + } + } + } + + console.log('✅ Formulaire tarif pré-rempli avec succès'); + + // Recalculer après pré-remplissage + setTimeout(() => { + calcGlobal(); + }, 500); + } + + function calcModCA(caRaw){ + const ca = Number(String(caRaw || '').replace(/\s/g,'').replace(',','.')) || 0; + const thresholds = Object.keys(modRCCA).map(n => Number(n)).sort((a,b)=>a-b); + for (const t of thresholds) if (ca < t) return modRCCA[t]; + return modRCCA[thresholds.at(-1)] ?? 1; + } + + function calcModMarchandises(data, activityName, type, cot) { + let m = 1; + + // On cible le bloc correspondant à l'activité + const container = document.querySelector(`[name="mar${activityName}"]`); + if (!container) return 1; + + // On récupère toutes les cases à cocher de ce bloc + const checkboxes = container.querySelectorAll('input[type="checkbox"]'); + + checkboxes.forEach(cb => { + if (cb.checked) { + // Le libellé affiché est dans le juste après l'input + const label = cb.nextElementSibling?.innerText.trim(); + + // On simplifie le libellé pour matcher les clés du JSON + let key = null; + if (label.includes("ordinaires")) key = "Marchandises ordinaires"; + else if (label.includes("Véhicules roulants")) key = "Véhicules roulants"; + else if (label.includes("Engins de chantier")) key = "Engins de chantier"; + else if (label.includes("Mobiliers")) key = "Mobiliers en déménagement"; + else if (label.includes("périssables")) key = "Marchandises périssables"; + else if (label.includes("citerne")) key = "Marchandises en citerne"; + else if (label.includes("Animaux")) key = "Animaux vivants"; + else if (label.includes("benne")) key = "Marchandises en benne"; + else if (label.includes("béton")) key = "Transport de béton"; + + if (key) { + const v = data?.[cot]?.[activityName]?.[key]?.[`mod${type}`]; + if (typeof v === "number") { + m *= v; + } else { + console.warn(`Pas de mod trouvé pour activité=${activityName}, clé=${key}, type=${type}, cot=${cot}`); + } + } else { + console.warn(`Libellé non reconnu: "${label}"`); + } + } + }); + + return m; + } + + function getZoneMods(data) { + let mRCC = 1; + let mRCE = 1; + + // On parcourt toutes les cases à cocher de zones + for (let i = 1; i <= 6; i++) { + const cb = document.getElementById(`zone${i}`); + if (cb && cb.checked) { + // Récupérer le libellé affiché + const label = document.getElementById(`zone${i}-text`).innerText.trim(); + + // Trouver la clé correspondante dans le JSON + let key = null; + if (label.includes("France Métropolitaine")) key = "France Métropolitaine et pays limitrophes"; + else if (label.includes("Union Européenne")) key = "Union Européenne"; + else if (label.includes("Autres pays européens")) key = "Autres pays européens sauf Russie et Ukraine (y compris UK et Norvège)"; + else if (label.includes("Maghreb") || label.includes("Amérique du Nord")) key = "Pays du Maghreb et Amérique du Nord ( USA / Canada / Mexique )"; + else if (label.includes("Amérique Centrale") || label.includes("Asie") || label.includes("Océanie")) key = "Amérique Centrale et Sud / Caraïbes, Asie et Océanie"; + else if (label.includes("Afrique") || label.includes("Moyen Orient")) key = "Afrique Hors Maghreb / Proche Orient / Moyen Orient"; + + if (key && data[key]) { + const zone = data[key]; + if (typeof zone.modRCC === "number") mRCC = Math.max(mRCC, zone.modRCC); + if (typeof zone.modRCE === "number") mRCE = Math.max(mRCE, zone.modRCE); + } + } + } + + return { mRCC, mRCE }; +} + + function calcModActCompl(data, activityName, type, cot) { + let m = 1; + const current = getSelectedActivities().find(a => a.typeActivite === activityName); + if (!current) return 1; + const table = data?.[cot]?.[activityName] || {}; + (current.listActComplChecked||[]).forEach(name => { + const v = table[name]?.[`mod${type}`]; + if (typeof v === "number") m *= v; + }); + return m; + } + + function calcEngagCompl(data, primeRCC) { + let prime = primeRCC; + let surPrime = 0; + let modDommImmat = 1; + let infos = []; + + function writeToCard(inputId, message) { + const inputEl = document.getElementById(inputId); + if (!inputEl) return; + + const cardContent = inputEl.closest('.card-content'); + if (!cardContent) return; + + // Supprime l’ancien wrapper pour cet input + cardContent.querySelectorAll(`div.chip[data-for="${inputId}"]`).forEach(el => el.remove()); + + if (!message) return; + + // Wrapper + const wrapper = document.createElement("div"); + wrapper.classList.add("chip"); // uniquement "chip" + wrapper.dataset.for = inputId; + + // Message + const p = document.createElement("p"); + p.dataset.for = inputId; + p.classList.add("helper-text", "red-text"); + p.style.display = "block"; // override helper-text { display: none; } + p.textContent = message; + + wrapper.appendChild(p); + cardContent.appendChild(wrapper); + } + + + + + + + + // === Contenants confiés === + const checkContConf = document.getElementById('checkContConf'); + const inputContConf = document.getElementById('inputContConf'); + if (checkContConf?.checked) { + const val = toNumber(inputContConf?.value); + if (val > 0) { + const tranches = Object.keys(data.modRCC["Contenants confiés"]).map(Number).sort((a,b)=>a-b); + const tranche = findClosestTranche(val, tranches); + const add = data.modRCC["Contenants confiés"][tranche]; + if (typeof add === "number") { + surPrime += add; + const msg = `Prime RCC : +${add.toLocaleString('fr-FR',{style:'currency',currency:'EUR'})}`; + //infos.push(msg); pour ajouter le message dans la div "Prime RCC" + writeToCard('inputContConf', msg); + } + } + } else { + writeToCard('inputContConf', null); // supprime si décoché + } + + // === Différence inventaire === + const checkDiffInv = document.getElementById('checkDiffInv'); + const inputDiffInv = document.getElementById('inputDiffInv'); + if (checkDiffInv?.checked) { + const val = toNumber(inputDiffInv?.value); + if (val > 0) { + const tranches = Object.keys(data.modRCC["Différence inventaire"]).map(Number).sort((a,b)=>a-b); + const tranche = findClosestTranche(val, tranches); + const add = data.modRCC["Différence inventaire"][tranche]; + if (typeof add === "number") { + surPrime += add; + const msg = `Prime RCC : +${add.toLocaleString('fr-FR',{style:'currency',currency:'EUR'})}`; + //infos.push(msg); pour ajouter le message dans la div "Prime RCC" + writeToCard('inputDiffInv', msg); + } + } + } else { + writeToCard('inputDiffInv', null); + } + + // === Dommages immatériels === + const checkDomImmat = document.getElementById('checkDomImmat'); + const inputDomImmat = document.getElementById('inputDomImmat'); + if (checkDomImmat?.checked) { + const val = toNumber(inputDomImmat?.value); + if (val > 0) { + const tranches = Object.keys(data.modRCC["Dommages immatériels"]).map(Number).sort((a,b)=>a-b); + const tranche = findClosestTranche(val, tranches); + const mod = data.modRCC["Dommages immatériels"][tranche]; + if (typeof mod === "number") { + modDommImmat = mod; + const msg = `Mod Taux RCC : ×${mod}`; + //infos.push(msg); pour ajouter le message dans la div "Prime RCC" + writeToCard('inputDomImmat', msg); + } + } + } else { + writeToCard('inputDomImmat', null); + } + + // === Totaux === + prime += surPrime; + prime *= modDommImmat; + + return { prime, surPrime, infos }; + } + + // Fonction helper : trouver la tranche la plus proche + function findClosestTranche(val, tranches) { + if (val <= tranches[0]) return tranches[0]; + if (val >= tranches[tranches.length - 1]) return tranches[tranches.length - 1]; + + for (let i = 0; i < tranches.length - 1; i++) { + if (val >= tranches[i] && val < tranches[i + 1]) { + // Prendre la tranche inférieure ou égale + return tranches[i]; + } + } + return tranches[tranches.length - 1]; + } + + // Fonction pour afficher un avertissement visuel de dépassement % + function showPercentageWarning(excess) { + // Créer ou récupérer le div d'avertissement + let warningDiv = document.getElementById('percentageWarning'); + if (!warningDiv) { + warningDiv = document.createElement('div'); + warningDiv.id = 'percentageWarning'; + warningDiv.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + background: #f44336; + color: white; + padding: 15px 25px; + border-radius: 5px; + box-shadow: 0 4px 6px rgba(0,0,0,0.3); + z-index: 9999; + font-weight: bold; + animation: slideIn 0.3s ease; + `; + document.body.appendChild(warningDiv); + } + + warningDiv.innerHTML = `Vous dépassez 100% (vous dépassiez de ${excess.toFixed(1)}%)`; + warningDiv.style.display = 'block'; + + // Masquer après 3 secondes + setTimeout(() => { + warningDiv.style.display = 'none'; + }, 3000); + } + + // Fonction pour masquer toutes les primes (quand % invalide) + function hideAllPrimes() { + const primeElements = [ + 'primeChapActRCC', 'primeChapActRCE', + 'primeChapActComplRCC', 'primeChapActComplRCE', + 'primeChapMarchRCC', 'primeChapMarchRCE', + 'primeChapZonesRCC', 'primeChapZonesRCE', + 'primeEngValue', 'primeChapGarAddRCC', 'primeChapGarAddRCE', + 'priceFr250', 'priceFr400', 'priceFr2000' + ]; + + primeElements.forEach(id => { + const el = document.getElementById(id); + if (el) { + el.innerHTML = ' % invalide (> 100%)'; + } + }); + } + + // Fonction pour afficher toutes les primes (quand % valide) + function showAllPrimes() { + } + + // Fonction pour mettre à jour l'indicateur visuel du total des pourcentages + function updatePercentageIndicator(total) { + const indicator = document.getElementById('pourcentageTotal'); + if (!indicator) return; + + const displayTotal = total.toFixed(1); + indicator.textContent = `Total : ${displayTotal}%`; + + // Changer la couleur selon le total + if (total > 100) { + // ROUGE : Dépassement - INVALIDE + indicator.style.background = '#f44336'; + indicator.style.color = 'white'; + indicator.style.border = '3px solid #c62828'; + indicator.style.animation = 'pulse 1s infinite'; + } else if (total === 100 || Math.abs(total - 100) < 0.1) { + // VERT : Parfait - 100% + indicator.style.background = '#4caf50'; + indicator.style.color = 'white'; + indicator.style.border = '3px solid #2e7d32'; + indicator.style.animation = 'none'; + } else if (total >= 95) { + // ORANGE : Proche de 100% + indicator.style.background = '#ff9800'; + indicator.style.color = 'white'; + indicator.style.border = '3px solid #ef6c00'; + indicator.style.animation = 'none'; + } else { + // BLEU : En cours de saisie + indicator.style.background = 'white'; + indicator.style.color = 'darkblue'; + indicator.style.border = '2px solid darkblue'; + indicator.style.animation = 'none'; + } + } + + function calcGarAdd(data, primeRCC, primeRCE) { + let primeRCCres = Number(primeRCC) || 0; + let primeRCEres = Number(primeRCE) || 0; + let surPrimeRCE = 0; + const infosRCC = []; + const infosRCE = []; + + function writeToCard(inputId, message) { + const inputEl = document.getElementById(inputId); + if (!inputEl) return; + + const cardContent = inputEl.closest('.card-content'); + if (!cardContent) return; + + // Supprime l’ancien wrapper pour cet input + cardContent.querySelectorAll(`div.chip[data-for="${inputId}"]`).forEach(el => el.remove()); + + if (!message) return; + + // Wrapper + const wrapper = document.createElement("div"); + wrapper.classList.add("chip"); + wrapper.dataset.for = inputId; + + // Style : occupe sa propre ligne mais largeur adaptée au contenu + wrapper.style.display = "table"; // se comporte comme un bloc centré sur son contenu + wrapper.style.margin = "8px auto"; // centre horizontalement + + // Message + const p = document.createElement("p"); + p.dataset.for = inputId; + p.classList.add("helper-text", "red-text"); + p.style.display = "block"; // override helper-text { display: none; } + p.textContent = message; + + wrapper.appendChild(p); + cardContent.appendChild(wrapper); + } + + + + + + + // === Station de lavage (RCE forfait) === + const checkStation = document.getElementById('checkStationLavage'); + if (checkStation?.checked) { + const add = data.modRCE["Station de lavage"]; + if (typeof add === "number") { + surPrimeRCE += add; + const msg = `Prime RCE : +${add.toLocaleString('fr-FR', { style:'currency', currency:'EUR' })}`; + //infosRCE.push(msg); + writeToCard('checkStationLavage', msg); + } + } else { + writeToCard('checkStationLavage', null); + } + + // === Garage interne (RCE forfait) === + const checkGarage = document.getElementById('checkGarageInterne'); + if (checkGarage?.checked) { + const add = data.modRCE["Garage interne"]; + if (typeof add === "number") { + surPrimeRCE += add; + const msg = `Prime RCE : +${add.toLocaleString('fr-FR', { style:'currency', currency:'EUR' })}`; + //infosRCE.push(msg); + writeToCard('checkGarageInterne', msg); + } + } else { + writeToCard('checkGarageInterne', null); + } + + // === Comité Social et Economique (RCE forfait) === + const checkCSE = document.getElementById('checkCSE'); + if (checkCSE?.checked) { + const add = data.modRCE["Comité Social et Economique"]; + if (typeof add === "number") { + surPrimeRCE += add; + const msg = `Prime RCE : +${add.toLocaleString('fr-FR', { style:'currency', currency:'EUR' })}`; + //infosRCE.push(msg); + writeToCard('checkCSE', msg); + } + } else { + writeToCard('checkCSE', null); + } + + // === Addition des garanties RCE === + primeRCEres += surPrimeRCE; + + return { primeRCC: primeRCCres, primeRCE: primeRCEres, surPrimeRCE, infosRCC, infosRCE }; + } + + + + function calcSinistre(data, primeRCC, primeRCE) { + console.log('[calcSinistre] start', { primeRCC, primeRCE }); + + let primeRCCres = Number(primeRCC) || 0; + let primeRCEres = Number(primeRCE) || 0; + let mod = 1; + + const elSin = document.getElementById('sinistre'); + const elCA = document.getElementById('chiffreAffaire'); + const chip = document.getElementById('modSinistre'); + + if (!elSin || !elCA) { + console.warn('[calcSinistre] Missing #sinistre or #chiffreAffaire'); + } else { + const sinistreVal = toNumber(elSin.value); + const CA = toNumber(elCA.value); + + console.log('[calcSinistre] inputs', { sinistreVal, CA }); + + if (CA > 0 && sinistreVal >= 0) { + const ratio = sinistreVal / CA; + let key = 0.4; + if (ratio <= 0.4) key = 0.4; + else if (ratio <= 0.7) key = 0.7; + else key = 1; + + mod = data[key]; + console.log('[calcSinistre] ratio=', ratio.toFixed(3), 'key=', key, 'mod=', mod); + } else { + console.log('[calcSinistre] CA <= 0 or sinistre < 0 -> mod=1'); + } + } + + // Apply modulation to both RCC and RCE + primeRCCres *= mod; + primeRCEres *= mod; + + if (chip) { + chip.style.display = 'block'; + chip.innerHTML = 'Modulation sinistre :
x ' + mod.toLocaleString('fr-FR', { minimumFractionDigits: 2 }); + } else { + console.warn('[calcSinistre] #modSinistre not found'); + } + + console.log('[calcSinistre] result', { primeRCC: primeRCCres, primeRCE: primeRCEres, mod }); + return { primeRCC: primeRCCres, primeRCE: primeRCEres, mod }; + } + + + // --- Fonctions utilitaires --- + + function getMaxMiniRCC(activites, cot) { + let maxMini = 0; + activites.forEach(act => { + // Récupérer l'input/select pour cette activité + const inputEl = document.querySelector(`input[name="selectAct${act}"], select[name="selectAct${act}"]`); + if (!inputEl) return; + + const capitalSaisi = toNumber(inputEl.value); + if (capitalSaisi <= 0) return; + + // Déterminer le type de cotisation + const cotType = cot === 'revisable' ? 'revisable' : 'forfaitaire'; + + // Trouver la tranche la plus proche + const grilleAct = modRCPrimeMini?.[cotType]?.[act]; + if (grilleAct) { + const tranches = Object.keys(grilleAct).map(Number).sort((a,b)=>a-b); + const tranche = findClosestTranche(capitalSaisi, tranches); + const miniData = grilleAct[tranche]; + + if (miniData && typeof miniData.miniRCC === 'number') { + maxMini = Math.max(maxMini, miniData.miniRCC); + } + } + }); + return maxMini; + } + + function getMaxMiniRCE(activites, cot) { + let maxMini = 0; + activites.forEach(act => { + // Récupérer l'input/select pour cette activité + const inputEl = document.querySelector(`input[name="selectAct${act}"], select[name="selectAct${act}"]`); + if (!inputEl) return; + + const capitalSaisi = toNumber(inputEl.value); + if (capitalSaisi <= 0) return; + + // Déterminer le type de cotisation + const cotType = cot === 'revisable' ? 'revisable' : 'forfaitaire'; + + // Trouver la tranche la plus proche + const grilleAct = modRCPrimeMini?.[cotType]?.[act]; + if (grilleAct) { + const tranches = Object.keys(grilleAct).map(Number).sort((a,b)=>a-b); + const tranche = findClosestTranche(capitalSaisi, tranches); + const miniData = grilleAct[tranche]; + + if (miniData && typeof miniData.miniRCE === 'number') { + maxMini = Math.max(maxMini, miniData.miniRCE); + } + } + }); + return maxMini; + } + + + function calcTarifRCC({ + CA, + primeRCCbase, + primeRCEbase, + capitalTPPC, + nbVehicules, + coefTPPC, + franchiseCoef, + primeMini + }) { + // --- Prime RCC avec franchise --- + let primeFranchiseRCC = Number(primeRCCbase) * Number(franchiseCoef.modRCC || 1); + let primeFranchiseRCE = Number(primeRCEbase) * Number(franchiseCoef.modRCE || 1); + + // --- Ajout TPPC APRÈS franchise --- + const primeTPPC = capitalTPPC * nbVehicules * coefTPPC; + primeFranchiseRCC = primeFranchiseRCC + primeTPPC; + + // --- Calcul taux AVANT minima --- + let tauxRCC = CA > 0 ? (primeFranchiseRCC * 100 / CA).toFixed(2) : "0.00"; + let tauxRCE = CA > 0 ? (primeFranchiseRCE * 100 / CA).toFixed(2) : "0.00"; + + // --- Application des minima --- + let isMiniRCC = false; + let isMiniRCE = false; + + if (primeFranchiseRCC < primeMini[0]) { + tauxRCC = (primeFranchiseRCC * 100 / CA).toFixed(2); // Garder le taux avant mini + primeFranchiseRCC = primeMini[0]; + isMiniRCC = true; + } + + if (primeFranchiseRCE < primeMini[1]) { + tauxRCE = (primeFranchiseRCE * 100 / CA).toFixed(2); // Garder le taux avant mini + primeFranchiseRCE = primeMini[1]; + isMiniRCE = true; + } + + // --- Recalculer taux si PAS mini --- + if (!isMiniRCC && CA > 0) { + tauxRCC = (primeFranchiseRCC * 100 / CA).toFixed(2); + } + if (!isMiniRCE && CA > 0) { + tauxRCE = (primeFranchiseRCE * 100 / CA).toFixed(2); + } + + // --- Prime totale --- + const primeTotale = primeFranchiseRCC + primeFranchiseRCE; + + // --- Taux global --- + const tauxGlobal = CA > 0 ? ((primeTotale * 100 / CA).toFixed(2)) : "0.00"; + + return { + primeRCC: primeFranchiseRCC.toString(), + tauxRCC, + primeRCE: primeFranchiseRCE.toString(), + tauxRCE, + primeTotale: primeTotale.toString(), + tauxGlobal, + isMiniRCC, + isMiniRCE + }; + } + + + function calcTarifettes(primePJ, CA, activites, capitalTPPC, nbVehicules, coefTPPC, primeRCCbase, primeRCEbase) { + const cards = [ + { key: "250", priceId: "priceFr250", rccId: "rccFr250", rceId: "rceFr250", pjId: "pjFr250", txRccId: "tauxRccFr250", txRceId: "tauxRceFr250", txGlobId: "tauxGlobalFr250" }, + { key: "400", priceId: "priceFr400", rccId: "rccFr400", rceId: "rceFr400", pjId: "pjFr400", txRccId: "tauxRccFr400", txRceId: "tauxRceFr400", txGlobId: "tauxGlobalFr400" }, + { key: "10% avec mini 300 € et maxi 2000", priceId: "priceFr2000", rccId: "rccFr2000", rceId: "rceFr2000", pjId: "pjFr2000", txRccId: "tauxRccFr2000", txRceId: "tauxRceFr2000", txGlobId: "tauxGlobalFr2000" }, + ]; + + // Déterminer le type de cotisation + const cot = document.querySelector('input[name="cotisation"]:checked')?.value || 'revisable'; + const checkRCE = document.getElementById('checkRCE')?.checked || false; + const checkPJ = document.getElementById('checkPJ')?.checked || false; + + const primeMini = [ + getMaxMiniRCC(activites, cot), + getMaxMiniRCE(activites, cot) + ]; + + cards.forEach(card => { + const mods = modRCFranchise[card.key] || { modRCC: 1, modRCE: 1 }; + + const result = calcTarifRCC({ + CA, + primeRCCbase, + primeRCEbase, + capitalTPPC, + nbVehicules, + coefTPPC, + franchiseCoef: mods, + primeMini + }); + + // Calculer la PJ en fonction de la prime totale RCC+RCE + let primePJcalc = 0; + if (checkPJ) { + const primeTotaleAvantPJ = Number(result.primeRCC) + (checkRCE ? Number(result.primeRCE) : 0); + primePJcalc = calcPJ(primeTotaleAvantPJ); + } + + // Prime totale finale avec PJ + const primeTotaleFinale = Number(result.primeRCC) + (checkRCE ? Number(result.primeRCE) : 0) + primePJcalc; + const tauxGlobalFinal = CA > 0 ? formatNumber((Number(result.primeRCC) + (checkRCE ? Number(result.primeRCE) : 0)) * 100 / CA, 2) : "0.000"; + + // Récupérer les éléments du DOM + const elPrice = document.getElementById(card.priceId); + const elRCC = document.getElementById(card.rccId); + const elRCE = document.getElementById(card.rceId); + const elPJ = document.getElementById(card.pjId); + const elTxRCC = document.getElementById(card.txRccId); + const elTxRCE = document.getElementById(card.txRceId); + const elTxGlob = document.getElementById(card.txGlobId); + + // Récupérer les lignes parent pour masquer/afficher + const rowRCE = elRCE?.closest('p'); + const rowTxRCE = elTxRCE?.closest('p'); + const rowPJ = elPJ?.closest('p'); + const rowTxGlob = elTxGlob?.closest('p'); + + // Afficher le prix total + if (elPrice) elPrice.innerText = formatNumber(primeTotaleFinale, 2) + ' €'; + + // Afficher Prime RCC (toujours visible) + if (elRCC) { + elRCC.innerText = formatNumber(result.primeRCC, 2) + " €" + (result.isMiniRCC ? " (Mini)" : ""); + } + + // Afficher Prime RCE uniquement si cochée ET > 0 + if (rowRCE) { + if (checkRCE && result.primeRCE > 0) { + rowRCE.style.display = 'block'; + if (elRCE) { + elRCE.innerText = formatNumber(result.primeRCE, 2) + " €" + (result.isMiniRCE ? " (Mini)" : ""); + } + } else { + rowRCE.style.display = 'none'; + } + } + + // Afficher Prime PJ uniquement si cochée ET > 0 + if (rowPJ) { + if (checkPJ && primePJcalc > 0) { + rowPJ.style.display = 'block'; + if (elPJ) { + elPJ.innerText = formatNumber(primePJcalc, 2) + " €"; + } + } else { + rowPJ.style.display = 'none'; + } + } + + // En forfaitaire, ne pas afficher les taux (uniquement des primes fixes) + if (cot === 'forfaitaire') { + // Masquer tous les taux en forfaitaire + if (elTxRCC?.closest('p')) elTxRCC.closest('p').style.display = 'none'; + if (rowTxRCE) rowTxRCE.style.display = 'none'; + if (rowTxGlob) rowTxGlob.style.display = 'none'; + } else { + // En revisable, afficher les taux + if (elTxRCC?.closest('p')) { + elTxRCC.closest('p').style.display = 'block'; + elTxRCC.innerText = formatNumber(result.tauxRCC, 2) + " %"; + } + + if (rowTxRCE) { + if (checkRCE && result.primeRCE > 0) { + rowTxRCE.style.display = 'block'; + if (elTxRCE) { + elTxRCE.innerText = formatNumber(result.tauxRCE, 2) + " %"; + } + } else { + rowTxRCE.style.display = 'none'; + } + } + + if (rowTxGlob && CA > 0) { + rowTxGlob.style.display = 'block'; + if (elTxGlob) { + elTxGlob.innerText = tauxGlobalFinal + " %"; + } + } + } + }); + } + + // Fonction pour calculer la PJ selon la prime totale + function calcPJ(primeTotale) { + let primePJ = 0; + const tablePJ = modRCGarAdd?.modRCC?.["Protection juridique"]; + if (!tablePJ) return 0; + + // Parcourir les tranches de PJ et prendre la plus grande tranche inférieure à la prime totale + const tranches = Object.keys(tablePJ).map(Number).sort((a, b) => a - b); + for (const tranche of tranches) { + if (primeTotale >= tranche) { + primePJ = tablePJ[tranche]; + } else { + break; + } + } + return primePJ; + } + + + + function calcGlobal() { + // Vérification des pourcentages AVANT calcul + const allPourcentInputs = Array.from(document.querySelectorAll('.input-pourcent')).filter(p => p.offsetParent != null); + let totalPourcentCheck = 0; + allPourcentInputs.forEach(p => { + totalPourcentCheck += toNumber(p.value); + }); + + if (totalPourcentCheck > 100.01) { + // Total > 100% : BLOQUER tous les calculs + hideAllPrimes(); + return; + } + + const cot = document.querySelector('input[name="cotisation"]:checked')?.value; + let result = (cot === 'revisable') ? calcRevisable() : calcForfaitaire(); + + if (result) { + const capitalTPPCsaisi = toNumber(document.getElementById("selTPPCcapital")?.value); + const nbVehicules = toNumber(document.getElementById("selTPPCveh")?.value); + + // Trouver la tranche TPPC la plus proche + let capitalTPPC = 0; + let coefTPPC = 0; + if (capitalTPPCsaisi > 0 && modRCGarAdd?.modRCC?.["TPPC"]) { + const tranches = Object.keys(modRCGarAdd.modRCC.TPPC).map(Number).sort((a,b)=>a-b); + capitalTPPC = findClosestTranche(capitalTPPCsaisi, tranches); + coefTPPC = modRCGarAdd.modRCC.TPPC[capitalTPPC] || 0; + } + + calcTarifettes(result.primePJ, result.CA, result.activites, capitalTPPC, nbVehicules, coefTPPC, result.primeRCCbase, result.primeRCEbase); + } + } + + function calcRevisable() { + // ========= Variables centrales (déclarées au début) ========= + const capitalTPPCEl = document.getElementById("capital_TPPC"); + const vehiculeTPPCEl = document.getElementById("vehicule_TPPC"); + const coefTPPCEl = document.getElementById("garantie_prime_TPPC"); + + const capitalTPPC = toNumber(capitalTPPCEl?.value); + const nbVehicules = toNumber(vehiculeTPPCEl?.value); + const coefTPPC = toNumber(coefTPPCEl?.value) || 0.01; + let primeBaseRCC = 0; + let tauxBaseRCC = 0.000; + let primeRCC = 0; + let tauxRCC = 0.000; + let primeBaseRCE = 0; + let tauxBaseRCE = 0.000; + let primeRCE = 0; + let tauxRCE = 0.000; + let primePJ = 0; + let primeGlobal = 0; + let tauxGlobal = 0; + + // Tableaux de travail par activité + let primeBaseRCCparAct = []; + let primeBaseRCEparAct = []; + + // ========= Étape CA ========= + const modCA = calcModCA(document.getElementById('chiffreAffaire').value); + document.getElementById('modCA').innerHTML = + 'Mod. CA test :
x ' + modCA.toLocaleString('fr-FR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); + + // ========= Étape Activités (taux base) ========= + tauxBaseRCC = get_taux_base_RCC(modRCActRCC, "revisable"); + if (document.getElementById('checkRCE').checked === true) { + tauxBaseRCE = get_taux_base_RCE(modRCActRCE, "revisable"); + } + + const CA = toNumber(document.getElementById("chiffreAffaire").value); + + // ========= Calcul primes de base RCC ========= + for (let i = 0; i < tauxBaseRCC.length; i++) { + const pourcentInput = toNumber(document.getElementById("pourcent" + tauxBaseRCC[i].typeActivite)?.value); + const primeBase = (tauxBaseRCC[i].tauxBase / 100 * pourcentInput / 100 * CA); + primeBaseRCCparAct.push({ + typeActivite: tauxBaseRCC[i].typeActivite, + primeBase: primeBase + }); + } + + // ========= Calcul primes de base RCE si coché ========= + if (document.getElementById('checkRCE').checked) { + for (let i = 0; i < tauxBaseRCE.length; i++) { + const pourcentInput = toNumber(document.getElementById("pourcent" + tauxBaseRCE[i].typeActivite)?.value); + const primeBase = (tauxBaseRCE[i].tauxBase / 100 * pourcentInput / 100 * CA); + primeBaseRCEparAct.push({ + typeActivite: tauxBaseRCE[i].typeActivite, + primeBase: primeBase + }); + } + } + + // Sommes des primes de base (SANS mod CA) + primeBaseRCC = primeBaseRCCparAct.reduce((total, item) => total + item.primeBase, 0); + primeBaseRCE = primeBaseRCEparAct.reduce((total, item) => total + item.primeBase, 0); + + // UI (affichage sans mod CA) + document.getElementById('primeChapActRCC').innerHTML = + 'Prime de base RCC : ' + primeBaseRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }) + ''; + + document.getElementById('primeChapActRCE').innerHTML = + 'Prime de base RCE : ' + primeBaseRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }) + ''; + + // ========= Étape Activités complémentaires ========= + for (let i = 0; i < primeBaseRCCparAct.length; i++) { + primeBaseRCCparAct[i].primeBase *= calcModActCompl(modRCActCompl, primeBaseRCCparAct[i].typeActivite, "RCC", "revisable"); + } + + if (document.getElementById('checkRCE').checked) { + for (let i = 0; i < primeBaseRCEparAct.length; i++) { + primeBaseRCEparAct[i].primeBase *= calcModActCompl( + modRCActCompl, + primeBaseRCEparAct[i].typeActivite, + "RCE", + "revisable" + ); + } + } + + // Re-sommes (toujours sans mod CA) + primeBaseRCC = primeBaseRCCparAct.reduce((total, item) => total + item.primeBase, 0); + primeBaseRCE = primeBaseRCEparAct.reduce((total, item) => total + item.primeBase, 0); + + document.getElementById('primeChapActComplRCC').innerHTML = + 'Prime RCC : ' + primeBaseRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + document.getElementById('primeChapActComplRCE').innerHTML = + 'Prime RCE : ' + primeBaseRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + + // ========= Étape Marchandises (× par activité) + Mod CA ========= + const selections = getSelectedActivities(); + + for (let i = 0; i < primeBaseRCCparAct.length; i++) { + const actName = primeBaseRCCparAct[i].typeActivite; + const modMar = calcModMarchandises(modRCMar, actName, "RCC", "revisable"); + // Appliquer marchandises ET CA ensemble + primeBaseRCCparAct[i].primeBase = primeBaseRCCparAct[i].primeBase * modMar * modCA; + } + + if (document.getElementById('checkRCE').checked) { + for (let i = 0; i < primeBaseRCEparAct.length; i++) { + const actName = primeBaseRCEparAct[i].typeActivite; + const modMar = calcModMarchandises(modRCMar, actName, "RCE", "revisable"); + // Appliquer marchandises ET CA ensemble + primeBaseRCEparAct[i].primeBase = primeBaseRCEparAct[i].primeBase * modMar * modCA; + } + } + + // Recalcule totaux apres mods marchandises + CA + primeBaseRCC = primeBaseRCCparAct.reduce((total, item) => total + item.primeBase, 0); + primeBaseRCE = primeBaseRCEparAct.reduce((total, item) => total + item.primeBase, 0); + + // Maintenant primeRCC et primeRCE incluent déjà le mod CA + primeRCC = primeBaseRCC; + primeRCE = primeBaseRCE; + + // UI marchandises + document.getElementById('primeChapMarchRCC').innerHTML = + 'Prime RCC : ' + primeRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + document.getElementById('primeChapMarchRCE').innerHTML = + 'Prime RCE : ' + primeRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + + // ========= Étape Zones (× max RCC / × max RCE) ========= + const { mRCC, mRCE } = getZoneMods(modRCZone); + primeRCC *= mRCC; + primeRCE *= mRCE; + + // UI zones + document.getElementById('primeChapZonesRCC').innerHTML = + 'Prime RCC : ' + primeRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + document.getElementById('primeChapZonesRCE').innerHTML = + 'Prime RCE : ' + primeRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + + // ========= Étape Engagements complémentaires (×) ========= + const result = calcEngagCompl(modRCEngagCompl, primeRCC); + primeRCC = result.prime; + + // UI engagements + document.getElementById('primeEngValue').innerText = + 'Prime RCC : ' + primeRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + + const infoContainer = document.getElementById('primeEngInfos'); + infoContainer.innerHTML = ""; + result.infos.forEach(msg => { + const p = document.createElement("p"); + p.style.color = "#e53935"; + p.style.fontWeight = "300"; + p.style.fontSize = "0.85em"; + p.style.marginTop = "5px"; + p.style.fontStyle = "italic"; + p.innerText = msg; + infoContainer.appendChild(p); + }); // non necessaire, mais garder si utile, car fonctionne a 100% + + // ========= Étape Garanties additionnelles (RCE uniquement) ========= + const garAdd = calcGarAdd(modRCGarAdd, primeRCC, primeRCE); + // primeRCC reste inchangée (TPPC appliquée plus tard) + primeRCE = garAdd.primeRCE; // RCE avec Station lavage, Garage, CSE + + // UI RCC + const blocRCC = document.getElementById('primeChapGarAddRCC'); + blocRCC.innerHTML = 'Prime RCC : ' + primeRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }) + ''; + garAdd.infosRCC.forEach(msg => { + const p = document.createElement("p"); + p.style.color = "#e53935"; + p.style.fontWeight = "300"; + p.style.fontSize = "0.85em"; + p.style.marginTop = "5px"; + p.style.fontStyle = "italic"; + p.innerText = msg; + blocRCC.appendChild(p); + });// toujours inutile, pas necessaire + + // UI RCE + const blocRCE = document.getElementById('primeChapGarAddRCE'); + blocRCE.innerHTML = 'Prime RCE : ' + primeRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }) + ''; + garAdd.infosRCE.forEach(msg => { + const p = document.createElement("p"); + p.style.color = "#e53935"; + p.style.fontWeight = "300"; + p.style.fontSize = "0.85em"; + p.style.marginTop = "5px"; + p.style.fontStyle = "italic"; + p.innerText = msg; + blocRCE.appendChild(p); + }); // toujours inutile, pas necessaire + + // ========= Étape Sinistres ========= + const sin = calcSinistre(modRCSinistre, primeRCC, primeRCE); + primeRCC = sin.primeRCC; + primeRCE = sin.primeRCE; + + // ========= Sauvegarder les primes BASE pour les tarifettes (après sinistre, avant franchise) ========= + const primeRCCavantFranchise = primeRCC; + const primeRCEavantFranchise = primeRCE; + + // Les totaux RCC et RCE sont maintenant prêts pour les franchises + const totalRCC = primeRCC; + const totalRCE = primeRCE; + + // PJ (calculée dans calcTarifettes selon prime totale) + primePJ = 0; + + primeGlobal = totalRCC + totalRCE + primePJ; + + // UI + document.getElementById('modCA').innerHTML = + 'Modulation CA :
x ' + modCA.toLocaleString('fr-FR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); + + const activiteMap = { + "Voiturier / Loueur": "Voiturier/Loueur", + "Commissionnaire de Transport": "Commissionnaire de Transport", + "Déménageur": "Déménageur", + "Logistique": "Logistique", + "Autocariste": "Autocariste", + "Autres activites": "Autres activites" + }; + + function getSelectedActivites() { + const activites = []; + document.querySelectorAll('label input[type="checkbox"]:checked').forEach(cb => { + const span = cb.parentElement.querySelector('span'); + if (span) { + const labelText = span.textContent.trim(); + if (activiteMap[labelText]) { + activites.push(activiteMap[labelText]); + } + } + }); + return activites; + } + + + const activites = getSelectedActivites(); + + return { + CA, + activites, + primeRCC: totalRCC, + primeRCE: totalRCE, + primeRCCbase: primeRCCavantFranchise, + primeRCEbase: primeRCEavantFranchise, + primePJ, + primeGlobal + }; + } + + function calcForfaitaire() { + // ========= Variables centrales ========= + let primeBaseRCC = 0; + let primeBaseRCE = 0; + let primeRCC = 0; + let primeRCE = 0; + let primePJ = 0; + let primeGlobal = 0; + + // Tableaux de travail par activité + let primeBaseRCCparAct = []; + let primeBaseRCEparAct = []; + + // ========= Récupération du nombre de véhicules ========= + const nbrVehicule = toNumber(document.getElementById('nbrVehicule')?.value); + // Déterminer si c'est 1 ou 2 véhicules (par défaut 1) + const nbVehiculeKey = (nbrVehicule === 2) ? "deuxVehicules" : "unVehicule"; + + // ========= Étape Activités (primes forfaitaires de base) ========= + const selections = getSelectedActivities(); + + selections.forEach(activity => { + const typeActivite = activity.typeActivite; + const inputElement = document.querySelector( + `input[name="selectAct${typeActivite}"], select[name="selectAct${typeActivite}"]` + ); + + if (inputElement) { + const capitalSaisi = toNumber(inputElement.value); + + if (capitalSaisi <= 0) { + return; // Skip cette activité + } + + // Récupération de la prime forfaitaire RCC + const grilleActRCC = modRCActRCC.forfaitaire[typeActivite]; + if (grilleActRCC) { + const tranches = Object.keys(grilleActRCC).map(Number).sort((a, b) => a - b); + const tranche = findClosestTranche(capitalSaisi, tranches); + const primeData = grilleActRCC[tranche]; + + if (primeData && typeof primeData[nbVehiculeKey] === 'number') { + const primeBase = primeData[nbVehiculeKey]; + primeBaseRCCparAct.push({ + typeActivite: typeActivite, + primeBase: primeBase + }); + + // Affichage du taux (ici c'est une prime fixe) + const rccDiv = document.getElementById("tauxBaseRCCact" + typeActivite); + if (rccDiv) { + rccDiv.innerText = "RCC : " + primeBase.toFixed(2) + " €"; + } + + // Info tranche si différente + if (capitalSaisi !== tranche) { + const rowDiv = inputElement.closest('.row'); + if (rowDiv) { + const oldInfo = rowDiv.querySelector('.info-tranche'); + if (oldInfo) oldInfo.remove(); + + const infoSpan = document.createElement('span'); + infoSpan.className = 'info-tranche'; + infoSpan.style.color = '#e53935'; + infoSpan.style.fontSize = '0.8em'; + infoSpan.style.fontStyle = 'italic'; + infoSpan.innerText = `(tranche ${tranche.toLocaleString('fr-FR')} €)`; + + rowDiv.appendChild(infoSpan); + } + } + } + } + + // Récupération de la prime forfaitaire RCE si coché + if (document.getElementById('checkRCE')?.checked) { + const grilleActRCE = modRCActRCE.forfaitaire[typeActivite]; + if (grilleActRCE && grilleActRCE[nbVehiculeKey]) { + const primeBaseRCE_val = grilleActRCE[nbVehiculeKey].optimale || 0; + primeBaseRCEparAct.push({ + typeActivite: typeActivite, + primeBase: primeBaseRCE_val + }); + + // Affichage + const rceDiv = document.getElementById("tauxBaseRCEact" + typeActivite); + if (rceDiv) { + rceDiv.innerText = "RCE : " + primeBaseRCE_val.toFixed(2) + " €"; + } + } + } + } + }); + + // Sommes des primes de base + primeBaseRCC = primeBaseRCCparAct.reduce((total, item) => total + item.primeBase, 0); + primeBaseRCE = primeBaseRCEparAct.reduce((total, item) => total + item.primeBase, 0); + + // UI (affichage) + document.getElementById('primeChapActRCC').innerHTML = + 'Prime de base RCC : ' + primeBaseRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }) + ''; + + document.getElementById('primeChapActRCE').innerHTML = + 'Prime de base RCE : ' + primeBaseRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }) + ''; + + // ========= Étape Activités complémentaires ========= + for (let i = 0; i < primeBaseRCCparAct.length; i++) { + primeBaseRCCparAct[i].primeBase *= calcModActCompl(modRCActCompl, primeBaseRCCparAct[i].typeActivite, "RCC", "forfaitaire"); + } + + if (document.getElementById('checkRCE')?.checked) { + for (let i = 0; i < primeBaseRCEparAct.length; i++) { + primeBaseRCEparAct[i].primeBase *= calcModActCompl( + modRCActCompl, + primeBaseRCEparAct[i].typeActivite, + "RCE", + "forfaitaire" + ); + } + } + + // Re-sommes + primeBaseRCC = primeBaseRCCparAct.reduce((total, item) => total + item.primeBase, 0); + primeBaseRCE = primeBaseRCEparAct.reduce((total, item) => total + item.primeBase, 0); + + document.getElementById('primeChapActComplRCC').innerHTML = + 'Prime RCC : ' + primeBaseRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + document.getElementById('primeChapActComplRCE').innerHTML = + 'Prime RCE : ' + primeBaseRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + + // ========= Étape Marchandises (× par activité) ========= + for (let i = 0; i < primeBaseRCCparAct.length; i++) { + const actName = primeBaseRCCparAct[i].typeActivite; + const modMar = calcModMarchandises(modRCMar, actName, "RCC", "forfaitaire"); + primeBaseRCCparAct[i].primeBase = primeBaseRCCparAct[i].primeBase * modMar; + } + + if (document.getElementById('checkRCE')?.checked) { + for (let i = 0; i < primeBaseRCEparAct.length; i++) { + const actName = primeBaseRCEparAct[i].typeActivite; + const modMar = calcModMarchandises(modRCMar, actName, "RCE", "forfaitaire"); + primeBaseRCEparAct[i].primeBase = primeBaseRCEparAct[i].primeBase * modMar; + } + } + + // Recalcule totaux après mods marchandises + primeBaseRCC = primeBaseRCCparAct.reduce((total, item) => total + item.primeBase, 0); + primeBaseRCE = primeBaseRCEparAct.reduce((total, item) => total + item.primeBase, 0); + + primeRCC = primeBaseRCC; + primeRCE = primeBaseRCE; + + // UI marchandises + document.getElementById('primeChapMarchRCC').innerHTML = + 'Prime RCC : ' + primeRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + document.getElementById('primeChapMarchRCE').innerHTML = + 'Prime RCE : ' + primeRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + + // ========= Étape Zones (× max RCC / × max RCE) ========= + const { mRCC, mRCE } = getZoneMods(modRCZone); + primeRCC *= mRCC; + primeRCE *= mRCE; + + // UI zones + document.getElementById('primeChapZonesRCC').innerHTML = + 'Prime RCC : ' + primeRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + document.getElementById('primeChapZonesRCE').innerHTML = + 'Prime RCE : ' + primeRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + + // ========= Étape Engagements complémentaires (×) ========= + const result = calcEngagCompl(modRCEngagCompl, primeRCC); + primeRCC = result.prime; + + // UI engagements + document.getElementById('primeEngValue').innerText = + 'Prime RCC : ' + primeRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }); + + const infoContainer = document.getElementById('primeEngInfos'); + infoContainer.innerHTML = ""; + result.infos.forEach(msg => { + const p = document.createElement("p"); + p.style.color = "#e53935"; + p.style.fontWeight = "300"; + p.style.fontSize = "0.85em"; + p.style.marginTop = "5px"; + p.style.fontStyle = "italic"; + p.innerText = msg; + infoContainer.appendChild(p); + }); + + // ========= Étape Garanties additionnelles (RCE uniquement) ========= + const garAdd = calcGarAdd(modRCGarAdd, primeRCC, primeRCE); + primeRCE = garAdd.primeRCE; + + // UI RCC + const blocRCC = document.getElementById('primeChapGarAddRCC'); + blocRCC.innerHTML = 'Prime RCC : ' + primeRCC.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }) + ''; + garAdd.infosRCC.forEach(msg => { + const p = document.createElement("p"); + p.style.color = "#e53935"; + p.style.fontWeight = "300"; + p.style.fontSize = "0.85em"; + p.style.marginTop = "5px"; + p.style.fontStyle = "italic"; + p.innerText = msg; + blocRCC.appendChild(p); + }); + + // UI RCE + const blocRCE = document.getElementById('primeChapGarAddRCE'); + blocRCE.innerHTML = 'Prime RCE : ' + primeRCE.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' }) + ''; + garAdd.infosRCE.forEach(msg => { + const p = document.createElement("p"); + p.style.color = "#e53935"; + p.style.fontWeight = "300"; + p.style.fontSize = "0.85em"; + p.style.marginTop = "5px"; + p.style.fontStyle = "italic"; + p.innerText = msg; + blocRCE.appendChild(p); + }); + + // ========= Étape Sinistres (OPTIONNEL en forfaitaire - basé sur CA) ========= + // Note: En forfaitaire, normalement pas de sinistre car pas de CA + // Mais on garde la logique au cas où il y aurait un CA saisi + const CA = toNumber(document.getElementById("chiffreAffaire")?.value); + if (CA > 0) { + const sin = calcSinistre(modRCSinistre, primeRCC, primeRCE); + primeRCC = sin.primeRCC; + primeRCE = sin.primeRCE; + } + + // ========= Sauvegarder les primes BASE pour les tarifettes ========= + const primeRCCavantFranchise = primeRCC; + const primeRCEavantFranchise = primeRCE; + + // Les totaux RCC et RCE sont maintenant prêts + const totalRCC = primeRCC; + const totalRCE = primeRCE; + + // PJ (calculée dans calcTarifettes selon prime totale) + primePJ = 0; + + primeGlobal = totalRCC + totalRCE + primePJ; + + const activiteMap = { + "Voiturier / Loueur": "Voiturier/Loueur", + "Commissionnaire de Transport": "Commissionnaire de Transport", + "Déménageur": "Déménageur", + "Logistique": "Logistique", + "Autocariste": "Autocariste", + "Autres activites": "Autres activites" + }; + + function getSelectedActivites() { + const activites = []; + document.querySelectorAll('label input[type="checkbox"]:checked').forEach(cb => { + const span = cb.parentElement.querySelector('span'); + if (span) { + const labelText = span.textContent.trim(); + if (activiteMap[labelText]) { + activites.push(activiteMap[labelText]); + } + } + }); + return activites; + } + + const activites = getSelectedActivites(); + + return { + CA: CA || 0, + activites, + primeRCC: totalRCC, + primeRCE: totalRCE, + primeRCCbase: primeRCCavantFranchise, + primeRCEbase: primeRCEavantFranchise, + primePJ, + primeGlobal + }; + } + + function getZoneMods(modRCZone) { + const zones = [ + { id: 'zone1', label: 'France Métropolitaine et pays limitrophes' }, + { id: 'zone2', label: 'Union Européenne' }, + { id: 'zone3', label: 'Autres pays européens sauf Russie et Ukraine (y compris UK et Norvège)' }, + { id: 'zone4', label: 'Pays du Maghreb et Amérique du Nord ( USA / Canada / Mexique )' }, + { id: 'zone5', label: 'Amérique Centrale et Sud / Caraïbes, Asie et Océanie' }, + { id: 'zone6', label: 'Afrique Hors Maghreb / Proche Orient / Moyen Orient' } + ]; + let mRCC = 1, mRCE = 1; + zones.forEach(z => { + const cb = document.getElementById(z.id); + if (cb && cb.checked) { + const m = modRCZone[z.label]; + if (m) { + if (typeof m.modRCC === 'number') mRCC = Math.max(mRCC, m.modRCC); + if (typeof m.modRCE === 'number') mRCE = Math.max(mRCE, m.modRCE); + } + } + }); + return { mRCC, mRCE }; + } + + + function handleLoadHistoriqueBtn() { + var selectedId = document.getElementById('idSelect').value; + + if (selectedId != "") { + fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${selectedId}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }) + .then(response => response.json()) + .then(data => { + if (data.valid) { + window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`; + } else { + console.log('Echec lors de la mise à jour de la relation id contrat - id client :', data); + } + }); + } + } + + //Appel pour recevoir les constantes + async function constantsJSON() { + try { + const responsesJSON = await Promise.all([ + fetch('/rc/modulo/CARC'), + fetch('/rc/modulo/activiteRCC'), + fetch('/rc/modulo/activiteRCE'), + fetch('/rc/modulo/activiteComplRC'), + fetch('/rc/modulo/marchandiseRC'), + fetch('/rc/modulo/zoneRC'), + fetch('/rc/modulo/engagComplRC'), + fetch('/rc/modulo/garAdditionelRC'), + fetch('/rc/modulo/sinistreRC'), + fetch('/rc/modulo/franchiseRC'), + fetch('/rc/modulo/primeMiniRC') + ]); + const jsonResponses = await Promise.all(responsesJSON.map(r => r.json())); // Récupérer toutes les réponses JSON + + // Extraire la valeur objRetourne de chaque réponse + [ + modRCCA, + modRCActRCC, + modRCActRCE, + modRCActCompl, + modRCMar, + modRCZone, + modRCEngagCompl, + modRCGarAdd, + modRCSinistre, + modRCFranchise, + modRCPrimeMini + ] = jsonResponses.map(response => response.objRetourne); // Adapter pour extraire objRetourne + } catch (err) { + throw err; + } + } + + function resetInputs() { + // Sélection des éléments input pourcentage + const pourcentInputs = document.querySelectorAll('.input-pourcent'); + // Calculer le nombre d'inputs visibles + const visibleInputs = Array.from(pourcentInputs).filter(input => input.offsetParent != null); + + // Vérifier s'il y a des inputs visibles + if (visibleInputs.length > 0) { + // Réinitialiser les valeurs + visibleInputs.forEach(p => { + p.value = ''; // Réinitialiser la valeur + const correspondingIsSetInput = document.getElementById('isSet' + p.id.replace('pourcent', '')); + correspondingIsSetInput.value = 'false'; // Réinitialiser isSet + p.classList.remove('set'); // Remettre le fond d'origine + }); + + // Calculer le pourcentage à répartir + const pourcentToAdd = (100 / visibleInputs.length).toFixed(2); + + // Répartir le pourcentage entre les inputs visibles + visibleInputs.forEach(p => { + p.value = pourcentToAdd; // Assigner la valeur calculée + // Ne pas changer isSet à true ici + // correspondingIsSetInput.value reste 'false' + }); + + // Mettre à jour l'indicateur + updatePercentageIndicator(100); + } + } + + function get_taux_base_RCC(grille_mod_RCC, cot) { + const tauxOptimaux = []; + const selections = getSelectedActivities(); + + selections.forEach(activity => { + const typeActivite = activity.typeActivite; + const inputElement = document.querySelector( + `input[name="selectAct${typeActivite}"], select[name="selectAct${typeActivite}"]` + ); + + if (inputElement) { + const capitalSaisi = toNumber(inputElement.value); + + if (capitalSaisi <= 0) { + return; + } + + if (cot === 'revisable') { + const grilleAct = grille_mod_RCC.revisable[typeActivite]; + if (grilleAct) { + const tranches = Object.keys(grilleAct).map(Number).sort((a, b) => a - b); + const tranche = findClosestTranche(capitalSaisi, tranches); + const tauxBase = grilleAct[tranche]; + + if (typeof tauxBase === 'number') { + // 1. Mettre à jour la div RCC avec uniquement le texte principal + const rccDiv = document.getElementById("tauxBaseRCCact" + typeActivite); + if (rccDiv) { + rccDiv.innerText = "RCC : " + tauxBase.toFixed(3) + " %"; + } + if (capitalSaisi !== tranche) { + const rowDiv = inputElement.closest('.row'); + if (rowDiv) { + const oldInfo = rowDiv.querySelector('.info-tranche'); + if (oldInfo) oldInfo.remove(); + + const infoSpan = document.createElement('span'); + infoSpan.className = 'info-tranche'; + infoSpan.style.color = '#e53935'; + infoSpan.style.fontSize = '0.8em'; + infoSpan.style.fontStyle = 'italic'; + infoSpan.innerText = `(tranche ${tranche.toLocaleString('fr-FR')} €)`; + + rowDiv.appendChild(infoSpan); + } + } + + tauxOptimaux.push({ typeActivite, capital: tranche, tauxBase }); + } + } + } else if (cot === 'forfaitaire') { + console.log("TODO FORFAITAIRE"); + } + } + }); + + return tauxOptimaux; + } + + + function get_taux_base_RCE(grille_mod_RCE, cot) { + const tauxOptimaux = []; + const selections = getSelectedActivities(); + + selections.forEach(activity => { + const typeActivite = activity.typeActivite; + const inputElement = document.querySelector(`input[name="selectAct${typeActivite}"], select[name="selectAct${typeActivite}"]`); + + if (inputElement) { + const capitalSaisi = toNumber(inputElement.value); + + // Si rien n'est saisi ou invalide, ignorer + if (capitalSaisi <= 0) { + return; + } + + // Traitement selon le type de cotisation + if (cot == 'revisable') { + if (grille_mod_RCE.revisable[typeActivite]) { + const tauxBase = grille_mod_RCE.revisable[typeActivite]["optimale"]; + document.getElementById("tauxBaseRCEact" + typeActivite).innerHTML = "RCE : " + tauxBase.toFixed(3) + " %" + tauxOptimaux.push({ typeActivite, tauxBase }); + } + } else if (cot == 'forfaitaire') { + console.log("TODO FORFAITAIRE"); // ehhh + } + } + }); + + return tauxOptimaux; + } + + function getSelectedActivities() { + const selections = []; + + // Récupérer le nombre de véhicules depuis l'input + const nombreVehicules = document.getElementById('nbrVehicule').value || null; // Valeur par défaut à null si vide + + if (document.getElementById('checkVoiturier').checked) { + const listActComplChecked = []; + const listMarChecked = []; + + // Récupérer les activités complémentaires + const actComplCheckboxes = document.querySelectorAll('[name="actComplVoiturier/Loueur"] input[type="checkbox"]:checked'); + actComplCheckboxes.forEach(checkbox => { + listActComplChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + // Récupérer les marchandises + const marComplCheckboxes = document.querySelectorAll('[name="marVoiturier/Loueur"] input[type="checkbox"]:checked'); + marComplCheckboxes.forEach(checkbox => { + listMarChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + selections.push({ + typeActivite: "Voiturier/Loueur", + nombreVehicules: nombreVehicules, + listActComplChecked: listActComplChecked, + listMarChecked: listMarChecked + }); + } + + if (document.getElementById('checkCommissionnaire').checked) { + const listActComplChecked = []; + const listMarChecked = []; + + // Récupérer les activités complémentaires + const actComplCheckboxes = document.querySelectorAll('[name="actComplCommissionnaire de Transport"] input[type="checkbox"]:checked'); + actComplCheckboxes.forEach(checkbox => { + listActComplChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + // Récupérer les marchandises + const marComplCheckboxes = document.querySelectorAll('[name="marCommissionnaire de Transport"] input[type="checkbox"]:checked'); + marComplCheckboxes.forEach(checkbox => { + listMarChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + selections.push({ + typeActivite: "Commissionnaire de Transport", + nombreVehicules: null, + listActComplChecked: listActComplChecked, + listMarChecked: listMarChecked + }); + } + + if (document.getElementById('checkDemenageur').checked) { + const listActComplChecked = []; + const listMarChecked = []; + + // Récupérer les activités complémentaires + const actComplCheckboxes = document.querySelectorAll('[name="actComplDéménageur"] input[type="checkbox"]:checked'); + actComplCheckboxes.forEach(checkbox => { + listActComplChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + // Récupérer les marchandises + const marComplCheckboxes = document.querySelectorAll('[name="marDéménageur"] input[type="checkbox"]:checked'); + marComplCheckboxes.forEach(checkbox => { + listMarChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + selections.push({ + typeActivite: "Déménageur", + nombreVehicules: nombreVehicules, + listActComplChecked: listActComplChecked, + listMarChecked: listMarChecked + }); + } + + if (document.getElementById('checkLogistique').checked) { + const listActComplChecked = []; + const listMarChecked = []; + + // Récupérer les activités complémentaires + const actComplCheckboxes = document.querySelectorAll('[name="actComplLogistique"] input[type="checkbox"]:checked'); + actComplCheckboxes.forEach(checkbox => { + listActComplChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + // Récupérer les marchandises + const marComplCheckboxes = document.querySelectorAll('[name="marLogistique"] input[type="checkbox"]:checked'); + marComplCheckboxes.forEach(checkbox => { + listMarChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + selections.push({ + typeActivite: "Logistique", + nombreVehicules: null, + listActComplChecked: listActComplChecked, + listMarChecked: listMarChecked + }); + } + + if (document.getElementById('checkAutres').checked) { + const listActComplChecked = []; + const listMarChecked = []; + + // Récupérer les activités complémentaires + const actComplCheckboxes = document.querySelectorAll('[name="actComplAutres activites"] input[type="checkbox"]:checked'); + actComplCheckboxes.forEach(checkbox => { + listActComplChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + // Récupérer les marchandises + const marComplCheckboxes = document.querySelectorAll('[name="marAutres activites"] input[type="checkbox"]:checked'); + marComplCheckboxes.forEach(checkbox => { + listMarChecked.push(checkbox.nextElementSibling.textContent.trim()); + }); + + selections.push({ + typeActivite: "Autres activites", + nombreVehicules: nombreVehicules, + listActComplChecked: listActComplChecked, + listMarChecked: listMarChecked + }); + } + // Ajoutez d'autres cas si nécessaire + + return selections; + } + + // Fonction pour sauvegarder les données tarifRC dans la base + async function saveTarifRC() { + if (!rc || !contrat) { + console.error('Données manquantes pour sauvegarder le tarif RC'); + return { valid: false, message: 'Données manquantes' }; + } + + // Préparer les références aux champs selon les différents templates possibles + const caInput = getElementByIdFlexible('CA') || getElementByIdFlexible('chiffreAffaire'); + const nbVehInput = getElementByIdFlexible('nbVehicules') || getElementByIdFlexible('nbrVehicule'); + + const capitalVoiturierInput = getElementByIdFlexible('capitalVoiturier') || document.querySelector('input[name="selectActVoiturier/Loueur"]'); + const capitalCommissionnaireInput = getElementByIdFlexible('capitalCommissionnaire') || document.querySelector('input[name="selectActCommissionnaire de Transport"]') || document.querySelector('input[name="selectActCommissionnaireDeTransport"]'); + const capitalDemenageurInput = getElementByIdFlexible('capitalDemenageur') || document.querySelector('input[name="selectActDéménageur"]') || document.querySelector('input[name="selectActDemenageur"]'); + const capitalLogistiqueInput = getElementByIdFlexible('capitalLogistique') || document.querySelector('input[name="selectActLogistique"]'); + const capitalAutocaristeInput = getElementByIdFlexible('capitalAutocariste') || document.querySelector('input[name="selectActAutocariste"]'); + const capitalAutresInput = getElementByIdFlexible('capitalAutres') || document.querySelector('input[name="selectActAutres activites"]') || document.querySelector('input[name="selectActAutresActivites"]'); + + const pctVoiturierInput = getElementByIdFlexible('pourcent_voiturier') || getElementByIdFlexible('pourcentVoiturier/Loueur'); + const pctCommissionnaireInput = getElementByIdFlexible('pourcent_commissionnaire') || getElementByIdFlexible('pourcentCommissionnaire de Transport') || getElementByIdFlexible('pourcentCommissionnaireDeTransport'); + const pctDemenageurInput = getElementByIdFlexible('pourcent_demenageur') || getElementByIdFlexible('pourcentDéménageur') || getElementByIdFlexible('pourcentDemenageur'); + const pctLogistiqueInput = getElementByIdFlexible('pourcent_logistique') || getElementByIdFlexible('pourcentLogistique'); + const pctAutocaristeInput = getElementByIdFlexible('pourcent_autocariste') || getElementByIdFlexible('pourcentAutocariste'); + const pctAutresInput = getElementByIdFlexible('pourcent_autres') || getElementByIdFlexible('pourcentAutres activites') || getElementByIdFlexible('pourcentAutresActivites'); + + // ===== ÉTAPE 1: Collecter les données communes à sauvegarder dans RC principal ===== + const rcMainData = { + typeCotisation: document.querySelector('input[name="cotisation"]:checked')?.value, + chiffreAffaires: toNumber(caInput?.value ?? caInput?.textContent), + nombreVehicules: Math.max(0, Math.round(toNumber(nbVehInput?.value ?? nbVehInput?.textContent))), + checkRCE: document.getElementById('checkRCE')?.checked || false, + checkVoiturier: document.getElementById('checkVoiturier')?.checked || false, + capitalVoiturier: toNumber(capitalVoiturierInput?.value ?? capitalVoiturierInput?.textContent), + checkCommissionnaire: document.getElementById('checkCommissionnaire')?.checked || false, + capitalCommissionnaire: toNumber(capitalCommissionnaireInput?.value ?? capitalCommissionnaireInput?.textContent), + checkDemenageur: document.getElementById('checkDemenageur')?.checked || false, + capitalDemenageur: toNumber(capitalDemenageurInput?.value ?? capitalDemenageurInput?.textContent), + checkLogistique: document.getElementById('checkLogistique')?.checked || false, + capitalLogistique: toNumber(capitalLogistiqueInput?.value ?? capitalLogistiqueInput?.textContent), + checkAutocariste: document.getElementById('checkAutocariste')?.checked || false, + capitalAutocariste: toNumber(capitalAutocaristeInput?.value ?? capitalAutocaristeInput?.textContent), + checkAutres: document.getElementById('checkAutres')?.checked || false, + capitalAutres: toNumber(capitalAutresInput?.value ?? capitalAutresInput?.textContent), + + // Activités complémentaires (JSON) - collectées avec les bons noms + actComplVoiturier: collectActivitesComplJSON('voiturier'), + actComplCommissionnaire: collectActivitesComplJSON('commissionnaire'), + actComplDemenageur: collectActivitesComplJSON('demenageur'), + actComplLogistique: collectActivitesComplJSON('logistique'), + + // Marchandises (JSON) - collectées avec les bons noms + marchandisesVoiturier: collectMarchandisesJSON('voiturier'), + marchandisesCommissionnaire: collectMarchandisesJSON('commissionnaire'), + marchandisesDemenageur: collectMarchandisesJSON('demenageur'), + marchandisesLogistique: collectMarchandisesJSON('logistique'), + marchandisesAutocariste: collectMarchandisesJSON('autocariste'), + marchandisesAutres: collectMarchandisesJSON('autres'), + + // Zones + zone1: document.getElementById('zone1')?.checked || false, + zone2: document.getElementById('zone2')?.checked || false, + zone3: document.getElementById('zone3')?.checked || false, + zone4: document.getElementById('zone4')?.checked || false, + zone5: document.getElementById('zone5')?.checked || false, + zone6: document.getElementById('zone6')?.checked || false, + + //commentaire + commentaire: document.getElementById('commentaire')?.value, + }; + + // ===== LOGS DE DÉBOGAGE ===== + console.log('📊 === DÉBUT SAUVEGARDE TARIF RC ==='); + console.log('🔍 rcMainData:', rcMainData); + + // ===== ÉTAPE 2: Collecter les résultats de calculs pour tarifRC ===== + const tarifRCData = { + sinistre: toNumber(document.getElementById('sinistre')?.value), + pourcentageVoiturier: toNumber(pctVoiturierInput?.value ?? pctVoiturierInput?.textContent), + isSetVoiturier: Boolean(pctVoiturierInput?.value?.trim()), + pourcentageCommissionnaire: toNumber(pctCommissionnaireInput?.value ?? pctCommissionnaireInput?.textContent), + isSetCommissionnaire: Boolean(pctCommissionnaireInput?.value?.trim()), + pourcentageDemenageur: toNumber(pctDemenageurInput?.value ?? pctDemenageurInput?.textContent), + isSetDemenageur: Boolean(pctDemenageurInput?.value?.trim()), + pourcentageLogistique: toNumber(pctLogistiqueInput?.value ?? pctLogistiqueInput?.textContent), + isSetLogistique: Boolean(pctLogistiqueInput?.value?.trim()), + pourcentageAutocariste: toNumber(pctAutocaristeInput?.value ?? pctAutocaristeInput?.textContent), + isSetAutocariste: Boolean(pctAutocaristeInput?.value?.trim()), + pourcentageAutres: toNumber(pctAutresInput?.value ?? pctAutresInput?.textContent), + isSetAutres: Boolean(pctAutresInput?.value?.trim()), + + // Tarifs pour franchise 250 + primeRCC_250: toNumber(document.getElementById('rccFr250')?.textContent), + primeRCE_250: toNumber(document.getElementById('rceFr250')?.textContent), + primePJ_250: toNumber(document.getElementById('pjFr250')?.textContent), + primeTotal_250: toNumber(document.getElementById('priceFr250')?.textContent), + tauxRCC_250: toNumber(document.getElementById('tauxRccFr250')?.textContent), + tauxRCE_250: toNumber(document.getElementById('tauxRceFr250')?.textContent), + tauxGlobal_250: toNumber(document.getElementById('tauxGlobalFr250')?.textContent), + + // Tarifs pour franchise 400 + primeRCC_400: toNumber(document.getElementById('rccFr400')?.textContent), + primeRCE_400: toNumber(document.getElementById('rceFr400')?.textContent), + primePJ_400: toNumber(document.getElementById('pjFr400')?.textContent), + primeTotal_400: toNumber(document.getElementById('priceFr400')?.textContent), + tauxRCC_400: toNumber(document.getElementById('tauxRccFr400')?.textContent), + tauxRCE_400: toNumber(document.getElementById('tauxRceFr400')?.textContent), + tauxGlobal_400: toNumber(document.getElementById('tauxGlobalFr400')?.textContent), + + // Tarifs pour franchise 2000 + primeRCC_2000: toNumber(document.getElementById('rccFr2000')?.textContent), + primeRCE_2000: toNumber(document.getElementById('rceFr2000')?.textContent), + primePJ_2000: toNumber(document.getElementById('pjFr2000')?.textContent), + primeTotal_2000: toNumber(document.getElementById('priceFr2000')?.textContent), + tauxRCC_2000: toNumber(document.getElementById('tauxRccFr2000')?.textContent), + tauxRCE_2000: toNumber(document.getElementById('tauxRceFr2000')?.textContent), + tauxGlobal_2000: toNumber(document.getElementById('tauxGlobalFr2000')?.textContent), + + // Franchise choisie + franchiseChoisie: window.franchiseChoisie || null, + + // Engagements complémentaires (dans tarifRC, pas dans rc!) + checkDomImmat: document.getElementById('checkDomImmat')?.checked || false, + capitalDomImmat: toNumber(document.getElementById('inputDomImmat')?.value), + checkContConf: document.getElementById('checkContConf')?.checked || false, + capitalContConf: toNumber(document.getElementById('inputContConf')?.value), + checkDiffInv: document.getElementById('checkDiffInv')?.checked || false, + capitalDiffInv: toNumber(document.getElementById('inputDiffInv')?.value), + + // Garanties additionnelles (dans tarifRC, pas dans rc!) + checkStationLavage: document.getElementById('checkStationLavage')?.checked || false, + checkGarageInterne: document.getElementById('checkGarageInterne')?.checked || false, + checkCSE: document.getElementById('checkCSE')?.checked || false, + checkTPPC: document.getElementById('checkTPPC')?.checked || false, + capitalTPPC: toNumber(document.getElementById('selTPPCcapital')?.value), + vehiculesTPPC: Math.max(0, Math.round(toNumber(document.getElementById('selTPPCveh')?.value))), + checkPJ: document.getElementById('checkPJ')?.checked || false, + + tarifcommercial: toNumber(document.getElementById('tarifCom')?.value), + }; + + console.log('tarifRCData:', tarifRCData); + + try { + let idTarifRC; + let rcId = rc?.id; + + // ===== VÉRIFIER SI RC EXISTE, SINON LE CRÉER ===== + if (!rcId) { + console.log('RC n\'existe pas encore, création en cours...'); + const createRCResponse = await fetch(`/rc/create`, { + method: 'POST', + body: JSON.stringify({ typeCotisation: rcMainData.typeCotisation }), + headers: { 'Content-Type': 'application/json' }, + }); + const createRCData = await createRCResponse.json(); + + if (createRCData.valid) { + rcId = createRCData.rc.id; + // Mettre à jour le contrat avec le nouvel ID RC + await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${rcId}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }); + } else { + console.error('Échec de la création de RC:', createRCData.message); + return { valid: false, message: 'Échec création RC' }; + } + } + + // ===== ÉTAPE 3: Sauvegarder/Mettre à jour tarifRC ===== + if (tarif && tarif.id) { + // Mettre à jour un enregistrement tarifRC existant + console.log(`📝 Mise à jour tarifRC existant (ID: ${tarif.id})`); + const response = await fetch(`/rc/tarif/update/${tarif.id}`, { + method: 'POST', + body: JSON.stringify(tarifRCData), + headers: { + 'Content-Type': 'application/json', + }, + }); + const data = await response.json(); + console.log('📥 Réponse serveur tarifRC update:', data); + if (data.valid) { + idTarifRC = data.tarifRc.id; + } else { + console.error('❌ Échec de la mise à jour de tarifRC:', data.message); + return { valid: false, message: data.message }; + } + } else { + // Créer un nouvel enregistrement tarifRC + console.log('📝 Création nouveau tarifRC'); + const response = await fetch(`/rc/tarif/create`, { + method: 'POST', + body: JSON.stringify(tarifRCData), + headers: { + 'Content-Type': 'application/json', + }, + }); + const data = await response.json(); + console.log('📥 Réponse serveur tarifRC create:', data); + if (data.valid) { + idTarifRC = data.tarifRc.id; + } else { + console.error('❌ Échec de la création de tarifRC:', data.message); + return { valid: false, message: data.message }; + } + } + + // ===== ÉTAPE 4: Mettre à jour RC principal avec les données communes ET la référence tarifRC ===== + rcMainData.tarifRC = idTarifRC; // Ajouter la référence à tarifRC + + console.log(`📝 Mise à jour RC principal (ID: ${rcId}) avec référence tarifRC: ${idTarifRC}`); + console.log('🔍 Données envoyées pour RC:', rcMainData); + + const updateRCResponse = await fetch(`/rc/update/${rcId}`, { + method: 'POST', + body: JSON.stringify(rcMainData), + headers: { + 'Content-Type': 'application/json', + }, + }); + const updateRCData = await updateRCResponse.json(); + console.log('📥 Réponse serveur RC update:', updateRCData); + + if (!updateRCData.valid) { + console.error('❌ Échec de la mise à jour de RC principal:', updateRCData.message); + return { valid: false, message: 'Échec mise à jour RC principal' }; + } + + console.log('✅ === TARIF RC SAUVEGARDÉ AVEC SUCCÈS ==='); + console.log('✅ RC ID:', rcId, '| TarifRC ID:', idTarifRC); + return { valid: true, idTarifRC, idRC: rcId }; + } catch (error) { + console.error('Erreur lors de la sauvegarde de tarifRC:', error); + return { valid: false, message: error.message }; + } + } + + // Fonction helper pour collecter les activités complémentaires + function collectActivitesComplJSON(typeActivite) { + let name; + switch(typeActivite.toLowerCase()) { + case 'voiturier': + name = 'actComplVoiturier/Loueur'; + break; + case 'commissionnaire': + name = 'actComplCommissionnaire de Transport'; + break; + case 'demenageur': + name = 'actComplDéménageur'; + break; + case 'logistique': + name = 'actComplLogistique'; + break; + default: + return JSON.stringify([]); + } + + const checkboxes = document.querySelectorAll(`[name="${name}"] input[type="checkbox"]:checked`); + const activites = []; + checkboxes.forEach(cb => { + const text = cb.nextElementSibling ? cb.nextElementSibling.textContent.trim() : cb.value; + activites.push(text); + }); + return JSON.stringify(activites); + } + + // Fonction helper pour collecter les marchandises + function collectMarchandisesJSON(typeActivite) { + let name; + switch(typeActivite.toLowerCase()) { + case 'voiturier': + name = 'marVoiturier/Loueur'; + break; + case 'commissionnaire': + name = 'marCommissionnaire de Transport'; + break; + case 'demenageur': + name = 'marDéménageur'; + break; + case 'logistique': + name = 'marLogistique'; + break; + case 'autocariste': + name = 'marAutocariste'; + break; + case 'autres': + name = 'marAutres activites'; + break; + default: + return JSON.stringify([]); + } + + const checkboxes = document.querySelectorAll(`[name="${name}"] input[type="checkbox"]:checked`); + const marchandises = []; + checkboxes.forEach(cb => { + const text = cb.nextElementSibling ? cb.nextElementSibling.textContent.trim() : cb.value; + marchandises.push(text); + }); + return JSON.stringify(marchandises); + } + + // Fonction pour gérer les clics sur les boutons de tariffettes + function setupTarifetteButtons() { + const tarifetteButtons = document.querySelectorAll('.franchise-card button[name]'); + tarifetteButtons.forEach(button => { + button.addEventListener('click', async function(e) { + e.preventDefault(); + const franchiseValue = this.getAttribute('name'); + + // Mettre à jour la variable globale et l'UI + window.franchiseChoisie = franchiseValue; + console.log(`Tariffette sélectionnée: ${franchiseValue}€`); + + // Mettre en surbrillance la carte sélectionnée + document.querySelectorAll('.franchise-card').forEach(c => c.classList.remove('selected')); + this.closest('.franchise-card').classList.add('selected'); + + // Ouvrir le modal de tarif commercial + openModalTarifCom(franchiseValue); + }); + }); + } + + // Fonction pour configurer les alertes de marchandises + function setupMarchandiseAlerts() { + // Alerte pour Animaux Vivants + document.querySelectorAll('[name^="mar"] input[type="checkbox"]').forEach(cb => { + cb.addEventListener('change', function() { + const label = this.nextElementSibling?.textContent.trim(); + if (label && label.includes('Animaux vivants') && this.checked) { + window.modalAnimauxVivants.open(); + } + if (label && label.includes('Transport de béton') && this.checked) { + window.modalTransportBeton.open(); + } + }); + }); + } + + // Fonction pour configurer les alertes d'activités + function setupActiviteAlerts() { + // Alerte pour Autocariste + RCE + const checkAutocariste = document.getElementById('checkAutocariste'); + const checkRCE = document.getElementById('checkRCE'); + + const checkBothAutocariste = () => { + if (checkAutocariste?.checked && checkRCE?.checked) { + window.modalAutocaristeRCE.open(); + } + }; + + if (checkAutocariste) checkAutocariste.addEventListener('change', checkBothAutocariste); + if (checkRCE) checkRCE.addEventListener('change', checkBothAutocariste); + } + + // Seuil de différence acceptable (5%) + const seuil = 5; + + // Fonction pour ouvrir le modal de tarif commercial + function openModalTarifCom(franchiseValue) { + // Récupérer le tarif de référence selon la franchise + let tarifRef = 0; + if (franchiseValue === '250') { + tarifRef = toNumber(document.getElementById('priceFr250')?.textContent); + } else if (franchiseValue === '400') { + tarifRef = toNumber(document.getElementById('priceFr400')?.textContent); + } else if (franchiseValue === 'mini300') { + tarifRef = toNumber(document.getElementById('priceFr2000')?.textContent); + } + + // Réinitialiser le modal + document.getElementById('tarifRefText').innerText = `Tarif de Référence : ${formatNumber(tarifRef, 2)} €`; + document.getElementById('tarifCom').value = ''; + document.getElementById('commentaire').value = ''; + document.getElementById('comm-OK').disabled = false; + document.getElementById('tarifCom-error').style.display = 'none'; + document.getElementById('col-commentaire').style.display = 'none'; + document.getElementById('qualiteDiv').style.display = 'none'; + document.getElementById('comm-OK').setAttribute('data-franchise', franchiseValue); + document.getElementById('comm-OK').setAttribute('data-tarif-ref', tarifRef); + + // Event listener pour le champ tarif commercial + const tarifComInput = document.getElementById('tarifCom'); + tarifComInput.removeEventListener('input', handleTarifComInput); + tarifComInput.addEventListener('input', handleTarifComInput); + + // Event listener pour le commentaire + const commentaireInput = document.getElementById('commentaire'); + commentaireInput.removeEventListener('input', handleCommentaireInput); + commentaireInput.addEventListener('input', handleCommentaireInput); + + // Ouvrir le modal + window.modalTarifCom.open(); + } + + // Fonction pour gérer l'input du tarif commercial + function handleTarifComInput(e) { + const tarifCom = parseFloat(e.target.value); + const tarifRef = parseFloat(document.getElementById('comm-OK').getAttribute('data-tarif-ref')); + + if (!tarifCom || tarifCom <= 0) { + document.getElementById('qualiteDiv').style.display = 'none'; + return; + } + + const diff = 100 * (tarifCom / tarifRef); + let qualitePrime = ''; + let emoji = ''; + let showComment = false; + + if (diff < (100 + seuil) && diff > (100 - seuil)) { + emoji = 'mood'; + showComment = false; + + if (diff > 100) { + qualitePrime = `Tarif correct (+${(diff - 100).toFixed(2)}%)`; + } else if (diff < 100) { + qualitePrime = `Tarif correct (-${(100 - diff).toFixed(2)}%)`; + } else { + qualitePrime = 'Le juste prix'; + emoji = 'thumb_up_alt'; + } + } else { + emoji = 'mood_bad'; + showComment = true; + + if (diff > (100 + seuil)) { + qualitePrime = `Tarif trop élevé (+${(diff - 100).toFixed(2)}%)`; + } else if (diff < (100 - seuil)) { + qualitePrime = `Tarif trop bas (-${(100 - diff).toFixed(2)}%)`; + } + } + + document.getElementById('qualiteDiv').style.display = 'block'; + document.getElementById('qualitePrime').innerText = qualitePrime; + document.getElementById('modalTarifCom-icon').innerText = emoji; + document.getElementById('modalTarifCom-icon').style.color = (emoji === 'mood_bad') ? 'red' : 'green'; + + if (showComment) { + document.getElementById('tarifCom-error').style.display = 'flex'; + document.getElementById('col-commentaire').style.display = 'flex'; + if (!document.getElementById('commentaire').value.trim()) { + document.getElementById('comm-OK').disabled = true; + } + } else { + document.getElementById('comm-OK').disabled = false; + document.getElementById('tarifCom-error').style.display = 'none'; + document.getElementById('col-commentaire').style.display = 'none'; + } + } + + // Fonction pour gérer l'input du commentaire + function handleCommentaireInput(e) { + const commentaire = e.target.value.trim(); + const tarifComError = document.getElementById('tarifCom-error').style.display !== 'none'; + + if (tarifComError) { + document.getElementById('comm-OK').disabled = !commentaire; + } + } + + // Fonction pour gérer la validation du tarif commercial + async function handleValidateTarifCom() { + const tarifCom = parseFloat(document.getElementById('tarifCom').value); + const commentaire = document.getElementById('commentaire').value.trim(); + const franchiseValue = document.getElementById('comm-OK').getAttribute('data-franchise'); + + if (!tarifCom || tarifCom <= 0) { + M.toast({html: 'Veuillez saisir un tarif commercial valide', classes: 'red'}); + return; + } + + + // Fermer le modal + window.modalTarifCom.close(); + + // Afficher un loader + M.toast({html: '⏳ Sauvegarde en cours...', classes: 'blue'}); + + // Sauvegarder le tarif + const saveResult = await saveTarifRC(); + + if (saveResult && saveResult.valid) { + M.toast({html: `Tarif sauvegardé avec succès !`, classes: 'green'}); + + // Rediriger vers la page projet après un court délai + setTimeout(() => { + console.log('🚀 Redirection vers projet...'); + // Construire l'URL de redirection vers projet + const numParcours = parcours?.numParcours; + if (numParcours) { + window.location.href = `navParcours?numParcours=${numParcours}&submenu=projet`; + } else { + M.toast({html: 'Erreur: impossible de rediriger', classes: 'red'}); + } + }, 1000); + } else { + M.toast({html: '❌ Erreur lors de la sauvegarde du tarif', classes: 'red'}); + } + } + + // Exposer les fonctions globalement pour y accéder depuis l'extérieur + window.initSubmenuForm = init; + window.saveTarifRC = saveTarifRC; +})(); \ No newline at end of file diff --git a/ecole/src/constantes/json-modulateur-rc.js b/ecole/src/constantes/json-modulateur-rc.js new file mode 100644 index 00000000..4550c440 --- /dev/null +++ b/ecole/src/constantes/json-modulateur-rc.js @@ -0,0 +1,1434 @@ +const modRCCA = { + // max CA : Modulation CA + 400000: 1.00, + 500000: 0.85, + 800000: 0.80, + 1000000: 0.70, + 1600000: 0.64, + 2000000: 0.51, + 2400000: 0.44, + 3000000: 0.38, + 3200000: 0.30, + 4000000: 0.28, + 5000000: 0.22, + 1234567890123456789: 0.20 +}; + +const modRCActRCC = { + revisable: { + // Capital:TauxBase + "Voiturier/Loueur": { + 5000: 0.16, + 10000: 0.16, + 15000: 0.16, + 20000: 0.16, + 25000: 0.17, + 30000: 0.17, + 50000: 0.17, + 60000: 0.18, + 100000: 0.19, + 150000: 0.20, + 200000: 0.21, + 300000: 0.22, + 400000: 0.23 + }, + "Commissionnaire de Transport": { + 100000: 0.08, + 150000: 0.10, + 200000: 0.11, + 300000: 0.12, + 400000: 0.13, + }, + "Déménageur": { + 5000: 0.32, + 10000: 0.32, + 15000: 0.32, + 20000: 0.32, + 25000: 0.34, + 30000: 0.34, + 50000: 0.34, + 60000: 0.36, + 100000: 0.38, + 150000: 0.40, + 200000: 0.42, + 300000: 0.44, + 400000: 0.46 + }, + "Logistique": { + 5000: 0.057, + 10000: 0.057, + 15000: 0.057, + 20000: 0.057, + 25000: 0.057, + 30000: 0.057, + 50000: 0.057, + 60000: 0.21, + 100000: 0.271, + 150000: 0.271, + 200000: 0.271, + 300000: 0.2, + 400000: 0.25 + }, + "Autres activites": { + 5000: 0.16, + 10000: 0.16, + 15000: 0.16, + 20000: 0.16, + 25000: 0.17, + 30000: 0.17, + 50000: 0.17, + 60000: 0.18, + 100000: 0.19, + 150000: 0.20, + 200000: 0.21, + 300000: 0.22, + 400000: 0.23 + } + }, + forfaitaire: { + // Capital : prime forfaitaire {1veh, 2veh} + "Voiturier/Loueur": { + 5000: { + unVehicule: 130, + deuxVehicules: 220 + }, + 10000: { + unVehicule: 160, + deuxVehicules: 270 + }, + 15000: { + unVehicule: 180, + deuxVehicules: 300 + }, + 20000: { + unVehicule: 190, + deuxVehicules: 320 + }, + 25000: { + unVehicule: 205, + deuxVehicules: 345 + }, + 30000: { + unVehicule: 205, + deuxVehicules: 345 + }, + 50000: { + unVehicule: 260, + deuxVehicules: 425 + }, + 60000: { + unVehicule: 295, + deuxVehicules: 480 + }, + 100000: { + unVehicule: 330, + deuxVehicules: 495 + }, + 150000: { + unVehicule: 370, + deuxVehicules: 555 + }, + 200000: { + unVehicule: 410, + deuxVehicules: 600 + }, + 300000: { + unVehicule: 490, + deuxVehicules: 730 + }, + 400000: { + unVehicule: 550, + deuxVehicules: 820 + } + }, + "Déménageur": { + 5000: { + unVehicule: 260, + deuxVehicules: 440 + }, + 10000: { + unVehicule: 320, + deuxVehicules: 540 + }, + 15000: { + unVehicule: 360, + deuxVehicules: 600 + }, + 20000: { + unVehicule: 380, + deuxVehicules: 640 + }, + 25000: { + unVehicule: 410, + deuxVehicules: 690 + }, + 30000: { + unVehicule: 450, + deuxVehicules: 750 + }, + 50000: { + unVehicule: 520, + deuxVehicules: 850 + }, + 60000: { + unVehicule: 590, + deuxVehicules: 960 + }, + 100000: { + unVehicule: 660, + deuxVehicules: 990 + }, + 150000: { + unVehicule: 740, + deuxVehicules: 1110 + }, + 200000: { + unVehicule: 820, + deuxVehicules: 1200 + }, + 300000: { + unVehicule: 980, + deuxVehicules: 1460 + }, + 400000: { + unVehicule: 1100, + deuxVehicules: 1640 + } + }, + "Autocariste": { + 25000: { + unVehicule: 114, + deuxVehicules: 228 + }, + 50000: { + unVehicule: 204, + deuxVehicules: 408 + }, + 75000: { + unVehicule: 294, + deuxVehicules: 588 + }, + 100000: { + unVehicule: 384, + deuxVehicules: 768 + }, + 125000: { + unVehicule: 474, + deuxVehicules: 948 + }, + 150000: { + unVehicule: 564, + deuxVehicules: 1128 + } + } + } +}; + +const modRCActRCE = { + revisable: { + "Voiturier/Loueur": { + mini: 0.06, + optimale: 0.08, + maxi: 0.1 + }, + "Commissionnaire de Transport": { + mini: 0.045, + optimale: 0.05, + maxi: 0.055 + }, + "Déménageur": { + mini: 0.12, + optimale: 0.16, + maxi: 0.2 + }, + "Logistique": { + mini: 0.06, + optimale: 0.08, + maxi: 0.1 + }, + "Autres activites": { + mini: 0.06, + optimale: 0.08, + maxi: 0.1 + } + }, + forfaitaire: { + "Voiturier/Loueur": { + unVehicule: { + mini: 105, + optimale: 115, + maxi: 125 + }, + deuxVehicules: { + mini: 140, + optimale: 150, + maxi: 160 + } + }, + "Déménageur": { + unVehicule: { + mini: 0, + optimale: 115, + maxi: 0 + }, + deuxVehicules: { + mini: 0, + optimale: 150, + maxi: 0 + } + }, + "Autocariste": { + unVehicule: { + mini: 0, + optimale: 0, + maxi: 0 + }, + deuxVehicules: { + mini: 0, + optimale: 0, + maxi: 0 + } + } + } +}; + +const modRCActCompl = { + revisable: { + "Voiturier/Loueur": { + "Voiturier y compris sous-traitance temporaire": { + modRCC: 1, + modRCE: 1 + }, + "Loueur de véhicule industriel avec conducteur": { + modRCC: 1, + modRCE: 1 + }, + "Coursier en 2 ou 3 roues": { + modRCC: 1, + modRCE: 1 + }, + "Montage de meuble, électroménager, branchement": { + modRCC: 1, + modRCE: 3 + }, + "Manutentionnaire - levageur / Loueur de matériel de levage avec opérateur": { + modRCC: 1, + modRCE: 3 + }, + "Accompagnement de transport exceptionnel": { + modRCC: 1, + modRCE: 1 + } + }, + "Commissionnaire de Transport": { + "Commissionnaire de transport multimodal - zone UE": { + modRCC: 1, + modRCE: 1 + }, + "Commissionnaire de transport multimodal": { + modRCC: 1.3, + modRCE: 1 + }, + "Transitaire": { + modRCC: 1, + modRCE: 1 + }, + "Représentant en Douane Enregistré": { + modRCC: 1.5, + modRCE: 1 + } + }, + "Déménageur": { + "Déménageur de particuliers par voie terrestre": { + modRCC: 1, + modRCE: 1 + }, + "Déménageur de particuliers par voie terrestre - garantie dommage": { + modRCC: 1, + modRCE: 1 + }, + "Déménageur d'entreprises": { + modRCC: 1, + modRCE: 1 + }, + "Déménageur interne": { + modRCC: 1, + modRCE: 1 + }, + "Garde-meubles": { + modRCC: 1, + modRCE: 1 + } + }, + "Logistique": { + "Entrepositaire - dépositaire": { + modRCC: 1, + modRCE: 1 + }, + "Gestion de stocks - préparation de commande": { + modRCC: 1.3, + modRCE: 1 + }, + "Empoteur": { + modRCC: 1, + modRCE: 1 + } + }, + "Autres activites": { + } + }, + forfaitaire: { + "Voiturier/Loueur": { + "Coursier en 2 ou 3 roues": { + modRCC: 1, + modRCE: 1 + }, + "Montage de meuble, électroménager, branchement": { + modRCC: 3, + modRCE: 3 + }, + "Manutentionnaire": { + modRCC: 1, + modRCE: 1 + }, + "Accompagnement de transport exceptionnel": { + modRCC: 1, + modRCE: 1 + } + }, + "Déménageur": { + "Garde Meuble": { + modRCC: 1, + modRCE: 1 + } + }, + "Autocariste": { + } + } +}; + +const modRCMar = { + revisable: { + "Voiturier/Loueur": { + "Marchandises ordinaires": { + modRCC: 1, + modRCE: 1 + }, + "Véhicules roulants": { + modRCC: 1.3, + modRCE: 1 + }, + "Engins de chantier": { + modRCC: 1.2, + modRCE: 1 + }, + "Objets indivisibles": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises périssables": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises en citerne": { + modRCC: 0.7, + modRCE: 1.5 + }, + "Animaux vivants": { + modRCC: 1, + modRCE: 1 + }, + "Marchandises en benne": { + modRCC: 1, + modRCE: 1 + }, + "Transport de béton": { + modRCC: 0.7, + modRCE: 1.5 + } + }, + "Commissionnaire de Transport": { + "Marchandises ordinaires": { + modRCC: 1, + modRCE: 1 + }, + "Véhicules roulants": { + modRCC: 1.3, + modRCE: 1 + }, + "Engins de chantier": { + modRCC: 1.2, + modRCE: 1 + }, + "Objets indivisibles": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises périssables": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises en citerne": { + modRCC: 0.7, + modRCE: 1.5 + }, + "Animaux vivants": { + modRCC: 1, + modRCE: 1 + }, + "Marchandises en benne": { + modRCC: 1, + modRCE: 1 + }, + "Transport de béton": { + modRCC: 0.7, + modRCE: 1.5 + } + }, + "Déménageur": { + "Mobiliers en déménagement": { + modRCC: 3, + modRCE: 2 + } + }, + "Logistique": { + "Marchandises ordinaires": { + modRCC: 1, + modRCE: 1 + }, + "Véhicules roulants": { + modRCC: 1.3, + modRCE: 1 + }, + "Engins de chantier": { + modRCC: 1.2, + modRCE: 1 + }, + "Objets indivisibles": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises périssables": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises en citerne": { + modRCC: 0.7, + modRCE: 1.5 + }, + "Animaux vivants": { + modRCC: 1, + modRCE: 1 + }, + "Marchandises en benne": { + modRCC: 1, + modRCE: 1 + }, + "Transport de béton": { + modRCC: 0.7, + modRCE: 1.5 + } + }, + "Autres activites": { + "Marchandises ordinaires": { + modRCC: 1, + modRCE: 1 + }, + "Véhicules roulants": { + modRCC: 1.3, + modRCE: 1 + }, + "Engins de chantier": { + modRCC: 1.2, + modRCE: 1 + }, + "Objets indivisibles": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises périssables": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises en citerne": { + modRCC: 0.7, + modRCE: 1.5 + }, + "Animaux vivants": { + modRCC: 1, + modRCE: 1 + }, + "Marchandises en benne": { + modRCC: 1, + modRCE: 1 + }, + "Transport de béton": { + modRCC: 0.7, + modRCE: 1.5 + } + } + }, + forfaitaire: { + "Voiturier/Loueur": { + "Marchandises ordinaires": { + modRCC: 1, + modRCE: 1 + }, + "Véhicules roulants": { + modRCC: 1.3, + modRCE: 1 + }, + "Engins de chantier": { + modRCC: 1.2, + modRCE: 1 + }, + "Objets indivisibles": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises périssables": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises en citerne": { + modRCC: 0.7, + modRCE: 1.5 + }, + "Animaux vivants": { + modRCC: 1, + modRCE: 1 + }, + "Marchandises en benne": { + modRCC: 1, + modRCE: 1 + }, + "Transport de béton": { + modRCC: 1, + modRCE: 1 + } + }, + "Déménageur": { + "Mobiliers en déménagement": { + modRCC: 3, + modRCE: 2 + } + }, + "Autocariste": { + "Marchandises ordinaires": { + modRCC: 1, + modRCE: 1 + }, + "Véhicules roulants": { + modRCC: 1.3, + modRCE: 1 + }, + "Marchandises en benne": { + modRCC: 1, + modRCE: 1 + }, + "Engins de chantier": { + modRCC: 1.2, + modRCE: 1 + }, + "Objets indivisibles": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises périssables": { + modRCC: 1.2, + modRCE: 1 + }, + "Marchandises en citerne": { + modRCC: 0.7, + modRCE: 1.5 + }, + "Animaux vivants": { + modRCC: 1, + modRCE: 1 + }, + "Marchandises en benne": { + modRCC: 1, + modRCE: 1 + }, + "Transport de béton": { + modRCC: 1, + modRCE: 1 + } + } + } +}; + +const modRCZone = { + "France Métropolitaine et pays limitrophes": { + modRCC: 1, + modRCE: 1 + }, + "Union Européenne": { + modRCC: 1.1, + modRCE: 1 + }, + "Autres pays européens sauf Russie et Ukraine (y compris UK et Norvège)": { + modRCC: 1.3, + modRCE: 1 + }, + "Pays du Maghreb et Amérique du Nord ( USA / Canada / Mexique )": { + modRCC: 1.3, + modRCE: 1 + }, + "Amérique Centrale et Sud / Caraïbes, Asie et Océanie": { + modRCC: 1.3, + modRCE: 1 + }, + "Afrique Hors Maghreb / Proche Orient / Moyen Orient": { + modRCC: 1.3, + modRCE: 1 + } +}; + +const modRCEngagCompl = { + modRCC: { + // Tranche:Modulation + "Dommages immatériels": { + 15000: 1, + 50000: 1.025, + 100000: 1.05, + 150000: 1.08, + 300000: 1.10, + 400000: 1.13, + 500000: 1.15 + }, + "Contenants confiés": { + 25000: 0, + 50000: 500, + 100000: 1000 + }, + "Différence inventaire": { + 15000: 0, + 30000: 1000, + 50000: 3000 + } + } +}; + +const modRCGarAdd = { + modRCC: { + // Tranche:Modulation + "TPPC": { + 5000: 0, + 10000: 0.01, + 15000: 0.01, + 30000: 0.01 + }, + "Protection juridique": { + 0: 49.38, + 500: 80.25, + 1000: 119.93, + 2000: 209.88, + 3000: 320.11, + 5000: 509.70, + 7000: 720.46, + 10000: 990.30, + 15000: 1489.42, + 25000: 2389.77, + 40000: 2389.77 + } + }, + modRCE: { + "Station de lavage": 1000, + "Garage interne": 1500, + "Comité Social et Economique": 100 + } +}; + +const modRCSinistre = { + // pourcentage:modulation + 0.4: 1, + 0.7: 1.3, + 1: 1.5 +}; + +const modRCFranchise = { + "250": { + modRCC: 1, + modRCE: 1 + }, + "400": { + modRCC: 0.9, + modRCE: 0.9 + }, + "10% avec mini 300 € et maxi 2000": { + modRCC: 0.8, + modRCE: 0.8 + } +}; + +const modRCPrimeMini = { + revisable: { + //Tranche:Modulation + "Voiturier/Loueur": { + 5000: { + miniRCC: 330, + miniRCE: 330 + }, + 10000: { + miniRCC: 374, + miniRCE: 330 + }, + 15000: { + miniRCC: 396, + miniRCE: 330 + }, + 20000: { + miniRCC: 418, + miniRCE: 330 + }, + 25000: { + miniRCC: 462, + miniRCE: 330 + }, + 30000: { + miniRCC: 484, + miniRCE: 330 + }, + 50000: { + miniRCC: 550, + miniRCE: 330 + }, + 60000: { + miniRCC: 616, + miniRCE: 330 + }, + 100000: { + miniRCC: 660, + miniRCE: 330 + }, + 150000: { + miniRCC: 770, + miniRCE: 330 + }, + 200000: { + miniRCC: 880, + miniRCE: 330 + }, + 300000: { + miniRCC: 1100, + miniRCE: 330 + }, + 400000: { + miniRCC: 1320, + miniRCE: 330 + } + }, + "Commissionnaire de Transport": { + 5000: { + miniRCC: 0, + miniRCE: 0 + }, + 10000: { + miniRCC: 0, + miniRCE: 0 + }, + 15000: { + miniRCC: 0, + miniRCE: 0 + }, + 20000: { + miniRCC: 0, + miniRCE: 0 + }, + 25000: { + miniRCC: 0, + miniRCE: 0 + }, + 30000: { + miniRCC: 0, + miniRCE: 0 + }, + 50000: { + miniRCC: 0, + miniRCE: 0 + }, + 60000: { + miniRCC: 0, + miniRCE: 0 + }, + 100000: { + miniRCC: 1200, + miniRCE: 150 + }, + 150000: { + miniRCC: 1300, + miniRCE: 150 + }, + 200000: { + miniRCC: 1300, + miniRCE: 150 + }, + 300000: { + miniRCC: 1600, + miniRCE: 150 + }, + 400000: { + miniRCC: 1800, + miniRCE: 150 + } + }, + "Déménageur": { + 5000: { + miniRCC: 594, + miniRCE: 660 + }, + 10000: { + miniRCC: 673, + miniRCE: 660 + }, + 15000: { + miniRCC: 713, + miniRCE: 660 + }, + 20000: { + miniRCC: 752, + miniRCE: 660 + }, + 25000: { + miniRCC: 832, + miniRCE: 660 + }, + 30000: { + miniRCC: 871, + miniRCE: 660 + }, + 50000: { + miniRCC: 990, + miniRCE: 660 + }, + 60000: { + miniRCC: 1109, + miniRCE: 660 + }, + 100000: { + miniRCC: 1188, + miniRCE: 660 + }, + 150000: { + miniRCC: 1386, + miniRCE: 660 + }, + 200000: { + miniRCC: 1584, + miniRCE: 660 + }, + 300000: { + miniRCC: 1980, + miniRCE: 660 + }, + 400000: { + miniRCC: 2376, + miniRCE: 660 + } + }, + "Logistique": { + 5000: { + miniRCC: 0, + miniRCE: 0 + }, + 10000: { + miniRCC: 0, + miniRCE: 0 + }, + 15000: { + miniRCC: 0, + miniRCE: 0 + }, + 20000: { + miniRCC: 0, + miniRCE: 0 + }, + 25000: { + miniRCC: 0, + miniRCE: 0 + }, + 30000: { + miniRCC: 557, + miniRCE: 150 + }, + 50000: { + miniRCC: 633, + miniRCE: 150 + }, + 60000: { + miniRCC: 708, + miniRCE: 150 + }, + 100000: { + miniRCC: 759, + miniRCE: 150 + }, + 150000: { + miniRCC: 886, + miniRCE: 150 + }, + 200000: { + miniRCC: 1012, + miniRCE: 150 + }, + 300000: { + miniRCC: 1265, + miniRCE: 150 + }, + 400000: { + miniRCC: 1518, + miniRCE: 150 + } + }, + "Autocariste": { + 5000: { + miniRCC: 500, + miniRCE: 150 + }, + 10000: { + miniRCC: 500, + miniRCE: 150 + }, + 15000: { + miniRCC: 550, + miniRCE: 150 + }, + 20000: { + miniRCC: 550, + miniRCE: 150 + }, + 25000: { + miniRCC: 620, + miniRCE: 150 + }, + 30000: { + miniRCC: 620, + miniRCE: 150 + }, + 50000: { + miniRCC: 660, + miniRCE: 150 + }, + 60000: { + miniRCC: 660, + miniRCE: 150 + }, + 100000: { + miniRCC: 700, + miniRCE: 150 + }, + 150000: { + miniRCC: 700, + miniRCE: 150 + }, + 200000: { + miniRCC: 750, + miniRCE: 150 + }, + 300000: { + miniRCC: 850, + miniRCE: 150 + }, + 400000: { + miniRCC: 850, + miniRCE: 150 + } + }, + "Autres activites": { + 5000: { + miniRCC: 500, + miniRCE: 150 + }, + 10000: { + miniRCC: 500, + miniRCE: 150 + }, + 15000: { + miniRCC: 550, + miniRCE: 150 + }, + 20000: { + miniRCC: 550, + miniRCE: 150 + }, + 25000: { + miniRCC: 620, + miniRCE: 150 + }, + 30000: { + miniRCC: 620, + miniRCE: 150 + }, + 50000: { + miniRCC: 660, + miniRCE: 150 + }, + 60000: { + miniRCC: 660, + miniRCE: 150 + }, + 100000: { + miniRCC: 700, + miniRCE: 150 + }, + 150000: { + miniRCC: 700, + miniRCE: 150 + }, + 200000: { + miniRCC: 750, + miniRCE: 150 + }, + 300000: { + miniRCC: 850, + miniRCE: 150 + }, + 400000: { + miniRCC: 850, + miniRCE: 150 + } + } + }, + forfaitaire: { + //Tranche:Value Mini + "Voiturier/Loueur": { + 5000: { + miniRCC: 150, + miniRCE: 150 + }, + 10000: { + miniRCC: 170, + miniRCE: 150 + }, + 15000: { + miniRCC: 180, + miniRCE: 150 + }, + 20000: { + miniRCC: 190, + miniRCE: 150 + }, + 25000: { + miniRCC: 210, + miniRCE: 150 + }, + 30000: { + miniRCC: 220, + miniRCE: 150 + }, + 50000: { + miniRCC: 250, + miniRCE: 150 + }, + 60000: { + miniRCC: 280, + miniRCE: 150 + }, + 100000: { + miniRCC: 300, + miniRCE: 150 + }, + 150000: { + miniRCC: 350, + miniRCE: 150 + }, + 200000: { + miniRCC: 400, + miniRCE: 150 + }, + 300000: { + miniRCC: 500, + miniRCE: 150 + }, + 400000: { + miniRCC: 600, + miniRCE: 150 + } + }, + "Commissionnaire de Transport": { + 5000: { + miniRCC: 0, + miniRCE: 0 + }, + 10000: { + miniRCC: 0, + miniRCE: 0 + }, + 15000: { + miniRCC: 0, + miniRCE: 0 + }, + 20000: { + miniRCC: 0, + miniRCE: 0 + }, + 25000: { + miniRCC: 0, + miniRCE: 0 + }, + 30000: { + miniRCC: 0, + miniRCE: 0 + }, + 50000: { + miniRCC: 0, + miniRCE: 0 + }, + 60000: { + miniRCC: 0, + miniRCE: 0 + }, + 100000: { + miniRCC: 0, + miniRCE: 0 + }, + 150000: { + miniRCC: 0, + miniRCE: 0 + }, + 200000: { + miniRCC: 0, + miniRCE: 0 + }, + 300000: { + miniRCC: 0, + miniRCE: 0 + }, + 400000: { + miniRCC: 0, + miniRCE: 0 + } + }, + "Déménageur": { + 5000: { + miniRCC: 270, + miniRCE: 300 + }, + 10000: { + miniRCC: 306, + miniRCE: 300 + }, + 15000: { + miniRCC: 324, + miniRCE: 300 + }, + 20000: { + miniRCC: 342, + miniRCE: 300 + }, + 25000: { + miniRCC: 378, + miniRCE: 300 + }, + 30000: { + miniRCC: 396, + miniRCE: 300 + }, + 50000: { + miniRCC: 450, + miniRCE: 300 + }, + 60000: { + miniRCC: 504, + miniRCE: 300 + }, + 100000: { + miniRCC: 540, + miniRCE: 300 + }, + 150000: { + miniRCC: 630, + miniRCE: 300 + }, + 200000: { + miniRCC: 720, + miniRCE: 300 + }, + 300000: { + miniRCC: 900, + miniRCE: 300 + }, + 400000: { + miniRCC: 1080, + miniRCE: 300 + } + }, + "Logistique": { + 5000: { + miniRCC: 0, + miniRCE: 0 + }, + 10000: { + miniRCC: 0, + miniRCE: 0 + }, + 15000: { + miniRCC: 0, + miniRCE: 0 + }, + 20000: { + miniRCC: 0, + miniRCE: 0 + }, + 25000: { + miniRCC: 0, + miniRCE: 0 + }, + 30000: { + miniRCC: 0, + miniRCE: 0 + }, + 50000: { + miniRCC: 0, + miniRCE: 0 + }, + 60000: { + miniRCC: 0, + miniRCE: 0 + }, + 100000: { + miniRCC: 0, + miniRCE: 0 + }, + 150000: { + miniRCC: 0, + miniRCE: 0 + }, + 200000: { + miniRCC: 0, + miniRCE: 0 + }, + 300000: { + miniRCC: 0, + miniRCE: 0 + }, + 400000: { + miniRCC: 0, + miniRCE: 0 + } + }, + "Autocariste": { + 5000: { + miniRCC: 270, + miniRCE: 300 + }, + 10000: { + miniRCC: 306, + miniRCE: 300 + }, + 15000: { + miniRCC: 324, + miniRCE: 300 + }, + 20000: { + miniRCC: 342, + miniRCE: 300 + }, + 25000: { + miniRCC: 378, + miniRCE: 300 + }, + 30000: { + miniRCC: 396, + miniRCE: 300 + }, + 50000: { + miniRCC: 450, + miniRCE: 300 + }, + 60000: { + miniRCC: 504, + miniRCE: 300 + }, + 100000: { + miniRCC: 540, + miniRCE: 300 + }, + 150000: { + miniRCC: 630, + miniRCE: 300 + }, + 200000: { + miniRCC: 720, + miniRCE: 300 + }, + 300000: { + miniRCC: 900, + miniRCE: 300 + }, + 400000: { + miniRCC: 1080, + miniRCE: 300 + } + }, + "Autres activites": { + 5000: { + miniRCC: 0, + miniRCE: 0 + }, + 10000: { + miniRCC: 0, + miniRCE: 0 + }, + 15000: { + miniRCC: 0, + miniRCE: 0 + }, + 20000: { + miniRCC: 0, + miniRCE: 0 + }, + 25000: { + miniRCC: 0, + miniRCE: 0 + }, + 30000: { + miniRCC: 0, + miniRCE: 0 + }, + 50000: { + miniRCC: 0, + miniRCE: 0 + }, + 60000: { + miniRCC: 0, + miniRCE: 0 + }, + 100000: { + miniRCC: 0, + miniRCE: 0 + }, + 150000: { + miniRCC: 0, + miniRCE: 0 + }, + 200000: { + miniRCC: 0, + miniRCE: 0 + }, + 300000: { + miniRCC: 0, + miniRCE: 0 + }, + 400000: { + miniRCC: 0, + miniRCE: 0 + } + } + } +}; + +module.exports = { + modRCCA, + modRCActRCC, + modRCActRCE, + modRCActCompl, + modRCMar, + modRCZone, + modRCEngagCompl, + modRCGarAdd, + modRCSinistre, + modRCFranchise, + modRCPrimeMini +}; \ No newline at end of file diff --git a/ecole/src/controllers/generateRcController.js b/ecole/src/controllers/generateRcController.js index 47a4a468..a4d09fe3 100644 --- a/ecole/src/controllers/generateRcController.js +++ b/ecole/src/controllers/generateRcController.js @@ -8,157 +8,196 @@ const path = require("path"); const moment = require("moment"); const parcoursService = require("../services/parcoursService"); const contratService = require("../services/contratService"); +const userService = require("../services/userService"); const globalService = require("../services/globalService"); +//const projetformrc = require("../../public/js/projet-form-rc"); +//const moduloRC = require("../constantes/json-modulateur-rc"); useless pour le moment ? require("moment/locale/fr"); moment.locale("fr"); +// Fonctions helper pour récupérer les valeurs selon la franchise choisie +function getSelectedTarifReference(tarifRC) { + const franchise = tarifRC.franchiseChoisie; + if (franchise === '250') return tarifRC.primeTotal_250; + if (franchise === '400') return tarifRC.primeTotal_400; + if (franchise === 'mini300') return tarifRC.primeTotal_2000; + return null; +} + +function getSelectedPrime(tarifRC, type) { + const franchise = tarifRC.franchiseChoisie; + if (!franchise) return 0; + + const suffix = franchise === 'mini300' ? '2000' : franchise; + const fieldName = `prime${type}_${suffix}`; + return tarifRC[fieldName] || 0; +} + +function getSelectedTaux(tarifRC, type) { + const franchise = tarifRC.franchiseChoisie; + if (!franchise) return 0; + + const suffix = franchise === 'mini300' ? '2000' : franchise; + const fieldName = `taux${type}_${suffix}`; + return tarifRC[fieldName] || 0; +} + router.post("/rc/projet/:numParcours", async (req, res) => { - const content = fs.readFileSync( - path.resolve("src/templates/template-projet-rc.docx"), - "binary" - ); - - const zip = new PizZip(content); - const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true }); - const numParcours = req.params.numParcours.toUpperCase(); - - const parcours = await parcoursService.getParcoursByNumParcours(numParcours); - const contrat = await contratService.getContratById(parcours.contrat); - const client = contrat?.["@expand"]?.client || {}; - const intermediaire = contrat?.["@expand"]?.intermediaire || {}; - const rc = contrat?.["@expand"]?.enCours || {}; - - const listAssAdd = []; - try { - rc.assureAdditionnel.forEach((objet) => { - listAssAdd.push( - objet.nom + + const content = fs.readFileSync( + path.resolve("src/templates/template-projet-rc.docx"), + "binary" + ); + + const zip = new PizZip(content); + const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true }); + const numParcours = req.params.numParcours.toUpperCase(); + + const parcours = await parcoursService.getParcoursByNumParcours(numParcours); + const contrat = await contratService.getContratById(parcours.contrat); + const client = contrat?.["@expand"]?.client || {}; + const intermediaire = contrat?.["@expand"]?.intermediaire || {}; + + // Récupérer la collection rc avec ses relations (APRÈS placerDansEnCours, c'est dans enCours) + const rcFull = contrat?.["@expand"]?.enCours; + if (!rcFull) { + logger.log('error', 'No RC found for contrat:', contrat.id); + return res.status(404).send("Aucune donnée RC trouvée pour ce contrat"); + } + + // Les données sont déjà expandées par contratService + const rc = rcFull?.["@expand"]?.projetRC || {}; + + const listAssAdd = []; + + // Traiter les assurés additionnels s'ils existent + if (rc.assureAdditionnel && Array.isArray(rc.assureAdditionnel)) { + rc.assureAdditionnel.forEach((objet) => { + listAssAdd.push( + objet.nom + " - Adresse : " + objet.adresse + " - Siret : " + objet.siret - ); - }); - } catch (error) { } - - // Conditions zone - hasMondeEntier = false; - hasZone1 = false; - hasZone2 = false; - hasZone3 = false; - hasZone4 = false; - hasZone5 = false; - hasZone6 = false; - hasActiviteButNotMultimodal = false; // Attention trick pour les zones géographiques dans le cas de multimodal - hasZone456 = false; - - // Cas monde entier - if ( - rc.zone1 && - rc.zone2 && - rc.zone3 && - rc.zone4 && - rc.zone5 && - rc.zone6 && - (rc.actVoiturier || - rc.actLoueur || - rc.actDouane || - rc.actDemPar || - rc.actDemParDom || - rc.actDemParAdv || - rc.actDemEntr || - rc.actDemInterne || - rc.actGardeMeuble || - rc.actEntDep || - rc.actPrestaLog || - rc.actLevageur) - ) { - hasMondeEntier = true; - } - - // Cas date du jour d'édition - let dateNow; - - dateNow = moment().format("DD MMMM YYYY"); - - // Cas une ou plusieurs zone(s) spécifique(s) + cas zone456 - if (hasMondeEntier == false && (rc.actVoiturier || rc.actLoueur || rc.actDouane || rc.actDemPar || rc.actDemParDom || rc.actDemParAct || rc.actDemEntr || rc.actDemInterne || rc.actGardeMeuble || rc.actEntDep || rc.actPrestaLog || rc.actLevageur || rc.actDemParAdv)) { - if (rc.zone1) { - hasZone1 = true; + ); + }); } - if (rc.zone2) { - hasZone2 = true; + + // Conditions zone + let hasMondeEntier = false; + let hasZone1 = false; + let hasZone2 = false; + let hasZone3 = false; + let hasZone4 = false; + let hasZone5 = false; + let hasZone6 = false; + let hasActiviteButNotMultimodal = false; // Attention trick pour les zones géographiques dans le cas de multimodal + let hasZone456 = false; + + // Cas monde entier + if ( + rc.zone1 && + rc.zone2 && + rc.zone3 && + rc.zone4 && + rc.zone5 && + rc.zone6 && + (rc.actVoiturier || + rc.actLoueur || + rc.actDouane || + rc.actDemPar || + rc.actDemParDom || + rc.actDemParAdv || + rc.actDemEntr || + rc.actDemInterne || + rc.actGardeMeuble || + rc.actEntDep || + rc.actPrestaLog || + rc.actLevageur) + ) { + hasMondeEntier = true; } - if (rc.zone3) { - hasZone3 = true; + + // Cas date du jour d'édition + let dateNow = moment().format("DD MMMM YYYY"); + + // Cas une ou plusieurs zone(s) spécifique(s) + cas zone456 + if (hasMondeEntier == false && (rc.actVoiturier || rc.actLoueur || rc.actDouane || rc.actDemPar || rc.actDemParDom || rc.actDemParAct || rc.actDemEntr || rc.actDemInterne || rc.actGardeMeuble || rc.actEntDep || rc.actPrestaLog || rc.actLevageur || rc.actDemParAdv)) { + if (rc.zone1) { + hasZone1 = true; + } + if (rc.zone2) { + hasZone2 = true; + } + if (rc.zone3) { + hasZone3 = true; + } + if (rc.zone4) { + hasZone4 = true; + hasZone456 = true; + } + if (rc.zone5) { + hasZone5 = true; + hasZone456 = true; + } + if (rc.zone6) { + hasZone6 = true; + hasZone456 = true; + } } - if (rc.zone4) { - hasZone4 = true; - hasZone456 = true; + + // Cas Activité multimodal + Au minimum une zone + if (rc.actMultimodal) { + if (hasZone1 || hasZone2 || hasZone3 || hasZone456 || hasMondeEntier) { + hasActiviteButNotMultimodal = true; + } } - if (rc.zone5) { - hasZone5 = true; - hasZone456 = true; + + let hasMondeEntierOrMultimodal, hasNotMondeEntierOrMultimodal; + if (rc.actMultimodal || hasMondeEntier) { + hasMondeEntierOrMultimodal = true; + hasNotMondeEntierOrMultimodal = false; + } else { + hasMondeEntierOrMultimodal = false; + hasNotMondeEntierOrMultimodal = true; } - if (rc.zone6) { - hasZone6 = true; - hasZone456 = true; + + // Conditions Extensions RCC + let extRCC = false; + + if ( rc.extRCCModifCalArrim == true || rc.extRCCFerroutage == true || rc.extRCCFraisRecons == true || rc.extRCCConfie == true || rc.extRCCTPPC == true || rc.extRCCRegie == true || rc.extRCCSansMontageDemontage == true ) { + extRCC = true; } - } - // Cas Activité multimodal + Au minimum une zone - if (rc.actMultimodal) { - if (hasZone1 || hasZone2 || hasZone3 || hasZone456 || hasMondeEntier) { - hasActiviteButNotMultimodal = true; + // Conditions Extensions RCE + let extRCE = false; + + if (rc.extRCEMontageDemontage == true || rc.extRCEBraDebra == true) { + extRCE = true; } - } - if (rc.actMultimodal || hasMondeEntier) { - hasMondeEntierOrMultimodal = true; - hasNotMondeEntierOrMultimodal = false; - } else { - hasMondeEntierOrMultimodal = false; - hasNotMondeEntierOrMultimodal = true; - } + // Conditions Activitées + let hasActiviteDemenageurGardeMeuble = false; + if ( rc.actDemPar == true || rc.actDemEntr == true || rc.actDemParDom == true || rc.actDemParAdv == true || rc.actDemInterne) { + hasActiviteDemenageurGardeMeuble = true; + } - // Conditions Extensions RCC - let extRCC = false; + let oneOfActiviteDemenageurParticulier = false; + if ( rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true ) { + oneOfActiviteDemenageurParticulier = true; + } - if ( rc.extRCCModifCalArrim == true || rc.extRCCFerroutage == true || rc.extRCCFraisRecons == true || rc.extRCCConfie == true || rc.extRCCTPPC == true || rc.extRCCRegie == true || rc.extRCCSansMontageDemontage == true ) { - extRCC = true; - } + let coorDem = ""; + if ( (rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true) && (rc.actDemEntr == true || rc.actDemInterne == true) && rc.actGardeMeuble == true) { + coorDem = ","; + } else if ( (rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true) && (rc.actDemEntr == true || rc.actDemInterne == true) && rc.actGardeMeuble == false ) { + coorDem = " et"; + } - // Conditions Extensions RCC - let extRCE = false; + // Variables numériques + const franchiseTarif = "250"; - if ( rc.extRCEMontageDemontage == true || rc.extRCEBraDebra == true) { - extRCE = true; - } - - // Conditions Activitées - let hasActiviteDemenageurGardeMeuble = false; - if ( rc.actDemPar == true || rc.actDemEntr == true || rc.actDemParDom == true || rc.actDemParAdv == true || rc.actDemInterne) { - hasActiviteDemenageurGardeMeuble = true; - } - - let oneOfActiviteDemenageurParticulier = false; - if ( rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true ) { - oneOfActiviteDemenageurParticulier = true; - } - - let coorDem = ""; - if ( (rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true) && (rc.actDemEntr == true || rc.actDemInterne == true) && rc.actGardeMeuble == true) { - coorDem = ","; - } else if ( (rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true) && (rc.actDemEntr == true || rc.actDemInterne == true) && rc.actGardeMeuble == false ) { - coorDem = " et"; - } - - // Variables numériques - const franchiseTarif = "250"; - - try { doc.render({ // Client nomClient: client.nom, @@ -303,51 +342,310 @@ router.post("/rc/projet/:numParcours", async (req, res) => { fraisRepFraction: globalService.customFormatNumber(rc.cotFraisTTC, true), ca: globalService.customFormatNumber(rc.ca, true), }); + + const buf = doc.getZip().generate({ type: "nodebuffer" }); + + const currentDate = new Date(); + + // Formatage de la date au format "JJ-MM-AAAA-HH-MM-SS" + const day = String(currentDate.getDate()).padStart(2, "0"); + const month = String(currentDate.getMonth() + 1).padStart(2, "0"); + const year = currentDate.getFullYear(); + const hours = String(currentDate.getHours()).padStart(2, "0"); + const minutes = String(currentDate.getMinutes()).padStart(2, "0"); + const seconds = String(currentDate.getSeconds()).padStart(2, "0"); + const formattedDate = `${day}-${month}-${year}-${hours}-${minutes}-${seconds}`; + + // Génération du nom de fichier + const sanitizedClientNom = client.nom + .replace(/[^\w\s.-]/gi, "") + .replace(/\s+/g, "-"); + const filename = `Projet-${contrat.produit}-${parcours.numParcours}-${sanitizedClientNom}-${formattedDate}`; + + // Définit le type de contenu et un nom de fichier par défaut pour le téléchargement + res.setHeader( + "Content-Type", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ); + + res.setHeader( + "Content-Disposition", + "attachment; filename=" + filename + ".docx" + ); + + // Envoie le buffer au client, déclenchant le téléchargement + res.send(buf); } catch (error) { - const e = { - message: error.message, - name: error.name, - stack: error.stack, - properties: error.properties, - }; - logger.log('error', JSON.stringify({ error: e })); - - // Envoyez une réponse d'erreur si le rendu échoue - return res.status(500).send("Erreur lors de la génération du document"); + logger.log('error', 'Error in RC projet generation:', error); + return res.status(500).send("Erreur lors de la génération du projet RC"); } - - const buf = doc.getZip().generate({ type: "nodebuffer" }); - - const currentDate = new Date(); - - // Formatage de la date au format "JJ-MM-AAAA-HH-MM-SS" - const day = String(currentDate.getDate()).padStart(2, "0"); - const month = String(currentDate.getMonth() + 1).padStart(2, "0"); - const year = currentDate.getFullYear(); - const hours = String(currentDate.getHours()).padStart(2, "0"); - const minutes = String(currentDate.getMinutes()).padStart(2, "0"); - const seconds = String(currentDate.getSeconds()).padStart(2, "0"); - const formattedDate = `${day}-${month}-${year}-${hours}-${minutes}-${seconds}`; - - // Génération du nom de fichier - const sanitizedClientNom = client.nom - .replace(/[^\w\s.-]/gi, "") - .replace(/\s+/g, "-"); - const filename = `Projet-${contrat.produit}-${parcours.numParcours}-${sanitizedClientNom}-${formattedDate}`; - - // Définit le type de contenu et un nom de fichier par défaut pour le téléchargement - res.setHeader( - "Content-Type", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" - ); - - res.setHeader( - "Content-Disposition", - "attachment; filename=" + filename + ".docx" - ); - - // Envoie le buffer au client, déclenchant le téléchargement - res.send(buf); }); -module.exports = router; +router.post("/rc/tarif/:numParcours", async (req, res) => { + try { + const content = fs.readFileSync( + path.resolve("src/templates/template-declinaison-tarifaire-rc.docx"), + "binary" + ); + + const zip = new PizZip(content); + const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true }); + + const numParcours = req.params.numParcours.toUpperCase(); + const parcours = await parcoursService.getParcoursByNumParcours(numParcours); + const contrat = await contratService.getContratById(parcours.contrat); + const client = contrat?.["@expand"]?.client || {}; + const user = await userService.getUserById(parcours.dernierUtilisateur); + + // Récupérer la collection rc avec ses relations (APRÈS placerDansEnCours, c'est dans enCours) + const rcFull = contrat?.["@expand"]?.enCours; + if (!rcFull) { + logger.log('error', 'No RC found for contrat:', contrat.id); + return res.status(404).send("Aucune donnée RC trouvée pour ce contrat"); + } + + // Les données sont déjà expandées par contratService + const rc = rcFull?.["@expand"]?.tarifRC || {}; + const rcMain = rcFull || {}; + + // Formatage des taux avec maximum 2 décimales + function formatTaux(taux) { + if (!taux) return 0; + return parseFloat(taux).toFixed(2); + } + + // Préparer les données des activités avec leurs marchandises et activités complémentaires + const activites = []; + + // Voiturier/Loueur + if (rcMain.checkVoiturier || rcMain.checkLoueur) { + activites.push({ + type: 'Voiturier/Loueur', + capital: rcMain.capitalVoiturier || 0, + pourcentage: rc.pourcentageVoiturier || 0, + marchandises: rcMain.marchandisesVoiturier || [], + activitesCompl: rcMain.activitesVoiturier || [] + }); + } + + // Commissionnaire de Transport + if (rcMain.checkCommissionnaire) { + activites.push({ + type: 'Commissionnaire de Transport', + capital: rcMain.capitalCommissionnaire || 0, + pourcentage: rc.pourcentageCommissionnaire || 0, + marchandises: rcMain.marchandisesCommissionnaire || [], + activitesCompl: rcMain.activitesCommissionnaire || [] + }); + } + + // Déménageur + if (rcMain.checkDemenageur) { + activites.push({ + type: 'Déménageur', + capital: rcMain.capitalDemenageur || 0, + pourcentage: rc.pourcentageDemenageur || 0, + marchandises: rcMain.marchandisesDemenageur || [], + activitesCompl: rcMain.activitesDemenageur || [] + }); + } + + // Logistique + if (rcMain.checkLogistique) { + activites.push({ + type: 'Logistique', + capital: rcMain.capitalLogistique || 0, + pourcentage: rc.pourcentageLogistique || 0, + marchandises: rcMain.marchandisesLogistique || [], + activitesCompl: rcMain.activitesLogistique || [] + }); + } + + // Autocariste + if (rcMain.checkAutocariste) { + activites.push({ + type: 'Autocariste', + capital: rcMain.capitalAutocariste || 0, + pourcentage: rc.pourcentageAutocariste || 0, + marchandises: rcMain.marchandisesAutocariste || [], + activitesCompl: rcMain.activitesAutocariste || [] + }); + } + + // Autres activités + if (rcMain.checkAutres) { + activites.push({ + type: 'Autres activités', + capital: rcMain.capitalAutres || 0, + pourcentage: rc.pourcentageAutres || 0, + marchandises: rcMain.marchandisesAutres || [], + activitesCompl: rcMain.activitesAutres || [] + }); + } + + // Préparer les zones + const zones = []; + if (rcMain.zone1) zones.push("Zone 1"); + if (rcMain.zone2) zones.push("Zone 2"); + if (rcMain.zone3) zones.push("Zone 3"); + if (rcMain.zone4) zones.push("Zone 4"); + if (rcMain.zone5) zones.push("Zone 5"); + if (rcMain.zone6) zones.push("Zone 6"); + + // Préparer les garanties additionnelles + const garantiesAdditionnelles = []; + if (rc.checkStationLavage) garantiesAdditionnelles.push("Station de lavage"); + if (rc.checkGarageInterne) garantiesAdditionnelles.push("Garage interne"); + if (rc.checkCSE) garantiesAdditionnelles.push("CSE"); + if (rc.checkTPPC) garantiesAdditionnelles.push(`TPPC (Capital: ${rc.capitalTPPC || 0}€, Véhicules: ${rc.vehiculesTPPC || 0})`); + if (rc.checkPJ) garantiesAdditionnelles.push("Protection Juridique"); + + // Préparer les engagements complémentaires + const engagements = []; + if (rc.checkDomImmat) engagements.push(`Dommages immatériels (Capital: ${rc.capitalDomImmat || 0}€)`); + if (rc.checkContConf) engagements.push(`Contenu confié (Capital: ${rc.capitalContConf || 0}€)`); + if (rc.checkDiffInv) engagements.push(`Différence d'inventaire (Capital: ${rc.capitalDiffInv || 0}€)`); + + let dateNow = moment().format("DD MMMM YYYY"); + + doc.render({ + // Infos générales + matricule: user.matricule, + date: dateNow, + typeCotisation: rcMain.typeCotisation || "Non défini", + hasforfaitaire: !(rcMain.typeCotisation === "forfaitaire" || (!rcMain.chiffreAffaires || rcMain.chiffreAffaires === 0)), + hasRCE: rcMain.checkRCE || false, + hasContrat: !!contrat.numContrat, + numContrat: contrat.numContrat, + hasSaisine: !!contrat.numSaisine, + numSaisine: contrat.numSaisine, + numeroCS: contrat.numSaisine || contrat.numContrat, + nomAssure: client.nom, + ca: rcMain.chiffreAffaires || 0, + hasNbVehicule: (rcMain.nombreVehicules || 0) > 0, + nbVehicule: rcMain.nombreVehicules || 0, + + // Activités principales + hasVoiturierLoueur: rcMain.checkVoiturier || rcMain.checkLoueur, + capitalAssureVoiturierLoueur: rcMain.capitalVoiturier || 0, + pourcentageVoiturierLoueur: rc.pourcentageVoiturier || 0, + marchandiseVoiturierLoueur: rcMain.marchandisesVoiturier || [], + activiteVoiturierLoueur: rcMain.actComplVoiturier || [], + + hasComTransport: rcMain.checkCommissionnaire || false, + capitalAssureComTransport: rcMain.capitalCommissionnaire || 0, + pourcentageComTransport: rc.pourcentageCommissionnaire || 0, + marchandiseComTransport: rcMain.marchandisesCommissionnaire || [], + activiteComTransport: rcMain.actComplCommissionnaire || [], + + hasDemenageur: rcMain.checkDemenageur || false, + capitalAssureDemenageur: rcMain.capitalDemenageur || 0, + pourcentageDemenageur: rc.pourcentageDemenageur || 0, + marchandiseDemenageur: rcMain.marchandisesDemenageur || [], + activiteDemenageur: rcMain.actComplDemenageur || [], + + hasLogistique: rcMain.checkLogistique || false, + capitalAssureLogistique: rcMain.capitalLogistique || 0, + pourcentageLogistique: rc.pourcentageLogistique || 0, + marchandiseLogistique: rcMain.marchandisesLogistique || [], + activiteLogistique: rcMain.actComplLogistique || [], + + hasAutocariste: rcMain.checkAutocariste || false, + capitalAssureAutocariste: rcMain.capitalAutocariste || 0, + pourcentageAutocariste: rc.pourcentageAutocariste || 0, + marchandiseAutocariste: rcMain.marchandisesAutocariste || [], + activiteAutocariste: rcMain.activitesAutocariste || [], + + hasAutre: rcMain.checkAutres || false, + capitalAssureAutre: rcMain.capitalAutres || 0, + pourcentageAutre: rc.pourcentageAutres || 0, + marchandiseAutre: rcMain.marchandisesAutres || [], + //activiteAutre: rcMain.activitesAutres || [], existe pas dans ejs + + // Zones géographiques + zones: zones, + + // Garanties additionnelles + hasGarantieAdd: garantiesAdditionnelles.length > 0, + garantieAdd: garantiesAdditionnelles, + + // Engagements complémentaires + hasEngagement: engagements.length > 0, + engagement: engagements, + + // Tarifs sélectionnés + franchise: rc.franchiseChoisie || rc.franchiseSelectionnee, + tarifReference: getSelectedTarifReference(rc), + tarifCommercial: rc.tarifcommercial, + primeRCC: getSelectedPrime(rc, 'RCC'), + tauxRCC: formatTaux(getSelectedTaux(rc, 'RCC')), + hasRCE: rcMain.checkRCE, + primeRCE: getSelectedPrime(rc, 'RCE'), + tauxRCE: formatTaux(getSelectedTaux(rc, 'RCE')), + hasPrimePJ: rc.checkPJ && getSelectedPrime(rc, 'PJ') > 0, + primePJ: getSelectedPrime(rc, 'PJ'), + tauxGlobal: formatTaux(getSelectedTaux(rc, 'Global')), + + + // Propositions franchise 250 + tarifRefP1: rc.primeTotal_250 || 0, + pRCCP1: rc.primeRCC_250 || 0, + tRCCP1: formatTaux(rc.tauxRCC_250), + pRCEP1: rc.primeRCE_250 || 0, + tRCEP1: formatTaux(rc.tauxRCE_250), + primePJP1: rc.primePJ_250 || 0, + tauxGlobalP1: formatTaux(rc.tauxGlobal_250), + + // Propositions franchise 400 + tarifRefP2: rc.primeTotal_400 || 0, + pRCCP2: rc.primeRCC_400 || 0, + tRCCP2: formatTaux(rc.tauxRCC_400), + pRCEP2: rc.primeRCE_400 || 0, + tRCEP2: formatTaux(rc.tauxRCE_400), + primePJP2: rc.primePJ_400 || 0, + tauxGlobalP2: formatTaux(rc.tauxGlobal_400), + + // Propositions franchise 2000 + tarifRefP3: rc.primeTotal_2000 || 0, + pRCCP3: rc.primeRCC_2000 || 0, + tRCCP3: formatTaux(rc.tauxRCC_2000), + pRCEP3: rc.primeRCE_2000 || 0, + tRCEP3: formatTaux(rc.tauxRCE_2000), + primePJP3: rc.primePJ_2000 || 0, + tauxGlobalP3: formatTaux(rc.tauxGlobal_2000), + }); + + const buf = doc.getZip().generate({ type: "nodebuffer" }); + + const currentDate = new Date(); + + // Formatage de la date au format "JJ-MM-AAAA-HH-MM-SS" + const day = String(currentDate.getDate()).padStart(2, "0"); + const month = String(currentDate.getMonth() + 1).padStart(2, "0"); + const year = currentDate.getFullYear(); + const hours = String(currentDate.getHours()).padStart(2, "0"); + const minutes = String(currentDate.getMinutes()).padStart(2, "0"); + const seconds = String(currentDate.getSeconds()).padStart(2, "0"); + const formattedDate = `${day}-${month}-${year}-${hours}-${minutes}-${seconds}`; + + const sanitizedClientNom = client.nom + .replace(/[^\w\s.-]/gi, "") + .replace(/\s+/g, "-"); + + const filename = `Tarif-RC-${parcours.numParcours}-${sanitizedClientNom}-${formattedDate}`; + + res.setHeader( + "Content-Type", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ); + res.setHeader("Content-Disposition", "attachment; filename=" + filename + ".docx"); + res.send(buf); + } catch (error) { + logger.log("error", 'Error in RC tarif generation:', error); + return res.status(500).send("Erreur lors de la génération du tarif RC"); + } +}); + + + +module.exports = router; \ No newline at end of file diff --git a/ecole/src/controllers/navParcoursController.js b/ecole/src/controllers/navParcoursController.js index 7957d553..62cf03e5 100644 --- a/ecole/src/controllers/navParcoursController.js +++ b/ecole/src/controllers/navParcoursController.js @@ -22,7 +22,7 @@ router.get('/contrat', async (req, res) => { }); router.get('/tarifrc', async (req, res) => { - renderPage('dev.ejs', res, {}, true); + renderPage('tarifformrc.ejs', res, {}, true); }); router.get('/tariffac', async (req, res) => { diff --git a/ecole/src/controllers/rcController.js b/ecole/src/controllers/rcController.js index 5eb55239..cc863d6e 100644 --- a/ecole/src/controllers/rcController.js +++ b/ecole/src/controllers/rcController.js @@ -1,12 +1,152 @@ const express = require('express'); const router = express.Router(); const rcService = require('../services/rcService'); +const constantesJSON = require("../constantes/json-modulateur-rc"); +const logger = require('../utils/logger'); +// ===== Routes RC principale ===== router.post('/create', async (req, res) => { - const data = req.body; - const rc = await rcService.createRc(data); + try { + const data = req.body; + const rc = await rcService.createRc(data); + res.json({ valid: Boolean(rc), rc }); + } catch (error) { + logger.log("error", "Error creating RC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); - res.json({ valid: Boolean(rc), rc }); +router.get('/:id', async (req, res) => { + try { + const rc = await rcService.getRcById(req.params.id); + res.json({ valid: Boolean(rc), rc }); + } catch (error) { + logger.log("error", "Error getting RC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); + +router.post('/update/:id', async (req, res) => { + try { + const rc = await rcService.updateRc(req.params.id, req.body); + res.json({ valid: Boolean(rc), rc }); + } catch (error) { + logger.log("error", "Error updating RC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); + +// ===== Routes TarifRC ===== +router.post('/tarif/create', async (req, res) => { + try { + const data = req.body; + const tarifRc = await rcService.createTarifRc(data); + res.json({ valid: Boolean(tarifRc), tarifRc }); + } catch (error) { + logger.log("error", "Error creating TarifRC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); + +router.get('/tarif/:id', async (req, res) => { + try { + const tarifRc = await rcService.getTarifRcById(req.params.id); + res.json({ valid: Boolean(tarifRc), tarifRc }); + } catch (error) { + logger.log("error", "Error getting TarifRC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); + +router.post('/tarif/update/:id', async (req, res) => { + try { + const tarifRc = await rcService.updateTarifRc(req.params.id, req.body); + res.json({ valid: Boolean(tarifRc), tarifRc }); + } catch (error) { + logger.log("error", "Error updating TarifRC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); + +// ===== Routes ProjetRC ===== +router.post('/projet/create', async (req, res) => { + try { + const data = req.body; + const projetRc = await rcService.createProjetRc(data); + res.json({ valid: Boolean(projetRc), projetRc }); + } catch (error) { + logger.log("error", "Error creating ProjetRC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); + +router.get('/projet/:id', async (req, res) => { + try { + const projetRc = await rcService.getProjetRcById(req.params.id); + res.json({ valid: Boolean(projetRc), projetRc }); + } catch (error) { + logger.log("error", "Error getting ProjetRC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); + +router.post('/projet/update/:id', async (req, res) => { + try { + const projetRc = await rcService.updateProjetRc(req.params.id, req.body); + res.json({ valid: Boolean(projetRc), projetRc }); + } catch (error) { + logger.log("error", "Error updating ProjetRC:", error); + res.status(500).json({ valid: false, error: "Internal Server Error" }); + } +}); + +// ===== Routes Modulateurs ===== +router.get("/modulo/:objDemande", async (req, res) => { + const objDemande = req.params.objDemande; + var objRetourne + + switch (objDemande) { + case "CARC": + objRetourne = constantesJSON.modRCCA; + break; + case "activiteRCC": + objRetourne = constantesJSON.modRCActRCC; + break; + case "activiteRCE": + objRetourne = constantesJSON.modRCActRCE; + break; + case "activiteComplRC": + objRetourne = constantesJSON.modRCActCompl; + break; + case "marchandiseRC": + objRetourne = constantesJSON.modRCMar; + break; + case "zoneRC": + objRetourne = constantesJSON.modRCZone; + break; + case "engagComplRC": + objRetourne = constantesJSON.modRCEngagCompl; + break; + case "garAdditionelRC": + objRetourne = constantesJSON.modRCGarAdd ; + break; + case "sinistreRC": + objRetourne = constantesJSON.modRCSinistre; + break; + case "franchiseRC": + objRetourne = constantesJSON.modRCFranchise; + break; + case "primeMiniRC": + objRetourne = constantesJSON.modRCPrimeMini; + break; + } + + try { + res.json({valid: Boolean(objRetourne), objRetourne}); + } catch (error) { + logger.log("error", `Error finding constant ${objDemande}:`, error); + res.status(500).json({valid: false, error: "Internal Server Error"}); + } }); module.exports = router; \ No newline at end of file diff --git a/ecole/src/db/pb_data/data.db b/ecole/src/db/pb_data/data.db index c7402141acae8e4b7145cb81ac0b91115d9f4446..8a065ea0a58ddbdd6b7319e8ba13d916bdd1ef6e 100644 GIT binary patch delta 67818 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 aEz_A(j@v9{X-E0K58^0!jj;pK==mQX^k^pl literal 1318912 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 NKO+% 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⁡H^`RGxWyo>Iiewj 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�lSJ%=#4?W_`rH_i9fTtwCPfU{Ulb5wXNC?3 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