Class: HrLite::LeaveYearRolloverJob

Inherits:
ActiveJob::Base
  • Object
show all
Defined in:
app/jobs/hr_lite/leave_year_rollover_job.rb

Overview

Jan-1 rollover: materialize carry-forward into the new year's balance rows. Idempotent — a balance whose carry has already been written is never touched again (manual adjustments stay safe).

Instance Method Summary collapse

Instance Method Details

#perform(year: Date.current.year) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'app/jobs/hr_lite/leave_year_rollover_job.rb', line 8

def perform(year: Date.current.year)
  previous_year = year - 1

  LeaveType.active.where(paid: true).where.not(annual_quota: nil).find_each do |type|
    next unless type.carry_forward_cap.positive?

    HrLite.employees.each do |user|
      balance = LeaveBalance.for(user, type, year)
      next if balance.persisted? && balance.carried_forward.positive?

      carry = LeaveBalance.for(user, type, previous_year)
                          .available(as_of: Date.new(previous_year, 12, 31))
      carry = [ [ carry, type.carry_forward_cap ].min, 0 ].max
      next if carry.zero? && balance.persisted?

      balance.carried_forward = carry
      balance.save!
    end
  end
end