Compare commits
No commits in common. '64de8e6ff35652d7f612007bfe9e3291569a9672' and '8620594d073d68b45a12e2b2ce964da1796b381c' have entirely different histories.
64de8e6ff3
...
8620594d07
5 changed files with 6 additions and 261 deletions
@ -1,56 +0,0 @@ |
|||||||
desc "Clears already-collected address/UPRN data for 2026/27 lettings logs in confidential (sensitive) schemes" |
|
||||||
task clear_confidential_address_data: :environment do |
|
||||||
year = 2026 |
|
||||||
|
|
||||||
fields_present_scope = %w[ |
|
||||||
uprn |
|
||||||
uprn_known |
|
||||||
uprn_confirmed |
|
||||||
uprn_selection |
|
||||||
address_line1 |
|
||||||
address_line2 |
|
||||||
town_or_city |
|
||||||
county |
|
||||||
postcode_full |
|
||||||
postcode_known |
|
||||||
address_line1_input |
|
||||||
postcode_full_input |
|
||||||
address_line1_as_entered |
|
||||||
address_line2_as_entered |
|
||||||
town_or_city_as_entered |
|
||||||
county_as_entered |
|
||||||
postcode_full_as_entered |
|
||||||
la_as_entered |
|
||||||
address_search_value_check |
|
||||||
la |
|
||||||
] |
|
||||||
|
|
||||||
scope = LettingsLog |
|
||||||
.filter_by_year(year) |
|
||||||
.joins(:scheme) |
|
||||||
.where(schemes: { sensitive: "Yes" }) |
|
||||||
.where(fields_present_scope.map { |field| "#{LettingsLog.table_name}.#{field} IS NOT NULL" }.join(" OR ")) |
|
||||||
|
|
||||||
puts "Found #{scope.count} confidential-scheme lettings logs in #{year}/#{year + 1} with address data to clear" |
|
||||||
scope.find_each do |log| |
|
||||||
puts "log_id=#{log.id} scheme_id=#{log.scheme_id} location_id=#{log.location_id} status=#{log.status} la=#{log.la} postcode_full=#{log.postcode_full}" |
|
||||||
end |
|
||||||
|
|
||||||
updated = 0 |
|
||||||
|
|
||||||
scope.find_each do |log| |
|
||||||
original_status = log.status |
|
||||||
|
|
||||||
fields_present_scope.each { |field| log[field] = nil } |
|
||||||
log.is_la_inferred = log.la.present? |
|
||||||
|
|
||||||
if log.save(validate: false) |
|
||||||
updated += 1 |
|
||||||
puts "log_id=#{log.id} status changed: #{original_status} -> #{log.status}" if log.status != original_status |
|
||||||
else |
|
||||||
Rails.logger.error "CLDC-4462: failed to clear address data for log #{log.id}: #{log.errors.full_messages.join(', ')}" |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
puts "#{updated} logs updated" |
|
||||||
end |
|
||||||
@ -1,196 +0,0 @@ |
|||||||
require "rails_helper" |
|
||||||
require "rake" |
|
||||||
|
|
||||||
RSpec.describe "clear_confidential_address_data" do |
|
||||||
describe ":clear_confidential_address_data", type: :task do |
|
||||||
subject(:task) { Rake::Task["clear_confidential_address_data"] } |
|
||||||
|
|
||||||
before do |
|
||||||
Rake.application.rake_require("tasks/clear_confidential_address_data") |
|
||||||
Rake::Task.define_task(:environment) |
|
||||||
task.reenable |
|
||||||
end |
|
||||||
|
|
||||||
let(:owning_organisation) { create(:organisation) } |
|
||||||
let(:scheme) { create(:scheme, sensitive: "Yes", owning_organisation:) } |
|
||||||
let(:non_confidential_scheme) { create(:scheme, sensitive: "No", owning_organisation:) } |
|
||||||
let(:location) { create(:location, scheme:) } |
|
||||||
|
|
||||||
let(:cleared_fields) do |
|
||||||
%w[ |
|
||||||
uprn |
|
||||||
uprn_known |
|
||||||
uprn_confirmed |
|
||||||
uprn_selection |
|
||||||
address_line1 |
|
||||||
address_line2 |
|
||||||
town_or_city |
|
||||||
county |
|
||||||
postcode_full |
|
||||||
postcode_known |
|
||||||
address_line1_input |
|
||||||
postcode_full_input |
|
||||||
address_line1_as_entered |
|
||||||
address_line2_as_entered |
|
||||||
town_or_city_as_entered |
|
||||||
county_as_entered |
|
||||||
postcode_full_as_entered |
|
||||||
la_as_entered |
|
||||||
address_search_value_check |
|
||||||
la |
|
||||||
] |
|
||||||
end |
|
||||||
|
|
||||||
def create_log_with_address_data(scheme:, location:, startdate:) |
|
||||||
log = create( |
|
||||||
:lettings_log, |
|
||||||
:completed, |
|
||||||
:sh, |
|
||||||
:ignore_validation_errors, |
|
||||||
owning_organisation:, |
|
||||||
managing_organisation: owning_organisation, |
|
||||||
scheme:, |
|
||||||
location:, |
|
||||||
startdate:, |
|
||||||
) |
|
||||||
# Bypass callbacks/validations to simulate a log that already holds property |
|
||||||
# address/UPRN data collected before the confidential address feature existed. |
|
||||||
log.update_columns( |
|
||||||
uprn: "123456789012", |
|
||||||
uprn_known: 1, |
|
||||||
uprn_confirmed: 1, |
|
||||||
uprn_selection: "123456789012", |
|
||||||
address_line1: "1 Secret Street", |
|
||||||
address_line2: "Flat 2", |
|
||||||
town_or_city: "Secretville", |
|
||||||
county: "Secretshire", |
|
||||||
postcode_full: "SW1A 1AA", |
|
||||||
postcode_known: 1, |
|
||||||
address_line1_input: "1 Secret Street", |
|
||||||
postcode_full_input: "SW1A1AA", |
|
||||||
address_line1_as_entered: "1 Secret Street", |
|
||||||
address_line2_as_entered: "Flat 2", |
|
||||||
town_or_city_as_entered: "Secretville", |
|
||||||
county_as_entered: "Secretshire", |
|
||||||
postcode_full_as_entered: "SW1A 1AA", |
|
||||||
la_as_entered: "E09000003", |
|
||||||
address_search_value_check: 1, |
|
||||||
la: "E09000003", |
|
||||||
) |
|
||||||
log |
|
||||||
end |
|
||||||
|
|
||||||
context "when a confidential-scheme log in 2026/27 has address data" do |
|
||||||
let!(:log) { create_log_with_address_data(scheme:, location:, startdate: Time.zone.local(2026, 5, 1)) } |
|
||||||
|
|
||||||
it "clears the address and UPRN fields" do |
|
||||||
task.invoke |
|
||||||
log.reload |
|
||||||
|
|
||||||
expect(log.address_line1).to be_nil |
|
||||||
expect(log.town_or_city).to be_nil |
|
||||||
expect(log.uprn).to be_nil |
|
||||||
expect(log.postcode_known).to be_nil |
|
||||||
end |
|
||||||
|
|
||||||
it "clears every field the task targets" do |
|
||||||
task.invoke |
|
||||||
log.reload |
|
||||||
|
|
||||||
cleared_fields.each do |field| |
|
||||||
expect(log[field]).to be_nil, "expected #{field} to be nil but was #{log[field].inspect}" |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
it "keeps the log's status unchanged when the location's LA can be inferred" do |
|
||||||
task.invoke |
|
||||||
expect(log.reload.status).to eq("completed") |
|
||||||
end |
|
||||||
|
|
||||||
it "resolves the local authority from the scheme's location without persisting it" do |
|
||||||
task.invoke |
|
||||||
log.reload |
|
||||||
|
|
||||||
expect(log.la).to eq(location.location_code) |
|
||||||
expect(log[:la]).to be_nil |
|
||||||
expect(log.is_la_inferred).to be true |
|
||||||
end |
|
||||||
|
|
||||||
it "does not affect the scheme or location associations" do |
|
||||||
task.invoke |
|
||||||
log.reload |
|
||||||
|
|
||||||
expect(log.scheme_id).to eq(scheme.id) |
|
||||||
expect(log.location_id).to eq(location.id) |
|
||||||
end |
|
||||||
|
|
||||||
it "is idempotent" do |
|
||||||
task.invoke |
|
||||||
task.reenable |
|
||||||
expect { task.invoke }.not_to(change { log.reload.updated_at }) |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
context "when the scheme's location has no resolvable local authority" do |
|
||||||
let!(:log) { create_log_with_address_data(scheme:, location:, startdate: Time.zone.local(2026, 5, 1)) } |
|
||||||
|
|
||||||
before { location.update_columns(location_code: nil, location_admin_district: nil, is_la_inferred: false) } |
|
||||||
|
|
||||||
it "clears the address fields but leaves the log's status unchanged" do |
|
||||||
task.invoke |
|
||||||
log.reload |
|
||||||
|
|
||||||
expect(log.address_line1).to be_nil |
|
||||||
expect(log.la).to be_nil |
|
||||||
expect(log.status).to eq("completed") |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
context "when the confidential-scheme log is outside the 2026/27 collection year" do |
|
||||||
let!(:log) { create_log_with_address_data(scheme:, location:, startdate: Time.zone.local(2025, 5, 1)) } |
|
||||||
|
|
||||||
it "does not clear the address fields" do |
|
||||||
task.invoke |
|
||||||
log.reload |
|
||||||
|
|
||||||
expect(log.address_line1).to eq("1 Secret Street") |
|
||||||
expect(log.town_or_city).to eq("Secretville") |
|
||||||
expect(log.uprn).to eq("123456789012") |
|
||||||
expect(log.postcode_known).to eq(1) |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
context "when the log's scheme is not confidential" do |
|
||||||
let!(:log) { create_log_with_address_data(scheme: non_confidential_scheme, location:, startdate: Time.zone.local(2026, 5, 1)) } |
|
||||||
|
|
||||||
it "does not clear the address fields" do |
|
||||||
task.invoke |
|
||||||
log.reload |
|
||||||
|
|
||||||
expect(log.address_line1).to eq("1 Secret Street") |
|
||||||
expect(log.town_or_city).to eq("Secretville") |
|
||||||
expect(log.uprn).to eq("123456789012") |
|
||||||
expect(log.postcode_known).to eq(1) |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
context "when a confidential-scheme 2026/27 log has no address data left" do |
|
||||||
let!(:log) do |
|
||||||
create( |
|
||||||
:lettings_log, |
|
||||||
:ignore_validation_errors, |
|
||||||
needstype: 2, |
|
||||||
owning_organisation:, |
|
||||||
managing_organisation: owning_organisation, |
|
||||||
scheme:, |
|
||||||
location:, |
|
||||||
startdate: Time.zone.local(2026, 5, 1), |
|
||||||
) |
|
||||||
end |
|
||||||
|
|
||||||
it "is not touched" do |
|
||||||
expect { task.invoke }.not_to(change { log.reload.updated_at }) |
|
||||||
end |
|
||||||
end |
|
||||||
end |
|
||||||
end |
|
||||||
Loading…
Reference in new issue