netgescon-master/_BACKUP_OLD_netgescon-laravel_INACTIVE/app/Models/DirittoReale.php

238 lines
5.7 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class DirittoReale extends Model
{
use HasFactory, SoftDeletes;
protected $table = 'diritti_reali';
protected $fillable = [
'unita_immobiliare_id',
'anagrafica_id',
'tipo_diritto',
'quota_numeratore',
'quota_denominatore',
'percentuale',
'data_inizio',
'data_fine',
'titolo_acquisizione',
'atto_notarile',
'data_atto',
'notaio',
'trascrizione_conservatoria',
'data_trascrizione',
'voltura_catastale',
'data_voltura',
'attivo',
'note'
];
protected $casts = [
'data_inizio' => '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;
}
}