Files
medusa-store/packages/medusa/src/models/order.ts
T
Adrien de Peretti b54d5178c9 feat(medusa): Migrate and fix order service (#1894)
* feat(medusa): Migrate and fix order service

* fix(medusa): Order service pass Payment instead of the session:

* fix(medusa): Remove unnecessary method in the client library

* test(medusa): Fix unit tests

* test(medusa): Fix unit tests

* fix(medusa): Typo

* test(meduas): fix unit test

* feat(medusa): Update base service used and missing transaction

* test(meduas): fix unit test

* fix(medusa): cleanup and missing transaction

* fix(medusa): missing withTransaction on some mocks

* feat(medusa): Update order service method visibility

* include feedback

* feat(medusa); revert order payment status"

* test(medusa): fix unit

Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
2022-08-01 11:01:17 +02:00

419 lines
9.8 KiB
TypeScript

import {
BeforeInsert,
Column,
Entity,
Generated,
Index,
JoinColumn,
JoinTable,
ManyToMany,
ManyToOne,
OneToMany,
OneToOne,
} from "typeorm"
import { BaseEntity } from "../interfaces/models/base-entity"
import {
DbAwareColumn,
resolveDbGenerationStrategy,
resolveDbType,
} from "../utils/db-aware-column"
import { manualAutoIncrement } from "../utils/manual-auto-increment"
import { Address } from "./address"
import { Cart } from "./cart"
import { ClaimOrder } from "./claim-order"
import { Currency } from "./currency"
import { Customer } from "./customer"
import { Discount } from "./discount"
import { DraftOrder } from "./draft-order"
import { Fulfillment } from "./fulfillment"
import { GiftCard } from "./gift-card"
import { GiftCardTransaction } from "./gift-card-transaction"
import { LineItem } from "./line-item"
import { Payment } from "./payment"
import { Refund } from "./refund"
import { Region } from "./region"
import { Return } from "./return"
import { ShippingMethod } from "./shipping-method"
import { Swap } from "./swap"
import { generateEntityId } from "../utils/generate-entity-id"
import {
FeatureFlagColumn,
FeatureFlagDecorators,
} from "../utils/feature-flag-decorators"
import { SalesChannel } from "./sales-channel"
export enum OrderStatus {
PENDING = "pending",
COMPLETED = "completed",
ARCHIVED = "archived",
CANCELED = "canceled",
REQUIRES_ACTION = "requires_action",
}
export enum FulfillmentStatus {
NOT_FULFILLED = "not_fulfilled",
PARTIALLY_FULFILLED = "partially_fulfilled",
FULFILLED = "fulfilled",
PARTIALLY_SHIPPED = "partially_shipped",
SHIPPED = "shipped",
PARTIALLY_RETURNED = "partially_returned",
RETURNED = "returned",
CANCELED = "canceled",
REQUIRES_ACTION = "requires_action",
}
export enum PaymentStatus {
NOT_PAID = "not_paid",
AWAITING = "awaiting",
CAPTURED = "captured",
PARTIALLY_REFUNDED = "partially_refunded",
REFUNDED = "refunded",
CANCELED = "canceled",
REQUIRES_ACTION = "requires_action",
}
@Entity()
export class Order extends BaseEntity {
readonly object = "order"
@DbAwareColumn({ type: "enum", enum: OrderStatus, default: "pending" })
status: OrderStatus
@DbAwareColumn({
type: "enum",
enum: FulfillmentStatus,
default: "not_fulfilled",
})
fulfillment_status: FulfillmentStatus
@DbAwareColumn({ type: "enum", enum: PaymentStatus, default: "not_paid" })
payment_status: PaymentStatus
@Index()
@Column()
@Generated(resolveDbGenerationStrategy("increment"))
display_id: number
@Index()
@Column({ nullable: true })
cart_id: string
@OneToOne(() => Cart)
@JoinColumn({ name: "cart_id" })
cart: Cart
@Index()
@Column()
customer_id: string
@ManyToOne(() => Customer, { cascade: ["insert"] })
@JoinColumn({ name: "customer_id" })
customer: Customer
@Column()
email: string
@Index()
@Column({ nullable: true })
billing_address_id: string
@ManyToOne(() => Address, { cascade: ["insert"] })
@JoinColumn({ name: "billing_address_id" })
billing_address: Address
@Index()
@Column({ nullable: true })
shipping_address_id: string
@ManyToOne(() => Address, { cascade: ["insert"] })
@JoinColumn({ name: "shipping_address_id" })
shipping_address: Address
@Index()
@Column()
region_id: string
@ManyToOne(() => Region)
@JoinColumn({ name: "region_id" })
region: Region
@Column()
currency_code: string
@ManyToOne(() => Currency)
@JoinColumn({ name: "currency_code", referencedColumnName: "code" })
currency: Currency
@Column({ type: "real", nullable: true })
tax_rate: number | null
@ManyToMany(() => Discount, { cascade: ["insert"] })
@JoinTable({
name: "order_discounts",
joinColumn: {
name: "order_id",
referencedColumnName: "id",
},
inverseJoinColumn: {
name: "discount_id",
referencedColumnName: "id",
},
})
discounts: Discount[]
@ManyToMany(() => GiftCard, { cascade: ["insert"] })
@JoinTable({
name: "order_gift_cards",
joinColumn: {
name: "order_id",
referencedColumnName: "id",
},
inverseJoinColumn: {
name: "gift_card_id",
referencedColumnName: "id",
},
})
gift_cards: GiftCard[]
@OneToMany(() => ShippingMethod, (method) => method.order, {
cascade: ["insert"],
})
shipping_methods: ShippingMethod[]
@OneToMany(() => Payment, (payment) => payment.order, { cascade: ["insert"] })
payments: Payment[]
@OneToMany(() => Fulfillment, (fulfillment) => fulfillment.order, {
cascade: ["insert"],
})
fulfillments: Fulfillment[]
@OneToMany(() => Return, (ret) => ret.order, { cascade: ["insert"] })
returns: Return[]
@OneToMany(() => ClaimOrder, (co) => co.order, { cascade: ["insert"] })
claims: ClaimOrder[]
@OneToMany(() => Refund, (ref) => ref.order, { cascade: ["insert"] })
refunds: Refund[]
@OneToMany(() => Swap, (swap) => swap.order, { cascade: ["insert"] })
swaps: Swap[]
@Column({ nullable: true })
draft_order_id: string
@OneToOne(() => DraftOrder)
@JoinColumn({ name: "draft_order_id" })
draft_order: DraftOrder
@OneToMany(() => LineItem, (lineItem) => lineItem.order, {
cascade: ["insert"],
})
items: LineItem[]
@OneToMany(() => GiftCardTransaction, (gc) => gc.order)
gift_card_transactions: GiftCardTransaction[]
@Column({ nullable: true, type: resolveDbType("timestamptz") })
canceled_at: Date
@DbAwareColumn({ type: "jsonb", nullable: true })
metadata: Record<string, unknown>
@Column({ type: "boolean", nullable: true })
no_notification: boolean
@Column({ nullable: true })
idempotency_key: string
@Column({ type: "varchar", nullable: true })
external_id: string | null
@FeatureFlagColumn("sales_channels", { type: "varchar", nullable: true })
sales_channel_id: string | null
@FeatureFlagDecorators("sales_channels", [
ManyToOne(() => SalesChannel),
JoinColumn({ name: "sales_channel_id" }),
])
sales_channel: SalesChannel
// Total fields
shipping_total: number
discount_total: number
tax_total: number | null
refunded_total: number
total: number
subtotal: number
paid_total: number
refundable_amount: number
gift_card_total: number
gift_card_tax_total: number
@BeforeInsert()
private async beforeInsert(): Promise<void> {
this.id = generateEntityId(this.id, "order")
if (process.env.NODE_ENV === "development" && !this.display_id) {
const disId = await manualAutoIncrement("order")
if (disId) {
this.display_id = disId
}
}
}
}
/**
* @schema order
* title: "Order"
* description: "Represents an order"
* x-resourceId: order
* properties:
* id:
* type: string
* status:
* type: string
* enum:
* - pending
* - completed
* - archived
* - canceled
* - requires_action
* fulfillment_status:
* type: string
* enum:
* - not_fulfilled
* - partially_fulfilled
* - fulfilled
* - partially_shipped
* - shipped
* - partially_returned
* - returned
* - canceled
* - requires_action
* payment_status:
* type: string
* enum:
* - not_paid
* - awaiting
* - captured
* - partially_refunded
* - refuneded
* - canceled
* - requires_action
* display_id:
* type: integer
* cart_id:
* type: string
* currency_code:
* type: string
* tax_rate:
* type: number
* discounts:
* type: array
* items:
* $ref: "#/components/schemas/discount"
* email:
* type: string
* billing_address_id:
* type: string
* billing_address:
* anyOf:
* - $ref: "#/components/schemas/address"
* shipping_address_id:
* type: string
* shipping_address:
* anyOf:
* - $ref: "#/components/schemas/address"
* items:
* type: array
* items:
* $ref: "#/components/schemas/line_item"
* region_id:
* type: string
* region:
* anyOf:
* - $ref: "#/components/schemas/region"
* gift_cards:
* type: array
* items:
* $ref: "#/components/schemas/gift_card"
* customer_id:
* type: string
* customer:
* anyOf:
* - $ref: "#/components/schemas/customer"
* payment_session:
* anyOf:
* - $ref: "#/components/schemas/payment_session"
* payment_sessions:
* type: array
* items:
* $ref: "#/components/schemas/payment_session"
* payments:
* type: array
* items:
* $ref: "#/components/schemas/payment"
* shipping_methods:
* type: array
* items:
* $ref: "#/components/schemas/shipping_method"
* fulfillments:
* type: array
* items:
* $ref: "#/components/schemas/fulfillment"
* returns:
* type: array
* items:
* $ref: "#/components/schemas/return"
* claims:
* type: array
* items:
* $ref: "#/components/schemas/claim_order"
* refunds:
* type: array
* items:
* $ref: "#/components/schemas/refund"
* swaps:
* type: array
* items:
* $ref: "#/components/schemas/refund"
* gift_card_transactions:
* type: array
* items:
* $ref: "#/components/schemas/gift_card_transaction"
* canceled_at:
* type: string
* format: date-time
* created_at:
* type: string
* format: date-time
* update_at:
* type: string
* format: date-time
* deleted_at:
* type: string
* format: date-time
* metadata:
* type: object
* shipping_total:
* type: integer
* discount_total:
* type: integer
* tax_total:
* type: integer
* subtotal:
* type: integer
* refundable_amount:
* type: integer
* gift_card_total:
* type: integer
* paid_total:
* type: integer
* no_notification:
* description: "Flag for describing whether or not notifications related to this should be send."
* type: boolean
*/