Updated

app/controllers/accounts / pipelines_controller.rb

F
235 lines of codes
20 methods
16.3 complexity/method
66 churn
326.62 complexity
69 duplications
require 'csv' require 'json_csv' class Accounts::PipelinesController < InternalController
  1. Accounts::PipelinesController assumes too much for instance variable '@deals'
  2. Accounts::PipelinesController assumes too much for instance variable '@event'
  3. Accounts::PipelinesController assumes too much for instance variable '@pipeline'
  4. Accounts::PipelinesController has no descriptive comment
  5. Accounts::PipelinesController has at least 8 instance variables
  6. Accounts::PipelinesController has at least 20 methods
before_action :set_pipeline, only: %i[show edit update destroy bulk_action new_bulk_action] before_action :set_bulk_action_event, only: %i[bulk_action new_bulk_action] before_action :set_stage, only: %i[bulk_action new_bulk_action] # GET /pipelines or /pipelines.json def index pipeline = Pipeline.first if pipeline redirect_to(account_pipeline_path(Current.account, pipeline))
  1. Accounts::PipelinesController#index calls 'Current.account' 2 times Locations: 0 1
else redirect_to account_welcome_index_path(Current.account)
  1. Accounts::PipelinesController#index calls 'Current.account' 2 times Locations: 0 1
end end # GET /pipelines/1 or /pipelines/1.json def show @pipelines = Pipeline.all @filter_status_deal = if params[:filter_status_deal].present?
  1. Accounts::PipelinesController#show calls 'params[:filter_status_deal]' 2 times Locations: 0 1
params[:filter_status_deal]
  1. Accounts::PipelinesController#show calls 'params[:filter_status_deal]' 2 times Locations: 0 1
else 'open' end end # GET /pipelines/new def new @pipeline = Pipeline.new end # GET /pipelines/1/edit def edit @stages = @pipeline.stages.order(:position) end # POST /pipelines/1/import_file def import_file
  1. Accounts::PipelinesController#import_file has a flog score of 70
  2. Accounts::PipelinesController#import_file has approx 18 statements
@pipeline = Pipeline.find(params[:pipeline_id]) uploaded_io = params[:import_file] csv_text = uploaded_io.read csv = CSV.parse(csv_text, headers: true) path_to_output_csv_file = "#{Rails.root}/tmp/deals-#{Time.current.to_i}.csv" line = 0 CSV.open(path_to_output_csv_file, 'wb') do |csv_output| csv.each do |row|
  1. Accounts::PipelinesController#import_file contains iterators nested 2 deep
csv_output << row.to_h.keys + ['result'] if line == 0
  1. Accounts::PipelinesController#import_file calls 'row.to_h' 3 times Locations: 0 1 2
row_json = JsonCsv.csv_row_hash_to_hierarchical_json_hash(row, {}) row_params = ActionController::Parameters.new(row_json).merge({ "stage_id": params[:stage_id] }) deal = DealBuilder.new(current_user, row_params).perform csv_output << if deal.save row.to_h.values + [I18n.t('activerecord.models.deal.import_file_success', deal_id: deal.id)]
  1. Accounts::PipelinesController#import_file calls 'row.to_h' 3 times Locations: 0 1 2
  2. Accounts::PipelinesController#import_file calls 'row.to_h.values' 2 times Locations: 0 1
else row.to_h.values + [I18n.t('activerecord.models.deal.import_file_failed',
  1. Accounts::PipelinesController#import_file calls 'row.to_h' 3 times Locations: 0 1 2
  2. Accounts::PipelinesController#import_file calls 'row.to_h.values' 2 times Locations: 0 1
message_error: deal.errors.messages)] end line += 1 end end response.headers['Content-Type'] = 'text/csv'
  1. Accounts::PipelinesController#import_file calls 'response.headers' 2 times Locations: 0 1
response.headers['Content-Disposition'] = 'attachment; filename=deals.csv'
  1. Accounts::PipelinesController#import_file calls 'response.headers' 2 times Locations: 0 1
# flash[:notice] = 'Arquivo processado com sucesso.' send_file path_to_output_csv_file # redirect_to account_pipeline_path(current_user.id, @pipeline.id), notice: 'Arquivo processado com sucesso.' end # GET /pipelines/1/import def import
  1. Accounts::PipelinesController#import has a flog score of 30
  2. Accounts::PipelinesController#import has approx 13 statements
