From 807121580364e07641738d9b66b90b66b697ac37 Mon Sep 17 00:00:00 2001 From: SepehrYahyaee <7heycallmegray@gmail.com> Date: Sat, 19 Sep 2026 16:06:04 +0330 Subject: [PATCH] fix inquiry integration and insurer case details --- docs/external-api-curls.md | 17 +++ docs/external-integrations-reference.fa.html | 8 +- docs/external-integrations-reference.html | 8 +- docs/fanavaran/01-write-apis.md | 2 +- docs/fanavaran/05-claim-flow.md | 4 +- docs/fanavaran/06-yara-integration.md | 4 +- docs/fanavaran/09-error-handling.md | 2 +- .../claim-request-management.module.ts | 2 - .../claim-request-management.service.ts | 130 +----------------- .../entites/schema/claim-cases.schema.ts | 2 +- .../dto/client-external-inquiries.dto.ts | 2 +- .../expert-insurer.file-summary.spec.ts | 22 +++ src/expert-insurer/expert-insurer.service.ts | 2 + .../call-center-blame-v6.controller.ts | 2 +- ...st-management.policyholder-inquiry.spec.ts | 65 ++++++++- .../request-management.service.ts | 20 +-- src/sand-hub/sand-hub.service.spec.ts | 8 +- src/sand-hub/sand-hub.service.ts | 8 +- 18 files changed, 141 insertions(+), 167 deletions(-) diff --git a/docs/external-api-curls.md b/docs/external-api-curls.md index 7141ed7..1c8f0a6 100644 --- a/docs/external-api-curls.md +++ b/docs/external-api-curls.md @@ -433,6 +433,23 @@ curl -X POST "$ESG_URL/inquiry/policyByPlate" \ }' ``` +### Car By Chassis (Two-Factor VIN Inquiry) + +Use the two-factor chassis route when the backend must match both the VIN and +the resolved third-party policyholder. Do not send `nationalCode` to the +one-factor `policyByChassis` route. + +```sh +curl -X POST "$ESG_URL/inquiry/carByChassis" \ + -H "Authorization: Bearer $ESG_ACCESS_TOKEN" \ + -H "Content-Type: application/json" \ + -H "Accept: application/json" \ + --data '{ + "nationalCode": "0012345678", + "chassis": "NAAR03HFFRDE07024" + }' +``` + ### Person Inquiry ESG expects Jalali birth date, normalized as `YYYY-MM-DD`. diff --git a/docs/external-integrations-reference.fa.html b/docs/external-integrations-reference.fa.html index 6a07fda..4abbbf4 100644 --- a/docs/external-integrations-reference.fa.html +++ b/docs/external-integrations-reference.fa.html @@ -161,7 +161,7 @@
CLIENT_ID=8 (تنانت پارسیان/ESG) → مسیریابی به ESG /inquiry/policyByPlate یا /inquiry/policyByChassis.CLIENT_ID=8 (تنانت پارسیان/ESG) → برای پلاک به ESG /inquiry/policyByPlate و برای VIN/شاسی به مسیر دوعاملی /inquiry/carByChassis مسیریابی میشود./block-inquiry-tejarat (THIRD_PARTY) یا /block-inquiry-tejarat/badane (CAR_BODY).system_settings.externalApis.sandHubUseLiveApi = false (پیشفرض) → پاسخ mock برگردانده شود به جای انجام فراخوانیهای HTTP.POST /car/third-party-car-financial-claims. دادههای مالک، راننده، بیمه، وسیله نقلیه و تصادف را ارسال میکند. یک claimId و claimNo فناوران برمیگرداند. پیامک با هر دو شناسه برای مالک ارسال میشود.POST /car/third-party-car-financial-claims. دادههای مالک، راننده، بیمه، وسیله نقلیه و تصادف را ارسال میکند. یک claimId و claimNo فناوران برمیگرداند که برای نمایش در پنل ذخیره میشوند.POST /car/third-party-car-financial-claims/{claimId}/dmg-cases. یک ورودی به ازای هر قطعه آسیبدیده با شناسه کامپوننت، شدت و قیمت. سقف: کل ≤ ۵۳،۰۰۰،۰۰۰ تومان.POST /car/third-party-car-financial-claims/{claimId}/files. اسناد، تصاویر car-capture و ویدیوها که با شناسه فایل ارجاع داده شدهاند.POST /car/third-party-car-financial-claims/{claimId}/expertise. متادیتای ارزیابی کارشناس (نقش کارشناس، تاریخ، نتیجه). ارسال را نهایی میکند.| متد | مسیر | توضیح |
|---|---|---|
| POST | /inquiry/policyByPlate | جستجوی بیمهنامه مبتنی بر پلاک (THIRD_PARTY). بدنه: nationalCode، plk1–plk4. پاسخ قبل از ذخیره به فرمت قدیمی تجارت نگاشت میشود. |
| POST | /inquiry/policyByChassis | جایگزین مبتنی بر VIN/شاسی برای پرسوجوی پلاک. توسط اندپوینتهای run-inquiries-vin فراخوانی میشود. از جستجوی شاسی ESG استفاده میکند (نه مسیر SandHub). بدنه: nationalCode، chassis. |
| POST | /inquiry/carByChassis | جایگزین دوعاملی VIN/شاسی برای استعلام پلاک. توسط اندپوینتهای run-inquiries-vin فراخوانی میشود. بدنه: nationalCode، chassis. مسیر تکعاملی policyByChassis استفاده نمیشود، چون فیلد nationalCode را نمیپذیرد. |
| POST | /inquiry/person | بررسی هویت شخصی. بدنه: nationalCode، birthDate (جلالی، نه میلادی). |
| POST | /inquiry/sheba | اعتبارسنجی شبا / حساب بانکی. |
token = "تصادف"/"خسارت"، token2 = publicId، token3 = نام خانوادگی کارشناسyara-expert-locktoken = نوع فایل، token2 = publicId، token3 = لینکyara-resend-documentstoken = نوع فایل، token2 = publicId، token3 = نام خانوادگی کارشناس، token10 = لینکyara-signaturetoken = publicId، token2 = claimId فناوران، token3 = claimNo فناورانyara-fanavaran-claimtoken = publicId، token2 = claimId فناوران، token3 = claimNo فناورانyara-fanavaran-claimتمام فراخوانیهای پیامک fire-and-forget هستند — هرگز throw نمیکنند. شکستها log میشوند اما جریان اصلی را مسدود نمیکنند. diff --git a/docs/external-integrations-reference.html b/docs/external-integrations-reference.html index 8c7eefd..8bfd209 100644 --- a/docs/external-integrations-reference.html +++ b/docs/external-integrations-reference.html @@ -156,7 +156,7 @@
CLIENT_ID=8 (Parsian/ESG tenant) → route to ESG /inquiry/policyByPlate or /inquiry/policyByChassis.CLIENT_ID=8 (Parsian/ESG tenant) → route to ESG /inquiry/policyByPlate for plates or the two-factor /inquiry/carByChassis for VIN/chassis inquiries./block-inquiry-tejarat (THIRD_PARTY) or /block-inquiry-tejarat/badane (CAR_BODY).system_settings.externalApis.sandHubUseLiveApi = false (default) → return mock response instead of making HTTP calls.POST /car/third-party-car-financial-claims. Sends owner, driver, insurance, vehicle, and accident data. Returns a Fanavaran claimId and claimNo. SMS is sent to the owner with both identifiers.POST /car/third-party-car-financial-claims. Sends owner, driver, insurance, vehicle, and accident data. Returns a Fanavaran claimId and claimNo, which are persisted for panel display.POST /car/third-party-car-financial-claims/{claimId}/dmg-cases. One entry per damaged part with component ID, severity, and price. Cap: total ≤ 53 000 000 Toman.POST /car/third-party-car-financial-claims/{claimId}/files. Documents, car-capture images, and videos referenced by file ID.POST /car/third-party-car-financial-claims/{claimId}/expertise. Expert assessment metadata (expert role, date, result). Finalises the submission.| Method | Path | What it does |
|---|---|---|
| POST | /inquiry/policyByPlate | Plate-based policy lookup (THIRD_PARTY). Body: nationalCode, plk1–plk4. Response is mapped to the old Tejarat format before being stored. |
| POST | /inquiry/policyByChassis | VIN/chassis-based alternative to plate inquiry. Called by run-inquiries-vin endpoints. Uses ESG chassis lookup (not the SandHub path). Body: nationalCode, chassis. |
| POST | /inquiry/carByChassis | Two-factor VIN/chassis alternative to the plate inquiry. Called by run-inquiries-vin endpoints. Body: nationalCode, chassis. The one-factor policyByChassis route is not used because it rejects nationalCode. |
| POST | /inquiry/person | Personal identity check. Body: nationalCode, birthDate (Jalali, NOT Gregorian). |
| POST | /inquiry/sheba | Sheba / bank account validation. |
yara-expert-locktoken = "تصادف"/"خسارت", token2 = publicId, token3 = expert surnameyara-resend-documentstoken = file kind, token2 = publicId, token3 = linkyara-signaturetoken = file kind, token2 = publicId, token3 = expert surname, token10 = linkyara-fanavaran-claimtoken = publicId, token2 = Fanavaran claimId, token3 = Fanavaran claimNoyara-fanavaran-claimtoken = publicId, token2 = Fanavaran claimId, token3 = Fanavaran claimNo
All SMS calls are fire-and-forget — they never throw. Failures are logged but do not block the main flow.
diff --git a/docs/fanavaran/01-write-apis.md b/docs/fanavaran/01-write-apis.md
index 5e90042..41cf34b 100644
--- a/docs/fanavaran/01-write-apis.md
+++ b/docs/fanavaran/01-write-apis.md
@@ -308,7 +308,7 @@ Requires `claimId` + `dmgCaseId` (soft-ensures earlier stages).
| `Id` | `claimCases.expertiseId` |
History: `FANAVARAN_EXPERTISE_AUTO_SUBMIT_SUCCEEDED`.
-SMS owner via `SmsOrchestrationService` (deduped `fanavaranSync.expertise.smsNotifiedAt`).
+No owner SMS is sent after expertise; the returned identifier is persisted only.
Proven Parsian: `expertiseId=403144`, `ClaimExpertId=29`.
Manual: `POST /v2/fanavaran/{client}/claim-cases/{id}/expertise/submit`.
diff --git a/docs/fanavaran/05-claim-flow.md b/docs/fanavaran/05-claim-flow.md
index ffb35b8..17770ae 100644
--- a/docs/fanavaran/05-claim-flow.md
+++ b/docs/fanavaran/05-claim-flow.md
@@ -21,7 +21,7 @@ Start local claim
→ Upload docs/images locally
→ GEN.07 attachments (per file, best-effort)
→ Expert pricing ready
- → GEN.08 expertise → store expertiseId → SMS owner
+ → GEN.08 expertise → store expertiseId (no SMS)
→ End (local completion independent of Fanavaran success)
```
@@ -76,7 +76,7 @@ sequenceDiagram
YARA->>FV: POST .../expertise (GEN.08)
FV-->>YARA: ExpertiseId
YARA->>DB: expertiseId, history SUCCESS
- YARA->>YARA: SMS owner (deduped)
+ Note over YARA: Post-expertise owner SMS is disabled
```
## Flow diagram (stages + soft-ensure)
diff --git a/docs/fanavaran/06-yara-integration.md b/docs/fanavaran/06-yara-integration.md
index 560d8f0..827c92d 100644
--- a/docs/fanavaran/06-yara-integration.md
+++ b/docs/fanavaran/06-yara-integration.md
@@ -17,7 +17,7 @@ source: fanavaran-module-docs
| Tenant config | boot + System Settings | `fanavaran-client-config.service.ts`, `system-settings.*` |
| Orchestration | `ClaimRequestManagementModule` | `claim-request-management.service.ts` |
| Policy select | same | `fanavaran-policy-selection.ts` |
-| SMS after expertise | `SmsOrchestrationModule` | `sms-orchestration.service.ts` |
+| SMS after expertise | Disabled by product decision | No message is dispatched |
---
@@ -49,7 +49,7 @@ source: fanavaran-module-docs
| Send | GEN.03 JSON + business headers |
| Receive | `Id`, `ClaimNo` |
| Store | `claimId`, `claimNo`, `fanavaranSync.baseClaim.*`, history |
-| Consumers | Damage/expertise soft-ensure; UI claim detail; SMS |
+| Consumers | Damage/expertise soft-ensure; UI claim detail |
### C. Damage case
diff --git a/docs/fanavaran/09-error-handling.md b/docs/fanavaran/09-error-handling.md
index f07ecd9..252618e 100644
--- a/docs/fanavaran/09-error-handling.md
+++ b/docs/fanavaran/09-error-handling.md
@@ -69,4 +69,4 @@ Per HTTP step:
## SMS
-After successful expertise (last Fanavaran stage), owner SMS may be sent once (`fanavaranSync.expertise.smsNotifiedAt`). Failure to SMS should not roll back Fanavaran expertise submit; treat as separate notification concern. Claims already notified at base claim (`fanavaranSync.baseClaim.smsNotifiedAt`) are not re-notified.
+The post-expertise owner SMS is disabled. A successful final Fanavaran response only persists the returned `expertiseId` and synchronization state; it does not dispatch a notification.
diff --git a/src/claim-request-management/claim-request-management.module.ts b/src/claim-request-management/claim-request-management.module.ts
index 57a9f6f..552c58f 100644
--- a/src/claim-request-management/claim-request-management.module.ts
+++ b/src/claim-request-management/claim-request-management.module.ts
@@ -58,7 +58,6 @@ import { MediaPolicyModule } from "src/media-policy/media-policy.module";
import { FanavaranAuditModule } from "src/fanavaran/fanavaran-audit.module";
import { FanavaranLookupModule } from "src/fanavaran/fanavaran-lookup.module";
import { PlateNormalizerModule } from "src/utils/plate-normalizer/plate-normalizer.module";
-import { SmsOrchestrationModule } from "src/sms-orchestration/sms-orchestration.module";
@Module({
imports: [
@@ -77,7 +76,6 @@ import { SmsOrchestrationModule } from "src/sms-orchestration/sms-orchestration.
SandHubModule,
ClientModule,
MediaPolicyModule,
- SmsOrchestrationModule,
JwtModule.register({}),
MongooseModule.forFeature([
{ name: ClaimCase.name, schema: ClaimCaseSchema },
diff --git a/src/claim-request-management/claim-request-management.service.ts b/src/claim-request-management/claim-request-management.service.ts
index 330b9eb..286e122 100644
--- a/src/claim-request-management/claim-request-management.service.ts
+++ b/src/claim-request-management/claim-request-management.service.ts
@@ -249,7 +249,6 @@ import {
FanavaranAuditStatus,
FanavaranAuditStep,
} from "src/fanavaran/schema/fanavaran-audit-log.schema";
-import { SmsOrchestrationService } from "src/sms-orchestration/sms-orchestration.service";
import { selectLatestActiveFanavaranPolicy } from "./fanavaran-policy-selection";
import {
selectAccidentVehicleUsedId,
@@ -487,7 +486,6 @@ export class ClaimRequestManagementService {
private readonly fanavaranAuditService: FanavaranAuditService,
private readonly fanavaranAuthService: FanavaranAuthService,
private readonly fanavaranLookupService: FanavaranLookupService,
- private readonly smsOrchestrationService: SmsOrchestrationService,
private readonly fileMakerDbService: FileMakerDbService,
private readonly fileReviewerDbService: FileReviewerDbService,
private readonly fieldExpertDbService: FieldExpertDbService,
@@ -7395,13 +7393,7 @@ export class ClaimRequestManagementService {
this.logger.log(
`[executeFanavaranExpertiseSubmit] Already have expertiseId=${claimCase.expertiseId}; skipping Fanavaran POST`,
);
- // Catch-up / deduped: SMS may still be pending if expertise predated this notify.
- await this.notifyClaimOwnerFanavaranClaimRegistered({
- claimCaseId,
- claimId: claimCase.claimId,
- claimNo: claimCase.claimNo,
- logPrefix: `[Fanavaran ${clientKey} V2 Expertise]`,
- });
+ // Product decision: completing the final Fanavaran stage must not send SMS.
return (
(claimCase as any)?.fanavaranSync?.expertise?.response ?? {
Id: claimCase.expertiseId,
@@ -7477,13 +7469,7 @@ export class ClaimRequestManagementService {
},
});
- // Best-effort: SMS after last Fanavaran stage (expertise) succeeds
- await this.notifyClaimOwnerFanavaranClaimRegistered({
- claimCaseId,
- claimId: claimCase.claimId,
- claimNo: claimCase.claimNo,
- logPrefix: `[Fanavaran ${clientKey} V2 Expertise]`,
- });
+ // Product decision: completing the final Fanavaran stage must not send SMS.
return response.data;
} catch (error) {
@@ -7521,12 +7507,7 @@ export class ClaimRequestManagementService {
};
}
if (claimCase.expertiseId != null) {
- await this.notifyClaimOwnerFanavaranClaimRegistered({
- claimCaseId,
- claimId: claimCase.claimId,
- claimNo: claimCase.claimNo,
- logPrefix,
- });
+ // Product decision: an already-completed Fanavaran stage must not send SMS.
return {
attempted: false,
submitted: false,
@@ -8695,111 +8676,6 @@ export class ClaimRequestManagementService {
return true;
}
- /**
- * Phone for the claim owner / damaged party (same recipient as other claim SMS).
- */
- private async resolveFanavaranClaimOwnerPhone(
- claimCase: any,
- ): Promise