Skip to content

Commit 2ff6cf0

Browse files
authored
Merge pull request #952 from Nikita-ondc/draft-FIS13-HEALTH-2.0.1
feat: implemented dynamic id generation in motor and health flows for trail usage
2 parents d7d927e + 10d69c6 commit 2ff6cf0

File tree

86 files changed

+2149
-327
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+2149
-327
lines changed

mock-service/src/config/mock-config/FIS13/action-factory.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ import { MockOnInitClass as MotorMockOnInitClass } from "./motor/2.0.1/on_init/c
5353
import { MockOnInitClass2 as MotorMockOnInitClass2 } from "./motor/2.0.1/on_init2/class";
5454
import { MockOnInitClass3 as MotorMockOnInitClass3 } from "./motor/2.0.1/on_init3/class";
5555
import { MockConfirmClass as MotorMockConfirmClass } from "./motor/2.0.1/confirm/class";
56+
import { MockConfirm2Class as MotorMockConfirm2Class } from "./motor/2.0.1/confirm2/class";
5657
import { MockOnConfirmClass as MotorMockOnConfirmClass } from "./motor/2.0.1/on_confirm/class";
58+
import { MockOnConfirm2Class as MotorMockOnConfirm2Class } from "./motor/2.0.1/on_confirm2/class";
5759
import { MockStatusClass as MotorMockStatusClass } from "./motor/2.0.1/status/class";
5860
import { MockOnStatusClass as MotorMockOnStatusClass } from "./motor/2.0.1/on_status/class";
5961
import { MockOnStatusUnsolicitedClass as MotorMockOnStatusUnsolicitedClass } from "./motor/2.0.1/on_status_unsolicited/class";
@@ -88,6 +90,8 @@ import { MockSearch2Class } from "./health/2.0.1/search2/class";
8890
import { MockSearch3Class } from "./health/2.0.1/search3/class";
8991
import { MockSearch4Class } from "./health/2.0.1/search4/class";
9092
import { MockOnSearchClass4 } from "./health/2.0.1/on_search4/class";
93+
import { MockOnConfirm2Class } from "./health/2.0.1/on_confirm2/class";
94+
import { MockConfirm2Class } from "./health/2.0.1/confirm2/class";
9195

9296

