ruby 我需要优化和测试我的代码自定义应用程序费用

np8igboo  于 2022-11-22  发布在  Ruby
关注(0)|答案(1)|浏览(103)

我一直致力于添加这个功能的条纹费,它似乎是工作的罚款,但我需要确保由于所涉及的付款的关键性。
这里的目标是只收取候选人处理月,这意味着只有当他们得到了一个月的贡献。例如,如果候选人得到第一个贡献24日2023年11月,该特定付款应收取额外的费用。然而,其余的付款为该月应该是正常的。同样,第一次付款后,2023年12月24日,将收取额外费用。
投稿_表单.rb

puts "starting else block  ----->>#{amount_cents}" 
        applicable_fee = candidate.determine_fee(amount_cents)
        Stripe::Charge.create({
          amount: amount_cents,
          currency: candidate.candidate_country[candidate.country.to_s.to_sym][:currency],
          source: stripe_token,
          application_fee_amount: applicable_fee,
        # application_fee_amount: ((amount_cents * ((candidate.merchant_rate.to_f * 100) + 2.9) / 100) + 25).to_i,
         statement_descriptor_suffix: "#{get_statement_descriptor.to_s.upcase}",
          on_behalf_of: candidate.stripe_gateway_id,
          transfer_data: {
            destination: candidate.stripe_gateway_id,
          },
        }, stripe_version: '2019-12-03',)

candidate.rb

def determine_fee(amount_cents)
    amount = ((amount_cents * ((merchant_rate.to_f * 100) + 2.9) / 100) + 25).to_i
    return amount unless id ==  3954 
    if fee_paid_on["started_date"].nil? || (next_start_date(fee_paid_on["started_date"].to_datetime, true) <= Time.zone.now)
       amount = ((amount_cents * ((merchant_rate.to_f * 100) + 2.9) / 100) + 25 + 799).to_i
      fee_paid_details
    else 
      amount = ((amount_cents * ((merchant_rate.to_f * 100) + 2.9) / 100) + 25).to_i 
      fee_paid_details
    end
    amount
  end 
  
  def next_start_date(start_date, flag = false)
    puts "next start date ----->>#{start_date}"
    return start_date + 1.month if flag 
  
    t = Time.zone.now
    start_date.month != t.month ? Time.zone.parse("#{start_date.day}/#{t.month}/#{t.year}") : start_date + 1.month
  end  
  #only updating start date and setting it as per next month
  def  fee_paid_details 
    started_date =  fee_paid_on["started_date"]
    new_started_date = (next_start_date(started_date.to_datetime) < Time.zone.now ? started_date.to_datetime : next_start_date(started_date.to_datetime)) if started_date
    update_columns(
      fee_paid_on: {
        "started_date" => started_date.nil? ? Time.zone.now : new_started_date,
        "last_paid_on" => Time.zone.now 
      }
    )
  end

我需要两个部门的洞察力:
1.我如何彻底测试这一点?
1.有人能帮我优化代码吗

sulc1iza

sulc1iza1#

一般来说,您的实现看起来是正确的,但是如果您接受多种货币,您可能需要做更多的工作,因为存在汇率和转换费用(Stripe对货币转换收取额外的2%费用)。假设您不需要担心货币问题,并且不了解您的集成,下面是一些注意事项:
我如何彻底测试这一点?
最好的测试方法是将您计算的费用与实际费用进行比较。您可以检查charge.application_fee_amount与Balance Transaction上的费用。您可以将expand传递到Charge创建参数中,以expand创建Charge后Stripe返回的charge.balance_transaction对象:

Stripe::Charge.create({
          amount: amount_cents,
          currency: candidate.candidate_country[candidate.country.to_s.to_sym][:currency],
          source: stripe_token,
          application_fee_amount: applicable_fee,
        # application_fee_amount: ((amount_cents * ((candidate.merchant_rate.to_f * 100) + 2.9) / 100) + 25).to_i,
         statement_descriptor_suffix: "#{get_statement_descriptor.to_s.upcase}",
          on_behalf_of: candidate.stripe_gateway_id,
          transfer_data: {
            destination: candidate.stripe_gateway_id,
          },
          expand: ['balance_transaction'],
        }, 
          stripe_version: '2019-12-03',
        )

上述代码将在创建Charge后返回嵌套的Balance Transaction对象。
有人能帮我优化代码吗
看起来你已经分别写了三次amount的计算,这不符合DRY原则。同样,你只需要一行就可以从determine_fee()函数返回fee_paid_details变量,因为它在ifelse语句中都被返回。我还注意到一件事:您在代码中经常将started_datestring转换为datetime。将其存储为datetime变量并在将其存储到数据库中时仅将其转换为string一次会更有意义。

相关问题