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')), ]; } }