adds signature sheets

This commit is contained in:
rgarcia
2016-12-20 12:21:05 +01:00
parent 392f00cdbd
commit 3c682b8a9b
16 changed files with 282 additions and 6 deletions

View File

@@ -0,0 +1,33 @@
class Admin::SignatureSheetsController < Admin::BaseController
def index
@signature_sheets = SignatureSheet.all
end
def new
@signature_sheet = SignatureSheet.new
end
def create
@signature_sheet = SignatureSheet.new(signature_sheet_params)
@signature_sheet.author = current_user
if @signature_sheet.save
@signature_sheet.delay.verify_signatures
redirect_to [:admin, @signature_sheet]
else
render :new
end
end
def show
@signature_sheet = SignatureSheet.find(params[:id])
@invalid_signatures = @signature_sheet.invalid_signatures
end
private
def signature_sheet_params
params.require(:signature_sheet).permit(:signable_type, :signable_id, :document_numbers)
end
end

View File

@@ -0,0 +1,8 @@
module SignatureSheetsHelper
def signable_options
[[t("activerecord.models.proposal", count: 1), Proposal],
[t("activerecord.models.spending_proposal", count: 1), SpendingProposal]]
end
end

View File

@@ -122,9 +122,9 @@ class Proposal < ActiveRecord::Base
retired_at.present? retired_at.present?
end end
def register_vote(user, vote_value) def register_vote(user, vote_value, signature=nil)
if votable_by?(user) && !archived? if votable_by?(user) && !archived?
vote_by(voter: user, vote: vote_value) vote_by(voter: user, vote: vote_value, vote_scope: signature)
end end
end end

72
app/models/signature.rb Normal file
View File

@@ -0,0 +1,72 @@
class Signature < ActiveRecord::Base
belongs_to :signature_sheet
belongs_to :user
validate :in_census
validate :not_already_voted
scope :valid, -> { where(status: 'verified') }
scope :invalid, -> { where.not(status: 'verified') }
def in_census
return true if user_exists?
errors.add(:document_number, :not_in_census) unless in_census?
end
def not_already_voted
errors.add(:document_number, :already_voted) if already_voted?
end
def verify
if valid?
assign_vote
update_attribute(:status, 'verified')
else
error = errors.messages[:document_number].first
update_attribute(:status, error)
end
end
private
def assign_vote
if user_exists?
assign_vote_to_user
else
create_user
assign_vote_to_user
end
end
def assign_vote_to_user
signable.register_vote(user, "yes", "signature")
#Vote.create(votable: signable, voter: user, signature: self)
end
def user_exists?
user = User.where(document_number: document_number).exists?
end
def create_user
user = User.where(document_number: document_number, erased_at: Time.now).create
end
def in_census?
document_types.any? do |document_type|
CensusApi.new.call(document_type, document_number).valid?
end
end
def already_voted?
signable.voters.where(document_number: document_number).exists?
end
def signable
signature_sheet.signable
end
def document_types
%w(1 2 3 4)
end
end

View File

@@ -0,0 +1,43 @@
class SignatureSheet < ActiveRecord::Base
belongs_to :signable, polymorphic: true
belongs_to :author, class_name: 'User', foreign_key: 'author_id'
VALID_SIGNABLES = %w( Proposal SpendingProposal )
has_many :signatures
validates :author, presence: true
validates :signable_type, inclusion: {in: VALID_SIGNABLES}
validates :document_numbers, presence: true
validates :signable, presence: true
validate :signable_found
def name
"#{signable_name} + #{signable_id}"
end
def signable_name
I18n.t("activerecord.models.#{signable_type.underscore}", count: 1)
end
def verify_signatures
parsed_document_numbers.each do |document_number|
signature = signatures.new(document_number: document_number)
signature.save(validate: false)
signature.verify
end
update(processed: true)
end
def invalid_signatures
signatures.invalid.group_by(&:status)
end
def parsed_document_numbers
document_numbers.split(",")
end
def signable_found
errors.add(:signable_id, :not_found) if errors.messages[:signable].present?
end
end

View File

@@ -125,13 +125,17 @@ class SpendingProposal < ActiveRecord::Base
return :organization if user.organization? return :organization if user.organization?
end end
def voters
User.active.where(id: votes_for.voters)
end
def votable_by?(user) def votable_by?(user)
reason_for_not_being_votable_by(user).blank? reason_for_not_being_votable_by(user).blank?
end end
def register_vote(user, vote_value) def register_vote(user, vote_value, signature=nil)
if votable_by?(user) if votable_by?(user)
vote_by(voter: user, vote: vote_value) vote_by(voter: user, vote: vote_value, vote_scope: signature)
end end
end end

View File

