Kundenangebote: Auswahl im Konfigurator (Aufschlaege + Name-Zusatz)
All checks were successful
Build & Deploy / deploy (push) Successful in 43s

Eingeloggte Kunden sehen ihre Angebote (customer_offers) je Produkt und waehlen eins;
Aufschlaege pro Stueck flie\u00dfen serverseitig in den Preis, Name-Zusatz + Notiz sichtbar.
Quote/Order senden jetzt den Token (auth) mit, damit die Angebote greifen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-03 12:10:23 +02:00
parent 84427d8ca3
commit 1e90b8de09
2 changed files with 70 additions and 4 deletions

View File

@@ -296,11 +296,33 @@ export type QuoteInput = {
email?: string;
/** Segment für den Mengen-Multiplikator (B2B/B2C). */
person_type?: 'privat' | 'unternehmen';
/** Gewähltes Kundenangebot (ID) – Aufschläge werden serverseitig addiert. */
offer?: number;
};
/** Preis serverseitig berechnen lassen – der Client rechnet nie selbst. */
/** Preis serverseitig berechnen lassen – der Client rechnet nie selbst.
* auth:true, damit bei eingeloggten Kunden der Token mitgeht (Kundenangebote). */
export async function fetchQuote(input: QuoteInput): Promise<Quote> {
return request('/skrift-orders/quote', { method: 'POST', body: input, auth: false });
return request('/skrift-orders/quote', { method: 'POST', body: input, auth: true });
}
/* ── Kundenangebote (customer_offers) ───────────────────────────────────────── */
export type OfferSurcharge = { label: string; amount: number };
export type CustomerOffer = {
id: number;
label: string;
name_suffix?: string | null;
note?: string | null;
allow_multi_page?: boolean;
surcharges?: OfferSurcharge[] | null;
product?: { key: string; name: string } | null;
};
/** Angebote des eingeloggten Kunden für ein Produkt (leer, wenn nicht eingeloggt). */
export async function fetchMyOffers(productKey: string): Promise<CustomerOffer[]> {
const data = await request(`/skrift-orders/my-offers?product=${encodeURIComponent(productKey)}`, { auth: true });
return data?.offers ?? [];
}
/* ── Motive ───────────────────────────────────────────────────────────────── */
@@ -420,6 +442,8 @@ export type OrderInput = {
voucher_code?: string;
payment_method: 'paypal' | 'rechnung';
source?: string;
/** Gewähltes Kundenangebot (ID). */
offer?: number;
entries: unknown[];
/** Motiv aus dem Katalog (ID) bzw. hochgeladene Datei (Directus-Datei-ID). */
motif?: number;
@@ -436,7 +460,9 @@ export type OrderResult = {
};
export async function createOrder(input: OrderInput): Promise<OrderResult> {
return request('/skrift-orders', { method: 'POST', body: input, auth: false });
// auth:true → eingeloggte Kunden senden ihren Token (Kundenangebote greifen);
// Gäste haben keine Session → kein Header, Verhalten wie zuvor.
return request('/skrift-orders', { method: 'POST', body: input, auth: true });
}
/** Vermerkt eine erfolgreiche PayPal-Zahlung am Auftrag. */