netgescon-day0/app/Models/DettaglioRipartizioneSpese.php

228 lines
5.3 KiB
PHP
Executable File

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