Kundenfeedback 07.09. (K4, K5) und Karriere-Fallback: fehlende Controller-/View-Teile

Die Pakete stehen im Plan als umgesetzt und sind live, der Controller- und
View-Teil lag aber nur im Arbeitsbaum (Sprachkeys und Model-Methoden sind
seit 5a38f4a/685f7a9 versioniert):
- K5: Abo-Bestellungen in Punkteuebersicht, Dashboard-Punkten und eigener
  Statistik tuerkis mit Zusatz "(Abo)", Legende darueber.
- K4: Summe der Payline-Abos ("149 + 391 = 540 Abos gesamt").
- Home: payline_is_career_fallback, solange die Monatsquali aussteht
  (Kundenentscheid 01.09.); die View wertet das Kennzeichen schon aus.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-23 15:43:09 +00:00
parent 1a3af17f9a
commit 30bbfa32a0
6 changed files with 43 additions and 15 deletions

View file

@ -153,7 +153,8 @@ class HomeController extends Controller
// Berater) — die Payline-Mitgliedermenge selbst enthält auch inaktive,
// deren Abos weiterhin in die Abo-/Punkte-Summen der Payline zählen.
$activeTeamUserIds = $dashboardService->activeTeamUserIds($user->id);
$paylineMemberIds = $paylineService->paylineContext($user, $month, $year)['member_ids'];
$paylineContext = $paylineService->paylineContext($user, $month, $year);
$paylineMemberIds = $paylineContext['member_ids'];
$activePaylineMemberCount = count(array_intersect($activeTeamUserIds, $paylineMemberIds));
// Abo-Zähler der Payline monatsbezogen wie die übrigen Abo-Kacheln (N2) —
@ -176,6 +177,9 @@ class HomeController extends Controller
'payline_member_count' => $activePaylineMemberCount,
'payline_abo_count' => $paylineAboCount,
'payline_abos_new' => $paylineService->newPaylineAboCount($user, $month, $year),
// Monatsquali steht noch aus -> die beiden Payline-Kacheln rechnen
// mit den Ebenen des Karriere-Levels und weisen das aus.
'payline_is_career_fallback' => (bool) $paylineContext['is_career_fallback'],
'level' => app(LiveCommissionService::class)->levelProgress($user, $month, $year),
'level_forecast' => $levelForecast,
'top_results' => app(TopResultsService::class)->monthlyTop3($user, $month, $year),

View file

