Class: Www::LeadsController

Inherits:
BasePortalController show all
Defined in:
app/controllers/www/leads_controller.rb

Overview

Controller: leads.

Constant Summary

Constants included from Controllers::MasqueradeGuarded

Controllers::MasqueradeGuarded::DEFAULT_BLOCK_MESSAGE

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 BasePortalController

#current_ability, #portal_party, #set_catalog, #set_webpack

Methods included from Controllers::MasqueradeGuarded

block_while_masquerading, #masquerade_blocks?

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

#call_mevoid

This method returns an undefined value.

Places a callback via the phone system to the submitted number, if
phone-chat is currently available.



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'app/controllers/www/leads_controller.rb', line 173

def call_me
  check_current_time
  phone_number = PhoneNumber.parse_and_format(params[:phone_number])
  respond_to do |format|
    if @phone_chat_status
      if phone_number.nil?
        flash.now[:info] = 'Wrong Number? Please verify that the number you entered is correct and we\'ll try again.'
        format.turbo_stream { render partial: 'shared/flash' }
      else
        @context_user.phone = phone_number
        pbx = Phone::Pbx.instance
        result = begin
          pbx.place_call('616', phone_number, '1161')
        rescue StandardError
          false
        end
        if result == false
          flash.now[:info] = 'Sorry About That. Something went wrong with processing the call. Please try again in a few minutes.'
          format.turbo_stream { render partial: 'shared/flash' }
        else
          format.turbo_stream { render 'quote_request_call_me_success' }
        end
      end
    else
      flash.now[:info] = 'Service Unavailable Right Now. We\'re sorry but that service isn\'t available right now. You can try again during business hours or just send us an email.'
      format.turbo_stream { render partial: 'shared/flash' }
    end
  end
end

#complete_trade_applicationvoid

This method returns an undefined value.

Appends the submitted trade-pro application answers to the user's most
recent open lead activity.



207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'app/controllers/www/leads_controller.rb', line 207

def complete_trade_application
  lead_notes = []
  lead_notes << "\r\nCUSTOMER WANTS TO BECOME A TRADE PRO"
  params[:tradepro_lead].each do |k, v|
    response = case v
               when '1'
                 'Yes'
               when '0'
                 'No'
               else
                 v
               end
    lead_notes << "#{k.to_s.titleize}: #{response}"
  end

  activity = @context_user.activities.open_activities.leads.last
  if activity.nil?
    @context_user.contacts.each do |co|
      activity = co.activities.open_activities.leads.last
    end
  end
  if activity.present?
    activity.notes += lead_notes.join("\r\n")
    activity.save
  end
  flash[:info] = 'Thank you. One of our experts will be in touch soon.'
  redirect_to cms_link('/')
end

#consultationvoid

This method returns an undefined value.

Renders the consultation-request contact form.



42
43
44
# File 'app/controllers/www/leads_controller.rb', line 42

def consultation
  check_current_time
end

#createvoid

This method returns an undefined value.

Creates a lead from the submitted contact form.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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
# File 'app/controllers/www/leads_controller.rb', line 61

