@extends('admin.layout') @section('title', "Intervention #{$intervention['IDINTERVENTION']}") @section('content') @include('admin.gestan._stale_banner') {{-- Messages : sur-place.js les fait flotter en haut a droite. --}}
@if (session('success'))
{{ session('success') }}
@endif @if (session('error'))
{{ session('error') }}
@endif @if (session('warning'))
{{ session('warning') }}
@endif
@php // La date vit dans le champ texte libre DEMANDEUR de Gestan : on la // nettoie d'un éventuel HTML au lieu de la recracher telle quelle. $dateFact = trim(html_entity_decode(strip_tags((string) ($intervention['DATE_FACTURATION'] ?? '')))); // Où se passe l'intervention : le LIEU saisi dans Gestan, sinon // l'adresse du client. L'itinéraire, la carte (_carte_lieu) et le // forfait de déplacement (_tarif) partent tous de là. $lieu = gestan_inter_adresse($intervention); $adresseClient = $client ? collect([ $client['ADRESSEP1'] ?? '', $client['ADRESSEP2'] ?? '', trim(($client['CPOSTALP'] ?? '') . ' ' . ($client['VILLEP'] ?? '')), ])->map(fn ($l) => trim((string) $l))->filter()->implode(', ') : ''; // Le rapport Gestan est souvent vide : sans texte, pas de ligne. $rapportGestan = trim(strip_tags((string) ($intervention['RAPINTER'] ?? ''))); // Prise en charge : l'en-tête porte le bouton, _prise le détail. $moi = auth()->user(); $preneurs = $prise?->users ?? collect(); $aMoi = $preneurs->contains('id', $moi->id); $aUnAutre = !$aMoi && $preneurs->isNotEmpty(); $peutPrendre = $moi->can('interventions.prendre') && ($intervention['ST_INTER'] ?? null) !== 'TERMINÉ'; $qui = $prise ? \App\Services\Interventions\PriseEnCharge::noms($prise) : ''; $saisieRapport = gestan_inter_saisie_rapport($intervention); // Un seul bouton plein dans l'en-tête : la prise en charge s'il y a // lieu, sinon le rapport. $boutonPrise = $peutPrendre && !$aMoi; @endphp
{{-- ======================== --}} {{-- En-tête --}} {{-- ======================== --}} {{-- Ce qu'on vient chercher d'un coup d'œil (états, facturation) et ce qu'on vient faire (prendre, rapporter, facturer), avant tout le reste. --}} @include('admin._retour', ['vers' => route('interventions.index')])

#{{ $intervention['IDINTERVENTION'] }} @if (!empty($intervention['LIBINTER'])) · {{ $intervention['LIBINTER'] }} @endif

