Skip to content

Commit 19d54b0

Browse files
committed
do-amount-conversion-for-klarna
1 parent 35c9b8a commit 19d54b0

File tree

5 files changed

+61
-50
lines changed

5 files changed

+61
-50
lines changed

crates/api_models/src/payments.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4247,6 +4247,10 @@ pub struct OrderDetailsWithAmount {
42474247
pub brand: Option<String>,
42484248
/// Type of the product that is being purchased
42494249
pub product_type: Option<ProductType>,
4250+
4251+
//minor amount change for OrderDetailsWithAmount
4252+
pub minor_amount: MinorUnit,
4253+
42504254
}
42514255

42524256
#[derive(Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize, Clone, ToSchema)]

crates/router/src/connector/klarna.rs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
pub mod transformers;
2-
use std::fmt::Debug;
32

43
use api_models::enums;
54
use base64::Engine;
6-
use common_utils::request::RequestContent;
5+
use common_utils::{request::RequestContent, types::{AmountConvertor, MinorUnit, MinorUnitForConnector}};
76
use error_stack::{report, ResultExt};
87
use masking::PeekInterface;
98
use router_env::logger;
@@ -29,8 +28,19 @@ use crate::{
2928
utils::BytesExt,
3029
};
3130

32-
#[derive(Debug, Clone)]
33-
pub struct Klarna;
31+
#[derive(Clone)]
32+
pub struct Klarna {
33+
amount_converter: &'static (dyn AmountConvertor<Output = MinorUnit> + Sync),
34+
}
35+
36+
37+
impl Klarna {
38+
pub fn new() -> &'static Self {
39+
&Self {
40+
amount_converter: &MinorUnitForConnector,
41+
}
42+
}
43+
}
3444

