feat(router): add merchant_category_code in business profile (#8296)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Shankar Singh C
2025-06-12 15:35:50 +05:30
committed by GitHub
parent 5a37c283d6
commit 0f14279866
17 changed files with 254 additions and 4 deletions

View File

@@ -13195,6 +13195,18 @@
},
"additionalProperties": false
},
"MerchantCategoryCode": {
"type": "string",
"enum": [
"5411",
"7011",
"0763",
"8111",
"5021",
"4816",
"5661"
]
},
"MerchantConnectorAccountFeatureMetadata": {
"type": "object",
"description": "Feature metadata for merchant connector account",
@@ -20977,6 +20989,14 @@
}
],
"nullable": true
},
"merchant_category_code": {
"allOf": [
{
"$ref": "#/components/schemas/MerchantCategoryCode"
}
],
"nullable": true
}
},
"additionalProperties": false
@@ -21246,6 +21266,14 @@
}
],
"nullable": true
},
"merchant_category_code": {
"allOf": [
{
"$ref": "#/components/schemas/MerchantCategoryCode"
}
],
"nullable": true
}
}
},

View File

@@ -16133,6 +16133,18 @@
},
"additionalProperties": false
},
"MerchantCategoryCode": {
"type": "string",
"enum": [
"5411",
"7011",
"0763",
"8111",
"5021",
"4816",
"5661"
]
},
"MerchantConnectorCreate": {
"type": "object",
"description": "Create a new Merchant Connector for the merchant account. The connector could be a payment processor / facilitator / acquirer or specialized services like Fraud / Accounting etc.\"",
@@ -25777,6 +25789,14 @@
"type": "boolean",
"description": "Indicates if pre network tokenization is enabled or not",
"nullable": true
},
"merchant_category_code": {
"allOf": [
{
"$ref": "#/components/schemas/MerchantCategoryCode"
}
],
"nullable": true
}
},
"additionalProperties": false
@@ -26075,6 +26095,14 @@
"description": "Indicates if the redirection has to open in the iframe",
"example": false,
"nullable": true
},
"merchant_category_code": {
"allOf": [
{
"$ref": "#/components/schemas/MerchantCategoryCode"
}
],
"nullable": true
}
}
},

View File

