netgescon-master/_BACKUP_OLD_netgescon-laravel_INACTIVE/app/Models/AlgoritmoRipartizione.php

123 lines
3.3 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class AlgoritmoRipartizione extends Model
{
use HasFactory;
protected $table = 'algoritmi_ripartizione';
protected $fillable = [
'stabile_id',
'tipo_consumo',
'nome_algoritmo',
'parametri_algoritmo',
'quota_fissa_percentuale',
'quota_consumo_percentuale',
'attivo',
'validita_da',
'validita_a',
'note'
];
protected $casts = [
'parametri_algoritmo' => 'array',
'quota_fissa_percentuale' => 'decimal:2',
'quota_consumo_percentuale' => 'decimal:2',
'attivo' => 'boolean',
'validita_da' => 'date',
'validita_a' => 'date'
];
/**
* Relazione con Stabile
*/
public function stabile()
{
return $this->belongsTo(Stabile::class, 'stabile_id', 'id');
}
/**
* Scope per algoritmi attivi
*/
public function scopeAttivi($query)
{
return $query->where('attivo', true);
}
/**
* Scope per tipo consumo
*/
public function scopePerTipo($query, $tipo)
{
return $query->where('tipo_consumo', $tipo);
}
/**
* Scope per algoritmi validi in una data
*/
public function scopeValidiPer($query, $data = null)
{
$data = $data ?: now()->toDateString();
return $query->where(function($q) use ($data) {
$q->whereNull('validita_da')
->orWhere('validita_da', '<=', $data);
})->where(function($q) use ($data) {
$q->whereNull('validita_a')
->orWhere('validita_a', '>=', $data);
});
}
/**
* Verifica se l'algoritmo è valido per una data
*/
public function isValidoPer($data = null): bool
{
$data = $data ?: now()->toDateString();
if ($this->validita_da && $this->validita_da > $data) {
return false;
}
if ($this->validita_a && $this->validita_a < $data) {
return false;
}
return $this->attivo;
}
/**
* Calcola ripartizione per unità immobiliare
*/
public function calcolaRipartizione($unitaImmobiliare, $costoTotale, $consumoUnita = 0, $consumoTotale = 1): array
{
$quotaFissa = ($costoTotale * $this->quota_fissa_percentuale / 100);
$quotaConsumo = ($costoTotale * $this->quota_consumo_percentuale / 100);
// Quota fissa: proporzionale ai millesimi di proprietà
$millesimiProprieta = $unitaImmobiliare->millesimi_proprieta / 1000;
$quotaFissaUnita = $quotaFissa * $millesimiProprieta;
// Quota consumo: proporzionale ai consumi effettivi
$quotaConsumoUnita = 0;
if ($consumoTotale > 0) {
$quotaConsumoUnita = $quotaConsumo * ($consumoUnita / $consumoTotale);
}
$totaleUnita = $quotaFissaUnita + $quotaConsumoUnita;
return [
'quota_fissa' => round($quotaFissaUnita, 2),
'quota_consumo' => round($quotaConsumoUnita, 2),
'totale' => round($totaleUnita, 2),
'consumo_unita' => $consumoUnita,
'algoritmo' => $this->nome_algoritmo
];
}
}