hr_lite 0.2.0 → 0.3.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +67 -0
  3. data/README.md +2 -1
  4. data/app/assets/stylesheets/hr_lite/hr_lite.css +17 -4
  5. data/app/controllers/hr_lite/admin/comp_off_requests_controller.rb +38 -0
  6. data/app/controllers/hr_lite/admin/employees_controller.rb +4 -1
  7. data/app/controllers/hr_lite/admin/leave_types_controller.rb +1 -1
  8. data/app/controllers/hr_lite/admin/regularization_requests_controller.rb +38 -0
  9. data/app/controllers/hr_lite/comp_off_requests_controller.rb +46 -0
  10. data/app/controllers/hr_lite/regularization_requests_controller.rb +36 -0
  11. data/app/controllers/hr_lite/team_controller.rb +11 -0
  12. data/app/helpers/hr_lite/application_helper.rb +61 -3
  13. data/app/mailers/hr_lite/event_mailer.rb +2 -2
  14. data/app/models/hr_lite/comp_off_request.rb +177 -0
  15. data/app/models/hr_lite/leave_request.rb +18 -0
  16. data/app/models/hr_lite/leave_type.rb +17 -0
  17. data/app/models/hr_lite/regularization_request.rb +181 -0
  18. data/app/services/hr_lite/team_day.rb +84 -0
  19. data/app/views/hr_lite/admin/comp_off_requests/index.html.erb +37 -0
  20. data/app/views/hr_lite/admin/comp_off_requests/show.html.erb +47 -0
  21. data/app/views/hr_lite/admin/employees/_form.html.erb +3 -1
  22. data/app/views/hr_lite/admin/leave_requests/index.html.erb +2 -0
  23. data/app/views/hr_lite/admin/leave_types/_form.html.erb +4 -0
  24. data/app/views/hr_lite/admin/regularization_requests/index.html.erb +37 -0
  25. data/app/views/hr_lite/admin/regularization_requests/show.html.erb +50 -0
  26. data/app/views/hr_lite/admin/shared/_approvals_tabs.html.erb +11 -0
  27. data/app/views/hr_lite/attendance/show.html.erb +3 -0
  28. data/app/views/hr_lite/comp_off_requests/index.html.erb +42 -0
  29. data/app/views/hr_lite/comp_off_requests/new.html.erb +28 -0
  30. data/app/views/hr_lite/leave_requests/index.html.erb +1 -0
  31. data/app/views/hr_lite/regularization_requests/index.html.erb +41 -0
  32. data/app/views/hr_lite/regularization_requests/new.html.erb +30 -0
  33. data/app/views/hr_lite/team/show.html.erb +48 -0
  34. data/app/views/layouts/hr_lite/application.html.erb +1 -1
  35. data/config/routes.rb +13 -0
  36. data/db/migrate/20260719104315_add_comp_off_to_hr_lite_leave_types.rb +6 -0
  37. data/db/migrate/20260719104316_create_hr_lite_comp_off_requests.rb +24 -0
  38. data/db/migrate/20260719104317_create_hr_lite_regularization_requests.rb +20 -0
  39. data/lib/hr_lite/configuration.rb +5 -1
  40. data/lib/hr_lite/notifications.rb +19 -6
  41. data/lib/hr_lite/seeds.rb +16 -1
  42. data/lib/hr_lite/version.rb +1 -1
  43. data/lib/hr_lite.rb +7 -0
  44. metadata +22 -1
