Robert Hebert

May 12, 20237 min

How we automated an in-person patient intake process

Who is our client and what problem did they want to solve?

The RHM team had the opportunity to work with a customer in the medical field. Our client needed us to develop an online patient intake process. Our mission was to digitize what was previously an in-person, manual process.

What solution did we provide?

Our client wanted the new digital process to allow the patient to take an online questionnaire. Based on the answers they provided they could be registered as a new patient and then contacted by staff. Alternatively, they could also be informed if the company did not provide care at the level they needed, or if they needed more information about the patient and would be in contact.

After a successfully filled out and submitted form, the patient's answers and information were saved to a Wix Content Manager database. The information was then transformed into a PDF and attached to an email. The email was sent to the email address the company uses to gather patient intake data.

How did we do it?

To do this, we used two different integrations. One was with SendGrid, a service that allows you to send custom emails. And PDF Generator API, a service that allows you to design a PDF template in a WYSIWYG editor and then send the service data and it will generate a PDF based on the template you designed and send you the data back in a format you can attach to a SendGrid email.

Prior to finding PDF Generator API, we were unable to create integrations where we send customized emails with custom PDFs, but now, it's just one of the many services we can offer.

Check out the code we used below:


 
import { insertNewPatientIntake } from "backend/NewPatientIntake";
 
import { generatePDFAndSendEmail } from "backend/EmailAndPDF";
 

 
import wixWindow from "wix-window";
 
