| [613] | 1 | SCDXMSG0 ;ALB/JRP - AMB CARE MESSAGE BUILDER;07-MAY-1996 ; 23 Oct 98  1:47 PM
 | 
|---|
 | 2 |  ;;5.3;Scheduling;**44,59,66,162,387**;AUG 13, 1993
 | 
|---|
 | 3 |  ;
 | 
|---|
 | 4 | BUILDHL7(XMITPTR,HL,MID,XMITARRY,INSRTPNT,VALERR) ;Build an HL7 message for an
 | 
|---|
 | 5 |  ; entry in the TRANSMITTED OUTPATIENT ENCOUNTER file (#409.73)
 | 
|---|
 | 6 |  ;
 | 
|---|
 | 7 |  ;Input  : XMITPTR - Pointer to entry in TRANSMITTED OUTPATIENT
 | 
|---|
 | 8 |  ;                   ENCOUNTER file (#409.73)
 | 
|---|
 | 9 |  ;         HL - Array containing HL7 variables - pass by reference
 | 
|---|
 | 10 |  ;              This is the output of the call to INIT^HLFNC2()
 | 
|---|
 | 11 |  ;         MID - Message Control ID to use in the MSH segment
 | 
|---|
 | 12 |  ;         XMITARRY - Array to store HL7 message in (full global ref)
 | 
|---|
 | 13 |  ;                    (Defaults to ^TMP("HLS",$J))
 | 
|---|
 | 14 |  ;         INSRTPNT - Line to begin inserting message text at
 | 
|---|
 | 15 |  ;                    (Defaults to 1)
 | 
|---|
 | 16 |  ;Output : LINES - Number of lines in message (success)
 | 
|---|
 | 17 |  ;           XMITARRY(N) = Line N of HL7 message
 | 
|---|
 | 18 |  ;           XMITARRY(N,M) = Continuation number M of line N
 | 
|---|
 | 19 |  ;         -1^Error - Unable to build message / bad input
 | 
|---|
 | 20 |  ;Notes  : It is the responsibility of the calling program to
 | 
|---|
 | 21 |  ;         initialize (i.e. KILL) XMITARRY
 | 
|---|
 | 22 |  ;       : The MSH segment will not be built if MID is not passed
 | 
|---|
 | 23 |  ;       : When retransmitting, an EDIT event will be used if the
 | 
|---|
 | 24 |  ;         OUTPATIENT ENCOUNTER field (#.02) has a value and a
 | 
|---|
 | 25 |  ;         DELETE event will be used if the DELETED OUTPATIENT
 | 
|---|
 | 26 |  ;         ENCOUNTER field (#.03) has a value
 | 
|---|
 | 27 |  ;
 | 
|---|
 | 28 |  ;Check input
 | 
|---|
 | 29 |  S XMITPTR=+$G(XMITPTR)
 | 
|---|
 | 30 |  Q:('$D(^SD(409.73,XMITPTR,0))) "-1^Did not pass valid pointer to Transmitted Outpatient Encounter file"
 | 
|---|
 | 31 |  Q:($O(HL(""))="") "-1^Did not pass variables required to interact with the HL7 package"
 | 
|---|
 | 32 |  S MID=$G(MID)
 | 
|---|
 | 33 |  S XMITARRY=$G(XMITARRY)
 | 
|---|
 | 34 |  S:(XMITARRY="") XMITARRY="^TMP(""HLS"","_$J_")"
 | 
|---|
 | 35 |  S INSRTPNT=$G(INSRTPNT)
 | 
|---|
 | 36 |  S:(INSRTPNT="") INSRTPNT=1
 | 
|---|
 | 37 |  ;Declare variables
 | 
|---|
 | 38 |  N ENCDT,NODE,DFN,XMITEVNT,ENCPTR,DELPTR,LINESADD,LINETAG,EVNTDATE
 | 
|---|
 | 39 |  N CURLINE,EVNTHL7,VAFARRY,ORIGMTN,ORIGETN,RESULT
 | 
|---|
 | 40 |  N ERROR,VERROR,SEGMENTS,SEGORDR,SEGNAME,XMITDATE,VAFSTR,ENCNDT
 | 
|---|
 | 41 |  ;Get zero node of Transmitted Outpatient Encounter
 | 
|---|
 | 42 |  S NODE=$G(^SD(409.73,XMITPTR,0))
 | 
|---|
 | 43 |  ;Get pointer to Outpatient Encounter file
 | 
|---|
 | 44 |  S ENCPTR=+$P(NODE,"^",2)
 | 
|---|
 | 45 |  ;Get pointer to Deleted Outpatient Encounter file
 | 
|---|
 | 46 |  S DELPTR=+$P(NODE,"^",3)
 | 
|---|
 | 47 |  ;Pointer to either type of encounter not found - done
 | 
|---|
 | 48 |  Q:(('ENCPTR)&('DELPTR)) "-1^Entry in Transmitted Outpatient Encounter file does not reference an encounter"
 | 
|---|
 | 49 |  ;Get transmission event
 | 
|---|
 | 50 |  S XMITEVNT=+$P(NODE,"^",5)
 | 
|---|
 | 51 |  ;Retransmitting - use EDIT event for Outpatient Encounters and
 | 
|---|
 | 52 |  ; DELETE event for Deleted Outpatient Encounter
 | 
|---|
 | 53 |  S:('XMITEVNT) XMITEVNT=$S(ENCPTR:2,1:3)
 | 
|---|
 | 54 |  ;Convert event type to HL7 event
 | 
|---|
 | 55 |  ; Using A08 for ADD & EDIT and A23 for DELETE
 | 
|---|
 | 56 |  S EVNTHL7="A23"
 | 
|---|
 | 57 |  S:(XMITEVNT'=3) EVNTHL7="A08"
 | 
|---|
 | 58 |  ;Get event date/time
 | 
|---|
 | 59 |  S EVNTDATE=+$P(NODE,"^",6)
 | 
|---|
 | 60 |  ;Determine patient and encounter date/time
 | 
|---|
 | 61 |  S DFN=0
 | 
|---|
 | 62 |  S (ENCDT,ENCNDT)=0
 | 
|---|
 | 63 |  ;Get data from Outpatient Encounter
 | 
|---|
 | 64 |  I (ENCPTR) D
 | 
|---|
 | 65 |  .S NODE=$G(^SCE(ENCPTR,0))
 | 
|---|
 | 66 |  .S DFN=+$P(NODE,"^",2)
 | 
|---|
 | 67 |  .S ENCDT=+$P($P(NODE,"^"),".")
 | 
|---|
 | 68 |  .S ENCNDT=+$P(NODE,"^")
 | 
|---|
 | 69 |  ;Get data from Deleted Outpatient Encounter
 | 
|---|
 | 70 |  I (DELPTR) D
 | 
|---|
 | 71 |  .S NODE=$G(^SD(409.74,DELPTR,1))
 | 
|---|
 | 72 |  .S DFN=+$P(NODE,"^",2)
 | 
|---|
 | 73 |  .S ENCDT=+$P($P(NODE,"^"),".")
 | 
|---|
 | 74 |  .S ENCNDT=+$P(NODE,"^")
 | 
|---|
 | 75 |  ;Unable to determine patient - done
 | 
|---|
 | 76 |  Q:('DFN) "-1^"_$S(DELPTR:"Deleted ",1:"")_"Outpatient Encounter did not refer to a patient"
 | 
|---|
 | 77 |  ;Couldn't determine encounter date/time - use today
 | 
|---|
 | 78 |  S:('$G(ENCDT)) ENCDT=DT
 | 
|---|
 | 79 |  ;Build MSH segment if MID was passed
 | 
|---|
 | 80 |  S LINESADD=0
 | 
|---|
 | 81 |  S CURLINE=INSRTPNT
 | 
|---|
 | 82 |  S ERROR=0
 | 
|---|
 | 83 |  I (MID'="") D
 | 
|---|
 | 84 |  .;Remember original message & event types (only applicable to batch)
 | 
|---|
 | 85 |  .S ORIGMTN=HL("MTN")
 | 
|---|
 | 86 |  .S ORIGETN=HL("ETN")
 | 
|---|
 | 87 |  .;Put in message & event types for actual message
 | 
|---|
 | 88 |  .S HL("MTN")="ADT"
 | 
|---|
 | 89 |  .S HL("ETN")=EVNTHL7
 | 
|---|
 | 90 |  .;Build MSH segment
 | 
|---|
 | 91 |  .K RESULT D MSH^HLFNC2(.HL,MID,.RESULT)
 | 
|---|
 | 92 |  .;Reset message & event types to original values
 | 
|---|
 | 93 |  .S HL("MTN")=ORIGMTN
 | 
|---|
 | 94 |  .S HL("ETN")=ORIGETN
 | 
|---|
 | 95 |  .;Error
 | 
|---|
 | 96 |  .I (RESULT="") S ERROR="-1^Unable to create MSH segment" Q
 | 
|---|
 | 97 |  .;Copy MSH segment into HL7 message
 | 
|---|
 | 98 |  .S @XMITARRY@(CURLINE)=RESULT
 | 
|---|
 | 99 |  .;Increment number of lines added
 | 
|---|
 | 100 |  .S LINESADD=LINESADD+1
 | 
|---|
 | 101 |  .;Check for continuation node
 | 
|---|
 | 102 |  .I ($D(RESULT(1))) D
 | 
|---|
 | 103 |  ..;Copy continuation into HL7 message
 | 
|---|
 | 104 |  ..S @XMITARRY@(CURLINE,1)=RESULT(1)
 | 
|---|
 | 105 |  ..;Increment number of lines added
 | 
|---|
 | 106 |  ..S LINESADD=LINESADD+1
 | 
|---|
 | 107 |  .;Increment current line number
 | 
|---|
 | 108 |  .S CURLINE=CURLINE+1
 | 
|---|
 | 109 |  ;Error building MSH segment - done
 | 
|---|
 | 110 |  Q:(ERROR) ERROR
 | 
|---|
 | 111 |  ;Get list of segments
 | 
|---|
 | 112 |  D SEGMENTS^SCDXMSG1(EVNTHL7,"SEGMENTS")
 | 
|---|
 | 113 |  ;Loop through list of segments
 | 
|---|
 | 114 |  S (VERROR,ERROR)=0
 | 
|---|
 | 115 |  S SEGORDR=0
 | 
|---|
 | 116 |  F  S SEGORDR=+$O(SEGMENTS(SEGORDR)) Q:('SEGORDR)  D  Q:(ERROR)
 | 
|---|
 | 117 |  .S SEGNAME=""
 | 
|---|
 | 118 |  .F  S SEGNAME=$O(SEGMENTS(SEGORDR,SEGNAME)) Q:(SEGNAME="")  D  Q:(ERROR)
 | 
|---|
 | 119 |  ..;Build segment
 | 
|---|
 | 120 |  ..S VAFSTR=SEGMENTS(SEGORDR,SEGNAME)
 | 
|---|
 | 121 |  ..S VAFARRY="^TMP(""SCDX-XMIT-BLD"","_$J_","""_SEGNAME_""")"
 | 
|---|
 | 122 |  ..S LINETAG="BLD"_SEGNAME S ERROR=0 D @LINETAG^SCDXMSG1
 | 
|---|
 | 123 |  ..;Error - delete segment & quit
 | 
|---|
 | 124 |  ..I (ERROR) S LINETAG="DEL"_SEGNAME D @LINETAG^SCDXMSG1 Q
 | 
|---|
 | 125 |  ..;Validate segment, if appropriate
 | 
|---|
 | 126 |  ..S LINETAG="VLD"_SEGNAME S ERROR=0 D:$$VSEG() @LINETAG^SCDXMSG1
 | 
|---|
 | 127 |  ..I ERROR S VERROR=ERROR
 | 
|---|
 | 128 |  ..;Copy segment into HL7 message
 | 
|---|
 | 129 |  ..I 'ERROR S LINETAG="CPY"_SEGNAME D @LINETAG^SCDXMSG1
 | 
|---|
 | 130 |  ..S ERROR=0
 | 
|---|
 | 131 |  ..;Delete segment
 | 
|---|
 | 132 |  ..S LINETAG="DEL"_SEGNAME D @LINETAG^SCDXMSG1
 | 
|---|
 | 133 |  ..;Increment current line number
 | 
|---|
 | 134 |  ..S CURLINE=CURLINE+1
 | 
|---|
 | 135 |  ;Error building segment - remove segments already put into HL7
 | 
|---|
 | 136 |  ; message & quit
 | 
|---|
 | 137 |  I (ERROR)!(VERROR) D UNWIND^SCDXMSG1(XMITARRY,INSRTPNT) Q $S(ERROR:ERROR,1:VERROR)
 | 
|---|
 | 138 |  ;Done
 | 
|---|
 | 139 |  Q LINESADD
 | 
|---|
 | 140 |  ;
 | 
|---|
 | 141 | VSEG() ;Determine if segment should be validated
 | 
|---|
 | 142 |  ;All segments for 'add' or 'edit' transactions
 | 
|---|
 | 143 |  ;Only PID and PV1 segments for 'delete' transactions
 | 
|---|
 | 144 |  I EVNTHL7="A08" Q 1
 | 
|---|
 | 145 |  I EVNTHL7="A23","PID^PV1"[SEGNAME Q 1
 | 
|---|
 | 146 |  Q 0
 | 
|---|