{# ── Page de garde ──────────────────────────────────────────────────────── #}
{% if personnalisation is defined and personnalisation.logo_rapports == 'true' and (personnalisation.logo_documents ?? '') %}
Logo
{% endif %}

Export PDF Sélectif HACCP

{{ restaurantNom }}

Période : {% if moisDebut == moisFin %} {{ moisNoms[moisDebut] }} {{ annee }} {% else %} {{ moisNoms[moisDebut] }} — {{ moisNoms[moisFin] }} {{ annee }} {% endif %}

Nombre de documents : {{ documents|length }}

Généré le : {{ generatedAt|date('d/m/Y à H:i') }}

{# Sommaire #}
Sommaire
{% for doc in documents %} {% endfor %}
FormulairePériodeStatut
{{ formTypes[doc.template_type].label ?? doc.template_type }} {{ moisNoms[doc.mois] }} {{ doc.annee }} {% if doc.status == 'finalized' %}Finalisé {% else %}Brouillon{% endif %}
{# ── Documents ──────────────────────────────────────────────────────────── #} {% for doc in documents %} {% set fd = doc.form_data ?? {} %} {% set typeLabel = formTypes[doc.template_type].label ?? doc.template_type %} {% set headerClass = 'header-' ~ doc.template_type %}
{% if personnalisation is defined and personnalisation.logo_rapports == 'true' and (personnalisation.logo_documents ?? '') %} {% endif %}
{{ typeLabel }} — {{ moisNoms[doc.mois] }} {{ doc.annee }}
{{ restaurantNom }}  |  Statut : {% if doc.status == 'finalized' %}✅ Finalisé{% else %}⏳ Brouillon{% endif %}  |  Document #{{ doc.id }}
Logo
Restaurant{{ restaurantNom }}
Responsable{{ fd.responsable ?? '—' }}
Mise à jour{{ fd.date_maj is defined ? fd.date_maj : '—' }}
{# ── LIVRAISONS ─────────────────────────────────────────────────────── #} {% if doc.template_type == 'livraisons' %} {% for entry in (fd.entries ?? []) %} {% set tDep = entry.temp_depart is not empty ? entry.temp_depart : null %} {% set tArr = entry.temp_arrivee is not empty ? entry.temp_arrivee : null %} {% set conforme = null %} {% if tDep is not null and tArr is not null %} {% if entry.liaison == 'chaude' %} {% set conforme = (tDep >= 63 and tArr >= 63) %} {% elseif entry.liaison == 'froide' %} {% set conforme = (tDep <= 4 and tArr <= 10) %} {% endif %} {% endif %} {% else %} {% endfor %}
DateLiaisonPlat H. dép.T° dép. H. arr.T° arr. ConformitéVisaObservations
{{ entry.date is not empty ? entry.date|date('d/m/Y') : '—' }} {% if entry.liaison == 'chaude' %}CHAUDE {% elseif entry.liaison == 'froide' %}FROIDE {% else %}—{% endif %} {{ entry.plat ?? '—' }} {{ entry.heure_depart is not empty ? entry.heure_depart : '—' }} {{ tDep is not null ? tDep ~ ' °C' : '—' }} {{ entry.heure_arrivee is not empty ? entry.heure_arrivee : '—' }} {{ tArr is not null ? tArr ~ ' °C' : '—' }} {% if conforme is not null %} {% if conforme %}✔ Conforme {% else %}✘ Non conf.{% endif %} {% else %}—{% endif %} {{ entry.visa_livreur ?? '—' }} {{ entry.observations ?? '—' }}
Aucune entrée.
{% if fd.observations_generales ?? '' %}
⚠ Observations générales :{{ fd.observations_generales }}
{% endif %} {# ── DISTRIBUTION ───────────────────────────────────────────────────── #} {% elseif doc.template_type == 'distribution' %}
Liaison froide
{% for entry in (fd.entries_froid ?? []) %} {% else %}{% endfor %}
DateRepasT° (°C)HeureConformeObservation
{{ entry.date ?? '—' }}{{ entry.repas ?? '—' }} {{ entry.temperature ?? '—' }} {{ entry.heure ?? '—' }} {% if entry.conforme ?? false %}{% else %}{% endif %} {{ entry.observation ?? '—' }}
Aucune entrée.
Liaison chaude
{% for entry in (fd.entries_chaud ?? []) %} {% else %}{% endfor %}
DateRepasT° (°C)HeureConformeObservation
{{ entry.date ?? '—' }}{{ entry.repas ?? '—' }} {{ entry.temperature ?? '—' }} {{ entry.heure ?? '—' }} {% if entry.conforme ?? false %}{% else %}{% endif %} {{ entry.observation ?? '—' }}
Aucune entrée.
{# ── TRAÇABILITÉ ────────────────────────────────────────────────────── #} {% elseif doc.template_type == 'tracabilite' %} {% for entry in (fd.entries ?? []) %} {% else %}{% endfor %}
Date repasMenu serviProduitsN° lotFournisseurVisa
{{ entry.date_repas ?? '—' }}{{ entry.menu_servi ?? '—' }} {{ entry.produits ?? '—' }}{{ entry.numero_lot ?? '—' }} {{ entry.fournisseur ?? '—' }}{{ entry.visa ?? '—' }}
Aucune entrée.
{# ── RÉCEPTION ──────────────────────────────────────────────────────── #} {% elseif doc.template_type == 'reception' %} {% for entry in (fd.entries ?? []) %} {% else %}{% endfor %}
DateFournisseurProduitN° lotT° (°C)DLCConformeObservationVisa
{{ entry.date ?? '—' }}{{ entry.fournisseur ?? '—' }} {{ entry.produit ?? '—' }}{{ entry.numero_lot ?? '—' }} {{ entry.temperature ?? '—' }} {{ entry.dlc ?? '—' }} {% if entry.conforme ?? false %}{% else %}—{% endif %} {{ entry.observation ?? '—' }} {{ entry.visa ?? '—' }}
Aucune entrée.
{# ── REFROIDISSEMENT ────────────────────────────────────────────────── #} {% elseif doc.template_type == 'refroidissement' %}
Refroidissement rapide (≥63°C → ≤10°C en ≤2h)
{% for entry in (fd.entries ?? []) %} {% else %}{% endfor %}
DatePlatH. débutT° initiale (°C)H. finT° finale (°C)Durée (min)Observation
{{ entry.date ?? '—' }} {{ entry.plat ?? '—' }} {{ entry.heure_debut ?? '—' }} {{ entry.temp_initiale ?? '—' }} {{ entry.heure_fin ?? '—' }} {{ entry.temp_finale ?? '—' }} {{ entry.duree ?? '—' }} {{ entry.observation ?? '—' }}
Aucune entrée.
{% if fd.remise_entries ?? [] %}
Remise en température (→ ≥63°C en ≤1h)
{% for entry in (fd.remise_entries ?? []) %} {% else %}{% endfor %}
DatePlatH. débutT° initiale (°C)H. finT° finale (°C)Durée (min)Observation
{{ entry.date ?? '—' }} {{ entry.plat ?? '—' }} {{ entry.heure_debut ?? '—' }} {{ entry.temp_initiale ?? '—' }} {{ entry.heure_fin ?? '—' }} {{ entry.temp_finale ?? '—' }} {{ entry.duree ?? '—' }} {{ entry.observation ?? '—' }}
Aucune entrée.
{% endif %} {# ── NETTOYAGE ──────────────────────────────────────────────────────── #} {% elseif doc.template_type == 'nettoyage' %} {% for catKey, cat in (fd.categories ?? {}) %}
{{ cat.titre ?? catKey }}
{% for item in (cat.items ?? []) %} {% for real in (item.realisations ?? []) %} {% endfor %} {% else %}{% endfor %}
Zone / ÉquipementFréquenceProduit utiliséRéalisations
{{ item.zone ?? '—' }} {{ item.frequence ?? '—' }} {{ item.produit ?? '—' }} {{ (item.realisations ?? [])|length }} réalisation(s)
└─ {{ real.date ?? '—' }} {{ real.responsable ?? '' }}{% if real.observations ?? '' %} — {{ real.observations }}{% endif %}
Aucun équipement.
{% else %}

Aucune catégorie de nettoyage enregistrée.

{% endfor %} {# ── TEMPÉRATURES ───────────────────────────────────────────────────── #} {% elseif doc.template_type == 'temperature' %} {% for eq in equipements %}
{{ eq.nom }} (seuils : {{ eq.temperature_min }}°C / {{ eq.temperature_max }}°C)
{% for jour in 1..31 %}{% endfor %} {% for jour in 1..31 %} {% set val = fd.equipements[eq.id ~ '_' ~ jour ~ '_arrivee'] ?? '' %} {% set ok = val != '' and val >= eq.temperature_min and val <= eq.temperature_max %} {% endfor %} {% for jour in 1..31 %} {% set val = fd.equipements[eq.id ~ '_' ~ jour ~ '_depart'] ?? '' %} {% set ok = val != '' and val >= eq.temperature_min and val <= eq.temperature_max %} {% endfor %}
Mesure{{ jour }}
Arrivée{{ val }}
Départ{{ val }}
{% endfor %} {# ── ORIGINE VIANDES ────────────────────────────────────────────────── #} {% elseif doc.template_type == 'origine_viandes' %} {% for key, viande in (fd.viandes ?? {}) %} {% else %}{% endfor %}
Animal / EspèceMarque / FournisseurPays d'origineCertification
{{ viande.espece ?? key }} {{ viande.fournisseur ?? '—' }} {{ viande.pays_origine ?? '—' }} {{ viande.certification ?? '—' }}
Aucune donnée.
{# ── AUTRES / FALLBACK ──────────────────────────────────────────────── #} {% else %}

Aperçu non disponible pour ce type de formulaire. Utilisez le PDF individuel pour une vue complète.

{% endif %} {# Signature si présente #} {% if (fd.signature_nom ?? '') != '' or (fd.signature_date ?? '') != '' %}
Signature
Nom : {{ fd.signature_nom ?? '' }}    Date : {{ fd.signature_date ?? '' }} {% if fd.signature_certif ?? false %}   ✅ Certifié exact{% endif %}
{% endif %}
{% endfor %}