如何在新的一年到来时重新计算价值观,Ruby

时间:2013-05-15 21:43:44

标签: ruby date ruby-on-rails-3.2

我正在尝试编写一个应用程序,用于计算病假/休假日以及员工在任何一个类别中可用的数量。

下一步是添加一种方法,每年1月首次重新计算所有员工的可用休假/病假时间(无需清理/覆盖上一年的数据,因为需要访问该信息)。

我有一个Employee模型(在下面发布),:has_many Furloughs(有自己的模型,我不会发布,除非有要求,但基本上处理如何日期范围计算)。

class Employee < ActiveRecord::Base
  has_many :furloughs, :dependent => :destroy

  def years_employed
    (DateTime.now - hire_date).round / 365
  end

  def vacation_days
    if years_employed < 1 && newbie
      ((12 - hire_date.month) * 0.8).ceil
    elsif years_employed <= 6
      10 
    elsif years_employed <= 16
      years_employed + 4
    else 
      20
    end
  end

  def newbie
    Time.now.year == hire_date.year
  end

  def sick_days
    5.0
  end

  def vacation_days_used 
      self.furloughs.collect(&:vacation_duration).inject(0) { | memo, n | memo + n } 
  end

  def sick_days_used
    self.furloughs.collect(&:sick_duration).inject(0) { | memo, n | memo + n }
  end

  def remaining_vacation_days
    vacation_days - vacation_days_used
  end

  def remaining_sick_days
    sick_days - sick_days_used
  end

end

1月1日,假期/ sick_days和vacation / sick_days_used方法需要重置,然后我还需要添加翻转方法,如

 def rollover
    if some_method_determining_last_year(remaining_vacation_days) >= 2
      2
    else
      remaining_vacation_days
    end
  end

还需要添加到新计算的总数中。我对如何处理这个问题有任何想法。

2 个答案:

答案 0 :(得分:2)

我建议扩展Employee模型/模式以包含两个额外的列:remaining_vacation_days和sick_days。

创建Employee后,适当设置这些值并减少remaining_vacation_days并在Furlough保存后增加sick_days(参见after_save)。

最后,在1月1日,使用您的vacation_days和sick_days方法重置新年的这些值。

答案 1 :(得分:2)

数据库解决方案可能是最简单的方法,但由于您已经在尝试尽可能少地存储信息,我可能会为您提供解决方案。您已经有一种方法可以计算员工的假期/病假天数(可能真的应该是几小时)。从那里,您可以使用一种方法计算员工获得的总假期和病假天数。然后,它只是在他们使用的天数和获得的小时数之间的简单计算。您可能需要在过期时间内为这些方法添加过滤器,但您明白了。我还假设vacation_days_used是用于整个工作的日子(由于我看不到休假模型,所以无法分辨):

def total_vacation_days_earned
  # vacation_days has to be recalculate, probably should be a mapped function.
  # for each year, how many vacation days did you earn, but this is a rough method
  vacation_days * years_employed # can put cutoffs like, first 2 years employed, etc.
end

def total_sick_days_earned
  sick_days * years_employed
end

def vacation_days_used 
  self.furloughs.collect(&:vacation_duration).inject(0) { | memo, n | memo + n } 
end

def sick_days_used
 self.furloughs.collect(&:sick_duration).inject(0) { | memo, n | memo + n }
end

def remaining_vacation_days
  total_vacation_days_earned - vacation_days_used
end

def remaining_sick_days
  total_sick_days_earned - sick_days_used
end

现在你不需要翻转方法,因为从年初开始,每个员工的累计时间总计减去他们曾经使用过的总时间。

大多数雇主会给您一小部分假期,而这些假期是您在每个工资核算期间产生的,而不是在年初的预付款。您可能最终需要按工资核算期间以及按工资单计算的年份(即员工已在此处24个工资核算周期或2年)对其进行细分。您需要一个更强大的years_employed方法,我已经写了一个gist,可以作为一个方法的起点,该方法可以计算hire_date中作为递增日历(不总是365天)年份的年份。无论工资周期是什么,您都可以将其修改为每两周增加一次,即十五天。您还可以添加服务或其他模型来处理工资核算方法。