ORMBLDVB ;SLC/MKB - Build outgoing Blood Bank ORM msgs ;2/11/08  11:04
 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**212,309**;Dec 17, 1997;Build 26
 ;
 ; Use of $$GETICN^MPIF001 supported by DBIA #2701
 ;
HL7DATE(DATE) ; -- FM -> HL7 format
 Q $$FMTHL7^XLFDT(DATE)
 ;
NW(ORIFN) ; -- Send new VBECS orders [from ORCSEND2]
 ;    Uses ORNOW if defined
 N HLA,HL,OR0,OR3,ORR,ORDT,ORVAL,ORI,OROK,HLMTIEN
 S OR0=$G(^OR(100,ORIFN,0)),OR3=$G(^(3))
 D INIT^HLFNC2("OR OMG SERVER",.HL),GETVALS(ORIFN)
 S ORDT=$S($G(ORNOW):ORNOW,1:+$E($$NOW^XLFDT,1,12))
 S ORR=$G(ORVAL("REASON")),ORDT=$$HL7DATE(ORDT)
 ;S ORMSH="MSH|^~\&|ORDER ENTRY|"_$G(DUZ(2))_"|VBECS|"_$G(DUZ(2))_"|"_ORDT_"||OMG^O19||P|2.4||||AL" ;for testing
 S HLA("HLS",1)=$$PID(+$P(OR0,U,2)),HLA("HLS",2)=$$PV1
 S HLA("HLS",3)=$$ORC("NW","",ORR),HLA("HLS",4)=$$OBR(""),ORI=4
 S:$L($G(ORVAL("COMMENT"))) HLA("HLS",5)=$$NTE,ORI=5
 S ORI=ORI+1,HLA("HLS",ORI)=$$DG1(+$P(OR0,U,2))
 ;W ! ZW HLA D STATUS^ORCSAVE2(ORIFN,5) ;for testing 
 D DIRECT^HLMA("OR OMG SERVER","LM",1,.OROK)
 I $P(OROK,U,2) D SNDERR($P(OROK,U,3)),GENERATE^HLMA("OR OMG SERVER","LM",1,.OROK) Q  ;queue
 ; S ^OR(100,ORIFN,8,1,1)=$P(OROK,U,3),$P(^(0),U,15)=13 Q
 I HLMTIEN D ACK^ORMVBEC(+ORIFN_";1") ;successful, process ACK message
 Q
 ;
GETVALS(IFN) ; -- Return ORVAL(ID)=value for child order IFN
 N ID,ITM S ID="" K ORVAL
 F  S ID=$O(^OR(100,IFN,4.5,"ID",ID)) Q:ID=""  S ITM=$O(^(ID,0)),ORVAL(ID)=$G(^OR(100,IFN,4.5,ITM,1))
 Q
 ;
RESULTS(ORDER) ; -- Send PR messages with Lab results [from EN]
 ;    where ORDER = parent#
 N ORP,ORI,ORTST,ORTMP,ORTDT,ORX,OROK,HLA
 S ORDER=+$G(ORDER),OR0=$G(^OR(100,ORDER,0)),ORI=0
 F  S ORI=$O(^OR(100,ORDER,4.5,"ID","RESULTS",ORI)) Q:ORI<1  D
 . S ORX=$G(^OR(100,ORDER,4.5,ORI,1)),ORTDT=$P(ORX,U,7)
 . Q:'ORX  ;no data or error
 . S ORTST=+ORX_U_$P($G(^LAB(60,+ORX,0)),U) K HLA,OROK
 . S HLA("HLS",1)=$$PID(+$P(OR0,U,2)),HLA("HLS",2)=$$PV1
 . S HLA("HLS",3)="ORC|PR|||"_ORDER_"^OR"
 . S HLA("HLS",4)="OBR||"_$P(ORX,U,17)_"^LRCH||"_ORTST_"^99LRT"
 . S HLA("HLS",5)="OBX|1||"_ORTST_"^99LRT||"_$P(ORX,U,2)_"|"_$P(ORX,U,4)_"|"_$P(ORX,U,5)_"|"_$P(ORX,U,3)_"|||"_$P(ORX,U,6)_"|||"_$$HL7DATE(ORTDT)
 . ;W ! ZW HLA ;for testing
 . D DIRECT^HLMA("OR OMG SERVER","LM",1,.OROK) ;GENERATE
 . I $P(OROK,U,2) D SNDERR($P(OROK,U,3)),GENERATE^HLMA("OR OMG SERVER","LM",1,.OROK) Q  ;queue
 . 
 Q
 ;
