adds signature sheets
This commit is contained in:
33
app/controllers/admin/signature_sheets_controller.rb
Normal file
33
app/controllers/admin/signature_sheets_controller.rb
Normal 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
|
||||
8
app/helpers/signature_sheets_helper.rb
Normal file
8
app/helpers/signature_sheets_helper.rb
Normal 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
|
||||
@@ -122,9 +122,9 @@ class Proposal < ActiveRecord::Base
|
||||
retired_at.present?
|
||||
end
|
||||
|
||||
def register_vote(user, vote_value)
|
||||
def register_vote(user, vote_value, signature=nil)
|
||||
if votable_by?(user) && !archived?
|
||||
vote_by(voter: user, vote: vote_value)
|
||||
vote_by(voter: user, vote: vote_value, vote_scope: signature)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
72
app/models/signature.rb
Normal file
72
app/models/signature.rb
Normal 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
|
||||
43
app/models/signature_sheet.rb
Normal file
43
app/models/signature_sheet.rb
Normal 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
|
||||
@@ -125,13 +125,17 @@ class SpendingProposal < ActiveRecord::Base
|
||||
return :organization if user.organization?
|
||||
end
|
||||
|
||||
def voters
|
||||
User.active.where(id: votes_for.voters)
|
||||
end
|
||||
|
||||
def votable_by?(user)
|
||||
reason_for_not_being_votable_by(user).blank?
|
||||
end
|
||||
|
||||
def register_vote(user, vote_value)
|
||||
def register_vote(user, vote_value, signature=nil)
|
||||
if votable_by?(user)
|
||||
vote_by(voter: user, vote: vote_value)
|
||||
vote_by(voter: user, vote: vote_value, vote_scope: signature)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -35,6 +35,14 @@
|
||||
</li>
|
||||
<% 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" %>>
|
||||
<%= link_to admin_banners_path do %>
|
||||
<span class="icon-eye"></span><%= t("admin.menu.banner") %>
|
||||
|
||||
26
app/views/admin/signature_sheets/index.html.erb
Normal file
26
app/views/admin/signature_sheets/index.html.erb
Normal 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>
|
||||
9
app/views/admin/signature_sheets/new.html.erb
Normal file
9
app/views/admin/signature_sheets/new.html.erb
Normal 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 %>
|
||||
28
app/views/admin/signature_sheets/show.html.erb
Normal file
28
app/views/admin/signature_sheets/show.html.erb
Normal 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 %>
|
||||
@@ -1,6 +1,5 @@
|
||||
<%= form_for(@debate) do |f| %>
|
||||
|
||||
|
||||
<%= render 'shared/errors', resource: @debate %>
|
||||
|
||||
<div class="row">
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
ActsAsVotable::Vote.class_eval do
|
||||
belongs_to :signature
|
||||
|
||||
def self.for_debates(debates)
|
||||
where(votable_type: 'Debate', votable_id: debates)
|
||||
end
|
||||
@@ -14,4 +16,5 @@ ActsAsVotable::Vote.class_eval do
|
||||
def value
|
||||
vote_flag
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -149,6 +149,8 @@ Rails.application.routes.draw do
|
||||
get :summary, on: :collection
|
||||
end
|
||||
|
||||
resources :signature_sheets, only: [:index, :new, :create, :show]
|
||||
|
||||
resources :banners, only: [:index, :new, :create, :edit, :update, :destroy] do
|
||||
collection { get :search}
|
||||
end
|
||||
|
||||
11
db/migrate/20161214212918_create_signature_sheets.rb
Normal file
11
db/migrate/20161214212918_create_signature_sheets.rb
Normal 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
|
||||
11
db/migrate/20161214233817_create_signatures.rb
Normal file
11
db/migrate/20161214233817_create_signatures.rb
Normal 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
|
||||
21
db/schema.rb
21
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: 20161102133838) do
|
||||
ActiveRecord::Schema.define(version: 20161214233817) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
@@ -326,6 +326,25 @@ ActiveRecord::Schema.define(version: 20161102133838) do
|
||||
|
||||
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|
|
||||
t.string "title"
|
||||
t.text "description"
|
||||
|
||||
Reference in New Issue
Block a user