Class: StoreItemsController

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

Overview

== Schema Information

Table name: store_items

id :integer not null, primary key
item_id :integer
store_id :integer
qty_on_hand :integer default(0)
qty_committed :integer default(0)
unit_cogs :decimal(10, 4)
handling_charge :decimal(8, 2)
created_at :datetime
updated_at :datetime
is_discontinued :boolean default(FALSE)
requires_serial_number :boolean default(FALSE)
location :string(255)
last_item_ledger_entry_id :integer

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

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

#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

#createvoid

This method returns an undefined value.

Creates a store item from submitted params.



62
63
64
65
66
67
68
69
70
# File 'app/controllers/store_items_controller.rb', line 62

def create
  @item = Item.find(params[:item_id])
  @store_item = @item.store_items.build(params[:store_item])
  if @store_item.save
    redirect_to item_path(@store_item.item, tab: "store_items"), info: "Store item #{@store_item.id} created"
  else
    render :new, status: :unprocessable_content
  end
end

#defaults_for_catalog_itemObject

Used to pull the default pricing for a new catalog item linked to a store item
on catalog item new after selecting a store item



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'app/controllers/store_items_controller.rb', line 157

def defaults_for_catalog_item
  @store_item = StoreItem.find(params[:store_item_id])
  @catalog = Catalog.find(params[:catalog_id])
  @catalog_item = @catalog.catalog_items.new(store_item: @store_item)

  parent_catalog_item_amount = @catalog_item.parent_catalog_item_amount
  if parent_catalog_item_amount && @catalog.parent_catalog_discount
    amount = parent_catalog_item_amount * (1 - @catalog.parent_catalog_discount)
    render json: { parent_catalog_item_amount: parent_catalog_item_amount,
                   amount: amount,
                   catalog_discount_human: @catalog_item.catalog_discount_human }
  else
    render json: {}
  end
end

#destroyvoid

This method returns an undefined value.

Deletes a store item.



88
89
90
91
92
93
94
95
96
97
# File 'app/controllers/store_items_controller.rb', line 88

def destroy
  @store_item = StoreItem.find(params[:id])
  @item = @store_item.item
  begin
    @store_item.destroy
    redirect_to item_path(@store_item.item, tab: "store_items"), info: "Store item #{@store_item.id} has been deleted"
  rescue ActiveRecord::RecordNotDestroyed
    redirect_to edit_store_item_path(@store_item), info: 'Unable to delete store item. Please contact Heatwave team or discontinue instead.'
  end
end

#editvoid

This method returns an undefined value.

Loads a store item for editing.



54
55
56
57
# File 'app/controllers/store_items_controller.rb', line 54

def edit
  @store_item = StoreItem.find(params[:id])
  @item = @store_item.item
end

#indexvoid

This method returns an undefined value.

Lists store items, paginated.



26
27
28
# File 'app/controllers/store_items_controller.rb', line 26

def index
  @pagy, @store_items = pagy(StoreItem.order(:store_id, :location, :is_discontinued, :id).includes(%i[catalog_items packagings]).with_back_order_quantities)
end

#lookupvoid

This method returns an undefined value.

Returns store item autocomplete/picker results as JSON.



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
# File 'app/controllers/store_items_controller.rb', line 102

def lookup
  if (store_item_id = params[:store_item_id])
    @store_items = StoreItem.where(id: store_item_id)
  else

    company_id = params[:company_id].presence
    exclude_catalog_id = params[:exclude_catalog_id].presence
    store_id = params[:store_id].presence
    location = params[:location].presence || 'AVAILABLE'
    @store_items = StoreItem.active.joins(:item, :store).select('store_items.*') # .merge(Item.non_publications)
    @store_items = @store_items.not_in_catalog_id(exclude_catalog_id.to_i) if exclude_catalog_id
    @store_items = @store_items.where(stores: { company_id: company_id }) if company_id
    @store_items = @store_items.where(store_id: store_id) if store_id
    @store_items = @store_items.where(location: location) if location
    @store_items = if (q = params[:q].presence || params[:term].presence || params[:default_term].presence)
                     @store_items.merge(Item.wild_search(q))
                   else
                     @store_items.order(Item[:sku])
                   end
    @store_items = @store_items
  end
  return_id = params[:return_id].presence || 'id'
  res = TomSelect.format_json_results(self, @store_items, params[:page], params[:per_page]) do |e|
    { id: e.send(return_id), text: e.selection_name, tax_class: e.item.tax_class, name: e.item.name,
      qty_available: e.qty_available, qty_on_hand: e.qty_on_hand, unit_cogs: e.unit_cogs, store_item_id: e.id }
  end
  render json: res
end

#lookup_serial_numbersvoid

This method returns an undefined value.

Returns serial-number autocomplete results for a store item, as JSON.



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'app/controllers/store_items_controller.rb', line 134

def lookup_serial_numbers
  if params[:store_item_id].blank?
    res = {
      results: [],
      pagination: {
        total: 0,
        more: false
      }
    }
  else
    @serial_numbers = SerialNumber.available.where(store_item_id: params[:store_item_id])
    if (q = params[:q].presence || params[:term].presence)
      @serial_numbers = @serial_numbers.where(SerialNumber[:number].matches("#{q}%"))
    end
    res = TomSelect.format_json_results(self, @serial_numbers, params[:page], params[:per_page]) do |e|
      { id: e.id, text: e.number_and_qty }
    end
  end
  render json: res
end

#newvoid

This method returns an undefined value.

Builds a new, unsaved store item for the given item/store.



42
43
44
45
46
47
48
49
# File 'app/controllers/store_items_controller.rb', line 42

def new
  @item = Item.find(params[:item_id])
  if params[:store_id].present?
    @store_item = @item.store_items.build store_id: params[:store_id]
  else
    redirect_to item_path(@item, tab: "store_items"), error: 'A store must be specified'
  end
end

#showvoid

This method returns an undefined value.

Redirects to the store item's parent item's store-items tab.



33
34
35
36
37
# File 'app/controllers/store_items_controller.rb', line 33

def show
  @store_item = StoreItem.find(params[:id])
  # for now redirect to the item
  redirect_to item_path(@store_item.item, tab: "store_items")
end

#updatevoid

This method returns an undefined value.

Updates a store item from submitted params.



75
76
77
78
79
80
81
82
83
# File 'app/controllers/store_items_controller.rb', line 75

def update
  @store_item = StoreItem.find(params[:id])
  @item = @store_item.item
  if @store_item.update(params[:store_item])
    redirect_to_return_path_or_default item_path(@store_item.item, tab: "store_items"), info: "Store item #{@store_item.id} updated"
  else
    render :edit, status: :unprocessable_content
  end
end