Class: Www::RoomPlansController

Inherits:
ApplicationController show all
Defined in:
app/controllers/www/room_plans_controller.rb

Overview

noinspection RailsChecklist01

Constant Summary collapse

PREFAB_SHAPES =
{
  square: [
    { x: 243.84296513045595, y: 243.84296513045595 },
    { x: 731.5288953913679, y: 243.84296513045595 },
    { x: 731.5288953913679, y: 731.5288953913679 },
    { x: 243.84296513045595, y: 731.5288953913679 }
  ],
  l_shape: [
    { x: 243.84296513045595, y: 243.84296513045595 },
    { x: 731.5288953913679, y: 243.84296513045595 },
    { x: 731.5288953913679, y: 487.6859302609119 },
    { x: 487.6859302609119, y: 487.6859302609119 },
    { x: 487.6859302609119, y: 731.5288953913679 },
    { x: 243.84296513045595, y: 731.5288953913679 }
  ],
  t_shape: [
    { x: 243.84296513045595, y: 243.84296513045595 },
    { x: 975.3718605218238, y: 243.84296513045595 },
    { x: 975.3718605218238, y: 487.6859302609119 },
    { x: 731.5288953913679, y: 487.6859302609119 },
    { x: 731.5288953913679, y: 731.5288953913679 },
    { x: 487.6859302609119, y: 731.5288953913679 },
    { x: 487.6859302609119, y: 487.6859302609119 },
    { x: 243.84296513045595, y: 487.6859302609119 }
  ]
}

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

Constants included from SeoHelper

SeoHelper::AWARDS, SeoHelper::CA_ADDRESS, SeoHelper::CA_BUSINESS_HOURS, SeoHelper::CA_CONTACT_POINT, SeoHelper::CA_CURRENCIES, SeoHelper::CA_DESCRIPTION, SeoHelper::CA_FOUNDING_DATE, SeoHelper::CA_GLOBAL_LOCATION_NUMBER, SeoHelper::CA_LEGAL_NAME, SeoHelper::CA_LOCAL_BUSINESS, SeoHelper::CA_ONLINE_STORE, SeoHelper::CA_RETURN_POLICY, SeoHelper::CA_SALES_DEPARTMENT, SeoHelper::CA_SERVICE_AREA, SeoHelper::CA_URL, SeoHelper::CA_VAT_ID, SeoHelper::CA_WAREHOUSE_DEPARTMENT, SeoHelper::CA_WAREHOUSE_HOURS, SeoHelper::COMPANY_EMAIL, SeoHelper::COMPANY_LOGO, SeoHelper::COMPANY_NAME, SeoHelper::COMPANY_SLOGAN, SeoHelper::EXPERTISE, SeoHelper::FAX_NUMBER, SeoHelper::GS1_COMPANY_PREFIX, SeoHelper::ISO6523_CODE, SeoHelper::PAYMENT_METHODS, SeoHelper::PHONE_NUMBER, SeoHelper::PRIMARY_NAICS, SeoHelper::REFUND_TYPE, SeoHelper::RETURN_FEES, SeoHelper::RETURN_METHOD, SeoHelper::RETURN_POLICY_CATEGORY, SeoHelper::SECONDARY_NAICS, SeoHelper::SOCIAL_PROFILES, SeoHelper::US_ADDRESS, SeoHelper::US_BUSINESS_HOURS, SeoHelper::US_CONTACT_POINT, SeoHelper::US_CURRENCIES, SeoHelper::US_DESCRIPTION, SeoHelper::US_FOUNDING_DATE, SeoHelper::US_GLOBAL_LOCATION_NUMBER, SeoHelper::US_IMAGE, SeoHelper::US_LEGAL_NAME, SeoHelper::US_LOCAL_BUSINESS, SeoHelper::US_ONLINE_STORE, SeoHelper::US_RETURN_POLICY, SeoHelper::US_SALES_DEPARTMENT, SeoHelper::US_SERVICE_AREA, SeoHelper::US_TAX_ID, SeoHelper::US_URL, SeoHelper::US_WAREHOUSE_DEPARTMENT, SeoHelper::US_WAREHOUSE_HOURS

