Class: Crm::WarrantiesController

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

Overview

CRM warranty registrations: rep manual entry of mailed-in warranty cards,
plus the search/reconciliation index for registrations that came in through
the public form without a matching order (Warranty Registration v2).
One Warranty per order/submission; every registered unit is a nested
Warranty::Product row.

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

#createvoid

This method returns an undefined value.

POST /warranties



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'app/controllers/crm/warranties_controller.rb', line 121

def create
  @warranty = Warranty.new(warranty_params)
  @warranty.registration_source = 'crm'
  @warranty.created_by = current_user
  authorize!(:create, @warranty)

  if @warranty.save
    # Customer confirmation (coverage summary) — no-ops when the keyed
    # customer has no email on file.
    WarrantyMailer.confirmation(@warranty).deliver_later
    redirect_to warranty_path(@warranty),
                notice: "Warranty registration saved (#{@warranty.products.size} #{'product'.pluralize(@warranty.products.size)})."
  else
    flash.now[:error] = @warranty.errors.full_messages.to_sentence
    render :new, status: :unprocessable_content
  end
end

#destroyvoid

This method returns an undefined value.

DELETE /warranties/1



155
156
157
158
159
# File 'app/controllers/crm/warranties_controller.rb', line 155

def destroy
  authorize!(:destroy, @warranty)
  @warranty.destroy
  redirect_to warranties_path, notice: 'Warranty registration deleted.'
end

#editvoid

This method returns an undefined value.

GET /warranties/1/edit



114
115
116
# File 'app/controllers/crm/warranties_controller.rb', line 114

def edit
  authorize!(:update, @warranty)
end

#indexvoid

This method returns an undefined value.

GET /warranties



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/controllers/crm/warranties_controller.rb', line 14

def index
  authorize!(:read, Warranty)
  scope = Warranty.includes(:customer, :order, :created_by, :products)
  # Reconciliation queue: registrations we couldn't match to an order.
  # (`unmatched` is an optional query flag — `expect` would 400 without it.)
  @unmatched_only = params[:unmatched].to_b # rubocop:disable Rails/StrongParametersExpect
  scope = scope.unmatched if @unmatched_only

  q_params = params[:q]&.to_unsafe_h&.dup
  if (line = q_params&.delete(:product_line_eq)).present?
    scope = scope.where(id: Warranty::Product.where(product_line: line).select(:warranty_id))
  end

  # Installer name/company/phone — the installers report drills down with
  # an EXACT identity (installer_name + installer_company, the pair the
  # report groups by); the free-text `installer` box stays a broad
  # substring match. (Optional query flags — `expect` would 400 when
  # they're absent.)
  @installer_identity = { installer_name: params[:installer_name].presence,
                          installer_company: params[:installer_company].presence }.compact.presence
  @installer_filter = params[:installer].presence
  if @installer_identity
    scope = scope.merge(Warranty.installer_identity_matching(params[:installer_name], params[:installer_company]))
  elsif @installer_filter
    scope = scope.merge(Warranty.installer_matching(@installer_filter))
  end

  @q = scope.ransack(q_params)
  @q.sorts = 'submitted_at desc' if @q.sorts.empty?
  @pagy, @warranties = pagy(@q.result, limit: 25,
                                       params: ->(p) { p.merge(unmatched: params[:unmatched], installer: @installer_filter, **(@installer_identity || {})).compact })
end

#installersvoid

This method returns an undefined value.

GET /warranties/installers — installer activity report: who is
installing our products, aggregated across every registration
(public, CRM-keyed, and backfilled legacy rows).



52
53
54
55
# File 'app/controllers/crm/warranties_controller.rb', line 52

def installers
  authorize!(:read, Warranty)
  @installer_stats = Warranty.installer_stats
end

#match_ordervoid

This method returns an undefined value.

GET /warranties/match_order?q=114-2710445-2220226

Asked by the External Order # field while the rep types: when the number
matches an order we already have (reference, EDI PO, invoice — the same
variants the public lookup tries), the form offers to attach it and
prefill one product row per unit instead of keying an unmatched entry.



99
100
101
102
103
104
105
106
107
108
109
# File 'app/controllers/crm/warranties_controller.rb', line 99

def match_order
  authorize!(:create, Warranty)
  order = Warranty::OrderLookup.match(params[:q].to_s)
  if order
    render json: { found: true, order_id: order.id, reference: order.reference_number,
                   customer: order.customer.full_name,
                   prefill_url: new_warranty_path(order_id: order.id) }
  else
    render json: { found: false }
  end
end

#newvoid

This method returns an undefined value.

GET /warranties/new

With order_id (from the ?order_id link or the order picker reloading
the form), shared fields prefill from the order and the products list
seeds one row per registrable unit — a qty-3 roll line makes three rows,
since every roll has its own serial and readings on the card.



78
79
80
81
82
83
84
85
86
87
88
89
# File 'app/controllers/crm/warranties_controller.rb', line 78

def new
  authorize!(:create, Warranty)
  order = Order.find_by(id: params[:order_id])
  @warranty = Warranty.new(
    registration_source: 'crm',
    order: order,
    customer_id: params[:customer_id].presence || order&.customer_id,
    purchased_on: Warranty.order_placed_on(order)
  )
  prefill_products_from(order)
  @warranty.products.build if @warranty.products.empty?
end

#showvoid

This method returns an undefined value.

GET /warranties/1



60
61
62
63
64
65
66
67
68
# File 'app/controllers/crm/warranties_controller.rb', line 60

def show
  authorize!(:read, @warranty)
  @products = @warranty.products.includes(:line_item).order(:id).to_a
  # Everything on the matched order, so reps see the automatically
  # covered accessories/controls too — not just the registered rows.
  return unless @warranty.order

  @order_line_items = Warranty.displayable_line_items(@warranty.order)
end

#updatevoid

This method returns an undefined value.

PATCH /warranties/1



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

def update
  authorize!(:update, @warranty)
  if @warranty.update(warranty_params)
    redirect_to warranty_path(@warranty), notice: 'Warranty registration updated.'
  else
    flash.now[:error] = @warranty.errors.full_messages.to_sentence
    render :edit, status: :unprocessable_content
  end
end