@@ -0,0 +1,30 @@
1
+ <% content_for(:page_title) { "Raise a regularization ticket" } %>
2
+ <div class="hrl-page__head">
3
+ <h1 class="hrl-page__title">Raise a regularization ticket</h1>
4
+ </div>
5
+
6
+ <section class="hrl-card">
7
+ <%= form_with model: @request, url: hr_lite.regularization_requests_path, scope: :regularization_request, local: true do |f| %>
8
+ <%= render "hr_lite/shared/form_errors", record: @request %>
9
+ <div class="hrl-field">
10
+ <%= f.label :date, "Which day needs fixing?" %>
11
+ <%= f.date_field :date, value: @request.date&.strftime("%Y-%m-%d"), max: Date.current %>
12
+ </div>
13
+ <div class="hrl-field">
14
+ <%= f.label :check_in_at, "Actual check-in (leave blank if only check-out is missing)" %>
15
+ <%= f.datetime_local_field :check_in_at, value: @request.check_in_at&.strftime("%Y-%m-%dT%H:%M"), max: Date.current.strftime("%Y-%m-%dT23:59") %>
16
+ </div>
17
+ <div class="hrl-field">
18
+ <%= f.label :check_out_at, "Actual check-out (leave blank if only check-in is missing)" %>
19
+ <%= f.datetime_local_field :check_out_at, value: @request.check_out_at&.strftime("%Y-%m-%dT%H:%M"), max: Date.current.strftime("%Y-%m-%dT23:59") %>
20
+ </div>
21
+ <div class="hrl-field">
22
+ <%= f.label :reason, "Why was the punch missed? (required)" %>
23
+ <%= f.text_area :reason %>
24
+ </div>
25
+ <div class="hrl-form-actions">
26
+ <%= f.submit "Raise ticket", class: "hrl-btn hrl-btn--primary" %>
27
+ <a class="hrl-btn" href="<%= hr_lite.regularization_requests_path %>">Cancel</a>
28
+ </div>
29
+ <% end %>
30
+ </section>
@@ -0,0 +1,48 @@
1
+ <% content_for(:page_title) { "Team" } %>
2
+ <div class="hrl-page__head">
3
+ <h1 class="hrl-page__title">Team — <%= @date == Date.current ? "today" : @date.strftime("%A, %d %B") %></h1>
4
+ <div class="hrl-page__actions">
5
+ <a class="hrl-btn" aria-label="Previous day" href="<%= hr_lite.team_path(date: (@date - 1).strftime("%Y-%m-%d")) %>">&larr;</a>
6
+ <% unless @date == Date.current %>
7
+ <a class="hrl-btn" href="<%= hr_lite.team_path %>">Today</a>
8
+ <% end %>
9
+ <% if @date < Date.current %>
10
+ <a class="hrl-btn" aria-label="Next day" href="<%= hr_lite.team_path(date: (@date + 1).strftime("%Y-%m-%d")) %>">&rarr;</a>
11
+ <% end %>
12
+ </div>
13
+ </div>
14
+
15
+ <% kpis = @board.kpis %>
16
+ <div class="hrl-kpis">
17
+ <div class="hrl-kpi"><div class="hrl-kpi__value"><%= kpis[:checked_in] %></div><div class="hrl-kpi__label">Checked in</div></div>
18
+ <div class="hrl-kpi"><div class="hrl-kpi__value"><%= kpis[:on_leave] %></div><div class="hrl-kpi__label">On leave</div></div>
19
+ <div class="hrl-kpi"><div class="hrl-kpi__value"><%= kpis[:not_in] %></div><div class="hrl-kpi__label">Not in</div></div>
20
+ <div class="hrl-kpi"><div class="hrl-kpi__value"><%= @board.rows.size %></div><div class="hrl-kpi__label">Team size</div></div>
21
+ </div>
22
+
23
+ <section class="hrl-card">
24
+ <% if @board.rows.any? %>
25
+ <div class="hrl-table-wrap">
26
+ <table class="hrl-table hrl-table--stack">
27
+ <thead><tr><th>Name</th><th>Status</th><th>Hours <%= @date == Date.current ? "today" : "that day" %></th><th>Hours this month</th></tr></thead>
28
+ <tbody>
29
+ <% @board.rows.each do |row| %>
30
+ <tr>
31
+ <td data-label="Name">
32
+ <span><strong><%= hr_display_name(row.user) %></strong><% if row.profile&.designation.present? %>
33
+ <span class="hrl-small hrl-muted"> · <%= row.profile.designation %></span><% end %></span>
34
+ </td>
35
+ <td data-label="Status"><%= hrl_team_status(row) %></td>
36
+ <td data-label="Hours" class="hrl-num"><%= hrl_duration(row.day_seconds) %></td>
37
+ <td data-label="Hours this month" class="hrl-num"><%= hrl_duration(row.month_seconds) %></td>
38
+ </tr>
39
+ <% end %>
40
+ </tbody>
41
+ </table>
42
+ </div>
43
+ <% else %>
44
+ <p class="hrl-card--empty">Nobody to show for this date.</p>
45
+ <% end %>
46
+ <p class="hrl-small hrl-muted hrl-mt">Forgot a punch yourself?
47
+ <a href="<%= hr_lite.new_regularization_request_path %>">Raise a regularization ticket</a>.</p>
48
+ </section>
@@ -31,7 +31,7 @@
31
31
  <% end %>
