Shopify Script Ruby to Javascript via checkout.liquid

Hi all,

One of my Plus customers have using some pretty hefty full on Scripts to run discounts for wholesale customers etc which have all been working fine. However, to streamline this process and allow anyone from the company to update the discounts more easily they are transitioning all their price/line item based scripts to an app called Discount Ninja.

Unfortunately, DN using a secured checkout method that blocks any Shopify Scripts from running on checkout. Which would be fine as all the scripts are running on the app now however there is still one more important script running. It’s used to hide certain payment methods based on customer tag and it needs to run. Here’s the code for reference:

# ================================ Customizable Settings ================================
# ================================================================
# Hide Gateways For Customer Tag
#
# If we have a matching customer, the entered gateway(s) will be
# hidden.
#
#   - 'customer_tag_match_type' determines whether we look for the customer
#     to be tagged with any of the entered tags or not. Can be:
#       - ':include' to check if the customer is tagged
#       - ':exclude' to make sure the customer isn't tagged
#   - 'customer_tags' is a list of customer tags to trigger the
#     campaign
#   - 'gateway_match_type' determines whether the below strings
#     should be an exact or partial match. Can be:
#       - ':exact' for an exact match
#       - ':partial' for a partial match
#   - 'gateway_names' is a list of strings to identify gateways
# ================================================================
HIDE_GATEWAYS_FOR_CUSTOMER_TAG = [
  {
    customer_tag_match_type: :exclude,
    customer_tags: ["Pay on Invoice"],
    gateway_match_type: :exact,
    gateway_names: ["Pay on Invoice"],
  },
]

# ================================ Script Code (do not edit) ================================
# ================================================================
# CustomerTagSelector
#
# Finds whether the supplied customer has any of the entered tags.
# ================================================================
class CustomerTagSelector
  def initialize(match_type, tags)
    @comparator = match_type == :include ? 'any?' : 'none?'
     = tags.map { |tag| tag.downcase.strip }
  end

  def match?(customer)
    customer_tags = customer.tags.map { |tag| tag.downcase.strip }
    (@tags & customer_tags).send(@comparator)
  end
end

# ================================================================
# GatewayNameSelector
#
# Finds whether the supplied gateway name matches any of the
# entered names.
# ================================================================
class GatewayNameSelector
  def initialize(match_type, gateway_names)
    @comparator = match_type == :exact ? '==' : 'include?'
    _names = gateway_names.map { |name| name.downcase.strip }
  end

  def match?(payment_gateway)
    _names.any? { |name| payment_gateway.name.downcase.strip.send(@comparator, name) }
  end
end

# ================================================================
# HideGatewaysForCustomerTagCampaign
#
# If we have a matching customer, the entered gateway(s) will be
# hidden.
# ================================================================
class HideGatewaysForCustomerTagCampaign
  def initialize(campaigns)
    @campaigns = campaigns
  end

  def run(cart, payment_gateways)
    return if cart.customer.nil?

    @campaigns.each do |campaign|
      customer_tag_selector = CustomerTagSelector.new(
        campaign[:customer_tag_match_type],
        campaign[:customer_tags],
      )

      next unless customer_tag_selector.match?(cart.customer)

      gateway_name_selector = GatewayNameSelector.new(
        campaign[:gateway_match_type],
        campaign[:gateway_names],
      )

      payment_gateways.delete_if do |payment_gateway|
        gateway_name_selector.match?(payment_gateway)
      end
    end
  end
end

CAMPAIGNS = [
  HideGatewaysForCustomerTagCampaign.new(HIDE_GATEWAYS_FOR_CUSTOMER_TAG),
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart, Input.payment_gateways)
end

Output.payment_gateways = Input.payment_gateways

I’ve never done it so wanted to confirm it’s possible to do something like this via JS and call it in through checkout.liquid and for it to actually work. The customer really needs it to run so I need to come up with a solution that doesn’t involved them not using Discount Ninja as it’s one of the only apps that suits ALL of their discount needs.