From a9b67095bbf0102dde980156da09833cdd711bf6 Mon Sep 17 00:00:00 2001 From: Jack S Date: Mon, 15 May 2023 15:42:50 +0100 Subject: [PATCH] Soft delete logs --- app/controllers/application_controller.rb | 4 - app/controllers/lettings_logs_controller.rb | 8 +- app/controllers/sales_logs_controller.rb | 8 +- app/models/log.rb | 8 + app/services/csv/lettings_log_csv_service.rb | 2 +- .../exports/lettings_log_export_service.rb | 4 +- ...20230515114101_add_discarded_at_to_logs.rb | 6 + db/schema.rb | 6 +- spec/factories/lettings_log.rb | 4 + spec/factories/sales_log.rb | 4 + .../fixtures/files/lettings_logs_download.csv | 4 +- .../lettings_logs_download_codes_only.csv | 4 +- spec/models/lettings_log_spec.rb | 24 +- spec/models/sales_log_spec.rb | 26 +- .../requests/lettings_logs_controller_spec.rb | 17 +- spec/requests/sales_logs_controller_spec.rb | 17 +- .../csv/lettings_log_csv_service_spec.rb | 783 +++++++++--------- spec/shared/shared_log_examples.rb | 49 ++ 18 files changed, 494 insertions(+), 484 deletions(-) create mode 100644 db/migrate/20230515114101_add_discarded_at_to_logs.rb create mode 100644 spec/shared/shared_log_examples.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 77486f635..ff085e6dc 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -13,10 +13,6 @@ class ApplicationController < ActionController::Base render "errors/not_found", status: :unauthorized end - def render_internal_server_error - render "errors/internal_server_error", status: :internal_server_error - end - def render_not_found_json(class_name, id) render json: { error: "#{class_name} #{id} not found" }, status: :not_found end diff --git a/app/controllers/lettings_logs_controller.rb b/app/controllers/lettings_logs_controller.rb index 2d19908b0..e20fad70a 100644 --- a/app/controllers/lettings_logs_controller.rb +++ b/app/controllers/lettings_logs_controller.rb @@ -72,11 +72,9 @@ class LettingsLogsController < LogsController authorize @log, policy_class: LogPolicy - if @log.delete - redirect_to lettings_logs_path, notice: "Log #{@log.id} has been deleted" - else - render_internal_server_error - end + @log.discard! + + redirect_to lettings_logs_path, notice: "Log #{@log.id} has been deleted" end def delete_confirmation diff --git a/app/controllers/sales_logs_controller.rb b/app/controllers/sales_logs_controller.rb index 80bfef9d7..a9f86a1f9 100644 --- a/app/controllers/sales_logs_controller.rb +++ b/app/controllers/sales_logs_controller.rb @@ -47,11 +47,9 @@ class SalesLogsController < LogsController authorize @log, policy_class: LogPolicy - if @log.delete - redirect_to sales_logs_path, notice: "Log #{@log.id} has been deleted" - else - render_internal_server_error - end + @log.discard! + + redirect_to sales_logs_path, notice: "Log #{@log.id} has been deleted" end def delete_confirmation diff --git a/app/models/log.rb b/app/models/log.rb index 6ef5dabf5..1f6f1ff67 100644 --- a/app/models/log.rb +++ b/app/models/log.rb @@ -15,11 +15,13 @@ class Log < ApplicationRecord "in_progress" => 1, "completed" => 2, "pending" => 3, + "deleted" => 4, }.freeze enum status: STATUS enum status_cache: STATUS, _prefix: true scope :visible, -> { where(status: %w[not_started in_progress completed]) } + scope :exportable, -> { where(status: %w[not_started in_progress completed deleted]) } scope :filter_by_status, ->(status, _user = nil) { where status: } scope :filter_by_years, lambda { |years, _user = nil| @@ -129,7 +131,13 @@ class Log < ApplicationRecord end end + def discard! + update!(status: "deleted", discarded_at: Time.zone.now) + end + def calculate_status + return "deleted" if discarded_at.present? + if all_fields_completed? && errors.empty? "completed" elsif all_fields_nil? diff --git a/app/services/csv/lettings_log_csv_service.rb b/app/services/csv/lettings_log_csv_service.rb index e0815d164..e8c2815f5 100644 --- a/app/services/csv/lettings_log_csv_service.rb +++ b/app/services/csv/lettings_log_csv_service.rb @@ -1,6 +1,6 @@ module Csv class LettingsLogCsvService - CSV_FIELDS_TO_OMIT = %w[hhmemb net_income_value_check first_time_property_let_as_social_housing renttype needstype postcode_known is_la_inferred totchild totelder totadult net_income_known is_carehome previous_la_known is_previous_la_inferred age1_known age2_known age3_known age4_known age5_known age6_known age7_known age8_known letting_allocation_unknown details_known_2 details_known_3 details_known_4 details_known_5 details_known_6 details_known_7 details_known_8 rent_type_detail wrent wscharge wpschrge wsupchrg wtcharge wtshortfall rent_value_check old_form_id old_id retirement_value_check tshortfall_known pregnancy_value_check hhtype new_old vacdays la prevloc unresolved updated_by_id bulk_upload_id uprn_confirmed status_cache].freeze + CSV_FIELDS_TO_OMIT = %w[hhmemb net_income_value_check first_time_property_let_as_social_housing renttype needstype postcode_known is_la_inferred totchild totelder totadult net_income_known is_carehome previous_la_known is_previous_la_inferred age1_known age2_known age3_known age4_known age5_known age6_known age7_known age8_known letting_allocation_unknown details_known_2 details_known_3 details_known_4 details_known_5 details_known_6 details_known_7 details_known_8 rent_type_detail wrent wscharge wpschrge wsupchrg wtcharge wtshortfall rent_value_check old_form_id old_id retirement_value_check tshortfall_known pregnancy_value_check hhtype new_old vacdays la prevloc unresolved updated_by_id bulk_upload_id uprn_confirmed status_cache discarded_at].freeze def initialize(user, export_type:) @user = user diff --git a/app/services/exports/lettings_log_export_service.rb b/app/services/exports/lettings_log_export_service.rb index 429361913..8749d682f 100644 --- a/app/services/exports/lettings_log_export_service.rb +++ b/app/services/exports/lettings_log_export_service.rb @@ -119,10 +119,10 @@ module Exports if !full_update && recent_export params = { from: recent_export.started_at, to: start_time } - LettingsLog.visible.where("updated_at >= :from and updated_at <= :to", params) + LettingsLog.exportable.where("updated_at >= :from and updated_at <= :to", params) else params = { to: start_time } - LettingsLog.visible.where("updated_at <= :to", params) + LettingsLog.exportable.where("updated_at <= :to", params) end end diff --git a/db/migrate/20230515114101_add_discarded_at_to_logs.rb b/db/migrate/20230515114101_add_discarded_at_to_logs.rb new file mode 100644 index 000000000..10c1bb7e5 --- /dev/null +++ b/db/migrate/20230515114101_add_discarded_at_to_logs.rb @@ -0,0 +1,6 @@ +class AddDiscardedAtToLogs < ActiveRecord::Migration[7.0] + def change + add_column :sales_logs, :discarded_at, :datetime + add_column :lettings_logs, :discarded_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index fee35ec37..6c33dd973 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_05_05_105327) do +ActiveRecord::Schema[7.0].define(version: 2023_05_15_114101) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -288,6 +288,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_05_05_105327) do t.string "county" t.integer "carehome_charges_value_check" t.integer "status_cache", default: 0, null: false + t.datetime "discarded_at" 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" @@ -599,8 +600,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_05_05_105327) do t.integer "student_not_child_value_check" t.integer "percentage_discount_value_check" t.integer "buyer_livein_value_check" - t.integer "combined_income_value_check" t.integer "status_cache", default: 0, null: false + t.integer "combined_income_value_check" + t.datetime "discarded_at" t.index ["bulk_upload_id"], name: "index_sales_logs_on_bulk_upload_id" t.index ["created_by_id"], name: "index_sales_logs_on_created_by_id" t.index ["old_id"], name: "index_sales_logs_on_old_id", unique: true diff --git a/spec/factories/lettings_log.rb b/spec/factories/lettings_log.rb index 58c81e8f3..ec119fbdc 100644 --- a/spec/factories/lettings_log.rb +++ b/spec/factories/lettings_log.rb @@ -164,6 +164,10 @@ FactoryBot.define do trait :startdate_today do startdate { Time.zone.today } end + trait :deleted do + status { 4 } + discarded_at { Time.zone.now } + end created_at { Time.zone.today } updated_at { Time.zone.today } end diff --git a/spec/factories/sales_log.rb b/spec/factories/sales_log.rb index 0ea3787dc..29d95a1ec 100644 --- a/spec/factories/sales_log.rb +++ b/spec/factories/sales_log.rb @@ -129,5 +129,9 @@ FactoryBot.define do trait :with_uprn do uprn { rand(999_999_999_999).to_s } end + trait :deleted do + status { 4 } + discarded_at { Time.zone.now } + end end end diff --git a/spec/fixtures/files/lettings_logs_download.csv b/spec/fixtures/files/lettings_logs_download.csv index 075792363..5a68a29db 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,rent_value_check,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,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} +id,status,created_at,updated_at,created_by_name,is_dpo,owning_organisation_name,managing_organisation_name,collection_start_year,rent_value_check,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,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,discarded_at,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 76dde6a7b..f7374afaa 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,rent_value_check,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,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} +id,status,created_at,updated_at,created_by_name,is_dpo,owning_organisation_name,managing_organisation_name,collection_start_year,rent_value_check,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,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,discarded_at,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/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 5e661fe16..28c5ccb75 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -1,5 +1,6 @@ require "rails_helper" require "shared/shared_examples_for_derived_fields" +require "shared/shared_log_examples" # rubocop:disable RSpec/MessageChain # rubocop:disable RSpec/AnyInstance @@ -23,6 +24,7 @@ RSpec.describe LettingsLog do end include_examples "shared examples for derived fields", :lettings_log + include_examples "shared log examples", :lettings_log it "inherits from log" do expect(described_class).to be < Log @@ -183,27 +185,7 @@ RSpec.describe LettingsLog do end describe "status" do - let!(:empty_lettings_log) { create(:lettings_log) } - let!(:in_progress_lettings_log) { create(:lettings_log, :in_progress) } - let!(:completed_lettings_log) { create(:lettings_log, :completed) } - - it "is set to not started for an empty lettings log" do - expect(empty_lettings_log.not_started?).to be(true) - expect(empty_lettings_log.in_progress?).to be(false) - expect(empty_lettings_log.completed?).to be(false) - end - - it "is set to in progress for a started lettings log" do - expect(in_progress_lettings_log.in_progress?).to be(true) - expect(in_progress_lettings_log.not_started?).to be(false) - expect(in_progress_lettings_log.completed?).to be(false) - end - - it "is set to completed for a completed lettings log" do - expect(completed_lettings_log.in_progress?).to be(false) - expect(completed_lettings_log.not_started?).to be(false) - expect(completed_lettings_log.completed?).to be(true) - end + let(:completed_lettings_log) { create(:lettings_log, :completed) } context "when only a subsection that is hidden in tasklist is not completed" do let(:household_characteristics_subsection) { completed_lettings_log.form.get_subsection("household_characteristics") } diff --git a/spec/models/sales_log_spec.rb b/spec/models/sales_log_spec.rb index bc0a96150..9845637d1 100644 --- a/spec/models/sales_log_spec.rb +++ b/spec/models/sales_log_spec.rb @@ -1,5 +1,6 @@ require "rails_helper" require "shared/shared_examples_for_derived_fields" +require "shared/shared_log_examples" # rubocop:disable RSpec/MessageChain # rubocop:disable RSpec/AnyInstance @@ -8,6 +9,7 @@ RSpec.describe SalesLog, type: :model do let(:created_by_user) { create(:user) } include_examples "shared examples for derived fields", :sales_log + include_examples "shared log examples", :sales_log it "inherits from log" do expect(described_class).to be < Log @@ -112,27 +114,7 @@ RSpec.describe SalesLog, type: :model do end describe "status" do - let!(:empty_sales_log) { create(:sales_log) } - let!(:in_progress_sales_log) { create(:sales_log, :in_progress) } - let!(:completed_sales_log) { create(:sales_log, :completed) } - - it "is set to not started for an empty sales log" do - expect(empty_sales_log.not_started?).to be(true) - expect(empty_sales_log.in_progress?).to be(false) - expect(empty_sales_log.completed?).to be(false) - end - - it "is set to in progress for a started sales log" do - expect(in_progress_sales_log.in_progress?).to be(true) - expect(in_progress_sales_log.not_started?).to be(false) - expect(in_progress_sales_log.completed?).to be(false) - end - - it "is set to completed for a completed sales log" do - expect(completed_sales_log.in_progress?).to be(false) - expect(completed_sales_log.not_started?).to be(false) - expect(completed_sales_log.completed?).to be(true) - end + let(:completed_sales_log) { create(:sales_log, :completed) } context "when proplen is not given" do before do @@ -148,6 +130,7 @@ RSpec.describe SalesLog, type: :model do expect(completed_sales_log.in_progress?).to be(false) expect(completed_sales_log.not_started?).to be(false) expect(completed_sales_log.completed?).to be(true) + expect(completed_sales_log.deleted?).to be(false) end it "is set to in_progress for a log with a saledate after 23/24" do @@ -155,6 +138,7 @@ RSpec.describe SalesLog, type: :model do expect(completed_sales_log.in_progress?).to be(true) expect(completed_sales_log.not_started?).to be(false) expect(completed_sales_log.completed?).to be(false) + expect(completed_sales_log.deleted?).to be(false) end end end diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb index aa766febd..af4e0a2d4 100644 --- a/spec/requests/lettings_logs_controller_spec.rb +++ b/spec/requests/lettings_logs_controller_spec.rb @@ -1323,19 +1323,6 @@ RSpec.describe LettingsLogsController, type: :request do sign_in user end - # rubocop:disable RSpec/AnyInstance - context "when log deletion errors" do - before do - allow_any_instance_of(LettingsLog).to receive(:delete).and_return(false) - end - - it "renders 500 page" do - delete_request - expect(response).to have_http_status(:internal_server_error) - end - end - # rubocop:enable RSpec/AnyInstance - context "when delete permitted" do it "redirects to lettings logs and shows message" do delete_request @@ -1344,8 +1331,8 @@ RSpec.describe LettingsLogsController, type: :request do expect(page).to have_content("Log #{id} has been deleted") end - it "deletes the log" do - expect { delete_request }.to change { LettingsLog.exists?(id) }.from(true).to(false) + it "marks the log as deleted" do + expect { delete_request }.to change { lettings_log.reload.status }.from("completed").to("deleted") end end diff --git a/spec/requests/sales_logs_controller_spec.rb b/spec/requests/sales_logs_controller_spec.rb index 2e8cddaee..a6f614a34 100644 --- a/spec/requests/sales_logs_controller_spec.rb +++ b/spec/requests/sales_logs_controller_spec.rb @@ -668,19 +668,6 @@ RSpec.describe SalesLogsController, type: :request do sign_in user end - # rubocop:disable RSpec/AnyInstance - context "when log deletion errors" do - before do - allow_any_instance_of(SalesLog).to receive(:delete).and_return(false) - end - - it "renders 500 page" do - delete_request - expect(response).to have_http_status(:internal_server_error) - end - end - # rubocop:enable RSpec/AnyInstance - context "when delete permitted" do it "redirects to sales logs and shows message" do delete_request @@ -689,8 +676,8 @@ RSpec.describe SalesLogsController, type: :request do expect(page).to have_content("Log #{id} has been deleted") end - it "deletes the log" do - expect { delete_request }.to change { SalesLog.exists?(id) }.from(true).to(false) + it "marks the log as deleted" do + expect { delete_request }.to change { sales_log.reload.status }.from("completed").to("deleted") 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 1ee3b9df1..6cf5dce9f 100644 --- a/spec/services/csv/lettings_log_csv_service_spec.rb +++ b/spec/services/csv/lettings_log_csv_service_spec.rb @@ -2,7 +2,7 @@ require "rails_helper" RSpec.describe Csv::LettingsLogCsvService do context "when the user is support" do - let(:user) { FactoryBot.create(:user, :support) } + let(:user) { create(:user, :support) } let(:real_2021_2022_form) { Form.new("config/forms/2021_2022.json") } before do @@ -11,226 +11,229 @@ RSpec.describe Csv::LettingsLogCsvService do end it "sets csv attributes in correct order" do - expected_csv_attributes = %w[id - status - created_at - updated_at - created_by_name - is_dpo - owning_organisation_name - managing_organisation_name - collection_start_year - rent_value_check - needstype - renewal - startdate - rent_type_detail - irproduct_other - tenancycode - propcode - postcode_known - postcode_full - is_la_inferred - la_label - la - first_time_property_let_as_social_housing - unitletas - rsnvac - offered - unittype_gn - builtype - wchair - beds - voiddate - void_date_value_check - majorrepairs - mrcdate - major_repairs_date_value_check - startertenancy - tenancy - tenancyother - tenancylength - sheltered - declaration - hhmemb - pregnancy_value_check - age1_known - age1 - sex1 - ethnic_group - ethnic - national - ecstat1 - retirement_value_check - details_known_2 - relat2 - age2_known - age2 - sex2 - ecstat2 - details_known_3 - relat3 - age3_known - age3 - sex3 - ecstat3 - details_known_4 - relat4 - age4_known - age4 - sex4 - ecstat4 - details_known_5 - relat5 - age5_known - age5 - sex5 - ecstat5 - details_known_6 - relat6 - age6_known - age6 - sex6 - ecstat6 - details_known_7 - relat7 - age7_known - age7 - sex7 - ecstat7 - details_known_8 - relat8 - age8_known - age8 - sex8 - ecstat8 - armedforces - leftreg - reservist - preg_occ - housingneeds - housingneeds_type - housingneeds_other - illness - illness_type_4 - illness_type_5 - illness_type_2 - illness_type_6 - illness_type_7 - illness_type_3 - illness_type_9 - illness_type_8 - illness_type_1 - illness_type_10 - layear - waityear - reason - reasonother - prevten - underoccupation_benefitcap - homeless - ppcodenk - ppostcode_full - previous_la_known - is_previous_la_inferred - prevloc_label - prevloc - reasonpref - rp_homeless - rp_insan_unsat - rp_medwel - rp_hardship - rp_dontknow - cbl - cap - chr - letting_allocation_unknown - referral - net_income_known - earnings - incfreq - net_income_value_check - hb - benefits - household_charge - period - is_carehome - chcharge - carehome_charges_value_check - brent - scharge - pscharge - supcharg - tcharge - hbrentshortfall - tshortfall_known - tshortfall - housingneeds_a - housingneeds_b - housingneeds_c - housingneeds_f - housingneeds_g - housingneeds_h - property_owner_organisation - property_manager_organisation - purchaser_code - property_relet - incref - renttype - lettype - totchild - totelder - totadult - nocharge - has_benefits - wrent - wscharge - wpschrge - wsupchrg - wtcharge - wtshortfall - refused - wchchrg - newprop - old_form_id - lar - irproduct - old_id - joint - hhtype - new_old - vacdays - unresolved - updated_by_id - uprn - uprn_known - uprn_confirmed - address_line1 - address_line2 - town_or_city - county - 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] + expected_csv_attributes = %w[ + id + status + created_at + updated_at + created_by_name + is_dpo + owning_organisation_name + managing_organisation_name + collection_start_year + rent_value_check + needstype + renewal + startdate + rent_type_detail + irproduct_other + tenancycode + propcode + postcode_known + postcode_full + is_la_inferred + la_label + la + first_time_property_let_as_social_housing + unitletas + rsnvac + offered + unittype_gn + builtype + wchair + beds + voiddate + void_date_value_check + majorrepairs + mrcdate + major_repairs_date_value_check + startertenancy + tenancy + tenancyother + tenancylength + sheltered + declaration + hhmemb + pregnancy_value_check + age1_known + age1 + sex1 + ethnic_group + ethnic + national + ecstat1 + retirement_value_check + details_known_2 + relat2 + age2_known + age2 + sex2 + ecstat2 + details_known_3 + relat3 + age3_known + age3 + sex3 + ecstat3 + details_known_4 + relat4 + age4_known + age4 + sex4 + ecstat4 + details_known_5 + relat5 + age5_known + age5 + sex5 + ecstat5 + details_known_6 + relat6 + age6_known + age6 + sex6 + ecstat6 + details_known_7 + relat7 + age7_known + age7 + sex7 + ecstat7 + details_known_8 + relat8 + age8_known + age8 + sex8 + ecstat8 + armedforces + leftreg + reservist + preg_occ + housingneeds + housingneeds_type + housingneeds_other + illness + illness_type_4 + illness_type_5 + illness_type_2 + illness_type_6 + illness_type_7 + illness_type_3 + illness_type_9 + illness_type_8 + illness_type_1 + illness_type_10 + layear + waityear + reason + reasonother + prevten + underoccupation_benefitcap + homeless + ppcodenk + ppostcode_full + previous_la_known + is_previous_la_inferred + prevloc_label + prevloc + reasonpref + rp_homeless + rp_insan_unsat + rp_medwel + rp_hardship + rp_dontknow + cbl + cap + chr + letting_allocation_unknown + referral + net_income_known + earnings + incfreq + net_income_value_check + hb + benefits + household_charge + period + is_carehome + chcharge + carehome_charges_value_check + brent + scharge + pscharge + supcharg + tcharge + hbrentshortfall + tshortfall_known + tshortfall + housingneeds_a + housingneeds_b + housingneeds_c + housingneeds_f + housingneeds_g + housingneeds_h + property_owner_organisation + property_manager_organisation + purchaser_code + property_relet + incref + renttype + lettype + totchild + totelder + totadult + nocharge + has_benefits + wrent + wscharge + wpschrge + wsupchrg + wtcharge + wtshortfall + refused + wchchrg + newprop + old_form_id + lar + irproduct + old_id + joint + hhtype + new_old + vacdays + unresolved + updated_by_id + uprn + uprn_known + uprn_confirmed + address_line1 + address_line2 + town_or_city + county + status_cache + discarded_at + 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 + ] csv = CSV.parse(described_class.new(user, export_type: "labels").to_csv) @@ -248,174 +251,176 @@ RSpec.describe Csv::LettingsLogCsvService do end it "sets csv attributes in correct order and without omitted values" do - expected_csv_attributes = %w[id - status - created_at - updated_at - created_by_name - is_dpo - owning_organisation_name - managing_organisation_name - collection_start_year - renewal - startdate - irproduct_other - tenancycode - propcode - postcode_full - la_label - unitletas - rsnvac - offered - unittype_gn - builtype - wchair - beds - voiddate - void_date_value_check - majorrepairs - mrcdate - major_repairs_date_value_check - startertenancy - tenancy - tenancyother - tenancylength - sheltered - declaration - age1 - sex1 - ethnic_group - ethnic - national - ecstat1 - relat2 - age2 - sex2 - ecstat2 - relat3 - age3 - sex3 - ecstat3 - relat4 - age4 - sex4 - ecstat4 - relat5 - age5 - sex5 - ecstat5 - relat6 - age6 - sex6 - ecstat6 - relat7 - age7 - sex7 - ecstat7 - relat8 - age8 - sex8 - ecstat8 - armedforces - leftreg - reservist - preg_occ - housingneeds - housingneeds_type - housingneeds_other - illness - illness_type_4 - illness_type_5 - illness_type_2 - illness_type_6 - illness_type_7 - illness_type_3 - illness_type_9 - illness_type_8 - illness_type_1 - illness_type_10 - layear - waityear - reason - reasonother - prevten - underoccupation_benefitcap - homeless - ppcodenk - ppostcode_full - prevloc_label - reasonpref - rp_homeless - rp_insan_unsat - rp_medwel - rp_hardship - rp_dontknow - cbl - cap - chr - referral - earnings - incfreq - hb - benefits - household_charge - period - chcharge - carehome_charges_value_check - brent - scharge - pscharge - supcharg - tcharge - hbrentshortfall - tshortfall - housingneeds_a - housingneeds_b - housingneeds_c - housingneeds_f - housingneeds_g - housingneeds_h - property_owner_organisation - property_manager_organisation - purchaser_code - property_relet - incref - lettype - nocharge - has_benefits - refused - wchchrg - newprop - lar - irproduct - joint - uprn - uprn_known - address_line1 - address_line2 - town_or_city - county - 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] + expected_csv_attributes = %w[ + id + status + created_at + updated_at + created_by_name + is_dpo + owning_organisation_name + managing_organisation_name + collection_start_year + renewal + startdate + irproduct_other + tenancycode + propcode + postcode_full + la_label + unitletas + rsnvac + offered + unittype_gn + builtype + wchair + beds + voiddate + void_date_value_check + majorrepairs + mrcdate + major_repairs_date_value_check + startertenancy + tenancy + tenancyother + tenancylength + sheltered + declaration + age1 + sex1 + ethnic_group + ethnic + national + ecstat1 + relat2 + age2 + sex2 + ecstat2 + relat3 + age3 + sex3 + ecstat3 + relat4 + age4 + sex4 + ecstat4 + relat5 + age5 + sex5 + ecstat5 + relat6 + age6 + sex6 + ecstat6 + relat7 + age7 + sex7 + ecstat7 + relat8 + age8 + sex8 + ecstat8 + armedforces + leftreg + reservist + preg_occ + housingneeds + housingneeds_type + housingneeds_other + illness + illness_type_4 + illness_type_5 + illness_type_2 + illness_type_6 + illness_type_7 + illness_type_3 + illness_type_9 + illness_type_8 + illness_type_1 + illness_type_10 + layear + waityear + reason + reasonother + prevten + underoccupation_benefitcap + homeless + ppcodenk + ppostcode_full + prevloc_label + reasonpref + rp_homeless + rp_insan_unsat + rp_medwel + rp_hardship + rp_dontknow + cbl + cap + chr + referral + earnings + incfreq + hb + benefits + household_charge + period + chcharge + carehome_charges_value_check + brent + scharge + pscharge + supcharg + tcharge + hbrentshortfall + tshortfall + housingneeds_a + housingneeds_b + housingneeds_c + housingneeds_f + housingneeds_g + housingneeds_h + property_owner_organisation + property_manager_organisation + purchaser_code + property_relet + incref + lettype + nocharge + has_benefits + refused + wchchrg + newprop + lar + irproduct + joint + uprn + uprn_known + address_line1 + address_line2 + town_or_city + county + 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 + ] csv = CSV.parse(described_class.new(user, export_type: "labels").to_csv) diff --git a/spec/shared/shared_log_examples.rb b/spec/shared/shared_log_examples.rb new file mode 100644 index 000000000..1d663f522 --- /dev/null +++ b/spec/shared/shared_log_examples.rb @@ -0,0 +1,49 @@ +require "rails_helper" + +RSpec.shared_examples "shared log examples" do |log_type| + describe "status" do + let(:empty_log) { create(log_type) } + let(:in_progress_log) { create(log_type, :in_progress) } + let(:completed_log) { create(log_type, :completed) } + + it "is set to not started for an empty #{log_type} log" do + expect(empty_log.not_started?).to be(true) + expect(empty_log.in_progress?).to be(false) + expect(empty_log.completed?).to be(false) + expect(empty_log.deleted?).to be(false) + end + + it "is set to in progress for a started #{log_type} log" do + expect(in_progress_log.in_progress?).to be(true) + expect(in_progress_log.not_started?).to be(false) + expect(in_progress_log.completed?).to be(false) + expect(in_progress_log.deleted?).to be(false) + end + + it "is set to completed for a completed #{log_type} log" do + expect(completed_log.in_progress?).to be(false) + expect(completed_log.not_started?).to be(false) + expect(completed_log.completed?).to be(true) + expect(completed_log.deleted?).to be(false) + end + end + + describe "discard!" do + around do |example| + Timecop.freeze(Time.zone.local(2022, 1, 1)) do + example.run + end + Timecop.return + end + + let(:log) { create(log_type) } + + it "updates discarded at with current time" do + expect { log.discard! }.to change { log.reload.discarded_at }.from(nil).to(Time.zone.now) + end + + it "updates status to deleted" do + expect { log.discard! }.to change { log.reload.status }.to("deleted") + end + end +end