- E-mail intake (IMAP), optional and off by default: clients can create a
ticket or reply to an existing one just by sending/replying to an e-mail.
Configure any number of mailboxes in the new Admin > Poczta page (SMTP +
IMAP together, replacing the old "E-MAIL" tab), each routed to a specific
subcategory or a whole category (new tickets.category_id column). Replies
are matched to their ticket via the number/checksum already in every
notification subject; autoresponders/bounces are detected and rejected;
"restrict tickets to LDAP" is enforced for e-mail like the guest web form.
Manual "Pobierz teraz" per-mailbox fetch button; dedicated
storage/logs/imap-*.log regardless of the app's log level; mail-icon badges
on e-mail-originated tickets/messages in the operator queue and ticket view.
- Operator queue: "select all" checkbox in the table header for every
currently visible ticket under the active filter/tab.
- Fixed: scheduled commands (SLA breach check, automation rules, and now IMAP
fetch) always sent notifications through .env's default mailer instead of
the configured SMTP server, because AppServiceProvider's Settings override
used to skip itself for any console command, not just migrate.
- Fixed: visiting a ticket that no longer exists (deleted mid-session, or a
stale background refresh) showed a raw 404 instead of redirecting back to
the operator queue / client dashboard.
- Docs: README/ARCHITECTURE/CLAUDE/install/wiki updated for all of the above,
including the previously-missing host crontab entry for schedule:run.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Triggers (Admin > Wyzwalacze): event-driven rules that fire immediately on
a ticket lifecycle event (created/updated/status/priority/assignee/team/
category changed, new reply), with AND-conditions and ordered actions
(set status/priority/team/assignee, send e-mail). Ships its own dedicated,
freely add/edit/delete-able e-mail templates, kept separate from the fixed
system templates.
- Ticket watching: operators can star/"Obserwuj" any ticket to follow it
regardless of assignment/team.
- Real-time notification bell (private per-user broadcast channel, 30s
fallback poll) with an opt-in in-tab browser push notification.
- Per-user notification preferences (/settings/notifications): scope
(mine/unassigned/watched/all) and e-mail toggle per event category.
- Admin > Integracje: new tab for LDAP/AD + BookStack config, split out of
Konfiguracja.
- Operator queue: Podkategoria/Zespół/Utworzono columns (off by default).
- Obserwuj button moved next to the auto-refresh countdown; trigger
condition builder shows subcategory/zgłaszający as name dropdowns instead
of raw IDs; /settings/notifications got a back link, full-width push
card, and a bordered table container; admin panel tab and operator queue
view now persist across a plain page refresh.
- Docs: README/ARCHITECTURE/wiki updated for all of the above.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Real-time updates (Laravel Reverb): live operator queue, live ticket
chat/detail updates for operator and client, periodic fallback refresh
with a visible countdown as a backstop for dropped websocket connections.
- SLA automation rules (Admin > Automatyzacja SLA): act on a ticket after
N minutes of customer silence (change priority/status/team/assignee),
evaluated every 15 minutes, reusing TicketService's own setters so
automated changes get the same history/notification/broadcast a manual
change would.
- New notification: every operator on a matching team gets notified when
a new ticket lands in one of their subcategories.
- BookStack knowledge-base sidebar now also shown on the client's own
ticket view (previously operator-only); suggestions everywhere now load
in after first paint instead of blocking it.
- Client ticket view: shows assigned operator + team; page widened to
match the operator's.
- Notification bell shows unread only; read notifications disappear
instead of just dimming.
- Stats dashboard: sectioned layout, new breakdowns (by subcategory, CSAT
by team/operator, top clients, client x subcategory cross-tab).
- Mobile: nav dropdowns (theme/notifications/profile) now expand full
width instead of overflowing off-screen below 640px.
- Fixed two bugs that silently disabled all real-time updates (missing
CSRF header on Echo's private-channel auth; a script-load-order race
that could miss the livewire:init event) and the mariadb healthcheck
(world-writable credentials file on this stack's NFS mount).
- Assorted test-suite fixes (roles virtual attribute needs the roles
table seeded; a few missing seeds/wrong assertions found along the way).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 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>
- Fix CI registry login (unauthorized): use dedicated REGISTRY_TOKEN secret
instead of GITHUB_TOKEN, fail fast with a clear error if it's unset.
- Pause ticket work-timer while a ticket is closed (won't auto-start on open
or manual resume; stops on close via status change, quick action, API, or
merge).
- Reject empty/blank login submissions client- and server-side instead of
passing them straight to the auth provider.
- Closing a ticket now sends only the "ticket closed" notification instead
of also sending a duplicate "status changed" one.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Documentation overhaul (TESTING/CONTRIBUTING/ARCHITECTURE/SECURITY/CLAUDE.md,
CHANGELOG.md, drop unmaintained src/README.md) plus CI-built Docker images:
Gitea Actions now builds and pushes the servicedesk image to the Gitea
container registry on Dockerfile changes, and compose.yaml pulls that image
instead of building locally. No application behavior changes.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>