| 1 | KMPDHU02 ;OAK/RAK - CM Tools Compile & File HL7 Daily Stats ;2/17/04  08:58 | 
|---|
| 2 | ;;2.0;CAPACITY MANAGEMENT TOOLS;;Mar 22, 2002 | 
|---|
| 3 | ; | 
|---|
| 4 | DAILY(KMPDST,KMPDEN) ;-entry point | 
|---|
| 5 | ;----------------------------------------------------------------------- | 
|---|
| 6 | ; KMPDST... Start date in internal fileman format. | 
|---|
| 7 | ; KMPDEN... End date in internal fileman format. | 
|---|
| 8 | ; | 
|---|
| 9 | ; This API gathers HL7 data and stores it in file 8973.1 (CM HL7 DATA) | 
|---|
| 10 | ; | 
|---|
| 11 | ; Variables used: | 
|---|
| 12 | ; GBL...... Global where data is stored - for use with indirection | 
|---|
| 13 | ; GBL1..... globas where compiled data is stored before filing - | 
|---|
| 14 | ;           used with indirection | 
|---|
| 15 | ;----------------------------------------------------------------------- | 
|---|
| 16 | ; | 
|---|
| 17 | Q:'$G(KMPDST) | 
|---|
| 18 | Q:'$G(KMPDEN) | 
|---|
| 19 | ; make sure end date has hours | 
|---|
| 20 | S:'$P(KMPDEN,".",2) $P(KMPDEN,".",2)="99" | 
|---|
| 21 | S:'$G(DT) DT=$$DT^XLFDT | 
|---|
| 22 | ; | 
|---|
| 23 | N ERROR,GBL,GBL1,STR,X | 
|---|
| 24 | ; | 
|---|
| 25 | ; get data from hl7 api | 
|---|
| 26 | W:'$D(ZTQUEUED) !,"Gathering HL7 data..." | 
|---|
| 27 | ; global with 'raw' hl7 api data | 
|---|
| 28 | S GBL=$NA(^TMP("KMPDH",$J)) K @GBL | 
|---|
| 29 | ; set up global to get asynchronous data | 
|---|
| 30 | K ^TMP($J) | 
|---|
| 31 | S ^TMP($J,"HLUCM")="DEBUG GLOBAL" | 
|---|
| 32 | S X=$$CM2^HLUCM(KMPDST,KMPDEN,1,1,"KMPDH","EITHER",.ERROR) | 
|---|
| 33 | I 'X!($D(ERROR))!('$D(^TMP("KMPDH",$J))) D  Q | 
|---|
| 34 | .W:'$D(ZTQUEUED) " no data to report" | 
|---|
| 35 | ; | 
|---|
| 36 | ; global for storing compiled data before filing | 
|---|
| 37 | S GBL1=$NA(^TMP("KMPDH-1",$J)) K @GBL1 | 
|---|
| 38 | ; | 
|---|
| 39 | W:'$D(ZTQUEUED) !,"Compiling synchronous HL7 data..." | 
|---|
| 40 | D SYNC | 
|---|
| 41 | ; | 
|---|
| 42 | W:'$D(ZTQUEUED) !,"Compiling asynchronous HL7 data..." | 
|---|
| 43 | D ASYNC | 
|---|
| 44 | ; | 
|---|
| 45 | K @GBL,@GBL1,^TMP($J),^TMP("KMPDHERRTIME",$J) | 
|---|
| 46 | W:'$D(ZTQUEUED) !,"Finished!" | 
|---|
| 47 | ; | 
|---|
| 48 | Q | 
|---|
| 49 | ; | 
|---|
| 50 | ; | 
|---|
| 51 | ASYNC ;- asynchronous data | 
|---|
| 52 | Q:$G(GBL)="" | 
|---|
| 53 | Q:$G(GBL1)="" | 
|---|
| 54 | ; | 
|---|
| 55 | N COUNT,DATA,DATA1,DATA2,HOUR,I,IEN,IEN1,IEN2,J,LOCAL,MSG,NM,NODE | 
|---|
| 56 | N OF,PIECE,PR,PTNP,SD,STDT,TIME1,TIME2,UNIT | 
|---|
| 57 | ; | 
|---|
| 58 | ; local site name | 
|---|
| 59 | S LOCAL=$P($$SITE^VASITE,U,2) Q:LOCAL="" | 
|---|
| 60 | S IEN=0 | 
|---|
| 61 | F  S IEN=$O(^TMP($J,"HLUCMSTORE","U",IEN)) Q:'IEN  S DATA=^(IEN) D | 
|---|
| 62 | .; data = Protocol~Ien^Namespace | 
|---|
| 63 | .; message type | 
|---|
| 64 | .S MSG=$P(DATA,U,6) | 
|---|
| 65 | .; quit if not 'complete' message | 
|---|
| 66 | .Q:'$$ASYNCHK(MSG) | 
|---|
| 67 | .; protocol - check protocol fist, then inferred protocol | 
|---|
| 68 | .S PR=$S($P(DATA,U,7)]"":$P(DATA,U,7),$P(DATA,U,8)]"":$P(DATA,U,8),1:"") Q:PR="" | 
|---|
| 69 | .; namespace - check namespace first, then inferred namespace | 
|---|
| 70 | .S NM=$S($P(DATA,U,9)]"":$P(DATA,U,9),$P(DATA,U,10)]"":$P(DATA,U,10),1:"") Q:NM="" | 
|---|
| 71 | .; other facility | 
|---|
| 72 | .S OF=$P(DATA,U,11) S:OF["~" OF=$P(OF,"~",2) Q:OF="" | 
|---|
| 73 | .; quit if other facility is LOCAL | 
|---|
| 74 | .Q:OF[LOCAL | 
|---|
| 75 | .; start date/time | 
|---|
| 76 | .S STDT=$P(DATA,U,4) Q:'STDT | 
|---|
| 77 | .; date without time | 
|---|
| 78 | .S SD=$P(STDT,".") Q:'SD | 
|---|
| 79 | .S $P(@GBL1@(SD,PR,NM,OF,99.2),U,11)=$P($P(DATA,U,11),"~") | 
|---|
| 80 | .S $P(@GBL1@(SD,PR,NM,OF,99.2),U,12)=$P($P(DATA,U,11),"~",2) | 
|---|
| 81 | .S $P(@GBL1@(SD,PR,NM,OF,99.2),U,13)=$P($P(DATA,U,11),"~",3) | 
|---|
| 82 | .; | 
|---|
| 83 | .S (COUNT,HOUR,IEN1)=0 K UNIT | 
|---|
| 84 | .F  S IEN1=$O(^TMP($J,"HLUCMSTORE","U",IEN,IEN1)) Q:'IEN1  D | 
|---|
| 85 | ..; data1 = piece 1 - Characters | 
|---|
| 86 | ..;         piece 2 - Messages | 
|---|
| 87 | ..;         piece 3 - Seconds | 
|---|
| 88 | ..;         piece 4 - Begining Time | 
|---|
| 89 | ..;         piece 5 - End Time | 
|---|
| 90 | ..;         piece 6 - Type: msg, ca, aa or ca | 
|---|
| 91 | ..;         piece 7 - Protocol~Ien | 
|---|
| 92 | ..;         piece 8 - Namespace | 
|---|
| 93 | ..S DATA1=$G(^TMP($J,"HLUCMSTORE","U",IEN,IEN1,"CCC")) Q:DATA1="" | 
|---|
| 94 | ..S COUNT=COUNT+1,UNIT(COUNT)=DATA1 | 
|---|
| 95 | .; | 
|---|
| 96 | .; back to IEN level | 
|---|
| 97 | .; quit if unit() array is not complete | 
|---|
| 98 | .Q:'$$UNITS(MSG) | 
|---|
| 99 | .; hour of transaction | 
|---|
| 100 | .S HOUR=+$E($P(STDT,".",2),1,2),HOUR=HOUR+1 | 
|---|
| 101 | .; prime time or non-prime time | 
|---|
| 102 | .S PTNP=$$PTNP^KMPDHU03(STDT) Q:'PTNP | 
|---|
| 103 | .; node: 5 - prime time | 
|---|
| 104 | .;       6 - non-prime time | 
|---|
| 105 | .S NODE=$S(PTNP=2:6,1:5) | 
|---|
| 106 | .; | 
|---|
| 107 | .; update msg unit count - prime time or non-prime time | 
|---|
| 108 | .S $P(@GBL1@(SD,PR,NM,OF,99.5),U,PTNP)=$P($G(@GBL1@(SD,PR,NM,OF,99.5)),U,PTNP)+1 | 
|---|
| 109 | .;update msg unit count - both prime time & non-prime time | 
|---|
| 110 | .S $P(@GBL1@(SD,PR,NM,OF,99.5),U,3)=$P($G(@GBL1@(SD,PR,NM,OF,99.5)),U,3)+1 | 
|---|
| 111 | .; totals | 
|---|
| 112 | .F J=0:0 S J=$O(UNIT(J)) Q:'J  F I=1:1:3 D | 
|---|
| 113 | ..; total | 
|---|
| 114 | ..S $P(@GBL1@(SD,PR,NM,OF,99.2),U,I)=$P($G(@GBL1@(SD,PR,NM,OF,99.2)),U,I)+$P(UNIT(J),U,I) | 
|---|
| 115 | ..S $P(@GBL1@(SD,PR,NM,OF,99.3),U,(I+6))=$P($G(@GBL1@(SD,PR,NM,OF,99.3)),U,(I+6))+$P(UNIT(J),U,I) | 
|---|
| 116 | ..; prime time or non-prime time | 
|---|
| 117 | ..; ^ piece to set | 
|---|
| 118 | ..S PIECE=I+$S(PTNP=2:3,1:0) | 
|---|
| 119 | ..S $P(@GBL1@(SD,PR,NM,OF,99.3),U,PIECE)=$P($G(@GBL1@(SD,PR,NM,OF,99.3)),U,PIECE)+$P(UNIT(J),U,I) | 
|---|
| 120 | .; | 
|---|
| 121 | .; msg to ca - originating message to commit ack | 
|---|
| 122 | .; ^ piece: 1 - characters | 
|---|
| 123 | .;          2 - count | 
|---|
| 124 | .;          3 - seconds | 
|---|
| 125 | .F I=1:1:3 S $P(@GBL1@(SD,PR,NM,OF,NODE+(I*.1)),U,HOUR)=$P($G(@GBL1@(SD,PR,NM,OF,NODE+(I*.1))),U,HOUR)+($P(UNIT(1),U,I)+$P(UNIT(2),U,I)) | 
|---|
| 126 | .; | 
|---|
| 127 | .; processing time (ca to aa) - commit ack ending time to application | 
|---|
| 128 | .;                              ack starting time | 
|---|
| 129 | .S TIME1=+$P(UNIT(3),U,4),TIME2=+$P(UNIT(2),U,5) | 
|---|
| 130 | .S $P(@GBL1@(SD,PR,NM,OF,(NODE+(.4))),U,HOUR)=$$TIMEADD^KMPDU($P($G(@GBL1@(SD,PR,NM,OF,(NODE+(.4)))),U,HOUR)+$$FMDIFF^XLFDT(TIME2,(+TIME1),3)) | 
|---|
| 131 | .; processing time (ca to aa) - count | 
|---|
| 132 | .S $P(@GBL1@(SD,PR,NM,OF,(NODE+(.5))),U,HOUR)=$P($G(@GBL1@(SD,PR,NM,OF,(NODE+(.5)))),U,HOUR)+1 | 
|---|
| 133 | .; | 
|---|
| 134 | .; aa to ca - application ack to commit ack | 
|---|
| 135 | .; ^ piece: 1 - characters | 
|---|
| 136 | .;          2 - count | 
|---|
| 137 | .;          3 - seconds | 
|---|
| 138 | .F I=1:1:3 S $P(@GBL1@(SD,PR,NM,OF,NODE+(I+6*.1)),U,HOUR)=$P($G(@GBL1@(SD,PR,NM,OF,NODE+(I+6*.1))),U,HOUR)+($P(UNIT(3),U,I)+$P(UNIT(4),U,I)) | 
|---|
| 139 | ; | 
|---|
| 140 | D:$D(@GBL1) FILE^KMPDHU03(2) | 
|---|
| 141 | ; | 
|---|
| 142 | Q | 
|---|
| 143 | ; | 
|---|
| 144 | ASYNCHK(KMPDMSG) ;-- extrinsic function - check for 'complete' message | 
|---|
| 145 | ;----------------------------------------------------------------------- | 
|---|
| 146 | ; KMPDMGS... message ack designations | 
|---|
| 147 | ; | 
|---|
| 148 | ; Return: 0 - not a complete message | 
|---|
| 149 | ;         1 - complete message | 
|---|
| 150 | ;----------------------------------------------------------------------- | 
|---|
| 151 | Q:$G(KMPDMSG)="" 0 | 
|---|
| 152 | Q:MSG="MSG~CA~AA~CA" 1 | 
|---|
| 153 | Q:MSG="MSG~CA~AR~CA" 1 | 
|---|
| 154 | Q:MSG="MSG~AA" 1 | 
|---|
| 155 | Q 0 | 
|---|
| 156 | ; | 
|---|
| 157 | UNITS(MSG) ;-- extrinsic function | 
|---|
| 158 | ;----------------------------------------------------------------------- | 
|---|
| 159 | ; MSG.... type of message: 'msg~aa', 'msg~ca~aa~ca', etc. | 
|---|
| 160 | ; | 
|---|
| 161 | ; Return: 0 - unit() array not complete | 
|---|
| 162 | ;         1 - unit() array is complete | 
|---|
| 163 | ; | 
|---|
| 164 | ; unit() array must be segmented into the following format: | 
|---|
| 165 | ;   unit(1) = msg | 
|---|
| 166 | ;   unit(2) = ca | 
|---|
| 167 | ;   unit(3) = aa | 
|---|
| 168 | ;   unit(4) = ca | 
|---|
| 169 | ; this data is then used to calculate characters, messages and seconds | 
|---|
| 170 | ;----------------------------------------------------------------------- | 
|---|
| 171 | Q:$G(MSG)="" 0 | 
|---|
| 172 | ; all messages must have unit(2) | 
|---|
| 173 | Q:'$D(UNIT(2)) 0 | 
|---|
| 174 | ; "msg~ca~aa~ca" & "msg~ca~ar~ca" messages must have unit(3) & unit(4) | 
|---|
| 175 | I MSG="MSG~CA~AA~CA"!(MSG="MSG~CA~AR~CA") Q:'$D(UNIT(3)) 0 | 
|---|
| 176 | I MSG="MSG~CA~AA~CA"!(MSG="MSG~CA~AR~CA") Q:'$D(UNIT(4)) 0 | 
|---|
| 177 | ; 'msg~aaa' messages contain only 2 unit() entries | 
|---|
| 178 | ; create 4 unit() entries for processing | 
|---|
| 179 | I MSG="MSG~AA" D | 
|---|
| 180 | .S (UNIT(3),UNIT(4))=UNIT(2),UNIT(2)=UNIT(1) | 
|---|
| 181 | .S $P(UNIT(1),U,1,3)="0^0^0" | 
|---|
| 182 | .S $P(UNIT(4),U,1,3)="0^0^0" | 
|---|
| 183 | ; calculate seconds | 
|---|
| 184 | ; msg to ca | 
|---|
| 185 | S $P(UNIT(2),U,3)=$$FMDIFF^XLFDT($P(UNIT(2),U,5),$P(UNIT(1),U,4),2) | 
|---|
| 186 | S:$P(UNIT(2),U,3)<0 $P(UNIT(2),U,3)=0 | 
|---|
| 187 | ; ca to aa | 
|---|
| 188 | S $P(UNIT(3),U,3)=$$FMDIFF^XLFDT($P(UNIT(3),U,5),$P(UNIT(2),U,5),2) | 
|---|
| 189 | S:$P(UNIT(3),U,3)<0 $P(UNIT(3),U,3)=0 | 
|---|
| 190 | ; aa to ca | 
|---|
| 191 | S $P(UNIT(4),U,3)=$$FMDIFF^XLFDT($P(UNIT(4),U,5),$P(UNIT(3),U,5),2) | 
|---|
| 192 | S:$P(UNIT(4),U,3)<0 $P(UNIT(4),U,3)=0 | 
|---|
| 193 | ; | 
|---|
| 194 | Q 1 | 
|---|
| 195 | ; | 
|---|
| 196 | SYNC ;- synchronous data | 
|---|
| 197 | ;----------------------------------------------------------------------- | 
|---|
| 198 | ; SS1...... subscript 1 - identifies data | 
|---|
| 199 | ;            HR   - hourly | 
|---|
| 200 | ;            NMSP - namespace | 
|---|
| 201 | ;            PROT - protocol | 
|---|
| 202 | ; SS2...... subscript 2 - identifies data sorted within SS1 | 
|---|
| 203 | ;            IO   - incoming/outgoing messages | 
|---|
| 204 | ;            LR   - local/remote messages | 
|---|
| 205 | ;            PR   - protocol | 
|---|
| 206 | ;            TM   - type of transmission | 
|---|
| 207 | ; | 
|---|
| 208 | ; SS3...... subcript 3 - which identifier for SS2 is being sorted | 
|---|
| 209 | ;            IO   - I - incoming | 
|---|
| 210 | ;                   O - outgoing | 
|---|
| 211 | ;                   U - unknown | 
|---|
| 212 | ;            LR   - L - local | 
|---|
| 213 | ;                   R - remote | 
|---|
| 214 | ;                   U - unknown | 
|---|
| 215 | ;            PR   - P - placeholder for consistent subscripting | 
|---|
| 216 | ;            TM   - M - mailman | 
|---|
| 217 | ;                   T - tcp | 
|---|
| 218 | ;                   U -unknown | 
|---|
| 219 | ; SS4...... subscript 4 - according to SS1 | 
|---|
| 220 | ;            HR   - date.time | 
|---|
| 221 | ;            NMSP - namespace | 
|---|
| 222 | ;            PROT - protocal | 
|---|
| 223 | ; SS5...... subcript 5 - according to SS1 | 
|---|
| 224 | ;            HR   - namespace | 
|---|
| 225 | ;            NMSP - date.tim | 
|---|
| 226 | ;            PROT - namespace | 
|---|
| 227 | ; SS6...... subscript 6 - according to SS1 | 
|---|
| 228 | ;            HR   - protocol | 
|---|
| 229 | ;            NMSP - protocol | 
|---|
| 230 | ;            PROT - date.time | 
|---|
| 231 | ;----------------------------------------------------------------------- | 
|---|
| 232 | Q:$G(GBL)="" | 
|---|
| 233 | Q:$G(GBL1)="" | 
|---|
| 234 | N SS1,SS2,SS3,SS4,SS5,SS6 | 
|---|
| 235 | S SS1="" | 
|---|
| 236 | F  S SS1=$O(@GBL@(SS1)) Q:SS1=""  I SS1'="RFAC" S SS2="" D | 
|---|
| 237 | .F  S SS2=$O(@GBL@(SS1,SS2)) Q:SS2=""  S SS3="" D | 
|---|
| 238 | ..F  S SS3=$O(@GBL@(SS1,SS2,SS3)) Q:SS3=""  S SS4="" D | 
|---|
| 239 | ...F  S SS4=$O(@GBL@(SS1,SS2,SS3,SS4)) Q:SS4=""  S SS5="" D | 
|---|
| 240 | ....Q:SS1="PROT"&(SS4="ZZZ") | 
|---|
| 241 | ....F  S SS5=$O(@GBL@(SS1,SS2,SS3,SS4,SS5)) Q:SS5=""  S SS6="" D | 
|---|
| 242 | .....; if SS1="NMSP" or SS1="PROT" quit if SS4 and SS5 (protocol/ | 
|---|
| 243 | .....;                             namespace pair) = ZZZ | 
|---|
| 244 | .....I SS1="NMSP"!(SS1="PROT") Q:SS4="ZZZ"&(SS5="ZZZ") | 
|---|
| 245 | .....F  S SS6=$O(@GBL@(SS1,SS2,SS3,SS4,SS5,SS6)) Q:SS6=""  D | 
|---|
| 246 | ......Q:SS1="HR"&(SS6="ZZZ") | 
|---|
| 247 | ......Q:SS1="NMSP"&(SS6="ZZZ") | 
|---|
| 248 | ......; compile data into daily stats for file #8973.1 (CM HL7 DATA) | 
|---|
| 249 | ......D COMPILE^KMPDHU03 | 
|---|
| 250 | ; | 
|---|
| 251 | D:$D(@GBL1) FILE^KMPDHU03(1) | 
|---|
| 252 | ; | 
|---|
| 253 | K @GBL1 | 
|---|
| 254 | ; | 
|---|
| 255 | Q | 
|---|