| 1 | PXRMDLL ;SLC/PJH - REMINDER DIALOG LOADER ;09/26/2007 | 
|---|
| 2 | ;;2.0;CLINICAL REMINDERS;**10,6**;Feb 04, 2005;Build 123 | 
|---|
| 3 | ; | 
|---|
| 4 | OK(DIEN) ;Check if mental health test is for GUI | 
|---|
| 5 | I 'DIEN Q 0 | 
|---|
| 6 | Q $$MH^PXRMDLG5(DIEN) | 
|---|
| 7 | ; | 
|---|
| 8 | TXT ;Format text | 
|---|
| 9 | N NULL | 
|---|
| 10 | S TEXT=DTXT(SUB),NULL=0 | 
|---|
| 11 | I ($E(TEXT)=" ")!(TEXT="") S NULL=1 | 
|---|
| 12 | I LAST,'NULL S TEXT="<br>"_TEXT | 
|---|
| 13 | S TEXT=$$STRREP^PXRMUTIL(TEXT,"\\","<br>") | 
|---|
| 14 | S LAST=0 I NULL S TEXT="<br>"_TEXT,LAST=1 | 
|---|
| 15 | Q | 
|---|
| 16 | ; | 
|---|
| 17 | EXP(TIEN,DITEM,DSUB) ;Expand taxonomy codes | 
|---|
| 18 | N ACNT,AHIS,ATYP,ARRAY,CODES,CNT,DPCE,DTAX | 
|---|
| 19 | ;Get taxonomy file details | 
|---|
| 20 | D TAX(TIEN,.ARRAY) | 
|---|
| 21 | ; | 
|---|
| 22 | ;Build dialog from the returned array | 
|---|
| 23 | ; | 
|---|
| 24 | ;Main Taxonomy prompt | 
|---|
| 25 | S DTXT=ARRAY | 
|---|
| 26 | S OCNT=OCNT+1 | 
|---|
| 27 | S ORY(OCNT)=1_U_DITEM_U_DSUB_U_"S"_U_DEXC | 
|---|
| 28 | ;Default group indents and selection entry | 
|---|
| 29 | S $P(ORY(OCNT),U,16)=2,$P(ORY(OCNT),U,18)=2 | 
|---|
| 30 | S OCNT=OCNT+1 | 
|---|
| 31 | S ORY(OCNT)=2_U_DITEM_U_DSUB_U_DTXT | 
|---|
| 32 | ; | 
|---|
| 33 | ;Taxonomy CPT/POV resolution prompts | 
|---|
| 34 | S ACNT="" | 
|---|
| 35 | F  S ACNT=$O(ARRAY(ACNT)) Q:ACNT=""  D | 
|---|
| 36 | .;Prompt text | 
|---|
| 37 | .S DTXT=$P(ARRAY(ACNT),U),DPCE=$P(ARRAY(ACNT),U,4) | 
|---|
| 38 | .;Historical/Current flag | 
|---|
| 39 | .S AHIS=0 I $P(ARRAY(ACNT),U,3)=2 S AHIS=1 | 
|---|
| 40 | .;CPT/POV | 
|---|
| 41 | .S ATYP="POV" I $P(ARRAY(ACNT),U,2)=81 S ATYP="CPT" | 
|---|
| 42 | .;Initial display | 
|---|
| 43 | .S DHIDE=0,DCHECK=0,DDIS=0 | 
|---|
| 44 | .;Construct ien for this level | 
|---|
| 45 | .S DTAX=DSUB_"."_ACNT | 
|---|
| 46 | .S OCNT=OCNT+1 | 
|---|
| 47 | .S ORY(OCNT)=1_U_DITEM_U_DTAX_U_"T"_U_DEXC_U_U_ATYP_U_AHIS | 
|---|
| 48 | .S OCNT=OCNT+1 | 
|---|
| 49 | .S ORY(OCNT)=2_U_DITEM_U_DTAX_U_DTXT | 
|---|
| 50 | Q | 
|---|
| 51 | ; | 
|---|
| 52 | GROUP(DIEN,DSUB) ;Dialog group | 
|---|
| 53 | N DATA,DBOX,DCAP,DCHK,DENTRY,DEXC,DGIEN,DGRP,DGSEQ,DGSUB,DHIDE,DIND | 
|---|
| 54 | N DINDPN,DMHEX,DRESL,DSHARE,SUB,DCOUNT | 
|---|
| 55 | ;Group caption text | 
|---|
| 56 | S DATA=$G(^PXRMD(801.41,DIEN,0)) | 
|---|
| 57 | S DCAP=$P(DATA,U,5),DBOX=$P(DATA,U,6),DIND=$P(DATA,U,7) | 
|---|
| 58 | S DSHARE=$P(DATA,U,8),DENTRY=$P(DATA,U,9),DHIDE=$P(DATA,U,10) | 
|---|
| 59 | S DINDPN=$P(DATA,U,12) S:DINDPN="" DINDPN=0 | 
|---|
| 60 | S DBOX=$S(DBOX="Y":1,1:"") | 
|---|
| 61 | ;group header is display only if SUPPRESS CHECKBOX | 
|---|
| 62 | S DCHK="S" I ('DHIDE)&(DSUPP) S DCHK="D",DHIDE=0 | 
|---|
| 63 | ;Default group setting to hide | 
|---|
| 64 | I DHIDE="" S DHIDE=1 | 
|---|
| 65 | ; | 
|---|
| 66 | S DEXC=$P($G(^PXRMD(801.41,DIEN,2)),U,3) | 
|---|
| 67 | ; | 
|---|
| 68 | S OCNT=OCNT+1,ORY(OCNT)=1_U_DIEN_U_DSUB_U_DCHK_U_DEXC | 
|---|
| 69 | S $P(ORY(OCNT),U,8)=$$AHIS(DIEN) | 
|---|
| 70 | S $P(ORY(OCNT),U,15)=DHIDE,$P(ORY(OCNT),U,16)=DIND | 
|---|
| 71 | S $P(ORY(OCNT),U,17)=DSHARE,$P(ORY(OCNT),U,18)=DENTRY | 
|---|
| 72 | S $P(ORY(OCNT),U,19)=DBOX,$P(ORY(OCNT),U,20)=DCAP | 
|---|
| 73 | S $P(ORY(OCNT),U,21)=DINDPN | 
|---|
| 74 | ;Create type 2 records if if here is additional group text | 
|---|
| 75 | N LAST,TEXT | 
|---|
| 76 | S SUB=0,LAST=0 F  S SUB=$O(DTXT(SUB)) Q:'SUB  D | 
|---|
| 77 | .D TXT | 
|---|
| 78 | .S OCNT=OCNT+1,ORY(OCNT)=2_U_DIEN_U_DSUB_U_TEXT | 
|---|
| 79 | ;Get dialog group sub-elements | 
|---|
| 80 | N DTYP,DSUPP,DDIS,IDENT S DGSEQ=0 | 
|---|
| 81 | F  S DGSEQ=$O(^PXRMD(801.41,DIEN,10,"B",DGSEQ)) Q:'DGSEQ  D | 
|---|
| 82 | .S DGSUB=$O(^PXRMD(801.41,DIEN,10,"B",DGSEQ,"")) Q:'DGSUB | 
|---|
| 83 | .S DATA=$G(^PXRMD(801.41,DIEN,10,DGSUB,0)) | 
|---|
| 84 | .S DGIEN=$P(DATA,U,2) Q:'DGIEN | 
|---|
| 85 | .;Branching logic call to determine if element should be suppress, | 
|---|
| 86 | .;replace or left as is | 
|---|
| 87 | .N TERMNODE,TERMSTAT | 
|---|
| 88 | .S TERMNODE=$G(^PXRMD(801.41,DGIEN,49)) | 
|---|
| 89 | .I $G(TERMNODE)'="" D  Q:TERMSTAT=0 | 
|---|
| 90 | ..S TERMSTAT=1 | 
|---|
| 91 | ..D REPLACE^PXRMDLLB(DFN,TERMNODE,.DGIEN,.DATA,.TERMSTAT) | 
|---|
| 92 | .;Exclude from P/N | 
|---|
| 93 | .S DEXC=$P(DATA,U,8) | 
|---|
| 94 | .I $P($G(^PXRMD(801.41,DGIEN,0)),U,16)'["WHR" D | 
|---|
| 95 | ..K DTXT S SUB=0 F  S SUB=$O(^PXRMD(801.41,DGIEN,25,SUB)) Q:'SUB  D | 
|---|
| 96 | ...S DTXT(SUB)=$G(^PXRMD(801.41,DGIEN,25,SUB,0)) | 
|---|
| 97 | .;Check if element is disabled/invalid | 
|---|
| 98 | .S DATA=$G(^PXRMD(801.41,DGIEN,0)) Q:DATA=""  Q:$P(DATA,U,3)]"" | 
|---|
| 99 | .;If the actual element is exclude from P/N override | 
|---|
| 100 | .I $P($G(^PXRMD(801.41,DGIEN,2)),U,3) S DEXC=1 | 
|---|
| 101 | .S DTYP=$P(DATA,U,4),DSUPP=$P(DATA,U,11) Q:"EG"'[DTYP | 
|---|
| 102 | .S DMHEX=$P(DATA,U,14) | 
|---|
| 103 | .S DRESL=$$RESGROUP^PXRMDLLB(DGIEN) | 
|---|
| 104 | .;S DRESL=$P(DATA,U,15) | 
|---|
| 105 | .S DRES=$P($G(^PXRMD(801.41,DGIEN,1)),U,3) | 
|---|
| 106 | .;Done Elsewhere (historical) | 
|---|
| 107 | .S DHIS=$$AHIS(DGIEN) | 
|---|
| 108 | .S DFIND=$P($G(^PXRMD(801.41,DGIEN,1)),U,5) | 
|---|
| 109 | .S DFIEN=$P(DFIND,";"),DFTYP=$P(DFIND,";",2) | 
|---|
| 110 | .S DPCE="" I DFTYP'="" S DPCE=$G(DARRAY(DFTYP)) | 
|---|
| 111 | .;If mental Health ignore if not GUI | 
|---|
| 112 | .I DPCE="MH" Q:'$$OK(DFIEN) | 
|---|
| 113 | .S DGRP=DSUB_"."_DGSUB | 
|---|
| 114 | .;Taxonomy codes need expanding | 
|---|
| 115 | .I DPCE="T" D EXP(DFIEN,DGIEN,DGRP) Q | 
|---|
| 116 | .;Translate vitals ien to PCE code - This will need a DBIA | 
|---|
| 117 | .I DPCE="VIT" S DFIEN=$$GET1^DIQ(120.51,DFIEN,7,"E") | 
|---|
| 118 | .;Embedded Dialog Group | 
|---|
| 119 | .I DTYP="G" D GROUP(DGIEN,DGRP) Q | 
|---|
| 120 | .S DDIS="S" I DSUPP=1 S DDIS="D" | 
|---|
| 121 | .S DGRP=DSUB_"."_DGSUB,OCNT=OCNT+1 | 
|---|
| 122 | .S ORY(OCNT)=1_U_DGIEN_U_DGRP_U_DDIS_U_DEXC_U_U_U_DHIS_U_DMHEX_U_DRESL_U_$G(DCOUNT) | 
|---|
| 123 | .; | 
|---|
| 124 | .N LAST,TEXT | 
|---|
| 125 | .S SUB=0,LAST=0 F  S SUB=$O(DTXT(SUB)) Q:'SUB  D | 
|---|
| 126 | ..D TXT | 
|---|
| 127 | ..S OCNT=OCNT+1,ORY(OCNT)=2_U_DGIEN_U_DGRP_U_TEXT | 
|---|
| 128 | Q | 
|---|
| 129 | ; | 
|---|
| 130 | LOAD(DIEN,DFN) ;Load dialog questions into array | 
|---|
| 131 | N DARRAY,DATA,DITEM,DFIND,DFIEN,DFTYP,DPCE,DRES,DSEQ,DSUB,DTXT,DTYP,OCNT | 
|---|
| 132 | N DDIS,DEXC,DHIDE,DCHECK,DDIS,DHIS,DMHEX,DRESL,DSUPP,SUB,IDENT,TXTCNT | 
|---|
| 133 | ;Check Status of dialog | 
|---|
| 134 | S DATA=$G(^PXRMD(801.41,DIEN,0)) Q:DATA="" | 
|---|
| 135 | ;If disabled ignore | 
|---|
| 136 | I $P(DATA,U,3)]"" Q | 
|---|
| 137 | ;Ignore if not a reminder dialog | 
|---|
| 138 | I $P(DATA,U,4)'="R" Q | 
|---|
| 139 | ; | 
|---|
| 140 | ;List of PCE codes | 
|---|
| 141 | S DARRAY("AUTTEDT(")="PED" | 
|---|
| 142 | S DARRAY("AUTTEXAM(")="XAM" | 
|---|
| 143 | S DARRAY("AUTTHF(")="HF" | 
|---|
| 144 | S DARRAY("AUTTIMM(")="IMM" | 
|---|
| 145 | S DARRAY("AUTTSK(")="SK" | 
|---|
| 146 | S DARRAY("GMRD(120.51,")="VIT" | 
|---|
| 147 | S DARRAY("ORD(101.41,")="Q" | 
|---|
| 148 | S DARRAY("YTT(601.71,")="MH" | 
|---|
| 149 | S DARRAY("ICD9(")="POV" | 
|---|
| 150 | S DARRAY("ICPT(")="CPT" | 
|---|
| 151 | S DARRAY("PXD(811.2,")="T" | 
|---|
| 152 | S DARRAY("WV(790.1,")="WHR" | 
|---|
| 153 | ; | 
|---|
| 154 | ;Get elements for the dialog | 
|---|
| 155 | S DSEQ=0,OCNT=0 | 
|---|
| 156 | F  S DSEQ=$O(^PXRMD(801.41,DIEN,10,"B",DSEQ)) Q:'DSEQ  D | 
|---|
| 157 | .S DSUB=$O(^PXRMD(801.41,DIEN,10,"B",DSEQ,"")) Q:'DSUB | 
|---|
| 158 | .S DATA=$G(^PXRMD(801.41,DIEN,10,DSUB,0)) | 
|---|
| 159 | .S DITEM=$P(DATA,U,2) Q:DITEM="" | 
|---|
| 160 | .;Ignore disabled elements | 
|---|
| 161 | .S DATA=$G(^PXRMD(801.41,DITEM,0)) Q:DATA=""  Q:$P(DATA,U,3)]"" | 
|---|
| 162 | .;Branching logic call to determine if element should be suppress, | 
|---|
| 163 | .;replace or left as is | 
|---|
| 164 | .S TERMNODE=$G(^PXRMD(801.41,DITEM,49)) | 
|---|
| 165 | .N TERMSTAT | 
|---|
| 166 | .I $G(TERMNODE)'="" D  Q:TERMSTAT=0 | 
|---|
| 167 | ..S TERMSTAT=1 | 
|---|
| 168 | ..D REPLACE^PXRMDLLB(DFN,TERMNODE,.DITEM,.DATA,.TERMSTAT) | 
|---|
| 169 | .S DTYP=$P(DATA,U,4),DSUPP=$P(DATA,U,11) | 
|---|
| 170 | .S DMHEX=$P(DATA,U,14) | 
|---|
| 171 | .S DRESL=$$RESGROUP^PXRMDLLB(DITEM) | 
|---|
| 172 | .;S DRESL=$P(DATA,U,15) | 
|---|
| 173 | .K DTXT S SUB=0 | 
|---|
| 174 | .F  S SUB=$O(^PXRMD(801.41,DITEM,25,SUB)) Q:'SUB  D | 
|---|
| 175 | ..S DTXT(SUB)=$G(^PXRMD(801.41,DITEM,25,SUB,0)) | 
|---|
| 176 | .S DRES=$P($G(^PXRMD(801.41,DITEM,1)),U,3) | 
|---|
| 177 | .S DFIND=$P($G(^PXRMD(801.41,DITEM,1)),U,5) | 
|---|
| 178 | .S DFIEN=$P(DFIND,";"),DFTYP=$P(DFIND,";",2) | 
|---|
| 179 | .S DPCE="" I DFTYP'="" S DPCE=$G(DARRAY(DFTYP)) | 
|---|
| 180 | .;If mental Health ignore if not GUI | 
|---|
| 181 | .I DPCE="MH" Q:'$$OK(DFIEN) | 
|---|
| 182 | .;Exclude from PN | 
|---|
| 183 | .S DEXC=$P($G(^PXRMD(801.41,DITEM,2)),U,3) | 
|---|
| 184 | .;Taxonomy codes need expanding | 
|---|
| 185 | .I DPCE="T" D EXP(DFIEN,DITEM,DSUB) Q | 
|---|
| 186 | .;Translate vitals ien to PCE code - This will need a DBIA | 
|---|
| 187 | .I DPCE="VIT" S DFIEN=$P($G(^GMRD(120.51,DFIEN,0)),U,7) | 
|---|
| 188 | .;Done Elsewhere (historical) | 
|---|
| 189 | .S DHIS=$$AHIS(DITEM) | 
|---|
| 190 | .;Dialog Group | 
|---|
| 191 | .I DTYP="G" D GROUP(DITEM,DSUB) Q | 
|---|
| 192 | .;Dialog type/text and resolution | 
|---|
| 193 | .S OCNT=OCNT+1,DDIS="S" | 
|---|
| 194 | .I DSUPP=1 S DDIS="D" | 
|---|
| 195 | .S ORY(OCNT)=1_U_DITEM_U_DSUB_U_DDIS_U_DEXC_U_U_U_DHIS_U_DMHEX_U_DRESL | 
|---|
| 196 | .N LAST,TEXT | 
|---|
| 197 | .S SUB=0,LAST=0 F  S SUB=$O(DTXT(SUB)) Q:'SUB  D | 
|---|
| 198 | ..D TXT | 
|---|
| 199 | ..S OCNT=OCNT+1,ORY(OCNT)=2_U_DITEM_U_DSUB_U_TEXT | 
|---|
| 200 | Q | 
|---|
| 201 | ; | 
|---|
| 202 | TAX(TXIEN,ARRAY) ;Return list of resolutions/codes for taxonomy | 
|---|
| 203 | N CNT,DTXT,FNODE,RSUB,TDX,TNAME,TPAR,TPR,TYP | 
|---|
| 204 | N TCUR,TDTXT,TDHTXT,THIS,TPTXT,TPHTXT | 
|---|
| 205 | ; | 
|---|
| 206 | ;Get taxonomy name | 
|---|
| 207 | S TNAME=$P($G(^PXD(811.2,TXIEN,0)),U,1) | 
|---|
| 208 | ; | 
|---|
| 209 | ;Check what type of taxonomy codes exist | 
|---|
| 210 | S TDX=$$TOK^PXRMDLLA(TXIEN,"SDX") | 
|---|
| 211 | S TPR=$$TOK^PXRMDLLA(TXIEN,"SPR") | 
|---|
| 212 | ; | 
|---|
| 213 | ;Taxonomy dialog text | 
|---|
| 214 | S DTXT=$P($G(^PXD(811.2,TXIEN,0)),U,3) | 
|---|
| 215 | ;default to taxonomy description if null | 
|---|
| 216 | I DTXT="" S DTXT=$P($G(^PXD(811.2,TXIEN,0)),U,2) | 
|---|
| 217 | ;default to taxonomy name if null | 
|---|
| 218 | I DTXT="" S DTXT=$P($G(^PXD(811.2,TXIEN,0)),U,1) | 
|---|
| 219 | ; | 
|---|
| 220 | S CNT=0,ARRAY=DTXT | 
|---|
| 221 | ; | 
|---|
| 222 | ;Diagnoses | 
|---|
| 223 | I TDX D | 
|---|
| 224 | .;Diagnosis texts | 
|---|
| 225 | .S TPAR=$G(^PXD(811.2,TXIEN,"SDZ")) | 
|---|
| 226 | .;Get parameter file node for this finding type | 
|---|
| 227 | .S FNODE=$O(^PXRMD(801.45,"B","POV","")) Q:FNODE="" | 
|---|
| 228 | .;check if finding parameters are disabled | 
|---|
| 229 | .S TCUR=$P($G(^PXRMD(801.45,FNODE,1,1,0)),U,2) | 
|---|
| 230 | .S THIS=$P($G(^PXRMD(801.45,FNODE,1,2,0)),U,2) | 
|---|
| 231 | .;get category text (diagnoses) | 
|---|
| 232 | .I 'TCUR D  ; Current | 
|---|
| 233 | ..S TDTXT=$P(TPAR,U,2) S:TDTXT="" TDTXT=TNAME | 
|---|
| 234 | ..S CNT=CNT+1,ARRAY(CNT)=TDTXT_U_80_U_1_U_"POV" | 
|---|
| 235 | .I 'THIS D  ; Historical | 
|---|
| 236 | ..S TDHTXT=$P(TPAR,U,3) S:TDHTXT="" TDHTXT=TNAME_" (HISTORICAL)" | 
|---|
| 237 | ..S CNT=CNT+1,ARRAY(CNT)=TDHTXT_U_80_U_2_U_"POV" | 
|---|
| 238 | ;Procedures | 
|---|
| 239 | I TPR D | 
|---|
| 240 | .;Procedure texts | 
|---|
| 241 | .S TPAR=$G(^PXD(811.2,TXIEN,"SPZ")) | 
|---|
| 242 | .;Get parameter file node for this finding type | 
|---|
| 243 | .S FNODE=$O(^PXRMD(801.45,"B","CPT","")) Q:FNODE="" | 
|---|
| 244 | .;check if finding parameters are disabled | 
|---|
| 245 | .S TCUR=$P($G(^PXRMD(801.45,FNODE,1,1,0)),U,2) | 
|---|
| 246 | .S THIS=$P($G(^PXRMD(801.45,FNODE,1,2,0)),U,2) | 
|---|
| 247 | .;get category text (procedures) | 
|---|
| 248 | .I 'TCUR D  ; Current | 
|---|
| 249 | ..S TPTXT=$P(TPAR,U,2) S:TPTXT="" TPTXT=TNAME | 
|---|
| 250 | ..S CNT=CNT+1,ARRAY(CNT)=TPTXT_U_81_U_1_U_"CPT" | 
|---|
| 251 | .I 'THIS D  ; Historical | 
|---|
| 252 | ..S TPHTXT=$P(TPAR,U,3) S:TPHTXT="" TPHTXT=TNAME_" (HISTORICAL)" | 
|---|
| 253 | ..S CNT=CNT+1,ARRAY(CNT)=TPHTXT_U_81_U_2_U_"CPT" | 
|---|
| 254 | ; | 
|---|
| 255 | Q | 
|---|
| 256 | ; | 
|---|
| 257 | AHIS(DITEM) ; | 
|---|
| 258 | N RSIEN,RSNAM | 
|---|
| 259 | S RSIEN=$P($G(^PXRMD(801.41,DITEM,1)),U,3) | 
|---|
| 260 | I RSIEN="" Q 0 | 
|---|
| 261 | S RSNAM=$P($G(^PXRMD(801.9,RSIEN,0)),U) | 
|---|
| 262 | I RSNAM["DONE ELSEWHERE" Q 1 | 
|---|
| 263 | N GUI,PIEN,PFOUND | 
|---|
| 264 | S PIEN=0,PFOUND=0 | 
|---|
| 265 | F  S PIEN=$O(^PXRMD(801.41,DITEM,10,"D",PIEN)) Q:'PIEN  D  Q:PFOUND | 
|---|
| 266 | .;Ignore elements and groups | 
|---|
| 267 | .I "EG"[$P($G(^PXRMD(801.41,PIEN,0)),U,4) Q | 
|---|
| 268 | .;GUI Process | 
|---|
| 269 | .S GUI=$P($G(^PXRMD(801.41,PIEN,46)),U) Q:'GUI | 
|---|
| 270 | .;Check if this is PXRM VISIT DATE (or a copy of it) | 
|---|
| 271 | .I $P($G(^PXRMD(801.42,GUI,0)),U)="VST_DATE" S PFOUND=1 | 
|---|
| 272 | Q PFOUND | 
|---|