Component architecture
- Reorganise src/lib/components into pages/, sections/, ui/ subdirectories and
  update all imports across routes and tests.

Owner admin dashboard (+2k lines)
- Scheduled welcome-pack emails: durable queue with cancel/reschedule and a
  background sender loop (SCHEDULED_CHECK_INTERVAL_SECONDS, default 60s).
- Custom welcome-pack subject line, preview recipients, and client BCC.
- Add-client, edit client profile, and reset-onboarding flows.
- "View as client" onboarding preview (owner impersonation, dry-run submit).
- Tabbed owner welcome route (/owner/welcome/[[tab]]).

MYOB integration
- New mail_api/myob.py: create new clients as MYOB AccountRight customer
  contacts. Disabled until all MYOB_* env vars are set (no-op otherwise).

Onboarding
- New "Does your dog resource guard?" Yes/No question in the Behaviour step.
- Persist vetAddress, flea/tick, and pet-insurance fields server-side.

Misc
- vite config, new hooks.ts, responsive CSS tweaks, deploy/docker config,
  mail-api README and start-dev.ps1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 21:51:29 +12:00
co-authored by Claude Opus 4.8
parent 7d5b72e1d3
commit 0e88e7bdac
82 changed files with 4543 additions and 914 deletions
+72 -72
View File
@@ -207,12 +207,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"27"
],
@@ -432,12 +432,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"45"
],
@@ -657,12 +657,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"95"
],
@@ -882,12 +882,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"103"
],
@@ -1107,12 +1107,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"39"
],
@@ -1332,12 +1332,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"41"
],
@@ -1557,12 +1557,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"36"
],
@@ -1782,12 +1782,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"83"
],
@@ -2007,12 +2007,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"76",
"49"
@@ -2233,12 +2233,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"99"
],
@@ -2458,12 +2458,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"84"
],
@@ -2683,12 +2683,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"51"
],
@@ -2908,12 +2908,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"87"
],
@@ -3134,12 +3134,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"88"
],
@@ -3359,12 +3359,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"34"
],
@@ -3584,12 +3584,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"61",
"47"
@@ -3811,12 +3811,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"57"
],
@@ -4036,12 +4036,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"32"
],
@@ -4261,12 +4261,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"22"
],
@@ -4486,12 +4486,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"64"
],
@@ -4711,12 +4711,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"74"
],
@@ -4936,12 +4936,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"56"
],
@@ -5161,12 +5161,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"116",
"93"
@@ -5387,12 +5387,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"59"
],
@@ -5612,12 +5612,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"30"
],
@@ -5837,12 +5837,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"53"
],
@@ -6062,12 +6062,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"107"
],
@@ -6287,12 +6287,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"24"
],
@@ -6512,12 +6512,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"43"
],
@@ -6737,12 +6737,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"97"
],
@@ -6962,12 +6962,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"90"
],
@@ -7188,12 +7188,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"105"
],
@@ -7413,12 +7413,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"101"
],
@@ -7638,12 +7638,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"78"
],
@@ -7664,12 +7664,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [],
"contractEntryIds": [
"29"
@@ -7887,12 +7887,12 @@
"lifecycle": {
"status": "archived",
"reason": "Imported from legacy Gravity Forms data",
"changedAt": "2026-05-24T05:45:33.160Z",
"changedAt": "2026-06-15T21:24:42.302Z",
"changedBy": "legacy-import"
},
"legacy": {
"source": "gravity-forms-csv",
"importedAt": "2026-05-24T05:45:33.160Z",
"importedAt": "2026-06-15T21:24:42.302Z",
"onboardingEntryIds": [
"80"
],