wave_api/inputs/
transaction.rs1use chrono::NaiveDate;
2use rust_decimal::Decimal;
3use serde::Serialize;
4
5use crate::enums::{BalanceType, TransactionDirection};
6
7#[derive(Debug, Clone, Serialize)]
9#[serde(rename_all = "camelCase")]
10pub struct MoneyTransactionAnchorInput {
11 pub account_id: String,
12 pub amount: Decimal,
13 pub direction: TransactionDirection,
14}
15
16#[derive(Debug, Clone, Serialize)]
18#[serde(rename_all = "camelCase")]
19pub struct MoneyTransactionLineItemInput {
20 pub account_id: String,
21 pub amount: Decimal,
22 pub balance: BalanceType,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub customer_id: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub description: Option<String>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub taxes: Option<Vec<MoneyTransactionSalesTaxInput>>,
29}
30
31impl MoneyTransactionLineItemInput {
32 pub fn new(
33 account_id: impl Into<String>,
34 amount: Decimal,
35 balance: BalanceType,
36 ) -> Self {
37 Self {
38 account_id: account_id.into(),
39 amount,
40 balance,
41 customer_id: None,
42 description: None,
43 taxes: None,
44 }
45 }
46
47 pub fn description(mut self, v: impl Into<String>) -> Self {
48 self.description = Some(v.into());
49 self
50 }
51 pub fn customer_id(mut self, v: impl Into<String>) -> Self {
52 self.customer_id = Some(v.into());
53 self
54 }
55}
56
57#[derive(Debug, Clone, Serialize)]
59#[serde(rename_all = "camelCase")]
60pub struct MoneyTransactionSalesTaxInput {
61 pub sales_tax_id: String,
62 pub amount: Decimal,
63}
64
65#[derive(Debug, Clone, Serialize)]
67#[serde(rename_all = "camelCase")]
68pub struct MoneyTransactionCreateInput {
69 pub business_id: String,
70 pub external_id: String,
71 pub date: NaiveDate,
72 pub description: String,
73 #[serde(skip_serializing_if = "Option::is_none")]
74 pub notes: Option<String>,
75 pub anchor: MoneyTransactionAnchorInput,
76 pub line_items: Vec<MoneyTransactionLineItemInput>,
77}
78
79impl MoneyTransactionCreateInput {
80 pub fn new(
81 business_id: impl Into<String>,
82 external_id: impl Into<String>,
83 date: NaiveDate,
84 description: impl Into<String>,
85 anchor: MoneyTransactionAnchorInput,
86 line_items: Vec<MoneyTransactionLineItemInput>,
87 ) -> Self {
88 Self {
89 business_id: business_id.into(),
90 external_id: external_id.into(),
91 date,
92 description: description.into(),
93 notes: None,
94 anchor,
95 line_items,
96 }
97 }
98
99 pub fn notes(mut self, v: impl Into<String>) -> Self {
100 self.notes = Some(v.into());
101 self
102 }
103}
104
105#[derive(Debug, Clone, Serialize)]
107#[serde(rename_all = "camelCase")]
108pub struct MoneyTransactionDetails {
109 pub external_id: String,
110 pub date: NaiveDate,
111 pub description: String,
112 #[serde(skip_serializing_if = "Option::is_none")]
113 pub notes: Option<String>,
114 pub anchor: MoneyTransactionAnchorInput,
115 pub line_items: Vec<MoneyTransactionLineItemInput>,
116}
117
118#[derive(Debug, Clone, Serialize)]
120#[serde(rename_all = "camelCase")]
121pub struct MoneyTransactionsCreateInput {
122 pub business_id: String,
123 pub transactions: Vec<MoneyTransactionDetails>,
124}
125
126impl MoneyTransactionsCreateInput {
127 pub fn new(
128 business_id: impl Into<String>,
129 transactions: Vec<MoneyTransactionDetails>,
130 ) -> Self {
131 Self {
132 business_id: business_id.into(),
133 transactions,
134 }
135 }
136}