use super::common::*;
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct Receipt {
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction_data: Option<ReceiptTransaction>,
#[serde(skip_serializing_if = "Option::is_none")]
pub merchant_data: Option<ReceiptMerchantData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub emv_data: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acquirer_data: Option<ReceiptAcquirerData>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptCard {
#[serde(skip_serializing_if = "Option::is_none")]
pub last_4_digits: Option<String>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptEvent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<EventId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction_id: Option<TransactionId>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<EventType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<EventStatus>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
pub amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub receipt_no: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptMerchantData {
#[serde(skip_serializing_if = "Option::is_none")]
pub merchant_profile: Option<ReceiptMerchantDataMerchantProfile>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locale: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptReader {
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptTransaction {
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction_id: Option<TransactionId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub merchant_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amount: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vat_amount: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tip_amount: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payment_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entry_mode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verification_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub card_reader: Option<ReceiptReader>,
#[serde(skip_serializing_if = "Option::is_none")]
pub card: Option<ReceiptCard>,
#[serde(skip_serializing_if = "Option::is_none")]
pub installments_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub process_as: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub products: Option<Vec<ReceiptTransactionProductsItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vat_rates: Option<Vec<ReceiptTransactionVatRatesItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub events: Option<Vec<ReceiptEvent>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub receipt_no: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptAcquirerData {
#[serde(skip_serializing_if = "Option::is_none")]
pub tid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub return_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub local_time: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptMerchantDataMerchantProfileAddress {
#[serde(skip_serializing_if = "Option::is_none")]
pub address_line1: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_line2: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country_en_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country_native_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub landline: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptMerchantDataMerchantProfile {
#[serde(skip_serializing_if = "Option::is_none")]
pub merchant_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub business_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub company_registration_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vat_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub website: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<ReceiptMerchantDataMerchantProfileAddress>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptTransactionProductsItem {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
pub price: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
pub vat_rate: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
pub single_vat_amount: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
pub price_with_vat: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
pub vat_amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<i64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
pub total_price: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::string_or_number::deserialize_option"
)]
pub total_with_vat: Option<f64>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ReceiptTransactionVatRatesItem {
#[serde(skip_serializing_if = "Option::is_none")]
pub gross: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub net: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rate: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vat: Option<f32>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct GetParams {
pub mid: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub tx_event_id: Option<i64>,
}
use crate::client::Client;
#[derive(Debug)]
pub enum GetErrorBody {
BadRequest(Error),
Unauthorized(Problem),
NotFound(Error),
}
#[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,
id: impl Into<String>,
params: GetParams,
) -> crate::error::SdkResult<Receipt, GetErrorBody> {
let path = format!("/v1.1/receipts/{}", id.into());
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 => {
let body: Error = response.json().await?;
Err(crate::error::SdkError::api(GetErrorBody::BadRequest(body)))
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(GetErrorBody::Unauthorized(
body,
)))
}
reqwest::StatusCode::NOT_FOUND => {
let body: Error = response.json().await?;
Err(crate::error::SdkError::api(GetErrorBody::NotFound(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
}