mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-27 19:46:48 +08:00
fix: surcharge related status and rules fix (#2974)
Co-authored-by: Bernard Eugine <114725419+bernard-eugine@users.noreply.github.com>
This commit is contained in:
@ -352,6 +352,9 @@ impl SurchargeDetailsResponse {
|
||||
request_surcharge_details.surcharge_amount == self.surcharge_amount
|
||||
&& request_surcharge_details.tax_amount.unwrap_or(0) == self.tax_on_surcharge_amount
|
||||
}
|
||||
pub fn get_total_surcharge_amount(&self) -> i64 {
|
||||
self.surcharge_amount + self.tax_on_surcharge_amount
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
||||
@ -347,6 +347,9 @@ impl RequestSurchargeDetails {
|
||||
final_amount: original_amount + surcharge_amount + tax_on_surcharge_amount,
|
||||
}
|
||||
}
|
||||
pub fn get_total_surcharge_amount(&self) -> i64 {
|
||||
self.surcharge_amount + self.tax_amount.unwrap_or(0)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default, Debug, Clone, Copy)]
|
||||
|
||||
@ -264,6 +264,8 @@ pub enum PaymentAttemptUpdate {
|
||||
error_message: Option<Option<String>>,
|
||||
amount_capturable: Option<i64>,
|
||||
updated_by: String,
|
||||
surcharge_amount: Option<i64>,
|
||||
tax_amount: Option<i64>,
|
||||
merchant_connector_id: Option<String>,
|
||||
},
|
||||
RejectUpdate {
|
||||
@ -291,8 +293,6 @@ pub enum PaymentAttemptUpdate {
|
||||
error_reason: Option<Option<String>>,
|
||||
connector_response_reference_id: Option<String>,
|
||||
amount_capturable: Option<i64>,
|
||||
surcharge_amount: Option<i64>,
|
||||
tax_amount: Option<i64>,
|
||||
updated_by: String,
|
||||
authentication_data: Option<serde_json::Value>,
|
||||
encoded_data: Option<String>,
|
||||
@ -321,8 +321,6 @@ pub enum PaymentAttemptUpdate {
|
||||
error_message: Option<Option<String>>,
|
||||
error_reason: Option<Option<String>>,
|
||||
amount_capturable: Option<i64>,
|
||||
surcharge_amount: Option<i64>,
|
||||
tax_amount: Option<i64>,
|
||||
updated_by: String,
|
||||
unified_code: Option<Option<String>>,
|
||||
unified_message: Option<Option<String>>,
|
||||
|
||||
@ -180,6 +180,8 @@ pub enum PaymentAttemptUpdate {
|
||||
error_code: Option<Option<String>>,
|
||||
error_message: Option<Option<String>>,
|
||||
amount_capturable: Option<i64>,
|
||||
surcharge_amount: Option<i64>,
|
||||
tax_amount: Option<i64>,
|
||||
updated_by: String,
|
||||
merchant_connector_id: Option<String>,
|
||||
},
|
||||
@ -208,8 +210,6 @@ pub enum PaymentAttemptUpdate {
|
||||
error_reason: Option<Option<String>>,
|
||||
connector_response_reference_id: Option<String>,
|
||||
amount_capturable: Option<i64>,
|
||||
surcharge_amount: Option<i64>,
|
||||
tax_amount: Option<i64>,
|
||||
updated_by: String,
|
||||
authentication_data: Option<serde_json::Value>,
|
||||
encoded_data: Option<String>,
|
||||
@ -238,8 +238,6 @@ pub enum PaymentAttemptUpdate {
|
||||
error_message: Option<Option<String>>,
|
||||
error_reason: Option<Option<String>>,
|
||||
amount_capturable: Option<i64>,
|
||||
surcharge_amount: Option<i64>,
|
||||
tax_amount: Option<i64>,
|
||||
updated_by: String,
|
||||
unified_code: Option<Option<String>>,
|
||||
unified_message: Option<Option<String>>,
|
||||
@ -443,6 +441,8 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
merchant_connector_id,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
} => Self {
|
||||
amount: Some(amount),
|
||||
currency: Some(currency),
|
||||
@ -463,6 +463,8 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
merchant_connector_id,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
..Default::default()
|
||||
},
|
||||
PaymentAttemptUpdate::VoidUpdate {
|
||||
@ -501,8 +503,6 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
|
||||
error_reason,
|
||||
connector_response_reference_id,
|
||||
amount_capturable,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
updated_by,
|
||||
authentication_data,
|
||||
encoded_data,
|
||||
@ -524,8 +524,6 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
|
||||
connector_response_reference_id,
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
authentication_data,
|
||||
encoded_data,
|
||||
unified_code,
|
||||
@ -539,8 +537,6 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
|
||||
error_message,
|
||||
error_reason,
|
||||
amount_capturable,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
updated_by,
|
||||
unified_code,
|
||||
unified_message,
|
||||
@ -554,8 +550,6 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
|
||||
error_reason,
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
unified_code,
|
||||
unified_message,
|
||||
connector_transaction_id,
|
||||
|
||||
@ -74,6 +74,10 @@ impl Context {
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(card_network) = payment_method.card_network {
|
||||
enum_values.insert(EuclidValue::CardNetwork(card_network));
|
||||
}
|
||||
|
||||
if let Some(at) = payment.authentication_type {
|
||||
enum_values.insert(EuclidValue::AuthenticationType(at));
|
||||
}
|
||||
|
||||
@ -113,7 +113,8 @@ where
|
||||
enums::AttemptStatus::Charged => {
|
||||
let captured_amount =
|
||||
types::Capturable::get_capture_amount(&self.request, payment_data);
|
||||
if Some(payment_data.payment_attempt.get_total_amount()) == captured_amount {
|
||||
let total_capturable_amount = payment_data.payment_attempt.get_total_amount();
|
||||
if Some(total_capturable_amount) == captured_amount {
|
||||
enums::AttemptStatus::Charged
|
||||
} else if captured_amount.is_some() {
|
||||
enums::AttemptStatus::PartialCharged
|
||||
|
||||
@ -1693,7 +1693,8 @@ pub(crate) fn validate_status_with_capture_method(
|
||||
field_name: "payment.status".to_string(),
|
||||
current_flow: "captured".to_string(),
|
||||
current_value: status.to_string(),
|
||||
states: "requires_capture, partially_captured, processing".to_string()
|
||||
states: "requires_capture, partially_captured_and_capturable, processing"
|
||||
.to_string()
|
||||
}))
|
||||
},
|
||||
)
|
||||
|
||||
@ -693,6 +693,15 @@ impl<F: Clone, Ctx: PaymentMethodRetrieve>
|
||||
let m_error_message = error_message.clone();
|
||||
let m_db = state.clone().store;
|
||||
|
||||
let surcharge_amount = payment_data
|
||||
.surcharge_details
|
||||
.as_ref()
|
||||
.map(|surcharge_details| surcharge_details.surcharge_amount);
|
||||
let tax_amount = payment_data
|
||||
.surcharge_details
|
||||
.as_ref()
|
||||
.map(|surcharge_details| surcharge_details.tax_on_surcharge_amount);
|
||||
|
||||
let payment_attempt_fut = tokio::spawn(
|
||||
async move {
|
||||
m_db.update_payment_attempt_with_attempt_id(
|
||||
@ -716,6 +725,8 @@ impl<F: Clone, Ctx: PaymentMethodRetrieve>
|
||||
amount_capturable: Some(authorized_amount),
|
||||
updated_by: storage_scheme.to_string(),
|
||||
merchant_connector_id,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
},
|
||||
storage_scheme,
|
||||
)
|
||||
|
||||
@ -372,8 +372,6 @@ async fn payment_response_update_tracker<F: Clone, T: types::Capturable>(
|
||||
} else {
|
||||
None
|
||||
},
|
||||
surcharge_amount: router_data.request.get_surcharge_amount(),
|
||||
tax_amount: router_data.request.get_tax_on_surcharge_amount(),
|
||||
updated_by: storage_scheme.to_string(),
|
||||
unified_code: option_gsm.clone().map(|gsm| gsm.unified_code),
|
||||
unified_message: option_gsm.map(|gsm| gsm.unified_message),
|
||||
@ -497,8 +495,6 @@ async fn payment_response_update_tracker<F: Clone, T: types::Capturable>(
|
||||
} else {
|
||||
None
|
||||
},
|
||||
surcharge_amount: router_data.request.get_surcharge_amount(),
|
||||
tax_amount: router_data.request.get_tax_on_surcharge_amount(),
|
||||
updated_by: storage_scheme.to_string(),
|
||||
authentication_data,
|
||||
encoded_data,
|
||||
|
||||
@ -382,8 +382,6 @@ where
|
||||
} else {
|
||||
None
|
||||
},
|
||||
surcharge_amount: None,
|
||||
tax_amount: None,
|
||||
updated_by: storage_scheme.to_string(),
|
||||
authentication_data,
|
||||
encoded_data,
|
||||
@ -410,8 +408,6 @@ where
|
||||
status: storage_enums::AttemptStatus::Failure,
|
||||
error_reason: Some(error_response.reason.clone()),
|
||||
amount_capturable: Some(0),
|
||||
surcharge_amount: None,
|
||||
tax_amount: None,
|
||||
updated_by: storage_scheme.to_string(),
|
||||
unified_code: option_gsm.clone().map(|gsm| gsm.unified_code),
|
||||
unified_message: option_gsm.map(|gsm| gsm.unified_message),
|
||||
|
||||
@ -551,12 +551,6 @@ pub trait Capturable {
|
||||
{
|
||||
None
|
||||
}
|
||||
fn get_surcharge_amount(&self) -> Option<i64> {
|
||||
None
|
||||
}
|
||||
fn get_tax_on_surcharge_amount(&self) -> Option<i64> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl Capturable for PaymentsAuthorizeData {
|
||||
@ -570,16 +564,6 @@ impl Capturable for PaymentsAuthorizeData {
|
||||
.map(|surcharge_details| surcharge_details.final_amount);
|
||||
final_amount.or(Some(self.amount))
|
||||
}
|
||||
fn get_surcharge_amount(&self) -> Option<i64> {
|
||||
self.surcharge_details
|
||||
.as_ref()
|
||||
.map(|surcharge_details| surcharge_details.surcharge_amount)
|
||||
}
|
||||
fn get_tax_on_surcharge_amount(&self) -> Option<i64> {
|
||||
self.surcharge_details
|
||||
.as_ref()
|
||||
.map(|surcharge_details| surcharge_details.tax_on_surcharge_amount)
|
||||
}
|
||||
}
|
||||
|
||||
impl Capturable for PaymentsCaptureData {
|
||||
@ -620,7 +604,7 @@ impl Capturable for PaymentsSyncData {
|
||||
payment_data
|
||||
.payment_attempt
|
||||
.amount_to_capture
|
||||
.or(Some(payment_data.payment_attempt.get_total_amount()))
|
||||
.or_else(|| Some(payment_data.payment_attempt.get_total_amount()))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -135,8 +135,6 @@ impl ProcessTrackerWorkflow<AppState> for PaymentsSyncWorkflow {
|
||||
consts::REQUEST_TIMEOUT_ERROR_MESSAGE_FROM_PSYNC.to_string(),
|
||||
)),
|
||||
amount_capturable: Some(0),
|
||||
surcharge_amount: None,
|
||||
tax_amount: None,
|
||||
updated_by: merchant_account.storage_scheme.to_string(),
|
||||
unified_code: None,
|
||||
unified_message: None,
|
||||
|
||||
@ -1215,6 +1215,8 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
error_code,
|
||||
error_message,
|
||||
amount_capturable,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
updated_by,
|
||||
merchant_connector_id: connector_id,
|
||||
} => DieselPaymentAttemptUpdate::ConfirmUpdate {
|
||||
@ -1234,6 +1236,8 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
error_code,
|
||||
error_message,
|
||||
amount_capturable,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
updated_by,
|
||||
merchant_connector_id: connector_id,
|
||||
},
|
||||
@ -1261,8 +1265,6 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
connector_response_reference_id,
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
authentication_data,
|
||||
encoded_data,
|
||||
unified_code,
|
||||
@ -1282,8 +1284,6 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
connector_response_reference_id,
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
authentication_data,
|
||||
encoded_data,
|
||||
unified_code,
|
||||
@ -1320,8 +1320,6 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
error_message,
|
||||
error_reason,
|
||||
amount_capturable,
|
||||
tax_amount,
|
||||
surcharge_amount,
|
||||
updated_by,
|
||||
unified_code,
|
||||
unified_message,
|
||||
@ -1333,8 +1331,6 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
error_message,
|
||||
error_reason,
|
||||
amount_capturable,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
updated_by,
|
||||
unified_code,
|
||||
unified_message,
|
||||
@ -1480,6 +1476,8 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
error_code,
|
||||
error_message,
|
||||
amount_capturable,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
updated_by,
|
||||
merchant_connector_id: connector_id,
|
||||
} => Self::ConfirmUpdate {
|
||||
@ -1499,6 +1497,8 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
error_code,
|
||||
error_message,
|
||||
amount_capturable,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
updated_by,
|
||||
merchant_connector_id: connector_id,
|
||||
},
|
||||
@ -1526,8 +1526,6 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
connector_response_reference_id,
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
authentication_data,
|
||||
encoded_data,
|
||||
unified_code,
|
||||
@ -1547,8 +1545,6 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
connector_response_reference_id,
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
authentication_data,
|
||||
encoded_data,
|
||||
unified_code,
|
||||
@ -1585,8 +1581,6 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
error_message,
|
||||
error_reason,
|
||||
amount_capturable,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
updated_by,
|
||||
unified_code,
|
||||
unified_message,
|
||||
@ -1599,8 +1593,6 @@ impl DataModelExt for PaymentAttemptUpdate {
|
||||
error_reason,
|
||||
amount_capturable,
|
||||
updated_by,
|
||||
surcharge_amount,
|
||||
tax_amount,
|
||||
unified_code,
|
||||
unified_message,
|
||||
connector_transaction_id,
|
||||
|
||||
@ -39,10 +39,6 @@
|
||||
},
|
||||
"raw_json_formatted": {
|
||||
"client_secret": "{{client_secret}}",
|
||||
"surcharge_details": {
|
||||
"surcharge_amount": 5,
|
||||
"tax_amount": 5
|
||||
},
|
||||
"payment_method": "card",
|
||||
"payment_method_data": {
|
||||
"card": {
|
||||
|
||||
@ -31,6 +31,10 @@
|
||||
"description": "Its my first payment request",
|
||||
"authentication_type": "no_three_ds",
|
||||
"return_url": "https://duck.com",
|
||||
"surcharge_details": {
|
||||
"surcharge_amount": 5,
|
||||
"tax_amount": 5
|
||||
},
|
||||
"billing": {
|
||||
"address": {
|
||||
"line1": "1467",
|
||||
|
||||
Reference in New Issue
Block a user