From 07180bcd048ac99160ddd0be72433f4e80baf89c Mon Sep 17 00:00:00 2001 From: rgarcia Date: Thu, 27 Aug 2015 23:53:49 +0200 Subject: [PATCH] adds residence verification --- app/controllers/application_controller.rb | 6 +++ .../verification/residence_controller.rb | 31 +++++++++++++ app/models/residence.rb | 45 +++++++++++++++++++ .../verification/residence/_errors.html.erb | 12 +++++ app/views/verification/residence/new.html.erb | 19 ++++++++ 5 files changed, 113 insertions(+) create mode 100644 app/controllers/verification/residence_controller.rb create mode 100644 app/models/residence.rb create mode 100644 app/views/verification/residence/_errors.html.erb create mode 100644 app/views/verification/residence/new.html.erb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 802dda3bc..4b9e75c56 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -51,4 +51,10 @@ class ApplicationController < ActionController::Base redirect_to finish_signup_path end end + + def verify_resident! + unless current_user.residence_verified? + redirect_to new_residence_path, alert: t('verification.residence.alert.unconfirmed_residency') + end + end end diff --git a/app/controllers/verification/residence_controller.rb b/app/controllers/verification/residence_controller.rb new file mode 100644 index 000000000..107e0a1e0 --- /dev/null +++ b/app/controllers/verification/residence_controller.rb @@ -0,0 +1,31 @@ +class Verification::ResidenceController < ApplicationController + before_action :authenticate_user! + before_action :verify_attemps_left!, only: [:new, :create] + skip_authorization_check + + def new + @residence = Residence.new + end + + def create + @residence = Residence.new(residence_params.merge(user: current_user)) + if @residence.save + redirect_to verified_user_path, notice: t('verification.residence.create.flash.success') + else + current_user.update(residence_verification_tries: current_user.residence_verification_tries += 1) + render :new + end + end + + private + + def residence_params + params.require(:residence).permit(:document_number, :document_type, :date_of_birth, :postal_code) + end + + def verify_attemps_left! + if current_user.residence_verification_tries >= 5 + redirect_to account_path, alert: t('verification.residence.alert.verify_attemps_left') + end + end +end \ No newline at end of file diff --git a/app/models/residence.rb b/app/models/residence.rb new file mode 100644 index 000000000..b9610015e --- /dev/null +++ b/app/models/residence.rb @@ -0,0 +1,45 @@ +class Residence + include ActiveModel::Model + include ActiveModel::Dates + + attr_accessor :user, :document_number, :document_type, :date_of_birth, :postal_code + + validates_presence_of :document_number + validates_presence_of :document_type + validates_presence_of :date_of_birth + validates_presence_of :postal_code + + validates :postal_code, length: { is: 5 } + + validate :residence_in_madrid + validate :document_number_uniqueness + + def initialize(attrs={}) + self.date_of_birth = parse_date('date_of_birth', attrs) + attrs = remove_date('date_of_birth', attrs) + super + end + + def save + return false unless valid? + user.update(document_number: document_number, + document_type: document_type, + residence_verified_at: Time.now) + end + + def document_number_uniqueness + errors.add(:document_number, "Already in use") if User.where(document_number: document_number).any? + end + + def residence_in_madrid + return if errors.any? + + self.date_of_birth = date_to_string(date_of_birth) + + residency = UserApi.new(self) + errors.add(:residence_in_madrid, false) unless residency.valid? + + self.date_of_birth = string_to_date(date_of_birth) + end + +end \ No newline at end of file diff --git a/app/views/verification/residence/_errors.html.erb b/app/views/verification/residence/_errors.html.erb new file mode 100644 index 000000000..cc64d9fbc --- /dev/null +++ b/app/views/verification/residence/_errors.html.erb @@ -0,0 +1,12 @@ +<% if @residence.errors[:residence_in_madrid].present? %> + +
+ <%= t('verification.residence.new.error_verifying_census') %> + <%= mail_to "tec.gobiernoabierto@madrid.es" %> +
+ +<% else %> + <%= render 'shared/errors', + resource: @residence, + message: t('verification.residence.new.form_errors') %> +<% end %> \ No newline at end of file diff --git a/app/views/verification/residence/new.html.erb b/app/views/verification/residence/new.html.erb new file mode 100644 index 000000000..83e1b6f73 --- /dev/null +++ b/app/views/verification/residence/new.html.erb @@ -0,0 +1,19 @@ +
+
+ +

<%= t('verification.residence.new.title') %>

+ + <%= form_for @residence, url: residence_path do |f| %> + <%= render 'errors' %> + + <%= f.select :document_type, document_types, prompt: "" %> + <%= f.text_field :document_number %> + <%= f.date_select :date_of_birth, + prompt: true, + start_year: 1900, end_year: 16.years.ago.year %> + <%= f.text_field :postal_code %> + + <%= f.submit "Verify" %> + <% end %> +
+
\ No newline at end of file