XDRMERGA ;SF-IRMFO.SEA/JLI - START OF NON-INTERACTIVE BATCH MERGE ;01/31/2000 09:14
;;7.3;TOOLKIT;**23,28,37,40,45,137**;Apr 25, 1995;Build 10
;;
Q
APPROVE ; This is the entry point for approving a duplicate pair for merge
K DIRUT,DUOUT,DTOUT ;
D EN^XDRVCHEK ; update verified and/or ready to merge statuses if necessary
;
N XDRXX,XDRYY,XDRMA,DIE,DIC,DIR,DR,ZTDTH,ZTSK
N XDRX,XDRY,XDRFIL,XDRGLOB,X,Y,XDRNAME
N XDRFDA,XDRIENS,XDRI,XDRJ,XDRK,DA,DIK
;
S XDRFIL=$$FILE^XDRDPICK() Q:XDRFIL'>0
S XDRDIC=^DIC(XDRFIL,0,"GL")
S XDRGLOB=$E(XDRDIC,2,999)
S X=""
S XNCNT=0,XNCNT0=0
F S X=$O(^VA(15,"AVDUP",XDRGLOB,X)) Q:X="" S Y=$O(^(X,0)) D
. N YVAL S YVAL=^VA(15,Y,0)
. I $P(YVAL,U,20)>0 Q ; ALREADY DONE OR SCHEDULED
. I $P(YVAL,U,3)'="V" Q ; TAKE ONLY VERIFIED
. I $P(YVAL,U,5)'=1 Q ; TAKE ONLY IF MARKED READY TO MERGE
. I $P(YVAL,U,4)="" D Q ; MAKE SURE MERGE DIRECTION IS DEFINED
. . W !,"Entry `",Y," DOES NOT HAVE MERGE DIRECTION DEFINED - CAN'T APPROVE"
. . N XDRDICA S XDRDICA=U_$P($P(YVAL,U),";",2)
. . I '$D(@(XDRDICA_(+YVAL)_",0)"))!$D(@(XDRDICA_(+YVAL)_",-9)"))!'$D(@(XDRDICA_(+$P(YVAL,U,2))_",0)"))!$D(@(XDRDICA_(+$P(YVAL,U,2))_",-9)")) D Q
. . . D RESET^XDRDPICK(Y)
. I $P(YVAL,U,13)'>0 D
. . I $P(YVAL,U,4)'=2 S XDRY(+YVAL,+$P(YVAL,U,2))=Y
. . E S XDRY(+$P(YVAL,U,2),+YVAL)=Y
. . S XNCNT0=XNCNT0+1
I XNCNT0>0 W !!,XNCNT0," Entries are awaiting approval for merging Return to continue..." R X:DTIME
I $D(XDRY) D CHKBKUP I $D(DUOUT)!$D(DTOUT) Q
K XDRY
Q
;
STOP ;
N XDRI,DIE,DA,DR,DIR,XDRC
S XDRC=0 F XDRI=0:0 S XDRI=$O(^VA(15.2,XDRI)) Q:XDRI'>0 I $P(^(XDRI,0),U,4)="A" D
. S XDRC=XDRC+1
. S DIR(0)="Y",DIR("A")="Do you want to stop "_$P(^VA(15.2,XDRI,0),U)
. D ^DIR K DIR I Y'>0 Q
. S DIE="^VA(15.2,",DA=XDRI,DR=".09///1" D ^DIE
. K DIE,DR
I XDRC'>0 W !!,$C(7),"No active merge processes were found.",!!
Q
;
CHKBKUP ; Check if backups have been generated for outstanding pairs
N I,J,X,Y,X1,X2,XNCNT,I,J,K,L,M,N,XX
K DIR
;S DIR("A")="Do you want to check pairs awaiting backups (Y/N)"
;S DIR("?")="Indication that a backup of the data for the entries for a duplicate pair is required prior to merging the entries. You may review entries to see if any should be marked as completed."
;S DIR(0)="Y" D ^DIR K DIR Q:Y'>0
S ASKNAME="ASK1" D CHECK
Q
;
CHECK ;
W @IOF
S XNCNT=0
F I=0:0 S I=$O(XDRY(I)) Q:I'>0 D Q:$D(DUOUT)!$D(DTOUT)
. F J=0:0 S J=$O(XDRY(I,J)) Q:J'>0 D Q:$D(DUOUT)!$D(DTOUT)
. . S X01=$G(@(XDRDIC_I_",0)")),X1=$P(X01,U),X1S=$P(X01,U,9),X1S=$E(X1S,1,3)_"-"_$E(X1S,4,5)_"-"_$E(X1S,6,15)
. . S X02=$G(@(XDRDIC_J_",0)")),X2=$P(X02,U),X2S=$P(X02,U,9),X2S=$E(X2S,1,3)_"-"_$E(X2S,4,5)_"-"_$E(X2S,6,15)
. . I X1=""!(X2="") K XDRY(I,J) Q
. . F Q:X1'["MERGING INTO" S X1=$P($P(X1,"(",2,10),")",1,$L(X1,")")-1)
. . S XNCNT=XNCNT+1,XX(XNCNT)=I_U_J
. . W !!,$J(XNCNT,3)," ",?8,X1,?42,X1S,?60,"[",I,"]"
. . W !,?8,X2,?42,X2S,?60,"[",J,"]"
. . S ^TMP("XDR",$J,XNCNT)=X1_U_X1S_U_I_U_X2_U_X2S_U_J ;LLS 07-NOV-2013 - save for possible verification prompt
. . I '(XNCNT#6) D @ASKNAME Q:$D(DUOUT)!$D(DTOUT) W @IOF
I '($D(DUOUT)!$D(DTOUT)) D @ASKNAME
Q
;
ASK1 ;
W ! S DIR(0)="LO^1:"_XNCNT,DIR("A")="Select entries to approve them for merging"
;W !,"TEST"
D ^DIR K DIR K DIRUT Q:$D(DUOUT)!$D(DTOUT)
S K="" F S K=$O(Y(K)) Q:K="" S Y=Y(K) K Y(K) D
. F M=1:1 S N=$P(Y,",",M) Q:N="" D
. . S N1=+XX(N),N2=$P(XX(N),U,2)
. . I $$TESTPAT^VADPT(N1)=1,$$TESTPAT^VADPT(N2)'=1 D Q:Y'=1 ;LLS - trying to merge test patient into real patient
. . . N XDRFLDI,XDRPC
. . . F XDRFLDI=1:1:6 S XDRPC(XDRFLDI)=$P(^TMP("XDR",$J,XNCNT),U,XDRFLDI) ;LLS 07-NOV-2013
. . . W !!,$J(N,3)," ",?8,XDRPC(1),?42,XDRPC(2),?60,"[",XDRPC(3),"]" ;LLS 07-NOV-2013
. . . W !,?8,XDRPC(4),?42,XDRPC(5),?60,"[",XDRPC(6),"]" ;LLS 07-NOV-2013
. . . W !!!! S DIR(0)="Y^"_XNCNT,DIR("A")="Merge the above pair (a test patient into a real patient) SURE" ;LLS 07-NOV-2013
. . . D ^DIR K DIR ;LLS 07-NOV-2013
. . . I Y'=1 W !!,"*****[",XDRPC(3),"] WILL NOT BE MERGED INTO [",XDRPC(6),"]" ;LLS 07-NOV-2013
. . S (DA,XDRX(N1,N2))=XDRY(N1,N2)
. . N I,J,K,M,N,N1,N2,X1,X2,X,DIE,DR,Y
. . S DIE="^VA(15,"
. . S X=DT,X=$$FMTE^XLFDT(X,"2D")
. . S X=$P($P(^VA(200,DUZ,0),U),",",2)_" "_$P($P(^(0),U),",")_" (DUZ="_DUZ_") "_X
. . S DR=".13///1;.14///"_X
. . D ^DIE
Q
;
RESTART ; Entry point to restart non-completed merges
N NC,N S NC=0
F XDRFDA=0:0 S XDRFDA=$O(^VA(15.2,XDRFDA)) Q:XDRFDA'>0 D
. S X=$P(^VA(15.2,XDRFDA,0),U,4) I X="C"!(X="A") S N=1 D Q:N=1
. . F J=0:0 S J=$O(^VA(15.2,XDRFDA,3,J)) Q:J'>0 I "CA"'[$P(^(J,0),U,3) S N=0 Q
. S NC=NC+1
. S DIR(0)="Y",DIR("A")="Do you want to RESTART merge process "_$P(^VA(15.2,XDRFDA,0),U),DIR("B")="NO"
. D ^DIR K DIR Q:Y'>0
. S ZTRTN="DQ^XDRMERG0",ZTSAVE("XDRFDA")="",ZTIO="NULL"
. D ^%ZTLOAD I '$D(ZTSK) W !!,$C(7),"RESTART **NOT** QUEUED" Q
. S $P(^VA(15.2,XDRFDA,0),U,8,9)=ZTSK_U ; SET TASK NUMBER AND REMOVE HALT FLAG IF SET
. W !,"Restart queued as task ",ZTSK,!
I NC'>0 W !!,$C(7),"No merge processes found that needed restarting.",!!
Q
;
;
DOSUBS(XDRFROM,XDRTO,IENTOSTR,XDRDASEQ) ;
N NODEA,SFILE,VALUE,XVALUE,XDRXX,XDRYY,YVALUE,XENTOSTR
N XDRAA,XDRZZ ; DEBUG STATEMENT
N XDRALY1,XDRALY2,XDRALY1,XDRALY2,XDRALY1A,XDRALY2A,XDRDUPAF,XDRDUPAT,XDRALYSS,XDRALYNM,XDR1,NODEB ;;LLS 17-OCT-2013 - my new arrays and NODEB was not NEWed and thought it should be
S SFILE=+$P($G(@(XDRFROM_"0)")),U,2)
I SFILE'>0 Q ; NO FILE NUMBER, NOT FILE MANAGER COMPATIBLE
;
;LLS 17-OCT-2013 added this section to setup arrays for fix duplicate (same Name & Social Security Number) aliases being merged:
I $G(FILE)=2,SFILE="2.01" D
. D GETS^DIQ(FILE,$P(XDRGID,U,2)_",","1*","","XDRALY1") ;Put 'FROM' patient ALIAS data into XDRALY1 array
. M XDRALY1A=XDRALY1(SFILE) ;strip first subscript
. D GETS^DIQ(FILE,$P(XDRGID,U,3)_",","1*","","XDRALY2") ;Put 'TO' patient ALIAS data into XDRALY2 array
. M XDRALY2A=XDRALY2(SFILE) ;strip first subscript
. S XDR1="" F S XDR1=$O(XDRALY1A(XDR1)) Q:XDR1="" D ;Create new 'FROM' patient alias array subscripted by NAME^SSN
. . S XDRALYSS=XDRALY1A(XDR1,1),XDRALYNM=XDRALY1A(XDR1,.01)
. . S XDRDUPAF(XDRALYNM_U_XDRALYSS)=$P(XDR1,",",1) ;'FROM' array format: XDRDUPAF(NAME^SSN)=node
. S XDR1="" F S XDR1=$O(XDRALY2A(XDR1)) Q:XDR1="" D ;Create new 'TO' patient alias array subscripted by NAME^SSN
. . S XDRALYSS=XDRALY2A(XDR1,1),XDRALYNM=XDRALY2A(XDR1,.01)
. . S XDRDUPAT(XDRALYNM_U_XDRALYSS)=$P(XDR1,",",1) ;'TO' array format: XDRDUPAT(NAME^SSN)=node
;LLS 17-OCT-2013 end of added section
;
I $P($G(^DD(SFILE,.01,0)),U,2)["W" D Q ; HANDLE WORD PROCESSING FIELDS
. N XF,XT S XT=$E(XDRTO,1,$L(XDRTO)-1)_")"
. I '$D(@XT) D
. . S XF=$E(XDRFROM,1,$L(XDRFROM)-1)_")"
. . M @XT=@XF
. . Q
. Q
F NODEA=0:0 S NODEA=$O(@(XDRFROM_NODEA_")")) Q:NODEA'>0 D
. ;LLS 17-OCT-2013 - the following line of code was added to check patient alias multiple (file #2.01) and
. ; skip moving this alias because it already exists in the 'merge to' patient file.
. ; XDRDUPAF array contains 'FROM' file aliases and XDRDUPAT contains 'TO' file aliases
. I SFILE=2.01,$D(XDRDUPAF($P($G(@(XDRFROM_NODEA_",0)"),"*"),U,1,2))),$D(XDRDUPAT($P($G(@(XDRFROM_NODEA_",0)"),"*"),U,1,2))) Q ;LLS 17-OCT-2013 - added
. S VALUE=$P($G(@(XDRFROM_NODEA_",0)")),U) ; GET .01 VALUE
. N XDRDT S XDRDT=^DD(SFILE,.01,0)
. I $P(XDRDT,U,2)["D" S XDRDT=$P(XDRDT,U,5,999),XDRDINUM=$S(XDRDT["DINUM":1,1:0) I XDRDINUM S XDRDT=0 D DINUMDAT Q:XDRDT ; HANDLE DINUMED DATES BY SIMPLY MOVING THEM
. S YVALUE=0,XVALUE=0 I $D(^DD(SFILE,.001,0)) S YVALUE=NODEA I $D(@(XDRTO_NODEA_")")) S XVALUE=YVALUE
. I XVALUE=0,$P(^DD(SFILE,.01,0),U,5,99)["DINUM",$D(@(XDRTO_NODEA_")")) S XVALUE=NODEA
. I XVALUE=0 S XVALUE=+$$FIND1^DIC(SFILE,(","_IENTOSTR),"Q",VALUE) ; FIND CURRENT ENTRY NUMBER, IF PRESENT
. I XVALUE>0 D Q ; SUBFILE EXISTS IN IENTO, CHECK FOR LOWER SUBFILES
. . N X,X1,NODE,NEWFROM,NEWTO,NEWTOIEN
. . S NODE=""
. . F S NODE=$O(@(XDRFROM_NODEA_","""_NODE_""")")) Q:NODE="" D
. . . I $D(@(XDRFROM_NODEA_","""_NODE_""")"))'>1 Q
. . . S NEWFROM=XDRFROM_NODEA_","""_NODE_""","
. . . S NEWTO=XDRTO_XVALUE_","""_NODE_""","
. . . S NEWTOIEN=XVALUE_","_IENTOSTR
. . . D DOSUBS(NEWFROM,NEWTO,NEWTOIEN,(XVALUE_U_XDRDASEQ))
. K XDRYY I YVALUE>0 S XDRYY(1)=YVALUE
. S XENTOSTR="+1,"_IENTOSTR
. S XDRFILTY=$P($G(^DD(SFILE,.01,0)),U,2)
. I XDRFILTY["P" S VALUE="`"_VALUE
. I XDRFILTY["V" D
. . N Y S Y=$P(VALUE,";",2) Q:Y=""
. . S Y=$P($G(@("^"_Y_"0)")),U) Q:Y=""
. . S VALUE=Y_".`"_(+VALUE)
. . Q
. I SFILE=70.03 S XDRFILTY="D" ;use internal data for file 70.03
. I XDRFILTY'["P"&(XDRFILTY'["V"),XDRFILTY'["D" S VALUE=$$GETEXT(XDRFROM,NODEA,SFILE)
. S XDRXX(SFILE,XENTOSTR,.01)=VALUE
. I $O(^DD(SFILE,0,"ID",0))>0 D
. . ;CODE FOR ADDING IDENTIFIERS
. . N I,N,XDRFROM1,IENFR
. . S N=0,I=SFILE F S I=$G(^DD(I,0,"UP")) Q:I'>0 S N=N+1
. . S XDRFROM1=$P(XDRFROM,"(",2,99),IENFR=NODEA_","
. . F I=$L(XDRFROM1,",")-2:-2 Q:N'>0 S IENFR=IENFR_$P(XDRFROM1,",",I)_",",N=N-1
. . ;
. . F XDRID=0:0 S XDRID=$O(^DD(SFILE,0,"ID",XDRID)) Q:XDRID'>0 D
. . . S N=$$GET1^DIQ(SFILE,IENFR,XDRID)
. . . I N'="" S XDRXX(SFILE,XENTOSTR,XDRID)=N
. . . Q
. . Q
. ;
. K XDRAA,XDRZZ I $D(XDRTESTK) M XDRAA=XDRXX ; DEBUG STATEMENT
. ; DATES THAT ARE DINUMED HAVE BEEN HANDLED ABOVE, SO CAN PASS A DATE IN AS AN INTERNAL VALUE
. D UPDATE^DIE($S(XDRFILTY["D":"",1:"E"),"XDRXX","XDRYY","XDRZZ") ; CREATE A NEW ENTRY IN IENTO FOR VALUE
. I $D(XDRZZ),$D(XDRTESTK),SFILE'=2.0361 S XDRTESTK=XDRTESTK+1 M ^XTMP("XDRTESTK",$$NOW^XLFDT(),XDRTESTK,"XX")=XDRAA,^("ZZ")=XDRZZ ; DEBUG STATEMENT
. S NODEB=$G(XDRYY(1)) I NODEB'>0 Q
. M @(XDRTO_NODEB_")")=@(XDRFROM_NODEA_")")
. S DIK=XDRTO,DA=NODEB D
. . F I=1:1 S DA(I)=$P(XDRDASEQ,U,I) I DA(I)="" K DA(I) Q
. I SFILE=55.06 N DIU S DIU(0)=1 F DIK(1)=".01^B","10^AUDS","34^AUD","64^AUDDD","7^ACR1" D EN1^DIK
. I SFILE'=55.06 N DIU S DIU(0)=1 D IX^DIK
Q
;
GETEXT(DICA,DA,FILNUM) ; GET EXTERNAL VALUE FOR .01 FIELD
N DIC,DIQ,DR,XDRQ
S DIC=DICA,DIC("P")=FILNUM,DR=.01,DIQ="XDRQ",DIQ(0)="E"
D EN^DIQ1
Q $G(XDRQ(FILNUM,DA,.01,"E"))
;
DINUMDAT ; PROCESS ENTRIES WITH SAMPLE DATE/TIMES WITH SECONDS, NEEDS DINUM
N NEWVAL,NODETO
S NODETO=NODEA
I $D(@(XDRTO_NODEA_")")) Q:(SFILE'=63.04) D
. S NEWVAL=VALUE
. F Q:'$D(@(XDRTO_NODETO_")")) S NODETO=NODETO-.000001,NEWVAL=NEWVAL+.000001
M @(XDRTO_NODETO_")")=@(XDRFROM_NODEA_")")
I $D(NEWVAL) S $P(@(XDRTO_NODETO_",0)"),U)=NEWVAL
S DIK=XDRTO,DA=NODEA D D IX^DIK
. F I=1:1 S DA(I)=$P(XDRDASEQ,U,I) I DA(I)="" K DA(I) Q
S XDRDT=1
Q
;
DODIS ; CODE TO HANDLE DISPOSITION ENTRIES IN PATIENT FILE
N XDRI,DA,DIK
F XDRI=0:0 S XDRI=$O(@(XDRDIC_IENFROM_",""DIS"","_XDRI_")")) Q:XDRI'>0 D
. I $D(@(XDRDIC_IENTO_",""DIS"","_XDRI_")")) Q
. M @(XDRDIC_IENTO_",""DIS"","_XDRI_")")=@(XDRDIC_IENFROM_",""DIS"","_XDRI_")")
. S DA=XDRI,DA(1)=IENTO,DIK=XDRDIC_IENTO_",""DIS""," D IX^DIK
. Q
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXDRMERGA 11159 printed Oct 16, 2024@18:40:08 Page 2
XDRMERGA ;SF-IRMFO.SEA/JLI - START OF NON-INTERACTIVE BATCH MERGE ;01/31/2000 09:14
+1 ;;7.3;TOOLKIT;**23,28,37,40,45,137**;Apr 25, 1995;Build 10
+2 ;;
+3 QUIT
APPROVE ; This is the entry point for approving a duplicate pair for merge
+1 ;
KILL DIRUT,DUOUT,DTOUT
+2 ; update verified and/or ready to merge statuses if necessary
DO EN^XDRVCHEK
+3 ;
+4 NEW XDRXX,XDRYY,XDRMA,DIE,DIC,DIR,DR,ZTDTH,ZTSK
+5 NEW XDRX,XDRY,XDRFIL,XDRGLOB,X,Y,XDRNAME
+6 NEW XDRFDA,XDRIENS,XDRI,XDRJ,XDRK,DA,DIK
+7 ;
+8 SET XDRFIL=$$FILE^XDRDPICK()
if XDRFIL'>0
QUIT
+9 SET XDRDIC=^DIC(XDRFIL,0,"GL")
+10 SET XDRGLOB=$EXTRACT(XDRDIC,2,999)
+11 SET X=""
+12 SET XNCNT=0
SET XNCNT0=0
+13 FOR
SET X=$ORDER(^VA(15,"AVDUP",XDRGLOB,X))
if X=""
QUIT
SET Y=$ORDER(^(X,0))
Begin DoDot:1
+14 NEW YVAL
SET YVAL=^VA(15,Y,0)
+15 ; ALREADY DONE OR SCHEDULED
IF $PIECE(YVAL,U,20)>0
QUIT
+16 ; TAKE ONLY VERIFIED
IF $PIECE(YVAL,U,3)'="V"
QUIT
+17 ; TAKE ONLY IF MARKED READY TO MERGE
IF $PIECE(YVAL,U,5)'=1
QUIT
+18 ; MAKE SURE MERGE DIRECTION IS DEFINED
IF $PIECE(YVAL,U,4)=""
Begin DoDot:2
+19 WRITE !,"Entry `",Y," DOES NOT HAVE MERGE DIRECTION DEFINED - CAN'T APPROVE"
+20 NEW XDRDICA
SET XDRDICA=U_$PIECE($PIECE(YVAL,U),";",2)
+21 IF '$DATA(@(XDRDICA_(+YVAL)_",0)"))!$DATA(@(XDRDICA_(+YVAL)_",-9)"))!'$DATA(@(XDRDICA_(+$PIECE(YVAL,U,2))_",0)"))!$DATA(@(XDRDICA_(+$PIECE(YVAL,U,2))_",-9)"))
Begin DoDot:3
+22 DO RESET^XDRDPICK(Y)
End DoDot:3
QUIT
End DoDot:2
QUIT
+23 IF $PIECE(YVAL,U,13)'>0
Begin DoDot:2
+24 IF $PIECE(YVAL,U,4)'=2
SET XDRY(+YVAL,+$PIECE(YVAL,U,2))=Y
+25 IF '$TEST
SET XDRY(+$PIECE(YVAL,U,2),+YVAL)=Y
+26 SET XNCNT0=XNCNT0+1
End DoDot:2
End DoDot:1
+27 IF XNCNT0>0
WRITE !!,XNCNT0," Entries are awaiting approval for merging Return to continue..."
READ X:DTIME
+28 IF $DATA(XDRY)
DO CHKBKUP
IF $DATA(DUOUT)!$DATA(DTOUT)
QUIT
+29 KILL XDRY
+30 QUIT
+31 ;
STOP ;
+1 NEW XDRI,DIE,DA,DR,DIR,XDRC
+2 SET XDRC=0
FOR XDRI=0:0
SET XDRI=$ORDER(^VA(15.2,XDRI))
if XDRI'>0
QUIT
IF $PIECE(^(XDRI,0),U,4)="A"
Begin DoDot:1
+3 SET XDRC=XDRC+1
+4 SET DIR(0)="Y"
SET DIR("A")="Do you want to stop "_$PIECE(^VA(15.2,XDRI,0),U)
+5 DO ^DIR
KILL DIR
IF Y'>0
QUIT
+6 SET DIE="^VA(15.2,"
SET DA=XDRI
SET DR=".09///1"
DO ^DIE
+7 KILL DIE,DR
End DoDot:1
+8 IF XDRC'>0
WRITE !!,$CHAR(7),"No active merge processes were found.",!!
+9 QUIT
+10 ;
CHKBKUP ; Check if backups have been generated for outstanding pairs
+1 NEW I,J,X,Y,X1,X2,XNCNT,I,J,K,L,M,N,XX
+2 KILL DIR
+3 ;S DIR("A")="Do you want to check pairs awaiting backups (Y/N)"
+4 ;S DIR("?")="Indication that a backup of the data for the entries for a duplicate pair is required prior to merging the entries. You may review entries to see if any should be marked as completed."
+5 ;S DIR(0)="Y" D ^DIR K DIR Q:Y'>0
+6 SET ASKNAME="ASK1"
DO CHECK
+7 QUIT
+8 ;
CHECK ;
+1 WRITE @IOF
+2 SET XNCNT=0
+3 FOR I=0:0
SET I=$ORDER(XDRY(I))
if I'>0
QUIT
Begin DoDot:1
+4 FOR J=0:0
SET J=$ORDER(XDRY(I,J))
if J'>0
QUIT
Begin DoDot:2
+5 SET X01=$GET(@(XDRDIC_I_",0)"))
SET X1=$PIECE(X01,U)
SET X1S=$PIECE(X01,U,9)
SET X1S=$EXTRACT(X1S,1,3)_"-"_$EXTRACT(X1S,4,5)_"-"_$EXTRACT(X1S,6,15)
+6 SET X02=$GET(@(XDRDIC_J_",0)"))
SET X2=$PIECE(X02,U)
SET X2S=$PIECE(X02,U,9)
SET X2S=$EXTRACT(X2S,1,3)_"-"_$EXTRACT(X2S,4,5)_"-"_$EXTRACT(X2S,6,15)
+7 IF X1=""!(X2="")
KILL XDRY(I,J)
QUIT
+8 FOR
if X1'["MERGING INTO"
QUIT
SET X1=$PIECE($PIECE(X1,"(",2,10),")",1,$LENGTH(X1,")")-1)
+9 SET XNCNT=XNCNT+1
SET XX(XNCNT)=I_U_J
+10 WRITE !!,$JUSTIFY(XNCNT,3)," ",?8,X1,?42,X1S,?60,"[",I,"]"
+11 WRITE !,?8,X2,?42,X2S,?60,"[",J,"]"
+12 ;LLS 07-NOV-2013 - save for possible verification prompt
SET ^TMP("XDR",$JOB,XNCNT)=X1_U_X1S_U_I_U_X2_U_X2S_U_J
+13 IF '(XNCNT#6)
DO @ASKNAME
if $DATA(DUOUT)!$DATA(DTOUT)
QUIT
WRITE @IOF
End DoDot:2
if $DATA(DUOUT)!$DATA(DTOUT)
QUIT
End DoDot:1
if $DATA(DUOUT)!$DATA(DTOUT)
QUIT
+14 IF '($DATA(DUOUT)!$DATA(DTOUT))
DO @ASKNAME
+15 QUIT
+16 ;
ASK1 ;
+1 WRITE !
SET DIR(0)="LO^1:"_XNCNT
SET DIR("A")="Select entries to approve them for merging"
+2 ;W !,"TEST"
+3 DO ^DIR
KILL DIR
KILL DIRUT
if $DATA(DUOUT)!$DATA(DTOUT)
QUIT
+4 SET K=""
FOR
SET K=$ORDER(Y(K))
if K=""
QUIT
SET Y=Y(K)
KILL Y(K)
Begin DoDot:1
+5 FOR M=1:1
SET N=$PIECE(Y,",",M)
if N=""
QUIT
Begin DoDot:2
+6 SET N1=+XX(N)
SET N2=$PIECE(XX(N),U,2)
+7 ;LLS - trying to merge test patient into real patient
IF $$TESTPAT^VADPT(N1)=1
IF $$TESTPAT^VADPT(N2)'=1
Begin DoDot:3
+8 NEW XDRFLDI,XDRPC
+9 ;LLS 07-NOV-2013
FOR XDRFLDI=1:1:6
SET XDRPC(XDRFLDI)=$PIECE(^TMP("XDR",$JOB,XNCNT),U,XDRFLDI)
+10 ;LLS 07-NOV-2013
WRITE !!,$JUSTIFY(N,3)," ",?8,XDRPC(1),?42,XDRPC(2),?60,"[",XDRPC(3),"]"
+11 ;LLS 07-NOV-2013
WRITE !,?8,XDRPC(4),?42,XDRPC(5),?60,"[",XDRPC(6),"]"
+12 ;LLS 07-NOV-2013
WRITE !!!!
SET DIR(0)="Y^"_XNCNT
SET DIR("A")="Merge the above pair (a test patient into a real patient) SURE"
+13 ;LLS 07-NOV-2013
DO ^DIR
KILL DIR
+14 ;LLS 07-NOV-2013
IF Y'=1
WRITE !!,"*****[",XDRPC(3),"] WILL NOT BE MERGED INTO [",XDRPC(6),"]"
End DoDot:3
if Y'=1
QUIT
+15 SET (DA,XDRX(N1,N2))=XDRY(N1,N2)
+16 NEW I,J,K,M,N,N1,N2,X1,X2,X,DIE,DR,Y
+17 SET DIE="^VA(15,"
+18 SET X=DT
SET X=$$FMTE^XLFDT(X,"2D")
+19 SET X=$PIECE($PIECE(^VA(200,DUZ,0),U),",",2)_" "_$PIECE($PIECE(^(0),U),",")_" (DUZ="_DUZ_") "_X
+20 SET DR=".13///1;.14///"_X
+21 DO ^DIE
End DoDot:2
End DoDot:1
+22 QUIT
+23 ;
RESTART ; Entry point to restart non-completed merges
+1 NEW NC,N
SET NC=0
+2 FOR XDRFDA=0:0
SET XDRFDA=$ORDER(^VA(15.2,XDRFDA))
if XDRFDA'>0
QUIT
Begin DoDot:1
+3 SET X=$PIECE(^VA(15.2,XDRFDA,0),U,4)
IF X="C"!(X="A")
SET N=1
Begin DoDot:2
+4 FOR J=0:0
SET J=$ORDER(^VA(15.2,XDRFDA,3,J))
if J'>0
QUIT
IF "CA"'[$PIECE(^(J,0),U,3)
SET N=0
QUIT
End DoDot:2
if N=1
QUIT
+5 SET NC=NC+1
+6 SET DIR(0)="Y"
SET DIR("A")="Do you want to RESTART merge process "_$PIECE(^VA(15.2,XDRFDA,0),U)
SET DIR("B")="NO"
+7 DO ^DIR
KILL DIR
if Y'>0
QUIT
+8 SET ZTRTN="DQ^XDRMERG0"
SET ZTSAVE("XDRFDA")=""
SET ZTIO="NULL"
+9 DO ^%ZTLOAD
IF '$DATA(ZTSK)
WRITE !!,$CHAR(7),"RESTART **NOT** QUEUED"
QUIT
+10 ; SET TASK NUMBER AND REMOVE HALT FLAG IF SET
SET $PIECE(^VA(15.2,XDRFDA,0),U,8,9)=ZTSK_U
+11 WRITE !,"Restart queued as task ",ZTSK,!
End DoDot:1
+12 IF NC'>0
WRITE !!,$CHAR(7),"No merge processes found that needed restarting.",!!
+13 QUIT
+14 ;
+15 ;
DOSUBS(XDRFROM,XDRTO,IENTOSTR,XDRDASEQ) ;
+1 NEW NODEA,SFILE,VALUE,XVALUE,XDRXX,XDRYY,YVALUE,XENTOSTR
+2 ; DEBUG STATEMENT
NEW XDRAA,XDRZZ
+3 ;;LLS 17-OCT-2013 - my new arrays and NODEB was not NEWed and thought it should be
NEW XDRALY1,XDRALY2,XDRALY1,XDRALY2,XDRALY1A,XDRALY2A,XDRDUPAF,XDRDUPAT,XDRALYSS,XDRALYNM,XDR1,NODEB
+4 SET SFILE=+$PIECE($GET(@(XDRFROM_"0)")),U,2)
+5 ; NO FILE NUMBER, NOT FILE MANAGER COMPATIBLE
IF SFILE'>0
QUIT
+6 ;
+7 ;LLS 17-OCT-2013 added this section to setup arrays for fix duplicate (same Name & Social Security Number) aliases being merged:
+8 IF $GET(FILE)=2
IF SFILE="2.01"
Begin DoDot:1
+9 ;Put 'FROM' patient ALIAS data into XDRALY1 array
DO GETS^DIQ(FILE,$PIECE(XDRGID,U,2)_",","1*","","XDRALY1")
+10 ;strip first subscript
MERGE XDRALY1A=XDRALY1(SFILE)
+11 ;Put 'TO' patient ALIAS data into XDRALY2 array
DO GETS^DIQ(FILE,$PIECE(XDRGID,U,3)_",","1*","","XDRALY2")
+12 ;strip first subscript
MERGE XDRALY2A=XDRALY2(SFILE)
+13 ;Create new 'FROM' patient alias array subscripted by NAME^SSN
SET XDR1=""
FOR
SET XDR1=$ORDER(XDRALY1A(XDR1))
if XDR1=""
QUIT
Begin DoDot:2
+14 SET XDRALYSS=XDRALY1A(XDR1,1)
SET XDRALYNM=XDRALY1A(XDR1,.01)
+15 ;'FROM' array format: XDRDUPAF(NAME^SSN)=node
SET XDRDUPAF(XDRALYNM_U_XDRALYSS)=$PIECE(XDR1,",",1)
End DoDot:2
+16 ;Create new 'TO' patient alias array subscripted by NAME^SSN
SET XDR1=""
FOR
SET XDR1=$ORDER(XDRALY2A(XDR1))
if XDR1=""
QUIT
Begin DoDot:2
+17 SET XDRALYSS=XDRALY2A(XDR1,1)
SET XDRALYNM=XDRALY2A(XDR1,.01)
+18 ;'TO' array format: XDRDUPAT(NAME^SSN)=node
SET XDRDUPAT(XDRALYNM_U_XDRALYSS)=$PIECE(XDR1,",",1)
End DoDot:2
End DoDot:1
+19 ;LLS 17-OCT-2013 end of added section
+20 ;
+21 ; HANDLE WORD PROCESSING FIELDS
IF $PIECE($GET(^DD(SFILE,.01,0)),U,2)["W"
Begin DoDot:1
+22 NEW XF,XT
SET XT=$EXTRACT(XDRTO,1,$LENGTH(XDRTO)-1)_")"
+23 IF '$DATA(@XT)
Begin DoDot:2
+24 SET XF=$EXTRACT(XDRFROM,1,$LENGTH(XDRFROM)-1)_")"
+25 MERGE @XT=@XF
+26 QUIT
End DoDot:2
+27 QUIT
End DoDot:1
QUIT
+28 FOR NODEA=0:0
SET NODEA=$ORDER(@(XDRFROM_NODEA_")"))
if NODEA'>0
QUIT
Begin DoDot:1
+29 ;LLS 17-OCT-2013 - the following line of code was added to check patient alias multiple (file #2.01) and
+30 ; skip moving this alias because it already exists in the 'merge to' patient file.
+31 ; XDRDUPAF array contains 'FROM' file aliases and XDRDUPAT contains 'TO' file aliases
+32 ;LLS 17-OCT-2013 - added
IF SFILE=2.01
IF $DATA(XDRDUPAF($PIECE($GET(@(XDRFROM_NODEA_",0)"),"*"),U,1,2)))
IF $DATA(XDRDUPAT($PIECE($GET(@(XDRFROM_NODEA_",0)"),"*"),U,1,2)))
QUIT
+33 ; GET .01 VALUE
SET VALUE=$PIECE($GET(@(XDRFROM_NODEA_",0)")),U)
+34 NEW XDRDT
SET XDRDT=^DD(SFILE,.01,0)
+35 ; HANDLE DINUMED DATES BY SIMPLY MOVING THEM
IF $PIECE(XDRDT,U,2)["D"
SET XDRDT=$PIECE(XDRDT,U,5,999)
SET XDRDINUM=$SELECT(XDRDT["DINUM":1,1:0)
IF XDRDINUM
SET XDRDT=0
DO DINUMDAT
if XDRDT
QUIT
+36 SET YVALUE=0
SET XVALUE=0
IF $DATA(^DD(SFILE,.001,0))
SET YVALUE=NODEA
IF $DATA(@(XDRTO_NODEA_")"))
SET XVALUE=YVALUE
+37 IF XVALUE=0
IF $PIECE(^DD(SFILE,.01,0),U,5,99)["DINUM"
IF $DATA(@(XDRTO_NODEA_")"))
SET XVALUE=NODEA
+38 ; FIND CURRENT ENTRY NUMBER, IF PRESENT
IF XVALUE=0
SET XVALUE=+$$FIND1^DIC(SFILE,(","_IENTOSTR),"Q",VALUE)
+39 ; SUBFILE EXISTS IN IENTO, CHECK FOR LOWER SUBFILES
IF XVALUE>0
Begin DoDot:2
+40 NEW X,X1,NODE,NEWFROM,NEWTO,NEWTOIEN
+41 SET NODE=""
+42 FOR
SET NODE=$ORDER(@(XDRFROM_NODEA_","""_NODE_""")"))
if NODE=""
QUIT
Begin DoDot:3
+43 IF $DATA(@(XDRFROM_NODEA_","""_NODE_""")"))'>1
QUIT
+44 SET NEWFROM=XDRFROM_NODEA_","""_NODE_""","
+45 SET NEWTO=XDRTO_XVALUE_","""_NODE_""","
+46 SET NEWTOIEN=XVALUE_","_IENTOSTR
+47 DO DOSUBS(NEWFROM,NEWTO,NEWTOIEN,(XVALUE_U_XDRDASEQ))
End DoDot:3
End DoDot:2
QUIT
+48 KILL XDRYY
IF YVALUE>0
SET XDRYY(1)=YVALUE
+49 SET XENTOSTR="+1,"_IENTOSTR
+50 SET XDRFILTY=$PIECE($GET(^DD(SFILE,.01,0)),U,2)
+51 IF XDRFILTY["P"
SET VALUE="`"_VALUE
+52 IF XDRFILTY["V"
Begin DoDot:2
+53 NEW Y
SET Y=$PIECE(VALUE,";",2)
if Y=""
QUIT
+54 SET Y=$PIECE($GET(@("^"_Y_"0)")),U)
if Y=""
QUIT
+55 SET VALUE=Y_".`"_(+VALUE)
+56 QUIT
End DoDot:2
+57 ;use internal data for file 70.03
IF SFILE=70.03
SET XDRFILTY="D"
+58 IF XDRFILTY'["P"&(XDRFILTY'["V")
IF XDRFILTY'["D"
SET VALUE=$$GETEXT(XDRFROM,NODEA,SFILE)
+59 SET XDRXX(SFILE,XENTOSTR,.01)=VALUE
+60 IF $ORDER(^DD(SFILE,0,"ID",0))>0
Begin DoDot:2
+61 ;CODE FOR ADDING IDENTIFIERS
+62 NEW I,N,XDRFROM1,IENFR
+63 SET N=0
SET I=SFILE
FOR
SET I=$GET(^DD(I,0,"UP"))
if I'>0
QUIT
SET N=N+1
+64 SET XDRFROM1=$PIECE(XDRFROM,"(",2,99)
SET IENFR=NODEA_","
+65 FOR I=$LENGTH(XDRFROM1,",")-2:-2
if N'>0
QUIT
SET IENFR=IENFR_$PIECE(XDRFROM1,",",I)_","
SET N=N-1
+66 ;
+67 FOR XDRID=0:0
SET XDRID=$ORDER(^DD(SFILE,0,"ID",XDRID))
if XDRID'>0
QUIT
Begin DoDot:3
+68 SET N=$$GET1^DIQ(SFILE,IENFR,XDRID)
+69 IF N'=""
SET XDRXX(SFILE,XENTOSTR,XDRID)=N
+70 QUIT
End DoDot:3
+71 QUIT
End DoDot:2
+72 ;
+73 ; DEBUG STATEMENT
KILL XDRAA,XDRZZ
IF $DATA(XDRTESTK)
MERGE XDRAA=XDRXX
+74 ; DATES THAT ARE DINUMED HAVE BEEN HANDLED ABOVE, SO CAN PASS A DATE IN AS AN INTERNAL VALUE
+75 ; CREATE A NEW ENTRY IN IENTO FOR VALUE
DO UPDATE^DIE($SELECT(XDRFILTY["D":"",1:"E"),"XDRXX","XDRYY","XDRZZ")
+76 ; DEBUG STATEMENT
IF $DATA(XDRZZ)
IF $DATA(XDRTESTK)
IF SFILE'=2.0361
SET XDRTESTK=XDRTESTK+1
MERGE ^XTMP("XDRTESTK",$$NOW^XLFDT(),XDRTESTK,"XX")=XDRAA,^("ZZ")=XDRZZ
+77 SET NODEB=$GET(XDRYY(1))
IF NODEB'>0
QUIT
+78 MERGE @(XDRTO_NODEB_")")=@(XDRFROM_NODEA_")")
+79 SET DIK=XDRTO
SET DA=NODEB
Begin DoDot:2
+80 FOR I=1:1
SET DA(I)=$PIECE(XDRDASEQ,U,I)
IF DA(I)=""
KILL DA(I)
QUIT
End DoDot:2
+81 IF SFILE=55.06
NEW DIU
SET DIU(0)=1
FOR DIK(1)=".01^B","10^AUDS","34^AUD","64^AUDDD","7^ACR1"
DO EN1^DIK
+82 IF SFILE'=55.06
NEW DIU
SET DIU(0)=1
DO IX^DIK
End DoDot:1
+83 QUIT
+84 ;
GETEXT(DICA,DA,FILNUM) ; GET EXTERNAL VALUE FOR .01 FIELD
+1 NEW DIC,DIQ,DR,XDRQ
+2 SET DIC=DICA
SET DIC("P")=FILNUM
SET DR=.01
SET DIQ="XDRQ"
SET DIQ(0)="E"
+3 DO EN^DIQ1
+4 QUIT $GET(XDRQ(FILNUM,DA,.01,"E"))
+5 ;
DINUMDAT ; PROCESS ENTRIES WITH SAMPLE DATE/TIMES WITH SECONDS, NEEDS DINUM
+1 NEW NEWVAL,NODETO
+2 SET NODETO=NODEA
+3 IF $DATA(@(XDRTO_NODEA_")"))
if (SFILE'=63.04)
QUIT
Begin DoDot:1
+4 SET NEWVAL=VALUE
+5 FOR
if '$DATA(@(XDRTO_NODETO_")"))
QUIT
SET NODETO=NODETO-.000001
SET NEWVAL=NEWVAL+.000001
End DoDot:1
+6 MERGE @(XDRTO_NODETO_")")=@(XDRFROM_NODEA_")")
+7 IF $DATA(NEWVAL)
SET $PIECE(@(XDRTO_NODETO_",0)"),U)=NEWVAL
+8 SET DIK=XDRTO
SET DA=NODEA
Begin DoDot:1
+9 FOR I=1:1
SET DA(I)=$PIECE(XDRDASEQ,U,I)
IF DA(I)=""
KILL DA(I)
QUIT
End DoDot:1
DO IX^DIK
+10 SET XDRDT=1
+11 QUIT
+12 ;
DODIS ; CODE TO HANDLE DISPOSITION ENTRIES IN PATIENT FILE
+1 NEW XDRI,DA,DIK
+2 FOR XDRI=0:0
SET XDRI=$ORDER(@(XDRDIC_IENFROM_",""DIS"","_XDRI_")"))
if XDRI'>0
QUIT
Begin DoDot:1
+3 IF $DATA(@(XDRDIC_IENTO_",""DIS"","_XDRI_")"))
QUIT
+4 MERGE @(XDRDIC_IENTO_",""DIS"","_XDRI_")")=@(XDRDIC_IENFROM_",""DIS"","_XDRI_")")
+5 SET DA=XDRI
SET DA(1)=IENTO
SET DIK=XDRDIC_IENTO_",""DIS"","
DO IX^DIK
+6 QUIT
End DoDot:1
+7 QUIT
+8 ;