2016-04-28 7 views
0

をとり、punch_inpunch_outフィールドを持つ給与タイプのアプリを書いた。 clock_eventクラスでは、私は従業員を雇う方法を持っており、合計時間とCSVへのエクスポートを合計します。これは、従業員の合計時間と、その時点で計算されたクラス内のメソッドであるtotal_hoursの合計を提供します。ここでルビーの数字の配列を合計して40時間以上の時間を抽出

は私のコードです:

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時間を過ごすと、1つのフィールドに40時間が表示され、残っている残りの時間をそのすぐ横の残業時間として表示します。

私は時間を合計する方法を知っていますが、40を超える時間をCSVの別のフィールドに追加する方法は不明です。

私は確かにそれを行うためのRubyの方法がありますが、私はこれがどのように機能するかについては確信していません。

ご協力いただければ幸いです。より多くのコードやコンテキストが必要な場合は、私にお知らせください。

答えて

0

最初に、total_hoursは、メソッド定義で返される「合計時間」を正確に返します。アウトあなたのコードベースを通じて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 

これはあなたを与えますビジネスルールが変更された場合でも、コードを少しでも簡単に維持できるようにカスタマイズすることができます。企業は、医療およびその他の必須の支払いを避けることができるように一部の人々は唯一の39時間を仕事

ce.overtime_hours(2, 39) 

ce.overtime_hours(2, 40) 

か:あなたのデフォルトは常にしかし、あなたがこれを行うことがあり、1週間40時間となります40時間でキックインする利点。これにより、あなたはovertime_hoursが出力するものを制御することができます。

records.where('user_id is ? and date > ? and date < ?', user.id, begin_week_1, end_week_1).sum(&:overtime_hours) 

と週2:週1

そして、あなたのCSVで

records.where('user_id is ? and date > ? and date < ?', user.id, begin_week_2, end_week_2).sum(&:overtime_hours) 
+0

私は時間を秒単位で計算されるので、-40がうまくいくと思ういけません。だから私はこのcsvを行った。<< ["Overtime Hours for#{user.full_name}"] csv << [TimeFormatter.format_time(records.select {| r | r.user == user} .sum(&:total_hours ) - 144000)]を計算し、total_hoursの合計から40時間を秒単位で減算します。これは私に正しい番号を与えます。 – nulltek

+0

40時間未満であれば、そこにはマイナスの時間がかかるので注意してください。 –

+0

これは、私が1週間の範囲のタイムカードを実行している場合には機能しますが、給与計算が週40時間として計算されるため、2週間でこの種の計算を行う方法を把握しようとしています。週間。 2週間の間にどのように分割するかについての考えはありますか? – nulltek

関連する問題