Class: Crm::TimeOffsController

Inherits:
CrmController show all
Defined in:
app/controllers/crm/time_offs_controller.rb

Overview

Controller: time offs.

Constant Summary

Constants included from Controllers::ReferenceFindable

Controllers::ReferenceFindable::ID_EMBEDDED_PATTERNS

Constants included from Controllers::AnalyticsEvents

Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY

Constants included from Controllers::ErrorRendering

Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES

Constants included from Www::SeoHelper

Www::SeoHelper::AWARDS, Www::SeoHelper::CA_ADDRESS, Www::SeoHelper::CA_BUSINESS_HOURS, Www::SeoHelper::CA_CONTACT_POINT, Www::SeoHelper::CA_CURRENCIES, Www::SeoHelper::CA_DESCRIPTION, Www::SeoHelper::CA_FOUNDING_DATE, Www::SeoHelper::CA_GLOBAL_LOCATION_NUMBER, Www::SeoHelper::CA_LEGAL_NAME, Www::SeoHelper::CA_LOCAL_BUSINESS, Www::SeoHelper::CA_ONLINE_STORE, Www::SeoHelper::CA_RETURN_POLICY, Www::SeoHelper::CA_SALES_DEPARTMENT, Www::SeoHelper::CA_SERVICE_AREA, Www::SeoHelper::CA_URL, Www::SeoHelper::CA_VAT_ID, Www::SeoHelper::CA_WAREHOUSE_DEPARTMENT, Www::SeoHelper::CA_WAREHOUSE_HOURS, Www::SeoHelper::COMPANY_EMAIL, Www::SeoHelper::COMPANY_LOGO, Www::SeoHelper::COMPANY_NAME, Www::SeoHelper::COMPANY_SLOGAN, Www::SeoHelper::EXPERTISE, Www::SeoHelper::FAX_NUMBER, Www::SeoHelper::GS1_COMPANY_PREFIX, Www::SeoHelper::ISO6523_CODE, Www::SeoHelper::PAYMENT_METHODS, Www::SeoHelper::PHONE_NUMBER, Www::SeoHelper::PRIMARY_NAICS, Www::SeoHelper::REFUND_TYPE, Www::SeoHelper::RETURN_FEES, Www::SeoHelper::RETURN_METHOD, Www::SeoHelper::RETURN_POLICY_CATEGORY, Www::SeoHelper::SECONDARY_NAICS, Www::SeoHelper::SOCIAL_PROFILES, Www::SeoHelper::US_ADDRESS, Www::SeoHelper::US_BUSINESS_HOURS, Www::SeoHelper::US_CONTACT_POINT, Www::SeoHelper::US_CURRENCIES, Www::SeoHelper::US_DESCRIPTION, Www::SeoHelper::US_FOUNDING_DATE, Www::SeoHelper::US_GLOBAL_LOCATION_NUMBER, Www::SeoHelper::US_IMAGE, Www::SeoHelper::US_LEGAL_NAME, Www::SeoHelper::US_LOCAL_BUSINESS, Www::SeoHelper::US_ONLINE_STORE, Www::SeoHelper::US_RETURN_POLICY, Www::SeoHelper::US_SALES_DEPARTMENT, Www::SeoHelper::US_SERVICE_AREA, Www::SeoHelper::US_TAX_ID, Www::SeoHelper::US_URL, Www::SeoHelper::US_WAREHOUSE_DEPARTMENT, Www::SeoHelper::US_WAREHOUSE_HOURS

Constants included from IconHelper

IconHelper::CUSTOM_ICON_MAP, IconHelper::CUSTOM_SVG_DIR, IconHelper::DEFAULT_FAMILY

Instance Method Summary collapse

Methods inherited from CrmController

#access_denied, #context_id, #context_object, #crm_home_path, #current_ability, #default_url_options, #download_temp, #get_tempfile_path_for_download, #init_status_job_collector, #initialize_crm_lazy_chunks, #persist_enqueued_status_jobs, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download, #sync_admin_presence_cookie

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #stamp_impersonation_context, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y

