Class: EmployeeTopicsController

Inherits:
CrmController show all
Includes:
Controllers::Workflowable
Defined in:
app/controllers/employee_topics_controller.rb

Overview

Training-topic assignments for employees: CRUD on EmployeeTopic,
auto-assignment by role, and the bulk training-request flow.

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

Instance Method Summary collapse

Methods included from Controllers::Workflowable

#render_workflow_error_stream, #render_workflow_success_stream, #workflow_action, #workflow_action_complete

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, #touch_employee_last_seen

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?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #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, #registration_lead_type, #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 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?

Instance Method Details

#auto_assign_topicsvoid

This method returns an undefined value.

Runs EmployeeTopic.auto_assign for each employee in
params[:employee_id].



66
67
68
69
70
71
72
73
74
# File 'app/controllers/employee_topics_controller.rb', line 66

def auto_assign_topics
  @employees = Employee.where(id: params[:employee_id])
  assignment_counter = 0
  @employees.each do |employee|
    assignment_counter += EmployeeTopic.auto_assign(employee).size
  end
  flash[:info] = "#{assignment_counter} topic(s) assigned"
  redirect_to_return_path_or_default employee_topics_path
end

#do_training_requestvoid

This method returns an undefined value.

Assigns the selected topics to the selected trainees in bulk.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'app/controllers/employee_topics_controller.rb', line 86

def do_training_request
  trainees = Employee.where(id: params[:employee_ids])
  new_employee_topics = []
  errors = []
  topics = Topic.active.where(applies_to_employee: true).where(id: params[:topic_ids])
  topics.each do |topic|
    trainees.each do |employee|
      et = employee.employee_topics.where(topic_id: topic.id).first_or_create(state: 'assigned')
      et.update(employee_topic_params.merge(state: 'assigned'))
      new_employee_topics << et
      errors += et.errors.full_messages.map { |e| "Topic ID: #{topic.id}, Employee ID: #{employee.id} assignment error: #{e}" }
    end
  end
  flash[:info] = "#{view_context.pluralize(new_employee_topics.size, 'topic')} were assigned to #{view_context.pluralize(trainees.size, 'trainee')}"
  flash[:error] = "Could not process some requests. #{errors.inspect}" if errors.present?
  redirect_to employee_topics_path(q: { party_id_in: params[:employee_ids], topic_id_in: params[:topic_ids], state_in: ['assigned'] })
end

#editvoid

This method returns an undefined value.

Loads an assignment for editing.



44
45
46
47
# File 'app/controllers/employee_topics_controller.rb', line 44

def edit
  @employee_topic = EmployeeTopic.find(params.expect(:id))
  authorize!(:update, @employee_topic)
end

#indexvoid

This method returns an undefined value.

Lists employee-topic assignments, ransack-filterable (defaults to
assigned/requested states), grouped by topic category.



20
21
22
23
24
25
26
27
28
29
30
31
# File 'app/controllers/employee_topics_controller.rb', line 20

def index
  params[:q] = { state_in: %w[assigned requested] } if params[:q].blank?
  @q = EmployeeTopic.ransack(params[:q])
  # The joins drive the merges and ordering; preload separately so rendering
  # 100 rows doesn't fire a lookup per row for employee/trainer/topic.
  @pagy, @employee_topics = pagy(@q.result
                      .joins([{ topic: :topic_category }, :employee])
                      .merge(Employee.active_employees)
                      .merge(Topic.sorted)
                      .preload(:employee, :trainer_party, topic: :topic_category), items: 100)
  @employee_topics_grouped = @employee_topics.group_by { |pt| pt.topic.topic_category }
end

#showvoid

This method returns an undefined value.

Shows a single assignment. The view asks the ability which state events
this user may fire, so nothing is precomputed here.



37
38
39
# File 'app/controllers/employee_topics_controller.rb', line 37

def show
  @employee_topic = EmployeeTopic.find(params.expect(:id))
end

#training_requestvoid

This method returns an undefined value.

Renders the bulk training-request form.



79
80
81
# File 'app/controllers/employee_topics_controller.rb', line 79

def training_request
  load_employees_and_topics
end

#updatevoid

This method returns an undefined value.

Updates an assignment.



52
53
54
55
56
57
58
59
60
# File 'app/controllers/employee_topics_controller.rb', line 52

def update
  @employee_topic = EmployeeTopic.find(params.expect(:id))
  authorize!(:update, @employee_topic)
  if @employee_topic.update(employee_topic_params)
    redirect_to_return_path_or_default employee_topic_path(@employee_topic)
  else
    render :edit, status: :unprocessable_content
  end
end