@@ -2121,6 +2121,10 @@ pub struct ProfileCreate {
/// Indicates if pre network tokenization is enabled or not
pub is_pre_network_tokenization_enabled: Option<bool>,
/// Four-digit code assigned based on business type to determine processing fees and risk level
#[schema(value_type = Option<MerchantCategoryCode>, example = "5411")]
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[nutype::nutype(
@@ -2263,6 +2267,10 @@ pub struct ProfileCreate {
/// External Vault Connector Details
pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
/// Four-digit code assigned based on business type to determine processing fees and risk level
#[schema(value_type = Option<MerchantCategoryCode>, example = "5411")]
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v1")]
@@ -2434,6 +2442,10 @@ pub struct ProfileResponse {
/// Indicates if the redirection has to open in the iframe
#[schema(example = false)]
pub is_iframe_redirection_enabled: Option<bool>,
/// Four-digit code assigned based on business type to determine processing fees and risk level
#[schema(value_type = Option<MerchantCategoryCode>, example = "5411")]
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v2")]
@@ -2584,6 +2596,10 @@ pub struct ProfileResponse {
/// External Vault Connector Details
pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
/// Four-digit code assigned based on business type to determine processing fees and risk level
#[schema(value_type = Option<MerchantCategoryCode>, example = "5411")]
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v1")]
@@ -2740,6 +2756,10 @@ pub struct ProfileUpdate {
/// Indicates if pre network tokenization is enabled or not
#[schema(default = false, example = false)]
pub is_pre_network_tokenization_enabled: Option<bool>,
/// Four-digit code assigned based on business type to determine processing fees and risk level
#[schema(value_type = Option<MerchantCategoryCode>, example = "5411")]
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v2")]
@@ -2872,6 +2892,10 @@ pub struct ProfileUpdate {
/// External Vault Connector Details
pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
/// Four-digit code assigned based on business type to determine processing fees and risk level
#[schema(value_type = Option<MerchantCategoryCode>, example = "5411")]
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]

View File

@@ -107,7 +107,7 @@ impl TryFrom<(payment_methods::CoBadgedCardData, String)> for DebitRoutingReques
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CoBadgedCardRequest {
pub merchant_category_code: common_enums::MerchantCategoryCode,
pub merchant_category_code: common_enums::DecisionEngineMerchantCategoryCode,
pub acquirer_country: common_enums::CountryAlpha2,
pub co_badged_card_data: Option<DebitRoutingRequestData>,
}

View File

@@ -2412,7 +2412,7 @@ pub enum CardType {
#[derive(Debug, Clone, Serialize, Deserialize, strum::EnumString, strum::Display)]
#[serde(rename_all = "snake_case")]
pub enum MerchantCategoryCode {
pub enum DecisionEngineMerchantCategoryCode {
#[serde(rename = "merchant_category_code_0001")]
Mcc0001,
}
@@ -2515,6 +2515,98 @@ pub enum DisputeStatus {
DisputeLost,
}
#[derive(
Clone,
Copy,
Debug,
Eq,
Hash,
PartialEq,
serde::Deserialize,
serde::Serialize,
strum::Display,
strum::EnumString,
strum::EnumIter,
strum::VariantNames,
ToSchema,
)]
pub enum MerchantCategory {
#[serde(rename = "Grocery Stores, Supermarkets (5411)")]
GroceryStoresSupermarkets,
#[serde(rename = "Lodging-Hotels, Motels, Resorts-not elsewhere classified (7011)")]
LodgingHotelsMotelsResorts,
#[serde(rename = "Agricultural Cooperatives (0763)")]
AgriculturalCooperatives,
#[serde(rename = "Attorneys, Legal Services (8111)")]
AttorneysLegalServices,
#[serde(rename = "Office and Commercial Furniture (5021)")]
OfficeAndCommercialFurniture,
#[serde(rename = "Computer Network/Information Services (4816)")]
ComputerNetworkInformationServices,
#[serde(rename = "Shoe Stores (5661)")]
ShoeStores,
}
#[derive(
Clone,
Copy,
Debug,
Eq,
Hash,
PartialEq,
serde::Deserialize,
serde::Serialize,
strum::Display,
strum::EnumString,
strum::EnumIter,
strum::VariantNames,
ToSchema,
)]
#[router_derive::diesel_enum(storage_type = "text")]
pub enum MerchantCategoryCode {
#[serde(rename = "5411")]
#[strum(serialize = "5411")]
Mcc5411,
#[serde(rename = "7011")]
#[strum(serialize = "7011")]
Mcc7011,
#[serde(rename = "0763")]
#[strum(serialize = "0763")]
Mcc0763,
#[serde(rename = "8111")]
#[strum(serialize = "8111")]
Mcc8111,
#[serde(rename = "5021")]
#[strum(serialize = "5021")]
Mcc5021,
#[serde(rename = "4816")]
#[strum(serialize = "4816")]
Mcc4816,
#[serde(rename = "5661")]
#[strum(serialize = "5661")]
Mcc5661,
}
impl MerchantCategoryCode {
pub fn to_merchant_category_name(&self) -> MerchantCategory {
match self {
Self::Mcc5411 => MerchantCategory::GroceryStoresSupermarkets,
Self::Mcc7011 => MerchantCategory::LodgingHotelsMotelsResorts,
Self::Mcc0763 => MerchantCategory::AgriculturalCooperatives,
Self::Mcc8111 => MerchantCategory::AttorneysLegalServices,
Self::Mcc5021 => MerchantCategory::OfficeAndCommercialFurniture,
Self::Mcc4816 => MerchantCategory::ComputerNetworkInformationServices,
Self::Mcc5661 => MerchantCategory::ShoeStores,
}
}
}
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug, PartialEq)]
pub struct MerchantCategoryCodeWithName {
pub code: MerchantCategoryCode,
pub name: MerchantCategory,
}
#[derive(
Clone,
Debug,

View File

@@ -75,6 +75,7 @@ pub struct Profile {
pub is_pre_network_tokenization_enabled: Option<bool>,
pub three_ds_decision_rule_algorithm: Option<serde_json::Value>,
pub acquirer_config_map: Option<common_types::domain::AcquirerConfigMap>,
pub merchant_category_code: Option<common_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v1")]
@@ -130,6 +131,7 @@ pub struct ProfileNew {
pub id: Option<common_utils::id_type::ProfileId>,
pub is_iframe_redirection_enabled: Option<bool>,
pub is_pre_network_tokenization_enabled: Option<bool>,
pub merchant_category_code: Option<common_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v1")]
@@ -185,6 +187,7 @@ pub struct ProfileUpdateInternal {
pub is_pre_network_tokenization_enabled: Option<bool>,
pub three_ds_decision_rule_algorithm: Option<serde_json::Value>,
pub acquirer_config_map: Option<common_types::domain::AcquirerConfigMap>,
pub merchant_category_code: Option<common_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v1")]
@@ -237,6 +240,7 @@ impl ProfileUpdateInternal {
is_pre_network_tokenization_enabled,
three_ds_decision_rule_algorithm,
acquirer_config_map,
merchant_category_code,
} = self;
Profile {
profile_id: source.profile_id,
@@ -320,6 +324,7 @@ impl ProfileUpdateInternal {
three_ds_decision_rule_algorithm: three_ds_decision_rule_algorithm
.or(source.three_ds_decision_rule_algorithm),
acquirer_config_map: acquirer_config_map.or(source.acquirer_config_map),
merchant_category_code: merchant_category_code.or(source.merchant_category_code),
}
}
}
@@ -381,6 +386,7 @@ pub struct Profile {
pub is_iframe_redirection_enabled: Option<bool>,
pub three_ds_decision_rule_algorithm: Option<serde_json::Value>,
pub acquirer_config_map: Option<common_types::domain::AcquirerConfigMap>,
pub merchant_category_code: Option<common_enums::MerchantCategoryCode>,
pub routing_algorithm_id: Option<common_utils::id_type::RoutingId>,
pub order_fulfillment_time: Option<i64>,
pub order_fulfillment_time_origin: Option<common_enums::OrderFulfillmentTimeOrigin>,
@@ -452,6 +458,7 @@ pub struct ProfileNew {
pub is_clear_pan_retries_enabled: Option<bool>,
pub is_debit_routing_enabled: bool,
pub merchant_business_country: Option<common_enums::CountryAlpha2>,
pub merchant_category_code: Option<common_enums::MerchantCategoryCode>,
pub routing_algorithm_id: Option<common_utils::id_type::RoutingId>,
pub order_fulfillment_time: Option<i64>,
pub order_fulfillment_time_origin: Option<common_enums::OrderFulfillmentTimeOrigin>,
@@ -510,6 +517,7 @@ pub struct ProfileUpdateInternal {
pub is_clear_pan_retries_enabled: Option<bool>,
pub is_debit_routing_enabled: Option<bool>,
pub merchant_business_country: Option<common_enums::CountryAlpha2>,
pub merchant_category_code: Option<common_enums::MerchantCategoryCode>,
pub routing_algorithm_id: Option<common_utils::id_type::RoutingId>,
pub order_fulfillment_time: Option<i64>,
pub order_fulfillment_time_origin: Option<common_enums::OrderFulfillmentTimeOrigin>,
@@ -578,6 +586,7 @@ impl ProfileUpdateInternal {
is_iframe_redirection_enabled,
is_external_vault_enabled,
external_vault_connector_details,
merchant_category_code,
} = self;
Profile {
id: source.id,
@@ -671,6 +680,7 @@ impl ProfileUpdateInternal {
.or(source.external_vault_connector_details),
three_ds_decision_rule_algorithm: None,
acquirer_config_map: None,
merchant_category_code: merchant_category_code.or(source.merchant_category_code),
}
}
}

View File

@@ -229,6 +229,8 @@ diesel::table! {
is_pre_network_tokenization_enabled -> Nullable<Bool>,
three_ds_decision_rule_algorithm -> Nullable<Jsonb>,
acquirer_config_map -> Nullable<Jsonb>,
#[max_length = 16]
merchant_category_code -> Nullable<Varchar>,
}
}

View File

@@ -224,6 +224,8 @@ diesel::table! {
is_iframe_redirection_enabled -> Nullable<Bool>,
three_ds_decision_rule_algorithm -> Nullable<Jsonb>,
acquirer_config_map -> Nullable<Jsonb>,
#[max_length = 16]
merchant_category_code -> Nullable<Varchar>,
#[max_length = 64]
routing_algorithm_id -> Nullable<Varchar>,
order_fulfillment_time -> Nullable<Int8>,

View File

@@ -34,7 +34,7 @@ use wasm_bindgen::prelude::*;
use crate::utils::JsResultExt;
type JsResult = Result<JsValue, JsValue>;
use api_models::payment_methods::CountryCodeWithName;
use common_enums::CountryAlpha2;
use common_enums::{CountryAlpha2, MerchantCategoryCode, MerchantCategoryCodeWithName};
use strum::IntoEnumIterator;
struct SeedData {
@@ -91,6 +91,22 @@ pub fn get_two_letter_country_code() -> JsResult {
Ok(serde_wasm_bindgen::to_value(&country_code_with_name)?)
}
/// This function can be used by the frontend to get all the merchant category codes
/// along with their names.
#[wasm_bindgen(js_name=getMerchantCategoryCodeWithName)]
pub fn get_merchant_category_code_with_name() -> JsResult {
let merchant_category_codes_with_name = MerchantCategoryCode::iter()
.map(|mcc_value| MerchantCategoryCodeWithName {
code: mcc_value,
name: mcc_value.to_merchant_category_name(),
})
.collect::<Vec<_>>();
Ok(serde_wasm_bindgen::to_value(
&merchant_category_codes_with_name,
)?)
}
/// This function can be used by the frontend to provide the WASM with information about
/// all the merchant's connector accounts. The input argument is a vector of all the merchant's
/// connector accounts from the API.

View File

@@ -77,6 +77,7 @@ pub struct Profile {
pub is_pre_network_tokenization_enabled: bool,
pub three_ds_decision_rule_algorithm: Option<serde_json::Value>,
pub acquirer_config_map: Option<common_types::domain::AcquirerConfigMap>,
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v1")]
@@ -130,6 +131,7 @@ pub struct ProfileSetter {
pub merchant_business_country: Option<api_enums::CountryAlpha2>,
pub is_iframe_redirection_enabled: Option<bool>,
pub is_pre_network_tokenization_enabled: bool,
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v1")]
@@ -190,6 +192,7 @@ impl From<ProfileSetter> for Profile {
is_pre_network_tokenization_enabled: value.is_pre_network_tokenization_enabled,
three_ds_decision_rule_algorithm: None, // three_ds_decision_rule_algorithm is not yet created during profile creation
acquirer_config_map: None,
merchant_category_code: value.merchant_category_code,
}
}
}
@@ -250,6 +253,7 @@ pub struct ProfileGeneralUpdate {
pub merchant_business_country: Option<api_enums::CountryAlpha2>,
pub is_iframe_redirection_enabled: Option<bool>,
pub is_pre_network_tokenization_enabled: Option<bool>,
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v1")]
@@ -329,6 +333,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
merchant_business_country,
is_iframe_redirection_enabled,
is_pre_network_tokenization_enabled,
merchant_category_code,
} = *update;
Self {
@@ -379,6 +384,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_pre_network_tokenization_enabled,
three_ds_decision_rule_algorithm: None,
acquirer_config_map: None,
merchant_category_code,
}
}
ProfileUpdate::RoutingAlgorithmUpdate {
@@ -432,6 +438,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_pre_network_tokenization_enabled: None,
three_ds_decision_rule_algorithm,
acquirer_config_map: None,
merchant_category_code: None,
},
ProfileUpdate::DynamicRoutingAlgorithmUpdate {
dynamic_routing_algorithm,
@@ -482,6 +489,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_pre_network_tokenization_enabled: None,
three_ds_decision_rule_algorithm: None,
acquirer_config_map: None,
merchant_category_code: None,
},
ProfileUpdate::ExtendedCardInfoUpdate {
is_extended_card_info_enabled,
@@ -532,6 +540,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_pre_network_tokenization_enabled: None,
three_ds_decision_rule_algorithm: None,
acquirer_config_map: None,
merchant_category_code: None,
},
ProfileUpdate::ConnectorAgnosticMitUpdate {
is_connector_agnostic_mit_enabled,
@@ -582,6 +591,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_pre_network_tokenization_enabled: None,
three_ds_decision_rule_algorithm: None,
acquirer_config_map: None,
merchant_category_code: None,
},
ProfileUpdate::NetworkTokenizationUpdate {
is_network_tokenization_enabled,
@@ -632,6 +642,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_pre_network_tokenization_enabled: None,
three_ds_decision_rule_algorithm: None,
acquirer_config_map: None,
merchant_category_code: None,
},
ProfileUpdate::CardTestingSecretKeyUpdate {
card_testing_secret_key,
@@ -682,6 +693,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_pre_network_tokenization_enabled: None,
three_ds_decision_rule_algorithm: None,
acquirer_config_map: None,
merchant_category_code: None,
},
ProfileUpdate::AcquirerConfigMapUpdate {
acquirer_config_map,
@@ -732,6 +744,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_pre_network_tokenization_enabled: None,
three_ds_decision_rule_algorithm: None,
acquirer_config_map,
merchant_category_code: None,
},
}
}
@@ -802,6 +815,7 @@ impl super::behaviour::Conversion for Profile {
is_pre_network_tokenization_enabled: Some(self.is_pre_network_tokenization_enabled),
three_ds_decision_rule_algorithm: self.three_ds_decision_rule_algorithm,
acquirer_config_map: self.acquirer_config_map,
merchant_category_code: self.merchant_category_code,
})
}
@@ -898,6 +912,7 @@ impl super::behaviour::Conversion for Profile {
.unwrap_or(false),
three_ds_decision_rule_algorithm: item.three_ds_decision_rule_algorithm,
acquirer_config_map: item.acquirer_config_map,
merchant_category_code: item.merchant_category_code,
})
}
.await
@@ -961,6 +976,7 @@ impl super::behaviour::Conversion for Profile {
merchant_business_country: self.merchant_business_country,
is_iframe_redirection_enabled: self.is_iframe_redirection_enabled,
is_pre_network_tokenization_enabled: Some(self.is_pre_network_tokenization_enabled),
merchant_category_code: self.merchant_category_code,
})
}
}
@@ -1020,6 +1036,7 @@ pub struct Profile {
pub is_iframe_redirection_enabled: Option<bool>,
pub is_external_vault_enabled: Option<bool>,
pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v2")]
@@ -1075,6 +1092,7 @@ pub struct ProfileSetter {
pub is_iframe_redirection_enabled: Option<bool>,
pub is_external_vault_enabled: Option<bool>,
pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v2")]
@@ -1135,6 +1153,7 @@ impl From<ProfileSetter> for Profile {
is_iframe_redirection_enabled: value.is_iframe_redirection_enabled,
is_external_vault_enabled: value.is_external_vault_enabled,
external_vault_connector_details: value.external_vault_connector_details,
merchant_category_code: value.merchant_category_code,
}
}
}
@@ -1214,6 +1233,7 @@ pub struct ProfileGeneralUpdate {
pub is_iframe_redirection_enabled: Option<bool>,
pub is_external_vault_enabled: Option<bool>,
pub external_vault_connector_details: Option<ExternalVaultConnectorDetails>,
pub merchant_category_code: Option<api_enums::MerchantCategoryCode>,
}
#[cfg(feature = "v2")]
@@ -1292,6 +1312,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled,
is_external_vault_enabled,
external_vault_connector_details,
merchant_category_code,
} = *update;
Self {
profile_name,
@@ -1343,6 +1364,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled,
external_vault_connector_details,
merchant_category_code,
}
}
ProfileUpdate::RoutingAlgorithmUpdate {
@@ -1397,6 +1419,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
ProfileUpdate::ExtendedCardInfoUpdate {
is_extended_card_info_enabled,
@@ -1449,6 +1472,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
ProfileUpdate::ConnectorAgnosticMitUpdate {
is_connector_agnostic_mit_enabled,
@@ -1501,6 +1525,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
ProfileUpdate::DefaultRoutingFallbackUpdate {
default_fallback_routing,
@@ -1553,6 +1578,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
ProfileUpdate::NetworkTokenizationUpdate {
is_network_tokenization_enabled,
@@ -1605,6 +1631,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
ProfileUpdate::CollectCvvDuringPaymentUpdate {
should_collect_cvv_during_payment,
@@ -1657,6 +1684,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
ProfileUpdate::DecisionManagerRecordUpdate {
three_ds_decision_manager_config,
@@ -1709,6 +1737,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
ProfileUpdate::CardTestingSecretKeyUpdate {
card_testing_secret_key,
@@ -1761,6 +1790,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
ProfileUpdate::RevenueRecoveryAlgorithmUpdate {
revenue_recovery_retry_algorithm_type,
@@ -1814,6 +1844,7 @@ impl From<ProfileUpdate> for ProfileUpdateInternal {
is_iframe_redirection_enabled: None,
is_external_vault_enabled: None,
external_vault_connector_details: None,
merchant_category_code: None,
},
}
}
@@ -1890,6 +1921,7 @@ impl super::behaviour::Conversion for Profile {
external_vault_connector_details: self.external_vault_connector_details,
three_ds_decision_rule_algorithm: None,
acquirer_config_map: None,
merchant_category_code: self.merchant_category_code,
})
}
@@ -1983,6 +2015,7 @@ impl super::behaviour::Conversion for Profile {
is_iframe_redirection_enabled: item.is_iframe_redirection_enabled,
is_external_vault_enabled: item.is_external_vault_enabled,
external_vault_connector_details: item.external_vault_connector_details,
merchant_category_code: item.merchant_category_code,
})
}
.await
@@ -2051,6 +2084,7 @@ impl super::behaviour::Conversion for Profile {
is_iframe_redirection_enabled: self.is_iframe_redirection_enabled,
is_external_vault_enabled: self.is_external_vault_enabled,
external_vault_connector_details: self.external_vault_connector_details,
merchant_category_code: self.merchant_category_code,
})
}
}

