Skip to content

Commit

Permalink
Merge pull request #618 from masslight/release/rubicon
Browse files Browse the repository at this point in the history
Release/rubicon
  • Loading branch information
GiladSchneider authored Nov 25, 2024
2 parents 43d46cb + 0d9b12c commit a010eed
Show file tree
Hide file tree
Showing 26 changed files with 226 additions and 58 deletions.
4 changes: 1 addition & 3 deletions .github/workflows/build-and-deploy-telemed-ehr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@ on:
type: choice
default: 'development'
options:
- development
- dev2
- development
- testing
- staging
incrementVersion:
description: 'Bump Version?'
type: boolean
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/build-and-deploy-telemed-intake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ on:
default: 'development'
options:
- development
- dev2
- testing
- staging
incrementVersion:
description: 'Bump Version?'
type: boolean
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ jobs:
- name: Set the urgent-care-intake/zambdas/.env/development.json
run: cp packages/urgent-care-intake/zambdas/.env/local.template.json packages/urgent-care-intake/zambdas/.env/development.json

- name: Set the telemed-ehr/zambdas/.env/testing.json
run: cp packages/telemed-ehr/zambdas/.env/local.template.json packages/telemed-ehr/zambdas/.env/testing.json

- name: Set the telemed-intake/zambdas/.env/testing.json
run: cp packages/telemed-intake/zambdas/.env/local.template.json packages/telemed-intake/zambdas/.env/testing.json

