diff --git a/.env.example b/.env.example index 94596a0da..d30382d9e 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,4 @@ DB_USERNAME=postgres-user DB_PASSWORD=postgres-password +CORE_EMAIL_USERNAME=email@example.com +CORE_EMAIL_PASSWORD=password123 diff --git a/Gemfile b/Gemfile index ff955342f..2b84ee40c 100644 --- a/Gemfile +++ b/Gemfile @@ -29,6 +29,9 @@ gem "discard" gem "activeadmin" # Admin charts gem "chartkick" +# Json Schema +gem "json-schema" +gem "uk_postcode" # Authentication gem "devise" diff --git a/Gemfile.lock b/Gemfile.lock index 0234aceb8..a5d222b0c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -203,6 +203,8 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) + json-schema (2.8.1) + addressable (>= 2.4) kaminari (1.2.1) activesupport (>= 4.1.0) kaminari-actionview (= 1.2.1) @@ -366,6 +368,7 @@ GEM rails (>= 6.0.0) tzinfo (2.0.4) concurrent-ruby (~> 1.0) + uk_postcode (2.1.6) unicode-display_width (2.1.0) view_component (2.39.0) activesupport (>= 5.0.0, < 8.0) @@ -409,6 +412,7 @@ DEPENDENCIES govuk_design_system_formbuilder hotwire-rails jbuilder (~> 2.7) + json-schema listen (~> 3.3) overcommit (>= 0.37.0) pg (~> 1.1) @@ -428,6 +432,7 @@ DEPENDENCIES selenium-webdriver simplecov tzinfo-data + uk_postcode web-console (>= 4.1.0) webpacker (~> 5.0) diff --git a/README.md b/README.md index 5af61d33e..b637e606e 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,7 @@ The JSON should follow the structure: "[snake_case_question_name_string]": { "header": String, "hint_text": String, + "check_answer_label": String, "type": "text" / "numeric" / "radio" / "checkbox" / "date", "min": Integer, // numeric only "max": Integer, // numeric only @@ -133,6 +134,10 @@ The JSON should follow the structure: "[snake_case_question_to_enable_2_name_string]": ["condition-that-enables"] } } + }, + "conditional_route_to": { + "[page_name_to_route_to]": {"question_name": "expected_answer"}, + "[page_name_to_route_to]": {"question_name": "expected_answer"} } } } @@ -155,6 +160,16 @@ Assumptions made by the format: - Radio question answer option selected matches one of conditional e.g. ["answer-options-1-string", "answer-option-3-string"] - Numeric question value matches condition e.g. [">2"], ["<7"] or ["== 6"] +## JSON Form Validation against Schema + +To validate the form JSON against the schema you can run: +`rake form_definition:validate` + +This will validate all forms in: +directories = ["config/forms", "spec/fixtures/forms"] + +against the schema in (config/forms/schema/generic.json) + ## Useful documentation (external dependencies) ### GOV.UK Design System Form Builder for Rails diff --git a/app/admin/case_logs.rb b/app/admin/case_logs.rb index f14d33a3a..2a15fbb2a 100644 --- a/app/admin/case_logs.rb +++ b/app/admin/case_logs.rb @@ -2,7 +2,7 @@ ActiveAdmin.register CaseLog do # See permitted parameters documentation: # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters permit_params do - permitted = %i[status tenant_code age1 sex1 tenant_ethnic_group tenant_nationality previous_housing_situation armed_forces ecstat1 hhmemb relat2 age2 sex2 ecstat2 relat3 age3 sex3 ecstat3 relat4 age4 sex4 ecstat4 relat5 age5 sex5 ecstat5 relat6 age6 sex6 ecstat6 relat7 age7 person_7_gender ecstat7 relat8 age8 sex8 ecstat8 homelessness reason_for_leaving_last_settled_home benefit_cap_spare_room_subsidy armed_forces_active armed_forces_injured armed_forces_partner medical_conditions pregnancy accessibility_requirements condition_effects tenancy_code tenancy_start_date starter_tenancy fixed_term_tenancy tenancy_type letting_type letting_provider property_location previous_postcode property_relet property_vacancy_reason property_reference property_unit_type property_building_type property_number_of_bedrooms property_void_date property_major_repairs property_major_repairs_date property_number_of_times_relet property_wheelchair_accessible net_income net_income_frequency net_income_uc_proportion housing_benefit rent_frequency basic_rent service_charge personal_service_charge support_charge total_charge outstanding_amount time_lived_in_la time_on_la_waiting_list previous_la property_postcode reasonable_preference reasonable_preference_reason cbl_letting chr_letting cap_letting outstanding_rent_or_charges other_reason_for_leaving_last_settled_home accessibility_requirements_fully_wheelchair_accessible_housing accessibility_requirements_wheelchair_access_to_essential_rooms accessibility_requirements_level_access_housing accessibility_requirements_other_disability_requirements accessibility_requirements_no_disability_requirements accessibility_requirements_do_not_know accessibility_requirements_prefer_not_to_say condition_effects_vision condition_effects_hearing condition_effects_mobility condition_effects_dexterity condition_effects_stamina condition_effects_learning condition_effects_memory condition_effects_mental_health condition_effects_social_or_behavioral condition_effects_other condition_effects_prefer_not_to_say reasonable_preference_reason_homeless reasonable_preference_reason_unsatisfactory_housing reasonable_preference_reason_medical_grounds reasonable_preference_reason_avoid_hardship reasonable_preference_reason_do_not_know other_tenancy_type override_net_income_validation net_income_known] + permitted = %i[status tenant_code age1 sex1 tenant_ethnic_group tenant_nationality previous_housing_situation armed_forces ecstat1 other_hhmemb relat2 age2 sex2 ecstat2 relat3 age3 sex3 ecstat3 relat4 age4 sex4 ecstat4 relat5 age5 sex5 ecstat5 relat6 age6 sex6 ecstat6 relat7 age7 person_7_gender ecstat7 relat8 age8 sex8 ecstat8 homelessness reason benefit_cap_spare_room_subsidy armed_forces_active armed_forces_injured armed_forces_partner medical_conditions pregnancy accessibility_requirements condition_effects tenancy_code tenancy_start_date starter_tenancy fixed_term_tenancy tenancy_type letting_type letting_provider la previous_postcode property_relet property_vacancy_reason property_reference property_unit_type property_building_type property_number_of_bedrooms property_void_date majorrepairs mrcdate property_number_of_times_relet property_wheelchair_accessible net_income net_income_frequency net_income_uc_proportion hb rent_frequency basic_rent service_charge personal_service_charge support_charge total_charge tshortfall time_lived_in_la time_on_la_waiting_list prevloc property_postcode reasonable_preference reasonable_preference_reason cbl_letting chr_letting cap_letting hbrentshortfall other_reason accessibility_requirements_fully_wheelchair_accessible_housing accessibility_requirements_wheelchair_access_to_essential_rooms accessibility_requirements_level_access_housing accessibility_requirements_other_disability_requirements accessibility_requirements_no_disability_requirements accessibility_requirements_do_not_know accessibility_requirements_prefer_not_to_say condition_effects_vision condition_effects_hearing condition_effects_mobility condition_effects_dexterity condition_effects_stamina condition_effects_learning condition_effects_memory condition_effects_mental_health condition_effects_social_or_behavioral condition_effects_other condition_effects_prefer_not_to_say reasonable_preference_reason_homeless reasonable_preference_reason_unsatisfactory_housing reasonable_preference_reason_medical_grounds reasonable_preference_reason_avoid_hardship reasonable_preference_reason_do_not_know other_tenancy_type override_net_income_validation net_income_known] permitted end diff --git a/app/constants/db_enums.rb b/app/constants/db_enums.rb index 536620915..23e4b4bd4 100644 --- a/app/constants/db_enums.rb +++ b/app/constants/db_enums.rb @@ -20,7 +20,7 @@ module DbEnums "Not seeking work" => 6, "Full-time student" => 7, "Unable to work because of long term sick or disability" => 8, - "Child under 16" => 100, + "Child under 16" => 9, "Other" => 0, "Prefer not to say" => 10, } @@ -63,7 +63,6 @@ module DbEnums "Yes" => 1, "No" => 2, "Do not know" => 3, - "Prefer not to say" => 100, } end @@ -91,6 +90,8 @@ module DbEnums "Bulgaria" => 14, "Romania" => 15, "Ireland" => 17, + "Slovenia" => 10, + "Croatia" => 16, "Other EU Economic Area (EEA country)" => 11, "Any other country" => 12, "Prefer not to say" => 13, @@ -155,6 +156,14 @@ module DbEnums } end + def self.polar_with_unknown + { + "No" => 2, + "Yes" => 1, + "Do not know" => 3, + } + end + def self.tenancy { "Fixed term – Secure" => 1, @@ -213,6 +222,13 @@ module DbEnums } end + def self.override_soft_validation + { + "No" => 0, + "Yes" => 1, + } + end + def self.benefits { "All" => 1, @@ -249,4 +265,439 @@ module DbEnums "Do not know" => 6, } end + + def self.housing_benefit + { + "Housing Benefit, but not Universal Credit" => 1, + "Universal Credit with housing element, but not Housing Benefit" => 6, + "Universal Credit without housing element and no Housing Benefit" => 7, + "Universal Credit and Housing Benefit" => 8, + "Not Housing Benefit or Universal Credit" => 9, + "Do not know" => 3, + "Prefer not to say" => 100, + } + end + + def self.reason + { + "Permanently decanted from another property owned by this landlord" => 1, + "Left home country as a refugee" => 2, + "Loss of tied accommodation" => 4, + "Domestic abuse" => 7, + "(Non violent) relationship breakdown with partner" => 8, + "Asked to leave by family or friends" => 9, + "Racial harassment" => 10, + "Other problems with neighbours" => 11, + "Property unsuitable because of overcrowding" => 12, + "End of assured shorthold tenancy - no fault" => 40, + "End of assured shorthold tenancy - tenant's fault" => 41, + "End of fixed term tenancy - no fault" => 42, + "End of fixed term tenancy - tenant's fault" => 43, + "Repossession" => 34, + "Under occupation - offered incentive to downsize" => 29, + "Under occupation - no incentive" => 30, + "Property unsuitable because of ill health / disability" => 13, + "Property unsuitable because of poor condition" => 14, + "Couldn't afford fees attached to renewing the tenancy" => 35, + "Couldn't afford increase in rent" => 36, + "Couldn't afford rent or mortgage - welfare reforms" => 37, + "Couldn't afford rent or mortgage - employment" => 38, + "Couldn't afford rent or mortgage - other" => 39, + "To move nearer to family / friends / school" => 16, + "To move nearer to work" => 17, + "To move to accomodation with support" => 18, + "To move to independent accomodation" => 19, + "Hate crime" => 31, + "Death of household member in last settled accomodation" => 46, + "Discharged from prison" => 44, + "Discharged from long stay hospital or similar institution" => 45, + "Other" => 20, + "Do not know" => 28, + "Prefer not to say" => 100, + } + end + + def self.la + { + "Hartlepool" => "E06000001", + "Na h-Eileanan Siar" => "S12000013", + "Middlesbrough" => "E06000002", + "Redcar and Cleveland" => "E06000003", + "Stockton-on-Tees" => "E06000004", + "Darlington" => "E06000005", + "Halton" => "E06000006", + "Warrington" => "E06000007", + "Blackburn with Darwen" => "E06000008", + "Blackpool" => "E06000009", + "Kingston upon Hull, City of" => "E06000010", + "East Riding of Yorkshire" => "E06000011", + "North East Lincolnshire" => "E06000012", + "North Lincolnshire" => "E06000013", + "York" => "E06000014", + "Derby" => "E06000015", + "Leicester" => "E06000016", + "Rutland" => "E06000017", + "Nottingham" => "E06000018", + "Herefordshire, County of" => "E06000019", + "Telford and Wrekin" => "E06000020", + "Stoke-on-Trent" => "E06000021", + "Bath and North East Somerset" => "E06000022", + "Bristol, City of" => "E06000023", + "North Somerset" => "E06000024", + "South Gloucestershire" => "E06000025", + "Plymouth" => "E06000026", + "Torbay" => "E06000027", + "Swindon" => "E06000030", + "Peterborough" => "E06000031", + "Luton" => "E06000032", + "Southend-on-Sea" => "E06000033", + "Thurrock" => "E06000034", + "Medway" => "E06000035", + "Bracknell Forest" => "E06000036", + "West Berkshire" => "E06000037", + "Reading" => "E06000038", + "Slough" => "E06000039", + "Windsor and Maidenhead" => "E06000040", + "Wokingham" => "E06000041", + "Milton Keynes" => "E06000042", + "Brighton and Hove" => "E06000043", + "Portsmouth" => "E06000044", + "Southampton" => "E06000045", + "Isle of Wight" => "E06000046", + "County Durham" => "E06000047", + "Cheshire East" => "E06000049", + "Cheshire West and Chester" => "E06000050", + "Shropshire" => "E06000051", + "Cornwall" => "E06000052", + "Isles of Scilly" => "E06000053", + "Wiltshire" => "E06000054", + "Bedford" => "E06000055", + "Central Bedfordshire" => "E06000056", + "Northumberland" => "E06000057", + "Bournemouth, Christchurch and Poole" => "E06000058", + "North Warwickshire" => "E07000218", + "Nuneaton and Bedworth" => "E07000219", + "Rugby" => "E07000220", + "Stratford-on-Avon" => "E07000221", + "Warwick" => "E07000222", + "Adur" => "E07000223", + "Arun" => "E07000224", + "Chichester" => "E07000225", + "Crawley" => "E07000226", + "Horsham" => "E07000227", + "Mid Sussex" => "E07000228", + "Worthing" => "E07000229", + "Bromsgrove" => "E07000234", + "Malvern Hills" => "E07000235", + "Redditch" => "E07000236", + "Worcester" => "E07000237", + "Wychavon" => "E07000238", + "Wyre Forest" => "E07000239", + "St Albans" => "E07000240", + "Welwyn Hatfield" => "E07000241", + "East Hertfordshire" => "E07000242", + "Stevenage" => "E07000243", + "East Suffolk" => "E07000244", + "West Suffolk" => "E07000245", + "Somerset West and Taunton" => "E07000246", + "Bolton" => "E08000001", + "Bury" => "E08000002", + "Manchester" => "E08000003", + "Oldham" => "E08000004", + "Rochdale" => "E08000005", + "Salford" => "E08000006", + "Stockport" => "E08000007", + "Tameside" => "E08000008", + "Trafford" => "E08000009", + "Wigan" => "E08000010", + "Knowsley" => "E08000011", + "Liverpool" => "E08000012", + "St. Helens" => "E08000013", + "Sefton" => "E08000014", + "Wirral" => "E08000015", + "Barnsley" => "E08000016", + "Doncaster" => "E08000017", + "Rotherham" => "E08000018", + "Sheffield" => "E08000019", + "Newcastle upon Tyne" => "E08000021", + "North Tyneside" => "E08000022", + "South Tyneside" => "E08000023", + "Sunderland" => "E08000024", + "Birmingham" => "E08000025", + "Coventry" => "E08000026", + "Dudley" => "E08000027", + "Sandwell" => "E08000028", + "Solihull" => "E08000029", + "Walsall" => "E08000030", + "Dorset" => "E06000059", + "Wolverhampton" => "E08000031", + "Falkirk" => "S12000014", + "Highland" => "S12000017", + "Inverclyde" => "S12000018", + "Midlothian" => "S12000019", + "Moray" => "S12000020", + "North Ayrshire" => "S12000021", + "Orkney Islands" => "S12000023", + "Scottish Borders" => "S12000026", + "Shetland Islands" => "S12000027", + "South Ayrshire" => "S12000028", + "South Lanarkshire" => "S12000029", + "Stirling" => "S12000030", + "Aberdeen City" => "S12000033", + "Aberdeenshire" => "S12000034", + "Argyll and Bute" => "S12000035", + "City of Edinburgh" => "S12000036", + "Renfrewshire" => "S12000038", + "West Dunbartonshire" => "S12000039", + "West Lothian" => "S12000040", + "Angus" => "S12000041", + "Dundee City" => "S12000042", + "East Dunbartonshire" => "S12000045", + "Buckinghamshire" => "E06000060", + "Fife" => "S12000047", + "Cambridge" => "E07000008", + "Perth and Kinross" => "S12000048", + "East Cambridgeshire" => "E07000009", + "Glasgow City" => "S12000049", + "Fenland" => "E07000010", + "North Lanarkshire" => "S12000050", + "Huntingdonshire" => "E07000011", + "Isle of Anglesey" => "W06000001", + "South Cambridgeshire" => "E07000012", + "Gwynedd" => "W06000002", + "Allerdale" => "E07000026", + "Conwy" => "W06000003", + "Barrow-in-Furness" => "E07000027", + "Denbighshire" => "W06000004", + "Carlisle" => "E07000028", + "Flintshire" => "W06000005", + "Copeland" => "E07000029", + "Wrexham" => "W06000006", + "Eden" => "E07000030", + "Ceredigion" => "W06000008", + "South Lakeland" => "E07000031", + "Pembrokeshire" => "W06000009", + "Amber Valley" => "E07000032", + "Carmarthenshire" => "W06000010", + "Bolsover" => "E07000033", + "Swansea" => "W06000011", + "Chesterfield" => "E07000034", + "Neath Port Talbot" => "W06000012", + "Derbyshire Dales" => "E07000035", + "Bridgend" => "W06000013", + "Erewash" => "E07000036", + "Vale of Glamorgan" => "W06000014", + "High Peak" => "E07000037", + "Cardiff" => "W06000015", + "North East Derbyshire" => "E07000038", + "Rhondda Cynon Taf" => "W06000016", + "South Derbyshire" => "E07000039", + "Caerphilly" => "W06000018", + "East Devon" => "E07000040", + "Blaenau Gwent" => "W06000019", + "Exeter" => "E07000041", + "Torfaen" => "W06000020", + "Mid Devon" => "E07000042", + "Monmouthshire" => "W06000021", + "North Devon" => "E07000043", + "Newport" => "W06000022", + "South Hams" => "E07000044", + "Powys" => "W06000023", + "Teignbridge" => "E07000045", + "Merthyr Tydfil" => "W06000024", + "Torridge" => "E07000046", + "West Devon" => "E07000047", + "Eastbourne" => "E07000061", + "Hastings" => "E07000062", + "Lewes" => "E07000063", + "Rother" => "E07000064", + "Wealden" => "E07000065", + "Basildon" => "E07000066", + "Braintree" => "E07000067", + "Brentwood" => "E07000068", + "Castle Point" => "E07000069", + "Chelmsford" => "E07000070", + "Colchester" => "E07000071", + "Epping Forest" => "E07000072", + "Harlow" => "E07000073", + "Maldon" => "E07000074", + "Rochford" => "E07000075", + "Tendring" => "E07000076", + "Uttlesford" => "E07000077", + "Cheltenham" => "E07000078", + "Cotswold" => "E07000079", + "Forest of Dean" => "E07000080", + "Gloucester" => "E07000081", + "Stroud" => "E07000082", + "Tewkesbury" => "E07000083", + "Basingstoke and Deane" => "E07000084", + "East Hampshire" => "E07000085", + "King’s Lynn and West Norfolk" => "E07000146", + "Eastleigh" => "E07000086", + "North Norfolk" => "E07000147", + "Norwich" => "E07000148", + "South Norfolk" => "E07000149", + "Corby" => "E07000150", + "Daventry" => "E07000151", + "East Northamptonshire" => "E07000152", + "Kettering" => "E07000153", + "Northampton" => "E07000154", + "South Northamptonshire" => "E07000155", + "Wellingborough" => "E07000156", + "Craven" => "E07000163", + "Hambleton" => "E07000164", + "Harrogate" => "E07000165", + "Richmondshire" => "E07000166", + "Ryedale" => "E07000167", + "Scarborough" => "E07000168", + "Selby" => "E07000169", + "Ashfield" => "E07000170", + "Bassetlaw" => "E07000171", + "Broxtowe" => "E07000172", + "Gedling" => "E07000173", + "Mansfield" => "E07000174", + "Newark and Sherwood" => "E07000175", + "Rushcliffe" => "E07000176", + "Cherwell" => "E07000177", + "Oxford" => "E07000178", + "South Oxfordshire" => "E07000179", + "Vale of White Horse" => "E07000180", + "West Oxfordshire" => "E07000181", + "Mendip" => "E07000187", + "Sedgemoor" => "E07000188", + "South Somerset" => "E07000189", + "Cannock Chase" => "E07000192", + "East Staffordshire" => "E07000193", + "Lichfield" => "E07000194", + "Newcastle-under-Lyme" => "E07000195", + "South Staffordshire" => "E07000196", + "Stafford" => "E07000197", + "Staffordshire Moorlands" => "E07000198", + "Tamworth" => "E07000199", + "Babergh" => "E07000200", + "Ipswich" => "E07000202", + "Mid Suffolk" => "E07000203", + "Elmbridge" => "E07000207", + "Epsom and Ewell" => "E07000208", + "Guildford" => "E07000209", + "Mole Valley" => "E07000210", + "Reigate and Banstead" => "E07000211", + "Runnymede" => "E07000212", + "Spelthorne" => "E07000213", + "Surrey Heath" => "E07000214", + "Tandridge" => "E07000215", + "Waverley" => "E07000216", + "Woking" => "E07000217", + "Fareham" => "E07000087", + "Gosport" => "E07000088", + "Hart" => "E07000089", + "Havant" => "E07000090", + "New Forest" => "E07000091", + "Rushmoor" => "E07000092", + "Test Valley" => "E07000093", + "Winchester" => "E07000094", + "Broxbourne" => "E07000095", + "Dacorum" => "E07000096", + "Hertsmere" => "E07000098", + "North Hertfordshire" => "E07000099", + "Three Rivers" => "E07000102", + "Watford" => "E07000103", + "Ashford" => "E07000105", + "Canterbury" => "E07000106", + "Dartford" => "E07000107", + "Dover" => "E07000108", + "Gravesham" => "E07000109", + "Maidstone" => "E07000110", + "Sevenoaks" => "E07000111", + "Folkestone and Hythe" => "E07000112", + "Swale" => "E07000113", + "Thanet" => "E07000114", + "Tonbridge and Malling" => "E07000115", + "Tunbridge Wells" => "E07000116", + "Burnley" => "E07000117", + "Chorley" => "E07000118", + "Fylde" => "E07000119", + "Hyndburn" => "E07000120", + "Lancaster" => "E07000121", + "Pendle" => "E07000122", + "Preston" => "E07000123", + "Ribble Valley" => "E07000124", + "Rossendale" => "E07000125", + "South Ribble" => "E07000126", + "West Lancashire" => "E07000127", + "Wyre" => "E07000128", + "Blaby" => "E07000129", + "Charnwood" => "E07000130", + "Harborough" => "E07000131", + "Hinckley and Bosworth" => "E07000132", + "Melton" => "E07000133", + "North West Leicestershire" => "E07000134", + "Oadby and Wigston" => "E07000135", + "Boston" => "E07000136", + "East Lindsey" => "E07000137", + "Lincoln" => "E07000138", + "North Kesteven" => "E07000139", + "South Holland" => "E07000140", + "South Kesteven" => "E07000141", + "West Lindsey" => "E07000142", + "Breckland" => "E07000143", + "Broadland" => "E07000144", + "Great Yarmouth" => "E07000145", + "Bradford" => "E08000032", + "Calderdale" => "E08000033", + "Kirklees" => "E08000034", + "Leeds" => "E08000035", + "Wakefield" => "E08000036", + "Gateshead" => "E08000037", + "City of London" => "E09000001", + "Barking and Dagenham" => "E09000002", + "Barnet" => "E09000003", + "Bexley" => "E09000004", + "Brent" => "E09000005", + "Bromley" => "E09000006", + "Camden" => "E09000007", + "Croydon" => "E09000008", + "Ealing" => "E09000009", + "Enfield" => "E09000010", + "Greenwich" => "E09000011", + "Hackney" => "E09000012", + "Hammersmith and Fulham" => "E09000013", + "Haringey" => "E09000014", + "Harrow" => "E09000015", + "Havering" => "E09000016", + "Hillingdon" => "E09000017", + "Hounslow" => "E09000018", + "Islington" => "E09000019", + "Kensington and Chelsea" => "E09000020", + "Kingston upon Thames" => "E09000021", + "Lambeth" => "E09000022", + "Lewisham" => "E09000023", + "Merton" => "E09000024", + "Newham" => "E09000025", + "Redbridge" => "E09000026", + "Richmond upon Thames" => "E09000027", + "Southwark" => "E09000028", + "Sutton" => "E09000029", + "Tower Hamlets" => "E09000030", + "Waltham Forest" => "E09000031", + "Wandsworth" => "E09000032", + "Westminster" => "E09000033", + "Antrim and Newtownabbey" => "N09000001", + "Armagh City, Banbridge and Craigavon" => "N09000002", + "Belfast" => "N09000003", + "Causeway Coast and Glens" => "N09000004", + "Derry City and Strabane" => "N09000005", + "Fermanagh and Omagh" => "N09000006", + "Lisburn and Castlereagh" => "N09000007", + "Mid and East Antrim" => "N09000008", + "Mid Ulster" => "N09000009", + "Newry, Mourne and Down" => "N09000010", + "Ards and North Down" => "N09000011", + "Clackmannanshire" => "S12000005", + "Dumfries and Galloway" => "S12000006", + "East Ayrshire" => "S12000008", + "East Lothian" => "S12000010", + "East Renfrewshire" => "S12000011", + } + end end diff --git a/app/controllers/case_logs_controller.rb b/app/controllers/case_logs_controller.rb index 8158f9e8a..2755e0763 100644 --- a/app/controllers/case_logs_controller.rb +++ b/app/controllers/case_logs_controller.rb @@ -105,6 +105,12 @@ private form = FormHandler.instance.get_form("2021_2022") form.expected_responses_for_page(page).each_with_object({}) do |(question_key, question_info), result| question_params = params["case_log"][question_key] + if question_info["type"] == "date" + day = params["case_log"]["#{question_key}(3i)"] + month = params["case_log"]["#{question_key}(2i)"] + year = params["case_log"]["#{question_key}(1i)"] + result[question_key] = Date.new(year.to_i, month.to_i, day.to_i) + end next unless question_params if %w[checkbox validation_override].include?(question_info["type"]) diff --git a/app/controllers/users/passwords_controller.rb b/app/controllers/users/passwords_controller.rb index 68c87a123..a77e5e1f3 100644 --- a/app/controllers/users/passwords_controller.rb +++ b/app/controllers/users/passwords_controller.rb @@ -1,9 +1,8 @@ class Users::PasswordsController < Devise::PasswordsController - def reset_confirmation @email = params["email"] render "devise/confirmations/reset" - end + end def create self.resource = resource_class.send_reset_password_instructions(resource_params) @@ -12,9 +11,9 @@ class Users::PasswordsController < Devise::PasswordsController respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name)) end - protected +protected - def after_sending_reset_password_instructions_path_for(resource) - confirmations_reset_path(email: params.dig("user", "email")) if is_navigational_format? - end -end \ No newline at end of file + def after_sending_reset_password_instructions_path_for(_resource) + confirmations_reset_path(email: params.dig("user", "email")) if is_navigational_format? + end +end diff --git a/app/javascript/controllers/soft_validations_controller.js b/app/javascript/controllers/soft_validations_controller.js index 963dd7a76..a408e4460 100644 --- a/app/javascript/controllers/soft_validations_controller.js +++ b/app/javascript/controllers/soft_validations_controller.js @@ -5,8 +5,13 @@ export default class extends Controller { initialize() { let url = window.location.href + "/soft_validations" + this.fetch_retry(url, { headers: { accept: "application/json" } }, 2) + } + + fetch_retry(url, options, n) { + let self = this let div = this.overrideTarget - fetch(url, { headers: { accept: "application/json" } }) + fetch(url, options) .then(response => response.json()) .then((response) => { if(response["show"]){ @@ -22,7 +27,10 @@ export default class extends Controller { button.checked = false }) } - } - ) + }) + .catch(function(error) { + if (n === 1) throw error + return self.fetch_retry(url, options, n - 1) + }) } } diff --git a/app/models/case_log.rb b/app/models/case_log.rb index ac37461da..1842dc55a 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -65,6 +65,7 @@ class CaseLog < ApplicationRecord enum leftreg: DbEnums.leftreg, _suffix: true enum illness: DbEnums.illness, _suffix: true enum preg_occ: DbEnums.pregnancy, _suffix: true + enum override_net_income_validation: DbEnums.override_soft_validation, _suffix: true enum housingneeds_a: DbEnums.polar, _suffix: true enum housingneeds_b: DbEnums.polar, _suffix: true enum housingneeds_c: DbEnums.polar, _suffix: true @@ -100,7 +101,14 @@ class CaseLog < ApplicationRecord enum period: DbEnums.period, _suffix: true enum layear: DbEnums.latime, _suffix: true enum lawaitlist: DbEnums.latime, _suffix: true - enum reasonpref: DbEnums.polar2, _suffix: true + enum reasonpref: DbEnums.polar_with_unknown, _suffix: true + enum reason: DbEnums.reason, _suffix: true + enum la: DbEnums.la, _suffix: true + enum prevloc: DbEnums.la, _suffix: true + enum majorrepairs: DbEnums.polar, _suffix: true + enum hb: DbEnums.housing_benefit, _suffix: true + enum hbrentshortfall: DbEnums.polar_with_unknown, _suffix: true + enum property_relet: DbEnums.polar, _suffix: true AUTOGENERATED_FIELDS = %w[id status created_at updated_at discarded_at].freeze @@ -131,12 +139,64 @@ class CaseLog < ApplicationRecord end end + def postcode + if property_postcode.present? + UKPostcode.parse(property_postcode).outcode + end + end + + def postcod2 + if property_postcode.present? + UKPostcode.parse(property_postcode).incode + end + end + + def ppostc1 + if previous_postcode.present? + UKPostcode.parse(previous_postcode).outcode + end + end + + def ppostc2 + if previous_postcode.present? + UKPostcode.parse(previous_postcode).incode + end + end + + def hhmemb + other_hhmemb.presence + end + def applicable_income_range return unless ecstat1 IncomeRange::ALLOWED[ecstat1.to_sym] end + def mrcday + if mrcdate.present? + mrcdate.day + end + end + + def mrcmonth + if mrcdate.present? + mrcdate.month + end + end + + def mrcyear + if mrcdate.present? + mrcdate.year + end + end + + def incref + if net_income_known == "Prefer not to say" + 1 + end + end + private def update_status! @@ -162,7 +222,7 @@ private dynamically_not_required = [] - if reason_for_leaving_last_settled_home != "Other" + if reason != "Other" dynamically_not_required << "other_reason_for_leaving_last_settled_home" end @@ -187,7 +247,7 @@ private dynamically_not_required << "incfreq" end - start_range = (hhmemb || 0) + 2 + start_range = (other_hhmemb || 0) + 2 (start_range..8).each do |n| dynamically_not_required << "age#{n}" dynamically_not_required << "sex#{n}" @@ -195,6 +255,10 @@ private dynamically_not_required << "ecstat#{n}" end + if net_income_known != "Prefer not to say" + dynamically_not_required << "incref" + end + required.delete_if { |key, _value| dynamically_not_required.include?(key) } end end diff --git a/app/validations/financial_validations.rb b/app/validations/financial_validations.rb index dd4b58baf..3d2ce8732 100644 --- a/app/validations/financial_validations.rb +++ b/app/validations/financial_validations.rb @@ -2,11 +2,11 @@ module FinancialValidations # Validations methods need to be called 'validate_' to run on model save # or 'validate_' to run on submit as well def validate_outstanding_rent_amount(record) - if record.outstanding_rent_or_charges == "Yes" && record.outstanding_amount.blank? - record.errors.add :outstanding_amount, "You must answer the oustanding amout question if you have outstanding rent or charges." + if record.hbrentshortfall == "Yes" && record.tshortfall.blank? + record.errors.add :tshortfall, "You must answer the oustanding amout question if you have outstanding rent or charges." end - if record.outstanding_rent_or_charges == "No" && record.outstanding_amount.present? - record.errors.add :outstanding_amount, "You must not answer the oustanding amout question if you don't have outstanding rent or charges." + if record.hbrentshortfall == "No" && record.tshortfall.present? + record.errors.add :tshortfall, "You must not answer the oustanding amout question if you don't have outstanding rent or charges." end end diff --git a/app/validations/household_validations.rb b/app/validations/household_validations.rb index ca8d887e9..d3536ae8a 100644 --- a/app/validations/household_validations.rb +++ b/app/validations/household_validations.rb @@ -16,11 +16,11 @@ module HouseholdValidations end def validate_other_reason_for_leaving_last_settled_home(record) - validate_other_field(record, "reason_for_leaving_last_settled_home", "other_reason_for_leaving_last_settled_home") + validate_other_field(record, "reason", "other_reason_for_leaving_last_settled_home") end def validate_reason_for_leaving_last_settled_home(record) - if record.reason_for_leaving_last_settled_home == "Do not know" && record.underoccupation_benefitcap != "Do not know" + if record.reason == "Do not know" && record.underoccupation_benefitcap != "Do not know" record.errors.add :underoccupation_benefitcap, "must be do not know if tenant’s main reason for leaving is do not know" end end @@ -80,7 +80,7 @@ module HouseholdValidations record.errors.add :unittype_gn, "A bedsit can only have one bedroom" end - if !record.hhmemb.nil? && record.hhmemb.positive? && (record.unittype_gn.include?("Shared") && !record.beds.to_i.between?(1, 7)) + if !record.other_hhmemb.nil? && record.other_hhmemb.positive? && (record.unittype_gn.include?("Shared") && !record.beds.to_i.between?(1, 7)) record.errors.add :unittype_gn, "A shared house must have 1 to 7 bedrooms" end diff --git a/app/validations/soft_validations.rb b/app/validations/soft_validations.rb index ce03fafc6..451988b66 100644 --- a/app/validations/soft_validations.rb +++ b/app/validations/soft_validations.rb @@ -8,7 +8,7 @@ module SoftValidations end def soft_errors_overridden? - !public_send(soft_errors.keys.first).zero? if soft_errors.present? + public_send(soft_errors.keys.first) == "Yes" if soft_errors.present? end private diff --git a/app/views/devise/mailer/reset_password_instructions.html.erb b/app/views/devise/mailer/reset_password_instructions.html.erb index 45034dc1d..f667dc12f 100644 --- a/app/views/devise/mailer/reset_password_instructions.html.erb +++ b/app/views/devise/mailer/reset_password_instructions.html.erb @@ -2,5 +2,7 @@

