wave-api 0.1.0

Typed Rust client for the Wave Accounting GraphQL API
Documentation
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};

/// An invoice.
#[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>,
}

/// A line item on an invoice.
#[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>,
}

/// Tax applied to an invoice line item.
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InvoiceItemTax {
    pub sales_tax: SalesTax,
    pub amount: Option<Money>,
}