feat: allow product selection on discounts allocated to a specific item (#395)

This commit is contained in:
Sebastian Mateos Nicolajsen
2021-10-11 13:46:32 +02:00
committed by GitHub
parent 3d891c9b4f
commit 84d4d791ea
25 changed files with 138 additions and 25 deletions

View File

@@ -106,7 +106,13 @@ class WebshipperFulfillmentService extends FulfillmentService {
const fromOrder = await this.orderService_.retrieve(orderId, {
select: ["total"],
relations: ["discounts", "shipping_address", "returns"],
relations: [
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_address",
"returns",
],
})
const methodData = returnOrder.shipping_method.data
@@ -286,10 +292,11 @@ class WebshipperFulfillmentService extends FulfillmentService {
)) &&
this.invoiceGenerator_.createCertificateOfOrigin
) {
const base64Coo = await this.invoiceGenerator_.createCertificateOfOrigin(
fromOrder,
fulfillmentItems
)
const base64Coo =
await this.invoiceGenerator_.createCertificateOfOrigin(
fromOrder,
fulfillmentItems
)
certificateOfOrigin = await this.client_.documents
.create({
@@ -419,9 +426,8 @@ class WebshipperFulfillmentService extends FulfillmentService {
url: l.url,
tracking_number: l.number,
}))
const [orderId, fulfillmentIndex] = wsOrder.data.attributes.ext_ref.split(
"."
)
const [orderId, fulfillmentIndex] =
wsOrder.data.attributes.ext_ref.split(".")
if (orderId.charAt(0).toLowerCase() === "s") {
if (fulfillmentIndex.startsWith("ful")) {

View File

@@ -44,6 +44,8 @@ class OrderSubscriber {
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"payments",
"fulfillments",
@@ -146,6 +148,8 @@ class OrderSubscriber {
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"payments",
"fulfillments",
@@ -253,6 +257,8 @@ class OrderSubscriber {
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"payments",
"fulfillments",

View File

@@ -320,6 +320,8 @@ class SendGridService extends NotificationService {
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"shipping_methods.shipping_option",
"payments",
@@ -363,6 +365,8 @@ class SendGridService extends NotificationService {
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"shipping_methods.shipping_option",
"payments",
@@ -496,6 +500,8 @@ class SendGridService extends NotificationService {
relations: [
"items",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_address",
"returns",
"swaps",
@@ -601,6 +607,8 @@ class SendGridService extends NotificationService {
relations: [
"items",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_address",
"swaps",
"swaps.additional_items",
@@ -686,7 +694,14 @@ class SendGridService extends NotificationService {
})
const order = await this.orderService_.retrieve(swap.order_id, {
relations: ["items", "discounts", "swaps", "swaps.additional_items"],
relations: [
"items",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"swaps",
"swaps.additional_items",
],
})
let merged = [...order.items]

View File

@@ -40,6 +40,8 @@ class SlackService extends BaseService {
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"payments",
"fulfillments",

View File

@@ -1,4 +1,5 @@
import { MedusaError, Validator } from "medusa-core-utils"
import { defaultRelations } from "."
/**
* @oas [post] /discounts
@@ -96,11 +97,10 @@ export default async (req, res) => {
const discountService = req.scope.resolve("discountService")
const created = await discountService.create(value)
const discount = await discountService.retrieve(created.id, [
"rule",
"rule.valid_for",
"regions",
])
const discount = await discountService.retrieve(
created.id,
defaultRelations
)
res.status(200).json({ discount })
} catch (err) {

View File

@@ -57,6 +57,7 @@ export const defaultCartRelations = [
"payment_sessions",
"shipping_methods.shipping_option",
"discounts",
"discounts.rule",
]
export const defaultCartFields = [

View File

@@ -43,7 +43,14 @@ export default async (req, res) => {
.withTransaction(manager)
.retrieve(draftOrder.cart_id, {
select: ["total"],
relations: ["discounts", "shipping_methods", "region", "items"],
relations: [
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"region",
"items",
],
})
await paymentProviderService

View File

@@ -7,6 +7,8 @@ const defaultRelations = [
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"payments",
"fulfillments",

View File

@@ -202,7 +202,12 @@ export default async (req, res) => {
const order = await orderService
.withTransaction(manager)
.retrieve(id, {
relations: ["items", "discounts"],
relations: [
"items",
"cart",
"cart.discounts",
"cart.discounts.rule",
],
})
await claimService.withTransaction(manager).create({

View File

@@ -221,6 +221,8 @@ export const defaultRelations = [
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"payments",
"fulfillments",
@@ -316,6 +318,8 @@ export const allowedRelations = [
"billing_address",
"shipping_address",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
"payments",
"fulfillments",

View File

@@ -116,4 +116,6 @@ export const defaultRelations = [
"payment_sessions",
"shipping_methods.shipping_option",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
]

View File

@@ -36,6 +36,8 @@ export const defaultRelations = [
"items.variant.product",
"shipping_methods",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"customer",
"payments",
"region",
@@ -74,6 +76,8 @@ export const allowedRelations = [
"items.variant.product",
"shipping_methods",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"customer",
"payments",
"region",

View File

@@ -35,7 +35,7 @@ export class Discount {
@Column({ nullable: true })
rule_id: string
@ManyToOne(() => DiscountRule, { cascade: true, eager: true })
@ManyToOne(() => DiscountRule, { cascade: true })
@JoinColumn({ name: "rule_id" })
rule: DiscountRule

View File

@@ -647,12 +647,13 @@ describe("CartService", () => {
"shipping_address",
"billing_address",
"gift_cards",
"discounts",
"customer",
"region",
"payment_sessions",
"region.countries",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"discounts.regions",
],
{

View File

@@ -13,6 +13,9 @@ describe("DiscountService", () => {
id: IdMap.getId("france"),
}
},
withTransaction: function() {
return this
},
}
const discountService = new DiscountService({

View File

@@ -231,6 +231,8 @@ describe("OrderService", () => {
"payment",
"items",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"gift_cards",
"shipping_methods",
],

View File

@@ -198,6 +198,7 @@ describe("SwapService", () => {
"order.swaps",
"order.swaps.additional_items",
"order.discounts",
"order.discounts.rule",
"additional_items",
"return_order",
"return_order.items",

View File

@@ -166,6 +166,8 @@ class CartService extends BaseService {
relationSet.add("items")
relationSet.add("gift_cards")
relationSet.add("discounts")
relationSet.add("discounts.rule")
relationSet.add("discounts.rule.valid_for")
//relationSet.add("discounts.parent_discount")
//relationSet.add("discounts.parent_discount.rule")
//relationSet.add("discounts.parent_discount.regions")
@@ -600,12 +602,13 @@ class CartService extends BaseService {
"shipping_address",
"billing_address",
"gift_cards",
"discounts",
"customer",
"region",
"payment_sessions",
"region.countries",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"discounts.regions",
],
})
@@ -871,6 +874,7 @@ class CartService extends BaseService {
async applyDiscount(cart, discountCode) {
const discount = await this.discountService_.retrieveByCode(discountCode, [
"rule",
"rule.valid_for",
"regions",
])
@@ -968,7 +972,13 @@ class CartService extends BaseService {
async removeDiscount(cartId, discountCode) {
return this.atomicPhase_(async manager => {
const cart = await this.retrieve(cartId, {
relations: ["discounts", "payment_sessions", "shipping_methods"],
relations: [
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"payment_sessions",
"shipping_methods",
],
})
if (cart.discounts.some(({ rule }) => rule.type === "free_shipping")) {
@@ -1165,6 +1175,8 @@ class CartService extends BaseService {
relations: [
"items",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"gift_cards",
"billing_address",
"shipping_address",
@@ -1317,6 +1329,8 @@ class CartService extends BaseService {
relations: [
"shipping_methods",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods.shipping_option",
"items",
"items.variant",
@@ -1353,7 +1367,12 @@ class CartService extends BaseService {
}
const result = await this.retrieve(cartId, {
relations: ["discounts", "shipping_methods"],
relations: [
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"shipping_methods",
],
})
// if cart has freeshipping, adjust price
@@ -1507,7 +1526,13 @@ class CartService extends BaseService {
async delete(cartId) {
return this.atomicPhase_(async manager => {
const cart = await this.retrieve(cartId, {
relations: ["items", "discounts", "payment_sessions"],
relations: [
"items",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"payment_sessions",
],
})
if (cart.completed_at) {

View File

@@ -180,12 +180,16 @@ class DiscountService extends BaseService {
const discountRepo = manager.getCustomRepository(this.discountRepository_)
const ruleRepo = manager.getCustomRepository(this.discountRuleRepository_)
if (discount.rule?.valid_for) {
discount.rule.valid_for = discount.rule.valid_for.map(id => ({ id }))
}
const validatedRule = this.validateDiscountRule_(discount.rule)
if (discount.regions) {
discount.regions = await Promise.all(
discount.regions.map(regionId =>
this.regionService_.retrieve(regionId)
this.regionService_.withTransaction(manager).retrieve(regionId)
)
)
}
@@ -293,6 +297,9 @@ class DiscountService extends BaseService {
if (rule) {
discount.rule = this.validateDiscountRule_(rule)
if (rule.valid_for) {
discount.rule.valid_for = discount.rule.valid_for.map(id => ({ id }))
}
}
for (const [key, value] of Object.entries(rest)) {

View File

@@ -250,10 +250,10 @@ class DraftOrderService extends BaseService {
}
const {
items,
shipping_methods,
discounts,
no_notification_order,
items,
...rest
} = data

View File

@@ -296,6 +296,8 @@ class OrderService extends BaseService {
relationSet.add("swaps")
relationSet.add("swaps.additional_items")
relationSet.add("discounts")
relationSet.add("discounts.rule")
relationSet.add("discounts.rule.valid_for")
relationSet.add("gift_cards")
relationSet.add("gift_card_transactions")
relationSet.add("refunds")
@@ -453,6 +455,8 @@ class OrderService extends BaseService {
"payment",
"items",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"gift_cards",
"shipping_methods",
],
@@ -1119,6 +1123,8 @@ class OrderService extends BaseService {
],
relations: [
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"region",
"fulfillments",
"shipping_address",

View File

@@ -518,6 +518,8 @@ class ReturnService extends BaseService {
"returns",
"payments",
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"refunds",
"shipping_methods",
"region",

View File

@@ -533,6 +533,7 @@ class SwapService extends BaseService {
"order.swaps",
"order.swaps.additional_items",
"order.discounts",
"order.discounts.rule",
"additional_items",
"return_order",
"return_order.items",

View File

@@ -32,7 +32,13 @@ class OrderSubscriber {
handleOrderPlaced = async data => {
const order = await this.orderService_.retrieve(data.id, {
select: ["subtotal"],
relations: ["discounts", "items", "gift_cards"],
relations: [
"discounts",
"discounts.rule",
"discounts.rule.valid_for",
"items",
"gift_cards",
],
})
await Promise.all(

View File

@@ -4608,6 +4608,11 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
iso8601-duration@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/iso8601-duration/-/iso8601-duration-1.3.0.tgz#29d7b69e0574e4acdee50c5e5e09adab4137ba5a"
integrity sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ==
isobject@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"