Incentive (E1): Recruiting-Challenge mit Geldpraemie, Auszahlungs-Export und parallelen Incentives
Neue Felder amount_per_partner, bonus_rank_1..3 und include_sales_points an incentives. Mit ausgeschalteten Umsatzpunkten zaehlt die Wertung nur die Einmalpunkte je Neupartner, die Rangliste entspricht damit der Anzahl Neupartner mit Starterpaket. IncentivePayoutService rechnet Neupartner mal Betrag plus Rang-Bonus fuer qualifizierte Gewinner; Admin-Detailseite bekommt Praemienspalte, Summen und XLSX-Export fuer die Auszahlung. Sidenav und Dashboard zeigen alle aktiven Incentives, damit Montenegro und die Challenge parallel laufen koennen. Teaser, Rangliste und Details zeigen bei Geldpraemie die Praemien-Kachel und "Deine Praemie bisher" und blenden Abo-Bloecke aus, wenn Abos keine Rolle spielen. Montenegro bleibt unveraendert. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
4899e3a890
commit
b28f51bf62
27 changed files with 1418 additions and 129 deletions
|
|
@ -1,6 +1,6 @@
|
|||
# Entwicklungsplan – Protokoll Zoom-Meeting 08.09.2026
|
||||
|
||||
**Stand:** 18.09.2026 · **Status:** C1/C2 live seit 14.09., A4, A3 und A1+A2 umgesetzt (committet, Deploy offen); Abo-Paket damit bis auf A5 komplett. Audit vom 18.09. ([2026-09-18-audit-commits-16-09-2026.md](2026-09-18-audit-commits-16-09-2026.md)) geprüft, alle Befunde umgesetzt — Stellungnahme und Deploy-Folgen dort.
|
||||
**Stand:** 18.09.2026 · **Status:** C1/C2 live seit 14.09., A4, A3 und A1+A2 umgesetzt (committet, Deploy offen); Abo-Paket damit bis auf A5 komplett. Audit vom 18.09. ([2026-09-18-audit-commits-16-09-2026.md](2026-09-18-audit-commits-16-09-2026.md)) geprüft, alle Befunde umgesetzt — Stellungnahme und Deploy-Folgen dort. **E1 (Recruiting-Challenge) umgesetzt 18.09., Deploy offen** — Konfiguration im Admin, Details unten.
|
||||
**Quellen:** `2026 09 Protokoll September-komprimiert.pdf` (Protokoll), `2026-09-14.md` (Ticket-Entwurf Abos #1–#3)
|
||||
**Verwandte Pläne:** `dev/2026-07-22/entwicklungsplan-2026-09-07.md` (K11–K14 behandeln dieselben Themen aus dem Kundenbrief; die dortigen Rückfragen F4–F7 sind weiterhin offen), `dev/2026-09-10-business-plan/` (Ledger-Plan, löst A07/K11 langfristig)
|
||||
|
||||
|
|
@ -21,7 +21,7 @@
|
|||
| **C2** | Laufstand-Race: Provision liest zu niedrigen Monatsstand bei zeitgleichen Buchungen – **Stufe 1+2 live seit 14.09.**, Stufe 3 offen | Befund aus C1 | 0,5 + 1 PT | hoch (Provision) | – (keine Nachzahlung, Entscheid 14.09.) |
|
||||
| **D1** | Neuer Reiter „Events“ mit Foto-Galerien (wie News-Archiv) | Protokoll | 2–3 PT | niedrig | Fotos liegen vor |
|
||||
| **D2** | Top 3 firmenweit im Backoffice | Protokoll | 0,5 PT | rechtlich | Network-Anwalt (F3) |
|
||||
| **E1** | Recruiting-Challenge Okt–Jan (50 €/Neupartner, Top 3) | Protokoll | 0,5 PT Konfiguration + 1–2 PT Erweiterung | niedrig | Details Dani/Alois |
|
||||
| **E1** | Recruiting-Challenge Okt–Jan (50 €/Neupartner, Top 3) – **umgesetzt 18.09., Deploy offen (Migration + Anlage im Admin)** | Protokoll | 0,5 PT Konfiguration + 1–2 PT Erweiterung | niedrig | Bonushöhe/Texte Dani/Alois |
|
||||
|
||||
**Reihenfolge (festgelegt 14.09.):**
|
||||
|
||||
|
|
@ -427,7 +427,7 @@ Die Zeilen entstehen in [`Payment::paymentStatusPaidAction()`](../../app/Service
|
|||
|
||||
## 5. Aktionen
|
||||
|
||||
### E1 – Recruiting-Challenge Oktober–Januar
|
||||
### E1 – Recruiting-Challenge Oktober–Januar — umgesetzt 18.09., Deploy offen
|
||||
|
||||
**Ziel (Protokoll):** Pro Neupartner mit Paket 50 € im Qualifikationszeitraum, Top 3 erhalten zusätzlich einen Bonus, Auszahlung gesammelt im Februar, wieder ein Ranking. Details klären Dani und Alois.
|
||||
|
||||
|
|
@ -441,6 +441,52 @@ Die Zeilen entstehen in [`Payment::paymentStatusPaidAction()`](../../app/Service
|
|||
|
||||
**Risiko:** niedrig. Offene Details (Bonushöhe Top 3, Anrechnung von Stornos/Rücktritten innerhalb des Zeitraums – `IncentivePointsLog.is_storno` existiert) mit Dani/Alois klären.
|
||||
|
||||
**Umsetzung (18.09.2026)**
|
||||
|
||||
Das Incentive-Modul trägt jetzt optional eine Geldprämie; Montenegro bleibt unverändert (alle neuen Felder leer bzw. Schalter an).
|
||||
|
||||
- **Neue Felder** (`incentives`, Migration `2026_09_18_130000_add_payout_fields_to_incentives_table`): `amount_per_partner` (€ je Neupartner, NULL = keine Prämie), `bonus_rank_1/2/3` (Zusatz-Bonus je Platz), `include_sales_points` (Standard 1). Admin-Formular: neue Karte „Prämie / Auszahlung“.
|
||||
- **Wertung nach Neupartnern:** Mit `include_sales_points = 0` schreibt der Tracker keine Umsatzpunkte der Neupartner/Neuabos mehr ([`IncentiveTracker::trackSalesVolume`](../../app/Services/Incentive/IncentiveTracker.php), Neuaufbau und Reparatur ebenso). Mit `points_partner_onetime = 1` und `points_abo_onetime = 0` entspricht der Punktestand damit der **Anzahl Neupartner mit Starterpaket**; die Rangliste bleibt die vorhandene (`updateRanking`). Neupartner = bezahlte Registrierung mit Starterpaket (`ShoppingOrder::wherePaidRegistrationIncludesStarterKit`), reine Mitgliedschaft zählt nicht.
|
||||
- **Prämie:** [`IncentivePayoutService`](../../app/Services/Incentive/IncentivePayoutService.php): `qualified_partners × amount_per_partner` plus Rang-Bonus, letzterer nur für qualifizierte Teilnehmer auf Platz 1–`max_winners`. Grundlage ist der gespeicherte Stand des Teilnehmers (derselbe wie in der Rangliste).
|
||||
- **Auszahlungs-Export:** Admin-Detailseite → Button „Auszahlungs-Export (XLSX)“ (`/admin/incentives/{id}/payout-export`): Rang, Berater-ID, Name, E-Mail, Teilnahme bestätigt, Neupartner, Betrag je Neupartner, Prämie Neupartner, Rang-Bonus, Prämie gesamt, Punkte, qualifiziert. Nur Zeilen mit Prämie > 0. Dazu Summenblock (Empfänger, Summen) und Prämienspalte in der Admin-Rangliste. **Gutschrift über `Credit` ist nicht gebaut** – die Februar-Auszahlung läuft über den Export in die Buchhaltung; Gutschriften ließen sich später aus derselben Liste erzeugen.
|
||||
- **Mehrere aktive Incentives:** Sidenav listet alle aktiven Incentives (bei mehreren mit Namen), Dashboard zeigt je Incentive eine Karte mit eigenen Modal-IDs; `HomeController` liefert `activeIncentives`/`incentiveParticipants` (die alten Einzelvariablen bleiben befüllt). Montenegro kann so bis zum Abschluss parallel stehen bleiben.
|
||||
- **Berater-Ansichten:** Teaser und Rangliste zeigen bei Geldprämie ohne Mindestqualifikation eine Prämien-Kachel statt „Dein Ticket“, blenden die Abo-Blöcke aus, wenn Abos keine Rolle spielen, und ergänzen die Rangliste um die Spalte „Prämie“; Header/Details zeigen „Deine Prämie bisher“. Der Punkte-Boost-Text erscheint nur, wenn Umsatzpunkte zählen.
|
||||
- **Tests:** [`IncentivePayoutTest`](../../tests/Feature/Incentive/IncentivePayoutTest.php), [`IncentiveSalesPointsToggleTest`](../../tests/Feature/Incentive/IncentiveSalesPointsToggleTest.php), [`IncentiveAdminPayoutTest`](../../tests/Feature/Incentive/IncentiveAdminPayoutTest.php). Incentive-Suite: 48 grün, 1 vorbestehender Fehlschlag (`IncentiveTeaserPageTest`, Hero-Bild in der Galerie – unabhängig von E1).
|
||||
|
||||
**Konfiguration der Challenge (Admin → Incentives → Neu):**
|
||||
|
||||
| Feld | Wert |
|
||||
|---|---|
|
||||
| Qualifikationsbeginn / -ende | 01.10.2026 / 31.01.2027 |
|
||||
| Berechnungsende | 31.01.2027 (ohne Umsatzpunkte gibt es keinen Nachlauf; 28.02. wäre nur nötig, wenn Umsätze zählen) |
|
||||
| Einmalpunkte pro Partner / pro Abo | 1 / 0 |
|
||||
| Mind. direkte Partner / Kundenabos | 0 / 0 |
|
||||
| Max. Gewinner | 3 |
|
||||
| Prämie je Neupartner | 50,00 |
|
||||
| Bonus Platz 1 / 2 / 3 | **offen – Dani/Alois** |
|
||||
| Umsatzpunkte mitzählen | **aus** |
|
||||
| Status | Aktiv (ab 01.10.; früher anlegen ist unschädlich, getrackt wird nur im Zeitraum) |
|
||||
| Bild, Untertitel, Beschreibung, Teilnahmebedingungen | **Dani/Alois** – ohne Beschreibung erscheint der Montenegro-Fallbacktext („Adria“), also Beschreibung unbedingt füllen |
|
||||
|
||||
**Nachtragen nach dem 01.10.:** `php artisan incentive:calculate {id}` zieht Neupartner ab Qualifikationsbeginn nach (läuft ohnehin täglich 05:00 für alle aktiven Incentives).
|
||||
|
||||
**Offen / bewusst nicht gebaut**
|
||||
|
||||
- Bonushöhe Top 3, Beschreibungstexte, Bild (Dani/Alois).
|
||||
- **Punktgleichstand** in den Top 3: Rangfolge ist dann bestätigte Teilnahme vor anonym, sonst Datenbankreihenfolge. Falls es auf die Boni ankommt, Regel festlegen (z. B. wer die Anzahl zuerst erreicht hat) – Umsetzung 0,5 PT.
|
||||
- **Stornos/Rücktritte:** Ein einmal getrackter Neupartner bleibt gezählt, auch wenn die Registrierung später storniert wird (Verhalten wie Montenegro). Vor der Auszahlung die Liste gegen stornierte Registrierungsbestellungen prüfen oder Regel mit Dani/Alois klären.
|
||||
- Gutschrift-Erzeugung aus dem Export (siehe oben).
|
||||
- Firmenweite Rangliste (D2) unverändert offen; die Challenge-Rangliste ist wie Montenegro für alle aktiven Berater sichtbar.
|
||||
|
||||
**Deploy**
|
||||
|
||||
```bash
|
||||
php artisan migrate # incentives: amount_per_partner, bonus_rank_1..3, include_sales_points
|
||||
php artisan view:clear && php artisan route:clear
|
||||
```
|
||||
|
||||
Danach Challenge im Admin anlegen (Tabelle oben). Kein Neuaufbau, keine Datenänderung an Montenegro.
|
||||
|
||||
---
|
||||
|
||||
## 6. Rückfragen an die Kundin / Alois (vor Start des jeweiligen Pakets)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue