Class: DiscountsController

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

Overview

== Schema Information

Table name: discounts

id :integer not null, primary key
coupon_id :integer not null
itemizable_type :string(50)
itemizable_id :integer not null
amount :decimal(8, 2)
notes :text
effective_date :datetime
blacklisted :boolean
user_amount :decimal(8, 2)
Applies and removes coupon-based Discounts on a polymorphic itemizable
(order, quote, etc.), resolved from the request context by set_context.

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_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.

Applies a coupon to the context object via Coupon::ApplyCoupon.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'app/controllers/discounts_controller.rb', line 36

def create
  res = Coupon::ApplyCoupon.new.perform(@context_object, params[:discount])
  flash[:error] = res.errors unless res.success?
  respond_to do |format|
    format.turbo_stream do
      if res.success?
        # Reload to get updated total from database trigger
        @context_object.reload
        @discounts = @context_object.discounts.includes(:coupon)
        # TurboStreamFlashable concern will automatically append flash messages
        render turbo_stream: [
          turbo_stream.replace(
            'discount_summary',
            partial: 'discounts/summary',
            locals: { itemizable: @context_object }
          ),
          turbo_stream.update('coupon_search_results', '') # Clear search results after successful application
        ]
      else
        # On failure, just show flash messages (TurboStreamFlashable handles this)
        render turbo_stream: turbo_stream.update('coupon_search_results', '') # Clear search results even on failure
      end
    end
    format.html do
      redirect_to polymorphic_path([@context_object, :discounts])
    end
  end
end

#destroyvoid

This method returns an undefined value.

Removes a discount via Coupon::DeleteDiscount.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'app/controllers/discounts_controller.rb', line 68

def destroy
  discount = Discount.find(params[:id])
  itemizable = discount.itemizable
  res = Coupon::DeleteDiscount.new.perform(discount)
  flash[:error] = res.errors unless res.success?

  respond_to do |format|
    format.turbo_stream do
      @context_object = itemizable
      # Reload to get updated total from database trigger
      @context_object.reload
      @discounts = @context_object.discounts.includes(:coupon)
      render turbo_stream: turbo_stream.replace(
        'discount_summary',
        partial: 'discounts/summary',
        locals: { itemizable: @context_object }
      )
    end
    format.html do
      redirect_to polymorphic_path([itemizable, :discounts])
    end
  end
end

#indexvoid

This method returns an undefined value.

Lists discounts on the current context object, or redirects with an
error if the context couldn't be resolved.



24
25
26
27
28
29
30
31
# File 'app/controllers/discounts_controller.rb', line 24

def index
  if @context_object.present?
    @discounts = @context_object.discounts.includes(:coupon)
  else
    flash[:error] = 'Wrong URL'
    redirect_to root_path
  end
end