32
32
 
33
33
  <% if hr_admin? || hr_leadership? %>
34
- <span class="hrl-side__group">Team</span>
34
+ <span class="hrl-side__group">Manage</span>
35
35
  <% hrl_nav_items(HrLite::ApplicationHelper::ADMIN_NAV_ITEMS).each do |item| %>
36
36
  <%= hrl_nav_link(item) %>
37
37
  <% end %>
data/config/routes.rb CHANGED
@@ -13,6 +13,13 @@ HrLite::Engine.routes.draw do
13
13
  member { post :cancel }
14
14
  end
15
15
  resources :leave_balances, only: :index
16
+ resources :comp_off_requests, only: %i[index new create] do
17
+ member { post :cancel }
18
+ end
19
+ resources :regularization_requests, only: %i[index new create] do
20
+ member { post :cancel }
21
+ end
22
+ get "team", to: "team#show"
16
23
  resources :holidays, only: :index
17
24
  get "calendar", to: "calendar#show"
18
25
  resources :salary_slips, only: %i[index show]
@@ -32,6 +39,12 @@ HrLite::Engine.routes.draw do
32
39
  resources :leave_balances, only: :index do
33
40
  collection { post :adjust }
34
41
  end
42
+ resources :comp_off_requests, only: %i[index show] do
43
+ member { post :approve; post :reject }
44
+ end
45
+ resources :regularization_requests, only: %i[index show] do
46
+ member { post :approve; post :reject }
47
+ end
35
48
  resources :leave_types, except: :show
36
49
  resources :office_locations, except: :show
37
50
  resources :holidays, only: %i[index create update destroy] do
@@ -0,0 +1,6 @@
1
+ class AddCompOffToHrLiteLeaveTypes < ActiveRecord::Migration[8.0]
2
+ def change
3
+ # Marks which leave type approved comp-off requests credit into.
4
+ add_column :hr_lite_leave_types, :comp_off, :boolean, null: false, default: false
5
+ end
6
+ end
@@ -0,0 +1,24 @@
1
+ class CreateHrLiteCompOffRequests < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :hr_lite_comp_off_requests do |t|
4
+ t.bigint :user_id, null: false
5
+ t.date :date_worked, null: false
6
+ t.boolean :half_day, null: false, default: false
7
+ t.text :reason, null: false
8
+ t.string :status, null: false, default: "pending"
9
+ t.bigint :decided_by_id
10
+ t.datetime :decided_at
11
+ t.text :decision_note
12
+
13
+ t.timestamps
14
+ end
15
+ add_index :hr_lite_comp_off_requests, [ :user_id, :status ]
16
+ add_index :hr_lite_comp_off_requests, [ :user_id, :date_worked ]
17
+ add_index :hr_lite_comp_off_requests, [ :status, :date_worked ]
18
+ # Two tabs / a double-tap racing past the app-level duplicate check
19
+ # must not create two live requests for one worked day.
20
+ add_index :hr_lite_comp_off_requests, [ :user_id, :date_worked ],
21
+ unique: true, where: "status IN ('pending', 'approved')",
22
+ name: "index_hr_lite_comp_off_requests_live_uniqueness"
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ class CreateHrLiteRegularizationRequests < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :hr_lite_regularization_requests do |t|
4
+ t.bigint :user_id, null: false
5
+ t.date :date, null: false
6
+ t.datetime :check_in_at
7
+ t.datetime :check_out_at
8
+ t.text :reason, null: false
9
+ t.string :status, null: false, default: "pending"
10
+ t.bigint :decided_by_id
11
+ t.datetime :decided_at
12
+ t.text :decision_note
13
+
14
+ t.timestamps
15
+ end
16
+ add_index :hr_lite_regularization_requests, [ :user_id, :status ]
17
+ add_index :hr_lite_regularization_requests, [ :user_id, :date ]
18
+ add_index :hr_lite_regularization_requests, [ :status, :date ]
19
+ end
20
+ end
@@ -9,7 +9,7 @@ module HrLite
9
9
  :time_zone, :currency_symbol, :on_designation_change,
