diff --git a/app_new/configuration/routes.py b/app_new/configuration/routes.py index cb1c54a..11b8aef 100644 --- a/app_new/configuration/routes.py +++ b/app_new/configuration/routes.py @@ -37,7 +37,8 @@ def index(): technicians = User.query.filter_by(is_active=True).all() scheduled_users = {row[0] for row in WorkSchedule.query.filter_by(is_active=True).with_entities(WorkSchedule.user_id).all()} tasks_without_duration = LotTask.query.filter(LotTask.is_active.is_(True), (LotTask.duree_minutes.is_(None) | (LotTask.duree_minutes <= 0))).count() - contracts_without_due = Contract.query.filter(Contract.is_active.is_(True), Contract.end_date.is_(None)).count() if hasattr(Contract, "end_date") else 0 + contract_table = Contract.__table__.c + contracts_without_due = Contract.query.filter(contract_table.status == "actif", contract_table.end_date.is_(None)).count() room_schedules = RoomSchedule.query.count() sections = [ ("ESSENTIEL", [ diff --git a/app_new/room_profiles/routes.py b/app_new/room_profiles/routes.py index 27a2c9f..5afb88b 100644 --- a/app_new/room_profiles/routes.py +++ b/app_new/room_profiles/routes.py @@ -100,6 +100,26 @@ def delete_item(profile_id, item_id): return redirect(url_for("room_profiles.edit", id=profile_id)) +@room_profiles_bp.route("//items//edit", methods=["POST"]) +@login_required +def edit_item(profile_id, item_id): + item = RoomProfileItem.query.filter_by(id=item_id, profile_id=profile_id).first_or_404() + label = (request.form.get("label") or item.label).strip() + quantity = request.form.get("quantity", item.quantity, type=int) + if not label or not quantity or quantity < 1: + flash("Libellé et quantité positive sont obligatoires.", "danger") + return redirect(url_for("room_profiles.edit", id=profile_id)) + item.label = label + item.quantity = quantity + item.category_id = request.form.get("category_id", type=int) or None + item.lot_id = request.form.get("lot_id", type=int) or None + item.is_group = request.form.get("is_group") == "1" + item.enabled_by_default = request.form.get("enabled_by_default") == "1" + db.session.commit() + flash("Proposition du profil mise à jour. Les locaux déjà appliqués restent inchangés.", "success") + return redirect(url_for("room_profiles.edit", id=profile_id)) + + @room_profiles_bp.route("//preview", methods=["GET", "POST"]) @login_required def preview(id): @@ -151,7 +171,7 @@ def add_surface(id): profile = RoomProfile.query.get_or_404(id) surface_type = request.form.get("surface_type") material = (request.form.get("material") or "").strip() - if surface_type not in {"mur", "sol", "plafond"} or not material: + if surface_type not in {"mur", "sol", "plafond", "autre"} or not material: flash("Type et matériau de surface obligatoires.", "danger") return redirect(url_for("room_profiles.edit", id=id)) db.session.add(RoomSurface(profile_id=profile.id, surface_type=surface_type, material=material, diff --git a/app_new/room_profiles/templates/room_profiles/form.html b/app_new/room_profiles/templates/room_profiles/form.html index 489c83a..b494748 100644 --- a/app_new/room_profiles/templates/room_profiles/form.html +++ b/app_new/room_profiles/templates/room_profiles/form.html @@ -1,7 +1,12 @@ {% extends 'base.html' %} {% block title %}{{ title }}{% endblock %} {% block content %} -

{{ title }}

Un profil propose des équipements et des ouvrages. Rien n'est créé avant validation dans la prévisualisation.

-
-{% if profile %}
Équipements proposés
{% for item in profile.items %}{% else %}{% endfor %}
PropositionQtéMode
{{ item.label }}{% if item.category %} · {{ item.category.name }}{% endif %}{{ item.quantity }}{{ 'Groupe' if item.is_group else 'Individuel' }}
Aucune proposition.
Composition facultative

Application

Sélectionnez des locaux puis validez chaque proposition dans l'écran de prévisualisation.

Prévisualiser l'application
{% endif %}
+
+

{{ title }}

Un profil propose des équipements et ouvrages. Rien n’est créé avant validation.

+
+{% if profile %} +
Équipements proposés
+
{% for item in profile.items %}{% else %}{% endfor %}
PropositionQuantitéModeActions
{{ item.label }}{% if item.category %} · {{ item.category.name }}{% endif %}
{{ 'Groupe' if item.is_group else 'Individuel' }}
Aucune proposition.
+
Composition facultative
{% for surface in profile.surfaces %}
{{ surface.label or surface.surface_type }} — {{ surface.material }}{% if surface.finish %} + {{ surface.finish }}{% endif %}
{% endfor %}
+{% endif %}
{% endblock %} diff --git a/app_new/templates/base.html b/app_new/templates/base.html index 5af265f..9c90768 100644 --- a/app_new/templates/base.html +++ b/app_new/templates/base.html @@ -217,6 +217,8 @@
  • Bâtiments
  • Zones
  • Salles
  • +
  • Créer plusieurs locaux
  • +
  • Profils de locaux
  • Logements de fonction
  • Types de salles
  • {% endif %}
  • @@ -260,6 +262,8 @@