Merge pull request #1482 from consul/signatures

Signature sheets for budget investments
This commit is contained in:
Enrique García
2017-04-05 14:07:36 +02:00
committed by GitHub
8 changed files with 141 additions and 73 deletions

View File

@@ -2,7 +2,7 @@ module SignatureSheetsHelper
def signable_options def signable_options
[[t("activerecord.models.proposal", count: 1), Proposal], [[t("activerecord.models.proposal", count: 1), Proposal],
[t("activerecord.models.spending_proposal", count: 1), SpendingProposal]] [t("activerecord.models.budget/investment", count: 1), Budget::Investment]]
end end
end end

View File

@@ -12,35 +12,30 @@ class Signature < ActiveRecord::Base
before_validation :clean_document_number before_validation :clean_document_number
def verified?
user_exists? || in_census?
end
def verify def verify
if verified?
assign_vote
mark_as_verified
end
end
def assign_vote
if user_exists? if user_exists?
assign_vote_to_user assign_vote_to_user
else mark_as_verified
elsif in_census?
create_user create_user
assign_vote_to_user assign_vote_to_user
mark_as_verified
end end
end end
def assign_vote_to_user def assign_vote_to_user
set_user set_user
signable.register_vote(user, "yes") if signable.is_a? Budget::Investment
signable.vote_by(voter: user, vote: 'yes') if [nil, :no_selecting_allowed].include?(signable.reason_for_not_being_selectable_by(user))
else
signable.register_vote(user, "yes")
end
assign_signature_to_vote assign_signature_to_vote
end end
def assign_signature_to_vote def assign_signature_to_vote
vote = Vote.where(votable: signable, voter: user).first vote = Vote.where(votable: signable, voter: user).first
vote.update(signature: self) vote.update(signature: self) if vote
end end
def user_exists? def user_exists?
@@ -55,7 +50,10 @@ class Signature < ActiveRecord::Base
erased_at: Time.now, erased_at: Time.now,
password: random_password, password: random_password,
terms_of_service: '1', terms_of_service: '1',
email: nil email: nil,
date_of_birth: @census_api_response.date_of_birth,
gender: @census_api_response.gender,
geozone: Geozone.where(census_code: @census_api_response.district_code).first
} }
User.create!(user_params) User.create!(user_params)
end end
@@ -70,10 +68,17 @@ class Signature < ActiveRecord::Base
end end
def in_census? def in_census?
response = document_types.detect do |document_type| document_types.detect do |document_type|
CensusApi.new.call(document_type, document_number).valid? response = CensusApi.new.call(document_type, document_number)
if response.valid?
@census_api_response = response
true
else
false
end
end end
response.present?
@census_api_response.present?
end end
def set_user def set_user

View File

@@ -2,7 +2,7 @@ class SignatureSheet < ActiveRecord::Base
belongs_to :signable, polymorphic: true belongs_to :signable, polymorphic: true
belongs_to :author, class_name: 'User', foreign_key: 'author_id' belongs_to :author, class_name: 'User', foreign_key: 'author_id'
VALID_SIGNABLES = %w( Proposal SpendingProposal ) VALID_SIGNABLES = %w( Proposal Budget::Investment SpendingProposal )
has_many :signatures has_many :signatures

View File

@@ -22,6 +22,8 @@ data:
## Another gem (replace %#= with %=): ## Another gem (replace %#= with %=):
# - "<%#= %x[bundle show vagrant].chomp %>/templates/locales/%{locale}.yml" # - "<%#= %x[bundle show vagrant].chomp %>/templates/locales/%{locale}.yml"
- config/locales/%{locale}.yml - config/locales/%{locale}.yml
- config/locales/activerecord.%{locale}.yml
- config/locales/activemodel.%{locale}.yml
- config/locales/admin.%{locale}.yml - config/locales/admin.%{locale}.yml
- config/locales/moderation.%{locale}.yml - config/locales/moderation.%{locale}.yml
- config/locales/valuation.%{locale}.yml - config/locales/valuation.%{locale}.yml

View File

@@ -8,8 +8,8 @@ es:
one: "Presupuesto participativo" one: "Presupuesto participativo"
other: "Presupuestos participativos" other: "Presupuestos participativos"
budget/investment: budget/investment:
one: "Propuesta de inversión" one: "Proyecto de inversión"
other: "Propuestas de inversión" other: "Proyectos de inversión"
comment: comment:
one: "Comentario" one: "Comentario"
other: "Comentarios" other: "Comentarios"
@@ -116,6 +116,10 @@ es:
attributes: attributes:
tag_list: tag_list:
less_than_or_equal_to: "los temas deben ser menor o igual que %{count}" less_than_or_equal_to: "los temas deben ser menor o igual que %{count}"
budget/investment:
attributes:
tag_list:
less_than_or_equal_to: "los temas deben ser menor o igual que %{count}"
proposal_notification: proposal_notification:
attributes: attributes:
minimum_interval: minimum_interval:

