# Seitenansicht und PDF-Export Die Seitenansicht ist rein lesend und verändert keine Projektdaten. Die Aktionen für Büroangaben und Logo speichern dagegen globale Einstellungen. Projekt- und Verteilerangaben werden in den jeweiligen Bearbeitungsdialogen über Projektbefehle mit Undo/Redo gepflegt. Beim Laden werden alle Stromkreislisten in einer projektweiten Abfrage gelesen; deren Projektrevision und ein abschließend erneut gelesener Projektstand werden verglichen. Ändert sich das Projekt währenddessen, wird statt eines gemischten Datenstands eine Aufforderung zum Neuladen angezeigt. Eine bereits geladene Seitenansicht aktualisiert sich nicht automatisch bei späteren Änderungen in einem anderen Tab. ## Aufruf - Projektseite → Button **Seitenansicht** öffnet `/projects/:projectId/print` in einem neuen Tab. - **Als PDF speichern / Drucken** nutzt den Druckdialog des Browsers (Ziel „Als PDF speichern“). Der Dokumenttitel `Leistungsbilanz – ` wird als Dateiname vorgeschlagen. - **Planformat** schaltet die Verteilerpläne zwischen A4 quer und A3 quer um. Deckblatt bleibt A4 hoch. - **Büroangaben** pflegt Büroname und Büroanschrift (Planverfasser, für alle Projekte). - **Logo hinterlegen / ersetzen / entfernen** verwaltet das Büro-Logo. ## Seiten 1. **Deckblatt (A4 hoch)** – tabellarisch: Projekt, Planverfasser, Dokument, Planstände (aus benannten Sicherungspunkten) und Inhalt. Leere Angaben erscheinen als orangefarbenes „[ergänzen]“. 2. **Verteilerübersicht (quer)** – Versorgungsstruktur und Tabelle je Verteiler mit Stromkreisanzahl, Pinst (Anzahl × Leistung je Stück, nur lokale Geräte), Leistung vor Verteiler-GZF einschließlich gespeister Unterverteilungen, Verteiler-GZF, Pgl einschließlich Unterverteilungen und IB. Die Hierarchie folgt den logischen IDs. 3. **Verteilerpläne (quer, je Verteiler)** – Titelleiste mit Verteilernummer, Bezeichnung, Örtlichkeit, Netzart, „Gespeist von“ und Pgl; darunter Kopfkomponenten, Gruppen, Stromkreise (reine 1:1-Einspeiseabgänge kompakt in einer Zeile; sonst mehrzeilig mit Sammelzeile, eingerückten Gerätezeilen und schreibgeschützten Unterverteilungszeilen), Gruppensummen und Verteilersumme. Fehlende Kabelangaben sind als „offen“ markiert. Die Titelleiste steht im Tabellenkopf und wiederholt sich beim Drucken auf Folgeseiten. Seitenformat, Ränder und „Seite x von y“ kommen beim Drucken aus benannten `@page`-Regeln (`lb-portrait`, `lb-landscape`), die die Seite zur Laufzeit einfügt. Die Bildschirmansicht zeigt Blätter in Papiergröße; die exakte Seitenaufteilung langer Verteilerpläne entsteht erst beim Drucken. ## Berechnung und offene Punkte - **Einspeisung / Hierarchie:** `feedingDistributionBoardId` bestimmt die Hierarchie. Ist zusätzlich `feedingCircuitId` gesetzt, fließt die Leistung der Unterverteilung nach deren eigenem Verteiler-GZF als virtuelle Last in genau diesen Abgang ein. Ketten werden rekursiv berechnet; mehrere Unterverteilungen an einem Abgang sind erlaubt. Ohne Abgang bleibt es bei der Hierarchie ohne Leistungsaufschlag. `fedFrom` bezeichnet nur externe Quellen oder ergänzende Hinweise. - **Keine Doppelzählung:** Die Abgangs- und Verteilersummen enthalten die Unterverteilungsleistung bereits. Deshalb gibt es keine zusätzliche Spalte „Σ inkl. unterlagert“. Die Summenzeile verwendet für hierarchische Leistungen nur Wurzelverteilungen; Pinst summiert weiterhin die lokalen Geräte. - **IB:** S entsteht aus Σ(P / cos φ) für Geräte und den wirksamen cos φ der Unterverteilungen, jeweils mit dem fachlich zugehörigen GZF. Bei einem 1-phasigen speisenden Abgang gilt I = S / U1~, sonst I = S / (√3 · U3~). Für externe oder nur bis zur Verteilung bekannte Einspeisungen bleibt die bisherige Darstellung als symmetrischer Drehstromwert bestehen. - **Corporate Design:** Farben (`--pd-*` in `src/frontend/print/print-document.css`) und Schrift (Arial) sind aus Logo und kbp-Präsentationsmaterial abgeleitet und werden durch die offizielle CD-Vorgabe ersetzt, falls diese abweicht. - **Planstände:** Die Spalte „Bearbeitung“ zeigt für jeden Planstand die aktuelle Bearbeitung aus den Projekteinstellungen, weil Sicherungspunkte (noch) keinen Bearbeiter speichern. ## Datenquellen des Deckblatts | Feld | Quelle | |---|---| | Bauvorhaben, Bauherr, Projektnummern, Beschreibung | Projekteinstellungen | | Anschrift Bauvorhaben, Leistungsphase, Projektleitung, Bearbeitung | Projekteinstellungen → Abschnitt „Deckblatt“ (`siteAddress`, `workStage`, `projectLead`, `projectEditor`) | | Büro, Anschrift Büro | Seitenansicht → „Büroangaben“ (global) | | Stand, Datenstand, Anzahl Verteiler, Inhalt | automatisch | | Planstände | benannte Sicherungspunkte | Die vier Projektfelder laufen über `project.update-settings` (Schema-Version 3, Migration `0008`) und sind Teil von Snapshot-Schema 6 und Projektexport. Im `PUT /api/projects/:projectId` sind sie optional; fehlende Felder behalten ihren Wert. ## Büroangaben - Tabelle `document_branding_settings` (Schlüssel/Wert, Migration `0008`), global wie das Logo. - `GET /api/document-branding` liefert zusätzlich `office: { officeName, officeAddress }`. - `PUT /api/document-branding/office` mit `{ "officeName", "officeAddress" }` (max. 200 / 500 Zeichen, leerer Text = nicht gesetzt). ## Logo - Globale Büro-Einstellung, nicht Teil von Projekten, Revisionen, Snapshots oder Projektexport. - Tabelle `document_branding_assets` (Migration `0007`). - `GET /api/document-branding` → `{ logo: { mimeType, fileName, sizeBytes, updatedAtIso } | null }` - `GET /api/document-branding/logo` → Bilddaten (`404` ohne Logo), mit `X-Content-Type-Options: nosniff` und restriktiver CSP. - `PUT /api/document-branding/logo` mit `{ "fileName", "mimeType": "image/png" | "image/jpeg" | "image/svg+xml", "contentBase64" }`, maximal 2 MB; der Dateiinhalt wird gegen das Format geprüft. - `DELETE /api/document-branding/logo` → `204`. ## Code - `src/app/projects/[projectId]/print/page.tsx` – Datenladen, Werkzeugleiste, `@page`-Regeln - `src/frontend/print/print-document-model.ts` – reine Berechnungen und Formatierung (Tests: `tests/print-document-model.test.ts`) - `src/frontend/print/print-document.tsx` – Blätter und Tabellen - `src/frontend/print/print-document.css` – Layout, auf `.print-view` begrenzt - `src/frontend/components/distribution-board-info-card.tsx` – Infokarte im Bearbeiten-Dialog der Verteilung ## Bestehende Datenbanken Vor dem Anwenden der additiven Migrationen einschließlich `0012` eine verifizierte Datenbanksicherung mit `npm run db:backup` erstellen. Die neuen Projekt- und Verteilerfelder bleiben bei bestehenden Datensätzen zunächst leer (`null`). Snapshot-Schema 10 enthält den aktuellen Projektzustand; die in Schema 9 eingeführten Einspeisungsverweise werden in den unterstützten Versionen 1–8 mit leeren Verweisen hochgestuft. Restore und Projektkopie erhalten beziehungsweise remappen die neuen Angaben. Globale Büroangaben und Logo gehören zur Datenbanksicherung, nicht zum logischen Projektsnapshot oder Projekttransfer.