- id: get-store-path
run: echo STORE_PATH=$(pnpm store path) >> $GITHUB_OUTPUT

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ottehr",
"version": "0.17.0",
"version": "0.18.0",
"private": true,
"scripts": {
"test": "pnpm recursive run test",
Expand Down
2 changes: 1 addition & 1 deletion packages/ehr-utils/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ehr-utils",
"private": true,
"version": "0.17.0",
"version": "0.18.0",
"main": "lib/main.ts",
"types": "lib/main.ts",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/ottehr-components/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ottehr-components",
"private": true,
"version": "0.17.0",
"version": "0.18.0",
"main": "lib/main.ts",
"types": "lib/main.ts",
"scripts": {
Expand Down
5 changes: 3 additions & 2 deletions packages/telemed-ehr/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "telemed-ehr-app",
"version": "0.17.0",
"version": "0.18.0",
"private": true,
"browserslist": {
"production": [
Expand Down Expand Up @@ -30,6 +30,7 @@
"test": "react-scripts test",
"eject": "react-scripts eject",
"deploy:development": " PREFIX=development CLOUDFRONT_ID=E10TA6FN58D1OS ENV=development pnpm run ci-deploy-skeleton",
"deploy:testing": " PREFIX=testing CLOUDFRONT_ID=ETFAEVC5V0490 ENV=testing pnpm run ci-deploy-skeleton",
"ci-deploy-skeleton": "ENV=${ENV} VITE_APP_SHA=${GIT_HEAD:-$(git rev-parse --short HEAD)} VITE_APP_VERSION=$(node -pe 'require(\"./package.json\").version') pnpm run build:${ENV} && aws s3 sync build/ s3://ehr.ottehr.com --region us-east-1 --delete && aws cloudfront create-invalidation --distribution-id ${CLOUDFRONT_ID} --paths '/*' --region us-east-1"
},
"dependencies": {
Expand Down Expand Up @@ -62,4 +63,4 @@
"@types/styled-components": "^5.1.34",
"@types/react-page-visibility": "^6.4.4"
}
}
}
79 changes: 52 additions & 27 deletions packages/telemed-ehr/app/src/components/EmployeeInformationForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ interface EmployeeForm {
lastName: string;
nameSuffix: string;
roles: string[];
phoneNumber: string;
npi: string;
}

const AVAILABLE_ROLES: {
Expand Down Expand Up @@ -150,22 +152,6 @@ export default function EmployeeInformationForm({

console.log('existingUser', existingUser);

let npiText = 'n/a';
if (existingUser?.profileResource?.identifier) {
const npi = existingUser.profileResource.identifier.find((identifier) => identifier.system === FHIR_IDENTIFIER_NPI);
if (npi && npi.value) {
npiText = npi.value;
}
}

let phoneText = '';
if (existingUser?.profileResource?.telecom) {
const phone = existingUser.profileResource.telecom.find((tel) => tel.system === 'sms')?.value;
if (phone) {
phoneText = phone;
}
}

let photoSrc = '';
if (existingUser?.profileResource?.photo) {
const photo = existingUser.profileResource.photo[0];
Expand Down Expand Up @@ -201,6 +187,26 @@ export default function EmployeeInformationForm({
setValue('middleName', middleName);
setValue('lastName', lastName);
setValue('nameSuffix', nameSuffix);

let phoneText = '';
if (existingUser?.profileResource?.telecom) {
const phone = existingUser.profileResource.telecom.find((tel) => tel.system === 'sms')?.value;
if (phone) {
phoneText = phone;
}
}
setValue('phoneNumber', phoneText);

let npiText = 'n/a';
if (existingUser?.profileResource?.identifier) {
const npi = existingUser.profileResource.identifier.find(
(identifier) => identifier.system === FHIR_IDENTIFIER_NPI,
);
if (npi && npi.value) {
npiText = npi.value;
}
}
setValue('npi', npiText);
}
}, [existingUser, setValue]);

Expand Down Expand Up @@ -229,6 +235,8 @@ export default function EmployeeInformationForm({
nameSuffix: data.nameSuffix,
selectedRoles: data.roles,
licenses: newLicenses,
phoneNumber: data.phoneNumber,
npi: data.npi,
});
} catch (error) {
console.log(`Failed to update user: ${error}`);
Expand Down Expand Up @@ -334,16 +342,19 @@ export default function EmployeeInformationForm({
disabled: true,
}}
/>
<TextField
id="outlined-read-only-input"
label="Phone"
value={phoneText}
sx={{ marginBottom: 2, width: '100%' }}
margin="dense"
InputProps={{
readOnly: true,
disabled: true,
}}
<Controller
name="phoneNumber"
control={control}
render={({ field: { onChange, value } }) => (
<TextField
id="phone-number-input"
label="Phone"
value={value || ''}
onChange={onChange}
sx={{ marginBottom: 2, width: '100%' }}
margin="dense"
/>
)}
/>

<FormControl sx={{ width: '100%' }} error={errors.roles}>
Expand Down Expand Up @@ -420,7 +431,21 @@ export default function EmployeeInformationForm({
/>
)}
/>
<label style={{ margin: '15px 0' }}>NPI: {npiText}</label>
<Controller
name="npi"
control={control}
render={({ field: { onChange, value } }) => (
<TextField
id="npi-input"
label="NPI"
required={true}
value={value || ''}
onChange={onChange}
sx={{ marginTop: 2, marginBottom: 2, width: '100%' }}
margin="dense"
/>
)}
/>
</FormControl>
{isProviderRoleSelected && (
<>
Expand Down
2 changes: 2 additions & 0 deletions packages/telemed-ehr/app/src/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ export interface UpdateUserParameters {
nameSuffix?: string;
selectedRoles?: string[] | undefined;
licenses?: PractitionerLicense[];
phoneNumber?: string;
npi?: string;
// locations: Location[];
}

Expand Down
2 changes: 1 addition & 1 deletion packages/telemed-ehr/zambdas/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "telemed-ehrzambdas",
"version": "0.17.0",
"version": "0.18.0",
"private": true,
"scripts": {
"start": "npm run start:local",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import devConfig from '../.env/development.json';
// import testingConfig from '../.env/testing.json';
import testingConfig from '../.env/testing.json';
import { getAuth0Token } from '../src/shared';
import { ZambdaClient } from '@zapehr/sdk';

Expand Down Expand Up @@ -37,9 +37,9 @@ const main = async (): Promise<void> => {
case 'development':
await setupSecrets(devConfig);
break;
// case 'testing':
// await setupSecrets(testingConfig);
// break;
case 'testing':
await setupSecrets(testingConfig);
break;
default:
throw new Error('¯\\_(ツ)_/¯ environment must match a valid zapEHR environment.');
}
Expand Down
2 changes: 1 addition & 1 deletion packages/telemed-ehr/zambdas/src/get-appointments/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ export const index = async (input: ZambdaInput): Promise<APIGatewayProxyResult>
const healthcareServiceIdToResourceMap: Record<string, HealthcareService> = {};

searchResultsForSelectedDate.forEach((resource) => {
if (resource.resourceType === 'Appointment') {
if (resource.resourceType === 'Appointment' && (resource as Appointment).serviceType?.[0]?.text === 'in-person') {
allAppointments.push(resource as Appointment);
} else if (resource.resourceType === 'Patient' && resource.id) {
patientIdMap[resource.id] = resource as Patient;
Expand Down
32 changes: 30 additions & 2 deletions packages/telemed-ehr/zambdas/src/update-user/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { APIGatewayProxyResult } from 'aws-lambda';
import { Practitioner, HumanName } from 'fhir/r4';
import { PractitionerLicense, Secrets } from 'ehr-utils';
import { FHIR_IDENTIFIER_NPI, PractitionerLicense, Secrets } from 'ehr-utils';
import { RoleType } from '../../../app/src/types/types';
import { getSecret } from '../shared';
import { topLevelCatch } from '../shared/errors';
Expand All @@ -19,6 +19,8 @@ export interface UpdateUserInput {
nameSuffix?: string;
selectedRoles?: RoleType[];
licenses?: PractitionerLicense[];
phoneNumber?: string;
npi?: string;
}

let m2mtoken: string;
Expand All @@ -27,7 +29,7 @@ export const index = async (input: ZambdaInput): Promise<APIGatewayProxyResult>
console.group('validateRequestParameters');
const validatedParameters = validateRequestParameters(input);
console.log('validatedParameters:', JSON.stringify(validatedParameters, null, 4));
const { secrets, userId, firstName, middleName, lastName, nameSuffix, selectedRoles, licenses } =
const { secrets, userId, firstName, middleName, lastName, nameSuffix, selectedRoles, licenses, phoneNumber, npi } =
validatedParameters;
console.groupEnd();
console.debug('validateRequestParameters success');
Expand Down Expand Up @@ -98,14 +100,40 @@ export const index = async (input: ZambdaInput): Promise<APIGatewayProxyResult>
id: practitionerId,
name: name ? [name] : undefined,
qualification: practitionerQualificationExtension,
telecom: phoneNumber ? [{ system: 'sms', value: phoneNumber }] : undefined,
});
} else {
const existingTelecom = existingPractitionerResource.telecom || [];
const smsIndex = existingTelecom.findIndex((tel) => tel.system === 'sms');
const updatedTelecom = [...existingTelecom];
if (phoneNumber) {
if (smsIndex >= 0) {
updatedTelecom[smsIndex] = { system: 'sms', value: phoneNumber };
} else {
updatedTelecom.push({ system: 'sms', value: phoneNumber });
}
}
if (npi) {
if (!existingPractitionerResource.identifier) {
existingPractitionerResource.identifier = [];
}
const npiIndex = existingPractitionerResource.identifier.findIndex((id) => id.system === FHIR_IDENTIFIER_NPI);
if (npiIndex >= 0) {
existingPractitionerResource.identifier[npiIndex].value = npi;
} else {
existingPractitionerResource.identifier.push({
system: FHIR_IDENTIFIER_NPI,
value: npi,
});
}
}
await fhirClient.updateResource({
...existingPractitionerResource,
identifier: existingPractitionerResource.identifier,
photo: existingPractitionerResource.photo,
name: name ? [name] : undefined,
qualification: practitionerQualificationExtension,
telecom: updatedTelecom,
});
}
} catch (error: unknown) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ export function validateRequestParameters(input: ZambdaInput): UpdateUserInput {
throw new Error('No request body provided');
}

const { userId, firstName, middleName, lastName, nameSuffix, selectedRoles, licenses } = JSON.parse(input.body);
const { userId, firstName, middleName, lastName, nameSuffix, selectedRoles, licenses, phoneNumber, npi } = JSON.parse(
input.body,
);

if (
userId === undefined
Expand Down Expand Up @@ -36,5 +38,7 @@ export function validateRequestParameters(input: ZambdaInput): UpdateUserInput {
licenses,
// locations,
secrets: input.secrets,
phoneNumber: phoneNumber ? phoneNumber.trim() : phoneNumber,
npi: npi ? npi.trim() : npi,
};
}
6 changes: 4 additions & 2 deletions packages/telemed-intake/app/package.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
{
"name": "telemed-intake-app",
"private": true,
"version": "0.17.0",
"version": "0.18.0",
"type": "module",
"scripts": {
"start:local": "vite",
"build:development": "tsc && vite build --mode development",
"build:testing": "tsc && vite build --mode testing",
"build": "tsc && vite build",
"deploy:development": "ENV=development PREFIX=development CLOUDFRONT_ID=EIYX001DGGQK8 pnpm run ci-deploy-skeleton",
"deploy:testing": "ENV=testing PREFIX=testing CLOUDFRONT_ID=E2IMNWB48TKHJO pnpm run ci-deploy-skeleton",
"ci-deploy-skeleton": "ENV=${ENV} VITE_APP_SHA=${GIT_HEAD:-$(git rev-parse --short HEAD)} VITE_APP_VERSION=$(node -pe 'require(\"./package.json\").version') pnpm run build:${ENV} && aws s3 sync build/ s3://telemed.ottehr.com --region us-east-1 --delete && aws cloudfront create-invalidation --distribution-id ${CLOUDFRONT_ID} --paths '/*' --region us-east-1"
},
"dependencies": {
Expand All @@ -23,4 +25,4 @@
"devDependencies": {
"@types/styled-components": "^5.1.34"
}
}
}
4 changes: 4 additions & 0 deletions packages/telemed-intake/app/src/components/VideoControls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@ import { CallSettingsTooltip } from './CallSettingsTooltip';
import { useVideoCallStore } from '../features/video-call';
import { otherColors } from '../IntakeThemeProvider';
import { CallSettings } from './CallSettingsDialog';
import { useNavigate } from 'react-router-dom';
import { IntakeFlowPageRoute } from 'src/App';

export const VideoControls: FC = () => {
const { toggleVideo, isVideoEnabled } = useLocalVideo();
const { muted, toggleMute } = useToggleLocalMute();
const navigate = useNavigate();

const meetingManager = useMeetingManager();
const [isSettingsOpen, setIsSettingsOpen] = useState(false);
Expand Down Expand Up @@ -46,6 +49,7 @@ export const VideoControls: FC = () => {
const disconnect = async (): Promise<void> => {
await cleanup();
useVideoCallStore.setState({ meetingData: null });
navigate(IntakeFlowPageRoute.PatientPortal.path);
};

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ interface AppointmentState {
providerID?: string;
groupID?: string;
scheduleType?: 'location' | 'provider';
slug?: string;
}

const APOINTMENT_STATE_INITIAL: AppointmentState = {};
Expand Down
Loading

0 comments on commit a010eed

Please sign in to comment.