Lisää allekirjoitukset Zammad-sähköposteille

Asetukset-sivulla näytetään nyt myös Zammad-sähköpostiosoitteet
(esim. support@web1.fi) allekirjoitusten alla. Allekirjoitus liitetään
automaattisesti Zammad-vastauksiin. Tallennetaan avaimella
"zammad:email@osoite.fi". Uusi ticket_zammad_emails API-endpoint
hakee uniikit vastaanotto-osoitteet tietokannasta.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 01:12:38 +02:00
parent 02a5c08164
commit 890b5d932e
3 changed files with 54 additions and 8 deletions

View File

@@ -1879,10 +1879,15 @@ async function showTicketDetail(id, companyId = '') {
function updateSignaturePreview(mbId) {
const sigPreview = document.getElementById('signature-preview');
const useSigCheck = document.getElementById('reply-use-signature');
// Etsi allekirjoitus: ensin suoraan mailbox-id:llä, sitten fallback ensimmäiseen löytyvään
let sig = currentUserSignatures[mbId] || '';
let sig = '';
// Zammad-tiketti: hae allekirjoitus zammad:email -avaimella
if (mbId === 'zammad' && ticket.zammad_to_email) {
sig = currentUserSignatures['zammad:' + ticket.zammad_to_email] || '';
}
if (!sig) {
sig = currentUserSignatures[mbId] || '';
}
if (!sig && mbId) {
// Kokeile myös string/number-konversiota
sig = currentUserSignatures[String(mbId)] || currentUserSignatures[Number(mbId)] || '';
}
if (!sig) {
@@ -1897,7 +1902,9 @@ async function showTicketDetail(id, companyId = '') {
sigPreview.style.display = 'none';
}
}
updateSignaturePreview(ticket.mailbox_id || '');
// Zammad-tiketeille käytä 'zammad' avaimena, muille mailbox_id
const initialSigKey = (ticket.source === 'zammad' && ticket.zammad_ticket_id) ? 'zammad' : (ticket.mailbox_id || '');
updateSignaturePreview(initialSigKey);
// Allekirjoitus-checkbox: päivitä esikatselu vaihdettaessa
const useSigCheckbox = document.getElementById('reply-use-signature');
@@ -1993,8 +2000,15 @@ document.getElementById('btn-send-reply').addEventListener('click', async () =>
// Tarkista onko Zammad-tiketti
const isZammadTicket = currentTicketData?.zammad_ticket_id;
if (isZammadTicket && ticketReplyType !== 'note') {
// Liitä allekirjoitus Zammad-vastaukseen
let zBody = body;
const useSig = document.getElementById('reply-use-signature');
if (useSig && useSig.checked && currentTicketData.zammad_to_email) {
const zSig = currentUserSignatures['zammad:' + currentTicketData.zammad_to_email] || '';
if (zSig) zBody += '\n\n-- \n' + zSig;
}
// Lähetä Zammad API:n kautta
await apiCall('zammad_reply' + ticketCompanyParam(), 'POST', { ticket_id: currentTicketId, body });
await apiCall('zammad_reply' + ticketCompanyParam(), 'POST', { ticket_id: currentTicketId, body: zBody });
} else {
const action = ticketReplyType === 'note' ? 'ticket_note' : 'ticket_reply';
const payload = { id: currentTicketId, body };
@@ -2379,7 +2393,7 @@ async function initTicketSettings() {
}
// Allekirjoitukset per postilaatikko
sigContainer.innerHTML = mailboxes.map(mb =>
let sigHtml = mailboxes.map(mb =>
`<div style="margin-bottom:0.75rem;">
<label style="font-weight:600;font-size:0.85rem;color:#333;">${esc(mb.company_nimi)}${esc(mb.nimi)}</label>
<textarea class="ticket-sig-textarea" data-mailbox-id="${mb.id}" rows="3"
@@ -2388,6 +2402,24 @@ async function initTicketSettings() {
</div>`
).join('');
// Zammad-sähköpostien allekirjoitukset
try {
const zammadEmails = await apiCall('ticket_zammad_emails');
if (zammadEmails.length > 0) {
sigHtml += '<div style="margin-top:0.75rem;padding-top:0.75rem;border-top:1px solid #eee;"><strong style="font-size:0.85rem;color:#666;">Zammad-sähköpostit</strong></div>';
zammadEmails.forEach(email => {
const key = 'zammad:' + email;
sigHtml += `<div style="margin-bottom:0.75rem;">
<label style="font-weight:600;font-size:0.85rem;color:#333;">${esc(email)} <span style="color:#888;font-size:0.8rem;">(Zammad)</span></label>
<textarea class="ticket-sig-textarea" data-mailbox-id="${esc(key)}" rows="3"
style="width:100%;margin-top:0.25rem;padding:8px;border:1px solid #ddd;border-radius:6px;font-size:0.85rem;font-family:inherit;resize:vertical;"
placeholder="esim.\nJukka\nYritys Oy\ninfo@yritys.fi">${esc(currentUserSignatures[key] || '')}</textarea>
</div>`;
});
}
} catch (e) {}
sigContainer.innerHTML = sigHtml;
// Postilaatikoiden näkyvyys — checkbox per postilaatikko
let visHtml = mailboxes.map(mb => {
const isHidden = currentHiddenMailboxes.includes(String(mb.id)) || currentHiddenMailboxes.includes(mb.id);