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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +123 -1
- data/app/jobs/hr_lite/document_expiry_job.rb +28 -0
- data/app/models/hr_lite/approval_flow.rb +1 -1
- data/app/models/hr_lite/benefit.rb +37 -0
- data/app/models/hr_lite/benefit_enrolment.rb +30 -0
- data/app/models/hr_lite/document.rb +95 -0
- data/app/models/hr_lite/expense.rb +142 -0
- data/app/models/hr_lite/expense_category.rb +33 -0
- data/app/models/hr_lite/hr_request.rb +75 -0
- data/app/models/hr_lite/loan.rb +65 -0
- data/app/models/hr_lite/loan_repayment.rb +14 -0
- data/app/models/hr_lite/payroll_line_item.rb +57 -0
- data/app/models/hr_lite/payroll_run.rb +34 -0
- data/app/models/hr_lite/policy.rb +59 -0
- data/app/models/hr_lite/policy_acknowledgement.rb +13 -0
- data/app/models/hr_lite/salary_component.rb +59 -0
- data/app/models/hr_lite/tax_declaration.rb +93 -0
- data/app/models/hr_lite/tax_declaration_item.rb +32 -0
- data/app/services/hr_lite/slip_builder.rb +76 -3
- data/db/migrate/20260818002627_create_hr_lite_payroll_components_and_loans.rb +72 -0
- data/db/migrate/20260818003616_create_hr_lite_documents_and_declarations.rb +73 -0
- data/db/migrate/20260818004707_create_hr_lite_employee_services.rb +108 -0
- data/lib/hr_lite/notifications.rb +15 -0
- data/lib/hr_lite/permissions.rb +13 -0
- data/lib/hr_lite/role_seeds.rb +13 -3
- data/lib/hr_lite/version.rb +1 -1
- data/lib/tasks/hr_lite_tasks.rake +2 -1
- metadata +19 -1
|
@@ -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 },
|
data/lib/hr_lite/permissions.rb
CHANGED
|
@@ -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" ],
|
data/lib/hr_lite/role_seeds.rb
CHANGED
|
@@ -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 => {
|
data/lib/hr_lite/version.rb
CHANGED
|
@@ -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.
|
|
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
|