| 1 | PXRMSTA1 ; SLC/AGP - Routines for building status list. ;09/06/2007 | 
|---|
| 2 | ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123 | 
|---|
| 3 | ; | 
|---|
| 4 | ;This routine and PXRMSTA2 will allow users to select the | 
|---|
| 5 | ;approriate status for Orders, Medication, Taxonomy, Problem List, | 
|---|
| 6 | ;and Radiology Procedure findings items. | 
|---|
| 7 | ; | 
|---|
| 8 | CLEAR(GBL,FILE,DA) ; | 
|---|
| 9 | N IEN,NODE,DIK,TEMP | 
|---|
| 10 | I FILE="D" S DIK="^PXD(811.9,"_DA(2)_",20,"_DA(1)_",5," | 
|---|
| 11 | I FILE="T" S DIK="^PXRMD(811.5,"_DA(2)_",20,"_DA(1)_",5," | 
|---|
| 12 | S DA=0 F  S DA=$O(@GBL@(DA(2),20,DA(1),5,DA)) Q:DA'>0  S TEMP(DA)="" | 
|---|
| 13 | S DA=0 F  S DA=$O(TEMP(DA)) Q:DA'>0  D ^DIK | 
|---|
| 14 | Q | 
|---|
| 15 | ; | 
|---|
| 16 | STATUS(DA,FILE) ; | 
|---|
| 17 | N ANS,DELSTS,DELALL,GBL,NODE,PXRMRX,STATUS,STS,TAXIEN,TERMIEN,TAXTYPE,TTYPE,TYPE | 
|---|
| 18 | N RXTYPE,TAXNODE,TERMTYPE,Y | 
|---|
| 19 | N CSTATUS,UPDATE,HTEXT,OSTAUS,WILD | 
|---|
| 20 | S DA(2)=DA(1),DA(1)=DA,DA="",UPDATE=0,DELALL=0 | 
|---|
| 21 | I FILE="D" S GBL="^PXD(811.9)" | 
|---|
| 22 | I FILE="T" S GBL="^PXRMD(811.5)" | 
|---|
| 23 | S NODE=$G(@GBL@(DA(2),20,DA(1),0)) | 
|---|
| 24 | S TYPE=$P($G(@GBL@(DA(2),20,DA(1),0)),U) | 
|---|
| 25 | S WILD=0 | 
|---|
| 26 | ;check for current defined statuses if none set the default values | 
|---|
| 27 | I FILE="D",$P($G(@GBL@(DA(2),20,DA(1),5,0)),U,4)'>0 D DEFAULT(GBL,TYPE,NODE,FILE,0,.DA) | 
|---|
| 28 | ;I FILE="T",$P($G(@GBL@(DA(2),20,DA(1),5,0)),U,4)>0 D | 
|---|
| 29 | ;.S STS="" F  S STS=$O(@GBL@(DA(2),20,DA(1),5,"B",STS)) Q:STS=""  S DELSTS(STS)="" | 
|---|
| 30 | ;display the current status | 
|---|
| 31 | D DISPLAY(GBL,UPDATE,.WILD,DELALL) | 
|---|
| 32 | ;do inital prompt | 
|---|
| 33 | D ADDDEL($G(ANS),GBL,FILE,TYPE,NODE,WILD,.DA,.UPDATE,.DELALL) | 
|---|
| 34 | Q | 
|---|
| 35 | ; | 
|---|
| 36 | ADDDEL(ANS,GBL,FILE,TYPE,NODE,WILD,DA,UPDATE,DELALL) ; | 
|---|
| 37 | I $G(ANS)="" S ANS=$$PROMPT("S^A:ADD STATUS;D:DELETE A STATUS;S:SAVE AND QUIT;Q:QUIT WITHOUT SAVING CHANGES") | 
|---|
| 38 | I "ADDASQ"'[ANS Q | 
|---|
| 39 | I ANS="A",WILD=1 D | 
|---|
| 40 | .W !,"Wildcard is already on the status list all possible statuses will be evaluated." | 
|---|
| 41 | .W !,"To add a specific status please remove the wildcard first." | 
|---|
| 42 | .S UPDATE=0 H 1 | 
|---|
| 43 | I ANS="A",WILD=0 D ADD(GBL,FILE,.CSTATUS,TYPE,.WILD,.DA,.UPDATE) | 
|---|
| 44 | I ANS="D" D DELETE(GBL,FILE,.CSTATUS,NODE,.WILD,.DA,.UPDATE,.DELALL) | 
|---|
| 45 | I ANS="S" S UPDATE="S" | 
|---|
| 46 | I ANS="Q" S UPDATE="Q" | 
|---|
| 47 | I UPDATE'="S",UPDATE'="Q" S DELALL=0 D ADDDEL("",GBL,FILE,TYPE,NODE,.WILD,.DA,.UPDATE,.DELALL) | 
|---|
| 48 | ; only update the new record if the action is Save | 
|---|
| 49 | I UPDATE="S" D UPDATE(FILE,.UPDATE,.CSTATUS,.DA,.DELALL) | 
|---|
| 50 | Q | 
|---|
| 51 | ; | 
|---|
| 52 | ADD(GBL,FILE,CSTATUS,TYPE,WILD,DA,UPDATE) ; | 
|---|
| 53 | N ANS,STATUS,TERMIEN | 
|---|
| 54 | ;Find what types of finding is in the term | 
|---|
| 55 | I TYPE["PXRMD(811.5," D | 
|---|
| 56 | .S TERMIEN=$P($G(TYPE),";") | 
|---|
| 57 | .S TYPE=$$TERMSTAT(TERMIEN) I TYPE=0 Q | 
|---|
| 58 | .I TYPE["PXD" S TAXTYPE=$$TAXTYPE(TERMIEN,"") | 
|---|
| 59 | I TYPE=0 Q | 
|---|
| 60 | ;find out what is in the taxonomy | 
|---|
| 61 | I TYPE["PXD(811.2,",$G(TAXTYPE)="" S TAXTYPE=$$TAXNODE($P(TYPE,";"),"") | 
|---|
| 62 | I TYPE[";" S TYPE=$P($G(TYPE),";",2) | 
|---|
| 63 | I TYPE="PXD(811.2," D  G ADDEX | 
|---|
| 64 | .I $G(TAXTYPE)="R"!($G(TAXTYPE)="B") D DATA^PXRMSTA2(FILE,.DA,"RAMIS(71,","",.STATUS) | 
|---|
| 65 | .;I $G(TAXTYPE)="P" D DATA^PXRMSTA2(FILE,.DA,"PROB","",.STATUS) | 
|---|
| 66 | .;I $G(TAXTYPE)="B" D DATA^PXRMSTA2(FILE,.DA,"TAX","",.STATUS) | 
|---|
| 67 | ; handle drug finding items | 
|---|
| 68 | I TYPE["PSDRUG("!(TYPE["PS(50.605")!(TYPE["PSNDF") D  G ADDEX | 
|---|
| 69 | .D SRXTYL^PXRMRXTY(NODE,.RXTYPE) | 
|---|
| 70 | .D DATA^PXRMSTA2(FILE,.DA,"DRUG",.RXTYPE,.STATUS) | 
|---|
| 71 | ;radiology and orderable item finding item | 
|---|
| 72 | D DATA^PXRMSTA2(FILE,.DA,TYPE,"",.STATUS) | 
|---|
| 73 | ADDEX ; | 
|---|
| 74 | I '$D(STATUS) S UPDATE=0 Q | 
|---|
| 75 | S STAT="" F  S STAT=$O(STATUS(STAT)) Q:STAT=""!(WILD)=1  D | 
|---|
| 76 | .I STAT["*" S WILD=1 Q | 
|---|
| 77 | .S CSTATUS(STAT)="" | 
|---|
| 78 | I WILD=1 K CSTATUS S CSTATUS("*")="" | 
|---|
| 79 | S UPDATE=1 D DISPLAY(GBL,UPDATE,.WILD,0) | 
|---|
| 80 | Q | 
|---|
| 81 | ; | 
|---|
| 82 | DEFAULT(GBL,TYPE,NODE,RFILE,DELETE,DA) ; | 
|---|
| 83 | N ANS,FDA,FILE,IND,MSG,STATUS,TERMIEN | 
|---|
| 84 | S FILE="" | 
|---|
| 85 | I TYPE["PXRMD(811.5," D | 
|---|
| 86 | .S TERMIEN=$P($G(TYPE),";") | 
|---|
| 87 | .S TYPE=$$TERMSTAT(TERMIEN) I TYPE=0 S STATUS="" Q | 
|---|
| 88 | .I TYPE["PXD" S TAXTYPE=$$TAXTYPE(TERMIEN,"") | 
|---|
| 89 | I TYPE=0 Q | 
|---|
| 90 | I TYPE["PXD(811.2,",$G(TAXTYPE)="" S TAXTYPE=$$TAXNODE($P(TYPE,";"),"") | 
|---|
| 91 | I TYPE[";" S TYPE=$P($G(TYPE),";",2) | 
|---|
| 92 | I TYPE="PXD(811.2," D | 
|---|
| 93 | .I $G(TAXTYPE)="R"!($G(TAXTYPE)="B") S FILE=70 | 
|---|
| 94 | .;I $G(TAXTYPE)="P" S FILE=9000011 | 
|---|
| 95 | I FILE="",TYPE="ORD(101.43," S FILE=100 | 
|---|
| 96 | I FILE="",TYPE="RAMIS(71," S FILE=70 | 
|---|
| 97 | I FILE="",TYPE["PSDRUG("!(TYPE["PS(50.605")!(TYPE["PSNDF") D | 
|---|
| 98 | .N DSTATUS,NAME,STATUSI,STATUSN,STATUSO,RXTYPE | 
|---|
| 99 | .D SRXTYL^PXRMRXTY(NODE,.RXTYPE) | 
|---|
| 100 | .I $D(RXTYPE("O")) D DEFAULT^PXRMSTAT(52,.STATUSO) D | 
|---|
| 101 | ..F IND=1:1:STATUSO(0) S DSTATUS(STATUSO(IND))="" | 
|---|
| 102 | .I $D(RXTYPE("I")) D DEFAULT^PXRMSTAT(55,.STATUSI) D | 
|---|
| 103 | ..F IND=1:1:STATUSI(0) S DSTATUS(STATUSI(IND))="" | 
|---|
| 104 | .I $D(RXTYPE("N")) D DEFAULT^PXRMSTAT("55NVA",.STATUSN) D | 
|---|
| 105 | ..F IND=1:1:STATUSN(0) S DSTATUS(STATUSN(IND))="" | 
|---|
| 106 | .S NAME="",IND=0 F  S NAME=$O(DSTATUS(NAME)) Q:NAME=""  D | 
|---|
| 107 | ..S IND=IND+1 S STATUS(IND)=NAME | 
|---|
| 108 | .S STATUS(0)=IND | 
|---|
| 109 | I '$D(STATUS) D DEFAULT^PXRMSTAT(FILE,.STATUS) | 
|---|
| 110 | F IND=1:1:STATUS(0) Q:$D(MSG)>0  D | 
|---|
| 111 | .I DELETE=1 S CSTATUS(STATUS(IND))="" Q | 
|---|
| 112 | .I $D(@GBL@(DA(2),20,DA(1),5,"B",STATUS(IND))) Q | 
|---|
| 113 | .I RFILE="D" S FDA(811.90221,"+3,"_DA(1)_","_DA(2)_",",.01)=STATUS(IND) | 
|---|
| 114 | .I RFILE="T" S FDA(811.54,"+3,"_DA(1)_","_DA(2)_",",.01)=STATUS(IND) | 
|---|
| 115 | .D UPDATE^DIE("","FDA","","MSG") | 
|---|
| 116 | I $D(MSG)>0 D AWRITE^PXRMUTIL("MSG") H 2 | 
|---|
| 117 | Q | 
|---|
| 118 | ; | 
|---|
| 119 | DELETE(GBL,FILE,CSTATUS,NODE,WILD,DA,UPDATE,DELALL) ; | 
|---|
| 120 | N ANS,CNT,DIK,NUM,NAME,DIR,TMP,TMPARR,Y | 
|---|
| 121 | S CNT=0,NAME="" F  S NAME=$O(CSTATUS(NAME)) Q:NAME=""  D | 
|---|
| 122 | .S CNT=CNT+1 S TMPARR(CNT)=CNT_" - "_NAME,TMP(CNT)=NAME | 
|---|
| 123 | S DIR(0)="LO^1:"_CNT_"" | 
|---|
| 124 | M DIR("A")=TMPARR | 
|---|
| 125 | S DIR("A")="Select which status to be deleted" | 
|---|
| 126 | ;S DIR("?")=HELP | 
|---|
| 127 | D ^DIR | 
|---|
| 128 | I $D(DTOUT)!($D(DUOUT))!($G(Y)="") Q | 
|---|
| 129 | S CNT=0 F X=1:1:$L(Y(0)) D | 
|---|
| 130 | .I $E(Y(0),X)="," S CNT=CNT+1,NUM=$P(Y(0),",",CNT) S NAME=TMP(NUM) K CSTATUS(NAME) I NAME["*" S WILD=0 | 
|---|
| 131 | S UPDATE=1 | 
|---|
| 132 | I FILE="T",$D(CSTATUS)'>0 S DELALL=1 | 
|---|
| 133 | ;.S DIK="^PXRMD(811.5,"_DA(2)_",20,"_DA(1)_",5," | 
|---|
| 134 | ;D CLEAR(GBL,FILE,.DA) | 
|---|
| 135 | ;I $D(CSTATUS)'>0 S DA=0 F  S DA=$O(^PXRMD(811.5,DA(2),20,DA(1),5,DA)) Q:DA'>0  D ^DIK | 
|---|
| 136 | ;I '$D(CSTATUS) D CLEAR(GBL,FILE,.DA) D DEFAULT(GBL,TYPE,NODE,FILE,1,.DA) | 
|---|
| 137 | ;I '$D(CSTATUS),FILE="D" D DEFAULT(GBL,TYPE,NODE,FILE,1,.DA) | 
|---|
| 138 | D DISPLAY(GBL,UPDATE,.WILD,DELALL) | 
|---|
| 139 | Q | 
|---|
| 140 | ; | 
|---|
| 141 | DISPLAY(GBL,UPDATE,WILD,DELALL) ; | 
|---|
| 142 | ;display statuses defined in the 5 node or display statuses if CStatus | 
|---|
| 143 | ;array has been loaded | 
|---|
| 144 | N NAME | 
|---|
| 145 | S NAME="" | 
|---|
| 146 | I ((UPDATE=1)&(DELALL=1))!(($D(CSTATUS)'>0)&(UPDATE=0)&(GBL["811.5")&('$D(@GBL@(DA(2),20,DA(1),5)))) W !!,"No statuses defined for this finding item" W ! Q | 
|---|
| 147 | W !!,"Statuses already defined for this finding item:" | 
|---|
| 148 | ;I $D(CSTATUS)'>0,UPDATE=1 D | 
|---|
| 149 | ;.F  S NAME=$O(@GBL@(DA(2),20,DA(1),5,"B",NAME)) Q:NAME=""  D | 
|---|
| 150 | ;..S CSTATUS(NAME)=$O(^PXD(811.9,DA(2),20,DA(1),5,"B","NAME","")) | 
|---|
| 151 | I $D(CSTATUS)'>0,UPDATE=0 D | 
|---|
| 152 | .F  S NAME=$O(@GBL@(DA(2),20,DA(1),5,"B",NAME)) Q:NAME=""  D | 
|---|
| 153 | ..I NAME["*" S WILD=1 | 
|---|
| 154 | ..W !,NAME S CSTATUS(NAME)=$O(^PXD(811.9,DA(2),20,DA(1),5,"B","NAME","")) | 
|---|
| 155 | I UPDATE=1 F  S NAME=$O(CSTATUS(NAME)) Q:NAME=""  W !,NAME I NAME["*" S WILD=1 | 
|---|
| 156 | W ! | 
|---|
| 157 | Q | 
|---|
| 158 | ; | 
|---|
| 159 | ; | 
|---|
| 160 | UPDATE(FILE,UPDATE,CSTATUS,DA,DELALL) ; | 
|---|
| 161 | N FDA,MSG,NAME | 
|---|
| 162 | I UPDATE="S" S UPDATE=1 | 
|---|
| 163 | I UPDATE=0,$D(CSTATUS) G EXIT | 
|---|
| 164 | D CLEAR(GBL,FILE,.DA) | 
|---|
| 165 | I $D(CSTATUS)'>0 S UPDATE=0,DELALL=0 G EXIT | 
|---|
| 166 | I $D(CSTATUS)'>0 S UPDATE=1,DELALL=1 G EXIT | 
|---|
| 167 | S NAME="" F  S NAME=$O(CSTATUS(NAME)) Q:NAME=""!($D(MSG)>0)  D | 
|---|
| 168 | .I FILE="D" S FDA(811.90221,"+3,"_DA(1)_","_DA(2)_",",.01)=NAME | 
|---|
| 169 | .I FILE="T" S FDA(811.54,"+3,"_DA(1)_","_DA(2)_",",.01)=NAME | 
|---|
| 170 | .D UPDATE^DIE("","FDA","","MSG") | 
|---|
| 171 | I $D(MSG)>0 D AWRITE^PXRMUTIL("MSG") H 2 | 
|---|
| 172 | EXIT ; | 
|---|
| 173 | Q | 
|---|
| 174 | ; | 
|---|
| 175 | PROMPT(STR) ; | 
|---|
| 176 | N DIR,HTEXT | 
|---|
| 177 | S HTEXT(1)="Select 'A' to add a status to the current status list.\\Select 'D' to" | 
|---|
| 178 | S HTEXT(2)="delete a status from the list.\\Select 'S' to save your changes and quit. " | 
|---|
| 179 | S HTEXT(3)="\\Select 'Q' to quit without saving your changes." | 
|---|
| 180 | S DIR(0)=STR | 
|---|
| 181 | S DIR("B")="S" | 
|---|
| 182 | S DIR("?")="Select one of the above option or '^' to quit. Enter ?? for detail help." | 
|---|
| 183 | S DIR("??")=U_"D HELP^PXRMEUT(.HTEXT)" | 
|---|
| 184 | D ^DIR | 
|---|
| 185 | I $G(Y)="" S Y=U | 
|---|
| 186 | Q Y | 
|---|
| 187 | ; | 
|---|
| 188 | ASK(STR,HTEXT) ; | 
|---|
| 189 | N DIR,HTEXT | 
|---|
| 190 | I '$D(HTEXT) D | 
|---|
| 191 | .S HTEXT(1)="Enter 'Y' to continue editing the Status List or '^' to Quit" | 
|---|
| 192 | S DIR(0)="YA0" | 
|---|
| 193 | S DIR("A")=STR | 
|---|
| 194 | S DIR("B")="N" | 
|---|
| 195 | S DIR("?")="Select either 'Y' or 'N' or '^' to quit. Enter ?? for detail help." | 
|---|
| 196 | S DIR("??")=U_"D HELP^PXRMEUT(.HTEXT)" | 
|---|
| 197 | D ^DIR | 
|---|
| 198 | Q Y | 
|---|
| 199 | ; | 
|---|
| 200 | TAXTYPE(TERMIEN,HELP) ; | 
|---|
| 201 | ;use to determine the Rx type of the term and the type of taxonomy | 
|---|
| 202 | N ARRAY,BOTH,CNT,IEN,TAXNODE,RAD,PL,RESULT,TYPE | 
|---|
| 203 | S (BOTH,PL,RAD,RESULT)=0 | 
|---|
| 204 | S IEN=0 F  S IEN=$O(^PXRMD(811.5,TERMIEN,20,IEN)) Q:+IEN'>0  D | 
|---|
| 205 | .S TAXNODE=$G(^PXRMD(811.5,TERMIEN,20,IEN,0)) | 
|---|
| 206 | .S ARRAY($P($P($G(TAXNODE),U),";"))="" | 
|---|
| 207 | I $D(ARRAY)>0 S IEN=0 F  S IEN=$O(ARRAY(IEN)) Q:IEN'>0  D | 
|---|
| 208 | .S TYPE=$$TAXNODE(IEN,$G(HELP)) | 
|---|
| 209 | .I TYPE="R" S RAD=1 | 
|---|
| 210 | .I TYPE="P" S PL=1 | 
|---|
| 211 | .I TYPE="B" S BOTH=1 | 
|---|
| 212 | I RAD=1,PL=1 S RESULT="B" Q | 
|---|
| 213 | I RAD=1,PL=0,BOTH=0 S RESULT="R" | 
|---|
| 214 | I RAD=0,PL=1,BOTH=0 S RESULT="P" | 
|---|
| 215 | Q RESULT | 
|---|
| 216 | ; | 
|---|
| 217 | TAXNODE(TAXIEN,HELP) ; | 
|---|
| 218 | ;use to determine the type of taxonomy | 
|---|
| 219 | N TAXNODE,ICD,CPT,ARRAY,RAD,PL,BOTH,RADM,PLM,RESULT | 
|---|
| 220 | S (BOTH,PL,PLM,RAD,RADM,RESULT)=0 | 
|---|
| 221 | D CHECK^PXRMBXTL(TAXIEN,"") | 
|---|
| 222 | I $D(^PXD(811.3,TAXIEN,71,"RCPTP"))>0 S RAD=1 | 
|---|
| 223 | I $D(^PXD(811.3,TAXIEN,"PDS",9000011))>0 S PL=1 | 
|---|
| 224 | I RAD=1,PL=1 S RESULT="B" | 
|---|
| 225 | I RAD=1,PL=0 S RESULT="R" | 
|---|
| 226 | I RAD=0,PL=1 S RESULT="P" | 
|---|
| 227 | Q RESULT | 
|---|
| 228 | ; | 
|---|
| 229 | ; | 
|---|
| 230 | TERMSTAT(TIEN) ; | 
|---|
| 231 | N CNT,FIEN,NODE | 
|---|
| 232 | S (CNT,FIEN)=0 | 
|---|
| 233 | S TYPE=0 F  S FIEN=$O(^PXRMD(811.5,TIEN,20,FIEN)) Q:+FIEN=0!(CNT=1)  D | 
|---|
| 234 | . S NODE=$G(^PXRMD(811.5,TIEN,20,FIEN,0)),TYPE=$P(NODE,U),CNT=CNT+1 | 
|---|
| 235 | Q TYPE | 
|---|
| 236 | ; | 
|---|
| 237 | WARN ; | 
|---|
| 238 | ;If the whole entry is being deleted don't give the warning. | 
|---|
| 239 | I $G(PXRMDEFD) Q | 
|---|
| 240 | I $G(PXRMTMD) Q | 
|---|
| 241 | ;Do not execute as part of exchange. | 
|---|
| 242 | I $G(PXRMEXCH) Q | 
|---|
| 243 | N TEXT | 
|---|
| 244 | S TEXT(1)="" | 
|---|
| 245 | S TEXT(2)="Since you changed the value of Rx Type, you should review the status list" | 
|---|
| 246 | S TEXT(3)="for the finding to make sure it is still appropriate." | 
|---|
| 247 | S TEXT(4)="" | 
|---|
| 248 | D EN^DDIOL(.TEXT) | 
|---|
| 249 | Q | 
|---|
| 250 | ; | 
|---|
| 251 | ; | 
|---|