| 1 | HLUCM003 ;CIOFO-O/LJA - HL7/Capacity Mgt API-II ;10/23/01 12:01
 | 
|---|
| 2 |  ;;1.6;HEALTH LEVEL SEVEN;**88,103**;Oct 13, 1995
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | ADJTIME ; Adjust ^TMP times on basis of unit...
 | 
|---|
| 5 |  N IENPAR
 | 
|---|
| 6 |  S IENPAR=0
 | 
|---|
| 7 |  F  S IENPAR=$O(^TMP($J,"HLPARENT",IENPAR)) Q:'IENPAR  D
 | 
|---|
| 8 |  .  D ADJPAR(+IENPAR)
 | 
|---|
| 9 |  Q
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 | ADJPAR(IENPAR) ; Adjust times for one unit...
 | 
|---|
| 12 |  N BEG,DATA,END,IEN772,NUM,PREVTM,TIME
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  S NUM=0,IEN772=0
 | 
|---|
| 15 |  F  S IEN772=$O(^TMP($J,"HLPARENT",+IENPAR,IEN772)) Q:'IEN772  D
 | 
|---|
| 16 |  .  S NUM=NUM+1
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  ; No adjustments necessary if only one message...
 | 
|---|
| 19 |  QUIT:NUM'>1  ;->
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  ; Find all times...
 | 
|---|
| 22 |  S IEN772=0
 | 
|---|
| 23 |  F  S IEN772=$O(^TMP($J,"HLPARENT",+IENPAR,IEN772)) Q:IEN772'>0  D
 | 
|---|
| 24 |  .  S DATA=$P($G(^TMP($J,"HLCHILD",+IEN772)),"~",2,999) QUIT:DATA']""  ;->
 | 
|---|
| 25 |  .  S X=$P(DATA,U,4) I X?7N.E S TIME(X)=""
 | 
|---|
| 26 |  .  S X=$P(DATA,U,5) I X?7N.E S TIME(X)=""
 | 
|---|
| 27 |  ;
 | 
|---|
| 28 |  S BEG=$O(TIME(0)),END=$O(TIME(":"),-1)
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  ; Set 1st time and last time...
 | 
|---|
| 31 |  S IEN772=$O(^TMP($J,"HLPARENT",+IENPAR,0)) Q:IEN772'>0  ;->
 | 
|---|
| 32 |  D CORRECT(+IENPAR,+IEN772,4,BEG)
 | 
|---|
| 33 |  S IEN772=$O(^TMP($J,"HLPARENT",+IENPAR,":"),-1) QUIT:IEN772'>0  ;->
 | 
|---|
| 34 |  D CORRECT(+IENPAR,+IEN772,5,END)
 | 
|---|
| 35 |  ;
 | 
|---|
| 36 |  ; Make other corrections...
 | 
|---|
| 37 |  S IEN772=0,PREVTM=""
 | 
|---|
| 38 |  F  S IEN772=$O(^TMP($J,"HLPARENT",+IENPAR,IEN772)) Q:IEN772'>0  D
 | 
|---|
| 39 |  .  S DATA=$P($G(^TMP($J,"HLCHILD",+IEN772)),"~",2,999) QUIT:DATA']""  ;->
 | 
|---|
| 40 |  .  S TIME(1)=$P(DATA,U,4),TIME(2)=$P(DATA,U,5)
 | 
|---|
| 41 |  .
 | 
|---|
| 42 |  .  ; If first time thru...
 | 
|---|
| 43 |  .  I PREVTM="" D  QUIT  ;->
 | 
|---|
| 44 |  .  .  I TIME(1)=TIME(2) S PREVTM=TIME(2) QUIT  ;->
 | 
|---|
| 45 |  .  .  ; Set 1st entry's time to START=START (0 seconds)
 | 
|---|
| 46 |  .  .  D CORRECT(+IENPAR,+IEN772,5,TIME(1))
 | 
|---|
| 47 |  .  .  S PREVTM=TIME(1)
 | 
|---|
| 48 |  .
 | 
|---|
| 49 |  .  I TIME(1)'=PREVTM D
 | 
|---|
| 50 |  .  .  D CORRECT(+IENPAR,+IEN772,4,PREVTM)
 | 