Methods included from Controllers::ReturnPathHandling

#check_for_return_path, #redirect_to_return_path_or_default

Methods included from Controllers::AnalyticsEvents

#consume_queued_analytics_events, #track_event

Methods included from Controllers::DeviceDetection

#device_detector, #is_ie?

Methods included from Controllers::SubdomainDetection

#is_crm_request?, #is_www_request?, #json_request?

Methods included from Controllers::TurboSafeRedirect

#redirect_to

Methods included from Controllers::TrackingDetection

#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?

Methods included from Controllers::AcceleratedFileSending

#send_file_accelerated, #send_upload_accelerated

Methods included from Controllers::ErrorRendering

#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #render_unpermitted_parameters, #safe_referer_or_fallback

Methods included from Controllers::TurnstileVerification

#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!

Methods included from Controllers::CloudflareCaching

edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_edge_cache!, #skip_session

Methods included from Controllers::Webpackable

#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?

Methods included from Controllers::Localizable

#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale

Methods included from Controllers::Authenticable

#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak

Methods included from ApplicationHelper

#better_number_to_currency, #check_force_logout, #check_or_cross, #check_or_times, #embedded_tab_frame_id, #error_messages, #general_disclaimer_on_product_installation_and_local_codes, #gridjs_from_html_table, #gridjs_table, #is_wy_ip, #line_break, #parent_layout, #pass_or_fail, #render_error_messages_list, #render_video_card, #resolved_auth_form_turbo_frame, #return_path_or, #safe_css_color, #set_return_path_if_present, #set_section_if_present, #tab_frame_id, #to_underscore, #track_page?, #turbo_section_wrapper, #turbo_tabs_request?, #url_on_same_domain_as_request, #widget_index_daily_focus_index_path, #working_hours?, #yes_or_no, #yes_or_no_highlighted, #yes_or_no_with_check_or_cross, #youtube_video

Methods included from UppyUploaderHelper

#file_uploader, #image_uploader, #large_file_uploader_s3, #lead_sketch_uploader, #rma_image_uploader, #rma_image_uploader_s3, #uppy_uploader, #video_uploader

Methods included from Www::ImagesHelper

#image_asset_tag, #image_asset_url

Methods included from Www::SeoHelper

#add_page_schema, #add_webpage_schema, #canada?, #company_social_links, #ensure_context_json, #json_ld_script_tag, #local_business_schema, #online_store_id, #online_store_schema, #page_main_entity, #page_main_entity_json, #render_auto_collection_page_schema, #render_collection_page_schema, #render_local_business_schema, #render_online_store_schema, #render_page_schemas, #render_page_video_schemas, #render_webpage_schema, #render_webpage_schema_with_collections, #usa?

Methods included from UrlsHelper

#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?

Methods included from IconHelper

#account_nav_icon, #fa_icon, #star_rating_html

Instance Method Details

#employee_dashboardObject



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
# File 'app/controllers/crm/time_offs_controller.rb', line 26

def employee_dashboard
  @employee = Employee.find(params[:id])
  @work_schedules = @employee.work_schedules.order(:effective_date)
  assign_company_holiday_tab_collections
  @policies = @employee.time_off_policies.includes(:time_off_type).order(:accrual_start_date)

  @time_off_requests = @employee.time_off_requests.includes(:time_off_type).order(start_date: :desc)
  @time_off_balances = @employee.time_off_balances.includes(:time_off_type).order(date: :asc, id: :asc)
  @upcoming_time_off = fetch_upcoming_time_off

  # Filter by time off type if a type is selected
  if params[:time_off_type_id].present?
    @time_off_requests = @time_off_requests.where(time_off_type_id: params[:time_off_type_id])
    # For Banked Time, filter by category='banked' instead of time_off_type_id
    @time_off_balances = if params[:time_off_type_id].to_i == TimeOffType::BANKED_TIME_ID
                           @time_off_balances.where(category: 'banked')
                         else
                           @time_off_balances.where(time_off_type_id: params[:time_off_type_id])
                         end
  end

  # Filter by year, default to the current year if no year is selected
  selected_year = params[:year].present? ? params[:year].to_i : Time.current.year
  @time_off_requests = @time_off_requests.where('EXTRACT(YEAR FROM created_at) = ?', selected_year)
  @time_off_balances = @time_off_balances.where(date: Date.new(selected_year).all_year)

  # Call the balance calculator for all time off types as of today
  as_of_date = safe_parse_date(params[:calculator_date])
  @time_off_balances_view = TimeOffBalanceCalculator.new(employee: @employee, date: as_of_date).formatted_balances

  @time_off_vacation_summary = TimeOffBalanceCalculator.new(employee: @employee).vacation_summary
