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
|
|
@ -57,8 +57,12 @@ class AboController extends Controller
|
|||
}
|
||||
|
||||
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
|
||||
// Gekündigte/beendete Abos (Status 4/5) zählen nicht mehr als "mein Abo" —
|
||||
// nach einer Kündigung muss das Portal wieder die Neuanlage anbieten (Ein-Abo-Regel, A2).
|
||||
$user_abo = UserAbo::where('email', $shopping_user->billing_email)
|
||||
->where('status', '>=', 1)
|
||||
->whereNotIn('status', AboHelper::ENDED_STATUSES)
|
||||
->orderByDesc('id')
|
||||
->first();
|
||||
|
||||
if (! $user_abo) {
|
||||
|
|
@ -110,6 +114,7 @@ class AboController extends Controller
|
|||
if ($data['action'] === 'abo_update_settings') {
|
||||
$user_abo = UserAbo::findOrFail($data['id']);
|
||||
$this->checkPortalPermission($user_abo);
|
||||
$data['view'] = 'portal';
|
||||
$aboRepository = new AboRepository;
|
||||
$aboRepository->setModel($user_abo);
|
||||
$aboRepository->update($data);
|
||||
|
|
@ -243,6 +248,7 @@ class AboController extends Controller
|
|||
'summary' => $summary,
|
||||
'add_only_mode' => $isAddOnlyMode,
|
||||
'change_locked' => $changeLocked,
|
||||
'portal_view' => true,
|
||||
])->render();
|
||||
$html_comp = view('user.order.comp_product', array_merge($data, [
|
||||
'cart_instance' => AboOrderCart::INSTANCE,
|
||||
|
|
@ -250,6 +256,7 @@ class AboController extends Controller
|
|||
]))->render();
|
||||
$html_summary = view('admin.abo._order_combined_summary', [
|
||||
'summary' => $summary,
|
||||
'portal_view' => true,
|
||||
])->render();
|
||||
|
||||
$amount = $user_abo->getFormattedAmount();
|
||||
|
|
@ -409,9 +416,11 @@ class AboController extends Controller
|
|||
'only_show_products' => false,
|
||||
'add_only_mode' => $isAddOnlyMode,
|
||||
'change_locked' => $changeLocked,
|
||||
'portal_view' => true,
|
||||
])->render(),
|
||||
'html_summary' => view('admin.abo._order_combined_summary', [
|
||||
'summary' => $summary,
|
||||
'portal_view' => true,
|
||||
])->render(),
|
||||
'html_comp' => view('user.order.comp_product', [
|
||||
'comp_products' => [],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue