73 lines
1.9 KiB
Ruby
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
|
|
|