3545
impl ConnectorCommon for Klarna {
3646
fn id(&self) -> &'static str {
@@ -215,12 +225,12 @@ impl
215225
req: &types::PaymentsSessionRouterData,
216226
_connectors: &settings::Connectors,
217227
) -> CustomResult<RequestContent, errors::ConnectorError> {
218-
let connector_router_data = klarna::KlarnaRouterData::try_from((
219-
&self.get_currency_unit(),
228+
let amount = connector_utils::convert_amount(
229+
self.amount_converter,
230+
req.request.minor_amount,
220231
req.request.currency,
221-
req.request.amount,
222-
req,
223-
))?;
232+
)?;
233+
let connector_router_data = klarna::KlarnaRouterData::from((amount, req));
224234

225235
let connector_req = klarna::KlarnaSessionRequest::try_from(&connector_router_data)?;
226236
// encode only for for urlencoded things.
@@ -342,12 +352,12 @@ impl
342352
req: &types::PaymentsCaptureRouterData,
343353
_connectors: &settings::Connectors,
344354
) -> CustomResult<RequestContent, errors::ConnectorError> {
345-
let connector_router_data = klarna::KlarnaRouterData::try_from((
346-
&self.get_currency_unit(),
355+
let amount = connector_utils::convert_amount(
356+
self.amount_converter,
357+
req.request.minor_amount_to_capture,
347358
req.request.currency,
348-
req.request.amount_to_capture,
349-
req,
350-
))?;
359+
)?;
360+
let connector_router_data = klarna::KlarnaRouterData::from((amount, req));
351361
let connector_req = klarna::KlarnaCaptureRequest::try_from(&connector_router_data)?;
352362
Ok(RequestContent::Json(Box::new(connector_req)))
353363
}
@@ -667,12 +677,12 @@ impl
667677
req: &types::PaymentsAuthorizeRouterData,
668678
_connectors: &settings::Connectors,
669679
) -> CustomResult<RequestContent, errors::ConnectorError> {
670-
let connector_router_data = klarna::KlarnaRouterData::try_from((
671-
&self.get_currency_unit(),
680+
let amount = connector_utils::convert_amount(
681+
self.amount_converter,
682+
req.request.minor_amount,
672683
req.request.currency,
673-
req.request.amount,
674-
req,
675-
))?;
684+
)?;
685+
let connector_router_data = klarna::KlarnaRouterData::from((amount, req));
676686
let connector_req = klarna::KlarnaPaymentsRequest::try_from(&connector_router_data)?;
677687

678688
Ok(RequestContent::Json(Box::new(connector_req)))
@@ -844,12 +854,12 @@ impl services::ConnectorIntegration<api::Execute, types::RefundsData, types::Ref
844854
req: &types::RefundsRouterData<api::Execute>,
845855
_connectors: &settings::Connectors,
846856
) -> CustomResult<RequestContent, errors::ConnectorError> {
847-
let connector_router_data = klarna::KlarnaRouterData::try_from((
848-
&self.get_currency_unit(),
857+
let amount = connector_utils::convert_amount(
858+
self.amount_converter,
859+
req.request.minor_refund_amount,
849860
req.request.currency,
850-
req.request.refund_amount,
851-
req,
852-
))?;
861+
)?;
862+
let connector_router_data = klarna::KlarnaRouterData::from((amount, req));
853863
let connector_req = klarna::KlarnaRefundRequest::try_from(&connector_router_data)?;
854864
Ok(RequestContent::Json(Box::new(connector_req)))
855865
}

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

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use api_models::payments;
2-
use common_utils::pii;
2+
use common_utils::{pii, types::MinorUnit};
33
use error_stack::{report, ResultExt};
44
use hyperswitch_domain_models::router_data::KlarnaSdkResponse;
55
use masking::{ExposeInterface, Secret};
@@ -15,25 +15,21 @@ use crate::{
1515

1616
#[derive(Debug, Serialize)]
1717
pub struct KlarnaRouterData<T> {
18-
amount: i64,
18+
amount: MinorUnit,
1919
router_data: T,
2020
}
2121

22-
impl<T> TryFrom<(&api::CurrencyUnit, enums::Currency, i64, T)> for KlarnaRouterData<T> {
23-
type Error = error_stack::Report<errors::ConnectorError>;
24-
25-
fn try_from(
26-
(_currency_unit, _currency, amount, router_data): (
27-
&api::CurrencyUnit,
28-
enums::Currency,
29-
i64,
22+
impl<T> From<(MinorUnit, T)> for KlarnaRouterData<T> {
23+
fn from(
24+
(amount, router_data): (
25+
MinorUnit,
3026
T,
3127
),
32-
) -> Result<Self, Self::Error> {
33-
Ok(Self {
28+
) -> Self {
29+
Self {
3430
amount,
3531
router_data,
36-
})
32+
}
3733
}
3834
}
3935

@@ -74,7 +70,7 @@ impl TryFrom<&Option<pii::SecretSerdeValue>> for KlarnaConnectorMetadataObject {
7470
pub struct KlarnaPaymentsRequest {
7571
auto_capture: bool,
7672
order_lines: Vec<OrderLines>,
77-
order_amount: i64,
73+
order_amount: MinorUnit,
7874
purchase_country: enums::CountryAlpha2,
7975
purchase_currency: enums::Currency,
8076
merchant_reference1: Option<String>,
@@ -110,7 +106,7 @@ pub struct KlarnaSessionRequest {
110106
intent: KlarnaSessionIntent,
111107
purchase_country: enums::CountryAlpha2,
112108
purchase_currency: enums::Currency,
113-
order_amount: i64,
109+
order_amount: MinorUnit,
114110
order_lines: Vec<OrderLines>,
115111
shipping_address: Option<KlarnaShippingAddress>,
116112
}
@@ -156,8 +152,8 @@ impl TryFrom<&KlarnaRouterData<&types::PaymentsSessionRouterData>> for KlarnaSes
156152
.map(|data| OrderLines {
157153
name: data.product_name.clone(),
158154
quantity: data.quantity,
159-
unit_price: data.amount,
160-
total_amount: i64::from(data.quantity) * (data.amount),
155+
unit_price: data.minor_amount,
156+
total_amount: MinorUnit::new(i64::from(data.quantity) * (data.minor_amount.get_amount_as_i64())),
161157
})
162158
.collect(),
163159
shipping_address: get_address_info(item.router_data.get_optional_shipping())
@@ -209,8 +205,8 @@ impl TryFrom<&KlarnaRouterData<&types::PaymentsAuthorizeRouterData>> for KlarnaP
209205
.map(|data| OrderLines {
210206
name: data.product_name.clone(),
211207
quantity: data.quantity,
212-
unit_price: data.amount,
213-
total_amount: i64::from(data.quantity) * (data.amount),
208+
unit_price: data.minor_amount,
209+
total_amount: MinorUnit::new(i64::from(data.quantity) * (data.minor_amount.get_amount_as_i64())),
214210
})
215211
.collect(),
216212
merchant_reference1: Some(item.router_data.connector_request_reference_id.clone()),
@@ -294,8 +290,8 @@ impl TryFrom<types::PaymentsResponseRouterData<KlarnaPaymentsResponse>>
294290
pub struct OrderLines {
295291
name: String,
296292
quantity: u16,
297-
unit_price: i64,
298-
total_amount: i64,
293+
unit_price: MinorUnit,
294+
total_amount: MinorUnit,
299295
}
300296

301297
#[derive(Debug, Serialize)]
@@ -412,7 +408,7 @@ impl<F, T>
412408

413409
#[derive(Debug, Serialize)]
414410
pub struct KlarnaCaptureRequest {
415-
captured_amount: i64,
411+
captured_amount: MinorUnit,
416412
reference: Option<String>,
417413
}
418414

@@ -490,7 +486,7 @@ impl<F>
490486

491487
#[derive(Default, Debug, Serialize)]
492488
pub struct KlarnaRefundRequest {
493-
refunded_amount: i64,
489+
refunded_amount: MinorUnit,
494490
reference: Option<String>,
495491
}
496492

crates/router/src/core/payments/transformers.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,20 +1185,21 @@ pub fn voucher_next_steps_check(
11851185
}
11861186

11871187
pub fn change_order_details_to_new_type(
1188-
order_amount: i64,
1188+
order_amount: MinorUnit,
11891189
order_details: api_models::payments::OrderDetails,
11901190
) -> Option<Vec<api_models::payments::OrderDetailsWithAmount>> {
11911191
Some(vec![api_models::payments::OrderDetailsWithAmount {
11921192
product_name: order_details.product_name,
11931193
quantity: order_details.quantity,
1194-
amount: order_amount,
1194+
amount: order_amount.get_amount_as_i64(),
11951195
product_img_link: order_details.product_img_link,
11961196
requires_shipping: order_details.requires_shipping,
11971197
product_id: order_details.product_id,
11981198
category: order_details.category,
11991199
sub_category: order_details.sub_category,
12001200
brand: order_details.brand,
12011201
product_type: order_details.product_type,
1202+
minor_amount:order_amount,
12021203
}])
12031204
}
12041205

crates/router/src/types/api.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ impl ConnectorData {
438438
enums::Connector::Iatapay => {
439439
Ok(ConnectorEnum::Old(Box::new(connector::Iatapay::new())))
440440
}
441-
enums::Connector::Klarna => Ok(ConnectorEnum::Old(Box::new(&connector::Klarna))),
441+
enums::Connector::Klarna => Ok(ConnectorEnum::Old(Box::new(connector::Klarna::new()))),
442442
enums::Connector::Mollie => Ok(ConnectorEnum::Old(Box::new(&connector::Mollie))),
443443
enums::Connector::Nmi => Ok(ConnectorEnum::Old(Box::new(connector::Nmi::new()))),
444444
enums::Connector::Noon => Ok(ConnectorEnum::Old(Box::new(connector::Noon::new()))),

0 commit comments

Comments
 (0)