diff --git a/app/controllers/budgets/executions_controller.rb b/app/controllers/budgets/executions_controller.rb index e17763090..25f27b1ca 100644 --- a/app/controllers/budgets/executions_controller.rb +++ b/app/controllers/budgets/executions_controller.rb @@ -7,40 +7,29 @@ module Budgets def show authorize! :read_executions, @budget @statuses = Milestone::Status.all - - if params[:status].present? - @investments_by_heading = @budget.investments.winners - .joins(:milestones).includes(:milestones) - .select { |i| i.milestones.published.with_status - .order_by_publication_date.last - .try(:status_id) == params[:status].to_i } - .uniq - .group_by(&:heading) - else - @investments_by_heading = @budget.investments.winners - .joins(:milestones).includes(:milestones) - .distinct.group_by(&:heading) - end - - @investments_by_heading = reorder_alphabetically_with_city_heading_first.to_h + @investments_by_heading = investments_by_heading_ordered_alphabetically.to_h end private + def investments_by_heading + if params[:status].present? + @budget.investments.winners + .with_milestone_status_id(params[:status]) + .uniq + .group_by(&:heading) + else + @budget.investments.winners + .joins(:milestones).includes(:milestones) + .distinct.group_by(&:heading) + end + end def load_budget @budget = Budget.find_by(slug: params[:id]) || Budget.find_by(id: params[:id]) end - def reorder_alphabetically_with_city_heading_first - @investments_by_heading.sort do |a, b| - if a[0].name == 'Toda la ciudad' - -1 - elsif b[0].name == 'Toda la ciudad' - 1 - else - a[0].name <=> b[0].name - end - end + def investments_by_heading_ordered_alphabetically + investments_by_heading.sort { |a, b| a[0].name <=> b[0].name } end end end diff --git a/app/helpers/budget_executions_helper.rb b/app/helpers/budget_executions_helper.rb index d77867052..90d0744b0 100644 --- a/app/helpers/budget_executions_helper.rb +++ b/app/helpers/budget_executions_helper.rb @@ -1,9 +1,7 @@ module BudgetExecutionsHelper def filters_select_counts(status) - @budget.investments.winners.with_milestones.select { |i| i.milestones - .published.with_status.order_by_publication_date - .last.status_id == status rescue false }.count + @budget.investments.winners.with_milestone_status_id(status).count end def first_milestone_with_image(investment) diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index 3ed96da5f..110da8732 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -342,6 +342,16 @@ class Budget self.valuator_groups.collect(&:name).compact.join(', ').presence end + def self.with_milestone_status_id(status_id) + joins(:milestones).includes(:milestones).select do |investment| + investment.milestone_status_id == status_id.to_i + end + end + + def milestone_status_id + milestones.published.with_status.order_by_publication_date.last&.status_id + end + private def set_denormalized_ids diff --git a/spec/features/budgets/executions_spec.rb b/spec/features/budgets/executions_spec.rb index 226d01cfe..53d0ef6b6 100644 --- a/spec/features/budgets/executions_spec.rb +++ b/spec/features/budgets/executions_spec.rb @@ -230,19 +230,6 @@ feature 'Executions' do heading end - scenario 'City heading is displayed first' do - heading.destroy! - other_heading1 = create_heading_with_investment_with_milestone(group: group, name: 'Other 1') - city_heading = create_heading_with_investment_with_milestone(group: group, name: 'Toda la ciudad') - other_heading2 = create_heading_with_investment_with_milestone(group: group, name: 'Other 2') - - visit budget_executions_path(budget) - - expect(page).to have_css('.budget-execution', count: 3) - expect(city_heading.name).to appear_before(other_heading1.name) - expect(city_heading.name).to appear_before(other_heading2.name) - end - scenario 'Non-city headings are displayed in alphabetical order' do heading.destroy! z_heading = create_heading_with_investment_with_milestone(group: group, name: 'Zzz')