++ fix: aggiornamento dipendenze e correzione bug

This commit is contained in:
2026-04-12 18:07:59 +00:00
parent 9f9a3666c1
commit 5e98423e7a
13 changed files with 311 additions and 25 deletions

View File

@@ -116,9 +116,16 @@ class Assegna extends Component
->get()
->sortBy(fn($p) => mb_strtolower($p->cognome . ' ' . $p->nome));
// All currently assigned territories with links
$assegnazioniAperte = Assegnazione::aperte()
->with(['territorio.zona', 'proclamatore'])
->get()
->sortBy(fn($a) => (int) $a->territorio?->numero);
return view('livewire.assegnazioni.assegna', [
'territoriDisponibili' => $territoriDisponibili,
'proclamatoriAttivi' => $proclamatoriAttivi,
'assegnazioniAperte' => $assegnazioniAperte,
]);
}
}

View File

@@ -9,9 +9,83 @@ use App\Models\Assegnazione;
use App\Models\AnnoTeocratico;
use App\Models\Campagna;
use App\Models\Setting;
use Barryvdh\DomPDF\Facade\Pdf;
class Home extends Component
{
public function downloadPdfDaAssegnare()
{
$this->authorize('territori.assign');
$settings = Setting::instance();
$priorityThreshold = (int) ($settings->giorni_giacenza_prioritari ?? 180);
$territori = 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) {
$p = (int) $right->home_is_prioritario <=> (int) $left->home_is_prioritario;
if ($p !== 0) return $p;
$g = $right->home_giorni_giacenza <=> $left->home_giorni_giacenza;
if ($g !== 0) return $g;
return strnatcasecmp((string) $left->numero, (string) $right->numero);
})
->values();
$pdf = Pdf::loadView('pdf.territori-lista', [
'titolo' => 'Territori da Assegnare',
'congregazione' => $settings->congregazione_nome ?? 'TerManager2',
'data' => now()->format('d/m/Y'),
'territori' => $territori,
'tipo' => 'assegnare',
]);
return response()->streamDownload(
fn () => print($pdf->output()),
'territori-da-assegnare-' . now()->format('Y-m-d') . '.pdf'
);
}
public function downloadPdfDaRientrare()
{
$this->authorize('territori.return');
$settings = Setting::instance();
$territori = Territorio::daRientrare()
->with(['zona', 'assegnazioneCorrente.proclamatore'])
->get();
$pdf = Pdf::loadView('pdf.territori-lista', [
'titolo' => 'Territori da Rientrare',
'congregazione' => $settings->congregazione_nome ?? 'TerManager2',
'data' => now()->format('d/m/Y'),
'territori' => $territori,
'tipo' => 'rientrare',
]);
return response()->streamDownload(
fn () => print($pdf->output()),
'territori-da-rientrare-' . now()->format('Y-m-d') . '.pdf'
);
}
public function render()
{
$settings = Setting::instance();

View File

@@ -21,8 +21,8 @@ class Registro extends Component
public string $filtroZona = '';
public string $filtroTipologia = '';
public string $filtroStato = ''; // aperte, chiuse
public string $sortField = 'assigned_at';
public string $sortDirection = 'desc';
public string $sortField = 'territorio_numero';
public string $sortDirection = 'asc';
// ─── Modal create/edit ──────────────────────────────────────
public bool $showModal = false;
@@ -149,6 +149,14 @@ class Registro extends Component
$this->showDeleteConfirm = false;
}
public function mount(): void
{
if ($this->filtroAnno === '') {
$annoCorrente = AnnoTeocratico::corrente();
$this->filtroAnno = (string) $annoCorrente->id;
}
}
public function render()
{
$query = Assegnazione::with(['territorio.zona', 'territorio.assegnazioneCorrente', 'proclamatore', 'annoTeocratico', 'campagna']);
@@ -171,7 +179,14 @@ class Registro extends Component
$query->whereHas('territorio', fn($q) => $q->where('tipologia_id', $this->filtroTipologia));
}
$query->orderBy($this->sortField, $this->sortDirection);
if ($this->sortField === 'territorio_numero') {
$dir = $this->sortDirection === 'asc' ? 'ASC' : 'DESC';
$query->orderByRaw(
"CAST((SELECT numero FROM territori WHERE territori.id = assegnazioni.territorio_id) AS UNSIGNED) $dir"
);
} else {
$query->orderBy($this->sortField, $this->sortDirection);
}
// In-memory search for encrypted proclamatore fields / territorio numero
if ($this->search !== '') {

View File

@@ -8,6 +8,7 @@ use App\Models\Setting;
class SettingsEdit extends Component
{
public string $congregazione_nome = '';
public string $public_base_url = '';
public int $giorni_giacenza_da_assegnare = 120;
public int $giorni_giacenza_prioritari = 180;
public int $giorni_per_smarrito = 120;
@@ -19,6 +20,7 @@ class SettingsEdit extends Component
{
$settings = Setting::instance();
$this->congregazione_nome = $settings->congregazione_nome ?? '';
$this->public_base_url = $settings->public_base_url ?? '';
$this->giorni_giacenza_da_assegnare = $settings->giorni_giacenza_da_assegnare ?? 120;
$this->giorni_giacenza_prioritari = $settings->giorni_giacenza_prioritari ?? 180;
$this->giorni_per_smarrito = $settings->giorni_per_smarrito ?? 120;
@@ -31,6 +33,7 @@ class SettingsEdit extends Component
{
return [
'congregazione_nome' => 'required|string|max:255',
'public_base_url' => 'nullable|url|max:255',
'giorni_giacenza_da_assegnare' => 'required|integer|min:1|max:730',
'giorni_giacenza_prioritari' => 'required|integer|min:1|max:730',
'giorni_per_smarrito' => 'required|integer|min:30|max:365',
@@ -47,6 +50,7 @@ class SettingsEdit extends Component
$settings = Setting::instance();
$settings->update([
'congregazione_nome' => $this->congregazione_nome,
'public_base_url' => $this->public_base_url ?: null,
'giorni_giacenza_da_assegnare' => $this->giorni_giacenza_da_assegnare,
'giorni_giacenza_prioritari' => $this->giorni_giacenza_prioritari,
'giorni_per_smarrito' => $this->giorni_per_smarrito,