Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(bank-transfer): remove billing from banktransfer payment data #4377

Merged
merged 14 commits into from May 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
120 changes: 64 additions & 56 deletions crates/api_models/src/payments.rs
Expand Up @@ -2046,37 +2046,37 @@ pub struct JCSVoucherData {
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
pub struct AchBillingDetails {
/// The Email ID for ACH billing
#[schema(value_type = String, example = "example@me.com")]
pub email: Email,
#[schema(value_type = Option<String>, example = "example@me.com")]
pub email: Option<Email>,
}

#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
pub struct DokuBillingDetails {
/// The billing first name for Doku
#[schema(value_type = String, example = "Jane")]
pub first_name: Secret<String>,
#[schema(value_type = Option<String>, example = "Jane")]
pub first_name: Option<Secret<String>>,
/// The billing second name for Doku
#[schema(value_type = String, example = "Doe")]
#[schema(value_type = Option<String>, example = "Doe")]
pub last_name: Option<Secret<String>>,
/// The Email ID for Doku billing
#[schema(value_type = String, example = "example@me.com")]
pub email: Email,
#[schema(value_type = Option<String>, example = "example@me.com")]
pub email: Option<Email>,
}

#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
pub struct MultibancoBillingDetails {
#[schema(value_type = String, example = "example@me.com")]
pub email: Email,
#[schema(value_type = Option<String>, example = "example@me.com")]
pub email: Option<Email>,
}

#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
pub struct SepaAndBacsBillingDetails {
/// The Email ID for SEPA and BACS billing
#[schema(value_type = String, example = "example@me.com")]
pub email: Email,
#[schema(value_type = Option<String>, example = "example@me.com")]
pub email: Option<Email>,
/// The billing name for SEPA and BACS billing
#[schema(value_type = String, example = "Jane Doe")]
pub name: Secret<String>,
#[schema(value_type = Option<String>, example = "Jane Doe")]
pub name: Option<Secret<String>>,
}

#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
Expand Down Expand Up @@ -2136,51 +2136,51 @@ impl GetAddressFromPaymentMethodData for BankRedirectBilling {
pub enum BankTransferData {
AchBankTransfer {
/// The billing details for ACH Bank Transfer
billing_details: AchBillingDetails,
billing_details: Option<AchBillingDetails>,
},
SepaBankTransfer {
/// The billing details for SEPA
billing_details: SepaAndBacsBillingDetails,
billing_details: Option<SepaAndBacsBillingDetails>,

/// The two-letter ISO country code for SEPA and BACS
#[schema(value_type = CountryAlpha2, example = "US")]
country: api_enums::CountryAlpha2,
country: Option<api_enums::CountryAlpha2>,
},
BacsBankTransfer {
/// The billing details for SEPA
billing_details: SepaAndBacsBillingDetails,
billing_details: Option<SepaAndBacsBillingDetails>,
},
MultibancoBankTransfer {
/// The billing details for Multibanco
billing_details: MultibancoBillingDetails,
billing_details: Option<MultibancoBillingDetails>,
},
PermataBankTransfer {
/// The billing details for Permata Bank Transfer
billing_details: DokuBillingDetails,
billing_details: Option<DokuBillingDetails>,
},
BcaBankTransfer {
/// The billing details for BCA Bank Transfer
billing_details: DokuBillingDetails,
billing_details: Option<DokuBillingDetails>,
},
BniVaBankTransfer {
/// The billing details for BniVa Bank Transfer
billing_details: DokuBillingDetails,
billing_details: Option<DokuBillingDetails>,
},
BriVaBankTransfer {
/// The billing details for BniVa Bank Transfer
billing_details: DokuBillingDetails,
billing_details: Option<DokuBillingDetails>,
},
CimbVaBankTransfer {
/// The billing details for BniVa Bank Transfer
billing_details: DokuBillingDetails,
billing_details: Option<DokuBillingDetails>,
},
DanamonVaBankTransfer {
/// The billing details for BniVa Bank Transfer
billing_details: DokuBillingDetails,
billing_details: Option<DokuBillingDetails>,
},
MandiriVaBankTransfer {
/// The billing details for BniVa Bank Transfer
billing_details: DokuBillingDetails,
billing_details: Option<DokuBillingDetails>,
},
Pix {},
Pse {},
Expand All @@ -2192,51 +2192,59 @@ pub enum BankTransferData {
impl GetAddressFromPaymentMethodData for BankTransferData {
fn get_billing_address(&self) -> Option<Address> {
match self {
Self::AchBankTransfer { billing_details } => Some(Address {
address: None,
phone: None,
email: Some(billing_details.email.clone()),
}),
Self::AchBankTransfer { billing_details } => {
billing_details.as_ref().map(|details| Address {
address: None,
phone: None,
email: details.email.clone(),
})
}
Self::SepaBankTransfer {
billing_details,
country,
} => Some(Address {
} => billing_details.as_ref().map(|details| Address {
address: Some(AddressDetails {
country: Some(*country),
first_name: Some(billing_details.name.clone()),
country: *country,
first_name: details.name.clone(),
..AddressDetails::default()
}),
phone: None,
email: Some(billing_details.email.clone()),
}),
Self::BacsBankTransfer { billing_details } => Some(Address {
address: Some(AddressDetails {
first_name: Some(billing_details.name.clone()),
..AddressDetails::default()
}),
phone: None,
email: Some(billing_details.email.clone()),
}),
Self::MultibancoBankTransfer { billing_details } => Some(Address {
address: None,
phone: None,
email: Some(billing_details.email.clone()),
email: details.email.clone(),
}),
Self::BacsBankTransfer { billing_details } => {
billing_details.as_ref().map(|details| Address {
address: Some(AddressDetails {
first_name: details.name.clone(),
..AddressDetails::default()
}),
phone: None,
email: details.email.clone(),
})
}
Self::MultibancoBankTransfer { billing_details } => {
billing_details.as_ref().map(|details| Address {
address: None,
phone: None,
email: details.email.clone(),
})
}
Self::PermataBankTransfer { billing_details }
| Self::BcaBankTransfer { billing_details }
| Self::BniVaBankTransfer { billing_details }
| Self::BriVaBankTransfer { billing_details }
| Self::CimbVaBankTransfer { billing_details }
| Self::DanamonVaBankTransfer { billing_details }
| Self::MandiriVaBankTransfer { billing_details } => Some(Address {
address: Some(AddressDetails {
first_name: Some(billing_details.first_name.clone()),
last_name: billing_details.last_name.clone(),
..AddressDetails::default()
}),
phone: None,
email: Some(billing_details.email.clone()),
}),
| Self::MandiriVaBankTransfer { billing_details } => {
billing_details.as_ref().map(|details| Address {
address: Some(AddressDetails {
first_name: details.first_name.clone(),
last_name: details.last_name.clone(),
..AddressDetails::default()
}),
phone: None,
email: details.email.clone(),
})
}
Self::LocalBankTransfer { .. } | Self::Pix {} | Self::Pse {} => None,
}
}
Expand Down
91 changes: 35 additions & 56 deletions crates/router/src/connector/adyen/transformers.rs
Expand Up @@ -2402,63 +2402,42 @@ impl<'a> TryFrom<(&domain::BankRedirectData, Option<bool>)> for AdyenPaymentMeth
}
}

impl<'a> TryFrom<&domain::BankTransferData> for AdyenPaymentMethod<'a> {
impl<'a>
TryFrom<(
&domain::BankTransferData,
&types::PaymentsAuthorizeRouterData,
)> for AdyenPaymentMethod<'a>
{
type Error = Error;
fn try_from(bank_transfer_data: &domain::BankTransferData) -> Result<Self, Self::Error> {
fn try_from(
(bank_transfer_data, item): (
&domain::BankTransferData,
&types::PaymentsAuthorizeRouterData,
),
) -> Result<Self, Self::Error> {
match bank_transfer_data {
domain::BankTransferData::PermataBankTransfer {
ref billing_details,
} => Ok(AdyenPaymentMethod::PermataBankTransfer(Box::new(
DokuBankData {
first_name: billing_details.first_name.clone(),
last_name: billing_details.last_name.clone(),
shopper_email: billing_details.email.clone(),
},
))),
domain::BankTransferData::BcaBankTransfer {
ref billing_details,
} => Ok(AdyenPaymentMethod::BcaBankTransfer(Box::new(
DokuBankData {
first_name: billing_details.first_name.clone(),
last_name: billing_details.last_name.clone(),
shopper_email: billing_details.email.clone(),
},
))),
domain::BankTransferData::BniVaBankTransfer {
ref billing_details,
} => Ok(AdyenPaymentMethod::BniVa(Box::new(DokuBankData {
first_name: billing_details.first_name.clone(),
last_name: billing_details.last_name.clone(),
shopper_email: billing_details.email.clone(),
}))),
domain::BankTransferData::BriVaBankTransfer {
ref billing_details,
} => Ok(AdyenPaymentMethod::BriVa(Box::new(DokuBankData {
first_name: billing_details.first_name.clone(),
last_name: billing_details.last_name.clone(),
shopper_email: billing_details.email.clone(),
}))),
domain::BankTransferData::CimbVaBankTransfer {
ref billing_details,
} => Ok(AdyenPaymentMethod::CimbVa(Box::new(DokuBankData {
first_name: billing_details.first_name.clone(),
last_name: billing_details.last_name.clone(),
shopper_email: billing_details.email.clone(),
}))),
domain::BankTransferData::DanamonVaBankTransfer {
ref billing_details,
} => Ok(AdyenPaymentMethod::DanamonVa(Box::new(DokuBankData {
first_name: billing_details.first_name.clone(),
last_name: billing_details.last_name.clone(),
shopper_email: billing_details.email.clone(),
}))),
domain::BankTransferData::MandiriVaBankTransfer {
ref billing_details,
} => Ok(AdyenPaymentMethod::MandiriVa(Box::new(DokuBankData {
first_name: billing_details.first_name.clone(),
last_name: billing_details.last_name.clone(),
shopper_email: billing_details.email.clone(),
}))),
domain::BankTransferData::PermataBankTransfer {} => Ok(
AdyenPaymentMethod::PermataBankTransfer(Box::new(DokuBankData::try_from(item)?)),
),

domain::BankTransferData::BcaBankTransfer {} => Ok(
AdyenPaymentMethod::BcaBankTransfer(Box::new(DokuBankData::try_from(item)?)),
),
domain::BankTransferData::BniVaBankTransfer {} => Ok(AdyenPaymentMethod::BniVa(
Box::new(DokuBankData::try_from(item)?),
)),
domain::BankTransferData::BriVaBankTransfer {} => Ok(AdyenPaymentMethod::BriVa(
Box::new(DokuBankData::try_from(item)?),
)),
domain::BankTransferData::CimbVaBankTransfer {} => Ok(AdyenPaymentMethod::CimbVa(
Box::new(DokuBankData::try_from(item)?),
)),
domain::BankTransferData::DanamonVaBankTransfer {} => Ok(
AdyenPaymentMethod::DanamonVa(Box::new(DokuBankData::try_from(item)?)),
),
domain::BankTransferData::MandiriVaBankTransfer {} => Ok(
AdyenPaymentMethod::MandiriVa(Box::new(DokuBankData::try_from(item)?)),
),
domain::BankTransferData::Pix {} => {
Ok(AdyenPaymentMethod::Pix(Box::new(PmdForPaymentType {
payment_type: PaymentType::Pix,
Expand Down Expand Up @@ -2803,7 +2782,7 @@ impl<'a>
let amount = get_amount_data(item);
let auth_type = AdyenAuthType::try_from(&item.router_data.connector_auth_type)?;
let shopper_interaction = AdyenShopperInteraction::from(item.router_data);
let payment_method = AdyenPaymentMethod::try_from(bank_transfer_data)?;
let payment_method = AdyenPaymentMethod::try_from((bank_transfer_data, item.router_data))?;
let return_url = item.router_data.request.get_return_url()?;
let request = AdyenPaymentRequest {
amount,
Expand Down