diff --git a/packages/backend/src/apps/cms-healthcare/actions/health-plans/index.js b/packages/backend/src/apps/cms-healthcare/actions/health-plans/index.js new file mode 100644 index 0000000000..2a6ed1e27e --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/actions/health-plans/index.js @@ -0,0 +1,132 @@ +import defineAction from '../../../../helpers/define-action.js'; + + const setDependents = (defaultPersonKeys, dependent,people) => { + people.push({ + ...defaultPersonKeys, + age: Number(dependent.age), + gender: dependent.gender, + }); + }; +export default defineAction({ + name: 'Health Plans', + key: 'healthPlans', + description: 'Search for health Plans ', + arguments: [ + { + label: 'Zip Code', + key: 'zipCode', + type: 'string', + required: true, + description: '', + }, + { + label: 'Your Age', + key: 'age', + type: 'string', + required: true, + }, + { + label: 'Select Gender', + key: 'gender', + type: 'dropdown', + options: [ + { label: 'Male', value: 'Male' }, + { label: 'Female', value: 'Female' }, + ], + required: true, + }, + { + label: 'Whose in your house hold', + key: 'houseHolds', + type: 'dropdown', + options: [ + { label: 'Just You', value: 'Just You' }, + { label: 'You and other people', value: 'You and other people' }, + ], + required: true, + description: + 'Your household includes you, your spouse if you’re married, and everyone you’ll claim as a dependent on your tax return. Include them all, even if they dont need coveragge', + additionalFields: { + type: 'query', + name: 'getDynamicFields', + arguments: [ + { + name: 'key', + value: 'listHouseholds', + }, + { + name: 'parameters.houseHolds', + value: '{parameters.houseHolds}', + }, + ], + }, + }, + { + label: 'Income', + key: 'income', + type: 'string', + required: true, + description: + 'What do you think your household income will be in current year?', + }, + ], + + + async run($) { + const defaultPersonKeys = { + aptc_eligible: true, + has_mec: false, + is_pregnant: false, + is_parent: false, + uses_tobacco: false, + utilization_level: 'Low', + }; + const locationResp = await $.http.get( + `counties/by/zip/${$.step.parameters.zipCode}` + ); + const people = [ + { + ...defaultPersonKeys, + age: Number($.step.parameters.age), + gender: $.step.parameters.gender, + }, + ]; + if ($.step.parameters.dependents && $.step.parameters.claimTax === 'yes') { + $.step.parameters.dependents.forEach((dependent) => { + setDependents(defaultPersonKeys,dependent,people); + }); + } + if ($.step.parameters.marriedStatus === 'yes') { + setDependents( + defaultPersonKeys, + { + age: $.step.parameters.supposeAge, + gender: $.step.parameters.supposeGender, + }, + people + ); + } + const body = { + household: { + income: parseFloat($.step.parameters.income), + people, + has_married_couple: $.step.parameters.marriedStatus === 'yes', + }, + market: 'Individual', + place: { + countyfips: locationResp.data.counties[0].fips, + state: locationResp.data.counties[0].state, + zipcode: locationResp.data.counties[0].zipcode, + }, + limit: 50, + offset: 0, + order: 'asc', + year: new Date().getFullYear(), + }; + const getPlans = await $.http.post(`plans/search`, body); + + $.setActionItem({ + raw: getPlans.data, + }); + }, +}); diff --git a/packages/backend/src/apps/cms-healthcare/actions/index.js b/packages/backend/src/apps/cms-healthcare/actions/index.js new file mode 100644 index 0000000000..eb0553439d --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/actions/index.js @@ -0,0 +1,3 @@ +import healthPlans from "./health-plans/index.js"; + +export default[healthPlans] \ No newline at end of file diff --git a/packages/backend/src/apps/cms-healthcare/assets/favicon.svg b/packages/backend/src/apps/cms-healthcare/assets/favicon.svg new file mode 100644 index 0000000000..047f0acc40 --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/assets/favicon.svg @@ -0,0 +1,16 @@ + + + + + Developer + + + \ No newline at end of file diff --git a/packages/backend/src/apps/cms-healthcare/auth/index.js b/packages/backend/src/apps/cms-healthcare/auth/index.js new file mode 100644 index 0000000000..c53eff9a32 --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/auth/index.js @@ -0,0 +1,33 @@ +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; + +export default { + fields: [ + { + key: 'screenName', + label: 'Screen Name', + type: 'string', + required: true, + readOnly: false, + value: null, + placeholder: null, + description: + 'Screen name of your connection to be used on Automatisch UI.', + clickToCopy: false, + }, + { + key: 'apiKey', + label: 'API Key', + type: 'string', + required: true, + readOnly: false, + value: null, + placeholder: null, + description: 'CMS Healthcare API key of your account.', + clickToCopy: false, + }, + ], + + verifyCredentials, + isStillVerified, +}; diff --git a/packages/backend/src/apps/cms-healthcare/auth/is-still-verified.js b/packages/backend/src/apps/cms-healthcare/auth/is-still-verified.js new file mode 100644 index 0000000000..6663679aab --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/cms-healthcare/auth/verify-credentials.js b/packages/backend/src/apps/cms-healthcare/auth/verify-credentials.js new file mode 100644 index 0000000000..da8a91aebd --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/auth/verify-credentials.js @@ -0,0 +1,9 @@ +const verifyCredentials = async ($) => { + await $.http.get('counties/by/zip/27360'); + await $.auth.set({ + screenName: $.auth.data.screenName, + apiKey: $.auth.data.apiKey, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/cms-healthcare/common/add-auth-header.js b/packages/backend/src/apps/cms-healthcare/common/add-auth-header.js new file mode 100644 index 0000000000..7477b2b7bf --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/common/add-auth-header.js @@ -0,0 +1,11 @@ +const addAuthHeader = ($, requestConfig) => { + if ($.auth.data?.apiKey) { + requestConfig.params = { + ...requestConfig.params, + apikey: $.auth.data.apiKey, + }; + } + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/cms-healthcare/dynamic-fields/index.js b/packages/backend/src/apps/cms-healthcare/dynamic-fields/index.js new file mode 100644 index 0000000000..a663703bb0 --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/dynamic-fields/index.js @@ -0,0 +1,5 @@ +import listDependents from './list-dependents/index.js'; +import listHouseholds from './list-households/index.js'; +import listSuppose from './list-suppose/index.js'; + +export default [listHouseholds,listDependents,listSuppose]; diff --git a/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-dependents/index.js b/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-dependents/index.js new file mode 100644 index 0000000000..2714bfebec --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-dependents/index.js @@ -0,0 +1,40 @@ +export default { + name: 'List of Dependents', + key: 'listDependents', + + async run($) { + const dependents = $.step.parameters.claimTax === 'yes'; + if (dependents) { + return [ + { + label: 'Dependents', + key: 'dependents', + type: 'dynamic', + required: false, + description: '', + fields: [ + { + label: 'Age', + key: 'age', + type: 'string', + required: false, + dependsOn: ['parameters.dependents'], + }, + { + label: 'Select Dependent Gender', + key: 'gender', + type: 'dropdown', + required: false, + options: [ + { label: 'Male', value: 'Male' }, + { label: 'Female', value: 'Female' }, + ], + dependsOn: ['parameters.dependents'], + }, + ], + }, + ]; + } +} + +} diff --git a/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-households/index.js b/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-households/index.js new file mode 100644 index 0000000000..f585b9e42f --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-households/index.js @@ -0,0 +1,63 @@ +export default { + name: 'List of Households', + key: 'listHouseholds', + + async run($) { + const youAndOthers = $.step.parameters.houseHolds === 'You and other people'; + if(youAndOthers){ + return [ + { + label: 'Are you married', + key: 'marriedStatus', + type: 'dropdown', + options: [ + { label: 'Yes', value: 'yes' }, + { label: 'No', value: 'No' }, + ], + description: + 'Answer “Yes” if legally married. Answer “No” if divorced, legally separated, unmarried and living together, or widowed.', + required: true, + additionalFields: { + type: 'query', + name: 'getDynamicFields', + arguments: [ + { + name: 'key', + value: 'listSuppose', + }, + { + name: 'parameters.marriedStatus', + value: '{parameters.marriedStatus}', + }, + ], + }, + }, + { + label: 'Claim dependent fedral tax return', + key: 'claimTax', + type: 'dropdown', + options: [ + { label: 'Yes', value: 'yes' }, + { label: 'No', value: 'No' }, + ], + description: `Include anyone who you'll claim as a tax dependent in 2025. Include them even if they don’t need health coverage. Don't count yourself or your spouse as a dependent.`, + required: false, + additionalFields: { + type: 'query', + name: 'getDynamicFields', + arguments: [ + { + name: 'key', + value: 'listDependents', + }, + { + name: 'parameters.claimTax', + value: '{parameters.claimTax}', + }, + ], + }, + }, + ]; + } + }, +}; diff --git a/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-suppose/index.js b/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-suppose/index.js new file mode 100644 index 0000000000..86905c8cec --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/dynamic-fields/list-suppose/index.js @@ -0,0 +1,30 @@ +export default { + name: 'List of Suppose', + key: 'listSuppose', + + async run($) { + const isMarried = $.step.parameters.marriedStatus === 'yes' + if(isMarried){ + return [ + { + label: 'Age', + key: 'supposeAge', + type: 'string', + required: false, + description: 'Enter your suppose age' + }, + { + label: 'Select Dependent Gender', + key: 'supposeGender', + type: 'dropdown', + required: false, + options: [ + { label: 'Male', value: 'Male' }, + { label: 'Female', value: 'Female' }, + ], + description: 'Enter your suppose gender' + }, + ]; + } + }, +}; diff --git a/packages/backend/src/apps/cms-healthcare/index.js b/packages/backend/src/apps/cms-healthcare/index.js new file mode 100644 index 0000000000..81f9d60697 --- /dev/null +++ b/packages/backend/src/apps/cms-healthcare/index.js @@ -0,0 +1,20 @@ +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import dynamicFields from './dynamic-fields/index.js'; +import actions from './actions/index.js'; + +export default defineApp({ + name: 'CMS Healthcare', + key: 'cms-healthcare', + iconUrl: '{BASE_URL}/apps/cms-healthcare/assets/favicon.svg', + authDocUrl: '', + supportsConnections: true, + baseUrl: 'https://marketplace.api.healthcare.gov/', + apiBaseUrl: 'https://marketplace.api.healthcare.gov/api/v1/', + primaryColor: '#6f42c1', + beforeRequest: [addAuthHeader], + auth, + actions, + dynamicFields, +});