Skip to content

Instantly share code, notes, and snippets.

@olance

olance/instructions.md

Last active Dec 12, 2019
Embed
What would you like to do?
Script Shopify Plus permettant de désactiver les moyens de paiement Alma lorsque le panier est trop faible ou trop élevé, ou que le pays de livraison n'est pas la France

Ne fonctionne que pour les clients Shopify Plus, les clients Shopify "standard" n'ayant pas accès à l'app Script Editor.

Le code fourni a été généré avec l'outil Shopify Script Creator ; vous pouvez l'utiliser vous-mêmes pour créer des scénarios plus complexes si besoin.

Instructions

  1. Installez l'app Script Editor sur votre boutique
  2. Dans l'app ("Apps" dans la colonne de gauche puis "Script Editor"), cliquez sur le bouton "Create Script"
  3. Sélectionnez "Payment gateways" et "Blank template", puis cliquez sur "Create script"
  4. Entrez un titre tel que "Affichage Alma"
  5. Dans "Ruby Source Code", supprimez tout le code existant puis copiez/collez le code du fichier ci-dessous
  6. En utilisant la colonne "Cart Input" et le bouton "Run script" dans le panneau "Output", vous pouvez vérifier l'effet du script dans différents cas de figure.

La vidéo ci-dessous montre le process complet, tests compris :

Personnalisation

Le code fourni applique les règles suivantes :

  • Si le montant du panier est inférieur à 100€ ;
  • Ou si le montant du panier est supérieur à 2000€ ;
  • Ou si le code du pays de livraison n'est pas FR ;
  • Ou si le panier contient une carte cadeau (obligation contractuelle) ;
  • Alors, cacher les moyens de paiement qui contiennent le mot "Alma"

Voir ci-dessous pour adapter ce code à vos besoins :

Changer le minimum autorisé

Modifier la ligne 11 du code : changer la valeur 100 par le minimum à utiliser, en Euros.

Note : Si vous choisissez un montant minimum inférieur au montant minimum configuré par Alma sur votre compte, vos clients pourront voir et sélectionner le moyen de paiement Alma sur votre boutique, mais leur paiement sera refusé. Si vous voulez étendre votre plage de montants autorisés, contactez nous.

Changer le maximum autorisé

Modifier la ligne 16 du code : changer la valeur 2000 par le maximum à utiliser, en Euros.

Note : Si vous choisissez un montant maximum supérieur au montant maximum configuré par Alma sur votre compte, vos clients pourront voir et sélectionner le moyen de paiement Alma sur votre boutique, mais leur paiement sera refusé. Si vous voulez étendre votre plage de montants autorisés, contactez nous.

Ajouter des pays de livraison autorisés

Modifier la ligne 20 du code : ajouter, entre les crochets, les codes des pays autorisés en majuscules, entre guillemets et séparés par des virgules.

Par exemple, pour ajouter la Belgique, la ligne 20 devient :

        ["FR", "BE"]

Ne pas restreindre les pays de livraison

Supprimer les lignes 18 à 21, i.e. supprimer cette portion du code :

      CountryCodeQualifier.new(
        :not_one,
        ["FR"] # Pays de livraison autorisés
      )

Appliquer des seuils différents pour le paiement en 3 ou 4 fois

Si vous avez installé plusieurs gateways Alma, vous pouvez utiliser des "Campagnes" différentes pour contrôler l'affichage de chacune en fonction de règles différentes.

Le code ci-dessous remplace les lignes 3 à 47 du code original, afin de :

  • N'afficher le paiement en 3 fois que entre 100€ et 2000€ pour des paniers livrés en France (première "campagne")
  • N'afficher le paiement en 4 fois que entre 400€ et 2000€ pour des paniers livrés en France (deuxième "campagne")
  • Ne pas afficher Alma si le panier contient une carte cadeau (troisième "campagne", obligatoire)

Référez-vous aux paragraphes précédents pour modifier ces seuils et/ou modifier les restrictions de pays.

