Class: ShipmentsController

Inherits:
CrmController show all
Includes:
Controllers::Showable, Controllers::Workflowable
Defined in:
app/controllers/shipments_controller.rb

Overview

Controller: shipments.

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 included from Controllers::Workflowable

#render_workflow_error_stream, #render_workflow_success_stream, #workflow_action, #workflow_action_complete

Methods included from Controllers::Showable

#perform_show, #show

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

#auditvoid

This method returns an undefined value.

Renders the shipment audit form.



59
60
61
62
# File 'app/controllers/shipments_controller.rb', line 59

def audit
  authorize!(:manage, Shipment)
  @audit_form = Shipment::AuditForm.new(created_at_gteq: 1.month.ago)
end

#carton_labelvoid

This method returns an undefined value.

Streams the shipment's carton label PDF.



27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/controllers/shipments_controller.rb', line 27

def carton_label
  result = Shipping::CartonLabelGenerator.new.process(@shipment)

  respond_to do |format|
    format.pdf do
      send_data result.pdf,
        filename: result.file_name,
        type: 'application/pdf',
        disposition: 'inline'
    end
  end
end

#destroyvoid

This method returns an undefined value.

Deletes the shipment, cancelling its delivery's shipments if none have
completed, then redirects back to the most relevant parent record.



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

def destroy
  delivery = @shipment.delivery
  delivery.cancel_shipments! if delivery && delivery.shipments.completed.none? && delivery.can_cancel_shipments?
  @shipment.destroy

  default_path = params[:return_path].presence
  if delivery
    default_path ||= delivery_path(delivery)
  elsif @shipment.mail_activity
    @shipment.mail_activity.reset_mail_activity if @shipment.mail_activity.ready_to_reset?
    default_path ||= mail_activity_path(@shipment.mail_activity)
  elsif @shipment.standalone_delivery
    @shipment.standalone_delivery.reset_standalone_delivery if @shipment.standalone_delivery.ready_to_reset?
    default_path ||= mail_activity_path(@shipment.mail_activity)
  elsif @shipment.order
    default_path ||= order_path(@shipment.order)
  end
  default_path ||= root_path

  redirect_to_return_path_or_default(default_path)
end

#editObject

GET /shipments/1/edit



92
# File 'app/controllers/shipments_controller.rb', line 92

def edit; end

#indexvoid

This method returns an undefined value.

Lists shipments (label-complete/manually-complete by default).



12
13
14
15
16
17
18
19
20
21
22
# File 'app/controllers/shipments_controller.rb', line 12

def index
  params[:q] ||= { state_in: %w[label_complete manually_complete] }

  @q = Shipment.ransack(params[:q])
  @q.sorts = 'created_at desc' if @q.sorts.blank?

  @pagy, @shipments = pagy(@q.result
                .joins([:delivery, { order: { customer: { catalog: :store } } }])
                .includes(:order)
                .select('shipments.*, catalogs.store_id, stores.short_name, deliveries.actual_shipping_cost as delivery_actual_shipping_cost'), items: 100)
end

#perform_auditvoid

This method returns an undefined value.

Runs the submitted shipment audit.



67
68
69
70
71
72
73
74
75
76
77
78
# File 'app/controllers/shipments_controller.rb', line 67

def perform_audit
  authorize!(:manage, Shipment)
  @audit_form = Shipment::AuditForm.new(params[:shipment_audit_form])
  if @audit_form.valid?
    res = @audit_form.execute
    flash[res.success? ? :notice : :error] = res.message
    redirect_to_return_path_or_default shipments_path
  else
    flash.now[:error] = @audit_form.errors_to_s.presence || 'Audit form is invalid.'
    render :audit, status: :unprocessable_content
  end
end

#refresh_tracking_statusObject

GET /shipments/1/refresh_tracking_status



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

def refresh_tracking_status
  res = Shipping::PackageShipmentTracking.new.process([@shipment])
  if res.shipments_tracking_succeeded.any?
    flash[:notice] = 'Tracking status refreshed.'
  else
    flash[:error] = "Tracking status could not be refreshed: #{res.shipments_tracking_failed_msgs.join(', ')}"
  end
  redirect_back_or_to(request.referer || shipments_path(@shipment))
end

#speedee_labelvoid

This method returns an undefined value.

Streams the shipment's Spee-Dee label PDF.



43
44
45
46
47
48
49
50
51
52
53
54
# File 'app/controllers/shipments_controller.rb', line 43

def speedee_label
  result = Pdf::Label::Speedee.call(@shipment, @shipment.delivery.selected_shipping_cost.rate_data)

  respond_to do |format|
    format.pdf do
      send_data result.pdf,
        filename: result.file_name,
        type: 'application/pdf',
        disposition: 'inline'
    end
  end
end

#updatevoid

This method returns an undefined value.

Updates the shipment's package dimensions/delivery attrs and marks it
labeled if a ship confirm was pending.



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

def update
  options = {}
  length = nil
  width = nil
  height = nil
  # puts "Shipment#update: params[:package][:id]: #{params[:package][:id]}"
  if (package_id = params.dig(:package, :id))
    wh_package = WarehousePackage.where(id: package_id).first
    # puts "Shipment#update: wh_package: #{wh_package.inspect rescue 'none found'}"
    if wh_package
      length = wh_package.length
      width = wh_package.width
      height = wh_package.height
    end
  end
  options = { 'length' => length, 'width' => width, 'height' => height } if length || width || height
  @package = begin
    wh_package.dup
  rescue StandardError
    WarehousePackage.new
  end
  delivery_attrs = params[:shipment].delete(:delivery)
  if @shipment.update(params[:shipment].merge(options))
    delivery_attrs.merge!({ incorrectly_packaged_ups_canada_order_fixed: true }) if @shipment.delivery.incorrectly_packaged_ups_canada_order
    @shipment.delivery.update(delivery_attrs) if delivery_attrs.present?
    @shipment.delivery.ship_labeled if params[:pending_ship_confirm].to_b && !@shipment.delivery.incorrectly_packaged_ups_canada_order
    redirect_to_return_path_or_default(shipment_path(@shipment))
  else
    render :edit, status: :unprocessable_content
  end
end