UNPKG

@devx-commerce/plugin-gati

Version:

Gati ERP integration for Medusa

226 lines 17.4 kB
"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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