Browse Source
* CLDC-4173: add new buildheightclass db changes * CLDC-4173: add new buildheightclass page and question * CLDC-4173: add new buildheightclass bu and export updates * CLDC-4173: update tests * CLDC-4173: update var defs * CLDC-4173: add sales csv export tests for 26 including buildheightclass * CLDC-4173: add sales csv export tests for 25 and 26 including buildheightclass * CLDC-4173: update sales export spec * CLDC-4173: update sales export spec and make sales log csv service future-proof * CLDC-4173: add missing sales log export fixtures and tests * CLDC-4173: date refactoring in tests * CLDC-4173: date refactoring in tests * CLDC-4173: schema updates * CLDC-4173: test date updatespull/3205/head
26 changed files with 687 additions and 56 deletions
@ -0,0 +1,17 @@
|
||||
class Form::Sales::Pages::BuildingHeightClass < ::Form::Page |
||||
def initialize(id, hsh, subsection) |
||||
super |
||||
@id = "building_height_class" |
||||
@depends_on = [ |
||||
{ "proptype" => 1 }, |
||||
{ "proptype" => 2 }, |
||||
{ "proptype" => 9 }, |
||||
] |
||||
end |
||||
|
||||
def questions |
||||
@questions ||= [ |
||||
Form::Sales::Questions::BuildingHeightClass.new(nil, nil, self), |
||||
] |
||||
end |
||||
end |
||||
@ -0,0 +1,17 @@
|
||||
class Form::Sales::Questions::BuildingHeightClass < ::Form::Question |
||||
def initialize(id, hsh, page) |
||||
super |
||||
@id = "buildheightclass" |
||||
@type = "radio" |
||||
@answer_options = ANSWER_OPTIONS |
||||
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] |
||||
end |
||||
|
||||
ANSWER_OPTIONS = { |
||||
"1" => { "value" => "High-rise" }, |
||||
"2" => { "value" => "Low-rise" }, |
||||
"3" => { "value" => "Don't know" }, |
||||
}.freeze |
||||
|
||||
QUESTION_NUMBER_FROM_YEAR = { 2026 => 17 }.freeze |
||||
end |
||||
@ -0,0 +1,5 @@
|
||||
class AddBuildheightclassToSalesLogs < ActiveRecord::Migration[7.2] |
||||
def change |
||||
add_column :sales_logs, :buildheightclass, :integer |
||||
end |
||||
end |
||||
@ -0,0 +1,154 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<forms> |
||||
<form> |
||||
<ID>{id}</ID> |
||||
<STATUS>1</STATUS> |
||||
<PURCHID>123</PURCHID> |
||||
<TYPE>8</TYPE> |
||||
<JOINTMORE>1</JOINTMORE> |
||||
<BEDS>2</BEDS> |
||||
<AGE1>27</AGE1> |
||||
<SEX1>F</SEX1> |
||||
<ETHNIC>17</ETHNIC> |
||||
<BUILTYPE>1</BUILTYPE> |
||||
<PROPTYPE>1</PROPTYPE> |
||||
<AGE2>33</AGE2> |
||||
<RELAT2>P</RELAT2> |
||||
<SEX2>X</SEX2> |
||||
<NOINT>2</NOINT> |
||||
<ECSTAT2>1</ECSTAT2> |
||||
<PRIVACYNOTICE>1</PRIVACYNOTICE> |
||||
<ECSTAT1>1</ECSTAT1> |
||||
<WHEEL>1</WHEEL> |
||||
<HHOLDCOUNT>4</HHOLDCOUNT> |
||||
<AGE3>14</AGE3> |
||||
<LA>E09000033</LA> |
||||
<INCOME1>10000</INCOME1> |
||||
<AGE4>18</AGE4> |
||||
<AGE5>40</AGE5> |
||||
<AGE6>40</AGE6> |
||||
<INC1MORT>1</INC1MORT> |
||||
<INCOME2>10000</INCOME2> |
||||
<SAVINGSNK>1</SAVINGSNK> |
||||
<SAVINGS/> |
||||
<PREVOWN>1</PREVOWN> |
||||
<SEX3>F</SEX3> |
||||
<MORTGAGE>20000.0</MORTGAGE> |
||||
<INC2MORT>1</INC2MORT> |
||||
<ECSTAT3>9</ECSTAT3> |
||||
<ECSTAT4>3</ECSTAT4> |
||||
<ECSTAT5>2</ECSTAT5> |
||||
<ECSTAT6>1</ECSTAT6> |
||||
<RELAT3>X</RELAT3> |
||||
<RELAT4>X</RELAT4> |
||||
<RELAT5>R</RELAT5> |
||||
<RELAT6>R</RELAT6> |
||||
<HB>4</HB> |
||||
<SEX4>X</SEX4> |
||||
<SEX5>M</SEX5> |
||||
<SEX6>X</SEX6> |
||||
<FROMBEDS/> |
||||
<STAIRCASE/> |
||||
<STAIRBOUGHT/> |
||||
<STAIROWNED/> |
||||
<MRENT/> |
||||
<RESALE/> |
||||
<DEPOSIT>80000.0</DEPOSIT> |
||||
<CASHDIS/> |
||||
<DISABLED>1</DISABLED> |
||||
<VALUE>110000.0</VALUE> |
||||
<EQUITY/> |
||||
<DISCOUNT/> |
||||
<GRANT>10000.0</GRANT> |
||||
<PPCODENK>0</PPCODENK> |
||||
<PPOSTC1>SW1A</PPOSTC1> |
||||
<PPOSTC2>1AA</PPOSTC2> |
||||
<PREVLOC>E09000033</PREVLOC> |
||||
<HHREGRES>7</HHREGRES> |
||||
<HHREGRESSTILL/> |
||||
<PROPLEN/> |
||||
<MSCHARGE>100.0</MSCHARGE> |
||||
<PREVTEN>1</PREVTEN> |
||||
<MORTGAGEUSED>1</MORTGAGEUSED> |
||||
<WCHAIR>1</WCHAIR> |
||||
<ARMEDFORCESSPOUSE>5</ARMEDFORCESSPOUSE> |
||||
<HODAY/> |
||||
<HOMONTH/> |
||||
<HOYEAR/> |
||||
<FROMPROP/> |
||||
<SOCPREVTEN/> |
||||
<EXTRABOR>1</EXTRABOR> |
||||
<HHTYPE>6</HHTYPE> |
||||
<VALUE_VALUE_CHECK/> |
||||
<PREVSHARED>2</PREVSHARED> |
||||
<BUY2LIVING>3</BUY2LIVING> |
||||
<UPRN/> |
||||
<COUNTY/> |
||||
<ADDRESS_SEARCH_VALUE_CHECK/> |
||||
<FIRSTSTAIR/> |
||||
<NUMSTAIR/> |
||||
<MRENTPRESTAIRCASING/> |
||||
<DAY>1</DAY> |
||||
<MONTH>4</MONTH> |
||||
<YEAR>2025</YEAR> |
||||
<CREATEDDATE>2025-04-01T00:00:00+01:00</CREATEDDATE> |
||||
<CREATEDBY>{created_by_email}</CREATEDBY> |
||||
<CREATEDBYID>{created_by_id}</CREATEDBYID> |
||||
<USERNAME>{assigned_to_email}</USERNAME> |
||||
<USERNAMEID>{assigned_to_id}</USERNAMEID> |
||||
<UPLOADDATE>2025-04-01T00:00:00+01:00</UPLOADDATE> |
||||
<AMENDEDBY/> |
||||
<AMENDEDBYID/> |
||||
<OWNINGORGID>{owning_org_id}</OWNINGORGID> |
||||
<OWNINGORGNAME>{owning_org_name}</OWNINGORGNAME> |
||||
<MANINGORGID>{managing_org_id}</MANINGORGID> |
||||
<MANINGORGNAME>{managing_org_name}</MANINGORGNAME> |
||||
<CREATIONMETHOD>1</CREATIONMETHOD> |
||||
<BULKUPLOADID/> |
||||
<COLLECTIONYEAR>2025</COLLECTIONYEAR> |
||||
<OWNERSHIP>2</OWNERSHIP> |
||||
<JOINT>1</JOINT> |
||||
<ETHNICGROUP1>17</ETHNICGROUP1> |
||||
<ETHNICGROUP2>17</ETHNICGROUP2> |
||||
<PREVIOUSLAKNOWN>1</PREVIOUSLAKNOWN> |
||||
<HASMSCHARGE>1</HASMSCHARGE> |
||||
<HASSERVICECHARGES/> |
||||
<SERVICECHARGES/> |
||||
<INC1NK>0</INC1NK> |
||||
<INC2NK>0</INC2NK> |
||||
<POSTCODE>SW1A 1AA</POSTCODE> |
||||
<ISLAINFERRED>true</ISLAINFERRED> |
||||
<MORTLEN1>10</MORTLEN1> |
||||
<ETHNIC2/> |
||||
<PREVTEN2/> |
||||
<ADDRESS1>Address line 1</ADDRESS1> |
||||
<ADDRESS2/> |
||||
<TOWNCITY>City</TOWNCITY> |
||||
<LANAME>Westminster</LANAME> |
||||
<ADDRESS1INPUT>Address line 1</ADDRESS1INPUT> |
||||
<POSTCODEINPUT>SW1A 1AA</POSTCODEINPUT> |
||||
<UPRNSELECTED/> |
||||
<BULKADDRESS1/> |
||||
<BULKADDRESS2/> |
||||
<BULKTOWNCITY/> |
||||
<BULKCOUNTY/> |
||||
<BULKPOSTCODE/> |
||||
<BULKLA/> |
||||
<NATIONALITYALL1>826</NATIONALITYALL1> |
||||
<NATIONALITYALL2>826</NATIONALITYALL2> |
||||
<PREVLOCNAME>Westminster</PREVLOCNAME> |
||||
<LIVEINBUYER1>1</LIVEINBUYER1> |
||||
<LIVEINBUYER2>1</LIVEINBUYER2> |
||||
<HASESTATEFEE/> |
||||
<ESTATEFEE/> |
||||
<STAIRLASTDAY/> |
||||
<STAIRLASTMONTH/> |
||||
<STAIRLASTYEAR/> |
||||
<STAIRINITIALDAY/> |
||||
<STAIRINITIALMONTH/> |
||||
<STAIRINITIALYEAR/> |
||||
<MSCHARGE_VALUE_CHECK/> |
||||
<DUPLICATESET/> |
||||
<STAIRCASETOSALE/> |
||||
</form> |
||||
</forms> |
||||
@ -0,0 +1,161 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<forms> |
||||
<form> |
||||
<ID>{id}</ID> |
||||
<STATUS>1</STATUS> |
||||
<PURCHID>123</PURCHID> |
||||
<TYPE>8</TYPE> |
||||
<JOINTMORE>1</JOINTMORE> |
||||
<BEDS>2</BEDS> |
||||
<AGE1>27</AGE1> |
||||
<SEX1>F</SEX1> |
||||
<ETHNIC>17</ETHNIC> |
||||
<BUILTYPE>1</BUILTYPE> |
||||
<PROPTYPE>1</PROPTYPE> |
||||
<AGE2>33</AGE2> |
||||
<RELAT2>P</RELAT2> |
||||
<SEX2>X</SEX2> |
||||
<NOINT>2</NOINT> |
||||
<ECSTAT2>1</ECSTAT2> |
||||
<PRIVACYNOTICE>1</PRIVACYNOTICE> |
||||
<ECSTAT1>1</ECSTAT1> |
||||
<WHEEL>1</WHEEL> |
||||
<HHOLDCOUNT>4</HHOLDCOUNT> |
||||
<AGE3>14</AGE3> |
||||
<LA>E09000033</LA> |
||||
<INCOME1>10000</INCOME1> |
||||
<AGE4>18</AGE4> |
||||
<AGE5>40</AGE5> |
||||
<AGE6>40</AGE6> |
||||
<INC1MORT>1</INC1MORT> |
||||
<INCOME2>10000</INCOME2> |
||||
<SAVINGSNK>1</SAVINGSNK> |
||||
<SAVINGS/> |
||||
<PREVOWN>1</PREVOWN> |
||||
<SEX3>F</SEX3> |
||||
<MORTGAGE>20000.0</MORTGAGE> |
||||
<INC2MORT>1</INC2MORT> |
||||
<ECSTAT3>9</ECSTAT3> |
||||
<ECSTAT4>3</ECSTAT4> |
||||
<ECSTAT5>2</ECSTAT5> |
||||
<ECSTAT6>1</ECSTAT6> |
||||
<RELAT3>X</RELAT3> |
||||
<RELAT4>X</RELAT4> |
||||
<RELAT5>R</RELAT5> |
||||
<RELAT6>R</RELAT6> |
||||
<HB>4</HB> |
||||
<SEX4>X</SEX4> |
||||
<SEX5>M</SEX5> |
||||
<SEX6>X</SEX6> |
||||
<FROMBEDS/> |
||||
<STAIRCASE/> |
||||
<STAIRBOUGHT/> |
||||
<STAIROWNED/> |
||||
<MRENT/> |
||||
<RESALE/> |
||||
<DEPOSIT>80000.0</DEPOSIT> |
||||
<CASHDIS/> |
||||
<DISABLED>1</DISABLED> |
||||
<VALUE>110000.0</VALUE> |
||||
<EQUITY/> |
||||
<DISCOUNT/> |
||||
<GRANT>10000.0</GRANT> |
||||
<PPCODENK>0</PPCODENK> |
||||
<PPOSTC1>SW1A</PPOSTC1> |
||||
<PPOSTC2>1AA</PPOSTC2> |
||||
<PREVLOC>E09000033</PREVLOC> |
||||
<HHREGRES>7</HHREGRES> |
||||
<HHREGRESSTILL/> |
||||
<PROPLEN/> |
||||
<MSCHARGE>100.0</MSCHARGE> |
||||
<PREVTEN>1</PREVTEN> |
||||
<MORTGAGEUSED>1</MORTGAGEUSED> |
||||
<WCHAIR>1</WCHAIR> |
||||
<ARMEDFORCESSPOUSE>5</ARMEDFORCESSPOUSE> |
||||
<HODAY/> |
||||
<HOMONTH/> |
||||
<HOYEAR/> |
||||
<FROMPROP/> |
||||
<SOCPREVTEN/> |
||||
<EXTRABOR>1</EXTRABOR> |
||||
<HHTYPE>6</HHTYPE> |
||||
<VALUE_VALUE_CHECK/> |
||||
<PREVSHARED>2</PREVSHARED> |
||||
<BUY2LIVING>3</BUY2LIVING> |
||||
<UPRN/> |
||||
<COUNTY/> |
||||
<ADDRESS_SEARCH_VALUE_CHECK/> |
||||
<FIRSTSTAIR/> |
||||
<NUMSTAIR/> |
||||
<MRENTPRESTAIRCASING/> |
||||
<SEXRAB1>F</SEXRAB1> |
||||
<SEXRAB2/> |
||||
<SEXRAB3>F</SEXRAB3> |
||||
<SEXRAB4/> |
||||
<SEXRAB5>M</SEXRAB5> |
||||
<SEXRAB6/> |
||||
<BUILDHEIGHTCLASS>2</BUILDHEIGHTCLASS> |
||||
<DAY>1</DAY> |
||||
<MONTH>4</MONTH> |
||||
<YEAR>2026</YEAR> |
||||
<CREATEDDATE>2026-04-01T00:00:00+01:00</CREATEDDATE> |
||||
<CREATEDBY>{created_by_email}</CREATEDBY> |
||||
<CREATEDBYID>{created_by_id}</CREATEDBYID> |
||||
<USERNAME>{assigned_to_email}</USERNAME> |
||||
<USERNAMEID>{assigned_to_id}</USERNAMEID> |
||||
<UPLOADDATE>2026-04-01T00:00:00+01:00</UPLOADDATE> |
||||
<AMENDEDBY/> |
||||
<AMENDEDBYID/> |
||||
<OWNINGORGID>{owning_org_id}</OWNINGORGID> |
||||
<OWNINGORGNAME>{owning_org_name}</OWNINGORGNAME> |
||||
<MANINGORGID>{managing_org_id}</MANINGORGID> |
||||
<MANINGORGNAME>{managing_org_name}</MANINGORGNAME> |
||||
<CREATIONMETHOD>1</CREATIONMETHOD> |
||||
<BULKUPLOADID/> |
||||
<COLLECTIONYEAR>2026</COLLECTIONYEAR> |
||||
<OWNERSHIP>2</OWNERSHIP> |
||||
<JOINT>1</JOINT> |
||||
<ETHNICGROUP1>17</ETHNICGROUP1> |
||||
<ETHNICGROUP2>17</ETHNICGROUP2> |
||||
<PREVIOUSLAKNOWN>1</PREVIOUSLAKNOWN> |
||||
<HASMSCHARGE>1</HASMSCHARGE> |
||||
<HASSERVICECHARGES/> |
||||
<SERVICECHARGES/> |
||||
<INC1NK>0</INC1NK> |
||||
<INC2NK>0</INC2NK> |
||||
<POSTCODE>SW1A 1AA</POSTCODE> |
||||
<ISLAINFERRED>true</ISLAINFERRED> |
||||
<MORTLEN1>10</MORTLEN1> |
||||
<ETHNIC2/> |
||||
<PREVTEN2/> |
||||
<ADDRESS1>Address line 1</ADDRESS1> |
||||
<ADDRESS2/> |
||||
<TOWNCITY>City</TOWNCITY> |
||||
<LANAME>Westminster</LANAME> |
||||
<ADDRESS1INPUT>Address line 1</ADDRESS1INPUT> |
||||
<POSTCODEINPUT>SW1A 1AA</POSTCODEINPUT> |
||||
<UPRNSELECTED/> |
||||
<BULKADDRESS1/> |
||||
<BULKADDRESS2/> |
||||
<BULKTOWNCITY/> |
||||
<BULKCOUNTY/> |
||||
<BULKPOSTCODE/> |
||||
<BULKLA/> |
||||
<NATIONALITYALL1>826</NATIONALITYALL1> |
||||
<NATIONALITYALL2>826</NATIONALITYALL2> |
||||
<PREVLOCNAME>Westminster</PREVLOCNAME> |
||||
<LIVEINBUYER1>1</LIVEINBUYER1> |
||||
<LIVEINBUYER2>1</LIVEINBUYER2> |
||||
<HASESTATEFEE/> |
||||
<ESTATEFEE/> |
||||
<STAIRLASTDAY/> |
||||
<STAIRLASTMONTH/> |
||||
<STAIRLASTYEAR/> |
||||
<STAIRINITIALDAY/> |
||||
<STAIRINITIALMONTH/> |
||||
<STAIRINITIALYEAR/> |
||||
<MSCHARGE_VALUE_CHECK/> |
||||
<DUPLICATESET/> |
||||
<STAIRCASETOSALE/> |
||||
</form> |
||||
</forms> |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,36 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe Form::Sales::Pages::BuildingHeightClass, type: :model do |
||||
include CollectionTimeHelper |
||||
|
||||
subject(:page) { described_class.new(page_id, page_definition, subsection) } |
||||
|
||||
let(:page_id) { nil } |
||||
let(:page_definition) { nil } |
||||
let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date: current_collection_start_date)) } |
||||
let(:sales_log) { FactoryBot.create(:sales_log, :completed) } |
||||
|
||||
it "has correct subsection" do |
||||
expect(page.subsection).to eq(subsection) |
||||
end |
||||
|
||||
it "has correct questions" do |
||||
expect(page.questions.map(&:id)).to eq(%w[buildheightclass]) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(page.id).to eq("building_height_class") |
||||
end |
||||
|
||||
it "has the correct description" do |
||||
expect(page.description).to be_nil |
||||
end |
||||
|
||||
it "has the correct depends_on" do |
||||
expect(page.depends_on).to eq([ |
||||
{ "proptype" => 1 }, |
||||
{ "proptype" => 2 }, |
||||
{ "proptype" => 9 }, |
||||
]) |
||||
end |
||||
end |
||||
@ -0,0 +1,39 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe Form::Sales::Questions::BuildingHeightClass, type: :model do |
||||
include CollectionTimeHelper |
||||
|
||||
subject(:question) { described_class.new(question_id, question_definition, page) } |
||||
|
||||
let(:question_id) { nil } |
||||
let(:question_definition) { nil } |
||||
let(:page) { instance_double(Form::Page, subsection: instance_double(Form::Subsection, form: instance_double(Form, start_date: current_collection_start_date))) } |
||||
|
||||
it "has correct page" do |
||||
expect(question.page).to eq(page) |
||||
end |
||||
|
||||
it "has the correct id" do |
||||
expect(question.id).to eq("buildheightclass") |
||||
end |
||||
|
||||
it "has the correct type" do |
||||
expect(question.type).to eq("radio") |
||||
end |
||||
|
||||
it "is not marked as derived" do |
||||
expect(question.derived?(nil)).to be false |
||||
end |
||||
|
||||
it "has the correct answer_options" do |
||||
expect(question.answer_options).to eq({ |
||||
"1" => { "value" => "High-rise" }, |
||||
"2" => { "value" => "Low-rise" }, |
||||
"3" => { "value" => "Don't know" }, |
||||
}) |
||||
end |
||||
|
||||
it "has the correct question_number" do |
||||
expect(question.question_number).to eq(17) |
||||
end |
||||
end |
||||
Loading…
Reference in new issue