100 lines
2.4 KiB
Ruby
100 lines
2.4 KiB
Ruby
class Signature < ApplicationRecord
|
|
belongs_to :signature_sheet
|
|
belongs_to :user
|
|
|
|
validates :document_number, presence: true
|
|
validates :date_of_birth, presence: true, if: -> { Setting.force_presence_date_of_birth? }
|
|
validates :postal_code, presence: true, if: -> { Setting.force_presence_postal_code? }
|
|
validates :signature_sheet, presence: true
|
|
|
|
scope :verified, -> { where(verified: true) }
|
|
scope :unverified, -> { where(verified: false) }
|
|
|
|
delegate :signable, to: :signature_sheet
|
|
|
|
before_validation :clean_document_number
|
|
|
|
def verify
|
|
if user_exists?
|
|
assign_vote_to_user
|
|
mark_as_verified
|
|
elsif in_census?
|
|
create_user
|
|
assign_vote_to_user
|
|
mark_as_verified
|
|
end
|
|
end
|
|
|
|
def assign_vote_to_user
|
|
set_user
|
|
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
|
|
end
|
|
|
|
def assign_signature_to_vote
|
|
vote = Vote.find_by(votable: signable, voter: user)
|
|
vote&.update!(signature: self)
|
|
end
|
|
|
|
def user_exists?
|
|
User.where(document_number: document_number).any?
|
|
end
|
|
|
|
def create_user
|
|
user_params = {
|
|
document_number: document_number,
|
|
created_from_signature: true,
|
|
verified_at: Time.current,
|
|
erased_at: Time.current,
|
|
password: random_password,
|
|
terms_of_service: "1",
|
|
email: nil,
|
|
date_of_birth: @census_api_response.date_of_birth,
|
|
gender: @census_api_response.gender,
|
|
geozone: Geozone.find_by(census_code: @census_api_response.district_code)
|
|
}
|
|
User.create!(user_params)
|
|
end
|
|
|
|
def clean_document_number
|
|
return if document_number.blank?
|
|
self.document_number = document_number.gsub(/[^a-z0-9]+/i, "").upcase
|
|
end
|
|
|
|
def random_password
|
|
(0...20).map { ("a".."z").to_a[rand(26)] }.join
|
|
end
|
|
|
|
def in_census?
|
|
document_types.detect do |document_type|
|
|
response = CensusCaller.new.call(document_type, document_number, date_of_birth, postal_code)
|
|
if response.valid?
|
|
@census_api_response = response
|
|
true
|
|
else
|
|
false
|
|
end
|
|
end
|
|
|
|
@census_api_response.present?
|
|
end
|
|
|
|
def set_user
|
|
user = User.find_by(document_number: document_number)
|
|
update(user: user)
|
|
end
|
|
|
|
def mark_as_verified
|
|
update(verified: true)
|
|
end
|
|
|
|
def document_types
|
|
%w[1 2 3 4]
|
|
end
|
|
|
|
end
|