| 1 | HLOAPI2 ;ALB/CJM-HL7 - Developer API's for sending application acks ;12/11/2006
 | 
|---|
| 2 |  ;;1.6;HEALTH LEVEL SEVEN;**126,131,133,134**;Oct 13, 1995;Build 30
 | 
|---|
| 3 |  ;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | ACK(HLMSTATE,PARMS,ACK,ERROR) ;Default behavior is to return a general
 | 
|---|
| 6 |  ;application ack. The application may optionally specify the message
 | 
|---|
| 7 |  ;type and event or call $$ADDSEG^HLOAPI to add segments.
 | 
|---|
| 8 |  ;A generic MSA segment (components 1-3) is added automatically IF the
 | 
|---|
| 9 |  ;application doesn't call $$ADDSEG^HLOAPI to add an MSA segment as the
 | 
|---|
| 10 |  ;FIRST segment following the header.
 | 
|---|
| 11 |  ;$$SENDACK must be called when the ack is completed. The return
 | 
|---|
| 12 |  ;destination is determined automatically from the original message
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  ;This API should NOT be called for batch messages, use $$BATCHACK instead.
 | 
|---|
| 15 |  ;Input:
 | 
|---|
| 16 |  ;  HLMSTATE (pass by reference, required) the array obtained by calling $$STARTMSG^HLOPRS when parsing the original message 
 | 
|---|
| 17 |  ;  PARMS (pass by reference) These subscripts may be defined:
 | 
