diff --git a/ecole/public/js/nav-parcours.js b/ecole/public/js/nav-parcours.js index fbed7d67..560449df 100644 --- a/ecole/public/js/nav-parcours.js +++ b/ecole/public/js/nav-parcours.js @@ -1,5 +1,12 @@ document.addEventListener('DOMContentLoaded', function() { var inputChanged = false + let assetVersion = null; + + function getAssetVersion() { + if (assetVersion) return assetVersion; + assetVersion = String(Date.now()); + return assetVersion; + } function openModalUpdate(selectedSubmenu, numParcours) { const elem = document.getElementById('modalUpdate'); @@ -113,7 +120,7 @@ document.addEventListener('DOMContentLoaded', function() { // Création et ajout du nouveau script correspondant au sous-menu const script = document.createElement('script'); - script.src = scriptSrc + script.src = `${scriptSrc}?v=${encodeURIComponent(getAssetVersion())}`; script.className = 'dynamic-script'; script.onload = async function() { if (submenu === "tarif" || submenu == "projet") { diff --git a/ecole/public/js/projet-form-rc.js b/ecole/public/js/projet-form-rc.js index c776f5e0..a98cc738 100644 --- a/ecole/public/js/projet-form-rc.js +++ b/ecole/public/js/projet-form-rc.js @@ -67,6 +67,9 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio function getLinkedTarifId() { if (tarif && typeof tarif === 'object' && tarif.id) return tarif.id; + if (typeof tarif === 'string' && tarif.trim()) return tarif; + if (rc && typeof rc.tarifRC === 'object' && rc.tarifRC.id) return rc.tarifRC.id; + if (rc && typeof rc.tarif === 'object' && rc.tarif.id) return rc.tarif.id; if (typeof rc?.tarifRC === 'string' && rc.tarifRC.trim()) return rc.tarifRC; if (typeof rc?.tarif === 'string' && rc.tarif.trim()) return rc.tarif; return null; @@ -76,6 +79,39 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio return Boolean(getLinkedTarifId()); } + function refreshTarifContextFromSession() { + try { + const sessionContrat = JSON.parse(sessionStorage.getItem('contrat') || 'null'); + const sessionRC = sessionContrat?.["@expand"]?.enCours || null; + if (!sessionRC || typeof sessionRC !== 'object') return false; + + rc = sessionRC; + projet = sessionRC?.["@expand"]?.projetRC || sessionRC?.["@expand"]?.projet || sessionRC?.projetRC || sessionRC?.projet || null; + tarif = sessionRC?.["@expand"]?.tarifRC || sessionRC?.["@expand"]?.tarif || sessionRC?.tarifRC || sessionRC?.tarif || null; + + window.rc = rc; + window.projet = projet; + window.tarif = tarif; + return true; + } catch (error) { + console.warn('Impossible de recharger le contexte RC depuis la session:', error); + return false; + } + } + + function ensureTarifImpactContext() { + if (hasTarifReference() && tarifOriginalData) return true; + + refreshTarifContextFromSession(); + if (!hasTarifReference()) return false; + + if (!tarifOriginalData) { + saveOriginalTarifData(); + } + + return Boolean(tarifOriginalData); + } + async function loadModulateurs() { try { const response = await fetch('/rc/modulo/activiteRCC'); @@ -120,21 +156,32 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio function saveOriginalTarifData() { if (!hasTarifReference()) 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 readGarantiesFromProjet = () => { + const garanties = []; + if (!projet) return garanties; + if (projet.extRCCConfie) garanties.push('contenant-confie'); + if (projet.extRCCTPPC) garanties.push('tppc'); + if (projet.extRCCModifCalArrim) garanties.push('modif-calage-arrimage'); + if (projet.extRCCFerroutage) garanties.push('ferroutage'); + if (projet.extRCCFraisRecons) garanties.push('frais-reconstitution'); + if (projet.extRCCRegie) garanties.push('regie'); + if (projet.extRCCSansMontageDemontage) garanties.push('sans-montage-demontage'); + return garanties; + }; + + const readGarantiesFromForm = () => { + const garantieRCCSelector = document.getElementById('garantieRCC-selector'); + if (!garantieRCCSelector) return []; + return Array.from(garantieRCCSelector.selectedOptions).map((opt) => opt.value); + }; + + const garantiesRCC = readGarantiesFromProjet(); + if (garantiesRCC.length === 0) { + const garantiesFromForm = readGarantiesFromForm(); + garantiesRCC.push(...garantiesFromForm); } - + const parseArray = (value) => { if (Array.isArray(value)) return value; if (typeof value === 'string') { @@ -182,7 +229,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio garantiesRCC: garantiesRCC, ca: rc?.chiffreAffaires || tarif?.ca || '', pj: tarif?.checkPJ || false, - typeExtConfies: getCurrentTypeExtConfies(), + typeExtConfies: projet?.typeExtConfies || rc?.typeExtConfies || getCurrentTypeExtConfies(), grilleAdvalorem: collectEffectiveAdvaloremGrid(getCurrentZoneData()) }; } @@ -849,12 +896,12 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio logTarifImpactSkip('ignore car modal deja ouverte'); return false; } - if (!hasTarifReference()) { - logTarifImpactSkip('aucune reference tarif detectee', { tarif, rcTarifRC: rc?.tarifRC, rcTarif: rc?.tarif }); - return false; - } - if (!tarifOriginalData) { - logTarifImpactSkip('snapshot tarifOriginalData absent'); + if (!ensureTarifImpactContext()) { + if (!hasTarifReference()) { + logTarifImpactSkip('aucune reference tarif detectee', { tarif, rcTarifRC: rc?.tarifRC, rcTarif: rc?.tarif }); + } else { + logTarifImpactSkip('snapshot tarifOriginalData absent'); + } return false; } @@ -888,14 +935,9 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio } function setupTarifImpactListeners() { - if (!hasTarifReference()) { - logTarifImpactSkip('listeners non actives: aucune reference tarif'); - return; - } - + ensureTarifImpactContext(); setTimeout(() => { - saveOriginalTarifData(); - if (!tarifOriginalData) { + if (!ensureTarifImpactContext()) { logTarifImpactSkip('saveOriginalTarifData n a pas initialise de snapshot'); } }, 500); @@ -932,7 +974,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio } setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; const originalSelection = [...lastActivitySelection]; if (promptTarifImpactIfNeeded({ isImpacting: () => checkActivityImpact(getCurrentActivityData()), @@ -966,7 +1008,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio const originalSelection = lastMarchandiseSelection; setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; if (promptTarifImpactIfNeeded({ isImpacting: () => checkMarchandiseImpact(getCurrentMarchandiseData()), restore: () => restoreChangedFieldValue(this, originalSelection), @@ -1004,7 +1046,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio } setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; if (promptTarifImpactIfNeeded({ isImpacting: () => checkZoneImpact(getCurrentZoneData()), restore: () => restoreZoneState(previousZones) @@ -1030,7 +1072,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio if (isRestoringValue) return; setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; const originalSelection = [...lastGarantieRCCSelection]; if (promptTarifImpactIfNeeded({ isImpacting: () => checkGarantieRCCImpact(getCurrentGarantieRCCData()), @@ -1069,7 +1111,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio const originalChecked = this.dataset.tarifPrevChecked === 'true'; setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; if (promptTarifImpactIfNeeded({ isImpacting: () => checkActiviteComplImpact(getCurrentActiviteComplData()), restore: () => restoreChangedFieldValue(this, originalChecked) @@ -1094,7 +1136,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio if (isRestoringValue) return; setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; const stateToRestore = previousCotisationState; if (promptTarifImpactIfNeeded({ isImpacting: () => checkCotisationImpact(), @@ -1129,7 +1171,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio if (isRestoringValue) return; setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; if (promptTarifImpactIfNeeded({ isImpacting: () => checkCapitalImpactByField(this.id, this.value), restore: () => restoreChangedFieldValue(this, originalValue), @@ -1181,7 +1223,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio } setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; if (promptTarifImpactIfNeeded({ isImpacting: () => checkPJImpact(), restore: () => restorePJState(stateToRestore), @@ -1213,7 +1255,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio } setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; if (promptTarifImpactIfNeeded({ isImpacting: () => checkRCEImpact(), restore: () => restoreRCEState(stateToRestore), @@ -1240,7 +1282,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio if (isRestoringValue) return; setTimeout(() => { - if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; + if (isRestoringValue) return; const previousType = this.dataset.tarifPrevType || ''; if (promptTarifImpactIfNeeded({ isImpacting: () => checkTypeExtConfiesImpact(), diff --git a/ecole/views/partials/navparcours.ejs b/ecole/views/partials/navparcours.ejs index 6773158e..325c85f0 100644 --- a/ecole/views/partials/navparcours.ejs +++ b/ecole/views/partials/navparcours.ejs @@ -65,7 +65,7 @@ - + @@ -80,4 +80,4 @@ - \ No newline at end of file +