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.' }),
|
||||
] },
|
||||
|
||||
// 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.
|
||||
{ collection: 'offer_requests', meta: { icon: 'request_quote', note: 'Angebots- und Musteranfragen aus der App.' }, fields: [
|
||||
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_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_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: '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 },
|
||||
@@ -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: '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.
|
||||
const es = await api('GET', '/items/email_settings');
|
||||
@@ -829,13 +845,23 @@ async function applySeed() {
|
||||
});
|
||||
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) ────────────────────────────────
|
||||
const BIZ = ['products', 'formats', 'motifs', 'price_items', 'pricing_settings',
|
||||
'vouchers', 'voucher_redemptions', 'orders', 'order_entries', 'order_addons', 'jobs', 'status_history',
|
||||
'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.
|
||||
const OWN_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 });
|
||||
// Unter „Einstellungen"
|
||||
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 });
|
||||
// Reine Detail-/Technik-Collections aus der Navigation nehmen (Signaturen und
|
||||
// Rabatte werden direkt am Kundenkonto gepflegt, nicht als eigener Menüpunkt).
|
||||
|
||||
Reference in New Issue
Block a user