@pipeline = Pipeline.find(params[:pipeline_id]) @stage = Stage.find(params[:stage_id]) respond_to do |format| format.turbo_stream format.html format.csv do path_to_output_csv_file = "#{Rails.root}/tmp/deals-#{Time.current.to_i}.csv" # headers = Deal.csv_header(Current.account) headers = ['name', 'contact_attributes.full_name', 'contact_attributes.phone'] CSV.open(path_to_output_csv_file, 'w') do |csv|
  1. Accounts::PipelinesController#import contains iterators nested 2 deep
csv << headers end response.headers['Content-Type'] = 'text/csv'
  1. Accounts::PipelinesController#import calls 'response.headers' 2 times Locations: 0 1
response.headers['Content-Disposition'] = 'attachment; filename=deals.csv'
  1. Accounts::PipelinesController#import calls 'response.headers' 2 times Locations: 0 1
render file: path_to_output_csv_file end end end # GET /pipelines/1/export def export
  1. Accounts::PipelinesController#export has a flog score of 27
  2. Accounts::PipelinesController#export has approx 12 statements
@deals = Deal.where(stage_id: params['stage_id']) path_to_output_csv_file = "#{Rails.root}/tmp/deals-#{Time.current.to_i}.csv" JsonCsv.create_csv_for_json_records(path_to_output_csv_file) do |csv_builder| @deals.each do |deal|
  1. Accounts::PipelinesController#export contains iterators nested 2 deep
json = JSON.parse(deal.to_json(include: :contacts)) csv_builder.add(json) end end respond_to do |format| format.html format.csv do response.headers['Content-Type'] = 'text/csv'
  1. Accounts::PipelinesController#export calls 'response.headers' 2 times Locations: 0 1
response.headers['Content-Disposition'] = 'attachment; filename=deals.csv'
  1. Accounts::PipelinesController#export calls 'response.headers' 2 times Locations: 0 1
render file: path_to_output_csv_file end end end def bulk_action; end def new_bulk_action; end def create_bulk_action
  1. Accounts::PipelinesController#create_bulk_action has a flog score of 93
  2. Accounts::PipelinesController#create_bulk_action has approx 15 statements
@deals = Deal.where(stage_id: params['event']['stage_id'], status: 'open')
  1. Accounts::PipelinesController#create_bulk_action calls 'params['event']' 9 times Locations: 0 1 2 3 4 5 6 7
  2. Accounts::PipelinesController#create_bulk_action calls 'params['event']['stage_id']' 2 times Locations: 0 1
@stage = Stage.find(params['event']['stage_id'])
  1. Accounts::PipelinesController#create_bulk_action calls 'params['event']' 9 times Locations: 0 1 2 3 4 5 6 7
  2. Accounts::PipelinesController#create_bulk_action calls 'params['event']['stage_id']' 2 times Locations: 0 1
if params['event']['send_now'] == 'true'
  1. Accounts::PipelinesController#create_bulk_action calls 'params['event']' 9 times Locations: 0 1 2 3 4 5 6 7
  2. Accounts::PipelinesController#create_bulk_action calls 'params['event']['send_now'] == 'true'' 2 times Locations: 0 1
  3. Accounts::PipelinesController#create_bulk_action calls 'params['event']['send_now']' 2 times Locations: 0 1
time_start = DateTime.current elsif !params['event']['scheduled_at'].nil?
  1. Accounts::PipelinesController#create_bulk_action calls 'params['event']' 9 times Locations: 0 1 2 3 4 5 6 7
  2. Accounts::PipelinesController#create_bulk_action calls 'params['event']['scheduled_at']' 2 times Locations: 0 1
  3. Accounts::PipelinesController#create_bulk_action performs a nil-check Locations: 0 1
time_start = params['event']['scheduled_at'].in_time_zone
  1. Accounts::PipelinesController#create_bulk_action calls 'params['event']' 9 times Locations: 0 1 2 3 4 5 6 7
  2. Accounts::PipelinesController#create_bulk_action calls 'params['event']['scheduled_at']' 2 times Locations: 0 1
end @result = @deals.each_with_index do |deal, index| if params['event']['kind'] == 'chatwoot_message' || params['event']['kind'] == 'evolution_api_message'
  1. Accounts::PipelinesController#create_bulk_action calls 'params['event']' 9 times Locations: 0 1 2 3 4 5 6 7
  2. Accounts::PipelinesController#create_bulk_action calls 'params['event']['kind']' 2 times
