我正在尝试编写一个应用程序,计算病假/假期以及员工在任何类别中可用的天数。
下一步是添加一个方法,该方法在每年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方法需要重置,然后我还需要添加一个滚动方法,如
def rollover
if some_method_determining_last_year(remaining_vacation_days) >= 2
2
else
remaining_vacation_days
end
end
也需要加到新计算的总数中。如果你能告诉我该怎么做,我将不胜感激。
数据库解决方案可能是最简单的方法,但由于您已经在尝试存储尽可能少的信息,我可能有一个解决方案。你已经有了一个方法来计算员工的假期/病假(可能真的应该是小时数)。从那里,你可以有一个方法来计算员工曾经获得的假期和病假总数。然后,只需简单地计算他们使用的天数和他们获得的小时数。您可能需要为过期的时间向这些方法添加一个过滤器,但是您已经明白了。我还假设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方法,我已经编写了一个要点,可以用作一个方法的起点,该方法从hire_date开始计算作为增量日历(不总是365天)的年份。你可以将其修改为每两周,15天增加一次,无论工资周期是多少。您还可以添加服务或附加模型来处理工资单方法。
我建议扩展Employee模型/模式以包含两个额外的列:remaining_vacation_days和sick_days。
在创建Employee时,适当地设置这些值,并在Furlough保存后减少remaining_vacation_days并增加sick_days(参见after_save)。
最后,在1月1日使用vacation_days和sick_days方法为新的一年重置这些值。