diff --git a/app/controllers/verification/letter_controller.rb b/app/controllers/verification/letter_controller.rb index 152590b20..e302a1bc6 100644 --- a/app/controllers/verification/letter_controller.rb +++ b/app/controllers/verification/letter_controller.rb @@ -1,7 +1,7 @@ class Verification::LetterController < ApplicationController before_action :authenticate_user! before_action :verify_resident! - before_action :verify_phone_or_email! + before_action :verify_phone! skip_authorization_check def new @@ -11,20 +11,35 @@ class Verification::LetterController < ApplicationController def create @letter = Verification::Letter.new(user: current_user) if @letter.save - redirect_to account_path, notice: t('verification.letter.create.flash.success') + redirect_to edit_letter_path, notice: t('verification.letter.create.flash.success') else flash.now.alert = t('verification.letter.create.alert.failure') render :new end end + def edit + @letter = Verification::Letter.new(user: current_user) + end + + def update + @letter = Verification::Letter.new(letter_params.merge(user: current_user)) + if @letter.verify? + current_user.update(verified_at: Time.now) + redirect_to account_path, notice: t('verification.letter.update.flash.success') + else + @error = t('verification.letter.update.error') + render :edit + end + end + private def letter_params - params.require(:letter).permit() + params.require(:letter).permit(:verification_code) end - def verify_phone_or_email! + def verify_phone! unless current_user.confirmed_phone? redirect_to verified_user_path, alert: t('verification.letter.alert.unconfirmed_code') end diff --git a/app/models/verification/letter.rb b/app/models/verification/letter.rb index 566fe1fd7..077890600 100644 --- a/app/models/verification/letter.rb +++ b/app/models/verification/letter.rb @@ -1,16 +1,12 @@ class Verification::Letter include ActiveModel::Model - attr_accessor :user, :address + attr_accessor :user, :address, :verification_code validates :user, presence: true validates :address, presence: true validate :correct_address - def initialize(attrs={}) - @user = attrs[:user] - end - def save valid? && letter_requested! && @@ -22,7 +18,11 @@ class Verification::Letter end def letter_requested! - user.update(letter_requested_at: Time.now) + user.update(letter_requested_at: Time.now, letter_verification_code: four_digit_code) + end + + def verify? + user.letter_verification_code == verification_code end def update_user_address @@ -50,4 +50,8 @@ class Verification::Letter district: address[:nombre_distrito] } end + def four_digit_code + rand.to_s[2..5] + end + end diff --git a/app/views/verification/letter/edit.html.erb b/app/views/verification/letter/edit.html.erb new file mode 100644 index 000000000..56b76caa5 --- /dev/null +++ b/app/views/verification/letter/edit.html.erb @@ -0,0 +1,37 @@ +
+
+ +
+
+ <%= t("verification.step_1") %> +
+
+ <%= t("verification.step_2") %> +
+
+ <%= t("verification.step_3") %> +
+ +
+ +
+
+ +
+ +

<%= t("verification.letter.edit.title") %>

+ +
+ <%= form_for @letter, as: "letter", url: letter_path, method: :put do |f| %> + <% if @error %> +
<%= @error %>
+ <% end %> + + <%= f.text_field :verification_code, label: t("verification.letter.edit.confirmation_code") %> + <%= f.submit t("verification.letter.new.send_code"), class: "button radius success" %> + <% end %> +
+ +
+
+
\ No newline at end of file diff --git a/app/views/verification/letter/new.html.erb b/app/views/verification/letter/new.html.erb index 850ec75bf..33b1f97cd 100644 --- a/app/views/verification/letter/new.html.erb +++ b/app/views/verification/letter/new.html.erb @@ -28,22 +28,9 @@ %> <%= form_for @letter, as: "letter", url: letter_path do |f| %> - <%= render "shared/errors", resource: @letter %> <%= f.submit t("verification.letter.new.send_letter"), class: "button radius secondary inline-block" %> <% end %> - -
- Gracias por solicitar tu código de máxima seguridad, en unos días te lo enviaremos a la dirección que figura en tus datos del padrón. Recuerda que puedes ahorrar el envío recogiendo tu código en cualquiera de las Oficinas de Atención al Ciudadano. -
-
- <%= form_tag do %> - <%= label_tag t("verification.letter.new.introduce_code") %> - <%= text_field_tag(:q) %> - <%= submit_tag t("verification.letter.new.send_code"), class: "button radius success" %> - <% end %> -
- diff --git a/config/locales/en.yml b/config/locales/en.yml index 510e9d089..f62323591 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -59,7 +59,7 @@ en: accept_terms: I accept the privacy policy and the legal terms user: account debate: debate - sms: phone + verification::sms: phone application: alert: only_beta_testers: "Sorry only Beta Testers are allowed access at the moment" diff --git a/config/locales/es.yml b/config/locales/es.yml index 783b1c56b..9ab30d2ef 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -59,7 +59,7 @@ es: accept_terms: Acepto la política de privacidad y el aviso legal user: la cuenta debate: el debate - sms: el teléfono + verification::sms: el teléfono application: alert: only_beta_testers: "Lo sentimos sólo los usuarios de pruebas tienen acceso de momento" diff --git a/config/locales/verification.en.yml b/config/locales/verification.en.yml index 6ee9fd26e..1588d3713 100644 --- a/config/locales/verification.en.yml +++ b/config/locales/verification.en.yml @@ -67,13 +67,19 @@ en: offices: "See Office of Citizen" offices_url: "http://www.madrid.es/portales/munimadrid/es/Inicio/El-Ayuntamiento/Atencion-al-ciudadano/Oficinas-de-Atencion-al-Ciudadano?vgnextfmt=default&vgnextchannel=5b99cde2e09a4310VgnVCM1000000b205a0aRCRD" send_letter: "Send me a letter with the code" - introduce_code: "Enter the security code" send_code: "Send" create: flash: - success: "Thank you for requesting a code maximum security in a few days we will send it to the address on your census data. Remember that you can save shipping collecting your code in any of the Office of Citizen Services." + success: "Thank you for requesting a maximum security code in a few days we will send it to the address on your census data. Remember that you can save shipping collecting your code in any of the Office of Citizen Services." alert: failure: "We could not verify your address with the Census please try again later" + edit: + title: "Security code confirmation" + confirmation_code: "Enter the security code in your letter" + update: + error: "Incorrect confirmation code" + flash: + success: "Correct code. Your account is verified" alert: unconfirmed_code: "You have not yet enter the confirmation code" verified_user: diff --git a/config/locales/verification.es.yml b/config/locales/verification.es.yml index 29f61621c..5da534899 100644 --- a/config/locales/verification.es.yml +++ b/config/locales/verification.es.yml @@ -67,13 +67,19 @@ es: offices: "Ver Oficinas de Atención al Ciudadano" offices_url: "http://www.madrid.es/portales/munimadrid/es/Inicio/El-Ayuntamiento/Atencion-al-ciudadano/Oficinas-de-Atencion-al-Ciudadano?vgnextfmt=default&vgnextchannel=5b99cde2e09a4310VgnVCM1000000b205a0aRCRD" send_letter: "Enviarme una carta con el código" - introduce_code: "Introduce el código de seguridad" send_code: "Enviar" create: flash: success: "Gracias por solicitar tu código de máxima seguridad, en unos días te lo enviaremos a la dirección que figura en tus datos del padrón. Recuerda que puedes ahorrar el envío recogiendo tu código en cualquiera de las Oficinas de Atención al Ciudadano." alert: failure: "No podemos verificar tu dirección con el Padrón, por favor inténtalo otra vez más tarde" + edit: + title: "Confirmación de código de seguridad" + confirmation_code: "Introduce el código que has recibido en tu carta" + update: + error: "Código de verificación incorrecto" + flash: + success: "Código correcto. Tu cuenta ya está verificada" alert: unconfirmed_code: "Todavía no has introducido el código de confirmación" verified_user: diff --git a/config/routes.rb b/config/routes.rb index 3bef1e3d9..98c88894d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -48,7 +48,7 @@ Rails.application.routes.draw do resource :sms, controller: "sms", only: [:new, :create, :edit, :update] resource :verified_user, controller: "verified_user", only: [:show] resource :email, controller: "email", only: [:new, :show, :create] - resource :letter, controller: "letter", only: [:new, :create] + resource :letter, controller: "letter", only: [:new, :create, :edit, :update] end namespace :admin do diff --git a/db/migrate/20150902191315_add_letter_verification_code_to_users.rb b/db/migrate/20150902191315_add_letter_verification_code_to_users.rb new file mode 100644 index 000000000..83142122e --- /dev/null +++ b/db/migrate/20150902191315_add_letter_verification_code_to_users.rb @@ -0,0 +1,5 @@ +class AddLetterVerificationCodeToUsers < ActiveRecord::Migration + def change + add_column :users, :letter_verification_code, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 883d2a7e1..ae7bc6e44 100644 --- a/db/schema.rb +++ b/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: 20150830212600) do +ActiveRecord::Schema.define(version: 20150902191315) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -67,8 +67,8 @@ ActiveRecord::Schema.define(version: 20150830212600) do t.integer "rgt" t.datetime "created_at" t.datetime "updated_at" - t.integer "children_count", default: 0 t.datetime "hidden_at" + t.integer "children_count", default: 0 t.integer "flags_count", default: 0 t.datetime "ignored_flag_at" t.integer "moderator_id" @@ -92,8 +92,8 @@ ActiveRecord::Schema.define(version: 20150830212600) do t.integer "author_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.datetime "hidden_at" t.string "visit_id" + t.datetime "hidden_at" t.integer "flags_count", default: 0 t.datetime "ignored_flag_at" t.integer "cached_votes_total", default: 0 @@ -200,13 +200,12 @@ ActiveRecord::Schema.define(version: 20150830212600) do t.string "unconfirmed_email" t.boolean "email_on_debate_comment", default: false t.boolean "email_on_comment_reply", default: false + t.string "phone_number", limit: 30 t.string "official_position" t.integer "official_level", default: 0 t.datetime "hidden_at" - t.string "phone_number", limit: 30 - t.string "username" - t.datetime "confirmed_hide_at" t.string "sms_confirmation_code" + t.string "username" t.string "document_number" t.string "document_type" t.datetime "residence_verified_at" @@ -218,6 +217,8 @@ ActiveRecord::Schema.define(version: 20150830212600) do t.string "unconfirmed_phone" t.string "confirmed_phone" t.datetime "letter_requested_at" + t.datetime "confirmed_hide_at" + t.string "letter_verification_code" end add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree diff --git a/spec/features/verification/letter_spec.rb b/spec/features/verification/letter_spec.rb index 9a462feaf..a065edfc0 100644 --- a/spec/features/verification/letter_spec.rb +++ b/spec/features/verification/letter_spec.rb @@ -2,15 +2,45 @@ require 'rails_helper' feature 'Verify Letter' do - scenario 'Send letter level 2 verified with phone' do + scenario 'Verify' do user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111") login_as(user) visit new_letter_path - click_button "Send me a letter" + click_button "Send me a letter with the code" - expect(page).to have_content "Thank you for requesting a code maximum security in a few days we will send it to the address on your census data. Remember that you can save shipping collecting your code in any of the Office of Citizen Services." + expect(page).to have_content "Thank you for requesting a maximum security code in a few days we will send it to the address on your census data." + + user.reload + fill_in "letter_verification_code", with: user.letter_verification_code + click_button "Send" + + expect(page).to have_content "Correct code. Your account is verified" + end + + scenario 'Go to office instead of send letter' do + user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111") + + login_as(user) + visit new_letter_path + + expect(page).to have_link "Office of Citizen", href: "http://www.madrid.es/portales/munimadrid/es/Inicio/El-Ayuntamiento/Atencion-al-ciudadano/Oficinas-de-Atencion-al-Ciudadano?vgnextfmt=default&vgnextchannel=5b99cde2e09a4310VgnVCM1000000b205a0aRCRD" + end + + scenario 'Errors on verification code' do + user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111") + + login_as(user) + visit new_letter_path + + click_button "Send me a letter with the code" + expect(page).to have_content "Thank you for requesting a maximum security code in a few days we will send it to the address on your census data." + + fill_in "letter_verification_code", with: "1" + click_button "Send" + + expect(page).to have_content "Incorrect confirmation code" end scenario "Error accessing address from CensusApi" do @@ -26,17 +56,6 @@ feature 'Verify Letter' do expect(page).to have_content "We could not verify your address with the Census please try again later" end - scenario 'Send letter level 2 user verified with email' do - user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111") - - login_as(user) - visit new_letter_path - - click_button "Send me a letter" - - expect(page).to have_content "Thank you for requesting a code maximum security in a few days we will send it to the address on your census data. Remember that you can save shipping collecting your code in any of the Office of Citizen Services." - end - scenario "Deny access unless verified residence" do user = create(:user) diff --git a/spec/features/verification/level_three_verification_spec.rb b/spec/features/verification/level_three_verification_spec.rb index 112fd859b..93f60c175 100644 --- a/spec/features/verification/level_three_verification_spec.rb +++ b/spec/features/verification/level_three_verification_spec.rb @@ -26,8 +26,6 @@ feature 'Level three verification' do fill_in 'sms_confirmation_code', with: user.sms_confirmation_code click_button 'Send' - expect(page).to have_content 'Correct code' - expect(page).to have_content "Correct code. Your account is verified" expect(page).to_not have_link "Verify my account" @@ -85,8 +83,14 @@ feature 'Level three verification' do expect(page).to have_content 'Correct code' - click_button "Send me a letter" + click_button "Send me a letter with the code" - expect(page).to have_content "Thank you for requesting a code maximum security in a few days we will send it to the address on your census data. Remember that you can save shipping collecting your code in any of the Office of Citizen Services." + expect(page).to have_content "Thank you for requesting a maximum security code in a few days we will send it to the address on your census data." + + user.reload + fill_in "letter_verification_code", with: user.letter_verification_code + click_button "Send" + + expect(page).to have_content "Correct code. Your account is verified" end end \ No newline at end of file