Updated

app/controllers/accounts / deals_controller.rb

D
200 lines of codes
24 methods
10.3 complexity/method
98 churn
246.18 complexity
114 duplications
class Accounts::DealsController < InternalController
  1. Accounts::DealsController assumes too much for instance variable '@contacts_deal'
  2. Accounts::DealsController assumes too much for instance variable '@deal'
  3. Accounts::DealsController assumes too much for instance variable '@deal_product'
  4. Accounts::DealsController assumes too much for instance variable '@deals'
  5. Accounts::DealsController assumes too much for instance variable '@new_contact'
  6. Accounts::DealsController has no descriptive comment
  7. Accounts::DealsController has at least 16 instance variables
  8. Accounts::DealsController has at least 24 methods
include DealProductConcern include DealConcern before_action :set_deal, only: %i[show edit update destroy events_to_do events_done deal_products deal_assignees mark_as_lost mark_as_won] before_action :set_deal_product, only: %i[edit_deal_product update_deal_product] # GET /deals or /deals.json def index @first_pipeline = Pipeline.first @deals = if params[:query].present?
  1. Accounts::DealsController#index calls 'params[:query]' 3 times Locations: 0 1 2
Deal.left_joins(:contact) .where( 'deals.name ILIKE :search OR ' + 'contacts.full_name ILIKE :search OR ' + 'deals.id = :id', search: "%#{params[:query]}%",
  1. Accounts::DealsController#index calls 'params[:query]' 3 times Locations: 0 1 2
id: params[:query].to_i
  1. Accounts::DealsController#index calls 'params[:query]' 3 times Locations: 0 1 2
) .order(updated_at: :desc) else Deal.all.order(created_at: :desc) end @pagy, @deals = pagy(@deals) end # GET /deals/1 or /deals/1.json def show; end # GET /deals/new def new
  1. Accounts::DealsController#new has approx 6 statements
@deal = Deal.new @stages = Stage.ordered_by_pipeline_and_position @deal.contact_id = params.dig(:deal, :contact_id) if @deal.contact_id.blank? @deal.errors.add(:contact, :blank) render :new_select_contact, status: :unprocessable_entity return end end def new_select_contact @deal = Deal.new end def add_contact @deal = Deal.find(params[:deal_id]) end def commit_add_contact
  1. Accounts::DealsController#commit_add_contact has a flog score of 26
  2. Accounts::DealsController#commit_add_contact has approx 6 statements
@deal = Deal.find(params[:deal_id]) @new_contact = Contact.find(params['deal']['contact_id']) @deal.contacts.push(@new_contact) if Deal::CreateOrUpdate.new(@deal, deal_params).call
  1. Similar code found in 2 nodes Locations: 0 1
  2. Accounts::DealsController tests 'Deal::CreateOrUpdate.new(@deal, deal_params).call' at least 3 times Locations: 0 1 2
redirect_to account_deal_path(current_user.account, @deal) else render :add_contact, status: :unprocessable_entity
  1. Accounts::DealsController#commit_add_contact calls 'render :add_contact, status: :unprocessable_entity' 2 times Locations: 0 1
end rescue StandardError render :add_contact, status: :unprocessable_entity
  1. Accounts::DealsController#commit_add_contact calls 'render :add_contact, status: :unprocessable_entity' 2 times Locations: 0 1
end def remove_contact @deal = Deal.find(params[:deal_id]) @contacts_deal = @deal.contacts_deals.find_by_contact_id(params['contact_id']) if @contacts_deal.destroy redirect_to account_deal_path(current_user.account, @deal) else render :show, status: :unprocessable_entity
  1. Accounts::DealsController#remove_contact calls 'render :show, status: :unprocessable_entity' 2 times Locations: 0 1
end rescue StandardError render :show, status: :unprocessable_entity
  1. Accounts::DealsController#remove_contact calls 'render :show, status: :unprocessable_entity' 2 times Locations: 0 1
end # GET /deals/1/edit def edit @stages = Stage.ordered_by_pipeline_and_position end def edit_custom_attributes @deal = current_user.account.deals.find(params[:deal_id])
  1. Accounts::DealsController#edit_custom_attributes calls 'current_user.account' 2 times Locations: 0 1
