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