Add timer/scheduler to ticket automation rules

Adds optional delay_days + delay_condition (no_activity) to ticket rules.
When a ticket has no activity for X days, timed rules automatically apply
actions (e.g., escalate priority to urgent). Checked on each ticket list load.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 19:24:57 +02:00
parent 1a97e07768
commit 95434a42fe
4 changed files with 90 additions and 3 deletions

13
db.php
View File

@@ -680,6 +680,8 @@ function initDatabase(): void {
"ALTER TABLE tickets ADD COLUMN to_email VARCHAR(255) DEFAULT '' AFTER from_name",
"ALTER TABLE tickets ADD COLUMN bcc TEXT DEFAULT '' AFTER cc",
"ALTER TABLE ticket_messages ADD COLUMN attachments TEXT DEFAULT '' AFTER zammad_article_id",
"ALTER TABLE ticket_rules ADD COLUMN delay_days INT DEFAULT 0 AFTER auto_close_days",
"ALTER TABLE ticket_rules ADD COLUMN delay_condition VARCHAR(50) DEFAULT '' AFTER delay_days",
];
foreach ($alters as $sql) {
try { $db->query($sql); } catch (\Throwable $e) { /* sarake on jo olemassa / jo ajettu */ }
@@ -1657,6 +1659,8 @@ function dbLoadTicketRules(string $companyId): array {
foreach ($rules as &$r) {
$r['priority'] = (int)$r['priority'];
$r['auto_close_days'] = (int)$r['auto_close_days'];
$r['delay_days'] = (int)($r['delay_days'] ?? 0);
$r['delay_condition'] = $r['delay_condition'] ?? '';
$r['enabled'] = !empty($r['enabled']);
unset($r['company_id']);
}
@@ -1665,14 +1669,15 @@ function dbLoadTicketRules(string $companyId): array {
function dbSaveTicketRule(string $companyId, array $rule): void {
_dbExecute("
INSERT INTO ticket_rules (id, company_id, name, from_contains, subject_contains, to_contains, priority, tag, assign_to, status_set, type_set, set_priority, set_tags, auto_close_days, enabled)
VALUES (:id, :company_id, :name, :from_contains, :subject_contains, :to_contains, :priority, :tag, :assign_to, :status_set, :type_set, :set_priority, :set_tags, :auto_close_days, :enabled)
INSERT INTO ticket_rules (id, company_id, name, from_contains, subject_contains, to_contains, priority, tag, assign_to, status_set, type_set, set_priority, set_tags, auto_close_days, delay_days, delay_condition, enabled)
VALUES (:id, :company_id, :name, :from_contains, :subject_contains, :to_contains, :priority, :tag, :assign_to, :status_set, :type_set, :set_priority, :set_tags, :auto_close_days, :delay_days, :delay_condition, :enabled)
ON DUPLICATE KEY UPDATE
name = VALUES(name), from_contains = VALUES(from_contains), subject_contains = VALUES(subject_contains),
to_contains = VALUES(to_contains), priority = VALUES(priority),
tag = VALUES(tag), assign_to = VALUES(assign_to), status_set = VALUES(status_set),
type_set = VALUES(type_set), set_priority = VALUES(set_priority), set_tags = VALUES(set_tags),
auto_close_days = VALUES(auto_close_days), enabled = VALUES(enabled)
auto_close_days = VALUES(auto_close_days), delay_days = VALUES(delay_days),
delay_condition = VALUES(delay_condition), enabled = VALUES(enabled)
", [
'id' => $rule['id'],
'company_id' => $companyId,
@@ -1688,6 +1693,8 @@ function dbSaveTicketRule(string $companyId, array $rule): void {
'set_priority' => $rule['set_priority'] ?? '',
'set_tags' => $rule['set_tags'] ?? '',
'auto_close_days' => $rule['auto_close_days'] ?? 0,
'delay_days' => $rule['delay_days'] ?? 0,
'delay_condition' => $rule['delay_condition'] ?? '',
'enabled' => !empty($rule['enabled']) ? 1 : 0,
]);
}