Skip to content

Commit dabbb0b

Browse files
Update to include discount class filtering
1 parent dcebf24 commit dabbb0b

8 files changed

Lines changed: 115 additions & 53 deletions

discounts/javascript/discount/default/src/generate_cart_run.graphql.liquid

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ query CartInput {
99
}
1010
}
1111
}
12+
discount {
13+
discountClasses
14+
}
1215
}

discounts/javascript/discount/default/src/generate_cart_run.liquid

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// @ts-check
33

44
import {
5+
DiscountClass,
56
OrderDiscountSelectionStrategy,
67
ProductDiscountSelectionStrategy,
78
} from '../generated/api';
@@ -20,6 +21,18 @@ export function generateCartRun(input) {
2021
if (!input.cart.lines.length) {
2122
throw new Error('No cart lines found');
2223
}
24+
25+
const hasOrderDiscountClass = input.discount.discountClasses.includes(
26+
DiscountClass.Order
27+
);
28+
const hasProductDiscountClass = input.discount.discountClasses.includes(
29+
DiscountClass.Product
30+
);
31+
32+
if (!hasOrderDiscountClass && !hasProductDiscountClass) {
33+
return { operations: [] };
34+
}
35+
2336
const maxCartLine = input.cart.lines.reduce((maxLine, line) => {
2437
if (line.cost.subtotalAmount.amount > maxLine.cost.subtotalAmount.amount) {
2538
return line;

discounts/javascript/discount/default/src/generate_delivery_run.graphql.liquid

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ query DeliveryInput {
44
id
55
}
66
}
7+
discount {
8+
discountClasses
9+
}
710
}

discounts/javascript/discount/default/src/generate_delivery_run.liquid

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
{%- if flavor contains "vanilla-js" -%}
22
// @ts-check
33

4-
import { DeliveryDiscountSelectionStrategy} from '../generated/api';
4+
import {
5+
DeliveryDiscountSelectionStrategy,
6+
DiscountClass,
7+
} from "../generated/api";
58

69
/**
710
* @typedef {import("../generated/api").Input} RunInput
@@ -17,6 +20,15 @@ export function generateDeliveryRun(input) {
1720
if (!firstDeliveryGroup) {
1821
throw new Error('No delivery groups found');
1922
}
23+
24+
const hasShippingDiscountClass = input.discount.discountClasses.includes(
25+
DiscountClass.Shipping
26+
);
27+
28+
if (!hasShippingDiscountClass) {
29+
return { operations: [] };
30+
}
31+
2032
return {
2133
operations: [
2234
{

discounts/rust/discount/default/src/generate_cart_run.graphql.liquid

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ query Input {
99
}
1010
}
1111
}
12+
discount {
13+
discountClasses
14+
}
1215
}

discounts/rust/discount/default/src/generate_cart_run.rs

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use cart_lines_discounts_generate_run::output::{
99
ProductDiscountSelectionStrategy, ProductDiscountsAddOperation,
1010
};
1111

12-
use cart_lines_discounts_generate_run::input::ResponseData;
12+
use cart_lines_discounts_generate_run::input::{ResponseData, DiscountClass};
1313

1414
#[shopify_function_target(
1515
target = "cartLinesDiscountsGenerateRun",
@@ -30,38 +30,56 @@ fn generate_cart_run(input: ResponseData) -> Result<CartLinesDiscountsGenerateRu
3030
})
3131
.ok_or("No cart lines found")?;
3232

33+
let has_order_discount_class = input.discount.discount_classes.contains(&DiscountClass::ORDER);
34+
let has_product_discount_class = input.discount.discount_classes.contains(&DiscountClass::PRODUCT);
35+
36+
if !has_order_discount_class && !has_product_discount_class {
37+
return Ok(CartLinesDiscountsGenerateRunResult {
38+
operations: vec![],
39+
});
40+
}
41+
42+
let mut operations = vec![];
43+
44+
// Check if the discount has the ORDER class
45+
if has_order_discount_class {
46+
operations.push(CartOperation::OrderDiscountsAdd(OrderDiscountsAddOperation {
47+
selection_strategy: OrderDiscountSelectionStrategy::FIRST,
48+
candidates: vec![OrderDiscountCandidate {
49+
targets: vec![OrderDiscountCandidateTarget::OrderSubtotal(
50+
OrderSubtotalTarget {
51+
excluded_cart_line_ids: vec![],
52+
},
53+
)],
54+
message: Some("10% OFF ORDER".to_string()),
55+
value: OrderDiscountCandidateValue::Percentage(Percentage {
56+
value: Decimal(10.0),
57+
}),
58+
conditions: None,
59+
associated_discount_code: None,
60+
}],
61+
}));
62+
}
63+
64+
// Check if the discount has the PRODUCT class
65+
if has_product_discount_class {
66+
operations.push(CartOperation::ProductDiscountsAdd(ProductDiscountsAddOperation {
67+
selection_strategy: ProductDiscountSelectionStrategy::FIRST,
68+
candidates: vec![ProductDiscountCandidate {
69+
targets: vec![ProductDiscountCandidateTarget::CartLine(CartLineTarget {
70+
id: max_cart_line.id.clone(),
71+
quantity: None,
72+
})],
73+
message: Some("20% OFF PRODUCT".to_string()),
74+
value: ProductDiscountCandidateValue::Percentage(Percentage {
75+
value: Decimal(20.0),
76+
}),
77+
associated_discount_code: None,
78+
}],
79+
}));
80+
}
81+
3382
Ok(CartLinesDiscountsGenerateRunResult {
34-
operations: vec![
35-
CartOperation::OrderDiscountsAdd(OrderDiscountsAddOperation {
36-
selection_strategy: OrderDiscountSelectionStrategy::FIRST,
37-
candidates: vec![OrderDiscountCandidate {
38-
targets: vec![OrderDiscountCandidateTarget::OrderSubtotal(
39-
OrderSubtotalTarget {
40-
excluded_cart_line_ids: vec![],
41-
},
42-
)],
43-
message: Some("10% OFF ORDER".to_string()),
44-
value: OrderDiscountCandidateValue::Percentage(Percentage {
45-
value: Decimal(10.0),
46-
}),
47-
conditions: None,
48-
associated_discount_code: None,
49-
}],
50-
}),
51-
CartOperation::ProductDiscountsAdd(ProductDiscountsAddOperation {
52-
selection_strategy: ProductDiscountSelectionStrategy::FIRST,
53-
candidates: vec![ProductDiscountCandidate {
54-
targets: vec![ProductDiscountCandidateTarget::CartLine(CartLineTarget {
55-
id: max_cart_line.id.clone(),
56-
quantity: None,
57-
})],
58-
message: Some("20% OFF PRODUCT".to_string()),
59-
value: ProductDiscountCandidateValue::Percentage(Percentage {
60-
value: Decimal(20.0),
61-
}),
62-
associated_discount_code: None,
63-
}],
64-
}),
65-
],
83+
operations,
6684
})
6785
}

discounts/rust/discount/default/src/generate_delivery_run.graphql.liquid

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ query Input {
44
id
55
}
66
}
7+
discount {
8+
discountClasses
9+
}
710
}

discounts/rust/discount/default/src/generate_delivery_run.rs

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use cart_delivery_options_discounts_generate_run::output::{
88
DeliveryOperation, Percentage,
99
};
1010

11-
use cart_delivery_options_discounts_generate_run::input::ResponseData;
11+
use cart_delivery_options_discounts_generate_run::input::{ResponseData, DiscountClass};
1212

1313
#[shopify_function_target(
1414
target = "cartDeliveryOptionsDiscountsGenerateRun",
@@ -18,29 +18,36 @@ use cart_delivery_options_discounts_generate_run::input::ResponseData;
1818
fn generate_delivery_run(
1919
input: ResponseData,
2020
) -> Result<CartDeliveryOptionsDiscountsGenerateRunResult> {
21+
let has_shipping_discount_class = input.discount.discount_classes.contains(&DiscountClass::SHIPPING);
22+
if !has_shipping_discount_class {
23+
return Ok(CartDeliveryOptionsDiscountsGenerateRunResult {
24+
operations: vec![],
25+
});
26+
}
27+
2128
let first_delivery_group = input
2229
.cart
2330
.delivery_groups
2431
.first()
2532
.ok_or("No delivery groups found")?;
2633

2734
Ok(CartDeliveryOptionsDiscountsGenerateRunResult {
28-
operations: vec![DeliveryOperation::DeliveryDiscountsAdd(
29-
DeliveryDiscountsAddOperation {
30-
selection_strategy: DeliveryDiscountSelectionStrategy::ALL,
31-
candidates: vec![DeliveryDiscountCandidate {
32-
targets: vec![DeliveryDiscountCandidateTarget::DeliveryGroup(
33-
DeliveryGroupTarget {
34-
id: first_delivery_group.id.clone(),
35-
},
36-
)],
37-
value: DeliveryDiscountCandidateValue::Percentage(Percentage {
38-
value: Decimal(100.0),
39-
}),
40-
message: Some("FREE DELIVERY".to_string()),
41-
associated_discount_code: None,
42-
}],
43-
},
44-
)],
45-
})
35+
operations: vec![
36+
DeliveryOperation::DeliveryDiscountsAdd(DeliveryDiscountsAddOperation {
37+
selection_strategy: DeliveryDiscountSelectionStrategy::ALL,
38+
candidates: vec![DeliveryDiscountCandidate {
39+
targets: vec![DeliveryDiscountCandidateTarget::DeliveryGroup(
40+
DeliveryGroupTarget {
41+
id: first_delivery_group.id.clone(),
42+
},
43+
)],
44+
value: DeliveryDiscountCandidateValue::Percentage(Percentage {
45+
value: Decimal(100.0),
46+
}),
47+
message: Some("FREE DELIVERY".to_string()),
48+
associated_discount_code: None,
49+
}],
50+
})
51+
],
52+
})
4653
}

0 commit comments

Comments
 (0)