View File

@@ -324,6 +324,7 @@ Never share your secret api keys. Keep them guarded and secure.
api_models::enums::BankType,
api_models::enums::BankHolderType,
api_models::enums::CardNetwork,
api_models::enums::MerchantCategoryCode,
api_models::enums::DisputeStage,
api_models::enums::DisputeStatus,
api_models::enums::CountryAlpha2,

View File

@@ -285,6 +285,7 @@ Never share your secret api keys. Keep them guarded and secure.
api_models::enums::BankType,
api_models::enums::BankHolderType,
api_models::enums::CardNetwork,
api_models::enums::MerchantCategoryCode,
api_models::enums::TokenDataType,
api_models::enums::DisputeStage,
api_models::enums::DisputeStatus,

View File

@@ -4052,6 +4052,7 @@ impl ProfileCreateBridge for api::ProfileCreate {
is_pre_network_tokenization_enabled: self
.is_pre_network_tokenization_enabled
.unwrap_or_default(),
merchant_category_code: self.merchant_category_code,
}))
}
@@ -4200,6 +4201,7 @@ impl ProfileCreateBridge for api::ProfileCreate {
external_vault_connector_details: self
.external_vault_connector_details
.map(ForeignInto::foreign_into),
merchant_category_code: self.merchant_category_code,
}))
}
}
@@ -4533,6 +4535,7 @@ impl ProfileUpdateBridge for api::ProfileUpdate {
merchant_business_country: self.merchant_business_country,
is_iframe_redirection_enabled: self.is_iframe_redirection_enabled,
is_pre_network_tokenization_enabled: self.is_pre_network_tokenization_enabled,
merchant_category_code: self.merchant_category_code,
},
)))
}
@@ -4672,6 +4675,7 @@ impl ProfileUpdateBridge for api::ProfileUpdate {
external_vault_connector_details: self
.external_vault_connector_details
.map(ForeignInto::foreign_into),
merchant_category_code: self.merchant_category_code,
},
)))
}

