1 | GMRAOR ;HIRMFO/WAA,RM-OERR UTILITIES ;10/23/06 09:26
|
---|
2 | ;;4.0;Adverse Reaction Tracking;**2,13,26,37**;Mar 29, 1996;Build 1
|
---|
3 | ORCHK(DFN,TYP,PTR,LOC) ; Given a patient IEN (DFN), this function will
|
---|
4 | ; return 1 (true) if the patient has an allergy to an agent defined
|
---|
5 | ; by TYP and PTR, else it returns 0 (false). See table below.
|
---|
6 | ; The Contrast Media Reaction check will return a null if the patient
|
---|
7 | ; is not in the ART database. Contrast Media checks will also
|
---|
8 | ; return whether the check is from local or remote data as the second
|
---|
9 | ; piece of the flag if LOC is defined as a positive integer
|
---|
10 | ;
|
---|
11 | ; Contrast Media Reaction: TYP="CM", PTR (undefined)
|
---|
12 | ; Drug Reaction: TYP="DR", PTR=IEN in ^PSNDF(.
|
---|
13 | ; Drug Ingredients: TYP="IN", PTR=IEN in ^PS(50.416,
|
---|
14 | ; Drug Class: TYP="CL", PTR=IEN in ^PS(50.605,
|
---|
15 | ;
|
---|
16 | N GMRAFLG,GMRACM,DA ;37
|
---|
17 | S GMRAFLG=0
|
---|
18 | I $G(DFN)<1!("^CM^DR^IN^CL^"'[("^"_$G(TYP)_"^"))!($G(TYP)'="CM"&($G(PTR)<1)) S GMRAFLG=""
|
---|
19 | E D
|
---|
20 | .D GETDATA(DFN) ;26 Retreive local/remote allergy data for order checking
|
---|
21 | .I TYP="CM" S GMRAFLG=$$RAD(DFN)_$S($G(LOC)&($G(GMRACM)'=""):("^"_$G(GMRACM)),1:"") ;37 check for Contrast Media Reaction, return location if requested
|
---|
22 | .I TYP="DR" S GMRAFLG=$$DRUG(DFN,PTR) ; check for Drug Reaction
|
---|
23 | .I TYP="IN" S GMRAFLG=$$ING(DFN,PTR) ; Check for Drug Ingredients
|
---|
24 | .I TYP="CL" S GMRAFLG=$$CLASS(DFN,PTR) ; Check for Drug Class
|
---|
25 | .Q
|
---|
26 | Q GMRAFLG
|
---|
27 | RAD(DFN) ; Subroutine checks for Contrast Media Reaction, returns 1 or 0.
|
---|
28 | N FLG,DC,LOCAL,REMOTE ;37 entire section added
|
---|
29 | S FLG=$P($G(^GMR(120.86,DFN,0)),U,2) S:FLG=1 FLG=0 S DC="DX10" F S DC=$O(^TMP("GMRAOC",$J,"APC",DC)) Q:DC'["DX10" D
|
---|
30 | .S FLG=1
|
---|
31 | .I $G(^TMP("GMRAOC",$J,"APC",DC))["LOCAL" S LOCAL=1
|
---|
32 | .I $G(^TMP("GMRAOC",$J,"APC",DC))["REMOTE" S REMOTE=1
|
---|
33 | S GMRACM=$S($G(LOCAL)&($G(REMOTE)):"LOCAL AND REMOTE SITE(S)",$G(LOCAL):"LOCAL",$G(REMOTE):"REMOTE SITE(S)",1:"")
|
---|
34 | ;D EN1^GMRADPT S FLG=GMRAL
|
---|
35 | ;I GMRAL S GMRAPA=0 F S GMRAPA=$O(GMRAL(GMRAPA)) Q:GMRAPA<1 D Q:FLG
|
---|
36 | ;.S FLG=$$RALLG^GMRARAD(GMRAPA)
|
---|
37 | ;.Q
|
---|
38 | Q FLG
|
---|
39 | DRUG(DFN,PTR) ; Subroutine checks for Drug Reaction, returns 1 or 0.
|
---|
40 | N %,FLG,GMRAC,GMRADR,GMRAI,PSNVPN,PSNDA S FLG=0
|
---|
41 | K GMRAING,GMRADRCL
|
---|
42 | S PSNDA=$P(PTR,"."),PSNVPN=$P(PTR,".",2)
|
---|
43 | I $G(@($$NDFREF_PSNDA_",0)"))'="" D
|
---|
44 | .; Check for rxn to ingredients.
|
---|
45 | .; If use the new entry point if there.
|
---|
46 | .I $T(DISPDRG^PSNNGR)]"",PSNVPN]"" D
|
---|
47 | ..K ^TMP("PSNDD",$J) D DISPDRG^PSNNGR ; get ingredients
|
---|
48 | ..S GMRAI=0,%=1 F S GMRAI=$O(^TMP("PSNDD",$J,GMRAI)) Q:GMRAI<1 I $D(^TMP("GMRAOC",$J,"API",GMRAI)) S FLG=1,GMRAING(%)=^TMP("PSNDD",$J,GMRAI)_$$FAC(^TMP("GMRAOC",$J,"API",GMRAI)),%=%+1 ;26
|
---|
49 | ..K ^TMP("PSNDD",$J)
|
---|
50 | ..Q
|
---|
51 | .E D ; get ingredients
|
---|
52 | ..K ^TMP("PSN",$J) D ^PSNNGR
|
---|
53 | ..S GMRAI=0,%=1 F S GMRAI=$O(^TMP("PSN",$J,GMRAI)) Q:GMRAI<1 I $D(^TMP("GMRAOC",$J,"API",GMRAI)) S FLG=1,GMRAING(%)=^TMP("PSN",$J,GMRAI)_$$FAC(^TMP("GMRAOC",$J,"API",GMRAI)),%=%+1 ;26
|
---|
54 | ..K ^TMP("PSN",$J)
|
---|
55 | ..Q
|
---|
56 | .Q:FLG ; Rxn to ingredient, quit now.
|
---|
57 | .; Check for rxn to VA Drug Class
|
---|
58 | .S PSNDA=$P(PTR,"."),PSNVPN=$P(PTR,".",2)
|
---|
59 | .N CLASS
|
---|
60 | .I PSNVPN S CLASS=$$DCLCODE^PSNAPIS(PSNDA,PSNVPN) D DRCL(CLASS) Q
|
---|
61 | .N CLASS,LIST
|
---|
62 | .S LIST=$$CLIST^PSNAPIS(PSNDA,.LIST) Q:'$G(LIST)
|
---|
63 | .S LIST=0 F S LIST=$O(LIST(LIST)) Q:'LIST D DRCL($P(LIST(LIST),U,2))
|
---|
64 | .Q
|
---|
65 | Q FLG
|
---|
66 | FAC(NODE) ;
|
---|
67 | N FAC
|
---|
68 | S FAC=$S($L(NODE):" ("_NODE_")",1:"")
|
---|
69 | Q FAC
|
---|
70 | DRCL(CODE) ;return any rxn's in GMRADRCL(
|
---|
71 | I '$D(^TMP("GMRAOC",$J,"APC",CODE)) Q
|
---|
72 | N J S J=$S('$D(GMRADRCL):1,1:$O(GMRADRCL(999),-1)+1)
|
---|
73 | ;S GMRADRCL(J)=$$CLASS2^PSNAPIS(CODE)
|
---|
74 | N CLSFN
|
---|
75 | S CLSFN=$P(^PS(50.605,+$O(^PS(50.605,"B",CODE,0)),0),U,2)
|
---|
76 | S GMRADRCL(J)=CODE_"^"_CLSFN_$$FAC(^TMP("GMRAOC",$J,"APC",CODE))
|
---|
77 | S FLG=2
|
---|
78 | Q
|
---|
79 | ING(DFN,PTR) ; Subroutine checks for Drug Ingredients, returns:
|
---|
80 | ; If found FLG= 1 with GMRAIEN Array Drug Ingredients
|
---|
81 | ; Not found FLG= 0
|
---|
82 | N GMRAX K GMRAIEN
|
---|
83 | S FLG=0
|
---|
84 | S GMRAX=0
|
---|
85 | F S GMRAX=$O(^GMR(120.8,"API",DFN,PTR,GMRAX)) Q:GMRAX<1 S FLG=1,GMRAIEN(GMRAX)=""
|
---|
86 | Q FLG
|
---|
87 | CLASS(DFN,PTR) ; Subroutine checks for Drug Class, returns:
|
---|
88 | ; If found FLG= 1 with GMRAIEN Array Drug Class
|
---|
89 | ; Not found FLG= 0
|
---|
90 | N GMRAC,GMRAX K GMRAIEN
|
---|
91 | S GMRAX=0,FLG=0,GMRAC=$P($G(^PS(50.605,PTR,0)),U)
|
---|
92 | I GMRAC'="" F S GMRAX=$O(^GMR(120.8,"APC",DFN,GMRAC,GMRAX)) Q:GMRAX<1 S FLG=1,GMRAIEN(GMRAX)=""
|
---|
93 | Q FLG
|
---|
94 | NDFREF() ;get version dependent NDF reference
|
---|
95 | I $$VERSION^XPDUTL("PSN")<4 Q "^PSNDF("
|
---|
96 | Q "^PSNDF(50.6," ; new reference for ver 4.0
|
---|
97 | ;
|
---|
98 | GETDATA(DFN) ;Obtain local and HDR related allergy data for use in order checking. Section added in patch 26
|
---|
99 | ;Output from call will be stored in ^TMP as follows:
|
---|
100 | ;^TMP("GMRAOC",$J,"API",J)="" where J is the ingredient IEN
|
---|
101 | ;^TMP("GMRAOC",$J,"APC",K)="" where K is the drug class classification (e.g. MS105)
|
---|
102 | ;
|
---|
103 | L +^XTMP("GMRAOC",DFN)
|
---|
104 | S ^XTMP("GMRAOC",0)=$$FMADD^XLFDT($$NOW^XLFDT,2)_U_$$NOW^XLFDT
|
---|
105 | N GMRRECDT,GMRCACHE,GMRFRESH,GMRNEW,GMRXTMP
|
---|
106 | S (GMRFRESH,GMRNEW,GMRXTMP)=0
|
---|
107 | S GMRRECDT=$P($G(^XTMP("ORRDI","ART",DFN,0)),U)
|
---|
108 | S GMRCACHE=$$GET^XPAR("SYS","OR RDI CACHE TIME")
|
---|
109 | I $$FMDIFF^XLFDT($$NOW^XLFDT,GMRRECDT,2)<(60*GMRCACHE),$P(^XTMP("ORRDI","ART",DFN,0),U,3)>-1 S GMRFRESH=1
|
---|
110 | S GMRXTMP=$D(^XTMP("GMRAOC",DFN))
|
---|
111 | S GMRNEW=$S($D(^XTMP("GMRAOC",DFN,"ERROR")):2,$D(^XTMP("GMRAOC",DFN,"NEW")):1,1:0)
|
---|
112 | I GMRFRESH&GMRXTMP&(GMRNEW=1) K ^XTMP("GMRAOC",DFN,"NEW") D LOCAL(DFN)
|
---|
113 | I 'GMRFRESH!'GMRXTMP!(GMRNEW=2) K ^XTMP("GMRAOC",DFN) D REMOTE(DFN),LOCAL(DFN)
|
---|
114 | I GMRRECDT'=$G(^XTMP("GMRAOC",DFN,0)) K ^XTMP("GMRAOC",DFN) D REMOTE(DFN),LOCAL(DFN)
|
---|
115 | K ^TMP("GMRAOC",$J)
|
---|
116 | M ^TMP("GMRAOC",$J)=^XTMP("GMRAOC",DFN)
|
---|
117 | L -^XTMP("GMRAOC",DFN)
|
---|
118 | Q
|
---|
119 | ;
|
---|
120 | SETNODE(ITEM,DATA) ;
|
---|
121 | N VALUE
|
---|
122 | S VALUE=""
|
---|
123 | I ITEM[DATA S VALUE=ITEM Q VALUE
|
---|
124 | I DATA="LOCAL" D Q VALUE
|
---|
125 | .I ITEM="" S VALUE="LOCAL" Q
|
---|
126 | .I ITEM["REMOTE SITE(S)" S VALUE="LOCAL AND REMOTE SITE(S)"
|
---|
127 | I DATA="REMOTE SITE(S)" D Q VALUE
|
---|
128 | .I ITEM="" S VALUE="REMOTE SITE(S)" Q
|
---|
129 | .I ITEM["LOCAL" S VALUE="LOCAL AND REMOTE SITE(S)"
|
---|
130 | Q VALUE
|
---|
131 | ;
|
---|
132 | LOCAL(DFN) ;
|
---|
133 | N J
|
---|
134 | S J=0 F S J=$O(^GMR(120.8,"API",DFN,J)) Q:'+J S ^XTMP("GMRAOC",DFN,"API",J)=$$SETNODE($G(^XTMP("GMRAOC",DFN,"API",J)),"LOCAL")
|
---|
135 | S J="" F S J=$O(^GMR(120.8,"APC",DFN,J)) Q:J="" S ^XTMP("GMRAOC",DFN,"APC",J)=$$SETNODE($G(^XTMP("GMRAOC",DFN,"APC",J)),"LOCAL")
|
---|
136 | Q
|
---|
137 | ;
|
---|
138 | REMOTE(DFN) ;
|
---|
139 | ;I $G(TYP)'="DR" Q ;only get remote data for order checking on drug orders
|
---|
140 | N J,FLG,REACT,IN,VUID,FILE,GMRARAY,DC,DCLASS,GMRAING,GMRADC,K,INGLST,I,PRIM,IEN
|
---|
141 | ;Check for HDR data
|
---|
142 | Q:'$L($T(HAVEHDR^ORRDI1)) Q:'$$HAVEHDR^ORRDI1 ;Quit if call doesn't exist or if the HDR isn't available
|
---|
143 | Q:'$$GET^ORRDI1(DFN,"ART") ;Quit if no HDR data for selected patient
|
---|
144 | S ^XTMP("GMRAOC",DFN,0)=$P($G(^XTMP("ORRDI","ART",DFN,0)),U)
|
---|
145 | S J=0 F S J=$O(^XTMP("ORRDI","ART",DFN,J)) Q:'+J D
|
---|
146 | .S FLG=0
|
---|
147 | .S REACT=$G(^XTMP("ORRDI","ART",DFN,J,"REACTANT",0)) ;Reaction VUID
|
---|
148 | .I $D(^XTMP("ORRDI","ART",DFN,J,"DRUG INGREDIENTS")) D ;Ingredient data exists
|
---|
149 | ..S FLG=1 ;Have ingredient data so REACT is ok
|
---|
150 | ..S IN=0 F S IN=$O(^XTMP("ORRDI","ART",DFN,J,"DRUG INGREDIENTS",IN)) Q:'+IN D
|
---|
151 | ...S VUID=$P(^(IN),U),FILE=$P(^(IN),U,3) ;Naked from above line
|
---|
152 | ...S FILE=$P(FILE,"99VA",2)
|
---|
153 | ...D GETIREF^XTID(FILE,,VUID,"GMRARAY") ;Get IENs related to VUID
|
---|
154 | ...S IEN=0 F S IEN=$O(GMRARAY(FILE,.01,IEN)) Q:'+IEN S ^XTMP("GMRAOC",DFN,"API",+IEN)=$$SETNODE($G(^XTMP("GMRAOC",DFN,"API",+IEN)),"REMOTE SITE(S)")
|
---|
155 | ...K GMRARAY
|
---|
156 | .I $D(^XTMP("ORRDI","ART",DFN,J,"DRUG CLASSES")) D ;Drug class data exists
|
---|
157 | ..S FLG=1
|
---|
158 | ..S DC=0 F S DC=$O(^XTMP("ORRDI","ART",DFN,J,"DRUG CLASSES",DC)) Q:'+DC D
|
---|
159 | ...S DCLASS=$P(^(DC),U,2) ;Naked from above, gets drug class (e.g.MS105)
|
---|
160 | ...S ^XTMP("GMRAOC",DFN,"APC",DCLASS)=$$SETNODE($G(^XTMP("GMRAOC",DFN,"APC",DCLASS)),"REMOTE SITE(S)")
|
---|
161 | .D FIND(REACT,.GMRAING,.GMRADC) I $D(GMRAING)!($D(GMRADC)) D
|
---|
162 | ..S K=0 F S K=$O(GMRAING(K)) Q:'+K S ^XTMP("GMRAOC",DFN,"API",K)=$$SETNODE($G(^XTMP("GMRAOC",DFN,"API",K)),"REMOTE SITE(S)")
|
---|
163 | ..S K="" F S K=$O(GMRADC(K)) Q:K="" S ^XTMP("GMRAOC",DFN,"APC",K)=$$SETNODE($G(^XTMP("GMRAOC",DFN,"APC",K)),"REMOTE SITE(S)")
|
---|
164 | I $D(^XTMP("GMRAOC",DFN,"API")) D
|
---|
165 | .N I,INGLST
|
---|
166 | .S I=0 F S I=$O(^XTMP("GMRAOC",DFN,"API",I)) Q:'I D
|
---|
167 | ..N PRIM
|
---|
168 | ..S PRIM=$$PRIMARY(I)
|
---|
169 | ..I PRIM S INGLST(PRIM)=^XTMP("GMRAOC",DFN,"API",I) K ^XTMP("GMRAOC",DFN,"API",I)
|
---|
170 | .S I=0 F S I=$O(INGLST(I)) Q:'I S ^XTMP("GMRAOC",DFN,"API",I)=INGLST(I)
|
---|
171 | Q
|
---|
172 | ;
|
---|
173 | FIND(REACT,ING,DC) ;If reactant didn't include drug classes and/or ingredients, try and find them locally. Section added in patch 26
|
---|
174 | N VUID,FILE,PSNDA,GMRAIEN,LIST,GMRAI,GMRALIST,GMRARAY,J,SUB,FLAG
|
---|
175 | S FLAG=0
|
---|
176 | S VUID=$P(REACT,U)
|
---|
177 | S FILE=$P(REACT,U,3)
|
---|
178 | S FILE=$P(FILE,"99VA",2)
|
---|
179 | D GETIREF^XTID(,,VUID,"GMRARAY")
|
---|
180 | S FILE="" F S FILE=$O(GMRARAY(FILE)) Q:FILE="" D
|
---|
181 | .S GMRAIEN=0 F S GMRAIEN=$O(GMRARAY(FILE,.01,GMRAIEN)) Q:'+GMRAIEN D
|
---|
182 | ..I FILE=50.6 D
|
---|
183 | ...K ^TMP("PSN",$J) S PSNDA=+GMRAIEN D ^PSNNGR
|
---|
184 | ...S GMRAI=0 F S GMRAI=$O(^TMP("PSN",$J,GMRAI)) Q:GMRAI<1 S ING(GMRAI)=""
|
---|
185 | ...K ^TMP("PSN",$J),GMRARAY
|
---|
186 | ...S PSNDA=+GMRAIEN,GMRALIST=$$CLIST^PSNAPIS(PSNDA,.GMRALIST) Q:'$G(GMRALIST)
|
---|
187 | ...S GMRALIST=0 F S GMRALIST=$O(GMRALIST(GMRALIST)) Q:'GMRALIST S DC($P(GMRALIST(GMRALIST),U,2))=""
|
---|
188 | ..I FILE=120.82 D
|
---|
189 | ...S SUB=0 F S SUB=$O(^GMRD(120.82,+GMRAIEN,"ING",SUB)) Q:'+SUB S ING(+$P($G(^GMRD(120.82,+GMRAIEN,"ING",SUB,0)),U))="" ;record ingredients
|
---|
190 | ...S SUB=0 F S SUB=$O(^GMRD(120.82,+GMRAIEN,"CLASS",SUB)) Q:'+SUB S DC($P($$CLASS2^PSNAPIS(+$P($G(^GMRD(120.82,+GMRAIEN,"CLASS",SUB,0)),U)),U))="" ;Get drug classes
|
---|
191 | ..I FILE=50.605 D
|
---|
192 | ...S DC($P($$CLASS2^PSNAPIS(+GMRAIEN),U))=""
|
---|
193 | ..I FILE=50.416 D
|
---|
194 | ...S ING(+GMRAIEN)=""
|
---|
195 | Q
|
---|
196 | PRIMARY(INGIEN) ;check if INGIEN is a primary ingredient
|
---|
197 | ;returns 0 if INGIEN is primary
|
---|
198 | ;returns the IEN of INGIEN's primary ingredient if INGIEN is not primary
|
---|
199 | N RETURN
|
---|
200 | K ^TMP($J,"GMRALIST")
|
---|
201 | D ZERO^PSN50P41(INGIEN,,,"GMRALIST")
|
---|
202 | S RETURN=+$G(^TMP($J,"GMRALIST",INGIEN,2))
|
---|
203 | Q RETURN
|
---|