Skip to main content
nurse using a laptop

Occupational Health Management

Streamline your employee health program to improve organizational health, safety and compliance with occupational health management solutions.

Contact us

Manage your organization's health and medical compliance and increase productivity.

Our occupational health management solutions empower you to manage employee health and improve your practice’s productivity. Enable your organization to proactively address problem areas using powerful tools including compliance management, surveillance, case management and billing coordination. Contact us to discover which solution is the best fit for your employee health needs.

 

PureOHS™

Our latest occupational health solution, PureOHS, offers a set of tools to boost operational efficiencies. Built as a modular platform, you can select the modules you need, and scale with your changing needs. PureOHS is a mobile platform, so your team can enter and manage data on-the-go. Key features include:

Clinical suite Track occupational and nonoccupational cases, including diagnosis, cause of injury, treatment plans and doctor and nurse notes. Schedule your patients with customizable views and drag-and-drop capabilities.
Incident management Record, manage and report incidents, near misses or other conditions that could lead to injury or illness. Export required forms ready to upload to the Occupational Safety and Health Administration (OSHA) and identify key areas for safety improvement.
Medical surveillances Track which employees are due for what testing and when the test is required. PureOHS surveillances are flexible enough to handle nearly any protocol in any organization with little configuration.
Case management With integrated guidelines and a complete case manager toolset, manage injured employees back to work safely and efficiently while streamlining communication for all involved.
Compliance and reporting At-a-glance reports allow you to see the compliance rates of your most complicated surveillance programs. Quickly identify which employees are in and out of compliance and take action to fill the gaps.
Encounter management Comprehensive documentation management for all compliance activities including audio screenings, Department of Transportation (DOT) exams, pulmonary function tests (PFTs) and physicals.
Employee and supervisor views Provide visibility to the entire workforce to help communicate compliance rates and modified work duties. Automate data collection and reporting so that workers spend less time away from their primary job functions.
Event management Eliminate paperwork associated with large-scale vaccination clinics. PureOHS can replicate nearly any paper form and all forms can be signed electronically.
Learn more

SYSTOC®

For hospital-affiliated occupational medicine programs or freestanding practices, customers require the highest quality occupational health care for their employees. That means administering optimal care and keeping detailed patient records in real time, and billing for services quickly and accurately. UL Solutions helps make this possible. 

SYSTOC is a powerful tool that helps hospital-affiliated occupational health programs and freestanding practices streamline the recording of information as clinic visits are in progress.

Automate protocols that help your clinic bill quickly and accurately, including protocols to assist with immunization registry. Supported by our experts for more than three decades, SYSTOC has provided efficient, effective solutions for the health care provider marketplace by:

  • Developing comprehensive documentation capabilities for medical professionals
  • Automating labor-intensive, paper-based processes
  • Streamlining complex clinic workflows
  • Simplifying the billing process for your emergency room and workers’ compensation (W/C)
  • Transcribe medical records quickly with updated Tap2Chart technology
  • Bill electronically with supporting documentation
  • Streamline the import and export of clinical data sets using Health Level Seven (HL7) standards for drug screening, radiology and lab orders
  • Enabling records to be signed electronically
  • Automating DOT Federal Motor Carrier Safety Administration (FMCSA) interface
  • Batching and securely sending reports by email
  • Converting existing paper forms to interactive PDFs
Learn more

Occupational Health Manager (OHM®)

Manage the occupational health needs of your workforce with OHM, a complete set of tools to reduce workplace injuries and manage compliance. Identify problem areas and risk of injuries in your workforce. OHM software streamlines your clinic workflows and integrates occupational health and safety information into one system, saving you time and money.

Powerful and accessible occupational health and safety tools for medical professionals

