Module: Models::EmployeeTimeOffRollover

Extended by:
ActiveSupport::Concern
Included in:
EmployeeTimeOffAccruals
Defined in:
app/concerns/models/employee_time_off_rollover.rb

Overview

Year-end rollover, expiry, and policy-transition logic for time-off.

Instance Method Summary collapse

Instance Method Details

#process_policy_transitionsvoid

This method returns an undefined value.

Transitions employees to the next time-off policy in a policy chain
when they meet the tenure eligibility rules.



27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/concerns/models/employee_time_off_rollover.rb', line 27

def process_policy_transitions
  time_off_policy_assignments.includes(:time_off_policy).find_each do |assignment|
    current_policy = assignment.time_off_policy
    employee = assignment.employee
    next_policy = TimeOffPolicy.find_by(parent_policy_id: current_policy.id)

    next unless next_policy && current_policy.id != next_policy.id && eligible_for_next_policy?(employee, next_policy)
    next if time_off_policy_assignments.exists?(time_off_policy_id: next_policy.id)

    assign_next_policy(next_policy)
  end
end

#process_rollover_and_expiry(simulate_date: nil, send_email: true) ⇒ void

This method returns an undefined value.

Runs rollover and expiry processing for every assigned time-off policy.

Parameters:

  • simulate_date (Date, nil) (defaults to: nil)

    optional date to simulate the rollover for;
    when given, no email is sent and weekly partial accruals are added first

  • send_email (Boolean) (defaults to: true)

    whether to send the rollover notification email



12
13
14
15
16
17
18
19
20
21
22
# File 'app/concerns/models/employee_time_off_rollover.rb', line 12

def process_rollover_and_expiry(simulate_date: nil, send_email: true)
  time_off_policy_assignments.includes(:time_off_policy).find_each do |assignment|
    policy = assignment.time_off_policy
    time_off_type = policy.time_off_type

    add_end_of_year_partial_accrual(assignment:, policy:, time_off_type:, simulate_date:) if simulate_date && policy.accrual_frequency&.downcase == 'weekly'

    process_rollover(policy, time_off_type, simulate_date:, send_email: send_email && !simulate_date)
    process_expiry(policy, time_off_type)
  end
end