Files
grecia/app/services/successful_proposal_supports_query.rb
Juan Salvador Pérez García 762c4faef6 Fixes #141
Adds ideal progress to progress graph
2018-07-17 17:59:11 +02:00

73 lines
1.9 KiB
Ruby

class SuccessfulProposalSupportsQuery
attr_reader :params
def self.for(params)
query = SuccessfulProposalSupportsQuery.new params
query.results
end
def initialize(params)
@params = params
end
def results
grouped_votes = groups
grouped_votes.each do |group, votes|
grouped_votes[group] = votes.inject(0) { |sum, vote| sum + vote.vote_weight }
end
accumulated = 0
grouped_votes.each do |k, v|
accumulated += v
grouped_votes[k] = accumulated
end
grouped_votes
end
private
def groups
return votes.group_by { |v| v.voted_at.to_date.year } if params[:group_by] == 'year'
return votes.group_by { |v| "#{v.voted_at.to_date.cweek}/#{v.voted_at.to_date.year}" } if params[:group_by] == 'week'
return votes.group_by { |v| "#{v.voted_at.to_date.year}-#{v.voted_at.to_date.month}" } if params[:group_by] == 'month'
votes.group_by { |v| v.voted_at.to_date }
end
def votes
return [] if successful_proposal.nil?
Vote
.select("created_at + interval '#{days_diff} day' voted_at, *")
.where(votable: successful_proposal)
.where("created_at + interval '#{days_diff} day' between ? and ?", start_date.beginning_of_day, end_date.end_of_day)
.order(created_at: :asc)
end
def proposal
@proposal ||= Proposal.find(params[:proposal_id])
end
def successful_proposal
@successful_proposal ||= Proposal.find_by(id: Setting['proposals.successful_proposal_id'])
end
def days_diff
return 0 if successful_proposal.nil?
return 0 if proposal.published_at.nil?
(proposal.published_at.to_date - successful_proposal.published_at.to_date).to_i
end
def start_date
return Date.parse(params[:start_date]) unless params[:start_date].blank?
proposal.created_at.to_date
end
def end_date
return Date.parse(params[:end_date]) unless params[:end_date].blank?
Date.today
end
end