fix(rc): fiabiliser modal impact projet et bypass cache scripts

This commit is contained in:
Alexis Burnaz 2026-04-20 11:38:03 +02:00
parent a8d0e69585
commit 47c70697d3
3 changed files with 90 additions and 41 deletions

View File

@ -1,5 +1,12 @@
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
var inputChanged = false var inputChanged = false
let assetVersion = null;
function getAssetVersion() {
if (assetVersion) return assetVersion;
assetVersion = String(Date.now());
return assetVersion;
}
function openModalUpdate(selectedSubmenu, numParcours) { function openModalUpdate(selectedSubmenu, numParcours) {
const elem = document.getElementById('modalUpdate'); const elem = document.getElementById('modalUpdate');
@ -113,7 +120,7 @@ document.addEventListener('DOMContentLoaded', function() {
// Création et ajout du nouveau script correspondant au sous-menu // Création et ajout du nouveau script correspondant au sous-menu
const script = document.createElement('script'); const script = document.createElement('script');
script.src = scriptSrc script.src = `${scriptSrc}?v=${encodeURIComponent(getAssetVersion())}`;
script.className = 'dynamic-script'; script.className = 'dynamic-script';
script.onload = async function() { script.onload = async function() {
if (submenu === "tarif" || submenu == "projet") { if (submenu === "tarif" || submenu == "projet") {

View File

@ -67,6 +67,9 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
function getLinkedTarifId() { function getLinkedTarifId() {
if (tarif && typeof tarif === 'object' && tarif.id) return tarif.id; 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?.tarifRC === 'string' && rc.tarifRC.trim()) return rc.tarifRC;
if (typeof rc?.tarif === 'string' && rc.tarif.trim()) return rc.tarif; if (typeof rc?.tarif === 'string' && rc.tarif.trim()) return rc.tarif;
return null; return null;
@ -76,6 +79,39 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
return Boolean(getLinkedTarifId()); 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() { async function loadModulateurs() {
try { try {
const response = await fetch('/rc/modulo/activiteRCC'); const response = await fetch('/rc/modulo/activiteRCC');
@ -120,21 +156,32 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
function saveOriginalTarifData() { function saveOriginalTarifData() {
if (!hasTarifReference()) return; if (!hasTarifReference()) return;
const garantieRCCSelector = document.getElementById('garantieRCC-selector'); const readGarantiesFromProjet = () => {
let garantiesRCC = []; const garanties = [];
if (garantieRCCSelector) { if (!projet) return garanties;
garantiesRCC = Array.from(garantieRCCSelector.selectedOptions).map(opt => opt.value); if (projet.extRCCConfie) garanties.push('contenant-confie');
} else if (projet) { if (projet.extRCCTPPC) garanties.push('tppc');
if (projet.extRCCConfie) garantiesRCC.push('contenant-confie'); if (projet.extRCCModifCalArrim) garanties.push('modif-calage-arrimage');
if (projet.extRCCTPPC) garantiesRCC.push('tppc'); if (projet.extRCCFerroutage) garanties.push('ferroutage');
if (projet.extRCCModifCalArrim) garantiesRCC.push('modif-calage-arrimage'); if (projet.extRCCFraisRecons) garanties.push('frais-reconstitution');
if (projet.extRCCFerroutage) garantiesRCC.push('ferroutage'); if (projet.extRCCRegie) garanties.push('regie');
if (projet.extRCCFraisRecons) garantiesRCC.push('frais-reconstitution'); if (projet.extRCCSansMontageDemontage) garanties.push('sans-montage-demontage');
if (projet.extRCCRegie) garantiesRCC.push('regie'); return garanties;
if (projet.extRCCSansMontageDemontage) garantiesRCC.push('sans-montage-demontage'); };
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) => { const parseArray = (value) => {
if (Array.isArray(value)) return value; if (Array.isArray(value)) return value;
if (typeof value === 'string') { if (typeof value === 'string') {
@ -182,7 +229,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
garantiesRCC: garantiesRCC, garantiesRCC: garantiesRCC,
ca: rc?.chiffreAffaires || tarif?.ca || '', ca: rc?.chiffreAffaires || tarif?.ca || '',
pj: tarif?.checkPJ || false, pj: tarif?.checkPJ || false,
typeExtConfies: getCurrentTypeExtConfies(), typeExtConfies: projet?.typeExtConfies || rc?.typeExtConfies || getCurrentTypeExtConfies(),
grilleAdvalorem: collectEffectiveAdvaloremGrid(getCurrentZoneData()) grilleAdvalorem: collectEffectiveAdvaloremGrid(getCurrentZoneData())
}; };
} }
@ -849,12 +896,12 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
logTarifImpactSkip('ignore car modal deja ouverte'); logTarifImpactSkip('ignore car modal deja ouverte');
return false; return false;
} }
if (!hasTarifReference()) { if (!ensureTarifImpactContext()) {
logTarifImpactSkip('aucune reference tarif detectee', { tarif, rcTarifRC: rc?.tarifRC, rcTarif: rc?.tarif }); if (!hasTarifReference()) {
return false; logTarifImpactSkip('aucune reference tarif detectee', { tarif, rcTarifRC: rc?.tarifRC, rcTarif: rc?.tarif });
} } else {
if (!tarifOriginalData) { logTarifImpactSkip('snapshot tarifOriginalData absent');
logTarifImpactSkip('snapshot tarifOriginalData absent'); }
return false; return false;
} }
@ -888,14 +935,9 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
} }
function setupTarifImpactListeners() { function setupTarifImpactListeners() {
if (!hasTarifReference()) { ensureTarifImpactContext();
logTarifImpactSkip('listeners non actives: aucune reference tarif');
return;
}
setTimeout(() => { setTimeout(() => {
saveOriginalTarifData(); if (!ensureTarifImpactContext()) {
if (!tarifOriginalData) {
logTarifImpactSkip('saveOriginalTarifData n a pas initialise de snapshot'); logTarifImpactSkip('saveOriginalTarifData n a pas initialise de snapshot');
} }
}, 500); }, 500);
@ -932,7 +974,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
} }
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
const originalSelection = [...lastActivitySelection]; const originalSelection = [...lastActivitySelection];
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkActivityImpact(getCurrentActivityData()), isImpacting: () => checkActivityImpact(getCurrentActivityData()),
@ -966,7 +1008,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
const originalSelection = lastMarchandiseSelection; const originalSelection = lastMarchandiseSelection;
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkMarchandiseImpact(getCurrentMarchandiseData()), isImpacting: () => checkMarchandiseImpact(getCurrentMarchandiseData()),
restore: () => restoreChangedFieldValue(this, originalSelection), restore: () => restoreChangedFieldValue(this, originalSelection),
@ -1004,7 +1046,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
} }
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkZoneImpact(getCurrentZoneData()), isImpacting: () => checkZoneImpact(getCurrentZoneData()),
restore: () => restoreZoneState(previousZones) restore: () => restoreZoneState(previousZones)
@ -1030,7 +1072,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
if (isRestoringValue) return; if (isRestoringValue) return;
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
const originalSelection = [...lastGarantieRCCSelection]; const originalSelection = [...lastGarantieRCCSelection];
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkGarantieRCCImpact(getCurrentGarantieRCCData()), isImpacting: () => checkGarantieRCCImpact(getCurrentGarantieRCCData()),
@ -1069,7 +1111,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
const originalChecked = this.dataset.tarifPrevChecked === 'true'; const originalChecked = this.dataset.tarifPrevChecked === 'true';
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkActiviteComplImpact(getCurrentActiviteComplData()), isImpacting: () => checkActiviteComplImpact(getCurrentActiviteComplData()),
restore: () => restoreChangedFieldValue(this, originalChecked) restore: () => restoreChangedFieldValue(this, originalChecked)
@ -1094,7 +1136,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
if (isRestoringValue) return; if (isRestoringValue) return;
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
const stateToRestore = previousCotisationState; const stateToRestore = previousCotisationState;
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkCotisationImpact(), isImpacting: () => checkCotisationImpact(),
@ -1129,7 +1171,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
if (isRestoringValue) return; if (isRestoringValue) return;
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkCapitalImpactByField(this.id, this.value), isImpacting: () => checkCapitalImpactByField(this.id, this.value),
restore: () => restoreChangedFieldValue(this, originalValue), restore: () => restoreChangedFieldValue(this, originalValue),
@ -1181,7 +1223,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
} }
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkPJImpact(), isImpacting: () => checkPJImpact(),
restore: () => restorePJState(stateToRestore), restore: () => restorePJState(stateToRestore),
@ -1213,7 +1255,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
} }
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkRCEImpact(), isImpacting: () => checkRCEImpact(),
restore: () => restoreRCEState(stateToRestore), restore: () => restoreRCEState(stateToRestore),
@ -1240,7 +1282,7 @@ window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollutio
if (isRestoringValue) return; if (isRestoringValue) return;
setTimeout(() => { setTimeout(() => {
if (!hasTarifReference() || !tarifOriginalData || isRestoringValue) return; if (isRestoringValue) return;
const previousType = this.dataset.tarifPrevType || ''; const previousType = this.dataset.tarifPrevType || '';
if (promptTarifImpactIfNeeded({ if (promptTarifImpactIfNeeded({
isImpacting: () => checkTypeExtConfiesImpact(), isImpacting: () => checkTypeExtConfiesImpact(),

View File

@ -65,7 +65,7 @@
</div> </div>
<!-- Script pour la page nav-parcours.js --> <!-- Script pour la page nav-parcours.js -->
<script src="/js/nav-parcours.js"></script> <script src="/js/nav-parcours.js?v=<%= Date.now() %>"></script>
<!-- Feuille de style globale : Styles CSS personnalisés pour les formulaires --> <!-- Feuille de style globale : Styles CSS personnalisés pour les formulaires -->
<link rel="stylesheet" href="/css/parcoursform.css"> <link rel="stylesheet" href="/css/parcoursform.css">
@ -80,4 +80,4 @@
<button id="update-OK" class="waves-effect waves-light btn indigo darken-4">Valider</button> <button id="update-OK" class="waves-effect waves-light btn indigo darken-4">Valider</button>
<button id="update-cancel" class="modal-close waves-effect waves-light btn red darken-1">Annuler</button> <button id="update-cancel" class="modal-close waves-effect waves-light btn red darken-1">Annuler</button>
</div> </div>
</div> </div>