{% set byPartner = financing.byPartner ?? [] %} {% set timeSeries = financing.timeSeries ?? {} %} {% set alerts = financing.alerts ?? [] %} {% set currency = program.currency ?? 'XOF' %} {% set _allocated = program.totalBudget|default(0) %} {# ══════════════════════════════════════════════════════════════ BLOC 1 — Alertes budgétaires ══════════════════════════════════════════════════════════════ #} {% if alerts is not empty %} {% set dangerCount = alerts|filter(a => a.level == 'danger')|length %} {% set warnCount = alerts|filter(a => a.level == 'warning')|length %} {% set bgMap = {danger: 'bg-danger-subtle', warning: 'bg-warning-subtle', info: 'bg-success-subtle'} %} {% set textMap = {danger: 'text-danger', warning: 'text-warning', info: 'text-success'} %} {% set collapseId = 'budgetAlertsCollapse_' ~ (program.id ?? 'global') %}
{# Header (toggle collapse) #} {# Collapse content #}
{% for alert in alerts %} {% set level = alert.level ?? 'info' %} {% set pct = alert.value ?? 0 %} {% if pct < 0 %}{% set pct = 0 %}{% endif %} {% if pct > 100 %}{% set pct = 100 %}{% endif %}
{{ alert.message }}
{% if pct > 0 %}
{{ pct }}%
{% endif %}
{% endfor %}
{% endif %} {# ══════════════════════════════════════════════════════════════ BLOC 2 — Bailleurs / Partenaires de financement ══════════════════════════════════════════════════════════════ #}
Partenaires de financement {{ byPartner|length }} bailleur{{ byPartner|length > 1 ? 's' : '' }}
{% if byPartner is empty %}
Aucun partenaire renseigné sur les lignes budgétaires.
{% else %} {# Barre de répartition globale #}
Répartition du budget alloué
{% set colors = ['bg-primary','bg-success','bg-info','bg-warning','bg-secondary','bg-danger'] %} {% for i, row in byPartner %}
{% endfor %}
{% for i, row in byPartner %} {{ row.partner }} ({{ row.share }}%) {% endfor %}
{# Tableau des bailleurs #}
{% for row in byPartner %} {# Bailleur #} {# Montants #} {# Progress - Engagement #} {# Progress - Décaissement #} {# Lignes #} {% endfor %}
Bailleur Alloué Engagé Décaissé Taux engagement Taux décaissement Lignes
{{ row.partner }}
{% if row.fundingType %} {{ row.fundingType }} {% endif %} {{ row.share }}% du total
{{ row.allocated|minify_budget }} {{ row.currency }}
{{ row.committed|minify_budget }} {{ row.currency }}
{{ row.disbursed|minify_budget }} {{ row.currency }}
{{ row.linesCount }}
Total {{ _allocated|minify_budget }} {{ program.currency }} {{ program.getTotalCommittedBudget|minify_budget }} {{ program.currency }} {{ program.totalDisbursedBudget|minify_budget }} {{ program.currency }}
{% endif %}
{# ══════════════════════════════════════════════════════════════ BLOC 3 — Prévisions vs Réalisations ══════════════════════════════════════════════════════════════ #}
Prévisions vs Réalisations {% if timeSeries.granularity is defined and timeSeries.granularity == 'year' %} par année {% else %} par semestre {% endif %}
{% if timeSeries.labels is defined and timeSeries.labels is not empty %}
Engagement prévu
Autorisations d'engagement cumulées
Engagement réel
Montants réellement engagés
Décaissement prévu
Autorisations de paiement cumulées
Décaissement réel
Montants réellement décaissés
{% else %}
Aucune allocation périodique renseignée sur les lignes budgétaires.
{% endif %}