@devx-commerce/plugin-gati
Version:
Gati ERP integration for Medusa
226 lines • 17.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.config = void 0;
exports.default = partyMasterHandler;
const utils_1 = require("@medusajs/framework/utils");
const core_flows_1 = require("@medusajs/medusa/core-flows");
const party_master_1 = require("../modules/party-master");
const address_formatter_1 = require("../utils/address-formatter");
const phone_mapper_1 = require("../utils/phone-mapper");
/**
* Handles party master events by syncing them with Medusa customer and
*/
async function partyMasterHandler({ event: { data: eventData }, container, }) {
try {
const { operation, data } = eventData;
for (const item of data) {
switch (operation) {
case "create":
await handleCreate(container, item);
break;
case "update":
await handleUpdate(container, item);
break;
case "delete":
await handleDelete(container, item);
break;
default:
throw new Error(`Unsupported operation: ${operation}`);
}
}
}
catch (error) {
console.error("Error in collection master handler:", error);
throw error;
}
}
/**
* Creates a new customer in Medusa and updates the party master mapping
*/
async function handleCreate(container, data) {
const { result } = await (0, core_flows_1.createCustomersWorkflow)(container).run({
input: {
customersData: [
{
first_name: data.firm_name.split(" ")[0],
last_name: data.firm_name.split(" ")[1],
email: data.firm_email,
phone: (0, phone_mapper_1.formatIndianPhoneNumber)(data.owner_mobile),
has_account: true,
addresses: [
{
address_name: "Default Address",
is_default_shipping: true,
is_default_billing: true,
company: data.firm_name,
...(0, address_formatter_1.formatAddress)({
address_1: data.firm_add1,
address_2: data.firm_add2,
address_3: data.firm_add3,
}),
city: data.firm_city,
country_code: data.country === "India" ? "IN" : data.country,
province: data.state.match(/\[(.*?)\]/)?.[1] || data.state,
postal_code: data.firm_pin_code,
phone: (0, phone_mapper_1.formatIndianPhoneNumber)(data.owner_mobile),
},
],
metadata: {
external_id: data.id,
},
},
],
additional_data: {
[data.id]: {
is_blocked: false,
total_orders: 0,
total_spent: 0,
last_order_date: null,
gender: null,
birth_date: null,
anniversary_date: null,
spouse_name: null,
spouse_phone_number: null,
spouse_email: null,
gst_number: null,
pan_number: null,
pan_image_url: null,
occupation: null,
},
},
},
});
const partyMasterService = container.resolve(party_master_1.PARTY_MASTER_MODULE);
await partyMasterService.updatePartyMasters([
{
id: data.id,
mapping_id: result[0].id,
},
]);
}
/**
* Updates an existing collection in Medusa if it has a mapping
*/
async function handleUpdate(container, data) {
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
const customerModuleService = container.resolve(utils_1.Modules.CUSTOMER);
const { data: [party_master], } = await query.graph({
entity: "party_master",
fields: ["id", "mapping_id"],
filters: { id: data.id },
});
if (!party_master?.mapping_id) {
return;
}
await (0, core_flows_1.updateCustomersWorkflow)(container).run({
input: {
selector: {
id: party_master.mapping_id,
},
update: {
first_name: data.firm_name.split(" ")[0],
last_name: data.firm_name.split(" ")[1],
email: data.firm_email,
phone: (0, phone_mapper_1.formatIndianPhoneNumber)(data.owner_mobile),
metadata: {
external_id: data.id,
},
},
},
});
const addresses = await customerModuleService.listCustomerAddresses({
customer_id: party_master.mapping_id,
});
const existingAddress = (0, address_formatter_1.findMatchingAddress)({
first_name: data.firm_name.split(" ")[0],
last_name: data.firm_name.split(" ")[1],
company: data.firm_name,
...(0, address_formatter_1.formatAddress)({
address_1: data.firm_add1,
address_2: data.firm_add2,
address_3: data.firm_add3,
}),
city: data.firm_city,
country_code: data.country === "India" ? "IN" : data.country,
province: data.state.match(/\[(.*?)\]/)?.[1] || data.state,
postal_code: data.firm_pin_code,
phone: (0, phone_mapper_1.formatIndianPhoneNumber)(data.owner_mobile),
}, addresses);
if (existingAddress) {
await (0, core_flows_1.updateCustomerAddressesWorkflow)(container).run({
input: {
selector: {
id: existingAddress.id,
},
update: {
first_name: data.firm_name.split(" ")[0],
last_name: data.firm_name.split(" ")[1],
company: data.firm_name,
...(0, address_formatter_1.formatAddress)({
address_1: data.firm_add1,
address_2: data.firm_add2,
address_3: data.firm_add3,
}),
city: data.firm_city,
country_code: data.country === "India" ? "IN" : data.country,
province: data.state.match(/\[(.*?)\]/)?.[1] || data.state,
postal_code: data.firm_pin_code,
phone: (0, phone_mapper_1.formatIndianPhoneNumber)(data.owner_mobile),
},
},
});
}
else {
await (0, core_flows_1.createCustomerAddressesWorkflow)(container).run({
input: {
addresses: [
{
customer_id: party_master.mapping_id,
address_name: "Default Address",
is_default_shipping: false,
is_default_billing: false,
company: data.firm_name,
...(0, address_formatter_1.formatAddress)({
address_1: data.firm_add1,
address_2: data.firm_add2,
address_3: data.firm_add3,
}),
city: data.firm_city,
country_code: data.country === "India" ? "IN" : data.country,
province: data.state.match(/\[(.*?)\]/)?.[1] || data.state,
postal_code: data.firm_pin_code,
phone: (0, phone_mapper_1.formatIndianPhoneNumber)(data.owner_mobile),
},
],
},
});
}
}
/**
* Deletes a collection in Medusa if it has a mapping
*/
async function handleDelete(container, data) {
if (!data?.mapping_id) {
return;
}
const customerModuleService = container.resolve(utils_1.Modules.CUSTOMER);
const addresses = await customerModuleService.listCustomerAddresses({
customer_id: data.mapping_id,
});
await (0, core_flows_1.deleteCustomersWorkflow)(container).run({
input: {
ids: [data.mapping_id],
},
});
if (addresses.length > 0) {
await (0, core_flows_1.deleteCustomerAddressesWorkflow)(container).run({
input: {
ids: addresses.map((address) => address.id),
},
});
}
}
exports.config = {
event: "party_master",
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydHktbWFzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3BhcnR5LW1hc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpRkEscUNBeUJDO0FBeEdELHFEQUErRTtBQUMvRSw0REFPcUM7QUFFckMsMERBQThEO0FBRTlELGtFQUFnRjtBQUNoRix3REFBZ0U7QUErRGhFOztHQUVHO0FBQ1ksS0FBSyxVQUFVLGtCQUFrQixDQUFDLEVBQy9DLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFDMUIsU0FBUyxHQUN3QjtJQUNqQyxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUN0QyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLFFBQVEsU0FBUyxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssUUFBUTtvQkFDWCxNQUFNLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3BDLE1BQU07Z0JBQ1IsS0FBSyxRQUFRO29CQUNYLE1BQU0sWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDcEMsTUFBTTtnQkFDUixLQUFLLFFBQVE7b0JBQ1gsTUFBTSxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNwQyxNQUFNO2dCQUNSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUQsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxV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