diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 1af755a1b3..90a0092c80 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -211,7 +211,7 @@ jobs:
- name: Check out repository
uses: actions/checkout@v4
- - uses: actions/setup-node@v3
+ - uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: yarn
diff --git a/.github/workflows/promote.yml b/.github/workflows/promote.yml
index e8fd3ed396..aef65d8ffa 100644
--- a/.github/workflows/promote.yml
+++ b/.github/workflows/promote.yml
@@ -81,7 +81,7 @@ jobs:
- name: Check out repository
uses: actions/checkout@v4
- - uses: actions/setup-node@v3
+ - uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
diff --git a/docs/technical-design/howto-update-state-programs.md b/docs/technical-design/howto-update-state-programs.md
index 24a33b1b3b..5eb222c6b5 100644
--- a/docs/technical-design/howto-update-state-programs.md
+++ b/docs/technical-design/howto-update-state-programs.md
@@ -11,6 +11,7 @@ The source of truth for that file comes from a CSV maintained by product and des
1. Download the latest version of csv from google docs when prompted by product/design.
2. Run the script following the command listed in the `import-programs.ts`.
-3. 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 ~/Desktop/State\ programs,\ population,\ and\ nicknames.csv > ../services/app-web/src/common-code/data/statePrograms.json`
+3. 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`
4. 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.
-5. Make a PR to update the statePrograms file in the codebase
+5. For any newly created programs, manually populate the `id` field usings a UUID generator
+6. Make a PR to update the statePrograms file in the codebase
diff --git a/scripts/import-programs.ts b/scripts/import-programs.ts
index 6b76d8755d..519ae35c2e 100644
--- a/scripts/import-programs.ts
+++ b/scripts/import-programs.ts
@@ -2,13 +2,16 @@
This script is used to generate a list of MC-Review state programs. To read more about this script and why it's used see "How to update state programs" technical design docs.
To run:
- yarn tsc && node ./import-programs.js path/to/data.csv
+ yarn tsc && node ./import-programs.js path/to/data.csv > ../services/app-web/src/common-code/data/statePrograms.json
The input file is expected to be a valid CSV with at least the following columns:
1 State (two-character state code, uppercase)
2 Program (full program name)
3 Nickname (acronym or abbreviation e.g. "CME")
+Documentation for this script can be found here:
+https://github.com/Enterprise-CMCS/managed-care-review/blob/main/docs/technical-design/howto-update-state-programs.md
+
Additional columns aren't used and should be ignored.
*/
diff --git a/services/app-api/src/resolvers/attributeHelper.ts b/services/app-api/src/resolvers/attributeHelper.ts
index 1d49eeac5a..79dd7214c1 100644
--- a/services/app-api/src/resolvers/attributeHelper.ts
+++ b/services/app-api/src/resolvers/attributeHelper.ts
@@ -8,7 +8,10 @@ export function setResolverDetailsOnActiveSpan(
user: Context['user'],
span: Context['span']
): void {
- if (!span) return
+ if (!span) {
+ console.info(`No span set on ${name} call`)
+ return
+ }
span.setAttributes({
[SemanticAttributes.ENDUSER_ID]: user.email,
[SemanticAttributes.ENDUSER_ROLE]: user.role,
diff --git a/services/app-api/src/resolvers/healthPlanPackage/indexHealthPlanPackages.ts b/services/app-api/src/resolvers/healthPlanPackage/indexHealthPlanPackages.ts
index fc2dbec38e..fe220799ef 100644
--- a/services/app-api/src/resolvers/healthPlanPackage/indexHealthPlanPackages.ts
+++ b/services/app-api/src/resolvers/healthPlanPackage/indexHealthPlanPackages.ts
@@ -53,7 +53,8 @@ export function indexHealthPlanPackagesResolver(
): QueryResolvers['indexHealthPlanPackages'] {
return async (_parent, _args, context) => {
const { user, span } = context
- setResolverDetailsOnActiveSpan('fetchHealthPlanPackage', user, span)
+
+ setResolverDetailsOnActiveSpan('indexHealthPlanPackages', user, span)
const ratesDatabaseRefactor = await launchDarkly.getFeatureFlag(
context,
@@ -70,7 +71,7 @@ export function indexHealthPlanPackagesResolver(
if (contractsWithHistory instanceof Error) {
const errMessage = `Issue finding contracts with history by stateCode: ${user.stateCode}. Message: ${contractsWithHistory.message}`
- logError('fetchHealthPlanPackage', errMessage)
+ logError('indexHealthPlanPackages', errMessage)
setErrorAttributesOnActiveSpan(errMessage, span)
if (contractsWithHistory instanceof NotFoundError) {
@@ -111,7 +112,7 @@ export function indexHealthPlanPackagesResolver(
if (contractsWithHistory instanceof Error) {
const errMessage = `Issue finding contracts with history by submit info. Message: ${contractsWithHistory.message}`
- logError('fetchHealthPlanPackage', errMessage)
+ logError('indexHealthPlanPackages', errMessage)
setErrorAttributesOnActiveSpan(errMessage, span)
if (contractsWithHistory instanceof NotFoundError) {
diff --git a/services/app-api/src/resolvers/user/fetchCurrentUser.test.ts b/services/app-api/src/resolvers/user/fetchCurrentUser.test.ts
index f93bc1ec7e..373c4d0791 100644
--- a/services/app-api/src/resolvers/user/fetchCurrentUser.test.ts
+++ b/services/app-api/src/resolvers/user/fetchCurrentUser.test.ts
@@ -16,7 +16,7 @@ describe('currentUser', () => {
expect(res.data?.fetchCurrentUser.email).toBe('james@example.com')
expect(res.data?.fetchCurrentUser.state.code).toBe('FL')
- expect(res.data?.fetchCurrentUser.state.programs).toHaveLength(6)
+ expect(res.data?.fetchCurrentUser.state.programs).toHaveLength(5)
})
it('returns programs for MI', async () => {
diff --git a/services/app-proto/src/health_plan_form_data.proto b/services/app-proto/src/health_plan_form_data.proto
index 5149a18194..dbd9883393 100644
--- a/services/app-proto/src/health_plan_form_data.proto
+++ b/services/app-proto/src/health_plan_form_data.proto
@@ -315,4 +315,5 @@ enum StateCode {
STATE_CODE_WI = 50;
STATE_CODE_WV = 51;
STATE_CODE_WY= 52;
+ STATE_CODE_KY = 53;
}
diff --git a/services/app-web/src/assets/icons/ky-icon.svg b/services/app-web/src/assets/icons/ky-icon.svg
new file mode 100644
index 0000000000..537793a515
--- /dev/null
+++ b/services/app-web/src/assets/icons/ky-icon.svg
@@ -0,0 +1,4 @@
+
diff --git a/services/app-web/src/common-code/data/statePrograms.json b/services/app-web/src/common-code/data/statePrograms.json
index bab5224255..21341c8ad0 100644
--- a/services/app-web/src/common-code/data/statePrograms.json
+++ b/services/app-web/src/common-code/data/statePrograms.json
@@ -137,16 +137,6 @@
"fullName": "AIDS Healthcare Foundation ",
"name": "AHF"
},
- {
- "id": "53a6a9ce-e2f9-47af-9795-12901e13a986",
- "fullName": "Whole Child Model",
- "name": "WCM"
- },
- {
- "id": "7cec9b0c-3833-4933-bc05-a9287a76d3ec",
- "fullName": "Health Homes",
- "name": "HHP"
- },
{
"id": "40ca8541-3f42-45e7-8baa-835337c299c6",
"fullName": "Specialty Mental Health Services",
@@ -237,14 +227,9 @@
"name": "Florida",
"programs": [
{
- "id": "c23b4688-b33c-4be8-b7cc-2760efb4932d",
- "fullName": "Non-Emergency Medical Transportation - Medical Transportation Management",
- "name": "NEMT MTM"
- },
- {
- "id": "79041bc2-a3c7-43bf-b88a-1151cdedbcb1",
- "fullName": "Non-Emergency Medical Transportation - LogistiCare",
- "name": "NEMT LC"
+ "id": "712277fb-f43f-4eb5-98c5-6c6a97509201",
+ "fullName": "Non-Emergency Medical Transportation",
+ "name": "NEMT"
},
{
"id": "037af66b-81eb-4472-8b80-01edf17d12d9",
@@ -306,7 +291,7 @@
{
"id": "47995323-dd69-4ea5-afeb-eef15d6da27f",
"fullName": "Hawaii QUEST Integration",
- "name": "Quest"
+ "name": "QI"
},
{
"id": "2bf8cc98-2330-4e58-9e2c-96f25daa7b28",
@@ -353,7 +338,7 @@
{
"id": "9cc424d8-b833-41be-994d-0f7d689b7c82",
"fullName": "Behavioral Health Plan",
- "name": "IBHP"
+ "name": "BHP"
},
{
"id": "e53f0506-84a5-47de-8400-e71f15c8d590",
@@ -364,11 +349,6 @@
"id": "d0c0f2cb-c295-4c23-a301-24214aa5fa3d",
"fullName": "Healthy Connections",
"name": "Healthy Connections"
- },
- {
- "id": "4412b5cc-885f-4fa4-9f99-0c0f558dec18",
- "fullName": "Non-Emergency Medical Transportation",
- "name": "NEMT"
}
],
"code": "ID"
@@ -431,7 +411,7 @@
"programs": [
{
"id": "acb14791-7d88-4c10-a127-68f0a694d62f",
- "fullName": "KY Non-Emergency Transportation Program",
+ "fullName": "Non-Emergency Medical Transportation Program",
"name": "NEMT "
},
{
@@ -468,7 +448,7 @@
"programs": [
{
"id": "1076bd88-69c7-470f-839c-481c0ad13b97",
- "fullName": "MassHealth Managed Care (MassHealth MCO Program)",
+ "fullName": "MassHealth Managed Care Organization Program",
"name": "MCO"
},
{
@@ -481,14 +461,9 @@
"fullName": "Primary Care Accountable Care Organizations",
"name": "PCACO"
},
- {
- "id": "40391715-cde1-4248-b683-e106584ac66c",
- "fullName": "Senior Care Options",
- "name": "SCO"
- },
{
"id": "4e76c974-5741-4272-8c8a-9005d70259b6",
- "fullName": "MassHealth BH/SUD PIHP",
+ "fullName": "Managed Behavioral Health Program",
"name": "MBHP"
}
],
@@ -501,11 +476,6 @@
"id": "d64e707e-0f42-4c57-88f9-09bc065f3f22",
"fullName": "HealthChoice",
"name": "HealthChoice"
- },
- {
- "id": "663546f5-a8de-4f33-93ae-c506ec48353e",
- "fullName": "Hopkins Elder Plus",
- "name": "Hopkins Elder Plus"
}
],
"code": "MD"
@@ -636,13 +606,13 @@
"programs": [
{
"id": "75358ece-92f0-4c89-a45b-817f80d8be37",
- "fullName": "1915(b)/(c) Medicaid Waiver for MH/DD/SA Services",
+ "fullName": "Behavioral Health Medicaid Managed Care Program",
"name": "LME/MCO"
},
{
"id": "b4e8d1e4-0520-4fa6-b472-d3b655d3efdc",
"fullName": "Managed Care PrePaid Health Plan",
- "name": "PHP"
+ "name": "MC PHP"
},
{
"id": "fae74329-159c-42c1-9f7a-eb1e82afd2c5",
@@ -703,19 +673,19 @@
"name": "New Hampshire",
"programs": [
{
- "id": "8469324c-39a3-46f2-88b4-ed5bbb7dbe46",
- "fullName": "New Hampshire Medicaid Care Management",
- "name": "MCM "
+ "id": "fa2a5d94-ff57-4a4b-9f94-26f4a8de7668",
+ "fullName": "Dental",
+ "name": "Dental"
},
{
- "id": "df14e72a-91e2-4c61-a833-12d38eae3e1b",
- "fullName": "New Hampshire Health Protection Program Premium Assistance Demonstration for QHP",
- "name": "NHHPPP"
+ "id": "8469324c-39a3-46f2-88b4-ed5bbb7dbe46",
+ "fullName": "Medicaid Care Management",
+ "name": "MCM "
},
{
- "id": "e5097a9c-704e-4b20-a5f5-63262559d055",
- "fullName": "Heritage Health Adult ",
- "name": "HHA"
+ "id": "f9a8ace4-1de4-443f-bf82-67fbb9558ff6",
+ "fullName": "Granite Advantage Health Plan Program",
+ "name": "GAHCP"
}
],
"code": "NH"
@@ -812,15 +782,25 @@
{
"name": "Ohio",
"programs": [
+ {
+ "id": "889f525e-08c7-4e62-9df9-b67186a87975",
+ "fullName": "Ohio Resilience through Integrated Systems and Excellence",
+ "name": "OhioRISE"
+ },
{
"id": "c4ebe21a-5dd1-4308-a851-c31983b3b974",
"fullName": "Ohio Medicaid Managed Care Program",
- "name": "MyCare"
+ "name": "MMC"
},
{
"id": "d9e3bbf5-f3a3-404c-a510-998d603a3673",
"fullName": "MyCare Ohio Opt-Out Program",
- "name": "MMC"
+ "name": "MyCare"
+ },
+ {
+ "id": "f8fb337f-6f69-4b3d-9cdd-0b257f3ba9da",
+ "fullName": "Single Pharmacy Benefit Manager",
+ "name": "SPBM"
}
],
"code": "OH"
@@ -832,6 +812,21 @@
"id": "6d1f77e3-1e97-4f57-9da0-e49358ab97e2",
"fullName": "SoonerCare Choice",
"name": "SoonerCare Choice"
+ },
+ {
+ "id": "58b4e72f-219d-4648-84ae-deea4a703965",
+ "fullName": "SoonerSelect Dental",
+ "name": "SoonerSelect Dental"
+ },
+ {
+ "id": "70239e21-dd55-47ae-9156-ef910eb69e49",
+ "fullName": "SoonerSelect Children's Specialty",
+ "name": "SoonerSelect Children's Specialty"
+ },
+ {
+ "id": "4e274fe6-3645-432b-8629-b4b13bc0ee77",
+ "fullName": "SoonerSelect Medical",
+ "name": "SoonerSelect Medical"
}
],
"code": "OK"
@@ -841,8 +836,8 @@
"programs": [
{
"id": "7ae073dd-dbff-4bc9-86b8-d27954dd5776",
- "fullName": "Oregon Health Plan",
- "name": "Oregon Health Plan"
+ "fullName": "Healthier Oregon Program",
+ "name": "HOP"
},
{
"id": "46246196-3b63-40be-8db1-c09cec281dae",
@@ -860,14 +855,9 @@
{
"name": "Pennsylvania",
"programs": [
- {
- "id": "867b91fa-f470-4553-8e99-5e15afd891b5",
- "fullName": "Living Independence for the Elderly",
- "name": "LIFE"
- },
{
"id": "ef45f326-8b3a-44a9-aac6-8fa73400680a",
- "fullName": "HealthChoices - Physical Health",
+ "fullName": "HealthChoices Physical Health",
"name": "PH"
},
{
@@ -877,7 +867,7 @@
},
{
"id": "65f965cd-7823-4777-bfb1-688b36bb92b2",
- "fullName": "Behavioral Health HealthChoices",
+ "fullName": "HealthChoices Behavioral Health",
"name": "BH"
}
],
@@ -948,16 +938,6 @@
"id": "3fe3d26b-175f-4550-92a2-9f86b273c0f0",
"fullName": "TennCare II",
"name": "TennCare"
- },
- {
- "id": "288f4a6c-1772-46bb-bf88-e57d375a91a6",
- "fullName": "TennCare CHOICES",
- "name": "CHOICES"
- },
- {
- "id": "1bf0f2f9-849d-48e6-a233-601af51fd477",
- "fullName": "Non-CHOICES ",
- "name": "Non-CHOICES"
}
],
"code": "TN"
@@ -1040,11 +1020,6 @@
"id": "2f4bfd6c-c25a-44b1-9010-7367d13e7325",
"fullName": "CHIP Dental",
"name": "CHIP Dental"
- },
- {
- "id": "c20d27e3-ce47-4f6c-911c-e09bcb38e6ff",
- "fullName": "Expansion Prepaid Mental Health Planas",
- "name": "ExPMHP"
}
],
"code": "UT"
@@ -1071,12 +1046,7 @@
{
"id": "2dacc6c3-ed0b-4c95-a17c-47f8d3340511",
"fullName": "Global Commitment to Health",
- "name": "GCH"
- },
- {
- "id": "e5027571-9a8b-4022-a3a9-5d6f8a0f83b5",
- "fullName": "Vermont Medicaid Next Generation Accountable Care Organization (VMNG)",
- "name": "ACO"
+ "name": "GCTH"
}
],
"code": "VT"
@@ -1087,17 +1057,12 @@
{
"id": "7877a1e5-bdda-4668-b379-e35bde146536",
"fullName": "Apple Health Integrated Managed Care (FIMC)",
- "name": "AHIMC"
- },
- {
- "id": "64249023-8194-4ed5-8268-0e3099b83093",
- "fullName": "Behavioral Health Services Only",
- "name": "BHSO"
+ "name": "Apple Health"
},
{
"id": "9f5c066a-9e62-4f1a-8f77-090718b11c1a",
"fullName": "Apple Health Integrated Foster Care",
- "name": "AHIFC"
+ "name": "IFC"
},
{
"id": "5601ebf2-5f94-49cb-9994-bc5d4b874bc0",
@@ -1113,7 +1078,7 @@
{
"id": "03152a0a-0888-4b24-87a8-1a7371e9b8e4",
"fullName": "BadgerCare Plus",
- "name": "BCP"
+ "name": "BadgerCare"
},
{
"id": "9843c1dc-981c-4d2f-a04f-83b2a8ff254d",
@@ -1123,18 +1088,13 @@
{
"id": "8d289aae-c5f5-4af8-a7a2-8b347273dfee",
"fullName": "Family Care Partnership Program",
- "name": "Partnership"
+ "name": "Family Care Partnership"
},
{
"id": "e00f0ae0-7282-4087-8e1f-232ce967d5c3",
"fullName": "Family Care",
"name": "Family Care"
},
- {
- "id": "0f55782c-3bd8-4e6b-952e-7b3facfa0d4e",
- "fullName": "Children Come First",
- "name": "CCF"
- },
{
"id": "dc7d4bf5-c2bc-4b36-871b-f0761d040ecd",
"fullName": "WrapAround Milwaukee",
@@ -1158,7 +1118,7 @@
},
{
"id": "76fd2c76-decd-41c4-924b-82820d8fe3f0",
- "fullName": "Specialized Managed Care Plan for Children and Youth Program (Mountain Health Promise )",
+ "fullName": "Mountain Health Promise",
"name": "MHP"
},
{
diff --git a/services/app-web/src/common-code/dateHelpers/dayjs.ts b/services/app-web/src/common-code/dateHelpers/dayjs.ts
index c51a0fe180..1cdc3fefae 100644
--- a/services/app-web/src/common-code/dateHelpers/dayjs.ts
+++ b/services/app-web/src/common-code/dateHelpers/dayjs.ts
@@ -4,11 +4,13 @@ import isLeapYear from 'dayjs/plugin/isLeapYear'
import timezone from 'dayjs/plugin/timezone'
import utc from 'dayjs/plugin/utc'
import duration from 'dayjs/plugin/duration'
+import customParseFormat from 'dayjs/plugin/customParseFormat'
dayjs.extend(utc)
dayjs.extend(advancedFormat)
dayjs.extend(timezone)
dayjs.extend(isLeapYear)
dayjs.extend(duration)
+dayjs.extend(customParseFormat)
export { dayjs }
diff --git a/services/app-web/src/common-code/healthPlanFormDataType/StateCodeType.ts b/services/app-web/src/common-code/healthPlanFormDataType/StateCodeType.ts
index 5b4071018f..d450396caf 100644
--- a/services/app-web/src/common-code/healthPlanFormDataType/StateCodeType.ts
+++ b/services/app-web/src/common-code/healthPlanFormDataType/StateCodeType.ts
@@ -17,6 +17,7 @@ const StateCodes = [
'IL',
'IN',
'KS',
+ 'KY',
'LA',
'MA',
'MD',
@@ -53,7 +54,7 @@ const StateCodes = [
'WY',
] as const
-type StateCodeType = typeof StateCodes[number] // iterable union type
+type StateCodeType = (typeof StateCodes)[number] // iterable union type
function isValidStateCode(
maybeStateCode: string
diff --git a/services/app-web/src/components/FilterAccordion/FilterAccordion.module.scss b/services/app-web/src/components/FilterAccordion/FilterAccordion.module.scss
index f304ea33cd..52a81d5a39 100644
--- a/services/app-web/src/components/FilterAccordion/FilterAccordion.module.scss
+++ b/services/app-web/src/components/FilterAccordion/FilterAccordion.module.scss
@@ -1,13 +1,6 @@
@import '../../styles/uswdsImports.scss';
@import '../../styles/custom.scss';
-.filters {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- column-gap: 24px;
- row-gap: 24px;
-}
-
.filterTitle {
font-weight: bold;
}
@@ -22,5 +15,6 @@
.filterAccordion {
[class*='usa-accordion__content'] {
background: $cms-color-gray-lightest;
+ overflow: visible;
}
}
diff --git a/services/app-web/src/components/FilterAccordion/FilterAccordion.tsx b/services/app-web/src/components/FilterAccordion/FilterAccordion.tsx
index 1440435fd6..da93e046c0 100644
--- a/services/app-web/src/components/FilterAccordion/FilterAccordion.tsx
+++ b/services/app-web/src/components/FilterAccordion/FilterAccordion.tsx
@@ -29,7 +29,7 @@ export const FilterAccordion = ({
headingLevel: 'h4',
content: (
<>
-
{childFilters}
+ {childFilters}