Immunizations and vaccinations Manage your immunization program to access a comprehensive, at-a-glance compliance screen. View population and individual reports and statistics. Retrieve archived test results and apply functions for batch vaccinations, purified protein derivative (PPD) and automated consent forms.
Health portal Provide a secure entry point to engage employees to schedule/reschedule all health-related appointments; easily access, download, configure and sign consent forms and questionnaires that must be completed before a clinic visit; print vaccination and shot records at the click of a button without calling a clinic; and gain single-point access to clinic-related activity.
Medical surveillance Track and record employees’ compliance with required screenings and tests.
Case and claims management Integrated with Official Disability Guidelines and MDGuidelines, OHM allows you to monitor occupational and nonoccupational cases and manage claims and reduce the cost of employee absences.
Clinic management Revenue/outcome analyses and other functions help you deliver and track clinical services, and streamline operations.
Compliance reporting Determine whether an incident is OSHA recordable, maintain electronic logs and print required documents including OSHA 300, 300A and 301 reports.

 

Learn more
Related resources
OHM

OHM Occupational Health Manager

4.05 MB
PureOHS

PureOHS Occupational Health Software

1.45 MB
X

Get connected with our sales team

Thanks for your interest in UL's products and services. Let's collect some information so we can connect you with the right person.

Please wait…
'; let submitButton = $('form.mktoForm .mktoButtonWrap .mktoButton'); submitButton.prop("disabled", true); submitButton.append(loadingHTML); // Ocp-Apim-Subscription-Key: '***'. var $ocpKey = drupalSettings.ul_marketo_validate_key; var $ocpUrl = drupalSettings.ul_marketo_validate_url; var $ocpEnv = drupalSettings.ul_marketo_validate_env; if (submitCount > 1 || isResponseSuccess == true) { isResponseHandled = true; form.submittable(true); if (paramsDebug.debug == 1) { console.log("NO.10 submitCount > 1: form.submit() "); } submitButton.click(); } else { var email = form.vals().Email; var phone = (form.vals().Phone) ? (form.vals().Phone) : '18472728800'; var country = (form.vals().Country) ? (form.vals().Country) : 'United States'; var countryCode = (phone == '18472728800') ? 'US' : getCountryCode(country); var $emailMsg = drupalSettings.ul_marketo_validate.email; var $phoneMsg = drupalSettings.ul_marketo_validate.phone; if (paramsDebug.debug == 1) { console.log("paramsDebug:"); console.log(paramsDebug); } sendingData = JSON.stringify({ 'Input_Email': email, 'Input_Phone': phone, 'Input_ISO2_Country_Code': countryCode }); if (paramsDebug.debug == 1) { console.log('URL, debug missing button:'); console.log($ocpUrl); console.log("Sending Data to API service (ajax):"); console.log(sendingData); } // API call for validate email/phone/country. var sendDate = (new Date()).getTime(); var responseTimeMs = sendDate; // Start a timer to handle a 3-second response timeout setTimeout(function() { if (!isResponseHandled) { isResponseHandled = true; // Handle the assumed "success" due to timeout here if (paramsDebug.debug == 1) { console.log('No response within timeout, proceeding with default validation success.'); } $('#ValidMsgEmail').remove(); $('#ValidMsgPhone').remove(); // set form to be submittable here $('#valSpinner').remove(); submitButton.prop("disabled", false); // Setup status as Timeout instead of Unknown. emailAddressStatus = "Timeout"; phoneNumberStatus = "Timeout"; phoneNumberValidated = "Timeout"; form.vals({ "emailAddressStatus": emailAddressStatus, "phoneNumberStatus": phoneNumberStatus, "phoneNumberValidated": phoneNumberValidated, }); form.submittable(true); isResponseSuccess = true; if (paramsDebug.debug == 1) { let receiveDate = (new Date()).getTime(); responseTimeMs = (receiveDate - sendDate) / 1000; console.log("setTimeout: " + responseTimeMs + " seconds."); } submitButton.click(); } }, paramsDebug.timeout * 1000); //END setTimeout $.ajax({ url: $ocpUrl, type: 'POST', data: sendingData, headers: { 'Content-Type': 'application/json', 'Ocp-Apim-Subscription-Key': $ocpKey, }, success: function (response) { $('#valSpinner').remove(); submitButton.prop("disabled", false); phoneNumberValidated = response.Validated_Phone_Number; if (!isResponseHandled) { isResponseHandled = true; // **** Handle the validation response if (paramsDebug.debug == 1) { console.log("API Response Data: "); console.log(response); } var emailCode = response.Email_Validation_Status_Number; var phoneCode = response.Phone_Validation_Status_Number; // Add values into two status fields. if (emailValidCode.hasOwnProperty(emailCode)) { emailAddressStatus = emailValidCode[emailCode]; } else { // API error code doesn't exist, set defaul. emailAddressStatus = emailValidCode['300']; } if (phoneValidCode.hasOwnProperty(phoneCode)) { phoneNumberStatus = phoneValidCode[phoneCode]; } else { // API error code doesn't exist, set defaul. phoneNumberStatus = phoneValidCode['301']; } if (emailAddressStatus.indexOf("email_not") != -1) { emailAddressStatus = 'Invalid'; } else if(emailAddressStatus == 'valid') { emailAddressStatus = 'Valid'; } if (phoneNumberStatus.indexOf('invalid_') != -1) { phoneNumberStatus = 'Invalid'; } else if(phoneNumberStatus == 'valid') { phoneNumberStatus = 'Valid'; } if (paramsDebug.debug == 1) { console.log('form.emailAddressStatus ' + emailAddressStatus); console.log('form.phoneNumberStatus ' + phoneNumberStatus); console.log('form.phoneNumberValidated ' + phoneNumberValidated); } if (validEmailCode.includes(emailCode) && validPhoneCode.includes(phoneCode)) { // Remove the loading spinner. $('#ValidMsgEmail').remove(); $('#ValidMsgPhone').remove(); $('#valSpinner').remove(); submitButton.prop("disabled", false); if (paramsDebug.debug == 1) { console.log("NO.1.1 VALID OK submitCount = " + submitCount); } isResponseSuccess = true; form.vals({ "emailAddressStatus": emailAddressStatus, "phoneNumberStatus": phoneNumberStatus, "phoneNumberValidated": phoneNumberValidated, }); form.submittable(true); submitButton.click(); } // API valid code is not "valid". else { form.submittable(false); if (paramsDebug.debug == 1) { console.log("NO.1.2 Submittable false : count= " + submitCount + " validateOrigin " + validateOrigin + " isResponseSuccess " + isResponseSuccess ); } // Set the invalid message in language translation. var msgEmailStatus = ""; if (!validEmailCode.includes(emailCode)) { if (emailCode == '300' || emailCode == '400') { msgEmailStatus = $emailMsg.email_not_valid; } else if (emailCode == '310' || emailCode == '500' ) { msgEmailStatus = $emailMsg.email_not_accept; } else { msgEmailStatus = "Unknown"; } if (paramsDebug.debug == 1) { console.log("NOT validEmailCode: " + msgEmailStatus); } errEmail = ''; $('#Email').after(errEmail); form.submittable(false); } // Set the invalid message in language translation. var msgPhoneStatus = "" if (!validPhoneCode.includes(phoneCode)) { msgPhoneStatus = $phoneMsg[phoneValidCode[phoneCode]]; if (paramsDebug.debug == 1) { console.log("NOT validPhoneCode: " + msgPhoneStatus); } errPhone = ''; $('#Phone').after(errPhone); form.submittable(false); } if (paramsDebug.debug == 1) { console.log(msgEmailStatus); console.log(msgPhoneStatus); } // Remove the loading spinner. $('#valSpinner').remove(); submitButton.prop("disabled", false); if (paramsDebug.debug == 1) { console.log("NO.1.6 Submittable false, count= " + submitCount); } form.vals({ "emailAddressStatus": emailAddressStatus, "phoneNumberStatus": phoneNumberStatus, "phoneNumberValidated": phoneNumberValidated, }); // 2nd API call and subit form. if (submitCount >= 1) { $('#ValidMsgEmail').remove(); $('#ValidMsgPhone').remove(); isResponseSuccess = true; form.submittable(true); if (paramsDebug.debug == 1) { console.log("NO.1.8 : 2nd Submit:: submittable=true && count=1 : " + submitCount); } if (submitCount==1) { submitButton.click(); } } } //END if{} else{}. }//END if (!isResponseHandled) // Calculate the time comsumed for the API call. if (paramsDebug.debug == 1) { let receiveDate = (new Date()).getTime(); responseTimeMs = (receiveDate - sendDate) / 1000; console.log("NO.1.9 : AJAX success: Time for API call: " + responseTimeMs + " seconds."); } submitCount++; }, //END success: function(); // API call error response. error: function (error) { $('#valSpinner').remove(); submitButton.prop("disabled", false); if (!isResponseHandled) { isResponseHandled = true; $('#valSpinner').remove(); submitButton.prop("disabled", false); // 2nd API call and subit form. if ( submitCount >= 1 ) { $('#ValidMsgEmail').remove(); $('#ValidMsgPhone').remove(); form.submittable(true); isResponseSuccess = true; if ( submitCount == 1 ) { form.submittable(true); } } // Handle AJAX error if (paramsDebug.debug == 1) { console.log('**** 2 ajax error. submitCount = ' + submitCount); console.log(error); } // Calculate the time comsumed for the API call. if (paramsDebug.debug == 1) { let receiveDate = (new Date()).getTime(); responseTimeMs = (receiveDate - sendDate) / 1000; console.log("NO.2.3 AJAX error: Time for API call: " + responseTimeMs + " seconds."); } } submitCount++; // Error status 500, then submit the form. submitButton.click(); } //END error: function(); }); //END $.ajax; if (isResponseSuccess) { if (paramsDebug.debug == 1) { console.log("NO.8.0 submittable(true)"); } form.submittable(true); } } //END: if (submitCount > 1) else // Setup the form.vals and form.submittable; form.vals({ "emailAddressStatus": emailAddressStatus, "phoneNumberStatus": phoneNumberStatus, "phoneNumberValidated": phoneNumberValidated, }); } //END: if (validateOrigin && (marketoBundle)) else { // For Event form and Newsletter form. if (validateOrigin === true){ form.submittable(true); } } }); //END form.onValidate() // Success callback() form.onSuccess(function(values, followUpUrl){ // Debug Phone/Email validation. if (paramsDebug.debug == 1) { console.log("NO.9.1 onSuccess: submittable = " + form.submittable()); console.log(form.getValues()); } // Track analytics. if (typeof dataLayer !== 'undefined'){ dataLayer.push({ event: drplMkto.dataLayerEvent, mktoFormId: form.getId(), 'FormValues': cleanFormVals(form.getValues()), 'FormFields': form.allFieldsFilled(), 'Submittable': form.submittable() }); } // If function exists, delete UTM cookie: if(typeof _deleteUtmCookie === "function"){ _deleteUtmCookie(); } // Marketo Modal "Thank You" message: if(use_post_submit_mssg){ $('html, body').animate({ scrollTop: 0 }, 'slow'); $('.mkto-presubmit').addClass('hidden'); $('.mktoModalContent').addClass('mkto_thnx_center'); $('.mktoModalMask').addClass('not_clicable'); $('.mkto-postsubmit').removeClass('hidden'); $('.mktoButton').removeAttr('disabled').text(drupalSettings.marketo.button_text); $('.mktoForm')[0].reset(); grecaptcha.reset(); } // Else, redirect user: else { window.location.href = drplMkto.success_url; } // IMPORTANT: Return false to prevent further code execution. return false; }); //END form.onSuccess. }); })(jQuery, drupalSettings.marketo);