Class: Crm::ItemDemandForecastAdditionsController

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

Overview

Controller: item demand forecast additions.

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

Constants included from Www::SeoHelper

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

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?, #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::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 ApplicationHelper

#better_number_to_currency, #check_force_logout, #check_or_cross, #check_or_times, #embedded_tab_frame_id, #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 Www::ImagesHelper

#image_asset_tag, #image_asset_url

Methods included from Www::SeoHelper

#add_page_schema, #add_webpage_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

#createObject



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

def create
  @item_demand_forecast_addition = ItemDemandForecastAddition.new(params[:item_demand_forecast_addition])
  if @item_demand_forecast_addition.save
    redirect_to item_demand_forecast_additions_path
  else
    render :new, status: :unprocessable_content
  end
end

#create_quote_orderObject



12
13
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
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 12

def create_quote_order
  @type = params[:type]
  @quote_order_ref = params[:quote_order_ref]
  @date = params[:date]
  if params[:quote_order_ref].blank? || params[:date].blank?
    flash.now[:error] = 'Quote/Order reference number and Date must be specified'
    render :new_quote_order, status: :unprocessable_content
  elsif params[:type] == 'order'
    order = Order.where(reference_number: params[:quote_order_ref].upcase).first
    if order.nil?
      flash.now[:error] = "Unable to find order with reference #{params[:quote_order_ref]}"
      render :new_quote_order, status: :unprocessable_content
    else
      ItemDemandForecastAddition.add_order(order, params[:date])
      flash[:info] = 'All items from Order added'
      redirect_to item_demand_forecast_additions_path
    end
  elsif params[:type] == 'quote'
    quote = Quote.where(reference_number: params[:quote_order_ref].upcase.gsub('-R', '-r')).first
    if quote.nil?
      flash.now[:error] = "Unable to find quote with reference #{params[:quote_order_ref]}"
      render :new_quote_order, status: :unprocessable_content
    else
      ItemDemandForecastAddition.add_quote(quote, params[:date])
      flash[:info] = 'All items from Quote added'
      redirect_to item_demand_forecast_additions_path
    end
  end
end

#delete_orderObject



166
167
168
169
170
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 166

def delete_order
  @item_demand_forecast_addition = ItemDemandForecastAddition.find(params[:id])
  ItemDemandForecastAddition.destroy_by(order_id: @item_demand_forecast_addition.order_id)
  redirect_to item_demand_forecast_additions_path(notice: 'All Item Demand Forecast Additions for order deleted')
end

#delete_quote_orderObject



156
157
158
159
160
161
162
163
164
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 156

def delete_quote_order
  @item_demand_forecast_addition = ItemDemandForecastAddition.find(params[:id])
  if @item_demand_forecast_addition.category == 'order'
    @item_demand_forecast_addition = ItemDemandForecastAddition.destroy_by(order_id: @item_demand_forecast_addition.order_id)
  elsif @item_demand_forecast_addition.category == 'quote'
    @item_demand_forecast_addition = ItemDemandForecastAddition.destroy_by(quote_id: @item_demand_forecast_addition.quote_id)
  end
  redirect_to item_demand_forecast_additions_path(notice: 'All Item Demand Forecast Additions for #{@item_demand_forecast_addition.category} deleted')
end

#destroyObject



146
147
148
149
150
151
152
153
154
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 146

def destroy
  @item_demand_forecast_addition = ItemDemandForecastAddition.find(params[:id])
  if @item_demand_forecast_addition.destroy
    redirect_to item_demand_forecast_additions_path(notice: 'Item Demand Forecast Addition deleted')
  else
    redirect_to item_demand_forecast_additions_path,
                flash: { error: @item_demand_forecast_addition.errors_to_s.presence || 'Could not delete forecast addition.' }
  end
end

#do_import_from_csvObject



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
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 103

