From 848172f04f515b470640c692dc4de6757662f868 Mon Sep 17 00:00:00 2001
From: Matthew Wire <mjw@mjwconsult.co.uk>
Date: Mon, 1 May 2023 17:14:47 +0100
Subject: [PATCH] Add ACH direct debit support and disable SEPA if currency NOT
 EUR

---
 CRM/Core/Payment/StripeCheckout.php | 29 ++++++++++++++++++++++++++++-
 CRM/Stripe/Api.php                  |  2 +-
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/CRM/Core/Payment/StripeCheckout.php b/CRM/Core/Payment/StripeCheckout.php
index 8ecde336..9d3aa277 100644
--- a/CRM/Core/Payment/StripeCheckout.php
+++ b/CRM/Core/Payment/StripeCheckout.php
@@ -192,7 +192,7 @@ class CRM_Core_Payment_StripeCheckout extends CRM_Core_Payment_Stripe {
       'customer' => $stripeCustomerID,
       // 'submit_type' => one of 'auto', pay, book, donate
       'client_reference_id' => $propertyBag->getInvoiceID(),
-      'payment_method_types' => \Civi::settings()->get('stripe_checkout_supported_payment_methods'),
+      'payment_method_types' => $this->getSupportedPaymentMethods($propertyBag),
     ];
 
     // Allows you to alter the params passed to StripeCheckout (eg. payment_method_types)
@@ -208,6 +208,33 @@ class CRM_Core_Payment_StripeCheckout extends CRM_Core_Payment_Stripe {
     CRM_Utils_System::redirect($checkoutSession->url);
   }
 
+  /**
+   * @param \Civi\Payment\PropertyBag $propertyBag
+   *
+   * @return array
+   */
+  private function getSupportedPaymentMethods(\Civi\Payment\PropertyBag $propertyBag): array {
+    $paymentMethods = \Civi::settings()->get('stripe_checkout_supported_payment_methods');
+    $result = [];
+    foreach ($paymentMethods as $index => $paymentMethod) {
+      switch ($paymentMethod) {
+        case 'sepa_debit':
+          if ($propertyBag->getCurrency() === 'EUR') {
+            $result[] = $paymentMethod;
+          }
+          break;
+
+        default:
+          $result[] = $paymentMethod;
+      }
+    }
+    if (empty($result)) {
+      throw new PaymentProcessorException('There are no valid Stripe payment methods enabled for this configuration. Check currency etc.');
+    }
+    return $result;
+  }
+
+
   /**
    * Takes the lineitems passed into doPayment and converts them into an array suitable for passing to Stripe Checkout
    *
diff --git a/CRM/Stripe/Api.php b/CRM/Stripe/Api.php
index 6b7ae247..fc179a80 100644
--- a/CRM/Stripe/Api.php
+++ b/CRM/Stripe/Api.php
@@ -296,7 +296,7 @@ class CRM_Stripe_Api {
       // 'promptpay',
       'sepa_debit' => E::ts('SEPA Direct Debit'),
       // 'sofort',
-      //'us_bank_account',
+      'us_bank_account' => E::ts('ACH Direct Debit'),
       // 'wechat_pay',
     ];
   }
-- 
GitLab