1

我正在尝试编写一个应用程序来计算病假/休假天数以及员工在任一类别中的可用时间。

下一步是添加一种方法,该方法每年 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日,vacation/sick_days和vacation/sick_days_used方法需要重置,然后我还需要添加一个rollover方法,比如

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

这也需要添加到新计算的总数中。我很感激任何关于我应该如何处理这个问题的想法。

4

2 回答 2

2

数据库解决方案可能是最简单的方法,但由于您已经在尝试存储尽可能少的信息,我可能会为您提供解决方案。您已经有了一种方法来计算员工的休假/病假天数(可能真的应该是小时数)。从那里你可以有一种方法来计算员工曾经获得的总假期和病假。那么这只是他们使用的天数和获得的小时数之间的简单计算。您可能必须为这些方法添加一个过滤器来处理过期时间,但您明白了。我还假设 holiday_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

现在您应该不需要翻转方法,因为在年初,每个员工都有他们曾经累积的运行总时间减去他们曾经使用过的运行总时间。

大多数雇主会在每个工资核算期为您提供一小部分假期,而不是在年初提前。您最终可能需要按工资单周期以及按工资单的years_employed 将其细分(即,Employee 已经在这里工作了24 个工资周期,或2 年)。您将需要一个更强大的years_employed 方法,我已经编写了一个要点,该要点可用作计算从hire_date 开始作为递增日历(不总是365 天)年份的年份的方法的起点。无论工资周期是什么,您都可以将其修改为每两周、十五天递增一次。您还可以添加服务或其他模型来处理工资单方法。

于 2013-05-16T19:50:45.033 回答
2

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

在创建 Employee 时,适当地设置这些值,并在 Furlough 保存后减少剩余的假期天数并增加生病的天数(参见after_save)。

最后,在 1 月 1 日,使用您的 holiday_days 和ick_days 方法为新的一年重置这些值。

于 2013-05-16T05:00:10.887 回答