{# templates/admin/projet/tabs/_technical.html.twig #} {# --- CALCULS DE SYNTHÈSE --- #} {% set totalEtapes = 0 %} {% set etapesFinies = 0 %} {% for lot in projet.lots %} {% for etape in lot.lotEtapes %} {% set totalEtapes = totalEtapes + 1 %} {% if etape.estTerminee %}{% set etapesFinies = etapesFinies + 1 %}{% endif %} {% endfor %} {% endfor %}
Avancement : {{ projet.nom }}
{# APPEL FRAGMENT BADGE PROJET #} {{ render(path('shared_doc_badge', {'targetType': 'PROJET', 'targetId': projet.id})) }}
{{ projet.avancement|default(0) }}%
Statut des tâches
{{ etapesFinies }} / {{ totalEtapes }} étapes terminées
Détail par Lot
{% for lot in projet.lots %}

Mise à jour des étapes
{% for etape in lot.lotEtapes %} {% set progress = etape.pourcentageAvancement|default(0) %} {% set colorClass = progress >= 100 ? 'success' : (progress >= 50 ? 'warning' : (progress > 0 ? 'primary' : 'danger')) %}
{{ etape.libelle }} {# APPEL FRAGMENT BADGE ETAPE #} {{ render(path('shared_doc_badge', {'targetType': 'ETAPE', 'targetId': etape.id})) }}
%
{% else %}

Aucune étape générée.

{% endfor %}
{% endfor %}
{# NOTE : La modale et les scripts Dropzone doivent désormais être inclus soit dans votre layout parent, soit via un composant réutilisable pour éviter la duplication. #}