From 47c70697d32ddc37f3115410a1b0015618f0cfe7 Mon Sep 17 00:00:00 2001
From: Alexis Burnaz <48258099+alxsbrz@users.noreply.github.com>
Date: Mon, 20 Apr 2026 11:38:03 +0200
Subject: [PATCH] fix(rc): fiabiliser modal impact projet et bypass cache
scripts
---
ecole/public/js/nav-parcours.js | 9 +-
ecole/public/js/projet-form-rc.js | 118 ++++++++++++++++++---------
ecole/views/partials/navparcours.ejs | 4 +-
3 files changed, 90 insertions(+), 41 deletions(-)
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
+