hr_lite 0.9.0 → 0.12.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.
@@ -0,0 +1,108 @@
1
+ class CreateHrLiteEmployeeServices < ActiveRecord::Migration[8.1]
2
+ # Four things an employee has to leave the system to do today: claim an
3
+ # expense, see what insurance they have, ask HR a question, and read the
4
+ # policy they are being held to.
5
+ #
6
+ # Expenses and requests route through the approval engine from 0.9.0
7
+ # rather than growing a fifth and sixth approve/reject of their own.
8
+ def change
9
+ create_table :hr_lite_expense_categories do |t|
10
+ t.string :name, null: false
11
+ t.text :monthly_cap # encrypted; null = uncapped
12
+ t.boolean :receipt_required, null: false, default: true
13
+ t.boolean :active, null: false, default: true
14
+ t.timestamps
15
+ end
16
+ add_index :hr_lite_expense_categories, :name, unique: true
17
+
18
+ create_table :hr_lite_expenses do |t|
19
+ t.bigint :user_id, null: false
20
+ t.references :category, null: false, index: true,
21
+ foreign_key: { to_table: :hr_lite_expense_categories }
22
+ t.text :amount, null: false # encrypted
23
+ t.date :spent_on, null: false
24
+ t.string :description, null: false
25
+ # draft | submitted | approved | rejected | reimbursed | cancelled
26
+ t.string :status, null: false, default: "draft"
27
+ t.datetime :submitted_at
28
+ t.string :decision_note
29
+ # Which payroll month paid it out, once it was reimbursed.
30
+ t.date :reimbursed_in
31
+ t.timestamps
32
+ end
33
+ add_index :hr_lite_expenses, %i[user_id status]
34
+ add_check_constraint :hr_lite_expenses,
35
+ "status IN ('draft', 'submitted', 'approved', 'rejected', 'reimbursed', 'cancelled')",
36
+ name: "hr_lite_expenses_status_check"
37
+
38
+ create_table :hr_lite_benefits do |t|
39
+ t.string :name, null: false
40
+ # health | life | accident | other
41
+ t.string :kind, null: false, default: "health"
42
+ t.string :provider
43
+ t.string :policy_number
44
+ t.text :coverage # encrypted — sum assured
45
+ t.text :employer_premium # encrypted
46
+ t.text :employee_premium # encrypted
47
+ t.date :effective_from
48
+ t.date :expires_on
49
+ t.text :notes
50
+ t.boolean :active, null: false, default: true
51
+ t.timestamps
52
+ end
53
+
54
+ create_table :hr_lite_benefit_enrolments do |t|
55
+ t.references :benefit, null: false, index: true,
56
+ foreign_key: { to_table: :hr_lite_benefits, on_delete: :cascade }
57
+ t.bigint :user_id, null: false
58
+ t.date :enrolled_on, null: false
59
+ t.date :ended_on
60
+ # Dependants covered, as a count — names and dates of birth are the
61
+ # kind of family data this engine has no reason to hold.
62
+ t.integer :dependants, null: false, default: 0
63
+ t.timestamps
64
+ end
65
+ add_index :hr_lite_benefit_enrolments, %i[benefit_id user_id], unique: true
66
+
67
+ create_table :hr_lite_hr_requests do |t|
68
+ t.bigint :user_id, null: false
69
+ # salary_certificate | address_change | bank_change | payroll_query | ...
70
+ t.string :category, null: false
71
+ t.string :subject, null: false
72
+ t.text :body
73
+ # open | in_progress | resolved | closed | cancelled
74
+ t.string :status, null: false, default: "open"
75
+ t.bigint :assigned_to_id
76
+ t.datetime :resolved_at
77
+ t.text :resolution
78
+ t.timestamps
79
+ end
80
+ add_index :hr_lite_hr_requests, %i[user_id status]
81
+ add_index :hr_lite_hr_requests, :assigned_to_id
82
+ add_check_constraint :hr_lite_hr_requests,
83
+ "status IN ('open', 'in_progress', 'resolved', 'closed', 'cancelled')",
84
+ name: "hr_lite_hr_requests_status_check"
85
+
86
+ create_table :hr_lite_policies do |t|
87
+ t.string :title, null: false
88
+ t.text :body, null: false
89
+ t.integer :version, null: false, default: 1
90
+ t.date :effective_from, null: false
91
+ t.boolean :acknowledgement_required, null: false, default: false
92
+ t.boolean :published, null: false, default: false
93
+ t.timestamps
94
+ end
95
+ add_index :hr_lite_policies, %i[title version], unique: true
96
+
97
+ create_table :hr_lite_policy_acknowledgements do |t|
98
+ t.references :policy, null: false, index: true,
99
+ foreign_key: { to_table: :hr_lite_policies, on_delete: :cascade }
100
+ t.bigint :user_id, null: false
101
+ t.datetime :acknowledged_at, null: false
102
+ t.timestamps
103
+ end
104
+ # One acknowledgement per person per VERSION: re-issuing a policy has to
105
+ # ask everybody again, which is the entire point of versioning it.
106
+ add_index :hr_lite_policy_acknowledgements, %i[policy_id user_id], unique: true
107
+ end
108
+ end
@@ -27,6 +27,21 @@ module HrLite
27
27
  # An approval past its deadline. Leadership hears too — a decision
