diff --git a/app/company-settings-preview/page.tsx b/app/company-settings-preview/page.tsx index 26aa1c2..04ca022 100644 --- a/app/company-settings-preview/page.tsx +++ b/app/company-settings-preview/page.tsx @@ -16,7 +16,6 @@ const FALLBACK: CompanySettings = { registerNumber: null, managingDirector: null, shareCapital: null, - generalPartners: null, sellerStreet: "", sellerZip: "", sellerCity: "", diff --git a/app/impressum/components/AnbieterAngaben.tsx b/app/impressum/components/AnbieterAngaben.tsx index 1058a27..5d33677 100644 --- a/app/impressum/components/AnbieterAngaben.tsx +++ b/app/impressum/components/AnbieterAngaben.tsx @@ -4,8 +4,8 @@ import type { CompanySettings } from "../../lib/payload"; import type { TOCSection } from "../../components/SectionTOC"; // Renders "Angaben zum Anbieter"/"Umsatzsteuer"/(conditionally) -// "Handelsregister"/"Geschäftsführung"/"Gesellschafter"/"Verantwortlich für -// den Inhalt" straight from company-settings, matching RichText.tsx's own heading/ +// "Handelsregister"/"Geschäftsführung"/"Verantwortlich für den Inhalt" +// straight from company-settings, matching RichText.tsx's own heading/ // paragraph classes so it reads as one continuous page with the CMS // content below it, not a bolted-on block. This used to be hand-typed // prose baked into the Impressum's richText (seed-legal-pages.ts on the @@ -17,21 +17,27 @@ import type { TOCSection } from "../../components/SectionTOC"; // already uses (see page.tsx's comment on that). // // Also closes a real compliance gap the old hand-typed text had: it never -// showed Handelsregister/Geschäftsführung/Gesellschafter/Stammkapital at -// all, even though company-settings models all of them (§37a HGB/§35a -// GmbHG/§80 AktG) — those fields just weren't wired into the Impressum. A -// sole proprietorship (this shop's current legalForm) needs none of them, -// so nothing extra shows today, but the moment legalForm changes in -// company-settings (e.g. incorporating as a GmbH), the Impressum picks up -// Handelsregister/Geschäftsführung/Stammkapital automatically — same for -// generalPartners/"Gesellschafter" on an OHG/KG — instead of needing a -// second manual edit here. +// showed Handelsregister/Geschäftsführung at all, even though +// company-settings already models both (§37a HGB/§35a GmbHG) — those +// fields just weren't wired into the Impressum. A sole proprietorship +// (this shop's current legalForm) has neither, so neither section shows +// today, but the moment that changes in company-settings, the Impressum +// picks it up automatically instead of needing a second manual edit. +// +// A "Gesellschafter"/Komplementäre section for OHG/KG was attempted +// 2026-07-23 but reverted the same day — the legal basis turned out +// genuinely unclear on research (§125a HGB's Geschäftsbriefe-naming duty +// only applies to the narrow case where *no* partner is a natural person, +// not the general OHG/KG case; whether §5 DDG's Impressum-specific +// "vertretungsberechtigte Person" requirement independently mandates it +// wasn't resolved with confidence). Deliberately not modeled until that's +// actually clarified — don't rebuild this without re-verifying the legal +// basis first, and don't assume the old attempt's reasoning was correct. export function anbieterAngabenHeadings(seller: CompanySettings | null): TOCSection[] { if (!seller) return []; const sections = ["Angaben zum Anbieter", "Umsatzsteuer"]; if (seller.registerCourt && seller.registerNumber) sections.push("Handelsregister"); if (seller.managingDirector) sections.push("Geschäftsführung"); - if (seller.generalPartners && seller.generalPartners.length > 0) sections.push("Gesellschafter"); sections.push("Verantwortlich für den Inhalt"); return sections.map((title) => ({ id: headingId(title), title })); } @@ -74,6 +80,9 @@ export function AnbieterAngaben({ seller }: { seller: CompanySettings }) { Handelsregister

{seller.registerCourt}

{seller.registerNumber}

+ {/* Optional/voluntary, not a Pflichtangabe — see + CompanySettings.ts's own comment on shareCapital. Only shows + if an admin deliberately filled it in. */} {seller.shareCapital ?

Stammkapital: {seller.shareCapital.toLocaleString("de-DE")} €

: null} )} @@ -85,22 +94,13 @@ export function AnbieterAngaben({ seller }: { seller: CompanySettings }) { )} - {seller.generalPartners && seller.generalPartners.length > 0 && ( - <> - Gesellschafter - {seller.generalPartners.map((partner) => ( -

{partner.name}

- ))} - - )} - Verantwortlich für den Inhalt {/* §18 Abs. 2 MStV wants a natural person — managingDirector first - (Kapitalgesellschaften), falling back to the first named - Gesellschafter (OHG/KG, no separate managingDirector field), - then finally sellerName itself (sole proprietorship/e.K., - already a natural person's own name). */} -

{seller.managingDirector || seller.generalPartners?.[0]?.name || seller.sellerName}

