Skip to main content

wave_api/models/
invoice.rs

1use chrono::{DateTime, NaiveDate, Utc};
2use rust_decimal::Decimal;
3use serde::Deserialize;
4
5use super::account::Account;
6use super::common::{Currency, Money};
7use super::customer::Customer;
8use super::product::Product;
9use super::sales_tax::SalesTax;
10use crate::enums::{InvoiceSendMethod, InvoiceStatus};
11
12/// An invoice.
13#[derive(Debug, Clone, Deserialize)]
14#[serde(rename_all = "camelCase")]
15pub struct Invoice {
16    pub id: String,
17    pub created_at: DateTime<Utc>,
18    pub modified_at: DateTime<Utc>,
19    pub pdf_url: String,
20    pub view_url: String,
21    pub status: InvoiceStatus,
22    pub title: String,
23    pub subhead: Option<String>,
24    pub invoice_number: String,
25    pub po_number: Option<String>,
26    pub invoice_date: NaiveDate,
27    pub due_date: NaiveDate,
28    pub amount_due: Money,
29    pub amount_paid: Money,
30    pub tax_total: Money,
31    pub total: Money,
32    pub subtotal: Option<Money>,
33    pub discount_total: Option<Money>,
34    pub currency: Currency,
35    pub exchange_rate: Decimal,
36    pub items: Option<Vec<InvoiceItem>>,
37    pub memo: Option<String>,
38    pub footer: Option<String>,
39    pub disable_credit_card_payments: bool,
40    pub disable_bank_payments: bool,
41    pub disable_amex_payments: Option<bool>,
42    pub item_title: String,
43    pub unit_title: String,
44    pub price_title: String,
45    pub amount_title: String,
46    pub hide_name: bool,
47    pub hide_description: bool,
48    pub hide_unit: bool,
49    pub hide_price: bool,
50    pub hide_amount: bool,
51    pub last_sent_at: Option<DateTime<Utc>>,
52    pub last_sent_via: Option<InvoiceSendMethod>,
53    pub last_viewed_at: Option<DateTime<Utc>>,
54    pub customer: Option<Customer>,
55}
56
57/// A line item on an invoice.
58#[derive(Debug, Clone, Deserialize)]
59#[serde(rename_all = "camelCase")]
60pub struct InvoiceItem {
61    pub product: Product,
62    pub account: Option<Account>,
63    pub description: Option<String>,
64    pub quantity: Decimal,
65    pub unit_price: Decimal,
66    pub subtotal: Money,
67    pub total: Money,
68    pub taxes: Vec<InvoiceItemTax>,
69}
70
71/// Tax applied to an invoice line item.
72#[derive(Debug, Clone, Deserialize)]
73#[serde(rename_all = "camelCase")]
74pub struct InvoiceItemTax {
75    pub sales_tax: SalesTax,
76    pub amount: Option<Money>,
77}