'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; } }