diff --git a/app/forms/providers/means/capital_disregards/add_details_form.rb b/app/forms/providers/means/capital_disregards/add_details_form.rb index f61384d80d..414db1e41a 100644 --- a/app/forms/providers/means/capital_disregards/add_details_form.rb +++ b/app/forms/providers/means/capital_disregards/add_details_form.rb @@ -41,6 +41,10 @@ def date_received @date_received = attributes[:date_received] = date_received_fields.form_date end + def attributes_to_clean + [:amount] + end + private def exclude_from_model diff --git a/app/forms/providers/means/state_benefit_form.rb b/app/forms/providers/means/state_benefit_form.rb index c1713d3903..0b14359f2d 100644 --- a/app/forms/providers/means/state_benefit_form.rb +++ b/app/forms/providers/means/state_benefit_form.rb @@ -19,6 +19,10 @@ def frequency_options RegularTransaction.frequencies_for(state_benefit_transaction_type) end + def attributes_to_clean + %i[amount] + end + private def state_benefit_transaction_type diff --git a/app/forms/providers/regular_transaction_form.rb b/app/forms/providers/regular_transaction_form.rb index 8f85038ffc..d977583fee 100644 --- a/app/forms/providers/regular_transaction_form.rb +++ b/app/forms/providers/regular_transaction_form.rb @@ -13,7 +13,7 @@ def initialize(params = {}) @legal_aid_application = params.delete(:legal_aid_application) @transaction_type_ids = params["transaction_type_ids"] || existing_transaction_type_ids owner.present? - assign_regular_transaction_attributes + assign_existing_regular_transaction_attributes super end @@ -96,7 +96,7 @@ def existing_transaction_type_ids .pluck(:transaction_type_id) end - def assign_regular_transaction_attributes + def assign_existing_regular_transaction_attributes regular_transactions.each do |transaction| transaction_type = transaction.transaction_type public_send(:"#{transaction_type.name}_amount=", transaction.amount) @@ -168,7 +168,7 @@ def none_and_another_checkbox_checked? def all_regular_transactions_valid regular_transactions.each do |transaction| transaction_type = transaction.transaction_type - transaction.amount = public_send(:"#{transaction_type.name}_amount") + transaction.amount = clean_amount(public_send(:"#{transaction_type.name}_amount")) transaction.frequency = public_send(:"#{transaction_type.name}_frequency") next if transaction.valid? @@ -182,6 +182,10 @@ def all_regular_transactions_valid end end + def clean_amount(amount) + amount.to_s.tr("£,", "") + end + def add_regular_transaction_error_to_form(transaction_type, error) attribute = if error.attribute.in?(%i[amount frequency]) :"#{transaction_type}_#{error.attribute}" diff --git a/app/forms/student_finances/base_student_finance_form.rb b/app/forms/student_finances/base_student_finance_form.rb index feaabe3dad..5e378a0b56 100644 --- a/app/forms/student_finances/base_student_finance_form.rb +++ b/app/forms/student_finances/base_student_finance_form.rb @@ -10,5 +10,9 @@ class BaseStudentFinanceForm < BaseForm def student_finance? student_finance.eql?("true") end + + def attributes_to_clean + %i[student_finance_amount] + end end end diff --git a/app/models/base_aggregated_cash_transaction.rb b/app/models/base_aggregated_cash_transaction.rb index 128413e663..08c6ca00d5 100644 --- a/app/models/base_aggregated_cash_transaction.rb +++ b/app/models/base_aggregated_cash_transaction.rb @@ -88,11 +88,22 @@ def transaction_date(month_number) end def update_cash_attributes(params) - params.each do |key, value| + cleaned_params = clean_attributes(params) + cleaned_params.each do |key, value| __send__(:"#{key}=", value) end end + def clean_attributes(params) + params.each.with_object({}) do |(k, v), new_hash| + new_hash[k] = cash_transaction_amount_field?(k) ? v.to_s.tr("£,", "") : v + end + end + + def cash_transaction_amount_field?(param_name) + self.class.cash_transaction_categories.map(&:to_s).any? { |category| param_name.start_with?(category) } + end + def save_cash_transaction_records self.class.cash_transaction_categories.each do |category| CashTransaction.where( diff --git a/app/views/shared/check_answers/_cash_payments.html.erb b/app/views/shared/check_answers/_cash_payments.html.erb index 79167d8d2d..e45dfafdf3 100644 --- a/app/views/shared/check_answers/_cash_payments.html.erb +++ b/app/views/shared/check_answers/_cash_payments.html.erb @@ -1,6 +1,5 @@ <% read_only = false unless local_assigns.key?(:read_only) %> - -
+

<%= t(".#{type}_heading", individual_with_determiner:) %>

diff --git a/app/views/shared/check_answers/_student_finance.html.erb b/app/views/shared/check_answers/_student_finance.html.erb index 44b30f594e..e6110ce4f7 100644 --- a/app/views/shared/check_answers/_student_finance.html.erb +++ b/app/views/shared/check_answers/_student_finance.html.erb @@ -1,4 +1,4 @@ -
+

<%= t(".heading") %>

diff --git a/app/views/shared/partials/_revealing_checkbox.html.erb b/app/views/shared/partials/_revealing_checkbox.html.erb index 807c2fb822..31c5662f06 100644 --- a/app/views/shared/partials/_revealing_checkbox.html.erb +++ b/app/views/shared/partials/_revealing_checkbox.html.erb @@ -13,7 +13,7 @@ <% end %> <%= form.govuk_text_field "#{name}#{number}", label: { text: model.period(number) }, - value: gds_number_to_currency(model.__send__(:"#{name}#{number}"), unit: ""), + value: model.__send__(:"#{name}#{number}"), prefix_text: defined?(input_prefix) ? input_prefix : nil, form_group: { classes: error_class }, width: "one-third" %> diff --git a/features/providers/bank_statement_upload/check_your_means_answers.feature b/features/providers/bank_statement_upload/check_your_means_answers.feature index 926b25666a..99cf9618a5 100644 --- a/features/providers/bank_statement_upload/check_your_means_answers.feature +++ b/features/providers/bank_statement_upload/check_your_means_answers.feature @@ -88,7 +88,7 @@ Feature: Bank statement upload check your answers And I click "Save and continue" Then I should be on the "check_income_answers" page showing "Check your answers" - When I click Check Your Answers Change link for "applicant student finance" + When I click Check Your Answers Change link for applicant 'student_finance' And I choose "Yes" And I enter amount "5000" diff --git a/features/providers/partner_means_assessment/bank_statement_upload/check_your_means_answers.feature b/features/providers/partner_means_assessment/bank_statement_upload/check_your_means_answers.feature index a97a52642b..f4a6a1002f 100644 --- a/features/providers/partner_means_assessment/bank_statement_upload/check_your_means_answers.feature +++ b/features/providers/partner_means_assessment/bank_statement_upload/check_your_means_answers.feature @@ -88,7 +88,7 @@ Feature: Bank statement upload check your answers And I click "Save and continue" Then I should be on the "check_income_answers" page showing "Check your answers" - When I click Check Your Answers Change link for "partner student finance" + When I click Check Your Answers Change link for partner 'student_finance' And I choose "Yes" And I enter amount "5000" diff --git a/features/providers/regressions/enter_humanized_currency_amounts.feature b/features/providers/regressions/enter_humanized_currency_amounts.feature new file mode 100644 index 0000000000..bb4588c146 --- /dev/null +++ b/features/providers/regressions/enter_humanized_currency_amounts.feature @@ -0,0 +1,141 @@ +@javascript +Feature: Entering humanized monetary amounts on various forms + Scenario: I can enter humanized monetary amounts like 1,000 for cash income + Given csrf is enabled + And I have completed a non-passported employed application for "client" with bank statements as far as the end of the means income section + Then I should be on the "check_income_answers" page showing "Check your answers" + + When I click Check Your Answers Change link for applicant 'cash_income' + And I select "Maintenance payments from a former partner" + And I fill "aggregated-cash-income-maintenance-in1-field" with "£2,654.33" + And I fill "aggregated-cash-income-maintenance-in2-field" with "£3,654.33" + And I fill "aggregated-cash-income-maintenance-in3-field" with "£4,654.33" + + When I click 'Save and continue' + Then I should be on the 'check_income_answers' page showing 'Check your answers' + And I should see "£2,654.33" + And I should see "£3,654.33" + And I should see "£4,654.33" + + Scenario: I can enter humanized monetary amounts like 1,000 for cash outgoings and housing benefit + Given csrf is enabled + And I have completed a non-passported employed application for "client" with bank statements as far as the end of the means income section + Then I should be on the "check_income_answers" page showing "Check your answers" + + When I click Check Your Answers Change link for applicant 'cash_outgoings' + And I select "Housing payments" + And I fill "aggregated-cash-outgoings-rent-or-mortgage1-field" with "£2,275.43" + And I fill "aggregated-cash-outgoings-rent-or-mortgage2-field" with "£3,275.43" + And I fill "aggregated-cash-outgoings-rent-or-mortgage3-field" with "£4,275.43" + + When I click 'Save and continue' + Then I should be on the 'housing_benefits' page showing "Does your client get Housing Benefit?" + + When I choose "Yes" + And I fill "providers-means-housing-benefit-form-housing-benefit-amount-field" with "£1,322.55" + And I choose "Monthly" + + When I click 'Save and continue' + Then I should be on the 'check_income_answers' page showing 'Check your answers' + And I should see "£2,275.43" + And I should see "£3,275.43" + And I should see "£4,275.43" + And I should see "£1,322.55" + + Scenario: I can enter humanized monetary amounts like 1,000 for state benefits + Given csrf is enabled + And I have completed a non-passported employed application for "client" with bank statements as far as the end of the means income section + Then I should be on the "check_income_answers" page showing "Check your answers" + + When I click Check Your Answers Change link for applicant 'state_benefits' + And I choose "Yes" + And I click 'Save and continue' + + Then I should be on a page with title "Add benefit, charitable or government payment details" + And I fill 'regular-transaction-description-field' with "my government handout" + And I fill 'regular-transaction-amount-field' with "£1,222,333.44" + And I choose "Every week" + + When I click 'Save and continue' + Then I should be on the 'add_other_state_benefits' page showing 'You added 1 benefit, charitable or government payment' + And I should see "£1,222,333.44" + + Scenario: I can enter humanized monetary amounts like 1,000 for student finance + Given csrf is enabled + And I have completed a non-passported employed application for "client" with bank statements as far as the end of the means income section + Then I should be on the 'check_income_answers' page showing 'Check your answers' + + When I click Check Your Answers Change link for applicant 'student_finance' + Then I should be on a page with title "Does your client get student finance?" + And I choose "Yes" + And I fill 'applicant-student-finance-amount-field' with "£5,432.11" + + When I click 'Save and continue' + Then I should be on the 'check_income_answers' page showing 'Check your answers' + And I should see "£5,432.11" + + Scenario: I can enter humanized monetary amounts like 1,000 for regular income + Given csrf is enabled + And I have completed a non-passported employed application for "client" with bank statements as far as the end of the means income section + Then I should be on the 'check_income_answers' page showing 'Check your answers' + + When I click Check Your Answers Change link for "Payments your client receives" + Then I should be on a page with title "Which of these payments does your client get?" + And I select "Financial help from friends or family" + And I fill "Friends or family" with "£1,112.33" + And I choose the "Monthly" frequency for "Friends or family" + + When I click 'Save and continue' + Then I should be on a page with title "Select payments your client receives in cash" + And I select "My client receives none of these payments in cash" + And I click 'Save and continue' + Then I should be on the 'check_income_answers' page showing 'Check your answers' + And I should see "£1,112.33" + + Scenario: I can enter humanized monetary amounts like 1,000 for regular outgoings and housing benefit + Given csrf is enabled + And I have completed a non-passported employed application for "client" with bank statements as far as the end of the means income section + Then I should be on the 'check_income_answers' page showing 'Check your answers' + + When I click Check Your Answers Change link for "Payments your client makes" + Then I should be on a page with title "Which of these payments does your client pay?" + And I select "Maintenance payments to a former partner" + And I fill "Maintenance out" with "£2,322.22" + And I choose the "Monthly" frequency for "Maintenance out" + + When I click 'Save and continue' + Then I should be on a page with title "Select payments your client pays in cash" + + When I select "None of the above" + And I click 'Save and continue' + Then I should be on a page with title "Does your client get Housing Benefit?" + + When I click 'Save and continue' + Then I should be on the 'check_income_answers' page showing 'Check your answers' + And I should see "£2,322.22" + + Scenario: I can enter humanized monetary amounts like 1,000 for mandatory capital disregards + Given the feature flag for means_test_review_a is enabled + And the MTR-A start date is in the past + And I have completed the income and capital sections of a non-passported application with bank statement uploads post-MTRA + When I am viewing the means capital check your answers page + + When I click link "Change Budgeting Advances" + And I fill "capital-disregard-amount-field" with "£1,654.33" + + When I click 'Save and continue' + Then I should be on the 'check_capital_answers' page showing 'Check your answers' + And I should see "£1,654.33" + + Scenario: I can enter humanized monetary amounts like 1,000 for discretionary capital disregards + Given the feature flag for means_test_review_a is enabled + And the MTR-A start date is in the past + And I have completed the income and capital sections of a non-passported application with bank statement uploads post-MTRA + When I am viewing the means capital check your answers page + + When I click link "Change Compensation, damages or ex-gratia payments for personal harm" + And I fill "capital-disregard-amount-field" with "£2,321.11" + + When I click 'Save and continue' + Then I should be on the 'check_capital_answers' page showing 'Check your answers' + And I should see "£2,321.11" diff --git a/features/step_definitions/bank_statement_upload_steps.rb b/features/step_definitions/bank_statement_upload_steps.rb index 35813b7938..255f91e56b 100644 --- a/features/step_definitions/bank_statement_upload_steps.rb +++ b/features/step_definitions/bank_statement_upload_steps.rb @@ -33,6 +33,7 @@ :legal_aid_application, :with_proceedings, :with_employed_applicant, + :with_maintenance_in_category, :with_rent_or_mortgage_regular_transaction, :with_housing_benefit_regular_transaction, :with_savings_amount, diff --git a/features/step_definitions/civil_journey_steps.rb b/features/step_definitions/civil_journey_steps.rb index c3f81f7eec..ce9c48fa7a 100644 --- a/features/step_definitions/civil_journey_steps.rb +++ b/features/step_definitions/civil_journey_steps.rb @@ -1139,6 +1139,14 @@ end end +Given("I click Check Your Answers Change link for partner {string}") do |question| + question_id = question.parameterize(separator: "_") + + within "#app-check-your-answers__partner__#{question_id}" do + click_on("Change") + end +end + Given("I click Check Your Answers Change link for {string}") do |question| question_id = question.parameterize(separator: "_") diff --git a/spec/forms/providers/means/capital_disregards/add_details_form_spec.rb b/spec/forms/providers/means/capital_disregards/add_details_form_spec.rb index a98a51c09c..047d81a546 100644 --- a/spec/forms/providers/means/capital_disregards/add_details_form_spec.rb +++ b/spec/forms/providers/means/capital_disregards/add_details_form_spec.rb @@ -32,9 +32,24 @@ end it "updates the capital_disregard" do - expect(application.capital_disregards.first.amount).to eq 123 - expect(application.capital_disregards.first.account_name).to eq "Barclays" - expect(application.capital_disregards.first.date_received).to eq Date.new(2024, 2, 1) + expect(application.capital_disregards.first) + .to have_attributes( + amount: 123, + account_name: "Barclays", + date_received: Date.new(2024, 2, 1), + ) + end + + context "with humanized monetary value" do + let(:amount) { "£1,244.55" } + + it "is valid" do + expect(form).to be_valid + end + + it "saves the monetary result" do + expect(application.capital_disregards.first.amount).to eq(1_244.55) + end end context "when amount is missing" do diff --git a/spec/forms/providers/means/housing_benefit_form_spec.rb b/spec/forms/providers/means/housing_benefit_form_spec.rb index 8d84abd0b1..31e90563dc 100644 --- a/spec/forms/providers/means/housing_benefit_form_spec.rb +++ b/spec/forms/providers/means/housing_benefit_form_spec.rb @@ -454,6 +454,21 @@ ) end + it "cleans the housing benefit regular transactions amount of humanized characters" do + legal_aid_application = create(:legal_aid_application, :with_applicant) + transaction_type = create(:transaction_type, :housing_benefit) + params = { + "transaction_type_ids" => transaction_type.id, + "housing_benefit_amount" => "£1,543.66", + "housing_benefit_frequency" => "weekly", + legal_aid_application:, + } + form = described_class.new(params) + form.save + + expect(legal_aid_application.regular_transactions.first).to have_attributes(amount: 1_543.66) + end + context "when a housing benefit regular transaction already exists" do it "does not create another legal aid application transaction type" do legal_aid_application = create(:legal_aid_application, :with_applicant) diff --git a/spec/forms/providers/means/regular_income_form_spec.rb b/spec/forms/providers/means/regular_income_form_spec.rb index 1ef05a68a0..de2098915e 100644 --- a/spec/forms/providers/means/regular_income_form_spec.rb +++ b/spec/forms/providers/means/regular_income_form_spec.rb @@ -597,6 +597,21 @@ outgoing_cash_transaction, ) end + + it "cleans the regular transaction amount of humanized characters" do + legal_aid_application = create(:legal_aid_application, :with_applicant) + pension = create(:transaction_type, :pension) + params = { + "transaction_type_ids" => ["", pension.id], + "pension_amount" => "£2,333.66", + "pension_frequency" => "monthly", + }.merge(legal_aid_application:) + + form = described_class.new(params) + form.save + + expect(legal_aid_application.regular_transactions.first).to have_attributes(amount: 2_333.66) + end end end end diff --git a/spec/forms/providers/means/regular_outgoings_form_spec.rb b/spec/forms/providers/means/regular_outgoings_form_spec.rb index 9a4ff28492..d690e1263e 100644 --- a/spec/forms/providers/means/regular_outgoings_form_spec.rb +++ b/spec/forms/providers/means/regular_outgoings_form_spec.rb @@ -470,6 +470,21 @@ .to contain_exactly([rent_or_mortgage.id, 250.50, "weekly"], [child_care.id, 100, "monthly"]) end + it "cleans the regular transaction amount of humanized characters" do + legal_aid_application = create(:legal_aid_application, :with_applicant) + rent_or_mortgage = create(:transaction_type, :rent_or_mortgage) + params = { + "transaction_type_ids" => ["", rent_or_mortgage.id], + "rent_or_mortgage_amount" => "£2,333.55", + "rent_or_mortgage_frequency" => "monthly", + }.merge(legal_aid_application:) + + form = described_class.new(params) + form.save + + expect(legal_aid_application.regular_transactions.first).to have_attributes(amount: 2_333.55) + end + it "destroys any existing housing benefit transactions if housing " \ "payments are not selected" do legal_aid_application = create(:legal_aid_application, :with_applicant) diff --git a/spec/forms/providers/means/state_benefit_form_spec.rb b/spec/forms/providers/means/state_benefit_form_spec.rb index 762c44f703..ac0b70fe19 100644 --- a/spec/forms/providers/means/state_benefit_form_spec.rb +++ b/spec/forms/providers/means/state_benefit_form_spec.rb @@ -62,6 +62,12 @@ it { expect(validation).to be false } end + context "when the amount is humanized monetary value" do + let(:amount) { "£1,000" } + + it { expect(validation).to be true } + end + context "when the frequency is not valid" do let(:frequency) { "NOT-A-FREQUENCY" } @@ -93,6 +99,18 @@ expect(legal_aid_application.regular_transactions.first.description).to eq "New State Benefit" end end + + context "with humanized monetary value" do + let(:model) { RegularTransaction.new(legal_aid_application:, transaction_type_id: transaction_type.id) } + let(:amount) { "£1,244.55" } + + it "saves the new transaction" do + params[:model] = model + save_form + + expect(legal_aid_application.regular_transactions.first.amount).to eq(1_244.55) + end + end end end end diff --git a/spec/models/aggregated_cash_income_spec.rb b/spec/models/aggregated_cash_income_spec.rb index 89a8e15b21..8bed17c69c 100644 --- a/spec/models/aggregated_cash_income_spec.rb +++ b/spec/models/aggregated_cash_income_spec.rb @@ -300,6 +300,15 @@ end end + context "with valid comma separate monetary params" do + let(:params) { valid_params.merge(benefits1: "1,222,222.33") } + + it "creates the expected cash income records" do + expect { call_update }.to change(CashTransaction, :count).by(6) + expect(CashTransaction.pluck(:amount)).to include(1_222_222.33) + end + end + context "with invalid params" do context "and non-numeric values" do let(:params) { non_numeric_params } diff --git a/spec/models/aggregated_cash_outgoings_spec.rb b/spec/models/aggregated_cash_outgoings_spec.rb index a4a2251215..c424f086c1 100644 --- a/spec/models/aggregated_cash_outgoings_spec.rb +++ b/spec/models/aggregated_cash_outgoings_spec.rb @@ -250,6 +250,15 @@ def error_msg(name, month) end end + context "with valid comma separate monetary params" do + let(:params) { valid_params.merge(rent_or_mortgage1: "1,222,222.33") } + + it "creates the expected cash income records" do + expect { call_update }.to change(CashTransaction, :count).by(6) + expect(CashTransaction.pluck(:amount)).to include(1_222_222.33) + end + end + context "with invalid params" do context "and non-numeric values" do let(:params) { non_numeric_params }