hr_lite 0.15.0 → 0.18.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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -0
  3. data/README.md +5 -1
  4. data/app/assets/javascripts/hr_lite/print.js +5 -0
  5. data/app/assets/stylesheets/hr_lite/hr_lite.css +72 -0
  6. data/app/controllers/hr_lite/admin/benefits_controller.rb +61 -0
  7. data/app/controllers/hr_lite/admin/employees_controller.rb +1 -1
  8. data/app/controllers/hr_lite/admin/expense_categories_controller.rb +43 -0
  9. data/app/controllers/hr_lite/admin/holidays_controller.rb +7 -0
  10. data/app/controllers/hr_lite/admin/leave_balances_controller.rb +4 -1
  11. data/app/controllers/hr_lite/admin/leave_requests_controller.rb +24 -1
  12. data/app/controllers/hr_lite/admin/payroll_line_items_controller.rb +47 -0
  13. data/app/controllers/hr_lite/admin/payroll_runs_controller.rb +3 -1
  14. data/app/controllers/hr_lite/admin/policies_controller.rb +29 -0
  15. data/app/controllers/hr_lite/hr_requests_controller.rb +2 -0
  16. data/app/controllers/hr_lite/id_cards_controller.rb +25 -0
  17. data/app/controllers/hr_lite/leave_requests_controller.rb +3 -1
  18. data/app/controllers/hr_lite/salary_slips_controller.rb +6 -6
  19. data/app/helpers/hr_lite/application_helper.rb +21 -6
  20. data/app/jobs/hr_lite/payroll_auto_draft_job.rb +4 -3
  21. data/app/jobs/hr_lite/slips_ready_job.rb +10 -0
  22. data/app/models/hr_lite/audit_log.rb +1 -1
  23. data/app/models/hr_lite/benefit_enrolment.rb +1 -1
  24. data/app/models/hr_lite/employee_profile.rb +21 -3
  25. data/app/models/hr_lite/hr_request.rb +12 -3
  26. data/app/models/hr_lite/leave_balance.rb +2 -1
  27. data/app/models/hr_lite/leave_request.rb +51 -19
  28. data/app/models/hr_lite/payroll_line_item.rb +5 -3
  29. data/app/models/hr_lite/payroll_run.rb +19 -3
  30. data/app/models/hr_lite/policy.rb +15 -0
  31. data/app/models/hr_lite/salary_slip.rb +6 -0
  32. data/app/models/hr_lite/setting.rb +1 -1
  33. data/app/services/hr_lite/attendance_summary.rb +12 -15
  34. data/app/views/hr_lite/admin/benefits/index.html.erb +65 -0
  35. data/app/views/hr_lite/admin/benefits/new.html.erb +37 -0
  36. data/app/views/hr_lite/admin/employees/_form.html.erb +5 -0
  37. data/app/views/hr_lite/admin/employees/show.html.erb +1 -0
  38. data/app/views/hr_lite/admin/expense_categories/_form.html.erb +16 -0
  39. data/app/views/hr_lite/admin/expense_categories/edit.html.erb +3 -0
  40. data/app/views/hr_lite/admin/expense_categories/index.html.erb +30 -0
  41. data/app/views/hr_lite/admin/expense_categories/new.html.erb +3 -0
  42. data/app/views/hr_lite/admin/hr_requests/show.html.erb +3 -0
  43. data/app/views/hr_lite/admin/leave_balances/index.html.erb +4 -0
  44. data/app/views/hr_lite/admin/leave_requests/index.html.erb +3 -0
  45. data/app/views/hr_lite/admin/leave_requests/new.html.erb +35 -0
  46. data/app/views/hr_lite/admin/leave_requests/show.html.erb +3 -0
  47. data/app/views/hr_lite/admin/leave_types/index.html.erb +1 -0
  48. data/app/views/hr_lite/admin/payroll_line_items/index.html.erb +47 -0
  49. data/app/views/hr_lite/admin/payroll_line_items/new.html.erb +42 -0
  50. data/app/views/hr_lite/admin/payroll_runs/show.html.erb +1 -0
  51. data/app/views/hr_lite/admin/policies/index.html.erb +27 -0
  52. data/app/views/hr_lite/admin/policies/new.html.erb +22 -0
  53. data/app/views/hr_lite/admin/salary_structures/_form.html.erb +5 -1
  54. data/app/views/hr_lite/admin/shared/_approvals_tabs.html.erb +3 -1
  55. data/app/views/hr_lite/id_cards/show.html.erb +86 -0
  56. data/app/views/hr_lite/leave_requests/index.html.erb +1 -0
  57. data/app/views/hr_lite/leave_requests/new.html.erb +1 -0
  58. data/app/views/hr_lite/salary_slips/index.html.erb +1 -1
  59. data/app/views/hr_lite/shared/_bell.html.erb +3 -0
  60. data/app/views/layouts/hr_lite/application.html.erb +6 -4
  61. data/config/routes.rb +9 -1
  62. data/db/migrate/20260927100145_add_id_card_fields_to_hr_lite_employee_profiles.rb +6 -0
  63. data/db/migrate/20260927101031_add_created_by_id_to_hr_lite_leave_requests.rb +5 -0
  64. data/db/migrate/20260929081109_add_paid_days_to_hr_lite_leave_requests.rb +5 -0
  65. data/lib/hr_lite/configuration.rb +15 -2
  66. data/lib/hr_lite/notifications.rb +10 -5
  67. data/lib/hr_lite/version.rb +1 -1
  68. data/lib/hr_lite.rb +1 -0
  69. metadata +38 -1
