@extends('admin.layout') @section('title', 'Fiche client') @section('content') @include('admin.gestan._stale_banner') @if (!empty($listesIndisponibles))
{{ __('Devis, factures, interventions ou commandes de ce client n’ont pas pu être chargés : la liaison Gestan ne répond pas et aucune copie n’existe encore. Une liste vide ci-dessous ne veut pas dire qu’il n’y a rien.') }}
@endif @php $nomClient = $client['RAISON_SOCIALE'] ?: trim(($client['NOMFAMILLE'] ?? '') . ' ' . ($client['PRENOM'] ?? '')); $nomContact = trim(($client['NOMFAMILLE'] ?? '') . ' ' . ($client['PRENOM'] ?? '')); // Même adresse que la fiche intervention quand aucun LIEU n'est saisi : // la carte (_carte_lieu) en part. $lieu = gestan_inter_adresse(['CLIENT' => $client]); $euros = fn ($v) => number_format((float) $v, 2, ',', ' ') . ' €'; $depuis = substr((string) gestan_normalize_datetime((string) ($client['DHCRE'] ?? '')), 0, 4); $interventionsOuvertes = collect($enCours)->where('type', __('Intervention'))->count(); $prochainPlanning = collect($chantiers) ->filter(fn ($ch) => !empty($ch['date_debut']) && \Illuminate\Support\Carbon::parse($ch['date_debut'])->gte(now()->startOfDay())) ->sortBy('date_debut') ->first(); // Onglets du bas : on ouvre le premier qui a quelque chose à montrer. $onglets = [ 'devis' => [__('Devis'), $devisTotal], 'factures' => [__('Factures'), $facturesTotal], 'interventions' => [__('Interventions'), $interventionsTotal], 'plannings' => [__('Plannings'), $chantiersTotal], 'commandes' => [__('Commandes'), $commandesTotal], 'photos' => [__('Photos'), $photos->sum->count()], 'activites' => [__('Activités'), $activitesTotal ?? 0], ]; // Sans le droit de voir la photothèque, pas d'onglet (et rien de chargé). if (!auth()->user()?->can('photos.view')) { unset($onglets['photos']); } $ongletActif = collect($onglets)->filter(fn ($o) => $o[1] > 0)->keys()->first() ?? 'devis'; @endphp
{{-- ======================== --}} {{-- En-tête --}} {{-- ======================== --}} {{-- Ce qui saute aux yeux quand le client appelle : ce qu'il doit, ce qui est en cours chez lui. Les chiffres viennent de tout l'historique (ClientService::chiffres). --}} @include('admin._retour', ['vers' => route('clients.index')])

{{ $nomClient }} · {{ __('client') }} {{ $client['IDCONTACT'] }}

