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

3928 lines
186 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.

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
// 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
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
setupEventListeners();
populateFormData();
setupTarifImpactListeners();
updateSubmitButtonState('projetForm');
}
let tarifOriginalData = null;
function getLinkedTarifId() {
if (tarif && typeof tarif === 'object' && tarif.id) return 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;
}
function hasTarifReference() {
return Boolean(getLinkedTarifId());
}
async function loadModulateurs() {
try {
const response = await fetch('/rc/modulo/activiteRCC');
const data = await response.json();
if (data.valid) {
modRCActRCC = data.objRetourne;
}
const response2 = await fetch('/rc/modulo/marchandiseRC');
const data2 = await response2.json();
if (data2.valid) {
modRCMar = data2.objRetourne;
}
const response3 = await fetch('/rc/modulo/zoneRC');
const data3 = await response3.json();
if (data3.valid) {
modRCZone = data3.objRetourne;
}
const response4 = await fetch('/rc/modulo/activiteComplRC');
const data4 = await response4.json();
if (data4.valid) {
modRCActCompl = data4.objRetourne;
}
const response5 = await fetch('/rc/modulo/garAdditionelRC');
const data5 = await response5.json();
if (data5.valid) {
modRCGarAdd = data5.objRetourne;
}
} catch (error) {
console.error('Erreur lors du chargement des modulateurs:', error);
}
}
function saveOriginalTarifData() {
if (!hasTarifReference()) return;
const garantieRCCSelector = document.getElementById('garantieRCC-selector');
let garantiesRCC = [];
if (garantieRCCSelector) {
garantiesRCC = Array.from(garantieRCCSelector.selectedOptions).map(opt => opt.value);
} else if (projet) {
if (projet.extRCCConfie) garantiesRCC.push('contenant-confie');
if (projet.extRCCTPPC) garantiesRCC.push('tppc');
if (projet.extRCCModifCalArrim) garantiesRCC.push('modif-calage-arrimage');
if (projet.extRCCFerroutage) garantiesRCC.push('ferroutage');
if (projet.extRCCFraisRecons) garantiesRCC.push('frais-reconstitution');
if (projet.extRCCRegie) garantiesRCC.push('regie');
if (projet.extRCCSansMontageDemontage) garantiesRCC.push('sans-montage-demontage');
}
const 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: getCurrentTypeExtConfies(),
grilleAdvalorem: collectEffectiveAdvaloremGrid(getCurrentZoneData())
};
}
function checkActivityImpact(activityData) {
if (!modRCActRCC) return false;
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;
}
function checkMarchandiseImpact(marchandiseData) {
if (!modRCMar) return false;
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;
}
function getMaxZoneCoefficient(zones) {
let maxRCC = 1;
let maxRCE = 1;
if (!modRCZone) return { maxRCC, maxRCE };
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[zoneKey]) {
if (typeof modRCZone[zoneKey].modRCC === "number") {
maxRCC = Math.max(maxRCC, modRCZone[zoneKey].modRCC);
}
if (typeof modRCZone[zoneKey].modRCE === "number") {
maxRCE = Math.max(maxRCE, modRCZone[zoneKey].modRCE);
}
}
}
}
return { maxRCC, maxRCE };
}
function checkZoneImpact(zoneData) {
if (!modRCZone) return false;
const originalMax = getMaxZoneCoefficient(tarifOriginalData);
const currentMax = getMaxZoneCoefficient(zoneData);
return originalMax.maxRCC !== currentMax.maxRCC || originalMax.maxRCE !== currentMax.maxRCE;
}
function checkActiviteComplImpact(activiteComplData) {
if (!modRCActCompl) return false;
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;
}
function getCurrentActiviteComplData() {
const activitesCompl = {
activitesVoiturier: getActivitesComplFromForm('actComplVoiturier/Loueur'),
activitesCommissionnaire: getActivitesComplFromForm('actComplCommissionnaire de Transport'),
activitesDemenageur: getActivitesComplFromForm('actComplDéménageur'),
activitesLogistique: getActivitesComplFromForm('actComplLogistique')
};
return activitesCompl;
}
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;
}
function getCurrentTypeExtConfies() {
if (document.getElementById('AdValorem')?.checked) return 'ADVALOREM';
return 'VALEUR DECLAREE';
}
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;
}
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);
}
}
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;
}
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')
};
}
function checkCotisationImpact() {
const currentCotisation = document.querySelector('input[name="cotisation"]:checked')?.value || null;
return currentCotisation !== (tarifOriginalData?.typeCotisation || null);
}
function checkCAImpact() {
const currentCA = normalizeImpactValue(document.getElementById('CA')?.value || '');
const originalCA = normalizeImpactValue(tarifOriginalData?.ca || '');
return currentCA !== originalCA;
}
function checkPJImpact() {
const currentPJ = Boolean(document.getElementById('switchPJ')?.checked);
return currentPJ !== Boolean(tarifOriginalData?.pj);
}
function checkRCEImpact() {
const currentRCE = Boolean(document.getElementById('choixRCE')?.checked);
return currentRCE !== Boolean(tarifOriginalData?.checkRCE);
}
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);
}
function parseCapitalNumber(value) {
const normalized = String(value ?? '')
.trim()
.replace(/\s/g, '')
.replace(',', '.');
const parsed = Number(normalized);
return Number.isFinite(parsed) ? parsed : 0;
}
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;
}
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;
}
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;
function runWithRestoreGuard(callback) {
isRestoringValue = true;
try {
callback();
} finally {
setTimeout(() => {
isRestoringValue = false;
}, 0);
}
}
function getDisplayedStyle(id) {
const element = document.getElementById(id);
return element ? element.style.display : '';
}
function setDisplayedStyle(id, value) {
const element = document.getElementById(id);
if (element) {
element.style.display = value ?? '';
}
}
function readInputValue(id) {
const element = document.getElementById(id);
return element ? element.value : '';
}
function writeInputValue(id, value) {
const element = document.getElementById(id);
if (element) {
element.value = value ?? '';
}
}
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');
}
}
function recalculateAfterCAChange() {
validateField('CA', true);
updateSubmitButtonState('projetForm');
calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotIrreductible();
calcCotTotal();
}
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')
};
}
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();
});
}
function capturePJState() {
return {
checked: Boolean(document.getElementById('switchPJ')?.checked),
pj1Display: getDisplayedStyle('PJ1'),
pj2Display: getDisplayedStyle('PJ2'),
cotPJHT: readInputValue('cotPJHT'),
cotPJTTC: readInputValue('cotPJTTC')
};
}
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();
});
}
function captureCotisationState() {
return {
value: document.querySelector('input[name="cotisation"]:checked')?.value || null
};
}
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));
}
});
}
function captureCAState() {
return {
value: document.getElementById('CA')?.value || ''
};
}
function restoreCAState(state) {
if (!state) return;
runWithRestoreGuard(() => {
const caInput = document.getElementById('CA');
if (caInput) {
caInput.value = state.value ?? '';
}
recalculateAfterCAChange();
});
}
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 }));
});
}
function redirectToTarifFromModal() {
storeProjetDataForTarifPrefill();
const target = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
window.location.href = target;
}
function showTarifImpactModal(options = {}) {
const modal = document.getElementById('modalModif');
if (!modal || isTarifImpactModalOpen) 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) 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;
}
function promptTarifImpactIfNeeded(context = {}) {
if (isRestoringValue || isTarifImpactModalOpen || !hasTarifReference() || !tarifOriginalData) 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();
}
}
});
}
function setupTarifImpactListeners() {
if (!hasTarifReference()) return;
setTimeout(() => {
saveOriginalTarifData();
}, 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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 (!hasTarifReference() || !tarifOriginalData || 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.
}
function checkGarantieRCCImpact(garantieData) {
if (!modRCActCompl && !modRCGarAdd) return false;
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;
}
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)
};
}
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
};
}
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
};
}
function getCurrentGarantieRCCData() {
const selector = document.getElementById('garantieRCC-selector');
if (!selector) return [];
return Array.from(selector.selectedOptions).map(opt => opt.value);
}
function getSelectedMarchandises() {
const selector = document.getElementById('marchandise-selector');
return Array.from(selector.selectedOptions).map(opt => opt.value);
}
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 });
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;
}, 0);
}
// Configuration des écouteurs d'événements
function setupEventListeners() {
document.getElementById('projetFormBtn').addEventListener('click', handleSubmitForm);
document.getElementById('loadHistoriqueBtn').addEventListener('click', function () {
handleLoadHistoriqueBtn();
});
document.getElementById('activity-selector').addEventListener('change', function () {
handleActivitySelection();
});
document.getElementById('marchandise-selector').addEventListener('change', function () {
handleMarchandiseSelection();
});
document.getElementById('garantieRCC-selector').addEventListener('change', function () {
handleGarantieRCCSelection();
});
document.getElementById('garantieRCE-selector').addEventListener('change', function () {
handleGarantieRCESelection();
});
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 () {
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) {
if (isRestoringValue) {
recalculateAfterCAChange();
return;
}
if (promptTarifImpactIfNeeded({
isImpacting: () => checkCAImpact(),
restore: () => restoreCAState(previousCAState),
onNoImpact: () => {
previousCAState = captureCAState();
recalculateAfterCAChange();
}
})) {
e.stopImmediatePropagation();
e.preventDefault();
return;
}
});
document.getElementById('cotisationIrreductible').addEventListener('input', function () {
validateField('cotisationIrreductible', true);
updateSubmitButtonState('projetForm');
});
document.getElementById('tauxRCCHT').addEventListener('input', function () {
validateField('tauxRCCHT', true);
updateSubmitButtonState('projetForm');
calcAddTaxe('tauxRCCHT', 0, 'tauxRCCTTC');
calcTauxTotal();
calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotIrreductible();
calcCotTotal();
});
document.getElementById('tauxRCCTTC').addEventListener('input', function () {
validateField('tauxRCCTTC', true);
updateSubmitButtonState('projetForm');
calcSubTaxe('tauxRCCHT', 0, 'tauxRCCTTC');
calcTauxTotal();
calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotIrreductible();
calcCotTotal();
});
document.getElementById('tauxRCEHT').addEventListener('input', function () {
validateField('tauxRCEHT', true);
updateSubmitButtonState('projetForm');
calcAddTaxe('tauxRCEHT', 0.09, 'tauxRCETTC');
calcTauxTotal();
calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotIrreductible();
calcCotTotal();
});
document.getElementById('tauxRCETTC').addEventListener('input', function () {
validateField('tauxRCETTC', true);
updateSubmitButtonState('projetForm');
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 () {
validateField('cotRCCHT', true);
updateSubmitButtonState('projetForm');
calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotTotal();
});
document.getElementById('cotRCCTTC').addEventListener('input', function () {
validateField('cotRCCTTC', true);
updateSubmitButtonState('projetForm');
calcSubTaxe('cotRCCHT', 0, 'cotRCCTTC');
calcCotTotal();
});
document.getElementById('cotRCEHT').addEventListener('input', function () {
validateField('cotRCEHT', true);
updateSubmitButtonState('projetForm');
calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotTotal();
});
document.getElementById('cotRCETTC').addEventListener('input', function () {
validateField('cotRCETTC', true);
updateSubmitButtonState('projetForm');
calcSubTaxe('cotRCEHT', 0.09, 'cotRCETTC');
calcCotTotal();
});
document.getElementById('cotPJHT').addEventListener('input', function () {
validateField('cotPJHT', true);
updateSubmitButtonState('projetForm');
calcAddTaxe('cotPJHT', 0.134, 'cotPJTTC');
calcCotTotal();
});
document.getElementById('cotPJTTC').addEventListener('input', function () {
validateField('cotPJTTC', true);
updateSubmitButtonState('projetForm');
calcSubTaxe('cotPJHT', 0.134, 'cotPJTTC');
calcCotTotal();
});
document.getElementById('cotFraisHT').addEventListener('input', function () {
validateField('cotFraisHT', true);
updateSubmitButtonState('projetForm');
calcAddTaxe('cotFraisHT', 0, 'cotFraisTTC');
calcCotTotal();
});
document.getElementById('cotFraisTTC').addEventListener('input', function () {
validateField('cotFraisTTC', true);
updateSubmitButtonState('projetForm');
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
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.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";
};
}
}
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"]
}
};
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);
}
}
}
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;
}
}
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);
}
});
}
}
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();
}
}
}
});
}
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);
}
});
}
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);
}
}
});
}
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
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
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
function deleteRow(btn) {
const row = btn.parentElement.parentElement;
row.parentElement.removeChild(row);
}
// Contruit la structure Assuré additionnel à envoyer à la BDD
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
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
}
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;
}
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;
}
function extractTypeCot() {
let cot = "";
if (document.getElementById("forfaitaire").checked == true) { cot = "forfaitaire"; }
if (document.getElementById("revisable").checked == true) { cot = "revisable"; }
return cot;
}
function calcCotTotal() {
const cotRCCHT = parseFloat(document.getElementById("cotRCCHT").value) || 0
const cotRCCTTC = parseFloat(document.getElementById("cotRCCTTC").value) || 0
const cotRCEHT = parseFloat(document.getElementById("cotRCEHT").value) || 0
const cotRCETTC = parseFloat(document.getElementById("cotRCETTC").value) || 0
const cotPJHT = parseFloat(document.getElementById("cotPJHT").value) || 0
const cotPJTTC = parseFloat(document.getElementById("cotPJTTC").value) || 0
const cotFraisHT = parseFloat(document.getElementById("cotFraisHT").value) || 0
const cotFraisTTC = parseFloat(document.getElementById("cotFraisTTC").value) || 0
document.getElementById("cotTotalHT").value = (cotRCCHT + cotRCEHT + cotPJHT + cotFraisHT).toFixed(2);
document.getElementById("cotTotalTTC").value = (cotRCCTTC + cotRCETTC + cotPJTTC + cotFraisTTC).toFixed(2);
}
function calcTauxTotal() {
const tauxRCCHT = parseFloat(document.getElementById("tauxRCCHT").value) || 0
const tauxRCCTTC = parseFloat(document.getElementById("tauxRCCTTC").value) || 0
const tauxRCEHT = parseFloat(document.getElementById("tauxRCEHT").value) || 0
const tauxRCETTC = parseFloat(document.getElementById("tauxRCETTC").value) || 0
document.getElementById("tauxTotalHT").value = (tauxRCCHT + tauxRCEHT).toFixed(3);
document.getElementById("tauxTotalTTC").value = (tauxRCCTTC + tauxRCETTC).toFixed(3);
}
function calcCotFromTauxCA(idTaux, idCot) {
const valueCA = parseFloat(document.getElementById("CA").value) || 0
const valueTaux = parseFloat(document.getElementById(idTaux).value) || 0
document.getElementById(idCot).value = (valueCA * valueTaux / 100).toFixed(2);
}
function calcCotIrreductible() {
const cotRCCHT = parseFloat(document.getElementById("cotRCCHT").value) || 0
const cotRCEHT = parseFloat(document.getElementById("cotRCEHT").value) || 0
document.getElementById("cotisationIrreductible").value = ((cotRCCHT + cotRCEHT) * 0.8).toFixed(2);
}
function calcAddTaxe(idHT, valueTaxe, idTTC) {
const valueHT = parseFloat(document.getElementById(idHT).value) || 0
if (idTTC != "tauxRCCTTC" && idTTC != "tauxRCETTC") {
document.getElementById(idTTC).value = (valueHT * (1 + valueTaxe)).toFixed(2);
} else {
document.getElementById(idTTC).value = (valueHT * (1 + valueTaxe)).toFixed(3);
}
}
function calcSubTaxe(idHT, valueTaxe, idTTC) {
const valueTTC = parseFloat(document.getElementById(idTTC).value) || 0
if (idHT != "tauxRCCHT" && idHT != "tauxRCEHT") {
document.getElementById(idHT).value = (valueTTC / (1 + valueTaxe)).toFixed(2);
} else {
document.getElementById(idHT).value = (valueTTC / (1 + valueTaxe)).toFixed(3);
}
}
// Gérer la soumission du formulaire
async function handleSubmitForm(event) {
event.preventDefault();
// É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"
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
async function saveProjetRC() {
try {
// É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;
})();