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

NHINVLRO.m

Go to the documentation of this file.
  1. NHINVLRO ;SLC/MKB -- Laboratory extract by order/panel
  1. ;;1.0;NHIN;**1**;Oct 25, 2010;Build 11
  1. ;
  1. ; External References DBIA#
  1. ; ------------------- -----
  1. ; ^DPT 10035
  1. ; ^LAB(60 67,91,10054
  1. ; ^LRO(69 2407
  1. ; ^LR 525
  1. ; DIQ 2056
  1. ; LR7OR1,^TMP("LRRR",$J) 2503
  1. ; XUAF4 2171
  1. ;
  1. ; ------------ Get results from VistA ------------
  1. ;
  1. EN(DFN,BEG,END,MAX,ID) ; -- find patient's lab results
  1. N NHSUB,NHIDT,NHI,NHT,NHITM,CMMT,LRDFN,LR0,X
  1. S DFN=+$G(DFN) Q:$G(DFN)<1
  1. S BEG=$G(BEG,1410101),END=$G(END,9999998),MAX=$G(MAX,999999)
  1. S LRDFN=$G(^DPT(DFN,"LR")),NHSUB="CH"
  1. K ^TMP("LRRR",$J,DFN)
  1. ;
  1. ; get result(s)
  1. I $G(ID) D RR^LR7OR1(DFN,ID)
  1. I '$G(ID) D ;no id, or accession format (no lab order)
  1. . S:$G(ID)'="" NHSUB=$P(ID,";"),(BEG,END)=9999999-$P(ID,";",2)
  1. . D RR^LR7OR1(DFN,,BEG,END,NHSUB,,,MAX)
  1. ;
  1. S NHSUB="" F S NHSUB=$O(^TMP("LRRR",$J,DFN,NHSUB)) Q:NHSUB="" D
  1. . S NHIDT=0 F S NHIDT=$O(^TMP("LRRR",$J,DFN,NHSUB,NHIDT)) Q:NHIDT<1 I $O(^(NHIDT,0)) D
  1. .. I "CH^MI"'[NHSUB Q
  1. .. D SORT ;group accession by lab orders > NHLRO(panel,NHI)=data node
  1. .. S NHT="" F S NHT=$O(NHLRO(NHT)) Q:NHT="" D
  1. ... K NHITM,CMMT S X=$G(NHLRO(NHT))
  1. ... I $G(ID),ID'=$P(X,U,3) Q ;single order only
  1. ... S NHITM("id")=$P(X,U,3),NHITM("order")=$P(X,U,1,2)
  1. ... S NHITM("type")=NHSUB,NHITM("status")="completed"
  1. ... S NHITM("collected")=9999999-NHIDT
  1. ... S LR0=$G(^LR(LRDFN,NHSUB,NHIDT,0))
  1. ... S NHITM("resulted")=$P(LR0,U,3),X=+$P(LR0,U,5) I X D ;specimen
  1. .... N IENS,NHY S IENS=X_","
  1. .... D GETS^DIQ(61,IENS,".01:2",,"NHY")
  1. .... S NHITM("specimen")=$G(NHY(61,IENS,2))_U_$G(NHY(61,IENS,.01)) ;SNOMED^name
  1. .... S NHITM("sample")=$$GET1^DIQ(61,X_",",4.1) ;name
  1. ... S NHITM("groupName")=$P(LR0,U,6),X=+$P(LR0,U,14)
  1. ... S:X NHITM("facility")=$$STA^XUAF4(X)_U_$P($$NS^XUAF4(X),U)
  1. ... I 'X S NHITM("facility")=$$FAC^NHINV ;local stn#^name
  1. ... S NHI=0 F S NHI=$O(NHLRO(NHT,NHI)) Q:NHI<1 D
  1. .... S X=$G(NHLRO(NHT,NHI))
  1. .... S:NHSUB="CH" NHITM("value",NHI)=$$CH(X)
  1. .... S:NHSUB="MI" NHITM("value",NHI)=$$MI(X)
  1. ... I $D(^TMP("LRRR",$J,DFN,NHSUB,NHIDT,"N")) M CMMT=^("N") S NHITM("comment")=$$STRING^NHINV(.CMMT)
  1. ... D XML(.NHITM)
  1. K ^TMP("LRRR",$J,DFN)
  1. Q
  1. ;
  1. SORT ; -- return NHLRO(PANEL) = CPRS order# ^ panel/test name ^ Lab Order string
  1. ; NHLRO(PANEL,NHI) = result node
  1. N X0,NUM,ORD,ODT,SN,T,T0,I,NHY,NHLRT K NHLRO
  1. S NHI=$O(^TMP("LRRR",$J,DFN,NHSUB,NHIDT,0)),X0=$G(^(NHI)) ;first
  1. S NUM=$P(X0,U,16),ORD=$P(X0,U,17),ODT=+$P(9999999-NHIDT,".")
  1. ; - build NHLRT list of result nodes for each test/panel
  1. I ORD S SN=0 F S SN=$O(^LRO(69,"C",ORD,ODT,SN)) Q:SN<1 D Q:$D(NHLRT)
  1. . I $G(ID),$P(ID,";",3)'=SN Q
  1. . S T=0 F S T=+$O(^LRO(69,ODT,1,SN,2,T)) Q:T<1 D
  1. .. I $G(ID),T'=$P(ID,";",4) Q
  1. .. S T0=$G(^LRO(69,ODT,1,SN,2,T,0))
  1. .. ; is test/panel part of same accession?
  1. .. Q:$P(T0,U,5)'=+$P(NUM," ",3)
  1. .. Q:$$GET1^DIQ(68,$P(T0,U,4)_",",.09)'=$P(NUM," ")
  1. .. ; expand panel into unit tests
  1. .. K NHY D EXPAND(+T0,.NHY)
  1. .. S I=0 F S I=$O(NHY(I)) Q:I<1 S NHLRT(I,+T0)="" ;NHLRT(test,panel)=""
  1. .. S NHLRO(+T0)=$P(T0,U,7)_U_$P($G(^LAB(60,+T0,0)),U)_U_ORD_";"_ODT_";"_SN_";"_T
  1. S:'$D(NHLRO) NHLRO(0)=$S(NHSUB="MI":"^MICROBIOLOGY^MI;",1:"^ACCESSION^CH;")_NHIDT ;no Lab Order
  1. ; - build NHLRO(panel#,NHI) = ^TMP node
  1. S NHI=0 F S NHI=$O(^TMP("LRRR",$J,DFN,"CH",NHIDT,NHI)) Q:NHI<1 S X0=$G(^(NHI)) D
  1. . I '$D(NHLRT(+X0)) S NHLRO(0,NHI)=X0 Q ;no Lab Order
  1. . S T=0 F S T=$O(NHLRT(+X0,T)) Q:T<1 S NHLRO(T,NHI)=X0
  1. Q
  1. ;
  1. EXPAND(TEST,ARAY) ;Expand a lab test panel [LR7OU1]
  1. ;TEST=Test ptr to file 60
  1. ;Expanded panel returned in ARAY(TEST)
  1. N INARAY
  1. D EX(TEST)
  1. M ARAY=INARAY
  1. Q
  1. EX(TST) ;
  1. N J,X,SUB
  1. Q:'$D(^LAB(60,TST,0)) S SUB=$P(^(0),"^",5)
  1. I $L(SUB) S:'$D(INARAY(+TST)) INARAY(+TST)="" Q
  1. S J=0 F S J=$O(^LAB(60,+TST,2,J)) Q:J<1 S X=^(J,0) D EX(+X)
  1. Q
  1. ;
  1. ACC(NUM,ODT,SN) ; -- Return 1 or 0, if Specimen entry matches accession
  1. N T,T0,Y S Y=0
  1. S T=+$O(^LRO(69,ODT,1,SN,2,0)),T0=$G(^(T,0))
  1. I $P(T0,U,5)=+$P(NUM," ",3),$$GET1^DIQ(68,$P(T0,U,4)_",",.09)=$P(NUM," ") S Y=1
  1. Q Y
  1. ;
  1. CH(X0) ; -- return a Chemistry result as:
  1. ; id^test^result^interpretation^units^low^high^loinc^vuid
  1. ; Expects X0=^TMP("LRRR",$J,DFN,"CH",NHIDT,NHI),LRDFN
  1. N X,Y,NODE,LOINC
  1. S NODE=$G(^LR(LRDFN,"CH",NHIDT,NHI))
  1. S X=$P($G(^LAB(60,+X0,0)),U)
  1. S Y="CH;"_NHIDT_";"_NHI_U_X_U_$P(X0,U,2,4)
  1. S X=$P(X0,U,5) I $L(X),X["-" S X=$TR(X,"- ","^"),$P(Y,U,6,7)=X
  1. S X=$P($P(NODE,U,3),"!",3) S:X LOINC=$$GET1^DIQ(95.3,X_",",.01)
  1. I '$G(LOINC) S X=+$P(X0,U,19) S:X LOINC=$$LOINC(+X0,X)
  1. S $P(Y,U,8,9)=$G(LOINC)_U_$$VUID^NHINV(+$G(LOINC),95.3)
  1. Q Y
  1. ;
  1. LOINC(TEST,SPEC) ; -- Look up LOINC code, if not mapped
  1. N Y,LAM,NHIN,IENS S Y=""
  1. S TEST=+$G(TEST),SPEC=+$G(SPEC)
  1. S LAM=$G(^LAB(60,TEST,64)),LAM=$S($P(LAM,U,2):$P(LAM,U,2),1:+LAM)
  1. D GETS^DIQ(64.01,SPEC_","_LAM_",","30*",,"NHIN")
  1. S IENS=$O(NHIN(64.02,"")) S:IENS Y=$G(NHIN(64.02,IENS,4))
  1. S:'Y Y=$$GET1^DIQ(60.01,SPEC_","_TEST_",",95.3)
  1. Q Y
  1. ;
  1. MI(X0) ; -- return a Microbiology result as:
  1. ; id^test^result^interpretation^units
  1. ; Expects X0=^TMP("LRRR",$J,DFN,"MI",NHIDT,NHI)
  1. N Y S Y=""
  1. S:$L($P(X0,U))>1 Y="MI;"_NHIDT_";"_NHI_U_$P(X0,U,1,4)
  1. Q Y
  1. ;
  1. ; ------------ Return data to middle tier ------------
  1. ;
  1. XML(LAB) ; -- Return result as XML in @NHIN@(#)
  1. N ATT,X,Y,I,J,P,NAMES,TAG
  1. D ADD("<panel>") S NHINTOTL=$G(NHINTOTL)+1
  1. S ATT="" F S ATT=$O(LAB(ATT)) Q:ATT="" D D:$L(Y) ADD(Y)
  1. . I $O(LAB(ATT,0)) D S Y="" Q
  1. .. D ADD("<"_ATT_"s>")
  1. .. I ATT="value" S NAMES="id^test^result^interpretation^units^low^high^loinc^vuid^Z"
  1. .. E S NAMES="code^name^Z"
  1. .. S I=0 F S I=$O(LAB(ATT,I)) Q:I<1 D
  1. ... S X=$G(LAB(ATT,I)),Y="<"_ATT_" "_$$LOOP_"/>" D ADD(Y)
  1. .. D ADD("</"_ATT_"s>")
  1. . S X=$G(LAB(ATT)),Y="" Q:'$L(X)
  1. . I ATT="comment" S Y="<"_ATT_" xml:space='preserve'>"_$$ESC^NHINV(X)_"</"_ATT_">" Q
  1. . I X'["^" S Y="<"_ATT_" value='"_$$ESC^NHINV(X)_"' />" Q
  1. . I $L(X)>1 S NAMES="code^name^Z",Y="<"_ATT_" "_$$LOOP_"/>"
  1. D ADD("</panel>")
  1. Q
  1. ;
  1. LOOP() ; -- build sub-items string from NAMES and X
  1. N STR,P,TAG S STR=""
  1. F P=1:1 S TAG=$P(NAMES,U,P) Q:TAG="Z" I $L($P(X,U,P)) S STR=STR_TAG_"='"_$$ESC^NHINV($P(X,U,P))_"' "
  1. Q STR
  1. ;
  1. ADD(X) ; -- Add a line @NHIN@(n)=X
  1. S NHINI=$G(NHINI)+1
  1. S @NHIN@(NHINI)=X
  1. Q