docs(launch): mark receipts Phase 1 complete, add branch-merge checkbox
Flips the P1 section from 'none of it is implemented' to a shipped/remaining breakdown citing commits bf5a333..91711aa, and adds a one-line current-state bullet pointing at the unmerged feature branch.
This commit is contained in:
parent
0ce61756b7
commit
1fbe9c3227
1 changed files with 16 additions and 8 deletions
|
|
@ -12,6 +12,7 @@ Single source of truth for work that must happen before cutover. P0 blocks launc
|
||||||
- `main` is now caught up locally (2026-04-20): `feature/helcim-plan-consolidation` (40 commits) and `feature/contribution-amount-redesign` (17 commits) fast-forwarded in. Not pushed — site is not on Netlify yet.
|
- `main` is now caught up locally (2026-04-20): `feature/helcim-plan-consolidation` (40 commits) and `feature/contribution-amount-redesign` (17 commits) fast-forwarded in. Not pushed — site is not on Netlify yet.
|
||||||
- Helcim plan consolidation migration ran against prod 2026-04-18 (Monthly plan id `50302`, Annual plan id `50303`). **Contribution-amount migration has NOT yet been run against prod.**
|
- Helcim plan consolidation migration ran against prod 2026-04-18 (Monthly plan id `50302`, Annual plan id `50303`). **Contribution-amount migration has NOT yet been run against prod.**
|
||||||
- Cadence/contribution UX unified across signup + edit surfaces 2026-04-20. Uncommitted in working tree — see "Cadence UX refinements" below.
|
- Cadence/contribution UX unified across signup + edit surfaces 2026-04-20. Uncommitted in working tree — see "Cadence UX refinements" below.
|
||||||
|
- **Charitable receipts Phase 1 built on `feature/receipts-phase-1` (commits `bf5a333..91711aa`, 2026-04-20). Unmerged.** All four spec items shipped: `Payment` model + idempotent `upsertPaymentFromHelcim` helper, synchronous payment logging on both new paid subscriptions and free→paid upgrades, nightly reconciliation script, `/join` charity note, and `taxReceiptPreferences` schema field (no UI — Phase 2). Resend-owned confirmation email (`server/emails/paymentConfirmation.js`) is CRA-safe. Remaining work is deploy-time only (merge branch, disable Helcim default email on plans 50302 + 50303, backfill, real staging charge) — tracked in Deploy checklist.
|
||||||
|
|
||||||
### Cadence UX refinements (2026-04-20, uncommitted)
|
### Cadence UX refinements (2026-04-20, uncommitted)
|
||||||
|
|
||||||
|
|
@ -38,16 +39,23 @@ None outstanding.
|
||||||
|
|
||||||
## P1 — Strongly preferred before launch
|
## P1 — Strongly preferred before launch
|
||||||
|
|
||||||
### Charitable receipts — Phase 1 (`docs/specs/receipts-launch-spec.md`)
|
### Charitable receipts — Phase 1 ✅ COMPLETE (`docs/specs/receipts-launch-spec.md`)
|
||||||
Spec exists but **none of it is implemented**. Phase 2 (the actual receipt generation) is post-launch (live Jan 2027), but Phase 1 must land at launch so Phase 2 has the data + compliance posture it needs. Skipping Phase 1 means: payments made between launch and Phase 2 may be missing fields needed to receipt them, and the Helcim default confirmation email may make CRA-noncompliant claims.
|
|
||||||
|
|
||||||
What needs to ship:
|
Built on `feature/receipts-phase-1`, commits `bf5a333..91711aa` (2026-04-20). **Unmerged.** All four spec items shipped; remaining work is deploy-time only (tracked in Deploy checklist).
|
||||||
- **Payment logging.** Every successful Helcim payment writes a record (member id, amount CAD, payment date, Helcim transaction id, payment type monthly/annual, `receiptIssued: false`, `receiptId: null`). Failed payments logged separately. No `Payment` model exists today; needs new model + webhook wiring in `server/api/helcim/`.
|
|
||||||
- **Helcim confirmation email review.** Customize so it does NOT use "tax receipt," "donation receipt," or "for tax purposes," and includes the registered charity name "Baby Ghosts Studio Development Fund" plus the disclaimer wording from the spec (section 2). If Helcim's template editor can't accomplish this, suppress the Helcim confirmation and send our own via Resend.
|
|
||||||
- **Join page copy.** Add the factual charity / tax-deductible note near the contribution amount input per spec section 3 — `app/pages/join.vue`. No form fields, just the line.
|
|
||||||
- **Member schema field.** Add `taxReceiptPreferences: { filesCanadianTaxes: Boolean, middleInitial: String|null, confirmedAddress: {...}|null, setupCompletedAt: Date|null }` to `server/models/member.js`. Default null/false. Not exposed in UI yet.
|
|
||||||
|
|
||||||
Rough scope: 1 day if Helcim's email template is editable; +0.5 day if we have to route confirmations through Resend instead. Decide which path during implementation.
|
Shipped:
|
||||||
|
- **Payment logging.** New `Payment` model (`server/models/payment.js`) + idempotent `upsertPaymentFromHelcim` helper keyed on unique `helcimTransactionId` (`server/utils/payments.js`). Synchronous write paths:
|
||||||
|
- New paid subscription → `server/api/helcim/subscription.post.js` fetches the newest paid Helcim tx and upserts a Payment with `paymentType` from cadence + `sendConfirmation: true`. Wrapped in try/catch so a logging failure cannot break subscription creation.
|
||||||
|
- Free → paid upgrade → `server/api/members/update-contribution.post.js` (Case 1 branch) does the same.
|
||||||
|
- Paid → paid amount change (Case 3) is intentionally **not** wired synchronously — no new tx at the moment of change; the next recurring charge is captured by the reconciliation script.
|
||||||
|
- **Confirmation email via Resend, not Helcim.** Spec alternative (b) chosen. `server/emails/paymentConfirmation.js` is CRA-safe: charity name "Baby Ghosts Studio Development Fund" + "not an official donation receipt / tax receipts available later in 2026" disclaimer. Triggered only on new Payment inserts; send failures are swallowed. Helcim's default confirmation must be disabled on plans 50302 + 50303 at cutover (Deploy checklist).
|
||||||
|
- **Join page copy.** Factual charity note below contribution tiers on `/join` only (`app/pages/join.vue:83`). `/accept-invite` and `/member/account` intentionally untouched per spec §3.
|
||||||
|
- **Member schema field.** `taxReceiptPreferences` nested object added to `server/models/member.js` (filesCanadianTaxes, middleInitial, confirmedAddress sub-object, setupCompletedAt). Defaults null/false — existing members read as "not set up." Schema-only; no Zod, no route, no UI. Phase 2 binds to it without migration.
|
||||||
|
- **Reconciliation script.** `scripts/reconcile-helcim-payments.mjs` iterates every Member with `helcimCustomerId`, pulls recent Helcim transactions, and upserts via the same helper. Idempotent. Dry-run by default; `--apply` to write. No confirmation emails sent during reconcile. Dual purpose: launch-day backfill for the ~34 pre-existing members, and nightly cron post-launch to catch recurring charges that bypass the synchronous write paths.
|
||||||
|
|
||||||
|
Remaining (deploy-time, not code):
|
||||||
|
- [ ] Merge `feature/receipts-phase-1` into `main`.
|
||||||
|
- Manual Helcim-dashboard step + prod reconcile + staging test charge — see Deploy checklist.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue