68 changed files with 2365 additions and 219 deletions
@ -0,0 +1,43 @@
|
||||
class Form::Sales::Pages::RetirementValueCheck < Form::Sales::Pages::Person |
||||
def initialize(id, hsh, subsection, person_index:) |
||||
super |
||||
@depends_on = [ |
||||
{ |
||||
"person_#{person_index}_retired_under_soft_min_age?" => true, |
||||
"jointpur" => joint_purchase? ? 1 : 2, |
||||
}, |
||||
] |
||||
@person_index = person_index |
||||
@title_text = { |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_#{person_index}", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
} |
||||
@informative_text = { |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_#{person_index}", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_#{person_index}", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
} |
||||
end |
||||
|
||||
def questions |
||||
@questions ||= [ |
||||
Form::Sales::Questions::RetirementValueCheck.new(nil, nil, self, person_index: @person_index), |
||||
] |
||||
end |
||||
end |
@ -0,0 +1,24 @@
|
||||
class Form::Sales::Questions::RetirementValueCheck < ::Form::Question |
||||
def initialize(id, hsh, page, person_index:) |
||||
super(id, hsh, page) |
||||
@id = "retirement_value_check" |
||||
@check_answer_label = "Retirement confirmation" |
||||
@type = "interruption_screen" |
||||
@answer_options = { |
||||
"0" => { "value" => "Yes" }, |
||||
"1" => { "value" => "No" }, |
||||
} |
||||
@hidden_in_check_answers = { |
||||
"depends_on" => [ |
||||
{ |
||||
"retirement_value_check" => 0, |
||||
}, |
||||
{ |
||||
"retirement_value_check" => 1, |
||||
}, |
||||
], |
||||
} |
||||
@check_answers_card_number = person_index |
||||
@header = "Are you sure this person is retired?" |
||||
end |
||||
end |
@ -0,0 +1,58 @@
|
||||
require "csv" |
||||
|
||||
class BulkUpload::Lettings::CsvParser |
||||
attr_reader :path |
||||
|
||||
def initialize(path:) |
||||
@path = path |
||||
end |
||||
|
||||
def row_offset |
||||
with_headers? ? 5 : 0 |
||||
end |
||||
|
||||
def col_offset |
||||
with_headers? ? 1 : 0 |
||||
end |
||||
|
||||
def cols |
||||
@cols ||= ("A".."EE").to_a |
||||
end |
||||
|
||||
def row_parsers |
||||
@row_parsers ||= body_rows.map do |row| |
||||
stripped_row = row[col_offset..] |
||||
headers = ("field_1".."field_134").to_a |
||||
hash = Hash[headers.zip(stripped_row)] |
||||
|
||||
BulkUpload::Lettings::RowParser.new(hash) |
||||
end |
||||
end |
||||
|
||||
def body_rows |
||||
rows[row_offset..] |
||||
end |
||||
|
||||
def rows |
||||
@rows ||= CSV.parse(normalised_string, row_sep:) |
||||
end |
||||
|
||||
private |
||||
|
||||
def with_headers? |
||||
rows[0][0]&.match?(/\D+/) |
||||
end |
||||
|
||||
def row_sep |
||||
"\n" |
||||
end |
||||
|
||||
def normalised_string |
||||
return @normalised_string if @normalised_string |
||||
|
||||
@normalised_string = File.read(path) |
||||
@normalised_string.gsub!("\r\n", "\n") |
||||
|
||||
@normalised_string |
||||
end |
||||
end |
@ -0,0 +1,57 @@
|
||||
class BulkUpload::Lettings::LogCreator |
||||
attr_reader :bulk_upload, :path |
||||
|
||||
def initialize(bulk_upload:, path:) |
||||
@bulk_upload = bulk_upload |
||||
@path = path |
||||
end |
||||
|
||||
def call |
||||
row_parsers.each do |row_parser| |
||||
row_parser.valid? |
||||
|
||||
row_parser.log.blank_invalid_non_setup_fields! |
||||
row_parser.log.bulk_upload = bulk_upload |
||||
|
||||
begin |
||||
row_parser.log.save! |
||||
rescue StandardError => e |
||||
Sentry.capture_exception(e) |
||||
end |
||||
end |
||||
end |
||||
|
||||
private |
||||
|
||||
def csv_parser |
||||
@csv_parser ||= BulkUpload::Lettings::CsvParser.new(path:) |
||||
end |
||||
|
||||
def row_offset |
||||
csv_parser.row_offset |
||||
end |
||||
|
||||
def col_offset |
||||
csv_parser.col_offset |
||||
end |
||||
|
||||
def row_parsers |
||||
return @row_parsers if @row_parsers |
||||
|
||||
@row_parsers = csv_parser.row_parsers |
||||
|
||||
@row_parsers.each do |row_parser| |
||||
row_parser.bulk_upload = bulk_upload |
||||
end |
||||
|
||||
@row_parsers |
||||
end |
||||
|
||||
def body_rows |
||||
csv_parser.body_rows |
||||
end |
||||
|
||||
def rows |
||||
csv_parser.rows |
||||
end |
||||
end |
@ -0,0 +1,6 @@
|
||||
class AddBulkUploadToLogs < ActiveRecord::Migration[7.0] |
||||
def change |
||||
add_reference :lettings_logs, :bulk_upload |
||||
add_reference :sales_logs, :bulk_upload |
||||
end |
||||
end |
@ -0,0 +1,7 @@
|
||||
class AddRetirementValueCheckToSales < ActiveRecord::Migration[7.0] |
||||
def change |
||||
change_table :sales_logs, bulk: true do |t| |
||||
t.column :retirement_value_check, :integer |
||||
end |
||||
end |
||||
end |
Can't render this file because it has a wrong number of fields in line 72.
|
@ -0,0 +1,603 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe Form::Sales::Pages::RetirementValueCheck, type: :model do |
||||
subject(:page) { described_class.new(page_id, page_definition, subsection, person_index:) } |
||||
|
||||
let(:page_definition) { nil } |
||||
let(:subsection) { instance_double(Form::Subsection) } |
||||
let(:person_index) { 1 } |
||||
|
||||
let(:page_id) { "person_1_retirement_value_check" } |
||||
|
||||
it "has correct subsection" do |
||||
expect(page.subsection).to eq(subsection) |
||||
end |
||||
|
||||
it "has the correct header" do |
||||
expect(page.header).to be_nil |
||||
end |
||||
|
||||
it "has the correct description" do |
||||
expect(page.description).to be_nil |
||||
end |
||||
|
||||
context "with joint purchase" do |
||||
context "with person 1" do |
||||
let(:person_index) { 1 } |
||||
let(:page_id) { "person_1_retirement_value_check_joint_purchase" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_1_retirement_value_check_joint_purchase") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_1_retired_under_soft_min_age?" => true, "jointpur" => 1 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_1", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_1", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_1", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 2" do |
||||
let(:person_index) { 2 } |
||||
let(:page_id) { "person_2_retirement_value_check_joint_purchase" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_2_retirement_value_check_joint_purchase") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_2_retired_under_soft_min_age?" => true, "jointpur" => 1 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 3" do |
||||
let(:person_index) { 3 } |
||||
let(:page_id) { "person_3_retirement_value_check_joint_purchase" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_3_retirement_value_check_joint_purchase") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_3_retired_under_soft_min_age?" => true, "jointpur" => 1 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_3", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_3", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_3", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 4" do |
||||
let(:person_index) { 4 } |
||||
let(:page_id) { "person_4_retirement_value_check_joint_purchase" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_4_retirement_value_check_joint_purchase") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_4_retired_under_soft_min_age?" => true, "jointpur" => 1 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_4", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_4", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_4", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 5" do |
||||
let(:person_index) { 5 } |
||||
let(:page_id) { "person_5_retirement_value_check_joint_purchase" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_5_retirement_value_check_joint_purchase") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_5_retired_under_soft_min_age?" => true, "jointpur" => 1 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_5", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_5", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_5", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 6" do |
||||
let(:person_index) { 6 } |
||||
let(:page_id) { "person_6_retirement_value_check_joint_purchase" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_6_retirement_value_check_joint_purchase") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_6_retired_under_soft_min_age?" => true, "jointpur" => 1 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_6", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_6", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_6", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
end |
||||
|
||||
context "without joint purchase" do |
||||
context "with person 1" do |
||||
let(:person_index) { 1 } |
||||
let(:page_id) { "person_1_retirement_value_check" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_1_retirement_value_check") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_1_retired_under_soft_min_age?" => true, "jointpur" => 2 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_1", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_1", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_1", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 2" do |
||||
let(:person_index) { 2 } |
||||
let(:page_id) { "person_2_retirement_value_check" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_2_retirement_value_check") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_2_retired_under_soft_min_age?" => true, "jointpur" => 2 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 3" do |
||||
let(:person_index) { 2 } |
||||
let(:page_id) { "person_3_retirement_value_check" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_3_retirement_value_check") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_2_retired_under_soft_min_age?" => true, "jointpur" => 2 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_2", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 4" do |
||||
let(:person_index) { 3 } |
||||
let(:page_id) { "person_4_retirement_value_check" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_4_retirement_value_check") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_3_retired_under_soft_min_age?" => true, "jointpur" => 2 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_3", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_3", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_3", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 5" do |
||||
let(:person_index) { 4 } |
||||
let(:page_id) { "person_5_retirement_value_check" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_5_retirement_value_check") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_4_retired_under_soft_min_age?" => true, "jointpur" => 2 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_4", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_4", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_4", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
|
||||
context "with person 6" do |
||||
let(:person_index) { 5 } |
||||
let(:page_id) { "person_6_retirement_value_check" } |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[retirement_value_check]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("person_6_retirement_value_check") |
||||
end |
||||
|
||||
it "has correct depends_on" do |
||||
expect(page.depends_on).to eq([{ "person_5_retired_under_soft_min_age?" => true, "jointpur" => 2 }]) |
||||
end |
||||
|
||||
it "has correct title_text" do |
||||
expect(page.title_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.title", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "retirement_age_for_person_5", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
|
||||
it "has correct informative_text" do |
||||
expect(page.informative_text).to eq({ |
||||
"translation" => "soft_validations.retirement.min.hint_text", |
||||
"arguments" => [ |
||||
{ |
||||
"key" => "plural_gender_for_person_5", |
||||
"label" => false, |
||||
"i18n_template" => "gender", |
||||
}, |
||||
{ |
||||
"key" => "retirement_age_for_person_5", |
||||
"label" => false, |
||||
"i18n_template" => "age", |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,61 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe Form::Sales::Questions::RetirementValueCheck, type: :model do |
||||
subject(:question) { described_class.new(question_id, question_definition, page, person_index: 1) } |
||||
|
||||
let(:question_id) { nil } |
||||
let(:question_definition) { nil } |
||||
let(:page) { instance_double(Form::Page) } |
||||
|
||||
it "has correct page" do |
||||
expect(question.page).to eq(page) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(question.id).to eq("retirement_value_check") |
||||
end |
||||
|
||||
it "has the correct header" do |
||||
expect(question.header).to eq("Are you sure this person is retired?") |
||||
end |
||||
|
||||
it "has the correct check_answer_label" do |
||||
expect(question.check_answer_label).to eq("Retirement confirmation") |
||||
end |
||||
|
||||
it "has the correct type" do |
||||
expect(question.type).to eq("interruption_screen") |
||||
end |
||||
|
||||
it "is not marked as derived" do |
||||
expect(question.derived?).to be false |
||||
end |
||||
|
||||
it "has the correct hint" do |
||||
expect(question.hint_text).to be_nil |
||||
end |
||||
|
||||
it "has a correct check_answers_card_number" do |
||||
expect(question.check_answers_card_number).to eq(1) |
||||
end |
||||
|
||||
it "has the correct answer_options" do |
||||
expect(question.answer_options).to eq({ |
||||
"0" => { "value" => "Yes" }, |
||||
"1" => { "value" => "No" }, |
||||
}) |
||||
end |
||||
|
||||
it "has the correct hidden_in_check_answers" do |
||||
expect(question.hidden_in_check_answers).to eq({ |
||||
"depends_on" => [ |
||||
{ |
||||
"retirement_value_check" => 0, |
||||
}, |
||||
{ |
||||
"retirement_value_check" => 1, |
||||
}, |
||||
], |
||||
}) |
||||
end |
||||
end |
@ -0,0 +1,38 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe BulkUpload::Lettings::CsvParser do |
||||
subject(:service) { described_class.new(path:) } |
||||
|
||||
let(:path) { file_fixture("2022_23_lettings_bulk_upload.csv") } |
||||
|
||||
context "when parsing csv with headers" do |
||||
it "returns correct offsets" do |
||||
expect(service.row_offset).to eq(5) |
||||
expect(service.col_offset).to eq(1) |
||||
end |
||||
|
||||
it "parses csv correctly" do |
||||
expect(service.row_parsers[0].field_12).to eq(55) |
||||
end |
||||
end |
||||
|
||||
context "when parsing csv without headers" do |
||||
let(:file) { Tempfile.new } |
||||
let(:path) { file.path } |
||||
let(:log) { build(:lettings_log, :completed) } |
||||
|
||||
before do |
||||
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_csv_row) |
||||
file.rewind |
||||
end |
||||
|
||||
it "returns correct offsets" do |
||||
expect(service.row_offset).to eq(0) |
||||
expect(service.col_offset).to eq(0) |
||||
end |
||||
|
||||
it "parses csv correctly" do |
||||
expect(service.row_parsers[0].field_12).to eql(log.age1) |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,67 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe BulkUpload::Lettings::LogCreator do |
||||
subject(:service) { described_class.new(bulk_upload:, path:) } |
||||
|
||||
let(:owning_org) { create(:organisation, old_visible_id: 123) } |
||||
let(:user) { create(:user, organisation: owning_org) } |
||||
|
||||
let(:bulk_upload) { create(:bulk_upload, :lettings, user:) } |
||||
let(:path) { file_fixture("2022_23_lettings_bulk_upload.csv") } |
||||
|
||||
describe "#call" do |
||||
context "when a valid csv with new log" do |
||||
it "creates a new log" do |
||||
expect { service.call }.to change(LettingsLog, :count) |
||||
end |
||||
|
||||
it "associates log with bulk upload" do |
||||
service.call |
||||
|
||||
log = LettingsLog.last |
||||
expect(log.bulk_upload).to eql(bulk_upload) |
||||
expect(bulk_upload.lettings_logs).to include(log) |
||||
end |
||||
end |
||||
|
||||
context "when a valid csv with row with one invalid non setup field" do |
||||
let(:file) { Tempfile.new } |
||||
let(:path) { file.path } |
||||
let(:log) do |
||||
build( |
||||
:lettings_log, |
||||
:completed, |
||||
renttype: 3, |
||||
age1: 5, |
||||
owning_organisation: owning_org, |
||||
managing_organisation: owning_org, |
||||
national: 18, |
||||
waityear: 9, |
||||
joint: 2, |
||||
tenancy: 9, |
||||
ppcodenk: 0, |
||||
) |
||||
end |
||||
|
||||
before do |
||||
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_csv_row) |
||||
file.rewind |
||||
end |
||||
|
||||
it "creates the log" do |
||||
expect { service.call }.to change(LettingsLog, :count).by(1) |
||||
end |
||||
|
||||
it "blanks invalid field" do |
||||
service.call |
||||
|
||||
record = LettingsLog.last |
||||
expect(record.age1).to be_blank |
||||
end |
||||
end |
||||
|
||||
context "when valid csv with existing log" do |
||||
xit "what should happen?" |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,256 @@
|
||||
class BulkUpload::LogToCsv |
||||
attr_reader :log, :line_ending, :col_offset |
||||
|
||||
def initialize(log:, line_ending: "\n", col_offset: 1) |
||||
@log = log |
||||
@line_ending = line_ending |
||||
@col_offset = col_offset |
||||
end |
||||
|
||||
def to_csv_row |
||||
[ |
||||
[nil] * col_offset, # 0 |
||||
log.renttype, # 1 |
||||
nil, |
||||
nil, |
||||
log.scheme&.old_visible_id, |
||||
log.location&.old_visible_id, |
||||
nil, |
||||
log.tenancycode, |
||||
log.startertenancy, |
||||
log.tenancy, |
||||
log.tenancyother, # 10 |
||||
log.tenancylength, |
||||
log.age1, |
||||
log.age2, |
||||
log.age3, |
||||
log.age4, |
||||
log.age5, |
||||
log.age6, |
||||
log.age7, |
||||
log.age8, |
||||
|
||||
log.sex1, # 20 |
||||
log.sex2, |
||||
log.sex3, |
||||
log.sex4, |
||||
log.sex5, |
||||
log.sex6, |
||||
log.sex7, |
||||
log.sex8, |
||||
|
||||
log.relat2, |
||||
log.relat3, |
||||
log.relat4, # 30 |
||||
log.relat5, |
||||
log.relat6, |
||||
log.relat7, |
||||
log.relat8, |
||||
|
||||
log.ecstat1, |
||||
log.ecstat2, |
||||
log.ecstat3, |
||||
log.ecstat4, |
||||
log.ecstat5, |
||||
log.ecstat6, # 40 |
||||
log.ecstat7, |
||||
log.ecstat8, |
||||
|
||||
log.ethnic, |
||||
log.national, |
||||
log.armedforces, |
||||
log.reservist, |
||||
log.preg_occ, |
||||
log.hb, |
||||
log.benefits, |
||||
log.earnings, # 50 |
||||
net_income_known, |
||||
nil, |
||||
log.reasonother, |
||||
nil, |
||||
nil, |
||||
nil, |
||||
nil, |
||||
nil, |
||||
nil, |
||||
nil, # 60 |
||||
log.prevten, |
||||
log.prevloc, |
||||
((log.ppostcode_full || "").split(" ") || [""]).first, |
||||
((log.ppostcode_full || "").split(" ") || [""]).last, |
||||
previous_postcode_known, |
||||
log.layear, |
||||
log.waityear, |
||||
homeless, |
||||
log.reasonpref, |
||||
log.rp_homeless, # 70 |
||||
log.rp_insan_unsat, |
||||
log.rp_medwel, |
||||
log.rp_hardship, |
||||
log.rp_dontknow, |
||||
cbl, |
||||
chr, |
||||
cap, |
||||
log.referral, |
||||
log.period, |
||||
|
||||
log.brent, # 80 |
||||
log.scharge, |
||||
log.pscharge, |
||||
log.supcharg, |
||||
log.tcharge, |
||||
log.chcharge, |
||||
log.household_charge, |
||||
log.hbrentshortfall, |
||||
log.tshortfall, |
||||
log.voiddate&.day, |
||||
|
||||
log.voiddate&.month, # 90 |
||||
log.voiddate&.strftime("%y"), |
||||
log.mrcdate&.day, |
||||
log.mrcdate&.month, |
||||
log.mrcdate&.strftime("%y"), |
||||
nil, |
||||
log.startdate&.day, |
||||
log.startdate&.month, |
||||
log.startdate&.strftime("%y"), |
||||
log.offered, |
||||
|
||||
log.propcode, # 100 |
||||
log.beds, |
||||
log.unittype_gn, |
||||
log.builtype, |
||||
log.wchair, |
||||
log.unitletas, |
||||
log.rsnvac, |
||||
log.la, |
||||
((log.postcode_full || "").split(" ") || [""]).first, |
||||
((log.postcode_full || "").split(" ") || [""]).last, |
||||
|
||||
nil, # 110 |
||||
log.owning_organisation&.old_visible_id, |
||||
nil, |
||||
log.managing_organisation&.old_visible_id, |
||||
leftreg, |
||||
nil, |
||||
log.incfreq, |
||||
log.sheltered, |
||||
log.illness, |
||||
log.illness_type_1, |
||||
|
||||
log.illness_type_2, # 120 |
||||
log.illness_type_3, |
||||
log.illness_type_4, |
||||
log.illness_type_5, |
||||
log.illness_type_6, |
||||
log.illness_type_7, |
||||
log.illness_type_8, |
||||
log.illness_type_9, |
||||
log.illness_type_10, |
||||
london_affordable_rent, |
||||
|
||||
intermediate_rent_type, # 130 |
||||
log.irproduct_other, |
||||
log.declaration, |
||||
log.joint, |
||||
renewal, |
||||
line_ending, |
||||
].flatten.join(",") |
||||
end |
||||
|
||||
def renewal |
||||
case log.renewal |
||||
when 1 |
||||
1 |
||||
when 0 |
||||
2 |
||||
end |
||||
end |
||||
|
||||
def london_affordable_rent |
||||
case log.renttype |
||||
when Imports::LettingsLogsImportService::RENT_TYPE[:london_affordable_rent] |
||||
1 |
||||
end |
||||
end |
||||
|
||||
def intermediate_rent_type |
||||
case log.renttype |
||||
when Imports::LettingsLogsImportService::RENT_TYPE[:rent_to_buy] |
||||
1 |
||||
when Imports::LettingsLogsImportService::RENT_TYPE[:london_living_rent] |
||||
2 |
||||
when Imports::LettingsLogsImportService::RENT_TYPE[:other_intermediate_rent_product] |
||||
3 |
||||
end |
||||
end |
||||
|
||||
def leftreg |
||||
case log.leftreg |
||||
when 3 |
||||
3 |
||||
when 1 |
||||
4 |
||||
when 2 |
||||
5 |
||||
when 0 |
||||
6 |
||||
end |
||||
end |
||||
|
||||
def net_income_known |
||||
case log.net_income_known |
||||
when 0 |
||||
1 |
||||
when 1 |
||||
2 |
||||
when 2 |
||||
4 |
||||
end |
||||
end |
||||
|
||||
def previous_postcode_known |
||||
case log.ppcodenk |
||||
when 1 |
||||
1 |
||||
when 0 |
||||
2 |
||||
end |
||||
end |
||||
|
||||
def homeless |
||||
case log.homeless |
||||
when 1 |
||||
1 |
||||
when 11 |
||||
12 |
||||
end |
||||
end |
||||
|
||||
def cbl |
||||
case log.cbl |
||||
when 0 |
||||
2 |
||||
when 1 |
||||
1 |
||||
end |
||||
end |
||||
|
||||
def chr |
||||
case log.chr |
||||
when 0 |
||||
2 |
||||
when 1 |
||||
1 |
||||
end |
||||
end |
||||
|
||||
def cap |
||||
case log.cap |
||||
when 0 |
||||
2 |
||||
when 1 |
||||
1 |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue