Class: HrLite::Admin::AttendancesController
- Inherits:
-
BaseController
- Object
- HrLite::ApplicationController
- BaseController
- HrLite::Admin::AttendancesController
- Defined in:
- app/controllers/hr_lite/admin/attendances_controller.rb
Instance Method Summary collapse
-
#index ⇒ Object
Team day view: everyone × their punch/status for one date.
-
#show ⇒ Object
One employee's month + the regularization form for ?date=.
-
#update ⇒ Object
Regularization: fix punches with a mandatory note, fully audited.
Instance Method Details
#index ⇒ Object
Team day view: everyone × their punch/status for one date.
5 6 7 8 9 10 |
# File 'app/controllers/hr_lite/admin/attendances_controller.rb', line 5 def index @date = parse_date_param(params[:date]) @employees = HrLite.employees @records = AttendanceRecord.for_date(@date).where(user_id: @employees.map(&:id)).index_by(&:user_id) @flagged_count = @records.values.count(&:flagged?) end |
#show ⇒ Object
One employee's month + the regularization form for ?date=.
13 14 15 16 17 18 19 20 |
# File 'app/controllers/hr_lite/admin/attendances_controller.rb', line 13 def show @employee = HrLite.user_klass.find(params[:user_id]) @month = parse_month_param(params[:month]) @day_status = DayStatus.new(user: @employee, range: @month.beginning_of_month..@month.end_of_month) @counts = @day_status.counts @edit_date = params[:date].present? ? parse_date_param(params[:date]) : nil @edit_record = @edit_date && AttendanceRecord.find_or_initialize_by(user_id: @employee.id, date: @edit_date) end |
#update ⇒ Object
Regularization: fix punches with a mandatory note, fully audited. Clearing both punch times deletes the record (that is how an erroneous punch is removed).
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'app/controllers/hr_lite/admin/attendances_controller.rb', line 25 def update @employee = HrLite.user_klass.find(params[:user_id]) date = parse_date_param(params[:date]) record = AttendanceRecord.find_or_initialize_by(user_id: @employee.id, date: date) note = params.dig(:attendance_record, :regularization_note).to_s.strip if note.blank? return redirect_to admin_attendance_path(@employee.id, date: date, month: date.strftime("%Y-%m")), alert: "A regularization note is required." end attrs = params.require(:attendance_record).permit(:check_in_at, :check_out_at, :status) if attrs[:check_in_at].blank? && attrs[:check_out_at].blank? # Nothing to remove used to still write a `destroy` audit row with # subject_id 0 and email the employee that a punch was removed. unless record.persisted? return redirect_to admin_attendance_path(@employee.id, month: date.strftime("%Y-%m")), notice: "Nothing to remove for that day." end record.destroy log_regularization(record, note, removed: true) return redirect_to admin_attendance_path(@employee.id, month: date.strftime("%Y-%m")), notice: "Punch removed." end # A check-out with no check-in produces a row every consumer reads as # absent (they all key off check_in_at), so the day silently stays LOP # while the screen reports the fix succeeded. if attrs[:check_in_at].blank? return redirect_to admin_attendance_path(@employee.id, date: date, month: date.strftime("%Y-%m")), alert: "A check-in time is required when a check-out is set." end record.assign_attributes(attrs) record.status = "present" if record.status.blank? record.regularized_by_id = hr_current_user.id record.regularized_at = Time.current record.regularization_note = note if record.save log_regularization(record, note, removed: false) redirect_to admin_attendance_path(@employee.id, month: date.strftime("%Y-%m")), notice: "Attendance updated." else redirect_to admin_attendance_path(@employee.id, date: date, month: date.strftime("%Y-%m")), alert: record.errors..to_sentence end end |