UNPKG

@medusajs/order

Version:
225 lines • 9.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createClaim = createClaim; const utils_1 = require("@medusajs/framework/utils"); const _models_1 = require("../../models"); function createClaimAndReturnEntities(em, data, order) { const claimReference = em.create((0, utils_1.toMikroORMEntity)(_models_1.OrderClaim), { order_id: data.order_id, order_version: order.version, type: data.type, no_notification: data.no_notification, refund_amount: data.refund_amount ?? null, }); const returnReference = data.type === utils_1.ClaimType.REPLACE ? em.create((0, utils_1.toMikroORMEntity)(_models_1.Return), { order_id: data.order_id, order_version: order.version, status: utils_1.ReturnStatus.REQUESTED, claim: claimReference.id, refund_amount: data.refund_amount ?? null, }) : undefined; claimReference.return = returnReference?.id; return { claimReference, returnReference }; } function createReturnItem(em, item, claimReference, returnReference, actions) { actions.push({ action: utils_1.ChangeActionType.RETURN_ITEM, reference: "return", reference_id: returnReference.id, details: { reference_id: item.id, quantity: item.quantity, metadata: item.metadata, }, }); return em.create((0, utils_1.toMikroORMEntity)(_models_1.ReturnItem), { item_id: item.id, return_id: returnReference.id, quantity: item.quantity, note: item.note, metadata: item.metadata, }); } function createClaimAndReturnItems(em, data, claimReference, returnReference, actions) { const returnItems = []; const claimItems = data.claim_items?.map((item) => { actions.push({ action: utils_1.ChangeActionType.WRITE_OFF_ITEM, reference: "claim", reference_id: claimReference.id, details: { reference_id: item.id, quantity: item.quantity, metadata: item.metadata, }, }); returnItems.push(returnReference ? createReturnItem(em, item, claimReference, returnReference, actions) : undefined); return em.create((0, utils_1.toMikroORMEntity)(_models_1.OrderClaimItem), { item_id: item.id, reason: item.reason, quantity: item.quantity, note: item.note, metadata: item.metadata, }); }); return [claimItems, returnItems]; } async function processAdditionalItems(em, service, data, order, claimReference, actions, sharedContext) { const itemsToAdd = []; const additionalNewItems = []; const additionalItems = []; data.additional_items?.forEach((item) => { const hasItem = item.id ? order.items.find((o) => o.item.id === item.id) : false; if (hasItem) { actions.push({ action: utils_1.ChangeActionType.ITEM_ADD, claim_id: claimReference.id, internal_note: item.internal_note, reference: "claim", reference_id: claimReference.id, details: { reference_id: item.id, quantity: item.quantity, unit_price: item.unit_price ?? hasItem.item.unit_price, metadata: item.metadata, }, }); additionalItems.push(em.create((0, utils_1.toMikroORMEntity)(_models_1.OrderClaimItem), { item_id: item.id, quantity: item.quantity, note: item.note, metadata: item.metadata, is_additional_item: true, })); } else { itemsToAdd.push(item); additionalNewItems.push(em.create((0, utils_1.toMikroORMEntity)(_models_1.OrderClaimItem), { quantity: item.quantity, unit_price: item.unit_price, note: item.note, metadata: item.metadata, is_additional_item: true, })); } }); const createItems = await service.orderLineItemService_.create(itemsToAdd, sharedContext); createItems.forEach((item, index) => { const addedItem = itemsToAdd[index]; additionalNewItems[index].item_id = item.id; actions.push({ action: utils_1.ChangeActionType.ITEM_ADD, claim_id: claimReference.id, internal_note: addedItem.internal_note, reference: "claim", reference_id: claimReference.id, details: { reference_id: item.id, claim_id: claimReference.id, quantity: addedItem.quantity, unit_price: item.unit_price, metadata: addedItem.metadata, }, }); }); return additionalNewItems.concat(additionalItems); } async function processShippingMethods(service, data, claimReference, actions, sharedContext) { for (const shippingMethod of data.shipping_methods ?? []) { let shippingMethodId; if (!(0, utils_1.isString)(shippingMethod)) { const methods = await service.createOrderShippingMethods([ { ...shippingMethod, order_id: data.order_id, claim_id: claimReference.id, }, ], sharedContext); shippingMethodId = methods[0].id; } else { shippingMethodId = shippingMethod; } const method = await service.retrieveOrderShippingMethod(shippingMethodId, { relations: ["tax_lines", "adjustments"] }, sharedContext); const calculatedAmount = (0, utils_1.getShippingMethodsTotals)([method], {})[method.id]; actions.push({ action: utils_1.ChangeActionType.SHIPPING_ADD, reference: "order_shipping_method", reference_id: shippingMethodId, claim_id: claimReference.id, amount: calculatedAmount.total, }); } } async function processReturnShipping(service, data, claimReference, returnReference, actions, sharedContext) { if (!returnReference) { return; } if (data.return_shipping) { let returnShippingMethodId; if (!(0, utils_1.isString)(data.return_shipping)) { const methods = await service.createOrderShippingMethods([ { ...data.return_shipping, order_id: data.order_id, claim_id: claimReference.id, return_id: returnReference.id, }, ], sharedContext); returnShippingMethodId = methods[0].id; } else { returnShippingMethodId = data.return_shipping; } const method = await service.retrieveOrderShippingMethod(returnShippingMethodId, { relations: ["tax_lines", "adjustments"] }, sharedContext); const calculatedAmount = (0, utils_1.getShippingMethodsTotals)([method], {})[method.id]; actions.push({ action: utils_1.ChangeActionType.SHIPPING_ADD, reference: "order_shipping_method", reference_id: returnShippingMethodId, return_id: returnReference.id, claim_id: claimReference.id, amount: calculatedAmount.total, }); } } async function createClaim(data, sharedContext) { const order = await this.orderService_.retrieve(data.order_id, { relations: ["items"] }, sharedContext); const actions = []; const em = sharedContext.transactionManager; const { claimReference, returnReference } = createClaimAndReturnEntities(em, data, order); const [claimItems, returnItems] = createClaimAndReturnItems(em, data, claimReference, returnReference, actions); claimReference.claim_items = claimItems; if (returnReference) { returnReference.items = returnItems; } claimReference.additional_items = await processAdditionalItems(em, this, data, order, claimReference, actions, sharedContext); await processShippingMethods(this, data, claimReference, actions, sharedContext); await processReturnShipping(this, data, claimReference, returnReference, actions, sharedContext); const change = await this.createOrderChange_({ order_id: data.order_id, claim_id: claimReference.id, return_id: returnReference.id, change_type: utils_1.OrderChangeType.CLAIM, reference: "claim", reference_id: claimReference.id, description: data.description, internal_note: data.internal_note, created_by: data.created_by, metadata: data.metadata, actions, }, sharedContext); await (0, utils_1.promiseAll)([ this.createReturns([returnReference], sharedContext), this.createOrderClaims([claimReference], sharedContext), this.confirmOrderChange(change[0].id, sharedContext), ]); return claimReference; } //# sourceMappingURL=create-claim.js.map