# Funktionsübersicht (Stand v1.16.1)
Ein selbst gehostetes WordPress-Plugin für die Online-Terminbuchung von Arzt- und Therapiepraxen. Wird per Shortcode `
` auf einer beliebigen Seite eingebunden.## Für Patientinnen und Patienten (Buchungsformular)
Der Buchungsablauf läuft als schrittweiser Wizard: Behandlung wählen (nur sichtbar, wenn mehrere Terminarten existieren) → Datum wählen → Zeit wählen → persönliche Angaben → verbindlich buchen. Kein Login nötig.
– **Terminarten:** beliebig viele Behandlungen (bis 5), je mit eigenem Namen, eigener Dauer und optionalem Anzeigepreis. Bei nur einer Terminart wird der Auswahlschritt automatisch übersprungen.
– **Kalender:** zeigt pro Monat an, an welchen Tagen überhaupt noch etwas frei ist – individuell je nach gewählter Terminart berechnet, nicht pauschal für die ganze Praxis.
– **Zeitfenster:** werden dynamisch anhand der Arbeitszeiten, bestehenden Buchungen, Pausen und Abwesenheiten berechnet und im konfigurierten Takt angeboten (z.B. alle 15 Minuten).
– **Kollabierender Wizard:** jeder erledigte Schritt klappt zu einer kurzen Zusammenfassungszeile mit „Ändern“-Button zusammen – hält die Seite auch auf dem Handy kurz.
– **Barrierefreiheit:** Kalendertage haben aussagekräftige aria-Labels (Wochentag, Datum, „Termine verfügbar“ / „keine Termine“), nicht verfügbare Tage sind als `disabled` markiert.
– **Theme-adaptives Design:** keine festen Farben – Schrift-, Rahmen- und Hintergrundfarben leiten sich vom jeweiligen WordPress-Theme ab, damit das Formular optisch nicht fremd wirkt. Alle Widget-Regeln sind zusätzlich über die ID `#ptb-widget` verankert, damit generische Button-Resets mancher Themes (z.B. GeneratePress‘ `.entry-content button:hover`) das Erscheinungsbild nicht überschreiben können.
– **Formularfelder:** Vorname, Nachname, Strasse/Nr., PLZ, Ort, Geburtsdatum, E-Mail, Telefon (optional, aber formal validiert), Bemerkungen (optional).
– **Praxis-Kontaktzeile:** zeigt oberhalb des Formulars Praxisname, Adresse, Telefonnummer (klickbar) sowie Links zu Datenschutzerklärung und Impressum an.
– **Pflicht-Einwilligung:** Checkbox zur Bestätigung der Datenschutzbestimmungen, ohne die keine Buchung möglich ist.
– **Bestätigung:** nach erfolgreicher Buchung erscheint eine Erfolgsmeldung mit den Termindetails.
## Verfügbarkeitslogik (das Herzstück)
– **Arbeitszeiten pro Wochentag**, einzeln aktivierbar, mit Start-/Endzeit und optionaler Mittagspause.
– **Startzeiten-Takt (Raster):** konfigurierbar auf 10/15/20/30/60 Minuten – bestimmt, in welchem Abstand mögliche Startzeiten angeboten werden.
– **Puffer** zwischen zwei Terminen (z.B. 15 Min. Vor-/Nachbereitung).
– **Mindestvorlauf:** wie viele Stunden im Voraus ein Termin mindestens gebucht werden muss. Global einstellbar, mit optionaler Übersteuerung pro Terminart (z.B. längerer Vorlauf für ein Erstgespräch).
– **Buchungshorizont:** wie viele Tage im Voraus überhaupt gebucht werden kann.
– **Mindestlücken-Regel:** verhindert, dass durch ungünstige Terminwahl unbuchbare Restlücken entstehen (kleiner als die kürzeste aktive Behandlungsdauer). Ist ein Verlust in einem freien Zeitfenster ohnehin unvermeidbar, schaltet sich die Regel automatisch ab und lässt die volle Auswahl zu, statt unnötig einzuschränken.
– **Abwesenheiten:** einzelne Tage, mehrtägige Zeiträume (Ferien) oder reine Zeitblöcke (z.B. „erst ab 09:00 verfügbar“) sperrbar, jeweils mit interner Notiz.
– **Zeitzonenkorrekte Berechnung** über `wp_timezone()`, unabhängig von der Server-Grundeinstellung.
## Admin-Bereich
– **Buchungsübersicht:** alle Termine mit sämtlichen Patientendaten (Name, Adresse, Geburtsdatum, Kontakt, Bemerkungen), Filter für kommende/alle Termine, Lösch-Funktion.
– **Abwesenheiten-Verwaltung:** eigene Seite zum Anlegen und Löschen von Sperrzeiten.
– **Einstellungen:** Raster, Puffer, globaler Mindestvorlauf, Buchungshorizont, Praxis-E-Mail, Antwort-Adresse (Reply-To), Praxisname/-adresse/-telefon (Anzeige), Link zur Datenschutzerklärung (Pflichtfeld), Link zum Impressum (Pflichtfeld), frei anpassbarer Bestätigungsmailtext mit Platzhaltern, Terminarten-Tabelle (Name, Dauer, Preis, optionaler eigener Vorlauf), Arbeitszeiten-Tabelle pro Wochentag.
– **Speicher-Absicherung:** Datenschutz- und Impressum-Link müssen ausgefüllt sein, sonst wird nicht gespeichert – die restlichen Eingaben gehen dabei nicht verloren, sondern bleiben im Formular stehen.
## E-Mail-Benachrichtigungen
– Automatische Bestätigungsmail an die Patientin/den Patienten mit frei editierbarem Text und Platzhaltern (`{vorname}`, `{nachname}`, `{terminart}`, `{dauer}`, `{datum}`, `{zeit}`, `{preis}`, `{praxis}`); Preiszeile entfällt automatisch, wenn kein Preis hinterlegt ist.
– Benachrichtigungsmail an die Praxis mit allen erfassten Patientendaten.
– Frei konfigurierbare Reply-To-Adresse.
## Datenschutz & Rechtliches
– Pflicht-Einwilligung vor jeder Buchung, inkl. Speicherung des Einwilligungs-Flags in der Datenbank.
– Datenschutzerklärung und Impressum sind Pflichtangaben in den Einstellungen – lassen sich nicht vergessen, weil ohne sie nicht gespeichert werden kann.
– Vollständig selbst gehostet: keine Patientendaten fliessen an US-amerikanische SaaS-Anbieter, dadurch keine Schrems-II-/Cloud-Act-Problematik wie bei vielen fremden Buchungstools.
## Technisches (unter der Haube)
– Eigene Datenbanktabelle für Buchungen mit automatischer Schema-Migration bei Updates (auch wenn nur Dateien ausgetauscht werden, ohne Deaktivieren/Reaktivieren).
– Telefonnummer-Validierung (client- und serverseitig): erlaubt nur Ziffern und übliche Trennzeichen, verlangt 7–15 Ziffern.
– Alle AJAX-Aufrufe nonce-abgesichert.
– Bei Datenbankfehlern sehen eingeloggte Admins die echte Fehlermeldung, Patientinnen und Patienten nur eine generische Meldung.
– CSS mit ID-Spezifität (`#ptb-widget …`) statt reiner Klassen-Selektoren, damit das Erscheinungsbild robust gegenüber generischen Theme-Stilen bleibt (behoben in v1.16.1, ausgelöst durch einen echten Praxistest mit GeneratePress).