From 1e6f1ed7593c495cca6c4fcbd443e24bb333a44e Mon Sep 17 00:00:00 2001 From: SepehrYahyaee <7heycallmegray@gmail.com> Date: Mon, 28 Sep 2026 16:51:12 +0330 Subject: [PATCH] Changed ESG inquiries main endpoint --- docs/external-api-curls.md | 4 ++-- docs/external-integrations-reference.fa.html | 10 ++++---- docs/external-integrations-reference.html | 10 ++++---- .../dto/client-external-inquiries.dto.ts | 2 +- src/sand-hub/sand-hub.service.spec.ts | 24 +++++++++++++++++++ src/sand-hub/sand-hub.service.ts | 2 +- 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/docs/external-api-curls.md b/docs/external-api-curls.md index dae4b88..6c79924 100644 --- a/docs/external-api-curls.md +++ b/docs/external-api-curls.md @@ -417,10 +417,10 @@ curl -X POST "$ESG_URL/auth/login" \ ESG_ACCESS_TOKEN="" ``` -### Policy By Plate +### Car By Plate (canonical Parsian third-party plate inquiry) ```sh -curl -X POST "$ESG_URL/inquiry/policyByPlate" \ +curl -X POST "$ESG_URL/inquiry/carByPlate" \ -H "Authorization: Bearer $ESG_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ diff --git a/docs/external-integrations-reference.fa.html b/docs/external-integrations-reference.fa.html index 9b3fa8c..809d19e 100644 --- a/docs/external-integrations-reference.fa.html +++ b/docs/external-integrations-reference.fa.html @@ -157,11 +157,11 @@

انتخاب ارائه‌دهنده

- برای هر پرس‌وجوی مبتنی بر پلاک: + برای هر پرس‌وجوی مبتنی بر پلاک در مسیر THIRD_PARTY:
  • درخواست همیشه با پلاک فعلی ارسال‌شده و بیمه‌گذار نهایی همان نوع بیمه انجام می‌شود. متادیتای انتقال اخیر هیچ استعلامی برای پلاک یا بیمه‌گذار قبلی ایجاد نمی‌کند.
  • ۱. بررسی داده‌های آفلاین (MongoDB) — اگر داده مطابق یافت شد، آن را برگردانده و تمام HTTP را رد کن.
  • -
  • ۲. اگر CLIENT_ID=8 (تنانت پارسیان/ESG) → برای پلاک به ESG /inquiry/policyByPlate و برای VIN/شاسی به مسیر دوعاملی /inquiry/carByChassis مسیریابی می‌شود.
  • +
  • ۲. اگر CLIENT_ID=8 (تنانت پارسیان/ESG) → پلاک THIRD_PARTY به ESG /inquiry/carByPlate و VIN/شاسی THIRD_PARTY به مسیر دوعاملی /inquiry/carByChassis می‌رود. CAR_BODY پارسیان از مسیر lookup پردازش‌شده Fanavaran استفاده می‌کند و از مسیر پلاک شخص ثالث استفاده نمی‌کند.
  • ۳. در غیر این صورت → مسیریابی به پرس‌وجوی تجارت /block-inquiry-tejarat (THIRD_PARTY) یا /block-inquiry-tejarat/badane (CAR_BODY).
  • ۴. اگر system_settings.externalApis.sandHubUseLiveApi = false (پیش‌فرض) → پاسخ mock برگردانده شود به جای انجام فراخوانی‌های HTTP.
@@ -330,7 +330,7 @@ POST/block-inquiry-tejarat/badaneپرس‌وجوی پلاک CAR_BODY. بدنه: part1–part4 (عددی) + nationalCode. همیشه زنده می‌شود (mock برای مسیر badane وجود ندارد).

- وقتی sandHubUseLiveApi=false، مسیر THIRD_PARTY یک پاسخ mock بدون HTTP برمی‌گرداند. مسیر CAR_BODY همیشه API زنده را صرف‌نظر از این پرچم فراخوانی می‌کند. + وقتی sandHubUseLiveApi=false، مسیر THIRD_PARTY یک پاسخ mock بدون HTTP برمی‌گرداند. CAR_BODY سوییچ live/mock جداگانه دارد و از seed آفلاین THIRD_PARTY استفاده نمی‌کند.

@@ -358,7 +358,7 @@

اندپوینت‌ها

