在ruby中总结一组数字并提取超过40小时的时间

时间:2016-04-28 15:19:01

标签: ruby-on-rails ruby ruby-on-rails-3 csv

我写了一个工资单类型的应用程序,该应用程序需要clock_event并且有一个punch_inpunch_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文件底部的小时数。

这是我的问题......

我可以总结没问题,但我需要显示以下内容:

  1. 总小时数(已完成)
  2. 超过40小时的任何时间我都需要将该金额提取到CSV文件中的另一个字段。因此,如果员工达到40小时,则会在一个字段中显示40个小时,然后将剩余的我们显示为加班费。
  3. 我知道如何总结时间,但不确定如何将超过40小时的时间加入到另一个字段中。

    我确信有一种Ruby方法可以做到,但我不确定这是如何工作的。

    非常感谢任何帮助。如果您需要更多代码或上下文,请告诉我们。

1 个答案:

答案 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)