10
10
  :leadership_emails, :leadership_check, :extra_stylesheets,
11
11
  :mailer_from, :public_url_base, :notification_matrix, :back_link,
12
- :onboard_user, :offboard_user
12
+ :onboard_user, :offboard_user, :invite_url_for
13
13
 
14
14
  # 0.1.0 pre-release name for public_url_base; kept as an alias so early
15
15
  # adopters' initializers don't break.
@@ -58,6 +58,10 @@ module HrLite
58
58
  klass.create!(attributes)
59
59
  }
60
60
  @offboard_user = ->(user) { }
61
+ # Optional: return an absolute set-your-password URL for a freshly
62
+ # onboarded user (e.g. a Devise reset link). When present, the welcome
63
+ # email carries it and leadership never needs to hand over a password.
64
+ @invite_url_for = nil
61
65
  end
62
66
  end
63
67
 
@@ -29,15 +29,27 @@ module HrLite
29
29
  "resignation.accepted" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
30
30
  "resignation.withdrawn" => { bell: true, email: false, leadership_email: true, leadership_bell: false },
31
31
  "employee.onboarded" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
32
- "payroll.draft_ready" => { bell: false, email: false, leadership_email: true, leadership_bell: true }
32
+ "payroll.draft_ready" => { bell: false, email: false, leadership_email: true, leadership_bell: true },
33
+ "leave.team_notice" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
34
+ "comp_off.requested" => { bell: true, email: false, leadership_email: true, leadership_bell: true },
35
+ "comp_off.approved" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
36
+ "comp_off.rejected" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
37
+ "comp_off.cancelled" => { bell: true, email: false, leadership_email: true, leadership_bell: false },
38
+ "regularization.requested" => { bell: true, email: false, leadership_email: true, leadership_bell: false },
39
+ "regularization.approved" => { bell: true, email: true, leadership_email: true, leadership_bell: false },
40
+ "regularization.rejected" => { bell: true, email: true, leadership_email: false, leadership_bell: false },
41
+ "regularization.cancelled" => { bell: true, email: false, leadership_email: true, leadership_bell: false }
33
42
  }.freeze
34
43
 
35
44
  class << self
45
+ # DEFAULT under the host override: a host matrix pinned on an older
46
+ # gem version keeps working when new events ship (rows it doesn't
47
+ # know about fall back to the defaults instead of vanishing).
36
48
  def matrix
37
- HrLite.config.notification_matrix || DEFAULT_MATRIX
49
+ DEFAULT_MATRIX.merge(HrLite.config.notification_matrix || {})
38
50
  end
39
51
 
40
- def publish(event, title:, body: nil, path: nil, bell_to: [], email_to: [], lines: [], diff: nil)
52
+ def publish(event, title:, body: nil, path: nil, bell_to: [], email_to: [], lines: [], diff: nil, link_url: nil)
41
53
  row = matrix[event.to_s]
42
54
  unless row
43
55
  Rails.logger.warn("[hr_lite] unknown notification event #{event}")
@@ -45,7 +57,7 @@ module HrLite
45
57
  end
46
58
 
47
59
  deliver_bells(event, row, bell_to, title, body, path)
48
- deliver_emails(row, email_to, title, body, path, lines)
60
+ deliver_emails(row, email_to, title, body, path, lines, link_url)
49
61
  deliver_leadership_email(event, row, title, body, path, lines, diff)
