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:
14
api.php
14
api.php
@@ -3942,6 +3942,20 @@ switch ($action) {
|
||||
echo json_encode($groups);
|
||||
break;
|
||||
|
||||
case 'ticket_zammad_emails':
|
||||
requireAuth();
|
||||
$userCompanyIds = $_SESSION['companies'] ?? [];
|
||||
$emails = [];
|
||||
foreach ($userCompanyIds as $cid) {
|
||||
$rows = _dbFetchAll("SELECT DISTINCT zammad_to_email FROM tickets WHERE company_id = ? AND source = 'zammad' AND zammad_to_email IS NOT NULL AND zammad_to_email != ''", [$cid]);
|
||||
foreach ($rows as $r) {
|
||||
if (!in_array($r['zammad_to_email'], $emails)) $emails[] = $r['zammad_to_email'];
|
||||
}
|
||||
}
|
||||
sort($emails);
|
||||
echo json_encode($emails);
|
||||
break;
|
||||
|
||||
case 'company_create':
|
||||
requireSuperAdmin();
|
||||
if ($method !== 'POST') break;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Noxus HUB</title>
|
||||
<link rel="stylesheet" href="style.css?v=20260313c">
|
||||
<link rel="stylesheet" href="style.css?v=20260313d">
|
||||
</head>
|
||||
<body>
|
||||
<!-- Login -->
|
||||
@@ -2229,6 +2229,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="script.js?v=20260313c"></script>
|
||||
<script src="script.js?v=20260313d"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
44
script.js
44
script.js
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user