Musteranfrage: mit einem Klick in den manuellen Druck übernehmen

- Produktion: Button „✍ In manuellen Druck“ auf der Musteranfrage übernimmt die
  Adresse als Einzelfelder (Vorname/Nachname/Straße/Nr./PLZ/Ort/Land) in den
  manuellen Druck; die Platzhalter [[Vorname]]/[[Nachname]]/[[Ort]] … ziehen sich
  daraus. „🖨 Direkt drucken“ (Modal) bleibt als Schnellweg.
- neuauftrag: Übernahme trägt die Einzelfelder mit (nicht nur free_text/placeholders).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-11 21:23:41 +02:00
parent 2b733d49d6
commit f4ba242953
2 changed files with 36 additions and 8 deletions

View File

@@ -154,10 +154,15 @@ const NeuAuftrag = defineComponent({
if (d.envelopeSenderScale) neu.envelopeSenderScale = d.envelopeSenderScale;
if (d.adressModus) neu.adressModus = d.adressModus;
if (Array.isArray(d.rows) && d.rows.length) {
neu.rows = d.rows.map((r) => ({
free_text: String(r.free_text || ''),
placeholders: (r.placeholders && typeof r.placeholders === 'object') ? { ...r.placeholders } : {},
}));
neu.rows = d.rows.map((r) => {
const row = {
free_text: String(r.free_text || ''),
placeholders: (r.placeholders && typeof r.placeholders === 'object') ? { ...r.placeholders } : {},
};
// Einzelfelder (Vorname, Nachname, Straße …) mitübernehmen, wenn vorhanden.
for (const [key] of FELDER) if (r[key] != null) row[key] = String(r[key]);
return row;
});
}
neu.previewSession = null;
neu.msg = 'Aus Auftrag übernommen – anpassen, dann Vorschau/Anlegen.';

View File

@@ -692,9 +692,10 @@ const Board = defineComponent({
// ── Muster: manueller Druck ──
// Namensteile der Anfrage (Adresse hat Vorrang vor dem freien Namensfeld).
function musterNamen() {
const a = manuell.req?.address && typeof manuell.req.address === 'object' ? manuell.req.address : {};
const name = manuell.req?.name || '';
function musterNamen(req) {
const q = req || manuell.req;
const a = q?.address && typeof q.address === 'object' ? q.address : {};
const name = q?.name || '';
const teile = name.split(' ');
return {
anrede: a.salutation || a.anrede || '',
@@ -772,6 +773,27 @@ const Board = defineComponent({
await laden();
} catch (e) { manuell.err = e?.response?.data?.detail || e?.response?.data?.error || e?.message || 'Fehlgeschlagen.'; manuell.msg = ''; }
}
// Musteranfrage → manueller Druck: Adresse als Einzelfelder übernehmen (die
// Platzhalter [[Vorname]]/[[Nachname]]/[[Ort]] … ziehen sich daraus). Der
// Betreiber schreibt/wählt den Text dann selbst im manuellen Druck.
function musterUebernehmen(req) {
const n = musterNamen(req);
// „Straße Hausnr." best effort trennen (führende Straße, hintere Nummer).
const roh = String(n.strasse || '').trim();
const m = roh.match(/^(.*?)[\s,]+(\d+\s*[a-zA-Z]?)$/);
const row = {
first_name: n.vor, last_name: n.nach,
street: m ? m[1].trim() : roh, house_no: m ? m[2].trim() : '',
zip: n.plz, city: n.ort, country: n.land,
};
try {
localStorage.setItem('skrift_neuauftrag_uebernahme', JSON.stringify({
product: req.product || '', adressModus: 'felder', rows: [row],
}));
const base = window.location.pathname.split('/admin/')[0] + '/admin/';
window.location.href = base + 'skrift-neuauftrag';
} catch (e) { flash('Übernahme fehlgeschlagen.'); }
}
// ── Empfänger-Drawer (mit Dokument-Vorschau je Zeile) ──
// Zerlegt einen Dateinamen in Brief-Nummer und Seite:
@@ -1088,7 +1110,8 @@ const Board = defineComponent({
const nachricht = req.message ? subdued(req.message, 'margin:0 0 10px;white-space:pre-wrap;') : null;
const aktionen = h('div', { style: 'display:flex;gap:8px;flex-wrap:wrap;' }, [
// Muster (Druckprodukt) → manueller Druck; individuelles Angebot → kein Druck.
istMuster ? btn('🖨 Muster drucken', () => openMuster(req), 'primary') : null,
istMuster ? btn('✍ In manuellen Druck', () => musterUebernehmen(req), 'primary') : null,
istMuster ? btn('🖨 Direkt drucken', () => openMuster(req)) : null,
btn('👤 Details', () => openReqInfo(req)),
]);
return h('div', { key: 'r' + req.id, style: CARD + `margin-bottom:14px;border-left:4px solid ${istMuster ? FARBE_MUSTER : FARBE_ANGEBOT};` }, [kopf, meta, nachricht, aktionen]);