mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 19:42:27 +08:00
refactor(connector): [Adyen] Status mapping based on Payment method Type (#3567)
This commit is contained in:
@ -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)
|
||||
}
|
||||
|
||||
@ -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)?
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -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,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user