Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 方法相互依赖_Ruby On Rails_Ruby_Billing - Fatal编程技术网

Ruby on rails 方法相互依赖

Ruby on rails 方法相互依赖,ruby-on-rails,ruby,billing,Ruby On Rails,Ruby,Billing,我正在用Ruby on Rails构建一个复杂的计费系统。我有一个发票模型,它有许多项目和付款。当已付美分大于或等于总美分时,发票被视为已支付 一切都很顺利,直到我增加了对滞纳金的支持。显然,这些费用只应在发票尚未支付时计算。例如,如果发票在2014-01-01到期,在2014-01-05支付,今天是2014-01-24,则费用应仅计算4天 为了实现这一点,我在late_days方法中添加了一个检查,如果paid_cents大于或等于total_cents并且最后一笔付款在发票到期日之前交付,则

我正在用Ruby on Rails构建一个复杂的计费系统。我有一个
发票
模型,它有许多项目和付款。当
已付美分
大于或等于
总美分
时,发票被视为已支付

一切都很顺利,直到我增加了对滞纳金的支持。显然,这些费用只应在发票尚未支付时计算。例如,如果发票在2014-01-01到期,在2014-01-05支付,今天是2014-01-24,则费用应仅计算4天

为了实现这一点,我在
late_days
方法中添加了一个检查,如果
paid_cents
大于或等于
total_cents
并且最后一笔付款在发票到期日之前交付,则返回0

问题是:
总计_美分
是将项目的金额和滞纳金相加计算得出的。反过来,
late\u fee\u cents
方法调用
late\u days
,它依赖于
total\u cents
来检查发票是否已支付

这将导致一个无限循环,在这个循环中,方法将相互调用,直到时间结束(或者有人拔掉插头)

以下是我的模型中的一些代码:

def daily_late_fee_percentage
  return 0 unless late_fee_percentage && late_fee_interval
  late_fee_percentage.to_f / late_fee_interval.to_f
end

def daily_late_fee_cents
  incomplete_total_cents.to_f / 100.0 * daily_late_fee_percentage
end

def late_days
  return 0 unless due_at

  days = Date.today - due_at
  days = 0 if days < 0

  days.to_i
end

def late_fee_cents
  daily_late_fee_cents * late_days
end

def total_cents
  incomplete_total_cents + late_fee_cents
end
def每日\逾期\费用\百分比
返回0,除非滞纳金百分比和滞纳金间隔
滞纳金百分比/滞纳金间隔
结束
def每日\逾期\费用\美分
不完整\u总计\u美分至\u f/100.0*每日\u滞纳金\u百分比
结束
末日
返回0,除非到期日在
天=日期。今天-到期日
如果天数小于0,则天数=0
天到地
结束
def滞纳金
每日晚交费用晚交天数
结束
def总计(美分)
不完整的总额+滞纳金
结束
我觉得我完全错过了一些显而易见的东西


任何帮助都将不胜感激

应如何计算滞纳金?它只是发票初始“总美分”(不包括“滞纳金”)乘以发票逾期天数的一小部分,还是初始总美分加滞纳金乘以发票逾期天数的一小部分

如果前者为真,那么这可能有效:

我们可以这样定义
total\u cents

def total_cents(include_late_fees = true)
    include_late_fees ? incomplete_total_cents + late_fee_cents : incomplete_total_cents
end
def late_days
  return 0 unless due_at
  return 0 if paid_cents >= total_cents(false) && (payments.last.try(:delivered_at) || due_at) <= due_at

  days = Date.today - due_at
  days = 0 if days < 0

  days.to_i
end
晚些时候
像这样:

def total_cents(include_late_fees = true)
    include_late_fees ? incomplete_total_cents + late_fee_cents : incomplete_total_cents
end
def late_days
  return 0 unless due_at
  return 0 if paid_cents >= total_cents(false) && (payments.last.try(:delivered_at) || due_at) <= due_at

  days = Date.today - due_at
  days = 0 if days < 0

  days.to_i
end
def迟到天数
返回0,除非到期日在

如果已支付美分>=总美分(false)&(payments.last.try(:delivered|u at)| due|u at)late_days->total_cents->late_fee_cents->late_days,则返回0。。。infiniteI将考虑将
后期
功能完全提取到另一个方法中。也许会进入每晚运行的rake任务?如果你愿意,我可以写一个答案want@RichPeck:我宁愿动态计算费用,也不愿每晚更改金额。费用是根据原始总金额计算的。但是,当用户已支付原始金额加上累计费用时,发票视为已支付。我在问题中添加了一些代码。