mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-31 01:57:45 +08:00
feat(core): [CYBERSOURCE] Add original authorized amount in router data (#3417)
Co-authored-by: Samraat Bansal <samraat.bansal@juspay.in> Co-authored-by: SamraatBansal <55536657+SamraatBansal@users.noreply.github.com>
This commit is contained in:
@ -442,7 +442,7 @@ pub struct ClientRiskInformationRules {
|
|||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct Avs {
|
pub struct Avs {
|
||||||
code: String,
|
code: String,
|
||||||
code_raw: String,
|
code_raw: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl
|
impl
|
||||||
|
|||||||
@ -10,7 +10,7 @@ use crate::{
|
|||||||
connector::utils::{
|
connector::utils::{
|
||||||
self, AddressDetailsData, ApplePayDecrypt, CardData, PaymentsAuthorizeRequestData,
|
self, AddressDetailsData, ApplePayDecrypt, CardData, PaymentsAuthorizeRequestData,
|
||||||
PaymentsCompleteAuthorizeRequestData, PaymentsPreProcessingData,
|
PaymentsCompleteAuthorizeRequestData, PaymentsPreProcessingData,
|
||||||
PaymentsSetupMandateRequestData, PaymentsSyncRequestData, RouterData,
|
PaymentsSetupMandateRequestData, PaymentsSyncRequestData, RecurringMandateData, RouterData,
|
||||||
},
|
},
|
||||||
consts,
|
consts,
|
||||||
core::errors,
|
core::errors,
|
||||||
@ -47,6 +47,7 @@ impl<T>
|
|||||||
T,
|
T,
|
||||||
),
|
),
|
||||||
) -> Result<Self, Self::Error> {
|
) -> Result<Self, Self::Error> {
|
||||||
|
// This conversion function is used at different places in the file, if updating this, keep a check for those
|
||||||
let amount = utils::get_amount_as_string(currency_unit, amount, currency)?;
|
let amount = utils::get_amount_as_string(currency_unit, amount, currency)?;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
amount,
|
amount,
|
||||||
@ -81,11 +82,11 @@ impl TryFrom<&types::SetupMandateRouterData> for CybersourceZeroMandateRequest {
|
|||||||
Some(vec![CybersourceActionsList::TokenCreate]),
|
Some(vec![CybersourceActionsList::TokenCreate]),
|
||||||
Some(vec![CybersourceActionsTokenType::PaymentInstrument]),
|
Some(vec![CybersourceActionsTokenType::PaymentInstrument]),
|
||||||
Some(CybersourceAuthorizationOptions {
|
Some(CybersourceAuthorizationOptions {
|
||||||
initiator: CybersourcePaymentInitiator {
|
initiator: Some(CybersourcePaymentInitiator {
|
||||||
initiator_type: Some(CybersourcePaymentInitiatorTypes::Customer),
|
initiator_type: Some(CybersourcePaymentInitiatorTypes::Customer),
|
||||||
credential_stored_on_file: Some(true),
|
credential_stored_on_file: Some(true),
|
||||||
stored_credential_used: None,
|
stored_credential_used: None,
|
||||||
},
|
}),
|
||||||
merchant_intitiated_transaction: None,
|
merchant_intitiated_transaction: None,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
@ -272,14 +273,16 @@ pub enum CybersourceActionsTokenType {
|
|||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct CybersourceAuthorizationOptions {
|
pub struct CybersourceAuthorizationOptions {
|
||||||
initiator: CybersourcePaymentInitiator,
|
initiator: Option<CybersourcePaymentInitiator>,
|
||||||
merchant_intitiated_transaction: Option<MerchantInitiatedTransaction>,
|
merchant_intitiated_transaction: Option<MerchantInitiatedTransaction>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct MerchantInitiatedTransaction {
|
pub struct MerchantInitiatedTransaction {
|
||||||
reason: String,
|
reason: Option<String>,
|
||||||
|
//Required for recurring mandates payment
|
||||||
|
original_authorized_amount: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
@ -470,35 +473,60 @@ impl From<&CybersourceRouterData<&types::PaymentsCompleteAuthorizeRouterData>>
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl
|
impl
|
||||||
From<(
|
TryFrom<(
|
||||||
&CybersourceRouterData<&types::PaymentsAuthorizeRouterData>,
|
&CybersourceRouterData<&types::PaymentsAuthorizeRouterData>,
|
||||||
Option<PaymentSolution>,
|
Option<PaymentSolution>,
|
||||||
)> for ProcessingInformation
|
)> for ProcessingInformation
|
||||||
{
|
{
|
||||||
fn from(
|
type Error = error_stack::Report<errors::ConnectorError>;
|
||||||
|
fn try_from(
|
||||||
(item, solution): (
|
(item, solution): (
|
||||||
&CybersourceRouterData<&types::PaymentsAuthorizeRouterData>,
|
&CybersourceRouterData<&types::PaymentsAuthorizeRouterData>,
|
||||||
Option<PaymentSolution>,
|
Option<PaymentSolution>,
|
||||||
),
|
),
|
||||||
) -> Self {
|
) -> Result<Self, Self::Error> {
|
||||||
let (action_list, action_token_types, authorization_options) =
|
let (action_list, action_token_types, authorization_options) =
|
||||||
if item.router_data.request.setup_mandate_details.is_some() {
|
if item.router_data.request.setup_mandate_details.is_some() {
|
||||||
(
|
(
|
||||||
Some(vec![CybersourceActionsList::TokenCreate]),
|
Some(vec![CybersourceActionsList::TokenCreate]),
|
||||||
Some(vec![CybersourceActionsTokenType::PaymentInstrument]),
|
Some(vec![CybersourceActionsTokenType::PaymentInstrument]),
|
||||||
Some(CybersourceAuthorizationOptions {
|
Some(CybersourceAuthorizationOptions {
|
||||||
initiator: CybersourcePaymentInitiator {
|
initiator: Some(CybersourcePaymentInitiator {
|
||||||
initiator_type: Some(CybersourcePaymentInitiatorTypes::Customer),
|
initiator_type: Some(CybersourcePaymentInitiatorTypes::Customer),
|
||||||
credential_stored_on_file: Some(true),
|
credential_stored_on_file: Some(true),
|
||||||
stored_credential_used: None,
|
stored_credential_used: None,
|
||||||
},
|
}),
|
||||||
merchant_intitiated_transaction: None,
|
merchant_intitiated_transaction: None,
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
} else if item.router_data.request.connector_mandate_id().is_some() {
|
||||||
|
let original_amount = item
|
||||||
|
.router_data
|
||||||
|
.get_recurring_mandate_payment_data()?
|
||||||
|
.get_original_payment_amount()?;
|
||||||
|
let original_currency = item
|
||||||
|
.router_data
|
||||||
|
.get_recurring_mandate_payment_data()?
|
||||||
|
.get_original_payment_currency()?;
|
||||||
|
(
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some(CybersourceAuthorizationOptions {
|
||||||
|
initiator: None,
|
||||||
|
merchant_intitiated_transaction: Some(MerchantInitiatedTransaction {
|
||||||
|
reason: None,
|
||||||
|
original_authorized_amount: Some(utils::get_amount_as_string(
|
||||||
|
&types::api::CurrencyUnit::Base,
|
||||||
|
original_amount,
|
||||||
|
original_currency,
|
||||||
|
)?),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
(None, None, None)
|
(None, None, None)
|
||||||
};
|
};
|
||||||
Self {
|
Ok(Self {
|
||||||
capture: Some(matches!(
|
capture: Some(matches!(
|
||||||
item.router_data.request.capture_method,
|
item.router_data.request.capture_method,
|
||||||
Some(enums::CaptureMethod::Automatic) | None
|
Some(enums::CaptureMethod::Automatic) | None
|
||||||
@ -509,7 +537,7 @@ impl
|
|||||||
authorization_options,
|
authorization_options,
|
||||||
capture_options: None,
|
capture_options: None,
|
||||||
commerce_indicator: String::from("internet"),
|
commerce_indicator: String::from("internet"),
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,11 +561,11 @@ impl
|
|||||||
Some(vec![CybersourceActionsList::TokenCreate]),
|
Some(vec![CybersourceActionsList::TokenCreate]),
|
||||||
Some(vec![CybersourceActionsTokenType::PaymentInstrument]),
|
Some(vec![CybersourceActionsTokenType::PaymentInstrument]),
|
||||||
Some(CybersourceAuthorizationOptions {
|
Some(CybersourceAuthorizationOptions {
|
||||||
initiator: CybersourcePaymentInitiator {
|
initiator: Some(CybersourcePaymentInitiator {
|
||||||
initiator_type: Some(CybersourcePaymentInitiatorTypes::Customer),
|
initiator_type: Some(CybersourcePaymentInitiatorTypes::Customer),
|
||||||
credential_stored_on_file: Some(true),
|
credential_stored_on_file: Some(true),
|
||||||
stored_credential_used: None,
|
stored_credential_used: None,
|
||||||
},
|
}),
|
||||||
merchant_intitiated_transaction: None,
|
merchant_intitiated_transaction: None,
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
@ -680,7 +708,7 @@ impl
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
let processing_information = ProcessingInformation::from((item, None));
|
let processing_information = ProcessingInformation::try_from((item, None))?;
|
||||||
let client_reference_information = ClientReferenceInformation::from(item);
|
let client_reference_information = ClientReferenceInformation::from(item);
|
||||||
let merchant_defined_information =
|
let merchant_defined_information =
|
||||||
item.router_data.request.metadata.clone().map(|metadata| {
|
item.router_data.request.metadata.clone().map(|metadata| {
|
||||||
@ -792,7 +820,7 @@ impl
|
|||||||
let bill_to = build_bill_to(item.router_data.get_billing()?, email)?;
|
let bill_to = build_bill_to(item.router_data.get_billing()?, email)?;
|
||||||
let order_information = OrderInformationWithBill::from((item, bill_to));
|
let order_information = OrderInformationWithBill::from((item, bill_to));
|
||||||
let processing_information =
|
let processing_information =
|
||||||
ProcessingInformation::from((item, Some(PaymentSolution::ApplePay)));
|
ProcessingInformation::try_from((item, Some(PaymentSolution::ApplePay)))?;
|
||||||
let client_reference_information = ClientReferenceInformation::from(item);
|
let client_reference_information = ClientReferenceInformation::from(item);
|
||||||
let expiration_month = apple_pay_data.get_expiry_month()?;
|
let expiration_month = apple_pay_data.get_expiry_month()?;
|
||||||
let expiration_year = apple_pay_data.get_four_digit_expiry_year()?;
|
let expiration_year = apple_pay_data.get_four_digit_expiry_year()?;
|
||||||
@ -846,7 +874,7 @@ impl
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
let processing_information =
|
let processing_information =
|
||||||
ProcessingInformation::from((item, Some(PaymentSolution::GooglePay)));
|
ProcessingInformation::try_from((item, Some(PaymentSolution::GooglePay)))?;
|
||||||
let client_reference_information = ClientReferenceInformation::from(item);
|
let client_reference_information = ClientReferenceInformation::from(item);
|
||||||
let merchant_defined_information =
|
let merchant_defined_information =
|
||||||
item.router_data.request.metadata.clone().map(|metadata| {
|
item.router_data.request.metadata.clone().map(|metadata| {
|
||||||
@ -893,10 +921,9 @@ impl TryFrom<&CybersourceRouterData<&types::PaymentsAuthorizeRouterData>>
|
|||||||
build_bill_to(item.router_data.get_billing()?, email)?;
|
build_bill_to(item.router_data.get_billing()?, email)?;
|
||||||
let order_information =
|
let order_information =
|
||||||
OrderInformationWithBill::from((item, bill_to));
|
OrderInformationWithBill::from((item, bill_to));
|
||||||
let processing_information = ProcessingInformation::from((
|
let processing_information = ProcessingInformation::try_from(
|
||||||
item,
|
(item, Some(PaymentSolution::ApplePay)),
|
||||||
Some(PaymentSolution::ApplePay),
|
)?;
|
||||||
));
|
|
||||||
let client_reference_information =
|
let client_reference_information =
|
||||||
ClientReferenceInformation::from(item);
|
ClientReferenceInformation::from(item);
|
||||||
let payment_information = PaymentInformation::ApplePayToken(
|
let payment_information = PaymentInformation::ApplePayToken(
|
||||||
@ -1008,7 +1035,7 @@ impl
|
|||||||
String,
|
String,
|
||||||
),
|
),
|
||||||
) -> Result<Self, Self::Error> {
|
) -> Result<Self, Self::Error> {
|
||||||
let processing_information = ProcessingInformation::from((item, None));
|
let processing_information = ProcessingInformation::try_from((item, None))?;
|
||||||
let payment_instrument = CybersoucrePaymentInstrument {
|
let payment_instrument = CybersoucrePaymentInstrument {
|
||||||
id: connector_mandate_id,
|
id: connector_mandate_id,
|
||||||
};
|
};
|
||||||
@ -1159,13 +1186,14 @@ impl TryFrom<&CybersourceRouterData<&types::PaymentsIncrementalAuthorizationRout
|
|||||||
action_list: None,
|
action_list: None,
|
||||||
action_token_types: None,
|
action_token_types: None,
|
||||||
authorization_options: Some(CybersourceAuthorizationOptions {
|
authorization_options: Some(CybersourceAuthorizationOptions {
|
||||||
initiator: CybersourcePaymentInitiator {
|
initiator: Some(CybersourcePaymentInitiator {
|
||||||
initiator_type: None,
|
initiator_type: None,
|
||||||
credential_stored_on_file: None,
|
credential_stored_on_file: None,
|
||||||
stored_credential_used: Some(true),
|
stored_credential_used: Some(true),
|
||||||
},
|
}),
|
||||||
merchant_intitiated_transaction: Some(MerchantInitiatedTransaction {
|
merchant_intitiated_transaction: Some(MerchantInitiatedTransaction {
|
||||||
reason: "5".to_owned(),
|
reason: Some("5".to_owned()),
|
||||||
|
original_authorized_amount: None,
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
commerce_indicator: String::from("internet"),
|
commerce_indicator: String::from("internet"),
|
||||||
@ -1339,18 +1367,6 @@ impl From<CybersourceIncrementalAuthorizationStatus> for common_enums::Authoriza
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<CybersourcePaymentStatus> for enums::RefundStatus {
|
|
||||||
fn from(item: CybersourcePaymentStatus) -> Self {
|
|
||||||
match item {
|
|
||||||
CybersourcePaymentStatus::Succeeded | CybersourcePaymentStatus::Transmitted => {
|
|
||||||
Self::Success
|
|
||||||
}
|
|
||||||
CybersourcePaymentStatus::Failed => Self::Failure,
|
|
||||||
_ => Self::Pending,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
pub enum CybersourcePaymentsResponse {
|
pub enum CybersourcePaymentsResponse {
|
||||||
@ -1430,7 +1446,7 @@ pub struct ClientProcessorInformation {
|
|||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct Avs {
|
pub struct Avs {
|
||||||
code: String,
|
code: String,
|
||||||
code_raw: String,
|
code_raw: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Deserialize)]
|
#[derive(Debug, Clone, Deserialize)]
|
||||||
|
|||||||
@ -25,7 +25,7 @@ use crate::{
|
|||||||
consts,
|
consts,
|
||||||
core::{
|
core::{
|
||||||
errors::{self, ApiErrorResponse, CustomResult},
|
errors::{self, ApiErrorResponse, CustomResult},
|
||||||
payments::PaymentData,
|
payments::{PaymentData, RecurringMandatePaymentData},
|
||||||
},
|
},
|
||||||
pii::PeekInterface,
|
pii::PeekInterface,
|
||||||
types::{
|
types::{
|
||||||
@ -81,6 +81,7 @@ pub trait RouterData {
|
|||||||
fn get_customer_id(&self) -> Result<String, Error>;
|
fn get_customer_id(&self) -> Result<String, Error>;
|
||||||
fn get_connector_customer_id(&self) -> Result<String, Error>;
|
fn get_connector_customer_id(&self) -> Result<String, Error>;
|
||||||
fn get_preprocessing_id(&self) -> Result<String, Error>;
|
fn get_preprocessing_id(&self) -> Result<String, Error>;
|
||||||
|
fn get_recurring_mandate_payment_data(&self) -> Result<RecurringMandatePaymentData, Error>;
|
||||||
#[cfg(feature = "payouts")]
|
#[cfg(feature = "payouts")]
|
||||||
fn get_payout_method_data(&self) -> Result<api::PayoutMethodData, Error>;
|
fn get_payout_method_data(&self) -> Result<api::PayoutMethodData, Error>;
|
||||||
#[cfg(feature = "payouts")]
|
#[cfg(feature = "payouts")]
|
||||||
@ -250,6 +251,12 @@ impl<Flow, Request, Response> RouterData for types::RouterData<Flow, Request, Re
|
|||||||
.to_owned()
|
.to_owned()
|
||||||
.ok_or_else(missing_field_err("preprocessing_id"))
|
.ok_or_else(missing_field_err("preprocessing_id"))
|
||||||
}
|
}
|
||||||
|
fn get_recurring_mandate_payment_data(&self) -> Result<RecurringMandatePaymentData, Error> {
|
||||||
|
self.recurring_mandate_payment_data
|
||||||
|
.to_owned()
|
||||||
|
.ok_or_else(missing_field_err("recurring_mandate_payment_data"))
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "payouts")]
|
#[cfg(feature = "payouts")]
|
||||||
fn get_payout_method_data(&self) -> Result<api::PayoutMethodData, Error> {
|
fn get_payout_method_data(&self) -> Result<api::PayoutMethodData, Error> {
|
||||||
self.payout_method_data
|
self.payout_method_data
|
||||||
@ -1133,6 +1140,22 @@ impl MandateData for payments::MandateAmountData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait RecurringMandateData {
|
||||||
|
fn get_original_payment_amount(&self) -> Result<i64, Error>;
|
||||||
|
fn get_original_payment_currency(&self) -> Result<diesel_models::enums::Currency, Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RecurringMandateData for RecurringMandatePaymentData {
|
||||||
|
fn get_original_payment_amount(&self) -> Result<i64, Error> {
|
||||||
|
self.original_payment_authorized_amount
|
||||||
|
.ok_or_else(missing_field_err("original_payment_authorized_amount"))
|
||||||
|
}
|
||||||
|
fn get_original_payment_currency(&self) -> Result<diesel_models::enums::Currency, Error> {
|
||||||
|
self.original_payment_authorized_currency
|
||||||
|
.ok_or_else(missing_field_err("original_payment_authorized_currency"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait MandateReferenceData {
|
pub trait MandateReferenceData {
|
||||||
fn get_connector_mandate_id(&self) -> Result<String, Error>;
|
fn get_connector_mandate_id(&self) -> Result<String, Error>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2039,6 +2039,8 @@ pub struct IncrementalAuthorizationDetails {
|
|||||||
#[derive(Debug, Default, Clone)]
|
#[derive(Debug, Default, Clone)]
|
||||||
pub struct RecurringMandatePaymentData {
|
pub struct RecurringMandatePaymentData {
|
||||||
pub payment_method_type: Option<storage_enums::PaymentMethodType>, //required for making recurring payment using saved payment method through stripe
|
pub payment_method_type: Option<storage_enums::PaymentMethodType>, //required for making recurring payment using saved payment method through stripe
|
||||||
|
pub original_payment_authorized_amount: Option<i64>,
|
||||||
|
pub original_payment_authorized_currency: Option<storage_enums::Currency>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone)]
|
#[derive(Debug, Default, Clone)]
|
||||||
|
|||||||
@ -479,6 +479,27 @@ pub async fn get_token_for_recurring_mandate(
|
|||||||
.await
|
.await
|
||||||
.to_not_found_response(errors::ApiErrorResponse::MandateNotFound)?;
|
.to_not_found_response(errors::ApiErrorResponse::MandateNotFound)?;
|
||||||
|
|
||||||
|
let original_payment_intent = mandate
|
||||||
|
.original_payment_id
|
||||||
|
.as_ref()
|
||||||
|
.async_map(|payment_id| async {
|
||||||
|
db.find_payment_intent_by_payment_id_merchant_id(
|
||||||
|
payment_id,
|
||||||
|
&mandate.merchant_id,
|
||||||
|
merchant_account.storage_scheme,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)
|
||||||
|
.map_err(|err| logger::error!(mandate_original_payment_not_found=?err))
|
||||||
|
.ok()
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.flatten();
|
||||||
|
|
||||||
|
let original_payment_authorized_amount = original_payment_intent.clone().map(|pi| pi.amount);
|
||||||
|
let original_payment_authorized_currency =
|
||||||
|
original_payment_intent.clone().and_then(|pi| pi.currency);
|
||||||
|
|
||||||
let customer = req.customer_id.clone().get_required_value("customer_id")?;
|
let customer = req.customer_id.clone().get_required_value("customer_id")?;
|
||||||
|
|
||||||
let payment_method_id = {
|
let payment_method_id = {
|
||||||
@ -540,6 +561,8 @@ pub async fn get_token_for_recurring_mandate(
|
|||||||
Some(payment_method.payment_method),
|
Some(payment_method.payment_method),
|
||||||
Some(payments::RecurringMandatePaymentData {
|
Some(payments::RecurringMandatePaymentData {
|
||||||
payment_method_type,
|
payment_method_type,
|
||||||
|
original_payment_authorized_amount,
|
||||||
|
original_payment_authorized_currency,
|
||||||
}),
|
}),
|
||||||
payment_method.payment_method_type,
|
payment_method.payment_method_type,
|
||||||
Some(mandate_connector_details),
|
Some(mandate_connector_details),
|
||||||
@ -550,6 +573,8 @@ pub async fn get_token_for_recurring_mandate(
|
|||||||
Some(payment_method.payment_method),
|
Some(payment_method.payment_method),
|
||||||
Some(payments::RecurringMandatePaymentData {
|
Some(payments::RecurringMandatePaymentData {
|
||||||
payment_method_type,
|
payment_method_type,
|
||||||
|
original_payment_authorized_amount,
|
||||||
|
original_payment_authorized_currency,
|
||||||
}),
|
}),
|
||||||
payment_method.payment_method_type,
|
payment_method.payment_method_type,
|
||||||
Some(mandate_connector_details),
|
Some(mandate_connector_details),
|
||||||
|
|||||||
Reference in New Issue
Block a user