DGHTHL7 ;ALB/JAM - Home Telehealth Patient Sign-up HL7;10 January 2005 ; 9/25/07 10:18am
 ;;5.3;Registration;**644**;Aug 13, 1993;Build 11
 ;
BLDHL7(DGHTH,MSG) ;Build HL7 Registration message for Home Telehealth
 ;Input : DGHTH - Arry with Home Telehealth transaction data
 ;        MSG   - Array to put message into (full global ref)
 ;Output: N  - Last line number used, or
 ;        0  - no message built, or
 ;        -1^ErrorText on error
 ;        MSG will contain HL7 message
 ;Note  : Insertion into MSG begins at next available line number
 ;
 N DFN,VENDOR,CONSULT,COORD,EVENTDT,VALCHK,DGX,ERR,PROTNAME,VAFPID
 N HLFS,HLECH,HLQ,HL,EVN,PID,PD1,PV1,LINE,X,Y
 S ERR=0,X="" F  S X=$O(DGHTH(X)) Q:X=""  D  I ERR Q
 .I DGHTH(X)="" S VALCHK="-1^Bad Input ("_X_")",ERR=1 Q
 .S @X=DGHTH(X)
 I ERR Q $G(VALCHK)
 I $G(MSG)="" Q "-1^Bad input variable (MSG)"
 S PROTNAME="DG HOME TELEHEALTH ADT-A04 SERVER"
 D INIT^HLFNC2(PROTNAME,.HL)
 I ($O(HL(""))="") Q "-1^Unable to initialize HL7 variables"
 S LINE=+$O(@MSG@(""),-1)
 ;
 ;EVN segment
 S EVN=$$EVN("A04","A04",EVENTDT)
 I $P(EVN,U)=-1 K @MSG Q EVN
 S LINE=LINE+1 S @MSG@(LINE)=EVN
 ;
 ;PID segment
 S PID=$$PID(DFN,.HL,.VAFPID)
 I $P(PID,U)=-1 Q PID
 D PIDVAL I ERR Q ERR
 S DGX=$O(VAFPID(0)),LINE=LINE+1 S @MSG@(LINE)=VAFPID(DGX)
 F  S DGX=$O(VAFPID(DGX)) Q:'DGX  D
 .S @MSG@(LINE,DGX-1)=VAFPID(DGX)
 ;
 ;PD1 segment
 S PD1=$$PD1(DFN,COORD)
 I $P(PD1,U)=-1 Q PD1
 S LINE=LINE+1 S @MSG@(LINE)=PD1
 ;
 ;PV1 segment
 S $P(PV1,HLFS,1)=1,$P(PV1,HLFS,5)=CONSULT
 S $P(PV1,HLFS,39)=$$STA^XUAF4(DUZ(2))
 S PV1="PV1"_HLFS_PV1
 S LINE=LINE+1 S @MSG@(LINE)=PV1
 ;
 Q LINE
 ;
