forked from jappel/leistungsbilanz-ts
139 lines
7.2 KiB
Markdown
139 lines
7.2 KiB
Markdown
# 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 – <Projekt>`
|
||
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, P<sub>inst</sub> (Anzahl × Leistung je
|
||
Stück, nur lokale Geräte), Leistung vor Verteiler-GZF einschließlich
|
||
gespeister Unterverteilungen, Verteiler-GZF, P<sub>gl</sub> einschließlich
|
||
Unterverteilungen und I<sub>B</sub>. Die Hierarchie folgt den logischen IDs.
|
||
3. **Verteilerpläne (quer, je Verteiler)** – Titelleiste mit
|
||
Verteilernummer, Bezeichnung, Örtlichkeit, Netzart, „Gespeist von“ und
|
||
P<sub>gl</sub>; 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; P<sub>inst</sub> summiert weiterhin die lokalen Geräte.
|
||
- **I<sub>B</sub>:** 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 / U<sub>1~</sub>, sonst
|
||
I = S / (√3 · U<sub>3~</sub>). 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.
|