quickbooks_types/models/
invoice.rs1use chrono::NaiveDate;
2use serde::{Deserialize, Serialize};
3use serde_with::skip_serializing_none;
4
5use super::common::{
6 Addr, CustomField, DeliveryInfo, Email, EmailStatus, LinkedTxn, MetaData, NtRef, PrintStatus,
7 TxnTaxDetail,
8};
9#[cfg(feature = "builder")]
10use crate::error::QBTypeError;
11use crate::{
12 LineField, QBCreatable, QBDeletable, QBFullUpdatable, QBItem, QBPDFable, QBSendable,
13 QBSparseUpdateable, QBVoidable,
14};
15
16#[skip_serializing_none]
17#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
18#[serde(rename_all = "PascalCase", default)]
19#[cfg_attr(
20 feature = "builder",
21 derive(Builder),
22 builder(default, build_fn(error = "QBTypeError"), setter(into, strip_option))
23)]
24pub struct Invoice {
31 pub id: Option<String>,
33 pub sync_token: Option<String>,
35 #[serde(skip_serializing)]
37 pub meta_data: Option<MetaData>,
38 pub ship_from_addr: Option<Addr>,
40 pub ship_date: Option<NaiveDate>,
42 pub tracking_num: Option<String>,
44 pub class_ref: Option<NtRef>,
46 pub txn_source: Option<String>,
48 pub deposit_to_account_ref: Option<NtRef>,
50 #[serde(rename = "AllowOnlineACHPayment")]
52 pub allow_online_ach_payment: Option<bool>,
53 pub line: Option<LineField>,
55 pub private_note: Option<String>,
57 pub delivery_info: Option<DeliveryInfo>,
59 pub bill_email_cc: Option<Email>,
61 pub bill_email_bcc: Option<Email>,
63 pub ship_method_reef: Option<NtRef>,
65 pub apply_tax_after_discount: Option<bool>,
67 pub customer_memo: Option<NtRef>,
69 pub customer_ref: Option<NtRef>,
71 pub txn_date: Option<NaiveDate>,
73 pub domain: Option<String>,
75 pub print_status: Option<PrintStatus>,
77 pub sales_term_ref: Option<NtRef>,
79 pub exchange_rate: Option<f64>,
81 pub deposit: Option<f64>,
83 pub allow_online_credit_card_payment: Option<bool>,
85 pub department_ref: Option<NtRef>,
87 pub email_status: Option<EmailStatus>,
89 pub due_date: Option<NaiveDate>,
91 pub home_balance: Option<f64>,
93 pub total_amt: Option<f64>,
95 pub invoice_link: Option<String>,
97 pub recur_data_ref: Option<NtRef>,
99 pub tax_exemption_ref: Option<NtRef>,
101 pub balance: Option<f64>,
103 pub home_total_amt: Option<f64>,
105 pub free_form_address: Option<bool>,
107 #[serde(rename = "sparse")]
109 pub sparse: Option<bool>,
110 pub doc_number: Option<String>,
112 pub txn_tax_detail: Option<TxnTaxDetail>,
114 pub linked_txn: Option<Vec<LinkedTxn>>,
116 pub bill_email: Option<Email>,
118 pub ship_addr: Option<Addr>,
120 pub bill_addr: Option<Addr>,
122 pub custom_field: Option<Vec<CustomField>>,
124}
125
126impl QBCreatable for Invoice {
127 fn can_create(&self) -> bool {
128 self.customer_ref.is_some() && self.line.can_create()
129 }
130}
131
132impl QBDeletable for Invoice {}
133impl QBVoidable for Invoice {}
134
135impl QBFullUpdatable for Invoice {
136 fn can_full_update(&self) -> bool {
137 self.has_read() && self.can_create()
138 }
140}
141
142impl QBSparseUpdateable for Invoice {
143 fn can_sparse_update(&self) -> bool {
144 self.can_full_update() && self.sparse.is_some_and(|x| x)
145 }
146}
147
148impl QBSendable for Invoice {}
149impl QBPDFable for Invoice {}