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

新しく計算された合計にも追加する必要があります。これにどのようにアプローチすべきかについての考えをいただければ幸いです。

4

2 に答える 2

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

年度の初めに、各従業員はこれまでに獲得した時間の合計から、これまでに使用した時間の合計を差し引いたものになるため、ロールオーバー メソッドは必要ありません。

ほとんどの雇用主は、年初に前払いするのではなく、各給与期間に発生した休暇の一部をあなたに与えます。おそらく最終的には、給与期間と給与ごとの years_employed でセグメント化する必要があります (つまり、Employee は 24 の給与サイクル、つまり 2 年間ここにいます)。より堅牢な years_employed メソッドが必要になります。hire_dateから年数をインクリメント カレンダー (常に 365 日とは限りません) として計算するメソッドの出発点として使用できる要点を書きました。これを変更して、給与サイクルが何であれ、2 週間ごと、15 日ごとに増分することができます。給与計算方法を処理するサービスまたは追加のモデルを追加することもできます。

于 2013-05-16T19:50:45.033 に答える