@@ -837,10 +837,13 @@ pub async fn list_payment_methods(
837
837
. await
838
838
. to_not_found_response ( errors:: ApiErrorResponse :: MerchantAccountNotFound ) ?;
839
839
840
- logger:: debug!( mca_before_filtering=?all_mcas) ;
840
+ // filter out connectors based on the business country
841
+ let filtered_mcas = filter_mca_based_on_business_details ( all_mcas, payment_intent. as_ref ( ) ) ;
842
+
843
+ logger:: debug!( mca_before_filtering=?filtered_mcas) ;
841
844
842
845
let mut response: Vec < ResponsePaymentMethodIntermediate > = vec ! [ ] ;
843
- for mca in all_mcas {
846
+ for mca in filtered_mcas {
844
847
let payment_methods = match mca. payment_methods_enabled {
845
848
Some ( pm) => pm,
846
849
None => continue ,
@@ -874,6 +877,9 @@ pub async fn list_payment_methods(
874
877
let mut banks_consolidated_hm: HashMap < api_enums:: PaymentMethodType , Vec < String > > =
875
878
HashMap :: new ( ) ;
876
879
880
+ let mut bank_debits_consolidated_hm =
881
+ HashMap :: < api_enums:: PaymentMethodType , Vec < String > > :: new ( ) ;
882
+
877
883
for element in response. clone ( ) {
878
884
let payment_method = element. payment_method ;
879
885
let payment_method_type = element. payment_method_type ;
@@ -964,6 +970,17 @@ pub async fn list_payment_methods(
964
970
banks_consolidated_hm. insert ( element. payment_method_type , vec ! [ connector] ) ;
965
971
}
966
972
}
973
+
974
+ if element. payment_method == api_enums:: PaymentMethod :: BankDebit {
975
+ let connector = element. connector . clone ( ) ;
976
+ if let Some ( vector_of_connectors) =
977
+ bank_debits_consolidated_hm. get_mut ( & element. payment_method_type )
978
+ {
979
+ vector_of_connectors. push ( connector) ;
980
+ } else {
981
+ bank_debits_consolidated_hm. insert ( element. payment_method_type , vec ! [ connector] ) ;
982
+ }
983
+ }
967
984
}
968
985
969
986
let mut payment_method_responses: Vec < ResponsePaymentMethodsEnabled > = vec ! [ ] ;
@@ -983,6 +1000,7 @@ pub async fn list_payment_methods(
983
1000
payment_experience : Some ( payment_experience_types) ,
984
1001
card_networks : None ,
985
1002
bank_names : None ,
1003
+ bank_debits : None ,
986
1004
} )
987
1005
}
988
1006
@@ -1008,6 +1026,7 @@ pub async fn list_payment_methods(
1008
1026
card_networks : Some ( card_network_types) ,
1009
1027
payment_experience : None ,
1010
1028
bank_names : None ,
1029
+ bank_debits : None ,
1011
1030
} )
1012
1031
}
1013
1032
@@ -1017,26 +1036,52 @@ pub async fn list_payment_methods(
1017
1036
} )
1018
1037
}
1019
1038
1020
- let mut bank_payment_method_types = vec ! [ ] ;
1039
+ let mut bank_redirect_payment_method_types = vec ! [ ] ;
1021
1040
1022
1041
for key in banks_consolidated_hm. iter ( ) {
1023
1042
let payment_method_type = * key. 0 ;
1024
1043
let connectors = key. 1 . clone ( ) ;
1025
1044
let bank_names = get_banks ( state, payment_method_type, connectors) ?;
1026
- bank_payment_method_types . push ( {
1045
+ bank_redirect_payment_method_types . push ( {
1027
1046
ResponsePaymentMethodTypes {
1028
1047
payment_method_type,
1029
1048
bank_names : Some ( bank_names) ,
1030
1049
payment_experience : None ,
1031
1050
card_networks : None ,
1051
+ bank_debits : None ,
1032
1052
}
1033
1053
} )
1034
1054
}
1035
1055
1036
- if !bank_payment_method_types . is_empty ( ) {
1056
+ if !bank_redirect_payment_method_types . is_empty ( ) {
1037
1057
payment_method_responses. push ( ResponsePaymentMethodsEnabled {
1038
1058
payment_method : api_enums:: PaymentMethod :: BankRedirect ,
1039
- payment_method_types : bank_payment_method_types,
1059
+ payment_method_types : bank_redirect_payment_method_types,
1060
+ } ) ;
1061
+ }
1062
+
1063
+ let mut bank_debit_payment_method_types = vec ! [ ] ;
1064
+
1065
+ for key in bank_debits_consolidated_hm. iter ( ) {
1066
+ let payment_method_type = * key. 0 ;
1067
+ let connectors = key. 1 . clone ( ) ;
1068
+ bank_debit_payment_method_types. push ( {
1069
+ ResponsePaymentMethodTypes {
1070
+ payment_method_type,
1071
+ bank_names : None ,
1072
+ payment_experience : None ,
1073
+ card_networks : None ,
1074
+ bank_debits : Some ( api_models:: payment_methods:: BankDebitTypes {
1075
+ eligible_connectors : connectors,
1076
+ } ) ,
1077
+ }
1078
+ } )
1079
+ }
1080
+
1081
+ if !bank_debit_payment_method_types. is_empty ( ) {
1082
+ payment_method_responses. push ( ResponsePaymentMethodsEnabled {
1083
+ payment_method : api_enums:: PaymentMethod :: BankDebit ,
1084
+ payment_method_types : bank_debit_payment_method_types,
1040
1085
} ) ;
1041
1086
}
1042
1087
@@ -1169,6 +1214,25 @@ async fn filter_payment_methods(
1169
1214
Ok ( ( ) )
1170
1215
}
1171
1216
1217
+ fn filter_mca_based_on_business_details (
1218
+ merchant_connector_accounts : Vec <
1219
+ storage_models:: merchant_connector_account:: MerchantConnectorAccount ,
1220
+ > ,
1221
+ payment_intent : Option < & storage_models:: payment_intent:: PaymentIntent > ,
1222
+ ) -> Vec < storage_models:: merchant_connector_account:: MerchantConnectorAccount > {
1223
+ if let Some ( payment_intent) = payment_intent {
1224
+ merchant_connector_accounts
1225
+ . into_iter ( )
1226
+ . filter ( |mca| {
1227
+ mca. business_country == payment_intent. business_country
1228
+ && mca. business_label == payment_intent. business_label
1229
+ } )
1230
+ . collect :: < Vec < _ > > ( )
1231
+ } else {
1232
+ merchant_connector_accounts
1233
+ }
1234
+ }
1235
+
1172
1236
fn filter_pm_based_on_config < ' a > (
1173
1237
config : & ' a crate :: configs:: settings:: ConnectorFilters ,
1174
1238
connector : & ' a str ,
0 commit comments