diff --git a/config/config.example.toml b/config/config.example.toml index dda768bec3..9551fe4f7a 100644 --- a/config/config.example.toml +++ b/config/config.example.toml @@ -390,6 +390,8 @@ bank_debit.sepa = { connector_list = "gocardless" } # Mandate supported payment bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} # Mandate supported payment method type and connector for bank_redirect bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"} wallet.apple_pay = { connector_list = "stripe,adyen,cybersource,noon" } +bank_redirect.giropay = {connector_list = "adyen,globalpay"} + [mandates.update_mandate_supported] card.credit ={connector_list ="cybersource"} # Update Mandate supported payment method type and connector for card diff --git a/config/deployments/integration_test.toml b/config/deployments/integration_test.toml index 1ba455ee13..70975b8cdb 100644 --- a/config/deployments/integration_test.toml +++ b/config/deployments/integration_test.toml @@ -117,8 +117,10 @@ pay_later.klarna.connector_list = "adyen" wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon" wallet.google_pay.connector_list = "stripe,adyen,cybersource" wallet.paypal.connector_list = "adyen" -bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} -bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"} +bank_redirect.ideal.connector_list = "stripe,adyen,globalpay" +bank_redirect.sofort.connector_list = "stripe,adyen,globalpay" +bank_redirect.giropay.connector_list = "adyen,globalpay" + [mandates.update_mandate_supported] card.credit ={connector_list ="cybersource"} diff --git a/config/deployments/production.toml b/config/deployments/production.toml index ae76468232..acd3935a74 100644 --- a/config/deployments/production.toml +++ b/config/deployments/production.toml @@ -117,8 +117,9 @@ pay_later.klarna.connector_list = "adyen" wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon" wallet.google_pay.connector_list = "stripe,adyen,cybersource" wallet.paypal.connector_list = "adyen" -bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} -bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"} +bank_redirect.ideal.connector_list = "stripe,adyen,globalpay" +bank_redirect.sofort.connector_list = "stripe,adyen,globalpay" +bank_redirect.giropay.connector_list = "adyen,globalpay" [mandates.update_mandate_supported] card.credit ={connector_list ="cybersource"} diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml index 1cac50298f..42588cb734 100644 --- a/config/deployments/sandbox.toml +++ b/config/deployments/sandbox.toml @@ -117,8 +117,10 @@ pay_later.klarna.connector_list = "adyen" wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon" wallet.google_pay.connector_list = "stripe,adyen,cybersource" wallet.paypal.connector_list = "adyen" -bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} -bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"} +bank_redirect.ideal.connector_list = "stripe,adyen,globalpay" +bank_redirect.sofort.connector_list = "stripe,adyen,globalpay" +bank_redirect.giropay.connector_list = "adyen,globalpay" + [mandates.update_mandate_supported] card.credit ={connector_list ="cybersource"} diff --git a/config/development.toml b/config/development.toml index 1075452fbd..1bff54d8f4 100644 --- a/config/development.toml +++ b/config/development.toml @@ -486,6 +486,7 @@ bank_debit.becs = { connector_list = "gocardless"} bank_debit.sepa = { connector_list = "gocardless"} bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"} +bank_redirect.giropay = {connector_list = "adyen,globalpay"} [mandates.update_mandate_supported] card.credit ={connector_list ="cybersource"} diff --git a/config/docker_compose.toml b/config/docker_compose.toml index 244e908551..7aabf3bb56 100644 --- a/config/docker_compose.toml +++ b/config/docker_compose.toml @@ -351,6 +351,8 @@ bank_debit.becs = { connector_list = "gocardless"} bank_debit.sepa = { connector_list = "gocardless"} bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"} +bank_redirect.giropay = {connector_list = "adyen,globalpay"} + [connector_customer] connector_list = "gocardless,stax,stripe" diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index a9d415230e..6bccfd1124 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -1289,7 +1289,7 @@ pub enum BankRedirectData { }, Giropay { /// The billing details for bank redirection - billing_details: BankRedirectBilling, + billing_details: Option, /// Bank account details for Giropay #[schema(value_type = Option)] diff --git a/crates/router/src/configs/defaults.rs b/crates/router/src/configs/defaults.rs index 71cd61ffa8..d595d254e5 100644 --- a/crates/router/src/configs/defaults.rs +++ b/crates/router/src/configs/defaults.rs @@ -4482,13 +4482,225 @@ impl Default for super::settings::RequiredFields { ConnectorFields { fields: HashMap::from([ ( - enums::Connector::Stripe, + enums::Connector::Aci, + RequiredFieldFinal { + mandate: HashMap::new(), + non_mandate: HashMap::from([ + ( + "payment_method_data.bank_redirect.giropay.country".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.bank_redirect.giropay.country".to_string(), + display_name: "country".to_string(), + field_type: enums::FieldType::UserCountry { + options: vec![ + "DE".to_string(), + ]}, + value: None, + } + ) + ]), + common: HashMap::new(), + } + ), + ( + enums::Connector::Adyen, RequiredFieldFinal { mandate: HashMap::new(), non_mandate: HashMap::new(), common: HashMap::new(), } ), + ( + enums::Connector::Globalpay, + RequiredFieldFinal { + mandate: HashMap::new(), + non_mandate: HashMap::new(), + common: HashMap::from([ + ("billing.address.country".to_string(), + RequiredFieldInfo { + required_field: "billing.address.country".to_string(), + display_name: "country".to_string(), + field_type: enums::FieldType::UserAddressCountry { + options: vec![ + "DE".to_string(), + ] + }, + value: None, + } + ) + ]), + } + ), + ( + enums::Connector::Mollie, + RequiredFieldFinal { + mandate: HashMap::new(), + non_mandate: HashMap::new(), + common: HashMap::new(), + } + ), + ( + enums::Connector::Nuvei, + RequiredFieldFinal { + mandate: HashMap::new(), + non_mandate: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: "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: "billing.address.last_name".to_string(), + display_name: "billing_last_name".to_string(), + field_type: enums::FieldType::UserBillingName, + value: None, + } + ), + ( + "billing.address.country".to_string(), + RequiredFieldInfo { + required_field: "billing.address.country".to_string(), + display_name: "country".to_string(), + field_type: enums::FieldType::UserAddressCountry{ + options: vec![ + "DE".to_string(), + ] + }, + value: None, + } + )] + ), + common: HashMap::new(), + } + ), + ( + enums::Connector::Paypal, + RequiredFieldFinal { + mandate: HashMap::new(), + non_mandate: HashMap::from([ + ("payment_method_data.bank_redirect.giropay.country".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.bank_redirect.giropay.country".to_string(), + display_name: "country".to_string(), + field_type: enums::FieldType::UserCountry { + options: vec![ + "DE".to_string(), + ] + }, + value: None, + } + ), + ( + "payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(), + display_name: "billing_name".to_string(), + field_type: enums::FieldType::UserBillingName, + value: None, + } + ) + ]), + common: HashMap::new(), + } + ), + ( + enums::Connector::Stripe, + RequiredFieldFinal { + mandate: HashMap::new(), + non_mandate: HashMap::from([ + ("payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(), + RequiredFieldInfo { + required_field: "payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(), + display_name: "billing_name".to_string(), + field_type: enums::FieldType::UserBillingName, + value: None, + } + ) + ]), + common: HashMap::new(), + } + ), + ( + enums::Connector::Shift4, + RequiredFieldFinal { + mandate: HashMap::new(), + non_mandate: HashMap::new(), + common: HashMap::new(), + } + ), + ( + enums::Connector::Trustpay, + RequiredFieldFinal { + mandate: HashMap::new(), + non_mandate: HashMap::from([ + ( + "billing.address.first_name".to_string(), + RequiredFieldInfo { + required_field: "billing.address.first_name".to_string(), + display_name: "billing_first_name".to_string(), + field_type: enums::FieldType::UserBillingName, + value: None, + } + ), + ( + "billing.address.line1".to_string(), + RequiredFieldInfo { + required_field: "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: "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: "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: "billing.address.country".to_string(), + display_name: "country".to_string(), + field_type: enums::FieldType::UserAddressCountry { + options: vec![ + "DE".to_string(), + ] + }, + value: None, + } + ), + ]), + common: HashMap::new(), + } + ), ]), }, ), diff --git a/crates/router/src/connector/aci/transformers.rs b/crates/router/src/connector/aci/transformers.rs index 97cef72b02..92c7e164c4 100644 --- a/crates/router/src/connector/aci/transformers.rs +++ b/crates/router/src/connector/aci/transformers.rs @@ -166,10 +166,15 @@ impl api_models::payments::BankRedirectData::Giropay { bank_account_bic, bank_account_iban, + country, .. } => Self::BankRedirect(Box::new(BankRedirectionPMData { payment_brand: PaymentBrand::Giropay, - bank_account_country: Some(api_models::enums::CountryAlpha2::DE), + bank_account_country: Some(country.ok_or( + errors::ConnectorError::MissingRequiredField { + field_name: "giropay.country", + }, + )?), bank_account_bank_name: None, bank_account_bic: bank_account_bic.clone(), bank_account_iban: bank_account_iban.clone(), diff --git a/crates/router/src/connector/paypal/transformers.rs b/crates/router/src/connector/paypal/transformers.rs index 88595585fe..1447cf75be 100644 --- a/crates/router/src/connector/paypal/transformers.rs +++ b/crates/router/src/connector/paypal/transformers.rs @@ -315,7 +315,12 @@ fn get_payment_source( country, .. } => Ok(PaymentSourceItem::Giropay(RedirectRequest { - name: billing_details.get_billing_name()?, + name: billing_details + .clone() + .ok_or(errors::ConnectorError::MissingRequiredField { + field_name: "giropay.billing_details", + })? + .get_billing_name()?, country_code: country.ok_or(errors::ConnectorError::MissingRequiredField { field_name: "giropay.country", })?, diff --git a/crates/router/src/connector/stripe/transformers.rs b/crates/router/src/connector/stripe/transformers.rs index 8061234eef..eb2cdf506c 100644 --- a/crates/router/src/connector/stripe/transformers.rs +++ b/crates/router/src/connector/stripe/transformers.rs @@ -18,7 +18,8 @@ use url::Url; use crate::{ collect_missing_value_keys, connector::utils::{ - self as connector_util, ApplePay, ApplePayDecrypt, PaymentsPreProcessingData, RouterData, + self as connector_util, ApplePay, ApplePayDecrypt, BankRedirectBillingData, + PaymentsPreProcessingData, RouterData, }, consts, core::errors, @@ -1111,7 +1112,14 @@ impl TryFrom<(&payments::BankRedirectData, Option)> for StripeBillingAddre payments::BankRedirectData::Giropay { billing_details, .. } => Ok(Self { - name: billing_details.billing_name.clone(), + name: Some( + billing_details + .clone() + .ok_or(errors::ConnectorError::MissingRequiredField { + field_name: "giropay.billing_details", + })? + .get_billing_name()?, + ), ..Self::default() }), payments::BankRedirectData::Ideal { diff --git a/crates/router/src/connector/worldline/transformers.rs b/crates/router/src/connector/worldline/transformers.rs index c55663d59f..a21c88a2ce 100644 --- a/crates/router/src/connector/worldline/transformers.rs +++ b/crates/router/src/connector/worldline/transformers.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use url::Url; use crate::{ - connector::utils::{self, CardData}, + connector::utils::{self, BankRedirectBillingData, CardData}, core::errors, services, types::{ @@ -385,11 +385,12 @@ fn make_bank_redirect_request( { PaymentMethodSpecificData::PaymentProduct816SpecificInput(Box::new(Giropay { bank_account_iban: BankAccountIban { - account_holder_name: billing_details.billing_name.clone().ok_or( - errors::ConnectorError::MissingRequiredField { - field_name: "billing_details.billing_name", - }, - )?, + account_holder_name: billing_details + .clone() + .ok_or(errors::ConnectorError::MissingRequiredField { + field_name: "giropay.billing_details", + })? + .get_billing_name()?, iban: bank_account_iban.clone(), }, })) diff --git a/loadtest/config/development.toml b/loadtest/config/development.toml index c523237861..85dfec5232 100644 --- a/loadtest/config/development.toml +++ b/loadtest/config/development.toml @@ -251,6 +251,8 @@ bank_debit.becs = { connector_list = "gocardless"} bank_debit.sepa = { connector_list = "gocardless"} bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"} +bank_redirect.giropay = {connector_list = "adyen,globalpay"} + [mandates.update_mandate_supported] card.credit ={connector_list ="cybersource"} diff --git a/openapi/openapi_spec.json b/openapi/openapi_spec.json index be011422e0..06c1a8d806 100644 --- a/openapi/openapi_spec.json +++ b/openapi/openapi_spec.json @@ -5227,12 +5227,16 @@ "giropay": { "type": "object", "required": [ - "billing_details", "country" ], "properties": { "billing_details": { - "$ref": "#/components/schemas/BankRedirectBilling" + "allOf": [ + { + "$ref": "#/components/schemas/BankRedirectBilling" + } + ], + "nullable": true }, "bank_account_bic": { "type": "string",