{% set riskList = risks ?? [] %} {# compteurs #} {% set r_total = riskList|length %} {% set r_open = riskList|filter(r => r.status == 'open')|length %} {% set r_treat = riskList|filter(r => r.status in ['closed','mitigating','treated'])|length %} {# répartition par niveau d’exposition (ton RiskDTO.exposure = 'high'|'medium'|'low') #} {% set r_critical = riskList|filter(r => r.exposure == 'critical')|length %} {% set r_high = riskList|filter(r => r.exposure == 'high')|length %} {% set r_med = riskList|filter(r => r.exposure == 'medium')|length %} {% set r_low = riskList|filter(r => r.exposure == 'low')|length %} {# taux de mitigation #} {% set r_rate = r_total>0 ? (r_treat / r_total * 100) : 0 %} {# indice d’exposition (normalisé 0..100) : critTotal = moyenne(critCost, critDelay, critPerformance), max théorique = 25 (5x5) On normalise : (critTotal / 25)*100 puis moyenne sur tous les risques #} {% set r_exp_index = 0 %} {% if r_total > 0 %} {% set r_exp_index = (riskList|map(r => (r.assessment.critTotal ?? 0))|reduce((c,v) => c+v, 0) / r_total) / 25 * 100 %} {% endif %}
Risques & dépendances
{# ===== Col gauche : KPIs & dépendances ===== #}
Ouverts : {{ r_open }}
Total : {{ r_total }}
Traités : {{ r_treat }}
Mitigation : {{ r_rate|round(0) }} %
{# --- Sécurisation des compteurs --- #} {% set r_total = r_total |default(0) %} {% set r_critical = r_critical|default(0) %} {% set r_high = r_high |default(0) %} {% set r_med = r_med |default(0) %} {% set r_low = r_low |default(0) %} {# Pourcentages safe (0 si r_total = 0) #} {% set pct_critical = r_total > 0 ? (r_critical / r_total * 100) : 0 %} {% set pct_high = r_total > 0 ? (r_high / r_total * 100) : 0 %} {% set pct_med = r_total > 0 ? (r_med / r_total * 100) : 0 %} {% set pct_low = r_total > 0 ? (r_low / r_total * 100) : 0 %} {# Palette dynamique pour le knob #} {% set fgColor = '#10B981' %} {% if r_exp_index|default(0) >= 70 %} {% set fgColor = '#EF4444' %} {% elseif r_exp_index|default(0) >= 40 %} {% set fgColor = '#F59E0B' %} {% endif %}
Répartition par niveau
{# Badges : on n’affiche QUE si la valeur > 0 #}
{% if r_critical > 0 %} Critique {{ r_critical }} {% endif %} {% if r_high > 0 %} Élevé {{ r_high }} {% endif %} {% if r_med > 0 %} Moyen {{ r_med }} {% endif %} {% if r_low > 0 %} Faible {{ r_low }} {% endif %} {% if r_critical == 0 and r_high == 0 and r_med == 0 and r_low == 0 %} Aucun risque catégorisé. {% endif %}
{# Barre empilée : on ne rend que les segments non nuls #}
{% if pct_critical > 0 %}
{% endif %} {% if pct_high > 0 %}
{% endif %} {% if pct_med > 0 %}
{% endif %} {% if pct_low > 0 %}
{% endif %} {% if pct_critical == 0 and pct_high == 0 and pct_med == 0 and pct_low == 0 %}
{% endif %}
{# Légende sous la barre : n’affiche que les libellés présents #}
{% if r_critical > 0 %}Critique{% endif %} {% if r_high > 0 %}Élevé{% endif %} {% if r_med > 0 %}Moyen{% endif %} {% if r_low > 0 %}Faible{% endif %} {% if r_critical == 0 and r_high == 0 and r_med == 0 and r_low == 0 %} Aucune donnée {% endif %}
Indice d’exposition
Dépendances critiques
{# badge de prochaine revue si tu l’as #}
    {# On n’a pas de dépendances dans le DTO -> on met des exemples mappés aux activités #} {% for r in riskList|slice(0,3) %}
  • {{ r.activity.name }} {{ ('risk.domain.' ~ r.domainName) | trans }} {% if r.dueDate %} {{ r.dueDate }} {% endif %}
  • {% else %}
  • Aucune dépendance critique déclarée.
  • {% endfor %}
{# ===== Col droite : Heatmap + Top risques ===== #}
Carte de chaleur (probabilité × impact)
{# On passe toute la liste brute au JS pour construire la matrice 5x5 #}
Axes : Probabilité (lignes, 1=haut → 5=bas) × Impact (colonnes, 1→5). Survolez une cellule pour le détail.
Top risques (exposition critique la plus élevée)
{% for r in topRisks %} {% set lvl = r.exposure|default('medium') %} {% set lvlBadge = lvl == 'critical' ? 'bg-danger text-white' : (lvl == 'high' ? 'bg-danger-subtle text-danger' : (lvl == 'low' ? 'bg-info-subtle text-info' : 'bg-warning-subtle text-warning')) %} {% set impact = [r.assessment.severityCost, r.assessment.severityDelay, r.assessment.severityPerformance]|filter(v=>v is not null)|first %} {% else %} {% endfor %}
Risque Niveau Prob Impact Expo. Domaine Activité Échéance Statut
{{ r.title }} {{ ('risk.exposure.' ~ lvl)|trans|capitalize }} {{ r.assessment.probability }} {{ impact }} {{ r.assessment.critTotal|round(1) }} {{ ('risk.domain.' ~ r.domainName)|trans }}
{{ r.activity.acronym }}
{{ r.dueDate ?? '—' }} {% set st = r.status|default('open') %} {{ st|capitalize }}
Aucun risque enregistré.