++ fix
This commit is contained in:
@@ -250,7 +250,7 @@ class Registro extends Component
|
||||
{
|
||||
$vuota = [
|
||||
'numero' => '',
|
||||
'riporto' => ['nome' => '', 'data' => ''],
|
||||
'riporto' => '',
|
||||
'assegnazioni' => $this->completaCelleS13([]),
|
||||
];
|
||||
|
||||
@@ -285,28 +285,29 @@ class Registro extends Component
|
||||
->get()
|
||||
->groupBy('territorio_id');
|
||||
|
||||
$rientriPrecedenti = $this->ultimiRientriPrimaDi(
|
||||
$assegnazioni->keys()->all(),
|
||||
$anno
|
||||
);
|
||||
|
||||
return $assegnazioni
|
||||
->map(function ($gruppo, $territorioId) use ($rientriPrecedenti) {
|
||||
->map(function ($gruppo) {
|
||||
$gruppo = $gruppo->values();
|
||||
|
||||
// I quattro gruppi "Assegnato a" ospitano le ultime quattro
|
||||
// assegnazioni, in ordine cronologico da sinistra.
|
||||
$ultime = $gruppo->slice(-self::S13_ASSEGNAZIONI_PER_RIGA)->values();
|
||||
// Il ciclo di registrazione è lungo quanto i gruppi "Assegnato
|
||||
// a": riempito il quarto si ricomincia da capo, come sul modulo
|
||||
// cartaceo si aprirebbe una riga nuova per quel territorio.
|
||||
// Cinque assegnazioni non mostrano quindi le ultime quattro, ma
|
||||
// solo la quinta, in prima colonna.
|
||||
$inizioCiclo = intdiv($gruppo->count() - 1, self::S13_ASSEGNAZIONI_PER_RIGA)
|
||||
* self::S13_ASSEGNAZIONI_PER_RIGA;
|
||||
|
||||
$celle = $ultime->map(fn (Assegnazione $a) => [
|
||||
'nome' => $a->proclamatore?->nome_completo ?? '',
|
||||
'assegnato_il' => $a->assigned_at?->format('d/m/Y') ?? '',
|
||||
'restituito_il' => $a->returned_at?->format('d/m/Y') ?? '',
|
||||
])->all();
|
||||
$celle = $gruppo
|
||||
->slice($inizioCiclo, self::S13_ASSEGNAZIONI_PER_RIGA)
|
||||
->map(fn (Assegnazione $a) => [
|
||||
'nome' => $a->proclamatore?->nome_completo ?? '',
|
||||
'assegnato_il' => $a->assigned_at?->format('d/m/Y') ?? '',
|
||||
'restituito_il' => $a->returned_at?->format('d/m/Y') ?? '',
|
||||
])->all();
|
||||
|
||||
return [
|
||||
'numero' => $gruppo->first()->territorio?->numero ?? '',
|
||||
'riporto' => $this->riportoS13($gruppo, $rientriPrecedenti->get($territorioId)),
|
||||
'riporto' => $this->riportoS13($gruppo, $inizioCiclo),
|
||||
'assegnazioni' => $this->completaCelleS13($celle),
|
||||
];
|
||||
})
|
||||
@@ -315,64 +316,26 @@ class Registro extends Component
|
||||
}
|
||||
|
||||
/**
|
||||
* Contenuto della colonna "Restituito l'ultima volta il", che funziona da
|
||||
* quinta casella della riga.
|
||||
* Contenuto della colonna "Restituito l'ultima volta il": la data di
|
||||
* rientro dell'ultima assegnazione *prima* che il ciclo ricominciasse,
|
||||
* cioè quella che occupava il quarto gruppo del giro precedente.
|
||||
*
|
||||
* Quando le assegnazioni dell'anno superano le quattro che i gruppi
|
||||
* "Assegnato a" possono ospitare, la colonna accoglie quella
|
||||
* immediatamente precedente alle quattro mostrate — nome e data di
|
||||
* rientro — così la riga copre cinque passaggi invece di quattro. In quel
|
||||
* caso il riporto dell'anno precedente non ha più senso: la continuità
|
||||
* con il passato ce l'ha già l'assegnazione in colonna.
|
||||
* È il riporto che il modulo cartaceo chiede quando si apre una riga nuova
|
||||
* per un territorio già registrato: la riga mostra da dove si riparte,
|
||||
* senza il nome di chi lo aveva (la colonna ha solo la data).
|
||||
*
|
||||
* Con quattro o meno assegnazioni nell'anno la colonna torna al suo uso
|
||||
* da modulo: l'ultima data di rientro dell'anno di servizio precedente,
|
||||
* senza nome.
|
||||
* Finché il primo ciclo non è esaurito — quattro assegnazioni o meno
|
||||
* nell'anno — non c'è niente da riportare e la colonna resta vuota.
|
||||
*
|
||||
* @param \Illuminate\Support\Collection<int, Assegnazione> $gruppo
|
||||
* @return array{nome: string, data: string}
|
||||
*/
|
||||
private function riportoS13(\Illuminate\Support\Collection $gruppo, ?string $rientroAnnoPrecedente): array
|
||||
private function riportoS13(\Illuminate\Support\Collection $gruppo, int $inizioCiclo): string
|
||||
{
|
||||
$eccedenti = $gruppo->count() - self::S13_ASSEGNAZIONI_PER_RIGA;
|
||||
|
||||
if ($eccedenti > 0) {
|
||||
$precedente = $gruppo->get($eccedenti - 1);
|
||||
|
||||
return [
|
||||
'nome' => $precedente->proclamatore?->nome_completo ?? '',
|
||||
'data' => $precedente->returned_at?->format('d/m/Y') ?? '',
|
||||
];
|
||||
if ($inizioCiclo === 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return [
|
||||
'nome' => '',
|
||||
'data' => $rientroAnnoPrecedente
|
||||
? \Carbon\Carbon::parse($rientroAnnoPrecedente)->format('d/m/Y')
|
||||
: '',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Ultima data di rientro di ogni territorio *precedente* all'inizio
|
||||
* dell'anno di servizio: è il dato che la colonna "Restituito l'ultima
|
||||
* volta il" del modulo chiede di riportare quando si apre un foglio nuovo.
|
||||
*
|
||||
* @param array<int, int> $territorioIds
|
||||
* @return \Illuminate\Support\Collection<int, string>
|
||||
*/
|
||||
private function ultimiRientriPrimaDi(array $territorioIds, AnnoTeocratico $anno): \Illuminate\Support\Collection
|
||||
{
|
||||
if ($territorioIds === []) {
|
||||
return collect();
|
||||
}
|
||||
|
||||
return Assegnazione::whereIn('territorio_id', $territorioIds)
|
||||
->whereNotNull('returned_at')
|
||||
->whereDate('returned_at', '<', $anno->start_date)
|
||||
->groupBy('territorio_id')
|
||||
->selectRaw('territorio_id, MAX(returned_at) as ultimo_rientro')
|
||||
->pluck('ultimo_rientro', 'territorio_id');
|
||||
return $gruppo->get($inizioCiclo - 1)?->returned_at?->format('d/m/Y') ?? '';
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user