Class: EmployeePhoneStatusesController

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

Overview

Controller: employee phone statuses.

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 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_away_schedulevoid

This method returns an undefined value.

Renders the auto-away schedule editor for all active employees.



74
75
76
77
# File 'app/controllers/employee_phone_statuses_controller.rb', line 74

def auto_away_schedule
  authorize! :manage, EmployeePhoneStatus
  load_employee_phone_statuses
end

#auto_away_update_schedulevoid

This method returns an undefined value.

Saves the submitted auto-away schedule times per employee.



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'app/controllers/employee_phone_statuses_controller.rb', line 82

def auto_away_update_schedule
  authorize! :manage, EmployeePhoneStatus
  load_employee_phone_statuses
  errors = 0
  success = 0
  params[:auto_away_after].each do |eps_id, time|
    next if time.blank?

    next unless (eps = @employee_phone_statuses.find { |eps| eps.id == eps_id.to_i })

    eps.auto_away_after = Tod::TimeOfDay(time)
    if eps.changed?
      if eps.save
        success += 1
      else
        errors += 1
      end
    end
  end
  if errors == 0
    flash[:info] = "Schedule updated for #{success} record(s)"
    redirect_to employee_phone_statuses_path
  else
    flash.now[:error] = "Could not update auto-away schedule for #{errors} record(s)."
    render :auto_away_schedule, status: :unprocessable_content
  end
end

#indexvoid

This method returns an undefined value.

Lists the phone presence of the employees on the current user's watch list.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'app/controllers/employee_phone_statuses_controller.rb', line 8

def index
  authorize! :read, EmployeePhoneStatus
  # Rendered straight into the page. The turbo_stream branch here existed only
  # to feed an inline fetch loop that polled this same action and injected the
  # partial into a spinner; presence now arrives by Turbo Stream broadcast.
  # garnish_employees preloads employee_record + employee_phone_status; the
  # card touches both per rep, so the plain scope was an N+1 per watched rep.
  @employees = EmployeePhoneStatus.garnish_employees(current_user.effective_watch_list_ids)
                                  .order(:full_name)
  @pto_events_by_employee_id = EmployeeEvent.where(
    date: Date.current,
    employee_id: @employees.select(:id)
  ).order(:id).group_by(&:employee_id).transform_values(&:first)
end

#presence_historyvoid

This method returns an undefined value.

Shows the paginated presence change history for one employee.



26
27
28
29
30
# File 'app/controllers/employee_phone_statuses_controller.rb', line 26

def presence_history
  authorize! :read, EmployeePhoneStatus
  @employee_phone_status = EmployeePhoneStatus.find(params.expect(:id))
  @pagy, @presence_history = pagy(@employee_phone_status.versions.where("object_changes ? 'presence' OR object_changes ? 'sub_presence'").order(:created_at).reverse_order)
end

#queue_orderObject

Ring-order management page. The roster itself arrives via queue_roster in
a lazy turbo frame so the PBX round trip never holds up the page render.



112
113
114
# File 'app/controllers/employee_phone_statuses_controller.rb', line 112

def queue_order
  authorize! :manage, :phone_queue_order
end

#queue_rosterObject

Live ring-order roster for every queue, lazy-loaded into its own turbo
frame on the queue_order page.



118
119
120
121
122
# File 'app/controllers/employee_phone_statuses_controller.rb', line 118

def queue_roster
  authorize! :manage, :phone_queue_order
  load_queue_roster
  render partial: 'queue_roster', layout: false
end

#refresh_status_optionsvoid

This method returns an undefined value.

Re-pulls every employee's status options from the PBX.



35
36
37
38
39
40
# File 'app/controllers/employee_phone_statuses_controller.rb', line 35

def refresh_status_options
  authorize! :manage, EmployeePhoneStatus
  EmployeePhoneStatus.find_each(&:refresh_status_options)
  flash[:info] = 'Employee Phone Status were refreshed from the PBX'
  redirect_to employee_phone_statuses_path
end

#update_queue_orderObject

Drag-sort write: re-orders an In Order queue's members on the PBX. The
service refuses the write when the submitted ids don't match the PBX's
current membership exactly, so a stale page can never drop a member.



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'app/controllers/employee_phone_statuses_controller.rb', line 127

def update_queue_order
  authorize! :manage, :phone_queue_order
  # expect with several filters returns the values positionally, not a
  # Parameters object.
  queue_id, member_ids = params.expect(:queue_id, member: [])
  @queue = PhoneQueue.find(queue_id)
  if @queue.nil?
    respond_to do |format|
      format.turbo_stream { head :unprocessable_content }
      format.html do
        flash[:error] = 'Unknown phone queue.'
        redirect_to queue_order_employee_phone_statuses_path
      end
    end
    return
  end

  previous_order = Phone::QueueRoster.cached_member_order(@queue.)
  result = Phone::Pbx.instance.update_queue_member_order(@queue., member_ids)
  if result.success?
    PhoneQueueOrderChange.create!(
      queue_account_id: @queue.,
      source: 'manual',
      employee: current_user,
      previous_order: previous_order,
      new_order: member_ids
    )
    Phone::QueueRoster.apply_member_order(@queue., member_ids)
    respond_to do |format|
      format.turbo_stream do
        load_queue_roster
        render turbo_stream: turbo_stream.replace("queue-roster-queue-#{@queue.}",
                                                  partial: 'queue_roster_queue',
                                                  locals: queue_roster_queue_locals(@queue))
      end
      format.html do
        flash[:info] = "Ring order updated for #{@queue.name}."
        redirect_to queue_order_employee_phone_statuses_path
      end
    end
  else
    respond_to do |format|
      format.turbo_stream { head :unprocessable_content }
      format.html do
        flash[:error] = "Could not update the ring order for #{@queue.name}: #{pbx_error_message(result.errors)}"
        redirect_to queue_order_employee_phone_statuses_path
      end
    end
  end
end

#update_unified_statusvoid

This method returns an undefined value.

Updates an employee's presence, warning first when queues would be left uncovered.



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
# File 'app/controllers/employee_phone_statuses_controller.rb', line 45

def update_unified_status
  
  authorize! :update, @employee.employee_phone_status

  @presence = status_change_params.fetch(:presence)
  @sub_presence = status_change_params[:sub_presence]
  @status_return_path = status_return_path

  unless queue_coverage_confirmed?
    @uncovered_queues = EmployeePhoneStatus::QueueCoverageImpact.call(
      employee_phone_status: @employee.employee_phone_status,
      presence: @presence,
      sub_presence: @sub_presence
    ).uncovered_queues
    return render_queue_coverage_warning if @uncovered_queues.any?
  end

  @employee.set_presence(@presence, @sub_presence)
  @employee_phone_status = @employee.employee_phone_status
  @pto_event = @employee.check_pto.first
  respond_to do |format|
    format.turbo_stream
    format.html { redirect_to @status_return_path }
  end
end