'decimal:2', 'percentuale_proprietario' => 'decimal:2', 'data_inizio' => 'date', 'data_fine' => 'date' ]; /** * Relazione con l'unità immobiliare */ public function unitaImmobiliare() { return $this->belongsTo(UnitaImmobiliare::class); } /** * Scope per ripartizioni attive */ public function scopeAttive($query) { return $query->whereDate('data_inizio', '<=', now()) ->where(function ($q) { $q->whereNull('data_fine') ->orWhereDate('data_fine', '>=', now()); }); } /** * Scope per tipo di spesa */ public function scopeByTipoSpesa($query, $tipo) { return $query->where('tipo_spesa', $tipo); } /** * Scope per categoria Confedilizia */ public function scopeByCategoriaConfedilizia($query, $categoria) { return $query->where('categoria_confedilizia', $categoria); } /** * Scope per unità immobiliare */ public function scopeByUnitaImmobiliare($query, $unitaId) { return $query->where('unita_immobiliare_id', $unitaId); } /** * Accessor per il tipo di spesa formattato */ public function getTipoSpesaFormattatoAttribute() { return match ($this->tipo_spesa) { 'ordinaria' => 'Spesa Ordinaria', 'straordinaria' => 'Spesa Straordinaria', 'manutenzione' => 'Manutenzione', 'pulizia' => 'Pulizia', 'illuminazione' => 'Illuminazione', 'riscaldamento' => 'Riscaldamento', 'ascensore' => 'Ascensore', 'portierato' => 'Portierato', 'amministrazione' => 'Amministrazione', 'assicurazione' => 'Assicurazione', 'vigilanza' => 'Vigilanza', 'giardino' => 'Giardino/Verde', default => ucfirst(str_replace('_', ' ', $this->tipo_spesa)) }; } /** * Accessor per la categoria Confedilizia formattata */ public function getCategoriaConfediliziaFormattataAttribute() { return match ($this->categoria_confedilizia) { 'A' => 'A - Spese per le parti comuni dell\'edificio', 'B' => 'B - Spese per l\'impianto di riscaldamento', 'C' => 'C - Spese per l\'impianto dell\'ascensore', 'D' => 'D - Spese per l\'illuminazione delle parti comuni', 'E' => 'E - Spese per la pulizia delle parti comuni', 'F' => 'F - Spese per la manutenzione dell\'impianto citofonico', 'G' => 'G - Spese per la fornitura dell\'acqua', 'H' => 'H - Spese per lo spurgo dei pozzi neri', 'I' => 'I - Spese per la manutenzione delle aree verdi', 'L' => 'L - Spese per l\'energia elettrica', 'M' => 'M - Spese per il riscaldamento centralizzato', 'N' => 'N - Spese per la vigilanza', 'O' => 'O - Spese per l\'amministrazione', default => $this->categoria_confedilizia }; } /** * Metodo per verificare se la ripartizione è attiva */ public function isAttiva() { $oggi = now()->toDateString(); if ($this->data_inizio > $oggi) { return false; // Non ancora iniziata } if ($this->data_fine && $this->data_fine < $oggi) { return false; // Già finita } return true; // Attiva } /** * Metodo per calcolare l'importo a carico dell'inquilino */ public function calcolaImportoInquilino($importo_totale) { return $importo_totale * ($this->percentuale_inquilino / 100); } /** * Metodo per calcolare l'importo a carico del proprietario */ public function calcolaImportoProprietario($importo_totale) { return $importo_totale * ($this->percentuale_proprietario / 100); } /** * Metodo per validare le percentuali */ public function validaPercentuali() { return ($this->percentuale_inquilino + $this->percentuale_proprietario) == 100; } /** * Metodo statico per ottenere i default Confedilizia per categoria */ public static function getDefaultConfedilizia($categoria) { $defaults = [ 'A' => ['inquilino' => 0, 'proprietario' => 100], // Parti comuni 'B' => ['inquilino' => 100, 'proprietario' => 0], // Riscaldamento 'C' => ['inquilino' => 100, 'proprietario' => 0], // Ascensore 'D' => ['inquilino' => 100, 'proprietario' => 0], // Illuminazione 'E' => ['inquilino' => 100, 'proprietario' => 0], // Pulizia 'F' => ['inquilino' => 100, 'proprietario' => 0], // Citofono 'G' => ['inquilino' => 100, 'proprietario' => 0], // Acqua 'H' => ['inquilino' => 100, 'proprietario' => 0], // Spurgo pozzi 'I' => ['inquilino' => 0, 'proprietario' => 100], // Aree verdi 'L' => ['inquilino' => 100, 'proprietario' => 0], // Energia elettrica 'M' => ['inquilino' => 100, 'proprietario' => 0], // Riscaldamento centralizzato 'N' => ['inquilino' => 100, 'proprietario' => 0], // Vigilanza 'O' => ['inquilino' => 0, 'proprietario' => 100], // Amministrazione ]; return $defaults[$categoria] ?? ['inquilino' => 50, 'proprietario' => 50]; } /** * Metodo statico per creare ripartizioni default per un'unità */ public static function creaRipartizioniDefault($unita_immobiliare_id) { $categorie = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'L', 'M', 'N', 'O']; foreach ($categorie as $categoria) { $default = self::getDefaultConfedilizia($categoria); self::create([ 'unita_immobiliare_id' => $unita_immobiliare_id, 'tipo_spesa' => self::getTipoSpesaByCategoria($categoria), 'categoria_confedilizia' => $categoria, 'percentuale_inquilino' => $default['inquilino'], 'percentuale_proprietario' => $default['proprietario'], 'data_inizio' => now(), 'note' => 'Creata automaticamente secondo tabella Confedilizia' ]); } } /** * Metodo privato per mappare categoria a tipo spesa */ private static function getTipoSpesaByCategoria($categoria) { $mapping = [ 'A' => 'ordinaria', 'B' => 'riscaldamento', 'C' => 'ascensore', 'D' => 'illuminazione', 'E' => 'pulizia', 'F' => 'manutenzione', 'G' => 'ordinaria', 'H' => 'ordinaria', 'I' => 'giardino', 'L' => 'illuminazione', 'M' => 'riscaldamento', 'N' => 'vigilanza', 'O' => 'amministrazione' ]; return $mapping[$categoria] ?? 'ordinaria'; } }