+ (Kapitalgesellschaften), falling back to sellerName itself (sole + proprietorship/e.K., already a natural person's own name). No + OHG/KG general-partner fallback here — see this file's top + comment on why that field doesn't exist yet. */} +

{seller.managingDirector || seller.sellerName}

{seller.sellerStreet}

{seller.sellerZip} {seller.sellerCity} diff --git a/app/impressum/page.tsx b/app/impressum/page.tsx index 0452957..02936a0 100644 --- a/app/impressum/page.tsx +++ b/app/impressum/page.tsx @@ -12,7 +12,7 @@ import { AnbieterAngaben, anbieterAngabenHeadings } from "./components/AnbieterA export const metadata: Metadata = { title: "Impressum", - description: "Angaben gemäß § 5 TMG für einfach produktiv.", + description: "Angaben gemäß § 5 DDG für einfach produktiv.", alternates: { canonical: "/impressum" }, }; @@ -39,7 +39,7 @@ export default async function ImpressumPage() { > Impressum

-

Angaben gemäß § 5 TMG

+

Angaben gemäß § 5 DDG

diff --git a/app/lib/emailTemplates.ts b/app/lib/emailTemplates.ts index 1e72946..3755867 100644 --- a/app/lib/emailTemplates.ts +++ b/app/lib/emailTemplates.ts @@ -79,7 +79,7 @@ export const DEFAULT_LEGAL_FOOTER_LINES: string[] = [ "E-Mail: kontakt@musterfirma.de", ]; -// Every business email needs an Anbieterkennzeichnung (§5 TMG-equivalent +// Every business email needs an Anbieterkennzeichnung (§5 DDG-equivalent // minimum for business correspondence: full name, postal address, contact, // plus VAT ID once assigned) — not just a friendly "brand · email" line. // Built from the same company-settings fields the invoice PDFs already @@ -91,6 +91,11 @@ export const DEFAULT_LEGAL_FOOTER_LINES: string[] = [ // appended here when actually present, so a sole proprietorship's footer // stays exactly as short as before this field set existed. Keep this in // sync with the Payload backend's own copy in src/lib/sellerInfo.ts. +// `shareCapital` deliberately does NOT appear here even though it's a +// company-settings field — see CompanySettings.ts's own comment: it's a +// voluntary disclosure, not something safe to auto-inject into every +// outgoing email regardless of whether the business actually wants that +// disclosure made. export function buildLegalFooterLines(seller: CompanySettings | null): string[] { if (!seller) return DEFAULT_LEGAL_FOOTER_LINES; const lines = [ @@ -102,10 +107,6 @@ export function buildLegalFooterLines(seller: CompanySettings | null): string[] if (seller.vatId) lines.push(`USt-IdNr.: ${seller.vatId}`); if (seller.registerCourt && seller.registerNumber) lines.push(`${seller.registerCourt} · ${seller.registerNumber}`); if (seller.managingDirector) lines.push(`Geschäftsführung: ${seller.managingDirector}`); - if (seller.shareCapital) lines.push(`Stammkapital: ${seller.shareCapital.toLocaleString("de-DE")} €`); - if (seller.generalPartners && seller.generalPartners.length > 0) { - lines.push(`Gesellschafter: ${seller.generalPartners.map((p) => p.name).join(", ")}`); - } return lines; } diff --git a/app/lib/payload.ts b/app/lib/payload.ts index 28cf0a9..151dc22 100644 --- a/app/lib/payload.ts +++ b/app/lib/payload.ts @@ -724,19 +724,18 @@ export async function getEmailTemplate( export type CompanySettings = { sellerName: string; // Drives whether registerCourt/registerNumber/managingDirector/ - // shareCapital/generalPartners are populated — mirrors Payload's - // CompanySettings.ts collection exactly (same option values), see - // buildLegalFooterLines() in emailTemplates.ts. + // shareCapital are populated — mirrors Payload's CompanySettings.ts + // collection exactly (same option values), see buildLegalFooterLines() + // in emailTemplates.ts. legalForm: "sole-proprietorship" | "e-k" | "gbr" | "ohg" | "kg" | "gmbh" | "ug" | "ag"; registerCourt: string | null; registerNumber: string | null; managingDirector: string | null; - // Stammkapital (GmbH/UG) / Grundkapital (AG) — only present for those - // legal forms, see CompanySettings.ts's SHARE_CAPITAL_REQUIRED_FORMS. + // Stammkapital (GmbH/UG) / Grundkapital (AG) — optional, NOT a + // Pflichtangabe (only shown for legal forms that have this concept at + // all; see CompanySettings.ts's SHARE_CAPITAL_APPLICABLE_FORMS and its + // own comment on why this is voluntary, not required, disclosure). shareCapital: number | null; - // Komplementäre/Gesellschafter — only present for OHG/KG, see - // CompanySettings.ts's GENERAL_PARTNERS_REQUIRED_FORMS. - generalPartners: { name: string }[] | null; sellerStreet: string; sellerZip: string; sellerCity: string;