10 Commits

Author SHA1 Message Date
metatroncubeswdev
c102594ca5 feat(security): log staff access to customers' personal data
DataAccessLog records bookings list/view/export and run-sheet views (actor, action,
target, time); pruned after 12 months by the worker; migration 0003.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 13:18:44 -04:00
metatroncubeswdev
ee8056efc2 fix: install race, silent Admin API errors, widget width; pickup setup hint
- ensureShop: concurrent installs reuse the row created by the other request (P2002)
- order tagging and booking metafield log Shopify userErrors instead of failing silently
- widget keeps a readable 760px width in full-width theme sections
- setup guide links to Shopify's pickup settings so checkout offers pickup

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 13:15:36 -04:00
metatroncubeswdev
aacd9a8e06 fix: plan location limit counts switched-on locations; widget empty state
- storefront applied maxLocations to the first locations by priority, even switched-off
  ones, so a Starter shop whose enabled location wasn't first got no methods
- switching on a location beyond the plan limit now explains why instead of being ignored
- widget shows a message (en/fr) when no method is available and clears aria-busy

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 05:26:03 -04:00
metatroncubeswdev
23f259fcc8 fix(admin): create or revive the shop record on first admin load instead of 404
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 05:01:59 -04:00
metatroncubeswdev
1d2d943d54 feat(security): encrypt customer personal data at rest
- Prisma extension seals booking name/email/phone/address and waitlist contacts with
  AES-256-GCM on write and opens them on read (incl. nested reads)
- keyed-hash columns for exact email/phone lookups (privacy webhooks, booking search,
  waitlist de-duplication); migration 0002
- tests prove only ciphertext is stored; privacy/terms/SECURITY.md updated to match

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:56:05 -04:00
metatroncubeswdev
f96ab10634 feat(brand): brand assets at Shopify sizes; public landing, privacy and terms
- brand/: 1200x1200 full-bleed app icon, 1600x900 feature image, transparent logos,
  favicons, guidelines (palette, type, usage) and the build script
- / is now a branded landing page with no shop-domain form (App Store 2.3.1)
- /privacy and /terms describe Datewise's actual data handling and sub-processors

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:26:12 -04:00
metatroncubeswdev
893b0f6ada fix(admin): theme editor deep links use block file handles
activateAppId pointed at a non-existent 'datewise-embed' handle; the embed is 'embed'.
Adds an addAppBlockId link that places the scheduler block on the cart template.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:23:21 -04:00
metatroncubeswdev
85ed1a8f0e feat: delivery-label and payment-rules checkout functions with Settings toggles
- delivery-label renames only options matching the chosen method (en/fr dates)
- payment-rules hides COD / pay-in-store for shipped orders
- functions matched by handle (fixes guard lookup matching any 'datewise' title)
- scopes: write_delivery_customizations, write_payment_customizations

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:21:55 -04:00
metatroncubeswdev
67b86cf411 feat(admin): setup guide on Today page with live step status
Shared checkout-guard lookup moved to app/lib/guard.server.ts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:18:42 -04:00
metatroncubeswdev
e56182e0e3 chore: initial Datewise app (rebranded from SlotSure prototype)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:06:49 -04:00