mivita/dev/2026-02-19/plan-wizard-starterpaket.md
2026-02-20 17:55:06 +01:00

9.5 KiB

Plan: Wizard Registrierung - Starterpaket-Auswahl umbauen

Ausgangslage

Der letzte Schritt des Berater-Registrierungs-Wizards hat aktuell:

  • Mitgliedschaften als Radio-Buttons (show_on 7+8)
  • Onboarding-Produkte als optionale Checkboxen (show_on 9)
  • Kompensationsprodukt für Versandkosten

Was sich ändert

  1. Eine einzige Radio-Button-Auswahl zwischen:

    • Reine Jahresmitgliedschaft (Produkt-ID 35, Gewicht 0 = keine Versandkosten)
    • 2-3 Starterpakete (inkl. Mitgliedschaft + Versandkosten = 0)
  2. Neues DB-Feld free_shipping_consultant auf der Produkttabelle

    • Boolean-Checkbox im Admin: "Versandkostenfrei für Berater"
    • Wird in der Versandkostenberechnung (Yard) berücksichtigt
  3. Warn-Modal wenn nur Mitgliedschaft gewählt wird:

    • Hinweis auf Rabatt und Einmaligkeit des Starterpaket-Angebots
  4. Onboarding-Checkboxen entfallen - alles über Radio-Buttons

Betroffene Dateien

Datei Änderung
database/migrations/... Neues Feld free_shipping_consultant
app/Models/Product.php fillable + casts
app/Repositories/ProductRepository.php Checkbox-Handling
resources/views/admin/product/form.blade.php Admin-Checkbox
app/Services/Yard.php Versandkosten-Logik
app/Http/Controllers/WizardController.php Query + storePayment
resources/views/user/wizard/_payment.blade.php UI-Umbau + Modal
resources/lang/{de,en,es}/register.php Übersetzungen

Umsetzungsstatus (Stand: 2026-02-19)

ERLEDIGT - Alle geplanten Änderungen sind umgesetzt

1. Migration free_shipping_consultant - ERLEDIGT

  • Datei: database/migrations/2026_02_19_120000_add_free_shipping_consultant_to_products_table.php
  • Boolean-Feld free_shipping_consultant mit default(false) nach no_free_shipping
  • Down-Migration entfernt die Spalte korrekt

2. Product Model - ERLEDIGT

  • Datei: app/Models/Product.php
  • free_shipping_consultant in $casts als 'bool' hinzugefügt (Zeile 192)
  • free_shipping_consultant in $fillable hinzugefügt (Zeile 216)

3. ProductRepository Checkbox-Handling - ERLEDIGT

  • Datei: app/Repositories/ProductRepository.php
  • $data['free_shipping_consultant'] = isset($data['free_shipping_consultant']) ? 1 : 0; in der update()-Methode (Zeile 30)

4. Admin Produkt-Formular - ERLEDIGT

  • Datei: resources/views/admin/product/form.blade.php
  • Neue Checkbox-Sektion "Versandkostenfrei für Berater (FcB.)" eingebaut (Zeilen 124-132)
  • Text: "Versandkosten für Berater sind bei diesem Produkt immer 0 (z.B. Starterpakete)."

