| 1 | RAUTL8 ;HISC/CAH-Utility routines ;10/3/97  16:02
 | 
|---|
| 2 |  ;;5.0;Radiology/Nuclear Medicine;**45,72**;Mar 16, 1998
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;Called by File 70, Exam subfile, Procedure Fld 2 Input transform
 | 
|---|
| 5 |  ;RA*5*45: modified -  logic in PRC1, ASK, ASK1, & MES1 subroutines
 | 
|---|
| 6 |  ;          removed -  MES subroutine
 | 
|---|
| 7 |  ;RA*5*72 03/23/2006 BAY/GJC/KAM Remedy Call 136200 Correct UNDEF issue
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 | PRC G PRC1:'$D(^RADPT(DA(2),"DT","AP",X)) ; check for C.M. reaction
 | 
|---|
| 10 |  N RADUP S RADUP=+$$DPDT^RAUTL8(X,.DA)
 | 
|---|
| 11 |  I RADUP D ASK Q:'$D(X)
 | 
|---|
| 12 | PRC1 ; Check for C.M. reaction on this patient
 | 
|---|
| 13 |  ; +X is the IEN of the Rad/Nuc Med Procedure in file 71
 | 
|---|
| 14 |  ; RA*5*72 - Changed next line to preserve variables
 | 
|---|
| 15 |  N RAGMRAOR S RAGMRAOR=$$GMRAOR(DA(2)) Q:RAGMRAOR'=1
 | 
|---|
| 16 |  D CONTRAST^RAUTL2(+X) ;displays contrast(s) associated with procedure
 | 
|---|
| 17 |  ;use RAPMSG for CONTRAST REACTION MESSAGE field 25, file 79
 | 
|---|
| 18 |  S RAPMSG=$G(^RA(79,+$P(^RADPT(DA(2),"DT",DA(1),0),"^",3),"CON"))
 | 
|---|
| 19 |  D:RAPMSG'="" EN^DDIOL("..."_RAPMSG_"...","","!?3")
 | 
|---|
| 20 |  D EN^DDIOL("","","!") ;line feed
 | 
|---|
| 21 |  K RAPMSG
 | 
|---|
| 22 |  D:$P($G(^RAMIS(71,+X,0)),U,20)="Y" MES1 ;message only if CM used
 | 
|---|
| 23 |  Q
 | 
|---|
| 24 | ASK ; Prompt user for yes/no response
 | 
|---|
| 25 |  N RAX D EN^DDIOL("Procedure is already entered for this date. Is it ok to continue? No// ","","!!?3")
 | 
|---|
| 26 | ASK1 R RAX:DTIME
 | 
|---|
| 27 |  S:'$T!(RAX="")!(RAX["^")!("Nn"[$E(RAX)) RAX="N"
 | 
|---|
| 28 |  K:RAX="N" X Q:'$D(X)
 | 
|---|
| 29 |  I "Yy"'[$E(RAX) S RAPMSG(1)="Enter 'YES' to register patient for this procedure, or 'NO' to edit the",RAPMSG(2)="above procedure. No// ",RAPMSG(1,"F")="!!?3",RAPMSG(2,"F")="!?3" D EN^DDIOL(.RAPMSG) K RAPMSG G ASK1
 | 
|---|
| 30 |  Q
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 | MES1 ; display procedure acceptance message
 | 
|---|
| 33 |  R !?5,"...Type 'OK' to acknowledge or '^' to select another procedure   ==> ",RAX:DTIME
 | 
|---|
| 34 |  S RAX=$$UP^XLFSTR(RAX)
 | 
|---|
| 35 |  I '$T!(RAX["^")!(RAX="OK") K:RAX'="OK" X K RAX,RAI Q
 | 
|---|
| 36 |  G MES1
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 | STATSEL ;Select one or more order statuses
 | 
|---|
| 39 |  ;INPUT VARIABLES:
 | 
|---|
| 40 |  ;   RANO() array contains status codes prohibited from selection
 | 
|---|
| 41 |  ;OUTPUT VARIABLES:
 | 
|---|
| 42 |  ;   RAST is a string of status codes selected (ex: 1^3^8)
 | 
|---|
| 43 |  ;   RAORST() is an array of selected status codes and status names
 | 
|---|
| 44 |  ;     (ex:   RAORST(1)="DISCONTINUED", RAORST(3)="HOLD", ... )
 | 
|---|
| 45 |  K RAST,RAORST W ! S RAORSTS=$P(^DD(75.1,5,0),U,3) F I=1:1 S X=$P(RAORSTS,";",I) Q:X=""  S X1=$P(X,":",1) I '$D(RANO(X1)) S X2=$P(X,":",2),RAORST(X1)=X2
 | 
