Skip to main content

wave_api/inputs/
transaction.rs

1use chrono::NaiveDate;
2use rust_decimal::Decimal;
3use serde::Serialize;
4
5use crate::enums::{BalanceType, TransactionDirection};
6
7/// Anchor account input for a money transaction.
8#[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/// Line item input for a money transaction.
17#[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/// Sales tax input for a money transaction line item.
58#[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/// Input for creating a single money transaction.
66#[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/// Transaction details for bulk creation.
106#[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/// Input for bulk creating money transactions.
119#[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}