Class: MailingsController

Inherits:
CrmController show all
Includes:
Controllers::Destroyable
Defined in:
app/controllers/mailings_controller.rb

Overview

Controller: mailings.

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::Destroyable

#destroy, #perform_destroy

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 mailing from params[:mailing] and redirects to it (or back to the index on failure).



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

def create
  @mailing = Mailing.new(params[:mailing])
  if @mailing.save
    redirect_to mailing_path(@mailing)
  else
    redirect_to mailings_path, error: 'Unable to create mailing'
  end
end

#indexvoid

This method returns an undefined value.

Lists all mailings, most recent first.



32
33
34
# File 'app/controllers/mailings_controller.rb', line 32

def index
  @pagy, @mailings = pagy(Mailing.order(id: :desc))
end

#manually_complete_all_mail_activitiesvoid

This method returns an undefined value.

Manually completes every open/postage-labeled mail activity of the mailing and
redirects back with the outcome.



117
118
119
120
121
122
123
124
125
126
127
128
# File 'app/controllers/mailings_controller.rb', line 117

def manually_complete_all_mail_activities
  @mailing = Mailing.find(params[:id])
  @mailing.mail_activities.open.each(&:manually_complete_mail_activity)
  @mailing.mail_activities.postage_labeled.each(&:complete_mail_activity)
  if @mailing.mail_activities.all?(&:complete?)
    flash[:info] = 'All mail activities are now completed.'
  else
    flash[:error] =
      "Not all mail activities could be completed. #{@mailing.mail_activities.packaged.count + @mailing.mail_activities.postage_rated.count} have packages defined that need to be cleared or postage labeled."
  end
  redirect_to mailing_path(@mailing)
end

#newvoid

This method returns an undefined value.

Renders the new-mailing form: activity types grouped by Accounting and Marketing/Sale,
plus the open activities available for inclusion.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'app/controllers/mailings_controller.rb', line 57

def new
  mail_types = ActivityType.tagged_with('mailing').order(:task_type).pluck(:task_type, :id)
  accounting_types = ActivityType.where(task_type: ['ACTSTMT']).order(:task_type).pluck(:task_type, :id)
  all_activity_type_ids = accounting_types.map(&:last) + mail_types.map(&:last)
  @activity_types = { Accounting: accounting_types, 'Marketing/Sale': mail_types }
  selected_activity_type_ids = (params.try(:[], :q).try(:[], :activity_type_id_in) || []).filter_map(&:presence).uniq.sort
  store_id = params.dig(:q, :customer_catalog_store_id_eq).presence || 1
  @store = Store.find(store_id)

  @q = Activity.open_activities.ransack(params[:q])
  @q.customer_catalog_store_id_eq = store_id
  @q.activity_type_id_in = all_activity_type_ids if selected_activity_type_ids.blank?

  @q.sorts = ['campaign_name asc', 'activity_type_task_type asc', 'created_at asc'] if @q.sorts.blank?
  @pagy_open_mailings, @open_mailings = pagy(@q.result.includes(:party).references(:parties), limit: 250)
end

This method returns an undefined value.

Generates a combined PDF of all postage labels for the mailing and redirects to it.



132
133
134
135
136
137
138
139
140
141
# File 'app/controllers/mailings_controller.rb', line 132

def print_all_postage_labels
  @mailing = Mailing.find(params[:id])
  pdf, msg = @mailing.generate_all_postage_labels_pdf
  if pdf
    redirect_to upload_url(pdf)
  else
    flash[:error] = "No postage labels could be generated. #{msg}"
    redirect_to mailing_path(@mailing)
  end
end

#showvoid

This method returns an undefined value.

Shows a mailing with its ransack-filtered mail activities; also responds with a
CSV export of the mailing list.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'app/controllers/mailings_controller.rb', line 39

def show
  @mailing = Mailing.find(params[:id])
  @q = @mailing.mail_activities.ransack(params[:q])
  @pagy_activities, @mail_activities = pagy(@q.result, limit: 100)
  respond_to do |format|
    format.html
    format.csv do
      # send it to the browsah
      send_data generate_csv_string(@mail_activities),
                type: 'text/csv; charset=iso-8859-1; header=present',
                disposition: "attachment; filename=mailing_list_#{@mailing.created_at}.csv"
    end
  end
end

#updatevoid

This method returns an undefined value.

Starts mailing completion: when params[:complete_mailing] is present and no background
job is active, enqueues MailingCompletionWorker and redirects to the job page.



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'app/controllers/mailings_controller.rb', line 88

def update
  @mailing = Mailing.find(params[:id])
  if @mailing.complete?
    flash[:warning] = 'Mailing has already been completed'
    redirect_to(mailing_path(@mailing)) && return
  elsif params[:complete_mailing].present?
    if @mailing.has_active_background_job?
      flash[:error] = 'You must wait for any existing jobs to finish before starting a new one.'
      redirect_to(mailing_path(@mailing)) && return
    end
    options = {
      mailing_id: @mailing.id,
      current_user_id: @context_user.id,
      redirect_to: mailing_path(@mailing)
    }.stringify_keys
    job_id = MailingCompletionWorker.perform_async(options)
    if job_id
      @mailing.update(job_id:)
      redirect_to job_path(job_id)
    else
      flash[:error] = 'Mailing Completion Worker not queued. Please try again or contact support.'
      redirect_to_return_path_or_default mailing_path(@mailing)
    end
  end
end