|---|
| 46 |  W !!,"Select statuses to include on report.",! S X1="" F  S X1=$O(RAORST(X1)) Q:X1=""  W !?5,$J(X1,2,0)_"   "_RAORST(X1)
 | 
|---|
| 47 | STAT W ! K DIR S DIR(0)="L" D ^DIR Q:'$D(Y(0))
 | 
|---|
| 48 |  S RAST="" F I=1:1 S RASTX=$P(Y(0),",",I) Q:RASTX=""  I $D(RAORST(RASTX)) S RAST=RAST_"^"_RASTX
 | 
|---|
| 49 |  S RAST=$E(RAST,2,99) I RAST="" W !,"  ?? Sorry, invalid status selection.  Please try again.",! G STAT
 | 
|---|
| 50 |  S I="" F  S I=$O(RAORST(I)) Q:I=""  I RAST'[I K RAORST(I)
 | 
|---|
| 51 |  K RASTX,I,X,X1,X2 Q
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  ;INPUT TRANSFORM FOR SECONDARY INTERPRETING RESIDENT
 | 
|---|
| 54 | S() ; do not enter primary OR SAME SEC in secondary interpreting resident
 | 
|---|
| 55 |  I '$D(X)!('$D(DA(3))) G S2
 | 
|---|
| 56 |  I '$D(^RADPT(DA(3),"DT",DA(2),"P",DA(1),0)) G S2
 | 
|---|
| 57 |  I $D(^RADPT(DA(3),"DT",DA(2),"P",DA(1),"SRR","B",+Y)) Q 0 ;SAME SEC RES
 | 
|---|
| 58 |  I $P(^RADPT(DA(3),"DT",DA(2),"P",DA(1),0),"^",12)=+Y Q 0
 | 
|---|
| 59 |  Q 1
 | 
|---|
| 60 | S2 I '$D(^RADPT(DA(2),"DT",DA(1),"P",DA,0)) Q 0
 | 
|---|
| 61 |  I $D(^RADPT(DA(2),"DT",DA(1),"P",DA,"SRR","B",+Y)) Q 0 ;SAME SEC RES
 | 
|---|
| 62 |  I $P(^RADPT(DA(2),"DT",DA(1),"P",DA,0),"^",12)=+Y Q 0
 | 
|---|
| 63 |  Q 1
 | 
|---|
| 64 |  ;INPUT TRANSFORM FOR SECONDARY INTERPRETING STAFF
 | 
|---|
| 65 | SSR() ; do not enter primary OR SAME SEC in secondary interpreting staff
 | 
|---|
| 66 |  I '$D(X)!('$D(DA(3))) G SSR2
 | 
|---|
| 67 |  I '$D(^RADPT(DA(3),"DT",DA(2),"P",DA(1),0)) G SSR2
 | 
|---|
| 68 |  I $D(^RADPT(DA(3),"DT",DA(2),"P",DA(1),"SSR","B",+Y)) Q 0 ;SAME SEC STF
 | 
|---|
| 69 |  I $P(^RADPT(DA(3),"DT",DA(2),"P",DA(1),0),"^",15)=+Y Q 0
 | 
|---|
| 70 |  Q 1
 | 
|---|
| 71 | SSR2 I '$D(^RADPT(DA(2),"DT",DA(1),"P",DA,0)) Q 0
 | 
|---|
| 72 |  I $D(^RADPT(DA(2),"DT",DA(1),"P",DA,"SSR","B",+Y)) Q 0 ;SAME SEC STF
 | 
|---|
| 73 |  I $P(^RADPT(DA(2),"DT",DA(1),"P",DA,0),"^",15)=+Y Q 0
 | 
|---|
| 74 |  Q 1
 | 
|---|
| 75 |  ;INPUT TRANSFORM FOR PRIMARY INTERPRETING RESIDENT
 | 
|---|
| 76 |  ; *** NOT USED - See EN ***
 | 
|---|
| 77 | PRRS() ; do not enter secondary into primary interpreting resident screen
 | 
|---|
| 78 |  ; called from input transform ^DD(70.03,12,0)
 | 
|---|
| 79 |  I $D(^RADPT(DA(2),"DT",DA(1),"P",DA,"SRR","B",+Y)) Q 0
 | 
|---|
| 80 |  Q 1
 | 
|---|
| 81 |  ;INPUT TRANSFORM FOR PRIMARY INTERPRETING STAFF
 | 
|---|
| 82 |  ; *** NOT USED - See EN ***
 | 
|---|
| 83 | PSRS() ; do not enter secondary into primary interpreting staff screen
 | 
|---|
| 84 |  ; called from input transform ^DD(70.03,15,0)
 | 
|---|
| 85 |  I $D(^RADPT(DA(2),"DT",DA(1),"P",DA,"SSR","B",+Y)) Q 0
 | 
|---|
| 86 |  Q 1
 | 
