use super::common::*;
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct CardResponse {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`last_4_digits`](CardResponse::last_4_digits)."
)
)]
pub last_4_digits: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`payment_account_reference`](CardResponse::payment_account_reference)."
)
)]
pub payment_account_reference: Option<String>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`r#type`](CardResponse::r#type).")
)]
pub r#type: Option<CardType>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct Device {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`model`](Device::model).")
)]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`name`](Device::name).")
)]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`system_name`](Device::system_name).")
)]
pub system_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`system_version`](Device::system_version)."
)
)]
pub system_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`uuid`](Device::uuid).")
)]
pub uuid: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ElvCardAccount {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`iban`](ElvCardAccount::iban).")
)]
pub iban: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`last_4_digits`](ElvCardAccount::last_4_digits)."
)
)]
pub last_4_digits: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`sequence_no`](ElvCardAccount::sequence_no)."
)
)]
pub sequence_no: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`sort_code`](ElvCardAccount::sort_code)."
)
)]
pub sort_code: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct Event {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, doc = "Sets [`amount`](Event::amount)."))]
pub amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`deducted_amount`](Event::deducted_amount)."
)
)]
pub deducted_amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`deducted_fee_amount`](Event::deducted_fee_amount)."
)
)]
pub deducted_fee_amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`fee_amount`](Event::fee_amount).")
)]
pub fee_amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, doc = "Sets [`id`](Event::id)."))]
pub id: Option<TransactionEventId>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`installment_number`](Event::installment_number)."
)
)]
pub installment_number: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, doc = "Sets [`status`](Event::status)."))]
pub status: Option<TransactionEventStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`timestamp`](Event::timestamp).")
)]
pub timestamp: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_id`](Event::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`](Event::r#type)."))]
pub r#type: Option<TransactionEventType>,
}
pub type HorizontalAccuracy = f32;
pub type Lat = f32;
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct Link {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`href`](Link::href).")
)]
pub href: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`max_amount`](Link::max_amount).")
)]
pub max_amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`min_amount`](Link::min_amount).")
)]
pub min_amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into, doc = "Sets [`rel`](Link::rel)."))]
pub rel: Option<String>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`r#type`](Link::r#type).")
)]
pub r#type: Option<String>,
}
pub type Lon = f32;
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct Product {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`name`](Product::name).")
)]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, doc = "Sets [`price`](Product::price)."))]
pub price: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`price_label`](Product::price_label)."
)
)]
pub price_label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`price_with_vat`](Product::price_with_vat)."
)
)]
pub price_with_vat: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`quantity`](Product::quantity).")
)]
pub quantity: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`single_vat_amount`](Product::single_vat_amount)."
)
)]
pub single_vat_amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`total_price`](Product::total_price).")
)]
pub total_price: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`total_with_vat`](Product::total_with_vat)."
)
)]
pub total_with_vat: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`vat_amount`](Product::vat_amount).")
)]
pub vat_amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`vat_rate`](Product::vat_rate).")
)]
pub vat_rate: Option<f64>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct TransactionEvent {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`amount`](TransactionEvent::amount).")
)]
pub amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`date`](TransactionEvent::date).")
)]
pub date: Option<crate::datetime::Date>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`due_date`](TransactionEvent::due_date).")
)]
pub due_date: Option<crate::datetime::Date>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`event_type`](TransactionEvent::event_type)."
)
)]
pub event_type: Option<TransactionEventType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`id`](TransactionEvent::id).")
)]
pub id: Option<TransactionEventId>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`installment_number`](TransactionEvent::installment_number)."
)
)]
pub installment_number: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`status`](TransactionEvent::status).")
)]
pub status: Option<TransactionEventStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`timestamp`](TransactionEvent::timestamp).")
)]
pub timestamp: Option<crate::datetime::DateTime>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct TransactionFull {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`amount`](TransactionFull::amount).")
)]
pub amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`auth_code`](TransactionFull::auth_code)."
)
)]
pub auth_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`card`](TransactionFull::card).")
)]
pub card: Option<CardResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`client_transaction_id`](TransactionFull::client_transaction_id)."
)
)]
pub client_transaction_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`currency`](TransactionFull::currency).")
)]
pub currency: Option<Currency>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`device_info`](TransactionFull::device_info)."
)
)]
pub device_info: Option<Device>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`elv_account`](TransactionFull::elv_account)."
)
)]
pub elv_account: Option<ElvCardAccount>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`entry_mode`](TransactionFull::entry_mode)."
)
)]
pub entry_mode: Option<EntryMode>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`events`](TransactionFull::events).")
)]
pub events: Option<Vec<Event>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`fee_amount`](TransactionFull::fee_amount)."
)
)]
pub fee_amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`foreign_transaction_id`](TransactionFull::foreign_transaction_id)."
)
)]
pub foreign_transaction_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`horizontal_accuracy`](TransactionFull::horizontal_accuracy)."
)
)]
pub horizontal_accuracy: Option<HorizontalAccuracy>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`id`](TransactionFull::id).")
)]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`installments_count`](TransactionFull::installments_count)."
)
)]
pub installments_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`lat`](TransactionFull::lat).")
)]
pub lat: Option<Lat>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`links`](TransactionFull::links).")
)]
pub links: Option<Vec<Link>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`local_time`](TransactionFull::local_time)."
)
)]
pub local_time: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`location`](TransactionFull::location).")
)]
pub location: Option<TransactionFullLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`lon`](TransactionFull::lon).")
)]
pub lon: Option<Lon>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`merchant_code`](TransactionFull::merchant_code)."
)
)]
pub merchant_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`merchant_id`](TransactionFull::merchant_id)."
)
)]
pub merchant_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payment_type`](TransactionFull::payment_type)."
)
)]
pub payment_type: Option<PaymentType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payout_date`](TransactionFull::payout_date)."
)
)]
pub payout_date: Option<crate::datetime::Date>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payout_plan`](TransactionFull::payout_plan)."
)
)]
pub payout_plan: Option<TransactionFullPayoutPlan>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payout_type`](TransactionFull::payout_type)."
)
)]
pub payout_type: Option<TransactionFullPayoutType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payouts_received`](TransactionFull::payouts_received)."
)
)]
pub payouts_received: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payouts_total`](TransactionFull::payouts_total)."
)
)]
pub payouts_total: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`process_as`](TransactionFull::process_as)."
)
)]
pub process_as: Option<TransactionFullProcessAs>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`product_summary`](TransactionFull::product_summary)."
)
)]
pub product_summary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`products`](TransactionFull::products).")
)]
pub products: Option<Vec<Product>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`simple_payment_type`](TransactionFull::simple_payment_type)."
)
)]
pub simple_payment_type: Option<TransactionFullSimplePaymentType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`simple_status`](TransactionFull::simple_status)."
)
)]
pub simple_status: Option<TransactionFullSimpleStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`status`](TransactionFull::status).")
)]
pub status: Option<TransactionStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`tax_enabled`](TransactionFull::tax_enabled)."
)
)]
pub tax_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`timestamp`](TransactionFull::timestamp).")
)]
pub timestamp: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`tip_amount`](TransactionFull::tip_amount)."
)
)]
pub tip_amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_code`](TransactionFull::transaction_code)."
)
)]
pub transaction_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`transaction_events`](TransactionFull::transaction_events)."
)
)]
pub transaction_events: Option<Vec<TransactionEvent>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`username`](TransactionFull::username)."
)
)]
pub username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`vat_amount`](TransactionFull::vat_amount)."
)
)]
pub vat_amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`vat_rates`](TransactionFull::vat_rates).")
)]
pub vat_rates: Option<Vec<TransactionFullVatRatesItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`verification_method`](TransactionFull::verification_method)."
)
)]
pub verification_method: Option<TransactionFullVerificationMethod>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct TransactionHistory {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`amount`](TransactionHistory::amount).")
)]
pub amount: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`card_type`](TransactionHistory::card_type)."
)
)]
pub card_type: Option<CardType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`client_transaction_id`](TransactionHistory::client_transaction_id)."
)
)]
pub client_transaction_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`currency`](TransactionHistory::currency).")
)]
pub currency: Option<Currency>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`id`](TransactionHistory::id).")
)]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`installments_count`](TransactionHistory::installments_count)."
)
)]
pub installments_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payment_type`](TransactionHistory::payment_type)."
)
)]
pub payment_type: Option<PaymentType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payout_date`](TransactionHistory::payout_date)."
)
)]
pub payout_date: Option<crate::datetime::Date>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payout_plan`](TransactionHistory::payout_plan)."
)
)]
pub payout_plan: Option<TransactionHistoryPayoutPlan>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payout_type`](TransactionHistory::payout_type)."
)
)]
pub payout_type: Option<TransactionHistoryPayoutType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payouts_received`](TransactionHistory::payouts_received)."
)
)]
pub payouts_received: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payouts_total`](TransactionHistory::payouts_total)."
)
)]
pub payouts_total: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`product_summary`](TransactionHistory::product_summary)."
)
)]
pub product_summary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`refunded_amount`](TransactionHistory::refunded_amount)."
)
)]
pub refunded_amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`status`](TransactionHistory::status).")
)]
pub status: Option<TransactionStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`timestamp`](TransactionHistory::timestamp)."
)
)]
pub timestamp: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_code`](TransactionHistory::transaction_code)."
)
)]
pub transaction_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_id`](TransactionHistory::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`](TransactionHistory::r#type).")
)]
pub r#type: Option<TransactionHistoryType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`user`](TransactionHistory::user).")
)]
pub user: Option<String>,
}
#[derive(
Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct TransactionsHistoryLink {
#[builder(setter(into, doc = "Sets [`href`](TransactionsHistoryLink::href)."))]
pub href: String,
#[builder(setter(into, doc = "Sets [`rel`](TransactionsHistoryLink::rel)."))]
pub rel: String,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct TransactionFullLocation {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`horizontal_accuracy`](TransactionFullLocation::horizontal_accuracy)."
)
)]
pub horizontal_accuracy: Option<HorizontalAccuracy>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`lat`](TransactionFullLocation::lat).")
)]
pub lat: Option<Lat>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`lon`](TransactionFullLocation::lon).")
)]
pub lon: Option<Lon>,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionFullPayoutPlan {
#[serde(rename = "SINGLE_PAYMENT")]
SinglePayment,
#[serde(rename = "TRUE_INSTALLMENT")]
TrueInstallment,
#[serde(rename = "ACCELERATED_INSTALLMENT")]
AcceleratedInstallment,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionFullPayoutType {
#[serde(rename = "BANK_ACCOUNT")]
BankAccount,
#[serde(rename = "PREPAID_CARD")]
PrepaidCard,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionFullProcessAs {
#[serde(rename = "CREDIT")]
Credit,
#[serde(rename = "DEBIT")]
Debit,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionFullSimplePaymentType {
#[serde(rename = "CASH")]
Cash,
#[serde(rename = "CC_SIGNATURE")]
CcSignature,
#[serde(rename = "ELV")]
Elv,
#[serde(rename = "ELV_WITHOUT_SIGNATURE")]
ElvWithoutSignature,
#[serde(rename = "CC_CUSTOMER_ENTERED")]
CcCustomerEntered,
#[serde(rename = "MANUAL_ENTRY")]
ManualEntry,
#[serde(rename = "EMV")]
Emv,
#[serde(rename = "RECURRING")]
Recurring,
#[serde(rename = "BALANCE")]
Balance,
#[serde(rename = "MOTO")]
Moto,
#[serde(rename = "BOLETO")]
Boleto,
#[serde(rename = "APM")]
Apm,
#[serde(rename = "BITCOIN")]
Bitcoin,
#[serde(rename = "CARD")]
Card,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionFullSimpleStatus {
#[serde(rename = "SUCCESSFUL")]
Successful,
#[serde(rename = "PAID_OUT")]
PaidOut,
#[serde(rename = "CANCEL_FAILED")]
CancelFailed,
#[serde(rename = "CANCELLED")]
Cancelled,
#[serde(rename = "CHARGEBACK")]
Chargeback,
#[serde(rename = "FAILED")]
Failed,
#[serde(rename = "REFUND_FAILED")]
RefundFailed,
#[serde(rename = "REFUNDED")]
Refunded,
#[serde(rename = "NON_COLLECTION")]
NonCollection,
#[serde(rename = "PENDING")]
Pending,
#[serde(untagged)]
Other(String),
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct TransactionFullVatRatesItem {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`gross`](TransactionFullVatRatesItem::gross)."
)
)]
pub gross: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`net`](TransactionFullVatRatesItem::net).")
)]
pub net: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`rate`](TransactionFullVatRatesItem::rate)."
)
)]
pub rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`vat`](TransactionFullVatRatesItem::vat).")
)]
pub vat: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionFullVerificationMethod {
#[serde(rename = "none")]
None,
#[serde(rename = "signature")]
Signature,
#[serde(rename = "offline PIN")]
OfflinePin,
#[serde(rename = "online PIN")]
OnlinePin,
#[serde(rename = "offline PIN + signature")]
OfflinePinSignature,
#[serde(rename = "na")]
Na,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionHistoryPayoutPlan {
#[serde(rename = "SINGLE_PAYMENT")]
SinglePayment,
#[serde(rename = "TRUE_INSTALLMENT")]
TrueInstallment,
#[serde(rename = "ACCELERATED_INSTALLMENT")]
AcceleratedInstallment,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionHistoryPayoutType {
#[serde(rename = "BANK_ACCOUNT")]
BankAccount,
#[serde(rename = "PREPAID_CARD")]
PrepaidCard,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TransactionHistoryType {
#[serde(rename = "PAYMENT")]
Payment,
#[serde(rename = "REFUND")]
Refund,
#[serde(rename = "CHARGE_BACK")]
ChargeBack,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum ListParamsOrder {
#[serde(rename = "ascending")]
Ascending,
#[serde(rename = "descending")]
Descending,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum ListParamsStatusesItem {
#[serde(rename = "SUCCESSFUL")]
Successful,
#[serde(rename = "CANCELLED")]
Cancelled,
#[serde(rename = "FAILED")]
Failed,
#[serde(rename = "REFUNDED")]
Refunded,
#[serde(rename = "CHARGE_BACK")]
ChargeBack,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum ListParamsTypesItem {
#[serde(rename = "PAYMENT")]
Payment,
#[serde(rename = "REFUND")]
Refund,
#[serde(rename = "CHARGE_BACK")]
ChargeBack,
#[serde(untagged)]
Other(String),
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct RefundRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`amount`](RefundRequest::amount).")
)]
pub amount: Option<f32>,
}
pub type RefundResponse = serde_json::Value;
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct GetParams {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`id`](GetParams::id).")
)]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_code`](GetParams::transaction_code)."
)
)]
pub transaction_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`foreign_transaction_id`](GetParams::foreign_transaction_id)."
)
)]
pub foreign_transaction_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`client_transaction_id`](GetParams::client_transaction_id)."
)
)]
pub client_transaction_id: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ListParams {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`transaction_code`](ListParams::transaction_code)."
)
)]
pub transaction_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`order`](ListParams::order).")
)]
pub order: Option<ListParamsOrder>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`limit`](ListParams::limit).")
)]
pub limit: Option<i64>,
#[serde(rename = "users[]")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`users`](ListParams::users).")
)]
pub users: Option<Vec<String>>,
#[serde(rename = "statuses[]")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`statuses`](ListParams::statuses).")
)]
pub statuses: Option<Vec<ListParamsStatusesItem>>,
#[serde(rename = "payment_types[]")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`payment_types`](ListParams::payment_types)."
)
)]
pub payment_types: Option<Vec<PaymentType>>,
#[serde(rename = "entry_modes[]")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`entry_modes`](ListParams::entry_modes).")
)]
pub entry_modes: Option<Vec<EntryMode>>,
#[serde(rename = "types[]")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`types`](ListParams::types).")
)]
pub types: Option<Vec<ListParamsTypesItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`changes_since`](ListParams::changes_since)."
)
)]
pub changes_since: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`newest_time`](ListParams::newest_time).")
)]
pub newest_time: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`newest_ref`](ListParams::newest_ref)."
)
)]
pub newest_ref: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`oldest_time`](ListParams::oldest_time).")
)]
pub oldest_time: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`oldest_ref`](ListParams::oldest_ref)."
)
)]
pub oldest_ref: Option<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ListResponse {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`items`](ListResponse::items).")
)]
pub items: Option<Vec<TransactionHistory>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`links`](ListResponse::links).")
)]
pub links: Option<Vec<TransactionsHistoryLink>>,
}
use crate::client::Client;
#[derive(Debug, PartialEq)]
pub enum RefundErrorBody {
BadRequest(Problem),
Forbidden(Problem),
NotFound(Problem),
Conflict(Problem),
UnprocessableEntity(Problem),
}
impl crate::error::ProblemDetails for RefundErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::BadRequest(problem) => Some(problem),
Self::Forbidden(problem) => Some(problem),
Self::NotFound(problem) => Some(problem),
Self::Conflict(problem) => Some(problem),
Self::UnprocessableEntity(problem) => Some(problem),
}
}
}
#[derive(Debug, PartialEq)]
pub enum GetErrorBody {
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, PartialEq)]
pub enum ListErrorBody {
BadRequest(Error),
Unauthorized(Problem),
}
impl crate::error::ProblemDetails for ListErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::Unauthorized(problem) => Some(problem),
_ => None,
}
}
}
#[derive(Debug)]
pub struct TransactionsClient<'a> {
client: &'a Client,
}
impl<'a> TransactionsClient<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn client(&self) -> &Client {
self.client
}
pub async fn refund(
&self,
merchant_code: impl AsRef<str>,
transaction_id: impl AsRef<str>,
body: Option<RefundRequest>,
) -> crate::error::SdkResult<RefundResponse, RefundErrorBody> {
let path = format!(
"/v1.0/merchants/{}/payments/{}/refunds",
merchant_code.as_ref(),
transaction_id.as_ref()
);
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.post(&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);
}
if let Some(body) = body {
request = request.json(&body);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::CREATED => {
let data: RefundResponse = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(RefundErrorBody::BadRequest)
})
.await)
}
reqwest::StatusCode::FORBIDDEN => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(RefundErrorBody::Forbidden)
})
.await)
}
reqwest::StatusCode::NOT_FOUND => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(RefundErrorBody::NotFound)
})
.await)
}
reqwest::StatusCode::CONFLICT => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(RefundErrorBody::Conflict)
})
.await)
}
reqwest::StatusCode::UNPROCESSABLE_ENTITY => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(RefundErrorBody::UnprocessableEntity)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
pub async fn get(
&self,
merchant_code: impl AsRef<str>,
params: GetParams,
) -> crate::error::SdkResult<TransactionFull, GetErrorBody> {
let path = format!("/v2.1/merchants/{}/transactions", merchant_code.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);
}
if let Some(ref value) = params.id {
request = request.query(&[("id", value)]);
}
if let Some(ref value) = params.transaction_code {
request = request.query(&[("transaction_code", value)]);
}
if let Some(ref value) = params.foreign_transaction_id {
request = request.query(&[("foreign_transaction_id", value)]);
}
if let Some(ref value) = params.client_transaction_id {
request = request.query(&[("client_transaction_id", value)]);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => {
let data: TransactionFull = response.json().await?;
Ok(data)
}
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),
}
}
pub async fn list(
&self,
merchant_code: impl AsRef<str>,
params: ListParams,
) -> crate::error::SdkResult<ListResponse, ListErrorBody> {
let path = format!(
"/v2.1/merchants/{}/transactions/history",
merchant_code.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);
}
if let Some(ref value) = params.transaction_code {
request = request.query(&[("transaction_code", value)]);
}
if let Some(ref value) = params.order {
request = request.query(&[("order", value)]);
}
if let Some(ref value) = params.limit {
request = request.query(&[("limit", value)]);
}
if let Some(ref value) = params.users {
request = request.query(&[("users[]", value)]);
}
if let Some(ref value) = params.statuses {
request = request.query(&[("statuses[]", value)]);
}
if let Some(ref value) = params.payment_types {
request = request.query(&[("payment_types[]", value)]);
}
if let Some(ref value) = params.entry_modes {
request = request.query(&[("entry_modes[]", value)]);
}
if let Some(ref value) = params.types {
request = request.query(&[("types[]", value)]);
}
if let Some(ref value) = params.changes_since {
request = request.query(&[("changes_since", value)]);
}
if let Some(ref value) = params.newest_time {
request = request.query(&[("newest_time", value)]);
}
if let Some(ref value) = params.newest_ref {
request = request.query(&[("newest_ref", value)]);
}
if let Some(ref value) = params.oldest_time {
request = request.query(&[("oldest_time", value)]);
}
if let Some(ref value) = params.oldest_ref {
request = request.query(&[("oldest_ref", value)]);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => {
let data: ListResponse = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Error>(raw).map(ListErrorBody::BadRequest)
})
.await)
}
reqwest::StatusCode::UNAUTHORIZED => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(ListErrorBody::Unauthorized)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
}