| 1 | PXRMDBL2 ; SLC/PJH - Reminder Dialog Generation. ;05/08/2000
 | 
|---|
| 2 |  ;;2.0;CLINICAL REMINDERS;;Feb 04, 2005
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;Process individual finding
 | 
|---|
| 5 |  ;--------------------------
 | 
|---|
| 6 | FIND(DATA) ;
 | 
|---|
| 7 |  ;Determine finding type
 | 
|---|
| 8 |  S FGLOB=$P($P(DATA,U),";",2) Q:FGLOB=""
 | 
|---|
| 9 |  S FITEM=$P(DATA,";") Q:FITEM=""
 | 
|---|
| 10 |  S FTYP=$G(DEF1(FGLOB)) Q:FTYP=""
 | 
|---|
| 11 |  ;Get resolution item (same as finding item)
 | 
|---|
| 12 |  S RESN=$P(DATA,U)
 | 
|---|
| 13 |  ;Mental Health Test
 | 
|---|
| 14 |  I FTYP="MH" Q:'$$MHOK^PXRMDBL3(FITEM)
 | 
|---|
| 15 |  ;Check if an entry exists in the finding item dialog file
 | 
|---|
| 16 |  I $D(^PXRMD(801.43,"AC",RESN)) D  Q:DIEN
 | 
|---|
| 17 |  .S DIEN=$$OK(RESN) Q:'DIEN
 | 
|---|
| 18 |  .;Create entry in array used to build reminder dialog
 | 
|---|
| 19 |  .S CNT=CNT+1,ARRAY(CNT)=801.43_U_DIEN
 | 
|---|
| 20 |  .W !!,CNT,?5,"Finding item dialog "_$$FNAM(RESN)
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 |  ;Determine names/text for non-taxonomy/orderable item findings
 | 
|---|
| 23 |  I (FTYP'="TX")&(FTYP'="OI") D
 | 
|---|
| 24 |  .I FTYP="ED" S INAME=$$NAME(FGLOB,FITEM,4)
 | 
|---|
| 25 |  .I FTYP="VM" S INAME=$$NAME(FGLOB,FITEM,1)
 | 
|---|
| 26 |  .I (FTYP'="ED")&(FTYP'="VM") S INAME=$$NAME(FGLOB,FITEM,2)
 | 
|---|
| 27 |  .;Dialog item name root
 | 
|---|
| 28 |  .S DNAME=FTYP_" "_INAME
 | 
|---|
| 29 |  .;Create array entry for each resolution defined in #801.45
 | 
|---|
| 30 |  .D RESOL(FTYP,0)
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 |  ;Determine names/text for orderable item findings
 | 
|---|
| 33 |  I FTYP="OI" D
 | 
|---|
| 34 |  .S INAME=$$NAME(FGLOB,FITEM,1)
 | 
|---|
| 35 |  .;Dialog item name root
 | 
|---|
| 36 |  .S DNAME=FTYP_" "_INAME
 | 
|---|
| 37 |  .;Create array entry
 | 
|---|
| 38 |  .D RESOL(FTYP,0)
 | 
|---|
| 39 |  ;
 | 
|---|
| 40 |  ;Determine names/text for taxonomy findings
 | 
|---|
| 41 |  I FTYP="TX" S INAME=$$NAME(FGLOB,FITEM,2) D TAXON
 | 
|---|
| 42 |  Q
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 |  ;Get Finding Item name
 | 
|---|
| 45 |  ;---------------------
 | 
|---|
| 46 | FNAM(FIND) ;
 | 
|---|
| 47 |  N DATA,NAME,NODE
 | 
|---|
| 48 |  S NAME="Unknown"
 | 
|---|
| 49 |  S NODE=$O(^PXRMD(801.43,"AC",FIND,"")) Q:'NODE NAME
 | 
|---|
| 50 |  S DATA=$G(^PXRMD(801.43,NODE,0)) Q:DATA="" NAME
 | 
|---|
| 51 |  I $P(DATA,U)'="" S NAME=$P(DATA,U)
 | 
|---|
| 52 |  S GLOB=$P($P(FIND,U),";",2) S:GLOB]"" NAME=$G(DEF1(GLOB))_" - "_NAME
 | 