CA(ORDER,REASON) ; -- Cancel VBEC orders (ORDER=child)
 ;    [from DC^ORCSEND/MSG^ORMBLD - Uses ORNOW if defined]
 N ORIFN,ORDA,ORDT,OR0,OR3,PKGIFN,HL,HLA,ORVAL,OROK,HLMTIEN
 S ORDT=$S($G(ORNOW):ORNOW,1:+$E($$NOW^XLFDT,1,12))
 S ORIFN=+$G(ORDER),ORDA=+$P($G(ORDER),";",2),ORDT=$$HL7DATE(ORDT)
 S OR0=$G(^OR(100,ORIFN,0)),OR3=$G(^(3)),PKGIFN=$G(^(4))_"^VBEC"
 S REASON=$S($G(REASON):$P($G(^ORD(100.03,+REASON,0)),U),1:"")
 D INIT^HLFNC2("OR OMG SERVER",.HL),GETVALS(ORIFN)
 ;S ORMSH="MSH|^~\&|ORDER ENTRY|"_$G(DUZ(2))_"|VBECS|"_$G(DUZ(2))_"|"_ORDT_"||OMG^O19||P|2.4||||AL" ;for now
 S HLA("HLS",1)=$$PID(+$P(OR0,U,2)),HLA("HLS",2)=$$PV1
 S HLA("HLS",3)=$$ORC("CA",PKGIFN,REASON),HLA("HLS",4)=$$OBR(PKGIFN)
 D DIRECT^HLMA("OR OMG SERVER","LM",1,.OROK) ;GENERATE^HLMA
 I $P(OROK,U,2) D  Q
 . S:ORDA ^OR(100,ORIFN,8,ORDA,1)=$P(OROK,U,3),$P(^(0),U,15)=13
 . D SNDERR($P(OROK,U,3)),GENERATE^HLMA("OR OMG SERVER","LM",1,.OROK) Q
 I HLMTIEN D ACK^ORMVBEC(ORDER) ;successful, process ACK message
 Q
 ;
SNDERR(MSG) ; -- Send Error message to VBECS Mail Group
 ; Input - MSG = Error message string
 N OREMSG,XMSUB,XMTEXT,XMDUZ,XMY,XMZ
 S OREMSG(1,0)="An Error occurred trying to send an HL7 message to VBECS."
 S OREMSG(2,0)=" "
 S OREMSG(3,0)="Error Message Text:  "_$S($L(MSG)>60:$E(MSG,1,60),1:MSG)
 S XMY("G."_$P($$GETAPP^HLCS2("VBECS"),"^"))=""
 S XMTEXT="OREMSG(",XMSUB="OERR-VBECS HL7 Failure",XMDUZ="OERR-VBECS Logical Link" D XMZ^XMA2
 S DIE=3.9,DA=XMZ,DR="1.7////P" D ^DIE
 D EN1^XMD
 Q
 ;
PID(DFN) ; -- PID segment
 N ORPT0,ORICN,NAME,DOB,Y S DFN=+$G(DFN)
 S ORPT0=$G(^DPT(DFN,0))
 S ORICN=$$GETICN^MPIF001(DFN) I +$G(ORICN)<1 S ORICN=""
 S NAME=$$HLNAME^HLFNC($P(ORPT0,U),"^~\&"),DOB=$$HL7DATE($P(ORPT0,U,3))
 S Y="PID|||"_ORICN_"^^^^NI~"_$P(ORPT0,U,9)_"^^^^SS~"_DFN_"^^^^PI||"_NAME_"||"_DOB_"|"_$P(ORPT0,U,2)
 Q Y
 ;
