| 1 | ORWU ; SLC/KCM - General Utilites for Windows Calls; 2/28/01 [1/15/04 11:43am] | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**10,85,132,148,149,187,195,215**;Dec 17, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | DT(Y,X,%DT) ; Internal Fileman Date/Time | 
|---|
| 5 | ; change the '00:00' that could be passed so Fileman doesn't reject | 
|---|
| 6 | I $L($P(X,"@",2)),("00000000"[$TR($P(X,"@",2),":","")) S $P(X,"@",2)="00:00:01" | 
|---|
| 7 | S %DT=$G(%DT,"TS") D ^%DT K %DT | 
|---|
| 8 | Q | 
|---|
| 9 | VALDT(Y,X,%DT) ; Validate date/time | 
|---|
| 10 | S:'$D(%DT) %DT="TX" D ^%DT | 
|---|
| 11 | Q | 
|---|
| 12 | USERINFO(REC) ; Relevant info for current user | 
|---|
| 13 | ; return DUZ^NAME^USRCLS^CANSIGN^ISPROVIDER^ORDERROLE^NOORDER^DTIME^ | 
|---|
| 14 | ;        COUNTDOWN^ENABLEVERIFY^NOTIFYAPPS^MSGHANG^DOMAIN^SERVICE^ | 
|---|
| 15 | ;        AUTOSAVE^INITTAB^LASTTAB^WEBACCESS^ALLOWHOLD^ISRPL^RPLLIST^ | 
|---|
| 16 | ;        CORTABS^RPTTAB^STANUM^GECSTATUS^PRODACCT | 
|---|
| 17 | N X,ORRPL,ORRPL1,ORRPL2,ORTAB,CORTABS,RPTTAB,ORDT,OREFF,OREXP,ORDATEOK | 
|---|
| 18 | S REC=DUZ_U_$P(^VA(200,DUZ,0),U) | 
|---|
| 19 | S $P(REC,U,3)=$S($D(^XUSEC("ORES",DUZ)):3,$D(^XUSEC("ORELSE",DUZ)):2,$D(^XUSEC("OREMAS",DUZ)):1,1:0) | 
|---|
| 20 | S $P(REC,U,4)=$D(^XUSEC("ORES",DUZ))&$D(^XUSEC("PROVIDER",DUZ)) | 
|---|
| 21 | S $P(REC,U,5)=$D(^XUSEC("PROVIDER",DUZ)) | 
|---|
| 22 | S $P(REC,U,6)=$$ORDROLE | 
|---|
| 23 | S $P(REC,U,7)=$$GET^XPAR("USR^SYS^PKG","ORWOR DISABLE ORDERING",1,"I") | 
|---|
| 24 | S $P(REC,U,8)=$$GET^XPAR("USR^SYS","ORWOR TIMEOUT CHART",1,"I") | 
|---|
| 25 | I '$P(REC,U,8),$G(DTIME) S $P(REC,U,8)=DTIME | 
|---|
| 26 | S $P(REC,U,9)=$$GET^XPAR("USR^SYS^PKG","ORWOR TIMEOUT COUNTDOWN",1,"I") | 
|---|
| 27 | S X=$$GET^XPAR("USR^SYS^PKG","ORWOR ENABLE VERIFY",1,"I") | 
|---|
| 28 | S $P(REC,U,10)=$S(X=1:1,X=2:0,1:'$P(REC,U,7)) | 
|---|
| 29 | S $P(REC,U,11)=$$GET^XPAR("USR^SYS^PKG","ORWOR BROADCAST MESSAGES",1,"I") | 
|---|
| 30 | S $P(REC,U,12)=$$GET^XPAR("USR^SYS^PKG","ORWOR AUTO CLOSE PT MSG",1,"I") | 
|---|
| 31 | S $P(REC,U,13)=$$KSP^XUPARAM("WHERE")  ; domain | 
|---|
| 32 | S $P(REC,U,14)=+$G(^VA(200,DUZ,5))     ; service/section | 
|---|
| 33 | S $P(REC,U,15)=$$GET^XPAR("USR^SYS^PKG","ORWOR AUTOSAVE NOTE",1,"I") | 
|---|
| 34 | S $P(REC,U,16)=$$GET^XPAR("USR^DIV^SYS^PKG","ORCH INITIAL TAB",1,"I") | 
|---|
| 35 | S $P(REC,U,17)=$$GET^XPAR("USR^DIV^SYS^PKG","ORCH USE LAST TAB",1,"I") | 
|---|
| 36 | S $P(REC,U,18)=$$GET^XPAR("USR^DIV^SYS^PKG","ORWOR DISABLE WEB ACCESS",1,"I") | 
|---|
| 37 | S $P(REC,U,19)=$$GET^XPAR("SYS^PKG","ORWOR DISABLE HOLD ORDERS",1,"I") | 
|---|
| 38 | ; 2 pieces added by PKS on 11/5/2001 for "Reports Only:" | 
|---|
| 39 | ; IA# 10060 allows read access to ^VA(200 file. | 
|---|
| 40 | S ORRPL=$G(^VA(200,DUZ,101))           ; RPL node. | 
|---|
| 41 | S ORRPL1=$P(ORRPL,U) | 
|---|
| 42 | S $P(REC,U,20)=ORRPL1                  ; ISRPL piece. | 
|---|
| 43 | S ORRPL2=$P(ORRPL,U,2) | 
|---|
| 44 | S $P(REC,U,21)=ORRPL2                  ; RPLLIST piece. | 
|---|
| 45 | ; | 
|---|
| 46 | ; Additional pieces for CPRS tabs access: | 
|---|
| 47 | ; IA# 10060 allows read access to ^VA(200.01013 multiple. | 
|---|
| 48 | S ORDT=DT                              ; Today. | 
|---|
| 49 | S (CORTABS,RPTTAB)=0 | 
|---|
| 50 | S ORRPL=0 | 
|---|
| 51 | F  S ORRPL=$O(^VA(200,DUZ,"ORD",ORRPL)) Q:ORRPL<1  D | 
|---|
| 52 | .S ORTAB=$G(^VA(200,DUZ,"ORD",ORRPL,0)) | 
|---|
| 53 | .I ORTAB="" Q | 
|---|
| 54 | .S OREFF=$P(ORTAB,U,2) | 
|---|
| 55 | .S OREXP=$P(ORTAB,U,3) | 
|---|
| 56 | .S ORTAB=$P(ORTAB,U) | 
|---|
| 57 | .I ORTAB="" Q | 
|---|
| 58 | .S ORTAB=$G(^ORD(101.13,ORTAB,0)) | 
|---|
| 59 | .I ORTAB="" Q | 
|---|
| 60 | .S ORTAB=$P(ORTAB,U) | 
|---|
| 61 | .I ORTAB="" Q | 
|---|
| 62 | .S ORTAB=$$UP^XLFSTR(ORTAB) | 
|---|
| 63 | .S ORDATEOK=1                             ; Default. | 
|---|
| 64 | .I ((OREFF="")!(OREFF>ORDT)) S ORDATEOK=0 ; Eff. date NG. | 
|---|
| 65 | .I ORDATEOK  D | 
|---|
| 66 | ..I OREXP="" Q                            ; No exp. date. | 
|---|
| 67 | ..I (OREXP<ORDT) S ORDATEOK=0             ; Exp. date NG. | 
|---|
| 68 | ..I (OREXP=ORDT) S ORDATEOK=0             ; Exp. date NG. | 
|---|
| 69 | .; | 
|---|
| 70 | .; Set TRUE if OK: | 
|---|
| 71 | .I ((ORTAB="COR")&(ORDATEOK)) S CORTABS=1 | 
|---|
| 72 | .I ((ORTAB="RPT")&(ORDATEOK)) S RPTTAB=1 | 
|---|
| 73 | ; | 
|---|
| 74 | ; When done, set all valid tabs for access: | 
|---|
| 75 | S $P(REC,U,22)=CORTABS                 ; "Core" tabs. | 
|---|
| 76 | S $P(REC,U,23)=RPTTAB                  ; "Reports" tab. | 
|---|
| 77 | ; | 
|---|
| 78 | S $P(REC,U,24)=$P($$SITE^VASITE,U,3) | 
|---|
| 79 | S $P(REC,U,25)=$$GET^XPAR("USR^TEA","PXRM GEC STATUS CHECK",1,"I") | 
|---|
| 80 | S $P(REC,U,26)=$$PROD^XUPROD | 
|---|
| 81 | Q | 
|---|
| 82 | ; | 
|---|
| 83 | HASKEY(VAL,KEY) ; returns TRUE if the user possesses the security key | 
|---|
| 84 | S VAL=''$D(^XUSEC(KEY,DUZ)) | 
|---|
| 85 | Q | 
|---|
| 86 | HASOPTN(VAL,OPTION) ; returns TRUE if the user has access to a menu option | 
|---|
| 87 | S VAL=+$$ACCESS^XQCHK(DUZ,OPTION) | 
|---|
| 88 | I VAL'>0 S VAL=0 | 
|---|
| 89 | E  S VAL=1 | 
|---|
| 90 | Q | 
|---|
| 91 | NPHASKEY(VAL,NP,KEY)    ; returns TRUE if the person has the security key | 
|---|
| 92 | S VAL=''$D(^XUSEC(KEY,NP)) | 
|---|
| 93 | Q | 
|---|
| 94 | ORDROLE()    ; returns the role a person takes in ordering | 
|---|
| 95 | ; VAL: 0=nokey, 1=clerk, 2=nurse, 3=physician, 4=student, 5=bad keys | 
|---|
| 96 | ;I '$G(ORWCLVER) Q 0  ; version of client is to old for ordering | 
|---|
| 97 | I ($D(^XUSEC("OREMAS",DUZ))+$D(^XUSEC("ORELSE",DUZ))+$D(^XUSEC("ORES",DUZ)))>1 Q 5 | 
|---|
| 98 | I $D(^XUSEC("OREMAS",DUZ)) Q 1                           ; clerk | 
|---|
| 99 | I $D(^XUSEC("ORELSE",DUZ)) Q 2                           ; nurse | 
|---|
| 100 | I $D(^XUSEC("ORES",DUZ)),$D(^XUSEC("PROVIDER",DUZ)) Q 3  ; doctor | 
|---|
| 101 | I $D(^XUSEC("PROVIDER",DUZ)) Q 4                         ; student | 
|---|
| 102 | Q 0 | 
|---|
| 103 | VALIDSIG(ESOK,X) ; returns TRUE if valid electronic signature | 
|---|
| 104 | S X=$$DECRYP^XUSRB1(X),ESOK=0                   ; network encrypted | 
|---|
| 105 | D HASH^XUSHSHP | 
|---|
| 106 | I X=$P($G(^VA(200,+DUZ,20)),U,4) S ESOK=1 | 
|---|
| 107 | Q | 
|---|
| 108 | TOOLMENU(ORLST) ; returns a list of items for the Tools menu | 
|---|
| 109 | N ANENT | 
|---|
| 110 | S ANENT="ALL^"_$S($G(^VA(200,DUZ,5)):"^SRV.`"_+$G(^(5)),1:"") | 
|---|
| 111 | D GETLST^XPAR(.ORLST,ANENT,"ORWT TOOLS MENU","N") | 
|---|
| 112 | Q | 
|---|
| 113 | ACTLOC(LOC) ; Function: returns TRUE if active hospital location | 
|---|
| 114 | ; IA# 10040. | 
|---|
| 115 | N D0,X I +$G(^SC(LOC,"OOS")) Q 0                ; screen out OOS entry | 
|---|
| 116 | S D0=+$G(^SC(LOC,42)) I D0 D WIN^DGPMDDCF Q 'X  ; chk out of svc wards | 
|---|
| 117 | S X=$G(^SC(LOC,"I")) I +X=0 Q 1                 ; no inactivate date | 
|---|
| 118 | I DT>$P(X,U)&($P(X,U,2)=""!(DT<$P(X,U,2))) Q 0  ; chk reactivate date | 
|---|
| 119 | Q 1                                             ; must still be active | 
|---|
| 120 | ; | 
|---|
| 121 | CLINLOC(Y,FROM,DIR) ; Return a set of clinics from HOSPITAL LOCATION | 
|---|
| 122 | ; .Y=returned list, FROM=text to $O from, DIR=$O direction, | 
|---|
| 123 | N I,IEN,CNT S I=0,CNT=44 | 
|---|
| 124 | F  Q:I'<CNT  S FROM=$O(^SC("B",FROM),DIR) Q:FROM=""  D  ; IA# 10040. | 
|---|
| 125 | . S IEN="" F  S IEN=$O(^SC("B",FROM,IEN),DIR) Q:'IEN  D | 
|---|
| 126 | . . I ($P($G(^SC(IEN,0)),U,3)'="C")!('$$ACTLOC(IEN)) Q | 
|---|
| 127 | . . S I=I+1,Y(I)=IEN_"^"_FROM | 
|---|
| 128 | Q | 
|---|
| 129 | INPLOC(Y,FROM,DIR) ;Return a set of wards from HOSPITAL LOCATION | 
|---|
| 130 | ; .Y=returned list, FROM=text to $O from, DIR=$O direction, | 
|---|
| 131 | N I,IEN,CNT S I=0,CNT=44 | 
|---|
| 132 | F  Q:I'<CNT  S FROM=$O(^SC("B",FROM),DIR) Q:FROM=""  D  ; IA# 10040. | 
|---|
| 133 | . S IEN="" F  S IEN=$O(^SC("B",FROM,IEN),DIR) Q:'IEN  D | 
|---|
| 134 | . . I ($P($G(^SC(IEN,0)),U,3)'="W") Q | 
|---|
| 135 | . . I '$$ACTLOC(IEN) Q | 
|---|
| 136 | . . S I=I+1,Y(I)=IEN_"^"_FROM | 
|---|
| 137 | Q | 
|---|
| 138 | HOSPLOC(Y,FROM,DIR) ; Return a set of locations from HOSPITAL LOCATION | 
|---|
| 139 | ; .Y=returned list, FROM=text to $O from, DIR=$O direction, | 
|---|
| 140 | N I,IEN,CNT S I=0,CNT=44 | 
|---|
| 141 | F  Q:I'<CNT  S FROM=$O(^SC("B",FROM),DIR) Q:FROM=""  D  ; IA# 10040. | 
|---|
| 142 | . S IEN="" F  S IEN=$O(^SC("B",FROM,IEN),DIR) Q:'IEN  D | 
|---|
| 143 | . . Q:("CW"'[$P($G(^SC(IEN,0)),U,3)!('$$ACTLOC(IEN))) | 
|---|
| 144 | . . S I=I+1,Y(I)=IEN_"^"_FROM | 
|---|
| 145 | Q | 
|---|
| 146 | NEWPERS(ORY,ORFROM,ORDIR,ORKEY,ORDATE,ORVIZ,ORALL) ; Return a set of names from the NEW PERSON file. | 
|---|
| 147 | ; SLC/PKS: Code moved to ORWU1 on 12/3/2002. | 
|---|
| 148 | D NP1^ORWU1 | 
|---|
| 149 | Q | 
|---|
| 150 | GBLREF(VAL,FN) ; return global reference for file number | 
|---|
| 151 | S VAL="" Q:'FN | 
|---|
| 152 | S VAL=$$ROOT^DILFD(+FN) | 
|---|
| 153 | ; I $E($RE(VAL))="," S VAL=$E(VAL,1,$L(VAL)-1)_")" | 
|---|
| 154 | ; I $E($RE(VAL))="(" S VAL=$P(VAL,"(",1) | 
|---|
| 155 | Q | 
|---|
| 156 | GENERIC(Y,FROM,DIR,REF) ; Return a set of entries from xref in REF | 
|---|
| 157 | ; .Y=returned list, FROM=text to $O from, DIR=$O direction, | 
|---|
| 158 | N I,IEN,CNT S I=0,CNT=44 | 
|---|
| 159 | F  Q:I'<CNT  S FROM=$O(@REF@(FROM),DIR) Q:FROM=""  D | 
|---|
| 160 | . S IEN="" F  S IEN=$O(@REF@(FROM,IEN),DIR) Q:'IEN  D | 
|---|
| 161 | . . S I=I+1,Y(I)=IEN_"^"_FROM | 
|---|
| 162 | Q | 
|---|
| 163 | EXTNAME(VAL,IEN,FN) ; return external form of pointer | 
|---|
| 164 | ; IEN=internal number, FN=file number | 
|---|
| 165 | N REF S REF=$G(^DIC(FN,0,"GL")),VAL="" | 
|---|
| 166 | I $L(REF),+IEN S VAL=$P($G(@(REF_IEN_",0)")),U) | 
|---|
| 167 | Q | 
|---|
| 168 | PARAM(VAL,APARAM)       ; return a parameter value for a user | 
|---|
| 169 | ; call assumes current user, default entities, single instance | 
|---|
| 170 | S VAL=$$GET^XPAR("ALL",APARAM,1,"I") | 
|---|
| 171 | Q | 
|---|
| 172 | DEVICE(Y,FROM,DIR) ; Return a subset of entries from the Device file | 
|---|
| 173 | ; .LST(n)=IEN;Name^DisplayName^Location^RMar^PLen | 
|---|
| 174 | ; FROM=text to $O from, DIR=$O direction | 
|---|
| 175 | N I,IEN,CNT,SHOW,X S I=0,CNT=20 | 
|---|
| 176 | I FROM["<" S FROM=$RE($P($RE(FROM),"<  ",2)) | 
|---|
| 177 | F  Q:I'<CNT  S FROM=$O(^%ZIS(1,"B",FROM),DIR) Q:FROM=""  D | 
|---|
| 178 | . S IEN=0 F  S IEN=$O(^%ZIS(1,"B",FROM,IEN)) Q:'IEN  D | 
|---|
| 179 | .. N X0,X1,X90,X91,X95,XTYPE,XSTYPE,XTIME,ORA,ORPX,POP | 
|---|
| 180 | .. Q:'$D(^%ZIS(1,IEN,0))  S X0=^(0),X1=$G(^(1)),X90=$G(^(90)),X91=$G(^(91)),X95=$G(^(95)),XSTYPE=$G(^("SUBTYPE")),XTIME=$G(^("TIME")),XTYPE=$G(^("TYPE")) | 
|---|
| 181 | .. I $E($G(^%ZIS(2,+XSTYPE,0)))'="P" Q  ;Printers only | 
|---|
| 182 | .. S X=$P(XTYPE,"^") I X'="TRM",X'="HG",X'="HFS",X'="CHAN" Q  ;Device Types | 
|---|
| 183 | .. S X=X0 I ($P(X,U,2)="0")!($P(X,U,12)=2) Q  ;Queuing allowed | 
|---|
| 184 | .. S X=+X90 I X,(X'>DT) Q  ;Out of Service | 
|---|
| 185 | .. I XTIME]"" S ORA=$P(XTIME,"^"),ORPX=$P($H,",",2),ORPCNT=ORPX\60#60+(ORPX\3600*100),ORPX=$P(ORA,"-",2) I ORPX'<ORA&(ORPCNT'>ORPX&(ORPCNT'<ORA))!(ORPX<ORA&(ORPCNT'<ORA!(ORPCNT'>ORPX))) Q  ;Prohibited Times | 
|---|
| 186 | .. S POP=0 | 
|---|
| 187 | .. I X95]"" S ORPX=$G(DUZ(0)) I ORPX'="@" S POP=1 F ORA=1:1:$L(ORPX) I X95[$E(ORPX,ORA) S POP=0 Q | 
|---|
| 188 | .. Q:POP  ;Security check | 
|---|
| 189 | .. S SHOW=$P(X0,U) I SHOW'=FROM S SHOW=FROM_"  <"_SHOW_">" | 
|---|
| 190 | .. S I=I+1,Y(I)=IEN_";"_$P(X0,U)_U_SHOW_U_$P(X1,U)_U_$P(X91,U)_U_$P(X91,U,3) | 
|---|
| 191 | Q | 
|---|
| 192 | URGENCY(Y) ; -- retrieve set values from dd for discharge summary urgency | 
|---|
| 193 | N ORDD,I,X | 
|---|
| 194 | D FIELD^DID(8925,.09,"","POINTER","ORDD") | 
|---|
| 195 | F I=1:1 S X=$P(ORDD("POINTER"),";",I) Q:X=""   S Y(I)=$TR(X,":","^") | 
|---|
| 196 | Q | 
|---|
| 197 | PATCH(VAL,X) ; Return 1 if patch X is installed | 
|---|
| 198 | S VAL=$$PATCH^XPDUTL(X) | 
|---|
| 199 | Q | 
|---|
| 200 | VERSION(VAL,X) ;Return version of package or namespace | 
|---|
| 201 | S VAL=$$VERSION^XPDUTL(X) | 
|---|
| 202 | Q | 
|---|
| 203 | VERSRV(VAL,X,CLVER)   ; Return server version of option name | 
|---|
| 204 | S ORWCLVER=$G(CLVER)  ; leave in partition for session | 
|---|
| 205 | N BADVAL,ORLST | 
|---|
| 206 | D FIND^DIC(19,"",1,"X",X,1,,,,"ORLST") | 
|---|
| 207 | I 'ORLST("DILIST",0) S VAL="0.0.0.0" Q | 
|---|
| 208 | S VAL=ORLST("DILIST","ID",1,1) | 
|---|
| 209 | S VAL=$P(VAL,"version ",2) | 
|---|
| 210 | S BADVAL=0 | 
|---|
| 211 | I $P(VAL,".",1)="" S BADVAL=1 | 
|---|
| 212 | I $P(VAL,".",2)="" S BADVAL=1 | 
|---|
| 213 | I $P(VAL,".",3)="" S BADVAL=1 | 
|---|
| 214 | I $P(VAL,".",4)="" S BADVAL=1 | 
|---|
| 215 | I ((BADVAL)!('VAL)!(VAL="")) S VAL="0.0.0.0" | 
|---|
| 216 | Q | 
|---|