1use chrono::{DateTime, Utc};
2use crate::resources::{Address, List};
3use crate::client::Client;
4#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
7#[serde(rename_all="camelCase")]
8pub struct Transaction {
9 pub amount: f32,
10 pub bank_description: Option<String>,
11 pub counterparty_id: String,
12 pub counterparty_name: String,
13 pub counterparty_nickname: Option<String>,
14 pub created_at: DateTime<Utc>,
15 pub dashboard_link: String,
16 pub details: TransactionDetails,
17 pub estimated_delivery_date: DateTime<Utc>,
18 pub failed_at: Option<DateTime<Utc>>,
19 pub id: String,
20 pub kind: TransactionDetailKind,
21 pub note: Option<String>,
22 pub external_memo: Option<String>,
23 pub posted_at: Option<DateTime<Utc>>,
24 pub reason_for_failure: Option<String>,
25 pub status: TransactionDetailStatus,
26 pub fee_id: Option<String>
27}
28
29#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
30#[serde(rename_all="camelCase")]
31pub struct TransactionDetails {
32 pub address: Option<Address>,
33 pub domestic_wire_routing_info: Option<DomesticWireRoutingInfo>,
34 pub electronic_routing_info: Option<ElectronicRoutingInfo>,
35 pub international_wire_routing_info: Option<InternationalWireRoutingInfo>,
36
37}
38
39#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
40#[serde(rename_all="camelCase")]
41pub enum TransactionDetailStatus {
42 Pending,
43 Sent,
44 Cancelled,
45 Failed,
46}
47
48#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
49#[serde(rename_all="camelCase")]
50pub enum TransactionDetailKind {
51 ExternalTransfer,
52 InternalTransfer,
53 OutgoingPayment,
54 DebitCardTransaction,
55 IncomingDomesticWire,
56 CheckDeposit,
57 IncomingInternationalWire,
58 Fee,
59 Other
60}
61
62#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
63#[serde(rename_all="camelCase")]
64pub struct DomesticWireRoutingInfo {
65 pub bank_name: Option<String>,
66 pub account_number: String,
67 pub routing_number: String,
68 pub address: Option<Address>,
69}
70
71#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
72#[serde(rename_all="camelCase")]
73pub struct ElectronicRoutingInfo {
74 pub account_number: String,
75 pub routing_number: String,
76 pub bank_name: Option<String>,
77}
78
79#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
80#[serde(rename_all="camelCase")]
81pub struct InternationalWireRoutingInfo {
82 pub iban: String,
83 pub swift_code: String,
84 pub correspondent_info: Option<CorrespondentInfo>,
85 pub bank_details: Option<BankDetails>,
86 pub address: Option<Address>,
87 pub phone_number: Option<String>,
88 pub country_specific: Option<CountrySpecific>,
89}
90
91#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
92#[serde(rename_all="camelCase")]
93pub struct CorrespondentInfo {
94 pub routing_number: Option<String>,
95 pub swift_code: Option<String>,
96 pub bank_name: Option<String>,
97}
98
99#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
100#[serde(rename_all="camelCase")]
101pub struct BankDetails {
102 pub bank_name: String,
103 pub city_state: String,
104 pub country: Option<String>,
105}
106
107#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
108#[serde(rename_all="camelCase")]
109pub struct CountrySpecific {
110 pub country_specific_data_canada: Option<CountrySpecificData>,
111 pub country_specific_data_australia: Option<CountrySpecificData>,
112 pub country_specific_data_india: Option<CountrySpecificData>,
113 pub country_specific_data_russia: Option<CountrySpecificData>,
114 pub country_specific_data_philippines: Option<CountrySpecificData>,
115 pub country_specific_data_south_africa: Option<CountrySpecificData>
116}
117
118#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
119#[serde(rename_all="camelCase")]
120pub enum CountrySpecificData {
121 Canada { bank_code: String, transit_number: String },
122 Australia { bsb_code: String },
123 India { ifsc_code: String },
124 Russia { inn: String },
125 Philippines { routing_number: String },
126 SouthAfrica { branch_code: String }
127}
128
129#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
130#[serde(rename_all="camelCase")]
131pub struct TransactionParam<'a> {
132 pub recipient_id: &'a str,
133 pub amount: f32,
134 pub payment_method: TransactionPaymentMethod,
135 pub note: Option<&'a str>,
136 pub external_memo: Option<&'a str>,
137 pub idempotency_key: &'a str
138}
139
140#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
141#[serde(rename_all="lowercase")]
142pub enum TransactionPaymentMethod {
143 ACH
144}
145
146impl Transaction {
147
148 pub async fn list(client: &Client, id: &str) -> crate::Result<List<Self>> {
149 client.get("/account", vec![id, "transactions"], serde_json::Map::new()).await
150 }
151
152 pub async fn retrieve(client: &Client, aid: &str, tid: &str) -> crate::Result<List<Self>> {
153 client.get("/account", vec![aid, "transactions", tid], serde_json::Map::new()).await
154 }
155
156 pub async fn create<B: serde::Serialize>(client: &Client, aid: &str, param: B) -> crate::Result<Self> {
157 client.get("/account", vec![aid, "transactions"], param).await
158 }
159
160}