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

VPRDLRA.m

Go to the documentation of this file.
  1. VPRDLRA ;SLC/MKB -- Laboratory extract by accession ;8/2/11 15:29
  1. ;;1.0;VIRTUAL PATIENT RECORD;**1,2,5**;Sep 01, 2011;Build 21
  1. ;;Per VHA Directive 2004-038, this routine should not be modified.
  1. ;
  1. ; External References DBIA#
  1. ; ------------------- -----
  1. ; ^DPT 10035
  1. ; ^LAB(60 10054
  1. ; ^LAB(61 524
  1. ; ^LRO(68 1963
  1. ; ^LRO(69 2407
  1. ; ^LR 525
  1. ; ^SC 10040
  1. ; ^VA(200 10060
  1. ; DIC 2051
  1. ; DIQ 2056
  1. ; LR7OR1,^TMP("LRRR",$J) 2503
  1. ; LR7OSUM,^TMP("LRC",$J), 2766
  1. ; ^TMP("LRH",$J),^TMP("LRT",$J)
  1. ; LRPXAPIU 4246
  1. ; PXAPI 1894
  1. ; XUAF4 2171
  1. ;
  1. ; ------------ Get results from VistA ------------
  1. ;
  1. EN(DFN,BEG,END,MAX,ID) ; -- find patient's lab results
  1. N VPRTYPE,SUB,VPRSUB,VPRIDT,VPRP,VPRITM,LRDFN,LR0,ORD,X,I
  1. S DFN=+$G(DFN) Q:$G(DFN)<1
  1. S BEG=$G(BEG,1410101),END=$G(END,4141015),MAX=$G(MAX,9999)
  1. S VPRTYPE=$G(FILTER("type"),"CH;MI;CY;EM;SP;AU")
  1. S LRDFN=$G(^DPT(DFN,"LR")),SUB=$$SUB(VPRTYPE)
  1. K ^TMP("LRRR",$J,DFN)
  1. ;
  1. ; get result(s)
  1. I $L($G(ID)) D ;reset search parameters
  1. . S SUB=$P(ID,";"),VPRIDT=+$P(ID,";",2)
  1. . S:VPRIDT (BEG,END)=9999999-VPRIDT
  1. . S:"CH^MI"'[SUB SUB="AP"
  1. ;
  1. D RR^LR7OR1(DFN,,BEG,END,SUB,,,MAX)
  1. S VPRSUB="" F S VPRSUB=$O(^TMP("LRRR",$J,DFN,VPRSUB)) Q:VPRSUB="" D
  1. . Q:$G(VPRTYPE)'[VPRSUB ;requested types only
  1. . S VPRIDT=0 F S VPRIDT=$O(^TMP("LRRR",$J,DFN,VPRSUB,VPRIDT)) Q:VPRIDT<1 I $O(^(VPRIDT,0)) D
  1. .. K VPRITM,ORD,CMMT,^TMP("VPRTEXT",$J)
  1. .. I "CH^MI"'[VPRSUB D AP(.VPRITM),XML(.VPRITM) Q
  1. .. S VPRITM("type")=VPRSUB,VPRITM("id")=VPRSUB_";"_VPRIDT
  1. .. S VPRITM("collected")=9999999-VPRIDT,VPRITM("status")="completed"
  1. .. S LR0=$G(^LR(LRDFN,VPRSUB,VPRIDT,0))
  1. .. S VPRITM("resulted")=$P(LR0,U,3),X=+$P(LR0,U,5) I X D
  1. ... N IENS,VPRY S IENS=X_","
  1. ... D GETS^DIQ(61,IENS,".01;2;4.1",,"VPRY")
  1. ... S VPRITM("specimen")=$G(VPRY(61,IENS,2))_U_$G(VPRY(61,IENS,.01)) ;SNOMED^name
  1. ... S VPRITM("sample")=$G(VPRY(61,IENS,4.1)) ;name
  1. .. S X=$P(LR0,U,6),VPRITM("name")=$$AREA(X),VPRITM("groupName")=X
  1. .. S I=$S(VPRSUB="CH":10,1:7),X=+$P(LR0,U,I)
  1. .. S:X VPRITM("provider")=X_U_$P($G(^VA(200,X,0)),U)_U_$$PROVSPC^VPRD(X)
  1. .. S X=+$P(LR0,U,14) S:X VPRITM("facility")=$$STA^XUAF4(X)_U_$P($$NS^XUAF4(X),U)
  1. .. I 'X S VPRITM("facility")=$$FAC^VPRD ;local stn#^name
  1. .. I VPRSUB="MI" D ;report
  1. ... I '$P(LR0,U,3) S VPRITM("status")="incomplete" Q
  1. ... S VPRITM("document",1)=VPRSUB_";"_VPRIDT_"^LR MICROBIOLOGY REPORT^LABORATORY NOTE^4697105"
  1. ... S:$G(VPRTEXT) VPRITM("document",1,"content")=$$TEXT(DFN,VPRSUB,VPRIDT)
  1. .. S VPRP=0 F S VPRP=$O(^TMP("LRRR",$J,DFN,VPRSUB,VPRIDT,VPRP)) Q:VPRP<1 D
  1. ... S X=$S(VPRSUB="MI":$$MI,1:$$CH)
  1. ... S:$L(X) VPRITM("value",VPRP)=X
  1. ... S:$G(ORD) VPRITM("labOrderID")=ORD
  1. .. I $D(^TMP("LRRR",$J,DFN,VPRSUB,VPRIDT,"N")) M CMMT=^("N") S VPRITM("comment")=$$STRING^VPRD(.CMMT)
  1. .. D XML(.VPRITM)
  1. K ^TMP("LRRR",$J,DFN),^TMP("VPRTEXT",$J)
  1. Q
  1. ;
  1. CH() ; -- return a Chemistry result as:
  1. ; id^test^result^interpretation^units^low^high^localName^loinc^vuid^order^performingLab
  1. ; Expects ^TMP("LRRR",$J,DFN,"CH",VPRIDT,VPRP),LRDFN
  1. N X,Y,X0,VPRN,NODE,CMMT,LOINC
  1. S X0=$G(^TMP("LRRR",$J,DFN,"CH",VPRIDT,VPRP)),VPRN=$$LRDN^LRPXAPIU(+X0)
  1. S NODE=$G(^LR(LRDFN,"CH",VPRIDT,VPRN))
  1. S X=$P($G(^LAB(60,+X0,0)),U)
  1. S Y="CH;"_VPRIDT_";"_VPRN_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 $P(Y,U,8)=$P(X0,U,15) ;test short name
  1. S X=$P($P(NODE,U,3),"!",3) S:X LOINC=$$GET1^DIQ(95.3,X_",",.01)
  1. S:$G(LOINC) $P(Y,U,9,10)=LOINC_U_$$VUID^VPRD(+LOINC,95.3)
  1. S ORD=+$P(X0,U,17),X=$$ORDER(ORD,+X0) S:X $P(Y,U,11)=X
  1. S X=+$P(NODE,U,9) S:X $P(Y,U,12)=$$NAME^XUAF4(X) ;performing lab
  1. Q Y
  1. ;
  1. MI() ; -- return a Microbiology result as:
  1. ; id^test^result^interpretation^units
  1. ; Expects ^TMP("LRRR",$J,DFN,"MI",VPRIDT,VPRP)
  1. N Y,X0
  1. S X0=$G(^TMP("LRRR",$J,DFN,"MI",VPRIDT,VPRP)),Y=""
  1. S:$L($P(X0,U))>1 Y="MI;"_VPRIDT_";"_VPRP_U_$P(X0,U,1,4)
  1. S ORD=+$P(X0,U,17)
  1. Q Y
  1. ;
  1. AP(LAB) ; -- return a Pathology result in LAB("attribute")=value
  1. N LR0,X,I,NODE
  1. S LR0=$G(^LR(LRDFN,VPRSUB,VPRIDT,0)) I VPRSUB="AU" D
  1. . N AU S AU=$G(^LR(LRDFN,"AU")) ;set pieces needed into LR0
  1. . S LR0=+AU_U_$P(AU,U,10)_"^^^^"_$P(AU,U,6)_U_$P(AU,U,12)_"^^^^"_$P(AU,U,15)
  1. S LAB("type")=VPRSUB,LAB("id")=VPRSUB_";"_VPRIDT
  1. S LAB("collected")=9999999-VPRIDT,LAB("resulted")=$P(LR0,U,11)
  1. S X=$P(LR0,U,6),LAB("groupName")=X,LAB("name")=$$AREA(X)
  1. S X=+$P(LR0,U,2) S:X LAB("pathologist")=X_U_$P($G(^VA(200,X,0)),U)_U_$$PROVSPC^VPRD(X)
  1. S X=+$P(LR0,U,7) S:X LAB("provider")=X_U_$P($G(^VA(200,X,0)),U)_U_$$PROVSPC^VPRD(X)
  1. S LAB("status")=$S('$P(LR0,U,11):"incomplete",1:"completed")
  1. S X="",I=0 F S I=$O(^LR(LRDFN,VPRSUB,VPRIDT,.1,I)) Q:I<1 S X=X_$S($L(X):", ",1:"")_$P($G(^(I,0)),U)
  1. S:$L(X) LAB("specimen")=U_X
  1. S LAB("facility")=$$FAC^VPRD
  1. S NODE=$S(VPRSUB="AU":$NA(^LR(LRDFN,101)),1:$NA(^LR(LRDFN,VPRSUB,VPRIDT,.05)))
  1. S I=0 F S I=$O(@NODE@(I)) Q:I<1 S X=+$P($G(@NODE@(I,0)),U,2) I X D
  1. . N Y S Y=$$INFO^VPRDTIU(+X) Q:Y<1 ;draft or retracted
  1. . S LAB("document",I)=Y
  1. . S:$G(VPRTEXT) LAB("document",I,"content")=$$TEXT^VPRDTIU(+X)
  1. I '$O(LAB("document",0)),$P(LR0,U,11) D ;non-TIU reports
  1. . S LAB("document",1)=VPRSUB_";"_VPRIDT_"^LR "_$$NAME(VPRSUB)_" REPORT^LABORATORY NOTE^4697105"
  1. . S:$G(VPRTEXT) LAB("document",1,"content")=$$TEXT(DFN,VPRSUB,VPRIDT)
  1. Q
  1. ;
  1. SUB(X) ; -- return string of type(s) needed for LR api
  1. N Y S Y="",X=$G(X)
  1. S:X["CH" Y=Y_"CH"
  1. S:X["MI" Y=Y_"MI"
  1. I X["AP"!(X["CY")!(X["EM")!(X["SP")!(X["AU") S Y=Y_"AP"
  1. Q Y
  1. ;
  1. ORDER(LABORD,TEST) ; -- return #100 order number for Lab order# & Test
  1. N Y,D,S,T
  1. S D=$P(9999999-VPRIDT,"."),Y=""
  1. S S=0 F S S=$O(^LRO(69,"C",LABORD,D,S)) Q:S<1 D Q:Y
  1. . S T=0 F S T=$O(^LRO(69,D,1,S,2,T)) Q:T<1 I 'TEST!(+$G(^(T,0))=TEST) S Y=+$P(^(0),U,7)
  1. Q Y
  1. ;
  1. NAME(X) ; -- Return name of subscript X
  1. I X="AU" Q "AUTOPSY"
  1. I X="BB" Q "BLOOD BANK"
  1. I X="CH" Q "CHEM,HEM,TOX,RIA,SER,etc."
  1. I X="CY" Q "CYTOPATHOLOGY"
  1. I X="EM" Q "ELECTRON MICROSCOPY"
  1. I X="MI" Q "MICROBIOLOGY"
  1. I X="SP" Q "SURGICAL PATHOLOGY"
  1. Q "ANATOMIC PATHOLOGY"
  1. ;
  1. AREA(ACCNUM) ; -- Return name of accession area
  1. N X,Y,VPRA
  1. S X=$P($G(ACCNUM)," "),Y=""
  1. I $L(X) D FIND^DIC(68,,.01,"QX",X,,,,,"VPRA")
  1. S Y=$G(VPRA("DILIST",1,1))
  1. Q Y
  1. ;
  1. ; ------------ Get report(s) [via VPRDTIU] ------------
  1. ;
  1. RPTS(DFN,BEG,END,MAX) ; -- find patient's lab reports
  1. N VPRSUB,VPRIDT,VPRITM,VPRTIU,LR0,VPRXID,LRDFN,VPRN,DA
  1. S DFN=+$G(DFN) Q:$G(DFN)<1
  1. S BEG=$G(BEG,1410101),END=$G(END,4141015),MAX=$G(MAX,9999)
  1. S LRDFN=$G(^DPT(DFN,"LR"))
  1. K ^TMP("LRRR",$J,DFN) D RR^LR7OR1(DFN,,BEG,END,"AP",,,MAX)
  1. S VPRSUB="" F S VPRSUB=$O(^TMP("LRRR",$J,DFN,VPRSUB)) Q:VPRSUB="" D
  1. . S VPRIDT=0 F S VPRIDT=$O(^TMP("LRRR",$J,DFN,VPRSUB,VPRIDT)) Q:VPRIDT<1 I $O(^(VPRIDT,0)) D
  1. .. S VPRTIU=$S(VPRSUB="AU":$NA(^LR(LRDFN,101)),1:$NA(^LR(LRDFN,VPRSUB,VPRIDT,.05)))
  1. .. S LR0=$S(VPRSUB="AU":$G(^LR(LRDFN,"AU")),1:$G(^LR(LRDFN,VPRSUB,VPRIDT,0)))
  1. .. K VPRITM S VPRXID=VPRSUB_";"_VPRIDT
  1. .. ; generate report from Lab if not in TIU
  1. .. I '$O(@VPRTIU@(0)) D Q
  1. ... Q:'$P(LR0,U,$S(VPRSUB="AU":15,1:11)) ;Rpt Release Date
  1. ... D RPT1(DFN,VPRXID,.VPRITM),XML^VPRDTIU(.VPRITM):$D(VPRITM)
  1. .. S VPRN=0 F S VPRN=$O(@VPRTIU@(VPRN)) Q:VPRN<1 D
  1. ... S DA=+$P($G(@VPRTIU@(VPRN,0)),U,2) Q:DA<1 K VPRITM
  1. ... Q:$$INFO^VPRDTIU(DA)<1 ;draft or retracted
  1. ... D EN1^VPRDTIU(DA,.VPRITM),XML^VPRDTIU(.VPRITM):$D(VPRITM)
  1. K ^TMP("LRRR",$J,DFN),^TMP("VPRTEXT",$J)
  1. Q
  1. ;
  1. RPT1(DFN,ID,RPT) ; -- return report as a TIU document
  1. S DFN=+$G(DFN),ID=$G(ID) Q:DFN<1 Q:'$L(ID)
  1. N SUB,IDT,LRDFN,LR0,X,LOC
  1. K RPT,^TMP("VPRTEXT",$J)
  1. S SUB=$P(ID,";"),IDT=+$P(ID,";",2),LRDFN=$G(^DPT(DFN,"LR"))
  1. S LR0=$S(SUB="AU":$G(^LR(LRDFN,"AU")),1:$G(^LR(LRDFN,SUB,IDT,0)))
  1. S RPT("id")=ID,RPT("referenceDateTime")=9999999-IDT
  1. S RPT("localTitle")="LR "_$$NAME(SUB)_" REPORT"
  1. S RPT("documentClass")="LR LABORATORY REPORTS"
  1. S RPT("nationalTitle")="4697105^LABORATORY NOTE"
  1. S RPT("nationalTitleSubject")="4697104^LABORATORY"
  1. S RPT("nationalTitleType")="4696120^NOTE"
  1. S RPT("type")="LR",RPT("status")="UNRELEASED"
  1. S:$G(FILTER("loinc")) RPT("loinc")=$P(FILTER("loinc"),U)
  1. S X=$P(LR0,U,$S(SUB="AU":5,1:8)),LOC="" S:$L(X) LOC=+$O(^SC("B",X,0))
  1. S RPT("facility")=$$FAC^VPRD(LOC)
  1. I LOC D ;look-up visit
  1. . N CDT S CDT=9999999-IDT
  1. . S X=$$GETENC^PXAPI(DFN,CDT,LOC)
  1. . S:X RPT("encounter")=+X
  1. S X=+$P(LR0,U,$S(SUB="AU":10,1:2)) ;pathologist
  1. S:X RPT("clinician",1)=X_U_$P($G(^VA(200,X,0)),U)_"^A^^^"_$$PROVSPC^VPRD(X)
  1. ; check if Report Released
  1. S X=$S(SUB="AU":$P(LR0,U,15,16),1:$P(LR0,U,11)_U_$P(LR0,U,13)) I X D
  1. . N Y S Y=$P(X,U,2),RPT("status")="COMPLETED"
  1. . S RPT("clinician",2)=Y_U_$P($G(^VA(200,+Y,0)),U)_"^S^"_+X_U_$P($G(^VA(200,+Y,20)),U,2)_U_$$PROVSPC^VPRD(+Y)
  1. . S:$G(VPRTEXT) RPT("content")=$$TEXT(DFN,SUB,IDT)
  1. Q
  1. ;
  1. TEXT(DFN,SUB,IDT) ; -- Get report text, return temp array name
  1. N LRDFN,DATE,NAME,VPRS,VPRY,I,X,Y
  1. K ^TMP("LRC",$J),^TMP("LRH",$J),^TMP("LRT",$J)
  1. S DATE=9999999-+$G(IDT),NAME=$S(SUB="EM":"EM",1:$$NAME(SUB)),VPRS(NAME)=""
  1. D EN^LR7OSUM(.VPRY,DFN,DATE,DATE,,,.VPRS)
  1. S Y=$NA(^TMP("VPRTEXT",$J,SUB_";"_IDT)) K @Y
  1. S I=+$G(^TMP("LRH",$J,NAME)) ;LRH=header
  1. F S I=$O(^TMP("LRC",$J,I)) Q:I<1 S X=$G(^(I,0)) Q:X?1."=" S @Y@(I)=X
  1. K ^TMP("LRC",$J),^TMP("LRH",$J),^TMP("LRT",$J)
  1. Q Y
  1. ;
  1. ; ------------ Return data to middle tier ------------
  1. ;
  1. XML(LAB) ; -- Return result as XML in @VPR@(#)
  1. N ATT,X,Y,NAMES,I,J
  1. D ADD("<accession>") S VPRTOTL=$G(VPRTOTL)+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. .. S NAMES=$S(ATT="document":"id^localTitle^nationalTitle^vuid^Z",ATT="value":"id^test^result^interpretation^units^low^high^localName^loinc^vuid^order^performingLab^Z",1:"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))
  1. ... S Y="<"_ATT_" "_$$LOOP ;_"/>" D ADD(Y)
  1. ... S X=$G(LAB(ATT,I,"content")) I '$L(X) S Y=Y_"/>" D ADD(Y) Q
  1. ... S Y=Y_">" D ADD(Y)
  1. ... S Y="<content xml:space='preserve'>" D ADD(Y)
  1. ... S J=0 F S J=$O(@X@(J)) Q:J<1 S Y=$$ESC^VPRD(@X@(J)) D ADD(Y)
  1. ... D ADD("</content>"),ADD("</"_ATT_">")
  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^VPRD(X)_"</"_ATT_">" Q
  1. . I X'["^" S Y="<"_ATT_" value='"_$$ESC^VPRD(X)_"' />" Q
  1. . I $L(X)>1 D S Y=""
  1. .. S NAMES="code^name"_$S(ATT="provider"!(ATT="pathologist"):U_$$PROVTAGS^VPRD,1:"")_"^Z"
  1. .. S Y="<"_ATT_" "_$$LOOP_"/>" D ADD(Y)
  1. D ADD("</accession>")
  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^VPRD($P(X,U,P))_"' "
  1. Q STR
  1. ;
  1. ADD(X) ; -- Add a line @VPR@(n)=X
  1. S VPRI=$G(VPRI)+1
  1. S @VPR@(VPRI)=X
  1. Q