'date', 'valore_acquisto' => 'decimal:2', 'rendita_catastale' => 'decimal:2', 'superficie_catastale' => 'decimal:2', 'superficie_commerciale' => 'decimal:2', 'millesimi_proprieta' => 'decimal:6', 'millesimi_riscaldamento' => 'decimal:6', 'millesimi_ascensore' => 'decimal:6', 'millesimi_scale' => 'decimal:6', 'millesimi_acqua' => 'decimal:6', 'millesimi_custom_1' => 'decimal:6', 'millesimi_custom_2' => 'decimal:6', 'millesimi_custom_3' => 'decimal:6', 'attiva' => 'boolean', // Legacy casts 'superficie' => 'decimal:2', 'vani' => 'decimal:2', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; /** * Relazione con Stabile */ public function stabile() { return $this->belongsTo(Stabile::class, 'stabile_id', 'id'); } /** * Relazione con il tipo di utilizzo */ public function tipoUtilizzo() { return $this->belongsTo(TipoUtilizzo::class); } /** * Relazione con i diritti reali */ public function dirittiReali() { return $this->hasMany(DirittoReale::class); } /** * Relazione con i contratti di locazione */ public function contrattiLocazione() { return $this->hasMany(ContrattoLocazione::class); } /** * Relazione con le ripartizioni spese inquilini */ public function ripartizioniSpese() { return $this->hasMany(RipartizioneSpeseInquilini::class); } /** * Relazione con Tickets (legacy) */ public function tickets() { return $this->hasMany(Ticket::class, 'unita_immobiliare_id', 'id'); } /** * Relazione con Proprietà (legacy) */ public function proprieta() { return $this->hasMany(Proprieta::class, 'unita_immobiliare_id', 'id'); } /** * Relazione con DettaglioRipartizioneSpese */ public function dettagliRipartizioneSpese() { return $this->hasMany(DettaglioRipartizioneSpese::class); } /** * Relazione con Rate */ public function rate() { return $this->hasMany(Rata::class); } /** * Rate attive (emesse o parzialmente pagate) */ public function rateAttive() { return $this->hasMany(Rata::class)->whereIn('stato', ['emessa', 'parzialmente_pagata', 'scaduta']); } /** * Rate scadute */ public function rateScadute() { return $this->hasMany(Rata::class)->scadute(); } /** * Metodo per ottenere il totale delle rate da pagare */ public function getTotaleRateDaPagare() { return $this->rateAttive()->sum('importo_residuo'); } /** * Metodo per ottenere il numero di rate scadute */ public function getNumeroRateScadute() { return $this->rateScadute()->count(); } /** * Scope per unità attive */ public function scopeAttive($query) { return $query->where('attiva', true); } /** * Scope per tipo di utilizzo */ public function scopeByTipoUtilizzo($query, $tipoUtilizzo) { return $query->whereHas('tipoUtilizzo', function ($q) use ($tipoUtilizzo) { $q->where('codice', $tipoUtilizzo); }); } /** * Scope per stabile */ public function scopeByStabile($query, $stabileId) { return $query->where('stabile_id', $stabileId); } /** * Accessor per il nome completo dell'unità */ public function getNomeCompletoAttribute() { $nome = ''; if ($this->palazzina) { $nome .= "Palazzina {$this->palazzina} - "; } if ($this->scala) { $nome .= "Scala {$this->scala} - "; } if ($this->piano) { $nome .= "Piano {$this->piano} - "; } $numeroInterno = $this->numero_interno ?: $this->interno; $nome .= "Interno {$numeroInterno}"; return $nome; } /** * Accessor per i dati catastali */ public function getDatiCatastaliAttribute() { return [ 'foglio' => $this->foglio, 'particella' => $this->particella, 'subalterno' => $this->subalterno, 'categoria' => $this->categoria ?: $this->categoria_catastale, 'classe' => $this->classe, 'consistenza' => $this->consistenza, 'rendita' => $this->rendita_catastale ]; } /** * Accessor per tutti i millesimi */ public function getMillesimiAttribute() { return [ 'proprieta' => $this->millesimi_proprieta, 'riscaldamento' => $this->millesimi_riscaldamento, 'ascensore' => $this->millesimi_ascensore, 'scale' => $this->millesimi_scale, 'acqua' => $this->millesimi_acqua, 'custom_1' => $this->millesimi_custom_1, 'custom_2' => $this->millesimi_custom_2, 'custom_3' => $this->millesimi_custom_3 ]; } /** * Metodo per ottenere i proprietari attuali */ public function getProprietariAttuali() { return $this->dirittiReali() ->where('tipo_diritto', 'proprieta') ->whereNull('data_fine') ->with('anagraficaCondominiale') ->get(); } /** * Metodo per ottenere gli inquilini attuali */ public function getInquiliniAttuali() { return $this->contrattiLocazione() ->where('stato', 'attivo') ->whereDate('data_inizio', '<=', now()) ->where(function ($query) { $query->whereNull('data_fine') ->orWhereDate('data_fine', '>=', now()); }) ->with('anagraficaCondominiale') ->get(); } /** * Metodo per verificare se l'unità è in locazione */ public function isInLocazione() { return $this->contrattiLocazione() ->where('stato', 'attivo') ->whereDate('data_inizio', '<=', now()) ->where(function ($query) { $query->whereNull('data_fine') ->orWhereDate('data_fine', '>=', now()); }) ->exists(); } /** * Metodo per ottenere la ripartizione spese attuale */ public function getRipartizioneSpese() { return $this->ripartizioniSpese() ->whereDate('data_inizio', '<=', now()) ->where(function ($query) { $query->whereNull('data_fine') ->orWhereDate('data_fine', '>=', now()); }) ->first(); } /** * Accessor per identificazione completa dell'unità (legacy) */ public function getIdentificazioneCompiletaAttribute() { $parts = []; if ($this->fabbricato) $parts[] = 'Fabb. ' . $this->fabbricato; if ($this->scala) $parts[] = 'Scala ' . $this->scala; if ($this->piano) $parts[] = 'Piano ' . $this->piano; if ($this->interno || $this->numero_interno) { $interno = $this->numero_interno ?: $this->interno; $parts[] = 'Int. ' . $interno; } return implode(', ', $parts) ?: 'N/A'; } /** * Accessor per l'indirizzo completo */ public function getIndirizzoCompletoAttribute() { return $this->indirizzo ?: $this->stabile->indirizzo_completo; } }