From 19f28e85d9c3b033b0b5837c4cb3a2a84fa00ca2 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Thu, 23 Apr 2026 13:32:45 +0200
Subject: [PATCH] upd
---
b-reference/frontend-nyla/architecture.md | 12 ++
b-reference/gateway/architecture.md | 18 +++
...-04-trustee-cleanup-positions-documents.md | 106 ++++++++++++++++++
.../2026-04-trustee-data-tables-page.md | 26 +++--
4 files changed, 150 insertions(+), 12 deletions(-)
create mode 100644 c-work/1-plan/2026-04-trustee-cleanup-positions-documents.md
rename c-work/{2-build => 4-done}/2026-04-trustee-data-tables-page.md (87%)
diff --git a/b-reference/frontend-nyla/architecture.md b/b-reference/frontend-nyla/architecture.md
index 7bed8e8..15c08d3 100644
--- a/b-reference/frontend-nyla/architecture.md
+++ b/b-reference/frontend-nyla/architecture.md
@@ -42,6 +42,7 @@ Ergänzend typische Root-Dateien und Bereiche im Repo: `main.tsx`, `App.tsx`, `a
| `CanvasHeader` | Workflow-Metadaten, Versioning (Draft/Publish/Archive), Save-as-Template, New-from-Template |
| `TemplatePicker` | Modal zur Auswahl von Workflow-Vorlagen beim Erstellen neuer Workflows |
| `WorkspacePage` | AI-Workspace mit Chat, UDB, Agent-Streaming |
+| `TrusteeDataTablesView` | Konsolidierte Daten-Tabellen-Seite (Treuhand): 13 Tabs (Stammdaten, Lokale Daten, Konfiguration, Buchhaltungs-Daten) ueber generischen `TrusteeDataTab`-Wrapper, Lazy-Mount pro Tab, URL-State `?tab=`, read-only fuer Sync-Tabellen |
## Routing
@@ -90,6 +91,17 @@ Ergänzend typische Root-Dateien und Bereiche im Repo: `main.tsx`, `App.tsx`, `a
| `pages/admin/AdminLanguagesPage.tsx` | Admin-Seite: Sprachset-Verwaltung (CRUD, AI-Übersetzung, UI/API-Key-Counts) |
| `pages/admin/AdminLanguagesKeepAlive.tsx` | KeepAlive-Wrapper: Sprach-Seite bleibt persistent bei Seitenwechsel |
+## Tab-Pattern fuer mehrere Modelle pro Seite
+
+Wenn eine Feature-Seite N verwandte Modelle in eigenen Tabs zeigen soll (Beispiel: `TrusteeDataTablesView` mit 13 Trustee-Tabellen), gilt folgendes Muster:
+
+1. **Pro Tab ein Wrapper-Component**, das exakt einen Hook aufruft. So bleiben React Hook Rules eingehalten und inaktive Tabs fetchen keine Daten (Lazy-Mount).
+2. **`FormGeneratorTable` direkt im Wrapper** (siehe [formgenerator.md](formgenerator.md) -- "Bei Tabs / Wrapper-Komponenten"). Jeder Wrapper reicht die Flex-Chain (`flex:1; min-height:0`) durch, sonst kollabiert die Tabelle auf 0 px.
+3. **URL-State via `?tab=`** (`useSearchParams`). Erlaubt Deep-Links aus Notifications, Quick Actions oder Doku.
+4. **Read-only-Tabs**: separater Wrapper ohne Operations-Hook, `readOnly={true}`. Sync-Tabellen (z.B. `TrusteeData*`) verzichten auf Edit-/Delete-Buttons, damit der naechste Sync nicht versehentlich ueberschriebene Daten zerstoert.
+5. **Tab-Bar** im Stil bestehender Trustee-Tab-Seiten (`TrusteeAbschlussView`, `TrusteeAccountingSettingsView`); Gruppierung per `TabGroupDef` (z.B. "Stammdaten", "Lokale Daten", "Konfiguration", "Buchhaltungs-Daten") erhoeht Lesbarkeit bei vielen Tabs.
+6. **Spalten-Definitionen** kommen aus `getModelAttributeDefinitions(...)` (Backend) -- nie hardcodiert. So bleibt das UI automatisch synchron mit Pydantic-Modellaenderungen.
+
## Regeln / Invarianten
- **Feature-Organisation:** UI, Logic (`*Logic`), Types und CSS Modules pro Feature-Modul trennen; Exporte über `index.ts` wo üblich.
diff --git a/b-reference/gateway/architecture.md b/b-reference/gateway/architecture.md
index 5ad442e..124c671 100644
--- a/b-reference/gateway/architecture.md
+++ b/b-reference/gateway/architecture.md
@@ -156,6 +156,24 @@ Felder vom Typ `TextMultilingual` speichern Benutzertexte mehrsprachig. `xx` ist
**Entries-Identitaet:** Ein Entry wird durch `(key, context)` eindeutig identifiziert — derselbe Text kann mit verschiedenen Contexts existieren.
+## Feature: Trustee -- Daten-Tabellen-Endpunkte
+
+Alle 13 Trustee-Tabellen sind ueber paginierte, RBAC-gefilterte GET-Endpunkte abrufbar. Die sechs CRUD-Modelle (`TrusteeOrganisation`, `TrusteeRole`, `TrusteeAccess`, `TrusteeContract`, `TrusteeDocument`, `TrusteePosition`) haben weiterhin die etablierten REST-Routen; sieben weitere (zuvor nur als JSON-Export oder Aggregat-Endpunkt verfuegbar) wurden ergaenzt:
+
+| Endpunkt | Modell | Zweck |
+|----------|--------|-------|
+| `GET /api/trustee/{instanceId}/data/accounts` | `TrusteeDataAccount` | Synchronisierter Kontenplan (read-only) |
+| `GET /api/trustee/{instanceId}/data/journal-entries` | `TrusteeDataJournalEntry` | Synchronisierte Buchungskoepfe (read-only) |
+| `GET /api/trustee/{instanceId}/data/journal-lines` | `TrusteeDataJournalLine` | Synchronisierte Buchungszeilen (read-only) |
+| `GET /api/trustee/{instanceId}/data/contacts` | `TrusteeDataContact` | Synchronisierte Kontakte (read-only) |
+| `GET /api/trustee/{instanceId}/data/account-balances` | `TrusteeDataAccountBalance` | Synchronisierte Saldenliste (read-only) |
+| `GET /api/trustee/{instanceId}/accounting/configs` | `TrusteeAccountingConfig` | Connector-Konfiguration (read-only; Secrets maskiert) |
+| `GET /api/trustee/{instanceId}/accounting/syncs` | `TrusteeAccountingSync` | Audit-Eintraege der Sync-Laeufe (read-only) |
+
+Alle sieben Endpunkte teilen sich den Helper `_paginatedReadEndpoint` (`routeFeatureTrustee.py`), der das Pattern aus `get_documents` / `get_positions` reproduziert: Unified Filter API (`mode=filterValues|ids`), `_validateInstanceAccess` fuer Instanz-Gating und `getRecordsetPaginatedWithRBAC` mit `featureCode` + `data.feature.trustee.` fuer datenbasierten RBAC.
+
+UI-seitig sind diese Endpunkte unter `/mandates/{m}/trustee/{i}/data-tables[?tab=]` (View `TrusteeDataTablesView`) zugaenglich; UI-Sichtbarkeit der Seite haengt am Permission-Eintrag `ui.feature.trustee.data-tables` (Template-Rollen `trustee-viewer`, `trustee-user`, `trustee-accountant`, Admin via Wildcard).
+
## Regeln / Invarianten
- **Schichten:** Connectors sind anbieterspezifisch und ersetzbar; **Services hängen von Interfaces ab, nicht direkt von Connectors**. Geschäftslogik und Guardrails liegen in den Services.
diff --git a/c-work/1-plan/2026-04-trustee-cleanup-positions-documents.md b/c-work/1-plan/2026-04-trustee-cleanup-positions-documents.md
new file mode 100644
index 0000000..69fda78
--- /dev/null
+++ b/c-work/1-plan/2026-04-trustee-cleanup-positions-documents.md
@@ -0,0 +1,106 @@
+
+
+
+
+# Trustee: Aufraeumen `Positionen` / `Dokumente` Top-Level-Seiten
+
+## Beschreibung und Kontext
+
+Mit `2026-04-trustee-data-tables-page.md` (status: done) sind alle 13 Trustee-Tabellen in der konsolidierten Seite `Daten-Tabellen` (`/mandates/{m}/trustee/{i}/data-tables[?tab=]`) verfuegbar. Die alten Top-Level-Seiten `Positionen` und `Dokumente` sind dort als Tabs eingebettet (`TrusteePositionsView`, `TrusteeDocumentsView` werden im neuen `TrusteeDataTablesView` direkt importiert und unter Tabs gemountet).
+
+Top-Level-Routen / Mappings fuer diese beiden Seiten wurden in der Vorgaenger-Iteration entfernt:
+
+- `frontend_nyla/src/pages/FeatureView.tsx`: kein direktes `'positions' / 'documents'`-Mapping mehr (`VIEW_COMPONENTS.trustee`).
+- `frontend_nyla/src/App.tsx`: keine `Route path="positions"` / `path="documents"` mehr.
+- `gateway/modules/features/trustee/mainTrustee.py`: `ui.feature.trustee.positions` und `ui.feature.trustee.documents` entfernt; einziger neuer UI-Eintrag ist `ui.feature.trustee.data-tables`.
+
+Was noch lebt: die beiden Standalone-Komponenten als Datei + Index-Export. Sie werden ausschliesslich vom `TrusteeDataTablesView` als Tab-Body referenziert.
+
+Diese Iteration raeumt die noch existierenden, aber nicht mehr als eigenstaendige Seiten verwendeten Reste auf -- ohne Funktionalitaet zu verlieren.
+
+## Fokus und kritische Details
+
+- Die Spezialdarstellungen (Beleg-Download in Positionen-Tabelle, Dokument-Download in Dokumente-Tabelle, Inline-Sync-Status) leben in `TrusteePositionsView` / `TrusteeDocumentsView`. Sie sind weiterhin **als Tab-Body** im neuen `TrusteeDataTablesView` produktiv -- darf nicht versehentlich entfernt werden.
+- Falls ein simpler `TrusteeDataTab` (generischer Wrapper) die Spezialfeatures nicht abdeckt, bleiben die beiden Komponenten erhalten und werden nur in der `index.ts` und im Code-Layout sauber als "Tab-Body, nicht Top-Level-View" gekennzeichnet.
+- `position-documents` (Zuordnungen) bleibt als eigene Top-Level-View unangetastet (anderer Use-Case: Position-Document-Zuordnung).
+- `FEATURE_REGISTRY.trustee.views` in `frontend_nyla/src/types/mandate.ts` ist laut Header (`TODO: Remove after all references are migrated to use backend navigation.`) ohnehin geplant zu entsorgen -- in dieser Iteration nur sicherstellen, dass keine `'positions'`/`'documents'`-Eintraege mehr drin sind.
+
+## Ziel und Nicht-Ziele
+
+- **Ziel**: Code-Klarheit -- Standalone-Files `TrusteePositionsView.tsx` / `TrusteeDocumentsView.tsx` werden entweder (a) im Ordner `dataTables/` als Tab-Body umbenannt (`TrusteePositionsTab.tsx`, `TrusteeDocumentsTab.tsx`) oder (b) bleiben dort, aber bekommen einen Header-Kommentar "Mounted only as a tab inside `TrusteeDataTablesView`".
+- **Ziel**: `index.ts` exportiert die Komponenten nur noch wenn sie tatsaechlich extern referenziert werden; sonst entfernen.
+- **Ziel**: Stichprobe pruefen, dass keine externe Quick-Action / Notification / Mail-Template / Workflow-Definition mehr auf `/trustee/{instanceId}/positions` oder `/documents` verlinkt.
+- **Ziel**: `mainTrustee.py` -- letzter Sweep: keine Restrolle/Permission referenziert `ui.feature.trustee.positions` / `.documents`.
+- **Ziel**: `pageRegistry.tsx` und ggf. `MandateNavigation`-Defaults / `quickActions` (Backend) -- alle Verweise raus.
+- **Explizit NICHT**: Loeschen der `TrusteePositionsView` / `TrusteeDocumentsView` Logik. Sie bleiben funktional erhalten -- nur die "Top-Level-Page"-Doppelung wird beseitigt.
+- **Explizit NICHT**: Aenderungen am Backend-Datenmodell oder den REST-Endpoints von Position/Document.
+
+## Betroffene Module
+
+- **Frontend**:
+ - `frontend_nyla/src/pages/views/trustee/TrusteePositionsView.tsx`, `TrusteeDocumentsView.tsx`: Header-Kommentar / Renaming.
+ - `frontend_nyla/src/pages/views/trustee/index.ts`: Exporte pruefen (nur was extern noch noetig ist, bleibt).
+ - `frontend_nyla/src/pages/FeatureView.tsx`: Sicherstellen, dass `VIEW_COMPONENTS.trustee` keine `'positions'/'documents'`-Eintraege hat.
+ - `frontend_nyla/src/App.tsx`: Suche nach Restrouten mit `positions` / `documents`.
+ - `frontend_nyla/src/types/mandate.ts`: `FEATURE_REGISTRY.trustee.views` (legacy) -- Eintraege sauber halten, ggf. ganzen Block deprecaten.
+ - `frontend_nyla/src/components/Navigation/*`: Pruefen, ob noch Icons / Default-Routes auf `positions` / `documents` zeigen.
+- **Gateway**:
+ - `gateway/modules/features/trustee/mainTrustee.py`: Sweep `UI_OBJECTS`, `TEMPLATE_ROLES`, `QUICK_ACTIONS` -- keine `ui.feature.trustee.positions` / `.documents` mehr.
+ - `gateway/modules/features/trustee/routeFeatureTrustee.py`: kein Code-Change geplant (REST-Endpunkte fuer Position/Document bleiben).
+- **Wiki**:
+ - `wiki/b-reference/frontend-nyla/architecture.md` und `gateway/architecture.md`: pruefen, ob in den `trustee`-Mentions noch `positions`/`documents` als Top-Level-Pages stehen.
+- **DB-Migration**: nein.
+
+## Entscheidungen
+
+| Datum | Entscheidung | Begruendung |
+|-------|-------------|-------------|
+| 2026-04-21 | `TrusteePositionsView` / `TrusteeDocumentsView` werden NICHT geloescht | Sie liefern weiterhin die Spezialdarstellung im neuen `TrusteeDataTablesView`-Tab. |
+| 2026-04-21 | Keine sofortige Umbennenung in `*Tab.tsx` | Reduziert Diff-Risiko fuer eine reine Aufraeum-Iteration; Header-Kommentar reicht. |
+
+## Umsetzungs-Checkliste
+
+### Sweep / Cleanup
+
+- [ ] `TrusteePositionsView.tsx` Header-Kommentar `Mounted only as a tab inside TrusteeDataTablesView` ergaenzen.
+- [ ] `TrusteeDocumentsView.tsx` analog.
+- [ ] `frontend_nyla/src/pages/views/trustee/index.ts`: Exporte pruefen und ueberfluessige entfernen.
+- [ ] `grep -r "ui.feature.trustee.positions\|ui.feature.trustee.documents"` durch gateway + frontend laufen lassen -- alle Treffer adressieren.
+- [ ] `grep -r "/trustee/.*positions\|/trustee/.*documents"` (Mail-Templates, Workflows, QuickActions) -- ggf. auf `data-tables?tab=positions` umbiegen.
+- [ ] `mainTrustee.py.QUICK_ACTIONS`: pruefen, ob "Neuer Beleg" / "Neue Position"-Quick-Action auf `data-tables?tab=positions` (oder `tab=documents`) zeigen sollte statt ggf. veraltete Routen.
+- [ ] Navigation-Defaults pruefen: nach Login / nach Feature-Aktivierung sollte die Standard-Trustee-Page weiterhin `dashboard` sein, nicht `positions`/`documents`.
+
+### Verifikation
+
+- [ ] Manueller Smoke-Test: Trustee-Instanz oeffnen -> `Daten-Tabellen` -> Tab `Positionen` -> Edit + Beleg-Download funktionieren wie vorher.
+- [ ] Manueller Smoke-Test: Trustee-Instanz oeffnen -> `Daten-Tabellen` -> Tab `Dokumente` -> Edit + Download funktionieren wie vorher.
+- [ ] `npm run build` im Frontend -- kein TypeScript-Fehler durch verschobene/entfernte Exporte.
+- [ ] Gateway-Tests `gateway/tests/test_routeFeatureTrustee_*` laufen gruen.
+
+## Akzeptanzkriterien
+
+| # | Kriterium (Given-When-Then) | Prio |
+|---|----------------------------|------|
+| 1 | Given die konsolidierte Seite `Daten-Tabellen`, When der User Tab `Positionen` oeffnet, Then funktioniert Edit / Delete / Beleg-Download / Sync wie in der alten Top-Level-Seite. | must |
+| 2 | Given Code-Suche `ui.feature.trustee.positions` und `ui.feature.trustee.documents`, When grep durchlaeuft, Then liefert sie keinen Treffer (ausser Migrations-/Doku-Notizen). | must |
+| 3 | Given eine Quick-Action / ein Mail-Template, When es auf eine Trustee-Tabelle verlinkt, Then zeigt der Link auf `/data-tables?tab=positions` (oder `tab=documents`), nicht auf eine Top-Level-Route. | should |
+| 4 | Given das Frontend-Build, When `npm run build` laeuft, Then schlaegt nichts wegen entfernter Exporte fehl. | must |
+
+## Testplan
+
+| ID | AC | Art | Automatisiert | Repo-Pfad | Status |
+|----|----|-----|--------------|-----------|--------|
+| T1 | 1 | manual UI | nein | -- | pending |
+| T2 | 2 | grep | manuell | gateway/, frontend_nyla/ | pending |
+| T3 | 3 | grep + manual | manuell | mainTrustee.py, mail-templates | pending |
+| T4 | 4 | build | ja | frontend_nyla `npm run build` | pending |
+
+## Links
+
+- Vorgaenger-Plan: `wiki/c-work/4-done/2026-04-trustee-data-tables-page.md`
+- Konsolidierte Seite: `frontend_nyla/src/pages/views/trustee/TrusteeDataTablesView.tsx`
+- Eingebettete Tab-Bodies: `frontend_nyla/src/pages/views/trustee/TrusteePositionsView.tsx`, `TrusteeDocumentsView.tsx`
+
+## Abschluss
+
+- [ ] Dieses Dokument -> `c-work/2-build/` (bei Umsetzungsbeginn) -> `c-work/3-validate/` -> `c-work/4-done/`.
diff --git a/c-work/2-build/2026-04-trustee-data-tables-page.md b/c-work/4-done/2026-04-trustee-data-tables-page.md
similarity index 87%
rename from c-work/2-build/2026-04-trustee-data-tables-page.md
rename to c-work/4-done/2026-04-trustee-data-tables-page.md
index fbcf072..0e5cf69 100644
--- a/c-work/2-build/2026-04-trustee-data-tables-page.md
+++ b/c-work/4-done/2026-04-trustee-data-tables-page.md
@@ -1,5 +1,6 @@
-
+
+
# Trustee: Konsolidierte Daten-Tabellen-Seite
@@ -106,12 +107,12 @@ Risiko bei Verzicht: Anwender greifen via Export/Excel auf interne Daten zu (ums
### Cross-Cutting
-- [ ] RBAC / Permissions: alle neuen Endpunkte enforced via bestehendes `_validateInstanceAccess`; UI-Sichtbarkeit per `data.feature.trustee.`-Check (Hook liefert das via `permissions.view`).
-- [ ] Neutralisierung betroffen? **Nein** – keine AI-Calls, kein neuer Datenfluss zu externen Systemen.
-- [ ] Navigation / Routing: neue UI-Route `/mandates/{m}/trustee/{i}/data-tables[?tab=]`.
-- [ ] Billing-Impact? **Nein**.
-- [ ] i18n: alle Tab-Labels und Header-Strings via `t(...)`; Spalten-Labels kommen aus `@i18nModel`-getaggten Modellen (bereits vorhanden für alle 13).
-- [ ] Quick Actions: keine Änderung – Quick Actions zeigen weiterhin auf `import-process` / `settings`. Optional in Folge-Iteration: Direktlinks auf einzelne Datentabs.
+- [x] RBAC / Permissions: alle neuen 7 Endpunkte teilen `_paginatedReadEndpoint` -> `_validateInstanceAccess` (Instanz-Gating) + `getRecordsetPaginatedWithRBAC` (DATA-Context, `featureCode=trustee`, `data.feature.trustee.`); identisches Pattern zu `get_documents` / `get_positions`. UI-Sichtbarkeit der Seite haengt am Permission `ui.feature.trustee.data-tables` (Template-Rollen `trustee-viewer`, `trustee-user`, `trustee-accountant`; Admin via Wildcard).
+- [x] Neutralisierung betroffen? **Nein** – keine AI-Calls, kein neuer Datenfluss zu externen Systemen.
+- [x] Navigation / Routing: neue UI-Route `/mandates/{m}/trustee/{i}/data-tables[?tab=]` registriert in `App.tsx` (Zeile ~150), `FeatureView.tsx` (`VIEW_COMPONENTS.trustee['data-tables'] = TrusteeDataTablesView`) und `mandate.ts` (`FEATURE_REGISTRY.trustee.views`).
+- [x] Billing-Impact? **Nein**.
+- [x] i18n: alle Tab-Labels und Header-Strings via `t(...)`; Spalten-Labels kommen aus `@i18nModel`-getaggten Modellen (bereits vorhanden für alle 13).
+- [x] Quick Actions: keine Änderung – Quick Actions zeigen weiterhin auf `import-process` / `settings`. Direktlinks auf einzelne Datentabs in Folge-Iteration `2026-04-trustee-cleanup-positions-documents.md`.
## Akzeptanzkriterien
@@ -152,8 +153,9 @@ Risiko bei Verzicht: Anwender greifen via Export/Excel auf interne Daten zu (ums
## Abschluss
-- [ ] `b-reference/gateway/features/trustee.md` (oder analog) aktualisieren: neue Endpunkte + neue UI-Seite dokumentieren.
-- [ ] `b-reference/frontend-nyla/architecture.md`: kurze Erwähnung der konsolidierten `TrusteeDataTablesView` + Tab-Pattern für mehrere Modelle.
-- [ ] `TOPICS.md`: keine Änderung nötig (kein neues Thema).
-- [ ] Folge-Plan `2026-MM-trustee-cleanup-positions-documents.md`: Aufräumen der alten Seiten, sobald Daten-Tabellen produktiv verifiziert.
-- [ ] Dieses Dokument → `c-work/2-build/` (bei Umsetzungsbeginn) → `c-work/3-validate/` → `z-archive/`.
+- [x] `b-reference/gateway/architecture.md` aktualisiert: neue Sektion "Feature: Trustee -- Daten-Tabellen-Endpunkte" mit Endpunkt-Tabelle + Helper `_paginatedReadEndpoint` + RBAC-Pattern.
+- [x] `b-reference/frontend-nyla/architecture.md`: Eintrag fuer `TrusteeDataTablesView` in "Wichtige UI-Komponenten" plus neuer Abschnitt "Tab-Pattern fuer mehrere Modelle pro Seite" (Lazy-Mount, URL-State, Read-only-Tabs, Tab-Gruppen).
+- [x] `b-reference/frontend-nyla/formgenerator.md`: bereits referenziert (`TrusteeDataTablesView` als Beispiel im "Page Layout Chain"-Pattern).
+- [x] `TOPICS.md`: keine Änderung nötig (kein neues Thema).
+- [x] Folge-Plan `wiki/c-work/1-plan/2026-04-trustee-cleanup-positions-documents.md` erstellt: Aufräumen der alten Top-Level-Seiten (Standalone-Files bleiben als Tab-Body, aber Header-Kommentare + Sweep auf restliche `ui.feature.trustee.positions` / `.documents`-Referenzen).
+- [x] Dieses Dokument → `c-work/4-done/`.