davinci_pdex_test_kit 0.12.1 → 0.12.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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/authentication.rb +34 -0
  3. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/must_support.rb +40 -0
  4. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/provenance.rb +32 -0
  5. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/receive_must_support.rb +34 -0
  6. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation.rb +24 -0
  7. data/lib/davinci_pdex_test_kit/pdex_payer_client_suite.rb +17 -3
  8. data/lib/davinci_pdex_test_kit/pdex_payer_server/urls.rb +27 -0
  9. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/bulk_data_transmission_restrictions.rb +33 -0
  10. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/consent_failure.rb +40 -0
  11. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/consent_requirements.rb +40 -0
  12. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/hrex_must_support.rb +35 -0
  13. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/licensing.rb +37 -0
  14. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/member_auth.rb +81 -0
  15. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/mtls.rb +61 -0
  16. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/payer_consent_compliance.rb +33 -0
  17. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/prior_authorization_decisions.rb +35 -0
  18. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/provenance_records.rb +40 -0
  19. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/read_and_search_hrex.rb +35 -0
  20. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/resources_in_capability_statement.rb +35 -0
  21. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation.rb +39 -0
  22. data/lib/davinci_pdex_test_kit/pdex_payer_server_suite.rb +26 -0
  23. data/lib/davinci_pdex_test_kit/pdex_provider_client_suite.rb +8 -0
  24. data/lib/davinci_pdex_test_kit/requirements/{generated/davinci-pdex-test-kit_requirements_coverage.csv → davinci_pdex_test_kit_requirements.csv} +108 -59
  25. data/lib/davinci_pdex_test_kit/requirements/generated/pdex_payer_client_requirements_coverage.csv +29 -0
  26. data/lib/davinci_pdex_test_kit/requirements/generated/pdex_payer_server_requirements_coverage.csv +479 -0
  27. data/lib/davinci_pdex_test_kit/requirements/hl7.fhir.us.davinci-pdex_2.0.0_reqs.xlsx +0 -0
  28. data/lib/davinci_pdex_test_kit/version.rb +2 -2
  29. data/lib/davinci_pdex_test_kit.rb +0 -1
  30. metadata +35 -20
  31. data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_out_of_scope_requirements.csv +0 -1
  32. data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_requirements.csv +0 -66
  33. data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +0 -22
  34. data/lib/inferno_requirements_tools/rake/rakefile_template +0 -19
  35. data/lib/inferno_requirements_tools/tasks/collect_requirements.rb +0 -228
  36. data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +0 -284
  37. data/lib/requirements_config.yaml +0 -17
@@ -1,4 +1,4 @@
1
1
  module DaVinciPDexTestKit
2
- VERSION = '0.12.1'.freeze
3
- LAST_UPDATED = '2025-05-19'.freeze
2
+ VERSION = '0.12.2'.freeze
3
+ LAST_UPDATED = '2025-07-07'.freeze
4
4
  end
@@ -1,4 +1,3 @@
1
- require_relative 'inferno_requirements_tools/ext/inferno_core/runnable'
2
1
  require_relative 'davinci_pdex_test_kit/metadata'
3
2
  require_relative 'davinci_pdex_test_kit/pdex_payer_server_suite'
4
3
  require_relative 'davinci_pdex_test_kit/pdex_payer_client_suite'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: davinci_pdex_test_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.12.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karl Naden
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2025-05-19 00:00:00.000000000 Z
13
+ date: 2025-07-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: inferno_core
@@ -18,42 +18,42 @@ dependencies:
18
18
  requirements:
19
19
  - - "~>"
20
20
  - !ruby/object:Gem::Version
21
- version: 0.6.7
21
+ version: 0.6.16
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
- version: 0.6.7
28
+ version: 0.6.16
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: us_core_test_kit
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: 0.11.0
35
+ version: 0.11.5
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: 0.11.0
42
+ version: 0.11.5
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: bulk_data_test_kit
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: 0.12.1
49
+ version: 0.12.3
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: 0.12.1
56
+ version: 0.12.3
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: faraday
59
59
  requirement: !ruby/object:Gem::Requirement
@@ -88,28 +88,28 @@ dependencies:
88
88
  requirements:
89
89
  - - "~>"
90
90
  - !ruby/object:Gem::Version
91
- version: 0.6.3
91
+ version: 0.6.4
92
92
  type: :runtime
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
- version: 0.6.3
98
+ version: 0.6.4
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: udap_security_test_kit
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: 0.11.5
105
+ version: 0.11.6
106
106
  type: :runtime
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - "~>"
111
111
  - !ruby/object:Gem::Version
112
- version: 0.11.5
112
+ version: 0.11.6
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: database_cleaner-sequel
115
115
  requirement: !ruby/object:Gem::Requirement
@@ -267,6 +267,11 @@ files:
267
267
  - lib/davinci_pdex_test_kit/pdex_payer_client/pdex_client_options.rb
268
268
  - lib/davinci_pdex_test_kit/pdex_payer_client/tags.rb
