lago_types/models/
customer.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use strum_macros::EnumString;
4use uuid::Uuid;
5
6/// Represents a customer in the Lago billing system.
7///
8/// This struct contains all the information about a customer, including
9/// their identification, contact details, billing configuration, and
10/// associated metadata.
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct Customer {
13    pub lago_id: Option<Uuid>,
14    pub sequential_id: Option<i32>,
15    pub slug: Option<String>,
16    pub external_id: Option<String>,
17    pub applicable_timezone: String,
18    pub created_at: DateTime<Utc>,
19    pub billing_entity_code: String,
20    pub address_line1: Option<String>,
21    pub address_line2: Option<String>,
22    pub city: Option<String>,
23    pub country: Option<String>,
24    pub currency: Option<String>,
25    pub email: Option<String>,
26    pub legal_name: Option<String>,
27    pub legal_number: Option<String>,
28    pub logo_url: Option<String>,
29    pub name: Option<String>,
30    pub firstname: Option<String>,
31    pub lastname: Option<String>,
32    pub account_type: CustomerAccountType,
33    pub customer_type: Option<CustomerType>,
34    pub phone: Option<String>,
35    pub state: Option<String>,
36    pub tax_identification_number: Option<String>,
37    pub timezone: Option<String>,
38    pub url: Option<String>,
39    pub zipcode: Option<String>,
40    pub net_payment_term: Option<i32>,
41    pub updated_at: DateTime<Utc>,
42    pub finalize_zero_amount_invoice: CustomerFinalizeZeroAmountInvoice,
43    pub skip_invoice_custom_sections: bool,
44    pub billing_configuration: CustomerBillingConfiguration,
45    pub shipping_address: CustomerShippingAddress,
46    pub metadata: Vec<CustomerMetadata>,
47    pub integration_customers: Vec<CustomerIntegration>,
48}
49
50/// Defines the type of customer account.
51#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
52#[serde(rename_all = "snake_case")]
53#[strum(serialize_all = "snake_case")]
54pub enum CustomerAccountType {
55    Customer,
56    Partner,
57}
58
59/// Defines the type of customer entity.
60#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
61#[serde(rename_all = "snake_case")]
62#[strum(serialize_all = "snake_case")]
63pub enum CustomerType {
64    Company,
65    Individual,
66}
67
68/// Configuration for handling zero-amount invoices.
69#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
70#[serde(rename_all = "snake_case")]
71#[strum(serialize_all = "snake_case")]
72pub enum CustomerFinalizeZeroAmountInvoice {
73    Inherit,
74    Finalize,
75    Skip,
76}
77
78/// Billing configuration settings for a customer.
79#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct CustomerBillingConfiguration {
81    pub invoice_grace_period: Option<i32>,
82    pub payment_provider: Option<CustomerPaymentProvider>,
83    pub payment_provider_code: Option<String>,
84    pub provider_customer_id: Option<String>,
85    pub sync: Option<bool>,
86    pub sync_with_provider: Option<bool>,
87    pub document_locale: Option<String>,
88    pub provider_payment_methods: Option<Vec<String>>,
89}
90
91/// Supported payment providers.
92#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
93#[serde(rename_all = "snake_case")]
94#[strum(serialize_all = "snake_case")]
95pub enum CustomerPaymentProvider {
96    Stripe,
97    Adyen,
98    Gocardless,
99}
100
101/// Shipping address information for a customer.
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct CustomerShippingAddress {
104    pub address_line1: Option<String>,
105    pub address_line2: Option<String>,
106    pub city: Option<String>,
107    pub country: Option<String>,
108    pub state: Option<String>,
109    pub zipcode: Option<String>,
110}
111
112/// Custom metadata associated with a customer.
113#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct CustomerMetadata {
115    pub lago_id: Uuid,
116    pub key: String,
117    pub value: String,
118    pub display_in_invoice: bool,
119    pub created_at: DateTime<Utc>,
120}
121
122/// Integration configuration for connecting with third-party systems.
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct CustomerIntegration {
125    pub lago_id: Uuid,
126    #[serde(alias = "type")]
127    pub integration_type: CustomerIntegrationType,
128    pub integration_code: Option<String>,
129    pub external_customer_id: Option<String>,
130    pub sync_with_provider: bool,
131    pub subsidiary_id: Option<String>,
132}
133
134/// Supported integration types.
135#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
136#[serde(rename_all = "snake_case")]
137#[strum(serialize_all = "snake_case")]
138pub enum CustomerIntegrationType {
139    Netsuite,
140    Anrok,
141}