Merge pull request #2079 from consul/poll-admin-results

Polls - Admin booth results
This commit is contained in:
BertoCQ
2017-10-19 13:33:18 +02:00
committed by GitHub
12 changed files with 279 additions and 43 deletions

View File

@@ -18,6 +18,8 @@ class Admin::Poll::BoothAssignmentsController < Admin::Poll::BaseController
@booth_assignment = @poll.booth_assignments.includes(:recounts, :voters,
officer_assignments: [officer: [:user]]).find(params[:id])
@voters_by_date = @booth_assignment.voters.group_by {|v| v.created_at.to_date}
@partial_results = @booth_assignment.partial_results
@recounts = @booth_assignment.recounts
end
def create

View File

@@ -0,0 +1,12 @@
<div id="poll-resources">
<h3><%= t("admin.results.index.title") %></h3>
<% if @partial_results.empty? %>
<div class="callout primary margin-top">
<%= t("admin.results.index.no_results") %>
</div>
<% else %>
<%= render "admin/poll/results/recount", resource: @booth_assignment %>
<%= render "admin/poll/results/result" %>
<% end %>
</div>

View File

@@ -17,9 +17,12 @@
<li class="tabs-title">
<%= link_to t("admin.poll_booth_assignments.show.officers"), "#tab-officers" %>
</li>
<li class="tabs-title is-active">
<li class="tabs-title">
<%= link_to t("admin.poll_booth_assignments.show.recounts"), "#tab-recounts" %>
</li>
<li class="tabs-title is-active">
<%= link_to t("admin.poll_booth_assignments.show.results"), "#tab-results" %>
</li>
</ul>
<div class="tabs-panel" id="tab-officers">
@@ -43,7 +46,7 @@
<% end %>
</div>
<div class="tabs-panel is-active" id="tab-recounts">
<div class="tabs-panel" id="tab-recounts">
<h3><%= t("admin.poll_booth_assignments.show.recounts_list") %></h3>
<table id="totals">
@@ -55,8 +58,12 @@
</thead>
<tbody>
<tr>
<td class="text-center" id="total_final"><%= total_recounts_by_booth(@booth_assignment) || '-' %></td>
<td class="text-center" id="total_system"><%= @booth_assignment.voters.count %></td>
<td class="text-center" id="total_final">
<%= total_recounts_by_booth(@booth_assignment) || '-' %>
</td>
<td class="text-center" id="total_system">
<%= @booth_assignment.voters.count %>
</td>
</tr>
</tbody>
</table>
@@ -79,4 +86,7 @@
</tbody>
</table>
</div>
<div class="tabs-panel is-active" id="tab-results">
<%= render "results" %>
</div>
</div>

View File

@@ -0,0 +1,14 @@
<table class="margin">
<thead>
<th><%= t("admin.results.result.table_whites") %></th>
<th><%= t("admin.results.result.table_nulls") %></th>
<th><%= t("admin.results.result.table_total") %></th>
</thead>
<tbody>
<tr>
<td id="white_results"><%= resource.recounts.sum(:white_amount) %></td>
<td id="null_results"><%= resource.recounts.sum(:null_amount) %></td>
<td id="total_results"><%= resource.recounts.sum(:total_amount) %></td>
</tr>
</tbody>
</table>

View File

@@ -0,0 +1,21 @@
<% by_question = @partial_results.group_by(&:question_id) %>
<% @poll.questions.each do |question| %>
<h3><%= question.title %></h3>
<table class="margin">
<thead>
<tr>
<th><%= t("admin.results.result.table_answer") %></th>
<th class="text-center"><%= t("admin.results.result.table_votes") %></th>
</tr>
</thead>
<tbody>
<% question.question_answers.each_with_index do |answer, i| %>
<% by_answer = by_question[question.id].present? ? by_question[question.id].group_by(&:answer) : {} %>
<tr id="question_<%= question.id %>_<%= i %>_result">
<td><%= answer.title %></td>
<td class="text-center"><%= by_answer[answer.title].present? ? by_answer[answer.title].sum(&:amount) : 0 %></td>
</tr>
<% end %>
</tbody>
</table>
<% end %>

View File