- + @@ -494,7 +494,7 @@ - +
متدمسیرتوضیح
POST/inquiry/policyByPlateجستجوی بیمه‌نامه مبتنی بر پلاک (THIRD_PARTY). بدنه: nationalCode، plk1–plk4. پاسخ قبل از ذخیره به فرمت قدیمی تجارت نگاشت می‌شود.
POST/inquiry/carByPlateجستجوی بیمه‌نامه مبتنی بر پلاک (THIRD_PARTY). بدنه: nationalCode، plk1, plk2, plk3, plksrl. پاسخ قبل از ذخیره به فرمت قدیمی تجارت نگاشت می‌شود.
POST/inquiry/carByChassisجایگزین دوعاملی VIN/شاسی برای استعلام پلاک. توسط اندپوینت‌های run-inquiries-vin فراخوانی می‌شود. بدنه: nationalCode، chassisNo. مسیر تک‌عاملی policyByChassis استفاده نمی‌شود، چون فیلد nationalCode را نمی‌پذیرد.
POST/inquiry/personبررسی هویت شخصی. بدنه: nationalCode، birthDate (جلالی، نه میلادی).
POST/inquiry/shebaاعتبارسنجی شبا / حساب بانکی.
مجموعه MongoDB offline-inquiries. اسناد شامل clientKey، فیلدهای نرمال‌شده پلاک، nationalCode و پاسخ از پیش ساخته‌شده raw + mapped برای برگرداندن هستند.ذخیره‌سازی
system_settings.offlineInquiry.enabled — پیش‌فرض true. تغییر از طریق PATCH /super-admin/system-settings/offline-inquiry.سوئیچ اصلی
پلاک نرمال‌شده (فقط ارقام، عربی→فارسی) + کد ملی + کلید مشتری فناوران باید همه مطابقت داشته باشند. اگر پیدا شد، بلافاصله برگردانده می‌شود؛ هیچ فراخوانی HTTP انجام نمی‌شود.ترتیب جستجو
فقط برای پرس‌وجوی block مبتنی بر پلاک (THIRD_PARTY) اعمال می‌شود. پرس‌وجوی CAR_BODY (/badane) همیشه API زنده را می‌زند.محدوده
فقط برای پرس‌وجوی block مبتنی بر پلاک (THIRD_PARTY) اعمال می‌شود. CAR_BODY مسیر جداگانه Fanavaran/Tejarat دارد و از seed آفلاین THIRD_PARTY استفاده نمی‌کند.محدوده
system_settings.externalApis.sandHubUseLiveApi — وقتی false (پیش‌فرض)، حتی اگر هیچ داده آفلاینی مطابقت نداشته باشد، یک پاسخ mock داخلی برگردانده می‌شود به جای فراخوانی تجارت/ESG.پرچم API زنده
diff --git a/docs/external-integrations-reference.html b/docs/external-integrations-reference.html index d289396..c43b632 100644 --- a/docs/external-integrations-reference.html +++ b/docs/external-integrations-reference.html @@ -152,11 +152,11 @@

Provider selection

- For every plate-based block inquiry: + For every THIRD_PARTY plate-based block inquiry:
  • The request always uses the submitted current plate and the resolved policyholder for that policy type. Recent-transfer metadata never triggers a previous-plate or previous-policyholder lookup.
  • 1. Check offline-inquiry seeds (MongoDB) — if a matching seed exists, return it and skip all HTTP.
  • -
  • 2. If CLIENT_ID=8 (Parsian/ESG tenant) → route to ESG /inquiry/policyByPlate for plates or the two-factor /inquiry/carByChassis for VIN/chassis inquiries.
  • +
  • 2. If CLIENT_ID=8 (Parsian/ESG tenant) → route THIRD_PARTY plates to ESG /inquiry/carByPlate; THIRD_PARTY VIN requests use the two-factor /inquiry/carByChassis. Parsian CAR_BODY uses its processed Fanavaran lookup path instead of the third-party plate route.
  • 3. Otherwise → route to Tejarat inquiry /block-inquiry-tejarat (THIRD_PARTY) or /block-inquiry-tejarat/badane (CAR_BODY).
  • 4. If system_settings.externalApis.sandHubUseLiveApi = false (default) → return mock response instead of making HTTP calls.
@@ -327,7 +327,7 @@ POST/block-inquiry-tejarat/badaneCAR_BODY plate inquiry. Body: part1–part4 (numeric) + nationalCode. Always goes live (no mock for badane path).

- When sandHubUseLiveApi=false, the THIRD_PARTY path returns a mock response without HTTP. The CAR_BODY path always calls the live API regardless of this flag. + When sandHubUseLiveApi=false, the THIRD_PARTY path returns a mock response without HTTP. CAR_BODY has its own live/mock switch and does not use the offline THIRD_PARTY seed path.

@@ -355,7 +355,7 @@