View File

@@ -19,20 +19,42 @@ feature 'Signature sheets' do
end end
end end
scenario 'Create' do context 'Create' do
proposal = create(:proposal) scenario 'Proposal' do
visit new_admin_signature_sheet_path proposal = create(:proposal)
visit new_admin_signature_sheet_path
select "Citizen proposal", from: "signature_sheet_signable_type" select "Citizen proposal", from: "signature_sheet_signable_type"
fill_in "signature_sheet_signable_id", with: proposal.id fill_in "signature_sheet_signable_id", with: proposal.id
fill_in "signature_sheet_document_numbers", with: "12345678Z, 99999999Z" fill_in "signature_sheet_document_numbers", with: "12345678Z, 99999999Z"
click_button "Create signature sheet" click_button "Create signature sheet"
expect(page).to have_content "Signature sheet created successfully" expect(page).to have_content "Signature sheet created successfully"
visit proposal_path(proposal) visit proposal_path(proposal)
expect(page).to have_content "1 support"
end
scenario 'Budget Investment' do
investment = create(:budget_investment)
budget = investment.budget
budget.update(phase: 'selecting')
visit new_admin_signature_sheet_path
select "Investment", from: "signature_sheet_signable_type"
fill_in "signature_sheet_signable_id", with: investment.id
fill_in "signature_sheet_document_numbers", with: "12345678Z, 99999999Z"
click_button "Create signature sheet"
expect(page).to have_content "Signature sheet created successfully"
visit budget_investment_path(budget, investment)
expect(page).to have_content "1 support"
end
expect(page).to have_content "1 support"
end end
scenario 'Errors on create' do scenario 'Errors on create' do

View File

@@ -46,12 +46,20 @@ describe SignatureSheet do
expect(signature_sheet.name).to eq("Citizen proposal #{proposal.id}") expect(signature_sheet.name).to eq("Citizen proposal #{proposal.id}")
end end
it "returns name for spending proposal signature sheets" do it "returns name for spending proposal signature sheets" do
spending_proposal = create(:spending_proposal) spending_proposal = create(:spending_proposal)
signature_sheet.signable = spending_proposal signature_sheet.signable = spending_proposal
expect(signature_sheet.name).to eq("Spending proposal #{spending_proposal.id}") expect(signature_sheet.name).to eq("Spending proposal #{spending_proposal.id}")
end end
it "returns name for budget investment signature sheets" do
budget_investment = create(:budget_investment)
signature_sheet.signable = budget_investment
expect(signature_sheet.name).to eq("Investment #{budget_investment.id}")
end
end end
describe "#verify_signatures" do describe "#verify_signatures" do

View File

