From 2a3928d0e70c065e31c8c5fca90c693b235bb30c Mon Sep 17 00:00:00 2001 From: duffyduck Date: Thu, 23 Apr 2026 12:27:23 +0200 Subject: [PATCH] =?UTF-8?q?Anrede-Verh=C3=A4ltnis=20Du/Sie=20pro=20Kunde?= =?UTF-8?q?=20+=20Geburtstagsgru=C3=9F=20respektiert=20Anrede?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Schema: - Customer.useInformalAddress: Boolean (Default: false = Sie) - Auch bei Firmenkunden verfügbar (Chef kann man auch duzen) Frontend: - Neues Pflichtfeld "Anrede per" (Du/Sie) im Kunden-Formular - Anzeige als Badge in CustomerDetail-Stammdaten Geburtstagsgruß im Portal: - Bei Du: "Herzlichen Glückwunsch, Max! Alles Gute zu deinem 42. Geburtstag!" - Bei Sie: "Herzlichen Glückwunsch, Herr Müller! Alles Gute zu Ihrem 42. Geburtstag!" - Konsistent auch bei nachträglichen Glückwünschen (hattest/hatten, bist/sind etc.) - Backend liefert firstName, lastName, salutation und useInformalAddress Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/prisma/schema.prisma | 3 +++ backend/src/services/birthday.service.ts | 19 ++++++++++++--- backend/todo.md | 6 +++++ frontend/src/components/BirthdayModal.tsx | 24 +++++++++++++------ .../src/pages/customers/CustomerDetail.tsx | 8 +++++++ frontend/src/pages/customers/CustomerForm.tsx | 11 +++++++++ frontend/src/services/api.ts | 3 +++ frontend/src/types/index.ts | 1 + 8 files changed, 65 insertions(+), 10 deletions(-) diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 89de0d66..5b74149c 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -166,6 +166,9 @@ model Customer { // Geburtstagsmodal: Jahr in dem dem Kunden der Geburtstagsgruß gezeigt wurde (vermeidet mehrfaches Anzeigen) lastBirthdayGreetingYear Int? + // Anrede-Verhältnis: true = Du (informell), false = Sie (formell, Default) + useInformalAddress Boolean @default(false) + user User? addresses Address[] bankCards BankCard[] diff --git a/backend/src/services/birthday.service.ts b/backend/src/services/birthday.service.ts index 3430475c..dd3d7b16 100644 --- a/backend/src/services/birthday.service.ts +++ b/backend/src/services/birthday.service.ts @@ -140,6 +140,9 @@ export interface MyBirthdayCheck { isToday: boolean; daysAgo: number; // 0 = heute, >0 = x Tage her firstName: string; + lastName: string; + salutation: string | null; + useInformalAddress: boolean; age: number; } @@ -153,6 +156,9 @@ export async function checkMyBirthday(customerId: number): Promise 7) { - return { show: false, isToday: false, daysAgo: 0, firstName: customer.firstName, age: 0 }; + return { show: false, isToday: false, daysAgo: 0, ...baseInfo, age: 0 }; } const age = calculateAge(customer.birthDate, today); @@ -186,7 +199,7 @@ export async function checkMyBirthday(customerId: number): Promise ackMutation.mutate(); + // Anrede abhängig vom Du/Sie-Verhältnis zusammenstellen + const greetingName = info.useInformalAddress + ? info.firstName + : [info.salutation, info.lastName].filter(Boolean).join(' ') || info.firstName; + const greetingPronoun = info.useInformalAddress ? 'dir' : 'Ihnen'; + const greetingPossessive = info.useInformalAddress ? 'deinem' : 'Ihrem'; + const greetingYour = info.useInformalAddress ? 'Dein' : 'Ihr'; + const hadBirthday = info.useInformalAddress ? 'hattest' : 'hatten'; + const becameOld = info.useInformalAddress ? 'bist' : 'sind'; + return (
@@ -50,26 +60,26 @@ export default function BirthdayModal() { {info.isToday ? ( <>

- Herzlichen Glückwunsch, {info.firstName}! + Herzlichen Glückwunsch, {greetingName}!

- Alles Gute zu Ihrem {info.age}. Geburtstag! + Alles Gute zu {greetingPossessive} {info.age}. Geburtstag!

- Wir wünschen Ihnen einen wunderschönen Tag und alles Gute für das neue Lebensjahr. 🌟 + Wir wünschen {greetingPronoun} einen wunderschönen Tag und alles Gute für {greetingYour.toLowerCase()} neues Lebensjahr. 🌟

) : ( <>

- Nachträglich alles Gute, {info.firstName}! + Nachträglich alles Gute, {greetingName}!

- Sie hatten vor {info.daysAgo} Tag{info.daysAgo === 1 ? '' : 'en'} Geburtstag - {info.age > 0 && ` und sind ${info.age} Jahre alt geworden`}. + {greetingYour === 'Ihr' ? 'Sie' : 'Du'} {hadBirthday} vor {info.daysAgo} Tag{info.daysAgo === 1 ? '' : 'en'} Geburtstag + {info.age > 0 && ` und ${becameOld} ${info.age} Jahre alt geworden`}.

- Wir wünschen Ihnen alles Gute nachträglich und eine tolle Zeit im neuen Lebensjahr. 🌟 + Wir wünschen {greetingPronoun} alles Gute nachträglich und eine tolle Zeit im neuen Lebensjahr. 🌟

)} diff --git a/frontend/src/pages/customers/CustomerDetail.tsx b/frontend/src/pages/customers/CustomerDetail.tsx index 5ed554e8..95de82a5 100644 --- a/frontend/src/pages/customers/CustomerDetail.tsx +++ b/frontend/src/pages/customers/CustomerDetail.tsx @@ -267,6 +267,14 @@ export default function CustomerDetail({ portalCustomerId }: { portalCustomerId?
)} +
+
Anrede per
+
+ + {c.useInformalAddress ? 'Du (informell)' : 'Sie (formell)'} + +
+
Vorname
diff --git a/frontend/src/pages/customers/CustomerForm.tsx b/frontend/src/pages/customers/CustomerForm.tsx index 49843750..f0d15cf7 100644 --- a/frontend/src/pages/customers/CustomerForm.tsx +++ b/frontend/src/pages/customers/CustomerForm.tsx @@ -135,6 +135,17 @@ export default function CustomerForm() { ]} /> +