def create
  backup_request
  lead_params = params.fetch(:lead, {}).to_h

  # Handle fallback file upload if present (when Uppy fails to initialize)
  # Native file input uses lead_fallback[sketch_drawings] instead of JSON upload IDs
  if params[:lead_fallback].present? && params[:lead_fallback][:sketch_drawings].present?
    fallback_files = Array(params[:lead_fallback][:sketch_drawings]).select { |f| f.respond_to?(:read) }
    if fallback_files.any?
      upload_ids = process_fallback_uploads(fallback_files)
      # Merge into lead_params as JSON array to match Uppy format
      lead_params['sketch_drawings'] = upload_ids.to_json if upload_ids.present?
    end
  end

  # Turnstile validates bot protection via before_action
  # SpamCheck validates contact points against known fraudulent customers
  is_fraud = SpamCheck.new.process(
    author_email: lead_params[:email].presence,
    phone_number: lead_params[:phone].presence,
    request: request
  )

  if is_fraud
    flash[:error] = 'There was an error submitting your request. Please call us at (800) 875-5285.'
    # Both Turbo and non-Turbo: navigate back to /contact. The
    # ApplicationController#redirect_to override defaults POST → 303
    # see_other so Turbo follows the redirect as a Visit.
    redirect_to cms_link('contact')
    return
  end

  send_invite = false
  if params[:lang] == 'es'
    request.env['HTTP_REFERER'] ||= cms_link('/contact_es')
    redirect_thank_you_url = '/contact_es/thank-you'
    error_notice = 'Ha ocurrido un error'
  elsif /trade/.match?(request.env['HTTP_REFERER'])
    redirect_thank_you_url = '/trade/thank-you'
    send_invite = true
  elsif /referral/.match?(request.env['HTTP_REFERER'])
    redirect_thank_you_url = '/referral-program/thank-you'
    send_invite = true
  elsif request.env['HTTP_REFERER'] =~ /support/ || request.env['HTTP_REFERER'] =~ %r{services/troubleshooting}
    redirect_thank_you_url = '/support/thank-you'
    send_invite = true
  else
    request.env['HTTP_REFERER'] ||= cms_link('/contact')
    redirect_thank_you_url = '/contact/thank-you'
  end
  error_notice ||= "Ooops, we couldn't process your request"
  @redirect_path = request.env['HTTP_REFERER']
  @lead = Lead.new(lead_params)
  save_result = @lead.save_to_user(@context_user.customer, send_invite)
  error_message = save_result.message unless save_result.success
  @frame_id = params[:frame_id].presence || 'contact-form-content'
  @support_case_reference = save_result.support_case_reference

  respond_to do |format|
    if error_message.blank?
      # Clear expiration_date for any uploaded files now attached via hidden field
      begin
        ids = begin
          JSON.parse(lead_params[:sketch_drawings].to_s)
        rescue StandardError
          []
        end
        Upload.where(id: ids).update_all(expiration_date: nil) if ids.present?
      rescue StandardError => _e
        # Non-blocking: if it fails, uploads will be cleaned up by expiration
      end

      # Record visit event for successful lead form submission
      record_lead_form_visit_event(lead_params)

      # Only include support_case_reference when the SupportCase branch
      # ran (Lead#save_to_user only populates it for create_support_case).
      # Otherwise `cms_link` would serialize nil as an empty `&support_case_reference`
      # query param on the thank-you URL.
      thank_you_params = { cn: @context_user.reference_number }
      thank_you_params[:support_case_reference] = save_result.support_case_reference if save_result.support_case_reference.present?
      thank_you_path = cms_link(redirect_thank_you_url, nil, parameters: thank_you_params)
      # Modal forms render an in-place turbo_stream that swaps the form
      # frame for a thank-you panel. Public lead forms (now Turbo-enabled)
      # navigate to the thank-you page via Turbo Visit — the
      # ApplicationController#redirect_to override defaults POST → 303
      # see_other so Turbo follows correctly.
      if params[:modal_form] == 'true'
        format.turbo_stream { render 'lead_form_modal_thank_you' }
        format.html        { redirect_to_return_path_or_default thank_you_path }
      else
        format.html        { redirect_to_return_path_or_default thank_you_path }
        format.turbo_stream { redirect_to_return_path_or_default thank_you_path }
      end
    else
      validation_details = @lead&.errors&.any? ? " #{@lead.errors.full_messages.to_sentence}" : ""
      flash[:error] = "#{error_notice}: #{error_message}#{validation_details}"
      if params[:modal_form] == 'true'
        format.turbo_stream { render 'lead_form_modal_error' }
        format.html         { redirect_to @redirect_path }
      else
        format.html         { redirect_to @redirect_path }
        format.turbo_stream { redirect_to @redirect_path }
      end
    end
  end
end

#form_contentObject

GET /contact/form
Turbo Frame lazy-loaded content for modal contact form
Reduces page load by only loading form, turnstile, and uppy when modal opens



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'app/controllers/www/leads_controller.rb', line 22

def form_content
  @show_upload = params[:show_upload] != 'false'
  @business_focused = params[:business_focused] == 'true'
  @submit_label = params[:submit_label].presence || 'Send Message'
  @header_title = params[:header_title].presence
  @header_intro = params[:header_intro].presence
  @application_type = params[:application_type].presence
  @activity_type_id = params[:activity_type_id].presence
  @about_project = params[:about_project].presence
  @frame_id = params[:frame_id].presence || 'contact-form-content'

  # Track form opened event (user opened the modal)
  record_lead_form_opened_event

  render layout: false
end

#newvoid

This method returns an undefined value.

Renders the general contact form.



12
13
14
15
16
17
# File 'app/controllers/www/leads_controller.rb', line 12

def new
  check_current_time
  @quote_builder_url = params[:quote_builder_url]
  @quote_reference = params[:quote_reference]
  @phone_chat_status = false
end

#new_esvoid

This method returns an undefined value.

Renders the Spanish-language contact form.



54
55
56
# File 'app/controllers/www/leads_controller.rb', line 54

def new_es
  check_current_time
end

#quotevoid

This method returns an undefined value.

Renders the quote-request contact form.



49
# File 'app/controllers/www/leads_controller.rb', line 49

def quote; end

#referral_thank_youvoid

This method returns an undefined value.

Renders the referral thank-you page.



253
254
255
# File 'app/controllers/www/leads_controller.rb', line 253

def referral_thank_you
  render action: 'referral_thank_you'
end

#support_thank_youvoid

This method returns an undefined value.

Renders the support-request thank-you page.



246
247
248
# File 'app/controllers/www/leads_controller.rb', line 246

def support_thank_you
  render action: 'support_thank_you'
end

#thank_youvoid

This method returns an undefined value.

Renders the general lead thank-you page.



260
261
262
# File 'app/controllers/www/leads_controller.rb', line 260

def thank_you
  render action: 'lead_form_thank_you'
end

#thank_you_esvoid

This method returns an undefined value.

Renders the Spanish-language lead thank-you page.



267
268
269
# File 'app/controllers/www/leads_controller.rb', line 267

def thank_you_es
  render action: 'lead_form_thank_you_es'
end

#trade_thank_youvoid

This method returns an undefined value.

Renders the trade-pro application thank-you page.



239
240
241
# File 'app/controllers/www/leads_controller.rb', line 239

def trade_thank_you
  render action: 'tradepro_lead_form_thank_you'
end