@@ -0,0 +1,20 @@
<h3><%= t("admin.results.results_by_booth.title") %></h3>
<table class="margin" id="booth_assignment_results">
<thead>
<tr>
<th><%= t("admin.results.results_by_booth.booth") %></th>
<th class="text-center"><%= t("admin.results.results_by_booth.results") %></th>
</tr>
</thead>
<tbody>
<% @poll.booth_assignments.sort_by {|ba| ba.booth.name }.each do |booth_assignment| %>
<tr id="booth_assignment_<%= booth_assignment.id %>_result">
<td><%= booth_assignment.booth.name %></td>
<td class="text-center">
<%= link_to t("admin.results.results_by_booth.see_results"),
admin_poll_booth_assignment_path(@poll, booth_assignment, anchor: "tab-results") %>
</td>
</tr>
<% end %>
</tbody>
</table>

View File

@@ -9,44 +9,8 @@
<%= t("admin.results.index.no_results") %>
</div>
<% else %>
<table class="margin">
<thead>
<th><%= t("admin.results.index.table_whites") %></th>
<th><%= t("admin.results.index.table_nulls") %></th>
<th><%= t("admin.results.index.table_total") %></th>
</thead>
<tbody>
<tr>
<td id="white_results"><%= @poll.recounts.sum(:white_amount) %></td>
<td id="null_results"><%= @poll.recounts.sum(:null_amount) %></td>
<td id="total_results"><%= @poll.recounts.sum(:total_amount) %></td>
</tr>
</tbody>
</table>
<% by_question = @partial_results.group_by(&:question_id) %>
<% @poll.questions.each do |question| %>
<h3><%= question.title %></h3>
<table class="margin">
<thead>
<tr>
<th><%= t("admin.results.index.table_answer") %></th>
<th class="text-center"><%= t("admin.results.index.table_votes") %></th>
</tr>
</thead>
<tbody>
<% question.question_answers.each_with_index do |answer, i| %>
<% by_answer = by_question[question.id].present? ? by_question[question.id].group_by(&:answer) : {} %>
<tr id="question_<%= question.id %>_<%= i %>_result">
<td><%= answer.title %></td>
<td class="text-center"><%= by_answer[answer.title].present? ? by_answer[answer.title].sum(&:amount) : 0 %></td>
</tr>
<% end %>
</tbody>
</table>
<% end %>
<%= render "recount", resource: @poll %>
<%= render "result" %>
<%= render "results_by_booth" %>
<% end %>
</div>

View File

@@ -537,6 +537,7 @@ en:
no_officers: "There are no officers for this booth"
recounts: "Recounts"
recounts_list: "Recount list for this booth"
results: "Results"
date: "Date"
count_final: "Final recount (by officer)"
count_by_system: "Votes (automatic)"
@@ -647,11 +648,17 @@ en:
index:
title: "Results"
no_results: "There are no results"
result:
table_whites: "Totally blank ballots"
table_nulls: "Invalid ballots"
table_total: "Total ballots"
table_answer: Answer
table_votes: Votes
results_by_booth:
booth: Booth
results: Results
see_results: See results
title: "Results by booth"
booths:
index:
title: "List of booths"

View File

@@ -537,6 +537,7 @@ es:
no_officers: "No hay presidentes de mesa para esta urna"
recounts: "Recuentos"
recounts_list: "Lista de recuentos de esta urna"
results: "Resultados"
date: "Fecha"
count_final: "Recuento final (presidente de mesa)"
count_by_system: "Votos (automático)"
@@ -649,11 +650,17 @@ es:
index:
title: "Resultados"
no_results: "No hay resultados"
result:
table_whites: Papeletas totalmente en blanco
table_nulls: Papeletas nulas
table_total: Papeletas totales
table_answer: Respuesta
table_votes: Votos
results_by_booth:
booth: Urna
results: Resultados
see_results: Ver resultados
title: "Resultados por urna"
booths:
index:
title: "Lista de urnas"

View File

@@ -640,6 +640,49 @@ print "Creating Poll Voters"
Poll::Voter.create(poll: poll, user: user)
end
puts ""
print "Creating Poll Recounts"
Poll.all.each do |poll|
poll.booth_assignments.each do |booth_assignment|
officer_assignment = poll.officer_assignments.first
author = Poll::Officer.first.user
Poll::Recount.create!(officer_assignment: officer_assignment,
booth_assignment: booth_assignment,
author: author,
date: poll.ends_at,
white_amount: rand(0..10),
null_amount: rand(0..10),
total_amount: rand(100..9999),
origin: "booth")
end
end
puts ""
print "Creating Poll Results"
Poll.all.each do |poll|
poll.booth_assignments.each do |booth_assignment|
officer_assignment = poll.officer_assignments.first
author = Poll::Officer.first.user
poll.questions.each do |question|
question.question_answers.each do |answer|
Poll::PartialResult.create!(officer_assignment: officer_assignment,
booth_assignment: booth_assignment,
date: Date.current,
question: question,
answer: answer.title,
author: author,
amount: rand(999),
origin: "booth")
end
end
end
end
puts ""
print "Creating legislation processes"

