{"id":494,"date":"2026-04-27T13:59:00","date_gmt":"2026-04-27T11:59:00","guid":{"rendered":"https:\/\/adelouvain.be\/?p=494"},"modified":"2026-04-27T16:24:14","modified_gmt":"2026-04-27T14:24:14","slug":"situation-budgetaire-adel","status":"publish","type":"post","link":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/","title":{"rendered":"Situation budg\u00e9taire ADEL"},"content":{"rendered":"\n\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n\n\n\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.0\">\n  <title>Bilan Comptable 2022\u20132025<\/title>\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Open+Sans:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\">\n  <script src=\"https:\/\/cdn.plot.ly\/plotly-2.35.2.min.js\" crossorigin=\"anonymous\"><\/script>\n  <style>\n    :root {\n      --primary: #814BE7;\n      --primary-light: #C17BFD;\n      --bg: #F7F7F7;\n      --card-bg: #FFFFFF;\n      --text: #1F1F24;\n      --text-muted: #6E7191;\n      --border: #E2E4ED;\n      --success: #34C563;\n      --danger: #E73B4F;\n      --warning: #D4A740;\n      --ucm-color: #FF6B35;\n      --ucm-bg: rgba(255,107,53,0.10);\n      --radius: 12px;\n      --shadow: 0 0 0 1px var(--border), 0 2px 8px rgba(7,2,23,0.05);\n      --shadow-hover: 0 0 0 1px var(--border), 0 4px 16px rgba(7,2,23,0.10);\n      --font: 'Open Sans', system-ui, -apple-system, sans-serif;\n    }\n    @media (prefers-color-scheme: dark) {\n      :root:not(.light) {\n        --bg: #1E2235;\n        --card-bg: #2D3148;\n        --text: #E2E4ED;\n        --text-muted: #A2A7BD;\n        --border: #484D66;\n        --shadow: 0 0 0 1px var(--border), 0 2px 8px rgba(7,2,23,0.15);\n        --shadow-hover: 0 0 0 1px var(--border), 0 4px 16px rgba(7,2,23,0.25);\n        --ucm-bg: rgba(255,107,53,0.15);\n      }\n    }\n    :root.dark {\n      --bg: #1E2235;\n      --card-bg: #2D3148;\n      --text: #E2E4ED;\n      --text-muted: #A2A7BD;\n      --border: #484D66;\n      --shadow: 0 0 0 1px var(--border), 0 2px 8px rgba(7,2,23,0.15);\n      --shadow-hover: 0 0 0 1px var(--border), 0 4px 16px rgba(7,2,23,0.25);\n      --ucm-bg: rgba(255,107,53,0.15);\n    }\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    body {\n      font-family: var(--font);\n      background: var(--bg);\n      color: var(--text);\n      line-height: 1.5;\n      -webkit-font-smoothing: antialiased;\n    }\n    body::before {\n      content: '';\n      position: fixed;\n      top: 0; left: 0; right: 0;\n      height: 60vh;\n      background: radial-gradient(ellipse 60% 50% at 50% 0%, rgba(91,108,249,0.06), transparent 70%);\n      pointer-events: none;\n      z-index: 0;\n    }\n    .dashboard { max-width: 1400px; margin: 0 auto; padding: 24px; position: relative; z-index: 1; }\n\n    \/* Header *\/\n    .header {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      text-align: center;\n      gap: 12px;\n      margin-bottom: 32px;\n      padding-bottom: 24px;\n      border-bottom: 1px solid var(--border);\n      position: relative;\n    }\n    .header .logo { height: 32px; width: auto; }\n    .title {\n      font-size: 1.75rem;\n      font-weight: 700;\n      line-height: 1.2;\n      background: linear-gradient(135deg, var(--text) 0%, var(--primary) 100%);\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n      background-clip: text;\n    }\n    .subtitle {\n      font-size: 0.85rem;\n      color: var(--text-muted);\n      font-weight: 500;\n      letter-spacing: 0.02em;\n    }\n\n    \/* Grid *\/\n    .grid {\n      display: grid;\n      grid-template-columns: repeat(12, 1fr);\n      gap: 20px;\n    }\n    .col-2  { grid-column: span 2; }\n    .col-3  { grid-column: span 3; }\n    .col-4  { grid-column: span 4; }\n    .col-6  { grid-column: span 6; }\n    .col-8  { grid-column: span 8; }\n    .col-12 { grid-column: span 12; }\n    @media (max-width: 767.98px) {\n      .col-2, .col-3, .col-4, .col-6, .col-8, .col-12 { grid-column: span 12; }\n      .grid { gap: 12px; }\n      .dashboard { padding: 16px; }\n      .kpi-value { font-size: 1.5rem !important; }\n      .title { font-size: 1.35rem; }\n      .chart-container { min-height: 260px; }\n    }\n\n    \/* Card base *\/\n    .card, .kpi-card, .chart-card, .text-card, .table-card {\n      background: var(--card-bg);\n      border-radius: var(--radius);\n      padding: 20px;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\n    }\n    .card:hover, .kpi-card:hover, .chart-card:hover, .text-card:hover, .table-card:hover {\n      transform: translateY(-1px);\n      box-shadow: var(--shadow-hover);\n    }\n    .card::before, .kpi-card::before, .chart-card::before, .text-card::before, .table-card::before {\n      content: '';\n      position: absolute;\n      top: 0; left: 0; right: 0;\n      height: 2px;\n      background: linear-gradient(90deg, transparent, var(--primary-light), transparent);\n      opacity: 0.6;\n    }\n\n    \/* UCM highlight card *\/\n    .kpi-card.ucm-highlight {\n      border: 1.5px solid var(--ucm-color);\n      background: var(--ucm-bg);\n    }\n    .kpi-card.ucm-highlight::before {\n      background: linear-gradient(90deg, transparent, var(--ucm-color), transparent);\n      opacity: 0.8;\n    }\n\n    \/* KPI card *\/\n    .kpi-card { padding: 24px; }\n    .kpi-label { font-size: 0.8rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.03em; margin-bottom: 6px; }\n    .kpi-value { font-size: 2rem; font-weight: 700; color: var(--text); line-height: 1.2; }\n    .kpi-delta {\n      display: inline-block;\n      font-size: 0.75rem;\n      font-weight: 600;\n      margin-top: 8px;\n      padding: 2px 8px;\n      border-radius: 20px;\n    }\n    .kpi-delta.positive { color: var(--success); background: rgba(52,197,99,0.1); }\n    .kpi-delta.negative { color: var(--danger); background: rgba(231,59,79,0.1); }\n    .kpi-delta.neutral { color: var(--text-muted); background: rgba(110,113,145,0.1); }\n    .kpi-delta.ucm { color: var(--ucm-color); background: rgba(255,107,53,0.12); }\n\n    \/* Chart card *\/\n    .card-title { font-size: 1rem; font-weight: 600; color: var(--text); margin-bottom: 4px; }\n    .card-subtitle { font-size: 0.78rem; color: var(--text-muted); margin-bottom: 14px; }\n    .chart-container { min-height: 340px; width: 100%; }\n    .chart-container.tall { min-height: 420px; }\n\n    \/* Text card *\/\n    .text-card p { font-size: 0.9rem; color: var(--text); margin-bottom: 8px; line-height: 1.6; }\n    .text-card p:last-child { margin-bottom: 0; }\n\n    \/* Section label *\/\n    .section-label {\n      grid-column: span 12;\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      margin-top: 8px;\n    }\n    .section-label-text {\n      font-size: 0.75rem;\n      font-weight: 700;\n      letter-spacing: 0.08em;\n      text-transform: uppercase;\n      color: var(--text-muted);\n      white-space: nowrap;\n    }\n    .section-label-line { flex: 1; height: 1px; background: var(--border); }\n\n    \/* Table card *\/\n    .table-card { overflow-x: auto; padding: 20px 0; }\n    .table-card .card-title { padding: 0 20px 4px; }\n    .table-card .card-subtitle { padding: 0 20px 10px; }\n    .table-card table { width: 100%; border-collapse: collapse; font-size: 0.82rem; }\n    .table-card th {\n      text-align: left; padding: 10px 14px;\n      border-bottom: 2px solid var(--border);\n      font-weight: 600; color: var(--text);\n      white-space: nowrap;\n      background: rgba(91,108,249,0.03);\n    }\n    .table-card td { padding: 9px 14px; border-bottom: 1px solid var(--border); color: var(--text); }\n    .table-card tr:last-child td { border-bottom: none; }\n    .table-card tbody tr:hover td { background: rgba(91,108,249,0.05); }\n    .table-card td.num { text-align: right; font-variant-numeric: tabular-nums; font-weight: 500; }\n    .table-card td.positive { color: var(--success); font-weight: 600; }\n    .table-card td.negative { color: var(--danger); font-weight: 600; }\n    .table-card td.total-row { font-weight: 700; background: rgba(91,108,249,0.06); }\n    .table-card .ucm-row td { background: var(--ucm-bg); }\n    .table-card .ucm-row td:first-child { border-left: 3px solid var(--ucm-color); }\n    .ucm-badge {\n      display: inline-block;\n      font-size: 0.65rem;\n      font-weight: 700;\n      padding: 1px 6px;\n      border-radius: 10px;\n      background: var(--ucm-color);\n      color: #fff;\n      margin-left: 6px;\n      vertical-align: middle;\n      letter-spacing: 0.04em;\n    }\n\n    \/* Theme toggle *\/\n    .theme-toggle {\n      position: absolute;\n      top: 24px; right: 0;\n      background: var(--card-bg);\n      border: 1px solid var(--border);\n      border-radius: 8px;\n      padding: 6px 10px;\n      cursor: pointer;\n      color: var(--text-muted);\n      font-size: 1rem;\n      line-height: 1;\n      transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;\n      display: flex; align-items: center; gap: 4px;\n    }\n    .theme-toggle:hover { color: var(--text); border-color: var(--primary-light); }\n    .theme-toggle .icon-sun, .theme-toggle .icon-moon { display: none; }\n    .theme-toggle .icon-sun { display: inline; }\n    :root.dark .theme-toggle .icon-sun { display: none; }\n    :root.dark .theme-toggle .icon-moon { display: inline; }\n    @media (prefers-color-scheme: dark) {\n      :root:not(.light) .theme-toggle .icon-sun { display: none; }\n      :root:not(.light) .theme-toggle .icon-moon { display: inline; }\n    }\n\n    \/* Footer *\/\n    .footer {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 8px;\n      margin-top: 40px;\n      padding-top: 20px;\n      border-top: 1px solid var(--border);\n      font-size: 0.75rem;\n      color: var(--text-muted);\n    }\n    .footer .logo-sm { height: 18px; width: auto; }\n\n    \/* Filter pills *\/\n    .filter-row {\n      display: flex;\n      gap: 8px;\n      flex-wrap: wrap;\n      margin-bottom: 14px;\n    }\n    .pill {\n      font-size: 0.75rem;\n      font-weight: 600;\n      padding: 4px 12px;\n      border-radius: 20px;\n      border: 1.5px solid var(--border);\n      background: transparent;\n      color: var(--text-muted);\n      cursor: pointer;\n      transition: all 0.15s ease;\n      font-family: var(--font);\n    }\n    .pill:hover { border-color: var(--primary-light); color: var(--primary); }\n    .pill.active { background: var(--primary); border-color: var(--primary); color: #fff; }\n  <\/style>\n<\/head>\n<body>\n<div class=\"dashboard\">\n  <header class=\"header\">\n    <button class=\"theme-toggle\" onclick=\"toggleTheme()\" aria-label=\"Basculer le mode sombre\">\n      <span class=\"icon-sun\">&#9788;<\/span>\n      <span class=\"icon-moon\">&#9790;<\/span>\n    <\/button>\n    <img decoding=\"async\" class=\"logo\" src=\"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg\" alt=\"Energent logo\">\n    <div>\n      <h1 class=\"title\">Bilan Comptable 2022\u20132025<\/h1>\n      <p class=\"subtitle\">Analyse d\u00e9taill\u00e9e des entr\u00e9es et sorties &bull; Compte BE55 2710 3710 3744<\/p>\n    <\/div>\n  <\/header>\n\n  <!-- ===== KPI ROW ===== -->\n  <div class=\"grid\">\n    <div class=\"section-label\">\n      <span class=\"section-label-text\">Vue d&#8217;ensemble<\/span>\n      <div class=\"section-label-line\"><\/div>\n    <\/div>\n\n    <div class=\"col-3\">\n      <div class=\"kpi-card\">\n        <div class=\"kpi-label\">Total Rentr\u00e9es<\/div>\n        <div class=\"kpi-value\" id=\"kpi-income\">93 863 \u20ac<\/div>\n        <div class=\"kpi-delta positive\">2022 \u2013 2025<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"col-3\">\n      <div class=\"kpi-card\">\n        <div class=\"kpi-label\">Total D\u00e9penses<\/div>\n        <div class=\"kpi-value\" id=\"kpi-expense\">111 861 \u20ac<\/div>\n        <div class=\"kpi-delta negative\">2022 \u2013 2025<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"col-3\">\n      <div class=\"kpi-card\">\n        <div class=\"kpi-label\">Solde Net Cumul\u00e9<\/div>\n        <div class=\"kpi-value\" id=\"kpi-net\">-17 998 \u20ac<\/div>\n        <div class=\"kpi-delta negative\">D\u00e9ficit global<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"col-3\">\n      <div class=\"kpi-card ucm-highlight\">\n        <div class=\"kpi-label\">Charges Sociales <span class=\"ucm-badge\">UCM\/ONSS<\/span><\/div>\n        <div class=\"kpi-value\" id=\"kpi-ucm\">26 464 \u20ac<\/div>\n        <div class=\"kpi-delta ucm\">23.7 % des d\u00e9penses<\/div>\n      <\/div>\n    <\/div>\n\n    <!-- KPI row 2: per year -->\n    <div class=\"col-3\">\n      <div class=\"kpi-card\">\n        <div class=\"kpi-label\">Solde 2022<\/div>\n        <div class=\"kpi-value\">-85 \u20ac<\/div>\n        <div class=\"kpi-delta negative\">Quasi \u00e9quilibr\u00e9<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"col-3\">\n      <div class=\"kpi-card\">\n        <div class=\"kpi-label\">Solde 2023<\/div>\n        <div class=\"kpi-value\">-2 209 \u20ac<\/div>\n        <div class=\"kpi-delta negative\">D\u00e9ficit mod\u00e9r\u00e9<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"col-3\">\n      <div class=\"kpi-card\">\n        <div class=\"kpi-label\">Solde 2024<\/div>\n        <div class=\"kpi-value\">-7 012 \u20ac<\/div>\n        <div class=\"kpi-delta negative\">D\u00e9ficit croissant<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"col-3\">\n      <div class=\"kpi-card\">\n        <div class=\"kpi-label\">Solde 2025 (partiel)<\/div>\n        <div class=\"kpi-value\">-8 692 \u20ac<\/div>\n        <div class=\"kpi-delta negative\">D\u00e9ficit en hausse<\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ===== CHART 1: Rentr\u00e9es vs D\u00e9penses par ann\u00e9e ===== -->\n    <div class=\"section-label\">\n      <span class=\"section-label-text\">Flux annuels<\/span>\n      <div class=\"section-label-line\"><\/div>\n    <\/div>\n\n    <div class=\"col-12\">\n      <div class=\"chart-card\">\n        <div class=\"card-title\">Rentr\u00e9es vs D\u00e9penses par ann\u00e9e<\/div>\n        <div class=\"card-subtitle\">Comparaison des flux entrants et sortants \u2014 le solde net est affich\u00e9 en ligne<\/div>\n        <div class=\"chart-container\" id=\"chart-annual\"><\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ===== CHART 2: R\u00e9partition des d\u00e9penses ===== -->\n    <div class=\"section-label\">\n      <span class=\"section-label-text\">Structure des d\u00e9penses<\/span>\n      <div class=\"section-label-line\"><\/div>\n    <\/div>\n\n    <div class=\"col-12\">\n      <div class=\"chart-card\">\n        <div class=\"card-title\">D\u00e9penses par cat\u00e9gorie et par ann\u00e9e<\/div>\n        <div class=\"card-subtitle\">Les <span style=\"color:var(--ucm-color); font-weight:700;\">Charges Sociales UCM\/ONSS<\/span> sont mises en \u00e9vidence<\/div>\n        <div class=\"chart-container tall\" id=\"chart-cat-year\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"col-12\">\n      <div class=\"chart-card\">\n        <div class=\"card-title\">R\u00e9partition globale des d\u00e9penses 2022\u20132025<\/div>\n        <div class=\"card-subtitle\">Part de chaque cat\u00e9gorie sur la p\u00e9riode compl\u00e8te<\/div>\n        <div class=\"filter-row\" id=\"pie-filter\">\n          <button class=\"pill active\" onclick=\"showPie('depenses')\">D\u00e9penses<\/button>\n          <button class=\"pill\" onclick=\"showPie('rentrees')\">Rentr\u00e9es<\/button>\n        <\/div>\n        <div class=\"chart-container\" id=\"chart-pie\"><\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ===== CHART 3: Tendance mensuelle ===== -->\n    <div class=\"section-label\">\n      <span class=\"section-label-text\">Tendance mensuelle<\/span>\n      <div class=\"section-label-line\"><\/div>\n    <\/div>\n\n    <div class=\"col-12\">\n      <div class=\"chart-card\">\n        <div class=\"card-title\">Flux mensuels \u2014 Rentr\u00e9es &amp; D\u00e9penses<\/div>\n        <div class=\"card-subtitle\">\u00c9volution mois par mois sur toute la p\u00e9riode<\/div>\n        <div class=\"chart-container tall\" id=\"chart-monthly\"><\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ===== CHART 4: Charges sociales focus ===== -->\n    <div class=\"section-label\">\n      <span class=\"section-label-text\">Focus UCM \/ ONSS<\/span>\n      <div class=\"section-label-line\"><\/div>\n    <\/div>\n\n    <div class=\"col-12\">\n      <div class=\"chart-card\">\n        <div class=\"card-title\">\u00c9volution des Charges Sociales (UCM\/ONSS) par ann\u00e9e<\/div>\n        <div class=\"card-subtitle\">Montant annuel et proportion des charges sociales dans les d\u00e9penses totales<\/div>\n        <div class=\"chart-container\" id=\"chart-ucm\"><\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ===== TABLE: Bilan Comptable D\u00e9taill\u00e9 ===== -->\n    <div class=\"section-label\">\n      <span class=\"section-label-text\">Tableau comptable d\u00e9taill\u00e9<\/span>\n      <div class=\"section-label-line\"><\/div>\n    <\/div>\n\n    <div class=\"col-12\">\n      <div class=\"table-card\">\n        <div class=\"card-title\">\u00c9tat d\u00e9taill\u00e9 des entr\u00e9es et sorties 2022\u20132025<\/div>\n        <div class=\"card-subtitle\">Montants en EUR &bull; Les Charges Sociales UCM\/ONSS sont regroup\u00e9es et surlign\u00e9es<\/div>\n        <table id=\"detail-table\">\n          <thead>\n            <tr>\n              <th>Cat\u00e9gorie<\/th>\n              <th style=\"text-align:right\">2022<\/th>\n              <th style=\"text-align:right\">2023<\/th>\n              <th style=\"text-align:right\">2024<\/th>\n              <th style=\"text-align:right\">2025<\/th>\n              <th style=\"text-align:right\">Total<\/th>\n            <\/tr>\n          <\/thead>\n          <tbody id=\"detail-tbody\">\n            <!-- Filled by JS -->\n          <\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n\n    <!-- ===== INSIGHT TEXT ===== -->\n    <div class=\"section-label\">\n      <span class=\"section-label-text\">Synth\u00e8se &amp; observations<\/span>\n      <div class=\"section-label-line\"><\/div>\n    <\/div>\n\n    <div class=\"col-6\">\n      <div class=\"text-card\">\n        <div class=\"card-title\">\ud83d\udd0d Observations cl\u00e9s<\/div>\n        <p><strong>D\u00e9ficit croissant :<\/strong> Le solde net se d\u00e9grade chaque ann\u00e9e, passant de \u201385 \u20ac en 2022 \u00e0 \u20138 692 \u20ac en 2025 (donn\u00e9es partielles). Les d\u00e9penses augmentent plus vite que les rentr\u00e9es.<\/p>\n        <p><strong>Virements salaire\/pension :<\/strong> Repr\u00e9sente la plus grande cat\u00e9gorie de d\u00e9penses (69 352 \u20ac sur 4 ans, soit ~62 % du total des sorties). En forte hausse en 2024 (+46 %).<\/p>\n        <p><strong>Rentr\u00e9es concentr\u00e9es :<\/strong> Les virements en euros constituent ~98 % des rentr\u00e9es. FOREM-GLOBAL est de loin la principale source de revenus (80 041 \u20ac sur la p\u00e9riode).<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"col-6\">\n      <div class=\"text-card\" style=\"border-left: 3px solid var(--ucm-color);\">\n        <div class=\"card-title\">\ud83d\udfe0 Charges Sociales UCM \/ ONSS<\/div>\n        <p><strong>2e poste de d\u00e9penses<\/strong> avec 26 464 \u20ac cumul\u00e9s (23,7 % des d\u00e9penses totales). Les principaux b\u00e9n\u00e9ficiaires sont : Secr\u00e9tariat Social UCM (19 132 \u20ac), ONSS (6 431 \u20ac), SECRETARIAT SOCIAL CLASSES (2 126 \u20ac) et UCM Mouvement (690 \u20ac).<\/p>\n        <p><strong>Pic en 2024 :<\/strong> Les charges atteignent 8 489 \u20ac en 2024, soit une hausse de +31 % par rapport \u00e0 2022. Elles diminuent en 2025 (donn\u00e9es partielles : 5 269 \u20ac).<\/p>\n        <p><strong>Tendance :<\/strong> Ces charges correspondent \u00e0 des cotisations sociales patronales et personnelles r\u00e9guli\u00e8res, vers\u00e9es mensuellement\/trimestriellement.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <footer class=\"footer\">\n    <img decoding=\"async\" class=\"logo-sm\" src=\"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg\" alt=\"Energent logo\">\n    <a href=\"https:\/\/www.energent.ai\" target=\"_blank\" rel=\"noopener noreferrer\"\n       style=\"color: var(--text-muted); text-decoration: none; transition: color 0.2s ease;\"\n       onmouseover=\"this.style.color='var(--primary)'\" onmouseout=\"this.style.color='var(--text-muted)'\">\n      G\u00e9n\u00e9r\u00e9 par energent.ai\n    <\/a>\n  <\/footer>\n<\/div>\n\n<script>\n\/\/ ============================================================\n\/\/ DATA\n\/\/ ============================================================\nconst DATA = {\n  years: [2022, 2023, 2024, 2025],\n  income_by_year: {\"2022\":25750.22,\"2023\":21622.02,\"2024\":25221.76,\"2025\":21268.76},\n  expense_by_year: {\"2022\":25835.36,\"2023\":23831.42,\"2024\":32233.36,\"2025\":29960.82},\n  net_by_year: {\"2022\":-85.14,\"2023\":-2209.4,\"2024\":-7011.6,\"2025\":-8692.06},\n  cat_expense_by_year: {\n    \"Charges Sociales (UCM\/ONSS)\":{\"2022\":6227.49,\"2023\":6478.26,\"2024\":8488.82,\"2025\":5269.46},\n    \"Frais li\u00e9s au compte\":{\"2022\":45.0,\"2023\":45.0,\"2024\":45.0,\"2025\":45.0},\n    \"Paiement par carte\":{\"2022\":205.75,\"2023\":400.58,\"2024\":505.26,\"2025\":494.04},\n    \"Retrait d\\u2019esp\\u00e8ces par carte\":{\"2022\":710.0,\"2023\":200.0,\"2024\":300.0,\"2025\":20.0},\n    \"Virement en euros\":{\"2022\":3125.45,\"2023\":2383.3,\"2024\":2024.98,\"2025\":5495.74},\n    \"Virement salaire\/pension\":{\"2022\":15521.67,\"2023\":14324.28,\"2024\":20869.3,\"2025\":18636.58}\n  },\n  cat_income_by_year: {\n    \"Versement en esp\\u00e8ces par carte\":{\"2022\":0,\"2023\":0,\"2024\":0,\"2025\":30.0},\n    \"Virement en euros\":{\"2022\":24790.22,\"2023\":21532.02,\"2024\":24566.76,\"2025\":21198.76},\n    \"Virement instantan\\u00e9 en euros\":{\"2022\":960.0,\"2023\":90.0,\"2024\":655.0,\"2025\":40.0}\n  },\n  total_expense_by_cat: {\n    \"Virement salaire\/pension\":69351.83,\n    \"Charges Sociales (UCM\/ONSS)\":26464.03,\n    \"Virement en euros\":13029.47,\n    \"Paiement par carte\":1605.63,\n    \"Retrait d\\u2019esp\\u00e8ces par carte\":1230.0,\n    \"Frais li\\u00e9s au compte\":180.0\n  },\n  total_income_by_cat: {\n    \"Versement en esp\\u00e8ces par carte\":30.0,\n    \"Virement en euros\":92087.76,\n    \"Virement instantan\\u00e9 en euros\":1745.0\n  },\n  monthly_income: {\"2022-01\":6430.53,\"2022-02\":1020.67,\"2022-03\":1080.0,\"2022-04\":5638.23,\"2022-05\":590.0,\"2022-07\":4548.34,\"2022-08\":1694.06,\"2022-09\":55.0,\"2022-10\":4498.39,\"2022-11\":55.0,\"2022-12\":140.0,\"2023-01\":5480.08,\"2023-02\":366.26,\"2023-04\":5608.4,\"2023-06\":173.56,\"2023-07\":4996.86,\"2023-10\":4996.86,\"2024-01\":5023.74,\"2024-02\":110.0,\"2024-03\":658.1,\"2024-04\":5008.74,\"2024-06\":650.0,\"2024-07\":4973.74,\"2024-08\":9.4,\"2024-09\":167.86,\"2024-10\":5060.18,\"2024-11\":1610.0,\"2024-12\":1950.0,\"2025-01\":5078.19,\"2025-02\":800.0,\"2025-03\":70.0,\"2025-04\":5078.19,\"2025-07\":5080.19,\"2025-10\":5078.19,\"2025-12\":84.0},\n  monthly_expense: {\"2022-01\":2809.67,\"2022-02\":135.67,\"2022-03\":3134.63,\"2022-04\":396.92,\"2022-05\":3027.58,\"2022-06\":438.28,\"2022-07\":3626.56,\"2022-08\":3252.58,\"2022-09\":366.74,\"2022-10\":2879.42,\"2022-11\":1772.35,\"2022-12\":3994.96,\"2023-01\":204.6,\"2023-02\":2641.03,\"2023-03\":2636.66,\"2023-04\":2627.69,\"2023-05\":1176.95,\"2023-06\":3578.12,\"2023-07\":779.25,\"2023-08\":3107.34,\"2023-09\":2444.12,\"2023-10\":1895.71,\"2023-11\":52.09,\"2023-12\":2687.86,\"2024-01\":3938.58,\"2024-02\":2307.47,\"2024-03\":2460.77,\"2024-04\":3012.27,\"2024-05\":3786.83,\"2024-06\":1120.18,\"2024-07\":3644.6,\"2024-08\":747.29,\"2024-09\":1950.75,\"2024-10\":2328.78,\"2024-11\":3087.34,\"2024-12\":3848.5,\"2025-01\":1479.23,\"2025-02\":3201.39,\"2025-03\":99.65,\"2025-04\":2478.23,\"2025-05\":1435.24,\"2025-06\":1914.34,\"2025-07\":3077.3,\"2025-08\":4456.73,\"2025-09\":65.53,\"2025-10\":1509.14,\"2025-11\":4116.64,\"2025-12\":6127.4},\n  all_months: [\"2022-01\",\"2022-02\",\"2022-03\",\"2022-04\",\"2022-05\",\"2022-06\",\"2022-07\",\"2022-08\",\"2022-09\",\"2022-10\",\"2022-11\",\"2022-12\",\"2023-01\",\"2023-02\",\"2023-03\",\"2023-04\",\"2023-05\",\"2023-06\",\"2023-07\",\"2023-08\",\"2023-09\",\"2023-10\",\"2023-11\",\"2023-12\",\"2024-01\",\"2024-02\",\"2024-03\",\"2024-04\",\"2024-05\",\"2024-06\",\"2024-07\",\"2024-08\",\"2024-09\",\"2024-10\",\"2024-11\",\"2024-12\",\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]\n};\n\n\/\/ ============================================================\n\/\/ THEME\n\/\/ ============================================================\nfunction getEffectiveDark() {\n  const root = document.documentElement;\n  if (root.classList.contains('dark')) return true;\n  if (root.classList.contains('light')) return false;\n  return window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\nfunction toggleTheme() {\n  const root = document.documentElement;\n  const currentlyDark = getEffectiveDark();\n  root.classList.remove('dark', 'light');\n  root.classList.add(currentlyDark ? 'light' : 'dark');\n  rebuildCharts();\n}\n\nconst COLORS = ['#814BE7','#34C563','#E73B4F','#3B8FE7','#D4A740','#6851FF'];\nconst UCM_COLOR = '#FF6B35';\nconst chartRegistry = [];\n\nfunction getDefaultLayout() {\n  const dark = getEffectiveDark();\n  return {\n    font: { family: 'Open Sans, system-ui, sans-serif', color: dark ? '#E2E4ED' : '#1F1F24' },\n    paper_bgcolor: 'transparent',\n    plot_bgcolor: 'transparent',\n    autosize: true,\n    margin: { l: 50, r: 30, t: 50, b: 50 },\n    xaxis: { gridcolor: dark ? '#484D66' : '#E2E4ED', automargin: true },\n    yaxis: { gridcolor: dark ? '#484D66' : '#E2E4ED', automargin: true },\n    colorway: COLORS,\n    legend: { font: { family: 'Open Sans, system-ui, sans-serif', size: 12 } },\n    hoverlabel: {\n      font: { family: 'Open Sans, system-ui, sans-serif', size: 13 },\n      bgcolor: dark ? '#3D4260' : '#FFFFFF',\n      bordercolor: dark ? '#5A5F78' : '#E2E4ED',\n      namelength: -1,\n    },\n  };\n}\n\nconst NESTED_LAYOUT_KEYS = ['xaxis','yaxis','yaxis2','margin','legend','font','hoverlabel'];\nfunction mergeLayouts(base, overrides) {\n  const merged = { ...base, ...overrides };\n  for (const key of NESTED_LAYOUT_KEYS) {\n    if (base[key] && overrides[key] && typeof base[key] === 'object' && typeof overrides[key] === 'object') {\n      merged[key] = { ...base[key], ...overrides[key] };\n    }\n  }\n  return merged;\n}\n\nfunction createChart(id, traces, layoutOverrides) {\n  layoutOverrides = layoutOverrides || {};\n  chartRegistry.push({ id, traces, layoutOverrides });\n  Plotly.newPlot(id, traces,\n    mergeLayouts(getDefaultLayout(), layoutOverrides),\n    { responsive: true, displayModeBar: false }\n  );\n}\n\nfunction rebuildCharts() {\n  chartRegistry.forEach(function(c) {\n    Plotly.react(c.id, c.traces,\n      mergeLayouts(getDefaultLayout(), c.layoutOverrides),\n      { responsive: true, displayModeBar: false }\n    );\n  });\n}\n\n\/\/ ============================================================\n\/\/ FORMATTING HELPERS\n\/\/ ============================================================\nfunction fmtEur(n) {\n  if (n === null || n === undefined) return '\u2014';\n  const abs = Math.abs(n);\n  const sign = n < 0 ? '-' : '';\n  if (abs >= 1000) {\n    return sign + (abs \/ 1000).toFixed(1).replace('.', ',') + ' K\u20ac';\n  }\n  return sign + abs.toFixed(2).replace('.', ',') + ' \u20ac';\n}\nfunction fmtEurFull(n) {\n  if (n === null || n === undefined) return '\u2014';\n  const sign = n < 0 ? '- ' : '';\n  return sign + Math.abs(n).toLocaleString('fr-BE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' \u20ac';\n}\nfunction fmtMonthLabel(ym) {\n  const parts = ym.split('-');\n  const months = ['Jan','F\u00e9v','Mar','Avr','Mai','Jun','Jul','Ao\u00fb','Sep','Oct','Nov','D\u00e9c'];\n  return months[parseInt(parts[1]) - 1] + ' ' + parts[0];\n}\n\n\/\/ ============================================================\n\/\/ CHART 1 \u2014 Annual income vs expense\n\/\/ ============================================================\n(function() {\n  const years = DATA.years.map(String);\n  const income = years.map(y => DATA.income_by_year[y] || 0);\n  const expense = years.map(y => DATA.expense_by_year[y] || 0);\n  const net = years.map(y => DATA.net_by_year[y] || 0);\n\n  createChart('chart-annual', [\n    {\n      type: 'bar',\n      name: 'Rentr\u00e9es',\n      x: years,\n      y: income,\n      marker: { color: '#34C563', cornerradius: 6 },\n      hovertemplate: '<b>Rentr\u00e9es %{x}<\/b><br>%{customdata}<extra><\/extra>',\n      customdata: income.map(fmtEurFull),\n      text: income.map(fmtEur),\n      textposition: 'outside',\n    },\n    {\n      type: 'bar',\n      name: 'D\u00e9penses',\n      x: years,\n      y: expense,\n      marker: { color: '#E73B4F', cornerradius: 6 },\n      hovertemplate: '<b>D\u00e9penses %{x}<\/b><br>%{customdata}<extra><\/extra>',\n      customdata: expense.map(fmtEurFull),\n      text: expense.map(fmtEur),\n      textposition: 'outside',\n    },\n    {\n      type: 'scatter',\n      name: 'Solde net',\n      mode: 'lines+markers+text',\n      x: years,\n      y: net,\n      yaxis: 'y2',\n      line: { color: '#D4A740', width: 2.5, dash: 'dot' },\n      marker: { size: 8, color: '#D4A740', symbol: 'diamond' },\n      text: net.map(fmtEur),\n      textposition: 'top center',\n      textfont: { color: '#D4A740', size: 11, family: 'Open Sans, system-ui, sans-serif' },\n      hovertemplate: '<b>Solde net %{x}<\/b><br>%{customdata}<extra><\/extra>',\n      customdata: net.map(fmtEurFull),\n    }\n  ], {\n    barmode: 'group',\n    yaxis: { title: 'Montant (EUR)', tickformat: ',.0f', ticksuffix: ' \u20ac' },\n    yaxis2: { overlaying: 'y', side: 'right', showgrid: false, automargin: true, title: 'Solde net (EUR)', tickformat: ',.0f', ticksuffix: ' \u20ac', zeroline: true, zerolinecolor: '#D4A740', zerolinewidth: 1 },\n    legend: { orientation: 'h', y: -0.18 },\n    margin: { t: 70, b: 70 },\n  });\n})();\n\n\/\/ ============================================================\n\/\/ CHART 2 \u2014 Stacked bar by expense category and year\n\/\/ ============================================================\n(function() {\n  const years = DATA.years.map(String);\n  const cats = Object.keys(DATA.cat_expense_by_year);\n\n  const catColors = {\n    'Virement salaire\/pension': '#814BE7',\n    'Charges Sociales (UCM\/ONSS)': UCM_COLOR,\n    'Virement en euros': '#3B8FE7',\n    'Paiement par carte': '#D4A740',\n    'Retrait d\\u2019esp\\u00e8ces par carte': '#6851FF',\n    'Frais li\\u00e9s au compte': '#A2A7BD',\n  };\n\n  const traces = cats.map(function(cat) {\n    const vals = years.map(y => DATA.cat_expense_by_year[cat][y] || 0);\n    const isUCM = cat === 'Charges Sociales (UCM\/ONSS)';\n    return {\n      type: 'bar',\n      name: cat,\n      x: years,\n      y: vals,\n      marker: {\n        color: catColors[cat] || COLORS[0],\n        line: isUCM ? { color: UCM_COLOR, width: 2 } : undefined,\n        opacity: isUCM ? 1.0 : 0.85,\n      },\n      hovertemplate: '<b>' + cat + '<\/b><br>Ann\u00e9e : %{x}<br>Montant : %{customdata}<extra><\/extra>',\n      customdata: vals.map(fmtEurFull),\n      text: vals.map(function(v) { return v > 500 ? fmtEur(v) : ''; }),\n      textposition: 'inside',\n      textfont: { color: '#fff', size: 10, family: 'Open Sans, system-ui, sans-serif' },\n    };\n  });\n\n  createChart('chart-cat-year', traces, {\n    barmode: 'stack',\n    yaxis: { title: 'D\u00e9penses (EUR)', tickformat: ',.0f', ticksuffix: ' \u20ac' },\n    legend: { orientation: 'h', y: -0.22, traceorder: 'normal' },\n    margin: { t: 50, b: 100 },\n    annotations: [{\n      x: 0.5, y: 1.06, xref: 'paper', yref: 'paper',\n      text: '<span style=\"color:#FF6B35\">\u25a0<\/span> Charges Sociales UCM\/ONSS sont mis en \u00e9vidence en orange',\n      showarrow: false,\n      font: { size: 11, color: '#6E7191', family: 'Open Sans, system-ui, sans-serif' },\n    }]\n  });\n})();\n\n\/\/ ============================================================\n\/\/ CHART 3 \u2014 Pie\/Donut toggle\n\/\/ ============================================================\nvar currentPieMode = 'depenses';\nfunction showPie(mode) {\n  currentPieMode = mode;\n  document.querySelectorAll('#pie-filter .pill').forEach(function(p) { p.classList.remove('active'); });\n  event.target.classList.add('active');\n  renderPie();\n}\n\nfunction renderPie() {\n  var labels, values, colors;\n  if (currentPieMode === 'depenses') {\n    const raw = DATA.total_expense_by_cat;\n    labels = Object.keys(raw);\n    values = Object.values(raw);\n    colors = labels.map(function(l) {\n      if (l === 'Charges Sociales (UCM\/ONSS)') return UCM_COLOR;\n      if (l === 'Virement salaire\/pension') return '#814BE7';\n      if (l === 'Virement en euros') return '#3B8FE7';\n      if (l === 'Paiement par carte') return '#D4A740';\n      if (l.includes('esp\\u00e8ces')) return '#6851FF';\n      return '#A2A7BD';\n    });\n  } else {\n    const raw = DATA.total_income_by_cat;\n    labels = Object.keys(raw);\n    values = Object.values(raw);\n    colors = ['#34C563', '#3B8FE7', '#D4A740'];\n  }\n\n  const total = values.reduce(function(a, b) { return a + b; }, 0);\n  const pullArr = labels.map(function(l) { return l === 'Charges Sociales (UCM\/ONSS)' ? 0.07 : 0; });\n\n  const idx = chartRegistry.findIndex(function(c) { return c.id === 'chart-pie'; });\n  const traces = [{\n    type: 'pie',\n    labels: labels,\n    values: values,\n    marker: { colors: colors, line: { color: getEffectiveDark() ? '#2D3148' : '#FFFFFF', width: 2 } },\n    hole: 0.42,\n    pull: pullArr,\n    textinfo: 'percent',\n    hovertemplate: '<b>%{label}<\/b><br>%{customdata}<br>%{percent}<extra><\/extra>',\n    customdata: values.map(fmtEurFull),\n    textfont: { size: 12, family: 'Open Sans, system-ui, sans-serif' },\n    sort: false,\n  }];\n\n  const layoutOverrides = {\n    legend: { orientation: 'v', x: 1.01, y: 0.5 },\n    margin: { l: 20, r: 200, t: 40, b: 40 },\n    annotations: [{\n      x: 0.5, y: 0.5,\n      xref: 'paper', yref: 'paper',\n      text: '<b>' + fmtEur(total) + '<\/b>',\n      showarrow: false,\n      font: { size: 14, family: 'Open Sans, system-ui, sans-serif', color: getEffectiveDark() ? '#E2E4ED' : '#1F1F24' },\n    }]\n  };\n\n  if (idx >= 0) {\n    chartRegistry[idx].traces = traces;\n    chartRegistry[idx].layoutOverrides = layoutOverrides;\n    Plotly.react('chart-pie', traces, mergeLayouts(getDefaultLayout(), layoutOverrides), { responsive: true, displayModeBar: false });\n  } else {\n    createChart('chart-pie', traces, layoutOverrides);\n  }\n}\nrenderPie();\n\n\/\/ ============================================================\n\/\/ CHART 4 \u2014 Monthly trend\n\/\/ ============================================================\n(function() {\n  const months = DATA.all_months;\n  const labels = months.map(fmtMonthLabel);\n  const incomeVals = months.map(function(m) { return DATA.monthly_income[m] || 0; });\n  const expenseVals = months.map(function(m) { return DATA.monthly_expense[m] || 0; });\n  const netVals = months.map(function(m, i) { return incomeVals[i] - expenseVals[i]; });\n\n  createChart('chart-monthly', [\n    {\n      type: 'scatter',\n      name: 'Rentr\u00e9es',\n      mode: 'lines+markers',\n      x: labels,\n      y: incomeVals,\n      line: { color: '#34C563', width: 2 },\n      marker: { size: 5, color: '#34C563' },\n      fill: 'tozeroy',\n      fillcolor: 'rgba(52,197,99,0.08)',\n      hovertemplate: '<b>Rentr\u00e9es %{x}<\/b><br>%{customdata}<extra><\/extra>',\n      customdata: incomeVals.map(fmtEurFull),\n    },\n    {\n      type: 'scatter',\n      name: 'D\u00e9penses',\n      mode: 'lines+markers',\n      x: labels,\n      y: expenseVals,\n      line: { color: '#E73B4F', width: 2 },\n      marker: { size: 5, color: '#E73B4F' },\n      fill: 'tozeroy',\n      fillcolor: 'rgba(231,59,79,0.08)',\n      hovertemplate: '<b>D\u00e9penses %{x}<\/b><br>%{customdata}<extra><\/extra>',\n      customdata: expenseVals.map(fmtEurFull),\n    },\n    {\n      type: 'bar',\n      name: 'Solde mensuel',\n      x: labels,\n      y: netVals,\n      yaxis: 'y2',\n      marker: {\n        color: netVals.map(function(v) { return v >= 0 ? 'rgba(52,197,99,0.55)' : 'rgba(231,59,79,0.55)'; }),\n        cornerradius: 3,\n      },\n      hovertemplate: '<b>Solde %{x}<\/b><br>%{customdata}<extra><\/extra>',\n      customdata: netVals.map(fmtEurFull),\n    }\n  ], {\n    yaxis: { title: 'Montant (EUR)', tickformat: ',.0f', ticksuffix: ' \u20ac' },\n    yaxis2: { overlaying: 'y', side: 'right', showgrid: false, automargin: true, title: 'Solde mensuel', tickformat: ',.0f', ticksuffix: ' \u20ac', zeroline: true, zerolinewidth: 1, zerolinecolor: '#D4A740' },\n    legend: { orientation: 'h', y: -0.22 },\n    xaxis: { tickangle: -45, automargin: true },\n    margin: { b: 100, t: 50 },\n  });\n})();\n\n\/\/ ============================================================\n\/\/ CHART 5 \u2014 UCM\/ONSS focus\n\/\/ ============================================================\n(function() {\n  const years = DATA.years.map(String);\n  const ucmVals = years.map(y => DATA.cat_expense_by_year['Charges Sociales (UCM\/ONSS)'][y] || 0);\n  const totalVals = years.map(y => DATA.expense_by_year[y] || 0);\n  const pctVals = years.map(function(y, i) { return totalVals[i] > 0 ? (ucmVals[i] \/ totalVals[i] * 100) : 0; });\n\n  createChart('chart-ucm', [\n    {\n      type: 'bar',\n      name: 'Charges Sociales (UCM\/ONSS)',\n      x: years,\n      y: ucmVals,\n      marker: { color: UCM_COLOR, cornerradius: 6 },\n      text: ucmVals.map(fmtEurFull),\n      textposition: 'outside',\n      textfont: { color: UCM_COLOR, size: 11, family: 'Open Sans, system-ui, sans-serif' },\n      hovertemplate: '<b>UCM\/ONSS %{x}<\/b><br>%{customdata}<extra><\/extra>',\n      customdata: ucmVals.map(fmtEurFull),\n    },\n    {\n      type: 'scatter',\n      name: '% des d\u00e9penses totales',\n      mode: 'lines+markers+text',\n      x: years,\n      y: pctVals,\n      yaxis: 'y2',\n      line: { color: '#814BE7', width: 2.5 },\n      marker: { size: 8, color: '#814BE7' },\n      text: pctVals.map(function(v) { return v.toFixed(1) + ' %'; }),\n      textposition: 'top center',\n      textfont: { color: '#814BE7', size: 11, family: 'Open Sans, system-ui, sans-serif' },\n      hovertemplate: '<b>Part UCM\/ONSS %{x}<\/b><br>%{y:.1f}%<extra><\/extra>',\n    }\n  ], {\n    yaxis: { title: 'Montant UCM\/ONSS (EUR)', tickformat: ',.0f', ticksuffix: ' \u20ac' },\n    yaxis2: { overlaying: 'y', side: 'right', showgrid: false, automargin: true, title: '% d\u00e9penses totales', ticksuffix: ' %', range: [0, 40] },\n    legend: { orientation: 'h', y: -0.18 },\n    margin: { t: 70, b: 70 },\n  });\n})();\n\n\/\/ ============================================================\n\/\/ TABLE \u2014 bilan_comptable_synthese\n\/\/ ============================================================\n(function() {\n  const years = ['2022', '2023', '2024', '2025'];\n\n  \/\/ Build row data\n  const rows = [\n    \/\/ RENTR\u00c9ES section\n    { label: '\ud83d\udce5 RENTR\u00c9ES', isHeader: true, positive: true },\n    { label: 'Virement en euros', data: DATA.cat_income_by_year['Virement en euros'], positive: true },\n    { label: 'Virement instantan\u00e9 en euros', data: DATA.cat_income_by_year['Virement instantan\u00e9 en euros'], positive: true },\n    { label: 'Versement en esp\u00e8ces par carte', data: DATA.cat_income_by_year['Versement en esp\u00e8ces par\\ncarte'] || {'2022':0,'2023':0,'2024':0,'2025':30}, positive: true },\n    { label: '\u2795 Sous-total Rentr\u00e9es', isSub: true, positive: true, vals: years.map(y => DATA.income_by_year[y] || 0) },\n    \/\/ D\u00c9PENSES section\n    { label: '\ud83d\udce4 D\u00c9PENSES', isHeader: true, positive: false },\n    { label: 'Virement salaire\/pension', data: DATA.cat_expense_by_year['Virement salaire\/pension'], positive: false },\n    { label: 'Charges Sociales (UCM\/ONSS)', data: DATA.cat_expense_by_year['Charges Sociales (UCM\/ONSS)'], positive: false, isUCM: true },\n    { label: 'Virement en euros', data: DATA.cat_expense_by_year['Virement en euros'], positive: false },\n    { label: 'Paiement par carte', data: DATA.cat_expense_by_year['Paiement par carte'], positive: false },\n    { label: 'Retrait d\\'esp\u00e8ces par carte', data: DATA.cat_expense_by_year['Retrait d\\u2019esp\\u00e8ces par carte'], positive: false },\n    { label: 'Frais li\u00e9s au compte', data: DATA.cat_expense_by_year['Frais li\u00e9s au compte'], positive: false },\n    { label: '\u2796 Sous-total D\u00e9penses', isSub: true, positive: false, vals: years.map(y => -(DATA.expense_by_year[y] || 0)) },\n    \/\/ NET\n    { label: '\u2696\ufe0f SOLDE NET', isTotal: true, vals: years.map(y => DATA.net_by_year[y] || 0) },\n  ];\n\n  const tbody = document.getElementById('detail-tbody');\n  rows.forEach(function(row) {\n    const tr = document.createElement('tr');\n\n    if (row.isUCM) tr.classList.add('ucm-row');\n\n    \/\/ Compute vals\n    let vals = row.vals;\n    if (!vals && row.data) {\n      vals = years.map(function(y) { return row.data[y] !== undefined ? row.data[y] : 0; });\n      if (!row.positive) vals = vals.map(function(v) { return -v; });\n    }\n    let total = null;\n    if (vals) total = vals.reduce(function(a, b) { return a + b; }, 0);\n\n    \/\/ Label cell\n    const tdLabel = document.createElement('td');\n    if (row.isHeader) {\n      tdLabel.style.fontWeight = '700';\n      tdLabel.style.paddingTop = '16px';\n      tdLabel.style.color = row.positive ? 'var(--success)' : 'var(--danger)';\n      tdLabel.style.fontSize = '0.87rem';\n      tdLabel.style.letterSpacing = '0.03em';\n    } else if (row.isSub) {\n      tdLabel.style.fontWeight = '700';\n    } else if (row.isTotal) {\n      tdLabel.style.fontWeight = '700';\n      tdLabel.style.fontSize = '0.9rem';\n    } else {\n      tdLabel.style.paddingLeft = '24px';\n    }\n\n    \/\/ Safely set text content (never innerHTML for data values)\n    if (row.isUCM) {\n      tdLabel.textContent = row.label;\n      const badge = document.createElement('span');\n      badge.className = 'ucm-badge';\n      badge.textContent = 'UCM\/ONSS';\n      tdLabel.appendChild(badge);\n    } else {\n      tdLabel.textContent = row.label;\n    }\n    tr.appendChild(tdLabel);\n\n    \/\/ Year cells\n    if (row.isHeader) {\n      for (let i = 0; i < 5; i++) {\n        const td = document.createElement('td');\n        tr.appendChild(td);\n      }\n    } else {\n      (vals || []).forEach(function(v) {\n        const td = document.createElement('td');\n        td.className = 'num';\n        if (row.isTotal || row.isSub) td.classList.add('total-row');\n        if (row.isUCM) td.classList.add('total-row');\n        if (v > 0 && (row.positive || row.isTotal)) td.classList.add('positive');\n        if (v < 0 &#038;&#038; (!row.positive || row.isTotal)) td.classList.add('negative');\n        if (v === 0) { td.textContent = '\u2014'; }\n        else {\n          \/\/ Format: always show sign for net\/sub\n          const sign = v < 0 ? '- ' : (row.isTotal || row.isSub ? '+\\u202f' : '');\n          td.textContent = sign + Math.abs(v).toLocaleString('fr-BE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' \u20ac';\n        }\n        tr.appendChild(td);\n      });\n\n      \/\/ Total column\n      const tdTotal = document.createElement('td');\n      tdTotal.className = 'num';\n      if (row.isTotal || row.isSub) tdTotal.classList.add('total-row');\n      if (row.isUCM) tdTotal.classList.add('total-row');\n      if (total > 0 && row.positive) tdTotal.classList.add('positive');\n      if (total < 0 &#038;&#038; !row.positive) tdTotal.classList.add('negative');\n      if (total === 0) { tdTotal.textContent = '\u2014'; }\n      else {\n        const sign = total < 0 ? '- ' : (row.isTotal || row.isSub ? '+\\u202f' : '');\n        tdTotal.textContent = sign + Math.abs(total).toLocaleString('fr-BE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' \u20ac';\n      }\n      tr.appendChild(tdTotal);\n    }\n\n    tbody.appendChild(tr);\n  });\n})();\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Bilan Comptable 2022\u20132025 &#9788; &#9790; Bilan Comptable 2022\u20132025 Analyse d\u00e9taill\u00e9e des entr\u00e9es et sorties &bull; Compte BE55 2710 3710 3744 Vue d&#8217;ensemble Total Rentr\u00e9es 93 863 \u20ac 2022 \u2013 2025 Total D\u00e9penses 111 861 \u20ac 2022 \u2013 2025 Solde Net Cumul\u00e9 -17 998 \u20ac D\u00e9ficit global Charges Sociales UCM\/ONSS 26 464 \u20ac 23.7 % des [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_tribe_ticket_capacity":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-494","post","type-post","status-publish","format-standard","hentry","category-non-classe"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Situation budg\u00e9taire ADEL - Association des \u00c9conomistes de Louvain<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Situation budg\u00e9taire ADEL - Association des \u00c9conomistes de Louvain\" \/>\n<meta property=\"og:description\" content=\"Bilan Comptable 2022\u20132025 &#9788; &#9790; Bilan Comptable 2022\u20132025 Analyse d\u00e9taill\u00e9e des entr\u00e9es et sorties &bull; Compte BE55 2710 3710 3744 Vue d&#039;ensemble Total Rentr\u00e9es 93 863 \u20ac 2022 \u2013 2025 Total D\u00e9penses 111 861 \u20ac 2022 \u2013 2025 Solde Net Cumul\u00e9 -17 998 \u20ac D\u00e9ficit global Charges Sociales UCM\/ONSS 26 464 \u20ac 23.7 % des [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/\" \/>\n<meta property=\"og:site_name\" content=\"Association des \u00c9conomistes de Louvain\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-27T11:59:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-27T14:24:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg\" \/>\n<meta name=\"author\" content=\"Adelouvain\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adelouvain\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/\"},\"author\":{\"name\":\"Adelouvain\",\"@id\":\"https:\/\/adelouvain.be\/#\/schema\/person\/05f8772fb00876070fda9a90fd8ce92b\"},\"headline\":\"Situation budg\u00e9taire ADEL\",\"datePublished\":\"2026-04-27T11:59:00+00:00\",\"dateModified\":\"2026-04-27T14:24:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/\"},\"wordCount\":362,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg\",\"articleSection\":[\"Non class\u00e9\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/\",\"url\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/\",\"name\":\"Situation budg\u00e9taire ADEL - Association des \u00c9conomistes de Louvain\",\"isPartOf\":{\"@id\":\"https:\/\/adelouvain.be\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg\",\"datePublished\":\"2026-04-27T11:59:00+00:00\",\"dateModified\":\"2026-04-27T14:24:14+00:00\",\"author\":{\"@id\":\"https:\/\/adelouvain.be\/#\/schema\/person\/05f8772fb00876070fda9a90fd8ce92b\"},\"breadcrumb\":{\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#primaryimage\",\"url\":\"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg\",\"contentUrl\":\"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/adelouvain.be\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Situation budg\u00e9taire ADEL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/adelouvain.be\/#website\",\"url\":\"https:\/\/adelouvain.be\/\",\"name\":\"Association des \u00c9conomistes de Louvain\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/adelouvain.be\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/adelouvain.be\/#\/schema\/person\/05f8772fb00876070fda9a90fd8ce92b\",\"name\":\"Adelouvain\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/5dac42cc82638d5b25ec2387b38d68d026391fff1d82d342697553a319aa0d04?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5dac42cc82638d5b25ec2387b38d68d026391fff1d82d342697553a319aa0d04?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5dac42cc82638d5b25ec2387b38d68d026391fff1d82d342697553a319aa0d04?s=96&d=mm&r=g\",\"caption\":\"Adelouvain\"},\"sameAs\":[\"http:\/\/adelouvain.be\"],\"url\":\"https:\/\/adelouvain.be\/index.php\/author\/adelouvain\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Situation budg\u00e9taire ADEL - Association des \u00c9conomistes de Louvain","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/","og_locale":"en_US","og_type":"article","og_title":"Situation budg\u00e9taire ADEL - Association des \u00c9conomistes de Louvain","og_description":"Bilan Comptable 2022\u20132025 &#9788; &#9790; Bilan Comptable 2022\u20132025 Analyse d\u00e9taill\u00e9e des entr\u00e9es et sorties &bull; Compte BE55 2710 3710 3744 Vue d'ensemble Total Rentr\u00e9es 93 863 \u20ac 2022 \u2013 2025 Total D\u00e9penses 111 861 \u20ac 2022 \u2013 2025 Solde Net Cumul\u00e9 -17 998 \u20ac D\u00e9ficit global Charges Sociales UCM\/ONSS 26 464 \u20ac 23.7 % des [&hellip;]","og_url":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/","og_site_name":"Association des \u00c9conomistes de Louvain","article_published_time":"2026-04-27T11:59:00+00:00","article_modified_time":"2026-04-27T14:24:14+00:00","og_image":[{"url":"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg","type":"","width":"","height":""}],"author":"Adelouvain","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Adelouvain","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#article","isPartOf":{"@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/"},"author":{"name":"Adelouvain","@id":"https:\/\/adelouvain.be\/#\/schema\/person\/05f8772fb00876070fda9a90fd8ce92b"},"headline":"Situation budg\u00e9taire ADEL","datePublished":"2026-04-27T11:59:00+00:00","dateModified":"2026-04-27T14:24:14+00:00","mainEntityOfPage":{"@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/"},"wordCount":362,"commentCount":0,"image":{"@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#primaryimage"},"thumbnailUrl":"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg","articleSection":["Non class\u00e9"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/","url":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/","name":"Situation budg\u00e9taire ADEL - Association des \u00c9conomistes de Louvain","isPartOf":{"@id":"https:\/\/adelouvain.be\/#website"},"primaryImageOfPage":{"@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#primaryimage"},"image":{"@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#primaryimage"},"thumbnailUrl":"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg","datePublished":"2026-04-27T11:59:00+00:00","dateModified":"2026-04-27T14:24:14+00:00","author":{"@id":"https:\/\/adelouvain.be\/#\/schema\/person\/05f8772fb00876070fda9a90fd8ce92b"},"breadcrumb":{"@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#primaryimage","url":"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg","contentUrl":"https:\/\/www.energent.ai\/images\/logos\/svg\/energent-logo.svg"},{"@type":"BreadcrumbList","@id":"https:\/\/adelouvain.be\/index.php\/2026\/04\/27\/situation-budgetaire-adel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/adelouvain.be\/"},{"@type":"ListItem","position":2,"name":"Situation budg\u00e9taire ADEL"}]},{"@type":"WebSite","@id":"https:\/\/adelouvain.be\/#website","url":"https:\/\/adelouvain.be\/","name":"Association des \u00c9conomistes de Louvain","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/adelouvain.be\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/adelouvain.be\/#\/schema\/person\/05f8772fb00876070fda9a90fd8ce92b","name":"Adelouvain","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5dac42cc82638d5b25ec2387b38d68d026391fff1d82d342697553a319aa0d04?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5dac42cc82638d5b25ec2387b38d68d026391fff1d82d342697553a319aa0d04?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5dac42cc82638d5b25ec2387b38d68d026391fff1d82d342697553a319aa0d04?s=96&d=mm&r=g","caption":"Adelouvain"},"sameAs":["http:\/\/adelouvain.be"],"url":"https:\/\/adelouvain.be\/index.php\/author\/adelouvain\/"}]}},"_links":{"self":[{"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/posts\/494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/comments?post=494"}],"version-history":[{"count":5,"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/posts\/494\/revisions"}],"predecessor-version":[{"id":504,"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/posts\/494\/revisions\/504"}],"wp:attachment":[{"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/media?parent=494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/categories?post=494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adelouvain.be\/index.php\/wp-json\/wp\/v2\/tags?post=494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}