feat: add CMS inquiries and group bookings

This commit is contained in:
2026-09-17 15:48:40 +02:00
parent 97dd32a2b4
commit a2b3e99174
28 changed files with 1200 additions and 45 deletions
+158
View File
@@ -78,6 +78,9 @@ export interface Config {
availability: Availability;
'availability-overrides': AvailabilityOverride;
'booking-requests': BookingRequest;
conversations: Conversation;
'conversation-messages': ConversationMessage;
'group-registrations': GroupRegistration;
redirects: Redirect;
'analytics-events': AnalyticsEvent;
'analytics-daily-stats': AnalyticsDailyStat;
@@ -98,6 +101,9 @@ export interface Config {
availability: AvailabilitySelect<false> | AvailabilitySelect<true>;
'availability-overrides': AvailabilityOverridesSelect<false> | AvailabilityOverridesSelect<true>;
'booking-requests': BookingRequestsSelect<false> | BookingRequestsSelect<true>;
conversations: ConversationsSelect<false> | ConversationsSelect<true>;
'conversation-messages': ConversationMessagesSelect<false> | ConversationMessagesSelect<true>;
'group-registrations': GroupRegistrationsSelect<false> | GroupRegistrationsSelect<true>;
redirects: RedirectsSelect<false> | RedirectsSelect<true>;
'analytics-events': AnalyticsEventsSelect<false> | AnalyticsEventsSelect<true>;
'analytics-daily-stats': AnalyticsDailyStatsSelect<false> | AnalyticsDailyStatsSelect<true>;
@@ -472,6 +478,30 @@ export interface Offer {
* Aktiviert die Terminbuchung mit Kalenderauswahl auf der Angebotsseite.
*/
bookable?: boolean | null;
/**
* Gruppenangebote werden über Anmeldung, feste Wiederholung oder Bewerbungsfrist organisiert.
*/
bookingMode: 'individual' | 'group';
groupRegistrationMode?: ('fixed' | 'capacity' | 'request') | null;
groupSchedule?: {
recurrence?: ('weekly' | 'monthly') | null;
weekday?: ('monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday') | null;
monthDay?: number | null;
/**
* z. B. 18:00 Uhr
*/
startTime?: string | null;
/**
* z. B. 20:00 Uhr
*/
endTime?: string | null;
};
groupCapacity?: number | null;
registrationDeadline?: string | null;
/**
* Wird auf der Angebotsseite oberhalb des Anmeldeformulars angezeigt.
*/
groupInfo?: string | null;
/**
* z. B. „80 €“ oder „auf Anfrage“.
*/
@@ -602,6 +632,63 @@ export interface AvailabilityOverride {
updatedAt: string;
createdAt: string;
}
/**
* Kontakt- und Terminanfragen als durchsuchbare Konversationen.
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "conversations".
*/
export interface Conversation {
id: number;
subject: string;
name: string;
email: string;
type: 'contact' | 'appointment' | 'group';
status: 'open' | 'waiting' | 'closed';
customer?: (number | null) | Customer;
threadKey: string;
lastMessageAt?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Einzelne Nachrichten innerhalb einer Anfrage. Antworten aus dem CMS werden automatisch per E-Mail verschickt.
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "conversation-messages".
*/
export interface ConversationMessage {
id: number;
conversation: number | Conversation;
/**
* Für Antworten im CMS „Anouma“ auswählen. Eingehende E-Mails werden automatisch als Anfragende Person gespeichert.
*/
senderType: 'visitor' | 'admin';
senderName?: string | null;
senderEmail?: string | null;
body: string;
externalMessageId?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Anmeldungen und Bewerbungen für Gruppenangebote.
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "group-registrations".
*/
export interface GroupRegistration {
id: number;
offer: number | Offer;
name: string;
email: string;
phone?: string | null;
message?: string | null;
status: 'pending' | 'accepted' | 'waitlist' | 'rejected' | 'cancelled';
registeredAt?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Leitet eine alte URL (z. B. nach einer Slug-Änderung bei Angeboten, Terminen oder Aktuelles) dauerhaft auf eine neue weiter.
*
@@ -770,6 +857,18 @@ export interface PayloadLockedDocument {
relationTo: 'booking-requests';
value: number | BookingRequest;
} | null)
| ({
relationTo: 'conversations';
value: number | Conversation;
} | null)
| ({
relationTo: 'conversation-messages';
value: number | ConversationMessage;
} | null)
| ({
relationTo: 'group-registrations';
value: number | GroupRegistration;
} | null)
| ({
relationTo: 'redirects';
value: number | Redirect;
@@ -1017,6 +1116,20 @@ export interface OffersSelect<T extends boolean = true> {
order?: T;
visibility?: T;
bookable?: T;
bookingMode?: T;
groupRegistrationMode?: T;
groupSchedule?:
| T
| {
recurrence?: T;
weekday?: T;
monthDay?: T;
startTime?: T;
endTime?: T;
};
groupCapacity?: T;
registrationDeadline?: T;
groupInfo?: T;
price?: T;
durationMinutes?: T;
seo?:
@@ -1096,6 +1209,51 @@ export interface BookingRequestsSelect<T extends boolean = true> {
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "conversations_select".
*/
export interface ConversationsSelect<T extends boolean = true> {
subject?: T;
name?: T;
email?: T;
type?: T;
status?: T;
customer?: T;
threadKey?: T;
lastMessageAt?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "conversation-messages_select".
*/
export interface ConversationMessagesSelect<T extends boolean = true> {
conversation?: T;
senderType?: T;
senderName?: T;
senderEmail?: T;
body?: T;
externalMessageId?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "group-registrations_select".
*/
export interface GroupRegistrationsSelect<T extends boolean = true> {
offer?: T;
name?: T;
email?: T;
phone?: T;
message?: T;
status?: T;
registeredAt?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "redirects_select".