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

BHLRLABR.m

Go to the documentation of this file.
BHLRLABR ; cmi/anchorage/maw - BHL ORU/R01 Ref Lab inbound Lab Message ;  [ 02/28/2005  3:40 PM ]
 ;;3.01;BHL IHS Interfaces with GIS;**13,14,15,16**;AUG 01, 2004
 ;
 ;RML INBOUND
 ;
 ;
 ;
MAIN ;EP -- this is the main routine driver
 S BHLNOST=1 D ^BHLSETI
 S BHLRL=+$G(^BLRSITE(DUZ(2),"RL"))
 Q:'$G(BHLRL)
 ;I '$P($G(^BLRRL(BHLRL,0)),U,10) D ORU^BLRHL7(BHLUIF),EOJ Q  2/25/2008 cmi/maw orig
 I '$P($G(^BLRSITE(DUZ(2),"RL")),U,18) D ORU^BLRHL7(BHLUIF),EOJ Q  ;NEW cmi/maw 2/25/2008
 D ^BHLFO
 D MSH
 D CHKPAT
 I $D(BHLERR("FATAL")) D  Q
 . D SNDBUL(BHLUIF,PAT,BHLNM,BHLDOB,BHLSEX)
 K BHLSAF
 D PRS
 D RFL
 D EOJ
 D JOB^BLRPARAM  ;jump start the link
 Q
 ;
MSH ;-- get data out of MSH
 S BHLDUZ2=DUZ(2)
 S BHLACT=BHLRAF
 I $G(BHLACT) S BHLDUZ2=$O(^BLRSITE("ACCT",BHLACT,0))  ;cmi/flag/maw 11/17/2003 now looking in BLR Master Control File
 I '$G(BHLDUZ2) S BHLDUZ2=DUZ(2)
 ;I BHLACT=4107080 S BHLDUZ2=4618
 Q
 ;
CHKPAT ;-- lookup the patient by chart
 N BHLR
 S BHLR="PID"
 S BHLDA=0,BHLDA=$O(@BHLTMP@(BHLDA)) ;should be one PID
 S PAT=+$G(@BHLTMP@(BHLDA,3))
 S BHLDOB=$$HDATE^INHUT($E($G(@BHLTMP@(BHLDA,7)),1,8))
 S BHLSEX=$G(@BHLTMP@(BHLDA,8))
 S BHLPAT=$$CHKPAT^BHLU(PAT,$G(BHLDUZ2))
 I '$G(BHLPAT) S BHLERCD="NOPAT" X BHLERR
 Q:$D(BHLERR("FATAL"))
 S BHLPAT=$$CHKDOB^BHLU(BHLPAT)
 I '$G(BHLPAT) S BHLERCD="NOPAT" X BHLERR
 Q:$D(BHLERR("FATAL"))
 S BHLLOE=$G(BHLDUZ2)
 S BHLLOC=$P($G(^BLRSITE(BHLDUZ2,"RL")),U,9)
 I $G(BHLLOC) S BHLLOCE=$P($G(^SC(BHLLOC,0)),U)
 Q
 ;
PRS ;-- parse the HL7 message array     
 D OBR
 Q
 ;
