Class: Crm::TimeOffsController

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

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, #initialize_crm_lazy_chunks, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #append_token, #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::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, #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_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!, #authenticate_account_from_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, #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, #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



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

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
    if params[:time_off_type_id].to_i == TimeOffType::BANKED_TIME_ID
      @time_off_balances = @time_off_balances.where(category: 'banked')
    else
      @time_off_balances = @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



114
115
116
117
118
# File 'app/controllers/crm/time_offs_controller.rb', line 114

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



96
97
98
99
100
# File 'app/controllers/crm/time_offs_controller.rb', line 96

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



108
109
110
111
112
# File 'app/controllers/crm/time_offs_controller.rb', line 108

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



90
91
92
93
94
# File 'app/controllers/crm/time_offs_controller.rb', line 90

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



78
79
80
81
82
# File 'app/controllers/crm/time_offs_controller.rb', line 78

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



84
85
86
87
88
# File 'app/controllers/crm/time_offs_controller.rb', line 84

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



102
103
104
105
106
# File 'app/controllers/crm/time_offs_controller.rb', line 102

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



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

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



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

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



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

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).



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

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



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

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

#manager_tab_company_holidaysObject



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

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



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

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



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

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



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

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: [:profile_image, :employee_record])
    .order(:created_at)
  render 'manager_tab_time_off_requests', layout: should_render_layout?
end

#manager_tab_time_off_typesObject



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

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



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

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: [:profile_image, :employee_record])
    .order(:created_at)
  render 'manager_tab_work_schedule_requests', layout: should_render_layout?
end