Compare commits

..

No commits in common. '6ea8fd7ad228db4104b465d041ea17a79b1f1753' and '03c5dbdde86eadfd2376c0c01decec70f23b52e3' have entirely different histories.

  1. 2
      .github/workflows/manual_review_code_pipeline.yml
  2. 1
      .github/workflows/production_pipeline.yml
  3. 4
      .github/workflows/review_app_hint.yml
  4. 8
      .github/workflows/review_pipeline.yml
  5. 3
      .github/workflows/review_teardown_pipeline.yml
  6. 1
      app/helpers/bulk_upload/lettings_log_to_csv.rb
  7. 76
      app/helpers/bulk_upload/sales_log_to_csv.rb
  8. 4
      app/services/bulk_upload/lettings/year2026/csv_parser.rb
  9. 4
      app/services/bulk_upload/sales/year2026/csv_parser.rb
  10. 1058
      app/services/bulk_upload/sales/year2026/row_parser.rb
  11. 32
      spec/fixtures/files/2026_27_sales_bulk_upload.csv
  12. 2
      spec/fixtures/files/sales_logs_csv_export_codes_26.csv
  13. 2
      spec/fixtures/files/sales_logs_csv_export_labels_26.csv
  14. 1
      spec/fixtures/variable_definitions/sales_download_26_27.csv
  15. 2
      spec/lib/tasks/log_variable_definitions_spec.rb
  16. 2
      spec/services/bulk_upload/sales/validator_spec.rb
  17. 2
      spec/services/bulk_upload/sales/year2026/csv_parser_spec.rb
  18. 504
      spec/services/bulk_upload/sales/year2026/row_parser_spec.rb

2
.github/workflows/manual_review_code_pipeline.yml

@ -1,4 +1,4 @@
name: "Review App: Manual Code Redeploy"
name: Manual review app code pipeline
concurrency:
group: review-${{ inputs.review_app_key }}

1
.github/workflows/production_pipeline.yml

@ -3,6 +3,7 @@ name: Production CI/CD Pipeline
on:
release:
types: [released]
workflow_dispatch:
defaults:
run:

4
.github/workflows/review_app_hint.yml

@ -1,4 +1,4 @@
name: "Review App: PR Hint Comment"
name: Review app hint
on:
pull_request:
@ -19,5 +19,5 @@ jobs:
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: 'To deploy a review app for this PR, add the `review-app` label.',
body: 'To deploy a review app for this PR, add the `deploy-review` label.',
});

8
.github/workflows/review_pipeline.yml

@ -1,4 +1,4 @@
name: "Review App: Deploy"
name: Review app pipeline
concurrency:
group: review-${{ github.event.pull_request.number }}
@ -18,7 +18,7 @@ defaults:
jobs:
infra:
name: Deploy review app infrastructure
if: contains(github.event.pull_request.labels.*.name, 'review-app')
if: contains(github.event.pull_request.labels.*.name, 'deploy-review')
uses: communitiesuk/submit-social-housing-lettings-and-sales-data-infrastructure/.github/workflows/create_review_app_infra.yml@main
with:
key: ${{ github.event.pull_request.number }}
@ -28,7 +28,7 @@ jobs:
code:
name: Deploy review app code
if: contains(github.event.pull_request.labels.*.name, 'review-app')
if: contains(github.event.pull_request.labels.*.name, 'deploy-review')
needs: [infra]
uses: ./.github/workflows/aws_deploy.yml
with:
@ -42,7 +42,7 @@ jobs:
comment:
name: Add link to PR
if: contains(github.event.pull_request.labels.*.name, 'review-app')
if: contains(github.event.pull_request.labels.*.name, 'deploy-review')
needs: [code]
runs-on: ubuntu-latest
permissions:

3
.github/workflows/review_teardown_pipeline.yml

@ -1,4 +1,4 @@
name: "Review App: Teardown"
name: Review app teardown pipeline
concurrency:
group: review-${{ github.event.pull_request.number }}
@ -7,6 +7,7 @@ on:
pull_request:
types:
- closed
workflow_dispatch:
env:
app_repo_role: arn:aws:iam::815624722760:role/core-application-repo

1
app/helpers/bulk_upload/lettings_log_to_csv.rb

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

76
app/helpers/bulk_upload/sales_log_to_csv.rb

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

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

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

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

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

File diff suppressed because one or more lines are too long

2
spec/fixtures/files/sales_logs_csv_export_labels_26.csv vendored

File diff suppressed because one or more lines are too long

1
spec/fixtures/variable_definitions/sales_download_26_27.csv vendored

@ -20,4 +20,3 @@ gender_description6,If 'No', enter person 6's gender identity
hasservicechargeschanged,Will the service charge change after this staircasing transaction takes place?
newservicecharges,What are the new total monthly service charges for the property?
hholdcount,In total, how many people live in the property?
hhtype,Household type

1 sexrab1,What was buyer 1's sex at birth?
20 hasservicechargeschanged,Will the service charge change after this staircasing transaction takes place?
21 newservicecharges,What are the new total monthly service charges for the property?
22 hholdcount,In total, how many people live in the property?
hhtype,Household type

2
spec/lib/tasks/log_variable_definitions_spec.rb

@ -6,7 +6,7 @@ RSpec.describe "log_variable_definitions" do
subject(:task) { Rake::Task["data_import:add_variable_definitions"] }
let(:path) { "spec/fixtures/variable_definitions" }
let(:total_variable_definitions_count) { 467 }
let(:total_variable_definitions_count) { 466 }
before do
Rake.application.rake_require("tasks/log_variable_definitions")

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

@ -127,7 +127,7 @@ RSpec.describe BulkUpload::Sales::Validator do
before do
log.owning_organisation = nil
log.saledate = date
file.write(log_to_csv.default_field_numbers_row_for_year(year))
file.write(log_to_csv.default_field_numbers_row)
file.write(log_to_csv.to_csv_row)
file.rewind
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
expect(service.column_for_field("field_1")).to eql("B")
expect(service.column_for_field("field_112")).to eql("DI")
expect(service.column_for_field("field_99")).to eql("CV")
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