179 lines
6.6 KiB
Plaintext
179 lines
6.6 KiB
Plaintext
maintenance:
|
|
|
|
title: : Calculate the Frequency Multiplier for Total Daily Dose;;
|
|
mlmname: SYS_CALC_FREQMULT_DAILY;;
|
|
arden: version 2.5;;
|
|
version: 18.4;;
|
|
institution: Allscripts, System MLM;;
|
|
author: Allscripts Healthcare Solutions, Inc.;;
|
|
specialist: ;;
|
|
date: 2018-10-26;;
|
|
validation: testing;;
|
|
|
|
/* P r o p r i e t a r y N o t i c e */
|
|
/* Unpublished (c) 2013 - 2018 Allscripts Healthcare, LLC. and/or its affiliates. All Rights Reserved.
|
|
|
|
P r o p r i e t a r y N o t i c e: This software has been provided pursuant to a License Agreement, with
|
|
Allscripts Healthcare, LLC. and/or its affiliates, containing restrictions on its use. This software contains
|
|
valuable trade secrets and proprietary information of Allscripts Healthcare, LLC. and/or its affiliates and is
|
|
protected by trade secret and copyright law. This software may not be copied or distributed in any form or medium,
|
|
disclosed to any third parties, or used in any manner not provided for in said License Agreement except with prior
|
|
written authorization from Allscripts Healthcare, LLC. and/or its affiliates. Notice to U.S. Government Users:
|
|
This software is {{{SINGLE-QUOTE}}}Commercial Computer Software{{{SINGLE-QUOTE}}}.
|
|
|
|
All product names are the trademarks or registered trademarks of Allscripts Healthcare, LLC. and/or its affiliates.
|
|
*/
|
|
/* P r o p r i e t a r y N o t i c e */
|
|
|
|
library:
|
|
purpose: Calculates a Frequency Mutiplier for a Frequency such as BID, Q18H, etc.
|
|
This TOTAL DAILY multiplier is for the total number of times something can occur in a day.
|
|
;;
|
|
explanation: Using the Frequency dictionary and the Units of Measure
|
|
dictionary, a TOTAL DAILY frequency multiplier is calculated
|
|
based on seconds, minutes, hours, days, weeks, months, or years.
|
|
The Frequency Multiplier can be used to calculate an Total Daily
|
|
Dose from a Single-Dose. For example, both BID and Q18H
|
|
return 2 as a multiplier
|
|
;;
|
|
keywords: Frequency Multiplier; Average Daily
|
|
;;
|
|
knowledge:
|
|
type: data-driven;;
|
|
data:
|
|
|
|
/* Pass in a frequency as a string */
|
|
(order_med_frequency,
|
|
from_time,
|
|
from_uom):= argument;
|
|
|
|
/* The facility must map its Dictionary Codes to the Core UOM in the */
|
|
/* Units of Measure Dictionary. The MLM converts the facility-defined units of measure */
|
|
/* to the system-defined values in the Unit of Measure Dictionary called CoreUOM. */
|
|
|
|
|
|
day_string:= "day";
|
|
hour_string:= "hr";
|
|
minute_string:= "min";
|
|
month_string:= "month";
|
|
ounce_string:= "oz";
|
|
second_string:= "s";
|
|
week_string:= "week";
|
|
year_string:= "year";
|
|
|
|
if order_med_frequency = "<Variable Interval>"
|
|
then
|
|
frequency_type := 3;
|
|
time_from_value := from_time as number;
|
|
(time_core_uom) := read last
|
|
{"SELECT CoreUOM "
|
|
|| " FROM CV3UnitOfMeasure"
|
|
|| " WHERE Code = " || SQL (from_uom)
|
|
|| " AND Active = 1 " };
|
|
|
|
else
|
|
/* Gets the Frequency information from the Enterprise data */
|
|
/* Only gets the Active Frequencies and Active Units of Measures */
|
|
(frequency_code,
|
|
frequency_type,
|
|
time_from_value,
|
|
time_to_value,
|
|
time_uom,
|
|
time_core_uom):= read last
|
|
{"SELECT f.Code, f.DefinitionType, f.TimeFromValue, f.TimeToValue,"
|
|
|| " f.TimeUom, u.CoreUOM "
|
|
|| " FROM CV3Frequency AS f JOIN CV3UnitOfMeasure AS u"
|
|
|| " ON f.TimeUom = u.Code "
|
|
|| " WHERE f.Code = " || SQL (order_med_frequency)
|
|
|| " AND f.Active = 1 "
|
|
|| " AND u.Active = 1 " };
|
|
|
|
|
|
/* Handle frequency templates <qxh> and <qxm> by parsing the frequency string */
|
|
/* If changes are made to this code, also change them in SYS_CALC_FREQMULT_AVERAGE */
|
|
/* This is a temporary workaround for frequency templates */
|
|
If NOT Exist frequency_type
|
|
then
|
|
/* Declare C functions to parse the frequency string */
|
|
func_get_token := interface {char* msvcrt:strtok(char*, char*)};
|
|
func_get_str := interface {char* msvcrt:strstr(char*, char*)};
|
|
|
|
/* Declare characters used for delimiting the string */
|
|
/* Delimiters are Case Sensitive */
|
|
q_delim:= "Q";
|
|
h_delim:= "H";
|
|
m_delim:= "M";
|
|
|
|
/* Determine if the letter in at the back of the string is H or M */
|
|
get_H:= call func_get_str with (order_med_frequency, h_delim);
|
|
get_M:= call func_get_str with (order_med_frequency, m_delim);
|
|
|
|
/* Remove the front Q, so xH or xM is left */
|
|
trim_Q:= call func_get_token with (order_med_frequency, q_delim);
|
|
|
|
/* Set the time_core_uom */
|
|
/* Remove the H or the M, leaving a string representation of a number */
|
|
if exist get_H
|
|
then
|
|
time_core_uom := hour_string;
|
|
freq_num_str := call func_get_token with (trim_Q, h_delim);
|
|
elseif exist get_M
|
|
then time_core_uom := minute_string;
|
|
freq_num_str := call func_get_token with (trim_Q, m_delim);
|
|
endif; /* if exist get_H */
|
|
|
|
/* Convert string to number */
|
|
time_from_value := freq_num_str as number;
|
|
endif; /* If NOT Exist frequency_type */
|
|
|
|
endif /* if order_med_frequency = "<Variable Interaval>" */
|
|
|
|
;;
|
|
evoke:
|
|
;;
|
|
logic:
|
|
|
|
if time_core_uom = day_string then
|
|
if frequency_type = 1 /* y times per day */
|
|
then conversion_factor_total:= time_from_value;
|
|
else conversion_factor_total:= 1 ;
|
|
endif;
|
|
elseif time_core_uom = hour_string then
|
|
if frequency_type = 1 /* y times per hour */
|
|
then conversion_factor_total:= 24 * time_from_value;
|
|
else conversion_factor_total:= int ((24/ time_from_value)+ 0.999999);
|
|
endif;
|
|
elseif time_core_uom = minute_string then
|
|
if frequency_type = 1 /* y times per minute*/
|
|
then conversion_factor_total:= 24*60* time_from_value;
|
|
else conversion_factor_total:= int ((24*60/ time_from_value) + 0.999999);
|
|
endif;
|
|
elseif time_core_uom = second_string then
|
|
if frequency_type = 1 /* y times per second */
|
|
then conversion_factor_total:= 24*60*60* time_from_value;
|
|
else conversion_factor_total:= int ((24*60*60/time_from_value) + 0.999999);
|
|
endif;
|
|
elseif time_core_uom = week_string then
|
|
if frequency_type = 1 /* y times per week */
|
|
then conversion_factor_total:= int ((time_from_value / 7) + 0.999999);
|
|
else conversion_factor_total:= 1 ;
|
|
endif;
|
|
elseif time_core_uom = month_string then
|
|
if frequency_type = 1 /* y times per month */
|
|
then conversion_factor_total:= int ((time_from_value /(365/12)) + 0.999999);
|
|
else conversion_factor_total:= 1 ;
|
|
endif;
|
|
elseif time_core_uom = year_string then
|
|
if frequency_type = 1 /* y times per year */
|
|
then conversion_factor_total:= int ((time_from_value/365) + 0.999999);
|
|
else conversion_factor_total:= 1;
|
|
endif;
|
|
endif; /* if time_core_uom */
|
|
|
|
Conclude true;
|
|
;;
|
|
action:
|
|
return conversion_factor_total;
|
|
;;
|
|
end:
|