Class: Crm::ItemDemandForecastAdditionsController

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

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, #initialize_crm_lazy_chunks, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download

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 Www::ImagesHelper

#image_asset_tag, #image_asset_url

Methods included from Www::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

#createObject



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

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_entity
  end
end

#create_quote_orderObject



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

def create_quote_order
  @type = params[:type]
  @quote_order_ref = params[:quote_order_ref]
  @date = params[:date]
  if params[:quote_order_ref].blank? or params[:date].blank?
    flash.now[:error] = 'Quote/Order reference number and Date must be specified'
    render :new_quote_order, status: :unprocessable_entity
  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_entity
    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_entity
    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



164
165
166
167
168
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 164

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

#delete_quote_orderObject



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

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

#destroyObject



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

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



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

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_entity
  else
    forecasts.each { |f| f.save! }
    flash[:info] = 'Forecast additions imported'
    redirect_to item_demand_forecast_additions_path
  end
end

#do_mass_date_updateObject



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

def do_mass_date_update
  @item_demand_forecast_additions = ItemDemandForecastAddition.where(id: params[:additions_ids].split(',').map(&:to_i))
                                                              .or(ItemDemandForecastAddition.where(parent_id: params[:additions_ids].split(',').map(&:to_i)))
  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



170
171
172
173
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 170

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

#editObject



78
79
80
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 78

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

#indexObject



2
3
4
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 2

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

#mass_date_updateObject



40
41
42
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 40

def mass_date_update
  @additions_ids = params[:additions_ids].split(',').map(&:to_i)
end

#mass_deleteObject



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

def mass_delete
  @item_demand_forecast_additions = ItemDemandForecastAddition.where(id: params[:additions_ids].split(',').map(&:to_i))
                                                              .or(ItemDemandForecastAddition.where(parent_id: params[:additions_ids].split(',').map(&:to_i)))
  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



6
7
8
# File 'app/controllers/crm/item_demand_forecast_additions_controller.rb', line 6

def new
  @item_demand_forecast_addition = ItemDemandForecastAddition.new
end

#updateObject



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

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_entity
  end
end