@extends('admin.layout') @section('title', __('Statistiques')) {{-- Devis et factures (StatController). L'échelle donne la taille de la période regardée — un jour, un mois, une année — et toute la page porte sur elle : les chiffres, où, pour qui, par qui, puis ses documents. Le graphique montre ce qu'il y a autour, la barre choisie mise en avant ; un clic sur une autre barre, les flèches ou le champ de date la changent. Le bouton Nombre / Montant TTC vaut pour le graphique, le tri des classements et la comparaison avec l'an dernier. Montants TTC. Factures émises seulement, à leur date de facture. Le trait en pointillé sur chaque barre, c'est la même période un an plus tôt. --}} @section('content') @php $base = ['quoi' => $quoi, 'echelle' => $echelle, 'mesure' => $mesure, 'periode' => $periode]; $lien = fn (array $modifs) => route('stats.index', array_filter( array_merge($base, $modifs), fn ($v) => $v !== null && $v !== '' )); $euros = fn ($v) => number_format((float) $v, 0, ',', ' ') . ' €'; $court = fn ($v) => $v >= 1000000 ? number_format($v / 1000000, 1, ',', ' ') . ' M€' : ($v >= 1000 ? number_format($v / 1000, 0, ',', ' ') . ' k€' : number_format($v, 0, ',', ' ') . ' €'); $nombre = fn ($v) => number_format((int) $v, 0, ',', ' '); // La hauteur des barres et des traits de l'an dernier, sur la même échelle. $valeur = fn (?array $p) => $p === null ? 0 : ($mesure === 'ttc' ? (float) ($p['ttc'] ?? 0) : (int) ($p['n'] ?? 0)); $max = max(1, ...array_map(fn ($b) => max($valeur($b['n'] === null ? null : $b), $valeur($b['avant'])), $barres ?: [['n' => 0, 'ttc' => 0, 'avant' => null]])); $documentsLibelle = $quoi === 'factures' ? __('factures') : __('devis'); $routeDocument = $quoi === 'factures' ? 'factures.show' : 'devis.show'; @endphp

{{ __('Statistiques') }}

