Nopeuta Zammad-sync: artikkelit haetaan vasta kun tiketti avataan

Sync hakee nyt vain tikettien metatiedot (status, aihe, ryhmä) —
ei enää satoja getArticles-kutsuja jokaiselle tiketille. Artikkelit
haetaan on-demand ticket_detail-endpointissa kun käyttäjä avaa
tiketin. Nopeuttaa synkkausta dramaattisesti.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 00:54:11 +02:00
parent c002072367
commit 109dce3f26

48
api.php
View File

@@ -3068,6 +3068,40 @@ switch ($action) {
echo json_encode(['error' => 'Tikettiä ei löydy']); echo json_encode(['error' => 'Tikettiä ei löydy']);
break; break;
} }
// Zammad-tiketti: hae artikkelit on-demand jos ei vielä haettu
if (!empty($ticket['zammad_ticket_id']) && empty($ticket['messages'])) {
try {
$integ = dbGetIntegration($companyId, 'zammad');
if ($integ && $integ['enabled']) {
$z = new ZammadClient($integ['config']['url'], $integ['config']['token']);
$articles = $z->getArticles((int)$ticket['zammad_ticket_id']);
foreach ($articles as $art) {
if (($art['internal'] ?? false)) continue;
$artId = (int)$art['id'];
$existingMsg = dbGetMessageByZammadArticleId($ticket['id'], $artId);
if ($existingMsg) continue;
$msgId = substr(uniqid(), -8) . bin2hex(random_bytes(2));
$msgType = ($art['sender'] ?? '') === 'Customer' ? 'incoming' : 'outgoing';
$body = $art['body'] ?? '';
if (($art['content_type'] ?? '') === 'text/html') {
$body = strip_tags($body, '<br><p><div><a><b><i><strong><em><ul><ol><li>');
}
_dbExecute(
"INSERT INTO ticket_messages (id, ticket_id, type, from_email, from_name, body, timestamp, message_id, zammad_article_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
[$msgId, $ticket['id'], $msgType, $art['from'] ?? '', $art['from'] ?? '', $body,
$art['created_at'] ? date('Y-m-d H:i:s', strtotime($art['created_at'])) : date('Y-m-d H:i:s'),
$art['message_id'] ?? '', $artId]
);
}
// Lataa tiketti uudelleen viestien kanssa
$tickets = dbLoadTickets($companyId);
foreach ($tickets as $t) {
if ($t['id'] === $id) { $ticket = $t; break; }
}
}
} catch (\Throwable $e) { /* Zammad ei saatavilla — näytä tiketti ilman viestejä */ }
}
echo json_encode($ticket); echo json_encode($ticket);
break; break;
@@ -5182,20 +5216,17 @@ switch ($action) {
"UPDATE tickets SET status = ?, type = ?, priority = ?, subject = ?, zammad_group = ?, updated = ? WHERE id = ?", "UPDATE tickets SET status = ?, type = ?, priority = ?, subject = ?, zammad_group = ?, updated = ? WHERE id = ?",
[$status, $type, $priority, $zt['title'] ?? '', $group, $zammadUpdated, $ticketId] [$status, $type, $priority, $zt['title'] ?? '', $group, $zammadUpdated, $ticketId]
); );
// Ohita artikkelien haku jos tiketti ei muuttunut (inkrementaalisessa syncissä)
$existingUpdated = $existing['updated'] ?? '';
if (!$fullSync && $existingUpdated === $zammadUpdated) {
$updated++;
continue;
}
$updated++; $updated++;
} }
// Synkkaa artikkelit → viestit // Synkkaa artikkelit vain uusille tiketeille (ei jokaiselle — liian hidas)
// Olemassa olevien tikettien artikkelit haetaan on-demand kun käyttäjä avaa tiketin
if ($existing) continue;
try { try {
$articles = $z->getArticles($zammadId); $articles = $z->getArticles($zammadId);
foreach ($articles as $art) { foreach ($articles as $art) {
if (($art['internal'] ?? false)) continue; // Ohita sisäiset muistiinpanot if (($art['internal'] ?? false)) continue;
$artId = (int)$art['id']; $artId = (int)$art['id'];
$existingMsg = dbGetMessageByZammadArticleId($ticketId, $artId); $existingMsg = dbGetMessageByZammadArticleId($ticketId, $artId);
if ($existingMsg) continue; if ($existingMsg) continue;
@@ -5203,7 +5234,6 @@ switch ($action) {
$msgId = substr(uniqid(), -8) . bin2hex(random_bytes(2)); $msgId = substr(uniqid(), -8) . bin2hex(random_bytes(2));
$msgType = ($art['sender'] ?? '') === 'Customer' ? 'incoming' : 'outgoing'; $msgType = ($art['sender'] ?? '') === 'Customer' ? 'incoming' : 'outgoing';
$body = $art['body'] ?? ''; $body = $art['body'] ?? '';
// Strippaa HTML tagit jos content_type on text/html
if (($art['content_type'] ?? '') === 'text/html') { if (($art['content_type'] ?? '') === 'text/html') {
$body = strip_tags($body, '<br><p><div><a><b><i><strong><em><ul><ol><li>'); $body = strip_tags($body, '<br><p><div><a><b><i><strong><em><ul><ol><li>');
} }