Endpoints

- + @@ -491,7 +491,7 @@ - +
MethodPathWhat it does
POST/inquiry/policyByPlatePlate-based policy lookup (THIRD_PARTY). Body: nationalCode, plk1–plk4. Response is mapped to the old Tejarat format before being stored.
POST/inquiry/carByPlatePlate-based policy lookup (THIRD_PARTY). Body: nationalCode, plk1, plk2, plk3, plksrl. Response is mapped to the old Tejarat format before being stored.
POST/inquiry/carByChassisTwo-factor VIN/chassis alternative to the plate inquiry. Called by run-inquiries-vin endpoints. Body: nationalCode, chassisNo. The one-factor policyByChassis route is not used because it rejects nationalCode.
POST/inquiry/personPersonal identity check. Body: nationalCode, birthDate (Jalali, NOT Gregorian).
POST/inquiry/shebaSheba / bank account validation.
StorageMongoDB collection offline-inquiries. Documents contain clientKey, normalised plate fields, nationalCode, and the pre-built raw + mapped response to return.
Master switchsystem_settings.offlineInquiry.enabled — defaults to true. Toggle via PATCH /super-admin/system-settings/offline-inquiry.
Lookup orderNormalised plate (digits-only, Arabic→Persian) + national code + Fanavaran client key must all match. If found, returned immediately; no HTTP call is made.
ScopeOnly applies to plate-based block-inquiry (THIRD_PARTY). CAR_BODY inquiry (/badane) always hits the live API.
ScopeOnly applies to plate-based block-inquiry (THIRD_PARTY). CAR_BODY uses its separate Fanavaran/Tejarat path and is not served by these offline THIRD_PARTY seeds.
Live API flagsystem_settings.externalApis.sandHubUseLiveApi — when false (default), even if no offline seed matches, a built-in mock response is returned rather than calling Tejarat/ESG.
diff --git a/src/client/dto/client-external-inquiries.dto.ts b/src/client/dto/client-external-inquiries.dto.ts index 1c7a50c..c7b0b47 100644 --- a/src/client/dto/client-external-inquiries.dto.ts +++ b/src/client/dto/client-external-inquiries.dto.ts @@ -9,7 +9,7 @@ import { Type } from "class-transformer"; export class ExternalInquiryFlagsDto implements ExternalInquiryFlags { @ApiProperty({ - description: "Third-party plate / policy block inquiry (Tejarat or ESG policyByPlate).", + description: "Third-party plate / policy block inquiry (Tejarat or ESG carByPlate).", example: false, }) @IsBoolean() diff --git a/src/sand-hub/sand-hub.service.spec.ts b/src/sand-hub/sand-hub.service.spec.ts index 2dd745a..ccaf633 100644 --- a/src/sand-hub/sand-hub.service.spec.ts +++ b/src/sand-hub/sand-hub.service.spec.ts @@ -155,6 +155,30 @@ describe("SandHubService inquiry mocks", () => { expect(result.mapped.PrntPlcyCmpDocNo).toBe("REAL-ESG-POLICY"); }); + it("uses ESG carByPlate for live Parsian third-party plate inquiries", async () => { + process.env.CLIENT_ID = "8"; + externalInquirySettings.isInquiryLive.mockResolvedValue(true); + const esg = jest.spyOn(service as any, "makeEsgRequest").mockResolvedValue({ + success: true, + data: { PrntCmpDocNo: "ESG-PLATE-POLICY" }, + }); + + await service.getTejaratBlockInquiry(userDetail); + + expect(esg).toHaveBeenCalledWith( + expect.stringMatching(/\/inquiry\/carByPlate$/), + expect.objectContaining({ + nationalCode: "1234567890", + plk1: "16", + plk2: "12", + plk3: "498", + plksrl: "60", + }), + "thirdPartyPlate", + undefined, + ); + }); + it("preserves ESG messageFa for a plate inquiry", async () => { process.env.CLIENT_ID = "8"; externalInquirySettings.isInquiryLive.mockResolvedValue(true); diff --git a/src/sand-hub/sand-hub.service.ts b/src/sand-hub/sand-hub.service.ts index 1d7c5c6..1891fcb 100644 --- a/src/sand-hub/sand-hub.service.ts +++ b/src/sand-hub/sand-hub.service.ts @@ -916,7 +916,7 @@ export class SandHubService { plksrl: String(userDetail.plate.ir), }; - const requestUrl = `${baseUrl}/inquiry/policyByPlate`; + const requestUrl = `${baseUrl}/inquiry/carByPlate`; const raw = live ? await this.makeEsgRequest( requestUrl,