netgescon-master/netgescon-laravel/app/Models/RipartizioneSpeseInquilini.php

234 lines
7.5 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class RipartizioneSpeseInquilini extends Model
{
use HasFactory, SoftDeletes;
protected $table = 'ripartizione_spese_inquilini';
protected $fillable = [
'unita_immobiliare_id',
'tipo_spesa',
'categoria_confedilizia',
'percentuale_inquilino',
'percentuale_proprietario',
'data_inizio',
'data_fine',
'note'
];
protected $casts = [
'percentuale_inquilino' => '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';
}
}