feat(debit_routing): add debit_routing_savings in analytics payment attempt (#8519)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Shankar Singh C
2025-07-04 19:11:06 +05:30
committed by GitHub
parent 26ae469faf
commit fc3c64fad3
26 changed files with 617 additions and 44 deletions

View File

@ -111,6 +111,7 @@ pub enum PaymentMetrics {
AvgTicketSize,
RetriesCount,
ConnectorSuccessRate,
DebitRouting,
SessionizedPaymentSuccessRate,
SessionizedPaymentCount,
SessionizedPaymentSuccessCount,
@ -118,6 +119,7 @@ pub enum PaymentMetrics {
SessionizedAvgTicketSize,
SessionizedRetriesCount,
SessionizedConnectorSuccessRate,
SessionizedDebitRouting,
PaymentsDistribution,
FailureReasons,
}
@ -128,8 +130,10 @@ impl ForexMetric for PaymentMetrics {
self,
Self::PaymentProcessedAmount
| Self::AvgTicketSize
| Self::DebitRouting
| Self::SessionizedPaymentProcessedAmount
| Self::SessionizedAvgTicketSize
| Self::SessionizedDebitRouting,
)
}
}
@ -309,6 +313,9 @@ pub struct PaymentMetricsBucketValue {
pub payments_failure_rate_distribution_with_only_retries: Option<f64>,
pub failure_reason_count: Option<u64>,
pub failure_reason_count_without_smart_retries: Option<u64>,
pub debit_routed_transaction_count: Option<u64>,
pub debit_routing_savings: Option<u64>,
pub debit_routing_savings_in_usd: Option<u64>,
}
#[derive(Debug, serde::Serialize)]

View File

@ -67,7 +67,7 @@ pub struct DecidedGateway {
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
pub struct DebitRoutingOutput {
pub co_badged_card_networks_info: Vec<CoBadgedCardNetworksInfo>,
pub co_badged_card_networks_info: CoBadgedCardNetworks,
pub issuer_country: common_enums::CountryAlpha2,
pub is_regulated: bool,
pub regulated_name: Option<common_enums::RegulatedName>,
@ -80,19 +80,19 @@ pub struct CoBadgedCardNetworksInfo {
pub saving_percentage: f64,
}
impl DebitRoutingOutput {
pub fn get_co_badged_card_networks(&self) -> Vec<common_enums::CardNetwork> {
self.co_badged_card_networks_info
.iter()
.map(|data| data.network.clone())
.collect()
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
pub struct CoBadgedCardNetworks(pub Vec<CoBadgedCardNetworksInfo>);
impl CoBadgedCardNetworks {
pub fn get_card_networks(&self) -> Vec<common_enums::CardNetwork> {
self.0.iter().map(|info| info.network.clone()).collect()
}
}
impl From<&DebitRoutingOutput> for payment_methods::CoBadgedCardData {
fn from(output: &DebitRoutingOutput) -> Self {
Self {
co_badged_card_networks: output.get_co_badged_card_networks(),
co_badged_card_networks_info: output.co_badged_card_networks_info.clone(),
issuer_country_code: output.issuer_country,
is_regulated: output.is_regulated,
regulated_name: output.regulated_name.clone(),
@ -111,7 +111,7 @@ impl TryFrom<(payment_methods::CoBadgedCardData, String)> for DebitRoutingReques
})?;
Ok(Self {
co_badged_card_networks_info: output.co_badged_card_networks,
co_badged_card_networks_info: output.co_badged_card_networks_info.get_card_networks(),
issuer_country: output.issuer_country_code,
is_regulated: output.is_regulated,
regulated_name: output.regulated_name,

View File

@ -19,7 +19,7 @@ use utoipa::{schema, ToSchema};
#[cfg(feature = "payouts")]
use crate::payouts;
use crate::{
admin, enums as api_enums,
admin, enums as api_enums, open_router,
payments::{self, BankCodeResponse},
};
@ -937,14 +937,14 @@ pub struct PaymentMethodResponse {
pub network_token: Option<NetworkTokenResponse>,
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub enum PaymentMethodsData {
Card(CardDetailsPaymentMethod),
BankDetails(PaymentMethodDataBankCreds),
WalletDetails(PaymentMethodDataWalletInfo),
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct CardDetailsPaymentMethod {
pub last4_digits: Option<String>,
pub issuer_country: Option<String>,
@ -958,12 +958,33 @@ pub struct CardDetailsPaymentMethod {
pub card_type: Option<String>,
#[serde(default = "saved_in_locker_default")]
pub saved_to_locker: bool,
pub co_badged_card_data: Option<CoBadgedCardData>,
pub co_badged_card_data: Option<CoBadgedCardDataToBeSaved>,
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
impl From<&CoBadgedCardData> for CoBadgedCardDataToBeSaved {
fn from(co_badged_card_data: &CoBadgedCardData) -> Self {
Self {
co_badged_card_networks: co_badged_card_data
.co_badged_card_networks_info
.get_card_networks(),
issuer_country_code: co_badged_card_data.issuer_country_code,
is_regulated: co_badged_card_data.is_regulated,
regulated_name: co_badged_card_data.regulated_name.clone(),
}
}
}
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct CoBadgedCardData {
pub co_badged_card_networks: Vec<api_enums::CardNetwork>,
pub co_badged_card_networks_info: open_router::CoBadgedCardNetworks,
pub issuer_country_code: common_enums::CountryAlpha2,
pub is_regulated: bool,
pub regulated_name: Option<common_enums::RegulatedName>,
}
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct CoBadgedCardDataToBeSaved {
pub co_badged_card_networks: Vec<common_enums::CardNetwork>,
pub issuer_country_code: common_enums::CountryAlpha2,
pub is_regulated: bool,
pub regulated_name: Option<common_enums::RegulatedName>,
@ -1325,7 +1346,7 @@ impl From<(CardDetailFromLocker, Option<&CoBadgedCardData>)> for CardDetailsPaym
card_network: item.card_network,
card_type: item.card_type,
saved_to_locker: item.saved_to_locker,
co_badged_card_data: co_badged_card_data.cloned(),
co_badged_card_data: co_badged_card_data.map(CoBadgedCardDataToBeSaved::from),
}
}
}