Files
Stiletto/snippets/get-display-discount.liquid
T

176 lines
6.3 KiB
Plaintext
Raw Normal View History

2026-08-12 02:53:22 +00:00
{%- doc -%}
Renders discount text.
2025-11-12 18:26:25 +08:00
2026-08-12 02:53:22 +00:00
@param {object} prod - The product we're getting discounts for. We use 'prod' to avoid collision with the global 'product' object.
@param {object} [variant] - The variant we're getting a discount for. If a variant is supplied, that overrides the product and changes the output.
@param {string} format - The discount format. Format types are listed below.
{%- enddoc -%}
{%- liquid
comment
Discount format types:
2025-11-12 18:26:25 +08:00
- "sale_text"
- "percent_off"
- "minus_percent"
- "save_percent"
- "amount_off"
- "minus_amount"
- "save_amount"
2026-08-12 02:53:22 +00:00
endcomment
2025-11-12 18:26:25 +08:00
2026-08-12 02:53:22 +00:00
assign price_varies = false
2025-11-12 18:26:25 +08:00
2026-08-12 02:53:22 +00:00
if format contains 'percent'
assign is_percent_format = true
else
assign is_percent_format = false
endif
assign prod_price = prod.metafields.app--168074346497.min_auto_discounted_price.value | default: prod.price
2025-11-12 18:26:25 +08:00
assign prod_compare_at_price = prod.compare_at_price
2026-08-12 02:53:22 +00:00
if prod_price < prod.price
assign prod_compare_at_price = prod.price
endif
if prod.compare_at_price > prod_compare_at_price
assign prod_compare_at_price = prod.compare_at_price
endif
2025-11-12 18:26:25 +08:00
if variant
assign prod = variant
assign prod_price = variant.metafields.app--168074346497.auto_discounted_price.value | default: variant.price
assign prod_compare_at_price = variant.compare_at_price
if variant.metafields.app--168074346497.discount_type.value != nil and variant.metafields.app--168074346497.discount_type.value != "fixed" and prod.metafields.app--168074346497.discount_percentage.value > 0.01
assign deducted_percentage = 1.0 | minus: prod.metafields.app--168074346497.discount_percentage.value
if variant.metafields.app--168074346497.discount_percentage.value > 0.01
assign deducted_percentage = 1.0 | minus: variant.metafields.app--168074346497.discount_percentage.value
endif
assign prod_price = variant.price | divided_by: 100.0 | times: deducted_percentage | times: 100.0 | ceil
assign prod_compare_at_price = variant.price
if variant.compare_at_price > prod_compare_at_price
assign prod_compare_at_price = variant.compare_at_price
endif
endif
else
if prod.compare_at_price_varies or prod.price_varies
2026-08-12 02:53:22 +00:00
assign price_varies = true
assign discount_varies = true
2025-11-12 18:26:25 +08:00
2026-08-12 02:53:22 +00:00
# The price may vary, but the amount off may be the same for each variant, so
# we have to check.
assign smallest_discount = 0
assign largest_discount = 0
2025-11-12 18:26:25 +08:00
for variant in prod.variants
assign variant_price = variant.metafields.app--168074346497.auto_discounted_price.value | default: variant.price
assign variant_compare_at_price = variant.compare_at_price
if variant.metafields.app--168074346497.discount_type.value != nil and variant.metafields.app--168074346497.discount_type.value != "fixed" and prod.metafields.app--168074346497.discount_percentage.value > 0.01
assign deducted_percentage = 1.0 | minus: prod.metafields.app--168074346497.discount_percentage.value
if variant.metafields.app--168074346497.discount_percentage.value > 0.01
assign deducted_percentage = 1.0 | minus: variant.metafields.app--168074346497.discount_percentage.value
endif
assign variant_price = variant.price | divided_by: 100.0 | times: deducted_percentage | times: 100.0 | ceil
assign variant_compare_at_price = variant.price
if variant.compare_at_price > variant_compare_at_price
assign variant_compare_at_price = variant.compare_at_price
endif
endif
if variant_compare_at_price > variant_price
2026-08-12 02:53:22 +00:00
if is_percent_format
assign variant_discount = variant_compare_at_price | minus: variant_price | times: 100.00 | divided_by: variant_compare_at_price | round
else
assign variant_discount = variant_compare_at_price | minus: variant_price
2025-11-12 18:26:25 +08:00
endif
2026-08-12 02:53:22 +00:00
if smallest_discount == 0 or variant_discount < smallest_discount
assign smallest_discount = variant_discount
endif
if variant_discount > largest_discount
assign largest_discount = variant_discount
2025-11-12 18:26:25 +08:00
endif
endif
endfor
2026-08-12 02:53:22 +00:00
# If the smallest discount is equal to the largest discount, then the discount doesn't vary
if smallest_discount == largest_discount
assign discount_varies = false
2025-11-12 18:26:25 +08:00
endif
endif
endif
2026-08-12 02:53:22 +00:00
if format == 'sale_text'
if prod_compare_at_price > prod_price
echo 'products.product.on_sale' | t
endif
else
capture displayed_discount
# If the price varies, we've already calculated the largest discount
if price_varies
echo largest_discount
else
if is_percent_format
render 'get-percent-discount', prod: prod
else
render 'get-amount-discount', prod: prod
endif
endif
endcapture
# Because we possibly get this value from a snippet, we have to convert to a number
assign displayed_discount = displayed_discount | plus: 0
unless is_percent_format
assign formatted_currency_discount = displayed_discount | money
endunless
if displayed_discount > 0
case format
when 'percent_off', 'minus_percent', 'amount_off', 'minus_amount'
if discount_varies
echo 'products.product.on_sale_varied_prefix' | t
echo ' '
endif
assign translation_string = 'products.product.on_sale_format_[[format]]' | replace: '[[format]]', format
if format contains 'amount'
echo translation_string | t: value: formatted_currency_discount
else
echo translation_string | t: value: displayed_discount
endif
when 'save_percent', 'save_amount'
capture translation_string
if discount_varies
echo 'products.product.on_sale_format_[[format]]_varied' | replace: '[[format]]', format
else
echo 'products.product.on_sale_format_[[format]]' | replace: '[[format]]', format
endif
endcapture
if format contains 'amount'
echo translation_string | t: value: formatted_currency_discount
else
echo translation_string | t: value: displayed_discount
endif
endcase
endif
endif
2025-11-12 18:26:25 +08:00
-%}