Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: ORINQIV

ORINQIV.m

Go to the documentation of this file.
  1. ORINQIV ; SLC/AGP - Utility report for Order Dialogs ; 11/18/08
  1. ;;3.0;ORDER ENTRY/RESULTS REPORTING;**301,296**;DEC 17, 1997;Build 19
  1. ;
  1. ; DBIA 5133: reading ^PXRMD file #801.41
  1. ;
  1. Q
  1. ;
  1. ASK(PROMPT,QUEST,HELP) ;
  1. N DIR,STR,Y
  1. S STR=QUEST_";S:SKIP THIS QUICK ORDER;Q:QUIT THE CONVERSION UTILITY"
  1. S DIR("A")=PROMPT
  1. S DIR(0)="S^"_STR
  1. S DIR("??")="^D HELP^ORINQIV("_HELP_")"
  1. D ^DIR
  1. Q Y
  1. ;
  1. AWRITE(REF) ;Write all the descendants of the array reference.
  1. ;REF is the starting array reference, for example A or ^TMP("OR",$J).
  1. N DONE,IND,LEN,PROOT,ROOT,START,TEMP
  1. I REF="" Q
  1. S PROOT=$P(REF,")",1)
  1. ;Build the root so we can tell when we are done.
  1. S TEMP=$NA(@REF)
  1. S ROOT=$P(TEMP,")",1)
  1. S REF=$Q(@REF)
  1. I REF'[ROOT Q
  1. S DONE=0
  1. F Q:(REF="")!(DONE) D
  1. . S START=$F(REF,ROOT)
  1. . S LEN=$L(REF)
  1. . S IND=$E(REF,START,LEN)
  1. . W !,PROOT_IND,"=",@REF
  1. . S REF=$Q(@REF)
  1. . I REF'[ROOT S DONE=1
  1. Q
  1. ;
  1. BLDMSG(ARRAY) ;
  1. N CNT,LC,NAME,PQO,SPACE,SUCCESS,TEMP,TEXT,USER,XMSUB,Y
  1. W !
  1. S CNT=1,TEXT(CNT)="Below is a list of personal QO that can be converted to the Infusion format."
  1. S CNT=CNT+1,TEXT(CNT)="These items should not be converted unless the quick order is remove from"
  1. S CNT=CNT+1,TEXT(CNT)="the user personal quick order menu."
  1. S NAME="" F S NAME=$O(ARRAY(NAME)) Q:NAME="" D
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)=NAME,CNT=CNT+1,TEXT(CNT)="_"
  1. .F SPACE=1:1:78 S TEXT(CNT)=TEXT(CNT)_"_"
  1. .S PQO="" F S PQO=$O(ARRAY(NAME,PQO)) Q:PQO="" D
  1. ..S CNT=CNT+1,TEXT(CNT)=$G(ARRAY(NAME,PQO))
  1. S CNT=0 F S CNT=$O(TEXT(CNT)) Q:CNT'>0 W !,TEXT(CNT)
  1. ;
  1. S DIR(0)="Y"
  1. S DIR("A")="Send this information in a mailman message"
  1. D ^DIR
  1. I Y'=1 Q
  1. S XMSUB="List of personal QO that can be converted to Infusion format"
  1. S TEMP=$$SUBCHK^XMGAPI0(XMSUB,0)
  1. I $P(TEMP,U)'="" S XMSUB=$E(XMSUB,1,65)
  1. RETRY ;
  1. D XMZ^XMA2
  1. I XMZ<1 G RETRY
  1. S SUCCESS("XMZ")=XMZ
  1. S SUCCESS("SUB")=XMSUB
  1. S CNT=0,LC=0 F S CNT=$O(TEXT(CNT)) Q:CNT'>0 D
  1. .S LC=LC+1,^XMB(3.9,XMZ,2,LC,0)=TEXT(CNT)
  1. S ^XMB(3.9,XMZ,2,0)="^3.92^"_LC_"^"_LC_"^"_DT
  1. S $P(^XMB(3.9,XMZ,0),U,12)="Y"
  1. D ENT2^XMD
  1. Q
  1. ;
  1. EDIT(IEN,PERQOAR) ;
  1. N ASKADD,CNT,CONF,DA,DIE,DIK,DR,DRPSIVDG,DUR,EXIT,ERR,ERROR,FDA,FDAIEN
  1. N IVTYPE,LOC,NAME,NODE,OUTPUT,PSIVDG,PSNODE,TERMIN,USER
  1. S EXIT=0,ERROR=0
  1. N OI,OINAME,PTR,UPDADD,UPDDSG
  1. S USER=$$ISPERQO(IEN) I USER>0 D Q EXIT
  1. .S NODE=$G(^ORD(101.41,IEN,0))
  1. .D GETS^DIQ(200,USER_",",".01;9.2","EI","OUTPUT","ERR")
  1. .I $D(ERR) D AWRITE(ERR) Q
  1. .S TERMIN=$G(OUTPUT(200,USER_",",9.2,"I"))
  1. .I TERMIN>0,TERMIN<DT Q
  1. .S PERQOAR(OUTPUT(200,USER_",",.01,"E"),$P(NODE,U))=$P(NODE,U,2)
  1. K ^TMP($J,"OR DESC")
  1. S UPDDSG="N",UPDADD="N"
  1. S OI=$$GETOI(IEN) I OI="" Q 0
  1. S OINAME=$P($G(^ORD(101.43,OI,0)),U) I OINAME="" Q 0
  1. S PSNODE=$G(^ORD(101.43,OI,"PS"))
  1. S ASKADD=$S($P(PSNODE,U,4)=1:1,1:0)
  1. S DA=IEN
  1. D EN^ORORDDSC(IEN,"OR DESC")
  1. S CNT=0 F S CNT=$O(^TMP($J,"OR DESC",IEN,CNT)) Q:CNT'>0 D
  1. .W !,^TMP($J,"OR DESC",IEN,CNT)
  1. ;
  1. CONVERT ;
  1. W !!,"Convert the above Quick Order to an Infusion Quick Order?"
  1. S UPDDSG=$$ASK("Convert?","Y:YES;N:NO",1)
  1. I UPDDSG="Q"!(UPDDSG=U)!(UPDDSG="^^") S EXIT=1 G EDITX
  1. I UPDDSG'="Y" G EDITX
  1. IVTYPE ;
  1. W !!,"Select the IV Type for this Quick Order."
  1. S IVTYPE=$$ASK("IV TYPE","C:CONTINUOUS;I:INTERMITTENT",2)
  1. I IVTYPE=U G CONVERT
  1. I IVTYPE="^^"!(IVTYPE="Q") S EXIT=1 G EDITX
  1. I IVTYPE="S" G EDITX
  1. ;
  1. ADDIT ;
  1. I ASKADD=1 D
  1. .I $P(PSNODE,U,3)=0 D Q
  1. ..S UPDADD="Y"
  1. ..W !,"Orderable item "_OINAME_" is not marked as a solution."
  1. ..W !,"This orderable item will be moved to the additive value."
  1. .W !!,"Change orderable item "_OINAME_" to an additive?"
  1. .S UPDADD=$$ASK("Convert to Additive?","Y:YES;N:NO",3)
  1. .I UPDADD=U G IVTYPE
  1. .I UPDADD="^^"!(UPDADD="Q") S EXIT=1 G EDITX
  1. .I UPDADD="S" G EDITX
  1. ;
  1. CONFIRM ;
  1. W !!,"Please confirm the selected changes below."
  1. W !,"If these changes are accepted, the Quick Order will be converted to an"
  1. W !,"Infusion Quick Order. This Quick Order will not be able to be converted back to"
  1. W !,"an Inpatient Quick Order."
  1. W !!,"Convert to Infusion Quick Order: YES"
  1. W !,"IV TYPE: "_$S(IVTYPE="I":"Intermittent",1:"Continuous")
  1. I UPDADD="Y" W !,"Change orderable item "_OINAME_" to an additive: YES"
  1. S CONF=$$ASK("Confirm Changes?","Y:YES;N:NO",4)
  1. I CONF=U G:ASKADD=1 ADDIT I ASKADD=0 G IVTYPE
  1. I CONF="^^"!(CONF="Q") S EXIT=1 G EDITX
  1. I CONF="S"!(CONF="N") G EDITX
  1. ;
  1. UPDATES ;Do updates
  1. W !
  1. S DIE="^ORD(101.41,"
  1. S PSIVDG=$O(^ORD(100.98,"B","IV MEDICATIONS","")) Q:PSIVDG'>0
  1. S DR="5///^S X=PSIVDG"
  1. D ^DIE
  1. S PTR=$$PTR^ORMBLDPS("IV TYPE") Q:PTR'>0
  1. S IENS="?+3,"_IEN_","
  1. S FDA(101.416,IENS,.01)=35
  1. S FDA(101.416,IENS,.02)=PTR
  1. S FDA(101.416,IENS,.03)=1
  1. S FDA(101.416,IENS,1)=IVTYPE
  1. D UPDATE^DIE("","FDA","FDAIEN","ERR")
  1. I $D(ERR) D AWRITE("ERR") S ERROR=1
  1. I UPDADD="Y" D
  1. .S PTR=$$PTR^ORMBLDPS("ADDITIVE") Q:PTR'>0
  1. .N FDA,IENS
  1. .S IENS="?+2,"_IEN_","
  1. .S FDA(101.416,IENS,.01)=30
  1. .S FDA(101.416,IENS,.02)=PTR
  1. .S FDA(101.416,IENS,.03)=1
  1. .S FDA(101.416,IENS,1)=OI
  1. .D UPDATE^DIE("","FDA","FDAIEN","ERR")
  1. .I $D(ERR) D AWRITE("ERR") S ERROR=1
  1. .I '$D(ERR) W !!,"**CHECK THE STRENGTH ASSOCIATED WITH THE ADDITIVE VALUE IN THE EDITOR." H 1
  1. .S PTR=$$PTR^ORMBLDPS("ORDERABLE ITEM") Q:PTR'>0
  1. .S LOC=$O(^ORD(101.41,IEN,6,"D",PTR,"")) Q:LOC'>0
  1. .S DA(1)=IEN,DA=LOC
  1. .S DIK="^ORD(101.41,"_DA(1)_",6," D ^DIK
  1. ;Check for duration
  1. I IVTYPE="C" D
  1. .S PTR=$$PTR^ORMBLDPS("SCHEDULE") Q:PTR'>0
  1. .S LOC=$O(^ORD(101.41,IEN,6,"D",PTR,"")) Q:LOC'>0
  1. .S DA(1)=IEN,DA=LOC
  1. .S DIK="^ORD(101.41,"_DA(1)_",6," D ^DIK
  1. S DUR=$$PTR^ORMBLDPS("DURATION")
  1. I DUR>0,$D(^ORD(101.41,IEN,6,"D",DUR))>0 D
  1. .W !!,"**CHECK THE LIMITATION VALUE ASSIGNED TO THE QUICK ORDER IN THE EDITOR." H 1
  1. I ERROR=1 W !,"Due to the errors in conversion please valiate the quick order in the editor."
  1. ;
  1. ;Call the QO editor
  1. W !
  1. D QCK0^ORCMEDT1(IEN)
  1. EDITX ;
  1. K ^TMP($J,"OR DESC")
  1. Q EXIT
  1. ;
  1. EN ;
  1. K ^TMP($J,"OR REMMDLG")
  1. N DIR,DSGPAR,DSGRP,EXIT,NANSC,ODIEN,PERQOAR,QOIEN,Y
  1. ;
  1. D HELP(6)
  1. ;Build a list of Display Groups that contains the default dialog of
  1. ;PSJ OR PAT OE
  1. S ODIEN=$O(^ORD(101.41,"AB","PSJ OR PAT OE","")) Q:ODIEN=""
  1. S DSGRP=0 F S DSGRP=$O(^ORD(100.98,DSGRP)) Q:DSGRP'>0 D
  1. .I $P(^ORD(100.98,DSGRP,0),U,4)=ODIEN S DSGPAR(DSGRP)=""
  1. ;
  1. S DIR(0)="S^A:QO ASSIGNED TO ORDER MENUS, ORDER SETS, OR REMINDER DIALOGS;N:QO NOT ASSIGNED TO ANY OF THESE ITEMS;S:SPECIFIC QUICK ORDER;Q:QUIT THE CONVERSION UTILITY"
  1. S DIR("A")="Which QO to convert?"
  1. S DIR("??")="^D HELP^ORINQIV(5)"
  1. D ^DIR
  1. I Y=U!(Y="^^")!(Y="Q") Q
  1. I Y="S" D IND^ORINQIV(.DSGPAR) Q
  1. S NANSC=Y
  1. I NANSC="A" D FQOIRDLG
  1. ;
  1. S OIIEN=$O(^ORD(101.41,"B","OR GTX ORDERABLE ITEM","")) Q:OIIEN'>0
  1. S EXIT=0
  1. S QOIEN=0 F S QOIEN=$O(^ORD(101.41,QOIEN)) Q:QOIEN'>0!(EXIT=1) D
  1. .I $$ISVALID(QOIEN,NANSC,.DSGPAR)=0 Q
  1. .S EXIT=$$EDIT(QOIEN,.PERQOAR)
  1. UTLEXIT ;
  1. I $D(PERQOAR) D BLDMSG(.PERQOAR)
  1. K ^TMP($J,"OR REMDLG")
  1. Q
  1. ;
  1. GETOI(IEN) ;
  1. N OIIEN,OROI,POS
  1. N OIIEN,OROI,POS
  1. S OIIEN=$O(^ORD(101.41,"B","OR GTX ORDERABLE ITEM","")) Q:OIIEN'>0 ""
  1. S POS=$O(^ORD(101.41,IEN,6,"D",OIIEN,"")) Q:POS'>0 ""
  1. S OROI=+$G(^ORD(101.41,IEN,6,POS,1)) Q:OROI'>0 ""
  1. Q OROI
  1. ;
  1. FQOIRDLG ;
  1. N AFIND,DIEN,PTEXT,TYPE
  1. F TYPE="G","E" S DIEN="" D
  1. . F S DIEN=$O(^PXRMD(801.41,"TYPE",TYPE,DIEN)) Q:DIEN'>0 D ;DBIA 5133
  1. .. ; PTEXT is 'FINDING ITEM' where 101.41 refers to ^ORD(101.41)
  1. .. S PTEXT=$P($G(^PXRMD(801.41,DIEN,1)),U,5),AFIND=""
  1. .. I PTEXT[101.41 S ^TMP($J,"OR REMDLG",$P(PTEXT,";"))=DIEN
  1. .. F S AFIND=$O(^PXRMD(801.41,DIEN,3,"B",AFIND)) Q:AFIND="" D
  1. ... I AFIND[101.41 S ^TMP($J,"OR REMDLG",$P(AFIND,";"))=DIEN
  1. Q
  1. ;
  1. IND(DSGPAR) ;
  1. N DIC,DIR,EXIT,PERQOAR
  1. S DIC="^ORD(101.41,",DIC(0)="AEMQZ"
  1. S DIC("S")="I $$ISVALID^ORINQIV(Y,""S"",.DSGPAR)=1"
  1. D ^DIC
  1. I +$P(Y,U)'>0 Q
  1. S EXIT=$$EDIT($P(Y,U),.PERQOAR)
  1. I EXIT=1 Q
  1. W !
  1. S DIR(0)="Y"
  1. S DIR("A")="Convert another Quick Order?"
  1. D ^DIR
  1. I Y=1 D IND(.DSGPAR)
  1. I $D(PERQOAR) D BLDMSG(.PERQOAR)
  1. Q
  1. ;
  1. ISCONT(IEN) ;
  1. ;This is use to determine if the Entry from file 101.41 is used in an
  1. ;another entry from file 101.41 or in a reminder dialog.
  1. I $O(^ORD(101.41,"AD",IEN,0)) Q 1
  1. I $D(^TMP($J,"OR REMDLG",IEN))>0 Q 1
  1. Q 0
  1. ;
  1. ISIV(IEN) ;
  1. ;This is use to determine if orderable item is marked as a solution or
  1. ;an additive
  1. N PSNODE
  1. S PSNODE=$G(^ORD(101.43,IEN,"PS"))
  1. I $P(PSNODE,U,3)=1 Q 1
  1. I $P(PSNODE,U,4)=1 Q 1
  1. Q 0
  1. ;
  1. ISPERQO(IEN) ;
  1. N NUM,RESULT,USER
  1. I $D(^ORD(101.44,"C",IEN)) D Q RESULT
  1. .S NUM=$O(^ORD(101.44,"C",IEN,"")) Q:NUM'>0
  1. .S USER=$P($G(^ORD(101.44,NUM,0)),U)
  1. .S USER=$P(USER,"USR",2)
  1. .S RESULT=+$P(USER," ")
  1. Q 0
  1. ;
  1. ISVALID(IEN,NANSC,DSGPAR) ;
  1. N CONT,NODE,QODSG,PSNODE,RESULT
  1. S NODE=$G(^ORD(101.41,IEN,0))
  1. ;Quit if not a quick order
  1. I $P(NODE,U,4)'="Q" Q 0
  1. ;Disregard order dialog entry does not contain a valid display group
  1. S QODSG=$P(NODE,U,5) I QODSG="" Q 1
  1. I '$D(DSGPAR(QODSG)) Q 0
  1. ;
  1. S CONT=$S($O(^ORD(101.41,"AD",IEN,0)):1,$D(^TMP($J,"OR REMDLG",IEN)):1,1:0)
  1. ;
  1. ;S CONT=$$ISCONT(IEN)
  1. I NANSC="A",CONT=0 Q 0
  1. I NANSC="N",CONT=1 Q 0
  1. S OROI=$$GETOI(IEN) I OROI="" Q 0
  1. S PSNODE=$G(^ORD(101.43,OROI,"PS"))
  1. I $P(PSNODE,U,3)=1 Q 1
  1. I $P(PSNODE,U,4)=1 Q 1
  1. Q 0
  1. ;
  1. HELP(NUM) ;
  1. N CNT,TAB,TEXT
  1. S CNT=0,TAB=" "
  1. I NUM=1 D
  1. .S CNT=CNT+1,TEXT(CNT)="By selecting YES this quick order will be converted to a Infusion QO."
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)="This quick order will not be able to be converted back to a unit dose quick"
  1. .S CNT=CNT+1,TEXT(CNT)="order. However, you can edit the specific fields of the Infusion quick order in the"
  1. .S CNT=CNT+1,TEXT(CNT)="quick order editor."
  1. I NUM=2 D
  1. .S CNT=CNT+1,TEXT(CNT)="This value defines the type of Infusion quick order that is being setup."
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)=TAB_"Select INTERMITTENT to set-up a quick order that should be administered at"
  1. .S CNT=CNT+1,TEXT(CNT)=TAB_"scheduled intervals (Q4H, QDay) or One-Time only, ""over a specified time"
  1. .S CNT=CNT+1,TEXT(CNT)=TAB_"period"" (e.g. ""Infuse over 30 min."")."
  1. .S CNT=CNT+1,TEXT(CNT)=TAB_TAB_"An example is an a IVP/IVPB order."
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)=TAB_"Select CONTINUOUS to set-up a quick order that run at a specified ""Rate"""
  1. .S CNT=CNT+1,TEXT(CNT)=TAB_"(_ml/hr, _mcg/kg/min, etc)"
  1. .S CNT=CNT+1,TEXT(CNT)=TAB_TAB_"An example is an a Infusion/drip quick order."
  1. I NUM=3 D
  1. .S CNT=CNT+1,TEXT(CNT)="Select Yes to switch the orderable item from the solution to the additive value in the quick order."
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)="Select No to leave the orderable item as the solution in the quick order."
  1. I NUM=4 D
  1. .S CNT=CNT+1,TEXT(CNT)="Select Yes to convert the quick order to an infusion quick order with the"
  1. .S CNT=CNT+1,TEXT(CNT)="selected change. When the conversion is complete you will be drop into the"
  1. .S CNT=CNT+1,TEXT(CNT)="quick order editor to make any changes to the quick order."
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)="Select No to stop the conversion process for this quick order."
  1. I NUM<5 D
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)="Select SKIP THIS QUICK ORDER to leave the current quick order as an"
  1. .S CNT=CNT+1,TEXT(CNT)="Inpatient quick order and select another quick order to convert."
  1. I NUM=5 D
  1. .S CNT=CNT+1,TEXT(CNT)="Select QO ASSIGNED TO ORDER MENUS, ORDER SETS, OR REMINDER DIALOGS to convert"
  1. .S CNT=CNT+1,TEXT(CNT)="quick orders that are used in one of the following: Order Menus, Order Sets,"
  1. .S CNT=CNT+1,TEXT(CNT)="or Reminder Dialogs."
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)="Select QO NOT ASSIGNED TO ANY OF THESE ITEMS to convert quick orders that are"
  1. .S CNT=CNT+1,TEXT(CNT)="not use in the following: Order Menus, Order Sets, or Reminder Dialogs."
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)="Select SPECIFIC QUICK ORDER to convert an individual quick order."
  1. I NUM=6 D
  1. .S CNT=CNT+1,TEXT(CNT)=" "
  1. .S CNT=CNT+1,TEXT(CNT)="This conversion utility enables users to convert IV quick orders set-up as"
  1. .S CNT=CNT+1,TEXT(CNT)="Inpatient quick orders to Infusion quick orders. For each quick order,"
  1. .S CNT=CNT+1,TEXT(CNT)="the conversion utility asks a series of questions to populate the minimum"
  1. .S CNT=CNT+1,TEXT(CNT)="prompts needed to convert the quick order. Once the conversion is"
  1. .S CNT=CNT+1,TEXT(CNT)="done, the user is placed into the Infusion quick order editor to add any"
  1. .S CNT=CNT+1,TEXT(CNT)="values to the additional fields in the Infusion quick order, if needed."
  1. .S CNT=CNT+1,TEXT(CNT)="Possible conflicts at the time of conversion will be displayed before entering"
  1. .S CNT=CNT+1,TEXT(CNT)="the editor. An example of a conflict may be that the user should review the"
  1. .S CNT=CNT+1,TEXT(CNT)="strength associated with the additive in the editor."
  1. S CNT=CNT+1,TEXT(CNT)=" "
  1. I NUM<6 S CNT=CNT+1,TEXT(CNT)="Select QUIT THE CONVERSION UTILITY to exit this utility."
  1. S CNT=0 F S CNT=$O(TEXT(CNT)) Q:CNT'>0 W !,TEXT(CNT)
  1. Q
  1. ;