| 1 | IBDF18A ;ALB/CJM/AAS - ENCOUNTER FORM - utilities for PCE ;12-AUG-94 | 
|---|
| 2 | ;;3.0;AUTOMATED INFO COLLECTION SYS;**34,38,51**;APR 24, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | GLL(CLINIC,INTRFACE,ARY,FILTER,PAR5,PAR6,ENCDATE) ; -- get lots of lists in one call | 
|---|
| 5 | ; -- input see GETLST but pass interface by reference expects | 
|---|
| 6 | ;    intrface(n) = name of select list in package interface file | 
|---|
| 7 | ; | 
|---|
| 8 | ; -- PAR5 => not currently used | 
|---|
| 9 | ; -- PAR6 => not currently used | 
|---|
| 10 | ; | 
|---|
| 11 | ; -- output see GETLST | 
|---|
| 12 | N X,COUNT | 
|---|
| 13 | S COUNT=0 | 
|---|
| 14 | S X="" F  S X=$O(INTRFACE(X)) Q:X=""  D GETLST(CLINIC,INTRFACE(X),ARY,$G(FILTER),.COUNT,$G(PAR6),ENCDATE) | 
|---|
| 15 | Q | 
|---|
| 16 | ; | 
|---|
| 17 | GETLST(CLINIC,INTRFACE,ARY,FILTER,COUNT,MODIFIER,ENCDATE) ; -- returns any specified selection list for a clinic | 
|---|
| 18 | ; -- input  CLINIC = pointer to hospital location file for clinic | 
|---|
| 19 | ;         INTRFACE = name of selection list in package interface file | 
|---|
| 20 | ;              ARY = name of array to return list in | 
|---|
| 21 | ;           FILTER = predefined filters (optional, default = 1) | 
|---|
| 22 | ;                                       1 = must be selection list | 
|---|
| 23 | ;                                       2 = only visit cpts on list | 
|---|
| 24 | ;          ENCDATE = encounter date | 
|---|
| 25 | ;         MODIFIER = if modifiers are to be passed, 1=yes send modifiers | 
|---|
| 26 | ; | 
|---|
| 27 | ; -- output  The format of the returned array is as follows | 
|---|
| 28 | ;         @ARY@(0) = count of array element (0 of nothing found) | 
|---|
| 29 | ;         @ARY@(1) = ^group header | 
|---|
| 30 | ;         @ARY@(2) = P1 := cpt or icd code / ien of other items | 
|---|
| 31 | ;                    P2 := user defined text | 
|---|
| 32 | ;                    p6 := user defined expanded text to send to PCE | 
|---|
| 33 | ;                    p7 := second code or item defined for line item | 
|---|
| 34 | ;                    p8 := third code or item defined for line item | 
|---|
| 35 | ;                    p9 := associated clinical lexicon term | 
|---|
| 36 | ; | 
|---|
| 37 | ;         @ARY@(2,"MODIFIER",0)=count of CPT Modifiers for entry | 
|---|
| 38 | ;         @ARY@(2,"MODIFIER",1)=2 character CPT Modifier value | 
|---|
| 39 | ;         @ARY@(2,"MODIFIER",2)=2 character CPT Modifier value | 
|---|
| 40 | ;         @ARY@(2,"MODIFIER",k+1)=2 character CPT Modifier value | 
|---|
| 41 | ; | 
|---|
| 42 | ;         @ARY@(k) = ^next group header | 
|---|
| 43 | ;         @ARY@(k+1) = problem ien or cpt or icd code^user define text | 
|---|
| 44 | ; | 
|---|
| 45 | ; -- output modification for patch 34: | 
|---|
| 46 | ;         Narrative to Send to PCE (instead of printed text) | 
|---|
| 47 | ;         field (2.01) in file 357.3, added as piece 6 of @ary@(n) | 
|---|
| 48 | ; | 
|---|
| 49 | ;         if additional codes for an item (diagnosis) are added to | 
|---|
| 50 | ;         item, they are added as pieces 7 and/or 8 of @ary@(n). | 
|---|
| 51 | ; | 
|---|
| 52 | ;         if a type of visit code is requested and none found, will | 
|---|
| 53 | ;         automatically look first for blocks named type of visit and | 
|---|
| 54 | ;         second for filtered codes using regular cpt blocks. | 
|---|
| 55 | ; | 
|---|
| 56 | ;         if a diagnosis block it requested and none found will | 
|---|
| 57 | ;         automagically look for Clinic Common Problem List and | 
|---|
| 58 | ;         then convert it to look like a diagnosis list | 
|---|
| 59 | ; | 
|---|
| 60 | N I,J,X,Y,INUM,IBQUIT,FORM,SETUP,LIST,BLOCK,OLDARY,IBDTMP,ROW,COL,BLK | 
|---|
| 61 | N LIST1,PACKAGE | 
|---|
| 62 | K ^TMP("IBDUP",$J) | 
|---|
| 63 | S (IBQUIT,LIST)=0 | 
|---|
| 64 | S PACKAGE=$E(INTRFACE,1,30) | 
|---|
| 65 | ; | 
|---|
| 66 | ;Setup array containing NAME of the Package Interface file | 
|---|
| 67 | ;This is the second paramenter passed by PCE, TIU, & CPRS | 
|---|
| 68 | S LIST1("DG SELECT CPT PROCEDURE CODES")="" | 
|---|
| 69 | S LIST1("DG SELECT ICD-9 DIAGNOSIS CODE")="" | 
|---|
| 70 | S LIST1("DG SELECT VISIT TYPE CPT PROCE")="" | 
|---|
| 71 | S LIST1("GMP INPUT CLINIC COMMON PROBLE")="" | 
|---|
| 72 | S LIST1("GMP PATIENT ACTIVE PROBLEMS")="" | 
|---|
| 73 | ; | 
|---|
| 74 | S COUNT=$G(COUNT,0) | 
|---|
| 75 | I $G(FILTER)<1 S FILTER=1 ;default value=1 | 
|---|
| 76 | I FILTER>1 S OLDARY=ARY,ARY="IBDTMP" | 
|---|
| 77 | S @ARY@(0)=+$G(@ARY@(0)) | 
|---|
| 78 | I $G(CLINIC)="" G GETLSTQ | 
|---|
| 79 | I $G(^SC(CLINIC,0))="" G GETLSTQ | 
|---|
| 80 | I $G(INTRFACE)="" G GETLSTQ | 
|---|
| 81 | S INUM=$O(^IBE(357.6,"B",$E(INTRFACE,1,30),0)) | 
|---|
| 82 | ; | 
|---|
| 83 | ; -- find forms defined for clinic | 
|---|
| 84 | ;    piece 2 = basic form | 
|---|
| 85 | ;    piece 3,4,6 = supplemental forms | 
|---|
| 86 | S SETUP=$G(^SD(409.95,+$O(^SD(409.95,"B",CLINIC,0)),0)) | 
|---|
| 87 | G:SETUP="" GETLSTQ | 
|---|
| 88 | F I=2,3,4,6,8,9 S FORM=$P(SETUP,"^",I) D  Q:IBQUIT | 
|---|
| 89 | .; | 
|---|
| 90 | .; -- find blocks on forms | 
|---|
| 91 | .Q:'FORM | 
|---|
| 92 | . D GETBLKS Q:'$O(BLK(0)) | 
|---|
| 93 | . S (ROW,COL)="" | 
|---|
| 94 | . F  S ROW=$O(BLK(ROW)) Q:ROW=""  S COL="" F  S COL=$O(BLK(ROW,COL)) Q:COL=""  S BLOCK=$G(BLK(+ROW,+COL)) D | 
|---|
| 95 | ..; | 
|---|
| 96 | ..; -- see if package interface defined for blocks | 
|---|
| 97 | ..S LIST=0 | 
|---|
| 98 | ..F  S LIST=$O(^IBE(357.2,"C",BLOCK,LIST)) Q:'LIST  I $P($G(^IBE(357.2,LIST,0)),"^",11)=INUM D COPYLIST^IBDF18A1(LIST,ARY,.COUNT) | 
|---|
| 99 | ;I COUNT D URH^IBDF18A1 | 
|---|
| 100 | S @ARY@(0)=COUNT | 
|---|
| 101 | I FILTER=2 D F2^IBDF18A1(OLDARY) | 
|---|
| 102 | ; | 
|---|
| 103 | I COUNT=0 D | 
|---|
| 104 | .I $E(INTRFACE,1,30)=$E("DG SELECT VISIT TYPE CPT PROCEDURES",1,30) D TOV | 
|---|
| 105 | ; | 
|---|
| 106 | ; -- always check for both diagnosis and clinic common problems when | 
|---|
| 107 | ;    looking for diagnosis, return in diagnosis format | 
|---|
| 108 | I $E(INTRFACE,1,30)=$E("DG SELECT ICD-9 DIAGNOSIS CODES",1,30) D CCP(COUNT) | 
|---|
| 109 | ;This routine checks list that have CPT & ICD codes for CSV. | 
|---|
| 110 | D CHKLST^IBDF18A2:$D(LIST1(PACKAGE)) | 
|---|
| 111 | ; | 
|---|
| 112 | K ^TMP("IBDUP",$J) | 
|---|
| 113 | ; | 
|---|
| 114 | GETLSTQ Q | 
|---|
| 115 | ; | 
|---|
| 116 | GETBLKS ; -- get the blocks for a form in row,column order | 
|---|
| 117 | K BLK | 
|---|
| 118 | N ROW,COL | 
|---|
| 119 | S BLK=0 | 
|---|
| 120 | F  S BLK=$O(^IBE(357.1,"C",FORM,BLK)) Q:'BLK  D | 
|---|
| 121 | . S ROW=$P($G(^IBE(357.1,+BLK,0)),"^",4),COL=$P(^(0),"^",5) | 
|---|
| 122 | . Q:ROW=""!(COL="") | 
|---|
| 123 | . S BLK(ROW,COL)=BLK | 
|---|
| 124 | Q | 
|---|
| 125 | ; | 
|---|
| 126 | CCP(COUNT) ; -- no diagnosis, look for common problems and convert | 
|---|
| 127 | N I,X,OLDCNT | 
|---|
| 128 | S OLDCNT=COUNT | 
|---|
| 129 | ; | 
|---|
| 130 | ; -- get the clinic common problem list | 
|---|
| 131 | D GETLST(CLINIC,"GMP SELECT CLINIC COMMON PROBLEMS",ARY,"",COUNT) | 
|---|
| 132 | ; | 
|---|
| 133 | ; -- now convert it to primary icd code save lexicon pointer in piece 6 | 
|---|
| 134 | S I=OLDCNT | 
|---|
| 135 | F  S I=$O(VAR(I)) Q:I=""  D | 
|---|
| 136 | .S X=+VAR(I) | 
|---|
| 137 | . S:X $P(VAR(I),"^",9)=X,$P(VAR(I),"^",1)=$$ICDONE^LEXU(X) | 
|---|
| 138 | . I $P(VAR(I),"^",7) S $P(VAR(I),"^",7)=$$ICDONE^LEXU($P(VAR(I),"^",7)) | 
|---|
| 139 | . I $P(VAR(I),"^",8) S $P(VAR(I),"^",8)=$$ICDONE^LEXU($P(VAR(I),"^",8)) | 
|---|
| 140 | Q | 
|---|
| 141 | ; | 
|---|
| 142 | TOV ; -- if trying to find Type of Visit codes but list on form | 
|---|
| 143 | ;    uses another interface try this | 
|---|
| 144 | ; | 
|---|
| 145 | N INUM | 
|---|
| 146 | S INUM=0 | 
|---|
| 147 | F  S INUM=$O(^IBE(357.6,"B","DG SELECT CPT PROCEDURE CODES",INUM)) Q:'INUM  S INUM(INUM)="" | 
|---|
| 148 | D TOV1 | 
|---|
| 149 | I COUNT=0 D TOV2 | 
|---|
| 150 | Q | 
|---|
| 151 | ; | 
|---|
| 152 | TOV1 ; -- first get all lists for blocks named Type of Visit or E&M | 
|---|
| 153 | N NM,HD | 
|---|
| 154 | F I=2,3,4,6,8,9 S FORM=$P(SETUP,"^",I) D:+FORM  Q:IBQUIT | 
|---|
| 155 | . ; | 
|---|
| 156 | . ; -- find blocks on forms | 
|---|
| 157 | . D GETBLKS Q:'$O(BLK(0)) | 
|---|
| 158 | . S (ROW,COL)="" | 
|---|
| 159 | . F  S ROW=$O(BLK(ROW)) Q:ROW=""  S COL="" F  S COL=$O(BLK(ROW,COL)) Q:COL=""  S BLOCK=$G(BLK(+ROW,+COL)) D | 
|---|
| 160 | .. ; | 
|---|
| 161 | .. S NM=$P($G(^IBE(357.1,BLOCK,0)),"^",1) | 
|---|
| 162 | .. S NM=$TR(NM,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") | 
|---|
| 163 | .. S HD=$P($G(^IBE(357.1,BLOCK,0)),"^",11) | 
|---|
| 164 | .. S HD=$TR(HD,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") | 
|---|
| 165 | .. I NM["TYPE OF VISIT"!(NM["VISIT TYPE")!(HD["TYPE OF VISIT")!(HD["VISIT TYPE")!(NM["E&M")!(NM["E & M")!(HD["E&M")!(HD["E & M") D | 
|---|
| 166 | ... S LIST=0 | 
|---|
| 167 | ... F  S LIST=$O(^IBE(357.2,"C",BLOCK,LIST)) Q:'LIST  D | 
|---|
| 168 | .... I $D(INUM($P($G(^IBE(357.2,LIST,0)),"^",11))) D COPYLIST^IBDF18A1(LIST,ARY,.COUNT) K BLK(ROW,COL) | 
|---|
| 169 | Q | 
|---|
| 170 | ; | 
|---|
| 171 | TOV2 ; -- get the type of visit codes from cpt lists using filter | 
|---|
| 172 | S OLDARY=ARY,ARY="IBDTMP" | 
|---|
| 173 | S @ARY@(0)=+$G(@ARY@(0)) | 
|---|
| 174 | ; | 
|---|
| 175 | F I=2,3,4,6,8,9 S FORM=$P(SETUP,"^",I) D:+FORM  Q:IBQUIT | 
|---|
| 176 | . ; | 
|---|
| 177 | . ; -- find blocks on forms | 
|---|
| 178 | . S (ROW,COL)="" | 
|---|
| 179 | . F  S ROW=$O(BLK(ROW)) Q:ROW=""  S COL="" F  S COL=$O(BLK(ROW,COL)) Q:COL=""  S BLOCK=$G(BLK(+ROW,+COL)) D | 
|---|
| 180 | .. ; | 
|---|
| 181 | .. ; -- see if package interface defined for blocks | 
|---|
| 182 | .. S LIST=0 | 
|---|
| 183 | .. F  S LIST=$O(^IBE(357.2,"C",BLOCK,LIST)) Q:'LIST  I $D(INUM($P($G(^IBE(357.2,LIST,0)),"^",11))) D COPYLIST^IBDF18A1(LIST,ARY,.COUNT) | 
|---|
| 184 | D F2^IBDF18A1(OLDARY) | 
|---|
| 185 | Q | 
|---|
| 186 | ; | 
|---|
| 187 | ; -- here are some sample tests for different lists | 
|---|
| 188 | TEST1 K VAR D GETLST(573,"DG SELECT ICD-9 DIAGNOSIS CODES","VAR",1,"","",DT) | 
|---|
| 189 | X "ZW VAR" | 
|---|
| 190 | Q | 
|---|
| 191 | ; | 
|---|
| 192 | TEST2 K VAR D GETLST(301,"DG SELECT ICD-9 DIAGNOSIS CODES","VAR",1,"","",DT) | 
|---|
| 193 | X "ZW VAR" | 
|---|
| 194 | Q | 
|---|
| 195 | ; | 
|---|
| 196 | TEST4 K VAR D GETLST(300,"DG SELECT VISIT TYPE CPT PROCEDURES","VAR",1,"",1,DT) | 
|---|
| 197 | X "ZW VAR" | 
|---|
| 198 | Q | 
|---|
| 199 | ; | 
|---|
| 200 | TEST5 K VAR D GETLST(300,"PX SELECT IMMUNIZATIONS","VAR",1,DT) | 
|---|
| 201 | X "ZW VAR" | 
|---|
| 202 | Q | 
|---|
| 203 | ; | 
|---|
| 204 | TEST5A K VAR D GETLST(300,"PX SELECT SKIN TESTS","VAR",1,DT) | 
|---|
| 205 | X "ZW VAR" | 
|---|
| 206 | Q | 
|---|
| 207 | ; | 
|---|
| 208 | TEST6 K VAR D GETLST(573,"DG SELECT CPT PROCEDURE CODES","VAR",1,"",1,DT) | 
|---|
| 209 | X "ZW VAR" | 
|---|
| 210 | Q | 
|---|
| 211 | ; | 
|---|
| 212 | TEST7 K VAR D GETLST(573,"DG SELECT VISIT TYPE CPT PROCEDURES","VAR",1,"",1,DT) | 
|---|
| 213 | X "ZW VAR" | 
|---|
| 214 | Q | 
|---|
| 215 | ; | 
|---|
| 216 | TEST8 ; -- use this to test CPRS ability to retrieve type of visit | 
|---|
| 217 | ;    set clinic := name or internal entry number of clinic or change | 
|---|
| 218 | ;    value for specific clinic | 
|---|
| 219 | K VAR | 
|---|
| 220 | I $G(CLINIC)="" S CLINIC=300 | 
|---|
| 221 | I CLINIC'=+CLINIC W !,"Using Clinic: ",CLINIC S CLINIC=$O(^SC("B",CLINIC,0)) W !,"IEN: ",CLINIC,! H 5 | 
|---|
| 222 | X "D VISIT^ORWPCE(.VAR,CLINIC) ZW VAR" | 
|---|
| 223 | Q | 
|---|
| 224 | ; | 
|---|
| 225 | TEST9 K VAR D GETLST(301,"GMP SELECT CLINIC COMMON PROBLEMS","VAR",1) | 
|---|
| 226 | X "ZW VAR" | 
|---|
| 227 | Q | 
|---|