MAGGTUX	;WIOFO/GEK Imaging utility to validate INDEX values.
	;;3.0;IMAGING;**59**;Nov 27, 2007;Build 20
	;;Per VHA Directive 2004-038, this routine should not be modified.
	;; +---------------------------------------------------------------+
	;; | Property of the US Government.                                |
	;; | No permission to copy or redistribute this software is given. |
	;; | Use of unreleased versions of this software requires the user |
	;; | to execute a written test agreement with the VistA Imaging    |
	;; | Development Office of the Department of Veterans Affairs,     |
	;; | telephone (301) 734-0100.                                     |
	;; |                                                               |
	;; | The Food and Drug Administration classifies this software as  |
	;; | a medical device.  As such, it may not be changed in any way. |
	;; | Modifications to this software may result in an adulterated   |
	;; | medical device under 21CFR820, the use of which is considered |
	;; | to be a violation of US Federal Statutes.                     |
	;; +---------------------------------------------------------------+
	;;
	Q
CHECK	; Check the entries, NO DATABASE changes.
	D 1(0,"MAGGTUXC")
	Q
FIX	; Fix/Check INDEX values in Image File entries. 
	D 1(1,"MAGGTUX")
	Q
1(COMMIT,MAGN)	; Start here.
	I '$D(DUZ) W !,"DUZ is undefined.   Quitting." Q
	N DESC,ANS,ZTDTH,ZTIO,ZTRTN,ZTDESC,ZTSAVE,ZTSK ; -- TaskMan variables
	I 'COMMIT W !,"   **** Just Checking entries, no DataBase changes will occur. ****",!
	W !,"Validate Image Index Terms:"
	W !,"  The Image File is searched for invalid or missing index values."
	W !,"  The Image Index Generate and Commit functions are used"
	W !,"  to fix the incorrect Index values."
	W !
	W !,"For a summary of the index values that will be changed."
	W !,"  use the menu option:   CHK  -  Check Image File for missing Index values"
	W !," "
	W !,"To Fix the invalid index values in the Image File (#2005)."
	W !,"  use the menu option:   FIX  -  Fix missing Index values in Image File"
	W !
	I 'COMMIT W !,"   **** Just Checking entries, No DataBase changes will occur. ****",!
	E  W !,"   **** Fixing invalid entries,  DataBase changes Will occur. ****",!
	D TASKMAN^MAGXCVP(.ANS)
	I "^"=ANS W !,"Canceled. " Q
	S ZTSK=0 I ANS="" D START(COMMIT,MAGN,0) Q
	S ZTRTN="TASK^MAGGTUX"
	S DESC=$S(COMMIT:"FIX INVALID INDEX VALUES",1:"CHECK FOR INVALID INDEX VALUES")
	S ZTDESC=DESC
	S ZTDTH=ANS,ZTIO=""
	S ZTSAVE("COMMIT")=COMMIT,ZTSAVE("MAGN")=MAGN,ZTSAVE("QUEUED")=1
	D ^%ZTLOAD
	W !,DESC_" Has been Queued as task# : "_ZTSK
	Q
TASK	;
	D START(COMMIT,MAGN,QUEUED)
	Q
START(COMMIT,MAGN,QUEUED)	;Start here.
	N $ETRAP,$ESTACK S $ETRAP="D ERR^"_$T(+0)
	L +MAGTMP("VALIDATE INDEX TERMS"):0 E  D  Q
	. I 'QUEUED W !,"Image Index Validate process is currently running.  Try later." Q
	. S XMSUB="Image Index Validate wasn't started"
	. S ^TMP($J,"MAGQ",1)="You attempted to Task the Index Validate process, but the"
	. S ^TMP($J,"MAGQ",2)="Image Validate process is currently running.  Please try later."
	. D MAILSHR^MAGQBUT1
	. Q
	N DOT,N0,N40,OL40,N2,MDFN,IXT,IXP,IXS,IXO,ST,ET,NORG,ISGRP,X,J,RADCT,RADCR,CDT,IEN,INDXD
	N PKG,SD,TIM,TITLE,TIUDA,TTLDA,MRY,LNT,LNI,X1,STTIME,ENDTIME,ELSP,%H,%
	N GRINT,NI,NOPAT,NOZ,INVG,CRCT,INVO,GRINI,NT,CT,STOP,LN,GO1,GO0,ORG,OFX,NOMERG,OKMERG,FIX
	S (GRINT,NI,NOPAT,NOZ,INVG,CRCT,INVO,GRINI,NT,CT,STOP,LN,GO1,GO0,ORG,OFX,NOMERG,OKMERG,FIX)=0
	; Write 200 lines to screen.
	S DOT=$P(($P(^MAG(2005,0),"^",4)/200),".",1)
	S IEN="A"
	; if it was started and stopped, continue.
	; ^XTMP("MAGGTUX,0)=PurgeDate^CreateDate^LastIENChecked^HighestIENChecked^NumberChecked^Description
	; 
	I $D(^XTMP(MAGN,0)) D INIT^MAGGTUX2
	S STTIME=$$NOW^XLFDT
	I 'QUEUED D  I STOP G END
	. I 'COMMIT W !!,"Just Checking Index Terms, NO CHANGES to database. (Q to quit)"
	. E  W !!,"Invalid entries will be fixed.  Database will be modified (Q to quit)"
	. W !!,"   Press 'Q' at any time to QUIT.  It can be resumed later.",!
	. W !,"Ready to Start   Y/N    N// " R X:30
	. I "Nn"[X W !!,"Canceled." S STOP=1 Q
	. W !,"Starting at "_$$FMTE^XLFDT(STTIME)
	. Q
	;  Start.....
	;  Set XTMP Dates
	I IEN="A" K ^XTMP(MAGN) S $P(^XTMP(MAGN,0),"^",4)=$O(^MAG(2005,IEN),-1) ; Keep the Highest IEN checked.
	S X1=DT,X2=14 D C^%DTC S $P(^XTMP(MAGN,0),"^",1,2)=X_"^"_$$NOW^XLFDT
	S $P(^XTMP(MAGN,0),"^",6)="Fix Invalid Index Nodes"
	; Set variables to check the CR - CT problem.
	S RADCR=+$O(^MAG(2005.85,"B","COMPUTED RADIOGRAPHY",""))
	S RADCT=+$O(^MAG(2005.85,"B","COMPUTED TOMOGRAPHY",""))
	;
	D PRHDR
	S ST=$P($H,",",2) ; Start Time
	S TIM=$P(^MAG(2005,0),"^",4) ; Total Images
	F  S IEN=$O(^MAG(2005,IEN),-1) Q:IEN=0  D  I STOP Q  ;G END
	. R X:0 I X="Q" D  Q
	. . S STOP=1
	. . I 'QUEUED W ! D MES^XPDUTL(" Function interrupted. ")
	. . Q
	. S ISGRP=0
	. S N0=$G(^MAG(2005,IEN,0))
	. S N2=$G(^MAG(2005,IEN,2))
	. S N40=$G(^MAG(2005,IEN,40))
	. S MDFN=+$P(N0,"^",7)
	. S IXT=$P(N40,"^",3),IXS=$P(N40,"^",5),IXP=$P(N40,"^",4),IXO=$P(N40,"^",6)
	. S CT=CT+1
	. I (CT=1)!(CT#DOT=0)!($O(^MAG(2005,IEN),-1)=0) D PRLINE
	. ; Count NO Patient, No Zero Node
	. I 'MDFN S NOPAT=NOPAT+1 Q
	. I N0="" S NOZ=NOZ+1 Q
	. ; Count Groups of 1, No change.
	. I $P(N0,"^",6)=11 S ISGRP=1 I $P($G(^MAG(2005,IEN,1,0)),"^",4)=1 S GO1=GO1+1
	. I ISGRP I $O(^MAG(2005,IEN,1,0))="" S GO0=GO0+1 Q
	. ;
	. ;  Chk ORIGIN (fld #45) had 'VA' not 'V'.
	. I '("VNFD"[$P(N40,"^",6)) D CHK45^MAGGTUX2(.N40,IEN)
	. ;
	. ; Was a CR, CT mismapping, this will fix it.
	. I RADCR=IXP D CHKCR^MAGGTUX2(.N40,IEN)
	. ; 
	. ; Validate the Proc/Event <-> Spec/SubSpec dependency
	. ; Check TYPE is Clinical, All are Active.
	. I IXT D VALIND^MAGGTUX2 Q  ;If image has TYPE, Check then Quit.
	. ;
	. ; Counting problems
	. ; If no index values.
	. I N40="" D
	. . I $P(N0,"^",10) S GRINI=GRINI+1 ; GRoupImageNoIndex
	. . E  S NI=NI+1 ; NoIndex
	. . S LNI=IEN_"-"_$P(N2,"^",1)
	. . Q
	. ;
	. ; If this case follows the Majority of invalid 40 Nodes
	. ; i.e. PKG^^^^^V  PKG^^^^^VA then Kill and ReGenerate later
	. I (N40'="") D
	. . I $P(N0,"^",10) S GRINT=GRINT+1 ; Group Image with No Type
	. . E  S NT=NT+1  ; NoType :  group or single
	. . S ^XTMP(MAGN,"AAN40",N40)=$G(^XTMP(MAGN,"AAN40",N40))+1
	. . S ^XTMP(MAGN,"AAN40",N40,"IEN")=IEN
	. . S LNT=IEN_"-"_$P(N2,"^",1)
	. . ; if 40 node is just default PKG and ORIGIN,  we kill and regenerate.
	. . ; Don't kill N40 if Origin is F,D or N
	. . I N40?.A1"^^^^^".E I "V"[$P(N40,"^",6) S N40=""
	. . Q
	. ;
	. ; Use Patch 31 Utils to Generate Index values
	. I N40="" D  Q
	. . I COMMIT D
	. . . ; GENERATE AND COMMIT INDEX VALUES.
	. . . D GENIEN^MAGXCVI(IEN,.INDXD)
	. . . I $P(INDXD,"^",6)="" S $P(INDXD,"^",6)="V"
	. . . S ^MAG(2005,IEN,40)=INDXD
	. . . S ^MAGIXCVT(2006.96,IEN)=2 ; status = 2 ( generate by Patch 59) 
	. . . S FIX=FIX+1
	. . . D ENTRY^MAGLOG("INDEX-ALL",DUZ,IEN,"TUX59",MDFN,1)
	. . . Q
	. . Q
	. ;  40 node is missing TYPE
	. ;   - has Spec and/or Proc 
	. ;   - or Origin is not V.
	. ; Compare old to new, only set missing pieces, (don't overwrite)
	. ; If the merged 40 node doesn't pass VAL59G,
	. ; Then revert to old Spec and Proc but keep Generated Type.
	. ; 
	. D GENIEN^MAGXCVI(IEN,.INDXD)
	. I $P(INDXD,"^",6)="" S $P(INDXD,"^",6)="V"
	. S OL40=N40
	. ; We're not changing existing values of Spec,Proc or Origin 
	. F J=1:1:6 I '$L($P(N40,"^",J)) S $P(N40,"^",J)=$P(INDXD,"^",J)
	. ;  Validate the merged Spec and Proc dependency, may be invalid.
	. D VALMERG^MAGGTUX2(OL40,.N40) ; 
	. I '$D(^XTMP(MAGN,"AAN40",OL40,"CVT",INDXD)) S ^XTMP(MAGN,"AAN40",OL40,"CVT",INDXD)=N40
	. I COMMIT D
	. . S ^MAG(2005,IEN,40)=N40
	. . S FIX=FIX+1
	. . S ^MAGIXCVT(2006.96,IEN)=2 ; 2 is set of codes - converted by Patch 59 
	. . D ENTRY^MAGLOG("INDEX-42",DUZ,IEN,"TUX59",MDFN,1)
	. . Q
	. Q
	S ENDTIME=$$NOW^XLFDT
	S %H=$P($H,",")_","_($P($H,",",2)-ST) D YMD^%DTC
	S ELSP=$P($$FMTE^XLFDT(X_%),"@",2)
	S ^XTMP(MAGN,0,"END")=$$FMTE^XLFDT(ENDTIME)_"^"_ELSP
	S $P(^XTMP(MAGN,0),"^",3)=IEN ; last IEN Checked.
	S $P(^XTMP(MAGN,0),"^",5)=$P(^XTMP(MAGN,0),"^",5)+CT
	;
	S ^XTMP(MAGN,"AATCHK")=$G(^XTMP(MAGN,"AATCHK"))+CT
	S ^XTMP(MAGN,"AANT")=NT
	S ^XTMP(MAGN,"AANI")=NI
	S ^XTMP(MAGN,"AAGRINT")=GRINT
	S ^XTMP(MAGN,"AAGRINI")=GRINI
	S ^XTMP(MAGN,"AAGO1")=GO1
	S ^XTMP(MAGN,"AAGO0")=GO0
	S ^XTMP(MAGN,"AAOFX")=OFX
	S ^XTMP(MAGN,"AAINVG")=INVG
	S ^XTMP(MAGN,"AAINVO")=INVO
	S ^XTMP(MAGN,"AANOMERG")=NOMERG
	S ^XTMP(MAGN,"AAOKMERG")=OKMERG
	S ^XTMP(MAGN,"AACRCT")=CRCT
	S ^XTMP(MAGN,"AAN40","no index")=GRINI+NI
	S ^XTMP(MAGN,"AANOPAT")=NOPAT
	S ^XTMP(MAGN,"AANOZ")=NOZ
	S ^XTMP(MAGN,0,"NT")=$G(LNT)
	S ^XTMP(MAGN,0,"NI")=$G(LNI)
	I FIX S ^XTMP(MAGN,"AAFIX")=FIX
	I 'QUEUED D DISPLAY^MAGGTUX1
	D MAIL^MAGGTUX1
	; KILL LOCKS.
END	;
	L -MAGTMP("VALIDATE INDEX TERMS")
	Q
ERR	; 
	L -MAGTMP("VALIDATE INDEX TERMS")
	D @^%ZOSF("ERRTN")
	Q
EST()	;Estimate time remaining.
	Q:'$G(ST) ""    ; we didn't start yet.
	N ET,EST,PS             ; Elapsed Time, Estimate Time, Number Per Second.
	S ET=$P($H,",",2)-ST I ET<2 Q "" ; Elapsed Time (seconds)
	I (CT/ET)<1 Q ""
	S PS=$P(CT/ET,".") ; number Per second
	S EST=$P(((TIM-CT)/PS),".") ;remaining/ (num/sec) = seconds remaining
	S %H=$P($H,",")_","_EST D YMD^%DTC
	Q $P($$FMTE^XLFDT(X_%),"@",2)
	;
PRLINE	; Print a line of current counts
	Q:QUEUED
	S CDT=$$FMTE^XLFDT($P($G(^MAG(2005,IEN,2)),"^",1),"2DF") ; Capture DaTe
	W !,IEN,?10,CDT,?22,CT,?36,NT,?48,NI,?64,$$EST_" ..."
	S LN=LN+1 I LN#10=0 D PRHDR
	Q
PRHDR	; Print a header and estimate of time.
	; For Test DataBase, put code to Hang here for 1 sec. (magslow)
	Q:QUEUED
	I 'COMMIT W !,"Just Checking Index Terms, NO CHANGES to database. (Q to quit)"
	W !,"IEN       Saved       #checked   No Type     No Index values    est: "
	Q
REVIEW	G REVIEW^MAGGTUX1
	Q
