- In-app notifications: a bell in the top bar backed by Laravel's database
  notification channel, alongside existing e-mail notifications (same
  per-trigger toggle drives both; ticket links now correctly point into the
  recipient's own area instead of always linking to the client view).
- Drag-and-drop attachments on every upload form, plus inline image
  thumbnails in the message thread instead of a plain download link.
- Customer satisfaction (CSAT) rating: clients rate a closed ticket 1-5 stars
  with an optional comment; shown read-only to operators, surfaced as a KPI
  on the stats dashboard, and linked from the "ticket closed" e-mail.
- Saved queue views: operators can save/apply/delete named filter+sort+
  column presets in the ticket queue and mark one as their default.
- Full-text search (MySQL FULLTEXT, portable LIKE fallback) across ticket
  subject/body and reply message bodies, now also on the client's own ticket
  list.
- Stats CSV export for the currently filtered ticket set.
- Optional BookStack knowledge-base integration (off by default): suggests
  articles by category/subcategory while creating a ticket and in a separate
  sidebar for operators on an existing ticket (with a copy-link button).
  Configurable connection/SSL bypass/search-type filter, plus two
  independent per-shelf allow-lists so nothing is ever searched until an
  admin opts specific shelves in.
- Closed tickets no longer show in "Moje zgłoszenia"/"Nieprzypisane"/team
  queue tabs, only under "Zamknięte" (matching how "Otwarte" already worked).
- Wired up the Admin > About "Wersja" field to config('app.version')/VERSION
  in .env instead of a stale hardcoded string.
- Fixed: TicketService::setStatus() now checks a status's stage rather than
  the literal key 'closed' to decide whether to fire the "ticket closed"
  notification/stop the timer.
- Updated README/ARCHITECTURE/CHANGELOG/install/SECURITY docs and all three
  wiki/ role guides for the above; documented a root-vs-www-data file
  ownership gotcha in CLAUDE.md (running artisan commands via a plain
  `docker exec` can leave root-owned Blade cache files that later break
  recompilation for the www-data Apache process).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 15:18:09 +02:00
parent 4e8f17189a
commit 90fae0a4de
49 changed files with 1649 additions and 79 deletions

View File

@@ -85,7 +85,9 @@ więcej informacji”, „Restart usuwa problem”.
prostu wyłącza wysyłkę tego powiadomienia, dopóki ktoś nie wybierze nowego.
„Zmiana statusu” i „zgłoszenie zamknięte” się wzajemnie wykluczają dla tej
samej zmiany — zamknięcie zgłoszenia wysyła wyłącznie powiadomienie
„zgłoszenie zamknięte”, żeby nie dublować maila.
„zgłoszenie zamknięte”, żeby nie dublować maila. **Ten sam przełącznik
kontroluje zarówno e-mail, jak i powiadomienie w dzwoneczku w aplikacji** —
nie ma osobnego ustawienia dla powiadomień w apce.
## Wygląd / Branding
@@ -110,6 +112,30 @@ ważne + treść HTML).
> `changeme-*-password`) — koniecznie podmień je na rzeczywiste dane przed
> oddaniem systemu do użytku.
- **Baza wiedzy BookStack** — opcjonalna integracja, **domyślnie wyłączona**.
Po włączeniu:
- **Adres instancji, Token ID, Token Secret** — token API generuje się w
BookStacku: Profil → Ustawienia API. Rola/użytkownik właściciela tokenu
musi mieć w BookStacku uprawnienie **„Access System API”**, inaczej
zapytania kończą się błędem 403 mimo poprawnych danych logowania.
- **Weryfikuj certyfikat SSL** — włączone domyślnie; wyłącz tylko jeśli
instancja BookStack korzysta z certyfikatu self-signed/prywatnego CA.
- **Przeszukuj** — strony i książki / tylko strony / tylko książki.
- **Dozwolone półki** — dwie **niezależne** checklisty: jedna dla podpowiedzi
przy tworzeniu zgłoszenia (klient, operator, formularz gościa na stronie
głównej), druga dla panelu bocznego operatora na widoku istniejącego
zgłoszenia. **Dopóki żadna półka nie jest zaznaczona w danej liście,
wyszukiwanie w tym kontekście nic nie zwraca** — trzeba świadomie
wskazać, które półki wolno przeszukiwać. Przycisk **„Odśwież listę
półek”** wymusza ponowne pobranie listy z BookStacka (inaczej może się
odświeżyć samoistnie po do 30 minutach po zmianie w BookStacku).
- **Pokazuj podpowiedzi także niezalogowanym** — domyślnie wyłączone; bez
zaznaczenia podpowiedzi przy tworzeniu zgłoszenia widzą tylko zalogowani
klienci/operatorzy, nie formularz gościa na stronie głównej.
- Przycisk **„Testuj połączenie”** sprawdza niezapisane wartości formularza
(analogicznie do LDAP/SMTP) i pokazuje dokładny komunikat błędu z
BookStacka, jeśli połączenie się nie powiedzie.
## API
Panel `/admin/api-docs` udostępnia interaktywną dokumentację (Swagger) REST API