View File

@@ -126,5 +126,104 @@ feature 'Admin booths assignments' do
end
end
scenario 'Results for a booth assignment' do
poll = create(:poll)
booth_assignment = create(:poll_booth_assignment, poll: poll)
other_booth_assignment = create(:poll_booth_assignment, poll: poll)
question_1 = create(:poll_question, poll: poll)
create(:poll_question_answer, title: 'Yes', question: question_1)
create(:poll_question_answer, title: 'No', question: question_1)
question_2 = create(:poll_question, poll: poll)
create(:poll_question_answer, title: 'Today', question: question_2)
create(:poll_question_answer, title: 'Tomorrow', question: question_2)
create(:poll_partial_result,
booth_assignment: booth_assignment,
question: question_1,
answer: 'Yes',
amount: 11)
create(:poll_partial_result,
booth_assignment: booth_assignment,
question: question_1,
answer: 'No',
amount: 4)
create(:poll_partial_result,
booth_assignment: booth_assignment,
question: question_2,
answer: 'Today',
amount: 5)
create(:poll_partial_result,
booth_assignment: booth_assignment,
question: question_2,
answer: 'Tomorrow',
amount: 6)
create(:poll_partial_result,
booth_assignment: other_booth_assignment,
question: question_1,
answer: 'Yes',
amount: 9999)
create(:poll_recount,
booth_assignment: booth_assignment,
white_amount: 21,
null_amount: 44,
total_amount: 66)
create(:poll_recount,
booth_assignment: other_booth_assignment,
white_amount: 999,
null_amount: 999,
total_amount: 999)
visit admin_poll_booth_assignment_path(poll, booth_assignment)
click_link 'Results'
expect(page).to have_content(question_1.title)
within("#question_#{question_1.id}_0_result") do
expect(page).to have_content("Yes")
expect(page).to have_content(11)
end
within("#question_#{question_1.id}_1_result") do
expect(page).to have_content("No")
expect(page).to have_content(4)
end
expect(page).to have_content(question_2.title)
within("#question_#{question_2.id}_0_result") do
expect(page).to have_content("Today")
expect(page).to have_content(5)
end
within("#question_#{question_2.id}_1_result") do
expect(page).to have_content("Tomorrow")
expect(page).to have_content(6)
end
within('#white_results') { expect(page).to have_content('21') }
within('#null_results') { expect(page).to have_content('44') }
within('#total_results') { expect(page).to have_content('66') }
end
scenario "No results" do
poll = create(:poll)
booth_assignment = create(:poll_booth_assignment, poll: poll)
visit admin_poll_booth_assignment_path(poll, booth_assignment)
click_link "Results"
expect(page).to have_content "There are no results"
end
end
end

View File

@@ -311,6 +311,43 @@ feature 'Admin polls' do
within('#null_results') { expect(page).to have_content('44') }
within('#total_results') { expect(page).to have_content('66') }
end
scenario "Link to results by booth" do
poll = create(:poll)
booth_assignment1 = create(:poll_booth_assignment, poll: poll)
booth_assignment2 = create(:poll_booth_assignment, poll: poll)
question = create(:poll_question, poll: poll)
create(:poll_question_answer, title: 'Yes', question: question)
create(:poll_question_answer, title: 'No', question: question)
create(:poll_partial_result,
booth_assignment: booth_assignment1,
question: question,
answer: 'Yes',
amount: 5)
create(:poll_partial_result,
booth_assignment: booth_assignment2,
question: question,
answer: 'Yes',
amount: 6)
visit admin_poll_path(poll)
click_link "Results"
expect(page).to have_link("See results", count: 2)
within("#booth_assignment_#{booth_assignment1.id}_result") do
click_link "See results"
end
expect(page).to have_content booth_assignment1.booth.name
expect(page).to have_content "Results"
expect(page).to have_content "Yes"
expect(page).to have_content "5"
end
end
end