Co nowego: - Podgląd logów w panelu admina (Admin > Logi) — pliki storage/logs/*.log bez potrzeby dostępu do kontenera, z filtrami poziomu/tekstu/liczby wpisów i auto-odświeżaniem. - Filtr „Bez kategorii” w kolejce operatora — izoluje zgłoszenia bez przypisanej kategorii/podkategorii. - Narzędzie importu z Heska: już nie tworzy automatycznie kont klientów dla nieznanych e-maili (pomija takie zgłoszenia zamiast zakładać konto), łączy odpowiedzi/właścicieli zgłoszeń z realnymi kontami operatorów po e-mailu, nowe flagi --assign-operators i --fix-closed-dates do donaprawiania wcześniejszych importów, dedykowany log storage/logs/hesk-import.log. - Poprawka: pulpit statystyk operatora (rozkład wg kategorii/podkategorii i filtr kategorii) pomijał zgłoszenia przypisane do samej kategorii bez podkategorii (np. z poczty IMAP) — teraz liczone poprawnie. - Poprawka: błąd JS i zawieszone w tle liczniki przy nawigacji z widoku z aktywnym licznikiem (najbardziej odczuwalne w liczniku czasu pracy operatora). - Porządki w bazie: usunięte niewykorzystywane kolumny (users.remember_token, users.email_verified_at, email_templates.trigger_label); wartości pól dodatkowych, stan triage/podsumowania AI i powiązany sprzęt Snipe-IT przeniesione z tabeli tickets do osobnych tabel (ticket_field_values, ticket_ai_summaries, ticket_snipeit_assets) — bez zmiany zachowania, ale pola dodatkowe są teraz efektywnie przeszukiwalne; dodane brakujące indeksy na 4 tabelach pivot; tickets.source/ticket_messages.source walidowane względem znanego zestawu wartości. Zaktualizowana dokumentacja: README, CLAUDE.md, ARCHITECTURE.md, CHANGELOG.md, wiki/admin, wiki/operator. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
50 lines
2.5 KiB
PHP
50 lines
2.5 KiB
PHP
<?php
|
|
|
|
use App\Livewire\Operator\Stats;
|
|
use App\Models\Category;
|
|
use App\Models\User;
|
|
use Livewire\Livewire;
|
|
|
|
test('bySubcategory groups tickets per subcategory, labeled "Category / Subcategory"', function () {
|
|
seedStatusesAndPriorities();
|
|
$admin = User::query()->create(['name' => 'Admin', 'email' => 'stats-admin-sub@example.com', 'roles' => ['admin']]);
|
|
|
|
$it = Category::query()->create(['name' => 'IT-Pomoc']);
|
|
$vpn = $it->subcategories()->create(['name' => 'VPN']);
|
|
$printers = $it->subcategories()->create(['name' => 'Drukarki']);
|
|
$orders = Category::query()->create(['name' => 'Zamówienia']);
|
|
$hardware = $orders->subcategories()->create(['name' => 'Sprzęt']);
|
|
|
|
makeTicket(['number' => '4001', 'subcategory_id' => $vpn->id]);
|
|
makeTicket(['number' => '4002', 'subcategory_id' => $vpn->id]);
|
|
makeTicket(['number' => '4003', 'subcategory_id' => $printers->id]);
|
|
makeTicket(['number' => '4004', 'subcategory_id' => $hardware->id]);
|
|
makeTicket(['number' => '4005', 'subcategory_id' => null]);
|
|
|
|
$rows = Livewire::actingAs($admin)->test(Stats::class)->instance()->bySubcategory;
|
|
|
|
expect($rows->firstWhere('label', 'IT-Pomoc / VPN'))->toBe(['label' => 'IT-Pomoc / VPN', 'count' => 2])
|
|
->and($rows->firstWhere('label', 'IT-Pomoc / Drukarki'))->toBe(['label' => 'IT-Pomoc / Drukarki', 'count' => 1])
|
|
->and($rows->firstWhere('label', 'Zamówienia / Sprzęt'))->toBe(['label' => 'Zamówienia / Sprzęt', 'count' => 1])
|
|
->and($rows->count())->toBe(3);
|
|
});
|
|
|
|
test('bySubcategory gives tickets routed to a bare category (no subcategory) their own "(bez podkategorii)" row', function () {
|
|
seedStatusesAndPriorities();
|
|
$admin = User::query()->create(['name' => 'Admin', 'email' => 'stats-admin-sub-2@example.com', 'roles' => ['admin']]);
|
|
|
|
$it = Category::query()->create(['name' => 'IT-Pomoc']);
|
|
$vpn = $it->subcategories()->create(['name' => 'VPN']);
|
|
$delegacje = Category::query()->create(['name' => 'Delegacje']);
|
|
|
|
makeTicket(['number' => '4101', 'subcategory_id' => $vpn->id]);
|
|
makeTicket(['number' => '4102', 'category_id' => $delegacje->id]);
|
|
makeTicket(['number' => '4103', 'category_id' => $delegacje->id]);
|
|
|
|
$rows = Livewire::actingAs($admin)->test(Stats::class)->instance()->bySubcategory;
|
|
|
|
expect($rows->firstWhere('label', 'IT-Pomoc / VPN'))->toBe(['label' => 'IT-Pomoc / VPN', 'count' => 1])
|
|
->and($rows->firstWhere('label', 'Delegacje (bez podkategorii)'))->toBe(['label' => 'Delegacje (bez podkategorii)', 'count' => 2])
|
|
->and($rows->count())->toBe(2);
|
|
});
|