++ fix e controlli
This commit is contained in:
@@ -115,14 +115,27 @@ class Home extends Component
|
||||
}
|
||||
|
||||
// Average assignment duration in months (current year only, matches old app "Media Percorrenza Congregazione")
|
||||
//
|
||||
// Il calcolo sta in PHP e non in SQL. La versione precedente usava
|
||||
// DATEDIFF() e YEAR(), che sono funzioni MySQL: rendevano questa pagina
|
||||
// — la piu' visitata dell'applicazione — l'unica non verificabile dalla
|
||||
// suite di test, che gira su SQLite. Il costo e' due colonne di date per
|
||||
// le assegnazioni chiuse di un anno di servizio: qualche centinaio di
|
||||
// righe, non un tavolo intero.
|
||||
//
|
||||
// I due filtri sono quelli di prima: le date assurde arrivate dalla
|
||||
// conversione del vecchio database, e le durate non positive, che
|
||||
// altrimenti abbasserebbero la media senza significare niente.
|
||||
$avgGiorni = null;
|
||||
if ($annoCorrente) {
|
||||
$avgGiorni = Assegnazione::where('anno_teocratico_id', $annoCorrente->id)
|
||||
$durate = Assegnazione::where('anno_teocratico_id', $annoCorrente->id)
|
||||
->whereNotNull('returned_at')
|
||||
->whereRaw('YEAR(assigned_at) >= 1900')
|
||||
->whereRaw('DATEDIFF(returned_at, assigned_at) > 0')
|
||||
->selectRaw('AVG(DATEDIFF(returned_at, assigned_at)) as media_giorni')
|
||||
->value('media_giorni');
|
||||
->get(['assigned_at', 'returned_at'])
|
||||
->filter(fn (Assegnazione $a) => $a->assigned_at?->year >= 1900)
|
||||
->map(fn (Assegnazione $a) => $a->assigned_at->diffInDays($a->returned_at, false))
|
||||
->filter(fn (float $giorni) => $giorni > 0);
|
||||
|
||||
$avgGiorni = $durate->isEmpty() ? null : $durate->avg();
|
||||
}
|
||||
$mediaDurataPercorrenzaMesi = $avgGiorni ? round($avgGiorni / 30.44, 1) : 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user