Statistik-Tab, Unterschriftenservice-Kuverts, Auftragsverknüpfung & Notizen
- Produktion: Statistik-Tab (versendete Briefe je Kunde/Monat), verknüpfter Auftrag je Karte anzeigen/ändern/entfernen, Datei-Aufträge werden beim Übernehmen wieder in den Signatur-Tab überführt. - Unterschriftenservice (neuauftrag): optionale Kuverts (je Empfänger ein Umschlag, Absender möglich) und Verknüpfung mit vorhandenem Auftrag. - orders: signature-order erzeugt Kuverts über die Standard-Pipeline (Datei-Produkt -> nur Umschläge, Seiten bleiben erhalten) und speichert linked_order; nachträgliches Verknüpfen im Board. - bootstrap: orders.linked_order (Self-Relation). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
2b0c0028ed
commit
ae7ef2422e
4 files changed
+188
-12
No files matched your search
@@ -59,6 +59,11 @@ const NeuAuftrag = defineComponent({
|
||||
modus: 'auftrag', // 'auftrag' (aus Auftrag laden) oder 'manuell' (direkt hochladen)
|
||||
orderNr: '', order: null, docs: [], docId: null, docName: '', signaturen: [],
|
||||
customerEmail: '', laden: false, pdf: '', msg: '', err: '',
|
||||
// Kuverts zum Unterschriftenservice (wie manueller Druck): je Empfänger ein Umschlag.
|
||||
kuverts: false, kuvertFormat: 'dinlang', empfBlocks: '',
|
||||
absenderAuf: false, absender: '', absenderScale: 100,
|
||||
// Verknüpfung mit vorhandenem Auftrag (dessen Kuverts genutzt werden).
|
||||
linkNr: '',
|
||||
});
|
||||
// Datei nach Directus hochladen (liefert die Datei-ID).
|
||||
async function sigUpload(file) {
|
||||
@@ -118,7 +123,13 @@ const NeuAuftrag = defineComponent({
|
||||
if (raw) {
|
||||
localStorage.removeItem('skrift_neuauftrag_uebernahme');
|
||||
const d = JSON.parse(raw);
|
||||
if (d && typeof d === 'object') {
|
||||
if (d && d.zielSignatur) {
|
||||
// Datei-/Unterschriftenservice-Auftrag → Signatur-Tab, per Nr. laden.
|
||||
ansicht.value = 'signatur';
|
||||
sig.modus = 'auftrag';
|
||||
sig.orderNr = String(d.orderNr || '');
|
||||
if (sig.orderNr) { sigLaden().catch(() => {}); }
|
||||
} else if (d && typeof d === 'object') {
|
||||
if (d.product) neu.product = d.product;
|
||||
if (d.format) neu.format = d.format;
|
||||
if (d.font) neu.font = d.font;
|
||||
@@ -757,10 +768,20 @@ const NeuAuftrag = defineComponent({
|
||||
async function sigAuftrag() {
|
||||
if (!sig.docId) { sig.err = 'Bitte ein Dokument wählen/hochladen.'; return; }
|
||||
if (!sigAktive().length) { sig.err = 'Mindestens eine Unterschrift aktivieren.'; return; }
|
||||
if (sig.kuverts && !sig.empfBlocks.trim()) { sig.err = 'Kuverts gewählt, aber keine Empfänger angegeben.'; return; }
|
||||
sig.err = ''; sig.msg = 'Auftrag wird angelegt …';
|
||||
try {
|
||||
const res = await api.post('/skrift-orders/signature-order', { ...sigPayload(), customer_email: sig.customerEmail || undefined });
|
||||
sig.msg = `✔ Auftrag ${res.data.order_number} angelegt (${res.data.pages} Seite/n). Im Produktions-Board unter „Neu" → Drucken.`;
|
||||
const res = await api.post('/skrift-orders/signature-order', {
|
||||
...sigPayload(), customer_email: sig.customerEmail || undefined,
|
||||
kuverts: sig.kuverts,
|
||||
recipients_text: sig.kuverts ? sig.empfBlocks : undefined,
|
||||
envelope_format: sig.kuverts ? sig.kuvertFormat : undefined,
|
||||
envelope_sender: sig.kuverts && sig.absenderAuf ? sig.absender.trim() : undefined,
|
||||
envelope_sender_scale: (Number(sig.absenderScale) || 100) / 100,
|
||||
link_order_number: sig.linkNr.trim() || undefined,
|
||||
});
|
||||
const kt = res.data.kuverts ? `, ${res.data.kuverts} Kuvert/s` : '';
|
||||
sig.msg = `✔ Auftrag ${res.data.order_number} angelegt (${res.data.pages} Seite/n${kt}). Im Produktions-Board unter „Neu" → Drucken.`;
|
||||
} catch (e) { sig.err = e?.response?.data?.detail || e?.response?.data?.error || e?.message || 'Auftrag konnte nicht angelegt werden.'; sig.msg = ''; }
|
||||
}
|
||||
|
||||
@@ -835,11 +856,44 @@ const NeuAuftrag = defineComponent({
|
||||
btn('⤓ A4-Signaturen (ZIP)', sigDownload),
|
||||
]),
|
||||
]);
|
||||
// ── Kuverts & Verknüpfung ──────────────────────────────────────────────
|
||||
const b3 = h('div', { style: BEREICH }, [
|
||||
bereichKopf('✉ Kuverts & Verknüpfung'),
|
||||
subdued('Optional: adressierte Kuverts zum Unterschriftenservice erzeugen (wie beim manuellen Druck) – oder den Auftrag mit einem vorhandenen Auftrag verknüpfen, dessen Kuverts genutzt werden.', 'margin-bottom:10px;'),
|
||||
h('label', { style: 'display:flex;align-items:center;gap:8px;font-size:14px;cursor:pointer;margin-bottom:8px;' }, [
|
||||
h('input', { type: 'checkbox', checked: sig.kuverts, onChange: (e) => { sig.kuverts = e.target.checked; }, style: 'width:16px;height:16px;' }),
|
||||
'Kuverts mitdrucken (je Empfänger ein Umschlag)',
|
||||
]),
|
||||
sig.kuverts ? h('div', { style: 'padding-left:24px;display:flex;flex-direction:column;gap:12px;margin-bottom:12px;' }, [
|
||||
h('div', { style: 'max-width:240px;' }, [label('Kuvertformat'), sel(sig.kuvertFormat, [{ v: 'dinlang', t: 'DIN Lang' }, { v: 'c6', t: 'C6' }], (e) => { sig.kuvertFormat = e.target.value; })]),
|
||||
h('div', {}, [
|
||||
label('Empfänger (ein Block je Empfänger, durch Leerzeile getrennt)'),
|
||||
h('textarea', { value: sig.empfBlocks, rows: 6, placeholder: 'Max Mustermann\nMusterstr. 1\n12345 Musterstadt\n\nErika Beispiel\nBeispielweg 2\n54321 Beispielort',
|
||||
style: WFELD + 'width:100%;font-family:var(--family-monospace,monospace);', onInput: (e) => { sig.empfBlocks = e.target.value; } }),
|
||||
]),
|
||||
h('label', { style: 'display:flex;align-items:center;gap:8px;font-size:14px;cursor:pointer;' }, [
|
||||
h('input', { type: 'checkbox', checked: sig.absenderAuf, onChange: (e) => { sig.absenderAuf = e.target.checked; }, style: 'width:16px;height:16px;' }),
|
||||
'Absender aufs Kuvert',
|
||||
]),
|
||||
sig.absenderAuf ? h('div', { style: 'display:flex;gap:12px;flex-wrap:wrap;' }, [
|
||||
h('div', { style: 'flex:1;min-width:200px;' }, [label('Absender (max. 5 Zeilen)'),
|
||||
h('textarea', { value: sig.absender, rows: 5, style: WFELD + 'width:100%;',
|
||||
onInput: (e) => { sig.absender = e.target.value.split('\n').slice(0, 5).join('\n'); } })]),
|
||||
h('div', { style: 'width:120px;' }, [label('Größe (%)'),
|
||||
h('input', { type: 'number', step: 5, min: 50, max: 200, value: sig.absenderScale, style: WFELD + 'width:100%;', onInput: (e) => { sig.absenderScale = e.target.value; } })]),
|
||||
]) : null,
|
||||
]) : null,
|
||||
h('div', { style: 'max-width:360px;' }, [
|
||||
label('Mit vorhandenem Auftrag verknüpfen (Nr., optional)'),
|
||||
h('input', { value: sig.linkNr, placeholder: 'z. B. 07-09-26-003', style: WFELD + 'width:100%;', onInput: (e) => { sig.linkNr = e.target.value; } }),
|
||||
subdued('Dessen Kuverts werden für diesen Auftrag genutzt. Änderbar im Produktions-Board.', 'margin-top:4px;'),
|
||||
]),
|
||||
]);
|
||||
const meldung = h('div', {}, [
|
||||
sig.err ? h('div', { style: 'color:var(--danger,#c62828);font-size:13px;margin-top:8px;' }, sig.err) : null,
|
||||
sig.msg ? subdued(sig.msg, 'margin-top:8px;') : null,
|
||||
]);
|
||||
const links = h('div', { style: 'flex:1;min-width:0;display:flex;flex-direction:column;gap:16px;' }, [b1, b2, meldung]);
|
||||
const links = h('div', { style: 'flex:1;min-width:0;display:flex;flex-direction:column;gap:16px;' }, [b1, b2, b3, meldung]);
|
||||
const rechts = h('div', { style: BEREICH + 'flex:0 0 420px;position:sticky;top:20px;align-self:flex-start;min-height:200px;' }, [
|
||||
h('div', { style: 'display:flex;justify-content:space-between;align-items:center;gap:8px;' }, [
|
||||
bereichKopf('👁 Vorschau'),
|
||||
|
||||
Reference in new issue
Block a user