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 modulos et liste var objModNatureMar, objModMontantCA, objModAct, objModCond, objModZoneTransp, objModTPPC, objMarEnExpo, objModRG const listeNatureMarObj = {} const listeActiviteObj = {} // Variables propositions let sansFranchise, franchise350, franchise750 //variables modale tarif commercial const seuil = 15 //variables de calculs var tauxCotRG = 1 // Accéder aux informations stockées du parcours parcours = JSON.parse(sessionStorage.getItem('parcours')); contrat = JSON.parse(sessionStorage.getItem('contrat')); fac = contrat?.["@expand"]?.enCours || null; tarif = fac?.["@expand"]?.tarif || null; console.log("Initialisation pour formulaire projet :", parcours); // Initialisation du formulaire et des données function init() { var select = document.querySelectorAll('select'); M.FormSelect.init(select); var modals = document.querySelectorAll('.modal'); M.Modal.init(modals); constantsJSON().then(() => { fillSelects(); populateFormData(); checkInputs(); }) afficherFAC() setupTableEventListeners() } function setupTableEventListeners() { document.querySelectorAll('input[name="typeFlux"]').forEach((input) => { input.addEventListener("change", function () { toggleTypeFlux(this.value) }) }) document.querySelectorAll('input[name="fluxDetailles"]').forEach((input) => { input.addEventListener("change", function () { toggleFluxDetailles() }) }) document.getElementById('TPPC').addEventListener('change', function () { document.getElementById('col-typetppc').style.display = this.checked ? "block" : "none" }) document.getElementById('marEnExpo').addEventListener('change', function () { document.getElementById('col-marEnExpo').style.display = this.checked ? "block" : "none" }) document.getElementById('rg').addEventListener('change', function () { document.getElementById('col-typeRG').style.display = this.checked ? "block" : "none" }) document.getElementById('affinerTarif').addEventListener('change', function () { document.getElementById('row-sinistresAsIf').style.display = this.checked ? "block" : "none" }) document.getElementById('risqueGuerreAchats').addEventListener('change', function () { document.getElementById('row-typeGarantieRGAchats').style.display = this.checked ? "block" : "none" }) document.getElementById('risqueGuerreVentes').addEventListener('change', function () { document.getElementById('row-typeGarantieRGVentes').style.display = this.checked ? "block" : "none" }) document.querySelectorAll("[name='zone']").forEach((zone) => { zone.addEventListener('change', function () { if (this.checked) { const chip = document.getElementById("chip-modulo-zone") const transport = document.querySelector('[name="moyenTransportGlobal"]:checked').value const zone = document.querySelector('[name="zone"]:checked').value updateModuloChip(chip, calcModZoneTransp(zone, transport)) } }) }) document.querySelectorAll('[name="zone"], [name="zoneVentes"], [name="zoneAchats"]').forEach((checkbox) => { checkbox.addEventListener('change', function () { checkZones(this.value, this.name) }) }) document.getElementById('sinistres').addEventListener('input', function () { const chip = document.getElementById('chip-primePlancher') updateModuloChip(chip, calcPrimePlancher(), false) }) document.querySelectorAll('.franchise-card button').forEach((button) => button.addEventListener('click', function (e) { e.preventDefault() openModaleTarifCom(this.name) })) document.querySelectorAll('.natureMar-autocomplete').forEach((input) => { input.addEventListener('change', function () { checkNatureMar(this) }) }) document.getElementById('activite').addEventListener('change', function () { checkActivite(this); }) document.getElementById('sinistres').addEventListener('input', function () { const chip = document.getElementById('chip-primePlancher') updateModuloChip(chip, calcPrimePlancher(), false) }) document.getElementById('sinistresAsIf').addEventListener('input', function () { const chip = document.getElementById('chip-modulo-sinistresAsIf') const sinistres = document.getElementById('sinistresAsIf').value updateModuloChip(chip, calcPrimeCS(sinistres), false) }) document.getElementById('police').addEventListener('change', function () { document.querySelectorAll('.natureMar-autocomplete').forEach((input) => { if (input.value !== "") { checkNatureMar(input) } }) const chip = document.getElementById('chip-modulo-police') updateModuloChip(chip, calcModPolice(this.value)) }) document.getElementById("nbVehicTPPC").addEventListener('input', function () { if (this.value > 5) { const elem = document.getElementById('modalTPPC'); const instance = M.Modal.getInstance(elem); instance.open() this.value = 5 } }) document.getElementById("capitalTPPC").addEventListener('input', function () { if (this.value > 99999) { const elem = document.getElementById('modalTPPC'); const instance = M.Modal.getInstance(elem); instance.open() this.value = 99999 } }) document.getElementById('montant').addEventListener('input', function () { const chip = document.getElementById('chip-modulo-montant') updateModuloChip(chip, calcModMontantCA(this.value, getCA())) }) document.getElementById('marchandise').addEventListener('input', function () { const chip = document.getElementById('chip-modulo-marchandise') updateModuloChip(chip, calcModNatureMar(this.value)) }) document.getElementById('conditionnementGlobal').addEventListener('change', function () { const chip = document.getElementById('chip-modulo-cond') updateModuloChip(chip, calcModCond(this.value)) }) document.getElementById('conditionnementAchats').addEventListener('change', function () { const chip = document.getElementById('chip-modulo-condAchats') updateModuloChip(chip, calcModCond(this.value)) }) document.getElementById('conditionnementVentes').addEventListener('change', function () { const chip = document.getElementById('chip-modulo-condVentes') updateModuloChip(chip, calcModCond(this.value)) }) document.getElementById('addAsIf').addEventListener('click', function () { addAsIf() }) document.querySelectorAll('[name=zoneAchats],[name=moyenTransportAchats]').forEach((input) => { input.addEventListener('change', function () { if (this.checked) { const zone = document.querySelector('[name="zoneAchats"]:checked')?.value const transport = document.querySelector('[name="moyenTransportAchats"]:checked')?.value const chip = document.getElementById('chip-modulo-zoneAchats') updateModuloChip(chip, calcModZoneTransp(zone, transport)) } }) }) document.querySelectorAll('[name=zoneVentes],[name=moyenTransportVentes]').forEach((input) => { input.addEventListener('change', function () { if (this.checked) { const zone = document.querySelector('[name="zoneVentes"]:checked')?.value const transport = document.querySelector('[name="moyenTransportVentes"]:checked')?.value const chip = document.getElementById('chip-modulo-zoneVentes') updateModuloChip(chip, calcModZoneTransp(zone, transport)) } }) }) document.querySelectorAll('#valeurAnnuelleVentes, #valeurAnnuelleAchats, #montantVentes, #montantAchats').forEach((input) => { input.addEventListener('input', function () { const chipAchats = document.getElementById('chip-modulo-montantAchats') const chipVentes = document.getElementById('chip-modulo-montantVentes') const modulo = calcModMontantCA(getMontantTotal(), getValeurAnnuelleTotal()) updateModuloChip(chipAchats, modulo) updateModuloChip(chipVentes, modulo) }) }) document.querySelectorAll('[name="btnZone1"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalZone1'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('[name="btnZone2"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalZone2'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('[name="btnZone3"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalZone3'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('[name="btnZone4"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalZone4'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('[name="btnZone5"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalZone5'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('[name="btnZone6"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalZone6'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('[name="btnZone7"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalZoneExclus'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('[name="zonesInfos"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalZones'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('[name="marchandiseInfos"]').forEach((button) => { button.addEventListener('click', function () { const elem = document.getElementById('modalMarchandise'); const instance = M.Modal.getInstance(elem); instance.open() }) }) document.querySelectorAll('input, select').forEach((input) => { const recalcul = () => { stepExtensions() if (checkInputs()) { document.getElementById('propositions').style.display = "flex" document.getElementById('row-champsManquants').style.display = "none" sansFranchise = calcCard(1) franchise350 = calcCard(0.9) franchise750 = calcCard(0.85) fillPropCard('sansFranchise', sansFranchise) fillPropCard('franchise350', franchise350) fillPropCard('franchise750', franchise750) } else { document.getElementById('propositions').style.display = "none" document.getElementById('row-champsManquants').style.display = "block" } } input.addEventListener('input', recalcul) input.addEventListener('change', recalcul) }) document.getElementById('comm-OK').addEventListener('click', function () { submitForm(this.name) }) document.getElementById('commentaire').addEventListener('input', function () { if (document.getElementById('commentaire').value == "") { document.getElementById('comm-OK').disabled = true } else { document.getElementById('comm-OK').disabled = false } }) document.getElementById('loadHistoriqueBtn').addEventListener('click', function () { handleLoadHistoriqueBtn(); }); } //Appel pour recevoir les constantes async function constantsJSON() { try { const responsesJSON = await Promise.all([ fetch('/fac/modulo/natureMar'), fetch('/fac/modulo/montantCA'), // fetch('/fac/modulo/franchiseTousCas'), fetch('/fac/modulo/activite'), fetch('/fac/modulo/conditionnement'), fetch('/fac/modulo/zoneTransport'), fetch('/fac/modulo/tppc'), fetch('/fac/modulo/marEnExpo'), fetch('/fac/modulo/rg'), ]); const jsonResponses = await Promise.all(responsesJSON.map(r => r.json())); // Récupérer toutes les réponses JSON // Extraire la valeur objRetourne de chaque réponse [ objModNatureMar, objModMontantCA, // objModFranchiseTousCas, objModAct, objModCond, objModZoneTransp, objModTPPC, objMarEnExpo, objModRG ] = jsonResponses.map(response => response.objRetourne); // Adapter pour extraire objRetourne } catch (err) { throw err; } } function checkActivite(input, showError = true) { const errorElement = document.getElementById('activite-error') const moduloChipAct = document.getElementById('chip-modulo-activite') if (Object.keys(objModAct).includes(input.value)) { if (showError) { errorElement.textContent = "" errorElement.style.display = "none" updateModuloChip(moduloChipAct, calcModAct(input.value)) } return true } else { if (showError) { errorElement.textContent = "Veuillez selectionner une activité parmi la liste" errorElement.style.display = "block" updateModuloChip(moduloChipAct, null) } return false } } function checkNatureMar(input, showError = true) { const errorElement = document.getElementById(input.id + '-error') const moduloChipAct = document.getElementById('chip-modulo-' + input.id) if (Object.keys(objModNatureMar).includes(input.value)) { if (showError) { errorElement.textContent = "" errorElement.style.display = "none" updateModuloChip(moduloChipAct, calcModNatureMar(input.value)) } return true } else { if (showError) { errorElement.textContent = "Veuillez selectionner une nature de marchandise parmi la liste" errorElement.style.display = "block" updateModuloChip(moduloChipAct, null) } return false } } function getTypeFlux() { return document.querySelector('[name="typeFlux"]:checked').value } function getPolice() { return document.querySelector('#police').value } function getTempo() { const police = getPolice() if (police == "ca") { return "annuel" } else if (police == "national" || police == "international") { return "tempo" } return null } function getTypeMar() { if (getTypeFlux() == "global") { return document.getElementById('marchandise').value } else { const actArray = [] const marAchats = document.getElementById('natureMarAchats').value const marVentes = document.getElementById('natureMarVentes').value if (marAchats !== "" && isAchatsSelected()) { actArray.push(marAchats) } if (marVentes !== "" && isVentesSelected()) { actArray.push(marVentes) } return actArray.join(', ') } } function getCA() { return document.getElementById('ca').value } function getMontantTotal() { if (getTypeFlux() == "global") { return document.getElementById('montant').value } else if (getTypeFlux() == "detailles") { var sommeMontant = 0 if (isAchatsSelected()) { sommeMontant += parseFloat(document.getElementById("montantAchats").value) } if (isVentesSelected()) { sommeMontant += parseFloat(document.getElementById("montantVentes").value) } return sommeMontant } } function getValeurAnnuelleTotal() { if (getTypeFlux() == "detailles") { var sommeMontant = 0 if (isAchatsSelected()) { sommeMontant += parseFloat(document.getElementById("valeurAnnuelleAchats").value) } if (isVentesSelected()) { sommeMontant += parseFloat(document.getElementById("valeurAnnuelleVentes").value) } return sommeMontant } else { return false } } function getRisqueGuerre() { const rgGlobal = document.querySelector('[name="typeGarantieRG"]:checked').value const rgGlobalCheckbox = document.getElementById('rg').checked const rgVentes = document.querySelector('[name="typeGarantieRGVentes"]:checked').value const rgVentesCheckbox = document.getElementById('risqueGuerreVentes').checked const rgAchats = document.querySelector('[name="typeGarantieRGAchats"]:checked').value const rgAchatsCheckbox = document.getElementById('risqueGuerreAchats').checked if (getTypeFlux() == "global" && rgGlobalCheckbox) { return [rgGlobal] } else if (getTypeFlux() == "detailles") { const rg = [] if (isAchatsSelected() && rgAchatsCheckbox) { rg.push(rgAchats) } if (isVentesSelected() && rgVentesCheckbox) { rg.push(rgVentes) } return rg } return [] } function getZones() { if (getTypeFlux() == "global") { return [document.querySelector('[name="zone"]:checked').value] } else if (getTypeFlux() == "detailles") { const zones = [] if (isAchatsSelected()) { zones.push(document.querySelector('[name="zoneAchats"]:checked').value) } if (isVentesSelected()) { zones.push(document.querySelector('[name="zoneVentes"]:checked').value) } return zones } return [] } function getTransportTypeRO(transport) { if (getTypeFlux() == "global") { if (document.getElementById(transport + '-global') && document.getElementById(transport + '-global').checked) { return document.querySelector('[name="risqueOrdinaire"]:checked').value } } else { const checkboxAchats = document.getElementById(transport + '-achats') const checkboxVentes = document.getElementById(transport + '-ventes') if ((checkboxAchats && checkboxAchats.checked) || (checkboxVentes && checkboxVentes.checked)) { return document.querySelector('[name="risqueOrdinaire"]:checked').value } } return "" } function isAchatsSelected() { return (document.getElementById('achats').checked) && (getTypeFlux() == "detailles") } function isVentesSelected() { return (document.getElementById('ventes').checked) && (getTypeFlux() == "detailles") } function calcModPolice(police) { if (police == "ca") { return 0.9 } else if (police == "international" || police == "national") { return 1 } else { return false } } function calcPrimeMini(police) { switch (police) { case "national": return 300; case "international": return 300; case "ca": return 800; } } function calcPrimePlancher() { const sinistres = document.getElementById('sinistres') if (sinistres.value !== "") { return parseFloat((sinistres.value * 100 / 65).toFixed(2)) } else { return false } } function calcModAct(activite) { if (activite == "") { return false } if (!Object.keys(objModAct).includes(activite)) { return false } return parseFloat(objModAct[activite]) } function calcModNatureMar(natureMar) { if (natureMar == "") { return false } if (!Object.keys(objModNatureMar).includes(natureMar)) { return false } var coeffTempo = 1 if (getTempo() == "tempo") { coeffTempo = 1.2 } return Number((objModNatureMar[natureMar].taux * coeffTempo).toFixed(5)) } function getModNatureMar() { if (getTypeFlux() == "global") { const marchandise = document.getElementById('marchandise').value return calcModNatureMar(marchandise) } else if (getTypeFlux() == "detailles") { var modNatureMar = 1 if (isAchatsSelected()) { const marchandise = document.getElementById('natureMarAchats').value modNatureMar *= calcModNatureMar(marchandise) } if (isVentesSelected()) { const marchandise = document.getElementById('natureMarVentes').value modNatureMar *= calcModNatureMar(marchandise) } return modNatureMar } } function calcModMontantCA(montant, ca) { if (montant && ca) { const palierCA = Object.keys(objModMontantCA) .map(palier => Number(palier)) .sort((a, b) => a - b) .find((p) => ca <= p); if (!palierCA || palierCA == undefined) return false; const palierMontant = Object.keys(objModMontantCA[palierCA]) .map(palier => Number(palier)) .sort((a, b) => a - b) .find((p) => montant <= p); if (!palierMontant || palierMontant == undefined) return false; return objModMontantCA[palierCA][palierMontant]; } else { return false } } function calcModCond(conditionnement) { if (Object.keys(objModCond).includes(conditionnement)) { return objModCond[conditionnement]["modulo"] } else { return false } } function calcModZoneTransp(zone, transport) { if (zone && transport) { return objModZoneTransp[zone][transport] } else { return false } } function calcTPPC(prime) { const montant = document.getElementById('capitalTPPC').value var tppc = 0 var franchise = "" const palierModulo = Object.keys(objModTPPC) .map(palier => Number(palier)) .sort((a, b) => a - b) .find((p) => montant <= p) const modulo = objModTPPC[palierModulo]?.modulo || 0 franchise = objModTPPC[palierModulo]?.franchise tppc = prime * modulo return { tppc: tppc, franchise: franchise } } function calcMarEnExpo(cotRO) { // Calcul de la majoration en exposition const nbExpo = document.getElementById('nombreExposition').value const capital = document.getElementById('capitalExposition').value const type = document.getElementById('typeMarEnExpo').value var marEnExpo = 0 var franchise = "" if (nbExpo && capital && type) { if (capital < 20000) { marEnExpo = 0 franchise = 500 } else if (nbExpo > 3 || capital > 50000) { marEnExpo = nbExpo * capital * objMarEnExpo[type] / 100 marEnExpo = marEnExpo > cotRO * 0.1 ? cotRO * 0.1 : marEnExpo // franchise = "10% mini 150 maxi 1000" franchise = 150 } else { marEnExpo = cotRO * 0.1 < 150 ? cotRO * 0.1 : 150 // franchise = "10% mini 150 maxi 1000" franchise = 150 } } return { marEnExpo: marEnExpo, franchise: franchise, } } function calcRG() { const typeFlux = getTypeFlux() var rg = 0 if (typeFlux == "global" && document.getElementById('rg').checked) { const engagement = document.getElementById('engagementRG').value const zone = document.querySelector('[name="zone"]:checked').value const typeRG = document.querySelector('[name="typeGarantieRG"]:checked').value tauxCotRG = objModRG[zone][typeRG] rg = engagement * tauxCotRG } else if (typeFlux == "detailles") { var rgAchats = 0 var rgVentes = 0 var tauxAchats = 1 var tauxVentes = 1 if (isAchatsSelected() && document.getElementById('risqueGuerreAchats').checked) { const engagementAchats = parseFloat(document.getElementById('engagementRGAchats').value) const zone = document.querySelector('[name="zoneAchats"]:checked').value const typeRG = document.querySelector('[name="typeGarantieRGAchats"]:checked').value tauxAchats = objModRG[zone][typeRG] rgAchats = engagementAchats * tauxAchats } if (isVentesSelected() && document.getElementById('risqueGuerreVentes').checked) { const engagementVentes = parseFloat(document.getElementById('engagementRGVentes').value) const zone = document.querySelector('[name="zoneVentes"]:checked').value const typeRG = document.querySelector('[name="typeGarantieRGVentes"]:checked').value tauxVentes = objModRG[zone][typeRG] rgVentes = tauxVentes * engagementVentes } tauxCotRG = tauxAchats * tauxVentes rg = rgAchats + rgVentes } return rg } function calcPrimeRef(modFranchise) { const typeFlux = getTypeFlux() var modPolice = calcModPolice(getPolice()) const activite = document.getElementById('activite').value const modAct = calcModAct(activite) var primeRef = 0 if (typeFlux == "global") { const conditionnement = document.querySelector('#conditionnementGlobal').value const marchandise = document.getElementById('marchandise').value const zone = document.querySelector('[name="zone"]:checked')?.value const transport = document.querySelector('[name="moyenTransportGlobal"]:checked')?.value const montant = getMontantTotal() const ca = getCA() modNatureMar = calcModNatureMar(marchandise) const modCond = calcModCond(conditionnement) const modZoneTransp = calcModZoneTransp(zone, transport) const modMontantCA = calcModMontantCA(montant, ca) const coeff = modNatureMar * modPolice * modFranchise * modCond * modZoneTransp * modMontantCA * modAct primeRef = ca * coeff } else if (typeFlux == "detailles") { var primeVentes = 0, primeAchats = 0 if (isAchatsSelected()) { primeAchats = calcPrimeAchats() } if (isVentesSelected()) { primeVentes = calcPrimeVentes() } primeRef = primeAchats + primeVentes } return primeRef } function calcPrimeCS(sinistre) { const affinerTarif = document.getElementById("affinerTarif").checked if (affinerTarif && sinistre > 0) { return (sinistre * 100 / 65).toFixed(2) } return false } function checkInputs() { const typeFlux = getTypeFlux() //CHAMPS COMMUN const inputActivite = document.getElementById('activite') const activite = inputActivite.value || false const ca = document.getElementById('ca').value || false const police = getPolice() //CHAMPS POUR FLUX GLOBAL const conditionnement = document.querySelector('#conditionnementGlobal').value || false const inputMarchandise = document.getElementById('marchandise') const marchandise = inputMarchandise.value || false const zone = document.querySelector('[name="zone"]:checked') || false const transport = document.querySelector('[name="moyenTransportGlobal"]:checked') || false const montant = document.getElementById('montant').value && validateField('montant') || false //CHAMPS POUR FLUX DETAILS const inputMarchandiseAchats = document.getElementById('natureMarAchats') const valeurAnnuelleAchats = document.getElementById("valeurAnnuelleAchats").value || false const montantAchats = document.getElementById("montantAchats").value && validateField('montantAchats') || false const transportAchats = document.querySelector('[name="moyenTransportAchats"]:checked') || false const conditionnementAchats = document.querySelector('#conditionnementAchats').value || false const zoneAchats = document.querySelector('[name="zoneAchats"]:checked') || false const inputMarchandiseVentes = document.getElementById('natureMarVentes') || false const valeurAnnuelleVentes = document.getElementById("valeurAnnuelleVentes").value || false const montantVentes = document.getElementById("montantVentes").value && validateField('montantVentes') || false const transportVentes = document.querySelector('[name="moyenTransportVentes"]:checked') || false const conditionnementVentes = document.querySelector('#conditionnementVentes').value || false const zoneVentes = document.querySelector('[name="zoneVentes"]:checked') || false //INPUT CHIPS const chipAct = document.getElementById("chip-act"); const chipPolice = document.getElementById("chip-police"); const chipCA = document.getElementById("chip-ca"); const chipNatureMar = document.getElementById("chip-natureMar"); const chipTransport = document.getElementById("chip-transport"); const chipConditionnement = document.getElementById("chip-conditionnement"); const chipMontant = document.getElementById("chip-montant"); const chipZone = document.getElementById("chip-zone"); const chipValeurAnnuelle = document.getElementById("chip-valeurAnnuelle"); updateInputChip(chipAct, checkActivite(inputActivite, false)) updateInputChip(chipPolice, police) updateInputChip(chipCA, ca) if (typeFlux == "global") { updateInputChip(chipNatureMar, checkNatureMar(inputMarchandise, false)) updateInputChip(chipTransport, transport) updateInputChip(chipConditionnement, conditionnement) updateInputChip(chipMontant, montant) updateInputChip(chipZone, zone) updateInputChip(chipValeurAnnuelle, true) return ((conditionnement && marchandise && zone && transport && activite && montant && ca && police)) } else if (typeFlux == "detailles") { let boolNatureMar = false; let boolTransport = false; let boolConditionnement = false; let boolMontant = false; let boolZone = false; const sources = []; if (isAchatsSelected()) { sources.push({ natureMar: checkNatureMar(inputMarchandiseAchats, false), transport: transportAchats, conditionnement: conditionnementAchats, montant: montantAchats, zone: zoneAchats, valeurAnnuelle: valeurAnnuelleAchats, }); } if (isVentesSelected()) { sources.push({ natureMar: checkNatureMar(inputMarchandiseVentes, false), transport: transportVentes, conditionnement: conditionnementVentes, montant: montantVentes, zone: zoneVentes, valeurAnnuelle: valeurAnnuelleVentes, }); } // Agrégation des booléens avec un ET logique boolNatureMar = sources.every(s => s.natureMar); boolTransport = sources.every(s => s.transport); boolConditionnement = sources.every(s => s.conditionnement); boolMontant = sources.every(s => s.montant); boolZone = sources.every(s => s.zone); boolValeurAnnuelle = sources.every(s => s.valeurAnnuelle) updateInputChip(chipNatureMar, boolNatureMar); updateInputChip(chipTransport, boolTransport); updateInputChip(chipConditionnement, boolConditionnement); updateInputChip(chipMontant, boolMontant); updateInputChip(chipZone, boolZone); updateInputChip(chipValeurAnnuelle, boolValeurAnnuelle) return boolNatureMar && boolTransport && boolConditionnement && boolMontant && boolZone && boolValeurAnnuelle && activite && ca && police; } } function toggleTypeFlux(type) { if (type == "detailles") { document.getElementById('row-fluxDetailles').style.display = "flex" document.getElementById('div-infoMarchandises').style.display = "none" document.getElementById('div-transport').style.display = "none" document.getElementById('div-zonesGeo').style.display = "none" document.getElementById('div-flux').style.display = "block" document.getElementById('row-rg').style.display = "none" toggleFluxDetailles() } else if (type == "global") { document.getElementById('row-fluxDetailles').style.display = "none" document.getElementById('div-infoMarchandises').style.display = "block" document.getElementById('div-transport').style.display = "block" document.getElementById('div-zonesGeo').style.display = "block" document.getElementById('div-flux').style.display = "none" document.getElementById('row-rg').style.display = "block" } } function toggleFluxDetailles() { const ventes = document.querySelector('input#ventes[name="fluxDetailles"]') const achats = document.querySelector('input#achats[name="fluxDetailles"]') const intersites = document.querySelector('input#intersites[name="fluxDetailles"]') /*Intersites ne peut pas être sélectionné seul*/ if (intersites.checked && (!isVentesSelected() && !isAchatsSelected())) { intersites.checked = false achats.checked = true } /*Il ne peut y avoir aucun flux sélectionné*/ if (document.querySelectorAll('[name="fluxDetailles"]:checked').length == 1) { document.querySelector('[name="fluxDetailles"]:checked').disabled = true document.querySelectorAll('[name="fluxDetailles"]:not(:checked)').forEach((checkbox) => { checkbox.disabled = false }) } else { ventes.disabled = false achats.disabled = false intersites.disabled = false } /*Affichage*/ document.getElementById('div-fluxAchats').style.display = achats.checked ? "block" : "none" document.getElementById('div-fluxVentes').style.display = ventes.checked ? "block" : "none" } function afficherFAC() { toggleTypeFlux(document.querySelector('[name="typeFlux"]:checked').value) } function updateModuloChip(elementModulo, valeur, isModulo = true) { if (valeur == null || valeur == false) { elementModulo.style.display = "none" } else { elementModulo.style.display = "inline-block" const titreModulo = elementModulo.innerText.split(' : ')[0] if (isModulo) { elementModulo.innerText = titreModulo + ' : x' + valeur } else if (!isModulo) { elementModulo.innerText = titreModulo + ' : ' + valeur + '€' } } } function updateStepChip(elementModulo, valeur) { if (valeur == null || valeur == false) { elementModulo.style.display = "none" } else { elementModulo.style.display = "inline-block" elementModulo.innerText = "Prime : " + new Intl.NumberFormat("fr-FR", {style: "currency", currency: "EUR"}).format(valeur) } } function updateInputChip(chip, valeur) { if (valeur != "" && valeur != null && valeur != false) { chip.style.display = "none" } else { chip.style.display = "inline-block" } } // Supprimer une ligne du tableau function deleteAsIf(btn) { const row = btn.parentElement.parentElement; row.parentElement.removeChild(row); } function addAsIf(franchise = "", sinistre = "") { var prime, display = "none" if (franchise && sinistre) { prime = calcPrimeCS(sinistre) display = "inline-block" } const newRow = document.createElement("div") newRow.className = "row mrg asIfRow" newRow.innerHTML = `
Prime Plancher Indicative : `+ prime + `€
` newRow.querySelector('.sinistresAsIf').addEventListener('input', function () { const chip = newRow.querySelector('.modulo') updateModuloChip(chip, calcPrimeCS(this.value), false) }) newRow.querySelector('.delete-btn').addEventListener('click', function () { deleteAsIf(this) }) document.getElementById('row-sinistresAsIf').appendChild(newRow) } function extractAsIf() { if (document.getElementById("affinerTarif").checked == "false") { return "" } else { const extractArray = [] document.querySelectorAll('.asIfRow').forEach((row) => { const franchise = row.querySelector('.franchiseAsIf').value const sinistres = row.querySelector('.sinistresAsIf').value if (franchise !== "" && sinistres !== "") { var obj = { franchise: franchise, sinistres: sinistres } extractArray.push(obj) } }) const jsonResult = JSON.stringify(extractArray, null, 2); return jsonResult; } } function fillSelects() { const optionCreator = (text, value) => { let option = document.createElement('option') option.value = value option.text = text return option } //Creation objets avec liste d'activité en clé, et null en valeur for (const natureMar of Object.keys(objModNatureMar)) { listeNatureMarObj[natureMar] = null } var elems = document.querySelectorAll('.natureMar-autocomplete'); M.Autocomplete.init(elems, { data: listeNatureMarObj, limit: 10 }) //Creation objets avec liste d'activité en clé, et null en valeur for (const activite of Object.keys(objModAct)) { listeActiviteObj[activite] = null } var elems = document.querySelectorAll('.activite-autocomplete'); M.Autocomplete.init(elems, { data: listeActiviteObj, limit: 10 }) //Remplissage des selects const selectCond = document.querySelectorAll('select[name="conditionnement"]') const selectMarEnExpo = document.getElementById('typeMarEnExpo') for (const [key, value] of Object.entries(objModCond)) { selectCond.forEach((select) => { if (select.id == "conditionnementGlobal" && value['fluxGlobal']) { select.add(optionCreator(value['nom'], key)) } else if (select.id !== "conditionnementGlobal" && value['fluxDetailles']) { select.add(optionCreator(value['nom'], key)) } }) } for (const [key, value] of Object.entries(objMarEnExpo)) { selectMarEnExpo.add(optionCreator(key, key)) } var select = document.querySelectorAll('select'); M.FormSelect.init(select); } function populateFormData() { // Populate select historique if (!contrat.historique) { document.getElementById('historiqueDiv').style.display = "none"; } else { document.getElementById('historiqueDiv').style.display = "block"; const idSelect = document.getElementById('idSelect'); contrat.historique.forEach(function (item) { if (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); } if (tarif?.typeFlux) { document.getElementById(tarif.typeFlux).checked = true toggleTypeFlux(tarif.typeFlux) } if (fac?.ca) { document.getElementById('ca').value = fac.ca } if (tarif?.typePolice) { document.querySelector('select#police option[value=' + tarif.typePolice + ']').selected = true; const chip = document.getElementById('chip-modulo-police') updateModuloChip(chip, calcModPolice(tarif.typePolice)) M.FormSelect.init(document.querySelector('select#police')) } if (fac?.actAssuree) { const inputActivite = document.getElementById('activite') inputActivite.value = fac.actAssuree checkActivite(inputActivite) } if (fac?.tppc) { document.getElementById('TPPC').checked = true document.getElementById('capitalTPPC').value = fac?.capitalTPPC ?? 0 document.getElementById('nbVehicTPPC').value = tarif?.nbVehicTPPC ?? 0 document.getElementById('col-typetppc').style.display = "block" } if (tarif?.typeMarExpo || fac?.capitalExpo > 0 || fac?.nbVehicExpo > 0) { document.getElementById('col-marEnExpo').style.display = "block" document.getElementById('marEnExpo').checked = true document.getElementById('capitalExposition').value = fac?.capitalExpo ?? 0 document.getElementById('nombreExposition').value = fac?.nbVehicExpo ?? 0 if (tarif?.typeMarExpo) { document.querySelector('select#typeMarEnExpo option[value="' + tarif.typeMarExpo + '"]').selected = true; M.FormSelect.init(document.querySelector('select#typeMarEnExpo')) } } if (tarif?.typeRO) { document.querySelector('input[name=risqueOrdinaire][id=' + tarif?.typeRO + ']').checked = true; } else { //LORSQUE LE PROJET EXISTE SANS LE TARIF, ON DONNE LA PRIORITE SUR LE TOUS RISQUES const terrestre = fac?.terrestre ?? "" const maritime = fac?.maritime ?? "" const aerien = fac?.aerien ?? "" const postal = fac?.postal ?? "" const fluvial = fac?.fluvial ?? "" const multimodal = fac?.multimodal ?? "" const transport = [terrestre, maritime, aerien, postal, fluvial, multimodal] if (!transport.every((type) => type == "")) { const typeRO = transport.filter((type) => type !== "").includes('tousRisques') ? "tousRisques" : "eventMaj" document.querySelector('input[name=risqueOrdinaire][id=' + typeRO + ']').checked = true; } } if (tarif?.oldFranchise && tarif?.sinistres) { document.getElementById('oldFranchise').value = tarif.oldFranchise document.getElementById('sinistres').value = tarif.sinistres const chip = document.getElementById('chip-primePlancher') updateModuloChip(chip, calcPrimePlancher(), false) } if (tarif?.asIf) { document.getElementById("affinerTarif").checked = true document.getElementById('row-sinistresAsIf').style.display = "block" tarif.asIf.forEach((rowAsIf) => { addAsIf(rowAsIf.franchise, rowAsIf.sinistres) }) } if (tarif?.typeFlux && tarif?.typeFlux == "global" || !tarif) { if (fac?.typeMar) { const inputNatureMar = document.getElementById('marchandise') const chip = document.getElementById('chip-modulo-marchandise') inputNatureMar.value = fac.typeMar checkNatureMar(inputNatureMar) updateModuloChip(chip, calcModNatureMar(fac.typeMar)) } if (tarif?.montantGarantir) { document.getElementById('montant').value = tarif.montantGarantir const chip = document.getElementById('chip-modulo-montant') updateModuloChip(chip, calcModMontantCA(tarif.montantGarantir, fac.ca)) } if (fac?.terrestre) { document.querySelector('[name="moyenTransportGlobal"][value="terrestre"] ').checked = true } if (fac?.multimodal) { document.querySelector('[name="moyenTransportGlobal"][value="multimodal"] ').checked = true } if (tarif?.conditionnement) { document.querySelector('select#conditionnementGlobal option[value=' + tarif.conditionnement + ']').selected = true; M.FormSelect.init(document.querySelector('select#conditionnementGlobal')) } if (tarif?.zone) { document.querySelector('input[name=zone][id=' + tarif.zone + ']').checked = true; checkZones(tarif.zone, "zone") } else if (fac?.zones) { fac.zones.forEach((zone) => { document.querySelector('input[name=zone][id=' + zone + ']').checked = true; checkZones(zone, "zone") }) } if (fac?.typeRG == "auto") { document.querySelector('input[name=typeGarantieRG][value=' + fac.typeRG + ']').checked = true; document.getElementById('col-typeRG').style.display = "block" document.getElementById('rg').checked = true if (tarif?.engagementRG > 0) { document.getElementById("engagementRG").value = tarif.engagementRG } } } else if (tarif?.typeFlux == "detailles") { document.getElementById('achats').checked = !!tarif.fluxAchats document.getElementById('ventes').checked = !!tarif.fluxVentes document.getElementById('intersites').checked = tarif.fluxIntersites toggleFluxDetailles() if (tarif?.fluxAchats) { const fluxAchats = tarif.fluxAchats const inputNatureMar = document.getElementById('natureMarAchats') inputNatureMar.value = fluxAchats.typeMar checkNatureMar(inputNatureMar) document.getElementById('valeurAnnuelleAchats').value = fluxAchats.valeurAnnuelleAchats document.getElementById('montantAchats').value = fluxAchats.montant document.querySelector('[name="moyenTransportAchats"][value="' + fluxAchats.transport + '"] ').checked = true document.querySelector('select#conditionnementAchats option[value=' + fluxAchats.conditionnement + ']').selected = true; M.FormSelect.init(document.querySelector('select#conditionnementAchats')) const chipCondAchats = document.getElementById('chip-modulo-condAchats') updateModuloChip(chipCondAchats, calcModCond(fluxAchats.conditionnement)) document.querySelector('input[name=zoneAchats][value=' + fluxAchats.zone + ']').checked = true; checkZones(fluxAchats.zone, "zoneAchats") const chipZoneTransp = document.getElementById('chip-modulo-zoneAchats') updateModuloChip(chipZoneTransp, calcModZoneTransp(fluxAchats.zone, fluxAchats.transport)) if (fluxAchats.typeRG) { document.querySelector('input[name=typeGarantieRGAchats][value=' + fluxAchats.typeRG + ']').checked = true; document.getElementById("engagementRGAchats").value = fluxAchats.engagementRG document.getElementById('row-typeGarantieRGAchats').style.display = "block" document.getElementById('risqueGuerreAchats').checked = true } } if (tarif?.fluxVentes) { const fluxVentes = tarif.fluxVentes const inputNatureMar = document.getElementById('natureMarVentes') inputNatureMar.value = fluxVentes.typeMar checkNatureMar(inputNatureMar) document.getElementById('valeurAnnuelleVentes').value = fluxVentes.valeurAnnuelleVentes document.getElementById('montantVentes').value = fluxVentes.montant document.querySelector('[name="moyenTransportVentes"][value="' + fluxVentes.transport + '"] ').checked = true document.querySelector('select#conditionnementVentes option[value=' + fluxVentes.conditionnement + ']').selected = true; M.FormSelect.init(document.querySelector('select#conditionnementVentes')) const chipCondVentes = document.getElementById('chip-modulo-condVentes') updateModuloChip(chipCondVentes, calcModCond(fluxVentes.conditionnement)) document.querySelector('input[name=zoneVentes][value=' + fluxVentes.zone + ']').checked = true; checkZones(fluxVentes.zone, "zoneVentes") const chipZoneTransp = document.getElementById('chip-modulo-zoneVentes') updateModuloChip(chipZoneTransp, calcModZoneTransp(fluxVentes.zone, fluxVentes.transport)) if (fluxVentes.typeRG) { document.querySelector('input[name=typeGarantieRGVentes][value=' + fluxVentes.typeRG + ']').checked = true; document.getElementById("engagementRGVentes").value = fluxVentes.engagementRG document.getElementById('row-typeGarantieRGVentes').style.display = "block" document.getElementById('risqueGuerreVentes').checked = true } } const chipAchats = document.getElementById('chip-modulo-montantAchats') const chipVentes = document.getElementById('chip-modulo-montantVentes') const moduloMontant = calcModMontantCA(getMontantTotal(), getValeurAnnuelleTotal()) updateModuloChip(chipAchats, moduloMontant) updateModuloChip(chipVentes, moduloMontant) } if (checkInputs()) { document.getElementById('propositions').style.display = "flex" document.getElementById('row-champsManquants').style.display = "none" sansFranchise = calcCard(1) franchise350 = calcCard(0.9) franchise750 = calcCard(0.85) fillPropCard('sansFranchise', sansFranchise) fillPropCard('franchise350', franchise350) fillPropCard('franchise750', franchise750) } else { document.getElementById('propositions').style.display = "none" document.getElementById('row-champsManquants').style.display = "block" } stepExtensions() } 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=tarif`; } else { console.log('Echec lors de la mise à jour de la relation id contrat - id client :', data); } }); } } function checkZones(checkedZone, nameZone) { const zone1Checked = checkedZone.includes("2") || checkedZone.includes("3"); const zone2Checked = checkedZone.includes("3"); if (nameZone == "zone") { document.getElementById('zone1-text').classList.toggle("checkedCheckbox", zone1Checked) } else if (nameZone == "zoneAchats") { document.getElementById('zoneAchats1-text').classList.toggle("checkedCheckbox", zone1Checked) document.getElementById('zoneAchats2-text').classList.toggle("checkedCheckbox", zone2Checked) } else if (nameZone == "zoneVentes") { document.getElementById('zoneVentes1-text').classList.toggle("checkedCheckbox", zone1Checked) document.getElementById('zoneVentes2-text').classList.toggle("checkedCheckbox", zone2Checked) } } function exportFlux(flux) { if (document.querySelector('[name="typeFlux"]:checked').value == "global") { return "" } if (flux == "achats" && document.querySelector('#achats[name="fluxDetailles"]').checked) { return { typeMar: document.getElementById('natureMarAchats').value, valeurAnnuelleAchats: document.querySelector('#div-fluxAchats #valeurAnnuelleAchats').value, montant: document.querySelector('#montantAchats').value, transport: document.querySelector('[name=moyenTransportAchats]:checked').value, conditionnement: document.querySelector('#conditionnementAchats').value, zone: document.querySelector('[name="zoneAchats"]:checked').value, typeRG: document.getElementById('risqueGuerreAchats').checked ? document.querySelector('[name="typeGarantieRGVentes"]:checked').value : "", engagementRG: document.getElementById('risqueGuerreAchats').checked ? document.getElementById('engagementRGAchats').value : "", } } else if (flux == "ventes" && document.querySelector('#ventes[name="fluxDetailles"]').checked) { return { typeMar: document.getElementById('natureMarVentes').value, valeurAnnuelleVentes: document.querySelector('#div-fluxVentes #valeurAnnuelleVentes').value, montant: document.querySelector('#div-fluxVentes #montantVentes').value, transport: document.querySelector('[name=moyenTransportVentes]:checked').value, conditionnement: document.querySelector('#conditionnementVentes').value, zone: document.querySelector('[name="zoneVentes"]:checked').value, typeRG: document.getElementById('risqueGuerreVentes').checked ? document.querySelector('[name="typeGarantieRGVentes"]:checked').value : "", engagementRG: document.getElementById('risqueGuerreVentes').checked ? document.getElementById('engagementRGVentes').value : "", } } else { return "" } } function calcCard(modFranchise) { const activite = document.getElementById('activite') const montant = getMontantTotal() const ca = getCA() var franchiseTPPC var franchiseExpo var primeRO = calcPrimeRef(modFranchise) const primeMini = calcPrimeMini(getPolice()) primeRO = (primeMini > primeRO) ? primeMini : primeRO if (document.getElementById("TPPC").checked) { const objTPPC = calcTPPC(primeRO) franchiseTPPC = objTPPC['franchise'] primeRO += objTPPC['tppc'] } if (document.getElementById('marEnExpo').checked) { const objExpo = calcMarEnExpo(primeRO) franchiseExpo = objExpo['franchise'] primeRO += objExpo['marEnExpo'] } primeRG = calcRG() primeRef = (primeRO + primeRG) * modFranchise const modMontantCA = calcModMontantCA(montant, ca) const modAct = calcModAct(activite.value) const tauxRO = (primeRef / ca * 100).toFixed(3) const tauxRG = (primeRG / ca * 100) primeRef = parseFloat(primeRef.toFixed(2) || 0) return { pourcentAct: modAct, pourcentMar: getModNatureMar(), pourcentCA: modMontantCA, pourcentFranchise: modFranchise, franchiseTPPC: franchiseTPPC, franchiseExpo: franchiseExpo, proposition: primeRef, tauxRG: tauxRG, tauxRO: tauxRO } } function calcPrimeAchats() { if (isAchatsSelected()) { const activite = document.getElementById('activite').value const valeurAnnuelleAchats = document.getElementById('valeurAnnuelleAchats').value const marchandise = document.getElementById('natureMarAchats').value const conditionnement = document.querySelector('#conditionnementAchats').value const zone = document.querySelector('[name="zoneAchats"]:checked')?.value const transport = document.querySelector('[name="moyenTransportAchats"]:checked')?.value if (marchandise && conditionnement && zone && transport && activite && valeurAnnuelleAchats) { const modNatureMarAchats = calcModNatureMar(marchandise) const modCond = calcModCond(conditionnement) const modZoneTransp = calcModZoneTransp(zone, transport) const taux = modNatureMarAchats * modCond * modZoneTransp const primeAchats = valeurAnnuelleAchats * taux * 0.3 const coeffGlobal = calcModMontantCA(getMontantTotal(), getValeurAnnuelleTotal()) const modPolice = calcModPolice(getPolice()) const modAct = calcModAct(activite) const coeffGeneraux = modPolice * modAct const prime = coeffGeneraux * coeffGlobal * primeAchats return prime } } else { return false } } function calcPrimeVentes() { if (isVentesSelected()) { const activite = document.getElementById('activite').value const valeurAnnuelleVentes = document.getElementById('valeurAnnuelleVentes').value const marchandise = document.getElementById('natureMarVentes').value const conditionnement = document.querySelector('#conditionnementVentes').value const zone = document.querySelector('[name="zoneVentes"]:checked')?.value const transport = document.querySelector('[name="moyenTransportVentes"]:checked')?.value if (marchandise && conditionnement && zone && transport && activite && valeurAnnuelleVentes) { const modNatureMarVentes = calcModNatureMar(marchandise) const modCond = calcModCond(conditionnement) const modZoneTransp = calcModZoneTransp(zone, transport) const taux = modNatureMarVentes * modCond * modZoneTransp const modPolice = calcModPolice(getPolice()) const modAct = calcModAct(activite) const primeVentes = valeurAnnuelleVentes * taux * 0.3 const sommeMontants = getMontantTotal() const sommeValeurCA = getValeurAnnuelleTotal() const coeffGlobal = calcModMontantCA(sommeMontants, sommeValeurCA) const coeffGeneraux = modPolice * modAct const prime = coeffGeneraux * coeffGlobal * primeVentes return prime } } } /* STEP FUNCTIONS */ function stepPolice() { if (getTypeFlux() !== "global") { return false } const ca = getCA() const modPolice = calcModPolice(getPolice()) const chip = document.getElementById("chip-step-police") const stepPolice = (ca && modPolice) ? ca * modPolice : false updateStepChip(chip, stepPolice) return stepPolice } function stepActivite() { if (getTypeFlux() !== "global") { return false } const previousStep = stepPolice() const activite = document.getElementById('activite').value const modAct = calcModAct(activite) const chip = document.getElementById("chip-step-activite") const stepActivite = (previousStep && modAct) ? previousStep * modAct : false updateStepChip(chip, stepActivite) return stepActivite } function stepMarchandises() { if (getTypeFlux() !== "global") { return false } const previousStep = stepActivite() const modTypeMar = calcModNatureMar(getTypeMar()) const modMontantCA = calcModMontantCA(getMontantTotal(), getCA()) const chip = document.getElementById("chip-step-marchandises") const stepMarch = (previousStep && modMontantCA && modTypeMar) ? previousStep * modMontantCA * modTypeMar : false updateStepChip(chip, stepMarch) return stepMarch } function stepCond() { if (getTypeFlux() !== "global") { return false } const previousStep = stepMarchandises() const modCond = calcModCond(document.querySelector('#conditionnementGlobal').value) const chip = document.getElementById("chip-step-cond") const stepCond = (previousStep && modCond) ? previousStep * modCond : false updateStepChip(chip, stepCond) return stepCond } function stepZone() { if (getTypeFlux() !== "global") { return false } const previousStep = stepCond() const transport = document.querySelector('[name="moyenTransportGlobal"]:checked')?.value || false const zone = document.querySelector('[name="zone"]:checked')?.value || false const modZoneTransp = calcModZoneTransp(zone, transport) const chip = document.getElementById("chip-step-zone") const stepZone = (previousStep && modZoneTransp) ? previousStep * modZoneTransp : false updateStepChip(chip, stepZone) return stepZone } function stepAchats() { const chip = document.getElementById("chip-step-achats") var stepAchats = calcPrimeAchats() if (document.getElementById('risqueGuerreAchats').checked && stepAchats) { const engagement = parseFloat(document.getElementById('engagementRGAchats').value) const zone = document.querySelector('[name="zoneAchats"]:checked').value const typeRG = document.querySelector('[name="typeGarantieRGAchats"]:checked').value if (engagement && zone && typeRG) { taux = objModRG[zone][typeRG] rg = engagement * taux stepAchats += rg } } updateStepChip(chip, stepAchats) return stepAchats } function stepVentes() { const chip = document.getElementById("chip-step-ventes") var stepVentes = calcPrimeVentes() if (document.getElementById('risqueGuerreVentes').checked && stepVentes) { const engagement = parseFloat(document.getElementById('engagementRGVentes').value) const zone = document.querySelector('[name="zoneVentes"]:checked').value const typeRG = document.querySelector('[name="typeGarantieRGVentes"]:checked').value if (engagement && zone && typeRG) { taux = objModRG[zone][typeRG] rg = engagement * taux stepVentes += rg } } updateStepChip(chip, stepVentes) return stepVentes } function stepExtensions() { const chip = document.getElementById("chip-step-extensions") var previousStep, stepExtensions if (getTypeFlux() == "global") { previousStep = stepZone() const tppc = (document.getElementById("TPPC").checked) ? calcTPPC(previousStep)['tppc'] : 0 const marEnExpo = (document.getElementById("marEnExpo").checked) ? calcMarEnExpo(previousStep)['marEnExpo'] : 0 const rg = calcRG() stepExtensions = (previousStep && (tppc || marEnExpo || rg)) ? (previousStep + tppc + marEnExpo + rg) : false } else if (getTypeFlux() == "detailles") { previousStep = 0 previousStep += isVentesSelected() ? stepVentes() : 0 previousStep += isAchatsSelected() ? stepAchats() : 0 const tppc = (document.getElementById("TPPC").checked) ? calcTPPC(previousStep)['tppc'] : 0 const marEnExpo = (document.getElementById("marEnExpo").checked) ? calcMarEnExpo(previousStep)['marEnExpo'] : 0 stepExtensions = (previousStep && (tppc || marEnExpo)) ? (previousStep + tppc + marEnExpo) : false } updateStepChip(chip, stepExtensions) return stepExtensions } function fillPropCard(idCard, cardData) { const card = document.getElementById(idCard) const pourcentageAct = parseFloat(cardData.pourcentAct * 100).toFixed(1) const pourcentageMar = parseFloat((cardData.pourcentMar * 1000).toFixed(6)) const pourcentageCA = parseFloat(cardData.pourcentCA * 100).toFixed(2) const pourcentageFranchise = parseFloat(cardData.pourcentFranchise * 100).toFixed(0) const proposition = parseFloat(cardData.proposition).toFixed(2) const franchiseTPPC = cardData.franchiseTPPC const franchiseExpo = cardData.franchiseExpo if (tarif && tarif.selectedFranchise && tarif.selectedFranchise == idCard) { card.classList.add('selected-card') } card.querySelector("[id = mod-activite-" + idCard + "]").innerText = "Modulation Activité : " + pourcentageAct + "%" card.querySelector("[id = mod-marchandise-" + idCard + "]").innerText = "Modulation Marchandise : " + pourcentageMar + "‰" card.querySelector("[id = mod-ca-" + idCard + "]").innerText = "Modulation CA : " + pourcentageCA + "%" card.querySelector("[id = mod-franchise-" + idCard + "]").innerText = "Modulation Franchise : " + pourcentageFranchise + "%" const tppcElement = card.querySelector("[id = mod-tppc-" + idCard + "]") const expoElement = card.querySelector("[id = mod-expo-" + idCard + "]") if (franchiseTPPC) { tppcElement.style.display = "block" tppcElement.innerText = "Franchise TPPC : " + franchiseTPPC + " €" } else { tppcElement.style.display = "none" } if (franchiseExpo) { expoElement.style.display = "block" expoElement.innerText = "Franchise Expo : " + franchiseExpo + " €" } else { expoElement.style.display = "none" } document.getElementById("proposition-" + idCard).innerText = proposition + "€" } async function submitForm(selectedCardId) { const typeFlux = getTypeFlux() const tppc = document.getElementById("TPPC").checked const rgGlobal = document.getElementById('rg').checked const marEnExpo = document.getElementById("marEnExpo").checked const selectedCard = extractPropoCard(selectedCardId) const bodyTarif = { fluxAchats: exportFlux("achats"), fluxVentes: exportFlux("ventes"), fluxIntersites: document.getElementById('intersites').checked, typePolice: getPolice(), typeRO: document.querySelector('[name="risqueOrdinaire"]:checked').value, conditionnement: typeFlux == "global" ? document.querySelector('#conditionnementGlobal').value : "", oldFranchise: document.getElementById('oldFranchise').value, sinistres: document.getElementById('sinistres').value, nbVehicTPPC: tppc ? document.getElementById("nbVehicTPPC").value : "", typeFlux: typeFlux, montantGarantir: typeFlux == "global" ? document.getElementById('montant').value : "", engagementRG: (typeFlux == "global" && rgGlobal) ? document.getElementById('engagementRG').value : "", franchise350: franchise350, franchise750: franchise750, sansFranchise: sansFranchise, selectedFranchise: selectedCardId, typeMarExpo: marEnExpo ? document.querySelector('[id="typeMarEnExpo"]').value : "", commentaire: document.getElementById('commentaire').value, zone: typeFlux == "global" ? document.querySelector('[name="zone"]:checked').value : "", transport: typeFlux == "global" ? document.querySelector('[name="moyenTransportGlobal"]:checked').value : "", asIf: extractAsIf() } const responseTarif = await fetch(`/fac/createTarif`, { method: 'POST', body: JSON.stringify(bodyTarif), headers: { 'Content-Type': 'application/json', }, }); const dataTarif = await responseTarif.json(); if (dataTarif.valid) { const idTarif = dataTarif.fac.id var cotRO = "", cotProvRO = "", cotRG = "", cotProvRG = "", rg = "" cotRO = document.getElementById('tarifCom').value if (contrat.type == "TEMPORAIRE") { cotRG = calcRG().toFixed(2) } else { cotProvRO = document.getElementById('tarifCom').value cotProvRG = calcRG().toFixed(2) } tauxCotRO = parseFloat(((document.getElementById('tarifCom').value / getCA()) * 100)).toFixed(3) tauxCotRG = parseFloat((tauxCotRG * 100).toFixed(6)) if (getRisqueGuerre().length > 0) { rg = "auto" } else if (fac && fac.rg !== "auto") { rg = fac.rg } const bodyFAC = { projet: fac.projet || '', tarif: idTarif, nbVehicExpo: marEnExpo ? document.getElementById('nombreExposition').value : "", actAssuree: document.getElementById('activite').value, typeMar: getTypeMar(), ca: getCA(), typeRG: getRisqueGuerre(), cotRO: cotRO, cotProvRO: cotProvRO, cotRG: cotRG, cotProvRG: cotProvRG, tauxCotRO: tauxCotRO, tauxCotRG: tauxCotRG, capitalExpo: marEnExpo ? document.querySelector('[id="capitalExposition"]').value : "", franchiseExpo: (marEnExpo && selectedCard.franchiseExpo) ? selectedCard.franchiseExpo : "", capitalTPPC: tppc ? document.querySelector('[id="capitalTPPC"]').value : "", franchiseTPPC: (tppc && selectedCard.franchiseTPPC) ? selectedCard.franchiseTPPC : "", zones: getZones(), terrestre: getTransportTypeRO('terrestre'), maritime: getTransportTypeRO('maritime'), aerien: getTransportTypeRO('aerien'), postal: getTransportTypeRO('postal'), fluvial: "", multimodal: getTransportTypeRO('multimodal'), tppc: document.getElementById('TPPC').checked, rg: rg, primeHT: document.getElementById('tarifCom').value, primeMini: calcPrimeMini(getPolice()) } const responseFAC = await fetch(`/fac/create`, { method: 'POST', body: JSON.stringify(bodyFAC), headers: { 'Content-Type': 'application/json', }, }); const data = await responseFAC.json(); if (data.valid) { const idProjet = data.fac.id; const responseContratEnCours = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idProjet}`, { 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": "FAC", "id": idProjet, "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) { window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`; } else { console.log('Echec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message); } } } else { console.log('Echec lors de la création de la saisie dans la collection TPPC :', data.message); } } else { console.log('Echec lors de la création de la saisie dans la collection FACtarif :', data.message); } } function extractPropoCard(cardId) { switch (cardId) { case 'sansFranchise': return sansFranchise case 'franchise350': return franchise350 case 'franchise750': return franchise750 } return null } function openModaleTarifCom(cardId) { const franchise = extractPropoCard(cardId) document.getElementById('tarifRefText').innerText = "Tarif de Référence : " + parseFloat(franchise.proposition).toFixed(2) + "€" document.getElementById('tarifCom').value = "" document.getElementById('commentaire').value = "" document.getElementById('comm-OK').disabled = false document.getElementById('tarifCom-error').style.display = "none" document.getElementById('col-commentaire').style.display = "none" document.getElementById('qualiteDiv').style.display = "none" document.getElementById('comm-OK').name = cardId document.getElementById('tarifCom').addEventListener('input', function () { var qualitePrime var emoji var showComment diff = 100 * parseFloat(document.getElementById('tarifCom').value / franchise.proposition) if (diff < (100 + seuil) && diff > (100 - seuil)) { emoji = "mood" showComment = false if (diff > 100) { qualitePrime = "Tarif correct (+" + (diff - 100).toFixed(2) + "%)" } else if (diff < 100) { qualitePrime = "Tarif correct (-" + (100 - diff).toFixed(2) + "%)" } else if (diff == 100) { qualitePrime = "Le juste prix" emoji = "thumb_up_alt" } } else { emoji = "mood_bad" showComment = true if (diff > (100 + seuil)) { qualitePrime = "Tarif trop élevé (+" + (diff - 100).toFixed(2) + "%)" } else if (diff < (100 - seuil)) { qualitePrime = "Tarif trop bas (-" + (100 - diff).toFixed(2) + "%)" } } document.getElementById('qualiteDiv').style.display = "block" document.getElementById('qualitePrime').innerText = qualitePrime document.getElementById('modalTarifCom-icon').innerText = emoji document.getElementById('modalTarifCom-icon').style.color = (emoji == "mood_bad") ? "red" : "green" if (showComment) { document.getElementById('tarifCom-error').style.display = "flex" document.getElementById('col-commentaire').style.display = "flex" if (document.getElementById('commentaire').value == "") { document.getElementById('comm-OK').disabled = true } } else { document.getElementById('comm-OK').disabled = false document.getElementById('tarifCom-error').style.display = "none" document.getElementById('col-commentaire').style.display = "none" } }) const modal = document.getElementById('modalTarifCom') const instance = M.Modal.getInstance(modal); instance.open(); } // Exposer init globalement pour y accéder depuis l'extérieur window.initSubmenuForm = init; })();