153 lines
10 KiB
JavaScript
153 lines
10 KiB
JavaScript
// 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(...);
|