50
62
  deliver_leadership_bells(event, row, bell_to, title, body, path)
51
63
  nil
@@ -61,14 +73,15 @@ module HrLite
61
73
  end
62
74
  end
63
75
 
64
- def deliver_emails(row, email_to, title, body, path, lines)
76
+ def deliver_emails(row, email_to, title, body, path, lines, link_url = nil)
65
77
  return unless row[:email]
66
78
 
67
79
  Array(email_to).compact.uniq.each do |user|
68
80
  next if user.email.blank?
69
81
 
70
82
  EventMailer.event(to: user.email, subject: title, heading: title,
71
- body: body, lines: lines, path: path).deliver_later
83
+ body: body, lines: lines, path: path,
84
+ link_url: link_url).deliver_later
72
85
  end
73
86
  rescue => e
74
87
  Rails.logger.error("[hr_lite] event email failed: #{e.class}: #{e.message}")
data/lib/hr_lite/seeds.rb CHANGED
@@ -7,13 +7,28 @@ module HrLite
7
7
  { code: "SL", name: "Sick leave", color: "#f59e0b", paid: true, annual_quota: 6, accrual: "yearly_upfront", carry_forward_cap: 0, position: 2 },
8
8
  { code: "EL", name: "Earned leave", color: "#10b981", paid: true, annual_quota: 15, accrual: "monthly", carry_forward_cap: 30, position: 3 },
9
9
  { code: "LWP", name: "Leave without pay", color: "#6b7280", paid: false, annual_quota: nil, accrual: "yearly_upfront", carry_forward_cap: 0, position: 4 },
10
- { code: "CO", name: "Comp off", color: "#8b5cf6", paid: true, annual_quota: 0, accrual: "yearly_upfront", carry_forward_cap: 0, position: 5 }
10
+ { code: "CO", name: "Comp off", color: "#8b5cf6", paid: true, annual_quota: 0, accrual: "yearly_upfront", carry_forward_cap: 0, position: 5, comp_off: true }
11
11
  ].freeze
12
12
 
13
13
  def self.run!
14
14
  seed_leave_types! + seed_holidays!
15
15
  end
16
16
 
17
+ # Deliberately NOT auto-run from run!: an operator unticking every
18
+ # comp-off flag to disable the feature must stay disabled across
19
+ # deploys ("re-runs never overwrite operator edits"). Pre-0.3.0
20
+ # installs call this once from their own upgrade seed, or just tick
21
+ # the box under Settings -> Leave types.
22
+ def self.seed_comp_off_flag!
23
+ return [] if LeaveType.exists?(comp_off: true)
24
+
25
+ type = LeaveType.find_by(code: "CO")
26
+ return [] if type.nil?
27
+
28
+ type.update!(comp_off: true)
29
+ [ "comp_off flag on CO" ]
30
+ end
31
+
17
32
  def self.seed_leave_types!
18
33
  DEFAULT_LEAVE_TYPES.filter_map do |attrs|
19
34
  next if LeaveType.exists?(code: attrs[:code])
@@ -1,3 +1,3 @@
1
1
  module HrLite
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/hr_lite.rb CHANGED
@@ -57,6 +57,13 @@ module HrLite
57
57
  config.employees_scope.call.sort_by { |u| display_name(u).downcase }
58
58
  end
59
59
 
60
+ # employees minus anyone whose profile says they have exited — user
61
+ # accounts outlive employment (slip access), broadcasts must not.
62
+ def active_employees(on: Date.current)
63
+ exits = HrLite::EmployeeProfile.where.not(date_of_exit: nil).pluck(:user_id, :date_of_exit).to_h
64
+ employees.select { |u| exits[u.id].nil? || exits[u.id] >= on }
65
+ end
66
+
60
67
  def display_name(user)
61
68
  return "" if user.nil?
62
69
 
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.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kshitiz sinha
@@ -58,6 +58,7 @@ files:
58
58
  - app/controllers/hr_lite/admin/attendances_controller.rb
59
59
  - app/controllers/hr_lite/admin/audit_logs_controller.rb
60
60
  - app/controllers/hr_lite/admin/base_controller.rb