@include('admin.gestan.partials.badge-status', [ 'statut' => $intervention['ST_INTER'] ?? null, ]) @if (!empty($intervention['PRIORITE'])) {{ $intervention['PRIORITE'] }} @endif {{ __('Facturation') }} : {{ $dateFact !== '' ? $dateFact : __('non renseignée') }} @include('admin.gestan.partials.badge-status', [ 'statut' => $intervention['ST_FACT'] ?? null, ])
{{ __('Créée par :qui', ['qui' => $intervention['USCRE'] ?? '—']) }} · {{ gestan_date_fr($intervention['DHCRE'] ?? null) }}
@if ($boutonPrise) @endif @if ($saisieRapport) {{ __('Créer un rapport') }} @endif {{-- Seulement à faire ou en cours : la fiche se remplit chez le client, avant de clore. --}} @if (\App\Models\FicheIntervention::seSaisitSur($intervention)) @can('fiche_interventions.create') {{ __("Fiche d'intervention") }} @endcan @endif
{{-- ======================== --}} {{-- Client, lieu et prix --}} {{-- ======================== --}} {{-- À droite sur PC, en premier sur téléphone : sur le terrain, on appelle et on part avant de lire le reste. --}}
{{ __('Client') }}
@if ($client) @php $nomClient = $client['RAISON_SOCIALE'] ?: trim(($client['NOMFAMILLE'] ?? '') . ' ' . ($client['PRENOM'] ?? '')); @endphp
@if ($idClient) {{ $nomClient }} @else {{ $nomClient }} @endif
@if (!empty($client['TELP1']))
{{ $client['TELP1'] }}
@endif @if (!empty($client['EMAILP']))
{{ $client['EMAILP'] }}
@endif @if (!empty($client['TELP1']) || !empty($client['EMAILP']))
@if (!empty($client['TELP1'])) {{ __('Appeler') }} @endif @if (!empty($client['EMAILP'])) {{ __('Mail') }} @endif
@endif @else {{ __('Aucun client associé dans Gestan.') }} @endif
@if ($lieu['lignes'])
{{ $lieu['lieu'] ? __("Lieu d'intervention") : __('Adresse') }}
@foreach ($lieu['lignes'] as $ligne) {{ $ligne }}@unless ($loop->last)
@endunless @endforeach
{{-- Le client est ailleurs : son adresse reste lisible, c'est celle de la facture. --}} @if ($lieu['lieu'] && $adresseClient !== '')
{{ __('Adresse du client :') }} {{ $adresseClient }}
@endif @include('admin.gestan._carte_lieu')
@endif @include('admin.gestan.interventions._tarif')
{{-- ======================== --}} {{-- Demande et suivi --}} {{-- ======================== --}} {{-- Dans l'ordre du déroulé : qui y va, ce qu'il en a rapporté, ce qu'il a fait signer. --}}
{{ __('La demande') }}
{!! $intervention['DESCINTER'] ?? '—' !!}
@if ($rapportGestan !== '')
{{ __('Rapport Gestan') }}
{!! $intervention['RAPINTER'] !!}
@endif
@include('admin.gestan.interventions._prise') {{-- ======================== --}} {{-- Rapports saisis (JSON) --}} {{-- ======================== --}} @php $enAttente = $rapports->whereNull('approuve_le')->count(); $terminee = $cloture && $cloture->statut === \App\Models\InterventionCloture::STATUT_TERMINEE; @endphp
{{ __('2 · Rapports saisis') }} {{ $rapports->count() }}
@if ($rapports->isEmpty())
{{ __('Aucun rapport pour l\'instant.') }} @if ($saisieRapport) {{ __('Créer un rapport') }} @endif
@else {{-- Bandeau de cloture, reserve a l'accueil et aux administrateurs. « Terminer » injecte tous les rapports dans Gestan en une ecriture puis bascule l'etat ; il reste desactive tant qu'un rapport attend une validation. --}} @canany(['interventions.approuver', 'interventions.terminer'])
@if ($terminee) {{ __('Intervention terminée : les rapports sont dans Gestan.') }} @if ($cloture->terminee_le) ({{ $cloture->terminee_le->format('d/m/Y H:i') }}{{ $cloture->terminePar ? ' — ' . $cloture->terminePar->prenom : '' }}) @endif @elseif ($enAttente) {{ __(':n rapport(s) attendent votre validation.', ['n' => $enAttente]) }} @else {{ __("Tous les rapports sont approuvés. L'intervention peut être terminée.") }} @endif
@if (!$terminee && $enAttente) @can('interventions.approuver')
@csrf
@endcan @endif @can('interventions.terminer') @if ($terminee)
@csrf
@else
@csrf
@endif @endcan
@endcanany {{-- Une carte par rapport plutôt qu'un tableau à sept colonnes : le texte a la largeur, et ça tient sur téléphone. --}}
@foreach ($rapports as $r)
{{ $r->contenu['signataire'] ?? ($r->user->nom ?? '—') }} @if (!empty($r->contenu['duree'])) · {{ $r->contenu['duree'] }} @endif
{{ $r->created_at->format('d/m/Y H:i') }}
{{-- Trois etats, dans l'ordre du parcours : le rapport attend l'accueil, il est approuve, il est parti dans Gestan a la cloture. --}} @if ($r->synced_at) {{ __('Dans Gestan') }} @elseif ($r->approuve_le) {{ __('Approuvé') }} @else {{ __("Attend l'accueil") }} @endif @if ($r->corrige_le) {{ __('Modifié par :qui', ['qui' => $r->corrigePar?->prenom ?? __("l'accueil")]) }} @endif
@if (!empty($r->contenu['rapport']))
{!! nl2br(e($r->contenu['rapport'])) !!}
@endif {{-- Une image se regarde, un PDF s'ouvre : le type se lit sur l'extension (Document::estImage). --}} @if ($r->documents->isNotEmpty())
@foreach ($r->documents as $piece) {{-- Un vocal s'écoute sur place, hors du lien : cliquer sur lecture ne doit pas ouvrir le fichier. --}} @if ($piece->estAudio()) @continue @endif estImage()) data-visionneuse="rapport-{{ $r->id }}" data-legende="{{ $piece->description ?: __('Pièce jointe') }}" title="{{ __('Voir en grand') }}" @else title="{{ __('Pièce jointe') }}" @endif> @if ($piece->estImage()) {{ __('Pièce jointe') }} @else PDF @endif @endforeach
@endif @php $peutModifier = $r->user_id === auth()->id() && ($intervention['ST_INTER'] ?? null) !== 'TERMINÉ'; $peutApprouver = !$r->approuve_le && auth()->user()->can('interventions.approuver'); @endphp @if ($peutModifier || $peutApprouver)
@if ($peutModifier) {{ __('Modifier') }} @endif {{-- Validation par l'accueil. Deux chemins pour un seul geste : approuver tel quel, ou retoucher la formulation et approuver dans la foulee. --}} @if ($peutApprouver)
@csrf
@endif
@endif
@endforeach
{{-- Modales de correction, posees hors de la liste pour que Bootstrap les retrouve à la racine du bloc. --}} @can('interventions.approuver') @foreach ($rapports->whereNull('approuve_le') as $r) @endforeach @endcan @endif
@include('admin.gestan.interventions.fiches._liste')
{{-- ======================== --}} {{-- Chantiers, historique --}} {{-- ======================== --}} {{-- Le contexte du client, en bas et en onglets : on y vient pour vérifier, pas pour agir. --}}
{{-- Même accordéon que la fiche client, réduit aux chantiers de pose et de maçonnerie (InterventionController::TYPES_CHANTIER) : les cartes d'intervention ont le bloc « Prise en charge ». --}}
@if ($planningsIndisponible)
{{ __('Plannings momentanément indisponibles — la liaison ne répond pas.') }}
@elseif (!empty($plannings)) @include('admin.gestan.clients._plannings_accordion', [ 'chantiers' => $plannings, 'accordionId' => 'accordionPlanningsInter', 'interventionCourante' => $intervention['IDINTERVENTION'], ]) @else

{{ __('Aucun chantier de pose ou de maçonnerie pour ce client.') }}

@endif
@if (!empty($intervention['historique']))
@foreach ($intervention['historique'] as $h) @php $itemId = 'histo_' . $h['IDINTERVENTION']; $isOpen = $loop->first; @endphp

Libellé {{ $h['LIBINTER'] ?? '—' }}
Description
{!! $h['DESCINTER'] ?? '—' !!}
Créée par {{ $h['USCRE'] ?? '—' }}
{{ gestan_date_fr($h['DHCRE'] ?? null) }}
Statut facturation @include('admin.gestan.partials.badge-status', [ 'statut' => $h['ST_FACT'] ?? null, ])
Priorité {{ $h['PRIORITE'] ?? '—' }}
@endforeach
@else

{{ __('Aucune intervention précédente pour ce client.') }}

@endif
@if ($client && $idClient) @can('photos.view')
@include('admin.gestan.clients._photos')
@endcan @endif
{{-- Calendrier de la prise en charge : le même que les formulaires du planning (flatpickr, chargé par le layout), week-ends, jours fériés et dates bloquées non cliquables. --}} {{-- Le bouton de l'en-tête déroule le formulaire de prise en charge, qui peut être loin sur téléphone (le client et le lieu passent devant) : on l'amène à l'écran. --}} @endsection