@if ($chiffres && $chiffres['a_relancer']['count'] > 0) {{ trans_choice('{1}1 facture à relancer|[2,*]:n factures à relancer', $chiffres['a_relancer']['count'], ['n' => $chiffres['a_relancer']['count']]) }} · {{ $euros($chiffres['a_relancer']['ttc']) }} @elseif ($chiffres && $chiffres['du'] > 0) {{ __(':montant à encaisser', ['montant' => $euros($chiffres['du'])]) }} @endif @if ($interventionsOuvertes) {{ trans_choice('{1}1 intervention en cours|[2,*]:n interventions en cours', $interventionsOuvertes, ['n' => $interventionsOuvertes]) }} @endif @if ($prochainPlanning) {{ __('Planning le :date', ['date' => \Illuminate\Support\Carbon::parse($prochainPlanning['date_debut'])->format('d/m/Y')]) }} @endif
{{ __('Créé par :qui', ['qui' => $client['USCRE'] ?? '—']) }} · {{ gestan_date_fr($client['DHCRE'] ?? null) }}
@if (!empty($client['TELP1'])) {{ __('Appeler') }} @endif @if (!empty($client['EMAILP'])) {{ __('Mail') }} @endif
{{-- ======================== --}} {{-- Coordonnées et chiffres --}} {{-- ======================== --}} {{-- À droite sur PC, en premier sur téléphone, comme la fiche intervention. --}}
{{ __('Coordonnées') }}
@if ($client['RAISON_SOCIALE'] && $nomContact !== '' && $nomContact !== $client['RAISON_SOCIALE'])
{{ $nomContact }}
@endif
@if (!empty($client['TELP1'])) {{ $client['TELP1'] }} @else {{ __('Pas de téléphone') }} @endif
@if (!empty($client['EMAILP'])) {{ $client['EMAILP'] }} @else {{ __('Pas d\'email') }} @endif
@if ($lieu['lignes'])
{{ __('Adresse') }}
@foreach ($lieu['lignes'] as $ligne) {{ $ligne }}@unless ($loop->last)
@endunless @endforeach
@include('admin.gestan._carte_lieu')
@endif {{-- Factures sommées par l'api sur tout l'historique, en TTC : le reste dû est ce qu'on réclame au client. Un brouillon ne compte pas comme facturé, mais se signale : c'est souvent une facture oubliée. --}} @if ($chiffres)
{{ __('En chiffres') }} ({{ __('TTC') }})
{{ __('Facturé') }}
{{ $euros($chiffres['facture']) }}
{{ __('Réglé') }}
{{ $euros($chiffres['regle']) }}
{{ __('Reste dû') }}
{{ $euros($chiffres['du']) }}
@if ($chiffres['a_relancer']['ttc'] > 0 && $chiffres['a_relancer']['ttc'] < $chiffres['du'])
{{ __('dont :montant à relancer', ['montant' => $euros($chiffres['a_relancer']['ttc'])]) }}
@endif
@if ($depuis !== '')
{{ __('Client depuis') }}
{{ $depuis }}
@endif
@if ($chiffres['brouillons']['count'] > 0)
{{ trans_choice('{1}1 facture en brouillon|[2,*]:n factures en brouillon', $chiffres['brouillons']['count'], ['n' => $chiffres['brouillons']['count']]) }} ({{ $euros($chiffres['brouillons']['ttc']) }}), {{ __('non comptée(s) dans le facturé.') }}
@endif @if ($chiffres['_stale'])
{{ __('Dernière copie connue : Gestan ne répond pas.') }}
@endif
@endif
{{-- ======================== --}} {{-- En cours --}} {{-- ======================== --}} {{-- Ce qui attend quelqu'un, le client ou nous (ClientController::enCours) : l'argent dû d'abord, puis le terrain, puis le commercial. --}}
{{ __('En cours') }} {{ count($enCours) }}
@if (empty($enCours)) {{ __('Rien en attente pour ce client.') }} @else
@foreach ($enCours as $l) @include('admin.gestan.clients._ligne', ['l' => $l]) @endforeach
@endif
{{-- ======================== --}} {{-- Historique --}} {{-- ======================== --}} {{-- Une ligne par document plutôt qu'un accordéon par document : l'état, le montant et la date se lisent sans rien ouvrir. Les 20 derniers, puis « Voir tout ». --}}
@forelse ($devis as $d) @if ($loop->first)
@endif @include('admin.gestan.clients._ligne', ['l' => [ 'numero' => '#' . $d['IDFACTURE'], 'libelle' => $d['NATURE'] ?? null, 'sous' => collect([$d['US_RESP'] ?? null, $d['VREF'] ?? null])->filter()->implode(' · '), 'etat' => $d['STATUT_FAD'] ?? null, 'montant' => $d['MTT_TOTAL_TTC'] ?? null, 'date' => gestan_date_fr($d['DHCRE'] ?? null), 'url' => route('devis.show', $d['IDFACTURE']), ]]) @if ($loop->last)
@endif @empty

{{ __('Aucun devis trouvé.') }}

@endforelse @if ($devisTotal > count($devis)) {{ __('Voir tous les devis (:n)', ['n' => $devisTotal]) }} @endif
@forelse ($factures as $f) @if ($loop->first)
@endif @include('admin.gestan.clients._ligne', ['l' => [ 'numero' => '#' . $f['IDFACTURE'], 'libelle' => $f['NATURE'] ?? null, 'sous' => collect([$f['US_RESP'] ?? null, $f['VREF'] ?? null])->filter()->implode(' · '), 'etat' => $f['STATUT_FAD'] ?? null, 'montant' => $f['MTT_TOTAL_TTC'] ?? null, 'date' => gestan_date_fr($f['DHCRE'] ?? null), 'url' => route('factures.show', $f['IDFACTURE']), ]]) @if ($loop->last)
@endif @empty

{{ __('Aucune facture trouvée.') }}

@endforelse @if ($facturesTotal > count($factures)) {{ __('Voir toutes les factures (:n)', ['n' => $facturesTotal]) }} @endif
@forelse ($interventions as $i) @if ($loop->first)
@endif @include('admin.gestan.clients._ligne', ['l' => [ 'numero' => '#' . $i['IDINTERVENTION'], 'libelle' => $i['LIBINTER'] ?? null, 'sous' => $i['USCRE'] ?? null, 'etat' => $i['ST_INTER'] ?? null, 'date' => gestan_date_fr($i['DHCRE'] ?? null), 'url' => route('interventions.show', $i['IDINTERVENTION']), ]]) @if ($loop->last)
@endif @empty

{{ __('Aucune intervention enregistrée.') }}

@endforelse @if ($interventionsTotal > count($interventions)) {{ __('Voir toutes les interventions (:n)', ['n' => $interventionsTotal]) }} @endif
{{-- Les plannings gardent leur accordéon : un planning, c'est une équipe, des techniciens, des devis et des observations, pas une ligne. --}}
@if (!empty($chantiers)) @include('admin.gestan.clients._plannings_accordion') @if ($chantiersTotal > count($chantiers)) {{ __('Voir tous les plannings (:n)', ['n' => $chantiersTotal]) }} @endif @else

{{ __('Aucun planning trouvé.') }}

@endif
@forelse ($commandes as $c) @if ($loop->first)
@endif @include('admin.gestan.clients._ligne', ['l' => [ 'numero' => '#' . $c['id_process'], 'libelle' => $c['modele'] ?? null, 'sous' => collect([$c['type'] ?? null, $c['couleur'] ?? null, $c['finition'] ?? null])->filter()->implode(' · '), 'etat' => $c['etat'] ?? null, 'date' => gestan_date_fr($c['date_fabrication'] ?? null), 'url' => $c['lien_pdf'] ?? null, 'externe' => true, ]]) @if ($loop->last)
@endif @empty

{{ __('Aucune commande trouvée.') }}

@endforelse @if ($commandesTotal > count($commandes)) {{ __('Voir toutes les commandes (:n)', ['n' => $commandesTotal]) }} @endif
@isset($onglets['photos'])
@include('admin.gestan.clients._photos')
@endisset
@if (!empty($activitesIndisponible))
{{ __('Activités momentanément indisponibles — la liaison Pipedrive ne répond pas.') }}
@elseif (!empty($activites))
@include('admin.gestan.clients._rows_activites')
{{ __('Date') }} {{ __('Type') }} {{ __('Sujet') }} {{ __('Responsable') }} {{ __('État') }}
@if ($activitesTotal > count($activites)) {{ __('Voir toutes les activités (:n)', ['n' => $activitesTotal]) }} @endif @else {{-- Environ la moitié des contacts Gestan n'existe pas dans Pipedrive : ce cas est normal, ce n'est pas une panne. --}}

{{ __('Aucune activité pour ce client.') }}

@endif
@endsection