- <%= l officer_assignment.date.to_date %>
+ <%= officer_assignment.final? ? t('polls.final_date') : l(officer_assignment.date.to_date) %>
<%= booth_name_with_location(officer_assignment.booth_assignment.booth) %>
<%= link_to t("admin.poll_officer_assignments.index.remove_assignment"),
diff --git a/app/views/officing/_menu.html.erb b/app/views/officing/_menu.html.erb
index 40484a90a..d6773a426 100644
--- a/app/views/officing/_menu.html.erb
+++ b/app/views/officing/_menu.html.erb
@@ -8,11 +8,18 @@
<% end %>
- >
+ >
<%= link_to officing_polls_path do %>
<%= t("officing.menu.recounts") %>
<% end %>
+
+ >
+ <%= link_to final_officing_polls_path do %>
+
+ <%= t("officing.menu.final_recounts") %>
+ <% end %>
+
diff --git a/app/views/officing/final_recounts/new.html.erb b/app/views/officing/final_recounts/new.html.erb
new file mode 100644
index 000000000..42518cfd9
--- /dev/null
+++ b/app/views/officing/final_recounts/new.html.erb
@@ -0,0 +1,72 @@
+<% if @officer_assignments.any? %>
+ <%= t("officing.final_recounts.new.title", poll: @poll.name) %>
+
+ <%= form_tag(officing_poll_final_recounts_path(@poll), {id: "officer_assignment_form"}) do %>
+
+
+ <%= t("officing.final_recounts.new.booth") %>
+ <%= select_tag :officer_assignment_id,
+ booths_for_officer_select_options(@officer_assignments),
+ { prompt: t("officing.final_recounts.new.select_booth"),
+ label: false } %>
+
+
+
+
+
+ <%= t("officing.final_recounts.new.date") %>
+ <%= select_tag :date,
+ poll_dates_select_options(@poll),
+ { prompt: t("officing.final_recounts.new.select_date"),
+ label: false } %>
+
+
+
+
+
+ <%= t("officing.final_recounts.new.count") %>
+ <%= text_field_tag :count, nil, placeholder: t("officing.final_recounts.new.count_placeholder") %>
+
+
+
+
+
+ <%= submit_tag t("officing.final_recounts.new.submit"), class: "button expanded" %>
+
+
+ <% end %>
+<% else %>
+ <%= @poll.name %>
+
+ <%= t("officing.final_recounts.new.not_allowed") %>
+
+<% end %>
+
+
+<% if @final_recounts.any? %>
+
+ <%= t("officing.final_recounts.new.final_recount_list") %>
+
+
+
+ <%= t("officing.final_recounts.new.date") %>
+ <%= t("officing.final_recounts.new.booth") %>
+ <%= t("officing.final_recounts.new.count") %>
+
+
+ <% @final_recounts.each do |final_recount| %>
+
+
+ <%= l(final_recount.date.to_date, format: :long) %>
+
+
+ <%= final_recount.booth_assignment.booth.name %>
+
+
+ <%= final_recount.count %>
+
+
+ <% end %>
+
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/officing/polls/final.html.erb b/app/views/officing/polls/final.html.erb
new file mode 100644
index 000000000..7159a3769
--- /dev/null
+++ b/app/views/officing/polls/final.html.erb
@@ -0,0 +1,30 @@
+<%= t("officing.polls.final.title") %>
+
+<% if @polls.any? %>
+
+
+ <%= t("officing.polls.final.select_poll") %>
+
+
+
+ <% @polls.each do |poll| %>
+
+
+
+ <%= link_to poll.name, new_officing_poll_final_recount_path(poll) %>
+
+
+
+ <%= link_to t("officing.polls.final.add_recount"),
+ new_officing_poll_final_recount_path(poll),
+ class: "button hollow" %>
+
+
+ <% end %>
+
+
+<% else %>
+
+ <%= t("officing.polls.final.no_polls") %>
+
+<% end %>
\ No newline at end of file
diff --git a/config/locales/en.yml b/config/locales/en.yml
index a5b671809..edf96a210 100755
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -395,6 +395,7 @@ en:
all: "All"
no_dates: "no date assigned"
dates: "From %{open_at} to %{closed_at}"
+ final_date: "Final recounts/Results"
index:
filters:
current: "Open"
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 388cbbbe7..ce5d328c5 100755
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -395,6 +395,7 @@ es:
all: "Todas"
no_dates: "sin fecha asignada"
dates: "Desde el %{open_at} hasta el %{closed_at}"
+ final_date: "Recuento final/Resultados"
index:
filters:
current: "Abiertas"
diff --git a/config/locales/officing.en.yml b/config/locales/officing.en.yml
index 4f320a125..c82d3f740 100644
--- a/config/locales/officing.en.yml
+++ b/config/locales/officing.en.yml
@@ -8,12 +8,18 @@ en:
menu:
voters: Validate document
recounts: Store recount
+ final_recounts: Final recounts
polls:
index:
title: Poll list
no_polls: You are not officing in any active poll
select_poll: Select poll
add_recount: Add recount
+ final:
+ title: Polls ready for final recounting
+ no_polls: You are not officing final recounts in any active poll
+ select_poll: Select poll
+ add_recount: Add final recount
recounts:
flash:
create: "Data added"
@@ -29,6 +35,21 @@ en:
recount_list: "Your recounts"
booth: "Booth"
date: "Date"
+ final_recounts:
+ flash:
+ create: "Data added"
+ error_create: "Final counts NOT added. Error in data."
+ new:
+ title: "%{poll} - Add final recount"
+ not_allowed: "You are allowed to add final recounts for this poll"
+ booth: "Booth"
+ date: "Date"
+ select_booth: "Select booth"
+ select_date: "Select date"
+ count: "Vote count"
+ count_placeholder: "Vote count"
+ submit: Save
+ final_recount_list: "Your final recounts"
residence:
flash:
create: "Document verified with Census"
diff --git a/config/locales/officing.es.yml b/config/locales/officing.es.yml
index 28fc1595d..df91b79ed 100644
--- a/config/locales/officing.es.yml
+++ b/config/locales/officing.es.yml
@@ -8,12 +8,18 @@ es:
menu:
voters: "Validar documento"
recounts: "Guardar recuento"
+ final_recounts: "Recuentos finales"
polls:
index:
title: "Listado de votaciones"
no_polls: "No eres presidente de mesa en ninguna votación activa"
select_poll: "Selecciona votación"
add_recount: "Añadir recuento"
+ final:
+ title: "Listado de votaciones finalizadas"
+ no_polls: "No tienes permiso para recuento final en ninguna votación reciente"
+ select_poll: "Selecciona votación"
+ add_recount: "Añadir recuentos finales"
recounts:
flash:
create: "Datos añadidos"
@@ -29,6 +35,21 @@ es:
recount_list: "Tus recuentos"
booth: "Urna"
date: "Fecha"
+ final_recounts:
+ flash:
+ create: "Datos añadidos"
+ error_create: "Recuento final NO añadido. Error en los datos"
+ new:
+ title: "%{poll} - Añadir recuento final"
+ not_allowed: "No tienes permiso para introducir recountos finales"
+ booth: "Urna"
+ date: "Día"
+ select_booth: "Elige urna"
+ select_date: "Elige día"
+ count: "Número de votos"
+ count_placeholder: "Número de votos"
+ submit: "Guardar"
+ final_recount_list: "Tus recuentos finales"
residence:
flash:
create: "Documento verificado con el Padrón"
diff --git a/config/routes.rb b/config/routes.rb
index 2a0a157c2..8be55feb5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -332,7 +332,10 @@ Rails.application.routes.draw do
namespace :officing do
resources :polls, only: [:index] do
+ get :final, on: :collection
+
resources :recounts, only: [:new, :create]
+ resources :final_recounts, only: [:new, :create]
end
resource :residence, controller: "residence", only: [:new, :create]
resources :voters, only: [:new, :create]
diff --git a/db/migrate/20170130101121_create_poll_final_recount.rb b/db/migrate/20170130101121_create_poll_final_recount.rb
new file mode 100644
index 000000000..07723b708
--- /dev/null
+++ b/db/migrate/20170130101121_create_poll_final_recount.rb
@@ -0,0 +1,15 @@
+class CreatePollFinalRecount < ActiveRecord::Migration
+ def change
+ create_table :poll_final_recounts do |t|
+ t.integer :booth_assignment_id
+ t.integer :officer_assignment_id
+ t.integer :count
+ t.text :count_log, default: ""
+ t.datetime :created_at, null: false
+ t.datetime :updated_at, null: false
+ t.text :officer_assignment_id_log, default: ""
+ end
+
+ add_index :poll_final_recounts, :booth_assignment_id
+ end
+end
diff --git a/db/migrate/20170130103550_add_final_to_poll_officer_assignments.rb b/db/migrate/20170130103550_add_final_to_poll_officer_assignments.rb
new file mode 100644
index 000000000..4cafb5ffb
--- /dev/null
+++ b/db/migrate/20170130103550_add_final_to_poll_officer_assignments.rb
@@ -0,0 +1,5 @@
+class AddFinalToPollOfficerAssignments < ActiveRecord::Migration
+ def change
+ add_column :poll_officer_assignments, :final, :boolean, default: false
+ end
+end
diff --git a/db/migrate/20170130133736_add_date_to_final_recount.rb b/db/migrate/20170130133736_add_date_to_final_recount.rb
new file mode 100644
index 000000000..14d0f564c
--- /dev/null
+++ b/db/migrate/20170130133736_add_date_to_final_recount.rb
@@ -0,0 +1,5 @@
+class AddDateToFinalRecount < ActiveRecord::Migration
+ def change
+ add_column :poll_final_recounts, :date, :datetime, null: false
+ end
+end
diff --git a/db/migrate/20170130163030_change_datetimes_to_date_in_recounts_and_assignments.rb b/db/migrate/20170130163030_change_datetimes_to_date_in_recounts_and_assignments.rb
new file mode 100644
index 000000000..2ef6d0d5a
--- /dev/null
+++ b/db/migrate/20170130163030_change_datetimes_to_date_in_recounts_and_assignments.rb
@@ -0,0 +1,13 @@
+class ChangeDatetimesToDateInRecountsAndAssignments < ActiveRecord::Migration
+ def up
+ change_column :poll_recounts, :date, :date, null: false
+ change_column :poll_final_recounts, :date, :date, null: false
+ change_column :poll_officer_assignments, :date, :date, null: false
+ end
+
+ def down
+ change_column :poll_recounts, :date, :datetime, null: false
+ change_column :poll_final_recounts, :date, :datetime, null: false
+ change_column :poll_officer_assignments, :date, :datetime, null: false
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 020308da6..88a43f82f 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20170128214244) do
+ActiveRecord::Schema.define(version: 20170130163030) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -398,12 +398,26 @@ ActiveRecord::Schema.define(version: 20170128214244) do
t.string "location"
end
+ create_table "poll_final_recounts", force: :cascade do |t|
+ t.integer "booth_assignment_id"
+ t.integer "officer_assignment_id"
+ t.integer "count"
+ t.text "count_log", default: ""
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.text "officer_assignment_id_log", default: ""
+ t.date "date", null: false
+ end
+
+ add_index "poll_final_recounts", ["booth_assignment_id"], name: "index_poll_final_recounts_on_booth_assignment_id", using: :btree
+
create_table "poll_officer_assignments", force: :cascade do |t|
t.integer "booth_assignment_id"
t.integer "officer_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.datetime "date"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.date "date", null: false
+ t.boolean "final", default: false
end
create_table "poll_officers", force: :cascade do |t|
@@ -451,7 +465,7 @@ ActiveRecord::Schema.define(version: 20170128214244) do
t.text "count_log", default: ""
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
- t.datetime "date"
+ t.date "date", null: false
t.text "officer_assignment_id_log", default: ""
end
@@ -469,8 +483,8 @@ ActiveRecord::Schema.define(version: 20170128214244) do
t.string "gender"
t.integer "geozone_id"
t.integer "answer_id"
- t.integer "user_id"
t.integer "officer_assignment_id"
+ t.integer "user_id"
end
add_index "poll_voters", ["document_number"], name: "index_poll_voters_on_document_number", using: :btree
diff --git a/spec/factories.rb b/spec/factories.rb
index dc3b4ff58..3ead9bf0e 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -415,6 +415,10 @@ FactoryGirl.define do
association :officer, factory: :poll_officer
association :booth_assignment, factory: :poll_booth_assignment
date Time.current.to_date
+
+ trait :final do
+ final true
+ end
end
factory :poll_recount, class: 'Poll::Recount' do
@@ -424,6 +428,13 @@ FactoryGirl.define do
date (1.month.ago.to_datetime..1.month.from_now.to_datetime).to_a.sample
end
+ factory :poll_final_recount, class: 'Poll::FinalRecount' do
+ association :officer_assignment, factory: [:poll_officer_assignment, :final]
+ association :booth_assignment, factory: :poll_booth_assignment
+ count (1..100).to_a.sample
+ date (1.month.ago.to_datetime..1.month.from_now.to_datetime).to_a.sample
+ end
+
factory :poll_voter, class: 'Poll::Voter' do
poll
association :user, :level_two
diff --git a/spec/features/admin/poll/officer_assignments_spec.rb b/spec/features/admin/poll/officer_assignments_spec.rb
index 3cbf9fb13..53b174b9a 100644
--- a/spec/features/admin/poll/officer_assignments_spec.rb
+++ b/spec/features/admin/poll/officer_assignments_spec.rb
@@ -30,7 +30,7 @@ feature 'Admin officer assignments in poll' do
expect(page).to have_content booth_assignment.poll.name
within('#officer_assignment_form') do
- select I18n.l(booth_assignment.poll.ends_at.to_date), from: 'date'
+ select I18n.l(booth_assignment.poll.ends_at.to_date, format: :long), from: 'date'
select "#{booth_assignment.booth.name} (#{booth_assignment.booth.location})", from: 'booth_id'
click_button 'Add shift'
end
diff --git a/spec/features/officing/final_recount_spec.rb b/spec/features/officing/final_recount_spec.rb
new file mode 100644
index 000000000..770561bb7
--- /dev/null
+++ b/spec/features/officing/final_recount_spec.rb
@@ -0,0 +1,100 @@
+require 'rails_helper'
+
+feature 'Officing Final Recount' do
+
+ background do
+ @poll_officer = create(:poll_officer)
+ @officer_assignment = create(:poll_officer_assignment, :final, officer: @poll_officer)
+ @poll = @officer_assignment.booth_assignment.poll
+ @poll.update(ends_at: 1.day.ago)
+ login_as(@poll_officer.user)
+ end
+
+ scenario 'Only polls where user is officer for final recounts are accessible' do
+ regular_officer_assignment_1 = create(:poll_officer_assignment, officer: @poll_officer)
+ regular_officer_assignment_2 = create(:poll_officer_assignment, officer: @poll_officer)
+
+ not_allowed_poll_1 = create(:poll, :expired)
+ not_allowed_poll_2 = regular_officer_assignment_1.booth_assignment.poll
+ not_allowed_poll_2.update(ends_at: 1.day.ago)
+ not_allowed_poll_3 = regular_officer_assignment_2.booth_assignment.poll
+
+ visit root_path
+ click_link 'Polling officers'
+
+ expect(page).to have_content('Poll officing')
+ within('#side_menu') do
+ click_link 'Final recounts'
+ end
+
+ expect(page).to_not have_content(not_allowed_poll_1.name)
+ expect(page).to_not have_content(not_allowed_poll_2.name)
+ expect(page).to_not have_content(not_allowed_poll_3.name)
+ expect(page).to have_content(@poll.name)
+
+ visit new_officing_poll_final_recount_path(not_allowed_poll_1)
+ expect(page).to have_content('You are allowed to add final recounts for this poll')
+ end
+
+ scenario 'Add final recount' do
+ visit officing_root_path
+
+ within('#side_menu') do
+ click_link 'Final recounts'
+ end
+
+ click_link @poll.name
+
+ expect(page).to_not have_content('Your recounts')
+
+ booth_name = @officer_assignment.booth_assignment.booth.name
+ date = I18n.l(@poll.starts_at.to_date, format: :long)
+ select booth_name, from: 'officer_assignment_id'
+ select date, from: 'date'
+ fill_in :count, with: '33'
+ click_button 'Save'
+
+ expect(page).to have_content('Your final recounts')
+
+ within("#poll_final_recount_#{@officer_assignment.booth_assignment.final_recounts.first.id}") do
+ expect(page).to have_content(date)
+ expect(page).to have_content(booth_name)
+ expect(page).to have_content('33')
+ end
+ end
+
+ scenario 'Edit recount' do
+ final_recount = create(:poll_final_recount,
+ officer_assignment: @officer_assignment,
+ booth_assignment: @officer_assignment.booth_assignment,
+ date: @poll.starts_at,
+ count: 100)
+
+ booth_name = @officer_assignment.booth_assignment.booth.name
+ date = I18n.l(final_recount.date.to_date, format: :long)
+
+ visit new_officing_poll_final_recount_path(@poll)
+
+ expect(page).to have_content('Your final recounts')
+
+ within("#poll_final_recount_#{final_recount.id}") do
+ expect(page).to have_content(date)
+ expect(page).to have_content(booth_name)
+ expect(page).to have_content('100')
+ end
+
+ select booth_name, from: 'officer_assignment_id'
+ select date, from: 'date'
+ fill_in :count, with: '42'
+ click_button 'Save'
+
+ expect(page).to have_content "Data added"
+
+ within("#poll_final_recount_#{final_recount.id}") do
+ expect(page).to have_content(date)
+ expect(page).to have_content(booth_name)
+ expect(page).to have_content('42')
+ end
+ expect(page).to_not have_content('100')
+ end
+end
\ No newline at end of file
diff --git a/spec/models/poll/final_recount_spec.rb b/spec/models/poll/final_recount_spec.rb
new file mode 100644
index 000000000..7239056a5
--- /dev/null
+++ b/spec/models/poll/final_recount_spec.rb
@@ -0,0 +1,40 @@
+require 'rails_helper'
+
+describe :final_recount do
+
+ it "should update count_log if count changes" do
+ final_recount = create(:poll_final_recount, count: 33)
+
+ expect(final_recount.count_log).to eq("")
+
+ final_recount.count = 33
+ final_recount.save
+ final_recount.count = 32
+ final_recount.save
+ final_recount.count = 34
+ final_recount.save
+
+ expect(final_recount.count_log).to eq(":33:32")
+ end
+
+ it "should update officer_assignment_id_log if count changes" do
+ final_recount = create(:poll_final_recount, count: 33)
+
+ expect(final_recount.count_log).to eq("")
+
+ final_recount.count = 33
+ final_recount.officer_assignment_id = 1
+ final_recount.save
+
+ final_recount.count = 32
+ final_recount.officer_assignment_id = 2
+ final_recount.save
+
+ final_recount.count = 34
+ final_recount.officer_assignment_id = 3
+ final_recount.save
+
+ expect(final_recount.officer_assignment_id_log).to eq(":1:2")
+ end
+
+end
\ No newline at end of file
diff --git a/spec/models/poll/officer_spec.rb b/spec/models/poll/officer_spec.rb
index cea0e8bae..83bdbecc2 100644
--- a/spec/models/poll/officer_spec.rb
+++ b/spec/models/poll/officer_spec.rb
@@ -2,8 +2,8 @@ require 'rails_helper'
describe :officer do
- describe "#assigned_polls" do
- it "should return all polls with this officer assigned" do
+ describe "#voting_days_assigned_polls" do
+ it "should return all polls with this officer assigned during voting days" do
officer = create(:poll_officer)
poll_1 = create(:poll)
@@ -18,13 +18,31 @@ describe :officer do
create(:poll_officer_assignment, booth_assignment: booth_assignment_1b, officer: officer, date: poll_1.ends_at)
create(:poll_officer_assignment, booth_assignment: booth_assignment_2, officer: officer)
- assigned_polls = officer.assigned_polls
+ assigned_polls = officer.voting_days_assigned_polls
expect(assigned_polls.size).to eq 2
expect(assigned_polls.include?(poll_1)).to eq(true)
expect(assigned_polls.include?(poll_2)).to eq(true)
expect(assigned_polls.include?(poll_3)).to eq(false)
end
+ it "should not return polls with this officer assigned for final recount/results" do
+ officer = create(:poll_officer)
+
+ poll_1 = create(:poll)
+ poll_2 = create(:poll)
+
+ booth_assignment_1 = create(:poll_booth_assignment, poll: poll_1)
+ booth_assignment_2 = create(:poll_booth_assignment, poll: poll_2)
+
+ create(:poll_officer_assignment, booth_assignment: booth_assignment_1, officer: officer, date: poll_1.starts_at)
+ create(:poll_officer_assignment, booth_assignment: booth_assignment_2, officer: officer, final: true)
+
+ assigned_polls = officer.voting_days_assigned_polls
+ expect(assigned_polls.size).to eq 1
+ expect(assigned_polls.include?(poll_1)).to eq(true)
+ expect(assigned_polls.include?(poll_2)).to eq(false)
+ end
+
it "should return polls ordered by end date (desc)" do
officer = create(:poll_officer)
@@ -36,7 +54,7 @@ describe :officer do
create(:poll_officer_assignment, officer: officer, booth_assignment: create(:poll_booth_assignment, poll: p))
end
- assigned_polls = officer.assigned_polls
+ assigned_polls = officer.voting_days_assigned_polls
expect(assigned_polls.first).to eq(poll_2)
expect(assigned_polls.second).to eq(poll_1)
@@ -44,4 +62,63 @@ describe :officer do
end
end
+ describe "#final_days_assigned_polls" do
+ it "should return all polls with this officer assigned for final recount/results" do
+ officer = create(:poll_officer)
+
+ poll_1 = create(:poll)
+ poll_2 = create(:poll)
+ poll_3 = create(:poll)
+
+ booth_assignment_1a = create(:poll_booth_assignment, poll: poll_1)
+ booth_assignment_1b = create(:poll_booth_assignment, poll: poll_1)
+ booth_assignment_2 = create(:poll_booth_assignment, poll: poll_2)
+
+ create(:poll_officer_assignment, booth_assignment: booth_assignment_1a, officer: officer, date: poll_1.starts_at, final: true)
+ create(:poll_officer_assignment, booth_assignment: booth_assignment_1b, officer: officer, date: poll_1.ends_at, final: true)
+ create(:poll_officer_assignment, booth_assignment: booth_assignment_2, officer: officer, final: true)
+
+ assigned_polls = officer.final_days_assigned_polls
+ expect(assigned_polls.size).to eq 2
+ expect(assigned_polls.include?(poll_1)).to eq(true)
+ expect(assigned_polls.include?(poll_2)).to eq(true)
+ expect(assigned_polls.include?(poll_3)).to eq(false)
+ end
+
+ it "should not return polls with this officer assigned for voting days" do
+ officer = create(:poll_officer)
+
+ poll_1 = create(:poll)
+ poll_2 = create(:poll)
+
+ booth_assignment_1 = create(:poll_booth_assignment, poll: poll_1)
+ booth_assignment_2 = create(:poll_booth_assignment, poll: poll_2)
+
+ create(:poll_officer_assignment, booth_assignment: booth_assignment_1, officer: officer, date: poll_1.starts_at)
+ create(:poll_officer_assignment, booth_assignment: booth_assignment_2, officer: officer, final: true)
+
+ assigned_polls = officer.final_days_assigned_polls
+ expect(assigned_polls.size).to eq 1
+ expect(assigned_polls.include?(poll_1)).to eq(false)
+ expect(assigned_polls.include?(poll_2)).to eq(true)
+ end
+
+ it "should return polls ordered by end date (desc)" do
+ officer = create(:poll_officer)
+
+ poll_1 = create(:poll, ends_at: 1.day.ago)
+ poll_2 = create(:poll, ends_at: 10.days.from_now)
+ poll_3 = create(:poll, ends_at: 10.day.ago)
+
+ [poll_1, poll_2, poll_3].each do |p|
+ create(:poll_officer_assignment, officer: officer, booth_assignment: create(:poll_booth_assignment, poll: p), final: true)
+ end
+
+ assigned_polls = officer.final_days_assigned_polls
+
+ expect(assigned_polls.first).to eq(poll_2)
+ expect(assigned_polls.second).to eq(poll_1)
+ expect(assigned_polls.last).to eq(poll_3)
+ end
+ end
end
\ No newline at end of file