netgescon-master/app/Models/Contatore.php
2025-07-20 14:57:25 +00:00

129 lines
2.9 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Contatore extends Model
{
use HasFactory, SoftDeletes;
protected $table = 'contatori';
protected $fillable = [
'stabile_id',
'unita_immobiliare_id',
'tipo_contatore',
'numero_contatore',
'marca',
'modello',
'data_installazione',
'lettura_iniziale',
'ubicazione',
'telelettura',
'configurazione_telelettura',
'attivo',
'note'
];
protected $casts = [
'data_installazione' => '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;
}
}