View File

@@ -315,7 +315,7 @@ pub async fn get_debit_routing_output<
}
let co_badged_card_request = open_router::CoBadgedCardRequest {
merchant_category_code: enums::MerchantCategoryCode::Mcc0001,
merchant_category_code: enums::DecisionEngineMerchantCategoryCode::Mcc0001,
acquirer_country,
co_badged_card_data,
};

View File

@@ -199,6 +199,7 @@ impl ForeignTryFrom<domain::Profile> for ProfileResponse {
is_pre_network_tokenization_enabled: item.is_pre_network_tokenization_enabled,
acquirer_configs: item.acquirer_config_map,
is_iframe_redirection_enabled: item.is_iframe_redirection_enabled,
merchant_category_code: item.merchant_category_code,
})
}
}
@@ -283,6 +284,7 @@ impl ForeignTryFrom<domain::Profile> for ProfileResponse {
external_vault_connector_details: item
.external_vault_connector_details
.map(ForeignInto::foreign_into),
merchant_category_code: item.merchant_category_code,
})
}
}
@@ -450,5 +452,6 @@ pub async fn create_profile_from_merchant_account(
is_pre_network_tokenization_enabled: request
.is_pre_network_tokenization_enabled
.unwrap_or_default(),
merchant_category_code: request.merchant_category_code,
}))
}

View File

@@ -0,0 +1,2 @@
-- This file should undo anything in `up.sql`
ALTER TABLE business_profile DROP COLUMN IF EXISTS merchant_category_code;

View File

@@ -0,0 +1,3 @@
-- Your SQL goes here
ALTER TABLE business_profile
ADD COLUMN merchant_category_code VARCHAR(16) DEFAULT NULL;