OBR ;-- parse the OBR segment
 N BHLR
 S BHLR="OBR"
 S BHLODA=0 F  S BHLODA=$O(@BHLTMP@(BHLODA)) Q:BHLODA=""  D
 . K BHLPAR,BHLTST,BHLPSEQ,BHLCLTE
 . S BHLACC=$G(@BHLTMP@(BHLODA,3))
 . I $G(BHLACC)[U S BHLACC=""  ;maw test 2/10/2005
 . S BHLTST=$P($G(@BHLTMP@(BHLODA,4)),CS)
 . S BHLCLTE=$P($G(@BHLTMP@(BHLODA,4)),CS,2)
 . S BHLOBSDT=$$HDATE^INHUT($G(@BHLTMP@(BHLODA,7)),"T")
 . S BHLSPDT=$$HDATE^INHUT($G(@BHLTMP@(BHLODA,14)),"T")
 . S BHLORDP=$P($G(@BHLTMP@(BHLODA,16)),CS)
 . S BHLRESDT=$$HDATE^INHUT($G(@BHLTMP@(BHLODA,22)),"T")
 . S BHLPAR=BHLODA
 . D MAP("ORDER")
 . I '$G(BHLCLT) D  Q
 .. S BHLERR("FATAL")=1
 .. D BUL
 . I $D(BHL("OBX",BHLODA,2)) D CPT,FILE K BHLCPTS S BHLPSEQ=BHLSEQ
 . I $G(BHLPSEQ),$D(BHL("NTE",BHLODA,1)) D NTEOBR
 . I $D(BHLERR("WARNING")) D BUL
 . K BHLERR("WARNING")
 . I '$D(BHL("OBX",BHLODA,1)) D CPT,FILE K BHLCPTS
 . I '$D(BHL("OBX",BHLODA,1)),$D(BHL("NTE",BHLODA,1)) S BHLPSEQ=BHLSEQ D NTEOBR
 . D OBX
 Q
 ;
NTEOBR ;-- nte obr segment
 Q
 ;
OBX ;-- parse the OBX segment
 N BHLR
 S BHLR="OBX"
 S BHLXDA=0 F  S BHLXDA=$O(@BHLSTMP@(BHLXDA)) Q:BHLXDA=""!($D(BHLERR("WARNING")))  D
 . K BHLSPAR,BHLTST,BHLCLTE
 . S BHLTST=$P($G(@BHLSTMP@(BHLXDA,3)),CS)
 . S BHLCLTE=$P($G(@BHLSTMP@(BHLXDA,3)),CS,2)
 . S BHLRSLT=$G(@BHLSTMP@(BHLXDA,5))
 . S BHLUNIT=$G(@BHLSTMP@(BHLXDA,6))
 . S BHLREFR=$G(@BHLSTMP@(BHLXDA,7))
 . S BHLREFL=BHLREFR
 . I $E(BHLREFR,1,1)?.N D
 .. S BHLREFL=$P($G(BHLREFR),"-")
 .. S BHLREFH=$P($G(BHLREFR),"-",2)
 . S BHLABN=$G(@BHLSTMP@(BHLXDA,8))
 . S BHLRESDT=$$HDATE^INHUT($G(@BHLSTMP@(BHLXDA,14)),"T")
 . S BHLSPAR=BHLXDA
 . D TESTMAP
 . I '$G(BHLPSEQ) D CPT
 . I '$G(BHLCLT) D BUL Q
 . D FILE
 . K BHLCPTS,BHLRSLT,BHLUNIT,BHLREFR,BHLREFL,BHLREFH
 . D NTE
 . K BHLCMT
 . I $D(BHLERR("WARNING")) D BUL
 . K BHLERR("WARNING")
 Q
 ;
NTE ;-- parse the NTE segment
 N BHLR
 S BHLR="NTE"
 S BHLNDA=0 F  S BHLNDA=$O(@BHLSSTMP@(BHLNDA)) Q:BHLNDA=""  D
 . S:'$D(BHLCMT(BHLNDA)) BHLCMT(BHLNDA)=0
 . S (BHLCMT(BHLNDA),X)=$G(@BHLSSTMP@(BHLNDA,3))
 . K DIC,DD,DO
 . S DIC="^BLRTXLOG("_BHLSEQ_",30,"
 . S DA(1)=BHLSEQ,DIC(0)="L",DIC("P")=$P(^DD(9009022,3001,0),"^",2)
 . D FILE^DICN
 Q
 ;
MAP(BHLTYPC) ;-- map the necessary incoming items to rpms
 I $G(BHLORDP)]"" D
 . S BHLORDPI=$O(^VA(200,"AUPIN",BHLORDP,0))
 I '$G(BHLORDPI),$G(BHLORDP)]"" D
 . S BHLORDPI=$O(^VA(200,"ANPI",BHLORDP,0))
 ;S BHLORDPE=$S(BHLORDP'="":$P($G(^DIC(6,BHLORDP,0)),U),1:"")
 I '$G(BHLORDPI) S BHLORDPI=$O(^VA(200,"B","TECHNICIAN,LAB",0))
 I $G(BHLORDPI) S BHLORDPE=$P($G(^VA(200,BHLORDPI,0)),U)
 S BHLPNM=$$VAL^XBDIQ1(2,BHLPAT,.01)
 S BHLLOE=$G(DUZ(2))
TESTMAP ;
 N BHLZDA
 K BHLCLTI,BHLCLT
 S BHLZDA=0 F  S BHLZDA=$O(^BLRRL("BTST",BHLTST,BHLRL,BHLZDA)) Q:'BHLZDA  D
 . I $G(BHLTYPC)]"",$P($G(^BLRRL(BHLRL,1,BHLZDA,0)),U,3)]"" S BHLCLTI=BHLZDA,BHLCLT=$P($G(^BLRRL(BHLRL,1,BHLCLTI,0)),U,2) Q
 . I $G(BHLTYPC)="",$P($G(^BLRRL(BHLRL,1,BHLZDA,0)),U,4)]"" S BHLCLTI=BHLZDA,BHLCLT=$P($G(^BLRRL(BHLRL,1,BHLCLTI,0)),U,2) Q
 ;S BHLCLTI=$O(^BLRRL("BTST",BHLTST,BHLRL,0))
 ;I BHLCLTI="" S BHLERCD="NOLCODE" X BHLERR Q
 ;S BHLCLT=$P($G(^BLRRL(BHLRL,1,BHLCLTI,0)),U,2)
 ;I BHLCLT="" S BHLERCD="NOLAB" X BHLERR
 Q
 ;
