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?
|
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
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?
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -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") %>
|
||||||
|
|||||||
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| %>
|
<%= form_for(@debate) do |f| %>
|
||||||
|
|
||||||
|
|
||||||
<%= render 'shared/errors', resource: @debate %>
|
<%= render 'shared/errors', resource: @debate %>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
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.
|
# 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"
|
||||||
|
|||||||
Reference in New Issue
Block a user