fix(meters): complete checkpoint C1 meter UI

This commit is contained in:
root 2026-08-23 23:11:04 +00:00
parent d2c1632319
commit de46775c22
3 changed files with 57 additions and 5 deletions

View file

@ -82,7 +82,11 @@ def new():
@login_required
def detail(meter_id):
"""Détails d'un compteur avec historique des relevés."""
meter = Meter.query.get_or_404(meter_id)
meter = Meter.query.options(
joinedload(Meter.equipment), joinedload(Meter.building), joinedload(Meter.zone),
joinedload(Meter.room), joinedload(Meter.housing_unit),
joinedload(Meter.replaced_meter), joinedload(Meter.replacement),
).get_or_404(meter_id)
readings = MeterReading.query.options(joinedload(MeterReading.read_by)).filter_by(meter_id=meter_id)\
.order_by(MeterReading.reading_date.desc()).limit(50).all()
@ -164,6 +168,7 @@ def edit(meter_id):
if scope_key:
for key in scope_keys:
setattr(meter, key, scope_id if key == scope_key else None)
meter.parent_id = request.form.get('parent_id', type=int)
meter.usage = (request.form.get('usage') or '').strip() or None
meter.remainder_label = (request.form.get('remainder_label') or '').strip() or None
meter.status = request.form.get('status') or meter.status
@ -186,6 +191,7 @@ def edit(meter_id):
zones=Zone.query.order_by(Zone.name).all(),
rooms=Room.query.order_by(Room.name).all(),
housing_units=HousingUnit.query.order_by(HousingUnit.name).all(),
meters=Meter.query.filter(Meter.id != meter_id).order_by(Meter.name).all(),
timedelta=timedelta,
today=date.today())

View file

@ -89,7 +89,18 @@
{% endif %}
</dd>
<dt class="col-sm-5">Statut</dt>
<dt class="col-sm-5">État du compteur</dt>
<dd class="col-sm-7">
{% if meter.status == 'replaced' %}
<span class="badge bg-secondary">Remplacé</span>
{% elif meter.status == 'active' %}
<span class="badge bg-success">Actif</span>
{% else %}
<span class="badge bg-secondary">{{ meter.status }}</span>
{% endif %}
</dd>
<dt class="col-sm-5">État des seuils historiques</dt>
<dd class="col-sm-7">
{% if meter.warning_level == 'critical' %}
<span class="badge bg-danger">Critique</span>
@ -101,6 +112,15 @@
<span class="badge bg-success">OK</span>
{% endif %}
</dd>
{% if meter.replaced_meter %}
<dt class="col-sm-5">Remplace</dt>
<dd class="col-sm-7"><a href="{{ url_for('meters.detail', meter_id=meter.replaced_meter.id) }}">{{ meter.replaced_meter.name }}</a></dd>
{% endif %}
{% if meter.replacement %}
<dt class="col-sm-5">Remplacé par</dt>
<dd class="col-sm-7"><a href="{{ url_for('meters.detail', meter_id=meter.replacement.id) }}">{{ meter.replacement.name }}</a></dd>
{% endif %}
</dl>
</div>
</div>

View file

@ -45,15 +45,37 @@
<input type="text" class="form-control" id="name" name="name" required
value="{{ meter.name }}">
</div>
<div class="mb-3">
<label for="parent_id" class="form-label">Compteur parent</label>
<select class="form-select" id="parent_id" name="parent_id">
<option value="">Aucun — compteur racine</option>
{% for parent in meters %}
{% if parent.id != meter.id %}
<option value="{{ parent.id }}" {% if meter.parent_id == parent.id %}selected{% endif %}>
{{ parent.name }}{% if parent.unit %} ({{ parent.unit }}){% endif %}
</option>
{% endif %}
{% endfor %}
</select>
<small class="text-muted">Le compteur ne peut pas être son propre parent ni appartenir à un cycle.</small>
</div>
<div class="row mb-3">
<div class="col-md-6">
<label for="meter_type" class="form-label">Type</label>
<select class="form-select" id="meter_type" name="meter_type">
<option value="eau" {% if meter.meter_type == 'eau' %}selected{% endif %}>Eau</option>
<option value="gaz" {% if meter.meter_type == 'gaz' %}selected{% endif %}>Gaz</option>
<option value="electricite" {% if meter.meter_type == 'electricite' %}selected{% endif %}>Électricité</option>
<option value="photocopieur" {% if meter.meter_type == 'photocopieur' %}selected{% endif %}>Photocopieur</option>
<option value="hours" {% if meter.meter_type == 'hours' %}selected{% endif %}>Heures</option>
<option value="cycles" {% if meter.meter_type == 'cycles' %}selected{% endif %}>Cycles</option>
<option value="distance" {% if meter.meter_type == 'distance' %}selected{% endif %}>Distance</option>
<option value="custom" {% if meter.meter_type == 'custom' %}selected{% endif %}>Personnalisé</option>
{% if meter.meter_type not in ['eau', 'gaz', 'electricite', 'photocopieur', 'hours', 'cycles', 'distance', 'custom'] %}
<option value="{{ meter.meter_type }}" selected>Autre — {{ meter.meter_type }}</option>
{% endif %}
</select>
</div>
<div class="col-md-6">
@ -144,7 +166,7 @@
<h6>Intervalle de relevé</h6>
<p class="text-muted small">
Définissez la fréquence à laquelle vous souhaitez effectuer les relevés.
Le système vous rappellera quand un relevé est attendu.
Il s'agit d'une fréquence indicative. La planification automatique des échéances sera gérée par le module de relevés planifiés.
</p>
<h6 class="mt-3">Prochain relevé</h6>
@ -153,7 +175,7 @@
<p class="{% if next_date < today %}text-danger{% else %}text-success{% endif %}">
<strong>{{ next_date.strftime('%d/%m/%Y') }}</strong>
{% if next_date < today %}
<span class="badge bg-danger">En retard</span>
<span class="badge bg-danger">Indication calculée : date dépassée</span>
{% endif %}
</p>
{% else %}
@ -162,10 +184,14 @@
<h6 class="mt-3">Types de compteurs</h6>
<ul class="small">
<li><strong>Eau</strong> — index physique en m³</li>
<li><strong>Gaz</strong> — index physique en m³</li>
<li><strong>Électricité</strong> — unité selon le compteur</li>
<li><strong>Photocopieur</strong> — pages N&amp;B ou couleur</li>
<li><strong>Heures</strong> - Compteur d'heures (motrice, groupe électrogène...)</li>
<li><strong>Cycles</strong> - Nombre d'ouvertures/fermetures</li>
<li><strong>Distance</strong> - Kilométrage (véhicule...)</li>
<li><strong>Personnalisé</strong> - Autre unité (m³, litres...)</li>
<li><strong>Personnalisé / autre</strong> - Autre unité (m³, litres...)</li>
</ul>
</div>
</div>