Add Skyetel text messaging with two-way ticket texting, text to ticket for contacts, Text reply on tickets, a Texts inbox for unmatched numbers, verification codes and spam (codes masked, limited to credential access, every reveal audited, wiped after a day), STOP/START/HELP handling, a text log with retry and cancel in Maintenance > Text Messages, the Text Messages cron job, and texts to clients about their tickets, visits, visit reminders and invoices with per-contact opt-in from the contact, by text or in the client portal, quiet hours, and new settings in Tickets and Notifications (database 3.6.0 and 3.6.1)

This commit is contained in:
johnnyq
2026-11-06 00:08:10 -05:00
parent 87cdf79b28
commit b391e2ce6c
45 changed files with 4165 additions and 31 deletions

View File

@@ -54,7 +54,7 @@ function settingsPages() {
'mail' => ['group' => 'email', 'title' => 'Mail', 'icon' => 'fa-envelope', 'url' => 'settings_mail.php',
'about' => 'The mailboxes ITFlow sends from and reads tickets from, the names emails come from, and tests.'],
'notification' => ['group' => 'email', 'title' => 'Notifications', 'icon' => 'fa-bell', 'url' => 'settings_notification.php',
'about' => 'Which alerts ITFlow raises, and which emails clients get.'],
'about' => 'Which alerts ITFlow raises, and which emails and texts clients get.'],
'security' => ['group' => 'access', 'title' => 'Security', 'icon' => 'fa-shield-alt', 'url' => 'settings_security.php',
'about' => 'The sign-in page, two-step sign-in, failed sign-ins and shared links.'],
'client_portal' => ['group' => 'access', 'title' => 'Client portal', 'icon' => 'fa-user-shield', 'url' => 'settings_client_portal.php', 'module' => 'portal',
@@ -153,6 +153,9 @@ function settingsFields() {
'config_ticket_next_number' => ['page' => 'ticket', 'section' => 'Numbering', 'label' => 'Next ticket number', 'words' => 'ticket number counter'],
'config_ticket_email_parse' => ['page' => 'ticket', 'section' => 'Email to ticket', 'label' => 'Turn emails into tickets', 'words' => 'email to ticket parser parse inbound imap mailbox'] + $on_off,
'config_ticket_email_parse_unknown_senders' => ['page' => 'ticket', 'section' => 'Email to ticket', 'label' => 'From unknown senders too', 'words' => 'unknown senders domains anyone email'] + $on_off,
'config_ticket_sms_parse' => ['page' => 'ticket', 'section' => 'Text to ticket', 'label' => 'Turn texts into tickets', 'words' => 'text sms message mobile phone skyetel to ticket'] + $on_off,
'config_ticket_sms_unknown_senders' => ['page' => 'ticket', 'section' => 'Text to ticket', 'label' => 'From unknown numbers too', 'words' => 'text sms unknown numbers anyone'] + $on_off,
'config_ticket_sms_acknowledge' => ['page' => 'ticket', 'section' => 'Text to ticket', 'label' => 'Text back the ticket number', 'words' => 'text sms acknowledge reply confirm number'] + $on_off,
'config_ticket_default_billable' => ['page' => 'ticket', 'section' => 'Time and billing', 'label' => 'New tickets are billable', 'words' => 'billable default bill'] + $on_off,
'config_ticket_timer_autostart' => ['page' => 'ticket', 'section' => 'Time and billing', 'label' => 'Start the timer on opening a ticket', 'words' => 'timer autostart time tracking'] + $on_off,
'config_ticket_autoclose_hours' => ['page' => 'ticket', 'section' => 'Closing', 'label' => 'Close resolved tickets after', 'words' => 'auto close autoclose resolved hours'],
@@ -246,6 +249,12 @@ function settingsFields() {
'config_enable_alert_domain_expire' => ['page' => 'notification', 'section' => 'Alerts for your team', 'label' => 'Domains about to expire', 'words' => 'domain expiry expiration alert'] + $on_off,
'config_recurring_auto_send_invoice' => ['page' => 'notification', 'section' => 'Emails to clients', 'label' => 'Email the invoices recurring invoices make', 'words' => 'recurring invoice auto send email'] + $on_off,
'config_ticket_client_general_notifications' => ['page' => 'notification', 'section' => 'Emails to clients', 'label' => 'Email clients about their tickets', 'words' => 'ticket notification client email opened closed'] + $on_off,
'config_sms_client_tickets' => ['page' => 'notification', 'section' => 'Texts to clients', 'label' => 'Text them about their tickets', 'kind' => 'select',
'options' => [0 => 'No', 1 => 'When one is opened and resolved', 2 => 'When one is opened and resolved, and each emailed reply'], 'words' => 'text sms ticket opened resolved reply notification'],
'config_sms_client_visits' => ['page' => 'notification', 'section' => 'Texts to clients', 'label' => 'Text them when a visit or call is booked', 'words' => 'text sms schedule scheduled visit onsite remote booked appointment'] + $on_off,
'config_sms_visit_reminder_hours' => ['page' => 'notification', 'section' => 'Texts to clients', 'label' => 'Remind them of a visit or call', 'kind' => 'select',
'options' => smsReminderChoices(), 'words' => 'text sms reminder appointment visit hours before'],
'config_sms_client_invoices' => ['page' => 'notification', 'section' => 'Texts to clients', 'label' => 'Text invoices and payment reminders, with a link to pay', 'words' => 'text sms invoice pay link reminder overdue'] + $on_off,
// Security
'config_login_message' => ['page' => 'security', 'section' => 'The sign-in page', 'label' => 'Sign-in page message', 'kind' => 'long', 'words' => 'login message banner notice'],