Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

QPPA-9223: PY24 Submissions Docs updates #316

Merged
merged 4 commits into from
Aug 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,073 changes: 1,596 additions & 1,477 deletions package-lock.json

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions src/app/components/app.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import '@testing-library/jest-dom';
import App from './app';
import LeftNav from './left-nav';
import { combinedRoutes } from '../routes';
import { ExternalLink } from '../../shared';

describe('App tests', () => {
afterAll(() => {
Expand All @@ -19,6 +20,19 @@ describe('App tests', () => {
);
});

it('should render external links properly with http urls and no protocol suffix', () => {
const renderAndCheckHref = (url: string, elementText: string, hrefContains: string) => {
const {getByText} = render(
<ExternalLink href={url} />
);
const linkElement = getByText(elementText);
expect(linkElement.getAttribute('href')).toContain(hrefContains);
};

renderAndCheckHref('http://sometest.com', 'sometest.com', 'http://');
renderAndCheckHref('sometestnohttp.com', 'sometestnohttp.com', 'sometestnohttp.com');
});

combinedRoutes.forEach((route) => {
it(`LeftNav should have a link for ${route.path}`, () => {
const {getByRole} = render(
Expand Down
2 changes: 1 addition & 1 deletion src/app/components/guides/advanced-tutorial.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { DocPageProps } from '../../../shared/types';
const AdvancedTutorial: React.FC<DocPageProps> = ({dataTestId}: DocPageProps) => {
return (
<div data-testid={dataTestId}>
<p className='qpp-docs-page-updated'>Last Updated: 08/31/2023</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<p className='qpp-docs-page-updated'>Last Updated: 08/28/2024</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<h2 className='ds-text-heading--2xl' style={{marginTop: 0}} id='advanced-tutorial'>Tutorial: Add and update data via API</h2>
<p>
In the <LinkToId to='/tutorial' text='first tutorial' /> we covered how to create a measurement set and retrieve the score in two different API requests. We're now going to build on the previous tutorial by adding another measure to the measurement set we created in the previous tutorial. All of these examples serve to illustrate how the Submissions API can make it easier to react to and fix issues that arise.
Expand Down
2 changes: 1 addition & 1 deletion src/app/components/guides/basic-tutorial.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { DocPageProps } from '../../../shared/types';
const BasicTutorial: React.FC<DocPageProps> = ({dataTestId}: DocPageProps) => {
return (
<div data-testid={dataTestId}>
<p className='qpp-docs-page-updated'>Last Updated: 08/31/2023</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<p className='qpp-docs-page-updated'>Last Updated: 08/28/2024</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<h2 className='ds-text-heading--2xl' style={{marginTop: 0}}>Tutorial: Create and Score Data via API</h2>
<p>
The Submissions API is an easy way to manage your performance data with CMS. Performance data is organized into submissions, which can have many measurements. Measurements within a submission are also grouped by category (e.g. quality) and submission method (e.g. registry) and program name (e.g. mips) into measurement sets.
Expand Down
36 changes: 18 additions & 18 deletions src/app/components/guides/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ export const steps: ISteps = {
}
}
],
"performanceStart": "2023-01-01",
"performanceEnd": "2023-12-31"
"performanceStart": "< performanceYearToBeReported >-01-01",
"performanceEnd": "< performanceYearToBeReported >-12-31"
}`,
},
{
Expand All @@ -38,8 +38,8 @@ export const steps: ISteps = {
"data": {
"measurementSet": {
"id": "086dad28-907a-4e88-af73-5c7ed2e6764e",
"createdAt": "2023-08-17T11:18:00Z",
"updatedAt": "2023-08-17T11:32:15Z",
"createdAt": "2024-08-17T11:18:00Z",
"updatedAt": "2024-08-17T11:32:15Z",
"submissionId": "086dad28-0477-4b41-8c05-77dd98d41d6f",
"category": "quality",
"submissionMethod": "registry",
Expand All @@ -52,8 +52,8 @@ export const steps: ISteps = {
"cehrtId": "",
"suppressed": false,
"source": null,
"performanceStart": "2023-01-01",
"performanceEnd": "2023-12-31",
"performanceStart": "< performanceYearToBeReported >-01-01",
"performanceEnd": "< performanceYearToBeReported >-12-31",
"measurements": [
{
"id": "086dad28-4bcb-4649-a4fd-04ad8426df77",
Expand Down Expand Up @@ -298,13 +298,13 @@ export const steps: ISteps = {
code: `{
"category": "quality",
"submissionMethod": "registry",
"performanceStart": "2023-01-01",
"performanceEnd": "2023-12-31",
"performanceStart": "< performanceYearToBeReported >-01-01",
"performanceEnd": "< performanceYearToBeReported >-12-31",
"programName": "mips",
"submission": {
"entityType": "group",
"taxpayerIdentificationNumber": "000000002",
"performanceYear": 2023
"performanceYear": "< performanceYearToBeReported >"
},
"measurements": [
{
Expand All @@ -328,8 +328,8 @@ export const steps: ISteps = {
"data": {
"measurementSet": {
"id": "086dad28-907a-4e88-af73-5c7ed2e6764e",
"createdAt": "2023-08-17T11:18:19Z",
"updatedAt": "2023-08-17T11:18:19Z",
"createdAt": "2024-08-17T11:18:19Z",
"updatedAt": "2024-08-17T11:18:19Z",
"submissionId": "086dad28-0477-4b41-8c05-77dd98d41d6f",
"category": "quality",
"submissionMethod": "registry",
Expand All @@ -342,8 +342,8 @@ export const steps: ISteps = {
"cehrtId": "",
"suppressed": false,
"source": null,
"performanceStart": "2023-01-01",
"performanceEnd": "2023-12-31",
"performanceStart": "< performanceYearToBeReported >-01-01",
"performanceEnd": "< performanceYearToBeReported >-12-31",
"measurements": [
{
"id": "086dad28-4bcb-4649-a4fd-04ad8426df77",
Expand Down Expand Up @@ -432,8 +432,8 @@ export const steps: ISteps = {
"toppedOut": false,
"isGhost": false,
"programName": "mips",
"performanceStart": "2023-01-01",
"performanceEnd": "2023-12-31",
"performanceStart": "< performanceYearToBeReported >-01-01",
"performanceEnd": "< performanceYearToBeReported >-12-31",
"isCpcPlus": false,
"isPcf": false,
"skippedDuplicate": false,
Expand Down Expand Up @@ -633,10 +633,10 @@ export const apiExamples: IApiExamples = {
row: ['Submission Method', 'Registry'],
},
{
row: ['Performance Start', '2023-01-01'],
row: ['Performance Start', '2024-01-01'],
},
{
row: ['Performance End', '2023-12-31'],
row: ['Performance End', '2024-12-31'],
},
{
row: ['Measurements'],
Expand Down Expand Up @@ -674,7 +674,7 @@ export const apiExamples: IApiExamples = {
row: ['Taxpayer Identification Number', '000000002'],
},
{
row: ['Performance Year', '2023'],
row: ['Performance Year', '2024'],
},
],
},
Expand Down
7 changes: 4 additions & 3 deletions src/app/components/references/benchmarks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,19 @@ import { DocPageProps } from '../../../shared/types';
const Benchmarks: React.FC<DocPageProps> = ({dataTestId}: DocPageProps) => {
return (
<div data-testid={dataTestId}>
<p className='qpp-docs-page-updated'>Last Updated: 08/31/2023</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<p className='qpp-docs-page-updated'>Last Updated: 08/28/2024</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<h2 className='ds-text-heading--2xl' style={{marginTop: 0}} id='current-benchmarks'>Benchmarks</h2>
<p className='ds-text--lead'>
Benchmarks serve as the reference points for measurements and are used to score submissions. Each benchmark is unique based upon its combination of measureId, submissionMethod, and performanceYear, and each has a list of 9 data points.
</p>
<p>
Please see the <ExternalLink href={`${envConfig.amazoneawsUrl}/uploads/2272/2023%20Quality%20Benchmarks.zip`}
text='2023 Merit-based Incentive Payment System (MIPS) Quality Measure Benchmarks Overview' /> for more information on MIPS Quality Benchmarks.
Please see the <ExternalLink href={`${envConfig.amazoneawsUrl}/uploads/2671/2024BenchmarksUserGuide.pdf`}
text='2024 Quality Benchmarks User Guide with Scoring Examples' /> for more information on MIPS Quality Benchmarks.
</p>
<p>
You can view the benchmarks for a Performance Year using the publicly accessible <ExternalLink href={`${envConfig.qppCmsPreviewUrl}/api/submissions/public/docs/#/Public%20Endpoints/listBenchmarks`} text='benchmarks endpoint' />.
</p>
<br />
<CodeTab data={benchmarksTabs.fields} />
<DataModelTable data={benchmarksFields.fields} />

Expand Down
16 changes: 10 additions & 6 deletions src/app/components/references/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -360,8 +360,8 @@ export const submissionsFields: IFields = {
{ name: 'id', value: 'string', description: 'The id of the submission.', notes: ' ' },
{ name: 'createdAt', value: 'datetime', description: 'The creation time of the submission in <a href="https://www.ietf.org/rfc/rfc3339.txt">RFC 3339</a> format.', notes: ' ' },
{ name: 'updatedAt', value: 'datetime', description: 'The modification time of the submission in <a href="https://www.ietf.org/rfc/rfc3339.txt">RFC 3339</a> format.', notes: ' ' },
{ name: 'entityType', value: 'string', description: 'Acceptable values are <b>"apm"</b>, <b>"group"</b>, <b>"individual"</b>, <b>"virtualGroup"</b>', notes: 'writable, required' },
{ name: 'entityId', value: 'string', description: 'The unique identifier for the virtual group or APM associated with the submission.', notes: 'writable, required if entityType is "apm" or "virtualGroup" ' },
{ name: 'entityType', value: 'string', description: 'Acceptable values are <b>"apm"</b>, <b>"group"</b>, <b>"individual"</b>, <b>"virtualGroup"</b> <b>"subgroup"</b>', notes: 'writable, required' },
{ name: 'entityId', value: 'string', description: 'The unique identifier for the virtual group, subgroup or APM associated with the submission.', notes: 'writable, required if entityType is "apm", "virtualGroup" or "subgroup"' },
{ name: 'taxpayerIdentificationNumber', value: 'string', description: 'The 9-digit identifier of the provider associated with the submission.', notes: 'writable if entityType is "individual" or "group"' },
{ name: 'nationalProviderIdentifier', value: 'string', description: 'The 10-digit identifier of the provider associated with the submission.', notes: 'writable only if entityType is "individual"' },
{ name: 'performanceYear', value: 'integer', description: 'The year in which performance data for the submission was collected.', notes: 'writable, required' },
Expand Down Expand Up @@ -392,11 +392,13 @@ export const benchmarksFields: IFields = {
fields: [
{ name: 'benchmarkYear', value: 'integer', description: 'The performance year\'s data from which the benchmark deciles are calculated. ', notes: ' ' },
{ name: 'performanceYear', value: 'integer', description: 'The year in which the benchmark applies. ', notes: ' ' },
{ name: 'percentiles', value: 'object', description: 'List of values for the 1st through 99th percentiles.', notes: ' ' },
{ name: 'metricType', value: 'string', description: 'Indicates the type of measurement. ', notes: ' ' },
{ name: 'status', value: 'string', description: 'Indicates if the benchmark is based on historical data, current performance period data, or if there was insufficient data to calculate a benchmark.', notes: ' ' },
{ name: 'isInverse', value: 'boolean', description: 'Indicates if better performance is indicated by a lower performance rate. ', notes: ' ' },
{ name: 'isToppedOut', value: 'boolean', description: 'Indicates if the benchmark is topped out for the current Performance Year ', notes: ' ' },
{ name: 'isToppedOutByProgram', value: 'boolean', description: 'Indicates if the benchmark is topped out for 2 consecutive years. This results in a 7 point cap applied to the measure for scoring. ', notes: ' ' },
{ name: 'isHighPriority', value: 'boolean', description: 'Indicates the measure is a high priority measure within the program. ', notes: ' ' },
{ name: 'percentiles', value: 'object', description: 'List of values for the 1st through 99th percentiles.', notes: ' ' },
{ name: 'submissionMethod', value: 'string', description: 'The submissionMethod for which the benchmark is applicable. ', notes: ' ' },
{ name: 'measureId', value: 'string', description: 'The id of the measurement. ', notes: ' ' },
],
Expand All @@ -408,14 +410,16 @@ export const benchmarksTabs: ITabs = {
tab: 'Sample JSON',
code: `{
"benchmarkYear": 2021,
"performanceYear": 2023,
"percentiles": {...},
"performanceYear": 2024,
"metricType": "singlePerformanceRate",
"status": "historical",
"isInverse": true,
"isToppedOut": false,
"isToppedOutByProgram": false,
"isHighPriority": true,
"percentiles": {...},
"submissionMethod": "registry",
"measureId": "001"
"measureId": "001",
}`,
},
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
"entityType": "individual",
"taxpayerIdentificationNumber": "000456789",
"nationalProviderIdentifier": "9876543210",
"performanceYear": 2023,
"performanceYear": "< performanceYearToBeReported >",
"measurementSets": [{
"category": "pi",
"submissionMethod": "electronicHealthRecord",
"performanceStart": "2023-01-01",
"performanceEnd": "2023-12-31",
"cehrtId": "XX15EXXXXXXXXXX",
"performanceStart": "< performanceYearToBeReported >-01-01",
"performanceEnd": "< performanceYearToBeReported >-12-31",
"cehrtId": "XX15CXXXXXXXXXX",
"measurements": [{
"measureId": "PI_INFBLO_1",
"value": true
Expand Down
6 changes: 3 additions & 3 deletions src/app/components/references/json/submission-example-ia.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
"entityType": "individual",
"taxpayerIdentificationNumber": "000456789",
"nationalProviderIdentifier": "9876543210",
"performanceYear": 2023,
"performanceYear": "< performanceYearToBeReported >",
"measurementSets": [
{
"category": "ia",
"submissionMethod": "registry",
"performanceStart": "2023-01-01",
"performanceEnd": "2023-06-01",
"performanceStart": "< performanceYearToBeReported >-01-01",
"performanceEnd": "< performanceYearToBeReported >-06-01",
"measurements": [
{
"measureId": "IA_EPA_4",
Expand Down
22 changes: 7 additions & 15 deletions src/app/components/references/json/submission-example-quality.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,37 @@
"entityType": "individual",
"taxpayerIdentificationNumber": "000456789",
"nationalProviderIdentifier": "9876543210",
"performanceYear": 2023,
"performanceYear": "< performanceYearToBeReported >",
"measurementSets": [{
"category": "quality",
"submissionMethod": "registry",
"performanceStart": "2023-01-01",
"performanceEnd": "2023-12-31",
"performanceStart": "< performanceYearToBeReported >-01-01",
"performanceEnd": "< performanceYearToBeReported >-12-31",
"measurements": [{
"measureId": "226",
"measureId": "305",
"value": {
"strata": [{
"eligiblePopulationExclusion": 0,
"eligiblePopulation": 60,
"performanceMet": 47,
"eligiblePopulationException": 0,
"performanceNotMet": 13,
"stratum": "screenedForUse"
"stratum": "14days"
},
{
"eligiblePopulationExclusion": 0,
"eligiblePopulation": 147,
"performanceMet": 121,
"eligiblePopulationException": 0,
"performanceNotMet": 26,
"stratum": "overall"
},
{
"eligiblePopulationExclusion": 0,
"eligiblePopulation": 86,
"performanceMet": 73,
"eligiblePopulationException": 0,
"performanceNotMet": 13,
"stratum": "tobacco"
"stratum": "34days"
}
],
"isEndToEndReported": true
}
},
{
"measureId": "112",
"measureId": "102",
"value": {
"eligiblePopulationExclusion": 0,
"eligiblePopulation": 562,
Expand Down
7 changes: 3 additions & 4 deletions src/app/components/references/scoring.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const textAndId: ITextAndId = {
const Scoring: React.FC<DocPageProps> = ({dataTestId}: DocPageProps) => {
return (
<div data-testid={dataTestId}>
<p className='qpp-docs-page-updated'>Last Updated: 08/31/2023</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<p className='qpp-docs-page-updated'>Last Updated: 08/28/2024</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<h2 className='ds-text-heading--2xl' style={{marginTop: 0}}>Scoring</h2>
<p className='ds-text--lead'>
The scoring engine is responsible for interpreting submissions and outputting a score. Each category score is utilized to create the QPP score object.
Expand Down Expand Up @@ -94,10 +94,9 @@ const Scoring: React.FC<DocPageProps> = ({dataTestId}: DocPageProps) => {
<ul>
<li>Utilization of 2015 CEHRT and the reporting of the corresponding CMS CEHRT ID in the submission</li>
<ul>
<li>XX15EXXXXXXXXXX</li>
<li>XX15CXXXXXXXXXX</li>
</ul>
<li>Minimum 90 day performance period</li>
<li>Minimum 180 day performance period</li>
<li>Completion of Required Attestation Statements</li>
<li>Completion of All Required Measures</li>
<li>Bonus Measures</li>
Expand Down Expand Up @@ -146,7 +145,7 @@ const Scoring: React.FC<DocPageProps> = ({dataTestId}: DocPageProps) => {
</li>
</ul>
<p className='ds-text--lead'>
In the sample below, measure 226 is a multi-strata, 110 is a single performance measure, ACRAD15 is a non-proportion measure.
In the sample below, measure 305 is a multi-strata performance measure, 102 is a single performance measure, ACRAD15 is a non-proportion measure.
</p>
<CodeTab data={scoringData.submissionJsonExampleStringQuality} />

Expand Down
2 changes: 1 addition & 1 deletion src/app/components/references/submissions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { DocPageProps } from '../../../shared/types';
const Submissions: React.FC<DocPageProps> = ({dataTestId}: DocPageProps) => {
return (
<div data-testid={dataTestId}>
<p className='qpp-docs-page-updated'>Last Updated: 08/31/2022</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<p className='qpp-docs-page-updated'>Last Updated: 08/28/2024</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<h2 className='ds-text-heading--2xl' style={{marginTop: 0}}>Submissions</h2>
<p className='ds-text--lead'>
The Submissions resource represents one year of performance data for a given individual or group. Submissions contain MeasurementSets which can be accessed both via Submissions methods and MeasurementSets methods.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,12 @@ const tableData1 = {
</ul>
`,
'How do I report SubGroups?': `SubGroups are available for testing in DevPre as of 9/29/23. See the tutorial here <a href='https://cmsgov.github.io/qpp-developer-preview-docs/tutorial-subgroup-submissions' target='_blank' rel='noopener noreferrer'>QPP Developer Preview Documentation</a>`,
'Score-preview endpoint returns a score for a MVP submission for a non-MVP registered entity.': 'Resolved as of 09/12/2023',
};

const FrequentlyAskedQuestions: React.FC<DocPageProps> = ({dataTestId}: DocPageProps) => {
return (
<div data-testid={dataTestId}>
<p className='qpp-docs-page-updated'>Last Updated: 09/29/2023</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<p className='qpp-docs-page-updated'>Last Updated: 08/28/2024</p> {/* IMPORTANT: update this Last-Updated value if you have made any changes to this page's content. */}
<h2 className='ds-text-heading--2xl' style={{marginTop: 0}}>Frequently Asked Questions</h2>

<h3 className='ds-text-heading--xl'>General and Developer Preview</h3>
Expand All @@ -61,7 +60,7 @@ const FrequentlyAskedQuestions: React.FC<DocPageProps> = ({dataTestId}: DocPageP
)}
</tbody>
</table>
<h3 className='ds-text-heading--xl'>PY23 Questions and Known Issues</h3>
<h3 className='ds-text-heading--xl'>PY24 Questions and Known Issues</h3>
<table className='ds-c-table ds-u-font-size--small faq-table'>
<thead>
<tr>
Expand Down
Loading
Loading