Kundenangebote (customer_offers) + Absender-Uebernahme-Fix

- Bootstrap: Collection customer_offers (Kunde+Produkt, Name-Zusatz, Aufschlaege/Stueck,
  mehrseitig erlauben, Notiz) + Order-Felder customer_offer/product_name_suffix.
- orders: calculatePrice addiert Angebots-Aufschlaege (serverseitig geprueft),
  Endpunkt /my-offers, POST / speichert Angebot + Name-Zusatz.
- produktion: 'In manuellen Druck uebernehmen' traegt jetzt auch Kuvert-Absender + Groesse mit.
- neuauftrag: uebernimmt Absender-Felder aus dem Auftrag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-03 12:10:28 +02:00
parent a44515de89
commit 1b2541e307
4 changed files with 71 additions and 3 deletions

View File

@@ -286,6 +286,8 @@ const collections = [
f('own_cards', 'boolean', { interface: 'boolean', default: false, note: 'Eigene Karten (≤ 240 g/m²).' }),
f('text_briefing', 'text', { interface: 'input-multiline', note: 'Nur bei Schreibservice.' }),
f('text_template', 'text', { interface: 'input-multiline', note: 'Text mit [[Platzhaltern]].' }),
f('customer_offer', 'integer', { interface: 'input', note: 'ID des gewählten Kundenangebots (Aufschläge sind im Preis).' }),
f('product_name_suffix', 'string', { interface: 'input', note: 'Namens-Zusatz aus dem Kundenangebot, z. B. „auf bedrucktem Papier".' }),
f('preview_session', 'string', { interface: 'input', note: 'Vorschau-Session – gezeigte Dokumente werden 1:1 übernommen.' }),
// Hochgeladenes Dokument (Datei-Produkte, z. B. zu unterschreibendes PDF/Word).
{ field: 'source_file', type: 'uuid',
@@ -516,6 +518,23 @@ const collections = [
{ field: 'date_created', type: 'timestamp', meta: { interface: 'datetime', readonly: true, special: ['date-created'] }, schema: {} },
] },
// Kundenspezifische Angebote: frei benannte Aufschläge (pro Stück) + Namens-Zusatz,
// die der eingeloggte Kunde im Konfigurator auswählt. Kein Festpreis (Phase 2).
{ collection: 'customer_offers', meta: { icon: 'local_offer', note: 'Kundenangebote: Aufschläge/Name-Zusatz je Kunde+Produkt (Kunde wählt im Konfigurator).' }, fields: [
m2o('customer', 'directus_users', { onDelete: 'CASCADE' }),
m2o('product', 'products', { onDelete: 'CASCADE' }),
f('label', 'string', { interface: 'input', note: 'Angezeigte Bezeichnung, z. B. „Auf bedrucktem Papier".' }),
f('name_suffix', 'string', { interface: 'input', note: 'Zusatz an den Produktnamen, z. B. „auf bedrucktem Papier".' }),
f('surcharges', 'json', { interface: 'list', note: 'Aufschläge pro Stück (netto): Bezeichnung + Betrag.', options: { fields: [
{ field: 'label', type: 'string', name: 'Bezeichnung', meta: { interface: 'input', width: 'half', options: { placeholder: 'z. B. bedrucktes Papier' } } },
{ field: 'amount', type: 'float', name: 'Betrag netto (€/Stück)', meta: { interface: 'input', width: 'half' } },
] } }),
f('allow_multi_page', 'boolean', { interface: 'boolean', default: false, note: 'Mehrseitigen Druck erlauben.' }),
f('note', 'text', { interface: 'input-multiline', note: 'Hinweis an den Kunden (optional).' }),
f('active', 'boolean', { interface: 'boolean', default: true }),
{ field: 'date_created', type: 'timestamp', meta: { interface: 'datetime', readonly: true, special: ['date-created'] }, schema: {} },
] },
// E-Mail-Vorlagen (Betreff + HTML-Text, WYSIWYG). Ein Datensatz je Ereignis.
{ collection: 'email_templates', meta: { icon: 'mail', note: 'E-Mail-Vorlagen (Betreff + Text).' }, fields: [
f('key', 'string', { interface: 'input', unique: true, required: true, note: 'Ereignis-Schlüssel (login_code, order_created, versendet …).' }),