Produktions-Board: Laender-Anzeige + getrennter Druck DE/Welt (ohne Backend-Split)
- Auftragskarte: Chip 'DE N / Welt M weltweit' (aus count_inland/count_ausland). - Empfaenger-Dialog: Auslands-Empfaenger mit 'weltweit' markiert. - Druck-Dialog: Schnellwahl 'nur Deutschland' / 'nur Welt' fuellt die Nummern je Gruppe -> Schriftstuecke und Kuverts getrennt druckbar, Auftrag bleibt einer. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -104,6 +104,17 @@ function chip(text, farbe) {
|
||||
function subdued(text, extra) {
|
||||
return h('div', { style: `color:var(--foreground-subdued);font-size:13px;${extra || ''}` }, text);
|
||||
}
|
||||
// Zielland-Erkennung je Empfänger (wie im Backend): Deutschland, wenn Land DE/leer,
|
||||
// „Deutschland" im Freitext, „D-" vor der PLZ oder nur PLZ ohne Auslandshinweis.
|
||||
function zielInland(e) {
|
||||
const land = String(e?.country || '').trim();
|
||||
if (land) return /^(de|deu|d|deutschland|germany)$/i.test(land);
|
||||
const txt = String(e?.free_text || '');
|
||||
if (/deutschland|germany/i.test(txt)) return true;
|
||||
if (/\bd-\s?\d{4,5}\b/i.test(txt)) return true;
|
||||
if (/(österreich|schweiz|austria|switzerland|frankreich|france|italien|italy|niederlande|netherlands|belgien|belgium|luxemburg|luxembourg|spanien|spain|portugal|usa|vereinigte staaten|united states|kanada|canada|england|großbritannien|grossbritannien|united kingdom|dänemark|denmark|schweden|sweden|norwegen|norway|finnland|finland|polen|poland|tschechien|czech|ungarn|hungary|griechenland|greece|irland|ireland|australien|australia|liechtenstein)/i.test(txt)) return false;
|
||||
return true;
|
||||
}
|
||||
// Segmentierter Umschalter mit sichtbarem Rahmen: Optionen teilen sich die Breite.
|
||||
function segToggle(value, opts, onSel) {
|
||||
return h('div', { style: 'display:flex;width:100%;border:1px solid var(--border-normal);border-radius:8px;overflow:hidden;background:var(--background-subdued,#f1f4f9);' },
|
||||
@@ -155,7 +166,7 @@ const Board = defineComponent({
|
||||
const muster = ref({ text_du: '', text_sie: '' });
|
||||
|
||||
// ── Modale ──
|
||||
const druck = reactive({ open: false, order: null, machine: null, mode: 'queue', busy: false, brief: null, umschlag: null, msg: '', err: '' });
|
||||
const druck = reactive({ open: false, order: null, machine: null, mode: 'queue', busy: false, brief: null, umschlag: null, msg: '', err: '', deNums: '', intNums: '', deN: 0, intN: 0 });
|
||||
const manuell = reactive({ open: false, req: null, form: 'sie', font: 'tilda', format: 'a4', template: null, machine: null, mode: 'queue', text: '', msg: '', err: '' });
|
||||
const empf = reactive({ open: false, mode: 'order', titel: '', order: null, suche: '', rows: [], files: [],
|
||||
info: '', laden: false, selected: null, pl: '', pe: '', pLoad: false, perr: '', lb: '', lbTitel: '' });
|
||||
@@ -547,7 +558,26 @@ const Board = defineComponent({
|
||||
druck.mode = 'queue'; druck.msg = ''; druck.err = '';
|
||||
druck.brief = { enabled: true, numbers: `1-${n}`, done: !!order.brief_gedruckt, ...tplToFelder(bt) };
|
||||
druck.umschlag = wantsEnv ? { enabled: true, numbers: `1-${n}`, done: !!order.kuvert_gedruckt, ...tplToFelder(et) } : null;
|
||||
druck.deNums = ''; druck.intNums = ''; druck.deN = 0; druck.intN = 0;
|
||||
druck.open = true;
|
||||
// Empfänger laden und nach Deutschland/Welt klassifizieren – für die Schnellwahl
|
||||
// „nur Deutschland" / „nur Welt" (getrennter Druck ohne Auftrags-Split).
|
||||
ladeDruckLaender(order);
|
||||
}
|
||||
async function ladeDruckLaender(order) {
|
||||
try {
|
||||
const r = await api.get('/items/order_entries', { params: {
|
||||
'filter[order][_eq]': order.id, sort: 'letter_number', limit: -1,
|
||||
fields: 'letter_number,country,free_text',
|
||||
} });
|
||||
const de = [], int = [];
|
||||
(r.data?.data || []).forEach((e, i) => {
|
||||
const nr = Number(e.letter_number) || (i + 1);
|
||||
(zielInland(e) ? de : int).push(nr);
|
||||
});
|
||||
druck.deNums = de.join(','); druck.intNums = int.join(',');
|
||||
druck.deN = de.length; druck.intN = int.length;
|
||||
} catch { /* Schnellwahl bleibt leer */ }
|
||||
}
|
||||
function druckTplWechsel(sec, tplId) {
|
||||
const t = templates.value.find((x) => String(x.id) === String(tplId));
|
||||
@@ -644,7 +674,11 @@ const Board = defineComponent({
|
||||
api.get('/items/order_entries', { params: { 'filter[order][_eq]': order.id, sort: 'letter_number', limit: -1, fields: '*' } }),
|
||||
api.get('/skrift-orders/files/' + encodeURIComponent(order.order_number)).catch(() => ({ data: { files: [] } })),
|
||||
]);
|
||||
empf.rows = (ent.data?.data || []).map((e) => ({ nr: e.letter_number, zeile: volleZeile(e), extra: extras(e) }));
|
||||
empf.rows = (ent.data?.data || []).map((e) => ({
|
||||
nr: e.letter_number, zeile: volleZeile(e),
|
||||
// Zielland kennzeichnen: Auslands-Empfänger deutlich markieren (DE = Standard).
|
||||
extra: [zielInland(e) ? null : '🌍 weltweit', extras(e)].filter(Boolean).join(' · '),
|
||||
}));
|
||||
empf.files = fl.data?.files || [];
|
||||
} catch (e) { empf.info = e?.message || 'Empfänger konnten nicht geladen werden.'; } finally { empf.laden = false; }
|
||||
}
|
||||
@@ -819,6 +853,10 @@ const Board = defineComponent({
|
||||
const meta = h('div', { style: 'display:flex;gap:6px;flex-wrap:wrap;margin:10px 0;' }, [
|
||||
chip(`${o.entries_count || 0} Briefe`),
|
||||
chip(o.needs_envelope ? `${o.entries_count || 0} Kuverts` : 'ohne Kuvert'),
|
||||
// Versandländer: getrennt sichtbar (Deutschland / weltweit), wenn gemischt bzw. Ausland.
|
||||
(Number(o.count_ausland) > 0)
|
||||
? chip(`🇩🇪 ${o.count_inland ?? 0} · 🌍 ${o.count_ausland} weltweit`, 'var(--primary-25,rgba(30,80,165,.14))')
|
||||
: null,
|
||||
chip(o.shipping_type === 'einzeln' ? 'Einzelversand' : 'Sammelversand'),
|
||||
o.shipping_day ? chip('📅 Versandtag: ' + o.shipping_day.charAt(0).toUpperCase() + o.shipping_day.slice(1), 'var(--primary-25,rgba(30,80,165,.14))') : null,
|
||||
chip(o.product?.name || 'Produkt?'),
|
||||
@@ -1001,6 +1039,11 @@ const Board = defineComponent({
|
||||
feldGrid(sec, secKey),
|
||||
h('div', { style: S_FELD + 'display:flex;flex-direction:column;gap:4px;' }, [
|
||||
h('label', { style: 'font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--foreground-subdued);' }, 'Zu druckende Nummern'),
|
||||
druck.intN > 0 ? h('div', { style: 'display:flex;gap:6px;flex-wrap:wrap;margin-bottom:6px;' }, [
|
||||
btn(`Alle (${druck.deN + druck.intN})`, () => { druck[secKey].numbers = `1-${Math.max(1, druck.deN + druck.intN)}`; }),
|
||||
druck.deN > 0 ? btn(`🇩🇪 nur Deutschland (${druck.deN})`, () => { druck[secKey].numbers = druck.deNums; }) : null,
|
||||
btn(`🌍 nur Welt (${druck.intN})`, () => { druck[secKey].numbers = druck.intNums; }),
|
||||
]) : null,
|
||||
h('input', { value: sec.numbers, placeholder: 'z. B. 1,4,8 oder 1-9 oder 1-3,5,8',
|
||||
style: 'border:none;background:transparent;color:var(--foreground-normal);font:inherit;font-size:14px;width:100%;padding:0;outline:none;',
|
||||
onInput: (e) => { druck[secKey].numbers = e.target.value; } }),
|
||||
|
||||
Reference in New Issue
Block a user