| 1 | HLCSHDR3 ;SFIRMFO/LJA - Reset MSH Segment Fields ;03/24/04 11:19 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**93,108**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | ; Reset RECEIVING APPLICATION and RECEIVING SITE of MSH segment - HL*1.6*93 | 
|---|
| 5 | ; | 
|---|
| 6 | RESET ; Called from HEADER^HLCSHDR1 & BHSHDR^HLCSHDR1, which is called by | 
|---|
| 7 | ; GENERATE^HLMA & GENACK^HLMA1. | 
|---|
| 8 | N MTIEN | 
|---|
| 9 | ; | 
|---|
| 10 | ; Even if set already, set 772 IEN again... | 
|---|
| 11 | S MTIEN=+$G(^HLMA(+$G(IEN),0)) QUIT:$G(^HL(772,+MTIEN,0))']""  ;-> | 
|---|
| 12 | ; | 
|---|
| 13 | ; Different variables used for Event Protocol | 
|---|
| 14 | D MSHCHG($G(HLEID),$S($G(EIDS)>0:+EIDS,1:+$G(HLEIDS)),$G(MTIEN),$G(IEN),.SERAPP,.SERFAC,.CLNTAPP,.CLNTFAC,.HLP) | 
|---|
| 15 | ; | 
|---|
| 16 | QUIT | 
|---|
| 17 | ; | 
|---|
| 18 | MSHCHG(HLEID,EIDS,MTIEN,IEN,SERAPP,SERFAC,CLNTAPP,CLNTFAC,HLPARR) ; The parameters | 
|---|
| 19 | ; are the required input variables.  Call here "by reference". | 
|---|
| 20 | ; | 
|---|
| 21 | ;  HLEID=Event driver protocol IEN | 
|---|
| 22 | ;   EIDS=Subscriber protocol IEN | 
|---|
| 23 | ;  MTIEN=772 IEN | 
|---|
| 24 | ;    IEN=773 IEN | 
|---|
| 25 | ; SERAPP=Sending App text | 
|---|
| 26 | ; SERFAC=Sending Fac text | 
|---|
| 27 | ;CLNTAPP=Rec (client) app text | 
|---|
| 28 | ;CLNTFAC=Rec (client) fac text | 
|---|
| 29 | ;   HLP()=HLP("SUBSCRIBER") array | 
|---|
| 30 | ; | 
|---|
| 31 | ; The MSH segment is built (usually) in HLCSHDR1.  Immediately before | 
|---|
| 32 | ; using the existing local variables to concatenate them together into | 
|---|
| 33 | ; the MSH segment, HLCSHDR1 calls here to see if some of the local | 
|---|
| 34 | ; variables should be reset. | 
|---|
| 35 | ; | 
|---|
| 36 | ; Resetting the local variables used in creating the MSH segment | 
|---|
| 37 | ; gives those creating HL7 messages control over the local variables | 
|---|
| 38 | ; that can be changed below. | 
|---|
| 39 | ; | 
|---|
| 40 | ; There are rules that govern what the creator of the MSH segment | 
|---|
| 41 | ; can change: | 
|---|
| 42 | ; | 
|---|
| 43 | ; Rule #1: The SENDING APPLICATION can be changed.   Var=HLMSHSAN | 
|---|
| 44 | ; Rule #2: The SENDING FACILITY can be changed.      Var=HLMSHSFN | 
|---|
| 45 | ; Rule #3: The RECEIVING APPLICATION can be changed. Var=HLMSHRAN | 
|---|
| 46 | ; Rule #4: The RECEIVING FACILITY can be changed.    Var=HLMSHRFN | 
|---|
| 47 | ; Rule #5: No other fields in the MSH segment can be changed. | 
|---|
| 48 | ; | 
|---|
| 49 | ; If the passed in HLP() array entry used to reset the above four | 
|---|
| 50 | ; fields holds the text used, the variables above will be reset. | 
|---|
| 51 | ; If M code is used, the M code itself is responsible for setting | 
|---|
| 52 | ; these specific local variables. | 
|---|
| 53 | ; | 
|---|
| 54 | ; The following local variables are created and made available for | 
|---|
| 55 | ; use by M code: | 
|---|
| 56 | ; | 
|---|
| 57 | ; Protocol, Event:                  HLMSHPRE  (IEN^NAME) | 
|---|
| 58 | ; Protocol, Subscriber:             HLMSHPRS  (IEN^NAME) | 
|---|
| 59 | ; | 
|---|
| 60 | ; HL Message Text file (#772) IEN:  HLMSH772  (IEN) | 
|---|
| 61 | ; HL Message Admin file (#773) IEN: HLMSH773  (IEN) | 
|---|
| 62 | ; | 
|---|
| 63 | ; Sending Application, Original:    HLMSHSAO  (SERAPP) | 
|---|
| 64 | ; Sending Application, New:         HLMSHSAN | 
|---|
| 65 | ; Sending Facility, Original:       HLMSHSFO  (SERFAC) | 
|---|
| 66 | ; Sending Facility, New:            HLMSHSFN | 
|---|
| 67 | ; Receiving Application, Original:  HLMSHRAO  (CLNTAPP) | 
|---|
| 68 | ; Receiving Application, New:       HLMSHRAN | 
|---|
| 69 | ; Receiving Facility, Original:     HLMSHRFO  (CLNTFAC) | 
|---|
| 70 | ; Receiving Facility, New:          HLMSHRFN | 
|---|
| 71 | ; | 
|---|
| 72 | ; M Code SUBROUTINE:                HLMSHTAG | 
|---|
| 73 | ; M Code ROUTINE:                   HLMSHRTN | 
|---|
| 74 | ; | 
|---|
| 75 | ; See the documentation in patch HL*1.6*93 in the Forum patch module | 
|---|
| 76 | ; for additional information. | 
|---|
| 77 | ; | 
|---|
| 78 | ; CLIENT -- req | 
|---|
| 79 | ; | 
|---|
| 80 | ; HLMSH-namespaced variables created below | 
|---|
| 81 | N HLDEBUG,HLMSH101,HLMSH31,HLMSH31C,HLMSH32,HLMSH32C | 
|---|
| 82 | N HLMSH33,HLMSH33C,HLMSH34,HLMSH34C,HLMSH772,HLMSH773,HLMSH91 | 
|---|
| 83 | N HLMSHAN,HLMSHFN,HLMSHPRE,HLMSHPRS | 
|---|
| 84 | N HLMSHRTN,HLMSHRAN,HLMSHRAO,HLMSHRFN | 
|---|
| 85 | N HLMSHRFO,HLMSHSAN,HLMSHSAO,HLMSHSFN,HLMSHSFO | 
|---|
| 86 | N HLMSHPRO,HLMSHREF,HLMSHSUB,HLMSHTAG | 
|---|
| 87 | ; | 
|---|
| 88 | ; Non-HLMSH-namespaced variables created below | 
|---|
| 89 | N HLPWAY,HLRAN,HLRFN,HLSAN,HLSFN,HLTYPE | 
|---|
| 90 | ; | 
|---|
| 91 | ; | 
|---|
| 92 | ; Set up variables pass #1... | 
|---|
| 93 | S (HLMSH31,HLMSH32,HLMSH33,HLMSH34)="" | 
|---|
| 94 | S (HLMSH31C,HLMSH32C,HLMSH33C,HLMSH34C)="" | 
|---|
| 95 | S HLMSHPRE=$G(HLEID)_U_$P($G(^ORD(101,+$G(HLEID),0)),U) ; Event 101 | 
|---|
| 96 | S HLMSHPRS=$G(EIDS)_U_$P($G(^ORD(101,+$G(EIDS),0)),U) ; Sub 101 | 
|---|
| 97 | S HLMSH772=$G(MTIEN) | 
|---|
| 98 | S HLMSH773=$G(IEN) QUIT:'$D(^HLMA(+HLMSH773,0))  ;-> | 
|---|
| 99 | ; | 
|---|
| 100 | ; Get passed-in-by-reference HLP("SUBSCRIBER") data into variable... | 
|---|
| 101 | S HLMSHPRO=$$HLMSHPRO QUIT:HLMSHPRO']""  ;-> | 
|---|
| 102 | ; | 
|---|
| 103 | ; Should DEBUG data be stored? (This can be overwritten in $$HLMSHPRO) | 
|---|
| 104 | I $G(HLDEBUG)']"" S HLDEBUG=$P($P(HLMSHPRO,"~",2),U,8) | 
|---|
| 105 | ;                   HLDEBUG might be already set in $$HLMSHPRO | 
|---|
| 106 | S HLDEBUG=$TR(HLDEBUG,"- /",U) ; Change delimiters to ^ | 
|---|
| 107 | ; | 
|---|
| 108 | ; HLDEBUG (#1-#2-#3) Explanation... | 
|---|
| 109 | ; -- #1 can be 0 (NO) or 1 (YES) for whether ^HLMA(#,90) data stored | 
|---|
| 110 | ; -- #2 can be 0 or 1 for whether ^HLMA(#,91) data should be stored | 
|---|
| 111 | ; -- #3 can be 0 or 1 or 2 for what type of ^XTMP data should be stored | 
|---|
| 112 | ;    -- Data is stored in ^XTMP("HLCSHDR3 "_IEN773) | 
|---|
| 113 | ;    -- 0 = No XTMP data should be stored | 
|---|
| 114 | ;    -- 1 = Store only SOME of the data | 
|---|
| 115 | ;    -- 2 = Store ALL variable data | 
|---|
| 116 | ; | 
|---|
| 117 | ; Store HLP("SUBSCRIBER"[,#]) in ^HLMA(#,90) | 
|---|
| 118 | I $P(HLDEBUG,U)=1 D | 
|---|
| 119 | .  S X=$P(HLMSHPRO,"~",2) I X]"" S ^HLMA(+HLMSH773,90)=X | 
|---|
| 120 | ; | 
|---|
| 121 | ; Found by general HLP("SUBSCRIBER") or specific HLP("SUBSCRIBER",#) entry? | 
|---|
| 122 | ; patch HL*1.6*108 start | 
|---|
| 123 | S HLPWAY=$P(HLMSHPRO,"~"),X=$L(HLMSHPRO,"~"),HLMSHREF=$P(HLMSHPRO,"~",+X),HLMSHPRO=$P(HLMSHPRO,"~",+2,+X-1) | 
|---|
| 124 | ; Above line modified by LJA - 3/18/04  Original line shown below. | 
|---|
| 125 | ; S HLPWAY=$P(HLMSHPRO,"~"),HLMSHREF=$P(HLMSHPRO,"~",3),HLMSHPRO=$P(HLMSHPRO,"~",2) | 
|---|
| 126 | ; patch HL*1.6*108 end | 
|---|
| 127 | ; | 
|---|
| 128 | ; Set up variables pass #2... | 
|---|
| 129 | S HLMSHSAO=$G(SERAPP),(HLSAN,HLMSHSAN)=$P(HLMSHPRO,U,2) ;  Send App | 
|---|
| 130 | S HLMSHSFO=$G(SERFAC),(HLSFN,HLMSHSFN)=$P(HLMSHPRO,U,3) ;  Send Fac | 
|---|
| 131 | S HLMSHRAO=$G(CLNTAPP),(HLRAN,HLMSHRAN)=$P(HLMSHPRO,U,4) ; Rec App | 
|---|
| 132 | S HLMSHRFO=$G(CLNTFAC),(HLRFN,HLMSHRFN)=$P(HLMSHPRO,U,5) ; Rec Fac | 
|---|
| 133 | ; | 
|---|
| 134 | ; If there's an Xecution routine, do now... | 
|---|
| 135 | S HLMSHTAG=$P(HLMSHPRO,U,6),HLMSHRTN=$P(HLMSHPRO,U,7) | 
|---|
| 136 | I HLMSHTAG]"",HLMSHRTN]"" D @HLMSHTAG^@HLMSHRTN | 
|---|
| 137 | I HLMSHTAG']"",HLMSHRTN]"" D ^@HLMSHRTN | 
|---|
| 138 | ; | 
|---|
| 139 | ; Start work for ^HLMA(#,91) node... | 
|---|
| 140 | S HLMSH91="" ; HLMSH91 is the data that will be stored in ^(91) | 
|---|
| 141 | I SERAPP'=HLMSHSAN D SET91M(1,SERAPP,HLSAN,HLMSHSAN) ; Reset by M code? | 
|---|
| 142 | I SERFAC'=HLMSHSFN D SET91M(3,SERFAC,HLSFN,HLMSHSFN) | 
|---|
| 143 | I CLNTAPP'=HLMSHRAN D SET91M(5,CLNTAPP,HLRAN,HLMSHRAN) | 
|---|
| 144 | I CLNTFAC'=HLMSHRFN D SET91M(7,CLNTFAC,HLRFN,HLMSHRFN) | 
|---|
| 145 | ; | 
|---|
| 146 | ; The real resetting of MSH segment variables work is done here... | 
|---|
| 147 | D SET^HLCSHDR4(HLMSHSAN,"SERAPP",1) ; Update SERAPP if different, and DATA too... | 
|---|
| 148 | D SET^HLCSHDR4(HLMSHSFN,"SERFAC",3) ; Etc | 
|---|
| 149 | D SET^HLCSHDR4(HLMSHRAN,"CLNTAPP",5) ; Etc | 
|---|
| 150 | D SET^HLCSHDR4(HLMSHRFN,"CLNTFAC",7) ; Etc | 
|---|
| 151 | ; | 
|---|
| 152 | ; Set ^HLMA(#,91) node if overwrites occurred... | 
|---|
| 153 | I HLMSH91]"" S ^HLMA(+HLMSH773,91)=HLMSH91 | 
|---|
| 154 | ; | 
|---|
| 155 | ; If debugging, record pre variable view... | 
|---|
| 156 | D DEBUG^HLCSHDR4($P(HLDEBUG,U,3)) | 
|---|
| 157 | ; | 
|---|
| 158 | QUIT | 
|---|
| 159 | ; | 
|---|
| 160 | SET91M(PCE,MSH,PREM,POSTM) ; If M code re/set the MSH field, record... | 
|---|
| 161 | QUIT:PREM=POSTM  ;-> M code did not change anything... | 
|---|
| 162 | S $P(HLMSH91,U,PCE)=MSH ;  original (pre-overwrite) value | 
|---|
| 163 | S $P(HLMSH91,U,PCE+1)="M" ; Overwrite source (A/M) | 
|---|
| 164 | QUIT | 
|---|
| 165 | ; | 
|---|
| 166 | HLMSHPRO() ; Determines whether to use the generic HLP("SUBSCRIBER") data, | 
|---|
| 167 | ; or instead - if existent - the HLP("SUBSCRIBER",#)=SUB PROTOCOL^... data | 
|---|
| 168 | ;CLIENT -- req | 
|---|
| 169 | N HLD,HLFIND,HLI,HLMSHREF,HLMSHSUB,HLX | 
|---|
| 170 | ; | 
|---|
| 171 | ; Get the default information... | 
|---|
| 172 | S HLMSHSUB=$G(HLP("SUBSCRIBER")),HLMSHREF=999 | 
|---|
| 173 | ; | 
|---|
| 174 | ; Overwrite HLMSHSUB if found... | 
|---|
| 175 | S HLI=0,HLFIND="" | 
|---|
| 176 | F  S HLI=$O(HLP("SUBSCRIBER",HLI)) Q:HLI'>0!(HLFIND]"")  D | 
|---|
| 177 | .  S HLD=$G(HLP("SUBSCRIBER",+HLI)) QUIT:HLD']""  ;-> | 
|---|
| 178 | .  S HLD=$P(HLD,U) QUIT:HLD']""  ;-> | 
|---|
| 179 | .  ; If passed name.. | 
|---|
| 180 | .  I HLD'=+HLD S HLD=$$FIND101(HLD) | 
|---|
| 181 | .  ; Must have IEN by now... | 
|---|
| 182 | .  QUIT:+HLD'=+HLMSHPRS  ;-> Not for right subscriber protocol | 
|---|
| 183 | .  S HLFIND=HLP("SUBSCRIBER",+HLI),HLMSHREF=+HLI | 
|---|
| 184 | ; | 
|---|
| 185 | ; Backdoor overwrite of HLDEBUG value... | 
|---|
| 186 | ; - This is a very important back door!!  Even if applications | 
|---|
| 187 | ; - aren't logging debug data, it can be turned on by setting | 
|---|
| 188 | ; - ^XTMP("HLCSHDR3 DEBUG","DEBUG") or ^XTMP("HLCSHDR3 DEBUG","DEBUG",SUB-101) | 
|---|
| 189 | ; If the GENERAL entry exists, set HLDEBUG.  Might be written next line though | 
|---|
| 190 | S HLX=$G(^XTMP("HLCSHDR3 DEBUG","DEBUG")) I HLX]"" S HLDEBUG=HLX | 
|---|
| 191 | ; If a SPECIFIC entry found, reset HLDEBUG to it... | 
|---|
| 192 | S HLX=$G(^XTMP("HLCSHDR3 DEBUG","DEBUG",+HLFIND)) I HLX]"" S HLDEBUG=HLX | 
|---|
| 193 | ; | 
|---|
| 194 | QUIT $S(HLFIND]"":"S~"_HLFIND_"~"_HLMSHREF,HLMSHSUB]"":"G~"_HLMSHSUB_"~"_HLMSHREF,1:"") | 
|---|
| 195 | ; | 
|---|
| 196 | FIND101(PROTNM) ; Find 101 entry... | 
|---|
| 197 | N D,DIC,X,Y | 
|---|
| 198 | S DIC="^ORD(101,",DIC(0)="MQ",D="B",X=PROTNM | 
|---|
| 199 | D MIX^DIC1 | 
|---|
| 200 | QUIT $S(Y>0:+Y,1:"") | 
|---|
| 201 | ; | 
|---|
| 202 | SHOW773(IEN773) ; Show reset info from 773 entry... | 
|---|
| 203 | QUIT | 
|---|
| 204 | ; | 
|---|
| 205 | EOR ;HLCSHDR3 - Reset MSH Segment Fields ;9/12/02 11:50 | 
|---|