1use chrono::NaiveDate;
2use serde::{Deserialize, Serialize};
3use serde_with::skip_serializing_none;
4
5#[cfg(feature = "builder")]
6use crate::error::QBTypeError;
7use crate::{
8 common::{Email, MetaData, NtRef},
9 QBFullUpdatable, QBItem,
10};
11
12#[skip_serializing_none]
13#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
14#[serde(rename_all = "PascalCase", default)]
15#[cfg_attr(
16 feature = "builder",
17 derive(Builder),
18 builder(default, build_fn(error = "QBTypeError"), setter(into, strip_option))
19)]
20pub struct Preferences {
34 pub id: Option<String>,
36 pub sync_token: Option<String>,
38 #[serde(skip_serializing)]
40 pub meta_data: Option<MetaData>,
41 pub email_message_prefs: Option<EmailMessagePrefs>,
43 pub product_and_services_prefs: Option<ProductAndServicesPrefs>,
45 pub report_prefs: Option<ReportPrefs>,
47 pub accounting_info_prefs: Option<AccountingInfoPrefs>,
49 pub sales_forms_prefs: Option<SalesFormsPrefs>,
51 pub vendor_and_purchases_prefs: Option<VendorAndPurchasesPrefs>,
53 pub tax_prefs: Option<TaxPrefs>,
55 pub other_prefs: Option<OtherPrefs>,
57 pub time_tracking_prefs: Option<TimeTrackingPrefs>,
59 pub currency_prefs: Option<CurrencyPrefs>,
61}
62
63#[skip_serializing_none]
65#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
66#[serde(rename_all = "PascalCase", default)]
67pub struct EmailMessagePrefs {
68 pub invoice_message: Option<EmailMessageType>,
69 pub estimate_message: Option<EmailMessageType>,
70 pub sales_receipt_message: Option<EmailMessageType>,
71 pub statement_message: Option<EmailMessageType>,
72}
73
74#[skip_serializing_none]
76#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
77#[serde(rename_all = "PascalCase", default)]
78pub struct EmailMessageType {
79 pub message: Option<String>,
80 pub subject: Option<String>,
81}
82
83#[skip_serializing_none]
85#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
86#[serde(rename_all = "PascalCase", default)]
87pub struct ProductAndServicesPrefs {
88 pub revenue_recognition_enabled: Option<bool>,
89 pub recognition_frequency_type: Option<String>,
90 pub for_sales: Option<bool>,
91 pub quantity_on_hand: Option<bool>,
92 pub quantity_with_price_and_rate: Option<bool>,
93 pub for_purchase: Option<bool>,
94}
95
96#[skip_serializing_none]
98#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
99#[serde(rename_all = "PascalCase", default)]
100pub struct ReportPrefs {
101 pub report_basis: Option<String>,
102 pub calc_aging_report_from_txn_date: Option<bool>,
103}
104
105#[skip_serializing_none]
107#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
108#[serde(rename_all = "PascalCase", default)]
109pub struct AccountingInfoPrefs {
110 pub first_month_of_fiscal_year: Option<String>,
111 pub use_account_numbers: Option<bool>,
112 pub tax_year_month: Option<String>,
113 pub class_tracking_per_txn: Option<bool>,
114 pub track_departments: Option<bool>,
115 pub tax_form: Option<String>,
116 pub customer_terminology: Option<String>,
117 pub book_close_date: Option<NaiveDate>,
118 pub department_terminology: Option<String>,
119 pub class_tracking_per_txn_line: Option<bool>,
120}
121
122#[skip_serializing_none]
123#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
124#[serde(rename_all = "PascalCase", default)]
125pub struct SalesFormsPrefs {
129 pub sales_emaill_bcc: Option<Email>,
131 pub sales_email_cc: Option<Email>,
133 pub using_progress_invoicing: Option<bool>,
135 pub custom_field: Option<String>, pub allow_service_date: Option<bool>,
139 pub estimate_message: Option<String>,
141 pub email_copy_to_company: Option<bool>,
143 pub default_customer_message: Option<String>,
145 pub allow_shipping: Option<bool>,
147 pub default_discount_account: Option<bool>,
149 #[serde(rename = "IPNSupportEnabled")]
151 pub ipn_support_enabled: Option<bool>,
152 pub e_transaction_payment_enabled: Option<bool>,
154 pub default_terms: Option<NtRef>,
156 pub allow_deposit: Option<bool>,
158 pub using_price_levels: Option<bool>,
160 pub default_shipping_account: Option<bool>,
162 #[serde(rename = "ETransactionAttachPDF")]
164 pub e_transaction_attach_pdf: Option<bool>,
165 pub custom_txn_numbers: Option<bool>,
167 pub e_transaction_enabled_status: Option<String>,
169 pub allow_estimates: Option<bool>,
171 pub allow_discount: Option<bool>,
173 pub auto_apply_credit: Option<bool>,
175}
176
177#[skip_serializing_none]
178#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
179#[serde(rename_all = "PascalCase", default)]
180pub struct VendorAndPurchasesPrefs {
184 #[serde(rename = "POCustomField")]
186 pub po_custom_field: Option<String>, pub default_markup_account: Option<NtRef>,
189 pub tracking_by_customer: Option<bool>,
191 pub default_terms: Option<NtRef>,
193 pub billable_expense_tracking: Option<bool>,
195 pub default_markup: Option<f64>,
197 #[serde(rename = "TPAREnabled")]
199 pub tpar_enabled: Option<bool>,
200}
201
202#[skip_serializing_none]
204#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
205#[serde(rename_all = "PascalCase", default)]
206pub struct TaxPrefs {
207 pub partner_tax_enabled: Option<bool>,
208 pub tax_group_code_ref: Option<String>,
209 pub using_sales_tax: Option<bool>,
210}
211
212#[skip_serializing_none]
214#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
215#[serde(rename_all = "PascalCase", default)]
216pub struct OtherPrefs {
217 pub name_value: Option<Vec<NtRef>>,
218}
219
220#[skip_serializing_none]
221#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
222#[serde(rename_all = "PascalCase", default)]
223pub struct TimeTrackingPrefs {
227 pub work_week_start_date: Option<String>,
229 pub mark_time_entries_billable: Option<bool>,
231 pub show_bill_rate_to_all: Option<bool>,
233 pub using_sales_tax: Option<bool>,
235 pub bill_customers: Option<bool>,
237}
238
239#[skip_serializing_none]
243#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, Default)]
244#[serde(rename_all = "PascalCase", default)]
245pub struct CurrencyPrefs {
246 pub home_currency: Option<NtRef>,
247 pub multi_currency_enabled: Option<bool>,
248}
249
250impl QBFullUpdatable for Preferences {
251 fn can_full_update(&self) -> bool {
252 self.has_read()
253 }
254}