【问题标题】:Calculate Proration Cost in Stripe using Elixir使用 Elixir 在 Stripe 中计算分摊成本
【发布时间】:2018-06-04 16:04:12
【问题描述】:

我正在尝试使用 Elixir 计算 Stripe 中的按比例分配成本。 我正在使用 Stripity_Stripe 库 https://github.com/code-corps/stripity_stripe/tree/2.0-alpha

这就是我所做的。

  1. 获取当前时间为 unix 时间
proration_date = DateTime.to_unix(DateTime.utc_now)
  1. 使用 Stripe.Invoice 获取即将到来的发票
params = %{customer: customer_id,
           subscription: subscription_id,
           subscription_items: [%{plan: plan_id}],
           subscription_proration_date: proration_date}

upcoming_invoice = Invoice.upcoming(params, opts)

我将 customer_id 替换为客户的 id,将 subscription_id 替换为客户的订阅 ID,将 plan_id 替换为新的 plan_id(要进行更改),将 subscription_proration_date 替换为 proration_date

它返回

{:ok,
 %Stripe.Invoice{
   amount_due: 17226,
   application_fee: nil,
   attempt_count: 0,
   attempted: false,
   charge: nil,
   closed: false,
   currency: "usd",
   customer: "cus_CxY2gOrcBX568N",
   date: 1530382817,
   description: nil,
   discount: nil,
   ending_balance: nil,
   forgiven: false,
   id: nil,
   lines: %Stripe.List{
     data: [
       %{
         amount: 5235,
         currency: "usd",
         description: "Remaining time on Gold after 04 Jun 2018",
         discountable: false,
         id: "ii_1CZJOQE0U7CBdOnaJ2JiTU3p",
         invoice_item: "ii_1CZJOQE0U7CBdOnaJ2JiTU3p",
         livemode: false,
         metadata: %{},
         object: "line_item",
         period: %{end: 1530382817, start: 1528121306},
         plan: %Stripe.Plan{
           amount: 6000,
           created: 1527787728,
           currency: "usd",
           id: "plan_CxqGQzrlZKzsyX",
           interval: "month",
           interval_count: 1,
           livemode: false,
           metadata: %{},
           name: "Gold",
           object: "plan",
           statement_descriptor: "Gold",
           trial_period_days: nil
         },
         proration: true,
         quantity: 1,
         subscription: "sub_Cxr5eVusfDmwpD",
         subscription_item: "si_CzHykruREBJmer",
         type: "invoiceitem"
       },
       %{
         amount: -1991,
         currency: "usd",
         description: "Unused time on Bronze after 31 May 2018",
         discountable: false,
         id: "ii_1CXyMGE0U7CBdOna7pMyz65c",
         invoice_item: "ii_1CXyMGE0U7CBdOna7pMyz65c",
         livemode: false,
         metadata: %{},
         object: "line_item",
         period: %{end: 1530382817, start: 1527802256},
         plan: %Stripe.Plan{
           amount: 2000,
           created: 1527789541,
           currency: "usd",
           id: "plan_CxqkbcqfX4hDB8",
           interval: "month",
           interval_count: 1,
           livemode: false,
           metadata: %{},
           name: "Bronze",
           object: "plan",
           statement_descriptor: nil,
           trial_period_days: nil
         },
         proration: true,
         quantity: 1,
         subscription: "sub_Cxr5eVusfDmwpD",
         subscription_item: "si_Cxr5FLLMsPXBhq",
         type: "invoiceitem"
       },
       %{
         amount: 3982,
         currency: "usd",
         description: "Remaining time on Silver after 31 May 2018",
         discountable: false,
         id: "ii_1CXyMGE0U7CBdOnazohKmlP6",
         invoice_item: "ii_1CXyMGE0U7CBdOnazohKmlP6",
         livemode: false,
         metadata: %{},
         object: "line_item",
         period: %{end: 1530382817, start: 1527802256},
         plan: %Stripe.Plan{
           amount: 4000,
           created: 1527787680,
           currency: "usd",
           id: "plan_CxqFiVIY2FqTL3",
           interval: "month",
           interval_count: 1,
           livemode: false,
           metadata: %{},
           name: "Silver",
           object: "plan",
           statement_descriptor: "Silver",
           trial_period_days: nil
         },
         proration: true,
         quantity: 1,
         subscription: "sub_Cxr5eVusfDmwpD",
         subscription_item: "si_Cxr5FLLMsPXBhq",
         type: "invoiceitem"
       },
       %{
         amount: 4000,
         currency: "usd",
         description: nil,
         discountable: true,
         id: "sub_Cxr5eVusfDmwpD",
         livemode: false, 
         metadata: %{},
         object: "line_item",
         period: %{end: 1533061217, start: 1530382817},
         plan: %Stripe.Plan{
           amount: 4000,
           created: 1527787680,
           currency: "usd",
           id: "plan_CxqFiVIY2FqTL3",
           interval: "month",
           interval_count: 1,
           livemode: false,
           metadata: %{},
           name: "Silver",
           object: "plan", 
           statement_descriptor: "Silver",
           trial_period_days: nil
         },
         proration: false,
         quantity: 1,
         subscription: nil,
         subscription_item: "si_Cxr5FLLMsPXBhq",
         type: "subscription"
       },
       %{
         amount: 6000,
         currency: "usd",
         description: nil,
         discountable: true,
         id: "sub_Cxr5eVusfDmwpD",
         livemode: false,
         metadata: %{},
         object: "line_item",
         period: %{end: 1533061217, start: 1530382817},
         plan: %Stripe.Plan{
           amount: 6000,
           created: 1527787728,
           currency: "usd",
           id: "plan_CxqGQzrlZKzsyX",
           interval: "month",
           interval_count: 1,
           livemode: false,
           metadata: %{},
           name: "Gold",
           object: "plan",
           statement_descriptor: "Gold",
           trial_period_days: nil
         },
         proration: false,
         quantity: 1,
         subscription: nil,
         subscription_item: "si_CzHykruREBJmer",
         type: "subscription"
       }
     ],
     has_more: false,
     object: "list",
     total_count: 5,
     url: "/v1/invoices/upcoming/lines?customer=cus_CxY2gOrcBX568N&subscription=sub_Cxr5eVusfDmwpD&subscription_proration_date=1528121306"
   },
   livemode: false, 
   metadata: %{},
   next_payment_attempt: 1530386417,
   object: "invoice",
   paid: false,
   period_end: 1530382817,
   period_start: 1527790817,
   receipt_number: nil,
   starting_balance: 0,
   statement_descriptor: nil,
   subscription: "sub_Cxr5eVusfDmwpD",
   subscription_proration_date: 1528121306,
   subtotal: 17226,
   tax: nil,
   tax_percent: nil,
   total: 17226,
   webhooks_delivered_at: nil
 }}
  1. 所以我做了一个模式匹配来获得这样的数据项(https://stripe.com/docs/billing/subscriptions/prorations)

{:ok, %Stripe.Invoice{lines: %Stripe.List{data: data}}} = 即将到来的发票

  1. 然后我尝试了这个

    数据 |> Enum.find(& &1.period.start == proration_date)

  2. 它返回这个

%{
  amount: 5235,
  currency: "usd",
  description: "Remaining time on Gold after 04 Jun 2018",
  discountable: false,
  id: "ii_1CZJPIE0U7CBdOna36eKJQfg",
  invoice_item: "ii_1CZJPIE0U7CBdOna36eKJQfg",
  livemode: false,
  metadata: %{},
  object: "line_item",
  period: %{end: 1530382817, start: 1528121306},
  plan: %Stripe.Plan{
    amount: 6000,
    created: 1527787728,
    currency: "usd",
    id: "plan_CxqGQzrlZKzsyX",
    interval: "month",
    interval_count: 1,
    livemode: false,
    metadata: %{},
    name: "Gold",
    object: "plan",
    statement_descriptor: "Gold",
    trial_period_days: nil
  },
  proration: true,
  quantity: 1,
  subscription: "sub_Cxr5eVusfDmwpD",
  subscription_item: "si_CzHzbTUPBrfqPA",
  type: "invoiceitem"
}

那我不知道下一步该怎么做。 在使用 python 的条带文档中,这样做。

current_prorations = [ii for ii in invoice.lines.data if ii.period.start == proration_date]
cost = sum([p.amount for p in current_prorations])

但我的代码只返回 1 个结果,我升级了计划以检查我的代码是否返回正确的成本,但它不正确。

我错过了什么?

【问题讨论】:

  • 如果将Enum.find 更改为Enum.filter 会怎样?我认为您想要所有满足该标准的元素?
  • 谢谢,这样会更好,但我的问题是,如何正确计算按比例分配的成本。

标签: elixir stripe-payments


【解决方案1】:

你的两行 Python 代码最直接的翻译是这样的:

current_prorations = for ii <- invoice.lines.data, ii.period.start == proration_date, do: ii
cost = for(p <- current_prorations, do: p.amount) |> Enum.sum()

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2021-06-02
    • 2014-07-04
    • 2020-02-18
    • 2012-12-09
    • 2013-01-23
    相关资源
    最近更新 更多