Class: Crm::WarrantiesController
- Inherits:
-
CrmController
- Object
- ActionController::Base
- ApplicationController
- CrmController
- Crm::WarrantiesController
- 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
-
#create ⇒ void
POST /warranties.
-
#destroy ⇒ void
DELETE /warranties/1.
-
#edit ⇒ void
GET /warranties/1/edit.
-
#index ⇒ void
GET /warranties.
-
#installers ⇒ void
GET /warranties/installers — installer activity report: who is installing our products, aggregated across every registration (public, CRM-keyed, and backfilled legacy rows).
-
#match_order ⇒ void
GET /warranties/match_order?q=114-2710445-2220226.
-
#new ⇒ void
GET /warranties/new.
-
#show ⇒ void
GET /warranties/1.
-
#update ⇒ void
PATCH /warranties/1.
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
#create ⇒ void
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 (: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..to_sentence render :new, status: :unprocessable_content end end |
#destroy ⇒ void
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 (:destroy, @warranty) @warranty.destroy redirect_to warranties_path, notice: 'Warranty registration deleted.' end |
#edit ⇒ void
This method returns an undefined value.
GET /warranties/1/edit
114 115 116 |
# File 'app/controllers/crm/warranties_controller.rb', line 114 def edit (:update, @warranty) end |
#index ⇒ void
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 (: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 |
#installers ⇒ void
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 (:read, Warranty) @installer_stats = Warranty.installer_stats end |
#match_order ⇒ void
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 (: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 |
#new ⇒ void
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 (: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 |
#show ⇒ void
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 (: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 |
#update ⇒ void
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 (:update, @warranty) if @warranty.update(warranty_params) redirect_to warranty_path(@warranty), notice: 'Warranty registration updated.' else flash.now[:error] = @warranty.errors..to_sentence render :edit, status: :unprocessable_content end end |