Simplify timer: checkbox + delay days, execute at 10:00
Timer is now a simple checkbox + days field. When enabled, rule actions are scheduled for X days after ticket creation at 10:00 AM instead of applying immediately. Removed no_activity condition in favor of simple time-based scheduling stored on the ticket (delay_rule_id + delay_execute_at). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
99
api.php
99
api.php
@@ -3242,61 +3242,34 @@ switch ($action) {
|
||||
}
|
||||
unset($tc);
|
||||
|
||||
// Ajastinsääntöjen tarkistus (delay_days + no_activity)
|
||||
$timedRules = array_filter(dbLoadTicketRules($comp['id']), function($r) {
|
||||
return $r['enabled'] && $r['delay_days'] > 0 && $r['delay_condition'] === 'no_activity';
|
||||
});
|
||||
if (!empty($timedRules)) {
|
||||
foreach ($tickets as &$tc) {
|
||||
if (in_array($tc['status'], ['suljettu', 'ratkaistu'])) continue;
|
||||
$lastActivity = $tc['updated'] ?? $tc['created'];
|
||||
$inactiveDays = (strtotime($now) - strtotime($lastActivity)) / 86400;
|
||||
foreach ($timedRules as $rule) {
|
||||
if ($inactiveDays < $rule['delay_days']) continue;
|
||||
// Tarkista ehdot (from/to/subject)
|
||||
$match = true;
|
||||
if (!empty($rule['from_contains'])) {
|
||||
if (stripos(($tc['from_email'] ?? '') . ' ' . ($tc['from_name'] ?? ''), $rule['from_contains']) === false) $match = false;
|
||||
}
|
||||
if (!empty($rule['subject_contains'])) {
|
||||
if (stripos($tc['subject'] ?? '', $rule['subject_contains']) === false) $match = false;
|
||||
}
|
||||
if (!empty($rule['to_contains'])) {
|
||||
if (stripos($tc['to_email'] ?? '', $rule['to_contains']) === false) $match = false;
|
||||
}
|
||||
if (!$match) continue;
|
||||
// Sovella toimenpiteet
|
||||
$changed = false;
|
||||
if (!empty($rule['set_priority']) && ($tc['priority'] ?? '') !== $rule['set_priority']) {
|
||||
$tc['priority'] = $rule['set_priority'];
|
||||
$changed = true;
|
||||
}
|
||||
if (!empty($rule['status_set']) && ($tc['status'] ?? '') !== $rule['status_set']) {
|
||||
$tc['status'] = $rule['status_set'];
|
||||
$changed = true;
|
||||
}
|
||||
if (!empty($rule['type_set']) && ($tc['type'] ?? '') !== $rule['type_set']) {
|
||||
$tc['type'] = $rule['type_set'];
|
||||
$changed = true;
|
||||
}
|
||||
if (!empty($rule['set_tags'])) {
|
||||
$ruleTags = array_map('trim', explode(',', $rule['set_tags']));
|
||||
$existingTags = $tc['tags'] ?? [];
|
||||
$merged = array_values(array_unique(array_merge($existingTags, $ruleTags)));
|
||||
if ($merged !== $existingTags) {
|
||||
$tc['tags'] = $merged;
|
||||
$changed = true;
|
||||
}
|
||||
}
|
||||
if ($changed) {
|
||||
$tc['updated'] = $now;
|
||||
dbSaveTicket($comp['id'], $tc);
|
||||
}
|
||||
break; // Vain yksi ajastinsääntö per tiketti
|
||||
// Ajastettujen sääntöjen suoritus (delay_execute_at saavutettu)
|
||||
foreach ($tickets as &$tc) {
|
||||
if (empty($tc['delay_rule_id']) || empty($tc['delay_execute_at'])) continue;
|
||||
if ($tc['delay_execute_at'] > $now) continue;
|
||||
if (in_array($tc['status'], ['suljettu', 'ratkaistu'])) {
|
||||
// Suljettu/ratkaistu ennen ajastinta → peruuta
|
||||
unset($tc['delay_rule_id'], $tc['delay_execute_at']);
|
||||
dbSaveTicket($comp['id'], $tc);
|
||||
continue;
|
||||
}
|
||||
// Hae sääntö ja suorita toimenpiteet
|
||||
$allRules = dbLoadTicketRules($comp['id']);
|
||||
$rule = null;
|
||||
foreach ($allRules as $r) { if ($r['id'] === $tc['delay_rule_id']) { $rule = $r; break; } }
|
||||
if ($rule) {
|
||||
if (!empty($rule['status_set'])) $tc['status'] = $rule['status_set'];
|
||||
if (!empty($rule['type_set'])) $tc['type'] = $rule['type_set'];
|
||||
if (!empty($rule['set_priority'])) $tc['priority'] = $rule['set_priority'];
|
||||
if (!empty($rule['set_tags'])) {
|
||||
$ruleTags = array_map('trim', explode(',', $rule['set_tags']));
|
||||
$tc['tags'] = array_values(array_unique(array_merge($tc['tags'] ?? [], $ruleTags)));
|
||||
}
|
||||
}
|
||||
unset($tc);
|
||||
unset($tc['delay_rule_id'], $tc['delay_execute_at']);
|
||||
$tc['updated'] = $now;
|
||||
dbSaveTicket($comp['id'], $tc);
|
||||
}
|
||||
unset($tc);
|
||||
|
||||
// Resolve mailbox names for this company
|
||||
$mailboxes = dbLoadMailboxes($comp['id']);
|
||||
@@ -3571,12 +3544,21 @@ switch ($action) {
|
||||
}
|
||||
}
|
||||
if ($match) {
|
||||
if (!empty($rule['status_set'])) $ticket['status'] = $rule['status_set'];
|
||||
if (!empty($rule['type_set'])) $ticket['type'] = $rule['type_set'];
|
||||
if (!empty($rule['set_priority'])) $ticket['priority'] = $rule['set_priority'];
|
||||
if (!empty($rule['set_tags'])) {
|
||||
$ruleTags = array_map('trim', explode(',', $rule['set_tags']));
|
||||
$ticket['tags'] = array_values(array_unique(array_merge($ticket['tags'], $ruleTags)));
|
||||
$delayDays = intval($rule['delay_days'] ?? 0);
|
||||
if ($delayDays > 0) {
|
||||
// Ajastettu sääntö: älä suorita heti, tallenna ajastus tikettiin
|
||||
$executeAt = date('Y-m-d', strtotime("+{$delayDays} days")) . ' 10:00:00';
|
||||
$ticket['delay_rule_id'] = $rule['id'];
|
||||
$ticket['delay_execute_at'] = $executeAt;
|
||||
} else {
|
||||
// Välitön sääntö: suorita heti
|
||||
if (!empty($rule['status_set'])) $ticket['status'] = $rule['status_set'];
|
||||
if (!empty($rule['type_set'])) $ticket['type'] = $rule['type_set'];
|
||||
if (!empty($rule['set_priority'])) $ticket['priority'] = $rule['set_priority'];
|
||||
if (!empty($rule['set_tags'])) {
|
||||
$ruleTags = array_map('trim', explode(',', $rule['set_tags']));
|
||||
$ticket['tags'] = array_values(array_unique(array_merge($ticket['tags'], $ruleTags)));
|
||||
}
|
||||
}
|
||||
if (!empty($rule['auto_close_days'])) {
|
||||
$days = intval($rule['auto_close_days']);
|
||||
@@ -4024,7 +4006,6 @@ switch ($action) {
|
||||
'set_tags' => trim($input['set_tags'] ?? ''),
|
||||
'auto_close_days' => intval($input['auto_close_days'] ?? 0),
|
||||
'delay_days' => intval($input['delay_days'] ?? 0),
|
||||
'delay_condition' => trim($input['delay_condition'] ?? ''),
|
||||
'enabled' => $input['enabled'] ?? true,
|
||||
];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user