61
+ - app/controllers/hr_lite/admin/comp_off_requests_controller.rb
61
62
  - app/controllers/hr_lite/admin/designation_changes_controller.rb
62
63
  - app/controllers/hr_lite/admin/employees_controller.rb
63
64
  - app/controllers/hr_lite/admin/holidays_controller.rb
@@ -68,6 +69,7 @@ files:
68
69
  - app/controllers/hr_lite/admin/office_locations_controller.rb
69
70
  - app/controllers/hr_lite/admin/overview_controller.rb
70
71
  - app/controllers/hr_lite/admin/payroll_runs_controller.rb
72
+ - app/controllers/hr_lite/admin/regularization_requests_controller.rb
71
73
  - app/controllers/hr_lite/admin/resignations_controller.rb
72
74
  - app/controllers/hr_lite/admin/salary_slips_controller.rb
73
75
  - app/controllers/hr_lite/admin/salary_structures_controller.rb
@@ -77,14 +79,17 @@ files:
77
79
  - app/controllers/hr_lite/attendance_controller.rb
78
80
  - app/controllers/hr_lite/calendar_controller.rb
79
81
  - app/controllers/hr_lite/career_controller.rb
82
+ - app/controllers/hr_lite/comp_off_requests_controller.rb
80
83
  - app/controllers/hr_lite/employee_profiles_controller.rb
81
84
  - app/controllers/hr_lite/holidays_controller.rb
82
85
  - app/controllers/hr_lite/home_controller.rb
83
86
  - app/controllers/hr_lite/kudos_controller.rb
84
87
  - app/controllers/hr_lite/leave_balances_controller.rb
85
88
  - app/controllers/hr_lite/leave_requests_controller.rb
89
+ - app/controllers/hr_lite/regularization_requests_controller.rb
86
90
  - app/controllers/hr_lite/resignations_controller.rb
87
91
  - app/controllers/hr_lite/salary_slips_controller.rb
92
+ - app/controllers/hr_lite/team_controller.rb
88
93
  - app/controllers/hr_lite/users_controller.rb
89
94
  - app/helpers/hr_lite/application_helper.rb
90
95
  - app/jobs/hr_lite/application_job.rb
@@ -99,6 +104,7 @@ files:
99
104
  - app/models/hr_lite/appraisal.rb
100
105
  - app/models/hr_lite/attendance_record.rb
101
106
  - app/models/hr_lite/audit_log.rb
107
+ - app/models/hr_lite/comp_off_request.rb
102
108
  - app/models/hr_lite/designation_change.rb
103
109
  - app/models/hr_lite/employee_profile.rb
104
110
  - app/models/hr_lite/holiday.rb
@@ -109,6 +115,7 @@ files:
109
115
  - app/models/hr_lite/leave_type.rb
110
116
  - app/models/hr_lite/office_location.rb
111
117
  - app/models/hr_lite/payroll_run.rb
118
+ - app/models/hr_lite/regularization_request.rb
112
119
  - app/models/hr_lite/resignation.rb
113
120
  - app/models/hr_lite/salary_slip.rb
114
121
  - app/models/hr_lite/salary_structure.rb
@@ -126,6 +133,7 @@ files:
126
133
  - app/services/hr_lite/payroll_run_processor.rb
127
134
  - app/services/hr_lite/pdf_renderer.rb
128
135
  - app/services/hr_lite/slip_builder.rb
136
+ - app/services/hr_lite/team_day.rb
129
137
  - app/services/hr_lite/working_calendar.rb
130
138
  - app/views/hr_lite/admin/appraisals/_form.html.erb
131
139
  - app/views/hr_lite/admin/appraisals/edit.html.erb
@@ -133,6 +141,8 @@ files:
133
141
  - app/views/hr_lite/admin/attendances/index.html.erb
134
142
  - app/views/hr_lite/admin/attendances/show.html.erb
135
143
  - app/views/hr_lite/admin/audit_logs/index.html.erb
