use chrono::NaiveDate;
use rust_decimal::Decimal;
use serde::Serialize;
use crate::enums::{BalanceType, TransactionDirection};
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MoneyTransactionAnchorInput {
pub account_id: String,
pub amount: Decimal,
pub direction: TransactionDirection,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MoneyTransactionLineItemInput {
pub account_id: String,
pub amount: Decimal,
pub balance: BalanceType,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub taxes: Option<Vec<MoneyTransactionSalesTaxInput>>,
}
impl MoneyTransactionLineItemInput {
pub fn new(
account_id: impl Into<String>,
amount: Decimal,
balance: BalanceType,
) -> Self {
Self {
account_id: account_id.into(),
amount,
balance,
customer_id: None,
description: None,
taxes: None,
}
}
pub fn description(mut self, v: impl Into<String>) -> Self {
self.description = Some(v.into());
self
}
pub fn customer_id(mut self, v: impl Into<String>) -> Self {
self.customer_id = Some(v.into());
self
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MoneyTransactionSalesTaxInput {
pub sales_tax_id: String,
pub amount: Decimal,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MoneyTransactionCreateInput {
pub business_id: String,
pub external_id: String,
pub date: NaiveDate,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
pub anchor: MoneyTransactionAnchorInput,
pub line_items: Vec<MoneyTransactionLineItemInput>,
}
impl MoneyTransactionCreateInput {
pub fn new(
business_id: impl Into<String>,
external_id: impl Into<String>,
date: NaiveDate,
description: impl Into<String>,
anchor: MoneyTransactionAnchorInput,
line_items: Vec<MoneyTransactionLineItemInput>,
) -> Self {
Self {
business_id: business_id.into(),
external_id: external_id.into(),
date,
description: description.into(),
notes: None,
anchor,
line_items,
}
}
pub fn notes(mut self, v: impl Into<String>) -> Self {
self.notes = Some(v.into());
self
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MoneyTransactionDetails {
pub external_id: String,
pub date: NaiveDate,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
pub anchor: MoneyTransactionAnchorInput,
pub line_items: Vec<MoneyTransactionLineItemInput>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MoneyTransactionsCreateInput {
pub business_id: String,
pub transactions: Vec<MoneyTransactionDetails>,
}
impl MoneyTransactionsCreateInput {
pub fn new(
business_id: impl Into<String>,
transactions: Vec<MoneyTransactionDetails>,
) -> Self {
Self {
business_id: business_id.into(),
transactions,
}
}
}