簡體   English   中英

使用Elixir計算條紋中的按比例分配成本

[英]Calculate Proration Cost in Stripe using Elixir

我正在嘗試使用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替換為客戶的subscription_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個結果,因此我升級了計划,以檢查我的代碼是否返回了正確的費用,但這是不正確的。

我想念什么?

兩行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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM