Recruiting Challenge: Storno nimmt Neupartner raus, Rang und Auszahlung nur mit Bestaetigung

Kundenentscheid 25.09.2026:
- Storno: Ist jede bezahlte Starterpaket-Bestellung eines Neupartners
  storniert (txaction = cancelled), bekommt das Tracking cancelled_at,
  eine Storno-Logzeile nimmt die Einmalpunkte zurueck. Nachtlauf und
  Neuaufbau markieren; "Meine Berechnung" zeigt den Partner durchgestrichen
  mit "Storniert am ..., zaehlt nicht".
- Gezaehlt wird fuer alle, einen Rang bekommen nur bestaetigte Teilnehmer;
  Export und Summen nur fuer sie. Unbestaetigte sehen "Deine Praemie nach
  Bestaetigung", im Admin "Teilnahme nicht bestaetigt, keine Auszahlung".
- Datenschutz: andere Berater sehen Unbestaetigte in der Rangliste nicht
  mehr (auch nicht anonym), VIP-Konten schon, der eigene Eintrag bleibt.
- Teilnahmebedingungen Punkt 2 und 7 und Hinweistexte in de/en/es/fr.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-25 10:44:49 +00:00
parent 42d2a9c0ab
commit c4edbf97e4
23 changed files with 318 additions and 45 deletions

View file

@ -325,15 +325,19 @@ class IncentiveController extends Controller
]);
}
// Storno: Partner bleibt sichtbar, zaehlt aber nicht (Kundenentscheid 25.09.2026)
$cancelled = $np->isCancelled();
return [
'id' => $np->id,
'label' => $np->user ? ($np->user->getFullName() ?: $np->user->email ?: 'User #'.$np->user_id) : 'User #'.$np->user_id,
'month' => $np->registered_at->month,
'year' => $np->registered_at->year,
'onetime' => $incentive->points_partner_onetime,
'monthly' => $monthly,
'total' => $incentive->points_partner_onetime + array_sum($monthly),
'transactions' => $transactions,
'onetime' => $cancelled ? 0 : $incentive->points_partner_onetime,
'monthly' => $cancelled ? array_fill(0, count($monthly), 0) : $monthly,
'total' => $cancelled ? 0 : $incentive->points_partner_onetime + array_sum($monthly),
'transactions' => $cancelled ? [] : $transactions,
'cancelled_at' => $np->cancelled_at?->format('d.m.Y'),
];
});

View file

@ -44,8 +44,13 @@ class IncentiveController extends Controller
->where('user_id', $user->id)
->first();
// Datenschutz (Kundenentscheid 25.09.2026): Unbestaetigte Teilnehmer sehen nur VIP-Konten;
// der eigene Eintrag bleibt fuer den Berater selbst sichtbar.
$ranking = IncentiveParticipant::where('incentive_id', $incentive->id)
->withRankingActivity()
->when(! $user->isVIP(), fn ($query) => $query->where(
fn ($visible) => $visible->whereNotNull('accepted_terms_at')->orWhere('user_id', $user->id)
))
->with('user', 'user.account')
->orderByIncentiveLeaderboard()
->paginate(100);