|---|
| 87 | EN(X,FLD,RA) ;Input transform screen for Primary Staff, Primary Res
 | 
|---|
| 88 |  ;Used by fields 70.03,12 & 70.03,15.  If 'Primary' is found in
 | 
|---|
| 89 |  ; the 'Secondary' multiple then delete the 'Secondary' entry.
 | 
|---|
| 90 |  ; X = 'Primary' IEN,  FLD = 'Secondary' mult. to check,  RA = DA array
 | 
|---|
| 91 |  N DA,DEL,HDR,IEN,NODE,SAVEX,SUBDD,XREF
 | 
|---|
| 92 |  S NODE=$S(FLD=60:"SSR",FLD=70:"SRR",1:""),SAVEX=X
 | 
|---|
| 93 |  S SUBDD=$S(FLD=60:70.11,FLD=70:70.09,1:""),(IEN,DEL)=0
 | 
|---|
| 94 |  I (NODE="")!(X'>0)!(FLD'>0)!(SUBDD'>0) Q
 | 
|---|
| 95 |  F  S IEN=$O(^RADPT(RA(2),"DT",RA(1),"P",RA,NODE,"B",X,IEN)) Q:IEN'>0  D
 | 
|---|
| 96 |  . S XREF=0
 | 
|---|
| 97 |  . F  S XREF=$O(^DD(SUBDD,.01,1,XREF)) Q:XREF'>0  D
 | 
|---|
| 98 |  .. S (D0,DA(3))=RA(2),(D1,DA(2))=RA(1),(D2,DA(1))=RA,(D3,DA)=IEN,X=SAVEX
 | 
|---|
| 99 |  .. I $G(^DD(SUBDD,.01,1,XREF,2))]"" X ^(2)
 | 
|---|
| 100 |  .. Q
 | 
|---|
| 101 |  . K ^RADPT(RA(2),"DT",RA(1),"P",RA,NODE,IEN,0) S DEL=DEL+1
 | 
|---|
| 102 |  . Q
 | 
|---|
| 103 |  I DEL D
 | 
|---|
| 104 |  . S HDR=$G(^RADPT(RA(2),"DT",RA(1),"P",RA,NODE,0)) Q:HDR=""
 | 
|---|
| 105 |  . S HDR(3)=+$O(^RADPT(RA(2),"DT",RA(1),"P",RA,NODE,0))
 | 
|---|
| 106 |  . S HDR(4)=$P(HDR,U,4)-DEL
 | 
|---|
| 107 |  . S:HDR(3)'>0 HDR(3)="" S:HDR(4)'>0 HDR(4)=""
 | 
|---|
| 108 |  . S $P(^RADPT(RA(2),"DT",RA(1),"P",RA,NODE,0),U,3,4)=HDR(3)_U_HDR(4)
 | 
|---|
| 109 |  . Q
 | 
|---|
| 110 |  S X=SAVEX
 | 
|---|
| 111 |  Q
 | 
|---|
| 112 | DPDT(RAPRC,RAY) ; Check for registration of duplicate procedures on the same
 | 
|---|
| 113 |  ; date/time.  Called from PRC above.
 | 
|---|
| 114 |  ; INPUT VARIABLES
 | 
|---|
| 115 |  ; 'RAPRC' --> IEN of the procedure (71)
 | 
|---|
| 116 |  ; 'RAY'   --> DA array i.e, DA, DA(1), & DA(2)
 | 
|---|
| 117 |  ; OUTPUT VARIABLES
 | 
|---|
| 118 |  ; 'RAFLG' --> RAFLG=1 procedure registered for this date/time
 | 
|---|
| 119 |  ;         --> RAFLG=0 initial registration for procedure@date/time
 | 
|---|
| 120 |  N RA72,RABDT,RACIEN,RAEDT,RAFLG,RAI S RAFLG=0
 | 
|---|
| 121 |  S RABDT=RAY(1)\1,RAEDT=RABDT_".9999",RAI=RABDT-.0000001
 | 
|---|
| 122 |  F  S RAI=$O(^RADPT(RAY(2),"DT","AP",RAPRC,RAI)) Q:RAI'>0!(RAI>RAEDT)  D  Q:RAFLG
 | 
|---|
| 123 |  . Q:RAI=RAY(1)  ; At this point our exam status is 'WAITING FOR EXAM'
 | 
|---|
| 124 |  . S RACIEN=$O(^RADPT(RAY(2),"DT","AP",RAPRC,RAI,0)) Q:'RACIEN
 | 
|---|
| 125 |  . S RA72=+$P($G(^RADPT(RAY(2),"DT",RAI,"P",RACIEN,0)),U,3) ;xam stat
 | 
|---|
| 126 |  . S RA72(3)=$P($G(^RA(72,RA72,0)),U,3)
 | 
