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

GMRAOR.m

Go to the documentation of this file.
  1. GMRAOR ;HIRMFO/WAA,RM-OERR UTILITIES ;31-Dec-2012 12:12;DU
  1. ;;4.0;Adverse Reaction Tracking;**2,13,26,37,41,42,1006**;Mar 29, 1996;Build 29
  1. ORCHK(DFN,TYP,PTR,LOC,REAC,COMM) ; Given a patient IEN (DFN), this function will
  1. ; return 1 (true) if the patient has an allergy to an agent defined
  1. ; by TYP and PTR, else it returns 0 (false). See table below.
  1. ; The Contrast Media Reaction check will return a null if the patient
  1. ; is not in the ART database. Contrast Media checks will also
  1. ; return whether the check is from local or remote data as the second
  1. ; piece of the flag if LOC is defined as a positive integer
  1. ;
  1. ; Contrast Media Reaction: TYP="CM", PTR (undefined)
  1. ; Drug Reaction: TYP="DR", PTR=IEN in ^PSNDF(.
  1. ; Drug Ingredients: TYP="IN", PTR=IEN in ^PS(50.416,
  1. ; Drug Class: TYP="CL", PTR=IEN in ^PS(50.605,
  1. ;Patch 1006 modified for reactions and comments
  1. ;Patch 1006 modified to fix multiple ingredients
  1. N GMRAFLG,GMRACM,DA ;37
  1. S GMRAFLG=0
  1. S REAC=$G(REAC),COMM=$G(COMM)
  1. I $G(DFN)<1!("^CM^DR^IN^CL^"'[("^"_$G(TYP)_"^"))!($G(TYP)'="CM"&($G(PTR)<1)) S GMRAFLG=""
  1. E D
  1. .D GETDATA(DFN) ;26 Retreive local/remote allergy data for order checking
  1. .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
  1. .I TYP="DR" S GMRAFLG=$$DRUG(DFN,PTR,REAC,COMM) ; check for Drug Reaction
  1. .I TYP="IN" S GMRAFLG=$$ING(DFN,PTR,REAC,COMM) ; Check for Drug Ingredients
  1. .I TYP="CL" S GMRAFLG=$$CLASS(DFN,PTR,REAC,COMM) ; Check for Drug Class
  1. .Q
  1. Q GMRAFLG
  1. RAD(DFN) ; Subroutine checks for Contrast Media Reaction, returns 1 or 0.
  1. N FLG,DC,LOCAL,REMOTE ;37 entire section added
  1. 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
  1. .S FLG=1
  1. .I $G(^TMP("GMRAOC",$J,"APC",DC))["LOCAL" S LOCAL=1
  1. .I $G(^TMP("GMRAOC",$J,"APC",DC))["REMOTE" S REMOTE=1
  1. S GMRACM=$S($G(LOCAL)&($G(REMOTE)):"LOCAL AND REMOTE SITE(S)",$G(LOCAL):"LOCAL",$G(REMOTE):"REMOTE SITE(S)",1:"")
  1. ;D EN1^GMRADPT S FLG=GMRAL
  1. ;I GMRAL S GMRAPA=0 F S GMRAPA=$O(GMRAL(GMRAPA)) Q:GMRAPA<1 D Q:FLG
  1. ;.S FLG=$$RALLG^GMRARAD(GMRAPA)
  1. ;.Q
  1. Q FLG
  1. DRUG(DFN,PTR,REAC,COMM) ; Subroutine checks for Drug Reaction, returns 1 or 0.
  1. N %,J,FLG,GMRAC,GMRADR,GMRAI,PSNVPN,PSNDA,X1 S FLG=0
  1. K GMRAING,GMRADRCL,GMRAREAC,GMRACOM
  1. S PSNDA=$P(PTR,"."),PSNVPN=$P(PTR,".",2)
  1. I $G(@($$NDFREF_PSNDA_",0)"))'="" D
  1. .; Check for rxn to ingredients.
  1. .; If use the new entry point if there.
  1. .I $T(DISPDRG^PSNNGR)]"",PSNVPN]"" D
  1. ..K ^TMP("PSNDD",$J) D DISPDRG^PSNNGR ; get ingredients
  1. ..S GMRAI=0,%=1 F S GMRAI=$O(^TMP("PSNDD",$J,GMRAI)) Q:GMRAI<1 I $D(^TMP("GMRAOC",$J,"API",GMRAI)) D
  1. ...;IHS/MSC/MGH Mod for active
  1. ...S X1="" S X1=$O(^GMR(120.8,"API",DFN,GMRAI,X1)) Q:X1="" D
  1. ....I $$ACTIVE(X1) D
  1. .....S FLG=1,GMRAING(%)=^TMP("PSNDD",$J,GMRAI)_$$FAC(^TMP("GMRAOC",$J,"API",GMRAI)),%=%+1 ;26
  1. .....I REAC=1 D GETREAC(X1,.GMRAREAC)
  1. .....I COMM=1 D GETCOM(X1,.GMRACOM)
  1. ..K ^TMP("PSNDD",$J)
  1. ..Q
  1. .E D ; get ingredients
  1. ..K ^TMP("PSN",$J) D ^PSNNGR
  1. ..S GMRAI=0,%=1 F S GMRAI=$O(^TMP("PSN",$J,GMRAI)) Q:GMRAI<1 I $D(^TMP("GMRAOC",$J,"API",GMRAI)) D
  1. ...;IHS/MSC/MGH mod for active
  1. ...S X1="" S X1=$O(^GMR(120.8,"API",DFN,GMRAI,X1)) Q:X1="" D
  1. ....I $$ACTIVE(X1) D
  1. .....S FLG=1,GMRAING(%)=^TMP("PSN",$J,GMRAI)_$$FAC(^TMP("GMRAOC",$J,"API",GMRAI)),%=%+1 ;26
  1. .....I REAC=1 D GETREAC(X1,.GMRAREAC)
  1. .....I COMM=1 D GETCOM(X1,.GMRACOM)
  1. ..K ^TMP("PSN",$J)
  1. ..Q
  1. .Q:FLG ; Rxn to ingredient, quit now.
  1. .; Check for rxn to VA Drug Class
  1. .S PSNDA=$P(PTR,"."),PSNVPN=$P(PTR,".",2)
  1. .N CLASS
  1. .I PSNVPN S CLASS=$$DCLCODE^PSNAPIS(PSNDA,PSNVPN) D DRCL(CLASS,REAC,COMM) Q
  1. .N CLASS,GMRALIST
  1. .S GMRALIST=$$CLIST^PSNAPIS(PSNDA,.GMRALIST) Q:'$G(GMRALIST)
  1. .S GMRALIST=0 F S GMRALIST=$O(GMRALIST(GMRALIST)) Q:'GMRALIST D DRCL($P(GMRALIST(GMRALIST),U,2),REAC,COMM)
  1. .Q
  1. Q FLG
  1. FAC(NODE) ;
  1. N FAC
  1. S FAC=$S($L(NODE):" ("_NODE_")",1:"")
  1. Q FAC
  1. DRCL(CODE,REAC,COMM) ;return any rxn's in GMRADRCL(
  1. N X1
  1. I '$D(^TMP("GMRAOC",$J,"APC",CODE)) Q
  1. ;IHS/MSC/MGH Check for active
  1. S X1="" S X1=$O(^GMR(120.8,"APC",DFN,CODE,X1)) Q:X1="" D
  1. .I $$ACTIVE(X1) D
  1. ..N J S J=$S('$D(GMRADRCL):1,1:$O(GMRADRCL(999),-1)+1)
  1. ..;S GMRADRCL(J)=$$CLASS2^PSNAPIS(CODE)
  1. ..N CLSFN
  1. ..;S CLSFN=$P(^PS(50.605,+$O(^PS(50.605,"B",CODE,0)),0),U,2)
  1. ..S CLSFN=$$CODE2CL^GMRAPENC(CODE)
  1. ..S GMRADRCL(J)=CODE_"^"_CLSFN_$$FAC(^TMP("GMRAOC",$J,"APC",CODE))
  1. ..I REAC=1 D GETREAC(X1)
  1. ..I COMM=1 D GETCOM(X1)
  1. ..S FLG=2
  1. Q
  1. ING(DFN,PTR,REAC,COMM) ; Subroutine checks for Drug Ingredients, returns:
  1. ; If found FLG= 1 with GMRAIEN Array Drug Ingredients
  1. ; Not found FLG= 0
  1. N GMRAX K GMRAIEN,GMRAREAC
  1. S FLG=0
  1. S GMRAX=0
  1. ;IHS/MSC/MGH added check for inactive entries
  1. F S GMRAX=$O(^GMR(120.8,"API",DFN,PTR,GMRAX)) Q:GMRAX<1 D
  1. .S X1="" S X1=$O(^GMR(120.8,"API",DFN,GMRAI,X1)) Q:X1="" D
  1. ..I $$ACTIVE(X1) D
  1. ...S FLG=1,GMRAIEN(GMRAX)=""
  1. ...I REAC=1 D GETREAC(GMRAX,.GMRAREAC)
  1. ...I COMM=1 D GETCOM(GMRAX,.GMRACOM)
  1. .;END MOD
  1. Q FLG
  1. CLASS(DFN,PTR,REAC,COMM) ; Subroutine checks for Drug Class, returns:
  1. ; If found FLG= 1 with GMRAIEN Array Drug Class
  1. ; Not found FLG= 0
  1. N GMRAC,GMRAX K GMRAIEN
  1. ;S GMRAX=0,FLG=0,GMRAC=$P($G(^PS(50.605,PTR,0)),U)
  1. S GMRAX=0,FLG=0,GMRAC=$$CLP2CODE^GMRAPENC(PTR)
  1. I GMRAC'="" F S GMRAX=$O(^GMR(120.8,"APC",DFN,GMRAC,GMRAX)) Q:GMRAX<1 D
  1. .;IHS/MSC/MGH Check for active
  1. .I $$ACTIVE(GMRAX) D
  1. ..S FLG=1,GMRAIEN(GMRAX)=""
  1. ..I REAC=1 D GETREAC(GMRAX,.GMRAREAC)
  1. ..I COMM=1 D GETCOM(GMRAX,.GMRACOM)
  1. Q FLG
  1. NDFREF() ;get version dependent NDF reference
  1. I $$VERSION^XPDUTL("PSN")<4 Q "^PSNDF("
  1. Q "^PSNDF(50.6," ; new reference for ver 4.0
  1. ;
  1. GETDATA(DFN) ;Obtain local and HDR related allergy data for use in order checking. Section added in patch 26
  1. ;Output from call will be stored in ^TMP as follows:
  1. ;^TMP("GMRAOC",$J,"API",J)="" where J is the ingredient IEN
  1. ;^TMP("GMRAOC",$J,"APC",K)="" where K is the drug class classification (e.g. MS105)
  1. ;
  1. F L +^XTMP("GMRAOC",DFN):1 Q:$T
  1. N GMRRECDT,GMRCACHE,GMRFRESH,GMRNEW,GMRXTMP
  1. S (GMRFRESH,GMRNEW,GMRXTMP)=0
  1. S GMRRECDT=$P($G(^XTMP("ORRDI","ART",DFN,0)),U)
  1. S GMRCACHE=$$GET^XPAR("SYS","OR RDI CACHE TIME")
  1. I $$FMDIFF^XLFDT($$NOW^XLFDT,GMRRECDT,2)<(60*GMRCACHE),$P(^XTMP("ORRDI","ART",DFN,0),U,3)>-1 S GMRFRESH=1
  1. S GMRXTMP=$D(^XTMP("GMRAOC",DFN))
  1. S GMRNEW=$S($D(^XTMP("GMRAOC",DFN,"ERROR")):2,$D(^XTMP("GMRAOC",DFN,"NEW")):1,1:0)
  1. I GMRFRESH&GMRXTMP&(GMRNEW=1) K ^XTMP("GMRAOC",DFN,"NEW") D LOCAL(DFN)
  1. I 'GMRFRESH!'GMRXTMP!(GMRNEW=2) K ^XTMP("GMRAOC",DFN) D REMOTE(DFN),LOCAL(DFN)
  1. K ^TMP("GMRAOC",$J)
  1. M ^TMP("GMRAOC",$J)=^XTMP("GMRAOC",DFN)
  1. S ^XTMP("GMRAOC",DFN,0)=$$FMADD^XLFDT($$NOW^XLFDT,2)_U_$$NOW^XLFDT ;42
  1. L -^XTMP("GMRAOC",DFN)
  1. Q
  1. ;
  1. LOCAL(DFN) ;
  1. N J,K,L,M,NAREAC,X1,ACOM
  1. S J=0 F S J=$O(^GMR(120.8,"API",DFN,J)) Q:'+J D
  1. .S X1="" S X1=$O(^GMR(120.8,"API",DFN,J,X1)) Q:X1="" D
  1. ..I $$ACTIVE(X1) D
  1. ...S ^XTMP("GMRAOC",DFN,"API",J)=$$SETNODE^GMRAOR1($G(^XTMP("GMRAOC",DFN,"API",J)),"LOCAL")
  1. ...S K=0 F S K=$O(^GMR(120.8,"API",DFN,J,K)) Q:'+K D
  1. ....K AREAC D GETREAC(K,.AREAC)
  1. ....K ACOM D GETCOM(K,.ACOM)
  1. ....S L=0 F S L=$O(AREAC(L)) Q:'+L D
  1. .....S ^XTMP("GMRAOC",DFN,"API",J,"REAC",L)=$G(AREAC(L))
  1. ....S L=0 F S L=$O(ACOM(L)) Q:'+L D
  1. .....S M=0 F S M=$O(ACOM(L,M)) Q:'+M D
  1. ......S ^XTMP("GMRAOC",DFN,"API",J,"COM",M)=$G(ACOM(L,M,0))
  1. S J="" F S J=$O(^GMR(120.8,"APC",DFN,J)) Q:J="" D
  1. .S X1="" S X1=$O(^GMR(120.8,"APC",DFN,J,X1)) Q:X1="" D
  1. ..I $$ACTIVE(X1) D
  1. ...S ^XTMP("GMRAOC",DFN,"APC",J)=$$SETNODE^GMRAOR1($G(^XTMP("GMRAOC",DFN,"APC",J)),"LOCAL")
  1. ...S K=0 F S K=$O(^GMR(120.8,"APC",DFN,J,K)) Q:'+K D
  1. ....K AREAC D GETREAC(K,.AREAC)
  1. ....K ACOM D GETCOM(K,.ACOM)
  1. ....S L=0 F S L=$O(AREAC(L)) Q:'+L D
  1. .....S ^XTMP("GMRAOC",DFN,"APC",J,"REAC",L)=$G(AREAC(L))
  1. ....S L=0 F S L=$O(ACOM(L)) Q:'+L D
  1. .....S M=0 F S M=$O(ACOM(L,M)) Q:'+M D
  1. ......S ^XTMP("GMRAOC",DFN,"APC",J,"COM",M)=$G(ACOM(L,M,0))
  1. Q
  1. ;
  1. REMOTE(DFN) ;
  1. N J,FLG,REACT,IN,VUID,FILE,GMRARAY,DC,DCLASS,GMRAING,GMRADC,K,INGLST,I,PRIM,IEN
  1. ;Check for HDR data
  1. Q:'$L($T(HAVEHDR^ORRDI1)) Q:'$$HAVEHDR^ORRDI1 ;Quit if call doesn't exist or if the HDR isn't available
  1. Q:'$$GET^ORRDI1(DFN,"ART") ;Quit if no HDR data for selected patient
  1. S J=0 F S J=$O(^XTMP("ORRDI","ART",DFN,J)) Q:'+J D
  1. .S FLG=0
  1. .S REACT=$G(^XTMP("ORRDI","ART",DFN,J,"REACTANT",0)) ;Reaction VUID
  1. .I $D(^XTMP("ORRDI","ART",DFN,J,"DRUG INGREDIENTS")) D ;Ingredient data exists
  1. ..S FLG=1 ;Have ingredient data so REACT is ok
  1. ..S IN=0 F S IN=$O(^XTMP("ORRDI","ART",DFN,J,"DRUG INGREDIENTS",IN)) Q:'+IN D
  1. ...S VUID=$P(^(IN),U),FILE=$P(^(IN),U,3) ;Naked from above line
  1. ...S FILE=$P(FILE,"99VA",2)
  1. ...D GETIREF^XTID(FILE,,VUID,"GMRARAY") ;Get IENs related to VUID
  1. ...S IEN=0 F S IEN=$O(GMRARAY(FILE,.01,IEN)) Q:'+IEN S ^XTMP("GMRAOC",DFN,"API",+IEN)=$$SETNODE^GMRAOR1($G(^XTMP("GMRAOC",DFN,"API",+IEN)),"REMOTE SITE(S)")
  1. ...K GMRARAY
  1. .I $D(^XTMP("ORRDI","ART",DFN,J,"DRUG CLASSES")) D ;Drug class data exists
  1. ..S FLG=1
  1. ..S DC=0 F S DC=$O(^XTMP("ORRDI","ART",DFN,J,"DRUG CLASSES",DC)) Q:'+DC D
  1. ...S DCLASS=$P(^(DC),U,2) ;Naked from above, gets drug class (e.g.MS105)
  1. ...S ^XTMP("GMRAOC",DFN,"APC",DCLASS)=$$SETNODE^GMRAOR1($G(^XTMP("GMRAOC",DFN,"APC",DCLASS)),"REMOTE SITE(S)")
  1. .D FIND(REACT,.GMRAING,.GMRADC) I $D(GMRAING)!($D(GMRADC)) D
  1. ..S K=0 F S K=$O(GMRAING(K)) Q:'+K S ^XTMP("GMRAOC",DFN,"API",K)=$$SETNODE^GMRAOR1($G(^XTMP("GMRAOC",DFN,"API",K)),"REMOTE SITE(S)")
  1. ..S K="" F S K=$O(GMRADC(K)) Q:K="" S ^XTMP("GMRAOC",DFN,"APC",K)=$$SETNODE^GMRAOR1($G(^XTMP("GMRAOC",DFN,"APC",K)),"REMOTE SITE(S)")
  1. I $D(^XTMP("GMRAOC",DFN,"API")) D
  1. .N I,INGLST
  1. .S I=0 F S I=$O(^XTMP("GMRAOC",DFN,"API",I)) Q:'I D
  1. ..N PRIM
  1. ..S PRIM=$$PRIMARY(I)
  1. ..I PRIM S INGLST(PRIM)=^XTMP("GMRAOC",DFN,"API",I) K ^XTMP("GMRAOC",DFN,"API",I)
  1. .S I=0 F S I=$O(INGLST(I)) Q:'I S ^XTMP("GMRAOC",DFN,"API",I)=INGLST(I)
  1. Q
  1. ;
  1. FIND(REACT,ING,DC) ;If reactant didn't include drug classes and/or ingredients, try and find them locally. Section added in patch 26
  1. N VUID,FILE,PSNDA,GMRAIEN,LIST,GMRAI,GMRALIST,GMRARAY,J,SUB,FLAG
  1. S FLAG=0
  1. S VUID=$P(REACT,U)
  1. S FILE=$P(REACT,U,3)
  1. S FILE=$P(FILE,"99VA",2)
  1. D GETIREF^XTID(,,VUID,"GMRARAY")
  1. S FILE="" F S FILE=$O(GMRARAY(FILE)) Q:FILE="" D
  1. .S GMRAIEN=0 F S GMRAIEN=$O(GMRARAY(FILE,.01,GMRAIEN)) Q:'+GMRAIEN D
  1. ..I FILE=50.6 D
  1. ...K ^TMP("PSN",$J) S PSNDA=+GMRAIEN D ^PSNNGR
  1. ...S GMRAI=0 F S GMRAI=$O(^TMP("PSN",$J,GMRAI)) Q:GMRAI<1 S ING(GMRAI)=""
  1. ...K ^TMP("PSN",$J),GMRARAY
  1. ...S PSNDA=+GMRAIEN,GMRALIST=$$CLIST^PSNAPIS(PSNDA,.GMRALIST) Q:'$G(GMRALIST)
  1. ...S GMRALIST=0 F S GMRALIST=$O(GMRALIST(GMRALIST)) Q:'GMRALIST S DC($P(GMRALIST(GMRALIST),U,2))=""
  1. ..I FILE=120.82 D
  1. ...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
  1. ...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
  1. ..I FILE=50.605 D
  1. ...S DC($P($$CLASS2^PSNAPIS(+GMRAIEN),U))=""
  1. ..I FILE=50.416 D
  1. ...S ING(+GMRAIEN)=""
  1. Q
  1. PRIMARY(INGIEN) ;check if INGIEN is a primary ingredient
  1. ;returns 0 if INGIEN is primary
  1. ;returns the IEN of INGIEN's primary ingredient if INGIEN is not primary
  1. N RETURN
  1. K ^TMP($J,"GMRALIST")
  1. D ZERO^PSN50P41(INGIEN,,,"GMRALIST")
  1. S RETURN=+$G(^TMP($J,"GMRALIST",INGIEN,2))
  1. Q RETURN
  1. ACTIVE(ALL) ;Check allergy to see if it is inactive
  1. N IN,Z,INACT,REACT
  1. S IN=1
  1. I '$D(^GMR(120.8,ALL,9999999.12)) Q IN
  1. S Z=$O(^GMR(120.8,ALL,9999999.12,$C(0)),-1) I +Z D
  1. .S INACT=$P($G(^GMR(120.8,ALL,9999999.12,Z,0)),U,1)
  1. .S REACT=$P($G(^GMR(120.8,ALL,9999999.12,Z,0)),U,4)
  1. .I +INACT&(REACT="") S IN=0
  1. Q IN
  1. GETREAC(ALG,GMRAREAC) ;IHS/MSC/MGH for reactions Patch 1006
  1. K GMRAREAC,GMRAII,GMRAOTH,CNT
  1. ;Signs/Symptoms
  1. S CNT=0
  1. S GMRAOTH=$O(^GMRD(120.83,"B","OTHER REACTION",0))
  1. S GMRAII=0 F %=1:1 S GMRAII=$O(^GMR(120.8,ALG,10,GMRAII)) Q:GMRAII<1 D
  1. .N GMRAZ,SSRC
  1. .S CNT=CNT+1
  1. .S GMRAZ=$G(^GMR(120.8,ALG,10,GMRAII,0)) Q:GMRAZ=""
  1. .S GMRAREAC(CNT)=$S(+GMRAZ'=GMRAOTH:$P($G(^GMRD(120.83,+GMRAZ,0)),U),1:$P(GMRAZ,U,2))_$S($P(GMRAZ,U,4)'="":" ("_$$FMTE^XLFDT($P(GMRAZ,U,4),2)_")",1:"")
  1. .S SSRC=$P($G(^GMR(120.8,ALG,10,GMRAII,9999999.11)),U)
  1. .I +SSRC S GMRAREAC(CNT)=GMRAREAC(CNT)_" Src: "_$P($G(^BEHOAR(90460.05,SSRC,0)),U,1) ;MU patch add source MSC/IHS/MGH
  1. Q
  1. GETCOM(ALG,GMRACOM) ;IHS/MSC/MGH for comments Patch 1006
  1. K GMRACOM,GMRAIC,CNT
  1. S CNT=0
  1. S GMRAIC=0 F %=1:1 S GMRAIC=$O(^GMR(120.8,ALG,26,GMRAIC)) Q:GMRAIC<1 D
  1. .N GMRAZ
  1. .S CNT=CNT+1
  1. .S GMRAZ=$G(^GMR(120.8,ALG,26,GMRAIC,0)) Q:GMRAZ=""
  1. .M GMRACOM(CNT)=^GMR(120.8,ALG,26,GMRAIC,2)
  1. Q