import { Connection } from "typeorm" import faker from "faker" import { Customer, Order, PaymentStatus, FulfillmentStatus, SalesChannel, Discount, isString, } from "@medusajs/medusa" import { DiscountFactoryData, simpleDiscountFactory, } from "./simple-discount-factory" import { RegionFactoryData, simpleRegionFactory } from "./simple-region-factory" import { LineItemFactoryData, simpleLineItemFactory, } from "./simple-line-item-factory" import { AddressFactoryData, simpleAddressFactory, } from "./simple-address-factory" import { ShippingMethodFactoryData, simpleShippingMethodFactory, } from "./simple-shipping-method-factory" import { SalesChannelFactoryData, simpleSalesChannelFactory, } from "../../api/factories" import { isDefined } from "medusa-core-utils" export type OrderFactoryData = { id?: string payment_status?: PaymentStatus fulfillment_status?: FulfillmentStatus region?: RegionFactoryData | string email?: string | null currency_code?: string tax_rate?: number | null sales_channel?: string | SalesChannelFactoryData line_items?: LineItemFactoryData[] discounts?: DiscountFactoryData[] shipping_address?: AddressFactoryData shipping_methods?: ShippingMethodFactoryData[] } export const simpleOrderFactory = async ( connection: Connection, data: OrderFactoryData = {}, seed: number ): Promise => { if (typeof seed !== "undefined") { faker.seed(seed) } const manager = connection.manager let currencyCode: string let regionId: string let taxRate: number if (typeof data.region === "string") { currencyCode = data.currency_code regionId = data.region taxRate = data.tax_rate } else { const region = await simpleRegionFactory(connection, data.region) taxRate = typeof data.tax_rate !== "undefined" ? data.tax_rate : region.tax_rate currencyCode = region.currency_code regionId = region.id } const address = await simpleAddressFactory(connection, data.shipping_address) const customerToSave = manager.create(Customer, { email: typeof data.email !== "undefined" ? data.email : faker.internet.email(), }) const customer = await manager.save(customerToSave) let discounts: Discount[] = [] if (typeof data.discounts !== "undefined") { discounts = await Promise.all( data.discounts.map((d) => simpleDiscountFactory(connection, d, seed)) ) } const id = data.id || `simple-order-${Math.random() * 1000}` const toCreate: Partial = { id, discounts, payment_status: data.payment_status ?? PaymentStatus.AWAITING, fulfillment_status: data.fulfillment_status ?? FulfillmentStatus.NOT_FULFILLED, customer_id: customer.id, email: customer.email, region_id: regionId, currency_code: currencyCode, tax_rate: taxRate, shipping_address_id: address.id, } let sc_id if (isDefined(data.sales_channel)) { let sc if (isString(data.sales_channel)) { sc = await manager.findOne(SalesChannel, { where: { id: data.sales_channel }, }) } if (!sc) { sc = await simpleSalesChannelFactory( connection, isString(data.sales_channel) ? { id: data.sales_channel } : data.sales_channel ) } sc_id = sc.id } if (sc_id) { toCreate.sales_channel_id = sc_id } const toSave = manager.create(Order, toCreate) const order = await manager.save(Order, toSave) const shippingMethods = data.shipping_methods || [] for (const sm of shippingMethods) { await simpleShippingMethodFactory(connection, { ...sm, order_id: order.id }) } const items = data.line_items || [] for (const item of items) { await simpleLineItemFactory(connection, { ...item, order_id: id }) } return order }