@devx-commerce/plugin-gati 0.0.2-beta.126 → 0.0.2-beta.127
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,62 +6,55 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
6
6
|
const party_master_1 = require("../modules/party-master");
|
|
7
7
|
const create_party_workflow_1 = require("../workflows/party-master/workflows/create-party-workflow");
|
|
8
8
|
async function createCustomerHandler({ event: { data }, container, }) {
|
|
9
|
-
console.log("create
|
|
9
|
+
console.log("create party master handler>>>>", data);
|
|
10
10
|
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
fields: ["*", "extended_customer.*"],
|
|
14
|
-
filters: { id: data.id },
|
|
15
|
-
});
|
|
16
|
-
console.log("customer", customer);
|
|
17
|
-
const { data: [party], } = await query.graph({
|
|
11
|
+
// Check which party masters already exist in the database
|
|
12
|
+
const { data: existingPartyMasters } = await query.graph({
|
|
18
13
|
entity: "party_master",
|
|
19
14
|
fields: ["*"],
|
|
20
|
-
filters: { party_no: data.
|
|
15
|
+
filters: { party_no: data.ids },
|
|
21
16
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
console.log("creating self branch customer in party_master");
|
|
30
|
-
//create self branch customer in party_master
|
|
31
|
-
const { result } = await (0, create_party_workflow_1.createPartyWorkflow)(container).run({
|
|
17
|
+
// Find party masters that don't exist yet
|
|
18
|
+
const existingPartyNos = existingPartyMasters.map((p) => p.party_no);
|
|
19
|
+
const partyMastersToCreate = data.ids.filter((partyNo) => !existingPartyNos.includes(partyNo));
|
|
20
|
+
// Only create party masters that don't exist
|
|
21
|
+
let result = [];
|
|
22
|
+
if (partyMastersToCreate.length > 0) {
|
|
23
|
+
const { result: createdPartyMasters } = await (0, create_party_workflow_1.createPartyWorkflow)(container).run({
|
|
32
24
|
input: {
|
|
33
25
|
datafor: "PartyMst",
|
|
34
26
|
operation: "add",
|
|
35
|
-
data:
|
|
27
|
+
data: partyMastersToCreate,
|
|
36
28
|
},
|
|
37
29
|
});
|
|
38
|
-
|
|
39
|
-
await partyMasterService.updatePartyMasters([
|
|
40
|
-
{
|
|
41
|
-
id: result[0].id,
|
|
42
|
-
mapping_id: customer.id,
|
|
43
|
-
},
|
|
44
|
-
]);
|
|
30
|
+
result = createdPartyMasters;
|
|
45
31
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
32
|
+
else {
|
|
33
|
+
console.log("All party masters already exist, skipping creation");
|
|
34
|
+
}
|
|
35
|
+
// Get all party masters (existing + newly created) for mapping
|
|
36
|
+
const allPartyMasters = [...existingPartyMasters, ...result];
|
|
37
|
+
// Create extended customers for all party masters
|
|
38
|
+
const { data: extended_customers } = await query.graph({
|
|
39
|
+
entity: "extended_customer",
|
|
40
|
+
fields: ["*"],
|
|
41
|
+
filters: { external_id: allPartyMasters.map((party) => party.party_no) },
|
|
42
|
+
});
|
|
43
|
+
// Update party masters with mapping IDs
|
|
44
|
+
const partyMasterService = container.resolve(party_master_1.PARTY_MASTER_MODULE);
|
|
45
|
+
const updateData = allPartyMasters
|
|
46
|
+
.map((party) => {
|
|
47
|
+
return {
|
|
48
|
+
id: party.id,
|
|
49
|
+
mapping_id: data.customerId,
|
|
50
|
+
};
|
|
51
|
+
})
|
|
52
|
+
.filter((update) => update.mapping_id);
|
|
53
|
+
if (updateData.length > 0) {
|
|
54
|
+
await partyMasterService.updatePartyMasters(updateData);
|
|
62
55
|
}
|
|
63
56
|
}
|
|
64
57
|
exports.config = {
|
|
65
|
-
event: "
|
|
58
|
+
event: "party_master_create_customer",
|
|
66
59
|
};
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWN1c3RvbWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2NyZWF0ZS1jdXN0b21lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSx3Q0FnRUM7QUF0RUQscURBQXNFO0FBRXRFLDBEQUE4RDtBQUU5RCxxR0FBZ0c7QUFFakYsS0FBSyxVQUFVLHFCQUFxQixDQUFDLEVBQ2xELEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUNmLFNBQVMsR0FJVDtJQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSwwREFBMEQ7SUFDMUQsTUFBTSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN2RCxNQUFNLEVBQUUsY0FBYztRQUN0QixNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDYixPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtLQUNoQyxDQUFDLENBQUM7SUFFSCwwQ0FBMEM7SUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUMxQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQ2pELENBQUM7SUFDRiw2Q0FBNkM7SUFDN0MsSUFBSSxNQUFNLEdBQVUsRUFBRSxDQUFDO0lBQ3ZCLElBQUksb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLElBQUEsMkNBQW1CLEVBQy9ELFNBQVMsQ0FDVixDQUFDLEdBQUcsQ0FBQztZQUNKLEtBQUssRUFBRTtnQkFDTCxPQUFPLEVBQUUsVUFBVTtnQkFDbkIsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLElBQUksRUFBRSxvQkFBb0I7YUFDM0I7U0FDRixDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsbUJBQW1CLENBQUM7SUFDL0IsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUU3RCxrREFBa0Q7SUFDbEQsTUFBTSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNyRCxNQUFNLEVBQUUsbUJBQW1CO1FBQzNCLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNiLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUU7S0FDekUsQ0FBQyxDQUFDO0lBRUgsd0NBQXdDO0lBQ3hDLE1BQU0sa0JBQWtCLEdBQ3RCLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQUMsQ0FBQztJQUV6QyxNQUFNLFVBQVUsR0FBRyxlQUFlO1NBQy9CLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2IsT0FBTztZQUNMLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNaLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDO0lBQ0osQ0FBQyxDQUFDO1NBQ0QsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFekMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLDhCQUE4QjtDQUN0QyxDQUFDIn0=
|
|
@@ -2,32 +2,84 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createCustomerErpStep = void 0;
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
6
|
const party_master_1 = require("../../../modules/party-master");
|
|
6
7
|
exports.createCustomerErpStep = (0, workflows_sdk_1.createStep)("create-customer-erp-step", async (input, { container }) => {
|
|
7
8
|
const erpModuleService = container.resolve("erp");
|
|
9
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
10
|
+
const eventBus = container.resolve("event_bus");
|
|
8
11
|
const partyMasterModuleService = container.resolve(party_master_1.PARTY_MASTER_MODULE);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
owner_mobile: input.OwnerMobile,
|
|
12
|
+
const branches = await partyMasterModuleService.listPartyMasters({
|
|
13
|
+
is_inline_branch: true,
|
|
12
14
|
});
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
// Get all existing party masters for this party number
|
|
16
|
+
const existingPartyMasters = await partyMasterModuleService.listPartyMasters({
|
|
17
|
+
party_no: input.PartyNo,
|
|
18
|
+
});
|
|
19
|
+
const existingBranchNos = existingPartyMasters.map((p) => p.branch_no);
|
|
20
|
+
const branchesUserShouldCreate = branches.filter((p) => p.party_no !== input.BranchNo && !existingBranchNos.includes(p.party_no));
|
|
21
|
+
const customersToCreate = [];
|
|
22
|
+
// Add derived branch first if it doesn't exist
|
|
23
|
+
if (!existingBranchNos.includes(input.BranchNo)) {
|
|
24
|
+
customersToCreate.push({
|
|
25
|
+
...input,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// Add self branch if it doesn't exist
|
|
29
|
+
if (!existingBranchNos.includes("")) {
|
|
30
|
+
customersToCreate.push({
|
|
20
31
|
...input,
|
|
21
32
|
BranchNo: "",
|
|
22
33
|
BranchName: "Self",
|
|
23
34
|
LocationId: "",
|
|
24
35
|
LocationName: "All",
|
|
25
|
-
};
|
|
26
|
-
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Add other branches
|
|
39
|
+
const otherBranches = branchesUserShouldCreate?.map((branch) => ({
|
|
40
|
+
...input,
|
|
41
|
+
BranchNo: branch.party_no,
|
|
42
|
+
BranchName: branch.firm_name,
|
|
43
|
+
})) || [];
|
|
44
|
+
customersToCreate.push(...otherBranches);
|
|
45
|
+
const customers = [];
|
|
46
|
+
// Only create customers that don't already exist
|
|
47
|
+
for (const toCreate of customersToCreate) {
|
|
48
|
+
const customer = await erpModuleService.createCustomer(toCreate);
|
|
49
|
+
customers.push({
|
|
50
|
+
...customer,
|
|
51
|
+
BranchNo: toCreate.BranchNo,
|
|
52
|
+
BranchName: toCreate.BranchName,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const derivedBranchCustomer = customers.find((customer) => customer.BranchNo === input.BranchNo);
|
|
56
|
+
const phone = !derivedBranchCustomer.Mobile.startsWith("+91")
|
|
57
|
+
? "+91" + derivedBranchCustomer.Mobile
|
|
58
|
+
: derivedBranchCustomer.Mobile || "";
|
|
59
|
+
const { data: [existingCustomer], } = await query.graph({
|
|
60
|
+
entity: "customer",
|
|
61
|
+
fields: ["*", "extended_customer.*"],
|
|
62
|
+
filters: {
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
phone,
|
|
65
|
+
},
|
|
66
|
+
pagination: {
|
|
67
|
+
skip: 0,
|
|
68
|
+
take: 1,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
// Only emit event for newly created customers
|
|
72
|
+
if (customers.length > 0) {
|
|
73
|
+
await eventBus.emit({
|
|
74
|
+
name: "party_master_create_customer",
|
|
75
|
+
data: {
|
|
76
|
+
ids: customers.map((customer) => customer.PartyNo),
|
|
77
|
+
customerId: existingCustomer?.id,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
27
80
|
}
|
|
28
81
|
return new workflows_sdk_1.StepResponse({
|
|
29
|
-
customer,
|
|
30
|
-
selfBranchCustomer,
|
|
82
|
+
customer: derivedBranchCustomer,
|
|
31
83
|
});
|
|
32
84
|
});
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWN1c3RvbWVyLWVycC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvcGFydHktbWFzdGVyL3N0ZXBzL2NyZWF0ZS1jdXN0b21lci1lcnAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTZFO0FBRTdFLHFEQUFzRTtBQUd0RSxnRUFBb0U7QUFHdkQsUUFBQSxxQkFBcUIsR0FBRyxJQUFBLDBCQUFVLEVBQzdDLDBCQUEwQixFQUMxQixLQUFLLEVBQUUsS0FBc0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDOUMsTUFBTSxnQkFBZ0IsR0FBcUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFaEQsTUFBTSx3QkFBd0IsR0FDNUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBQyxDQUFDO0lBRXpDLE1BQU0sUUFBUSxHQUFHLE1BQU0sd0JBQXdCLENBQUMsZ0JBQWdCLENBQUM7UUFDL0QsZ0JBQWdCLEVBQUUsSUFBSTtLQUN2QixDQUFDLENBQUM7SUFFSCx1REFBdUQ7SUFDdkQsTUFBTSxvQkFBb0IsR0FDeEIsTUFBTSx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU87S0FDeEIsQ0FBQyxDQUFDO0lBRUwsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV2RSxNQUFNLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQzlDLENBQUMs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
|