Constants included from IconHelper

IconHelper::CUSTOM_ICON_MAP, IconHelper::CUSTOM_SVG_DIR, IconHelper::DEFAULT_FAMILY

Instance Method Summary collapse

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #append_token, #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?, #stamp_impersonation_context, #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, #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::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, #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_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!, #authenticate_account_from_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 ApplicationHelper

#better_number_to_currency, #check_force_logout, #check_or_cross, #check_or_times, #error_messages, #general_disclaimer_on_product_installation_and_local_codes, #gridjs_from_html_table, #gridjs_table, #is_wy_ip, #line_break, #parent_layout, #pass_or_fail, #render_error_messages_list, #render_video_card, #resolved_auth_form_turbo_frame, #return_path_or, #safe_css_color, #set_return_path_if_present, #set_section_if_present, #tab_frame_id, #to_underscore, #track_page?, #turbo_section_wrapper, #turbo_tabs_request?, #url_on_same_domain_as_request, #widget_index_daily_focus_index_path, #working_hours?, #yes_or_no, #yes_or_no_highlighted, #yes_or_no_with_check_or_cross, #youtube_video

Methods included from UppyUploaderHelper

#file_uploader, #image_uploader, #large_file_uploader_s3, #lead_sketch_uploader, #rma_image_uploader, #rma_image_uploader_s3, #uppy_uploader, #video_uploader

Methods included from ImagesHelper

#image_asset_tag, #image_asset_url

Methods included from SeoHelper

#add_page_schema, #canada?, #company_social_links, #ensure_context_json, #json_ld_script_tag, #local_business_schema, #online_store_id, #online_store_schema, #page_main_entity, #page_main_entity_json, #render_auto_collection_page_schema, #render_collection_page_schema, #render_local_business_schema, #render_online_store_schema, #render_page_schemas, #render_page_video_schemas, #render_webpage_schema, #render_webpage_schema_with_collections, #usa?

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?

Methods included from IconHelper

#account_nav_icon, #fa_icon, #star_rating_html

Instance Method Details

#cloneObject



103
104
105
# File 'app/controllers/www/room_plans_controller.rb', line 103

def clone
  duplicate_room(@room_plan)
end

#createObject



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'app/controllers/www/room_plans_controller.rb', line 73

def create
  @room_plan = @context_user.room_plans.new(
    units: 'ftin',
    points: params[:prefab].present? ? Www::RoomPlansController::PREFAB_SHAPES[params[:prefab].to_sym] : Www::RoomPlansController::PREFAB_SHAPES[:square],
    heated_area: [],
    heated_area_offset: 4
  )

  if @room_plan.save
    if params[:room_configuration_id]
      room_configuration = @context_user.room_configurations.find(params[:room_configuration_id])
      room_configuration.update(room_plan_id: @room_plan.id) if room_configuration
    end
    redirect_to edit_room_plan_path(@room_plan, room_configuration_id: params[:room_configuration_id], return: params[:return])
  else
    redirect_to www_room_plans_path
  end
end

#destroyObject



107
108
109
110
111
112
113
114
115
# File 'app/controllers/www/room_plans_controller.rb', line 107

def destroy
  if @room_plan && @room_plan.ok_to_delete?
    @room_plan.destroy
    flash[:info] = 'Plan was successfully deleted'
  else
    flash[:error] = 'Plan cannot be deleted because it is referenced by one or more rooms/heated spaces.'
  end
  redirect_to www_room_plans_path
end

#duplicate_room(room) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'app/controllers/www/room_plans_controller.rb', line 131

def duplicate_room(room)
  new_room = @context_user.room_plans.create({
                                               **(room&.attributes&.except('id')&.symbolize_keys or {}),
                                               step: 1,
                                               parent_room: room&.id
                                             })

  room&.fixtures&.each do |f|
    f_id = DesignToolFixture.where(class_key: f['key']).pick(:id)
    new_room.room_plan_fixtures.build(design_tool_fixture_id: f_id, fixture_data: f) if f_id
  end
  new_room.save
  redirect_to edit_room_plan_path(new_room)