@@ -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
@@ -9,9 +9,12 @@ module HrLite
9
9
  :time_zone, :currency_symbol, :on_designation_change,
10
10
  :leadership_emails, :extra_stylesheets, :superadmin_emails,
11
11
  :mailer_from, :public_url_base, :notification_matrix, :back_link,
12
- :onboard_user, :offboard_user, :invite_url_for
12
+ :onboard_user, :offboard_user, :invite_url_for,
13
+ # ->(user) { { url:, unread: } } — shows a notifications link in
14
+ # the HR shell; nil (default) shows nothing.
15
+ :notifications
13
16
 
14
- attr_reader :leave_year_start_month
17
+ attr_reader :leave_year_start_month, :slip_release_day
15
18
 
16
19
  # Misconfiguration must fail at boot, not as production 500s on every
17
20
  # balance screen. Accepts "7" (ENV-friendly) and validates 1..12.
@@ -24,6 +27,15 @@ module HrLite
24
27
  @leave_year_start_month = month
25
28
  end
26
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
+
27
39
  # 0.1.0 pre-release name for public_url_base; kept as an alias so early
28
40
  # adopters' initializers don't break.
29
41
  alias_method :mail_link_base, :public_url_base
@@ -64,6 +76,7 @@ module HrLite
64
76
  @notification_matrix = nil # resolved lazily to Notifications::DEFAULT_MATRIX
65
77
  @back_link = nil # optional {label:, url:} for the shell nav
66
78
  @leave_year_start_month = 1 # 1 = calendar year; 7 = July–June leave year
79
+ @slip_release_day = nil # e.g. 10 = slips open on the 10th of the next month
67
80
 
68
81
  # Leadership onboarding/offboarding. onboard_user must return a saved
69
82
  # user record (default: create on user_class with whatever of
@@ -12,7 +12,7 @@ module HrLite
12
12
  # the matrix is purely the on/off routing table.
13
13
  module Notifications
