/** * Orchestrateur de synchro RC entre les écrans Tarif et Projet. */ (function(window) { 'use strict'; // Attendre que les dépendances soient chargées if (!window.RCSync || !window.RCDataManager) { console.error('Dependances RC Sync manquantes'); return; } const { isFieldImpactingTarif, showReturnToTarifModal } = window.RCSync; const { collectAllTarifData, 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 si on est sur la page tarif ou projet. */ 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; } /** * Détecte le produit courant à partir de la session. * * @returns {string|null} Code produit en minuscule */ function detectCurrentProduct() { try { const contrat = JSON.parse(sessionStorage.getItem('contrat') || 'null'); const fromContrat = contrat?.produit; if (fromContrat) return String(fromContrat).toLowerCase(); const parcours = JSON.parse(sessionStorage.getItem('parcours') || 'null'); const fromParcours = parcours?.["@expand"]?.contrat?.produit; return fromParcours ? String(fromParcours).toLowerCase() : null; } catch (error) { console.warn('Impossible de lire le produit courant:', error); return null; } } // ═══════════════════════════════════════════════════════════════════════ // GESTION SESSIONSTORAGE // ═══════════════════════════════════════════════════════════════════════ /** * Sauvegarde le snapshot du tarif validé en sessionStorage. */ 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('Donnees tarif sauvegardees en session'); } catch (error) { console.error('Erreur sauvegarde session:', error); } } /** * Lit les données tarif sauvegardées en sessionStorage. */ 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; } } // ═══════════════════════════════════════════════════════════════════════ // HOOK: APRÈS VALIDATION TARIF // ═══════════════════════════════════════════════════════════════════════ /** * Hook appelé après validation tarif pour garder l'état en session. */ function onTarifValidated() { console.log('Hook tarif valide: collecte des donnees'); try { // Collecter toutes les données du tarif const tarifData = collectAllTarifData(); // Sauvegarder en session pour le pré-remplissage projet saveTarifDataToSession(tarifData); console.log('Donnees tarif pretes pour le projet'); } catch (error) { console.error('Erreur hook tarif valide:', error); } } // ═══════════════════════════════════════════════════════════════════════ // INITIALISATION PAGE PROJET // ═══════════════════════════════════════════════════════════════════════ /** * Initialisation côté projet. * Le pré-remplissage reste géré dans projet-form-rc.js. */ function initProjetPage() { console.log('Initialisation RC Orchestrator pour la page Projet'); const currentProduct = detectCurrentProduct(); if (currentProduct === 'rc') { console.log('Projet RC detecte: la gestion modal est deja faite dans projet-form-rc.js'); return; } // 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 } /** * Fallback générique de détection d'impact sur la page projet. */ 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 detection'); return; } console.log('Configuration de la detection des changements'); console.log('Donnees 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 detecte: ${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 activites:', selectedValues); console.warn('Activites 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 geographiques impactent le tarif'); showReturnToTarifModal('Zones géographiques'); }); }); console.log('Detection des changements configuree'); } // ═══════════════════════════════════════════════════════════════════════ // 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('Pre-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 de 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 intercepte'); } }, 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: demarrage'); const activePage = detectActivePage(); console.log(`Page active detectee: ${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);