114 lines
4.2 KiB
PHP
114 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire;
|
|
|
|
use Livewire\Component;
|
|
use App\Models\Territorio;
|
|
use App\Models\Proclamatore;
|
|
use App\Models\Assegnazione;
|
|
use App\Models\AnnoTeocratico;
|
|
use App\Models\Campagna;
|
|
use App\Models\Setting;
|
|
|
|
class Home extends Component
|
|
{
|
|
public function render()
|
|
{
|
|
$settings = Setting::instance();
|
|
$homeLimit = max(1, (int) ($settings->home_limit_list ?? 10));
|
|
$priorityThreshold = (int) ($settings->giorni_giacenza_prioritari ?? 180);
|
|
$annoCorrente = AnnoTeocratico::corrente();
|
|
$campagnaAttiva = Campagna::attiva();
|
|
|
|
// Territory counts
|
|
$totTerritoriAttivi = Territorio::where('attivo', true)->count();
|
|
$totAssegnati = Territorio::assegnato()->count();
|
|
$totInReparto = Territorio::inReparto()->count();
|
|
|
|
// Coverage: returned territories per current theocratic year
|
|
$territoriPercorsi = 0;
|
|
if ($annoCorrente) {
|
|
$territoriPercorsi = Assegnazione::where('anno_teocratico_id', $annoCorrente->id)
|
|
->whereNotNull('returned_at')
|
|
->distinct('territorio_id')
|
|
->count('territorio_id');
|
|
}
|
|
|
|
// Monthly average
|
|
$mediaPercorrenzaMensile = 0;
|
|
if ($annoCorrente && $annoCorrente->mesi_trascorsi > 0) {
|
|
$mediaPercorrenzaMensile = round($territoriPercorsi / $annoCorrente->mesi_trascorsi, 1);
|
|
}
|
|
|
|
// Campaign stats
|
|
$campagnaStats = null;
|
|
if ($campagnaAttiva) {
|
|
$campagnaStats = [
|
|
'descrizione' => $campagnaAttiva->descrizione,
|
|
'percentuale' => $campagnaAttiva->percentuale_percorrenza,
|
|
'fine' => $campagnaAttiva->end_date->format('d/m/Y'),
|
|
];
|
|
}
|
|
|
|
// Quick lists
|
|
$territoriDaAssegnare = Territorio::inReparto()
|
|
->with('zona', 'tipologia', 'ultimaAssegnazione')
|
|
->get()
|
|
->map(function (Territorio $territorio) use ($priorityThreshold) {
|
|
$ultima = $territorio->ultimaAssegnazione;
|
|
|
|
if ($ultima && $ultima->returned_at) {
|
|
$giorniGiacenza = $ultima->returned_at->startOfDay()->diffInDays(today());
|
|
} elseif (! $ultima) {
|
|
$giorniGiacenza = $territorio->created_at->startOfDay()->diffInDays(today());
|
|
} else {
|
|
$giorniGiacenza = 0;
|
|
}
|
|
|
|
$territorio->setAttribute('home_giorni_giacenza', $giorniGiacenza);
|
|
$territorio->setAttribute(
|
|
'home_is_prioritario',
|
|
(bool) $territorio->prioritario || $giorniGiacenza > $priorityThreshold
|
|
);
|
|
|
|
return $territorio;
|
|
})
|
|
->sort(function (Territorio $left, Territorio $right) {
|
|
$priorityComparison = (int) $right->home_is_prioritario <=> (int) $left->home_is_prioritario;
|
|
|
|
if ($priorityComparison !== 0) {
|
|
return $priorityComparison;
|
|
}
|
|
|
|
$giacenzaComparison = $right->home_giorni_giacenza <=> $left->home_giorni_giacenza;
|
|
|
|
if ($giacenzaComparison !== 0) {
|
|
return $giacenzaComparison;
|
|
}
|
|
|
|
return strnatcasecmp((string) $left->numero, (string) $right->numero);
|
|
})
|
|
->take($homeLimit)
|
|
->values();
|
|
|
|
$daRientrare = Territorio::daRientrare()
|
|
->with(['zona', 'assegnazioneCorrente.proclamatore'])
|
|
->take($homeLimit)
|
|
->get();
|
|
|
|
return view('livewire.home', [
|
|
'congregazione' => $settings->congregazione_nome ?? 'TerManager2',
|
|
'annoCorrente' => $annoCorrente,
|
|
'totTerritoriAttivi' => $totTerritoriAttivi,
|
|
'totAssegnati' => $totAssegnati,
|
|
'totInReparto' => $totInReparto,
|
|
'territoriPercorsi' => $territoriPercorsi,
|
|
'mediaPercorrenzaMensile' => $mediaPercorrenzaMensile,
|
|
'campagnaStats' => $campagnaStats,
|
|
'homeLimit' => $homeLimit,
|
|
'territoriDaAssegnare' => $territoriDaAssegnare,
|
|
'daRientrare' => $daRientrare,
|
|
]);
|
|
}
|
|
}
|