| 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
 | 
|---|