netgescon-master/app/Models/UnitaImmobiliare.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;
}
}