# Partner-Einladung & Setup-Wizard Kurze Notizen zur aktuellen Einladungskette und dem Setup-Wizard, plus offene To-dos. ## Ablauf Einladung - Admin lädt Partner über `resources/views/livewire/admin/partners/invite.blade.php` ein. - Gültigkeit wird im Formular gewählt (1–4 Wochen) und als `expires_at` in `PartnerInvitation` gespeichert. - Einladungslink: `route('partner.invitation.accept', ['token' => $token])`. - Zusätzliche Statusseiten: `/partner/invitation/expired/{token}` und `/partner/invitation/used/{token}`. ## Routen - `/partner/invitation/{token}` → Volt-Komponente `partner.invitation-accept`. - `/partner/invitation/expired/{token}` und `/partner/invitation/used/{token}` → statische Blade-Views. - `/partner/setup` → Volt-Komponente `partner.setup-wizard`, geschützt mit `auth`-Middleware. ## Setup-Wizard (partner.setup-wizard) - Basisdaten: Partner wird über eingeloggten User geladen (`Auth::user()->partner_id`); Rolle bestimmt Icon/Label. - Schritte je Partner-Typ: - Retailer: `Stammdaten` → `Liefergebiete` → `Fertig`. - Manufacturer: `Stammdaten` → `Marke anlegen` → `Fertig`. - Estate-Agent (und Default): `Profil`/`Stammdaten` → `Fertig`. - Schritt 1 (alle): - Felder: Firmenname (pflicht), Logo-Upload (optional, 2 MB, jpg/png/webp), Kurzbeschreibung, Straße/PLZ/Stadt (pflicht), Website (optional, URL). - Logo wird bei Upload in `public/partner-logos` gespeichert; Partner wird mit Name/Beschreibung/Logo aktualisiert. - TODO im Code: Adresse noch separat speichern (Adresse aktuell nicht persistiert). - Schritt 2 Retailer: - Felder: Lieferradius km, Montageradius km (1–500, pflicht). - Speichert `delivery_radius_km` und `assembly_radius_km` im Partner; danach Abschluss. - Schritt 2 Manufacturer: - Felder: Markenname (pflicht), Markenlogo (optional, 2 MB), Markenbeschreibung. - Speichert neue `Brand` mit Slug aus Namen; Logo in `public/brand-logos`. - Abschluss: - Partner wird `is_active=true`, `setup_completed=true`, `setup_completed_at=now()`. - Dashboard-Button; für Nicht-Makler CTA „Erstes Produkt anlegen“ (derzeit ohne Aktion). ## Offene To-dos / Beobachtungen - Adresse persistieren (separates Modell/JSON), wird aktuell nur validiert. - Website-Feld wird vorausgefüllt? momentan leer trotz vorhandener Partner-Daten. - CTA „Erstes Produkt anlegen“ ohne Link/Action; Zielseite definieren. - Hersteller: Slug-Kollision/Mehrmarken-Handling prüfen (derzeit einfacher `Str::slug` mit create). - Estate-Agent: Gibt es spezifische Felder? Wizard zeigt nur Schritt 1 → Fertig; klären ob ausreichend. ## QR-/Registrierungscode-Flow (neu) - Öffentliche Landing unter `/reg/{role}` auf `b2in.test`, Rollen-Codes: - `c` = Kunde, `e` = Makler, `m` = Hersteller, `r` = Händler. - Gleiches Blade-Template, Inhalte/CTA dynamisch nach Role. - QR-Codes enthalten nur den Link (`/reg/{role}`), kein Code-Query. Der Code steht z.B. auf der Visitenkarte und wird manuell eingegeben. - Registrierungscode ist zwingend, wird einmalig eingelöst und danach als „verbraucht“ markiert. - Validierter Code schaltet erst das passende Registrierungsformular frei (bestehender Flow wiederverwenden, kein zweites System). - Rollen-spezifische Registrierung: - Makler (`/reg/e`): braucht gültige Makler-Nummer (einzigartig, vorab im System hinterlegt). - Kunde (`/reg/c`): braucht gültige Kundennummer, die einem Makler zugeordnet ist; jeder Kunde muss einem Makler zugeordnet werden (Provisions-Tracking). - Händler (`/reg/r`) und Hersteller (`/reg/m`): eigener Flow, ebenfalls mit einmaligem Code; Hersteller haben keine Kunden, Händler pflegen Sortiment und können Kundenzugänge verschaffen. ### Vorschlag Datenmodell Codes (anzulegen) - Tabelle `registration_codes` (oder separate `broker_codes` + `customer_codes`): - `code` (unique), `role` (`broker|customer|retailer|manufacturer`), `status` (`available|used|expired`), `partner_id` (optional, z.B. für Händler/Hersteller), `broker_id` (für Kundennummern-Block), `used_by_user_id` (nullable), `used_at`, `expires_at` (optional), `metadata` (json für Notizen/Quelle). - Für Maklernummern: `role=broker`, `status=available`, keine `broker_id`. - Für Kundennummern: `role=customer`, `broker_id` Pflicht, damit Zuordnung bei Registrierung klar ist. - Einlösung: - Lookup `code` + `role` passend zur Route. - Wenn `status != available` → Fehlermeldung. - Bei Erfolg: markiere `used`, setze `used_at`, `used_by_user_id` (nach erfolgreichem User-Create), ggf. `partner_id` koppeln. ### Nummernformat / Vergabe - Format: 8-stellige Nummern mit optional vorangestelltem Buchstaben (Alias). Beispiele: `00100001`, `M00100001`, `K01102513`. - Buchstabenpräfixe nur Alias (Marketing), intern immer über IDs verknüpfen; Code bleibt als Alias gespeichert. - Nummern sind fortlaufend; Kundennummern werden blockweise einem Makler zugewiesen (z.B. `K01102510`–`K01102560` = 50 Stück). - Ein Code kann nur einmal eingelöst werden und wird danach als „used“ markiert. ### Umsetzung QR-/Reg-Landing (Stand) - Neue Route `/reg/{role}` (Volt) mit Rollen-Slugs: `c` Kunde, `e` Makler, `m` Hersteller, `r` Händler. - Gemeinsames Template `resources/views/livewire/reg/landing.blade.php`, Inhalte dynamisch nach Rolle. - Eingabe und Prüfung des Registrierungscodes; Normalisierung (Leerzeichen/Bindestriche entfernt, uppercase). - Valider Code (Status `available`, Rolle passend) wird in Session abgelegt (`registration_code_id`, `registration_role`) und leitet zu `reg/create-account` weiter. Verbrauch/Markierung erfolgt beim Account-Create bzw. Wizard-Abschluss. - Neues Modell `App\Models\RegistrationCode` + Migration `registration_codes` mit Feldern für Status, Rolle, Broker-/Partner-Referenzen, Used-Infos. ### Account-Create nach Code (neu) - Route `/reg/create-account` (Volt) nutzt `reg.create-account`-Komponente. - Felder: Vorname, Nachname, E-Mail, Passwort + Bestätigung, AGB-Checkbox. - Prüft Session-Code; mappt Rollen auf Partner-Typ (`broker→Estate-Agent`, `retailer→Retailer`, `manufacturer→Manufacturer`; Customer aktuell nicht unterstützt). - Erstellt Partner (minimal), User, weist Rolle zu, markiert Code als verwendet, loggt ein, leitet in den Setup-Wizard. ### Landing-/Flow-Idee - Route/Controller/Volt für `/reg/{role}`: - Zeigt Rolle-spezifischen Text und Eingabefeld „Registrierungscode“. - Nach erfolgreicher Code-Validierung: Formular mit bestehenden Feldern je Rolle anzeigen (Reuse: bestehende Registrierung/Setup-Logik). - Kopplung mit bestehendem Einladungssystem: - Kein zweites System; nach Code-Check wird derselbe Registrierungspfad genutzt (User/Partner anlegen, Setup-Wizard etc.). - To-do: Admin-Oberfläche bereitstellen, um Maklernummern und Kundennummern-Blöcke zu erzeugen und einem Makler zuzuweisen.