create(['name' => 'Admin', 'email' => 'stats-admin-cust-matrix@example.com', 'roles' => ['admin']]); $clientA = User::query()->create(['name' => 'Klient A', 'email' => 'stats-matrix-client-a@example.com', 'roles' => ['client']]); $clientB = User::query()->create(['name' => 'Klient B', 'email' => 'stats-matrix-client-b@example.com', 'roles' => ['client']]); $it = Category::query()->create(['name' => 'IT-Pomoc']); $vpn = $it->subcategories()->create(['name' => 'VPN']); $printers = $it->subcategories()->create(['name' => 'Drukarki']); makeTicket(['number' => '9001', 'customer_id' => $clientA->id, 'subcategory_id' => $vpn->id]); makeTicket(['number' => '9002', 'customer_id' => $clientA->id, 'subcategory_id' => $vpn->id]); makeTicket(['number' => '9003', 'customer_id' => $clientA->id, 'subcategory_id' => $printers->id]); makeTicket(['number' => '9004', 'customer_id' => $clientB->id, 'subcategory_id' => $printers->id]); makeTicket(['number' => '9005', 'customer_id' => null, 'subcategory_id' => $vpn->id]); $matrix = Livewire::actingAs($admin)->test(Stats::class)->instance()->customerSubcategoryMatrix; expect($matrix['columns'])->toBe(['IT-Pomoc / VPN', 'IT-Pomoc / Drukarki']) ->and($matrix['hasOther'])->toBeFalse(); $rowsByLabel = collect($matrix['rows'])->keyBy('label'); expect($rowsByLabel['Klient A'])->toBe(['label' => 'Klient A', 'cells' => [2, 1], 'other' => null, 'total' => 3]) ->and($rowsByLabel['Klient B'])->toBe(['label' => 'Klient B', 'cells' => [0, 1], 'other' => null, 'total' => 1]); }); test('customerSubcategoryMatrix caps rows at top 10 clients and columns at top 5 subcategories, folding the rest into "Inne"', function () { seedStatusesAndPriorities(); $admin = User::query()->create(['name' => 'Admin', 'email' => 'stats-admin-cust-matrix-2@example.com', 'roles' => ['admin']]); $client = User::query()->create(['name' => 'Klient', 'email' => 'stats-matrix-client-c@example.com', 'roles' => ['client']]); $category = Category::query()->create(['name' => 'Kategoria']); $ticketNumber = 9100; foreach (range(1, 7) as $i) { $sub = $category->subcategories()->create(['name' => "Sub {$i}"]); // Distinct volumes (7 down to 1) so which 5 make the cut is deterministic. foreach (range(1, 8 - $i) as $n) { makeTicket(['number' => (string) $ticketNumber++, 'customer_id' => $client->id, 'subcategory_id' => $sub->id]); } } $matrix = Livewire::actingAs($admin)->test(Stats::class)->instance()->customerSubcategoryMatrix; expect($matrix['columns'])->toBe(['Kategoria / Sub 1', 'Kategoria / Sub 2', 'Kategoria / Sub 3', 'Kategoria / Sub 4', 'Kategoria / Sub 5']) ->and($matrix['hasOther'])->toBeTrue(); $row = $matrix['rows'][0]; expect($row['cells'])->toBe([7, 6, 5, 4, 3]) ->and($row['other'])->toBe(2 + 1) ->and($row['total'])->toBe(7 + 6 + 5 + 4 + 3 + 2 + 1); }); test('customerSubcategoryMatrix caps rows at the top 10 clients by volume', function () { seedStatusesAndPriorities(); $admin = User::query()->create(['name' => 'Admin', 'email' => 'stats-admin-cust-matrix-3@example.com', 'roles' => ['admin']]); $category = Category::query()->create(['name' => 'Kategoria']); $sub = $category->subcategories()->create(['name' => 'Sub']); $ticketNumber = 9200; foreach (range(1, 12) as $i) { $client = User::query()->create(['name' => "Klient {$i}", 'email' => "stats-matrix-client-{$i}@example.com", 'roles' => ['client']]); foreach (range(1, 13 - $i) as $n) { makeTicket(['number' => (string) $ticketNumber++, 'customer_id' => $client->id, 'subcategory_id' => $sub->id]); } } $matrix = Livewire::actingAs($admin)->test(Stats::class)->instance()->customerSubcategoryMatrix; expect($matrix['rows'])->toHaveCount(10) ->and($matrix['rows'][0]['label'])->toBe('Klient 1') ->and($matrix['rows'][0]['total'])->toBe(12); });