diff --git a/docs/zweitmeinung/Website_Guide.md b/docs/zweitmeinung/Website_Guide.md new file mode 100644 index 0000000..0027d14 --- /dev/null +++ b/docs/zweitmeinung/Website_Guide.md @@ -0,0 +1,43 @@ +Hier ist eine kurze Anleitung im Markdown-Format, die du direkt als System-Prompt oder Instruktion für eine Frontend-KI verwenden kannst, um hochwertige ("Premium") Webseiten zu generieren: + +```markdown +# Anleitung für die Frontend-KI: Umsetzung von Premium-Webseiten + +**Ziel:** Deine Aufgabe ist es, Webseiten zu generieren, die sofortiges Vertrauen aufbauen und professionell wirken. Die Website darf niemals "billig" oder hastig zusammengebaut wirken. Eine Premium-Website ist nicht lauter, sondern **klarer, ruhiger und bewusster**. + +Halte dich bei der Generierung von Code, Layouts und Styles strikt an die folgenden Gestaltungsprinzipien: + +## 1. Fundament & Erster Eindruck + +- **Klare Botschaft "Above the Fold":** Der Besucher muss sofort und ohne zu scrollen verstehen, was angeboten wird, für wen es ist und warum es wichtig ist. +- **Absichtsvolles Layout (Kein "DIY-Look"):** Vermeide Layouts, die nach billigen Templates aussehen. Selbst die einfachsten Strukturen müssen bewusst und durchdacht wirken. +- **Vertrauenssignale:** Sorge durch visuelle Klarheit und ein professionelles Auftreten dafür, dass die Seite sofort seriös und sicher wirkt. + +## 2. Visuelle Struktur & Grafiken + +- **Maßgeschneiderte Optik statt Stock-Material:** Verzichte auf generische Stock-Icons. Nutze visuelle Elemente, die exakt zur Tonalität und Farbpalette der Marke passen. +- **Funktion vor reiner Dekoration:** Nutze Grafiken gezielt, um die Aufmerksamkeit zu lenken, Inhalte aufzulockern und Informationen leichter verdaulich zu machen. Vermeide absolutes visuelles Rauschen – jedes Element muss sich seinen Platz verdienen. + +## 3. Markenstrategie (Farben & Typografie) + +- **Farb-Minimalismus:** Implementiere ein kohärentes Farbsystem. Setze auf **Zurückhaltung statt Vielfalt** – wenige Farben, die souverän eingesetzt werden, sorgen für einen hochwertigen Look. +- **Exzellente Typografie:** Wähle anspruchsvolle, professionelle Schriftarten. **Lesbarkeit steht an erster Stelle** – verwende niemals schwer lesbare, veraltete oder unprofessionelle Fonts. + +## 4. Subtile Animationen & Interaktionen + +- **Lebendig, aber nicht chaotisch:** Nutze dezente, scrollbasierte Bewegungen, bei denen Elemente natürlich einblenden. +- **Feedback ohne Reibung:** Buttons und Links müssen auf Hover und Klicks flüssig reagieren. +- **Keine Spielereien:** Verzichte auf alles, was sich grundlos dreht, hüpft oder die Aufmerksamkeit vom eigentlichen Inhalt ablenkt. Animationen sollen den Nutzer führen, nicht verwirren. + +## 5. User Experience (UX) & Call-to-Actions + +- **Klare Nutzerführung (User Journey):** Jede Sektion und jede Seite muss natürlich zum nächsten logischen Schritt führen. +- **Keine Entscheidungsparalyse:** Der Besucher darf nie überlegen müssen, was er als Nächstes tun soll. +- **Sichtbare CTAs:** Call-to-Actions müssen offensichtlich platziert und leicht auffindbar sein. +- **Semantischer Aufbau:** Strukturiere den HTML-Code und die Seitenhierarchie logisch – optimiert für menschliche Besucher und SEO-Algorithmen. + +## 6. Code-Wartbarkeit & Langlebigkeit + +- **Keine "Black-Box":** Entwickle den Code sauber und modular, sodass spätere Aktualisierungen durch den Betreiber leicht möglich sind, ohne dass die Struktur zerbricht. +- Das Setup muss darauf ausgelegt sein, dass Seiten, Services und Inhalte in Zukunft unkompliziert erweitert werden können. +``` diff --git a/docs/zweitmeinung/content-inventory-production.md b/docs/zweitmeinung/content-inventory-production.md new file mode 100644 index 0000000..203a194 --- /dev/null +++ b/docs/zweitmeinung/content-inventory-production.md @@ -0,0 +1,1212 @@ +# Content Inventory: zweitmeinu.ng (Produktion) +## Strapi zu Payload CMS Migration + +**Erstellt:** 2026-02-20 +**Datenquelle:** Produktions-API (https://st.zh3.de) +**Status:** Echte Produktionsdaten + +--- + +## Inhaltsverzeichnis + +1. [Übersicht](#1-übersicht) +2. [Site-Configurations](#2-site-configurations) +3. [Services (Dienstleistungen)](#3-services-dienstleistungen) +4. [FAQs](#4-faqs) +5. [FAQ-Categories](#5-faq-categories) +6. [Pages](#6-pages) +7. [Legal-Pages](#7-legal-pages) +8. [Leere Collections](#8-leere-collections) + +--- + +## 1. Übersicht + +### Produktionsdaten-Status + +| Collection | Einträge | Status | +|------------|----------|--------| +| **Site-Configurations** | 2 | ✅ Daten vorhanden | +| **Services** | 6 | ✅ Daten vorhanden | +| **FAQs** | 24 | ✅ Daten vorhanden | +| **FAQ-Categories** | 7 | ✅ Daten vorhanden | +| **Pages** | 4 | ✅ Daten vorhanden | +| **Legal-Pages** | 2 | ✅ Daten vorhanden | +| Experts | 0 | ⚠️ Leer | +| Blog-Posts | 0 | ⚠️ Leer | +| Blog-Categories | - | 🔒 Zugriff verweigert | +| News-Items | 0 | ⚠️ Leer | +| Appointments | - | Nicht abgefragt | +| Contact-Messages | - | Nicht abgefragt | + +--- + +## 2. Site-Configurations + +### 2.1 Übersicht + +**Anzahl:** 2 Sites + +| # | Site Identifier | Domain | Brand | Specialty | +|---|-----------------|--------|-------|-----------| +| 1 | complexcare-de | complexcaresolutions.de | complexcare | general | +| 2 | zweitmeinu-ng | zweitmein.ng | portal | general | + +--- + +### 2.2 Site: complexcare-de (Complex Care Solutions GmbH) + +```yaml +Basis: + siteIdentifier: "complexcare-de" + domain: "complexcaresolutions.de" + siteName: "complex care solutions GmbH" + tagline: "advancing healthcare" + brand: complexcare + specialty: general + locales: + - code: "de-DE" + name: "German (Germany)" + isDefault: true + +Logo: + name: "Basislogo_mitClaim.png" + url: "/uploads/Basislogo_mit_Claim_8bc0dcadfd.png" + width: 1728 + height: 1296 + +Favicon: + name: "favicon.ico" + url: "/uploads/favicon_af3459ec0b.ico" + +Theme: + primaryColor: "#1278B3" + secondaryColor: "#B3AF09" + accentColor: "#0091BD" + darkColor: "#004166" + backgroundColor: "#f0f1f4" + fontFamily: "Roboto Condensed, Arial Narrow, sans-serif" + +Navigation: + TopBar: + enabled: true + backgroundColor: "#ffffff" + textColor: "#333333" + content: + - icon: clock, type: text, content: "Mo - Fr : 9:00 - 16:00 Uhr" + - type: separator, content: "|" + - icon: envelope, type: email, content: "kontakt@complexcaresolutions.de" + - type: separator, content: "|" + - icon: phone, type: phone, style: bold, content: "0800 80 44 100" + + MainNavigation: + - label: "Patienten", url: "/patienten", icon: users + - label: "Ärzte", url: "/aerzte", icon: user-doctor + - label: "Versicherungen", url: "/versicherungen", icon: shield + - label: "Über uns", url: "/ueber-uns", icon: info-circle + - label: "Motivation", url: "/motivation", icon: heart + - label: "Kontakt", url: "/kontakt", icon: envelope + + SocialMedia: + enabled: true + platforms: + - LinkedIn: "https://de.linkedin.com/company/complex-care-solutions-gmbh" + - Facebook: "https://www.facebook.com/complex-care-solutions-GmbH" + - Instagram: "https://www.instagram.com/c2steam" + - YouTube: "https://www.youtube.com/@complexcaresolutionsgmbh2682" + +Footer: + layout: "multi-column" + style: + backgroundColor: "#004166" + textColor: "#ffffff" + linkColor: "#e2e8f0" + linkHoverColor: "#1278B3" + + columns: + - id: "footer-about" + title: "Über Complex Care Solutions" + logo: "/c2s_master_logo_400x130.png" + description: "Ihr Partner für spezialisierte Gesundheitsdienstleistungen..." + certifications: + - "ISO 9001:2015" + - "TÜV Rheinland" + + - id: "footer-services" + title: "Unsere Leistungen" + links: + - "Medizinische Zweitmeinung" + - "Care Management" + - "Präventivmedizin" + - "Telemedizin (Neu)" + + - id: "footer-info" + title: "Informationen" + links: + - "Für Patienten" + - "Für Ärzte" + - "Für Versicherungen" + - "FAQ" + - "Downloads" + + - id: "footer-contact" + title: "Kontakt & Service" + contactInfo: + phone: "0800 80 44 100" + hours: "Mo - Fr: 9:00 - 16:00 Uhr" + email: "kontakt@complexcaresolutions.de" + +Email-Settings: + fromEmail: "kontakt@complexcaresolutions.de" + fromName: "kontakt@complexcaresolutions.de" + replyToEmail: "kontakt@complexcaresolutions.de" + notificationEmail: "kontakt@complexcaresolutions.de" + emailFooter: "Diese E-Mail wurde automatisch generiert." + notificationSettings: + newAppointment: true + appointmentCancellation: true + newContactMessage: true + expertRegistration: true + systemAlerts: true +``` + +--- + +### 2.3 Site: zweitmeinu-ng (Portal) + +```yaml +Basis: + siteIdentifier: "zweitmeinu-ng" + domain: "zweitmein.ng" + siteName: "zweitmeinu.ng" + tagline: "Beratung wenn sie wirklich wichtig ist" + brand: portal + specialty: general + aliases: + - "deinezweitmeinung.org" + locales: + - code: "de-DE" + name: "German (Germany)" + isDefault: true + +Logo: + name: "Basislogo_ohneClaim.png" + url: "/uploads/Basislogo_ohne_Claim_f755f3734e.png" + width: 1600 + height: 1600 + +Theme: + primaryColor: "#1278B3" + secondaryColor: "#B3AF09" + accentColor: "#0091BD" + darkColor: "#004166" + backgroundColor: "#f0f1f4" + fontFamily: "Roboto Condensed, Arial Narrow, sans-serif" + +Navigation: + TopBar: + enabled: true + backgroundColor: "#004166" + textColor: "#ffffff" + content: + - icon: phone, type: phone, style: bold, content: "+49 800 80 44 100" + - type: separator, content: "|" + - icon: envelope, type: email, style: bold, content: "kontakt@zweitmeinu.ng" + + CTAButton: + label: "Notfall-Zweitmeinung" + url: "/notfall" + icon: emergency + style: primary + animate: true + animationType: pulse + backgroundColor: "#B3AF09" + hoverColor: "#8F8C07" + + SearchBar: + enabled: true + placeholder: "Fachbereich oder Experte suchen..." + suggestions: + - "Kardiologie" + - "Zweitmeinung Herz" + - "Onkologie" + - "Krebstherapie" + - "Neurologie" + + MainNavigation: + - label: "Fachbereiche" + url: "/fachbereiche" + icon: medical-services + highlight: true + subItems: + - label: "Kardiologie", url: "/fachbereiche/kardiologie", icon: heart + - label: "Onkologie", url: "/fachbereiche/onkologie", icon: oncology + - label: "Intensivmedizin", url: "/fachbereiche/intensivmedizin", icon: intensive-care + - label: "Radiologie", url: "/fachbereiche/radiologie", icon: radiology + - label: "Chirurgie", url: "/fachbereiche/chirurgie", icon: surgery + - label: "Alle Fachbereiche →", url: "/fachbereiche", style: link-primary + - label: "So funktioniert's", url: "/so-funktionierts", icon: info-circle + - label: "FAQ", url: "/faq", icon: faq + - label: "Über uns", url: "/ueber-uns", icon: building + - label: "Motivation", url: "/motivation", icon: building + - label: "Kontakt", url: "/kontakt", icon: envelope + +Footer: + columns: + - id: "footer-fachbereiche" + title: "Top Fachbereiche" + links: + - label: "Kardiologie - Herz & Kreislauf", url: "https://zwmk.de", badge: "Beliebt" + - label: "Onkologie - Krebstherapie", url: "https://zwmo.de" + - label: "Intensivmedizin", url: "https://zwmi.de" + - label: "Chirurgie - Operationen", url: "https://zwmop.de" + - label: "Radiologie - Bildgebung", url: "https://zwmr.de" + + - id: "footer-services" + title: "Services" + links: + - "So funktioniert's" + - "Notfall-Zweitmeinung (24/7)" + - "Preise & Kostenübernahme" + - "FAQ" + - "Qualitätsstandards" + - "Für Ärzte" + + - id: "footer-unternehmen" + title: "Unternehmen" + links: + - "Über uns" + - "complex care Solutions GmbH" + - "Karriere (Jobs)" + - "Partner werden" + - "Kontakt" + + - id: "footer-rechtliches" + title: "Rechtliches" + links: + - "Impressum" + - "Datenschutz" + - "AGB" + - "Cookie-Einstellungen" + - "Patientenrechte" + - "Haftungsausschluss" + + newsletter: + enabled: true + title: "Newsletter" + description: "Erhalten Sie wichtige Gesundheitsinformationen und Updates" + + emergencyBanner: + enabled: true + text: "Medizinischer Notfall?" + buttonText: "Jetzt anrufen" + phone: "+49 XXX XXXXXXX" + backgroundColor: "#B3AF09" + textColor: "#001F30" + +Contact: + email: "kontakt@zweitmeinu.ng" + phone: "0800 80 44 100" + fax: "0800 80 44 190" + emergencyHotline: "0174 3032053" + address: | + complex care solutions GmbH + Hans-Böckler-Str. 19 + 46236 Bottrop + openingHours: + monday: "09:00-16:00" + tuesday: "09:00-16:00" + wednesday: "09:00-16:00" + thursday: "09:00-16:00" + friday: "09:00-16:00" + saturday: "geschlossen" + sunday: "geschlossen" + holidays: "An Feiertagen eingeschränkte Verfügbarkeit" + emergency: "24/7 Notfall-Hotline verfügbar" + +SEO: + metaTitle: "Zweitmeinung Portal - Medizinische Zweitmeinung" + metaDescription: "Ihr zentrales Portal für qualifizierte medizinische Zweitmeinungen. Zugang zu über 1000 Experten aus über 50 Fachbereichen. Schnell, sicher, kompetent." + keywords: "zweitmeinung portal, medical second opinion, medizinische zweitmeinung, expertenrat, facharzt zweitmeinung, zweitmeinung online" + canonicalURL: "https://zweitmeinu.ng" + +Features: + showBlog: true + showTeam: false + enableChat: false + enableBooking: false + showDomainGrid: true + enableGlobalSearch: true + showExpertCarousel: true + showLiveStatistics: true + showTrustIndicators: true + +MaintenanceMode: + enabled: false + title: "Wartungsarbeiten" + message: "Wir führen gerade wichtige Wartungsarbeiten durch..." + allowedRoles: ["admin", "developer"] + +Email-Settings: + fromEmail: "noreply@zweitmeinu.ng" + fromName: "zweitmeinu.ng" + replyToEmail: "kontakt@zweitmeinu.ng" + notificationEmail: "kontakt@zweitmeinu.ng" +``` + +--- + +## 3. Services (Dienstleistungen) + +### 3.1 Übersicht + +**Anzahl:** 6 Services + +| # | Name | Kategorie | Status | +|---|------|-----------|--------| +| 1 | Zweitmeinung Intensivmedizin | emergency | Aktiv | +| 2 | Zweitmeinung Gallenblase | consultation | Aktiv | +| 3 | Zweitmeinung Kardiologie | consultation | Aktiv | +| 4 | Zweitmeinung Nephrologie | consultation | Aktiv | +| 5 | Zweitmeinung Onkologie | consultation | Aktiv | +| 6 | Zweitmeinung Schilddrüse | consultation | Aktiv | + +--- + +### 3.2 Service: Zweitmeinung Intensivmedizin + +```yaml +ID: 16 +documentId: "zyd5eohe5iudtb11wsomdd6d" +name: "Zweitmeinung Intensivmedizin" +slug: "zweitmeinung-intensivmedizin" +category: emergency +isActive: true +order: 0 + +shortDescription: | + Unabhängige ärztliche Zweitmeinung bei laufender oder geplanter Intensivbehandlung. + Wir prüfen medizinische Indikation, Patientenwille und Behandlungsalternativen – + empathisch, neutral und fachlich fundiert. + +description: | + # Zweitmeinung Intensiv – fundierte Beratung in kritischen Situationen + + Wenn intensivmedizinische Entscheidungen anstehen, brauchen Patient:innen und ihre + Angehörigen mehr als nur medizinische Information – sie brauchen Orientierung, + Sicherheit und eine unabhängige fachliche Einschätzung. + + **Unsere Dienstleistung „Zweitmeinung Intensiv" richtet sich an Menschen in sehr + schwerer gesundheitlicher Lage**, etwa bei Langzeitbeatmung, Wachkoma oder im + palliativen Kontext. + + ## Was wir leisten: + - Strukturierte Beratung durch erfahrene Case Manager:innen + - Unabhängige ärztliche Zweitmeinung inkl. schriftlichem Gutachten + - Bewertung von Therapiezielen, Indikationen, Patientenverfügung & Prognose + - Unterstützung bei der Umsetzung: von palliativer Umsteuerung bis Pflegeüberleitung + + ## Für wen ist das Angebot gedacht? + Die Zweitmeinung kann von Betroffenen selbst oder ihren rechtlichen Vertreter:innen + beauftragt werden. + + ## Ihr Nutzen: + - Vermeidung nicht indizierter Eingriffe oder fortgesetzter Maximaltherapie + - Sicherung des Patientenwillens in ethisch sensiblen Situationen + - Medizinisch und rechtlich belastbare Entscheidungsgrundlage + - Transparente Kommunikation und datenschutzkonformer Ablauf + +SEO: + metaTitle: "Zweitmeinung Intensivmedizin" + metaDescription: "Unabhängige ärztliche Zweitmeinung bei intensivmedizinischer Behandlung. Jetzt fundierte Empfehlung einholen – mit CCS sicher entscheiden." + keywords: + - Zweitmeinung Intensiv + - ärztliche Zweitmeinung + - Intensivmedizin + - Langzeitbeatmung + - Wachkoma + - palliative Versorgung + - Patientenwille + - Case Management + structuredData: + @type: MedicalService + name: "Zweitmeinung Intensiv" + provider: + @type: Organization + name: "complex care solutions GmbH" + url: "https://www.complexcaresolutions.de" +``` + +--- + +### 3.3 Service: Zweitmeinung Gallenblase + +```yaml +ID: 17 +documentId: "ges2gdv4506vqj1jjavu75a1" +name: "Zweitmeinung Gallenblase" +slug: "zweitmeinung-gallenblase" +category: consultation +isActive: true + +shortDescription: | + Unabhängige ärztliche Zweitmeinung vor einer geplanten Gallenblasen-OP. + Wir prüfen, ob der Eingriff medizinisch notwendig ist – verständlich, + neutral und leitlinienbasiert. + +description: | + # Zweitmeinung Gallenblase – unnötige Operationen vermeiden + + Viele Menschen erhalten bei Gallensteinen die Empfehlung, die Gallenblase + entfernen zu lassen. Doch nicht in jedem Fall ist eine Operation notwendig. + + ## Was wir für Sie tun: + - Bewertung Ihrer Beschwerden und Untersuchungsergebnisse + - Prüfung der OP-Indikation nach medizinischen Leitlinien + - Zweitmeinung durch Fachärzt:innen für Viszeralchirurgie oder Gastroenterologie + - Verständliches Zweitmeinungsgutachten mit klarer Empfehlung + + ## Ihr Nutzen: + - Vermeidung unnötiger Operationen + - Aufklärung über konservative Behandlungsoptionen + - Verständliche Erklärung der Befunde und Risiken + +SEO: + metaTitle: "Zweitmeinung Gallenblase – OP kritisch prüfen lassen" + metaDescription: "Gallenblasen-OP empfohlen? Holen Sie sich eine unabhängige Zweitmeinung von erfahrenen Fachärzt:innen." + keywords: + - Zweitmeinung Gallenblase + - Gallenblasenoperation vermeiden + - Gallensteine Behandlung + - Cholezystektomie Zweitmeinung +``` + +--- + +### 3.4 Service: Zweitmeinung Kardiologie + +```yaml +ID: 18 +documentId: "vkolxn3o6p29kbp3nr6uysmh" +name: "Zweitmeinung Kardiologie" +slug: "zweitmeinung-kardiologie" +category: consultation +isActive: true + +shortDescription: | + Unabhängige ärztliche Zweitmeinung vor Herzkatheter, Stent oder OP. + Fundierte Empfehlung durch erfahrene Kardiolog:innen – verständlich, + sicher, neutral. + +description: | + # Zweitmeinung Kardiologie – klare Empfehlungen bei Herzentscheidungen + + Herzbeschwerden verunsichern – und geplante Eingriffe wie eine Stent-Implantation + werfen viele Fragen auf. + + ## Was wir für Sie tun: + - Bewertung Ihrer Diagnosen und EKG-/Katheterbefunde durch Fachärzt:innen + - Zweitmeinung bei geplanter PCI, Bypass-OP oder medikamentöser Umstellung + - Schriftliches ärztliches Gutachten mit klarer Empfehlung + - Persönliche Erläuterung telefonisch oder per Video + + ## Wann ist eine Zweitmeinung sinnvoll? + Vor planbaren Eingriffen wie Stent-Implantation, Herzoperation oder + interventioneller Ablation. + +SEO: + metaTitle: "Zweitmeinung Kardiologie – Einschätzung vor Eingriffen" + metaDescription: "Unabhängige Zweitmeinung bei geplanter PCI oder Herzoperation." + keywords: + - Zweitmeinung Kardiologie + - Herzkatheter Zweitmeinung + - Zweitmeinung Stent + - Herz-OP Beratung + - Bypass Zweitmeinung +``` + +--- + +### 3.5 Service: Zweitmeinung Nephrologie + +```yaml +ID: 19 +documentId: "e6ipyix9g0vb9okgj5qs6u9u" +name: "Zweitmeinung Nephrologie" +slug: "zweitmeinung-nephrologie" +category: consultation +isActive: true + +shortDescription: | + Unabhängige ärztliche Einschätzung bei Nierenerkrankungen, Dialyseempfehlung + oder Transplantationsvorbereitung. Klar, neutral und verständlich erklärt. + +description: | + # Zweitmeinung Nephrologie – Klarheit bei Nierenentscheidungen + + Die Diagnose einer chronischen Nierenerkrankung oder die Empfehlung zur Dialyse + ist ein gravierender Einschnitt. + + ## Was wir für Sie tun: + - Prüfung der nephrologischen Diagnostik, Laborwerte, Nierenfunktion + - Zweitmeinung durch Fachärzt:innen für Innere Medizin und Nephrologie + - Gutachten zur Notwendigkeit oder zum Zeitpunkt einer Dialyse + - Bewertung konservativer Behandlungsoptionen + +SEO: + metaTitle: "Zweitmeinung Nephrologie – Entscheidung vor Dialyse" + metaDescription: "Unabhängige ärztliche Zweitmeinung bei chronischer Niereninsuffizienz oder Dialyseempfehlung." + keywords: + - Zweitmeinung Nephrologie + - Niereninsuffizienz + - Zweitmeinung Dialyse + - Nierentransplantation Einschätzung +``` + +--- + +### 3.6 Service: Zweitmeinung Onkologie + +```yaml +ID: 20 +documentId: "p0rmism9pb6gepmpc03hwk1e" +name: "Zweitmeinung Onkologie" +slug: "zweitmeinung-onkologie" +category: consultation +isActive: true + +shortDescription: | + Unabhängige ärztliche Zweitmeinung bei Krebs. Fundierte Einschätzung von + Therapieoptionen durch erfahrene Onkolog:innen – empathisch, verständlich, individuell. + +description: | + # Zweitmeinung Onkologie – fundierte Entscheidungshilfe bei Krebsdiagnosen + + Eine Krebsdiagnose ist ein Einschnitt. Neben der seelischen Belastung stellt + sich oft die Frage: Ist die empfohlene Behandlung wirklich die beste Wahl? + + ## Was wir für Sie tun: + - Auswertung Ihrer Diagnose und Befunde durch erfahrene Fachärzt:innen + - Bewertung der geplanten Therapie (Wirksamkeit, Nebenwirkungen, Lebensqualität) + - Schriftliches Zweitmeinungsgutachten + - Optionales Gespräch per Telefon oder Video + - Einbindung von Case Management und Palliativberatung + + ## Wann ist eine Zweitmeinung sinnvoll? + Bei neu gestellter oder fortgeschrittener Krebsdiagnose, z. B. bei Empfehlung + einer Chemotherapie, Operation, Immun- oder Strahlentherapie. + +SEO: + metaTitle: "Zweitmeinung Onkologie – fundierte Einschätzung bei Krebs" + metaDescription: "Unabhängige ärztliche Zweitmeinung bei Krebs. Behandlungsalternativen prüfen." + keywords: + - Zweitmeinung Onkologie + - ärztliche Zweitmeinung Krebs + - Krebsbehandlung Beratung + - Zweitmeinung Chemotherapie +``` + +--- + +### 3.7 Service: Zweitmeinung Schilddrüse + +```yaml +ID: 21 +documentId: "kafaii66xb9xt3voefggk7fk" +name: "Zweitmeinung Schilddrüse" +slug: "zweitmeinung-schilddruese" +category: consultation +isActive: true + +shortDescription: | + Unabhängige ärztliche Einschätzung vor einer geplanten Schilddrüsen-OP. + Fundierte Zweitmeinung durch erfahrene Endokrinolog:innen – individuell, + neutral, verständlich. + +description: | + # Zweitmeinung Schilddrüse – fundierte Einschätzung vor einer Operation + + Die Empfehlung zur Entfernung der Schilddrüse ist für viele Menschen mit + Sorgen verbunden. Doch ist eine Operation wirklich notwendig? + + ## Was wir für Sie tun: + - Prüfung von Ultraschallbefunden, Szintigrammen, Laborwerten + - Zweitmeinung durch Fachärzt:innen für Endokrinologie oder Schilddrüsenchirurgie + - Schriftliches Gutachten mit nachvollziehbarer Empfehlung + + ## Wann ist eine Zweitmeinung sinnvoll? + Bei empfohlener OP wegen Knoten, Struma, Autonomie oder unklarer Laborwerte. + +SEO: + metaTitle: "Zweitmeinung Schilddrüse – OP sinnvoll prüfen lassen" + metaDescription: "Schilddrüsen-OP empfohlen? Lassen Sie die Notwendigkeit von erfahrenen Endokrinolog:innen prüfen." + keywords: + - Zweitmeinung Schilddrüse + - Schilddrüsen-OP vermeiden + - Schilddrüsenknoten Beratung + - Struma Zweitmeinung +``` + +--- + +## 4. FAQs + +### 4.1 Übersicht + +**Anzahl:** 24 FAQs + +### 4.2 FAQ-Liste nach Kategorie + +#### Allgemeine Fragen zur Zweitmeinung + +| Frage | Slug | +|-------|------| +| Was bringt mir eine Zweitmeinung bei Krebs? | was-bringt-mir-eine-zweitmeinung-bei-krebs | +| Muss ich alle meine Unterlagen selbst zusammensuchen? | muss-ich-alle-meine-unterlagen-selbst-zusammensuchen | +| Wie läuft das Zweitmeinungsverfahren ab? | wie-laeuft-das-zweitmeinungsverfahren-ab | +| Kann ich die Zweitmeinung auch einholen, wenn die Therapie schon begonnen hat? | kann-ich-die-zweitmeinung-auch-einholen-wenn-die-therapie-schon-begonnen-hat | +| Beeinflusst die Zweitmeinung meine Behandlung oder meine Ärzt:innen? | beeinflusst-die-zweitmeinung-meine-behandlung-oder-meine-aerzt-innen | + +#### Zweitmeinung Kardiologie + +| Frage | Slug | +|-------|------| +| Wann ist eine Zweitmeinung vor einem Herzkatheter sinnvoll? | wann-ist-eine-zweitmeinung-vor-einem-herzkatheter-sinnvoll | +| Wer erstellt die kardiologische Zweitmeinung? | wer-erstellt-die-kardiologische-zweitmeinung | +| Welche Unterlagen brauche ich für die Zweitmeinung? | welche-unterlagen-brauche-ich-fuer-die-zweitmeinung | +| Muss ich den Eingriff absagen, wenn ich eine Zweitmeinung einhole? | muss-ich-den-eingriff-absagen-wenn-ich-eine-zweitmeinung-einhole | +| Was passiert, wenn die Einschätzung von der ursprünglichen Empfehlung abweicht? | was-passiert-wenn-die-einschaetzung-von-der-urspruenglichen-empfehlung-abweicht | + +#### Zweitmeinung Schilddrüse + +| Frage | Slug | +|-------|------| +| Wann ist eine Zweitmeinung zur Schilddrüsen-OP sinnvoll? | wann-ist-eine-zweitmeinung-zur-schilddruesen-op-sinnvoll | +| Welche Unterlagen werden benötigt? | welche-unterlagen-werden-benoetigt | +| Wer erstellt die Zweitmeinung? | wer-erstellt-die-zweitmeinung | +| Ist die Zweitmeinung verbindlich für meine behandelnden Ärzt:innen? | ist-die-zweitmeinung-verbindlich-fuer-meine-behandelnden-aerzt-innen | +| Kostet mich die Zweitmeinung etwas? | kostet-mich-die-zweitmeinung-etwas | + +#### Zweitmeinung Gallenblase + +| Frage | Slug | +|-------|------| +| Wann ist eine Zweitmeinung zur Gallenblasenentfernung sinnvoll? | wann-ist-eine-zweitmeinung-zur-gallenblasenentfernung-sinnvoll | +| Wer erstellt die Zweitmeinung? | wer-erstellt-die-zweitmeinung-gallenblase | +| Welche Unterlagen brauche ich? | welche-unterlagen-brauche-ich | +| Gibt es Alternativen zur OP? | gibt-es-alternativen-zur-op | +| Was kostet die Zweitmeinung? | was-kostet-die-zweitmeinung | + +#### Zweitmeinung Nephrologie + +| Frage | Slug | +|-------|------| +| Wann ist eine Zweitmeinung bei Nierenerkrankungen sinnvoll? | wann-ist-eine-zweitmeinung-bei-nierenerkrankungen-sinnvoll | +| Welche Unterlagen sind wichtig? | wer-erstellt-die-zweitmeinung-1 | +| Kann ich die Zweitmeinung auch einholen, wenn die Dialyse bereits begonnen hat? | kann-ich-die-zweitmeinung-auch-einholen-wenn-die-dialyse-bereits-begonnen-hat | +| Kostet mich die Zweitmeinung etwas? | kostet-mich-die-zweitmeinung-etwas-nephrologie | + +### 4.3 Beispiel-FAQs (vollständig) + +```yaml +FAQ 1: + id: 5 + question: "Was bringt mir eine Zweitmeinung bei Krebs?" + slug: "was-bringt-mir-eine-zweitmeinung-bei-krebs" + answer: | + Eine Zweitmeinung kann Ihnen Sicherheit geben – vor allem bei schweren + Diagnosen oder belastenden Therapien. Sie hilft, Behandlungsoptionen besser + zu verstehen, Alternativen zu erkennen und eine informierte Entscheidung + zu treffen. Besonders wichtig ist das, wenn mehrere Behandlungswege möglich + sind oder Zweifel an der vorgeschlagenen Therapie bestehen. + priority: medium + helpfulCount: 0 + notHelpfulCount: 0 + +FAQ 2: + id: 9 + question: "Wie läuft das Zweitmeinungsverfahren ab?" + slug: "wie-laeuft-das-zweitmeinungsverfahren-ab" + answer: | + Nach einem telefonischen Vorgespräch prüfen unsere Fachärzt:innen Ihre + Unterlagen. Anschließend erhalten Sie ein schriftliches Gutachten mit + einer klaren, medizinisch fundierten Empfehlung. Wenn gewünscht, besprechen + wir das Ergebnis zusätzlich persönlich mit Ihnen – telefonisch oder per Videocall. + priority: medium + +FAQ 3: + id: 54 + question: "Wann ist eine Zweitmeinung vor einem Herzkatheter sinnvoll?" + slug: "wann-ist-eine-zweitmeinung-vor-einem-herzkatheter-sinnvoll" + answer: | + Immer dann, wenn ein planbarer Eingriff wie eine PCI (Stent) oder eine OP + empfohlen wurde. Auch bei Unsicherheit über Nutzen und Risiken oder wenn + Sie Alternativen in Betracht ziehen möchten, ist eine Zweitmeinung sinnvoll. + priority: medium +``` + +--- + +## 5. FAQ-Categories + +### 5.1 Übersicht + +**Anzahl:** 7 Kategorien + +| # | Name | Slug | Icon | Color | Order | +|---|------|------|------|-------|-------| +| 1 | Allgemeine Fragen zur Zweitmeinung | allgemeine-fragen-zur-zweitmeinung | help-circle | #3B82F6 | 1 | +| 2 | Zweitmeinung Intensivmedizin | zweitmeinung-intensivmedizin | activity | #3B82F6 | 2 | +| 3 | Zweitmeinung Onkologie | zweitmeinung-onkologie | flask-conical | #3B82F6 | 3 | +| 4 | Zweitmeinung Kardiologie | zweitmeinung-kardiologie | heart-pulse | #3B82F6 | 4 | +| 5 | Zweitmeinung Schilddrüse | zweitmeinung-schilddruese | scan-face | #3B82F6 | 5 | +| 6 | Zweitmeinung Gallenblase | zweitmeinung-gallenblase | droplet | #3B82F6 | 6 | +| 7 | Zweitmeinung Nephrologie | zweitmeinung-nephrologie | water | #3B82F6 | 7 | + +### 5.2 Detaillierte Kategorien + +```yaml +Kategorie 1: + id: 1 + documentId: "uzzv4ojnv78fh5ue8hhws6sz" + name: "Allgemeine Fragen zur Zweitmeinung" + slug: "allgemeine-fragen-zur-zweitmeinung" + description: "Antworten auf häufige Fragen rund um Ablauf, Nutzen und Voraussetzungen für die Zweitmeinung durch complex care solutions." + icon: "help-circle" + color: "#3B82F6" + order: 1 + +Kategorie 2: + id: 2 + documentId: "unkvri442wadlscs77l25z4x" + name: "Zweitmeinung Intensivmedizin" + slug: "zweitmeinung-intensivmedizin" + description: "Häufige Fragen zur ärztlichen Zweitmeinung in intensivmedizinischen und intensivpflegerischen Situationen." + icon: "activity" + color: "#3B82F6" + order: 2 + +Kategorie 3: + id: 3 + documentId: "x366ht2ril79ojjowh1z6zd4" + name: "Zweitmeinung Onkologie" + slug: "zweitmeinung-onkologie" + description: "Fragen zur Zweitmeinung bei Krebsdiagnosen, geplanten Chemo- oder Strahlentherapien und alternativen Behandlungswegen." + icon: "flask-conical" + color: "#3B82F6" + order: 3 + +Kategorie 4: + id: 4 + documentId: "cdt6lyhz2bsjdxnz662n8zpy" + name: "Zweitmeinung Kardiologie" + slug: "zweitmeinung-kardiologie" + description: "Alles zur Zweitmeinung bei Herzkatheter, Stent, Bypass oder kardiologischer Diagnostik." + icon: "heart-pulse" + color: "#3B82F6" + order: 4 + +Kategorie 5: + id: 5 + documentId: "cqdqa90qsp7bt0f8dqocqxd2" + name: "Zweitmeinung Schilddrüse" + slug: "zweitmeinung-schilddruese" + description: "Antworten zu OP-Empfehlungen bei Schilddrüsenknoten, Struma oder Autonomie – und möglichen Alternativen." + icon: "scan-face" + color: "#3B82F6" + order: 5 + +Kategorie 6: + id: 6 + documentId: "rw2cq64xi5bxvof3dptc9yk1" + name: "Zweitmeinung Gallenblase" + slug: "zweitmeinung-gallenblase" + description: "Fragen zu Gallenblasenentfernung, Gallensteinen und wann eine Operation wirklich notwendig ist." + icon: "droplet" + color: "#3B82F6" + order: 6 + +Kategorie 7: + id: 7 + documentId: "ya7lbknzu4kat2l6xcm87q6k" + name: "Zweitmeinung Nephrologie" + slug: "zweitmeinung-nephrologie" + description: "Antworten auf häufige Fragen bei chronischen Nierenerkrankungen, Dialyse und Transplantation." + icon: "water" + color: "#3B82F6" + order: 7 +``` + +--- + +## 6. Pages + +### 6.1 Übersicht + +**Anzahl:** 4 Seiten + +| # | Title | Slug | Sections | +|---|-------|------|----------| +| 1 | Startseite zweitmein.ng | home | 1 (hero-carousel) | +| 2 | FAQ - Häufige Fragen | faq | 4 (faq-hero, faq-search-results, faq-categories, faq-cta) | +| 3 | Motivation & Geschichte | motivation | 7 (hero-section, story-section x5, core-values, mission-statement) | +| 4 | So funktioniert's | so-funktionierts | 6 (hero-section, process-steps-detailed, why-choose-cards, service-tiers-timeline, benefits-comparison, process-cta) | + +--- + +### 6.2 Page: Startseite (home) + +```yaml +id: 15 +documentId: "kel6qh6p1wniyax1ng8ctwcy" +title: "Startseite zweitmein.ng" +slug: "home" +isSharedContent: false + +sections: + - __component: "sections.hero-carousel" + id: 5 + autoplay: true + autoplayInterval: 6000 + showDots: true + showArrows: true + transitionType: "fade" + transitionDuration: 800 + pauseOnHover: true + infiniteLoop: true + height: "screen-75" + mobileHeight: "screen-50" + preloadImages: true + lazyLoad: false +``` + +--- + +### 6.3 Page: FAQ - Häufige Fragen + +```yaml +id: 17 +documentId: "kc2z3etkm6iuplnqrlky1tw7" +title: "FAQ - Häufige Fragen" +slug: "faq" +isSharedContent: false + +sections: + - __component: "sections.faq-hero" + id: 2 + title: "FAQ - Häufige Fragen" + subtitle: "Antworten auf die wichtigsten Fragen zur medizinischen Zweitmeinung" + description: "Von Onkologie über Kardiologie bis Intensivmedizin" + showSearch: true + searchPlaceholder: "Suchen Sie nach Stichworten oder Fragen..." + backgroundColor: "bg-primary-600" + + - __component: "sections.faq-search-results" + id: 2 + showResultCount: true + noResultsMessage: "Keine Ergebnisse gefunden. Versuchen Sie es mit anderen Suchbegriffen oder kontaktieren Sie uns direkt." + groupByCategory: true + highlightSearchTerms: true + maxResultsPerCategory: 5 + + - __component: "sections.faq-categories" + id: 2 + description: "Wählen Sie Ihren Fachbereich für spezifische Antworten" + columns: 3 + showQuestionCount: true + + - __component: "sections.faq-cta" + id: 2 + icon: "HelpCircle" + iconColor: "text-yellow-500" + title: "Ihre Frage nicht dabei?" + description: "Unsere Experten beantworten gerne Ihre individuellen Fragen zur medizinischen Zweitmeinung. Kontaktieren Sie uns für eine kostenlose Erstberatung." + additionalInfo: "Kostenlose Hotline • Mo-Fr 9:00-16:00 Uhr • Notfall 24/7" + backgroundColor: "bg-primary-700" + textColor: "text-white" +``` + +--- + +### 6.4 Page: Motivation & Geschichte + +```yaml +id: 25 +documentId: "kkyhnzpo7vjf22kde00p26wf" +title: "Motivation & Geschichte" +slug: "motivation" +isSharedContent: false + +sections: + - __component: "sections.hero-section" + title: "Patientenwohl im Mittelpunkt" + subtitle: "Wir sind Streiter für das Patientenwohl" + backgroundType: "gradient" + backgroundColor: "bg-healthcare-primary" + textAlignment: "center" + + - __component: "sections.story-section" + heading: "Unser Fokus" + content: | + Seit der Gründung konzentrieren wir uns darauf, Versorgungsangebote zu optimieren + und dabei die Bedürfnisse der Patienten in den Mittelpunkt zu stellen. + + = Wir verfolgen einen patientenzentrierten Ansatz. + = Wir legen besonderen Wert auf Transparenz, Unabhängigkeit und Qualitätssicherung. + = Mit unserem nationalen und internationalen Expertennetzwerk entwickeln wir + innovative Lösungen und Dienstleistungen. + imagePosition: "right" + + - __component: "sections.story-section" + heading: "Motivation und Geschichte" + content: | + Complex care solutions wurde von Martin Porwoll, dem Whistleblower des Bottroper + Zytoskandals, gegründet. + imagePosition: "left" + quote: "Aus seinen Erfahrungen und der Erkenntnis um die Bedeutung von Transparenz + und Patientenwohl entstand die Idee, ein unabhängiges Unternehmen zu etablieren..." + quoteHighlight: true + + - __component: "sections.story-section" + heading: "Gründer und Geschäftsführer" + content: | + Seitdem habe ich mich dem Auftrag verschrieben, Patienteninteressen im + Gesundheitswesen zu vertreten. + imagePosition: "right" + quote: "„Der Bottroper Zytoskandal, den ich im Jahr 2016 als Whistleblower + aufgedeckt habe, hat mich zutiefst erschüttert.\"" + attribution: "— Martin Porwoll, Gründer & Geschäftsführer" + + - __component: "sections.story-section" + heading: "Der Zytoskandal Bottrop und Martin Porwoll" + content: | + Die Gründung von complex care solutions ist eng mit der persönlichen Geschichte + des Gründers Martin Porwoll verbunden. + + Im Jahr 2016 deckte er als Whistleblower den sogenannten Zytoskandal in Bottrop auf, + bei dem ein Apotheker über Jahre hinweg Krebsmedikamente für tausende Patienten + gestreckt hatte. + imagePosition: "left" + quote: "Dieser Skandal erschütterte das Vertrauen der Öffentlichkeit in das + Gesundheitswesen..." + quoteHighlight: true + + - __component: "sections.story-section" + heading: "Martin Porwolls Weg zum Streiter für das Patientenwohl" + content: | + Die Erfahrungen mit dem Zytoskandal haben Martin Porwoll zu einem engagierten + Kämpfer für das Patientenwohl und gegen Missstände im Gesundheitswesen gemacht. + imagePosition: "right" + quote: "So gründete er Complex care solutions mit dem Ziel, Patienten in komplexen + Versorgungssituationen bestmöglich zu unterstützen..." + + - __component: "sections.core-values" + heading: "Unsere Grundwerte" + subheading: "Diese Prinzipien leiten uns bei allem, was wir für eine bessere + Patientenversorgung tun." + + - __component: "sections.mission-statement" + icon: "heart" + heading: "Unsere Mission" + quote: | + "Wir setzen uns dafür ein, dass jeder Patient die bestmögliche Versorgung erhält. + Durch innovative Technologie, Transparenz und unabhängige Expertise schaffen wir + Vertrauen und verbessern die Gesundheitsversorgung." + attribution: "— Das Team von zweitmeinung.ng" + backgroundColor: "default" +``` + +--- + +### 6.5 Page: So funktioniert's + +```yaml +id: 28 +documentId: "fthzlwpv8wkus2i0bnwaftqk" +title: "So funktioniert's" +slug: "so-funktionierts" +isSharedContent: false + +sections: + - __component: "sections.hero-section" + title: "So funktioniert's" + subtitle: "Ihr Weg zur medizinischen Zweitmeinung in 6 einfachen Schritten." + description: "Transparent, sicher und patientenorientiert." + backgroundType: "gradient" + backgroundColor: "bg-healthcare-primary" + textAlignment: "center" + minHeight: "lg" + + - __component: "sections.process-steps-detailed" + layout: "horizontal" + showConnectors: true + connectorStyle: "solid" + backgroundColor: "bg-gray-50" + + - __component: "sections.why-choose-cards" + columns: 4 + cardStyle: "elevated" + backgroundColor: "bg-gray-50" + + - __component: "sections.service-tiers-timeline" + layout: "cards" + showPricing: false + backgroundColor: "bg-white" + + - __component: "sections.benefits-comparison" + layout: "equal" + showDividers: true + backgroundColor: "bg-primary-600" + textColor: "text-white" + + - __component: "sections.process-cta" + icon: "Heart" + iconColor: "text-yellow-500" + heading: "Bereit für Ihre Zweitmeinung?" + description: "Starten Sie jetzt und erhalten Sie in kürzester Zeit eine fundierte, + unabhängige Einschätzung Ihres medizinischen Falls." + backgroundColor: "bg-primary-50" + accentColor: "bg-primary-600" + containerStyle: "card" +``` + +--- + +## 7. Legal-Pages + +### 7.1 Übersicht + +**Anzahl:** 2 rechtliche Seiten + +| # | Type | Title | Country | Language | +|---|------|-------|---------|----------| +| 1 | impressum | - | de | de | +| 2 | datenschutz | Datenschutzerklärung | de | de | + +--- + +### 7.2 Impressum + +```yaml +id: 2 +documentId: "cz6spc2ouyuvh1f9ddrelnu5" +type: "impressum" +country: "de" +language: "de" +version: "v1.0" + +content: | + # Impressum + complex care solutions GmbH + Hans-Böckler-Str. 19 + 46236 Bottrop + + Handelsregister: HRB 15753 + Registergericht: Gelsenkirchen + + Vertreten durch: + Martin Porwoll + + ### Kontakt + Telefon: 0800 80 44 100 + Telefax: 0800 80 44 190 + E-Mail: kontakt@complexcaresolutions.de + + ### Umsatzsteuer-ID + Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz: + DE334815479 + + Redaktionell verantwortlich + + Martin Porwoll + Hans-Böckler-Str. 19 + 46236 Bottrop + + ### EU-Streitschlichtung + Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) + bereit: https://ec.europa.eu/consumers/odr/. + Unsere E-Mail-Adresse finden Sie oben im Impressum. + + ### Verbraucherstreitbeilegung/Universalschlichtungsstelle + Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer + Verbraucherschlichtungsstelle teilzunehmen. +``` + +--- + +### 7.3 Datenschutzerklärung + +```yaml +id: 5 +documentId: "jnn8mbgr1grkmjqrdpx2mc33" +type: "datenschutz" +title: "Datenschutzerklärung" +slug: "datenschutzerklaerung" +description: "DSGVO-konforme Datenschutzerklärung bereitgestellt von alfright.eu für zweitmeinung-ng" +country: "de" +language: "de" +version: "v1.0" +isActive: true +siteIdentifier: "zweitmeinung-ng" + +embedType: "iframe" +embedUrl: "https://app.alfright.eu/ext/dps/alfright_schutzteam/9f315103c43245bcb0806dd56c2be757?lang=de-de&headercolor=%23131F64&headerfont=Arial&headersize=21px&subheadersize=18px&fontcolor=%23333333&textfont=Arial&textsize=14px&background=%23ffffff&linkcolor=%23337ab7" +provider: "alfright.eu" +``` + +--- + +## 8. Leere Collections + +Die folgenden Collections haben in der Produktion noch keine Einträge: + +| Collection | Status | Bemerkung | +|------------|--------|-----------| +| **Experts** | 0 Einträge | Keine Experten angelegt | +| **Blog-Posts** | 0 Einträge | Kein Blog-Content | +| **Blog-Categories** | Zugriff verweigert (403) | API nicht öffentlich | +| **News-Items** | 0 Einträge | Keine News | +| **Appointments** | Nicht abgefragt | Datenschutz-sensibel | +| **Contact-Messages** | Nicht abgefragt | Datenschutz-sensibel | +| **Waiting-Lists** | Nicht abgefragt | Datenschutz-sensibel | +| **Appointment-Slots** | Nicht abgefragt | Konfigurationsdaten | +| **Appointment-Exceptions** | Nicht abgefragt | Konfigurationsdaten | + +--- + +## Anhang: API-Endpoints + +### Abgefragte Endpoints + +```bash +# Site Configurations +GET https://st.zh3.de/api/site-configurations?populate=* + +# Services +GET https://st.zh3.de/api/services?populate=* + +# FAQs +GET https://st.zh3.de/api/faqs?populate=* + +# FAQ Categories +GET https://st.zh3.de/api/faq-categories?populate=* + +# Pages +GET https://st.zh3.de/api/pages?populate=* + +# Legal Pages +GET https://st.zh3.de/api/legal-pages?populate=* + +# Blog Posts (leer) +GET https://st.zh3.de/api/blog-posts?populate=* + +# Experts (leer) +GET https://st.zh3.de/api/experts?populate=* + +# News Items (leer) +GET https://st.zh3.de/api/news-items?populate=* +``` + +--- + +*Dokument generiert am 2026-02-20 aus Produktionsdaten* diff --git a/docs/zweitmeinung/migration-strapi-to-payload.md b/docs/zweitmeinung/migration-strapi-to-payload.md new file mode 100644 index 0000000..345c530 --- /dev/null +++ b/docs/zweitmeinung/migration-strapi-to-payload.md @@ -0,0 +1,1618 @@ +# Migration: Strapi zu Payload CMS +## Projekt: zweitmeinu.ng + +**Erstellt:** 2026-02-20 +**Strapi Version:** 5.x +**Ziel:** Payload CMS 3.x + +--- + +## Inhaltsverzeichnis + +1. [Executive Summary](#1-executive-summary) +2. [Content-Types / Collections](#2-content-types--collections) +3. [Components / Blocks](#3-components--blocks) +4. [API-Struktur](#4-api-struktur) +5. [Plugins & Extensions](#5-plugins--extensions) +6. [Datenbank & Relationen](#6-datenbank--relationen) +7. [Migrationsplan](#7-migrationsplan) +8. [Payload CMS Schema-Entwürfe](#8-payload-cms-schema-entwürfe) + +--- + +## 1. Executive Summary + +### Projektumfang + +| Kategorie | Anzahl | +|-----------|--------| +| Content-Types | 16 | +| Components | 43 | +| API-Module | 18 | +| Plugins | 16 | +| Custom Controller Methods | 14 | +| Custom Services | 10 | +| Relationen | 25+ | + +### Komplexitätsbewertung: **MITTEL-HOCH** + +Hauptkomplexität liegt im: +- Termin-Buchungssystem (Appointment) +- Multi-Site-Konfiguration +- Dynamic Zone Page Builder +- Verschachtelte Component-Hierarchien + +--- + +## 2. Content-Types / Collections + +### 2.1 Übersicht aller Content-Types + +| # | Content-Type | Draft/Publish | Felder | Relationen | Komplexität | +|---|--------------|---------------|--------|------------|-------------| +| 1 | appointment | Nein | 26 | 3 | Hoch | +| 2 | appointment-exception | Nein | 15 | 2 | Mittel | +| 3 | appointment-slot | Nein | 16 | 3 | Mittel | +| 4 | blog-category | Ja | 11 | 2 | Niedrig | +| 5 | blog-post | Ja | 15 | 2 | Mittel | +| 6 | contact-message | Nein | 13 | 1 | Niedrig | +| 7 | expert | Ja | 16 | 2 | Mittel | +| 8 | faq | Ja | 17 | 5 | Mittel | +| 9 | faq-category | Nein | 8 | 2 | Niedrig | +| 10 | faq-feedback | Nein | 15 | 3 | Niedrig | +| 11 | legal-page | Ja | 7 | 0 | Niedrig | +| 12 | news-item | Ja | 15 | 2 | Mittel | +| 13 | page | Ja | 5 | 1 | Hoch (Dynamic Zone) | +| 14 | service | Ja | 14 | 2 | Mittel | +| 15 | site-configuration | Ja | 25 | 5 | Hoch | +| 16 | waiting-list | Nein | 20 | 3 | Mittel | + +--- + +### 2.2 Detaillierte Content-Type Definitionen + +#### APPOINTMENT (Terminbuchungen) + +``` +Felder: +├── appointmentId (UUID, unique) +├── patientName (string, required, max 100) +├── patientEmail (email, required) +├── patientPhone (string, required, max 30) +├── patientDateOfBirth (date) +├── patientInsurance (string, max 100) +├── appointmentDate (date, required) +├── appointmentTime (time, required) +├── duration (integer, 15-240, default 30) +├── appointmentType (enum: consultation, examination, treatment, followup, vaccination, other) +├── status (enum: requested, confirmed, cancelled, completed, no-show) +├── confirmationToken (string, unique, private) +├── cancellationToken (string, unique, private) +├── cancellationReason (text, max 500) +├── notes (text, max 1000) +├── internalNotes (text, private) +├── reminderSent (boolean, private) +├── confirmationSent (boolean, private) +├── patientConsent (boolean, required) +├── requestedAt (datetime, private) +├── confirmedAt (datetime, private) +├── cancelledAt (datetime, private) +├── completedAt (datetime, private) +├── ipAddress (string, private) +└── userAgent (string, private) + +Relationen: +├── expert → Expert (manyToOne) +├── service → Service (manyToOne) +└── site → Site-Configuration (manyToOne) +``` + +#### APPOINTMENT-EXCEPTION (Ausnahmen/Urlaub) + +``` +Felder: +├── type (enum: holiday, vacation, sick, conference, training, blocked, other) +├── startDate (datetime, required) +├── endDate (datetime, required) +├── allDay (boolean, default false) +├── reason (string, required, max 200) +├── description (text, max 500) +├── affectsAllSites (boolean, default false) +├── recurring (boolean, default false) +├── recurringPattern (enum: daily, weekly, monthly, yearly) +├── recurringEndDate (date) +├── isActive (boolean, default true) +├── notifyPatients (boolean, default true) +└── color (string, hex format) + +Relationen: +├── expert → Expert (manyToOne, required) +└── site → Site-Configuration (manyToOne) +``` + +#### APPOINTMENT-SLOT (Verfügbare Zeitslots) + +``` +Felder: +├── dayOfWeek (enum: Mo-So, required) +├── startTime (time, required) +├── endTime (time, required) +├── slotDuration (integer, 15-240, default 30) +├── maxAppointments (integer, 1-10, default 1) +├── isActive (boolean, default true) +├── validFrom (date) +├── validUntil (date) +├── breakAfter (integer, 0-60, default 0) +├── bufferBefore (integer, 0-60, default 0) +├── bufferAfter (integer, 0-60, default 0) +├── color (string, hex) +└── notes (text, max 500) + +Relationen: +├── expert → Expert (manyToOne, required) +├── site → Site-Configuration (manyToOne, required) +└── services ↔ Service (manyToMany) +``` + +#### BLOG-CATEGORY + +``` +Felder: +├── name (string, required, unique, max 100) +├── slug (uid, required, targetField: name) +├── description (text, max 500) +├── color (string, hex, default #0070f3) +├── icon (string, max 50) +├── order (integer, default 0) +├── isActive (boolean, default true) +└── seo (component: shared.seo) + +Relationen: +├── blogPosts ← Blog-Post (oneToMany) +├── parent → Blog-Category (manyToOne, self-referential) +└── children ← Blog-Category (oneToMany, self-referential) +``` + +#### BLOG-POST + +``` +Felder: +├── title (string, required, max 200) +├── slug (uid, required, targetField: title) +├── excerpt (text, required, max 300) +├── content (richtext, required) +├── featuredImage (media, images only) +├── author (component: blog.author) +├── tags (json) +├── publishedAt (datetime) +├── readingTime (integer, min 1) +├── featured (boolean, default false) +├── relatedPosts (json) +└── seo (component: shared.seo) + +Relationen: +├── category → Blog-Category (manyToOne) +└── sites ↔ Site-Configuration (manyToMany) +``` + +#### CONTACT-MESSAGE + +``` +Felder: +├── messageId (UUID, unique) +├── name (string, required, max 100) +├── email (email, required) +├── phone (string, max 30) +├── subject (string, required, max 200) +├── message (text, required, max 5000) +├── status (enum: new, read, replied, spam) +├── consentGiven (boolean, required) +├── submittedAt (datetime, private) +├── ipAddress (string, private) +└── userAgent (string, private) + +Relationen: +└── site → Site-Configuration (manyToOne) +``` + +#### EXPERT (Ärzte/Spezialisten) + +``` +Felder: +├── expertId (UUID, unique) +├── firstName (string, required) +├── lastName (string, required) +├── slug (uid, required, targetField: lastName) +├── title (string) +├── specialties (json) +├── bio (richtext) +├── image (media, images only) +├── qualifications (component: expert.qualification, repeatable) +├── availability (component: expert.availability) +├── contactInfo (json) +├── isActive (boolean, default true) +├── order (integer, default 0) +└── seo (component: shared.seo) + +Relationen: +├── services ↔ Service (manyToMany) +└── sites ↔ Site-Configuration (manyToMany) +``` + +#### FAQ + +``` +Felder: +├── question (string, required, max 300) +├── slug (uid, required, targetField: question) +├── answer (richtext, required) +├── shortAnswer (text, max 500) +├── tags (json) +├── priority (enum: low, medium, high, featured) +├── viewCount (integer, private) +├── helpfulCount (integer) +├── notHelpfulCount (integer) +├── attachments (media, multiple) +├── videoUrl (string) +├── searchKeywords (text, private) +├── lastUpdated (datetime) +└── seo (component: shared.seo) + +Relationen: +├── category → FAQ-Category (manyToOne) +├── relatedFaqs ↔ FAQ (manyToMany, self-referential) +├── relatedServices ↔ Service (manyToMany) +├── relatedExperts ↔ Expert (manyToMany) +└── sites ↔ Site-Configuration (manyToMany) +``` + +#### FAQ-CATEGORY + +``` +Felder: +├── name (string, required, unique, max 100) +├── slug (uid, required, targetField: name) +├── description (text, max 300) +├── icon (string, default "question-circle") +├── color (string, hex, default #3B82F6) +└── order (integer, default 0) + +Relationen: +├── faqs ← FAQ (oneToMany) +└── sites ↔ Site-Configuration (manyToMany) +``` + +#### FAQ-FEEDBACK + +``` +Felder: +├── isHelpful (boolean, required) +├── comment (text, max 1000) +├── additionalFeedback (enum: too_technical, not_detailed_enough, outdated, confusing, perfect, needs_examples) +├── userEmail (email) +├── ipAddress (string, private) +├── userAgent (string, private) +├── sessionId (string, private) +├── followUpRequested (boolean, default false) +├── resolved (boolean, default false) +├── resolvedAt (datetime) +└── internalNotes (text, private) + +Relationen: +├── faq → FAQ (manyToOne, required) +├── site → Site-Configuration (manyToOne) +└── resolvedBy → Admin-User (manyToOne) +``` + +#### LEGAL-PAGE + +``` +Felder: +├── type (enum: impressum, datenschutz, agb, cookie-policy, required) +├── content (richtext, required) +├── country (enum: global, de, at, ch, nl, es, uk) +├── language (enum: de, en, nl, es, fr, it) +├── validFrom (date) +├── validUntil (date) +└── version (string) + +Relationen: Keine +``` + +#### NEWS-ITEM + +``` +Felder: +├── title (string, required, max 150) +├── slug (uid, required, targetField: title) +├── summary (text, required, max 250) +├── content (richtext, required) +├── featuredImage (media, images only) +├── newsType (enum: announcement, update, event, press_release, medical_news) +├── priority (enum: normal, important, urgent) +├── publishDate (datetime, required) +├── expiryDate (datetime) +├── author (component: blog.author) +├── tags (json) +├── attachments (media, multiple) +├── externalLink (string) +└── seo (component: shared.seo) + +Relationen: +├── sites ↔ Site-Configuration (manyToMany) +└── relatedServices ↔ Service (manyToMany) +``` + +#### PAGE (Dynamischer Page Builder) + +``` +Felder: +├── title (string, required) +├── slug (uid, required, targetField: title) +├── isSharedContent (boolean, default false) +├── sections (dynamiczone) ← KRITISCH FÜR MIGRATION +└── seo (component: shared.seo) + +Dynamic Zone Components (11): +├── sections.hero +├── sections.text-block +├── sections.cta-banner +├── sections.services-grid +├── sections.team-grid +├── sections.testimonials +├── sections.expert-grid +├── sections.faq +├── sections.contact-form +├── sections.blog-list +└── sections.faq-reference + +Relationen: +└── sites ↔ Site-Configuration (manyToMany) +``` + +#### SERVICE (Medizinische Dienstleistungen) + +``` +Felder: +├── name (string, required) +├── slug (uid, required, targetField: name) +├── description (richtext, required) +├── shortDescription (text, max 300) +├── icon (media, images only) +├── featuredImage (media, images only) +├── price (component: service.pricing) +├── features (component: service.feature, repeatable) +├── duration (string) +├── category (enum: diagnostic, therapeutic, preventive, surgical, emergency, consultation) +├── isActive (boolean, default true) +├── order (integer, default 0) +└── seo (component: shared.seo) + +Relationen: +├── sites ↔ Site-Configuration (manyToMany) +└── experts ↔ Expert (manyToMany) +``` + +#### SITE-CONFIGURATION (Zentrale Domain-Konfiguration) + +``` +Felder: +├── siteIdentifier (string, required, unique) +├── domain (string, required) +├── siteName (string, required, max 100) +├── tagline (string, max 200) +├── logo (media, images only) +├── favicon (media, images only) +├── aliases (json) +├── brand (enum: complexcare, zweitmeinung, portal, required) +├── specialty (enum: general, intensiv, kardiologie, onkologie, chirurgie, radiologie, nephrologie, orthopaedie, polypharmazie, pflege) +├── locales (json, default: de-DE) +├── navigation (json) +├── footer (json) +├── theme (component: site.theme) +├── contact (component: site.contact) +├── features (json) +├── socialMedia (component: site.social-media) +├── analytics (component: site.analytics) +├── seo (component: shared.seo) +├── portalSettings (component: site.portal-settings) +├── maintenanceMode (component: site.maintenance-mode) +├── emailSettings (component: site.email-settings, required) +└── appointmentSettings (component: appointment.appointment-settings) + +Relationen: +├── newsItems ↔ News-Item (manyToMany) +├── blogPosts ↔ Blog-Post (manyToMany) +├── services ↔ Service (manyToMany) +├── experts ↔ Expert (manyToMany) +└── pages ↔ Page (manyToMany) +``` + +#### WAITING-LIST + +``` +Felder: +├── waitingListId (UUID, unique) +├── patientName (string, required, max 100) +├── patientEmail (email, required) +├── patientPhone (string, required, max 30) +├── preferredDates (json, default []) +├── preferredTimeOfDay (enum: morning, afternoon, evening, any) +├── flexibleDates (boolean, default false) +├── priority (enum: normal, urgent, emergency) +├── status (enum: waiting, contacted, appointed, expired, cancelled) +├── notes (text, max 1000) +├── internalNotes (text, private) +├── addedAt (datetime, private) +├── contactedAt (datetime, private) +├── appointedAt (datetime, private) +├── expiresAt (datetime) +├── contactAttempts (integer, private) +├── lastContactAttempt (datetime, private) +├── patientConsent (boolean, required) +└── ipAddress (string, private) + +Relationen: +├── expert → Expert (manyToOne) +├── service → Service (manyToOne) +└── site → Site-Configuration (manyToOne) +``` + +--- + +## 3. Components / Blocks + +### 3.1 Component-Kategorien Übersicht + +| Kategorie | Anzahl | Verwendungszweck | +|-----------|--------|------------------| +| admin | 1 | Analytics Dashboard | +| appointment | 5 | Terminverwaltung-Einstellungen | +| blog | 2 | Blog-Autoren & Kategorien | +| elements | 1 | Wiederverwendbare UI-Elemente | +| expert | 2 | Qualifikationen & Verfügbarkeit | +| layout | 3 | Navigation & Footer | +| sections | 11 | Page Builder Blöcke | +| service | 2 | Preise & Features | +| shared | 3 | SEO & Meta-Daten | +| site | 12 | Site-Konfiguration | + +**Gesamt: 43 Components** + +--- + +### 3.2 Detaillierte Component-Definitionen + +#### SHARED (Wiederverwendbar in mehreren Content-Types) + +**shared.seo** (Verwendet in 7 Content-Types) +``` +├── metaTitle (string, max 60) +├── metaDescription (text, max 160) +├── keywords (text) +├── canonicalURL (string) +├── structuredData (json) +├── metaImage (media, images only) +├── openGraph (component: shared.open-graph) +└── metaSocial (component: shared.meta-social, repeatable) +``` + +**shared.open-graph** +``` +├── type (enum: website, article, profile, book, music, video) +├── title (string, max 95) +├── description (text, max 200) +├── image (media, images only) +├── url (string) +├── siteName (string, max 50) +└── locale (string, default "de_DE") +``` + +**shared.meta-social** +``` +├── socialNetwork (enum: Facebook, Twitter, LinkedIn, required) +├── title (string, max 60) +├── description (text, max 160) +└── image (media, images only) +``` + +--- + +#### ELEMENTS (Basis-Bausteine) + +**elements.button** (Verwendet in 7 Components) +``` +├── label (string, required) +├── url (string) +├── style (enum: primary, secondary, outline) +├── icon (string) +└── openInNewTab (boolean, default false) +``` + +--- + +#### SECTIONS (Page Builder Blöcke) + +**sections.hero** +``` +├── title (string) +├── subtitle (text) +├── backgroundImage (media) +├── alignment (enum: left, center, right) +└── buttons (component: elements.button, repeatable) +``` + +**sections.text-block** +``` +├── content (richtext, required) +├── layout (enum: full-width, centered, two-columns) +└── backgroundColor (enum: white, light, dark, primary) +``` + +**sections.cta-banner** +``` +├── title (string, required) +├── description (text) +├── button (component: elements.button) +└── backgroundStyle (enum: gradient, solid, image) +``` + +**sections.services-grid** +``` +├── title (string) +├── subtitle (text) +├── serviceIds (json) +├── displayMode (enum: all, selected, category) +├── category (enum: diagnostic, therapeutic, preventive, surgical, emergency, consultation) +├── columns (integer, 2-4) +├── showPrices (boolean) +└── cta (component: elements.button) +``` + +**sections.team-grid** +``` +├── title (string) +├── subtitle (text) +├── members (component: sections.team-member, repeatable) +└── columns (integer, 2-4) +``` + +**sections.team-member** +``` +├── name (string, required) +├── role (string, required) +├── bio (text) +├── image (media, images only) +└── socialLinks (json) +``` + +**sections.testimonials** +``` +├── title (string) +├── subtitle (text) +└── testimonials (component: sections.testimonial, repeatable) +``` + +**sections.testimonial** +``` +├── content (text, required) +├── author (string, required) +├── role (string) +├── company (string) +├── rating (integer, 1-5) +└── image (media, images only) +``` + +**sections.expert-grid** +``` +├── title (string) +├── subtitle (text) +├── expertIds (json) +├── displayMode (enum: all, selected, specialty) +├── specialty (string) +├── columns (integer, 2-4) +├── showAvailability (boolean) +└── cta (component: elements.button) +``` + +**sections.faq** +``` +├── title (string) +├── subtitle (text) +└── questions (component: sections.faq-item, repeatable) +``` + +**sections.faq-item** +``` +├── question (string, required) +└── answer (richtext, required) +``` + +**sections.faq-reference** (Referenziert zentrales FAQ-System) +``` +├── title (string) +├── subtitle (text) +├── displayMode (enum: accordion, list, cards, compact) +├── source (enum: selected, category, featured, popular) +├── selectedFaqs (json) +├── categorySlug (string) +├── limit (integer, 1-50) +├── showSearch (boolean) +├── showCategories (boolean) +└── cta (component: elements.button) +``` + +**sections.blog-list** +``` +├── title (string) +├── subtitle (text) +├── contentType (enum: blog_posts, news_items, both) +├── displayMode (enum: grid, list, featured) +├── itemsToShow (integer, 1-12) +├── filterByCategory (string) +├── showPagination (boolean) +└── cta (component: elements.button) +``` + +**sections.contact-form** +``` +├── title (string) +├── subtitle (text) +├── formFields (json) +├── submitButtonText (string) +├── successMessage (text) +├── recipientEmail (email) +└── consentText (text) +``` + +--- + +#### SITE (Konfiguration) + +**site.theme** +``` +├── primaryColor (string, hex, default #2563eb) +├── secondaryColor (string, hex, default #10b981) +├── accentColor (string, hex, default #f59e0b) +├── darkColor (string, hex, default #1f2937) +├── backgroundColor (string, hex, default #f3f4f6) +├── fontFamily (string, default "Inter, sans-serif") +└── customCSS (text) +``` + +**site.contact** +``` +├── email (email, required) +├── phone (string) +├── fax (string) +├── address (text) +├── emergencyHotline (string) +└── openingHours (json) +``` + +**site.social-media** +``` +├── facebook (string, regex validated) +├── twitter (string, regex validated) +├── linkedin (string, regex validated) +├── instagram (string, regex validated) +├── youtube (string, regex validated) +├── xing (string, regex validated) +├── tiktok (string, regex validated) +├── whatsapp (string) +└── telegram (string) +``` + +**site.analytics** +``` +├── googleAnalyticsId (string, regex: UA-* or G-*) +├── googleTagManagerId (string, regex: GTM-*) +├── facebookPixelId (string) +├── matomo (json) +├── hotjar (json) +├── clarity (string) +├── cookieConsent (json) +└── customScripts (json) +``` + +**site.email-settings** +``` +├── fromEmail (email, required) +├── fromName (string, required) +├── replyToEmail (email, required) +├── notificationEmail (email, required) +├── ccEmails (json) +├── emailSignature (richtext) +├── emailFooter (text) +├── notificationSettings (json) +└── emailTemplateStyle (json) +``` + +**site.maintenance-mode** +``` +├── enabled (boolean, required) +├── startDate (datetime) +├── endDate (datetime) +├── title (string) +├── message (richtext, required) +├── allowedIPs (json, private) +├── allowedRoles (json) +├── showProgressBar (boolean) +├── progressPercentage (integer, 0-100) +├── contactInfo (json) +├── customCSS (text) +└── redirectUrl (string) +``` + +**site.portal-settings** +``` +├── isPortal (boolean, required) +├── aggregatedDomains (component: site.domain-reference, repeatable) +├── showDomainGrid (boolean) +├── showLiveStatistics (boolean) +├── showExpertCarousel (boolean) +├── enableGlobalSearch (boolean) +├── showTrustIndicators (boolean) +├── statisticsConfig (component: site.statistics-config) +├── quickAccessCategories (json) +├── featuredExperts (json) +└── highlightedServices (json) +``` + +**site.domain-reference** +``` +├── domain (string, required) +├── siteIdentifier (string, required) +├── displayName (string) +├── category (enum) +├── order (integer) +└── isActive (boolean) +``` + +**site.statistics-config** +``` +├── showTotalOpinions (boolean) +├── showActiveExperts (boolean) +├── showSatisfactionRate (boolean) +├── showResponseTime (boolean) +├── refreshInterval (integer) +├── animateNumbers (boolean) +└── displayFormat (enum: compact, detailed, minimal) +``` + +--- + +#### APPOINTMENT (Terminverwaltung) + +**appointment.appointment-settings** +``` +├── bookingAdvanceDays (integer, 1-365) +├── minBookingHours (integer, 0-168) +├── maxBookingDays (integer, 1-365) +├── cancellationHours (integer, 0-168) +├── defaultDuration (integer, 15-240) +├── workingHours (component: appointment.working-hours) +├── bookingRules (json) +├── reminderHours (integer, 0-168) +├── allowWaitingList (boolean) +├── requireConfirmation (boolean) +├── requirePayment (boolean) +├── autoConfirmHours (integer) +├── maxAppointmentsPerDay (integer) +├── bufferBetweenAppointments (integer) +├── allowOnlineBooking (boolean) +├── showPrices (boolean) +├── termsAndConditions (richtext) +├── emailTemplates (component: appointment.email-templates) +├── smsEnabled (boolean) +└── notificationChannels (json) +``` + +**appointment.working-hours** +``` +├── monday (component: appointment.day-schedule) +├── tuesday (component: appointment.day-schedule) +├── wednesday (component: appointment.day-schedule) +├── thursday (component: appointment.day-schedule) +├── friday (component: appointment.day-schedule) +├── saturday (component: appointment.day-schedule) +└── sunday (component: appointment.day-schedule) +``` + +**appointment.day-schedule** +``` +├── isOpen (boolean) +├── openTime (time) +├── closeTime (time) +└── breaks (component: appointment.break-time, repeatable) +``` + +**appointment.break-time** +``` +├── startTime (time, required) +├── endTime (time, required) +└── description (string) +``` + +**appointment.email-templates** +``` +├── bookingConfirmation (richtext) +├── appointmentReminder (richtext) +├── cancellationConfirmation (richtext) +├── waitingListNotification (richtext) +├── noShowFollowUp (richtext) +├── appointmentRescheduled (richtext) +├── senderName (string) +├── senderEmail (email, required) +└── replyToEmail (email) +``` + +--- + +#### EXPERT + +**expert.qualification** +``` +├── title (string, required) +├── institution (string) +├── year (integer) +├── description (text) +└── type (enum: degree, certification, specialization, award, membership) +``` + +**expert.availability** +``` +├── schedule (json) +├── consultationTypes (json) +├── locations (json) +├── bookingUrl (string) +├── responseTime (string) +└── languages (json) +``` + +--- + +#### BLOG + +**blog.author** +``` +├── name (string, required) +├── bio (text, max 500) +├── avatar (media, images only) +├── role (string) +└── socialLinks (json) +``` + +--- + +#### SERVICE + +**service.pricing** +``` +├── basePrice (decimal, required) +├── currency (string, default EUR) +├── priceNote (text) +├── isStartingPrice (boolean) +└── paymentOptions (json) +``` + +**service.feature** +``` +├── title (string, required) +├── description (text) +└── icon (string) +``` + +--- + +## 4. API-Struktur + +### 4.1 API-Endpoints Übersicht + +| Modul | Custom Logic | Endpoints | Authentifizierung | +|-------|--------------|-----------|-------------------| +| appointment | Ja (14 Methods) | 13 | Nein (Token-basiert) | +| appointment-exception | Nein | 5 | Nein | +| appointment-slot | Nein | 5 | Nein | +| blog-category | Ja (1 Method) | 6 | Nein | +| blog-post | Ja (2 Methods) | 7 | Optional | +| contact-message | Ja (4 Methods) | 8 | Nein | +| expert | Nein | 5 | Optional | +| faq | Nein | 5 | Nein | +| faq-category | Nein | 5 | Nein | +| faq-feedback | Nein | 5 | Nein | +| legal-page | Nein | 5 | Optional | +| news-item | Nein | 5 | Optional | +| page | Nein | 5 | Optional | +| service | Nein | 5 | Optional | +| site-configuration | Nein | 5 | Optional | +| test-email | Ja (2 Methods) | 2 | Nein | +| waiting-list | Nein | 5 | Nein | + +--- + +### 4.2 Custom API-Logik (Migration erforderlich) + +#### Appointment Controller (14 Custom Methods) + +```typescript +// Kritische Business Logic für Payload Migration + +1. getAvailability(expert, service, startDate, endDate) + - Berechnet verfügbare Zeitslots + - Berücksichtigt: Slots, Exceptions, bestehende Termine + - Filtert nach Buchungsfenster (24h-90d) + +2. bookAppointment(patientData, appointmentDetails) + - Validiert alle Felder + - Prüft Slot-Verfügbarkeit + - Generiert Confirmation/Cancellation Tokens + - Sendet Bestätigungs-Email + +3. confirmAppointment(token) + - Validiert Token + - Setzt Status auf 'confirmed' + - Sendet Bestätigungs-Email + +4. cancelAppointment(token, reason) + - Prüft Stornierungsrichtlinie (24h) + - Setzt Status auf 'cancelled' + - Verarbeitet Warteliste + - Benachrichtigt nächsten Patienten + +5. rescheduleAppointment(appointmentId, newSlot) + - Validiert neuen Slot + - Aktualisiert Termin + - Sendet Benachrichtigung + +6. addToWaitingList(patientData, preferences) + - Erstellt Wartelisten-Eintrag + - Sendet Bestätigung + +7. getCalendarView(expert, view, date) + - Erstellt Kalender-Übersicht + - Gruppiert nach Tag/Woche/Monat + +8. getStatistics(period, expert) + - Berechnet Statistiken + - Status-Verteilung, No-Show-Rate, etc. + +9. sendReminders() + - Daily Job für morgige Termine + - Setzt reminderSent Flag + +10. exportAppointments(format, filters) + - CSV-Export + - Gefiltert nach Datum/Expert/Status + +11-14. Email Services + - sendConfirmationEmail() + - sendCancellationEmail() + - sendReminderEmail() + - sendWaitingListNotification() +``` + +#### Contact-Message Controller (4 Custom Methods) + +```typescript +1. create(data) - mit Spam-Schutz + - Honeypot-Feld Prüfung + - Minimum 3 Sekunden Ausfüllzeit + - Email-Benachrichtigung an Site-Admin + +2. markAsRead(id) + - Setzt Status auf 'read' + +3. markAsSpam(id) + - Setzt Status auf 'spam' + +4. stats() + - Statistiken der letzten 30 Tage +``` + +#### Blog-Post Controller (2 Custom Methods) + +```typescript +1. findRelated(postId) + - Findet ähnliche Posts nach Kategorie + +2. findByCategory(categorySlug, pagination) + - Filtert Posts nach Kategorie-Slug +``` + +--- + +### 4.3 Middleware + +**Contact Rate Limiting** (Optional) +```typescript +// /src/middlewares/contact-rate-limit.ts +{ + limit: 5, // Anfragen + interval: 60, // Sekunden + tracking: 'ip+path' +} +``` + +--- + +## 5. Plugins & Extensions + +### 5.1 Installierte Plugins + +| Plugin | Version | Payload Äquivalent | +|--------|---------|-------------------| +| @strapi/plugin-documentation | 5.18.0 | Built-in API Docs | +| @strapi/plugin-graphql | 5.18.0 | @payloadcms/plugin-graphql | +| @strapi/plugin-users-permissions | 5.18.0 | Built-in Auth | +| @strapi/plugin-seo | 2.0.8 | @payloadcms/plugin-seo | +| @strapi/provider-email-nodemailer | 5.18.0 | Nodemailer via Hooks | +| @_sh/strapi-plugin-ckeditor | 6.0.2 | Lexical Editor (built-in) | +| strapi-plugin-navigation | 3.0.16 | @payloadcms/plugin-nested-docs | +| strapi-plugin-superfields | 5.8.2 | Custom Field Types | +| strapi-plugin-multi-select | 2.1.1 | Select Field (built-in) | +| strapi-plugin-country-select | 2.1.0 | Custom Select | +| strapi-plugin-bold-title-editor | 2.0.0 | Custom RichText Config | +| strapi-5-sitemap-plugin | 1.0.7 | afterChange Hook | +| strapi-cache | 1.5.5 | Redis Plugin | +| strapi-advanced-uuid | 2.1.1 | Custom ID Field | +| strapi-5-plugin-responsive-backend | 0.0.4 | Built-in Responsive UI | +| @chartbrew/plugin-strapi | 3.0.0 | External Integration | + +### 5.2 Plugin-Konfigurationen + +**CKEditor 5 Toolbar:** +``` +Heading | Bold, Italic, Underline, Strikethrough | +BulletedList, NumberedList | Blockquote | +Table | Code, CodeBlock | Link | Image +``` + +**Navigation Plugin:** +```typescript +{ + contentTypes: ["page", "service", "expert", "blog-post", "faq"], + allowedLevels: 3 +} +``` + +**Cache Plugin:** +```typescript +{ + type: "mem", + maxAge: 3600000, + cacheRoutes: ["/api/services", "/api/experts", "/api/faq", "/api/blog-posts"] +} +``` + +--- + +## 6. Datenbank & Relationen + +### 6.1 Relationen-Diagramm + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ SITE-CONFIGURATION │ +│ (Zentrale Konfiguration) │ +└─────────────────────────────────────────────────────────────────┘ + │ │ │ │ │ + ▼ ▼ ▼ ▼ ▼ + ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ + │ Expert │ │Service │ │ Page │ │BlogPost│ │NewsItem│ + └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ + │ │ │ + │ │ ▼ + │ │ ┌─────────────┐ + │ │ │BlogCategory │ + │ │ └─────────────┘ + │ │ + ▼ ▼ + ┌─────────────────────────────────────────┐ + │ APPOINTMENT │ + │ (Termin-Buchungen) │ + └─────────────────────────────────────────┘ + │ + ├──────────────────┐ + ▼ ▼ + ┌───────────────┐ ┌─────────────────────┐ + │Appointment- │ │ Appointment- │ + │Exception │ │ Slot │ + └───────────────┘ └─────────────────────┘ + + ┌─────────────────────────────────────────┐ + │ FAQ SYSTEM │ + └─────────────────────────────────────────┘ + ┌────────────┐ ┌────────┐ ┌─────────────┐ + │FAQ-Category│ ──► │ FAQ │ ◄── │FAQ-Feedback │ + └────────────┘ └────────┘ └─────────────┘ + │ + ▼ + ┌─────────────────────┐ + │ Related: Service, │ + │ Expert, FAQ │ + └─────────────────────┘ + + ┌─────────────────────────────────────────┐ + │ CONTACT & WAITING │ + └─────────────────────────────────────────┘ + ┌────────────────┐ ┌─────────────┐ + │Contact-Message │ │Waiting-List │ + │ → Site │ │→Expert,Svc │ + └────────────────┘ └─────────────┘ +``` + +### 6.2 Bidirektionale Relationen (ManyToMany) + +| Relation | Seite A | Seite B | +|----------|---------|---------| +| 1 | Site-Configuration | Expert | +| 2 | Site-Configuration | Service | +| 3 | Site-Configuration | Page | +| 4 | Site-Configuration | Blog-Post | +| 5 | Site-Configuration | News-Item | +| 6 | Site-Configuration | FAQ | +| 7 | Site-Configuration | FAQ-Category | +| 8 | Expert | Service | +| 9 | FAQ | FAQ (self-referential) | +| 10 | FAQ | Service | +| 11 | FAQ | Expert | +| 12 | Blog-Category | Blog-Category (self-referential) | + +--- + +## 7. Migrationsplan + +### 7.1 Phase 1: Payload CMS Setup (Woche 1) + +```bash +# Installation +npx create-payload-app@latest zweitmeinu-ng-payload +cd zweitmeinu-ng-payload + +# Plugins +npm install @payloadcms/plugin-graphql +npm install @payloadcms/plugin-seo +npm install @payloadcms/plugin-nested-docs +npm install @payloadcms/plugin-form-builder +npm install @payloadcms/richtext-lexical +``` + +### 7.2 Phase 2: Collections erstellen (Woche 2-3) + +**Priorität 1 - Basis Collections:** +1. Users (Admin) +2. Media +3. Site-Configuration → Sites +4. Legal-Page → LegalPages + +**Priorität 2 - Content Collections:** +5. Expert → Experts +6. Service → Services +7. FAQ-Category → FAQCategories +8. FAQ → FAQs +9. Blog-Category → BlogCategories +10. Blog-Post → BlogPosts +11. News-Item → NewsItems + +**Priorität 3 - Page Builder:** +12. Page → Pages (mit Blocks) + +**Priorität 4 - Appointment System:** +13. Appointment → Appointments +14. Appointment-Slot → AppointmentSlots +15. Appointment-Exception → AppointmentExceptions +16. Waiting-List → WaitingList + +**Priorität 5 - Formulare:** +17. Contact-Message → ContactMessages +18. FAQ-Feedback → FAQFeedback + +### 7.3 Phase 3: Blocks erstellen (Woche 3) + +```typescript +// /src/blocks/index.ts +export const blocks = [ + HeroBlock, + TextBlock, + CTABanner, + ServicesGrid, + TeamGrid, + Testimonials, + ExpertGrid, + FAQSection, + FAQReference, + BlogList, + ContactForm, +]; +``` + +### 7.4 Phase 4: Custom Endpoints (Woche 4) + +```typescript +// /src/endpoints/appointments.ts +export const appointmentEndpoints = { + getAvailability, + bookAppointment, + confirmAppointment, + cancelAppointment, + rescheduleAppointment, + getCalendarView, + getStatistics, + sendReminders, + exportAppointments, +}; +``` + +### 7.5 Phase 5: Daten-Migration (Woche 5) + +```typescript +// Migration Script Struktur +const migrationOrder = [ + 'site-configuration', + 'expert', + 'service', + 'faq-category', + 'faq', + 'blog-category', + 'blog-post', + 'news-item', + 'legal-page', + 'page', + 'appointment-slot', + 'appointment-exception', + 'appointment', + 'waiting-list', + 'contact-message', + 'faq-feedback', +]; +``` + +### 7.6 Phase 6: Testing & Go-Live (Woche 6) + +1. API-Kompatibilitätstests +2. Frontend-Integration +3. Performance-Tests +4. Staging-Deployment +5. Production-Migration + +--- + +## 8. Payload CMS Schema-Entwürfe + +### 8.1 Beispiel: Appointments Collection + +```typescript +// /src/collections/Appointments.ts +import { CollectionConfig } from 'payload/types'; + +export const Appointments: CollectionConfig = { + slug: 'appointments', + admin: { + useAsTitle: 'patientName', + defaultColumns: ['patientName', 'appointmentDate', 'status', 'expert'], + group: 'Termine', + }, + access: { + read: () => true, + create: () => true, + update: ({ req: { user } }) => Boolean(user), + delete: ({ req: { user } }) => Boolean(user), + }, + fields: [ + { + name: 'appointmentId', + type: 'text', + unique: true, + admin: { readOnly: true }, + hooks: { + beforeChange: [({ value }) => value || crypto.randomUUID()], + }, + }, + { + type: 'row', + fields: [ + { name: 'patientName', type: 'text', required: true, maxLength: 100 }, + { name: 'patientEmail', type: 'email', required: true }, + { name: 'patientPhone', type: 'text', required: true, maxLength: 30 }, + ], + }, + { + type: 'row', + fields: [ + { name: 'appointmentDate', type: 'date', required: true }, + { name: 'appointmentTime', type: 'text', required: true }, // HH:MM format + { name: 'duration', type: 'number', min: 15, max: 240, defaultValue: 30 }, + ], + }, + { + name: 'appointmentType', + type: 'select', + required: true, + options: [ + { label: 'Beratung', value: 'consultation' }, + { label: 'Untersuchung', value: 'examination' }, + { label: 'Behandlung', value: 'treatment' }, + { label: 'Nachsorge', value: 'followup' }, + { label: 'Impfung', value: 'vaccination' }, + { label: 'Sonstiges', value: 'other' }, + ], + }, + { + name: 'status', + type: 'select', + required: true, + defaultValue: 'requested', + options: [ + { label: 'Angefragt', value: 'requested' }, + { label: 'Bestätigt', value: 'confirmed' }, + { label: 'Storniert', value: 'cancelled' }, + { label: 'Abgeschlossen', value: 'completed' }, + { label: 'Nicht erschienen', value: 'no-show' }, + ], + }, + { + name: 'expert', + type: 'relationship', + relationTo: 'experts', + }, + { + name: 'service', + type: 'relationship', + relationTo: 'services', + }, + { + name: 'site', + type: 'relationship', + relationTo: 'sites', + }, + { + name: 'tokens', + type: 'group', + admin: { condition: () => false }, // Hidden in admin + fields: [ + { name: 'confirmationToken', type: 'text' }, + { name: 'cancellationToken', type: 'text' }, + ], + }, + { + name: 'notes', + type: 'textarea', + maxLength: 1000, + }, + { + name: 'internalNotes', + type: 'textarea', + admin: { condition: ({ req: { user } }) => Boolean(user) }, + }, + { + name: 'patientConsent', + type: 'checkbox', + required: true, + }, + { + name: 'timestamps', + type: 'group', + admin: { readOnly: true }, + fields: [ + { name: 'requestedAt', type: 'date' }, + { name: 'confirmedAt', type: 'date' }, + { name: 'cancelledAt', type: 'date' }, + { name: 'completedAt', type: 'date' }, + ], + }, + ], + hooks: { + beforeChange: [ + async ({ data, operation }) => { + if (operation === 'create') { + data.timestamps = { requestedAt: new Date() }; + data.tokens = { + confirmationToken: crypto.randomUUID(), + cancellationToken: crypto.randomUUID(), + }; + } + return data; + }, + ], + afterChange: [ + async ({ doc, operation }) => { + if (operation === 'create') { + // Send confirmation email + await sendAppointmentConfirmationEmail(doc); + } + }, + ], + }, +}; +``` + +### 8.2 Beispiel: Page Collection mit Blocks + +```typescript +// /src/collections/Pages.ts +import { CollectionConfig } from 'payload/types'; +import { blocks } from '../blocks'; + +export const Pages: CollectionConfig = { + slug: 'pages', + admin: { + useAsTitle: 'title', + group: 'Content', + }, + versions: { + drafts: true, + }, + fields: [ + { + name: 'title', + type: 'text', + required: true, + }, + { + name: 'slug', + type: 'text', + required: true, + unique: true, + admin: { + position: 'sidebar', + }, + hooks: { + beforeValidate: [({ value, data }) => + value || data?.title?.toLowerCase().replace(/\s+/g, '-') + ], + }, + }, + { + name: 'isSharedContent', + type: 'checkbox', + defaultValue: false, + admin: { position: 'sidebar' }, + }, + { + name: 'sections', + type: 'blocks', + blocks, + }, + { + name: 'sites', + type: 'relationship', + relationTo: 'sites', + hasMany: true, + admin: { position: 'sidebar' }, + }, + { + name: 'seo', + type: 'group', + fields: [ + { name: 'metaTitle', type: 'text', maxLength: 60 }, + { name: 'metaDescription', type: 'textarea', maxLength: 160 }, + { name: 'metaImage', type: 'upload', relationTo: 'media' }, + ], + }, + ], +}; +``` + +### 8.3 Beispiel: Hero Block + +```typescript +// /src/blocks/Hero.ts +import { Block } from 'payload/types'; + +export const HeroBlock: Block = { + slug: 'hero', + labels: { + singular: 'Hero', + plural: 'Heroes', + }, + fields: [ + { + name: 'title', + type: 'text', + }, + { + name: 'subtitle', + type: 'textarea', + }, + { + name: 'backgroundImage', + type: 'upload', + relationTo: 'media', + }, + { + name: 'alignment', + type: 'select', + defaultValue: 'center', + options: [ + { label: 'Links', value: 'left' }, + { label: 'Zentriert', value: 'center' }, + { label: 'Rechts', value: 'right' }, + ], + }, + { + name: 'buttons', + type: 'array', + fields: [ + { name: 'label', type: 'text', required: true }, + { name: 'url', type: 'text' }, + { + name: 'style', + type: 'select', + options: ['primary', 'secondary', 'outline'], + }, + { name: 'openInNewTab', type: 'checkbox' }, + ], + }, + ], +}; +``` + +--- + +## Anhang: Checkliste für Migration + +### Content-Types → Collections +- [ ] appointment → Appointments +- [ ] appointment-exception → AppointmentExceptions +- [ ] appointment-slot → AppointmentSlots +- [ ] blog-category → BlogCategories +- [ ] blog-post → BlogPosts +- [ ] contact-message → ContactMessages +- [ ] expert → Experts +- [ ] faq → FAQs +- [ ] faq-category → FAQCategories +- [ ] faq-feedback → FAQFeedback +- [ ] legal-page → LegalPages +- [ ] news-item → NewsItems +- [ ] page → Pages +- [ ] service → Services +- [ ] site-configuration → Sites +- [ ] waiting-list → WaitingList + +### Components → Blocks/Fields +- [ ] shared.seo → SEO Group Field +- [ ] elements.button → Button Array Field +- [ ] sections.hero → HeroBlock +- [ ] sections.text-block → TextBlock +- [ ] sections.cta-banner → CTABannerBlock +- [ ] sections.services-grid → ServicesGridBlock +- [ ] sections.team-grid → TeamGridBlock +- [ ] sections.testimonials → TestimonialsBlock +- [ ] sections.expert-grid → ExpertGridBlock +- [ ] sections.faq → FAQBlock +- [ ] sections.faq-reference → FAQReferenceBlock +- [ ] sections.blog-list → BlogListBlock +- [ ] sections.contact-form → ContactFormBlock +- [ ] site.theme → ThemeGroup +- [ ] site.contact → ContactGroup +- [ ] site.social-media → SocialMediaGroup +- [ ] site.analytics → AnalyticsGroup +- [ ] site.email-settings → EmailSettingsGroup +- [ ] appointment.appointment-settings → AppointmentSettingsGroup +- [ ] appointment.working-hours → WorkingHoursGroup +- [ ] appointment.email-templates → EmailTemplatesGroup + +### Custom API Logic → Hooks/Endpoints +- [ ] Appointment Availability Calculation +- [ ] Appointment Booking Flow +- [ ] Appointment Confirmation (Token-based) +- [ ] Appointment Cancellation +- [ ] Waiting List Processing +- [ ] Email Notifications +- [ ] Statistics Calculation +- [ ] CSV Export +- [ ] Contact Form Spam Protection +- [ ] Blog Related Posts + +### Plugins → Payload Äquivalente +- [ ] GraphQL Plugin +- [ ] SEO Plugin +- [ ] Nested Docs (Navigation) +- [ ] Rich Text Editor Configuration +- [ ] Caching Strategy +- [ ] Sitemap Generation + +--- + +*Dokument generiert am 2026-02-20* diff --git a/docs/zweitmeinung/screenshots/FAQ.jpeg b/docs/zweitmeinung/screenshots/FAQ.jpeg new file mode 100644 index 0000000..fde540c Binary files /dev/null and b/docs/zweitmeinung/screenshots/FAQ.jpeg differ diff --git a/docs/zweitmeinung/screenshots/Startseite.jpeg b/docs/zweitmeinung/screenshots/Startseite.jpeg new file mode 100644 index 0000000..b2ba2c1 Binary files /dev/null and b/docs/zweitmeinung/screenshots/Startseite.jpeg differ diff --git a/docs/zweitmeinung/screenshots/impressum.jpeg b/docs/zweitmeinung/screenshots/impressum.jpeg new file mode 100644 index 0000000..acb52cb Binary files /dev/null and b/docs/zweitmeinung/screenshots/impressum.jpeg differ diff --git a/docs/zweitmeinung/screenshots/intensivmedizin.jpeg b/docs/zweitmeinung/screenshots/intensivmedizin.jpeg new file mode 100644 index 0000000..f7e9cee Binary files /dev/null and b/docs/zweitmeinung/screenshots/intensivmedizin.jpeg differ diff --git a/docs/zweitmeinung/screenshots/kardiologie.jpeg b/docs/zweitmeinung/screenshots/kardiologie.jpeg new file mode 100644 index 0000000..4650b98 Binary files /dev/null and b/docs/zweitmeinung/screenshots/kardiologie.jpeg differ diff --git a/docs/zweitmeinung/screenshots/kontakt.jpeg b/docs/zweitmeinung/screenshots/kontakt.jpeg new file mode 100644 index 0000000..6787382 Binary files /dev/null and b/docs/zweitmeinung/screenshots/kontakt.jpeg differ diff --git a/docs/zweitmeinung/screenshots/motivation.jpeg b/docs/zweitmeinung/screenshots/motivation.jpeg new file mode 100644 index 0000000..ca5678d Binary files /dev/null and b/docs/zweitmeinung/screenshots/motivation.jpeg differ diff --git a/docs/zweitmeinung/screenshots/news.png b/docs/zweitmeinung/screenshots/news.png new file mode 100644 index 0000000..24d3e7c Binary files /dev/null and b/docs/zweitmeinung/screenshots/news.png differ diff --git a/docs/zweitmeinung/screenshots/onkologie.jpeg b/docs/zweitmeinung/screenshots/onkologie.jpeg new file mode 100644 index 0000000..d699a88 Binary files /dev/null and b/docs/zweitmeinung/screenshots/onkologie.jpeg differ diff --git a/docs/zweitmeinung/screenshots/ueberuns01.png b/docs/zweitmeinung/screenshots/ueberuns01.png new file mode 100644 index 0000000..b953f8a Binary files /dev/null and b/docs/zweitmeinung/screenshots/ueberuns01.png differ diff --git a/docs/zweitmeinung/screenshots/ueberuns02.png b/docs/zweitmeinung/screenshots/ueberuns02.png new file mode 100644 index 0000000..b3df18c Binary files /dev/null and b/docs/zweitmeinung/screenshots/ueberuns02.png differ diff --git a/docs/zweitmeinung/screenshots/ueberuns03.jpeg b/docs/zweitmeinung/screenshots/ueberuns03.jpeg new file mode 100644 index 0000000..d80b2b1 Binary files /dev/null and b/docs/zweitmeinung/screenshots/ueberuns03.jpeg differ diff --git a/docs/zweitmeinung/screenshots/ueberuns04.png b/docs/zweitmeinung/screenshots/ueberuns04.png new file mode 100644 index 0000000..f6e1f3a Binary files /dev/null and b/docs/zweitmeinung/screenshots/ueberuns04.png differ diff --git a/docs/zweitmeinung/screenshots/ueberuns05.png b/docs/zweitmeinung/screenshots/ueberuns05.png new file mode 100644 index 0000000..0d01fd0 Binary files /dev/null and b/docs/zweitmeinung/screenshots/ueberuns05.png differ diff --git a/docs/zweitmeinung/screenshots/warumunswaehlen.png b/docs/zweitmeinung/screenshots/warumunswaehlen.png new file mode 100644 index 0000000..aa9d5cc Binary files /dev/null and b/docs/zweitmeinung/screenshots/warumunswaehlen.png differ diff --git a/scripts/setup-github-protection.sh b/scripts/setup-github-protection.sh new file mode 100755 index 0000000..8d4e4c0 --- /dev/null +++ b/scripts/setup-github-protection.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# Setup GitHub branch protection and auto-merge for Dependabot +# Repository: complexcaresolutions/cms.c2sgmbh +# +# Voraussetzungen: +# - gh CLI installiert und authentifiziert (gh auth login) +# - Admin-Rechte auf das Repository + +set -euo pipefail + +REPO="complexcaresolutions/cms.c2sgmbh" +BRANCH="main" + +echo "=== GitHub Repository Setup für Dependabot ===" +echo "Repository: $REPO" +echo "Branch: $BRANCH" +echo "" + +# 1. Prüfe gh CLI Auth +echo "[1/4] Prüfe GitHub CLI Authentifizierung..." +if ! gh auth status &>/dev/null; then + echo "FEHLER: gh CLI nicht authentifiziert. Bitte 'gh auth login' ausführen." + exit 1 +fi +echo " OK" + +# 2. Auto-Merge aktivieren +echo "[2/4] Aktiviere Auto-Merge in Repository-Settings..." +gh api "repos/$REPO" \ + --method PATCH \ + --field allow_auto_merge=true \ + --silent +echo " OK" + +# 3. Branch Protection setzen +echo "[3/4] Setze Branch Protection auf '$BRANCH'..." +gh api "repos/$REPO/branches/$BRANCH/protection" \ + --method PUT \ + --input - <<'EOF' +{ + "required_status_checks": { + "strict": true, + "contexts": ["CI Success"] + }, + "enforce_admins": false, + "required_pull_request_reviews": { + "required_approving_review_count": 0, + "dismiss_stale_reviews": false, + "require_code_owner_reviews": false + }, + "restrictions": null, + "allow_force_pushes": false, + "allow_deletions": false +} +EOF +echo " OK" + +# 4. Verifizierung +echo "[4/4] Verifiziere Konfiguration..." +echo "" +echo "--- Auto-Merge ---" +gh api "repos/$REPO" --jq '" allow_auto_merge: \(.allow_auto_merge)"' + +echo "" +echo "--- Branch Protection ($BRANCH) ---" +gh api "repos/$REPO/branches/$BRANCH/protection/required_status_checks" \ + --jq '" strict: \(.strict)\n checks: \(.contexts | join(", "))"' + +echo "" +echo "=== Setup abgeschlossen ===" +echo "" +echo "Nächste Schritte:" +echo " - Dependabot erstellt ab morgen 04:00 automatisch PRs" +echo " - Patch-Updates werden nach CI-Success auto-gemergt" +echo " - Major/Minor-Updates erfordern manuelles Review"