Module: HasPayrollPeriods
- Extended by:
- ActiveSupport::Concern
- Included in:
- Company
- Defined in:
- app/models/concerns/has_payroll_periods.rb
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary collapse
- #current_ending_payroll_period(remaining_ratio: 0.50) ⇒ Object
- #current_payroll_period ⇒ Object
- #current_payroll_period_id ⇒ Object
- #current_payroll_period_year ⇒ Object
- #duration_spent_in_current_payroll_period ⇒ Object
- #generate_payroll_periods(start_date: DateTime.now, year: Time.zone.now.year) ⇒ Object
- #grouped_payroll_periods ⇒ Object
- #latest_payroll_period ⇒ Object
- #latest_payroll_period_date ⇒ Object
- #open_payroll_periods ⇒ Object
- #payroll_period_for_date(date) ⇒ Object
- #payroll_periods_data(group_by_year: false, employee_id: nil, must_have_timesheet: false, no_future: false) ⇒ Object
- #pervious_payroll_period ⇒ Object
- #previous_payroll_period ⇒ Object
Instance Method Details
#current_ending_payroll_period(remaining_ratio: 0.50) ⇒ Object
127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'app/models/concerns/has_payroll_periods.rb', line 127 def current_ending_payroll_period(remaining_ratio: 0.50) last_payroll_period = payroll_periods.last return unless last_payroll_period payroll_period_days_count = last_payroll_period.days_count max_remaining_days = (payroll_period_days_count * remaining_ratio).to_i payroll_periods .where(end_date: ..(Time.zone.today + max_remaining_days)) .where(start_date: ..Time.zone.today) .where(end_date: Time.zone.today..) .order(end_date: :desc) .limit(1) .first end |
#current_payroll_period ⇒ Object
109 110 111 112 |
# File 'app/models/concerns/has_payroll_periods.rb', line 109 def current_payroll_period payroll_period_for_date(Time.zone.now) || payroll_periods.last end |
#current_payroll_period_id ⇒ Object
153 154 155 |
# File 'app/models/concerns/has_payroll_periods.rb', line 153 def current_payroll_period_id current_payroll_period&.payroll_period_id end |
#current_payroll_period_year ⇒ Object
157 158 159 |
# File 'app/models/concerns/has_payroll_periods.rb', line 157 def current_payroll_period_year current_payroll_period&.year || Time.zone.now.year end |
#duration_spent_in_current_payroll_period ⇒ Object
149 150 151 |
# File 'app/models/concerns/has_payroll_periods.rb', line 149 def duration_spent_in_current_payroll_period current_payroll_period.duration_spent end |
#generate_payroll_periods(start_date: DateTime.now, year: Time.zone.now.year) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'app/models/concerns/has_payroll_periods.rb', line 21 def generate_payroll_periods(start_date: DateTime.now, year: Time.zone.now.year) start_date = start_date.change({ hour: 0, min: 0, sec: 0 }).in_time_zone('UTC') start_date_year = start_date.year if year != start_date_year && year != start_date_year + 1 && year != start_date_year - 1 errors.add(:year, I18n.t('payroll.periods.errors.must_be_the_current_year_or_the_next_year')) raise ActiveRecord::RecordInvalid, self end if payroll_periods.exists?(year: year) errors.add(:year, I18n.t('payroll.periods.errors.periods_already_exist')) raise ActiveRecord::RecordInvalid, self end if latest_payroll_period.present? && start_date <= latest_payroll_period_date errors.add(:payroll_start_date, I18n.t('payroll.periods.errors.must_be_after_latest_payroll_period_end_date')) raise ActiveRecord::RecordInvalid, self end result = ActiveRecord::Base.execute_procedure( 'pr_generate_payroll_periods', company_id, year, start_date, payroll_frequency ) result[0] end |
#grouped_payroll_periods ⇒ Object
6 7 8 9 10 11 |
# File 'app/models/concerns/has_payroll_periods.rb', line 6 def grouped_payroll_periods periods = payroll_periods return {} unless periods periods.order(start_date: :desc).group_by(&:year) end |
#latest_payroll_period ⇒ Object
17 18 19 |
# File 'app/models/concerns/has_payroll_periods.rb', line 17 def latest_payroll_period @latest_payroll_period ||= payroll_periods.order(start_date: :desc).first end |
#latest_payroll_period_date ⇒ Object
13 14 15 |
# File 'app/models/concerns/has_payroll_periods.rb', line 13 def latest_payroll_period_date latest_payroll_period&.end_date&.change({ hour: 0, min: 0, sec: 0 }) end |
#open_payroll_periods ⇒ Object
114 115 116 117 118 119 120 |
# File 'app/models/concerns/has_payroll_periods.rb', line 114 def open_payroll_periods payroll_periods .where(end_date: Time.zone.now) .joins('LEFT JOIN PAYROLL_TRANSACTION_HEADER pth ON pth.payroll_period_id = pth.payroll_period_id') .where('pth.payroll_period_id IS NULL OR pth.stage = ?', PayrollTransactionHeader::STAGES[:IN_PROGRESS]) .order(end_date: :asc) end |
#payroll_period_for_date(date) ⇒ Object
122 123 124 125 |
# File 'app/models/concerns/has_payroll_periods.rb', line 122 def payroll_period_for_date(date) date = date.to_date payroll_periods.find_by('start_date <= ? AND end_date >= ?', date.to_s, date.to_s) end |
#payroll_periods_data(group_by_year: false, employee_id: nil, must_have_timesheet: false, no_future: false) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'app/models/concerns/has_payroll_periods.rb', line 50 def payroll_periods_data( group_by_year: false, employee_id: nil, must_have_timesheet: false, no_future: false ) sql = <<-SQL SELECT pp.payroll_period_id ,pp.[start_date] ,pp.[end_date] ,pp.[period_no] ,vw.count_time_sheet as count_time_sheet FROM PAYROLL_PERIODS pp Left Join ( Select payroll_period_id ,payroll_frequency ,company_id ,count(*) as count_time_sheet #{',employee_id' if employee_id} from vw_employee_time_sheets #{'where employee_id = ?' if employee_id} group by payroll_period_id ,payroll_frequency ,company_id #{',employee_id' if employee_id} ) as vw on vw.payroll_period_id = pp.payroll_period_id and vw.payroll_frequency = pp.frequency and vw.company_id = pp.company_id WHERE pp.company_id = ? AND pp.frequency = ? #{'AND vw.count_time_sheet > 0' if must_have_timesheet} #{'AND pp.start_date < GETDATE()' if no_future} ORDER BY pp.start_date DESC SQL query_params = [company_id, payroll_frequency] query_params.unshift(employee_id) if employee_id sanitized_query = ActiveRecord::Base.send(:sanitize_sql_array, [sql, *query_params]) result = ActiveRecord::Base.connection.exec_query(sanitized_query).to_a group_by_year ? self.class.group_payroll_periods_by_year(result) : result end |
#pervious_payroll_period ⇒ Object
142 143 144 145 146 147 |
# File 'app/models/concerns/has_payroll_periods.rb', line 142 def pervious_payroll_period payroll_periods .where(end_date: ...Time.zone.today) .order(end_date: :desc) .first end |
#previous_payroll_period ⇒ Object
98 99 100 101 102 103 104 105 106 107 |
# File 'app/models/concerns/has_payroll_periods.rb', line 98 def previous_payroll_period return nil unless current_payroll_period current_payroll_period_no = current_payroll_period.period_no return nil unless current_payroll_period_no payroll_periods.find_by( period_no: current_payroll_period.period_no - 1 ) end |