@@ -46,49 +46,61 @@ describe Signature do
end end
end end
describe "#verified?" do describe "#verify" do
it "returns true if user exists" do
user = create(:user, :level_two, document_number: "123A")
signature = create(:signature, document_number: user.document_number)
expect(signature.verified?).to eq(true)
end
it "returns true if document number in census" do
signature = create(:signature, document_number: "12345678Z")
expect(signature.verified?).to eq(true)
end
it "returns false if user does not exist and not in census" do
signature = create(:signature, document_number: "123A")
expect(signature.verified?).to eq(false)
end
end
describe "#assign_vote" do
describe "existing user" do describe "existing user" do
it "assigns vote to user" do it "assigns vote to user on proposal" do
user = create(:user, :level_two, document_number: "123A") user = create(:user, :level_two, document_number: "123A")
signature = create(:signature, document_number: user.document_number) signature = create(:signature, document_number: user.document_number)
proposal = signature.signable proposal = signature.signable
signature.assign_vote signature.verify
expect(user.voted_for?(proposal)).to be expect(user.voted_for?(proposal)).to be
end end
it "assigns vote to user on budget investment" do
investment = create(:budget_investment)
signature_sheet = create(:signature_sheet, signable: investment)
user = create(:user, :level_two, document_number: "123A")
signature = create(:signature, document_number: user.document_number, signature_sheet: signature_sheet)
signature.verify
expect(user.voted_for?(investment)).to be
end
it "does not assign vote to user multiple times" do it "does not assign vote to user multiple times" do
user = create(:user, :level_two, document_number: "123A") user = create(:user, :level_two, document_number: "123A")
signature = create(:signature, document_number: user.document_number) signature = create(:signature, document_number: user.document_number)
signature.assign_vote signature.verify
signature.assign_vote signature.verify
expect(Vote.count).to eq(1)
end
it "does not assigns vote to invalid user on budget investment" do
investment = create(:budget_investment)
signature_sheet = create(:signature_sheet, signable: investment)
user = create(:user, document_number: "123A")
signature = create(:signature, document_number: user.document_number, signature_sheet: signature_sheet)
signature.verify
expect(user.voted_for?(investment)).to_not be
expect(Vote.count).to eq(0)
end
it "does not assign vote to user multiple times on budget investment" do
investment = create(:budget_investment)
signature_sheet = create(:signature_sheet, signable: investment)
user = create(:user, :level_two, document_number: "123A")
signature = create(:signature, document_number: user.document_number, signature_sheet: signature_sheet)
signature.verify
signature.verify
expect(Vote.count).to eq(1) expect(Vote.count).to eq(1)
end end
@@ -100,7 +112,22 @@ describe Signature do
signature_sheet = create(:signature_sheet, signable: proposal) signature_sheet = create(:signature_sheet, signable: proposal)
signature = create(:signature, signature_sheet: signature_sheet, document_number: user.document_number) signature = create(:signature, signature_sheet: signature_sheet, document_number: user.document_number)
signature.assign_vote signature.verify
expect(Vote.count).to eq(1)
end
it "does not assign vote to user if already voted on budget investment" do
investment = create(:budget_investment)
user = create(:user, :level_two, document_number: "123A")
vote = create(:vote, votable: investment, voter: user)
signature_sheet = create(:signature_sheet, signable: investment)
signature = create(:signature, document_number: user.document_number, signature_sheet: signature_sheet)
expect(Vote.count).to eq(1)
signature.verify
expect(Vote.count).to eq(1) expect(Vote.count).to eq(1)
end end
@@ -108,7 +135,7 @@ describe Signature do
it "marks the vote as coming from a signature" do it "marks the vote as coming from a signature" do
signature = create(:signature, document_number: "12345678Z") signature = create(:signature, document_number: "12345678Z")
signature.assign_vote signature.verify
expect(Vote.last.signature).to eq(signature) expect(Vote.last.signature).to eq(signature)
end end
@@ -118,23 +145,27 @@ describe Signature do
describe "inexistent user" do describe "inexistent user" do
it "creates a user with that document number" do it "creates a user with that document number" do
create(:geozone, census_code: "01")
signature = create(:signature, document_number: "12345678Z") signature = create(:signature, document_number: "12345678Z")
proposal = signature.signable proposal = signature.signable
signature.assign_vote signature.verify
user = User.last user = User.last
expect(user.document_number).to eq("12345678Z") expect(user.document_number).to eq("12345678Z")
expect(user.created_from_signature).to eq(true) expect(user.created_from_signature).to eq(true)
expect(user.verified_at).to be expect(user.verified_at).to be
expect(user.erased_at).to be expect(user.erased_at).to be
expect(user.geozone).to be
expect(user.gender).to be
expect(user.date_of_birth).to be
end end
it "assign the vote to newly created user" do it "assign the vote to newly created user" do
signature = create(:signature, document_number: "12345678Z") signature = create(:signature, document_number: "12345678Z")
proposal = signature.signable proposal = signature.signable
signature.assign_vote signature.verify
user = signature.user user = signature.user
expect(user.voted_for?(proposal)).to be expect(user.voted_for?(proposal)).to be
@@ -143,22 +174,18 @@ describe Signature do
it "assigns signature to vote" do it "assigns signature to vote" do
signature = create(:signature, document_number: "12345678Z") signature = create(:signature, document_number: "12345678Z")
signature.assign_vote signature.verify
expect(Vote.last.signature).to eq(signature) expect(Vote.last.signature).to eq(signature)
end end
end end
end
describe "#verify" do
describe "document in census" do describe "document in census" do
it "calls assign_vote" do it "calls assign_vote_to_user" do
signature = create(:signature, document_number: "12345678Z") signature = create(:signature, document_number: "12345678Z")
expect(signature).to receive(:assign_vote) expect(signature).to receive(:assign_vote_to_user)
signature.verify signature.verify
end end
@@ -175,10 +202,10 @@ describe Signature do
describe "document not in census" do describe "document not in census" do
it "does not call assign_vote" do it "does not call assign_vote_to_user" do
signature = create(:signature, document_number: "123A") signature = create(:signature, document_number: "123A")
expect(signature).to_not receive(:assign_vote) expect(signature).to_not receive(:assign_vote_to_user)
signature.verify signature.verify
end end