diff --git a/crates/hyperswitch_connectors/src/connectors/stripe/transformers.rs b/crates/hyperswitch_connectors/src/connectors/stripe/transformers.rs index f79d5fed5e..0436715efb 100644 --- a/crates/hyperswitch_connectors/src/connectors/stripe/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/stripe/transformers.rs @@ -1999,7 +1999,15 @@ impl TryFrom<(&PaymentsAuthorizeRouterData, MinorUnit)> for PaymentIntentRequest customer: Some(Secret::new(customer_id)), setup_mandate_details, off_session: item.request.off_session, - setup_future_usage, + setup_future_usage: match ( + item.request.split_payments.as_ref(), + item.request.setup_future_usage, + item.request.customer_acceptance.as_ref(), + ) { + (Some(_), Some(usage), Some(_)) => Some(usage), + _ => setup_future_usage, + }, + payment_method_types, expand: Some(ExpandableObjects::LatestCharge), browser_info, diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index fee5440a60..ed11e1e30a 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -2,7 +2,7 @@ use std::{fmt::Debug, marker::PhantomData, str::FromStr}; use api_models::payments::{ Address, ConnectorMandateReferenceId, CustomerDetails, CustomerDetailsResponse, FrmMessage, - RequestSurchargeDetails, + MandateIds, RequestSurchargeDetails, }; use common_enums::{Currency, RequestIncrementalAuthorization}; use common_utils::{ @@ -3388,6 +3388,17 @@ impl TryFrom> for types::PaymentsAuthoriz } } +fn get_off_session( + mandate_id: Option<&MandateIds>, + off_session_flag: Option, +) -> Option { + match (mandate_id, off_session_flag) { + (_, Some(false)) => Some(false), + (Some(_), _) | (_, Some(true)) => Some(true), + (None, None) => None, + } +} + #[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))] impl TryFrom> for types::PaymentsAuthorizeData { type Error = error_stack::Report; @@ -3542,12 +3553,16 @@ impl TryFrom> for types::PaymentsAuthoriz }) .transpose()? .map(pii::SecretSerdeValue::new); + let is_off_session = get_off_session( + payment_data.mandate_id.as_ref(), + payment_data.payment_intent.off_session, + ); Ok(Self { payment_method_data: (payment_method_data.get_required_value("payment_method_data")?), setup_future_usage: payment_data.payment_attempt.setup_future_usage_applied, mandate_id: payment_data.mandate_id.clone(), - off_session: payment_data.mandate_id.as_ref().map(|_| true), + off_session: is_off_session, setup_mandate_details: payment_data.setup_mandate.clone(), confirm: payment_data.payment_attempt.confirm, statement_descriptor_suffix: payment_data.payment_intent.statement_descriptor_suffix, @@ -4385,6 +4400,11 @@ impl TryFrom> for types::SetupMandateRequ .transpose()? .map(pii::SecretSerdeValue::new); + let is_off_session = get_off_session( + payment_data.mandate_id.as_ref(), + payment_data.payment_intent.off_session, + ); + Ok(Self { currency: payment_data.currency, confirm: true, @@ -4395,7 +4415,7 @@ impl TryFrom> for types::SetupMandateRequ .get_required_value("payment_method_data")?), statement_descriptor_suffix: payment_data.payment_intent.statement_descriptor_suffix, setup_future_usage: payment_data.payment_attempt.setup_future_usage_applied, - off_session: payment_data.mandate_id.as_ref().map(|_| true), + off_session: is_off_session, mandate_id: payment_data.mandate_id.clone(), setup_mandate_details: payment_data.setup_mandate, customer_acceptance: payment_data.customer_acceptance, @@ -4529,10 +4549,16 @@ impl TryFrom> for types::CompleteAuthoriz .and_then(|braintree| braintree.merchant_account_id.clone()); let merchant_config_currency = braintree_metadata.and_then(|braintree| braintree.merchant_config_currency); + + let is_off_session = get_off_session( + payment_data.mandate_id.as_ref(), + payment_data.payment_intent.off_session, + ); + Ok(Self { setup_future_usage: payment_data.payment_intent.setup_future_usage, mandate_id: payment_data.mandate_id.clone(), - off_session: payment_data.mandate_id.as_ref().map(|_| true), + off_session: is_off_session, setup_mandate_details: payment_data.setup_mandate.clone(), confirm: payment_data.payment_attempt.confirm, statement_descriptor_suffix: payment_data.payment_intent.statement_descriptor_suffix,