Skip to content

Commit

Permalink
Merge pull request #612 from masslight/499/editable
Browse files Browse the repository at this point in the history
makes npi and phone number editable for employees
  • Loading branch information
GiladSchneider authored Nov 21, 2024
2 parents 17b3ae7 + f2b2c88 commit afa762e
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 30 deletions.
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
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,
};
}

0 comments on commit afa762e

Please sign in to comment.