Someone has requested a link to change your password. You can do this through the link below.

+

<%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %>

+

If you didn't request this, please ignore this email.

Your password won't change until you access the link above and create a new one.

diff --git a/app/views/devise/passwords/edit.html.erb b/app/views/devise/passwords/edit.html.erb index 5fbb9ff0a..0b2bc2067 100644 --- a/app/views/devise/passwords/edit.html.erb +++ b/app/views/devise/passwords/edit.html.erb @@ -1,25 +1,19 @@ -

Change your password

- <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %> - <%= render "devise/shared/error_messages", resource: resource %> - <%= f.hidden_field :reset_password_token %> +
+
+

Reset your password

+ <%= render "devise/shared/error_messages", resource: resource %> + <%= f.hidden_field :reset_password_token %> -
- <%= f.label :password, "New password" %>
- <% if @minimum_password_length %> - (<%= @minimum_password_length %> characters minimum)
- <% end %> - <%= f.password_field :password, autofocus: true, autocomplete: "new-password" %> -
+
+ <%= f.label :password, "New password", class: "govuk-label" %> + <% if @minimum_password_length %> +
Your password must be at least 8 characters and hard to guess.
+ <% end %> + <%= f.password_field :password, autofocus: true, autocomplete: "new-password", class: "govuk-input" %> +
-
- <%= f.label :password_confirmation, "Confirm new password" %>
- <%= f.password_field :password_confirmation, autocomplete: "new-password" %> -
- -
- <%= f.submit "Change my password" %> + <%= f.submit "Reset password", class: "govuk-button" %> +
<% end %> - -<%= render "devise/shared/links" %> diff --git a/app/views/form/_validation_override_question.html.erb b/app/views/form/_validation_override_question.html.erb index 5e42b32b8..10a6a60e7 100644 --- a/app/views/form/_validation_override_question.html.erb +++ b/app/views/form/_validation_override_question.html.erb @@ -8,7 +8,8 @@ hint: { text: "soft-validations-placeholder-hint-text" } do %> <%= f.govuk_check_box page_info["soft_validations"]&.keys&.first, page_info["soft_validations"]&.keys&.first, - label: { text: "Yes" } + label: { text: "Yes" }, + checked: @case_log[page_info["soft_validations"]&.keys&.first] == "Yes" %> <% end %>
diff --git a/config/environments/development.rb b/config/environments/development.rb index b6e16fe5c..bf9761c3a 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -40,6 +40,20 @@ Rails.application.configure do config.action_mailer.default_url_options = { host: "localhost", port: 3000 } + config.action_mailer.perform_deliveries = true + + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + address: "smtp.gmail.com", + port: 465, + domain: "gmail.com", + user_name: ENV["CORE_EMAIL_USERNAME"], + password: ENV["CORE_EMAIL_PASSWORD"], + authentication: "plain", + enable_starttls_auto: true, + ssl: true, + } + # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log diff --git a/config/environments/test.rb b/config/environments/test.rb index ac6e59604..22de4a7bf 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -37,6 +37,8 @@ Rails.application.configure do config.action_mailer.perform_caching = false + config.action_mailer.default_url_options = { host: "localhost", port: 3000 } + # Tell Action Mailer not to deliver emails to the real world. # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array. diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json index 498e064b2..859e5fa14 100644 --- a/config/forms/2021_2022.json +++ b/config/forms/2021_2022.json @@ -104,7 +104,7 @@ "header": "About this log", "description": "", "questions": { - "tenancy_start_date": { + "startdate": { "check_answer_label": "When is the tenancy start date?", "header": "What is the tenancy start date?", "hint_text": "For example, 27 3 2007", @@ -112,7 +112,7 @@ } } }, - "letting_type": { + "rent_type": { "header": "About this log", "description": "", "questions": { @@ -273,21 +273,23 @@ "type": "radio", "answer_options": { "0": "UK national resident in UK", - "1": "A current or former reserve in the UK Armed Forces (exc. National Service)", - "2": "UK national returning from residence overseas", - "3": "Czech Republic", - "4": "Estonia", - "5": "Hungary", - "6": "Latvia", - "7": "Lithuania", - "8": "Poland", - "9": "Slovakia", - "10": "Bulgaria", - "11": "Romania", - "12": "Ireland", - "13": "Other EU Economic Area (EEA country)", - "14": "Any other country", - "15": "Prefer not to say" + "1": "UK national returning from residence overseas", + "2": "Czech Republic", + "3": "Estonia", + "4": "Hungary", + "5": "Latvia", + "6": "Lithuania", + "7": "Poland", + "8": "Slovakia", + "9": "Bulgaria", + "10": "Romania", + "11": "Ireland", + "12": "Slovakia", + "13":"Slovenia", + "14": "Croatia", + "15": "Other EU Economic Area (EEA country)", + "16": "Any other country", + "17": "Prefer not to say" } } } @@ -315,13 +317,22 @@ "10": "Prefer not to say" } } + }, + "soft_validations": { + "override_net_income_validation": { + "check_answer_label": "Net income confirmed?", + "type": "validation_override", + "answer_options": { + "override_net_income_validation": "Yes" + } + } } }, "household_number_of_other_members": { "header": "", "description": "", "questions": { - "hhmemb": { + "other_hhmemb": { "check_answer_label": "Number of Other Household Members", "header": "How many other people are there in the household?", "hint_text": "The maximum number of others is 7", @@ -787,7 +798,7 @@ "header": "Leaving their last settled home", "description": "", "questions": { - "reason_for_leaving_last_settled_home": { + "reason": { "header": "What is the tenant’s main reason for leaving?", "hint_text": "", "type": "radio", @@ -925,8 +936,7 @@ "answer_options": { "0": "Yes", "1": "No", - "2": "Do not know", - "3": "Prefer not to say" + "2": "Prefer not to say" } } } @@ -990,9 +1000,7 @@ "illness_type_6": "Memory", "illness_type_7": "Mental health - such as depression, anxiety, schizophrenia or bipolar", "illness_type_9": "Socially or behaviourally - such as those associated with autism spectral disorder (ASD) including Aspergers’ or attention deficit hyperactivity disorder (ADHD))", - "illness_type_10": "Other", - "divider": true, - "condition_effects_prefer_not_to_say": "Prefer not to say" + "illness_type_10": "Other" } } } @@ -1019,18 +1027,6 @@ } } }, - "tenancy_start_date": { - "header": "", - "description": "", - "questions": { - "startdate": { - "check_answer_label": "When is the tenancy start date?", - "header": "What is the tenancy start date?", - "hint_text": "For example, 27 3 2007", - "type": "date" - } - } - }, "starter_tenancy": { "header": "", "description": "", @@ -1135,7 +1131,7 @@ "header": "", "description": "", "questions": { - "property_location": { + "la": { "check_answer_label": "Property Location", "header": "Property location", "hint_text": "", @@ -1518,7 +1514,7 @@ "header": "", "description": "", "questions": { - "property_reference": { + "propcode": { "check_answer_label": "What’s the property reference?", "header": "What's the property reference?", "hint_text": "", @@ -1567,7 +1563,7 @@ "header": "", "description": "", "questions": { - "property_major_repairs": { + "majorrepairs": { "check_answer_label": "Were major repairs carried out during the void period?", "header": "Were any major repairs completed during the void period?", "hint_text": "", @@ -1577,10 +1573,10 @@ "1": "No" }, "conditional_for": { - "property_major_repairs_date": ["Yes"] + "mrcdate": ["Yes"] } }, - "property_major_repairs_date": { + "mrcdate": { "check_answer_label": "What was the major repairs completion date?", "header": "What was the major repairs completion date?", "hint_text": "For example, 27 3 2007", @@ -1700,7 +1696,7 @@ "header": "", "description": "", "questions": { - "housing_benefit": { + "hb": { "check_answer_label": "Universal Credit & Housing Benefit", "header": "Is the tenant likely to be in receipt of any of these housing-related benefits?", "hint_text": "", @@ -1813,20 +1809,21 @@ "step": 1, "readonly": true }, - "outstanding_rent_or_charges": { + "hbrentshortfall": { "check_answer_label": "After housing benefit and/or housing element of UC payment is received, will there be an outstanding amount for basic rent and/or benefit eligible charges?", "header": "After housing benefit and/or housing element of UC payment is received, will there be an outstanding amount for basic rent and/or benefit eligible charges?", "hint_text": "", "type": "radio", "answer_options": { "0": "Yes", - "1": "No" + "1": "No", + "2": "Do not know" }, "conditional_for": { - "outstanding_amount": ["Yes"] + "tshortfall": ["Yes"] } }, - "outstanding_amount": { + "tshortfall": { "check_answer_label": "Outstanding amount", "header": "What do you expect the amount to be?", "hint_text": "If the amount is unknown you can estimate", @@ -1894,7 +1891,7 @@ "header": "", "description": "", "questions": { - "previous_la": { + "prevloc": { "check_answer_label": "The LA in which household lived immediately before this letting\t", "header": "Which local authority area did the household live in immediately before this letting?", "hint_text": "Includes temporary accommodation", @@ -2240,7 +2237,8 @@ "type": "radio", "answer_options": { "0": "Yes", - "1": "No" + "1": "No", + "2": "Do not know" }, "conditional_for": { "reasonable_preference_reason": ["Yes"] diff --git a/config/forms/schema/2021_2022.json b/config/forms/schema/2021_2022.json new file mode 100644 index 000000000..cd8f13530 --- /dev/null +++ b/config/forms/schema/2021_2022.json @@ -0,0 +1,112 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "$id": "https://example.com/product.schema.json", + "title": "Form", + "description": "A form", + "type": "object", + "required": ["form_type", "start_year", "end_year", "sections"], + "properties": { + "form_type": { + "description": "", + "type": "string" + }, + "start_year": { + "description": "", + "type": "integer" + }, + "end_year": { + "description": "", + "type": "integer" + }, + "sections": { + "type": "object", + "patternProperties": { + "[a-z_]+": { + "description": "", + "type": "object", + "properties": { + "label": { + "description": "", + "type": "string" + }, + "subsections": { + "type": "object", + "patternProperties": { + "[a-z_]+": { + "description": "", + "type": "object", + "required": ["label"], + "properties": { + "label": { + "description": "", + "type": "string" + }, + "pages": { + "type": "object", + "patternProperties": { + "[a-z_]+": { + "description": "", + "type": "object", + "properties": { + "header": { + "description": "", + "type": "string" + }, + "description": { + "description": "", + "type": "string" + }, + "questions": { + "type": "object", + "patternProperties": { + "[a-z_]+": { + "description": "", + "type": "object", + "required": ["header", "check_answer_label"], + "properties": { + "check_answer_label": { + "description": "", + "type": "string" + }, + "header": { + "description": "", + "type": "string" + }, + "type": { + "description": "", + "type": "string" + }, + "hint_text": { + "description": "", + "type": "string" + }, + "answer_options": { + "description": "", + "type": "object" + }, + "conditional_for": { + "description": "", + "type": "object" + } + } + } + } + } + }, + "minProperties": 1 + } + } + } + }, + "minProperties": 1 + } + } + } + }, + "minProperties": 2 + } + }, + "minProperties": 1 + } + } +} \ No newline at end of file diff --git a/config/forms/schema/generic.json b/config/forms/schema/generic.json new file mode 100644 index 000000000..1499878f0 --- /dev/null +++ b/config/forms/schema/generic.json @@ -0,0 +1,129 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "$id": "https://example.com/product.schema.json", + "title": "Form", + "description": "A form", + "type": "object", + "required": ["form_type", "start_year", "end_year", "sections"], + "properties": { + "form_type": { + "description": "", + "type": "string" + }, + "start_year": { + "description": "", + "type": "integer" + }, + "end_year": { + "description": "", + "type": "integer" + }, + "sections": { + "type": "object", + "patternProperties": { + "[a-z_]+": { + "description": "Section Name", + "type": "object", + "properties": { + "label": { + "description": "", + "type": "string" + }, + "subsections": { + "type": "object", + "patternProperties": { + "[a-z_]+": { + "description": "SubSection Name", + "type": "object", + "required": ["label"], + "properties": { + "label": { + "description": "", + "type": "string" + }, + "pages": { + "type": "object", + "patternProperties": { + "^(?!(conditional_route_to))[a-z_]+$": { + "description": "Page Name", + "type": "object", + "required": ["header", "questions"], + "properties": { + "header": { + "description": "", + "type": "string" + }, + "description": { + "description": "", + "type": "string" + }, + "questions": { + "type": "object", + "patternProperties": { + "[a-z_]+": { + "description": "Question Name", + "type": "object", + "required": ["header", "type"], + "properties": { + "header": { + "description": "", + "type": "string" + }, + "type": { + "description": "", + "type": "string" + }, + "check_answer_label": { + "description": "", + "type": "string", + "optional": "true" + } + }, + "additionalProperties": { + "hint_text": { + "optional": "true", + "description": "", + "type": "string" + }, + "answer_options": { + "optional": "true", + "description": "", + "type": "object" + }, + "check_answer_label": { + "description": "", + "type": "string" + }, + "conditional_for": { + "description": "", + "type": "object" + } + }, + "minProperties": 1 + } + } + } + }, + "additionalProperties": { + "conditional_route_to": { + "description": "", + "type": "object" + } + }, + "minProperties": 1 + } + } + } + }, + "minProperties": 1 + } + } + } + }, + "minProperties": 2 + } + }, + "minProperties": 1 + } + } +} \ No newline at end of file diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index dc6872604..49866c93b 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -24,7 +24,7 @@ Devise.setup do |config| # Configure the e-mail address which will be shown in Devise::Mailer, # note that it will be overwritten if you use your own mailer class # with default "from" parameter. - config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com" + config.mailer_sender = ENV["CORE_EMAIL_USERNAME"] # Configure the class responsible to send e-mails. # config.mailer = 'Devise::Mailer' @@ -178,7 +178,7 @@ Devise.setup do |config| # ==> Configuration for :validatable # Range for password length. - config.password_length = 6..128 + config.password_length = 8..128 # Email regex used to validate email formats. It simply asserts that # one (and only one) @ exists in the given string. This is mainly @@ -224,7 +224,7 @@ Devise.setup do |config| # Time interval you can reset your password with a reset password key. # Don't put a too small interval or your users won't have the time to # change their passwords. - config.reset_password_within = 6.hours + config.reset_password_within = 3.hours # When set to false, does not sign a user in automatically after their password is # reset. Defaults to true, so a user is signed in automatically after a reset. diff --git a/db/migrate/20211108091320_change_checkbox_types.rb b/db/migrate/20211108091320_change_checkbox_types.rb new file mode 100644 index 000000000..67b2ac00a --- /dev/null +++ b/db/migrate/20211108091320_change_checkbox_types.rb @@ -0,0 +1,15 @@ +class ChangeCheckboxTypes < ActiveRecord::Migration[6.1] + def up + change_table :case_logs, bulk: true do |t| + t.change :accessibility_requirements_prefer_not_to_say, "integer USING accessibility_requirements_prefer_not_to_say::integer" + t.change :condition_effects_prefer_not_to_say, "integer USING condition_effects_prefer_not_to_say::integer" + end + end + + def down + change_table :case_logs, bulk: true do |t| + t.change :accessibility_requirements_prefer_not_to_say, "boolean USING accessibility_requirements_prefer_not_to_say::boolean" + t.change :condition_effects_prefer_not_to_say, "boolean USING condition_effects_prefer_not_to_say::boolean" + end + end +end diff --git a/db/migrate/20211108134601_further_core_migrations.rb b/db/migrate/20211108134601_further_core_migrations.rb new file mode 100644 index 000000000..b6008e66e --- /dev/null +++ b/db/migrate/20211108134601_further_core_migrations.rb @@ -0,0 +1,57 @@ +class FurtherCoreMigrations < ActiveRecord::Migration[6.1] + def up + change_table :case_logs, bulk: true do |t| + t.remove :condition_effects_prefer_not_to_say + t.remove :reason_for_leaving_last_settled_home + t.column :reason, :integer + t.remove :property_reference + t.column :propcode, :string + t.remove :property_major_repairs + t.column :majorrepairs, :integer + t.remove :property_location + t.column :la, :string + t.remove :previous_la + t.column :prevloc, :string + t.remove :housing_benefit + t.column :hb, :integer + t.remove :outstanding_rent_or_charges + t.column :hbrentshortfall, :integer + t.remove :outstanding_amount + t.column :tshortfall, :integer + t.column :postcode, :string + t.column :postcod2, :string + t.column :ppostc1, :string + t.column :ppostc2, :string + t.remove :property_relet + t.column :property_relet, :integer + end + end + + def down + change_table :case_logs, bulk: true do |t| + t.column :condition_effects_prefer_not_to_say, :integer + t.column :reason_for_leaving_last_settled_home, :string + t.remove :reason + t.column :property_reference, :string + t.remove :propcode + t.column :property_major_repairs, :string + t.remove :majorrepairs + t.column :property_location, :string + t.remove :la + t.column :previous_la, :string + t.remove :prevloc + t.column :housing_benefit, :string + t.remove :hb + t.column :outstanding_rent_or_charges, :string + t.remove :hbrentshortfall + t.column :outstanding_amount, :string + t.remove :tshortfall + t.remove :postcode + t.remove :postcod2 + t.remove :ppostc1 + t.remove :ppostc2 + t.remove :property_relet + t.column :property_relet, :string + end + end +end diff --git a/db/migrate/20211110140928_add_mrc_dates.rb b/db/migrate/20211110140928_add_mrc_dates.rb new file mode 100644 index 000000000..08c1c70d3 --- /dev/null +++ b/db/migrate/20211110140928_add_mrc_dates.rb @@ -0,0 +1,21 @@ +class AddMrcDates < ActiveRecord::Migration[6.1] + def up + change_table :case_logs, bulk: true do |t| + t.remove :property_major_repairs_date + t.column :mrcdate, :datetime + t.column :mrcday, :integer + t.column :mrcmonth, :integer + t.column :mrcyear, :integer + end + end + + def down + change_table :case_logs, bulk: true do |t| + t.column :property_major_repairs_date, :string + t.remove :mrcdate + t.remove :mrcday + t.remove :mrcmonth + t.remove :mrcyear + end + end +end diff --git a/db/migrate/20211111143319_add_other_members_column.rb b/db/migrate/20211111143319_add_other_members_column.rb new file mode 100644 index 000000000..2c6ca2658 --- /dev/null +++ b/db/migrate/20211111143319_add_other_members_column.rb @@ -0,0 +1,7 @@ +class AddOtherMembersColumn < ActiveRecord::Migration[6.1] + def change + change_table :case_logs, bulk: true do |t| + t.column :other_hhmemb, :integer + end + end +end diff --git a/db/migrate/20211112105348_add_incref_field.rb b/db/migrate/20211112105348_add_incref_field.rb new file mode 100644 index 000000000..ece9a458b --- /dev/null +++ b/db/migrate/20211112105348_add_incref_field.rb @@ -0,0 +1,7 @@ +class AddIncrefField < ActiveRecord::Migration[6.1] + def change + change_table :case_logs, bulk: true do |t| + t.column :incref, :integer + end + end +end diff --git a/db/schema.rb b/db/schema.rb index a7dcf2ea9..10c5d7d97 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_11_05_164644) do +ActiveRecord::Schema.define(version: 2021_11_12_105348) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -57,7 +57,6 @@ ActiveRecord::Schema.define(version: 2021_11_05_164644) do t.string "sex8" t.integer "ecstat8" t.integer "homeless" - t.string "reason_for_leaving_last_settled_home" t.integer "underoccupation_benefitcap" t.integer "leftreg" t.integer "reservist" @@ -73,40 +72,31 @@ ActiveRecord::Schema.define(version: 2021_11_05_164644) do t.integer "tenancy" t.string "lettype" t.integer "landlord" - t.string "property_location" t.string "previous_postcode" - t.string "property_relet" t.integer "rsnvac" - t.string "property_reference" t.integer "unittype_gn" t.string "property_building_type" t.integer "beds" t.string "property_void_date" - t.string "property_major_repairs" - t.string "property_major_repairs_date" t.integer "offered" t.integer "wchair" t.integer "earnings" t.integer "incfreq" t.integer "benefits" - t.string "housing_benefit" t.integer "period" t.integer "brent" t.integer "scharge" t.integer "pscharge" t.integer "supcharg" t.integer "tcharge" - t.string "outstanding_amount" t.integer "layear" t.integer "lawaitlist" - t.string "previous_la" t.string "property_postcode" t.integer "reasonpref" t.string "reasonable_preference_reason" t.integer "cbl" t.integer "chr" t.integer "cap" - t.string "outstanding_rent_or_charges" t.string "other_reason_for_leaving_last_settled_home" t.integer "housingneeds_a" t.integer "housingneeds_b" @@ -114,7 +104,7 @@ ActiveRecord::Schema.define(version: 2021_11_05_164644) do t.integer "housingneeds_f" t.integer "housingneeds_g" t.integer "housingneeds_h" - t.boolean "accessibility_requirements_prefer_not_to_say" + t.integer "accessibility_requirements_prefer_not_to_say" t.integer "illness_type_1" t.integer "illness_type_2" t.integer "illness_type_3" @@ -125,7 +115,6 @@ ActiveRecord::Schema.define(version: 2021_11_05_164644) do t.integer "illness_type_7" t.integer "illness_type_9" t.integer "illness_type_10" - t.boolean "condition_effects_prefer_not_to_say" t.integer "rp_homeless" t.integer "rp_insan_unsat" t.integer "rp_medwel" @@ -133,8 +122,6 @@ ActiveRecord::Schema.define(version: 2021_11_05_164644) do t.integer "rp_dontknow" t.datetime "discarded_at" t.string "tenancyother" - t.integer "override_net_income_validation" - t.string "net_income_known" t.string "gdpr_acceptance" t.string "gdpr_declined" t.string "property_owner_organisation" @@ -146,6 +133,27 @@ ActiveRecord::Schema.define(version: 2021_11_05_164644) do t.string "needs_type" t.string "sale_completion_date" t.string "purchaser_code" + t.integer "override_net_income_validation" + t.string "net_income_known" + t.integer "reason" + t.string "propcode" + t.integer "majorrepairs" + t.string "la" + t.string "prevloc" + t.integer "hb" + t.integer "hbrentshortfall" + t.integer "tshortfall" + t.string "postcode" + t.string "postcod2" + t.string "ppostc1" + t.string "ppostc2" + t.integer "property_relet" + t.datetime "mrcdate" + t.integer "mrcday" + t.integer "mrcmonth" + t.integer "mrcyear" + t.integer "other_hhmemb" + t.integer "incref" t.index ["discarded_at"], name: "index_case_logs_on_discarded_at" end diff --git a/docs/api/DLUHC-CORE-Data.v1.json b/docs/api/DLUHC-CORE-Data.v1.json index 47c068472..17560d14c 100644 --- a/docs/api/DLUHC-CORE-Data.v1.json +++ b/docs/api/DLUHC-CORE-Data.v1.json @@ -263,7 +263,7 @@ "prevten": "Private sector tenancy", "armed_forces": "Yes - a regular", "ecstat1": "Full-time - 30 hours or more", - "hhmemb": 7, + "other_hhmemb": 7, "relat2": "Partner", "age2": 32, "sex2": "Male", @@ -293,7 +293,7 @@ "sex8": "Prefer not to say", "ecstat8": "Child under 16", "homeless": "No", - "reason_for_leaving_last_settled_home": "Other problems with neighbours", + "reason": "Other problems with neighbours", "underoccupation_benefitcap": "No", "leftreg": "No", "reservist": "No", @@ -309,7 +309,7 @@ "tenancy": "Fixed term – Secure", "lettype": "Affordable Rent - General Needs", "landlord": "This landlord", - "property_location": "Barnet", + "la": "Barnet", "previous_postcode": "NW1 5TY", "property_relet": "No", "rsnvac": "Relet - tenant abandoned property", @@ -318,31 +318,31 @@ "property_building_type": "dummy", "beds": 3, "property_void_date": "03/11/2019", - "property_major_repairs": "Yes", - "property_major_repairs_date": "05/05/2020", + "majorrepairs": "Yes", + "mrcdate": "05/05/2020", "offered": 2, "wchair": true, "earnings": 1000, "incfreq": "Monthly", "benefits": "Some", - "housing_benefit": "Universal Credit with housing element, but not Housing Benefit", + "hb": "Universal Credit with housing element, but not Housing Benefit", "period": "Weekly", "brent": 200, "scharge": 50, "pscharge": 40, "supcharg": 35, "tcharge": 325, - "outstanding_amount": "Yes", + "tshortfall": "Yes", "layear": "1 to 2 years", "lawaitlist": "Less than 1 year", - "previous_la": "Ashford", + "prevloc": "Ashford", "property_postcode": "SE2 6RT", "reasonpref": "Yes", "reasonable_preference_reason": "dummy", "cbl": true, "chr": false, "cap": false, - "outstanding_rent_or_charges": 25, + "hbrentshortfall": "Yes", "other_reason_for_leaving_last_settled_home": "Other reason", "housingneeds_a": true, "housingneeds_b": false, @@ -459,7 +459,7 @@ "Prefer not to say" ] }, - "hhmemb": { + "other_hhmemb": { "type": "number", "minimum": 0, "maximum": 7 @@ -727,7 +727,7 @@ "type": "string", "minLength": 1 }, - "reason_for_leaving_last_settled_home": { + "reason": { "type": "string", "minLength": 1, "enum": [ @@ -836,7 +836,7 @@ "type": "string", "minLength": 1 }, - "property_location": { + "la": { "type": "string", "minLength": 1 }, @@ -871,11 +871,11 @@ "type": "string", "minLength": 1 }, - "property_major_repairs": { + "majorrepairs": { "type": "string", "minLength": 1 }, - "property_major_repairs_date": { + "mrcdate": { "type": "string", "minLength": 1 }, @@ -902,7 +902,7 @@ "minLength": 1, "enum": ["All", "Some", "None", "Do not know"] }, - "housing_benefit": { + "hb": { "type": "string", "minLength": 1 }, @@ -925,7 +925,7 @@ "tcharge": { "type": "number" }, - "outstanding_amount": { + "tshortfall": { "type": "string", "minLength": 1 }, @@ -937,7 +937,7 @@ "type": "string", "minLength": 1 }, - "previous_la": { + "prevloc": { "type": "string", "minLength": 1 }, @@ -962,7 +962,7 @@ "cap": { "type": "boolean" }, - "outstanding_rent_or_charges": { + "hbrentshortfall": { "type": "number" }, "other_reason_for_leaving_last_settled_home": { @@ -1052,7 +1052,7 @@ "prevten", "armed_forces", "ecstat1", - "hhmemb", + "other_hhmemb", "relat2", "age2", "sex2", @@ -1082,7 +1082,7 @@ "sex8", "ecstat8", "homeless", - "reason_for_leaving_last_settled_home", + "reason", "underoccupation_benefitcap", "leftreg", "reservist", @@ -1098,7 +1098,7 @@ "tenancy", "lettype", "landlord", - "property_location", + "la", "previous_postcode", "property_relet", "rsnvac", @@ -1107,31 +1107,31 @@ "property_building_type", "beds", "property_void_date", - "property_major_repairs", - "property_major_repairs_date", + "majorrepairs", + "mrcdate", "offered", "wchair", "earnings", "incfreq", "benefits", - "housing_benefit", + "hb", "period", "brent", "scharge", "pscharge", "supcharg", "tcharge", - "outstanding_amount", + "tshortfall", "layear", "lawaitlist", - "previous_la", + "prevloc", "property_postcode", "reasonpref", "reasonable_preference_reason", "cbl", "chr", "cap", - "outstanding_rent_or_charges", + "hbrentshortfall", "other_reason_for_leaving_last_settled_home", "housingneeds_a", "housingneeds_b", diff --git a/lib/tasks/form_definition.rake b/lib/tasks/form_definition.rake new file mode 100644 index 000000000..3a5128138 --- /dev/null +++ b/lib/tasks/form_definition.rake @@ -0,0 +1,51 @@ +require "json" +require "json-schema" +# rubocop:disable Lint/ShadowingOuterLocalVariable +def get_all_form_paths(directories) + form_paths = [] + directories.each do |directory| + Dir.glob("#{directory}/*.json").each do |form_path| + form_paths.push(form_path) + end + end + form_paths +end + +namespace :form_definition do + desc "Validate JSON against Generic Form Schema" + task validate: :environment do + puts Rails.root.to_s + path = "config/forms/schema/generic.json" + + file = File.open(path) + schema = JSON.parse(file.read) + metaschema = JSON::Validator.validator_for_name("draft4").metaschema + + puts path + + if JSON::Validator.validate(metaschema, schema) + puts "schema valid" + else + puts "schema not valid" + return + end + + directories = ["config/forms", "spec/fixtures/forms"] + # directories = ["config/forms"] + + get_all_form_paths(directories).each do |path| + puts path + file = File.open(path) + data = JSON.parse(file.read) + + puts JSON::Validator.fully_validate(schema, data, strict: true) + + begin + JSON::Validator.validate!(schema, data) + rescue JSON::Schema::ValidationError => e + e.message + end + end + end +end +# rubocop:enable Lint/ShadowingOuterLocalVariable diff --git a/spec/controllers/case_logs_controller_spec.rb b/spec/controllers/case_logs_controller_spec.rb index a6a3bf2b3..1ae6df8a3 100644 --- a/spec/controllers/case_logs_controller_spec.rb +++ b/spec/controllers/case_logs_controller_spec.rb @@ -152,6 +152,55 @@ RSpec.describe CaseLogsController, type: :controller do expect(response).to redirect_to("/case_logs/#{id}/conditional_question_no_page") end end + + context "partition postcode" do + let(:case_log_with_postcode) do + { + property_postcode: "M1 1AE", + previous_postcode: "M2 2AE", + page: "property_postcode", + } + end + it "saves full and partial postcodes" do + post :submit_form, params: { id: id, case_log: case_log_with_postcode } + case_log.reload + + expect(case_log.property_postcode).to eq("M1 1AE") + expect(case_log.postcode).to eq("M1") + expect(case_log.postcod2).to eq("1AE") + end + + it "saves full and partial previous postcodes" do + post :submit_form, params: { id: id, case_log: case_log_with_postcode } + case_log.reload + + expect(case_log.previous_postcode).to eq("M2 2AE") + expect(case_log.ppostc1).to eq("M2") + expect(case_log.ppostc2).to eq("2AE") + end + end + + context "partition date" do + let(:case_log_with_date) do + { + "mrcdate(1i)": "2021", + "mrcdate(2i)": "05", + "mrcdate(3i)": "04", + page: "major_repairs_date", + } + end + it "saves full and partial dates" do + post :submit_form, params: { id: id, case_log: case_log_with_date } + case_log.reload + + expect(case_log.mrcdate.day).to eq(4) + expect(case_log.mrcdate.month).to eq(5) + expect(case_log.mrcdate.year).to eq(2021) + expect(case_log.mrcday).to eq(4) + expect(case_log.mrcmonth).to eq(5) + expect(case_log.mrcyear).to eq(2021) + end + end end describe "get_next_page_path" do diff --git a/spec/factories/case_log.rb b/spec/factories/case_log.rb index 4528a7749..b46606279 100644 --- a/spec/factories/case_log.rb +++ b/spec/factories/case_log.rb @@ -4,8 +4,8 @@ FactoryBot.define do trait :in_progress do status { 1 } tenant_code { "TH356" } - property_postcode { "SW2 6HI" } - previous_postcode { "P0 5ST" } + property_postcode { "P0 5ST" } + previous_postcode { "SW2 6HI" } age1 { "17" } end trait :completed do diff --git a/spec/features/case_log_spec.rb b/spec/features/case_log_spec.rb index ca1b31563..77e56bf20 100644 --- a/spec/features/case_log_spec.rb +++ b/spec/features/case_log_spec.rb @@ -13,7 +13,7 @@ RSpec.describe "Form Features" do tenant_code: { type: "text", answer: "BZ737", path: "tenant_code" }, age1: { type: "numeric", answer: 25, path: "person_1_age" }, sex1: { type: "radio", answer: "Female", path: "person_1_gender" }, - hhmemb: { type: "numeric", answer: 2, path: "household_number_of_other_members" }, + other_hhmemb: { type: "numeric", answer: 2, path: "household_number_of_other_members" }, } def fill_in_number_question(case_log_id, question, value, path) @@ -29,7 +29,7 @@ RSpec.describe "Form Features" do click_button("Save and continue") choose("case-log-benefits-all-field") click_button("Save and continue") - choose("case-log-housing-benefit-housing-benefit-but-not-universal-credit-field") + choose("case-log-hb-housing-benefit-but-not-universal-credit-field") click_button("Save and continue") end @@ -179,8 +179,8 @@ RSpec.describe "Form Features" do end it "displays number answers in inputs if they are already saved" do - visit("/case_logs/#{id}/previous_postcode") - expect(page).to have_field("case-log-previous-postcode-field", with: "P0 5ST") + visit("/case_logs/#{id}/property_postcode") + expect(page).to have_field("case-log-property-postcode-field", with: "P0 5ST") end it "displays text answers in inputs if they are already saved" do @@ -269,7 +269,7 @@ RSpec.describe "Form Features" do let(:last_question_for_subsection) { "household_number_of_other_members" } it "redirects to the check answers page when answering the last question and clicking save and continue" do - fill_in_number_question(id, "hhmemb", 0, last_question_for_subsection) + fill_in_number_question(id, "other_hhmemb", 0, last_question_for_subsection) expect(page).to have_current_path("/case_logs/#{id}/#{subsection}/check_answers") end @@ -435,7 +435,7 @@ RSpec.describe "Form Features" do fill_in("case-log-earnings-field", with: income_under_soft_limit) click_button("Save and continue") click_link(text: "Back") - expect(page).not_to have_content("Are you sure this is correct?") + expect(page).to have_no_content("Are you sure this is correct?") end it "does not clear the confirmation question if the page is returned to using the back button and the amount is still over the soft limit", js: true do diff --git a/spec/features/user_spec.rb b/spec/features/user_spec.rb index 408ffbd40..3f758ec74 100644 --- a/spec/features/user_spec.rb +++ b/spec/features/user_spec.rb @@ -43,5 +43,11 @@ RSpec.describe "User Features" do click_button("Send email") expect(page).to have_current_path("/confirmations/reset?email=idontexist%40example.com") end + + it " is sent a reset password email" do + visit("/users/password/new") + fill_in("user_email", with: "test@example.com") + expect { click_button("Send email") }.to change { ActionMailer::Base.deliveries.count }.by(1) + end end end diff --git a/spec/fixtures/complete_case_log.json b/spec/fixtures/complete_case_log.json index 3d466170b..4656a04f8 100644 --- a/spec/fixtures/complete_case_log.json +++ b/spec/fixtures/complete_case_log.json @@ -8,7 +8,8 @@ "prevten": "Private sector tenancy", "armed_forces": "Yes - a regular", "ecstat1": "Full-time - 30 hours or more", - "hhmemb": 7, + "other_hhmemb": 7, + "hhmemb": 8, "relat2": "Partner", "age2": 32, "sex2": "Male", @@ -38,7 +39,7 @@ "sex8": "Prefer not to say", "ecstat8": "Child under 16", "homeless": "Yes - other homelessness", - "reason_for_leaving_last_settled_home": "Other problems with neighbours", + "reason": 1, "underoccupation_benefitcap": "No", "leftreg": "No - they left up to 5 years ago", "reservist": "No", @@ -54,8 +55,8 @@ "tenancy": "Fixed term – Secure", "lettype": "Affordable Rent - General Needs", "landlord": "This landlord", - "property_location": "Barnet", - "previous_postcode": "NW1 5TY", + "la": "Barnet", + "property_postcode": "NW1 5TY", "property_relet": "No", "rsnvac": "Relet - tenant abandoned property", "property_reference": "P9876", @@ -63,15 +64,18 @@ "property_building_type": "dummy", "beds": 3, "property_void_date": "03/11/2019", - "property_major_repairs": "Yes", - "property_major_repairs_date": "05/05/2020", + "majorrepairs": "Yes", + "mrcdate": "05/05/2020", + "mrcday": 5, + "mrcmonth": 5, + "mrcyear": 2020, "offered": 2, "wchair": "Yes", "net_income_known": "Yes", "earnings": 0, "incfreq": null, "benefits": "Some", - "housing_benefit": "Universal Credit with housing element, but not Housing Benefit", + "hb": "Universal Credit with housing element, but not Housing Benefit", "period": "Fortnightly", "brent": 200, "scharge": 50, @@ -81,14 +85,15 @@ "outstanding_amount": "Yes", "layear": "1 to 2 years", "lawaitlist": "Less than 1 year", - "previous_la": "Ashford", - "property_postcode": "SE2 6RT", + "prevloc": "Ashford", + "previous_postcode": "SE2 6RT", "reasonpref": "Yes", "reasonable_preference_reason": "dummy", "cbl": "Yes", "chr": "Yes", "cap": "No", - "outstanding_rent_or_charges": 25, + "hbrentshortfall": "Yes", + "tshortfall": 12, "other_reason_for_leaving_last_settled_home": null, "housingneeds_a": "Yes", "housingneeds_b": "No", @@ -125,6 +130,12 @@ "intermediate_rent_product_name": "", "needs_type": "", "sale_completion_date": "", - "purchaser_code": "" + "purchaser_code": "", + "propcode": "123", + "majorrepairs": "Yes", + "postcode": "a1", + "postcod2": "w3", + "ppostc1": "w3", + "ppostc2": "w3" } } diff --git a/spec/fixtures/forms/test_form.json b/spec/fixtures/forms/test_form.json index a52768299..28feb44b9 100644 --- a/spec/fixtures/forms/test_form.json +++ b/spec/fixtures/forms/test_form.json @@ -1,526 +1,543 @@ { - "form_type": "lettings", - "sections": { - "household": { - "label": "About the household", - "subsections": { - "household_characteristics": { - "label": "Household characteristics", - "pages": { - "tenant_code": { - "questions": { - "tenant_code": { - "check_answer_label": "Tenant code", - "header": "What is the tenant code?", - "type": "text" - } - } - }, - "person_1_age": { - "questions": { - "age1": { - "check_answer_label": "Tenant's age", - "header": "What is the tenant's age?", - "type": "numeric", - "min": 0, - "max": 150, - "step": 1 - } - } - }, - "person_1_gender": { - "questions": { - "sex1": { - "check_answer_label": "Tenant's gender", - "header": "Which of these best describes the tenant's gender identity?", - "type": "radio", - "answer_options": { - "0": "Female", - "1": "Male", - "2": "Non-binary", - "3": "Prefer not to say" + "form_type": "lettings", + "sections": { + "household": { + "label": "About the household", + "subsections": { + "household_characteristics": { + "label": "Household characteristics", + "pages": { + "tenant_code": { + "questions": { + "tenant_code": { + "check_answer_label": "Tenant code", + "header": "What is the tenant code?", + "type": "text" } } - } - }, - "household_number_of_other_members": { - "questions": { - "hhmemb": { - "check_answer_label": "Number of Other Household Members", - "header": "How many other people are there in the household?", - "hint_text": "The maximum number of others is 1", - "type": "numeric", - "min": 0, - "max": 1, - "step": 1, - "conditional_for": { - "relat2": ">0", - "age2": ">0", - "sex2": ">0", - "ecstat2": ">0" - } - }, - "relat2": { - "check_answer_label": "Person 2's relationship to lead tenant", - "header": "What's person 2's relationship to lead tenant", - "type": "radio", - "answer_options": { - "0": "Other", - "1": "Prefer not to say" + }, + "person_1_age": { + "questions": { + "age1": { + "check_answer_label": "Tenant's age", + "header": "What is the tenant's age?", + "type": "numeric", + "min": 0, + "max": 150, + "step": 1 } - }, - "age2": { - "check_answer_label": "Person 2's age", - "header": "What's person 2's age", - "type": "numeric", - "min": 0, - "max": 150, - "step": 1 - }, - "sex2": { - "check_answer_label": "Person 2's gender", - "header": "Which of these best describes person 2's gender identity?", - "type": "radio", - "answer_options": { - "0": "Female", - "1": "Male", - "2": "Non-binary", - "3": "Prefer not to say" + } + }, + "person_1_gender": { + "questions": { + "sex1": { + "check_answer_label": "Tenant's gender", + "header": "Which of these best describes the tenant's gender identity?", + "type": "radio", + "answer_options": { + "0": "Female", + "1": "Male", + "2": "Non-binary", + "3": "Prefer not to say" + } } - }, - "ecstat2": { - "check_answer_label": "Person 2's Work", - "header": "Which of these best describes person 2's working situation?", - "type": "radio", - "answer_options": { - "0": "Other", - "1": "Prefer not to say" + } + }, + "household_number_of_other_members": { + "questions": { + "other_hhmemb": { + "check_answer_label": "Number of Other Household Members", + "header": "How many other people are there in the household?", + "hint_text": "The maximum number of others is 1", + "type": "numeric", + "min": 0, + "max": 1, + "step": 1, + "conditional_for": { + "relat2": ">0", + "age2": ">0", + "sex2": ">0", + "ecstat2": ">0" + } + }, + "relat2": { + "check_answer_label": "Person 2's relationship to lead tenant", + "header": "What's person 2's relationship to lead tenant", + "type": "radio", + "answer_options": { + "0": "Other", + "1": "Prefer not to say" + } + }, + "age2": { + "check_answer_label": "Person 2's age", + "header": "What's person 2's age", + "type": "numeric", + "min": 0, + "max": 150, + "step": 1 + }, + "sex2": { + "check_answer_label": "Person 2's gender", + "header": "Which of these best describes person 2's gender identity?", + "type": "radio", + "answer_options": { + "0": "Female", + "1": "Male", + "2": "Non-binary", + "3": "Prefer not to say" + } + }, + "ecstat2": { + "check_answer_label": "Person 2's Work", + "header": "Which of these best describes person 2's working situation?", + "type": "radio", + "answer_options": { + "0": "Other", + "1": "Prefer not to say" + } } } } } - } - }, - "household_needs": { - "label": "Household needs", - "pages": { - "armed_forces": { - "header": "Experience of the UK Armed Forces", - "questions": { - "armed_forces": { - "header": "Has the tenant ever served in the UK armed forces?", - "type": "radio", - "check_answer_label": "Armed Forces", - "answer_options": { - "0": "Yes - a regular", - "1": "Yes - a reserve", - "2": "No", - "3": "Prefer not to say" + }, + "household_needs": { + "label": "Household needs", + "pages": { + "armed_forces": { + "header": "Experience of the UK Armed Forces", + "questions": { + "armed_forces": { + "header": "Has the tenant ever served in the UK armed forces?", + "type": "radio", + "check_answer_label": "Armed Forces", + "answer_options": { + "0": "Yes - a regular", + "1": "Yes - a reserve", + "2": "No", + "3": "Prefer not to say" + }, + "conditional_for": { + "leftreg": ["Yes - a regular", "Yes - a reserve"], + "reservist": ["Yes - a regular", "Yes - a reserve"] + } }, - "conditional_for": { - "leftreg": ["Yes - a regular", "Yes - a reserve"], - "reservist": ["Yes - a regular", "Yes - a reserve"] - } - }, - "leftreg": { - "header": "Are they still serving?", - "type": "radio", - "check_answer_label": "When did they leave the Armed Forces?", - "answer_options": { - "0": "Yes", - "1": "No - they left up to 5 years ago", - "2": "No - they left more than 5 years ago", - "3": "Prefer not to say" - } - }, - "reservist": { - "header": "Were they seriously injured or ill as a result of their service?", - "type": "radio", - "check_answer_label": "Has anyone in the household been seriously injured or ill as a result of their service in the armed forces?", - "answer_options": { - "0": "Yes", - "1": "No", - "2": "Prefer not to say" + "leftreg": { + "header": "Are they still serving?", + "type": "radio", + "check_answer_label": "When did they leave the Armed Forces?", + "answer_options": { + "0": "Yes", + "1": "No - they left up to 5 years ago", + "2": "No - they left more than 5 years ago", + "3": "Prefer not to say" + } + }, + "reservist": { + "header": "Were they seriously injured or ill as a result of their service?", + "type": "radio", + "check_answer_label": "Has anyone in the household been seriously injured or ill as a result of their service in the armed forces?", + "answer_options": { + "0": "Yes", + "1": "No", + "2": "Prefer not to say" + } } } - } - }, - "medical_conditions": { - "questions": { - "illness": { - "header": "Does anyone in the household have any of the following that they expect to last for 12 months or more:", - "type": "radio", - "check_answer_label": "Physical, mental health or illness in the household", - "answer_options": { - "0": "Yes", - "1": "No", - "2": "Do not know", - "3": "Prefer not to say" + }, + "medical_conditions": { + "questions": { + "illness": { + "header": "Does anyone in the household have any of the following that they expect to last for 12 months or more:", + "type": "radio", + "check_answer_label": "Physical, mental health or illness in the household", + "answer_options": { + "0": "Yes", + "1": "No", + "2": "Do not know", + "3": "Prefer not to say" + } } } - } - }, - "accessibility_requirements": { - "questions": { - "accessibility_requirements": { - "header": "Are any of these affected by their condition or illness?", - "hint_text": "Select all that apply", - "type": "checkbox", - "check_answer_label": "Disability requirements", - "answer_options": { - "housingneeds_a": "Fully wheelchair accessible housing", - "housingneeds_b": "Wheelchair access to essential rooms", - "housingneeds_c": "Level access housing", - "divider_a": true, - "housingneeds_h": "Do not know" + }, + "accessibility_requirements": { + "questions": { + "accessibility_requirements": { + "header": "Are any of these affected by their condition or illness?", + "hint_text": "Select all that apply", + "type": "checkbox", + "check_answer_label": "Disability requirements", + "answer_options": { + "housingneeds_a": "Fully wheelchair accessible housing", + "housingneeds_b": "Wheelchair access to essential rooms", + "housingneeds_c": "Level access housing", + "divider_a": true, + "housingneeds_h": "Do not know" + } } } - } - }, - "condition_effects": { - "questions": { - "condition_effects": { - "header": "Are any of these affected by their condition or illness?", - "hint_text": "Select all that apply", - "type": "checkbox", - "check_answer_label": "Conditions or illnesses", - "answer_options": { - "illness_type_1": "Vision - such as blindness or partial sight", - "illness_type_2": "Hearing - such as deafness or partial hearing" + }, + "condition_effects": { + "questions": { + "condition_effects": { + "header": "Are any of these affected by their condition or illness?", + "hint_text": "Select all that apply", + "type": "checkbox", + "check_answer_label": "Conditions or illnesses", + "answer_options": { + "illness_type_1": "Vision - such as blindness or partial sight", + "illness_type_2": "Hearing - such as deafness or partial hearing" + } } } } } } } - } - }, - "tenancy_and_property": { - "label": "Tenancy and property information", - "subsections": { - "tenancy_information": { - "label": "Tenancy information", - "pages": { - "tenancy_code": { - "questions": { - "tenancy_code": { - "check_answer_label": "What is the tenancy code?", - "header": "What is the tenancy code?", - "type": "text" + }, + "tenancy_and_property": { + "label": "Tenancy and property information", + "subsections": { + "tenancy_information": { + "label": "Tenancy information", + "pages": { + "tenancy_code": { + "questions": { + "tenancy_code": { + "check_answer_label": "What is the tenancy code?", + "header": "What is the tenancy code?", + "type": "text" + } } } } - } - }, - "property_information": { - "label": "Property information", - "pages": { - "property_wheelchair_accessible": { - "questions": { - "wchair": { - "check_answer_label": "Is property built or adapted to wheelchair user standards?", - "header": "Is property built or adapted to wheelchair user standards?", - "type": "radio", - "answer_options": { - "0": "Yes", - "1": "No" + }, + "property_information": { + "label": "Property information", + "pages": { + "property_wheelchair_accessible": { + "questions": { + "wchair": { + "check_answer_label": "Is property built or adapted to wheelchair user standards?", + "header": "Is property built or adapted to wheelchair user standards?", + "type": "radio", + "answer_options": { + "0": "Yes", + "1": "No" + } } } } } - } - }, - "conditional_question": { - "label": "Conditional question", - "pages": { - "conditional_question": { - "questions": { - "preg_occ": { - "check_answer_label": "Has the condition been met?", - "header": "Has the condition been met?", - "type": "radio", - "answer_options": { - "0": "Yes", - "1": "No" + }, + "conditional_question": { + "label": "Conditional question", + "pages": { + "conditional_question": { + "questions": { + "preg_occ": { + "check_answer_label": "Has the condition been met?", + "header": "Has the condition been met?", + "type": "radio", + "answer_options": { + "0": "Yes", + "1": "No" + } } - } - }, - "conditional_route_to": { - "rent": { "preg_occ": "Yes", "sex1": "Female" }, - "conditional_question_yes_page": { "preg_occ": "Yes" }, - "conditional_question_no_page": { "preg_occ": "No" } + }, + "conditional_route_to": { + "rent": { "preg_occ": "Yes", "sex1": "Female" }, + "conditional_question_yes_page": { "preg_occ": "Yes" }, + "conditional_question_no_page": { "preg_occ": "No" } + }, + "default_next_page": "check_answers" }, - "default_next_page": "check_answers" - }, - "conditional_question_yes_page": { - "questions": { - "cbl": { - "check_answer_label": "Has the next condition been met?", - "header": "Has the next condition been met?", - "type": "radio", - "answer_options": { - "0": "Yes", - "1": "No" + "conditional_question_yes_page": { + "questions": { + "cbl": { + "check_answer_label": "Has the next condition been met?", + "header": "Has the next condition been met?", + "type": "radio", + "answer_options": { + "0": "Yes", + "1": "No" + } } - } + }, + "default_next_page": "check_answers" }, - "default_next_page": "check_answers" - }, - "conditional_question_no_page": { - "questions": { - "conditional_question_no_question": { - "check_answer_label": "Has the condition not been met?", - "header": "Has the next condition not been met?", - "type": "radio", - "answer_options": { - "0": "Yes", - "1": "No" + "conditional_question_no_page": { + "questions": { + "conditional_question_no_question": { + "check_answer_label": "Has the condition not been met?", + "header": "Has the next condition not been met?", + "type": "radio", + "answer_options": { + "0": "Yes", + "1": "No" + } } - } + }, + "default_next_page": "conditional_question_no_second_page" }, - "default_next_page": "conditional_question_no_second_page" - }, - "conditional_question_no_second_page": { - "questions": { - "conditional_question_no_second_question": { - "check_answer_label": "Has the condition not been met again?", - "header": "Has the next condition not been met again?", - "type": "radio", - "answer_options": { - "0": "Yes", - "1": "No" + "conditional_question_no_second_page": { + "questions": { + "conditional_question_no_second_question": { + "check_answer_label": "Has the condition not been met again?", + "header": "Has the next condition not been met again?", + "type": "radio", + "answer_options": { + "0": "Yes", + "1": "No" + } } } } } } } - } - }, - "rent_and_charges": { - "label": "Rent and charges", - "subsections": { - "income_and_benefits": { - "label": "Income and benefits", - "pages": { - "net_income": { - "questions": { - "earnings": { - "check_answer_label": "Income", - "header": "What is the tenant’s /and partner’s combined income after tax?", - "type": "numeric", - "min": 0, - "step": "1" + }, + "rent_and_charges": { + "label": "Rent and charges", + "subsections": { + "income_and_benefits": { + "label": "Income and benefits", + "pages": { + "net_income": { + "questions": { + "earnings": { + "check_answer_label": "Income", + "header": "What is the tenant’s /and partner’s combined income after tax?", + "type": "numeric", + "min": 0, + "step": "1" + }, + "incfreq": { + "check_answer_label": "Income Frequency", + "header": "How often do they receive this income?", + "type": "radio", + "answer_options": { + "0": "Weekly", + "1": "Monthly", + "2": "Yearly" + } + } }, - "incfreq": { - "check_answer_label": "Income Frequency", - "header": "How often do they receive this income?", - "type": "radio", - "answer_options": { - "0": "Weekly", - "1": "Monthly", - "2": "Yearly" + "soft_validations": { + "override_net_income_validation": { + "check_answer_label": "Net income confirmed?", + "type": "validation_override", + "answer_options": { + "override_net_income_validation": "Yes" + } } } }, - "soft_validations": { - "override_net_income_validation": { - "check_answer_label": "Net income confirmed?", - "type": "validation_override", - "answer_options": { - "override_net_income_validation": "Yes" + "net_income_uc_proportion": { + "questions": { + "benefits": { + "check_answer_label": "Benefits as a proportion of income", + "header": "How much of the tenant’s income is from Universal Credit, state pensions or benefits?", + "type": "radio", + "answer_options": { + "0": "All", + "1": "Some" + } } } - } - }, - "net_income_uc_proportion": { - "questions": { - "benefits": { - "check_answer_label": "Benefits as a proportion of income", - "header": "How much of the tenant’s income is from Universal Credit, state pensions or benefits?", - "type": "radio", - "answer_options": { - "0": "All", - "1": "Some" - } - } - } - }, - "housing_benefit": { - "questions": { - "housing_benefit": { - "check_answer_label": "Universal Credit & Housing Benefit", - "header": "Is the tenant likely to be in receipt of any of these housing-related benefits?", - "type": "radio", - "answer_options": { - "0": "Housing Benefit, but not Universal Credit", - "1": "Prefer not to say" + }, + "housing_benefit": { + "questions": { + "hb": { + "check_answer_label": "Universal Credit & Housing Benefit", + "header": "Is the tenant likely to be in receipt of any of these housing-related benefits?", + "type": "radio", + "answer_options": { + "0": "Housing Benefit, but not Universal Credit", + "1": "Prefer not to say" + } } } } } - } - }, - "rent": { - "label": "Rent", - "pages": { - "rent": { - "questions": { - "rent_frequency": { - "check_answer_label": "Rent Period", - "header": "Which period are rent and other charges due?", - "type": "radio", - "answer_options": { - "0": "Weekly for 52 weeks", - "1": "Fortnightly" + }, + "rent": { + "label": "Rent", + "pages": { + "rent": { + "questions": { + "rent_frequency": { + "check_answer_label": "Rent Period", + "header": "Which period are rent and other charges due?", + "type": "radio", + "answer_options": { + "0": "Weekly for 52 weeks", + "1": "Fortnightly" + } + }, + "brent": { + "check_answer_label": "Basic Rent", + "header": "What is the basic rent?", + "hint_text": "Eligible for housing benefit or Universal Credit", + "type": "numeric", + "min": 0, + "step": 1, + "fields-to-add": [ + "brent", + "scharge", + "pscharge", + "supcharg" + ], + "result-field": "tcharge" + }, + "scharge": { + "check_answer_label": "Service Charge", + "header": "What is the service charge?", + "hint_text": "Eligible for housing benefit or Universal Credit", + "type": "numeric", + "min": 0, + "step": 1, + "fields-to-add": [ + "brent", + "scharge", + "pscharge", + "supcharg" + ], + "result-field": "tcharge" + }, + "pscharge": { + "check_answer_label": "Personal Service Charge", + "header": "What is the personal service charge?", + "hint_text": "Not eligible for housing benefit or Universal Credit. For example, hot water excluding water rates.", + "type": "numeric", + "min": 0, + "step": 1, + "fields-to-add": [ + "brent", + "scharge", + "pscharge", + "supcharg" + ], + "result-field": "tcharge" + }, + "supcharg": { + "check_answer_label": "Support Charge", + "header": "What is the support charge?", + "hint_text": "This is to fund housing-related support services included in the tenancy agreement", + "type": "numeric", + "min": 0, + "step": 1, + "fields-to-add": [ + "brent", + "scharge", + "pscharge", + "supcharg" + ], + "result-field": "tcharge" + }, + "tcharge": { + "check_answer_label": "Total Charge", + "header": "Total charge?", + "hint_text": "This is the total of rent and all charges", + "type": "numeric", + "min": 0, + "step": 1, + "readonly": true } - }, - "brent": { - "check_answer_label": "Basic Rent", - "header": "What is the basic rent?", - "hint_text": "Eligible for housing benefit or Universal Credit", - "type": "numeric", - "min": 0, - "step": 1, - "fields-to-add": [ - "brent", - "scharge", - "pscharge", - "supcharg" - ], - "result-field": "tcharge" - }, - "scharge": { - "check_answer_label": "Service Charge", - "header": "What is the service charge?", - "hint_text": "Eligible for housing benefit or Universal Credit", - "type": "numeric", - "min": 0, - "step": 1, - "fields-to-add": [ - "brent", - "scharge", - "pscharge", - "supcharg" - ], - "result-field": "tcharge" - }, - "pscharge": { - "check_answer_label": "Personal Service Charge", - "header": "What is the personal service charge?", - "hint_text": "Not eligible for housing benefit or Universal Credit. For example, hot water excluding water rates.", - "type": "numeric", - "min": 0, - "step": 1, - "fields-to-add": [ - "brent", - "scharge", - "pscharge", - "supcharg" - ], - "result-field": "tcharge" - }, - "supcharg": { - "check_answer_label": "Support Charge", - "header": "What is the support charge?", - "hint_text": "This is to fund housing-related support services included in the tenancy agreement", - "type": "numeric", - "min": 0, - "step": 1, - "fields-to-add": [ - "brent", - "scharge", - "pscharge", - "supcharg" - ], - "result-field": "tcharge" - }, - "tcharge": { - "check_answer_label": "Total Charge", - "header": "Total charge?", - "hint_text": "This is the total of rent and all charges", - "type": "numeric", - "min": 0, - "step": 1, - "readonly": true } } } } } - } - }, - "local_authority": { - "label": "Local authority", - "subsections": { - "local_authority": { - "label": "Local authority", - "pages": { - "time_lived_in_la": { - "questions": { - "layear": { - "check_answer_label": "How long has the household continuously lived in the local authority area where the new letting is located?", - "header": "How long has the household continuously lived in the local authority area where the new letting is located?", - "type": "radio", - "answer_options": { - "0": "Just moved to local authority area", - "1": "Less than 1 year", - "2": "1 to 2 years", - "3": "2 to 3 years", - "4": "3 to 4 years", - "5": "4 to 5 years", - "6": "5 years or more", - "7": "Do not know" + }, + "local_authority": { + "label": "Local authority", + "subsections": { + "local_authority": { + "label": "Local authority", + "pages": { + "time_lived_in_la": { + "questions": { + "layear": { + "check_answer_label": "How long has the household continuously lived in the local authority area where the new letting is located?", + "header": "How long has the household continuously lived in the local authority area where the new letting is located?", + "type": "radio", + "answer_options": { + "0": "Just moved to local authority area", + "1": "Less than 1 year", + "2": "1 to 2 years", + "3": "2 to 3 years", + "4": "3 to 4 years", + "5": "4 to 5 years", + "6": "5 years or more", + "7": "Do not know" + } } } - } - }, - "time_on_la_waiting_list": { - "questions": { - "lawaitlist": { - "check_answer_label": "How long has the household been on the local authority waiting list where the new letting is located?", - "header": "How long has the household been on the local authority waiting list where the new letting is located?", - "type": "radio", - "answer_options": { - "0": "Just moved to local authority area", - "1": "Less than 1 year", - "2": "1 to 2 years", - "3": "2 to 3 years", - "4": "3 to 4 years", - "5": "4 to 5 years", - "6": "5 years or more", - "7": "Do not know" + }, + "time_on_la_waiting_list": { + "questions": { + "lawaitlist": { + "check_answer_label": "How long has the household been on the local authority waiting list where the new letting is located?", + "header": "How long has the household been on the local authority waiting list where the new letting is located?", + "type": "radio", + "answer_options": { + "0": "Just moved to local authority area", + "1": "Less than 1 year", + "2": "1 to 2 years", + "3": "2 to 3 years", + "4": "3 to 4 years", + "5": "4 to 5 years", + "6": "5 years or more", + "7": "Do not know" + } } } - } - }, - "previous_postcode": { - "questions": { - "previous_postcode": { - "check_answer_label": "Postcode of previous accomodation if the household has moved from settled accommodation", - "header": "Postcode for the previous accommodation", - "hint_text": "If the household has moved from settled accommodation immediately prior to being re-housed", - "type": "text", - "conditional_for": { "faake_key": "fake_condition" } + }, + "property_postcode": { + "questions": { + "property_postcode": { + "check_answer_label": "Postcode of previous accomodation if the household has moved from settled accommodation", + "header": "Postcode for the previous accommodation", + "hint_text": "If the household has moved from settled accommodation immediately prior to being re-housed", + "type": "text", + "conditional_for": { "faake_key": "fake_condition" } + }, + "previous_postcode": { + "check_answer_label": "Postcode of previous accomodation if the household has moved from settled accommodation", + "header": "Postcode for the previous accommodation", + "hint_text": "If the household has moved from settled accommodation immediately prior to being re-housed", + "type": "text" + } + } + }, + "major_repairs_date": { + "questions": { + "mrcdate": { + "check_answer_label": "What was the major repairs completion date?", + "header": "What was the major repairs completion date?", + "hint_text": "For example, 27 3 2007", + "type": "date" + } } } } } } - } - }, - "submission": { - "label": "Submission", - "subsections": { - "declaration": { - "label": "Declaration", - "pages": { - "declaration": { - "questions": { - "declaration": { - "check_answer_label": "", - "header": "What is the tenant code?", - "type": "text" + }, + "submission": { + "label": "Submission", + "subsections": { + "declaration": { + "label": "Declaration", + "pages": { + "declaration": { + "questions": { + "declaration": { + "check_answer_label": "", + "header": "What is the tenant code?", + "type": "text" + } } } } @@ -528,5 +545,4 @@ } } } - } -} + } \ No newline at end of file diff --git a/spec/fixtures/forms/test_validator.json b/spec/fixtures/forms/test_validator.json new file mode 100644 index 000000000..2f8e770d3 --- /dev/null +++ b/spec/fixtures/forms/test_validator.json @@ -0,0 +1,48 @@ +{ + "form_type": "lettings", + "start_year": 2021, + "end_year": 2022, + "sections": { + "household": { + "label": "About the household", + "subsections": { + "household_characteristics": { + "label": "Household characteristics", + "ShouldThrowError": "Shouldn't be here but what you gonna do?", + "pages": { + "tenant_code": { + "header": "", + "description": "", + "ShouldThrowError": "Shouldn't be here but what you gonna do?", + "questions": { + "tenant_code": { + "check_answer_label": "Tenant code", + "header": "What is the tenant code?", + "description": "", + "type": "text" + } + }, + "conditional_route_to": {"test": "Yes"} + }, + "conditional_route_to": {"test": "Yes"}, + "person_1_age": { + "header": "", + "description": "", + "questions": { + "person_1_age": { + "check_answer_label": "Tenant's age", + "header": "What is the tenant's age?", + "hint_text": "", + "type": "numeric", + "min": 0, + "max": 120, + "step": 1 + } + } + } + } + } + } + } + } +} diff --git a/spec/helpers/check_answers_helper_spec.rb b/spec/helpers/check_answers_helper_spec.rb index fb8deec77..ac3000f6b 100644 --- a/spec/helpers/check_answers_helper_spec.rb +++ b/spec/helpers/check_answers_helper_spec.rb @@ -6,7 +6,7 @@ RSpec.describe CheckAnswersHelper do FactoryBot.create( :case_log, :in_progress, - hhmemb: 1, + other_hhmemb: 1, relat2: "Partner", ) end @@ -127,7 +127,7 @@ RSpec.describe CheckAnswersHelper do it "returns total questions" do result = total_questions(subsection, case_log, form) expect(result.class).to eq(Hash) - expected_keys = %w[earnings incfreq benefits housing_benefit] + expected_keys = %w[earnings incfreq benefits hb] expect(result.keys).to eq(expected_keys) end diff --git a/spec/helpers/tasklist_helper_spec.rb b/spec/helpers/tasklist_helper_spec.rb index db9ac3cae..e900363f2 100644 --- a/spec/helpers/tasklist_helper_spec.rb +++ b/spec/helpers/tasklist_helper_spec.rb @@ -33,7 +33,7 @@ RSpec.describe TasklistHelper do case_log["earnings"] = "value" case_log["incfreq"] = "Weekly" case_log["benefits"] = "All" - case_log["housing_benefit"] = "Do not know" + case_log["hb"] = "Do not know" status = get_subsection_status("income_and_benefits", case_log, income_and_benefits_questions) expect(status).to eq(:completed) diff --git a/spec/models/case_log_spec.rb b/spec/models/case_log_spec.rb index 75bc1f1a6..e663937db 100644 --- a/spec/models/case_log_spec.rb +++ b/spec/models/case_log_spec.rb @@ -60,7 +60,7 @@ RSpec.describe Form, type: :model do context "reason for leaving last settled home validation" do it "Reason for leaving must be don't know if reason for leaving settled home (Q9a) is don't know." do expect { - CaseLog.create!(reason_for_leaving_last_settled_home: "Do not know", + CaseLog.create!(reason: "Do not know", underoccupation_benefitcap: "Yes - benefit cap") }.to raise_error(ActiveRecord::RecordInvalid) end @@ -68,14 +68,14 @@ RSpec.describe Form, type: :model do context "other reason for leaving last settled home validation" do it "must be provided if main reason for leaving last settled home was given as other" do expect { - CaseLog.create!(reason_for_leaving_last_settled_home: "Other", + CaseLog.create!(reason: "Other", other_reason_for_leaving_last_settled_home: nil) }.to raise_error(ActiveRecord::RecordInvalid) end it "must not be provided if the main reason for leaving settled home is not other" do expect { - CaseLog.create!(reason_for_leaving_last_settled_home: "Repossession", + CaseLog.create!(reason: "Repossession", other_reason_for_leaving_last_settled_home: "the other reason provided") }.to raise_error(ActiveRecord::RecordInvalid) end @@ -109,7 +109,7 @@ RSpec.describe Form, type: :model do expect { CaseLog.create!(unittype_gn: "Shared bungalow", beds: 8, - hhmemb: 1) + other_hhmemb: 1) }.to raise_error(ActiveRecord::RecordInvalid) end @@ -117,7 +117,7 @@ RSpec.describe Form, type: :model do expect { CaseLog.create!(unittype_gn: "Shared bungalow", beds: 4, - hhmemb: 0) + other_hhmemb: 0) }.to raise_error(ActiveRecord::RecordInvalid) end @@ -139,15 +139,15 @@ RSpec.describe Form, type: :model do context "outstanding rent or charges validation" do it "must be anwered if answered yes to outstanding rent or charges" do expect { - CaseLog.create!(outstanding_rent_or_charges: "Yes", - outstanding_amount: nil) + CaseLog.create!(hbrentshortfall: "Yes", + tshortfall: nil) }.to raise_error(ActiveRecord::RecordInvalid) end it "must be not be anwered if answered no to outstanding rent or charges" do expect { - CaseLog.create!(outstanding_rent_or_charges: "No", - outstanding_amount: 99) + CaseLog.create!(hbrentshortfall: "No", + tshortfall: 99) }.to raise_error(ActiveRecord::RecordInvalid) end end diff --git a/spec/models/form_handler_spec.rb b/spec/models/form_handler_spec.rb index ff6d4dc0f..f998c5557 100644 --- a/spec/models/form_handler_spec.rb +++ b/spec/models/form_handler_spec.rb @@ -15,7 +15,7 @@ RSpec.describe FormHandler do form_handler = FormHandler.instance form = form_handler.get_form("test_form") expect(form).to be_a(Form) - expect(form.all_pages.count).to eq(22) + expect(form.all_pages.count).to eq(23) end end diff --git a/spec/models/form_spec.rb b/spec/models/form_spec.rb index f4e554356..18e15c6b4 100644 --- a/spec/models/form_spec.rb +++ b/spec/models/form_spec.rb @@ -39,7 +39,7 @@ RSpec.describe Form, type: :model do it "returns all questions for subsection" do result = form.questions_for_subsection(subsection) expect(result.length).to eq(4) - expect(result.keys).to eq(%w[earnings incfreq benefits housing_benefit]) + expect(result.keys).to eq(%w[earnings incfreq benefits hb]) end end end