diff --git a/docker-compose.yml b/docker-compose.yml index a6e05b3..ca80325 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -81,6 +81,9 @@ services: SKRIFT_BACKEND_TOKEN: ${SKRIFT_BACKEND_TOKEN} SKRIFT_PREVIEW_LIMIT: ${SKRIFT_PREVIEW_LIMIT:-10} SKRIFT_TEAM_EMAIL: ${SKRIFT_TEAM_EMAIL:-hello@skrift.de} + # Geheimer Pfad-Token der oeffentlichen Versand-Bestaetigungsseite + # (/v1/versand/). Ohne Wert ist die Seite aus (404). + SKRIFT_VERSAND_TOKEN: ${SKRIFT_VERSAND_TOKEN} # Shared Secret für den WordPress-Webhook (JetFormBuilder → /skrift-orders/inbound/*). # Muss identisch als ?token=... in der Webhook-URL stehen. diff --git a/extensions/directus-extension-skrift-orders/dist/index.js b/extensions/directus-extension-skrift-orders/dist/index.js index 0115799..fb5ceed 100644 --- a/extensions/directus-extension-skrift-orders/dist/index.js +++ b/extensions/directus-extension-skrift-orders/dist/index.js @@ -1381,10 +1381,10 @@ const handler = (router, { services, getSchema, logger }) => { }); const txt = await r.text(); let data = null; try { data = txt ? JSON.parse(txt) : null; } catch { /* egal */ } - if (!r.ok) return res.status(502).json({ error: 'Bündelung fehlgeschlagen.', detail: (data && data.message) || String(txt).slice(0, 300) }); + if (!r.ok) return res.status(502).json({ error: 'Bündelung fehlgeschlagen.', detail: (data && (data.message || data.error)) || String(txt).slice(0, 2000) }); return res.json(data || { ok: true }); } catch (e) { - return res.status(500).json({ error: 'Backend nicht erreichbar.', detail: String(e.message || e).slice(0, 300) }); + return res.status(500).json({ error: 'Backend nicht erreichbar.', detail: String(e.message || e).slice(0, 2000) }); } }); diff --git a/extensions/directus-extension-skrift-produktion/dist/index.js b/extensions/directus-extension-skrift-produktion/dist/index.js index a9e99c8..7449e45 100644 --- a/extensions/directus-extension-skrift-produktion/dist/index.js +++ b/extensions/directus-extension-skrift-produktion/dist/index.js @@ -990,18 +990,29 @@ const Board = defineComponent({ async function batchFtp() { const ids = [...batchAuswahl.value]; if (!ids.length || batchBusy.value) return; - batchBusy.value = 'ftp'; fehler.value = ''; + batchBusy.value = 'ftp'; fehler.value = ''; meldung.value = ''; try { - const res = await api.post('/skrift-orders/batch-build', { ids }); - const bundles = res.data?.bundles || []; + const res = await api.post('/skrift-orders/batch-build', { ids }, { timeout: 90000 }); + const data = res?.data || {}; + const bundles = Array.isArray(data.bundles) ? data.bundles : []; + try { console.log('[batch-ftp] Antwort:', JSON.stringify(data)); } catch { /* egal */ } const errs = bundles.filter((b) => b.error); - const total = bundles.reduce((s, b) => s + (b.count || 0), 0); + const total = bundles.reduce((s, b) => s + (Number(b.count) || 0), 0); const files = bundles.filter((b) => b.file).map((b) => b.file).join(', '); - if (errs.length) fehler.value = `FTP: ${errs.map((e) => e.error).join('; ')}`; - else { flash(`✓ ${total} Übermittlung(en) per FTP hochgeladen${files ? ` → ${files}.{xlsx,pdf}` : ''}.`); batchAuswahlLeeren(); } + if (errs.length) { + // Gesamten Fehler ausgeben (nicht gekürzt). + fehler.value = 'FTP-Fehler: ' + errs.map((e) => `${e.client_id != null ? '#' + e.client_id + ' – ' : ''}${e.error}`).join(' | '); + } else if (!bundles.length || total === 0) { + fehler.value = 'Nichts hochgeladen – in der Auswahl ist keine Druck-PDF (nur PDF-Übermittlungen werden per FTP gebündelt, Text nicht).'; + } else { + flash(`✓ ${total} Übermittlung(en) per FTP hochgeladen${files ? ` → ${files}.{xlsx,pdf}` : ''}.`); + batchAuswahlLeeren(); + } await laden(); } catch (e) { - fehler.value = e?.response?.data?.detail || e?.response?.data?.error || e?.message || 'FTP-Upload fehlgeschlagen.'; + const d = e?.response?.data; + fehler.value = 'FTP-Upload fehlgeschlagen: ' + (d?.detail || d?.error || e?.message || String(e)); + try { console.error('[batch-ftp] Fehler:', e?.response?.data || e); } catch { /* egal */ } } finally { batchBusy.value = ''; } } // Gruppen (Tag/Kunde): Aufklappen + Kopf-Auswahl.