refactor(connector): [Adyen] Status mapping based on Payment method Type (#3567)

This commit is contained in:
Swangi Kumari
2024-02-07 19:37:49 +05:30
committed by GitHub
parent cef1643af5
commit ab6b5ab7b4
10 changed files with 53 additions and 17 deletions

View File

@ -233,6 +233,7 @@ impl
},
None,
false,
data.request.payment_method_type,
))
.change_context(errors::ConnectorError::ResponseHandlingFailed)
}
@ -506,6 +507,7 @@ impl
},
data.request.capture_method,
is_multiple_capture_sync,
data.request.payment_method_type,
))
.change_context(errors::ConnectorError::ResponseHandlingFailed)
}
@ -627,6 +629,7 @@ impl
},
data.request.capture_method,
false,
data.request.payment_method_type,
))
.change_context(errors::ConnectorError::ResponseHandlingFailed)
}

View File

@ -217,22 +217,33 @@ pub struct AdyenBalanceResponse {
/// This implementation will be used only in Authorize, Automatic capture flow.
/// It is also being used in Psync flow, However Psync will be called only after create payment call that too in redirect flow.
impl ForeignFrom<(bool, AdyenStatus)> for storage_enums::AttemptStatus {
fn foreign_from((is_manual_capture, adyen_status): (bool, AdyenStatus)) -> Self {
impl ForeignFrom<(bool, AdyenStatus, Option<common_enums::PaymentMethodType>)>
for storage_enums::AttemptStatus
{
fn foreign_from(
(is_manual_capture, adyen_status, pmt): (
bool,
AdyenStatus,
Option<common_enums::PaymentMethodType>,
),
) -> Self {
match adyen_status {
AdyenStatus::AuthenticationFinished => Self::AuthenticationSuccessful,
AdyenStatus::AuthenticationNotRequired | AdyenStatus::PresentToShopper => Self::Pending,
AdyenStatus::AuthenticationNotRequired => Self::Pending,
AdyenStatus::Authorised => match is_manual_capture {
true => Self::Authorized,
// In case of Automatic capture Authorized is the final status of the payment
false => Self::Charged,
},
AdyenStatus::Cancelled => Self::Voided,
AdyenStatus::ChallengeShopper | AdyenStatus::RedirectShopper => {
Self::AuthenticationPending
}
AdyenStatus::ChallengeShopper
| AdyenStatus::RedirectShopper
| AdyenStatus::PresentToShopper => Self::AuthenticationPending,
AdyenStatus::Error | AdyenStatus::Refused => Self::Failure,
AdyenStatus::Pending => Self::Pending,
AdyenStatus::Pending => match pmt {
Some(common_enums::PaymentMethodType::Pix) => Self::AuthenticationPending,
_ => Self::Pending,
},
AdyenStatus::Received => Self::Started,
#[cfg(feature = "payouts")]
AdyenStatus::PayoutConfirmReceived => Self::Started,
@ -3001,6 +3012,7 @@ pub fn get_adyen_response(
response: Response,
is_capture_manual: bool,
status_code: u16,
pmt: Option<enums::PaymentMethodType>,
) -> errors::CustomResult<
(
storage_enums::AttemptStatus,
@ -3010,7 +3022,7 @@ pub fn get_adyen_response(
errors::ConnectorError,
> {
let status =
storage_enums::AttemptStatus::foreign_from((is_capture_manual, response.result_code));
storage_enums::AttemptStatus::foreign_from((is_capture_manual, response.result_code, pmt));
let status = update_attempt_status_based_on_event_type_if_needed(status, &response.event_code);
let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() {
Some(types::ErrorResponse {
@ -3056,6 +3068,7 @@ pub fn get_adyen_response(
pub fn get_adyen_response_for_multiple_partial_capture(
response: Response,
status_code: u16,
pmt: Option<enums::PaymentMethodType>,
) -> errors::CustomResult<
(
storage_enums::AttemptStatus,
@ -3064,7 +3077,7 @@ pub fn get_adyen_response_for_multiple_partial_capture(
),
errors::ConnectorError,
> {
let (status, error, _) = get_adyen_response(response.clone(), true, status_code)?;
let (status, error, _) = get_adyen_response(response.clone(), true, status_code, pmt)?;
let status = update_attempt_status_based_on_event_type_if_needed(status, &response.event_code);
let capture_sync_response_list = utils::construct_captures_response_hashmap(vec![response]);
Ok((
@ -3093,6 +3106,7 @@ pub fn get_redirection_response(
response: RedirectionResponse,
is_manual_capture: bool,
status_code: u16,
pmt: Option<enums::PaymentMethodType>,
) -> errors::CustomResult<
(
storage_enums::AttemptStatus,
@ -3104,6 +3118,7 @@ pub fn get_redirection_response(
let status = storage_enums::AttemptStatus::foreign_from((
is_manual_capture,
response.result_code.clone(),
pmt,
));
let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() {
Some(types::ErrorResponse {
@ -3157,6 +3172,7 @@ pub fn get_present_to_shopper_response(
response: PresentToShopperResponse,
is_manual_capture: bool,
status_code: u16,
pmt: Option<enums::PaymentMethodType>,
) -> errors::CustomResult<
(
storage_enums::AttemptStatus,
@ -3168,6 +3184,7 @@ pub fn get_present_to_shopper_response(
let status = storage_enums::AttemptStatus::foreign_from((
is_manual_capture,
response.result_code.clone(),
pmt,
));
let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() {
Some(types::ErrorResponse {
@ -3209,6 +3226,7 @@ pub fn get_qr_code_response(
response: QrCodeResponseResponse,
is_manual_capture: bool,
status_code: u16,
pmt: Option<enums::PaymentMethodType>,
) -> errors::CustomResult<
(
storage_enums::AttemptStatus,
@ -3220,6 +3238,7 @@ pub fn get_qr_code_response(
let status = storage_enums::AttemptStatus::foreign_from((
is_manual_capture,
response.result_code.clone(),
pmt,
));
let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() {
Some(types::ErrorResponse {
@ -3258,6 +3277,7 @@ pub fn get_redirection_error_response(
response: RedirectionErrorResponse,
is_manual_capture: bool,
status_code: u16,
pmt: Option<enums::PaymentMethodType>,
) -> errors::CustomResult<
(
storage_enums::AttemptStatus,
@ -3267,7 +3287,7 @@ pub fn get_redirection_error_response(
errors::ConnectorError,
> {
let status =
storage_enums::AttemptStatus::foreign_from((is_manual_capture, response.result_code));
storage_enums::AttemptStatus::foreign_from((is_manual_capture, response.result_code, pmt));
let error = Some(types::ErrorResponse {
code: status.to_string(),
message: response.refusal_reason.clone(),
@ -3548,36 +3568,38 @@ impl<F, Req>
types::ResponseRouterData<F, AdyenPaymentResponse, Req, types::PaymentsResponseData>,
Option<storage_enums::CaptureMethod>,
bool,
Option<enums::PaymentMethodType>,
)> for types::RouterData<F, Req, types::PaymentsResponseData>
{
type Error = Error;
fn try_from(
(item, capture_method, is_multiple_capture_psync_flow): (
(item, capture_method, is_multiple_capture_psync_flow, pmt): (
types::ResponseRouterData<F, AdyenPaymentResponse, Req, types::PaymentsResponseData>,
Option<storage_enums::CaptureMethod>,
bool,
Option<enums::PaymentMethodType>,
),
) -> Result<Self, Self::Error> {
let is_manual_capture = utils::is_manual_capture(capture_method);
let (status, error, payment_response_data) = match item.response {
AdyenPaymentResponse::Response(response) => {
if is_multiple_capture_psync_flow {
get_adyen_response_for_multiple_partial_capture(*response, item.http_code)?
get_adyen_response_for_multiple_partial_capture(*response, item.http_code, pmt)?
} else {
get_adyen_response(*response, is_manual_capture, item.http_code)?
get_adyen_response(*response, is_manual_capture, item.http_code, pmt)?
}
}
AdyenPaymentResponse::PresentToShopper(response) => {
get_present_to_shopper_response(*response, is_manual_capture, item.http_code)?
get_present_to_shopper_response(*response, is_manual_capture, item.http_code, pmt)?
}
AdyenPaymentResponse::QrCodeResponse(response) => {
get_qr_code_response(*response, is_manual_capture, item.http_code)?
get_qr_code_response(*response, is_manual_capture, item.http_code, pmt)?
}
AdyenPaymentResponse::RedirectionResponse(response) => {
get_redirection_response(*response, is_manual_capture, item.http_code)?
get_redirection_response(*response, is_manual_capture, item.http_code, pmt)?
}
AdyenPaymentResponse::RedirectionErrorResponse(response) => {
get_redirection_error_response(*response, is_manual_capture, item.http_code)?
get_redirection_error_response(*response, is_manual_capture, item.http_code, pmt)?
}
};

View File

@ -1160,6 +1160,7 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsSyncData
),
None => types::SyncRequestType::SinglePaymentSync,
},
payment_method_type: payment_data.payment_attempt.payment_method_type,
})
}
}

View File

@ -534,6 +534,7 @@ pub struct PaymentsSyncData {
pub connector_meta: Option<serde_json::Value>,
pub sync_type: SyncRequestType,
pub mandate_id: Option<api_models::payments::MandateIds>,
pub payment_method_type: Option<storage_enums::PaymentMethodType>,
}
#[derive(Debug, Default, Clone)]