269
269
  - lib/davinci_pdex_test_kit/pdex_payer_client/urls.rb
270
+ - lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation.rb
271
+ - lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/authentication.rb
272
+ - lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/must_support.rb
273
+ - lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/provenance.rb
274
+ - lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/receive_must_support.rb
270
275
  - lib/davinci_pdex_test_kit/pdex_payer_client_suite.rb
271
276
  - lib/davinci_pdex_test_kit/pdex_payer_server/coverage_to_link_minimal_data_validation.rb
272
277
  - lib/davinci_pdex_test_kit/pdex_payer_server/coverage_to_link_must_support_validation.rb
@@ -314,22 +319,32 @@ files:
314
319
  - lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_reference_resolution_test.rb
315
320
  - lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_validation_test.rb
316
321
  - lib/davinci_pdex_test_kit/pdex_payer_server/provenance_group.rb
322
+ - lib/davinci_pdex_test_kit/pdex_payer_server/urls.rb
323
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation.rb
324
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/bulk_data_transmission_restrictions.rb
325
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/consent_failure.rb
326
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/consent_requirements.rb
327
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/hrex_must_support.rb
328
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/licensing.rb
329
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/member_auth.rb
330
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/mtls.rb
331
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/payer_consent_compliance.rb
332
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/prior_authorization_decisions.rb
333
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/provenance_records.rb
334
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/read_and_search_hrex.rb
335
+ - lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/resources_in_capability_statement.rb
317
336
  - lib/davinci_pdex_test_kit/pdex_payer_server/workflow_clinical_data_group.rb
318
337
  - lib/davinci_pdex_test_kit/pdex_payer_server/workflow_everything_group.rb
319
338
  - lib/davinci_pdex_test_kit/pdex_payer_server/workflow_export_group.rb
320
339
  - lib/davinci_pdex_test_kit/pdex_payer_server/workflow_member_match_group.rb
321
340
  - lib/davinci_pdex_test_kit/pdex_payer_server_suite.rb
322
341
  - lib/davinci_pdex_test_kit/pdex_provider_client_suite.rb
323
- - lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_out_of_scope_requirements.csv
324
- - lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_requirements.csv
325
- - lib/davinci_pdex_test_kit/requirements/generated/davinci-pdex-test-kit_requirements_coverage.csv
342
+ - lib/davinci_pdex_test_kit/requirements/davinci_pdex_test_kit_requirements.csv
343
+ - lib/davinci_pdex_test_kit/requirements/generated/pdex_payer_client_requirements_coverage.csv
344
+ - lib/davinci_pdex_test_kit/requirements/generated/pdex_payer_server_requirements_coverage.csv
345
+ - lib/davinci_pdex_test_kit/requirements/hl7.fhir.us.davinci-pdex_2.0.0_reqs.xlsx
326
346
  - lib/davinci_pdex_test_kit/user_input_response.rb
327
347
  - lib/davinci_pdex_test_kit/version.rb
328
- - lib/inferno_requirements_tools/ext/inferno_core/runnable.rb
329
- - lib/inferno_requirements_tools/rake/rakefile_template
330
- - lib/inferno_requirements_tools/tasks/collect_requirements.rb
331
- - lib/inferno_requirements_tools/tasks/requirements_coverage.rb
332
- - lib/requirements_config.yaml
333
348
  homepage: https://github.com/inferno-framework/davinci-pdex-test-kit/
334
349
  licenses:
335
350
  - Apache-2.0
