Skip to content

Commit 25245b9

Browse files
adarsh-jha-devswangi-kumariAkshayaFoiger
authored
feat(connector): [Payeezy] Currency Unit Conversion (#2710)
Co-authored-by: Swangi Kumari <[email protected]> Co-authored-by: AkshayaFoiger <[email protected]>
1 parent 2782923 commit 25245b9

File tree

2 files changed

+103
-32
lines changed

2 files changed

+103
-32
lines changed

crates/router/src/connector/payeezy.rs

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ impl ConnectorCommon for Payeezy {
9090
"payeezy"
9191
}
9292

93+
fn get_currency_unit(&self) -> api::CurrencyUnit {
94+
api::CurrencyUnit::Base
95+
}
96+
9397
fn common_get_content_type(&self) -> &'static str {
9498
"application/json"
9599
}
@@ -292,12 +296,19 @@ impl ConnectorIntegration<api::Capture, types::PaymentsCaptureData, types::Payme
292296
&self,
293297
req: &types::PaymentsCaptureRouterData,
294298
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
295-
let connector_req = payeezy::PayeezyCaptureOrVoidRequest::try_from(req)?;
299+
let router_obj = payeezy::PayeezyRouterData::try_from((
300+
&self.get_currency_unit(),
301+
req.request.currency,
302+
req.request.amount_to_capture,
303+
req,
304+
))?;
305+
let req_obj = payeezy::PayeezyCaptureOrVoidRequest::try_from(&router_obj)?;
296306
let payeezy_req = types::RequestBody::log_and_get_request_body(
297-
&connector_req,
307+
&req_obj,
298308
utils::Encode::<payeezy::PayeezyCaptureOrVoidRequest>::encode_to_string_of_json,
299309
)
300310
.change_context(errors::ConnectorError::RequestEncodingFailed)?;
311+
301312
Ok(Some(payeezy_req))
302313
}
303314

@@ -380,9 +391,16 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
380391
&self,
381392
req: &types::PaymentsAuthorizeRouterData,
382393
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
383-
let connector_req = payeezy::PayeezyPaymentsRequest::try_from(req)?;
394+
let router_obj = payeezy::PayeezyRouterData::try_from((
395+
&self.get_currency_unit(),
396+
req.request.currency,
397+
req.request.amount,
398+
req,
399+
))?;
400+
let req_obj = payeezy::PayeezyPaymentsRequest::try_from(&router_obj)?;
401+
384402
let payeezy_req = types::RequestBody::log_and_get_request_body(
385-
&connector_req,
403+
&req_obj,
386404
utils::Encode::<payeezy::PayeezyPaymentsRequest>::encode_to_string_of_json,
387405
)
388406
.change_context(errors::ConnectorError::RequestEncodingFailed)?;
@@ -469,10 +487,16 @@ impl ConnectorIntegration<api::Execute, types::RefundsData, types::RefundsRespon
469487
&self,
470488
req: &types::RefundsRouterData<api::Execute>,
471489
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
472-
let connector_req = payeezy::PayeezyRefundRequest::try_from(req)?;
490+
let router_obj = payeezy::PayeezyRouterData::try_from((
491+
&self.get_currency_unit(),
492+
req.request.currency,
493+
req.request.refund_amount,
494+
req,
495+
))?;
496+
let req_obj = payeezy::PayeezyRefundRequest::try_from(&router_obj)?;
473497
let payeezy_req = types::RequestBody::log_and_get_request_body(
474-
&connector_req,
475-
utils::Encode::<payeezy::PayeezyCaptureOrVoidRequest>::encode_to_string_of_json,
498+
&req_obj,
499+
utils::Encode::<payeezy::PayeezyRefundRequest>::encode_to_string_of_json,
476500
)
477501
.change_context(errors::ConnectorError::RequestEncodingFailed)?;
478502
Ok(Some(payeezy_req))
@@ -499,16 +523,22 @@ impl ConnectorIntegration<api::Execute, types::RefundsData, types::RefundsRespon
499523
data: &types::RefundsRouterData<api::Execute>,
500524
res: Response,
501525
) -> CustomResult<types::RefundsRouterData<api::Execute>, errors::ConnectorError> {
526+
// Parse the response into a payeezy::RefundResponse
502527
let response: payeezy::RefundResponse = res
503528
.response
504529
.parse_struct("payeezy RefundResponse")
505530
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
506-
types::RefundsRouterData::try_from(types::ResponseRouterData {
531+
532+
// Create a new instance of types::RefundsRouterData based on the response, input data, and HTTP code
533+
let response_data = types::ResponseRouterData {
507534
response,
508535
data: data.clone(),
509536
http_code: res.status_code,
510-
})
511-
.change_context(errors::ConnectorError::ResponseHandlingFailed)
537+
};
538+
let router_data = types::RefundsRouterData::try_from(response_data)
539+
.change_context(errors::ConnectorError::ResponseHandlingFailed)?;
540+
541+
Ok(router_data)
512542
}
513543