|---|
| 127 |  . I RA72(3)'=0 S RAFLG=1 ; cancelled exams are not taken into account
 | 
|---|
| 128 |  . Q
 | 
|---|
| 129 |  Q RAFLG
 | 
|---|
| 130 | SCRN(RADA,RARS,Y,RALVL) ; check if the primary or secondary int'ng staff
 | 
|---|
| 131 |  ; or resident has access to a location or locations which have
 | 
|---|
| 132 |  ; an imaging type which match the imaging type of the examination.
 | 
|---|
| 133 |  ; This screen will also check the classification of the individual to 
 | 
|---|
| 134 |  ; ensure that they are active and valid for the field being edited.
 | 
|---|
| 135 |  ;
 | 
|---|
| 136 |  ; Called from DD's: ^DD(70.03,12 - ^DD(70.03,15  - ^DD(70.03,60
 | 
|---|
| 137 |  ;                   ^DD(70.03,70 - ^DD(70.09,.01 - ^DD(70.11,.01
 | 
|---|
| 138 |  ;
 | 
|---|
| 139 |  ; Input variables:  RADA-> DA array, maps to RADFN, RADTI & RACNI
 | 
|---|
| 140 |  ;                   RARS-> Classification: Resident("R") or Staff("S")
 | 
|---|
| 141 |  ;                      Y-> selected resident/staff
 | 
|---|
| 142 |  ;                   RALVL-> "PRI"=Primary physician, "SEC"=Secondary
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 |  ; Output variable: $S(1:I-Types & classification match, resident/staff
 | 
|---|
| 145 |  ;                      ok,0:no match re-select resident/staff)
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 |  I $S('$D(^VA(200,+Y,"RA")):1,'$P(^("RA"),U,3):1,DT'>$P(^("RA"),U,3):1,1:0),($D(^VA(200,"ARC",RARS,+Y)))
 | 
|---|
| 148 |  Q:'$T 0 ; failed the classification part of the screen
 | 
|---|
| 149 |  Q:$D(^XUSEC("RA ALLOC",+Y)) 1 ; Resident/Staff has access to all loc's!
 | 
|---|
| 150 |  N RA7002,RACCESS
 | 
|---|
| 151 |  ; adjust RADA() due Fileman's unpredictable retention of DA() levels
 | 
|---|
| 152 |  I RALVL="SEC" D
 | 
|---|
| 153 |  . I '$D(RADA(3)) S RA7002=$G(^RADPT(RADA(2),"DT",RADA(1),0))
 | 
|---|
| 154 |  . I $D(RADA(3)),(RADA(2)'=RADA(3)) S RA7002=$G(^RADPT(RADA(3),"DT",RADA(2),0))
 | 
|---|
| 155 |  . I $D(RADA(3)),(RADA(2)=RADA(3)) S RA7002=$G(^RADPT(RADA(2),"DT",RADA(1),0))
 | 
|---|
| 156 |  I RALVL="PRI" S RA7002=$G(^RADPT(RADA(2),"DT",RADA(1),0))
 | 
|---|
| 157 |  D VARACC^RAUTL6(+Y) ; set-up access array for selected resident/staff
 | 
|---|
| 158 |  Q:'$D(RACCESS(+Y,"IMG",+$P(RA7002,"^",2))) 0 ; no i-type match
 | 
|---|
| 159 |  Q 1
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 | CMEDIA(RADFN,RADTI,RACNI) ;return the CM used with an exam
 | 
|---|
| 162 |  ;input: RADFN=patient DFN, RADTI=inv. date/time of exam, RACNI=exam IEN
 | 
|---|
| 163 |  ;return: contrast media administered to the patient during an exam
 | 
|---|
| 164 |  N RAI,RAS S RAI=0,RAS=""
 | 
|---|
| 165 |  F  S RAI=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"CM",RAI)) Q:'RAI  D
 | 
|---|
| 166 |  .S RAI(0)=$P($G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"CM",RAI,0)),U)
 | 
|---|
| 167 |  .S RAS=RAS_$$EXTERNAL^DILFD(70.3225,.01,"",RAI(0))_", "
 | 
|---|
| 168 |  Q $P(RAS,", ",1,($L(RAS,", ")-1))
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 | GMRAOR(RADA2) ;look for a contrast media reaction
 | 
|---|
| 171 |  N D,D0,D1,D2,D3,DA,DC,DD,DFN,DG,DH,DI,DIC,DIE,DIEDA,DIEL,DIETMP,DIEXREF,DIFLD,DIIENS,DIOV,DIP,DK,DL,DLAYGO,DM,DN,DOV,DP,DQ,DR,X,Y
 | 
|---|
| 172 |  Q $$ORCHK^GMRAOR(RADA2,"CM")
 | 
|---|
| 173 |  ;
 | 
|---|