PHASE 2 COMPLETED: MILLÉSIMAL TABLES ✅ MODELS ENHANCED: - TabellaMillesimale: Advanced methods for balance calculation, quota management - DettaglioTabellaMillesimale: Validation, percentage calculation, expense quota - Fixed Eloquent relationships with correct foreign keys (id instead of legacy keys) FEATURES IMPLEMENTED: ✅ Automatic balance verification (totale_millesimi = 1000) ✅ Quota calculation for expense distribution ✅ Standard table types (proprietà_generale, scale, ascensore, etc.) ✅ Validation for positive millesimi values ✅ Automatic code generation for AnagraficaCondominiale (ANA prefix) ✅ Complete relationship testing (Amministratore→Stabili→Unità→Millesimi) TESTING COMPLETED: ✅ Tabella millesimale creation and balance verification ✅ Unità immobiliari creation with correct field names ✅ Millesimi assignment and calculation (470.5882 + 529.4118 = 1000.0000) ✅ Expense quota calculation (€470.59 + €529.41 = €1000.00) ✅ Advanced features: riassunto, percentages, standard types DATABASE STATUS: - 1 Tabella Millesimale: 'Proprietà Generale' (balanced: SI) - 2 Unità Immobiliari: Interno 1 & 2 with correct millesimi - All relationships operational and tested READY FOR PHASE 3: EXPENSE CATEGORIES & VOICE MANAGEMENT
102 lines
2.5 KiB
PHP
102 lines
2.5 KiB
PHP
<?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;
|
|
}
|
|
} |