{# Bloc « Traitement » guidé — remplace l'ancien « Suivi des colis ». Lecture de bas en haut : la demande démarre en bas (dépôt), chaque étape franchie s'empile, l'étape EN COURS est le bloc de gestion tout en haut. Fil conducteur plein entre étapes passées, pointillé vers l'étape en cours. Rechargé en AJAX (?fragment=1) après chaque action : pas de refresh page. Attendu : demande, transporteurs, peutSaisirAller, peutSaisirRetour, allerTrackable, retourTrackable #} {% set s = demande.statut.value %} {% set allerPose = demande.numSuiviAller is not empty %} {% set retourPose = demande.numSuiviRetour is not empty %} {% set currentStep = s == 'nouvelle' ? 'validation' : (s == 'validee' and not allerPose ? 'aller' : (s == 'validee' ? 'reception' : (s == 'recue' ? 'retour' : (s == 'expediee' ? 'livraison' : null)))) %} {# Macro : saisie d'un numéro de suivi (formulaire compact réutilisé aller/retour). #} {% macro trackingForm(sens, transporteurs, transporteur, numero, url) %} {% set libre = transporteur and transporteur.value == 'libre' %}
{% endmacro %} {# Macro : résumé compact du suivi d'un colis (étapes passées). #} {% macro trackingSummary(sens, transporteur, numero, publicUrl, lastStatus, checkedAt, deliveredAt, trackable) %}

{{ transporteur ? transporteur.label : 'Transporteur inconnu' }} {{ numero }} {% if lastStatus %} {{ lastStatus.label }} {% endif %} {% if publicUrl %}suivi public ↗{% endif %} {% if trackable %} {% endif %}

{% if checkedAt %}

Vérifié le {{ checkedAt|date('d/m/Y à H:i') }}{% if deliveredAt %} · livré le {{ deliveredAt|date('d/m/Y à H:i') }}{% endif %}

{% endif %} {% endmacro %} {% import _self as flow %}
Traitement
{# Badge de statut recopié dans l'en-tête de page par le JS après refresh AJAX. #} {# ---------- États terminaux : bandeau, pas d'étape en cours ---------- #} {% if s == 'refusee' %}
Demande refusée{% if demande.updatedAt %} le {{ demande.updatedAt|date('d/m/Y') }}{% endif %}. {% if demande.motifRefus %}
Motif : {{ demande.motifRefus|nl2br }}
{% endif %}
{% elseif s == 'livree' %}
Demande terminée — lames livrées à l'établissement{% if demande.trackingDeliveredAtRetour %} le {{ demande.trackingDeliveredAtRetour|date('d/m/Y à H:i') }}{% endif %}.
{% endif %} {# ---------- Étape en cours (bloc de gestion, en haut du fil) ---------- #} {% if currentStep %}
Étape en cours {% if currentStep == 'validation' %}

Validation de la demande

Vérifiez le volume annoncé puis validez : l'établissement recevra les instructions d'expédition de ses lames.

{% elseif currentStep == 'aller' %}

Expédition du colis vers l'atelier

Dès que l'établissement a remis son colis au transporteur, enregistrez le numéro de suivi : le client reçoit le lien de suivi et vous verrez le colis arriver.

{{ flow.trackingForm('aller', transporteurs, demande.transporteurAller, demande.numSuiviAller, demande.trackingUrlAller) }}
{% elseif currentStep == 'reception' %}

Réception à l'atelier

Le colis est en route. Dès qu'il arrive à l'atelier, validez la réception : le client saura que ses lames sont entre vos mains et l'affûtage peut commencer.

{% elseif currentStep == 'retour' %}

Affûtage terminé — expédition du retour

Une fois les lames affûtées et le colis retour déposé chez le transporteur, enregistrez son suivi : la demande passe en « Retour expédié » et le client reçoit « vos lames sont en route ».

{{ flow.trackingForm('retour', transporteurs, demande.transporteurRetour, demande.numSuiviRetour, demande.trackingUrlRetour) }}
{% elseif currentStep == 'livraison' %}

Livraison à l'établissement

Le retour est en route. La synchro du suivi passera la demande en « Livrée » automatiquement (toutes les 2 h) — ou validez-la manuellement dès confirmation. Aucun email client pour cette étape.

{% endif %}
{% endif %} {# ---------- Étapes passées (de la plus récente à l'origine, le fil descend) ---------- #}
    {% if s == 'livree' %}
  1. Livraison à l'établissement
    {% if demande.trackingDeliveredAtRetour %}
    le {{ demande.trackingDeliveredAtRetour|date('d/m/Y à H:i') }}
    {% endif %}
  2. {% endif %} {% if retourPose and s in ['expediee', 'livree'] %}
  3. Colis retour expédié vers l'établissement
    {{ flow.trackingSummary('retour', demande.transporteurRetour, demande.numSuiviRetour, demande.trackingPublicUrlRetour, demande.trackingLastStatusRetour, demande.trackingLastCheckedAtRetour, demande.trackingDeliveredAtRetour, retourTrackable) }} {% if peutSaisirRetour %} {% endif %}
  4. {% endif %} {% if s in ['recue', 'expediee', 'livree'] %}
  5. Lames reçues à l'atelier — affûtage
  6. {% endif %} {% if allerPose %}
  7. Colis expédié depuis l'établissement vers l'atelier
    {{ flow.trackingSummary('aller', demande.transporteurAller, demande.numSuiviAller, demande.trackingPublicUrlAller, demande.trackingLastStatusAller, demande.trackingLastCheckedAtAller, demande.trackingDeliveredAtAller, allerTrackable) }} {% if peutSaisirAller %} {% endif %}
  8. {% endif %} {% if s != 'nouvelle' %}
  9. {{ s == 'refusee' ? 'Demande refusée' : 'Validation de la demande' }}
    {% if s == 'refusee' and demande.motifRefus %}
    {{ demande.motifRefus }}
    {% endif %}
  10. {% endif %}
  11. Demande déposée
    le {{ demande.createdAt|date('d/m/Y à H:i') }} · {{ demande.nbCouteaux }} couteau{{ demande.nbCouteaux > 1 ? 'x' }}{% if demande.nbAutres > 0 %} + {{ demande.nbAutres }} autre{{ demande.nbAutres > 1 ? 's' }}{% endif %}