BHLRLABS ; cmi/anchorage/maw - BHL ORU/R01 Ref Lab inbound Lab Message ; 08 Nov 2005 11:41 AM
;;3.01;BHL IHS Interfaces with GIS;**13,14,16**;AUG 01, 2004
;
;SCC INBOUND
;
;this routine will file the inbound softcore lab message.
;
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 CHKPAT
I $D(BHLERR("FATAL")) D Q
. D SNDBUL(BHLUIF,PAT,BHLNM,BHLDOB,BHLSEX)
D PRS
D RFL
D EOJ
D JOB^BLRPARAM ;jump start the link
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)) ;cmi/maw 4/11/03 orig
S PAT=$G(@BHLTMP@(BHLDA,3))
S PAT=+$TR(PAT,"-")
S BHLNM=$G(@BHLTMP@(BHLDA,5))
S BHLDOB=$$HDATE^INHUT($E($G(@BHLTMP@(BHLDA,7)),1,8))
S BHLSEX=$G(@BHLTMP@(BHLDA,8))
S BHLPAT=$$CHKPAT^BHLU(PAT,$G(DUZ(2)))
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(DUZ(2))
;cmi/maw added 1/7/2003
S BHLLOC=$P($G(^BLRRL(BHLRL,0)),U,15)
I $G(BHLLOC) S BHLLOCE=$P($G(^SC(BHLLOC,0)),U)
Q
;
PRS ;-- parse the HL7 message array
D PV1
D OBR
Q
;
PV1 ;-- pat the PV1 segment
N BHLR
S BHLR="PV1"
N BHLPDA
S BHLPDA=0 F S BHLPDA=$O(@BHLTMP@(BHLPDA)) Q:BHLPDA="" D
. K BHLPCLN,BHLPFTS,BHLPCLNE
. N BHLDTA
. S BHLDTA=$P($G(@BHLTMP@(BHLPDA,3)),CS)
. I $G(BHLDTA) D
.. N BHLDTAI
.. S BHLDTAI=$O(^BMS4(90230.2,"B",BHLDTA,0))
.. Q:'$G(BHLDTAI)
.. S BHLPCLN=$P($G(^BMS4(90230.2,BHLDTAI,0)),U,2)
.. S BHLPCLNE=$$GET1^DIQ(90230.2,BHLDTAI,1)
.. S BHLPFTS=$$GET1^DIQ(90230.2,BHLDTAI,2)
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,BHLRSLT,BHLREFR,BHLREFL,BHLREFH
. K BHLABN,BHLUNIT,BHLRESDT,BHLCLT
. S BHLACC=$G(@BHLTMP@(BHLODA,2))
. I $G(BHLACC)="" S BHLACC=$G(@BHLTMP@(BHLODA,3))
. 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 BHLODT=$P(BHLOBSDT,".") ;order date
. S BHLSPDT=$$HDATE^INHUT($G(@BHLTMP@(BHLODA,14)),"T")
. S BHLORDP=$P($G(@BHLTMP@(BHLODA,16)),"^")
. S BHLRESDT=$$HDATE^INHUT($G(@BHLTMP@(BHLODA,22)),"T")
. S BHLPAR=BHLODA
. D MAP
. 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(INV("NTE3",BHLODA,1)) K BHLCMT D NTEOBR(BHLODA,0)
. I '$G(BHLPSEQ),$D(INV("NTE3",BHLODA,1)) D NTEOBR(BHLODA,1)
. ;I $D(BHLERR("WARNING")) D BUL
. K BHLERR("WARNING")
. D OBX
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,BHLRSLT,BHLUNIT,BHLREFR,BHLREFL,BHLREFH
. K BHLABN,BHLUNIT,BHLRESDT,BHLCLT
. S BHLTST=$P($G(@BHLSTMP@(BHLXDA,3)),CS)
. S BHLCLTE=$P($G(@BHLSTMP@(BHLXDA,3)),CS,2)
. S BHLRSLT=$G(@BHLSTMP@(BHLXDA,5))
. ;Q:$G(BHLRSLT)="DNR"
. 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
. I BHLTST="" D BUL Q ;cmi/anch/maw 4/10/2006
. 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
;
NTEOBR(ODA,BHLSNGL) ;-- parse the NTE in the OBR segment
K BHLCCNT
S BHLCCNT=1
N BHLR
S BHLR="NTE"
S BHLNDA=0 F S BHLNDA=$O(INV("NTE3",BHLODA,BHLNDA)) Q:BHLNDA="" D
. S:'$D(BHLCMT(BHLCCNT)) BHLCMT(BHLCCNT)=0
. S (BHLCMT(BHLCCNT),X)=$TR($G(INV("NTE3",BHLODA,BHLNDA)),"""","'")
. Q:$G(X)=""
. S BHLCCNT=BHLCCNT+1
. Q:$G(BHLSNGL)
. K DIC,DD,DO
. S DIC="^BLRTXLOG("_BHLPSEQ_",30,"
. S DA(1)=BHLPSEQ,DIC(0)="L",DIC("P")=$P(^DD(9009022,3001,0),"^",2)
. D FILE^DICN
Q
;
NTE ;-- parse the NTE segment
I '$G(BHLCCNT) S BHLCCNT=1
N BHLR
S BHLR="NTE"
S BHLNDA=0 F S BHLNDA=$O(@BHLSSTMP@(BHLNDA)) Q:BHLNDA="" D
. S:'$D(BHLCMT(BHLCCNT)) BHLCMT(BHLCCNT)=0
. S (BHLCMT(BHLCCNT),X)=$G(@BHLSSTMP@(BHLNDA,3))
. S BHLCCNT=BHLCCNT+1
D FILENTE
Q
;
FILENTE ;-- file the NTE segments
N BHLCDA
S BHLCDA=0 F S BHLCDA=$O(BHLCMT(BHLCDA)) Q:'BHLCDA D
. S X=$G(BHLCMT(BHLCDA))
. 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
K BHLCMT
Q
;
MAP ;-- map the necessary incoming items to rpms
I '$G(BHLORDP) S BHLORDP=$P($G(BHL("ORC",1,12)),U)
I $G(BHLORDP) S BHLORDP=$$LZERO^BHLPID(BHLORDP,5)
I $G(BHLORDP) S BHLORDPI=$O(^VA(200,"MS4P",BHLORDP,0))
;I $G(BHLORDP)]"" D
;. S BHLORDPI=$O(^VA(200,"AUPIN",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 ;
S BHLCLTI=$O(^BLRRL("BTST",BHLTST,BHLRL,0))
;I BHLCLTI="" S BHLERCD="NOLCODE" X BHLERR D BUL Q ;maw orig 10/10/03
I BHLCLTI="" Q ;maw mod 10/10/03
S BHLCLT=$P($G(^BLRRL(BHLRL,1,BHLCLTI,0)),U,2)
;I BHLCLT="" S BHLERCD="NOLAB" X BHLERR D BUL
Q
;
CPT ;-- let's build the cpt string
Q:'$P($G(^BLRRL(BHLRL,0)),U,17) ;don't pass if set to yes
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""
Q:$G(BHLRSLT)="DNR" ;don't file Do NOT REPORT results
;Q:'$G(BHLCLT)
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
K BLR,BLRF,BLRFDA ;maw test
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)
I BHLCLTI="" S BHLERCD="NOLCODE" X BHLERR D BUL
I BHLCLT="" S BHLERCD="NOLAB" X BHLERR D BUL
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="",BLRVARS=BLRVARS_"SITE/SPECIMEN POINTER_BHLSPC~"
S BHLSPCE="",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_"CLINIC STOP CODE POINTER_$G(BHLPCLN)~CLINIC STOP NAME_$G(BHLPCLNE)~"
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
;cmi/anch/maw added collection date and accession number
S XMB="BHL NO TEST MATCH"
S XMB(1)=$G(BHLTST),XMB(2)=$G(BHLCLTE),XMB(3)=$G(BHLSEQ),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)=$$FMTE^XLFDT(VAR3),XMB(5)=VAR4
;cmi/anch/maw 10/1/2004 let's try and grab the collection date and accession number here
N VAR5,VAR6,BHLR
S BHLR="OBR"
S VAR5=$$HDATE^INHUT($G(@BHLTMP@(1,7)),"T") ;collection date
I $G(VAR5) S VAR5=$$FMTE^XLFDT(VAR5) ;external date 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
;
BHLRLABS ; cmi/anchorage/maw - BHL ORU/R01 Ref Lab inbound Lab Message ; 08 Nov 2005 11:41 AM
+1 ;;3.01;BHL IHS Interfaces with GIS;**13,14,16**;AUG 01, 2004
+2 ;
+3 ;SCC INBOUND
+4 ;
+5 ;this routine will file the inbound softcore lab message.
+6 ;
MAIN ;EP -- this is the main routine driver
+1 SET BHLNOST=1
DO ^BHLSETI
+2 SET BHLRL=+$GET(^BLRSITE(DUZ(2),"RL"))
+3 IF '$GET(BHLRL)
QUIT
+4 ;I '$P($G(^BLRRL(BHLRL,0)),U,10) D ORU^BLRHL7(BHLUIF),EOJ Q 2/25/2008 cmi/maw orig
+5 ;NEW cmi/maw 2/25/2008
IF '$PIECE($GET(^BLRSITE(DUZ(2),"RL")),U,18)
DO ORU^BLRHL7(BHLUIF)
DO EOJ
QUIT
+6 DO ^BHLFO
+7 DO CHKPAT
+8 IF $DATA(BHLERR("FATAL"))
Begin DoDot:1
+9 DO SNDBUL(BHLUIF,PAT,BHLNM,BHLDOB,BHLSEX)
End DoDot:1
QUIT
+10 DO PRS
+11 DO RFL
+12 DO EOJ
+13 ;jump start the link
DO JOB^BLRPARAM
+14 QUIT
+15 ;
CHKPAT ;-- lookup the patient by chart
+1 NEW BHLR
+2 SET BHLR="PID"
+3 ;should be one PID
SET BHLDA=0
SET BHLDA=$ORDER(@BHLTMP@(BHLDA))
+4 ;S PAT=+$G(@BHLTMP@(BHLDA,3)) ;cmi/maw 4/11/03 orig
+5 SET PAT=$GET(@BHLTMP@(BHLDA,3))
+6 SET PAT=+$TRANSLATE(PAT,"-")
+7 SET BHLNM=$GET(@BHLTMP@(BHLDA,5))
+8 SET BHLDOB=$$HDATE^INHUT($EXTRACT($GET(@BHLTMP@(BHLDA,7)),1,8))
+9 SET BHLSEX=$GET(@BHLTMP@(BHLDA,8))
+10 SET BHLPAT=$$CHKPAT^BHLU(PAT,$GET(DUZ(2)))
+11 IF '$GET(BHLPAT)
SET BHLERCD="NOPAT"
XECUTE BHLERR
+12 IF $DATA(BHLERR("FATAL"))
QUIT
+13 SET BHLPAT=$$CHKDOB^BHLU(BHLPAT)
+14 IF '$GET(BHLPAT)
SET BHLERCD="NOPAT"
XECUTE BHLERR
+15 IF $DATA(BHLERR("FATAL"))
QUIT
+16 SET BHLLOE=$GET(DUZ(2))
+17 ;cmi/maw added 1/7/2003
+18 SET BHLLOC=$PIECE($GET(^BLRRL(BHLRL,0)),U,15)
+19 IF $GET(BHLLOC)
SET BHLLOCE=$PIECE($GET(^SC(BHLLOC,0)),U)
+20 QUIT
+21 ;
PRS ;-- parse the HL7 message array
+1 DO PV1
+2 DO OBR
+3 QUIT
+4 ;
PV1 ;-- pat the PV1 segment
+1 NEW BHLR
+2 SET BHLR="PV1"
+3 NEW BHLPDA
+4 SET BHLPDA=0
FOR
SET BHLPDA=$ORDER(@BHLTMP@(BHLPDA))
IF BHLPDA=""
QUIT
Begin DoDot:1
+5 KILL BHLPCLN,BHLPFTS,BHLPCLNE
+6 NEW BHLDTA
+7 SET BHLDTA=$PIECE($GET(@BHLTMP@(BHLPDA,3)),CS)
+8 IF $GET(BHLDTA)
Begin DoDot:2
+9 NEW BHLDTAI
+10 SET BHLDTAI=$ORDER(^BMS4(90230.2,"B",BHLDTA,0))
+11 IF '$GET(BHLDTAI)
QUIT
+12 SET BHLPCLN=$PIECE($GET(^BMS4(90230.2,BHLDTAI,0)),U,2)
+13 SET BHLPCLNE=$$GET1^DIQ(90230.2,BHLDTAI,1)
+14 SET BHLPFTS=$$GET1^DIQ(90230.2,BHLDTAI,2)
End DoDot:2
End DoDot:1
+15 QUIT
+16 ;
OBR ;-- parse the OBR segment
+1 NEW BHLR
+2 SET BHLR="OBR"
+3 SET BHLODA=0
FOR
SET BHLODA=$ORDER(@BHLTMP@(BHLODA))
IF BHLODA=""
QUIT
Begin DoDot:1
+4 KILL BHLPAR,BHLTST,BHLPSEQ,BHLCLTE,BHLRSLT,BHLREFR,BHLREFL,BHLREFH
+5 KILL BHLABN,BHLUNIT,BHLRESDT,BHLCLT
+6 SET BHLACC=$GET(@BHLTMP@(BHLODA,2))
+7 IF $GET(BHLACC)=""
SET BHLACC=$GET(@BHLTMP@(BHLODA,3))
+8 SET BHLTST=$PIECE($GET(@BHLTMP@(BHLODA,4)),CS)
+9 SET BHLCLTE=$PIECE($GET(@BHLTMP@(BHLODA,4)),CS,2)
+10 SET BHLOBSDT=$$HDATE^INHUT($GET(@BHLTMP@(BHLODA,7)),"T")
+11 ;order date
SET BHLODT=$PIECE(BHLOBSDT,".")
+12 SET BHLSPDT=$$HDATE^INHUT($GET(@BHLTMP@(BHLODA,14)),"T")
+13 SET BHLORDP=$PIECE($GET(@BHLTMP@(BHLODA,16)),"^")
+14 SET BHLRESDT=$$HDATE^INHUT($GET(@BHLTMP@(BHLODA,22)),"T")
+15 SET BHLPAR=BHLODA
+16 DO MAP
+17 IF '$GET(BHLCLT)
Begin DoDot:2
+18 SET BHLERR("FATAL")=1
+19 DO BUL
End DoDot:2
QUIT
+20 IF $DATA(BHL("OBX",BHLODA,2))
DO CPT
DO FILE
KILL BHLCPTS
SET BHLPSEQ=BHLSEQ
+21 IF $GET(BHLPSEQ)
IF $DATA(INV("NTE3",BHLODA,1))
KILL BHLCMT
DO NTEOBR(BHLODA,0)
+22 IF '$GET(BHLPSEQ)
IF $DATA(INV("NTE3",BHLODA,1))
DO NTEOBR(BHLODA,1)
+23 ;I $D(BHLERR("WARNING")) D BUL
+24 KILL BHLERR("WARNING")
+25 DO OBX
End DoDot:1
+26 QUIT
+27 ;
OBX ;-- parse the OBX segment
+1 NEW BHLR
+2 SET BHLR="OBX"
+3 SET BHLXDA=0
FOR
SET BHLXDA=$ORDER(@BHLSTMP@(BHLXDA))
IF BHLXDA=""!($DATA(BHLERR("WARNING")))
QUIT
Begin DoDot:1
+4 KILL BHLSPAR,BHLTST,BHLCLTE,BHLRSLT,BHLUNIT,BHLREFR,BHLREFL,BHLREFH
+5 KILL BHLABN,BHLUNIT,BHLRESDT,BHLCLT
+6 SET BHLTST=$PIECE($GET(@BHLSTMP@(BHLXDA,3)),CS)
+7 SET BHLCLTE=$PIECE($GET(@BHLSTMP@(BHLXDA,3)),CS,2)
+8 SET BHLRSLT=$GET(@BHLSTMP@(BHLXDA,5))
+9 ;Q:$G(BHLRSLT)="DNR"
+10 SET BHLUNIT=$GET(@BHLSTMP@(BHLXDA,6))
+11 SET BHLREFR=$GET(@BHLSTMP@(BHLXDA,7))
+12 SET BHLREFL=BHLREFR
+13 IF $EXTRACT(BHLREFR,1,1)?.N
Begin DoDot:2
+14 SET BHLREFL=$PIECE($GET(BHLREFR),"-")
+15 SET BHLREFH=$PIECE($GET(BHLREFR),"-",2)
End DoDot:2
+16 SET BHLABN=$GET(@BHLSTMP@(BHLXDA,8))
+17 SET BHLRESDT=$$HDATE^INHUT($GET(@BHLSTMP@(BHLXDA,14)),"T")
+18 SET BHLSPAR=BHLXDA
+19 ;cmi/anch/maw 4/10/2006
IF BHLTST=""
DO BUL
QUIT
+20 DO TESTMAP
+21 IF '$GET(BHLPSEQ)
DO CPT
+22 IF '$GET(BHLCLT)
DO BUL
QUIT
+23 DO FILE
+24 KILL BHLCPTS,BHLRSLT,BHLUNIT,BHLREFR,BHLREFL,BHLREFH
+25 DO NTE
+26 KILL BHLCMT
+27 IF $DATA(BHLERR("WARNING"))
DO BUL
+28 KILL BHLERR("WARNING")
End DoDot:1
+29 QUIT
+30 ;
NTEOBR(ODA,BHLSNGL) ;-- parse the NTE in the OBR segment
+1 KILL BHLCCNT
+2 SET BHLCCNT=1
+3 NEW BHLR
+4 SET BHLR="NTE"
+5 SET BHLNDA=0
FOR
SET BHLNDA=$ORDER(INV("NTE3",BHLODA,BHLNDA))
IF BHLNDA=""
QUIT
Begin DoDot:1
+6 IF '$DATA(BHLCMT(BHLCCNT))
SET BHLCMT(BHLCCNT)=0
+7 SET (BHLCMT(BHLCCNT),X)=$TRANSLATE($GET(INV("NTE3",BHLODA,BHLNDA)),"""","'")
+8 IF $GET(X)=""
QUIT
+9 SET BHLCCNT=BHLCCNT+1
+10 IF $GET(BHLSNGL)
QUIT
+11 KILL DIC,DD,DO
+12 SET DIC="^BLRTXLOG("_BHLPSEQ_",30,"
+13 SET DA(1)=BHLPSEQ
SET DIC(0)="L"
SET DIC("P")=$PIECE(^DD(9009022,3001,0),"^",2)
+14 DO FILE^DICN
End DoDot:1
+15 QUIT
+16 ;
NTE ;-- parse the NTE segment
+1 IF '$GET(BHLCCNT)
SET BHLCCNT=1
+2 NEW BHLR
+3 SET BHLR="NTE"
+4 SET BHLNDA=0
FOR
SET BHLNDA=$ORDER(@BHLSSTMP@(BHLNDA))
IF BHLNDA=""
QUIT
Begin DoDot:1
+5 IF '$DATA(BHLCMT(BHLCCNT))
SET BHLCMT(BHLCCNT)=0
+6 SET (BHLCMT(BHLCCNT),X)=$GET(@BHLSSTMP@(BHLNDA,3))
+7 SET BHLCCNT=BHLCCNT+1
End DoDot:1
+8 DO FILENTE
+9 QUIT
+10 ;
FILENTE ;-- file the NTE segments
+1 NEW BHLCDA
+2 SET BHLCDA=0
FOR
SET BHLCDA=$ORDER(BHLCMT(BHLCDA))
IF 'BHLCDA
QUIT
Begin DoDot:1
+3 SET X=$GET(BHLCMT(BHLCDA))
+4 KILL DIC,DD,DO
+5 SET DIC="^BLRTXLOG("_BHLSEQ_",30,"
+6 SET DA(1)=BHLSEQ
SET DIC(0)="L"
SET DIC("P")=$PIECE(^DD(9009022,3001,0),"^",2)
+7 DO FILE^DICN
End DoDot:1
+8 KILL BHLCMT
+9 QUIT
+10 ;
MAP ;-- map the necessary incoming items to rpms
+1 IF '$GET(BHLORDP)
SET BHLORDP=$PIECE($GET(BHL("ORC",1,12)),U)
+2 IF $GET(BHLORDP)
SET BHLORDP=$$LZERO^BHLPID(BHLORDP,5)
+3 IF $GET(BHLORDP)
SET BHLORDPI=$ORDER(^VA(200,"MS4P",BHLORDP,0))
+4 ;I $G(BHLORDP)]"" D
+5 ;. S BHLORDPI=$O(^VA(200,"AUPIN",BHLORDP,0))
+6 ;S BHLORDPE=$S(BHLORDP'="":$P($G(^DIC(6,BHLORDP,0)),U),1:"")
+7 IF '$GET(BHLORDPI)
SET BHLORDPI=$ORDER(^VA(200,"B","TECHNICIAN,LAB",0))
+8 IF $GET(BHLORDPI)
SET BHLORDPE=$PIECE($GET(^VA(200,BHLORDPI,0)),U)
+9 SET BHLPNM=$$VAL^XBDIQ1(2,BHLPAT,.01)
+10 SET BHLLOE=$GET(DUZ(2))
TESTMAP ;
+1 SET BHLCLTI=$ORDER(^BLRRL("BTST",BHLTST,BHLRL,0))
+2 ;I BHLCLTI="" S BHLERCD="NOLCODE" X BHLERR D BUL Q ;maw orig 10/10/03
+3 ;maw mod 10/10/03
IF BHLCLTI=""
QUIT
+4 SET BHLCLT=$PIECE($GET(^BLRRL(BHLRL,1,BHLCLTI,0)),U,2)
+5 ;I BHLCLT="" S BHLERCD="NOLAB" X BHLERR D BUL
+6 QUIT
+7 ;
CPT ;-- let's build the cpt string
+1 ;don't pass if set to yes
IF '$PIECE($GET(^BLRRL(BHLRL,0)),U,17)
QUIT
+2 IF $GET(BHLPSEQ)
QUIT
+3 IF '$GET(BHLCLT)
QUIT
+4 SET BHLCTST=$ORDER(^BLRCPT("C",BHLCLT,0))
+5 IF BHLCTST=""
QUIT
+6 SET BHLCCNT=0
+7 SET BHLCPTS="|||||"
+8 SET BHLCDA=0
FOR
SET BHLCDA=$ORDER(^BLRCPT(BHLCTST,11,BHLCDA))
IF 'BHLCDA
QUIT
Begin DoDot:1
+9 SET BHLCPT=$PIECE($GET(^BLRCPT(BHLCTST,11,BHLDA,0)),U)
+10 SET BHLCCNT=BHLCCNT+1
+11 SET $PIECE(BHLCPTS,"|",BHLCCNT)=$GET(BHLCPT)
End DoDot:1
+12 QUIT
+13 ;
FILE ;-- file the data in BLRTXLOG
+1 ;FORMAT IS BLRVARS="FIELD NAME_VARIABLE~FIELD NAME_VARIABLE""
+2 ;don't file Do NOT REPORT results
IF $GET(BHLRSLT)="DNR"
QUIT
+3 ;Q:'$G(BHLCLT)
+4 IF '$GET(BHLCLT)
KILL BHLSEQ
+5 IF $GET(BHLCLTI)=""
SET BHLERCD="NOLCODE"
XECUTE BHLERR
DO BUL
+6 IF $GET(BHLCLT)=""
SET BHLERCD="NOLAB"
XECUTE BHLERR
DO BUL
+7 ;cmi/anch/maw added 1/17/2006
+8 ;don't refile tests that are already there
IF $GET(BHLUIF)
IF $ORDER(^BLRTXLOG("AHL7",BHLUIF_BHLCLT,0))
QUIT
+9 ;cmi/anch/maw end 1/17/2006
+10 ;maw test
KILL BLR,BLRF,BLRFDA
+11 SET BHLQSIT=$PIECE($GET(^AUTTSITE(1,0)),U)
+12 IF BHLQSIT=""
QUIT
+13 SET BLRPCC=$PIECE($GET(^BLRSITE(BHLQSIT,0)),U,3)
+14 SET (BLRODTM,BLRSEQ,BLRTEST1)=""
SET BLRLINK=1
SET BLRERR=0
SET BHLPHASE="R"
SET BLRCMF="C"
+15 ;after patch 10
SET BLRXPCC=1
+16 SET BHLSEQ=$$GETIEN^BLRFLTL(BLRODTM,BLRSEQ,BLRTEST1)
+17 IF BHLCLTI=""
SET BHLERCD="NOLCODE"
XECUTE BHLERR
DO BUL
+18 IF BHLCLT=""
SET BHLERCD="NOLAB"
XECUTE BHLERR
DO BUL
+19 SET BLRVARS="SEQUENCE NUMBER_BHLSEQ~STATUS FLAG_BHLPHASE~DUZ(2)_BHLLOE~"
+20 SET BLRVARS=BLRVARS_"PATIENT NAME_$G(BHLPNM)~PATIENT POINTER VALUE_$G(BHLPAT)~ACCESSION NUMBER_BHLACC~"
+21 SET BLRVARS=BLRVARS_"ORDERING PROVIDER NAME_$G(BHLORDPE)~ORDERING PROVIDER POINTER_$G(BHLORDPI)~"
+22 SET 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)~"
+23 SET 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)~"
+24 SET BHLLM="CH"
SET BLRVARS=BLRVARS_"LAB MODULE_BHLLM~"
+25 SET BHLIO="E"
SET BLRVARS=BLRVARS_"I/O CATEGORY_BHLIO~"
+26 SET BHLSTAT="R"
SET BLRVARS=BLRVARS_"STATUS FLAG_BHLSTAT~"
+27 SET BHLBILL=1
SET BLRVARS=BLRVARS_"BILLABLE ITEM_BHLBILL~"
+28 SET BHLSRC="R"
SET BLRVARS=BLRVARS_"SOURCE OF DATA INPUT_BHLSRC~"
+29 SET BHLSPC=""
SET BLRVARS=BLRVARS_"SITE/SPECIMEN POINTER_BHLSPC~"
+30 SET BHLSPCE=""
SET BLRVARS=BLRVARS_"SITE/SPECIMEN NAME_BHLSPCE~"
+31 SET BHLLFLE=2
SET BLRVARS=BLRVARS_"LRFILE_BHLLFLE~"
+32 SET BLRVARS=BLRVARS_"RESULT N/A FLAG_$G(BHLABN)~"
+33 SET BLRVARS=BLRVARS_"BILLING CPT STRING_$G(BHLCPTS)~"
+34 SET BLRVARS=BLRVARS_"CLINIC STOP CODE POINTER_$G(BHLPCLN)~CLINIC STOP NAME_$G(BHLPCLNE)~"
+35 SET BLRVARS=BLRVARS_"HL7 MESSAGE IEN_$G(BHLUIF)"
+36 ;after patch 10
IF '$DATA(BLRF(0))
DO INIT^BLRPARAM
+37 ;I '$D(BLRF(0)) D ^BLRPARAM
+38 ;after patch 10
DO SETVALS^BLRFLTL
+39 ;D ^BLRFLTL("C",BLRVARS) ;before patch 10
+40 ;after patch 10
DO ^BLRNFLTL
+41 QUIT
+42 ;
BUL ;-- file a bulletin if no test match
+1 ;cmi/anch/maw added collection date and accession number
+2 SET XMB="BHL NO TEST MATCH"
+3 SET XMB(1)=$GET(BHLTST)
SET XMB(2)=$GET(BHLCLTE)
SET XMB(3)=$GET(BHLSEQ)
SET XMB(4)=$GET(UIF)
+4 SET XMB(5)=$$FMTE^XLFDT(BHLOBSDT)
SET XMB(6)=$GET(BHLACC)
+5 DO ^XMB
+6 QUIT
+7 ;
SNDBUL(VAR,VAR1,VAR2,VAR3,VAR4) ;-- fire a generic bulletin
+1 SET XMB="BHL REFLAB NO PAT"
SET XMB(1)=VAR
SET XMB(2)=VAR1
SET XMB(3)=VAR2
+2 SET XMB(4)=$$FMTE^XLFDT(VAR3)
SET XMB(5)=VAR4
+3 ;cmi/anch/maw 10/1/2004 let's try and grab the collection date and accession number here
+4 NEW VAR5,VAR6,BHLR
+5 SET BHLR="OBR"
+6 ;collection date
SET VAR5=$$HDATE^INHUT($GET(@BHLTMP@(1,7)),"T")
+7 ;external date format
IF $GET(VAR5)
SET VAR5=$$FMTE^XLFDT(VAR5)
+8 ;accession number
SET VAR6=$GET(@BHLTMP@(1,3))
+9 SET XMB(6)=$GET(VAR5)
SET XMB(7)=$GET(VAR6)
+10 DO ^XMB
+11 QUIT
+12 ;
EOJ ;-- kill variables and quit
+1 DO EN^XBVK("BLR")
+2 DO EOJ^BHLSETI
+3 QUIT
+4 ;
RFL ;-- set the refile node in BLRSITE
+1 SET BHLDA=0
FOR
SET BHLDA=$ORDER(BHLSEQ(BHLDA))
IF 'BHLDA
QUIT
Begin DoDot:1
+2 SET BHLIEN=$GET(BHLSEQ(BHLDA))
+3 DO ^BLREVTQ("M","REFILE","REFILE",,BHLIEN)
End DoDot:1
+4 QUIT
+5 ;