DGPFHLU5 ;ALB/RPM - PRF HL7 ACK PROCESSING ; 6/21/06 10:18am
;;5.3;Registration;**425,718,650,1015**;Aug 13, 1993;Build 21
;
Q
;
PROCERR(DGLIEN,DGACK,DGERR) ;process errors returned from ACK
;
; Input:
; DGLIEN - IEN of PRF HL7 TRANSMISSION LOG (#26.17) file
; DGACK - array of ACK parse data
; DGERR - array of parsed errors (ex: DGERR(1)=error_code)
;
; Output: none
;
N DGPFA ;assignment array
N DGPFAH ;assignment history array
N DGPFL ;HL7 transmission log array
N DGXMTXT ;mailman msg text array
;
I +$G(DGLIEN),$D(DGACK),$D(DGERR) D
. ;
. ;retrieve the HL7 transmission log values
. Q:'$$GETLOG^DGPFHLL(DGLIEN,.DGPFL)
. ;
. ;retrieve assignment history values
. Q:'$$GETHIST^DGPFAAH(+$G(DGPFL("ASGNHIST")),.DGPFAH)
. ;
. ;retransmit and quit if dialog error code "Assignment not found"
. I $$FNDDIA(261102,.DGERR) D Q
. . ;transmit all assignment records to rejecting site
. . Q:'$$XMIT^DGPFLMT5(+$G(DGPFAH("ASSIGN")),$P($G(DGPFL("SITE")),U))
. . ;update HL7 transmission log status (RE-TRANSMITTED)
. . D STOSTAT^DGPFHLL(26.17,DGLIEN,"RT")
. ;
. ;retrieve assignment values
. Q:'$$GETASGN^DGPFAA(+$G(DGPFAH("ASSIGN")),.DGPFA)
. ;
. S DGXMTXT=$NA(^TMP("DGPFERR",$J))
. K @DGXMTXT
. ;
. ;create message text array
. D BLDMSG(.DGPFA,.DGACK,.DGERR,DGXMTXT)
. ;
. ;send the notification message
. D SEND(DGXMTXT)
. ;
. ;cleanup
. K @DGXMTXT
Q
;
BLDMSG(DGPFA,DGACK,DGERR,DGXMTXT) ;build MailMan message array
;
; Supported DBIA #2171: The supported DBIA is uses to access Kernel
; APIs for retrieving Station numbers and names
; from the INSTITUTION (#4) file.
; Supported DBIA #2701: The supported DBIA is used to access MPI APIs
; for retrieving an ICN for a given DFN.
;
; Input:
; DGPFA - assignment data array
; DGACK - array of ACK data
; DGERR - array of parsed errors (ex: DGERR(1)=error_code)
;
; Output:
; DGXMTXT - array of MailMan text lines
;
N DGCNT ;error count
N DGCOD ;error code
N DGDEM ;patient demographics array
N DGDFN ;pointer to PATIENT (#2) file
N DGDLG ;DIALOG array
N DGFAC ;facility data array from XUAF4 call
N DGI ;generic counter
N DGICN ;integrated control number
N DGLIN ;line counter
N DGMAX ;maximum line length
N DGSITE ;results of VASITE call
N DGSNDSTA ;sending station number
N DGSNDNAM ;sending station name
N DGTBL ;error code table array
;
S DGDFN=+$G(DGPFA("DFN"))
Q:(DGDFN'>0)
;
;retrieve patient demographics
Q:'$$GETPAT^DGPFUT2(DGDFN,.DGDEM)
S DGICN=$$GETICN^MPIF001(DGDFN)
S DGICN=$S(+DGICN>0:DGICN,1:$P(DGICN,U,2))
;
;load error code table
D BLDVA086^DGPFHLU3(.DGTBL)
;
S DGLIN=0
S DGMAX=65
S DGSITE=$$SITE^VASITE()
S DGSNDSTA=$G(DGACK("SNDFAC"))
D F4^XUAF4(DGSNDSTA,.DGFAC,"","")
S DGSNDNAM=$S(DGFAC>0:$G(DGFAC("NAME")),1:"")
;
D ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("* * * * P R F H L 7 E R R O R E N C O U N T E R E D * * * *",0,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("A facility could not process the following Patient Record Flag assignment on "_$$FMTE^XLFDT($G(DGACK("MSGDTM")))_".",0,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("Message Control ID#: "_$G(DGACK("MSGID")),4,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("Receiving Facility name: "_DGSNDNAM_" ("_DGSNDSTA_")",0,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("Flag Name: "_$P($G(DGPFA("FLAG")),U,2),14,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("Patient Name: "_DGDEM("NAME"),11,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("Social Security #: "_DGDEM("SSN"),6,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("Date of Birth: "_$$FMTE^XLFDT(DGDEM("DOB"),"2D"),10,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("Integrated Control #: "_DGICN,3,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("Owning Site: "_$P($G(DGPFA("OWNER")),U,2)_" ("_$$STA^XUAF4($P($G(DGPFA("OWNER")),U))_")",12,DGMAX,.DGLIN,DGXMTXT)
D ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
;
;loop through each error
S DGCNT=0
F S DGCNT=$O(DGERR(DGCNT)) Q:'DGCNT D
. K DGDLG
. S DGCOD=DGERR(DGCNT)
. ;
. ;assume numeric error code is a DIALOG
. I DGCOD?1N.N D BLD^DIALOG(DGCOD,"","","DGDLG","S")
. I $D(DGDLG) D FORMAT^DGPFLMT4(.DGDLG,DGMAX-12)
. ;
. ;if not a DIALOG, then is it a table entry?
. I '$D(DGDLG),DGCOD]"",$D(DGTBL(DGCOD,"DESC")) S DGDLG(1)=DGTBL(DGCOD,"DESC")
. ;
. ;not a DIALOG or table entry - then error is unknown
. I '$D(DGDLG) S DGDLG(1)="Unknown Error code: '"_DGCOD_"'"
. ;
. ;error header
. D ADDLINE("Reason#: "_DGCNT,0,DGMAX,.DGLIN,DGXMTXT)
. ;
. ;loop through error text array
. S DGI=0
. F S DGI=$O(DGDLG(DGI)) Q:'DGI D
. . D ADDLINE(DGDLG(DGI),12,DGMAX,.DGLIN,DGXMTXT)
. ;
. ;error separator
. D ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
;
Q
;
ADDLINE(DGTEXT,DGINDENT,DGMAXLEN,DGCNT,DGXMTXT) ;add text line to message array
;
; Input:
; DGTEXT - text string
; DGINDENT - number of spaces to insert at start of line
; DGMAXLEN - maximum desired line length (default: 60)
; DGCNT - line number passed by reference
;
; Output:
; DGXMTXT - array of text strings
;
N DGAVAIL ;available space for text
N DGLINE ;truncated text
N DGLOC ;location of space character
N DGPAD ;space indent
;
S DGTEXT=$G(DGTEXT)
S DGINDENT=+$G(DGINDENT)
S DGMAXLEN=+$G(DGMAXLEN)
S:'DGMAXLEN DGMAXLEN=60
I DGINDENT>(DGMAXLEN-1) S DGINDENT=0
S DGCNT=$G(DGCNT,0) ;default to 0
;
S DGPAD=$$REPEAT^XLFSTR(" ",DGINDENT)
;
;determine available space for text
S DGAVAIL=(DGMAXLEN-DGINDENT)
F D Q:('$L(DGTEXT))
. ;
. ;find potential line break
. S DGLOC=$L($E(DGTEXT,1,DGAVAIL)," ")
. ;
. ;break a line that is too long when it has potential line breaks
. I $L(DGTEXT)>DGAVAIL,DGLOC D
. . S DGLINE=$P(DGTEXT," ",1,$S(DGLOC>1:DGLOC-1,1:1))
. . S DGTEXT=$P(DGTEXT," ",$S(DGLOC>1:DGLOC,1:DGLOC+1),$L(DGTEXT," "))
. E D
. . S DGLINE=DGTEXT,DGTEXT=""
. ;
. S DGCNT=DGCNT+1
. S @DGXMTXT@(DGCNT)=DGPAD_DGLINE
Q
;
SEND(DGXMTXT) ;send the MailMan message
;
; Input:
; DGXMTXT - name of message text array in closed format
;
; Output:
; none
;
N DIFROM ;protect FM package
N XMDUZ ;sender
N XMSUB ;message subject
N XMTEXT ;name of message text array in open format
N XMY ;recipient array
N XMZ ;returned message number
;
S XMDUZ="Patient Record Flag Module"
S XMSUB="PRF MESSAGE TRANSMISSION ERROR"
S XMTEXT=$$OREF^DILF(DGXMTXT)
S XMY("G.DGPF HL7 TRANSMISSION ERRORS")=""
D ^XMD
Q
;
FNDDIA(DGDIA,DGERR) ;find dialog code
;This function searches an array for a specific DIALOG (#.84) code.
;
; Input: (required)
; DGDIA - dialog error code
; DGERR - array of parsed errors (ex: DGERR(1)=error_code)
;
; Output:
; Function value - 1 on success; 0 on failure
;
N DGI ;generic counter
N DGRSLT ;function value
S (DGI,DGRSLT)=0
;
I +$G(DGDIA),$D(DGERR) D
. F S DGI=$O(DGERR(DGI)) Q:'DGI D Q:DGRSLT
. . I $G(DGERR(DGI))=DGDIA S DGRSLT=1
;
Q DGRSLT
DGPFHLU5 ;ALB/RPM - PRF HL7 ACK PROCESSING ; 6/21/06 10:18am
+1 ;;5.3;Registration;**425,718,650,1015**;Aug 13, 1993;Build 21
+2 ;
+3 QUIT
+4 ;
PROCERR(DGLIEN,DGACK,DGERR) ;process errors returned from ACK
+1 ;
+2 ; Input:
+3 ; DGLIEN - IEN of PRF HL7 TRANSMISSION LOG (#26.17) file
+4 ; DGACK - array of ACK parse data
+5 ; DGERR - array of parsed errors (ex: DGERR(1)=error_code)
+6 ;
+7 ; Output: none
+8 ;
+9 ;assignment array
NEW DGPFA
+10 ;assignment history array
NEW DGPFAH
+11 ;HL7 transmission log array
NEW DGPFL
+12 ;mailman msg text array
NEW DGXMTXT
+13 ;
+14 IF +$GET(DGLIEN)
IF $DATA(DGACK)
IF $DATA(DGERR)
Begin DoDot:1
+15 ;
+16 ;retrieve the HL7 transmission log values
+17 IF '$$GETLOG^DGPFHLL(DGLIEN,.DGPFL)
QUIT
+18 ;
+19 ;retrieve assignment history values
+20 IF '$$GETHIST^DGPFAAH(+$GET(DGPFL("ASGNHIST")),.DGPFAH)
QUIT
+21 ;
+22 ;retransmit and quit if dialog error code "Assignment not found"
+23 IF $$FNDDIA(261102,.DGERR)
Begin DoDot:2
+24 ;transmit all assignment records to rejecting site
+25 IF '$$XMIT^DGPFLMT5(+$GET(DGPFAH("ASSIGN")),$PIECE($GET(DGPFL("SITE")),U))
QUIT
+26 ;update HL7 transmission log status (RE-TRANSMITTED)
+27 DO STOSTAT^DGPFHLL(26.17,DGLIEN,"RT")
End DoDot:2
QUIT
+28 ;
+29 ;retrieve assignment values
+30 IF '$$GETASGN^DGPFAA(+$GET(DGPFAH("ASSIGN")),.DGPFA)
QUIT
+31 ;
+32 SET DGXMTXT=$NAME(^TMP("DGPFERR",$JOB))
+33 KILL @DGXMTXT
+34 ;
+35 ;create message text array
+36 DO BLDMSG(.DGPFA,.DGACK,.DGERR,DGXMTXT)
+37 ;
+38 ;send the notification message
+39 DO SEND(DGXMTXT)
+40 ;
+41 ;cleanup
+42 KILL @DGXMTXT
End DoDot:1
+43 QUIT
+44 ;
BLDMSG(DGPFA,DGACK,DGERR,DGXMTXT) ;build MailMan message array
+1 ;
+2 ; Supported DBIA #2171: The supported DBIA is uses to access Kernel
+3 ; APIs for retrieving Station numbers and names
+4 ; from the INSTITUTION (#4) file.
+5 ; Supported DBIA #2701: The supported DBIA is used to access MPI APIs
+6 ; for retrieving an ICN for a given DFN.
+7 ;
+8 ; Input:
+9 ; DGPFA - assignment data array
+10 ; DGACK - array of ACK data
+11 ; DGERR - array of parsed errors (ex: DGERR(1)=error_code)
+12 ;
+13 ; Output:
+14 ; DGXMTXT - array of MailMan text lines
+15 ;
+16 ;error count
NEW DGCNT
+17 ;error code
NEW DGCOD
+18 ;patient demographics array
NEW DGDEM
+19 ;pointer to PATIENT (#2) file
NEW DGDFN
+20 ;DIALOG array
NEW DGDLG
+21 ;facility data array from XUAF4 call
NEW DGFAC
+22 ;generic counter
NEW DGI
+23 ;integrated control number
NEW DGICN
+24 ;line counter
NEW DGLIN
+25 ;maximum line length
NEW DGMAX
+26 ;results of VASITE call
NEW DGSITE
+27 ;sending station number
NEW DGSNDSTA
+28 ;sending station name
NEW DGSNDNAM
+29 ;error code table array
NEW DGTBL
+30 ;
+31 SET DGDFN=+$GET(DGPFA("DFN"))
+32 IF (DGDFN'>0)
QUIT
+33 ;
+34 ;retrieve patient demographics
+35 IF '$$GETPAT^DGPFUT2(DGDFN,.DGDEM)
QUIT
+36 SET DGICN=$$GETICN^MPIF001(DGDFN)
+37 SET DGICN=$SELECT(+DGICN>0:DGICN,1:$PIECE(DGICN,U,2))
+38 ;
+39 ;load error code table
+40 DO BLDVA086^DGPFHLU3(.DGTBL)
+41 ;
+42 SET DGLIN=0
+43 SET DGMAX=65
+44 SET DGSITE=$$SITE^VASITE()
+45 SET DGSNDSTA=$GET(DGACK("SNDFAC"))
+46 DO F4^XUAF4(DGSNDSTA,.DGFAC,"","")
+47 SET DGSNDNAM=$SELECT(DGFAC>0:$GET(DGFAC("NAME")),1:"")
+48 ;
+49 DO ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
+50 DO ADDLINE("* * * * P R F H L 7 E R R O R E N C O U N T E R E D * * * *",0,DGMAX,.DGLIN,DGXMTXT)
+51 DO ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
+52 DO ADDLINE("A facility could not process the following Patient Record Flag assignment on "_$$FMTE^XLFDT($GET(DGACK("MSGDTM")))_".",0,DGMAX,.DGLIN,DGXMTXT)
+53 DO ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
+54 DO ADDLINE("Message Control ID#: "_$GET(DGACK("MSGID")),4,DGMAX,.DGLIN,DGXMTXT)
+55 DO ADDLINE("Receiving Facility name: "_DGSNDNAM_" ("_DGSNDSTA_")",0,DGMAX,.DGLIN,DGXMTXT)
+56 DO ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
+57 DO ADDLINE("Flag Name: "_$PIECE($GET(DGPFA("FLAG")),U,2),14,DGMAX,.DGLIN,DGXMTXT)
+58 DO ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
+59 DO ADDLINE("Patient Name: "_DGDEM("NAME"),11,DGMAX,.DGLIN,DGXMTXT)
+60 DO ADDLINE("Social Security #: "_DGDEM("SSN"),6,DGMAX,.DGLIN,DGXMTXT)
+61 DO ADDLINE("Date of Birth: "_$$FMTE^XLFDT(DGDEM("DOB"),"2D"),10,DGMAX,.DGLIN,DGXMTXT)
+62 DO ADDLINE("Integrated Control #: "_DGICN,3,DGMAX,.DGLIN,DGXMTXT)
+63 DO ADDLINE("Owning Site: "_$PIECE($GET(DGPFA("OWNER")),U,2)_" ("_$$STA^XUAF4($PIECE($GET(DGPFA("OWNER")),U))_")",12,DGMAX,.DGLIN,DGXMTXT)
+64 DO ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
+65 ;
+66 ;loop through each error
+67 SET DGCNT=0
+68 FOR
SET DGCNT=$ORDER(DGERR(DGCNT))
IF 'DGCNT
QUIT
Begin DoDot:1
+69 KILL DGDLG
+70 SET DGCOD=DGERR(DGCNT)
+71 ;
+72 ;assume numeric error code is a DIALOG
+73 IF DGCOD?1N.N
DO BLD^DIALOG(DGCOD,"","","DGDLG","S")
+74 IF $DATA(DGDLG)
DO FORMAT^DGPFLMT4(.DGDLG,DGMAX-12)
+75 ;
+76 ;if not a DIALOG, then is it a table entry?
+77 IF '$DATA(DGDLG)
IF DGCOD]""
IF $DATA(DGTBL(DGCOD,"DESC"))
SET DGDLG(1)=DGTBL(DGCOD,"DESC")
+78 ;
+79 ;not a DIALOG or table entry - then error is unknown
+80 IF '$DATA(DGDLG)
SET DGDLG(1)="Unknown Error code: '"_DGCOD_"'"
+81 ;
+82 ;error header
+83 DO ADDLINE("Reason#: "_DGCNT,0,DGMAX,.DGLIN,DGXMTXT)
+84 ;
+85 ;loop through error text array
+86 SET DGI=0
+87 FOR
SET DGI=$ORDER(DGDLG(DGI))
IF 'DGI
QUIT
Begin DoDot:2
+88 DO ADDLINE(DGDLG(DGI),12,DGMAX,.DGLIN,DGXMTXT)
End DoDot:2
+89 ;
+90 ;error separator
+91 DO ADDLINE("",0,DGMAX,.DGLIN,DGXMTXT)
End DoDot:1
+92 ;
+93 QUIT
+94 ;
ADDLINE(DGTEXT,DGINDENT,DGMAXLEN,DGCNT,DGXMTXT) ;add text line to message array
+1 ;
+2 ; Input:
+3 ; DGTEXT - text string
+4 ; DGINDENT - number of spaces to insert at start of line
+5 ; DGMAXLEN - maximum desired line length (default: 60)
+6 ; DGCNT - line number passed by reference
+7 ;
+8 ; Output:
+9 ; DGXMTXT - array of text strings
+10 ;
+11 ;available space for text
NEW DGAVAIL
+12 ;truncated text
NEW DGLINE
+13 ;location of space character
NEW DGLOC
+14 ;space indent
NEW DGPAD
+15 ;
+16 SET DGTEXT=$GET(DGTEXT)
+17 SET DGINDENT=+$GET(DGINDENT)
+18 SET DGMAXLEN=+$GET(DGMAXLEN)
+19 IF 'DGMAXLEN
SET DGMAXLEN=60
+20 IF DGINDENT>(DGMAXLEN-1)
SET DGINDENT=0
+21 ;default to 0
SET DGCNT=$GET(DGCNT,0)
+22 ;
+23 SET DGPAD=$$REPEAT^XLFSTR(" ",DGINDENT)
+24 ;
+25 ;determine available space for text
+26 SET DGAVAIL=(DGMAXLEN-DGINDENT)
+27 FOR
Begin DoDot:1
+28 ;
+29 ;find potential line break
+30 SET DGLOC=$LENGTH($EXTRACT(DGTEXT,1,DGAVAIL)," ")
+31 ;
+32 ;break a line that is too long when it has potential line breaks
+33 IF $LENGTH(DGTEXT)>DGAVAIL
IF DGLOC
Begin DoDot:2
+34 SET DGLINE=$PIECE(DGTEXT," ",1,$SELECT(DGLOC>1:DGLOC-1,1:1))
+35 SET DGTEXT=$PIECE(DGTEXT," ",$SELECT(DGLOC>1:DGLOC,1:DGLOC+1),$LENGTH(DGTEXT," "))
End DoDot:2
+36 IF '$TEST
Begin DoDot:2
+37 SET DGLINE=DGTEXT
SET DGTEXT=""
End DoDot:2
+38 ;
+39 SET DGCNT=DGCNT+1
+40 SET @DGXMTXT@(DGCNT)=DGPAD_DGLINE
End DoDot:1
IF ('$LENGTH(DGTEXT))
QUIT
+41 QUIT
+42 ;
SEND(DGXMTXT) ;send the MailMan message
+1 ;
+2 ; Input:
+3 ; DGXMTXT - name of message text array in closed format
+4 ;
+5 ; Output:
+6 ; none
+7 ;
+8 ;protect FM package
NEW DIFROM
+9 ;sender
NEW XMDUZ
+10 ;message subject
NEW XMSUB
+11 ;name of message text array in open format
NEW XMTEXT
+12 ;recipient array
NEW XMY
+13 ;returned message number
NEW XMZ
+14 ;
+15 SET XMDUZ="Patient Record Flag Module"
+16 SET XMSUB="PRF MESSAGE TRANSMISSION ERROR"
+17 SET XMTEXT=$$OREF^DILF(DGXMTXT)
+18 SET XMY("G.DGPF HL7 TRANSMISSION ERRORS")=""
+19 DO ^XMD
+20 QUIT
+21 ;
FNDDIA(DGDIA,DGERR) ;find dialog code
+1 ;This function searches an array for a specific DIALOG (#.84) code.
+2 ;
+3 ; Input: (required)
+4 ; DGDIA - dialog error code
+5 ; DGERR - array of parsed errors (ex: DGERR(1)=error_code)
+6 ;
+7 ; Output:
+8 ; Function value - 1 on success; 0 on failure
+9 ;
+10 ;generic counter
NEW DGI
+11 ;function value
NEW DGRSLT
+12 SET (DGI,DGRSLT)=0
+13 ;
+14 IF +$GET(DGDIA)
IF $DATA(DGERR)
Begin DoDot:1
+15 FOR
SET DGI=$ORDER(DGERR(DGI))
IF 'DGI
QUIT
Begin DoDot:2
+16 IF $GET(DGERR(DGI))=DGDIA
SET DGRSLT=1
End DoDot:2
IF DGRSLT
QUIT
End DoDot:1
+17 ;
+18 QUIT DGRSLT