@php $selectedMonth = request()->get('stats_month', date('n')); $selectedYear = request()->get('stats_year', date('Y')); // Start- und Enddatum für den Monat $startDate = \Carbon\Carbon::createFromDate($selectedYear, $selectedMonth, 1)->startOfMonth(); $endDate = \Carbon\Carbon::createFromDate($selectedYear, $selectedMonth, 1)->endOfMonth(); // UserBusiness für den Monat laden (enthält Payline-Punkte) $userBusiness = \App\Models\UserBusiness::where('user_id', $user->id) ->where('month', $selectedMonth) ->where('year', $selectedYear) ->first(); // UserSalesVolume für KP-Punkte $userSalesVolume = $user->getUserSalesVolume($selectedMonth, $selectedYear, 'first'); // Kunden-Umsatz Punkte (KP - Eigene Punkte + Shop) $customerPoints = $userSalesVolume ? $userSalesVolume->getPointsKPSum() : 0; // Team-Umsatz Punkte (Payline) - Live-Berechnung wenn UserBusiness nicht verfügbar $teamPaylinePoints = 0; $isLiveCalculation = false; if ($userBusiness) { // Gespeicherte Daten aus UserBusiness verwenden $teamPaylinePoints = $userBusiness->payline_points ?? 0; } else { // Live-Berechnung über TreeCalcBot (für aktuellen Monat) $isLiveCalculation = true; try { $treeCalcBot = new \App\Services\BusinessPlan\TreeCalcBot((int)$selectedMonth, (int)$selectedYear, 'member'); $treeCalcBot->initBusinesslUserDetail($user); if ($treeCalcBot->business_user) { $teamPaylinePoints = $treeCalcBot->business_user->payline_points ?? 0; } } catch (\Exception $e) { \Log::warning("Live-Berechnung Payline-Punkte fehlgeschlagen für User {$user->id}: " . $e->getMessage()); $teamPaylinePoints = 0; } } // Direkte Neupartner (Firstlines) in diesem Monat $directNewPartners = \App\User::where('m_sponsor', $user->id) ->where('active_date', '>=', $startDate) ->where('active_date', '<=', $endDate) ->where('m_level', '!=', null) ->where('payment_account', '!=', null) ->count(); // ===== REKURSIVE TEAM-STRUKTUR ===== // Hilfsfunktion um alle Team-Mitglieder rekursiv zu sammeln (inkl. Sponsor-Kette) $getAllTeamMemberIds = function($sponsorId, $maxDepth = 20) use (&$getAllTeamMemberIds) { static $cache = []; if (isset($cache[$sponsorId])) { return $cache[$sponsorId]; } $teamIds = []; $currentLevel = [$sponsorId]; $depth = 0; while (!empty($currentLevel) && $depth < $maxDepth) { $children = \App\User::whereIn('m_sponsor', $currentLevel) ->where('m_level', '!=', null) ->where('payment_account', '!=', null) ->whereNull('deleted_at') ->pluck('id') ->toArray(); $teamIds = array_merge($teamIds, $children); $currentLevel = $children; $depth++; } $cache[$sponsorId] = $teamIds; return $teamIds; }; // Alle Team-Mitglieder rekursiv laden $allTeamMemberIds = $getAllTeamMemberIds($user->id); // Neupartner im gesamten Team (rekursiv im Marketingplan) $teamNewPartners = 0; if (!empty($allTeamMemberIds)) { $teamNewPartners = \App\User::whereIn('id', $allTeamMemberIds) ->where('active_date', '>=', $startDate) ->where('active_date', '<=', $endDate) ->count(); } // Kundenabos (is_for = 'customer' oder shop-bezogen) $customerAbos = \App\Models\UserAbo::where('member_id', $user->id) ->where('is_for', 'customer') ->whereIn('status', [1, 2]) // aktive Abos ->where('active', true) ->count(); // Eigene Abos $ownAbos = \App\Models\UserAbo::where('user_id', $user->id) ->where('is_for', 'me') ->whereIn('status', [1, 2]) ->where('active', true) ->count(); // Team-Abos (rekursiv über gesamtes Team im Marketingplan) $teamAbos = 0; if (!empty($allTeamMemberIds)) { $teamAbos = \App\Models\UserAbo::whereIn('user_id', $allTeamMemberIds) ->where('is_for', 'me') ->whereIn('status', [1, 2]) ->where('active', true) ->count(); } @endphp @if($user->isActiveAccount())