PV1() ; -- PV1 segment (expects OR0)
 N Y,DFN,LOC,TYPE,SPEC,RB,ATTD
 S DFN=+$P(OR0,U,2),LOC=$P(OR0,U,10),TYPE=$P(OR0,U,12),SPEC=$P(OR0,U,13)
 S LOC=$S(LOC:$P($G(^SC(+LOC,0)),U),1:""),RB=""
 S:TYPE="I" RB=$P($G(^DPT(DFN,.101)),U)
 S SPEC=$S(SPEC:"VA"_$$GET1^DIQ(45.7,SPEC_",",1,"I"),1:"") ;DBIA 1154
 S ATTD=+$G(^DPT(DFN,.1041)) S:'ATTD ATTD="" I ATTD D      ;DBIA 10035
 . N NM S NM=$P($G(^VA(200,ATTD,0)),U)
 . S ATTD=ATTD_U_$$HLNAME^HLFNC(NM,"^~\&")
 S Y="PV1||"_TYPE_"|"_LOC_$S($L(RB):U_RB,1:"")_"||||"_ATTD_"|||"_SPEC
 Q Y
 ;
ORC(CODE,FILLER,REASON) ; -- ORC segment (expects OR0, OR3, ORDT)
 N Y,USR,PROV,NM,ORI,DAD,YN,X13,PHONE
 S USR=+$P(OR0,U,6),PROV=+$P(OR0,U,4),X13=$G(^VA(200,PROV,.13))
 S PHONE=$S($L($P(X13,U,7)):$P(X13,U,7),1:$P(X13,U,8))
 F ORI="USR","PROV" S NM=$P($G(^VA(200,@ORI,0)),U),@ORI=@ORI_U_$$HLNAME^HLFNC(NM,"^~\&")
 S DAD=+$P(OR3,U,9) ;,DIV=$$DIV(+$P(OR0,U,10))
 S Y="ORC|"_CODE_"|"_ORIFN_"^OR|"_$G(FILLER)_"|"_DAD_"^OR|||||"_ORDT_"|"_USR_"||"_PROV_"||"_PHONE_"||^"_$G(REASON)_"|"_$$DIV
 S YN=$G(ORVAL("YN")),YN=$S(YN="":"",YN:"1^YES",YN=0:"0^NO",1:"U^UNKNOWN")
 S Y=Y_"|||"_YN
 Q Y
 ;