@@ -1,66 +0,0 @@
1
- Req Set,ID,URL,Requirement,Conformance,Actor,Sub-Requirement(s),Conditionality
2
- hl7.fhir.us.davinci-pdex_2.0.0,1,https://hl7.org/fhir/us/davinci-pdex/STU2/#intellectual-property,Implementers ... of this specification SHALL abide by the license requirements for each terminology content artifact utilized within a functioning implementation.,SHALL,Server,,false
3
- hl7.fhir.us.davinci-pdex_2.0.0,2,https://hl7.org/fhir/us/davinci-pdex/STU2/#intellectual-property,Terminology licenses SHALL be obtained from the Third-Party IP owner for each code system and/or other specified artifact used.,SHALL,Server,,false
4
- hl7.fhir.us.davinci-pdex_2.0.0,3,https://hl7.org/fhir/us/davinci-pdex/STU2/index.html#must-support,"For profiles defined in [US Core and referenced by PDex], the meaning of Must Support [for Servers] is established in [the US Core IG].",SHALL,Server,"hl7.fhir.us.core_3.1.1@75,77,78,80",false
5
- hl7.fhir.us.davinci-pdex_2.0.0,4,https://hl7.org/fhir/us/davinci-pdex/STU2/index.html#must-support,"For profiles defined in [US Core and referenced by PDex], the meaning of Must Support [for Clients] is established in [the US Core IG].",SHALL,Client,"hl7.fhir.us.core_3.1.1@76,79",false
6
- hl7.fhir.us.davinci-pdex_2.0.0,5,https://hl7.org/fhir/us/davinci-pdex/STU2/index.html#must-support,"For profiles defined in [DaVinci HRex and referenced by PDex], the meaning of Must Support [for Servers] is established in [the HRex IG].",SHALL,Server,"hl7.fhir.us.davinci-hrex_1.0.0@21,22,24,25,27",false
7
- hl7.fhir.us.davinci-pdex_2.0.0,6,https://hl7.org/fhir/us/davinci-pdex/STU2/index.html#must-support,"For profiles defined in [DaVinci HRex and referenced by PDex], the meaning of Must Support [for Clients] is established in [the HRex IG].",SHALL,Client,"hl7.fhir.us.davinci-hrex_1.0.0@23,26,28",false
8
- hl7.fhir.us.davinci-pdex_2.0.0,7,https://hl7.org/fhir/us/davinci-pdex/STU2/index.html#must-support,"[For profiles defined in the PDex IG, Servers SHALL follow] Must Support requirements … [from] the US Core Implementation Guide.",SHALL,Server,"hl7.fhir.us.core_3.1.1@75,77,78,80",false
9
- hl7.fhir.us.davinci-pdex_2.0.0,8,https://hl7.org/fhir/us/davinci-pdex/STU2/index.html#must-support,"[For profiles defined in the PDex IG, Clients SHALL follow] Must Support requirements … [from] the US Core Implementation Guide.",SHALL,Client,"hl7.fhir.us.core_3.1.1@76,79",false
10
- hl7.fhir.us.davinci-pdex_2.0.0,9,https://hl7.org/fhir/us/davinci-pdex/STU2/overview.html#overview,All data exchanged by Health Plans using the interactions covered in this IG SHALL be transformed to FHIR R4 resources.,SHALL,Server,,false
11
- hl7.fhir.us.davinci-pdex_2.0.0,10,"https://hl7.org/fhir/us/davinci-pdex/STU2/overview.html#oauth20-or-smart-on-fhir-member-authorized-exchange,https://hl7.org/fhir/us/davinci-pdex/STU2/member-authorizedoauth2exchange.html,https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api",The member SHALL authenticate using [and the server SHALL accept only] credentials that have been issued by or are recognized and accepted by the Health Plan. These are typically the member’s customer portal credentials for accessing the health plan.,SHALL,Client,,false
12
- hl7.fhir.us.davinci-pdex_2.0.0,11,https://hl7.org/fhir/us/davinci-pdex/STU2/overview.html#patient-everything-exchange-via-alternate-secure-transport,The use of the Bulk FHIR specification for transmission of member data SHALL honor jurisdictional and personal privacy restrictions that are relevant to a member’s health record.,SHALL,Server,,false
13
- hl7.fhir.us.davinci-pdex_2.0.0,12,https://hl7.org/fhir/us/davinci-pdex/STU2/overview.html#provenance,Health Plans SHALL incorporate provenance records that they receive as part of any exchange of FHIR data.,SHALL,Server,,false
14
- hl7.fhir.us.davinci-pdex_2.0.0,13,https://hl7.org/fhir/us/davinci-pdex/STU2/overview.html#provenance,"Health Plans SHALL provide Provenance records [for each non-Provenance instance] that, at a minimum, indicate that they are playing the role of Transmitter of the data in any PDex information exchange.",SHALL,Server,,false
15
- hl7.fhir.us.davinci-pdex_2.0.0,14,https://hl7.org/fhir/us/davinci-pdex/STU2/introduction.html#implementation-hierarchy-and-priorities,"[F]or profiles and APIs identified in this IG, the FHIR R4 version SHALL be used.",SHALL,Server,,false
16
- hl7.fhir.us.davinci-pdex_2.0.0,15,https://hl7.org/fhir/us/davinci-pdex/STU2/introduction.html#pdex-data-payloads,All resources available via a FHIR API endpoint SHALL be declared in a FHIR CapabilityStatement.,SHALL,Server,,false
17
- hl7.fhir.us.davinci-pdex_2.0.0,16,https://hl7.org/fhir/us/davinci-pdex/STU2/introduction.html#pdex-data-payloads,The Read and Search Operations SHALL be supported for the FHIR Profiles [that are part of the member health history].,SHALL,Server,,false
18
- hl7.fhir.us.davinci-pdex_2.0.0,17,https://hl7.org/fhir/us/davinci-pdex/STU2/introduction.html#capabilitystatement,The Read ... Operation... SHALL be supported for … Resource Type … Coverage [using the [HRex Coverage](https://hl7.org/fhir/us/davinci-hrex/STU1/StructureDefinition-hrex-coverage.html) profile].,SHALL,Server,,false
19
- hl7.fhir.us.davinci-pdex_2.0.0,18,https://hl7.org/fhir/us/davinci-pdex/STU2/introduction.html#capabilitystatement,The ... Search Operation... SHALL be supported for … Resource Type … Coverage [using the [HRex Coverage](https://hl7.org/fhir/us/davinci-hrex/STU1/StructureDefinition-hrex-coverage.html) profile].,SHALL,Server,,false
20
- hl7.fhir.us.davinci-pdex_2.0.0,19,https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#data-payloads,All resources and operations available via a FHIR API endpoint SHALL be declared in a FHIR CapabilityStatement.,SHALL,Server,,false
21
- hl7.fhir.us.davinci-pdex_2.0.0,20,"https://hl7.org/fhir/us/davinci-pdex/STU2/overview.html#oauth20-or-smart-on-fhir-member-authorized-exchange,https://hl7.org/fhir/us/davinci-pdex/STU2/member-authorizedoauth2exchange.html,https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api","[When a payer allows their member to authorize information sharing, a]fter authenticating to the (source) Health Plan’s authorization server, the Member SHALL be presented with an Authorization screen that enables them to approve the sharing of information with their intended application, service or (target) Health Plan.",SHALL,Server,,false
22
- hl7.fhir.us.davinci-pdex_2.0.0,21,https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api,"For this authorization [of data sharing by a member] to occur the Application, service or (target) Health Plan will require OAuth 2.0 client application credentials, which ... the (source) Health Plan [SHALL issue during client] register[ation]",SHALL,Server,,false
23
- hl7.fhir.us.davinci-pdex_2.0.0,22,"https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api,https://hl7.org/fhir/us/davinci-pdex/STU2/member-authorizedoauth2exchange.htm","The Authorization process [of data sharing by a member], in accordance with applicable privacy policy, SHALL provide a mechanism to support current regulations allowing members the right to decide what information is permitted to be exchanged.",SHALL,Server,,false
24
- hl7.fhir.us.davinci-pdex_2.0.0,23,"https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api,https://hl7.org/fhir/us/davinci-pdex/STU2/member-authorizedoauth2exchange.htm","After successfully authorizing [data sharing with] an application [on behalf of the Member,] an Access Token ... SHALL be returned to the requesting application.",SHALL,Server,,false
25
- hl7.fhir.us.davinci-pdex_2.0.0,24,"https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api,https://hl7.org/fhir/us/davinci-pdex/STU2/member-authorizedoauth2exchange.htm","After successfully authorizing [data sharing with] an application [on behalf of the Member,] an … Optional Refresh Token ... [MAY] be returned to the requesting application.",MAY,Server,,false
26
- hl7.fhir.us.davinci-pdex_2.0.0,25,https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api,The scopes of the access token [returned by the server for data sharing on behalf of a member] SHALL be restricted to the authorizing Member’s information and the scopes approved.,SHALL,Server,,false
27
- hl7.fhir.us.davinci-pdex_2.0.0,26,https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api,Any subsequent Access Token [returned by the server for data sharing on behalf of the member] issued based on the Refresh Token SHALL be restricted (at least) to the same restrictions.,SHALL,Server,,false
28
- hl7.fhir.us.davinci-pdex_2.0.0,27,"https://hl7.org/fhir/us/davinci-pdex/STU2/pdeximplementationactorsinteractionsdatapayloadsandmethods.html#oauth20-and-fhir-api,https://hl7.org/fhir/us/davinci-pdex/STU2/member-authorizedoauth2exchange.htm",The requesting application [authorized to access member information] SHALL use the access token to access the Health Plan’s secure FHIR API to download the information that the Application is allowed to access.,SHALL,Client,,false
29
- hl7.fhir.us.davinci-pdex_2.0.0,28,https://hl7.org/fhir/us/davinci-pdex/STU2/handlingdataprovenance.html#handling-data-provenance,Health Plans SHALL accept and retain Provenance records received with data based on Member-authorized Payer-to-Payer exchange.,SHALL,Client,,false
30
- hl7.fhir.us.davinci-pdex_2.0.0,29,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#member-match-with-consent,Each [data] retrieval ... SHALL be preceded by the use of the ... [HRex [$member-match](https://hl7.org/fhir/us/davinci-hrex/STU1/OperationDefinition-member-match.html)] interaction to match a member and provide consent.,SHALL,Client,"hl7.fhir.us.davinci-hrex_1.0.0@34,37,38,40,46,47",false
31
- hl7.fhir.us.davinci-pdex_2.0.0,30,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#member-match-with-consent,Health Plans SHALL support the $member-match operation.,SHALL,Server,"hl7.fhir.us.davinci-hrex_1.0.0@35,36,39,41-45,48",false
32
- hl7.fhir.us.davinci-pdex_2.0.0,31,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#member-match-with-consent,"[Before allowing a $member-match operation, Servers SHALL e]stablish a secure connection [with the client payer] via mTLS.",SHALL,Server,,false
33
- hl7.fhir.us.davinci-pdex_2.0.0,32,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#member-match-with-consent,[Servers SHALL allow clients to u]se mTLS secure connection to perform OAuth2.0 Dynamic Client Registration to acquire OAuth2.0 client credentials,SHALL,Server,,false
34
- hl7.fhir.us.davinci-pdex_2.0.0,33,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#member-match-with-consent,[Servers SHALL allow clients to u]se Client Credentials to acquire OAuth2.0 token to perform $member-match operation,SHALL,Server,,false
35
- hl7.fhir.us.davinci-pdex_2.0.0,34,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#member-match-with-consent,"If a Patient ID is returned from $member-match, [Servers SHALL allow clients to make] a request for an OAuth2.0 Access Token that is scoped to the identified shared member",SHALL,Server,,false
36
- hl7.fhir.us.davinci-pdex_2.0.0,35,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#the-member-match-operation,In the case where a [member] match is confirmed the receiving payer will: … [r]eturn a Unique Patient Identifier (Patient FHIR ID) in the $member-match Operation Response.,SHALL,Server,,true
37
- hl7.fhir.us.davinci-pdex_2.0.0,36,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#the-member-match-operation,When no [member] match is found ... a 422 Unprocessable entity status code will be returned [by the receiving payer].,SHALL,Server,,true
38
- hl7.fhir.us.davinci-pdex_2.0.0,37,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#the-member-match-operation,"When … multiple matches are found, a 422 Unprocessable entity status code will be returned [by the receiving payer].",SHALL,Server,,true
39
- hl7.fhir.us.davinci-pdex_2.0.0,38,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#the-member-match-operation,"If the receiving payer matches to a unique member but is unable to comply with the consent request, a Patient ID SHALL NOT be returned in the $member-match response",SHALL NOT,Server,,true
40
- hl7.fhir.us.davinci-pdex_2.0.0,39,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#the-member-match-operation,"If the receiving payer matches to a unique member but is unable to comply with the consent request [e.g., because they do not support the requested data segmentation policy], … a 422 status code SHALL be returned with an Operation Outcome that indicates that the consent request could not be complied with.",SHALL,Server,,true
41
- hl7.fhir.us.davinci-pdex_2.0.0,40,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#evaluation-of-consent,"[Servers SHALL consider consent requirements to be met only if]
42
- - Member Identity is matched
43
- - Consent Policy (Everything or only Non-Sensitive data) matches the data release segmentation capabilities of the receiving payer
44
- - Date period for consent is valid
45
- - Payer requesting retrieval of data is matched.",SHALL,Server,,false
46
- hl7.fhir.us.davinci-pdex_2.0.0,41,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#data-retrieval-methods,"Once Health Plans have completed the Member Access stage of the Exchange the requesting Health Plan SHALL utilize the access token returned from the Member Access step to request/retrieve data using one of the following three methods:
47
- - Query all clinical resource individually
48
- - $patient-everything operation
49
- - Bulk FHIR Asynchronous protocols.",SHALL,Client,,false
50
- hl7.fhir.us.davinci-pdex_2.0.0,42,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#data-retrieval-methods,"Each of the above methods[, query all clinical resource individually, $everything, and $export,] SHALL support the retrieval of the profiles and resources [in the scope of the member health history, defined in the Server CapabilityStatement]",SHALL,Server,,false
51
- hl7.fhir.us.davinci-pdex_2.0.0,43,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#query-all-clinical-resources-individually,Health Plans SHALL support search of a member’s clinical data.,SHALL,Server,,false
52
- hl7.fhir.us.davinci-pdex_2.0.0,44,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#query-all-clinical-resources-individually,[Servers SHALL support] the _revInclude and _include parameters to ... retrieve the associated Provenance and supporting records.,SHALL,Server,,false
53
- hl7.fhir.us.davinci-pdex_2.0.0,45,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#constraining-data-based-upon-permissions-of-the-requestor,The FHIR Server SHALL constrain the data returned from the server to a requester based upon the access permissions of the requester.,SHALL,Server,,false
54
- hl7.fhir.us.davinci-pdex_2.0.0,46,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#everything-operation,Health Plans SHOULD support the use of the $everything operation… defined in the FHIR R4 specification here: https://www.hl7.org/fhir/operation-patient-everything.html,SHOULD,Server,fhir_4.0.1,false
55
- hl7.fhir.us.davinci-pdex_2.0.0,47,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#bulk-fhir-asynchronous-protocols,"Payer-to-Payer Data Exchange SHOULD support the use of Bulk FHIR methods, as defined in the HL7 FHIR [Bulk Data Access Implementation Guide](https://hl7.org/fhir/uv/bulkdata/authorization/). ",SHOULD,Server,hl7.fhir.uv.bulkdata_2.0.0,false
56
- hl7.fhir.us.davinci-pdex_2.0.0,48,https://hl7.org/fhir/us/davinci-pdex/STU2/datamapping.html#data-mapping,Health Plans SHALL map claims and clinical information for a member to US Core v3.1.1 FHIR Resources based on R4.,SHALL,Server,hl7.fhir.us.core_3.1.1,false
57
- hl7.fhir.us.davinci-pdex_2.0.0,49,https://hl7.org/fhir/us/davinci-pdex/STU2/datamapping.html#data-mapping,"Where a US Core FHIR R4 Resource is not defined Health Plans SHALL map claims and clinical information to FHIR Profiles defined in this IG, or the Da Vinci HRex IG.",SHALL,Server,hl7.fhir.us.davinci-hrex_1.0.0,true
58
- hl7.fhir.us.davinci-pdex_2.0.0,50,https://hl7.org/fhir/us/davinci-pdex/STU2/datamapping.html#providing-data-in-sub-element-fields,"If a field is marked as required (cardinality n.., where n>0) the Health Plan SHALL populate the field.",SHALL,Server,,true
59
- hl7.fhir.us.davinci-pdex_2.0.0,51,https://hl7.org/fhir/us/davinci-pdex/STU2/datamapping.html#providing-data-in-sub-element-fields,"For a field specified as MUST SUPPORT and the cardinality is 0.., the Health Plan SHALL be capable of populating the field and do so if the relevant data exists.",SHALL,Server,,true
60
- hl7.fhir.us.davinci-pdex_2.0.0,52,https://hl7.org/fhir/us/davinci-pdex/STU2/datamapping.html#providing-data-in-sub-element-fields,"For a field specified as MUST SUPPORT and the cardinality is 0.., the Health Plan SHALL … [populate] the field ... if the relevant data exists.",SHALL,Server,,true
61
- hl7.fhir.us.davinci-pdex_2.0.0,53,https://hl7.org/fhir/us/davinci-pdex/STU2/datamapping.html#providing-data-in-sub-element-fields,"If a field is marked as MUST SUPPORT the receiver must be able to consume it without generating an error, unless the field is a sub-element of another field where that parent field does NOT have a minimum cardinality of 1 [or a Must Support Flag]. For example, if the parent field has a cardinality of “0..1” or “0..*” the sub-element field does not need to be populated.",SHALL,Client,,true
62
- hl7.fhir.us.davinci-pdex_2.0.0,54,https://hl7.org/fhir/us/davinci-pdex/STU2/usecasescenarios.html#versioning-of-fhir-data,"If a payer chooses to support FHIR resource data versioning of related resource references, the referring resource **SHALL** use the vread format of reference: `[type]/[id]/_history/[vid]`",MAY,Server,,true
63
- hl7.fhir.us.davinci-pdex_2.0.0,55,https://hl7.org/fhir/us/davinci-pdex/STU2/usecasescenarios.html#versioning-of-fhir-data,Supporting versioning of FHIR data implies supporting the [vread](https://www.hl7.org/fhir/http.html#vread) and [history](https://www.hl7.org/fhir/http.html#history) interactions in the FHIR specification.,MAY,Server,,true
64
- hl7.fhir.us.davinci-pdex_2.0.0,56,https://hl7.org/fhir/us/davinci-pdex/STU2/StructureDefinition-pdex-priorauthorization.html,"Payers SHALL make available pending and active prior authorization decisions and related clinical documentation and forms for items and services, not including prescription drugs, including the date the prior authorization was approved, the date the authorization ends, as well as the units and services approved and those used to date, no later than one (1) business day after a provider initiates a prior authorization for the beneficiary or there is a change of status for the prior authorization.",SHALL,Server,,false
65
- hl7.fhir.us.davinci-pdex_2.0.0,57,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#bulk-fhir-asynchronous-protocols,The request/retrieval [for the Payer-to-Payer Exchange] of data SHOULD use the [FHIR Bulk Data Patient Level Export](https://hl7.org/fhir/uv/bulkdata/OperationDefinition-patient-export.html).,SHOULD,Server,hl7.fhir.uv.bulkdata_2.0.0,false
66
- hl7.fhir.us.davinci-pdex_2.0.0,58,https://hl7.org/fhir/us/davinci-pdex/STU2/payertopayerexchange.html#bulk-fhir-asynchronous-protocols,The request/retrieval [for the Payer-to-Payer Exchange] of data SHOULD use the … [Bulk Data Export Operation Request Flow](https://hl7.org/fhir/uv/bulkdata/export.html#bulk-data-export-operation-request-flow).,SHOULD,Server,hl7.fhir.uv.bulkdata_2.0.0,false
@@ -1,22 +0,0 @@
1
- module Inferno
2
- module DSL
3
- # This module contains the DSL for defining child entities in the test
4
- # definition framework.
5
- module Runnable
6
- # Set/Get the IDs of requirements verifed by this runnable
7
- # Set with [] to clear the list
8
- #
9
- # @param requirements [Array<String>]
10
- # @return [Array<String>] the requirement IDs
11
- def verifies_requirements(*requirement_ids)
12
- if requirement_ids.empty?
13
- @requirement_ids || []
14
- elsif requirement_ids == [[]]
15
- @requirement_ids = []
16
- else
17
- @requirement_ids = requirement_ids
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,19 +0,0 @@
1
- namespace :requirements do
2
- desc 'Generate requirements coverage CSV'
3
- task :generate_coverage do
4
- require 'inferno'
5
- Inferno::Application.start(:suites)
6
-
7
- require_relative 'lib/inferno_requirements_tools/tasks/requirements_coverage'
8
- InfernoRequirementsTools::Tasks::RequirementsCoverage.new.run
9
- end
10
-
11
- desc 'Check if requirements coverage CSV is up-to-date'
12
- task :check_coverage do
13
- require 'inferno'
14
- Inferno::Application.start(:suites)
15
-
16
- require_relative 'lib/inferno_requirements_tools/tasks/requirements_coverage'
17
- InfernoRequirementsTools::Tasks::RequirementsCoverage.new.run_check
18
- end
19
- end
@@ -1,228 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'CSV'
4
- require 'roo'
5
- require 'yaml'
6
- require 'csv'
7
-
8
- module InfernoRequirementsTools
9
- module Tasks
10
- # This class manages the collection of requirements details from
11
- # requirements planning excel workbooks into a CSV representation.
12
- # Currently splits out Requirements and Planned Not Tested Requirements
13
- # into two separate files.
14
- #
15
- # The `run_check` method will check whether the previously generated file is up-to-date.
16
- class CollectRequirements
17
- CONFIG = YAML.load_file(File.join('lib', 'requirements_config.yaml'))
18
-
19
- TEST_KIT_ID = CONFIG['test_kit_id']
20
- INPUT_SETS = CONFIG['requirement_sets'].map do |req_set|
21
- req_set['id']
22
- end
23
-
24
- # Derivative constants
25
- TEST_KIT_CODE_FOLDER = TEST_KIT_ID.gsub('-', '_')
26
- DASHERIZED_TEST_KIT_ID = TEST_KIT_ID.gsub('_', '-')
27
- INPUT_HEADERS =
28
- [
29
- 'ID*',
30
- 'URL*',
31
- 'Requirement*',
32
- 'Conformance*',
33
- 'Actor*',
34
- 'Sub-Requirement(s)',
35
- 'Conditionality',
36
- 'Verifiable?',
37
- 'Verifiability Details',
38
- 'Planning To Test?',
39
- 'Planning To Test Details'
40
- ].freeze
41
- REQUIREMENTS_OUTPUT_HEADERS =
42
- [
43
- 'Req Set',
44
- 'ID',
45
- 'URL',
46
- 'Requirement',
47
- 'Conformance',
48
- 'Actor',
49
- 'Sub-Requirement(s)',
50
- 'Conditionality'
51
- ].freeze
52
- REQUIREMENTS_OUTPUT_FILE_NAME = "#{DASHERIZED_TEST_KIT_ID}_requirements.csv".freeze
53
- REQUIREMENTS_OUTPUT_FILE =
54
- File.join('lib', TEST_KIT_CODE_FOLDER, 'requirements', REQUIREMENTS_OUTPUT_FILE_NAME).freeze
55
- PLANNED_NOT_TESTED_OUTPUT_HEADERS = ['Req Set', 'ID', 'Reason', 'Details'].freeze
56
- PLANNED_NOT_TESTED_OUTPUT_FILE_NAME = "#{DASHERIZED_TEST_KIT_ID}_out_of_scope_requirements.csv".freeze
57
- PLANNED_NOT_TESTED_OUTPUT_FILE =
58
- File.join('lib', TEST_KIT_CODE_FOLDER, 'requirements', PLANNED_NOT_TESTED_OUTPUT_FILE_NAME).freeze
59
-
60
- def available_input_worksheets
61
- @available_input_worksheets ||= Dir.glob(File.join(@input_directory, '*.xlsx')).reject { |f| f.include?('~$') }
62
- end
63
-
64
- # Of the form:
65
- # {
66
- # req_set_id_1: [row1, row2, row 3, ...],
67
- # req_set_id_2: [row1, row2, row 3, ...]
68
- # }
69
- def input_requirement_sets
70
- @input_requirement_sets ||= INPUT_SETS.each_with_object({}) do |req_set_id, hash|
71
- req_set_file = available_input_worksheets.find { |worksheet_file| worksheet_file.include?(req_set_id) }
72
-
73
- hash[req_set_id] =
74
- unless req_set_file.nil?
75
- CSV.parse(Roo::Spreadsheet.open(req_set_file).sheet('Requirements').to_csv,
76
- headers: true).map do |row|
77
- row.to_h.slice(*INPUT_HEADERS)
78
- end
79
- end
80
- end
81
- end
82
-
83
- def new_requirements_csv
84
- @new_requirements_csv ||=
85
- CSV.generate(+"\xEF\xBB\xBF") do |csv| # start with an unnecessary BOM to make viewing in excel easier
86
- csv << REQUIREMENTS_OUTPUT_HEADERS
87
-
88
- input_requirement_sets.each do |req_set_id, input_rows|
89
- input_rows.each do |input_row| # NOTE: use row order from source file
90
- csv << REQUIREMENTS_OUTPUT_HEADERS.map do |header|
91
- header == 'Req Set' ? req_set_id : input_row[header] || input_row["#{header}*"]
92
- end
93
- end
94
- end
95
- end
96
- end
97
-
98
- def old_requirements_csv
99
- @old_requirements_csv ||= File.read(REQUIREMENTS_OUTPUT_FILE)
100
- end
101
-
102
- def new_planned_not_tested_csv
103
- @new_planned_not_tested_csv ||=
104
- CSV.generate(+"\xEF\xBB\xBF") do |csv| # start with an unnecessary BOM to make viewing in excel easier
105
- csv << PLANNED_NOT_TESTED_OUTPUT_HEADERS
106
-
107
- input_requirement_sets.each do |req_set_id, input_rows|
108
- input_rows.each do |row|
109
- if spreadsheet_value_falsy?(row['Verifiable?'])
110
- csv << [req_set_id, row['ID*'], 'Not Verifiable', row['Verifiability Details']]
111
- elsif spreadsheet_value_falsy?(row['Planning To Test?'])
112
- csv << [req_set_id, row['ID*'], 'Not Tested', row['Planning To Test Details']]
113
- end
114
- end
115
- end
116
- end
117
- end
118
-
119
- def old_planned_not_tested_csv
120
- @old_planned_not_tested_csv ||= File.read(PLANNED_NOT_TESTED_OUTPUT_FILE)
121
- end
122
-
123
- def run(input_directory)
124
- @input_directory = input_directory
125
- check_presence_of_input_files
126
-
127
- update_requirements =
128
- if File.exist?(REQUIREMENTS_OUTPUT_FILE)
129
- if old_requirements_csv == new_requirements_csv
130
- puts "'#{REQUIREMENTS_OUTPUT_FILE_NAME}' file is up to date."
131
- false
132
- else
133
- puts 'Requirements set has changed.'
134
- true
135
- end
136
- else
137
- puts "No existing #{REQUIREMENTS_OUTPUT_FILE_NAME}."
138
- true
139
- end
140
-
141
- if update_requirements
142
- puts "Writing to file #{REQUIREMENTS_OUTPUT_FILE}..."
143
- File.write(REQUIREMENTS_OUTPUT_FILE, new_requirements_csv, encoding: Encoding::UTF_8)
144
- end
145
-
146
- udpate_planned_not_tested =
147
- if File.exist?(PLANNED_NOT_TESTED_OUTPUT_FILE)
148
- if old_planned_not_tested_csv == new_planned_not_tested_csv
149
- puts "'#{PLANNED_NOT_TESTED_OUTPUT_FILE_NAME}' file is up to date."
150
- false
151
- else
152
- puts 'Planned Not Tested Requirements set has changed.'
153
- true
154
- end
155
- else
156
- puts "No existing #{PLANNED_NOT_TESTED_OUTPUT_FILE_NAME}."
157
- true
158
- end
159
-
160
- if udpate_planned_not_tested
161
- puts "Writing to file #{PLANNED_NOT_TESTED_OUTPUT_FILE}..."
162
- File.write(PLANNED_NOT_TESTED_OUTPUT_FILE, new_planned_not_tested_csv, encoding: Encoding::UTF_8)
163
- end
164
-
165
- puts 'Done.'
166
- end
167
-
168
- def run_check(input_directory)
169
- @input_directory = input_directory
170
- check_presence_of_input_files
171
-
172
- requirements_ok =
173
- if File.exist?(REQUIREMENTS_OUTPUT_FILE)
174
- if old_requirements_csv == new_requirements_csv
175
- puts "'#{REQUIREMENTS_OUTPUT_FILE_NAME}' file is up to date."
176
- true
177
- else
178
- puts "#{REQUIREMENTS_OUTPUT_FILE_NAME} file is out of date."
179
- false
180
- end
181
- else
182
- puts "No existing #{REQUIREMENTS_OUTPUT_FILE_NAME} file."
183
- false
184
- end
185
-
186
- planned_not_tested_requirements_ok =
187
- if File.exist?(PLANNED_NOT_TESTED_OUTPUT_FILE)
188
- if old_planned_not_tested_csv == new_planned_not_tested_csv
189
- puts "'#{PLANNED_NOT_TESTED_OUTPUT_FILE_NAME}' file is up to date."
190
- true
191
- else
192
- puts "#{PLANNED_NOT_TESTED_OUTPUT_FILE_NAME} file is out of date."
193
- false
194
- end
195
- else
196
- puts "No existing #{PLANNED_NOT_TESTED_OUTPUT_FILE_NAME} file."
197
- false
198
- end
199
-
200
- return if planned_not_tested_requirements_ok && requirements_ok
201
-
202
- puts <<~MESSAGE
203
- Check Failed. To resolve, run:
204
-
205
- bundle exec rake "requirements:collect[<input_directory>]"
206
-
207
- MESSAGE
208
- exit(1)
209
- end
210
-
211
- def check_presence_of_input_files
212
- input_requirement_sets.each do |req_set_id, rows|
213
- next unless rows.nil?
214
-
215
- puts %(
216
- Could not find input file for set #{req_set_id} in directory #{@input_directory}. Aborting requirements
217
- collection..."
218
- )
219
- exit(1)
220
- end
221
- end
222
-
223
- def spreadsheet_value_falsy?(str)
224
- %w[no false].include?(str&.downcase)
225
- end
226
- end
227
- end
228
- end