{% extends 'app/base.html.twig' %} {% block title %}Déchets alimentaires{% endblock %} {% block body %}

Déchets alimentaires

Gaspillage alimentaire — suivi mensuel
Suivis individuels {% if is_granted('ROLE_TENANT_GESTIONNAIRE') %} Objectifs Nouveau relevé {% endif %}
{# ── Sélecteur de mois ────────────────────────────────────────────────────── #}
{# ── KPIs ─────────────────────────────────────────────────────────────────── #} {% set objectifVal = objectifGlobal ? objectifGlobal.objectif_par_convive : 150 %} {% set seuilAlerte = objectifGlobal ? objectifGlobal.seuil_alerte : 180 %} {% set variation = kpisPrecedent.total_kg > 0 ? ((kpis.total_kg - kpisPrecedent.total_kg) / kpisPrecedent.total_kg * 100) : null %} {% set objectifAtteint = kpis.total_kg > 0 and kpis.grammes_par_convive <= objectifVal %}
Total déchets
{{ kpis.total_kg|number_format(1, ',', ' ') }} kg
{% if variation is not null %}
{{ variation|abs|number_format(1) }}% vs mois préc.
{% else %}
Pas de comparaison
{% endif %}
Grammes / convive
{% set gColor = kpis.grammes_par_convive <= objectifVal ? 'success' : (kpis.grammes_par_convive <= seuilAlerte ? 'warning' : 'danger') %}
{{ kpis.grammes_par_convive|number_format(0) }} g
{{ kpis.total_convives }} convive(s)
Moyenne / jour
{{ kpis.nb_jours > 0 ? (kpis.total_kg / kpis.nb_jours)|number_format(1, ',', ' ') : '0,0' }} kg
{{ kpis.nb_jours }} jour(s) de relevé
Objectif
{% if kpis.total_kg > 0 %}
{{ objectifAtteint ? '✓ Atteint' : '✗ Dépassé' }}
≤ {{ objectifVal|number_format(0) }} g/convive
{% else %}
Aucune donnée
{% endif %}
{# ── Graphiques ───────────────────────────────────────────────────────────── #} {% if stats is not empty %}
Évolution journalière
Répartition par catégorie
{% endif %} {# ── Zones ────────────────────────────────────────────────────────────────── #} {% if zones is not empty %}
Performance par zone
{% for z in zones %} {% set zClass = z.grammes_par_convive <= objectifVal ? 'success' : (z.grammes_par_convive <= seuilAlerte ? 'warning' : 'danger') %} {% endfor %}
Zone Total kg g / convive Relevés Statut
{{ z.zone }} {{ z.total_kg|number_format(2, ',', ' ') }} kg {{ z.grammes_par_convive|number_format(0) }} g {{ z.nb_releves }} {{ zClass == 'success' ? 'OK' : (zClass == 'warning' ? 'Alerte' : 'Critique') }}
{% endif %} {# ── Tableau des relevés ──────────────────────────────────────────────────── #}
Relevés du mois
{{ releves|length }} relevé(s)
{% if releves is empty %}
Aucun relevé pour ce mois {% if is_granted('ROLE_TENANT_GESTIONNAIRE') %} {% endif %}
{% else %}
{% for r in releves %} {% endfor %}
Date Service Catégorie Quantité Convives Zone Notes
{{ r.date_releve|date('d/m/Y') }} {{ r.service == 'dejeuner' ? 'Déjeuner' : 'Dîner' }} {{ r.categorie_nom ?? '—' }} {{ r.quantite|number_format(3, ',', ' ') }} {{ r.unite }} {{ r.nb_convives > 0 ? r.nb_convives : '—' }} {{ r.zone ?: '—' }} {{ r.notes ?: '—' }} {% if is_granted('ROLE_TENANT_GESTIONNAIRE') %}
{% endif %}
{% endif %}
{# ── Chart.js ─────────────────────────────────────────────────────────────── #} {% if stats is not empty %} {% endif %} {% endblock %}