|---|
| 51 |  .  .  S TIME(1)=PREVTM
 | 
|---|
| 52 |  .
 | 
|---|
| 53 |  .  I TIME(1)>TIME(2) D
 | 
|---|
| 54 |  .  .  D CORRECT(+IENPAR,+IEN772,5,TIME(1))
 | 
|---|
| 55 |  .  .  S TIME(2)=TIME(1)
 | 
|---|
| 56 |  .
 | 
|---|
| 57 |  .  S PREVTM=TIME(2)
 | 
|---|
| 58 |  .  
 | 
|---|
| 59 |  Q
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 | CORRECT(PAR,CHLDIEN,PCE,NEW) ; Change CHILD data...
 | 
|---|
| 62 |  N BEG,CHILD,DIFF,END,SEC,STORE
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 |  ; Get CHILD and quit if no changes...
 | 
|---|
| 65 |  S HLCHILD=$G(^TMP($J,"HLCHILD",+CHLDIEN)) QUIT:$P(HLCHILD,U,PCE)=NEW  ;->
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ; Put new value into CHILD...
 | 
|---|
| 68 |  S $P(CHILD,U,PCE)=NEW
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  ;Calculate SEC difference and set into CHILD...
 | 
|---|
| 71 |  S BEG=$P(CHILD,U,4),END=$P(CHILD,U,5)
 | 
|---|
| 72 |  S DIFF=$$FMDIFF^XLFDT(END,BEG,2)
 | 
|---|
| 73 |  S $P(CHILD,U,3)=DIFF
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ; Store data...
 | 
|---|
| 76 |  S ^TMP($J,"HLCHILD",+CHLDIEN)=HLCHILD
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  Q
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 | RECNM(PFX,IEN772,FULLNM,REPNM,SRCE) ; Record where name found...
 | 
|---|
| 81 |  ; PFX - [n] for namespace, and [p] for protocol
 | 
|---|
| 82 |  ; IEN772 - IEN of 772
 | 
|---|
| 83 |  ; FULLNM - What is in entry itself, uninferred...
 | 
|---|
| 84 |  ; REPNM - What is to be reported
 | 
|---|
| 85 |  ; SRCE - Where it was inferred from
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 |  QUIT:$G(^TMP($J,"HLUCM"))'="DEBUG GLOBAL"  ;->
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  S REPNM=$G(PFX)_REPNM
 | 
|---|
| 90 |  ;
 | 
|---|
| 91 |  S ^TMP($J,"HLRECNM")=$G(^TMP($J,"HLRECNM"))+1
 | 
|---|
| 92 |  S ^TMP($J,"HLRECNM",REPNM)=$G(^TMP($J,"HLRECNM",REPNM))+1
 | 
|---|
| 93 |  S ^TMP($J,"HLRECNM",REPNM,SRCE)=$G(^TMP($J,"HLRECNM",REPNM,SRCE))+1
 | 
|---|
| 94 |  S ^TMP($J,"HLRECNM",REPNM,SRCE,IEN772)=FULLNM
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 |  QUIT
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 | MSHMAIL(IEN772) ;
 | 
|---|
| 99 |  N CT,INOUT,MIEN,NIEN,PCKG,RECNM,TXT,X,XMER,XMPOS,XMRG,XMZ
 | 
|---|
| 100 |  S MIEN=$P($G(^HL(772,+IEN772,0)),U,5) QUIT:MIEN'>0 "" ;->
 | 
|---|
| 101 |  S INOUT=$P(^HL(772,+IEN772,0),U,4)
 | 
|---|
| 102 |  S INOUT=$S(INOUT="I":5,1:3)
 | 
|---|
| 103 |  S CT=0,PCKG="",XMZ=+MIEN,XMER=0
 | 
