Shopify Plus : Personnaliser l'affichage

Personnalisez l'affichage d'Alma sur votre site marchand.

❗️

Script Editor va bientôt être déprécié

Nous vous conseillons d'utiliser notre nouvelle fonctionnalité qui remplace celle-ci directement via notre app Alma Badge en suivant ce guide.

🚧

Clients Shopify Plus

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ême 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.

Note : Shopify ne permet d'avoir qu'un seul script de paiement actif à la fois. Si vous aviez déjà un script de paiement actif et comptez le conserver, vous devez ajouter/fusionner le code fourni avec le vôtre.

Code à copier

##### 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
################################################

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 12 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 17 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 21 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 21 devient :

["FR", "BE"]

Ne pas restreindre les pays de livraison

Supprimer les lignes 19 à 22, 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 4 à 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,
      ["Alma - Pay in 3 installments"]
    )
  ),

 ##########################################################################################################
 ### 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,
      ["Alma - Pay in 4 installments"]
    )
  ),
  # 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