@ -1088,14 +1088,24 @@ class TeamController extends Controller
return \DataTables::eloquent($query)
// Abo-Bestellungen setzen sich farblich und per Zusatz von den
// Shop-Bestellungen ab (Kundenwunsch 2026-09-07). Die Farbe bleibt
// ansonsten wie bisher: eigene Bestellung vs. Kundenbestellung.
->addColumn('order', function (UserSalesVolume $UserSalesVolume) {
if ($UserSalesVolume->shopping_order) {
if ($UserSalesVolume->status === 1 && $UserSalesVolume->shopping_order->auth_user_id === $UserSalesVolume->user_id) {
return '<a href="'.route('user_order_detail', [$UserSalesVolume->shopping_order->id]).'" class="btn btn-xs btn-primary">'.$UserSalesVolume->shopping_order->id.'</a>';
}
if (($UserSalesVolume->status === 2 || $UserSalesVolume->status === 3) && $UserSalesVolume->shopping_order->member_id === $UserSalesVolume->user_id) {
return '<a href="'.route('user_shop_order_detail', [$UserSalesVolume->shopping_order->id]).'" class="btn btn-xs btn-secondary">'.$UserSalesVolume->shopping_order->id.'</a>';
}
$order = $UserSalesVolume->shopping_order;
if (! $order) {
return '';
}
$isAbo = $UserSalesVolume->isAboOrder();
$label = $order->id.($isAbo ? ' '.__('abo.abo_order_short') : '');
if ($UserSalesVolume->status === 1 && $order->auth_user_id === $UserSalesVolume->user_id) {
return '<a href="'.route('user_order_detail', [$order->id]).'" class="btn btn-xs btn-'.($isAbo ? 'info' : 'primary').'">'.$label.'</a>';
}
if (($UserSalesVolume->status === 2 || $UserSalesVolume->status === 3) && $order->member_id === $UserSalesVolume->user_id) {
return '<a href="'.route('user_shop_order_detail', [$order->id]).'" class="btn btn-xs btn-'.($isAbo ? 'info' : 'secondary').'">'.$label.'</a>';
}
return '';
@ -1107,7 +1117,7 @@ class TeamController extends Controller
return '<span class="badge badge-pill badge-'.$UserSalesVolume->getStatusTurnoverColor().'">'.$UserSalesVolume->getStatusTurnoverType().'</span>';
})
->addColumn('status', function (UserSalesVolume $UserSalesVolume) {
return '<span class="badge badge-pill badge-'.$UserSalesVolume->getStatusColor().'">'.$UserSalesVolume->getStatusType().'</span>';
return '<span class="badge badge-pill badge-'.$UserSalesVolume->getStatusColor().'">'.$UserSalesVolume->getStatusTypeWithAbo().'</span>';
})
->addColumn('message', function (UserSalesVolume $UserSalesVolume) {
return '<span class="no-line-break">'.$UserSalesVolume->message.'</span>';

View file

@ -32,6 +32,7 @@
</div>
@endif
</h6>
<p class="text-muted small mb-2">{{ __('abo.points_order_legend') }}</p>
<div class="card-datatable table-responsive">
<table class="datatables-user-points table table-striped table-bordered">
<thead>
@ -61,15 +62,17 @@
{{ formatNumber($userSalesVolume->total_net) }} &euro;
</td>
<td class="text-left font-weight-semibold">
<span class="badge badge-pill badge-{{ $userSalesVolume->getStatusColor() }}">{{ $userSalesVolume->getStatusType() }}</span>
<span class="badge badge-pill badge-{{ $userSalesVolume->getStatusColor() }}">{{ $userSalesVolume->getStatusTypeWithAbo() }}</span>
</td>
<td class="text-left font-weight-semibold">
@if($userSalesVolume->shopping_order)
@php($isAboOrder = $userSalesVolume->isAboOrder())
@php($orderLabel = $userSalesVolume->shopping_order->id.($isAboOrder ? ' '.__('abo.abo_order_short') : ''))
@if($userSalesVolume->status === 1 && $userSalesVolume->shopping_order->auth_user_id === $userSalesVolume->user_id)
<a href="{{ route('user_order_detail', [$userSalesVolume->shopping_order->id]) }}" class="btn btn-xs btn-primary">{{ $userSalesVolume->shopping_order->id }}</a>
<a href="{{ route('user_order_detail', [$userSalesVolume->shopping_order->id]) }}" class="btn btn-xs btn-{{ $isAboOrder ? 'info' : 'primary' }}">{{ $orderLabel }}</a>
@endif
@if(($userSalesVolume->status === 2 || $userSalesVolume->status === 3) && $userSalesVolume->shopping_order->member_id === $userSalesVolume->user_id)
<a href="{{ route('user_shop_order_detail', [$userSalesVolume->shopping_order->id]) }}" class="btn btn-xs btn-secondary">{{ $userSalesVolume->shopping_order->id }}</a>
<a href="{{ route('user_shop_order_detail', [$userSalesVolume->shopping_order->id]) }}" class="btn btn-xs btn-{{ $isAboOrder ? 'info' : 'secondary' }}">{{ $orderLabel }}</a>
@endif
@endif
</td>

View file

@ -113,6 +113,8 @@
</div>
</div>
<p class="text-muted small mb-2">{{ __('abo.points_order_legend') }}</p>
@foreach ($statistics['groups'] as $group)
@if ($group['rows'] !== [])
<div class="card mb-4">
@ -153,10 +155,10 @@
<td>
@if ($row['order_id'] && $row['order_type'] === 'own')
<a href="{{ route('user_order_detail', [$row['order_id']]) }}"
class="btn btn-xs btn-primary">{{ $row['order_id'] }}</a>
class="btn btn-xs btn-{{ ($row['is_abo'] ?? false) ? 'info' : 'primary' }}">{{ $row['order_id'] }}{{ ($row['is_abo'] ?? false) ? ' '.__('abo.abo_order_short') : '' }}</a>
@elseif ($row['order_id'] && $row['order_type'] === 'shop')
<a href="{{ route('user_shop_order_detail', [$row['order_id']]) }}"
class="btn btn-xs btn-secondary">{{ $row['order_id'] }}</a>
class="btn btn-xs btn-{{ ($row['is_abo'] ?? false) ? 'info' : 'secondary' }}">{{ $row['order_id'] }}{{ ($row['is_abo'] ?? false) ? ' '.__('abo.abo_order_short') : '' }}</a>
@else
<span class="text-muted">—</span>
@endif

View file

@ -67,7 +67,13 @@
<div class="text-muted small mt-2 text-center">
{{ __('abo.payline_hint', ['lines' => $paylineAboTurnover['paylines'], 'members' => $paylineAboTurnover['members']]) }}
<br>
{{ __('abo.payline_abo_counts', ['team_abos' => $paylineAboTurnover['team_abo_count'] ?? 0, 'customer_abos' => $paylineAboTurnover['team_customer_abo_count'] ?? 0]) }}
@php($paylineTeamAbos = (int) ($paylineAboTurnover['team_abo_count'] ?? 0))
@php($paylineCustomerAbos = (int) ($paylineAboTurnover['team_customer_abo_count'] ?? 0))
{{ __('abo.payline_abo_counts', [
'team_abos' => $paylineTeamAbos,
'customer_abos' => $paylineCustomerAbos,
'total' => $paylineTeamAbos + $paylineCustomerAbos,
]) }}
</div>
@else
<p class="text-muted mb-0 mt-2">{{ __('abo.payline_none') }}</p>

View file

@ -47,6 +47,9 @@
@include('user.team._points_sum', ['userSalesVolume' => $userSalesVolume])
</div>
<div class="card">
<div class="px-3 pt-3">
<p class="text-muted small mb-2">{{ __('abo.points_order_legend') }}</p>
</div>
<div class="card-datatable table-responsive">
<table class="table table-striped table-bordered" id="datatable-user-points">