netgescon-master/app/Models/DettaglioTabellaMillesimale.php
Pikappa2 2e47dd8bc0 feat: Complete millésimal tables system implementation
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
2025-07-08 17:03:12 +02:00

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