end

#employee_tab_assigned_policiesObject



116
117
118
119
120
# File 'app/controllers/crm/time_offs_controller.rb', line 116

def employee_tab_assigned_policies
  @employee = Employee.find(params[:id])
  setup_employee_dashboard_data
  render 'tab_assigned_policies', layout: should_render_layout?
end

#employee_tab_balance_historyObject



98
99
100
101
102
# File 'app/controllers/crm/time_offs_controller.rb', line 98

def employee_tab_balance_history
  @employee = Employee.find(params[:id])
  setup_employee_dashboard_data
  render 'tab_balance_history', layout: should_render_layout?
end

#employee_tab_company_holidaysObject



110
111
112
113
114
# File 'app/controllers/crm/time_offs_controller.rb', line 110

def employee_tab_company_holidays
  @employee = Employee.find(params[:id])
  setup_employee_dashboard_data
  render 'tab_company_holidays', layout: should_render_layout?
end

#employee_tab_request_historyObject



92
93
94
95
96
# File 'app/controllers/crm/time_offs_controller.rb', line 92

def employee_tab_request_history
  @employee = Employee.find(params[:id])
  setup_employee_dashboard_data
  render 'tab_request_history', layout: should_render_layout?
end

#employee_tab_summaryObject

Employee tab actions



80
81
82
83
84
# File 'app/controllers/crm/time_offs_controller.rb', line 80

def employee_tab_summary
  @employee = Employee.find(params[:id])
  setup_employee_dashboard_data
  render 'tab_summary', layout: should_render_layout?
end

#employee_tab_time_off_calculatorObject



86
87
88
89
90
# File 'app/controllers/crm/time_offs_controller.rb', line 86

def employee_tab_time_off_calculator
  @employee = Employee.find(params[:id])
  setup_employee_dashboard_data
  render 'tab_time_off_calculator', layout: should_render_layout?
end

#employee_tab_work_scheduleObject



104
105
106
107
108
# File 'app/controllers/crm/time_offs_controller.rb', line 104

def employee_tab_work_schedule
  @employee = Employee.find(params[:id])
  setup_employee_dashboard_data
  render 'tab_work_schedule', layout: should_render_layout?
end

#filter_balancesObject



59
60
61
62
63
64
65
66
67
68
69
# File 'app/controllers/crm/time_offs_controller.rb', line 59

def filter_balances
  @employee = Employee.find(params[:id])
  as_of_date = safe_parse_date(params[:calculator_date])
  @time_off_balances_view = TimeOffBalanceCalculator.new(employee: @employee, date: as_of_date).formatted_balances
  @highlight_time_off_type_id = params[:highlight_time_off_type_id]

  respond_to do |format|
    format.html { render partial: 'crm/time_offs/calculator', locals: { time_off_balances_view: @time_off_balances_view }, layout: false }
    format.turbo_stream
  end
end

#filter_work_scheduleObject



71
72
73
74
75
76
77
# File 'app/controllers/crm/time_offs_controller.rb', line 71

def filter_work_schedule
  @employee = Employee.find(params[:id])
  as_of_date = safe_parse_date(params[:calculator_date])
  @work_schedule = @employee.work_schedules.effective_on(as_of_date).first

  render partial: 'crm/time_off_requests/work_schedule', layout: false
end

#manager_dashboardObject



