v4.0.6 0 Simplicity focus

This commit is contained in:
2026-07-04 10:00:16 +12:00
parent 8eb20813c8
commit 018024510b
31 changed files with 11902 additions and 744 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
+41 -3
View File
@@ -61,11 +61,37 @@ class WelcomePackEmailRequest(BaseModel):
# Owner-set subject line. Defaults to "Goodwalk Onboarding - <Dog Name>" when
# blank (resolved server-side so scheduled sends keep a sensible subject too).
subject: str = ""
serviceType: str
priceDetails: str
startDate: str
# Structured offer details rendered in the details table. Now fully optional —
# the owner can hide the table entirely (showDetails=False) and write a free
# email instead. Left blank, a row is simply omitted from the table.
serviceType: str = ""
priceDetails: str = ""
startDate: str = ""
# Free-text customisation. All blank => the email falls back to the original
# default copy, so existing callers keep working unchanged. `{first_name}`
# and `{dog_name}` tokens are substituted server-side.
heading: str = ""
intro: str = ""
outro: str = ""
tagLabel: str = ""
# Customisable button block. Defaults to "Complete onboarding" pointing at the
# client onboarding portal. Clearing either field hides the button.
ctaLabel: str = ""
ctaUrl: str = ""
# Whether to render the Service / Price / Start date table at all.
showDetails: bool = True
# Rich-text (WYSIWYG) message body. When present it replaces the
# heading/intro/outro copy above and is sanitised to an email-safe subset of
# HTML server-side. `includeButton` toggles the onboarding button beneath it.
bodyHtml: str = ""
includeButton: bool = True
preview: bool = False
previewRecipients: list[EmailStr] = []
# When sending for real (not a preview), also copy the owner so they keep a
# record of exactly what the client received. CC is visible to the client;
# BCC is hidden. Independent. Ignored on previews and scheduled sends.
ccOwner: bool = False
bccOwner: bool = False
# ISO 8601 local datetime (e.g. "2026-06-20T14:30"). When set on a non-preview
# request, the welcome email is queued for reliable delivery at that time
# instead of being sent immediately.
@@ -84,6 +110,9 @@ class ScheduledEmailRescheduleRequest(BaseModel):
class BirthdayEmailRequest(BaseModel):
email: EmailStr
dogId: str | None = None
# Owner-editable subject line. Blank falls back to the default
# "Happy birthday <dog>" subject.
subject: str = ""
preview: bool = False
previewRecipients: list[EmailStr] = []
@@ -124,6 +153,12 @@ class ResetOnboardingRequest(BaseModel):
email: EmailStr
class DeleteClientRequest(BaseModel):
"""Owner-initiated permanent deletion of a client and their access."""
email: EmailStr
class NewClientRequest(BaseModel):
"""Owner-initiated client creation (e.g. leads from Instagram / Facebook
that never came through the public enquiry form). Registers the email so
@@ -138,6 +173,9 @@ class NewClientRequest(BaseModel):
dogAge: str = ""
# Where the client came from, e.g. "Instagram", "Facebook", "Referral".
source: str = ""
# The date the client joined Goodwalk (ISO yyyy-mm-dd). Owner-supplied, since
# only the owner knows it. Used to surface joining anniversaries.
joiningDate: str = ""
# When true (and the MYOB integration is configured), also create the client
# as a customer contact in MYOB. Non-fatal: a MYOB failure never blocks the
# local client from being created.