@php // Évalué une fois pour la page plutôt qu'à chaque ligne. $peutVoirClient = auth()->user()?->can('clients.view'); @endphp {{-- Deux lignes par intervention (.table-deux-lignes) : l'essentiel en haut, le détail en dessous, en petit (.ligne-2). Rien n'est caché — la version à une ligne, qui réduisait l'adresse à la ville, a été jugée trop serrée. Le texte coupé reste entier dans l'infobulle. --}} @forelse ($interventions as $i) @php $client = $i['CLIENT'] ?? null; $idClient = (int) ($client['IDCONTACT'] ?? 0); $rs = $client['RAISON_SOCIALE'] ?? null; $nomComplet = trim(($client['NOMFAMILLE'] ?? '') . ' ' . ($client['PRENOM'] ?? '')); $displayName = $rs ?: $nomComplet; // Le LIEU de l'intervention quand il est saisi, l'adresse du client // sinon (gestan_inter_adresse). $lieu = gestan_inter_adresse($i); $adresse = implode(', ', $lieu['lignes']); @endphp {{ $i['IDINTERVENTION'] }} {{-- Sans contact Gestan ou sans le droit de voir la fiche, le nom reste du texte plutôt qu'un lien mort. --}} @if ($idClient > 0 && $peutVoirClient) {{ $displayName ?: '—' }} @else {{ $displayName }} @endif @if ($lieu['lieu']) @endif {{ $adresse ?: '—' }} {{ $i['LIBINTER'] }} @include('admin.gestan.partials.badge-status', [ 'statut' => $i['ST_INTER'] ?? null, ]) @php // Saisie depuis 3 jours ou plus et toujours ouverte : même // pastille que l'échéance dépassée des commandes. $retard = gestan_inter_retard($i); // Prise en charge (PriseEnCharge) : qui y va, et quand. $prise = ($prises ?? collect())->get((int) $i['IDINTERVENTION']); // Rapports saisis dans le portail. Vert : tous injectés dans // Gestan ; orange : au moins un attend la validation de // l'accueil — tant qu'il en reste un, l'intervention ne peut // pas être terminée. Le détail est dans l'infobulle. $liste = ($rapports ?? collect())->get($i['IDINTERVENTION'], collect()); $dernier = $liste->first(); $nonSync = $liste->whereNull('approuve_le')->count(); @endphp @if ($retard || ($prise && $prise->users->isNotEmpty()) || $dernier) @if ($retard) {{ $retard['libelle'] }} @endif @if ($prise && $prise->users->isNotEmpty()) {{ \App\Services\Interventions\PriseEnCharge::noms($prise, court: true) }}@if ($prise->date_debut) · {{ $prise->date_debut->format('d/m H:i') }}@endif @endif @if ($dernier) @php $infobulle = __(':n rapport(s) — dernier le :date par :auteur', [ 'n' => $liste->count(), 'date' => $dernier->created_at->format('d/m/Y H:i'), 'auteur' => $dernier->contenu['signataire'] ?? '—', ]); if ($nonSync) { $infobulle .= ' — ' . __(':n en attente de validation', ['n' => $nonSync]); } @endphp {{ $liste->count() }} @endif @endif {{-- Statut de facturation (ST_FACT) : À FACTURER, FACTURÉE ou NON RENSEIGNÉ, libellés de mapStatusFact côté api. La date vit dans le champ texte libre DEMANDEUR de Gestan : même nettoyage que sur la fiche (show.blade.php). --}} @include('admin.gestan.partials.badge-status', [ 'statut' => $i['ST_FACT'] ?? null, ]) @php $dateFact = trim(html_entity_decode(strip_tags((string) ($i['DATE_FACTURATION'] ?? '')))); @endphp @if ($dateFact !== '') {{ $dateFact }} @endif {{-- Masquee sur les ecrans regroupes : l'en-tete de section porte deja le secteur (voir index.blade.php). --}} @unless ($parSecteur ?? false) {{ $i['SECTEUR'] }} @endunless {{ gestan_auteur_court($i['USCRE'] ?? null) }} {{ gestan_date_courte($i['DHCRE'] ?? null) }} {{ substr((string) gestan_normalize_datetime($i['DHCRE'] ?? null), 11, 5) }} {{-- À faire et en cours : le formulaire est dans le modal rendu sous le tableau de l'index. Un technicien qui vient de s'attribuer l'intervention la trouve « en cours » — c'est justement le moment où il saisit. --}} @if (gestan_inter_saisie_rapport($i)) @endif @empty Aucune intervention trouvée. @endforelse