EVN(TYPE,FLAG,DGEVDT) ;Build EVN segment
 ;Input:  TYPE   - HL7 event type
 ;        FLAG   - HL7 Event Reason Code
 ;        DGEVDT - Event Date/Time [Optional]
 ;Output: value  - EVN segment
 ;        -1^ErrorText on error
 ;
 N USRNAM,USERID,COMP,SUBCOMP,EVN
 I $G(TYPE)=""!($G(FLAG)="") Q "-1^Value missing to build message (EVN segment)"
 S EVN=$$EVN^VAFHLEVN(TYPE,FLAG,DGEVDT)
 I ($E(EVN,1,3)'="EVN") Q "-1^Error build message (EVN segment)"
 ;Add user and user's facility to EVN segment
 S COMP=$E(HL("ECH"),1),SUBCOMP=$E(HL("ECH"),4)
 S USRNAM=$$HLNAME^HLFNC($$GET1^DIQ(200,DUZ_",",.01),HL("ECH"))
 S USERID=DUZ_COMP_$P(USRNAM,COMP)_COMP_$P(USRNAM,COMP,2)_COMP_COMP_COMP
 S USERID=USERID_COMP_COMP_COMP_"USVHA"_SUBCOMP_SUBCOMP_"0363"_COMP_"L"
 S USERID=USERID_COMP_COMP_COMP_"NI"_COMP_"VA FACILITY ID"_SUBCOMP
 S USERID=USERID_$P($$SITE^VASITE,"^",3)_SUBCOMP_"L"
 S $P(EVN,HLFS,6)=USERID,$P(EVN,HLFS,8)=$P($$SITE^VASITE,HLFS,3)
 Q EVN
 ;
PID(DFN,HL,DGPID) ;Build PID segment
 ;Input:  DFN    - Patient DFN
 ;        HL     - HL7 values
 ;Output: DGPIR  - PID array segment
 ;            1  - PID segment build (no error)
 ;        -1^ErrorText on error
 ;
 N FLDS,DGX
 I $G(DFN)="" Q "-1^Value missing to build message (PID segment)"
 S FLDS=$$COMMANUM^VAFCADT2(1,9)_",10NTB,11,"
 S FLDS=FLDS_$$COMMANUM^VAFCADT2(12,21)_",22B"
 D BLDPID^VAFCQRY(DFN,"",FLDS,.DGPID,.HL)
 S DGX=$O(DGPID(0)) I DGX S DGX=DGPID(DGX)
 I $P(DGX,"^")'="PID" Q "-1^Error build message (PID segment)"
 Q 1
 ;
PD1(DFN,COORD) ;Build PD1 segment
 ;Input:  DFN    - Patient DFN
 ;        COOR   - Care Coordinator
 ;Output: PD1    - PD1 segment
 ;        -1^ErrorText on error
 ;
 N PD1,DGNAME
 I $G(DFN)=""!($G(COORD)="") Q "-1^Value missing to build message (PD1 segment)"
 S PD1=$$EN^VAFHLPD1(DFN,3)
 I ($E(PD1,1,3)'="PD1") Q "-1^Error build message (PD1 segment)"
 S DGNAME("FILE")=200,DGNAME("IENS")=COORD,DGNAME("FIELD")=.01
 S $P(PD1,HLFS,5)=COORD_$E(HLECH)_$$HLNAME^XLFNAME(.DGNAME,"",$E(HLECH))
 Q PD1
 ;
PIDVAL ;validate PID segment
 ;locate the fields in variable FLDS in VAFPID array, check its not null
 N NSTR,STR,FLN,FLDS,FLC,X,Y,Z
 S FLDS="4^6^8^12^20",(FLN,FLN(0))=0,DGX=0
 S STR="Patient Identifier list^Patient Name^Date of Birth^Patient address^SSN"
 F  S DGX=$O(VAFPID(DGX)) Q:'DGX  D  I ERR Q
 .S FLN(DGX)=$L(VAFPID(DGX),"^")-1,FLC=FLN,FLN=FLN+FLN(DGX)
 .F X=1:1 S Y=$P(FLDS,"^",X) Q:Y=""  I Y'="C" D  I ERR Q
 ..I Y'>FLN S $P(FLDS,"^",X)="C" D
 ...I FLN(DGX)=FLN S:($P(VAFPID(DGX),"^",Y-FLC)="")!($P(VAFPID(DGX),"^",Y-FLC)="""""") ERR="-1^Error in PID-"_(Y-1)_" field ("_$P(STR,"^",X)_")" Q
 ...S NSTR=$P(VAFPID(DGX-1),"^",FLN(DGX-1)+1)_VAFPID(DGX) I ($P(NSTR,"^",Y-FLC)="")!($P(NSTR,"^",Y-FLC)="""""") S ERR="-1^Error in PID-"_(Y-1)_" field ("_$P(STR,"^",X)_")" Q
 Q
 ;
BLDHL7I(DFN,MSG) ;Build HL7 Registration message for telehealth
 ;Input : DFN  - Pointer to PATIENT
 ;        MSG  - Array to put message into (full global ref)
 ;Output: Last line number used
 ;        -1^ErrorText on error
 ;        MSG will contain HL7 message
 ;Notes : Insertion into MSG begins at next available line number
 I '$D(^DPT(DFN,0)) Q "-1^Bad input (DFN)"
 I $G(MSG)="" Q "-1^Bad input variable (MSG)"
 N HLFS,HLECH,HLQ,HL,EVN,VAFPID,PV1,LINE,FLDS,DGVEN,DGX
 N EVNTDT,ERR,PROT4HL7,COMP,SUBCOMP,USRNAM,USERID
 S PROT4HL7="DG HOME TELEHEALTH ADT-A03 SERVER"
 D INIT^HLFNC2(PROT4HL7,.HL)
 I ($O(HL(""))="") Q "-1^Unable to initialize HL7 variables"
 S EVNTDT=$$NOW^XLFDT()
 S LINE=+$O(@MSG@(""),-1)
 ;EVN segment
 S EVN=$$EVN("A03","A03",EVNTDT)
 I EVN<0 K @MSG Q "-1^Error build message (EVN segment)"
 S LINE=LINE+1
 S @MSG@(LINE)=EVN
 ;
 ;PID segment
 N DGX
 S PID=$$PID(DGDFN,.HL,.VAFPID)
 I +PID'>0 S ERR=1 K @MSG Q "-1^Error build message (PID segment)"
 S DGX=$O(VAFPID(0)),LINE=LINE+1 S @MSG@(LINE)=VAFPID(DGX)
 F  S DGX=$O(VAFPID(DGX)) Q:'DGX  D
 .S @MSG@(LINE,DGX-1)=VAFPID(DGX)
 ;Done
 Q 1
SNDHL7(MSG,PTRRCV,PROTNAME)     ;Send HL7 Home Telehealth message to server
 ;Input : MSG - Array containing HL7 message to transmit
 ;              (full global reference)
 ;            - Must be in format required for interaction
 ;              with the HL7 package
 ;     PTRRCV  - Pointer for vendor receiving system
 ;    PROTNAME - Protocol name
 ;Output: Message ID
 ;        Message ID or 0^ErrorText on error
 ;Notes  : The global array ^TMP("HLS",$J) will be KILLed if MSG
 ;         does not use this global location
 I $G(MSG)="" Q "-1^Bad input variable(MSG)"
 I '$G(PTRRCV) Q "-1^Bad input variable for vendor (PTRRCV)"
 I ($O(@MSG@(""))="") Q "-1^Message empty... can't send empty"
 N DGARRAY,HL,HLL,HLFS,HLECH,HLQ,HLMTIEN,HLRESLT,HLP,KILLARRY,ARRY4HL7,APPINFO,DIC,CLPROT,SIEN,LINK
 S ARRY4HL7=$NA(^TMP("HLS",$J))
 D INIT^HLFNC2(PROTNAME,.HL)
 I ($O(HL(""))="") Q "-1^Unable to initialize HL7 variables"
 S APPINFO=$$APP4MSH(PTRRCV)
 I APPINFO="" Q "-1^Unable to determine receiving system information"
 ;See if MSG is ^TMP("HLS",$J)
 S KILLARRY=0
 I (MSG'=ARRY4HL7) D
 .;Make sure '$J' wasn't used
 .Q:(MSG="^TMP(""HLS"",$J)")
 .;Initialize ^TMP("HLS",$J) and merge XMITARRY into it
 .K @ARRY4HL7
 .M @ARRY4HL7=@MSG
 .S KILLARRY=1
 ;Using dynamic MSH segment
 S $P(HLP("SUBSCRIBER"),"^",2)="DG HOME TELEHEALTH"
 S $P(HLP("SUBSCRIBER"),"^",3)=$P(APPINFO,"^",1)
 S $P(HLP("SUBSCRIBER"),"^",4)="HTAPPL"
 S $P(HLP("SUBSCRIBER"),"^",5)=$P(APPINFO,"^",2)
 S HLP("PRIORITY")="I"  ;Immediate priority
 ;Get subscriber protocol
 S DIC="^ORD(101,",DIC(0)="B",X=PROTNAME D ^DIC
 D GETS^DIQ(101,+Y,"775*","E","ARRAY1")
 S CLPROT=ARRAY1(101.0775,$O(ARRAY1(101.0775,0)),.01,"E")
 ;Use inst file ien to retrieve logical link for dynamic addressing
 D LINK^HLUTIL3(DGVEN,.DGARRAY,"")
 S LINK=DGARRAY($O(DGARRAY(0)))
 S HLL("LINKS",1)=CLPROT_U_LINK
 D GENERATE^HLMA(PROTNAME,"GM",1,.HLRESLT,"",.HLP)
 ;S:('HLRESLT) HLRESLT=$P(HLRESLT,"^",2,3)
 ;Delete ^TMP("HLS",$J) if MSG was different
 K:(KILLARRY) @ARRY4HL7
 ;Done
 Q HLRESLT
 ;
APP4MSH(PTRRCV) ;Determine sending and receiving application for MSH segment
 ;Input : PTRRCV = Pointer to file #4 for receiving system
 ;Output: Sending Facility ^ Receiving Facility
 ;        Null = Error/bad input
 N SNDFAC,RCVFAC
 I 'PTRRCV Q ""
 I $$GET1^DIQ(4,PTRRCV,.01)="" Q ""
 S SNDFAC=$P($$SITE^VASITE(),"^",3)_$E(HLECH)
 S SNDFAC=SNDFAC_$$GET1^DIQ(4,$P($$SITE^VASITE(),"^"),60,"E")_$E(HLECH)
 S SNDFAC=SNDFAC_"DNS"
 S RCVFAC=$$GET1^DIQ(4,PTRRCV,99,"E")_$E(HLECH)
 S RCVFAC=RCVFAC_$$GET1^DIQ(4,PTRRCV,60,"E")_$E(HLECH)_"DNS"
 Q SNDFAC_"^"_RCVFAC
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HDGHTHL7   8302     printed  Sep 23, 2025@20:19:36                                                                                                                                                                                                     Page 2
DGHTHL7   ;ALB/JAM - Home Telehealth Patient Sign-up HL7;10 January 2005 ; 9/25/07 10:18am
 +1       ;;5.3;Registration;**644**;Aug 13, 1993;Build 11
 +2       ;
BLDHL7(DGHTH,MSG) ;Build HL7 Registration message for Home Telehealth
 +1       ;Input : DGHTH - Arry with Home Telehealth transaction data
 +2       ;        MSG   - Array to put message into (full global ref)
 +3       ;Output: N  - Last line number used, or
 +4       ;        0  - no message built, or
 +5       ;        -1^ErrorText on error
 +6       ;        MSG will contain HL7 message
 +7       ;Note  : Insertion into MSG begins at next available line number
 +8       ;
 +9        NEW DFN,VENDOR,CONSULT,COORD,EVENTDT,VALCHK,DGX,ERR,PROTNAME,VAFPID
 +10       NEW HLFS,HLECH,HLQ,HL,EVN,PID,PD1,PV1,LINE,X,Y
 +11       SET ERR=0
           SET X=""
           FOR 
               SET X=$ORDER(DGHTH(X))
               if X=""
                   QUIT 
               Begin DoDot:1
 +12               IF DGHTH(X)=""
                       SET VALCHK="-1^Bad Input ("_X_")"
                       SET ERR=1
                       QUIT 
 +13               SET @X=DGHTH(X)
               End DoDot:1
               IF ERR
                   QUIT 
 +14       IF ERR
               QUIT $GET(VALCHK)
 +15       IF $GET(MSG)=""
               QUIT "-1^Bad input variable (MSG)"
 +16       SET PROTNAME="DG HOME TELEHEALTH ADT-A04 SERVER"
 +17       DO INIT^HLFNC2(PROTNAME,.HL)
 +18       IF ($ORDER(HL(""))="")
               QUIT "-1^Unable to initialize HL7 variables"
 +19       SET LINE=+$ORDER(@MSG@(""),-1)
 +20      ;
 +21      ;EVN segment
 +22       SET EVN=$$EVN("A04","A04",EVENTDT)
 +23       IF $PIECE(EVN,U)=-1
               KILL @MSG
               QUIT EVN
 +24       SET LINE=LINE+1
           SET @MSG@(LINE)=EVN
 +25      ;
 +26      ;PID segment
 +27       SET PID=$$PID(DFN,.HL,.VAFPID)
 +28       IF $PIECE(PID,U)=-1
               QUIT PID
 +29       DO PIDVAL
           IF ERR
               QUIT ERR
 +30       SET DGX=$ORDER(VAFPID(0))
           SET LINE=LINE+1
           SET @MSG@(LINE)=VAFPID(DGX)
 +31       FOR 
               SET DGX=$ORDER(VAFPID(DGX))
               if 'DGX
                   QUIT 
               Begin DoDot:1
 +32               SET @MSG@(LINE,DGX-1)=VAFPID(DGX)
               End DoDot:1
 +33      ;
 +34      ;PD1 segment
 +35       SET PD1=$$PD1(DFN,COORD)
 +36       IF $PIECE(PD1,U)=-1
               QUIT PD1
 +37       SET LINE=LINE+1
           SET @MSG@(LINE)=PD1
 +38      ;
 +39      ;PV1 segment
 +40       SET $PIECE(PV1,HLFS,1)=1
           SET $PIECE(PV1,HLFS,5)=CONSULT
 +41       SET $PIECE(PV1,HLFS,39)=$$STA^XUAF4(DUZ(2))
 +42       SET PV1="PV1"_HLFS_PV1
 +43       SET LINE=LINE+1
           SET @MSG@(LINE)=PV1
 +44      ;
 +45       QUIT LINE
 +46      ;
EVN(TYPE,FLAG,DGEVDT) ;Build EVN segment
 +1       ;Input:  TYPE   - HL7 event type
 +2       ;        FLAG   - HL7 Event Reason Code
 +3       ;        DGEVDT - Event Date/Time [Optional]
 +4       ;Output: value  - EVN segment
 +5       ;        -1^ErrorText on error
 +6       ;
 +7        NEW USRNAM,USERID,COMP,SUBCOMP,EVN
 +8        IF $GET(TYPE)=""!($GET(FLAG)="")
               QUIT "-1^Value missing to build message (EVN segment)"
 +9        SET EVN=$$EVN^VAFHLEVN(TYPE,FLAG,DGEVDT)
 +10       IF ($EXTRACT(EVN,1,3)'="EVN")
               QUIT "-1^Error build message (EVN segment)"
 +11      ;Add user and user's facility to EVN segment
 +12       SET COMP=$EXTRACT(HL("ECH"),1)
           SET SUBCOMP=$EXTRACT(HL("ECH"),4)
 +13       SET USRNAM=$$HLNAME^HLFNC($$GET1^DIQ(200,DUZ_",",.01),HL("ECH"))
 +14       SET USERID=DUZ_COMP_$PIECE(USRNAM,COMP)_COMP_$PIECE(USRNAM,COMP,2)_COMP_COMP_COMP
 +15       SET USERID=USERID_COMP_COMP_COMP_"USVHA"_SUBCOMP_SUBCOMP_"0363"_COMP_"L"
 +16       SET USERID=USERID_COMP_COMP_COMP_"NI"_COMP_"VA FACILITY ID"_SUBCOMP
 +17       SET USERID=USERID_$PIECE($$SITE^VASITE,"^",3)_SUBCOMP_"L"
 +18       SET $PIECE(EVN,HLFS,6)=USERID
           SET $PIECE(EVN,HLFS,8)=$PIECE($$SITE^VASITE,HLFS,3)
 +19       QUIT EVN
 +20      ;
PID(DFN,HL,DGPID) ;Build PID segment
 +1       ;Input:  DFN    - Patient DFN
 +2       ;        HL     - HL7 values
 +3       ;Output: DGPIR  - PID array segment
 +4       ;            1  - PID segment build (no error)
 +5       ;        -1^ErrorText on error
 +6       ;
 +7        NEW FLDS,DGX
 +8        IF $GET(DFN)=""
               QUIT "-1^Value missing to build message (PID segment)"
 +9        SET FLDS=$$COMMANUM^VAFCADT2(1,9)_",10NTB,11,"
 +10       SET FLDS=FLDS_$$COMMANUM^VAFCADT2(12,21)_",22B"
 +11       DO BLDPID^VAFCQRY(DFN,"",FLDS,.DGPID,.HL)
 +12       SET DGX=$ORDER(DGPID(0))
           IF DGX
               SET DGX=DGPID(DGX)
 +13       IF $PIECE(DGX,"^")'="PID"
               QUIT "-1^Error build message (PID segment)"
 +14       QUIT 1
 +15      ;
PD1(DFN,COORD) ;Build PD1 segment
 +1       ;Input:  DFN    - Patient DFN
 +2       ;        COOR   - Care Coordinator
 +3       ;Output: PD1    - PD1 segment
 +4       ;        -1^ErrorText on error
 +5       ;
 +6        NEW PD1,DGNAME
 +7        IF $GET(DFN)=""!($GET(COORD)="")
               QUIT "-1^Value missing to build message (PD1 segment)"
 +8        SET PD1=$$EN^VAFHLPD1(DFN,3)
 +9        IF ($EXTRACT(PD1,1,3)'="PD1")
               QUIT "-1^Error build message (PD1 segment)"
 +10       SET DGNAME("FILE")=200
           SET DGNAME("IENS")=COORD
           SET DGNAME("FIELD")=.01
 +11       SET $PIECE(PD1,HLFS,5)=COORD_$EXTRACT(HLECH)_$$HLNAME^XLFNAME(.DGNAME,"",$EXTRACT(HLECH))
 +12       QUIT PD1
 +13      ;
PIDVAL    ;validate PID segment
 +1       ;locate the fields in variable FLDS in VAFPID array, check its not null
 +2        NEW NSTR,STR,FLN,FLDS,FLC,X,Y,Z
 +3        SET FLDS="4^6^8^12^20"
           SET (FLN,FLN(0))=0
           SET DGX=0
 +4        SET STR="Patient Identifier list^Patient Name^Date of Birth^Patient address^SSN"
 +5        FOR 
               SET DGX=$ORDER(VAFPID(DGX))
               if 'DGX
                   QUIT 
               Begin DoDot:1
 +6                SET FLN(DGX)=$LENGTH(VAFPID(DGX),"^")-1
                   SET FLC=FLN
                   SET FLN=FLN+FLN(DGX)
 +7                FOR X=1:1
                       SET Y=$PIECE(FLDS,"^",X)
                       if Y=""
                           QUIT 
                       IF Y'="C"
                           Begin DoDot:2
 +8                            IF Y'>FLN
                                   SET $PIECE(FLDS,"^",X)="C"
                                   Begin DoDot:3
 +9                                    IF FLN(DGX)=FLN
                                           if ($PIECE(VAFPID(DGX),"^",Y-FLC)="")!($PIECE(VAFPID(DGX),"^",Y-FLC)="""""")
                                               SET ERR="-1^Error in PID-"_(Y-1)_" field ("_$PIECE(STR,"^",X)_")"
                                           QUIT 
 +10                                   SET NSTR=$PIECE(VAFPID(DGX-1),"^",FLN(DGX-1)+1)_VAFPID(DGX)
                                       IF ($PIECE(NSTR,"^",Y-FLC)="")!($PIECE(NSTR,"^",Y-FLC)="""""")
                                           SET ERR="-1^Error in PID-"_(Y-1)_" field ("_$PIECE(STR,"^",X)_")"
                                           QUIT 
                                   End DoDot:3
                           End DoDot:2
                           IF ERR
                               QUIT 
               End DoDot:1
               IF ERR
                   QUIT 
 +11       QUIT 
 +12      ;
BLDHL7I(DFN,MSG) ;Build HL7 Registration message for telehealth
 +1       ;Input : DFN  - Pointer to PATIENT
 +2       ;        MSG  - Array to put message into (full global ref)
 +3       ;Output: Last line number used
 +4       ;        -1^ErrorText on error
 +5       ;        MSG will contain HL7 message
 +6       ;Notes : Insertion into MSG begins at next available line number
 +7        IF '$DATA(^DPT(DFN,0))
               QUIT "-1^Bad input (DFN)"
 +8        IF $GET(MSG)=""
               QUIT "-1^Bad input variable (MSG)"
 +9        NEW HLFS,HLECH,HLQ,HL,EVN,VAFPID,PV1,LINE,FLDS,DGVEN,DGX
 +10       NEW EVNTDT,ERR,PROT4HL7,COMP,SUBCOMP,USRNAM,USERID
 +11       SET PROT4HL7="DG HOME TELEHEALTH ADT-A03 SERVER"
 +12       DO INIT^HLFNC2(PROT4HL7,.HL)
 +13       IF ($ORDER(HL(""))="")
               QUIT "-1^Unable to initialize HL7 variables"
 +14       SET EVNTDT=$$NOW^XLFDT()
 +15       SET LINE=+$ORDER(@MSG@(""),-1)
 +16      ;EVN segment
 +17       SET EVN=$$EVN("A03","A03",EVNTDT)
 +18       IF EVN<0
               KILL @MSG
               QUIT "-1^Error build message (EVN segment)"
 +19       SET LINE=LINE+1
 +20       SET @MSG@(LINE)=EVN
 +21      ;
 +22      ;PID segment
 +23       NEW DGX
 +24       SET PID=$$PID(DGDFN,.HL,.VAFPID)
 +25       IF +PID'>0
               SET ERR=1
               KILL @MSG
               QUIT "-1^Error build message (PID segment)"
 +26       SET DGX=$ORDER(VAFPID(0))
           SET LINE=LINE+1
           SET @MSG@(LINE)=VAFPID(DGX)
 +27       FOR 
               SET DGX=$ORDER(VAFPID(DGX))
               if 'DGX
                   QUIT 
               Begin DoDot:1
 +28               SET @MSG@(LINE,DGX-1)=VAFPID(DGX)
               End DoDot:1
 +29      ;Done
 +30       QUIT 1
SNDHL7(MSG,PTRRCV,PROTNAME) ;Send HL7 Home Telehealth message to server
 +1       ;Input : MSG - Array containing HL7 message to transmit
 +2       ;              (full global reference)
 +3       ;            - Must be in format required for interaction
 +4       ;              with the HL7 package
 +5       ;     PTRRCV  - Pointer for vendor receiving system
 +6       ;    PROTNAME - Protocol name
 +7       ;Output: Message ID
 +8       ;        Message ID or 0^ErrorText on error
 +9       ;Notes  : The global array ^TMP("HLS",$J) will be KILLed if MSG
 +10      ;         does not use this global location
 +11       IF $GET(MSG)=""
               QUIT "-1^Bad input variable(MSG)"
 +12       IF '$GET(PTRRCV)
               QUIT "-1^Bad input variable for vendor (PTRRCV)"
 +13       IF ($ORDER(@MSG@(""))="")
               QUIT "-1^Message empty... can't send empty"
 +14       NEW DGARRAY,HL,HLL,HLFS,HLECH,HLQ,HLMTIEN,HLRESLT,HLP,KILLARRY,ARRY4HL7,APPINFO,DIC,CLPROT,SIEN,LINK
 +15       SET ARRY4HL7=$NAME(^TMP("HLS",$JOB))
 +16       DO INIT^HLFNC2(PROTNAME,.HL)
 +17       IF ($ORDER(HL(""))="")
               QUIT "-1^Unable to initialize HL7 variables"
 +18       SET APPINFO=$$APP4MSH(PTRRCV)
 +19       IF APPINFO=""
               QUIT "-1^Unable to determine receiving system information"
 +20      ;See if MSG is ^TMP("HLS",$J)
 +21       SET KILLARRY=0
 +22       IF (MSG'=ARRY4HL7)
               Begin DoDot:1
 +23      ;Make sure '$J' wasn't used
 +24               if (MSG="^TMP(""HLS"",$J)")
                       QUIT 
 +25      ;Initialize ^TMP("HLS",$J) and merge XMITARRY into it
 +26               KILL @ARRY4HL7
 +27               MERGE @ARRY4HL7=@MSG
 +28               SET KILLARRY=1
               End DoDot:1
 +29      ;Using dynamic MSH segment
 +30       SET $PIECE(HLP("SUBSCRIBER"),"^",2)="DG HOME TELEHEALTH"
 +31       SET $PIECE(HLP("SUBSCRIBER"),"^",3)=$PIECE(APPINFO,"^",1)
 +32       SET $PIECE(HLP("SUBSCRIBER"),"^",4)="HTAPPL"
 +33       SET $PIECE(HLP("SUBSCRIBER"),"^",5)=$PIECE(APPINFO,"^",2)
 +34      ;Immediate priority
           SET HLP("PRIORITY")="I"
 +35      ;Get subscriber protocol
 +36       SET DIC="^ORD(101,"
           SET DIC(0)="B"
           SET X=PROTNAME
           DO ^DIC
 +37       DO GETS^DIQ(101,+Y,"775*","E","ARRAY1")
 +38       SET CLPROT=ARRAY1(101.0775,$ORDER(ARRAY1(101.0775,0)),.01,"E")
 +39      ;Use inst file ien to retrieve logical link for dynamic addressing
 +40       DO LINK^HLUTIL3(DGVEN,.DGARRAY,"")
 +41       SET LINK=DGARRAY($ORDER(DGARRAY(0)))
 +42       SET HLL("LINKS",1)=CLPROT_U_LINK
 +43       DO GENERATE^HLMA(PROTNAME,"GM",1,.HLRESLT,"",.HLP)
 +44      ;S:('HLRESLT) HLRESLT=$P(HLRESLT,"^",2,3)
 +45      ;Delete ^TMP("HLS",$J) if MSG was different
 +46       if (KILLARRY)
               KILL @ARRY4HL7
 +47      ;Done
 +48       QUIT HLRESLT
 +49      ;
APP4MSH(PTRRCV) ;Determine sending and receiving application for MSH segment
 +1       ;Input : PTRRCV = Pointer to file #4 for receiving system
 +2       ;Output: Sending Facility ^ Receiving Facility
 +3       ;        Null = Error/bad input
 +4        NEW SNDFAC,RCVFAC
 +5        IF 'PTRRCV
               QUIT ""
 +6        IF $$GET1^DIQ(4,PTRRCV,.01)=""
               QUIT ""
 +7        SET SNDFAC=$PIECE($$SITE^VASITE(),"^",3)_$EXTRACT(HLECH)
 +8        SET SNDFAC=SNDFAC_$$GET1^DIQ(4,$PIECE($$SITE^VASITE(),"^"),60,"E")_$EXTRACT(HLECH)
 +9        SET SNDFAC=SNDFAC_"DNS"
 +10       SET RCVFAC=$$GET1^DIQ(4,PTRRCV,99,"E")_$EXTRACT(HLECH)
 +11       SET RCVFAC=RCVFAC_$$GET1^DIQ(4,PTRRCV,60,"E")_$EXTRACT(HLECH)_"DNS"
 +12       QUIT SNDFAC_"^"_RCVFAC