4
5
6
7
8
9
10
11
12
# File 'app/controllers/crm/time_offs_controller.rb', line 4

def manager_dashboard
  unless current_user.can?(:manage, TimeOffRequest)
    flash[:alert] = 'You do not have permission to access the PTO manager.'
    redirect_to root_path
    return
  end

  setup_manager_dashboard_shell
end

#manager_employee_statusObject

Full-page team availability for a selected day (date nav like daily_focus/review).
Any CRM employee; contrast with +manager_dashboard+ (PTO managers only).



16
17
18
19
20
21
22
23
24
# File 'app/controllers/crm/time_offs_controller.rb', line 16

def manager_employee_status
  unless current_user.can?(:read, :team_employee_status_dashboard)
    flash[:alert] = 'You do not have permission to view team schedules.'
    redirect_to root_path
    return
  end

  setup_employee_status_data
end

#manager_tab_blocked_daysObject



154
155
156
157
158
159
160
161
# File 'app/controllers/crm/time_offs_controller.rb', line 154

def manager_tab_blocked_days
  unless current_user.can?(:manage, TimeOffRequest)
    head :forbidden
    return
  end
  @blocked_days = TimeOffBlockedDay.where(blocked_date: Time.zone.today..).order(:blocked_date)
  render 'manager_tab_blocked_days', layout: should_render_layout?
end

#manager_tab_company_holidaysObject



163
164
165
166
167
168
169
170
# File 'app/controllers/crm/time_offs_controller.rb', line 163

def manager_tab_company_holidays
  unless current_user.can?(:manage, TimeOffRequest)
    head :forbidden
    return
  end
  setup_company_holidays_data
  render 'manager_tab_company_holidays', layout: should_render_layout?
end

#manager_tab_employee_statusObject

Manager tab actions



123
124
125
126
127
128
129
130
# File 'app/controllers/crm/time_offs_controller.rb', line 123

def manager_tab_employee_status
  unless current_user.can?(:read, :team_employee_status_dashboard)
    head :forbidden
    return
  end
  setup_employee_status_data
  render 'manager_tab_employee_status', layout: should_render_layout?
end

#manager_tab_time_off_policiesObject



181
182
183
184
185
186
187
188
# File 'app/controllers/crm/time_offs_controller.rb', line 181

def manager_tab_time_off_policies
  unless current_user.can?(:manage, TimeOffRequest)
    head :forbidden
    return
  end
  @time_off_policies = TimeOffPolicy.for_manager_policies_tab
  render 'manager_tab_time_off_policies', layout: should_render_layout?
end

#manager_tab_time_off_requestsObject



132
133
134
135
136
137
138
139
140
141
# File 'app/controllers/crm/time_offs_controller.rb', line 132

def manager_tab_time_off_requests
  unless current_user.can?(:manage, TimeOffRequest)
    head :forbidden
    return
  end
  @pending_time_off_requests = TimeOffRequest.where(state: 'requested')
                                             .includes(:time_off_type, employee: %i[profile_image employee_record])
                                             .order(:created_at)
  render 'manager_tab_time_off_requests', layout: should_render_layout?
end

#manager_tab_time_off_typesObject



172
173
174
175
176
177
178
179
# File 'app/controllers/crm/time_offs_controller.rb', line 172

def manager_tab_time_off_types
  unless current_user.can?(:manage, TimeOffRequest)
    head :forbidden
    return
  end
  @time_off_types = TimeOffType.all
  render 'manager_tab_time_off_types', layout: should_render_layout?
end

#manager_tab_work_schedule_requestsObject



143
144
145
146
147
148
149
150
151
152
# File 'app/controllers/crm/time_offs_controller.rb', line 143

def manager_tab_work_schedule_requests
  unless current_user.can?(:manage, TimeOffRequest)
    head :forbidden
    return
  end
  @pending_work_schedule_requests = WorkSchedule.where(state: 'pending')
                                                .includes(employee: %i[profile_image employee_record])
                                                .order(:created_at)
  render 'manager_tab_work_schedule_requests', layout: should_render_layout?
end