end

#editObject



61
62
63
64
65
66
67
68
69
70
71
# File 'app/controllers/www/room_plans_controller.rb', line 61

def edit
  if @room_plan.editing_locked?
    flash[:error] = "Plan is locked, please cancel the room/heated space's installation plan request, remove it from the cart or duplicate the room/heated space then edit it's plan."
    redirect_to my_room_path(@room_configuration)
  # elsif params[:share_key]
  #   redirect_to edit_room_plan_path(@room_plan&.id, return: params[:return])
  else
    response.headers['Cache-Control'] = 'private, no-cache, no-store'
    render :edit, layout: 'www/cms_page_fullscreen_blank' if @room_plan
  end
end

#finishObject



117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'app/controllers/www/room_plans_controller.rb', line 117

def finish
  if @room_configuration
    redirect_to complete_room_plan_tool_my_room_path(@room_configuration, request.query_parameters), notice: 'Plan was successfully updated.'
  elsif @room_plan
    redirect_to quote_builder_path(
      request.query_parameters.merge(
        custom_room_plan: @room_plan.id,
        heated_area: @room_plan&.heated_sq_ft&.round(2), # quote builder heated_area is different from room_plan
        room_area: @room_plan&.room_area&.round(2)
      )
    )
  end
end

#indexObject

GET /room_plans



39
40
41
# File 'app/controllers/www/room_plans_controller.rb', line 39

def index
  @room_plans = @context_user.room_plans.order('room_plans.updated_at DESC').includes(:room_configurations)
end

#newObject



51
52
53
54
55
56
57
58
59
# File 'app/controllers/www/room_plans_controller.rb', line 51

def new
  @rp_templates = ShowcaseLegacy.joins(:room_plan).includes(:room_plan, :room_type, :digital_assets)
  room_types_raw = @rp_templates.select(&:room_type).map { |sc| [sc.room_type_id, sc.room_type.name] }.uniq
  preferred_order = ['Bathroom', 'Shower/Sauna', 'Kitchen']

  preferred, others = room_types_raw.partition { |(_id, name)| preferred_order.include?(name) }
  preferred_sorted = preferred_order.map { |name| preferred.find { |(_id, n)| n == name } }.compact
  @room_types = preferred_sorted + others.sort_by(&:last)
end

#set_room_planObject



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
177
# File 'app/controllers/www/room_plans_controller.rb', line 146

def set_room_plan
  begin
    @room_plan = @context_user.room_plans.find(params[:id])
  rescue ActiveRecord::RecordNotFound
    room_plan_original = nil

    room_plan_original = RoomPlan.find(RhcParamSet.find_by(md5_hash_key: params[:share_key])&.processed_parameters&.dig('custom_room_plan')) if params[:share_key]

    if params[:showcase_id]
      legacy = ShowcaseLegacy.find_by(id: params[:showcase_id])
      if legacy&.room_plan_id.present?
        room_plan_original = RoomPlan.find_by(id: legacy.room_plan_id)
        duplicate_room(room_plan_original) and return if room_plan_original
      end
    end

    if room_plan_original
      duplicate_room(room_plan_original)
    else
      flash[:error] = 'Plan could not be found. Session may have expired. Please sign in or start again.'
      redirect_to www_room_plans_path
    end
  end

  return unless @room_plan

  @room_configuration = if params[:room_configuration_id]
                          @context_user.room_configurations.find(params[:room_configuration_id])
                        else
                          @room_plan.room_configurations.last
                        end
end

#showObject

GET /room_plans/1



44
45
46
47
48
49
# File 'app/controllers/www/room_plans_controller.rb', line 44

def show
  respond_to do |format|
    format.json { render json: @room_plan.serialize_state }
    format.html
  end
end

#updateObject



92
93
94
95
96
97
98
99
100
101
# File 'app/controllers/www/room_plans_controller.rb', line 92

def update
  body = JSON.parse(request.body.read)

  if body['rp'].present? && !@room_plan.editing_locked?
    @room_plan.save_state(body['rp'])
    head :accepted
  else
    head :not_acceptable
  end
end