From be22a51805b1de3a3db94701a315a7835b0ba55e Mon Sep 17 00:00:00 2001 From: patrick Date: Tue, 23 Jun 2026 01:44:48 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20DEVLOG=20=E2=80=93=20agent-10=20Reselle?= =?UTF-8?q?r/Mandanten=C3=BCbersicht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- DEVLOG.md | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/DEVLOG.md b/DEVLOG.md index 69a0730..b6bea08 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2022,3 +2022,157 @@ Keine Commits in dieser Session. - frontend/src/pages/TenantsPage.tsx | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --- +## 2026-06-23 01:26 – 01:29 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** timemaster + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- DEVLOG.md | 28 ++++++++++++++++++++++++++++ +- backend/app/routers/reseller.py | 8 +++++--- +- backend/app/routers/tenants.py | 54 ++++++++++++++++++++++++++++++++++++------------------ +- backend/app/schemas/auth.py | 5 ++++- +- backend/app/schemas/reseller.py | 13 ++++++++++--- +- backend/app/services/tenant_service.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------ +- backend/tests/test_reseller.py | 20 ++++++++++++++++++++ +- frontend/src/pages/ResellerCompaniesPage.tsx | 45 +++++++++++++++++++++++++++++++++++++++++---- +- frontend/src/pages/TenantsPage.tsx | 30 +++++++++++++++++++++--------- + +--- +## 2026-06-23 01:36 – 01:38 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** timemaster + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- DEVLOG.md | 28 ++++++++++++++++++++++++++++ +- backend/app/routers/reseller.py | 8 +++++--- +- backend/app/routers/tenants.py | 54 ++++++++++++++++++++++++++++++++++++------------------ +- backend/app/schemas/auth.py | 5 ++++- +- backend/app/schemas/reseller.py | 13 ++++++++++--- +- backend/app/services/tenant_service.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------ +- backend/tests/test_reseller.py | 20 ++++++++++++++++++++ +- frontend/src/pages/ResellerCompaniesPage.tsx | 45 +++++++++++++++++++++++++++++++++++++++++---- +- frontend/src/pages/TenantsPage.tsx | 30 +++++++++++++++++++++--------- + +--- +## 2026-06-23 01:38 – 01:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** timemaster + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- DEVLOG.md | 28 ++++++++++++++++++++++++++++ +- backend/app/routers/reseller.py | 8 +++++--- +- backend/app/routers/tenants.py | 54 ++++++++++++++++++++++++++++++++++++------------------ +- backend/app/schemas/auth.py | 5 ++++- +- backend/app/schemas/reseller.py | 13 ++++++++++--- +- backend/app/services/tenant_service.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------ +- backend/tests/test_reseller.py | 20 ++++++++++++++++++++ +- frontend/src/pages/ResellerCompaniesPage.tsx | 45 +++++++++++++++++++++++++++++++++++++++++---- +- frontend/src/pages/TenantsPage.tsx | 30 +++++++++++++++++++++--------- + +--- +## 2026-06-23 01:40 – 01:40 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** timemaster + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- DEVLOG.md | 28 ++++++++++++++++++++++++++++ +- backend/app/routers/reseller.py | 8 +++++--- +- backend/app/routers/tenants.py | 54 ++++++++++++++++++++++++++++++++++++------------------ +- backend/app/schemas/auth.py | 5 ++++- +- backend/app/schemas/reseller.py | 13 ++++++++++--- +- backend/app/services/tenant_service.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------ +- backend/tests/test_reseller.py | 20 ++++++++++++++++++++ +- frontend/src/pages/ResellerCompaniesPage.tsx | 45 +++++++++++++++++++++++++++++++++++++++++---- +- frontend/src/pages/TenantsPage.tsx | 30 +++++++++++++++++++++--------- + +--- +## 2026-06-23 01:41 – 01:41 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** timemaster + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- DEVLOG.md | 28 ++++++++++++++++++++++++++++ +- backend/app/routers/reseller.py | 8 +++++--- +- backend/app/routers/tenants.py | 54 ++++++++++++++++++++++++++++++++++++------------------ +- backend/app/schemas/auth.py | 5 ++++- +- backend/app/schemas/reseller.py | 13 ++++++++++--- +- backend/app/services/tenant_service.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------ +- backend/tests/test_reseller.py | 20 ++++++++++++++++++++ +- frontend/src/pages/ResellerCompaniesPage.tsx | 45 +++++++++++++++++++++++++++++++++++++++++---- +- frontend/src/pages/TenantsPage.tsx | 30 +++++++++++++++++++++--------- + +--- +## 2026-06-23 – agent-10: Reseller-Rolle + Mandantenübersicht (Multimandanten) + +**Ziel:** Mandantenfähigkeit ausbauen – SUPER_ADMIN-Mandantenübersicht + neue +RESELLER-Rolle, die selbst angelegte Firmen verwaltet (nur Firmen-Ebene, DSGVO). + +### Commits +- 898a81f feat: Reseller-Rolle + SUPER_ADMIN-Mandantenübersicht +- 98cb2f8 feat: Mandant/Reseller ohne E-Mail anlegbar (Temp-Passwort statt Einladung) + +### Entscheidungen (mit User abgestimmt) +- Reseller = **nur Firmen-Verwaltung** (kein Zugriff auf personenbezogene Zeit-/ + Abwesenheitsdaten) → DSGVO-sauber +- **Eigene Reseller-Oberfläche** (`/reseller`), keine Impersonation +- **Nur SUPER_ADMIN** legt Reseller an; Reseller-Firmen gehören automatisch ihm + +### Backend +- Neue Rolle `UserRole.RESELLER` (company_id NULL); `companies.reseller_id` + `is_active` +- Migration **0034**: Enum-Wert + Spalten + RLS-Policies (companies/users zusätzlich + auf `app.reseller_id` gefenced → DB-seitige Mandantenisolation des Resellers) +- `get_current_user` setzt `app.reseller_id` + Bypass aus für RESELLER +- `tenant_service` (Firma + Erst-Admin), Router `/reseller/*` (Self-Service) und + `/admin/*` (SUPER_ADMIN: Mandanten + Reseller); Login-Sperre bei deaktiviertem Mandant +- **Ohne E-Mail anlegbar**: interne Login-Kennung `@.local` + einmaliges + Temp-Passwort (kein Mailversand). `LoginRequest.email` → `str` (Kennung muss kein + zustellbares Postfach sein; reservierte `.local`-Domains sonst nicht einloggbar) + +### Frontend +- `TenantsPage` (`/admin/tenants`): alle Firmen, Reseller zuordnen/anlegen, Aktiv-Toggle +- `ResellerCompaniesPage` (`/reseller`): eigene Oberfläche mit Firmen-Kacheln +- Rollenbasierte Login-Weiterleitung (RESELLER → `/reseller`); `CredDialog` zeigt + Temp-Zugangsdaten einmalig; Nav „Mandanten" für SUPER_ADMIN + +### Tests & Deployment +- 5 neue pytest-Cases inkl. **Cross-Reseller-RLS-Isolation** + Anlage ohne E-Mail + (173/173 grün); conftest-RLS um Reseller-Policies erweitert +- Auf **137 + 164** deployed (Migration 0034, Dienste aktiv, Health ok) +- **Live-Smoke-Test** auf beiden Servern bestanden (8 Checks: Anlage ohne E-Mail, + Temp-Login, RLS-Isolation, 403-Schutz, Mandanten-Sperre) – Testdaten danach gelöscht + +--- +## 2026-06-23 01:42 – 01:43 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** timemaster + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- DEVLOG.md | 28 ++++++++++++++++++++++++++++ +- backend/app/routers/reseller.py | 8 +++++--- +- backend/app/routers/tenants.py | 54 ++++++++++++++++++++++++++++++++++++------------------ +- backend/app/schemas/auth.py | 5 ++++- +- backend/app/schemas/reseller.py | 13 ++++++++++--- +- backend/app/services/tenant_service.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------ +- backend/tests/test_reseller.py | 20 ++++++++++++++++++++ +- frontend/src/pages/ResellerCompaniesPage.tsx | 45 +++++++++++++++++++++++++++++++++++++++++---- +- frontend/src/pages/TenantsPage.tsx | 30 +++++++++++++++++++++--------- + +---