defmodule Stripe.Tax.Calculation do
use Stripe.Entity
@moduledoc "A Tax Calculation allows you to calculate the tax to collect from your customer.\n\nRelated guide: [Calculate tax in your custom payment flow](https://stripe.com/docs/tax/custom)"
(
defstruct [
:amount_total,
:currency,
:customer,
:customer_details,
:expires_at,
:id,
:line_items,
:livemode,
:object,
:shipping_cost,
:tax_amount_exclusive,
:tax_amount_inclusive,
:tax_breakdown,
:tax_date
]
@typedoc "The `tax.calculation` type.\n\n * `amount_total` Total after taxes.\n * `currency` Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\n * `customer` The ID of an existing [Customer](https://stripe.com/docs/api/customers/object) used for the resource.\n * `customer_details` \n * `expires_at` Timestamp of date at which the tax calculation will expire.\n * `id` Unique identifier for the calculation.\n * `line_items` The list of items the customer is purchasing.\n * `livemode` Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\n * `object` String representing the object's type. Objects of the same type share the same value.\n * `shipping_cost` The shipping cost details for the calculation.\n * `tax_amount_exclusive` The amount of tax to be collected on top of the line item prices.\n * `tax_amount_inclusive` The amount of tax already included in the line item prices.\n * `tax_breakdown` Breakdown of individual tax amounts that add up to the total.\n * `tax_date` Timestamp of date at which the tax rules and rates in effect applies for the calculation.\n"
@type t :: %__MODULE__{
amount_total: integer,
currency: binary,
customer: binary | nil,
customer_details: term,
expires_at: integer | nil,
id: binary | nil,
line_items: term | nil,
livemode: boolean,
object: binary,
shipping_cost: term | nil,
tax_amount_exclusive: integer,
tax_amount_inclusive: integer,
tax_breakdown: term,
tax_date: integer
}
)
(
@typedoc "The customer's postal address (for example, home or business location)."
@type address :: %{
optional(:city) => binary | binary,
optional(:country) => binary,
optional(:line1) => binary | binary,
optional(:line2) => binary | binary,
optional(:postal_code) => binary | binary,
optional(:state) => binary | binary
}
)
(
@typedoc "Details about the customer, including address and tax IDs."
@type customer_details :: %{
optional(:address) => address,
optional(:address_source) => :billing | :shipping,
optional(:ip_address) => binary,
optional(:tax_ids) => list(tax_ids),
optional(:taxability_override) => :customer_exempt | :none | :reverse_charge
}
)
(
@typedoc nil
@type line_items :: %{
optional(:amount) => integer,
optional(:product) => binary,
optional(:quantity) => integer,
optional(:reference) => binary,
optional(:tax_behavior) => :exclusive | :inclusive,
optional(:tax_code) => binary
}
)
(
@typedoc "Shipping cost details to be used for the calculation."
@type shipping_cost :: %{
optional(:amount) => integer,
optional(:shipping_rate) => binary,
optional(:tax_behavior) => :exclusive | :inclusive,
optional(:tax_code) => binary
}
)
(
@typedoc nil
@type tax_ids :: %{
optional(:type) =>
:ad_nrt
| :ae_trn
| :ar_cuit
| :au_abn
| :au_arn
| :bg_uic
| :bo_tin
| :br_cnpj
| :br_cpf
| :ca_bn
| :ca_gst_hst
| :ca_pst_bc
| :ca_pst_mb
| :ca_pst_sk
| :ca_qst
| :ch_vat
| :cl_tin
| :cn_tin
| :co_nit
| :cr_tin
| :do_rcn
| :ec_ruc
| :eg_tin
| :es_cif
| :eu_oss_vat
| :eu_vat
| :gb_vat
| :ge_vat
| :hk_br
| :hu_tin
| :id_npwp
| :il_vat
| :in_gst
| :is_vat
| :jp_cn
| :jp_rn
| :jp_trn
| :ke_pin
| :kr_brn
| :li_uid
| :mx_rfc
| :my_frp
| :my_itn
| :my_sst
| :no_vat
| :nz_gst
| :pe_ruc
| :ph_tin
| :ro_tin
| :rs_pib
| :ru_inn
| :ru_kpp
| :sa_vat
| :sg_gst
| :sg_uen
| :si_tin
| :sv_nit
| :th_vat
| :tr_tin
| :tw_vat
| :ua_vat
| :us_ein
| :uy_ruc
| :ve_rif
| :vn_tin
| :za_vat,
optional(:value) => binary
}
)
(
nil
@doc "<p>Calculates tax based on input and returns a Tax <code>Calculation</code> object.</p>\n\n#### Details\n\n * Method: `post`\n * Path: `/v1/tax/calculations`\n"
(
@spec create(
params :: %{
optional(:currency) => binary,
optional(:customer) => binary,
optional(:customer_details) => customer_details,
optional(:expand) => list(binary),
optional(:line_items) => list(line_items),
optional(:shipping_cost) => shipping_cost,
optional(:tax_date) => integer
},
opts :: Keyword.t()
) ::
{:ok, Stripe.Tax.Calculation.t()}
| {:error, Stripe.ApiErrors.t()}
| {:error, term()}
def create(params \\ %{}, opts \\ []) do
path = Stripe.OpenApi.Path.replace_path_params("/v1/tax/calculations", [], [])
Stripe.Request.new_request(opts)
|> Stripe.Request.put_endpoint(path)
|> Stripe.Request.put_params(params)
|> Stripe.Request.put_method(:post)
|> Stripe.Request.make_request()
end
)
)
(
nil
@doc "<p>Retrieves the line items of a persisted tax calculation as a collection.</p>\n\n#### Details\n\n * Method: `get`\n * Path: `/v1/tax/calculations/{calculation}/line_items`\n"
(
@spec list_line_items(
calculation :: binary(),
params :: %{
optional(:ending_before) => binary,
optional(:expand) => list(binary),
optional(:limit) => integer,
optional(:starting_after) => binary
},
opts :: Keyword.t()
) ::
{:ok, Stripe.List.t(Stripe.Tax.CalculationLineItem.t())}
| {:error, Stripe.ApiErrors.t()}
| {:error, term()}
def list_line_items(calculation, params \\ %{}, opts \\ []) do
path =
Stripe.OpenApi.Path.replace_path_params(
"/v1/tax/calculations/{calculation}/line_items",
[
%OpenApiGen.Blueprint.Parameter{
in: "path",
name: "calculation",
required: true,
schema: %OpenApiGen.Blueprint.Parameter.Schema{
name: "calculation",
title: nil,
type: "string",
items: [],
properties: [],
any_of: []
}
}
],
[calculation]
)
Stripe.Request.new_request(opts)
|> Stripe.Request.put_endpoint(path)
|> Stripe.Request.put_params(params)
|> Stripe.Request.put_method(:get)
|> Stripe.Request.make_request()
end
)
)
end