Team-Statistik: Neu-Badge-Link kannte $selectedTree nicht (ViewException auf Produktion)

Die Closure fuer den Link des gruenen "+N"-Badges band die neue Variable nicht per use ein;
sobald eine Linie neue Abos zaehlte, brach die Uebersicht mit "Undefined variable $selectedTree" ab.
Regressionstest rendert die Uebersicht mit einem neuen Teamabo und prueft den Badge-Link.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-14 15:40:22 +00:00
parent 96545364f1
commit 44637d06a7
3 changed files with 52 additions and 2 deletions

View file

@ -99,3 +99,19 @@ eine Differenz von 82 Punkten — genau der Drift-User dieses Monats.
Nicht in diesem Commit und weiterhin nicht committet: die Arbeit aus anderen Themen im selben
Arbeitsbaum (DHL, DATEV, Newsletter-Listen, Berater-Übertragung, DSGVO-Löschung, `shipped_at`,
Kundenabo-Legenden).
---
## Nachtrag 14.09.2026 — Übersicht brach mit „Undefined variable $selectedTree" ab
Kurz nach dem Deploy meldete Produktion auf `/user/backoffice/statistics` eine ViewException. Die
Link-Closure für das grüne „+N"-Badge (neue Abos im Monat) in `index.blade.php` band die neue
Variable `$selectedTree` nicht per `use` ein. Der Fehler trat nur auf, wenn in einer Linie neue Abos
gezählt wurden — die Tests hatten die Übersicht bis dahin nie mit gefüllten Zeilen gerendert.
**Behebung:** `use (..., $selectedTree)` an der Closure, dazu ein Regressionstest, der die Übersicht
mit einem neuen Teamabo rendert und den Badge-Link samt `tree=`-Parameter prüft
(`BackofficeStatisticsDrilldownTest`). Ohne den Fix schlägt er mit genau dieser Meldung fehl.
**Deployment:** nur `resources/views/user/backoffice/statistics/index.blade.php`, danach
`php artisan view:clear`. Keine Migration, keine Daten.

View file

@ -115,14 +115,14 @@
// 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 {
$newBadgeLink = function (int $lineNo, string $metric) use ($selectedMonth, $selectedYear, $selectedTree): string {
if ($metric === 'consultants') {
return route('user_backoffice_statistics_details', [
'line' => $lineNo,
'metric' => 'new_partners',
'month' => $selectedMonth,
'year' => $selectedYear,
'tree' => $selectedTree,
'tree' => $selectedTree,
]);
}

View file

@ -8,6 +8,7 @@ use App\Models\UserSalesVolume;
use App\Services\Abo\TeamAboOverviewService;
use App\Services\Backoffice\BackofficeDashboardService;
use App\Services\Backoffice\BackofficeDrilldownService;
use App\Services\HTMLHelper;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\URL;
@ -337,3 +338,36 @@ it('haengt die Sortierwerte an die Zellen der Drilldown-Tabelle (A14)', function
->toContain('data-sort-value="2026-12-10"')
->toContain('data-sort-value="20"');
});
it('rendert die Uebersicht mit dem Neu-Badge samt Baum-Parameter (Regression: Closure ohne $selectedTree)', function (): void {
URL::resolveMissingNamedRoutesUsing(fn (string $name, $parameters = []) => '/'.$name.'?'.http_build_query($parameters));
$root = boMakeUser();
$anna = boMakeUser($root->id, '2026-03-15');
boMakeAbo($anna->id, 'me', '2026-06-10', 20);
$this->actingAs($root);
$statistics = app(BackofficeDashboardService::class)->overview($root, 6, 2026);
expect($statistics['totals']['team_partner_abos_new'])->toBe(1);
// Das gruene "+1"-Badge wird nur gerendert, wenn es neue Abos gibt — erst dann
// laeuft die Link-Closure, die auf Produktion mit "Undefined variable
// $selectedTree" abbrach (14.09.2026).
$html = view('user.backoffice.statistics.index', [
'selectedMonth' => 6,
'selectedYear' => 2026,
'selectedTree' => BackofficeDashboardService::TREE_COMMISSION,
'treeLabels' => BackofficeDashboardService::treeLabels(),
'filterMonths' => HTMLHelper::getTransMonths(),
'filterYears' => HTMLHelper::getYearRange(2022),
'statistics' => $statistics,
'performance' => ['duration_ms' => 1.0, 'source' => 'live', 'source_label' => 'Live', 'calculated_at' => null],
'commission' => null,
])->render();
expect($html)
->toContain('backoffice-statistics-click-badge')
->toContain('only_new=1')
->toContain('tree=commission');
});