5. Yard.php Versandkosten-Logik - ERLEDIGT

  • Datei: app/Services/Yard.php
  • Neue Methode allItemsFreeShippingConsultant() hinzugefügt (Zeilen 419-429)
    • Prüft ob alle Items im Warenkorb free_shipping_consultant = true haben
    • Gibt false zurück wenn der Warenkorb leer ist
  • In calculateShippingPrice() (Zeile 260): Bedingung erweitert:
    if ($this->allItemsFreeShippingConsultant() || $this->weight() == 0) {
    
    • Wenn alle Items free_shipping_consultant haben ODER Gewicht = 0 -> Versandkosten = 0

6. WizardController - ERLEDIGT

  • Datei: app/Http/Controllers/WizardController.php
  • In storePayment() (Zeile 607): free_shipping_consultant wird beim Hinzufügen zum Warenkorb als Cart-Option übergeben:
    'free_shipping_consultant' => $product->free_shipping_consultant
    
  • Die Product-Queries in create(), register(), payment() laden weiterhin show_on 7, 8, 9 - das ist korrekt, da die Produkte über show_on gesteuert werden

7. Wizard Payment Blade (UI-Umbau) - ERLEDIGT

  • Datei: resources/views/user/wizard/_payment.blade.php
  • Einheitliche Radio-Button-Auswahl: Alle Produkte werden als Radio-Buttons (switchers-package-wizard) dargestellt - keine separaten Checkboxen mehr für Onboarding-Produkte
  • Warn-Modal implementiert (Zeilen 78-96):
    • Bootstrap Modal #starterWarningModal mit Titel, Text, Zurück-Button und Bestätigen-Button
    • Übersetzungsschlüssel: register.starter_warning_title, register.starter_warning_text, register.starter_warning_back, register.starter_warning_confirm
  • JavaScript-Logik (Zeilen 98-129):
    • data-is-membership-only="1" auf Produkt-ID 35 (reine Mitgliedschaft)
    • Submit-Button (#btn-wizard-submit) prüft ob reine Mitgliedschaft gewählt ist
    • Falls ja: Modal wird angezeigt statt direkt abzusenden
    • Bestätigen-Button im Modal (#btn-confirm-membership-only) schließt Modal und submittet das Formular
    • Preisberechnung über data-price und calculate_package_payment() funktioniert
  • Standard-Auswahl: Der 2. Eintrag (erstes Starterpaket) ist per Default vorgewählt (@if($counter == 2) checked @endif)

8. Sprachdateien - ERLEDIGT

  • DE (resources/lang/de/register.php):
    • starter_warning_title => 'Achtung'
    • starter_warning_text => 'Mit einem Starterpaket erhältst Du einen Rabatt und kannst direkt in den nächsten Rang aufsteigen. Dieses Angebot ist nur einmalig bei der Registrierung verfügbar. Möchtest Du wirklich ohne Starterpaket nur die reine Mitgliedschaft abschließen?'
    • starter_warning_back => 'Zurück zur Auswahl'
    • starter_warning_confirm => 'Ja, nur Mitgliedschaft'
  • EN (resources/lang/en/register.php):
    • starter_warning_title => 'Attention'
    • starter_warning_text => 'With a starter package you receive a discount and can advance directly to the next rank. This offer is only available once during registration. Do you really want to proceed with only the membership without a starter package?'
    • starter_warning_back => 'Back to selection'
    • starter_warning_confirm => 'Yes, membership only'
  • ES (resources/lang/es/register.php):
    • starter_warning_title => 'Atención'
    • starter_warning_text => 'Con un paquete de inicio recibes un descuento y puedes ascender directamente al siguiente rango. Esta oferta solo está disponible una vez durante el registro. ¿Realmente deseas continuar solo con la membresía sin un paquete de inicio?'
    • starter_warning_back => 'Volver a la selección'
    • starter_warning_confirm => 'Sí, solo membresía'

Nachbesserung 1: Modal-Styling + dynamische Mitgliedschaft-Erkennung (2026-02-19)

Problem

  • Modal war optisch unauffällig (Standard-Bootstrap, keine Warn-Farben)
  • Produkt-ID 35 war im Blade hardcoded ($product->id == 35)

Lösung

9. Neues DB-Feld is_membership_only - ERLEDIGT

  • Migration: database/migrations/2026_02_19_140000_add_is_membership_only_to_products_table.php
    • Boolean is_membership_only, default false, nach free_shipping_consultant
  • Product Model: $casts + $fillable ergänzt
  • ProductRepository: Checkbox-Handling in update() ergänzt
  • Admin-Formular: Neue Checkbox "Reine Mitgliedschaft (MoP.)" mit Text: "Dieses Produkt ist eine reine Mitgliedschaft ohne Starterpaket (Warnung im Wizard)."

10. Hardcoded ID entfernt - ERLEDIGT

  • Blade _payment.blade.php: $product->id == 35 ersetzt durch $product->is_membership_only
  • Jetzt dynamisch: Jedes Produkt mit aktivierter Checkbox löst die Warnung aus

11. Modal-Styling aufgewertet - ERLEDIGT

  • Header: bg-warning text-dark mit fa-exclamation-triangle Icon
  • Border: border-warning am Modal-Content
  • Body: Inhalt in alert alert-warning Box mit fa-info-circle Icon
  • Footer: "Zurück"-Button als btn-warning (auffällig), "Bestätigen" als btn-outline-secondary (dezent)

Nachbesserung 2: Info-Box + Validierung ohne Vorauswahl (2026-02-19)

Problem

  • Ein Produkt war per Default vorausgewählt (2. Eintrag) - Nutzer hat das entfernt
  • Kein Hinweistext, der erklärt was zu tun ist
  • Keine Fehlermeldung wenn Submit ohne Auswahl geklickt wird

Lösung

12. Info-Alert oberhalb der Produkttabelle - ERLEDIGT

  • Blade _payment.blade.php: alert alert-info Box mit fa-info-circle Icon
  • Text erklärt die Wahlmöglichkeiten (Mitgliedschaft vs. Starterpaket mit Vorteilen)
  • Übersetzungsschlüssel: register.wizard_package_info

13. Validierung bei fehlender Auswahl - ERLEDIGT

  • Fehlermeldung: Verstecktes alert alert-danger (#wizard-selection-error) unter der Tabelle
  • JS-Logik: Submit prüft ob ein Radio-Button gewählt ist:
    • Falls nein: Fehlermeldung einblenden + roter Rand um Tabelle + Scroll zum Fehler
    • Fehlermeldung verschwindet sobald ein Produkt gewählt wird
  • Übersetzungsschlüssel: register.wizard_no_selection

14. Keine Vorauswahl mehr - ERLEDIGT

  • @if($counter == 2) checked @endif wurde vom Nutzer entfernt
  • Kein Produkt ist vorausgewählt, Nutzer muss aktiv wählen

15. Sprachdateien ergänzt - ERLEDIGT

  • DE: wizard_package_info + wizard_no_selection
  • EN: wizard_package_info + wizard_no_selection
  • ES: wizard_package_info + wizard_no_selection

Offene Punkte / Nächste Schritte

Testen

  • Wizard ohne Auswahl: Fehlermeldung muss rot erscheinen + Tabelle rot umrandet
  • Wizard mit Auswahl: Fehlermeldung verschwindet, Submit funktioniert
  • Wizard mit reiner Mitgliedschaft: Warning-Modal erscheint
  • Wizard mit Starterpaket: Direkt zum Checkout
  • Info-Box in allen Sprachen prüfen (de, en, es)