| 1 | ECMUTL ;ALB/ESD - Utilities for Multiple Dates/Mult Procs ;20 AUG 1997 13:56 | 
|---|
| 2 | ;;2.0; EVENT CAPTURE ;**5,10,18,33,47,63**;8 May 96 | 
|---|
| 3 | ; | 
|---|
| 4 | ASKLOC() ; Get Location | 
|---|
| 5 | ;   Input:      None | 
|---|
| 6 | ; | 
|---|
| 7 | ;  Output:      ECL = Location (Division file pointer) ien | 
|---|
| 8 | ;              ECLN = Location name | 
|---|
| 9 | ; | 
|---|
| 10 | D ^ECL | 
|---|
| 11 | K ECOUT,LOC | 
|---|
| 12 | Q $S($D(ECL):1,1:0) | 
|---|
| 13 | ; | 
|---|
| 14 | ; | 
|---|
| 15 | ASKPRDT(DSSU,ONE) ; Get Procedure Start Date/Time | 
|---|
| 16 | ;   Input:      ECD = DSS Unit ien | 
|---|
| 17 | ;               ONE = Ask procedure start date/time once | 
|---|
| 18 | ; | 
|---|
| 19 | ;  Output:   ^TMP("ECPRDT",$J) = procedure date/time array | 
|---|
| 20 | ; | 
|---|
| 21 | N DTOUT,DUOUT,ECCNT,ECDUP,ECERR | 
|---|
| 22 | S (ECCNT,ECDUP,ECERR)=0 | 
|---|
| 23 | I '$G(DSSU) G ASKPRDTQ | 
|---|
| 24 | I $P($G(^ECD(DSSU,0)),"^",12)="N" S DIR("B")="NOW" | 
|---|
| 25 | AGAIN N DIRUT,Y | 
|---|
| 26 | S DIR("A")="Select "_$S(+ECDUP:"Another Procedure Date and Time",1:"Procedure Date and Time") | 
|---|
| 27 | S DIR("?")="Enter both date AND time procedure was performed. Future dates are not allowed." | 
|---|
| 28 | S DIR(0)="DO^:NOW:EXR" | 
|---|
| 29 | D ^DIR K DIR | 
|---|
| 30 | I $D(DTOUT)!($D(DUOUT)) S ECERR=1 | 
|---|
| 31 | I +Y S ECDUP=1,^TMP("ECPRDT",$J,Y)="" G @($S('$G(ONE):"AGAIN",1:"ASKPRDTQ")) | 
|---|
| 32 | ; | 
|---|
| 33 | ASKPRDTQ Q $S(ECERR:0,(+$G(ONE)&(+Y)):1,('$G(ONE))&($D(^TMP("ECPRDT",$J))):1,1:0) | 
|---|
| 34 | ; | 
|---|
| 35 | ; | 
|---|
| 36 | ASKCAT(ECL,ECD) ; Get category | 
|---|
| 37 | ;   Input:      ECL = Location ien | 
|---|
| 38 | ;               ECD = DSS Unit ien | 
|---|
| 39 | ; | 
|---|
| 40 | ;  Output:   ECATEG = Category ien (may be 0 if no categories) | 
|---|
| 41 | ; | 
|---|
| 42 | N CATS,DIRUT,ECATEG,ECMAX,X | 
|---|
| 43 | S ECATEG=0_"^No Categories",(ECMAX,X)=0 | 
|---|
| 44 | I '$G(ECL)!('$G(ECD)) G ASKCATQ | 
|---|
| 45 | D CATS^ECHECK1 | 
|---|
| 46 | I $O(ECC(0))']"" G ASKCATQ | 
|---|
| 47 | W !!,"Categories within "_$P($G(^ECD(+ECD,0)),"^")_":",! | 
|---|
| 48 | F  S X=$O(ECC(X)) Q:'X  W !?5,X_". ",$P(ECC(X),"^",2) S ECMAX=X | 
|---|
| 49 | W ! S DIR(0)="NA^1:"_ECMAX,DIR("A")="Select Number: " | 
|---|
| 50 | D ^DIR K DIR | 
|---|
| 51 | I 'Y!($D(DIRUT)) K ECATEG G ASKCATQ | 
|---|
| 52 | I +Y S ECATEG=$G(ECC(Y)) | 
|---|
| 53 | ASKCATQ K CNT,ECAT,ECC | 
|---|
| 54 | Q $G(ECATEG) | 
|---|
| 55 | ; | 
|---|
| 56 | ; | 
|---|
| 57 | ASKPRO(ECL,ECD,ECC,NUM) ; Ask procedures | 
|---|
| 58 | ;   Input:      ECL = Location ien | 
|---|
| 59 | ;               ECD = DSS Unit ien | 
|---|
| 60 | ;               ECC = Category ien | 
|---|
| 61 | ;               NUM = Only ask procedure once | 
|---|
| 62 | ; | 
|---|
| 63 | ;  Output:  ^TMP("ECPROC",$J) = procedure array | 
|---|
| 64 | ; | 
|---|
| 65 | N CNT,ECERR,ECOUNT,ECOUT,ECPCNT,ECP,ECPNM,ECPREV,ECREAS,ECVOLU,ECEXIT | 
|---|
| 66 | N ECX,ECMOD,ECMODS,ECCPT,ECDT | 
|---|
| 67 | I '$D(ECL)!('$D(ECD)) G ASKPROQ | 
|---|
| 68 | S ECC=+$G(ECC) | 
|---|
| 69 | S ECOUNT=0 | 
|---|
| 70 | S ECDT=$O(^TMP("ECPRDT",$J,0)) | 
|---|
| 71 | D PROS^ECHECK1 | 
|---|
| 72 | I '$O(^TMP("ECPRO",$J,0)) D  G ASKPROQ | 
|---|
| 73 | . W !!,"Within the ",ECLN," location there are no procedures defined",! | 
|---|
| 74 | . W "for the DSS Unit ",$P(ECDSSU,"^",2),".",! | 
|---|
| 75 | . S DIR(0)="E" D ^DIR K DIR,Y | 
|---|
| 76 | ; | 
|---|
| 77 | SEL ; | 
|---|
| 78 | K ECPNAME,ECMOD | 
|---|
| 79 | S (ECPNM,ECPREV,ECREAS,ECX)="",(CNT,ECPCNT,ECP,ECVOLU,ECEXIT)=0 | 
|---|
| 80 | S DIR("?")="^D LISTPR^ECMUTL" | 
|---|
| 81 | W ! S ECX=$$GETPRO^ECDSUTIL | 
|---|
| 82 | I +$G(ECX)=-1,('ECOUNT) D MSG^ECBEN2U,KILLV^ECDSUTIL G ASKPROQ | 
|---|
| 83 | I +$G(ECX)=-1,ECOUNT G ASKPROQ | 
|---|
| 84 | I +$G(ECX)=1 S ECPREV=$P(ECX,"^",2) D SRCHTM^ECDSUTIL(ECX) | 
|---|
| 85 | S ECPCNT=+$G(ECPCNT) | 
|---|
| 86 | I ECPCNT=-1!(ECPCNT=-2) D  G SEL | 
|---|
| 87 | . D @($S(ECPCNT=-1:"ERRMSG^ECDSUTIL",ECPCNT=-2:"ERRMSG2^ECDSUTIL")) | 
|---|
| 88 | . D KILLV^ECDSUTIL | 
|---|
| 89 | I ECPCNT>0 D  D CONTINU G:$G(ECERR) ASKPROQ | 
|---|
| 90 | . S CNT=ECPCNT | 
|---|
| 91 | . I ECPREV="L" W $P($G(^TMP("ECPRO",$J,+$G(^TMP("ECLKUP",$J,"LAST")))),"^",4) | 
|---|
| 92 | . I ECPREV="X"!(ECPREV="N") W "   "_$P($G(^TMP("ECPRO",$J,+CNT)),"^",4) | 
|---|
| 93 | I 'ECPCNT,$D(ECPNAME) D  G:CNT=-1!($G(ECERR)) ASKPROQ | 
|---|
| 94 | . S CNT=$$PRLST^ECDSUTIL | 
|---|
| 95 | . I CNT=-1 D MSG^ECBEN2U,KILLV^ECDSUTIL Q | 
|---|
| 96 | . I CNT>0 D | 
|---|
| 97 | .. W "   "_$S(ECPREV="S":$P($G(^TMP("ECPRO",$J,+CNT)),"^",3),1:$P($G(^TMP("ECPRO",$J,+CNT)),"^",4)) | 
|---|
| 98 | .. D CONTINU | 
|---|
| 99 | ; | 
|---|
| 100 | I CNT>0,($G(ECP)'=""),(ECVOLU>0) D | 
|---|
| 101 | . S ECOUNT=$S(+$G(NUM)=-99:1,+$G(NUM)>0:NUM,1:(ECOUNT+1)) | 
|---|
| 102 | . S ^TMP("ECPROC",$J,(ECOUNT))=ECP_"^"_ECPNM_"^"_+ECREAS_"^"_$S(+ECREAS:$P($G(^ECR($P($G(^ECL(+ECREAS,0)),"^"),0)),"^"),1:"Reason Not Defined")_"^"_ECVOLU | 
|---|
| 103 | . S ECCPT=$S(ECP["EC":$P($G(^EC(725,+ECP,0)),"^",5),1:+ECP) | 
|---|
| 104 | . I ECCPT'="",$O(ECMOD(ECCPT,""))'="" D | 
|---|
| 105 | . . M ^TMP("ECPROC",$J,ECOUNT,"MOD")=ECMOD(ECCPT) | 
|---|
| 106 | I '$G(NUM) G SEL | 
|---|
| 107 | ASKPROQ K ^TMP("ECPRO",$J),^TMP("ECLKUP",$J),JJ,OK | 
|---|
| 108 | D KILLV^ECDSUTIL | 
|---|
| 109 | Q | 
|---|
| 110 | ; | 
|---|
| 111 | CONTINU ; | 
|---|
| 112 | D SETP | 
|---|
| 113 | S ECCPT=$S(ECP["EC":$P($G(^EC(725,+ECP,0)),"^",5),1:+ECP) | 
|---|
| 114 | I ECCPT'="" D  I $G(ECERR) G CONTINUQ | 
|---|
| 115 | . S ECMODS=$G(ECMODS) | 
|---|
| 116 | . S ECMODF=$$ASKMOD^ECUTL(ECCPT,ECMODS,ECDT,.ECMOD,.ECERR) | 
|---|
| 117 | . K ECMODF,ECMODS | 
|---|
| 118 | S ECREAS=$$ASKREAS(ECL,ECD,ECC,ECP,.ECERR) | 
|---|
| 119 | G:$G(ECERR) CONTINUQ | 
|---|
| 120 | S ECVOLU=$$ASKVOL(ECL,ECD,ECC,ECP,.ECERR) | 
|---|
| 121 | CONTINUQ Q | 
|---|
| 122 | ; | 
|---|
| 123 | SETP ; | 
|---|
| 124 | S ^TMP("ECLKUP",$J,"LAST")=CNT | 
|---|
| 125 | S ECP=$P($G(^TMP("ECPRO",$J,CNT)),"^"),ECPNM=$P($G(^TMP("ECPRO",$J,CNT)),"^",4) | 
|---|
| 126 | Q | 
|---|
| 127 | ; | 
|---|
| 128 | LISTPR ;- List available procedures | 
|---|
| 129 | ;   Input:        None | 
|---|
| 130 | ; | 
|---|
| 131 | ;  Output:        None (display on screen) | 
|---|
| 132 | ; | 
|---|
| 133 | N DIR,DIRUT,ECI,Y | 
|---|
| 134 | S ECI=0 | 
|---|
| 135 | D PROCHDR | 
|---|
| 136 | F   S ECI=$O(^TMP("ECPRO",$J,ECI)) Q:'ECI!(ECEXIT)  D | 
|---|
| 137 | . I ($Y+5>IOSL) S DIR(0)="E" D ^DIR S:'Y!$D(DIRUT) ECEXIT=1 I +Y D PROCHDR | 
|---|
| 138 | . Q:ECEXIT | 
|---|
| 139 | . W !,ECI_".",?5,$E($P(^TMP("ECPRO",$J,ECI),"^",4),1,30),?38,$E($P(^(ECI),"^",3),1,30),?72,$P(^(ECI),"^",5) | 
|---|
| 140 | Q:ECEXIT | 
|---|
| 141 | W !!?5,"Select by number, CPT or national code, procedure name, or synonym.",!?5,"Synonym must be preceded by the & character  (example:  &TESTSYN).",! | 
|---|
| 142 | W ?2,"** Modifier(s) can be appended to a CPT code (ex: CPT code-mod1,mod2,mod3) **",! | 
|---|
| 143 | LISTPRQ Q | 
|---|
| 144 | ; | 
|---|
| 145 | PROCHDR ;- Procedure display header | 
|---|
| 146 | ; | 
|---|
| 147 | W @IOF | 
|---|
| 148 | W !,"Available Procedures within "_$P(ECDSSU,"^",2)_": ",! | 
|---|
| 149 | W ?72,"National",!,?5,"Procedure Name",?40,"Synonym",?72,"Number",! | 
|---|
| 150 | Q | 
|---|
| 151 | ; | 
|---|
| 152 | ; | 
|---|
| 153 | ASKREAS(ECL,ECD,ECC,ECP,ECOUT) ;-Ask procedure reason | 
|---|
| 154 | ;   Input:      ECL = Location ien | 
|---|
| 155 | ;               ECD = DSS Unit ien | 
|---|
| 156 | ;               ECC = Category ien | 
|---|
| 157 | ;               ECP = Procedure ien | 
|---|
| 158 | ; | 
|---|
| 159 | ;  Output:  ECPRPTR = Link file ien (from file #720.5) | 
|---|
| 160 | ;             ECOUT = 0 if successful | 
|---|
| 161 | ;                     1 if uparrowed or timed out | 
|---|
| 162 | ;                     (passed by reference) | 
|---|
| 163 | ; | 
|---|
| 164 | N DTOUT,DUOUT,ECPRPTR,ECSCR | 
|---|
| 165 | S (ECOUT,ECPRPTR,ECSCR)=0 | 
|---|
| 166 | S ECC=+$G(ECC) | 
|---|
| 167 | I '$D(ECL)!('$D(ECD))!('$D(ECP)) G ASKREASQ | 
|---|
| 168 | I $G(ECP)]"" S ECSCR=+$O(^ECJ("AP",+ECL,+ECD,+ECC,ECP,0)) | 
|---|
| 169 | I ECSCR>0,(+$P($G(^ECJ(ECSCR,"PRO")),"^",5)),(+$O(^ECL("AD",ECSCR,0))) D | 
|---|
| 170 | . S DIC="^ECL(",DIC(0)="QEAM" | 
|---|
| 171 | . S DIC("A")="Procedure Reason: ",DIC("S")="I $P(^(0),U,2)=ECSCR" | 
|---|
| 172 | . D ^DIC K DIC | 
|---|
| 173 | . I +Y>0 S ECPRPTR=+Y | 
|---|
| 174 | . I $D(DTOUT)!($D(DUOUT)) S ECOUT=1 | 
|---|
| 175 | ASKREASQ Q +ECPRPTR | 
|---|
| 176 | ; | 
|---|
| 177 | ; | 
|---|
| 178 | ASKVOL(ECL,ECD,ECC,ECP,ECOUT) ;- Ask procedure volume | 
|---|
| 179 | ;   Input:    ECL = Location ien | 
|---|
| 180 | ;             ECD = DSS Unit ien | 
|---|
| 181 | ;             ECC = Category ien | 
|---|
| 182 | ;             ECP = Procedure ien | 
|---|
| 183 | ; | 
|---|
| 184 | ;  Output:  ECVOL = volume | 
|---|
| 185 | ;           ECOUT = 0 if successful | 
|---|
| 186 | ;                   1 if uparrowed or timed out | 
|---|
| 187 | ;                   (passed by reference) | 
|---|
| 188 | ; | 
|---|
| 189 | N DIR,DIRUT,DTOUT,DUOUT,ECSCR,ECVOL | 
|---|
| 190 | S (ECOUT,ECSCR,ECVOL)=0 | 
|---|
| 191 | S ECC=+$G(ECC) | 
|---|
| 192 | I '$D(ECL)!('$D(ECD))!('$D(ECP)) G ASKVOLQ | 
|---|
| 193 | I $G(ECP)]"" S ECSCR=+$O(^ECJ("AP",+ECL,+ECD,+ECC,ECP,0)) | 
|---|
| 194 | S DIR(0)="N^^K:(X<1)!(X>99) X",DIR("A")="Volume" | 
|---|
| 195 | S DIR("?")="Type a Number between 1 and 99, 0 Decimal Digits" | 
|---|
| 196 | S DIR("B")=$S($P($G(^ECJ(ECSCR,"PRO")),"^",3):$P($G(^ECJ(ECSCR,"PRO")),"^",3),1:1) | 
|---|
| 197 | D ^DIR | 
|---|
| 198 | I +Y S ECVOL=Y | 
|---|
| 199 | I $D(DIRUT) S ECOUT=1 | 
|---|
| 200 | ASKVOLQ Q +ECVOL | 
|---|
| 201 | ; | 
|---|
| 202 | ; | 
|---|
| 203 | PROV(ECDT,ECPROVS) ;get providers - new providers function | 
|---|
| 204 | ;- This is the same function as PROV^ECPRVUTL | 
|---|
| 205 | ;- Select provider(s) with active person class | 
|---|
| 206 | ;- No updating of file #721 record is done here | 
|---|
| 207 | ; | 
|---|
| 208 | ;   input | 
|---|
| 209 | ;   ECDT    = date/time of procedure (required) | 
|---|
| 210 | ;   ECPROVS = local array, passed by reference (required) | 
|---|
| 211 | ; | 
|---|
| 212 | ;   output | 
|---|
| 213 | ;   ECU(1)  = provider #1 (mandatory) ien^provider #1 name^person class | 
|---|
| 214 | ;   ECU(2)  = provider #2 (optional) ien^provider #2 name^person class | 
|---|
| 215 | ;   ECU(3)  = provider #3 (optional) ien^provider #3 name^person class | 
|---|
| 216 | ; | 
|---|
| 217 | ;   returns | 
|---|
| 218 | ;       0 ==> prov selection successful; at least prov #1 selected | 
|---|
| 219 | ;       1 ==> selection unsuccessful or user timed-out | 
|---|
| 220 | ;       2 ==> selection unsuccessful or user entered "^" | 
|---|
| 221 | ; | 
|---|
| 222 | N ECU,ECU2,ECU3,ECDA | 
|---|
| 223 | D GET^ECPRVUTL("",ECDT,.ECU,.ECU2,.ECU3,.ECOUT) | 
|---|
| 224 | S ECPROVS(1)=ECU,ECPROVS(2)=ECU2,ECPROVS(3)=ECU3 | 
|---|
| 225 | Q ECOUT | 
|---|
| 226 | ; | 
|---|
| 227 | ONEUNIT(ECDSSU) ;- Create ECDSSU containing DSS Unit | 
|---|
| 228 | ;  Checks for validity and access to Unit | 
|---|
| 229 | ; | 
|---|
| 230 | ;   input | 
|---|
| 231 | ;   ECDSSU = passed by reference | 
|---|
| 232 | ; | 
|---|
| 233 | ;   output | 
|---|
| 234 | ;   ECDDSU = ien in file #724^name of DSS unit  OR | 
|---|
| 235 | ;            undefined | 
|---|
| 236 | ; | 
|---|
| 237 | ;   returns ECOUT = 0  if unit selection sucessful  OR | 
|---|
| 238 | ;                   1  if user times out; selection unsuccessful | 
|---|
| 239 | ;                   2  if user up-arrows out; selection unsuccessful | 
|---|
| 240 | ;   Note: if selection is unsuccessful, variable ECDSSU will be undefined. | 
|---|
| 241 | ; | 
|---|
| 242 | N Y,DIRUT,DUOUT,ECKEY,ECOUT | 
|---|
| 243 | S ECKEY=$S($D(^XUSEC("ECALLU",DUZ)):1,1:0) | 
|---|
| 244 | F  S ECOUT=0 D  Q:$G(ECOUT)  Q:$G(ECDSSU) | 
|---|
| 245 | .K DUOUT,DTOUT,DIRUT,Y | 
|---|
| 246 | .W ! | 
|---|
| 247 | .S DIC=724,DIC("A")="Select DSS Unit: ",DIC(0)="QEAMZ" | 
|---|
| 248 | .S DIC("S")="I ECKEY!($D(^VA(200,DUZ,""EC"",+Y)))" | 
|---|
| 249 | .D ^DIC K DIC | 
|---|
| 250 | .S:$D(DTOUT) ECOUT=1 S:$D(DUOUT) ECOUT=2 | 
|---|
| 251 | .Q:$G(ECOUT) | 
|---|
| 252 | .I +Y>0 D  Q | 
|---|
| 253 | .. I $$VALID(+Y) S ECDSSU=Y | 
|---|
| 254 | .. I '$$VALID(+Y) D | 
|---|
| 255 | ...S Y=-1 | 
|---|
| 256 | ...W !!,?5,"This DSS Unit is either inactive or cannot be used" | 
|---|
| 257 | ...W !,?5,"in Event Capture.  Please select a different DSS Unit.",! | 
|---|
| 258 | .I +Y<0 D  Q | 
|---|
| 259 | ..W !!,?5,"A response is required...try again." | 
|---|
| 260 | ..W !,?5,"You must enter an ""^"" to exit." | 
|---|
| 261 | .K DIR,DUOUT,DTOUT,DIRUT | 
|---|
| 262 | .W ! S DIR(0)="YA",DIR("A")="Is this correct? ",DIR("B")="YES" | 
|---|
| 263 | .S DIR("?")="Answer YES to accept the unit, NO to start over." | 
|---|
| 264 | .D ^DIR K DIR | 
|---|
| 265 | .I $D(DIRUT) S:$D(DTOUT) ECOUT=1 S:$D(DUOUT) ECOUT=2 K ECDSSU Q | 
|---|
| 266 | .I '$G(Y) K ECDSSU | 
|---|
| 267 | Q ECOUT | 
|---|
| 268 | ; | 
|---|
| 269 | VALID(IEN) ;- Check DSS Unit for use by Event Capture | 
|---|
| 270 | ; | 
|---|
| 271 | N NODE,NO,YES,VAL | 
|---|
| 272 | S NODE=$G(^ECD(IEN,0)) | 
|---|
| 273 | ;piece 6 is 'inactive'; piece 8 is 'use with EC' | 
|---|
| 274 | S NO=$P(NODE,"^",6),YES=$P(NODE,"^",8) | 
|---|
| 275 | ;start out with 'valid' | 
|---|
| 276 | S VAL=1 D | 
|---|
| 277 | .;if 'inactive', then 'not valid' | 
|---|
| 278 | .I NO S VAL=0 Q | 
|---|
| 279 | .;if not 'use with EC', then 'not valid' | 
|---|
| 280 | .I 'YES S VAL=0 | 
|---|
| 281 | Q VAL | 
|---|