From 528b07a1a45d88b36ad9a4ec617374b2e2a9262d Mon Sep 17 00:00:00 2001 From: Shahed Nasser Date: Wed, 26 Apr 2023 21:34:31 +0300 Subject: [PATCH] docs: added draft order conceptual guide (#3931) --- docs/content/modules/orders/draft-orders.md | 73 +++++++++++++++++++++ docs/content/modules/orders/orders.md | 2 +- docs/content/modules/orders/overview.mdx | 3 +- www/docs/sidebars.js | 7 +- 4 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 docs/content/modules/orders/draft-orders.md diff --git a/docs/content/modules/orders/draft-orders.md b/docs/content/modules/orders/draft-orders.md new file mode 100644 index 0000000000..387a4008f8 --- /dev/null +++ b/docs/content/modules/orders/draft-orders.md @@ -0,0 +1,73 @@ +--- +description: "Learn about draft orders, process around draft orders, and their relation to other entities in the Medusa backend." +--- + +# Draft Orders Architecture Overview + +In this document, you’ll learn about draft orders, process around draft orders, and their relation to other entities in the Medusa backend. + +## Overview + +Merchants may need to manually create orders without any involvement from the customer. This can be useful if the order is being created through a channel that isn’t integrated within your commerce system, or for some reason the customer can’t create the order themselves. + +In Medusa, these types of orders are called draft orders. An admin or a merchant can create a draft order that holds all the details of the order. Then, the draft order can be later transformed into an actual order. + +--- + +## DraftOrder Entity Overview + +Some of the `DraftOrder`'s attributes include: + +- `status`: a string indicating the status of the draft order. Its values can be: + - `open`: the draft order is created, but hasn’t been completed. + - `completed`: the draft order is completed. A draft order is considered completed when the payment for the order has been captured and an order has been created from the draft order. +- `display_id`: a string that can be used as the displayed ID to customers and merchants. +- `canceled_at`: a date indicating when the draft order was canceled. +- `completed_at`: a date indicating when the draft order was completed. +- `no_notification_order`: a boolean indicating whether the customer should receive notifications when the order is updated. + +There are other important attributes discussed in later sections. Check out the [full DraftOrder entity in the entities reference](../../references/entities/classes/DraftOrder.md). + +--- + +## How Draft Orders Work + +You have full freedom in how you choose to implement creating draft orders. This section explains how it’s created in the Medusa backend using the [Create Draft Order](/api/admin#tag/Draft-Orders/operation/PostDraftOrders) and [Register Payment](/api/admin#tag/Draft-Orders/operation/PostDraftOrdersDraftOrderRegisterPayment) endpoints. + +A draft order is created using the `DraftOrderService`'s [create method](../../references/services/classes/DraftOrderService.md#create). Within that method, a cart is created along with it. The cart is used to store the order’s details, such as the draft order’s items, shipping options, and more. The cart has the type `draft_order`. + +Since the draft order is associated with a cart, the process implemented in the Medusa backend around completing the draft order is pretty similar to that of completing a cart. + +The payment must be authorized before the cart can be completed, which can be done using the `CartService`'s [authorizePayment method](../../references/services/classes/CartService.md#authorizepayment). Once the payment is authorized, the order can be created using the `OrderService`'s [createFromCart method](../../references/services/classes/OrderService.md#createfromcart). + +:::note + +In the Register Payment endpoint, the `system` payment method is used by default as the payment session of the cart. This means that the authorization and capturing of the payment don’t actually trigger any processes with existing payment processors integrated into your Medusa backend. It’s expected that the merchant will handle these processes manually. + +::: + +The draft order can then be completed using the `DraftOrderService`'s [registerCartCompletion method](../../references/services/classes/DraftOrderService.md#registercartcompletion). This would update its status to `completed` and would set the `order_id` attribute of the draft order. Finally, you can capture the payment of the order that was created using the `OrderService`'s [capturePayment method](../../references/services/classes/OrderService.md#capturepayment). + +Once the order is created and the draft order is completed, the created order can be processed and handled the same as orders created by customers. + +--- + +## Relation to Other Entities + +### Cart + +A draft order is associated with a [cart](../carts-and-checkout/cart.md) that is used to set the items in the draft order, shipping method, and more. A cart is represented by the `Cart` entity. + +You can access the ID of the draft order’s cart using the `cart_id` attribute. You can also access the cart by expanding the `cart` relation and accessing `draft_order.cart`. + +### Order + +A draft order is associated with an [order](./orders.md) that is created once the draft order is completed. An order is represented by the `Order` entity. + +You can access the ID of the order using the `order_id` attribute. You can also access the order by expanding the `order` relation and accessing `draft_order.order`. + +--- + +## See Also + +- [Order Architecture Overview](./orders.md) diff --git a/docs/content/modules/orders/orders.md b/docs/content/modules/orders/orders.md index 0760784234..dcdd3011d9 100644 --- a/docs/content/modules/orders/orders.md +++ b/docs/content/modules/orders/orders.md @@ -288,7 +288,7 @@ You can access the order’s swaps by expanding the `swap` relation and accessin ### DraftOrder -An order can be associated with a draft order. This would be the draft order that the order was created from. +An order can be associated with a [draft order](./draft-orders.md). This would be the draft order that the order was created from. The draft order’s ID is stored in the `draft_order_id` attribute. You can also access the draft order by expanding the `draft_order` relation and accessing `order.draft_order`. diff --git a/docs/content/modules/orders/overview.mdx b/docs/content/modules/orders/overview.mdx index cca08a3c66..94118b44fa 100644 --- a/docs/content/modules/orders/overview.mdx +++ b/docs/content/modules/orders/overview.mdx @@ -295,12 +295,11 @@ Learn how order-related entities are built, their relation to other modules, and }, { type: 'link', - href: '#', + href: '/modules/orders/draft-orders', label: 'Architecture: Draft Order', customProps: { icon: Icons['circle-stack-solid'], description: 'Learn about the Draft Order architecture.', - isSoon: true, } }, { diff --git a/www/docs/sidebars.js b/www/docs/sidebars.js index 5c2757d6ea..b7325ecee6 100644 --- a/www/docs/sidebars.js +++ b/www/docs/sidebars.js @@ -737,12 +737,9 @@ module.exports = { label: "Claims", }, { - type: "link", - href: "#", + type: "doc", + id: "modules/orders/draft-orders", label: "Draft Orders", - customProps: { - sidebar_is_soon: true, - }, }, { type: "link",