Firstlines: Seite und Dashboard-Kachel zaehlen wieder dieselbe Menge

Beim Formulieren der Kundenrueckmeldung aufgefallen: der vorige Commit hat die
Inkonsistenz an einer Stelle behoben und an einer anderen wieder eingebaut. Die
Kachel zaehlt ueber isActiveConsultant() (Mitgliedsebene + gesetztes
Abrechnungskonto), die Kopfzeile der Firstlines-Seite zaehlte aber ueber
isActiveAccount() (Konto in der Zukunft). Bei abgelaufenen Jahresgebuehren nannten
Kachel und Seite damit unterschiedliche Zahlen - genau das, was der Fix vermeiden
sollte.

firstlines() bekommt den BackofficeDashboardService injiziert und nutzt dieselbe
Regel. Test um beide Randfaelle erweitert (abgelaufenes vs. gar kein
Abrechnungskonto), damit die Doppel-Definition nicht zurueckkommt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-08-25 10:47:50 +00:00
parent 640a05945b
commit 98a1dbc0cd
6 changed files with 168 additions and 11 deletions

View file

@ -185,4 +185,13 @@ it('ordnet akkumulierte Abo-Punkte dem Neuabo ueber user_abo_id zu (Replikat-Sho
expect($aboRow)->not->toBeNull()
->and($aboRow['id'])->toBe($newAbo->id)
->and(array_sum($aboRow['monthly']))->toBe(42);
// Aktives Abo: Label ist die Kunden-E-Mail
expect($aboRow['label'])->toBe($userAbo->email);
// Geloeschtes (ersetztes) Abo: "Abo #<id> (<E-Mail>)", damit die Kundin erkennbar bleibt
$userAbo->delete();
$dataDeleted = IncentiveController::buildParticipantDetailData($participant->fresh(['incentive', 'user']));
expect($dataDeleted['abo_sources']->first()['label'])
->toBe('Abo #'.$userAbo->id.' ('.$userAbo->email.')');
});

View file

@ -3,6 +3,7 @@
use App\Http\Controllers\User\TeamController;
use App\Models\UserAccount;
use App\Models\UserSalesVolume;
use App\Services\Backoffice\BackofficeDashboardService;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Request;
@ -39,10 +40,15 @@ it('listet die Firstlines mit Monats-Gesamtpunkten sortiert und laesst Tiefere a
$ben = tflMakeUser($root->id, ['first_name' => 'Ben', 'last_name' => 'Beta']);
tflMakeUser($anna->id); // Ebene 2: keine Firstline
// Abgelaufenes Abrechnungskonto: bleibt in der Liste (Nachfassen), zaehlt
// aber nicht als aktiver Berater - die Dashboard-Kachel zeigt nur diese.
$inaktiv = tflMakeUser($root->id, ['first_name' => 'Ina', 'last_name' => 'Inaktiv']);
$inaktiv->forceFill(['payment_account' => now()->subMonth()])->save();
// Abgelaufenes, aber gesetztes Abrechnungskonto: bleibt in der Liste (Nachfassen)
// UND zaehlt als Berater - dieselbe Regel wie die Dashboard-Kachel
// (isActiveConsultant), nicht isActiveAccount.
$abgelaufen = tflMakeUser($root->id, ['first_name' => 'Ina', 'last_name' => 'Inaktiv']);
$abgelaufen->forceFill(['payment_account' => now()->subMonth()])->save();
// Ohne Abrechnungskonto: kein Berater
$ohneKonto = tflMakeUser($root->id, ['first_name' => 'Ohne', 'last_name' => 'Konto']);
$ohneKonto->forceFill(['payment_account' => null])->save();
// Eigene (Status 1) + Kundenpunkte (Status 2) zaehlen zusammen
UserSalesVolume::forceCreate(['user_id' => $anna->id, 'month' => 6, 'year' => 2026, 'points' => 100, 'status' => 1]);
@ -54,11 +60,11 @@ it('listet die Firstlines mit Monats-Gesamtpunkten sortiert und laesst Tiefere a
Request::merge(['month' => 6, 'year' => 2026]);
Request::instance()->setLaravelSession(app('session')->driver());
$view = app(TeamController::class)->firstlines();
$view = app(TeamController::class)->firstlines(app(BackofficeDashboardService::class));
$rows = $view->getData()['rows'];
expect($rows)->toHaveCount(3)
->and($view->getData()['activeCount'])->toBe(2) // Kachel-Zahl: nur aktive Berater
expect($rows)->toHaveCount(4)
->and($view->getData()['activeCount'])->toBe(3) // Kachel-Zahl: nur aktive Berater
->and($rows[0]['user_id'])->toBe($ben->id) // 400 Punkte zuerst
->and($rows[0]['total_points'])->toBe(400.0)
->and($rows[1]['user_id'])->toBe($anna->id)
@ -80,7 +86,7 @@ it('zeigt eine leere Firstlines-Liste ohne direkte Teampartner', function (): vo
$this->actingAs($root);
Request::instance()->setLaravelSession(app('session')->driver());
$view = app(TeamController::class)->firstlines();
$view = app(TeamController::class)->firstlines(app(BackofficeDashboardService::class));
expect($view->getData()['rows'])->toBe([])
->and($view->render())->toContain(e(__('team.firstlines_none')));