|---|
| 104 |  F  D  QUIT:CT>10!(PCKG]"")!($E(TXT,1,3)="MSH")!(XMER'=0)
 | 
|---|
| 105 |  .  S CT=CT+1
 | 
|---|
| 106 |  .  D REC^XMS3
 | 
|---|
| 107 |  .  S TXT=$G(XMRG) QUIT:$E(TXT,1,3)'="MSH"  ;->
 | 
|---|
| 108 |  .  S X=$E(TXT,4),RECNM=$P(TXT,X,INOUT)
 | 
|---|
| 109 |  .  S PCKG=$$PCKGMSH(TXT,INOUT)
 | 
|---|
| 110 |  .  D RECNM("[n]",IEN772,RECNM,PCKG,"MAIL")
 | 
|---|
| 111 |  QUIT PCKG
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 | MSH772(IEN772) ; Get PCKG from MSH segment in 772...
 | 
|---|
| 114 |  ; Call here ONLY if can't get MSH segment from 773...
 | 
|---|
| 115 |  N CT,IN,INOUT,PCKG,RECNM,TXT,X
 | 
|---|
| 116 |  S IN=0,CT=0,PCKG=""
 | 
|---|
| 117 |  S INOUT=$$INOUT(+IEN772)
 | 
|---|
| 118 |  F  S IN=$O(^HL(772,+IEN772,"IN",IN)) Q:IN'>0!(CT>10)!(PCKG]"")  D
 | 
|---|
| 119 |  .  S CT=CT+1
 | 
|---|
| 120 |  .  S TXT=$G(^HL(772,+IEN772,"IN",+IN,0)) QUIT:TXT']""  ;->
 | 
|---|
| 121 |  .  QUIT:$E(TXT,1,3)'="MSH"  ;->
 | 
|---|
| 122 |  .  S X=$E(TXT,4),RECNM=$P(TXT,X,INOUT)
 | 
|---|
| 123 |  .  S PCKG=$$PCKGMSH(TXT,INOUT)
 | 
|---|
| 124 |  .  D RECNM("[n]",IEN772,RECNM,PCKG,772)
 | 
|---|
| 125 |  QUIT PCKG
 | 
|---|
| 126 |  ;
 | 
|---|
| 127 | MSH773(IEN772) ; Get PCKG from MSH segment in 773...
 | 
|---|
| 128 |  N IEN773,INOUT,MSH,PCKG,RECNM,X
 | 
|---|
| 129 |  S IEN773=$O(^HLMA("B",IEN772,0)) QUIT:IEN773'>0 "" ;->
 | 
|---|
| 130 |  S INOUT=$$INOUT(IEN772)
 | 
|---|
| 131 |  S MSH=$G(^HLMA(+IEN773,"MSH",1,0)) QUIT:MSH']"" "" ;->
 | 
|---|
| 132 |  S X=$E(MSH,4),RECNM=$P(MSH,X,INOUT)
 | 
|---|
| 133 |  S PCKG=$$PCKGMSH(MSH,INOUT)
 | 
|---|
| 134 |  I PCKG="VAMC" D
 | 
|---|
| 135 |  .  N NMSP
 | 
|---|
| 136 |  .  S NMSP=PCKG,INOUT=$S(INOUT=5:3,1:3)
 | 
|---|
| 137 |  .  S X=$E(MSH,4),RECNM=$P(MSH,X,INOUT)
 | 
|---|
| 138 |  .  S PCKG=$$PCKGMSH(MSH,INOUT) QUIT:$$PCKGMSH(MSH,INOUT)]""  ;->
 | 
|---|
| 139 |  .  S PCKG=NMSP ; Reset
 | 
|---|
| 140 |  D RECNM("[n]",IEN772,RECNM,PCKG,773)
 | 
|---|
| 141 |  QUIT PCKG
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 | INOUT(IEN772) ;
 | 
|---|
| 144 |  N INOUT
 | 
|---|
| 145 |  S INOUT=$P($G(^HL(772,+IEN772,0)),U,4)
 | 
|---|
| 146 |  S INOUT=$S(INOUT="I":5,1:3) ; Default to O, which is case in HEC error
 | 
|---|
| 147 |  QUIT INOUT
 | 
|---|
| 148 |  ;
 | 
|---|
| 149 | PCKGMSH(MSH,INOUT) ; Extract PCKG namespace from MSH segment
 | 
|---|
| 150 |  N DEL,PFROM
 | 
|---|
| 151 |  S DEL=$E(MSH,4),INOUT=$S($G(INOUT):INOUT,1:3)
 | 
|---|
| 152 |  S PFROM=$P(MSH,DEL,INOUT) QUIT:PFROM']"" "" ;->
 | 
