| [613] | 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
 | 
|---|