| @@ -27,7 +27,7 @@ httpdocs/ | |||||
| │ ├── Repository/ | │ ├── Repository/ | ||||
| │ │ ├── Central/ | │ │ ├── Central/ | ||||
| │ │ └── Tenant/ | │ │ └── Tenant/ | ||||
| │ ├── Service/ # TenantContext, RegistrationService, LexofficeService, etc. | |||||
| │ ├── Service/ # TenantContext, RegistrationService, LexofficeService, MiteImportService, etc. | |||||
| │ ├── Doctrine/ # TenantConnectionMiddleware | │ ├── Doctrine/ # TenantConnectionMiddleware | ||||
| │ ├── EventSubscriber/ # TenantRequestSubscriber, ArchivedUserSubscriber | │ ├── EventSubscriber/ # TenantRequestSubscriber, ArchivedUserSubscriber | ||||
| │ ├── Security/ # ArchivedUserChecker, AccessDeniedHandler | │ ├── Security/ # ArchivedUserChecker, AccessDeniedHandler | ||||
| @@ -172,7 +172,7 @@ Superadmin = Account-Ersteller, kann Kontoinhaber übertragen, `primaryColor` un | |||||
| ## Services-Injection (services.yaml) | ## Services-Injection (services.yaml) | ||||
| Controller die Tenant-Entities nutzen brauchen den `tenant_entity_manager` explizit: | 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) | - `$em: '@doctrine.orm.tenant_entity_manager'` (ClientController, ProjectController, ServiceController) | ||||
| ## Report-Exporte | ## 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 | - **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 | - **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 | ## TenantConnectionMiddleware | ||||
| Registriert via Service-Tag in `services.yaml` (nicht via `doctrine.yaml` — DoctrineBundle 3.x unterstützt `middlewares`-Config-Key nicht): | Registriert via Service-Tag in `services.yaml` (nicht via `doctrine.yaml` — DoctrineBundle 3.x unterstützt `middlewares`-Config-Key nicht): | ||||