use super::common::*;
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct Receipt {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`acquirer_data`](Receipt::acquirer_data).")
)]
pub acquirer_data: Option<ReceiptAcquirerData>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`emv_data`](Receipt::emv_data).")
)]
pub emv_data: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`merchant_data`](Receipt::merchant_data).")
)]
pub merchant_data: Option<ReceiptMerchantData>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`transaction_data`](Receipt::transaction_data)."
)
)]
pub transaction_data: Option<ReceiptTransaction>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptCard {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`last_4_digits`](ReceiptCard::last_4_digits)."
)
)]
pub last_4_digits: Option<String>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`r#type`](ReceiptCard::r#type).")
)]
pub r#type: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptEvent {
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
#[builder(
default,
setter(strip_option, doc = "Sets [`amount`](ReceiptEvent::amount).")
)]
pub amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, doc = "Sets [`id`](ReceiptEvent::id)."))]
pub id: Option<TransactionEventId>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`receipt_no`](ReceiptEvent::receipt_no)."
)
)]
pub receipt_no: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`status`](ReceiptEvent::status).")
)]
pub status: Option<TransactionEventStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`timestamp`](ReceiptEvent::timestamp).")
)]
pub timestamp: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_id`](ReceiptEvent::transaction_id)."
)
)]
pub transaction_id: Option<TransactionId>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`r#type`](ReceiptEvent::r#type).")
)]
pub r#type: Option<TransactionEventType>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptMerchantData {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`locale`](ReceiptMerchantData::locale)."
)
)]
pub locale: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`merchant_profile`](ReceiptMerchantData::merchant_profile)."
)
)]
pub merchant_profile: Option<ReceiptMerchantDataMerchantProfile>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptReader {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`code`](ReceiptReader::code).")
)]
pub code: Option<String>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`r#type`](ReceiptReader::r#type).")
)]
pub r#type: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptTransaction {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`amount`](ReceiptTransaction::amount)."
)
)]
pub amount: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`card`](ReceiptTransaction::card).")
)]
pub card: Option<ReceiptCard>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`card_reader`](ReceiptTransaction::card_reader)."
)
)]
pub card_reader: Option<ReceiptReader>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`currency`](ReceiptTransaction::currency)."
)
)]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`entry_mode`](ReceiptTransaction::entry_mode)."
)
)]
pub entry_mode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`events`](ReceiptTransaction::events).")
)]
pub events: Option<Vec<ReceiptEvent>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`installments_count`](ReceiptTransaction::installments_count)."
)
)]
pub installments_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`merchant_code`](ReceiptTransaction::merchant_code)."
)
)]
pub merchant_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`payment_type`](ReceiptTransaction::payment_type)."
)
)]
pub payment_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`process_as`](ReceiptTransaction::process_as)."
)
)]
pub process_as: Option<ReceiptTransactionProcessAs>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`products`](ReceiptTransaction::products).")
)]
pub products: Option<Vec<ReceiptTransactionProductsItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`receipt_no`](ReceiptTransaction::receipt_no)."
)
)]
pub receipt_no: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`status`](ReceiptTransaction::status)."
)
)]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`timestamp`](ReceiptTransaction::timestamp)."
)
)]
pub timestamp: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`tip_amount`](ReceiptTransaction::tip_amount)."
)
)]
pub tip_amount: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_code`](ReceiptTransaction::transaction_code)."
)
)]
pub transaction_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_id`](ReceiptTransaction::transaction_id)."
)
)]
pub transaction_id: Option<TransactionId>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`vat_amount`](ReceiptTransaction::vat_amount)."
)
)]
pub vat_amount: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`vat_rates`](ReceiptTransaction::vat_rates)."
)
)]
pub vat_rates: Option<Vec<ReceiptTransactionVatRatesItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`verification_method`](ReceiptTransaction::verification_method)."
)
)]
pub verification_method: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptAcquirerData {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`authorization_code`](ReceiptAcquirerData::authorization_code)."
)
)]
pub authorization_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`local_time`](ReceiptAcquirerData::local_time)."
)
)]
pub local_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`return_code`](ReceiptAcquirerData::return_code)."
)
)]
pub return_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`tid`](ReceiptAcquirerData::tid).")
)]
pub tid: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptMerchantDataMerchantProfileAddress {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`address_line1`](ReceiptMerchantDataMerchantProfileAddress::address_line1)."
)
)]
pub address_line1: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`address_line2`](ReceiptMerchantDataMerchantProfileAddress::address_line2)."
)
)]
pub address_line2: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`city`](ReceiptMerchantDataMerchantProfileAddress::city)."
)
)]
pub city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`country`](ReceiptMerchantDataMerchantProfileAddress::country)."
)
)]
pub country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`country_en_name`](ReceiptMerchantDataMerchantProfileAddress::country_en_name)."
)
)]
pub country_en_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`country_native_name`](ReceiptMerchantDataMerchantProfileAddress::country_native_name)."
)
)]
pub country_native_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`landline`](ReceiptMerchantDataMerchantProfileAddress::landline)."
)
)]
pub landline: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`post_code`](ReceiptMerchantDataMerchantProfileAddress::post_code)."
)
)]
pub post_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`region_name`](ReceiptMerchantDataMerchantProfileAddress::region_name)."
)
)]
pub region_name: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptMerchantDataMerchantProfile {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`address`](ReceiptMerchantDataMerchantProfile::address)."
)
)]
pub address: Option<ReceiptMerchantDataMerchantProfileAddress>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`business_name`](ReceiptMerchantDataMerchantProfile::business_name)."
)
)]
pub business_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`company_registration_number`](ReceiptMerchantDataMerchantProfile::company_registration_number)."
)
)]
pub company_registration_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`email`](ReceiptMerchantDataMerchantProfile::email)."
)
)]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`language`](ReceiptMerchantDataMerchantProfile::language)."
)
)]
pub language: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`merchant_code`](ReceiptMerchantDataMerchantProfile::merchant_code)."
)
)]
pub merchant_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`vat_id`](ReceiptMerchantDataMerchantProfile::vat_id)."
)
)]
pub vat_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`website`](ReceiptMerchantDataMerchantProfile::website)."
)
)]
pub website: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum ReceiptTransactionProcessAs {
#[serde(rename = "CREDIT")]
Credit,
#[serde(rename = "DEBIT")]
Debit,
#[serde(untagged)]
Other(String),
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptTransactionProductsItem {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`description`](ReceiptTransactionProductsItem::description)."
)
)]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`name`](ReceiptTransactionProductsItem::name)."
)
)]
pub name: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`price`](ReceiptTransactionProductsItem::price)."
)
)]
pub price: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`price_with_vat`](ReceiptTransactionProductsItem::price_with_vat)."
)
)]
pub price_with_vat: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`quantity`](ReceiptTransactionProductsItem::quantity)."
)
)]
pub quantity: Option<i64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`single_vat_amount`](ReceiptTransactionProductsItem::single_vat_amount)."
)
)]
pub single_vat_amount: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`total_price`](ReceiptTransactionProductsItem::total_price)."
)
)]
pub total_price: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`total_with_vat`](ReceiptTransactionProductsItem::total_with_vat)."
)
)]
pub total_with_vat: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`vat_amount`](ReceiptTransactionProductsItem::vat_amount)."
)
)]
pub vat_amount: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`vat_rate`](ReceiptTransactionProductsItem::vat_rate)."
)
)]
pub vat_rate: Option<f64>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ReceiptTransactionVatRatesItem {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`gross`](ReceiptTransactionVatRatesItem::gross)."
)
)]
pub gross: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`net`](ReceiptTransactionVatRatesItem::net)."
)
)]
pub net: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`rate`](ReceiptTransactionVatRatesItem::rate)."
)
)]
pub rate: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`vat`](ReceiptTransactionVatRatesItem::vat)."
)
)]
pub vat: Option<f32>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct GetParams {
#[builder(setter(into, doc = "Sets [`mid`](GetParams::mid)."))]
pub mid: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`tx_event_id`](GetParams::tx_event_id).")
)]
pub tx_event_id: Option<i64>,
}
use crate::client::Client;
#[derive(Debug, PartialEq)]
pub enum GetErrorBody {
BadRequest(Error),
Unauthorized(Problem),
NotFound(Error),
}
impl crate::error::ProblemDetails for GetErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::Unauthorized(problem) => Some(problem),
_ => None,
}
}
}
#[derive(Debug)]
pub struct ReceiptsClient<'a> {
client: &'a Client,
}
impl<'a> ReceiptsClient<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn client(&self) -> &Client {
self.client
}
pub async fn get(
&self,
transaction_id: impl AsRef<str>,
params: GetParams,
) -> crate::error::SdkResult<Receipt, GetErrorBody> {
let path = format!("/v1.1/receipts/{}", transaction_id.as_ref());
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.get(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout());
if let Some(authorization) = self.client.authorization() {
request = request.header("Authorization", format!("Bearer {}", authorization));
}
for (header_name, header_value) in self.client.runtime_headers() {
request = request.header(*header_name, header_value);
}
request = request.query(&[("mid", ¶ms.mid)]);
if let Some(ref value) = params.tx_event_id {
request = request.query(&[("tx_event_id", value)]);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => {
let data: Receipt = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Error>(raw).map(GetErrorBody::BadRequest)
})
.await)
}
reqwest::StatusCode::UNAUTHORIZED => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(GetErrorBody::Unauthorized)
})
.await)
}
reqwest::StatusCode::NOT_FOUND => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Error>(raw).map(GetErrorBody::NotFound)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
}