netgescon-day0/app/Filament/Pages/Gescon/PersonaScheda.php

198 lines
7.7 KiB
PHP

<?php
namespace App\Filament\Pages\Gescon;
use App\Filament\Pages\Strumenti\Comunicazioni;
use App\Filament\Pages\Supporto\Avvisi;
use App\Filament\Pages\Supporto\RichiestaHelp;
use App\Filament\Pages\Supporto\Urgenze;
use App\Filament\Pages\UnitaImmobiliarePage;
use App\Models\PersonaUnitaRelazione;
use App\Models\Persona;
use App\Models\RubricaUniversale;
use App\Models\User;
use Filament\Actions\Action;
use Filament\Forms\Components\CheckboxList;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class PersonaScheda extends Page
{
protected static ?string $title = 'Scheda nominativo';
protected static ?string $slug = 'anagrafica/persone/{record}';
protected static bool $shouldRegisterNavigation = false;
protected string $view = 'filament.pages.anagrafica.persona-scheda';
public Persona $persona;
public array $emailMultiple = [];
public array $cronistoriaUnita = [];
public function mount(int|string $record): void
{
$user = Auth::user();
if (! $user instanceof User || ! $user->hasAnyRole(['super-admin', 'admin', 'amministratore', 'collaboratore'])) {
abort(403);
}
$this->persona = Persona::query()->findOrFail((int) $record);
$this->emailMultiple = $this->persona->emailMultiple()
->orderBy('attiva', 'desc')
->orderBy('email')
->get(['email', 'tipo_email', 'attiva'])
->map(fn($r) => [
'email' => (string) ($r->email ?? ''),
'tipo' => (string) ($r->tipo_email ?? 'secondaria'),
'attiva' => (bool) ($r->attiva ?? true),
])
->all();
$this->cronistoriaUnita = PersonaUnitaRelazione::query()
->with(['unitaImmobiliare.stabile'])
->where('persona_id', $this->persona->id)
->orderByDesc('data_inizio')
->orderByDesc('id')
->limit(200)
->get()
->map(function (PersonaUnitaRelazione $rel) {
$unita = $rel->unitaImmobiliare;
$stabile = $unita?->stabile;
return [
'tipo_relazione' => $rel->tipo_relazione,
'ruolo_rate' => $rel->ruolo_rate ?: PersonaUnitaRelazione::deriveRuoloRate($rel->tipo_relazione),
'quota_relazione' => $rel->quota_relazione,
'data_inizio' => optional($rel->data_inizio)->format('d/m/Y'),
'data_fine' => $rel->data_fine ? optional($rel->data_fine)->format('d/m/Y') : null,
'attivo' => (bool) $rel->attivo,
'stabile_codice' => $stabile?->codice_stabile,
'stabile_nome' => $stabile?->denominazione,
'unita_id' => $unita?->id,
'unita_codice' => $unita?->codice_unita,
'unita_nome' => $unita?->denominazione,
];
})
->all();
}
public function getUrlComunicazioni(): string
{
return Comunicazioni::getUrl(panel: 'admin-filament');
}
public function getUrlTicketNuovo(): string
{
return RichiestaHelp::getUrl(panel: 'admin-filament');
}
public function getUrlTicketAvvisi(): string
{
return Avvisi::getUrl(panel: 'admin-filament');
}
public function getUrlTicketUrgenze(): string
{
return Urgenze::getUrl(panel: 'admin-filament');
}
public function getUrlUnita(?int $unitaId): ?string
{
if (! $unitaId) {
return null;
}
return UnitaImmobiliarePage::getUrl(panel: 'admin-filament')
. '?unita_id=' . (int) $unitaId
. '&back=' . urlencode((string) request()->getRequestUri());
}
protected function getHeaderActions(): array
{
return [
Action::make('apri_rubrica')
->label('Apri in Rubrica')
->icon('heroicon-o-book-open')
->action(function (): void {
$userId = (int) (Auth::id() ?: 0);
$cf = is_string($this->persona->codice_fiscale) ? trim($this->persona->codice_fiscale) : '';
$piva = is_string($this->persona->partita_iva) ? trim($this->persona->partita_iva) : '';
$rubrica = null;
if ($piva !== '') {
$rubrica = RubricaUniversale::query()->where('partita_iva', $piva)->first();
}
if (! $rubrica && $cf !== '') {
$rubrica = RubricaUniversale::query()->where('codice_fiscale', $cf)->first();
}
if (! $rubrica) {
$tipo = $this->persona->tipologia === 'giuridica' ? 'persona_giuridica' : 'persona_fisica';
$now = now();
$rubrica = RubricaUniversale::query()->create([
'nome' => $tipo === 'persona_fisica' ? ($this->persona->nome ?? null) : null,
'cognome' => $tipo === 'persona_fisica' ? ($this->persona->cognome ?? null) : null,
'ragione_sociale' => $tipo === 'persona_giuridica' ? ($this->persona->ragione_sociale ?? $this->persona->nome_completo) : null,
'tipo_contatto' => $tipo,
'categoria' => 'altro',
'stato' => 'attivo',
'codice_fiscale' => $cf !== '' ? $cf : null,
'partita_iva' => $piva !== '' ? $piva : null,
'email' => $this->persona->email_principale ?? null,
'pec' => $this->persona->email_pec ?? null,
'telefono_ufficio' => $this->persona->telefono_principale ?? null,
'telefono_cellulare' => $this->persona->telefono_secondario ?? null,
'note' => $this->persona->note ?? null,
'data_inserimento' => $now,
'data_ultima_modifica' => $now,
'creato_da' => $userId > 0 ? $userId : null,
'modificato_da' => $userId > 0 ? $userId : null,
]);
}
$this->redirect(RubricaUniversaleScheda::getUrl([
'record' => (int) $rubrica->id,
], panel: 'admin-filament'));
}),
Action::make('gestisci_ruoli')
->label('Ruoli')
->icon('heroicon-o-shield-check')
->form([
CheckboxList::make('ruoli')
->label('Ruoli operativi')
->options(Persona::getRuoliDisponibili())
->columns(2),
])
->fillForm(fn() => [
'ruoli' => $this->persona->ruoli ?? [],
])
->action(function (array $data): void {
$ruoli = $data['ruoli'] ?? [];
$ruoli = is_array($ruoli) ? array_values(array_unique(array_filter($ruoli))) : [];
sort($ruoli);
$this->persona->ruoli = $ruoli;
$this->persona->save();
Notification::make()
->title('Ruoli aggiornati')
->success()
->send();
}),
Action::make('torna')
->label('Torna ad Anagrafica unica')
->icon('heroicon-o-arrow-left')
->url(fn() => AnagraficaUnica::getUrl(panel: 'admin-filament')),
];
}
}