if params['event']['send_now'] == 'true'
  1. Accounts::PipelinesController#create_bulk_action calls 'params['event']' 9 times Locations: 0 1 2 3 4 5 6 7
  2. Accounts::PipelinesController#create_bulk_action calls 'params['event']['send_now'] == 'true'' 2 times Locations: 0 1
  3. Accounts::PipelinesController#create_bulk_action calls 'params['event']['send_now']' 2 times Locations: 0 1
time_start += rand(10..15).seconds
  1. Accounts::PipelinesController#create_bulk_action calls 'rand(10..15)' 2 times Locations: 0 1
  2. Accounts::PipelinesController#create_bulk_action calls 'rand(10..15).seconds' 2 times Locations: 0 1
params['event']['send_now'] = 'false'
  1. Accounts::PipelinesController#create_bulk_action calls 'params['event']' 9 times Locations: 0 1 2 3 4 5 6 7
elsif !time_start.nil?
  1. Accounts::PipelinesController#create_bulk_action performs a nil-check Locations: 0 1
time_start += rand(10..15).seconds
  1. Accounts::PipelinesController#create_bulk_action calls 'rand(10..15)' 2 times Locations: 0 1
  2. Accounts::PipelinesController#create_bulk_action calls 'rand(10..15).seconds' 2 times Locations: 0 1
end end @event = EventBuilder.new(current_user, event_params.merge({ contact: deal.contact, scheduled_at: time_start })).build @event.deal = deal if !@event.valid? && index == 0 render :new_bulk_action, status: :unprocessable_entity return end @event.save end respond_to do |format| format.turbo_stream end end def bulk_action_2; end
  1. Accounts::PipelinesController#bulk_action_2 has the name 'bulk_action_2'
# POST /pipelines or /pipelines.json def create
  1. Accounts::PipelinesController#create has a flog score of 28
  2. Accounts::PipelinesController#create has approx 10 statements
@pipeline = Pipeline.new(pipeline_params) respond_to do |format| if @pipeline.save format.html do
  1. Accounts::PipelinesController#create calls 'format.html' 2 times Locations: 0 1
redirect_to account_pipeline_path(Current.account, @pipeline), notice: t('flash_messages.created', model: Pipeline.model_name.human) end format.json { render :show, status: :created, location: @pipeline }
  1. Accounts::PipelinesController#create calls 'format.json' 2 times Locations: 0 1
else format.html { render :new, status: :unprocessable_entity }
  1. Similar code found in 2 nodes Locations: 0 1
  2. Accounts::PipelinesController#create calls 'format.html' 2 times Locations: 0 1
format.json { render json: @pipeline.errors, status: :unprocessable_entity }
  1. Accounts::PipelinesController#create calls 'format.json' 2 times Locations: 0 1
end end end # PATCH/PUT /pipelines/1 or /pipelines/1.json def update if @pipeline.update(pipeline_params) respond_to do |format|
  1. Similar code found in 2 nodes Locations: 0 1
format.html do redirect_to account_pipeline_path(Current.account, @pipeline), notice: t('flash_messages.updated', model: Pipeline.model_name.human) end format.turbo_stream end end end # DELETE /pipelines/1 or /pipelines/1.json def destroy
  1. Similar code found in 2 nodes Locations: 0 1
  2. Accounts::PipelinesController#destroy has approx 6 statements
@pipeline.destroy respond_to do |format| format.html { redirect_to pipelines_url, notice: t('flash_messages.deleted', model: Pipeline.model_name.human) } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_pipeline @pipeline = Pipeline.find(params[:id]) end # Only allow a list of trusted parameters through. def pipeline_params params.require(:pipeline).permit(:name, stages_attributes: %i[id name _destroy account_id position]) end def set_bulk_action_event @event = EventBuilder.new(current_user, { kind: params[:kind] }).build end def set_stage @stage = Stage.find(params[:stage_id]) end def deal_params(params)
  1. Accounts::PipelinesController#deal_params doesn't depend on instance state (maybe move it to another class?)
params.permit( :name, :status, :stage_id, :contact_id, contact_attributes: %i[id full_name phone email], custom_attributes: {} ) end def event_params params.require(:event).permit(:content, :send_now, :done, :auto_done, :title, :kind, :app_type, :app_id, :from_me, files: [], custom_attributes: {}, additional_attributes: {}) rescue StandardError {} end end