28
28
  # nobody is making is a process problem, not just one person's inbox.
29
29
  "approval.escalated" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
30
+ # Tax declarations. The submission bells whoever verifies them; the
31
+ # decision goes back to the employee, whose year's TDS depends on it.
32
+ "tax.declaration_submitted" => { bell: true, email: false, leadership_email: false, leadership_bell: false },
33
+ "tax.declaration_decided" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
34
+ # A document about to lapse — a passport or a visa is somebody's right
35
+ # to work, and finding out late is the whole problem.
36
+ "document.expiring" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
37
+ "expense.submitted" => { bell: true, email: false, leadership_email: false, leadership_bell: false },
38
+ "expense.approved" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
39
+ "expense.rejected" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
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 },
42
+ "hr_request.assigned" => { bell: true, email: false, leadership_email: false, leadership_bell: false },
43
+ "hr_request.resolved" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
44
+ "policy.published" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
30
45
  "digest.daily" => { bell: false, email: false, leadership_email: true, leadership_bell: false },
31
46
  "resignation.submitted" => { bell: true, email: false, leadership_email: true, leadership_bell: true },
32
47
  "resignation.accepted" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
@@ -43,6 +43,19 @@ module HrLite
43
43
  "appraisal.manage" => [ "Growth", "Write, share and act on appraisals and promotions" ],
44
44
  "resignation.view" => [ "Lifecycle", "See resignations" ],
45
45
  "resignation.manage" => [ "Lifecycle", "Accept resignations and set the last working day" ],
46
+ "document.view" => [ "Documents", "Open other people's documents" ],
47
+ "document.manage" => [ "Documents", "Upload, verify and open identity and bank documents" ],
48
+ "tax.view" => [ "Payroll", "See tax declarations" ],
49
+ "tax.manage" => [ "Payroll", "Verify tax declarations and the proof behind them" ],
50
+ "expense.claim" => [ "Expenses", "Claim expenses" ],
51
+ "expense.approve" => [ "Expenses", "Approve and reject expense claims" ],
52
+ "expense.reimburse" => [ "Expenses", "Mark claims reimbursed with a payroll month" ],
53
+ "benefit.view" => [ "Benefits", "See benefits and who is enrolled" ],
54
+ "benefit.manage" => [ "Benefits", "Add benefits and enrol people" ],
55
+ "hr_request.raise" => [ "Help desk", "Raise a request with HR" ],
56
+ "hr_request.manage" => [ "Help desk", "Answer and assign HR requests" ],
57
+ "policy.view" => [ "Policies", "Read published policies" ],
58
+ "policy.manage" => [ "Policies", "Write, publish and re-issue policies" ],
46
59
  "settings.manage" => [ "Administration", "Change company settings, offices and policy" ],
