hr_lite 0.16.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +117 -0
  3. data/README.md +12 -0
  4. data/app/assets/javascripts/hr_lite/nav.js +21 -0
  5. data/app/assets/stylesheets/hr_lite/hr_lite.css +1 -1
  6. data/app/controllers/hr_lite/admin/benefits_controller.rb +61 -0
  7. data/app/controllers/hr_lite/admin/expense_categories_controller.rb +43 -0
  8. data/app/controllers/hr_lite/admin/leave_balances_controller.rb +4 -1
  9. data/app/controllers/hr_lite/admin/leave_requests_controller.rb +3 -3
  10. data/app/controllers/hr_lite/admin/payroll_line_items_controller.rb +47 -0
  11. data/app/controllers/hr_lite/admin/payroll_runs_controller.rb +3 -1
  12. data/app/controllers/hr_lite/leave_requests_controller.rb +3 -1
  13. data/app/controllers/hr_lite/regularization_requests_controller.rb +10 -1
  14. data/app/controllers/hr_lite/salary_slips_controller.rb +6 -6
  15. data/app/helpers/hr_lite/application_helper.rb +12 -6
  16. data/app/jobs/hr_lite/attendance_close_job.rb +42 -0
  17. data/app/jobs/hr_lite/payroll_auto_draft_job.rb +4 -3
  18. data/app/jobs/hr_lite/slips_ready_job.rb +10 -0
  19. data/app/models/hr_lite/attendance_record.rb +1 -0
  20. data/app/models/hr_lite/audit_log.rb +1 -1
  21. data/app/models/hr_lite/benefit_enrolment.rb +1 -1
  22. data/app/models/hr_lite/leave_balance.rb +2 -1
  23. data/app/models/hr_lite/leave_request.rb +38 -17
  24. data/app/models/hr_lite/payroll_line_item.rb +5 -3
  25. data/app/models/hr_lite/payroll_run.rb +19 -3
  26. data/app/models/hr_lite/regularization_request.rb +40 -3
  27. data/app/models/hr_lite/salary_slip.rb +6 -0
  28. data/app/services/hr_lite/attendance_summary.rb +12 -15
  29. data/app/services/hr_lite/overview_query.rb +4 -1
  30. data/app/views/hr_lite/admin/benefits/index.html.erb +65 -0
  31. data/app/views/hr_lite/admin/benefits/new.html.erb +37 -0
  32. data/app/views/hr_lite/admin/expense_categories/_form.html.erb +16 -0
  33. data/app/views/hr_lite/admin/expense_categories/edit.html.erb +3 -0
  34. data/app/views/hr_lite/admin/expense_categories/index.html.erb +30 -0
  35. data/app/views/hr_lite/admin/expense_categories/new.html.erb +3 -0
  36. data/app/views/hr_lite/admin/leave_balances/index.html.erb +4 -0
  37. data/app/views/hr_lite/admin/leave_requests/new.html.erb +8 -1
  38. data/app/views/hr_lite/admin/leave_requests/show.html.erb +3 -0
  39. data/app/views/hr_lite/admin/leave_types/index.html.erb +1 -0
  40. data/app/views/hr_lite/admin/payroll_line_items/index.html.erb +47 -0
  41. data/app/views/hr_lite/admin/payroll_line_items/new.html.erb +42 -0
  42. data/app/views/hr_lite/admin/payroll_runs/show.html.erb +1 -0
  43. data/app/views/hr_lite/admin/salary_structures/_form.html.erb +5 -1
  44. data/app/views/hr_lite/admin/shared/_approvals_tabs.html.erb +3 -1
  45. data/app/views/hr_lite/leave_requests/index.html.erb +4 -0
  46. data/app/views/hr_lite/leave_requests/new.html.erb +1 -0
  47. data/app/views/hr_lite/regularization_requests/new.html.erb +3 -0
  48. data/app/views/hr_lite/salary_slips/index.html.erb +1 -1
  49. data/app/views/layouts/hr_lite/application.html.erb +5 -4
  50. data/config/routes.rb +5 -0
  51. data/db/migrate/20260929081109_add_paid_days_to_hr_lite_leave_requests.rb +5 -0
  52. data/lib/hr_lite/configuration.rb +21 -1
  53. data/lib/hr_lite/notifications.rb +8 -2
  54. data/lib/hr_lite/version.rb +1 -1
  55. metadata +16 -1
