我一直致力于添加这个功能的条纹费,它似乎是工作的罚款,但我需要确保由于所涉及的付款的关键性。
这里的目标是只收取候选人处理月,这意味着只有当他们得到了一个月的贡献。例如,如果候选人得到第一个贡献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.有人能帮我优化代码吗
1条答案
按热度按时间sulc1iza1#
一般来说,您的实现看起来是正确的,但是如果您接受多种货币,您可能需要做更多的工作,因为存在汇率和转换费用(Stripe对货币转换收取额外的2%费用)。假设您不需要担心货币问题,并且不了解您的集成,下面是一些注意事项:
我如何彻底测试这一点?
最好的测试方法是将您计算的费用与实际费用进行比较。您可以检查
charge.application_fee_amount
与Balance Transaction上的费用。您可以将expand
传递到Charge创建参数中,以expand创建Charge后Stripe返回的charge.balance_transaction
对象:上述代码将在创建Charge后返回嵌套的Balance Transaction对象。
有人能帮我优化代码吗
看起来你已经分别写了三次
amount
的计算,这不符合DRY原则。同样,你只需要一行就可以从determine_fee()
函数返回fee_paid_details
变量,因为它在if
和else
语句中都被返回。我还注意到一件事:您在代码中经常将started_date
从string
转换为datetime
。将其存储为datetime
变量并在将其存储到数据库中时仅将其转换为string
一次会更有意义。