2009-12-04 00:11:15 -05:00
HLOAPI3 ; ALB / CJM - HL7 - Developer API ' s for sending application acks ; 03 / 13 / 2007
;; 1.6 ; HEALTH LEVEL SEVEN ; * * 126 , 133 , 134 * * ; Oct 13 , 1995 ; Build 30
; Per VHA Directive 2004 -038 , this routine should not be modified .
;
BATCHACK ( HLMSTATE , PARMS , ACK , ERROR ) ; Starts a batch message that is the response to a batch message . Individual acks are placed in the batch by calling $ $ ADDACK .
; $ $ SENDACK ^ HLOAPI2 must be called when the batch of acks is complete . The return destination is determined automatically from the original message .
;
; Input :
; HLMSTATE ( pass by reference , required ) the array obtained by calling $ $ STARTMSG ^ HLOPRS when parsing the original message
; PARMS ( optional , pass by reference ) These subscripts may be defined :
; "ACCEPT ACK RESPONSE" ) = < tag ^ routine > to call when the commit ack is received ( optional )
; "ACCEPT ACK TYPE" ) = < AL , NE > ( optional , defaults to AL )
; "COUNTRY" ) - a 3 character country code from the HL7 standard table ( optional )
; "ENCODING CHARACTERS" - the 4 HL7 encoding characters ( optional , defaults to "^~\&"
; "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 .
; "FIELD SEPARATOR" - the field separator ( optional , defaults to "|" )
; "QUEUE" ( optional ) An application can name a private queue ( a string under 20 characters , namespaced ) . The default is the name of the queue of the original message
; "SECURITY" - security information to include in the header segment , SEQ 8 ( optional )
; "VERSION" - the HL7 Version ID ( optional , defaults to 2.4 )
; Output :
; Function returns 1 on success , 0 on failure
; PARMS - left undefined upon completion
; ACK ( pass by reference , required ) the batch acknowledgment message being built .
; ERROR ( pass by reference ) error message
N I , TOLINK , SUCCESS
S SUCCESS = 0
;
D
. N PORT
. I ' $ G ( HLMSTATE ( "IEN" ) ) S ERROR = "ORIGINAL MESSAGE TO ACKNOWLEDGMENT IS NOT IDENTIFIED" Q
. ; if the return link can not be determined , the HL Logical Link file has a problem
. S TOLINK = $ $ ACKLINK ^ HLOAPI2 ( . HLMSTATE )
. I TOLINK = "" S ERROR = "TRANSMISSION LINK FOR APPLICATION ACK CANNOT BE DETERMINED" Q
. S PORT = $ P ( HLMSTATE ( "HDR" , "SENDING FACILITY" , 2 ) , ":" , 2 )
. I ' PORT S PORT = $ $ PORT2 ^ HLOTLNK ( TOLINK )
. ;
. I $ $ NEWBATCH ^ HLOAPI ( . PARMS , . ACK ) ; can ' t fail !
. S ACK ( "STATUS" , "QUEUE" ) = $ G ( PARMS ( "QUEUE" ) , $ G ( HLMSTATE ( "STATUS" , "QUEUE" ) ) )
. S ACK ( "STATUS" , "PORT" ) = PORT
. S ACK ( "HDR" , "SECURITY" ) = $ G ( PARMS ( "SECURITY" ) )
. S ACK ( "HDR" , "SENDING APPLICATION" ) = $ G ( HLMSTATE ( "HDR" , "RECEIVING APPLICATION" ) )
. S ACK ( "HDR" , "RECEIVING APPLICATION" ) = $ G ( HLMSTATE ( "HDR" , "SENDING APPLICATION" ) )
. F I = 1 : 1 : 3 S ACK ( "HDR" , "RECEIVING FACILITY" , I ) = $ G ( HLMSTATE ( "HDR" , "SENDING FACILITY" , I ) )
. S ACK ( "HDR" , "APP ACK TYPE" ) = "NE"
. S ACK ( "HDR" , "ACCEPT ACK TYPE" ) = $ G ( PARMS ( "ACCEPT ACK TYPE" ) , "AL" )
. S ACK ( "ACK TO" ) = $ G ( HLMSTATE ( "HDR" , "BATCH CONTROL ID" ) )
. S ACK ( "ACK TO" , "IEN" ) = HLMSTATE ( "IEN" )
. S ACK ( "ACK TO" , "BODY" ) = $ G ( HLMSTATE ( "BODY" ) )
. S ACK ( "STATUS" , "LINK NAME" ) = TOLINK
. S ACK ( "LINE COUNT" ) = 0
. S SUCCESS = 1
K PARMS
Q SUCCESS
;
ADDACK ( ACK , PARMS , ERROR ) ; This API adds an application acknowledgment to a batch
; of acknowledgments that was started by calling $ $ BATCHACK .
; The Default behavior is to return a general application ack .
; The application may optionally specify the message
; type and event and / or call $ $ ADDSEG ^ HLOAPI to add segments .
; A generic MSA segment ( components 1 -3 ) will be added automatically
; if the application doesn ' t call $ $ ADDSEG ^ HLOAPI to add an MSA segment
; as the FIRST segment following the MSH segment .
; $ $ SENDACK ^ HLOAPI2 must be called when the batch is complete .
;
; Input :
; ACK ( pass by reference , required ) the batch of acks that is being built
; PARMS ( pass by reference ) These subscripts may be defined :
; "ACK CODE" ( required ) MSA1 [ { AA , AE , AR }
; "ERROR MESSAGE" ( optional ) MSA3 , should be used only if AE or AR
; "EVENT" - 3 character event type ( optional , defaults to the event code of the original message )
; "MESSAGE CONTROL ID" ( required ) this is the message control id of the original individual message within the batch which is being acknowledged
; "MESSAGE STRUCTURE" ( optional )
; "MESSAGE TYPE" ( optional , defaults to ACK )
; "SECURITY" ( optional ) security information to include in the header segment SEQ 8
; Output :
; Function returns 1 on success , 0 on failure
; ACK ( pass by reference , required ) The batch , updated with another ack
; PARMS - left undefined when this function returns
; ERROR ( pass by reference ) error msg
;
N SUB , SUCCESS
S SUCCESS = 0
D
. I $ G ( PARMS ( "ACK CODE" ) ) ' = "AA" , $ G ( PARMS ( "ACK CODE" ) ) ' = "AE" , $ G ( PARMS ( "ACK CODE" ) ) ' = "AR" S ERROR = "INVALID ACK CODE" Q
. ;
. I $ G ( PARMS ( "MESSAGE CONTROL ID" ) ) = "" S ERROR = "MESSAGE CONTROL ID MUST EXIST TO RETURN AN APPLICATION ACK" Q
. S SUB = ""
. F S SUB = $ O ( ^ HLB ( "AE" , PARMS ( "MESSAGE CONTROL ID" ) , SUB ) ) Q : SUB = "" I $ P ( SUB , "^" ) = ACK ( "ACK TO" , "IEN" ) , $ P ( SUB , "^" , 2 ) S PARMS ( "ACK TO" , "IEN" ) = SUB Q
. S PARMS ( "MESSAGE TYPE" ) = $ G ( PARMS ( "MESSAGE TYPE" ) , "ACK" )
. S : PARMS ( "MESSAGE TYPE" ) = "ACK" PARMS ( "MESSAGE STRUCTURE" ) = "ACK"
. S PARMS ( "EVENT" ) = $ G ( PARMS ( "EVENT" ) )
. I PARMS ( "EVENT" ) = "" , ACK ( "ACK TO" , "BODY" ) , $ P ( SUB , "^" , 2 ) S PARMS ( "EVENT" ) = $ P ( $ G ( ^ HLA ( ACK ( "ACK TO" , "BODY" ) , 2 , $ P ( SUB , "^" , 2 ) , 0 ) ) , "^" , 3 )
. S PARMS ( "ACK TO" ) = PARMS ( "MESSAGE CONTROL ID" )
. S PARMS ( "ACK TO" , "STATUS" ) = $ S ( PARMS ( "ACK CODE" ) = "AA" : "SU" , 1 : "AE" )
. Q : ' $ $ ADDMSG ^ HLOAPI ( . ACK , . PARMS , . ERROR )
. S ACK ( "MSA" ) = "MSA|" _PARMS ( "ACK CODE" ) _ "|" _PARMS ( "MESSAGE CONTROL ID" ) _ "|" _ $ G ( PARMS ( "ERROR MESSAGE" ) )
. S SUCCESS = 1
K PARMS
Q SUCCESS
;
RESEND ( MSGIEN , ERROR ) ;
; This message will re - transmit an out - going message . It copies a copy the message , reusing all the original parameters . Then the message is requeued .
;
; Input :
; MSGIEN - the ien ( file #778 ) of the message that is to be sent
; Output :
; Function returns the ien of the message in file 778 on success , 0 on failure
; ERROR ( pass by reference , optional ) an error message
;
N MSG , SUB , HDR
I ' $ $ STARTMSG ^ HLOPRS ( . MSG , MSGIEN ) S ERROR = "MESSAGE NOT FOUND" Q 0
I MSG ( "DIRECTION" ) ' = "OUT" S ERROR = "MESSAGE IS NOT OUTGOING" Q 0
I MSG ( "STATUS" , "LINK NAME" ) = "" S ERROR = "LINK NOT DEFINED" Q 0
F SUB = "ID" , "IEN" , "DT/TM" , "ACK BY" , "STATUS" S MSG ( SUB ) = ""
F SUB = "PURGE" K MSG ( "STATUS" , SUB )
D GETSYS ^ HLOAPI ( . MSG )
I $ $ SAVEMSG ^ HLOF778 ( . MSG ) D OUTQUE ^ HLOQUE ( MSG ( "STATUS" , "LINK NAME" ) , $ G ( MSG ( "STATUS" , "PORT" ) ) , MSG ( "STATUS" , "QUEUE" ) , MSG ( "IEN" ) ) Q + MSG ( "IEN" )
Q 0
;
SETPURGE ( MSGIEN , TIME ) ;
; Resets the purge date / time .
; Input :
; MSGIEN ( required ) ien of the message , file #778
; TIME ( optional ) dt / time to set the purge time to , defaults to NOW
; Output :
; Function returns 1 on success , 0 on failure
N NODE , OLDTIME , HLDIR
Q : ' $ G ( MSGIEN ) 0
S NODE = $ G ( ^ HLB ( MSGIEN , 0 ) )
Q : NODE = "" 0
S OLDTIME = $ P ( NODE , "^" , 9 )
S : ' $ G ( TIME ) TIME = $ $ NOW ^ XLFDT
S HLDIR = $ S ( $ E ( $ P ( NODE , "^" , 4 ) ) = "I" : "IN" , 1 : "OUT" )
K : OLDTIME ^ HLB ( "AD" , HLDIR , OLDTIME , MSGIEN )
S $ P ( ^ HLB ( MSGIEN , 0 ) , "^" , 9 ) = TIME
S ^ HLB ( "AD" , HLDIR , TIME , MSGIEN ) = ""
Q 1
;
REPROC ( MSGIEN , ERROR ) ;
; This message will re - process an incoming message by placing it on an incoming queue . If successful the message will be purged .
;
; Input :
; MSGIEN - the ien ( file #778 ) of the message that is to be processed
; Output :
; Function returns 1 on success , 0 on failure
; ERROR ( pass by reference , optional ) an error message
;
N MSG , HDR , ACTION , QUEUE , FROM
;
I ' $ $ STARTMSG ^ HLOPRS ( . MSG , MSGIEN ) S ERROR = "MESSAGE NOT FOUND" Q 0
I MSG ( "DIRECTION" ) ' = "IN" S ERROR = "MESSAGE IS NOT INCOMING" Q 0
M HDR = MSG ( "HDR" )
I $ G ( MSG ( "ACK TO" ) ) ] "" S ACTION = MSG ( "STATUS" , "APP ACK RESPONSE" )
I ACTION = "" , ' $ $ ACTION ^ HLOAPP ( . HDR , . ACTION , . QUEUE ) , $ G ( MSG ( "ACK TO" ) ) = "" S ERROR = "RECEIVING APPLICATION NOT DEFINED"
; If this message references an earlier message , get the action specified by the original message
I ACTION = "" , $ G ( MSG ( "ACK TO" ) ) ] "" D
. N NODE , IEN
. S IEN = $ O ( ^ HLB ( "B" , $ P ( MSG ( "ACK TO" ) , "-" ) , 0 ) )
. S : IEN NODE = $ G ( ^ HLB ( IEN , 0 ) )
. I ( $ P ( NODE , "^" , 11 ) ] "" ) S ACTION = $ P ( NODE , "^" , 10 , 11 ) , QUEUE = $ S ( $ P ( NODE , "^" , 6 ) ] "" : $ P ( NODE , "^" , 6 ) , 1 : "DEFAULT" )
I ACTION = "" S ERROR = "ORIGINAL MESSAGE NOT FOUND" Q 0
S FROM = $ S ( MSG ( "HDR" , "SENDING FACILITY" , 2 ) ] "" : MSG ( "HDR" , "SENDING FACILITY" , 2 ) , 1 : MSG ( "HDR" , "SENDING FACILITY" , 1 ) )
D INQUE ^ HLOQUE ( FROM , QUEUE , MSGIEN , ACTION , 1 )
Q 1
;
PROCNOW ( MSGIEN , PURGE , ERROR ) ;
; This message will re - process an incoming message immediately .
;
; Input :
; MSGIEN - the ien ( file #778 ) of the message that is to be processed
; Output :
; Function returns 1 on success , 0 on failure
; PURGE ( optional ) a date / time to purge the message
; ERROR ( pass by reference , optional ) an error message
;
N MSG , HDR , ACTION , MCODE , HLMSGIEN
;
S ERROR = ""
I ' $ $ STARTMSG ^ HLOPRS ( . MSG , MSGIEN ) S ERROR = "MESSAGE NOT FOUND" Q 0
I MSG ( "DIRECTION" ) ' = "IN" S ERROR = "MESSAGE IS NOT INCOMING" Q 0
M HDR = MSG ( "HDR" )
I $ G ( MSG ( "ACK TO" ) ) ] "" S ACTION = MSG ( "STATUS" , "APP ACK RESPONSE" )
I ACTION = "" , ' $ $ ACTION ^ HLOAPP ( . HDR , . ACTION , . QUEUE ) , $ G ( MSG ( "ACK TO" ) ) = "" S ERROR = "RECEIVING APPLICATION NOT DEFINED" Q 0
; If this message references an earlier message , get the action specified by the original message
I $ G ( ACTION ) = "" , $ G ( MSG ( "ACK TO IEN" ) ) S ACTION = $ P ( $ G ( ^ HLB ( + MSG ( "ACK TO IEN" ) , 0 ) ) , "^" , 10 , 11 ) I $ P ( ACTION , "^" , 2 ) = "" S ERROR = "ORIGINAL MESSAGE NOT FOUND" Q 0
D : $ G ( PURGE )
. K : MSG ( "STATUS" , "PURGE" ) ^ HLB ( "AD" , "IN" , MSG ( "STATUS" , "PURGE" ) , MSGIEN )
. S $ P ( ^ HLB ( MSGIEN , 0 ) , "^" , 9 ) = PURGE
. S ^ HLB ( "AD" , "IN" , PURGE , MSGIEN ) = ""
. I $ G ( MSG ( "ACK TO IEN" ) ) , $ D ( ^ HLB ( MSG ( "ACK TO IEN" ) , 0 ) ) K ^ HLB ( "AD" , "OUT" , MSG ( "STATUS" , "PURGE" ) , MSG ( "ACK TO IEN" ) ) S $ P ( ^ HLB ( MSG ( "ACK TO IEN" ) , 0 ) , "^" , 9 ) = PURGE , ^ HLB ( "AD" , "OUT" , PURGE , MSG ( "ACK TO IEN" ) ) = ""
S HLMSGIEN = MSGIEN
S $ P ( ^ HLB ( MSGIEN , 0 ) , "^" , 19 ) = 1
S MCODE = "D " _ACTION
X MCODE
Q 1