@@ -0,0 +1,42 @@
1
+ <% content_for(:page_title) { "Add a pay item" } %>
2
+ <div class="hrl-page__head"><h1 class="hrl-page__title">Add a pay item</h1></div>
3
+
4
+ <section class="hrl-card">
5
+ <p class="hrl-muted hrl-small">
6
+ A bonus, incentive, arrears, reimbursement or one-time deduction on one
7
+ month's payslip. Payroll picks it up when that month's run is computed —
8
+ add it first, or recompute the run while it is in review. A month that
9
+ has already been paid is refused.
10
+ </p>
11
+ <%= form_with model: @item, url: hr_lite.admin_payroll_line_items_path, method: :post, local: true do |f| %>
12
+ <%= render "hr_lite/shared/form_errors", record: @item %>
13
+ <div class="hrl-field">
14
+ <%= f.label :user_id, "Employee" %>
15
+ <%= f.select :user_id, options_for_select(HrLite.employees.map { |u| [ hr_display_name(u), u.id ] },
16
+ @item.user_id) %>
17
+ </div>
18
+ <div class="hrl-field">
19
+ <%= f.label :component_id, "Item" %>
20
+ <%# Loan repayment is left out: finalize books that line against the person's loans. %>
21
+ <%= f.select :component_id,
22
+ HrLite::SalaryComponent.active.ordered.where.not(code: "loan_repayment")
23
+ .map { |c| [ "#{c.label} (#{c.kind})", c.id ] } %>
24
+ </div>
25
+ <div class="hrl-field">
26
+ <%= f.label :period_month, "Month" %>
27
+ <%= f.month_field :period_month, value: @item.period_month&.strftime("%Y-%m") %>
28
+ </div>
29
+ <div class="hrl-field">
30
+ <%= f.label :amount, "Amount (₹)" %>
31
+ <%= f.text_field :amount, value: @item.amount&.to_s("F"), inputmode: "decimal" %>
32
+ </div>
33
+ <div class="hrl-field">
34
+ <%= f.label :note, "Note (optional)" %>
35
+ <%= f.text_field :note %>
36
+ </div>
37
+ <div class="hrl-form-actions">
38
+ <%= f.submit "Add", class: "hrl-btn hrl-btn--primary" %>
39
+ <a class="hrl-btn" href="<%= hr_lite.admin_payroll_line_items_path(month: @item.period_month&.strftime("%Y-%m")) %>">Cancel</a>
40
+ </div>
41
+ <% end %>
42
+ </section>
@@ -2,6 +2,7 @@
2
2
  <div class="hrl-page__head">
3
3
  <h1 class="hrl-page__title">Payroll — <%= @run.label %></h1>
4
4
  <div class="hrl-page__actions">
5
+ <a class="hrl-btn" href="<%= hr_lite.admin_payroll_line_items_path(month: @run.period_month.strftime("%Y-%m")) %>">One-off items</a>
5
6
  <a class="hrl-btn" href="<%= hr_lite.admin_payroll_runs_path %>">All runs</a>
6
7
  </div>
7
8
  </div>
@@ -14,7 +14,11 @@
14
14
  <div class="hrl-field hrl-field--check"><%= f.check_box :esi_applicable %><%= f.label :esi_applicable, "ESI applicable (auto-exempt above gross ceiling)" %></div>
15
15
  <div class="hrl-field">
16
16
  <%= f.label :pt_state, "Professional tax state" %>
17
- <%= f.select :pt_state, HrLite::StatutoryRateCard.for(Date.current)[:pt].keys.map { |s| [ s.humanize, s ] } %>
17
+ <%# A stored rate card carries no PT (slabs live in their own table), so list those states too. %>
18
+ <% pt_states = [ HrLite::ProfessionalTaxSlab::NO_LEVY, structure.pt_state ] |
19
+ HrLite::ProfessionalTaxSlab.distinct.order(:state).pluck(:state) |
20
+ HrLite::StatutoryRateCard.for(Date.current)[:pt].keys %>
21
+ <%= f.select :pt_state, pt_states.map { |s| [ s.humanize, s ] } %>
18
22
  </div>
19
23
  <div class="hrl-field"><%= f.label :notes %><%= f.text_area :notes %></div>
20
24
  <div class="hrl-form-actions">
@@ -1,4 +1,4 @@
1
- <%# locals: active (:leaves | :comp_off | :regularizations) %>
1
+ <%# locals: active (:leaves | :comp_off | :regularizations | :balances) %>
2
2
  <div class="hrl-row" style="margin-bottom:.85rem;">
