Sync ticket status to Zammad + prevent closed tickets reopening

- When changing ticket status in intra, now syncs to Zammad too
  (close in intra → close in Zammad, etc.)
- Prevent Zammad sync from reopening locally closed tickets
  unless Zammad has genuinely new activity (updated_at changed)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 17:15:16 +02:00
parent b4a85a28a5
commit a73cce678e

36
api.php
View File

@@ -3661,6 +3661,25 @@ switch ($action) {
dbSaveTicket($companyId, $t);
$found = true;
dbAddLog($companyId, currentUser(), 'ticket_status', $t['id'], $t['subject'], "Tila: {$oldStatus}{$status}");
// Synkkaa tila Zammadiin
if (!empty($t['zammad_ticket_id'])) {
$integ = dbGetIntegration($companyId, 'zammad');
if ($integ && $integ['enabled']) {
try {
$reverseStateMap = [
'uusi' => 'new', 'kasittelyssa' => 'open',
'odottaa' => 'pending reminder', 'suljettu' => 'closed',
];
$zState = $reverseStateMap[$status] ?? null;
if ($zState) {
$z = new ZammadClient($integ['config']['url'], $integ['config']['token']);
$z->updateTicket((int)$t['zammad_ticket_id'], ['state' => $zState]);
}
} catch (\Throwable $e) {
error_log("Zammad status sync failed: " . $e->getMessage());
}
}
}
echo json_encode($t);
break;
}
@@ -5464,10 +5483,25 @@ switch ($action) {
} else {
$ticketId = $existing['id'];
$zammadUpdated = date('Y-m-d H:i:s', strtotime($zt['updated_at'] ?? 'now'));
// Jos tiketti on suljettu tässä järjestelmässä, älä palauta uudeksi
// PAITSI jos Zammadissa status on oikeasti muuttunut (esim. uusi viesti avasi tiketin)
$localStatus = $existing['status'] ?? '';
$newStatus = $status;
if ($localStatus === 'suljettu' && $status === 'uusi') {
// Tarkista onko Zammadissa oikeasti uutta toimintaa (updated_at muuttunut)
$localUpdated = $existing['updated'] ?? '';
if ($zammadUpdated > $localUpdated) {
// Zammadissa on tapahtunut jotain — avaa uudelleen
$newStatus = 'uusi';
} else {
// Ei muutoksia — pidä suljettuna
$newStatus = 'suljettu';
}
}
// Päivitä status/priority/group
_dbExecute(
"UPDATE tickets SET status = ?, type = ?, priority = ?, subject = ?, zammad_group = ?, updated = ? WHERE id = ?",
[$status, $type, $priority, $zt['title'] ?? '', $group, $zammadUpdated, $ticketId]
[$newStatus, $type, $priority, $zt['title'] ?? '', $group, $zammadUpdated, $ticketId]
);
$updated++;
}