| 1 | ORWDBA2 ; SLC/GDU - Billing Awareness - Phase I [11/26/04 15:43] | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**195**;Dec 17, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | ;Clinician's Personal Diagnoses List | 
|---|
| 5 | ;The personal diagnoses list is stored in the NEW PERSON file # 200. | 
|---|
| 6 | ;In file # 200 it is stored in the multi-valued field PERSONAL DIAGNOSIS | 
|---|
| 7 | ;LIST, field # 351, sub-file 200.0351. This is unique to the individual | 
|---|
| 8 | ;clinician. It is designed to aid the clinician with the CIDC process | 
|---|
| 9 | ;by providing a list of diagnoses codes most frequently used by that | 
|---|
| 10 | ;clinician. | 
|---|
| 11 | ; | 
|---|
| 12 | ;External References: | 
|---|
| 13 | ;  NOW^%DTC             DBIA 10000 | 
|---|
| 14 | ;  FILE^DIE             DBIA 2053 | 
|---|
| 15 | ;  UPDATE^DIE           DBIA 2053 | 
|---|
| 16 | ;  DT^DILF              DBIA 2054 | 
|---|
| 17 | ;  FDA^FILF             DBIA 2054 | 
|---|
| 18 | ;  $$GET1^DIQ           DBIA 2056 | 
|---|
| 19 | ;  GETS^DIQ             DBIA 2056 | 
|---|
| 20 | ;  $$STATCHK^ICDAPIU    DBIA 3991 | 
|---|
| 21 | ;  $$ICDDX^ICDCODE      DBIA 3990 | 
|---|
| 22 | ;  $$NOW^XLFDT          DBIA 10103 | 
|---|
| 23 | ; | 
|---|
| 24 | ADDPDL(Y,ORCIEN,ORDXA) ;Add to Personal Diagnosis List | 
|---|
| 25 | ;Add a new personal diagnosis list or new ICD9 code to an existing | 
|---|
| 26 | ;personal diagnosis list for a clinician. It will filter out duplicate | 
|---|
| 27 | ;entries before updating an existing PDL. | 
|---|
| 28 | ;Input Variables: | 
|---|
| 29 | ;  ORCIEN       Clinician Internal Entry Number | 
|---|
| 30 | ;  ORDXA        Array of dx codes to be added to personal dx list | 
|---|
| 31 | ;               format: ORDXA(#)=ICD9_Code^Lexicon_Expression_IEN | 
|---|
| 32 | ;Output Variable: | 
|---|
| 33 | ;  Y            Return value, 1 successful, 0 unsuccessful | 
|---|
| 34 | ;Local Variables: | 
|---|
| 35 | ;  DXI          Diagnosis Array Index | 
|---|
| 36 | ;  DXIEN        Diagnosis Code Internal Entry Number | 
|---|
| 37 | ;  EM           Error Message | 
|---|
| 38 | ;  FDXR         Found Diagnoses Records Array | 
|---|
| 39 | ;  FDXRI        Found Diagnoses Records Array Index | 
|---|
| 40 | ;  IEN          Internal Entry Number | 
|---|
| 41 | ;  PDL          Personal Diagnoses List Array | 
|---|
| 42 | ;  PDLI         Personal Diagnoses List Array Index | 
|---|
| 43 | N DXI,DXIEN,EM,FDXR,FDXRI,IEN,PDL,PDLI | 
|---|
| 44 | ;Gets clinician's Personal Diagnosis List and removes duplicates from | 
|---|
| 45 | ;dx input array. Quits if all are duplicates. | 
|---|
| 46 | D GETS^DIQ(200,ORCIEN,"351*,","","PDL","EM") | 
|---|
| 47 | I $D(PDL) D | 
|---|
| 48 | . S DXI="" F  S DXI=$O(ORDXA(DXI)) Q:DXI=""  D | 
|---|
| 49 | .. S PDLI="" F  S PDLI=$O(PDL(200.0351,PDLI)) Q:PDLI=""  D | 
|---|
| 50 | ... I PDL(200.0351,PDLI,.01)=$P($G(ORDXA(DXI)),U) K ORDXA(DXI) | 
|---|
| 51 | I $D(ORDXA)=0 S Y=0 Q | 
|---|
| 52 | ;Process dx input array | 
|---|
| 53 | S DXI="" F  S DXI=$O(ORDXA(DXI)) Q:DXI=""!($D(EM))  D | 
|---|
| 54 | . K FDXR,EM | 
|---|
| 55 | . ;Get the IEN for the current diagnosis code | 
|---|
| 56 | . D FIND^DIC(80,"","","CM",$P(ORDXA(DXI),U),"*","","","","FDXR","EM") | 
|---|
| 57 | . I $P(FDXR("DILIST",0),U)=0 Q | 
|---|
| 58 | . I $P(FDXR("DILIST",0),U)=1 S DXIEN=FDXR("DILIST",2,1) | 
|---|
| 59 | . I $P(FDXR("DILIST",0),U)>1 D | 
|---|
| 60 | .. F FDXRI=1:1:FDXR("DILIST",0) D | 
|---|
| 61 | ... I FDXR("DILIST",1,FDXRI)=$P($G(ORDXA(DXI)),U) S DXIEN=FDXR("DILIST",2,FDXRI) | 
|---|
| 62 | . ;Add IDC9 code to personal diagnoses list | 
|---|
| 63 | . K IEN | 
|---|
| 64 | . S IEN="1,"_ORCIEN_",",IEN="+"_IEN | 
|---|
| 65 | . D FDA^DILF(200.0351,IEN,.01,"",DXIEN,"FDA","EM") | 
|---|
| 66 | . D UPDATE^DIE("","FDA","IEN","EM") | 
|---|
| 67 | . ;Add Lexicon Expression list | 
|---|
| 68 | . I $P(ORDXA(DXI),U,2)'="" D | 
|---|
| 69 | .. S IEN=IEN(1)_","_ORCIEN_"," | 
|---|
| 70 | .. D FDA^DILF(200.0351,IEN,1,"",$P(ORDXA(DXI),U,2),"FDA","EM") | 
|---|
| 71 | .. D FILE^DIE("","FDA","EM") | 
|---|
| 72 | I $D(EM) S Y=0 Q | 
|---|
| 73 | S Y=1 | 
|---|
| 74 | Q | 
|---|
| 75 | ; | 
|---|
| 76 | DELPDL(Y,ORCIEN,ORDXA) ;Delete from Personal Diagnosis List | 
|---|
| 77 | ;Delete a selected diagnosis code or group of diagnoses codes from a | 
|---|
| 78 | ;Clinician's Personal DX List. | 
|---|
| 79 | ;Input Variables: | 
|---|
| 80 | ;  ORCIEN    Clinician Internal ID number | 
|---|
| 81 | ;  ORDXA     Array of dx codes to be deleted from personal dx list | 
|---|
| 82 | ;Output Variable: | 
|---|
| 83 | ;  Y         Return value, 1 successful, 0 unsuccessful | 
|---|
| 84 | ;Local Variables: | 
|---|
| 85 | ;  DXI       Diagnosis code array index | 
|---|
| 86 | ;  EM        Error Message | 
|---|
| 87 | ;  FDA       FileMan Data Array | 
|---|
| 88 | ;  IEN       Interanl Entry Number | 
|---|
| 89 | ;  RF        Record Found | 
|---|
| 90 | N DXI,EM,FDA,IEN,RF | 
|---|
| 91 | D GETS^DIQ(200,ORCIEN,"351*,","","RF","EM") | 
|---|
| 92 | I $D(RF)=0 S Y=0 Q | 
|---|
| 93 | S IEN="" F  S IEN=$O(RF(200.0351,IEN)) Q:IEN=""  D | 
|---|
| 94 | .S DXI="" F  S DXI=$O(ORDXA(DXI)) Q:DXI=""  D | 
|---|
| 95 | .. I RF(200.0351,IEN,.01)=ORDXA(DXI) D | 
|---|
| 96 | ... D FDA^DILF(200.0351,IEN,.01,"","@","FDA","EM") | 
|---|
| 97 | ... D FILE^DIE("","FDA","EM") | 
|---|
| 98 | S Y=1 | 
|---|
| 99 | Q | 
|---|
| 100 | ; | 
|---|
| 101 | GETPDL(Y,ORCIEN) ;Get Personal Diagnosis List | 
|---|
| 102 | ;This gets the clinician's personal diagnosis list. Using the personal | 
|---|
| 103 | ;diagnosis list, builds and returns an array variable with the ICD9 | 
|---|
| 104 | ;codes and descriptions stored in the ICD DIAGNOSIS file, # 80. | 
|---|
| 105 | ;Flagging any inactive ICD9 code with a "#". | 
|---|
| 106 | ;Input Variable: | 
|---|
| 107 | ;  ORCIEN    Clinician Internal ID number | 
|---|
| 108 | ;Output Variable: | 
|---|
| 109 | ;  Y         Array of ICD9 codes and descriptions | 
|---|
| 110 | ;            Y(#)=ICD9_code^DX_description^DX_Inactive | 
|---|
| 111 | ;                 If inactive # in third piece | 
|---|
| 112 | ;                 If active null in third piece | 
|---|
| 113 | ;Local Variables: | 
|---|
| 114 | ;  DXC       Diagnosis Code (for sorting) | 
|---|
| 115 | ;  DXD       Diagnosis Description | 
|---|
| 116 | ;  DXDT      Diagnosis Date | 
|---|
| 117 | ;  DXI       Diagnosis Inactive Flag | 
|---|
| 118 | ;  EM        Error Message | 
|---|
| 119 | ;  ICD9      ICD9 code (for GUI) | 
|---|
| 120 | ;  IEN       Internal Entry Number | 
|---|
| 121 | ;  RF        Record Found | 
|---|
| 122 | N DXC,DXD,DXDT,DXI,EM,ICD9,IEN,RF | 
|---|
| 123 | S DXDT=$$NOW^XLFDT | 
|---|
| 124 | D GETS^DIQ(200,ORCIEN,"351*,","EI","RF","EM") | 
|---|
| 125 | I $D(RF) D | 
|---|
| 126 | . S (DXC,DXD,DXI,ICD9,IEN)="" | 
|---|
| 127 | . F  S IEN=$O(RF(200.0351,IEN)) Q:IEN=""  D | 
|---|
| 128 | .. S ICD9=RF(200.0351,IEN,.01,"E") | 
|---|
| 129 | .. S DXC=$$SETDXC(ICD9) | 
|---|
| 130 | .. I $G(RF(200.0351,IEN,1,"I"))="" S DXD=$$SETDXD($P($$ICDDX^ICDCODE(ICD9,DXDT),U,4)) | 
|---|
| 131 | .. I $G(RF(200.0351,IEN,1,"I"))=1 S DXD=$$SETDXD($P($$ICDDX^ICDCODE(ICD9,DXDT),U,4)) | 
|---|
| 132 | .. I $G(RF(200.0351,IEN,1,"I"))>1 S DXD=RF(200.0351,IEN,1,"E") | 
|---|
| 133 | .. S DXI=$$SETDXI($$STATCHK^ICDAPIU(ICD9,DXDT)) | 
|---|
| 134 | .. S Y(DXC)=ICD9_U_DXD_U_DXI | 
|---|
| 135 | E  S Y=0 | 
|---|
| 136 | Q | 
|---|
| 137 | ; | 
|---|
| 138 | GETDUDC(Y,ORCIEN,ORPTIEN) ;Get Day's Unique Diagnoses Codes | 
|---|
| 139 | ;Gets all the unique ICD9 codes for the orders placed today by the | 
|---|
| 140 | ;clinician for this patient. Using the ICD9 codes it builds an array | 
|---|
| 141 | ;variable with the ICD9 code, its description from the ICD DIAGNOSIS | 
|---|
| 142 | ;file, #80. Flagging any inactive ICD9 codes with a "#". | 
|---|
| 143 | ;Input Variables: | 
|---|
| 144 | ;  ORCIEN    Clinician's internal ID number | 
|---|
| 145 | ;  ORPTIEN   Patient's internal ID number | 
|---|
| 146 | ;Output Variable: | 
|---|
| 147 | ;  Y         Array of ICD9 codes and descriptions | 
|---|
| 148 | ;            Y(#)=ICD9_code^DX_Description^DX_Inactive | 
|---|
| 149 | ;                 If inactive # in third piece | 
|---|
| 150 | ;                 If active null in third piece | 
|---|
| 151 | ;Local Variables: | 
|---|
| 152 | ;  CKDATE    Check Date (stops loop) | 
|---|
| 153 | ;  DXC       Diagnosis Code (for sorting) | 
|---|
| 154 | ;  DXD       Diagnosis Description | 
|---|
| 155 | ;  DXI       Diagnosis Inactive Flag | 
|---|
| 156 | ;  DXIEN     Diagnosis Internal Entry Number | 
|---|
| 157 | ;  ICD9      ICD9 code (for GUI display) | 
|---|
| 158 | ;  IEN       Internal Entry Number | 
|---|
| 159 | ;  OBJORD    Object of Order | 
|---|
| 160 | ;  ORDATE    Order Date | 
|---|
| 161 | ;  ORDG      Order Group (ACT index variable) | 
|---|
| 162 | ;  OREM      Order Error Message | 
|---|
| 163 | ;  ORIEN     Order Internal Entry Number | 
|---|
| 164 | ;  ORRF      Order Record Found | 
|---|
| 165 | ;  RCODI     Reverse Cronological Order Date Index | 
|---|
| 166 | ;  SUBFILE   Subfile Number | 
|---|
| 167 | N CKDATE,DXC,DXD,DXEM,DXI,DXIEN,DXRF,ICD9,IEN,OBJORD,ORDATE,ORDG,OREM | 
|---|
| 168 | N ORIEN,ORRF,RCODI,SUBFILE | 
|---|
| 169 | S OBJORD=ORPTIEN_";DPT(" | 
|---|
| 170 | S (DXIEN,ORDATE,ORDG,ORIEN,RCODI)="",CKDATE=$$F24HA | 
|---|
| 171 | F  S RCODI=$O(^OR(100,"ACT",OBJORD,RCODI)) S ORDATE=9999999-RCODI Q:ORDATE<CKDATE!(RCODI="")  D | 
|---|
| 172 | . F  S ORDG=$O(^OR(100,"ACT",OBJORD,RCODI,ORDG)) Q:ORDG=""  D | 
|---|
| 173 | .. S ORIEN=$QS($Q(^OR(100,"ACT",OBJORD,RCODI,ORDG)),6) | 
|---|
| 174 | .. K ORRF,OREM | 
|---|
| 175 | .. D GETS^DIQ(100,ORIEN,"1;5.1*","I","ORRF","OREM") | 
|---|
| 176 | .. S IEN=$QS($Q(ORRF(100)),2) | 
|---|
| 177 | .. Q:ORRF(100,IEN,1,"I")'=ORCIEN | 
|---|
| 178 | .. Q:$D(ORRF(100.051))=0 | 
|---|
| 179 | .. S (DXC,DXD,DXI,DXIEN,ICD9,IEN)="" | 
|---|
| 180 | .. F  S IEN=$O(ORRF(100.051,IEN)) Q:IEN=""  D | 
|---|
| 181 | ... Q:ORRF(100.051,IEN,.01,"I")="" | 
|---|
| 182 | ... S DXIEN=ORRF(100.051,IEN,.01,"I") | 
|---|
| 183 | ... S ICD9=$$GET1^DIQ(80,DXIEN,.01,"") | 
|---|
| 184 | ... S DXC=$$SETDXC(ICD9) | 
|---|
| 185 | ... S DXD=$$SETDXD($P($$ICDDX^ICDCODE(ICD9,ORDATE),U,4)) | 
|---|
| 186 | ... S DXI=$$SETDXI($$STATCHK^ICDAPIU(ICD9,ORDATE)) | 
|---|
| 187 | ... S Y(DXC)=ICD9_U_DXD_U_DXI | 
|---|
| 188 | Q | 
|---|
| 189 | ; | 
|---|
| 190 | SETDXC(X) ;Set diagnosis code variable for sorting | 
|---|
| 191 | S X=$S($E(X)?1A:X,1:+X) Q X | 
|---|
| 192 | ; | 
|---|
| 193 | SETDXD(X) ;Set upper case diagnosis discription to mixed case | 
|---|
| 194 | N X1,X2 | 
|---|
| 195 | F X1=2:1:$L(X) D | 
|---|
| 196 | . I $E(X,X1)?1U,$E(X,X1-1)?1A D | 
|---|
| 197 | .. S X2=$E(X,X1) | 
|---|
| 198 | .. S X2=$C($A(X2)+32) | 
|---|
| 199 | .. S $E(X,X1)=X2 | 
|---|
| 200 | Q X | 
|---|
| 201 | ; | 
|---|
| 202 | SETDXI(X) ;Set the diagnosis inactive indicator | 
|---|
| 203 | S X=$S($P(X,U)=0:"#",1:"") Q X | 
|---|
| 204 | ; | 
|---|
| 205 | CI(CNT) ;Counter Incrementer | 
|---|
| 206 | ; CNT - Counter | 
|---|
| 207 | S CNT=CNT+1 Q CNT | 
|---|
| 208 | ; | 
|---|
| 209 | F24HA() ;Returns date and time from exactly 24 hours ago | 
|---|
| 210 | N %,%H,%I,X | 
|---|
| 211 | D NOW^%DTC | 
|---|
| 212 | Q %-1 | 
|---|
| 213 | ; | 
|---|
| 214 | ERRMSG(MT) ;Display Error Message | 
|---|
| 215 | ; to be determined | 
|---|
| 216 | Q | 
|---|