3
3
  <a class="hrl-btn <%= 'hrl-btn--primary' if active == :leaves %>"
4
4
  href="<%= hr_lite.admin_leave_requests_path %>">Leaves</a>
@@ -8,4 +8,6 @@
8
8
  <a class="hrl-btn <%= 'hrl-btn--primary' if active == :regularizations %>"
9
9
  href="<%= hr_lite.admin_regularization_requests_path %>">Regularization
10
10
  <% if (n = HrLite::RegularizationRequest.pending.count).positive? %><span class="hrl-badge hrl-badge--warn"><%= n %></span><% end %></a>
11
+ <a class="hrl-btn <%= 'hrl-btn--primary' if active == :balances %>"
12
+ href="<%= hr_lite.admin_leave_balances_path %>">Balances</a>
11
13
  </div>
@@ -2,7 +2,11 @@
2
2
  <div class="hrl-page__head">
3
3
  <h1 class="hrl-page__title">My leaves</h1>
4
4
  <div class="hrl-page__actions">
5
+ <a class="hrl-btn" href="<%= hr_lite.leave_balances_path %>">Balances</a>
5
6
  <a class="hrl-btn" href="<%= hr_lite.comp_off_requests_path %>">Comp-off</a>
7
+ <% if hr_can?("leave.approve", scope: :team) %>
8
+ <a class="hrl-btn" href="<%= hr_lite.new_admin_leave_request_path %>">Record leave for someone</a>
9
+ <% end %>
6
10
  <a class="hrl-btn hrl-btn--primary" href="<%= hr_lite.new_leave_request_path %>">Apply</a>
7
11
  </div>
8
12
  </div>
@@ -4,6 +4,7 @@
4
4
  </div>
5
5
 
6
6
  <%= render "hr_lite/leave_requests/balance_chips" %>
7
+ <p class="hrl-small hrl-muted">Days beyond your balance are unpaid (loss of pay), cut from that month's salary.</p>
7
8
 
8
9
  <section class="hrl-card">
9
10
  <%= form_with model: @request, url: hr_lite.leave_requests_path, local: true do |f| %>
@@ -6,6 +6,9 @@
6
6
  <section class="hrl-card">
7
7
  <%= form_with model: @request, url: hr_lite.regularization_requests_path, scope: :regularization_request, local: true do |f| %>
8
8
  <%= render "hr_lite/shared/form_errors", record: @request %>
9
+ <% if (rule = HrLite.config.self_regularization) %>
10
+ <p class="hrl-small hrl-muted">A missed punch on a working day from today back to <%= rule[:within_days] %> days ago is fixed as soon as you submit, up to <%= rule[:per_week] %> times a week. Anything else goes to HR as a ticket.</p>
11
+ <% end %>
9
12
  <div class="hrl-field">
10
13
  <%= f.label :date, "Which day needs fixing?" %>
11
14
  <%= f.date_field :date, value: @request.date&.strftime("%Y-%m-%d"), max: Date.current %>
@@ -24,6 +24,6 @@
24
24
  </div>
25
25
  <%= hrl_pagination %>
26
26
  <% else %>
27
- <p class="hrl-card--empty">No published salary slips yet.</p>
27
+ <p class="hrl-card--empty">No published salary slips yet.<% if (day = HrLite.config.slip_release_day) %> Each month's slip opens on the <%= day.ordinalize %> of the next month.<% end %></p>
28
28
  <% end %>
29
29
  </section>
@@ -30,10 +30,10 @@
30
30
  <%= hrl_nav_link(item) %>
31
31
  <% end %>
32
32
 
33
- <% if hr_admin? || hr_leadership? %>
33
+ <% if hr_admin? || hr_leadership? || hr_can?("expense.approve", scope: :team) %>
34
34
  <span class="hrl-side__group">Manage</span>
35
35
  <% hrl_nav_items(HrLite::ApplicationHelper::ADMIN_NAV_ITEMS).each do |item| %>
36
- <%= hrl_nav_link(item) %>
36
+ <%= hrl_nav_link(item) if item[:if] || hr_admin? || hr_leadership? %>
37
37
  <% end %>
38
38
  <% end %>
39
39
 
@@ -100,10 +100,10 @@
100
100
  <% rest.each do |item| %>
101
101
  <%= hrl_nav_link(item) %>
102
102
  <% end %>
103
- <% if hr_admin? || hr_leadership? %>
103
+ <% if hr_admin? || hr_leadership? || hr_can?("expense.approve", scope: :team) %>
104
104
  <span class="hrl-side__group">Manage</span>