47
60
  "audit.view" => [ "Administration", "Read the audit trail" ],
48
61
  "audit.view_money" => [ "Administration", "Read audit rows about pay, appraisals and promotions" ],
@@ -17,7 +17,9 @@ module HrLite
17
17
  "leave.request" => "self", "leave.view" => "self",
18
18
  "attendance.view" => "self", "payroll.view" => "self",
19
19
  "profile.view" => "self", "appraisal.view" => "self",
20
- "resignation.view" => "self"
20
+ "resignation.view" => "self", "document.view" => "self", "tax.view" => "self",
21
+ "expense.claim" => "self", "benefit.view" => "self",
22
+ "hr_request.raise" => "self", "policy.view" => "all"
21
23
  }
22
24
  },
23
25
  Role::MANAGER => {
@@ -35,7 +37,10 @@ module HrLite
35
37
  "leave.request" => "self", "leave.view" => "all", "leave.approve" => "all",
36
38
  "leave.manage" => "all", "attendance.view" => "all", "attendance.manage" => "all",
37
39
  "profile.view" => "all", "payroll.view" => "self",
38
- "appraisal.view" => "self", "resignation.view" => "all"
40
+ "appraisal.view" => "self", "resignation.view" => "all",
41
+ "document.view" => "all", "tax.view" => "self",
42
+ "expense.claim" => "self", "benefit.view" => "all", "benefit.manage" => "all",
43
+ "hr_request.raise" => "self", "hr_request.manage" => "all", "policy.view" => "all"
39
44
  }
40
45
  },
41
46
  Role::FINANCE => {
@@ -45,6 +50,9 @@ module HrLite
45
50
  "attendance.view" => "all", "profile.view" => "all",
46
51
  "payroll.view" => "all", "payroll.manage" => "all", "payroll.export" => "all",
47
52
  "salary.view" => "all", "salary.manage" => "all",
53
+ "tax.view" => "all", "tax.manage" => "all",
54
+ "expense.claim" => "self", "expense.approve" => "all", "expense.reimburse" => "all",
55
+ "policy.view" => "all",
48
56
  "audit.view" => "all", "audit.view_money" => "all"
49
57
  }
50
58
  },
@@ -55,7 +63,9 @@ module HrLite
55
63
  "leave.manage" => "all", "attendance.view" => "all", "attendance.manage" => "all",
56
64
  "profile.view" => "all", "profile.manage" => "all",
57
65
  "resignation.view" => "all", "resignation.manage" => "all",
58
- "settings.manage" => "all", "audit.view" => "all", "payroll.view" => "self"
66
+ "settings.manage" => "all", "audit.view" => "all", "payroll.view" => "self",
67
+ "document.view" => "all", "expense.approve" => "all", "benefit.manage" => "all",
68
+ "hr_request.manage" => "all", "policy.view" => "all", "policy.manage" => "all"
59
69
  }
60
70
  },
