| 1 | PXRMCSTX ; SLC/PKR - Routines for taxonomy code set update. ; 02/22/2007 | 
|---|
| 2 | ;;2.0;CLINICAL REMINDERS;**9**;Feb 04, 2005;Build 4 | 
|---|
| 3 | ; | 
|---|
| 4 | ;===================================================== | 
|---|
| 5 | ADDTMSG(LC,MSG) ;Add a set of messages to the global message. | 
|---|
| 6 | N IND | 
|---|
| 7 | S IND=0 | 
|---|
| 8 | F  S IND=$O(MSG(IND)) Q:IND=""  S LC=LC+1,^TMP("PXRMXMZ",$J,LC,0)=MSG(IND) | 
|---|
| 9 | Q | 
|---|
| 10 | ; | 
|---|
| 11 | ;===================================================== | 
|---|
| 12 | ADJMSG(FILENUM,LOW,HIGH,ALOW,ALOWC,ALOWO,AHIGH,AHIGHC,AHIGHO,ADJMSG) ; | 
|---|
| 13 | ;Create the message for adjacent codes that have changed. | 
|---|
| 14 | N LC,TYPE | 
|---|
| 15 | K ADJMSG | 
|---|
| 16 | S TYPE=$S(FILENUM=80:"ICD9",FILENUM=80.1:"ICD0",FILENUM=81:"CPT") | 
|---|
| 17 | S ADJMSG(1)="Adjacent "_TYPE_" codes have changed for the range defined by:" | 
|---|
| 18 | S ADJMSG(2)=" Low code  "_$$GETCTEXT(FILENUM,LOW) | 
|---|
| 19 | S ADJMSG(3)=" High code "_$$GETCTEXT(FILENUM,HIGH) | 
|---|
| 20 | S LC=3 | 
|---|
| 21 | I ALOWC D | 
|---|
| 22 | . S LC=LC+1,ADJMSG(LC)="  Old adjacent lower code "_$$GETCTEXT(FILENUM,ALOWO) | 
|---|
| 23 | . S LC=LC+1,ADJMSG(LC)="  New adjacent lower code "_$$GETCTEXT(FILENUM,ALOW) | 
|---|
| 24 | E  S LC=LC+1,ADJMSG(LC)="  No change in adjacent lower code" | 
|---|
| 25 | I AHIGHC D | 
|---|
| 26 | . S LC=LC+1,ADJMSG(LC)="  Old adjacent higher code "_$$GETCTEXT(FILENUM,AHIGHO) | 
|---|
| 27 | . S LC=LC+1,ADJMSG(LC)="  New adjacent higher code "_$$GETCTEXT(FILENUM,AHIGH) | 
|---|
| 28 | E  S LC=LC+1,ADJMSG(LC)="  No change in adjacent higher code" | 
|---|
| 29 | S LC=LC+1,ADJMSG(LC)=" " | 
|---|
| 30 | Q | 
|---|
| 31 | ; | 
|---|
| 32 | ;===================================================== | 
|---|
| 33 | CMSGHDR(TYPE) ;Create the message header. | 
|---|
| 34 | N PTYPE | 
|---|
| 35 | S PTYPE=$S(TYPE="CPT":"a CPT",TYPE="ICD":"an ICD") | 
|---|
| 36 | S ^TMP("PXRMXMZ",$J,1,0)="There was "_PTYPE_" code set update on "_$$FMTE^XLFDT(DT,"5Z")_"." | 
|---|
| 37 | S ^TMP("PXRMXMZ",$J,2,0)="This could affect adjacent codes and/or taxonomy expansions." | 
|---|
| 38 | S ^TMP("PXRMXMZ",$J,3,0)="Please review the affected taxonomies and take appropriate action." | 
|---|
| 39 | S ^TMP("PXRMXMZ",$J,4,0)="You can get the full details of a taxonomy using the taxonomy inquiry option." | 
|---|
| 40 | S ^TMP("PXRMXMZ",$J,5,0)=" " | 
|---|
| 41 | Q | 
|---|
| 42 | ; | 
|---|
| 43 | ;===================================================== | 
|---|
| 44 | CSU(TYPE) ;Entry point for code set update. | 
|---|
| 45 | I TYPE'="CPT",TYPE'="ICD" Q | 
|---|
| 46 | N ADJMSG,ALOW,ALOWC,ALOWO,AHIGH,AHIGHC,AHIGHO,CODEIEN,CODEMSG | 
|---|
| 47 | N FI,FILELIST,FILENUM,IEN,IND,HIGH,LC,LOW,NFILES,NNEW,NEWCODES,SENDMSG | 
|---|
| 48 | N TAXHDRE,TAXHDRL,TAXHDRS,TAXMSG,TEMP,XMSUB | 
|---|
| 49 | I TYPE="CPT" S NFILES=1,FILELIST(1)=81 | 
|---|
| 50 | I TYPE="ICD" S NFILES=2,FILELIST(1)=80,FILELIST(2)=80.1 | 
|---|
| 51 | K ^TMP("PXRMXMZ",$J) | 
|---|
| 52 | ;Set the line count to the end of the taxonomy header. | 
|---|
| 53 | S TAXHDRS=6,TAXHDRL=1,TAXHDRE=TAXHDRS+TAXHDRL,LC=TAXHDRE | 
|---|
| 54 | S (IEN,SENDMSG)=0 | 
|---|
| 55 | F  S IEN=+$O(^PXD(811.2,IEN)) Q:IEN=0  D | 
|---|
| 56 | . F FI=1:1:NFILES D | 
|---|
| 57 | .. S FILENUM=FILELIST(FI) | 
|---|
| 58 | .. I '$D(^PXD(811.2,IEN,FILENUM,"B")) Q | 
|---|
| 59 | .. S (IND,TAXMSG)=0 | 
|---|
| 60 | .. F  S IND=+$O(^PXD(811.2,IEN,FILENUM,IND)) Q:IND=0  D | 
|---|
| 61 | ... S TEMP=^PXD(811.2,IEN,FILENUM,IND,0) | 
|---|
| 62 | ... S LOW=$P(TEMP,U,1),HIGH=$P(TEMP,U,2) | 
|---|
| 63 | ... S ALOWO=$P(TEMP,U,3),AHIGHO=$P(TEMP,U,4) | 
|---|
| 64 | ... S ALOW=$S(FILENUM=80:$$PREV^ICDAPIU(LOW),FILENUM=80.1:$$PREV^ICDAPIU(LOW),FILENUM=81:$$PREV^ICPTAPIU(LOW)) | 
|---|
| 65 | ... S AHIGH=$S(FILENUM=80:$$NEXT^ICDAPIU(HIGH),FILENUM=80.1:$$NEXT^ICDAPIU(HIGH),FILENUM=81:$$NEXT^ICPTAPIU(HIGH)) | 
|---|
| 66 | ... I ALOW'=ALOWO S ALOWC=1,$P(^PXD(811.2,IEN,FILENUM,IND,0),U,3)=ALOW | 
|---|
| 67 | ... E  S ALOWC=0 | 
|---|
| 68 | ... I AHIGH'=AHIGHO S AHIGHC=1,$P(^PXD(811.2,IEN,FILENUM,IND,0),U,4)=AHIGH | 
|---|
| 69 | ... E  S AHIGHC=0 | 
|---|
| 70 | ... I ALOWC!AHIGHC D | 
|---|
| 71 | .... D ADJMSG(FILENUM,LOW,HIGH,ALOW,ALOWC,ALOWO,AHIGH,AHIGHC,AHIGHO,.ADJMSG) | 
|---|
| 72 | .... D ADDTMSG(.LC,.ADJMSG) | 
|---|
| 73 | .... S TAXMSG=1 | 
|---|
| 74 | ..;Save the old expansion and compare with the old one. | 
|---|
| 75 | .. K ^TMP($J,"OLDEXP") | 
|---|
| 76 | .. S IND=0 | 
|---|
| 77 | .. F  S IND=+$O(^PXD(811.3,IEN,FILENUM,IND)) Q:IND=0  D | 
|---|
| 78 | ... S CODEIEN=^PXD(811.3,IEN,FILENUM,IND,0) | 
|---|
| 79 | ... S ^TMP($J,"OLDEXP",CODEIEN)="" | 
|---|
| 80 | ..;Rexpand and compare with the old. | 
|---|
| 81 | .. D DELEXTL^PXRMBXTL(IEN) | 
|---|
| 82 | .. D EXPAND^PXRMBXTL(IEN,"") | 
|---|
| 83 | ..;Old codes are never deleted from the ICD or CPT globals so just | 
|---|
| 84 | ..;check for new entries in the expansion. | 
|---|
| 85 | .. S (IND,NNEW)=0 | 
|---|
| 86 | .. F  S IND=+$O(^PXD(811.3,IEN,FILENUM,IND)) Q:IND=0  D | 
|---|
| 87 | ... S CODEIEN=^PXD(811.3,IEN,FILENUM,IND,0) | 
|---|
| 88 | ... I '$D(^TMP($J,"OLDEXP",CODEIEN)) S NNEW=NNEW+1,NEWCODES(NNEW)=CODEIEN | 
|---|
| 89 | ..;If there are any new codes add them to the message. | 
|---|
| 90 | .. I NNEW>0 D | 
|---|
| 91 | ... D NEWCMSG(FILENUM,NNEW,.NEWCODES,.CODEMSG) | 
|---|
| 92 | ... D ADDTMSG(.LC,.CODEMSG) | 
|---|
| 93 | ... S TAXMSG=1 | 
|---|
| 94 | ..;Check the selectable codes. | 
|---|
| 95 | .. D SELCODE^PXRMCSSC(FILENUM,IEN,.LC,.TAXMSG) | 
|---|
| 96 | .. I TAXMSG D | 
|---|
| 97 | ... D TAXHDR(IEN,TAXHDRS) | 
|---|
| 98 | ... S TAXHDRS=LC+1,TAXHDRE=TAXHDRS+TAXHDRL,LC=TAXHDRE | 
|---|
| 99 | ... S SENDMSG=1 | 
|---|
| 100 | S XMSUB="Clinical Reminder taxonomy updates, new "_TYPE_" global installation." | 
|---|
| 101 | I SENDMSG D CMSGHDR(TYPE) | 
|---|
| 102 | I 'SENDMSG D | 
|---|
| 103 | . S ^TMP("PXRMXMZ",$J,1,0)="No changes in adjacent high and low codes were found." | 
|---|
| 104 | . S ^TMP("PXRMXMZ",$J,2,0)="No inactive selectable codes were found." | 
|---|
| 105 | . S ^TMP("PXRMXMZ",$J,3,0)="No action is necessary." | 
|---|
| 106 | D SEND^PXRMMSG(XMSUB) | 
|---|
| 107 | K ^TMP("PXRMXMZ",$J),^TMP($J,"OLDEXP") | 
|---|
| 108 | Q | 
|---|
| 109 | ; | 
|---|
| 110 | ;===================================================== | 
|---|
| 111 | GETCTEXT(FILENUM,CODE) ;Return the code and text associated with the code. | 
|---|
| 112 | N TEMP,TEXT | 
|---|
| 113 | I FILENUM=80 D  Q TEXT | 
|---|
| 114 | . S TEMP=$$ICDDX^ICDCODE(CODE,DT) | 
|---|
| 115 | . S TEXT=$P(TEMP,U,2)_"-"_$P(TEMP,U,4) | 
|---|
| 116 | I FILENUM=80.1 D  Q TEXT | 
|---|
| 117 | . S TEMP=$$ICDOP^ICDCODE(CODE,DT) | 
|---|
| 118 | . S TEXT=$P(TEMP,U,2)_"-"_$P(TEMP,U,5) | 
|---|
| 119 | I FILENUM=81 D | 
|---|
| 120 | . S TEMP=$$CPT^ICPTCOD(CODE,DT) | 
|---|
| 121 | . S TEXT=$P(TEMP,U,2)_"-"_$P(TEMP,U,3) | 
|---|
| 122 | Q TEXT | 
|---|
| 123 | ; | 
|---|
| 124 | ;===================================================== | 
|---|
| 125 | NEWCMSG(FILENUM,NNEW,NEWCODES,CODEMSG) ;Create the message for new codes | 
|---|
| 126 | ;appearing in the expansion. | 
|---|
| 127 | I NNEW=0 Q | 
|---|
| 128 | N LC,IND,TYPE | 
|---|
| 129 | K CODEMSG | 
|---|
| 130 | S TYPE=$S(FILENUM=80:"ICD9",FILENUM=80.1:"ICD0",FILENUM=81:"CPT") | 
|---|
| 131 | S CODEMSG(1)="The following are new "_TYPE_" codes in the expansion for this taxonomy:" | 
|---|
| 132 | S LC=1 | 
|---|
| 133 | F IND=1:1:NNEW D | 
|---|
| 134 | . S CODE=NEWCODES(IND) | 
|---|
| 135 | . S LC=LC+1,CODEMSG(LC)=" "_$$GETCTEXT(FILENUM,CODE) | 
|---|
| 136 | S LC=LC+1,CODEMSG(LC)=" " | 
|---|
| 137 | Q | 
|---|
| 138 | ; | 
|---|
| 139 | ;===================================================== | 
|---|
| 140 | TAXHDR(IEN,LC) ;Create message header for a specific taxonomy. | 
|---|
| 141 | S ^TMP("PXRMXMZ",$J,LC,0)="Taxonomy: "_$P(^PXD(811.2,IEN,0),U,1)_" = TX("_IEN_")" | 
|---|
| 142 | Q | 
|---|
| 143 | ; | 
|---|