{# Anlagen-Strukturbericht — Betriebseinheiten, Gebaeude und Container. Route: /facility/audit_report. Bis zum 31.08.2026 die Python-Konstante FACILITY_REPORT_TEMPLATE. Seit dem 02.09.2026 A4 hoch mit gemessenem Umbruch — dieselben zwei Bausteine wie beim Container-Ausdruck und beim Protokoll (docs/formblatt_druck_plan.md §2d/§2e). Vorher war das hier das letzte Fluss-Dokument: eine lange Spalte, A3 hoch, deren Umbruch allein der Druckdialog machte. A3 war kein Wunsch, sondern eine Folge: die Spalte "Prozessfluesse" war die einzige mit n Zeilen je Datensatz und trieb Breite und Zeilenhoehe zugleich. Sie ist raus (der Zaehler in der Detailspalte tritt an ihre Stelle, die Sache selbst steht im Fliessschema) — damit passt der Bericht auf A4 und traegt dieselbe Blattgeometrie wie die anderen Ausdrucke. #} Anlagen-Strukturbericht {% import 'docs/_leiste.html' as ui %} {# Der Zaehler, der die Spalte "Prozessfluesse" ersetzt. Ein Merkmal, eine Zeile: er sagt, DASS an dieser Einheit Fluesse haengen — welche, mit Richtung und Medium, sagt das Fliessschema. Er steht nur da, wo etwas zu zaehlen ist, wie die uebrigen Bloecke dieser Spalte auch. Ein "keine" auf jeder Zeile waere genau das Rauschen, gegen das die Spalte gestrichen wurde: im Bestand haben 337 von 350 Einheiten keinen Fluss. Wo nichts steht, ist nichts — das traegt der Verweis im Kopf. #} {% macro fluss_zahl(f) -%} {%- if f.ein or f.aus or f.zugeordnet -%}
Prozessflüsse:
{{- f.ein }} ein · {{ f.aus }} aus {%- if f.zugeordnet %} · {{ f.zugeordnet }} zugeordnet{% endif -%}
{%- endif -%} {%- endmacro %} {# seiten=true: seit dem gemessenen Umbruch kennt auch dieser Bericht seine Seitenzahl — vorher wusste er nicht, was der Drucker aus ihm macht. #} {% call ui.leiste(etikett='Anlagen-Strukturbericht', seiten=true, zurueck_url='/facility/viewer', zurueck_text='Zurück zur Anlagenübersicht') -%} Stand {{ datenstand }} · {{ count_units }} Betriebseinheiten · {{ count_buildings }} Gebäude {%- endcall %}
{{ branding.company_name }} Logo
ANLAGEN-STRUKTURBERICHT
Facility Management  ·  MBET
Betriebseinheiten {{ count_units }} Gebäude {{ count_buildings }} Rüstwagen {{ trolleys | length }} Lagerorte {{ storage | length }} Erstellt {{ date }}
{# Die Flussspalte ist raus — dieser Satz sagt, wo die Sache steht. Ohne ihn saehe der Bericht aus, als kenne die Anlage keine Fluesse. #}
Prozessflüsse sind hier nur gezählt. Mit Richtung, Medium und Nachbarn stehen sie im Grundfließschema: /facility/flowsheet.

1. Betriebseinheiten ({{ count_units }} Elemente)

{% for item in flat_data_units %} {% endfor %}
Idx Bezeichnung / Hierarchie Verantwortlichkeit & Assets Details
{{ item.index_str }}
{{ item.name }}
{% if item.bereich or item.verantwortlicher %} {% if item.bereich %}{{ item.bereich }}{% endif %} {% if item.verantwortlicher %}{{ item.verantwortlicher }}{% endif %} {% endif %} {% if item.hardware %} {% for hw in item.hardware %}{{ hw }}{% endfor %} {% endif %} {% if item.storageLink %} 📦 {{ item.storageLink }} {% endif %} {% if item.maintenance_plans %} {% for plan in item.maintenance_plans %}
🔧 [{{ plan.id }}] {{ plan.task }} {{ plan.topic }} · {{ plan.intervalValue }}× / {{ plan.intervalUnit }}
{% endfor %} {% endif %}
{{ fluss_zahl(item.fluesse) }} {% for k, v in item.details.items() %}
{{ k }}: {{ v }}
{% endfor %}

2. Gebäudestruktur ({{ count_buildings }} Elemente)

{% for item in flat_data_buildings %} {% endfor %}
Idx Bezeichnung / Hierarchie Verantwortlichkeit & Ausstattung Details
{{ item.index_str }}
{{ item.name }}
{% if item.bereich or item.verantwortlicher %} {% if item.bereich %}{{ item.bereich }}{% endif %} {% if item.verantwortlicher %}{{ item.verantwortlicher }}{% endif %} {% endif %} {% if item.hardware %} {% for hw in item.hardware %}{{ hw }}{% endfor %} {% endif %} {% if item.storageLink %} 📦 {{ item.storageLink }} {% endif %} {% if item.maintenance_plans %} {% for plan in item.maintenance_plans %}
🔧 [{{ plan.id }}] {{ plan.task }} {{ plan.topic }} · {{ plan.intervalValue }}× / {{ plan.intervalUnit }}
{% endfor %} {% endif %}
{{ fluss_zahl(item.fluesse) }} {% for k, v in item.details.items() %}
{{ k }}: {{ v }}
{% endfor %}

3. Mobile Rüstwagen ({{ trolleys|length }} Einheiten)

{% if trolleys|length > 0 %} {% for name, data in trolleys.items() %}

🛒 {{ name }} (Engine Type: {{ data.engineType }}){% if data.responsible %}Verantwortlich: {{ data.responsible }}{% endif %}

{% if data['items']|length > 0 %} {% for item in data['items'] %} {% endfor %}
P/N S/N Bezeichnung / Name Menge Pos (L/B)
{{ item.pn }} {{ item.sn }} {{ item.name or 'Unbekannt' }} {{ item.qty }} {{ item.level }}/{{ item.box }}
{% else %}
Leer / Keine Items.
{% endif %}
{% endfor %} {% else %}

Keine Rüstwagen definiert.

{% endif %}

4. Feste Lagerorte ({{ storage|length }} Einheiten)

{% if storage|length > 0 %} {% for name, data in storage.items() %}

📦 {{ name }} (Bereich: {{ data.engineType }}){% if data.responsible %}Verantwortlich: {{ data.responsible }}{% endif %}

{% if data['items']|length > 0 %} {% for item in data['items'] %} {% endfor %}
P/N S/N Bezeichnung / Name Menge Pos (L/B)
{{ item.pn }} {{ item.sn }} {{ item.name or 'Unbekannt' }} {{ item.qty }} {{ item.level }}/{{ item.box }}
{% else %}
Leer / Keine Items.
{% endif %}
{% endfor %} {% else %}

Keine Lagerorte definiert.

{% endif %}