CPT ;-- let's build the cpt string
 Q:'$P($G(^BLRRL(BHLRL,0)),U,17)
 Q:$G(BHLPSEQ)
 Q:'$G(BHLCLT)
 S BHLCTST=$O(^BLRCPT("C",BHLCLT,0))
 Q:BHLCTST=""
 S BHLCCNT=0
 S BHLCPTS="|||||"
 S BHLCDA=0 F  S BHLCDA=$O(^BLRCPT(BHLCTST,11,BHLCDA)) Q:'BHLCDA  D
 . S BHLCPT=$P($G(^BLRCPT(BHLCTST,11,BHLDA,0)),U)
 . S BHLCCNT=BHLCCNT+1
 . S $P(BHLCPTS,"|",BHLCCNT)=$G(BHLCPT)
 Q
 ;
FILE ;-- file the data in BLRTXLOG
 ;FORMAT IS BLRVARS="FIELD NAME_VARIABLE~FIELD NAME_VARIABLE""
 K BLR,BLRF,BLRFDA  ;maw test
 Q:$G(BHLRSLT)="DNR"
 I '$G(BHLCLT) K BHLSEQ
 I $G(BHLCLTI)="" S BHLERCD="NOLCODE" X BHLERR D BUL
 I $G(BHLCLT)="" S BHLERCD="NOLAB" X BHLERR D BUL
 ;cmi/anch/maw added 1/17/2006
 I $G(BHLUIF) Q:$O(^BLRTXLOG("AHL7",BHLUIF_BHLCLT,0))  ;don't refile tests that are already there
 ;cmi/anch/maw end 1/17/2006
 S BHLQSIT=$P($G(^AUTTSITE(1,0)),U)
 Q:BHLQSIT=""
 S BLRPCC=$P($G(^BLRSITE(BHLQSIT,0)),U,3)
 S (BLRODTM,BLRSEQ,BLRTEST1)="",BLRLINK=1,BLRERR=0,BHLPHASE="R",BLRCMF="C"
 S BLRXPCC=1 ;after patch 10
 S BHLSEQ=$$GETIEN^BLRFLTL(BLRODTM,BLRSEQ,BLRTEST1)
 S BLRVARS="SEQUENCE NUMBER_BHLSEQ~STATUS FLAG_BHLPHASE~DUZ(2)_BHLLOE~"
 S BLRVARS=BLRVARS_"PATIENT NAME_$G(BHLPNM)~PATIENT POINTER VALUE_$G(BHLPAT)~ACCESSION NUMBER_BHLACC~"
 S BLRVARS=BLRVARS_"ORDERING PROVIDER NAME_$G(BHLORDPE)~ORDERING PROVIDER POINTER_$G(BHLORDPI)~"
 S BLRVARS=BLRVARS_"PANEL/TEST POINTER_BHLCLT~PANEL/TEST NAME_$G(BHLCLTE)~RESULT_$G(BHLRSLT)~UNITS_$G(BHLUNIT)~REFERENCE LOW_$G(BHLREFL)~REFERENCE HIGH_$G(BHLREFH)~"
 S BLRVARS=BLRVARS_"PARENT POINTER_$G(BHLPSEQ)~COLLECTION DATE/TIME_BHLOBSDT~ORDER DATE_$G(BHLOBSDT)~ENTRY DATE/TIME_$G(BHLSPDT)~ORDERING LOCATION POINTER_$G(BHLLOC)~ORDERING LOCATION NAME_$G(BHLLOCE)~"
 S BHLLM="CH",BLRVARS=BLRVARS_"LAB MODULE_BHLLM~"
 S BHLIO="E",BLRVARS=BLRVARS_"I/O CATEGORY_BHLIO~"
 S BHLSTAT="R",BLRVARS=BLRVARS_"STATUS FLAG_BHLSTAT~"
 S BHLBILL=1,BLRVARS=BLRVARS_"BILLABLE ITEM_BHLBILL~"
 S BHLSRC="R",BLRVARS=BLRVARS_"SOURCE OF DATA INPUT_BHLSRC~"
 S BHLSPC=999,BLRVARS=BLRVARS_"SITE/SPECIMEN POINTER_BHLSPC~"
 S BHLSPCE="UNKNOWN",BLRVARS=BLRVARS_"SITE/SPECIMEN NAME_BHLSPCE~"
 S BHLLFLE=2,BLRVARS=BLRVARS_"LRFILE_BHLLFLE~"
 S BLRVARS=BLRVARS_"RESULT N/A FLAG_$G(BHLABN)~"
 S BLRVARS=BLRVARS_"BILLING CPT STRING_$G(BHLCPTS)~"
 S BLRVARS=BLRVARS_"HL7 MESSAGE IEN_$G(BHLUIF)"
 I '$D(BLRF(0)) D INIT^BLRPARAM ;after patch 10
 ;I '$D(BLRF(0)) D ^BLRPARAM
 D SETVALS^BLRFLTL ;after patch 10
 ;D ^BLRFLTL("C",BLRVARS) ;before patch 10
 D ^BLRNFLTL ;after patch 10
 Q
 ;
