我写了一个工资单类型的应用程序,该应用程序需要clock_event
并且有一个punch_in
和punch_out
字段。在clock_event
课程中,我有一个方法来接收员工,将他们的总小时数和出口总计为CSV。这给出了员工的总小时数,然后是他们的total_hours的总和,这是在课堂上计算的一种方法。
这是我的代码:
clock_event.rb
def total_hours
self.clock_out.to_i - self.clock_in.to_i
end
def self.to_csv(records = [], options = {})
CSV.generate(options) do |csv|
csv << ["Employee", "Clock-In", "Clock-Out", "Station", "Comment", "Total Shift Hours"]
records.each do |ce|
csv << [ce.user.try(:full_name), ce.formatted_clock_in, ce.formatted_clock_out, ce.station.try(:station_name), ce.comment, TimeFormatter.format_time(ce.total_hours)]
end
records.map(&:user).uniq.each do |user|
csv << ["Total Hours for: #{user.full_name}"]
csv << [TimeFormatter.format_time(records.select{ |r| r.user == user}.sum(&:total_hours))]
end
csv << ["Total Payroll Hours"]
csv << [TimeFormatter.format_time(records.sum(&:total_hours))]
end
end
end
此方法适用并导出CSV,其中包含每天的所有总时间条目,然后是CSV文件底部的小时数。
这是我的问题......
我可以总结没问题,但我需要显示以下内容:
我知道如何总结时间,但不确定如何将超过40小时的时间加入到另一个字段中。
我确信有一种Ruby方法可以做到,但我不确定这是如何工作的。
非常感谢任何帮助。如果您需要更多代码或上下文,请告诉我们。
答案 0 :(得分:0)
首先,你应该让total_hours完全返回它在方法定义中返回的内容,&#34;总小时数&#34;。在此方法中包含您的时间格式,以避免在代码库中散布TimeFormatter逻辑:
def total_hours
TimeFormatter.format_time(self.clock_out.to_i - self.clock_in.to_i)
end
其次,您需要在情境中计算加班时间,如下所示:
def overtime_hours(num_weeks = 1, hours_per_week = 40)
ot = total_hours - (num_weeks * hours_per_week)
ot > 0 ? ot : 0
end
这为您提供了一些自定义功能,这样,如果您的业务规则发生变化,您实际上可以更轻松地维护代码。您的默认值始终为1周40小时,但您可以这样做:
ce.overtime_hours(2, 40)
或:
ce.overtime_hours(2, 39)
有些人只工作了39个小时,因此企业可以避免支付医疗保健费用以及40小时内提供的其他强制性福利。这将使您能够控制超时_hours输出。
在第1周的CSV中:
records.where('user_id is ? and date > ? and date < ?', user.id, begin_week_1, end_week_1).sum(&:overtime_hours)
和第2周:
records.where('user_id is ? and date > ? and date < ?', user.id, begin_week_2, end_week_2).sum(&:overtime_hours)