144
+ - app/views/hr_lite/admin/comp_off_requests/index.html.erb
145
+ - app/views/hr_lite/admin/comp_off_requests/show.html.erb
136
146
  - app/views/hr_lite/admin/designation_changes/new.html.erb
137
147
  - app/views/hr_lite/admin/employees/_form.html.erb
138
148
  - app/views/hr_lite/admin/employees/edit.html.erb
@@ -155,11 +165,14 @@ files:
155
165
  - app/views/hr_lite/admin/payroll_runs/index.html.erb
156
166
  - app/views/hr_lite/admin/payroll_runs/new.html.erb
157
167
  - app/views/hr_lite/admin/payroll_runs/show.html.erb
168
+ - app/views/hr_lite/admin/regularization_requests/index.html.erb
169
+ - app/views/hr_lite/admin/regularization_requests/show.html.erb
158
170
  - app/views/hr_lite/admin/salary_slips/show.html.erb
159
171
  - app/views/hr_lite/admin/salary_structures/_form.html.erb
160
172
  - app/views/hr_lite/admin/salary_structures/edit.html.erb
161
173
  - app/views/hr_lite/admin/salary_structures/new.html.erb
162
174
  - app/views/hr_lite/admin/settings/edit.html.erb
175
+ - app/views/hr_lite/admin/shared/_approvals_tabs.html.erb
163
176
  - app/views/hr_lite/appraisals/index.html.erb
164
177
  - app/views/hr_lite/appraisals/show.html.erb
165
178
  - app/views/hr_lite/attendance/_month_grid.html.erb
@@ -167,6 +180,8 @@ files:
167
180
  - app/views/hr_lite/attendance/show.html.erb
168
181
  - app/views/hr_lite/calendar/show.html.erb
169
182
  - app/views/hr_lite/career/show.html.erb
183
+ - app/views/hr_lite/comp_off_requests/index.html.erb
184
+ - app/views/hr_lite/comp_off_requests/new.html.erb
170
185
  - app/views/hr_lite/employee_profiles/show.html.erb
171
186
  - app/views/hr_lite/event_mailer/event.html.erb
172
187
  - app/views/hr_lite/event_mailer/event.text.erb
@@ -182,6 +197,8 @@ files:
182
197
  - app/views/hr_lite/leave_requests/index.html.erb
183
198
  - app/views/hr_lite/leave_requests/new.html.erb
184
199
  - app/views/hr_lite/leave_requests/show.html.erb
200
+ - app/views/hr_lite/regularization_requests/index.html.erb
201
+ - app/views/hr_lite/regularization_requests/new.html.erb
185
202
  - app/views/hr_lite/resignations/show.html.erb
186
203
  - app/views/hr_lite/salary_slips/_slip_detail.html.erb
187
204
  - app/views/hr_lite/salary_slips/index.html.erb
@@ -189,6 +206,7 @@ files:
189
206
  - app/views/hr_lite/salary_slips/show.html.erb
190
207
  - app/views/hr_lite/shared/_form_errors.html.erb
191
208
  - app/views/hr_lite/shared/_pagination.html.erb
209
+ - app/views/hr_lite/team/show.html.erb
192
210
  - app/views/layouts/hr_lite/application.html.erb
193
211
  - app/views/layouts/hr_lite/mailer.html.erb
194
212
  - app/views/layouts/hr_lite/mailer.text.erb
@@ -211,6 +229,9 @@ files:
211
229
  - db/migrate/20260718195953_create_hr_lite_appraisals.rb
212
230
  - db/migrate/20260718195954_create_hr_lite_designation_changes.rb
213
231
  - db/migrate/20260719065841_create_hr_lite_resignations.rb
232
+ - db/migrate/20260719104315_add_comp_off_to_hr_lite_leave_types.rb
233
+ - db/migrate/20260719104316_create_hr_lite_comp_off_requests.rb
234
+ - db/migrate/20260719104317_create_hr_lite_regularization_requests.rb
214
235
  - lib/generators/hr_lite/install/install_generator.rb
215
236
  - lib/generators/hr_lite/install/templates/AFTER_INSTALL
216
237
  - lib/generators/hr_lite/install/templates/initializer.rb