Bug: Payment Intent and MCA changes for split payments



- Add split_txns_enabled field in PaymentIntent
- Add split_enabled field to MCA payment_method
- Code changes to modify split_enabled for a payment method when creating or updating an MCA (similar to recurring_enabled)
- PML changes to filter payment methods based on split_enabled in MCA and split_txns_enabled in Intent
diff --git a/crates/api_models/src/admin.rs b/crates/api_models/src/admin.rs
index 2e70e1a6c95..e7d70225884 100644
--- a/crates/api_models/src/admin.rs
+++ b/crates/api_models/src/admin.rs
@@ -2342,6 +2342,10 @@ pub struct ProfileCreate {
     /// It is used in payment processing, fraud detection, and regulatory compliance to determine regional rules and routing behavior.
     #[schema(value_type = Option<MerchantCountryCode>, example = "840")]
     pub merchant_country_code: Option<common_types::payments::MerchantCountryCode>,
+
+    /// Enable split payments, i.e., split the amount between multiple payment methods
+    #[schema(value_type = Option<SplitTxnsEnabled>, default = "skip")]
+    pub split_txns_enabled: Option<common_enums::SplitTxnsEnabled>,
 }
 
 #[cfg(feature = "v1")]
@@ -2688,6 +2692,10 @@ pub struct ProfileResponse {
     /// It is used in payment processing, fraud detection, and regulatory compliance to determine regional rules and routing behavior.
     #[schema(value_type = Option<MerchantCountryCode>, example = "840")]
     pub merchant_country_code: Option<common_types::payments::MerchantCountryCode>,
+
+    /// Enable split payments, i.e., split the amount between multiple payment methods
+    #[schema(value_type = SplitTxnsEnabled, default = "skip")]
+    pub split_txns_enabled: common_enums::SplitTxnsEnabled,
 }
 
 #[cfg(feature = "v1")]
@@ -3006,6 +3014,10 @@ pub struct ProfileUpdate {
     #[schema(value_type = Option<RevenueRecoveryAlgorithmType>, example = "cascading")]
     pub revenue_recovery_retry_algorithm_type:
         Option<common_enums::enums::RevenueRecoveryAlgorithmType>,
+
+    /// Enable split payments, i.e., split the amount between multiple payment methods
+    #[schema(value_type = Option<SplitTxnsEnabled>, default = "skip")]
+    pub split_txns_enabled: Option<common_enums::SplitTxnsEnabled>,
 }
 
 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs
index 5660819cea8..c56456e4ce8 100644
--- a/crates/api_models/src/payments.rs
+++ b/crates/api_models/src/payments.rs
@@ -643,6 +643,10 @@ pub struct PaymentsIntentResponse {
     #[schema(value_type = RequestIncrementalAuthorization)]
     pub request_incremental_authorization: common_enums::RequestIncrementalAuthorization,
 
+    /// Enable split payments, i.e., split the amount between multiple payment methods
+    #[schema(value_type = SplitTxnsEnabled, default = "skip")]
+    pub split_txns_enabled: common_enums::SplitTxnsEnabled,
+
     ///Will be used to expire client secret after certain amount of time to be supplied in seconds
     #[serde(with = "common_utils::custom_serde::iso8601")]
     pub expires_on: PrimitiveDateTime,
diff --git a/crates/common_enums/src/enums.rs b/crates/common_enums/src/enums.rs
index 07916214269..cbe1e3f0aab 100644
--- a/crates/common_enums/src/enums.rs
+++ b/crates/common_enums/src/enums.rs
@@ -2859,6 +2859,29 @@ pub enum RequestIncrementalAuthorization {
     Default,
 }
 
+#[derive(
+    Clone,
+    Debug,
+    Copy,
+    Default,
+    Eq,
+    Hash,
+    PartialEq,
+    serde::Deserialize,
+    serde::Serialize,
+    strum::Display,
+    strum::EnumString,
+    ToSchema,
+)]
+#[router_derive::diesel_enum(storage_type = "text")]
+#[serde(rename_all = "snake_case")]
+#[strum(serialize_all = "snake_case")]
+pub enum SplitTxnsEnabled {
+    Enable,
+    #[default]
+    Skip,
+}
+
 #[derive(Clone, Copy, Eq, Hash, PartialEq, Debug, Serialize, Deserialize, strum::Display, ToSchema,)]
 #[rustfmt::skip]
 pub enum CountryAlpha3 {
diff --git a/crates/diesel_models/src/business_profile.rs b/crates/diesel_models/src/business_profile.rs
index 8a76b648d0d..a51887a94d6 100644
--- a/crates/diesel_models/src/business_profile.rs
+++ b/crates/diesel_models/src/business_profile.rs
@@ -412,6 +412,7 @@ pub struct Profile {
     pub revenue_recovery_retry_algorithm_data: Option<RevenueRecoveryAlgorithmData>,
     pub is_external_vault_enabled: Option<bool>,
     pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
+    pub split_txns_enabled: Option<common_enums::SplitTxnsEnabled>,
 }
 
 impl Profile {
@@ -487,6 +488,7 @@ pub struct ProfileNew {
     pub is_iframe_redirection_enabled: Option<bool>,
     pub is_external_vault_enabled: Option<bool>,
     pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
+    pub split_txns_enabled: Option<common_enums::SplitTxnsEnabled>,
 }
 
 #[cfg(feature = "v2")]
@@ -546,6 +548,7 @@ pub struct ProfileUpdateInternal {
     pub is_iframe_redirection_enabled: Option<bool>,
     pub is_external_vault_enabled: Option<bool>,
     pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
+    pub split_txns_enabled: Option<common_enums::SplitTxnsEnabled>,
 }
 
 #[cfg(feature = "v2")]
@@ -602,6 +605,7 @@ impl ProfileUpdateInternal {
             external_vault_connector_details,
             merchant_category_code,
             merchant_country_code,
+            split_txns_enabled,
         } = self;
         Profile {
             id: source.id,
@@ -698,6 +702,7 @@ impl ProfileUpdateInternal {
             merchant_category_code: merchant_category_code.or(source.merchant_category_code),
             merchant_country_code: merchant_country_code.or(source.merchant_country_code),
             dispute_polling_interval: None,
+            split_txns_enabled: split_txns_enabled.or(source.split_txns_enabled),
         }
     }
 }
diff --git a/crates/diesel_models/src/payment_intent.rs b/crates/diesel_models/src/payment_intent.rs
index acc8d4b21f8..a152d4085df 100644
--- a/crates/diesel_models/src/payment_intent.rs
+++ b/crates/diesel_models/src/payment_intent.rs
@@ -95,6 +95,7 @@ pub struct PaymentIntent {
     pub routing_algorithm_id: Option<common_utils::id_type::RoutingId>,
     pub payment_link_config: Option<PaymentLinkConfigRequestForPayments>,
     pub id: common_utils::id_type::GlobalPaymentId,
+    pub split_txns_enabled: Option<common_enums::SplitTxnsEnabled>,
 }
 
 #[cfg(feature = "v1")]
@@ -355,6 +356,7 @@ pub struct PaymentIntentNew {
     pub tax_details: Option<TaxDetails>,
     pub skip_external_tax_calculation: Option<bool>,
     pub enable_partial_authorization: Option<bool>,
+    pub split_txns_enabled: Option<common_enums::SplitTxnsEnabled>,
     pub merchant_reference_id: Option<common_utils::id_type::PaymentReferenceId>,
     pub billing_address: Option<Encryption>,
     pub shipping_address: Option<Encryption>,
@@ -800,6 +802,7 @@ impl PaymentIntentUpdateInternal {
             duty_amount: source.duty_amount,
             order_date: source.order_date,
             enable_partial_authorization: None,
+            split_txns_enabled: source.split_txns_enabled,
         }
     }
 }
diff --git a/crates/diesel_models/src/schema_v2.rs b/crates/diesel_models/src/schema_v2.rs
index 4711143d32c..ea3980d942a 100644
--- a/crates/diesel_models/src/schema_v2.rs
+++ b/crates/diesel_models/src/schema_v2.rs
@@ -263,6 +263,8 @@ diesel::table! {
         revenue_recovery_retry_algorithm_data -> Nullable<Jsonb>,
         is_external_vault_enabled -> Nullable<Bool>,
         external_vault_connector_details -> Nullable<Jsonb>,
+        #[max_length = 16]
+        split_txns_enabled -> Nullable<Varchar>,
     }
 }
 
