Browse Source

CLDC-4204: Update bulk upload fields sales (#3223)

* CLDC-4204: Renumber fields to match spec

* CLDC-4204: Update log to csv for 2026

* CLDC-4204: Cleanup BU todo commments

* CLDC-4204: Replace BU example file

* CLDC-4204: Update row parser question titles to match form

* fixup! CLDC-4204: Update row parser question titles to match form

fix sales log typo

Co-authored-by: Oscar Richardson <116292912+oscar-richardson-softwire@users.noreply.github.com>

* fixup! CLDC-4204: Renumber fields to match spec

update dupe fields comment

Co-authored-by: Oscar Richardson <116292912+oscar-richardson-softwire@users.noreply.github.com>

* fixup! CLDC-4204: Renumber fields to match spec

check the same field as before

---------

Co-authored-by: Oscar Richardson <116292912+oscar-richardson-softwire@users.noreply.github.com>
main
Samuel Young 2 days ago committed by GitHub
parent
commit
61eb52516d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      app/helpers/bulk_upload/lettings_log_to_csv.rb
  2. 76
      app/helpers/bulk_upload/sales_log_to_csv.rb
  3. 4
      app/services/bulk_upload/lettings/year2026/csv_parser.rb
  4. 4
      app/services/bulk_upload/sales/year2026/csv_parser.rb
  5. 1058
      app/services/bulk_upload/sales/year2026/row_parser.rb
  6. 32
      spec/fixtures/files/2026_27_sales_bulk_upload.csv
  7. 2
      spec/services/bulk_upload/sales/validator_spec.rb
  8. 2
      spec/services/bulk_upload/sales/year2026/csv_parser_spec.rb
  9. 504
      spec/services/bulk_upload/sales/year2026/row_parser_spec.rb

1
app/helpers/bulk_upload/lettings_log_to_csv.rb

@ -94,7 +94,6 @@ class BulkUpload::LettingsLogToCsv
end end
def to_2026_row def to_2026_row
# TODO: CLDC-4162: Implement when 2026 format is known
[ [
overrides[:organisation_id] || log.owning_organisation&.old_visible_id, # 1 overrides[:organisation_id] || log.owning_organisation&.old_visible_id, # 1
overrides[:managing_organisation_id] || log.managing_organisation&.old_visible_id, overrides[:managing_organisation_id] || log.managing_organisation&.old_visible_id,

76
app/helpers/bulk_upload/sales_log_to_csv.rb

@ -533,7 +533,6 @@ class BulkUpload::SalesLogToCsv
end end
def to_2026_row def to_2026_row
# TODO: CLDC-4162: Implement when 2026 template is available
[ [
log.saledate&.day, log.saledate&.day,
log.saledate&.month, log.saledate&.month,
@ -552,53 +551,66 @@ class BulkUpload::SalesLogToCsv
log.privacynotice, log.privacynotice,
log.uprn, log.uprn,
log.address_line1&.tr(",", " "), # 20 log.address_line1&.tr(",", " "),
log.address_line2&.tr(",", " "), log.address_line2&.tr(",", " "),
log.town_or_city&.tr(",", " "), log.town_or_city&.tr(",", " "),
log.county&.tr(",", " "), log.county&.tr(",", " "), # 20
((log.postcode_full || "").split(" ") || [""]).first, ((log.postcode_full || "").split(" ") || [""]).first,
((log.postcode_full || "").split(" ") || [""]).last, ((log.postcode_full || "").split(" ") || [""]).last,
log.la, log.la,
log.proptype, log.proptype,
log.buildheightclass,
log.beds, log.beds,
log.builtype, log.builtype,
log.wchair, log.wchair,
log.age1, log.age1,
log.sexrab1, log.sexrab1, # 30
log.ethnic, # 30 log.gender_same_as_sex1,
log.gender_description1,
log.ethnic,
log.nationality_all_group, log.nationality_all_group,
log.ecstat1, log.ecstat1,
log.buy1livein, log.buy1livein,
{ "P" => 1, "X" => 2, "R" => 3 }[log.relat2], { "P" => 1, "X" => 2, "R" => 3 }[log.relat2],
log.age2, log.age2,
log.sexrab2, log.sexrab2,
log.gender_same_as_sex2, # 40
log.gender_description2,
log.ethnic_group2, log.ethnic_group2,
log.nationality_all_buyer2_group, log.nationality_all_buyer2_group,
log.ecstat2, log.ecstat2,
log.buy2livein, # 40 log.buy2livein,
log.hholdcount, log.hholdcount,
{ "P" => 1, "X" => 2, "R" => 3 }[log.relat3], { "P" => 1, "X" => 2, "R" => 3 }[log.relat3],
log.age3, log.age3,
log.sexrab3, log.sexrab3,
log.gender_same_as_sex3, # 50
log.gender_description3,
log.ecstat3, log.ecstat3,
{ "P" => 1, "X" => 2, "R" => 3 }[log.relat4], { "P" => 1, "X" => 2, "R" => 3 }[log.relat4],
log.age4, log.age4,
log.sexrab4, log.sexrab4,
log.gender_same_as_sex4,
log.gender_description4,
log.ecstat4, log.ecstat4,
{ "P" => 1, "X" => 2, "R" => 3 }[log.relat5], # 50 { "P" => 1, "X" => 2, "R" => 3 }[log.relat5],
log.age5, log.age5, # 60
log.sexrab5, log.sexrab5,
log.gender_same_as_sex5,
log.gender_description5,
log.ecstat5, log.ecstat5,
{ "P" => 1, "X" => 2, "R" => 3 }[log.relat6], { "P" => 1, "X" => 2, "R" => 3 }[log.relat6],
log.age6, log.age6,
log.sexrab6, log.sexrab6,
log.ecstat6, log.gender_same_as_sex6,
log.gender_description6,
log.ecstat6, # 70
log.prevten, log.prevten,
log.ppcodenk, log.ppcodenk,
((log.ppostcode_full || "").split(" ") || [""]).first, # 60 ((log.ppostcode_full || "").split(" ") || [""]).first,
((log.ppostcode_full || "").split(" ") || [""]).last, ((log.ppostcode_full || "").split(" ") || [""]).last,
log.prevloc, log.prevloc,
log.buy2living, log.buy2living,
@ -606,32 +618,32 @@ class BulkUpload::SalesLogToCsv
log.hhregres, log.hhregres,
log.hhregresstill, log.hhregresstill,
log.armedforcesspouse, log.armedforcesspouse, # 80
log.disabled, log.disabled,
log.wheel, log.wheel,
log.income1, # 70 log.income1,
log.inc1mort, log.inc1mort,
log.income2, log.income2,
log.inc2mort, log.inc2mort,
log.hb, log.hb,
log.savings.present? || "R", log.savings.present? || "R",
log.prevown, log.prevown,
log.prevshared, log.prevshared, # 90
log.resale, log.resale,
log.proplen, log.proplen,
log.hodate&.day, # 80 log.hodate&.day,
log.hodate&.month, log.hodate&.month,
log.hodate&.strftime("%y"), log.hodate&.strftime("%y"),
log.frombeds, log.frombeds,
log.fromprop, log.fromprop,
log.socprevten, log.socprevten,
log.value, log.value,
log.equity, log.equity, # 100
log.mortgageused, log.mortgageused,
log.mortgage, log.mortgage,
log.mortlen, # 90 log.mortlen,
log.deposit, log.deposit,
log.cashdis, log.cashdis,
log.mrent, log.mrent,
@ -639,48 +651,34 @@ class BulkUpload::SalesLogToCsv
log.management_fee, log.management_fee,
log.stairbought, log.stairbought,
log.stairowned, log.stairowned, # 110
log.staircasesale, log.staircasesale,
log.firststair, log.firststair,
log.initialpurchase&.day, # 100 log.initialpurchase&.day,
log.initialpurchase&.month, log.initialpurchase&.month,
log.initialpurchase&.strftime("%y"), log.initialpurchase&.strftime("%y"),
log.numstair, log.numstair,
log.lasttransaction&.day, log.lasttransaction&.day,
log.lasttransaction&.month, log.lasttransaction&.month,
log.lasttransaction&.strftime("%y"), log.lasttransaction&.strftime("%y"),
log.value, log.value, # 120
log.equity, log.equity,
log.mortgageused, log.mortgageused,
log.mrentprestaircasing, # 110 log.mrentprestaircasing,
log.mrent, log.mrent,
log.hasservicechargeschanged,
log.newservicecharges,
log.proplen, log.proplen,
log.value, log.value,
log.grant, log.grant,
log.discount, log.discount, # 130
log.mortgageused, log.mortgageused,
log.mortgage, log.mortgage,
log.mortlen, log.mortlen,
log.extrabor, log.extrabor,
log.deposit, # 120 log.deposit,
log.mscharge, # 136
log.mscharge,
log.buildheightclass,
log.gender_same_as_sex1,
log.gender_description1,
log.gender_same_as_sex2,
log.gender_description2,
log.gender_same_as_sex3,
log.gender_description3,
log.gender_same_as_sex4,
log.gender_description4, # 130
log.gender_same_as_sex5,
log.gender_description5,
log.gender_same_as_sex6,
log.gender_description6,
log.hasservicechargeschanged,
log.newservicecharges, # 136
] ]
end end

4
app/services/bulk_upload/lettings/year2026/csv_parser.rb

@ -3,7 +3,6 @@ require "csv"
class BulkUpload::Lettings::Year2026::CsvParser class BulkUpload::Lettings::Year2026::CsvParser
include CollectionTimeHelper include CollectionTimeHelper
# TODO: CLDC-4162: Update when 2026 format is known
FIELDS = 147 FIELDS = 147
FORM_YEAR = 2026 FORM_YEAR = 2026
@ -26,8 +25,7 @@ class BulkUpload::Lettings::Year2026::CsvParser
end end
def cols def cols
# TODO: CLDC-4162: Update when 2026 format is known @cols ||= ("A".."ER").to_a
@cols ||= ("A".."FA").to_a
end end
def row_parsers def row_parsers

4
app/services/bulk_upload/sales/year2026/csv_parser.rb

@ -3,7 +3,6 @@ require "csv"
class BulkUpload::Sales::Year2026::CsvParser class BulkUpload::Sales::Year2026::CsvParser
include CollectionTimeHelper include CollectionTimeHelper
# TODO: CLDC-4162: Update when 2026 format is known
FIELDS = 136 FIELDS = 136
FORM_YEAR = 2026 FORM_YEAR = 2026
@ -26,8 +25,7 @@ class BulkUpload::Sales::Year2026::CsvParser
end end
def cols def cols
# TODO: CLDC-4162: Update when 2026 format is known @cols ||= ("A".."EG").to_a
@cols ||= ("A".."EF").to_a
end end
def row_parsers def row_parsers

1058
app/services/bulk_upload/sales/year2026/row_parser.rb

File diff suppressed because it is too large Load Diff

32
spec/fixtures/files/2026_27_sales_bulk_upload.csv vendored

File diff suppressed because one or more lines are too long

2
spec/services/bulk_upload/sales/validator_spec.rb

@ -127,7 +127,7 @@ RSpec.describe BulkUpload::Sales::Validator do
before do before do
log.owning_organisation = nil log.owning_organisation = nil
log.saledate = date log.saledate = date
file.write(log_to_csv.default_field_numbers_row) file.write(log_to_csv.default_field_numbers_row_for_year(year))
file.write(log_to_csv.to_csv_row) file.write(log_to_csv.to_csv_row)
file.rewind file.rewind
end end

2
spec/services/bulk_upload/sales/year2026/csv_parser_spec.rb

@ -166,7 +166,7 @@ RSpec.describe BulkUpload::Sales::Year2026::CsvParser do
it "returns correct column" do it "returns correct column" do
expect(service.column_for_field("field_1")).to eql("B") expect(service.column_for_field("field_1")).to eql("B")
expect(service.column_for_field("field_99")).to eql("CV") expect(service.column_for_field("field_112")).to eql("DI")
end end
end end
end end

504
spec/services/bulk_upload/sales/year2026/row_parser_spec.rb

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save