personnal/ecole/public/js/rc/projet-form-rc.js

4953 lines
218 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Initialise submenu form.
*/
function initSubmenuForm() {
// Accéder aux informations stockées du parcours
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
}
// 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;
let modRCActRCC, modRCMar, modRCZone, modRCActCompl, modRCGarAdd;
let hasSavedGrilleData = false; // évite d'écraser une grille déjà enregistrée
let rcProjetGuard = null;
/**
* Synchronise rcfloating labels.
*/
function syncRCFloatingLabels() {
if (window.RCValidationUtils && typeof window.RCValidationUtils.syncFloatingLabels === 'function') {
window.RCValidationUtils.syncFloatingLabels(document);
}
}
// Initialisation des tag pour select
var tagAnimauxVivants = false;
var tagMultimodal = false;
var tagDemenageur = false;
var tagDemenageurParticulier = false;
var tagDemenageurParticulierDeclaree = false;
var tagDemenageurParticulierAdvalorem = false;
var tagGardeMeubles = false;
var tagVoiturier = false;
var tagDemenageurEntrInter = false;
// Initialisation du formulaire et des données
/**
* Initialise la logique de cette fonction.
*/
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);
// 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 structure actuelle.
rc = contrat?.["@expand"]?.enCours || null; // RC principal
projet = rc?.["@expand"]?.projetRC || rc?.["@expand"]?.projet || rc?.projetRC || rc?.projet || null;
tarif = rc?.["@expand"]?.tarifRC || rc?.["@expand"]?.tarif || rc?.tarifRC || rc?.tarif || null;
// 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
try {
setupEventListeners();
} catch (error) {
console.error('Erreur lors de setupEventListeners:', error);
}
try {
populateFormData();
} catch (error) {
console.error('Erreur lors de populateFormData:', error);
}
let impactListenersReady = false;
try {
setupTarifImpactListeners();
impactListenersReady = true;
} catch (error) {
console.error('Erreur lors de setupTarifImpactListeners:', error);
}
// Retry léger: certains contextes chargent des blocs dynamiques juste après init.
if (!impactListenersReady) {
setTimeout(() => {
try {
setupTarifImpactListeners();
} catch (error) {
console.error('Nouvel échec setupTarifImpactListeners (retry):', error);
}
}, 700);
}
updatePrimeReferenceRow();
updateTarifCommercialRows();
syncTotalWithTarifCommercial();
setupRCSafeValidation();
syncRCFloatingLabels();
updateSubmitButtonState('projetForm');
setTimeout(() => {
updatePrimeReferenceRow();
updateTarifCommercialRows();
syncTotalWithTarifCommercial();
if (rcProjetGuard) rcProjetGuard.refresh();
syncRCFloatingLabels();
refreshTarifReferenceFromApi();
}, 350);
}
let tarifOriginalData = null;
/**
* Recupere linked tarif id.
*/
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;
}
/**
* Verifie tarif reference.
*/
function hasTarifReference() {
return Boolean(getLinkedTarifId());
}
/**
* Gere refresh tarif context from session.
*/
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;
updatePrimeReferenceRow();
updateTarifCommercialRows();
syncTotalWithTarifCommercial();
return true;
} catch (error) {
console.warn('Impossible de recharger le contexte RC depuis la session:', error);
return false;
}
}
/**
* Gere refresh tarif reference from api.
*/
async function refreshTarifReferenceFromApi() {
const tarifId = getLinkedTarifId();
if (!tarifId) return false;
try {
const response = await fetch(`/rc/tarif/${tarifId}`);
const data = await response.json();
if (!data?.valid || !data?.tarifRc) {
return false;
}
tarif = data.tarifRc;
if (rc && typeof rc === 'object') {
rc.tarifRC = tarif;
if (!rc["@expand"] || typeof rc["@expand"] !== 'object') {
rc["@expand"] = {};
}
rc["@expand"].tarifRC = tarif;
}
window.rc = rc;
window.tarif = tarif;
try {
const sessionContrat = JSON.parse(sessionStorage.getItem('contrat') || 'null');
const sessionRC = sessionContrat?.["@expand"]?.enCours;
if (sessionRC && typeof sessionRC === 'object') {
sessionRC.tarifRC = tarif?.id || tarif;
if (!sessionRC["@expand"] || typeof sessionRC["@expand"] !== 'object') {
sessionRC["@expand"] = {};
}
sessionRC["@expand"].tarifRC = tarif;
sessionStorage.setItem('contrat', JSON.stringify(sessionContrat));
}
} catch (error) {
console.warn('Impossible de synchroniser tarifRC en sessionStorage:', error);
}
tarifOriginalData = null;
ensureTarifImpactContext();
updatePrimeReferenceRow();
updateTarifCommercialRows();
syncTotalWithTarifCommercial();
calcCotTotal();
if (rcProjetGuard) rcProjetGuard.refresh();
return true;
} catch (error) {
console.warn('Impossible de recharger le tarif RC depuis l\'API:', error);
return false;
}
}
/**
* Securise tarif impact context.
*/
function ensureTarifImpactContext() {
if (hasTarifReference() && tarifOriginalData) return true;
refreshTarifContextFromSession();
if (!hasTarifReference()) return false;
if (!tarifOriginalData) {
saveOriginalTarifData();
}
return Boolean(tarifOriginalData);
}
/**
* Parse validation number.
*/
function parseValidationNumber(rawValue) {
if (window.RCValidationUtils && typeof window.RCValidationUtils.parseLooseNumber === 'function') {
return window.RCValidationUtils.parseLooseNumber(rawValue);
}
const normalized = String(rawValue ?? '')
.trim()
.replace(/\s/g, '')
.replace(/[€$£¥]/g, '')
.replace(',', '.');
const parsed = Number(normalized);
return Number.isFinite(parsed) ? parsed : NaN;
}
/**
* Formate reference amount.
*/
function formatReferenceAmount(value) {
const number = Number(value);
if (!Number.isFinite(number)) return '0,00 €';
return number.toLocaleString('fr-FR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}) + ' €';
}
/**
* Normalise franchise choice.
*/
function normalizeFranchiseChoice(rawChoice) {
const choice = String(rawChoice || '').trim().toLowerCase();
if (!choice) return null;
if (choice === '250' || choice.includes('250')) return '250';
if (choice === '400' || choice.includes('400')) return '400';
if (choice === 'mini300' || choice.includes('mini 300') || choice.includes('10%')) return 'mini300';
return null;
}
/**
* Resout tarif source for reference.
*/
function resolveTarifSourceForReference() {
if (tarif && typeof tarif === 'object') return tarif;
if (rc?.["@expand"]?.tarifRC && typeof rc["@expand"].tarifRC === 'object') return rc["@expand"].tarifRC;
if (rc?.tarifRC && typeof rc.tarifRC === 'object') return rc.tarifRC;
return null;
}
/**
* Recupere prime reference state.
*/
function getPrimeReferenceState() {
const tarifSource = resolveTarifSourceForReference();
if (!tarifSource) {
return {
valid: false,
reason: 'Aucun tarif RC sélectionné n\'est rattaché à ce dossier.'
};
}
const franchiseKey = normalizeFranchiseChoice(tarifSource.franchiseChoisie);
if (!franchiseKey) {
return {
valid: false,
reason: 'Aucune franchise choisie n\'est disponible dans le tarif RC.'
};
}
const primeFieldByFranchise = {
'250': 'primeTotal_250',
'400': 'primeTotal_400',
'mini300': 'primeTotal_2000'
};
const primeField = primeFieldByFranchise[franchiseKey];
const primeValue = parseValidationNumber(tarifSource[primeField]);
if (!Number.isFinite(primeValue) || primeValue <= 0) {
return {
valid: false,
reason: 'La prime HT de référence du tarif choisi est invalide (0.00, vide ou incohérente).'
};
}
return {
valid: true,
franchiseKey,
primeValue
};
}
/**
* Recupere tarif commercial state.
*/
function getTarifCommercialState() {
const tarifSource = resolveTarifSourceForReference();
if (!tarifSource) {
return {
valid: false,
reason: 'Aucun tarif RC sélectionné n\'est rattaché à ce dossier.'
};
}
const tarifCommercialValue = parseValidationNumber(tarifSource.tarifcommercial);
if (!Number.isFinite(tarifCommercialValue) || tarifCommercialValue <= 0) {
return {
valid: false,
reason: 'Aucun tarif commercial saisi n\'est disponible sur le tarif RC.'
};
}
return {
valid: true,
tarifCommercialValue
};
}
/**
* Met a jour prime reference row.
*/
function updatePrimeReferenceRow() {
const primeInput = document.getElementById('primeRefHT');
const primeError = document.getElementById('primeRefHT-error');
if (!primeInput || !primeError) return;
const state = getPrimeReferenceState();
if (state.valid) {
primeInput.value = formatReferenceAmount(state.primeValue);
primeError.textContent = '';
primeError.style.display = 'none';
return;
}
primeInput.value = 'Non disponible';
primeError.textContent = state.reason;
primeError.style.display = 'block';
}
/**
* Met a jour tarif commercial rows.
*/
function updateTarifCommercialRows() {
const tarifComInput = document.getElementById('tarifComSaisiHT');
const tarifComTtcInput = document.getElementById('tarifComSaisiTTC');
if (!tarifComInput || !tarifComTtcInput) return;
const state = getTarifCommercialState();
if (state.valid) {
const formatted = formatReferenceAmount(state.tarifCommercialValue);
tarifComInput.value = formatted;
tarifComTtcInput.value = formatted;
return;
}
tarifComInput.value = 'Non renseigné';
tarifComTtcInput.value = '//';
}
/**
* Synchronise total with tarif commercial.
*/
function syncTotalWithTarifCommercial(options = {}) {
const totalHTInput = document.getElementById('cotTotalHT');
if (!totalHTInput) return;
const state = getTarifCommercialState();
if (!state.valid) return;
const force = Boolean(options.force);
const currentTotal = parseValidationNumber(totalHTInput.value);
if (!force && Number.isFinite(currentTotal) && currentTotal > 0) {
return;
}
totalHTInput.value = state.tarifCommercialValue.toFixed(2);
}
/**
* Configure rcsafe validation.
*/
function setupRCSafeValidation() {
if (!window.RCValidationUtils || typeof window.RCValidationUtils.createGuard !== 'function') {
return;
}
rcProjetGuard = window.RCValidationUtils.createGuard({
summaryId: 'rcProjetBlockingSummary',
summaryTitle: 'Impossible d\'enregistrer ou de continuer car :',
blockTargets: ['#projetFormBtn', '#generateDeclinaison', '#generateProject']
});
rcProjetGuard.registerField('#CA', {
profile: 'numeric',
label: "Chiffre d'affaires",
min: 0,
positive: true,
requiredWhen: function () {
return document.querySelector('input[name="cotisation"]:checked')?.value === 'revisable';
}
});
rcProjetGuard.registerField('#cotisationIrreductible', {
profile: 'numeric',
label: 'Cotisation minimale irréductible',
min: 0
});
['#tauxRCCHT', '#tauxRCCTTC', '#tauxRCEHT', '#tauxRCETTC', '#tauxTotalHT', '#tauxTotalTTC'].forEach((selector) => {
rcProjetGuard.registerField(selector, {
profile: 'numeric',
label: 'Taux de cotisation',
min: 0,
decimals: 3,
activeWhen: function (field) {
return field && field.offsetParent !== null;
}
});
});
['#cotRCCHT', '#cotRCCTTC', '#cotRCEHT', '#cotRCETTC', '#cotPJHT', '#cotPJTTC', '#cotFraisHT', '#cotFraisTTC', '#cotTotalHT', '#cotTotalTTC'].forEach((selector) => {
rcProjetGuard.registerField(selector, {
profile: 'numeric',
label: 'Cotisation',
min: 0,
activeWhen: function (field) {
return field && field.offsetParent !== null;
}
});
});
rcProjetGuard.registerExternal('legacy-field-errors', function () {
const visibleFieldError = Array.from(
document.querySelectorAll('#projetForm [id$="-error"].red-text')
).find((node) => {
const text = String(node?.textContent || '').trim();
const style = window.getComputedStyle(node);
return Boolean(text) && style.display !== 'none' && style.visibility !== 'hidden';
});
if (visibleFieldError) {
return { valid: false, message: visibleFieldError.textContent.trim() };
}
return { valid: true };
});
rcProjetGuard.registerField('#nomAdditionnel', {
profile: 'text',
label: 'Nom assuré additionnel'
});
rcProjetGuard.registerField('#adresseAditionnel', {
profile: 'text',
label: 'Adresse assuré additionnel'
});
rcProjetGuard.registerField('#siretAdditionnel', {
profile: 'integer',
label: 'SIRET assuré additionnel',
min: 0
});
rcProjetGuard.registerField('#marqueVehicule', {
profile: 'text',
label: 'Marque véhicule'
});
rcProjetGuard.registerField('#genreVehicule', {
profile: 'text',
label: 'Genre véhicule'
});
rcProjetGuard.registerField('#typeVehicule', {
profile: 'text',
label: 'Type véhicule'
});
rcProjetGuard.registerField('#immatVehicule', {
profile: 'immat',
label: 'Immatriculation véhicule'
});
rcProjetGuard.registerField('#capitalVehicule', {
profile: 'numeric',
label: 'Capital véhicule',
min: 0,
positive: true
});
rcProjetGuard.observe('#selected-activities input[type="text"]', {
profile: 'numeric',
label: 'Capital à assurer activité',
min: 0,
positive: true,
required: true,
activeWhen: function (field) {
return field && field.offsetParent !== null;
}
});
rcProjetGuard.observe('#empTableAdditionnel input[name="nom"]', {
profile: 'text',
label: 'Nom assuré additionnel'
});
rcProjetGuard.observe('#empTableAdditionnel input[name="adresse"]', {
profile: 'text',
label: 'Adresse assuré additionnel'
});
rcProjetGuard.observe('#empTableAdditionnel input[name="siret"]', {
profile: 'integer',
label: 'SIRET assuré additionnel',
min: 0
});
rcProjetGuard.observe('#empTableVehicules input[name="marque"], #empTableVehicules input[name="genre"], #empTableVehicules input[name="type"]', {
profile: 'text',
label: 'Désignation véhicule'
});
rcProjetGuard.observe('#empTableVehicules input[name="immat"]', {
profile: 'immat',
label: 'Immatriculation véhicule'
});
rcProjetGuard.observe('#empTableVehicules input[name="capital"]', {
profile: 'numeric',
label: 'Capital véhicule',
min: 0,
positive: true
});
rcProjetGuard.observe('#tabAdvaloTerrestre input[type="text"], #tabAdvaloMultimodal input[type="text"], #tabAdvaloAerien input[type="text"]', {
profile: 'number_or_consulter',
label: 'Valeur ad valorem',
min: 0,
positive: true,
decimals: 3,
required: false
});
rcProjetGuard.registerExternal('marchandises-valides', function () {
const marchandiseSelector = document.getElementById('marchandise-selector');
if (!marchandiseSelector) {
return { valid: true };
}
const selectedCount = Array.from(marchandiseSelector.selectedOptions || []).length;
if (selectedCount > 0) {
return { valid: true };
}
return {
valid: false,
message: 'Marchandises invalides : sélectionnez au moins une marchandise.'
};
});
rcProjetGuard.registerExternal('prime-reference', function () {
const state = getPrimeReferenceState();
if (state.valid) {
return { valid: true };
}
return {
valid: false,
message: state.reason
};
});
rcProjetGuard.refresh();
}
/**
* Charge modulateurs.
*/
async function loadModulateurs() {
try {
const response = await fetch('/rc/modulo/activiteRCC');
const data = await response.json();
if (data.valid) {
modRCActRCC = data.objRetourne;
} else {
console.warn('Modulateur activiteRCC indisponible');
}
const response2 = await fetch('/rc/modulo/marchandiseRC');
const data2 = await response2.json();
if (data2.valid) {
modRCMar = data2.objRetourne;
} else {
console.warn('Modulateur marchandiseRC indisponible');
}
const response3 = await fetch('/rc/modulo/zoneRC');
const data3 = await response3.json();
if (data3.valid) {
modRCZone = data3.objRetourne;
} else {
console.warn('Modulateur zoneRC indisponible');
}
const response4 = await fetch('/rc/modulo/activiteComplRC');
const data4 = await response4.json();
if (data4.valid) {
modRCActCompl = data4.objRetourne;
} else {
console.warn('Modulateur activiteComplRC indisponible');
}
const response5 = await fetch('/rc/modulo/garAdditionelRC');
const data5 = await response5.json();
if (data5.valid) {
modRCGarAdd = data5.objRetourne;
} else {
console.warn('Modulateur garAdditionelRC indisponible');
}
} catch (error) {
console.error('Erreur lors du chargement des modulateurs:', error);
}
}
/**
* Sauvegarde original tarif data.
*/
function saveOriginalTarifData() {
if (!hasTarifReference()) return;
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') {
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,
typeExtConfies: projet?.typeExtConfies || rc?.typeExtConfies || getCurrentTypeExtConfies(),
grilleAdvalorem: collectEffectiveAdvaloremGrid(getCurrentZoneData())
};
}
/**
* Controle activity impact.
*/
function checkActivityImpact(activityData) {
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;
}
/**
* Controle marchandise impact.
*/
function checkMarchandiseImpact(marchandiseData) {
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;
}
/**
* Recupere max zone coefficient.
*/
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 && modRCZone[zoneKey]) {
if (typeof modRCZone[zoneKey].modRCC === "number") {
maxRCC = Math.max(maxRCC, modRCZone[zoneKey].modRCC);
} else {
maxRCC = Math.max(maxRCC, i);
}
if (typeof modRCZone[zoneKey].modRCE === "number") {
maxRCE = Math.max(maxRCE, modRCZone[zoneKey].modRCE);
} else {
maxRCE = Math.max(maxRCE, i);
}
} else {
// Fallback sans modulateur: on considère la zone la plus "forte" sélectionnée.
maxRCC = Math.max(maxRCC, i);
maxRCE = Math.max(maxRCE, i);
}
}
}
return { maxRCC, maxRCE };
}
/**
* Controle zone impact.
*/
function checkZoneImpact(zoneData) {
const originalMax = getMaxZoneCoefficient(tarifOriginalData);
const currentMax = getMaxZoneCoefficient(zoneData);
return originalMax.maxRCC !== currentMax.maxRCC || originalMax.maxRCE !== currentMax.maxRCE;
}
/**
* Controle activite compl impact.
*/
function checkActiviteComplImpact(activiteComplData) {
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;
}
/**
* Recupere current activite compl data.
*/
function getCurrentActiviteComplData() {
const activitesCompl = {
activitesVoiturier: getActivitesComplFromForm('actComplVoiturier/Loueur'),
activitesCommissionnaire: getActivitesComplFromForm('actComplCommissionnaire de Transport'),
activitesDemenageur: getActivitesComplFromForm('actComplDéménageur'),
activitesLogistique: getActivitesComplFromForm('actComplLogistique')
};
return activitesCompl;
}
/**
* Recupere activites compl from form.
*/
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;
}
/**
* Recupere current type ext confies.
*/
function getCurrentTypeExtConfies() {
if (document.getElementById('AdValorem')?.checked) return 'ADVALOREM';
return 'VALEUR DECLAREE';
}
/**
* Capture zone state.
*/
function captureZoneState() {
const state = {};
for (let i = 1; i <= 6; i++) {
const zoneEl = document.getElementById(`zone${i}`);
state[`zone${i}`] = {
checked: Boolean(zoneEl?.checked),
disabled: Boolean(zoneEl?.disabled)
};
}
return state;
}
/**
* Restaure zone state.
*/
function restoreZoneState(state) {
if (!state) return;
isRestoringValue = true;
try {
for (let i = 1; i <= 6; i++) {
const zoneEl = document.getElementById(`zone${i}`);
if (!zoneEl) continue;
const zoneState = state[`zone${i}`] || {};
zoneEl.checked = Boolean(zoneState.checked);
zoneEl.disabled = Boolean(zoneState.disabled);
}
handleGrAdvalo();
} finally {
setTimeout(() => {
isRestoringValue = false;
}, 0);
}
}
/**
* Normalise impact value.
*/
function normalizeImpactValue(value) {
if (Array.isArray(value)) {
return value.map((item) => normalizeImpactValue(item)).sort((a, b) => String(a).localeCompare(String(b), 'fr'));
}
if (value && typeof value === 'object') {
const normalized = {};
Object.keys(value).sort().forEach((key) => {
normalized[key] = normalizeImpactValue(value[key]);
});
return normalized;
}
if (typeof value === 'string') {
const trimmed = value.trim();
if (!trimmed) return '';
const normalizedNumeric = trimmed.replace(/\s/g, '').replace(',', '.');
const parsed = Number(normalizedNumeric);
if (Number.isFinite(parsed)) return parsed;
return trimmed.toLowerCase();
}
if (value == null) return null;
return value;
}
/**
* Collecte effective advalorem grid.
*/
function collectEffectiveAdvaloremGrid(zoneData) {
const activeZones = [];
for (let i = 1; i <= 6; i++) {
if (zoneData?.[`zone${i}`]) activeZones.push(i);
}
const readGrid = (tableId) => {
const rows = extractGrilleAdvalo(tableId);
const filtered = rows.map((row) => {
const entry = { name: row.name };
activeZones.forEach((zone) => {
const key = `zone${zone}`;
entry[key] = row[key] || 'Nous consulter';
});
return entry;
});
return filtered;
};
return {
terrestre: readGrid('tabAdvaloTerrestre'),
multimodal: readGrid('tabAdvaloMultimodal'),
aerien: readGrid('tabAdvaloAerien')
};
}
/**
* Controle cotisation impact.
*/
function checkCotisationImpact() {
const currentCotisation = document.querySelector('input[name="cotisation"]:checked')?.value || null;
return currentCotisation !== (tarifOriginalData?.typeCotisation || null);
}
/**
* Controle caimpact.
*/
function checkCAImpact() {
const currentCA = normalizeImpactValue(document.getElementById('CA')?.value || '');
const originalCA = normalizeImpactValue(tarifOriginalData?.ca || '');
return currentCA !== originalCA;
}
/**
* Controle pjimpact.
*/
function checkPJImpact() {
const currentPJ = Boolean(document.getElementById('switchPJ')?.checked);
return currentPJ !== Boolean(tarifOriginalData?.pj);
}
/**
* Controle rceimpact.
*/
function checkRCEImpact() {
const currentRCE = Boolean(document.getElementById('choixRCE')?.checked);
return currentRCE !== Boolean(tarifOriginalData?.checkRCE);
}
/**
* Controle type ext confies impact.
*/
function checkTypeExtConfiesImpact() {
const currentGaranties = getCurrentGarantieRCCData();
const originalGaranties = Array.isArray(tarifOriginalData?.garantiesRCC) ? tarifOriginalData.garantiesRCC : [];
const relevantNow = currentGaranties.includes('contenant-confie');
const relevantBefore = originalGaranties.includes('contenant-confie');
if (!relevantNow && !relevantBefore) return false;
return getCurrentTypeExtConfies() !== (tarifOriginalData?.typeExtConfies || null);
}
/**
* Parse capital number.
*/
function parseCapitalNumber(value) {
const normalized = String(value ?? '')
.trim()
.replace(/\s/g, '')
.replace(',', '.');
const parsed = Number(normalized);
return Number.isFinite(parsed) ? parsed : 0;
}
/**
* Controle capital impact by field.
*/
function checkCapitalImpactByField(fieldId, fieldValue) {
if (!fieldId || !tarifOriginalData) return false;
// Cas spécifique demandé: Voiturier/Loueur restent modifiables sur Projet sans renvoi Tarif.
if (fieldId === 'voiturier' || fieldId === 'loueur') return false;
const currentValue = parseCapitalNumber(fieldValue);
let originalValue = null;
switch (fieldId) {
case 'commissionnaire-multimodal':
originalValue = tarifOriginalData.capitalCommissionnaire;
break;
case 'demenageur-particulier':
case 'demenageur-particulier-dommage':
case 'demenageur-particulier-advalorem':
case 'demenageur-entreprise':
case 'demenageur-interne':
originalValue = tarifOriginalData.capitalDemenageur;
break;
case 'entrepositaire-depositaire':
case 'prestataire-logistique':
originalValue = tarifOriginalData.capitalLogistique;
break;
case 'autocariste':
originalValue = tarifOriginalData.capitalAutocariste;
break;
case 'autres':
originalValue = tarifOriginalData.capitalAutres;
break;
default:
return checkActivityImpact(getCurrentActivityData());
}
const expected = parseCapitalNumber(originalValue);
return Math.abs(currentValue - expected) > 0.01;
}
/**
* Collecte projet data for tarif prefill.
*/
function collectProjetDataForTarifPrefill() {
const getNumberValue = (id) => {
const element = document.getElementById(id);
if (!element) return null;
const raw = String(element.value || '').trim();
if (!raw || raw.toLowerCase() === 'nous consulter') return null;
const parsed = Number(raw.replace(/\s/g, '').replace(',', '.'));
return Number.isFinite(parsed) ? parsed : null;
};
const hasChip = (chipId) => Boolean(document.getElementById(chipId));
const zone1El = document.getElementById('zone1');
const zone2El = document.getElementById('zone2');
const payload = {
typeCot: (typeof extractTypeCot === 'function') ? extractTypeCot() : document.querySelector('input[name="typeCot"]:checked')?.value || null,
ca: document.getElementById('CA')?.value || '',
autresRC: Boolean(document.getElementById('choixRCE')?.checked),
pj: Boolean(document.getElementById('switchPJ')?.checked),
// Zones (zone1/zone2 peuvent etre forcees en disabled)
zone1: Boolean(zone1El && (zone1El.checked || zone1El.disabled)),
zone2: Boolean(zone2El && (zone2El.checked || zone2El.disabled)),
zone3: Boolean(document.getElementById('zone3')?.checked),
zone4: Boolean(document.getElementById('zone4')?.checked),
zone5: Boolean(document.getElementById('zone5')?.checked),
zone6: Boolean(document.getElementById('zone6')?.checked),
// Activites projet
actVoiturier: hasChip('voiturier-chip'),
actLoueur: hasChip('loueur-chip'),
actMultimodal: hasChip('commissionnaire-multimodal-chip'),
actDemPar: hasChip('demenageur-particulier-chip'),
actDemEntr: hasChip('demenageur-entreprise-chip'),
actDemInterne: hasChip('demenageur-interne-chip'),
actEntDep: hasChip('entrepositaire-depositaire-chip'),
actPrestaLog: hasChip('prestataire-logistique-chip'),
actAutocariste: hasChip('autocariste-chip'),
actAutres: hasChip('autres-chip'),
// Capitaux associes
valueActVoiturier: getNumberValue('voiturier'),
valueActLoueur: getNumberValue('loueur'),
valueActMultimodal: getNumberValue('commissionnaire-multimodal'),
valueActDemPar: getNumberValue('demenageur-particulier'),
valueActDemEntr: getNumberValue('demenageur-entreprise'),
valueActDemInterne: getNumberValue('demenageur-interne'),
valueActEntDep: getNumberValue('entrepositaire-depositaire'),
valueActPrestaLog: getNumberValue('prestataire-logistique'),
valueActAutocariste: getNumberValue('autocariste'),
valueActAutres: getNumberValue('autres'),
// Marchandises (globales sur le projet)
marOrdinaire: hasChip('ordinaire-chip'),
marRoulant: hasChip('roulant-chip'),
marEngins: hasChip('engins-chantier-agricole-chip'),
marRoulantDem: hasChip('roulant-demenagement-chip'),
marMobilerUsag: hasChip('mobilier-usages-chip'),
marPerissable: hasChip('perissable-temperature-dirigee-chip'),
marAnimaux: hasChip('animaux-vivant-chip'),
marCiterne: hasChip('citerne-chip'),
marBeton: hasChip('beton-chip'),
marExceptionnels: hasChip('exceptionnels-chip'),
marVrac: hasChip('vrac-chip'),
// Activites complementaires
activitesVoiturier: getActivitesComplFromForm('actComplVoiturier/Loueur'),
activitesCommissionnaire: getActivitesComplFromForm('actComplCommissionnaire de Transport'),
activitesDemenageur: getActivitesComplFromForm('actComplDéménageur'),
activitesLogistique: getActivitesComplFromForm('actComplLogistique')
};
const vehiculeRows = Array.from(document.querySelectorAll('#empTableVehicules tr')).slice(2);
if (vehiculeRows.length > 0) {
payload.nombreVehicules = vehiculeRows.length;
}
return payload;
}
/**
* Gere store projet data for tarif prefill.
*/
function storeProjetDataForTarifPrefill() {
try {
const payload = collectProjetDataForTarifPrefill();
sessionStorage.setItem('rc_projet_data', JSON.stringify(payload));
} catch (error) {
console.error('Impossible de stocker les donnees projet pour le tarif:', error);
}
}
let isRestoringValue = false;
let isTarifImpactModalOpen = false;
const tarifImpactDebugReasons = new Set();
/**
* Gere log tarif impact skip.
*/
function logTarifImpactSkip(reason, details = null) {
if (tarifImpactDebugReasons.has(reason)) return;
tarifImpactDebugReasons.add(reason);
if (details) {
console.warn(`[RC modal impact] ${reason}`, details);
return;
}
console.warn(`[RC modal impact] ${reason}`);
}
/**
* Execute with restore guard.
*/
function runWithRestoreGuard(callback) {
isRestoringValue = true;
try {
callback();
} finally {
setTimeout(() => {
isRestoringValue = false;
}, 0);
}
}
/**
* Recupere displayed style.
*/
function getDisplayedStyle(id) {
const element = document.getElementById(id);
return element ? element.style.display : '';
}
/**
* Met a jour displayed style.
*/
function setDisplayedStyle(id, value) {
const element = document.getElementById(id);
if (element) {
element.style.display = value ?? '';
}
}
/**
* Gere read input value.
*/
function readInputValue(id) {
const element = document.getElementById(id);
return element ? element.value : '';
}
/**
* Gere write input value.
*/
function writeInputValue(id, value) {
const element = document.getElementById(id);
if (element) {
element.value = value ?? '';
}
}
/**
* Gere apply cotisation layout.
*/
function applyCotisationLayout(value) {
if (value === "forfaitaire") {
document.getElementById("checkVehicules").style.display = 'block';
document.getElementById("colTauxAjustement").style.display = 'none';
document.getElementById("colCA").style.display = 'none';
document.getElementById("colCotMini").style.display = 'none';
document.getElementById("colTypeCot").classList.remove('s4');
document.getElementById("colTypeCot").classList.add('s6');
document.getElementById("colTypeCot").style.margin = "0 auto";
document.getElementById("colTypeCot").style.float = "none";
document.getElementById("colDetailCot").classList.remove('s6');
document.getElementById("colDetailCot").classList.add('s12');
} else if (value === "revisable") {
document.getElementById("checkVehicules").style.display = 'none';
document.getElementById("colTauxAjustement").style.display = 'block';
document.getElementById("colCA").style.display = 'block';
document.getElementById("colCotMini").style.display = 'block';
document.getElementById("colTypeCot").classList.remove('s6');
document.getElementById("colTypeCot").classList.add('s4');
document.getElementById("colTypeCot").style.margin = "";
document.getElementById("colTypeCot").style.float = "left";
document.getElementById("colDetailCot").classList.remove('s12');
document.getElementById("colDetailCot").classList.add('s6');
}
}
/**
* Gere recalculate after cachange.
*/
function recalculateAfterCAChange() {
validateField('CA', true);
updateSubmitButtonState('projetForm');
calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotIrreductible();
calcCotTotal();
if (rcProjetGuard) rcProjetGuard.refresh();
}
/**
* Vérifie si une saisie numérique contient un format interdit.
*/
function hasInvalidNumericValue(value, maxDecimals = null) {
const normalized = String(value ?? '')
.trim()
.replace(/\s/g, '');
if (!normalized) return false;
if (/[A-Za-z€$£¥]/.test(normalized)) return true;
if (/[^0-9.,-]/.test(normalized)) return true;
if ((normalized.match(/,/g) || []).length > 1) return true;
if ((normalized.match(/\./g) || []).length > 1) return true;
if (normalized.includes('-') && normalized.indexOf('-') !== 0) return true;
if (!/^-?\d+(?:[.,]\d+)?$/.test(normalized)) return true;
if (Number.isInteger(maxDecimals)) {
const decimalPart = normalized.split(/[.,]/)[1];
if (decimalPart && decimalPart.length > maxDecimals) return true;
}
return false;
}
/**
* Coupe un recalcul si la valeur courante n'est pas un nombre valide.
*/
function skipRecomputeIfInvalid(fieldId, maxDecimals = null) {
const field = document.getElementById(fieldId);
if (!field) return false;
if (!hasInvalidNumericValue(field.value, maxDecimals)) return false;
if (rcProjetGuard) rcProjetGuard.refresh();
return true;
}
/**
* Exécute un handler de champ sans laisser remonter une erreur JS bloquante.
*/
function runSafeFieldHandler(fieldId, handler) {
try {
handler();
} catch (error) {
console.error(`[RC Projet] Erreur sur le champ "${fieldId}"`, error);
try {
validateField(fieldId, true);
} catch (_) {
// no-op
}
try {
updateSubmitButtonState('projetForm');
} catch (_) {
// no-op
}
if (rcProjetGuard) rcProjetGuard.refresh();
}
}
/**
* Capture rcestate.
*/
function captureRCEState() {
return {
checked: Boolean(document.getElementById('choixRCE')?.checked),
garantieRCEDisplay: getDisplayedStyle('garantieRCE'),
rce1Display: getDisplayedStyle('RCE1'),
rce2Display: getDisplayedStyle('RCE2'),
cotRCEHT: readInputValue('cotRCEHT'),
cotRCETTC: readInputValue('cotRCETTC'),
tauxRCEHT: readInputValue('tauxRCEHT'),
tauxRCETTC: readInputValue('tauxRCETTC')
};
}
/**
* Restaure rcestate.
*/
function restoreRCEState(state) {
if (!state) return;
runWithRestoreGuard(() => {
const checkbox = document.getElementById('choixRCE');
if (checkbox) {
checkbox.checked = Boolean(state.checked);
}
setDisplayedStyle('garantieRCE', state.garantieRCEDisplay);
setDisplayedStyle('RCE1', state.rce1Display);
setDisplayedStyle('RCE2', state.rce2Display);
writeInputValue('cotRCEHT', state.cotRCEHT);
writeInputValue('cotRCETTC', state.cotRCETTC);
writeInputValue('tauxRCEHT', state.tauxRCEHT);
writeInputValue('tauxRCETTC', state.tauxRCETTC);
calcCotTotal();
});
}
/**
* Capture pjstate.
*/
function capturePJState() {
return {
checked: Boolean(document.getElementById('switchPJ')?.checked),
pj1Display: getDisplayedStyle('PJ1'),
pj2Display: getDisplayedStyle('PJ2'),
cotPJHT: readInputValue('cotPJHT'),
cotPJTTC: readInputValue('cotPJTTC')
};
}
/**
* Restaure pjstate.
*/
function restorePJState(state) {
if (!state) return;
runWithRestoreGuard(() => {
const checkbox = document.getElementById('switchPJ');
if (checkbox) {
checkbox.checked = Boolean(state.checked);
}
setDisplayedStyle('PJ1', state.pj1Display);
setDisplayedStyle('PJ2', state.pj2Display);
writeInputValue('cotPJHT', state.cotPJHT);
writeInputValue('cotPJTTC', state.cotPJTTC);
calcCotTotal();
});
}
/**
* Capture cotisation state.
*/
function captureCotisationState() {
return {
value: document.querySelector('input[name="cotisation"]:checked')?.value || null
};
}
/**
* Restaure cotisation state.
*/
function restoreCotisationState(state) {
if (!state) return;
runWithRestoreGuard(() => {
if (state.value != null) {
const radios = document.querySelectorAll('input[name="cotisation"]');
radios.forEach((radio) => {
radio.checked = radio.value === String(state.value);
});
applyCotisationLayout(String(state.value));
}
});
}
/**
* Capture castate.
*/
function captureCAState() {
return {
value: document.getElementById('CA')?.value || ''
};
}
/**
* Restaure castate.
*/
function restoreCAState(state) {
if (!state) return;
runWithRestoreGuard(() => {
const caInput = document.getElementById('CA');
if (caInput) {
caInput.value = state.value ?? '';
}
recalculateAfterCAChange();
});
}
/**
* Restaure changed field value.
*/
function restoreChangedFieldValue(changedElement, previousValue) {
if (!changedElement) return;
runWithRestoreGuard(() => {
if (typeof changedElement.restore === 'function') {
changedElement.restore(previousValue);
return;
}
if (changedElement.tagName === 'SELECT') {
if (changedElement.multiple) {
const values = Array.isArray(previousValue)
? previousValue.map((item) => String(item))
: [];
Array.from(changedElement.options).forEach((option) => {
option.selected = values.includes(option.value);
});
} else {
changedElement.value = previousValue ?? '';
}
if (window.M && window.M.FormSelect) {
const instance = window.M.FormSelect.getInstance(changedElement);
if (instance) instance.destroy();
window.M.FormSelect.init(changedElement);
}
changedElement.dispatchEvent(new Event('change', { bubbles: true }));
return;
}
if (changedElement.type === 'radio') {
const radioName = changedElement.name;
if (radioName && previousValue != null) {
const radios = document.querySelectorAll(`input[name="${radioName}"]`);
radios.forEach((radio) => {
radio.checked = radio.value === String(previousValue);
});
const selectedRadio = document.querySelector(`input[name="${radioName}"]:checked`);
if (selectedRadio) {
selectedRadio.dispatchEvent(new Event('change', { bubbles: true }));
}
} else {
changedElement.checked = Boolean(previousValue);
changedElement.dispatchEvent(new Event('change', { bubbles: true }));
}
return;
}
if (changedElement.type === 'checkbox') {
changedElement.checked = Boolean(previousValue);
changedElement.dispatchEvent(new Event('change', { bubbles: true }));
return;
}
changedElement.value = previousValue ?? '';
changedElement.dispatchEvent(new Event('input', { bubbles: true }));
changedElement.dispatchEvent(new Event('change', { bubbles: true }));
});
}
/**
* Redirige to tarif from modal.
*/
function redirectToTarifFromModal() {
storeProjetDataForTarifPrefill();
const target = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
window.location.href = target;
}
/**
* Affiche tarif impact modal.
*/
function showTarifImpactModal(options = {}) {
const modal = document.getElementById('modalModif');
if (!modal) {
logTarifImpactSkip('modalModif introuvable dans le DOM');
return false;
}
if (isTarifImpactModalOpen) {
logTarifImpactSkip('modal deja ouverte');
return false;
}
let instance = M.Modal.getInstance(modal);
if (!instance) {
instance = M.Modal.init(modal);
}
const okBtn = document.getElementById('modif-OK');
const noBtn = document.getElementById('modif-NO');
if (!okBtn || !noBtn) {
logTarifImpactSkip('boutons modif-OK/modif-NO introuvables');
return false;
}
isTarifImpactModalOpen = true;
instance.options.onCloseEnd = () => {
isTarifImpactModalOpen = false;
};
okBtn.onclick = (event) => {
event?.preventDefault?.();
instance.close();
if (typeof options.onConfirm === 'function') {
options.onConfirm();
}
};
noBtn.onclick = (event) => {
event?.preventDefault?.();
instance.close();
if (typeof options.onCancel === 'function') {
options.onCancel();
}
};
instance.open();
return true;
}
/**
* Gere prompt tarif impact if needed.
*/
function promptTarifImpactIfNeeded(context = {}) {
if (isRestoringValue) {
logTarifImpactSkip('ignore pendant restauration');
return false;
}
if (isTarifImpactModalOpen) {
logTarifImpactSkip('ignore car modal deja ouverte');
return false;
}
if (!ensureTarifImpactContext()) {
if (!hasTarifReference()) {
logTarifImpactSkip('aucune reference tarif detectee', { tarif, rcTarifRC: rc?.tarifRC, rcTarif: rc?.tarif });
} else {
logTarifImpactSkip('snapshot tarifOriginalData absent');
}
return false;
}
const isImpacting = typeof context.isImpacting === 'function'
? Boolean(context.isImpacting())
: false;
if (!isImpacting) {
if (typeof context.onNoImpact === 'function') {
context.onNoImpact();
}
return false;
}
return showTarifImpactModal({
onConfirm: () => {
if (typeof context.onConfirm === 'function') {
context.onConfirm();
return;
}
redirectToTarifFromModal();
},
onCancel: () => {
if (typeof context.restore === 'function') {
context.restore();
}
if (typeof context.onCancel === 'function') {
context.onCancel();
}
}
});
}
/**
* Configure tarif impact listeners.
*/
function setupTarifImpactListeners() {
ensureTarifImpactContext();
setTimeout(() => {
if (!ensureTarifImpactContext()) {
logTarifImpactSkip('saveOriginalTarifData n a pas initialise de snapshot');
}
}, 500);
const registerBeforeActionSnapshot = (element, captureSnapshot) => {
if (!element || typeof captureSnapshot !== 'function') return;
const save = () => {
if (isRestoringValue || isTarifImpactModalOpen) return;
captureSnapshot();
};
element.addEventListener('pointerdown', save, true);
element.addEventListener('focus', save, true);
element.addEventListener('keydown', function(event) {
if (event.key === ' ' || event.key === 'Spacebar' || event.key === 'Enter') {
save();
}
}, true);
};
const activitySelector = document.getElementById('activity-selector');
if (activitySelector) {
let lastActivitySelection = Array.from(activitySelector.selectedOptions).map(opt => opt.value);
registerBeforeActionSnapshot(activitySelector, () => {
lastActivitySelection = Array.from(activitySelector.selectedOptions).map(opt => opt.value);
});
activitySelector.addEventListener('change', function(e) {
if (isRestoringValue) {
handleActivitySelection();
return;
}
setTimeout(() => {
if (isRestoringValue) return;
const originalSelection = [...lastActivitySelection];
if (promptTarifImpactIfNeeded({
isImpacting: () => checkActivityImpact(getCurrentActivityData()),
restore: () => restoreChangedFieldValue(this, originalSelection),
onNoImpact: () => {
lastActivitySelection = Array.from(this.selectedOptions).map(opt => opt.value);
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
return false;
}
}, 200);
}, true);
}
const marchandiseSelector = document.getElementById('marchandise-selector');
if (marchandiseSelector) {
let lastMarchandiseSelection = Array.from(marchandiseSelector.selectedOptions).map(opt => opt.value);
registerBeforeActionSnapshot(marchandiseSelector, () => {
lastMarchandiseSelection = Array.from(marchandiseSelector.selectedOptions).map(opt => opt.value);
});
marchandiseSelector.addEventListener('change', function(e) {
if (isRestoringValue) {
handleMarchandiseSelection();
return;
}
const originalSelection = lastMarchandiseSelection;
setTimeout(() => {
if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({
isImpacting: () => checkMarchandiseImpact(getCurrentMarchandiseData()),
restore: () => restoreChangedFieldValue(this, originalSelection),
onNoImpact: () => {
lastMarchandiseSelection = Array.from(this.selectedOptions).map(opt => opt.value);
handleMarchandiseSelection();
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
return;
}
}, 200);
}, true);
}
const zoneStateBeforeChange = {};
for (let i = 1; i <= 6; i++) {
const zoneCheckbox = document.getElementById(`zone${i}`);
if (zoneCheckbox) {
registerBeforeActionSnapshot(zoneCheckbox, () => {
zoneStateBeforeChange[zoneCheckbox.id] = captureZoneState();
});
zoneCheckbox.addEventListener('change', function(e) {
if (isRestoringValue) return;
let previousZones = zoneStateBeforeChange[this.id];
// Fallback robuste: certains clics passent par le label et ne déclenchent pas le snapshot pointer/focus.
if (!previousZones || previousZones?.[this.id]?.checked === this.checked) {
previousZones = captureZoneState();
if (previousZones[this.id]) {
previousZones[this.id].checked = !this.checked;
}
}
setTimeout(() => {
if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({
isImpacting: () => checkZoneImpact(getCurrentZoneData()),
restore: () => restoreZoneState(previousZones)
})) {
e.stopImmediatePropagation();
e.preventDefault();
}
zoneStateBeforeChange[this.id] = null;
}, 200);
}, true);
}
}
const garantieRCCSelector = document.getElementById('garantieRCC-selector');
if (garantieRCCSelector) {
let lastGarantieRCCSelection = Array.from(garantieRCCSelector.selectedOptions).map(opt => opt.value);
registerBeforeActionSnapshot(garantieRCCSelector, () => {
lastGarantieRCCSelection = Array.from(garantieRCCSelector.selectedOptions).map(opt => opt.value);
});
garantieRCCSelector.addEventListener('change', function(e) {
if (isRestoringValue) return;
setTimeout(() => {
if (isRestoringValue) return;
const originalSelection = [...lastGarantieRCCSelection];
if (promptTarifImpactIfNeeded({
isImpacting: () => checkGarantieRCCImpact(getCurrentGarantieRCCData()),
restore: () => restoreChangedFieldValue(this, originalSelection),
onNoImpact: () => {
lastGarantieRCCSelection = Array.from(this.selectedOptions).map(opt => opt.value);
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
return;
}
}, 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 => {
registerBeforeActionSnapshot(checkbox, () => {
checkbox.dataset.tarifPrevChecked = String(checkbox.checked);
});
checkbox.addEventListener('change', function(e) {
if (isRestoringValue) return;
const originalChecked = this.dataset.tarifPrevChecked === 'true';
setTimeout(() => {
if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({
isImpacting: () => checkActiviteComplImpact(getCurrentActiviteComplData()),
restore: () => restoreChangedFieldValue(this, originalChecked)
})) {
e.stopImmediatePropagation();
e.preventDefault();
}
}, 200);
}, true);
});
}
});
const radioButtonsCot = document.getElementsByName('cotisation');
let previousCotisationState = captureCotisationState();
for (let i = 0; i < radioButtonsCot.length; i++) {
registerBeforeActionSnapshot(radioButtonsCot[i], () => {
previousCotisationState = captureCotisationState();
});
radioButtonsCot[i].addEventListener('change', function(e) {
if (isRestoringValue) return;
setTimeout(() => {
if (isRestoringValue) return;
const stateToRestore = previousCotisationState;
if (promptTarifImpactIfNeeded({
isImpacting: () => checkCotisationImpact(),
restore: () => restoreCotisationState(stateToRestore),
onNoImpact: () => {
previousCotisationState = captureCotisationState();
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
}
}, 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'];
const bindCapitalFieldImpact = (field) => {
if (!field || field.hasAttribute('data-tarif-listener')) return;
field.setAttribute('data-tarif-listener', 'true');
let originalValue = field.value || field.dataset.defaultValue || '';
field.addEventListener('focus', function() {
if (isRestoringValue) return;
originalValue = this.value;
}, true);
field.addEventListener('input', function(e) {
if (isRestoringValue) return;
setTimeout(() => {
if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({
isImpacting: () => checkCapitalImpactByField(this.id, this.value),
restore: () => restoreChangedFieldValue(this, originalValue),
onNoImpact: () => {
originalValue = this.value;
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
return;
}
}, 200);
});
};
capitalFields.forEach((fieldId) => {
bindCapitalFieldImpact(document.getElementById(fieldId));
});
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
capitalFields.forEach(fieldId => {
bindCapitalFieldImpact(document.getElementById(fieldId));
});
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
const switchPJ = document.getElementById('switchPJ');
if (switchPJ) {
let previousPJState = capturePJState();
registerBeforeActionSnapshot(switchPJ, () => {
previousPJState = capturePJState();
});
switchPJ.addEventListener('change', function(e) {
if (isRestoringValue) return;
let stateToRestore = previousPJState;
if (!stateToRestore || stateToRestore.checked === this.checked) {
stateToRestore = capturePJState();
stateToRestore.checked = !this.checked;
}
setTimeout(() => {
if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({
isImpacting: () => checkPJImpact(),
restore: () => restorePJState(stateToRestore),
onNoImpact: () => {
previousPJState = capturePJState();
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
}
}, 200);
}, true);
}
const choixRCE = document.getElementById('choixRCE');
if (choixRCE) {
let previousRCEState = captureRCEState();
registerBeforeActionSnapshot(choixRCE, () => {
previousRCEState = captureRCEState();
});
choixRCE.addEventListener('change', function(e) {
if (isRestoringValue) return;
let stateToRestore = previousRCEState;
if (!stateToRestore || stateToRestore.checked === this.checked) {
stateToRestore = captureRCEState();
stateToRestore.checked = !this.checked;
}
setTimeout(() => {
if (isRestoringValue) return;
if (promptTarifImpactIfNeeded({
isImpacting: () => checkRCEImpact(),
restore: () => restoreRCEState(stateToRestore),
onNoImpact: () => {
previousRCEState = captureRCEState();
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
}
}, 200);
}, true);
}
['AdValorem', 'ValeurDeclaree'].forEach((id) => {
const radio = document.getElementById(id);
if (!radio) return;
registerBeforeActionSnapshot(radio, () => {
radio.dataset.tarifPrevType = document.querySelector('input[name="type"]:checked')?.value || '';
});
radio.addEventListener('change', function(e) {
if (isRestoringValue) return;
setTimeout(() => {
if (isRestoringValue) return;
const previousType = this.dataset.tarifPrevType || '';
if (promptTarifImpactIfNeeded({
isImpacting: () => checkTypeExtConfiesImpact(),
restore: () => restoreChangedFieldValue(this, previousType)
})) {
e.stopImmediatePropagation();
e.preventDefault();
}
}, 200);
}, true);
});
// Décision produit: pas de modal sur les zones textuelles de grille ad valorem.
}
/**
* Controle garantie rccimpact.
*/
function checkGarantieRCCImpact(garantieData) {
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;
}
/**
* Recupere current activity data.
*/
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)
};
}
/**
* Recupere current marchandise data.
*/
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
};
}
/**
* Recupere current zone data.
*/
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
};
}
/**
* Recupere current garantie rccdata.
*/
function getCurrentGarantieRCCData() {
const selector = document.getElementById('garantieRCC-selector');
if (!selector) return [];
return Array.from(selector.selectedOptions).map(opt => opt.value);
}
/**
* Recupere selected marchandises.
*/
function getSelectedMarchandises() {
const selector = document.getElementById('marchandise-selector');
return Array.from(selector.selectedOptions).map(opt => opt.value);
}
/**
* Pre-remplit from tarif.
*/
function prefillFromTarif() {
if (!tarif || !rc) {
console.log('Pas de donnees tarif/rc pour pre-remplir');
return;
}
// Geler la détection le temps du pré-remplissage auto.
isRestoringValue = true;
console.log('Pre-remplissage depuis tarif...', { rc, tarif });
/**
* Parse array.
*/
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(' Selection 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(' Selection Loueur (car Voiturier coche)');
const loueurOption = activitySelector.querySelector('option[value="loueur"]');
if (loueurOption) {
loueurOption.selected = true;
}
}
// Commissionnaire → Commissionnaire multimodal
if (rc.checkCommissionnaire && !projet?.actMultimodal && activitySelector) {
console.log(' Selection 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(' Selection Demenageur 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(' Selection 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(' Selection 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(' Selection Autres activites, 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 reinitialise');
}
}, 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 activee (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 activee');
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 crees...');
// 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
};
// Champs qui doivent toujours refléter la dernière modif faite côté Tarif.
const forceTarifSyncFields = new Set([
'commissionnaire-multimodal',
'demenageur-entreprise',
'prestataire-logistique',
'autocariste',
'autres'
]);
for (const [activity, capital] of Object.entries(capitalMapping)) {
if (capital == null || capital === '') continue;
const input = document.getElementById(activity);
const shouldForce = forceTarifSyncFields.has(activity);
if (input && (shouldForce || !input.value)) {
input.value = capital;
console.log(` ├─ ${activity}: ${capital}`);
}
// Garde aussi la valeur par défaut sur le conteneur, utile si l'input est recréé ensuite.
const selectCarrier = document.getElementById(`select-${activity}`);
if (selectCarrier && (shouldForce || !selectCarrier.dataset.defaultValue)) {
selectCarrier.dataset.defaultValue = String(capital);
}
}
console.log(' Capitaux appliques');
}, 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'));
}
// Réactiver la détection juste après les dispatchs pour conserver le contrôle.
setTimeout(() => {
isRestoringValue = false;
syncRCFloatingLabels();
}, 0);
}
// Configuration des écouteurs d'événements
/**
* Configure event listeners.
*/
function setupEventListeners() {
document.getElementById('projetFormBtn').addEventListener('click', handleSubmitForm);
document.getElementById('loadHistoriqueBtn').addEventListener('click', function () {
handleLoadHistoriqueBtn();
});
document.getElementById('activity-selector').addEventListener('change', function () {
handleActivitySelection();
if (rcProjetGuard) rcProjetGuard.refresh();
syncRCFloatingLabels();
});
document.getElementById('marchandise-selector').addEventListener('change', function () {
handleMarchandiseSelection();
if (rcProjetGuard) rcProjetGuard.refresh();
syncRCFloatingLabels();
});
document.getElementById('garantieRCC-selector').addEventListener('change', function () {
handleGarantieRCCSelection();
if (rcProjetGuard) rcProjetGuard.refresh();
syncRCFloatingLabels();
});
document.getElementById('garantieRCE-selector').addEventListener('change', function () {
handleGarantieRCESelection();
if (rcProjetGuard) rcProjetGuard.refresh();
syncRCFloatingLabels();
});
document.getElementById('choixRCE').addEventListener('change', function () {
if (document.getElementById("choixRCE").checked) {
document.getElementById('garantieRCE').style.display = 'block';
document.getElementById('RCE1').style.display = '';
document.getElementById('RCE2').style.display = '';
} else {
document.getElementById('garantieRCE').style.display = 'none';
document.getElementById('RCE1').style.display = 'none';
document.getElementById('RCE2').style.display = 'none';
document.getElementById('cotRCEHT').value = '';
document.getElementById('cotRCETTC').value = '';
document.getElementById('tauxRCEHT').value = '';
document.getElementById('tauxRCETTC').value = '';
}
calcCotTotal();
});
document.getElementById('btnAddAdditionnel').addEventListener('click', function () {
const nomValue = document.getElementById('nomAdditionnel').value || 'Non défini';
const adresseValue = document.getElementById('adresseAditionnel').value || 'Non défini';
const siretValue = document.getElementById('siretAdditionnel').value || 'Non défini';
addRowAdditionnel(nomValue, adresseValue, siretValue);
});
document.getElementById('btnAddVehicule').addEventListener('click', function () {
const marqueValue = document.getElementById('marqueVehicule').value || 'Non défini';
const genreValue = document.getElementById('genreVehicule').value || 'Non défini';
const typeValue = document.getElementById('typeVehicule').value || 'Non défini';
const immatValue = document.getElementById('immatVehicule').value || 'Non défini';
const capitalValue = document.getElementById('capitalVehicule').value || 'Non défini';
addRowVehicule(marqueValue, genreValue, typeValue, immatValue, capitalValue);
});
document.getElementById('btnAdvaloTerrestre').addEventListener('click', function () {
document.getElementById('divAdvaloTerrestre').style.display = "block";
document.getElementById('divAdvaloMultimodal').style.display = "none";
document.getElementById('divAdvaloAerien').style.display = "none";
});
document.getElementById('btnAdvaloMultimodal').addEventListener('click', function () {
document.getElementById('divAdvaloTerrestre').style.display = "none";
document.getElementById('divAdvaloMultimodal').style.display = "block";
document.getElementById('divAdvaloAerien').style.display = "none";
});
document.getElementById('btnAdvaloAerien').addEventListener('click', function () {
document.getElementById('divAdvaloTerrestre').style.display = "none";
document.getElementById('divAdvaloMultimodal').style.display = "none";
document.getElementById('divAdvaloAerien').style.display = "block";
});
document.getElementById('switchPJ').addEventListener('change', function () {
if (document.getElementById("switchPJ").checked) {
document.getElementById('PJ1').style.display = '';
document.getElementById('PJ2').style.display = '';
} else {
document.getElementById('PJ1').style.display = 'none';
document.getElementById('PJ2').style.display = 'none';
document.getElementById('cotPJHT').value = '';
document.getElementById('cotPJTTC').value = '';
}
calcCotTotal();
});
document.getElementById('btnMondeEntier').addEventListener('click', function () {
const previousZones = captureZoneState();
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;
handleGrAdvalo();
promptTarifImpactIfNeeded({
isImpacting: () => checkZoneImpact(getCurrentZoneData()),
restore: () => restoreZoneState(previousZones)
});
});
document.getElementById('btnReset').addEventListener('click', function () {
const previousZones = captureZoneState();
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;
handleGrAdvalo();
promptTarifImpactIfNeeded({
isImpacting: () => checkZoneImpact(getCurrentZoneData()),
restore: () => restoreZoneState(previousZones)
});
});
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('zone1').addEventListener('click', function () {
handleGrAdvalo();
});
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;
}
handleGrAdvalo();
});
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;
}
handleGrAdvalo();
});
document.getElementById('zone4').addEventListener('click', function () {
handleGrAdvalo();
});
document.getElementById('zone5').addEventListener('click', function () {
handleGrAdvalo();
});
document.getElementById('zone6').addEventListener('click', function () {
handleGrAdvalo();
});
var radioButtonsCot = document.getElementsByName('cotisation');
for (var i = 0; i < radioButtonsCot.length; i++) {
radioButtonsCot[i].addEventListener('change', function () {
applyCotisationLayout(this.value);
});
};
var radioButtonsFract = document.getElementsByName('fractionnement');
for (var i = 0; i < radioButtonsFract.length; i++) {
radioButtonsFract[i].addEventListener('change', function () {
const cotFraisHTEl = document.getElementById("cotFraisHT");
const cotFraisTTCEl = document.getElementById("cotFraisTTC");
const hasExistingFraisValue = Boolean(
String(cotFraisHTEl?.value || '').trim() ||
String(cotFraisTTCEl?.value || '').trim()
);
if (!hasExistingFraisValue) {
calcCotTotal();
return;
}
if (this.value == "mensuel") {
document.getElementById("cotFraisHT").value = 36.00;
document.getElementById("cotFraisTTC").value = 36.00;
calcCotTotal();
} else if (this.value == "trimestriel") {
document.getElementById("cotFraisHT").value = 144.00;
document.getElementById("cotFraisTTC").value = 144.00;
calcCotTotal();
} else if (this.value == "semestriel") {
document.getElementById("cotFraisHT").value = 72.00;
document.getElementById("cotFraisTTC").value = 72.00;
calcCotTotal();
} else if (this.value == "annuel") {
document.getElementById("cotFraisHT").value = 36.00;
document.getElementById("cotFraisTTC").value = 36.00;
calcCotTotal();
}
});
};
document.getElementById('btnNullDateDebut').addEventListener('click', function () {
document.getElementById('dateEffet').value = "00/00/0000";
validateField('dateEffet', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('btnNullDateEcheance').addEventListener('click', function () {
document.getElementById('dateEcheance').value = "00/00";
validateField('dateEcheance', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('btnNullDateFin').addEventListener('click', function () {
document.getElementById('dateFin').value = "00/00/0000";
validateField('dateFin', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('btnModalDate').addEventListener('click', function () {
const elem = document.getElementById('modalDate');
const instance = M.Modal.getInstance(elem);
instance.open();
});
document.getElementById('btnGarContenantConfie').addEventListener('click', function () {
const elem = document.getElementById('modalContenantConfie');
const instance = M.Modal.getInstance(elem);
instance.open();
});
document.getElementById('speClauses').addEventListener('click', function () {
const url = `/download/CLAUSES_PLATEFORME_RC_TRANSPORT_VALIDE_AU_26_02_2025.docx`;
fetch(url)
.then(response => response.blob())
.then(blob => {
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'CLAUSES_PLATEFORME_RC_TRANSPORT_VALIDE_AU_26_02_2025';
link.click();
})
.catch(error => console.error('Error downloading file:', error));
});
document.getElementById('dateEffet').addEventListener('input', function () {
validateField('dateEffet', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('dateFin').addEventListener('input', function () {
validateField('dateFin', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('dateEcheance').addEventListener('input', function () {
validateField('dateEcheance', true);
updateSubmitButtonState('projetForm');
});
const caInput = document.getElementById('CA');
let previousCAState = captureCAState();
if (caInput) {
caInput.addEventListener('focus', function () {
if (isRestoringValue) return;
previousCAState = captureCAState();
}, true);
}
document.getElementById('CA').addEventListener('input', function (e) {
runSafeFieldHandler('CA', () => {
if (isRestoringValue) {
if (!skipRecomputeIfInvalid('CA', 2)) {
recalculateAfterCAChange();
} else {
validateField('CA', true);
updateSubmitButtonState('projetForm');
}
return;
}
if (promptTarifImpactIfNeeded({
isImpacting: () => checkCAImpact(),
restore: () => restoreCAState(previousCAState),
onNoImpact: () => {
previousCAState = captureCAState();
if (!skipRecomputeIfInvalid('CA', 2)) {
recalculateAfterCAChange();
} else {
validateField('CA', true);
updateSubmitButtonState('projetForm');
}
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
return;
}
});
});
document.getElementById('cotisationIrreductible').addEventListener('input', function () {
validateField('cotisationIrreductible', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('tauxRCCHT').addEventListener('input', function () {
runSafeFieldHandler('tauxRCCHT', () => {
validateField('tauxRCCHT', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('tauxRCCHT', 3)) return;
calcAddTaxe('tauxRCCHT', 0, 'tauxRCCTTC');
calcTauxTotal();
calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotIrreductible();
calcCotTotal();
});
});
document.getElementById('tauxRCCTTC').addEventListener('input', function () {
runSafeFieldHandler('tauxRCCTTC', () => {
validateField('tauxRCCTTC', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('tauxRCCTTC', 3)) return;
calcSubTaxe('tauxRCCHT', 0, 'tauxRCCTTC');
calcTauxTotal();
calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotIrreductible();
calcCotTotal();
});
});
document.getElementById('tauxRCEHT').addEventListener('input', function () {
runSafeFieldHandler('tauxRCEHT', () => {
validateField('tauxRCEHT', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('tauxRCEHT', 3)) return;
calcAddTaxe('tauxRCEHT', 0.09, 'tauxRCETTC');
calcTauxTotal();
calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotIrreductible();
calcCotTotal();
});
});
document.getElementById('tauxRCETTC').addEventListener('input', function () {
runSafeFieldHandler('tauxRCETTC', () => {
validateField('tauxRCETTC', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('tauxRCETTC', 3)) return;
calcSubTaxe('tauxRCEHT', 0.09, 'tauxRCETTC');
calcTauxTotal();
calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotIrreductible();
calcCotTotal();
});
});
document.getElementById('tauxTotalHT').addEventListener('input', function () {
validateField('tauxTotalHT', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('tauxTotalTTC').addEventListener('input', function () {
validateField('tauxTotalTTC', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('cotRCCHT').addEventListener('input', function () {
runSafeFieldHandler('cotRCCHT', () => {
validateField('cotRCCHT', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('cotRCCHT', 2)) return;
calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotTotal();
});
});
document.getElementById('cotRCCTTC').addEventListener('input', function () {
runSafeFieldHandler('cotRCCTTC', () => {
validateField('cotRCCTTC', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('cotRCCTTC', 2)) return;
calcSubTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotTotal();
});
});
document.getElementById('cotRCEHT').addEventListener('input', function () {
runSafeFieldHandler('cotRCEHT', () => {
validateField('cotRCEHT', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('cotRCEHT', 2)) return;
calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotTotal();
});
});
document.getElementById('cotRCETTC').addEventListener('input', function () {
runSafeFieldHandler('cotRCETTC', () => {
validateField('cotRCETTC', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('cotRCETTC', 2)) return;
calcSubTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotTotal();
});
});
document.getElementById('cotPJHT').addEventListener('input', function () {
runSafeFieldHandler('cotPJHT', () => {
validateField('cotPJHT', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('cotPJHT', 2)) return;
calcAddTaxe('cotPJHT', 0.134, 'cotPJTTC');
calcCotTotal();
});
});
document.getElementById('cotPJTTC').addEventListener('input', function () {
runSafeFieldHandler('cotPJTTC', () => {
validateField('cotPJTTC', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('cotPJTTC', 2)) return;
calcSubTaxe('cotPJHT', 0.134, 'cotPJTTC');
calcCotTotal();
});
});
document.getElementById('cotFraisHT').addEventListener('input', function () {
runSafeFieldHandler('cotFraisHT', () => {
validateField('cotFraisHT', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('cotFraisHT', 2)) return;
calcAddTaxe('cotFraisHT', 0, 'cotFraisTTC');
calcCotTotal();
});
});
document.getElementById('cotFraisTTC').addEventListener('input', function () {
runSafeFieldHandler('cotFraisTTC', () => {
validateField('cotFraisTTC', true);
updateSubmitButtonState('projetForm');
if (skipRecomputeIfInvalid('cotFraisTTC', 2)) return;
calcSubTaxe('cotFraisHT', 0, 'cotFraisTTC');
calcCotTotal();
});
});
document.getElementById('cotTotalHT').addEventListener('input', function () {
validateField('cotTotalHT', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('cotTotalTTC').addEventListener('input', function () {
validateField('cotTotalTTC', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('activity-selector').addEventListener('change', function () {
const currentSelection = Array.from(this.selectedOptions).map(option => option.value);
if (currentSelection.includes("commissionnaire-multimodal")) {
if (tagMultimodal == false) {
M.toast({html: "Monde entier pour l'activité commissionnaire de transports multimodal"})
document.getElementById("btnAdvaloMultimodal").style.display = 'block';
document.getElementById("btnAdvaloAerien").style.display = 'block';
document.getElementById("btnAdvaloTerrestre").style.display = 'block';
document.getElementById('divAdvaloTerrestre').style.display = "none";
document.getElementById('divAdvaloAerien').style.display = "none";
document.getElementById('divAdvaloMultimodal').style.display = "block";
}
tagMultimodal = true;
} else {
document.getElementById("btnAdvaloMultimodal").style.display = 'none';
document.getElementById("btnAdvaloAerien").style.display = 'none';
document.getElementById("btnAdvaloTerrestre").style.display = 'none';
document.getElementById('divAdvaloTerrestre').style.display = "block";
document.getElementById('divAdvaloAerien').style.display = "none";
document.getElementById('divAdvaloMultimodal').style.display = "none";
tagMultimodal = false;
}
if (currentSelection.includes("demenageur-particulier") || currentSelection.includes("demenageur-particulier-dommage") || currentSelection.includes("demenageur-particulier-advalorem") || currentSelection.includes("demenageur-entreprise") || currentSelection.includes("demenageur-interne")) {
if (tagDemenageur == false) {
document.getElementById('marchandise-selector').querySelector('option[value="roulant-demenagement"]').selected = true;
document.getElementById('marchandise-selector').querySelector('option[value="mobilier-usages"]').selected = true;
document.getElementById('marchandise-selector').querySelector('option[value="ordinaire"]').selected = false;
document.getElementById('marchandise-selector').dispatchEvent(new Event('change'));
}
tagDemenageur = true;
} else {
// 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")) {
if (tagGardeMeubles == false) {
document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier"]').selected = true;
tagGardeMeubles = true;
document.getElementById('activity-selector').dispatchEvent(new Event('change'));
document.getElementById('selected-demenageur-error').style.display = "block";
}
} else {
if (!(currentSelection.includes("garde-meubles"))) {
document.getElementById('selected-demenageur-error').style.display = "none";
tagGardeMeubles = false;
}
}
if (currentSelection.includes("demenageur-particulier")) {
if (tagDemenageurParticulier == false) {
document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier-dommage"]').selected = false;
document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier-advalorem"]').selected = false;
tagDemenageurParticulier = true;
document.getElementById('activity-selector').dispatchEvent(new Event('change'));
}
} else {
tagDemenageurParticulier = false;
}
if (currentSelection.includes("demenageur-particulier-dommage")) {
if (tagDemenageurParticulierDeclaree == false) {
document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier"]').selected = false;
document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier-advalorem"]').selected = false;
tagDemenageurParticulierDeclaree = true;
document.getElementById('activity-selector').dispatchEvent(new Event('change'));
}
} else {
tagDemenageurParticulierDeclaree = false;
}
if (currentSelection.includes("demenageur-particulier-advalorem")) {
if (tagDemenageurParticulierAdvalorem == false) {
document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier-dommage"]').selected = false;
document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier"]').selected = false;
tagDemenageurParticulierAdvalorem = true;
tagDemenageurParticulierDeclaree = false;
tagDemenageurParticulier = false;
document.getElementById('activity-selector').dispatchEvent(new Event('change'));
}
} else {
tagDemenageurParticulierAdvalorem = false;
}
if (currentSelection.includes("demenageur-entreprise")) {
if (tagDemenageurEntrInter == false) {
document.getElementById('activity-selector').querySelector('option[value="demenageur-interne"]').selected = true;
tagDemenageurEntrInter = true;
document.getElementById('activity-selector').dispatchEvent(new Event('change'));
document.getElementById('selected-demenageur-entreprise-error').style.display = "block";
}
} else {
document.getElementById('selected-demenageur-entreprise-error').style.display = "none";
tagDemenageurEntrInter = false;
}
if (currentSelection.includes("entrepositaire-depositaire") || currentSelection.includes("prestataire-logistique") || currentSelection.includes("manutentionnaire-levageur")) {
if (tagVoiturier == false) {
document.getElementById('activity-selector').querySelector('option[value="voiturier"]').selected = true;
tagVoiturier = true;
document.getElementById('activity-selector').dispatchEvent(new Event('change'));
document.getElementById('selected-voiturier-error').style.display = "block";
}
} else {
// Aucune activité nécessitant voiturier n'est sélectionnée
tagVoiturier = false;
document.getElementById('selected-voiturier-error').style.display = "none";
}
if (currentSelection.length == 1) {
const isExistingDossier = Boolean(rc?.id || projet?.id || tarif?.id);
if (!isExistingDossier) {
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'));
M.FormSelect.init(document.querySelectorAll('select'));
}
document.getElementById('mini-activity-error').style.display = "block";
} else {
document.getElementById("mini-activity-error").style.display = "none";
}
handleGrAdvalo();
});
document.getElementById('marchandise-selector').addEventListener('change', function () {
const currentSelection = Array.from(this.selectedOptions).map(option => option.value);
if (currentSelection.includes("beton")) {
document.getElementById("choixRCE").checked = false;
document.getElementById('garantieRCE').style.display = 'none';
document.getElementById('RCE1').style.display = 'none';
document.getElementById('RCE2').style.display = 'none';
document.getElementById('selected-RCE2-error').style.display = "block";
} else {
if (!(currentSelection.includes("beton"))) {
document.getElementById('selected-RCE2-error').style.display = "none";
}
}
if (currentSelection.length == 1) {
document.getElementById('marchandise-selector').querySelector('option[value="ordinaire"]').selected = true;
document.getElementById('marchandise-selector').dispatchEvent(new Event('change'));
document.getElementById("mini-marchandise-error").style.display = "block";
} else {
document.getElementById("mini-marchandise-error").style.display = "none";
}
if (currentSelection.includes("animaux-vivant")) {
if (tagAnimauxVivants == false) {
// Retire le display select en cas d'animaux vivants
M.FormSelect.init(document.querySelectorAll('select'));
const elem = document.getElementById('modalAnimauxVivants');
const instance = M.Modal.getInstance(elem);
instance.open();
}
tagAnimauxVivants = true;
} else {
if (!(currentSelection.includes("animaux-vivant"))) {
tagAnimauxVivants = false;
}
}
handleGrAdvalo();
});
document.getElementById('garantieRCC-selector').addEventListener('change', function () {
const currentSelection = Array.from(this.selectedOptions).map(option => option.value);
if (currentSelection.includes("contenant-confie")) {
document.getElementById('garContenantConfie').style.display = "block";
} else {
if (!(currentSelection.includes("contenant-confie"))) {
document.getElementById('garContenantConfie').style.display = "none";
}
}
});
}
// Handle event spécifique au limite de garantie activité
window.handleInputActivity = function (inputId) {
validateField(inputId, true);
updateSubmitButtonState('projetForm');
};
// Peupler le formulaire avec les données
/**
* Gere populate form data.
*/
function populateFormData() {
//Poupulate select historique : n'afficher que si des entrées existent
const historiqueDiv = document.getElementById('historiqueDiv');
const idSelect = document.getElementById('idSelect');
const hasHistorique = contrat?.historique && contrat.historique.length;
if (historiqueDiv) {
historiqueDiv.style.display = hasHistorique ? "block" : "none";
}
if (idSelect && hasHistorique) {
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 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 (!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'));
// Marchandises ordinaires par défaut
document.getElementById('marchandise-selector').querySelector('option[value="ordinaire"]').selected = true;
document.getElementById('marchandise-selector').dispatchEvent(new Event('change'));
}
// Populate assurés additionnel
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 < projet.assureAdditionnel.length; i++) {
const row = projet.assureAdditionnel[i];
addRowAdditionnel(row.nom, row.adresse, row.siret);
}
}
// Populate activite
const activitySelector = document.getElementById('activity-selector');
if (projet && projet.actVoiturier) {
activitySelector.querySelector('option[value="voiturier"]').selected = true;
document.getElementById("select-voiturier").dataset.defaultValue = projet.valueActVoiturier;
};
if (projet && projet.actLoueur) {
activitySelector.querySelector('option[value="loueur"]').selected = true;
document.getElementById("select-loueur").dataset.defaultValue = projet.valueActLoueur;
};
if (projet && projet.actMultimodal) {
tagMultimodal = true;
activitySelector.querySelector('option[value="commissionnaire-multimodal"]').selected = true;
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';
document.getElementById('divAdvaloTerrestre').style.display = "none";
document.getElementById('divAdvaloAerien').style.display = "none";
document.getElementById('divAdvaloMultimodal').style.display = "block";
};
if (projet && projet.actDouane) {
activitySelector.querySelector('option[value="représentant-douane"]').selected = true;
document.getElementById("select-représentant-douane").dataset.defaultValue = projet.valueActDouane;
};
if (projet && projet.actDemPar) {
activitySelector.querySelector('option[value="demenageur-particulier"]').selected = true;
document.getElementById("select-demenageur-particulier").dataset.defaultValue = projet.valueActDemPar;
}
if (projet && projet.actDemParDom) {
activitySelector.querySelector('option[value="demenageur-particulier-dommage"]').selected = true;
document.getElementById("select-demenageur-particulier-dommage").dataset.defaultValue = projet.valueActDemParDom;
}
if (projet && projet.actDemParAdv) {
activitySelector.querySelector('option[value="demenageur-particulier-advalorem"]').selected = true;
document.getElementById("select-demenageur-particulier-advalorem").dataset.defaultValue = projet.valueActDemParAdv;
}
if (projet && projet.actDemEntr) {
activitySelector.querySelector('option[value="demenageur-entreprise"]').selected = true;
document.getElementById("select-demenageur-entreprise").dataset.defaultValue = projet.valueActDemEntr;
}
if (projet && projet.actDemInterne) {
activitySelector.querySelector('option[value="demenageur-interne"]').selected = true;
document.getElementById("select-demenageur-interne").dataset.defaultValue = projet.valueActDemInterne;
}
if (projet && projet.actGardeMeuble) {
activitySelector.querySelector('option[value="garde-meubles"]').selected = true;
document.getElementById("select-garde-meubles").dataset.defaultValue = projet.valueActGardeMeuble;
}
if (projet && projet.actEntDep) {
activitySelector.querySelector('option[value="entrepositaire-depositaire"]').selected = true;
document.getElementById("select-entrepositaire-depositaire").dataset.defaultValue = projet.valueActEntDep;
}
if (projet && projet.actPrestaLog) {
activitySelector.querySelector('option[value="prestataire-logistique"]').selected = true;
document.getElementById("select-prestataire-logistique").dataset.defaultValue = projet.valueActPrestaLog;
}
if (projet && projet.actLevageur) {
activitySelector.querySelector('option[value="manutentionnaire-levageur"]').selected = true;
document.getElementById("select-manutentionnaire-levageur").dataset.defaultValue = projet.valueActLevageur;
}
if (projet && projet.actTransitaire) {
activitySelector.querySelector('option[value="transitaire"]').selected = true;
document.getElementById("select-transitaire").dataset.defaultValue = projet.valueActTransitaire;
}
document.getElementById('activity-selector').dispatchEvent(new Event('change'));
// Populate marchandises
const marchandiseSelector = document.getElementById('marchandise-selector');
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 (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é - 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 (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 (projet.typeExtConfies == "ADVALOREM") {
document.getElementById("AdValorem").checked = true;
} else {
document.getElementById("ValeurDeclaree").checked = 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 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 (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 (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 (projet && projet.dateFin) { document.getElementById("dateFin").value = projet.dateFin };
if (projet && projet.programmeInternationale) { document.getElementById("programmeInternationale").checked = true; }
if (projet && projet.participationResultat) { document.getElementById("participationResultat").checked = true; }
if (projet && projet.pj) {
document.getElementById("switchPJ").checked = true;
document.getElementById('PJ1').style.display = '';
document.getElementById('PJ2').style.display = '';
}
// 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;
}
// 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';
document.getElementById("colCA").style.display = 'none';
document.getElementById("colTypeCot").classList.remove('s4');
document.getElementById("colTypeCot").classList.add('s6');
document.getElementById("colTypeCot").style.margin = "0 auto";
document.getElementById("colTypeCot").style.float = "none";
document.getElementById("colDetailCot").classList.remove('s6');
document.getElementById("colDetailCot").classList.add('s12');
} else if (rc.typeCot == "revisable") {
document.getElementById("checkVehicules").style.display = 'none';
document.getElementById("colTauxAjustement").style.display = 'block';
document.getElementById("colCA").style.display = 'block';
document.getElementById("colCotMini").style.display = 'block';
document.getElementById("colTypeCot").style.margin = "";
document.getElementById("colTypeCot").style.float = "left";
}
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 || !projet || !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 < projet.designationVehicule.length; i++) {
const row = projet.designationVehicule[i];
addRowVehicule(row.marque, row.genre, row.type, row.immat, row.capital);
}
}
// Populate Grille Advalorem
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 (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 (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 (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";
};
}
updatePrimeReferenceRow();
if (rcProjetGuard) rcProjetGuard.refresh();
syncRCFloatingLabels();
}
/**
* Gere populate gr advalo.
*/
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] ? 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] ? 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;
}
}
}
}
const categories = {
multimodal: {
Cat1: [0.06, 0.06, 0.07, 0.09, 0.12, 0.14],
Cat2: [0.12, 0.13, 0.14, 0.24, 0.24, 0.3],
Cat3: [0.07, 0.08, 0.09, 0.14, 0.14, 0.18],
Cat4: [0.14, 0.17, 0.17, 0.29, 0.29, 0.36],
Cat5: [0.17, 0.19, 0.21, 0.35, 0.35, 0.43],
Cat6: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"],
Cat7: [0.30, 0.33, 0.36, 0.60, 0.60, 0.75],
Cat8: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"]
},
terrestre: {
Cat1: [0.05, 0.053, 0.06, 0.09, 0.12, 0.14],
Cat2: [0.10, 0.11, 0.12, 0.24, 0.24, 0.25],
Cat3: [0.06, 0.066, 0.07, 0.14, 0.14, 0.15],
Cat4: [0.12, 0.132, 0.14, 0.29, 0.29, 0.30],
Cat5: [0.14, 0.158, 0.17, 0.35, 0.35, 0.36],
Cat6: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"],
Cat7: [0.25, 0.275, 0.3, 0.6, 0.6, 0.63],
Cat8: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"]
},
aerien: {
Cat1: [0.04, 0.04, 0.05, 0.06, 0.08, 0.10],
Cat2: [0.09, 0.09, 0.10, 0.13, 0.17, 0.21],
Cat3: [0.05, 0.06, 0.06, 0.08, 0.10, 0.13],
Cat4: [0.10, 0.11, 0.12, 0.15, 0.20, 0.26],
Cat5: [0.12, 0.13, 0.15, 0.18, 0.24, 0.31],
Cat6: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"],
Cat7: [0.21, 0.23, 0.26, 0.32, 0.43, 0.53],
Cat8: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"]
}
};
/**
* Gere gr advalo.
*/
function handleGrAdvalo() {
for (let i = 1; i <= 6; i++) {
const checkZone = document.getElementById("zone" + i).checked;
for (let j = 1; j <= 6; j++) {
// Gestion multimodal
updateCategoryValues("multimodal", i, j, checkZone);
// Gestion terrestre
updateCategoryValues("terrestre", i, j, checkZone);
// Gestion aerien
updateCategoryValues("aerien", i, j, checkZone);
}
}
}
/**
* Met a jour category values.
*/
function updateCategoryValues(mode, zone, index, checkZone) {
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;
let value = "Nous consulter"; // Par défaut
if (checkZone) {
if (k === 4) {
if (marPerissable) {
value = categories[mode][`Cat${k}`][zone - 1];
} else {
value = "Nous consulter";
}
} else if (k === 5) {
if (marEngins || marRoulant) {
value = categories[mode][`Cat${k}`][zone - 1];
} else {
value = "Nous consulter";
}
} else if (k === 7) {
if (marMobilier || marRoulantDem) {
value = categories[mode][`Cat${k}`][zone - 1];
} else {
value = "Nous consulter";
}
} else {
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;
}
}
/**
* Gere load historique btn.
*/
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);
}
});
}
}
/**
* Gere activity selection.
*/
function handleActivitySelection() {
const select = document.getElementById('activity-selector');
const activityFormsContainer = document.getElementById('selected-activities');
// Clear previous entries
activityFormsContainer.innerHTML = ''; // Clear any existing entries
// Add a header for the "Dommage matériel (en €)" label that aligns with the input fields
const headerDiv = document.createElement('div');
headerDiv.classList.add('row');
headerDiv.style.display = 'flex';
headerDiv.style.alignItems = 'center';
headerDiv.style.justifyContent = 'start';
headerDiv.innerHTML = `
<div style="flex: 3;">&nbsp;</div>
<label class="activity-forms-header" style="flex: 2;">Dommage matériel (en €)</label>
`;
activityFormsContainer.appendChild(headerDiv);
// Iterate over each selected option
Array.from(select.options).forEach(option => {
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 = `
<div style="display:flex;align-items:center;justify-content:center;">
<label class="chip" id="${option.value}-chip" for="${option.value}" style="flex: 3;">${activityName} :</label>
<input type="text" id="${option.value}" name="${option.value}" value="${option.dataset.defaultValue || ''}" style="flex: 2; margin-left: 10px;" oninput="handleInputActivity(this.name)"/>
</div>
<div>
<span id="${option.value}-error" class="red-text"></span>
</div>
`;
activityFormsContainer.appendChild(activityDiv);
}
} else {
const existingChip = document.getElementById(option.value + "-chip");
if (existingChip) {
const activityDiv = existingChip.closest('.activity-input');
if (activityDiv) {
activityDiv.remove();
}
}
}
});
}
/**
* Gere garantie rccselection.
*/
function handleGarantieRCCSelection() {
const select = document.getElementById('garantieRCC-selector');
const garantieRccFormsContainer = document.getElementById('selected-garantieRCC');
// Clear previous entries
garantieRccFormsContainer.innerHTML = ''; // Clear any existing entries
// Iterate over each selected option
Array.from(select.options).forEach(option => {
if (option.selected && option.value) {
const garantieRccName = option.textContent;
const garantieRccDiv = document.createElement('div');
garantieRccDiv.classList.add('garantieRcc-input', 'row');
garantieRccDiv.style.display = 'flex';
garantieRccDiv.style.alignItems = 'center';
garantieRccDiv.style.justifyContent = 'start';
garantieRccDiv.style.marginBottom = '10px';
garantieRccDiv.innerHTML = `
<span id="${option.value}-chip" class="chip" for="${option.value}" style="color:darkblue">${garantieRccName}</span>`;
garantieRccFormsContainer.appendChild(garantieRccDiv);
}
});
}
/**
* Gere garantie rceselection.
*/
function handleGarantieRCESelection() {
const select = document.getElementById('garantieRCE-selector');
const garantieRceFormsContainer = document.getElementById('selected-garantieRCE');
// Clear previous entries
garantieRceFormsContainer.innerHTML = ''; // Clear any existing entries
// Iterate over each selected option
Array.from(select.options).forEach(option => {
if (option.selected && option.value) {
if (option.selected && option.value) {
const garantieRceName = option.textContent;
const garantieRceDiv = document.createElement('div');
garantieRceDiv.classList.add('garantieRce-input', 'row');
garantieRceDiv.style.display = 'flex';
garantieRceDiv.style.alignItems = 'center';
garantieRceDiv.style.justifyContent = 'start';
garantieRceDiv.style.marginBottom = '10px';
garantieRceDiv.innerHTML = `
<span id="${option.value}-chip" class="chip" for="${option.value}" style="color:darkblue">${garantieRceName}</span>
`;
garantieRceFormsContainer.appendChild(garantieRceDiv);
}
}
});
}
/**
* Gere marchandise selection.
*/
function handleMarchandiseSelection() {
const select = document.getElementById('marchandise-selector');
const marchandiseFormsContainer = document.getElementById('selected-marchandises');
// Clear previous entries
marchandiseFormsContainer.innerHTML = '';
// Iterate over each option
Array.from(select.options).forEach(option => {
if (option.selected && option.value) {
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 = `
<span id="${option.value}-chip" class="chip" for="${option.value}" style="color:darkblue">${marchandiseName}</span>
`;
marchandiseFormsContainer.appendChild(marchandiseDiv);
}
} else {
const existingChip = document.getElementById(`${option.value}-chip`);
if (existingChip) {
const chipContainer = existingChip.closest('.marchandise-input');
if (chipContainer) {
chipContainer.remove();
}
}
}
});
}
// Ajouter une ligne au tableau
/**
* Gere add row additionnel.
*/
function addRowAdditionnel(nomValue, adresseValue, siretValue) {
const table = document.getElementById('empTableAdditionnel');
// Créer une nouvelle ligne avec des inputs éditables
const newRow = table.insertRow(table.rows.length - 1);
newRow.innerHTML = `
<td><input type="text" name="nom" value="${nomValue}" class="input-field" /></td>
<td><input type="text" name="adresse" value="${adresseValue}" class="input-field" /></td>
<td><input type="text" name="siret" value="${siretValue}" class="input-field" /></td>
<td>
<button class="btn delete-btn" type="button">
<i class="material-icons">delete</i>
</button>
</td>
`;
// Réinitialiser les valeurs de saisie
document.getElementById('nomAdditionnel').value = '';
document.getElementById('adresseAditionnel').value = '';
document.getElementById('siretAdditionnel').value = '';
// Ajouter un écouteur d'événements pour supprimer
newRow.querySelector('.delete-btn').addEventListener('click', function () {
deleteRow(this);
});
}
// Ajouter une ligne au tableau Vehicule
/**
* Gere add row vehicule.
*/
function addRowVehicule(marqueValue, genreValue, typeValue, immatValue, capitalValue) {
const table = document.getElementById('empTableVehicules');
// Créer une nouvelle ligne avec des inputs éditables
const newRow = table.insertRow(table.rows.length - 1);
newRow.innerHTML = `
<td><input type="text" name="marque" value="${marqueValue}" class="input-field" /></td>
<td><input type="text" name="genre" value="${genreValue}" class="input-field" /></td>
<td><input type="text" name="type" value="${typeValue}" class="input-field" /></td>
<td><input type="text" name="immat" value="${immatValue}" class="input-field" /></td>
<td><input type="text" name="capital" value="${capitalValue}" class="input-field" /></td>
<td>
<button class="btn delete-btn" type="button">
<i class="material-icons">delete</i>
</button>
</td>
`;
// Réinitialiser les valeurs de saisie
document.getElementById('marqueVehicule').value = '';
document.getElementById('genreVehicule').value = '';
document.getElementById('typeVehicule').value = '';
document.getElementById('immatVehicule').value = '';
document.getElementById('capitalVehicule').value = '';
// Ajouter un écouteur d'événements pour supprimer
newRow.querySelector('.delete-btn').addEventListener('click', function () {
deleteRow(this);
});
}
// Supprimer une ligne du tableau
/**
* Gere delete row.
*/
function deleteRow(btn) {
const row = btn.parentElement.parentElement;
row.parentElement.removeChild(row);
}
// Contruit la structure Assuré additionnel à envoyer à la BDD
/**
* Gere extract assure additionnel.
*/
function extractAssureAdditionnel(tableId) {
const jsonArr = [];
const table = document.getElementById(tableId);
if (table && document.getElementById("additionel").checked) {
const rows = table.querySelectorAll('tr:not(:first-child)');
rows.forEach(row => {
const allInputsEmpty = Array.from(row.querySelectorAll('input')).every(input => input.value === '');
if (!allInputsEmpty) {
const inputs = row.querySelectorAll('input');
const dataObj = {};
inputs.forEach(input => {
const fieldName = input.getAttribute('name');
const fieldValue = input.value || "Non défini";
dataObj[fieldName] = fieldValue;
});
jsonArr.push(dataObj);
}
});
const jsonResult = JSON.stringify(jsonArr, null, 2);
return jsonResult;
}
return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
}
// Contruit la structure Designation à envoyer à la BDD
/**
* Gere extract designation vehicule.
*/
function extractDesignationVehicule(tableId) {
const jsonArr = [];
const table = document.getElementById(tableId);
if (table) {
const rows = table.querySelectorAll('tr:not(:first-child)');
rows.forEach(row => {
const allInputsEmpty = Array.from(row.querySelectorAll('input')).every(input => input.value === '');
if (!allInputsEmpty) {
const inputs = row.querySelectorAll('input');
const dataObj = {};
inputs.forEach(input => {
const fieldName = input.getAttribute('name');
const fieldValue = input.value || "Non défini";
dataObj[fieldName] = fieldValue;
});
jsonArr.push(dataObj);
}
});
const jsonResult = JSON.stringify(jsonArr, null, 2);
return jsonResult;
}
return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
}
/**
* Gere extract grille advalo.
*/
function extractGrilleAdvalo(tableID) {
var jsonData = [];
var table = document.getElementById(tableID);
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;
}
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;
}
/**
* Gere extract tempo.
*/
function extractTempo() {
let tempo = "";
if (document.getElementById("mensuel").checked == true) { tempo = "mensuel"; }
if (document.getElementById("trimestriel").checked == true) { tempo = "trimestriel"; }
if (document.getElementById("semestriel").checked == true) { tempo = "semestriel"; }
if (document.getElementById("annuel").checked == true) { tempo = "annuel"; }
return tempo;
}
/**
* Gere extract type cot.
*/
function extractTypeCot() {
let cot = "";
if (document.getElementById("forfaitaire").checked == true) { cot = "forfaitaire"; }
if (document.getElementById("revisable").checked == true) { cot = "revisable"; }
return cot;
}
/**
* Calcule cot total.
*/
function calcCotTotal() {
const readValue = (id) => {
const field = document.getElementById(id);
if (!field) return 0;
const parsed = parseValidationNumber(field.value);
return Number.isFinite(parsed) ? parsed : 0;
};
const cotRCCHT = readValue("cotRCCHT");
const cotRCCTTC = readValue("cotRCCTTC");
const cotRCEHT = readValue("cotRCEHT");
const cotRCETTC = readValue("cotRCETTC");
const cotPJHT = readValue("cotPJHT");
const cotPJTTC = readValue("cotPJTTC");
const cotFraisHT = readValue("cotFraisHT");
const cotFraisTTC = readValue("cotFraisTTC");
const totalCalcHT = cotRCCHT + cotRCEHT + cotPJHT + cotFraisHT;
const totalCalcTTC = cotRCCTTC + cotRCETTC + cotPJTTC + cotFraisTTC;
const totalHTInput = document.getElementById("cotTotalHT");
if (!totalHTInput) return;
const currentTotalHT = parseValidationNumber(totalHTInput?.value);
if (!Number.isFinite(currentTotalHT) || currentTotalHT <= 0) {
const tarifCommercialState = getTarifCommercialState();
if (tarifCommercialState.valid) {
totalHTInput.value = tarifCommercialState.tarifCommercialValue.toFixed(2);
} else {
totalHTInput.value = totalCalcHT.toFixed(2);
}
}
const totalTTCInput = document.getElementById("cotTotalTTC");
if (totalTTCInput) {
const currentTotalTTC = parseValidationNumber(totalTTCInput.value);
if (!Number.isFinite(currentTotalTTC) || currentTotalTTC <= 0) {
if (totalCalcTTC > 0) {
totalTTCInput.value = totalCalcTTC.toFixed(2);
}
}
}
updateTarifCommercialRows();
if (rcProjetGuard) rcProjetGuard.refresh();
}
/**
* Calcule taux total.
*/
function calcTauxTotal() {
const tauxRCCHTEl = document.getElementById("tauxRCCHT");
const tauxRCCTTCEl = document.getElementById("tauxRCCTTC");
const tauxRCEHTEl = document.getElementById("tauxRCEHT");
const tauxRCETTCEl = document.getElementById("tauxRCETTC");
const tauxTotalHTEl = document.getElementById("tauxTotalHT");
const tauxTotalTTCEl = document.getElementById("tauxTotalTTC");
if (!tauxRCCHTEl || !tauxRCCTTCEl || !tauxRCEHTEl || !tauxRCETTCEl || !tauxTotalHTEl || !tauxTotalTTCEl) return;
const tauxRCCHT = parseValidationNumber(tauxRCCHTEl.value);
const tauxRCCTTC = parseValidationNumber(tauxRCCTTCEl.value);
const tauxRCEHT = parseValidationNumber(tauxRCEHTEl.value);
const tauxRCETTC = parseValidationNumber(tauxRCETTCEl.value);
tauxTotalHTEl.value = ((Number.isFinite(tauxRCCHT) ? tauxRCCHT : 0) + (Number.isFinite(tauxRCEHT) ? tauxRCEHT : 0)).toFixed(3);
tauxTotalTTCEl.value = ((Number.isFinite(tauxRCCTTC) ? tauxRCCTTC : 0) + (Number.isFinite(tauxRCETTC) ? tauxRCETTC : 0)).toFixed(3);
if (rcProjetGuard) rcProjetGuard.refresh();
}
/**
* Calcule cot from taux ca.
*/
function calcCotFromTauxCA(idTaux, idCot) {
const caEl = document.getElementById("CA");
const tauxEl = document.getElementById(idTaux);
const cotEl = document.getElementById(idCot);
if (!caEl || !tauxEl || !cotEl) return;
const valueCA = parseValidationNumber(caEl.value);
const valueTaux = parseValidationNumber(tauxEl.value);
if (!Number.isFinite(valueCA) || !Number.isFinite(valueTaux)) return;
cotEl.value = (valueCA * valueTaux / 100).toFixed(2);
}
/**
* Calcule cot irreductible.
*/
function calcCotIrreductible() {
const cotRCCHTEl = document.getElementById("cotRCCHT");
const cotRCEHTEl = document.getElementById("cotRCEHT");
const cotIrreductibleEl = document.getElementById("cotisationIrreductible");
if (!cotRCCHTEl || !cotRCEHTEl || !cotIrreductibleEl) return;
const cotRCCHT = parseValidationNumber(cotRCCHTEl.value);
const cotRCEHT = parseValidationNumber(cotRCEHTEl.value);
if (!Number.isFinite(cotRCCHT) || !Number.isFinite(cotRCEHT)) return;
cotIrreductibleEl.value = ((cotRCCHT + cotRCEHT) * 0.8).toFixed(2);
}
/**
* Calcule add taxe.
*/
function calcAddTaxe(idHT, valueTaxe, idTTC) {
const htEl = document.getElementById(idHT);
const ttcEl = document.getElementById(idTTC);
if (!htEl || !ttcEl) return;
const valueHT = parseValidationNumber(htEl.value);
if (!Number.isFinite(valueHT)) return;
if (idTTC != "tauxRCCTTC" && idTTC != "tauxRCETTC") {
ttcEl.value = (valueHT * (1 + valueTaxe)).toFixed(2);
} else {
ttcEl.value = (valueHT * (1 + valueTaxe)).toFixed(3);
}
}
/**
* Calcule sub taxe.
*/
function calcSubTaxe(idHT, valueTaxe, idTTC) {
const htEl = document.getElementById(idHT);
const ttcEl = document.getElementById(idTTC);
if (!htEl || !ttcEl) return;
const valueTTC = parseValidationNumber(ttcEl.value);
if (!Number.isFinite(valueTTC)) return;
if (idHT != "tauxRCCHT" && idHT != "tauxRCEHT") {
htEl.value = (valueTTC / (1 + valueTaxe)).toFixed(2);
} else {
htEl.value = (valueTTC / (1 + valueTaxe)).toFixed(3);
}
}
// Gérer la soumission du formulaire
/**
* Gere submit form.
*/
async function handleSubmitForm(event) {
event.preventDefault();
await refreshTarifReferenceFromApi();
updatePrimeReferenceRow();
updateTarifCommercialRows();
if (rcProjetGuard && rcProjetGuard.refresh().length > 0) {
M.toast({ html: 'Corrigez les erreurs du formulaire avant de continuer.', classes: 'red' });
return;
}
// É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 - avec gestion "Nous consulter"
"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") ? getValueOrConsulter("loueur") : false,
"actMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? true : 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") ? getValueOrConsulter("représentant-douane") : false,
"actDemPar": document.getElementById("demenageur-particulier-chip") ? true : 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") ? getValueOrConsulter("demenageur-particulier-dommage") : false,
"actDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? true : 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") ? getValueOrConsulter("demenageur-entreprise") : false,
"actDemInterne": document.getElementById("demenageur-interne-chip") ? true : 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") ? getValueOrConsulter("garde-meubles") : false,
"actEntDep": document.getElementById("entrepositaire-depositaire-chip") ? true : 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") ? getValueOrConsulter("prestataire-logistique") : false,
"actLevageur": document.getElementById("manutentionnaire-levageur-chip") ? true : false,
"valueActLevageur": document.getElementById("manutentionnaire-levageur-chip") ? getValueOrConsulter("manutentionnaire-levageur") : false,
"actTransitaire": document.getElementById("transitaire-chip") ? true : false,
"valueActTransitaire": document.getElementById("transitaire-chip") ? getValueOrConsulter("transitaire") : 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;
}
} 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) {
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;
}
}
// É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: {
'Content-Type': 'application/json',
},
});
const dataContratEnCours = await responseContratEnCours.json();
if (dataContratEnCours.valid) {
// Obtenir la date actuelle au format "JJ/MM/AAAA"
const currentDate = new Date();
const day = String(currentDate.getDate()).padStart(2, '0');
const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // Les mois sont indexés à partir de 0, donc +1
const year = currentDate.getFullYear();
const formattedDate = `${day}/${month}/${year}`;
//Obtenir l'user
const token = localStorage.getItem('jwtToken');
const decoded = jwt_decode(token);
const userFirstName = decoded.userFirstName;
const userLastName = decoded.userLastName;
// Obtenir l'heure actuelle au format "HHhMM"
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 formattedTime = `${hours}:${minutes}:${seconds}`;
const nom = userLastName;
const prenom = userFirstName;
// Mettre à jour le champ "historique" dans le contrat avec les nouvelles données d'historique
const historiqueData = [
{
"type": contrat.type,
"date": formattedDate,
"heure": formattedTime,
"produit": "RC",
"id": idRC,
"nom": nom,
"prenom": prenom,
}
];
const responseHistoriqueUpdate = await fetch(`/contrat/update/historique/${contrat.id}`, {
method: 'POST',
body: JSON.stringify({ historiqueData }),
headers: {
'Content-Type': 'application/json',
},
});
const dataHistoriqueUpdate = await responseHistoriqueUpdate.json();
if (dataHistoriqueUpdate.valid) {
///////////////////////////////////////////////////////////////////////////////////////////////////////
/// TODO DEBUT Génération fichier à l'enregistrement A RETIRER QUAND MODE CONTRAT
const numParcours = getNumParcoursFromURL();
let filename;
// Envoi de la requête POST au serveur pour générer le projet
fetch(`/generate/rc/projet/${numParcours}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
})
.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];
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 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('Échec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message);
}
} else {
console.log('Échec lors de la mise à jour du champ "rc" dans le contrat :', dataContratEnCours.message);
}
} else {
console.log('Échec lors de la création de l\'enregistrement ProjetRC :', dataProjetRC.message);
}
}
// Fonction helper pour récupérer valeur ou "Nous consulter"
/**
* Recupere value or 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
/**
* Sauvegarde projet rc.
*/
async function saveProjetRC() {
try {
updatePrimeReferenceRow();
if (rcProjetGuard && rcProjetGuard.refresh().length > 0) {
return { valid: false, message: 'Le formulaire contient encore des erreurs.' };
}
// É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;
window.collectProjetDataForTarifPrefill = collectProjetDataForTarifPrefill;
})();