diff --git a/.github/workflows/sechub-jira-sync.yml b/.github/workflows/sechub-jira-sync.yml index c3a6ca5ebb..402617238e 100644 --- a/.github/workflows/sechub-jira-sync.yml +++ b/.github/workflows/sechub-jira-sync.yml @@ -25,7 +25,7 @@ jobs: stage-name: prod - name: Sync Security Hub and Jira - uses: Enterprise-CMCS/mac-fc-security-hub-visibility@v2.0.1 + uses: Enterprise-CMCS/mac-fc-security-hub-visibility@v2.0.2 with: jira-token: ${{ secrets.JIRA_TOKEN }} jira-username: ${{ secrets.JIRA_USERNAME }} diff --git a/docs/technical-design/howto-update-state-programs.md b/docs/technical-design/howto-update-state-programs.md index 08b4adfefd..3da740b4bb 100644 --- a/docs/technical-design/howto-update-state-programs.md +++ b/docs/technical-design/howto-update-state-programs.md @@ -13,4 +13,4 @@ The source of truth for that file comes from a CSV maintained by product and des 2. Run the script following the command listed in the `import-programs.ts`. This will overwrite existing state programs JSON with the new output. Your usage of the script will likely look something like this: `cd scripts && yarn tsc && node import-programs.js path/to/data.csv > ../services/app-web/src/common-code/data/statePrograms.json` 3. Double check the diff. It's important not to delete any programs that have already been used for a submission because although programs are not in the database, we still store references to the program ID in postgres as if they are stable. Also, we want to be sure we are only changing programs expected to change. 4. For any newly created programs, manually populate the `id` field using a UUID generator -5. Make a PR to update the statePrograms file in the codebase \ No newline at end of file +5. Make a PR to update the statePrograms file in the codebase diff --git a/scripts/import-programs.ts b/scripts/import-programs.ts index 2162bd5faf..36f93b77b8 100644 --- a/scripts/import-programs.ts +++ b/scripts/import-programs.ts @@ -20,6 +20,7 @@ https://github.com/Enterprise-CMCS/managed-care-review/blob/main/docs/technical- import csv from 'csv-parser' import fs from 'fs' +import { v4 as uuidv4 } from 'uuid' const stateNames = { AL: 'Alabama', @@ -135,7 +136,7 @@ fs.createReadStream(file) } states[code]!.programs.push({ - id: data.id, + id: !data.id ? uuidv4() : data.id, fullName: data.Program, name: data.Nickname, isRateProgram: data.IsRateProgram === 'TRUE' diff --git a/services/app-api/src/domain-models/ProgramType.ts b/services/app-api/src/domain-models/ProgramType.ts index 581bba2c8b..52be9d64a8 100644 --- a/services/app-api/src/domain-models/ProgramType.ts +++ b/services/app-api/src/domain-models/ProgramType.ts @@ -2,4 +2,5 @@ export type ProgramType = { id: string name: string fullName: string + isRateProgram: boolean } diff --git a/services/app-api/src/emailer/templateHelpers.test.ts b/services/app-api/src/emailer/templateHelpers.test.ts index ef73a62e21..67b646154e 100644 --- a/services/app-api/src/emailer/templateHelpers.test.ts +++ b/services/app-api/src/emailer/templateHelpers.test.ts @@ -228,6 +228,7 @@ describe('findContractPrograms', () => { id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', name: 'CHIP', fullName: 'MN CHIP', + isRateProgram: false, }, ] @@ -243,6 +244,7 @@ describe('findContractPrograms', () => { id: 'unmatched-id', name: 'CHIP', fullName: 'MN CHIP', + isRateProgram: false, }, ] diff --git a/services/app-api/src/testHelpers/emailerHelpers.ts b/services/app-api/src/testHelpers/emailerHelpers.ts index d012f5d698..4b57697707 100644 --- a/services/app-api/src/testHelpers/emailerHelpers.ts +++ b/services/app-api/src/testHelpers/emailerHelpers.ts @@ -86,21 +86,25 @@ export function mockMNState(): State { id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', fullName: 'Special Needs Basic Care', name: 'SNBC', + isRateProgram: false, }, { id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', fullName: 'Prepaid Medical Assistance Program', name: 'PMAP', + isRateProgram: false, }, { id: 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', fullName: 'Minnesota Senior Care Plus ', name: 'MSC+', + isRateProgram: false, }, { id: '3fd36500-bf2c-47bc-80e8-e7aa417184c5', fullName: 'Minnesota Senior Health Options', name: 'MSHO', + isRateProgram: false, }, ], code: 'MN', @@ -115,11 +119,13 @@ export function mockMSState(): State { id: 'e0819153-5894-4153-937e-aad00ab01a8f', fullName: 'Mississippi Coordinated Access Network', name: 'MSCAN', + isRateProgram: false, }, { id: '36c54daf-7611-4a15-8c3b-cdeb3fd7e25a', fullName: 'CHIP', name: 'CHIP', + isRateProgram: false, }, ], code: 'MS', diff --git a/services/app-api/src/testHelpers/gqlHelpers.ts b/services/app-api/src/testHelpers/gqlHelpers.ts index a775bfe2c0..2c5c168a2a 100644 --- a/services/app-api/src/testHelpers/gqlHelpers.ts +++ b/services/app-api/src/testHelpers/gqlHelpers.ts @@ -53,6 +53,7 @@ function defaultFloridaProgram(): ProgramType { id: '5c10fe9f-bec9-416f-a20c-718b152ad633', name: 'MMA', fullName: 'Managed Medical Assistance Program ', + isRateProgram: false, } } @@ -61,6 +62,7 @@ function defaultFloridaRateProgram(): ProgramType { id: '3b8d8fa1-1fa6-4504-9c5b-ef522877fe1e', fullName: 'Long-term Care Program', name: 'LTC', + isRateProgram: false, } } diff --git a/services/app-graphql/src/mutations/createHealthPlanPackage.graphql b/services/app-graphql/src/mutations/createHealthPlanPackage.graphql index 991dfffea5..3a9f7040f9 100644 --- a/services/app-graphql/src/mutations/createHealthPlanPackage.graphql +++ b/services/app-graphql/src/mutations/createHealthPlanPackage.graphql @@ -11,6 +11,7 @@ mutation createHealthPlanPackage($input: CreateHealthPlanPackageInput!) { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/mutations/createQuestionResponse.graphql b/services/app-graphql/src/mutations/createQuestionResponse.graphql index 3b12555e21..d90fe06082 100644 --- a/services/app-graphql/src/mutations/createQuestionResponse.graphql +++ b/services/app-graphql/src/mutations/createQuestionResponse.graphql @@ -38,6 +38,7 @@ mutation createQuestionResponse($input: CreateQuestionResponseInput!) { id name fullName + isRateProgram } } } diff --git a/services/app-graphql/src/mutations/submitContract.graphql b/services/app-graphql/src/mutations/submitContract.graphql index d2094c2b5c..213904b55f 100644 --- a/services/app-graphql/src/mutations/submitContract.graphql +++ b/services/app-graphql/src/mutations/submitContract.graphql @@ -41,6 +41,7 @@ fragment contractFields on Contract { id name fullName + isRateProgram } } @@ -61,6 +62,7 @@ fragment rateFields on Rate { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/mutations/submitRate.graphql b/services/app-graphql/src/mutations/submitRate.graphql index 3ccd5ec675..0eb43ca2fb 100644 --- a/services/app-graphql/src/mutations/submitRate.graphql +++ b/services/app-graphql/src/mutations/submitRate.graphql @@ -13,6 +13,7 @@ mutation submitRate($input: SubmitRateInput!) { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/mutations/unlockHealthPlanPackage.graphql b/services/app-graphql/src/mutations/unlockHealthPlanPackage.graphql index 5bbe7a0cbc..4e3144f3a4 100644 --- a/services/app-graphql/src/mutations/unlockHealthPlanPackage.graphql +++ b/services/app-graphql/src/mutations/unlockHealthPlanPackage.graphql @@ -10,6 +10,7 @@ mutation unlockHealthPlanPackage($input: UnlockHealthPlanPackageInput!) { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/mutations/unlockRate.graphql b/services/app-graphql/src/mutations/unlockRate.graphql index e3961bc83e..d4cad2ed8b 100644 --- a/services/app-graphql/src/mutations/unlockRate.graphql +++ b/services/app-graphql/src/mutations/unlockRate.graphql @@ -142,6 +142,7 @@ mutation unlockRate($input: UnlockRateInput!) { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/mutations/updateCMSUser.graphql b/services/app-graphql/src/mutations/updateCMSUser.graphql index ff27b3cf00..d3712cee5f 100644 --- a/services/app-graphql/src/mutations/updateCMSUser.graphql +++ b/services/app-graphql/src/mutations/updateCMSUser.graphql @@ -15,6 +15,7 @@ mutation updateCMSUser($input: UpdateCMSUserInput!) { id name fullName + isRateProgram } } divisionAssignment diff --git a/services/app-graphql/src/mutations/updateContract.graphql b/services/app-graphql/src/mutations/updateContract.graphql index c4b58ed3bb..99e18861b9 100644 --- a/services/app-graphql/src/mutations/updateContract.graphql +++ b/services/app-graphql/src/mutations/updateContract.graphql @@ -11,6 +11,7 @@ mutation updateContract($input: UpdateContractInput!) { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/mutations/updateHealthPlanFormData.graphql b/services/app-graphql/src/mutations/updateHealthPlanFormData.graphql index c818d9df08..efff6a99bf 100644 --- a/services/app-graphql/src/mutations/updateHealthPlanFormData.graphql +++ b/services/app-graphql/src/mutations/updateHealthPlanFormData.graphql @@ -10,6 +10,7 @@ mutation updateHealthPlanFormData($input: UpdateHealthPlanFormDataInput!) { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/queries/fetchContract.graphql b/services/app-graphql/src/queries/fetchContract.graphql index 05b69251c7..39ecfa9fa1 100644 --- a/services/app-graphql/src/queries/fetchContract.graphql +++ b/services/app-graphql/src/queries/fetchContract.graphql @@ -41,6 +41,7 @@ fragment contractFieldsFetchContract on Contract { id name fullName + isRateProgram } } @@ -61,6 +62,7 @@ fragment rateFields on Rate { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/queries/fetchCurrentUser.graphql b/services/app-graphql/src/queries/fetchCurrentUser.graphql index abd7ebe90c..b17514ad11 100644 --- a/services/app-graphql/src/queries/fetchCurrentUser.graphql +++ b/services/app-graphql/src/queries/fetchCurrentUser.graphql @@ -13,6 +13,7 @@ query fetchCurrentUser { id name fullName + isRateProgram } } divisionAssignment @@ -30,6 +31,7 @@ query fetchCurrentUser { id name fullName + isRateProgram } } } diff --git a/services/app-graphql/src/queries/fetchHealthPlanPackage.graphql b/services/app-graphql/src/queries/fetchHealthPlanPackage.graphql index 41d397c62d..eea4b4a171 100644 --- a/services/app-graphql/src/queries/fetchHealthPlanPackage.graphql +++ b/services/app-graphql/src/queries/fetchHealthPlanPackage.graphql @@ -10,6 +10,7 @@ query fetchHealthPlanPackage($input: FetchHealthPlanPackageInput!) { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/queries/fetchHealthPlanPackageWithQuestions.graphql b/services/app-graphql/src/queries/fetchHealthPlanPackageWithQuestions.graphql index 340c3222ea..439970bd2f 100644 --- a/services/app-graphql/src/queries/fetchHealthPlanPackageWithQuestions.graphql +++ b/services/app-graphql/src/queries/fetchHealthPlanPackageWithQuestions.graphql @@ -17,6 +17,7 @@ fragment questionEdgeFragment on QuestionEdge { id name fullName + isRateProgram } } } @@ -42,6 +43,7 @@ fragment questionEdgeFragment on QuestionEdge { id name fullName + isRateProgram } } } @@ -68,6 +70,7 @@ query fetchHealthPlanPackageWithQuestions($input: FetchHealthPlanPackageInput!) id name fullName + isRateProgram } } revisions { diff --git a/services/app-graphql/src/queries/fetchRate.graphql b/services/app-graphql/src/queries/fetchRate.graphql index 39ae183430..7ff5ac6a1a 100644 --- a/services/app-graphql/src/queries/fetchRate.graphql +++ b/services/app-graphql/src/queries/fetchRate.graphql @@ -142,6 +142,7 @@ fragment rateFields on Rate { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/queries/indexHealthPlanPackages.graphql b/services/app-graphql/src/queries/indexHealthPlanPackages.graphql index 2fa132bd6e..a96a4251bc 100644 --- a/services/app-graphql/src/queries/indexHealthPlanPackages.graphql +++ b/services/app-graphql/src/queries/indexHealthPlanPackages.graphql @@ -13,6 +13,7 @@ query indexHealthPlanPackages { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/queries/indexQuestions.graphql b/services/app-graphql/src/queries/indexQuestions.graphql index 4ed303bae9..b0418528c9 100644 --- a/services/app-graphql/src/queries/indexQuestions.graphql +++ b/services/app-graphql/src/queries/indexQuestions.graphql @@ -17,6 +17,7 @@ fragment questionEdgeFragment on QuestionEdge { id name fullName + isRateProgram } } } @@ -42,6 +43,7 @@ fragment questionEdgeFragment on QuestionEdge { id name fullName + isRateProgram } } } diff --git a/services/app-graphql/src/queries/indexRates.graphql b/services/app-graphql/src/queries/indexRates.graphql index 1772fa2fca..feb452e111 100644 --- a/services/app-graphql/src/queries/indexRates.graphql +++ b/services/app-graphql/src/queries/indexRates.graphql @@ -15,6 +15,7 @@ query indexRates { id name fullName + isRateProgram } } status diff --git a/services/app-graphql/src/queries/indexUsers.graphql b/services/app-graphql/src/queries/indexUsers.graphql index 34d1f37c58..2479418fb5 100644 --- a/services/app-graphql/src/queries/indexUsers.graphql +++ b/services/app-graphql/src/queries/indexUsers.graphql @@ -16,6 +16,7 @@ query indexUsers { id name fullName + isRateProgram } } divisionAssignment @@ -33,6 +34,7 @@ query indexUsers { id name fullName + isRateProgram } } } diff --git a/services/app-graphql/src/schema.graphql b/services/app-graphql/src/schema.graphql index f9e455e9dd..a9ea718b7f 100644 --- a/services/app-graphql/src/schema.graphql +++ b/services/app-graphql/src/schema.graphql @@ -666,6 +666,8 @@ type Program { name: String! "The full name for the program" fullName: String! + "Specifies if a program relates to a rate rather than a contract" + isRateProgram: Boolean! } """ diff --git a/services/app-web/src/common-code/healthPlanFormDataMocks/healthPlanFormData.ts b/services/app-web/src/common-code/healthPlanFormDataMocks/healthPlanFormData.ts index b0e4546a60..d84ec63e83 100644 --- a/services/app-web/src/common-code/healthPlanFormDataMocks/healthPlanFormData.ts +++ b/services/app-web/src/common-code/healthPlanFormDataMocks/healthPlanFormData.ts @@ -17,21 +17,25 @@ export function mockMNState(): State { id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', fullName: 'Special Needs Basic Care', name: 'SNBC', + isRateProgram: false, }, { id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', fullName: 'Prepaid Medical Assistance Program', name: 'PMAP', + isRateProgram: false, }, { id: 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', fullName: 'Minnesota Senior Care Plus ', name: 'MSC+', + isRateProgram: false, }, { id: '3fd36500-bf2c-47bc-80e8-e7aa417184c5', fullName: 'Minnesota Senior Health Options', name: 'MSHO', + isRateProgram: false }, ], code: 'MN', diff --git a/services/app-web/src/common-code/healthPlanFormDataType/State.ts b/services/app-web/src/common-code/healthPlanFormDataType/State.ts index db3c93163e..f3d25891cf 100644 --- a/services/app-web/src/common-code/healthPlanFormDataType/State.ts +++ b/services/app-web/src/common-code/healthPlanFormDataType/State.ts @@ -8,6 +8,7 @@ interface ProgramArgType { id: string name: string // short name. This is used most often in the application including in submission name fullName: string // full name is used in submission summary page + isRateProgram: boolean // specifies if program relates to rates rather than contract } export type { StateType, ProgramArgType } diff --git a/services/app-web/src/components/ChangeHistory/ChangeHistory.test.tsx b/services/app-web/src/components/ChangeHistory/ChangeHistory.test.tsx index 25cebdcb15..77021a1ee8 100644 --- a/services/app-web/src/components/ChangeHistory/ChangeHistory.test.tsx +++ b/services/app-web/src/components/ChangeHistory/ChangeHistory.test.tsx @@ -14,6 +14,7 @@ const submissionData: HealthPlanPackage = { id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', fullName: 'Prepaid Medical Assistance Program', name: 'PMAP', + isRateProgram: false, }, ], }, diff --git a/services/app-web/src/components/Header/PageHeadingRow/PageHeadingRow.test.tsx b/services/app-web/src/components/Header/PageHeadingRow/PageHeadingRow.test.tsx index e94dcf94d5..6059678588 100644 --- a/services/app-web/src/components/Header/PageHeadingRow/PageHeadingRow.test.tsx +++ b/services/app-web/src/components/Header/PageHeadingRow/PageHeadingRow.test.tsx @@ -14,21 +14,25 @@ describe('Page Heading Row', () => { id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', fullName: 'Special Needs Basic Care', name: 'SNBC', + isRateProgram: false, }, { id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', fullName: 'Prepaid Medical Assistance Program', name: 'PMAP', + isRateProgram: false, }, { id: 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', fullName: 'Minnesota Senior Care Plus ', name: 'MSC+', + isRateProgram: false, }, { id: '3fd36500-bf2c-47bc-80e8-e7aa417184c5', fullName: 'Minnesota Senior Health Options', name: 'MSHO', + isRateProgram: false, }, ], }, diff --git a/services/app-web/src/components/HealthPlanPackageTable/HealthPlanPackageTable.stories.tsx b/services/app-web/src/components/HealthPlanPackageTable/HealthPlanPackageTable.stories.tsx index 2ae1454442..41665e58f4 100644 --- a/services/app-web/src/components/HealthPlanPackageTable/HealthPlanPackageTable.stories.tsx +++ b/services/app-web/src/components/HealthPlanPackageTable/HealthPlanPackageTable.stories.tsx @@ -17,6 +17,7 @@ const tableData: PackageInDashboardType[] = [ id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', name: 'PMAP', fullName: 'Prepaid Medical Assistance Program', + isRateProgram: false, }, ], submittedAt: '2022-12-05', @@ -34,6 +35,7 @@ const tableData: PackageInDashboardType[] = [ id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', name: 'PMAP', fullName: 'Prepaid Medical Assistance Program', + isRateProgram: false, }, ], submittedAt: '2022-11-05', @@ -51,6 +53,7 @@ const tableData: PackageInDashboardType[] = [ id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', name: 'PMAP', fullName: 'Prepaid Medical Assistance Program', + isRateProgram: false, }, ], submittedAt: '2022-10-05', @@ -68,6 +71,7 @@ const tableData: PackageInDashboardType[] = [ id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', name: 'PMAP', fullName: 'Prepaid Medical Assistance Program', + isRateProgram: false, }, ], submittedAt: '2022-09-05', diff --git a/services/app-web/src/components/HealthPlanPackageTable/HealthPlanPackageTable.test.tsx b/services/app-web/src/components/HealthPlanPackageTable/HealthPlanPackageTable.test.tsx index d60fa6b23b..47ebd9d9d5 100644 --- a/services/app-web/src/components/HealthPlanPackageTable/HealthPlanPackageTable.test.tsx +++ b/services/app-web/src/components/HealthPlanPackageTable/HealthPlanPackageTable.test.tsx @@ -19,6 +19,7 @@ const submissions: PackageInDashboardType[] = [ id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', name: 'PMAP', fullName: 'Prepaid Medical Assistance Program', + isRateProgram: false, }, ], submittedAt: '2022-09-05', @@ -36,6 +37,7 @@ const submissions: PackageInDashboardType[] = [ id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', name: 'PMAP', fullName: 'Prepaid Medical Assistance Program', + isRateProgram: false, }, ], submittedAt: '2022-12-05', @@ -53,18 +55,21 @@ const submissions: PackageInDashboardType[] = [ id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', fullName: 'Special Needs Basic Care', name: 'SNBC', + isRateProgram: false, }, { __typename: 'Program', id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', name: 'PMAP', fullName: 'Prepaid Medical Assistance Program', + isRateProgram: false, }, { __typename: 'Program', id: 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', fullName: 'Minnesota Senior Care Plus ', name: 'MSC+', + isRateProgram: false, }, ], submittedAt: '2022-11-05', @@ -82,6 +87,7 @@ const submissions: PackageInDashboardType[] = [ id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', name: 'PMAP', fullName: 'Prepaid Medical Assistance Program', + isRateProgram: false, }, ], submittedAt: '2022-10-05', diff --git a/services/app-web/src/components/Select/ProgramSelect/ProgramSelect.test.tsx b/services/app-web/src/components/Select/ProgramSelect/ProgramSelect.test.tsx index d74633c368..82cabfb22f 100644 --- a/services/app-web/src/components/Select/ProgramSelect/ProgramSelect.test.tsx +++ b/services/app-web/src/components/Select/ProgramSelect/ProgramSelect.test.tsx @@ -50,7 +50,7 @@ describe('ProgramSelect', () => { jest.spyOn(useStatePrograms, 'useStatePrograms').mockRestore() }) - it('displays program options', async () => { + it('displays program with all options', async () => { renderWithProviders( { await waitFor(() => { expect(screen.getByText('MSHO')).toBeInTheDocument() expect(screen.getByText('SNBC')).toBeInTheDocument() + expect(screen.getByText('SNBC Rate Program')).toBeInTheDocument() expect(screen.getByText('PMAP')).toBeInTheDocument() + expect(screen.getByText('PMAP Rate Program')).toBeInTheDocument() expect(screen.getByText('MSC+')).toBeInTheDocument() }) }) + + it('displays program with only contract program options', async () => { + renderWithProviders( + , + { + apolloProvider: { + mocks: [ + fetchCurrentUserMock({ + statusCode: 200, + }), + ], + }, + } + ) + const combobox = await screen.findByRole('combobox') + + await selectEvent.openMenu(combobox) + + await waitFor(() => { + expect(screen.getByText('MSHO')).toBeInTheDocument() + expect(screen.getByText('SNBC')).toBeInTheDocument() + expect( + screen.queryByText('SNBC Rate Program') + ).not.toBeInTheDocument() + expect(screen.getByText('PMAP')).toBeInTheDocument() + expect( + screen.queryByText('PMAP Rate Program') + ).not.toBeInTheDocument() + expect(screen.getByText('MSC+')).toBeInTheDocument() + }) + }) + it('can select and return programs in an array', async () => { renderWithProviders( { await waitFor(() => { expect(screen.getByText('MSHO')).toBeInTheDocument() expect(screen.getByText('SNBC')).toBeInTheDocument() + expect(screen.getByText('SNBC Rate Program')).toBeInTheDocument() expect(screen.getByText('PMAP')).toBeInTheDocument() + expect(screen.getByText('PMAP Rate Program')).toBeInTheDocument() expect(screen.getByText('MSC+')).toBeInTheDocument() }) await selectEvent.select(combobox, 'MSHO') await selectEvent.openMenu(combobox) - await selectEvent.select(combobox, 'SNBC') + await selectEvent.select(combobox, 'MSC+') expect(mockOnChange.mock.calls).toHaveLength(2) expect(mockOnChange.mock.results[1].value).toStrictEqual([ '3fd36500-bf2c-47bc-80e8-e7aa417184c5', - 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', + 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', ]) // in react-select, only items that are selected have a "remove item" label - expect(screen.getByLabelText('Remove SNBC')).toBeInTheDocument() expect(screen.getByLabelText('Remove MSHO')).toBeInTheDocument() + expect(screen.getByLabelText('Remove MSC+')).toBeInTheDocument() }) it('can remove all selected programs', async () => { @@ -147,7 +188,9 @@ describe('ProgramSelect', () => { await waitFor(() => { expect(screen.getByText('MSHO')).toBeInTheDocument() expect(screen.getByText('SNBC')).toBeInTheDocument() + expect(screen.getByText('SNBC Rate Program')).toBeInTheDocument() expect(screen.getByText('PMAP')).toBeInTheDocument() + expect(screen.getByText('PMAP Rate Program')).toBeInTheDocument() expect(screen.getByText('MSC+')).toBeInTheDocument() }) diff --git a/services/app-web/src/components/Select/ProgramSelect/ProgramSelect.tsx b/services/app-web/src/components/Select/ProgramSelect/ProgramSelect.tsx index 968cb2c5bc..010ffffbf7 100644 --- a/services/app-web/src/components/Select/ProgramSelect/ProgramSelect.tsx +++ b/services/app-web/src/components/Select/ProgramSelect/ProgramSelect.tsx @@ -7,6 +7,7 @@ import { useStatePrograms } from '../../../hooks' export type ProgramSelectPropType = { name: string programIDs: string[] + contractProgramsOnly?: boolean } export interface ProgramOptionType { @@ -26,10 +27,14 @@ export interface ProgramOptionType { export const ProgramSelect = ({ name, programIDs, + contractProgramsOnly, ...selectProps }: ProgramSelectPropType & Props) => { const [_field, _meta, helpers] = useField({ name }) - const statePrograms = useStatePrograms() + const allPrograms = useStatePrograms() + const statePrograms = contractProgramsOnly + ? allPrograms.filter((program) => !program.isRateProgram) + : allPrograms const programOptions: ProgramOptionType[] = statePrograms.map((program) => { return { value: program.id, label: program.name } diff --git a/services/app-web/src/pages/StateDashboard/StateDashboard.test.tsx b/services/app-web/src/pages/StateDashboard/StateDashboard.test.tsx index 5a9fefcd3b..81e27c6d59 100644 --- a/services/app-web/src/pages/StateDashboard/StateDashboard.test.tsx +++ b/services/app-web/src/pages/StateDashboard/StateDashboard.test.tsx @@ -61,21 +61,25 @@ describe('StateDashboard', () => { id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', fullName: 'Special Needs Basic Care', name: 'SNBC', + isRateProgram: false, }, { id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', fullName: 'Prepaid Medical Assistance Program', name: 'PMAP', + isRateProgram: false, }, { id: 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', fullName: 'Minnesota Senior Care Plus ', name: 'MSC+', + isRateProgram: false, }, { id: '3fd36500-bf2c-47bc-80e8-e7aa417184c5', fullName: 'Minnesota Senior Health Options', name: 'MSHO', + isRateProgram: false, }, ], }, @@ -124,6 +128,72 @@ describe('StateDashboard', () => { const link3 = within(rows[3]).getByRole('link') expect(link3).toHaveAttribute('href', '/submissions/test-abc-submitted') }) + + it('displays submissions table without rate programs', async () => { + const mockUser = { + __typename: 'StateUser' as const, + state: { + name: 'Minnesota', + code: 'MN', + programs: [ + { + id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', + fullName: 'Special Needs Basic Care', + name: 'SNBC', + isRateProgram: true, + }, + { + id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', + fullName: 'Prepaid Medical Assistance Program', + name: 'PMAP', + isRateProgram: true, + }, + { + id: 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', + fullName: 'Minnesota Senior Care Plus ', + name: 'MSC+', + isRateProgram: true, + }, + { + id: '3fd36500-bf2c-47bc-80e8-e7aa417184c5', + fullName: 'Minnesota Senior Health Options', + name: 'MSHO', + isRateProgram: true, + }, + ], + }, + role: 'State User', + email: 'bob@dmas.mn.gov', + } + + // set draft current revision to a far future updatedAt. Set unlocked to nearer future. This allows us to test sorting. + const draft = mockDraftHealthPlanPackage({ + updatedAt: new Date('2100-01-01'), + }) + const submitted = mockSubmittedHealthPlanPackage() + const unlocked = mockUnlockedHealthPlanPackage({ + updatedAt: new Date('2098-01-01'), + }) + draft.id = 'test-abc-draft' + submitted.id = 'test-abc-submitted' + unlocked.id = 'test-abc-unlocked' + + const submissions = [draft, submitted, unlocked] + + renderWithProviders(, { + apolloProvider: { + mocks: [ + fetchCurrentUserMock({ statusCode: 200, user: mockUser }), + indexHealthPlanPackagesMockSuccess(submissions), + ], + }, + }) + + await waitFor(() => { + expect(screen.getByText(/No programs exist/)).toBeInTheDocument() + }) + }) + it('should not display filters on state dashboard page', async () => { renderWithProviders(, { apolloProvider: { diff --git a/services/app-web/src/pages/StateDashboard/StateDashboard.tsx b/services/app-web/src/pages/StateDashboard/StateDashboard.tsx index b6fecc111a..154fd9ec71 100644 --- a/services/app-web/src/pages/StateDashboard/StateDashboard.tsx +++ b/services/app-web/src/pages/StateDashboard/StateDashboard.tsx @@ -59,7 +59,9 @@ export const StateDashboard = (): React.ReactElement => { ) } - const programs = loggedInUser.state.programs + const programs = loggedInUser.state.programs.filter( + (program) => !program.isRateProgram + ) const submissionRows: PackageInDashboardType[] = [] data?.indexHealthPlanPackages.edges @@ -81,9 +83,9 @@ export const StateDashboard = (): React.ReactElement => { currentSubmissionData.programIDs, programs ), - programs: programs.filter((program) => - currentSubmissionData.programIDs.includes(program.id) - ), + programs: programs.filter((program) => { + return currentSubmissionData.programIDs.includes(program.id) + }), submittedAt: sub.initiallySubmittedAt, status: sub.status, updatedAt: currentSubmissionData.updatedAt, diff --git a/services/app-web/src/pages/StateSubmission/RateDetails/RateDetails.test.tsx b/services/app-web/src/pages/StateSubmission/RateDetails/RateDetails.test.tsx index f31c646aa6..35ab68bf03 100644 --- a/services/app-web/src/pages/StateSubmission/RateDetails/RateDetails.test.tsx +++ b/services/app-web/src/pages/StateSubmission/RateDetails/RateDetails.test.tsx @@ -332,16 +332,19 @@ describe('RateDetails', () => { id: 'first', name: 'Program 1', fullName: 'Program 1', + isRateProgram: false, }, { id: 'second', name: 'Program Test', fullName: 'Program Test', + isRateProgram: false, }, { id: 'third', name: 'Program 3', fullName: 'Program 3', + isRateProgram: false, }, ], }, diff --git a/services/app-web/src/pages/StateSubmission/SubmissionType/SubmissionType.test.tsx b/services/app-web/src/pages/StateSubmission/SubmissionType/SubmissionType.test.tsx index f907eae291..2d6056da3c 100644 --- a/services/app-web/src/pages/StateSubmission/SubmissionType/SubmissionType.test.tsx +++ b/services/app-web/src/pages/StateSubmission/SubmissionType/SubmissionType.test.tsx @@ -380,13 +380,24 @@ describe('SubmissionType', () => { name: 'Minnesota', code: 'MN', programs: [ - { id: 'first', name: 'Program 1', fullName: 'Program 1' }, + { + id: 'first', + name: 'Program 1', + fullName: 'Program 1', + isRateProgram: false, + }, { id: 'second', name: 'Program Test', fullName: 'Program Test', + isRateProgram: false, + }, + { + id: 'third', + name: 'Program 3', + fullName: 'Program 3', + isRateProgram: false, }, - { id: 'third', name: 'Program 3', fullName: 'Program 3' }, ], }, } diff --git a/services/app-web/src/pages/StateSubmission/SubmissionType/SubmissionType.tsx b/services/app-web/src/pages/StateSubmission/SubmissionType/SubmissionType.tsx index afa4118cd2..216286c487 100644 --- a/services/app-web/src/pages/StateSubmission/SubmissionType/SubmissionType.tsx +++ b/services/app-web/src/pages/StateSubmission/SubmissionType/SubmissionType.tsx @@ -417,6 +417,7 @@ export const SubmissionType = ({ name="programIDs" inputId="programIDs" programIDs={values.programIDs} + contractProgramsOnly aria-label="Programs this contract action covers (required)" /> diff --git a/services/app-web/src/pages/SubmissionRevisionSummary/SubmissionRevisionSummaryV2.test.tsx b/services/app-web/src/pages/SubmissionRevisionSummary/SubmissionRevisionSummaryV2.test.tsx index 64fc0c798e..05eafaccc0 100644 --- a/services/app-web/src/pages/SubmissionRevisionSummary/SubmissionRevisionSummaryV2.test.tsx +++ b/services/app-web/src/pages/SubmissionRevisionSummary/SubmissionRevisionSummaryV2.test.tsx @@ -10,7 +10,6 @@ import { import { renderWithProviders } from '../../testHelpers/jestHelpers' import { SubmissionRevisionSummaryV2 } from './SubmissionRevisionSummaryV2' import { dayjs } from '../../common-code/dateHelpers' -import { Contract } from '../../gen/gqlClient' import { mockContractPackageWithDifferentProgramsInRevisions } from '../../testHelpers/apolloMocks/contractPackageDataMock' describe('SubmissionRevisionSummary', () => { @@ -121,10 +120,12 @@ describe('SubmissionRevisionSummary', () => { statusCode: 200, }), fetchContractMockSuccess({ - contract: mockContractPackageSubmittedWithRevisions({ - id: '15' - }) - }) + contract: mockContractPackageSubmittedWithRevisions( + { + id: '15', + } + ), + }), ], }, routerProvider: { @@ -139,11 +140,16 @@ describe('SubmissionRevisionSummary', () => { await screen.findByRole('heading', { name: 'Contract details' }) ).toBeInTheDocument() - expect(await screen.findByLabelText('Submission description')).toHaveTextContent('Submission 2') + expect( + await screen.findByLabelText('Submission description') + ).toHaveTextContent('Submission 2') expect(await screen.findByText('rate2 doc')).toBeInTheDocument() - expect(await screen.findByRole('heading', { name: 'MCR-MN-0005-SNBC'})).toBeInTheDocument() - expect(await screen.findByLabelText('Submitted')).toHaveTextContent('01/01/24') - + expect( + await screen.findByRole('heading', { name: 'MCR-MN-0005-SNBC' }) + ).toBeInTheDocument() + expect(await screen.findByLabelText('Submitted')).toHaveTextContent( + '01/01/24' + ) }) it('renders the right indexed version 1', async () => { @@ -162,10 +168,12 @@ describe('SubmissionRevisionSummary', () => { statusCode: 200, }), fetchContractMockSuccess({ - contract: mockContractPackageSubmittedWithRevisions({ - id: '15' - }) - }) + contract: mockContractPackageSubmittedWithRevisions( + { + id: '15', + } + ), + }), ], }, routerProvider: { @@ -180,7 +188,9 @@ describe('SubmissionRevisionSummary', () => { await screen.findByRole('heading', { name: 'Contract details' }) ).toBeInTheDocument() - expect(await screen.findByLabelText('Submission description')).toHaveTextContent('Submission 1') + expect( + await screen.findByLabelText('Submission description') + ).toHaveTextContent('Submission 1') }) it('renders the right indexed version 3', async () => { @@ -199,10 +209,12 @@ describe('SubmissionRevisionSummary', () => { statusCode: 200, }), fetchContractMockSuccess({ - contract: mockContractPackageSubmittedWithRevisions({ - id: '15' - }) - }) + contract: mockContractPackageSubmittedWithRevisions( + { + id: '15', + } + ), + }), ], }, routerProvider: { @@ -217,10 +229,11 @@ describe('SubmissionRevisionSummary', () => { await screen.findByRole('heading', { name: 'Contract details' }) ).toBeInTheDocument() - expect(await screen.findByLabelText('Submission description')).toHaveTextContent('Submission 3') + expect( + await screen.findByLabelText('Submission description') + ).toHaveTextContent('Submission 3') }) - it('renders the error indexed version 4', async () => { renderWithProviders( @@ -237,10 +250,12 @@ describe('SubmissionRevisionSummary', () => { statusCode: 200, }), fetchContractMockSuccess({ - contract: mockContractPackageSubmittedWithRevisions({ - id: '15' - }) - }) + contract: mockContractPackageSubmittedWithRevisions( + { + id: '15', + } + ), + }), ], }, routerProvider: { @@ -251,44 +266,46 @@ describe('SubmissionRevisionSummary', () => { }, } ) - expect(await screen.findByRole('heading')).toHaveTextContent('404 / Page not found') - + expect(await screen.findByRole('heading')).toHaveTextContent( + '404 / Page not found' + ) }) it('renders with correct submission name even when previous revisions have different programs', async () => { // Test case written during MCR-4120 - const mockContract = mockContractPackageWithDifferentProgramsInRevisions() - renderWithProviders( - - } - /> - , - { - apolloProvider: { - mocks: [ - fetchCurrentUserMock({ - user: mockValidCMSUser(), - statusCode: 200, - }), - fetchContractMockSuccess({ - contract: mockContract - }) - ], - }, - routerProvider: { - route:`/submissions/${mockContract.id}/revisions/1`, - }, - featureFlags: { - 'link-rates': true, - }, - } - ) + const mockContract = + mockContractPackageWithDifferentProgramsInRevisions() + renderWithProviders( + + } + /> + , + { + apolloProvider: { + mocks: [ + fetchCurrentUserMock({ + user: mockValidCMSUser(), + statusCode: 200, + }), + fetchContractMockSuccess({ + contract: mockContract, + }), + ], + }, + routerProvider: { + route: `/submissions/${mockContract.id}/revisions/1`, + }, + featureFlags: { + 'link-rates': true, + }, + } + ) - expect( - await screen.findByRole('heading', { name: 'Contract details' }) - ).toBeInTheDocument() + expect( + await screen.findByRole('heading', { name: 'Contract details' }) + ).toBeInTheDocument() // grab information from the earliest submission and check its data displayed const [earliestSubmission] = mockContract.packageSubmissions.slice(-1) @@ -298,49 +315,11 @@ describe('SubmissionRevisionSummary', () => { name: earliestSubmission.contractRevision.contractName, }) ).toBeInTheDocument() - expect(screen.queryByText(earliestSubmission.contractRevision.formData.submissionDescription)).toBeInTheDocument() - + expect( + screen.queryByText( + earliestSubmission.contractRevision.formData + .submissionDescription + ) + ).toBeInTheDocument() }) - - // it('extracts the correct dates from the submission and displays them in tables', async () => { - // renderWithProviders( - // - // } - // /> - // , - // { - // apolloProvider: { - // mocks: [ - // fetchCurrentUserMock({ - // user: mockValidCMSUser(), - // statusCode: 200, - // }), - // fetchStateHealthPlanPackageMockSuccess({ - // stateSubmission: - // mockSubmittedHealthPlanPackageWithRevisions(), - // id: '15', - // }), - // ], - // }, - // routerProvider: { - // route: '/submissions/15/revisions/2', - // }, - // } - // ) - // await waitFor(() => { - // const rows = screen.getAllByRole('row') - // expect(rows).toHaveLength(2) - // expect(within(rows[0]).getByText('Date added')).toBeInTheDocument() - // expect( - // within(rows[1]).getByText( - // dayjs( - // mockSubmittedHealthPlanPackageWithRevisions() - // .revisions[2]?.node?.submitInfo?.updatedAt - // ).format('M/D/YY') - // ) - // ).toBeInTheDocument() - // }) - // }) }) diff --git a/services/app-web/src/pages/SubmissionRevisionSummary/SubmissionRevisionSummaryV2.tsx b/services/app-web/src/pages/SubmissionRevisionSummary/SubmissionRevisionSummaryV2.tsx index ef161fb1c8..c8baf8095e 100644 --- a/services/app-web/src/pages/SubmissionRevisionSummary/SubmissionRevisionSummaryV2.tsx +++ b/services/app-web/src/pages/SubmissionRevisionSummary/SubmissionRevisionSummaryV2.tsx @@ -54,20 +54,27 @@ export const SubmissionRevisionSummaryV2 = (): React.ReactElement => { const revisionIndex = Number(revisionVersion) - 1 // Reverse revisions to get correct submission order - const packageSubmissions = contract? [...contract.packageSubmissions] - .filter((submission) => { - return submission.cause === 'CONTRACT_SUBMISSION' - }) - .reverse() : [] - const targetPreviousSubmission = packageSubmissions[revisionIndex] && packageSubmissions[revisionIndex].__typename ? packageSubmissions[revisionIndex] : undefined + const packageSubmissions = contract + ? [...contract.packageSubmissions] + .filter((submission) => { + return submission.cause === 'CONTRACT_SUBMISSION' + }) + .reverse() + : [] + const targetPreviousSubmission = + packageSubmissions[revisionIndex] && + packageSubmissions[revisionIndex].__typename + ? packageSubmissions[revisionIndex] + : undefined const name = targetPreviousSubmission?.contractRevision.contractName useEffect(() => { // make sure you do not update the page heading until we are sure the name for that previous submission exists if (name) { updateHeading({ - customHeading: name, - })} + customHeading: name, + }) + } }, [name, updateHeading]) // Display any full page interim state resulting from the initial fetch API requests @@ -83,13 +90,10 @@ export const SubmissionRevisionSummaryV2 = (): React.ReactElement => { ) } - if ( - !contract || !targetPreviousSubmission || !name - ) { + if (!contract || !targetPreviousSubmission || !name) { return } - const revision = targetPreviousSubmission.contractRevision const rateRevisions = targetPreviousSubmission.rateRevisions const contractData = revision.formData @@ -98,7 +102,6 @@ export const SubmissionRevisionSummaryV2 = (): React.ReactElement => { const isContractActionAndRateCertification = contractData.submissionType === 'CONTRACT_AND_RATES' - return (
{ id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', fullName: 'Special Needs Basic Care', name: 'SNBC', + isRateProgram: false, }, { id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', fullName: 'Prepaid Medical Assistance Program', name: 'PMAP', + isRateProgram: false, }, { id: 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', fullName: 'Minnesota Senior Care Plus ', name: 'MSC+', + isRateProgram: false, }, { id: '3fd36500-bf2c-47bc-80e8-e7aa417184c5', fullName: 'Minnesota Senior Health Options', name: 'MSHO', + isRateProgram: false, }, ], }, diff --git a/services/app-web/src/testHelpers/apolloMocks/contractPackageDataMock.ts b/services/app-web/src/testHelpers/apolloMocks/contractPackageDataMock.ts index 91b1ea761e..9678a3bb2e 100644 --- a/services/app-web/src/testHelpers/apolloMocks/contractPackageDataMock.ts +++ b/services/app-web/src/testHelpers/apolloMocks/contractPackageDataMock.ts @@ -678,8 +678,8 @@ function mockContractPackageSubmittedWithRevisions( // this package has val-like data - different versions have different descriptions and programs and package names function mockContractPackageWithDifferentProgramsInRevisions (): Contract { - return{ "id": "e670adsfdfadsfc", "status": "RESUBMITTED", "createdAt": "2024-05-07T19:44:53.732Z", "updatedAt": "2024-05-07T19:44:53.732Z", "initiallySubmittedAt": "2024-05-07", "stateCode": "FL", "mccrsID": null, "state": { "code": "FL", "name": "Florida", "programs": [{ "id": "712277fb-f43f-4eb5-98c5-6c6a97509201", "name": "NEMT", "fullName": "Non-Emergency Medical Transportation", "__typename": "Program" }, { "id": "037af66b-81eb-4472-8b80-01edf17d12d9", "name": "PCCMe", "fullName": "Healthy Start MomCare Network, Inc.", "__typename": "Program" }, { "id": "5c10fe9f-bec9-416f-a20c-718b152ad633", "name": "MMA", "fullName": "Managed Medical Assistance Program", "__typename": "Program" }, { "id": "3b8d8fa1-1fa6-4504-9c5b-ef522877fe1e", "name": "LTC", "fullName": "Long-term Care Program", "__typename": "Program" }, { "id": "08d114c2-0c01-4a1a-b8ff-e2b79336672d", "name": "Dental", "fullName": "Prepaid Dental Health Program", "__typename": "Program" }], "__typename": "State" }, "stateNumber": 221, "__typename": "Contract", "draftRevision": null, "draftRates": null, - // pragma: allowlist nextline secret + return{ "id": "e670adsfdfadsfc", "status": "RESUBMITTED", "createdAt": "2024-05-07T19:44:53.732Z", "updatedAt": "2024-05-07T19:44:53.732Z", "initiallySubmittedAt": "2024-05-07", "stateCode": "FL", "mccrsID": null, "state": { "code": "FL", "name": "Florida", "programs": [{ "id": "712277fb-f43f-4eb5-98c5-6c6a97509201", "name": "NEMT", "fullName": "Non-Emergency Medical Transportation", "isRateProgram": false, "__typename": "Program" }, { "id": "037af66b-81eb-4472-8b80-01edf17d12d9", "name": "PCCMe", "fullName": "Healthy Start MomCare Network, Inc.", "isRateProgram": false, "__typename": "Program" }, { "id": "5c10fe9f-bec9-416f-a20c-718b152ad633", "name": "MMA", "fullName": "Managed Medical Assistance Program", "isRateProgram": false, "__typename": "Program" }, { "id": "3b8d8fa1-1fa6-4504-9c5b-ef522877fe1e", "name": "LTC", "fullName": "Long-term Care Program", "isRateProgram": false, "__typename": "Program" }, { "id": "08d114c2-0c01-4a1a-b8ff-e2b79336672d", "name": "Dental", "fullName": "Prepaid Dental Health Program", "isRateProgram": false, "__typename": "Program" }], "__typename": "State" }, "stateNumber": 221, "__typename": "Contract", "draftRevision": null, "draftRates": null, + // pragma: allowlist nextline secret "packageSubmissions": [{ "cause": "CONTRACT_SUBMISSION", "submitInfo": { "updatedAt": "2024-05-08T17:42:52.696Z", "updatedBy": "mc-review-team@truss.works", "updatedReason": "testing 4100", "__typename": "UpdateInformation" }, "submittedRevisions": [{ "id": "a334b516-f219-47ac-aedf-97c93b18d7d6", "createdAt": "2024-05-07T19:49:36.173Z", "updatedAt": "2024-05-08T17:42:52.696Z", "contractName": "MCR-FL-0221-DENTAL", "submitInfo": { "updatedAt": "2024-05-08T17:42:52.696Z", "updatedBy": "team@example.com", "updatedReason": "testing 4100", "__typename": "UpdateInformation" }, "unlockInfo": { "updatedAt": "2024-05-07T19:49:36.175Z", "updatedBy": "team@example.com", "updatedReason": "test", "__typename": "UpdateInformation" }, "formData": { "programIDs": ["08d114c2-0c01-4a1a-b8ff-e2b79336672d"], "populationCovered": "CHIP", "submissionType": "CONTRACT_ONLY", "riskBasedContract": true, "submissionDescription": "This amendment revises calendar year (CY) 2019 capitation rates, adds new language concerning capitation payments related to a program no longer authorized by law, and changes the requirement that the MCO pay or deny clean paper claims within thirty (30), rather than twenty-one (21) calendar days of receipt.", "stateContacts": [{ "name": "Raymond Holt", "titleRole": "test", "email": "kaleigh@example.com", "__typename": "StateContact" }], "supportingDocuments": [{ "name": "State User Manual - MC-Review - January 2024.pdf", "s3URL": "s3://uploads-val-uploads-798659716464/b88e8dd1-f4f1-4d39-8591-645b64a15e27.pdf/State User Manual - MC-Review - January 2024.pdf", "sha256": "74f6efc997e4524aa7eb52f75b7f595c91cf7f4420dc9c8a995d98b470494540", "dateAdded": "2024-05-08", "__typename": "GenericDocument" }], "contractType": "BASE", "contractExecutionStatus": "EXECUTED", "contractDocuments": [{ "name": "Test document.pdf", "s3URL": "s3://uploads-val-uploads-798659716464/63f44255-e82a-4156-996c-876a1ca86768.pdf/Test document.pdf", "sha256": "66b53218e2e32b046a354cf78a604fcd24825b3958044c6de53ea1b2b3ed6cf9", "dateAdded": "2024-05-08", "__typename": "GenericDocument" }], "contractDateStart": "2024-07-01", "contractDateEnd": "2025-06-30", "managedCareEntities": ["MCO"], "federalAuthorities": ["WAIVER_1115"], "inLieuServicesAndSettings": null, "modifiedBenefitsProvided": null, "modifiedGeoAreaServed": null, "modifiedMedicaidBeneficiaries": null, "modifiedRiskSharingStrategy": null, "modifiedIncentiveArrangements": null, "modifiedWitholdAgreements": null, "modifiedStateDirectedPayments": null, "modifiedPassThroughPayments": null, "modifiedPaymentsForMentalDiseaseInstitutions": null, "modifiedMedicalLossRatioStandards": null, "modifiedOtherFinancialPaymentIncentive": null, "modifiedEnrollmentProcess": null, "modifiedGrevienceAndAppeal": null, "modifiedNetworkAdequacyStandards": null, "modifiedLengthOfContract": null, "modifiedNonRiskPaymentArrangements": null, "__typename": "ContractFormData" }, "__typename": "ContractRevision" }], "contractRevision": { "id": "a334b516-f219-47ac-aedf-97c93b18d7d6", "createdAt": "2024-05-07T19:49:36.173Z", "updatedAt": "2024-05-08T17:42:52.696Z", "contractName": "MCR-FL-0221-DENTAL", "submitInfo": { "updatedAt": "2024-05-08T17:42:52.696Z", "updatedBy": "team@example.com", "updatedReason": "testing 4100", "__typename": "UpdateInformation" }, "unlockInfo": { "updatedAt": "2024-05-07T19:49:36.175Z", "updatedBy": "team@example.com", "updatedReason": "test", "__typename": "UpdateInformation" }, "formData": { "programIDs": ["08d114c2-0c01-4a1a-b8ff-e2b79336672d"], "populationCovered": "CHIP", "submissionType": "CONTRACT_ONLY", "riskBasedContract": true, "submissionDescription": "This amendment revises calendar year (CY) 2019 capitation rates, adds new language concerning capitation payments related to a program no longer authorized by law, and changes the requirement that the MCO pay or deny clean paper claims within thirty (30), rather than twenty-one (21) calendar days of receipt.", "stateContacts": [{ "name": "Raymond Holt", "titleRole": "test", "email": "kaleigh@example.com", "__typename": "StateContact" }], "supportingDocuments": [{ "name": "State User Manual - MC-Review - January 2024.pdf", "s3URL": "s3://uploads-val-uploads-798659716464/b88e8dd1-f4f1-4d39-8591-645b64a15e27.pdf/State User Manual - MC-Review - January 2024.pdf", "sha256": "74f6efc997e4524aa7eb52f75b7f595c91cf7f4420dc9c8a995d98b470494540", "dateAdded": "2024-05-08", "__typename": "GenericDocument" }], "contractType": "BASE", "contractExecutionStatus": "EXECUTED", "contractDocuments": [{ "name": "Test document.pdf", "s3URL": "s3://uploads-val-uploads-798659716464/63f44255-e82a-4156-996c-876a1ca86768.pdf/Test document.pdf", "sha256": "66b53218e2e32b046a354cf78a604fcd24825b3958044c6de53ea1b2b3ed6cf9", "dateAdded": "2024-05-07", "__typename": "GenericDocument" }], "contractDateStart": "2024-07-01", "contractDateEnd": "2025-06-30", "managedCareEntities": ["MCO"], "federalAuthorities": ["WAIVER_1115"], "inLieuServicesAndSettings": null, "modifiedBenefitsProvided": null, "modifiedGeoAreaServed": null, "modifiedMedicaidBeneficiaries": null, "modifiedRiskSharingStrategy": null, "modifiedIncentiveArrangements": null, "modifiedWitholdAgreements": null, "modifiedStateDirectedPayments": null, "modifiedPassThroughPayments": null, "modifiedPaymentsForMentalDiseaseInstitutions": null, "modifiedMedicalLossRatioStandards": null, "modifiedOtherFinancialPaymentIncentive": null, "modifiedEnrollmentProcess": null, "modifiedGrevienceAndAppeal": null, "modifiedNetworkAdequacyStandards": null, "modifiedLengthOfContract": null, "modifiedNonRiskPaymentArrangements": null, "__typename": "ContractFormData" }, "__typename": "ContractRevision" }, "rateRevisions": [], "__typename": "ContractPackageSubmission" }, { "cause": "CONTRACT_SUBMISSION", "submitInfo": { "updatedAt": "2024-05-07T19:46:19.376Z", "updatedBy": "team@example.com", "updatedReason": "Initial submission", "__typename": "UpdateInformation" }, "submittedRevisions": [{ "id": "5e124160-8ac5-4d6f-9733-c5e8723c5af6", "createdAt": "2024-05-07T19:44:53.732Z", "updatedAt": "2024-05-07T19:46:19.377Z", "contractName": "MCR-FL-0221-PCCME", "submitInfo": { "updatedAt": "2024-05-07T19:46:19.376Z", "updatedBy": "team@example.com", "updatedReason": "Initial submission", "__typename": "UpdateInformation" }, "unlockInfo": null, "formData": { "programIDs": ["037af66b-81eb-4472-8b80-01edf17d12d9"], "populationCovered": "CHIP", "submissionType": "CONTRACT_ONLY", "riskBasedContract": true, "submissionDescription": "test", "stateContacts": [{ "name": "Raymond Holt", "titleRole": "test", "email": "kaleigh@example.com", "__typename": "StateContact" }], "supportingDocuments": [], "contractType": "BASE", "contractExecutionStatus": "EXECUTED", "contractDocuments": [{ "name": "Test document.pdf", "s3URL": "s3://uploads-val-uploads-798659716464/63f44255-e82a-4156-996c-876a1ca86768.pdf/Test document.pdf", "sha256": "66b53218e2e32b046a354cf78a604fcd24825b3958044c6de53ea1b2b3ed6cf9", "dateAdded": "2024-05-07", "__typename": "GenericDocument" }], "contractDateStart": "2024-07-01", "contractDateEnd": "2025-06-30", "managedCareEntities": ["MCO"], "federalAuthorities": ["WAIVER_1115"], "inLieuServicesAndSettings": null, "modifiedBenefitsProvided": null, "modifiedGeoAreaServed": null, "modifiedMedicaidBeneficiaries": null, "modifiedRiskSharingStrategy": null, "modifiedIncentiveArrangements": null, "modifiedWitholdAgreements": null, "modifiedStateDirectedPayments": null, "modifiedPassThroughPayments": null, "modifiedPaymentsForMentalDiseaseInstitutions": null, "modifiedMedicalLossRatioStandards": null, "modifiedOtherFinancialPaymentIncentive": null, "modifiedEnrollmentProcess": null, "modifiedGrevienceAndAppeal": null, "modifiedNetworkAdequacyStandards": null, "modifiedLengthOfContract": null, "modifiedNonRiskPaymentArrangements": null, "__typename": "ContractFormData" }, "__typename": "ContractRevision" }], "contractRevision": { "id": "5e124160-8ac5-4d6f-9733-c5e8723c5af6", "createdAt": "2024-05-07T19:44:53.732Z", "updatedAt": "2024-05-07T19:46:19.377Z", "contractName": "MCR-FL-0221-PCCME", "submitInfo": { "updatedAt": "2024-05-07T19:46:19.376Z", "updatedBy": "team@example.com", "updatedReason": "Initial submission", "__typename": "UpdateInformation" }, "unlockInfo": null, "formData": { "programIDs": ["037af66b-81eb-4472-8b80-01edf17d12d9"], "populationCovered": "CHIP", "submissionType": "CONTRACT_ONLY", "riskBasedContract": true, "submissionDescription": "test", "stateContacts": [{ "name": "Raymond Holt", "titleRole": "test", "email": "kaleigh@example.com", "__typename": "StateContact" }], "supportingDocuments": [], "contractType": "BASE", "contractExecutionStatus": "EXECUTED", "contractDocuments": [{ "name": "Test document.pdf", "s3URL": "s3://uploads-val-uploads-798659716464/63f44255-e82a-4156-996c-876a1ca86768.pdf/Test document.pdf", "sha256": "66b53218e2e32b046a354cf78a604fcd24825b3958044c6de53ea1b2b3ed6cf9", "dateAdded": "2024-05-07", "__typename": "GenericDocument" }], "contractDateStart": "2024-07-01", "contractDateEnd": "2025-06-30", "managedCareEntities": ["MCO"], "federalAuthorities": ["WAIVER_1115"], "inLieuServicesAndSettings": null, "modifiedBenefitsProvided": null, "modifiedGeoAreaServed": null, "modifiedMedicaidBeneficiaries": null, "modifiedRiskSharingStrategy": null, "modifiedIncentiveArrangements": null, "modifiedWitholdAgreements": null, "modifiedStateDirectedPayments": null, "modifiedPassThroughPayments": null, "modifiedPaymentsForMentalDiseaseInstitutions": null, "modifiedMedicalLossRatioStandards": null, "modifiedOtherFinancialPaymentIncentive": null, "modifiedEnrollmentProcess": null, "modifiedGrevienceAndAppeal": null, "modifiedNetworkAdequacyStandards": null, "modifiedLengthOfContract": null, "modifiedNonRiskPaymentArrangements": null, "__typename": "ContractFormData" }, "__typename": "ContractRevision" }, "rateRevisions": [], "__typename": "ContractPackageSubmission" }] } } diff --git a/services/app-web/src/testHelpers/apolloMocks/stateMock.ts b/services/app-web/src/testHelpers/apolloMocks/stateMock.ts index f8427708c7..f780040734 100644 --- a/services/app-web/src/testHelpers/apolloMocks/stateMock.ts +++ b/services/app-web/src/testHelpers/apolloMocks/stateMock.ts @@ -8,21 +8,37 @@ function mockMNState(): State { id: 'abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce', fullName: 'Special Needs Basic Care', name: 'SNBC', + isRateProgram: false }, { id: 'd95394e5-44d1-45df-8151-1cc1ee66f100', fullName: 'Prepaid Medical Assistance Program', name: 'PMAP', + isRateProgram: false }, { id: 'ea16a6c0-5fc6-4df8-adac-c627e76660ab', fullName: 'Minnesota Senior Care Plus ', name: 'MSC+', + isRateProgram: false }, { id: '3fd36500-bf2c-47bc-80e8-e7aa417184c5', fullName: 'Minnesota Senior Health Options', name: 'MSHO', + isRateProgram: false + }, + { + id: 'bab766a5-650e-4851-8fdf-6a420ffc41c1', + fullName: 'Minnesota Special Needs Basic Care', + name: 'SNBC Rate Program', + isRateProgram: true + }, + { + id: '31ddd823-7c6e-46d9-bc31-e0b7d6389a43', + fullName: 'Prepaid Medical Assistance Program for Seniors', + name: 'PMAP Rate Program', + isRateProgram: true }, ], code: 'MN', diff --git a/services/cypress/utils/apollo-test-utils.ts b/services/cypress/utils/apollo-test-utils.ts index 0db7246f14..7dc1e86e9c 100644 --- a/services/cypress/utils/apollo-test-utils.ts +++ b/services/cypress/utils/apollo-test-utils.ts @@ -45,22 +45,26 @@ const minnesotaStatePrograms =[ { "id": "abbdf9b0-c49e-4c4c-bb6f-040cb7b51cce", "fullName": "Special Needs Basic Care", - "name": "SNBC" + "name": "SNBC", + "isRateProgram": "false" }, { "id": "d95394e5-44d1-45df-8151-1cc1ee66f100", "fullName": "Prepaid Medical Assistance Program", - "name": "PMAP" + "name": "PMAP", + "isRateProgram": "false" }, { "id": "ea16a6c0-5fc6-4df8-adac-c627e76660ab", "fullName": "Minnesota Senior Care Plus ", - "name": "MSC+" + "name": "MSC+", + "isRateProgram": "false" }, { "id": "3fd36500-bf2c-47bc-80e8-e7aa417184c5", "fullName": "Minnesota Senior Health Options", - "name": "MSHO" + "name": "MSHO", + "isRateProgram": "false" } ] diff --git a/yarn.lock b/yarn.lock index 394c1dab5c..59add36c04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12121,9 +12121,9 @@ defer-to-connect "^2.0.0" "@tanstack/react-table@^8.8.5": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.16.0.tgz#92151210ff99d6925353d7a2205735d9c31af48c" - integrity sha512-rKRjnt8ostqN2fercRVOIH/dq7MAmOENCMvVlKx6P9Iokhh6woBGnIZEkqsY/vEJf1jN3TqLOb34xQGLVRuhAg== + version "8.17.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.17.0.tgz#c0a6275928a9b18573a75101a828c1e3cb2fe269" + integrity sha512-LSJxTDzlKGs8EN7/UHB1l3yLR9HUIxoHFkTbTjHaUUGL4kgYZFYhsQsdDJSIykG86qpIA/6gSWmtwNfy5Iprhw== dependencies: "@tanstack/table-core" "8.16.0" @@ -16105,9 +16105,9 @@ cli-table3@^0.6.1: "@colors/colors" "1.5.0" cli-table3@~0.6.1: - version "0.6.4" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.4.tgz#d1c536b8a3f2e7bec58f67ac9e5769b1b30088b0" - integrity sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw== + version "0.6.5" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== dependencies: string-width "^4.2.0" optionalDependencies: