Migrating a discounted cart subtotal script
Two scripts can look identical here and mean opposite things. One measures what its own earlier lines left behind; the other measures what somebody else’s discount left behind, and only the second is out of anyone’s hands.
Limite de ShopifyIt subtracted the shopper’s discount code from the subtotal first, then compared what was left against its threshold.
Collez-le dans Sauvetage des Scripts et regardez ce qu'il reconstruit
- Copiez le Ruby avec le bouton placé à côté de chaque Script de cette page.
- Dans votre interface Shopify, ouvrez Stackable, puis Outils, puis Sauvetage des Scripts.
- Collez-le, lisez ce que l'outil annonce qu'il va construire et comparez-le aux réglages de cette page.
Sauvetage des Scripts fait partie du forfait Pro. Rien n'est publié tant que vous n'avez pas indiqué la remise de votre ancien Script et que les deux chiffres ne correspondent pas au centime près.
Le Script
Limite de Shopify# GENERATED BY THE SHOPIFY SCRIPT CREATOR APP
# Version 0.12.0
class Qualifier
def compare_amounts(compare, comparison_type, compare_to)
case comparison_type
when :greater_than
return compare > compare_to
when :greater_than_or_equal
return compare >= compare_to
else
raise "Invalid comparison type"
end
end
end
class PostCartAmountQualifier < Qualifier
def initialize(comparison_type, amount)
@comparison_type = comparison_type
@amount = Money.new(cents: amount * 100)
end
def match?(cart, selector = nil)
total = cart.subtotal_price
compare_amounts(total, @comparison_type, @amount)
end
end
class PostCartAmountIncDiscCodeQualifier < PostCartAmountQualifier
def initialize(comparison_type, amount)
super(comparison_type, amount)
end
def match?(cart, selector = nil)
total =
case cart.discount_code
when CartDiscount::Percentage
if cart.subtotal_price >= cart.discount_code.minimum_order_amount
cart_subtotal_without_gc = cart.line_items.reduce(Money.zero) do |total, item|
total + (item.variant.product.gift_card? ? Money.zero : item.line_price)
end
gift_card_amount = cart.subtotal_price - cart_subtotal_without_gc
cart_subtotal_without_gc * ((Decimal.new(100) - cart.discount_code.percentage) / 100) + gift_card_amount
else
cart.subtotal_price
end
when CartDiscount::FixedAmount
if cart.subtotal_price >= cart.discount_code.minimum_order_amount
[cart.subtotal_price - cart.discount_code.amount, Money.zero].max
else
cart.subtotal_price
end
else
cart.subtotal_price
end
compare_amounts(total, @comparison_type, @amount)
end
end
class PercentageDiscount
def initialize(percent, message)
@discount = (100 - percent) / 100.0
@message = message
end
def apply(line_item)
line_item.change_line_price(line_item.line_price * @discount, message: @message)
end
end
class ConditionalDiscount < Campaign
def initialize(condition, customer_qualifier, cart_qualifier, line_item_selector, discount, max_discounts)
super(condition, customer_qualifier, cart_qualifier)
@line_item_selector = line_item_selector
@discount = discount
@items_to_discount = max_discounts == 0 ? nil : max_discounts
end
def run(cart)
raise "Campaign requires a discount" unless @discount
return unless qualifies?(cart)
cart.line_items.each do |item|
@discount.apply(item)
end
end
end
CAMPAIGNS = [
ConditionalDiscount.new(
:all,
nil,
PostCartAmountIncDiscCodeQualifier.new(:greater_than_or_equal, 100),
nil,
PercentageDiscount.new(5, "5% off orders over $100 after discounts"),
0
),
].freeze
CAMPAIGNS.each do |campaign|
campaign.run(Input.cart)
end
Output.cart = Input.cartShopify cannot do this at checkout
Your Script measured its threshold against a subtotal that another discount had already reduced. Discounts at checkout all run at the same moment and cannot see each other's work, so we only ever see the original amounts.
C'est une limite de Shopify et non une lacune de Stackable. Aucune app de remises ne peut le reconstruire aujourd'hui, c'est pourquoi le lien ci-dessous mène à la documentation de Shopify et non à la nôtre.
Lire la documentation de ShopifyClé du motif : platform.postDiscountSubtotal
Il n'y a pas de panier à tester ici, puisque rien n'est construit. Coller ceci produit le message ci-dessus et aucune campagne.
Questions fréquentes
- Will Stackable rebuild this script?
- No, and the reason is stated rather than hidden: Your Script measured its threshold against a subtotal that another discount had already reduced. Discounts at checkout all run at the same moment and cannot see each other's work, so we only ever see the original amounts.
Formes de Script apparentées
A percentage that unlocks once the cart is worth enough.
A flat sum off the order once the cart crosses a value.
Collez votre Script et voyez sa reconstruction
La reconstruction est comparée au montant que facturait votre ancien Script avant que vous puissiez la publier.