@custom_attribute_definitions = current_user.account.custom_attribute_definitions.deal_attribute
  1. Accounts::DealsController#edit_custom_attributes calls 'current_user.account' 2 times Locations: 0 1
end # POST /deals or /deals.json def create @stages = Stage.ordered_by_pipeline_and_position @deal = DealBuilder.new(current_user, deal_params).perform if Deal::CreateOrUpdate.new(@deal, deal_params).call
  1. Similar code found in 2 nodes Locations: 0 1
  2. Accounts::DealsController tests 'Deal::CreateOrUpdate.new(@deal, deal_params).call' at least 3 times Locations: 0 1 2
redirect_to account_deal_path(current_user.account, @deal) else render :new, status: :unprocessable_entity end end # PATCH/PUT /deals/1 or /deals/1.json def update
  1. Accounts::DealsController#update has a flog score of 31
  2. Accounts::DealsController#update has approx 7 statements
@stages = Stage.ordered_by_pipeline_and_position if params[:deal][:att_key].present?
  1. Similar code found in 2 nodes Locations: 0 1
  2. Accounts::DealsController#update calls 'params[:deal]' 3 times Locations: 0 1
  3. Accounts::DealsController#update calls 'params[:deal][:att_key]' 2 times Locations: 0 1
@deal.custom_attributes[params[:deal][:att_key]] = params[:deal][:att_value]
  1. Accounts::DealsController#update calls 'params[:deal]' 3 times Locations: 0 1
  2. Accounts::DealsController#update calls 'params[:deal][:att_key]' 2 times Locations: 0 1
end if Deal::CreateOrUpdate.new(@deal, deal_params).call
  1. Accounts::DealsController tests 'Deal::CreateOrUpdate.new(@deal, deal_params).call' at least 3 times Locations: 0 1 2
respond_to do |format| format.html { redirect_to account_deal_path(current_user.account, @deal) } format.turbo_stream end else render :edit, status: :unprocessable_entity end end # DELETE /deals/1 or /deals/1.json def destroy
  1. Accounts::DealsController#destroy has approx 7 statements
@deal.destroy respond_to do |format| format.turbo_stream format.html { redirect_to root_path, notice: t('flash_messages.deleted', model: Deal.model_name.human) } format.json { head :no_content } end end def events_to_do
  1. Similar code found in 2 nodes Locations: 0 1
@pagy, @events = pagy(@deal.contact.events.where(deal_id: [nil, @deal.id]).to_do, items: 5) respond_to do |format| format.turbo_stream format.html end end def events_done
  1. Similar code found in 2 nodes Locations: 0 1
@pagy, @events = pagy(@deal.contact.events.where(deal_id: [nil, @deal.id]).done, items: 5) respond_to do |format| format.turbo_stream format.html end end def deal_products @deal_products = @deal.deal_products end def deal_assignees @deal_assignees = @deal.deal_assignees end def edit_deal_product end def update_deal_product if DealProduct::CreateOrUpdate.new(@deal_product, deal_product_params).call respond_to do |format| format.html do redirect_to deal_products_account_deal_path(current_user.account, @deal_product.deal) end format.turbo_stream end else render :edit_deal_product, status: :unprocessable_entity end end def mark_as_lost @stages = Stage.ordered_by_pipeline_and_position @lost_reasons = DealLostReason.order(:name).pluck(:name).uniq @exists_deal_lost_reasons = DealLostReason.exists? @allow_edit_lost_at = Current.account.deal_allow_edit_lost_at_won_at end def mark_as_won @stages = Stage.ordered_by_pipeline_and_position @allow_edit_won_at = Current.account.deal_allow_edit_lost_at_won_at end private def set_deal @deal = current_user.account.deals.find(params[:id]) end def set_deal_product @deal_product = current_user.account.deal_products.find(params[:deal_product_id]) end def deal_product_params params.require(:deal_product).permit(*permitted_deal_product_params) end # Only allow a list of trusted parameters through. def deal_params params.require(:deal).permit(*permitted_deal_params) end end