diff --git a/Gemfile b/Gemfile index d7f1db035..91ed6c8a8 100644 --- a/Gemfile +++ b/Gemfile @@ -103,10 +103,6 @@ group :development do gem "rubocop-rails", require: false end -group :test, :staging do - gem "timecop", "~> 0.9.4" -end - group :test do gem "axe-core-rspec" gem "capybara", require: false @@ -115,6 +111,7 @@ group :test do gem "rspec-rails", require: false gem "selenium-webdriver", require: false gem "simplecov", require: false + gem "timecop", "~> 0.9.4" gem "webmock", require: false end diff --git a/app/helpers/timecop_helper.rb b/app/helpers/timecop_helper.rb deleted file mode 100644 index 2780cc918..000000000 --- a/app/helpers/timecop_helper.rb +++ /dev/null @@ -1,9 +0,0 @@ -module TimecopHelper - def without_timecop(&block) - if defined?(Timecop) - Timecop.return(&block) - else - yield - end - end -end diff --git a/app/mailers/devise_notify_mailer.rb b/app/mailers/devise_notify_mailer.rb index d023ca843..4065e3aa9 100644 --- a/app/mailers/devise_notify_mailer.rb +++ b/app/mailers/devise_notify_mailer.rb @@ -1,5 +1,4 @@ class DeviseNotifyMailer < Devise::Mailer - include TimecopHelper require "notifications/client" def notify_client @@ -9,13 +8,11 @@ class DeviseNotifyMailer < Devise::Mailer def send_email(email_address, template_id, personalisation) return true if intercept_send?(email_address) - without_timecop do - notify_client.send_email( - email_address:, - template_id:, - personalisation:, - ) - end + notify_client.send_email( + email_address:, + template_id:, + personalisation:, + ) rescue Notifications::Client::BadRequestError => e Sentry.capture_exception(e) diff --git a/app/mailers/notify_mailer.rb b/app/mailers/notify_mailer.rb index 93187a749..21a6e0270 100644 --- a/app/mailers/notify_mailer.rb +++ b/app/mailers/notify_mailer.rb @@ -1,5 +1,4 @@ class NotifyMailer < ApplicationMailer - include TimecopHelper require "notifications/client" def notify_client @@ -9,13 +8,11 @@ class NotifyMailer < ApplicationMailer def send_email(email, template_id, personalisation) return true if intercept_send?(email) - without_timecop do - notify_client.send_email( - email_address: email, - template_id:, - personalisation:, - ) - end + notify_client.send_email( + email_address: email, + template_id:, + personalisation:, + ) end def personalisation(record, token, url, username: false) diff --git a/app/models/form/sales/questions/value.rb b/app/models/form/sales/questions/value.rb index e731fda8e..0884a3fb6 100644 --- a/app/models/form/sales/questions/value.rb +++ b/app/models/form/sales/questions/value.rb @@ -6,7 +6,7 @@ class Form::Sales::Questions::Value < ::Form::Question @type = "numeric" @min = form.start_year_2026_or_later? ? 15_000 : 0 @step = 1 - @width = 5 + @width = 10 @prefix = "£" @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR_AND_SECTION, value_key: subsection.id) @top_guidance_partial = "financial_calculations_shared_ownership" diff --git a/app/services/feature_toggle.rb b/app/services/feature_toggle.rb index fd9c2cf1c..6f557722c 100644 --- a/app/services/feature_toggle.rb +++ b/app/services/feature_toggle.rb @@ -1,6 +1,6 @@ class FeatureToggle def self.allow_future_form_use? - Rails.env.development? || Rails.env.review? + Rails.env.development? || Rails.env.review? || Rails.env.staging? end def self.bulk_upload_duplicate_log_check_enabled? diff --git a/app/services/storage/s3_service.rb b/app/services/storage/s3_service.rb index c94a418b7..a6eef7d49 100644 --- a/app/services/storage/s3_service.rb +++ b/app/services/storage/s3_service.rb @@ -1,7 +1,5 @@ module Storage class S3Service < StorageService - include TimecopHelper - attr_reader :configuration def initialize(config_service, instance_name) @@ -13,79 +11,61 @@ module Storage end def list_files(folder) - without_timecop do - @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder) - .flat_map { |response| response.contents.map(&:key) } - end + @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder) + .flat_map { |response| response.contents.map(&:key) } end def folder_present?(folder) - without_timecop do - response = @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder, max_keys: 1) - response.key_count == 1 - end + response = @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder, max_keys: 1) + response.key_count == 1 end def get_presigned_url(file_name, duration, response_content_disposition: nil) - without_timecop do - Aws::S3::Presigner - .new({ client: @client }) - .presigned_url(:get_object, bucket: @configuration.bucket_name, key: file_name, expires_in: duration, response_content_disposition:) - end + Aws::S3::Presigner + .new({ client: @client }) + .presigned_url(:get_object, bucket: @configuration.bucket_name, key: file_name, expires_in: duration, response_content_disposition:) end def get_file_io(file_name) - without_timecop do - @client.get_object(bucket: @configuration.bucket_name, key: file_name) - .body - end + @client.get_object(bucket: @configuration.bucket_name, key: file_name) + .body end def get_file(file_name) - without_timecop do - @client.get_object(bucket: @configuration.bucket_name, key: file_name) - .body.read - end + @client.get_object(bucket: @configuration.bucket_name, key: file_name) + .body.read end def write_file(file_name, data, content_type: nil) - without_timecop do - if content_type.nil? - @client.put_object( - body: data, - bucket: @configuration.bucket_name, - key: file_name, - ) - else - @client.put_object( - body: data, - bucket: @configuration.bucket_name, - key: file_name, - content_type:, - ) - end + if content_type.nil? + @client.put_object( + body: data, + bucket: @configuration.bucket_name, + key: file_name, + ) + else + @client.put_object( + body: data, + bucket: @configuration.bucket_name, + key: file_name, + content_type:, + ) end end def get_file_metadata(file_name) - without_timecop do - @client.head_object(bucket: @configuration.bucket_name, key: file_name) - end + @client.head_object(bucket: @configuration.bucket_name, key: file_name) end def file_exists?(file_name) - without_timecop do - @client.head_object(bucket: @configuration.bucket_name, key: file_name) - true - end + @client.head_object(bucket: @configuration.bucket_name, key: file_name) + true rescue Aws::S3::Errors::NotFound false end def delete_file(file_name) - without_timecop do - @client.delete_object(bucket: @configuration.bucket_name, key: file_name) - end + @client.delete_object(bucket: @configuration.bucket_name, key: file_name) end private diff --git a/config/initializers/timecop.rb b/config/initializers/timecop.rb deleted file mode 100644 index 6e1f6fdf7..000000000 --- a/config/initializers/timecop.rb +++ /dev/null @@ -1,4 +0,0 @@ -if Rails.env.staging? - require "timecop" - Timecop.travel(Time.zone.local(2026, 4, 1)) -end diff --git a/config/locales/forms/2026/sales/sale_information.en.yml b/config/locales/forms/2026/sales/sale_information.en.yml index b9c3bc8e9..f7edff900 100644 --- a/config/locales/forms/2026/sales/sale_information.en.yml +++ b/config/locales/forms/2026/sales/sale_information.en.yml @@ -153,7 +153,7 @@ en: value_shared_ownership_staircase: check_answer_label: "Full purchase price" check_answer_prompt: "" - hint_text: "Enter the full purchase price paid for the equity bought in this staircasing transaction (this is equal to the value of the share bought by the purchaser)." + hint_text: "Enter the full purchase price of the property before any discounts are applied. For shared ownership, enter the full purchase price paid for 100% equity (this is equal to the value of the share owned by the PRP plus the value bought by the purchaser in the current and all previous transactions)." question_text: "What was the full purchase price for this staircasing transaction?" equity: diff --git a/config/locales/validations/sales/sale_information.en.yml b/config/locales/validations/sales/sale_information.en.yml index 3c39608cc..ffdf1a874 100644 --- a/config/locales/validations/sales/sale_information.en.yml +++ b/config/locales/validations/sales/sale_information.en.yml @@ -76,7 +76,7 @@ en: mortgage_not_used: "The cash deposit is %{deposit}.

The full purchase price (%{value}) multiplied by the percentage bought is %{expected_shared_ownership_deposit_value}.

These two amounts should be the same." mortgage_used_socialhomebuy: "The mortgage amount (%{mortgage}), cash deposit (%{deposit}), and cash discount (%{cashdis}) added together is %{mortgage_deposit_and_discount_total}.

The full purchase price (%{value}) multiplied by the percentage equity stake purchased (%{equity}) is %{expected_shared_ownership_deposit_value}.

These two amounts should be the same." mortgage_not_used_socialhomebuy: "The cash deposit (%{deposit}) and cash discount (%{cashdis}) added together is %{deposit_and_discount_total}.

The full purchase price (%{value}) multiplied by the percentage bought (%{equity}) is %{expected_shared_ownership_deposit_value}.

These two amounts should be the same." - staircasing_mortgage: # this key + staircasing_mortgage: mortgage_used: "The mortgage (%{mortgage}) and cash deposit (%{deposit}) added together is %{mortgage_and_deposit_total}.

The full purchase price (%{value}) multiplied by the percentage bought is %{stairbought_part_of_value}.

These two amounts should be the same." mortgage_not_used: "The cash deposit is %{deposit}.

The full purchase price (%{value}) multiplied by the percentage bought is %{stairbought_part_of_value}.

These two amounts should be the same." mortgage_used_socialhomebuy: "The mortgage amount (%{mortgage}), cash deposit (%{deposit}), and cash discount (%{cashdis}) added together is %{mortgage_deposit_and_discount_total}.

The full purchase price (%{value}) multiplied by the percentage bought (%{stairbought}) is %{stairbought_part_of_value}.

These two amounts should be the same." diff --git a/spec/models/form/sales/questions/value_spec.rb b/spec/models/form/sales/questions/value_spec.rb index 2ebbf6d89..952b02e7c 100644 --- a/spec/models/form/sales/questions/value_spec.rb +++ b/spec/models/form/sales/questions/value_spec.rb @@ -32,7 +32,7 @@ RSpec.describe Form::Sales::Questions::Value, type: :model do end it "has correct width" do - expect(question.width).to eq(5) + expect(question.width).to eq(10) end it "has correct prefix" do