From dbcca0fbc02bf3ef2e23d430d78a5b145e738768 Mon Sep 17 00:00:00 2001 From: Swangi Kumari <85639103+swangi-kumari@users.noreply.github.com> Date: Tue, 25 Mar 2025 19:55:01 +0530 Subject: [PATCH] feat(connector): [TRUSTPAY] implement Banktransfer PaymentMethod (#7575) Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> --- api-reference-v2/openapi_spec.json | 26 ++- api-reference/openapi_spec.json | 26 ++- config/config.example.toml | 4 + config/deployments/integration_test.toml | 4 + config/deployments/production.toml | 4 + config/deployments/sandbox.toml | 4 + config/development.toml | 2 + config/docker_compose.toml | 4 + crates/api_models/src/payments.rs | 9 +- .../src/payments/additional_info.rs | 1 + crates/common_enums/src/connector_enums.rs | 5 +- crates/common_enums/src/enums.rs | 2 + crates/common_enums/src/transformers.rs | 2 + .../connector_configs/toml/development.toml | 4 + crates/connector_configs/toml/production.toml | 4 + crates/connector_configs/toml/sandbox.toml | 4 + crates/euclid/src/frontend/dir/enums.rs | 3 +- crates/euclid/src/frontend/dir/lowering.rs | 3 +- .../euclid/src/frontend/dir/transformers.rs | 24 +-- .../src/connectors/adyen.rs | 4 +- .../src/connectors/adyen/transformers.rs | 1 + .../src/connectors/itaubank/transformers.rs | 1 + .../src/connectors/klarna.rs | 4 + .../src/connectors/paypal/transformers.rs | 3 + .../src/connectors/shift4/transformers.rs | 1 + .../src/connectors/trustpay.rs | 18 +- .../src/connectors/trustpay/transformers.rs | 96 ++++++++++- .../src/connectors/zen/transformers.rs | 1 + .../src/connectors/zsl/transformers.rs | 13 +- crates/hyperswitch_connectors/src/utils.rs | 4 + .../src/payment_method_data.rs | 6 + crates/kgraph_utils/src/mca.rs | 6 + crates/kgraph_utils/src/transformers.rs | 26 +-- .../payment_connector_required_fields.rs | 159 ++++++++++++++++++ .../src/connector/stripe/transformers.rs | 5 + crates/router/src/connector/utils.rs | 4 + crates/router/src/core/payments/helpers.rs | 3 +- crates/router/src/types/transformers.rs | 4 +- .../cypress/e2e/configs/Payout/Adyen.js | 6 +- .../e2e/configs/Payout/AdyenPlatform.js | 6 +- .../cypress/e2e/configs/Payout/Nomupay.js | 6 +- .../cypress/e2e/configs/Payout/Wise.js | 6 +- .../e2e/spec/Payout/00004-BankTransfer.cy.js | 6 +- .../e2e/spec/Payout/00005-SavePayout.cy.js | 12 +- .../00006-PayoutUsingPayoutMethodId.cy.js | 8 +- loadtest/config/development.toml | 4 + 46 files changed, 463 insertions(+), 85 deletions(-) diff --git a/api-reference-v2/openapi_spec.json b/api-reference-v2/openapi_spec.json index 77438d2d44..bf26710b42 100644 --- a/api-reference-v2/openapi_spec.json +++ b/api-reference-v2/openapi_spec.json @@ -5840,6 +5840,17 @@ "$ref": "#/components/schemas/LocalBankTransferAdditionalData" } } + }, + { + "type": "object", + "required": [ + "instant_bank_transfer" + ], + "properties": { + "instant_bank_transfer": { + "type": "object" + } + } } ] }, @@ -6140,6 +6151,17 @@ } } } + }, + { + "type": "object", + "required": [ + "instant_bank_transfer" + ], + "properties": { + "instant_bank_transfer": { + "type": "object" + } + } } ] }, @@ -15895,6 +15917,7 @@ "red_pagos", "samsung_pay", "sepa", + "sepa_bank_transfer", "sofort", "swish", "touch_n_go", @@ -15916,7 +15939,8 @@ "local_bank_transfer", "mifinity", "open_banking_pis", - "direct_carrier_billing" + "direct_carrier_billing", + "instant_bank_transfer" ] }, "PaymentMethodUpdate": { diff --git a/api-reference/openapi_spec.json b/api-reference/openapi_spec.json index 06b56e2add..67f26c307b 100644 --- a/api-reference/openapi_spec.json +++ b/api-reference/openapi_spec.json @@ -8063,6 +8063,17 @@ "$ref": "#/components/schemas/LocalBankTransferAdditionalData" } } + }, + { + "type": "object", + "required": [ + "instant_bank_transfer" + ], + "properties": { + "instant_bank_transfer": { + "type": "object" + } + } } ] }, @@ -8363,6 +8374,17 @@ } } } + }, + { + "type": "object", + "required": [ + "instant_bank_transfer" + ], + "properties": { + "instant_bank_transfer": { + "type": "object" + } + } } ] }, @@ -18203,6 +18225,7 @@ "red_pagos", "samsung_pay", "sepa", + "sepa_bank_transfer", "sofort", "swish", "touch_n_go", @@ -18224,7 +18247,8 @@ "local_bank_transfer", "mifinity", "open_banking_pis", - "direct_carrier_billing" + "direct_carrier_billing", + "instant_bank_transfer" ] }, "PaymentMethodUpdate": { diff --git a/config/config.example.toml b/config/config.example.toml index 7c80d99786..c373cabac0 100644 --- a/config/config.example.toml +++ b/config/config.example.toml @@ -664,6 +664,10 @@ mifinity = { country = "BR,CN,SG,MY,DE,CH,DK,GB,ES,AD,GI,FI,FR,GR,HR,IT,JP,MX,AR [pm_filters.fiuu] duit_now = { country = "MY", currency = "MYR" } +[pm_filters.trustpay] +instant_bank_transfer = { country = "CZ,SK,GB", currency = "CZK, EUR, GBP" } +sepa = { country = "ES,SK,AT,NL,DE,BE,FR,FI,PT,IE,EE,LT,LV,IT,GB", currency = "EUR" } + [pm_filters.dlocal] credit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} debit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} diff --git a/config/deployments/integration_test.toml b/config/deployments/integration_test.toml index 387bca0ca0..594c3aea76 100644 --- a/config/deployments/integration_test.toml +++ b/config/deployments/integration_test.toml @@ -452,6 +452,10 @@ duit_now = { country = "MY", currency = "MYR" } apple_pay = { country = "MY", currency = "MYR" } google_pay = { country = "MY", currency = "MYR" } +[pm_filters.trustpay] +instant_bank_transfer = { country = "CZ,SK,GB", currency = "CZK, EUR, GBP" } +sepa = { country = "ES,SK,AT,NL,DE,BE,FR,FI,PT,IE,EE,LT,LV,IT,GB", currency = "EUR" } + [pm_filters.dlocal] credit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} debit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} diff --git a/config/deployments/production.toml b/config/deployments/production.toml index 1418971068..1d52421f77 100644 --- a/config/deployments/production.toml +++ b/config/deployments/production.toml @@ -467,6 +467,10 @@ duit_now = { country = "MY", currency = "MYR" } apple_pay = { country = "MY", currency = "MYR" } google_pay = { country = "MY", currency = "MYR" } +[pm_filters.trustpay] +instant_bank_transfer = { country = "CZ,SK,GB", currency = "CZK, EUR, GBP" } +sepa = { country = "ES,SK,AT,NL,DE,BE,FR,FI,PT,IE,EE,LT,LV,IT,GB", currency = "EUR" } + [pm_filters.dlocal] credit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} debit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml index 0531a16a54..8f1b86fc3b 100644 --- a/config/deployments/sandbox.toml +++ b/config/deployments/sandbox.toml @@ -468,6 +468,10 @@ duit_now = { country = "MY", currency = "MYR" } apple_pay = { country = "MY", currency = "MYR" } google_pay = { country = "MY", currency = "MYR" } +[pm_filters.trustpay] +instant_bank_transfer = { country = "CZ,SK,GB", currency = "CZK, EUR, GBP" } +sepa = { country = "ES,SK,AT,NL,DE,BE,FR,FI,PT,IE,EE,LT,LV,IT,GB", currency = "EUR" } + [pm_filters.dlocal] credit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} debit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} diff --git a/config/development.toml b/config/development.toml index 94f06757f6..a61785cd82 100644 --- a/config/development.toml +++ b/config/development.toml @@ -669,6 +669,8 @@ card_redirect = { currency = "USD" } [pm_filters.trustpay] credit = { not_available_flows = { capture_method = "manual" } } debit = { not_available_flows = { capture_method = "manual" } } +instant_bank_transfer = { country = "CZ,SK,GB", currency = "CZK, EUR, GBP" } +sepa = { country = "ES,SK,AT,NL,DE,BE,FR,FI,PT,IE,EE,LT,LV,IT,GB", currency = "EUR" } [pm_filters.authorizedotnet] google_pay = { currency = "CHF,DKK,EUR,GBP,NOK,PLN,SEK,USD,AUD,NZD,CAD" } diff --git a/config/docker_compose.toml b/config/docker_compose.toml index 2a99693be6..0676ffa5e2 100644 --- a/config/docker_compose.toml +++ b/config/docker_compose.toml @@ -590,6 +590,10 @@ apple_pay = { country = "AU,CN,HK,JP,MO,MY,NZ,SG,TW,AM,AT,AZ,BY,BE,BG,HR,CY,CZ,D [pm_filters.fiuu] duit_now = { country = "MY", currency = "MYR" } +[pm_filters.trustpay] +instant_bank_transfer = { country = "CZ,SK,GB", currency = "CZK, EUR, GBP" } +sepa = { country = "ES,SK,AT,NL,DE,BE,FR,FI,PT,IE,EE,LT,LV,IT,GB", currency = "EUR" } + [pm_filters.dlocal] credit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} debit = {country = "AR,BD,BO,BR,CM,CL,CN,CO,CR,DO,EC,SV,EG,GH,GT,HN,IN,ID,CI,JP,KE,MY,MX,MA,NI,NG,PK,PA,PY,PE,PH,RW,SA,SN,ZA,TZ,TH,TR,UG,UY,VN,ZM", currency = "ARS,BDT,BOB,BRL,XAF,CLP,CNY,COP,CRC,DOP,USD,EGP,GHS,GTQ,HNL,INR,IDR,XOF,JPY,KES,MYR,MXN,MAD,NIO,NGN,PKR,PYG,PEN,PHP,RWF,SAR,XOF,ZAR,TZS,THB,TRY,UGX,UYU,VND,ZMW"} diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index c623add167..1d2ccafffb 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -2717,7 +2717,7 @@ impl GetPaymentMethodType for BankTransferData { fn get_payment_method_type(&self) -> api_enums::PaymentMethodType { match self { Self::AchBankTransfer { .. } => api_enums::PaymentMethodType::Ach, - Self::SepaBankTransfer { .. } => api_enums::PaymentMethodType::Sepa, + Self::SepaBankTransfer { .. } => api_enums::PaymentMethodType::SepaBankTransfer, Self::BacsBankTransfer { .. } => api_enums::PaymentMethodType::Bacs, Self::MultibancoBankTransfer { .. } => api_enums::PaymentMethodType::Multibanco, Self::PermataBankTransfer { .. } => api_enums::PaymentMethodType::PermataBankTransfer, @@ -2730,6 +2730,7 @@ impl GetPaymentMethodType for BankTransferData { Self::Pix { .. } => api_enums::PaymentMethodType::Pix, Self::Pse {} => api_enums::PaymentMethodType::Pse, Self::LocalBankTransfer { .. } => api_enums::PaymentMethodType::LocalBankTransfer, + Self::InstantBankTransfer {} => api_enums::PaymentMethodType::InstantBankTransfer, } } } @@ -3386,6 +3387,7 @@ pub enum BankTransferData { LocalBankTransfer { bank_code: Option, }, + InstantBankTransfer {}, } #[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)] @@ -3453,7 +3455,10 @@ impl GetAddressFromPaymentMethodData for BankTransferData { email: details.email.clone(), }) } - Self::LocalBankTransfer { .. } | Self::Pix { .. } | Self::Pse {} => None, + Self::LocalBankTransfer { .. } + | Self::Pix { .. } + | Self::Pse {} + | Self::InstantBankTransfer {} => None, } } } diff --git a/crates/api_models/src/payments/additional_info.rs b/crates/api_models/src/payments/additional_info.rs index 769e98214f..33297e2b34 100644 --- a/crates/api_models/src/payments/additional_info.rs +++ b/crates/api_models/src/payments/additional_info.rs @@ -151,6 +151,7 @@ pub enum BankTransferAdditionalData { Pix(Box), Pse {}, LocalBankTransfer(Box), + InstantBankTransfer {}, } #[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)] diff --git a/crates/common_enums/src/connector_enums.rs b/crates/common_enums/src/connector_enums.rs index 875dec5818..87595c3f6c 100644 --- a/crates/common_enums/src/connector_enums.rs +++ b/crates/common_enums/src/connector_enums.rs @@ -334,7 +334,10 @@ impl Connector { | (Self::Moneris, _) | (Self::Paypal, _) | (Self::Payu, _) - | (Self::Trustpay, PaymentMethod::BankRedirect) + | ( + Self::Trustpay, + PaymentMethod::BankRedirect | PaymentMethod::BankTransfer + ) | (Self::Iatapay, _) | (Self::Volt, _) | (Self::Itaubank, _) diff --git a/crates/common_enums/src/enums.rs b/crates/common_enums/src/enums.rs index 1d5efd3510..1777863768 100644 --- a/crates/common_enums/src/enums.rs +++ b/crates/common_enums/src/enums.rs @@ -1810,6 +1810,7 @@ pub enum PaymentMethodType { RedPagos, SamsungPay, Sepa, + SepaBankTransfer, Sofort, Swish, TouchNGo, @@ -1833,6 +1834,7 @@ pub enum PaymentMethodType { #[serde(rename = "open_banking_pis")] OpenBankingPIS, DirectCarrierBilling, + InstantBankTransfer, } impl PaymentMethodType { diff --git a/crates/common_enums/src/transformers.rs b/crates/common_enums/src/transformers.rs index 6fcc33a97f..6ff3bad4ad 100644 --- a/crates/common_enums/src/transformers.rs +++ b/crates/common_enums/src/transformers.rs @@ -1841,6 +1841,7 @@ impl From for PaymentMethod { PaymentMethodType::Multibanco => Self::BankTransfer, PaymentMethodType::MandiriVa => Self::BankTransfer, PaymentMethodType::Interac => Self::BankRedirect, + PaymentMethodType::InstantBankTransfer => Self::BankTransfer, PaymentMethodType::Indomaret => Self::Voucher, PaymentMethodType::OnlineBankingCzechRepublic => Self::BankRedirect, PaymentMethodType::OnlineBankingFinland => Self::BankRedirect, @@ -1860,6 +1861,7 @@ impl From for PaymentMethod { PaymentMethodType::PromptPay => Self::RealTimePayment, PaymentMethodType::SamsungPay => Self::Wallet, PaymentMethodType::Sepa => Self::BankDebit, + PaymentMethodType::SepaBankTransfer => Self::BankTransfer, PaymentMethodType::Sofort => Self::BankRedirect, PaymentMethodType::Swish => Self::BankRedirect, PaymentMethodType::Trustly => Self::BankRedirect, diff --git a/crates/connector_configs/toml/development.toml b/crates/connector_configs/toml/development.toml index 9fadf1c298..fa5ab4abee 100644 --- a/crates/connector_configs/toml/development.toml +++ b/crates/connector_configs/toml/development.toml @@ -3554,6 +3554,10 @@ merchant_secret="Source verification key" payment_method_type = "apple_pay" [[trustpay.wallet]] payment_method_type = "google_pay" +[[trustpay.bank_transfer]] + payment_method_type = "sepa" +[[trustpay.bank_transfer]] + payment_method_type = "instant_bank_transfer" [trustpay.connector_auth.SignatureKey] api_key="API Key" key1="Project ID" diff --git a/crates/connector_configs/toml/production.toml b/crates/connector_configs/toml/production.toml index c1f5116bca..c7bbddfc6d 100644 --- a/crates/connector_configs/toml/production.toml +++ b/crates/connector_configs/toml/production.toml @@ -2578,6 +2578,10 @@ options=["PAN_ONLY", "CRYPTOGRAM_3DS"] payment_method_type = "apple_pay" [[trustpay.wallet]] payment_method_type = "google_pay" +[[trustpay.bank_transfer]] + payment_method_type = "sepa" +[[trustpay.bank_transfer]] + payment_method_type = "instant_bank_transfer" [trustpay.connector_auth.SignatureKey] api_key="API Key" key1="Project ID" diff --git a/crates/connector_configs/toml/sandbox.toml b/crates/connector_configs/toml/sandbox.toml index b5016ce42e..19df992e3d 100644 --- a/crates/connector_configs/toml/sandbox.toml +++ b/crates/connector_configs/toml/sandbox.toml @@ -3487,6 +3487,10 @@ merchant_secret="Source verification key" payment_method_type = "apple_pay" [[trustpay.wallet]] payment_method_type = "google_pay" +[[trustpay.bank_transfer]] + payment_method_type = "sepa" +[[trustpay.bank_transfer]] + payment_method_type = "instant_bank_transfer" [trustpay.connector_auth.SignatureKey] api_key="API Key" key1="Project ID" diff --git a/crates/euclid/src/frontend/dir/enums.rs b/crates/euclid/src/frontend/dir/enums.rs index 58e9f6fca3..ef7449e1c1 100644 --- a/crates/euclid/src/frontend/dir/enums.rs +++ b/crates/euclid/src/frontend/dir/enums.rs @@ -201,7 +201,7 @@ pub enum OpenBankingType { pub enum BankTransferType { Multibanco, Ach, - Sepa, + SepaBankTransfer, Bacs, BcaBankTransfer, BniVa, @@ -213,6 +213,7 @@ pub enum BankTransferType { Pix, Pse, LocalBankTransfer, + InstantBankTransfer, } #[derive( diff --git a/crates/euclid/src/frontend/dir/lowering.rs b/crates/euclid/src/frontend/dir/lowering.rs index c5cb54378b..e58a6e28bd 100644 --- a/crates/euclid/src/frontend/dir/lowering.rs +++ b/crates/euclid/src/frontend/dir/lowering.rs @@ -111,7 +111,7 @@ impl From for global_enums::PaymentMethodType { enums::BankTransferType::Pix => Self::Pix, enums::BankTransferType::Pse => Self::Pse, enums::BankTransferType::Ach => Self::Ach, - enums::BankTransferType::Sepa => Self::Sepa, + enums::BankTransferType::SepaBankTransfer => Self::Sepa, enums::BankTransferType::Bacs => Self::Bacs, enums::BankTransferType::BcaBankTransfer => Self::BcaBankTransfer, enums::BankTransferType::BniVa => Self::BniVa, @@ -121,6 +121,7 @@ impl From for global_enums::PaymentMethodType { enums::BankTransferType::MandiriVa => Self::MandiriVa, enums::BankTransferType::PermataBankTransfer => Self::PermataBankTransfer, enums::BankTransferType::LocalBankTransfer => Self::LocalBankTransfer, + enums::BankTransferType::InstantBankTransfer => Self::InstantBankTransfer, } } } diff --git a/crates/euclid/src/frontend/dir/transformers.rs b/crates/euclid/src/frontend/dir/transformers.rs index 762f3a857b..d85c23e248 100644 --- a/crates/euclid/src/frontend/dir/transformers.rs +++ b/crates/euclid/src/frontend/dir/transformers.rs @@ -61,23 +61,10 @@ impl IntoDirValue for (global_enums::PaymentMethodType, global_enums::PaymentMet | global_enums::PaymentMethod::GiftCard => Err(AnalysisErrorType::NotSupported), }, global_enums::PaymentMethodType::Becs => Ok(dirval!(BankDebitType = Becs)), - global_enums::PaymentMethodType::Sepa => match self.1 { - global_enums::PaymentMethod::BankDebit => Ok(dirval!(BankDebitType = Sepa)), - global_enums::PaymentMethod::BankTransfer => Ok(dirval!(BankTransferType = Sepa)), - global_enums::PaymentMethod::PayLater - | global_enums::PaymentMethod::Card - | global_enums::PaymentMethod::CardRedirect - | global_enums::PaymentMethod::Wallet - | global_enums::PaymentMethod::BankRedirect - | global_enums::PaymentMethod::Crypto - | global_enums::PaymentMethod::Reward - | global_enums::PaymentMethod::RealTimePayment - | global_enums::PaymentMethod::Upi - | global_enums::PaymentMethod::Voucher - | global_enums::PaymentMethod::OpenBanking - | global_enums::PaymentMethod::MobilePayment - | global_enums::PaymentMethod::GiftCard => Err(AnalysisErrorType::NotSupported), - }, + global_enums::PaymentMethodType::Sepa => Ok(dirval!(BankDebitType = Sepa)), + global_enums::PaymentMethodType::SepaBankTransfer => { + Ok(dirval!(BankTransferType = SepaBankTransfer)) + } global_enums::PaymentMethodType::AliPay => Ok(dirval!(WalletType = AliPay)), global_enums::PaymentMethodType::AliPayHk => Ok(dirval!(WalletType = AliPayHk)), global_enums::PaymentMethodType::BancontactCard => { @@ -166,6 +153,9 @@ impl IntoDirValue for (global_enums::PaymentMethodType, global_enums::PaymentMet global_enums::PaymentMethodType::LocalBankTransfer => { Ok(dirval!(BankTransferType = LocalBankTransfer)) } + global_enums::PaymentMethodType::InstantBankTransfer => { + Ok(dirval!(BankTransferType = InstantBankTransfer)) + } global_enums::PaymentMethodType::PermataBankTransfer => { Ok(dirval!(BankTransferType = PermataBankTransfer)) } diff --git a/crates/hyperswitch_connectors/src/connectors/adyen.rs b/crates/hyperswitch_connectors/src/connectors/adyen.rs index b047d99a9d..4d84702d95 100644 --- a/crates/hyperswitch_connectors/src/connectors/adyen.rs +++ b/crates/hyperswitch_connectors/src/connectors/adyen.rs @@ -295,7 +295,9 @@ impl ConnectorValidation for Adyen { | PaymentMethodType::VietQr | PaymentMethodType::Mifinity | PaymentMethodType::LocalBankRedirect - | PaymentMethodType::OpenBankingPIS => { + | PaymentMethodType::OpenBankingPIS + | PaymentMethodType::InstantBankTransfer + | PaymentMethodType::SepaBankTransfer => { capture_method_not_supported!(connector, capture_method, payment_method_type) } }, diff --git a/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs b/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs index 2e87967b0f..942c25db65 100644 --- a/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs @@ -2459,6 +2459,7 @@ impl TryFrom<(&BankTransferData, &PaymentsAuthorizeRouterData)> for AdyenPayment | BankTransferData::BacsBankTransfer { .. } | BankTransferData::MultibancoBankTransfer { .. } | BankTransferData::LocalBankTransfer { .. } + | BankTransferData::InstantBankTransfer {} | BankTransferData::Pse {} => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Adyen"), ) diff --git a/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs b/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs index 77823c369b..4f6cc393fc 100644 --- a/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs @@ -105,6 +105,7 @@ impl TryFrom<&ItaubankRouterData<&types::PaymentsAuthorizeRouterData>> for Itaub | BankTransferData::DanamonVaBankTransfer {} | BankTransferData::MandiriVaBankTransfer {} | BankTransferData::Pse {} + | BankTransferData::InstantBankTransfer {} | BankTransferData::LocalBankTransfer { .. } => { Err(errors::ConnectorError::NotImplemented( "Selected payment method through itaubank".to_string(), diff --git a/crates/hyperswitch_connectors/src/connectors/klarna.rs b/crates/hyperswitch_connectors/src/connectors/klarna.rs index 50a830fdba..dd651ebd7b 100644 --- a/crates/hyperswitch_connectors/src/connectors/klarna.rs +++ b/crates/hyperswitch_connectors/src/connectors/klarna.rs @@ -625,6 +625,7 @@ impl ConnectorIntegration> for PaypalPayments | enums::PaymentMethodType::RedPagos | enums::PaymentMethodType::SamsungPay | enums::PaymentMethodType::Sepa + | enums::PaymentMethodType::SepaBankTransfer | enums::PaymentMethodType::Sofort | enums::PaymentMethodType::Swish | enums::PaymentMethodType::TouchNGo @@ -1219,6 +1220,7 @@ impl TryFrom<&PaypalRouterData<&PaymentsAuthorizeRouterData>> for PaypalPayments | enums::PaymentMethodType::Seicomart | enums::PaymentMethodType::PayEasy | enums::PaymentMethodType::LocalBankTransfer + | enums::PaymentMethodType::InstantBankTransfer | enums::PaymentMethodType::Mifinity | enums::PaymentMethodType::Paze => { Err(errors::ConnectorError::NotImplemented( @@ -1317,6 +1319,7 @@ impl TryFrom<&BankTransferData> for PaypalPaymentsRequest { | BankTransferData::MandiriVaBankTransfer { .. } | BankTransferData::Pix { .. } | BankTransferData::Pse {} + | BankTransferData::InstantBankTransfer {} | BankTransferData::LocalBankTransfer { .. } => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Paypal"), diff --git a/crates/hyperswitch_connectors/src/connectors/shift4/transformers.rs b/crates/hyperswitch_connectors/src/connectors/shift4/transformers.rs index cfa5c28e7b..63d77912ef 100644 --- a/crates/hyperswitch_connectors/src/connectors/shift4/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/shift4/transformers.rs @@ -338,6 +338,7 @@ impl TryFrom<&BankTransferData> for Shift4PaymentMethod { | BankTransferData::MandiriVaBankTransfer { .. } | BankTransferData::Pix { .. } | BankTransferData::Pse {} + | BankTransferData::InstantBankTransfer {} | BankTransferData::LocalBankTransfer { .. } => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Shift4"), diff --git a/crates/hyperswitch_connectors/src/connectors/trustpay.rs b/crates/hyperswitch_connectors/src/connectors/trustpay.rs index fed5c10946..508bb0bd5a 100644 --- a/crates/hyperswitch_connectors/src/connectors/trustpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/trustpay.rs @@ -77,7 +77,7 @@ where _connectors: &Connectors, ) -> CustomResult)>, errors::ConnectorError> { match req.payment_method { - enums::PaymentMethod::BankRedirect => { + enums::PaymentMethod::BankRedirect | enums::PaymentMethod::BankTransfer => { let token = req .access_token .clone() @@ -362,7 +362,7 @@ impl ConnectorIntegration for Tru ) -> CustomResult { let id = req.request.connector_transaction_id.clone(); match req.payment_method { - enums::PaymentMethod::BankRedirect => Ok(format!( + enums::PaymentMethod::BankRedirect | enums::PaymentMethod::BankTransfer => Ok(format!( "{}{}/{}", connectors.trustpay.base_url_bank_redirects, "api/Payments/Payment", @@ -554,7 +554,7 @@ impl ConnectorIntegration CustomResult { match req.payment_method { - enums::PaymentMethod::BankRedirect => Ok(format!( + enums::PaymentMethod::BankRedirect | enums::PaymentMethod::BankTransfer => Ok(format!( "{}{}", connectors.trustpay.base_url_bank_redirects, "api/Payments/Payment" )), @@ -579,7 +579,9 @@ impl ConnectorIntegration Ok(RequestContent::Json(Box::new(connector_req))), + enums::PaymentMethod::BankRedirect | enums::PaymentMethod::BankTransfer => { + Ok(RequestContent::Json(Box::new(connector_req))) + } _ => Ok(RequestContent::FormUrlEncoded(Box::new(connector_req))), } } @@ -656,7 +658,7 @@ impl ConnectorIntegration for Trustpa connectors: &Connectors, ) -> CustomResult { match req.payment_method { - enums::PaymentMethod::BankRedirect => Ok(format!( + enums::PaymentMethod::BankRedirect | enums::PaymentMethod::BankTransfer => Ok(format!( "{}{}{}{}", connectors.trustpay.base_url_bank_redirects, "api/Payments/Payment/", @@ -681,7 +683,9 @@ impl ConnectorIntegration for Trustpa let connector_router_data = trustpay::TrustpayRouterData::try_from((amount, req))?; let connector_req = trustpay::TrustpayRefundRequest::try_from(&connector_router_data)?; match req.payment_method { - enums::PaymentMethod::BankRedirect => Ok(RequestContent::Json(Box::new(connector_req))), + enums::PaymentMethod::BankRedirect | enums::PaymentMethod::BankTransfer => { + Ok(RequestContent::Json(Box::new(connector_req))) + } _ => Ok(RequestContent::FormUrlEncoded(Box::new(connector_req))), } } @@ -756,7 +760,7 @@ impl ConnectorIntegration for Trustpay .to_owned() .ok_or(errors::ConnectorError::MissingConnectorRefundID)?; match req.payment_method { - enums::PaymentMethod::BankRedirect => Ok(format!( + enums::PaymentMethod::BankRedirect | enums::PaymentMethod::BankTransfer => Ok(format!( "{}{}/{}", connectors.trustpay.base_url_bank_redirects, "api/Payments/Payment", id )), diff --git a/crates/hyperswitch_connectors/src/connectors/trustpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/trustpay/transformers.rs index 0b94b81619..db5d4a0c11 100644 --- a/crates/hyperswitch_connectors/src/connectors/trustpay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/trustpay/transformers.rs @@ -10,7 +10,7 @@ use common_utils::{ }; use error_stack::{report, ResultExt}; use hyperswitch_domain_models::{ - payment_method_data::{BankRedirectData, Card, PaymentMethodData}, + payment_method_data::{BankRedirectData, BankTransferData, Card, PaymentMethodData}, router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, router_request_types::{BrowserInformation, PaymentsPreProcessingData, ResponseId}, router_response_types::{ @@ -88,6 +88,13 @@ pub enum TrustpayPaymentMethod { Blik, } +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +pub enum TrustpayBankTransferPaymentMethod { + SepaCreditTransfer, + #[serde(rename = "Wire")] + InstantBankTransfer, +} + #[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[serde(rename_all = "PascalCase")] pub struct MerchantIdentification { @@ -216,6 +223,16 @@ pub struct PaymentRequestBankRedirect { pub enum TrustpayPaymentsRequest { CardsPaymentRequest(Box), BankRedirectPaymentRequest(Box), + BankTransferPaymentRequest(Box), +} + +#[derive(Debug, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentRequestBankTransfer { + pub payment_method: TrustpayBankTransferPaymentMethod, + pub merchant_identification: MerchantIdentification, + pub payment_information: BankPaymentInformation, + pub callback_urls: CallbackURLs, } #[derive(Debug, Serialize, Eq, PartialEq)] @@ -259,6 +276,20 @@ impl TryFrom<&BankRedirectData> for TrustpayPaymentMethod { } } +impl TryFrom<&BankTransferData> for TrustpayBankTransferPaymentMethod { + type Error = Error; + fn try_from(value: &BankTransferData) -> Result { + match value { + BankTransferData::SepaBankTransfer { .. } => Ok(Self::SepaCreditTransfer), + BankTransferData::InstantBankTransfer {} => Ok(Self::InstantBankTransfer), + _ => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("trustpay"), + ) + .into()), + } + } +} + fn get_mandatory_fields( item: &PaymentsAuthorizeRouterData, ) -> Result { @@ -356,6 +387,25 @@ fn get_debtor_info( }) } +fn get_bank_transfer_debtor_info( + item: &PaymentsAuthorizeRouterData, + pm: TrustpayBankTransferPaymentMethod, + params: TrustpayMandatoryParams, +) -> CustomResult, errors::ConnectorError> { + let billing_last_name = item + .get_billing()? + .address + .as_ref() + .and_then(|address| address.last_name.clone()); + Ok(match pm { + TrustpayBankTransferPaymentMethod::SepaCreditTransfer + | TrustpayBankTransferPaymentMethod::InstantBankTransfer => Some(DebtorInformation { + name: get_full_name(params.billing_first_name, billing_last_name), + email: item.request.get_email()?, + }), + }) +} + fn get_bank_redirection_request_data( item: &PaymentsAuthorizeRouterData, bank_redirection_data: &BankRedirectData, @@ -390,6 +440,40 @@ fn get_bank_redirection_request_data( Ok(payment_request) } +fn get_bank_transfer_request_data( + item: &PaymentsAuthorizeRouterData, + bank_transfer_data: &BankTransferData, + params: TrustpayMandatoryParams, + amount: StringMajorUnit, + auth: TrustpayAuthType, +) -> Result> { + let pm = TrustpayBankTransferPaymentMethod::try_from(bank_transfer_data)?; + let return_url = item.request.get_router_return_url()?; + let payment_request = + TrustpayPaymentsRequest::BankTransferPaymentRequest(Box::new(PaymentRequestBankTransfer { + payment_method: pm.clone(), + merchant_identification: MerchantIdentification { + project_id: auth.project_id, + }, + payment_information: BankPaymentInformation { + amount: Amount { + amount, + currency: item.request.currency.to_string(), + }, + references: References { + merchant_reference: item.connector_request_reference_id.clone(), + }, + debtor: get_bank_transfer_debtor_info(item, pm, params)?, + }, + callback_urls: CallbackURLs { + success: format!("{return_url}?status=SuccessOk"), + cancel: return_url.clone(), + error: return_url, + }, + })); + Ok(payment_request) +} + impl TryFrom<&TrustpayRouterData<&PaymentsAuthorizeRouterData>> for TrustpayPaymentsRequest { type Error = Error; fn try_from( @@ -439,11 +523,19 @@ impl TryFrom<&TrustpayRouterData<&PaymentsAuthorizeRouterData>> for TrustpayPaym auth, ) } + PaymentMethodData::BankTransfer(ref bank_transfer_data) => { + get_bank_transfer_request_data( + item.router_data, + bank_transfer_data, + params, + amount, + auth, + ) + } PaymentMethodData::CardRedirect(_) | PaymentMethodData::Wallet(_) | PaymentMethodData::PayLater(_) | PaymentMethodData::BankDebit(_) - | PaymentMethodData::BankTransfer(_) | PaymentMethodData::Crypto(_) | PaymentMethodData::MandatePayment | PaymentMethodData::Reward diff --git a/crates/hyperswitch_connectors/src/connectors/zen/transformers.rs b/crates/hyperswitch_connectors/src/connectors/zen/transformers.rs index bec1f6be0a..0de56dfafe 100644 --- a/crates/hyperswitch_connectors/src/connectors/zen/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/zen/transformers.rs @@ -346,6 +346,7 @@ impl | BankTransferData::CimbVaBankTransfer { .. } | BankTransferData::DanamonVaBankTransfer { .. } | BankTransferData::LocalBankTransfer { .. } + | BankTransferData::InstantBankTransfer {} | BankTransferData::MandiriVaBankTransfer { .. } => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Zen"), diff --git a/crates/hyperswitch_connectors/src/connectors/zsl/transformers.rs b/crates/hyperswitch_connectors/src/connectors/zsl/transformers.rs index 66bd3eda1d..9a273309af 100644 --- a/crates/hyperswitch_connectors/src/connectors/zsl/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/zsl/transformers.rs @@ -162,11 +162,14 @@ impl TryFrom<&ZslRouterData<&types::PaymentsAuthorizeRouterData>> for ZslPayment | BankTransferData::DanamonVaBankTransfer { .. } | BankTransferData::MandiriVaBankTransfer { .. } | BankTransferData::Pix { .. } - | BankTransferData::Pse {} => Err(errors::ConnectorError::NotImplemented( - get_unimplemented_payment_method_error_message( - item.router_data.connector.as_str(), - ), - )), + | BankTransferData::Pse {} + | BankTransferData::InstantBankTransfer {} => { + Err(errors::ConnectorError::NotImplemented( + get_unimplemented_payment_method_error_message( + item.router_data.connector.as_str(), + ), + )) + } }, PaymentMethodData::Card(_) | PaymentMethodData::CardRedirect(_) diff --git a/crates/hyperswitch_connectors/src/utils.rs b/crates/hyperswitch_connectors/src/utils.rs index 3805ba888e..9595d866b0 100644 --- a/crates/hyperswitch_connectors/src/utils.rs +++ b/crates/hyperswitch_connectors/src/utils.rs @@ -5410,6 +5410,7 @@ pub enum PaymentMethodDataType { NetworkToken, NetworkTransactionIdAndCardDetails, DirectCarrierBilling, + InstantBankTransfer, } impl From for PaymentMethodDataType { @@ -5555,6 +5556,9 @@ impl From for PaymentMethodDataType { payment_method_data::BankTransferData::LocalBankTransfer { .. } => { Self::LocalBankTransfer } + payment_method_data::BankTransferData::InstantBankTransfer {} => { + Self::InstantBankTransfer + } }, PaymentMethodData::Crypto(_) => Self::Crypto, PaymentMethodData::MandatePayment => Self::MandatePayment, diff --git a/crates/hyperswitch_domain_models/src/payment_method_data.rs b/crates/hyperswitch_domain_models/src/payment_method_data.rs index 3f253f7cc3..1f99e5cbfb 100644 --- a/crates/hyperswitch_domain_models/src/payment_method_data.rs +++ b/crates/hyperswitch_domain_models/src/payment_method_data.rs @@ -616,6 +616,7 @@ pub enum BankTransferData { LocalBankTransfer { bank_code: Option, }, + InstantBankTransfer {}, } #[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)] @@ -1421,6 +1422,9 @@ impl From for BankTransferData { api_models::payments::BankTransferData::LocalBankTransfer { bank_code } => { Self::LocalBankTransfer { bank_code } } + api_models::payments::BankTransferData::InstantBankTransfer {} => { + Self::InstantBankTransfer {} + } } } } @@ -1452,6 +1456,7 @@ impl From for api_models::payments::additional_info::BankTrans bank_code: bank_code.map(MaskedBankAccount::from), }, )), + BankTransferData::InstantBankTransfer {} => Self::InstantBankTransfer {}, } } } @@ -1702,6 +1707,7 @@ impl GetPaymentMethodType for BankTransferData { Self::Pix { .. } => api_enums::PaymentMethodType::Pix, Self::Pse {} => api_enums::PaymentMethodType::Pse, Self::LocalBankTransfer { .. } => api_enums::PaymentMethodType::LocalBankTransfer, + Self::InstantBankTransfer {} => api_enums::PaymentMethodType::InstantBankTransfer, } } } diff --git a/crates/kgraph_utils/src/mca.rs b/crates/kgraph_utils/src/mca.rs index 88c32a4818..68ab620b63 100644 --- a/crates/kgraph_utils/src/mca.rs +++ b/crates/kgraph_utils/src/mca.rs @@ -119,6 +119,12 @@ fn get_dir_value_payment_method( api_enums::PaymentMethodType::LocalBankTransfer => { Ok(dirval!(BankTransferType = LocalBankTransfer)) } + api_enums::PaymentMethodType::InstantBankTransfer => { + Ok(dirval!(BankTransferType = InstantBankTransfer)) + } + api_enums::PaymentMethodType::SepaBankTransfer => { + Ok(dirval!(BankTransferType = SepaBankTransfer)) + } api_enums::PaymentMethodType::PermataBankTransfer => { Ok(dirval!(BankTransferType = PermataBankTransfer)) } diff --git a/crates/kgraph_utils/src/transformers.rs b/crates/kgraph_utils/src/transformers.rs index 94faa4847d..14ff728453 100644 --- a/crates/kgraph_utils/src/transformers.rs +++ b/crates/kgraph_utils/src/transformers.rs @@ -188,25 +188,10 @@ impl IntoDirValue for (api_enums::PaymentMethodType, api_enums::PaymentMethod) { )), }, api_enums::PaymentMethodType::Becs => Ok(dirval!(BankDebitType = Becs)), - api_enums::PaymentMethodType::Sepa => match self.1 { - api_enums::PaymentMethod::BankDebit => Ok(dirval!(BankDebitType = Sepa)), - api_enums::PaymentMethod::BankTransfer => Ok(dirval!(BankTransferType = Sepa)), - api_enums::PaymentMethod::BankRedirect - | api_enums::PaymentMethod::Card - | api_enums::PaymentMethod::CardRedirect - | api_enums::PaymentMethod::PayLater - | api_enums::PaymentMethod::Wallet - | api_enums::PaymentMethod::Crypto - | api_enums::PaymentMethod::Reward - | api_enums::PaymentMethod::RealTimePayment - | api_enums::PaymentMethod::Upi - | api_enums::PaymentMethod::MobilePayment - | api_enums::PaymentMethod::Voucher - | api_enums::PaymentMethod::OpenBanking - | api_enums::PaymentMethod::GiftCard => Err(KgraphError::ContextConstructionError( - AnalysisErrorType::NotSupported, - )), - }, + api_enums::PaymentMethodType::Sepa => Ok(dirval!(BankDebitType = Sepa)), + api_enums::PaymentMethodType::SepaBankTransfer => { + Ok(dirval!(BankTransferType = SepaBankTransfer)) + } api_enums::PaymentMethodType::AliPay => Ok(dirval!(WalletType = AliPay)), api_enums::PaymentMethodType::AliPayHk => Ok(dirval!(WalletType = AliPayHk)), api_enums::PaymentMethodType::BancontactCard => { @@ -283,6 +268,9 @@ impl IntoDirValue for (api_enums::PaymentMethodType, api_enums::PaymentMethod) { api_enums::PaymentMethodType::LocalBankTransfer => { Ok(dirval!(BankTransferType = LocalBankTransfer)) } + api_enums::PaymentMethodType::InstantBankTransfer => { + Ok(dirval!(BankTransferType = InstantBankTransfer)) + } api_enums::PaymentMethodType::PermataBankTransfer => { Ok(dirval!(BankTransferType = PermataBankTransfer)) } diff --git a/crates/router/src/configs/defaults/payment_connector_required_fields.rs b/crates/router/src/configs/defaults/payment_connector_required_fields.rs index 3eda9c2a91..7e29d55d28 100644 --- a/crates/router/src/configs/defaults/payment_connector_required_fields.rs +++ b/crates/router/src/configs/defaults/payment_connector_required_fields.rs @@ -13446,10 +13446,169 @@ impl Default for settings::RequiredFields { ), ]), } + ), + ( + enums::Connector::Trustpay, + RequiredFieldFinal { + mandate : HashMap::new(), + non_mandate : HashMap::new(), + common : HashMap::from([ + ( + "email".to_string(), + RequiredFieldInfo { + required_field: "email".to_string(), + display_name: "email".to_string(), + field_type: enums::FieldType::UserEmailAddress, + value: None, + } + ), + ( + "billing.address.first_name".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.first_name".to_string(), + display_name: "billing_first_name".to_string(), + field_type: enums::FieldType::UserBillingName, + value: None, + } + ), + ( + "billing.address.last_name".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.last_name".to_string(), + display_name: "billing_last_name".to_string(), + field_type: enums::FieldType::UserBillingName, + value: None, + } + ), + ( + "billing.address.line1".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.line1".to_string(), + display_name: "line1".to_string(), + field_type: enums::FieldType::UserAddressLine1, + value: None, + } + ), + ( + "billing.address.city".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.city".to_string(), + display_name: "city".to_string(), + field_type: enums::FieldType::UserAddressCity, + value: None, + } + ), + ( + "billing.address.zip".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.zip".to_string(), + display_name: "zip".to_string(), + field_type: enums::FieldType::UserAddressPincode, + value: None, + } + ), + ( + "billing.address.country".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.country".to_string(), + display_name: "country".to_string(), + field_type: enums::FieldType::UserAddressCountry{ + options: vec![ + "ALL".to_string(), + ] + }, + value: None, + } + ), + ]), + } ) ]), }, ), + ( + enums::PaymentMethodType::InstantBankTransfer, + ConnectorFields { + fields: HashMap::from([ + ( + enums::Connector::Trustpay, + RequiredFieldFinal { + mandate : HashMap::new(), + non_mandate : HashMap::new(), + common : HashMap::from([ + ( + "email".to_string(), + RequiredFieldInfo { + required_field: "email".to_string(), + display_name: "email".to_string(), + field_type: enums::FieldType::UserEmailAddress, + value: None, + } + ), + ( + "billing.address.first_name".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.first_name".to_string(), + display_name: "billing_first_name".to_string(), + field_type: enums::FieldType::UserBillingName, + value: None, + } + ), + ( + "billing.address.last_name".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.last_name".to_string(), + display_name: "billing_last_name".to_string(), + field_type: enums::FieldType::UserBillingName, + value: None, + } + ), + ( + "billing.address.line1".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.line1".to_string(), + display_name: "line1".to_string(), + field_type: enums::FieldType::UserAddressLine1, + value: None, + } + ), + ( + "billing.address.city".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.city".to_string(), + display_name: "city".to_string(), + field_type: enums::FieldType::UserAddressCity, + value: None, + } + ), + ( + "billing.address.zip".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.zip".to_string(), + display_name: "zip".to_string(), + field_type: enums::FieldType::UserAddressPincode, + value: None, + } + ), + ( + "billing.address.country".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.billing.address.country".to_string(), + display_name: "country".to_string(), + field_type: enums::FieldType::UserAddressCountry{ + options: vec![ + "ALL".to_string(), + ] + }, + value: None, + } + ), + ]), + } + ) + ]) + } + ), ( enums::PaymentMethodType::Bacs, ConnectorFields { diff --git a/crates/router/src/connector/stripe/transformers.rs b/crates/router/src/connector/stripe/transformers.rs index 39d43bd2e0..b6911f1f56 100644 --- a/crates/router/src/connector/stripe/transformers.rs +++ b/crates/router/src/connector/stripe/transformers.rs @@ -762,6 +762,8 @@ impl TryFrom for StripePaymentMethodType { | enums::PaymentMethodType::Seicomart | enums::PaymentMethodType::PayEasy | enums::PaymentMethodType::LocalBankTransfer + | enums::PaymentMethodType::InstantBankTransfer + | enums::PaymentMethodType::SepaBankTransfer | enums::PaymentMethodType::Walley | enums::PaymentMethodType::Fps | enums::PaymentMethodType::DuitNow @@ -1293,6 +1295,7 @@ fn create_stripe_payment_method( } domain::BankTransferData::Pse {} | domain::BankTransferData::LocalBankTransfer { .. } + | domain::BankTransferData::InstantBankTransfer {} | domain::BankTransferData::PermataBankTransfer { .. } | domain::BankTransferData::BcaBankTransfer { .. } | domain::BankTransferData::BniVaBankTransfer { .. } @@ -3428,6 +3431,7 @@ impl | domain::BankTransferData::DanamonVaBankTransfer { .. } | domain::BankTransferData::MandiriVaBankTransfer { .. } | domain::BankTransferData::LocalBankTransfer { .. } + | domain::BankTransferData::InstantBankTransfer {} | domain::BankTransferData::Pix { .. } | domain::BankTransferData::Pse { .. } => { Err(errors::ConnectorError::NotImplemented( @@ -3897,6 +3901,7 @@ impl | domain::BankTransferData::CimbVaBankTransfer { .. } | domain::BankTransferData::DanamonVaBankTransfer { .. } | domain::BankTransferData::LocalBankTransfer { .. } + | domain::BankTransferData::InstantBankTransfer {} | domain::BankTransferData::MandiriVaBankTransfer { .. } => { Err(errors::ConnectorError::NotImplemented( connector_util::get_unimplemented_payment_method_error_message("stripe"), diff --git a/crates/router/src/connector/utils.rs b/crates/router/src/connector/utils.rs index 5009eaf4da..e6a69701ec 100644 --- a/crates/router/src/connector/utils.rs +++ b/crates/router/src/connector/utils.rs @@ -2853,6 +2853,7 @@ pub enum PaymentMethodDataType { OpenBanking, NetworkToken, DirectCarrierBilling, + InstantBankTransfer, } impl From for PaymentMethodDataType { @@ -3003,6 +3004,9 @@ impl From for PaymentMethodDataType { domain::payments::BankTransferData::LocalBankTransfer { .. } => { Self::LocalBankTransfer } + domain::payments::BankTransferData::InstantBankTransfer {} => { + Self::InstantBankTransfer + } } } domain::payments::PaymentMethodData::Crypto(_) => Self::Crypto, diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs index d8e6819089..a0a66359e8 100644 --- a/crates/router/src/core/payments/helpers.rs +++ b/crates/router/src/core/payments/helpers.rs @@ -3023,7 +3023,7 @@ pub fn validate_payment_method_type_against_payment_method( api_enums::PaymentMethod::BankTransfer => matches!( payment_method_type, api_enums::PaymentMethodType::Ach - | api_enums::PaymentMethodType::Sepa + | api_enums::PaymentMethodType::SepaBankTransfer | api_enums::PaymentMethodType::Bacs | api_enums::PaymentMethodType::Multibanco | api_enums::PaymentMethodType::Pix @@ -3036,6 +3036,7 @@ pub fn validate_payment_method_type_against_payment_method( | api_enums::PaymentMethodType::DanamonVa | api_enums::PaymentMethodType::MandiriVa | api_enums::PaymentMethodType::LocalBankTransfer + | api_enums::PaymentMethodType::InstantBankTransfer ), api_enums::PaymentMethod::BankDebit => matches!( payment_method_type, diff --git a/crates/router/src/types/transformers.rs b/crates/router/src/types/transformers.rs index 23c7f6ada9..ac8ac703f5 100644 --- a/crates/router/src/types/transformers.rs +++ b/crates/router/src/types/transformers.rs @@ -552,6 +552,8 @@ impl ForeignFrom for api_enums::PaymentMethod { | api_enums::PaymentMethodType::DanamonVa | api_enums::PaymentMethodType::MandiriVa | api_enums::PaymentMethodType::LocalBankTransfer + | api_enums::PaymentMethodType::InstantBankTransfer + | api_enums::PaymentMethodType::SepaBankTransfer | api_enums::PaymentMethodType::Pix => Self::BankTransfer, api_enums::PaymentMethodType::Givex | api_enums::PaymentMethodType::PaySafeCard => { Self::GiftCard @@ -1438,7 +1440,7 @@ impl ForeignFrom<&api_models::payouts::Bank> for api_enums::PaymentMethodType { match value { api_models::payouts::Bank::Ach(_) => Self::Ach, api_models::payouts::Bank::Bacs(_) => Self::Bacs, - api_models::payouts::Bank::Sepa(_) => Self::Sepa, + api_models::payouts::Bank::Sepa(_) => Self::SepaBankTransfer, api_models::payouts::Bank::Pix(_) => Self::Pix, } } diff --git a/cypress-tests/cypress/e2e/configs/Payout/Adyen.js b/cypress-tests/cypress/e2e/configs/Payout/Adyen.js index 2b4cdf9e2d..97350a1a26 100644 --- a/cypress-tests/cypress/e2e/configs/Payout/Adyen.js +++ b/cypress-tests/cypress/e2e/configs/Payout/Adyen.js @@ -109,7 +109,7 @@ export const connectorDetails = { }, }, bank_transfer_pm: { - sepa: { + sepa_bank_transfer: { Create: { Request: { payout_type: "bank", @@ -171,7 +171,7 @@ export const connectorDetails = { SavePayoutMethod: { Request: { payment_method: "bank_transfer", - payment_method_type: "sepa", + payment_method_type: "sepa_bank_transfer", bank_transfer: { iban: "NL57INGB4654188101", }, @@ -180,7 +180,7 @@ export const connectorDetails = { status: 200, body: { payment_method: "bank_transfer", - payment_method_type: "sepa", + payment_method_type: "sepa_bank_transfer", }, }, }, diff --git a/cypress-tests/cypress/e2e/configs/Payout/AdyenPlatform.js b/cypress-tests/cypress/e2e/configs/Payout/AdyenPlatform.js index 0048daf45b..a2b7fc0603 100644 --- a/cypress-tests/cypress/e2e/configs/Payout/AdyenPlatform.js +++ b/cypress-tests/cypress/e2e/configs/Payout/AdyenPlatform.js @@ -17,7 +17,7 @@ const billing = { export const connectorDetails = { bank_transfer_pm: { - sepa: { + sepa_bank_transfer: { Create: { Request: { payout_type: "bank", @@ -79,7 +79,7 @@ export const connectorDetails = { SavePayoutMethod: { Request: { payment_method: "bank_transfer", - payment_method_type: "sepa", + payment_method_type: "sepa_bank_transfer", bank_transfer: { iban: "NL57INGB4654188101", }, @@ -88,7 +88,7 @@ export const connectorDetails = { status: 200, body: { payment_method: "bank_transfer", - payment_method_type: "sepa", + payment_method_type: "sepa_bank_transfer", }, }, }, diff --git a/cypress-tests/cypress/e2e/configs/Payout/Nomupay.js b/cypress-tests/cypress/e2e/configs/Payout/Nomupay.js index cc25d6424f..156dc0c0b6 100644 --- a/cypress-tests/cypress/e2e/configs/Payout/Nomupay.js +++ b/cypress-tests/cypress/e2e/configs/Payout/Nomupay.js @@ -121,7 +121,7 @@ export const connectorDetails = { }, }, bank_transfer_pm: { - sepa: { + sepa_bank_transfer: { Create: { Request: { currency: "EUR", @@ -176,14 +176,14 @@ export const connectorDetails = { SavePayoutMethod: { Request: { payment_method: "bank_transfer", - payment_method_type: "sepa", + payment_method_type: "sepa_bank_transfer", bank_transfer: bank, }, Response: { status: 200, body: { payment_method: "bank_transfer", - payment_method_type: "sepa", + payment_method_type: "sepa_bank_transfer", }, }, }, diff --git a/cypress-tests/cypress/e2e/configs/Payout/Wise.js b/cypress-tests/cypress/e2e/configs/Payout/Wise.js index 829a28fda4..35fc23b6b2 100644 --- a/cypress-tests/cypress/e2e/configs/Payout/Wise.js +++ b/cypress-tests/cypress/e2e/configs/Payout/Wise.js @@ -122,7 +122,7 @@ export const connectorDetails = { }, }, bank_transfer_pm: { - sepa: { + sepa_bank_transfer: { Create: { Request: { currency: "GBP", @@ -196,7 +196,7 @@ export const connectorDetails = { SavePayoutMethod: { Request: { payment_method: "bank_transfer", - payment_method_type: "sepa", + payment_method_type: "sepa_bank_transfer", bank_transfer: { iban: "NL46TEST0136169112", bic: "ABNANL2A", @@ -209,7 +209,7 @@ export const connectorDetails = { status: 200, body: { payment_method: "bank_transfer", - payment_method_type: "sepa", + payment_method_type: "sepa_bank_transfer", }, }, }, diff --git a/cypress-tests/cypress/e2e/spec/Payout/00004-BankTransfer.cy.js b/cypress-tests/cypress/e2e/spec/Payout/00004-BankTransfer.cy.js index 95da27f5eb..c98af3eb7b 100644 --- a/cypress-tests/cypress/e2e/spec/Payout/00004-BankTransfer.cy.js +++ b/cypress-tests/cypress/e2e/spec/Payout/00004-BankTransfer.cy.js @@ -92,7 +92,7 @@ describe("[Payout] [Bank Transfer - SEPA]", () => { it("confirm-payout-call-with-auto-fulfill-test", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Fulfill"]; + ]["sepa_bank_transfer"]["Fulfill"]; cy.createConfirmPayoutTest( fixtures.createPayoutBody, @@ -125,7 +125,7 @@ describe("[Payout] [Bank Transfer - SEPA]", () => { it("confirm-payout-call-with-manual-fulfill-test", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Confirm"]; + ]["sepa_bank_transfer"]["Confirm"]; cy.createConfirmPayoutTest( fixtures.createPayoutBody, @@ -140,7 +140,7 @@ describe("[Payout] [Bank Transfer - SEPA]", () => { it("fulfill-payout-call-test", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Fulfill"]; + ]["sepa_bank_transfer"]["Fulfill"]; cy.fulfillPayoutCallTest({}, data, globalState); if (shouldContinue) shouldContinue = utils.should_continue_further(data); diff --git a/cypress-tests/cypress/e2e/spec/Payout/00005-SavePayout.cy.js b/cypress-tests/cypress/e2e/spec/Payout/00005-SavePayout.cy.js index 30ad8e6bf8..ba9cbc5892 100644 --- a/cypress-tests/cypress/e2e/spec/Payout/00005-SavePayout.cy.js +++ b/cypress-tests/cypress/e2e/spec/Payout/00005-SavePayout.cy.js @@ -167,7 +167,7 @@ describe("[Payout] Saved Bank transfer", () => { it("create payment method", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["SavePayoutMethod"]; + ]["sepa_bank_transfer"]["SavePayoutMethod"]; cy.createPaymentMethodTest(globalState, data); }); @@ -176,10 +176,10 @@ describe("[Payout] Saved Bank transfer", () => { cy.listCustomerPMCallTest(globalState); }); - it("[Payout] [Bank transfer] [SEPA] Fulfill using Token", () => { + it("[Payout] [Bank transfer] [SEPA_BANK_TRANSFER] Fulfill using Token", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Token"]; + ]["sepa_bank_transfer"]["Token"]; cy.createConfirmWithTokenPayoutTest( payoutBody, @@ -217,7 +217,7 @@ describe("[Payout] Saved Bank transfer", () => { it("confirm-payout-call-with-auto-fulfill-test", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Fulfill"]; + ]["sepa_bank_transfer"]["Fulfill"]; cy.createConfirmPayoutTest(payoutBody, data, true, true, globalState); @@ -229,10 +229,10 @@ describe("[Payout] Saved Bank transfer", () => { cy.listCustomerPMCallTest(globalState); }); - it("[Payout] [Bank transfer] [SEPA] Fulfill using Token", () => { + it("[Payout] [Bank transfer] [SEPA_BANK_TRANSFER] Fulfill using Token", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Token"]; + ]["sepa_bank_transfer"]["Token"]; cy.createConfirmWithTokenPayoutTest( payoutBody, diff --git a/cypress-tests/cypress/e2e/spec/Payout/00006-PayoutUsingPayoutMethodId.cy.js b/cypress-tests/cypress/e2e/spec/Payout/00006-PayoutUsingPayoutMethodId.cy.js index 50b1ce0f12..1307e2809c 100644 --- a/cypress-tests/cypress/e2e/spec/Payout/00006-PayoutUsingPayoutMethodId.cy.js +++ b/cypress-tests/cypress/e2e/spec/Payout/00006-PayoutUsingPayoutMethodId.cy.js @@ -44,7 +44,7 @@ describe("[Payout] Saved Bank transfer", () => { it("create payment method", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["SavePayoutMethod"]; + ]["sepa_bank_transfer"]["SavePayoutMethod"]; cy.createPaymentMethodTest(globalState, data); }); @@ -56,7 +56,7 @@ describe("[Payout] Saved Bank transfer", () => { it("[Payout] [Bank transfer] [SEPA] Fulfill using Token", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Token"]; + ]["sepa_bank_transfer"]["Token"]; cy.createConfirmWithTokenPayoutTest( payoutBody, @@ -94,7 +94,7 @@ describe("[Payout] Saved Bank transfer", () => { it("confirm-payout-call-with-auto-fulfill-test", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Fulfill"]; + ]["sepa_bank_transfer"]["Fulfill"]; cy.createConfirmPayoutTest(payoutBody, data, true, true, globalState); @@ -109,7 +109,7 @@ describe("[Payout] Saved Bank transfer", () => { it("[Payout] [Bank transfer] [SEPA] Fulfill using payout_method_id", () => { const data = utils.getConnectorDetails(globalState.get("connectorId"))[ "bank_transfer_pm" - ]["sepa"]["Token"]; + ]["sepa_bank_transfer"]["Token"]; cy.createConfirmWithPayoutMethodIdTest( payoutBody, diff --git a/loadtest/config/development.toml b/loadtest/config/development.toml index c516b81e1e..a468b97066 100644 --- a/loadtest/config/development.toml +++ b/loadtest/config/development.toml @@ -299,6 +299,10 @@ mifinity = { country = "BR,CN,SG,MY,DE,CH,DK,GB,ES,AD,GI,FI,FR,GR,HR,IT,JP,MX,AR [pm_filters.volt] open_banking_uk = { country = "DE,GB,AT,BE,CY,EE,ES,FI,FR,GR,HR,IE,IT,LT,LU,LV,MT,NL,PT,SI,SK,BG,CZ,DK,HU,NO,PL,RO,SE,AU,BR", currency = "EUR,GBP,DKK,NOK,PLN,SEK,AUD,BRL" } +[pm_filters.trustpay] +instant_bank_transfer = { country = "CZ,SK,GB", currency = "CZK, EUR, GBP" } +sepa = { country = "ES,SK,AT,NL,DE,BE,FR,FI,PT,IE,EE,LT,LV,IT,GB", currency = "EUR" } + [pm_filters.razorpay] upi_collect = { country = "IN", currency = "INR" }