use crate::ids::BalanceTransactionId;
use crate::params::{Expandable, Object, Timestamp};
use crate::resources::{
ApplicationFee, ApplicationFeeRefund, Charge, ConnectCollectionTransfer, Currency, Dispute,
IssuingAuthorization, IssuingTransaction, Payout, Refund, ReserveTransaction, Topup, Transfer,
TransferReversal,
};
use serde_derive::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BalanceTransaction {
pub id: BalanceTransactionId,
pub amount: i64,
pub available_on: Timestamp,
pub created: Timestamp,
pub currency: Currency,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exchange_rate: Option<f64>,
pub fee: i64,
pub fee_details: Vec<Fee>,
pub net: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<Expandable<BalanceTransactionSource>>,
pub status: BalanceTransactionStatus,
#[serde(rename = "type")]
pub type_: BalanceTransactionType,
}
impl Object for BalanceTransaction {
type Id = BalanceTransactionId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"balance_transaction"
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Fee {
pub amount: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub application: Option<String>,
pub currency: Currency,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "type")]
pub type_: FeeType,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(tag = "object", rename_all = "snake_case")]
pub enum BalanceTransactionSource {
ApplicationFee(ApplicationFee),
Charge(Charge),
ConnectCollectionTransfer(ConnectCollectionTransfer),
Dispute(Dispute),
#[serde(rename = "fee_refund")]
ApplicationFeeRefund(ApplicationFeeRefund),
#[serde(rename = "issuing.authorization")]
IssuingAuthorization(IssuingAuthorization),
#[serde(rename = "issuing.transaction")]
IssuingTransaction(IssuingTransaction),
Payout(Payout),
Refund(Refund),
ReserveTransaction(ReserveTransaction),
Topup(Topup),
Transfer(Transfer),
TransferReversal(TransferReversal),
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum BalanceTransactionStatus {
Available,
Pending,
}
impl BalanceTransactionStatus {
pub fn as_str(self) -> &'static str {
match self {
BalanceTransactionStatus::Available => "available",
BalanceTransactionStatus::Pending => "pending",
}
}
}
impl AsRef<str> for BalanceTransactionStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for BalanceTransactionStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum BalanceTransactionType {
Adjustment,
Advance,
AdvanceFunding,
ApplicationFee,
ApplicationFeeRefund,
Charge,
ConnectCollectionTransfer,
IssuingAuthorizationHold,
IssuingAuthorizationRelease,
IssuingTransaction,
Payment,
PaymentFailureRefund,
PaymentRefund,
Payout,
PayoutCancel,
PayoutFailure,
Refund,
RefundFailure,
ReserveTransaction,
ReservedFunds,
StripeFee,
StripeFxFee,
TaxFee,
Topup,
TopupReversal,
Transfer,
TransferCancel,
TransferFailure,
TransferRefund,
}
impl BalanceTransactionType {
pub fn as_str(self) -> &'static str {
match self {
BalanceTransactionType::Adjustment => "adjustment",
BalanceTransactionType::Advance => "advance",
BalanceTransactionType::AdvanceFunding => "advance_funding",
BalanceTransactionType::ApplicationFee => "application_fee",
BalanceTransactionType::ApplicationFeeRefund => "application_fee_refund",
BalanceTransactionType::Charge => "charge",
BalanceTransactionType::ConnectCollectionTransfer => "connect_collection_transfer",
BalanceTransactionType::IssuingAuthorizationHold => "issuing_authorization_hold",
BalanceTransactionType::IssuingAuthorizationRelease => "issuing_authorization_release",
BalanceTransactionType::IssuingTransaction => "issuing_transaction",
BalanceTransactionType::Payment => "payment",
BalanceTransactionType::PaymentFailureRefund => "payment_failure_refund",
BalanceTransactionType::PaymentRefund => "payment_refund",
BalanceTransactionType::Payout => "payout",
BalanceTransactionType::PayoutCancel => "payout_cancel",
BalanceTransactionType::PayoutFailure => "payout_failure",
BalanceTransactionType::Refund => "refund",
BalanceTransactionType::RefundFailure => "refund_failure",
BalanceTransactionType::ReserveTransaction => "reserve_transaction",
BalanceTransactionType::ReservedFunds => "reserved_funds",
BalanceTransactionType::StripeFee => "stripe_fee",
BalanceTransactionType::StripeFxFee => "stripe_fx_fee",
BalanceTransactionType::TaxFee => "tax_fee",
BalanceTransactionType::Topup => "topup",
BalanceTransactionType::TopupReversal => "topup_reversal",
BalanceTransactionType::Transfer => "transfer",
BalanceTransactionType::TransferCancel => "transfer_cancel",
BalanceTransactionType::TransferFailure => "transfer_failure",
BalanceTransactionType::TransferRefund => "transfer_refund",
}
}
}
impl AsRef<str> for BalanceTransactionType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for BalanceTransactionType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum FeeType {
ApplicationFee,
StripeFee,
Tax,
}
impl FeeType {
pub fn as_str(self) -> &'static str {
match self {
FeeType::ApplicationFee => "application_fee",
FeeType::StripeFee => "stripe_fee",
FeeType::Tax => "tax",
}
}
}
impl AsRef<str> for FeeType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for FeeType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}