backend phase 11
This commit is contained in:
@@ -44,6 +44,24 @@
|
||||
</ul>
|
||||
<h2 id="d-supporting-database-entities">(d) Supporting database entities <a class="anchor" href="#d-supporting-database-entities" aria-hidden="true">#</a></h2>
|
||||
<p><strong><code>cancellation_policies</code></strong>, <code>bookings</code> (policy snapshot, <code>dispute_window_ends_at</code>), <code>refunds</code> (admin-only, <code>ticket_id</code>, fee-leg decomposition, <code>refund_channel</code>), <code>tickets</code>, <code>nurse_clawbacks</code> (post-payout case), <code>ledger_entries</code>.</p>
|
||||
<h2 id="e-as-built-backend-phase-11">(e) As built (backend-phase-11) <a class="anchor" href="#e-as-built-backend-phase-11" aria-hidden="true">#</a></h2>
|
||||
<p>Decisions fixed while building the refund/clawback/invoice engine (config-driven where possible):</p>
|
||||
<ul>
|
||||
<li><strong>Refund channel canonical code:</strong> the out-of-band bank refund is stored and served as <strong><code>manual</code></strong> (the wire</li>
|
||||
</ul>
|
||||
<p> code), not <code>manual_bank</code> — they are the same channel. Full set: <code>psp_card</code> | <code>bnpl_revert</code> | <code>manual</code>.</p>
|
||||
<ul>
|
||||
<li><strong>Ticket link is config-gated until b15.</strong> <code>refunds.ticket_id</code> is a nullable column with <strong>no FK yet</strong></li>
|
||||
</ul>
|
||||
<p> (<code>tickets</code> arrives in b15). "A refund must link a ticket" is enforced by the <code>refund_ticket_required</code> config flag, <strong>default <code>false</code></strong> so admin refunds are testable today; b15 wires the FK and flips it on.</p>
|
||||
<ul>
|
||||
<li><strong>BNPL refund ETA</strong> is <code>now + config(bnpl_refund_eta_business_days, default 10)</code> business days (Fridays skipped),</li>
|
||||
</ul>
|
||||
<p> surfaced as <code>expected_customer_refund_eta</code>; the refund sits in <code>processing</code> until reconciled. Card refunds are immediate (<code>succeeded</code>, no ETA). Card and BNPL post the <strong>same</strong> reversal ledger legs.</p>
|
||||
<ul>
|
||||
<li><strong>Pre-payout vs post-payout fork</strong> is decided by whether the nurse was already paid — derived from the booking's</li>
|
||||
</ul>
|
||||
<p> <code>dispute_window_ends_at</code> close until b13 ships <code>nurse_payouts</code> (a <code>refund_assume_nurse_paid</code> override exists). Clawback <strong>recovery/netting is b13</strong>; b11 only opens the <code>pending</code> receivable + supports admin write-off.</p>
|
||||
<blockquote><p><strong>Related:</strong> Data model — <a href="../data-model/06-payments-ledger-and-refunds.html">Payments Ledger & Refunds</a>.</p>
|
||||
</blockquote>
|
||||
<a class="back-to-top" href="#">↑ Back to top</a>
|
||||
|
||||
@@ -25,4 +25,18 @@
|
||||
## (d) Supporting database entities
|
||||
**`cancellation_policies`**, `bookings` (policy snapshot, `dispute_window_ends_at`), `refunds` (admin-only, `ticket_id`, fee-leg decomposition, `refund_channel`), `tickets`, `nurse_clawbacks` (post-payout case), `ledger_entries`.
|
||||
|
||||
## (e) As built (backend-phase-11)
|
||||
Decisions fixed while building the refund/clawback/invoice engine (config-driven where possible):
|
||||
- **Refund channel canonical code:** the out-of-band bank refund is stored and served as **`manual`** (the wire
|
||||
code), not `manual_bank` — they are the same channel. Full set: `psp_card` | `bnpl_revert` | `manual`.
|
||||
- **Ticket link is config-gated until b15.** `refunds.ticket_id` is a nullable column with **no FK yet**
|
||||
(`tickets` arrives in b15). "A refund must link a ticket" is enforced by the `refund_ticket_required` config
|
||||
flag, **default `false`** so admin refunds are testable today; b15 wires the FK and flips it on.
|
||||
- **BNPL refund ETA** is `now + config(bnpl_refund_eta_business_days, default 10)` business days (Fridays skipped),
|
||||
surfaced as `expected_customer_refund_eta`; the refund sits in `processing` until reconciled. Card refunds are
|
||||
immediate (`succeeded`, no ETA). Card and BNPL post the **same** reversal ledger legs.
|
||||
- **Pre-payout vs post-payout fork** is decided by whether the nurse was already paid — derived from the booking's
|
||||
`dispute_window_ends_at` close until b13 ships `nurse_payouts` (a `refund_assume_nurse_paid` override exists).
|
||||
Clawback **recovery/netting is b13**; b11 only opens the `pending` receivable + supports admin write-off.
|
||||
|
||||
> **Related:** Data model — [Payments Ledger & Refunds](../data-model/06-payments-ledger-and-refunds.md).
|
||||
|
||||
Reference in New Issue
Block a user