{{-- Échelle, période, mesure --}}
@foreach (['jour' => __('Jour'), 'mois' => __('Mois'), 'annee' => __('Année'), 'tout' => __('Tout')] as $cle => $libelle) {{ $libelle }} @endforeach
{{-- La période regardée : les flèches, et pour un jour ou un mois le champ où la choisir directement. Il se soumet seul, pas de bouton à chercher. --}} {{-- « Tout » n'a pas de période à choisir : c'est tout l'historique. --}} @unless ($tout)
@if ($echelle === 'jour') @elseif ($echelle === 'mois') @else {{-- Toutes les années du graphique, la plus récente en tête : aller en 2020 demandait six clics sur la flèche. --}} @endif
@endunless
@if ($indisponible)
{{ __('Statistiques momentanément indisponibles — la liaison Gestan ne répond pas.') }}
@else
{{ $titrePeriode }}
{{-- Les chiffres de la période choisie --}}
@foreach ($chiffres as $chiffre)
{{ $chiffre['libelle'] }}
{{ $chiffre['valeur'] }}
@if (!empty($chiffre['note']))
{{ $chiffre['note'] }}
@endif
@endforeach
{{-- Graphique : ce qu'il y a autour de la période, une barre et un lien par période ; le pointillé, la même un an plus tôt. --}}
@foreach ($barres as $b) @php $v = $b['n'] === null ? 0 : $valeur($b); $infobulle = $b['titre'] . ($b['n'] === null ? '' : ' : ' . $nombre($b['n']) . ' ' . $documentsLibelle . ' · ' . $euros($b['ttc'])) . ($b['avant'] ? ' — ' . __('un an plus tôt : :n · :e', ['n' => $nombre($b['avant']['n']), 'e' => $euros($b['avant']['ttc'])]) : ''); @endphp @if ($b['n'] === null)
@if ($b['avant'] && $valeur($b['avant']) > 0) @endif
{{ $b['libelle'] }}
@else {{-- Depuis « Tout », une barre mène à son année. --}}
@if ($v > 0) {{ $mesure === 'ttc' ? $court($v) : $nombre($v) }}
@endif @if ($b['avant'] && $valeur($b['avant']) > 0) @endif
{{ $b['libelle'] }}
@endif @endforeach
@if ($tout) {{ __('un clic sur une barre ouvre son année') }} @else @if ($grain !== 'annee') {{ __('la même période un an plus tôt') }} · @endif {{ __('la barre foncée est la période affichée, un clic sur une autre la change') }} @endif
@endif
@if (!$indisponible) {{-- Où, pour qui, par qui, sur la période choisie --}}
{{ $titrePeriode }} — {{ $mesure === 'nombre' ? __('classés au nombre') : __('classés au montant TTC') }}
@if (!$repartition)

{{ __('Détail momentanément indisponible — la liaison Gestan ne répond pas.') }}

@elseif ($repartition['total']['n'] === 0)

{{ $quoi === 'factures' ? __('Aucune facture émise sur cette période.') : __('Aucun devis sur cette période.') }}

@else @php $departements = config('departements', []); // Un devis n'est pas encore de l'argent : sur cet onglet, // on classe ce qui a été devisé. Et au nombre, on ne dit // pas « rapportent ». $titreClients = match ([$quoi, $mesure]) { ['factures', 'ttc'] => __('Clients qui rapportent le plus'), ['factures', 'nombre'] => __('Clients les plus facturés'), ['devis', 'ttc'] => __('Clients aux plus gros devis'), ['devis', 'nombre'] => __('Clients aux plus nombreux devis'), }; $blocs = [ ['titre' => $titreClients, 'lignes' => $repartition['clients'], 'client' => true], ['titre' => __('Commerciaux'), 'lignes' => $repartition['commerciaux']], ['titre' => __('Villes'), 'lignes' => $repartition['villes']], ['titre' => __('Départements'), 'lignes' => array_map(fn ($d) => ['libelle' => trim($d['libelle'] . ' ' . ($departements[$d['libelle']] ?? ''))] + $d, $repartition['departements'])], ]; @endphp
@foreach ($blocs as $bloc) @php $haut = max(1, ...array_map(fn ($l) => $valeur($l), $bloc['lignes'] ?: [['n' => 0, 'ttc' => 0]])); @endphp
{{ $bloc['titre'] }}
@if (empty($bloc['lignes']))

{{ __('Rien sur cette période.') }}

@else
@foreach ($bloc['lignes'] as $l) @php $nom = $l['libelle'] !== '' ? $l['libelle'] : __('Non renseigné'); @endphp @if (!empty($bloc['client']) && !empty($l['id'])) {{ $nom }} @else {{ $nom }} @endif
{{-- La mesure choisie d'abord, l'autre en petit. --}} @if ($mesure === 'nombre') {{ $nombre($l['n']) }}· {{ $euros($l['ttc']) }} @else {{ $euros($l['ttc']) }}· {{ $nombre($l['n']) }} @endif @endforeach
@endif
@endforeach
@endif
{{-- Les documents de la période --}} @if ($documents && $documents->total() > 0)
{{ ucfirst($documentsLibelle) }} — {{ $titrePeriode }} ({{ $nombre($documents->total()) }})
@foreach ($documents as $d) @endforeach
{{ __('N°') }} {{ __('Client') }} {{ __('Ville') }} {{ __('Nature') }} {{ __('Commercial') }} {{ __('Statut') }} {{ __('TTC') }} {{ __('Date') }}
{{ $d['id'] }} @if ($d['idc']) {{ $d['client'] }} @else {{ $d['client'] }} @endif {{ $d['ville'] }} {{ $d['libelle'] }} {{ $d['commercial'] }} @include('admin.gestan.partials.badge-status', ['statut' => $d['statut']]) {{ number_format((float) $d['ttc'], 2, ',', ' ') }} € {{ $d['date'] }}
{{ $documents->links() }}
@endif @endif
@endsection