105
105
  <% hrl_nav_items(HrLite::ApplicationHelper::ADMIN_NAV_ITEMS).each do |item| %>
106
- <%= hrl_nav_link(item) %>
106
+ <%= hrl_nav_link(item) if item[:if] || hr_admin? || hr_leadership? %>
107
107
  <% end %>
108
108
  <% end %>
109
109
  <% if hr_leadership? || hr_superadmin? %>
@@ -125,6 +125,7 @@
125
125
 
126
126
  <%= javascript_include_tag "hr_lite/confirm", defer: true %>
127
127
  <%= javascript_include_tag "hr_lite/mention", defer: true %>
128
+ <%= javascript_include_tag "hr_lite/nav", defer: true %>
128
129
  <%= yield :scripts %>
129
130
  </body>
130
131
  </html>
data/config/routes.rb CHANGED
@@ -91,11 +91,15 @@ HrLite::Engine.routes.draw do
91
91
  resources :assets, only: %i[index new create] do
92
92
  member { post :assign; post :take_back }
93
93
  end
94
+ resources :benefits, only: %i[index new create] do
95
+ member { post :enrol; post :unenrol }
96
+ end
94
97
  resources :checklists, only: :index do
95
98
  member { post :complete; post :reopen }
96
99
  end
97
100
  resources :leave_types, except: :show
98
101
  resources :office_locations, except: :show
102
+ resources :expense_categories, except: %i[show destroy]
99
103
  resources :holidays, only: %i[index create update destroy] do
100
104
  collection { post :bulk_create }
101
105
  end
@@ -119,6 +123,7 @@ HrLite::Engine.routes.draw do
119
123
  get :register
120
124
  end
121
125
  end
126
+ resources :payroll_line_items, only: %i[index new create destroy]
122
127
  resources :salary_slips, only: %i[show update]
123
128
  resource :setting, only: %i[edit update]
124
129
  resources :audit_logs, only: :index
@@ -0,0 +1,5 @@
1
+ class AddPaidDaysToHrLiteLeaveRequests < ActiveRecord::Migration[8.1]
2
+ def change
3
+ add_column :hr_lite_leave_requests, :paid_days, :decimal, precision: 4, scale: 1
4
+ end
5
+ end
@@ -14,7 +14,7 @@ module HrLite
14
14
  # the HR shell; nil (default) shows nothing.
15
15
  :notifications
16
16
 
17
- attr_reader :leave_year_start_month
17
+ attr_reader :leave_year_start_month, :slip_release_day, :self_regularization
18
18
 
19
19
  # Misconfiguration must fail at boot, not as production 500s on every
20
20
  # balance screen. Accepts "7" (ENV-friendly) and validates 1..12.
@@ -27,6 +27,24 @@ module HrLite
27
27
  @leave_year_start_month = month
28
28
  end
29
29
 
30
+ # nil = an employee sees a slip the moment it is published; 10 = the
31
+ # October slip opens on 10 November. 1..28 so every month has that day.
32
+ def slip_release_day=(value)
33
+ day = value.presence && Integer(value)
34
+ raise ArgumentError, "slip_release_day must be 1..28 or nil, got #{value.inspect}" if day && !(1..28).cover?(day)
35
+
36
+ @slip_release_day = day
37
+ end
38
+
39
+ # nil = only HR fixes a missed punch. { within_days: 2, per_week: 2 } = an
40
+ # employee may fix their own day for 2 days after it, at most 2 a week.
41
+ def self_regularization=(value)
42
+ ok = value.nil? || (value.is_a?(Hash) && %i[within_days per_week].all? { |k| value[k].is_a?(Integer) && value[k].positive? })
43
+ raise ArgumentError, "self_regularization must be nil or { within_days:, per_week: } (positive integers), got #{value.inspect}" unless ok
44
+
45
+ @self_regularization = value
46
+ end
47
+
30
48
  # 0.1.0 pre-release name for public_url_base; kept as an alias so early
31
49
  # adopters' initializers don't break.
32
50
  alias_method :mail_link_base, :public_url_base
@@ -67,6 +85,8 @@ module HrLite
67
85
  @notification_matrix = nil # resolved lazily to Notifications::DEFAULT_MATRIX
68
86
  @back_link = nil # optional {label:, url:} for the shell nav
69
87
  @leave_year_start_month = 1 # 1 = calendar year; 7 = July–June leave year
