The invoice PDF and the invoice page now share one branded layout: logo (uploaded brand logo, otherwise the drawn honeycomb mark) and wordmark in the header, honey accents, a forest-green table header, a meta box with invoice number, date, order number and VAT ID, and a footer with address, contact, VAT ID and page numbers on every page. A mixed cart (e.g. honey at 7 % and a beeswax candle at 19 %) lists its items in one block per VAT rate with a subtotal each. Next to the totals, a VAT table shows net, VAT and gross per rate plus a sum row. Long invoices continue on further pages with the table header repeated. The VAT identification number is a new company field (company.vatId), editable in Admin > Inhalte, defaulting to the number already stated in the imprint. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
113 lines
4.4 KiB
TypeScript
113 lines
4.4 KiB
TypeScript
// Zentrale, austauschbare Inhalte fuer Navigation, Footer und Firmendaten.
|
|
// email ist noch keine echte Kontaktadresse (auf dem Etikett nicht abgebildet)
|
|
// und muss vor dem Live-Gang ersetzt werden — bewusst ohne sichtbaren
|
|
// "[PLATZHALTER]"-Text im String, da dieser sonst 1:1 im Footer und auf der
|
|
// Kontaktseite mitgerendert wuerde.
|
|
|
|
export const categoryLabels = {
|
|
HONIG: "Honig",
|
|
KERZEN: "Bienenwachskerzen",
|
|
PROPOLIS: "Propolis",
|
|
} as const;
|
|
|
|
export const siteConfig = {
|
|
name: "WABENHAIN",
|
|
claim: "Honig aus den Westlichen Wäldern.",
|
|
claimAlt: "Eine Landschaft. Eine Ernte. Ein ehrliches Glas.",
|
|
domain: "wabenhain.com",
|
|
description:
|
|
"Entdecke hochwertigen Honig aus eigener Imkerei in Altenmünster. Kleine Ernten, klare Herkunft und echtes Imkerhandwerk.",
|
|
location: "Altenmünster, Bayern",
|
|
email: "[email protected]",
|
|
/**
|
|
* Leer, und das ist die Vorgabe: eine Telefonnummer ist keine Pflichtangabe.
|
|
* § 5 TMG verlangt eine Moeglichkeit zur unmittelbaren Kontaktaufnahme —
|
|
* die E-Mail-Adresse erfuellt das.
|
|
*
|
|
* Frueher stand hier eine Platzhalternummer ("+49 (0) 000 000000"). Wer im
|
|
* Admin-Bereich keine Nummer pflegte, bekam sie auf der Kontaktseite und im
|
|
* Impressum tatsaechlich angezeigt — eine Nummer, unter der niemand zu
|
|
* erreichen ist, ist schlimmer als gar keine. Bleibt das Feld leer, wird die
|
|
* Zeile jetzt ueberall weggelassen (kontakt/page.tsx, impressum/page.tsx).
|
|
*/
|
|
phone: "",
|
|
/**
|
|
* Umsatzsteuer-Identifikationsnummer (§ 27a UStG). Steht auf jeder
|
|
* Rechnung (§ 14 Abs. 4 Nr. 2 UStG) und ist im Admin unter Inhalte >
|
|
* Firmendaten pflegbar; dieser Wert ist nur die Vorgabe.
|
|
*/
|
|
vatId: "DE366479158",
|
|
address: {
|
|
street: "Buhlweg 10",
|
|
zip: "86450",
|
|
city: "Altenmünster",
|
|
country: "Deutschland",
|
|
},
|
|
} as const;
|
|
|
|
// "key" verweist auf i18n/dictionary-type.ts (nav.* bzw. footer.*/legalTitles.*)
|
|
// statt eines fest verdrahteten Labels — site-chrome.tsx (Header/CartDrawer)
|
|
// bzw. site-footer.tsx (Footer) loesen den Text zur Laufzeit aus der aktiven
|
|
// Dictionary auf, damit Navigation und Footer mit der Sprachumschaltung
|
|
// mitziehen.
|
|
export const mainNav = [
|
|
{ href: "/shop", key: "shop" },
|
|
{ href: "/ernten", key: "harvests" },
|
|
{ href: "/herkunft", key: "origin" },
|
|
{ href: "/imkerei", key: "apiary" },
|
|
{ href: "/unternehmen", key: "business" },
|
|
{ href: "/wissen", key: "knowledge" },
|
|
{ href: "/kontakt", key: "contact" },
|
|
] as const;
|
|
|
|
export const footerNav = {
|
|
wabenhain: [
|
|
{ href: "/imkerei", key: "aboutUs" },
|
|
{ href: "/herkunft", key: "origin" },
|
|
{ href: "/ernten", key: "harvests" },
|
|
{ href: "/kontakt", key: "contact" },
|
|
],
|
|
// "Versand"/"Abholung" bewusst entfernt: beide verlinkten auf dieselbe
|
|
// Seite wie "Rechtliches" -> "Versand und Zahlung" (unten,
|
|
// /versand-zahlung) — die eine Verlinkung dort reicht.
|
|
einkaufen: [
|
|
{ href: "/shop", key: "shop" },
|
|
{ href: "/unternehmen", key: "businessCustomers" },
|
|
{ href: "/bestellung-verfolgen", key: "trackOrder" },
|
|
],
|
|
informationen: [
|
|
{ href: "/wissen", label: "Honigwissen" },
|
|
{ href: "/kontakt", label: "Kontakt" },
|
|
],
|
|
rechtliches: [
|
|
{ href: "/impressum", key: "impressum" },
|
|
{ href: "/datenschutz", key: "datenschutz" },
|
|
{ href: "/agb", key: "agb" },
|
|
{ href: "/widerrufsbelehrung", key: "widerruf" },
|
|
{ href: "/versand-zahlung", key: "versandZahlung" },
|
|
{ href: "/cookie-richtlinie", key: "cookieRichtlinie" },
|
|
],
|
|
} as const;
|
|
|
|
// philosophyItems, processSteps, sustainabilityItems, die Fallback-Reviews
|
|
// und businessPackages leben jetzt uebersetzt in i18n/dictionaries/{de,en}.ts
|
|
// (home.philosophy, home.processTimeline, home.sustainability,
|
|
// home.reviews.testimonials, unternehmenPage.packages).
|
|
|
|
// Nur noch die Slugs (locale-unabhaengig, fuer generateStaticParams/Sitemap) —
|
|
// Titel/Anrisstext/Fliesstext jedes Artikels leben jetzt uebersetzt unter
|
|
// i18n/dictionaries/{de,en}.ts (wissenArticles), siehe i18n/dictionary-type.ts
|
|
// fuer die WissenSlug-Union, die exakt diese Liste widerspiegelt.
|
|
export const wissenSlugs = [
|
|
"warum-kristallisiert-honig",
|
|
"fluessiger-oder-cremiger-honig",
|
|
"was-bedeutet-fruehtracht",
|
|
"was-bedeutet-sommertracht",
|
|
"wie-entsteht-honig",
|
|
"warum-schmeckt-jede-honigernte-anders",
|
|
"wie-lange-ist-honig-haltbar",
|
|
"was-macht-regionalen-honig-aus",
|
|
"wie-honig-richtig-lagern",
|
|
"warum-nie-ueber-28-grad-erwaermt",
|
|
] as const;
|