61
71
  Role::SUPER_ADMIN => {
@@ -1,3 +1,3 @@
1
1
  module HrLite
2
- VERSION = "0.9.0"
2
+ VERSION = "0.12.0"
3
3
  end
@@ -4,7 +4,8 @@ namespace :hr_lite do
4
4
  require "hr_lite/seeds"
5
5
  require "hr_lite/role_seeds"
6
6
  require "hr_lite/statutory_seeds"
7
- created = HrLite::Seeds.run! + HrLite::RoleSeeds.call + HrLite::StatutorySeeds.call
7
+ created = HrLite::Seeds.run! + HrLite::RoleSeeds.call + HrLite::StatutorySeeds.call +
8
+ HrLite::SalaryComponent.seed_defaults!
8
9
  puts created.any? ? "hr_lite:seed created: #{created.join(', ')}" : "hr_lite:seed — nothing to do"
9
10
  end
10
11
 
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.9.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kshitiz sinha
@@ -102,6 +102,7 @@ files:
102
102
  - app/jobs/hr_lite/application_job.rb
103
103
  - app/jobs/hr_lite/approval_escalation_job.rb
104
104
  - app/jobs/hr_lite/daily_digest_job.rb
105
+ - app/jobs/hr_lite/document_expiry_job.rb
105
106
  - app/jobs/hr_lite/leave_year_rollover_job.rb
106
107
  - app/jobs/hr_lite/payroll_auto_draft_job.rb
107
108
  - app/mailers/hr_lite/application_mailer.rb
@@ -117,27 +118,41 @@ files:
117
118
  - app/models/hr_lite/approval_step.rb
118
119
  - app/models/hr_lite/attendance_record.rb
119
120
  - app/models/hr_lite/audit_log.rb
121
+ - app/models/hr_lite/benefit.rb
122
+ - app/models/hr_lite/benefit_enrolment.rb
120
123
  - app/models/hr_lite/comp_off_request.rb
121
124
  - app/models/hr_lite/designation_change.rb
125
+ - app/models/hr_lite/document.rb
122
126
  - app/models/hr_lite/employee_profile.rb
127
+ - app/models/hr_lite/expense.rb
128
+ - app/models/hr_lite/expense_category.rb
123
129
  - app/models/hr_lite/holiday.rb
130
+ - app/models/hr_lite/hr_request.rb
124
131
  - app/models/hr_lite/kudo.rb
125
132
  - app/models/hr_lite/kudo_mention.rb
126
133
  - app/models/hr_lite/leave_balance.rb
127
134
  - app/models/hr_lite/leave_request.rb
128
135
  - app/models/hr_lite/leave_type.rb
136
+ - app/models/hr_lite/loan.rb
137
+ - app/models/hr_lite/loan_repayment.rb
129
138
  - app/models/hr_lite/office_location.rb
139
+ - app/models/hr_lite/payroll_line_item.rb
130
140
  - app/models/hr_lite/payroll_run.rb
141
+ - app/models/hr_lite/policy.rb
142
+ - app/models/hr_lite/policy_acknowledgement.rb
131
143
  - app/models/hr_lite/professional_tax_slab.rb
132
144
  - app/models/hr_lite/regularization_request.rb
133
145
  - app/models/hr_lite/resignation.rb
134
146
  - app/models/hr_lite/role.rb
135
147
  - app/models/hr_lite/role_assignment.rb
136
148
  - app/models/hr_lite/role_grant.rb
149
+ - app/models/hr_lite/salary_component.rb
137
150
  - app/models/hr_lite/salary_slip.rb
138
151
  - app/models/hr_lite/salary_structure.rb
139
152
  - app/models/hr_lite/setting.rb
140
153
  - app/models/hr_lite/statutory_rate_card_record.rb
154
+ - app/models/hr_lite/tax_declaration.rb
155
+ - app/models/hr_lite/tax_declaration_item.rb
141
156
  - app/services/hr_lite/access.rb
142
157
  - app/services/hr_lite/approval_route.rb
143
158
  - app/services/hr_lite/attendance_puncher.rb
@@ -273,6 +288,9 @@ files:
273
288
  - db/migrate/20260817183629_seed_hr_lite_roles_from_email_tiers.rb
274
289
  - db/migrate/20260817190159_create_hr_lite_statutory_rate_cards.rb
275
290
  - db/migrate/20260818001151_create_hr_lite_approvals.rb
291
+ - db/migrate/20260818002627_create_hr_lite_payroll_components_and_loans.rb
292
+ - db/migrate/20260818003616_create_hr_lite_documents_and_declarations.rb
293
+ - db/migrate/20260818004707_create_hr_lite_employee_services.rb
276
294
  - lib/generators/hr_lite/install/install_generator.rb
277
295
  - lib/generators/hr_lite/install/templates/AFTER_INSTALL
278
296
  - lib/generators/hr_lite/install/templates/initializer.rb