Postkarten-Maße-Fix, Sammelversand-Staffel, Extern-Format, Mustertexte
- render_formats: Upsert statt nur-anlegen → korrekte A6-Maße werden beim Bootstrap erzwungen (behebt „Postkarten passen nicht, weder quer noch hoch") - Sammelversand-Staffel: bis 5 Schriftstücke 1,80 € (neues Preisitem sammelversand_klein), ab 6 der reguläre Satz – Backend + App-Option - Extern-Modus: Postkarten-Format (hoch/quer) wieder wählbar; optionaler ?format=-Parameter; kein Auto-Vorbelegen bei mehreren Formaten - Unbegrenzte Mustertexte: neue Collection muster_texts (Dropdown im „Manueller Druck", Du/Sie als Fallback + Seeds) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -504,6 +504,15 @@ const collections = [
|
|||||||
f('text_sie', 'text', { interface: 'input-multiline', note: 'Standard-Mustertext (Sie-Form). Platzhalter [[abschnitt]] wird im Druck-Dialog gefüllt.' }),
|
f('text_sie', 'text', { interface: 'input-multiline', note: 'Standard-Mustertext (Sie-Form). Platzhalter [[abschnitt]] wird im Druck-Dialog gefüllt.' }),
|
||||||
] },
|
] },
|
||||||
|
|
||||||
|
// Frei anlegbare Mustertexte (beliebig viele) – erscheinen im „Manueller Druck"-
|
||||||
|
// Dropdown. Ersetzt langfristig die feste Du/Sie-Vorgabe (die als Fallback bleibt).
|
||||||
|
{ collection: 'muster_texts', meta: { icon: 'science', note: 'Frei anlegbare Mustertexte für den manuellen Druck.' }, fields: [
|
||||||
|
f('label', 'string', { interface: 'input', required: true, note: 'Bezeichnung im Dropdown.' }),
|
||||||
|
f('text', 'text', { interface: 'input-multiline', note: 'Mustertext. Platzhalter [[…]] erlaubt.' }),
|
||||||
|
f('sort', 'integer', { interface: 'input' }),
|
||||||
|
f('active', 'boolean', { interface: 'boolean', default: true }),
|
||||||
|
] },
|
||||||
|
|
||||||
// Angebots- und Musteranfragen aus der App.
|
// Angebots- und Musteranfragen aus der App.
|
||||||
{ collection: 'offer_requests', meta: { icon: 'request_quote', note: 'Angebots- und Musteranfragen aus der App.' }, fields: [
|
{ collection: 'offer_requests', meta: { icon: 'request_quote', note: 'Angebots- und Musteranfragen aus der App.' }, fields: [
|
||||||
dropdown('type', ['angebot', 'muster'], { default: 'angebot' }),
|
dropdown('type', ['angebot', 'muster'], { default: 'angebot' }),
|
||||||
@@ -667,6 +676,7 @@ async function applySeed() {
|
|||||||
{ key: 'porto_inland', label: 'Porto Inland', category: 'versand', price: 2.2, unit: 'pro_stueck', active: true },
|
{ key: 'porto_inland', label: 'Porto Inland', category: 'versand', price: 2.2, unit: 'pro_stueck', active: true },
|
||||||
{ key: 'porto_ausland', label: 'Porto Ausland', category: 'versand', price: 2.5, unit: 'pro_stueck', active: true },
|
{ key: 'porto_ausland', label: 'Porto Ausland', category: 'versand', price: 2.5, unit: 'pro_stueck', active: true },
|
||||||
{ key: 'sammelversand', label: 'Sammelversand', category: 'versand', price: 4.95, unit: 'einmalig', active: true },
|
{ key: 'sammelversand', label: 'Sammelversand', category: 'versand', price: 4.95, unit: 'einmalig', active: true },
|
||||||
|
{ key: 'sammelversand_klein', label: 'Sammelversand (bis 5 Stück)', category: 'versand', price: 1.80, unit: 'einmalig', active: true },
|
||||||
{ key: 'kuvert', label: 'Kuvert', category: 'kuvert', price: 0.5, unit: 'pro_stueck', active: true },
|
{ key: 'kuvert', label: 'Kuvert', category: 'kuvert', price: 0.5, unit: 'pro_stueck', active: true },
|
||||||
{ key: 'beschriftung', label: 'Kuvert-Beschriftung', category: 'beschriftung', price: 0.5, unit: 'pro_stueck', active: true },
|
{ key: 'beschriftung', label: 'Kuvert-Beschriftung', category: 'beschriftung', price: 0.5, unit: 'pro_stueck', active: true },
|
||||||
{ key: 'schreibservice', label: 'Schreibservice', category: 'zusatzleistung', price: 0, unit: 'einmalig', active: true },
|
{ key: 'schreibservice', label: 'Schreibservice', category: 'zusatzleistung', price: 0, unit: 'einmalig', active: true },
|
||||||
@@ -804,7 +814,13 @@ async function applySeed() {
|
|||||||
{ key: 'din_lang', name: 'DIN Lang Kuvert', kind: 'umschlag', page_width_mm: 220, page_height_mm: 110, margin_top_mm: 50, margin_left_mm: 10, line_height_factor: 1.2, active: true },
|
{ key: 'din_lang', name: 'DIN Lang Kuvert', kind: 'umschlag', page_width_mm: 220, page_height_mm: 110, margin_top_mm: 50, margin_left_mm: 10, line_height_factor: 1.2, active: true },
|
||||||
{ key: 'c6', name: 'C6 Kuvert', kind: 'umschlag', page_width_mm: 162, page_height_mm: 114, margin_top_mm: 60, margin_left_mm: 10, line_height_factor: 1.2, active: true },
|
{ key: 'c6', name: 'C6 Kuvert', kind: 'umschlag', page_width_mm: 162, page_height_mm: 114, margin_top_mm: 60, margin_left_mm: 10, line_height_factor: 1.2, active: true },
|
||||||
];
|
];
|
||||||
for (const rf of renderFormats) await seedItem('render_formats', 'key', rf);
|
// Upsert (nicht nur anlegen), damit falsche Alt-Maße korrigiert werden – z. B.
|
||||||
|
// Postkarten (a6p/a6l), die sonst nicht aufs Kartenformat passen.
|
||||||
|
for (const rf of renderFormats) {
|
||||||
|
const vorhanden = await api('GET', `/items/render_formats?filter[key][_eq]=${encodeURIComponent(rf.key)}&limit=1&fields=id`);
|
||||||
|
if (vorhanden && vorhanden.length) await api('PATCH', `/items/render_formats/${vorhanden[0].id}`, rf);
|
||||||
|
else { await api('POST', '/items/render_formats', rf); log('seed + render_formats.' + rf.key); }
|
||||||
|
}
|
||||||
|
|
||||||
// email_settings (Singleton) – Signatur nur setzen, wenn leer.
|
// email_settings (Singleton) – Signatur nur setzen, wenn leer.
|
||||||
const es = await api('GET', '/items/email_settings');
|
const es = await api('GET', '/items/email_settings');
|
||||||
@@ -829,13 +845,23 @@ async function applySeed() {
|
|||||||
});
|
});
|
||||||
log('seed singleton muster_settings');
|
log('seed singleton muster_settings');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// muster_texts – Starteinträge (Du/Sie) nur anlegen, wenn noch keine da sind.
|
||||||
|
const mtx = await api('GET', '/items/muster_texts?limit=1');
|
||||||
|
if (!mtx || !mtx.length) {
|
||||||
|
await api('POST', '/items/muster_texts', { label: 'Sie-Form', sort: 1, active: true,
|
||||||
|
text: 'Sehr geehrte/r [[Anrede]] [[Nachname]],\n\nschön, dass Sie Skrift ausprobieren! Dieser Brief wurde von einem Roboter mit einem echten Stift geschrieben.\n\n[[abschnitt]]\n\nMit freundlichen Grüßen\nIhr Skrift-Team' });
|
||||||
|
await api('POST', '/items/muster_texts', { label: 'Du-Form', sort: 2, active: true,
|
||||||
|
text: 'Hallo [[Vorname]],\n\nschön, dass Du Skrift ausprobierst! Dieser Brief wurde von einem Roboter mit einem echten Stift geschrieben.\n\n[[abschnitt]]\n\nHerzliche Grüße\nDein Skrift-Team' });
|
||||||
|
log('seed muster_texts');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Rollen / Policies / Rechte (Directus 11) ────────────────────────────────
|
// ── Rollen / Policies / Rechte (Directus 11) ────────────────────────────────
|
||||||
const BIZ = ['products', 'formats', 'motifs', 'price_items', 'pricing_settings',
|
const BIZ = ['products', 'formats', 'motifs', 'price_items', 'pricing_settings',
|
||||||
'vouchers', 'voucher_redemptions', 'orders', 'order_entries', 'order_addons', 'jobs', 'status_history',
|
'vouchers', 'voucher_redemptions', 'orders', 'order_entries', 'order_addons', 'jobs', 'status_history',
|
||||||
'offer_requests', 'signatures', 'customer_discounts', 'customer_products',
|
'offer_requests', 'signatures', 'customer_discounts', 'customer_products',
|
||||||
'email_templates', 'email_settings', 'muster_settings', 'machines', 'format_templates', 'render_formats', 'test_prints'];
|
'email_templates', 'email_settings', 'muster_settings', 'muster_texts', 'machines', 'format_templates', 'render_formats', 'test_prints'];
|
||||||
// Kunde = Login-Konto: Aufträge hängen direkt am Nutzer.
|
// Kunde = Login-Konto: Aufträge hängen direkt am Nutzer.
|
||||||
const OWN_ORDER = { customer: { _eq: '$CURRENT_USER' } };
|
const OWN_ORDER = { customer: { _eq: '$CURRENT_USER' } };
|
||||||
const OWN_VIA_ORDER = { order: { customer: { _eq: '$CURRENT_USER' } } };
|
const OWN_VIA_ORDER = { order: { customer: { _eq: '$CURRENT_USER' } } };
|
||||||
@@ -1024,7 +1050,7 @@ async function organizeNav() {
|
|||||||
await patch(col, { group: null, hidden: false });
|
await patch(col, { group: null, hidden: false });
|
||||||
// Unter „Einstellungen"
|
// Unter „Einstellungen"
|
||||||
for (const col of ['products', 'formats', 'motifs', 'price_items', 'pricing_settings', 'offer_requests',
|
for (const col of ['products', 'formats', 'motifs', 'price_items', 'pricing_settings', 'offer_requests',
|
||||||
'email_templates', 'email_settings', 'muster_settings', 'machines', 'format_templates', 'render_formats', 'test_prints'])
|
'email_templates', 'email_settings', 'muster_settings', 'muster_texts', 'machines', 'format_templates', 'render_formats', 'test_prints'])
|
||||||
await patch(col, { group: FOLDER, hidden: false });
|
await patch(col, { group: FOLDER, hidden: false });
|
||||||
// Reine Detail-/Technik-Collections aus der Navigation nehmen (Signaturen und
|
// Reine Detail-/Technik-Collections aus der Navigation nehmen (Signaturen und
|
||||||
// Rabatte werden direkt am Kundenkonto gepflegt, nicht als eigener Menüpunkt).
|
// Rabatte werden direkt am Kundenkonto gepflegt, nicht als eigener Menüpunkt).
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ const NeuAuftrag = defineComponent({
|
|||||||
const formate = ref([]);
|
const formate = ref([]);
|
||||||
const verbotenRe = ref(null);
|
const verbotenRe = ref(null);
|
||||||
const musterTexte = ref({ text_du: '', text_sie: '' });
|
const musterTexte = ref({ text_du: '', text_sie: '' });
|
||||||
|
// Frei anlegbare Mustertexte (Collection muster_texts). Fallback: Du/Sie aus muster_settings.
|
||||||
|
const musterListe = ref([]);
|
||||||
const geladen = ref(false);
|
const geladen = ref(false);
|
||||||
// Aktives Unterwerkzeug: 'neu' (manueller Druck) oder 'signatur' (Unterschriftenservice).
|
// Aktives Unterwerkzeug: 'neu' (manueller Druck) oder 'signatur' (Unterschriftenservice).
|
||||||
const ansicht = ref('neu');
|
const ansicht = ref('neu');
|
||||||
@@ -79,15 +81,17 @@ const NeuAuftrag = defineComponent({
|
|||||||
|
|
||||||
async function laden() {
|
async function laden() {
|
||||||
try {
|
try {
|
||||||
const [p, f, ps, mt] = await Promise.all([
|
const [p, f, ps, mt, mtx] = await Promise.all([
|
||||||
api.get('/items/products', { params: { limit: -1, filter: { active: { _eq: true }, type: { _in: ['letter', 'postcard'] } }, fields: 'key,name,type' } }),
|
api.get('/items/products', { params: { limit: -1, filter: { active: { _eq: true }, type: { _in: ['letter', 'postcard'] } }, fields: 'key,name,type' } }),
|
||||||
api.get('/items/formats', { params: { limit: -1, filter: { active: { _eq: true } }, fields: 'key,name,product.key' } }),
|
api.get('/items/formats', { params: { limit: -1, filter: { active: { _eq: true } }, fields: 'key,name,product.key' } }),
|
||||||
api.get('/items/pricing_settings', { params: { fields: 'char_whitelist' } }).catch(() => ({ data: { data: {} } })),
|
api.get('/items/pricing_settings', { params: { fields: 'char_whitelist' } }).catch(() => ({ data: { data: {} } })),
|
||||||
api.get('/items/muster_settings', { params: { fields: 'text_du,text_sie' } }).catch(() => ({ data: { data: {} } })),
|
api.get('/items/muster_settings', { params: { fields: 'text_du,text_sie' } }).catch(() => ({ data: { data: {} } })),
|
||||||
|
api.get('/items/muster_texts', { params: { limit: -1, filter: { active: { _eq: true } }, sort: 'sort', fields: 'id,label,text' } }).catch(() => ({ data: { data: [] } })),
|
||||||
]);
|
]);
|
||||||
produkte.value = p.data?.data || [];
|
produkte.value = p.data?.data || [];
|
||||||
formate.value = f.data?.data || [];
|
formate.value = f.data?.data || [];
|
||||||
musterTexte.value = mt.data?.data || { text_du: '', text_sie: '' };
|
musterTexte.value = mt.data?.data || { text_du: '', text_sie: '' };
|
||||||
|
musterListe.value = mtx.data?.data || [];
|
||||||
const wl = ps.data?.data?.char_whitelist;
|
const wl = ps.data?.data?.char_whitelist;
|
||||||
// Zeilenumbrüche immer erlauben (Brieftext ist mehrzeilig). Einzeilige
|
// Zeilenumbrüche immer erlauben (Brieftext ist mehrzeilig). Einzeilige
|
||||||
// Felder entfernen \n/\r ohnehin separat, daher hier gefahrlos.
|
// Felder entfernen \n/\r ohnehin separat, daher hier gefahrlos.
|
||||||
@@ -207,8 +211,11 @@ const NeuAuftrag = defineComponent({
|
|||||||
docs: [], previewSession: null, pLaedt: false, msg: '', err: '', hinweis: '', lb: '',
|
docs: [], previewSession: null, pLaedt: false, msg: '', err: '', hinweis: '', lb: '',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const musterEinfuegen = (form) => {
|
const musterEinfuegen = (wert) => {
|
||||||
const t = form === 'du' ? musterTexte.value.text_du : musterTexte.value.text_sie;
|
// Freie Mustertexte (per ID) bevorzugt; sonst Fallback Du/Sie.
|
||||||
|
let t = '';
|
||||||
|
if (wert === 'du' || wert === 'sie') t = wert === 'du' ? musterTexte.value.text_du : musterTexte.value.text_sie;
|
||||||
|
else t = (musterListe.value.find((m) => String(m.id) === String(wert)) || {}).text || '';
|
||||||
if (!t) return;
|
if (!t) return;
|
||||||
neu.text = neu.text.trim() ? `${neu.text}\n\n${t}` : t;
|
neu.text = neu.text.trim() ? `${neu.text}\n\n${t}` : t;
|
||||||
neu.previewSession = null;
|
neu.previewSession = null;
|
||||||
@@ -287,11 +294,12 @@ const NeuAuftrag = defineComponent({
|
|||||||
const b3 = h('div', { style: BEREICH }, [
|
const b3 = h('div', { style: BEREICH }, [
|
||||||
h('div', { style: 'display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px;' }, [
|
h('div', { style: 'display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px;' }, [
|
||||||
bereichKopf('✍ Text'),
|
bereichKopf('✍ Text'),
|
||||||
h('select', { style: WSELECT + 'font-size:13px;padding:7px 10px;width:auto;', onChange: (e) => { if (e.target.value) { musterEinfuegen(e.target.value); e.target.value = ''; } } }, [
|
h('select', { style: WSELECT + 'font-size:13px;padding:7px 10px;width:auto;', onChange: (e) => { if (e.target.value) { musterEinfuegen(e.target.value); e.target.value = ''; } } },
|
||||||
h('option', { value: '' }, 'Mustertext einfügen …'),
|
[h('option', { value: '' }, 'Mustertext einfügen …')].concat(
|
||||||
h('option', { value: 'sie' }, 'Sie-Form'),
|
musterListe.value.length
|
||||||
h('option', { value: 'du' }, 'Du-Form'),
|
? musterListe.value.map((m) => h('option', { value: m.id }, m.label || `Text ${m.id}`))
|
||||||
]),
|
: [h('option', { value: 'sie' }, 'Sie-Form'), h('option', { value: 'du' }, 'Du-Form')],
|
||||||
|
)),
|
||||||
]),
|
]),
|
||||||
label(`Brieftext · ${neu.text.length} Zeichen · [[Platzhalter]] erlaubt`),
|
label(`Brieftext · ${neu.text.length} Zeichen · [[Platzhalter]] erlaubt`),
|
||||||
h('textarea', { value: neu.text, rows: 8, style: WFELD + 'width:100%;font-family:var(--family-monospace,monospace);', onInput: (e) => { neu.text = saeubere(e.target.value); neu.previewSession = null; } }),
|
h('textarea', { value: neu.text, rows: 8, style: WFELD + 'width:100%;font-family:var(--family-monospace,monospace);', onInput: (e) => { neu.text = saeubere(e.target.value); neu.previewSession = null; } }),
|
||||||
|
|||||||
@@ -344,7 +344,10 @@ const handler = (router, { services, getSchema, logger }) => {
|
|||||||
add('Porto Inland', priceOf('porto_inland') * inlandCount, true);
|
add('Porto Inland', priceOf('porto_inland') * inlandCount, true);
|
||||||
add('Porto Ausland', priceOf('porto_ausland') * auslandCount, true);
|
add('Porto Ausland', priceOf('porto_ausland') * auslandCount, true);
|
||||||
} else {
|
} else {
|
||||||
add('Sammelversand', priceOf('sammelversand'), false);
|
// Sammelversand-Staffel: bis 5 Schriftstücke günstiger (sammelversand_klein),
|
||||||
|
// ab 6 der reguläre Satz. Fallback 1,80 €, falls der kleine Satz fehlt.
|
||||||
|
const sammelKlein = priceItems['sammelversand_klein'] ? priceOf('sammelversand_klein') : 1.80;
|
||||||
|
add('Sammelversand', menge <= 5 ? sammelKlein : priceOf('sammelversand'), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3) Kuvert + Beschriftung – NUR bei Sammelversand.
|
// 3) Kuvert + Beschriftung – NUR bei Sammelversand.
|
||||||
|
|||||||
@@ -499,14 +499,14 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri
|
|||||||
}
|
}
|
||||||
}, [vorwahlProdukt, product, products]);
|
}, [vorwahlProdukt, product, products]);
|
||||||
|
|
||||||
// Genau ein Format → still setzen (kein Format-Schritt nötig). Im Extern-Modus
|
// Genau ein Format → still setzen (kein Format-Schritt nötig). Bei mehreren
|
||||||
// gibt es keinen Format-Schritt → dort immer das erste Format vorbelegen.
|
// Formaten (z. B. Postkarte hoch/quer) NICHT automatisch vorbelegen – der Kunde
|
||||||
|
// wählt im Format-Schritt (auch im Extern-Modus).
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!produktFormate.length) return;
|
if (produktFormate.length === 1 && format !== produktFormate[0].key) {
|
||||||
if ((produktFormate.length === 1 || (externModus && !format)) && format !== produktFormate[0].key) {
|
|
||||||
setFormat(produktFormate[0].key);
|
setFormat(produktFormate[0].key);
|
||||||
}
|
}
|
||||||
}, [produktFormate, format, externModus]);
|
}, [produktFormate, format]);
|
||||||
|
|
||||||
const nurUpload = quantity > TABELLEN_GRENZE;
|
const nurUpload = quantity > TABELLEN_GRENZE;
|
||||||
|
|
||||||
@@ -568,6 +568,7 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri
|
|||||||
const v = searchParams.get('versand'); if (v === 'einzeln' || v === 'sammel') setShippingType(v);
|
const v = searchParams.get('versand'); if (v === 'einzeln' || v === 'sammel') setShippingType(v);
|
||||||
const k = searchParams.get('kuvert'); if (k === '1' || k === '0') setNeedsEnvelope(k === '1');
|
const k = searchParams.get('kuvert'); if (k === '1' || k === '0') setNeedsEnvelope(k === '1');
|
||||||
const b = searchParams.get('beschriftung'); if (b === 'empfaenger' || b === 'freitext' || b === 'keine') setLabeling(b);
|
const b = searchParams.get('beschriftung'); if (b === 'empfaenger' || b === 'freitext' || b === 'keine') setLabeling(b);
|
||||||
|
const fmt = searchParams.get('format'); if (fmt) setFormat(fmt);
|
||||||
const m = parseInt(searchParams.get('menge') || '', 10);
|
const m = parseInt(searchParams.get('menge') || '', 10);
|
||||||
if (Number.isFinite(m) && m > 0) { setQuantity(m); setQuantityChosen(true); setMengeText(String(m)); }
|
if (Number.isFinite(m) && m > 0) { setQuantity(m); setQuantityChosen(true); setMengeText(String(m)); }
|
||||||
// Nur einmal beim Betreten des Extern-Modus anwenden.
|
// Nur einmal beim Betreten des Extern-Modus anwenden.
|
||||||
@@ -601,6 +602,9 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri
|
|||||||
// legt der Betreiber über die Direktlink-Parameter fest (s. Extern-Preset).
|
// legt der Betreiber über die Direktlink-Parameter fest (s. Extern-Preset).
|
||||||
// Keine Preise, keine Rechnungsdaten, keine Zahlung.
|
// Keine Preise, keine Rechnungsdaten, keine Zahlung.
|
||||||
? [
|
? [
|
||||||
|
// Format wählbar, wenn es eine echte Wahl gibt (z. B. Postkarte hoch/quer)
|
||||||
|
// und nicht per ?format=… vorgegeben wurde.
|
||||||
|
...(brauchtFormatSchritt && !searchParams.get('format') ? ['Format'] : []),
|
||||||
...(empfaengerSchritt ? [empfaengerSchritt] : []),
|
...(empfaengerSchritt ? [empfaengerSchritt] : []),
|
||||||
'Text',
|
'Text',
|
||||||
'Rechnungsdaten',
|
'Rechnungsdaten',
|
||||||
@@ -808,7 +812,7 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri
|
|||||||
if (!it || !it.price) return null;
|
if (!it || !it.price) return null;
|
||||||
// Nur Sammelversand wird für alle identisch (netto) angezeigt. Einzelversand
|
// Nur Sammelversand wird für alle identisch (netto) angezeigt. Einzelversand
|
||||||
// (Porto) und alles andere: Privat=brutto, Unternehmen=netto.
|
// (Porto) und alles andere: Privat=brutto, Unternehmen=netto.
|
||||||
const ohneMwStAnzeige = key === 'sammelversand';
|
const ohneMwStAnzeige = key === 'sammelversand' || key === 'sammelversand_klein';
|
||||||
const betrag = ohneMwStAnzeige || personType === 'unternehmen'
|
const betrag = ohneMwStAnzeige || personType === 'unternehmen'
|
||||||
? it.price
|
? it.price
|
||||||
: it.price * (1 + mwst / 100);
|
: it.price * (1 + mwst / 100);
|
||||||
@@ -1235,7 +1239,7 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri
|
|||||||
preis={aufpreis('porto_inland')} />
|
preis={aufpreis('porto_inland')} />
|
||||||
<Option name="ship" selected={shippingType === 'sammel'} onSelect={() => waehleVersand('sammel')}
|
<Option name="ship" selected={shippingType === 'sammel'} onSelect={() => waehleVersand('sammel')}
|
||||||
title="Sammelversand an Sie" desc="Sie erhalten alles zur eigenen Verteilung"
|
title="Sammelversand an Sie" desc="Sie erhalten alles zur eigenen Verteilung"
|
||||||
preis={aufpreis('sammelversand')} />
|
preis={aufpreis(quantity <= 5 ? 'sammelversand_klein' : 'sammelversand')} />
|
||||||
</div>
|
</div>
|
||||||
{shippingType === 'einzeln' && (
|
{shippingType === 'einzeln' && (
|
||||||
<p className="sk-note" style={{ marginTop: 'var(--sk-space-3)' }}>
|
<p className="sk-note" style={{ marginTop: 'var(--sk-space-3)' }}>
|
||||||
|
|||||||
Reference in New Issue
Block a user