From 60dac9b04af6bf84079e53d87d98294b8288e730 Mon Sep 17 00:00:00 2001 From: FlorianEisenmenger Date: Mon, 22 Jun 2026 12:55:03 +0200 Subject: [PATCH] claude.md --- CLAUDE.md | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index e8f477e..20b8b90 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -27,7 +27,7 @@ httpdocs/ │ ├── Repository/ │ │ ├── Central/ │ │ └── Tenant/ -│ ├── Service/ # TenantContext, RegistrationService, LexofficeService, etc. +│ ├── Service/ # TenantContext, RegistrationService, LexofficeService, MiteImportService, etc. │ ├── Doctrine/ # TenantConnectionMiddleware │ ├── EventSubscriber/ # TenantRequestSubscriber, ArchivedUserSubscriber │ ├── Security/ # ArchivedUserChecker, AccessDeniedHandler @@ -172,7 +172,7 @@ Superadmin = Account-Ersteller, kann Kontoinhaber übertragen, `primaryColor` un ## Services-Injection (services.yaml) Controller die Tenant-Entities nutzen brauchen den `tenant_entity_manager` explizit: -- `$tenantEm: '@doctrine.orm.tenant_entity_manager'` (TimeTrackingController, ReportController) +- `$tenantEm: '@doctrine.orm.tenant_entity_manager'` (TimeTrackingController, ReportController, ImportController) - `$em: '@doctrine.orm.tenant_entity_manager'` (ClientController, ProjectController, ServiceController) ## Report-Exporte @@ -338,6 +338,44 @@ Billable/Non-Billable Trennung via `Service.billable`. Revenue-Berechnung nutzt - **Brand-Farbe**: Billable-Balken nutzen `--color-primary`, Non-Billable grau - **Donut-Charts**: Drei nebeneinander (3-Spalten-Grid, responsive 1-Spalte), eigene Legende mit Farb-Dot, Name, Wert und Prozent. 8-Farben-Palette, „Rest" in Grau +## mite-Import + +Import von Kunden, Projekten, Leistungen und Zeiteinträgen aus mite-Backups (XML). Erreichbar als eigener Tab in den Account-Einstellungen (nur Admin). + +### Architektur + +- **Backend**: `ImportController` (Preview + Execute), `MiteImportService` (Parsing, Matching, Import) +- **Frontend**: Import-Logik in `account.js`, i18n über `window.ACCOUNT.i18n` +- **Styles**: Import-spezifische Klassen in `_account.scss` +- **Template**: Import-Tab in `templates/account/index.html.twig` + +### API-Endpunkte + +| Route | Method | Beschreibung | +|------------------------------|--------|-------------------------------------------------| +| `/api/import/mite/preview` | POST | XML analysieren: Zähler, User-Mapping, Warnings | +| `/api/import/mite/execute` | POST | Import durchführen (Clients, Projects, Services, TimeEntries, optional User) | + +### Zwei-Schritt-Flow + +1. **Analyse** (`preview`): XML-Datei hochladen → `MiteImportService::analyze()` parst XML, zeigt Übersicht (Anzahl Kunden/Projekte/Services/Einträge, Zeitraum, Warnungen) und User-Mapping (bestehende User per E-Mail matchen) +2. **Import** (`execute`): `MiteImportService::execute()` importiert in einer Transaktion. Matching per Name — existierende Entities werden wiederverwendet, neue angelegt + +### User-Mapping + +- mite-User werden per E-Mail mit bestehenden Account-Usern gematcht +- Nicht-gematchte User: wahlweise dem aktuellen User zuordnen oder neuen System-User anlegen (`createUsers`-Parameter) +- Neue User bekommen Rolle `member` (mite `owner`/`admin`/`coworker`) oder `tracker` + +### Import-Details + +- Stundensätze werden von Cent (mite) in Euro konvertiert +- Gesperrte mite-Einträge (`locked`) → `invoiced = true` +- Archivierte Entities → `archivedAt` gesetzt +- Projekte ohne zugeordneten Kunden werden übersprungen +- Batch-Flush alle 100 TimeEntries (Performance) +- Max. Dateigröße: 20 MB, nur XML + ## TenantConnectionMiddleware Registriert via Service-Tag in `services.yaml` (nicht via `doctrine.yaml` — DoctrineBundle 3.x unterstützt `middlewares`-Config-Key nicht):