@forelse(
$client->tarifsClients
->groupBy('service_id')
->sortBy(function ($tarifsDuService) {
return $tarifsDuService->first()?->service?->libelle ?? '';
})
as $serviceId => $tarifsDuService
)
@php
/*
|--------------------------------------------------------------------------
| Informations du service
|--------------------------------------------------------------------------
|
| Tous les tarifs présents dans ce groupe concernent
| le même service.
|
*/
$service = $tarifsDuService->first()?->service;
/*
|--------------------------------------------------------------------------
| Tri des tarifs du plus récent au plus ancien
|--------------------------------------------------------------------------
|
| Les tarifs datés apparaissent en premier.
| Les anciens tarifs historiques sans date apparaissent à la fin.
|
*/
$tarifsTries = $tarifsDuService->sortByDesc(function ($tarif) {
return $tarif->date_debut?->timestamp ?? 0;
});
@endphp
{{-- Ligne de séparation par service --}}
{{ $service?->libelle ?? 'Service introuvable' }}
@foreach($tarifsTries as $tarif)
@php
/*
|--------------------------------------------------------------------------
| Vérification d'un tarif plus récent
|--------------------------------------------------------------------------
|
| Comme nous sommes déjà dans le groupe du même service,
| il suffit de vérifier si un tarif daté plus récent existe.
|
| Aucune requête SQL supplémentaire n'est exécutée.
|
*/
$aUnTarifPlusRecent = $tarifsDuService->contains(
function ($autreTarif) use ($tarif) {
/*
* On ignore la ligne elle-même.
*/
if ((int) $autreTarif->id === (int) $tarif->id) {
return false;
}
/*
* Un tarif historique sans date
* n'est jamais considéré comme plus récent.
*/
if ($autreTarif->date_debut === null) {
return false;
}
/*
* Si le tarif actuel n'a pas de date,
* tout tarif daté est forcément plus récent.
*/
if ($tarif->date_debut === null) {
return true;
}
/*
* Sinon on compare simplement les dates.
*/
return $autreTarif->date_debut->gt(
$tarif->date_debut
);
}
);
@endphp
{{-- Le service est déjà affiché dans l'en-tête du groupe --}}
—