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