stripe_api 0.5.9

Stripe library for rust
Documentation
use crate::resources::billing::discounts::Discount;
use crate::resources::billing::plans::Plans;
use crate::resources::billing::subscriptions::{Subscription, SubscriptionItems};
use crate::resources::common::currency::Currency;
use crate::resources::common::object::Object;

use crate::resources::common::address::Address;
use crate::resources::common::path::UrlPath;
use crate::resources::core::charges::Charge;
use crate::resources::core::customer::{Customer, CustomerShipping};
use crate::resources::core::paymentintents::PaymentIntent;
use crate::resources::paymentmethods::paymentmethods::PaymentMethods;
use crate::resources::paymentmethods::source::PaymentSource;
use crate::util::{Expandable, List, Period, RangeQuery};
use crate::Client;
use std::collections::HashMap;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct Invoice {
    pub id: String,
    pub object: Object,
    pub account_country: String,
    pub account_name: String,
    pub amount_due: i64,
    pub amount_paid: i64,
    pub amount_remaining: i64,
    pub application_fee_amount: Option<i64>,
    pub attempt_count: i64,
    pub attempted: bool,
    pub auto_advance: bool,
    pub billing: InvoiceBilling,
    pub billing_reason: Option<InvoiceBillingReason>,
    pub charge: Option<Expandable<Charge>>,
    pub created: i64,
    pub currency: Currency,
    pub custom_fields: Option<Vec<CustomFields>>,
    pub customer: Expandable<Customer>,
    pub customer_email: Option<String>,
    pub customer_address: Option<Address>,
    pub customer_name: Option<String>,
    pub customer_phone: Option<String>,
    pub customer_shipping: Option<CustomerShipping>,
    pub default_payment_method: Option<Expandable<PaymentMethods>>,
    pub default_source: Option<Expandable<PaymentSource>>,
    pub description: Option<String>,
    pub discount: Option<Discount>,
    pub due_date: Option<i64>,
    pub ending_balance: Option<i64>,
    pub footer: Option<String>,
    pub hosted_invoice_url: Option<String>,
    pub invoice_pdf: Option<String>,
    pub lines: List<InvoiceLine>,
    pub livemode: bool,
    pub metadata: HashMap<String, String>,
    pub next_payment_attempt: Option<i64>,
    pub number: Option<String>,
    pub paid: bool,
    pub payment_intent: Option<Expandable<PaymentIntent>>,
    pub period_end: i64,
    pub period_start: i64,
    pub post_payment_credit_notes_amount: i64,
    pub pre_payment_credit_notes_amount: i64,
    pub receipt_number: Option<String>,
    pub starting_balance: i64,
    pub statement_descriptor: Option<String>,
    pub status: InvoiceStatus,
    pub status_transition: Option<StatusTransitions>,
    pub subscription: Option<Expandable<Subscription>>,
    pub subscription_proration_date: Option<i64>,
    pub subtotal: i64,
    pub tax: Option<i64>,
    pub tax_percent: Option<i64>,
    pub threshold_reason: Option<ThresholdReason>,
    pub total: i64,
    pub webhooks_delivered_at: Option<i64>,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct CustomFields {
    pub name: String,
    pub value: String,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct ThresholdReason {
    pub amount_gte: i64,
    pub item_reasons: ItemReasons,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct ItemReasons {
    pub line_item_ids: Vec<String>,
    pub usage_gte: i64,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct StatusTransitions {
    pub finalized_at: Option<i64>,
    pub marked_uncollectible_at: Option<i64>,
    pub paid_at: Option<i64>,
    pub voided_at: Option<i64>,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum InvoiceBilling {
    ChargeAutomatically,
    SendInvoice,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum InvoiceBillingReason {
    SubscriptionCycle,
    SubscriptionCreate,
    SubscriptionUpdate,
    Subscription,
    Manual,
    Upcoming,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum InvoiceStatus {
    Draft,
    Open,
    Paid,
    Uncollectible,
    Void,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct InvoiceLine {
    pub id: String,
    pub object: Object,
    pub amount: i64,
    pub currency: Currency,
    pub description: Option<String>,
    pub discountable: bool,
    pub invoice_item: Option<String>,
    pub livemode: bool,
    pub metadata: HashMap<String, String>,
    pub period: Period,
    pub plan: Option<Plans>,
    pub proration: bool,
    pub quantity: Option<i64>,
    pub subscription: Option<String>,
    pub subscription_item: Option<String>,
    #[serde(rename = "type")]
    pub invoiceline_type: InvoiceLineType,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum InvoiceLineType {
    InvoiceItem,
    Subscription,
}

#[derive(Default, Serialize, Debug, PartialEq)]
pub struct InvoiceParam<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub customer: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub application_fee: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub metadata: Option<HashMap<&'a str, &'a str>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tax_percent: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expand: Option<Vec<&'a str>>,
}

#[derive(Default, Serialize, Debug, PartialEq)]
pub struct InvoiceLineParam<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub invoice: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub coupon: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub customer: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ending_before: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub limit: Option<i64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub starting_after: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription_items: Option<SubscriptionItems>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription_prorate: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription_proration_date: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription_tax_percent: Option<f32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription_trial_end: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription_trial_from_plan: Option<&'a str>,
}

#[derive(Default, Serialize, Debug, PartialEq)]
pub struct InvoiceListParams<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub billing: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub customer: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub date: Option<RangeQuery>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub due_date: Option<RangeQuery>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ending_before: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub limit: Option<i64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub starting_after: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expand: Option<Vec<&'a str>>,
}

impl Invoice {
    pub fn create<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<Self> {
        client.post(UrlPath::Invoices, vec![], param)
    }

    pub fn retrieve(client: &Client, invoice: &str) -> crate::Result<Self> {
        client.get(UrlPath::Invoices, vec![invoice], serde_json::Map::new())
    }

    pub fn retrieve_upcoming<B: serde::Serialize>(
        client: &Client,
        param: B,
    ) -> crate::Result<Self> {
        client.get(UrlPath::Invoices, vec!["upcoming"], param)
    }

    pub fn update<B: serde::Serialize>(
        client: &Client,
        invoice_id: &str,
        param: B,
    ) -> crate::Result<Self> {
        client.post(UrlPath::Invoices, vec![invoice_id], param)
    }

    pub fn delete(client: &Client, invoice_id: &str) -> crate::Result<Self> {
        client.delete(UrlPath::Invoices, vec![invoice_id], serde_json::Map::new())
    }

    pub fn finalize<B: serde::Serialize>(
        client: &Client,
        invoice_id: &str,
        param: B,
    ) -> crate::Result<Self> {
        client.post(UrlPath::Invoices, vec![invoice_id, "finalize"], param)
    }

    pub fn pay<B: serde::Serialize>(
        client: &Client,
        invoice_id: &str,
        source: B,
    ) -> crate::Result<Self> {
        client.post(UrlPath::Invoices, vec![invoice_id, "pay"], source)
    }

    pub fn send(client: &Client, invoice_id: &str) -> crate::Result<Self> {
        client.post(
            UrlPath::Invoices,
            vec![invoice_id, "send"],
            serde_json::Map::new(),
        )
    }

    pub fn void(client: &Client, invoice_id: &str) -> crate::Result<Self> {
        client.post(
            UrlPath::Invoices,
            vec![invoice_id, "void"],
            serde_json::Map::new(),
        )
    }

    pub fn uncollectible(client: &Client, invoice_id: &str) -> crate::Result<Self> {
        client.post(
            UrlPath::Invoices,
            vec![invoice_id, "mark_uncollectible"],
            serde_json::Map::new(),
        )
    }

    pub fn list<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<List<Self>> {
        client.get(UrlPath::Invoices, vec![], param)
    }
}

impl InvoiceLine {
    pub fn retrieve_upcoming_lines<B: serde::Serialize>(
        client: &Client,
        param: B,
    ) -> crate::Result<List<Self>> {
        client.get(UrlPath::Invoices, vec!["upcoming", "lines"], param)
    }

    pub fn retrieve_lines<B: serde::Serialize>(
        client: &Client,
        invoice: &str,
        param: B,
    ) -> crate::Result<List<Self>> {
        client.get(UrlPath::Invoices, vec![invoice, "lines"], param)
    }
}