| 1 | MAGGTUX ;WIOFO/GEK Imaging utility to validate INDEX values. | 
|---|
| 2 | ;;3.0;IMAGING;**59**;Nov 27, 2007;Build 20 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ;; +---------------------------------------------------------------+ | 
|---|
| 5 | ;; | Property of the US Government.                                | | 
|---|
| 6 | ;; | No permission to copy or redistribute this software is given. | | 
|---|
| 7 | ;; | Use of unreleased versions of this software requires the user | | 
|---|
| 8 | ;; | to execute a written test agreement with the VistA Imaging    | | 
|---|
| 9 | ;; | Development Office of the Department of Veterans Affairs,     | | 
|---|
| 10 | ;; | telephone (301) 734-0100.                                     | | 
|---|
| 11 | ;; |                                                               | | 
|---|
| 12 | ;; | The Food and Drug Administration classifies this software as  | | 
|---|
| 13 | ;; | a medical device.  As such, it may not be changed in any way. | | 
|---|
| 14 | ;; | Modifications to this software may result in an adulterated   | | 
|---|
| 15 | ;; | medical device under 21CFR820, the use of which is considered | | 
|---|
| 16 | ;; | to be a violation of US Federal Statutes.                     | | 
|---|
| 17 | ;; +---------------------------------------------------------------+ | 
|---|
| 18 | ;; | 
|---|
| 19 | Q | 
|---|
| 20 | CHECK ; Check the entries, NO DATABASE changes. | 
|---|
| 21 | D 1(0,"MAGGTUXC") | 
|---|
| 22 | Q | 
|---|
| 23 | FIX ; Fix/Check INDEX values in Image File entries. | 
|---|
| 24 | D 1(1,"MAGGTUX") | 
|---|
| 25 | Q | 
|---|
| 26 | 1(COMMIT,MAGN) ; Start here. | 
|---|
| 27 | I '$D(DUZ) W !,"DUZ is undefined.   Quitting." Q | 
|---|
| 28 | N DESC,ANS,ZTDTH,ZTIO,ZTRTN,ZTDESC,ZTSAVE,ZTSK ; -- TaskMan variables | 
|---|
| 29 | I 'COMMIT W !,"   **** Just Checking entries, no DataBase changes will occur. ****",! | 
|---|
| 30 | W !,"Validate Image Index Terms:" | 
|---|
| 31 | W !,"  The Image File is searched for invalid or missing index values." | 
|---|
| 32 | W !,"  The Image Index Generate and Commit functions are used" | 
|---|
| 33 | W !,"  to fix the incorrect Index values." | 
|---|
| 34 | W ! | 
|---|
| 35 | W !,"For a summary of the index values that will be changed." | 
|---|
| 36 | W !,"  use the menu option:   CHK  -  Check Image File for missing Index values" | 
|---|
| 37 | W !," " | 
|---|
| 38 | W !,"To Fix the invalid index values in the Image File (#2005)." | 
|---|
| 39 | W !,"  use the menu option:   FIX  -  Fix missing Index values in Image File" | 
|---|
| 40 | W ! | 
|---|
| 41 | I 'COMMIT W !,"   **** Just Checking entries, No DataBase changes will occur. ****",! | 
|---|
| 42 | E  W !,"   **** Fixing invalid entries,  DataBase changes Will occur. ****",! | 
|---|
| 43 | D TASKMAN^MAGXCVP(.ANS) | 
|---|
| 44 | I "^"=ANS W !,"Canceled. " Q | 
|---|
| 45 | S ZTSK=0 I ANS="" D START(COMMIT,MAGN,0) Q | 
|---|
| 46 | S ZTRTN="TASK^MAGGTUX" | 
|---|
| 47 | S DESC=$S(COMMIT:"FIX INVALID INDEX VALUES",1:"CHECK FOR INVALID INDEX VALUES") | 
|---|
| 48 | S ZTDESC=DESC | 
|---|
| 49 | S ZTDTH=ANS,ZTIO="" | 
|---|
| 50 | S ZTSAVE("COMMIT")=COMMIT,ZTSAVE("MAGN")=MAGN,ZTSAVE("QUEUED")=1 | 
|---|
| 51 | D ^%ZTLOAD | 
|---|
| 52 | W !,DESC_" Has been Queued as task# : "_ZTSK | 
|---|
| 53 | Q | 
|---|
| 54 | TASK ; | 
|---|
| 55 | D START(COMMIT,MAGN,QUEUED) | 
|---|
| 56 | Q | 
|---|
| 57 | START(COMMIT,MAGN,QUEUED) ;Start here. | 
|---|
| 58 | N $ETRAP,$ESTACK S $ETRAP="D ERR^"_$T(+0) | 
|---|
| 59 | L +MAGTMP("VALIDATE INDEX TERMS"):0 E  D  Q | 
|---|
| 60 | . I 'QUEUED W !,"Image Index Validate process is currently running.  Try later." Q | 
|---|
| 61 | . S XMSUB="Image Index Validate wasn't started" | 
|---|
| 62 | . S ^TMP($J,"MAGQ",1)="You attempted to Task the Index Validate process, but the" | 
|---|
| 63 | . S ^TMP($J,"MAGQ",2)="Image Validate process is currently running.  Please try later." | 
|---|
| 64 | . D MAILSHR^MAGQBUT1 | 
|---|
| 65 | . Q | 
|---|
| 66 | N DOT,N0,N40,OL40,N2,MDFN,IXT,IXP,IXS,IXO,ST,ET,NORG,ISGRP,X,J,RADCT,RADCR,CDT,IEN,INDXD | 
|---|
| 67 | N PKG,SD,TIM,TITLE,TIUDA,TTLDA,MRY,LNT,LNI,X1,STTIME,ENDTIME,ELSP,%H,% | 
|---|
| 68 | N GRINT,NI,NOPAT,NOZ,INVG,CRCT,INVO,GRINI,NT,CT,STOP,LN,GO1,GO0,ORG,OFX,NOMERG,OKMERG,FIX | 
|---|
| 69 | S (GRINT,NI,NOPAT,NOZ,INVG,CRCT,INVO,GRINI,NT,CT,STOP,LN,GO1,GO0,ORG,OFX,NOMERG,OKMERG,FIX)=0 | 
|---|
| 70 | ; Write 200 lines to screen. | 
|---|
| 71 | S DOT=$P(($P(^MAG(2005,0),"^",4)/200),".",1) | 
|---|
| 72 | S IEN="A" | 
|---|
| 73 | ; if it was started and stopped, continue. | 
|---|
| 74 | ; ^XTMP("MAGGTUX,0)=PurgeDate^CreateDate^LastIENChecked^HighestIENChecked^NumberChecked^Description | 
|---|
| 75 | ; | 
|---|
| 76 | I $D(^XTMP(MAGN,0)) D INIT^MAGGTUX2 | 
|---|
| 77 | S STTIME=$$NOW^XLFDT | 
|---|
| 78 | I 'QUEUED D  I STOP G END | 
|---|
| 79 | . I 'COMMIT W !!,"Just Checking Index Terms, NO CHANGES to database. (Q to quit)" | 
|---|
| 80 | . E  W !!,"Invalid entries will be fixed.  Database will be modified (Q to quit)" | 
|---|
| 81 | . W !!,"   Press 'Q' at any time to QUIT.  It can be resumed later.",! | 
|---|
| 82 | . W !,"Ready to Start   Y/N    N// " R X:30 | 
|---|
| 83 | . I "Nn"[X W !!,"Canceled." S STOP=1 Q | 
|---|
| 84 | . W !,"Starting at "_$$FMTE^XLFDT(STTIME) | 
|---|
| 85 | . Q | 
|---|
| 86 | ;  Start..... | 
|---|
| 87 | ;  Set XTMP Dates | 
|---|
| 88 | I IEN="A" K ^XTMP(MAGN) S $P(^XTMP(MAGN,0),"^",4)=$O(^MAG(2005,IEN),-1) ; Keep the Highest IEN checked. | 
|---|
| 89 | S X1=DT,X2=14 D C^%DTC S $P(^XTMP(MAGN,0),"^",1,2)=X_"^"_$$NOW^XLFDT | 
|---|
| 90 | S $P(^XTMP(MAGN,0),"^",6)="Fix Invalid Index Nodes" | 
|---|
| 91 | ; Set variables to check the CR - CT problem. | 
|---|
| 92 | S RADCR=+$O(^MAG(2005.85,"B","COMPUTED RADIOGRAPHY","")) | 
|---|
| 93 | S RADCT=+$O(^MAG(2005.85,"B","COMPUTED TOMOGRAPHY","")) | 
|---|
| 94 | ; | 
|---|
| 95 | D PRHDR | 
|---|
| 96 | S ST=$P($H,",",2) ; Start Time | 
|---|
| 97 | S TIM=$P(^MAG(2005,0),"^",4) ; Total Images | 
|---|
| 98 | F  S IEN=$O(^MAG(2005,IEN),-1) Q:IEN=0  D  I STOP Q  ;G END | 
|---|
| 99 | . R X:0 I X="Q" D  Q | 
|---|
| 100 | . . S STOP=1 | 
|---|
| 101 | . . I 'QUEUED W ! D MES^XPDUTL(" Function interrupted. ") | 
|---|
| 102 | . . Q | 
|---|
| 103 | . S ISGRP=0 | 
|---|
| 104 | . S N0=$G(^MAG(2005,IEN,0)) | 
|---|
| 105 | . S N2=$G(^MAG(2005,IEN,2)) | 
|---|
| 106 | . S N40=$G(^MAG(2005,IEN,40)) | 
|---|
| 107 | . S MDFN=+$P(N0,"^",7) | 
|---|
| 108 | . S IXT=$P(N40,"^",3),IXS=$P(N40,"^",5),IXP=$P(N40,"^",4),IXO=$P(N40,"^",6) | 
|---|
| 109 | . S CT=CT+1 | 
|---|
| 110 | . I (CT=1)!(CT#DOT=0)!($O(^MAG(2005,IEN),-1)=0) D PRLINE | 
|---|
| 111 | . ; Count NO Patient, No Zero Node | 
|---|
| 112 | . I 'MDFN S NOPAT=NOPAT+1 Q | 
|---|
| 113 | . I N0="" S NOZ=NOZ+1 Q | 
|---|
| 114 | . ; Count Groups of 1, No change. | 
|---|
| 115 | . I $P(N0,"^",6)=11 S ISGRP=1 I $P($G(^MAG(2005,IEN,1,0)),"^",4)=1 S GO1=GO1+1 | 
|---|
| 116 | . I ISGRP I $O(^MAG(2005,IEN,1,0))="" S GO0=GO0+1 Q | 
|---|
| 117 | . ; | 
|---|
| 118 | . ;  Chk ORIGIN (fld #45) had 'VA' not 'V'. | 
|---|
| 119 | . I '("VNFD"[$P(N40,"^",6)) D CHK45^MAGGTUX2(.N40,IEN) | 
|---|
| 120 | . ; | 
|---|
| 121 | . ; Was a CR, CT mismapping, this will fix it. | 
|---|
| 122 | . I RADCR=IXP D CHKCR^MAGGTUX2(.N40,IEN) | 
|---|
| 123 | . ; | 
|---|
| 124 | . ; Validate the Proc/Event <-> Spec/SubSpec dependency | 
|---|
| 125 | . ; Check TYPE is Clinical, All are Active. | 
|---|
| 126 | . I IXT D VALIND^MAGGTUX2 Q  ;If image has TYPE, Check then Quit. | 
|---|
| 127 | . ; | 
|---|
| 128 | . ; Counting problems | 
|---|
| 129 | . ; If no index values. | 
|---|
| 130 | . I N40="" D | 
|---|
| 131 | . . I $P(N0,"^",10) S GRINI=GRINI+1 ; GRoupImageNoIndex | 
|---|
| 132 | . . E  S NI=NI+1 ; NoIndex | 
|---|
| 133 | . . S LNI=IEN_"-"_$P(N2,"^",1) | 
|---|
| 134 | . . Q | 
|---|
| 135 | . ; | 
|---|
| 136 | . ; If this case follows the Majority of invalid 40 Nodes | 
|---|
| 137 | . ; i.e. PKG^^^^^V  PKG^^^^^VA then Kill and ReGenerate later | 
|---|
| 138 | . I (N40'="") D | 
|---|
| 139 | . . I $P(N0,"^",10) S GRINT=GRINT+1 ; Group Image with No Type | 
|---|
| 140 | . . E  S NT=NT+1  ; NoType :  group or single | 
|---|
| 141 | . . S ^XTMP(MAGN,"AAN40",N40)=$G(^XTMP(MAGN,"AAN40",N40))+1 | 
|---|
| 142 | . . S ^XTMP(MAGN,"AAN40",N40,"IEN")=IEN | 
|---|
| 143 | . . S LNT=IEN_"-"_$P(N2,"^",1) | 
|---|
| 144 | . . ; if 40 node is just default PKG and ORIGIN,  we kill and regenerate. | 
|---|
| 145 | . . ; Don't kill N40 if Origin is F,D or N | 
|---|
| 146 | . . I N40?.A1"^^^^^".E I "V"[$P(N40,"^",6) S N40="" | 
|---|
| 147 | . . Q | 
|---|
| 148 | . ; | 
|---|
| 149 | . ; Use Patch 31 Utils to Generate Index values | 
|---|
| 150 | . I N40="" D  Q | 
|---|
| 151 | . . I COMMIT D | 
|---|
| 152 | . . . ; GENERATE AND COMMIT INDEX VALUES. | 
|---|
| 153 | . . . D GENIEN^MAGXCVI(IEN,.INDXD) | 
|---|
| 154 | . . . I $P(INDXD,"^",6)="" S $P(INDXD,"^",6)="V" | 
|---|
| 155 | . . . S ^MAG(2005,IEN,40)=INDXD | 
|---|
| 156 | . . . S ^MAGIXCVT(2006.96,IEN)=2 ; status = 2 ( generate by Patch 59) | 
|---|
| 157 | . . . S FIX=FIX+1 | 
|---|
| 158 | . . . D ENTRY^MAGLOG("INDEX-ALL",DUZ,IEN,"TUX59",MDFN,1) | 
|---|
| 159 | . . . Q | 
|---|
| 160 | . . Q | 
|---|
| 161 | . ;  40 node is missing TYPE | 
|---|
| 162 | . ;   - has Spec and/or Proc | 
|---|
| 163 | . ;   - or Origin is not V. | 
|---|
| 164 | . ; Compare old to new, only set missing pieces, (don't overwrite) | 
|---|
| 165 | . ; If the merged 40 node doesn't pass VAL59G, | 
|---|
| 166 | . ; Then revert to old Spec and Proc but keep Generated Type. | 
|---|
| 167 | . ; | 
|---|
| 168 | . D GENIEN^MAGXCVI(IEN,.INDXD) | 
|---|
| 169 | . I $P(INDXD,"^",6)="" S $P(INDXD,"^",6)="V" | 
|---|
| 170 | . S OL40=N40 | 
|---|
| 171 | . ; We're not changing existing values of Spec,Proc or Origin | 
|---|
| 172 | . F J=1:1:6 I '$L($P(N40,"^",J)) S $P(N40,"^",J)=$P(INDXD,"^",J) | 
|---|
| 173 | . ;  Validate the merged Spec and Proc dependency, may be invalid. | 
|---|
| 174 | . D VALMERG^MAGGTUX2(OL40,.N40) ; | 
|---|
| 175 | . I '$D(^XTMP(MAGN,"AAN40",OL40,"CVT",INDXD)) S ^XTMP(MAGN,"AAN40",OL40,"CVT",INDXD)=N40 | 
|---|
| 176 | . I COMMIT D | 
|---|
| 177 | . . S ^MAG(2005,IEN,40)=N40 | 
|---|
| 178 | . . S FIX=FIX+1 | 
|---|
| 179 | . . S ^MAGIXCVT(2006.96,IEN)=2 ; 2 is set of codes - converted by Patch 59 | 
|---|
| 180 | . . D ENTRY^MAGLOG("INDEX-42",DUZ,IEN,"TUX59",MDFN,1) | 
|---|
| 181 | . . Q | 
|---|
| 182 | . Q | 
|---|
| 183 | S ENDTIME=$$NOW^XLFDT | 
|---|
| 184 | S %H=$P($H,",")_","_($P($H,",",2)-ST) D YMD^%DTC | 
|---|
| 185 | S ELSP=$P($$FMTE^XLFDT(X_%),"@",2) | 
|---|
| 186 | S ^XTMP(MAGN,0,"END")=$$FMTE^XLFDT(ENDTIME)_"^"_ELSP | 
|---|
| 187 | S $P(^XTMP(MAGN,0),"^",3)=IEN ; last IEN Checked. | 
|---|
| 188 | S $P(^XTMP(MAGN,0),"^",5)=$P(^XTMP(MAGN,0),"^",5)+CT | 
|---|
| 189 | ; | 
|---|
| 190 | S ^XTMP(MAGN,"AATCHK")=$G(^XTMP(MAGN,"AATCHK"))+CT | 
|---|
| 191 | S ^XTMP(MAGN,"AANT")=NT | 
|---|
| 192 | S ^XTMP(MAGN,"AANI")=NI | 
|---|
| 193 | S ^XTMP(MAGN,"AAGRINT")=GRINT | 
|---|
| 194 | S ^XTMP(MAGN,"AAGRINI")=GRINI | 
|---|
| 195 | S ^XTMP(MAGN,"AAGO1")=GO1 | 
|---|
| 196 | S ^XTMP(MAGN,"AAGO0")=GO0 | 
|---|
| 197 | S ^XTMP(MAGN,"AAOFX")=OFX | 
|---|
| 198 | S ^XTMP(MAGN,"AAINVG")=INVG | 
|---|
| 199 | S ^XTMP(MAGN,"AAINVO")=INVO | 
|---|
| 200 | S ^XTMP(MAGN,"AANOMERG")=NOMERG | 
|---|
| 201 | S ^XTMP(MAGN,"AAOKMERG")=OKMERG | 
|---|
| 202 | S ^XTMP(MAGN,"AACRCT")=CRCT | 
|---|
| 203 | S ^XTMP(MAGN,"AAN40","no index")=GRINI+NI | 
|---|
| 204 | S ^XTMP(MAGN,"AANOPAT")=NOPAT | 
|---|
| 205 | S ^XTMP(MAGN,"AANOZ")=NOZ | 
|---|
| 206 | S ^XTMP(MAGN,0,"NT")=$G(LNT) | 
|---|
| 207 | S ^XTMP(MAGN,0,"NI")=$G(LNI) | 
|---|
| 208 | I FIX S ^XTMP(MAGN,"AAFIX")=FIX | 
|---|
| 209 | I 'QUEUED D DISPLAY^MAGGTUX1 | 
|---|
| 210 | D MAIL^MAGGTUX1 | 
|---|
| 211 | ; KILL LOCKS. | 
|---|
| 212 | END ; | 
|---|
| 213 | L -MAGTMP("VALIDATE INDEX TERMS") | 
|---|
| 214 | Q | 
|---|
| 215 | ERR ; | 
|---|
| 216 | L -MAGTMP("VALIDATE INDEX TERMS") | 
|---|
| 217 | D @^%ZOSF("ERRTN") | 
|---|
| 218 | Q | 
|---|
| 219 | EST() ;Estimate time remaining. | 
|---|
| 220 | Q:'$G(ST) ""    ; we didn't start yet. | 
|---|
| 221 | N ET,EST,PS             ; Elapsed Time, Estimate Time, Number Per Second. | 
|---|
| 222 | S ET=$P($H,",",2)-ST I ET<2 Q "" ; Elapsed Time (seconds) | 
|---|
| 223 | I (CT/ET)<1 Q "" | 
|---|
| 224 | S PS=$P(CT/ET,".") ; number Per second | 
|---|
| 225 | S EST=$P(((TIM-CT)/PS),".") ;remaining/ (num/sec) = seconds remaining | 
|---|
| 226 | S %H=$P($H,",")_","_EST D YMD^%DTC | 
|---|
| 227 | Q $P($$FMTE^XLFDT(X_%),"@",2) | 
|---|
| 228 | ; | 
|---|
| 229 | PRLINE ; Print a line of current counts | 
|---|
| 230 | Q:QUEUED | 
|---|
| 231 | S CDT=$$FMTE^XLFDT($P($G(^MAG(2005,IEN,2)),"^",1),"2DF") ; Capture DaTe | 
|---|
| 232 | W !,IEN,?10,CDT,?22,CT,?36,NT,?48,NI,?64,$$EST_" ..." | 
|---|
| 233 | S LN=LN+1 I LN#10=0 D PRHDR | 
|---|
| 234 | Q | 
|---|
| 235 | PRHDR ; Print a header and estimate of time. | 
|---|
| 236 | ; For Test DataBase, put code to Hang here for 1 sec. (magslow) | 
|---|
| 237 | Q:QUEUED | 
|---|
| 238 | I 'COMMIT W !,"Just Checking Index Terms, NO CHANGES to database. (Q to quit)" | 
|---|
| 239 | W !,"IEN       Saved       #checked   No Type     No Index values    est: " | 
|---|
| 240 | Q | 
|---|
| 241 | REVIEW G REVIEW^MAGGTUX1 | 
|---|
| 242 | Q | 
|---|