View File

@@ -14,10 +14,15 @@ profilu w prawym górnym rogu).
mogą pojawić się dodatkowe pola (np. numer inwentarzowy sprzętu, kwota,
data potrzebna, zgoda przełożonego) — administrator skonfigurował je specjalnie
dla tej podkategorii.
4. Opcjonalnie dodaj **załączniki** (limit rozmiaru/liczby/plików ustala admin —
4. Opcjonalnie dodaj **załączniki** — przeciągnij pliki na pole załączników albo
kliknij, żeby wybrać je z dysku (limit rozmiaru/liczby/plików ustala admin —
komunikat o błędzie poinformuje, jeśli coś przekracza limit).
5. Wyślij zgłoszenie. Otrzymasz e-mail potwierdzający (jeśli powiadomienia są
włączone) z linkiem do podglądu.
5. Jeśli administrator włączył podpowiedzi z bazy wiedzy, przy wyborze
kategorii/podkategorii może pojawić się lista pasujących artykułów — warto
je sprawdzić, zanim wyślesz zgłoszenie.
6. Wyślij zgłoszenie. Otrzymasz e-mail potwierdzający (jeśli powiadomienia są
włączone) z linkiem do podglądu, oraz — jeśli jesteś zalogowany — powiadomienie
w dzwoneczku w górnym pasku.
Zgłoszenie można też wysłać **bez logowania** ze strony głównej — wystarczy podać
e-mail; konto zostanie założone automatycznie (jeśli administrator włączył
@@ -31,11 +36,14 @@ Dashboard klienta dzieli zgłoszenia na dwie zakładki:
- **Bieżące** — zgłoszenia jeszcze nie zamknięte.
- **Archiwum** — zgłoszenia zamknięte.
Pole wyszukiwania nad listą przeszukuje numer, temat i treść zgłoszenia (oraz
odpowiedzi w wątku).
Otwórz dowolne zgłoszenie, by zobaczyć:
- aktualny **status** i **priorytet**,
- pełną **historię wiadomości** (Twoje i operatora — notatki wewnętrzne operatora
nie są widoczne dla klienta),
nie są widoczne dla klienta); załączone obrazy pokazują się jako miniatury,
- **SLA** — orientacyjny czas do rozwiązania wg priorytetu sprawy.
## Odpowiadanie
@@ -43,7 +51,14 @@ Otwórz dowolne zgłoszenie, by zobaczyć:
W widoku zgłoszenia można dopisać kolejną wiadomość w dowolnym momencie (np. dodać
brakujące informacje albo potwierdzić rozwiązanie) — operator zobaczy ją i, jeśli
powiadomienia są włączone, dostaniesz e-mail przy każdej zmianie statusu lub nowej
odpowiedzi operatora.
odpowiedzi operatora oraz powiadomienie w dzwoneczku w górnym pasku (kliknięcie
przenosi od razu do zgłoszenia).
## Ocena obsługi
Po zamknięciu zgłoszenia w panelu bocznym pojawia się prośba o ocenę (15 gwiazdek
+ opcjonalny komentarz) — jednorazowa, bez możliwości zmiany po wysłaniu. Mail o
zamknięciu zgłoszenia zawiera też bezpośredni link do oceny.
## Najczęstsze pytania

View File

@@ -1,29 +1,37 @@
# Przewodnik — Operator
Panel operatora (`/operator`) to miejsce pracy z kolejką zgłoszeń: przegląd,
odpowiadanie, zmiana statusu/priorytetu/przypisania oraz — nowość — statystyki
zespołu.
odpowiadanie, zmiana statusu/priorytetu/przypisania oraz statystyki zespołu.
Domyślnie każde konto ląduje po zalogowaniu w panelu Klienta; przełącz się do
panelu Operatora przez menu profilu (prawy górny róg), jeśli konto ma tę rolę.
Dzwoneczek powiadomień w górnym pasku (widoczny we wszystkich panelach) pokazuje
zdarzenia na Twoich zgłoszeniach na bieżąco, bez odświeżania strony.
## Kolejka zgłoszeń
Panel główny (`/operator`) pokazuje listę zgłoszeń z zakładkami po lewej stronie:
- **Otwarte** — wszystkie zgłoszenia jeszcze nie zamknięte, widoczne dla Ciebie.
- **Moje zgłoszenia** — przypisane do Ciebie.
- **Nieprzypisane** — czekają na przejęcie przez kogoś z zespołu.
- **Zamknięte** — archiwum.
- **Moje zgłoszenia** — przypisane do Ciebie (bez zamkniętych).
- **Nieprzypisane** — czekają na przejęcie przez kogoś z zespołu (bez zamkniętych).
- **Zamknięte** — archiwum; jedyna zakładka, w której pojawiają się zamknięte
zgłoszenia.
- **Zespoły** — osobna zakładka na każdy zespół, do którego należysz (administrator
widzi wszystkie zespoły).
widzi wszystkie zespoły; też bez zamkniętych).
Nie-administratorzy widzą tylko zgłoszenia swoich zespołów, zgłoszenia bez
przypisanego zespołu, oraz wszystko przypisane bezpośrednio do nich.
**Filtry** nad tabelą: status, priorytet, kategoria, wyszukiwanie po numerze/
temacie/kliencie. **Kolumny** można dowolnie włączać/wyłączać przyciskiem
„Kolumny”, a nagłówki kolumn sortują listę.
temacie/kliencie/treści zgłoszenia i odpowiedzi w wątku. **Kolumny** można dowolnie
włączać/wyłączać przyciskiem „Kolumny”, a nagłówki kolumn sortują listę.
**Zapisane widoki** — przycisk „Zapisane widoki” pozwala zapisać bieżącą
kombinację zakładki/filtrów/sortowania/kolumn pod własną nazwą, oznaczyć jeden z
zapisanych widoków jako domyślny (ładuje się automatycznie przy wejściu do
kolejki) i usuwać niepotrzebne. Widoki są prywatne — każdy operator widzi tylko
swoje.
**Akcje zbiorcze**: zaznacz kilka zgłoszeń checkboxami, by je **scalić** (pierwsze
zaznaczone staje się główne, reszta trafia do niego jako wiadomości i zostaje
@@ -40,8 +48,15 @@ W widoku pojedynczego zgłoszenia:
jedną **szybką akcją** (np. „Wyślij i zamknij”) zamiast dwóch osobnych kroków.
- **Notatka wewnętrzna** — widoczna tylko dla operatorów/adminów, np. do
przekazania kontekstu innemu operatorowi.
- **Załączniki** — do odpowiedzi/notatki, w granicach limitów ustawionych przez
administratora.
- **Załączniki** — do odpowiedzi/notatki, przeciągnij pliki na pole załączników
albo kliknij, żeby wybrać je z dysku, w granicach limitów ustawionych przez
administratora; załączone obrazy pokazują się jako miniatury w wątku.
- **Baza wiedzy** (jeśli administrator włączył integrację z BookStack) — panel
boczny podpowiada artykuły pasujące do kategorii/podkategorii zgłoszenia;
kliknięcie otwiera artykuł, przycisk „Kopiuj link" kopiuje adres bez
wychodzenia ze zgłoszenia (np. do wklejenia w odpowiedzi).
- **Ocena obsługi** — jeśli klient już ocenił zgłoszenie, ocena (gwiazdki +
ewentualny komentarz) pokazuje się w panelu bocznym, tylko do odczytu.
- **Licznik czasu pracy** — start/stop/reset przy zgłoszeniu; czas zapisuje się
automatycznie nawet przy zamknięciu karty (mechanizm `sendBeacon`). Zliczanie
jest automatycznie wstrzymywane, gdy zgłoszenie ma status zamknięty — nie
@@ -74,6 +89,10 @@ zmianie filtra, bez przeładowania strony.
| Śr. czas 1. odpowiedzi | średni czas od utworzenia do pierwszej odpowiedzi operatora |
| Śr. czas rozwiązania | średni czas od utworzenia do zamknięcia (przybliżony — brak osobnej daty "rozwiązano", liczony do ostatniej aktualizacji zamkniętego zgłoszenia) |
| Naruszenia SLA | % zgłoszeń, które przekroczyły czas rozwiązania wg priorytetu (zgodnie z regułami SLA w Admin > Statusy/Priorytety) |
| Ocena obsługi (CSAT) | średnia ocen klientów (15) w wybranym zakresie/filtrach + % zamkniętych zgłoszeń, które zostały ocenione |
Przycisk **„Eksportuj CSV"** pobiera listę zgłoszeń (jeden wiersz na zgłoszenie) z
uwzględnieniem aktualnie wybranego zakresu dat i filtrów.
**Wykresy** (paski poziome, kolor = ta sama identyfikacja co w kolejce dla statusu/
priorytetu; najedź kursorem na pasek, by zobaczyć dokładną wartość):