import wixLocation from "wix-location";
 

 
$w.onReady(function () {
 
const formFactor = wixWindow.formFactor;
 
const statebox = $w("#statebox");
 
const continueButton = $w("#continueButton");
 
const startUploadButton = $w("#startUpload");
 
const backButton = $w("#backButton");
 

 
let stateNumber = 1;
 

 
const redFlags = {
 
six: false,
 
nine: false,
 
eleven: false,
 
thirteen: false,
 
};
 

 
const orangeFlags = {
 
six: false,
 
twelve: false,
 
thirteen: false,
 
};
 

 
let paymentType = "";
 

 
const patientIntake = {
 
firstName: "N/A",
 
lastName: "N/A",
 
preferredName: "N/A",
 
pronouns: "N/A",
 
email: "N/A",
 
phoneNumber: "N/A",
 
gender: "N/A",
 
dob: "N/A",
 
addressLine1: "N/A",
 
addressLine2: "N/A",
 
city: "N/A",
 
state: "N/A",
 
zipCode: "N/A",
 
currentPsychiatricCare: "N/A",
 
patientSeekingServices: "N/A",
 
patientMainConcern: "N/A",
 
patientDiagnoses: "N/A",
 
patientSuicidalThought: "N/A",
 
patientSuicidalPlan: "N/A",
 
insurer: "N/A",
 
selfPay: "false",
 
exitQuestionnaire: false,
 
patientSixteenYearsOrYounger: "N/A",
 
isPatientTakingPrescriptions: "N/A",
 
patientPrescriptions: "N/A",
 
patientRedflagMedications: "N/A",
 
weeklyAlcoholicBeverages: "N/A",
 
nonPrescribedDrugsUsed: "N/A",
 
otherNonPrescribedDrugsUsed: "N/A",
 
wasPatientRequiredToStayOvernightAtHospitalDueToMentalHealth: "N/A",
 
patientOvernightHospitalStayExplanation: "N/A",
 
possibleRedFlagBehaviors: "N/A",
 
patientProviderPreference: "N/A",
 
insuranceFullName: "N/A",
 
insuranceDob: "N/A",
 
insurancePolicyId: "N/A",
 
relationToPatient: "N/A",
 
insuranceCardImageFront: null,
 
insuranceCardImageBack: null,
 
};
 

 
// state 3 input
 

 
const currentPsychiatricCareInput = $w("#state3Input");
 

 
currentPsychiatricCareInput.onChange((e) => {
 
patientIntake.currentPsychiatricCare = e.target.value;
 
});
 

 
// state 4 input
 

 
const patientSeekingServicesInput = $w("#state4Input");
 
const patientSeekingServicesTextbox = $w("#state4TextBox");
 

 
patientSeekingServicesInput.onChange((e) => {
 
patientIntake.patientSeekingServices = e.target.value;
 
});
 

 
patientSeekingServicesTextbox.onChange((e) => {
 
patientIntake.patientSeekingServices.push(e.target.value);
 
});
 

 
// state 5 input
 

 
const patientMainConcernTextbox = $w("#state5TextBox");
 

 
patientMainConcernTextbox.onChange((e) => {
 
patientIntake.patientMainConcern = e.target.value;
 
});
 

 
const patientDiagnosesInput = $w("#state5Input");
 

 
patientDiagnosesInput.onChange((e) => {
 
patientIntake.patientDiagnoses = e.target.value;
 
});
 

 
// state 6 input
 

 
const patientSuicidalThoughtInput = $w("#state6Input");
 

 
patientSuicidalThoughtInput.onChange((e) => {
 
patientIntake.patientSuicidalThought = e.target.value;
 
});
 
const patientSuicidalPlanInput = $w("#state6AdditionalInput");
 

 
patientSuicidalPlanInput.onChange((e) => {
 
patientIntake.patientSuicidalPlan = e.target.value;
 
});
 

 
// state 7 input
 

 
const insurerInput = $w("#insurerDropdown");
 

 
insurerInput.onChange((e) => {
 
patientIntake.insurer = e.target.value;
 
});
 

 
const selfPayCheckbox = $w("#selfPayCheckbox");
 

 
selfPayCheckbox.onChange((e) => {
 
patientIntake.insurer = "N/A";
 
patientIntake.selfPay = "true";
 
});
 

 
const exitQuestionnaireCheckbox = $w("#exitQuestionnaireCheckbox");
 

 
exitQuestionnaireCheckbox.onChange((e) => {
 
patientIntake.exitQuestionnaire = true;
 
wixLocation.to(`${wixLocation.baseUrl}`);
 
});
 

 
// state 8 input
 
const patientSixteenYearsOrYoungerInput = $w("#state8Input");
 

 
patientSixteenYearsOrYoungerInput.onChange((e) => {
 
patientIntake.patientSixteenYearsOrYounger = e.target.value;
 
});
 

 
// state 9 input
 

 
const isPatientTakingPrescriptionsInput = $w("#state9RadioInput");
 

 
isPatientTakingPrescriptionsInput.onChange((e) => {
 
patientIntake.isPatientTakingPrescriptions = e.target.value;
 
});
 

 
const patientPrescriptionsTextbox = $w("#prescriptionList");
 

 
patientPrescriptionsTextbox.onChange((e) => {
 
patientIntake.patientPrescriptions = e.target.value;
 
});
 

 
const patientRedflagMedicationsInput = $w("#state9Input2");
 

 
patientRedflagMedicationsInput.onChange((e) => {
 
patientIntake.patientRedflagMedications = e.target.value;
 
});
 

 
// state 10 input
 

 
const weeklyAlcoholicBeveragesInput = $w("#state10Input");
 

 
weeklyAlcoholicBeveragesInput.onChange((e) => {
 
patientIntake.weeklyAlcoholicBeverages = e.target.value;
 
});
 

 
// state 11 input
 

 
const nonPrescribedDrugsUsedInput = $w("#state11Input");
 

 
nonPrescribedDrugsUsedInput.onChange((e) => {
 
patientIntake.nonPrescribedDrugsUsed = e.target.value;
 
});
 

 
const otherNonPrescribedDrugsUsed = $w("#state11TextBox");
 

 
otherNonPrescribedDrugsUsed.onChange((e) => {
 
patientIntake.otherNonPrescribedDrugsUsed = e.target.value;
 
});
 

 
// state 12 input
 

 
const wasPatientRequiredToStayOvernightAtHospitalDueToMentalHealthInput =
 
$w("#state12Input");
 

 
wasPatientRequiredToStayOvernightAtHospitalDueToMentalHealthInput.onChange(
 
(e) => {
 
patientIntake.wasPatientRequiredToStayOvernightAtHospitalDueToMentalHealth =
 
e.target.value;
 
}
 
);
 

 
const patientOvernightHospitalStayExplanation = $w("#state12TextBox");
 

 
patientOvernightHospitalStayExplanation.onChange((e) => {
 
patientIntake.patientOvernightHospitalStayExplanation = e.target.value;
 
});
 

 
// state 13 input
 

 
const possibleRedFlagBehaviorsInput = $w("#state13Input");
 

 
possibleRedFlagBehaviorsInput.onChange((e) => {
 
patientIntake.possibleRedFlagBehaviors = e.target.value;
 
});
 

 
// state 14 input
 

 
const patientProviderPreferenceInput = $w("#state14Input");
 

 
patientProviderPreferenceInput.onChange((e) => {
 
patientIntake.patientProviderPreference = e.target.value;
 
});
 

 
// state 15 inputs
 

 
const firstNameInput = $w("#firstName");
 
const lastNameInput = $w("#lastName");
 
const preferredNameInput = $w("#preferredName");
 
const pronounsInput = $w("#pronouns");
 
const emailInput = $w("#email");
 
const phoneNumberInput = $w("#phoneNumber");
 
const genderInput = $w("#gender");
 
const dobInput = $w("#dob");
 

 
// state 16 inputs
 

 
const addressLine1Input = $w("#addressLine1");
 
const addressLine2Input = $w("#addressLine2");
 
const cityInput = $w("#city");
 
const stateInput = $w("#state");
 
const zipCodeInput = $w("#zipCode");
 

 
const inputs = [
 
firstNameInput,
 
lastNameInput,
 
preferredNameInput,
 
pronounsInput,
 
emailInput,
 
phoneNumberInput,
 
genderInput,
 
dobInput,
 
addressLine1Input,
 
addressLine2Input,
 
cityInput,
 
stateInput,
 
zipCodeInput,
 
];
 

 
inputs.forEach((input) => {
 
input.onChange((e) => {
 
if (e.target.id === "dob") {
 
patientIntake[e.target.id] = e.target.value.toISOString().split("T")[0];
 
} else {
 
patientIntake[e.target.id] = e.target.value;
 
}
 
});
 
});
 

 
// state 17 inputs
 

 
const insuranceFullName = $w("#insuranceFullName");
 
const relationToPatient = $w("#relationToPatient");
 
const insuranceDob = $w("#insuranceDob");
 
const insurancePolicyId = $w("#insurancePolicyId");
 

 
const insuranceCardFrontUpload = $w("#insuranceCardFrontUpload");
 
const insuranceCardBackUpload = $w("#insuranceCardBackUpload");
 

 
const insuranceInputs = [
 
insuranceFullName,
 
relationToPatient,
 
insuranceDob,
 
insurancePolicyId,
 
];
 

 
insuranceInputs.forEach((input) => {
 
input.onChange((e) => {
 
if (e.target.id === "insuranceDob") {
 
patientIntake[e.target.id] = e.target.value.toISOString().split("T")[0];
 
} else {
 
patientIntake[e.target.id] = e.target.value;
 
}
 
});
 
});
 

 
$w("#state2Input").onChange((e) => {
 
if (e.target.checked) {
 
continueButton.enable();
 
} else {
 
continueButton.disable();
 
}
 
});
 

 
$w("#state3Input").onChange((e) => {
 
if (e.target.value !== "") {
 
continueButton.enable();
 
} else {
 
continueButton.disable();
 
}
 
});
 

 
$w("#state4Input").onChange((e) => {
 
if (e.target.value.includes("Not Sure")) {
 
patientSeekingServicesTextbox.show();
 
} else if (e.target.value !== "") {
 
continueButton.enable();
 
} else {
 
patientSeekingServicesTextbox.hide();
 
continueButton.disable();
 
}
 
});
 

 
$w("#state4TextBox").onChange((e) => {
 
continueButton.enable();
 
});
 

 
$w("#state5TextBox").onChange((e) => {
 
if (e.target.value !== "") {
 
continueButton.enable();
 
} else {
 
continueButton.disable();
 
}
 
});
 

 
$w("#state6Input").onChange((e) => {
 
if (e.target.value === "Yes") {
 
$w("#state6AdditionalInputQuestion").show();
 
$w("#state6AdditionalInput").show();
 
} else {
 
orangeFlags.six = false;
 
redFlags.six = false;
 
$w("#state6AdditionalInputQuestion").hide();
 
$w("#state6AdditionalInput").hide();
 
continueButton.enable();
 
}
 
});
 

 
$w("#state6AdditionalInput").onChange((e) => {
 
if (e.target.value === "Yes") {
 
redFlags.six = true;
 
} else {
 
orangeFlags.six = true;
 
}
 

 
continueButton.enable();
 
});
 

 
$w("#insurerDropdown").onChange((e) => {
 
if (e.target.value !== "") {
 
continueButton.enable();
 
paymentType = "in_network";
 
}
 
});
 

 
$w("#selfPayCheckbox").onChange((e) => {
 
if (e.target.checked) {
 
continueButton.enable();
 
paymentType = "self_pay";
 
} else {
 
paymentType = "";
 
continueButton.disable();
 
}
 
});
 

 
$w("#state8Input").onChange((e) => {
 
if (e.target.value !== "") {
 
continueButton.enable();
 
}
 
});
 

 
$w("#state9RadioInput").onChange((e) => {
 
if (e.target.value === "Yes") {
 
$w("#prescriptionList").show();
 
$w("#prescriptionList").expand();
 
} else {
 
$w("#prescriptionList").hide();
 
$w("#prescriptionList").collapse();
 
}
 

 
if (e.target.value !== "" && $w("#state9Input2").value.length > 0) {
 
continueButton.enable();
 
}
 
});
 

 
$w("#state9Input2").onChange((e) => {
 
if (e.target.value.length > 0 && $w("#state9RadioInput").value !== "") {
 
continueButton.enable();
 
if (
 
e.target.value.includes("Clozapine") ||
 
e.target.value.includes("Methadone")
 
) {
 
redFlags.nine = true;
 
} else {
 
redFlags.nine = false;
 
}
 
}
 
});
 

 
$w("#state10Input").onChange((e) => {
 
if (e.target.value !== "") {
 
continueButton.enable();
 
}
 
});
 

 
$w("#state11Input").onChange((e) => {
 
if (e.target.value.length > 0) {
 
continueButton.enable();
 
}
 

 
if (
 
e.target.value.includes("Heroin (Opioids)") ||
 
e.target.value.includes("Cocaine (stimulants)") ||
 
e.target.value.includes("Meth") ||
 
e.target.value.includes("Hallucinogens") ||
 
e.target.value.includes("Benzodiazepines")
 
) {
 
redFlags.eleven = true;
 
} else {
 
redFlags.eleven = false;
 
}
 

 
if (e.target.value.includes("Other")) {
 
$w("#state11TextBox").show();
 
} else {
 
$w("#state11TextBox").hide();
 
}
 
});
 

 
$w("#state12Input").onChange((e) => {
 
if (e.target.value !== "") {
 
continueButton.enable();
 
}
 

 
if (e.target.value === "Yes") {
 
$w("#state12TextBox").show();
 
orangeFlags.twelve = true;
 
} else {
 
orangeFlags.twelve = false;
 
$w("#state12TextBox").hide();
 
}
 
});
 

 
$w("#state13Input").onChange((e) => {
 
if (e.target.value.length > 0) {
 
continueButton.enable();
 

 
if (e.target.value.includes("Aggressive behavior")) {
 
if (patientIntake.patientSixteenYearsOrYounger === "Yes") {
 
orangeFlags.thirteen = true;
 
} else {
 
redFlags.thirteen = true;
 
}
 
}
 
}
 
});
 

 
$w("#state14Input").onChange((e) => {
 
if (e.target.value.length > 0) {
 
continueButton.enable();
 
}
 
});
 

 
const state15Inputs = [
 
firstNameInput,
 
lastNameInput,
 
preferredNameInput,
 
pronounsInput,
 
emailInput,
 
phoneNumberInput,
 
genderInput,
 
dobInput,
 
];
 

 
const state16Inputs = [
 
addressLine1Input,
 
cityInput,
 
stateInput,
 
zipCodeInput,
 
];
 

 
const state17Inputs = [
 
insuranceFullName,
 
insuranceDob,
 
insurancePolicyId,
 
relationToPatient,
 
];
 

 
state15Inputs.forEach((input) => {
 
input.onChange((e) => {
 
if (checkToUnlockContinueButton(15)) {
 
continueButton.enable();
 
}
 
});
 
});
 

 
state16Inputs.forEach((input) => {
 
input.onChange((e) => {
 
if (checkToUnlockContinueButton(16)) {
 
continueButton.enable();
 
}
 
});
 
});
 

 
state17Inputs.forEach((input) => {
 
input.onChange((e) => {
 
if (checkToUnlockContinueButton(17)) {
 
continueButton.enable();
 
}
 
});
 
});
 

 
backButton.onClick((e) => {
 
stateNumber = 15;
 
statebox.changeState(`state${stateNumber}`);
 
});
 

 
insuranceCardFrontUpload.onChange((e) => {
 
if (e.target.value.length > 0) {
 
continueButton.disable();
 
startUploadButton.show();
 
} else {
 
if (insuranceCardBackUpload.value.length === 0) {
 
continueButton.enable();
 
startUploadButton.hide();
 
}
 
}
 
});
 

 
insuranceCardBackUpload.onChange((e) => {
 
if (e.target.value.length > 0) {
 
continueButton.disable();
 
startUploadButton.show();
 
} else {
 
if (insuranceCardFrontUpload.value.length === 0) {
 
continueButton.enable();
 
startUploadButton.hide();
 
}
 
}
 
});
 

 
startUploadButton.onClick(async () => {
 
if (insuranceCardFrontUpload.value.length > 0) {
 
const insuranceCardFrontURL = await insuranceCardFrontUpload
 
.uploadFiles()
 
.then((files) => files[0].fileUrl)
 
.catch((err) => err);
 
if (typeof insuranceCardFrontURL.errorCode === "undefined") {
 
patientIntake.insuranceCardImageFront = insuranceCardFrontURL;
 
}
 
}
 

 
if (insuranceCardBackUpload.value.length > 0) {
 
const insuranceCardBackURL = await insuranceCardBackUpload
 
.uploadFiles()
 
.then((files) => files[0].fileUrl)
 
.catch((err) => err);
 
if (typeof insuranceCardBackURL.errorCode === "undefined") {
 
patientIntake.insuranceCardImageBack = insuranceCardBackURL;
 
}
 
}
 

 
continueButton.enable();
 
});
 

 
continueButton.onClick(async () => {
 
stateNumber += 1;
 

 
if (formFactor !== "Desktop") {
 
statebox.scrollTo();
 
}
 

 
if (exitQuestionnaireCheckbox.checked) {
 
return wixLocation.to(`${wixLocation.baseUrl}`);
 
}
 

 
if (statebox.currentState.id === "state6") {
 
if (redFlags.six) {
 
continueButton.hide();
 
return statebox.changeState("redFlagSuicidal");
 
}
 
}
 

 
if (statebox.currentState.id === "state14") {
 
if (redFlags.nine || redFlags.eleven || redFlags.thirteen) {
 
continueButton.hide();
 
return statebox.changeState("redFlag");
 
}
 
}
 

 
if (statebox.currentState.id === "state16") {
 
$w(
 
"#nameText"
 
).text = `${patientIntake.firstName} ${patientIntake.lastName}`;
 
$w("#preferredNameText").text = `${patientIntake.preferredName}`;
 
$w("#emailText").text = patientIntake.email;
 
$w("#phoneNumberText").text = patientIntake.phoneNumber;
 
$w("#dobText").text = patientIntake.dob;
 
$w("#genderText").text = patientIntake.gender;
 
$w("#pronounsText").text = patientIntake.pronouns;
 

 
let addressText = patientIntake.addressLine1;
 
if (patientIntake.addressLine2 !== "N/A") {
 
addressText += `, ${patientIntake.addressLine2}`;
 
}
 

 
addressText = `${addressText}
 
${patientIntake.city}, ${patientIntake.state}, ${patientIntake.zipCode}`;
 
$w("#addressText").text = addressText;
 
}
 

 
if (statebox.currentState.id === "state17") {
 
$w("#insuranceInformation").show();
 
$w("#insuranceFullNameText").text = patientIntake.insuranceFullName;
 
$w("#insuranceDobText").text = patientIntake.insuranceDob;
 
$w("#insurancePolicyIdText").text = patientIntake.insurancePolicyId;
 
$w("#relationToPatientText").text = patientIntake.relationToPatient;
 
}
 

 
if (statebox.currentState.id === "state18") {
 
patientIntake.currentPsychiatricCare =
 
patientIntake.currentPsychiatricCare.join(",");
 
patientIntake.patientSeekingServices =
 
patientIntake.patientSeekingServices.join(",");
 
patientIntake.patientDiagnoses = patientIntake.patientDiagnoses.join(",");
 
patientIntake.patientRedflagMedications =
 
patientIntake.patientRedflagMedications.join(",");
 
patientIntake.nonPrescribedDrugsUsed =
 
patientIntake.nonPrescribedDrugsUsed.join(",");
 
patientIntake.possibleRedFlagBehaviors =
 
patientIntake.possibleRedFlagBehaviors.join(",");
 
patientIntake.patientProviderPreference =
 
patientIntake.patientProviderPreference.join(",");
 

 
console.log("Attempting to create new patient", patientIntake);
 
const createPatientIntake = await insertNewPatientIntake(patientIntake);
 

 
if (createPatientIntake._id) {
 
console.log(
 
"Patient Intake created, attempting to generate PDF and send email"
 
);
 
const generatePDFAndSendEmailResult = await generatePDFAndSendEmail(
 
patientIntake
 
);
 

 
if (generatePDFAndSendEmailResult.message === "success") {
 
console.log("Email sent successfully");
 
const hasOrangeFlags = Object.keys(orangeFlags).some(
 
(key) => orangeFlags[key] === true
 
);
 
if (hasOrangeFlags) {
 
continueButton.hide();
 
return statebox.changeState("orangeFlag");
 
} else {
 
continueButton.hide();
 
return statebox.changeState("greenFlag");
 
}
 
}
 
}
 
}
 

 
if (statebox.currentState.id === "state7") {
 
if (paymentType === "in_network") {
 
statebox.changeState("inNetwork");
 
} else {
 
stateNumber = 8;
 
statebox.changeState(`state${stateNumber}`);
 
}
 
} else if (statebox.currentState.id === "inNetwork") {
 
stateNumber = 8;
 
statebox.changeState(`state${stateNumber}`);
 
} else if (
 
statebox.currentState.id === "state16" &&
 
paymentType !== "in_network"
 
) {
 
stateNumber = 18;
 
statebox.changeState(`state${stateNumber}`);
 
} else {
 
statebox.changeState(`state${stateNumber}`);
 
}
 
});
 

 
statebox.onChange((e) => {
 
console.log("Orange Flags", orangeFlags);
 
console.log("Red Flags", redFlags);
 

 
if (e.target.currentState.id === "state15") {
 
if (!checkToUnlockContinueButton(15)) {
 
continueButton.disable();
 
}
 
} else if (e.target.currentState.id === "state16") {
 
if (!checkToUnlockContinueButton(16)) {
 
continueButton.disable();
 
}
 
} else if (e.target.currentState.id === "state17") {
 
if (!checkToUnlockContinueButton(17)) {
 
continueButton.disable();
 
}
 
} else if (e.target.currentState.id === "state18") {
 
continueButton.enable();
 
} else if (
 
e.target.currentState.id !== "inNetwork" &&
 
e.target.currentState !== "state18"
 
) {
 
continueButton.disable();
 
}
 
console.log(patientIntake);
 
});
 

 
function checkToUnlockContinueButton(state) {
 
if (state === 15) {
 
const inputs = [
 
firstNameInput,
 
lastNameInput,
 
emailInput,
 
phoneNumberInput,
 
genderInput,
 
dobInput,
 
];
 
return inputs.every((input) => input.value !== "");
 
} else if (state === 16) {
 
const inputs = [addressLine1Input, cityInput, stateInput, zipCodeInput];
 
return inputs.every((input) => input.value !== "");
 
} else if (state === 17) {
 
const inputs = [
 
insuranceFullName,
 
insuranceDob,
 
insurancePolicyId,
 
relationToPatient,
 
];
 
return inputs.every((input) => input.value !== "");
 
}
 
}
 
});
 

Interested in setting up something like this for your website? Contact us at 225-250-1888 or email robert@roberthebertmedia.com.
 

About our company

RHM specializes in helping businesses of all sizes and across all industries achieve their digital and web marketing needs. Whether you are designing a new website, building an app, performing custom development, or running Google Ads, our goal is to showcase how you are the best at what you do and help people connect with you. Contact us at 225-250-1888 to get started!


 

    110
    0