14
14
  DEFAULT_MATRIX = {
15
- "leave.requested" => { bell: true, email: false, leadership_email: true, leadership_bell: true },
15
+ "leave.requested" => { bell: true, email: true, leadership_email: true, leadership_bell: true },
16
16
  "leave.approved" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
17
17
  "leave.rejected" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
18
18
  "leave.cancelled" => { bell: true, email: false, leadership_email: true, leadership_bell: false },
@@ -38,17 +38,18 @@ module HrLite
38
38
  "expense.approved" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
39
39
  "expense.rejected" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
40
40
  "expense.reimbursed" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
41
- "hr_request.raised" => { bell: true, email: false, leadership_email: false, leadership_bell: false },
41
+ "hr_request.raised" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
42
42
  "hr_request.assigned" => { bell: true, email: false, leadership_email: false, leadership_bell: false },
43
43
  "hr_request.resolved" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
44
44
  "policy.published" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
45
+ "holiday.published" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
45
46
  "digest.daily" => { bell: false, email: false, leadership_email: true, leadership_bell: false },
46
47
  "resignation.submitted" => { bell: true, email: false, leadership_email: true, leadership_bell: true },
47
48
  "resignation.accepted" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
48
49
  "resignation.withdrawn" => { bell: true, email: false, leadership_email: true, leadership_bell: false },
49
50
  "employee.onboarded" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
50
- "payroll.draft_ready" => { bell: false, email: false, leadership_email: true, leadership_bell: true },
51
- "leave.team_notice" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
51
+ "payroll.draft_ready" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
52
+ "leave.team_notice" => { bell: true, email: false, leadership_email: false, leadership_bell: false },
52
53
  "comp_off.requested" => { bell: true, email: false, leadership_email: true, leadership_bell: true },
53
54
  "comp_off.approved" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
54
55
  "comp_off.rejected" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
@@ -72,8 +73,10 @@ module HrLite
72
73
  # employee-scoped path ("Your appraisal has been shared", /appraisals/7):
73
74
  # fanned out verbatim, leadership read them as being about themselves and
74
75
  # followed a link their own scope 404s or resolves to their own record.
76
+ # `skip_leadership:` is for a delayed employee half of an event whose
77
+ # leadership copy already went out.
75
78
  def publish(event, title:, body: nil, path: nil, bell_to: [], email_to: [], lines: [],
76
- diff: nil, link_url: nil, leadership: {})
79
+ diff: nil, link_url: nil, leadership: {}, skip_leadership: false)
77
80
  row = matrix[event.to_s]
78
81
  unless row
79
82
  Rails.logger.warn("[hr_lite] unknown notification event #{event}")
@@ -86,6 +89,8 @@ module HrLite
86
89
 
87
90
  deliver_bells(event, row, bell_to, title, body, path)
88
91
  deliver_emails(row, email_to, title, body, path, lines, link_url)
92
+ return if skip_leadership
93
+
89
94
  deliver_leadership_email(event, row, lead_title, lead_body, lead_path, lines, diff)
90
95
  deliver_leadership_bells(event, row, bell_to, lead_title, lead_body, lead_path)
91
96
  nil
@@ -1,3 +1,3 @@
1
1
  module HrLite
2
- VERSION = "0.15.0"
2
+ VERSION = "0.18.0"
3
3
  end
data/lib/hr_lite.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "hr_lite/version"
2
2
  require "hr_lite/engine"
3
+ require "rqrcode"
3
4
  require "hr_lite/configuration"
4
5
  require "hr_lite/current"
5
6
  require "hr_lite/leave_year"
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.15.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kshitiz sinha
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rqrcode
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
40
54
  description: Mountable Rails engine providing attendance with geolocation, leave management,
41
55
  holiday calendar, Indian payroll (PF/ESI/PT/TDS) with salary-slip PDFs, kudos with
42
56
  @mentions, appraisals and promotions — integrated into a host app via config hooks.
@@ -53,6 +67,7 @@ files:
53
67
  - app/assets/javascripts/hr_lite/confirm.js
54
68
  - app/assets/javascripts/hr_lite/geo_punch.js
55
69
  - app/assets/javascripts/hr_lite/mention.js
70
+ - app/assets/javascripts/hr_lite/print.js
56
71
  - app/assets/stylesheets/hr_lite/application.css
57
72
  - app/assets/stylesheets/hr_lite/hr_lite.css
58
73
  - app/controllers/hr_lite/admin/appraisals_controller.rb