|---|
| 53 |  Q NAME
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  ;additional prompts in 801.45
 | 
|---|
| 56 |  ;----------------------------
 | 
|---|
| 57 | FPROMPT(FNODE,RSUB,CNT,ARRAY) ;
 | 
|---|
| 58 |  ;Get all additional fields for this resolution type
 | 
|---|
| 59 |  N ACNT,ASUB,ATXT,DNODE,RDATA,REXC,ROVR,RREQ,RSNL
 | 
|---|
| 60 |  S ASUB=0,ACNT=0
 | 
|---|
| 61 |  F  S ASUB=$O(^PXRMD(801.45,FNODE,1,RSUB,5,ASUB)) Q:'ASUB  D
 | 
|---|
| 62 |  .S RDATA=$G(^PXRMD(801.45,FNODE,1,RSUB,5,ASUB,0)) Q:RDATA=""
 | 
|---|
| 63 |  .;Ignore if disabled
 | 
|---|
| 64 |  .I $P(RDATA,U,3)=1 Q
 | 
|---|
| 65 |  .S DNODE=$P(RDATA,U) Q:DNODE=""
 | 
|---|
| 66 |  .S ATXT=$P($G(^PXRMD(801.41,DNODE,0)),U) Q:ATXT=""
 | 
|---|
| 67 |  .S REXC=$P(RDATA,U,7),RSNL=$P(RDATA,U,6)
 | 
|---|
| 68 |  .S ROVR=$P(RDATA,U,5),RREQ=$P(RDATA,U,2)
 | 
|---|
| 69 |  .;S ATXT=$TR(ATXT,UPPER,LOWER)
 | 
|---|
| 70 |  .S ACNT=ACNT+1
 | 
|---|
| 71 |  .S ARRAY(CNT,ACNT)=DNODE_U_ROVR_U_RSNL_U_REXC_U_RREQ
 | 
|---|
| 72 |  Q
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  ;Health Factor Resolutions
 | 
|---|
| 75 |  ;-------------------------
 | 
|---|
| 76 | HF(RNODE) ;
 | 
|---|
| 77 |  ;Defined in #801.95
 | 
|---|
| 78 |  I $D(^PXRMD(801.95,$P(RESN,";"),1,"B",RNODE)) Q 1
 | 
|---|
| 79 |  ;Check for local statuses if this is a national code (restricted edit)
 | 
|---|
| 80 |  N FOUND,LSUB S FOUND=0,LSUB=""
 | 
|---|
| 81 |  I $P($G(^PXRMD(801.9,RNODE,0)),U,6)=1 D
 | 
|---|
| 82 |  .F  S LSUB=$O(^PXRMD(801.9,RNODE,10,"B",LSUB)) Q:'LSUB  D  Q:FOUND
 | 
|---|
| 83 |  ..S:$D(^PXRMD(801.95,$P(RESN,";"),1,"B",LSUB)) FOUND=1
 | 
|---|
| 84 |  Q FOUND
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  ;Returns item name
 | 
|---|
| 87 |  ;-----------------
 | 
|---|
| 88 | NAME(FGLOB,FITEM,POSN) ;
 | 
|---|
| 89 |  N NAME
 | 
|---|
| 90 |  S FGLOB=U_FGLOB_FITEM_",0)"
 | 
|---|
| 91 |  S NAME=$P($G(@FGLOB),U,POSN)
 | 
|---|
| 92 |  I NAME]"" D
 | 
