# راهنمای فرانت‌اند برای ارسال اطلاعات استعلام این سند قرارداد نهایی فرانت‌اند برای مرحله استعلام است. از این به بعد اطلاعات اشخاص و خودرو باید با ساختار نقش‌محور زیر ارسال شود. فیلدهای تخت قدیمی مانند `nationalCodeOfDriver` و `nationalCodeOfInsurer` دیگر ورودی معتبر نیستند. ## ساختار کلی درخواست برای پرونده `THIRD_PARTY`: ```json { "driver": { "nationalCode": "0012345678", "birthday": "1370/01/01", "hasDrivingLicense": true, "licenseNumber": "123456789", "licenseType": "1" }, "vehicleOwner": { "sameAs": "DRIVER" }, "thirdPartyPolicyholder": { "sameAs": "VEHICLE_OWNER" }, "vehicle": { "registrationState": "CURRENT", "currentPlate": { "leftDigits": "44", "centerAlphabet": "ب", "centerDigits": "111", "ir": "22" }, "isNewCar": false }, "sheba": "IR123456789012345678901234" } ``` برای پرونده `CAR_BODY`، نقش بیمه‌گذار بدنه هم الزامی است: ```json { "driver": { "nationalCode": "0012345678", "birthday": "1370/01/01", "hasDrivingLicense": false }, "vehicleOwner": { "sameAs": "DRIVER" }, "thirdPartyPolicyholder": { "nationalCode": "0023456789", "birthday": "1360/02/02" }, "carBodyPolicyholder": { "nationalCode": "0034567890", "birthday": "1350/03/03" }, "vehicle": { "currentPlate": { "leftDigits": "44", "centerAlphabet": "ب", "centerDigits": "111", "ir": "22" }, "isNewCar": false }, "sheba": "IR123456789012345678901234" } ``` `sheba` فقط در routeهایی که قبلاً اطلاعات بانکی را در مرحله استعلام دریافت می‌کردند ارسال می‌شود؛ در V6 مرکز تماس، شماره شبا در این body نیست و بعداً توسط کاربر دریافت می‌شود. ## هر استعلام با اطلاعات کدام نقش انجام می‌شود؟ فرانت‌اند فقط اشخاص را با ساختار نقش‌محور ارسال می‌کند؛ انتخاب کد ملی مناسب برای هر سرویس در بک‌اند انجام می‌شود: | استعلام | کد ملی مورد استفاده | شناسه خودرو/بانکی | | --- | --- | --- | | بیمه شخص ثالث با پلاک یا VIN | `thirdPartyPolicyholder.nationalCode` | پلاک یا `vehicle.vin` | | بیمه بدنه با پلاک یا VIN | `carBodyPolicyholder.nationalCode` | پلاک یا `vehicle.vin` | | تطبیق شبا | `vehicleOwner.nationalCode` | `sheba` | | گواهینامه | `driver.nationalCode` | `driver.licenseNumber` | بنابراین کد ملی راننده نباید به‌جای بیمه‌گذار یا مالک ارسال یا تکرار شود. اگر چند نقش متعلق به یک نفر است، `sameAs` ارتباط را مشخص می‌کند و بک‌اند همان شخص را برای استعلام مربوط به هر نقش انتخاب می‌کند. در مرحله بانکی بعدی جریان V6، برای پرونده‌های جدید فقط `sheba` لازم است. بک‌اند کد ملی مالک خودرو را از `participants` و `participantRoles` ذخیره‌شده در پرونده تقصیر می‌خواند. فیلدهای قدیمی `nationalCodeOfInsurer` یا `nationalCodeOfOwner` فقط برای پرونده‌های تاریخی فاقد اطلاعات نقش‌محور fallback هستند؛ اگر همراه پرونده جدید ارسال شوند باید با مالک ذخیره‌شده یکسان باشند. پنل‌های کارشناسی اطلاعات کامل اشخاص را در `parties[].participants` و نگاشت نقش‌ها را در `parties[].participantRoles` دریافت می‌کنند. اطلاعات راننده حتی اگر در استعلام بیمه یا شبا استفاده نشود در همین ساختار ذخیره و نمایش داده می‌شود. ## نقش‌ها و فیلدهای هر شخص هر نقش باید یکی از این دو حالت را داشته باشد، نه هر دو را: 1. اطلاعات یک شخص جدید؛ یا 2. ارجاع با `sameAs` به شخصی که قبلاً در همین درخواست معرفی شده است. | فیلد | کاربرد | وضعیت | | --- | --- | --- | | `nationalCode` | کد ملی شخص | برای شخص جدید الزامی | | `birthday` | تاریخ تولد جلالی | برای شخص جدید الزامی | | `fullName` | نام نمایشی شخص | اختیاری | | `sameAs` | اتصال این نقش به نقش دیگر | به‌جای اطلاعات شخص جدید | | `hasDrivingLicense` | داشتن گواهینامه راننده | برای نقش راننده الزامی | | `licenseNumber` | شماره گواهینامه | اگر `hasDrivingLicense=true` الزامی | | `licenseType` | نوع گواهینامه | اگر `hasDrivingLicense=true` الزامی | مقادیر مجاز `sameAs` عبارت‌اند از: - `DRIVER` - `VEHICLE_OWNER` - `THIRD_PARTY_POLICYHOLDER` - `CAR_BODY_POLICYHOLDER` برای `sameAs` هیچ‌کدام از `nationalCode`، `birthday`، `fullName`، اطلاعات گواهینامه یا `phoneNumber` را در همان آبجکت نفرستید. شماره تلفن بخشی از هویت استعلام نیست و در این DTOها وجود ندارد. احراز هویت پیامکی و شماره تماس طرفین از این مرحله جداست. ## اطلاعات خودرو و پلاک | فیلد | کاربرد | وضعیت | | --- | --- | --- | | `vehicle.registrationState` | وضعیت ثبت رسمی خودرو | `CURRENT` یا `RECENTLY_TRANSFERRED`؛ پیش‌فرض `CURRENT` | | `vehicle.currentPlate` | پلاک رسمی فعلی و شناسه اصلی خودرو | الزامی | | `vehicle.previousPlate` | پلاک قبلی در انتقال اخیر | فقط در `RECENTLY_TRANSFERRED` | | `vehicle.previousPolicyholderNationalCode` | کد ملی بیمه‌گذار مربوط به پلاک قبلی | فقط در `RECENTLY_TRANSFERRED` و الزامی | | `vehicle.vin` | شماره شاسی/VIN | در انتقال اخیر الزامی؛ در صورت ارسال دقیقاً ۱۷ کاراکتر | | `vehicle.isNewCar` | نو بودن خودرو | اختیاری | اجزای پلاک: ```json { "leftDigits": "44", "centerAlphabet": "ب", "centerDigits": "111", "ir": "22" } ``` `leftDigits`، `centerDigits` و `ir` را می‌توان به‌صورت string یا number فرستاد؛ ارسال string پیشنهاد می‌شود تا صفرهای ابتدایی از بین نروند. `centerAlphabet` باید حرف فارسی پلاک باشد. ### انتقال اخیر ```json { "vehicle": { "registrationState": "RECENTLY_TRANSFERRED", "currentPlate": { "leftDigits": "44", "centerAlphabet": "ب", "centerDigits": "111", "ir": "22" }, "previousPlate": { "leftDigits": "55", "centerAlphabet": "ج", "centerDigits": "222", "ir": "33" }, "previousPolicyholderNationalCode": "0098765432", "vin": "NAAM01E15HK123456" } } ``` سیستم ابتدا پلاک فعلی را با کد ملی بیمه‌گذار فعلیِ مرتبط با نوع بیمه استعلام می‌کند. اگر نتیجه ناموجود، منقضی یا فاقد بیمه‌نامه مرتبط باشد، پلاک قبلی را با `previousPolicyholderNationalCode` امتحان می‌کند. نتیجه پلاک قبلی فقط در صورت تطبیق VIN پذیرفته می‌شود؛ پلاک قبلی هرگز جایگزین پلاک فعلی نمی‌شود. حتی در route مربوط به VIN، آبجکت `vehicle` از قرارداد مشترک استفاده می‌کند و `currentPlate` در قرارداد فعلی الزامی است. مقدار VIN در `vehicle.vin` قرار می‌گیرد، نه در فیلد سطح بالای `vin`. ## ترتیب پیشنهادی نمایش فرم 1. پلاک فعلی و وضعیت انتقال خودرو را بگیرید. 2. اگر انتقال اخیر بود، پلاک قبلی، کد ملی بیمه‌گذار پلاک قبلی و VIN را بگیرید. 3. اطلاعات راننده و وضعیت گواهینامه را بگیرید. 4. بپرسید مالک خودرو همان راننده است یا شخص دیگری؛ در حالت یکسان از `sameAs` استفاده کنید. 5. بیمه‌گذار شخص ثالث را از بین راننده، مالک یا شخص دیگر انتخاب کنید. 6. در `CAR_BODY` همین کار را برای بیمه‌گذار بدنه انجام دهید. 7. خلاصه اطلاعات را به کاربر نشان دهید و سپس درخواست استعلام را ارسال کنید. ## مسیرهای اصلی بدنه درخواست در همه این مسیرها همین ساختار را دارد: | جریان | مسیر پلاک | مسیر VIN | | --- | --- | --- | | کاربر V2 | `/v2/blame-request-management/initial-form/:requestId` | `/v2/blame-request-management/initial-form-vin/:requestId` | | کارشناس/پرونده‌ساز V3 تا V5 | `.../run-inquiries/:requestId` | `.../run-inquiries-vin/:requestId` | | مرکز تماس V6 | `/v6/call-center-blame/run-inquiry/:requestId` | `/v6/call-center-blame/run-inquiry-vin/:requestId` | در جریان‌های V3 تا V5، فراخوان اول برای طرف مقصر (`FIRST`) و فراخوان دوم، فقط در `THIRD_PARTY`، برای طرف زیان‌دیده (`SECOND`) است. اطلاعات بیمه‌گذار برای هر دو طرف الزامی است. ## تفاوت اطلاعات مقصر و زیان‌دیده ساختار نقش‌محور اشخاص و خودرو برای هر دو طرف یکسان است، اما ترتیب و قواعد کسب‌وکار آن‌ها تفاوت دارد: | پرونده و طرف | نقش‌ها و رفتار | | --- | --- | | `THIRD_PARTY / FIRST` (مقصر) | راننده، مالک و بیمه‌گذار شخص ثالثِ خودروی مقصر ارسال می‌شوند. شبا در این فراخوان لازم نیست. بیمه‌نامه مقصر باید متعلق به شرکت بیمه همین سامانه باشد. | | `THIRD_PARTY / SECOND` (زیان‌دیده) | راننده، مالک و بیمه‌گذار شخص ثالثِ خودروی زیان‌دیده ارسال می‌شوند. این مرحله فقط بعد از امضای مقصر و احراز OTP زیان‌دیده اجرا می‌شود. `sheba` الزامی است و با کد ملی `vehicleOwner` اعتبارسنجی می‌شود. بیمه‌گذار زیان‌دیده نیز همیشه باید مشخص باشد. | | `CAR_BODY / FIRST` (بیمه‌گذار/زیان‌دیده بدنه) | هر چهار نقش راننده، مالک، بیمه‌گذار شخص ثالث و بیمه‌گذار بدنه ارسال می‌شوند. `sheba` در همین فراخوان الزامی است و با کد ملی `vehicleOwner` اعتبارسنجی می‌شود. استعلام بدنه با کد ملی `carBodyPolicyholder` انجام می‌شود. | در V2 و V6 که شبا در مرحله جداگانه از کاربر دریافت می‌شود، شبا داخل درخواست استعلام مقصر ارسال نمی‌شود؛ بک‌اند هنگام مرحله بانکی آن را با کد ملی مالک ذخیره‌شده تطبیق می‌دهد. ## فیلدهایی که نباید ارسال شوند این فیلدها دیگر بخشی از قرارداد ورودی نیستند و ارسال آن‌ها باعث خطای اعتبارسنجی می‌شود: ```text nationalCodeOfDriver driverBirthday driverLicense licenseType // در سطح بالا؛ مقدار صحیح داخل driver است nationalCodeOfInsurer insurerBirthday insurerLicense driverIsInsurer userNoCertificate plate // در سطح بالا؛ مقدار صحیح داخل vehicle.currentPlate است plateId vin // در سطح بالا؛ مقدار صحیح داخل vehicle.vin است isNewCar // در سطح بالا؛ مقدار صحیح داخل vehicle.isNewCar است phoneNumber // در participantها unknown // حذف شده؛ بیمه‌گذار همیشه باید مشخص باشد ``` ## خطاهای رایج فرانت‌اند - ارسال `vehicleOwner` به‌صورت خالی؛ باید شخص جدید یا `sameAs` باشد. - استفاده از `sameAs` همراه با `nationalCode` یا `birthday`. - ارسال `carBodyPolicyholder` برای `THIRD_PARTY`. - ارسال `unknown` برای هر نقش؛ این فیلد دیگر پذیرفته نمی‌شود. - فرستادن `previousPlate` بدون `registrationState=RECENTLY_TRANSFERRED`. - فرستادن `RECENTLY_TRANSFERRED` بدون `previousPlate`، `previousPolicyholderNationalCode` یا `vin`. - فرستادن `previousPolicyholderNationalCode` برای خودروی دارای وضعیت `CURRENT`. - قرار دادن VIN یا پلاک در سطح بالای body. - ارسال شماره تلفن در آبجکت شخص. - تکرار کد ملی راننده یا بیمه‌گذار در مرحله شبا؛ تطبیق شبا همیشه با مالک خودرو انجام می‌شود. مستند مدل دامنه و جزئیات تصمیم معماری در [inquiry-participants-proposal.fa.md](./inquiry-participants-proposal.fa.md) قرار دارد.