'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 ]; } }