我正在尝试编写一个应用程序,用于计算病假/休假日以及员工在任何一个类别中可用的数量。
下一步是添加一种方法,每年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
还需要添加到新计算的总数中。我对如何处理这个问题有任何想法。
答案 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天)年份的年份。无论工资周期是什么,您都可以将其修改为每两周增加一次,即十五天。您还可以添加服务或其他模型来处理工资核算方法。