@@ -60,11 +75,13 @@ files:
60
75
  - app/controllers/hr_lite/admin/attendances_controller.rb
61
76
  - app/controllers/hr_lite/admin/audit_logs_controller.rb
62
77
  - app/controllers/hr_lite/admin/base_controller.rb
78
+ - app/controllers/hr_lite/admin/benefits_controller.rb
63
79
  - app/controllers/hr_lite/admin/checklists_controller.rb
64
80
  - app/controllers/hr_lite/admin/comp_off_requests_controller.rb
65
81
  - app/controllers/hr_lite/admin/designation_changes_controller.rb
66
82
  - app/controllers/hr_lite/admin/documents_controller.rb
67
83
  - app/controllers/hr_lite/admin/employees_controller.rb
84
+ - app/controllers/hr_lite/admin/expense_categories_controller.rb
68
85
  - app/controllers/hr_lite/admin/expenses_controller.rb
69
86
  - app/controllers/hr_lite/admin/holidays_controller.rb
70
87
  - app/controllers/hr_lite/admin/hr_requests_controller.rb
@@ -75,7 +92,9 @@ files:
75
92
  - app/controllers/hr_lite/admin/loans_controller.rb
76
93
  - app/controllers/hr_lite/admin/office_locations_controller.rb
77
94
  - app/controllers/hr_lite/admin/overview_controller.rb
95
+ - app/controllers/hr_lite/admin/payroll_line_items_controller.rb
78
96
  - app/controllers/hr_lite/admin/payroll_runs_controller.rb
97
+ - app/controllers/hr_lite/admin/policies_controller.rb
79
98
  - app/controllers/hr_lite/admin/regularization_requests_controller.rb
80
99
  - app/controllers/hr_lite/admin/reports_controller.rb
81
100
  - app/controllers/hr_lite/admin/resignations_controller.rb
@@ -101,6 +120,7 @@ files:
101
120
  - app/controllers/hr_lite/holidays_controller.rb
102
121
  - app/controllers/hr_lite/home_controller.rb
103
122
  - app/controllers/hr_lite/hr_requests_controller.rb
123
+ - app/controllers/hr_lite/id_cards_controller.rb
104
124
  - app/controllers/hr_lite/kudos_controller.rb
105
125
  - app/controllers/hr_lite/leave_balances_controller.rb
106
126
  - app/controllers/hr_lite/leave_requests_controller.rb
@@ -120,6 +140,7 @@ files:
120
140
  - app/jobs/hr_lite/document_expiry_job.rb
121
141
  - app/jobs/hr_lite/leave_year_rollover_job.rb
122
142
  - app/jobs/hr_lite/payroll_auto_draft_job.rb
143
+ - app/jobs/hr_lite/slips_ready_job.rb
123
144
  - app/mailers/hr_lite/application_mailer.rb
124
145
  - app/mailers/hr_lite/event_mailer.rb
125
146
  - app/models/concerns/hr_lite/approvable.rb
@@ -197,6 +218,8 @@ files:
197
218
  - app/views/hr_lite/admin/attendances/index.html.erb
198
219
  - app/views/hr_lite/admin/attendances/show.html.erb
199
220
  - app/views/hr_lite/admin/audit_logs/index.html.erb
221
+ - app/views/hr_lite/admin/benefits/index.html.erb
222
+ - app/views/hr_lite/admin/benefits/new.html.erb
200
223
  - app/views/hr_lite/admin/checklists/index.html.erb
201
224
  - app/views/hr_lite/admin/comp_off_requests/index.html.erb
202
225
  - app/views/hr_lite/admin/comp_off_requests/show.html.erb
@@ -208,12 +231,17 @@ files:
208
231
  - app/views/hr_lite/admin/employees/index.html.erb
209
232
  - app/views/hr_lite/admin/employees/new.html.erb
210
233
  - app/views/hr_lite/admin/employees/show.html.erb
