Class: Crm::CertificationsController

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

Overview

Controller: certifications.

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

#approveObject

Approval goes through the state machine's activate event so approved
certifications land in the canonical active state (reference number,
congratulations email, expiry reset) instead of a bespoke 'approved'
string invisible to every scope and worker.



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'app/controllers/crm/certifications_controller.rb', line 117

def approve
  @certification = Certification.find(params.expect(:id))
  @customer = @certification.party.customer

  begin
    Certification.transaction do
      unless @certification.activate
        raise "Certification cannot be approved yet. Missing: #{@certification.activation_blockers.to_sentence}."
      end
      @certification.update!(certified_by: current_user.id)
    end
    flash[:info] = "Certification approved and valid until #{@certification.expires_at.to_date}"
  rescue StandardError => e
    flash[:error] = e.message
  end
  redirect_back_or_to @certification
end

#createvoid

This method returns an undefined value.

POST /crm/certifications — requests a certification for a course enrollment.



69
70
71
72
73
74
75
76
77
78
# File 'app/controllers/crm/certifications_controller.rb', line 69

def create
  @certification = @customer.certifications.new(certification_params)
  @certification.title = @certification.course_enrollment.course.name
  if @certification.save
    @certification.request
    redirect_to @certification, notice: 'Certification requested'
  else
    render :new, status: :unprocessable_content
  end
end

#editvoid

This method returns an undefined value.

GET /crm/certifications/:id/edit — edit form for an existing certification.



61
62
63
64
# File 'app/controllers/crm/certifications_controller.rb', line 61

def edit
  @certification = Certification.find(params.expect(:id))
  @customer = @certification.party
end

#indexvoid

This method returns an undefined value.

GET /crm/certifications — a customer's certifications, or a course
enrollment's certification.



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

def index
  if params[:customer_id].present?
    get_customer
    @certifications = @customer.certifications
  elsif params[:course_enrollment_id].present?
    get_enrollment
    @certification = @course_enrollment.certification
    @customer = @course_enrollment.party
  end
end

#index_allObject

The certification queue: defaults to the requested state so staff land
on what needs action, with per-row activation checklists in the view.



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'app/controllers/crm/certifications_controller.rb', line 94

def index_all
  params[:q] = { state_eq: 'requested' } if params[:q].blank?
  @q = Certification.ransack(params[:q])
  @q.sorts = 'created_at desc' if @q.sorts.blank?
  result = @q.result.includes(:party, course_enrollment: :course)
  respond_to do |format|
    format.html do
      @pagy, @certifications = pagy(result, limit: 25)
      @stats = {
        requested: Certification.requested.count,
        active: Certification.active.count,
        expiring_soon: Certification.active.where(expires_at: ..30.days.from_now).count,
        expired: Certification.expired.count
      }
    end
    format.csv { send_data certifications_csv(result), filename: "certifications-#{Date.current}.csv" }
  end
end

#newvoid

This method returns an undefined value.

GET /crm/certifications/new — blank certification request form.



56
# File 'app/controllers/crm/certifications_controller.rb', line 56

def new; end

#rejectvoid

This method returns an undefined value.

POST /crm/certifications/:id/reject — cancels a certification request.



138
139
140
141
142
143
144
145
146
147
# File 'app/controllers/crm/certifications_controller.rb', line 138

def reject
  @certification = Certification.find(params.expect(:id))
  @customer = @certification.party
  if @certification.cancel
    flash[:info] = "Certification rejected"
  else
    flash[:error] = "This certification can no longer be rejected (state: #{@certification.state})."
  end
  redirect_back_or_to @certification
end

#showvoid

This method returns an undefined value.

GET /crm/certifications/:id — a single certification (HTML dashboard or
PDF certificate).



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'app/controllers/crm/certifications_controller.rb', line 28

def show
  @certification = Certification.find(params.expect(:id))
  @customer = @certification.party.customer
  @course_enrollment = @certification.course_enrollment
  @course = @course_enrollment.course if @course_enrollment.present?
  if @course.present?
    dashboard = Course::DashboardStats.call(@course)
    @topic_categories = dashboard.topic_categories
    @topic_exams = dashboard.topic_exams
    @recent_enrollments = dashboard.recent_enrollments
    @stats = dashboard.stats
  end
  respond_to do |format|
    format.html
    format.pdf do
      result = Pdf::Document::Certificate.call(@certification)
      send_data result.pdf,
        filename: result.file_name,
        type: 'application/pdf',
        disposition: 'inline',
        encoding: 'utf8'
    end
  end
end

#updatevoid

This method returns an undefined value.

PATCH/PUT /crm/certifications/:id — updates a certification.



83
84
85
86
87
88
89
90
# File 'app/controllers/crm/certifications_controller.rb', line 83

def update
  @certification = Certification.find(params.expect(:id))
  if @certification.update(certification_params)
    redirect_to @certification, notice: 'Certification updated'
  else
    render :edit, status: :unprocessable_content
  end
end