|---|
| 153 |  QUIT $$FIXNMSP^HLUCM003(PFROM)
 | 
|---|
| 154 |  ;
 | 
|---|
| 155 | ERRCHK ; Error checks...
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  ; DATE checks...
 | 
|---|
| 158 |  S START=+$G(START),END=+$G(END)
 | 
|---|
| 159 |  I START'?7N&(START'?7N1"."1.N) D ERR^HLUCM("INVALID START TIME")
 | 
|---|
| 160 |  I END'?7N&(END'?7N1"."1.N) D ERR^HLUCM("INVALID END TIME")
 | 
|---|
| 161 |  I '$D(ERRINFO("INVALID START TIME")) D
 | 
|---|
| 162 |  .  I '$D(ERRINFO("INVALID END TIME")) D
 | 
|---|
| 163 |  .  .  I START=END!(START<END) QUIT  ;->
 | 
|---|
| 164 |  .  .  D ERR^HLUCM("END TIME PRECEDES START TIME")
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  ; If condition=BOTH, can't be ALL(1/2) and ALL(1/2) or
 | 
|---|
| 167 |  ; ALL(1/2) and SPECIFIC. BOTH can only be SPECIFIC and SPECIFIC.
 | 
|---|
| 168 |  I COND="BOTH" D
 | 
|---|
| 169 |  .  N P1,P2,P3
 | 
|---|
| 170 |  .  S P1=$S($G(PNMSP)>0:1,1:0) ; namespace 0/1
 | 
|---|
| 171 |  .  S P2=$S($G(IEN101)>0:1,1:0) ; protocol 0/1
 | 
|---|
| 172 |  .  S P3=P1+P2 QUIT:P3'>0  ;->
 | 
|---|
| 173 |  .  D ERR^HLUCM("BOTH NAMESPACES(S) AND PROTOCOL(S) MUST BE PASSED SPECIFICALLY")
 | 
|---|
| 174 |  QUIT
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 | SETMORE ; More defaults...
 | 
|---|
| 177 |  ; 
 | 
|---|
| 178 |  ; Check format of PNMSP...
 | 
|---|
| 179 |  ; If not passed by reference...
 | 
|---|
| 180 |  I 'NMSPTYPE D  ; Namespace(s) not passed as an array
 | 
|---|
| 181 |  .  ; Passed as 1 or 2 or O^NMSP, but is it valid?
 | 
|---|
| 182 |  .  I '$$OKPAR^HLUCM002(PNMSP) D
 | 
|---|
| 183 |  .  .  D ERR^HLUCM("INVALID NAMESPACE PARAMETER")
 | 
|---|
| 184 |  ;
 | 
|---|
| 185 |  ; Check format of IEN101...
 | 
|---|
| 186 |  ; If not passed by reference...
 | 
|---|
| 187 |  I 'PROTYPE D  ; Protocol(s) not passed as an array
 | 
|---|
| 188 |  .  ; Passed as 1 or 2 or 0^PROT or 0^IEN, but is it valid?
 | 
|---|
| 189 |  .  I '$$OKPAR^HLUCM002(IEN101) D  ; Check format...
 | 
|---|
| 190 |  .  .  D ERR^HLUCM("INVALID PROTOCOL PARAMETER")
 | 
|---|
| 191 |  .  S IEN101=$$OKPAR101^HLUCM001($G(IEN101)) I IEN101']"" D
 | 
|---|
| 192 |  .  .  I $D(ERRINFO("INVALID PROTOCOL PARAMETER")) QUIT  ;->
 | 
