Actualités & Avancement
{% set orderedKeys = ['m-6','m-5','m-4','m-3','m-2','m-1','m'] %} {% set cols = [] %} {% for k in orderedKeys %} {% if milestonesData.months[k] is defined and milestonesData.months[k].planned > 0 %} {% set cols = cols|merge([k]) %} {% endif %} {% endfor %} {% set labels = [] %} {% set realized = [] %} {% set remaining = [] %} {% set performance = [] %} {% for k in cols %} {% set r = milestonesData.months[k] %} {% set planned = r.planned|default(0) %} {% set actual = r.actual|default(0) %} {% set remain = planned > actual ? (planned - actual) : 0 %} {% set labels = labels|merge([ r.period|date('M y') ]) %} {% set realized = realized|merge([ actual ]) %} {% set remaining = remaining|merge([ remain ]) %} {% set performance = performance|merge([ r.performance|default(0) ]) %} {% endfor %}
{% for k in cols %} {% set r = milestonesData.months[k] %} {% if r.actual > 0 %} {% endif %} {% endfor %} {% for k in cols %} {% set r = milestonesData.months[k] %} {% if r.actual > 0 %} {% set planned = r.planned|default(0) %} {% set actual = r.actual|default(0) %} {% set barColor = actual >= planned ? 'success' : 'danger' %} {% endif %} {% endfor %}
Mensuel{{ r.period|date('M')|trans }} {{ r.period|date('Y') }}
Progression
{% if actual is not null %}
{% endif %}
Prévu : {{ planned }}% {% if actual is not null and actual > 0 %}Réalisé : {{ actual }}%{% endif %}
{% set a = milestonesData.analysis %} {% set trendMap = { 'improving': {'label':'En amélioration','class':'bg-success'}, 'declining': {'label':'En baisse','class':'bg-danger'}, 'stable': {'label':'Stable','class':'bg-secondary'}, 'volatile': {'label':'Volatile','class':'bg-warning text-dark'} } %} {% set t = trendMap[a.trendLabel|default('stable')] ?? trendMap['stable'] %} {% set goodClass = a.goodDynamic ? 'bg-success' : 'bg-danger' %} {% set varIcon = a.variation > 0 ? 'mdi-arrow-up-bold' : (a.variation < 0 ? 'mdi-arrow-down-bold' : 'mdi-minus') %} {% set deltaIcon = a.lastDelta > 0 ? 'mdi-trending-up' : (a.lastDelta < 0 ? 'mdi-trending-down' : 'mdi-trending-neutral') %} {% set r2 = milestonesData.analysis.r2|default(0) %} {% set r2Note = '' %} {% if r2 >= 0.9 %} {% set r2Note = 'La performance suit une tendance linéaire très claire sur les derniers mois.' %} {% elseif r2 >= 0.6 %} {% set r2Note = 'La performance suit une tendance globalement cohérente, mais avec quelques fluctuations.' %} {% elseif r2 >= 0.3 %} {% set r2Note = 'La tendance est peu fiable : les données sont trop dispersées ou irrégulières.' %} {% else %} {% set r2Note = 'Aucune tendance claire ne se dégage : les variations mensuelles sont trop erratiques.' %} {% endif %} {% set a = milestonesData.analysis %} {% set trendMap = { 'improving': {'label':'En amélioration','class':'bg-success', 'desc':'La tendance globale des 6 derniers mois est orientée à la hausse.'}, 'declining': {'label':'En baisse','class':'bg-danger', 'desc':'La tendance globale des 6 derniers mois est orientée à la baisse.'}, 'stable': {'label':'Stable','class':'bg-secondary', 'desc':'Pas de tendance marquée ; évolution globalement latérale avec une faible pente.'}, 'volatile': {'label':'Volatile','class':'bg-warning text-dark', 'desc':'Forte variabilité mensuelle ; prudence dans l’interprétation.'} } %} {% set t = trendMap[a.trendLabel|default('stable')] ?? trendMap['stable'] %} {% set r2 = a.r2|default(0) %} {% set r2Note = r2 >= 0.9 ? 'Tendance très claire (faible dispersion).' : (r2 >= 0.6 ? 'Tendance globalement cohérente, avec quelques fluctuations.' : (r2 >= 0.3 ? 'Tendance peu fiable : série dispersée.' : 'Aucune tendance claire (série erratique).')) %} {% set perf = [ milestonesData.months['m-6'].performance, milestonesData.months['m-5'].performance, milestonesData.months['m-4'].performance, milestonesData.months['m-3'].performance, milestonesData.months['m-2'].performance, milestonesData.months['m-1'].performance, ] %} {% set perfLabels = [] %} {% for i in ['m-6','m-5','m-4','m-3','m-2','m-1'] %} {% if milestonesData.months[i] is defined %} {% set perf = perf|merge([ milestonesData.months[i].performance ]) %} {% set perfPeriod = milestonesData.months[i].period %} {% set perfLabels = perfLabels|merge([ (perfPeriod|date('M')|trans)~perfPeriod|date(' Y') ]) %} {% endif %} {% endfor %}
Tendance globale (6 mois)
{{ t.label }}
Variation M vs M‑1 : {{ a.variation|number_format(1, ',', ' ') }} pts
R² tendance
{{ r2|number_format(3, ',', ' ') }}
Pente/mois
{{ a.slopePerMonth|default(0)|number_format(2, ',', ' ') }} pts
Mois en hausse
{{ (a.improvementShare|default(0) * 100)|number_format(0, ',', ' ') }} %
Bonne dynamique
{{ a.goodDynamic ? 'Oui' : 'Non' }}
{# Phrase d’interprétation #}
Avancement physique (mensuel)
Commentaires
{% include 'comment/_list.html.twig' with { addComment: false, maxHeight: '400px' } %}