use chrono::{DateTime, NaiveDate, Utc};
use rust_decimal::Decimal;
use serde::Deserialize;
use super::account::Account;
use super::common::{Currency, Money};
use super::customer::Customer;
use super::product::Product;
use super::sales_tax::SalesTax;
use crate::enums::{InvoiceSendMethod, InvoiceStatus};
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Invoice {
pub id: String,
pub created_at: DateTime<Utc>,
pub modified_at: DateTime<Utc>,
pub pdf_url: String,
pub view_url: String,
pub status: InvoiceStatus,
pub title: String,
pub subhead: Option<String>,
pub invoice_number: String,
pub po_number: Option<String>,
pub invoice_date: NaiveDate,
pub due_date: NaiveDate,
pub amount_due: Money,
pub amount_paid: Money,
pub tax_total: Money,
pub total: Money,
pub subtotal: Option<Money>,
pub discount_total: Option<Money>,
pub currency: Currency,
pub exchange_rate: Decimal,
pub items: Option<Vec<InvoiceItem>>,
pub memo: Option<String>,
pub footer: Option<String>,
pub disable_credit_card_payments: bool,
pub disable_bank_payments: bool,
pub disable_amex_payments: Option<bool>,
pub item_title: String,
pub unit_title: String,
pub price_title: String,
pub amount_title: String,
pub hide_name: bool,
pub hide_description: bool,
pub hide_unit: bool,
pub hide_price: bool,
pub hide_amount: bool,
pub last_sent_at: Option<DateTime<Utc>>,
pub last_sent_via: Option<InvoiceSendMethod>,
pub last_viewed_at: Option<DateTime<Utc>>,
pub customer: Option<Customer>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InvoiceItem {
pub product: Product,
pub account: Option<Account>,
pub description: Option<String>,
pub quantity: Decimal,
pub unit_price: Decimal,
pub subtotal: Money,
pub total: Money,
pub taxes: Vec<InvoiceItemTax>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InvoiceItemTax {
pub sales_tax: SalesTax,
pub amount: Option<Money>,
}