How this MVP is wired.
The phone preview on the left is the staff app. The PDF preview on the right is what the guest receives. This panel is a short engineering note about where each integration plugs in.
Use the staff email and password for your active Villa Savina profile.
Tip: let your device save this login. Your browser can offer Face ID, Touch ID, or autofill so you only type it once.
Select a guest booking
The phone preview on the left is the staff app. The PDF preview on the right is what the guest receives. This panel is a short engineering note about where each integration plugs in.
villa-savina-reimbursements-staging today. OwnerRez or Savina CRM can later populate the same bookings table.
src/integrations/ocr.js, then applies receipt rules for vendor, date, total, and rewards/wallet exclusions.
src/integrations/fx.js. The guest PDF only ever shows the adjusted customer rate.
create-stripe-checkout Supabase Edge Function. The hosted URL is embedded in the guest PDF as a clickable “Pay Invoice” link, and the stripe-webhook function reconciles paid/expired/failed status. Setup notes in docs/stripe-payments.md.
db/migrations/0001_initial.sql.
Prepared for —
Sent —
This reimbursement request includes guest-related purchases made on your behalf during your stay. Receipt images are included below for reference.
Tap to pay securely with Stripe.
| Vendor / Item | Date | ID | Amount |
|---|
Receipt images included for guest review
Choose how you'd like to continue. Cancelling clears the current receipt and image.
Marking the invoice paid will take it out of the unpaid invoice list. You should do this only if they paid the invoice using cash or something other than credit card.
Uploading and recording your receipt.