From 9ef60e425d0cbe764ce66c65c8c09b1992cbe99f Mon Sep 17 00:00:00 2001 From: SamraatBansal <55536657+SamraatBansal@users.noreply.github.com> Date: Thu, 12 Oct 2023 12:22:48 +0530 Subject: [PATCH] fix(connector): [noon] sync with reference_id (#2544) --- crates/router/src/connector/noon.rs | 20 +++++++++++++------ .../router/src/connector/noon/transformers.rs | 18 +++++++++++++---- .../router/src/core/payments/transformers.rs | 5 +++++ crates/router/src/types.rs | 3 +++ crates/router/tests/connectors/bambora.rs | 2 ++ crates/router/tests/connectors/forte.rs | 1 + crates/router/tests/connectors/nexinets.rs | 1 + crates/router/tests/connectors/paypal.rs | 2 ++ crates/router/tests/connectors/utils.rs | 1 + crates/router/tests/connectors/zen.rs | 2 ++ 10 files changed, 45 insertions(+), 10 deletions(-) diff --git a/crates/router/src/connector/noon.rs b/crates/router/src/connector/noon.rs index 5bd7f24954..c2637ba93b 100644 --- a/crates/router/src/connector/noon.rs +++ b/crates/router/src/connector/noon.rs @@ -9,7 +9,6 @@ use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as noon; -use super::utils::PaymentsSyncRequestData; use crate::{ configs::settings, connector::utils as connector_utils, @@ -276,10 +275,19 @@ impl ConnectorIntegration CustomResult { - let connector_transaction_id = req.request.get_connector_transaction_id()?; + //Added as a fix for past payments before the given timestamp we can reconcile using payment_id + let cutoff_timestamp: i64 = 1697023800; + + let reference_id = if req.request.payment_attempt_created_at_as_utc < cutoff_timestamp { + req.payment_id.clone() + } else { + req.attempt_id.clone() + }; + Ok(format!( - "{}payment/v1/order/{connector_transaction_id}", - self.base_url(connectors) + "{}payment/v1/order/getbyreference/{}", + self.base_url(connectors), + reference_id )) } @@ -569,9 +577,9 @@ impl ConnectorIntegration CustomResult { Ok(format!( - "{}payment/v1/order/{}", + "{}payment/v1/order/getbyreference/{}", self.base_url(connectors), - req.request.connector_transaction_id + req.attempt_id )) } diff --git a/crates/router/src/connector/noon/transformers.rs b/crates/router/src/connector/noon/transformers.rs index 5300525b7c..749c8c8dea 100644 --- a/crates/router/src/connector/noon/transformers.rs +++ b/crates/router/src/connector/noon/transformers.rs @@ -4,8 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::{ connector::utils::{ - self as conn_utils, CardData, PaymentsAuthorizeRequestData, RefundsRequestData, RouterData, - WalletData, + self as conn_utils, CardData, PaymentsAuthorizeRequestData, RouterData, WalletData, }, core::errors, services, @@ -438,6 +437,7 @@ impl pub struct NoonActionTransaction { amount: String, currency: diesel_models::enums::Currency, + transaction_reference: Option, } #[derive(Debug, Serialize)] @@ -466,6 +466,7 @@ impl TryFrom<&types::PaymentsCaptureRouterData> for NoonPaymentsActionRequest { item.request.currency, )?, currency: item.request.currency, + transaction_reference: None, }; Ok(Self { api_operation: NoonApiOperations::Capture, @@ -507,6 +508,7 @@ impl TryFrom<&types::RefundsRouterData> for NoonPaymentsActionRequest { item.request.currency, )?, currency: item.request.currency, + transaction_reference: Some(item.request.refund_id.clone()), }; Ok(Self { api_operation: NoonApiOperations::Refund, @@ -570,9 +572,11 @@ impl TryFrom> } #[derive(Default, Debug, Deserialize)] +#[serde(rename_all = "camelCase")] pub struct NoonRefundResponseTransactions { id: String, status: RefundStatus, + transaction_reference: Option, } #[derive(Default, Debug, Deserialize)] @@ -592,13 +596,19 @@ impl TryFrom> fn try_from( item: types::RefundsResponseRouterData, ) -> Result { - let connector_refund_id = item.data.request.get_connector_refund_id()?; let noon_transaction: &NoonRefundResponseTransactions = item .response .result .transactions .iter() - .find(|transaction| transaction.id == connector_refund_id) + .find(|transaction| { + transaction + .transaction_reference + .clone() + .map_or(false, |transaction_instance| { + transaction_instance == item.data.request.refund_id + }) + }) .ok_or(errors::ConnectorError::ResponseHandlingFailed)?; Ok(Self { diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index e1ea8a0635..8526f48a59 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -1050,6 +1050,11 @@ impl TryFrom> for types::PaymentsSyncData ), None => types::SyncRequestType::SinglePaymentSync, }, + payment_attempt_created_at_as_utc: payment_data + .payment_attempt + .created_at + .assume_utc() + .unix_timestamp(), }) } } diff --git a/crates/router/src/types.rs b/crates/router/src/types.rs index 560d706a84..cb8fe8fa79 100644 --- a/crates/router/src/types.rs +++ b/crates/router/src/types.rs @@ -476,6 +476,9 @@ pub struct PaymentsSyncData { pub connector_meta: Option, pub sync_type: SyncRequestType, pub mandate_id: Option, + //This is being added as a temporary fix, will be deprecated before or by v1.65.0 + // #2628 + pub payment_attempt_created_at_as_utc: i64, } #[derive(Debug, Default, Clone)] diff --git a/crates/router/tests/connectors/bambora.rs b/crates/router/tests/connectors/bambora.rs index 5638214202..73e75b7136 100644 --- a/crates/router/tests/connectors/bambora.rs +++ b/crates/router/tests/connectors/bambora.rs @@ -108,6 +108,7 @@ async fn should_sync_authorized_payment() { capture_method: Some(diesel_models::enums::CaptureMethod::Manual), sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta: None, + payment_attempt_created_at_as_utc: 0, }), None, ) @@ -222,6 +223,7 @@ async fn should_sync_auto_captured_payment() { capture_method: Some(enums::CaptureMethod::Automatic), sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta: None, + payment_attempt_created_at_as_utc: 0, }), None, ) diff --git a/crates/router/tests/connectors/forte.rs b/crates/router/tests/connectors/forte.rs index 703b8900b6..8cce94dc85 100644 --- a/crates/router/tests/connectors/forte.rs +++ b/crates/router/tests/connectors/forte.rs @@ -153,6 +153,7 @@ async fn should_sync_authorized_payment() { sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta: None, mandate_id: None, + payment_attempt_created_at_as_utc: 0, }), get_default_payment_info(), ) diff --git a/crates/router/tests/connectors/nexinets.rs b/crates/router/tests/connectors/nexinets.rs index f9b8affb06..5c95b1f41a 100644 --- a/crates/router/tests/connectors/nexinets.rs +++ b/crates/router/tests/connectors/nexinets.rs @@ -123,6 +123,7 @@ async fn should_sync_authorized_payment() { sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta, mandate_id: None, + payment_attempt_created_at_as_utc: 0, }), None, ) diff --git a/crates/router/tests/connectors/paypal.rs b/crates/router/tests/connectors/paypal.rs index e9df655669..5fe37c374a 100644 --- a/crates/router/tests/connectors/paypal.rs +++ b/crates/router/tests/connectors/paypal.rs @@ -140,6 +140,7 @@ async fn should_sync_authorized_payment() { capture_method: None, sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta, + payment_attempt_created_at_as_utc: 0, }), get_default_payment_info(), ) @@ -336,6 +337,7 @@ async fn should_sync_auto_captured_payment() { capture_method: Some(enums::CaptureMethod::Automatic), sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta, + payment_attempt_created_at_as_utc: 0, }), get_default_payment_info(), ) diff --git a/crates/router/tests/connectors/utils.rs b/crates/router/tests/connectors/utils.rs index f890eec192..81f4f6bef2 100644 --- a/crates/router/tests/connectors/utils.rs +++ b/crates/router/tests/connectors/utils.rs @@ -942,6 +942,7 @@ impl Default for PaymentSyncType { capture_method: None, sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta: None, + payment_attempt_created_at_as_utc: 0, }; Self(data) } diff --git a/crates/router/tests/connectors/zen.rs b/crates/router/tests/connectors/zen.rs index ca71fd0c62..a994c290dd 100644 --- a/crates/router/tests/connectors/zen.rs +++ b/crates/router/tests/connectors/zen.rs @@ -102,6 +102,7 @@ async fn should_sync_authorized_payment() { sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta: None, mandate_id: None, + payment_attempt_created_at_as_utc: 0, }), None, ) @@ -216,6 +217,7 @@ async fn should_sync_auto_captured_payment() { sync_type: types::SyncRequestType::SinglePaymentSync, connector_meta: None, mandate_id: None, + payment_attempt_created_at_as_utc: 0, }), None, )