Rails - 计算每天多个记录的小时数

时间:2016-03-05 09:57:44

标签: ruby-on-rails ruby-on-rails-4

我在一周的每个工作日都提交了时间记录。我需要计算某一天的加班时间。如果@ timesheet.sheet小时数大于8,则找到金额> 8并添加到@ timesheet.overtime变量。

我的问题是有些人在一天内提交2张。例如7:30至11:30工作1和12至6:30工作2。
这就是我想要实现的目标:

这个失败的原因我无法使用它来比较它:date.strftime(“%A”)并且不确定如何找到差异并且仅将该数额相加...

     days = 7.times
      days.each do |day|
        today = Date::DAYNAMES[day]
        @dailysheets = @timesheet.sheets.where(:date.strftime("%A") == today)
        @overtime =+ @dailysheets.sum(:hours)

      end  

在下面的文字中说明了我想要实现的目标

foreach day of the week do 
       put @timesheet.sheets that match dayofweek into a day variable then
         Add the @sheet.hours fields together
         If combined records > 8 then
         add the difference to a overtime variable.
     end


这是代码:

class Sheet < ActiveRecord::Base
  has_many :worknotes, dependent: :destroy
end  

class Timesheet < ActiveRecord::Base
  has_many :timesheet_rows, dependent: :destroy
  has_many :sheets, through: :timesheet_rows
end

Sheet db模型看起来像这样

 t.string   "jobNumber"
t.string   "stage"
t.date     "date"
t.decimal  "hours"
t.time     "start",      default: '2000-01-01 07:00:00'
t.time     "finish",     default: '2000-01-01 15:30:00'
t.boolean  "breakTaken", default: true
t.boolean  "overTime",   default: false
t.integer  "job_id"
t.datetime "created_at",                                 null: false
t.datetime "updated_at",                                 null: false
t.integer  "user_id"
t.boolean  "active",     default: true
t.integer  "account_id"

2 个答案:

答案 0 :(得分:1)

发送多少次表格并不重要。您有一个单独的表,其中有一个user_id外键链接到Users表。

然后发送的每个输入都将存储在他们的user_id下,如下所示:

TIME_SHEETS TABLE

id     user_id     time_in   time_out

1      34           08:00      12:00

2      74           09:00      23:00

3      34           14:00      18:00

然后它是一个简单的数组迭代来获得所有

elapsed_seconds = ((time_out - time_in) * 24 * 60 * 60).to_i

diff = time_out - time_in
Date.day_fraction_to_time(diff) # => [h, m, s, frac_s]
在SQL中

你会做这样的事情:

select sum `((time_out - time_in) * 24 * 60 * 60).to_i` group_by user_id

应该为您提供老板利用的每位员工加班的累计秒数。

答案 1 :(得分:0)

我发现加班的方式是得到工作日,然后如果每个工作日总计超过8小时,那么OT =超过

@workeddays = []

  @c = 0

  @timesheet.sheets.each do |sheet|
    sheetday = sheet.date.strftime('%A')
    @workeddays.push(sheetday) unless @workeddays.include?(sheetday)
  end

  @c = @workeddays.count
  @amount = 8 * @c
  check = @timesheet.total_hours - @amount

  if check >= 0
   @totalothrs = @timesheet.total_hours - @amount
  else
    @totalothrs = 0
  end

我确定这里有一些重构但是效果很好