Batch-Uebermittlung (Phase 3): Board-Reiter + Buendeln-Knopf + Schreibvorlage

Produktions-Board: neuer Reiter "Uebermittlungen" (getrennt vom
Auftragsboard). Offene batch_submissions je Zugang gruppiert; Knopf
"Jetzt buendeln & hochladen" pro Zugang loest die Backend-Buendelung
(xlsx + Sammel-PDF + FTP) sofort aus. Text-Uebermittlungen bekommen einen
"Schreibvorlage"-Knopf, der Text + 5-Zeilen-Adressblock (Firma / Vorname
Nachname / Zeile1-3 / PLZ Stadt / Land, max 5) in den manuellen Druck
uebernimmt. skrift-orders: Proxy-Route /batch-build -> Backend.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-28 09:23:40 +02:00
parent 131c48485c
commit 8ad087d007
2 changed files with 114 additions and 1 deletions

View File

@@ -1367,6 +1367,27 @@ const handler = (router, { services, getSchema, logger }) => {
}
});
// ── Batch-Bündelung sofort auslösen (Board-Knopf → Backend) ────────────────
// Proxyt an das Backend, das die offenen batch_submissions dieses Zugangs zu
// xlsx + Sammel-PDF bündelt und per FTP hochlädt. client_id = api_clients-ID.
router.post('/batch-build', async (req, res) => {
const acc = req.accountability;
if (!acc || !acc.user || !(acc.admin || acc.app)) return res.status(403).json({ error: 'Kein Zugriff.' });
try {
const r = await fetch(`${BACKEND_URL}/api/batch/build`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Token': BACKEND_TOKEN },
body: JSON.stringify({ client_id: req.body?.client_id ?? null }),
});
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) });
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) });
}
});
// ── Testdruck: beliebiges Template + Text generieren und einreihen ─────────
const TEST_FORMAT = { a4: 'a4', a6_hoch: 'a6p', a6_quer: 'a6l' };
router.post('/test-print', async (req, res) => {