59 lines
11 KiB
HTML
59 lines
11 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Domain 4 — Verification & Credentials — 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 & ground truths</a></li></ul></div><div class="group"><div class="label">Business requirements</div><ul><li><a href="../business/index.html">Overview & MVP scope</a></li><li><a href="../business/01-actors-and-onboarding.html">1. Actors & 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 & pricing</a></li><li><a href="../business/04-search-and-matching.html">4. Search & matching</a></li><li><a href="../business/05-booking-and-scheduling.html">5. Booking & 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 & refunds</a></li><li><a href="../business/08-payments-and-escrow.html">8. Payments & 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 & safety</a></li><li><a href="../business/12-messaging-and-emergencies.html">12. Messaging & emergencies</a></li><li><a href="../business/13-tax-invoicing-and-legal.html">13. Tax, invoicing & legal</a></li><li><a href="../business/14-notifications-and-admin.html">14. Notifications & admin</a></li></ul></div><div class="group"><div class="label">Database model</div><ul><li><a href="index.html">Overview & decisions</a></li><li><a href="diagrams.html">Diagrams</a></li><li><a href="01-identity-and-access.html">1. Identity & access</a></li><li><a href="02-geography.html">2. Geography</a></li><li><a href="03-services-and-pricing.html">3. Services & pricing</a></li><li><a class="active" href="04-verification-and-credentials.html">4. Verification & credentials</a></li><li><a href="05-booking-and-scheduling.html">5. Booking & scheduling</a></li><li><a href="06-payments-ledger-and-refunds.html">6. Payments, ledger & refunds</a></li><li><a href="07-payouts.html">7. Payouts</a></li><li><a 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 & 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 & reference</a></li><li><a href="13-partner-centers-and-future.html">13. Partner centers & future</a></li></ul></div><div class="group"><div class="label">Payments deep-dive</div><ul><li><a href="../payments/index.html">Overview & 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 & finding</a></li><li><a href="../payments/cancellation-and-payout.html">Cancellation & nurse payout</a></li><li><a href="../payments/integration-notes.html">Integration & schema touchpoints</a></li><li><a href="../payments/sources.html">Recommendations & sources</a></li></ul></div><div class="group"><div class="label">Research & strategy</div><ul><li><a href="../research/index.html">Overview & exec summary</a></li><li><a href="../research/market-and-competitors.html">Market & competitors</a></li><li><a href="../research/problems-and-risks.html">Problems & 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 & sources</a></li></ul></div><div class="group"><div class="label">Notes & 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-4-verification-credentials">Domain 4 — Verification & Credentials</h1>
|
|
<p><a href="index.html">← Database Model</a></p>
|
|
<p><strong>Related:</strong> business requirements — <a href="../business/02-nurse-verification.html">Nurse verification</a>.</p>
|
|
<p>The pipeline stays <strong>data-driven</strong>: step types are rows, so a new regulatory requirement (e.g. professional liability insurance) is one INSERT. This revision adds a <strong>structured credential registry</strong> because the brand <em>is</em> "verified trust" and renewal tracking needs queryable license numbers, not opaque PDFs.</p>
|
|
<h3 id="nurse_verifications-core"><code>nurse_verifications</code> [CORE] <a class="anchor" href="#nurse_verifications-core" aria-hidden="true">#</a></h3>
|
|
<p><strong>Role:</strong> The master per-nurse verification record; aggregates step outcomes into one status (the single source of truth for verification state). <strong>Why a header table:</strong> one place to drive the overall lifecycle and the <code>is_verified</code> flip. Fields unchanged: <code>id</code>, <code>nurse_id</code> (unique), <code>status</code> (<code>not_started</code>/<code>pending</code>/<code>in_review</code>/<code>approved</code>/<code>rejected</code>/<code>suspended</code>), <code>submitted_at</code>, <code>approved_at</code>, <code>rejected_at</code>, <code>suspended_at</code>, <code>rejection_reason</code>, <code>reviewed_by_admin_id</code>, <code>internal_notes</code>, timestamps. <strong>Relations:</strong> 1:1 → <code>nurse_profiles</code>; 1:N → <code>verification_steps</code>.</p>
|
|
<h3 id="verification_step_types-core"><code>verification_step_types</code> [CORE] <a class="anchor" href="#verification_step_types-core" aria-hidden="true">#</a></h3>
|
|
<p><strong>Role:</strong> Admin catalog of pipeline steps with stable machine <code>code</code>s (<code>identity_kyc</code>, <code>shahkar_match</code>, <code>moh_competency_license</code>, <code>ino_membership</code>, <code>criminal_record</code>, <code>bank_account_verification</code>). <strong>Why rows + <code>is_automated</code>/<code>automation_provider</code>:</strong> the Iranian credential reality is fragmented across regulators and partly automatable (Shahkar, liveness) and partly manual (license PDF) — data-driving it absorbs that without code changes. Fields unchanged. <strong>Relations:</strong> 1:N → <code>verification_steps</code>.</p>
|
|
<h3 id="verification_steps-core"><code>verification_steps</code> [CORE] <a class="anchor" href="#verification_steps-core" aria-hidden="true">#</a></h3>
|
|
<p><strong>Role:</strong> One row per step per nurse; tracks status, the raw <code>external_response_json</code> (KYC vendor audit), and <code>expires_at</code> for time-limited steps (the عدم سوء پیشینه certificate expires → step reverts to <code>pending</code> + raises a <code>support_alert</code>). <strong>Why snapshot <code>is_automated</code>:</strong> historical records survive later step-type edits. Fields unchanged, with <code>UNIQUE(nurse_verification_id, step_type_id)</code>. <strong>Relations:</strong> N:1 → <code>nurse_verifications</code>, <code>verification_step_types</code>; 1:N → <code>verification_documents</code>.</p>
|
|
<h3 id="verification_documents-core"><code>verification_documents</code> [CORE] <a class="anchor" href="#verification_documents-core" aria-hidden="true">#</a></h3>
|
|
<p><strong>Role:</strong> Uploaded evidence metadata (object-storage key + integrity hash); files live in S3-compatible storage behind signed URLs, never public. <strong>Why metadata-only:</strong> keeps PII bytes out of the DB and access controlled. Fields unchanged. <strong>Relations:</strong> N:1 → <code>verification_steps</code>.</p>
|
|
<h3 id="nurse_credentials-mvp-new"><code>nurse_credentials</code> [MVP] — <strong>NEW</strong> <a class="anchor" href="#nurse_credentials-mvp-new" aria-hidden="true">#</a></h3>
|
|
<p><strong>Role:</strong> Structured, queryable registry of the actual Iranian credentials — beyond the opaque document uploads. <strong>Why:</strong> no public B2B API exists for MoH/INO, so an admin manually verifies an uploaded credential against the official portal — but the old model gave them <strong>nowhere to record the verified license number</strong> for renewal alerts, the public trust badge, or cross-check. This makes the badge and expiry monitoring real and survives a future INO/MoH API.</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>nurse_id</code></td><td>BIGINT FK → nurse_profiles</td><td></td></tr>
|
|
<tr><td><code>credential_type</code></td><td>NVARCHAR(50)</td><td><code>moh_competency_license</code> (پروانه صلاحیت حرفهای) / <code>ino_membership</code> (نظام پرستاری) / <code>criminal_record</code> (عدم سوء پیشینه)</td></tr>
|
|
<tr><td><code>credential_number</code></td><td>NVARCHAR(100) (enc)</td><td>License/membership number</td></tr>
|
|
<tr><td><code>holder_name_snapshot</code></td><td>NVARCHAR(200)</td><td>Name as printed, for ID cross-check</td></tr>
|
|
<tr><td><code>issuing_authority</code></td><td>NVARCHAR(200)</td><td></td></tr>
|
|
<tr><td><code>issued_at</code>, <code>expires_at</code></td><td>DATE NULL</td><td>Drives renewal alerts</td></tr>
|
|
<tr><td><code>verification_source</code></td><td>NVARCHAR(300) NULL</td><td>Portal URL / method</td></tr>
|
|
<tr><td><code>verification_method</code></td><td>NVARCHAR(20)</td><td><code>manual</code> / <code>portal</code> / <code>api</code></td></tr>
|
|
<tr><td><code>verified_by_admin_id</code></td><td>BIGINT FK → users NULL</td><td></td></tr>
|
|
<tr><td><code>created_at</code>, <code>updated_at</code></td><td>…</td><td></td></tr>
|
|
</tbody></table></div>
|
|
<p><strong>Relations:</strong> N:1 → <code>nurse_profiles</code>. Cross-referenced by the relevant <code>verification_steps</code>.</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>
|