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 @login_required
def detail(meter_id): def detail(meter_id):
"""Détails d'un compteur avec historique des relevés.""" """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)\ readings = MeterReading.query.options(joinedload(MeterReading.read_by)).filter_by(meter_id=meter_id)\
.order_by(MeterReading.reading_date.desc()).limit(50).all() .order_by(MeterReading.reading_date.desc()).limit(50).all()
@ -164,6 +168,7 @@ def edit(meter_id):
if scope_key: if scope_key:
for key in scope_keys: for key in scope_keys:
setattr(meter, key, scope_id if key == scope_key else None) 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.usage = (request.form.get('usage') or '').strip() or None
meter.remainder_label = (request.form.get('remainder_label') 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 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(), zones=Zone.query.order_by(Zone.name).all(),
rooms=Room.query.order_by(Room.name).all(), rooms=Room.query.order_by(Room.name).all(),
housing_units=HousingUnit.query.order_by(HousingUnit.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, timedelta=timedelta,
today=date.today()) today=date.today())

View file

@ -89,7 +89,18 @@
{% endif %} {% endif %}
</dd> </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"> <dd class="col-sm-7">
{% if meter.warning_level == 'critical' %} {% if meter.warning_level == 'critical' %}
<span class="badge bg-danger">Critique</span> <span class="badge bg-danger">Critique</span>
@ -101,6 +112,15 @@
<span class="badge bg-success">OK</span> <span class="badge bg-success">OK</span>
{% endif %} {% endif %}
</dd> </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> </dl>
</div> </div>
</div> </div>

View file

@ -46,14 +46,36 @@
value="{{ meter.name }}"> value="{{ meter.name }}">
</div> </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="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label for="meter_type" class="form-label">Type</label> <label for="meter_type" class="form-label">Type</label>
<select class="form-select" id="meter_type" name="meter_type"> <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="hours" {% if meter.meter_type == 'hours' %}selected{% endif %}>Heures</option>
<option value="cycles" {% if meter.meter_type == 'cycles' %}selected{% endif %}>Cycles</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="distance" {% if meter.meter_type == 'distance' %}selected{% endif %}>Distance</option>
<option value="custom" {% if meter.meter_type == 'custom' %}selected{% endif %}>Personnalisé</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> </select>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
@ -144,7 +166,7 @@
<h6>Intervalle de relevé</h6> <h6>Intervalle de relevé</h6>
<p class="text-muted small"> <p class="text-muted small">
Définissez la fréquence à laquelle vous souhaitez effectuer les relevés. 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> </p>
<h6 class="mt-3">Prochain relevé</h6> <h6 class="mt-3">Prochain relevé</h6>
@ -153,7 +175,7 @@
<p class="{% if next_date < today %}text-danger{% else %}text-success{% endif %}"> <p class="{% if next_date < today %}text-danger{% else %}text-success{% endif %}">
<strong>{{ next_date.strftime('%d/%m/%Y') }}</strong> <strong>{{ next_date.strftime('%d/%m/%Y') }}</strong>
{% if next_date < today %} {% 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 %} {% endif %}
</p> </p>
{% else %} {% else %}
@ -162,10 +184,14 @@
<h6 class="mt-3">Types de compteurs</h6> <h6 class="mt-3">Types de compteurs</h6>
<ul class="small"> <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>Heures</strong> - Compteur d'heures (motrice, groupe électrogène...)</li>
<li><strong>Cycles</strong> - Nombre d'ouvertures/fermetures</li> <li><strong>Cycles</strong> - Nombre d'ouvertures/fermetures</li>
<li><strong>Distance</strong> - Kilométrage (véhicule...)</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> </ul>
</div> </div>
</div> </div>