This commit is contained in:
ValueOn AG 2026-04-23 13:32:45 +02:00
parent 3183a39763
commit 19f28e85d9
4 changed files with 150 additions and 12 deletions

View file

@ -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=<key>`, 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=<key>`** (`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.

View file

@ -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.<Model>` fuer datenbasierten RBAC.
UI-seitig sind diese Endpunkte unter `/mandates/{m}/trustee/{i}/data-tables[?tab=<key>]` (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.

View file

@ -0,0 +1,106 @@
<!-- status: plan -->
<!-- planned: 2026-04-21 -->
<!-- component: gateway | frontend-nyla -->
# 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=<key>]`) 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/`.

View file

@ -1,5 +1,6 @@
<!-- status: build -->
<!-- status: done -->
<!-- started: 2026-04-20 -->
<!-- finished: 2026-04-21 -->
<!-- component: gateway | frontend-nyla -->
# 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.<Model>`-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=<key>]`.
- [ ] 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.<Model>`); 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=<key>]` 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/`.