use super::common::*;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum Intent {
Capture,
Authorize,
}
impl Default for Intent {
fn default() -> Self {
Intent::Capture
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone, Builder)]
pub struct PayerName {
pub given_name: String,
pub surname: String,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct PhoneNumber {
pub national_number: String,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct Phone {
pub phone_type: Option<PhoneType>,
pub phone_number: PhoneNumber,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[allow(non_camel_case_types)]
pub enum TaxIdType {
BR_CPF,
BR_CNPJ,
}
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct TaxInfo {
pub tax_id: String,
pub tax_id_type: TaxIdType,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option), default)]
pub struct Payer {
pub name: Option<PayerName>,
pub email_address: Option<String>,
pub payer_id: Option<String>,
pub phone: Option<Phone>,
pub birth_date: Option<String>,
pub tax_info: Option<TaxInfo>,
pub address: Option<Address>,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option, into))]
pub struct Breakdown {
pub item_total: Option<Money>,
pub shipping: Option<Money>,
pub handling: Option<Money>,
pub tax_total: Option<Money>,
pub insurance: Option<Money>,
pub shipping_discount: Option<Money>,
pub discount: Option<Money>,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct Amount {
pub currency_code: Currency,
pub value: String,
pub breakdown: Option<Breakdown>,
}
impl Amount {
pub fn new(currency: Currency, value: &str) -> Self {
Amount {
currency_code: currency,
value: value.to_owned(),
breakdown: None,
}
}
pub fn eur(value: &str) -> Self {
Amount {
currency_code: Currency::EUR,
value: value.to_owned(),
breakdown: None,
}
}
pub fn usd(value: &str) -> Self {
Amount {
currency_code: Currency::USD,
value: value.to_owned(),
breakdown: None,
}
}
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option, into))]
pub struct Payee {
pub email_address: Option<String>,
pub merchant_id: Option<String>,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct PlatformFee {
pub amount: Money,
pub payee: Option<Payee>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
pub enum DisbursementMode {
Instant,
Delayed,
}
impl Default for DisbursementMode {
fn default() -> Self {
DisbursementMode::Instant
}
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option, into))]
pub struct PaymentInstruction {
pub platform_fees: Option<Vec<PlatformFee>>,
pub disbursement_mode: Option<DisbursementMode>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ItemCategoryType {
DigitalGoods,
PhysicalGoods,
Donation,
}
impl Default for ItemCategoryType {
fn default() -> Self {
ItemCategoryType::DigitalGoods
}
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ShippingDetailName {
pub full_name: String,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct ShippingDetail {
pub name: Option<ShippingDetailName>,
pub address: Option<Address>,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option, into))]
pub struct Item {
pub name: String,
pub unit_amount: Money,
pub tax: Option<Money>,
pub quantity: String,
pub description: Option<String>,
pub sku: Option<String>,
pub category: Option<ItemCategoryType>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum AuthorizationStatus {
Created,
Captured,
Denied,
Expired,
PartiallyExpired,
PartiallyCaptured,
Voided,
Pending,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
pub struct AuthorizationWithData {
pub status: AuthorizationStatus,
pub status_details: AuthorizationStatusDetails,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum CaptureStatus {
Completed,
Declined,
PartiallyRefunded,
Pending,
Refunded,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum CaptureStatusDetailsReason {
BuyerComplaint,
Chargeback,
Echeck,
InternationalWithdrawal,
Other,
PendingReview,
ReceivingPreferenceMandatesManualAction,
Refunded,
TransactionApprovedAwaitingFunding,
Unilateral,
VerificationRequired,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
pub struct CaptureStatusDetails {
pub reason: CaptureStatusDetailsReason,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct Capture {
pub status: CaptureStatus,
pub status_details: Option<CaptureStatusDetails>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum RefundStatus {
Cancelled,
Pending,
Completed,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum RefundStatusDetailsReason {
Echeck,
}
#[derive(Debug, Serialize, Deserialize, Copy, Clone)]
pub struct RefundStatusDetails {
pub reason: RefundStatusDetailsReason,
}
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
pub struct ExchangeRate {
pub source_currency: Currency,
pub target_currency: Currency,
pub value: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
pub struct NetAmountBreakdown {
pub converted_amount: Money,
pub exchange_rate: ExchangeRate,
pub payable_amount: Money,
}
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct SellerPayableBreakdown {
pub gross_amount: Money,
pub net_amount: Money,
pub net_amount_breakdown: Option<Vec<NetAmountBreakdown>>,
pub net_amount_in_receivable_currency: Option<Money>,
pub paypal_fee: Money,
pub paypal_fee_in_receivable_currency: Option<Money>,
pub platform_fees: Option<Vec<PlatformFee>>,
pub total_refunded_amount: Money,
}
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct Refund {
pub status: RefundStatus,
pub status_details: Option<RefundStatusDetails>,
pub id: String,
pub amount: Money,
pub invoice_id: Option<String>,
pub links: Vec<LinkDescription>,
pub note_to_payer: Option<String>,
pub seller_payable_breakdown: SellerPayableBreakdown,
}
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct PaymentCollection {
#[serde(default)]
pub authorizations: Vec<AuthorizationWithData>,
#[serde(default)]
pub captures: Vec<Capture>,
#[serde(default)]
pub refunds: Vec<Refund>,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option, into), default)]
pub struct PurchaseUnit {
pub reference_id: Option<String>,
pub amount: Amount,
pub payee: Option<Payee>,
pub payment_instruction: Option<PaymentInstruction>,
pub description: Option<String>,
pub custom_id: Option<String>,
pub invoice_id: Option<String>,
pub id: Option<String>,
pub soft_descriptor: Option<String>,
pub items: Option<Vec<Item>>,
pub shipping: Option<ShippingDetail>,
pub payments: Option<PaymentCollection>,
}
impl PurchaseUnit {
pub fn new(amount: Amount) -> Self {
Self {
amount,
..Default::default()
}
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum LandingPage {
Login,
Billing,
NoPreference,
}
impl Default for LandingPage {
fn default() -> Self {
LandingPage::NoPreference
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ShippingPreference {
GetFromFile,
NoShipping,
SetProvidedAddress,
}
impl Default for ShippingPreference {
fn default() -> Self {
ShippingPreference::GetFromFile
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum UserAction {
Continue,
PayNow,
}
impl Default for UserAction {
fn default() -> Self {
UserAction::Continue
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum PayeePreferred {
Unrestricted,
ImmediatePaymentRequired,
}
impl Default for PayeePreferred {
fn default() -> Self {
PayeePreferred::Unrestricted
}
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct PaymentMethod {
pub payer_selected: Option<String>,
pub payee_preferred: Option<PayeePreferred>,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option, into), default)]
pub struct ApplicationContext {
pub brand_name: Option<String>,
pub locale: Option<String>,
pub landing_page: Option<LandingPage>,
pub shipping_preference: Option<ShippingPreference>,
pub user_action: Option<UserAction>,
pub payment_method: Option<PaymentMethod>,
pub return_url: Option<String>,
pub cancel_url: Option<String>,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(into))]
pub struct PaymentCard {
pub number: String,
pub expiry: String,
pub name: String,
pub billing_address: Address,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(into))]
pub struct TransactionReference {
pub id: String,
pub network: String,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(into))]
pub struct StoredCredential {
pub payment_initiator: String,
pub payment_type: String,
pub usage: String,
pub previous_network_transaction_reference: TransactionReference,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct OrderPaymentSource {
pub card: PaymentCard,
#[builder(default)]
pub stored_credential: Option<StoredCredential>,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct OrderPayload {
pub intent: Intent,
#[builder(default)]
pub payer: Option<Payer>,
pub purchase_units: Vec<PurchaseUnit>,
#[builder(default)]
pub application_context: Option<ApplicationContext>,
#[builder(default)]
pub payment_source: Option<OrderPaymentSource>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum CardBrand {
Visa,
Mastercard,
Discover,
Amex,
Solo,
JCB,
Star,
Delta,
Switch,
Maestro,
CbNationale,
Configoga,
Confidis,
Electron,
Cetelem,
ChinaUnionPay,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone, Copy)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[allow(missing_docs)]
pub enum CardType {
Credit,
Debit,
Prepaid,
Unknown,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CardResponse {
pub last_digits: String,
pub brand: CardBrand,
#[serde(rename = "type")]
pub card_type: CardType,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct WalletResponse {
pub apple_pay: CardResponse,
}
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
pub struct PaypalPaymentSourceResponse {
pub name: PayerName,
pub email_address: String,
pub account_id: String,
}
#[derive(Debug, Serialize, Deserialize, Builder, Default, Clone)]
#[builder(setter(strip_option), default)]
pub struct PaymentSourceResponse {
pub card: Option<CardResponse>,
pub wallet: Option<WalletResponse>,
pub paypal: Option<PaypalPaymentSourceResponse>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone, Copy)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderStatus {
Created,
Saved,
Approved,
Voided,
Completed,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct Order {
pub create_time: Option<chrono::DateTime<chrono::Utc>>,
pub update_time: Option<chrono::DateTime<chrono::Utc>>,
pub id: String,
pub payment_source: Option<PaymentSourceResponse>,
pub intent: Option<Intent>,
pub payer: Option<Payer>,
pub purchase_units: Option<Vec<PurchaseUnit>>,
pub status: OrderStatus,
pub links: Vec<LinkDescription>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InvoiceNumber {
pub invoice_number: String,
}