Files
baya-monorepo/product/data-model/08-bnpl.html
T
2026-06-24 01:32:46 +03:30

60 lines
9.8 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Domain 8 — BNPL / Installments — Balinyaar docs</title>
<link rel="stylesheet" href="../assets/doc.css">
</head>
<body>
<div class="layout">
<aside class="sidebar">
<a class="brand" href="../index.html"><span class="dot"></span> Balinyaar docs</a>
<p class="tagline">Trust-first home-nursing marketplace · Iran</p>
<nav><div class="group"><div class="label">Start here</div><ul><li><a href="../index.html">Docs home</a></li><li><a href="../overview/platform-summary.html">Platform summary &amp; ground truths</a></li></ul></div><div class="group"><div class="label">Business requirements</div><ul><li><a href="../business/index.html">Overview &amp; MVP scope</a></li><li><a href="../business/01-actors-and-onboarding.html">1. Actors &amp; onboarding</a></li><li><a href="../business/02-nurse-verification.html">2. Nurse verification</a></li><li><a href="../business/03-service-catalog-and-pricing.html">3. Service catalog &amp; pricing</a></li><li><a href="../business/04-search-and-matching.html">4. Search &amp; matching</a></li><li><a href="../business/05-booking-and-scheduling.html">5. Booking &amp; scheduling</a></li><li><a href="../business/06-evv-and-service-delivery.html">6. EVV / service delivery</a></li><li><a href="../business/07-cancellation-and-refunds.html">7. Cancellation &amp; refunds</a></li><li><a href="../business/08-payments-and-escrow.html">8. Payments &amp; escrow</a></li><li><a href="../business/09-installments-bnpl.html">9. Installments / BNPL</a></li><li><a href="../business/10-payouts.html">10. Payouts to nurses</a></li><li><a href="../business/11-reviews-trust-and-safety.html">11. Reviews, trust &amp; safety</a></li><li><a href="../business/12-messaging-and-emergencies.html">12. Messaging &amp; emergencies</a></li><li><a href="../business/13-tax-invoicing-and-legal.html">13. Tax, invoicing &amp; legal</a></li><li><a href="../business/14-notifications-and-admin.html">14. Notifications &amp; admin</a></li></ul></div><div class="group"><div class="label">Database model</div><ul><li><a href="index.html">Overview &amp; decisions</a></li><li><a href="diagrams.html">Diagrams</a></li><li><a href="01-identity-and-access.html">1. Identity &amp; access</a></li><li><a href="02-geography.html">2. Geography</a></li><li><a href="03-services-and-pricing.html">3. Services &amp; pricing</a></li><li><a href="04-verification-and-credentials.html">4. Verification &amp; credentials</a></li><li><a href="05-booking-and-scheduling.html">5. Booking &amp; scheduling</a></li><li><a href="06-payments-ledger-and-refunds.html">6. Payments, ledger &amp; refunds</a></li><li><a href="07-payouts.html">7. Payouts</a></li><li><a class="active" href="08-bnpl.html">8. BNPL / installments</a></li><li><a href="09-messaging.html">9. Messaging</a></li><li><a href="10-reviews-and-records.html">10. Reviews &amp; records</a></li><li><a href="11-notifications.html">11. Notifications</a></li><li><a href="12-audit-config-and-reference.html">12. Audit, config &amp; reference</a></li><li><a href="13-partner-centers-and-future.html">13. Partner centers &amp; future</a></li></ul></div><div class="group"><div class="label">Payments deep-dive</div><ul><li><a href="../payments/index.html">Overview &amp; exec summary</a></li><li><a href="../payments/iranian-payment-reality.html">Iranian payment reality</a></li><li><a href="../payments/escrow-ledger.html">Escrow as a ledger</a></li><li><a href="../payments/bnpl-landscape.html">BNPL landscape &amp; finding</a></li><li><a href="../payments/cancellation-and-payout.html">Cancellation &amp; nurse payout</a></li><li><a href="../payments/integration-notes.html">Integration &amp; schema touchpoints</a></li><li><a href="../payments/sources.html">Recommendations &amp; sources</a></li></ul></div><div class="group"><div class="label">Research &amp; strategy</div><ul><li><a href="../research/index.html">Overview &amp; exec summary</a></li><li><a href="../research/market-and-competitors.html">Market &amp; competitors</a></li><li><a href="../research/problems-and-risks.html">Problems &amp; risks</a></li><li><a href="../research/verification.html">Verification (research)</a></li><li><a href="../research/legal-landscape.html">Legal landscape</a></li><li><a href="../research/go-to-market.html">Go-to-market &amp; sources</a></li></ul></div><div class="group"><div class="label">Notes &amp; more</div><ul><li><a href="../notes/open-questions.html">Open questions</a></li><li><a href="../notes/future-ideas.html">Future ideas</a></li><li><a href="../wireframes/index.html">Wireframes</a></li><li><a href="../fa/index.html">Farsi documents</a></li></ul></div></nav>
</aside>
<main class="main"><div class="content">
<div class="topbar"><button class="theme-toggle" type="button" onclick="__t()">theme</button></div>
<h1 id="domain-8-bnpl-installments">Domain 8 — BNPL / Installments</h1>
<p><a href="index.html">← Database Model</a></p>
<p><strong>Related:</strong> business requirements — <a href="../business/09-installments-bnpl.html">Installments / BNPL</a>. Settlement and reversal detail are explained in depth in the payments docs — <a href="../payments/bnpl-landscape.html">BNPL landscape</a> and <a href="../payments/cancellation-and-payout.html">Cancellation &amp; payout</a>.</p>
<p><strong>Resolved.</strong> Because verified research shows Iranian provider-financed BNPL settles the <strong>full amount to the merchant in one lump</strong> (provider owns the customer's installments and default risk), a BNPL order is — in our books — a card payment that lands net-of-fee. The original <code>installment_plans</code> + <code>installment_entries</code> subsystem (which tried to track the customer's repayment schedule and default) is <strong>deleted</strong>: it modeled a receivable Balinyaar never owns and a risk it never bears.</p>
<h3 id="bnpl_transactions-mvp-new-replaces-installment_plans"><code>bnpl_transactions</code> [MVP] — <strong>NEW (replaces <code>installment_plans</code>)</strong> <a class="anchor" href="#bnpl_transactions-mvp-new-replaces-installment_plans" aria-hidden="true">#</a></h3>
<p><strong>Role:</strong> One row per BNPL order, 1:1 with its <code>payment_transaction</code> — the single inbound settlement to reconcile, plus the revert path. <strong>Why one row, not a plan+entries tree:</strong> there is nothing to amortize on our side; we track the settlement, the provider's commission, and the reversal.</p>
<div class="table-wrap"><table><thead><tr><th>Field</th><th>Type</th><th>Notes</th></tr></thead><tbody>
<tr><td><code>id</code></td><td>BIGINT PK</td><td></td></tr>
<tr><td><code>payment_transaction_id</code></td><td>BIGINT FK UNIQUE</td><td>1:1</td></tr>
<tr><td><code>provider_code</code></td><td>NVARCHAR(50)</td><td><code>snapppay</code> / <code>digipay</code> / <code>tara</code> / <code>torobpay</code></td></tr>
<tr><td><code>merchant_of_record</code></td><td>NVARCHAR(40)</td><td>Balinyaar entity or partner center</td></tr>
<tr><td><code>external_payment_token</code></td><td>NVARCHAR(200)</td><td>For verify/settle/revert</td></tr>
<tr><td><code>external_transaction_id</code></td><td>NVARCHAR(200)</td><td></td></tr>
<tr><td><code>eligibility_status</code></td><td>NVARCHAR(30)</td><td></td></tr>
<tr><td><code>order_amount_irr</code></td><td>BIGINT</td><td>Gross order</td></tr>
<tr><td><code>settled_amount_irr</code></td><td>BIGINT</td><td>Net of provider commission actually received</td></tr>
<tr><td><code>bnpl_commission_irr</code></td><td>BIGINT</td><td>Provider's merchant discount = platform <strong>expense</strong> (never the nurse's)</td></tr>
<tr><td><code>currency</code></td><td>NVARCHAR(5)</td><td><code>IRR</code>/<code>TOMAN</code> at boundary; convert in</td></tr>
<tr><td><code>installment_count</code></td><td>TINYINT</td><td>Informational (default 4) — owned by the provider</td></tr>
<tr><td><code>status</code></td><td>NVARCHAR(30)</td><td>State machine: <code>eligible</code>/<code>token_issued</code>/<code>verified</code>/<code>settled</code>/<code>reverted</code>/<code>cancelled</code>/<code>failed</code></td></tr>
<tr><td><code>settled_at</code></td><td>DATETIME2 NULL</td><td><strong>Per-transaction</strong> — timing is contract-defined (daily/T+1-3/weekly), never assumed instant</td></tr>
<tr><td><code>revert_transaction_id</code>, <code>reverted_amount_irr</code>, <code>reverted_at</code></td><td></td><td>Reversal path</td></tr>
<tr><td><code>refund_channel</code></td><td>NVARCHAR(20)</td><td></td></tr>
<tr><td><code>callback_payload_json</code></td><td>NVARCHAR(MAX)</td><td>Raw verify/settle payload</td></tr>
<tr><td>timestamps</td><td></td><td></td></tr>
</tbody></table></div>
<p><strong>Relations:</strong> 1:1 → <code>payment_transactions</code>. <strong>State-machine guard</strong> on <code>status</code> for idempotency.</p>
<h3 id="bnpl_settlement_entries-deferred"><code>bnpl_settlement_entries</code> [DEFERRED] <a class="anchor" href="#bnpl_settlement_entries-deferred" aria-hidden="true">#</a></h3>
<p><strong>Role/Why:</strong> Only needed if a future provider uses <strong>tranched</strong> settlement (pays the platform over time). No mainstream Iranian provider does today, so it's modeled-but-inactive; adding it later is a purely additive migration.</p>
<a class="back-to-top" href="#">↑ Back to top</a>
</div></main>
</div>
<script>
(function(){var k='balinyaar-docs-theme';var s=localStorage.getItem(k);
if(s)document.documentElement.setAttribute('data-theme',s);
else if(matchMedia('(prefers-color-scheme: dark)').matches)document.documentElement.setAttribute('data-theme','dark');})();
function __t(){var d=document.documentElement;var n=d.getAttribute('data-theme')==='dark'?'light':'dark';
d.setAttribute('data-theme',n);localStorage.setItem('balinyaar-docs-theme',n);}
</script>
</body>
</html>