9397
// types/helpers
@@ -128,6 +132,8 @@ const registry = {
128132
// confirm / on_confirm
129133
confirm: MockConfirmClass,
130134
on_confirm: MockOnConfirmClass,
135+
confirm2: MockConfirm2Class,
136+
on_confirm2: MockOnConfirm2Class,
131137

132138
// status / on_status
133139
status: MockStatusClass,
@@ -192,6 +198,8 @@ const registry = {
192198
// confirm / on_confirm
193199
confirm_motor: MotorMockConfirmClass,
194200
on_confirm_motor: MotorMockOnConfirmClass,
201+
confirm_motor2: MotorMockConfirm2Class,
202+
on_confirm_motor2: MotorMockOnConfirm2Class,
195203

196204
// status / on_status
197205
status_motor: MotorMockStatusClass,

mock-service/src/config/mock-config/FIS13/factory.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,16 @@ codes:
189189
action: on_search
190190
default: FIS13/health/2.0.1/on_search4/default.yaml
191191
message_id: false
192+
- code: 238
193+
action_id: confirm2
194+
action: confirm
195+
default: FIS13/health/2.0.1/confirm2/default.yaml
196+
message_id: true
197+
- code: 239
198+
action_id: on_confirm2
199+
action: on_confirm
200+
default: FIS13/health/2.0.1/on_confirm2/default.yaml
201+
message_id: false
192202

193203
# // Motor Insurance //
194204
- code: 300
@@ -381,3 +391,13 @@ codes:
381391
action: on_status
382392
default: FIS13/motor/2.0.1/on_status_unsolicited5/default.yaml
383393
message_id: true
394+
- code: 338
395+
action_id: confirm_motor2
396+
action: confirm
397+
default: FIS13/motor/2.0.1/confirm2/default.yaml
398+
message_id: true
399+
- code: 339
400+
action_id: on_confirm_motor2
401+
action: on_confirm
402+
default: FIS13/motor/2.0.1/on_confirm2/default.yaml
403+
message_id: false

mock-service/src/config/mock-config/FIS13/health/2.0.1/confirm/generator.ts

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,42 @@ export async function confirmDefaultGenerator(existingPayload: any, sessionData:
2929
console.log("Updated provider.id:", sessionData.selected_provider.id);
3030
}
3131

32-
// Carry forward item.id from session data
33-
const selectedItem = sessionData.item || (Array.isArray(sessionData.items) ? sessionData.items[0] : undefined);
34-
if (selectedItem?.id && existingPayload.message?.order?.items?.[0]) {
35-
existingPayload.message.order.items[0].id = selectedItem.id;
32+
// Carry forward child item ID and parent_item_id from session
33+
const childItem = sessionData.order?.items?.[0] || sessionData.selected_items?.[0] || sessionData.item || (Array.isArray(sessionData.items) ? sessionData.items[0] : undefined);
34+
if (childItem?.id && existingPayload.message?.order?.items?.[0]) {
35+
existingPayload.message.order.items[0].id = childItem.id;
36+
if (childItem.parent_item_id) {
37+
existingPayload.message.order.items[0].parent_item_id = childItem.parent_item_id;
38+
}
39+
3640
}
3741

38-
// Carry forward fulfillment.id from session data
39-
if (sessionData.fullfillment_ids?.[0] && existingPayload.message?.order?.fulfillments?.[0]) {
40-
existingPayload.message.order.fulfillments[0].id = sessionData.fullfillment_ids[0];
42+
// Resolve fulfillment ID (handle both string and array from session)
43+
const fulfillmentId = Array.isArray(sessionData.fullfillment_ids) ? sessionData.fullfillment_ids[0] : sessionData.fullfillment_ids;
44+
45+
// Carry forward fulfillment.id from session data (dynamically generated in on_init)
46+
if (fulfillmentId && existingPayload.message?.order?.fulfillments?.[0]) {
47+
existingPayload.message.order.fulfillments[0].id = fulfillmentId;
48+
4149
}
4250

4351
// Carry forward quote.id from session data
44-
if (sessionData.quote_id && existingPayload.message?.order?.quote) {
45-
existingPayload.message.order.quote.id = sessionData.quote_id;
52+
if ((sessionData.quote_id || sessionData.quote?.id) && existingPayload.message?.order?.quote) {
53+
existingPayload.message.order.quote.id = sessionData.quote_id || sessionData.quote?.id;
54+
}
55+
56+
// Update quote breakup item references with dynamic child item ID
57+
if (existingPayload.message?.order?.quote?.breakup && childItem?.id) {
58+
existingPayload.message.order.quote.breakup.forEach((b: any) => {
59+
if (b.item?.id) b.item.id = childItem.id;
60+
});
61+
4662
}
4763

4864
if (existingPayload.message?.order?.items?.[0]) {
4965
const item = existingPayload.message.order.items[0];
5066
if (item.xinput?.form) {
51-
const formId = sessionData.form_id || "F08";
67+
const formId = sessionData.order?.items?.[0]?.xinput?.form?.id || sessionData.selected_items?.[0]?.xinput?.form?.id || sessionData.form_id || "F08";
5268
item.xinput.form.id = formId;
5369
console.log("Updated form ID:", formId);
5470
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { readFileSync } from "fs";
2+
import yaml from "js-yaml";
3+
import path from "path";
4+
import { MockAction, MockOutput, saveType } from "../../../classes/mock-action";
5+
import { SessionData } from "../../../session-types";
6+
import { confirmDefaultGenerator } from "./generator";
7+
8+
export class MockConfirm2Class extends MockAction {
9+
get saveData(): saveType {
10+
return yaml.load(
11+
readFileSync(path.resolve(__dirname, "./save-data.yaml"), "utf8")
12+
) as saveType;
13+
}
14+
get defaultData(): any {
15+
return yaml.load(
16+
readFileSync(path.resolve(__dirname, "./default.yaml"), "utf8")
17+
);
18+
}
19+
get inputs(): any {
20+
return {};
21+
}
22+
name(): string {
23+
return "confirm";
24+
}
25+
get description(): string {
26+
return "Mock for confirm";
27+
}
28+
generator(existingPayload: any, sessionData: SessionData): Promise<any> {
29+
return confirmDefaultGenerator(existingPayload, sessionData);
30+
}
31+
async validate(targetPayload: any): Promise<MockOutput> {
32+
return { valid: true };
33+
}
34+
async meetRequirements(sessionData: SessionData): Promise<MockOutput> {
35+
// For confirm, require provider, at least one item (either selected_items or item), and transaction_id
36+
if (!sessionData.selected_provider) {
37+
return { valid: false, message: "No selected_provider available in session data" };
38+
}
39+
const hasItems = (Array.isArray(sessionData.selected_items) && sessionData.selected_items.length > 0) || !!sessionData.item;
40+
if (!hasItems) {
41+
return { valid: false, message: "No items available in session data" };
42+
}
43+
if (!sessionData.transaction_id) {
44+
return { valid: false, message: "No transaction_id available in session data" };
45+
}
46+
return { valid: true };
47+
}
48+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
order:
2+
fulfillments:
3+
- customer:
4+
contact:
5+
email: "joe.adam@abc.org"
6+
phone: "+91-9999999999"
7+
person:
8+
name: "Joe Adam"
9+
id: "F1"
10+
type: "POLICY"
11+
12+
items:
13+
- add_ons:
14+
- id: "A1"
15+
quantity:
16+
selected:
17+
count: 1
18+
id: "CHILD_ITEM_ID_I1"
19+
parent_item_id: "I1"
20+
xinput:
21+
form:
22+
id: "F08"
23+
form_response:
24+
status: "SUCCESS"
25+
submission_id: "aab8e186-e9d6-4b93-8a70-8f6b8c471862"
26+
27+
payments:
28+
- collected_by: "BPP"
29+
params:
30+
amount: "1100"
31+
bank_account_number: "1800002341"
32+
bank_code: "SBIN0001234"
33+
currency: "INR"
34+
status: "NOT-PAID"
35+
type: "PRE-ORDER"
36+
tags:
37+
- descriptor:
38+
code: "BUYER_FINDER_FEES"
39+
display: false
40+
list:
41+
- descriptor:
42+
code: "BUYER_FINDER_FEES_TYPE"
43+
value: "percent-annualized"
44+
- descriptor:
45+
code: "BUYER_FINDER_FEES_PERCENTAGE"
46+
value: "1"
47+
- descriptor:
48+
code: "SETTLEMENT_TERMS"
49+
display: false
50+
list:
51+
- descriptor:
52+
code: "SETTLEMENT_WINDOW"
53+
value: "PT60M"
54+
- descriptor:
55+
code: "SETTLEMENT_BASIS"
56+
value: "Delivery"
57+
- descriptor:
58+
code: "SETTLEMENT_TYPE"
59+
value: "upi"
60+
- descriptor:
61+
code: "DELAY_INTEREST"
62+
value: "2.5"
63+
- descriptor:
64+
code: "STATIC_TERMS"
65+
value: "https://www.icicibank.com/personal-banking/loans/personal-loan"
66+
- descriptor:
67+
code: "SETTLEMENT_AMOUNT"
68+
value: "400"
69+
- descriptor:
70+
code: "OFFLINE_CONTRACT"
71+
value: "true"
72+
73+
provider:
74+
id: "P1"
75+
76+
quote:
77+
id: "OFFER_ID/PROPOSAL_ID"
78+
breakup:
79+
- price:
80+
value: "900"
81+
currency: "INR"
82+
title: "BASE_PRICE"
83+
- price:
84+
value: "50"
85+
currency: "INR"
86+
title: "CONVIENCE_FEE"
87+
- price:
88+
value: "40"
89+
currency: "INR"
90+
title: "TAX"
91+
- price:
92+
value: "10"
93+
currency: "INR"
94+
title: "PROCESSING_FEE"
95+
- title: "ADD_ONS"
96+
item:
97+
id: "CHILD_ITEM_ID_I1"
98+
add_ons:
99+
- id: "A1"
100+
price:
101+
value: "100"
102+
currency: "INR"
103+
price:
104+
currency: "INR"
105+
value: "1100"
106+
ttl: "P15D"
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
2+
export async function confirmDefaultGenerator(existingPayload: any, sessionData: any) {
3+
console.log("sessionData for confirm", sessionData);
4+
5+
// Update context timestamp and action
6+
if (existingPayload.context) {
7+
existingPayload.context.timestamp = new Date().toISOString();
8+
existingPayload.context.action = "confirm";
9+
}
10+
11+
12+
const submission_id = sessionData?.form_data?.consumer_information_form?.form_submission_id || sessionData?.consumer_information_form
13+
const form_status = sessionData?.form_data?.consumer_information_form?.idType;
14+
15+
// Update transaction_id from session data (carry-forward mapping)
16+
if (sessionData.transaction_id && existingPayload.context) {
17+
existingPayload.context.transaction_id = sessionData.transaction_id;
18+
}
19+
20+
// Generate new UUID message_id for confirm (new API call)
21+
if (existingPayload.context) {
22+
existingPayload.context.message_id = crypto.randomUUID();
23+
console.log("Generated new UUID message_id for confirm:", existingPayload.context.message_id);
24+
}
25+
26+
// Update provider.id if available from session data (carry-forward from previous flows)
27+
if (sessionData.selected_provider?.id && existingPayload.message?.order?.provider) {
28+
existingPayload.message.order.provider.id = sessionData.selected_provider.id;
29+
console.log("Updated provider.id:", sessionData.selected_provider.id);
30+
}
31+
32+
// Carry forward child item ID and parent_item_id from session
33+
const childItem = sessionData.order?.items?.[0] || sessionData.selected_items?.[0] || sessionData.item || (Array.isArray(sessionData.items) ? sessionData.items[0] : undefined);
34+
if (childItem?.id && existingPayload.message?.order?.items?.[0]) {
35+
existingPayload.message.order.items[0].id = childItem.id;
36+
if (childItem.parent_item_id) {
37+
existingPayload.message.order.items[0].parent_item_id = childItem.parent_item_id;
38+
}
39+
console.log("Carried forward child item:", childItem.id, "parent:", childItem.parent_item_id);
40+
}
41+
42+
// Resolve fulfillment ID (handle both string and array from session)
43+
const fulfillmentId = Array.isArray(sessionData.fullfillment_ids) ? sessionData.fullfillment_ids[0] : sessionData.fullfillment_ids;
44+
45+
// Carry forward fulfillment.id from session data (dynamically generated in on_init)
46+
if (fulfillmentId && existingPayload.message?.order?.fulfillments?.[0]) {
47+
existingPayload.message.order.fulfillments[0].id = fulfillmentId;
48+
console.log("Carried forward fulfillment ID:", fulfillmentId);
49+
}
50+
51+
// Carry forward quote.id from session data
52+
if ((sessionData.quote_id || sessionData.quote?.id) && existingPayload.message?.order?.quote) {
53+
existingPayload.message.order.quote.id = sessionData.quote_id || sessionData.quote?.id;
54+
}
55+
56+
// Update quote breakup item references with dynamic child item ID
57+
if (existingPayload.message?.order?.quote?.breakup && childItem?.id) {
58+
existingPayload.message.order.quote.breakup.forEach((b: any) => {
59+
if (b.item?.id) b.item.id = childItem.id;
60+
});
61+
console.log("Updated quote breakup item.id with:", childItem.id);
62+
}
63+
64+
if (existingPayload.message?.order?.items?.[0]) {
65+
const item = existingPayload.message.order.items[0];
66+
if (item.xinput?.form) {
67+
const formId = sessionData.order?.items?.[0]?.xinput?.form?.id || sessionData.selected_items?.[0]?.xinput?.form?.id || sessionData.form_id || "F08";
68+
item.xinput.form.id = formId;
69+
console.log("Updated form ID:", formId);
70+
}
71+
72+
// Set form status and submission_id
73+
if (item.xinput) {
74+
// Create form_response if it doesn't exist
75+
if (!item.xinput.form_response) {
76+
item.xinput.form_response = {};
77+
}
78+
if (form_status) {
79+
item.xinput.form_response.status = form_status;
80+
}
81+
if (submission_id) {
82+
item.xinput.form_response.submission_id = submission_id;
83+
}
84+
}
85+
}
86+
87+
88+
return existingPayload;
89+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
save-data:
2+
transaction_id: "$.context.transaction_id"
3+
message_id: "$.context.message_id"
4+
selected_items: "$.message.order.items[*]"
5+
selected_fulfillments: "$.message.order.fulfillments[*]"
6+
selected_provider: "$.message.order.provider"
7+
tags: "$.message.order.tags[*]"
8+
payments: "$.message.order.payments[*]"
9+
quote: "$.message.order.quote"

0 commit comments

Comments
 (0)