Skip to main content

highlevel_api/apis/invoices/
types.rs

1use serde::{Deserialize, Serialize};
2
3// ── Invoices ─────────────────────────────────────────────────────────────────
4
5#[derive(Debug, Clone, Serialize, Deserialize, Default)]
6#[serde(rename_all = "camelCase")]
7pub struct ListInvoicesParams {
8    pub location_id: String,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub limit: Option<u32>,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub offset: Option<u32>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub contact_id: Option<String>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub status: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub start_at: Option<String>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub end_at: Option<String>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub payment_mode: Option<String>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct InvoiceItem {
28    pub name: String,
29    pub description: Option<String>,
30    pub price: f64,
31    pub quantity: u32,
32    pub taxes: Option<Vec<serde_json::Value>>,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
36#[serde(rename_all = "camelCase")]
37pub struct Invoice {
38    pub id: String,
39    pub location_id: String,
40    pub contact_id: Option<String>,
41    pub status: Option<String>,
42    pub items: Option<Vec<InvoiceItem>>,
43    pub amount: Option<f64>,
44    pub currency: Option<String>,
45    pub issue_date: Option<String>,
46    pub due_date: Option<String>,
47    pub title: Option<String>,
48    pub invoice_number: Option<String>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct GetInvoicesResponse {
53    pub invoices: Vec<Invoice>,
54    pub total: Option<u64>,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct GetInvoiceResponse {
59    pub invoice: Invoice,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize, Default)]
63#[serde(rename_all = "camelCase")]
64pub struct CreateInvoiceParams {
65    pub location_id: String,
66    pub contact_id: String,
67    pub items: Vec<InvoiceItem>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub title: Option<String>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub issue_date: Option<String>,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub due_date: Option<String>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub currency: Option<String>,
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub discount: Option<serde_json::Value>,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct SendInvoiceParams {
82    pub action: String,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
86#[serde(rename_all = "camelCase")]
87pub struct RecordPaymentParams {
88    pub mode: String,
89    pub notes: Option<String>,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct GenerateInvoiceNumberResponse {
94    #[serde(rename = "invoiceNumber")]
95    pub invoice_number: String,
96}
97
98// ── Invoice Schedules (deposit/balance split) ────────────────────────────────
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101#[serde(rename_all = "camelCase")]
102pub struct InvoiceSchedule {
103    pub id: String,
104    pub invoice_id: String,
105    pub amount: f64,
106    pub due_date: String,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub status: Option<String>,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct ListSchedulesResponse {
113    pub schedules: Vec<InvoiceSchedule>,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct GetScheduleResponse {
118    pub schedule: InvoiceSchedule,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize, Default)]
122#[serde(rename_all = "camelCase")]
123pub struct CreateScheduleParams {
124    pub amount: f64,
125    pub due_date: String,
126}