DGPFHLS ;ALB/RPM - PRF HL7 SEND DRIVERS ; Sep 11, 2023@13:22:21
 ;;5.3;Registration;**425,650,1005,1028,1037,1091**;Aug 13, 1993;Build 28
 ;
 ;  Reference to SAVEHL7^EHMHL7 supported by ICR #7424
 ;
SNDORU(DGPFIEN,DGPFHARR,DGFAC) ;Send ORU Message Types (ORU~R01)
 ;This function builds and transmits a single ORU message to all sites
 ;in the associated patient's TREATING FACILITY LIST (#391.91) file.
 ;The optional input parameter DGFAC overrides selection of sites
 ;from the TREATING FACILITY LIST file.
 ;
 ;  Supported DBIA #2990:  This supported DBIA is used to access the
 ;                         Registration API to generate a list of
 ;                         treating facilities for a given patient.
 ;  Supported by ICR #2263 This ICR permits use of $$GET^XPAR().
 ;  Input:
 ;    DGPFIEN - (required) IEN of assignment in PRF ASSIGNMENT (#26.13)
 ;                         file to transmit
 ;   DGPFHARR - (optional) array of assignment history IENs from the
 ;                         PRF ASSIGNMENT HISTORY (#26.14) file to 
 ;                         include in ORU.
 ;                         format:  DGPFHARR(assignment_date_time)=IEN
 ;                                  assignment_date_time in FM format
 ;                         [default = $$GETLAST^DGPFAAH(DGPFIEN)]
 ;      DGFAC - (optional) array of message destination facilities
 ;                         passed by reference
 ;                         format:  DGFAC(#)=station#
 ;
 ;  Output:
 ;   Function value - 1 on success, 0 on failure
 ;
 N DGHLEID   ;event protocol ID
 N DGHL      ;VistA HL7 environment array
 N DGHLROOT  ;message array location
 N DGPFA     ;assignment data array
 N DGPFAH    ;assignment history data array
 N DGPFHIEN  ;assignment history IEN
 N DGRSLT    ;function value
 N DGI       ;counter
 N DGCRNR    ;flag indicating that a converted facility was found
 N DGSTAT,DGSTAT2    ;status retuned when sending message
 ;
 S DGRSLT=0
 S DGHLROOT=$NA(^TMP("PRFORU",$J))
 K @DGHLROOT
 ;
 I +$G(DGPFIEN)>0,$D(^DGPF(26.13,DGPFIEN)) D
 . ;
 . ;retrieve assignment record
 . Q:'$$GETASGN^DGPFAA(DGPFIEN,.DGPFA)
 . ;
 . ;set up default history IEN array
 . I '$O(DGPFHARR(0)) D
 . . N DGPFAH
 . . S DGPFHIEN=$$GETLAST^DGPFAAH(DGPFIEN)
 . . Q:'$$GETHIST^DGPFAAH(DGPFHIEN,.DGPFAH)
 . . S DGPFHARR(+$G(DGPFAH("ASSIGNDT")))=DGPFHIEN
 . Q:'$O(DGPFHARR(0))
 . ;
 . ;retrieve treating facilities when no destination is provided
 . ;I $G(DGFAC(1))'>0 D TFL^VAFCTFU1(.DGFAC,+$G(DGPFA("DFN")))
 . I $G(DGFAC(1))'>0 D BLDTFL2^DGPFUT2(+$G(DGPFA("DFN")),.DGFAC)
 . Q:$G(DGFAC(1))'>0
 . ;
 . ;initialize VistA HL7 environment
 . S DGHLEID=$$INIT^DGPFHLUT("DGPF PRF ORU/R01 EVENT",.DGHL)
 . Q:'DGHLEID
 . ;
 . ;build ORU segments array
 . S DGPFHIEN=$$BLDORU^DGPFHLU(.DGPFA,.DGPFHARR,.DGHL,DGHLROOT)
 . Q:'DGPFHIEN
 . ;
 . ;transmit and log messages
 . S DGSTAT=0,DGSTAT2=0
 . S DGSTAT=$$XMIT^DGPFHLU6(DGPFHIEN,DGHLEID,.DGFAC,DGHLROOT,.DGHL)
 . ;
 . ;Should a copy be sent to the regional HC router?
 . S DGCRNR=$$CERNER2(DGPFIEN)
 . D:DGCRNR
 . . S DGSTAT2=$$XMIT1^DGPFHLU6(DGPFHIEN,DGHLEID,DGHLROOT,.DGHL)
 . . ;
 . . ;  Save HL7 message to EHRM HL7 Message file (#1609) - p1091
 . . ;
 . . N RTNVALUE K ^TMP("EHMHL7",$J) M ^TMP("EHMHL7",$J)=@DGHLROOT ;
 . . S RTNVALUE=$$SAVEHL7X^EHMHL7("EHMHL7","PRF","VISTA-"_$$STA^XUAF4($$KSP^XUPARAM("INST")),"200CRNR",DGHL("FS"),$E(DGHL("ECH"),1),$E(DGHL("ECH"),2)) ;
 . . K ^TMP("EHMHL7",$J) ;
 . ;
 . Q:'$G(DGSTAT)
 . I DGCRNR,'$G(DGSTAT2) Q
 . ;success
 . S DGRSLT=1
 ;
 ;cleanup
 K @DGHLROOT
 Q DGRSLT
 ;
SNDACK(DGACKTYP,DGMIEN,DGHL,DGSEGERR,DGSTOERR) ;Send ACK Message Type (ACK~R01)
 ;This procedure assumes the the VistA HL7 environment is providing the
 ;environment variables and will produce a fatal error if they are
 ;missing.
 ;
 ;  Input:
 ;    DGACKTYP - (required) ACK message type ("AA","AE")
 ;      DGMIEN - (required) IEN of message entry in file #773
 ;        DGHL - (required) HL7 environment array
 ;    DGSEGERR - (optional) Errors found during parsing
 ;    DGSTOERR - (optional) Errors during data storage
 ;
 ;  Output:
 ;    none
 ;
 N DGHLROOT
 N DGHLERR
 ;
 Q:($G(DGACKTYP)']"")
 Q:('+$G(DGMIEN))
 ;
 S DGHLROOT=$NA(^TMP("HLA",$J))
 K @DGHLROOT
 ;
 ;build ACK segments array
 I $$BLDACK^DGPFHLU4(DGACKTYP,DGHLROOT,.DGHL,.DGSEGERR,.DGSTOERR) D
 . ;send MailMan message on AE or AR
 . D SNDMAIL(DGMIEN,.DGHL,$NA(^TMP("HLA",$J)))
 . ;generate the message
 . D GENACK^HLMA1(DGHL("EID"),DGMIEN,DGHL("EIDS"),"GM",1,.DGHLERR)
 ;
 ;cleanup
 K @DGHLROOT
 Q
 ;
SNDQRY(DGDFN,DGMODE,DGFAC) ;Send QRY Message Types (QRY~R02)
 ;This function transmits a PRF Query (QRY~R02) HL7 message to a given
 ;patient's treating facility. 
 ;
 ;  Input:
 ;    DGDFN - (required) pointer to patient in PATIENT (#2) file
 ;   DGMODE - (optional) type of HL7 connection to use ("1" - direct
 ;            connection, "2" - deferred connection [default],
 ;            "3" - direct connection/display mode)
 ;    DGFAC - (optional) station number of query destination.
 ;            [default - most recent unqueried treating facility]
 ;
 ;  Output:
 ;   Function value - 1 on success, 0 on failure
 ;
 N DGEVNT
 N DGHLROOT
 N DGHLLNK
 N DGHL
 N DGICN
 N DGLSQ
 N DGMSG
 N DGMSGID
 N DGNXTF
 N DGRSLT
 N HLL
 N DGHLEID
 N DGHLRSLT
 N DGHLP
 ;
 ;the following HL* variables are created by DIRECT^HLMA
 N HL,HLCS,HLDOM,HLECH,HLFS,HLINST,HLINSTN
 N HLMTIEN,HLNEXT,HLNODE,HLPARAM,HLPROD,HLQ
 N HLQUIT
 ;
 S DGMODE=+$G(DGMODE)
 S DGFAC=$G(DGFAC)
 S DGRSLT=0
 S DGHLROOT=$NA(^TMP("HLS",$J))
 K @DGHLROOT
 ;
 I +$G(DGDFN)>0,$D(^DPT(DGDFN,0)) D
 . ;
 . ;ICN must be national
 . Q:'$$MPIOK^DGPFUT(DGDFN,.DGICN)
 . ;
 . ;find event, get last site queried and next treating facility
 . S DGEVNT=$$FNDEVNT^DGPFHLL1(DGDFN)
 . I 'DGEVNT,DGMODE'=3 D   ;no event and not display? create it!
 . . D STOEVNT^DGPFHLL1(DGDFN)
 . . S DGEVNT=$$FNDEVNT^DGPFHLL1(DGDFN)
 . S DGLSQ=$$GETLSQ^DGPFHLL(DGEVNT)
 . S DGNXTF=$$GETNXTF^DGPFUT(DGDFN,DGLSQ)
 . ;
 . ;determine treating facility institution number to query
 . S DGFAC=$S(DGFAC]"":$$IEN^XUAF4(DGFAC),DGNXTF:DGNXTF,DGLSQ&('DGNXTF):$$GETNXTF^DGPFUT(DGDFN),1:0)
 . ;
 . ;mark query event COMPLETE and return SUCCESS when no non-local
 . ;treating facilities are found and no previous queries have been run.
 . I DGFAC'>0,'DGLSQ D
 . . D STOEVNT^DGPFHLL1(DGDFN,"C")
 . . S DGRSLT=1
 . Q:(DGFAC'>0)
 . ;
 . ;retrieve treating facility HL Logical Link and build HLL array
 . S DGHLLNK=$$GETLINK^DGPFHLUT(DGFAC)
 . Q:(DGHLLNK=0)
 . S HLL("LINKS",1)="DGPF PRF ORF/R04 SUBSC"_U_DGHLLNK
 . ;S:$$CERNER(DGDFN) HLL("LINKS",1)="DGPF PRF ORF/R04 SUBSC"_U_"VACRNR"
 . ;
 . ;initialize VistA HL7 environment
 . S DGHLEID=$$INIT^DGPFHLUT("DGPF PRF QRY/R02 EVENT",.DGHL)
 . Q:'DGHLEID
 . ;
 . ;build QRY segments array
 . Q:'$$BLDQRY^DGPFHLQ(DGDFN,DGICN,DGHLROOT,.DGHL)
 . ;
 . ;display busy message to interactive users when direct-connect
 . I DGMODE=1!(DGMODE=3),$E($G(IOST),1,2)="C-" D
 . . S DGMSG(1)="Attempting to connect to "_$P($$NS^XUAF4(DGFAC),U)
 . . S DGMSG(2)="to search for Patient Record Flag Assignments."
 . . S DGMSG(3)="This request may take some time, please be patient ..."
 . . D EN^DDIOL(.DGMSG)
 . ;
 . ;generate HL7 message
 . I DGMODE=1!(DGMODE=3) D    ;generate direct-connect HL7 message
 . . S $P(DGHLP("SUBSCRIBER"),U,5)=$$STA^XUAF4(DGFAC)
 . . D DIRECT^HLMA(DGHLEID,"GM",1,.DGHLRSLT,"",.DGHLP)
 . . ;The DIRECT^HLMA API contains a bug that causes the message ID
 . . ;returned to be based on the HL7 MESSAGE TEXT (#772) file IEN and
 . . ;not the HL7 MESSAGE ADMINISTRATION (#773) file IEN.  Therefore,
 . . ;the following call to $$CONVMID is required to convert the
 . . ;message ID to the value stored in file #773.
 . . S DGMSGID=$$CONVMID^DGPFHLUT($P(DGHLRSLT,U))
 . . I DGMODE=1,DGMSGID>0 D STOQXMIT^DGPFHLL(DGEVNT,DGMSGID,DGFAC)
 . . I HLMTIEN,DGMODE'=3 D RCV^DGPFHLR
 . . I DGMODE=3 D DISPLAY^DGPFHLUQ(HLMTIEN,DGHLRSLT)
 . . ;success
 . . I '+$P(DGHLRSLT,U,2) S DGRSLT=1
 . ;
 . E  D              ;generate deferred HL7 message
 . . S $P(DGHLP("SUBSCRIBER"),U,5)=$$STA^XUAF4(DGFAC)
 . . D GENERATE^HLMA(DGHLEID,"GM",1,.DGHLRSLT,"",.DGHLP)
 . . I $P(DGHLRSLT,U)>0 D STOQXMIT^DGPFHLL(DGEVNT,$P(DGHLRSLT,U),DGFAC)
 . . ;success
 . . I '+$P(DGHLRSLT,U,2) S DGRSLT=1
 ;
 ;cleanup
 K @DGHLROOT
 Q DGRSLT
 ;
SNDORF(DGQRY,DGMIEN,DGHL,DGDFN,DGSEGERR,DGQRYERR) ;Send ORF Message Type (ORF~R04)
 ;This procedure assumes the the VistA HL7 environment is providing the
 ;environment variables and will produce a fatal error if they are
 ;missing.
 ;
 ;  Input:
 ;       DGQRY - (required) Array of QRY parsing results
 ;      DGMIEN - (required) IEN of message entry in file #773
 ;        DGHL - (required) HL7 environment array
 ;       DGDFN - (required) Pointer to patient in PATIENT (#2) file
 ;    DGSEGERR - (optional) Errors found during parsing
 ;    DGQRYERR - (optional) Errors found during query
 ;
 ;  Output:
 ;    none
 ;
 N DGHLROOT
 N DGHLERR
 ;
 Q:('$D(DGQRY))
 Q:('+$G(DGMIEN))
 ;
 S DGHLROOT=$NA(^TMP("HLA",$J))
 K @DGHLROOT
 ;
 ;build ORF segments array
 I $$BLDORF^DGPFHLQ(DGHLROOT,.DGHL,DGDFN,.DGQRY,.DGSEGERR,.DGQRYERR) D
 . ;send MailMan message on AE or AR
 . D SNDMAIL(DGMIEN,.DGHL,$NA(^TMP("HLA",$J)))
 . ;generate the message
 . D GENACK^HLMA1(DGHL("EID"),DGMIEN,DGHL("EIDS"),"GM",1,.DGHLERR)
 ;
 ;cleanup
 K @DGHLROOT
 Q
 ;
 ;patch 1005
CERNER(DGDFN) ;
 ;Is this a Cerner patient (i.e., is 200CRNR in the TFL)?
 ;input variables
 ;DGDFN - pointer to PATIENT (#2) file
 ;return value: 
 ; 1 - yes, 0 - no
 ;
 N DGRES,DGOUT,DGSITE,DGKEY,DGI
 S DGRES=0
 S DGSITE=$P($$SITE^VASITE,U,3)
 S DGKEY=DGDFN_U_"PI"_U_"USVHA"_U_DGSITE
 D TFL^VAFCTFU2(.DGOUT,DGKEY)
 S DGI=0
 F  S DGI=$O(DGOUT(DGI)) Q:DGI=""  D
 .I $P(DGOUT(DGI),U,4)="200CRNR",$P(DGOUT(DGI),U,2)="PI" S DGRES=1
 Q DGRES
 ;
CERNER2(DGIEN) ;
 ;This is a convenience routine that accepts a patient record flag
 ;assignment as input parameter.
 ;input variables:
 ;DGIEN - pointer to PRF ASSIGNMENT (#26.13) file
 ;return value:
 ; 1 - yes, 0 - no
 ;
 N DGDFN,DGPFA
 D GETASGN^DGPFAA(DGIEN,.DGPFA)
 S DGDFN=$P(DGPFA("DFN"),U)
 Q $$CERNER(DGDFN)
 ;
SNDMAIL(DGMIEN,DGHL,DGROOT) ;
 ;This entry point sends a MailMan message reporting that an AE or
 ;AR was generated.
 ;input variables:
 ;DGMIEN (required) - IEN of offending message in file #773
 ;DGHL (required)   - The "HL" array
 ;DGROOT (required) - root for the application ack passed to GENACK^HLMA1
 ;
 ;call to $$PROD^XUPROD supported by ICR #4440
 ;
 N XMDUZ,XMSUB,XMTEXT,XMY,XMZ ;MailMan variables
 N DGTXT,DGSTAT,DGMSA,DGTYP,DGFS,DGI,DGMID
 S DGFS=DGHL("FS")
 S DGMSA=$G(@DGROOT@(1))
 S DGTYP=$P(DGMSA,DGFS,2)
 S DGMID=$P(DGMSA,DGFS,3)
 Q:DGTYP="AA"  ;Don't send mail messages for succesful AAs.
 S DGSTAT=$P($$SITE^VASITE,U,3)
 S XMDUZ="PRF Error Processor"
 S XMSUB="PRF Application Error (station #"_DGSTAT_")"
 S XMSUB=XMSUB_" ["_$S($$PROD^XUPROD:"P",1:"T")_"]" ;production or test?
 S XMY("G.DGPF APPLICATION ERRORS")=""
 S XMTEXT="DGTXT("
 S DGTXT(1)="An error occurred in message #"_DGMIEN
 S DGTXT(2)="Original MID: "_DGMID
 S DGTXT(3)=""
 S DGTXT(4)="MESSAGE TEXT (ACK):"
 S DGI=""  F  S DGI=$O(@DGROOT@(DGI)) Q:DGI=""  D
 . S DGTXT(DGI+4)=$G(@DGROOT@(DGI))
 D ^XMD
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HDGPFHLS   11534     printed  Sep 23, 2025@20:23:39                                                                                                                                                                                                    Page 2
DGPFHLS   ;ALB/RPM - PRF HL7 SEND DRIVERS ; Sep 11, 2023@13:22:21
 +1       ;;5.3;Registration;**425,650,1005,1028,1037,1091**;Aug 13, 1993;Build 28
 +2       ;
 +3       ;  Reference to SAVEHL7^EHMHL7 supported by ICR #7424
 +4       ;
SNDORU(DGPFIEN,DGPFHARR,DGFAC) ;Send ORU Message Types (ORU~R01)
 +1       ;This function builds and transmits a single ORU message to all sites
 +2       ;in the associated patient's TREATING FACILITY LIST (#391.91) file.
 +3       ;The optional input parameter DGFAC overrides selection of sites
 +4       ;from the TREATING FACILITY LIST file.
 +5       ;
 +6       ;  Supported DBIA #2990:  This supported DBIA is used to access the
 +7       ;                         Registration API to generate a list of
 +8       ;                         treating facilities for a given patient.
 +9       ;  Supported by ICR #2263 This ICR permits use of $$GET^XPAR().
 +10      ;  Input:
 +11      ;    DGPFIEN - (required) IEN of assignment in PRF ASSIGNMENT (#26.13)
 +12      ;                         file to transmit
 +13      ;   DGPFHARR - (optional) array of assignment history IENs from the
 +14      ;                         PRF ASSIGNMENT HISTORY (#26.14) file to 
 +15      ;                         include in ORU.
 +16      ;                         format:  DGPFHARR(assignment_date_time)=IEN
 +17      ;                                  assignment_date_time in FM format
 +18      ;                         [default = $$GETLAST^DGPFAAH(DGPFIEN)]
 +19      ;      DGFAC - (optional) array of message destination facilities
 +20      ;                         passed by reference
 +21      ;                         format:  DGFAC(#)=station#
 +22      ;
 +23      ;  Output:
 +24      ;   Function value - 1 on success, 0 on failure
 +25      ;
 +26      ;event protocol ID
           NEW DGHLEID
 +27      ;VistA HL7 environment array
           NEW DGHL
 +28      ;message array location
           NEW DGHLROOT
 +29      ;assignment data array
           NEW DGPFA
 +30      ;assignment history data array
           NEW DGPFAH
 +31      ;assignment history IEN
           NEW DGPFHIEN
 +32      ;function value
           NEW DGRSLT
 +33      ;counter
           NEW DGI
 +34      ;flag indicating that a converted facility was found
           NEW DGCRNR
 +35      ;status retuned when sending message
           NEW DGSTAT,DGSTAT2
 +36      ;
 +37       SET DGRSLT=0
 +38       SET DGHLROOT=$NAME(^TMP("PRFORU",$JOB))
 +39       KILL @DGHLROOT
 +40      ;
 +41       IF +$GET(DGPFIEN)>0
               IF $DATA(^DGPF(26.13,DGPFIEN))
                   Begin DoDot:1
 +42      ;
 +43      ;retrieve assignment record
 +44                   if '$$GETASGN^DGPFAA(DGPFIEN,.DGPFA)
                           QUIT 
 +45      ;
 +46      ;set up default history IEN array
 +47                   IF '$ORDER(DGPFHARR(0))
                           Begin DoDot:2
 +48                           NEW DGPFAH
 +49                           SET DGPFHIEN=$$GETLAST^DGPFAAH(DGPFIEN)
 +50                           if '$$GETHIST^DGPFAAH(DGPFHIEN,.DGPFAH)
                                   QUIT 
 +51                           SET DGPFHARR(+$GET(DGPFAH("ASSIGNDT")))=DGPFHIEN
                           End DoDot:2
 +52                   if '$ORDER(DGPFHARR(0))
                           QUIT 
 +53      ;
 +54      ;retrieve treating facilities when no destination is provided
 +55      ;I $G(DGFAC(1))'>0 D TFL^VAFCTFU1(.DGFAC,+$G(DGPFA("DFN")))
 +56                   IF $GET(DGFAC(1))'>0
                           DO BLDTFL2^DGPFUT2(+$GET(DGPFA("DFN")),.DGFAC)
 +57                   if $GET(DGFAC(1))'>0
                           QUIT 
 +58      ;
 +59      ;initialize VistA HL7 environment
 +60                   SET DGHLEID=$$INIT^DGPFHLUT("DGPF PRF ORU/R01 EVENT",.DGHL)
 +61                   if 'DGHLEID
                           QUIT 
 +62      ;
 +63      ;build ORU segments array
 +64                   SET DGPFHIEN=$$BLDORU^DGPFHLU(.DGPFA,.DGPFHARR,.DGHL,DGHLROOT)
 +65                   if 'DGPFHIEN
                           QUIT 
 +66      ;
 +67      ;transmit and log messages
 +68                   SET DGSTAT=0
                       SET DGSTAT2=0
 +69                   SET DGSTAT=$$XMIT^DGPFHLU6(DGPFHIEN,DGHLEID,.DGFAC,DGHLROOT,.DGHL)
 +70      ;
 +71      ;Should a copy be sent to the regional HC router?
 +72                   SET DGCRNR=$$CERNER2(DGPFIEN)
 +73                   if DGCRNR
                           Begin DoDot:2
 +74                           SET DGSTAT2=$$XMIT1^DGPFHLU6(DGPFHIEN,DGHLEID,DGHLROOT,.DGHL)
 +75      ;
 +76      ;  Save HL7 message to EHRM HL7 Message file (#1609) - p1091
 +77      ;
 +78      ;
                               NEW RTNVALUE
                               KILL ^TMP("EHMHL7",$JOB)
                               MERGE ^TMP("EHMHL7",$JOB)=@DGHLROOT
 +79      ;
                               SET RTNVALUE=$$SAVEHL7X^EHMHL7("EHMHL7","PRF","VISTA-"_$$STA^XUAF4($$KSP^XUPARAM("INST")),"200CRNR",DGHL("FS"),$EXTRACT(DGHL("ECH"),1),$EXTRACT(DGHL("ECH"),2))
 +80      ;
                               KILL ^TMP("EHMHL7",$JOB)
                           End DoDot:2
 +81      ;
 +82                   if '$GET(DGSTAT)
                           QUIT 
 +83                   IF DGCRNR
                           IF '$GET(DGSTAT2)
                               QUIT 
 +84      ;success
 +85                   SET DGRSLT=1
                   End DoDot:1
 +86      ;
 +87      ;cleanup
 +88       KILL @DGHLROOT
 +89       QUIT DGRSLT
 +90      ;
SNDACK(DGACKTYP,DGMIEN,DGHL,DGSEGERR,DGSTOERR) ;Send ACK Message Type (ACK~R01)
 +1       ;This procedure assumes the the VistA HL7 environment is providing the
 +2       ;environment variables and will produce a fatal error if they are
 +3       ;missing.
 +4       ;
 +5       ;  Input:
 +6       ;    DGACKTYP - (required) ACK message type ("AA","AE")
 +7       ;      DGMIEN - (required) IEN of message entry in file #773
 +8       ;        DGHL - (required) HL7 environment array
 +9       ;    DGSEGERR - (optional) Errors found during parsing
 +10      ;    DGSTOERR - (optional) Errors during data storage
 +11      ;
 +12      ;  Output:
 +13      ;    none
 +14      ;
 +15       NEW DGHLROOT
 +16       NEW DGHLERR
 +17      ;
 +18       if ($GET(DGACKTYP)']"")
               QUIT 
 +19       if ('+$GET(DGMIEN))
               QUIT 
 +20      ;
 +21       SET DGHLROOT=$NAME(^TMP("HLA",$JOB))
 +22       KILL @DGHLROOT
 +23      ;
 +24      ;build ACK segments array
 +25       IF $$BLDACK^DGPFHLU4(DGACKTYP,DGHLROOT,.DGHL,.DGSEGERR,.DGSTOERR)
               Begin DoDot:1
 +26      ;send MailMan message on AE or AR
 +27               DO SNDMAIL(DGMIEN,.DGHL,$NAME(^TMP("HLA",$JOB)))
 +28      ;generate the message
 +29               DO GENACK^HLMA1(DGHL("EID"),DGMIEN,DGHL("EIDS"),"GM",1,.DGHLERR)
               End DoDot:1
 +30      ;
 +31      ;cleanup
 +32       KILL @DGHLROOT
 +33       QUIT 
 +34      ;
SNDQRY(DGDFN,DGMODE,DGFAC) ;Send QRY Message Types (QRY~R02)
 +1       ;This function transmits a PRF Query (QRY~R02) HL7 message to a given
 +2       ;patient's treating facility. 
 +3       ;
 +4       ;  Input:
 +5       ;    DGDFN - (required) pointer to patient in PATIENT (#2) file
 +6       ;   DGMODE - (optional) type of HL7 connection to use ("1" - direct
 +7       ;            connection, "2" - deferred connection [default],
 +8       ;            "3" - direct connection/display mode)
 +9       ;    DGFAC - (optional) station number of query destination.
 +10      ;            [default - most recent unqueried treating facility]
 +11      ;
 +12      ;  Output:
 +13      ;   Function value - 1 on success, 0 on failure
 +14      ;
 +15       NEW DGEVNT
 +16       NEW DGHLROOT
 +17       NEW DGHLLNK
 +18       NEW DGHL
 +19       NEW DGICN
 +20       NEW DGLSQ
 +21       NEW DGMSG
 +22       NEW DGMSGID
 +23       NEW DGNXTF
 +24       NEW DGRSLT
 +25       NEW HLL
 +26       NEW DGHLEID
 +27       NEW DGHLRSLT
 +28       NEW DGHLP
 +29      ;
 +30      ;the following HL* variables are created by DIRECT^HLMA
 +31       NEW HL,HLCS,HLDOM,HLECH,HLFS,HLINST,HLINSTN
 +32       NEW HLMTIEN,HLNEXT,HLNODE,HLPARAM,HLPROD,HLQ
 +33       NEW HLQUIT
 +34      ;
 +35       SET DGMODE=+$GET(DGMODE)
 +36       SET DGFAC=$GET(DGFAC)
 +37       SET DGRSLT=0
 +38       SET DGHLROOT=$NAME(^TMP("HLS",$JOB))
 +39       KILL @DGHLROOT
 +40      ;
 +41       IF +$GET(DGDFN)>0
               IF $DATA(^DPT(DGDFN,0))
                   Begin DoDot:1
 +42      ;
 +43      ;ICN must be national
 +44                   if '$$MPIOK^DGPFUT(DGDFN,.DGICN)
                           QUIT 
 +45      ;
 +46      ;find event, get last site queried and next treating facility
 +47                   SET DGEVNT=$$FNDEVNT^DGPFHLL1(DGDFN)
 +48      ;no event and not display? create it!
                       IF 'DGEVNT
                           IF DGMODE'=3
                               Begin DoDot:2
 +49                               DO STOEVNT^DGPFHLL1(DGDFN)
 +50                               SET DGEVNT=$$FNDEVNT^DGPFHLL1(DGDFN)
                               End DoDot:2
 +51                   SET DGLSQ=$$GETLSQ^DGPFHLL(DGEVNT)
 +52                   SET DGNXTF=$$GETNXTF^DGPFUT(DGDFN,DGLSQ)
 +53      ;
 +54      ;determine treating facility institution number to query
 +55                   SET DGFAC=$SELECT(DGFAC]"":$$IEN^XUAF4(DGFAC),DGNXTF:DGNXTF,DGLSQ&('DGNXTF):$$GETNXTF^DGPFUT(DGDFN),1:0)
 +56      ;
 +57      ;mark query event COMPLETE and return SUCCESS when no non-local
 +58      ;treating facilities are found and no previous queries have been run.
 +59                   IF DGFAC'>0
                           IF 'DGLSQ
                               Begin DoDot:2
 +60                               DO STOEVNT^DGPFHLL1(DGDFN,"C")
 +61                               SET DGRSLT=1
                               End DoDot:2
 +62                   if (DGFAC'>0)
                           QUIT 
 +63      ;
 +64      ;retrieve treating facility HL Logical Link and build HLL array
 +65                   SET DGHLLNK=$$GETLINK^DGPFHLUT(DGFAC)
 +66                   if (DGHLLNK=0)
                           QUIT 
 +67                   SET HLL("LINKS",1)="DGPF PRF ORF/R04 SUBSC"_U_DGHLLNK
 +68      ;S:$$CERNER(DGDFN) HLL("LINKS",1)="DGPF PRF ORF/R04 SUBSC"_U_"VACRNR"
 +69      ;
 +70      ;initialize VistA HL7 environment
 +71                   SET DGHLEID=$$INIT^DGPFHLUT("DGPF PRF QRY/R02 EVENT",.DGHL)
 +72                   if 'DGHLEID
                           QUIT 
 +73      ;
 +74      ;build QRY segments array
 +75                   if '$$BLDQRY^DGPFHLQ(DGDFN,DGICN,DGHLROOT,.DGHL)
                           QUIT 
 +76      ;
 +77      ;display busy message to interactive users when direct-connect
 +78                   IF DGMODE=1!(DGMODE=3)
                           IF $EXTRACT($GET(IOST),1,2)="C-"
                               Begin DoDot:2
 +79                               SET DGMSG(1)="Attempting to connect to "_$PIECE($$NS^XUAF4(DGFAC),U)
 +80                               SET DGMSG(2)="to search for Patient Record Flag Assignments."
 +81                               SET DGMSG(3)="This request may take some time, please be patient ..."
 +82                               DO EN^DDIOL(.DGMSG)
                               End DoDot:2
 +83      ;
 +84      ;generate HL7 message
 +85      ;generate direct-connect HL7 message
                       IF DGMODE=1!(DGMODE=3)
                           Begin DoDot:2
 +86                           SET $PIECE(DGHLP("SUBSCRIBER"),U,5)=$$STA^XUAF4(DGFAC)
 +87                           DO DIRECT^HLMA(DGHLEID,"GM",1,.DGHLRSLT,"",.DGHLP)
 +88      ;The DIRECT^HLMA API contains a bug that causes the message ID
 +89      ;returned to be based on the HL7 MESSAGE TEXT (#772) file IEN and
 +90      ;not the HL7 MESSAGE ADMINISTRATION (#773) file IEN.  Therefore,
 +91      ;the following call to $$CONVMID is required to convert the
 +92      ;message ID to the value stored in file #773.
 +93                           SET DGMSGID=$$CONVMID^DGPFHLUT($PIECE(DGHLRSLT,U))
 +94                           IF DGMODE=1
                                   IF DGMSGID>0
                                       DO STOQXMIT^DGPFHLL(DGEVNT,DGMSGID,DGFAC)
 +95                           IF HLMTIEN
                                   IF DGMODE'=3
                                       DO RCV^DGPFHLR
 +96                           IF DGMODE=3
                                   DO DISPLAY^DGPFHLUQ(HLMTIEN,DGHLRSLT)
 +97      ;success
 +98                           IF '+$PIECE(DGHLRSLT,U,2)
                                   SET DGRSLT=1
                           End DoDot:2
 +99      ;
 +100     ;generate deferred HL7 message
                      IF '$TEST
                           Begin DoDot:2
 +101                          SET $PIECE(DGHLP("SUBSCRIBER"),U,5)=$$STA^XUAF4(DGFAC)
 +102                          DO GENERATE^HLMA(DGHLEID,"GM",1,.DGHLRSLT,"",.DGHLP)
 +103                          IF $PIECE(DGHLRSLT,U)>0
                                   DO STOQXMIT^DGPFHLL(DGEVNT,$PIECE(DGHLRSLT,U),DGFAC)
 +104     ;success
 +105                          IF '+$PIECE(DGHLRSLT,U,2)
                                   SET DGRSLT=1
                           End DoDot:2
                   End DoDot:1
 +106     ;
 +107     ;cleanup
 +108      KILL @DGHLROOT
 +109      QUIT DGRSLT
 +110     ;
SNDORF(DGQRY,DGMIEN,DGHL,DGDFN,DGSEGERR,DGQRYERR) ;Send ORF Message Type (ORF~R04)
 +1       ;This procedure assumes the the VistA HL7 environment is providing the
 +2       ;environment variables and will produce a fatal error if they are
 +3       ;missing.
 +4       ;
 +5       ;  Input:
 +6       ;       DGQRY - (required) Array of QRY parsing results
 +7       ;      DGMIEN - (required) IEN of message entry in file #773
 +8       ;        DGHL - (required) HL7 environment array
 +9       ;       DGDFN - (required) Pointer to patient in PATIENT (#2) file
 +10      ;    DGSEGERR - (optional) Errors found during parsing
 +11      ;    DGQRYERR - (optional) Errors found during query
 +12      ;
 +13      ;  Output:
 +14      ;    none
 +15      ;
 +16       NEW DGHLROOT
 +17       NEW DGHLERR
 +18      ;
 +19       if ('$DATA(DGQRY))
               QUIT 
 +20       if ('+$GET(DGMIEN))
               QUIT 
 +21      ;
 +22       SET DGHLROOT=$NAME(^TMP("HLA",$JOB))
 +23       KILL @DGHLROOT
 +24      ;
 +25      ;build ORF segments array
 +26       IF $$BLDORF^DGPFHLQ(DGHLROOT,.DGHL,DGDFN,.DGQRY,.DGSEGERR,.DGQRYERR)
               Begin DoDot:1
 +27      ;send MailMan message on AE or AR
 +28               DO SNDMAIL(DGMIEN,.DGHL,$NAME(^TMP("HLA",$JOB)))
 +29      ;generate the message
 +30               DO GENACK^HLMA1(DGHL("EID"),DGMIEN,DGHL("EIDS"),"GM",1,.DGHLERR)
               End DoDot:1
 +31      ;
 +32      ;cleanup
 +33       KILL @DGHLROOT
 +34       QUIT 
 +35      ;
 +36      ;patch 1005
CERNER(DGDFN) ;
 +1       ;Is this a Cerner patient (i.e., is 200CRNR in the TFL)?
 +2       ;input variables
 +3       ;DGDFN - pointer to PATIENT (#2) file
 +4       ;return value: 
 +5       ; 1 - yes, 0 - no
 +6       ;
 +7        NEW DGRES,DGOUT,DGSITE,DGKEY,DGI
 +8        SET DGRES=0
 +9        SET DGSITE=$PIECE($$SITE^VASITE,U,3)
 +10       SET DGKEY=DGDFN_U_"PI"_U_"USVHA"_U_DGSITE
 +11       DO TFL^VAFCTFU2(.DGOUT,DGKEY)
 +12       SET DGI=0
 +13       FOR 
               SET DGI=$ORDER(DGOUT(DGI))
               if DGI=""
                   QUIT 
               Begin DoDot:1
 +14               IF $PIECE(DGOUT(DGI),U,4)="200CRNR"
                       IF $PIECE(DGOUT(DGI),U,2)="PI"
                           SET DGRES=1
               End DoDot:1
 +15       QUIT DGRES
 +16      ;
CERNER2(DGIEN) ;
 +1       ;This is a convenience routine that accepts a patient record flag
 +2       ;assignment as input parameter.
 +3       ;input variables:
 +4       ;DGIEN - pointer to PRF ASSIGNMENT (#26.13) file
 +5       ;return value:
 +6       ; 1 - yes, 0 - no
 +7       ;
 +8        NEW DGDFN,DGPFA
 +9        DO GETASGN^DGPFAA(DGIEN,.DGPFA)
 +10       SET DGDFN=$PIECE(DGPFA("DFN"),U)
 +11       QUIT $$CERNER(DGDFN)
 +12      ;
SNDMAIL(DGMIEN,DGHL,DGROOT) ;
 +1       ;This entry point sends a MailMan message reporting that an AE or
 +2       ;AR was generated.
 +3       ;input variables:
 +4       ;DGMIEN (required) - IEN of offending message in file #773
 +5       ;DGHL (required)   - The "HL" array
 +6       ;DGROOT (required) - root for the application ack passed to GENACK^HLMA1
 +7       ;
 +8       ;call to $$PROD^XUPROD supported by ICR #4440
 +9       ;
 +10      ;MailMan variables
           NEW XMDUZ,XMSUB,XMTEXT,XMY,XMZ
 +11       NEW DGTXT,DGSTAT,DGMSA,DGTYP,DGFS,DGI,DGMID
 +12       SET DGFS=DGHL("FS")
 +13       SET DGMSA=$GET(@DGROOT@(1))
 +14       SET DGTYP=$PIECE(DGMSA,DGFS,2)
 +15       SET DGMID=$PIECE(DGMSA,DGFS,3)
 +16      ;Don't send mail messages for succesful AAs.
           if DGTYP="AA"
               QUIT 
 +17       SET DGSTAT=$PIECE($$SITE^VASITE,U,3)
 +18       SET XMDUZ="PRF Error Processor"
 +19       SET XMSUB="PRF Application Error (station #"_DGSTAT_")"
 +20      ;production or test?
           SET XMSUB=XMSUB_" ["_$SELECT($$PROD^XUPROD:"P",1:"T")_"]"
 +21       SET XMY("G.DGPF APPLICATION ERRORS")=""
 +22       SET XMTEXT="DGTXT("
 +23       SET DGTXT(1)="An error occurred in message #"_DGMIEN
 +24       SET DGTXT(2)="Original MID: "_DGMID
 +25       SET DGTXT(3)=""
 +26       SET DGTXT(4)="MESSAGE TEXT (ACK):"
 +27       SET DGI=""
           FOR 
               SET DGI=$ORDER(@DGROOT@(DGI))
               if DGI=""
                   QUIT 
               Begin DoDot:1
 +28               SET DGTXT(DGI+4)=$GET(@DGROOT@(DGI))
               End DoDot:1
 +29       DO ^XMD
 +30       QUIT