Files
baya-monorepo/product/فلوی-احراز-هویت-پرستار.html
T
2026-06-18 01:42:37 +03:30

421 lines
43 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>فلوی احراز هویت و صلاحیت پرستار — راهنمای پیاده‌سازی</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;500;700;800&display=swap" rel="stylesheet">
<style>
:root {
--ink: #1f2933; --muted: #52606d; --accent: #0d6e6e; --accent-dark: #0a5252;
--line: #d9e2e6; --bg: #f7f9fa; --card: #ffffff;
--warn-bg: #fff7e6; --warn-border: #f0b429;
--note-bg: #eef6f6;
--auto: #0a7d3c; --auto-bg: #e6f4ea;
--consent: #b45309; --consent-bg: #fdf0dd;
--manual: #475569; --manual-bg: #eef1f4;
--bad: #b42318; --bad-bg: #fdeceb;
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
font-family: 'Vazirmatn','Tahoma','IRANSans','Segoe UI',sans-serif;
direction: rtl; text-align: right; line-height: 2; color: var(--ink);
background: var(--bg); margin: 0; padding: 0; font-size: 16.5px; -webkit-font-smoothing: antialiased;
}
.wrap { max-width: 1000px; margin: 0 auto; padding: 44px 24px 80px; }
.doc { background: var(--card); border: 1px solid var(--line); border-radius: 16px;
padding: 42px clamp(20px,5vw,52px); box-shadow: 0 4px 24px rgba(15,40,50,.05); }
h1 { font-size: 1.95rem; font-weight: 800; line-height: 1.6; color: var(--accent-dark);
margin: 0 0 6px; border-bottom: 3px solid var(--accent); padding-bottom: 16px; }
h2 { font-size: 1.5rem; font-weight: 800; color: var(--accent-dark); margin: 50px 0 12px;
padding: 10px 16px; background: linear-gradient(90deg,var(--note-bg),transparent);
border-right: 5px solid var(--accent); border-radius: 6px; }
h3 { font-size: 1.2rem; font-weight: 700; color: var(--accent-dark); margin: 30px 0 8px; }
h4 { font-size: 1.02rem; font-weight: 700; color: var(--muted); margin: 20px 0 6px; }
p { margin: 12px 0; }
a { color: var(--accent); text-decoration: none; border-bottom: 1px dotted var(--accent); word-break: break-all; }
a:hover { color: var(--accent-dark); border-bottom-style: solid; }
strong { font-weight: 700; color: #102a30; }
ul, ol { padding-right: 24px; margin: 12px 0; }
li { margin: 6px 0; }
hr { border: none; border-top: 1px solid var(--line); margin: 38px 0; }
code, .ltr { direction: ltr; unicode-bidi: embed; font-family: 'Consolas','Menlo',monospace;
background: #eef2f3; padding: 1px 6px; border-radius: 5px; font-size: .86em; color: #0a5252; }
blockquote { margin: 18px 0; padding: 14px 20px; background: var(--note-bg);
border-right: 5px solid var(--accent); border-radius: 8px; color: var(--muted); }
blockquote.warn { background: var(--warn-bg); border-right-color: var(--warn-border); color: #7a5b00; }
blockquote.bad { background: var(--bad-bg); border-right-color: var(--bad); color: #7a1d16; }
blockquote p { margin: 6px 0; }
.meta { color: var(--muted); font-size: .95rem; margin: 4px 0 20px; }
.sourcing { font-size: .9rem; background: #f0f4f5; border: 1px dashed var(--line);
border-radius: 10px; padding: 14px 20px; color: var(--muted); }
/* badges */
.badge { display: inline-block; border-radius: 20px; padding: 1px 11px; font-size: .8em; font-weight: 700; white-space: nowrap; }
.b-auto { background: var(--auto-bg); color: var(--auto); }
.b-consent { background: var(--consent-bg); color: var(--consent); }
.b-manual { background: var(--manual-bg); color: var(--manual); }
.b-bad { background: var(--bad-bg); color: var(--bad); }
/* tables */
.tablewrap { overflow-x: auto; margin: 20px 0; border-radius: 10px; border: 1px solid var(--line); }
table { border-collapse: collapse; width: 100%; min-width: 680px; font-size: .9rem; background: #fff; }
th, td { border: 1px solid var(--line); padding: 9px 12px; text-align: right; vertical-align: top; line-height: 1.7; }
thead th { background: var(--accent); color: #fff; font-weight: 700; }
tbody tr:nth-child(even) { background: #f6fafa; }
tbody tr:hover { background: #eef6f6; }
td:first-child, th:first-child { font-weight: 600; }
/* TOC */
nav.toc { background: #f0f6f6; border: 1px solid var(--line); border-radius: 12px; padding: 16px 26px; margin: 24px 0 8px; }
nav.toc h2 { margin: 0 0 8px; font-size: 1.12rem; background: none; border: none; padding: 0; }
nav.toc ol { margin: 0; } nav.toc a { border-bottom: none; }
/* stepper */
.stepper { margin: 24px 0; border-right: 3px solid var(--line); padding-right: 4px; }
.step { position: relative; padding: 0 34px 22px 0; }
.step::before { content: attr(data-n); position: absolute; right: -19px; top: 0;
width: 34px; height: 34px; border-radius: 50%; background: var(--accent); color: #fff;
font-weight: 800; display: flex; align-items: center; justify-content: center; font-size: .95rem;
box-shadow: 0 0 0 4px var(--bg); }
.step .st-title { font-weight: 800; color: var(--accent-dark); font-size: 1.08rem; margin-bottom: 2px; }
.step .st-sub { color: var(--muted); font-size: .9rem; }
/* step cards (detailed) */
.card { border: 1px solid var(--line); border-radius: 12px; margin: 16px 0; overflow: hidden; }
.card > .head { background: #f3f8f8; padding: 12px 18px; display: flex; align-items: center;
gap: 10px; flex-wrap: wrap; border-bottom: 1px solid var(--line); }
.card > .head .num { background: var(--accent); color: #fff; width: 28px; height: 28px; border-radius: 50%;
display: inline-flex; align-items: center; justify-content: center; font-weight: 800; font-size: .85rem; flex: none; }
.card > .head .ttl { font-weight: 800; color: var(--accent-dark); font-size: 1.05rem; }
.card > .body { padding: 6px 18px 14px; }
.kv { display: grid; grid-template-columns: 140px 1fr; gap: 4px 14px; margin: 10px 0; }
.kv dt { font-weight: 700; color: var(--muted); }
.kv dd { margin: 0; }
@media (max-width: 560px) { .kv { grid-template-columns: 1fr; } .kv dt { margin-top: 8px; } }
.legend { display: flex; gap: 16px; flex-wrap: wrap; margin: 14px 0 4px; font-size: .9rem; }
.legend span { display: inline-flex; align-items: center; gap: 6px; }
@media print {
body { background: #fff; font-size: 12px; }
.doc { border: none; box-shadow: none; padding: 0; }
h2 { background: none; } a { color: #000; border: none; }
}
</style>
</head>
<body>
<div class="wrap">
<article class="doc">
<h1>فلوی احراز هویت و صلاحیت پرستار<br>راهنمای پیاده‌سازی برای ثبت‌نام در پلتفرم</h1>
<p class="meta"><strong>سناریو:</strong> پرستار برای ثبت‌نام مراجعه می‌کند و این داده‌ها را می‌دهد: شمارهٔ موبایل، کد ملی، شمارهٔ نظام (پرستاری)، و در صورت نیاز چند داده دیگر. هدف: <strong>اثبات اینکه او واقعاً همان کسی است که می‌گوید</strong>، <strong>راستی‌آزماییِ صلاحیت حرفه‌ای او</strong>، و <strong>استخراج خودکارِ حداکثر اطلاعات معتبر</strong> از منابع آنلاین (API پولی شخص ثالث بلامانع است).</p>
<blockquote class="warn">
<p>⚠️ <strong>یک تصحیح مهم از همان ابتدا:</strong> در ایران <strong>پرستاران</strong> عضو <strong>سازمان نظام پرستاری</strong> هستند و «<strong>شمارهٔ نظام پرستاری</strong>» دارند؛ «<strong>کد نظام پزشکی</strong>» مخصوص <strong>پزشکان</strong> (سازمان نظام پزشکی) است. این دو سامانهٔ کاملاً جدا هستند. در این سند هر دو پوشش داده شده‌اند، اما برای پرستار، منبع درست <strong>نظام پرستاری</strong> است (و جالب اینکه برخلاف نظام پزشکی، استعلام نظام پرستاری <em>API ندارد</em> — به بخش‌های ۴ و ۷ نگاه کنید).</p>
</blockquote>
<nav class="toc">
<h2>فهرست</h2>
<ol>
<li><a href="#principles">اصول طراحی (پیش از کدنویسی بخوانید)</a></li>
<li><a href="#inputs">داده‌های ورودی که از پرستار می‌گیریم</a></li>
<li><a href="#overview">نقشهٔ کلی فلو (نمای پرنده)</a></li>
<li><a href="#steps">فلوی مرحله‌به‌مرحله (با ورودی/خروجی/منطق هر گام)</a></li>
<li><a href="#crosscheck">ماتریس تطبیق متقابل (قلبِ ضدِ تقلب)</a></li>
<li><a href="#fieldmap">جدول «داده موردنیاز ← منبع/سرویس»</a></li>
<li><a href="#scoring">جمع‌بندیِ تصمیم و امتیاز اعتماد</a></li>
<li><a href="#legal">نکات حقوقی، حریم خصوصی و دسترسی</a></li>
<li><a href="#sources">منابع</a></li>
</ol>
</nav>
<hr>
<h2 id="principles">۱. اصول طراحی (پیش از کدنویسی بخوانید)</h2>
<ol>
<li><strong>تفاوت «اظهار» و «دادهٔ رسمی».</strong> هر چیزی که پرستار <em>تایپ می‌کند</em> (نام، سابقه، شماره نظام) صرفاً ادعاست. ارزش واقعی وقتی ساخته می‌شود که آن ادعا را با یک <strong>منبع رسمی مستقل</strong> (ثبت احوال، نظام پرستاری، تأمین اجتماعی) تطبیق دهید.</li>
<li><strong>سه نوع منبع از نظر دسترسی:</strong>
<div class="legend">
<span><span class="badge b-auto">خودکار</span> با API و فقط ورودی‌هایی که پرستار داده، بی‌نیاز از اقدام او</span>
<span><span class="badge b-consent">رضایتی / OTP</span> نیازمند ورود یا تأیید پیامکیِ خودِ فرد</span>
<span><span class="badge b-manual">دستی / آپلود</span> فرم وب بدون API، یا آپلود مدرک، یا استعلام سازمانی</span>
</div>
</li>
<li><strong>هویت را «گره بزنید»، نه اینکه فقط چک کنید.</strong> سخت‌ترین تقلب این حوزه، استفاده از یک <strong>شمارهٔ نظامِ واقعی ولی دزدیده‌شده</strong> است (سناریوی «پرستار قلابی»). پادزهر: نام و <strong>عکسِ</strong> روی رکورد نظام پرستاری را با هویت ثبت احوال <em>و</em> سلفیِ زندهٔ همان لحظه تطبیق دهید (بخش ۵).</li>
<li><strong>ارزان به گران.</strong> اول استعلام‌های ارزان و قطعی (شاهکار) را اجرا کنید؛ اگر رد شد، اصلاً سراغ مراحل گران (احراز ویدیویی) نروید. این هم هزینه را پایین می‌آورد هم تجربهٔ کاربر را.</li>
<li><strong>همهٔ این APIها فقط B2B هستند.</strong> برای استفاده باید شرکت ثبت‌شده، احراز کسب‌وکار و <code>client credential</code> داشته باشید؛ و طبق رگولاتوری باید از کاربر <strong>رضایت صریح</strong> برای استعلام و نگه‌داری داده بگیرید.</li>
<li><strong>«سال سابقه» را نمی‌توان بی‌رضایت و خودکار کشید.</strong> هیچ API عمومی‌ای با کد ملی، سال‌های تجربهٔ بالینی را برنمی‌گرداند؛ این داده یا با <em>رضایت/OTP خود فرد</em> از تأمین اجتماعی می‌آید یا با <em>آپلود گواهی سابقه</em> (بخش ۴، گام ۶).</li>
</ol>
<hr>
<h2 id="inputs">۲. داده‌های ورودی که از پرستار می‌گیریم</h2>
<p>برای اجرای کاملِ فلو، در فرم ثبت‌نام این فیلدها را جمع کنید (بعضی برای استعلام‌های رسمی <strong>الزامی</strong>اند):</p>
<div class="tablewrap">
<table>
<thead><tr><th>فیلد</th><th>چرا لازم است</th><th>وضعیت</th></tr></thead>
<tbody>
<tr><td>شمارهٔ موبایل</td><td>تطبیق با کد ملی در شاهکار؛ ارسال OTP</td><td>الزامی</td></tr>
<tr><td>کد ملی</td><td>کلید همهٔ استعلام‌های هویتی و حرفه‌ای</td><td>الزامی</td></tr>
<tr><td><strong>تاریخ تولد</strong></td><td><strong>برای استعلام هویت ثبت احوال و احراز ویدیویی الزامی است</strong> (بدون آن دادهٔ کامل ثبت احوال برنمی‌گردد)</td><td>الزامی</td></tr>
<tr><td>شمارهٔ نظام پرستاری</td><td>راستی‌آزمایی صلاحیت در <code>estelam.ino1.ir</code></td><td>الزامی</td></tr>
<tr><td>سریال پشت کارت ملی</td><td>ورودیِ احراز هویت ویدیوییِ (eKYC)</td><td>برای eKYC</td></tr>
<tr><td>ویدیوی سلفی (≈۵ ثانیه)</td><td>زنده‌سنجی + تطبیق چهره با عکس ثبت احوال</td><td>برای eKYC</td></tr>
<tr><td>کد پستی محل سکونت</td><td>تنها راه گرفتن آدرس رسمی (مسیر کد ملی→آدرس وجود ندارد)</td><td>اختیاری</td></tr>
<tr><td>شمارهٔ کارت یا شبای بانکی</td><td>تطبیق مالکیت حساب واریز با کد ملی</td><td>هنگام تسویه</td></tr>
<tr><td>گواهی سابقهٔ کار / مدرک تحصیلی (آپلود)</td><td>اثبات سابقه و کارشناسی پرستاری (که API ندارند)</td><td>آپلود</td></tr>
</tbody>
</table>
</div>
<hr>
<h2 id="overview">۳. نقشهٔ کلی فلو (نمای پرنده)</h2>
<div class="stepper">
<div class="step" data-n="۱"><div class="st-title">تطبیق موبایل ↔ کد ملی <span class="badge b-auto">خودکار</span></div><div class="st-sub">شاهکار — ارزان‌ترین و اولین دروازه. اگر رد شد، همین‌جا توقف.</div></div>
<div class="step" data-n="۲"><div class="st-title">تأیید مالکیت موبایل با OTP <span class="badge b-consent">OTP</span></div><div class="st-sub">پیامک کد یک‌بارمصرف؛ هم رضایت می‌گیرد هم شماره را قفل می‌کند.</div></div>
<div class="step" data-n="۳"><div class="st-title">استعلام هویت ثبت احوال <span class="badge b-auto">خودکار</span></div><div class="st-sub">کد ملی + تاریخ تولد → نام، نام پدر، شناسنامه، جنسیت، وضعیت حیات. پر کردن خودکار پروفایل.</div></div>
<div class="step" data-n="۴"><div class="st-title">احراز هویت ویدیویی (تطبیق چهره) <span class="badge b-consent">رضایتی</span></div><div class="st-sub">سلفی زنده ↔ عکس ثبت احوال. اثبات «حضور فیزیکیِ صاحب کد ملی».</div></div>
<div class="step" data-n="۵"><div class="st-title">راستی‌آزمایی صلاحیت پرستاری <span class="badge b-manual">دستی/Scrape</span></div><div class="st-sub"><code>estelam.ino1.ir</code> → نام، مقطع، رشته، شهر، <strong>عکس</strong>. تطبیق متقابل با گام ۳ و ۴.</div></div>
<div class="step" data-n="۶"><div class="st-title">سابقهٔ کار + مدرک تحصیلی <span class="badge b-consent">رضایتی</span> <span class="badge b-manual">آپلود</span></div><div class="st-sub">تأمین اجتماعی با OTP خود فرد، یا آپلود گواهی سابقه و دانشنامه.</div></div>
<div class="step" data-n="۷"><div class="st-title">پروانهٔ صلاحیت حرفه‌ای + عدم سوء پیشینه <span class="badge b-consent">رضایتی</span></div><div class="st-sub">پروانهٔ وزارت بهداشت (شاملِ غربالگری سوء‌پیشینه است) + آپلود گواهی عدم سوء پیشینه.</div></div>
<div class="step" data-n="۸"><div class="st-title">تطبیق حساب بانکیِ واریز <span class="badge b-auto">خودکار</span></div><div class="st-sub">شبا/کارت ↔ کد ملی. هنگام تنظیم تسویه‌حساب.</div></div>
<div class="step" data-n="۹"><div class="st-title">امتیاز اعتماد و تصمیم نهایی <span class="badge b-manual">منطق داخلی</span></div><div class="st-sub">جمع‌بندی نتایج، رفع مغایرت، تأیید/رد/بازبینی انسانی.</div></div>
</div>
<hr>
<h2 id="steps">۴. فلوی مرحله‌به‌مرحله</h2>
<p class="meta">برای هر گام: <strong>ورودی</strong> (چه می‌فرستیم)، <strong>منبع/API</strong>، <strong>خروجی</strong> (چه فیلدهایی برمی‌گردد)، و <strong>منطق تطبیق و تصمیم</strong>.</p>
<!-- STEP 1 -->
<div class="card">
<div class="head"><span class="num">۱</span><span class="ttl">تطبیق موبایل ↔ کد ملی (شاهکار)</span><span class="badge b-auto">خودکار</span></div>
<div class="body">
<dl class="kv">
<dt>ورودی</dt><dd><code>mobileNumber</code> + <code>nationalId</code> (همان دو فیلدی که پرستار داده)</dd>
<dt>منبع / API</dt><dd>سرویس <strong>شاهکار</strong> از طریق یکی از resellerها: Finnotech، U-ID/یوآیدی، api.ir، Shabanic، Zohal و … (همگی روی همان backend دولتی رگولاتوری مخابرات).</dd>
<dt>خروجی</dt><dd>فقط یک بولینِ <code>isMatched: true/false</code> (به‌همراه کد/پیام وضعیت). <strong>هیچ دادهٔ هویتی دیگری نمی‌دهد.</strong></dd>
<dt>منطق تصمیم</dt><dd>اگر <code>false</code> → یعنی سیم‌کارت به‌نام این کد ملی نیست؛ ثبت‌نام را همین‌جا متوقف یا به بازبینی دستی بفرستید. اگر <code>true</code> → ادامه. <em>(ارزان‌ترین استعلام؛ همیشه اول اجرا شود.)</em></dd>
</dl>
</div>
</div>
<!-- STEP 2 -->
<div class="card">
<div class="head"><span class="num">۲</span><span class="ttl">تأیید مالکیت شماره با OTP</span><span class="badge b-consent">OTP</span></div>
<div class="body">
<dl class="kv">
<dt>ورودی</dt><dd>شمارهٔ موبایل (همان شمارهٔ تأییدشده در گام ۱)</dd>
<dt>منبع / API</dt><dd>هر سرویس پیامک (Kavenegar، ملی‌پیامک، IPPanel، …)</dd>
<dt>خروجی</dt><dd>تأیید اینکه کاربر همان لحظه به سیم‌کارت دسترسی دارد + ثبت <strong>رضایت</strong> قانونی برای استعلام‌ها.</dd>
<dt>منطق تصمیم</dt><dd>شاهکار می‌گوید «سیم به‌نام این کد ملی است»؛ OTP می‌گوید «کاربر همین حالا سیم را در دست دارد». ترکیب این دو، جعل شماره را بسیار سخت می‌کند.</dd>
</dl>
</div>
</div>
<!-- STEP 3 -->
<div class="card">
<div class="head"><span class="num">۳</span><span class="ttl">استعلام هویت ثبت احوال (استخراج خودکار اطلاعات)</span><span class="badge b-auto">خودکار</span></div>
<div class="body">
<dl class="kv">
<dt>ورودی</dt><dd><code>nationalCode</code> + <code>birthDate</code> (تاریخ تولد الزامی است)</dd>
<dt>منبع / API</dt><dd><strong>استعلام هویت ثبت احوال</strong> از Shabanic یا U-ID. <span class="badge b-manual">توجه</span> «صحت‌سنجی کد ملیِ» Finnotech فقط <em>درصد تطبیق</em> می‌دهد، نه خودِ داده — برای پر کردن پروفایل از سرویس «استعلام هویت» استفاده کنید.</dd>
<dt>خروجی (فیلدها)</dt><dd><code>firstName</code>، <code>lastName</code>، <code>fatherName</code> (نام پدر)، <code>gender</code> (جنسیت)، <code>birthDate</code>، <code>deathStatus</code> (<strong>وضعیت حیات</strong> — زنده/فوت)، <code>idNo</code> (شماره شناسنامه)، <code>idSerial</code>/<code>idSerie</code> (سری و سریال شناسنامه). <em>شهر محل تولد به‌صورت فیلد صریح برنمی‌گردد.</em></dd>
<dt>منطق تصمیم</dt><dd><strong>پروفایل را خودکار پر کنید</strong> و نامِ اظهارشدهٔ پرستار را با <code>firstName/lastName</code>ِ رسمی تطبیق دهید. اگر <code>deathStatus</code> = فوت‌شده → پرچم قرمز و توقف. این گام، «نام واقعیِ گره‌خورده به کد ملی» را به دست می‌دهد که در گام ۵ به‌کار می‌آید.</dd>
</dl>
</div>
</div>
<!-- STEP 4 -->
<div class="card">
<div class="head"><span class="num">۴</span><span class="ttl">احراز هویت ویدیویی و تطبیق چهره (eKYC)</span><span class="badge b-consent">رضایتی</span></div>
<div class="body">
<dl class="kv">
<dt>ورودی</dt><dd>ویدیوی سلفی (≈۵ ثانیه) + <code>nationalId</code> + <code>nationalIdSerial</code> (سریال پشت کارت ملی) + <code>birthDate</code> + <code>gender</code></dd>
<dt>منبع / API</dt><dd><strong>احراز هویت ویدیوییِ</strong> U-ID، api.ir یا VIDA/ویدا. (زنده‌سنجی ~۹۸٪، تطبیق چهره >۹۹٪ طبق اعلام ارائه‌دهنده.)</dd>
<dt>خروجی</dt><dd>یک enum وضعیت: <code>state</code> = <code>ACCEPTED</code>/<code>REJECTED</code> به‌همراه <code>reason</code> (مثلاً <code>FACE_NOT_MATCH_ID</code> یا تأیید). <em>خروجی عددِ درصد نیست، بلکه قبول/رد است.</em></dd>
<dt>منطق تصمیم</dt><dd>این گام اثبات می‌کند فردِ زندهٔ پشت دوربین <strong>همان صاحب عکسِ ثبت احوالِ آن کد ملی است</strong> — یعنی صرفاً کسی نیست که کد ملیِ دیگری را تایپ کرده. اگر <code>REJECTED</code> → بازبینی دستی یا توقف.</dd>
</dl>
</div>
</div>
<!-- STEP 5 -->
<div class="card">
<div class="head"><span class="num">۵</span><span class="ttl">راستی‌آزمایی صلاحیت پرستاری (نظام پرستاری)</span><span class="badge b-manual">دستی / Scrape</span></div>
<div class="body">
<dl class="kv">
<dt>ورودی</dt><dd>شمارهٔ نظام پرستاری <em>یا</em> نام و نام خانوادگی (تطبیق <strong>دقیق</strong> است؛ ورودیِ کد ملی ندارد)</dd>
<dt>منبع</dt><dd>سامانهٔ عمومی <code>estelam.ino1.ir</code> («استعلام پرستاران کشور») — بدون لاگین، بدون کپچا. <strong>API رسمی یا واسطه‌ای ندارد</strong>؛ یا بررسی دستی است یا scrape شکنندهٔ صفحه (با CSRF token).</dd>
<dt>خروجی (فیلدها)</dt><dd>نام، نام خانوادگی، شمارهٔ نظام، <strong>مقطع تحصیلی</strong> (مثلاً «کارشناس»)، <strong>رشتهٔ تحصیلی</strong> (مثلاً «پرستاری»)، <strong>شهر هیئت‌مدیره</strong> (شعبه/استان)، و <strong>عکس پرسنلی</strong>.</dd>
<dt>چه چیزی نمی‌دهد</dt><dd><span class="badge b-bad">مهم</span> وضعیت فعال/منقضی، تاریخ ثبت/عضویت، تخصص و محل خدمت را نمی‌دهد. ⟶ یعنی <strong>«فعال بودن» و «سال سابقه» از این استعلام درنمی‌آید</strong> (برای آن‌ها به گام ۶ و ۷ بروید).</dd>
<dt>منطق تصمیم</dt><dd>اینجاست که <strong>تطبیق متقابل</strong> انجام می‌شود: نامِ روی رکورد نظام پرستاری باید با نامِ ثبت احوال (گام ۳) بخواند، و <strong>عکسِ</strong> این رکورد باید با چهرهٔ سلفی (گام ۴) و عکس ثبت احوال هم‌خوان باشد. این کار، شمارهٔ نظامِ «واقعی ولی دزدیده‌شده» را لو می‌دهد.</dd>
</dl>
</div>
</div>
<!-- STEP 6 -->
<div class="card">
<div class="head"><span class="num">۶</span><span class="ttl">سابقهٔ کار و مدرک تحصیلی</span><span class="badge b-consent">رضایتی</span><span class="badge b-manual">آپلود</span></div>
<div class="body">
<dl class="kv">
<dt>سابقهٔ کار</dt><dd><strong>تأمین اجتماعی</strong> (<code>eservices.tamin.ir</code> / اپ «تأمین من»). با کد ملیِ تنها قابل استخراج <em>نیست</em>؛ نیازمند <strong>لاگین یا OTP رویِ سیم‌کارتِ خود فرد</strong> است. خروجی: روزهای بیمه، دستمزد مبنا، سوابق تلفیقی، و مدت اشتغال نزد هر کارفرما. <strong>گزینهٔ عملی:</strong> یا API استعلام بیمهٔ مبتنی‌بر رضایت (کاربر OTP می‌زند)، یا از پرستار بخواهید «خروجی سابقه/گواهی سابقهٔ کار» را خودش بگیرد و آپلود کند.</dd>
<dt>مدرک تحصیلی</dt><dd>مدرک پرستاری زیر نظر <strong>وزارت بهداشت</strong> است، نه وزارت علوم ⟶ سامانهٔ سجاد آن را تأیید نمی‌کند. منبع درست: <code>eg.behdasht.gov.ir</code> (سامانهٔ دانش‌آموختگان). استعلامِ تأییدیه <strong>سازمان‌محور</strong> است (شرکت شما درخواست رسمی می‌دهد، پاسخ به شما برمی‌گردد) و API عمومی ندارد. <strong>گزینهٔ عملی اولیه:</strong> آپلود دانشنامه/مدرک کارشناسی + بررسی بصری.</dd>
<dt>منطق تصمیم</dt><dd>«سال سابقه» و «کارشناسی پرستاری» را به‌عنوان دادهٔ <em>اظهاری-با-مدرک</em> ثبت کنید و در صورت نیاز با تأییدیهٔ رسمی ارتقا دهید. تاریخِ نبودِ این داده‌ها در APIهای ارزان را به‌عنوان محدودیت بپذیرید.</dd>
</dl>
</div>
</div>
<!-- STEP 7 -->
<div class="card">
<div class="head"><span class="num">۷</span><span class="ttl">پروانهٔ صلاحیت حرفه‌ای + گواهی عدم سوء پیشینه</span><span class="badge b-consent">رضایتی</span></div>
<div class="body">
<dl class="kv">
<dt>پروانهٔ صلاحیت حرفه‌ای</dt><dd>مدرک وزارت بهداشت (سامانه‌های <code>Rn.behdasht.gov.ir</code> و <code>op.salamat.gov.ir</code>) که صدورش <strong>مشروط به گزینش و گواهی عدم سوء پیشینه</strong> است. صدور <strong>self-service</strong> (لاگین خود فرد با کد ملی + OTP) است و API عمومی ندارد. ⟶ معتبر بودنِ این پروانه یعنی «سوء‌پیشینه و گزینش <em>هنگام صدور</em> بررسی شده‌اند».</dd>
<dt>عدم سوء پیشینه</dt><dd>گواهی رسمی که <strong>فقط خودِ فرد</strong> از <code>adliran.ir</code> با رمز ثنا می‌گیرد؛ <strong>هیچ API شخص‌ثالثی برای کشیدن آن وجود ندارد.</strong> ⟶ از پرستار بخواهید گواهی را بگیرد و آپلود کند، و دوره‌ای تمدید کنید.</dd>
<dt>منطق تصمیم</dt><dd>چون این دو سند برای کارِ مراقبت از افراد آسیب‌پذیر حیاتی‌اند، آن‌ها را <strong>الزامی</strong> کنید (آپلود + بازبینی)، حتی اگر خودکار نیستند.</dd>
</dl>
</div>
</div>
<!-- STEP 8 -->
<div class="card">
<div class="head"><span class="num">۸</span><span class="ttl">تطبیق حساب بانکیِ واریز</span><span class="badge b-auto">خودکار</span></div>
<div class="body">
<dl class="kv">
<dt>ورودی</dt><dd>شمارهٔ کارت یا شبا + <code>nationalCode</code> (+ تاریخ تولد)</dd>
<dt>منبع / API</dt><dd><strong>تطبیق شبا/کارت با کد ملی</strong> (Shabanic / U-ID). یا «کارت به شبا»ی Shabanic که <code>IBAN</code>، شماره حساب، <code>depositOwners</code> (نام صاحب حساب) و نام بانک را می‌دهد (~۵٬۰۰۰ تومان).</dd>
<dt>خروجی</dt><dd>وضعیت تطبیق + نام صاحب حساب + نام بانک + وضعیت حساب (فعال/مسدود).</dd>
<dt>منطق تصمیم</dt><dd>اطمینان از اینکه پولِ پرستار به حسابِ <strong>خودِ او</strong> واریز می‌شود (نه واسطه). معمولاً هنگام اولین تسویه اجرا می‌شود، نه لزوماً در ثبت‌نام.</dd>
</dl>
</div>
</div>
<!-- STEP 9 -->
<div class="card">
<div class="head"><span class="num">۹</span><span class="ttl">امتیاز اعتماد و تصمیم نهایی</span><span class="badge b-manual">منطق داخلی</span></div>
<div class="body">
<p>نتایج همهٔ گام‌ها را در یک «کارت اعتماد» جمع کنید و بر اساس آن تأیید/رد/بازبینی انسانی را تصمیم بگیرید (بخش ۷ این سند).</p>
</div>
</div>
<hr>
<h2 id="crosscheck">۵. ماتریس تطبیق متقابل (قلبِ ضدِ تقلب)</h2>
<p>ارزش فلو در تک‌تک استعلام‌ها نیست، بلکه در <strong>هم‌خوانیِ آن‌ها با یکدیگر</strong> است. این جدول نشان می‌دهد کدام فیلد باید با کدام منبع بخواند تا هویت «گره» بخورد:</p>
<div class="tablewrap">
<table>
<thead><tr><th>چه چیزی باید با چه چیزی بخواند</th><th>منبع‌های درگیر</th><th>اگر نخواند یعنی…</th></tr></thead>
<tbody>
<tr><td>موبایل ↔ کد ملی</td><td>شاهکار (گام ۱)</td><td>سیم‌کارت به‌نام شخص دیگری است / جعل شماره</td></tr>
<tr><td>نامِ اظهارشده ↔ نامِ ثبت احوال</td><td>فرم ثبت‌نام ↔ استعلام هویت (گام ۳)</td><td>کد ملیِ متعلق به فرد دیگری وارد شده</td></tr>
<tr><td>چهرهٔ سلفیِ زنده ↔ عکس ثبت احوال</td><td>eKYC (گام ۴)</td><td>فرد، صاحب واقعیِ کد ملی نیست (هویت دزدیده)</td></tr>
<tr><td><strong>نام و عکسِ نظام پرستاری ↔ هویت ثبت احوال + سلفی</strong></td><td>estelam.ino1.ir (گام ۵) ↔ گام‌های ۳ و ۴</td><td><strong>شمارهٔ نظامِ واقعی ولی دزدیده‌شده</strong> — خطرناک‌ترین حالت</td></tr>
<tr><td>رشته/مقطعِ نظام پرستاری ↔ مدرک تحصیلی آپلودی</td><td>گام ۵ ↔ گام ۶</td><td>مدرک جعلی یا ناهماهنگ</td></tr>
<tr><td>نام صاحب حساب ↔ کد ملی</td><td>تطبیق بانکی (گام ۸)</td><td>حساب واریز متعلق به شخص دیگری است</td></tr>
</tbody>
</table>
</div>
<blockquote class="bad"><p><strong>درس کلیدی:</strong> یک شمارهٔ نظام پرستاریِ معتبر به‌تنهایی چیزی را اثبات نمی‌کند، چون می‌تواند دزدیده شده باشد. آنچه اثبات می‌کند، <strong>زنجیرهٔ «کد ملی ← چهرهٔ زنده ← عکس ثبت احوال ← عکس نظام پرستاری ← نامِ یکسان در همه»</strong> است. این تنها سدّ واقعی در برابر سناریوی «پرستار قلابی» است.</p></blockquote>
<hr>
<h2 id="fieldmap">۶. جدول «داده موردنیاز ← منبع / سرویس»</h2>
<div class="tablewrap">
<table>
<thead><tr><th>داده‌ای که می‌خواهید</th><th>منبع / API</th><th>ورودی لازم</th><th>دسترسی</th></tr></thead>
<tbody>
<tr><td>تطبیق موبایل ↔ کد ملی</td><td>شاهکار (Finnotech/U-ID/api.ir/…)</td><td>موبایل + کد ملی</td><td><span class="badge b-auto">خودکار</span></td></tr>
<tr><td>نام، نام خانوادگی، نام پدر، جنسیت</td><td>استعلام هویت ثبت احوال (Shabanic/U-ID)</td><td>کد ملی + تاریخ تولد</td><td><span class="badge b-auto">خودکار</span></td></tr>
<tr><td>شماره/سری/سریال شناسنامه</td><td>استعلام هویت ثبت احوال</td><td>کد ملی + تاریخ تولد</td><td><span class="badge b-auto">خودکار</span></td></tr>
<tr><td>وضعیت حیات (زنده/فوت)</td><td>استعلام هویت ثبت احوال (<code>deathStatus</code>)</td><td>کد ملی + تاریخ تولد</td><td><span class="badge b-auto">خودکار</span></td></tr>
<tr><td>تطبیق چهرهٔ زنده با عکس رسمی</td><td>eKYC ویدیویی (U-ID/api.ir/VIDA)</td><td>ویدیو + کد ملی + سریال کارت + تاریخ تولد + جنسیت</td><td><span class="badge b-consent">رضایتی</span></td></tr>
<tr><td>صحت شمارهٔ نظام + مقطع/رشته/شهر + عکس</td><td>نظام پرستاری <code>estelam.ino1.ir</code></td><td>شماره نظام یا نام (تطبیق دقیق)</td><td><span class="badge b-manual">دستی/Scrape</span></td></tr>
<tr><td>وضعیت فعال/منقضیِ عضویت نظام پرستاری</td><td>پورتال عضویت <code>membership.ino1.ir</code></td><td>لاگین + OTP خود فرد</td><td><span class="badge b-consent">رضایتی</span></td></tr>
<tr><td>سال سابقه / سوابق بیمه</td><td>تأمین اجتماعی <code>eservices.tamin.ir</code></td><td>credential یا OTP خود فرد</td><td><span class="badge b-consent">رضایتی</span></td></tr>
<tr><td>مدرک کارشناسی پرستاری</td><td>وزارت بهداشت <code>eg.behdasht.gov.ir</code> / آپلود</td><td>self-service فرد یا استعلام سازمانی</td><td><span class="badge b-manual">آپلود/دستی</span></td></tr>
<tr><td>غربالگری سوء‌پیشینه (غیرمستقیم)</td><td>پروانهٔ صلاحیت حرفه‌ای + گواهی عدم سوء پیشینه</td><td>self-service فرد / آپلود گواهی</td><td><span class="badge b-consent">رضایتی</span></td></tr>
<tr><td>تطبیق حساب واریز با کد ملی</td><td>تطبیق شبا/کارت با کد ملی (Shabanic/U-ID)</td><td>شبا یا کارت + کد ملی</td><td><span class="badge b-auto">خودکار</span></td></tr>
<tr><td>آدرس رسمی</td><td>استعلام آدرس با کد پستی</td><td>کد پستی (از خود فرد)</td><td><span class="badge b-auto">خودکار</span></td></tr>
<tr><td>کد نظام پزشکی (فقط اگر فرد پزشک باشد)</td><td>نظام پزشکی <code>membersearch.irimc.org</code> / API پادیوم</td><td>کد ملی یا شماره نظام</td><td><span class="badge b-auto">خودکار (B2B سلامت)</span></td></tr>
<tr><td>موبایل از کد ملی / هویت از موبایل (معکوس)</td><td></td><td></td><td><span class="badge b-bad">غیرقابل‌دسترس</span></td></tr>
</tbody>
</table>
</div>
<blockquote><p>دو مسیر که <strong>برای شرکت خصوصی وجود ندارند</strong> و نباید رویشان حساب کنید: (۱) «کد ملی → شمارهٔ موبایل» یا «موبایل → هویت کامل» (فقط با دستور قضایی)، و (۲) «کد ملی → آدرس» (آدرس فقط با خودِ کد پستی به‌دست می‌آید).</p></blockquote>
<hr>
<h2 id="scoring">۷. جمع‌بندیِ تصمیم و امتیاز اعتماد</h2>
<p>پیشنهاد می‌شود نتیجهٔ هر گام را به یک «کارت اعتماد» تبدیل کنید و سیاست تأیید را روی آن بنا کنید:</p>
<div class="tablewrap">
<table>
<thead><tr><th>سطح</th><th>شرط</th><th>نتیجه</th></tr></thead>
<tbody>
<tr><td><strong>هویت پایه ✅</strong></td><td>شاهکار + OTP + استعلام ثبت احوال (نام می‌خواند، حیات تأیید) موفق</td><td>اجازهٔ تکمیل پروفایل؛ هنوز قابل‌رزرو نیست</td></tr>
<tr><td><strong>هویت قوی ✅✅</strong></td><td>+ احراز ویدیوییِ <code>ACCEPTED</code> (تطبیق چهره)</td><td>هویت فرد قطعی است</td></tr>
<tr><td><strong>صلاحیت حرفه‌ای ✅✅✅</strong></td><td>+ تطبیق نام/عکسِ نظام پرستاری با هویت + پروانهٔ صلاحیت + عدم سوء پیشینه</td><td><strong>قابل‌رزرو</strong> برای خانواده‌ها (نشانِ «احرازشده»)</td></tr>
<tr><td><strong>بازبینی دستی ⚠️</strong></td><td>هر مغایرتی (نام نمی‌خواند، عکس مردد، شماره نظام یافت نشد)</td><td>صف بازبینی انسانی پیش از فعال‌سازی</td></tr>
<tr><td><strong>رد ⛔</strong></td><td>شاهکار false، حیات=فوت، چهره REJECTED، یا سوء‌پیشینهٔ مشکل‌دار</td><td>عدم پذیرش</td></tr>
</tbody>
</table>
</div>
<p><strong>نکته‌های اجرایی:</strong> نتایج استعلام‌ها را با مهر زمانی ذخیره کنید (هم برای حسابرسی، هم دفاع حقوقی)؛ مدارک حساس (مجوز، سوء‌پیشینه) را <strong>دوره‌ای بازبینی/تمدید</strong> کنید نه فقط یک‌بار در ثبت‌نام؛ و هر استعلام را فقط با <strong>رضایت ثبت‌شدهٔ کاربر</strong> اجرا کنید.</p>
<hr>
<h2 id="legal">۸. نکات حقوقی، حریم خصوصی و دسترسی</h2>
<ul>
<li><strong>پیش‌نیاز فنی:</strong> برای همهٔ APIها باید شرکت ثبت‌شده، احراز کسب‌وکار و <code>client credential</code> از ارائه‌دهنده داشته باشید. APIهای هویتی به اشخاص حقیقی داده نمی‌شوند.</li>
<li><strong>رضایت کاربر:</strong> طبق الزامات رگولاتوری، پیش از استعلام و نگه‌داری دادهٔ هویتی باید رضایت صریح بگیرید (متن رضایت‌نامه در فرم ثبت‌نام + لاگ OTP).</li>
<li><strong>کمینه‌سازی داده:</strong> فقط آنچه را که برای تصمیم لازم است ذخیره کنید؛ تصاویر سلفی و مدارک حساس را رمزنگاری و با دسترسی محدود نگه دارید.</li>
<li><strong>راهبردِ ارائه‌دهنده:</strong> ترجیحاً از یک ارائه‌دهندهٔ KYC جامع (مثل Finnotech یا U-ID) استفاده کنید تا اتصال به سرویس‌های دولتیِ گِی‌ت‌شده (شاهکار، ثبت احوال) را او مدیریت کند و بار انطباق روی دوش او باشد.</li>
<li><strong>محدودیت‌های واقعی را بپذیرید:</strong> نظام پرستاری API ندارد (دستی/Scrape)؛ سابقه و مدرک و سوء‌پیشینه رضایتی/آپلودی‌اند؛ مسیرهای معکوس موبایل/آدرس بسته‌اند. فلو را حول این واقعیت‌ها طراحی کنید، نه برخلافشان.</li>
</ul>
<blockquote class="warn"><p><strong>موارد با اطمینان پایین‌تر که پیش از کدنویسی باید با خودِ ارائه‌دهنده نهایی شوند:</strong> نام دقیق فیلدهای خروجی (مثل <code>idSerie</code>/<code>idSerial</code> و enumهای eKYC)؛ قیمت‌ها؛ امکان استعلامِ پروانهٔ صلاحیت حرفه‌ای توسط شخص ثالث؛ پوششِ مدارک وزارت بهداشت توسط APIهای reseller؛ و جزئیات API نظام پزشکیِ پادیوم. این‌ها از مستندات/منابع ثانویه استخراج شده‌اند و ممکن است در نسخهٔ قراردادی کمی فرق کنند.</p></blockquote>
<hr>
<h2 id="sources">۹. منابع</h2>
<p class="sourcing">
<strong>هویت و KYC:</strong>
<a href="https://finnotech.ir/sub-service/%D8%AA%D8%B7%D8%A8%DB%8C%D9%82%20%DA%A9%D8%AF%D9%85%D9%84%DB%8C%20%D9%88%20%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84">Finnotech — شاهکار</a> ·
<a href="https://finnotech.ir/sub-service/%D8%B5%D8%AD%D8%AA%E2%80%8C%20%D8%B3%D9%86%D8%AC%DB%8C%20%DA%A9%D8%AF%20%D9%85%D9%84%DB%8C">Finnotech — صحت‌سنجی کد ملی</a> ·
<a href="https://u-id.net/api/">U-ID — API هویت</a> ·
<a href="https://u-id.net/api-shahkar/">U-ID — شاهکار</a> ·
<a href="https://u-id.net/api-ekyc-docs/">U-ID — eKYC docs</a> ·
<a href="https://shabanic.ir/nid_api_doc">Shabanic — استعلام ثبت احوال</a> ·
<a href="https://shabanic.ir/card_to_shaba_api_doc">Shabanic — کارت به شبا</a> ·
<a href="https://shabanic.ir/p_iban_owner_verification">Shabanic — تطبیق شبا با کد ملی</a> ·
<a href="https://www.api.ir/web-service/%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88%DB%8C%D8%AA-%D8%B2%D9%86%D8%AF%D9%87%E2%80%8C%D8%B3%D9%86%D8%AC%DB%8C-%D9%88%DB%8C%D8%AF%DB%8C%D9%88%DB%8C%DB%8C/">api.ir — زنده‌سنجی</a> ·
<a href="https://vidaverify.ir/">VIDA</a> ·
<a href="https://www.melipayamak.com/blog/posts/how-to-request-mobile-number-with-national-code/">ملی‌پیامک — استعلام موبایل با کد ملی</a>
<br><br>
<strong>صلاحیت حرفه‌ای و سابقه:</strong>
<a href="https://estelam.ino1.ir/">نظام پرستاری — استعلام</a> ·
<a href="https://membership.ino1.ir/">نظام پرستاری — عضویت</a> ·
<a href="https://www.heyvagroup.com/shownews/11343/">heyvagroup — نظام پرستاری</a> ·
<a href="https://op.salamat.gov.ir/">صلاحیت حرفه‌ای — اپراتور سلامت</a> ·
<a href="https://www.heyvagroup.com/shownews/12145/">heyvagroup — صلاحیت حرفه‌ای</a> ·
<a href="https://membersearch.irimc.org/">نظام پزشکی — جستجو</a> ·
<a href="https://blog.podium.ir/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-api%D9%87%D8%A7%DB%8C-%D8%B3%D8%A7%D8%B2%D9%85%D8%A7%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D9%BE%D8%B2%D8%B4%DA%A9%DB%8C-%DA%A9%D8%B4%D9%88%D8%B1/">Podium — API نظام پزشکی</a> ·
<a href="https://eservices.tamin.ir">تأمین اجتماعی</a> ·
<a href="https://eg.behdasht.gov.ir/">وزارت بهداشت — دانش‌آموختگان</a> ·
<a href="https://apieco.ir/api/ghabzino-social-security-records/">Ghabzino — سوابق بیمه</a>
</p>
<p class="meta"><em>این سند بر پایهٔ استعلام مستقیم مستندات ارائه‌دهندگان (Finnotech، U-ID، Shabanic، api.ir) و سامانه‌های رسمی (estelam.ino1.ir، membersearch.irimc.org، behdasht.gov.ir، tamin.ir) تهیه شده است. پیش از پیاده‌سازی، فیلدها و قیمت‌ها را با واحد فروش ارائه‌دهنده‌ای که با او قرارداد می‌بندید نهایی کنید.</em></p>
</article>
</div>
</body>
</html>