Commit Graph

21 Commits

Author SHA1 Message Date
44661d9b02 UI: Ebenen-Menüs angepasst (Portal-Mitarbeiter, Reseller „Einloggen als")
- Portal-Topnav: zusätzlich „Mitarbeiter" (firmenübergreifend, nur einloggbare
  Mitarbeiter; Firma-Spalte statt Standort, kein Hinzufügen, „Einloggen als").
- Reseller-Topnav: „Firmen" → „Einloggen als" (gleiche Firmen-&-Mitarbeiter-
  Ansicht). Plattform behält Label „Firmen".
- EmployeesView: portalMode (isPlatformAdmin) filtert auf login=true.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 13:10:23 +02:00
d66c7cc4aa UI: „Firmen & Mitarbeiter"-Ansicht mit „Einloggen als" (scoped)
CompaniesView zeigt jetzt die Firmenkunden des Resellers (eigene Org-Firma via
resellerOrg ausgeblendet) mit Kennzahlen (Standorte/Mitarbeiter/aktive Profile/
Domains/erstellt) und aufklappbarer Mitarbeiterliste. „Einloggen als"
(Impersonation) je Firma (Firmen-Admin) und je Mitarbeiter mit Login → wechselt
in den Firmen-Kontext (linke Navi). Nur Mitarbeiter/Firmen des eigenen Mandanten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 08:56:44 +02:00
4be88dfd45 UI: Zwei-Ebenen-Navigation (Portal/Reseller oben, Firma links)
Klare Trennung der Ebenen gegen Verwechslung: Topbar trägt die Portal-/Reseller-
Navigation (Dashboard, Reseller, Firmen, Produkte, Bestellungen, Einstellungen)
+ Level-Badge (PORTAL/RESELLER/Firmenname). Die linke Sidebar zeigt NUR Firmen-
Ebene (Mitarbeiter, Editor, Bestellungen, Standorte, Domains, Design, Wallet,
Einstellungen) und nur im Firmen-Kontext (Firmen-Admin oder via „Einloggen als").
Reseller/Portal-Admin → links leer, Inhalt volle Breite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 08:53:20 +02:00
4c0aced823 UI: Logo „( vcard4 reseller )" + KPI-Kacheln mit Farb-Icons
- BrandLogo-Komponente (Klammer-Wortmarke im Markenlook) in Sidebar + Login.
- Dashboard-KPIs im Referenz-Stil: farbiger Kreis-Icon (orange/grün/blau/grau)
  + Zahl + Label.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 19:31:38 +02:00
1f45e35ab5 UI: helle Seitenleiste statt schwarz + aufgewertete Topbar
Look & Feel an die Referenz angepasst: weiße Navigation mit Orange-Akzent
(aktives Item orange-soft, Chevrons, graue Icons) statt dunkler Sidebar.
Topbar mit Nutzer-Block (Avatar-Initialen, Name, Rolle, Firma). Navi bleibt
flach (keine Gruppen-Einteilung). name im CurrentUser-Typ ergänzt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 19:19:59 +02:00
18894c7b52 Wallet-Design Frontend: Editor + Live-Apple-Pass-Vorschau (pro Firma)
WalletDesignView (/app/wallet, Nav „Wallet" im Firmen-Kontext): Farben
(Hintergrund/Text/Label), Titel, Logo-Upload, Feld-Editor (Binding + Label +
Slot, hinzufügen/sortieren/entfernen). Live-Vorschau im Apple-Stil mit echten
Beispieldaten. Hinweis, dass die Anordnung durch Apple/Google fix ist.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 19:05:40 +02:00
bbe7c1b71c Bestellungen: Karten-Vorschau je Position vor dem Bestellen
- Vorschau-Button (👁) je Position im Bestell-Dialog (aktiv wenn
  Produkt+Mitarbeiter gewählt): rendert card.pdf via pdf.js (Vorder-/
  Rückseite) im Vorschau-Modal mit echten Mitarbeiterdaten × Produktlayout.
- Auch im Bestell-Detail je Position (Reseller-Prüfung vor Produktion).
- Modal: optionaler wide-Prop für Bestell-/Vorschau-Modal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 13:45:17 +02:00
7c3b06c996 Bestellungen: Frontend (Firma bestellt, Reseller wickelt ab)
- OrdersView: Firma sieht eigene Bestellungen + „Neue Bestellung"
  (Positionen Produkt+Mitarbeiter+Menge); Reseller/Plattform sehen
  eingehende (mit Firma-Spalte), setzen Status vorwärts, stornieren,
  PDF je Position. Status-Badges, Detail-Modal.
- Nav-Eintrag „Bestellungen" (Firma + Reseller + Plattform), Route.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 13:24:23 +02:00
6dd6d3a96e Nav: Standorte/Domains nur Firma, Editor nicht für Plattform
Standorte & Domains sind firmenbezogen → nur im Firmen-Kontext.
Editor (Produktdesign) nur für Reseller (für Kundenfirmen) & Firmen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 18:02:47 +02:00
01f29f7e21 Nav: „Design" nur im Firmen-Kontext (Plattform/Reseller ausgeblendet)
Branding/Design ist nur für Firmen relevant; Admins/Reseller brauchen es nicht.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 17:35:22 +02:00
8c613ec014 Produkte: Nav-Eintrag „Visitenkarten" → „Editor"
Der Editor gestaltet jetzt jedes Produkt, nicht nur Visitenkarten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 16:02:47 +02:00
6e8dcaff4e Produkte: Frontend-Verwaltung & Editor-Produktauswahl
- ProductsView: CRUD-Liste (eigene editierbar, globale read-only),
  Format-Defaults je Produktart, Nav-Eintrag (Plattform/Reseller)
- Card-Editor: Produktauswahl, Design je Firma+Produkt laden/speichern
  (?product=), Format vom Produkt geerbt (read-only) inkl. Asset/PDF-Calls

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 15:58:11 +02:00
2dc40c6ea5 Rechte: Mitarbeiter & Benutzer vereint, ROLE_CONTACT als Basis
- Jeder Mitarbeiter hat (leere) Login-/Passwortfelder; Standardrolle ROLE_CONTACT
  (reines Profil). Hochstufen über die Rechtegruppe.
- Ebenen-Ladder: contact(0) < employee(1) < company_admin(2) < reseller_admin(3)
  < platform_admin(4); role_hierarchy + RoleService entsprechend.
- PATCH /api/employees/{id}/access: Rechtegruppe setzen (+ optional Passwort/Login);
  DELETE .../login → zurück auf Kontakt.
- Sicherheit: Passwort/userIdentifier per #[Ignore] aus der API-Serialisierung.
- Frontend: separate Benutzer-Ansicht entfernt; Mitarbeiter-Liste mit
  Rechtegruppe-Spalte, Rollen/Login + 'Arbeiten als' inline im Bearbeiten-Dialog.

Verifiziert: kein Passwort-Leak, roles/login im Payload, Hochstufen Kontakt→
Mitarbeiter + Login, Eskalation→403, Login entziehen→Kontakt; UI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 21:44:57 +02:00
ae9936586b Rechte: 'Arbeiten als' (Impersonation, nur absteigend)
- ImpersonationController POST /api/impersonate/{id}: gibt JWT für Ziel-
  Mitarbeiter aus (imp-Claim für Audit); nur niedrigere Ebene + eigener
  Mandanten-Teilbaum (RoleService.levelOfRoles)
- Frontend: auth-Store impersonate/stopImpersonation (Original-Token gesichert),
  'Arbeiten als'-Buttons in der Logins-Übersicht (nur erlaubte Ziele),
  Impersonation-Banner mit 'Beenden' im Layout

Verifiziert: Admin→Reseller/Firma/Mitarbeiter, Eskalation/Cross-Tenant→403,
Kontextwechsel + Banner im Browser.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 17:40:37 +02:00
bcc06e697b Rechte: User in Employee verschmolzen (eine Identität pro Person)
Beseitigt die Doppelung Admin-Login vs. Mitarbeiter — jeder ist ein Employee
mit optionalem Login/Rechtegruppe (Voraussetzung für Mitarbeiter-Zeiterfassung).

- Employee implementiert UserInterface/PasswordAuthenticated (loginEmail unique,
  password, roles); User-Entität entfernt; Security-Provider → Employee.loginEmail
- Plattform = Reseller mit isPlatform + Org-Firma; Reseller haben Org-Firma
  (Company.isResellerOrg) für ihr Personal → alles = Reseller→Firma→Mitarbeiter
- TenantContext leitet Reseller/Company aus dem Mitarbeiter ab (Reseller-/
  Plattform-Admin = reseller-weit)
- UserAdminController: Login pro Mitarbeiter vergeben/entziehen
  (POST/DELETE /api/employees/{id}/login), /api/users = Logins-Übersicht
- Provisioning/Seed auf das neue Modell; Migrationen zu einer Baseline gesquasht
- Frontend: EmployeesView Login-Block + UsersView (Logins-Übersicht)

Verifiziert: Login, /me, Mandantenscoping, delegierter Grant (Eskalation→403),
öffentliches Profil, SPA-Flow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 17:27:38 +02:00
cac6b26a0d Rechte: Benutzer-Verwaltung & Rechtegruppe je Mitarbeiter (Frontend)
- UsersView: Benutzer-Liste + Anlegen (Rechtegruppen-Dropdown = nur erlaubte
  Gruppen), scope-gefiltert; Nav-Eintrag Benutzer (ab Firmen-Admin)
- EmployeesView: Block 'Zugang/Rechtegruppe' im Bearbeiten-Dialog —
  Login anlegen/entfernen pro Mitarbeiter (delegationsgeprüft)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 15:23:34 +02:00
73f05ed7e7 Karten-Editor: Format & Beschnitt einstellbar
Karten-Einstellungen im Eigenschaften-Panel (wenn kein Element gewählt):
Name, Breite/Höhe, Beschnitt und Sicherheitsabstand — wirken live im Canvas
und fließen beim Speichern ins Druck-PDF (Seitengröße + Schnittmarken).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 19:40:36 +02:00
904a4184fc Karten-Editor: Komfort — Hintergrund-Vorschau, Resize, Undo
- Hintergrund-PDF wird per pdf.js echt im Canvas gerendert (WYSIWYG);
  neuer Endpunkt GET .../card-template/background liefert das PDF
- Resize-Anfasser am ausgewählten Element (Breite/Höhe)
- Undo (↶ / Strg+Z) mit Snapshot-History; Snapshot erst bei echter Änderung

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 17:39:50 +02:00
f25ccefa48 Karten-Editor: Upload-UI für Hintergrund-PDF & Schriften
- Assets-Leiste: Hintergrund-PDF hochladen/entfernen (+ "aktiv"-Badge),
  Schrift hochladen (TTF/OTF) mit Familien-Chips
- Schriftart-Auswahl pro Text/Feld (Helvetica/Times/Courier + eigene)
- Canvas-Hinweis bei aktivem Hintergrund (echte Darstellung in PDF-Vorschau)
- Uploads aktualisieren State ohne Verlust des aktuellen Layouts

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 17:33:52 +02:00
1a035d6c61 Visueller Visitenkarten-Editor (SPA)
- CardTemplateEditorController: GET|PUT /api/companies/{id}/card-template
  (gespeicherte oder Standardvorlage, Mandantenprüfung, Upsert)
- CardPdfRenderer: freie Hex-Farben unterstützt
- CardEditorView: Canvas im mm-Maßstab mit Beschnitt/Endformat/Sicherheit,
  Drag&Drop-Elemente (Feld/Text/QR/Logo/Fläche/Linie), Eigenschaften-Panel
  (Datenbindung, Position/Größe, Schrift, Ausrichtung, Farbe), Vorder-/Rück-
  seite, Live-Vorschau mit echten Daten, Speichern + PDF-Vorschau
- Nav-Eintrag "Visitenkarten" + Route
- Panel-Layout-Fix (min-width:0 gegen Grid-Überlauf)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 15:45:30 +02:00
ebaf509a2f Fundament: Symfony+API-Platform-Backend & Vue-SPA (Phase 0–2)
Stack & Setup
- Dockerisierte Dev-Umgebung (PHP 8.4-FPM, Nginx, MariaDB 11.4)
- Symfony 7.4 + API Platform 4.3, Doctrine ORM, LexikJWT, Messenger
- Vue 3 + TS (Vite), Vue Router, Pinia, Axios

Kern-Domäne & Auth
- Entitäten: User, PlatformPlan, Reseller, Company, Domain, Location,
  Employee, ContactLink (UUIDv7)
- JWT-Login (/api/login), Rollen-Hierarchie, /api/me
- Mandantentrennung via API-Platform-Query-Extension (Lesen) +
  TenantStampProcessor (Schreiben)

Öffentliche Profile (SSR)
- Profil-Landingpage, vCard-Download, QR-Code im Marken-Look
- Stabiler NFC/QR-Kurz-Link /t/{code} -> Redirect aufs aktuelle Profil
- Firmenspezifisches Branding (Farben/Logo) auf der Profilseite

Verwaltungsoberfläche (SPA)
- Brand-Look (dunkle Sidebar), rollenbasierte Navigation
- Dashboard, Reseller (+Provisioning), Firmen, Mitarbeiter, Standorte,
  Domains, Design/Branding mit Live-Vorschau

Konzept & Doku: docs/KONZEPT.md (inkl. Wallet/Sync §12), README.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 11:12:53 +02:00