@@ -1039,6 +1041,8 @@ diesel::table! {
         payment_link_config -> Nullable<Jsonb>,
         #[max_length = 64]
         id -> Varchar,
+        #[max_length = 16]
+        split_txns_enabled -> Nullable<Varchar>,
     }
 }
 
diff --git a/crates/hyperswitch_domain_models/src/business_profile.rs b/crates/hyperswitch_domain_models/src/business_profile.rs
index 44089872660..581754d6017 100644
--- a/crates/hyperswitch_domain_models/src/business_profile.rs
+++ b/crates/hyperswitch_domain_models/src/business_profile.rs
@@ -1074,6 +1074,7 @@ pub struct Profile {
     pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
     pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
     pub merchant_country_code: Option<common_types::payments::MerchantCountryCode>,
+    pub split_txns_enabled: common_enums::SplitTxnsEnabled,
 }
 
 #[cfg(feature = "v2")]
@@ -1131,6 +1132,7 @@ pub struct ProfileSetter {
     pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
     pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
     pub merchant_country_code: Option<common_types::payments::MerchantCountryCode>,
+    pub split_txns_enabled: common_enums::SplitTxnsEnabled,
 }
 
 #[cfg(feature = "v2")]
@@ -1193,6 +1195,7 @@ impl From<ProfileSetter> for Profile {
             external_vault_connector_details: value.external_vault_connector_details,
             merchant_category_code: value.merchant_category_code,
             merchant_country_code: value.merchant_country_code,
+            split_txns_enabled: value.split_txns_enabled,
         }
     }
 }
@@ -1380,6 +1383,7 @@ pub struct ProfileGeneralUpdate {
     pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
     pub merchant_country_code: Option<common_types::payments::MerchantCountryCode>,
     pub revenue_recovery_retry_algorithm_type: Option<common_enums::RevenueRecoveryAlgorithmType>,
+    pub split_txns_enabled: Option<common_enums::SplitTxnsEnabled>,
 }
 
 #[cfg(feature = "v2")]
@@ -1461,6 +1465,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                     merchant_category_code,
                     merchant_country_code,
                     revenue_recovery_retry_algorithm_type,
+                    split_txns_enabled,
                 } = *update;
                 Self {
                     profile_name,
@@ -1514,6 +1519,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                     external_vault_connector_details,
                     merchant_category_code,
                     merchant_country_code,
+                    split_txns_enabled,
                 }
             }
             ProfileUpdate::RoutingAlgorithmUpdate {
@@ -1570,6 +1576,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
             ProfileUpdate::ExtendedCardInfoUpdate {
                 is_extended_card_info_enabled,
@@ -1624,6 +1631,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
             ProfileUpdate::ConnectorAgnosticMitUpdate {
                 is_connector_agnostic_mit_enabled,
@@ -1678,6 +1686,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
             ProfileUpdate::DefaultRoutingFallbackUpdate {
                 default_fallback_routing,
@@ -1732,6 +1741,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
             ProfileUpdate::NetworkTokenizationUpdate {
                 is_network_tokenization_enabled,
@@ -1786,6 +1796,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
             ProfileUpdate::CollectCvvDuringPaymentUpdate {
                 should_collect_cvv_during_payment,
@@ -1840,6 +1851,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
             ProfileUpdate::DecisionManagerRecordUpdate {
                 three_ds_decision_manager_config,
@@ -1894,6 +1906,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
             ProfileUpdate::CardTestingSecretKeyUpdate {
                 card_testing_secret_key,
@@ -1948,6 +1961,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
             ProfileUpdate::RevenueRecoveryAlgorithmUpdate {
                 revenue_recovery_retry_algorithm_type,
@@ -2003,6 +2017,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
                 external_vault_connector_details: None,
                 merchant_category_code: None,
                 merchant_country_code: None,
+                split_txns_enabled: None,
             },
         }
     }
@@ -2082,6 +2097,7 @@ impl super::behaviour::Conversion for Profile {
             merchant_category_code: self.merchant_category_code,
             merchant_country_code: self.merchant_country_code,
             dispute_polling_interval: None,
+            split_txns_enabled: Some(self.split_txns_enabled),
         })
     }
 
@@ -2177,6 +2193,7 @@ impl super::behaviour::Conversion for Profile {
                 external_vault_connector_details: item.external_vault_connector_details,
                 merchant_category_code: item.merchant_category_code,
                 merchant_country_code: item.merchant_country_code,
+                split_txns_enabled: item.split_txns_enabled.unwrap_or_default(),
             })
         }
         .await
@@ -2247,6 +2264,7 @@ impl super::behaviour::Conversion for Profile {
             external_vault_connector_details: self.external_vault_connector_details,
             merchant_category_code: self.merchant_category_code,
             merchant_country_code: self.merchant_country_code,
+            split_txns_enabled: Some(self.split_txns_enabled),
         })
     }
 }
