✨ 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
228 lines
5.3 KiB
PHP
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';
|
|
}
|
|
}
|