<%= form_with model: @form, scope: :form, url: bulk_upload_lettings_log_path(id: "needstype"), method: :patch do |f| %>
diff --git a/app/views/bulk_upload_lettings_resume/confirm.html.erb b/app/views/bulk_upload_lettings_resume/confirm.html.erb
new file mode 100644
index 000000000..af73b33e9
--- /dev/null
+++ b/app/views/bulk_upload_lettings_resume/confirm.html.erb
@@ -0,0 +1,22 @@
+<% content_for :before_content do %>
+ <%= govuk_back_link href: @form.back_path %>
+<% end %>
+
+
+
+
Bulk upload for lettings (<%= @bulk_upload.year_combo %>)
+
Are you sure you want to upload all logs from this bulk upload?
+
+
There are <%= pluralize(@bulk_upload.logs.count, "log") %> in this bulk upload with <%= pluralize(@bulk_upload.bulk_upload_errors.count, "error") %> that still need to be fixed after upload.
+
+ <%= govuk_warning_text(icon_fallback_text: "Danger") do %>
+ You can not delete logs once you create them
+ <% end %>
+
+ <%= form_with model: @form, scope: :form, url: page_bulk_upload_lettings_resume_path(@bulk_upload, page: "confirm"), method: :patch do |f| %>
+ <%= f.govuk_submit %>
+
+ <%= govuk_button_link_to "Cancel", @form.back_path, secondary: true %>
+ <% end %>
+
+
diff --git a/app/views/bulk_upload_lettings_resume/fix_choice.html.erb b/app/views/bulk_upload_lettings_resume/fix_choice.html.erb
new file mode 100644
index 000000000..cc8e33eaa
--- /dev/null
+++ b/app/views/bulk_upload_lettings_resume/fix_choice.html.erb
@@ -0,0 +1,36 @@
+
+
+ <%= form_with model: @form, scope: :form, url: page_bulk_upload_lettings_resume_path(@bulk_upload, page: "fix-choice"), method: :patch do |f| %>
+ <%= f.govuk_error_summary %>
+
+
Bulk upload for lettings (<%= @bulk_upload.year_combo %>)
+
How would you like to fix <%= pluralize(@bulk_upload.bulk_upload_errors.count, "error") %>?
+
+
+ <%= @bulk_upload.filename %>
+
+
+
+ <%= @form.recommendation %>
+
+
+ <%= govuk_details(summary_text: "How to choose between fixing errors on the CORE site or in the CSV") do %>
+
When it comes to fixing errors, there are pros and cons to doing it on a CSV versus doing it on a website.
+
+
Fixing errors on a CSV file can be beneficial because it allows you to easily make changes to multiple records at once, and you can use tools like Excel to quickly identify and correct errors. However, if the CSV file is not properly formatted, it can be difficult to identify which records contain errors.
+
+
Fixing errors on a website can be convenient because you can see the data in context and make changes in real-time. However, this approach can be time-consuming if you need to make changes to multiple records, and it may be more difficult to identify errors in a large dataset.
+
+
Ultimately, the best approach will depend on the specific situation and the nature of the errors that need to be fixed.
+ <% end %>
+
+ <%= f.govuk_collection_radio_buttons :choice,
+ @form.options,
+ :id,
+ :name,
+ legend: { hidden: true } %>
+
+ <%= f.govuk_submit %>
+ <% end %>
+
+
diff --git a/config/locales/en.yml b/config/locales/en.yml
index bcfe32f46..b6735e3b5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -68,6 +68,11 @@ en:
attributes:
needstype:
blank: You must answer needs type
+ forms/bulk_upload_lettings_resume/fix_choice:
+ attributes:
+ choice:
+ blank: You must select how would you like to fix errors
+ inclusion: You must select one of the following options for how would like to fix errors
activerecord:
errors:
diff --git a/config/routes.rb b/config/routes.rb
index eeadffa03..1f00815c8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -144,6 +144,15 @@ Rails.application.routes.draw do
end
end
+ resources :bulk_upload_lettings_resume, path: "bulk-upload-resume", only: %i[show update] do
+ member do
+ get :start
+
+ get "*page", to: "bulk_upload_lettings_resume#show", as: "page"
+ patch "*page", to: "bulk_upload_lettings_resume#update"
+ end
+ end
+
get "update-logs", to: "lettings_logs#update_logs"
end
diff --git a/db/migrate/20230331094840_add_status_cache_to_lettings_log.rb b/db/migrate/20230331094840_add_status_cache_to_lettings_log.rb
new file mode 100644
index 000000000..e815b15ad
--- /dev/null
+++ b/db/migrate/20230331094840_add_status_cache_to_lettings_log.rb
@@ -0,0 +1,5 @@
+class AddStatusCacheToLettingsLog < ActiveRecord::Migration[7.0]
+ def change
+ add_column :lettings_logs, :status_cache, :integer, null: false, default: 0
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 225129dfd..2c00fb921 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[7.0].define(version: 2023_03_20_084057) do
+ActiveRecord::Schema[7.0].define(version: 2023_03_31_094840) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -287,6 +287,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_084057) do
t.string "town_or_city"
t.string "county"
t.integer "carehome_charges_value_check"
+ t.integer "status_cache", default: 0, null: false
t.index ["bulk_upload_id"], name: "index_lettings_logs_on_bulk_upload_id"
t.index ["created_by_id"], name: "index_lettings_logs_on_created_by_id"
t.index ["location_id"], name: "index_lettings_logs_on_location_id"
diff --git a/spec/fixtures/files/lettings_logs_download.csv b/spec/fixtures/files/lettings_logs_download.csv
index 463f81d3c..b9aefc3c9 100644
--- a/spec/fixtures/files/lettings_logs_download.csv
+++ b/spec/fixtures/files/lettings_logs_download.csv
@@ -1,2 +1,2 @@
-id,status,created_at,updated_at,created_by_name,is_dpo,owning_organisation_name,managing_organisation_name,collection_start_year,needstype,renewal,startdate,rent_type_detail,irproduct_other,tenancycode,propcode,age1,sex1,ecstat1,hhmemb,relat2,age2,sex2,retirement_value_check,ecstat2,armedforces,leftreg,illness,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_h,is_previous_la_inferred,prevloc_label,prevloc,illness_type_1,illness_type_2,is_la_inferred,la_label,la,postcode_known,postcode_full,previous_la_known,wchair,preg_occ,cbl,earnings,incfreq,net_income_value_check,benefits,hb,period,brent,scharge,pscharge,supcharg,tcharge,offered,layear,ppostcode_full,mrcdate,declaration,ethnic,national,prevten,age3,sex3,ecstat3,age4,sex4,ecstat4,age5,sex5,ecstat5,age6,sex6,ecstat6,age7,sex7,ecstat7,age8,sex8,ecstat8,homeless,underoccupation_benefitcap,reservist,startertenancy,tenancylength,tenancy,rsnvac,unittype_gn,beds,waityear,reasonpref,chr,cap,reasonother,housingneeds_f,housingneeds_g,illness_type_3,illness_type_4,illness_type_8,illness_type_5,illness_type_6,illness_type_7,illness_type_9,illness_type_10,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,tenancyother,property_owner_organisation,property_manager_organisation,purchaser_code,reason,majorrepairs,hbrentshortfall,property_relet,incref,first_time_property_let_as_social_housing,unitletas,builtype,voiddate,renttype,lettype,totchild,totelder,totadult,net_income_known,nocharge,is_carehome,household_charge,referral,tshortfall,chcharge,ppcodenk,age1_known,age2_known,age3_known,age4_known,age5_known,age6_known,age7_known,age8_known,ethnic_group,letting_allocation_unknown,details_known_2,details_known_3,details_known_4,details_known_5,details_known_6,details_known_7,details_known_8,has_benefits,wrent,wscharge,wpschrge,wsupchrg,wtcharge,wtshortfall,refused,housingneeds,wchchrg,newprop,relat3,relat4,relat5,relat6,relat7,relat8,rent_value_check,old_form_id,lar,irproduct,old_id,joint,tshortfall_known,sheltered,pregnancy_value_check,hhtype,new_old,vacdays,major_repairs_date_value_check,void_date_value_check,housingneeds_type,housingneeds_other,unresolved,updated_by_id,uprn,uprn_known,uprn_confirmed,address_line1,address_line2,town_or_city,county,carehome_charges_value_check,unittype_sh,scheme_code,scheme_service_name,scheme_sensitive,scheme_type,scheme_registered_under_care_act,scheme_owning_organisation_name,scheme_primary_client_group,scheme_has_other_client_group,scheme_secondary_client_group,scheme_support_type,scheme_intended_stay,scheme_created_at,location_code,location_postcode,location_name,location_units,location_type_of_unit,location_mobility_type,location_admin_district,location_startdate
-{id},in_progress,2022-02-08 16:52:15 +0000,2022-02-08 16:52:15 +0000,Danny Rojas,No,DLUHC,DLUHC,2021,Supported housing,,2 October 2021,London Affordable Rent,,,,,,,,,,,,,,,,,,,,No,,,,,No,Westminster,E09000033,,SE1 1TE,,No,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,8,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,0,,,,,,,,,,,,,,,,,,,9,1,,,,,,,,,,,,,,,,6,{scheme_code},{scheme_service_name},{scheme_sensitive},Missing,No,DLUHC,{scheme_primary_client_group},,{scheme_secondary_client_group},{scheme_support_type},{scheme_intended_stay},2021-04-01 00:00:00 +0100,{location_code},SE1 1TE,Downing Street,20,Bungalow,Fitted with equipment and adaptations,Westminster,{location_startdate}
+id,status,created_at,updated_at,created_by_name,is_dpo,owning_organisation_name,managing_organisation_name,collection_start_year,needstype,renewal,startdate,rent_type_detail,irproduct_other,tenancycode,propcode,age1,sex1,ecstat1,hhmemb,relat2,age2,sex2,retirement_value_check,ecstat2,armedforces,leftreg,illness,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_h,is_previous_la_inferred,prevloc_label,prevloc,illness_type_1,illness_type_2,is_la_inferred,la_label,la,postcode_known,postcode_full,previous_la_known,wchair,preg_occ,cbl,earnings,incfreq,net_income_value_check,benefits,hb,period,brent,scharge,pscharge,supcharg,tcharge,offered,layear,ppostcode_full,mrcdate,declaration,ethnic,national,prevten,age3,sex3,ecstat3,age4,sex4,ecstat4,age5,sex5,ecstat5,age6,sex6,ecstat6,age7,sex7,ecstat7,age8,sex8,ecstat8,homeless,underoccupation_benefitcap,reservist,startertenancy,tenancylength,tenancy,rsnvac,unittype_gn,beds,waityear,reasonpref,chr,cap,reasonother,housingneeds_f,housingneeds_g,illness_type_3,illness_type_4,illness_type_8,illness_type_5,illness_type_6,illness_type_7,illness_type_9,illness_type_10,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,tenancyother,property_owner_organisation,property_manager_organisation,purchaser_code,reason,majorrepairs,hbrentshortfall,property_relet,incref,first_time_property_let_as_social_housing,unitletas,builtype,voiddate,renttype,lettype,totchild,totelder,totadult,net_income_known,nocharge,is_carehome,household_charge,referral,tshortfall,chcharge,ppcodenk,age1_known,age2_known,age3_known,age4_known,age5_known,age6_known,age7_known,age8_known,ethnic_group,letting_allocation_unknown,details_known_2,details_known_3,details_known_4,details_known_5,details_known_6,details_known_7,details_known_8,has_benefits,wrent,wscharge,wpschrge,wsupchrg,wtcharge,wtshortfall,refused,housingneeds,wchchrg,newprop,relat3,relat4,relat5,relat6,relat7,relat8,rent_value_check,old_form_id,lar,irproduct,old_id,joint,tshortfall_known,sheltered,pregnancy_value_check,hhtype,new_old,vacdays,major_repairs_date_value_check,void_date_value_check,housingneeds_type,housingneeds_other,unresolved,updated_by_id,uprn,uprn_known,uprn_confirmed,address_line1,address_line2,town_or_city,county,carehome_charges_value_check,status_cache,unittype_sh,scheme_code,scheme_service_name,scheme_sensitive,scheme_type,scheme_registered_under_care_act,scheme_owning_organisation_name,scheme_primary_client_group,scheme_has_other_client_group,scheme_secondary_client_group,scheme_support_type,scheme_intended_stay,scheme_created_at,location_code,location_postcode,location_name,location_units,location_type_of_unit,location_mobility_type,location_admin_district,location_startdate
+{id},in_progress,2022-02-08 16:52:15 +0000,2022-02-08 16:52:15 +0000,Danny Rojas,No,DLUHC,DLUHC,2021,Supported housing,,2 October 2021,London Affordable Rent,,,,,,,,,,,,,,,,,,,,No,,,,,No,Westminster,E09000033,,SE1 1TE,,No,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,8,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,0,,,,,,,,,,,,,,,,,,,9,1,,,,,,,,,,,,,,,,not_started,6,{scheme_code},{scheme_service_name},{scheme_sensitive},Missing,No,DLUHC,{scheme_primary_client_group},,{scheme_secondary_client_group},{scheme_support_type},{scheme_intended_stay},2021-04-01 00:00:00 +0100,{location_code},SE1 1TE,Downing Street,20,Bungalow,Fitted with equipment and adaptations,Westminster,{location_startdate}
diff --git a/spec/fixtures/files/lettings_logs_download_codes_only.csv b/spec/fixtures/files/lettings_logs_download_codes_only.csv
index 6d15538ef..dec2664b5 100644
--- a/spec/fixtures/files/lettings_logs_download_codes_only.csv
+++ b/spec/fixtures/files/lettings_logs_download_codes_only.csv
@@ -1,2 +1,2 @@
-id,status,created_at,updated_at,created_by_name,is_dpo,owning_organisation_name,managing_organisation_name,collection_start_year,needstype,renewal,startdate,rent_type_detail,irproduct_other,tenancycode,propcode,age1,sex1,ecstat1,hhmemb,relat2,age2,sex2,retirement_value_check,ecstat2,armedforces,leftreg,illness,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_h,is_previous_la_inferred,prevloc_label,prevloc,illness_type_1,illness_type_2,is_la_inferred,la_label,la,postcode_known,postcode_full,previous_la_known,wchair,preg_occ,cbl,earnings,incfreq,net_income_value_check,benefits,hb,period,brent,scharge,pscharge,supcharg,tcharge,offered,layear,ppostcode_full,mrcdate,declaration,ethnic,national,prevten,age3,sex3,ecstat3,age4,sex4,ecstat4,age5,sex5,ecstat5,age6,sex6,ecstat6,age7,sex7,ecstat7,age8,sex8,ecstat8,homeless,underoccupation_benefitcap,reservist,startertenancy,tenancylength,tenancy,rsnvac,unittype_gn,beds,waityear,reasonpref,chr,cap,reasonother,housingneeds_f,housingneeds_g,illness_type_3,illness_type_4,illness_type_8,illness_type_5,illness_type_6,illness_type_7,illness_type_9,illness_type_10,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,tenancyother,property_owner_organisation,property_manager_organisation,purchaser_code,reason,majorrepairs,hbrentshortfall,property_relet,incref,first_time_property_let_as_social_housing,unitletas,builtype,voiddate,renttype,lettype,totchild,totelder,totadult,net_income_known,nocharge,is_carehome,household_charge,referral,tshortfall,chcharge,ppcodenk,age1_known,age2_known,age3_known,age4_known,age5_known,age6_known,age7_known,age8_known,ethnic_group,letting_allocation_unknown,details_known_2,details_known_3,details_known_4,details_known_5,details_known_6,details_known_7,details_known_8,has_benefits,wrent,wscharge,wpschrge,wsupchrg,wtcharge,wtshortfall,refused,housingneeds,wchchrg,newprop,relat3,relat4,relat5,relat6,relat7,relat8,rent_value_check,old_form_id,lar,irproduct,old_id,joint,tshortfall_known,sheltered,pregnancy_value_check,hhtype,new_old,vacdays,major_repairs_date_value_check,void_date_value_check,housingneeds_type,housingneeds_other,unresolved,updated_by_id,uprn,uprn_known,uprn_confirmed,address_line1,address_line2,town_or_city,county,carehome_charges_value_check,unittype_sh,scheme_code,scheme_service_name,scheme_sensitive,scheme_type,scheme_registered_under_care_act,scheme_owning_organisation_name,scheme_primary_client_group,scheme_has_other_client_group,scheme_secondary_client_group,scheme_support_type,scheme_intended_stay,scheme_created_at,location_code,location_postcode,location_name,location_units,location_type_of_unit,location_mobility_type,location_admin_district,location_startdate
-{id},in_progress,2022-02-08 16:52:15 +0000,2022-02-08 16:52:15 +0000,Danny Rojas,false,DLUHC,DLUHC,2021,2,,2 October 2021,2,,,,,,,,,,,,,,,,,,,,false,,,,,false,Westminster,E09000033,,SE1 1TE,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,8,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,0,,,,,,,,,,,,,,,,,,,9,1,,,,,,,,,,,,,,,,6,{scheme_code},{scheme_service_name},{scheme_sensitive},0,1,DLUHC,{scheme_primary_client_group},,{scheme_secondary_client_group},{scheme_support_type},{scheme_intended_stay},2021-04-01 00:00:00 +0100,{location_code},SE1 1TE,Downing Street,20,6,A,Westminster,{location_startdate}
+id,status,created_at,updated_at,created_by_name,is_dpo,owning_organisation_name,managing_organisation_name,collection_start_year,needstype,renewal,startdate,rent_type_detail,irproduct_other,tenancycode,propcode,age1,sex1,ecstat1,hhmemb,relat2,age2,sex2,retirement_value_check,ecstat2,armedforces,leftreg,illness,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_h,is_previous_la_inferred,prevloc_label,prevloc,illness_type_1,illness_type_2,is_la_inferred,la_label,la,postcode_known,postcode_full,previous_la_known,wchair,preg_occ,cbl,earnings,incfreq,net_income_value_check,benefits,hb,period,brent,scharge,pscharge,supcharg,tcharge,offered,layear,ppostcode_full,mrcdate,declaration,ethnic,national,prevten,age3,sex3,ecstat3,age4,sex4,ecstat4,age5,sex5,ecstat5,age6,sex6,ecstat6,age7,sex7,ecstat7,age8,sex8,ecstat8,homeless,underoccupation_benefitcap,reservist,startertenancy,tenancylength,tenancy,rsnvac,unittype_gn,beds,waityear,reasonpref,chr,cap,reasonother,housingneeds_f,housingneeds_g,illness_type_3,illness_type_4,illness_type_8,illness_type_5,illness_type_6,illness_type_7,illness_type_9,illness_type_10,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,tenancyother,property_owner_organisation,property_manager_organisation,purchaser_code,reason,majorrepairs,hbrentshortfall,property_relet,incref,first_time_property_let_as_social_housing,unitletas,builtype,voiddate,renttype,lettype,totchild,totelder,totadult,net_income_known,nocharge,is_carehome,household_charge,referral,tshortfall,chcharge,ppcodenk,age1_known,age2_known,age3_known,age4_known,age5_known,age6_known,age7_known,age8_known,ethnic_group,letting_allocation_unknown,details_known_2,details_known_3,details_known_4,details_known_5,details_known_6,details_known_7,details_known_8,has_benefits,wrent,wscharge,wpschrge,wsupchrg,wtcharge,wtshortfall,refused,housingneeds,wchchrg,newprop,relat3,relat4,relat5,relat6,relat7,relat8,rent_value_check,old_form_id,lar,irproduct,old_id,joint,tshortfall_known,sheltered,pregnancy_value_check,hhtype,new_old,vacdays,major_repairs_date_value_check,void_date_value_check,housingneeds_type,housingneeds_other,unresolved,updated_by_id,uprn,uprn_known,uprn_confirmed,address_line1,address_line2,town_or_city,county,carehome_charges_value_check,status_cache,unittype_sh,scheme_code,scheme_service_name,scheme_sensitive,scheme_type,scheme_registered_under_care_act,scheme_owning_organisation_name,scheme_primary_client_group,scheme_has_other_client_group,scheme_secondary_client_group,scheme_support_type,scheme_intended_stay,scheme_created_at,location_code,location_postcode,location_name,location_units,location_type_of_unit,location_mobility_type,location_admin_district,location_startdate
+{id},in_progress,2022-02-08 16:52:15 +0000,2022-02-08 16:52:15 +0000,Danny Rojas,false,DLUHC,DLUHC,2021,2,,2 October 2021,2,,,,,,,,,,,,,,,,,,,,false,,,,,false,Westminster,E09000033,,SE1 1TE,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,8,0,0,0,,0,,,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,0,,,,,,,,,,,,,,,,,,,9,1,,,,,,,,,,,,,,,,not_started,6,{scheme_code},{scheme_service_name},{scheme_sensitive},0,1,DLUHC,{scheme_primary_client_group},,{scheme_secondary_client_group},{scheme_support_type},{scheme_intended_stay},2021-04-01 00:00:00 +0100,{location_code},SE1 1TE,Downing Street,20,6,A,Westminster,{location_startdate}
diff --git a/spec/jobs/email_csv_job_spec.rb b/spec/jobs/email_csv_job_spec.rb
index 04776aac7..29dceff59 100644
--- a/spec/jobs/email_csv_job_spec.rb
+++ b/spec/jobs/email_csv_job_spec.rb
@@ -61,6 +61,7 @@ describe EmailCsvJob do
context "when writing to S3" do
before do
FactoryBot.create_list(:lettings_log, 4, owning_organisation: other_organisation)
+ FactoryBot.create(:lettings_log, owning_organisation: other_organisation, status: "pending", skip_update_status: true)
end
def expect_csv
diff --git a/spec/mailers/bulk_upload_mailer_spec.rb b/spec/mailers/bulk_upload_mailer_spec.rb
index 2e4337328..cd2c4767d 100644
--- a/spec/mailers/bulk_upload_mailer_spec.rb
+++ b/spec/mailers/bulk_upload_mailer_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe BulkUploadMailer do
it "sends correctly formed email" do
expect(notify_client).to receive(:send_email).with(
email_address: bulk_upload.user.email,
- template_id: described_class::BULK_UPLOAD_FAILED_FILE_SETUP_ERROR_TEMPLATE_ID,
+ template_id: described_class::FAILED_FILE_SETUP_ERROR_TEMPLATE_ID,
personalisation: {
filename: bulk_upload.filename,
upload_timestamp: bulk_upload.created_at.to_fs(:govuk_date_and_time),
@@ -48,7 +48,7 @@ RSpec.describe BulkUploadMailer do
it "sends correctly formed email" do
expect(notify_client).to receive(:send_email).with(
email_address: user.email,
- template_id: described_class::BULK_UPLOAD_COMPLETE_TEMPLATE_ID,
+ template_id: described_class::COMPLETE_TEMPLATE_ID,
personalisation: {
title: "You’ve successfully uploaded 0 logs",
filename: bulk_upload.filename,
@@ -66,7 +66,7 @@ RSpec.describe BulkUploadMailer do
it "sends correctly formed email" do
expect(notify_client).to receive(:send_email).with(
email_address: user.email,
- template_id: described_class::BULK_UPLOAD_FAILED_SERVICE_ERROR_TEMPLATE_ID,
+ template_id: described_class::FAILED_SERVICE_ERROR_TEMPLATE_ID,
personalisation: {
filename: bulk_upload.filename,
upload_timestamp: bulk_upload.created_at.to_fs(:govuk_date_and_time),
@@ -94,7 +94,7 @@ RSpec.describe BulkUploadMailer do
it "sends correctly formed email" do
expect(notify_client).to receive(:send_email).with(
email_address: bulk_upload.user.email,
- template_id: described_class::BULK_UPLOAD_WITH_ERRORS_TEMPLATE_ID,
+ template_id: described_class::WITH_ERRORS_TEMPLATE_ID,
personalisation: {
title: "We found 1 log with errors",
filename: bulk_upload.filename,
@@ -119,7 +119,7 @@ RSpec.describe BulkUploadMailer do
it "sends correctly formed email" do
expect(notify_client).to receive(:send_email).with(
email_address: user.email,
- template_id: described_class::BULK_UPLOAD_FAILED_CSV_ERRORS_TEMPLATE_ID,
+ template_id: described_class::FAILED_CSV_ERRORS_TEMPLATE_ID,
personalisation: {
filename: bulk_upload.filename,
upload_timestamp: bulk_upload.created_at.to_fs(:govuk_date_and_time),
diff --git a/spec/models/organisation_spec.rb b/spec/models/organisation_spec.rb
index 0b69fd504..362a7e2a9 100644
--- a/spec/models/organisation_spec.rb
+++ b/spec/models/organisation_spec.rb
@@ -169,11 +169,6 @@ RSpec.describe Organisation, type: :model do
it "has lettings logs" do
expect(organisation.lettings_logs.to_a).to match_array([owned_lettings_log, managed_lettings_log])
end
-
- it "has lettings log status helper methods" do
- expect(organisation.completed_lettings_logs.to_a).to eq([owned_lettings_log])
- expect(organisation.not_completed_lettings_logs.to_a).to eq([managed_lettings_log])
- end
end
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index b285a55e7..8d9407dc2 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -36,11 +36,6 @@ RSpec.describe User, type: :model do
expect(user.lettings_logs.to_a).to match_array([owned_lettings_log, managed_lettings_log])
end
- it "has lettings log status helper methods" do
- expect(user.completed_lettings_logs.to_a).to match_array([owned_lettings_log])
- expect(user.not_completed_lettings_logs.to_a).to match_array([managed_lettings_log])
- end
-
it "has a role" do
expect(user.role).to eq("data_provider")
expect(user.data_provider?).to be true
diff --git a/spec/requests/bulk_upload_lettings_resume_controller_spec.rb b/spec/requests/bulk_upload_lettings_resume_controller_spec.rb
new file mode 100644
index 000000000..5529a13db
--- /dev/null
+++ b/spec/requests/bulk_upload_lettings_resume_controller_spec.rb
@@ -0,0 +1,84 @@
+require "rails_helper"
+
+RSpec.describe BulkUploadLettingsResumeController, type: :request do
+ let(:user) { create(:user) }
+ let(:bulk_upload) { create(:bulk_upload, :lettings, user:, bulk_upload_errors:) }
+ let(:bulk_upload_errors) { create_list(:bulk_upload_error, 2) }
+
+ before do
+ sign_in user
+ end
+
+ describe "GET /lettings-logs/bulk-upload-resume/:ID/start" do
+ it "redirects to choice page" do
+ get "/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/start"
+
+ expect(response).to redirect_to("/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/fix-choice")
+ end
+ end
+
+ describe "GET /lettings-logs/bulk-upload-resume/:ID/fix-choice" do
+ it "renders the page correctly" do
+ get "/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/fix-choice"
+
+ expect(response).to be_successful
+
+ expect(response.body).to include("Bulk upload for lettings")
+ expect(response.body).to include("2022/23")
+ expect(response.body).to include("How would you like to fix 2 errors?")
+ expect(response.body).to include(bulk_upload.filename)
+ end
+ end
+
+ describe "PATCH /lettings-logs/bulk-upload-resume/:ID/fix-choice" do
+ context "when no option selected" do
+ it "renders error message" do
+ patch "/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/fix-choice"
+
+ expect(response).to be_successful
+
+ expect(response.body).to include("You must select")
+ end
+ end
+
+ context "when upload again selected" do
+ it "sends them to relevant report" do
+ patch "/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/fix-choice", params: { form: { choice: "upload-again" } }
+
+ expect(response).to redirect_to("/lettings-logs/bulk-upload-results/#{bulk_upload.id}")
+ end
+ end
+
+ context "when fix inline selected" do
+ it "sends them to confirm choice" do
+ patch "/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/fix-choice", params: { form: { choice: "create-fix-inline" } }
+
+ expect(response).to redirect_to("/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/confirm")
+ end
+ end
+ end
+
+ describe "GET /lettings-logs/bulk-upload-resume/:ID/confirm" do
+ it "renders page" do
+ get "/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/confirm"
+
+ expect(response).to be_successful
+
+ expect(response.body).to include("Are you sure")
+ end
+ end
+
+ describe "PATCH /lettings-logs/bulk-upload-resume/:ID/confirm" do
+ let(:mock_processor) { instance_double(BulkUpload::Processor, approve: nil) }
+
+ it "approves logs for creation" do
+ allow(BulkUpload::Processor).to receive(:new).with(bulk_upload:).and_return(mock_processor)
+
+ patch "/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/confirm"
+
+ expect(mock_processor).to have_received(:approve)
+
+ expect(response).to redirect_to("/lettings-logs/bulk-upload-results/#{bulk_upload.id}/resume")
+ end
+ end
+end
diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb
index 9787ce097..eb47fdb87 100644
--- a/spec/requests/form_controller_spec.rb
+++ b/spec/requests/form_controller_spec.rb
@@ -321,6 +321,23 @@ RSpec.describe FormController, type: :request do
get "/sales-logs/#{log.id}/review", headers: headers, params: { sales_log: true }
expect(response.body).to match("Review sales log")
end
+
+ context "when log is pending" do
+ let(:pending_log) do
+ create(
+ :lettings_log,
+ owning_organisation: organisation,
+ created_by: user,
+ status: "pending",
+ skip_update_status: true,
+ )
+ end
+
+ it "does not render pending log and returns 404" do
+ get "/lettings-logs/#{pending_log.id}/review", headers: headers, params: {}
+ expect(response).to be_not_found
+ end
+ end
end
context "when viewing a user dependent page" do
diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb
index 23df8e1b8..d95e0a3fd 100644
--- a/spec/requests/lettings_logs_controller_spec.rb
+++ b/spec/requests/lettings_logs_controller_spec.rb
@@ -224,6 +224,15 @@ RSpec.describe LettingsLogsController, type: :request do
tenancycode: "UA984",
)
end
+ let!(:pending_lettings_log) do
+ FactoryBot.create(
+ :lettings_log,
+ created_by: user,
+ tenancycode: "LC999",
+ status: "pending",
+ skip_update_status: true,
+ )
+ end
context "when displaying a collection of logs" do
let(:headers) { { "Accept" => "text/html" } }
@@ -261,6 +270,7 @@ RSpec.describe LettingsLogsController, type: :request do
get "/lettings-logs", headers:, params: {}
expect(page).to have_content("LC783")
expect(page).to have_content("UA984")
+ expect(page).not_to have_content(pending_lettings_log.tenancycode)
end
it "displays CSV download links with the correct paths" do
@@ -841,6 +851,24 @@ RSpec.describe LettingsLogsController, type: :request do
end
end
+ context "when viewing a pending log" do
+ let(:completed_lettings_log) do
+ FactoryBot.create(
+ :lettings_log,
+ :completed,
+ owning_organisation: user.organisation,
+ managing_organisation: user.organisation,
+ created_by: user,
+ status: "pending",
+ skip_update_status: true,
+ )
+ end
+
+ it "returns 404" do
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+
context "when editing a lettings log" do
let(:headers) { { "Accept" => "text/html" } }
@@ -1319,9 +1347,12 @@ RSpec.describe LettingsLogsController, type: :request do
end
context "when a lettings log deletion fails" do
+ let(:mock_scope) { instance_double("LettingsLog::ActiveRecord_Relation", find_by: lettings_log) }
+
before do
- allow(LettingsLog).to receive(:find_by).and_return(lettings_log)
+ allow(LettingsLog).to receive(:visible).and_return(mock_scope)
allow(lettings_log).to receive(:delete).and_return(false)
+
delete "/lettings-logs/#{id}", headers:
end
diff --git a/spec/requests/organisations_controller_spec.rb b/spec/requests/organisations_controller_spec.rb
index e7cb7fea3..15cfba390 100644
--- a/spec/requests/organisations_controller_spec.rb
+++ b/spec/requests/organisations_controller_spec.rb
@@ -591,6 +591,7 @@ RSpec.describe OrganisationsController, type: :request do
before do
FactoryBot.create_list(:lettings_log, number_of_org1_lettings_logs, created_by: user)
+ FactoryBot.create(:lettings_log, created_by: user, status: "pending", skip_update_status: true)
FactoryBot.create_list(:lettings_log, number_of_org2_lettings_logs, created_by: nil, owning_organisation_id: unauthorised_organisation.id, managing_organisation_id: unauthorised_organisation.id)
get "/organisations/#{organisation.id}/lettings-logs", headers:, params: {}
@@ -598,7 +599,8 @@ RSpec.describe OrganisationsController, type: :request do
it "only shows logs for that organisation" do
expect(page).to have_content("#{number_of_org1_lettings_logs} total logs")
- organisation.lettings_logs.map(&:id).each do |lettings_log_id|
+
+ organisation.lettings_logs.visible.map(&:id).each do |lettings_log_id|
expect(page).to have_link lettings_log_id.to_s, href: "/lettings-logs/#{lettings_log_id}"
end
@@ -1155,6 +1157,7 @@ RSpec.describe OrganisationsController, type: :request do
before do
FactoryBot.create_list(:lettings_log, 2, owning_organisation: organisation)
+ FactoryBot.create(:lettings_log, owning_organisation: organisation, status: "pending", skip_update_status: true)
FactoryBot.create_list(:lettings_log, 2, owning_organisation: other_organisation)
end
diff --git a/spec/requests/sales_logs_controller_spec.rb b/spec/requests/sales_logs_controller_spec.rb
index 14341cd33..e400366df 100644
--- a/spec/requests/sales_logs_controller_spec.rb
+++ b/spec/requests/sales_logs_controller_spec.rb
@@ -159,6 +159,22 @@ RSpec.describe SalesLogsController, type: :request do
end
end
+ context "when there is a pending log" do
+ let!(:invisible_log) do
+ FactoryBot.create(
+ :sales_log,
+ owning_organisation: organisation,
+ status: "pending",
+ skip_update_status: true,
+ )
+ end
+
+ it "does not render pending logs" do
+ get "/sales-logs", headers: headers, params: {}
+ expect(page).not_to have_content(invisible_log.id)
+ end
+ end
+
context "when filtering" do
context "with status filter" do
let(:organisation_2) { FactoryBot.create(:organisation) }
diff --git a/spec/services/bulk_upload/lettings/log_creator_spec.rb b/spec/services/bulk_upload/lettings/log_creator_spec.rb
index 8b320c35f..2f05a0ba5 100644
--- a/spec/services/bulk_upload/lettings/log_creator_spec.rb
+++ b/spec/services/bulk_upload/lettings/log_creator_spec.rb
@@ -15,6 +15,11 @@ RSpec.describe BulkUpload::Lettings::LogCreator do
expect { service.call }.to change(LettingsLog, :count)
end
+ it "create a log with pending status" do
+ service.call
+ expect(LettingsLog.last.status).to eql("pending")
+ end
+
it "associates log with bulk upload" do
service.call
@@ -77,6 +82,23 @@ RSpec.describe BulkUpload::Lettings::LogCreator do
end
end
+ context "when pre-creating logs" do
+ subject(:service) { described_class.new(bulk_upload:, path:) }
+
+ it "creates a new log" do
+ expect { service.call }.to change(LettingsLog, :count)
+ end
+
+ it "creates a log with correct states" do
+ service.call
+
+ last_log = LettingsLog.last
+
+ expect(last_log.status).to eql("pending")
+ expect(last_log.status_cache).to eql("completed")
+ end
+ end
+
context "when valid csv with existing log" do
xit "what should happen?"
end
diff --git a/spec/services/bulk_upload/lettings/validator_spec.rb b/spec/services/bulk_upload/lettings/validator_spec.rb
index e5ac5350c..46c01fa91 100644
--- a/spec/services/bulk_upload/lettings/validator_spec.rb
+++ b/spec/services/bulk_upload/lettings/validator_spec.rb
@@ -273,58 +273,5 @@ RSpec.describe BulkUpload::Lettings::Validator do
end
end
end
-
- context "when a column has error rate above absolute threshold" do
- before do
- stub_const("BulkUpload::Lettings::Validator::COLUMN_ABSOLUTE_ERROR_THRESHOLD", 1)
- end
-
- context "when a column is over 60% error threshold" do
- let(:log_1) { build(:lettings_log, :completed, renttype: 1, created_by: user) }
- let(:log_2) { build(:lettings_log, renttype: 2, created_by: user, builtype: nil, startdate: Time.zone.local(2022, 5, 1)) }
- let(:log_3) { build(:lettings_log, renttype: 2, created_by: user, builtype: nil, startdate: Time.zone.local(2022, 5, 1)) }
- let(:log_4) { build(:lettings_log, renttype: 2, created_by: user, builtype: nil, startdate: Time.zone.local(2022, 5, 1)) }
- let(:log_5) { build(:lettings_log, renttype: 2, created_by: user, builtype: nil, startdate: Time.zone.local(2022, 5, 1)) }
-
- before do
- file.write(BulkUpload::LogToCsv.new(log: log_1, line_ending: "\r\n", col_offset: 0).to_2022_csv_row)
- file.write(BulkUpload::LogToCsv.new(log: log_2, line_ending: "\r\n", col_offset: 0).to_2022_csv_row)
- file.write(BulkUpload::LogToCsv.new(log: log_3, line_ending: "\r\n", col_offset: 0).to_2022_csv_row)
- file.write(BulkUpload::LogToCsv.new(log: log_4, line_ending: "\r\n", col_offset: 0).to_2022_csv_row)
- file.write(BulkUpload::LogToCsv.new(log: log_5, line_ending: "\r\n", col_offset: 0).to_2022_csv_row)
- file.close
- end
-
- it "returns false" do
- validator.call
- expect(validator).not_to be_create_logs
- end
- end
-
- context "when a column is under 60% error threshold" do
- let(:log_1) { build(:lettings_log, :completed, renttype: 1, created_by: user) }
- let(:log_2) { build(:lettings_log, :completed, renttype: 1, created_by: user) }
- let(:log_3) { build(:lettings_log, renttype: 2, created_by: user, builtype: nil, startdate: Time.zone.local(2022, 5, 1)) }
- let(:log_4) { build(:lettings_log, renttype: 2, created_by: user, builtype: nil, startdate: Time.zone.local(2022, 5, 1)) }
- let(:log_5) { build(:lettings_log, renttype: 2, created_by: user, builtype: nil, startdate: Time.zone.local(2022, 5, 1)) }
-
- before do
- overrides = { age1: 50, age2: "R", age3: "R", age4: "4", age5: "R", age6: "R", age7: "R", age8: "R" }
-
- file.write(BulkUpload::LogToCsv.new(log: log_1, line_ending: "\r\n", col_offset: 0, overrides:).to_2022_csv_row)
- file.write(BulkUpload::LogToCsv.new(log: log_2, line_ending: "\r\n", col_offset: 0, overrides:).to_2022_csv_row)
- file.write(BulkUpload::LogToCsv.new(log: log_3, line_ending: "\r\n", col_offset: 0, overrides:).to_2022_csv_row)
- file.write(BulkUpload::LogToCsv.new(log: log_4, line_ending: "\r\n", col_offset: 0, overrides:).to_2022_csv_row)
- file.write(BulkUpload::LogToCsv.new(log: log_5, line_ending: "\r\n", col_offset: 0, overrides:).to_2022_csv_row)
-
- file.close
- end
-
- it "returns true" do
- validator.call
- expect(validator).to be_create_logs
- end
- end
- end
end
end
diff --git a/spec/services/bulk_upload/processor_spec.rb b/spec/services/bulk_upload/processor_spec.rb
index bd9e1a478..19bb1e73f 100644
--- a/spec/services/bulk_upload/processor_spec.rb
+++ b/spec/services/bulk_upload/processor_spec.rb
@@ -130,120 +130,111 @@ RSpec.describe BulkUpload::Processor do
end
end
- context "when processing a bulk upload with errors but below threshold (therefore creates logs)" do
+ context "when processing a bulk with perfect data" do
let(:mock_downloader) do
instance_double(
BulkUpload::Downloader,
call: nil,
- path: file_fixture("2022_23_lettings_bulk_upload.csv"),
+ path:,
delete_local_file!: nil,
)
end
- let(:mock_validator) do
- instance_double(
- BulkUpload::Lettings::Validator,
- invalid?: false,
- call: nil,
- any_setup_errors?: false,
- create_logs?: true,
+ let(:file) { Tempfile.new }
+ let(:path) { file.path }
+
+ let(:log) do
+ build(
+ :lettings_log,
+ :completed,
+ renttype: 3,
+ age1: 20,
+ owning_organisation: owning_org,
+ managing_organisation: owning_org,
+ created_by: nil,
+ national: 18,
+ waityear: 9,
+ joint: 2,
+ tenancy: 9,
+ ppcodenk: 0,
+ voiddate: nil,
+ mrcdate: nil,
+ startdate: Date.new(2022, 10, 1),
+ tenancylength: nil,
)
end
before do
+ file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_csv_row)
+ file.rewind
+
allow(BulkUpload::Downloader).to receive(:new).with(bulk_upload:).and_return(mock_downloader)
- allow(BulkUpload::Lettings::Validator).to receive(:new).and_return(mock_validator)
end
- it "deletes the local file afterwards" do
- processor.call
-
- expect(mock_downloader).to have_received(:delete_local_file!)
+ it "creates logs as not pending" do
+ expect { processor.call }.to change(LettingsLog.completed, :count).by(1)
end
- it "sends fix errors email" do
+ it "sends success email" do
mail_double = instance_double("ActionMailer::MessageDelivery", deliver_later: nil)
- allow(BulkUploadMailer).to receive(:send_bulk_upload_with_errors_mail).and_return(mail_double)
+ allow(BulkUploadMailer).to receive(:send_bulk_upload_complete_mail).and_return(mail_double)
processor.call
- expect(BulkUploadMailer).to have_received(:send_bulk_upload_with_errors_mail)
+ expect(BulkUploadMailer).to have_received(:send_bulk_upload_complete_mail)
expect(mail_double).to have_received(:deliver_later)
end
-
- it "does not send success email" do
- allow(BulkUploadMailer).to receive(:send_bulk_upload_complete_mail).and_call_original
-
- processor.call
-
- expect(BulkUploadMailer).not_to have_received(:send_bulk_upload_complete_mail)
- end
end
- context "when processing a bulk upload with errors but above threshold (therefore does not create logs)" do
+ context "when a bulk upload has an in progress log" do
let(:mock_downloader) do
instance_double(
BulkUpload::Downloader,
call: nil,
- path: file_fixture("2022_23_lettings_bulk_upload.csv"),
+ path:,
delete_local_file!: nil,
)
end
- let(:mock_validator) do
- instance_double(
- BulkUpload::Lettings::Validator,
- invalid?: false,
- call: nil,
- any_setup_errors?: false,
- create_logs?: false,
+ let(:file) { Tempfile.new }
+ let(:path) { file.path }
+
+ let(:log) do
+ LettingsLog.new(
+ lettype: 2,
+ renttype: 3,
+ owning_organisation: owning_org,
+ managing_organisation: owning_org,
+ startdate: Time.zone.local(2022, 10, 1),
+ renewal: 2,
)
end
before do
+ file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_csv_row)
+ file.rewind
+
allow(BulkUpload::Downloader).to receive(:new).with(bulk_upload:).and_return(mock_downloader)
- allow(BulkUpload::Lettings::Validator).to receive(:new).and_return(mock_validator)
end
- it "deletes the local file afterwards" do
- processor.call
-
- expect(mock_downloader).to have_received(:delete_local_file!)
+ it "creates pending log" do
+ expect { processor.call }.to change(LettingsLog.pending, :count).by(1)
end
- it "sends correct and upload again mail" do
+ it "sends how_fix_upload_mail" do
mail_double = instance_double("ActionMailer::MessageDelivery", deliver_later: nil)
- allow(BulkUploadMailer).to receive(:send_correct_and_upload_again_mail).and_return(mail_double)
+ allow(BulkUploadMailer).to receive(:send_how_fix_upload_mail).and_return(mail_double)
processor.call
- expect(BulkUploadMailer).to have_received(:send_correct_and_upload_again_mail)
+ expect(BulkUploadMailer).to have_received(:send_how_fix_upload_mail)
expect(mail_double).to have_received(:deliver_later)
end
-
- it "does not send fix errors email" do
- allow(BulkUploadMailer).to receive(:send_bulk_upload_with_errors_mail).and_call_original
-
- processor.call
-
- expect(BulkUploadMailer).not_to have_received(:send_bulk_upload_with_errors_mail)
- end
-
- it "does not send success email" do
- allow(BulkUploadMailer).to receive(:send_bulk_upload_complete_mail).and_call_original
-
- processor.call
-
- expect(BulkUploadMailer).not_to have_received(:send_bulk_upload_complete_mail)
- end
end
- context "when processing a bulk with perfect data" do
- let(:file) { Tempfile.new }
- let(:path) { file.path }
-
+ context "when upload has no setup errors something blocks log creation" do
let(:mock_downloader) do
instance_double(
BulkUpload::Downloader,
@@ -253,24 +244,20 @@ RSpec.describe BulkUpload::Processor do
)
end
+ let(:file) { Tempfile.new }
+ let(:path) { file.path }
+
+ let(:other_user) { create(:user) }
+
let(:log) do
- build(
- :lettings_log,
- :completed,
+ LettingsLog.new(
+ lettype: 2,
renttype: 3,
- age1: 20,
owning_organisation: owning_org,
managing_organisation: owning_org,
- created_by: nil,
- national: 18,
- waityear: 9,
- joint: 2,
- tenancy: 9,
- ppcodenk: 0,
- voiddate: nil,
- mrcdate: nil,
- startdate: Date.new(2022, 10, 1),
- tenancylength: nil,
+ startdate: Time.zone.local(2022, 10, 1),
+ renewal: 2,
+ created_by: other_user, # unaffiliated user
)
end
@@ -281,28 +268,26 @@ RSpec.describe BulkUpload::Processor do
allow(BulkUpload::Downloader).to receive(:new).with(bulk_upload:).and_return(mock_downloader)
end
- it "creates logs" do
- expect { processor.call }.to change(LettingsLog, :count).by(1)
- end
-
- it "does not send fix errors email" do
- allow(BulkUploadMailer).to receive(:send_bulk_upload_with_errors_mail).and_call_original
-
- processor.call
-
- expect(BulkUploadMailer).not_to have_received(:send_bulk_upload_with_errors_mail)
- end
-
- it "sends success email" do
+ it "sends correct_and_upload_again_mail" do
mail_double = instance_double("ActionMailer::MessageDelivery", deliver_later: nil)
- allow(BulkUploadMailer).to receive(:send_bulk_upload_complete_mail).and_return(mail_double)
+ allow(BulkUploadMailer).to receive(:send_correct_and_upload_again_mail).and_return(mail_double)
processor.call
- expect(BulkUploadMailer).to have_received(:send_bulk_upload_complete_mail)
+ expect(BulkUploadMailer).to have_received(:send_correct_and_upload_again_mail)
expect(mail_double).to have_received(:deliver_later)
end
end
end
+
+ describe "#approve" do
+ let!(:log) { create(:lettings_log, bulk_upload:, status: "pending", skip_update_status: true, status_cache: "not_started") }
+
+ it "makes pending logs no longer pending" do
+ expect(log.status).to eql("pending")
+ processor.approve
+ expect(log.reload.status).to eql("not_started")
+ end
+ end
end
diff --git a/spec/services/csv/lettings_log_csv_service_spec.rb b/spec/services/csv/lettings_log_csv_service_spec.rb
index 95d24e0da..1a752035d 100644
--- a/spec/services/csv/lettings_log_csv_service_spec.rb
+++ b/spec/services/csv/lettings_log_csv_service_spec.rb
@@ -209,6 +209,7 @@ RSpec.describe Csv::LettingsLogCsvService do
address_line2
town_or_city
county
+ status_cache
unittype_sh
scheme_code
scheme_service_name
diff --git a/spec/services/exports/lettings_log_export_service_spec.rb b/spec/services/exports/lettings_log_export_service_spec.rb
index dbc4b246b..6580a6acd 100644
--- a/spec/services/exports/lettings_log_export_service_spec.rb
+++ b/spec/services/exports/lettings_log_export_service_spec.rb
@@ -59,6 +59,35 @@ RSpec.describe Exports::LettingsLogExportService do
end
end
+ context "when one pending lettings log exists" do
+ before do
+ FactoryBot.create(
+ :lettings_log,
+ :completed,
+ status: "pending",
+ skip_update_status: true,
+ propcode: "123",
+ ppostcode_full: "SE2 6RT",
+ postcode_full: "NW1 5TY",
+ tenancycode: "BZ737",
+ startdate: Time.zone.local(2022, 2, 2, 10, 36, 49),
+ voiddate: Time.zone.local(2019, 11, 3),
+ mrcdate: Time.zone.local(2020, 5, 5, 10, 36, 49),
+ tenancylength: 5,
+ underoccupation_benefitcap: 4,
+ )
+ end
+
+ it "generates a master manifest with CSV headers but no data" do
+ actual_content = nil
+ expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\n"
+ allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string }
+
+ export_service.export_xml_lettings_logs
+ expect(actual_content).to eq(expected_content)
+ end
+ end
+
context "and one lettings log is available for export" do
let!(:lettings_log) { FactoryBot.create(:lettings_log, :completed, propcode: "123", ppostcode_full: "SE2 6RT", postcode_full: "NW1 5TY", tenancycode: "BZ737", startdate: Time.zone.local(2022, 2, 2, 10, 36, 49), voiddate: Time.zone.local(2019, 11, 3), mrcdate: Time.zone.local(2020, 5, 5, 10, 36, 49), tenancylength: 5, underoccupation_benefitcap: 4) }
diff --git a/spec/services/imports/lettings_logs_import_service_spec.rb b/spec/services/imports/lettings_logs_import_service_spec.rb
index 2acdadf7b..50a285ed9 100644
--- a/spec/services/imports/lettings_logs_import_service_spec.rb
+++ b/spec/services/imports/lettings_logs_import_service_spec.rb
@@ -532,11 +532,11 @@ RSpec.describe Imports::LettingsLogsImportService do
end
it "intercepts the relevant validation error" do
- expect(logger).to receive(:warn).with(/Removing brent with error: Enter a total charge that is at least £10 per week, Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?/)
- expect(logger).to receive(:warn).with(/Removing scharge with error: Enter a total charge that is at least £10 per week, Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?/)
- expect(logger).to receive(:warn).with(/Removing pscharge with error: Enter a total charge that is at least £10 per week, Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?/)
- expect(logger).to receive(:warn).with(/Removing supcharg with error: Enter a total charge that is at least £10 per week, Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?/)
- expect(logger).to receive(:warn).with(/Removing tcharge with error: Enter a total charge that is at least £10 per week, Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?/)
+ expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing brent with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week")
+ expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing scharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week")
+ expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing pscharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week")
+ expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing supcharg with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week")
+ expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing tcharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week")
expect { lettings_log_service.send(:create_log, lettings_log_xml) }
.not_to raise_error
end
@@ -560,11 +560,11 @@ RSpec.describe Imports::LettingsLogsImportService do
end
it "intercepts the relevant validation error" do
- expect(logger).to receive(:warn).with(/Removing brent with error: Enter an amount above 0, Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Service charge must be at least £0 every week/)
- expect(logger).to receive(:warn).with(/Removing scharge with error: Enter an amount above 0, Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Service charge must be at least £0 every week/)
- expect(logger).to receive(:warn).with(/Removing pscharge with error: Enter an amount above 0, Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Service charge must be at least £0 every week/)
- expect(logger).to receive(:warn).with(/Removing supcharg with error: Enter an amount above 0, Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Service charge must be at least £0 every week/)
- expect(logger).to receive(:warn).with(/Removing tcharge with error: Enter an amount above 0, Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Service charge must be at least £0 every week/)
+ expect(logger).to receive(:warn).with(/Removing brent with error: Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Enter an amount above 0, Service charge must be at least £0 every week/)
+ expect(logger).to receive(:warn).with(/Removing scharge with error: Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Enter an amount above 0, Service charge must be at least £0 every week/)
+ expect(logger).to receive(:warn).with(/Removing pscharge with error: Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Enter an amount above 0, Service charge must be at least £0 every week/)
+ expect(logger).to receive(:warn).with(/Removing supcharg with error: Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Enter an amount above 0, Service charge must be at least £0 every week/)
+ expect(logger).to receive(:warn).with(/Removing tcharge with error: Enter a value for the service charge between £0 and £480 per week if the landlord is a private registered provider and it is a supported housing letting, Enter an amount above 0, Service charge must be at least £0 every week/)
expect { lettings_log_service.send(:create_log, lettings_log_xml) }
.not_to raise_error
end
diff --git a/spec/support/bulk_upload/log_to_csv.rb b/spec/support/bulk_upload/log_to_csv.rb
index a2d8c2f5f..55a199e7f 100644
--- a/spec/support/bulk_upload/log_to_csv.rb
+++ b/spec/support/bulk_upload/log_to_csv.rb
@@ -170,7 +170,7 @@ class BulkUpload::LogToCsv
nil, # 110
log.owning_organisation&.old_visible_id,
- nil,
+ log.created_by&.email,
log.managing_organisation&.old_visible_id,
leftreg,
nil,