88
+ @slip_release_day = nil # e.g. 10 = slips open on the 10th of the next month
89
+ @self_regularization = nil # e.g. { within_days: 2, per_week: 2 } — employees fix their own missed punch
70
90
 
71
91
  # Leadership onboarding/offboarding. onboard_user must return a saved
72
92
  # user record (default: create on user_class with whatever of
@@ -18,6 +18,8 @@ module HrLite
18
18
  "leave.cancelled" => { bell: true, email: false, leadership_email: true, leadership_bell: false },
19
19
  "attendance.flagged" => { bell: true, email: false, leadership_email: false, leadership_bell: false },
20
20
  "attendance.regularized" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
21
+ "attendance.missed_check_in" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
22
+ "attendance.missed_check_out" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
21
23
  "payroll.finalized" => { bell: false, email: false, leadership_email: true, leadership_bell: true },
22
24
  "payroll.published" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
23
25
  "kudos.mentioned" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
@@ -48,7 +50,7 @@ module HrLite
48
50
  "resignation.accepted" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
49
51
  "resignation.withdrawn" => { bell: true, email: false, leadership_email: true, leadership_bell: false },
50
52
  "employee.onboarded" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
51
- "payroll.draft_ready" => { bell: false, email: false, leadership_email: true, leadership_bell: true },
53
+ "payroll.draft_ready" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
52
54
  "leave.team_notice" => { bell: true, email: false, leadership_email: false, leadership_bell: false },
53
55
  "comp_off.requested" => { bell: true, email: false, leadership_email: true, leadership_bell: true },
54
56
  "comp_off.approved" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
@@ -73,8 +75,10 @@ module HrLite
73
75
  # employee-scoped path ("Your appraisal has been shared", /appraisals/7):
74
76
  # fanned out verbatim, leadership read them as being about themselves and
75
77
  # followed a link their own scope 404s or resolves to their own record.
78
+ # `skip_leadership:` is for a delayed employee half of an event whose
79
+ # leadership copy already went out.
76
80
  def publish(event, title:, body: nil, path: nil, bell_to: [], email_to: [], lines: [],
77
- diff: nil, link_url: nil, leadership: {})
81
+ diff: nil, link_url: nil, leadership: {}, skip_leadership: false)
78
82
  row = matrix[event.to_s]
79
83
  unless row
80
84
  Rails.logger.warn("[hr_lite] unknown notification event #{event}")
@@ -87,6 +91,8 @@ module HrLite
87
91
 
88
92
  deliver_bells(event, row, bell_to, title, body, path)
89
93
  deliver_emails(row, email_to, title, body, path, lines, link_url)
94
+ return if skip_leadership
95
+
90
96
  deliver_leadership_email(event, row, lead_title, lead_body, lead_path, lines, diff)
91
97
  deliver_leadership_bells(event, row, bell_to, lead_title, lead_body, lead_path)
92
98
  nil
@@ -1,3 +1,3 @@
1
1
  module HrLite
2
- VERSION = "0.16.0"
2
+ VERSION = "0.19.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hr_lite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kshitiz sinha
@@ -67,6 +67,7 @@ files:
67
67
  - app/assets/javascripts/hr_lite/confirm.js
68
68
  - app/assets/javascripts/hr_lite/geo_punch.js
69
69
  - app/assets/javascripts/hr_lite/mention.js
70
+ - app/assets/javascripts/hr_lite/nav.js
70
71
  - app/assets/javascripts/hr_lite/print.js
71
72
  - app/assets/stylesheets/hr_lite/application.css
72
73
  - app/assets/stylesheets/hr_lite/hr_lite.css
@@ -75,11 +76,13 @@ files:
75
76
  - app/controllers/hr_lite/admin/attendances_controller.rb
76
77
  - app/controllers/hr_lite/admin/audit_logs_controller.rb
77
78
  - app/controllers/hr_lite/admin/base_controller.rb
79
+ - app/controllers/hr_lite/admin/benefits_controller.rb
78
80
  - app/controllers/hr_lite/admin/checklists_controller.rb
79
81
  - app/controllers/hr_lite/admin/comp_off_requests_controller.rb
80
82
  - app/controllers/hr_lite/admin/designation_changes_controller.rb
81
83
  - app/controllers/hr_lite/admin/documents_controller.rb
82
84
  - app/controllers/hr_lite/admin/employees_controller.rb
85
+ - app/controllers/hr_lite/admin/expense_categories_controller.rb
83
86
  - app/controllers/hr_lite/admin/expenses_controller.rb
84
87
  - app/controllers/hr_lite/admin/holidays_controller.rb