diff --git a/crates/hyperswitch_domain_models/src/payments.rs b/crates/hyperswitch_domain_models/src/payments.rs
index 36eece964f9..134f4fe7a07 100644
--- a/crates/hyperswitch_domain_models/src/payments.rs
+++ b/crates/hyperswitch_domain_models/src/payments.rs
@@ -460,6 +460,8 @@ pub struct PaymentIntent {
     pub updated_by: String,
     /// Denotes whether merchant requested for incremental authorization to be enabled for this payment.
     pub request_incremental_authorization: storage_enums::RequestIncrementalAuthorization,
+    /// Denotes whether merchant requested for split payments to be enabled for this payment
+    pub split_txns_enabled: storage_enums::SplitTxnsEnabled,
     /// Denotes the number of authorizations that have been made for the payment.
     pub authorization_count: Option<i32>,
     /// Denotes the client secret expiry for the payment. This is the time at which the client secret will expire.
@@ -637,6 +639,7 @@ impl PaymentIntent {
             request_external_three_ds_authentication: request
                 .request_external_three_ds_authentication
                 .unwrap_or_default(),
+            split_txns_enabled: profile.split_txns_enabled,
             frm_metadata: request.frm_metadata,
             customer_details: None,
             merchant_reference_id: request.merchant_reference_id,
diff --git a/crates/hyperswitch_domain_models/src/payments/payment_intent.rs b/crates/hyperswitch_domain_models/src/payments/payment_intent.rs
index c96209d2b4f..8dbdd1761bf 100644
--- a/crates/hyperswitch_domain_models/src/payments/payment_intent.rs
+++ b/crates/hyperswitch_domain_models/src/payments/payment_intent.rs
@@ -752,7 +752,6 @@ impl TryFrom<PaymentIntentUpdate> for diesel_models::PaymentIntentUpdateInternal
                     frm_metadata,
                     request_external_three_ds_authentication:
                         request_external_three_ds_authentication.map(|val| val.as_bool()),
-
                     updated_by,
                     force_3ds_challenge,
                     is_iframe_redirection_enabled,
@@ -1665,6 +1664,7 @@ impl behaviour::Conversion for PaymentIntent {
             frm_merchant_decision,
             updated_by,
             request_incremental_authorization,
+            split_txns_enabled,
             authorization_count,
             session_expiry,
             request_external_three_ds_authentication,
@@ -1734,6 +1734,7 @@ impl behaviour::Conversion for PaymentIntent {
             updated_by,
 
             request_incremental_authorization: Some(request_incremental_authorization),
+            split_txns_enabled: Some(split_txns_enabled),
             authorization_count,
             session_expiry,
             request_external_three_ds_authentication: Some(
@@ -1887,6 +1888,7 @@ impl behaviour::Conversion for PaymentIntent {
                 request_incremental_authorization: storage_model
                     .request_incremental_authorization
                     .unwrap_or_default(),
+                split_txns_enabled: storage_model.split_txns_enabled.unwrap_or_default(),
                 authorization_count: storage_model.authorization_count,
                 session_expiry: storage_model.session_expiry,
                 request_external_three_ds_authentication: storage_model
@@ -1975,6 +1977,7 @@ impl behaviour::Conversion for PaymentIntent {
             updated_by: self.updated_by,
 
             request_incremental_authorization: Some(self.request_incremental_authorization),
+            split_txns_enabled: Some(self.split_txns_enabled),
             authorization_count: self.authorization_count,
             session_expiry: self.session_expiry,
             request_external_three_ds_authentication: Some(
diff --git a/crates/openapi/src/openapi_v2.rs b/crates/openapi/src/openapi_v2.rs
index 1c52daa639a..59609e79057 100644
--- a/crates/openapi/src/openapi_v2.rs
+++ b/crates/openapi/src/openapi_v2.rs
@@ -644,6 +644,7 @@ Never share your secret api keys. Keep them guarded and secure.
         api_models::enums::MitExemptionRequest,
         api_models::enums::EnablePaymentLinkRequest,
         api_models::enums::RequestIncrementalAuthorization,
+        api_models::enums::SplitTxnsEnabled,
         api_models::enums::External3dsAuthenticationRequest,
         api_models::enums::TaxCalculationOverride,
         api_models::enums::SurchargeCalculationOverride,
diff --git a/crates/router/src/core/admin.rs b/crates/router/src/core/admin.rs
index 7d625a78396..c3f0cf91dcb 100644
--- a/crates/router/src/core/admin.rs
+++ b/crates/router/src/core/admin.rs
@@ -3645,6 +3645,7 @@ impl ProfileCreateBridge for api::ProfileCreate {
                 .map(ForeignInto::foreign_into),
             merchant_category_code: self.merchant_category_code,
             merchant_country_code: self.merchant_country_code,
+            split_txns_enabled: self.split_txns_enabled.unwrap_or_default(),
         }))
     }
 }
@@ -4133,6 +4134,7 @@ impl ProfileUpdateBridge for api::ProfileUpdate {
                 merchant_category_code: self.merchant_category_code,
                 merchant_country_code: self.merchant_country_code,
                 revenue_recovery_retry_algorithm_type,
+                split_txns_enabled: self.split_txns_enabled,
             },
         )))
     }
diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs
index 8a3594c310c..9aed3766546 100644
--- a/crates/router/src/core/payments/transformers.rs
+++ b/crates/router/src/core/payments/transformers.rs
@@ -2195,6 +2195,7 @@ where
                     .clone()
                     .map(ForeignFrom::foreign_from),
                 request_incremental_authorization: payment_intent.request_incremental_authorization,
+                split_txns_enabled: payment_intent.split_txns_enabled,
                 expires_on: payment_intent.session_expiry,
                 frm_metadata: payment_intent.frm_metadata.clone(),
                 request_external_three_ds_authentication: payment_intent
diff --git a/crates/router/src/services/kafka/payment_intent.rs b/crates/router/src/services/kafka/payment_intent.rs
index e5caffc4a54..85cf80cd8a7 100644
--- a/crates/router/src/services/kafka/payment_intent.rs
+++ b/crates/router/src/services/kafka/payment_intent.rs
@@ -143,6 +143,7 @@ pub struct KafkaPaymentIntent<'a> {
     pub updated_by: &'a String,
     pub surcharge_applicable: Option<bool>,
     pub request_incremental_authorization: RequestIncrementalAuthorization,
+    pub split_txns_enabled: common_enums::SplitTxnsEnabled,
     pub authorization_count: Option<i32>,
     #[serde(with = "time::serde::timestamp")]
     pub session_expiry: OffsetDateTime,
