Skip to content

Commit fdff861

Browse files
deepanshu-iiituDeepanshu Bansal
and
Deepanshu Bansal
authored
feat(connector): [BOA] Handle refund status 201 (#4911)
Co-authored-by: Deepanshu Bansal <[email protected]>
1 parent df7cf96 commit fdff861

File tree

1 file changed

+39
-9
lines changed

1 file changed

+39
-9
lines changed

crates/router/src/connector/bankofamerica/transformers.rs

+39-9
Original file line numberDiff line numberDiff line change
@@ -2607,21 +2607,31 @@ impl<F> TryFrom<&BankOfAmericaRouterData<&types::RefundsRouterData<F>>>
26072607
}
26082608
}
26092609

2610-
impl From<BankofamericaRefundStatus> for enums::RefundStatus {
2611-
fn from(item: BankofamericaRefundStatus) -> Self {
2612-
match item {
2610+
impl From<BankOfAmericaRefundResponse> for enums::RefundStatus {
2611+
fn from(item: BankOfAmericaRefundResponse) -> Self {
2612+
let error_reason = item
2613+
.error_information
2614+
.and_then(|error_info| error_info.reason);
2615+
match item.status {
26132616
BankofamericaRefundStatus::Succeeded | BankofamericaRefundStatus::Transmitted => {
26142617
Self::Success
26152618
}
26162619
BankofamericaRefundStatus::Cancelled
26172620
| BankofamericaRefundStatus::Failed
26182621
| BankofamericaRefundStatus::Voided => Self::Failure,
26192622
BankofamericaRefundStatus::Pending => Self::Pending,
2623+
BankofamericaRefundStatus::TwoZeroOne => {
2624+
if error_reason == Some("PROCESSOR_DECLINED".to_string()) {
2625+
Self::Failure
2626+
} else {
2627+
Self::Pending
2628+
}
2629+
}
26202630
}
26212631
}
26222632
}
26232633

2624-
#[derive(Debug, Deserialize, Serialize)]
2634+
#[derive(Debug, Clone, Deserialize, Serialize)]
26252635
#[serde(rename_all = "camelCase")]
26262636
pub struct BankOfAmericaRefundResponse {
26272637
id: String,
@@ -2636,19 +2646,19 @@ impl TryFrom<types::RefundsResponseRouterData<api::Execute, BankOfAmericaRefundR
26362646
fn try_from(
26372647
item: types::RefundsResponseRouterData<api::Execute, BankOfAmericaRefundResponse>,
26382648
) -> Result<Self, Self::Error> {
2639-
let refund_status = enums::RefundStatus::from(item.response.status.clone());
2649+
let refund_status = enums::RefundStatus::from(item.response.clone());
26402650
let response = if utils::is_refund_failure(refund_status) {
26412651
Err(types::ErrorResponse::foreign_from((
26422652
&item.response.error_information,
26432653
&None,
26442654
None,
26452655
item.http_code,
2646-
item.response.id.clone(),
2656+
item.response.id,
26472657
)))
26482658
} else {
26492659
Ok(types::RefundsResponseData {
26502660
connector_refund_id: item.response.id,
2651-
refund_status: enums::RefundStatus::from(item.response.status),
2661+
refund_status,
26522662
})
26532663
};
26542664

@@ -2668,6 +2678,8 @@ pub enum BankofamericaRefundStatus {
26682678
Pending,
26692679
Voided,
26702680
Cancelled,
2681+
#[serde(rename = "201")]
2682+
TwoZeroOne,
26712683
}
26722684

26732685
#[derive(Debug, Deserialize, Serialize)]
@@ -2697,8 +2709,26 @@ impl TryFrom<types::RefundsResponseRouterData<api::RSync, BankOfAmericaRsyncResp
26972709
.and_then(|application_information| application_information.status)
26982710
{
26992711
Some(status) => {
2700-
let refund_status: common_enums::RefundStatus =
2701-
enums::RefundStatus::from(status.clone());
2712+
let error_reason = item
2713+
.response
2714+
.error_information
2715+
.clone()
2716+
.and_then(|error_info| error_info.reason);
2717+
let refund_status = match status {
2718+
BankofamericaRefundStatus::Succeeded
2719+
| BankofamericaRefundStatus::Transmitted => enums::RefundStatus::Success,
2720+
BankofamericaRefundStatus::Cancelled
2721+
| BankofamericaRefundStatus::Failed
2722+
| BankofamericaRefundStatus::Voided => enums::RefundStatus::Failure,
2723+
BankofamericaRefundStatus::Pending => enums::RefundStatus::Pending,
2724+
BankofamericaRefundStatus::TwoZeroOne => {
2725+
if error_reason == Some("PROCESSOR_DECLINED".to_string()) {
2726+
enums::RefundStatus::Failure
2727+
} else {
2728+
enums::RefundStatus::Pending
2729+
}
2730+
}
2731+
};
27022732
if utils::is_refund_failure(refund_status) {
27032733
if status == BankofamericaRefundStatus::Voided {
27042734
Err(types::ErrorResponse::foreign_from((

0 commit comments

Comments
 (0)