'date', 'data_fine' => 'date', 'data_atto' => 'date', 'data_trascrizione' => 'date', 'data_voltura' => 'date', 'quota_numeratore' => 'integer', 'quota_denominatore' => 'integer', 'percentuale' => 'decimal:4', 'attivo' => 'boolean' ]; /** * Relazione con l'unità immobiliare */ public function unitaImmobiliare() { return $this->belongsTo(UnitaImmobiliare::class); } /** * Relazione con l'anagrafica condominiale */ public function anagraficaCondominiale() { return $this->belongsTo(AnagraficaCondominiale::class, 'anagrafica_id'); } /** * Scope per diritti attivi */ public function scopeAttivi($query) { return $query->where('attivo', true); } /** * Scope per diritti in corso */ public function scopeInCorso($query) { return $query->whereDate('data_inizio', '<=', now()) ->where(function ($q) { $q->whereNull('data_fine') ->orWhereDate('data_fine', '>=', now()); }); } /** * Scope per tipo di diritto */ public function scopeByTipoDiritto($query, $tipo) { return $query->where('tipo_diritto', $tipo); } /** * Scope per proprietà */ public function scopeProprieta($query) { return $query->where('tipo_diritto', 'proprieta'); } /** * Scope per usufrutto */ public function scopeUsufrutto($query) { return $query->where('tipo_diritto', 'usufrutto'); } /** * Scope per nuda proprietà */ public function scopeNudaProprieta($query) { return $query->where('tipo_diritto', 'nuda_proprieta'); } /** * Scope per unità immobiliare */ public function scopeByUnitaImmobiliare($query, $unitaId) { return $query->where('unita_immobiliare_id', $unitaId); } /** * Scope per anagrafica */ public function scopeByAnagrafica($query, $anagraficaId) { return $query->where('anagrafica_condominiale_id', $anagraficaId); } /** * Accessor per la quota in formato decimale */ public function getQuotaDecimaleAttribute() { if ($this->quota_denominatore && $this->quota_denominatore > 0) { return $this->quota_numeratore / $this->quota_denominatore; } return 1.0; // Default: proprietà piena } /** * Accessor per la quota in formato percentuale */ public function getQuotaPercentualeAttribute() { return $this->quota_decimale * 100; } /** * Accessor per la quota formattata */ public function getQuotaFormattataAttribute() { if ($this->quota_denominatore && $this->quota_denominatore > 0) { return $this->quota_numeratore . '/' . $this->quota_denominatore; } return '1/1'; // Proprietà piena } /** * Accessor per il tipo di diritto formattato */ public function getTipoDirittoFormattatoAttribute() { return match ($this->tipo_diritto) { 'proprieta' => 'Proprietà', 'usufrutto' => 'Usufrutto', 'nuda_proprieta' => 'Nuda Proprietà', 'abitazione' => 'Diritto di Abitazione', 'uso' => 'Diritto d\'Uso', 'superficie' => 'Diritto di Superficie', 'enfiteusi' => 'Enfiteusi', default => ucfirst(str_replace('_', ' ', $this->tipo_diritto)) }; } /** * Accessor per i dati dell'atto */ public function getDatiAttoAttribute() { return [ 'provenienza' => $this->atto_provenienza, 'numero_repertorio' => $this->numero_repertorio, 'data' => $this->data_atto, 'notaio' => $this->notaio ]; } /** * Metodo per verificare se il diritto è in corso */ public function isInCorso() { $oggi = now()->toDateString(); if ($this->data_inizio > $oggi) { return false; // Non ancora iniziato } if ($this->data_fine && $this->data_fine < $oggi) { return false; // Già finito } return true; // In corso } /** * Metodo per verificare se il diritto è scaduto */ public function isScaduto() { return $this->data_fine && $this->data_fine < now()->toDateString(); } /** * Metodo per calcolare la durata del diritto */ public function getDurata() { if (!$this->data_fine) { return null; // Durata indeterminata } return $this->data_inizio->diffInDays($this->data_fine); } /** * Metodo per ottenere i millesimi basati sulla quota */ public function getMillesimiByQuota($millesimi_totali) { return $millesimi_totali * $this->quota_decimale; } }