diff --git a/dev/2026-07-22/deploy-2026-09-14.md b/dev/2026-07-22/deploy-2026-09-14.md index 5b82cd1f..511be702 100644 --- a/dev/2026-07-22/deploy-2026-09-14.md +++ b/dev/2026-07-22/deploy-2026-09-14.md @@ -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. diff --git a/resources/views/user/backoffice/statistics/index.blade.php b/resources/views/user/backoffice/statistics/index.blade.php index aae83ec0..76ea0455 100644 --- a/resources/views/user/backoffice/statistics/index.blade.php +++ b/resources/views/user/backoffice/statistics/index.blade.php @@ -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, ]); } diff --git a/tests/Feature/BackofficeStatisticsDrilldownTest.php b/tests/Feature/BackofficeStatisticsDrilldownTest.php index e98e3fa5..cb4136b6 100644 --- a/tests/Feature/BackofficeStatisticsDrilldownTest.php +++ b/tests/Feature/BackofficeStatisticsDrilldownTest.php @@ -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'); +});