514544
fn get_error_response(

crates/router/src/connector/payeezy/transformers.rs

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,37 @@ use crate::{
99
core::errors,
1010
types::{self, api, storage::enums, transformers::ForeignFrom},
1111
};
12+
#[derive(Debug, Serialize)]
13+
pub struct PayeezyRouterData<T> {
14+
pub amount: String,
15+
pub router_data: T,
16+
}
17+
18+
impl<T>
19+
TryFrom<(
20+
&types::api::CurrencyUnit,
21+
types::storage::enums::Currency,
22+
i64,
23+
T,
24+
)> for PayeezyRouterData<T>
25+
{
26+
type Error = error_stack::Report<errors::ConnectorError>;
27+
28+
fn try_from(
29+
(currency_unit, currency, amount, router_data): (
30+
&types::api::CurrencyUnit,
31+
types::storage::enums::Currency,
32+
i64,
33+
T,
34+
),
35+
) -> Result<Self, Self::Error> {
36+
let amount = utils::get_amount_as_string(currency_unit, amount, currency)?;
37+
Ok(Self {
38+
amount,
39+
router_data,
40+
})
41+
}
42+
}
1243

1344
#[derive(Serialize, Debug)]
1445
pub struct PayeezyCard {
@@ -66,7 +97,7 @@ pub struct PayeezyPaymentsRequest {
6697
pub merchant_ref: String,
6798
pub transaction_type: PayeezyTransactionType,
6899
pub method: PayeezyPaymentMethodType,
69-
pub amount: i64,
100+
pub amount: String,
70101
pub currency_code: String,
71102
pub credit_card: PayeezyPaymentMethod,
72103
pub stored_credentials: Option<StoredCredentials>,
@@ -95,10 +126,12 @@ pub enum Initiator {
95126
CardHolder,
96127
}
97128

98-
impl TryFrom<&types::PaymentsAuthorizeRouterData> for PayeezyPaymentsRequest {
129+
impl TryFrom<&PayeezyRouterData<&types::PaymentsAuthorizeRouterData>> for PayeezyPaymentsRequest {
99130
type Error = error_stack::Report<errors::ConnectorError>;
100-
fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result<Self, Self::Error> {
101-
match item.payment_method {
131+
fn try_from(
132+
item: &PayeezyRouterData<&types::PaymentsAuthorizeRouterData>,
133+
) -> Result<Self, Self::Error> {
134+
match item.router_data.payment_method {
102135
diesel_models::enums::PaymentMethod::Card => get_card_specific_payment_data(item),
103136

104137
diesel_models::enums::PaymentMethod::CardRedirect
@@ -119,14 +152,15 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for PayeezyPaymentsRequest {
119152
}
120153

121154
fn get_card_specific_payment_data(
122-
item: &types::PaymentsAuthorizeRouterData,
155+
item: &PayeezyRouterData<&types::PaymentsAuthorizeRouterData>,
123156
) -> Result<PayeezyPaymentsRequest, error_stack::Report<errors::ConnectorError>> {
124-
let merchant_ref = item.attempt_id.to_string();
157+
let merchant_ref = item.router_data.attempt_id.to_string();
125158
let method = PayeezyPaymentMethodType::CreditCard;
126-
let amount = item.request.amount;
127-
let currency_code = item.request.currency.to_string();
159+
let amount = item.amount.clone();
160+
let currency_code = item.router_data.request.currency.to_string();
128161
let credit_card = get_payment_method_data(item)?;
129-
let (transaction_type, stored_credentials) = get_transaction_type_and_stored_creds(item)?;
162+
let (transaction_type, stored_credentials) =
163+
get_transaction_type_and_stored_creds(item.router_data)?;
130164
Ok(PayeezyPaymentsRequest {
131165
merchant_ref,
132166
transaction_type,
@@ -135,7 +169,7 @@ fn get_card_specific_payment_data(
135169
currency_code,
136170
credit_card,
137171
stored_credentials,
138-
reference: item.connector_request_reference_id.clone(),
172+
reference: item.router_data.connector_request_reference_id.clone(),
139173
})
140174
}
141175
fn get_transaction_type_and_stored_creds(
@@ -201,9 +235,9 @@ fn is_mandate_payment(
201235
}
202236

203237
fn get_payment_method_data(
204-
item: &types::PaymentsAuthorizeRouterData,
238+
item: &PayeezyRouterData<&types::PaymentsAuthorizeRouterData>,
205239
) -> Result<PayeezyPaymentMethod, error_stack::Report<errors::ConnectorError>> {
206-
match item.request.payment_method_data {
240+
match item.router_data.request.payment_method_data {
207241
api::PaymentMethodData::Card(ref card) => {
208242
let card_type = PayeezyCardType::try_from(card.get_card_issuer()?)?;
209243
let payeezy_card = PayeezyCard {
@@ -305,16 +339,20 @@ pub struct PayeezyCaptureOrVoidRequest {
305339
currency_code: String,
306340
}
307341

308-
impl TryFrom<&types::PaymentsCaptureRouterData> for PayeezyCaptureOrVoidRequest {
342+
impl TryFrom<&PayeezyRouterData<&types::PaymentsCaptureRouterData>>
343+
for PayeezyCaptureOrVoidRequest
344+
{
309345
type Error = error_stack::Report<errors::ConnectorError>;
310-
fn try_from(item: &types::PaymentsCaptureRouterData) -> Result<Self, Self::Error> {
346+
fn try_from(
347+
item: &PayeezyRouterData<&types::PaymentsCaptureRouterData>,
348+
) -> Result<Self, Self::Error> {
311349
let metadata: PayeezyPaymentsMetadata =
312-
utils::to_connector_meta(item.request.connector_meta.clone())
350+
utils::to_connector_meta(item.router_data.request.connector_meta.clone())
313351
.change_context(errors::ConnectorError::RequestEncodingFailed)?;
314352
Ok(Self {
315353
transaction_type: PayeezyTransactionType::Capture,
316-
amount: item.request.amount_to_capture.to_string(),
317-
currency_code: item.request.currency.to_string(),
354+
amount: item.amount.clone(),
355+
currency_code: item.router_data.request.currency.to_string(),
318356
transaction_tag: metadata.transaction_tag,
319357
})
320358
}
@@ -338,6 +376,7 @@ impl TryFrom<&types::PaymentsCancelRouterData> for PayeezyCaptureOrVoidRequest {
338376
})
339377
}
340378
}
379+
341380
#[derive(Debug, Deserialize, Serialize, Default)]
342381
#[serde(rename_all = "lowercase")]
343382
pub enum PayeezyTransactionType {
@@ -442,16 +481,18 @@ pub struct PayeezyRefundRequest {
442481
currency_code: String,
443482
}
444483

445-
impl<F> TryFrom<&types::RefundsRouterData<F>> for PayeezyRefundRequest {
484+
impl<F> TryFrom<&PayeezyRouterData<&types::RefundsRouterData<F>>> for PayeezyRefundRequest {
446485
type Error = error_stack::Report<errors::ConnectorError>;
447-
fn try_from(item: &types::RefundsRouterData<F>) -> Result<Self, Self::Error> {
486+
fn try_from(
487+
item: &PayeezyRouterData<&types::RefundsRouterData<F>>,
488+
) -> Result<Self, Self::Error> {
448489
let metadata: PayeezyPaymentsMetadata =
449-
utils::to_connector_meta(item.request.connector_metadata.clone())
490+
utils::to_connector_meta(item.router_data.request.connector_metadata.clone())
450491
.change_context(errors::ConnectorError::RequestEncodingFailed)?;
451492
Ok(Self {
452493
transaction_type: PayeezyTransactionType::Refund,
453-
amount: item.request.refund_amount.to_string(),
454-
currency_code: item.request.currency.to_string(),
494+
amount: item.amount.clone(),
495+
currency_code: item.router_data.request.currency.to_string(),
455496
transaction_tag: metadata.transaction_tag,
456497
})
457498
}

0 commit comments

Comments
 (0)