BUL ;-- file a bulletin if no test match
 S XMB="BHL NO TEST MATCH"
 S XMB(1)=$G(BHLTST),XMB(2)=$G(BHLCLTE),XMB(3)=$G(BHLSEQ)
 S XMB(4)=$G(UIF)
 S XMB(5)=$$FMTE^XLFDT(BHLOBSDT),XMB(6)=$G(BHLACC)
 D ^XMB
 Q
 ;
SNDBUL(VAR,VAR1,VAR2,VAR3,VAR4)        ;-- fire a generic bulletin
 S XMB="BHL REFLAB NO PAT",XMB(1)=VAR,XMB(2)=VAR1,XMB(3)=VAR2
 S XMB(4)=VAR3,XMB(5)=VAR4
 N VAR5,BAR6,BHLR
 S BHLR="OBR"
 S VAR5=$$HDATE^INHUT($G(@BHLTMP@(1,7)),"T")  ;collection date
 I $G(VAR5) S VAR5=$$FMTE^XLFDT(VAR5)  ;external format
 S VAR6=$G(@BHLTMP@(1,3))  ;accession number
 S XMB(6)=$G(VAR5),XMB(7)=$G(VAR6)
 D ^XMB
 Q
 ; 
EOJ ;-- kill variables and quit
 D EN^XBVK("BLR")
 D EOJ^BHLSETI
 Q
 ;
RFL ;-- set the refile node in BLRSITE
 S BHLDA=0 F  S BHLDA=$O(BHLSEQ(BHLDA)) Q:'BHLDA  D
 . S BHLIEN=$G(BHLSEQ(BHLDA))
 . D ^BLREVTQ("M","REFILE","REFILE",,BHLIEN)
 Q
 ;
RORC ;-- remove orc segments from messge
 N BHLRDA,BHLCNT,BHLFLG
 S BHLCNT=0,BHLFLG=0
 S BHLRDA=0 F  S BHLRDA=$O(^INTHU(UIF,3,BHLRDA)) Q:'BHLRDA  D
 . S BHLCNT=BHLCNT+1
 . I $E($G(^INTHU(UIF,3,BHLRDA,0)),1,3)="ORC" D  Q
 .. K ^INTHU(UIF,3,BHLRDA,0)
 .. S BHLCNT=BHLCNT-1
 .. S BHLFLG=1
 . S ^BHLTMP($J,UIF,3,BHLCNT,0)=$G(^INTHU(UIF,3,BHLRDA,0))
 . K ^INTHU(UIF,3,BHLRDA,0)
 N BHLTDA
 S BHLTDA=0 F  S BHLTDA=$O(^BHLTMP($J,UIF,3,BHLTDA)) Q:'BHLTDA  D
 . S ^INTHU(UIF,3,BHLTDA,0)=$G(^BHLTMP($J,UIF,3,BHLTDA,0))
 Q
 ;