Bug: [ENHANCEMENT] payout updates



Creating this ticket for

1. Adding currency as a rule for payout routing
2. Updating Sepa to SepaBankTransfer for dynamic required fields
diff --git a/crates/euclid/src/frontend/dir.rs b/crates/euclid/src/frontend/dir.rs
index 7df086fdbcb..62dbefab3f3 100644
--- a/crates/euclid/src/frontend/dir.rs
+++ b/crates/euclid/src/frontend/dir.rs
@@ -836,6 +836,14 @@ pub enum PayoutDirKeyKind {
     #[serde(rename = "amount")]
     PayoutAmount,
 
+    #[strum(
+        serialize = "currency",
+        detailed_message = "Currency used for the payout",
+        props(Category = "Order details")
+    )]
+    #[serde(rename = "currency")]
+    PayoutCurrency,
+
     #[strum(
         serialize = "payment_method",
         detailed_message = "Different modes of payout - eg. cards, wallets, banks",
@@ -874,6 +882,8 @@ pub enum PayoutDirValue {
     BusinessLabel(types::StrValue),
     #[serde(rename = "amount")]
     PayoutAmount(types::NumValue),
+    #[serde(rename = "currency")]
+    PayoutCurrency(enums::PaymentCurrency),
     #[serde(rename = "payment_method")]
     PayoutType(common_enums::PayoutType),
     #[serde(rename = "wallet")]
diff --git a/crates/euclid/src/types.rs b/crates/euclid/src/types.rs
index 99b94f2a67b..44d0816be29 100644
--- a/crates/euclid/src/types.rs
+++ b/crates/euclid/src/types.rs
@@ -55,6 +55,9 @@ pub enum EuclidKey {
     PaymentAmount,
     #[strum(serialize = "currency")]
     PaymentCurrency,
+    #[cfg(feature = "payouts")]
+    #[strum(serialize = "payout_currency")]
+    PayoutCurrency,
     #[strum(serialize = "country", to_string = "business_country")]
     BusinessCountry,
     #[strum(serialize = "billing_country")]
@@ -149,6 +152,8 @@ impl EuclidKey {
             Self::CaptureMethod => DataType::EnumVariant,
             Self::PaymentAmount => DataType::Number,
             Self::PaymentCurrency => DataType::EnumVariant,
+            #[cfg(feature = "payouts")]
+            Self::PayoutCurrency => DataType::EnumVariant,
             Self::BusinessCountry => DataType::EnumVariant,
             Self::BillingCountry => DataType::EnumVariant,
             Self::MandateType => DataType::EnumVariant,
@@ -274,6 +279,8 @@ pub enum EuclidValue {
     MandateType(enums::MandateType),
     PaymentAmount(NumValue),
     PaymentCurrency(enums::Currency),
+    #[cfg(feature = "payouts")]
+    PayoutCurrency(enums::Currency),
     BusinessCountry(enums::Country),
     BillingCountry(enums::Country),
     BusinessLabel(StrValue),
@@ -309,6 +316,8 @@ impl EuclidValue {
             Self::CaptureMethod(_) => EuclidKey::CaptureMethod,
             Self::PaymentAmount(_) => EuclidKey::PaymentAmount,
             Self::PaymentCurrency(_) => EuclidKey::PaymentCurrency,
+            #[cfg(feature = "payouts")]
+            Self::PayoutCurrency(_) => EuclidKey::PayoutCurrency,
             Self::BusinessCountry(_) => EuclidKey::BusinessCountry,
             Self::BillingCountry(_) => EuclidKey::BillingCountry,
             Self::BusinessLabel(_) => EuclidKey::BusinessLabel,
diff --git a/crates/euclid_wasm/src/lib.rs b/crates/euclid_wasm/src/lib.rs
index c0e58520c71..2aaee43f7eb 100644
--- a/crates/euclid_wasm/src/lib.rs
+++ b/crates/euclid_wasm/src/lib.rs
@@ -445,6 +445,7 @@ pub fn get_payout_variant_values(key: &str) -> Result<JsValue, JsValue> {
     let variants: &[&str] = match key {
         dir::PayoutDirKeyKind::BusinessCountry => dir_enums::BusinessCountry::VARIANTS,
         dir::PayoutDirKeyKind::BillingCountry => dir_enums::BillingCountry::VARIANTS,
+        dir::PayoutDirKeyKind::PayoutCurrency => dir_enums::PaymentCurrency::VARIANTS,
         dir::PayoutDirKeyKind::PayoutType => dir_enums::PayoutType::VARIANTS,
         dir::PayoutDirKeyKind::WalletType => dir_enums::PayoutWalletType::VARIANTS,
         dir::PayoutDirKeyKind::BankTransferType => dir_enums::PayoutBankTransferType::VARIANTS,
diff --git a/crates/router/src/configs/defaults/payout_required_fields.rs b/crates/router/src/configs/defaults/payout_required_fields.rs
index d6b316c42b4..24c13ec5396 100644
--- a/crates/router/src/configs/defaults/payout_required_fields.rs
+++ b/crates/router/src/configs/defaults/payout_required_fields.rs
@@ -38,7 +38,7 @@ impl Default for PayoutRequiredFields {
                     // Adyen
                     get_connector_payment_method_type_fields(
                         PayoutConnectors::Adyenplatform,
-                        PaymentMethodType::Sepa,
+                        PaymentMethodType::SepaBankTransfer,
                     ),
                     // Ebanx
                     get_connector_payment_method_type_fields(
@@ -117,7 +117,7 @@ fn get_billing_details_for_payment_method(
             ]);
 
             // Add first_name for bank payouts only
-            if payment_method_type == PaymentMethodType::Sepa {
+            if payment_method_type == PaymentMethodType::SepaBankTransfer {
                 fields.insert(
                     "billing.address.first_name".to_string(),
                     RequiredFieldInfo {
@@ -209,7 +209,7 @@ fn get_connector_payment_method_type_fields(
                 },
             )
         }
-        PaymentMethodType::Sepa => {
+        PaymentMethodType::SepaBankTransfer => {
             common_fields.extend(get_sepa_fields());
             (
                 payment_method_type,

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [x] Bugfix
- [ ] New feature
- [x] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
This PR adds two changes
1. Updates `Sepa` to `SepaBankTransfer` for dynamic required fields for payouts
2. Adds PayoutCurrency as a rule to be set while configuring payout routing on dashboard

### Additional Changes

- [ ] This PR modifies the API contract
- [ ] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!--
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
3. `crates/router/src/configs`
4. `loadtest/config`
-->


## Motivation and Context
Two things -
1. Allows for configuring currency as a rule for payout routing
2. Sends back required fields in the response for `sepa_bank_transfer`

## How did you test it?
<details>
    <summary>Create a payout link</summary>

cURL

    curl --location --request POST 'http://localhost:8080/payouts/create' \
        --header 'Content-Type: application/json' \
        --header 'api-key: dev_ps5hUWh9tfDFtu9IO0MAaK3tbLTAWscvZlCanmGmTELIWPYCJPWVHkUXWeEGDWig' \
        --data '{"merchant_order_reference_id":"ref123","amount":213,"currency":"EUR","customer_id":"cus_uEIQdrEFaB5iVfAUSTrU","description":"Its my first payout request","entity_type":"Individual","auto_fulfill":true,"session_expiry":1000000,"profile_id":"pro_0U7D6dU6lAplreXCcFs6","payout_link":true,"return_url":"https://www.google.com","payout_link_config":{"form_layout":"tabs","theme":"#0066ff","logo":"https://hyperswitch.io/favicon.ico","merchant_name":"HyperSwitch Inc.","test_mode":true},"billing":{"address":{"line1":"1467","line2":"Harrison Street","line3":"Harrison Street","city":"London","zip":"94122","country":"NL","first_name":"John","last_name":"Nether"}}}'

Response

    {"payout_id":"payout_Eyodo5H37xucxcfnGhJR","merchant_id":"merchant_1759230162","merchant_order_reference_id":"ref123","amount":213,"currency":"EUR","connector":null,"payout_type":null,"payout_method_data":null,"billing":{"address":{"city":"London","country":"NL","line1":"1467","line2":"Harrison Street","line3":"Harrison Street","zip":"94122","state":null,"first_name":"John","last_name":"Nether","origin_zip":null},"phone":null,"email":null},"auto_fulfill":true,"customer_id":"cus_uEIQdrEFaB5iVfAUSTrU","customer":{"id":"cus_uEIQdrEFaB5iVfAUSTrU","name":"Albert Klaassen","email":null,"phone":"6168205362","phone_country_code":"+1"},"client_secret":"payout_payout_Eyodo5H37xucxcfnGhJR_secret_ht1Pkut3UyldsRln2A8w","return_url":"https://www.google.com","business_country":null,"business_label":null,"description":"Its my first payout request","entity_type":"Individual","recurring":false,"metadata":{},"merchant_connector_id":null,"status":"requires_payout_method_data","error_message":null,"error_code":null,"profile_id":"pro_0U7D6dU6lAplreXCcFs6","created":"2025-09-30T11:03:02.998Z","connector_transaction_id":null,"priority":null,"payout_link":{"payout_link_id":"payout_link_oI2b4wNeAez056omVVCT","link":"http://localhost:8080/payout_link/merchant_1759230162/payout_Eyodo5H37xucxcfnGhJR?locale=en"},"email":null,"name":"Albert Klaassen","phone":"6168205362","phone_country_code":"+1","unified_code":null,"unified_message":null,"payout_method_id":null}

</details>

<details>
    <summary>Required fields embedded in payout links</summary>

Expectation
- `sepa_bank_transfer` must not be null


    "enabled_payment_methods_with_required_fields": [
    {
      "payment_method": "card",
      "payment_method_types_info": [
        {
          "payment_method_type": "credit",
          "required_fields": {
            "payout_method_data.card.card_holder_name": {
              "required_field": "payout_method_data.card.card_holder_name",
              "display_name": "card_holder_name",
              "field_type": "user_full_name",
              "value": null
            },
            "payout_method_data.card.card_number": {
              "required_field": "payout_method_data.card.card_number",
              "display_name": "card_number",
              "field_type": "user_card_number",
              "value": null
            },
            "billing.address.city": {
              "required_field": "billing.address.city",
              "display_name": "billing_address_city",
              "field_type": "text",
              "value": "London"
            },
            "billing.address.line1": {
              "required_field": "billing.address.line1",
              "display_name": "billing_address_line1",
              "field_type": "text",
              "value": "1467"
            },
            "payout_method_data.card.expiry_year": {
              "required_field": "payout_method_data.card.expiry_year",
              "display_name": "exp_year",
              "field_type": "user_card_expiry_year",
              "value": null
            },
            "billing.address.country": {
              "required_field": "billing.address.country",
              "display_name": "billing_address_country",
              "field_type": {
                "user_address_country": {
                  "options": [
                    "ES",
                    "SK",
                    "AT",
                    "NL",
                    "DE",
                    "BE",
                    "FR",
                    "FI",
                    "PT",
                    "IE",
                    "EE",
                    "LT",
                    "LV",
                    "IT",
                    "CZ",
                    "DE",
                    "HU",
                    "NO",
                    "PL",
                    "SE",
                    "GB",
                    "CH"
                  ]
                }
              },
              "value": "NL"
            },
            "billing.address.line2": {
              "required_field": "billing.address.line2",
              "display_name": "billing_address_line2",
              "field_type": "text",
              "value": "Harrison Street"
            },
            "payout_method_data.card.expiry_month": {
              "required_field": "payout_method_data.card.expiry_month",
              "display_name": "exp_month",
              "field_type": "user_card_expiry_month",
              "value": null
            }
          }
        },
        {
          "payment_method_type": "debit",
          "required_fields": {
            "payout_method_data.card.card_number": {
              "required_field": "payout_method_data.card.card_number",
              "display_name": "card_number",
              "field_type": "user_card_number",
              "value": null
            },
            "billing.address.line1": {
              "required_field": "billing.address.line1",
              "display_name": "billing_address_line1",
              "field_type": "text",
              "value": "1467"
            },
            "payout_method_data.card.expiry_month": {
              "required_field": "payout_method_data.card.expiry_month",
              "display_name": "exp_month",
              "field_type": "user_card_expiry_month",
              "value": null
            },
            "payout_method_data.card.expiry_year": {
              "required_field": "payout_method_data.card.expiry_year",
              "display_name": "exp_year",
              "field_type": "user_card_expiry_year",
              "value": null
            },
            "payout_method_data.card.card_holder_name": {
              "required_field": "payout_method_data.card.card_holder_name",
              "display_name": "card_holder_name",
              "field_type": "user_full_name",
              "value": null
            },
            "billing.address.country": {
              "required_field": "billing.address.country",
              "display_name": "billing_address_country",
              "field_type": {
                "user_address_country": {
                  "options": [
                    "ES",
                    "SK",
                    "AT",
                    "NL",
                    "DE",
                    "BE",
                    "FR",
                    "FI",
                    "PT",
                    "IE",
                    "EE",
                    "LT",
                    "LV",
                    "IT",
                    "CZ",
                    "DE",
                    "HU",
                    "NO",
                    "PL",
                    "SE",
                    "GB",
                    "CH"
                  ]
                }
              },
              "value": "NL"
            },
            "billing.address.line2": {
              "required_field": "billing.address.line2",
              "display_name": "billing_address_line2",
              "field_type": "text",
              "value": "Harrison Street"
            },
            "billing.address.city": {
              "required_field": "billing.address.city",
              "display_name": "billing_address_city",
              "field_type": "text",
              "value": "London"
            }
          }
        }
      ]
    },
    {
      "payment_method": "bank_transfer",
      "payment_method_types_info": [
        {
          "payment_method_type": "sepa_bank_transfer",
          "required_fields": {
            "billing.address.line2": {
              "required_field": "billing.address.line2",
              "display_name": "billing_address_line2",
              "field_type": "text",
              "value": "Harrison Street"
            },
            "billing.address.city": {
              "required_field": "billing.address.city",
              "display_name": "billing_address_city",
              "field_type": "text",
              "value": "London"
            },
            "billing.address.line1": {
              "required_field": "billing.address.line1",
              "display_name": "billing_address_line1",
              "field_type": "text",
              "value": "1467"
            },
            "payout_method_data.bank.iban": {
              "required_field": "payout_method_data.bank.iban",
              "display_name": "iban",
              "field_type": "text",
              "value": null
            },
            "billing.address.first_name": {
              "required_field": "billing.address.first_name",
              "display_name": "billing_address_first_name",
              "field_type": "text",
              "value": "John"
            },
            "billing.address.country": {
              "required_field": "billing.address.country",
              "display_name": "billing_address_country",
              "field_type": {
                "user_address_country": {
                  "options": [
                    "ES",
                    "SK",
                    "AT",
                    "NL",
                    "DE",
                    "BE",
                    "FR",
                    "FI",
                    "PT",
                    "IE",
                    "EE",
                    "LT",
                    "LV",
                    "IT",
                    "CZ",
                    "DE",
                    "HU",
                    "NO",
                    "PL",
                    "SE",
                    "GB",
                    "CH"
                  ]
                }
              },
              "value": "NL"
            },
            "payout_method_data.bank.bic": {
              "required_field": "payout_method_data.bank.bic",
              "display_name": "bic",
              "field_type": "text",
              "value": null
            }
          }
        },
        {
          "payment_method_type": "sepa",
          "required_fields": null
        }
      ]
    }
  ]

</details>

## Checklist
<!-- Put an `x` in the boxes that apply -->

- [x] I formatted the code `cargo +nightly fmt --all`
- [ ] I addressed lints thrown by `cargo clippy`
- [ ] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible
