| 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
 | 
|---|