[613] | 1 | ORWOD ; SLC/GSS - Utility for Order Dialogs ; 7/24/07 9:55am
|
---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**243**;DEC 17, 1997;Build 242
|
---|
| 3 | ;
|
---|
| 4 | ; DBIA 5133: reading ^PXRMD file #801.41
|
---|
| 5 | ;
|
---|
| 6 | Q
|
---|
| 7 | ;
|
---|
| 8 | INSTALL ;Entry point for running as post-install in OR*3*243
|
---|
| 9 | D MAIN
|
---|
| 10 | Q
|
---|
| 11 | ;
|
---|
| 12 | ATWILL ;Entry point for ORDER MENU MANAGEMENT menu - ORCM MGMT opt MR
|
---|
| 13 | W !,"Compiling Med Quick Order check report..."
|
---|
| 14 | D MAIN
|
---|
| 15 | W !,"...QO check report compiled and mailed to ",$P(^VA(200,DUZ,0),U)
|
---|
| 16 | Q
|
---|
| 17 | ;
|
---|
| 18 | MAIN ;Main calls for QO Reports
|
---|
| 19 | N ANCSTR,I,PSJNOPC,XMDUN,XMSUB
|
---|
| 20 | D NTRY
|
---|
| 21 | ; ANCSTR=ancestors, i.e., QO being used on a menu/Reminder Dialogs
|
---|
| 22 | F ANCSTR="Y","N" D
|
---|
| 23 | . D MAILSU
|
---|
| 24 | . D SEND(XMSUB,DUZ)
|
---|
| 25 | D CLEANUP
|
---|
| 26 | Q
|
---|
| 27 | ;
|
---|
| 28 | ANCSTR ;Determine QO usage - called by XSET and MM
|
---|
| 29 | S ANCSTR="N"
|
---|
| 30 | I $O(^ORD(101.41,"AD",ODIENXT,0))!($D(^TMP("OR",$J,"RD",ODIENXT))=0) S ANCSTR="Y"
|
---|
| 31 | Q
|
---|
| 32 | ;
|
---|
| 33 | XSET ;Set QO record for display
|
---|
| 34 | D ANCSTR
|
---|
| 35 | S RC=ODIENXT_U_$P(REC,U)_U_$P(REC,U,2)_U_$G(ODATYPE)_U_$G(ODAROUTE)_U_$G(ODASCHD)_U_$G(ODARATE)_U_$G(ODALIMIT)
|
---|
| 36 | Q
|
---|
| 37 | ;
|
---|
| 38 | NTRY ;Entry point for compiling report
|
---|
| 39 | N AFIND,DIEN,DOSE,DSPLGRP,DSPLGPTR,GETXT,HIT,NODE3,ODALIMIT,ODARATE,ODAROUTE,ODASCHD,ODATYPE,ODIEN,ODIENXT,ORDIALOG,PTEXT,PTYPE,RC,REC,TYPE,XSET
|
---|
| 40 | K ^TMP("OR",$J)
|
---|
| 41 | S (DSPLGRP,DSPLGPTR,ODIEN,ODIENXT,TYPE)=""
|
---|
| 42 | S XSET="S RC=ODIENXT_U_$P(REC,U)_U_$P(REC,U,2)_U_$G(ODATYPE)_U_$G(ODAROUTE)_U_$G(ODASCHD)_U_$G(ODARATE)_U_$G(ODALIMIT)"
|
---|
| 43 | S DOSE=+$O(^ORD(101.41,"B","OR GTX INSTRUCTIONS",0)) ;use for MM tag
|
---|
| 44 | ;
|
---|
| 45 | ; Order Dialogs Structure, Menus - original code by Anthony Puleo
|
---|
| 46 | ; Reminder Dialog Type: (PTYPE) E=Dialog Element, G=Dialog Group
|
---|
| 47 | F PTYPE="G","E" S DIEN="" D
|
---|
| 48 | . F S DIEN=$O(^PXRMD(801.41,"TYPE",PTYPE,DIEN)) Q:DIEN'>0 D ;DBIA 5133
|
---|
| 49 | .. ; PTEXT is 'FINDING ITEM' where 101.41 refers to ^ORD(101.41)
|
---|
| 50 | .. ; Example: ^PXRMD(801.41,2515,1)="^^3^^51;ORD(101.41,"
|
---|
| 51 | .. S PTEXT=$P($G(^PXRMD(801.41,DIEN,1)),U,5),AFIND=""
|
---|
| 52 | .. I PTEXT[101.41 S ^TMP("OR",$J,"RD",$P(PTEXT,";"))=DIEN
|
---|
| 53 | .. F S AFIND=$O(^PXRMD(801.41,DIEN,3,"B",AFIND)) Q:AFIND="" D
|
---|
| 54 | ... I AFIND[101.41 S ^TMP("OR",$J,"RD",$P(AFIND,";"))=DIEN
|
---|
| 55 | ;
|
---|
| 56 | ; find IEN for the 'PSJI OR PAT FLUID OE' entry in Order Dialog File
|
---|
| 57 | S ODIEN=$O(^ORD(101.41,"AB","PSJI OR PAT FLUID OE",0))
|
---|
| 58 | ;
|
---|
| 59 | ; loop through the Display Group File, file # 100.98 and store all
|
---|
| 60 | ; Display Group entries that have a pointer to 'PSJI OR PAT FLUID OE'
|
---|
| 61 | ; in field # 4 or Default Dialog field
|
---|
| 62 | F S DSPLGRP=$O(^ORD(100.98,DSPLGRP)) Q:DSPLGRP'?1N.N D
|
---|
| 63 | . I ODIEN=$P($G(^ORD(100.98,DSPLGRP,0)),U,4) S ^TMP("OR",$J,"DG",DSPLGRP)=ODIEN
|
---|
| 64 | ;
|
---|
| 65 | ; loop though Order Dialog file in order to
|
---|
| 66 | ; find each entry that is an IV Quick Order. Do this by checking
|
---|
| 67 | ; field #4 or TYPE field for a 'Q' and then check field #5 or
|
---|
| 68 | ; DISPLAY GROUP field for a pointer to one of the display groups found
|
---|
| 69 | ; above. If both conditions are true then continue to next step,
|
---|
| 70 | ; if not, continue looping.
|
---|
| 71 | F S ODIENXT=$O(^ORD(101.41,ODIENXT)) Q:ODIENXT'?1N.N D
|
---|
| 72 | . D MM
|
---|
| 73 | . S TYPE=$P($G(^ORD(101.41,ODIENXT,0)),U,4) Q:TYPE'="Q"
|
---|
| 74 | . S DSPLGPTR=$P($G(^ORD(101.41,ODIENXT,0)),U,5) Q:$G(DSPLGPTR)="" ;no display group pointer in QO
|
---|
| 75 | . Q:'$G(^TMP("OR",$J,"DG",DSPLGPTR)) ;no such display group in compiled data
|
---|
| 76 | . S REC=^ORD(101.41,ODIENXT,0)
|
---|
| 77 | . ;
|
---|
| 78 | . K ORDIALOG
|
---|
| 79 | . ; call GETQDLG^ORCD to build the Order dialog array (ORDIALOG())
|
---|
| 80 | . D GETQDLG^ORCD(ODIENXT) S (HIT)=0
|
---|
| 81 | . ;
|
---|
| 82 | . ;ZW ORDIALOG("B") ;ORDIALOG() listing
|
---|
| 83 | . ; set variables for 'TYPE' (IV TYPE), 'ROUTE', 'SCHEDULE', 'RATE', 'LIMITATION'
|
---|
| 84 | . F I=1:1:5 S @($P("ODATYPE,ODAROUTE,ODASCHD,ODARATE,ODALIMIT",",",I))=$G(ORDIALOG($P($G(ORDIALOG("B",$P("TYPE,ROUTE,SCHEDULE,INFUSION RATE,LIMITATION",",",I))),U,2),1))
|
---|
| 85 | . ;
|
---|
| 86 | . ; Quick Orders to be displayed to end user in First List Message follow:
|
---|
| 87 | . ;
|
---|
| 88 | . ; IV TYPE is null or ROUTE is null
|
---|
| 89 | . I (ODATYPE=""!(ODAROUTE="")) D XSET S ^TMP("OR",$J,"QO",ANCSTR,$P(REC,U),1,1,0)=RC,HIT=1
|
---|
| 90 | . ;
|
---|
| 91 | . ; IV TYPE is 'I' and SCHEDULE is null
|
---|
| 92 | . I ODATYPE="I"&(ODASCHD="") D XSET S ^TMP("OR",$J,"QO",ANCSTR,$P(REC,U),2,1,0)=RC,HIT=1
|
---|
| 93 | . ;
|
---|
| 94 | . ; IV TYPE is not 'C' or null or RATE is not 1-4#.1#, integer or '@'
|
---|
| 95 | . I ODATYPE="C"!(ODATYPE="") D
|
---|
| 96 | .. Q:ODARATE["@"
|
---|
| 97 | .. Q:ODARATE?1.4N!(ODARATE?1.4N1".".1N) ;integers alone OK
|
---|
| 98 | .. S GETXT=$$GETXT(ODARATE," ml/hr")
|
---|
| 99 | .. Q:GETXT?1.4N!(GETXT?1.4N1".".1N) ;# ml/hr & #.# ml/hr Rate OK
|
---|
| 100 | .. D XSET S ^TMP("OR",$J,"QO",ANCSTR,$P(REC,U),3,1,0)=RC,HIT=1
|
---|
| 101 | . ;
|
---|
| 102 | . ; IV TYPE is 'I' but RATE not an integer minute or hour or null
|
---|
| 103 | . I ODATYPE="I"&(ODARATE'?1.N)&(ODARATE'="") D ;integer alone OK
|
---|
| 104 | .. S GETXT=$$GETXT(ODARATE," Minutes| Hours")
|
---|
| 105 | .. Q:GETXT?1.3N ;integer # Minutes & # Hours Rate OK
|
---|
| 106 | .. D XSET S ^TMP("OR",$J,"QO",ANCSTR,$P(REC,U),4,1,0)=RC,HIT=1
|
---|
| 107 | . ;
|
---|
| 108 | . ; IV LIMIT or Duration (LIMITATION) was not integer or null
|
---|
| 109 | . I ODALIMIT'?.N,ODALIMIT'="" D
|
---|
| 110 | .. Q:ODALIMIT?1.2N1"D"!(ODALIMIT?1.3N1"H")!(ODALIMIT?1.4N1"ML")!(ODALIMIT?1.4N1" ML")!(ODALIMIT?1.2N1"L")!(ODALIMIT?1.4N1"CC")!(ODALIMIT?1.4N1" CC") ;#D, #H, #ML, #L, #CC Limit OK
|
---|
| 111 | .. Q:ODALIMIT?1.2N1"d"!(ODALIMIT?1.3N1"h")!(ODALIMIT?1.4N1"ml")!(ODALIMIT?1.4n1" ml")!(ODALIMIT?1.2N1"l")!(ODALIMIT?1.4N1"cc")!(ODALIMIT?1.4N1" cc") ;#d, #h, #ml, #l, #cc Limit OK
|
---|
| 112 | .. Q:ODALIMIT?1"for "1.2N1" days" ;for # days OK
|
---|
| 113 | .. Q:ODALIMIT?1.5N1"DOSES"!(ODALIMIT?1"for a total of "1.5N1" doses") ;for a total of # doses OK
|
---|
| 114 | .. Q:ODALIMIT?1"with total volume "1.2N1"L"!(ODALIMIT?1"with total volume "1.4N1"ml")
|
---|
| 115 | .. Q:ODALIMIT?1"for "1.2N1" hours"
|
---|
| 116 | .. D XSET S ^TMP("OR",$J,"QO",ANCSTR,$P(REC,U),5,1,0)=RC,HIT=1
|
---|
| 117 | . ;
|
---|
| 118 | . ; Go get next Order Dialog entry if no potential problems
|
---|
| 119 | . I 'HIT Q
|
---|
| 120 | . ;
|
---|
| 121 | . ; If the Quick Order is in First List message then check
|
---|
| 122 | . ; the Order Dialog file #101.41, field #58 or AUTO-ACCEPT QUICK ORDER
|
---|
| 123 | . ; field. If field #58 is set to 'Y'es then set the field to 'N'o and
|
---|
| 124 | . ; then display this Quick Order in the Second List.
|
---|
| 125 | . I +$P($G(^ORD(101.41,ODIENXT,5)),U,8) D
|
---|
| 126 | .. S $P(^ORD(101.41,ODIENXT,5),U,8)="" ;uncommented, sets AUTO-ACCEPT QUICK ORDER field
|
---|
| 127 | .. D XSET S ^TMP("OR",$J,"QO",ANCSTR,$P(REC,U),7,1,0)=RC
|
---|
| 128 | Q
|
---|
| 129 | ;
|
---|
| 130 | GETXT(LOOKIN,SUFFIX) ;Return text occuring prior to suffix
|
---|
| 131 | ; e.g. LOOKIN="INFUSE OVER 30 MINUTES",SUFFIX=" MINUTES" returns '30'
|
---|
| 132 | N I,ISUFFIX,RSTRG,RTXT,STRG
|
---|
| 133 | S I=0,RTXT=""
|
---|
| 134 | F S I=I+1,ISUFFIX=$P(SUFFIX,"|",I) Q:ISUFFIX="" D:$F(LOOKIN,ISUFFIX) Q:$G(RTXT)'=""
|
---|
| 135 | . S RSTRG=$RE($E(LOOKIN,1,$F(LOOKIN,ISUFFIX)-$L(ISUFFIX)-1))
|
---|
| 136 | . S RTXT=$P(RSTRG," ")
|
---|
| 137 | Q $RE(RTXT)
|
---|
| 138 | ;
|
---|
| 139 | MM ;Looks for 'MM' in Order Dialog / original code logic by James Hartin
|
---|
| 140 | N ANCSTR,MMREC,NEXT,NODE3,PROMPT,VALUE
|
---|
| 141 | S NEXT=1,VALUE=""
|
---|
| 142 | F S NEXT=$O(^ORD(101.41,ODIENXT,6,NEXT)) Q:NEXT'?1N.N D
|
---|
| 143 | . S VALUE=$G(^ORD(101.41,ODIENXT,6,NEXT,1)),PROMPT=+$P($G(^(0)),U,2)
|
---|
| 144 | . S MMREC=^ORD(101.41,ODIENXT,0)
|
---|
| 145 | . ; ODIEN^NAME^DISPLAY TEXT^VALUE
|
---|
| 146 | . I PROMPT=DOSE,(VALUE["MM ") D
|
---|
| 147 | .. D ANCSTR
|
---|
| 148 | .. S ^TMP("OR",$J,"QO",ANCSTR,$P(MMREC,U),6,1,0)=ODIENXT_U_$P(MMREC,U)_U_$P(MMREC,U,2)_U_VALUE
|
---|
| 149 | Q
|
---|
| 150 | ;
|
---|
| 151 | MAILSU ;Set-up MAILMAN variables and format ^TMP("OR",$J,"MAIL")
|
---|
| 152 | N DASH,DISPNAME,HDRLINE,LEGEND,LEGENDS,NEXT,NUM,NXTLINE,ODIENXT,ODQONAME,ORLEGEND,OROUT,QONAM,QOTOT,QORECORD,SPC
|
---|
| 153 | K ^TMP("OR",$J,"MAIL")
|
---|
| 154 | ;
|
---|
| 155 | ;Title of emails
|
---|
| 156 | S:ANCSTR="Y" XMSUB="MED QUICK ORDERS W/ ANCESTORS: "
|
---|
| 157 | S:ANCSTR="N" XMSUB="MED QUICK ORDERS W/O ANCESTORS: "
|
---|
| 158 | S XMSUB=XMSUB_$$HTE^XLFDT($H)
|
---|
| 159 | ;
|
---|
| 160 | ;Group 1/A="IV TYPE IS NULL OR ROUTE IS NULL"
|
---|
| 161 | ;Group 2/B="IV TYPE IS 'I' AND SCHEDULE IS NULL"
|
---|
| 162 | ;Group 3/C="IV TYPE IS NOT 'C' OR NULL OR RATE IS NOT 1-4#.1#, INTERGER OR '@'"
|
---|
| 163 | ;Group 4/D="IV TYPE IS 'I' BUT RATE NOT AN INTEGER MINUTE OR HOUR"
|
---|
| 164 | ;Group 5/E="IV LIMIT OR DURATION (LIMITATION) WAS NOT NULL OR INTEGER"
|
---|
| 165 | ;Group 6/F="ORDER DIALOGS WITH 'MM' IN THE DISPLAY TEXT"
|
---|
| 166 | ;Group 7/G="AUTO-ACCEPT QUICK ORDER WAS 'Y'es, NOW SET TO 'N'o"
|
---|
| 167 | ;
|
---|
| 168 | D NTRY^ORWOD1
|
---|
| 169 | S ODQONAME="@",SPC=" ",QOTOT=0
|
---|
| 170 | F S ODQONAME=$O(^TMP("OR",$J,"QO",ANCSTR,ODQONAME)) Q:ODQONAME="" D
|
---|
| 171 | . S (LEGENDS,ORLEGEND,QORECORD)=""
|
---|
| 172 | . F S ORLEGEND=$O(^TMP("OR",$J,"QO",ANCSTR,ODQONAME,ORLEGEND)) D Q:ORLEGEND=""
|
---|
| 173 | .. I ORLEGEND'="" S LEGENDS=LEGENDS_$C(ORLEGEND+64) S:$G(QORECORD)="" QORECORD=^TMP("OR",$J,"QO",ANCSTR,ODQONAME,ORLEGEND,1,0) Q
|
---|
| 174 | .. S NXTLINE=NXTLINE+1,QONAM=$P(QORECORD,U,2),DISPNAME=$P(QORECORD,U,3) S:DISPNAME="" DISPNAME=SPC
|
---|
| 175 | .. S OROUT=$J($P(QORECORD,U,1),5)_" "_$E(QONAM,1,30)_$E(SPC,1,30-$L(QONAM))_" "_$E(DISPNAME,1,30)_$E(SPC,1,30-$L(DISPNAME))_" "_$J(LEGENDS,6)
|
---|
| 176 | .. S ^TMP("OR",$J,"MAIL",NXTLINE,0)=OROUT,QOTOT=QOTOT+1
|
---|
| 177 | S NXTLINE=NXTLINE+1,^TMP("OR",$J,"MAIL",NXTLINE,0)=""
|
---|
| 178 | S NXTLINE=NXTLINE+1,^TMP("OR",$J,"MAIL",NXTLINE,0)=QOTOT_" = Med Quick Orders"
|
---|
| 179 | Q
|
---|
| 180 | ;
|
---|
| 181 | SEND(XMSUB,USER) ;Send a MailMan message to USER
|
---|
| 182 | ; The text of the message is located in ^TMP("OR",$J,"MAIL",LineNumbers0-n)
|
---|
| 183 | ; The subject is the string XMSUB.
|
---|
| 184 | N MGIEN,MGROUP,NL,REF,XMDUZ,XMY,XMZ
|
---|
| 185 | ;
|
---|
| 186 | ;Make sure the subject does not exceed 64 characters.
|
---|
| 187 | S XMSUB=$E(XMSUB,1,64)
|
---|
| 188 | ;Make the sender the Postmaster.
|
---|
| 189 | S XMDUZ=0.5
|
---|
| 190 | ;
|
---|
| 191 | RETRY ;Get the message number.
|
---|
| 192 | D XMZ^XMA2
|
---|
| 193 | I XMZ<1 G RETRY
|
---|
| 194 | ;
|
---|
| 195 | ;Load the message
|
---|
| 196 | M ^XMB(3.9,XMZ,2)=^TMP("OR",$J,"MAIL")
|
---|
| 197 | S NL=$O(^XMB(3.9,XMZ,2,""),-1)
|
---|
| 198 | S ^XMB(3.9,XMZ,2,0)="^3.92^"_+NL_U_+NL_U_DT
|
---|
| 199 | ;
|
---|
| 200 | ;Send message to USER
|
---|
| 201 | I $G(USER)'="" S XMY(DUZ)="" D ENT1^XMD Q
|
---|
| 202 | W !,"Error: No USER defined..message not sent!"
|
---|
| 203 | Q
|
---|
| 204 | ;
|
---|
| 205 | CLEANUP ; Clean-up
|
---|
| 206 | K ^TMP("OR",$J)
|
---|
| 207 | Q
|
---|