-
Notifications
You must be signed in to change notification settings - Fork 3
Tickets
Folder: tickets/
Colour: Blue #0078d4
The primary module — an Outlook-style three-panel ticket inbox with email integration, departments, teams, audit trails, AI reply cleanup, drag-and-drop triage, time recording, right-click quick actions, business-hours-aware SLAs, a customisable dashboard, and a staff rota.
📑 SLA Management — business calendars, per-priority response and resolution targets, pause-the-clock statuses, breach notifications, and cron worker setup. Meaty enough to deserve its own wiki page.
-
Left panel — folder tree with a By Department / By Analyst toggle. Choose between grouping tickets by department + status (default) or by assigned analyst + status. The choice is persisted per-analyst via
user_preferencesso each analyst keeps their own view across sessions. The Unassigned folder is contextual: in Department view it lists tickets with no department; in Analyst view it lists tickets with no assignee — making it easy to see what needs picking up. - Middle panel — ticket list, searchable
- Right panel — reading pane with the full email thread, internal notes, attachments, audit trail
- Create tickets (from email or manually), reply / forward emails, attachments, internal notes
- Audit trail of every change (assignee, status, priority, department, owner, etc.)
- Team-based filtering of departments
- Scheduling via
work_start_datetimeand a ticket calendar view
Drag any ticket from the list onto a folder to update it:
- Department view: drop on a department folder to reassign; drop on a department + status subfolder to update both; drop on Unassigned to clear the department.
-
Analyst view: drop on an analyst folder to assign that analyst as owner (sets both
assigned_analyst_idandowner_idso the right-pane Owner field stays in sync); drop on analyst + status to update both; drop on Unassigned to clear the analyst.
Hovering a collapsed folder during a drag auto-expands it (Outlook-style spring-loaded folders) so any nested status is reachable.
Granular per-ticket time logging in the reading pane. Inline form (minutes + optional description) appends entries to a list showing who logged what and when, with a running total at the top. Each entry is soft-deletable but only by the analyst who logged it, so deleted rows stay in the audit history.
- Backdating — the right-click context menu's Record time modal includes a datetime picker, so you can log time you forgot earlier in the day
-
Storage — plain integer minutes (no decimal-hour rounding pain); rendered as
45mor1h 30min the UI - Ownership — your own entries are deletable from the inline list; other analysts' entries are read-only
-
Per-analyst timesheet view — not in the UI yet, but the data is keyed by
analyst_idandentry_datetimeready for one
Backed by the ticket_time_entries table.
Right-click any ticket in the email list to open a fixed-position popover with quick actions. The popover operates on the right-clicked ticket without changing the current reading-pane selection — handy when you're reading ticket A but need to log time or link CMDB objects against ticket B without losing your place.
Two actions for v1:
-
Link CMDB object — opens a search-as-you-type modal hitting
api/cmdb/search_objects.php. Click to link, and a "Recently linked (this session)" footer log shows the running list of confirmations. Multi-link in one sitting without re-opening the modal. - Record time — opens a modal with minutes + description + a datetime picker (defaults to "now"). Useful for backdating.
The popover closes on outside-click, Escape, window blur, or scroll. If the affected ticket happens to be the one currently open in the reading pane, the relevant section there (CMDB objects or time entries) auto-refreshes when the modal closes.
Icon button on the ticket subject row toggles a popout mode where the folder list and email list disappear and the reading pane fills the full width, with the ticket properties container floating as a 340px right-hand panel. Same renderTicket() markup — just a body class (.ticket-popout) toggled by JS, with the CSS doing the layout work via display: none on the side panes and position: absolute on the properties panel.
Double-click an email row to open it straight into popout mode without changing the persisted preference. The dedicated popout icon persists across reloads via localStorage tied to actual reading-pane state.
When typing a reply, click the ✨ Cleanup button to have Claude rewrite the rough draft as a properly formatted email — adds a Dear [Name], greeting from the requester, fixes grammar, applies the configured tone, and signs off Kind regards,. The prompt is locked down so it won't invent technical details, fabricate apologies, or pad the content beyond what was written. Streams live into the editor; an Undo link appears for 30 seconds in case Claude butchers the rewrite.
Configured under Tickets → Settings → Reply Cleanup with its own Anthropic API key (separate from RFP AI / Knowledge AI) for granular billing visibility. Choose the model (Haiku 4.5 default, Sonnet 4.6, Opus 4.7) and tone (Friendly / Formal / Brief).
Button in ticket detail view opens a slide-in chat panel that searches the Knowledge base for relevant articles using ticket context. Useful for "have we seen this before?" on a fresh incident.
The reading pane has an Affected CMDB Objects section between the email thread and the notes — type to search across every CMDB object, click to link, X to unlink. Each linked object renders as a clickable info card showing class + parent context. See CMDB for the reverse view (Activity panel on the CMDB object detail page).
- Microsoft 365 (via Microsoft Graph API) and Google Workspace (via Gmail API)
- OAuth 2.0 authentication — no plaintext mailbox passwords
- Mailbox whitelist — per-mailbox domain and email-address whitelisting; non-whitelisted senders are rejected and logged
- Email actions — configurable per-mailbox: reject actions (delete / move to Deleted Items / mark as read) and import actions (delete / move to folder) with folder verification
-
Email templates — automated responses triggered by ticket events (new ticket from email, assigned, closed) with merge codes:
[ticket_reference],[requester_name],[analyst_name], etc.
Per-analyst customisable dashboard with Chart.js widgets.
- Widget library with 15 pre-built charts (bar, pie, doughnut, line) covering status, priority, department, type, analyst, origin, first-time-fix, time-series
- Time-series widgets with configurable grouping: day, month, or year
- Multi-series: stacked bar charts broken down by status or priority; created-vs-closed comparison line charts
- Date range filter: last 7/30 days, this month, last 3/6/12 months, this year, all time
- Department filter: scope any widget to specific departments
- Each analyst picks widgets for their own dashboard
- Inline editing: cog icon on each widget opens a modal to edit properties without leaving the dashboard
- Drag-and-drop reordering
Weekly grid showing analyst shift patterns, WFH/office location, and on-call status. Per-day entry management, configurable shift definitions, and a Sunday/Monday week-start toggle.
Each module has an interactive help guide at tickets/help.php — scroll-spy sidebar, sectioned content covering inbox navigation, ticket lifecycle, comments and attachments, dashboard widgets, calendar, rota, and settings.
Tickets → Settings:
- Departments
- Ticket types
- Ticket origins
- Statuses (with Pause-SLA flag per status — see SLA Management)
- Priorities (with response and resolution targets per priority — see SLA Management)
- Rota locations
- Mailboxes (M365 + Google) — OAuth tokens, whitelists, import/reject actions, folder verification
- Email templates
- Rota shifts
- Analysts (with per-analyst Reply Cleanup, password reset, team assignment)
- General (department-default mapping)
- Reply Cleanup AI (key, model, tone)
- SLA — business calendars, per-priority targets, behaviour settings, breach notification rules, cron activity log (see SLA Management)
Searchable, paginated log of imported and rejected emails per mailbox with clickable processing log details. Stored in mailbox_activity_log.
| Table | Purpose |
|---|---|
tickets |
Core ticket record (ticket_number YYYYMMDD-XXXX format) |
emails |
Email messages linked to tickets (incoming/outgoing/manual) |
target_mailboxes |
Configured mailboxes with OAuth credentials |
mailbox_email_whitelist |
Per-mailbox sender whitelist |
mailbox_activity_log |
Audit of imports and rejections |
ticket_email_templates |
Auto-response templates with merge codes |
ticket_audit |
Field-level change history |
ticket_notes |
Internal notes |
ticket_time_entries |
Granular time logs (analyst + minutes + datetime + notes) |
user_preferences |
Per-analyst settings (e.g. inbox grouping, popout mode) |
SLA-related tables (sla_calendars, sla_calendar_hours, sla_calendar_holidays, sla_notification_rules, sla_notifications_sent, sla_cron_runs) are documented separately on the SLA Management page.
FreeITSM — an open-source IT Service Management platform · github.com/edmozley/freeitsm · MIT licence