pinpayments/resources/
transfer.rs

1use time::{OffsetDateTime};
2use serde::{Deserialize, Serialize};
3use crate::ids::{RecipientId, TransferId};
4use crate::params::{Page, unpack_contained, SortDirection};
5use crate::resources::{Currency, BankAccount};
6use crate::{Client, Response};
7use crate::build_map;
8
9#[derive(Clone, Debug, Default, Serialize)]
10pub struct CreateTransfer<'a> {
11    pub amount: i64,
12    pub currency: Currency,
13    pub description: &'a str,
14    pub recipient: RecipientId
15}
16
17#[derive(Clone, Debug, Default, Deserialize)]
18pub struct Transfer {
19    pub token: TransferId,
20    pub status: String,
21    pub currency: Currency,
22    pub description: String,
23    pub amount: i64,
24    pub total_debits: i64,
25    pub total_credits: i64,
26
27    #[serde(with = "time::serde::iso8601::option")]
28    pub created_at: Option<OffsetDateTime>,
29
30    #[serde(with = "time::serde::iso8601::option")]
31    pub paid_at: Option<OffsetDateTime>,
32
33    pub reference: String,
34    pub line_items_count: i32,
35
36    pub bank_account: BankAccount,
37    pub recipient: RecipientId
38}
39
40#[derive(Debug, Serialize)]
41#[serde(rename_all = "snake_case")]
42pub enum SortByField {
43    PaidAt
44}
45
46#[derive(Debug, Serialize, Default)]
47pub struct TransferSearchParams<'a> {
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub query: Option<&'a str>,
50    #[serde(with = "time::serde::iso8601::option", skip_serializing_if = "Option::is_none")]
51    pub start_date: Option<OffsetDateTime>,
52    #[serde(with = "time::serde::iso8601::option", skip_serializing_if = "Option::is_none")]
53    pub end_date: Option<OffsetDateTime>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub sort_by: Option<SortByField>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub direction: Option<SortDirection>,
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub page: Option<u32>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub per_page: Option<u32>
62}
63
64impl Transfer {
65    pub fn create(client: &Client, params: CreateTransfer<'_>) -> Response<Transfer> {
66        unpack_contained(client.post_form(&format!("/transfers"), &params))
67    }
68
69    pub fn list(client: &Client, page: Option<u32>, per_page: Option<u32>) -> Response<Page<Transfer>> {
70        let page = page.map(|s| s.to_string());
71        let per_page = per_page.map(|s| s.to_string());
72        let params = build_map([
73            ("page", page.as_deref()),
74            ("per_page", per_page.as_deref())
75        ]);
76        client.get_query("/transfers", &params)
77    }
78
79    pub fn search(client: &Client, search_params: &TransferSearchParams) -> Response<Page<Transfer>> {
80        client.get_query("/transfers/search", &search_params)
81    }
82
83    pub fn retrieve(client: &Client, token: &TransferId) -> Response<Transfer> {
84        unpack_contained(client.get(&format!("/transfers/{}", token)))
85    }
86}