OBR(FILLER) ; -- OBR segment
 N Y,OI,MOD,TYPE,X,SPCACT,SPCUID
 S OI=$$USID(ORIFN),MOD=$G(ORVAL("MODIFIER"))
 I $L(MOD) S MOD=$S(MOD="W":"WASHED",MOD="I":"IRRADIATED",MOD="L":"LEUKO-POOR",MOD="V":"VOLUME-REDUCED",MOD="D":"DIVIDED",MOD="E":"LEUKO-POOR/IRRADIATED",1:MOD)
 S TYPE=$G(ORVAL("COLLECT")),TYPE=$$TYPE(TYPE)
 S X=$G(ORVAL("SPECSTS")),SPCACT=$S('X:"O",$L($P(X,U,3)):"A",1:"L")
 S SPCUID=$S(SPCACT="A":$P(X,U,3),1:"")
 S Y="OBR|1|"_ORIFN_"^OR|"_$G(FILLER)_"|"_OI_"^^"_MOD_"|||||||"_SPCACT_"||"_$G(ORLAB)_"||"_SPCUID_"^^"_TYPE_"||||||||||||"_$$QT
 Q Y
 ;
USID(IFN) ; -- Return USID for order IFN
 N OI,OI0,OID,OIX,Y S Y=""
 S OI=+$O(^OR(100,+$G(IFN),.1,"B",0)) I OI D
 . S OI0=$G(^ORD(101.43,OI,0)),OID=$P(OI0,U,2)
 . S OIX=$P(OI0,U,8) I OIX["&" S OIX=$P(OIX,"&")_"\T\"_$P(OIX,"&",2)
 . S Y=+OID_U_OIX_U_$P(OID,";",2)
 Q Y
 ;
NTE() ; -- NTE segment
 N Y S Y="NTE|1||"_$G(ORVAL("COMMENT"))
 Q Y
 ;
DG1(DFN) ; -- DG1 segment
 N VAIP,VAERR,Y
 S DFN=+$G(DFN) D IN5^VADPT
 S Y="DG1|1||^^^^"_$G(VAIP(9))_"^|||A"
 Q Y
 ;
QT() ; -- Build and return Quantity/Timing field
 N X,Y,%DT,X1,X4,X5,X6,X8,ORI
 S X=$G(ORVAL("QTY")),X1=$S(X:+X_$S(X["ML":"&ML",1:""),1:"")
 S (X4,X5)="" F ORI="START^4","DATETIME^5" D
 . S X=$G(ORVAL($P(ORI,U))),%DT="TX" D ^%DT Q:Y<1
 . S X=$$HL7DATE(Y),@("X"_$P(ORI,U,2))=X
 S X=$G(ORVAL("URGENCY")),X6=$P($G(^ORD(101.42,+X,0)),U,2)
 ;S X=$G(ORVAL("XFUSION")),X7=$S(X="H":"HOLD",X="I":"IMMEDIATE",1:"")
 S X8=$G(ORVAL("MISC"))
 S Y=X1_U_U_U_X4_U_X5_U_X6_U_U_X8
 Q Y
 ;
DIV() ; -- Return Institution file #4 ptr for LOC
 N X,Y S X=+$G(DUZ(2))
 S Y=$P($G(^DIC(4,X,99)),U)_U_$P($G(^DIC(4,X,0)),U)
 Q Y
 ;
ZDIV(LOC) ; -- Return Institution file #4 ptr for LOC
 N X0,Y S X0=$G(^SC(+LOC,0))
 I $P(X0,U,15) S X=$$SITE^VASITE(DT,$P(X0,U,15)),Y=$P(X,U,3)_U_$P(X,U,2)
 I '$P(X0,U,15) S X=$S($P(X0,U,4):$P(X0,U,4),1:+$G(DUZ(2))),Y=X_U_$P($G(^DIC(4,+X,0)),U) ;look up #40.8 ptr??
 Q Y
 ;
TYPE(X) ; -- Expands collection type code into text
 Q:'$L($G(X)) ""
 I X="SP" Q "SEND PATIENT"
 S X=$E(X),X=$S(X="L":"LAB",X="I":"IMMEDIATE",1:"WARD")
 Q X_" COLLECT"
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HORMBLDVB   7491     printed  Sep 23, 2025@20:08:11                                                                                                                                                                                                    Page 2
ORMBLDVB  ;SLC/MKB - Build outgoing Blood Bank ORM msgs ;2/11/08  11:04
 +1       ;;3.0;ORDER ENTRY/RESULTS REPORTING;**212,309**;Dec 17, 1997;Build 26
 +2       ;
 +3       ; Use of $$GETICN^MPIF001 supported by DBIA #2701
 +4       ;
HL7DATE(DATE) ; -- FM -> HL7 format
 +1        QUIT $$FMTHL7^XLFDT(DATE)
 +2       ;
NW(ORIFN) ; -- Send new VBECS orders [from ORCSEND2]
 +1       ;    Uses ORNOW if defined
 +2        NEW HLA,HL,OR0,OR3,ORR,ORDT,ORVAL,ORI,OROK,HLMTIEN
 +3        SET OR0=$GET(^OR(100,ORIFN,0))
           SET OR3=$GET(^(3))
 +4        DO INIT^HLFNC2("OR OMG SERVER",.HL)
           DO GETVALS(ORIFN)
 +5        SET ORDT=$SELECT($GET(ORNOW):ORNOW,1:+$EXTRACT($$NOW^XLFDT,1,12))
 +6        SET ORR=$GET(ORVAL("REASON"))
           SET ORDT=$$HL7DATE(ORDT)
 +7       ;S ORMSH="MSH|^~\&|ORDER ENTRY|"_$G(DUZ(2))_"|VBECS|"_$G(DUZ(2))_"|"_ORDT_"||OMG^O19||P|2.4||||AL" ;for testing
 +8        SET HLA("HLS",1)=$$PID(+$PIECE(OR0,U,2))
           SET HLA("HLS",2)=$$PV1
 +9        SET HLA("HLS",3)=$$ORC("NW","",ORR)
           SET HLA("HLS",4)=$$OBR("")
           SET ORI=4
 +10       if $LENGTH($GET(ORVAL("COMMENT")))
               SET HLA("HLS",5)=$$NTE
               SET ORI=5
 +11       SET ORI=ORI+1
           SET HLA("HLS",ORI)=$$DG1(+$PIECE(OR0,U,2))
 +12      ;W ! ZW HLA D STATUS^ORCSAVE2(ORIFN,5) ;for testing 
 +13       DO DIRECT^HLMA("OR OMG SERVER","LM",1,.OROK)
 +14      ;queue
           IF $PIECE(OROK,U,2)
               DO SNDERR($PIECE(OROK,U,3))
               DO GENERATE^HLMA("OR OMG SERVER","LM",1,.OROK)
               QUIT 
 +15      ; S ^OR(100,ORIFN,8,1,1)=$P(OROK,U,3),$P(^(0),U,15)=13 Q
 +16      ;successful, process ACK message
           IF HLMTIEN
               DO ACK^ORMVBEC(+ORIFN_";1")
 +17       QUIT 
 +18      ;
GETVALS(IFN) ; -- Return ORVAL(ID)=value for child order IFN
 +1        NEW ID,ITM
           SET ID=""
           KILL ORVAL
 +2        FOR 
               SET ID=$ORDER(^OR(100,IFN,4.5,"ID",ID))
               if ID=""
                   QUIT 
               SET ITM=$ORDER(^(ID,0))
               SET ORVAL(ID)=$GET(^OR(100,IFN,4.5,ITM,1))
 +3        QUIT 
 +4       ;
RESULTS(ORDER) ; -- Send PR messages with Lab results [from EN]
 +1       ;    where ORDER = parent#
 +2        NEW ORP,ORI,ORTST,ORTMP,ORTDT,ORX,OROK,HLA
 +3        SET ORDER=+$GET(ORDER)
           SET OR0=$GET(^OR(100,ORDER,0))
           SET ORI=0
 +4        FOR 
               SET ORI=$ORDER(^OR(100,ORDER,4.5,"ID","RESULTS",ORI))
               if ORI<1
                   QUIT 
               Begin DoDot:1
 +5                SET ORX=$GET(^OR(100,ORDER,4.5,ORI,1))
                   SET ORTDT=$PIECE(ORX,U,7)
 +6       ;no data or error
                   if 'ORX
                       QUIT 
 +7                SET ORTST=+ORX_U_$PIECE($GET(^LAB(60,+ORX,0)),U)
                   KILL HLA,OROK
 +8                SET HLA("HLS",1)=$$PID(+$PIECE(OR0,U,2))
                   SET HLA("HLS",2)=$$PV1
 +9                SET HLA("HLS",3)="ORC|PR|||"_ORDER_"^OR"
 +10               SET HLA("HLS",4)="OBR||"_$PIECE(ORX,U,17)_"^LRCH||"_ORTST_"^99LRT"
 +11               SET HLA("HLS",5)="OBX|1||"_ORTST_"^99LRT||"_$PIECE(ORX,U,2)_"|"_$PIECE(ORX,U,4)_"|"_$PIECE(ORX,U,5)_"|"_$PIECE(ORX,U,3)_"|||"_$PIECE(ORX,U,6)_"|||"_$$HL7DATE(ORTDT)
 +12      ;W ! ZW HLA ;for testing
 +13      ;GENERATE
                   DO DIRECT^HLMA("OR OMG SERVER","LM",1,.OROK)
 +14      ;queue
                   IF $PIECE(OROK,U,2)
                       DO SNDERR($PIECE(OROK,U,3))
                       DO GENERATE^HLMA("OR OMG SERVER","LM",1,.OROK)
                       QUIT 
 +15           End DoDot:1
 +16       QUIT 
 +17      ;
CA(ORDER,REASON) ; -- Cancel VBEC orders (ORDER=child)
 +1       ;    [from DC^ORCSEND/MSG^ORMBLD - Uses ORNOW if defined]
 +2        NEW ORIFN,ORDA,ORDT,OR0,OR3,PKGIFN,HL,HLA,ORVAL,OROK,HLMTIEN
 +3        SET ORDT=$SELECT($GET(ORNOW):ORNOW,1:+$EXTRACT($$NOW^XLFDT,1,12))
 +4        SET ORIFN=+$GET(ORDER)
           SET ORDA=+$PIECE($GET(ORDER),";",2)
           SET ORDT=$$HL7DATE(ORDT)
 +5        SET OR0=$GET(^OR(100,ORIFN,0))
           SET OR3=$GET(^(3))
           SET PKGIFN=$GET(^(4))_"^VBEC"
 +6        SET REASON=$SELECT($GET(REASON):$PIECE($GET(^ORD(100.03,+REASON,0)),U),1:"")
 +7        DO INIT^HLFNC2("OR OMG SERVER",.HL)
           DO GETVALS(ORIFN)
 +8       ;S ORMSH="MSH|^~\&|ORDER ENTRY|"_$G(DUZ(2))_"|VBECS|"_$G(DUZ(2))_"|"_ORDT_"||OMG^O19||P|2.4||||AL" ;for now
 +9        SET HLA("HLS",1)=$$PID(+$PIECE(OR0,U,2))
           SET HLA("HLS",2)=$$PV1
 +10       SET HLA("HLS",3)=$$ORC("CA",PKGIFN,REASON)
           SET HLA("HLS",4)=$$OBR(PKGIFN)
 +11      ;GENERATE^HLMA
           DO DIRECT^HLMA("OR OMG SERVER","LM",1,.OROK)
 +12       IF $PIECE(OROK,U,2)
               Begin DoDot:1
 +13               if ORDA
                       SET ^OR(100,ORIFN,8,ORDA,1)=$PIECE(OROK,U,3)
                       SET $PIECE(^(0),U,15)=13
 +14               DO SNDERR($PIECE(OROK,U,3))
                   DO GENERATE^HLMA("OR OMG SERVER","LM",1,.OROK)
                   QUIT 
               End DoDot:1
               QUIT 
 +15      ;successful, process ACK message
           IF HLMTIEN
               DO ACK^ORMVBEC(ORDER)
 +16       QUIT 
 +17      ;
SNDERR(MSG) ; -- Send Error message to VBECS Mail Group
 +1       ; Input - MSG = Error message string
 +2        NEW OREMSG,XMSUB,XMTEXT,XMDUZ,XMY,XMZ
 +3        SET OREMSG(1,0)="An Error occurred trying to send an HL7 message to VBECS."
 +4        SET OREMSG(2,0)=" "
 +5        SET OREMSG(3,0)="Error Message Text:  "_$SELECT($LENGTH(MSG)>60:$EXTRACT(MSG,1,60),1:MSG)
 +6        SET XMY("G."_$PIECE($$GETAPP^HLCS2("VBECS"),"^"))=""
 +7        SET XMTEXT="OREMSG("
           SET XMSUB="OERR-VBECS HL7 Failure"
           SET XMDUZ="OERR-VBECS Logical Link"
           DO XMZ^XMA2
 +8        SET DIE=3.9
           SET DA=XMZ
           SET DR="1.7////P"
           DO ^DIE
 +9        DO EN1^XMD
 +10       QUIT 
 +11      ;
PID(DFN)  ; -- PID segment
 +1        NEW ORPT0,ORICN,NAME,DOB,Y
           SET DFN=+$GET(DFN)
 +2        SET ORPT0=$GET(^DPT(DFN,0))
 +3        SET ORICN=$$GETICN^MPIF001(DFN)
           IF +$GET(ORICN)<1
               SET ORICN=""
 +4        SET NAME=$$HLNAME^HLFNC($PIECE(ORPT0,U),"^~\&")
           SET DOB=$$HL7DATE($PIECE(ORPT0,U,3))
 +5        SET Y="PID|||"_ORICN_"^^^^NI~"_$PIECE(ORPT0,U,9)_"^^^^SS~"_DFN_"^^^^PI||"_NAME_"||"_DOB_"|"_$PIECE(ORPT0,U,2)
 +6        QUIT Y
 +7       ;
PV1()     ; -- PV1 segment (expects OR0)
 +1        NEW Y,DFN,LOC,TYPE,SPEC,RB,ATTD
 +2        SET DFN=+$PIECE(OR0,U,2)
           SET LOC=$PIECE(OR0,U,10)
           SET TYPE=$PIECE(OR0,U,12)
           SET SPEC=$PIECE(OR0,U,13)
 +3        SET LOC=$SELECT(LOC:$PIECE($GET(^SC(+LOC,0)),U),1:"")
           SET RB=""
 +4        if TYPE="I"
               SET RB=$PIECE($GET(^DPT(DFN,.101)),U)
 +5       ;DBIA 1154
           SET SPEC=$SELECT(SPEC:"VA"_$$GET1^DIQ(45.7,SPEC_",",1,"I"),1:"")
 +6       ;DBIA 10035
           SET ATTD=+$GET(^DPT(DFN,.1041))
           if 'ATTD
               SET ATTD=""
           IF ATTD
               Begin DoDot:1
 +7                NEW NM
                   SET NM=$PIECE($GET(^VA(200,ATTD,0)),U)
 +8                SET ATTD=ATTD_U_$$HLNAME^HLFNC(NM,"^~\&")
               End DoDot:1
 +9        SET Y="PV1||"_TYPE_"|"_LOC_$SELECT($LENGTH(RB):U_RB,1:"")_"||||"_ATTD_"|||"_SPEC
 +10       QUIT Y
 +11      ;
ORC(CODE,FILLER,REASON) ; -- ORC segment (expects OR0, OR3, ORDT)
 +1        NEW Y,USR,PROV,NM,ORI,DAD,YN,X13,PHONE
 +2        SET USR=+$PIECE(OR0,U,6)
           SET PROV=+$PIECE(OR0,U,4)
           SET X13=$GET(^VA(200,PROV,.13))
 +3        SET PHONE=$SELECT($LENGTH($PIECE(X13,U,7)):$PIECE(X13,U,7),1:$PIECE(X13,U,8))
 +4        FOR ORI="USR","PROV"
               SET NM=$PIECE($GET(^VA(200,@ORI,0)),U)
               SET @ORI=@ORI_U_$$HLNAME^HLFNC(NM,"^~\&")
 +5       ;,DIV=$$DIV(+$P(OR0,U,10))
           SET DAD=+$PIECE(OR3,U,9)
 +6        SET Y="ORC|"_CODE_"|"_ORIFN_"^OR|"_$GET(FILLER)_"|"_DAD_"^OR|||||"_ORDT_"|"_USR_"||"_PROV_"||"_PHONE_"||^"_$GET(REASON)_"|"_$$DIV
 +7        SET YN=$GET(ORVAL("YN"))
           SET YN=$SELECT(YN="":"",YN:"1^YES",YN=0:"0^NO",1:"U^UNKNOWN")
 +8        SET Y=Y_"|||"_YN
 +9        QUIT Y
 +10      ;
OBR(FILLER) ; -- OBR segment
 +1        NEW Y,OI,MOD,TYPE,X,SPCACT,SPCUID
 +2        SET OI=$$USID(ORIFN)
           SET MOD=$GET(ORVAL("MODIFIER"))
 +3        IF $LENGTH(MOD)
               SET MOD=$SELECT(MOD="W":"WASHED",MOD="I":"IRRADIATED",MOD="L":"LEUKO-POOR",MOD="V":"VOLUME-REDUCED",MOD="D":"DIVIDED",MOD="E":"LEUKO-POOR/IRRADIATED",1:MOD)
 +4        SET TYPE=$GET(ORVAL("COLLECT"))
           SET TYPE=$$TYPE(TYPE)
 +5        SET X=$GET(ORVAL("SPECSTS"))
           SET SPCACT=$SELECT('X:"O",$LENGTH($PIECE(X,U,3)):"A",1:"L")
 +6        SET SPCUID=$SELECT(SPCACT="A":$PIECE(X,U,3),1:"")
 +7        SET Y="OBR|1|"_ORIFN_"^OR|"_$GET(FILLER)_"|"_OI_"^^"_MOD_"|||||||"_SPCACT_"||"_$GET(ORLAB)_"||"_SPCUID_"^^"_TYPE_"||||||||||||"_$$QT
 +8        QUIT Y
 +9       ;
USID(IFN) ; -- Return USID for order IFN
 +1        NEW OI,OI0,OID,OIX,Y
           SET Y=""
 +2        SET OI=+$ORDER(^OR(100,+$GET(IFN),.1,"B",0))
           IF OI
               Begin DoDot:1
 +3                SET OI0=$GET(^ORD(101.43,OI,0))
                   SET OID=$PIECE(OI0,U,2)
 +4                SET OIX=$PIECE(OI0,U,8)
                   IF OIX["&"
                       SET OIX=$PIECE(OIX,"&")_"\T\"_$PIECE(OIX,"&",2)
 +5                SET Y=+OID_U_OIX_U_$PIECE(OID,";",2)
               End DoDot:1
 +6        QUIT Y
 +7       ;
NTE()     ; -- NTE segment
 +1        NEW Y
           SET Y="NTE|1||"_$GET(ORVAL("COMMENT"))
 +2        QUIT Y
 +3       ;
DG1(DFN)  ; -- DG1 segment
 +1        NEW VAIP,VAERR,Y
 +2        SET DFN=+$GET(DFN)
           DO IN5^VADPT
 +3        SET Y="DG1|1||^^^^"_$GET(VAIP(9))_"^|||A"
 +4        QUIT Y
 +5       ;
QT()      ; -- Build and return Quantity/Timing field
 +1        NEW X,Y,%DT,X1,X4,X5,X6,X8,ORI
 +2        SET X=$GET(ORVAL("QTY"))
           SET X1=$SELECT(X:+X_$SELECT(X["ML":"&ML",1:""),1:"")
 +3        SET (X4,X5)=""
           FOR ORI="START^4","DATETIME^5"
               Begin DoDot:1
 +4                SET X=$GET(ORVAL($PIECE(ORI,U)))
                   SET %DT="TX"
                   DO ^%DT
                   if Y<1
                       QUIT 
 +5                SET X=$$HL7DATE(Y)
                   SET @("X"_$PIECE(ORI,U,2))=X
               End DoDot:1
 +6        SET X=$GET(ORVAL("URGENCY"))
           SET X6=$PIECE($GET(^ORD(101.42,+X,0)),U,2)
 +7       ;S X=$G(ORVAL("XFUSION")),X7=$S(X="H":"HOLD",X="I":"IMMEDIATE",1:"")
 +8        SET X8=$GET(ORVAL("MISC"))
 +9        SET Y=X1_U_U_U_X4_U_X5_U_X6_U_U_X8
 +10       QUIT Y
 +11      ;
DIV()     ; -- Return Institution file #4 ptr for LOC
 +1        NEW X,Y
           SET X=+$GET(DUZ(2))
 +2        SET Y=$PIECE($GET(^DIC(4,X,99)),U)_U_$PIECE($GET(^DIC(4,X,0)),U)
 +3        QUIT Y
 +4       ;
ZDIV(LOC) ; -- Return Institution file #4 ptr for LOC
 +1        NEW X0,Y
           SET X0=$GET(^SC(+LOC,0))
 +2        IF $PIECE(X0,U,15)
               SET X=$$SITE^VASITE(DT,$PIECE(X0,U,15))
               SET Y=$PIECE(X,U,3)_U_$PIECE(X,U,2)
 +3       ;look up #40.8 ptr??
           IF '$PIECE(X0,U,15)
               SET X=$SELECT($PIECE(X0,U,4):$PIECE(X0,U,4),1:+$GET(DUZ(2)))
               SET Y=X_U_$PIECE($GET(^DIC(4,+X,0)),U)
 +4        QUIT Y
 +5       ;
TYPE(X)   ; -- Expands collection type code into text
 +1        if '$LENGTH($GET(X))
               QUIT ""
 +2        IF X="SP"
               QUIT "SEND PATIENT"
 +3        SET X=$EXTRACT(X)
           SET X=$SELECT(X="L":"LAB",X="I":"IMMEDIATE",1:"WARD")
 +4        QUIT X_" COLLECT"