204 lines
9.5 KiB
Markdown
204 lines
9.5 KiB
Markdown
# 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:
|
|
```php
|
|
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:
|
|
```php
|
|
'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)
|