clean and refine product docs structure

This commit is contained in:
hamid
2026-06-24 01:32:46 +03:30
parent be07c703ec
commit 1df3cd9f64
113 changed files with 6078 additions and 4973 deletions
+420
View File
@@ -0,0 +1,420 @@
<!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>