mirror of
https://github.com/Dvorinka/Bookra.git
synced 2026-06-03 20:13:00 +00:00
374 lines
13 KiB
Go
374 lines
13 KiB
Go
package domain
|
|
|
|
import "time"
|
|
|
|
type Principal struct {
|
|
Subject string `json:"subject"`
|
|
Email string `json:"email,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
Role string `json:"role"`
|
|
}
|
|
|
|
type DashboardKPI struct {
|
|
Code string `json:"code"`
|
|
Label string `json:"label"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
type UpcomingBooking struct {
|
|
Reference string `json:"reference"`
|
|
CustomerName string `json:"customerName"`
|
|
CustomerEmail string `json:"customerEmail"`
|
|
StartsAt time.Time `json:"startsAt"`
|
|
EndsAt time.Time `json:"endsAt"`
|
|
Status string `json:"status"`
|
|
Label string `json:"label,omitempty"`
|
|
}
|
|
|
|
type WidgetSnippet struct {
|
|
Kind string `json:"kind"`
|
|
Code string `json:"code"`
|
|
}
|
|
|
|
type TrackingStatus struct {
|
|
Provider string `json:"provider"`
|
|
Connected bool `json:"connected"`
|
|
SiteID string `json:"siteId,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
type DashboardSummary struct {
|
|
TenantName string `json:"tenantName"`
|
|
TenantSlug string `json:"tenantSlug"`
|
|
Locale string `json:"locale"`
|
|
Timezone string `json:"timezone"`
|
|
PlanCode string `json:"planCode"`
|
|
PublicBookingURL string `json:"publicBookingUrl"`
|
|
SetupCompletion int `json:"setupCompletion"`
|
|
KPIs []DashboardKPI `json:"kpis"`
|
|
UpcomingBookings []UpcomingBooking `json:"upcomingBookings"`
|
|
WidgetSnippets []WidgetSnippet `json:"widgetSnippets"`
|
|
Tracking TrackingStatus `json:"tracking"`
|
|
}
|
|
|
|
type BrandProfile struct {
|
|
Name string `json:"name"`
|
|
SiteURL string `json:"siteUrl,omitempty"`
|
|
LogoURL string `json:"logoUrl,omitempty"`
|
|
PrimaryColor string `json:"primaryColor,omitempty"`
|
|
}
|
|
|
|
type TenantBootstrap struct {
|
|
TenantID string `json:"tenantId"`
|
|
TenantName string `json:"tenantName"`
|
|
TenantSlug string `json:"tenantSlug,omitempty"`
|
|
Preset string `json:"preset"`
|
|
Locale string `json:"locale"`
|
|
Timezone string `json:"timezone"`
|
|
PlanCode string `json:"planCode,omitempty"`
|
|
OnboardingCompleted bool `json:"onboardingCompleted"`
|
|
Brand BrandProfile `json:"brand"`
|
|
CurrentUser Principal `json:"currentUser"`
|
|
}
|
|
|
|
type TeamInviteRequest struct {
|
|
Email string `json:"email"`
|
|
Role string `json:"role,omitempty"`
|
|
}
|
|
|
|
type AvailabilityBlockRequest struct {
|
|
DayOfWeek int `json:"dayOfWeek"`
|
|
StartsLocal string `json:"startsLocal"`
|
|
EndsLocal string `json:"endsLocal"`
|
|
Busy bool `json:"busy,omitempty"`
|
|
}
|
|
|
|
type BookingDefaultsRequest struct {
|
|
ServiceName string `json:"serviceName"`
|
|
DurationMinutes int `json:"durationMinutes"`
|
|
BufferBeforeMinutes int `json:"bufferBeforeMinutes"`
|
|
BufferAfterMinutes int `json:"bufferAfterMinutes"`
|
|
CancelWindowHours int `json:"cancelWindowHours"`
|
|
}
|
|
|
|
type OnboardTenantRequest struct {
|
|
Name string `json:"name"`
|
|
Slug string `json:"slug"`
|
|
Preset string `json:"preset"`
|
|
Locale string `json:"locale"`
|
|
Timezone string `json:"timezone"`
|
|
Brand BrandProfile `json:"brand"`
|
|
LocationName string `json:"locationName"`
|
|
BookingDefaults BookingDefaultsRequest `json:"bookingDefaults"`
|
|
AvailabilityBlocks []AvailabilityBlockRequest `json:"availabilityBlocks"`
|
|
TeamInvites []TeamInviteRequest `json:"teamInvites"`
|
|
}
|
|
|
|
type TimeSlot struct {
|
|
ServiceID *string `json:"serviceId,omitempty"`
|
|
ClassSessionID *string `json:"classSessionId,omitempty"`
|
|
StaffID *string `json:"staffId,omitempty"`
|
|
LocationID *string `json:"locationId,omitempty"`
|
|
StartsAt string `json:"startsAt"`
|
|
EndsAt string `json:"endsAt"`
|
|
Mode string `json:"mode"`
|
|
Label string `json:"label"`
|
|
RemainingCapacity *int32 `json:"remainingCapacity,omitempty"`
|
|
}
|
|
|
|
type PublicAvailability struct {
|
|
TenantSlug string `json:"tenantSlug"`
|
|
Timezone string `json:"timezone"`
|
|
Locale string `json:"locale"`
|
|
Slots []TimeSlot `json:"slots"`
|
|
}
|
|
|
|
type CreateBookingRequest struct {
|
|
TenantSlug string `json:"tenantSlug"`
|
|
BookingMode string `json:"bookingMode"`
|
|
ServiceID *string `json:"serviceId,omitempty"`
|
|
ClassSessionID *string `json:"classSessionId,omitempty"`
|
|
StaffID *string `json:"staffId,omitempty"`
|
|
LocationID *string `json:"locationId,omitempty"`
|
|
CustomerName string `json:"customerName"`
|
|
CustomerEmail string `json:"customerEmail"`
|
|
Notes string `json:"notes"`
|
|
StartsAt string `json:"startsAt"`
|
|
EndsAt string `json:"endsAt"`
|
|
}
|
|
|
|
type CreateBookingResponse struct {
|
|
BookingID string `json:"bookingId"`
|
|
Reference string `json:"reference"`
|
|
Status string `json:"status"`
|
|
}
|
|
|
|
type PlanEntitlements struct {
|
|
MaxLocations int `json:"maxLocations"`
|
|
MaxStaff int `json:"maxStaff"`
|
|
EmailReminders bool `json:"emailReminders"`
|
|
AdvancedReporting bool `json:"advancedReporting"`
|
|
WidgetEmbedding bool `json:"widgetEmbedding"`
|
|
UmamiTracking bool `json:"umamiTracking"`
|
|
}
|
|
|
|
type PlanDisplayPrice struct {
|
|
Currency string `json:"currency"`
|
|
AmountCents int `json:"amountCents"`
|
|
Formatted string `json:"formatted"`
|
|
}
|
|
|
|
type SubscriptionSnapshot struct {
|
|
TenantID string `json:"tenantId"`
|
|
Provider string `json:"provider"`
|
|
CustomerID string `json:"customerId"`
|
|
SubscriptionID string `json:"subscriptionId"`
|
|
Status string `json:"status"`
|
|
PlanCode string `json:"planCode"`
|
|
Currency string `json:"currency"`
|
|
PriceID string `json:"priceId"`
|
|
CancelAtPeriodEnd bool `json:"cancelAtPeriodEnd"`
|
|
CurrentPeriodStart *time.Time `json:"currentPeriodStart,omitempty"`
|
|
CurrentPeriodEnd *time.Time `json:"currentPeriodEnd,omitempty"`
|
|
PaymentMethodBrand string `json:"paymentMethodBrand,omitempty"`
|
|
PaymentMethodLast4 string `json:"paymentMethodLast4,omitempty"`
|
|
Entitlements PlanEntitlements `json:"entitlements"`
|
|
DisplayPrices []PlanDisplayPrice `json:"displayPrices"`
|
|
TrialDays int `json:"trialDays"`
|
|
LastSyncedAt *time.Time `json:"lastSyncedAt,omitempty"`
|
|
CheckoutURLAvailable bool `json:"checkoutUrlAvailable"`
|
|
SyncAvailable bool `json:"syncAvailable"`
|
|
PortalAvailable bool `json:"portalAvailable"`
|
|
}
|
|
|
|
type CheckoutSessionRequest struct {
|
|
PlanCode string `json:"planCode"`
|
|
Currency string `json:"currency,omitempty"`
|
|
}
|
|
|
|
type CheckoutLaunchResponse struct {
|
|
PriceID string `json:"priceId"`
|
|
CustomerID string `json:"customerId,omitempty"`
|
|
CustomerEmail string `json:"customerEmail,omitempty"`
|
|
SuccessRedirectURL string `json:"successRedirectUrl"`
|
|
CancelRedirectURL string `json:"cancelRedirectUrl"`
|
|
CustomData map[string]string `json:"customData"`
|
|
}
|
|
|
|
type PortalSessionResponse struct {
|
|
URL string `json:"url"`
|
|
}
|
|
|
|
type DispatchReminderJobsRequest struct {
|
|
Limit int `json:"limit,omitempty"`
|
|
}
|
|
|
|
type DispatchReminderJobsResponse struct {
|
|
ProcessedCount int `json:"processedCount"`
|
|
SentCount int `json:"sentCount"`
|
|
FailedCount int `json:"failedCount"`
|
|
}
|
|
|
|
// ============================================
|
|
// LOCATION / ZONE MODELS
|
|
// ============================================
|
|
|
|
type Location struct {
|
|
ID string `json:"id"`
|
|
TenantID string `json:"tenantId"`
|
|
Name string `json:"name"`
|
|
Type string `json:"type"` // room, private, hall, etc.
|
|
Capacity int `json:"capacity"`
|
|
Timezone string `json:"timezone"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|
|
|
|
type CreateLocationRequest struct {
|
|
Name string `json:"name" binding:"required"`
|
|
Type string `json:"type" binding:"required"`
|
|
Capacity int `json:"capacity"`
|
|
}
|
|
|
|
type UpdateLocationRequest struct {
|
|
Name string `json:"name,omitempty"`
|
|
Type string `json:"type,omitempty"`
|
|
Capacity int `json:"capacity,omitempty"`
|
|
}
|
|
|
|
// ============================================
|
|
// BLOCKED DAYS / AVAILABILITY EXCEPTION MODELS
|
|
// ============================================
|
|
|
|
type BlockedDay struct {
|
|
ID string `json:"id"`
|
|
TenantID string `json:"tenantId"`
|
|
Date time.Time `json:"date"`
|
|
Reason string `json:"reason"`
|
|
Type string `json:"type"` // full, partial
|
|
StaffID *string `json:"staffId,omitempty"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|
|
|
|
type CreateBlockedDayRequest struct {
|
|
Date string `json:"date" binding:"required"` // RFC3339
|
|
Reason string `json:"reason" binding:"required"`
|
|
Type string `json:"type" binding:"required"` // full, partial
|
|
StaffID *string `json:"staffId,omitempty"`
|
|
}
|
|
|
|
type UpdateBlockedDayRequest struct {
|
|
Reason string `json:"reason,omitempty"`
|
|
Type string `json:"type,omitempty"`
|
|
}
|
|
|
|
// ============================================
|
|
// CUSTOMER MODELS
|
|
// ============================================
|
|
|
|
type Customer struct {
|
|
ID string `json:"id"`
|
|
TenantID string `json:"tenantId"`
|
|
Name string `json:"name"`
|
|
Email string `json:"email"`
|
|
Phone *string `json:"phone,omitempty"`
|
|
Status string `json:"status"` // active, inactive, vip
|
|
BookingsCount int `json:"bookingsCount"`
|
|
LastBookingAt *time.Time `json:"lastBookingAt,omitempty"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
Notes string `json:"notes,omitempty"`
|
|
}
|
|
|
|
type CreateCustomerRequest struct {
|
|
Name string `json:"name" binding:"required"`
|
|
Email string `json:"email" binding:"required,email"`
|
|
Phone *string `json:"phone,omitempty"`
|
|
Status string `json:"status,omitempty"` // defaults to active
|
|
Notes string `json:"notes,omitempty"`
|
|
}
|
|
|
|
type UpdateCustomerRequest struct {
|
|
Name string `json:"name,omitempty"`
|
|
Email string `json:"email,omitempty"`
|
|
Phone *string `json:"phone,omitempty"`
|
|
Status string `json:"status,omitempty"`
|
|
Notes string `json:"notes,omitempty"`
|
|
}
|
|
|
|
// ============================================
|
|
// CUSTOMER BOOKING MANAGEMENT MODELS
|
|
// ============================================
|
|
|
|
type CustomerBookingView struct {
|
|
Reference string `json:"reference"`
|
|
CustomerName string `json:"customerName"`
|
|
CustomerEmail string `json:"customerEmail"`
|
|
Service string `json:"service"`
|
|
BusinessName string `json:"businessName"`
|
|
StartsAt time.Time `json:"startsAt"`
|
|
EndsAt time.Time `json:"endsAt"`
|
|
Location string `json:"location"`
|
|
Status string `json:"status"`
|
|
Notes string `json:"notes,omitempty"`
|
|
}
|
|
|
|
type RescheduleBookingRequest struct {
|
|
NewStartsAt string `json:"newStartsAt" binding:"required"` // RFC3339
|
|
NewEndsAt string `json:"newEndsAt" binding:"required"` // RFC3339
|
|
Reason string `json:"reason,omitempty"`
|
|
}
|
|
|
|
type CancelBookingRequest struct {
|
|
Reason string `json:"reason,omitempty"`
|
|
}
|
|
|
|
// ============================================
|
|
// WORKING HOURS MODELS
|
|
// ============================================
|
|
|
|
type WorkingHours struct {
|
|
DayOfWeek int `json:"dayOfWeek"` // 0=Sunday, 1=Monday, etc.
|
|
Open string `json:"open"` // HH:MM format
|
|
Close string `json:"close"` // HH:MM format
|
|
IsOpen bool `json:"isOpen"`
|
|
}
|
|
|
|
type UpdateWorkingHoursRequest struct {
|
|
Open string `json:"open,omitempty"`
|
|
Close string `json:"close,omitempty"`
|
|
IsOpen *bool `json:"isOpen,omitempty"`
|
|
}
|
|
|
|
// ============================================
|
|
// EMAIL TEMPLATE MODELS
|
|
// ============================================
|
|
|
|
type EmailTemplate struct {
|
|
ID string `json:"id"`
|
|
TenantID string `json:"tenantId"`
|
|
Type string `json:"type"` // booking_confirmation, reminder, cancellation, etc.
|
|
Subject string `json:"subject"`
|
|
BodyHTML string `json:"bodyHtml"`
|
|
BodyText string `json:"bodyText"`
|
|
IsEnabled bool `json:"isEnabled"`
|
|
}
|
|
|
|
type SendEmailRequest struct {
|
|
To string `json:"to" binding:"required,email"`
|
|
Subject string `json:"subject" binding:"required"`
|
|
Body string `json:"body" binding:"required"`
|
|
Data map[string]string `json:"data,omitempty"` // Template variables
|
|
}
|
|
|
|
type EmailNotification struct {
|
|
ID string `json:"id"`
|
|
TenantID string `json:"tenantId"`
|
|
BookingID string `json:"bookingId,omitempty"`
|
|
Channel string `json:"channel"` // email, sms
|
|
Type string `json:"type"` // confirmation, reminder, cancellation
|
|
Recipient string `json:"recipient"`
|
|
Status string `json:"status"` // pending, sent, failed
|
|
SentAt *time.Time `json:"sentAt,omitempty"`
|
|
Error string `json:"error,omitempty"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|