|---|
| 93 |  .I FGLOB["ICD9(" S NAME=$P($$ICDDX^ICDCODE(FITEM,""),U,2)
 | 
|---|
| 94 |  .I FGLOB["ICPT(" S NAME=$P($$CPT^ICPTCOD(FITEM,""),U,2)_"  "_$TR(NAME,LOWER,UPPER)
 | 
|---|
| 95 |  .;I FGLOB["ICD9(" S NAME=NAME_" ("_$P($G(@FGLOB),U)_")"
 | 
|---|
| 96 |  .;I FGLOB["ICPT(" S NAME=$P($G(@FGLOB),U)_"  "_$TR(NAME,LOWER,UPPER)
 | 
|---|
| 97 |  I NAME="" S NAME=$P($G(@FGLOB),U)
 | 
|---|
| 98 |  I NAME="" S NAME=FITEM
 | 
|---|
| 99 |  Q NAME
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 |  ;Checks if an enabled finding item dialog exists
 | 
|---|
| 102 |  ;-----------------------------------------------
 | 
|---|
| 103 | OK(FIND) ;
 | 
|---|
| 104 |  N DATA,DIEN,DTYP,NODE
 | 
|---|
| 105 |  S NODE=$O(^PXRMD(801.43,"AC",FIND,"")) Q:'NODE 0
 | 
|---|
| 106 |  S DATA=$G(^PXRMD(801.43,NODE,0)) Q:DATA="" 0
 | 
|---|
| 107 |  ;Ignore disabled entries
 | 
|---|
| 108 |  I $P(DATA,U,3) Q 0
 | 
|---|
| 109 |  ;Ignore finding item dialogs no longer valid
 | 
|---|
| 110 |  S DIEN=$P(DATA,U,4) Q:DIEN="" 0
 | 
|---|
| 111 |  S DATA=$G(^PXRMD(801.41,DIEN,0)) Q:DATA="" 0
 | 
|---|
| 112 |  ;Ignore disabled dialogs
 | 
|---|
| 113 |  I $P(DATA,U,3)=1 Q 0
 | 
|---|
| 114 |  ;Return dialog ien
 | 
|---|
| 115 |  Q DIEN
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 |  ;Create array for each resolution status
 | 
|---|
| 118 |  ;---------------------------------------
 | 
|---|
| 119 | RESOL(TYP,TAX) ;
 | 
|---|
| 120 |  ; Predefined fields :
 | 
|---|
| 121 |  ; PNAME - text used in prompt
 | 
|---|
| 122 |  ; DNAME - text used in dialog item name
 | 
|---|
| 123 |  ; RESN  - finding item
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  ; Taxonomies  TYP=CPT or POV and TAX=1 or 0
 | 
|---|
| 126 |  ; Others      TAX=0 (ie: 1 prompt per code)
 | 
|---|
| 127 |  ;
 | 
|---|
| 128 |  ;Get parameter file node for this finding type
 | 
|---|
| 129 |  S FNODE=$O(^PXRMD(801.45,"B",TYP,"")) Q:FNODE=""
 | 
|---|
| 130 |  ;Get each resolution type for this finding type
 | 
|---|
| 131 |  S RSUB=0
 | 
|---|
| 132 |  F  S RSUB=$O(^PXRMD(801.45,FNODE,1,RSUB)) Q:'RSUB  D
 | 
|---|
| 133 |  .;Check if resolution type is disabled
 | 
|---|
| 134 |  .I $P($G(^PXRMD(801.45,FNODE,1,RSUB,0)),U,2)=1 Q
 | 
|---|
| 135 |  .;Construct name for this resolution type
 | 
|---|
| 136 |  .S RNODE=$P($G(^PXRMD(801.45,FNODE,1,RSUB,0)),U),RNAME=""
 | 
|---|
| 137 |  .I RNODE S RNAME=$P($G(^PXRMD(801.9,RNODE,0)),U,2)
 | 
|---|
| 138 |  .I RNAME="" S RNAME=$P($G(^PXRMD(801.9,RNODE,0)),U)
 | 
|---|
| 139 |  .;Validate resolution
 | 
|---|
| 140 |  .I TYP="HF" Q:'$$HF(RNODE)
 | 
|---|
| 141 |  .W !
 | 
|---|
| 142 |  .;Create arrays
 | 
|---|
| 143 |  .S CNT=CNT+1
 | 
|---|
| 144 |  .;Convert dialog item name to UC
 | 
|---|
| 145 |  .S DNAME=$TR(DNAME,LOWER,UPPER)
 | 
|---|
| 146 |  .;Truncate the item name - without finesse
 | 
|---|
| 147 |  .S DSHORT=DNAME_" "_RNAME
 | 
|---|
| 148 |  .I $L(DSHORT)>63 S DSHORT=$E(DNAME,1,53)_" "_$E(RNAME,1,9)
 | 
|---|
| 149 |  .;Dialog item name,resolution status and finding item
 | 
|---|
| 150 |  .I TYP'="OI" S ARRAY(CNT)=DSHORT_U_RNODE_U_RESN_U
 | 
|---|
| 151 |  .;For orderable items the finding field is empty
 | 
|---|
| 152 |  .I TYP="OI" S ARRAY(CNT)=DSHORT_U_RNODE_U_U_$P(RESN,";")
 | 
|---|
| 153 |  .;Append prefix and suffix if NOT a condensed taxonomy
 | 
|---|
| 154 |  .S PNAME=INAME
 | 
|---|
| 155 |  .I 'TAX D
 | 
|---|
| 156 |  ..;Prefix text
 | 
|---|
| 157 |  ..S RPRE=$G(^PXRMD(801.45,FNODE,1,RSUB,3)) I RPRE]"" S RPRE=RPRE_" "
 | 
|---|
| 158 |  ..;Suffix text
 | 
|---|
| 159 |  ..S RSUF=$G(^PXRMD(801.45,FNODE,1,RSUB,4))
 | 
|---|
| 160 |  ..I (RSUF]"")&($E(RSUF)'=".") S RSUF=" "_RSUF
 | 
|---|
| 161 |  ..;Prompt text
 | 
|---|
| 162 |  ..S PNAME=RPRE_$TR(INAME,UPPER,LOWER)_RSUF
 | 
|---|
| 163 |  ..;Convert first character
 | 
|---|
| 164 |  ..S $E(PNAME)=$TR($E(PNAME),LOWER,UPPER)
 | 
|---|
| 165 |  .;Prompt text
 | 
|---|
| 166 |  .S WPTXT(CNT,1)=PNAME
 | 
|---|
| 167 |  .;test
 | 
|---|
| 168 |  .W !,CNT,?5,WPTXT(CNT,1)
 | 
|---|
| 169 |  .;Additional prompts from general finding parameters
 | 
|---|
| 170 |  .D FPROMPT(FNODE,RSUB,CNT,.ARRAY)
 | 
|---|
| 171 |  Q
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 |  ;Taxonomy Dialog in #801.2
 | 
|---|
| 174 |  ;-------------------------
 | 
|---|
| 175 | TAXON ;
 | 
|---|
| 176 |  S TDPAR=$G(^PXD(811.2,FITEM,"SDZ")),TDTXT="",TDHTXT=""
 | 
|---|
| 177 |  S TPPAR=$G(^PXD(811.2,FITEM,"SDZ")),TPTXT="",TPHTXT=""
 | 
|---|
| 178 |  S TDMOD=$P(TDPAR,U,1),TPMOD=$P(TPPAR,U,1)
 | 
|---|
| 179 |  ;Check what type of taxonomy codes exist
 | 
|---|
| 180 |  S TDX=$O(^PXD(811.2,FITEM,80,0))
 | 
|---|
| 181 |  S TPR=$O(^PXD(811.2,FITEM,81,0))
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  ;If taxonomy is to be presented as checkbox(s)
 | 
|---|
| 184 |  I ('TDMOD)!('TPMOD) D
 | 
|---|
| 185 |  .S DNAME=FTYP_" "_INAME
 | 
|---|
| 186 |  .;Create arrays
 | 
|---|
| 187 |  .S CNT=CNT+1
 | 
|---|
| 188 |  .;Convert dialog item name to UC
 | 
|---|
| 189 |  .S DNAME=$TR(DNAME,LOWER,UPPER)
 | 
|---|
| 190 |  .;Truncate the item name - without finesse
 | 
|---|
| 191 |  .S DSHORT=DNAME
 | 
|---|
| 192 |  .I $L(DSHORT)>40 S DSHORT=$E(DNAME,1,40)
 | 
|---|
| 193 |  .;Dialog item name and finding item
 | 
|---|
| 194 |  .S ARRAY(CNT)=DSHORT_U_U_RESN
 | 
|---|
| 195 |  .;Prompt text
 | 
|---|
| 196 |  .S WPTXT(CNT,1)=INAME
 | 
|---|
| 197 |  .W !!,CNT,?5,WPTXT(CNT,1)
 | 
|---|
| 198 |  ; 
 | 
|---|
| 199 |  ;Individual Diagnoses
 | 
|---|
| 200 |  I TDX,TDMOD D
 | 
|---|
| 201 |  .N NLINES,CODE,OUTPUT
 | 
|---|
| 202 |  .S TSEQ=0,TTYP="POV"
 | 
|---|
| 203 |  .F  S TSEQ=$O(^PXD(811.2,FITEM,"SDX","B",TSEQ)) Q:'TSEQ  D
 | 
|---|
| 204 |  ..S TSUB=$O(^PXD(811.2,FITEM,"SDX","B",TSEQ,"")) Q:'TSUB
 | 
|---|
| 205 |  ..S DATA=$G(^PXD(811.2,FITEM,"SDX",TSUB,0)) Q:DATA=""
 | 
|---|
| 206 |  ..S TITEM=$P(DATA,U) Q:'TITEM
 | 
|---|
| 207 |  ..;Ignore if disabled
 | 
|---|
| 208 |  ..Q:$P(DATA,U,3)=1
 | 
|---|
| 209 |  ..;Resolution becomes the diagnosis
 | 
|---|
| 210 |  ..S RESN=TITEM_";ICD9("
 | 
|---|
| 211 |  ..;Take prompt from user defined text
 | 
|---|
| 212 |  ..S INAME=$P(DATA,U,2)
 | 
|---|
| 213 |  ..;Otherwise use name of diagnosis
 | 
|---|
| 214 |  ..S CODE=$$ICDDX^ICDCODE(TITEM,"")
 | 
|---|
| 215 |  ..S NLINES=$$ICDD^ICDCODE($G(CODE),"OUTPUT","")
 | 
|---|
| 216 |  ..S INAME=$G(OUTPUT(1))
 | 
|---|
| 217 |  ..I INAME="" S FGLOB="ICD9(",INAME=$$NAME(FGLOB,TITEM,3)
 | 
|---|
| 218 |  ..;Dialog Item name root
 | 
|---|
| 219 |  ..S DNAME="POV "_INAME
 | 
|---|
| 220 |  ..;Create array entry for each resolution defined in #801.45
 | 
|---|
| 221 |  ..D RESOL(TTYP,0)
 | 
|---|
| 222 |  ;
 | 
|---|
| 223 |  ;Individual Procedures
 | 
|---|
| 224 |  I TPR,TPMOD D
 | 
|---|
| 225 |  .S TSEQ=0,TTYP="CPT"
 | 
|---|
| 226 |  .F  S TSEQ=$O(^PXD(811.2,FITEM,"SPR","B",TSEQ)) Q:'TSEQ  D
 | 
|---|
| 227 |  ..S TSUB=$O(^PXD(811.2,FITEM,"SPR","B",TSEQ,"")) Q:'TSUB
 | 
|---|
| 228 |  ..S DATA=$G(^PXD(811.2,FITEM,"SPR",TSUB,0)) Q:DATA=""
 | 
|---|
| 229 |  ..S TITEM=$P(DATA,U) Q:'TITEM
 | 
|---|
| 230 |  ..;Ignore if disabled
 | 
|---|
| 231 |  ..Q:$P(DATA,U,3)=1
 | 
|---|
| 232 |  ..;Resolution becomes the procedure
 | 
|---|
| 233 |  ..S RESN=TITEM_";ICPT("
 | 
|---|
| 234 |  ..;Take prompt from user defined text
 | 
|---|
| 235 |  ..S INAME=$P(DATA,U,2)
 | 
|---|
| 236 |  ..;Otherwise use name of procedure
 | 
|---|
| 237 |  ..I INAME="" S FGLOB="ICPT(",INAME=$$NAME(FGLOB,TITEM,2)
 | 
|---|
| 238 |  ..;Dialog Item name root
 | 
|---|
| 239 |  ..S DNAME="CPT "_INAME
 | 
|---|
| 240 |  ..;Create array entry for each resolution defined in #801.45
 | 
|---|
| 241 |  ..D RESOL(TTYP,0)
 | 
|---|
| 242 |  Q
 | 
|---|