352 lines
9.1 KiB
PHP
352 lines
9.1 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
|
|
class UnitaImmobiliare extends Model
|
|
{
|
|
use HasFactory, SoftDeletes;
|
|
|
|
protected $table = 'unita_immobiliari';
|
|
|
|
protected $fillable = [
|
|
// Relazioni
|
|
'stabile_id',
|
|
'palazzina_id',
|
|
|
|
// Identificatori e codifica
|
|
'codice_unita',
|
|
'denominazione',
|
|
'descrizione',
|
|
|
|
// Posizione fisica gerarchica
|
|
'palazzina',
|
|
'scala',
|
|
'piano',
|
|
'interno',
|
|
'posizione_dettagliata',
|
|
|
|
// Dati catastali specifici dell'unità
|
|
'sezione_urbana',
|
|
'foglio',
|
|
'particella',
|
|
'subalterno',
|
|
'categoria_catastale',
|
|
'classe',
|
|
'consistenza',
|
|
'rendita_catastale',
|
|
|
|
// Superfici
|
|
'superficie_commerciale',
|
|
'superficie_calpestabile',
|
|
'superficie_balconi',
|
|
'superficie_giardino_privato',
|
|
|
|
// Tipologia e utilizzo
|
|
'tipo_unita',
|
|
'utilizzo_attuale',
|
|
|
|
// Caratteristiche strutturali
|
|
'numero_locali',
|
|
'numero_bagni',
|
|
'numero_camere',
|
|
'tipo_cucina',
|
|
'ha_balconi',
|
|
'numero_balconi',
|
|
'ha_giardino_privato',
|
|
'ha_posto_auto_assegnato',
|
|
'ha_cantina_assegnata',
|
|
'ha_soffitta_assegnata',
|
|
|
|
// Impianti specifici unità
|
|
'riscaldamento',
|
|
'ha_climatizzazione',
|
|
'anno_impianto_elettrico',
|
|
'anno_impianto_idraulico',
|
|
'ha_impianto_gas',
|
|
'anno_sostituzione_infissi',
|
|
|
|
// Millesimi di proprietà
|
|
'millesimi_generali',
|
|
'millesimi_riscaldamento',
|
|
'millesimi_acqua',
|
|
'millesimi_ascensore',
|
|
'millesimi_scale',
|
|
|
|
// Autorizzazioni e licenze
|
|
'cin',
|
|
'licenza_commerciale',
|
|
'autorizzazione_professionale',
|
|
'ha_cambio_destinazione_uso',
|
|
'data_scadenza_autorizzazioni',
|
|
'note_autorizzazioni',
|
|
|
|
// Stato e condizioni
|
|
'stato_conservazione',
|
|
'anno_ultima_ristrutturazione',
|
|
'stato_occupazione',
|
|
|
|
// Valutazioni economiche
|
|
'valore_commerciale_stimato',
|
|
'canone_locazione_mensile',
|
|
'data_ultima_valutazione',
|
|
|
|
// Gestione e controllo
|
|
'attiva',
|
|
'unita_demo',
|
|
'note',
|
|
'created_by',
|
|
'updated_by',
|
|
|
|
// Campi legacy per compatibilità
|
|
'tipo_utilizzo_id',
|
|
'numero_interno',
|
|
'codice_interno',
|
|
'codice_catastale',
|
|
'superficie_catastale',
|
|
'millesimi_proprieta',
|
|
'millesimi_custom_1',
|
|
'millesimi_custom_2',
|
|
'millesimi_custom_3',
|
|
'nome_custom_1',
|
|
'nome_custom_2',
|
|
'nome_custom_3',
|
|
'stato',
|
|
'data_acquisto',
|
|
'valore_acquisto',
|
|
'documenti_path',
|
|
];
|
|
|
|
protected $casts = [
|
|
'consistenza' => 'decimal:2',
|
|
'rendita_catastale' => 'decimal:2',
|
|
'superficie_commerciale' => 'decimal:2',
|
|
'superficie_calpestabile' => 'decimal:2',
|
|
'superficie_balconi' => 'decimal:2',
|
|
'superficie_giardino_privato' => 'decimal:2',
|
|
'ha_balconi' => 'boolean',
|
|
'ha_giardino_privato' => 'boolean',
|
|
'ha_posto_auto_assegnato' => 'boolean',
|
|
'ha_cantina_assegnata' => 'boolean',
|
|
'ha_soffitta_assegnata' => 'boolean',
|
|
'ha_climatizzazione' => 'boolean',
|
|
'ha_impianto_gas' => 'boolean',
|
|
'ha_cambio_destinazione_uso' => 'boolean',
|
|
'millesimi_generali' => 'decimal:3',
|
|
'millesimi_riscaldamento' => 'decimal:3',
|
|
'millesimi_acqua' => 'decimal:3',
|
|
'millesimi_ascensore' => 'decimal:3',
|
|
'millesimi_scale' => 'decimal:3',
|
|
'valore_commerciale_stimato' => 'decimal:2',
|
|
'canone_locazione_mensile' => 'decimal:2',
|
|
'data_scadenza_autorizzazioni' => 'date',
|
|
'data_ultima_valutazione' => 'date',
|
|
'attiva' => 'boolean',
|
|
'unita_demo' => 'boolean',
|
|
];
|
|
|
|
/**
|
|
* Relazione con Stabile
|
|
*/
|
|
public function stabile(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Stabile::class);
|
|
}
|
|
|
|
/**
|
|
* Relazione con Palazzina
|
|
*/
|
|
public function palazzinaObj(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Palazzina::class, 'palazzina_id');
|
|
}
|
|
|
|
/**
|
|
* Relazione con utente creatore
|
|
*/
|
|
public function createdBy(): BelongsTo
|
|
{
|
|
return $this->belongsTo(User::class, 'created_by');
|
|
}
|
|
|
|
/**
|
|
* Relazione con utente modificatore
|
|
*/
|
|
public function updatedBy(): BelongsTo
|
|
{
|
|
return $this->belongsTo(User::class, 'updated_by');
|
|
}
|
|
|
|
// Scope methods
|
|
public function scopeAttive($query)
|
|
{
|
|
return $query->where('attiva', true);
|
|
}
|
|
|
|
public function scopePerStabile($query, $stabileId)
|
|
{
|
|
return $query->where('stabile_id', $stabileId);
|
|
}
|
|
|
|
public function scopePerPalazzina($query, $palazzina)
|
|
{
|
|
return $query->where('palazzina', $palazzina);
|
|
}
|
|
|
|
public function scopePerScala($query, $scala)
|
|
{
|
|
return $query->where('scala', $scala);
|
|
}
|
|
|
|
public function scopePerPiano($query, $piano)
|
|
{
|
|
return $query->where('piano', $piano);
|
|
}
|
|
|
|
public function scopeDemo($query)
|
|
{
|
|
return $query->where('unita_demo', true);
|
|
}
|
|
|
|
public function scopeReali($query)
|
|
{
|
|
return $query->where('unita_demo', false);
|
|
}
|
|
|
|
// Accessor methods
|
|
public function getCodiceCompletoAttribute()
|
|
{
|
|
return "{$this->palazzina}-{$this->scala}-{$this->piano}-{$this->interno}";
|
|
}
|
|
|
|
public function getDescrizionePosizioneAttribute()
|
|
{
|
|
$descrizione = "Palazzina {$this->palazzina}, Scala {$this->scala}";
|
|
|
|
if ($this->piano == 0) {
|
|
$descrizione .= ", Piano Terra";
|
|
} elseif ($this->piano < 0) {
|
|
$descrizione .= ", Piano {$this->piano} (Interrato)";
|
|
} else {
|
|
$descrizione .= ", Piano {$this->piano}";
|
|
}
|
|
|
|
$descrizione .= ", Interno {$this->interno}";
|
|
|
|
return $descrizione;
|
|
}
|
|
|
|
// Metodi per algoritmo vicini
|
|
public function getUnitaSovrastante()
|
|
{
|
|
return static::where('stabile_id', $this->stabile_id)
|
|
->where('palazzina', $this->palazzina)
|
|
->where('scala', $this->scala)
|
|
->where('piano', $this->piano + 1)
|
|
->where('interno', $this->interno)
|
|
->first();
|
|
}
|
|
|
|
public function getUnitaSottostante()
|
|
{
|
|
return static::where('stabile_id', $this->stabile_id)
|
|
->where('palazzina', $this->palazzina)
|
|
->where('scala', $this->scala)
|
|
->where('piano', $this->piano - 1)
|
|
->where('interno', $this->interno)
|
|
->first();
|
|
}
|
|
|
|
public function getUnitaLaterali()
|
|
{
|
|
return static::where('stabile_id', $this->stabile_id)
|
|
->where('palazzina', $this->palazzina)
|
|
->where('scala', $this->scala)
|
|
->where('piano', $this->piano)
|
|
->where('interno', '!=', $this->interno)
|
|
->get();
|
|
}
|
|
|
|
public function getUnitaVicine()
|
|
{
|
|
$vicine = collect();
|
|
|
|
// Unità sovrastante
|
|
if ($sovrastante = $this->getUnitaSovrastante()) {
|
|
$vicine->push([
|
|
'unita' => $sovrastante,
|
|
'relazione' => 'sovrastante',
|
|
'descrizione' => 'Piano superiore'
|
|
]);
|
|
}
|
|
|
|
// Unità sottostante
|
|
if ($sottostante = $this->getUnitaSottostante()) {
|
|
$vicine->push([
|
|
'unita' => $sottostante,
|
|
'relazione' => 'sottostante',
|
|
'descrizione' => 'Piano inferiore'
|
|
]);
|
|
}
|
|
|
|
// Unità laterali
|
|
foreach ($this->getUnitaLaterali() as $laterale) {
|
|
$vicine->push([
|
|
'unita' => $laterale,
|
|
'relazione' => 'laterale',
|
|
'descrizione' => 'Stesso piano'
|
|
]);
|
|
}
|
|
|
|
return $vicine;
|
|
}
|
|
|
|
// Metodi di utilità
|
|
public function isAbitazione()
|
|
{
|
|
return in_array($this->tipo_unita, ['abitazione']);
|
|
}
|
|
|
|
public function isCommerciale()
|
|
{
|
|
return in_array($this->tipo_unita, ['attivita_commerciale', 'studio_professionale']);
|
|
}
|
|
|
|
public function isOccupata()
|
|
{
|
|
return in_array($this->stato_occupazione, ['occupata_proprietario', 'occupata_inquilino']);
|
|
}
|
|
|
|
public function isLibera()
|
|
{
|
|
return $this->stato_occupazione === 'libera';
|
|
}
|
|
|
|
public function hasAutorizzazioniScadute()
|
|
{
|
|
return $this->data_scadenza_autorizzazioni &&
|
|
$this->data_scadenza_autorizzazioni->isPast();
|
|
}
|
|
|
|
// Legacy compatibility methods
|
|
public function getMillesimiProprietaAttribute()
|
|
{
|
|
return $this->millesimi_generali;
|
|
}
|
|
|
|
public function getNumeroInternoAttribute()
|
|
{
|
|
return $this->interno;
|
|
}
|
|
|
|
public function getCodiceInternoAttribute()
|
|
{
|
|
return $this->codice_unita;
|
|
}
|
|
}
|