|---|
| 18 |  ;    "ACK CODE" (required) MSA1[ {AA,AE,AR}
 | 
|---|
| 19 |  ;    "ERROR MESSAGE" - MSA3, should be used only if AE or AR
 | 
|---|
| 20 |  ;    "ACCEPT ACK RESPONSE" - the <tag^routine> to call when the commit ack is received (optional)
 | 
|---|
| 21 |  ;    "ACCEPT ACK TYPE" - {AL,NE} (optional, defaults to AL)
 | 
|---|
| 22 |  ;    "CONTINUATION POINTER" (optional)indicates a fragmented message
 | 
|---|
| 23 |  ;    "COUNTRY" - the 3 character country code (optional)
 | 
|---|
| 24 |  ;    "EVENT" - the 3 character event type (optional, defaults to the event code of the original message)
 | 
|---|
| 25 |  ;     "ENCODING CHARACTERS" - the four HL7 encoding characters (optional,defaults to "^~\&"
 | 
|---|
| 26 |  ;    "FAILURE RESPONSE" (optional) the <tag>^<routine> that the sending application routine should execute if the transmission of the message fails, i.e., the message can not be sent or a requested commit ack is not received.
 | 
|---|
| 27 |  ;    "FIELD SEPARATOR" - field separator (optional, defaults to "|")
 | 
|---|
| 28 |  ;    "MESSAGE TYPE" - if not defined, ACK is used
 | 
|---|
| 29 |  ;    "MESSAGE STRUCTURE" (optional)
 | 
|---|
| 30 |  ;    "QUEUE" - (optional) An application can name its own private queue (a string under 20 characters,namespaced). The default is the name of the queue of the original message
 | 
|---|
| 31 |  ;    "SECURITY" (optional) security information to include in the header segment, SEQ 8 (optional)
 | 
|---|
| 32 |  ;    "VERSION" - the HL7 Version ID (optional, defaults to 2.4)
 | 
|---|
| 33 |  ;Output:
 | 
|---|
| 34 |  ;  Function returns 1 on success, 0 on failure
 | 
|---|
| 35 |  ;  PARMS - left undefined when the function returns
 | 
|---|
| 36 |  ;  ACK (pass by reference, required) the acknowledgment message being built.
 | 
|---|
| 37 |  ;  ERROR (pass by reference) error msg
 | 
|---|
| 38 |  N I,SEG,TOLINK,SUCCESS
 | 
|---|
| 39 |  S SUCCESS=0,ERROR=""
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  D
 | 
|---|
| 42 |  .N PORT
 | 
|---|
| 43 |  .I $G(PARMS("ACK CODE"))'="AA",$G(PARMS("ACK CODE"))'="AE",$G(PARMS("ACK CODE"))'="AR" S ERROR="INVALID ACK CODE" Q
 | 
|---|
| 44 |  .;
 | 
|---|
| 45 |  .I '$G(HLMSTATE("IEN")) S ERROR="ORIGINAL MESSAGE TO ACKNOWLEDGE IS NOT IDENTIFIED" Q
 | 
|---|
| 46 |  .I $G(HLMSTATE("BATCH")) S ERROR="BATCH ACKNOWLEDGMENTS MUST USE $$BATCHACK^HLOAPI3" Q
 | 
|---|
| 47 |  .;
 | 
|---|
| 48 |  .I $G(HLMSTATE("HDR","MESSAGE CONTROL ID"))="" S ERROR="MESSAGE CONTROL ID MUST EXIST TO RETURN AN APPLICATION ACK" Q
 | 
|---|
| 49 |  .S PARMS("MESSAGE TYPE")=$G(PARMS("MESSAGE TYPE"),"ACK")
 | 
|---|
| 50 |  .S:PARMS("MESSAGE TYPE")="ACK" PARMS("MESSAGE STRUCTURE")="ACK"
 | 
|---|
| 51 |  .S PARMS("EVENT")=$G(PARMS("EVENT"),$G(HLMSTATE("HDR","EVENT")))
 | 
|---|
| 52 |  .I $$NEWMSG^HLOAPI(.PARMS,.ACK)  ;can't fail!
 | 
|---|
| 53 |  .;
 | 
|---|
| 54 |  .;if the return link can not be determined, the HL Logical Link file has a problem that must be fixed at the site
 | 
|---|
| 55 |  .S PORT=$P(HLMSTATE("HDR","SENDING FACILITY",2),":",2)
 | 
|---|
| 56 |  .S TOLINK=$$ACKLINK(.HLMSTATE)
 | 
|---|
| 57 |  .I TOLINK="" S ERROR="TRANSMISSION LINK FOR APPLICATION ACK CANNOT BE DETERMINED" Q
 | 
|---|
| 58 |  .I 'PORT S PORT=$$PORT2^HLOTLNK(TOLINK)
 | 
|---|
| 59 |  .;
 | 
|---|
| 60 |  .S ACK("HDR","APP ACK TYPE")="NE"
 | 
|---|
| 61 |  .S ACK("HDR","ACCEPT ACK TYPE")=$G(PARMS("ACCEPT ACK TYPE"),"AL")
 | 
|---|
| 62 |  .S ACK("STATUS","QUEUE")=$G(PARMS("QUEUE"),$G(HLMSTATE("STATUS","QUEUE")))
 | 
|---|
| 63 |  .S ACK("STATUS","PORT")=PORT
 | 
|---|
| 64 |  .S ACK("HDR","SECURITY")=$G(PARMS("SECURITY"))
 | 
|---|
| 65 |  .S ACK("HDR","SENDING APPLICATION")=$G(HLMSTATE("HDR","RECEIVING APPLICATION"))
 | 
|---|
| 66 |  .S ACK("HDR","RECEIVING APPLICATION")=$G(HLMSTATE("HDR","SENDING APPLICATION"))
 | 
|---|
| 67 |  .F I=1:1:3 S ACK("HDR","RECEIVING FACILITY",I)=$G(HLMSTATE("HDR","SENDING FACILITY",I))
 | 
|---|
| 68 |  .S ACK("ACK TO","STATUS")=$S(PARMS("ACK CODE")="AA":"SU",1:"AE")
 | 
|---|
| 69 |  .S ACK("ACK TO")=$G(HLMSTATE("HDR","MESSAGE CONTROL ID"))
 | 
|---|
| 70 |  .S ACK("ACK TO","IEN")=HLMSTATE("IEN")
 | 
|---|
| 71 |  .S ACK("STATUS","LINK NAME")=TOLINK
 | 
|---|
| 72 |  .S ACK("LINE COUNT")=0
 | 
|---|
| 73 |  .S ACK("MSA")="MSA"_ACK("HDR","FIELD SEPARATOR")_PARMS("ACK CODE")_ACK("HDR","FIELD SEPARATOR")_$G(HLMSTATE("HDR","MESSAGE CONTROL ID"))_ACK("HDR","FIELD SEPARATOR")_$G(PARMS("ERROR MESSAGE"))
 | 
|---|
| 74 |  .S SUCCESS=1
 | 
|---|
| 75 |  K PARMS
 | 
|---|
| 76 |  K:'SUCCESS ACK
 | 
|---|
| 77 |  Q SUCCESS
 | 
|---|
| 78 |  ;
 | 
|---|
| 79 | SENDACK(ACK,ERROR) ;This is used to signal that an application acknowledgment is complete.
 | 
|---|
| 80 |  ;Input:
 | 
|---|
| 81 |  ;  ACK (pass by reference,required) An array that contains the acknowledgment msg
 | 
|---|
| 82 |  ;Output:
 | 
|---|
| 83 |  ; Function returns 1 on success, 0 on failure
 | 
|---|
| 84 |  ; ERROR (pass by reference) error msg
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  N SEG
 | 
|---|
| 87 |  ;if the application added its own MSA, then the ACK("MSA") node was killed
 | 
|---|
| 88 |  I $D(ACK("MSA")) S SEG(1)=ACK("MSA") D ADDSEG^HLOMSG(.ACK,.SEG)
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 |  I $$SEND^HLOAPI1(.ACK,.ERROR) Q 1
 | 
|---|
| 91 |  Q 0
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 | ACKLINK(HLMSTATE) ;
 | 
|---|
| 94 |  ;Finds the link to return the application ack to.
 | 
|---|
| 95 |  N LINK
 | 
|---|
| 96 |  S LINK=$$RTRNLNK^HLOAPP($G(HLMSTATE("HDR","RECEIVING APPLICATION")))
 | 
|---|
| 97 |  Q:LINK]"" LINK
 | 
|---|
| 98 |  S LINK=$$RTRNLNK^HLOTLNK($G(HLMSTATE("HDR","SENDING FACILITY",1)),$G(HLMSTATE("HDR","SENDING FACILITY",2)),$G(HLMSTATE("HDR","SENDING FACILITY",3)))
 | 
|---|
| 99 |  Q LINK
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 | CHKPARMS(HLMSTATE,PARMS,ERROR) ;
 | 
|---|
| 102 |  N LEN,SARY,HARY
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 |  ;shortcut to reference the header sub-array
 | 
|---|
| 105 |  S HARY="HLMSTATE(""HDR"")"
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  ;shortcut to reference the status sub-array
 | 
|---|
| 108 |  S SARY="HLMSTATE(""STATUS"")"
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  S ERROR=""
 | 
|---|
| 111 |  I $G(PARMS("ACCEPT ACK TYPE"))="" S PARMS("ACCEPT ACK TYPE")="AL"
 | 
|---|
| 112 |  I $G(PARMS("APP ACK TYPE"))="" S PARMS("APP ACK TYPE")="NE"
 | 
|---|
| 113 |  I PARMS("ACCEPT ACK TYPE")'="NE",PARMS("ACCEPT ACK TYPE")'="AL" S ERROR="INVALID ACCEPT ACKNOWLEDGMENT TYPE"
 | 
|---|
| 114 |  I PARMS("APP ACK TYPE")'="NE",PARMS("APP ACK TYPE")'="AL" S ERROR="INVALID APPLICATION ACKNOWLEDGMENT TYPE"
 | 
|---|
| 115 |  S LEN=$L($G(PARMS("QUEUE")))
 | 
|---|
| 116 |  I $G(PARMS("QUEUE"))["^" S ERROR="QUEUE NAME MAY NOT CONTAIN '^'"
 | 
|---|
| 117 |  I LEN>20 S ERROR="QUEUE PARAMETER IS MAX 20 LENGTH",PARMS("QUEUE")=$E(PARMS("QUEUE"),1,20)
 | 
|---|
| 118 |  I 'LEN S PARMS("QUEUE")="DEFAULT"
 | 
|---|
| 119 |  I $G(PARMS("SENDING APPLICATION"))="" D
 | 
|---|
| 120 |  .S ERROR="SENDING APPLICATION IS REQUIRED"
 | 
|---|
| 121 |  .S PARMS("SENDING APPLICATION")=""
 | 
|---|
| 122 |  E  D
 | 
|---|
| 123 |  .I '$D(^HLD(779.2,"C",PARMS("SENDING APPLICATION"))) S ERROR="SENDING APPLICATION NOT FOUND IN THE HLO APPLICATION REGISTRY"
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  ;move parameters into HLMSTATE
 | 
|---|
| 126 |  S @HARY@("ACCEPT ACK TYPE")=PARMS("ACCEPT ACK TYPE")
 | 
|---|
| 127 |  S @HARY@("APP ACK TYPE")=PARMS("APP ACK TYPE")
 | 
|---|
| 128 |  S @HARY@("SENDING APPLICATION")=$E(PARMS("SENDING APPLICATION"),1,60)
 | 
|---|
| 129 |  S @HARY@("SECURITY")=$G(PARMS("SECURITY"))
 | 
|---|
| 130 |  S @SARY@("APP ACK RESPONSE")=$G(PARMS("APP ACK RESPONSE"))
 | 
|---|
| 131 |  S @SARY@("ACCEPT ACK RESPONSE")=$G(PARMS("ACCEPT ACK RESPONSE"))
 | 
|---|
| 132 |  S @SARY@("FAILURE RESPONSE")=$G(PARMS("FAILURE RESPONSE"))
 | 
|---|
| 133 |  S @SARY@("QUEUE")=PARMS("QUEUE")
 | 
|---|
| 134 |  Q:$L(ERROR) 0
 | 
|---|
| 135 |  Q 1
 | 
|---|
| 136 |  ;
 | 
|---|
| 137 | SETCODE(SEG,VALUE,FIELD,COMP,REP) ;
 | 
|---|
| 138 |  ;Implements SETCNE and SETCWE
 | 
|---|
| 139 |  ;
 | 
|---|
| 140 |  N SUB,VAR
 | 
|---|
| 141 |  Q:'$G(FIELD)
 | 
|---|
| 142 |  S:'$G(REP) REP=1
 | 
|---|
| 143 |  I '$G(COMP) D
 | 
|---|
| 144 |  .S VAR="COMP",SUB=1
 | 
|---|
| 145 |  E  D
 | 
|---|
| 146 |  .S VAR="SUB"
 | 
|---|
| 147 |  S @VAR=1,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("ID"))
 | 
|---|
| 148 |  S @VAR=2,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("TEXT"))
 | 
|---|
| 149 |  S @VAR=3,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("SYSTEM"))
 | 
|---|
| 150 |  S @VAR=4,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("ALTERNATE ID"))
 | 
|---|
| 151 |  S @VAR=5,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("ALTERNATE TEXT"))
 | 
|---|
| 152 |  S @VAR=6,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("ALTERNATE SYSTEM"))
 | 
|---|
| 153 |  S @VAR=7,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("SYSTEM VERSION"))
 | 
|---|
| 154 |  S @VAR=8,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("ALTERNATE SYSTEM VERSION"))
 | 
|---|
| 155 |  S @VAR=9,SEG(FIELD,REP,COMP,SUB)=$G(VALUE("ORIGINAL TEXT"))
 | 
|---|
| 156 |  Q
 | 
|---|