feat(payment_request): add field amount to OrderDetails and make order_details a Vec in payments_create request (#964)

This commit is contained in:
rishavkar
2023-05-15 14:45:32 +05:30
committed by GitHub
parent d7cfb4a179
commit 60e8c7317a
15 changed files with 111 additions and 56 deletions

View File

@ -883,18 +883,31 @@ fn get_address_info(address: Option<&api_models::payments::Address>) -> Option<A
}
fn get_line_items(item: &types::PaymentsAuthorizeRouterData) -> Vec<LineItem> {
let order_details = item.request.order_details.as_ref();
let line_item = LineItem {
amount_including_tax: Some(item.request.amount),
amount_excluding_tax: Some(item.request.amount),
description: order_details.map(|details| details.product_name.clone()),
// We support only one product details in payment request as of now, therefore hard coded the id.
// If we begin to support multiple product details in future then this logic should be made to create ID dynamically
id: Some(String::from("Items #1")),
tax_amount: None,
quantity: Some(order_details.map_or(1, |details| details.quantity)),
};
vec![line_item]
let order_details = item.request.order_details.clone();
match order_details {
Some(od) => od
.iter()
.map(|data| LineItem {
amount_including_tax: Some(item.request.amount),
amount_excluding_tax: Some(item.request.amount),
description: Some(data.product_name.clone()),
id: Some(String::from("Items #1")),
tax_amount: None,
quantity: Some(data.quantity),
})
.collect(),
None => {
let line_item = LineItem {
amount_including_tax: Some(item.request.amount),
amount_excluding_tax: Some(item.request.amount),
description: None,
id: Some(String::from("Items #1")),
tax_amount: None,
quantity: Some(1),
};
vec![line_item]
}
}
}
fn get_telephone_number(item: &types::PaymentsAuthorizeRouterData) -> Option<Secret<String>> {

View File

@ -48,12 +48,15 @@ impl TryFrom<&types::PaymentsSessionRouterData> for KlarnaSessionRequest {
purchase_currency: request.currency,
order_amount: request.amount,
locale: "en-US".to_string(),
order_lines: vec![OrderLines {
name: order_details.product_name,
quantity: order_details.quantity,
unit_price: request.amount,
total_amount: request.amount,
}],
order_lines: order_details
.iter()
.map(|data| OrderLines {
name: data.product_name.clone(),
quantity: data.quantity,
unit_price: data.amount,
total_amount: i64::from(data.quantity) * (data.amount),
})
.collect(),
}),
None => Err(report!(errors::ConnectorError::MissingRequiredField {
field_name: "product_name",
@ -93,12 +96,15 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for KlarnaPaymentsRequest {
purchase_country: "US".to_string(),
purchase_currency: request.currency,
order_amount: request.amount,
order_lines: vec![OrderLines {
name: order_details.product_name,
quantity: order_details.quantity,
unit_price: request.amount,
total_amount: request.amount,
}],
order_lines: order_details
.iter()
.map(|data| OrderLines {
name: data.product_name.clone(),
quantity: data.quantity,
unit_price: data.amount,
total_amount: i64::from(data.quantity) * (data.amount),
})
.collect(),
}),
None => Err(report!(errors::ConnectorError::MissingRequiredField {
field_name: "product_name"

View File

@ -163,7 +163,7 @@ pub trait PaymentsAuthorizeRequestData {
fn is_auto_capture(&self) -> Result<bool, Error>;
fn get_email(&self) -> Result<Email, Error>;
fn get_browser_info(&self) -> Result<types::BrowserInformation, Error>;
fn get_order_details(&self) -> Result<OrderDetails, Error>;
fn get_order_details(&self) -> Result<Vec<OrderDetails>, Error>;
fn get_card(&self) -> Result<api::Card, Error>;
fn get_return_url(&self) -> Result<String, Error>;
fn connector_mandate_id(&self) -> Option<String>;
@ -189,7 +189,7 @@ impl PaymentsAuthorizeRequestData for types::PaymentsAuthorizeData {
.clone()
.ok_or_else(missing_field_err("browser_info"))
}
fn get_order_details(&self) -> Result<OrderDetails, Error> {
fn get_order_details(&self) -> Result<Vec<OrderDetails>, Error> {
self.order_details
.clone()
.ok_or_else(missing_field_err("order_details"))

View File

@ -204,12 +204,15 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for ZenPaymentsRequest {
ip,
},
custom_ipn_url: item.request.get_webhook_url()?,
items: vec![ZenItemObject {
name: order_details.product_name,
price: order_amount.clone(),
quantity: 1,
line_amount_total: order_amount,
}],
items: order_details
.iter()
.map(|data| ZenItemObject {
name: data.product_name.clone(),
quantity: data.quantity,
price: data.amount.to_string(),
line_amount_total: order_amount.clone(),
})
.collect(),
})
}
}

View File

@ -1429,6 +1429,7 @@ mod tests {
active_attempt_id: "nopes".to_string(),
business_country: storage_enums::CountryAlpha2::AG,
business_label: "no".to_string(),
meta_data: None,
};
let req_cs = Some("1".to_string());
let merchant_fulfillment_time = Some(900);
@ -1468,6 +1469,7 @@ mod tests {
active_attempt_id: "nopes".to_string(),
business_country: storage_enums::CountryAlpha2::AG,
business_label: "no".to_string(),
meta_data: None,
};
let req_cs = Some("1".to_string());
let merchant_fulfillment_time = Some(10);
@ -1507,6 +1509,7 @@ mod tests {
active_attempt_id: "nopes".to_string(),
business_country: storage_enums::CountryAlpha2::AG,
business_label: "no".to_string(),
meta_data: None,
};
let req_cs = Some("1".to_string());
let merchant_fulfillment_time = Some(10);

View File

@ -196,16 +196,20 @@ impl<F: Clone> UpdateTracker<F, PaymentData<F>, api::PaymentsSessionRequest> for
F: 'b + Send,
{
let metadata = payment_data.payment_intent.metadata.clone();
payment_data.payment_intent = match metadata {
Some(metadata) => db
let meta_data = payment_data.payment_intent.meta_data.clone();
payment_data.payment_intent = match (metadata, meta_data) {
(Some(metadata), Some(meta_data)) => db
.update_payment_intent(
payment_data.payment_intent,
storage::PaymentIntentUpdate::MetadataUpdate { metadata },
storage::PaymentIntentUpdate::MetadataUpdate {
metadata,
meta_data,
},
storage_scheme,
)
.await
.to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?,
None => payment_data.payment_intent,
_ => payment_data.payment_intent,
};
Ok((Box::new(self), payment_data))

View File

@ -513,14 +513,14 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsAuthoriz
let parsed_metadata: Option<api_models::payments::Metadata> = payment_data
.payment_intent
.metadata
.meta_data
.map(|metadata_value| {
metadata_value
.parse_value("metadata")
.parse_value("meta_data")
.change_context(errors::ApiErrorResponse::InvalidDataValue {
field_name: "metadata",
field_name: "meta_data",
})
.attach_printable("unable to parse metadata")
.attach_printable("unable to parse meta_data")
})
.transpose()
.unwrap_or_default();
@ -683,14 +683,14 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsSessionD
let payment_data = additional_data.payment_data;
let parsed_metadata: Option<api_models::payments::Metadata> = payment_data
.payment_intent
.metadata
.meta_data
.map(|metadata_value| {
metadata_value
.parse_value("metadata")
.parse_value("meta_data")
.change_context(errors::ApiErrorResponse::InvalidDataValue {
field_name: "metadata",
field_name: "meta_data",
})
.attach_printable("unable to parse metadata")
.attach_printable("unable to parse meta_data")
})
.transpose()
.unwrap_or_default();

View File

@ -95,6 +95,7 @@ mod storage {
business_country: new.business_country,
business_label: new.business_label.clone(),
active_attempt_id: new.active_attempt_id.to_owned(),
meta_data: new.meta_data.clone(),
};
match self
@ -353,6 +354,7 @@ impl PaymentIntentInterface for MockDb {
business_country: new.business_country,
business_label: new.business_label,
active_attempt_id: new.active_attempt_id.to_owned(),
meta_data: new.meta_data,
};
payment_intents.push(payment_intent.clone());
Ok(payment_intent)

View File

@ -215,7 +215,7 @@ pub struct PaymentsAuthorizeData {
pub off_session: Option<bool>,
pub setup_mandate_details: Option<payments::MandateData>,
pub browser_info: Option<BrowserInformation>,
pub order_details: Option<api_models::payments::OrderDetails>,
pub order_details: Option<Vec<api_models::payments::OrderDetails>>,
pub session_token: Option<String>,
pub enrolled_for_3ds: bool,
pub related_transaction_id: Option<String>,
@ -297,7 +297,7 @@ pub struct PaymentsSessionData {
pub amount: i64,
pub currency: storage_enums::Currency,
pub country: Option<api::enums::CountryAlpha2>,
pub order_details: Option<api_models::payments::OrderDetails>,
pub order_details: Option<Vec<api_models::payments::OrderDetails>>,
}
#[derive(Debug, Clone)]