def do_import_from_csv
  forecasts = []
  errors = []
  imported_forecasts_csv = params.dig(:upload, :imported_forecasts_csv)
  file_path = imported_forecasts_csv.tempfile.path.to_s
  CSV.foreach(file_path, headers: true) do |row|
    if row.first[1].present?
      sku = row.first[1].to_s.squish.upcase
      item = Item.where('sku ilike ?', sku).first
      errors << "Item #{sku} not found." if item.nil?

      parsed_date = parse_forecast_date(row['Date'])
      if parsed_date.nil?
        # Skip the row so one malformed date doesn't 500 the whole import
        # (AppSignal #4819). Surface the problem alongside the other
        # row-level errors the view already renders.
        errors << "Invalid date '#{row['Date']}' for SKU #{sku}."
        next
      end

      idf = ItemDemandForecastAddition.new(
        item_id: item&.id,
        quantity: row['Quantity'].to_i,
        date: parsed_date,
        category: row['Category'],
        description: row['Description'],
        store_id: row['Store']
      )
      errors += idf.errors.full_messages unless idf.valid?
      forecasts << idf
    end
  end

  if errors.any?
    flash.now[:error] = errors.uniq.join(', ')
    render :import_from_csv, status: :unprocessable_content
  else
    forecasts.each(&:save!)
    flash[:info] = 'Forecast additions imported'
    redirect_to item_demand_forecast_additions_path
  end
end

#do_mass_date_updateObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 46

def do_mass_date_update
  @item_demand_forecast_additions = ItemDemandForecastAddition.where(id: Array(params[:additions_ids]).map(&:to_i).reject(&:zero?))
                                                              .or(ItemDemandForecastAddition.where(parent_id: Array(params[:additions_ids]).map(&:to_i).reject(&:zero?)))
  begin
    if @item_demand_forecast_additions.update_all(date: params[:new_date])
      flash[:info] = 'Item Demand Forecast Additions updated'
      redirect_to item_demand_forecast_additions_path
    else
      flash[:error] = 'There was an error updating the Item Demand Forecast Additions.'
      redirect_to item_demand_forecast_additions_path
    end
  rescue StandardError => e
    flash[:error] = "An error occurred: #{e.message}"
    redirect_to item_demand_forecast_additions_path
  end
end

#download_sample_csvObject



172
173
174
175
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 172

def download_sample_csv
  file_path = Rails.root.join('data/import_templates/item_demand_forecast/item_demand_forecast_additions_sample.csv')
  send_file_accelerated(file_path, download: true, preserve_source: true)
end

#editObject



80
81
82
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 80

def edit
  @item_demand_forecast_addition = ItemDemandForecastAddition.find(params[:id])
end

#indexObject



4
5
6
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 4

def index
  @item_demand_forecast_additions = ItemDemandForecastAddition.where(date: Date.current.monday..).order(:date, :id)
end

#mass_date_updateObject



42
43
44
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 42

def mass_date_update
  @additions_ids = Array(params[:additions_ids]).map(&:to_i).reject(&:zero?)
end

#mass_deleteObject



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 63

def mass_delete
  @item_demand_forecast_additions = ItemDemandForecastAddition.where(id: Array(params[:additions_ids]).map(&:to_i).reject(&:zero?))
                                                              .or(ItemDemandForecastAddition.where(parent_id: Array(params[:additions_ids]).map(&:to_i).reject(&:zero?)))
  begin
    if @item_demand_forecast_additions.destroy_all
      flash[:info] = 'Item Demand Forecast Additions deleted'
      redirect_to item_demand_forecast_additions_path
    else
      flash[:error] = 'There was an error deleting the Item Demand Forecast Additions.'
      redirect_to item_demand_forecast_additions_path
    end
  rescue StandardError => e
    flash[:error] = "An error occurred: #{e.message}"
    redirect_to item_demand_forecast_additions_path
  end
end

#newObject



8
9
10
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 8

def new
  @item_demand_forecast_addition = ItemDemandForecastAddition.new
end

#updateObject



93
94
95
96
97
98
99
100
101
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 93

def update
  @item_demand_forecast_addition = ItemDemandForecastAddition.find(params[:id])
  if @item_demand_forecast_addition.update(params[:item_demand_forecast_addition])
    flash[:info] = 'Item Demand Forecast Addition updated'
    redirect_to item_demand_forecast_additions_path
  else
    render :edit, status: :unprocessable_content
  end
end