'date', 'lettura_iniziale' => 'decimal:3', 'telelettura' => 'boolean', 'configurazione_telelettura' => 'array', 'attivo' => 'boolean' ]; /** * Relazione con Stabile */ public function stabile() { return $this->belongsTo(Stabile::class, 'stabile_id', 'id'); } /** * Relazione con UnitaImmobiliare (nullable per contatori condominiali) */ public function unitaImmobiliare() { return $this->belongsTo(UnitaImmobiliare::class, 'unita_immobiliare_id', 'id'); } /** * Relazione con letture */ public function letture() { return $this->hasMany(LetturaContatore::class, 'contatore_id', 'id')->orderBy('data_lettura', 'desc'); } /** * Ultima lettura */ public function ultimaLettura() { return $this->hasOne(LetturaContatore::class, 'contatore_id', 'id')->latest('data_lettura'); } /** * Scope per contatori attivi */ public function scopeAttivi($query) { return $query->where('attivo', true); } /** * Scope per tipo contatore */ public function scopePerTipo($query, $tipo) { return $query->where('tipo_contatore', $tipo); } /** * Scope per contatori condominiali */ public function scopeCondominiali($query) { return $query->whereNull('unita_immobiliare_id'); } /** * Scope per contatori di unità */ public function scopeUnita($query) { return $query->whereNotNull('unita_immobiliare_id'); } /** * Verifica se è un contatore condominiale */ public function isCondominiale(): bool { return is_null($this->unita_immobiliare_id); } /** * Ottieni lettura attuale */ public function getLetturaAttuale(): ?float { $ultimaLettura = $this->ultimaLettura; return $ultimaLettura ? $ultimaLettura->lettura_attuale : $this->lettura_iniziale; } /** * Calcola consumo totale dall'installazione */ public function getConsumoTotale(): float { $letturaAttuale = $this->getLetturaAttuale(); return $letturaAttuale - $this->lettura_iniziale; } }