Statistiken/Abo: Kundenfeedback 2026-07-24 komplett umgesetzt + Steuern: DATEV-Fixes 08+09/2025 (Sammel-Commit Branch-WIP)
Feedback-Umsetzung (dev/2026-07-22/feedback-analyse-2026-07-24.md, alle 10 Punkte):
- VIP-Statistik: eigener Berater ('ich', Linie 0) in Neue-Kundenabos- und beiden Top-10-Listen; Top-10-Umsatz sortiert nach abgerechneten Ist-Punkten + Abo-Anzahl-Spalte; Fußnote nicht-payline-wirksame Punkte (SalesVolumePoints::nonPaylinePoints)
- Führungskräfte-Liste: beide Sichten 'direkt' (an nächster FK abgeschnitten, additiv) und 'gesamt' (komplette Downline), Gesamt-Spalte nach Kundenzählweise
- Team-Abos: je Ebene 'abgerechnet (Monat)' und 'bis zum 25. erwartet'; Payline-Karte mit Teamabo-/Kundenabo-Zählern
- Incentive-Live-Ranking: Qualifizierte zuerst nummeriert (fixt auch isWinner rank<=max_winners)
- Porto: Netto-/Brutto-Kennzeichnung (Berater netto, Endkunden inkl. MwSt., portal_view-Flag; auch CRM-/Shop-Warenkorb + Checkout), Yard::shipping_tax-Fix
- Struktur-Ansicht: Abo-Badges 'A' (eigenes Abo) und '(n)' (Kundenabos) je Teampartner, gebatcht
- Abo-Löschung: Softdelete setzt active=0 (UserAbo deleting-Hook) + Bereinigungs-Migration für gelöschte-aber-aktive Abos
- Doku: technische Analyse + Kundinnen-Feedback-Dokument unter dev/2026-07-22/
- Tests: IncentiveRankingTest, TeamStructureAboBadgesTest, YardShippingTaxTest (neu); BackofficeStatisticsListsTest, TeamAboOverviewTest, PaylineForecastServiceTest, AboAdminDeleteTest, AboOneTimeViewTest erweitert
Außerdem enthalten (Branch-WIP vor dem Feedback): DATEV-Abgleich-Fixes 08+09/2025, USt-ID-Live-Validierung sowie restliche unkommittete Stände (u. a. Abo-Pause-Sprachkeys).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
657d4bd5b7
commit
ac3bd6e8ea
136 changed files with 7610 additions and 2688 deletions
|
|
@ -5,6 +5,9 @@
|
|||
<div>
|
||||
{{ __('navigation.statistics') }} / {{ $details['metric_label'] }}
|
||||
<span class="badge badge-secondary ml-2">VIP</span>
|
||||
@if (! empty($details['only_new']))
|
||||
<span class="badge badge-success ml-1">Nur neue im {{ $details['month'] }}/{{ $details['year'] }}</span>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<a href="{{ route('user_backoffice_statistics_export', [
|
||||
|
|
@ -12,6 +15,7 @@
|
|||
'metric' => $details['metric'],
|
||||
'month' => $selectedMonth,
|
||||
'year' => $selectedYear,
|
||||
'only_new' => ($details['only_new'] ?? false) ? 1 : 0,
|
||||
]) }}"
|
||||
class="btn btn-sm btn-outline-secondary mr-2">
|
||||
<span class="ion ion-md-download mr-1"></span> CSV
|
||||
|
|
@ -95,6 +99,11 @@
|
|||
<th class="text-right" data-sortable="true" data-sort-type="number"><span class="sortable-label justify-content-end">Sonstige Punkte <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
<th class="text-right" data-sortable="true" data-sort-type="number" style="background-color:#d4edda;"><span class="sortable-label justify-content-end">Kundenpunkte <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
<th class="text-right" data-sortable="true" data-sort-type="number"><span class="sortable-label justify-content-end">Gesamtpunkte <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
@elseif ($details['metric'] === 'new_partners')
|
||||
<th data-sortable="true"><span class="sortable-label">Sponsor <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
<th class="text-right" data-sortable="true" data-sort-type="number"><span class="sortable-label justify-content-end">Kundenpunkte <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
<th data-sortable="true" data-sort-type="date"><span class="sortable-label">Aktiv seit <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
<th data-sortable="true" data-sort-type="date"><span class="sortable-label">Account gültig bis <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
@else
|
||||
<th data-sortable="true" data-sort-type="date"><span class="sortable-label">Aktiv seit <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
<th data-sortable="true" data-sort-type="date"><span class="sortable-label">Account gültig bis <i class="ion ion-ios-swap sort-icon"></i></span></th>
|
||||
|
|
@ -157,6 +166,11 @@
|
|||
<td class="text-right">{{ \App\Services\Util::formatNumber($row['customer_other_points']) }}</td>
|
||||
<td class="text-right font-weight-bold"><span class="badge" style="background-color:#d4edda;color:#155724;font-size:90%;">{{ \App\Services\Util::formatNumber($row['external_points']) }}</span></td>
|
||||
<td class="text-right font-weight-bold">{{ \App\Services\Util::formatNumber($row['total_points']) }}</td>
|
||||
@elseif ($details['metric'] === 'new_partners')
|
||||
<td>{{ $row['sponsor'] ?? '-' }}</td>
|
||||
<td class="text-right font-weight-bold">{{ \App\Services\Util::formatNumber($row['customer_points'] ?? 0) }}</td>
|
||||
<td>{{ $row['active_date'] ?? '-' }}</td>
|
||||
<td>{{ $row['payment_account'] ?? '-' }}</td>
|
||||
@else
|
||||
<td>{{ $row['active_date'] ?? '-' }}</td>
|
||||
<td>
|
||||
|
|
@ -194,6 +208,11 @@
|
|||
<td class="text-right">{{ \App\Services\Util::formatNumber($details['summary']['customer_other_points']) }}</td>
|
||||
<td class="text-right" style="background-color:#d4edda;">{{ \App\Services\Util::formatNumber($details['summary']['external_points']) }}</td>
|
||||
<td class="text-right">{{ \App\Services\Util::formatNumber($details['summary']['total_points']) }}</td>
|
||||
@elseif ($details['metric'] === 'new_partners')
|
||||
<td></td>
|
||||
<td class="text-right">{{ \App\Services\Util::formatNumber($details['summary']['customer_points'] ?? 0) }}</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
@else
|
||||
<td></td>
|
||||
<td></td>
|
||||
|
|
|
|||
|
|
@ -26,6 +26,9 @@
|
|||
@if (!empty($performance['calculated_at']))
|
||||
<span class="ml-2">Snapshot vom {{ $performance['calculated_at'] }}</span>
|
||||
@endif
|
||||
@if (!empty($statistics['abo_stock_live']))
|
||||
<span class="badge badge-success ml-2" title="Abo-Bestandszahlen (Teamabos, Teamkundenabos, Führungskräfte, Top 10) zeigen den heutigen Stand; Punkte und Umsätze bleiben auf dem Stand des gewählten Monats.">Abo-Bestände tagesaktuell</span>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
|
@ -86,11 +89,32 @@
|
|||
};
|
||||
};
|
||||
|
||||
// Ziel-Link des grünen "+N"-Badges: Neupartner-Liste bzw. Abo-Drilldown
|
||||
// gefiltert auf die im Monat neuen Abos (only_new).
|
||||
$newBadgeLink = function (int $lineNo, string $metric) use ($selectedMonth, $selectedYear): string {
|
||||
if ($metric === 'consultants') {
|
||||
return route('user_backoffice_statistics_details', [
|
||||
'line' => $lineNo,
|
||||
'metric' => 'new_partners',
|
||||
'month' => $selectedMonth,
|
||||
'year' => $selectedYear,
|
||||
]);
|
||||
}
|
||||
|
||||
return route('user_backoffice_statistics_details', [
|
||||
'line' => $lineNo,
|
||||
'metric' => $metric,
|
||||
'month' => $selectedMonth,
|
||||
'year' => $selectedYear,
|
||||
'only_new' => 1,
|
||||
]);
|
||||
};
|
||||
|
||||
$selectedMonthName = $filterMonths[(int) $selectedMonth] ?? $selectedMonth;
|
||||
@endphp
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6 mb-3 mb-md-0">
|
||||
<div class="col-md-4 mb-3 mb-md-0">
|
||||
<a href="{{ route('user_backoffice_statistics_details', [
|
||||
'line' => 0,
|
||||
'metric' => 'new_partners',
|
||||
|
|
@ -112,7 +136,7 @@
|
|||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-4 mb-3 mb-md-0">
|
||||
<a href="{{ route('user_backoffice_statistics_details', [
|
||||
'line' => 0,
|
||||
'metric' => 'shop_1000',
|
||||
|
|
@ -135,6 +159,32 @@
|
|||
</div>
|
||||
</a>
|
||||
</div>
|
||||
@if (isset($commission))
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<div class="text-muted small">
|
||||
Provision ({{ $selectedMonthName }} {{ $selectedYear }})
|
||||
@if (! empty($commission['is_live']))
|
||||
<span class="badge badge-pill badge-info ml-1"
|
||||
title="Vorläufig, live berechnet — final nach Monatsabschluss. Aktualisierung ca. alle 6 Stunden.">Live</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="display-4 font-weight-bold text-warning">
|
||||
{{ number_format((float) ($commission['total'] ?? 0), 2, ',', '.') }} €
|
||||
</div>
|
||||
<div class="text-muted small mt-1">
|
||||
Payline {{ number_format((float) ($commission['pp'] ?? 0), 2, ',', '.') }} €
|
||||
· Shop {{ number_format((float) ($commission['shop'] ?? 0), 2, ',', '.') }} €
|
||||
· WB {{ number_format((float) ($commission['growth'] ?? 0), 2, ',', '.') }} €
|
||||
</div>
|
||||
</div>
|
||||
<span class="ion ion-md-cash display-4 text-muted"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
|
|
@ -167,8 +217,9 @@
|
|||
</a>
|
||||
@php $newMetric = $newAboMetric($line, $metric); @endphp
|
||||
@if ($newMetric && $line[$newMetric] > 0)
|
||||
<span
|
||||
class="badge badge-pill badge-success ml-1">+{{ number_format($line[$newMetric], 0, ',', '.') }}</span>
|
||||
<a href="{{ $newBadgeLink($line['line'], $metric) }}"
|
||||
class="badge badge-pill badge-success ml-1 backoffice-statistics-click-badge"
|
||||
title="Neue im Monat anzeigen">+{{ number_format($line[$newMetric], 0, ',', '.') }}</a>
|
||||
@endif
|
||||
@else
|
||||
<span
|
||||
|
|
@ -196,8 +247,9 @@
|
|||
</a>
|
||||
@php $newMetric = $newAboMetric($statistics['totals'], $metric); @endphp
|
||||
@if ($newMetric && $statistics['totals'][$newMetric] > 0)
|
||||
<span
|
||||
class="badge badge-pill badge-success ml-1">+{{ number_format($statistics['totals'][$newMetric], 0, ',', '.') }}</span>
|
||||
<a href="{{ $newBadgeLink(0, $metric) }}"
|
||||
class="badge badge-pill badge-success ml-1 backoffice-statistics-click-badge"
|
||||
title="Neue im Monat anzeigen">+{{ number_format($statistics['totals'][$newMetric], 0, ',', '.') }}</a>
|
||||
@endif
|
||||
@else
|
||||
<span
|
||||
|
|
@ -209,6 +261,17 @@
|
|||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
@php $nonPaylinePoints = $statistics['non_payline_points'] ?? null; @endphp
|
||||
@if ($nonPaylinePoints !== null && $nonPaylinePoints > 0)
|
||||
<div class="card-body py-2 border-top">
|
||||
<p class="text-muted small mb-0">
|
||||
In den Gesamtpunkten enthalten:
|
||||
<strong>{{ \App\Services\Util::formatNumber($nonPaylinePoints) }} Punkte</strong>,
|
||||
die nicht in die Payline fließen (z. B. Neupartner-Einschreibungspunkte) —
|
||||
die Punkte-Summe der Struktur-/Provisionsansicht fällt deshalb um diesen Betrag niedriger aus.
|
||||
</p>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -253,8 +316,13 @@
|
|||
@foreach ($newCustomerAbos as $row)
|
||||
<tr>
|
||||
<td>
|
||||
<div class="font-weight-semibold">{{ $row['name'] }}</div>
|
||||
<div class="text-muted small">Linie {{ $row['line'] }} · {{ $row['career_level'] }}</div>
|
||||
<div class="font-weight-semibold">
|
||||
{{ $row['name'] }}
|
||||
@if (!empty($row['is_self']))
|
||||
<span class="badge badge-pill badge-info ml-1">ich</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="text-muted small">{{ !empty($row['is_self']) ? 'Eigene Kundenabos' : 'Linie '.$row['line'] }} · {{ $row['career_level'] }}</div>
|
||||
</td>
|
||||
<td class="text-right align-middle">
|
||||
<span class="badge badge-pill badge-outline-default backoffice-statistics-click-badge">
|
||||
|
|
@ -288,7 +356,9 @@
|
|||
@if ($leaderAbos !== null)
|
||||
<div class="text-muted small">
|
||||
{{ number_format((float) ($leaderAbos['total_own'] ?? 0), 0, ',', '.') }} eigene ·
|
||||
{{ number_format((float) ($leaderAbos['total_customer'] ?? 0), 0, ',', '.') }} Kunden
|
||||
{{ number_format((float) ($leaderAbos['total_customer'] ?? 0), 0, ',', '.') }} Kunden ·
|
||||
{{ number_format((float) ($leaderAbos['total_team'] ?? 0), 0, ',', '.') }} Team ·
|
||||
{{ number_format((float) ($leaderAbos['total_team_customer'] ?? 0), 0, ',', '.') }} Teamkunden
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
|
@ -313,32 +383,171 @@
|
|||
<th>Führungskraft</th>
|
||||
<th class="text-right">Eigene Abos</th>
|
||||
<th class="text-right">Kundenabos</th>
|
||||
<th class="text-right" title="Berater-Abos im eigenen Team bis zur nächsten Führungskraft — diese Spalten überschneiden sich nicht und ergeben die Kopf-Summe.">Teamabos (direkt)</th>
|
||||
<th class="text-right" title="Kundenabos im eigenen Team bis zur nächsten Führungskraft.">Team-Kundenabos (direkt)</th>
|
||||
<th class="text-right" title="Berater-Abos der kompletten Downline — Teams untergeordneter Führungskräfte zählen hier mit, die Spalte lässt sich deshalb nicht aufsummieren.">Teamabos (gesamt)</th>
|
||||
<th class="text-right" title="Kundenabos der kompletten Downline — inklusive der Teams untergeordneter Führungskräfte.">Team-Kundenabos (gesamt)</th>
|
||||
<th class="text-right" title="Eigenes Abo + Kundenabos + Teamabos (gesamt) + Team-Kundenabos (gesamt)">Gesamt</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($leaderAbos['rows'] as $row)
|
||||
@php
|
||||
$leaderTotal = $row['total_abo_count_full']
|
||||
?? (($row['own_abo_count'] ?? 0) + ($row['customer_abo_count'] ?? 0) + ($row['team_abo_count_total'] ?? ($row['team_abo_count'] ?? 0)) + ($row['team_customer_abo_count_total'] ?? ($row['team_customer_abo_count'] ?? 0)));
|
||||
@endphp
|
||||
<tr>
|
||||
<td>
|
||||
<div class="font-weight-semibold">{{ $row['name'] }}</div>
|
||||
<div class="text-muted small">Linie {{ $row['line'] }} · {{ $row['career_level'] }}</div>
|
||||
</td>
|
||||
<td class="text-right align-middle">
|
||||
@if (($row['own_abo_count'] ?? 0) > 0)
|
||||
<span class="badge badge-pill badge-outline-default backoffice-statistics-click-badge">
|
||||
{{ number_format((float) $row['own_abo_count'], 0, ',', '.') }}
|
||||
</span>
|
||||
@else
|
||||
<span class="badge badge-pill badge-light backoffice-statistics-empty-badge">0</span>
|
||||
@endif
|
||||
@foreach (['own_abo_count', 'customer_abo_count', 'team_abo_count', 'team_customer_abo_count', 'team_abo_count_total', 'team_customer_abo_count_total'] as $countKey)
|
||||
<td class="text-right align-middle">
|
||||
@if (($row[$countKey] ?? 0) > 0)
|
||||
<span class="badge badge-pill badge-outline-default backoffice-statistics-click-badge">
|
||||
{{ number_format((float) $row[$countKey], 0, ',', '.') }}
|
||||
</span>
|
||||
@else
|
||||
<span class="badge badge-pill badge-light backoffice-statistics-empty-badge">0</span>
|
||||
@endif
|
||||
</td>
|
||||
@endforeach
|
||||
<td class="text-right align-middle font-weight-bold">
|
||||
{{ number_format((float) $leaderTotal, 0, ',', '.') }}
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="card-body pt-2 pb-3">
|
||||
<p class="text-muted small mb-0">
|
||||
<strong>direkt</strong> = Team bis zur nächsten Führungskraft (überschneidungsfrei, ergibt die Kopf-Summe).
|
||||
<strong>gesamt</strong> = komplette Downline inklusive der Teams untergeordneter Führungskräfte — dieselben Abos
|
||||
können dort bei mehreren Führungskräften zählen, die Gesamt-Spalte lässt sich deshalb nicht aufsummieren.
|
||||
</p>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@php
|
||||
$topCustomerAbos = $statistics['top_customer_abos'] ?? null;
|
||||
@endphp
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6 mb-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Top 10 Kundenabos (Anzahl)</h5>
|
||||
<div class="text-muted small"
|
||||
title="Zählt den heutigen Bestand aktiver Kundenabos. Die Incentive-Rangliste zählt anders: dort bleiben alle im Aktionszeitraum gestarteten Abos dauerhaft gezählt (inkl. Eigenabo und inzwischen beendeter Abos) — die Zahlen weichen deshalb bewusst voneinander ab.">
|
||||
aktueller Bestand aktiver Kundenabos · weicht bewusst von der Incentive-Zählung ab
|
||||
<span class="ion ion-md-information-circle-outline"></span>
|
||||
</div>
|
||||
</div>
|
||||
@if ($topCustomerAbos === null)
|
||||
<div class="card-body">
|
||||
<p class="text-muted mb-0">
|
||||
Für diesen Monat liegt noch ein älterer Snapshot ohne diese Liste vor.
|
||||
</p>
|
||||
</div>
|
||||
@elseif (count($topCustomerAbos['by_count']) === 0)
|
||||
<div class="card-body">
|
||||
<p class="text-muted mb-0">Im Team gibt es aktuell keine aktiven Kundenabos.</p>
|
||||
</div>
|
||||
@else
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 4rem;">Platz</th>
|
||||
<th>Berater</th>
|
||||
<th class="text-right">Kundenabos</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($topCustomerAbos['by_count'] as $row)
|
||||
<tr>
|
||||
<td class="align-middle font-weight-bold">{{ $loop->iteration }}.</td>
|
||||
<td>
|
||||
<div class="font-weight-semibold">
|
||||
{{ $row['name'] }}
|
||||
@if (!empty($row['is_self']))
|
||||
<span class="badge badge-pill badge-info ml-1">ich</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="text-muted small">{{ !empty($row['is_self']) ? 'Eigene Kundenabos' : 'Linie '.$row['line'] }} · {{ $row['career_level'] }}</div>
|
||||
</td>
|
||||
<td class="text-right align-middle">
|
||||
@if (($row['customer_abo_count'] ?? 0) > 0)
|
||||
<span class="badge badge-pill badge-outline-default backoffice-statistics-click-badge">
|
||||
{{ number_format((float) $row['customer_abo_count'], 0, ',', '.') }}
|
||||
</span>
|
||||
@else
|
||||
<span class="badge badge-pill badge-light backoffice-statistics-empty-badge">0</span>
|
||||
@endif
|
||||
<span class="badge badge-pill badge-outline-default backoffice-statistics-click-badge">
|
||||
{{ number_format((float) $row['abo_count'], 0, ',', '.') }}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6 mb-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Top 10 Kundenabos (Umsatz)</h5>
|
||||
<div class="text-muted small"
|
||||
title="Abgerechnet = Kundenabo-Punkte, die im gewählten Monat tatsächlich angerechnet wurden (Hauptwert, Sortierung). Bestand/Lieferung = Punkte, die die heute aktiven Kundenabos pro Lieferung bringen — kann abweichen, wenn Abos im Monat dazukamen oder beendet wurden.">
|
||||
sortiert nach abgerechneten Kundenabo-Punkten {{ $selectedMonthName }} {{ $selectedYear }}
|
||||
<span class="ion ion-md-information-circle-outline"></span>
|
||||
</div>
|
||||
</div>
|
||||
@if ($topCustomerAbos === null)
|
||||
<div class="card-body">
|
||||
<p class="text-muted mb-0">
|
||||
Für diesen Monat liegt noch ein älterer Snapshot ohne diese Liste vor.
|
||||
</p>
|
||||
</div>
|
||||
@elseif (count($topCustomerAbos['by_points']) === 0)
|
||||
<div class="card-body">
|
||||
<p class="text-muted mb-0">Im Team gibt es aktuell keine Kundenabo-Umsätze.</p>
|
||||
</div>
|
||||
@else
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 4rem;">Platz</th>
|
||||
<th>Berater</th>
|
||||
<th class="text-right">Abos</th>
|
||||
<th class="text-right" title="Im gewählten Monat abgerechnete Kundenabo-Punkte">Abgerechnet (Punkte)</th>
|
||||
<th class="text-right" title="Punkte der heute aktiven Kundenabos pro Lieferung">Bestand/Lieferung</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($topCustomerAbos['by_points'] as $row)
|
||||
<tr>
|
||||
<td class="align-middle font-weight-bold">{{ $loop->iteration }}.</td>
|
||||
<td>
|
||||
<div class="font-weight-semibold">
|
||||
{{ $row['name'] }}
|
||||
@if (!empty($row['is_self']))
|
||||
<span class="badge badge-pill badge-info ml-1">ich</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="text-muted small">{{ !empty($row['is_self']) ? 'Eigene Kundenabos' : 'Linie '.$row['line'] }} · {{ $row['career_level'] }}</div>
|
||||
</td>
|
||||
<td class="text-right align-middle">
|
||||
<span class="badge badge-pill badge-outline-default backoffice-statistics-click-badge">
|
||||
{{ number_format((float) ($row['abo_count'] ?? 0), 0, ',', '.') }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-right align-middle font-weight-bold">
|
||||
{{ \App\Services\Util::formatNumber($row['points_actual']) }}
|
||||
</td>
|
||||
<td class="text-right align-middle">
|
||||
{{ \App\Services\Util::formatNumber($row['points_target']) }}
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue