From 03ec21b60f13b03b6887e170fbf595e3a61abaa0 Mon Sep 17 00:00:00 2001 From: siddharthalamsal-va <242282145+siddharthalamsal@users.noreply.github.com> Date: Thu, 2 Apr 2026 20:30:23 +0000 Subject: [PATCH 1/7] use shared helper --- .../claims_api/v2/disability_compensation_validation.rb | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb index 6590a3bbd11..53a657ca884 100644 --- a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb +++ b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb @@ -7,6 +7,7 @@ module ClaimsApi module V2 module DisabilityCompensationValidation # rubocop:disable Metrics/ModuleLength include DisabilityCompensationSharedServiceModule + include DisabilityCompensationValidationsHelper include LighthouseMilitaryAddressValidator DATE_FORMATS = { @@ -51,14 +52,6 @@ def validate_form_526_submission_values(target_veteran) private - def claim_date - @claim_date = if date_is_valid?(form_attributes['claimDate'], 'claimDate', true) - Date.parse(form_attributes['claimDate']) - else - Time.zone.today - end - end - def validate_form_526_change_of_address return if form_attributes['changeOfAddress'].blank? From a3dea9c8a0caf46b0ddffa4138a9223525073211 Mon Sep 17 00:00:00 2001 From: siddharthalamsal-va <242282145+siddharthalamsal@users.noreply.github.com> Date: Thu, 2 Apr 2026 20:34:39 +0000 Subject: [PATCH 2/7] require helper --- .../concerns/claims_api/v2/disability_compensation_validation.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb index 53a657ca884..04f20e89ae2 100644 --- a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb +++ b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb @@ -2,6 +2,7 @@ require 'claims_api/v2/disability_compensation_shared_service_module' require 'claims_api/lighthouse_military_address_validator' +require 'claims_api/disability_compensation_validations_helper' module ClaimsApi module V2 From 4554b023eea4ef7ddca7c114696d63c590f128d5 Mon Sep 17 00:00:00 2001 From: siddharthalamsal-va <242282145+siddharthalamsal@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:12:28 +0000 Subject: [PATCH 3/7] update spec --- .../claims_api/v2/disability_compensation_validation_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb b/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb index 588f7dcc20e..a072da45958 100644 --- a/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb +++ b/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb @@ -578,7 +578,7 @@ def validate_field(field_path, expected_detail, expected_source) # Ensure claimDate is not set expect(subject.form_attributes).not_to have_key('claimDate') - expect(subject.send(:claim_date)).to eq(Time.zone.today) + expect(subject.send(:claim_date)).to eq(Date.current) errors = test_526_validation_instance.send(:error_collection) From 5cb1a6e9ef33b8a6ab98486112253ba8332ca9c4 Mon Sep 17 00:00:00 2001 From: siddharthalamsal-va <242282145+siddharthalamsal@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:13:02 +0000 Subject: [PATCH 4/7] update spec --- .../claims_api/v2/disability_compensation_validation_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb b/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb index a072da45958..b9d85fdf717 100644 --- a/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb +++ b/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb @@ -591,7 +591,7 @@ def validate_field(field_path, expected_detail, expected_source) subject.form_attributes['claimDate'] = 'invalid-date' subject.instance_variable_set(:@claim_date, nil) - expect(subject.send(:claim_date)).to eq(Time.zone.today) + expect(subject.send(:claim_date)).to eq(Date.current) errors = test_526_validation_instance.send(:error_collection) expect(errors).to be_empty From 2b96d22f2660846870177f68b3312f68d7c66099 Mon Sep 17 00:00:00 2001 From: siddharthalamsal-va <242282145+siddharthalamsal@users.noreply.github.com> Date: Fri, 3 Apr 2026 16:39:53 +0000 Subject: [PATCH 5/7] private helper methods --- .../claims_api/v2/disability_compensation_validation.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb index 04f20e89ae2..101e70b82b8 100644 --- a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb +++ b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb @@ -8,7 +8,7 @@ module ClaimsApi module V2 module DisabilityCompensationValidation # rubocop:disable Metrics/ModuleLength include DisabilityCompensationSharedServiceModule - include DisabilityCompensationValidationsHelper + include ClaimsApi::DisabilityCompensationValidationsHelper include LighthouseMilitaryAddressValidator DATE_FORMATS = { From 715c5c02f561778f52d3bf994276a3e9878a13c4 Mon Sep 17 00:00:00 2001 From: siddharthalamsal-va <242282145+siddharthalamsal@users.noreply.github.com> Date: Mon, 6 Apr 2026 15:42:10 +0000 Subject: [PATCH 6/7] add claimDate validation if present --- ..._revised_disability_compensation_validation.rb | 11 +++++++++++ .../v2/disability_compensation_validation.rb | 11 +++++++++++ ...sed_disability_compensation_validation_spec.rb | 15 +++++++++++++++ .../v2/disability_compensation_validation_spec.rb | 15 +++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/modules/claims_api/app/controllers/concerns/claims_api/v2/alt_revised_disability_compensation_validation.rb b/modules/claims_api/app/controllers/concerns/claims_api/v2/alt_revised_disability_compensation_validation.rb index 1226df7e4d1..da4e9144a0e 100644 --- a/modules/claims_api/app/controllers/concerns/claims_api/v2/alt_revised_disability_compensation_validation.rb +++ b/modules/claims_api/app/controllers/concerns/claims_api/v2/alt_revised_disability_compensation_validation.rb @@ -24,6 +24,8 @@ def alt_rev_validate_form_526_submission_values return if form_attributes.empty? alt_rev_validate_claim_process_type_bdd if bdd_claim? + # ensure 'claimDate', if provided, is not in the future + alt_rev_validate_form_526_claim_date # ensure mailing address country is valid alt_rev_validate_form_526_identification # ensure disabilities are valid @@ -42,6 +44,15 @@ def alt_rev_validate_form_526_submission_values private + def alt_rev_validate_form_526_claim_date + return if claim_date <= Date.current + + collect_error_messages( + source: '/claimDate', + detail: 'claimDate must not be in the future.' + ) + end + def alt_rev_validate_form_526_change_of_address return if form_attributes['changeOfAddress'].blank? diff --git a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb index 101e70b82b8..1ad1089927e 100644 --- a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb +++ b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb @@ -27,6 +27,8 @@ def validate_form_526_submission_values(target_veteran) return if form_attributes.empty? validate_claim_process_type_bdd if bdd_claim? + # ensure 'claimDate', if provided, is not in the future + validate_form_526_claim_date # ensure 'claimantCertification' is true validate_form_526_claimant_certification # ensure mailing address country is valid @@ -53,6 +55,15 @@ def validate_form_526_submission_values(target_veteran) private + def validate_form_526_claim_date + return if claim_date <= Date.current + + collect_error_messages( + source: '/claimDate', + detail: 'claimDate must not be in the future.' + ) + end + def validate_form_526_change_of_address return if form_attributes['changeOfAddress'].blank? diff --git a/modules/claims_api/spec/controllers/concerns/claims_api/v2/alt_revised_disability_compensation_validation_spec.rb b/modules/claims_api/spec/controllers/concerns/claims_api/v2/alt_revised_disability_compensation_validation_spec.rb index 9f068b06b9e..9313ecf3a79 100644 --- a/modules/claims_api/spec/controllers/concerns/claims_api/v2/alt_revised_disability_compensation_validation_spec.rb +++ b/modules/claims_api/spec/controllers/concerns/claims_api/v2/alt_revised_disability_compensation_validation_spec.rb @@ -1487,5 +1487,20 @@ def validate_field(field_path, expected_detail, expected_source) expect(errors).to be_empty end end + + context 'when claimDate is in the future' do + it 'collects an error with the correct message' do + future_date = (Date.current + 1.day).iso8601 + test_526_validation_instance.form_attributes['claimDate'] = future_date + test_526_validation_instance.instance_variable_set(:@claim_date, nil) + + test_526_validation_instance.send(:alt_rev_validate_form_526_claim_date) + errors = current_error_array + + expect(errors).not_to be_empty + expect(errors[0][:detail]).to eq('claimDate must not be in the future.') + expect(errors[0][:source]).to eq('/claimDate') + end + end end end diff --git a/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb b/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb index b9d85fdf717..82fc5529506 100644 --- a/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb +++ b/modules/claims_api/spec/lib/claims_api/v2/disability_compensation_validation_spec.rb @@ -597,5 +597,20 @@ def validate_field(field_path, expected_detail, expected_source) expect(errors).to be_empty end end + + context 'when claimDate is in the future' do + it 'collects an error with the correct message' do + future_date = (Date.current + 1.day).iso8601 + subject.form_attributes['claimDate'] = future_date + subject.instance_variable_set(:@claim_date, nil) + + test_526_validation_instance.send(:validate_form_526_claim_date) + errors = test_526_validation_instance.send(:error_collection) + + expect(errors).not_to be_empty + expect(errors[0][:detail]).to eq('claimDate must not be in the future.') + expect(errors[0][:source]).to eq('/claimDate') + end + end end end From e947997f2eb27fdc2419474fa500542fba77700e Mon Sep 17 00:00:00 2001 From: siddharthalamsal-va <242282145+siddharthalamsal@users.noreply.github.com> Date: Tue, 7 Apr 2026 15:56:41 +0000 Subject: [PATCH 7/7] remove dupes --- .../v2/disability_compensation_validation.rb | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb index 1ad1089927e..3289b02d235 100644 --- a/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb +++ b/modules/claims_api/app/controllers/concerns/claims_api/v2/disability_compensation_validation.rb @@ -20,9 +20,6 @@ module DisabilityCompensationValidation # rubocop:disable Metrics/ModuleLength BDD_LOWER_LIMIT = 90 BDD_UPPER_LIMIT = 180 - YYYY_YYYYMM_REGEX = '^(?:19|20)[0-9][0-9]$|^(?:19|20)[0-9][0-9]-(0[1-9]|1[0-2])$'.freeze - YYYY_MM_DD_REGEX = '^(?:[0-9]{4})-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])$'.freeze - def validate_form_526_submission_values(target_veteran) return if form_attributes.empty? @@ -1260,44 +1257,6 @@ def date_range_overlap?(range_one, range_two) (range_one&.last&.> range_two&.first) || (range_two&.last&.< range_one&.first) end - # Will check for a real date including leap year - def date_is_valid?(date, property, is_full_date = false) # rubocop:disable Style/OptionalBooleanParameter - return false if date.blank? - - # check for something like 'July 2017' - collect_date_error(date, property) unless /^[\d-]+$/ =~ date || property == 'claimDate' - - return false if is_full_date && !date.match(YYYY_MM_DD_REGEX) - - return true if date.match(YYYY_YYYYMM_REGEX) # valid YYYY or YYYY-MM date - - date_y, date_m, date_d = date.split('-').map(&:to_i) - - return true if Date.valid_date?(date_y, date_m, date_d) - - # due to claimDate being an optional field with a fallback, this is the only date - # we allow to be invalid/nil without an error - collect_date_error(date, property) unless property == 'claimDate' - - false - end - - def collect_date_error(date, property = '/') - collect_error_messages( - detail: "#{date} is not a valid date.", - source: "data/attributes/#{property}" - ) - end - - def errors_array - @errors ||= [] - end - - def collect_error_messages(detail: 'Missing or invalid attribute', source: '/', - title: 'Unprocessable Entity', status: '422') - errors_array.push({ detail:, source:, title:, status: }) - end - def error_collection errors_array.uniq! { |e| e[:detail] } errors_array # set up the object to match other error returns