@@ -209,6 +210,7 @@ impl<'a> KafkaPaymentIntent<'a> {
             frm_merchant_decision,
             updated_by,
             request_incremental_authorization,
+            split_txns_enabled,
             authorization_count,
             session_expiry,
             request_external_three_ds_authentication,
@@ -265,6 +267,7 @@ impl<'a> KafkaPaymentIntent<'a> {
             updated_by,
             surcharge_applicable: None,
             request_incremental_authorization: *request_incremental_authorization,
+            split_txns_enabled: *split_txns_enabled,
             authorization_count: *authorization_count,
             session_expiry: session_expiry.assume_utc(),
             request_external_three_ds_authentication: *request_external_three_ds_authentication,
diff --git a/crates/router/src/services/kafka/payment_intent_event.rs b/crates/router/src/services/kafka/payment_intent_event.rs
index db6de3cce1e..edfb570901a 100644
--- a/crates/router/src/services/kafka/payment_intent_event.rs
+++ b/crates/router/src/services/kafka/payment_intent_event.rs
@@ -96,6 +96,7 @@ pub struct KafkaPaymentIntentEvent<'a> {
     pub updated_by: &'a String,
     pub surcharge_applicable: Option<bool>,
     pub request_incremental_authorization: RequestIncrementalAuthorization,
+    pub split_txns_enabled: common_enums::SplitTxnsEnabled,
     pub authorization_count: Option<i32>,
     #[serde(with = "time::serde::timestamp::nanoseconds")]
     pub session_expiry: OffsetDateTime,
@@ -221,6 +222,7 @@ impl<'a> KafkaPaymentIntentEvent<'a> {
             frm_merchant_decision,
             updated_by,
             request_incremental_authorization,
+            split_txns_enabled,
             authorization_count,
             session_expiry,
             request_external_three_ds_authentication,
@@ -277,6 +279,7 @@ impl<'a> KafkaPaymentIntentEvent<'a> {
             updated_by,
             surcharge_applicable: None,
             request_incremental_authorization: *request_incremental_authorization,
+            split_txns_enabled: *split_txns_enabled,
             authorization_count: *authorization_count,
             session_expiry: session_expiry.assume_utc(),
             request_external_three_ds_authentication: *request_external_three_ds_authentication,
diff --git a/crates/router/src/types/api/admin.rs b/crates/router/src/types/api/admin.rs
index e0866e13eb8..8035959dd35 100644
--- a/crates/router/src/types/api/admin.rs
+++ b/crates/router/src/types/api/admin.rs
@@ -319,6 +319,7 @@ impl ForeignTryFrom<domain::Profile> for ProfileResponse {
                 .map(ForeignInto::foreign_into),
             merchant_category_code: item.merchant_category_code,
             merchant_country_code: item.merchant_country_code,
+            split_txns_enabled: item.split_txns_enabled,
         })
     }
 }
diff --git a/v2_compatible_migrations/2025-08-25-090221_add-split-txns-enabled-in-payment-intent/down.sql b/v2_compatible_migrations/2025-08-25-090221_add-split-txns-enabled-in-payment-intent/down.sql
new file mode 100644
index 00000000000..becd303be31
--- /dev/null
+++ b/v2_compatible_migrations/2025-08-25-090221_add-split-txns-enabled-in-payment-intent/down.sql
@@ -0,0 +1,2 @@
+-- This file should undo anything in `up.sql`
+ALTER TABLE payment_intent DROP COLUMN IF EXISTS split_txns_enabled;
diff --git a/v2_compatible_migrations/2025-08-25-090221_add-split-txns-enabled-in-payment-intent/up.sql b/v2_compatible_migrations/2025-08-25-090221_add-split-txns-enabled-in-payment-intent/up.sql
new file mode 100644
index 00000000000..c765ec9e037
--- /dev/null
+++ b/v2_compatible_migrations/2025-08-25-090221_add-split-txns-enabled-in-payment-intent/up.sql
@@ -0,0 +1,2 @@
+-- Your SQL goes here
+ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS split_txns_enabled VARCHAR(16);
\ No newline at end of file
diff --git a/v2_compatible_migrations/2025-08-29-040411_add-split-txns-enabled-in-business-profile/down.sql b/v2_compatible_migrations/2025-08-29-040411_add-split-txns-enabled-in-business-profile/down.sql
new file mode 100644
index 00000000000..a0fb7698515
--- /dev/null
+++ b/v2_compatible_migrations/2025-08-29-040411_add-split-txns-enabled-in-business-profile/down.sql
@@ -0,0 +1,2 @@
+-- This file should undo anything in `up.sql`
+ALTER TABLE business_profile DROP COLUMN IF EXISTS split_txns_enabled;
\ No newline at end of file
diff --git a/v2_compatible_migrations/2025-08-29-040411_add-split-txns-enabled-in-business-profile/up.sql b/v2_compatible_migrations/2025-08-29-040411_add-split-txns-enabled-in-business-profile/up.sql
new file mode 100644
index 00000000000..d5cc041c284
--- /dev/null
+++ b/v2_compatible_migrations/2025-08-29-040411_add-split-txns-enabled-in-business-profile/up.sql
@@ -0,0 +1,2 @@
+-- Your SQL goes here
+ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS split_txns_enabled VARCHAR(16);
\ No newline at end of file

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

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

## Description
<!-- Describe your changes in detail -->
- Add split_txns_enabled field to business_profile DB, create+update API calls
- Add split_txns_enabled field in PaymentIntent
- PML changes to filter payment methods based on split_enabled in MCA and split_txns_enabled in Intent

### 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`
2. `crates/router/src/configs`
3. `loadtest/config`
-->


## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to the issue here.

If you don't have an issue, we'd recommend starting with one first so the PR
can focus on the implementation (unless it is an obvious bug or documentation fix
that will have little conversation).
-->
Closes #9047 

## How did you test it?
<!--
Did you write an integration/unit/API test to verify the code changes?
Or did you test this change manually (provide relevant screenshots)?
-->

1. Business Profile Create Request (split_txns_enabled)

```
curl --location 'http://localhost:8080/v2/profiles' \
--header 'x-merchant-id: cloth_seller_v2_5WeDFMHDxeA6s3I9WReI' \
--header 'Authorization: admin-api-key=test_admin' \
--header 'Content-Type: application/json' \
--header 'api-key: test_admin' \
--data-raw '{
    "profile_name": "businesss",
    "return_url": "https://google.com/success",
...
    "split_txns_enabled": "enable"
    
}'
```

Response:
```json
{
    "merchant_id": "cloth_seller_v2_5WeDFMHDxeA6s3I9WReI",
    "id": "pro_ayVzG5Zr33W31ArJk7CK",
    "profile_name": "businesss",
    "return_url": "https://google.com/success",
    "enable_payment_response_hash": true,
    "payment_response_hash_key": "c94j5uGyFCAIU1N24p3mVl9DKLrSCN0xslChyzawzX1gwvSynCgpX6vS39JuA0J9",
    "redirect_to_merchant_with_http_post": false,
    "webhook_details": {
        "webhook_version": "1.0.1",
        "webhook_username": "ekart_retail",
        "webhook_password": "password_ekart@123",
        "webhook_url": "https://webhook.site",
        "payment_created_enabled": true,
        "payment_succeeded_enabled": true,
        "payment_failed_enabled": true,
        "payment_statuses_enabled": null,
        "refund_statuses_enabled": null,
        "payout_statuses_enabled": null
    },
    "metadata": null,
    "applepay_verified_domains": null,
    "session_expiry": 900,
    "payment_link_config": null,
    "authentication_connector_details": null,
    "use_billing_as_payment_method_billing": true,
    "extended_card_info_config": null,
    "collect_shipping_details_from_wallet_connector_if_required": false,
    "collect_billing_details_from_wallet_connector_if_required": false,
    "always_collect_shipping_details_from_wallet_connector": false,
    "always_collect_billing_details_from_wallet_connector": false,
    "is_connector_agnostic_mit_enabled": false,
    "payout_link_config": null,
    "outgoing_webhook_custom_http_headers": null,
    "order_fulfillment_time": 900,
    "order_fulfillment_time_origin": "create",
    "tax_connector_id": null,
    "is_tax_connector_enabled": false,
    "is_network_tokenization_enabled": false,
    "should_collect_cvv_during_payment": null,
    "is_click_to_pay_enabled": false,
    "authentication_product_ids": null,
    "card_testing_guard_config": {
        "card_ip_blocking_status": "disabled",
        "card_ip_blocking_threshold": 3,
        "guest_user_card_blocking_status": "disabled",
        "guest_user_card_blocking_threshold": 10,
        "customer_id_blocking_status": "disabled",
        "customer_id_blocking_threshold": 5,
        "card_testing_guard_expiry": 3600
    },
    "is_clear_pan_retries_enabled": false,
    "is_debit_routing_enabled": false,
    "merchant_business_country": null,
    "is_iframe_redirection_enabled": null,
    "is_external_vault_enabled": null,
    "external_vault_connector_details": null,
    "merchant_category_code": null,
    "merchant_country_code": null,
    "split_txns_enabled": "enable"
}
```

2. Payment Intent Create Request

```
curl --location 'http://localhost:8080/v2/payments/create-intent' \
--header 'api-key: dev_xjdI9HLJv4OJIab8VojIjDWbXN3i4a50fzUaxgaQjtP3vwL3WmQVwNbgNmA9M5DV' \
--header 'Content-Type: application/json' \
--header 'x-profile-id: pro_dPNtC5bK3lNxBYt7kyk4' \
--header 'Authorization: api-key=dev_xjdI9HLJv4OJIab8VojIjDWbXN3i4a50fzUaxgaQjtP3vwL3WmQVwNbgNmA9M5DV' \
--data-raw '{
	"amount_details": {
		"order_amount": 1000,
		"currency": "USD"
	},
	"capture_method": "automatic",
	"authentication_type": "three_ds",
	"order_details": [
		{
			"product_name": "Apple iphone 15",
			"quantity": 1,
			"amount": 1000
		}
	],
	"billing": {
		"address": {
			"line1": "1467",
			"line2": "Harrison Street",
			"line3": "Harrison Street",
			"city": "San Fransico",
			"state": "California",
			"zip": "94122",
			"country": "US",
			"first_name": "joseph",
			"last_name": "Doe"
		},
		"phone": {
			"number": "123456789",
			"country_code": "+1"
		},
		"email": "user@gmail.com"
	},
	"shipping": {
		"address": {
			"first_name": "John",
			"last_name": "Dough",
			"city": "Karwar",
			"zip": "571201",
			"state": "California",
			"country": "US"
		},
		"email": "example@example.com",
		"phone": {
			"number": "123456789",
			"country_code": "+1"
		}
	},
    "customer_id": "12345_cus_0198e54d6c3b7871bcfde4a50ee43b88"
}'
```

```json
{
    "id": "12345_pay_0198e54f328775408faf14fc2c47651a",
    "status": "requires_payment_method",
    "amount_details": {
        "order_amount": 1000,
        "currency": "USD",
        "shipping_cost": null,
        "order_tax_amount": null,
        "external_tax_calculation": "skip",
        "surcharge_calculation": "skip",
        "surcharge_amount": null,
        "tax_on_surcharge": null
    },
    "client_secret": "cs_0198e54f32b07003a723ffba50f47fea",
    "profile_id": "pro_dPNtC5bK3lNxBYt7kyk4",
    "merchant_reference_id": null,
    "routing_algorithm_id": null,
    "capture_method": "automatic",
    "authentication_type": "three_ds",
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "US",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "joseph",
            "last_name": "Doe",
            "origin_zip": null
        },
        "phone": {
            "number": "123456789",
            "country_code": "+1"
        },
        "email": "user@gmail.com"
    },
    "shipping": {
        "address": {
            "city": "Karwar",
            "country": "US",
            "line1": null,
            "line2": null,
            "line3": null,
            "zip": "571201",
            "state": "California",
            "first_name": "John",
            "last_name": "Dough",
            "origin_zip": null
        },
        "phone": {
            "number": "123456789",
            "country_code": "+1"
        },
        "email": "example@example.com"
    },
    "customer_id": "12345_cus_0198e54d6c3b7871bcfde4a50ee43b88",
    "customer_present": "present",
    "description": null,
    "return_url": null,
    "setup_future_usage": "on_session",
    "apply_mit_exemption": "Skip",
    "statement_descriptor": null,
    "order_details": [
        {
            "product_name": "Apple iphone 15",
            "quantity": 1,
            "amount": 1000,
            "tax_rate": null,
            "total_tax_amount": null,
            "requires_shipping": null,
            "product_img_link": null,
            "product_id": null,
            "category": null,
            "sub_category": null,
            "brand": null,
            "product_type": null,
            "product_tax_code": null,
            "description": null,
            "sku": null,
            "upc": null,
            "commodity_code": null,
            "unit_of_measure": null,
            "total_amount": null,
            "unit_discount_amount": null
        }
    ],
    "allowed_payment_method_types": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "payment_link_enabled": "Skip",
    "payment_link_config": null,
    "request_incremental_authorization": "false",
    "split_txns_enabled": "true",
    "expires_on": "2025-08-26T07:52:09.530Z",
    "frm_metadata": null,
    "request_external_three_ds_authentication": "Skip"
}
```

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

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