| @@ -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): | |||