CAMPAIGNS = [
  ##########################################################################################################
  ### En modifiant les valeurs ci-dessous, vous changez les conditions d'affichage du paiement en 3 fois ###
  ##########################################################################################################
  ConditionallyRemoveGateway.new(
    :all,
    nil,
    OrSelector.new(
      CartAmountQualifier.new(
        :cart,
        :less_than,
        100  # Montant minimum
      ),
      CartAmountQualifier.new(
        :cart,
        :greater_than,
        2000 # Montant maximum
      ),
      CountryCodeQualifier.new(
        :not_one,
        ["FR"] # Pays de livraison autorisés
      )
    ),
    :any,
    nil,
    GatewayNameSelector.new(
      :does,
      :include,
      ["Paiement en 3 fois avec Alma"]
    )
  ),
 
 ##########################################################################################################
 ### En modifiant les valeurs ci-dessous, vous changez les conditions d'affichage du paiement en 4 fois ###
 ##########################################################################################################
 ConditionallyRemoveGateway.new(
    :all,
    nil,
    OrSelector.new(
      CartAmountQualifier.new(
        :cart,
        :less_than,
        400 # Montant minimum
      ),
      CartAmountQualifier.new(
        :cart,
        :greater_than,
        2000 # Montant maximum
      ),
      CountryCodeQualifier.new(
        :not_one,
        ["FR"] # Pays de livraison autorisés
      )
    ),
    :any,
    nil,
    GatewayNameSelector.new(
      :does,
      :include,
      ["Paiement en 4 fois avec Alma"]
    )
  ),
  # Désactive Alma si le panier contient une carte cadeau
  ConditionallyRemoveGateway.new(
    :any,
    nil,
    nil,
    :any,
    GiftCardSelector.new(
      :is
    ),
    GatewayNameSelector.new(
      :does,
      :include,
      ["Alma"]
    )
  )
].freeze
##### Contrôle de l'affichage d'Alma ####
class Campaign;def initialize(condition, *qualifiers);@condition = (condition.to_s + '?').to_sym;@qualifiers = PostCartAmountQualifier ? [] : [] rescue qualifiers.compact;@line_item_selector = qualifiers.last unless @line_item_selector;qualifiers.compact.each do |qualifier|;is_multi_select = qualifier.instance_variable_get(:@conditions).is_a?(Array);if is_multi_select;qualifier.instance_variable_get(:@conditions).each do |nested_q|;@post_amount_qualifier = nested_q if nested_q.is_a?(PostCartAmountQualifier);@qualifiers << qualifier;end;else;@post_amount_qualifier = qualifier if qualifier.is_a?(PostCartAmountQualifier);@qualifiers << qualifier;end;end if @qualifiers.empty?;end;def qualifies?(cart);return true if @qualifiers.empty?;@unmodified_line_items = cart.line_items.map do |item|;new_item = item.dup;new_item.instance_variables.each do |var|;val = item.instance_variable_get(var);new_item.instance_variable_set(var, val.dup) if val.respond_to?(:dup);end;new_item;end if @post_amount_qualifier;@qualifiers.send(@condition) do |qualifier|;is_selector = false;if qualifier.is_a?(Selector) || qualifier.instance_variable_get(:@conditions).any? { |q| q.is_a?(Selector) };is_selector = true;end rescue nil;if is_selector;raise "Missing line item match type" if @li_match_type.nil?;cart.line_items.send(@li_match_type) { |item| qualifier.match?(item) };else;qualifier.match?(cart, @line_item_selector);end;end;end;def run_with_hooks(cart);before_run(cart) if respond_to?(:before_run);run(cart);after_run(cart);end;def after_run(cart);@discount.apply_final_discount if @discount && @discount.respond_to?(:apply_final_discount);revert_changes(cart) unless @post_amount_qualifier.nil? || @post_amount_qualifier.match?(cart);end;def revert_changes(cart);cart.instance_variable_set(:@line_items, @unmodified_line_items);end;end;class ConditionallyRemoveGateway < Campaign;def initialize(condition, customer_qualifier, cart_qualifier, li_match_type, line_item_qualifier, gateway_selector);super(condition, customer_qualifier, cart_qualifier, line_item_qualifier);@li_match_type = (li_match_type.to_s + '?').to_sym;@gateway_selector = gateway_selector;end;def run(gateways, cart);return unless @gateway_selector;gateways.delete_if { |gateway| @gateway_selector.match?(gateway) } if qualifies?(cart);end;end;class OrSelector;def initialize(*conditions);@conditions = conditions.compact;end;def match?(item, selector = nil);@conditions.any? do |condition|;if selector;condition.match?(item, selector);else;condition.match?(item);end;end;end;end;class Qualifier;def partial_match(match_type, item_info, possible_matches);match_type = (match_type.to_s + '?').to_sym;if item_info.kind_of?(Array);possible_matches.any? do |possibility|;item_info.any? do |search|;search.send(match_type, possibility);end;end;else;possible_matches.any? do |possibility|;item_info.send(match_type, possibility);end;end;end;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;when :less_than;return compare < compare_to;when :less_than_or_equal;return compare <= compare_to;when :equal_to;return compare == compare_to;else;raise "Invalid comparison type";end;end;end;class CartAmountQualifier < Qualifier;def initialize(behaviour, comparison_type, amount);@behaviour = behaviour;@comparison_type = comparison_type;@amount = Money.new(cents: amount * 100);end;def match?(cart, selector = nil);total = cart.subtotal_price;if @behaviour == :item || @behaviour == :diff_item;total = cart.line_items.reduce(Money.zero) do |total, item|;total + (selector&.match?(item) ? item.line_price : Money.zero);end;end;case @behaviour;when :cart, :item;compare_amounts(total, @comparison_type, @amount);when :diff_cart;compare_amounts(cart.subtotal_price_was - @amount, @comparison_type, total);when :diff_item;original_line_total = cart.line_items.reduce(Money.zero) do |total, item|;total + (selector&.match?(item) ? item.original_line_price : Money.zero);end;compare_amounts(original_line_total - @amount, @comparison_type, total);end;end;end;class CountryCodeQualifier < Qualifier;def initialize(match_type, country_codes);@invert = match_type == :not_one;@country_codes = country_codes.map(&:upcase);end;def match?(cart, selector = nil);shipping_address = cart.shipping_address;return false if shipping_address&.country_code.nil?;@invert ^ @country_codes.include?(shipping_address.country_code.upcase);end;end;class Selector;def partial_match(match_type, item_info, possible_matches);match_type = (match_type.to_s + '?').to_sym;if item_info.kind_of?(Array);possible_matches.any? do |possibility|;item_info.any? do |search|;search.send(match_type, possibility);end;end;else;possible_matches.any? do |possibility|;item_info.send(match_type, possibility);end;end;end;end;class GatewayNameSelector < Selector;def initialize(match_type, match_condition, names);@match_condition = match_condition;@invert = match_type == :does_not;@names = names.map(&:downcase);end;def match?(gateway);name = gateway.name.downcase;case @match_condition;when :match;return @invert ^ @names.include?(name);else;return @invert ^ partial_match(@match_condition, name, @names);end;end;end;class GiftCardSelector < Selector;def initialize(match_type);@invert = match_type == :not;end;def match?(line_item);@invert ^ line_item.variant.product.gift_card?;end;end;
CAMPAIGNS = [
ConditionallyRemoveGateway.new(
:all,
nil,
OrSelector.new(
CartAmountQualifier.new(
:cart,
:less_than,
100 # Montant minimum
),
CartAmountQualifier.new(
:cart,
:greater_than,
2000 # Montant maximum
),
CountryCodeQualifier.new(
:not_one,
["FR"] # Pays de livraison autorisés
)
),
:any,
nil,
GatewayNameSelector.new(
:does,
:include,
["Alma"]
)
),
# Désactive Alma si le panier contient une carte cadeau
ConditionallyRemoveGateway.new(
:any,
nil,
nil,
:any,
GiftCardSelector.new(
:is
),
GatewayNameSelector.new(
:does,
:include,
["Alma"]
)
)
].freeze
CAMPAIGNS.each do |campaign|
campaign.run(Input.payment_gateways, Input.cart)
end
Output.payment_gateways = Input.payment_gateways
################################################
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment