diff --git a/config/config.example.toml b/config/config.example.toml index 664477ec91..e687fd0ed2 100644 --- a/config/config.example.toml +++ b/config/config.example.toml @@ -332,6 +332,15 @@ online_banking_thailand = {country = "TH", currency = "THB"} touch_n_go = {country = "MY", currency = "MYR"} atome = {country = "MY,SG", currency = "MYR,SGD"} swish = {country = "SE", currency = "SEK"} +permata_bank_transfer = {country = "ID", currency = "IDR"} +bca_bank_transfer = {country = "ID", currency = "IDR"} +bni_va = {country = "ID", currency = "IDR"} +bri_va = {country = "ID", currency = "IDR"} +cimb_va = {country = "ID", currency = "IDR"} +danamon_va = {country = "ID", currency = "IDR"} +mandiri_va = {country = "ID", currency = "IDR"} +alfamart = {country = "ID", currency = "IDR"} +indomaret = {country = "ID", currency = "IDR"} [pm_filters.zen] credit = { not_available_flows = { capture_method = "manual" } } diff --git a/config/development.toml b/config/development.toml index eec0044596..c021c7df09 100644 --- a/config/development.toml +++ b/config/development.toml @@ -266,6 +266,15 @@ online_banking_thailand = {country = "TH", currency = "THB"} touch_n_go = {country = "MY", currency = "MYR"} atome = {country = "MY,SG", currency = "MYR,SGD"} swish = {country = "SE", currency = "SEK"} +permata_bank_transfer = {country = "ID", currency = "IDR"} +bca_bank_transfer = {country = "ID", currency = "IDR"} +bni_va = {country = "ID", currency = "IDR"} +bri_va = {country = "ID", currency = "IDR"} +cimb_va = {country = "ID", currency = "IDR"} +danamon_va = {country = "ID", currency = "IDR"} +mandiri_va = {country = "ID", currency = "IDR"} +alfamart = {country = "ID", currency = "IDR"} +indomaret = {country = "ID", currency = "IDR"} [pm_filters.braintree] paypal = { currency = "AUD,BRL,CAD,CNY,CZK,DKK,EUR,HKD,HUF,ILS,JPY,MYR,MXN,TWD,NZD,NOK,PHP,PLN,GBP,RUB,SGD,SEK,CHF,THB,USD" } diff --git a/config/docker_compose.toml b/config/docker_compose.toml index cc93127fb6..4cfc054491 100644 --- a/config/docker_compose.toml +++ b/config/docker_compose.toml @@ -215,6 +215,15 @@ online_banking_thailand = {country = "TH", currency = "THB"} touch_n_go = {country = "MY", currency = "MYR"} atome = {country = "MY,SG", currency = "MYR,SGD"} swish = {country = "SE", currency = "SEK"} +permata_bank_transfer = {country = "ID", currency = "IDR"} +bca_bank_transfer = {country = "ID", currency = "IDR"} +bni_va = {country = "ID", currency = "IDR"} +bri_va = {country = "ID", currency = "IDR"} +cimb_va = {country = "ID", currency = "IDR"} +danamon_va = {country = "ID", currency = "IDR"} +mandiri_va = {country = "ID", currency = "IDR"} +alfamart = {country = "ID", currency = "IDR"} +indomaret = {country = "ID", currency = "IDR"} [pm_filters.zen] credit = { not_available_flows = { capture_method = "manual" } } diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index 5f5294589a..b05f028ccc 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -765,8 +765,8 @@ pub enum AdditionalPaymentData { MandatePayment {}, Reward {}, Upi {}, - Voucher {}, GiftCard {}, + Voucher {}, } #[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)] @@ -901,6 +901,32 @@ pub enum BankRedirectData { }, } +#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)] +pub struct AlfamartVoucherData { + /// The billing first name for Alfamart + #[schema(value_type = String, example = "Jane")] + pub first_name: Secret, + /// The billing second name for Alfamart + #[schema(value_type = String, example = "Doe")] + pub last_name: Option>, + /// The Email ID for Alfamart + #[schema(value_type = String, example = "example@me.com")] + pub email: Email, +} + +#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)] +pub struct IndomaretVoucherData { + /// The billing first name for Alfamart + #[schema(value_type = String, example = "Jane")] + pub first_name: Secret, + /// The billing second name for Alfamart + #[schema(value_type = String, example = "Doe")] + pub last_name: Option>, + /// The Email ID for Alfamart + #[schema(value_type = String, example = "example@me.com")] + pub email: Email, +} + #[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)] pub struct AchBillingDetails { /// The Email ID for ACH billing @@ -908,6 +934,19 @@ pub struct AchBillingDetails { pub email: 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, + /// The billing second name for Doku + #[schema(value_type = String, example = "Doe")] + pub last_name: Option>, + /// The Email ID for Doku billing + #[schema(value_type = String, example = "example@me.com")] + pub email: Email, +} + #[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)] pub struct MultibancoBillingDetails { #[schema(value_type = String, example = "example@me.com")] @@ -977,6 +1016,34 @@ pub enum BankTransferData { /// The billing details for Multibanco billing_details: MultibancoBillingDetails, }, + PermataBankTransfer { + /// The billing details for Permata Bank Transfer + billing_details: DokuBillingDetails, + }, + BcaBankTransfer { + /// The billing details for BCA Bank Transfer + billing_details: DokuBillingDetails, + }, + BniVaBankTransfer { + /// The billing details for BniVa Bank Transfer + billing_details: DokuBillingDetails, + }, + BriVaBankTransfer { + /// The billing details for BniVa Bank Transfer + billing_details: DokuBillingDetails, + }, + CimbVaBankTransfer { + /// The billing details for BniVa Bank Transfer + billing_details: DokuBillingDetails, + }, + DanamonVaBankTransfer { + /// The billing details for BniVa Bank Transfer + billing_details: DokuBillingDetails, + }, + MandiriVaBankTransfer { + /// The billing details for BniVa Bank Transfer + billing_details: DokuBillingDetails, + }, Pix {}, Pse {}, } @@ -1215,6 +1282,8 @@ pub enum VoucherData { PagoEfectivo, RedCompra, RedPagos, + Alfamart(Box), + Indomaret(Box), } #[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1408,11 +1477,13 @@ pub struct BankTransferNextStepsData { #[serde(flatten)] pub bank_transfer_instructions: BankTransferInstructions, /// The details received by the receiver - pub receiver: ReceiverDetails, + pub receiver: Option, } #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)] pub struct VoucherNextStepData { + /// Voucher expiry date and time + pub expires_at: Option, /// Reference number required for the transaction pub reference: String, /// Url to download the payment instruction @@ -1434,6 +1505,8 @@ pub struct WaitScreenInstructions { #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)] #[serde(rename_all = "snake_case")] pub enum BankTransferInstructions { + /// The instructions for Doku bank transactions + DokuBankTransferInstructions(Box), /// The credit transfer for ACH transactions AchCreditTransfer(Box), /// The instructions for SEPA bank transactions @@ -1473,6 +1546,16 @@ pub struct MultibancoTransferInstructions { pub entity: String, } +#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)] +pub struct DokuBankTransferInstructions { + #[schema(value_type = String, example = "2023-07-26T17:33:00-07-21")] + pub expires_at: Option, + #[schema(value_type = String, example = "122385736258")] + pub reference: Secret, + #[schema(value_type = String)] + pub instructions_url: Option, +} + #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)] pub struct AchTransfer { #[schema(value_type = String, example = "122385736258")] diff --git a/crates/common_enums/src/enums.rs b/crates/common_enums/src/enums.rs index dc1840b79d..7ce5cfebe5 100644 --- a/crates/common_enums/src/enums.rs +++ b/crates/common_enums/src/enums.rs @@ -869,6 +869,7 @@ pub enum PaymentMethodType { Ach, Affirm, AfterpayClearpay, + Alfamart, AliPay, AliPayHk, Alma, @@ -880,12 +881,17 @@ pub enum PaymentMethodType { Bizum, Blik, Boleto, + BcaBankTransfer, + BniVa, + BriVa, + CimbVa, #[serde(rename = "classic")] ClassicReward, Credit, CryptoCurrency, Cashapp, Dana, + DanamonVa, Debit, Efecty, Eps, @@ -896,8 +902,10 @@ pub enum PaymentMethodType { Gcash, Ideal, Interac, + Indomaret, Klarna, KakaoPay, + MandiriVa, MbWay, MobilePay, Momo, @@ -909,6 +917,7 @@ pub enum PaymentMethodType { OnlineBankingPoland, OnlineBankingSlovakia, PagoEfectivo, + PermataBankTransfer, PayBright, Paypal, Pix, diff --git a/crates/common_enums/src/transformers.rs b/crates/common_enums/src/transformers.rs index 38902586a7..05ec65eba6 100644 --- a/crates/common_enums/src/transformers.rs +++ b/crates/common_enums/src/transformers.rs @@ -1544,13 +1544,19 @@ impl From for PaymentMethod { PaymentMethodType::ApplePay => Self::Wallet, PaymentMethodType::Bacs => Self::BankDebit, PaymentMethodType::BancontactCard => Self::BankRedirect, + PaymentMethodType::BcaBankTransfer => Self::BankTransfer, PaymentMethodType::Becs => Self::BankDebit, + PaymentMethodType::BniVa => Self::BankTransfer, + PaymentMethodType::BriVa => Self::BankTransfer, PaymentMethodType::Bizum => Self::BankRedirect, PaymentMethodType::Blik => Self::BankRedirect, + PaymentMethodType::Alfamart => Self::Voucher, + PaymentMethodType::CimbVa => Self::BankTransfer, PaymentMethodType::ClassicReward => Self::Reward, PaymentMethodType::Credit => Self::Card, PaymentMethodType::CryptoCurrency => Self::Crypto, PaymentMethodType::Dana => Self::Wallet, + PaymentMethodType::DanamonVa => Self::BankTransfer, PaymentMethodType::Debit => Self::Card, PaymentMethodType::Eps => Self::BankRedirect, PaymentMethodType::Evoucher => Self::Reward, @@ -1565,13 +1571,16 @@ impl From for PaymentMethod { PaymentMethodType::MobilePay => Self::Wallet, PaymentMethodType::Momo => Self::Wallet, PaymentMethodType::Multibanco => Self::BankTransfer, + PaymentMethodType::MandiriVa => Self::BankTransfer, PaymentMethodType::Interac => Self::BankRedirect, + PaymentMethodType::Indomaret => Self::Voucher, PaymentMethodType::OnlineBankingCzechRepublic => Self::BankRedirect, PaymentMethodType::OnlineBankingFinland => Self::BankRedirect, PaymentMethodType::OnlineBankingFpx => Self::BankRedirect, PaymentMethodType::OnlineBankingThailand => Self::BankRedirect, PaymentMethodType::OnlineBankingPoland => Self::BankRedirect, PaymentMethodType::OnlineBankingSlovakia => Self::BankRedirect, + PaymentMethodType::PermataBankTransfer => Self::BankTransfer, PaymentMethodType::Pix => Self::BankTransfer, PaymentMethodType::Pse => Self::BankTransfer, PaymentMethodType::PayBright => Self::PayLater, diff --git a/crates/router/src/connector/adyen/transformers.rs b/crates/router/src/connector/adyen/transformers.rs index 9bac031444..bd17ca674b 100644 --- a/crates/router/src/connector/adyen/transformers.rs +++ b/crates/router/src/connector/adyen/transformers.rs @@ -237,10 +237,11 @@ pub struct AdyenThreeDS { #[derive(Debug, Clone, Deserialize)] #[serde(untagged)] pub enum AdyenPaymentResponse { - Response(Response), - PresentToShopper(AdyenPtsResponse), - NextActionResponse(NextActionResponse), - RedirectionErrorResponse(RedirectionErrorResponse), + Response(Box), + PresentToShopper(Box), + QrCodeResponse(Box), + RedirectionResponse(Box), + RedirectionErrorResponse(Box), } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -264,34 +265,41 @@ pub struct RedirectionErrorResponse { #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct NextActionResponse { +pub struct RedirectionResponse { result_code: AdyenStatus, - action: AdyenNextAction, + action: AdyenRedirectAction, refusal_reason: Option, refusal_reason_code: Option, } #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct AdyenPtsResponse { - psp_reference: String, +pub struct PresentToShopperResponse { + psp_reference: Option, result_code: AdyenStatus, action: AdyenPtsAction, refusal_reason: Option, refusal_reason_code: Option, } +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct QrCodeResponseResponse { + result_code: AdyenStatus, + action: AdyenQrCodeAction, + refusal_reason: Option, + refusal_reason_code: Option, +} + #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct AdyenNextAction { +pub struct AdyenQrCodeAction { payment_method_type: PaymentType, - url: Option, - method: Option, #[serde(rename = "type")] type_of_response: ActionType, - data: Option>, - payment_data: Option, - qr_code_data: Option, + #[serde(rename = "url")] + mobile_redirection_url: Option, + qr_code_data: String, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -299,13 +307,26 @@ pub struct AdyenNextAction { pub struct AdyenPtsAction { reference: String, download_url: Option, - payment_method_type: Option, + payment_method_type: PaymentType, expires_at: Option, initial_amount: Option, pass_creation_token: Option, total_amount: Option, #[serde(rename = "type")] - type_of_response: Option, + type_of_response: ActionType, + instructions_url: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AdyenRedirectAction { + payment_method_type: PaymentType, + url: Option, + method: Option, + #[serde(rename = "type")] + type_of_response: ActionType, + data: Option>, + payment_data: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -331,20 +352,23 @@ pub enum AdyenPaymentMethod<'a> { AdyenCard(Box), AdyenKlarna(Box), AdyenPaypal(Box), + #[serde(rename = "afterpaytouch")] AfterPay(Box), AlmaPayLater(Box), AliPay(Box), AliPayHk(Box), ApplePay(Box), #[serde(rename = "atome")] - Atome(Box), + Atome, BancontactCard(Box), Bizum(Box), Blik(Box), #[serde(rename = "boletobancario")] - Boleto, - ClearPay(Box), - Dana(Box), + BoletoBancario, + #[serde(rename = "clearpay")] + ClearPay, + #[serde(rename = "dana")] + Dana, Eps(Box>), #[serde(rename = "gcash")] Gcash(Box), @@ -370,18 +394,43 @@ pub enum AdyenPaymentMethod<'a> { OnlineBankingFpx(Box), #[serde(rename = "molpay_ebanking_TH")] OnlineBankingThailand(Box), - PayBright(Box), - Sofort(Box), - Trustly(Box), - Walley(Box), - WeChatPayWeb(Box), + #[serde(rename = "paybright")] + PayBright, + #[serde(rename = "doku_permata_lite_atm")] + PermataBankTransfer(Box), + #[serde(rename = "directEbanking")] + Sofort, + #[serde(rename = "trustly")] + Trustly, + #[serde(rename = "walley")] + Walley, + #[serde(rename = "wechatpayWeb")] + WeChatPayWeb, AchDirectDebit(Box), #[serde(rename = "sepadirectdebit")] SepaDirectDebit(Box), BacsDirectDebit(Box), SamsungPay(Box), - Twint(Box), - Vipps(Box), + #[serde(rename = "doku_bca_va")] + BcaBankTransfer(Box), + #[serde(rename = "doku_bni_va")] + BniVa(Box), + #[serde(rename = "doku_bri_va")] + BriVa(Box), + #[serde(rename = "doku_cimb_va")] + CimbVa(Box), + #[serde(rename = "doku_danamon_va")] + DanamonVa(Box), + #[serde(rename = "doku_mandiri_va")] + MandiriVa(Box), + #[serde(rename = "twint")] + Twint, + #[serde(rename = "vipps")] + Vipps, + #[serde(rename = "doku_indomaret")] + Indomaret(Box), + #[serde(rename = "doku_alfamart")] + Alfamart(Box), #[serde(rename = "swish")] Swish, } @@ -423,12 +472,6 @@ pub struct MandateData { stored_payment_method_id: String, } -#[derive(Debug, Clone, Serialize)] -pub struct WeChatPayWebData { - #[serde(rename = "type")] - payment_type: PaymentType, -} - #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] pub struct BancontactCardData { @@ -809,33 +852,19 @@ pub struct AdyenApplePay { apple_pay_token: Secret, } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct DanaWalletData { - #[serde(rename = "type")] - payment_type: PaymentType, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TwintWalletData { - #[serde(rename = "type")] - payment_type: PaymentType, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct VippsWalletData { - #[serde(rename = "type")] - payment_type: PaymentType, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct AtomeData {} - #[derive(Debug, Clone, Serialize, Deserialize)] pub struct AdyenPayLaterData { #[serde(rename = "type")] payment_type: PaymentType, } +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct DokuBankData { + first_name: Secret, + last_name: Option>, + shopper_email: Email, +} // Refunds Request and Response #[derive(Default, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -871,11 +900,15 @@ pub enum PaymentType { Alipay, #[serde(rename = "alipay_hk")] AlipayHk, + #[serde(rename = "doku_alfamart")] + Alfamart, Alma, Applepay, Bizum, Atome, Blik, + #[serde(rename = "boletobancario")] + BoletoBancario, ClearPay, Dana, Eps, @@ -885,6 +918,8 @@ pub enum PaymentType { #[serde(rename = "gopay_wallet")] GoPay, Ideal, + #[serde(rename = "doku_indomaret")] + Indomaret, Klarna, Kakaopay, Mbway, @@ -925,6 +960,20 @@ pub enum PaymentType { Twint, Vipps, Swish, + #[serde(rename = "doku_permata_lite_atm")] + PermataBankTransfer, + #[serde(rename = "doku_bca_va")] + BcaBankTransfer, + #[serde(rename = "doku_bni_va")] + BniVa, + #[serde(rename = "doku_bri_va")] + BriVa, + #[serde(rename = "doku_cimb_va")] + CimbVa, + #[serde(rename = "doku_danamon_va")] + DanamonVa, + #[serde(rename = "doku_mandiri_va")] + MandiriVa, } #[derive(Debug, Eq, PartialEq, Serialize, Clone)] @@ -1077,6 +1126,9 @@ impl<'a> TryFrom<&types::PaymentsAuthorizeRouterData> for AdyenPaymentRequest<'a api_models::payments::PaymentMethodData::BankDebit(ref bank_debit) => { AdyenPaymentRequest::try_from((item, bank_debit)) } + api_models::payments::PaymentMethodData::BankTransfer(ref bank_transfer) => { + AdyenPaymentRequest::try_from((item, bank_transfer.as_ref())) + } api_models::payments::PaymentMethodData::Voucher(ref voucher_data) => { AdyenPaymentRequest::try_from((item, voucher_data)) } @@ -1268,7 +1320,12 @@ fn get_social_security_number( ) -> Option> { match voucher_data { payments::VoucherData::Boleto(boleto_data) => boleto_data.social_security_number.clone(), - _ => None, + payments::VoucherData::Alfamart { .. } + | payments::VoucherData::Indomaret { .. } + | payments::VoucherData::Efecty + | payments::VoucherData::PagoEfectivo + | payments::VoucherData::RedCompra + | payments::VoucherData::RedPagos => None, } } @@ -1335,8 +1392,28 @@ impl<'a> TryFrom<&api_models::payments::VoucherData> for AdyenPaymentMethod<'a> type Error = Error; fn try_from(voucher_data: &api_models::payments::VoucherData) -> Result { match voucher_data { - payments::VoucherData::Boleto { .. } => Ok(AdyenPaymentMethod::Boleto), - _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), + payments::VoucherData::Boleto { .. } => Ok(AdyenPaymentMethod::BoletoBancario), + payments::VoucherData::Alfamart(alfarmart_data) => { + Ok(AdyenPaymentMethod::Alfamart(Box::new(DokuBankData { + first_name: alfarmart_data.first_name.clone(), + last_name: alfarmart_data.last_name.clone(), + shopper_email: alfarmart_data.email.clone(), + }))) + } + payments::VoucherData::Indomaret(indomaret_data) => { + Ok(AdyenPaymentMethod::Indomaret(Box::new(DokuBankData { + first_name: indomaret_data.first_name.clone(), + last_name: indomaret_data.last_name.clone(), + shopper_email: indomaret_data.email.clone(), + }))) + } + payments::VoucherData::Efecty + | payments::VoucherData::PagoEfectivo + | payments::VoucherData::RedCompra + | payments::VoucherData::RedPagos => Err(errors::ConnectorError::NotImplemented( + "this payment method".to_string(), + ) + .into()), } } } @@ -1481,10 +1558,7 @@ impl<'a> TryFrom<&api::WalletData> for AdyenPaymentMethod<'a> { Ok(AdyenPaymentMethod::MobilePay(Box::new(data))) } api_models::payments::WalletData::WeChatPayRedirect(_) => { - let data = WeChatPayWebData { - payment_type: PaymentType::WeChatPayWeb, - }; - Ok(AdyenPaymentMethod::WeChatPayWeb(Box::new(data))) + Ok(AdyenPaymentMethod::WeChatPayWeb) } api_models::payments::WalletData::SamsungPay(samsung_data) => { let data = SamsungPayPmData { @@ -1493,24 +1567,9 @@ impl<'a> TryFrom<&api::WalletData> for AdyenPaymentMethod<'a> { }; Ok(AdyenPaymentMethod::SamsungPay(Box::new(data))) } - api_models::payments::WalletData::TwintRedirect { .. } => { - let data = TwintWalletData { - payment_type: PaymentType::Twint, - }; - Ok(AdyenPaymentMethod::Twint(Box::new(data))) - } - api_models::payments::WalletData::VippsRedirect { .. } => { - let data = VippsWalletData { - payment_type: PaymentType::Vipps, - }; - Ok(AdyenPaymentMethod::Vipps(Box::new(data))) - } - api_models::payments::WalletData::DanaRedirect { .. } => { - let data = DanaWalletData { - payment_type: PaymentType::Dana, - }; - Ok(AdyenPaymentMethod::Dana(Box::new(data))) - } + api_models::payments::WalletData::TwintRedirect { .. } => Ok(AdyenPaymentMethod::Twint), + api_models::payments::WalletData::VippsRedirect { .. } => Ok(AdyenPaymentMethod::Vipps), + api_models::payments::WalletData::DanaRedirect { .. } => Ok(AdyenPaymentMethod::Dana), api_models::payments::WalletData::SwishQr(_) => Ok(AdyenPaymentMethod::Swish), _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), } @@ -1543,11 +1602,7 @@ impl<'a> TryFrom<(&api::PayLaterData, Option)> api_enums::CountryAlpha2::IT | api_enums::CountryAlpha2::FR | api_enums::CountryAlpha2::ES - | api_enums::CountryAlpha2::GB => { - Ok(AdyenPaymentMethod::ClearPay(Box::new(AdyenPayLaterData { - payment_type: PaymentType::ClearPay, - }))) - } + | api_enums::CountryAlpha2::GB => Ok(AdyenPaymentMethod::ClearPay), _ => Ok(AdyenPaymentMethod::AfterPay(Box::new(AdyenPayLaterData { payment_type: PaymentType::Afterpaytouch, }))), @@ -1559,14 +1614,10 @@ impl<'a> TryFrom<(&api::PayLaterData, Option)> } } api_models::payments::PayLaterData::PayBrightRedirect { .. } => { - Ok(AdyenPaymentMethod::PayBright(Box::new(PayBrightData { - payment_type: PaymentType::PayBright, - }))) + Ok(AdyenPaymentMethod::PayBright) } api_models::payments::PayLaterData::WalleyRedirect { .. } => { - Ok(AdyenPaymentMethod::Walley(Box::new(WalleyData { - payment_type: PaymentType::Walley, - }))) + Ok(AdyenPaymentMethod::Walley) } api_models::payments::PayLaterData::AlmaRedirect { .. } => Ok( AdyenPaymentMethod::AlmaPayLater(Box::new(AdyenPayLaterData { @@ -1574,7 +1625,7 @@ impl<'a> TryFrom<(&api::PayLaterData, Option)> })), ), api_models::payments::PayLaterData::AtomeRedirect { .. } => { - Ok(AdyenPaymentMethod::Atome(Box::new(AtomeData {}))) + Ok(AdyenPaymentMethod::Atome) } _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), } @@ -1692,21 +1743,86 @@ impl<'a> TryFrom<&api_models::payments::BankRedirectData> for AdyenPaymentMethod issuer: OnlineBankingThailandIssuer::try_from(issuer)?, })), ), - api_models::payments::BankRedirectData::Sofort { .. } => Ok( - AdyenPaymentMethod::Sofort(Box::new(BankRedirectionPMData { - payment_type: PaymentType::Sofort, - })), - ), - api_models::payments::BankRedirectData::Trustly { .. } => Ok( - AdyenPaymentMethod::Trustly(Box::new(BankRedirectionPMData { - payment_type: PaymentType::Trustly, - })), - ), + api_models::payments::BankRedirectData::Sofort { .. } => Ok(AdyenPaymentMethod::Sofort), + api_models::payments::BankRedirectData::Trustly { .. } => { + Ok(AdyenPaymentMethod::Trustly) + } _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), } } } +impl<'a> TryFrom<&api_models::payments::BankTransferData> for AdyenPaymentMethod<'a> { + type Error = Error; + fn try_from( + bank_transfer_data: &api_models::payments::BankTransferData, + ) -> Result { + match bank_transfer_data { + payments::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(), + }, + ))), + payments::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(), + }, + ))), + payments::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(), + }))), + payments::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(), + }))), + payments::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(), + }))), + payments::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(), + }))), + payments::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(), + }))), + api_models::payments::BankTransferData::Pix {} + | api_models::payments::BankTransferData::AchBankTransfer { .. } + | api_models::payments::BankTransferData::SepaBankTransfer { .. } + | api_models::payments::BankTransferData::BacsBankTransfer { .. } + | api_models::payments::BankTransferData::MultibancoBankTransfer { .. } + | payments::BankTransferData::Pse {} => { + Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()) + } + } + } +} + impl<'a> TryFrom<( &types::PaymentsAuthorizeRouterData, @@ -1885,6 +2001,7 @@ impl<'a> Ok(request) } } + impl<'a> TryFrom<( &types::PaymentsAuthorizeRouterData, @@ -1936,6 +2053,53 @@ impl<'a> } } +impl<'a> + TryFrom<( + &types::PaymentsAuthorizeRouterData, + &api_models::payments::BankTransferData, + )> for AdyenPaymentRequest<'a> +{ + type Error = Error; + + fn try_from( + value: ( + &types::PaymentsAuthorizeRouterData, + &api_models::payments::BankTransferData, + ), + ) -> Result { + let (item, bank_transfer_data) = value; + let amount = get_amount_data(item); + let auth_type = AdyenAuthType::try_from(&item.connector_auth_type)?; + let shopper_interaction = AdyenShopperInteraction::from(item); + let payment_method = AdyenPaymentMethod::try_from(bank_transfer_data)?; + let return_url = item.request.get_return_url()?; + let request = AdyenPaymentRequest { + amount, + merchant_account: auth_type.merchant_account, + payment_method, + reference: item.payment_id.to_string(), + return_url, + browser_info: None, + shopper_interaction, + recurring_processing_model: None, + additional_data: None, + shopper_name: None, + shopper_locale: None, + shopper_email: item.request.email.clone(), + social_security_number: None, + telephone_number: None, + billing_address: None, + delivery_address: None, + country_code: None, + line_items: None, + shopper_reference: None, + store_payment_method: None, + channel: None, + }; + Ok(request) + } +} + impl<'a> TryFrom<( &types::PaymentsAuthorizeRouterData, @@ -2218,8 +2382,8 @@ pub fn get_adyen_response( Ok((status, error, payments_response_data)) } -pub fn get_next_action_response( - response: NextActionResponse, +pub fn get_redirection_response( + response: RedirectionResponse, is_manual_capture: bool, status_code: u16, ) -> errors::CustomResult< @@ -2265,7 +2429,8 @@ pub fn get_next_action_response( } }); - let connector_metadata = get_connector_metadata(&response)?; + let connector_metadata = get_wait_screen_metadata(&response)?; + // We don't get connector transaction id for redirections in Adyen. let payments_response_data = types::PaymentsResponseData::TransactionResponse { resource_id: types::ResponseId::NoResponseId, @@ -2278,14 +2443,8 @@ pub fn get_next_action_response( Ok((status, error, payments_response_data)) } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct AdyenMetaData { - download_url: Option, - reference: String, -} - pub fn get_present_to_shopper_response( - response: AdyenPtsResponse, + response: PresentToShopperResponse, is_manual_capture: bool, status_code: u16, ) -> errors::CustomResult< @@ -2296,15 +2455,19 @@ pub fn get_present_to_shopper_response( ), errors::ConnectorError, > { - let status = - storage_enums::AttemptStatus::foreign_from((is_manual_capture, response.result_code)); + let status = storage_enums::AttemptStatus::foreign_from(( + is_manual_capture, + response.result_code.clone(), + )); let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() { Some(types::ErrorResponse { code: response .refusal_reason_code + .clone() .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), message: response .refusal_reason + .clone() .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), reason: None, status_code, @@ -2313,20 +2476,65 @@ pub fn get_present_to_shopper_response( None }; - let metadata = serde_json::json!(AdyenMetaData { - download_url: response.action.download_url, - reference: response.action.reference, - }); - + let connector_metadata = get_present_to_shopper_metadata(&response)?; + // We don't get connector transaction id for redirections in Adyen. let payments_response_data = types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(response.psp_reference), + resource_id: match response.psp_reference.as_ref() { + Some(psp) => types::ResponseId::ConnectorTransactionId(psp.to_string()), + None => types::ResponseId::NoResponseId, + }, redirection_data: None, mandate_reference: None, - connector_metadata: Some(metadata), + connector_metadata, network_txn_id: None, connector_response_reference_id: None, }; + Ok((status, error, payments_response_data)) +} +pub fn get_qr_code_response( + response: QrCodeResponseResponse, + is_manual_capture: bool, + status_code: u16, +) -> errors::CustomResult< + ( + storage_enums::AttemptStatus, + Option, + types::PaymentsResponseData, + ), + errors::ConnectorError, +> { + let status = storage_enums::AttemptStatus::foreign_from(( + is_manual_capture, + response.result_code.clone(), + )); + let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() { + Some(types::ErrorResponse { + code: response + .refusal_reason_code + .clone() + .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + message: response + .refusal_reason + .clone() + .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + reason: None, + status_code, + }) + } else { + None + }; + + let connector_metadata = get_qr_metadata(&response)?; + // We don't get connector transaction id for redirections in Adyen. + let payments_response_data = types::PaymentsResponseData::TransactionResponse { + resource_id: types::ResponseId::NoResponseId, + redirection_data: None, + mandate_reference: None, + connector_metadata, + network_txn_id: None, + connector_response_reference_id: None, + }; Ok((status, error, payments_response_data)) } @@ -2363,32 +2571,14 @@ pub fn get_redirection_error_response( Ok((status, error, payments_response_data)) } -pub fn get_connector_metadata( - response: &NextActionResponse, -) -> errors::CustomResult, errors::ConnectorError> { - let connector_metadata = match response.action.type_of_response { - ActionType::QrCode => get_qr_metadata(response), - ActionType::Await => get_wait_screen_metadata(response), - _ => Ok(None), - } - .change_context(errors::ConnectorError::ResponseHandlingFailed)?; - - Ok(connector_metadata) -} - pub fn get_qr_metadata( - response: &NextActionResponse, + response: &QrCodeResponseResponse, ) -> errors::CustomResult, errors::ConnectorError> { - let image_data = response - .action - .qr_code_data - .clone() - .map(crate_utils::QrImage::new_from_data) - .transpose() + let image_data = crate_utils::QrImage::new_from_data(response.action.qr_code_data.to_owned()) .change_context(errors::ConnectorError::ResponseHandlingFailed)?; - let image_data_url = image_data - .and_then(|image_data| Url::parse(image_data.data.as_str()).ok()) + let image_data_url = Url::parse(image_data.data.as_str()) + .ok() .ok_or(errors::ConnectorError::ResponseHandlingFailed)?; let qr_code_instructions = payments::QrCodeNextStepsInstruction { @@ -2410,7 +2600,7 @@ pub struct WaitScreenData { } pub fn get_wait_screen_metadata( - next_action: &NextActionResponse, + next_action: &RedirectionResponse, ) -> errors::CustomResult, errors::ConnectorError> { match next_action.action.payment_method_type { PaymentType::Blik => { @@ -2427,7 +2617,145 @@ pub fn get_wait_screen_metadata( display_to_timestamp: None }))) } - _ => Ok(None), + PaymentType::Affirm + | PaymentType::Afterpaytouch + | PaymentType::Alipay + | PaymentType::AlipayHk + | PaymentType::Alfamart + | PaymentType::Alma + | PaymentType::Applepay + | PaymentType::Bizum + | PaymentType::Atome + | PaymentType::BoletoBancario + | PaymentType::ClearPay + | PaymentType::Dana + | PaymentType::Eps + | PaymentType::Gcash + | PaymentType::Giropay + | PaymentType::Googlepay + | PaymentType::GoPay + | PaymentType::Ideal + | PaymentType::Indomaret + | PaymentType::Klarna + | PaymentType::Kakaopay + | PaymentType::MobilePay + | PaymentType::Momo + | PaymentType::OnlineBankingCzechRepublic + | PaymentType::OnlineBankingFinland + | PaymentType::OnlineBankingPoland + | PaymentType::OnlineBankingSlovakia + | PaymentType::OnlineBankingFpx + | PaymentType::OnlineBankingThailand + | PaymentType::PayBright + | PaymentType::Paypal + | PaymentType::Scheme + | PaymentType::Sofort + | PaymentType::NetworkToken + | PaymentType::Trustly + | PaymentType::TouchNGo + | PaymentType::Walley + | PaymentType::WeChatPayWeb + | PaymentType::AchDirectDebit + | PaymentType::SepaDirectDebit + | PaymentType::BacsDirectDebit + | PaymentType::Samsungpay + | PaymentType::Twint + | PaymentType::Vipps + | PaymentType::Swish + | PaymentType::PermataBankTransfer + | PaymentType::BcaBankTransfer + | PaymentType::BniVa + | PaymentType::BriVa + | PaymentType::CimbVa + | PaymentType::DanamonVa + | PaymentType::MandiriVa => Ok(None), + } +} + +pub fn get_present_to_shopper_metadata( + response: &PresentToShopperResponse, +) -> errors::CustomResult, errors::ConnectorError> { + let reference = response.action.reference.clone(); + + match response.action.payment_method_type { + PaymentType::Alfamart | PaymentType::Indomaret | PaymentType::BoletoBancario => { + let voucher_data = payments::VoucherNextStepData { + expires_at: response.action.expires_at.clone(), + reference, + download_url: response.action.download_url.clone(), + }; + + Some(common_utils::ext_traits::Encode::< + payments::VoucherNextStepData, + >::encode_to_value(&voucher_data)) + .transpose() + .change_context(errors::ConnectorError::ResponseHandlingFailed) + } + PaymentType::PermataBankTransfer + | PaymentType::BcaBankTransfer + | PaymentType::BniVa + | PaymentType::BriVa + | PaymentType::CimbVa + | PaymentType::DanamonVa + | PaymentType::MandiriVa => { + let voucher_data = payments::BankTransferInstructions::DokuBankTransferInstructions( + Box::new(payments::DokuBankTransferInstructions { + reference: Secret::new(response.action.reference.clone()), + instructions_url: response.action.instructions_url.clone(), + expires_at: response.action.expires_at.clone(), + }), + ); + + Some(common_utils::ext_traits::Encode::< + payments::DokuBankTransferInstructions, + >::encode_to_value(&voucher_data)) + .transpose() + .change_context(errors::ConnectorError::ResponseHandlingFailed) + } + PaymentType::Affirm + | PaymentType::Afterpaytouch + | PaymentType::Alipay + | PaymentType::AlipayHk + | PaymentType::Alma + | PaymentType::Applepay + | PaymentType::Bizum + | PaymentType::Atome + | PaymentType::Blik + | PaymentType::ClearPay + | PaymentType::Dana + | PaymentType::Eps + | PaymentType::Gcash + | PaymentType::Giropay + | PaymentType::Googlepay + | PaymentType::GoPay + | PaymentType::Ideal + | PaymentType::Klarna + | PaymentType::Kakaopay + | PaymentType::Mbway + | PaymentType::MobilePay + | PaymentType::Momo + | PaymentType::OnlineBankingCzechRepublic + | PaymentType::OnlineBankingFinland + | PaymentType::OnlineBankingPoland + | PaymentType::OnlineBankingSlovakia + | PaymentType::OnlineBankingFpx + | PaymentType::OnlineBankingThailand + | PaymentType::PayBright + | PaymentType::Paypal + | PaymentType::Scheme + | PaymentType::Sofort + | PaymentType::NetworkToken + | PaymentType::Trustly + | PaymentType::TouchNGo + | PaymentType::Walley + | PaymentType::WeChatPayWeb + | PaymentType::AchDirectDebit + | PaymentType::SepaDirectDebit + | PaymentType::BacsDirectDebit + | PaymentType::Samsungpay + | PaymentType::Twint + | PaymentType::Vipps + | PaymentType::Swish => Ok(None), } } @@ -2447,17 +2775,20 @@ impl let item = items.0; let is_manual_capture = items.1; let (status, error, payment_response_data) = match item.response { - AdyenPaymentResponse::PresentToShopper(response) => { - get_present_to_shopper_response(response, is_manual_capture, item.http_code)? - } AdyenPaymentResponse::Response(response) => { - get_adyen_response(response, is_manual_capture, item.http_code)? + get_adyen_response(*response, is_manual_capture, item.http_code)? } - AdyenPaymentResponse::NextActionResponse(response) => { - get_next_action_response(response, is_manual_capture, item.http_code)? + AdyenPaymentResponse::PresentToShopper(response) => { + get_present_to_shopper_response(*response, is_manual_capture, item.http_code)? + } + AdyenPaymentResponse::QrCodeResponse(response) => { + get_qr_code_response(*response, is_manual_capture, item.http_code)? + } + AdyenPaymentResponse::RedirectionResponse(response) => { + get_redirection_response(*response, is_manual_capture, item.http_code)? } AdyenPaymentResponse::RedirectionErrorResponse(response) => { - get_redirection_error_response(response, is_manual_capture, item.http_code)? + get_redirection_error_response(*response, is_manual_capture, item.http_code)? } }; @@ -2468,6 +2799,7 @@ impl }) } } + #[derive(Default, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct AdyenCaptureRequest { diff --git a/crates/router/src/connector/stripe/transformers.rs b/crates/router/src/connector/stripe/transformers.rs index d999b9823d..6306853e80 100644 --- a/crates/router/src/connector/stripe/transformers.rs +++ b/crates/router/src/connector/stripe/transformers.rs @@ -1248,7 +1248,15 @@ fn create_stripe_payment_method( billing_details, )) } - payments::BankTransferData::Pix {} | payments::BankTransferData::Pse {} => Err( + payments::BankTransferData::Pix {} + | payments::BankTransferData::Pse {} + | payments::BankTransferData::PermataBankTransfer { .. } + | payments::BankTransferData::BcaBankTransfer { .. } + | payments::BankTransferData::BniVaBankTransfer { .. } + | payments::BankTransferData::BriVaBankTransfer { .. } + | payments::BankTransferData::CimbVaBankTransfer { .. } + | payments::BankTransferData::DanamonVaBankTransfer { .. } + | payments::BankTransferData::MandiriVaBankTransfer { .. } => Err( errors::ConnectorError::NotImplemented("this payment method".to_string()) .into(), ), @@ -2512,10 +2520,20 @@ impl TryFrom<&types::PaymentsPreProcessingRouterData> for StripeCreditTransferSo currency, })) } - _ => Err(errors::ConnectorError::NotImplemented( - "Bank Transfer Method".to_string(), - ) - .into()), + payments::BankTransferData::SepaBankTransfer { .. } + | payments::BankTransferData::BacsBankTransfer { .. } + | payments::BankTransferData::PermataBankTransfer { .. } + | payments::BankTransferData::BcaBankTransfer { .. } + | payments::BankTransferData::BniVaBankTransfer { .. } + | payments::BankTransferData::BriVaBankTransfer { .. } + | payments::BankTransferData::CimbVaBankTransfer { .. } + | payments::BankTransferData::DanamonVaBankTransfer { .. } + | payments::BankTransferData::MandiriVaBankTransfer { .. } + | payments::BankTransferData::Pix { .. } + | payments::BankTransferData::Pse { .. } => Err( + errors::ConnectorError::NotImplemented("Bank Transfer Method".to_string()) + .into(), + ), } } _ => Err(errors::ConnectorError::NotImplemented("Payment Method".to_string()).into()), @@ -2954,6 +2972,18 @@ impl payments::BankTransferData::Pix {} | payments::BankTransferData::Pse {} => Err( errors::ConnectorError::NotImplemented("payment method".to_string()).into(), ), + payments::BankTransferData::PermataBankTransfer { .. } + | payments::BankTransferData::BcaBankTransfer { .. } + | payments::BankTransferData::BniVaBankTransfer { .. } + | payments::BankTransferData::BriVaBankTransfer { .. } + | payments::BankTransferData::CimbVaBankTransfer { .. } + | payments::BankTransferData::DanamonVaBankTransfer { .. } + | payments::BankTransferData::MandiriVaBankTransfer { .. } => { + Err(errors::ConnectorError::NotImplemented( + "this payment method for stripe".to_string(), + ) + .into()) + } } } api::PaymentMethodData::MandatePayment diff --git a/crates/router/src/connector/zen/transformers.rs b/crates/router/src/connector/zen/transformers.rs index 80cebc3cdb..de82cb42ca 100644 --- a/crates/router/src/connector/zen/transformers.rs +++ b/crates/router/src/connector/zen/transformers.rs @@ -245,6 +245,10 @@ impl ZenPaymentChannels::PclBoacompraRedcompra } api_models::payments::VoucherData::RedPagos => ZenPaymentChannels::PclBoacompraRedpagos, + api_models::payments::VoucherData::Alfamart { .. } + | api_models::payments::VoucherData::Indomaret { .. } => Err( + errors::ConnectorError::NotImplemented("payment method".to_string()), + )?, }; Ok(Self::ApiRequest(Box::new(ApiRequest { merchant_transaction_id: item.attempt_id.clone(), diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs index 2970034d84..468cf11030 100644 --- a/crates/router/src/core/payments/helpers.rs +++ b/crates/router/src/core/payments/helpers.rs @@ -1534,6 +1534,13 @@ pub fn validate_payment_method_type_against_payment_method( | api_enums::PaymentMethodType::Multibanco | api_enums::PaymentMethodType::Pix | api_enums::PaymentMethodType::Pse + | api_enums::PaymentMethodType::PermataBankTransfer + | api_enums::PaymentMethodType::BcaBankTransfer + | api_enums::PaymentMethodType::BniVa + | api_enums::PaymentMethodType::BriVa + | api_enums::PaymentMethodType::CimbVa + | api_enums::PaymentMethodType::DanamonVa + | api_enums::PaymentMethodType::MandiriVa ), api_enums::PaymentMethod::BankDebit => matches!( payment_method_type, @@ -1561,6 +1568,8 @@ pub fn validate_payment_method_type_against_payment_method( | api_enums::PaymentMethodType::PagoEfectivo | api_enums::PaymentMethodType::RedCompra | api_enums::PaymentMethodType::RedPagos + | api_enums::PaymentMethodType::Indomaret + | api_enums::PaymentMethodType::Alfamart ), api_enums::PaymentMethod::GiftCard => false, } diff --git a/crates/router/src/openapi.rs b/crates/router/src/openapi.rs index e2498c1f20..092e690f95 100644 --- a/crates/router/src/openapi.rs +++ b/crates/router/src/openapi.rs @@ -197,6 +197,8 @@ Never share your secret api keys. Keep them guarded and secure. api_models::payments::BoletoVoucherData, api_models::payments::Address, api_models::payments::VoucherData, + api_models::payments::AlfamartVoucherData, + api_models::payments::IndomaretVoucherData, api_models::payments::BankRedirectData, api_models::payments::BankRedirectBilling, api_models::payments::BankRedirectBilling, @@ -270,10 +272,12 @@ Never share your secret api keys. Keep them guarded and secure. api_models::payments::SepaAndBacsBillingDetails, api_models::payments::AchBillingDetails, api_models::payments::MultibancoBillingDetails, + api_models::payments::DokuBillingDetails, api_models::payments::BankTransferInstructions, api_models::payments::ReceiverDetails, api_models::payments::AchTransfer, api_models::payments::MultibancoTransferInstructions, + api_models::payments::DokuBankTransferInstructions, api_models::payments::ApplePayRedirectData, api_models::payments::ApplePayThirdPartySdkData, api_models::payments::GooglePayRedirectData, diff --git a/crates/router/src/types/transformers.rs b/crates/router/src/types/transformers.rs index 5cdee7e443..ef7c3801a0 100644 --- a/crates/router/src/types/transformers.rs +++ b/crates/router/src/types/transformers.rs @@ -223,10 +223,19 @@ impl ForeignFrom for api_enums::PaymentMethod { | api_enums::PaymentMethodType::Efecty | api_enums::PaymentMethodType::PagoEfectivo | api_enums::PaymentMethodType::RedCompra + | api_enums::PaymentMethodType::Alfamart + | api_enums::PaymentMethodType::Indomaret | api_enums::PaymentMethodType::RedPagos => Self::Voucher, - api_enums::PaymentMethodType::Multibanco - | api_enums::PaymentMethodType::Pix - | api_enums::PaymentMethodType::Pse => Self::BankTransfer, + api_enums::PaymentMethodType::Pse + | api_enums::PaymentMethodType::Multibanco + | api_enums::PaymentMethodType::PermataBankTransfer + | api_enums::PaymentMethodType::BcaBankTransfer + | api_enums::PaymentMethodType::BniVa + | api_enums::PaymentMethodType::BriVa + | api_enums::PaymentMethodType::CimbVa + | api_enums::PaymentMethodType::DanamonVa + | api_enums::PaymentMethodType::MandiriVa + | api_enums::PaymentMethodType::Pix => Self::BankTransfer, } } } diff --git a/openapi/openapi_spec.json b/openapi/openapi_spec.json index e4d0c4bc5f..ec72b900c5 100644 --- a/openapi/openapi_spec.json +++ b/openapi/openapi_spec.json @@ -2118,6 +2118,31 @@ } } }, + "AlfamartVoucherData": { + "type": "object", + "required": [ + "first_name", + "last_name", + "email" + ], + "properties": { + "first_name": { + "type": "string", + "description": "The billing first name for Alfamart", + "example": "Jane" + }, + "last_name": { + "type": "string", + "description": "The billing second name for Alfamart", + "example": "Doe" + }, + "email": { + "type": "string", + "description": "The Email ID for Alfamart", + "example": "example@me.com" + } + } + }, "AliPayHkRedirection": { "type": "object" }, @@ -3199,6 +3224,139 @@ } } }, + { + "type": "object", + "required": [ + "permata_bank_transfer" + ], + "properties": { + "permata_bank_transfer": { + "type": "object", + "required": [ + "billing_details" + ], + "properties": { + "billing_details": { + "$ref": "#/components/schemas/DokuBillingDetails" + } + } + } + } + }, + { + "type": "object", + "required": [ + "bca_bank_transfer" + ], + "properties": { + "bca_bank_transfer": { + "type": "object", + "required": [ + "billing_details" + ], + "properties": { + "billing_details": { + "$ref": "#/components/schemas/DokuBillingDetails" + } + } + } + } + }, + { + "type": "object", + "required": [ + "bni_va_bank_transfer" + ], + "properties": { + "bni_va_bank_transfer": { + "type": "object", + "required": [ + "billing_details" + ], + "properties": { + "billing_details": { + "$ref": "#/components/schemas/DokuBillingDetails" + } + } + } + } + }, + { + "type": "object", + "required": [ + "bri_va_bank_transfer" + ], + "properties": { + "bri_va_bank_transfer": { + "type": "object", + "required": [ + "billing_details" + ], + "properties": { + "billing_details": { + "$ref": "#/components/schemas/DokuBillingDetails" + } + } + } + } + }, + { + "type": "object", + "required": [ + "cimb_va_bank_transfer" + ], + "properties": { + "cimb_va_bank_transfer": { + "type": "object", + "required": [ + "billing_details" + ], + "properties": { + "billing_details": { + "$ref": "#/components/schemas/DokuBillingDetails" + } + } + } + } + }, + { + "type": "object", + "required": [ + "danamon_va_bank_transfer" + ], + "properties": { + "danamon_va_bank_transfer": { + "type": "object", + "required": [ + "billing_details" + ], + "properties": { + "billing_details": { + "$ref": "#/components/schemas/DokuBillingDetails" + } + } + } + } + }, + { + "type": "object", + "required": [ + "mandiri_va_bank_transfer" + ], + "properties": { + "mandiri_va_bank_transfer": { + "type": "object", + "required": [ + "billing_details" + ], + "properties": { + "billing_details": { + "$ref": "#/components/schemas/DokuBillingDetails" + } + } + } + } + }, { "type": "object", "required": [ @@ -3225,6 +3383,17 @@ }, "BankTransferInstructions": { "oneOf": [ + { + "type": "object", + "required": [ + "doku_bank_transfer_instructions" + ], + "properties": { + "doku_bank_transfer_instructions": { + "$ref": "#/components/schemas/DokuBankTransferInstructions" + } + } + }, { "type": "object", "required": [ @@ -3278,12 +3447,14 @@ }, { "type": "object", - "required": [ - "receiver" - ], "properties": { "receiver": { - "$ref": "#/components/schemas/ReceiverDetails" + "allOf": [ + { + "$ref": "#/components/schemas/ReceiverDetails" + } + ], + "nullable": true } } } @@ -4508,6 +4679,52 @@ "dispute_lost" ] }, + "DokuBankTransferInstructions": { + "type": "object", + "required": [ + "expires_at", + "reference", + "instructions_url" + ], + "properties": { + "expires_at": { + "type": "string", + "example": "2023-07-26T17:33:00-07-21" + }, + "reference": { + "type": "string", + "example": "122385736258" + }, + "instructions_url": { + "type": "string" + } + } + }, + "DokuBillingDetails": { + "type": "object", + "required": [ + "first_name", + "last_name", + "email" + ], + "properties": { + "first_name": { + "type": "string", + "description": "The billing first name for Doku", + "example": "Jane" + }, + "last_name": { + "type": "string", + "description": "The billing second name for Doku", + "example": "Doe" + }, + "email": { + "type": "string", + "description": "The Email ID for Doku billing", + "example": "example@me.com" + } + } + }, "EphemeralKeyCreateResponse": { "type": "object", "required": [ @@ -5090,6 +5307,31 @@ } } }, + "IndomaretVoucherData": { + "type": "object", + "required": [ + "first_name", + "last_name", + "email" + ], + "properties": { + "first_name": { + "type": "string", + "description": "The billing first name for Alfamart", + "example": "Jane" + }, + "last_name": { + "type": "string", + "description": "The billing second name for Alfamart", + "example": "Doe" + }, + "email": { + "type": "string", + "description": "The Email ID for Alfamart", + "example": "example@me.com" + } + } + }, "IntentStatus": { "type": "string", "enum": [ @@ -7398,6 +7640,7 @@ "ach", "affirm", "afterpay_clearpay", + "alfamart", "ali_pay", "ali_pay_hk", "alma", @@ -7409,11 +7652,16 @@ "bizum", "blik", "boleto", + "bca_bank_transfer", + "bni_va", + "bri_va", + "cimb_va", "classic", "credit", "crypto_currency", "cashapp", "dana", + "danamon_va", "debit", "efecty", "eps", @@ -7424,8 +7672,10 @@ "gcash", "ideal", "interac", + "indomaret", "klarna", "kakao_pay", + "mandiri_va", "mb_way", "mobile_pay", "momo", @@ -7437,6 +7687,7 @@ "online_banking_poland", "online_banking_slovakia", "pago_efectivo", + "permata_bank_transfer", "pay_bright", "paypal", "pix", @@ -10059,6 +10310,28 @@ "enum": [ "red_pagos" ] + }, + { + "type": "object", + "required": [ + "alfamart" + ], + "properties": { + "alfamart": { + "$ref": "#/components/schemas/AlfamartVoucherData" + } + } + }, + { + "type": "object", + "required": [ + "indomaret" + ], + "properties": { + "indomaret": { + "$ref": "#/components/schemas/IndomaretVoucherData" + } + } } ] },