@@ -35,6 +35,14 @@
</li> </li>
<% end %> <% end %>
<% if feature?(:signature_sheets) %>
<li <%= "class=active" if controller_name == "signature_sheets" %>>
<%= link_to admin_signature_sheets_path do %>
<span class="icon-budget"></span><%= t("admin.menu.signature_sheets") %>
<% end %>
</li>
<% end %>
<li <%= "class=active" if controller_name == "banners" %>> <li <%= "class=active" if controller_name == "banners" %>>
<%= link_to admin_banners_path do %> <%= link_to admin_banners_path do %>
<span class="icon-eye"></span><%= t("admin.menu.banner") %> <span class="icon-eye"></span><%= t("admin.menu.banner") %>

View File

@@ -0,0 +1,26 @@
<h1>Signatures</h1>
<div>
<%= link_to 'Nueva hoja de firmas', new_admin_signature_sheet_path %>
</div>
<table>
<tr>
<th><%= t("admin.signature_sheet.name") %></th>
<th><%= t("admin.signature_sheet.author") %></th>
<th><%= t("admin.signature_sheet.created_at") %></th>
</tr>
<% @signature_sheets.each do |signature_sheet| %>
<tr id="<%= dom_id(signature_sheet) %>">
<td>
<%= link_to signature_sheet.name, [:admin, signature_sheet] %>
</td>
<td>
<%= signature_sheet.author.name %>
</td>
<td>
<%= l(signature_sheet.created_at, format: :short) %>
</td>
</tr>
<% end %>
</table>

View File

@@ -0,0 +1,9 @@
<%= form_for [:admin, @signature_sheet] do |f| %>
<%= render 'shared/errors',
resource: @signature_sheet %>
<%= f.select :signable_type, signable_options %>
<%= f.text_field :signable_id %>
<%= f.text_area :document_numbers %>
<%= f.submit %>
<% end %>

View File

@@ -0,0 +1,28 @@
<h1><%= @signature_sheet.name %></h1>
<div>Documentos: <%= @signature_sheet.document_numbers %></div>
<div>Creado: <%= l(@signature_sheet.created_at, format: :short) %></div>
<div>Autor: <%= @signature_sheet.author.name %></div>
<br/>
<div>
Hay <%= @signature_sheet.signatures.valid.count %> firmas válidas
</div>
<div>
Hay <%= @signature_sheet.signatures.invalid.count %> firmas inválidas
</div>
<br/>
<% if @signature_sheet.signatures.invalid.any? %>
<% @invalid_signatures.each do |error, signatures| %>
<div><%= error %></div>
<div>
<%= signatures.map(&:document_number).join(",") %>
</div>
<% end %>
<% end %>
<% unless @signature_sheet.processed? %>
Aún hay firmas que se están verificando por el Padrón, por favor refresca la página en unos instantes.
<% end %>

View File

@@ -1,6 +1,5 @@
<%= form_for(@debate) do |f| %> <%= form_for(@debate) do |f| %>
<%= render 'shared/errors', resource: @debate %> <%= render 'shared/errors', resource: @debate %>
<div class="row"> <div class="row">

View File

@@ -1,4 +1,6 @@
ActsAsVotable::Vote.class_eval do ActsAsVotable::Vote.class_eval do
belongs_to :signature
def self.for_debates(debates) def self.for_debates(debates)
where(votable_type: 'Debate', votable_id: debates) where(votable_type: 'Debate', votable_id: debates)
end end
@@ -14,4 +16,5 @@ ActsAsVotable::Vote.class_eval do
def value def value
vote_flag vote_flag
end end
end end

View File

@@ -149,6 +149,8 @@ Rails.application.routes.draw do
get :summary, on: :collection get :summary, on: :collection
end end
resources :signature_sheets, only: [:index, :new, :create, :show]
resources :banners, only: [:index, :new, :create, :edit, :update, :destroy] do resources :banners, only: [:index, :new, :create, :edit, :update, :destroy] do
collection { get :search} collection { get :search}
end end

View File

@@ -0,0 +1,11 @@
class CreateSignatureSheets < ActiveRecord::Migration
def change
create_table :signature_sheets do |t|
t.references :signable, polymorphic: true
t.text :document_numbers
t.boolean :processed
t.references :author
t.timestamps
end
end
end

View File

@@ -0,0 +1,11 @@
class CreateSignatures < ActiveRecord::Migration
def change
create_table :signatures do |t|
t.references :signature_sheet
t.references :user
t.string :document_number
t.string :status, default: nil
t.timestamps
end
end
end

View File

@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20161102133838) do ActiveRecord::Schema.define(version: 20161214233817) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@@ -326,6 +326,25 @@ ActiveRecord::Schema.define(version: 20161102133838) do
add_index "settings", ["key"], name: "index_settings_on_key", using: :btree add_index "settings", ["key"], name: "index_settings_on_key", using: :btree
create_table "signature_sheets", force: :cascade do |t|
t.integer "signable_id"
t.string "signable_type"
t.text "document_numbers"
t.boolean "processed"
t.integer "author_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "signatures", force: :cascade do |t|
t.integer "signature_sheet_id"
t.integer "user_id"
t.string "document_number"
t.string "status"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "spending_proposals", force: :cascade do |t| create_table "spending_proposals", force: :cascade do |t|
t.string "title" t.string "title"
t.text "description" t.text "description"