MAJOR IMPLEMENTATION COMPLETED: ✅ Modern database structure with Laravel best practices ✅ Complete Eloquent relationships (Amministratore→Stabili→Movements) ✅ 8-character alphanumeric codes system (ADM, ANA, MOV, ALL prefixes) ✅ Multi-database architecture for administrators ✅ Complete property management (anagrafica_condominiale, diritti_reali, contratti) ✅ Distribution system for multi-server deployment ✅ Universal responsive UI with permission-based sidebar NEW MODELS & MIGRATIONS: - AnagraficaCondominiale: Complete person/entity management - ContattoAnagrafica: Multi-contact system with usage flags - DirittoReale: Property rights with quotas and percentages - ContrattoLocazione: Rental contracts with landlord/tenant - TipoUtilizzo: Property usage types (residential, commercial, etc.) - Enhanced Stabile: Cadastral data, SDI, rate configuration - Enhanced UnitaImmobiliare: Modern structure with backward compatibility SERVICES & CONTROLLERS: - DistributionService: Multi-server deployment and migration - FileManagerController: Administrator folder management - DistributionController: API for server-to-server communication - MultiDatabaseService: Dynamic database connections READY FOR PRODUCTION: ✅ Database schema: Complete and tested ✅ Models relationships: All working and verified ✅ Code generation: Automatic 8-char codes implemented ✅ Testing: Successful data creation confirmed ✅ Documentation: Complete internal technical docs NEXT PHASE: Millésimal tables, expense categories, cost distribution engine
234 lines
7.5 KiB
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';
|
|
}
|
|
}
|