198 lines
7.7 KiB
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')),
|
|
];
|
|
}
|
|
}
|