'date', 'data_ultima_modifica' => 'date', 'data_nascita' => 'date', 'created_at' => 'datetime', 'updated_at' => 'datetime', 'deleted_at' => 'datetime', ]; /** * Relazione con utente che ha creato il contatto */ public function createBy() { return $this->belongsTo(User::class, 'creato_da'); } /** * Relazione con utente che ha modificato il contatto */ public function updatedBy() { return $this->belongsTo(User::class, 'modificato_da'); } /** * Relazione con dati bancari */ public function datiBancari() { return $this->hasMany(DatiBancari::class, 'contatto_id'); } public function titolo(): BelongsTo { return $this->belongsTo(Titolo::class, 'titolo_id'); } /** * Relazione con documenti collegati */ public function documentiCollegati() { return $this->hasMany(DocumentoCollegato::class, 'contatto_id'); } /** * Accessor per il nome completo */ public function getNomeCompletoAttribute() { if ($this->tipo_contatto === 'persona_giuridica') { return $this->ragione_sociale; } $prefix = $this->titolo?->sigla ?: $this->titolo?->nome; $full = trim($this->nome . ' ' . $this->cognome); if ($prefix) { return trim($prefix . ' ' . $full); } return $full; } /** * Accessor per l'indirizzo completo */ public function getIndirizzoCompletoAttribute() { $parts = array_filter([ $this->indirizzo, $this->civico, $this->cap, $this->citta, $this->provincia ? "({$this->provincia})" : null, ]); return implode(' ', $parts); } /** * Scope per categoria */ public function scopeCategoria($query, $categoria) { return $query->where('categoria', $categoria); } /** * Scope per contatti attivi */ public function scopeAttivi($query) { return $query->where('stato', 'attivo'); } /** * Scope per ricerca */ public function scopeRicerca($query, $termine) { return $query->where(function ($q) use ($termine) { $q->where('nome', 'like', "%{$termine}%") ->orWhere('cognome', 'like', "%{$termine}%") ->orWhere('ragione_sociale', 'like', "%{$termine}%") ->orWhere('email', 'like', "%{$termine}%") ->orWhere('telefono_ufficio', 'like', "%{$termine}%") ->orWhere('telefono_cellulare', 'like', "%{$termine}%"); }); } protected static function boot() { parent::boot(); static::deleting(function ($rubrica) { $isForce = method_exists($rubrica, 'isForceDeleting') ? $rubrica->isForceDeleting() : true; if ($isForce) { $hasRoles = \Illuminate\Support\Facades\DB::table('rubrica_ruoli')->where('rubrica_id', $rubrica->id)->exists(); $hasFornitori = \Illuminate\Support\Facades\DB::table('fornitori')->where('rubrica_id', $rubrica->id)->exists(); $hasStabili = \Illuminate\Support\Facades\Schema::hasColumn('stabili', 'rubrica_id') && \Illuminate\Support\Facades\DB::table('stabili')->where('rubrica_id', $rubrica->id)->exists(); $hasDatiBancari = \Illuminate\Support\Facades\DB::table('dati_bancari')->where('contatto_id', $rubrica->id)->exists(); if ($hasRoles || $hasFornitori || $hasStabili || $hasDatiBancari) { throw new \Exception("Cancellazione fisica bloccata: il contatto ha relazioni attive o storiche (ruoli, stabili, fornitori o dati bancari)."); } } }); } }