// Point d'entrée du simulateur modulaire import * as calculs from './calculs.js'; import * as utils from './utils.js'; import * as ui from './ui.js'; // --- Exemples de données (à remplacer par les vraies données dynamiques) --- const form_sliders = { but_immo: { capital_selected: 20000, capital_max: 90000, capital_step: 100, capital_min: 2500, duree_min: 24, duree_max: 120, durees: [24, 30, 36, 42, 48, 60, 72, 84], pivot_value: 0, sub_pivot_value: 0, title: 'Crédit travaux / Rénovation / Energie', description: 'Exemple crédit travaux.' }, fin_neuve: { capital_selected: 20000, capital_max: 100000, capital_step: 500, capital_min: 5000, duree_min: 24, duree_max: 84, durees: [24, 30, 36, 42, 48, 60, 72, 84], pivot_value: 0, sub_pivot_value: 5000, title: 'Financement véhicule NEUF', description: 'Exemple véhicule neuf.' }, fin_occ_p3a: { capital_selected: 20000, capital_max: 100000, capital_step: 500, capital_min: 5000, duree_min: 24, duree_max: 60, durees: [24, 30, 36, 42, 48, 60], pivot_value: 0, sub_pivot_value: 5000, title: 'Financement véhicule d\'occasion PLUS de 3 ans', description: 'Exemple véhicule +3 ans.' }, fin_occ_m3a: { capital_selected: 20000, capital_max: 100000, capital_step: 500, capital_min: 5000, duree_min: 24, duree_max: 84, durees: [24, 30, 36, 42, 48, 60, 72, 84], pivot_value: 0, sub_pivot_value: 5000, title: 'Financement véhicule d\'occasion MOINS de 3 ans', description: 'Exemple véhicule -3 ans.' }, mobil_carav: { capital_selected: 20000, capital_max: 100000, capital_step: 500, capital_min: 10000, duree_min: 24, duree_max: 144, durees: [24, 30, 36, 42, 48, 60, 72, 84, 96, 108, 120, 144], pivot_value: 75000, sub_pivot_value: 0, title: 'Financement mobilhome et caravane', description: 'Exemple mobilhome.' }, frais_notaire: { capital_selected: 20000, capital_max: 40000, capital_step: 100, capital_min: 2500, duree_min: 24, duree_max: 120, durees: [24, 30, 36, 42, 48, 60, 72, 84, 96, 108, 120], pivot_value: 0, sub_pivot_value: 0, title: 'Financement frais de notaire', description: 'Exemple frais notaire.' }, pat: { capital_selected: 10000, capital_max: 200000, capital_min: 1500, capital_step: 100, duree_min: 24, duree_max: 240, durees: [24, 30, 36, 42, 48, 60, 72, 84, 96, 108, 120, 144, 180, 240], pivot_value: 75000, sub_pivot_value: 0, title: 'Prêt personnel / Tous motifs / Achats divers', description: 'Exemple prêt personnel.' }, ph: { capital_selected: 100000, capital_max: 1000000, capital_min: 25000, capital_step: 1000, duree_min: 10, duree_max: 30, durees: [5, 10, 15, 20, 25, 30], pivot_value: 0, sub_pivot_value: 0, title: 'Crédit hypothécaire', description: 'Exemple crédit hypo social.' }, am: { capital_selected: 100000, capital_max: 1000000, capital_min: 25000, capital_step: 1000, duree_min: 10, duree_max: 30, durees: [10, 15, 20, 25, 30], pivot_value: 0, sub_pivot_value: 0, title: 'Crédit hypothécaire classique', description: 'Exemple crédit hypo classique.' }, amr: { capital_selected: 100000, capital_max: 1000000, capital_min: 25000, capital_step: 1000, duree_min: 10, duree_max: 30, durees: [10, 15, 20, 25, 30], pivot_value: 0, sub_pivot_value: 0, title: 'Crédit hypothécaire maison rapport', description: 'Exemple maison rapport.' }, cdp: { capital_selected: 100000, capital_max: 1000000, capital_min: 25000, capital_step: 1000, duree_min: 10, duree_max: 30, durees: [10, 15, 20, 25, 30], pivot_value: 0, sub_pivot_value: 0, title: 'Crédit pont', description: 'Exemple crédit pont.' }, cied: { capital_selected: 100000, capital_max: 1000000, capital_min: 25000, capital_step: 1000, duree_min: 10, duree_max: 30, durees: [10, 15, 20, 25, 30], pivot_value: 0, sub_pivot_value: 0, title: 'Crédit Indépendants et entreprises en difficultés', description: 'Exemple crédit indépendants.' }, regroup_cred: { capital_selected: 20000, capital_max: 200000, capital_step: 500, capital_min: 5000, duree_min: 24, duree_max: 144, durees: [24, 30, 36, 42, 48, 60, 72, 84, 96, 108, 120, 144], pivot_value: 75000, sub_pivot_value: 0, title: 'Regroupement de crédit / rachat de crédit', description: 'Exemple regroupement.' }, }; const map_values = { pat: 'pat', am: 'am' }; const authorized_value = ['pat', 'am']; // --- Etat global du simulateur --- let selected_type = 'pat'; let selected_capital = form_sliders[selected_type].capital_selected; let selected_duree = form_sliders[selected_type].duree_max; // --- Création des éléments d'affichage si besoin --- function ensureResultElements() { if (!document.getElementById('mensualite_result')) { const res = document.createElement('div'); res.id = 'mensualite_result'; res.style.margin = '1em 0'; document.body.appendChild(res); } if (!document.getElementById('taux_result')) { const res = document.createElement('div'); res.id = 'taux_result'; res.style.margin = '1em 0'; document.body.appendChild(res); } if (!document.getElementById('duree_result')) { const res = document.createElement('div'); res.id = 'duree_result'; res.style.margin = '1em 0'; document.body.appendChild(res); } } // --- Fonction de recalcul centralisée et affichage --- function recalculate() { let result; switch (selected_type) { case 'pat': result = calculs.calculate_pat(form_sliders, selected_capital, selected_duree); break; case 'am': result = calculs.calculate_am(form_sliders, selected_capital, selected_duree); break; case 'fin_neuve': if (typeof calculs.calculate_fin_neuve === 'function') { result = calculs.calculate_fin_neuve(form_sliders, selected_capital, selected_duree); } break; case 'fin_occ_m3a': if (typeof calculs.calculate_pao_m_3 === 'function') { result = calculs.calculate_pao_m_3(form_sliders, selected_capital, selected_duree); } break; case 'fin_occ_p3a': if (typeof calculs.calculate_pao_p_3 === 'function') { result = calculs.calculate_pao_p_3(form_sliders, selected_capital, selected_duree); } break; case 'ph': if (typeof calculs.calculate_ph === 'function') { result = calculs.calculate_ph(form_sliders, selected_capital, selected_duree); } break; case 'frais_notaire': if (typeof calculs.calculate_frais_notaire === 'function') { result = calculs.calculate_frais_notaire(form_sliders, selected_capital, selected_duree); } break; case 'but_immo': if (typeof calculs.calculate_but_immo === 'function') { result = calculs.calculate_but_immo(form_sliders, selected_capital, selected_duree); } break; case 'mobil_carav': if (typeof calculs.calculate_mobilhome === 'function') { result = calculs.calculate_mobilhome(form_sliders, selected_capital, selected_duree); } break; case 'regroup_cred': if (typeof calculs.calculate_regroupement_de_credit === 'function') { result = calculs.calculate_regroupement_de_credit(form_sliders, selected_capital, selected_duree); } break; // Ajouter ici d'autres types de crédits selon le module calculs.js default: result = null; } if (result) { // result = [min_duration, max_duration, selected_duration, duree_in_range, annual_rate, add_message] const mensualite = (selected_capital * (result[4] / 100) / 12).toFixed(2); // Simplifié pour démo const taux = result[4]; const duree = result[2]; document.getElementById('mensualite_result').textContent = `Mensualité estimée : ${utils.number_format(mensualite, 2, ',', ' ')} €`; document.getElementById('taux_result').textContent = `Taux annuel : ${taux} %`; document.getElementById('duree_result').textContent = `Durée sélectionnée : ${duree}`; } else { document.getElementById('mensualite_result').textContent = 'Mensualité : --'; document.getElementById('taux_result').textContent = 'Taux : --'; document.getElementById('duree_result').textContent = 'Durée : --'; } } // --- Initialisation des sliders au chargement --- document.addEventListener('DOMContentLoaded', () => { ensureResultElements(); // Initialisation sliders capital et durée ui.change_capital_slider(form_sliders, map_values, authorized_value, utils.number_format, form_sliders[selected_type].capital_min, form_sliders[selected_type].capital_max, form_sliders[selected_type].capital_selected); ui.change_month_slider(form_sliders, map_values, authorized_value, utils.number_format, ui.getStepForValue, form_sliders[selected_type].duree_min, form_sliders[selected_type].duree_max, form_sliders[selected_type].duree_max); recalculate(); // --- Gestion des événements --- document.getElementById('loan_type')?.addEventListener('change', (e) => { selected_type = e.target.value; selected_capital = form_sliders[selected_type].capital_selected; selected_duree = form_sliders[selected_type].duree_max; ui.change_capital_slider(form_sliders, map_values, authorized_value, utils.number_format, form_sliders[selected_type].capital_min, form_sliders[selected_type].capital_max, selected_capital); ui.change_month_slider(form_sliders, map_values, authorized_value, utils.number_format, ui.getStepForValue, form_sliders[selected_type].duree_min, form_sliders[selected_type].duree_max, selected_duree); recalculate(); }); document.getElementById('selected_capital')?.addEventListener('input', (e) => { selected_capital = parseInt(e.target.value, 10) || form_sliders[selected_type].capital_selected; recalculate(); }); document.getElementById('selected_months')?.addEventListener('input', (e) => { selected_duree = parseInt(e.target.value, 10) || form_sliders[selected_type].duree_max; recalculate(); }); }); // TODO : Gérer l'état global du simulateur, les valeurs sélectionnées, et l'intégration complète des modules // Ici, on gérera l'initialisation, les événements, et l'orchestration des modules // Exemple : // ui.change_capital_slider(...); // calculs.calculate_pat(...);