pinpayments/resources/
transfer.rs1use 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"), ¶ms))
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", ¶ms)
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}