85
88
  - app/controllers/hr_lite/admin/hr_requests_controller.rb
@@ -90,6 +93,7 @@ files:
90
93
  - app/controllers/hr_lite/admin/loans_controller.rb
91
94
  - app/controllers/hr_lite/admin/office_locations_controller.rb
92
95
  - app/controllers/hr_lite/admin/overview_controller.rb
96
+ - app/controllers/hr_lite/admin/payroll_line_items_controller.rb
93
97
  - app/controllers/hr_lite/admin/payroll_runs_controller.rb
94
98
  - app/controllers/hr_lite/admin/policies_controller.rb
95
99
  - app/controllers/hr_lite/admin/regularization_requests_controller.rb
@@ -133,10 +137,12 @@ files:
133
137
  - app/helpers/hr_lite/application_helper.rb
134
138
  - app/jobs/hr_lite/application_job.rb
135
139
  - app/jobs/hr_lite/approval_escalation_job.rb
140
+ - app/jobs/hr_lite/attendance_close_job.rb
136
141
  - app/jobs/hr_lite/daily_digest_job.rb
137
142
  - app/jobs/hr_lite/document_expiry_job.rb
138
143
  - app/jobs/hr_lite/leave_year_rollover_job.rb
139
144
  - app/jobs/hr_lite/payroll_auto_draft_job.rb
145
+ - app/jobs/hr_lite/slips_ready_job.rb
140
146
  - app/mailers/hr_lite/application_mailer.rb
141
147
  - app/mailers/hr_lite/event_mailer.rb
142
148
  - app/models/concerns/hr_lite/approvable.rb
@@ -214,6 +220,8 @@ files:
214
220
  - app/views/hr_lite/admin/attendances/index.html.erb
215
221
  - app/views/hr_lite/admin/attendances/show.html.erb
216
222
  - app/views/hr_lite/admin/audit_logs/index.html.erb
223
+ - app/views/hr_lite/admin/benefits/index.html.erb
224
+ - app/views/hr_lite/admin/benefits/new.html.erb
217
225
  - app/views/hr_lite/admin/checklists/index.html.erb
218
226
  - app/views/hr_lite/admin/comp_off_requests/index.html.erb
219
227
  - app/views/hr_lite/admin/comp_off_requests/show.html.erb
@@ -225,6 +233,10 @@ files:
225
233
  - app/views/hr_lite/admin/employees/index.html.erb
226
234
  - app/views/hr_lite/admin/employees/new.html.erb
227
235
  - app/views/hr_lite/admin/employees/show.html.erb
236
+ - app/views/hr_lite/admin/expense_categories/_form.html.erb
237
+ - app/views/hr_lite/admin/expense_categories/edit.html.erb
238
+ - app/views/hr_lite/admin/expense_categories/index.html.erb
239
+ - app/views/hr_lite/admin/expense_categories/new.html.erb
228
240
  - app/views/hr_lite/admin/expenses/index.html.erb
229
241
  - app/views/hr_lite/admin/holidays/index.html.erb
230
242
  - app/views/hr_lite/admin/hr_requests/index.html.erb
@@ -245,6 +257,8 @@ files:
245
257
  - app/views/hr_lite/admin/office_locations/index.html.erb
246
258
  - app/views/hr_lite/admin/office_locations/new.html.erb
247
259
  - app/views/hr_lite/admin/overview/index.html.erb
260
+ - app/views/hr_lite/admin/payroll_line_items/index.html.erb
261
+ - app/views/hr_lite/admin/payroll_line_items/new.html.erb
248
262
  - app/views/hr_lite/admin/payroll_runs/index.html.erb
249
263
  - app/views/hr_lite/admin/payroll_runs/new.html.erb
250
264
  - app/views/hr_lite/admin/payroll_runs/show.html.erb
@@ -361,6 +375,7 @@ files:
361
375
  - db/migrate/20260818010401_create_hr_lite_assets_and_onboarding.rb
362
376
  - db/migrate/20260927100145_add_id_card_fields_to_hr_lite_employee_profiles.rb
363
377
  - db/migrate/20260927101031_add_created_by_id_to_hr_lite_leave_requests.rb
378
+ - db/migrate/20260929081109_add_paid_days_to_hr_lite_leave_requests.rb
364
379
  - lib/generators/hr_lite/install/install_generator.rb
365
380
  - lib/generators/hr_lite/install/templates/AFTER_INSTALL
366
381
  - lib/generators/hr_lite/install/templates/initializer.rb