249 lines
6.8 KiB
PHP
249 lines
6.8 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
|
|
class Palazzina extends Model
|
|
{
|
|
use HasFactory;
|
|
|
|
protected $table = 'palazzine';
|
|
|
|
protected $fillable = [
|
|
'stabile_id',
|
|
'codice_palazzina',
|
|
'denominazione',
|
|
'descrizione',
|
|
'numero_scale',
|
|
'numero_piani_fuori_terra',
|
|
'numero_piani_interrati',
|
|
'ha_piano_terra',
|
|
'appartamenti_per_piano',
|
|
'superficie_totale',
|
|
'anno_costruzione',
|
|
'anno_ultima_ristrutturazione',
|
|
'stato_conservazione',
|
|
'sezione_urbana',
|
|
'foglio',
|
|
'particella',
|
|
'tipo_riscaldamento',
|
|
'ha_ascensore',
|
|
'numero_ascensori',
|
|
'ha_montacarichi',
|
|
'ha_videocitofono',
|
|
'ha_impianto_allarme',
|
|
'accessibile_disabili',
|
|
'note_accessibilita',
|
|
'posti_auto_coperti',
|
|
'posti_auto_scoperti',
|
|
'ha_giardino_comune',
|
|
'mq_giardino_comune',
|
|
'ha_terrazza_comune',
|
|
'mq_terrazza_comune',
|
|
'ha_locale_caldaia',
|
|
'ha_locale_contatori',
|
|
'ha_locale_bici',
|
|
'ha_lavanderia',
|
|
'altri_locali_comuni',
|
|
'note',
|
|
'attiva',
|
|
'created_by',
|
|
'updated_by'
|
|
];
|
|
|
|
protected $casts = [
|
|
'ha_piano_terra' => 'boolean',
|
|
'superficie_totale' => 'decimal:2',
|
|
'mq_giardino_comune' => 'decimal:2',
|
|
'mq_terrazza_comune' => 'decimal:2',
|
|
'ha_ascensore' => 'boolean',
|
|
'ha_montacarichi' => 'boolean',
|
|
'ha_videocitofono' => 'boolean',
|
|
'ha_impianto_allarme' => 'boolean',
|
|
'accessibile_disabili' => 'boolean',
|
|
'ha_giardino_comune' => 'boolean',
|
|
'ha_terrazza_comune' => 'boolean',
|
|
'ha_locale_caldaia' => 'boolean',
|
|
'ha_locale_contatori' => 'boolean',
|
|
'ha_locale_bici' => 'boolean',
|
|
'ha_lavanderia' => 'boolean',
|
|
'attiva' => 'boolean',
|
|
];
|
|
|
|
/**
|
|
* Relazione con Stabile
|
|
*/
|
|
public function stabile(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Stabile::class);
|
|
}
|
|
|
|
/**
|
|
* Relazione con Unità Immobiliari
|
|
*/
|
|
public function unitaImmobiliari(): HasMany
|
|
{
|
|
return $this->hasMany(UnitaImmobiliare::class);
|
|
}
|
|
|
|
/**
|
|
* 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 per palazzine attive
|
|
*/
|
|
public function scopeAttive($query)
|
|
{
|
|
return $query->where('attiva', true);
|
|
}
|
|
|
|
/**
|
|
* Scope per stabile
|
|
*/
|
|
public function scopePerStabile($query, $stabileId)
|
|
{
|
|
return $query->where('stabile_id', $stabileId);
|
|
}
|
|
|
|
/**
|
|
* Calcola il numero totale di piani
|
|
*/
|
|
public function getNumeroTotalePianiAttribute()
|
|
{
|
|
$piani = $this->numero_piani_fuori_terra + $this->numero_piani_interrati;
|
|
return $this->ha_piano_terra ? $piani + 1 : $piani;
|
|
}
|
|
|
|
/**
|
|
* Calcola il numero teorico di unità immobiliari
|
|
*/
|
|
public function getNumeroTeoricoUnitaAttribute()
|
|
{
|
|
return $this->numero_scale * $this->numero_totale_piani * $this->appartamenti_per_piano;
|
|
}
|
|
|
|
/**
|
|
* Calcola il numero effettivo di unità immobiliari
|
|
*/
|
|
public function getNumeroEffettivoUnitaAttribute()
|
|
{
|
|
return $this->unitaImmobiliari()->count();
|
|
}
|
|
|
|
/**
|
|
* Verifica se la palazzina ha l'ascensore
|
|
*/
|
|
public function hasAscensore()
|
|
{
|
|
return $this->ha_ascensore && $this->numero_ascensori > 0;
|
|
}
|
|
|
|
/**
|
|
* Calcola la superficie totale degli spazi comuni
|
|
*/
|
|
public function getSuperficieSpaziFomuniAttribute()
|
|
{
|
|
$superficie = 0;
|
|
if ($this->ha_giardino_comune) {
|
|
$superficie += $this->mq_giardino_comune ?? 0;
|
|
}
|
|
if ($this->ha_terrazza_comune) {
|
|
$superficie += $this->mq_terrazza_comune ?? 0;
|
|
}
|
|
return $superficie;
|
|
}
|
|
|
|
/**
|
|
* Genera automaticamente le unità immobiliari per questa palazzina
|
|
*/
|
|
public function generaUnitaImmobiliari()
|
|
{
|
|
$unita = [];
|
|
|
|
// Ciclo per ogni scala
|
|
for ($scala = 1; $scala <= $this->numero_scale; $scala++) {
|
|
// Calcola i piani da generare
|
|
$pianiDaGenerare = [];
|
|
|
|
// Piani interrati
|
|
for ($piano = -$this->numero_piani_interrati; $piano < 0; $piano++) {
|
|
$pianiDaGenerare[] = $piano;
|
|
}
|
|
|
|
// Piano terra (se presente)
|
|
if ($this->ha_piano_terra) {
|
|
$pianiDaGenerare[] = 0;
|
|
}
|
|
|
|
// Piani superiori
|
|
for ($piano = 1; $piano <= $this->numero_piani_fuori_terra; $piano++) {
|
|
$pianiDaGenerare[] = $piano;
|
|
}
|
|
|
|
// Genera unità per ogni piano
|
|
foreach ($pianiDaGenerare as $piano) {
|
|
for ($interno = 1; $interno <= $this->appartamenti_per_piano; $interno++) {
|
|
$codiceUnita = sprintf(
|
|
'%s-%d-%s-%02d',
|
|
$this->codice_palazzina,
|
|
$scala,
|
|
$piano < 0 ? "({$piano})" : $piano,
|
|
$interno
|
|
);
|
|
|
|
$unita[] = [
|
|
'stabile_id' => $this->stabile_id,
|
|
'palazzina_id' => $this->id,
|
|
'codice_unita' => $codiceUnita,
|
|
'palazzina' => $this->codice_palazzina,
|
|
'scala' => (string)$scala,
|
|
'piano' => $piano,
|
|
'interno' => sprintf('%02d', $interno),
|
|
'denominazione' => "Unità {$codiceUnita}",
|
|
'millesimi_generali' => round(1000 / $this->numero_teorico_unita, 3),
|
|
'created_at' => now(),
|
|
'updated_at' => now(),
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $unita;
|
|
}
|
|
|
|
/**
|
|
* Esegue la generazione automatica delle unità immobiliari
|
|
*/
|
|
public function eseguiGenerazioneUnita()
|
|
{
|
|
$unita = $this->generaUnitaImmobiliari();
|
|
|
|
// Elimina le unità esistenti per questa palazzina
|
|
$this->unitaImmobiliari()->delete();
|
|
|
|
// Inserisce le nuove unità
|
|
foreach ($unita as $unitaData) {
|
|
UnitaImmobiliare::create($unitaData);
|
|
}
|
|
|
|
return count($unita);
|
|
}
|
|
}
|