carin_for_blue_button_test_kit 0.15.1 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/carin_for_blue_button_test_kit/capability_statement/tests/instantiates_test.rb +14 -15
- data/lib/carin_for_blue_button_test_kit/capability_statement/tests/json_support_test.rb +0 -1
- data/lib/carin_for_blue_button_test_kit/client/v2.0.0/c4bb_client_test_suite.rb +14 -0
- data/lib/carin_for_blue_button_test_kit/client/v2.0.0/claim_data_request_tests/client_claims_data_attestation_test.rb +2 -2
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_client/authentication.rb +30 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_client/last_updated.rb +31 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_client/must_support_absent_reason.rb +26 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_client/must_support_display.rb +26 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_client/must_support_missing.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_client.rb +25 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/00_authorization_group/attestation_test_requirement_48.rb +50 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/00_authorization_group/attestation_test_requirement_60.rb +48 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/00_authorization_group/attestation_test_requirement_97.rb +41 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/00_authorization_group.rb +15 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/01_must_support_group/attestation_test_requirement_10.rb +26 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/01_must_support_group/attestation_test_requirement_2.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/01_must_support_group/attestation_test_requirement_5.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/01_must_support_group/attestation_test_requirement_7.rb +30 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/01_must_support_group/attestation_test_requirement_9.rb +26 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/01_must_support_group.rb +19 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group/attestation_test_requirement_105.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group/attestation_test_requirement_108.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group/attestation_test_requirement_115.rb +24 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group/attestation_test_requirement_116.rb +30 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group/attestation_test_requirement_118.rb +31 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group/attestation_test_requirement_119.rb +31 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group/attestation_test_requirement_120.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group/attestation_test_requirement_124.rb +38 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/03_eob_group.rb +25 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/04_eob_inpatient_group/attestation_test_requirement_130.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/04_eob_inpatient_group/attestation_test_requirement_132.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/04_eob_inpatient_group.rb +13 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/05_eob_outpatient_group/attestation_test_requirement_156.rb +28 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/05_eob_outpatient_group/attestation_test_requirement_157.rb +33 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/05_eob_outpatient_group.rb +13 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/06_eob_oral_group/attestation_test_requirement_144.rb +33 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/06_eob_oral_group/attestation_test_requirement_148.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/06_eob_oral_group/attestation_test_requirement_149.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/06_eob_oral_group/attestation_test_requirement_150.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/06_eob_oral_group/attestation_test_requirement_151.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/06_eob_oral_group/attestation_test_requirement_152.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/06_eob_oral_group/attestation_test_requirement_153.rb +31 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/06_eob_oral_group.rb +23 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/07_eob_pharmacy_group/attestation_test_requirement_161.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/07_eob_pharmacy_group/attestation_test_requirement_162.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/07_eob_pharmacy_group/attestation_test_requirement_163.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/07_eob_pharmacy_group/attestation_test_requirement_164.rb +25 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/07_eob_pharmacy_group/attestation_test_requirement_165.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/07_eob_pharmacy_group.rb +19 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/08_eob_nonclinician_group/attestation_test_requirement_168_170.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/08_eob_nonclinician_group/attestation_test_requirement_173.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/08_eob_nonclinician_group.rb +13 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/09_organization_group/attestation_test_requirement_177.rb +29 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/09_organization_group/attestation_test_requirement_178.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/09_organization_group.rb +12 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/10_practitioner_group/attestation_test_requirement_186.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/10_practitioner_group.rb +10 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group/adjudication_amount.rb +38 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group/amount_calculations.rb +69 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group/attestation_test_requirement_19.rb +27 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group/attestation_test_requirement_28.rb +26 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group/attestation_test_requirement_99.rb +26 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group/coverage_reference_resource.rb +31 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group/licensing.rb +33 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group/meta_lastupdated.rb +46 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server/11_crosscutting_group.rb +24 -0
- data/lib/carin_for_blue_button_test_kit/custom_groups/visual_inspection_and_attestation/v200_server.rb +37 -0
- data/lib/carin_for_blue_button_test_kit/generated/v1.1.0/c4bb_test_suite.rb +2 -0
- data/lib/carin_for_blue_button_test_kit/generated/v2.0.0/c4bb_test_suite.rb +20 -2
- data/lib/carin_for_blue_button_test_kit/generated/v2.0.0-dev-nonfinancial/c4bb_test_suite.rb +8 -0
- data/lib/carin_for_blue_button_test_kit/generator/suite_generator.rb +1 -1
- data/lib/carin_for_blue_button_test_kit/generator/templates/suite.rb.erb +21 -1
- data/lib/carin_for_blue_button_test_kit/requirements/{carin-for-blue-button-test-kit_requirements.csv → carin_for_blue_button_test_kit_requirements.csv} +198 -198
- data/lib/carin_for_blue_button_test_kit/requirements/generated/c4bb_v110_requirements_coverage.csv +1 -0
- data/lib/carin_for_blue_button_test_kit/requirements/generated/c4bb_v200_client_requirements_coverage.csv +47 -0
- data/lib/carin_for_blue_button_test_kit/requirements/generated/{carin-for-blue-button-test-kit_requirements_coverage.csv → c4bb_v200_requirements_coverage.csv} +156 -190
- data/lib/carin_for_blue_button_test_kit/requirements/generated/c4bb_v200devnonfinancial_requirements_coverage.csv +244 -0
- data/lib/carin_for_blue_button_test_kit/requirements/hl7.fhir.us.carin-bb_2.0.0_reqs.xlsx +0 -0
- data/lib/carin_for_blue_button_test_kit/version.rb +2 -2
- data/lib/carin_for_blue_button_test_kit.rb +0 -1
- metadata +77 -15
- data/lib/carin_for_blue_button_test_kit/requirements/carin-for-blue-button-test-kit_out_of_scope_requirements.csv +0 -68
- data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +0 -22
- data/lib/inferno_requirements_tools/rake/rakefile_template +0 -31
- data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +0 -284
- data/lib/requirements_config.yaml +0 -17
@@ -0,0 +1,29 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement108 < Inferno::Test
|
3
|
+
title 'Supports versioned and unversioned references'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health IT Module supports both versioned and non-versioned ExplanationOfBenefit
|
6
|
+
reference approaches when referencing another resource,
|
7
|
+
and returns the same content for referenced resources in either case.
|
8
|
+
DESCRIPTION
|
9
|
+
id :carin_server_requirement_108_attestation
|
10
|
+
|
11
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@108'
|
12
|
+
|
13
|
+
run do
|
14
|
+
identifier = SecureRandom.hex(32)
|
15
|
+
wait(
|
16
|
+
identifier:,
|
17
|
+
message: <<~MESSAGE
|
18
|
+
I attest that the Health IT Module supports both versioned and non-versioned ExplanationOfBenefit
|
19
|
+
reference approaches when referencing another resource,
|
20
|
+
and returns the same content for referenced resources in either case.
|
21
|
+
|
22
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
23
|
+
|
24
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
25
|
+
MESSAGE
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement115 < Inferno::Test
|
3
|
+
title 'Does not use a data absent reason for EOB.type'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health IT Module does not assign a data absent reason to the `ExplanationOfBenefit.type` element.
|
6
|
+
DESCRIPTION
|
7
|
+
id :carin_server_requirement_115_attestation
|
8
|
+
|
9
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@115'
|
10
|
+
|
11
|
+
run do
|
12
|
+
identifier = SecureRandom.hex(32)
|
13
|
+
wait(
|
14
|
+
identifier:,
|
15
|
+
message: <<~MESSAGE
|
16
|
+
I attest that the Health IT Module does **not** assign a data absent reason to `ExplanationOfBenefit.type`.
|
17
|
+
|
18
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
19
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
20
|
+
MESSAGE
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement116_117 < Inferno::Test
|
3
|
+
title 'Correctly populates EOB.insurer and EOB.outcome'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health IT Module:
|
6
|
+
- Sets `ExplanationOfBenefit.outcome` to "complete",
|
7
|
+
- Sets `ExplanationOfBenefit.insurer` equal to `insurance.coverage.organization`.
|
8
|
+
DESCRIPTION
|
9
|
+
id :carin_server_requirement_116_117_attestation
|
10
|
+
|
11
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@116',
|
12
|
+
'hl7.fhir.us.carin-bb_2.0.0@117'
|
13
|
+
|
14
|
+
run do
|
15
|
+
identifier = SecureRandom.hex(32)
|
16
|
+
wait(
|
17
|
+
identifier:,
|
18
|
+
message: <<~MESSAGE
|
19
|
+
I attest that the Health IT Module:
|
20
|
+
|
21
|
+
- Sets `ExplanationOfBenefit.outcome` to "complete",
|
22
|
+
- Populates `ExplanationOfBenefit.insurer` with the same value as `insurance.coverage.organization`.
|
23
|
+
|
24
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
|
25
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
|
26
|
+
MESSAGE
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement118 < Inferno::Test
|
3
|
+
title 'Updates reference when the reference adjusts another reference'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
When an ExplanationOfBenefit resource returned by the Health IT Module
|
6
|
+
adjusts a prior ExplanationOfBenefit, the `.related.reference`
|
7
|
+
field is populated with the identifier of the prior ExplanationOfBenefit, and the `.related.relationship` field
|
8
|
+
is assigned the value `prior`.
|
9
|
+
DESCRIPTION
|
10
|
+
id :carin_server_requirement_118_attestation
|
11
|
+
|
12
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@118'
|
13
|
+
|
14
|
+
run do
|
15
|
+
identifier = SecureRandom.hex(32)
|
16
|
+
wait(
|
17
|
+
identifier:,
|
18
|
+
message: <<~MESSAGE
|
19
|
+
I attest that when an ExplanationOfBenefit resource returned by the Health IT Module
|
20
|
+
adjusts a prior ExplanationOfBenefit, the `.related.reference`
|
21
|
+
field is populated with the identifier of the prior ExplanationOfBenefit, and the `.related.relationship` field
|
22
|
+
is assigned the value `prior`.
|
23
|
+
|
24
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
25
|
+
|
26
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
27
|
+
MESSAGE
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement119 < Inferno::Test
|
3
|
+
title 'Updates reference when the reference is adjusted by another reference'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
When an ExplanationOfBenefit resource returned by the Health IT Module
|
6
|
+
has been adjusted by another ExplanationOfBenefit,
|
7
|
+
the `.related.reference` field is populated with the identifier of the adjusting ExplanationOfBenefit,
|
8
|
+
and the `.related.relationship` field is assigned the value `replacedby`.
|
9
|
+
DESCRIPTION
|
10
|
+
id :carin_server_requirement_119_attestation
|
11
|
+
|
12
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@119'
|
13
|
+
|
14
|
+
run do
|
15
|
+
identifier = SecureRandom.hex(32)
|
16
|
+
wait(
|
17
|
+
identifier:,
|
18
|
+
message: <<~MESSAGE
|
19
|
+
I attest that when an ExplanationOfBenefit resource returned by the Health IT Module
|
20
|
+
has been adjusted by another ExplanationOfBenefit,
|
21
|
+
the `.related.reference` field is populated with the identifier of the adjusting ExplanationOfBenefit,
|
22
|
+
and the `.related.relationship` field is assigned the value `replacedby`.
|
23
|
+
|
24
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
25
|
+
|
26
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
27
|
+
MESSAGE
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement120 < Inferno::Test
|
3
|
+
title 'Reference contains identifier of immediately preceding or following ExplanationOfBenefit'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The `.related.reference` field in an ExplanationOfBenefit resource
|
6
|
+
returned by the Health IT Module contains the identifier
|
7
|
+
of the immediately preceding or following ExplanationOfBenefit, and not the first or last in a sequence.
|
8
|
+
DESCRIPTION
|
9
|
+
id :carin_server_requirement_120_attestation
|
10
|
+
|
11
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@120'
|
12
|
+
|
13
|
+
run do
|
14
|
+
identifier = SecureRandom.hex(32)
|
15
|
+
wait(
|
16
|
+
identifier:,
|
17
|
+
message: <<~MESSAGE
|
18
|
+
I attest that the `.related.reference` field in an ExplanationOfBenefit resource
|
19
|
+
returned by the Health IT Module contains the identifier
|
20
|
+
of the immediately preceding or following ExplanationOfBenefit, and not the first or last in a sequence.
|
21
|
+
|
22
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
23
|
+
|
24
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
25
|
+
MESSAGE
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement124_125_127_128_129 < Inferno::Test
|
3
|
+
title 'Correctly populates EOB.insurance'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health IT Module:
|
6
|
+
- Only assigns `True` to `.insurance.focal` when the insurance matches the `ExplanationOfBenefit.insurer`,
|
7
|
+
- Ensures that when `focal = true`, `Coverage.payor` is the same as `EOB.insurer`,
|
8
|
+
- When `focal = true`, sets `Coverage.payor` to an Organization identifier,
|
9
|
+
- When `focal = false`, sets `insurance.coverage.display` to the name of the other carrier,
|
10
|
+
- Populates `insurance.coverage` the same as `insurance.coverage.organization`.
|
11
|
+
DESCRIPTION
|
12
|
+
id :carin_server_requirement_124_125_127_128_129_attestation
|
13
|
+
|
14
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@124',
|
15
|
+
'hl7.fhir.us.carin-bb_2.0.0@125',
|
16
|
+
'hl7.fhir.us.carin-bb_2.0.0@127',
|
17
|
+
'hl7.fhir.us.carin-bb_2.0.0@128',
|
18
|
+
'hl7.fhir.us.carin-bb_2.0.0@129'
|
19
|
+
|
20
|
+
run do
|
21
|
+
identifier = SecureRandom.hex(32)
|
22
|
+
wait(
|
23
|
+
identifier:,
|
24
|
+
message: <<~MESSAGE
|
25
|
+
I attest that the Health IT Module:
|
26
|
+
|
27
|
+
- Assigns `.insurance.focal = true` only for entries that match `ExplanationOfBenefit.insurer`,
|
28
|
+
- When `focal = true`, `Coverage.payor` equals `EOB.insurer` and is represented by an Organization identifier,
|
29
|
+
- When `focal = false`, `insurance.coverage.display` is set to the name of the other carrier,
|
30
|
+
- Populates `insurance.coverage` the same as `insurance.coverage.organization`.
|
31
|
+
|
32
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
|
33
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
|
34
|
+
MESSAGE
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '03_eob_group/attestation_test_requirement_105'
|
2
|
+
require_relative '03_eob_group/attestation_test_requirement_108'
|
3
|
+
require_relative '03_eob_group/attestation_test_requirement_115'
|
4
|
+
require_relative '03_eob_group/attestation_test_requirement_116'
|
5
|
+
require_relative '03_eob_group/attestation_test_requirement_118'
|
6
|
+
require_relative '03_eob_group/attestation_test_requirement_119'
|
7
|
+
require_relative '03_eob_group/attestation_test_requirement_120'
|
8
|
+
require_relative '03_eob_group/attestation_test_requirement_124'
|
9
|
+
|
10
|
+
module CarinForBlueButtonTestKit
|
11
|
+
class CarinEOBAttestationGroup < Inferno::TestGroup
|
12
|
+
id :c4bb_eob
|
13
|
+
title 'Explanation of Benefit'
|
14
|
+
short_title 'Explanation of Benefit (EOB)'
|
15
|
+
|
16
|
+
test from: :carin_server_requirement_105_attestation
|
17
|
+
test from: :carin_server_requirement_108_attestation
|
18
|
+
test from: :carin_server_requirement_115_attestation
|
19
|
+
test from: :carin_server_requirement_116_117_attestation
|
20
|
+
test from: :carin_server_requirement_118_attestation
|
21
|
+
test from: :carin_server_requirement_119_attestation
|
22
|
+
test from: :carin_server_requirement_120_attestation
|
23
|
+
test from: :carin_server_requirement_124_125_127_128_129_attestation
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement130 < Inferno::Test
|
3
|
+
title 'Provides claim amounts if line item amounts unavailable'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
If line item amounts are not available, the Health IT Module provides the claim amounts
|
6
|
+
and corresponding amount types in the ExplanationOfBenefit (EOB) header data elements, as specified
|
7
|
+
by the CPCDS data elements.
|
8
|
+
DESCRIPTION
|
9
|
+
id :carin_server_requirement_130_attestation
|
10
|
+
|
11
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@130'
|
12
|
+
|
13
|
+
run do
|
14
|
+
identifier = SecureRandom.hex(32)
|
15
|
+
wait(
|
16
|
+
identifier:,
|
17
|
+
message: <<~MESSAGE
|
18
|
+
I attest that if line item amounts are not available, the Health IT Module provides the claim amounts
|
19
|
+
and corresponding amount types in the ExplanationOfBenefit (EOB) header data elements, as specified
|
20
|
+
by the CPCDS data elements.
|
21
|
+
|
22
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
23
|
+
|
24
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
25
|
+
MESSAGE
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement132 < Inferno::Test
|
3
|
+
title 'Includes in-network or out-of-network payment status'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health IT Module includes the in-network or out-of-network payment status of the
|
6
|
+
claim within the `EOB.supportingInfo` element, as specified by the CPCDS data elements.
|
7
|
+
DESCRIPTION
|
8
|
+
id :carin_server_requirement_132_attestation
|
9
|
+
|
10
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@132'
|
11
|
+
|
12
|
+
run do
|
13
|
+
identifier = SecureRandom.hex(32)
|
14
|
+
wait(
|
15
|
+
identifier:,
|
16
|
+
message: <<~MESSAGE
|
17
|
+
I attest that the Health IT Module includes the in-network or out-of-network payment status of the
|
18
|
+
claim within the `EOB.supportingInfo` element, as specified by the CPCDS data elements.
|
19
|
+
|
20
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
21
|
+
|
22
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
23
|
+
MESSAGE
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative '04_eob_inpatient_group/attestation_test_requirement_130'
|
2
|
+
require_relative '04_eob_inpatient_group/attestation_test_requirement_132'
|
3
|
+
|
4
|
+
module CarinForBlueButtonTestKit
|
5
|
+
class CarinEOBInpatientAttestationGroup < Inferno::TestGroup
|
6
|
+
id :c4bb_eob_inpatient
|
7
|
+
title 'Explanation of Benefit - Inpatient Institutional'
|
8
|
+
short_title 'EOB Inpatient Institutional'
|
9
|
+
|
10
|
+
test from: :carin_server_requirement_130_attestation
|
11
|
+
test from: :carin_server_requirement_132_attestation
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement156 < Inferno::Test
|
3
|
+
title 'Maps CPCDS data when line item data is unavailable'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health IT Module maps CPCDS data to either `EOB.item` or `EOB.header` as appropriate:
|
6
|
+
- When line item amounts are available, they are provided in `EOB.item`.
|
7
|
+
- When line item amounts are not available, claim-level amounts and amount types are provided in `EOB.header`.
|
8
|
+
DESCRIPTION
|
9
|
+
id :carin_server_requirement_156_attestation
|
10
|
+
|
11
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@156'
|
12
|
+
|
13
|
+
run do
|
14
|
+
identifier = SecureRandom.hex(32)
|
15
|
+
wait(
|
16
|
+
identifier:,
|
17
|
+
message: <<~MESSAGE
|
18
|
+
I attest that the Health IT Module maps CPCDS data to either `EOB.item` or `EOB.header` as appropriate:
|
19
|
+
- When line item amounts are available, they are provided in `EOB.item`.
|
20
|
+
- When line item amounts are not available, claim-level amounts and amount types are provided in `EOB.header`.
|
21
|
+
|
22
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
23
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
24
|
+
MESSAGE
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement157_158_159 < Inferno::Test
|
3
|
+
title 'Correctly populates EOB.item.productOrService'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health IT Module:
|
6
|
+
- Defines CPT, HCPCS, or HIPPS codes in `item.productOrService` as CodeableConcepts,
|
7
|
+
- Ensures `item.productOrService` is populated whenever `.item` is present,
|
8
|
+
- Enforces a cardinality of 1..1 for `item.productOrService`.
|
9
|
+
DESCRIPTION
|
10
|
+
id :carin_server_requirement_157_158_159_attestation
|
11
|
+
|
12
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@157',
|
13
|
+
'hl7.fhir.us.carin-bb_2.0.0@158',
|
14
|
+
'hl7.fhir.us.carin-bb_2.0.0@159'
|
15
|
+
|
16
|
+
run do
|
17
|
+
identifier = SecureRandom.hex(32)
|
18
|
+
wait(
|
19
|
+
identifier:,
|
20
|
+
message: <<~MESSAGE
|
21
|
+
I attest that the Health IT Module:
|
22
|
+
|
23
|
+
- Defines CPT, HCPCS, or HIPPS codes in `item.productOrService` and represents them as CodeableConcepts,
|
24
|
+
- Populates `item.productOrService` whenever `EOB.item` is present,
|
25
|
+
- Enforces that `item.productOrService` has a cardinality of 1..1.
|
26
|
+
|
27
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
|
28
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
|
29
|
+
MESSAGE
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative '05_eob_outpatient_group/attestation_test_requirement_157'
|
2
|
+
require_relative '05_eob_outpatient_group/attestation_test_requirement_156'
|
3
|
+
|
4
|
+
module CarinForBlueButtonTestKit
|
5
|
+
class CarinEOBOutpatientAttestationGroup < Inferno::TestGroup
|
6
|
+
id :c4bb_eob_outpatient
|
7
|
+
title 'Explanation of Benefit - Outpatient Institutional'
|
8
|
+
short_title 'EOB Outpatient Institutional'
|
9
|
+
|
10
|
+
test from: :carin_server_requirement_156_attestation
|
11
|
+
test from: :carin_server_requirement_157_158_159_attestation
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement144_145_146 < Inferno::Test
|
3
|
+
title 'Correctly maps CPCDS data to EOB.item and EOB.total fields'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health IT Module maps CPCDS data elements to:
|
6
|
+
- `EOB.item` for line item amounts, amount types, and network status,
|
7
|
+
- `EOB.total` for claim-level totals,
|
8
|
+
- `C4BB Payer Benefit Payment Status` is set to 'Other' when lines are both in-network and out-of-network.
|
9
|
+
DESCRIPTION
|
10
|
+
id :carin_server_requirement_144_145_146_attestation
|
11
|
+
|
12
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@144',
|
13
|
+
'hl7.fhir.us.carin-bb_2.0.0@145',
|
14
|
+
'hl7.fhir.us.carin-bb_2.0.0@146'
|
15
|
+
|
16
|
+
run do
|
17
|
+
identifier = SecureRandom.hex(32)
|
18
|
+
wait(
|
19
|
+
identifier:,
|
20
|
+
message: <<~MESSAGE
|
21
|
+
I attest that the Health IT Module maps CPCDS data elements as follows:
|
22
|
+
|
23
|
+
- Line-level data (amounts, types, network status) are provided in `EOB.item`,
|
24
|
+
- Claim-level totals are in `EOB.total`,
|
25
|
+
- Mixed network claims set `C4BB Payer Benefit Payment Status` to 'Other'.
|
26
|
+
|
27
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
|
28
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
|
29
|
+
MESSAGE
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement148 < Inferno::Test
|
3
|
+
title 'Populates facility information when differs from billing'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The Health Plan API populates `supportingInfo[service`facility`] with the name, full address,
|
6
|
+
and identifier of the facility where services were rendered, when that facility differs from the Billing or
|
7
|
+
Rendering Provider.
|
8
|
+
DESCRIPTION
|
9
|
+
id :carin_server_requirement_148_attestation
|
10
|
+
|
11
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@148'
|
12
|
+
|
13
|
+
run do
|
14
|
+
identifier = SecureRandom.hex(32)
|
15
|
+
wait(
|
16
|
+
identifier:,
|
17
|
+
message: <<~MESSAGE
|
18
|
+
I attest that the Health Plan API populates `supportingInfo[service`facility`] with the name, full address,
|
19
|
+
and identifier of the facility where services were rendered, when that facility differs from the Billing or
|
20
|
+
Rendering Provider.
|
21
|
+
|
22
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
23
|
+
|
24
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
25
|
+
MESSAGE
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement149 < Inferno::Test
|
3
|
+
title 'References sequence number of associated diagnosis'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The `item.diagnosisSequence` element references the sequence number of the associated
|
6
|
+
diagnosis listed in the ExplanationOfBenefit resource.
|
7
|
+
DESCRIPTION
|
8
|
+
id :carin_server_requirement_149_attestation
|
9
|
+
|
10
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@149'
|
11
|
+
|
12
|
+
run do
|
13
|
+
identifier = SecureRandom.hex(32)
|
14
|
+
wait(
|
15
|
+
identifier:,
|
16
|
+
message: <<~MESSAGE
|
17
|
+
I attest that the `item.diagnosisSequence` element references the sequence number of the associated
|
18
|
+
diagnosis listed in the ExplanationOfBenefit resource.
|
19
|
+
|
20
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
21
|
+
|
22
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
23
|
+
MESSAGE
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement150 < Inferno::Test
|
3
|
+
title 'Uses procedure codes not revenue codes'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The `item.productOrService` element in an oral ExplanationOfBenefit resource
|
6
|
+
is populated with CPT or HCPCS procedure codes as CodeableConcept values, and that revenue
|
7
|
+
codes are not used for oral claims.
|
8
|
+
DESCRIPTION
|
9
|
+
id :carin_server_requirement_150_attestation
|
10
|
+
|
11
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@150'
|
12
|
+
|
13
|
+
run do
|
14
|
+
identifier = SecureRandom.hex(32)
|
15
|
+
wait(
|
16
|
+
identifier:,
|
17
|
+
message: <<~MESSAGE
|
18
|
+
I attest that the `item.productOrService` element in an oral ExplanationOfBenefit resource
|
19
|
+
is populated with CPT or HCPCS procedure codes as CodeableConcept values, and that revenue
|
20
|
+
codes are not used for oral claims.
|
21
|
+
|
22
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
23
|
+
|
24
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
25
|
+
MESSAGE
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement151 < Inferno::Test
|
3
|
+
title 'Specifies primary body site'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
The primary body site for each line item (tooth or oral cavity) is specified in the
|
6
|
+
`item.bodySite` element of the ExplanationOfBenefit resource.
|
7
|
+
DESCRIPTION
|
8
|
+
id :carin_server_requirement_151_attestation
|
9
|
+
|
10
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@151'
|
11
|
+
|
12
|
+
run do
|
13
|
+
identifier = SecureRandom.hex(32)
|
14
|
+
wait(
|
15
|
+
identifier:,
|
16
|
+
message: <<~MESSAGE
|
17
|
+
I attest that the primary body site for each line item (tooth or oral cavity) is specified in the
|
18
|
+
`item.bodySite` element of the ExplanationOfBenefit resource.
|
19
|
+
|
20
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
21
|
+
|
22
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
23
|
+
MESSAGE
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement152 < Inferno::Test
|
3
|
+
title 'Specifies additional body sites'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
Additional body sites (tooth or oral cavity) are specified in `supportingInfo[additionalbodysite]`
|
6
|
+
elements, and that each `supportingInfo[additionalbodysite].sequence` matches the associated line item's
|
7
|
+
`item.informationSequence`.
|
8
|
+
DESCRIPTION
|
9
|
+
id :carin_server_requirement_152_attestation
|
10
|
+
|
11
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@152'
|
12
|
+
|
13
|
+
run do
|
14
|
+
identifier = SecureRandom.hex(32)
|
15
|
+
wait(
|
16
|
+
identifier:,
|
17
|
+
message: <<~MESSAGE
|
18
|
+
I attest that additional body sites (tooth or oral cavity) are specified in `supportingInfo[additionalbodysite]`
|
19
|
+
elements, and that each `supportingInfo[additionalbodysite].sequence` matches the associated line item's
|
20
|
+
`item.informationSequence`.
|
21
|
+
|
22
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
23
|
+
|
24
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
25
|
+
MESSAGE
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module CarinForBlueButtonTestKit
|
2
|
+
class AttestationTestCarinV2Requirement153 < Inferno::Test
|
3
|
+
title 'Applies oral line item subsites to associated tooth surfaces'
|
4
|
+
description <<~DESCRIPTION
|
5
|
+
All oral line item subsites (`item.subSite` repetitions) apply to all the line item's
|
6
|
+
associated tooth surfaces, including those specified in `item.bodySite` and `supportingInfo[additionalbodysite]`,
|
7
|
+
with the association established through matching `supportingInfo[additionalbodysite].sequence` values in
|
8
|
+
`item.informationSequence`.
|
9
|
+
DESCRIPTION
|
10
|
+
id :carin_server_requirement_153_attestation
|
11
|
+
|
12
|
+
verifies_requirements 'hl7.fhir.us.carin-bb_2.0.0@153'
|
13
|
+
|
14
|
+
run do
|
15
|
+
identifier = SecureRandom.hex(32)
|
16
|
+
wait(
|
17
|
+
identifier:,
|
18
|
+
message: <<~MESSAGE
|
19
|
+
I attest that all oral line item subsites (`item.subSite` repetitions) apply to all the line item's
|
20
|
+
associated tooth surfaces, including those specified in `item.bodySite` and `supportingInfo[additionalbodysite]`,
|
21
|
+
with the association established through matching `supportingInfo[additionalbodysite].sequence` values in
|
22
|
+
`item.informationSequence`.
|
23
|
+
|
24
|
+
[Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
|
25
|
+
|
26
|
+
[Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
|
27
|
+
MESSAGE
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative '06_eob_oral_group/attestation_test_requirement_144'
|
2
|
+
require_relative '06_eob_oral_group/attestation_test_requirement_148'
|
3
|
+
require_relative '06_eob_oral_group/attestation_test_requirement_149'
|
4
|
+
require_relative '06_eob_oral_group/attestation_test_requirement_150'
|
5
|
+
require_relative '06_eob_oral_group/attestation_test_requirement_151'
|
6
|
+
require_relative '06_eob_oral_group/attestation_test_requirement_152'
|
7
|
+
require_relative '06_eob_oral_group/attestation_test_requirement_153'
|
8
|
+
|
9
|
+
module CarinForBlueButtonTestKit
|
10
|
+
class CarinEOBOralAttestationGroup < Inferno::TestGroup
|
11
|
+
id :c4bb_eob_oral
|
12
|
+
title 'Explanation of Benefit - Oral'
|
13
|
+
short_title 'EOB Oral'
|
14
|
+
|
15
|
+
test from: :carin_server_requirement_144_145_146_attestation
|
16
|
+
test from: :carin_server_requirement_148_attestation
|
17
|
+
test from: :carin_server_requirement_149_attestation
|
18
|
+
test from: :carin_server_requirement_150_attestation
|
19
|
+
test from: :carin_server_requirement_151_attestation
|
20
|
+
test from: :carin_server_requirement_152_attestation
|
21
|
+
test from: :carin_server_requirement_153_attestation
|
22
|
+
end
|
23
|
+
end
|