51 lines
1.4 KiB
Ruby
51 lines
1.4 KiB
Ruby
module Budgets
|
|
class ExecutionsController < ApplicationController
|
|
before_action :load_budget
|
|
|
|
load_and_authorize_resource :budget
|
|
|
|
def show
|
|
authorize! :read_executions, @budget
|
|
@statuses = ::Budget::Investment::Status.all
|
|
@headings = @budget.headings
|
|
.includes(investments: :milestones)
|
|
.joins(investments: :milestones)
|
|
.distinct
|
|
.order(id: :asc)
|
|
|
|
if params[:status].present?
|
|
@headings = @headings.where(filter_investment_by_latest_milestone, params[:status])
|
|
end
|
|
|
|
@headings = reorder_with_city_heading_first(@headings)
|
|
end
|
|
|
|
private
|
|
|
|
def load_budget
|
|
@budget = Budget.find_by(slug: params[:id]) || Budget.find_by(id: params[:id])
|
|
end
|
|
|
|
def filter_investment_by_latest_milestone
|
|
<<-SQL
|
|
(SELECT status_id FROM budget_investment_milestones
|
|
WHERE investment_id = budget_investments.id ORDER BY publication_date DESC LIMIT 1) = ?
|
|
SQL
|
|
end
|
|
|
|
def reorder_with_city_heading_first(original_headings)
|
|
headings = original_headings.to_a.dup
|
|
|
|
city_heading_index = headings.find_index do |heading|
|
|
heading.name == "Toda la ciudad"
|
|
end
|
|
|
|
if city_heading_index
|
|
headings.insert(0, headings.delete_at(city_heading_index))
|
|
else
|
|
headings
|
|
end
|
|
end
|
|
end
|
|
end
|