{"id":1345,"date":"2025-08-28T10:13:51","date_gmt":"2025-08-28T09:13:51","guid":{"rendered":"https:\/\/protocole-csr.com\/?post_type=download&#038;p=1345"},"modified":"2025-08-28T10:38:55","modified_gmt":"2025-08-28T09:38:55","slug":"fiche-dautoevaluation-financiere-revenus-depenses","status":"publish","type":"download","link":"https:\/\/protocole-csr.com\/?download=fiche-dautoevaluation-financiere-revenus-depenses","title":{"rendered":"Fiche d\u2019auto\u00e9valuation financi\u00e8re \u2013 Revenus &#038; D\u00e9penses"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"utf-8\" \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n<title>Fiche d\u2019auto\u00e9valuation financi\u00e8re \u2013 Revenus &#038; D\u00e9penses<\/title>\n<style>\n  :root{\n    --bg:#0f172a;          \/* slate-900 *\/\n    --panel:#111827;       \/* gray-900 *\/\n    --muted:#1f2937;       \/* gray-800 *\/\n    --soft:#374151;        \/* gray-700 *\/\n    --text:#e5e7eb;        \/* gray-200 *\/\n    --text-soft:#cbd5e1;   \/* slate-300 *\/\n    --accent:#22c55e;      \/* green-500 *\/\n    --accent-2:#06b6d4;    \/* cyan-500 *\/\n    --warn:#f59e0b;        \/* amber-500 *\/\n    --danger:#ef4444;      \/* red-500 *\/\n    --ok:#10b981;          \/* emerald-500 *\/\n    --ring:#38bdf8;        \/* sky-400 *\/\n    --card:#0b1220;\n    --shadow: 0 10px 30px rgba(0,0,0,.35);\n    --radius: 14px;\n  }\n  *{box-sizing:border-box}\n  html,body{background:linear-gradient(180deg,#0b1020 0%, #0e1530 100%); color:var(--text); font-family:Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, \"Apple Color Emoji\",\"Segoe UI Emoji\"; margin:0}\n  h1,h2,h3{margin:.2rem 0 1rem 0; line-height:1.2}\n  h1{font-size:clamp(1.6rem,2.2vw,2.2rem)}\n  h2{font-size:clamp(1.2rem,1.8vw,1.6rem)}\n  p{color:var(--text-soft)}\n  a{color:var(--accent-2); text-decoration:none}\n  .wrap{max-width:1200px; margin:30px auto; padding:0 16px}\n  .grid{display:grid; gap:18px}\n  .g-2{grid-template-columns:1fr}\n  .g-3{grid-template-columns:1fr}\n  @media (min-width:900px){\n    .g-2{grid-template-columns:1fr 1fr}\n    .g-3{grid-template-columns:2fr 2fr 1.5fr}\n  }\n  .card{background:linear-gradient(180deg, #0b1220, #0e1a33); border:1px solid rgba(255,255,255,.06); border-radius:var(--radius); padding:18px; box-shadow:var(--shadow)}\n  .card h3{margin-top:0}\n  .toolbar{display:flex; gap:10px; flex-wrap:wrap; align-items:center}\n  .btn{background:linear-gradient(135deg, #1f2937, #0f172a); border:1px solid rgba(255,255,255,.08); color:var(--text); padding:10px 14px; border-radius:10px; cursor:pointer}\n  .btn:hover{outline:1px solid var(--ring)}\n  .btn.primary{background:linear-gradient(135deg, #0ea5e9, #22c55e); color:#041217; font-weight:600; border:none}\n  .btn.danger{background:linear-gradient(135deg, #ef4444, #f59e0b); color:#1a0707; font-weight:600; border:none}\n  .row{display:grid; grid-template-columns:2fr 1.3fr 1.3fr auto; gap:10px; margin-bottom:8px; align-items:center}\n  .row.header{font-weight:600; color:#93c5fd}\n  .row.saisonnier .saison-extra{display:grid}\n  .saison-extra{display:none; grid-template-columns:1fr 1fr; gap:10px}\n  label small{color:var(--text-soft)}\n  input[type=\"text\"], input[type=\"number\"], select{\n    width:100%; padding:10px 12px; border-radius:10px; border:1px solid rgba(255,255,255,.08);\n    background:linear-gradient(180deg,#0b1220,#0d1528); color:var(--text);\n  }\n  input[type=\"number\"]::-webkit-outer-spin-button,\n  input[type=\"number\"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0;}\n  .del{background:transparent; border:1px solid rgba(255,255,255,.12); color:#e5e7eb; padding:8px 10px; border-radius:10px; cursor:pointer}\n  .del:hover{border-color:#fca5a5; color:#fecaca}\n  .kpi{display:grid; grid-template-columns:1fr 1fr; gap:10px}\n  .metric{background:linear-gradient(180deg,#0e1a33,#0c1426); border:1px solid rgba(255,255,255,.07); border-radius:12px; padding:12px}\n  .metric h4{margin:.2rem 0 .6rem 0}\n  .value{font-size:1.4rem; font-weight:700}\n  .muted{color:var(--text-soft); font-size:.9rem}\n  .bar{height:12px; background:#0f1b33; border-radius:999px; overflow:hidden; border:1px solid rgba(255,255,255,.08)}\n  .bar > span{display:block; height:100%; width:0%; background:linear-gradient(90deg, #22c55e, #06b6d4); transition:width .35s ease}\n  .bar.warn > span{background:linear-gradient(90deg,#f59e0b,#ef4444)}\n  .tag{display:inline-flex; align-items:center; gap:6px; padding:6px 10px; border-radius:999px; border:1px solid rgba(255,255,255,.1); background:#0b1326; color:#93c5fd; font-size:.85rem}\n  .stack{display:flex; flex-wrap:wrap; gap:8px}\n  .section-title{display:flex; justify-content:space-between; align-items:center; gap:8px; margin-bottom:10px}\n  .section-title h3{margin:0}\n  .footnote{color:var(--text-soft); font-size:.85rem}\n  .hint{color:#93c5fd; font-size:.85rem}\n  .sep{height:1px; background:linear-gradient(90deg, transparent, rgba(255,255,255,.08), transparent); margin:12px 0}\n<\/style>\n<\/head>\n<body>\n  <div class=\"wrap\">\n    <header class=\"card\">\n      <h1>Fiche d\u2019auto\u00e9valuation financi\u00e8re<\/h1>\n      <p>Faites le point sur vos <strong>sources de revenu<\/strong>, vos <strong>d\u00e9penses<\/strong> et vos <strong>engagements<\/strong>. Obtenez des indicateurs cl\u00e9s : taux d\u2019\u00e9pargne, charge de dette, fonds d\u2019urgence, et <em>indice de diversification<\/em> de vos revenus.<\/p>\n      <div class=\"toolbar\">\n        <label class=\"tag\">Devise&nbsp;\n          <select id=\"currency\">\n            <option value=\"\u20ac\" selected>\u20ac (EUR)<\/option>\n            <option value=\"FCFA\">FCFA<\/option>\n            <option value=\"$\">$ (USD)<\/option>\n            <option value=\"custom\">Personnalis\u00e9e\u2026<\/option>\n          <\/select>\n        <\/label>\n        <input id=\"customCurrency\" type=\"text\" placeholder=\"Symbole perso (ex: CFA)\" style=\"display:none; max-width:160px\" \/>\n        <button class=\"btn\" id=\"saveBtn\">\ud83d\udcbe Enregistrer<\/button>\n        <button class=\"btn\" id=\"loadBtn\">\ud83d\udcc2 Charger<\/button>\n        <button class=\"btn danger\" id=\"resetBtn\">\ud83e\uddf9 R\u00e9initialiser<\/button>\n        <button class=\"btn primary\" id=\"printBtn\">\ud83d\udda8\ufe0f Exporter \/ Imprimer<\/button>\n      <\/div>\n      <div class=\"sep\"><\/div>\n      <div class=\"stack\">\n        <span class=\"tag\">\ud83d\udca1 Astuce : remplissez au moins 3\u20134 sources de revenu et toutes vos charges r\u00e9currentes.<\/span>\n        <span class=\"tag\">\ud83d\udd12 Donn\u00e9es stock\u00e9es en local sur votre navigateur (localStorage).<\/span>\n      <\/div>\n    <\/header>\n\n    <!-- REVENUS -->\n    <section class=\"card\">\n      <div class=\"section-title\">\n        <h3>1) Revenus mensuels<\/h3>\n        <button class=\"btn\" id=\"addIncome\">\u2795 Ajouter une source<\/button>\n      <\/div>\n      <div class=\"row header\">\n        <div>Nom de la source (ex : Salaire, Plantations, Boutique, \u00c9levage, Forever\u2026)<\/div>\n        <div>Type<\/div>\n        <div>Montant<\/div>\n        <div>\u2014<\/div>\n      <\/div>\n      <div id=\"incomeList\"><\/div>\n      <p class=\"footnote\">Types : <strong>Mensuel (stable)<\/strong> = salaire\/loyer fixe \u2022 <strong>Mensuel (variable)<\/strong> = moyenne mensuelle \u2022 <strong>Saisonnier<\/strong> = total annuel r\u00e9parti sur 12 mois.<\/p>\n    <\/section>\n\n    <!-- DEPENSES -->\n    <section class=\"card\">\n      <div class=\"section-title\">\n        <h3>2) D\u00e9penses mensuelles<\/h3>\n        <button class=\"btn\" id=\"addExpense\">\u2795 Ajouter une d\u00e9pense<\/button>\n      <\/div>\n      <div class=\"row header\">\n        <div>Cat\u00e9gorie (ex : Loyer, Nourriture, Transport, \u00c9ducation, Sant\u00e9, Intrants agricoles\u2026)<\/div>\n        <div>P\u00e9riodicit\u00e9<\/div>\n        <div>Montant<\/div>\n        <div>\u2014<\/div>\n      <\/div>\n      <div id=\"expenseList\"><\/div>\n      <p class=\"footnote\">P\u00e9riodicit\u00e9 \u00ab Mensuelle \u00bb = montant par mois \u2022 \u00ab Annuelle \u00bb = sera divis\u00e9 par 12 (ex : assurance, imp\u00f4ts).<\/p>\n    <\/section>\n\n    <!-- DETTES & FONDS D'URGENCE -->\n    <section class=\"card g-2 grid\">\n      <div>\n        <div class=\"section-title\">\n          <h3>3) Dettes &#038; cr\u00e9dits<\/h3>\n          <button class=\"btn\" id=\"addDebt\">\u2795 Ajouter une dette<\/button>\n        <\/div>\n        <div class=\"row header\">\n          <div>Cr\u00e9dit \/ Dette (ex : pr\u00eat immo, moto, intrants\u2026)<\/div>\n          <div>Mensualit\u00e9<\/div>\n          <div>Solde restant<\/div>\n          <div>\u2014<\/div>\n        <\/div>\n        <div id=\"debtsList\"><\/div>\n        <p class=\"footnote\">La mensualit\u00e9 entre dans le calcul du <strong>taux d\u2019endettement<\/strong> (DTI).<\/p>\n      <\/div>\n      <div>\n        <h3>4) \u00c9pargne &#038; Fonds d\u2019urgence<\/h3>\n        <div class=\"row\" style=\"grid-template-columns:2fr 1.2fr;\">\n          <label>\u00c9pargne disponible (comptes, cash, mobile money)\n            <input type=\"number\" id=\"savings\" min=\"0\" step=\"0.01\" placeholder=\"0\" \/>\n          <\/label>\n          <label>Objectif fonds d\u2019urgence (mois cibles)\n            <input type=\"number\" id=\"efTarget\" min=\"1\" step=\"1\" value=\"6\" \/>\n          <\/label>\n        <\/div>\n        <p class=\"footnote\">Recommandation g\u00e9n\u00e9rale : viser 3\u20136 mois de d\u00e9penses essentielles. Ajustez selon votre activit\u00e9.<\/p>\n      <\/div>\n    <\/section>\n\n    <!-- KPIs -->\n    <section class=\"grid g-3\">\n      <div class=\"card\">\n        <h3>Indicateurs cl\u00e9s<\/h3>\n        <div class=\"kpi\">\n          <div class=\"metric\">\n            <h4>Total revenus<\/h4>\n            <div class=\"value\" id=\"totalIncome\">\u2014<\/div>\n            <div class=\"muted\">Stable&nbsp;: <span id=\"stablePct\">\u2014<\/span> \u2022 Variable&nbsp;: <span id=\"variablePct\">\u2014<\/span><\/div>\n          <\/div>\n          <div class=\"metric\">\n            <h4>Total d\u00e9penses<\/h4>\n            <div class=\"value\" id=\"totalExpense\">\u2014<\/div>\n            <div class=\"muted\">Dont dettes mensuelles&nbsp;: <span id=\"debtOut\">\u2014<\/span><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"kpi\" style=\"margin-top:10px\">\n          <div class=\"metric\">\n            <h4>\u00c9pargne mensuelle (revenus \u2013 d\u00e9penses)<\/h4>\n            <div class=\"value\" id=\"netSavings\">\u2014<\/div>\n            <div class=\"bar\"><span id=\"savingsBar\"><\/span><\/div>\n            <div class=\"muted\">Taux d\u2019\u00e9pargne&nbsp;: <span id=\"savingsRate\">\u2014<\/span><\/div>\n          <\/div>\n          <div class=\"metric\">\n            <h4>Taux d\u2019endettement (DTI)<\/h4>\n            <div class=\"value\" id=\"dti\">\u2014<\/div>\n            <div class=\"bar warn\"><span id=\"dtiBar\"><\/span><\/div>\n            <div class=\"muted\">Mensualit\u00e9s \/ Revenus<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"card\">\n        <h3>Diversification des revenus<\/h3>\n        <p class=\"hint\">Indice de concentration (HHI) bas\u00e9 sur la part de chaque source dans vos revenus.<\/p>\n        <div class=\"metric\">\n          <h4>Indice HHI<\/h4>\n          <div class=\"value\" id=\"hhi\">\u2014<\/div>\n          <div class=\"bar warn\"><span id=\"hhiBar\"><\/span><\/div>\n          <div class=\"muted\">Interpr\u00e9tation&nbsp;: <span id=\"hhiLabel\">\u2014<\/span><\/div>\n        <\/div>\n        <div class=\"sep\"><\/div>\n        <div id=\"incomeChips\" class=\"stack\"><\/div>\n      <\/div>\n\n      <div class=\"card\">\n        <h3>Fonds d\u2019urgence<\/h3>\n        <div class=\"metric\">\n          <h4>Couverture actuelle<\/h4>\n          <div class=\"value\" id=\"efMonths\">\u2014<\/div>\n          <div class=\"bar\"><span id=\"efBar\"><\/span><\/div>\n          <div class=\"muted\">Mois de d\u00e9penses essentielles couverts. Objectif&nbsp;: <span id=\"efTargetLabel\">6<\/span> mois<\/div>\n        <\/div>\n        <div class=\"sep\"><\/div>\n        <p class=\"footnote\">Pour renforcer votre r\u00e9silience, augmentez votre \u00e9pargne jusqu\u2019\u00e0 atteindre l\u2019objectif. Une bonne pratique consiste \u00e0 automatiser un virement d\u00e8s que vos revenus tombent.<\/p>\n      <\/div>\n    <\/section>\n\n    <footer class=\"wrap\" style=\"max-width:1200px; margin:20px auto 40px; color:#98a5c4; font-size:.9rem;\">\n      <div class=\"card\">\n        <strong>Note :<\/strong> ce tableau est un outil p\u00e9dagogique d\u2019auto\u00e9valuation. Il ne remplace pas un conseil financier personnalis\u00e9.\n      <\/div>\n    <\/footer>\n  <\/div>\n\n<script>\n(function(){\n  const qs = sel => document.querySelector(sel);\n  const qsa = sel => Array.from(document.querySelectorAll(sel));\n  const fmt = (v) => {\n    const sym = getCurrencySymbol();\n    if(isNaN(v)) return '\u2014';\n    return new Intl.NumberFormat('fr-FR', {maximumFractionDigits: 0}).format(v) + ' ' + sym;\n  };\n  const fmtPct = (x) => isFinite(x) ? (x*100).toFixed(0)+' %' : '\u2014';\n\n  \/* Currency *\/\n  const currencySel = qs('#currency');\n  const customCur = qs('#customCurrency');\n  function getCurrencySymbol(){\n    const v = currencySel.value;\n    if(v === 'custom') return customCur.value || '\u00a4';\n    return v;\n  }\n  currencySel.addEventListener('change', ()=>{\n    customCur.style.display = currencySel.value==='custom' ? 'inline-block' : 'none';\n    update();\n  });\n  customCur.addEventListener('input', update);\n\n  \/* Dynamic Rows *\/\n  const incomeList = qs('#incomeList');\n  const expenseList = qs('#expenseList');\n  const debtsList = qs('#debtsList');\n\n  function incomeRow(data={}){\n    const row = document.createElement('div');\n    row.className = 'card';\n    row.style.padding = '12px';\n    row.innerHTML = `\n      <div class=\"row ${data.type==='saisonnier'?'saisonnier':''}\">\n        <input type=\"text\" placeholder=\"Ex : Salaire, Plantations, Forever\u2026\" value=\"${data.name||''}\" aria-label=\"Nom de la source\" \/>\n        <select aria-label=\"Type\">\n          <option value=\"stable\"${data.type==='stable'?' selected':''}>Mensuel (stable)<\/option>\n          <option value=\"variable\"${data.type==='variable'?' selected':''}>Mensuel (variable)<\/option>\n          <option value=\"saisonnier\"${data.type==='saisonnier'?' selected':''}>Saisonnier (annuel)<\/option>\n        <\/select>\n        <input type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Montant\" value=\"${data.amount||''}\" aria-label=\"Montant\" \/>\n        <button class=\"del\" aria-label=\"Supprimer la source\">\u2715<\/button>\n      <\/div>\n      <div class=\"saison-extra\" ${data.type==='saisonnier'?'style=\"display:grid\"':''}>\n        <input type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Total annuel (saisonnier)\" value=\"${data.annual||''}\" aria-label=\"Total annuel\" \/>\n        <input type=\"number\" min=\"1\" step=\"1\" placeholder=\"Mois actifs (ex : 4)\" value=\"${data.months||''}\" aria-label=\"Mois actifs\" \/>\n      <\/div>\n    `;\n    \/\/ events\n    const sel = row.querySelector('select');\n    const extra = row.querySelector('.saison-extra');\n    sel.addEventListener('change', ()=>{\n      if(sel.value==='saisonnier'){ extra.style.display='grid'; row.querySelector('.row').classList.add('saisonnier'); }\n      else { extra.style.display='none'; row.querySelector('.row').classList.remove('saisonnier'); }\n      update();\n    });\n    row.addEventListener('input', update);\n    row.querySelector('.del').addEventListener('click', ()=>{ row.remove(); update(); });\n    return row;\n  }\n\n  function expenseRow(data={}){\n    const row = document.createElement('div');\n    row.className='card';\n    row.style.padding='12px';\n    row.innerHTML=`\n      <div class=\"row\">\n        <input type=\"text\" placeholder=\"Ex : Loyer, Nourriture, Transport, \u00c9ducation\u2026\" value=\"${data.name||''}\" aria-label=\"Nom de la d\u00e9pense\" \/>\n        <select aria-label=\"P\u00e9riodicit\u00e9\">\n          <option value=\"mensuel\"${data.freq!=='annuel'?' selected':''}>Mensuelle<\/option>\n          <option value=\"annuel\"${data.freq==='annuel'?' selected':''}>Annuelle<\/option>\n        <\/select>\n        <input type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Montant\" value=\"${data.amount||''}\" aria-label=\"Montant\" \/>\n        <button class=\"del\" aria-label=\"Supprimer la d\u00e9pense\">\u2715<\/button>\n      <\/div>`;\n    row.addEventListener('input', update);\n    row.querySelector('.del').addEventListener('click', ()=>{ row.remove(); update(); });\n    return row;\n  }\n\n  function debtRow(data={}){\n    const row = document.createElement('div');\n    row.className='card';\n    row.style.padding='12px';\n    row.innerHTML=`\n      <div class=\"row\">\n        <input type=\"text\" placeholder=\"Ex : Pr\u00eat immo, pr\u00eat conso, intrants agricoles\u2026\" value=\"${data.name||''}\" aria-label=\"Nom de la dette\" \/>\n        <input type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Mensualit\u00e9\" value=\"${data.monthly||''}\" aria-label=\"Mensualit\u00e9\" \/>\n        <input type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Solde restant\" value=\"${data.balance||''}\" aria-label=\"Solde restant\" \/>\n        <button class=\"del\" aria-label=\"Supprimer la dette\">\u2715<\/button>\n      <\/div>`;\n    row.addEventListener('input', update);\n    row.querySelector('.del').addEventListener('click', ()=>{ row.remove(); update(); });\n    return row;\n  }\n\n  \/\/ Defaults\n  const defaults = {\n    incomes: [\n      {name:'Salaire enseignement', type:'stable', amount:0},\n      {name:'Plantations (moyenne)', type:'variable', amount:0},\n      {name:'Boutique', type:'variable', amount:0},\n      {name:'Forever \/ R\u00e9seau', type:'variable', amount:0}\n    ],\n    expenses: [\n      {name:'Logement (loyer\/cr\u00e9dit)', freq:'mensuel', amount:0},\n      {name:'Nourriture', freq:'mensuel', amount:0},\n      {name:'Transport', freq:'mensuel', amount:0},\n      {name:'\u00c9ducation (scolarit\u00e9)', freq:'mensuel', amount:0},\n      {name:'Sant\u00e9', freq:'mensuel', amount:0},\n      {name:'Intrants agricoles', freq:'mensuel', amount:0}\n    ],\n    debts: [\n      {name:'Pr\u00eat conso', monthly:0, balance:0}\n    ],\n    savings: 0,\n    efTarget: 6\n  };\n\n  \/\/ Hydrate defaults\n  function loadDefaults(){\n    incomeList.innerHTML='';\n    expenseList.innerHTML='';\n    debtsList.innerHTML='';\n    defaults.incomes.forEach(d=>incomeList.appendChild(incomeRow(d)));\n    defaults.expenses.forEach(d=>expenseList.appendChild(expenseRow(d)));\n    defaults.debts.forEach(d=>debtsList.appendChild(debtRow(d)));\n    qs('#savings').value = defaults.savings;\n    qs('#efTarget').value = defaults.efTarget;\n  }\n  loadDefaults();\n\n  \/\/ Add buttons\n  qs('#addIncome').addEventListener('click', ()=> incomeList.appendChild(incomeRow({type:'variable'})));\n  qs('#addExpense').addEventListener('click', ()=> expenseList.appendChild(expenseRow({freq:'mensuel'})));\n  qs('#addDebt').addEventListener('click', ()=> debtsList.appendChild(debtRow()));\n\n  \/\/ Calculations\n  function num(v){ const n = parseFloat(v); return isNaN(n)?0:n; }\n\n  function gather(){\n    const incomes = [];\n    incomeList.querySelectorAll('.card').forEach(card=>{\n      const [nameEl, typeEl, amtEl] = card.querySelectorAll('.row input, .row select');\n      const extra = card.querySelector('.saison-extra');\n      let type = typeEl.value;\n      let amount = num(amtEl.value);\n      let annual=0, months=12;\n      if(type==='saisonnier' && extra){\n        const [annEl, moEl] = extra.querySelectorAll('input');\n        annual = num(annEl.value);\n        months = Math.max(1, Math.round(num(moEl.value)||12));\n        \/\/ Convert seasonal total to monthly average over 12 months\n        amount = annual \/ 12;\n      }\n      incomes.push({\n        name: nameEl.value.trim()||'Source',\n        type, amount, annual, months\n      });\n    });\n\n    const expenses = [];\n    expenseList.querySelectorAll('.card').forEach(card=>{\n      const [nameEl, freqEl, amtEl] = card.querySelectorAll('.row input, .row select');\n      const freq = freqEl.value;\n      let amount = num(amtEl.value);\n      const monthly = (freq==='annuel') ? amount\/12 : amount;\n      expenses.push({name:nameEl.value.trim()||'D\u00e9pense', freq, amount, monthly});\n    });\n\n    const debts = [];\n    debtsList.querySelectorAll('.card').forEach(card=>{\n      const [nameEl, monEl, balEl] = card.querySelectorAll('.row input');\n      debts.push({name:nameEl.value.trim()||'Dette', monthly:num(monEl.value), balance:num(balEl.value)});\n    });\n\n    const savings = num(qs('#savings').value);\n    const efTarget = Math.max(1, Math.round(num(qs('#efTarget').value)||6));\n\n    return {incomes, expenses, debts, savings, efTarget};\n  }\n\n  function compute(){\n    const data = gather();\n    const totalIncome = data.incomes.reduce((s,i)=> s + i.amount, 0);\n    const stableIncome = data.incomes.filter(i=>i.type==='stable').reduce((s,i)=>s+i.amount,0);\n    const variableIncome = totalIncome - stableIncome;\n\n    const totalExpense = data.expenses.reduce((s,e)=> s + e.monthly, 0);\n    const debtMonthly = data.debts.reduce((s,d)=> s + d.monthly, 0);\n\n    const net = totalIncome - totalExpense;\n    const rate = totalIncome>0 ? net\/totalIncome : 0;\n\n    const dti = totalIncome>0 ? (debtMonthly\/totalIncome) : 0;\n\n    \/\/ Emergency fund: months covered by savings over monthly essential expenses\n    \/\/ We'll use totalExpense as proxy; you may tune to \"essentielles\".\n    const efMonths = totalExpense>0 ? (data.savings \/ totalExpense) : 0;\n\n    \/\/ Diversification: HHI\n    let hhi = 0;\n    if(totalIncome>0){\n      data.incomes.forEach(i=>{\n        const share = i.amount\/totalIncome;\n        hhi += share*share;\n      });\n    }\n    \/\/ Labels for HHI\n    let hhiLabel = '\u2014';\n    let hhiPct = 0;\n    if(totalIncome>0){\n      if(hhi>0.50) hhiLabel = 'Tr\u00e8s concentr\u00e9 (d\u00e9pendance \u00e9lev\u00e9e)';\n      else if(hhi>0.33) hhiLabel = 'Concentr\u00e9';\n      else if(hhi>0.20) hhiLabel = 'Moyennement diversifi\u00e9';\n      else hhiLabel = 'Bien diversifi\u00e9';\n      hhiPct = Math.min(1, hhi); \/\/ for bar\n    }\n\n    return {\n      data, totalIncome, stableIncome, variableIncome, totalExpense, debtMonthly,\n      net, rate, dti, efMonths, hhi, hhiLabel, hhiPct\n    };\n  }\n\n  function setBar(el, val){\n    el.style.width = Math.max(0, Math.min(100, val*100)).toFixed(0)+'%';\n  }\n\n  function update(){\n    const {\n      data, totalIncome, stableIncome, variableIncome, totalExpense, debtMonthly,\n      net, rate, dti, efMonths, hhi, hhiLabel, hhiPct\n    } = compute();\n\n    qs('#totalIncome').textContent = fmt(totalIncome);\n    const stabPct = totalIncome>0 ? stableIncome\/totalIncome : 0;\n    const varPct = totalIncome>0 ? variableIncome\/totalIncome : 0;\n    qs('#stablePct').textContent = fmtPct(stabPct);\n    qs('#variablePct').textContent = fmtPct(varPct);\n\n    qs('#totalExpense').textContent = fmt(totalExpense);\n    qs('#debtOut').textContent = fmt(debtMonthly);\n\n    qs('#netSavings').textContent = fmt(net);\n    qs('#savingsRate').textContent = fmtPct(rate);\n    setBar(qs('#savingsBar'), Math.max(0, Math.min(1, rate)));\n\n    qs('#dti').textContent = fmtPct(dti);\n    \/\/ For DTI, map 0%..50% to 0..1 bar (warn)\n    setBar(qs('#dtiBar'), Math.min(1, dti\/0.5));\n\n    \/\/ Emergency fund\n    qs('#efTargetLabel').textContent = data.efTarget;\n    qs('#efMonths').textContent = isFinite(efMonths)? efMonths.toFixed(1)+' mois' : '\u2014';\n    setBar(qs('#efBar'), Math.min(1, efMonths \/ data.efTarget));\n\n    \/\/ HHI\n    qs('#hhi').textContent = totalIncome>0 ? hhi.toFixed(2) : '\u2014';\n    qs('#hhiLabel').textContent = hhiLabel;\n    setBar(qs('#hhiBar'), hhiPct);\n\n    \/\/ Chips for income shares\n    const chips = qs('#incomeChips');\n    chips.innerHTML='';\n    if(totalIncome>0){\n      data.incomes\n        .filter(i=>i.amount>0)\n        .sort((a,b)=>(b.amount-a.amount))\n        .forEach(i=>{\n          const chip = document.createElement('span');\n          const share = i.amount\/totalIncome;\n          chip.className='tag';\n          chip.textContent = `${i.name || 'Source'} \u2022 ${fmtPct(share)}`;\n          chips.appendChild(chip);\n        });\n    }\n  }\n  update();\n\n  \/\/ Save \/ Load \/ Reset \/ Print\n  function snapshot(){\n    const {incomes, expenses, debts, savings, efTarget} = gather();\n    return {\n      version:1,\n      currency: currencySel.value,\n      customCurrency: customCur.value,\n      incomes, expenses, debts, savings, efTarget\n    };\n  }\n  function restore(state){\n    incomeList.innerHTML=''; expenseList.innerHTML=''; debtsList.innerHTML='';\n    state.incomes.forEach(d=>incomeList.appendChild(incomeRow(d)));\n    state.expenses.forEach(d=>expenseList.appendChild(expenseRow(d)));\n    state.debts.forEach(d=>debtsList.appendChild(debtRow(d)));\n    qs('#savings').value = state.savings||0;\n    qs('#efTarget').value = state.efTarget||6;\n    currencySel.value = state.currency || '\u20ac';\n    customCur.value = state.customCurrency || '';\n    customCur.style.display = currencySel.value==='custom' ? 'inline-block' : 'none';\n    update();\n  }\n\n  qs('#saveBtn').addEventListener('click', ()=>{\n    localStorage.setItem('autoEvalFinance', JSON.stringify(snapshot()));\n    alert('Donn\u00e9es enregistr\u00e9es localement \u2705');\n  });\n  qs('#loadBtn').addEventListener('click', ()=>{\n    const raw = localStorage.getItem('autoEvalFinance');\n    if(!raw){ alert('Aucune sauvegarde trouv\u00e9e.'); return; }\n    try{ restore(JSON.parse(raw)); }catch(e){ alert('Impossible de charger les donn\u00e9es.'); }\n  });\n  qs('#resetBtn').addEventListener('click', ()=>{\n    if(confirm('R\u00e9initialiser tous les champs ?')){ loadDefaults(); update(); }\n  });\n  qs('#printBtn').addEventListener('click', ()=> window.print());\n\n  \/\/ Live updates\n  document.body.addEventListener('input', (e)=>{\n    \/\/ throttle could be added; not necessary here\n    update();\n  });\n})();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n\n<h2 class=\"wp-block-heading\" id=\"enseigner-par-passion-pas-par-obligation-le-plan-de-3-mois-pour-construire-votre-liberte\">Enseigner par passion, pas par obligation : le plan de 3 mois pour construire votre libert\u00e9<\/h2>\n\n\n\n<p class=\"has-large-font-size\"><a href=\"https:\/\/santereusssite.my.canva.site\/ppe-enseignant\" target=\"_blank\" rel=\"noopener nofollow ugc\" title=\"\">Script complet de la pr\u00e9sentation<\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Enseigner par passion, pas par obligation : le plan de 3 mois pour construire votre libert\u00e9\" width=\"1778\" height=\"1000\" src=\"https:\/\/www.youtube.com\/embed\/MA8ZUjDUsq4?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"lire-l-article-complet\">Lire l&rsquo;article complet<\/h2>\n\n\n\n<p class=\"has-x-large-font-size\"><a href=\"https:\/\/protocole-csr.com\/?p=1339\" target=\"_blank\" rel=\"noopener nofollow ugc\" title=\"\">Lien d&rsquo;acc\u00e8s direct<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fiche d\u2019auto\u00e9valuation financi\u00e8re \u2013 Revenus &#038; D\u00e9penses Fiche d\u2019auto\u00e9valuation financi\u00e8re Faites le point sur vos sources de revenu, vos d\u00e9penses et vos engagements. Obtenez des indicateurs cl\u00e9s : taux d\u2019\u00e9pargne, charge de dette, fonds d\u2019urgence, et indice de diversification de vos revenus. Devise&nbsp; \u20ac (EUR)FCFA$ (USD)Personnalis\u00e9e\u2026 \ud83d\udcbe Enregistrer \ud83d\udcc2 Charger \ud83e\uddf9 R\u00e9initialiser \ud83d\udda8\ufe0f Exporter \/ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"template":"","edd-categories":[],"edd-tags":[],"class_list":["post-1345","download","type-download","status-publish","hentry","edd-download"],"blocksy_meta":[],"aioseo_notices":[],"acf":[],"_links":{"self":[{"href":"https:\/\/protocole-csr.com\/index.php?rest_route=\/wp\/v2\/edd-downloads\/1345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/protocole-csr.com\/index.php?rest_route=\/wp\/v2\/edd-downloads"}],"about":[{"href":"https:\/\/protocole-csr.com\/index.php?rest_route=\/wp\/v2\/types\/download"}],"author":[{"embeddable":true,"href":"https:\/\/protocole-csr.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"version-history":[{"count":2,"href":"https:\/\/protocole-csr.com\/index.php?rest_route=\/wp\/v2\/edd-downloads\/1345\/revisions"}],"predecessor-version":[{"id":1351,"href":"https:\/\/protocole-csr.com\/index.php?rest_route=\/wp\/v2\/edd-downloads\/1345\/revisions\/1351"}],"wp:attachment":[{"href":"https:\/\/protocole-csr.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1345"}],"wp:term":[{"taxonomy":"download_category","embeddable":true,"href":"https:\/\/protocole-csr.com\/index.php?rest_route=%2Fwp%2Fv2%2Fedd-categories&post=1345"},{"taxonomy":"download_tag","embeddable":true,"href":"https:\/\/protocole-csr.com\/index.php?rest_route=%2Fwp%2Fv2%2Fedd-tags&post=1345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}