mercury_rust/resources/
transactions.rs

1use chrono::{DateTime, Utc};
2use crate::resources::{Address, List};
3use crate::client::Client;
4// use serde::{Serialize, Deserialize};
5
6#[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}