Team-Abo-Uebersicht: nur aktive Berater zaehlen
Die Linientabelle zaehlte alle Downline-User statt nur aktive Berater (m_level + gueltiges payment_account), wodurch zu viele Berater angezeigt wurden. Filter-Logik aus BackofficeDashboardService (isActiveConsultant, activeTeamUserIds) wiederverwendet und in TeamAboOverviewService (buildLineRow, teamKpis, monthlyGrowth) angewendet. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
386851aee8
commit
9565814221
3 changed files with 74 additions and 11 deletions
|
|
@ -175,6 +175,31 @@ class BackofficeDashboardService
|
|||
->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* IDs der gesamten Downline, aber nur aktive Berater
|
||||
* (gleiche Definition wie die "Berater"-Spalte der Backoffice-Statistik).
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
public function activeTeamUserIds(int $rootUserId): array
|
||||
{
|
||||
return collect($this->lineBuckets($rootUserId))
|
||||
->flatMap(fn (Collection $users) => $users)
|
||||
->filter(fn (User $user) => $this->isActiveConsultant($user))
|
||||
->map(fn (User $user) => (int) $user->id)
|
||||
->values()
|
||||
->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ein aktiver Berater hat eine Mitgliedsebene und ein gesetztes Abrechnungskonto.
|
||||
* Maßgeblich für die "Berater"-Zählung in den Team-Übersichten.
|
||||
*/
|
||||
public function isActiveConsultant(User $user): bool
|
||||
{
|
||||
return $user->m_level !== null && $user->payment_account !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Support\Collection<int, \App\User> $users
|
||||
* @return array<string, mixed>
|
||||
|
|
@ -261,7 +286,7 @@ class BackofficeDashboardService
|
|||
private function activeConsultants(Collection $users): int
|
||||
{
|
||||
return $users
|
||||
->filter(fn (User $user) => $user->m_level !== null && $user->payment_account !== null)
|
||||
->filter(fn (User $user) => $this->isActiveConsultant($user))
|
||||
->count();
|
||||
}
|
||||
|
||||
|
|
@ -324,12 +349,12 @@ class BackofficeDashboardService
|
|||
->whereIn('user_id', $userIds)
|
||||
->where('month', $month)
|
||||
->where('year', $year)
|
||||
->selectRaw('COALESCE(SUM(month_KP_points), 0) as own_points')
|
||||
->selectRaw('COALESCE(SUM(month_shop_points), 0) as external_points')
|
||||
->selectRaw('COALESCE(SUM(CASE WHEN shopping_orders.is_abo = 1 THEN month_shop_points ELSE 0 END), 0) as customer_abo_points')
|
||||
->selectRaw('COALESCE(SUM(CASE WHEN shopping_orders.id IS NOT NULL AND (shopping_orders.is_abo = 0 OR shopping_orders.is_abo IS NULL) THEN month_shop_points ELSE 0 END), 0) as customer_single_order_points')
|
||||
->selectRaw('COALESCE(SUM(CASE WHEN shopping_orders.id IS NULL THEN month_shop_points ELSE 0 END), 0) as customer_other_points')
|
||||
->selectRaw('COALESCE(SUM(month_total_net), 0) + COALESCE(SUM(month_shop_total_net), 0) as turnover_net')
|
||||
->selectRaw(SalesVolumePoints::ownPoints().' as own_points')
|
||||
->selectRaw(SalesVolumePoints::externalPoints().' as external_points')
|
||||
->selectRaw(SalesVolumePoints::customerAboPoints().' as customer_abo_points')
|
||||
->selectRaw(SalesVolumePoints::customerSingleOrderPoints().' as customer_single_order_points')
|
||||
->selectRaw(SalesVolumePoints::customerOtherPoints().' as customer_other_points')
|
||||
->selectRaw(SalesVolumePoints::turnoverNet().' as turnover_net')
|
||||
->first();
|
||||
|
||||
$ownPoints = (float) ($summary->own_points ?? 0);
|
||||
|
|
@ -382,9 +407,9 @@ class BackofficeDashboardService
|
|||
->where('month', $month)
|
||||
->where('year', $year)
|
||||
->select('user_id')
|
||||
->selectRaw('COALESCE(SUM(month_KP_points), 0) + COALESCE(SUM(month_shop_points), 0) as total_points')
|
||||
->selectRaw(SalesVolumePoints::totalPoints().' as total_points')
|
||||
->groupBy('user_id')
|
||||
->havingRaw('COALESCE(SUM(month_KP_points), 0) + COALESCE(SUM(month_shop_points), 0) >= 1000')
|
||||
->havingRaw(SalesVolumePoints::totalPoints().' >= 1000')
|
||||
->get()
|
||||
->count();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue