1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use strum_macros::EnumString;
4use uuid::Uuid;
5
6#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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}