Class: EmployeePhoneStatusesController
- Inherits:
-
CrmController
- Object
- ActionController::Base
- ApplicationController
- CrmController
- EmployeePhoneStatusesController
- 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
-
#auto_away_schedule ⇒ void
Renders the auto-away schedule editor for all active employees.
-
#auto_away_update_schedule ⇒ void
Saves the submitted auto-away schedule times per employee.
-
#index ⇒ void
Lists the phone presence of the employees on the current user's watch list.
-
#presence_history ⇒ void
Shows the paginated presence change history for one employee.
-
#queue_order ⇒ Object
Ring-order management page.
-
#queue_roster ⇒ Object
Live ring-order roster for every queue, lazy-loaded into its own turbo frame on the queue_order page.
-
#refresh_status_options ⇒ void
Re-pulls every employee's status options from the PBX.
-
#update_queue_order ⇒ Object
Drag-sort write: re-orders an In Order queue's members on the PBX.
-
#update_unified_status ⇒ void
Updates an employee's presence, warning first when queues would be left uncovered.
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
Methods included from Controllers::SubdomainDetection
#is_crm_request?, #is_www_request?, #json_request?
Methods included from Controllers::TurboSafeRedirect
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_schedule ⇒ void
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 :manage, EmployeePhoneStatus load_employee_phone_statuses end |
#auto_away_update_schedule ⇒ void
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 :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 |
#index ⇒ void
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 :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_history ⇒ void
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 :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_order ⇒ Object
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 :manage, :phone_queue_order end |
#queue_roster ⇒ Object
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 :manage, :phone_queue_order load_queue_roster render partial: 'queue_roster', layout: false end |
#refresh_status_options ⇒ void
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 :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_order ⇒ Object
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 :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.account_id) result = Phone::Pbx.instance.update_queue_member_order(@queue.account_id, member_ids) if result.success? PhoneQueueOrderChange.create!( queue_account_id: @queue.account_id, source: 'manual', employee: current_user, previous_order: previous_order, new_order: member_ids ) Phone::QueueRoster.apply_member_order(@queue.account_id, member_ids) respond_to do |format| format.turbo_stream do load_queue_roster render turbo_stream: turbo_stream.replace("queue-roster-queue-#{@queue.account_id}", 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}: #{(result.errors)}" redirect_to queue_order_employee_phone_statuses_path end end end end |
#update_unified_status ⇒ void
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 initialize_employee_and_account :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 |