diff --git a/crates/router/src/connector/cybersource.rs b/crates/router/src/connector/cybersource.rs index 1db71ae90c..13f292b6cd 100644 --- a/crates/router/src/connector/cybersource.rs +++ b/crates/router/src/connector/cybersource.rs @@ -247,12 +247,14 @@ impl ConnectorIntegration CustomResult { let response: cybersource::CybersourceTransactionResponse = res .response - .parse_struct("Cybersource PaymentSyncResponse") + .parse_struct("Cybersource RefundsSyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; logger::debug!(cybersourcepayments_create_response=?response); types::ResponseRouterData { diff --git a/crates/router/src/connector/cybersource/transformers.rs b/crates/router/src/connector/cybersource/transformers.rs index d7dbb8a820..32968005a0 100644 --- a/crates/router/src/connector/cybersource/transformers.rs +++ b/crates/router/src/connector/cybersource/transformers.rs @@ -280,21 +280,27 @@ pub struct CybersourceErrorInformation { } impl - TryFrom< + TryFrom<( types::ResponseRouterData, - > for types::RouterData + bool, + )> for types::RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - F, - CybersourcePaymentsResponse, - T, - types::PaymentsResponseData, - >, + data: ( + types::ResponseRouterData< + F, + CybersourcePaymentsResponse, + T, + types::PaymentsResponseData, + >, + bool, + ), ) -> Result { + let item = data.0; + let is_capture = data.1; Ok(Self { - status: item.response.status.into(), + status: get_payment_status(is_capture, item.response.status.into()), response: match item.response.error_information { Some(error) => Err(types::ErrorResponse { code: consts::NO_ERROR_CODE.to_string(), @@ -328,27 +334,44 @@ pub struct ApplicationInformation { status: CybersourcePaymentStatus, } +fn get_payment_status(is_capture: bool, status: enums::AttemptStatus) -> enums::AttemptStatus { + let is_authorized = matches!(status, enums::AttemptStatus::Authorized); + if is_capture && is_authorized { + return enums::AttemptStatus::Pending; + } + status +} + impl - TryFrom< + TryFrom<( types::ResponseRouterData< F, CybersourceTransactionResponse, T, types::PaymentsResponseData, >, - > for types::RouterData + bool, + )> for types::RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - F, - CybersourceTransactionResponse, - T, - types::PaymentsResponseData, - >, + data: ( + types::ResponseRouterData< + F, + CybersourceTransactionResponse, + T, + types::PaymentsResponseData, + >, + bool, + ), ) -> Result { + let item = data.0; + let is_capture = data.1; Ok(Self { - status: item.response.application_information.status.into(), + status: get_payment_status( + is_capture, + item.response.application_information.status.into(), + ), response: Ok(types::PaymentsResponseData::TransactionResponse { resource_id: types::ResponseId::ConnectorTransactionId(item.response.id), redirection_data: None,