use serde::{Deserialize, Serialize};
use crate::ids::TaxCalculationId;
use crate::params::{List, Object, Timestamp};
use crate::resources::{Currency, TaxCalculationLineItem, TaxProductResourceCustomerDetails};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct TaxCalculation {
pub id: TaxCalculationId,
pub amount_total: i64,
pub currency: Currency,
pub customer: Option<String>,
pub customer_details: TaxProductResourceCustomerDetails,
pub expires_at: Option<Timestamp>,
pub line_items: Option<List<TaxCalculationLineItem>>,
pub livemode: bool,
pub shipping_cost: Option<TaxProductResourceTaxCalculationShippingCost>,
pub tax_amount_exclusive: i64,
pub tax_amount_inclusive: i64,
pub tax_breakdown: Vec<TaxProductResourceTaxBreakdown>,
pub tax_date: Timestamp,
}
impl Object for TaxCalculation {
type Id = TaxCalculationId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"tax.calculation"
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct TaxProductResourceTaxBreakdown {
pub amount: i64,
pub inclusive: bool,
pub tax_rate_details: TaxProductResourceTaxRateDetails,
pub taxability_reason: TaxProductResourceTaxBreakdownTaxabilityReason,
pub taxable_amount: i64,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct TaxProductResourceTaxCalculationShippingCost {
pub amount: i64,
pub amount_tax: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub shipping_rate: Option<String>,
pub tax_behavior: TaxProductResourceTaxCalculationShippingCostTaxBehavior,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_breakdown: Option<Vec<TaxProductResourceLineItemTaxBreakdown>>,
pub tax_code: String,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct TaxProductResourceLineItemTaxBreakdown {
pub amount: i64,
pub jurisdiction: TaxProductResourceJurisdiction,
pub sourcing: TaxProductResourceLineItemTaxBreakdownSourcing,
pub tax_rate_details: Option<TaxProductResourceLineItemTaxRateDetails>,
pub taxability_reason: TaxProductResourceLineItemTaxBreakdownTaxabilityReason,
pub taxable_amount: i64,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct TaxProductResourceJurisdiction {
pub country: String,
pub display_name: String,
pub level: TaxProductResourceJurisdictionLevel,
pub state: Option<String>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct TaxProductResourceLineItemTaxRateDetails {
pub display_name: String,
pub percentage_decimal: String,
pub tax_type: TaxProductResourceLineItemTaxRateDetailsTaxType,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct TaxProductResourceTaxRateDetails {
pub country: Option<String>,
pub percentage_decimal: String,
pub state: Option<String>,
pub tax_type: Option<TaxProductResourceTaxRateDetailsTaxType>,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TaxProductResourceJurisdictionLevel {
City,
Country,
County,
District,
State,
}
impl TaxProductResourceJurisdictionLevel {
pub fn as_str(self) -> &'static str {
match self {
TaxProductResourceJurisdictionLevel::City => "city",
TaxProductResourceJurisdictionLevel::Country => "country",
TaxProductResourceJurisdictionLevel::County => "county",
TaxProductResourceJurisdictionLevel::District => "district",
TaxProductResourceJurisdictionLevel::State => "state",
}
}
}
impl AsRef<str> for TaxProductResourceJurisdictionLevel {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for TaxProductResourceJurisdictionLevel {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for TaxProductResourceJurisdictionLevel {
fn default() -> Self {
Self::City
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TaxProductResourceLineItemTaxBreakdownSourcing {
Destination,
Origin,
}
impl TaxProductResourceLineItemTaxBreakdownSourcing {
pub fn as_str(self) -> &'static str {
match self {
TaxProductResourceLineItemTaxBreakdownSourcing::Destination => "destination",
TaxProductResourceLineItemTaxBreakdownSourcing::Origin => "origin",
}
}
}
impl AsRef<str> for TaxProductResourceLineItemTaxBreakdownSourcing {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for TaxProductResourceLineItemTaxBreakdownSourcing {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for TaxProductResourceLineItemTaxBreakdownSourcing {
fn default() -> Self {
Self::Destination
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TaxProductResourceLineItemTaxBreakdownTaxabilityReason {
CustomerExempt,
NotCollecting,
NotSubjectToTax,
NotSupported,
PortionProductExempt,
PortionReducedRated,
PortionStandardRated,
ProductExempt,
ProductExemptHoliday,
ProportionallyRated,
ReducedRated,
ReverseCharge,
StandardRated,
TaxableBasisReduced,
ZeroRated,
}
impl TaxProductResourceLineItemTaxBreakdownTaxabilityReason {
pub fn as_str(self) -> &'static str {
match self {
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::CustomerExempt => {
"customer_exempt"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::NotCollecting => {
"not_collecting"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::NotSubjectToTax => {
"not_subject_to_tax"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::NotSupported => "not_supported",
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::PortionProductExempt => {
"portion_product_exempt"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::PortionReducedRated => {
"portion_reduced_rated"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::PortionStandardRated => {
"portion_standard_rated"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::ProductExempt => {
"product_exempt"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::ProductExemptHoliday => {
"product_exempt_holiday"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::ProportionallyRated => {
"proportionally_rated"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::ReducedRated => "reduced_rated",
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::ReverseCharge => {
"reverse_charge"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::StandardRated => {
"standard_rated"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::TaxableBasisReduced => {
"taxable_basis_reduced"
}
TaxProductResourceLineItemTaxBreakdownTaxabilityReason::ZeroRated => "zero_rated",
}
}
}
impl AsRef<str> for TaxProductResourceLineItemTaxBreakdownTaxabilityReason {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for TaxProductResourceLineItemTaxBreakdownTaxabilityReason {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for TaxProductResourceLineItemTaxBreakdownTaxabilityReason {
fn default() -> Self {
Self::CustomerExempt
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TaxProductResourceLineItemTaxRateDetailsTaxType {
AmusementTax,
CommunicationsTax,
Gst,
Hst,
Igst,
Jct,
LeaseTax,
Pst,
Qst,
Rst,
SalesTax,
Vat,
}
impl TaxProductResourceLineItemTaxRateDetailsTaxType {
pub fn as_str(self) -> &'static str {
match self {
TaxProductResourceLineItemTaxRateDetailsTaxType::AmusementTax => "amusement_tax",
TaxProductResourceLineItemTaxRateDetailsTaxType::CommunicationsTax => {
"communications_tax"
}
TaxProductResourceLineItemTaxRateDetailsTaxType::Gst => "gst",
TaxProductResourceLineItemTaxRateDetailsTaxType::Hst => "hst",
TaxProductResourceLineItemTaxRateDetailsTaxType::Igst => "igst",
TaxProductResourceLineItemTaxRateDetailsTaxType::Jct => "jct",
TaxProductResourceLineItemTaxRateDetailsTaxType::LeaseTax => "lease_tax",
TaxProductResourceLineItemTaxRateDetailsTaxType::Pst => "pst",
TaxProductResourceLineItemTaxRateDetailsTaxType::Qst => "qst",
TaxProductResourceLineItemTaxRateDetailsTaxType::Rst => "rst",
TaxProductResourceLineItemTaxRateDetailsTaxType::SalesTax => "sales_tax",
TaxProductResourceLineItemTaxRateDetailsTaxType::Vat => "vat",
}
}
}
impl AsRef<str> for TaxProductResourceLineItemTaxRateDetailsTaxType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for TaxProductResourceLineItemTaxRateDetailsTaxType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for TaxProductResourceLineItemTaxRateDetailsTaxType {
fn default() -> Self {
Self::AmusementTax
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TaxProductResourceTaxBreakdownTaxabilityReason {
CustomerExempt,
NotCollecting,
NotSubjectToTax,
NotSupported,
PortionProductExempt,
PortionReducedRated,
PortionStandardRated,
ProductExempt,
ProductExemptHoliday,
ProportionallyRated,
ReducedRated,
ReverseCharge,
StandardRated,
TaxableBasisReduced,
ZeroRated,
}
impl TaxProductResourceTaxBreakdownTaxabilityReason {
pub fn as_str(self) -> &'static str {
match self {
TaxProductResourceTaxBreakdownTaxabilityReason::CustomerExempt => "customer_exempt",
TaxProductResourceTaxBreakdownTaxabilityReason::NotCollecting => "not_collecting",
TaxProductResourceTaxBreakdownTaxabilityReason::NotSubjectToTax => "not_subject_to_tax",
TaxProductResourceTaxBreakdownTaxabilityReason::NotSupported => "not_supported",
TaxProductResourceTaxBreakdownTaxabilityReason::PortionProductExempt => {
"portion_product_exempt"
}
TaxProductResourceTaxBreakdownTaxabilityReason::PortionReducedRated => {
"portion_reduced_rated"
}
TaxProductResourceTaxBreakdownTaxabilityReason::PortionStandardRated => {
"portion_standard_rated"
}
TaxProductResourceTaxBreakdownTaxabilityReason::ProductExempt => "product_exempt",
TaxProductResourceTaxBreakdownTaxabilityReason::ProductExemptHoliday => {
"product_exempt_holiday"
}
TaxProductResourceTaxBreakdownTaxabilityReason::ProportionallyRated => {
"proportionally_rated"
}
TaxProductResourceTaxBreakdownTaxabilityReason::ReducedRated => "reduced_rated",
TaxProductResourceTaxBreakdownTaxabilityReason::ReverseCharge => "reverse_charge",
TaxProductResourceTaxBreakdownTaxabilityReason::StandardRated => "standard_rated",
TaxProductResourceTaxBreakdownTaxabilityReason::TaxableBasisReduced => {
"taxable_basis_reduced"
}
TaxProductResourceTaxBreakdownTaxabilityReason::ZeroRated => "zero_rated",
}
}
}
impl AsRef<str> for TaxProductResourceTaxBreakdownTaxabilityReason {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for TaxProductResourceTaxBreakdownTaxabilityReason {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for TaxProductResourceTaxBreakdownTaxabilityReason {
fn default() -> Self {
Self::CustomerExempt
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TaxProductResourceTaxCalculationShippingCostTaxBehavior {
Exclusive,
Inclusive,
}
impl TaxProductResourceTaxCalculationShippingCostTaxBehavior {
pub fn as_str(self) -> &'static str {
match self {
TaxProductResourceTaxCalculationShippingCostTaxBehavior::Exclusive => "exclusive",
TaxProductResourceTaxCalculationShippingCostTaxBehavior::Inclusive => "inclusive",
}
}
}
impl AsRef<str> for TaxProductResourceTaxCalculationShippingCostTaxBehavior {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for TaxProductResourceTaxCalculationShippingCostTaxBehavior {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for TaxProductResourceTaxCalculationShippingCostTaxBehavior {
fn default() -> Self {
Self::Exclusive
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TaxProductResourceTaxRateDetailsTaxType {
AmusementTax,
CommunicationsTax,
Gst,
Hst,
Igst,
Jct,
LeaseTax,
Pst,
Qst,
Rst,
SalesTax,
Vat,
}
impl TaxProductResourceTaxRateDetailsTaxType {
pub fn as_str(self) -> &'static str {
match self {
TaxProductResourceTaxRateDetailsTaxType::AmusementTax => "amusement_tax",
TaxProductResourceTaxRateDetailsTaxType::CommunicationsTax => "communications_tax",
TaxProductResourceTaxRateDetailsTaxType::Gst => "gst",
TaxProductResourceTaxRateDetailsTaxType::Hst => "hst",
TaxProductResourceTaxRateDetailsTaxType::Igst => "igst",
TaxProductResourceTaxRateDetailsTaxType::Jct => "jct",
TaxProductResourceTaxRateDetailsTaxType::LeaseTax => "lease_tax",
TaxProductResourceTaxRateDetailsTaxType::Pst => "pst",
TaxProductResourceTaxRateDetailsTaxType::Qst => "qst",
TaxProductResourceTaxRateDetailsTaxType::Rst => "rst",
TaxProductResourceTaxRateDetailsTaxType::SalesTax => "sales_tax",
TaxProductResourceTaxRateDetailsTaxType::Vat => "vat",
}
}
}
impl AsRef<str> for TaxProductResourceTaxRateDetailsTaxType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for TaxProductResourceTaxRateDetailsTaxType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for TaxProductResourceTaxRateDetailsTaxType {
fn default() -> Self {
Self::AmusementTax
}
}