Incentive: Ticket-Fixes 2026-08-12 + Team-Struktur nach active_date sortiert
Incentive (Montenegro 2026): - Live-Tracker: whereDate() für Zeitraum-Vergleiche – Bestellungen am letzten Tag des Qualifikationszeitraums gingen verloren (DATE-Spalte vs. Datetime) - Repair/Rebuild: Neupartner-Definition auf Starterpaket-Bestelldatum im Zeitraum umgestellt (statt users.created_at) – Bestandskunden-Upgrades zählen jetzt wie im Live-Tracking (Fall Dino Portaro → Steffi Karrer) - Neu: removeStaleSponsorTrackings() – Partner-Trackings wandern nach Sponsorwechsel zum aktuellen Sponsor (Fall Anna Schall lag beim Firmenkonto) - incentive:calculate: Sponsorwechsel-Bereinigung eingebunden + Statistik Team-Struktur (/user/team/structure): - Downline sortiert nach active_date (Partner-Aktivierung) statt users.id: zentral in TreeHtmlRenderer::sortByActivation() (wirkt sofort, auch für gespeicherte Monats-Snapshots) + orderBy in beiden Downline-Queries Doku: dev/2026-08-12-intensiv-tickets/README.md (4 Kundentickets analysiert, Lücke durch verspätete Zeitraum-Verlängerung hatte sich per Nacht-Cron geheilt) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
ac3bd6e8ea
commit
841d87e161
11 changed files with 689 additions and 115 deletions
|
|
@ -265,22 +265,30 @@ class IncentiveParticipant extends Model
|
|||
$this->newAbos()->delete();
|
||||
$this->pointsLog()->delete();
|
||||
|
||||
// A. Neupartner: direkt gesponserte User im Qualifikationszeitraum mit bezahltem Starterpaket
|
||||
// A. Neupartner: direkt gesponserte User mit im Qualifikationszeitraum bezahltem Starterpaket
|
||||
// (Bestelldatum zaehlt, wie Live-Tracking - nicht das User-Registrierungsdatum)
|
||||
$partnerWindowStart = $incentive->qualification_start->copy()->startOfDay();
|
||||
$partnerWindowEnd = $incentive->qualification_end->copy()->endOfDay();
|
||||
|
||||
$new_partners = User::where('m_sponsor', $this->user_id)
|
||||
->whereBetween('created_at', [
|
||||
$incentive->qualification_start,
|
||||
$incentive->qualification_end->copy()->endOfDay(),
|
||||
])
|
||||
->whereHas('shopping_orders', function ($q) {
|
||||
$q->wherePaidRegistrationIncludesStarterKit();
|
||||
->whereHas('shopping_orders', function ($q) use ($partnerWindowStart, $partnerWindowEnd) {
|
||||
$q->wherePaidRegistrationIncludesStarterKit()
|
||||
->whereBetween('created_at', [$partnerWindowStart, $partnerWindowEnd]);
|
||||
})
|
||||
->get();
|
||||
|
||||
foreach ($new_partners as $partner) {
|
||||
$starterOrderDate = $partner->shopping_orders()
|
||||
->wherePaidRegistrationIncludesStarterKit()
|
||||
->whereBetween('created_at', [$partnerWindowStart, $partnerWindowEnd])
|
||||
->orderBy('id')
|
||||
->value('created_at');
|
||||
$registeredAt = $starterOrderDate ? Carbon::parse($starterOrderDate) : $partner->created_at;
|
||||
|
||||
$newPartner = IncentiveNewPartner::create([
|
||||
'participant_id' => $this->id,
|
||||
'user_id' => $partner->id,
|
||||
'registered_at' => $partner->created_at,
|
||||
'registered_at' => $registeredAt,
|
||||
]);
|
||||
|
||||
IncentivePointsLog::create([
|
||||
|
|
@ -289,8 +297,8 @@ class IncentiveParticipant extends Model
|
|||
'source_type' => User::class,
|
||||
'source_id' => $partner->id,
|
||||
'source_label' => $partner->getFullName() ?: $partner->email ?: ('User #'.$partner->id),
|
||||
'month' => $partner->created_at->month,
|
||||
'year' => $partner->created_at->year,
|
||||
'month' => $registeredAt->month,
|
||||
'year' => $registeredAt->year,
|
||||
'points_onetime' => $incentive->points_partner_onetime,
|
||||
'points_accumulated' => 0,
|
||||
'incentive_new_partner_id' => $newPartner->id,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue