123 lines
3.3 KiB
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
|
|
];
|
|
}
|
|
}
|