fix(connector): change capture status to pending when waiting for settlement (#420)

This commit is contained in:
Jagan
2023-01-20 00:59:54 +05:30
committed by GitHub
parent 35ddf94766
commit c4fea449da
2 changed files with 78 additions and 43 deletions

View File

@ -247,12 +247,14 @@ impl ConnectorIntegration<api::Capture, types::PaymentsCaptureData, types::Payme
.parse_struct("Cybersource PaymentResponse") .parse_struct("Cybersource PaymentResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?; .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
logger::debug!(cybersourcepayments_create_response=?response); logger::debug!(cybersourcepayments_create_response=?response);
types::ResponseRouterData { types::RouterData::try_from((
response, types::ResponseRouterData {
data: data.clone(), response,
http_code: res.status_code, data: data.clone(),
} http_code: res.status_code,
.try_into() },
true,
))
.change_context(errors::ConnectorError::ResponseHandlingFailed) .change_context(errors::ConnectorError::ResponseHandlingFailed)
} }
fn get_error_response( fn get_error_response(
@ -328,12 +330,16 @@ impl ConnectorIntegration<api::PSync, types::PaymentsSyncData, types::PaymentsRe
.parse_struct("Cybersource PaymentSyncResponse") .parse_struct("Cybersource PaymentSyncResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?; .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
logger::debug!(cybersourcepayments_create_response=?response); logger::debug!(cybersourcepayments_create_response=?response);
types::ResponseRouterData { let is_auto_capture =
response, data.request.capture_method == Some(storage_models::enums::CaptureMethod::Automatic);
data: data.clone(), types::RouterData::try_from((
http_code: res.status_code, types::ResponseRouterData {
} response,
.try_into() data: data.clone(),
http_code: res.status_code,
},
is_auto_capture,
))
.change_context(errors::ConnectorError::ResponseHandlingFailed) .change_context(errors::ConnectorError::ResponseHandlingFailed)
} }
fn get_error_response( fn get_error_response(
@ -412,12 +418,16 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
.parse_struct("Cybersource PaymentResponse") .parse_struct("Cybersource PaymentResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?; .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
logger::debug!(cybersourcepayments_create_response=?response); logger::debug!(cybersourcepayments_create_response=?response);
types::ResponseRouterData { let is_auto_capture =
response, data.request.capture_method == Some(storage_models::enums::CaptureMethod::Automatic);
data: data.clone(), types::RouterData::try_from((
http_code: res.status_code, types::ResponseRouterData {
} response,
.try_into() data: data.clone(),
http_code: res.status_code,
},
is_auto_capture,
))
.change_context(errors::ConnectorError::ResponseHandlingFailed) .change_context(errors::ConnectorError::ResponseHandlingFailed)
} }
@ -489,12 +499,14 @@ impl ConnectorIntegration<api::Void, types::PaymentsCancelData, types::PaymentsR
.parse_struct("Cybersource PaymentResponse") .parse_struct("Cybersource PaymentResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?; .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
logger::debug!(cybersourcepayments_create_response=?response); logger::debug!(cybersourcepayments_create_response=?response);
types::ResponseRouterData { types::RouterData::try_from((
response, types::ResponseRouterData {
data: data.clone(), response,
http_code: res.status_code, data: data.clone(),
} http_code: res.status_code,
.try_into() },
false,
))
.change_context(errors::ConnectorError::ResponseHandlingFailed) .change_context(errors::ConnectorError::ResponseHandlingFailed)
} }
@ -641,7 +653,7 @@ impl ConnectorIntegration<api::RSync, types::RefundsData, types::RefundsResponse
) -> CustomResult<types::RefundSyncRouterData, errors::ConnectorError> { ) -> CustomResult<types::RefundSyncRouterData, errors::ConnectorError> {
let response: cybersource::CybersourceTransactionResponse = res let response: cybersource::CybersourceTransactionResponse = res
.response .response
.parse_struct("Cybersource PaymentSyncResponse") .parse_struct("Cybersource RefundsSyncResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?; .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
logger::debug!(cybersourcepayments_create_response=?response); logger::debug!(cybersourcepayments_create_response=?response);
types::ResponseRouterData { types::ResponseRouterData {

View File

@ -280,21 +280,27 @@ pub struct CybersourceErrorInformation {
} }
impl<F, T> impl<F, T>
TryFrom< TryFrom<(
types::ResponseRouterData<F, CybersourcePaymentsResponse, T, types::PaymentsResponseData>, types::ResponseRouterData<F, CybersourcePaymentsResponse, T, types::PaymentsResponseData>,
> for types::RouterData<F, T, types::PaymentsResponseData> bool,
)> for types::RouterData<F, T, types::PaymentsResponseData>
{ {
type Error = error_stack::Report<errors::ParsingError>; type Error = error_stack::Report<errors::ParsingError>;
fn try_from( fn try_from(
item: types::ResponseRouterData< data: (
F, types::ResponseRouterData<
CybersourcePaymentsResponse, F,
T, CybersourcePaymentsResponse,
types::PaymentsResponseData, T,
>, types::PaymentsResponseData,
>,
bool,
),
) -> Result<Self, Self::Error> { ) -> Result<Self, Self::Error> {
let item = data.0;
let is_capture = data.1;
Ok(Self { Ok(Self {
status: item.response.status.into(), status: get_payment_status(is_capture, item.response.status.into()),
response: match item.response.error_information { response: match item.response.error_information {
Some(error) => Err(types::ErrorResponse { Some(error) => Err(types::ErrorResponse {
code: consts::NO_ERROR_CODE.to_string(), code: consts::NO_ERROR_CODE.to_string(),
@ -328,27 +334,44 @@ pub struct ApplicationInformation {
status: CybersourcePaymentStatus, 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<F, T> impl<F, T>
TryFrom< TryFrom<(
types::ResponseRouterData< types::ResponseRouterData<
F, F,
CybersourceTransactionResponse, CybersourceTransactionResponse,
T, T,
types::PaymentsResponseData, types::PaymentsResponseData,
>, >,
> for types::RouterData<F, T, types::PaymentsResponseData> bool,
)> for types::RouterData<F, T, types::PaymentsResponseData>
{ {
type Error = error_stack::Report<errors::ParsingError>; type Error = error_stack::Report<errors::ParsingError>;
fn try_from( fn try_from(
item: types::ResponseRouterData< data: (
F, types::ResponseRouterData<
CybersourceTransactionResponse, F,
T, CybersourceTransactionResponse,
types::PaymentsResponseData, T,
>, types::PaymentsResponseData,
>,
bool,
),
) -> Result<Self, Self::Error> { ) -> Result<Self, Self::Error> {
let item = data.0;
let is_capture = data.1;
Ok(Self { 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 { response: Ok(types::PaymentsResponseData::TransactionResponse {
resource_id: types::ResponseId::ConnectorTransactionId(item.response.id), resource_id: types::ResponseId::ConnectorTransactionId(item.response.id),
redirection_data: None, redirection_data: None,