|---|
| 193 |  .  .  QUIT:IEN101["0^9999999"  ;->
 | 
|---|
| 194 |  .  .  D ERR^HLUCM("CAN'T FIND PROTOCOL")
 | 
|---|
| 195 |  QUIT
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 | FIXNMSP(PCKG,I772) ; First space piece, strip _
 | 
|---|
| 198 |  N APPR,APPS,FACR,FACS,I773,MSH
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 |  S I772=+$G(I772)
 | 
|---|
| 201 |  ;
 | 
|---|
| 202 |  ; Get 773 (or 772)-related information...
 | 
|---|
| 203 |  S I773=$O(^HLMA("B",+I772,0))
 | 
|---|
| 204 |  S MSH=$G(^HLMA(+I773,"MSH",1,0))
 | 
|---|
| 205 |  I MSH']"" S X=$G(^HL(772,+I772,"IN",1,0)) S:$E(X,1,3)=MSH MSH=X
 | 
|---|
| 206 |  S X=$E(MSH,4),APPS=$P(MSH,X,3),FACS=$P(MSH,X,4),APPR=$P(MSH,X,5),FACR=$P(MSH,X,6)
 | 
|---|
| 207 |  ;
 | 
|---|
| 208 |  S PCKG=$$NMSPCHG^HLUCM050(PCKG)
 | 
|---|
| 209 |  ;
 | 
|---|
| 210 |  QUIT $TR($E($P($P(PCKG," "),"-"),1,4),"_ ","") ;->
 | 
|---|
| 211 |  ;
 | 
|---|
| 212 | CTPCKG(PCKG) ; Should entry be counted on basis of package?
 | 
|---|
| 213 |  ; (Might be countable if protocol matches remember.)
 | 
|---|
| 214 |  ; If list of packages passed by reference, is PCKG in array?
 | 
|---|
| 215 |  ; IEN101,NMSPTYPE,PNMSP -- req
 | 
|---|
| 216 |  N CTPCKG
 | 
|---|
| 217 |  ;
 | 
|---|
| 218 |  ; Must count everything...
 | 
|---|
| 219 |  I $G(PNMSP)=1!($G(PNMSP)=2) QUIT 1 ;->
 | 
|---|
| 220 |  ;
 | 
|---|
| 221 |  ; If passed namspace by array, is PCKG in array?
 | 
|---|
| 222 |  I NMSPTYPE=1 QUIT $S($$REFPCKG^HLUCM001(PCKG):1,1:"") ;->
 | 
|---|
| 223 |  ;
 | 
|---|
| 224 |  ; If passed in "0^NAMESPACE" format...
 | 
|---|
| 225 |  I $$OK0CALL^HLUCM002(PNMSP) D  QUIT $S(PCKG]"":1,1:"") ;->
 | 
|---|
| 226 |  .  I $P(PNMSP,U,2)'=PCKG S PCKG=""
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  QUIT ""
 | 
|---|
| 229 |  ;
 | 
|---|
| 230 | CTPROT(PROT) ; Should entry be counted on basis of protocol?
 | 
|---|
| 231 |  ; (Might be countable if package matches remember.)
 | 
|---|
| 232 |  ; IEN,PROTYPE -- req
 | 
|---|
| 233 |  ;
 | 
|---|
| 234 |  N CTPROT
 | 
|---|
| 235 |  ;
 | 
|---|
| 236 |  ; Must count everything...
 | 
|---|
| 237 |  I $G(IEN101)=1!($G(IEN101)=2) QUIT 1 ;->
 | 
|---|
| 238 |  ;
 | 
|---|
| 239 |  ; If passed protocols by array, is PROT in array?
 | 
|---|
| 240 |  I PROTYPE=1 QUIT $S($$REFPROT^HLUCM001(PROT):1,1:"") ;->
 | 
|---|
| 241 |  ;
 | 
|---|
| 242 |  ; If PROT not found, and passed 0^PROTNM or 0^PROTIEN, 
 | 
|---|
| 243 |  ; can't do anything more...
 | 
|---|
| 244 |  I $$OK0CALL^HLUCM002(IEN101) D  QUIT $S(PROT]"":1,1:"") ;->
 | 
|---|
| 245 |  .  N VAL
 | 
|---|
| 246 |  .  QUIT:PROT']""  ;->
 | 
|---|
| 247 |  .  S VAL=$P(IEN101,U,2)
 | 
|---|
| 248 |  .  I $P(PROT,"~")'=VAL&($P(PROT,"~",2)'=VAL) S PROT=""
 | 
|---|
| 249 |  ;
 | 
|---|
| 250 |  QUIT ""
 | 
|---|
| 251 |  ;
 | 
|---|
| 252 | EOR ; HLUCM003 - HL7/Capacity Mgt API-II ;10/23/01 12:01
 | 
|---|