use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use strum_macros::EnumString;
use uuid::Uuid;
use super::customer::Customer;
use super::usage_threshold::UsageThreshold;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Invoice {
pub lago_id: Option<Uuid>,
pub billing_entity_code: Option<String>,
pub sequential_id: Option<i32>,
pub number: String,
pub purchase_order_number: Option<String>,
pub issuing_date: String,
pub invoice_type: InvoiceType,
pub status: InvoiceStatus,
pub payment_status: InvoicePaymentStatus,
pub currency: String,
pub fees_amount_cents: i64,
pub coupons_amount_cents: i64,
pub credit_notes_amount_cents: i64,
pub sub_total_excluding_taxes_amount_cents: i64,
pub taxes_amount_cents: i64,
pub sub_total_including_taxes_amount_cents: i64,
pub prepaid_credit_amount_cents: i64,
pub progressive_billing_credit_amount_cents: i64,
pub total_amount_cents: i64,
pub version_number: Option<i32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub payment_dispute_lost_at: Option<DateTime<Utc>>,
pub payment_due_date: Option<String>,
pub payment_overdue: Option<bool>,
pub net_payment_term: Option<i32>,
pub self_billed: Option<bool>,
pub file_url: Option<String>,
pub web_url: Option<String>,
pub customer: Option<Customer>,
pub billing_periods: Option<Vec<InvoiceBillingPeriod>>,
pub metadata: Option<Vec<InvoiceMetadata>>,
#[serde(default)]
pub applied_taxes: Vec<InvoiceAppliedTax>,
pub applied_usage_thresholds: Option<Vec<InvoiceAppliedUsageThreshold>>,
pub fees: Option<Vec<Fee>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Fee {
pub lago_id: Uuid,
pub lago_charge_id: Option<Uuid>,
pub lago_invoice_id: Option<Uuid>,
pub lago_subscription_id: Option<Uuid>,
pub lago_customer_id: Option<Uuid>,
pub external_customer_id: Option<String>,
pub external_subscription_id: Option<String>,
pub amount_cents: i64,
pub amount_currency: String,
pub precise_amount: Option<String>,
pub total_amount_cents: i64,
pub total_amount_currency: String,
pub precise_total_amount: Option<String>,
pub taxes_amount_cents: i64,
pub taxes_precise_amount: Option<String>,
pub taxes_rate: f64,
pub units: String,
pub precise_unit_amount: Option<String>,
pub total_aggregated_units: Option<String>,
pub events_count: Option<i64>,
pub payment_status: FeePaymentStatus,
pub pay_in_advance: Option<bool>,
pub invoiceable: Option<bool>,
pub from_date: Option<String>,
pub to_date: Option<String>,
pub created_at: DateTime<Utc>,
pub succeeded_at: Option<DateTime<Utc>>,
pub failed_at: Option<DateTime<Utc>>,
pub refunded_at: Option<DateTime<Utc>>,
pub item: Option<FeeItem>,
}
#[derive(Debug, Clone, Serialize, Deserialize, EnumString, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum FeePaymentStatus {
Pending,
Succeeded,
Failed,
Refunded,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeeItem {
#[serde(rename = "type")]
pub item_type: String,
pub code: String,
pub name: String,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, EnumString, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum FeeType {
Charge,
AddOn,
Subscription,
Credit,
Commitment,
}
#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum InvoiceType {
Subscription,
AddOn,
Credit,
OneOff,
ProgressiveBilling,
}
#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum InvoiceStatus {
Draft,
Finalized,
Voided,
Pending,
Failed,
Deleted,
}
#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum InvoicePaymentStatus {
Pending,
Succeeded,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InvoiceBillingPeriod {
pub lago_subscription_id: Option<Uuid>,
pub external_subscription_id: Option<String>,
pub subscription_from_datetime: DateTime<Utc>,
pub subscription_to_datetime: DateTime<Utc>,
pub charges_from_datetime: DateTime<Utc>,
pub charges_to_datetime: DateTime<Utc>,
pub invoicing_reason: InvoiceInvoicingReason,
pub lago_plan_id: Option<Uuid>,
}
#[derive(Debug, Clone, Serialize, Deserialize, EnumString)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum InvoiceInvoicingReason {
SubscriptionStarting,
SubscriptionPeriodic,
SubscriptionTerminating,
InAdvanceCharge,
InAdvanceChargePeriodic,
ProgressiveBilling,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InvoiceMetadata {
pub lago_id: Uuid,
pub key: String,
pub value: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InvoiceAppliedTax {
pub lago_invoice_id: Uuid,
pub fee_amount_cents: Option<i64>,
pub lago_id: Uuid,
pub lago_tax_id: Option<Uuid>,
pub tax_name: String,
pub tax_code: String,
pub tax_rate: f32,
pub tax_description: Option<String>,
pub amount_cents: i64,
pub amount_currency: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InvoiceAppliedUsageThreshold {
pub lifetime_usage_amount_cents: Option<i64>,
pub created_at: DateTime<Utc>,
pub usage_threshold: UsageThreshold,
}