netgescon-day0/app/Models/DettaglioTabellaMillesimale.php

102 lines
2.5 KiB
PHP
Executable File

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class DettaglioTabellaMillesimale extends Model
{
use HasFactory;
protected $table = 'dettagli_tabelle_millesimali';
protected $fillable = [
'tabella_millesimale_id',
'unita_immobiliare_id',
'millesimi',
'note',
];
protected $casts = [
'millesimi' => 'decimal:4',
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
/**
* Relazione con Tabella Millesimale
*/
public function tabellaMillesimale()
{
return $this->belongsTo(TabellaMillesimale::class, 'tabella_millesimale_id');
}
/**
* Relazione con Unità Immobiliare
*/
public function unitaImmobiliare()
{
return $this->belongsTo(UnitaImmobiliare::class, 'unita_immobiliare_id', 'id');
}
/**
* Boot del modello per validazioni
*/
protected static function boot()
{
parent::boot();
static::saving(function ($model) {
// Validazione millesimi positivi
if ($model->millesimi < 0) {
throw new \InvalidArgumentException('I millesimi non possono essere negativi');
}
// Validazione millesimi ragionevoli (max 1000 per singola unità)
if ($model->millesimi > 1000) {
throw new \InvalidArgumentException('I millesimi per singola unità non possono superare 1000');
}
});
}
/**
* Scope per una specifica tabella millesimale
*/
public function scopeByTabella($query, $tabellaId)
{
return $query->where('tabella_millesimale_id', $tabellaId);
}
/**
* Scope per una specifica unità immobiliare
*/
public function scopeByUnita($query, $unitaId)
{
return $query->where('unita_immobiliare_id', $unitaId);
}
/**
* Accessor per percentuale (millesimi/10)
*/
public function getPercentualeAttribute()
{
return $this->millesimi / 10;
}
/**
* Accessor per millesimi formattati
*/
public function getMillesimiFormattatiAttribute()
{
return number_format($this->millesimi, 4, ',', '.');
}
/**
* Metodo per calcolare la quota di una spesa
*/
public function calcolaQuotaSpesa($importoTotale)
{
return ($importoTotale * $this->millesimi) / 1000;
}
}