diff --git a/packages/admin/dashboard/src/i18n/translations/en.json b/packages/admin/dashboard/src/i18n/translations/en.json index cf790c05e6..bf926aa1b4 100644 --- a/packages/admin/dashboard/src/i18n/translations/en.json +++ b/packages/admin/dashboard/src/i18n/translations/en.json @@ -31,6 +31,7 @@ "revoked": "Revoked", "new": "New", "modified": "Modified", + "added": "Added", "removed": "Removed", "admin": "Admin", "store": "Store", diff --git a/packages/core/core-flows/src/order/workflows/order-edit/confirm-order-edit-request.ts b/packages/core/core-flows/src/order/workflows/order-edit/confirm-order-edit-request.ts index d6e600ad9e..2365bb51c0 100644 --- a/packages/core/core-flows/src/order/workflows/order-edit/confirm-order-edit-request.ts +++ b/packages/core/core-flows/src/order/workflows/order-edit/confirm-order-edit-request.ts @@ -155,6 +155,9 @@ export const confirmOrderEditRequestWorkflow = createWorkflow( let quantity: BigNumberInput = itemAction.raw_quantity ?? itemAction.quantity + let unit_price: BigNumberInput = + itemAction.raw_unit_price ?? itemAction.unit_price + const updateAction = itemAction.actions!.find( (a) => a.action === ChangeActionType.ITEM_UPDATE ) @@ -169,6 +172,7 @@ export const confirmOrderEditRequestWorkflow = createWorkflow( id: ordItem.id, variant_id: ordItem.variant_id, quantity, + unit_price, }) allVariants.push(ordItem.variant) }) diff --git a/packages/core/core-flows/src/order/workflows/order-edit/order-edit-update-item-quantity.ts b/packages/core/core-flows/src/order/workflows/order-edit/order-edit-update-item-quantity.ts index 0a4da4384a..53f4bd0936 100644 --- a/packages/core/core-flows/src/order/workflows/order-edit/order-edit-update-item-quantity.ts +++ b/packages/core/core-flows/src/order/workflows/order-edit/order-edit-update-item-quantity.ts @@ -84,6 +84,7 @@ export const orderEditUpdateItemQuantityWorkflow = createWorkflow( details: { reference_id: item.id, quantity: item.quantity, + unit_price: item.unit_price, }, })) } diff --git a/packages/core/core-flows/src/order/workflows/order-edit/update-order-edit-add-item.ts b/packages/core/core-flows/src/order/workflows/order-edit/update-order-edit-add-item.ts index 27daef1874..aae49f85e4 100644 --- a/packages/core/core-flows/src/order/workflows/order-edit/update-order-edit-add-item.ts +++ b/packages/core/core-flows/src/order/workflows/order-edit/update-order-edit-add-item.ts @@ -104,6 +104,7 @@ export const updateOrderEditAddItemWorkflow = createWorkflow( id: input.action_id, details: { quantity: data.quantity ?? originalAction.details?.quantity, + unit_price: data.unit_price ?? originalAction.details?.unit_price, }, internal_note: data.internal_note, } diff --git a/packages/core/types/src/workflow/order/items.ts b/packages/core/types/src/workflow/order/items.ts index 8614ca37e5..90e4259953 100644 --- a/packages/core/types/src/workflow/order/items.ts +++ b/packages/core/types/src/workflow/order/items.ts @@ -12,6 +12,7 @@ interface NewItem { interface ExistingItem { id: string quantity: BigNumberInput + unit_price?: BigNumberInput internal_note?: string | null } @@ -59,6 +60,7 @@ export interface UpdateOrderEditAddNewItemWorkflowInput { action_id: string data: { quantity?: BigNumberInput + unit_price?: BigNumberInput internal_note?: string | null } } diff --git a/packages/core/utils/src/modules-sdk/mikro-orm-cli-config-builder.ts b/packages/core/utils/src/modules-sdk/mikro-orm-cli-config-builder.ts index 39fa9a0d4a..48bb1c62ab 100644 --- a/packages/core/utils/src/modules-sdk/mikro-orm-cli-config-builder.ts +++ b/packages/core/utils/src/modules-sdk/mikro-orm-cli-config-builder.ts @@ -1,13 +1,13 @@ -import { DmlEntity, toMikroOrmEntities } from "../dml" -import { CustomTsMigrationGenerator } from "../dal" import type { AnyEntity, EntityClass, + EntityClassGroup, EntitySchema, MikroORMOptions, - EntityClassGroup, } from "@mikro-orm/core" import { kebabCase } from "../common" +import { CustomTsMigrationGenerator } from "../dal" +import { DmlEntity, toMikroOrmEntities } from "../dml" type Options = Partial> & { entities: ( diff --git a/packages/medusa/src/api/admin/order-edits/validators.ts b/packages/medusa/src/api/admin/order-edits/validators.ts index bcd7f80a06..fcf32306bb 100644 --- a/packages/medusa/src/api/admin/order-edits/validators.ts +++ b/packages/medusa/src/api/admin/order-edits/validators.ts @@ -51,6 +51,7 @@ export type AdminPostOrderEditsAddItemsReqSchemaType = z.infer< export const AdminPostOrderEditsItemsActionReqSchema = z.object({ quantity: z.number().optional(), + unit_price: z.number().optional(), internal_note: z.string().nullish().optional(), }) @@ -60,6 +61,7 @@ export type AdminPostOrderEditsItemsActionReqSchemaType = z.infer< export const AdminPostOrderEditsUpdateItemQuantityReqSchema = z.object({ quantity: z.number(), + unit_price: z.number().optional(), internal_note: z.string().nullish().optional(), }) diff --git a/packages/modules/order/src/migrations/.snapshot-medusa-order.json b/packages/modules/order/src/migrations/.snapshot-medusa-order.json index 893e5c204a..85d6c0cb83 100644 --- a/packages/modules/order/src/migrations/.snapshot-medusa-order.json +++ b/packages/modules/order/src/migrations/.snapshot-medusa-order.json @@ -790,6 +790,24 @@ "nullable": false, "mappedType": "text" }, + "unit_price": { + "name": "unit_price", + "type": "numeric", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "decimal" + }, + "raw_unit_price": { + "name": "raw_unit_price", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, "quantity": { "name": "quantity", "type": "numeric", @@ -815,7 +833,6 @@ "autoincrement": false, "primary": false, "nullable": false, - "default": "0", "mappedType": "decimal" }, "raw_fulfilled_quantity": { @@ -834,7 +851,6 @@ "autoincrement": false, "primary": false, "nullable": false, - "default": "0", "mappedType": "decimal" }, "raw_delivered_quantity": { @@ -853,7 +869,6 @@ "autoincrement": false, "primary": false, "nullable": false, - "default": "0", "mappedType": "decimal" }, "raw_shipped_quantity": { @@ -872,7 +887,6 @@ "autoincrement": false, "primary": false, "nullable": false, - "default": "0", "mappedType": "decimal" }, "raw_return_requested_quantity": { @@ -891,7 +905,6 @@ "autoincrement": false, "primary": false, "nullable": false, - "default": "0", "mappedType": "decimal" }, "raw_return_received_quantity": { @@ -910,7 +923,6 @@ "autoincrement": false, "primary": false, "nullable": false, - "default": "0", "mappedType": "decimal" }, "raw_return_dismissed_quantity": { @@ -929,7 +941,6 @@ "autoincrement": false, "primary": false, "nullable": false, - "default": "0", "mappedType": "decimal" }, "raw_written_off_quantity": { diff --git a/packages/modules/order/src/migrations/Migration20240930122627.ts b/packages/modules/order/src/migrations/Migration20240930122627.ts new file mode 100644 index 0000000000..e56d6a541d --- /dev/null +++ b/packages/modules/order/src/migrations/Migration20240930122627.ts @@ -0,0 +1,18 @@ +import { Migration } from "@mikro-orm/migrations" + +export class Migration20240930122627 extends Migration { + async up(): Promise { + this.addSql( + 'alter table if exists "order_item" add column if not exists "unit_price" numeric null, add column if not exists "raw_unit_price" jsonb null;' + ) + } + + async down(): Promise { + this.addSql( + 'alter table if exists "order_item" drop column if exists "unit_price";' + ) + this.addSql( + 'alter table if exists "order_item" drop column if exists "raw_unit_price";' + ) + } +} diff --git a/packages/modules/order/src/models/order-item.ts b/packages/modules/order/src/models/order-item.ts index 85b873a1f9..6482a73647 100644 --- a/packages/modules/order/src/models/order-item.ts +++ b/packages/modules/order/src/models/order-item.ts @@ -84,6 +84,12 @@ export default class OrderItem { }) item: Rel + @MikroOrmBigNumberProperty({ nullable: true }) + unit_price: BigNumber | number | null = null + + @Property({ columnType: "jsonb", nullable: true }) + raw_unit_price: BigNumberRawValue | null = null + @MikroOrmBigNumberProperty() quantity: BigNumber | number diff --git a/packages/modules/order/src/services/order-module-service.ts b/packages/modules/order/src/services/order-module-service.ts index 67cf3e328d..e77e290d26 100644 --- a/packages/modules/order/src/services/order-module-service.ts +++ b/packages/modules/order/src/services/order-module-service.ts @@ -64,7 +64,6 @@ import { import { CreateOrderChangeDTO, CreateOrderItemDTO, - UpdateReturnReasonDTO, CreateOrderLineItemDTO, CreateOrderLineItemTaxLineDTO, CreateOrderShippingMethodDTO, @@ -73,6 +72,7 @@ import { UpdateOrderLineItemDTO, UpdateOrderLineItemTaxLineDTO, UpdateOrderShippingMethodTaxLineDTO, + UpdateReturnReasonDTO, } from "@types" import { joinerConfig } from "../joiner-config" import { @@ -1991,7 +1991,10 @@ export default class OrderModuleService< for (const item of calculated.order.items) { const isExistingItem = item.id === item.detail?.item_id if (!isExistingItem) { - addedItems[item.id] = item + addedItems[item.id] = { + ...item, + unit_price: item.detail?.unit_price ?? item.unit_price, + } } } @@ -2021,11 +2024,14 @@ export default class OrderModuleService< delete item.actions const newItem = itemsToUpsert.find((d) => d.item_id === item.id)! + const unitPrice = newItem?.unit_price ?? item.unit_price calculated.order.items[idx] = { ...lineItem, actions, quantity: newItem.quantity, + unit_price: unitPrice, + raw_unit_price: new BigNumber(unitPrice), detail: { ...newItem, ...item, diff --git a/packages/modules/order/src/types/utils/index.ts b/packages/modules/order/src/types/utils/index.ts index 0845234463..271e1cbe8b 100644 --- a/packages/modules/order/src/types/utils/index.ts +++ b/packages/modules/order/src/types/utils/index.ts @@ -21,6 +21,7 @@ export type VirtualOrder = { exchange_id?: string item_id?: string + unit_price?: BigNumberInput quantity: BigNumberInput shipped_quantity: BigNumberInput fulfilled_quantity: BigNumberInput diff --git a/packages/modules/order/src/utils/actions/item-update.ts b/packages/modules/order/src/utils/actions/item-update.ts index bd21068d60..3e3d521156 100644 --- a/packages/modules/order/src/utils/actions/item-update.ts +++ b/packages/modules/order/src/utils/actions/item-update.ts @@ -13,6 +13,7 @@ OrderChangeProcessing.registerActionType(ChangeActionType.ITEM_UPDATE, { (item) => item.id === action.details.reference_id ) + const unitPrice = action.details.unit_price const existing = currentOrder.items[existingIndex] existing.detail.quantity ??= 0 @@ -26,6 +27,13 @@ OrderChangeProcessing.registerActionType(ChangeActionType.ITEM_UPDATE, { existing.quantity = quant existing.detail.quantity = quant + if (unitPrice) { + const unitPriceBN = new BigNumber(unitPrice) + + existing.unit_price = unitPriceBN + existing.detail.unit_price = unitPriceBN + } + setActionReference(existing, action, options) return MathBN.mult(existing.unit_price, quantityDiff) diff --git a/packages/modules/order/src/utils/apply-order-changes.ts b/packages/modules/order/src/utils/apply-order-changes.ts index ff71e4210c..e7705d667d 100644 --- a/packages/modules/order/src/utils/apply-order-changes.ts +++ b/packages/modules/order/src/utils/apply-order-changes.ts @@ -57,6 +57,7 @@ export function applyChangesToOrder( order_id: order.id, version, quantity: orderItem.quantity, + unit_price: item.unit_price ?? orderItem.unit_price, fulfilled_quantity: orderItem.fulfilled_quantity ?? 0, delivered_quantity: orderItem.delivered_quantity ?? 0, shipped_quantity: orderItem.shipped_quantity ?? 0, diff --git a/packages/modules/order/src/utils/transform-order.ts b/packages/modules/order/src/utils/transform-order.ts index d0942f1db4..a74076de4f 100644 --- a/packages/modules/order/src/utils/transform-order.ts +++ b/packages/modules/order/src/utils/transform-order.ts @@ -46,6 +46,8 @@ export function formatOrder( ...orderItem.item, quantity: detail.quantity, raw_quantity: detail.raw_quantity, + unit_price: detail.unit_price ?? orderItem.item.unit_price, + raw_unit_price: detail.raw_unit_price ?? orderItem.item.raw_unit_price, detail, } }) @@ -247,6 +249,11 @@ export function mapRepositoryToOrderModel(config, isRelatedEntity = false) { delete conf.where.items.item.quantity } + if (original.unit_price) { + conf.where.items.unit_price = original.unit_price + delete conf.where.items.item.unit_price + } + if (original.detail) { conf.where.items = { ...original.detail,