SCDXMSG ;ALB/JRP - AMB CARE TRANSMISSION BUILDER;06-MAY-1996 ; 12/20/01 4:46pm
;;5.3;Scheduling;**44,56,70,77,85,96,121,128,66,247,245,387,466,1015**;AUG 13, 1993;Build 21
;
SNDZ00 ;Main entry point for the sending of ADT-Z00 batch messages to
; the National Patient Care Database
;
;Input : None
;Output : None
;
SD70 ; added w/ patch SD*5.3*70 to reset transmit flags if needed
N SDEND,SDSTA D EN^SCDXUTL5
;
;Declare variables
N X,X1,X2,%H
N XMITPTR,NOACKBY,XMITDATE,SCDXEVNT,MAXBATCH,MAXLINE,BATCHCNT,MSGNUM
N LINECNT,MSHLINE,XMITLIST,XMITERR,HL7XMIT,ERROR,IPCNT
N HLEID,HL,HLECH,HLFS,HLQ,HLMID,HLMTIEN,HLDT,HLDT1,MSGID,HLRESLT,HLP
;Set message count limit for batch message
S MAXBATCH=100
;Set line count limit for batch message Note max 160K char. MM Message
S MAXLINE=$P($G(^SD(404.91,1,"AMB")),U,8) S:'MAXLINE MAXLINE=2000
;Initialize global locations
S XMITERR="^TMP(""SCDX-XMIT-BLD"","_$J_",""ERRORS"")"
S HL7XMIT="^TMP(""HLS"","_$J_")"
K @XMITERR,@HL7XMIT
;Get lag time for acks from NPCDB (default to T-LAG)
S NOACKBY=+$P($G(^SD(404.91,1,"AMB")),"^",4)
S:('NOACKBY) NOACKBY=2
;Determine T-LAG @ 11:59:59 PM
S X1=$$DT^XLFDT()
S X2=0-NOACKBY
S NOACKBY=$$FMADD^XLFDT(X1,X2)_".235959"
;Flag transmissions that haven't been acked by T-LAG for retransmission
S XMITDATE=""
F S XMITDATE=+$O(^SD(409.73,"AACNOACK",XMITDATE)) Q:(('XMITDATE)!(XMITDATE>NOACKBY)) D
.S XMITPTR=""
.F S XMITPTR=+$O(^SD(409.73,"AACNOACK",XMITDATE,XMITPTR)) Q:('XMITPTR) D
..;Mark entry with retransmit event (POSTMASTER is causer of event)
..D STREEVNT^SCDXFU01(XMITPTR,0,"",.5)
..;Can no longer receive database credit - delete x-ref and quit
..I +$$XMIT4DBC^SCDXFU04(XMITPTR)>3 K ^SD(409.73,"AACNOACK",XMITDATE,XMITPTR) Q ;SD*5.3*247
..;Turn transmission flag on
..D XMITFLAG^SCDXFU01(XMITPTR)
;Get pointer to sending event
S HLEID=+$O(^ORD(101,"B","SCDX AMBCARE SEND SERVER FOR ADT-Z00",0))
;Sending event not found - send error bulletin - done
I ('HLEID) D ERRBULL^SCDXMSG2("Unable to initialize HL7 variables - protocol not found") Q
;Initialze HL7 variables
D INIT^HLFNC2(HLEID,.HL)
;Unable to initialize HL7 variables - send error bulletin - done
I ($O(HL(""))="") D ERRBULL^SCDXMSG2($P(HL,"^",2)) Q
;Create batch message
D CREATE^HLTF(.HLMID,.HLMTIEN,.HLDT,.HLDT1)
;Unable to create batch message - send error bulletin - done
I ('HLMTIEN) D ERRBULL^SCDXMSG2("Unable to create batch HL7 message") Q
;Initialize message count
S BATCHCNT=0,IPCNT=0
;Initialize message number
S MSGNUM=1
;Initialize line count
S LINECNT=1
N VALER,VALERR
;this global contains the validation errors if any.
S VALER="^TMP(""SCDXVALID"",$J)"
;Loop through list of [deleted] encounters requiring transmission
S SCDXEVNT=""
F S SCDXEVNT=+$O(^SD(409.73,"AACXMIT",SCDXEVNT)) Q:('SCDXEVNT) D
.S XMITPTR=""
.F S XMITPTR=+$O(^SD(409.73,"AACXMIT",SCDXEVNT,XMITPTR)) Q:('XMITPTR) D
..N OENODE,PARENT,FILERR
..S VALERR="^TMP(""SCDXVALID"",$J,"_XMITPTR_")"
..;Bad entry in cross reference - delete cross reference and quit
..I ('$D(^SD(409.73,XMITPTR))) K ^SD(409.73,"AACXMIT",SCDXEVNT,XMITPTR) Q
..;Make sure entry points to an existing encounter - delete entry
..; and quit if it doesn't
..S X=^SD(409.73,XMITPTR,0)
..S X1=+$P(X,"^",2)
..S X2=+$P(X,"^",3)
..S OENODE=$S($G(^SCE(+X1,0)):^(0),1:$G(^SD(409.74,+X2,1))),PARENT=$P(OENODE,"^",6)
..I (((X1)&('$D(^SCE(X1))))!((X2)&('$D(^SD(409.74,X2))))) S ERROR=$$DELXMIT^SCDXFU03(XMITPTR) Q
..; if SD*5.3*70 cleanup not complete, recheck date of encounter for range
..I $G(SDEND) Q:$$CHKD(X1,X2)
..;If inpatient appointment, delete entry and quit
..;Commented to allow transmission of inpatient to NPCD; SD*5.3*387
..;I ($$INPATENC^SCDXUTL(XMITPTR)) S ERROR=$$DELXMIT^SCDXFU03(XMITPTR) Q
..;If test patient, delete entry and quit
..I $$TESTPAT^VADPT($P($$EZN4XMIT^SCDXFU11(XMITPTR),"^",2)) S ERROR=$$DELXMIT^SCDXFU03(XMITPTR) Q
..;If child encounter, delete entry, flag parent for xmit, and quit
..I PARENT D Q
...S ERROR=$$DELXMIT^SCDXFU03(XMITPTR)
..;NPCD will not accept for database credit - clean up and quit
..I +$$XMIT4DBC^SCDXFU04(XMITPTR)>3 D Q ;SD*5.3*247
...;Past database close-out date - delete previously reported errors
...D DELAERR^SCDXFU02(XMITPTR)
...;Turn off transmission flag
...D XMITFLAG^SCDXFU01(XMITPTR,1)
..;Calculate message control ID
..S MSGID=HLMID_"-"_MSGNUM
..;Put [deleted] encounter into transmission
..S ERROR=$$BUILDHL7^SCDXMSG0(XMITPTR,.HL,MSGID,HL7XMIT,LINECNT,VALERR)
..;[Deleted] encounter not added to transmission
..I ERROR<0,$O(@VALERR@(0))']"" D VALIDATE^SCMSVUT0("INTERNAL","","V900",VALERR,0)
..D DELAERR^SCDXFU02(XMITPTR,0)
..I $O(@VALERR@(0))]"" S FILERR=$$FILEVERR^SCMSVUT2(XMITPTR,VALERR)
..I ERROR<0 Q
..;Increment line count
..S LINECNT=LINECNT+ERROR
..;Increment message count
..S BATCHCNT=BATCHCNT+1
..;Increment message number
..S MSGNUM=MSGNUM+1
..;Increment inpatient count
..I $$INPATENC^SCDXUTL(XMITPTR) S IPCNT=IPCNT+1
..;Create entry in ACRP Transmission History file (#409.77)
..S X=$$CRTHIST^SCDXFU10(XMITPTR,HLDT,MSGID,HLMID)
..;Update transmission info for [deleted] encounter
..D XMITDATA^SCDXFU03(XMITPTR,HLDT,MSGID,HLMID)
..;Turn off transmission flag for [deleted] encounter
..D XMITFLAG^SCDXFU01(XMITPTR,1)
..;Delete all errors previously reported for [deleted] encounter
..D DELAERR^SCDXFU02(XMITPTR)
..;Reached max size for batch
..I ((MSGNUM>MAXBATCH)!(LINECNT>MAXLINE)) D
...;Send batch message - immediate priority
...S HLP("PRIORITY")="I"
...D GENERATE^HLMA(HLEID,"GB",1,.HLRESLT,HLMTIEN,.HLP)
...;Re-initialize HL7 message
...K @HL7XMIT
...;Re-initialize HL7 variables
...K HL,HLRESLT,HLP,HLMID,HLMTIEN,HLDT,HLDT1
...S HLEID=+$O(^ORD(101,"B","SCDX AMBCARE SEND SERVER FOR ADT-Z00",0))
...D INIT^HLFNC2(HLEID,.HL)
...;Create new batch message
...D CREATE^HLTF(.HLMID,.HLMTIEN,.HLDT,.HLDT1)
...;Re-initialize line count
...S LINECNT=1
...;Re-initialize message number
...S MSGNUM=1
;Check for unsent batch message
I ($O(@HL7XMIT@(0))) D
.;Send batch message - immediate priority
.S HLP("PRIORITY")="I"
.D GENERATE^HLMA(HLEID,"GB",1,.HLRESLT,HLMTIEN,.HLP)
N ERRCNT,IPERR
S ERRCNT=$$COUNT^SCMSVUT2(VALER)
S IPERR=$$IPERR^SCMSVUT2(VALER)
;Send completion bulletin
D CMPLBULL^SCDXMSG2(BATCHCNT,ERRCNT,IPCNT,IPERR)
;Clean up global arrays used
K @XMITERR,@HL7XMIT,@VALER
;Determine if updating of Hospital Location file hasn't completed AND
; if today is past the OPC to HL7 cut over date
I ('$P($G(^SD(404.91,1,"AMB")),"^",7)) I ($$DATE^SCDXUTL(DT)) D
.;Task updating of Hospital Location file
.N ZTRTN,ZTDESC,ZTDTH,ZTIO,ZTSK
.S ZTRTN="HOPUP^SCMSP"
.S ZTDESC="REQUIRE PROVIDER AND DIAGNOSIS FOR CHECKOUT FROM CLINICS"
.S ZTDTH="NOW"
.S ZTIO=""
.D ^%ZTLOAD
;Done
Q
;
CHKD(X1,X2) ; if clean-up still in progress for SD*5.3*70, check date
N SDELE
I X1,+$G(^SCE(X1,0))>SDEND Q 1
I X2 S SDELE=+$G(^SD(409.74,X2,1)) I SDELE>SDSTA D:SDELE<SDEND Q 1
. D KILL^SCDXUTL5("^SD(409.74,",X2)
. D KILL^SCDXUTL5("^SD(409.73,",XMITPTR)
Q 0
SCDXMSG ;ALB/JRP - AMB CARE TRANSMISSION BUILDER;06-MAY-1996 ; 12/20/01 4:46pm
+1 ;;5.3;Scheduling;**44,56,70,77,85,96,121,128,66,247,245,387,466,1015**;AUG 13, 1993;Build 21
+2 ;
SNDZ00 ;Main entry point for the sending of ADT-Z00 batch messages to
+1 ; the National Patient Care Database
+2 ;
+3 ;Input : None
+4 ;Output : None
+5 ;
SD70 ; added w/ patch SD*5.3*70 to reset transmit flags if needed
+1 NEW SDEND,SDSTA
DO EN^SCDXUTL5
+2 ;
+3 ;Declare variables
+4 NEW X,X1,X2,%H
+5 NEW XMITPTR,NOACKBY,XMITDATE,SCDXEVNT,MAXBATCH,MAXLINE,BATCHCNT,MSGNUM
+6 NEW LINECNT,MSHLINE,XMITLIST,XMITERR,HL7XMIT,ERROR,IPCNT
+7 NEW HLEID,HL,HLECH,HLFS,HLQ,HLMID,HLMTIEN,HLDT,HLDT1,MSGID,HLRESLT,HLP
+8 ;Set message count limit for batch message
+9 SET MAXBATCH=100
+10 ;Set line count limit for batch message Note max 160K char. MM Message
+11 SET MAXLINE=$PIECE($GET(^SD(404.91,1,"AMB")),U,8)
IF 'MAXLINE
SET MAXLINE=2000
+12 ;Initialize global locations
+13 SET XMITERR="^TMP(""SCDX-XMIT-BLD"","_$JOB_",""ERRORS"")"
+14 SET HL7XMIT="^TMP(""HLS"","_$JOB_")"
+15 KILL @XMITERR,@HL7XMIT
+16 ;Get lag time for acks from NPCDB (default to T-LAG)
+17 SET NOACKBY=+$PIECE($GET(^SD(404.91,1,"AMB")),"^",4)
+18 IF ('NOACKBY)
SET NOACKBY=2
+19 ;Determine T-LAG @ 11:59:59 PM
+20 SET X1=$$DT^XLFDT()
+21 SET X2=0-NOACKBY
+22 SET NOACKBY=$$FMADD^XLFDT(X1,X2)_".235959"
+23 ;Flag transmissions that haven't been acked by T-LAG for retransmission
+24 SET XMITDATE=""
+25 FOR
SET XMITDATE=+$ORDER(^SD(409.73,"AACNOACK",XMITDATE))
IF (('XMITDATE)!(XMITDATE>NOACKBY))
QUIT
Begin DoDot:1
+26 SET XMITPTR=""
+27 FOR
SET XMITPTR=+$ORDER(^SD(409.73,"AACNOACK",XMITDATE,XMITPTR))
IF ('XMITPTR)
QUIT
Begin DoDot:2
+28 ;Mark entry with retransmit event (POSTMASTER is causer of event)
+29 DO STREEVNT^SCDXFU01(XMITPTR,0,"",.5)
+30 ;Can no longer receive database credit - delete x-ref and quit
+31 ;SD*5.3*247
IF +$$XMIT4DBC^SCDXFU04(XMITPTR)>3
KILL ^SD(409.73,"AACNOACK",XMITDATE,XMITPTR)
QUIT
+32 ;Turn transmission flag on
+33 DO XMITFLAG^SCDXFU01(XMITPTR)
End DoDot:2
End DoDot:1
+34 ;Get pointer to sending event
+35 SET HLEID=+$ORDER(^ORD(101,"B","SCDX AMBCARE SEND SERVER FOR ADT-Z00",0))
+36 ;Sending event not found - send error bulletin - done
+37 IF ('HLEID)
DO ERRBULL^SCDXMSG2("Unable to initialize HL7 variables - protocol not found")
QUIT
+38 ;Initialze HL7 variables
+39 DO INIT^HLFNC2(HLEID,.HL)
+40 ;Unable to initialize HL7 variables - send error bulletin - done
+41 IF ($ORDER(HL(""))="")
DO ERRBULL^SCDXMSG2($PIECE(HL,"^",2))
QUIT
+42 ;Create batch message
+43 DO CREATE^HLTF(.HLMID,.HLMTIEN,.HLDT,.HLDT1)
+44 ;Unable to create batch message - send error bulletin - done
+45 IF ('HLMTIEN)
DO ERRBULL^SCDXMSG2("Unable to create batch HL7 message")
QUIT
+46 ;Initialize message count
+47 SET BATCHCNT=0
SET IPCNT=0
+48 ;Initialize message number
+49 SET MSGNUM=1
+50 ;Initialize line count
+51 SET LINECNT=1
+52 NEW VALER,VALERR
+53 ;this global contains the validation errors if any.
+54 SET VALER="^TMP(""SCDXVALID"",$J)"
+55 ;Loop through list of [deleted] encounters requiring transmission
+56 SET SCDXEVNT=""
+57 FOR
SET SCDXEVNT=+$ORDER(^SD(409.73,"AACXMIT",SCDXEVNT))
IF ('SCDXEVNT)
QUIT
Begin DoDot:1
+58 SET XMITPTR=""
+59 FOR
SET XMITPTR=+$ORDER(^SD(409.73,"AACXMIT",SCDXEVNT,XMITPTR))
IF ('XMITPTR)
QUIT
Begin DoDot:2
+60 NEW OENODE,PARENT,FILERR
+61 SET VALERR="^TMP(""SCDXVALID"",$J,"_XMITPTR_")"
+62 ;Bad entry in cross reference - delete cross reference and quit
+63 IF ('$DATA(^SD(409.73,XMITPTR)))
KILL ^SD(409.73,"AACXMIT",SCDXEVNT,XMITPTR)
QUIT
+64 ;Make sure entry points to an existing encounter - delete entry
+65 ; and quit if it doesn't
+66 SET X=^SD(409.73,XMITPTR,0)
+67 SET X1=+$PIECE(X,"^",2)
+68 SET X2=+$PIECE(X,"^",3)
+69 SET OENODE=$SELECT($GET(^SCE(+X1,0)):^(0),1:$GET(^SD(409.74,+X2,1)))
SET PARENT=$PIECE(OENODE,"^",6)
+70 IF (((X1)&('$DATA(^SCE(X1))))!((X2)&('$DATA(^SD(409.74,X2)))))
SET ERROR=$$DELXMIT^SCDXFU03(XMITPTR)
QUIT
+71 ; if SD*5.3*70 cleanup not complete, recheck date of encounter for range
+72 IF $GET(SDEND)
IF $$CHKD(X1,X2)
QUIT
+73 ;If inpatient appointment, delete entry and quit
+74 ;Commented to allow transmission of inpatient to NPCD; SD*5.3*387
+75 ;I ($$INPATENC^SCDXUTL(XMITPTR)) S ERROR=$$DELXMIT^SCDXFU03(XMITPTR) Q
+76 ;If test patient, delete entry and quit
+77 IF $$TESTPAT^VADPT($PIECE($$EZN4XMIT^SCDXFU11(XMITPTR),"^",2))
SET ERROR=$$DELXMIT^SCDXFU03(XMITPTR)
QUIT
+78 ;If child encounter, delete entry, flag parent for xmit, and quit
+79 IF PARENT
Begin DoDot:3
+80 SET ERROR=$$DELXMIT^SCDXFU03(XMITPTR)
End DoDot:3
QUIT
+81 ;NPCD will not accept for database credit - clean up and quit
+82 ;SD*5.3*247
IF +$$XMIT4DBC^SCDXFU04(XMITPTR)>3
Begin DoDot:3
+83 ;Past database close-out date - delete previously reported errors
+84 DO DELAERR^SCDXFU02(XMITPTR)
+85 ;Turn off transmission flag
+86 DO XMITFLAG^SCDXFU01(XMITPTR,1)
End DoDot:3
QUIT
+87 ;Calculate message control ID
+88 SET MSGID=HLMID_"-"_MSGNUM
+89 ;Put [deleted] encounter into transmission
+90 SET ERROR=$$BUILDHL7^SCDXMSG0(XMITPTR,.HL,MSGID,HL7XMIT,LINECNT,VALERR)
+91 ;[Deleted] encounter not added to transmission
+92 IF ERROR<0
IF $ORDER(@VALERR@(0))']""
DO VALIDATE^SCMSVUT0("INTERNAL","","V900",VALERR,0)
+93 DO DELAERR^SCDXFU02(XMITPTR,0)
+94 IF $ORDER(@VALERR@(0))]""
SET FILERR=$$FILEVERR^SCMSVUT2(XMITPTR,VALERR)
+95 IF ERROR<0
QUIT
+96 ;Increment line count
+97 SET LINECNT=LINECNT+ERROR
+98 ;Increment message count
+99 SET BATCHCNT=BATCHCNT+1
+100 ;Increment message number
+101 SET MSGNUM=MSGNUM+1
+102 ;Increment inpatient count
+103 IF $$INPATENC^SCDXUTL(XMITPTR)
SET IPCNT=IPCNT+1
+104 ;Create entry in ACRP Transmission History file (#409.77)
+105 SET X=$$CRTHIST^SCDXFU10(XMITPTR,HLDT,MSGID,HLMID)
+106 ;Update transmission info for [deleted] encounter
+107 DO XMITDATA^SCDXFU03(XMITPTR,HLDT,MSGID,HLMID)
+108 ;Turn off transmission flag for [deleted] encounter
+109 DO XMITFLAG^SCDXFU01(XMITPTR,1)
+110 ;Delete all errors previously reported for [deleted] encounter
+111 DO DELAERR^SCDXFU02(XMITPTR)
+112 ;Reached max size for batch
+113 IF ((MSGNUM>MAXBATCH)!(LINECNT>MAXLINE))
Begin DoDot:3
+114 ;Send batch message - immediate priority
+115 SET HLP("PRIORITY")="I"
+116 DO GENERATE^HLMA(HLEID,"GB",1,.HLRESLT,HLMTIEN,.HLP)
+117 ;Re-initialize HL7 message
+118 KILL @HL7XMIT
+119 ;Re-initialize HL7 variables
+120 KILL HL,HLRESLT,HLP,HLMID,HLMTIEN,HLDT,HLDT1
+121 SET HLEID=+$ORDER(^ORD(101,"B","SCDX AMBCARE SEND SERVER FOR ADT-Z00",0))
+122 DO INIT^HLFNC2(HLEID,.HL)
+123 ;Create new batch message
+124 DO CREATE^HLTF(.HLMID,.HLMTIEN,.HLDT,.HLDT1)
+125 ;Re-initialize line count
+126 SET LINECNT=1
+127 ;Re-initialize message number
+128 SET MSGNUM=1
End DoDot:3
End DoDot:2
End DoDot:1
+129 ;Check for unsent batch message
+130 IF ($ORDER(@HL7XMIT@(0)))
Begin DoDot:1
+131 ;Send batch message - immediate priority
+132 SET HLP("PRIORITY")="I"
+133 DO GENERATE^HLMA(HLEID,"GB",1,.HLRESLT,HLMTIEN,.HLP)
End DoDot:1
+134 NEW ERRCNT,IPERR
+135 SET ERRCNT=$$COUNT^SCMSVUT2(VALER)
+136 SET IPERR=$$IPERR^SCMSVUT2(VALER)
+137 ;Send completion bulletin
+138 DO CMPLBULL^SCDXMSG2(BATCHCNT,ERRCNT,IPCNT,IPERR)
+139 ;Clean up global arrays used
+140 KILL @XMITERR,@HL7XMIT,@VALER
+141 ;Determine if updating of Hospital Location file hasn't completed AND
+142 ; if today is past the OPC to HL7 cut over date
+143 IF ('$PIECE($GET(^SD(404.91,1,"AMB")),"^",7))
IF ($$DATE^SCDXUTL(DT))
Begin DoDot:1
+144 ;Task updating of Hospital Location file
+145 NEW ZTRTN,ZTDESC,ZTDTH,ZTIO,ZTSK
+146 SET ZTRTN="HOPUP^SCMSP"
+147 SET ZTDESC="REQUIRE PROVIDER AND DIAGNOSIS FOR CHECKOUT FROM CLINICS"
+148 SET ZTDTH="NOW"
+149 SET ZTIO=""
+150 DO ^%ZTLOAD
End DoDot:1
+151 ;Done
+152 QUIT
+153 ;
CHKD(X1,X2) ; if clean-up still in progress for SD*5.3*70, check date
+1 NEW SDELE
+2 IF X1
IF +$GET(^SCE(X1,0))>SDEND
QUIT 1
+3 IF X2
SET SDELE=+$GET(^SD(409.74,X2,1))
IF SDELE>SDSTA
IF SDELE<SDEND
Begin DoDot:1
+4 DO KILL^SCDXUTL5("^SD(409.74,",X2)
+5 DO KILL^SCDXUTL5("^SD(409.73,",XMITPTR)
End DoDot:1
QUIT 1
+6 QUIT 0