diff --git a/app/helpers/bulk_upload/lettings_log_to_csv.rb b/app/helpers/bulk_upload/lettings_log_to_csv.rb index 891331e40..5ddd8d6a9 100644 --- a/app/helpers/bulk_upload/lettings_log_to_csv.rb +++ b/app/helpers/bulk_upload/lettings_log_to_csv.rb @@ -93,12 +93,162 @@ class BulkUpload::LettingsLogToCsv def default_2026_field_numbers # TODO: CLDC-4162 Replace with actual field numbers when 2026 format is known - (1..129).to_a + (1..132).to_a end def to_2026_row # TODO: CLDC-4162: Implement when 2026 format is known - to_2025_row + owning_organisation = if overrides[:organisation_id] + then Organisation.find(overrides[:organisation_id]) + else + log.owning_organisation + end + [ + owning_organisation&.id, # 1 + overrides[:managing_organisation_id] || log.managing_organisation&.old_visible_id, + log.assigned_to&.email, + log.needstype, + log.scheme&.id ? "S#{log.scheme&.id}" : "", + log.location&.id, + renewal, + log.startdate&.day, + log.startdate&.month, + log.startdate&.strftime("%y"), # 10 + + rent_type, + log.irproduct_other, + log.tenancycode, + log.propcode, + log.declaration, + log.rsnvac, + log.unitletas, + log.uprn, + log.address_line1&.tr(",", " "), + log.address_line2&.tr(",", " "), # 20 + + log.town_or_city&.tr(",", " "), + log.county&.tr(",", " "), + ((log.postcode_full || "").split(" ") || [""]).first, + ((log.postcode_full || "").split(" ") || [""]).last, + log.la, + log.unittype_gn, + log.builtype, + log.wchair, + log.beds, + log.voiddate&.day, # 30 + + log.voiddate&.month, + log.voiddate&.strftime("%y"), + log.mrcdate&.day, + log.mrcdate&.month, + log.mrcdate&.strftime("%y"), + log.sheltered, + log.joint, + log.startertenancy, + log.tenancy, + log.tenancyother, # 40 + + log.tenancylength, + log.age1 || overrides[:age1], + log.sex1, + log.ethnic, + log.nationality_all_group, + log.ecstat1, + relat_number(log.relat2), + log.age2 || overrides[:age2], + log.sex2, + log.ecstat2, # 50 + + relat_number(log.relat3), + log.age3 || overrides[:age3], + log.sex3, + log.ecstat3, + relat_number(log.relat4), + log.age4 || overrides[:age4], + log.sex4, + log.ecstat4, + relat_number(log.relat5), + log.age5 || overrides[:age5], # 60 + + log.sex5, + log.ecstat5, + relat_number(log.relat6), + log.age6 || overrides[:age6], + log.sex6, + log.ecstat6, + relat_number(log.relat7), + log.age7 || overrides[:age7], + log.sex7, + log.ecstat7, # 70 + + relat_number(log.relat8), + log.age8 || overrides[:age8], + log.sex8, + log.ecstat8, + log.armedforces, + log.leftreg, + log.reservist, + log.preg_occ, + log.housingneeds_a, + log.housingneeds_b, # 80 + + log.housingneeds_c, + log.housingneeds_f, + log.housingneeds_g, + log.housingneeds_h, + overrides[:illness] || log.illness, + log.illness_type_1, + log.illness_type_2, + log.illness_type_3, + log.illness_type_4, + log.illness_type_5, # 90 + + log.illness_type_6, + log.illness_type_7, + log.illness_type_8, + log.illness_type_9, + log.illness_type_10, + log.layear, + log.waityear, + log.reason, + log.reasonother, + log.prevten, # 100 + + homeless, + previous_postcode_known, + ((log.ppostcode_full || "").split(" ") || [""]).first, + ((log.ppostcode_full || "").split(" ") || [""]).last, + log.prevloc, + log.reasonpref, + log.rp_homeless, + log.rp_insan_unsat, + log.rp_medwel, + log.rp_hardship, # 110 + + log.rp_dontknow, + cbl, + chr, + cap, + accessible_register, + owning_organisation&.la? ? log.referral_register : nil, + net_income_known, + log.incfreq, + log.earnings, + log.hb, # 120 + + log.benefits, + log.household_charge, + log.period, + log.brent, + log.scharge, + log.pscharge, + log.supcharg, + log.hbrentshortfall, + log.tshortfall, + owning_organisation&.prp? ? log.referral_register : nil, + log.referral_noms, + log.referral_org, # 132 + ] end def to_2025_row diff --git a/app/models/organisation.rb b/app/models/organisation.rb index 94390c3f9..b33d896c4 100644 --- a/app/models/organisation.rb +++ b/app/models/organisation.rb @@ -74,6 +74,7 @@ class Organisation < ApplicationRecord before_save :clear_group_member_fields_if_not_group_member alias_method :la?, :LA? + alias_method :prp?, :PRP? validates :name, presence: { message: I18n.t("validations.organisation.name_missing") } validates :name, uniqueness: { case_sensitive: false, message: I18n.t("validations.organisation.name_not_unique") } diff --git a/app/services/bulk_upload/lettings/year2026/csv_parser.rb b/app/services/bulk_upload/lettings/year2026/csv_parser.rb index 2484cbc4b..d74b191e5 100644 --- a/app/services/bulk_upload/lettings/year2026/csv_parser.rb +++ b/app/services/bulk_upload/lettings/year2026/csv_parser.rb @@ -4,8 +4,8 @@ class BulkUpload::Lettings::Year2026::CsvParser include CollectionTimeHelper # TODO: CLDC-4162: Update when 2026 format is known - FIELDS = 129 - MAX_COLUMNS = 130 + FIELDS = 132 + MAX_COLUMNS = 133 FORM_YEAR = 2026 attr_reader :path @@ -28,7 +28,7 @@ class BulkUpload::Lettings::Year2026::CsvParser def cols # TODO: CLDC-4162: Update when 2026 format is known - @cols ||= ("A".."DZ").to_a + @cols ||= ("A".."EC").to_a end def row_parsers diff --git a/app/services/bulk_upload/lettings/year2026/row_parser.rb b/app/services/bulk_upload/lettings/year2026/row_parser.rb index 84f6f57d9..6d07cca64 100644 --- a/app/services/bulk_upload/lettings/year2026/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2026/row_parser.rb @@ -120,7 +120,7 @@ class BulkUpload::Lettings::Year2026::RowParser field_113: "Was the letting made under the Common Allocation Policy (CAP)?", field_114: "Was the letting made under the Common Housing Register (CHR)?", field_115: "Was the letting made under the Accessible Register?", - field_116: "What was the source of referral for this letting?", + field_116: "What was the source of referral for this letting? - LA properties", field_117: "Do you know the household’s combined total income after tax?", field_118: "How often does the household receive income?", field_119: "How much income does the household have in total?", @@ -134,6 +134,9 @@ class BulkUpload::Lettings::Year2026::RowParser field_127: "What is the support charge?", field_128: "After the household has received any housing-related benefits, will they still need to pay for rent and charges?", field_129: "What do you expect the outstanding amount to be?", + field_130: "What was the source of referral for this letting? - PRP properties part 1", + field_131: "What was the source of referral for this letting? - PRP properties part 2", + field_132: "What was the source of referral for this letting? - PRP properties part 3", }.freeze RENT_TYPE_BU_MAPPING = { @@ -282,6 +285,9 @@ class BulkUpload::Lettings::Year2026::RowParser attribute :field_127, :decimal attribute :field_128, :integer attribute :field_129, :decimal + attribute :field_130, :integer + attribute :field_131, :integer + attribute :field_132, :integer validate :validate_valid_radio_option, on: :before_log @@ -1101,8 +1107,9 @@ private accessible_register: %i[field_115], letting_allocation: %i[field_112 field_113 field_114 field_115], - referral_type: %i[field_116], - referral: %i[field_116], + referral_register: %i[field_116 field_130], + referral_noms: %i[field_131], + referral_org: %i[field_132], net_income_known: %i[field_117], incfreq: %i[field_118], @@ -1287,8 +1294,9 @@ private attributes["accessible_register"] = accessible_register attributes["letting_allocation_unknown"] = letting_allocation_unknown - attributes["referral_type"] = referral_type - attributes["referral"] = field_116 + attributes["referral_register"] = referral_register + attributes["referral_noms"] = referral_noms + attributes["referral_org"] = referral_org attributes["net_income_known"] = net_income_known attributes["earnings"] = earnings @@ -1684,21 +1692,29 @@ private false end - def referral_type - mapping = { - 1 => [20, 2, 8], - 2 => [21, 3, 4, 22], - 3 => [1, 10, 23], - 4 => [15, 9, 14, 24, 17], - 5 => [18, 19], - 6 => [7], - 7 => [16], - } + def referral_register + return unless owning_organisation - mapping.each do |key, values| - return key if values.include?(field_116) + if owning_organisation.la? + field_116 + else + field_130 end + end - 0 + def referral_noms + return unless owning_organisation + + if owning_organisation.la? + field_131 + end + end + + def referral_org + return unless owning_organisation + + if owning_organisation.la? + field_132 + end end end