234
+ - app/views/hr_lite/admin/expense_categories/_form.html.erb
235
+ - app/views/hr_lite/admin/expense_categories/edit.html.erb
236
+ - app/views/hr_lite/admin/expense_categories/index.html.erb
237
+ - app/views/hr_lite/admin/expense_categories/new.html.erb
211
238
  - app/views/hr_lite/admin/expenses/index.html.erb
212
239
  - app/views/hr_lite/admin/holidays/index.html.erb
213
240
  - app/views/hr_lite/admin/hr_requests/index.html.erb
214
241
  - app/views/hr_lite/admin/hr_requests/show.html.erb
215
242
  - app/views/hr_lite/admin/leave_balances/index.html.erb
216
243
  - app/views/hr_lite/admin/leave_requests/index.html.erb
244
+ - app/views/hr_lite/admin/leave_requests/new.html.erb
217
245
  - app/views/hr_lite/admin/leave_requests/show.html.erb
218
246
  - app/views/hr_lite/admin/leave_types/_form.html.erb
219
247
  - app/views/hr_lite/admin/leave_types/edit.html.erb
@@ -227,9 +255,13 @@ files:
227
255
  - app/views/hr_lite/admin/office_locations/index.html.erb
228
256
  - app/views/hr_lite/admin/office_locations/new.html.erb
229
257
  - app/views/hr_lite/admin/overview/index.html.erb
258
+ - app/views/hr_lite/admin/payroll_line_items/index.html.erb
259
+ - app/views/hr_lite/admin/payroll_line_items/new.html.erb
230
260
  - app/views/hr_lite/admin/payroll_runs/index.html.erb
231
261
  - app/views/hr_lite/admin/payroll_runs/new.html.erb
232
262
  - app/views/hr_lite/admin/payroll_runs/show.html.erb
263
+ - app/views/hr_lite/admin/policies/index.html.erb
264
+ - app/views/hr_lite/admin/policies/new.html.erb
233
265
  - app/views/hr_lite/admin/regularization_requests/index.html.erb
234
266
  - app/views/hr_lite/admin/regularization_requests/show.html.erb
235
267
  - app/views/hr_lite/admin/reports/index.html.erb
@@ -275,6 +307,7 @@ files:
275
307
  - app/views/hr_lite/hr_requests/index.html.erb
276
308
  - app/views/hr_lite/hr_requests/new.html.erb
277
309
  - app/views/hr_lite/hr_requests/show.html.erb
310
+ - app/views/hr_lite/id_cards/show.html.erb
278
311
  - app/views/hr_lite/kudos/_kudo.html.erb
279
312
  - app/views/hr_lite/kudos/index.html.erb
280
313
  - app/views/hr_lite/leave_balances/index.html.erb
@@ -294,6 +327,7 @@ files:
294
327
  - app/views/hr_lite/salary_slips/index.html.erb
295
328
  - app/views/hr_lite/salary_slips/pdf.html.erb
296
329
  - app/views/hr_lite/salary_slips/show.html.erb
330
+ - app/views/hr_lite/shared/_bell.html.erb
297
331
  - app/views/hr_lite/shared/_form_errors.html.erb
298
332
  - app/views/hr_lite/shared/_pagination.html.erb
299
333
  - app/views/hr_lite/tax_declarations/show.html.erb
@@ -337,6 +371,9 @@ files:
337
371
  - db/migrate/20260818003616_create_hr_lite_documents_and_declarations.rb
338
372
  - db/migrate/20260818004707_create_hr_lite_employee_services.rb
339
373
  - db/migrate/20260818010401_create_hr_lite_assets_and_onboarding.rb
374
+ - db/migrate/20260927100145_add_id_card_fields_to_hr_lite_employee_profiles.rb
375
+ - db/migrate/20260927101031_add_created_by_id_to_hr_lite_leave_requests.rb
376
+ - db/migrate/20260929081109_add_paid_days_to_hr_lite_leave_requests.rb
340
377
  - lib/generators/hr_lite/install/install_generator.rb
341
378
  - lib/generators/hr_lite/install/templates/AFTER_INSTALL
342
379
  - lib/generators/hr_lite/install/templates/initializer.rb