netgescon-master/app/Models/DettaglioRipartizioneSpese.php
Pikappa2 bb38044019 feat: Implementazione completa sistema ripartizione spese e gestione rate
 Nuovo Sistema Ripartizione Spese:
- Migration e modelli RipartizioneSpese, DettaglioRipartizioneSpese
- Calcolo automatico ripartizione millesimale
- Gestione quote personalizzate ed esenzioni
- Stati workflow: bozza → confermata → contabilizzata
- Integrazione con tabelle millesimali e voci spesa

 Nuovo Sistema Gestione Rate:
- Migration e modelli PianoRateizzazione, Rata (aggiornato)
- Generazione automatica rate per piani di rateizzazione
- Gestione pagamenti completi e parziali
- Frequenze: mensile, trimestrale, semestrale, personalizzata
- Monitoraggio scadenze e stati rate

🔧 Funzionalità Avanzate:
- Codici automatici univoci (RS*, PR*, RT*)
- Relazioni complete tra tutti i modelli
- Scope e query builder avanzati
- Statistiche e reporting
- Backward compatibility con vecchia struttura

�� Test e Integrazione:
- Test modelli e database completati
- Relazioni Eloquent integrate
- Metodi di calcolo validati
- Sistema pronto per produzione
2025-07-08 17:42:01 +02:00

228 lines
5.3 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
/**
* Class DettaglioRipartizioneSpese
*
* Gestisce i dettagli della ripartizione spese per ogni unità immobiliare
*
* @package App\Models
*/
class DettaglioRipartizioneSpese extends Model
{
use HasFactory;
protected $table = 'dettaglio_ripartizione_spese';
protected $fillable = [
'ripartizione_spese_id',
'unita_immobiliare_id',
'anagrafica_condominiale_id',
'millesimi_applicati',
'percentuale_applicata',
'quota_calcolata',
'quota_personalizzata',
'quota_finale',
'esente',
'motivo_esenzione',
'note_dettaglio',
'tipo_soggetto',
'percentuale_inquilino',
'importo_inquilino',
'importo_proprietario'
];
protected $casts = [
'millesimi_applicati' => 'decimal:3',
'percentuale_applicata' => 'decimal:2',
'quota_calcolata' => 'decimal:2',
'quota_personalizzata' => 'decimal:2',
'quota_finale' => 'decimal:2',
'percentuale_inquilino' => 'decimal:2',
'importo_inquilino' => 'decimal:2',
'importo_proprietario' => 'decimal:2',
'esente' => 'boolean'
];
/**
* Relazione con RipartizioneSpese
*/
public function ripartizioneSpese()
{
return $this->belongsTo(RipartizioneSpese::class);
}
/**
* Relazione con UnitaImmobiliare
*/
public function unitaImmobiliare()
{
return $this->belongsTo(UnitaImmobiliare::class);
}
/**
* Relazione con AnagraficaCondominiale
*/
public function anagraficaCondominiale()
{
return $this->belongsTo(AnagraficaCondominiale::class);
}
/**
* Scope per dettagli non esenti
*/
public function scopeNonEsenti($query)
{
return $query->where('esente', false);
}
/**
* Scope per dettagli esenti
*/
public function scopeEsenti($query)
{
return $query->where('esente', true);
}
/**
* Scope per tipo soggetto
*/
public function scopePerTipoSoggetto($query, $tipo)
{
return $query->where('tipo_soggetto', $tipo);
}
/**
* Metodo per calcolare la quota finale
*/
public function calcolaQuotaFinale()
{
if ($this->esente) {
$this->quota_finale = 0;
} else {
$this->quota_finale = $this->quota_personalizzata ?? $this->quota_calcolata;
}
$this->save();
return $this;
}
/**
* Metodo per applicare esenzione
*/
public function applicaEsenzione($motivo = null)
{
$this->update([
'esente' => true,
'motivo_esenzione' => $motivo,
'quota_finale' => 0,
'importo_inquilino' => 0,
'importo_proprietario' => 0
]);
return $this;
}
/**
* Metodo per rimuovere esenzione
*/
public function rimuoviEsenzione()
{
$this->update([
'esente' => false,
'motivo_esenzione' => null
]);
$this->calcolaQuotaFinale();
return $this;
}
/**
* Metodo per personalizzare la quota
*/
public function personalizzaQuota($nuovaQuota, $motivo = null)
{
$this->update([
'quota_personalizzata' => $nuovaQuota,
'note_dettaglio' => $motivo
]);
$this->calcolaQuotaFinale();
return $this;
}
/**
* Metodo per calcolare ripartizione inquilino/proprietario
*/
public function calcolaRipartizioneInquilinoProprietario()
{
if ($this->percentuale_inquilino > 0) {
$this->importo_inquilino = $this->quota_finale * ($this->percentuale_inquilino / 100);
$this->importo_proprietario = $this->quota_finale - $this->importo_inquilino;
} else {
$this->importo_inquilino = 0;
$this->importo_proprietario = $this->quota_finale;
}
$this->save();
return $this;
}
/**
* Verifica se la quota è stata personalizzata
*/
public function isPersonalizzata()
{
return !is_null($this->quota_personalizzata);
}
/**
* Ottieni la differenza tra quota calcolata e personalizzata
*/
public function getDifferenzaQuote()
{
if (!$this->isPersonalizzata()) {
return 0;
}
return $this->quota_personalizzata - $this->quota_calcolata;
}
/**
* Accessor per tipo soggetto formattato
*/
public function getTipoSoggettoFormattatoAttribute()
{
return match ($this->tipo_soggetto) {
'proprietario' => 'Proprietario',
'inquilino' => 'Inquilino',
'usufruttuario' => 'Usufruttuario',
'altro' => 'Altro',
default => ucfirst($this->tipo_soggetto)
};
}
/**
* Accessor per percentuale millesimi
*/
public function getPercentualeMillesimiAttribute()
{
if ($this->millesimi_applicati) {
return ($this->millesimi_applicati / 1000) * 100;
}
return 0;
}
/**
* Accessor per stato esenzione formattato
*/
public function getStatoEsenzioneAttribute()
{
return $this->esente ? 'Esente' : 'Non Esente';
}
}