SD53P568 ;ALB/DAN Patch 568 install related activities ;12/8/10  11:28
 ;;5.3;Scheduling;**568**;AUG 13, 1993;Build 14
 ;
 ;DBIA Section
 ;1147  - $$ADD^XPDMENU
 ;2649  - $$ROUSIZE^DILF
 ;10141 - XPDUTL
 ;10086 - %ZIS
 ;10089 - %ZISC
 ;10006 - DIC
 ;10070 - XMD
 ;10103 - XLFDT
 ;10104 - XLFSTR
 Q
 ;
PRETRAN ;Load conversion table into KIDS build
 M @XPDGREF@("SDSTOP")=^XTMP("SDSTOP")
 Q
 ;
POST ;Post installation processes
 N SKIP,DUP,UPDATE
 D UPDATEDD("O") ;allow editing of fields during post-install, restrict fields upon completion
 D UPDMENU ;Add edit stop code option to menu
 D LOADGSC ;Load gold stop codes
 I +$G(XPDQUIT) Q  ;Stop if error loading table
 D CHKDUPS ;Identify any duplicate entries
 D UPDCODES ;Update 40.7 to "gold" standard
 D MAIL ;Send message showing duplicates and updates
 D QCONFORM ;Run non-conforming clinic report in background
 D UPDATEDD("C") ;Set restrictions on file to make entries uneditable.
 D COMPILE ;Compile SDB input template
 Q
 ;
LOADGSC ;Load gold stop code global for comparison and removal of duplicates
 K ^XTMP("SDSTOP")
 M ^XTMP("SDSTOP")=@XPDGREF@("SDSTOP")
 I '$D(^XTMP("SDSTOP")) D BMES^XPDUTL("Conversion table not loaded - INSTALLATION ABORTED") S XPDQUIT=2 Q
 S ^XTMP("SDSTOP",0)=$$FMADD^XLFDT(DT,30)_"^"_DT_"^Patch SD*5.3*568 conversion table" ;Set auto-delete date from XTMP global
 Q
 ;
UPDATEDD(TYPE) ;Update DD for 40.7 to either unrestrict edits or restrict edits
 N I
 I TYPE="C" D  ;restrict file
 .S ^DD(40.7,.01,7.5)="I $G(DIC(0))[""L"",'$D(SDAUMF) D EN^DDIOL(""Entries can only be added by the Stop Code Counsel."","""",""!?5"") K X"
 .F I=1:1:6 I $P(^DD(40.7,I,0),U,2)'["I" S $P(^DD(40.7,I,0),U,2)=$P(^DD(40.7,I,0),U,2)_"I" ;Makes all fields uneditable
 I TYPE="O" D  ;remove restrictions
 .K ^DD(40.7,.01,7.5)
 .F I=1:1:6 S $P(^DD(40.7,I,0),U,2)=$TR($P(^DD(40.7,I,0),U,2),"I","")
 Q
 ;
 N ADDED
 S ADDED=$$ADD^XPDMENU("SDSUP","SD EDIT LOCAL STOP CODE NAME")
 D BMES^XPDUTL("SD EDIT LOCAL STOP CODE NAME option "_$S('+$G(ADDED):"NOT ",1:"")_"added to menu SDSUP")
 S ADDED=$$ADD^XPDMENU("ECX SETUP CLINIC","SD CLINIC EDIT LOG","8")
 D BMES^XPDUTL("SD CLINIC EDIT LOG option "_$S('+$G(ADDED):"NOT ",1:"")_"added to menu ECX SETUP CLINIC")
 Q
 ;
CHKDUPS ;Look through file 40.7 and check for entries with duplicate AMIS STOP CODES
 N SC,IEN,GST,I,ARRAY,CNT,SIEN,NUMACT
 S SC=0 F  S SC=$O(^DIC(40.7,"C",SC)) Q:'+SC  D
 .K ARRAY S NUMACT=0
 .S CNT=0,SIEN=0 F  S SIEN=$O(^DIC(40.7,"C",SC,SIEN)) Q:'+SIEN  S CNT=CNT+1,ARRAY(CNT,SIEN)=$S($P(^DIC(40.7,SIEN,0),U,3)'="":0,1:1) I ARRAY(CNT,SIEN)=1 S NUMACT=NUMACT+1
 .I CNT'<2 D
 ..I '$D(^XTMP("SDSTOP",SC)) Q  ;Stop code doesn't exist
 ..S GST=$S($P(^XTMP("SDSTOP",SC),U,4)'="":0,1:1) ;gold entry status 0 - inactive, 1 - active
 ..Q:'GST  ;Stop if gold entry is inactive, no duplicates can exist
 ..F I=1:1:CNT S IEN=$O(ARRAY(I,0)) D
 ...I NUMACT=0 S DUP(SC,IEN)="",SKIP(IEN)="" Q
 ...I NUMACT=1 I 'ARRAY(I,IEN) S SKIP(IEN)="" Q
 ...I NUMACT'<2 D
 ....I ARRAY(I,IEN) S DUP(SC,IEN)="",SKIP(IEN)=""
 ....I 'ARRAY(I,IEN) S SKIP(IEN)=""
 Q
 ;
UPDCODES ;Compare existing entries in 40.7 with "gold" entries
 N SC,IEN,DIE,DA,DR,LINE,GOLD,DIC,NODE,X,Y,SDAUMF
 S SC=0 F  S SC=$O(^DIC(40.7,"C",SC)) Q:'+SC  D
 .S IEN=0 F  S IEN=$O(^DIC(40.7,"C",SC,IEN)) Q:'+IEN  D
 ..K LINE,GOLD,DR,DA
 ..I '$D(^XTMP("SDSTOP",SC)) D  Q  ;Entry in 40.7 isn't in gold listing
 ...I $P(^DIC(40.7,IEN,0),U,3)="" S DIE=40.7,DA=IEN,DR="2////3101101" D ^DIE S UPDATE("I",IEN)="" ;Make entry inactive as of 11/1/10 if not already inactive
 ..I $D(SKIP(IEN)) Q  ;If entry is in the "SKIP" array then it doesn't need to be touched
 ..;Compare entries, update where needed
 ..S LINE=^DIC(40.7,IEN,0)
 ..S GOLD=^XTMP("SDSTOP",SC)
 ..I '(SC'<451&(SC'>485)&(SC'=457)&(SC'=474)&(SC'=480)&(SC'=481)) I $P(LINE,U)'=$P(GOLD,U) S DR=".01////"_$P(GOLD,U)_";" S UPDATE("U",IEN)=$P(LINE,U)_"~"_$P(GOLD,U) ;If not a local entry, then compare name field
 ..I $P(LINE,U,6)'=$E($P(GOLD,U,2)) S DR=$G(DR)_"5////"_$E($P(GOLD,U,2))_";" S $P(UPDATE("U",IEN),U,2)=$P(LINE,U,6)_"~"_$E($P(GOLD,U,2)) ;if restriction type doesn't match, update it
 ..I $P(LINE,U,7)'=$P(GOLD,U,3) S DR=$G(DR)_"6////"_$S($P(GOLD,U,3)="":"@",1:$P(GOLD,U,3))_";" S $P(UPDATE("U",IEN),U,3)=$P(LINE,U,7)_"~"_$P(GOLD,U,3) ;If restriction date doesn't match, update it
 ..I $P(LINE,U,3)'=$P(GOLD,U,4) S DR=$G(DR)_"2////"_$S($P(GOLD,U,4)="":"@",1:$P(GOLD,U,4)) S $P(UPDATE("U",IEN),U,4)=$P(LINE,U,3)_"~"_$P(GOLD,U,4) ;if inactivation date doesn't match, update it
 ..I $D(DR) S DA=IEN,DIE=40.7 D ^DIE ;update entry to "gold" values
 ;Add entries from GOLD that aren't in 40.7
 S SC=0 F  S SC=$O(^XTMP("SDSTOP",SC)) Q:'+SC  D
 .I '$D(^DIC(40.7,"C",SC)) D
 ..S SDAUMF=1
 ..S NODE=^XTMP("SDSTOP",SC)
 ..S DIC=40.7,DIC(0)="LX",X=$P(NODE,U),DIC("DR")="1////"_SC_";2////"_$P(NODE,U,4)_";5////"_$E($P(NODE,U,2))_";6////"_$P(NODE,U,3)
 ..D ^DIC ;adds new entries with fields identified above
 ..I Y=-1!('+$P(Y,U,3)) S UPDATE("NA",SC)="" Q  ;if entry fails, store it so it can be reported
 ..S UPDATE("N",SC)=""
 Q
 ;
MAIL ;Send message indicating post install is finished
 N XMSUB,XMTEXT,XMDUZ,XMY,XMZ,SDTXT,CNT,DIFROM,DIEN,NODE,SC,NAME,IEN,I,PIECE
 S XMDUZ="PATCH SD*5.3*568 POST-INSTALL"
 D GETXMY("ECXMGR",.XMY),GETXMY("SD SUPERVISOR",.XMY) S XMY("G.CSPIMS@DOMAIN.EXT")=""
 I '$D(DUP) D  ;No duplicates
 .S SDTXT(1)="The Duplicate Stop Code Clean Up Process has been completed.",SDTXT(2)="No active duplicate stop codes were found."
 I $D(DUP) D  ;Duplicates found
 .S SDTXT(1)="IEN"_$$REPEAT^XLFSTR(" ",7)_"NAME"_$$REPEAT^XLFSTR(" ",36)_"AMIS STOP CODE"
 .S SDTXT(2)=" ",CNT=2
 .S SC=0 F  S SC=$O(DUP(SC)) Q:'+SC  S DIEN=0 F  S DIEN=$O(DUP(SC,DIEN)) Q:'+DIEN  D
 ..S NAME=$P($G(^DIC(40.7,DIEN,0)),U,1)
 ..S CNT=CNT+1,SDTXT(CNT)=DIEN_$$REPEAT^XLFSTR(" ",(10-$L(DIEN)))_NAME_$$REPEAT^XLFSTR(" ",(40-$L(NAME)))_SC
 .S CNT=CNT+1,SDTXT(CNT)=" "
 .S CNT=CNT+1,SDTXT(CNT)="**PLEASE log a REMEDY TICKET to the Scheduling package for",CNT=CNT+1,SDTXT(CNT)="assistance from the PIMS Team in correction of these duplicates.**"
 S XMTEXT="SDTXT(",XMSUB="DUPLICATE STOP CODE CLEAN UP"
 D ^XMD ;Send duplicate clean up message
 ;Now set up and send clean up/standardization message
 K SDTXT
 I '$D(UPDATE) S SDTXT(1)="The stop code clean up/standardization process has been completed",SDTXT(2)="and no stop codes were inactivated, modified, or added."
 I $D(UPDATE) D
 .S CNT=1
 .I $D(UPDATE("I")) D  ;codes that were not found in the gold listing
 ..S SDTXT(CNT)="The following entries were not found in the standardized list",CNT=CNT+1,SDTXT(CNT)="and were inactivated with a date of 11/1/10.",CNT=CNT+1,SDTXT(CNT)="",CNT=CNT+1
 ..S SDTXT(CNT)="CODE  NAME",CNT=CNT+1
 ..S IEN=0 F  S IEN=$O(UPDATE("I",IEN)) Q:'+IEN  D
 ...S NODE=^DIC(40.7,IEN,0)
 ...S SDTXT(CNT)=$P(NODE,U,2)_$$REPEAT^XLFSTR(" ",(6-$L($P(NODE,U,2))))_$P(NODE,U),CNT=CNT+1
 ..S SDTXT(CNT)="",CNT=CNT+1
 .I $D(UPDATE("U")) D  ;codes that were modified to match the standardized listing
 ..S SDTXT(CNT)="The following entries have been modified to match the standardized list.",CNT=CNT+1,SDTXT(CNT)="",CNT=CNT+1
 ..S SDTXT(CNT)="     CODE NAME"_$$REPEAT^XLFSTR(" ",28)_"RESTRCT   RESTRCT   INACT",CNT=CNT+1,SDTXT(CNT)=$$REPEAT^XLFSTR(" ",42)_"TYPE      DATE      DATE",CNT=CNT+1,SDTXT(CNT)="",CNT=CNT+1
 ..S IEN=0 F  S IEN=$O(UPDATE("U",IEN)) Q:'+IEN  D
 ...S NODE=^DIC(40.7,IEN,0)
 ...S SDTXT(CNT)="Old: "_$P(NODE,U,2)_$$REPEAT^XLFSTR(" ",(5-$L($P(NODE,U,2))))
 ...F I=1:1:4 S PIECE=$P($P(UPDATE("U",IEN),U,I),"~") D
 ....S SDTXT(CNT)=SDTXT(CNT)_$S(I=1!(I=2):PIECE,1:$$FMTE^XLFDT(PIECE,2))_$$REPEAT^XLFSTR(" ",($S(I=1:32,1:10)-$L(PIECE)))
 ...S CNT=CNT+1,SDTXT(CNT)="New: "_$P(NODE,U,2)_$$REPEAT^XLFSTR(" ",(5-$L($P(NODE,U,2))))
 ...F I=1:1:4 S PIECE=$P($P(UPDATE("U",IEN),U,I),"~",2) D
 ....S SDTXT(CNT)=SDTXT(CNT)_$S(I=1!(I=2):PIECE,1:$$FMTE^XLFDT(PIECE,2))_$$REPEAT^XLFSTR(" ",($S(I=1:32,1:10)-$L(PIECE)))
 ...S CNT=CNT+1,SDTXT(CNT)="",CNT=CNT+1
 .I $D(UPDATE("N")) D  ;new entries that were added to 40.7
 ..S SDTXT(CNT)="The following entries were added to your CLINIC STOP (#40.7) file.",CNT=CNT+1
 ..S SDTXT(CNT)="",CNT=CNT+1,SDTXT(CNT)="CODE  NAME",CNT=CNT+1
 ..S IEN=0 F  S IEN=$O(UPDATE("N",IEN)) Q:'+IEN  S SDTXT(CNT)=IEN_$$REPEAT^XLFSTR(" ",(6-$L(IEN)))_$P(^XTMP("SDSTOP",IEN),U),CNT=CNT+1
 ..S SDTXT(CNT)="",CNT=CNT+1
 .I $D(UPDATE("NA")) D  ;new entries that couldn't be added for some reason
 ..S SDTXT(CNT)="The following entries were NOT added to your CLINIC STOP (#40.7) file.",CNT=CNT+1,SDTXT(CNT)="Please log a remedy ticket for assistance in adding these entries.",CNT=CNT+1
 ..S SDTXT(CNT)="",CNT=CNT+1,SDTXT(CNT)="CODE  NAME",CNT=CNT+1
 ..S IEN=0 F  S IEN=$O(UPDATE("NA",IEN)) Q:'+IEN  S SDTXT(CNT)=IEN_$$REPEAT^XLFSTR(" ",(6-$L(IEN)))_$P(^XTMP("SDSTOP",IEN),U),CNT=CNT+1
 S XMTEXT="SDTXT(",XMSUB="Clinic Stop Code file (#40.7) standardization/clean up"
 D GETXMY("ECXMGR",.XMY),GETXMY("SD SUPERVISOR",.XMY)
 D ^XMD
 Q
 ;
CONFORM ;Run the two non-conforming clinic reports
 N DIC,X,Y,XMSUB,XMDUZ,XMY,IOP,SDPCF,XMQUIET,ECXPCF,ECX,REP,DIFROM
 F REP=1:1:2 D
 .S DIC=3.5,DIC(0)="X",X="P-MESSAGE-HFS" D ^DIC
 .Q:'+Y  ;Stop if p-message device doesn't exist
 .S IOP="`"_+Y ;Set IOP to p-message device
 .S XMDUZ="Patch SD*5.3*568 Post-install"
 .S XMSUB="Non-Conforming Clinics Stop Code Report for "_$S(REP=1:"Scheduling",1:"DSS")
 .S XMQUIET=1 ;no screen interaction with p-message
 .D ^%ZIS Q:POP  ;Stop if there is a problem with p-message device
 .U IO
 .I REP=1 D 
 ..K XMY
 ..D GETXMY("SD SUPERVISOR",.XMY),GETXMY("ECXMGR",.XMY)
 ..S SDPCF="A"
 ..D PROCESS^SDSCRP
 .I REP=2 D 
 ..K XMY
 ..D GETXMY("ECXMGR",.XMY),GETXMY("SD SUPERVISOR",.XMY)
 ..S ECXPCF="A"
 ..;Synch primary & secondary stop codes from file #44 with #728.44
 ..S ECX=0 F  S ECX=$O(^ECX(728.44,ECX)) Q:'ECX  D FIX^ECXSCLD(ECX)
 ..D PROCESS^ECXSCRP
 .D ^%ZISC
 Q
 ;
GETXMY(KEY,XMY) ;
 I $G(KEY)'="" M XMY=^XUSEC(KEY)
 S:$G(DUZ) XMY(DUZ)="" ;Make sure there's at least one recipient
 Q
 ;
QCONFORM ;Queue non-conforming reports
 N ZTSK,ZTRTN,ZTDESC,ZTIO,ZTDTH
 S ZTRTN="CONFORM^SD53P568",ZTDESC="NON-CONFORMING REPORTS FROM PATCH SD*5.3*568",ZTIO="",ZTDTH=$H
 D ^%ZTLOAD
 I '$D(ZTSK) D BMES^XPDUTL("NON-CONFORMING REPORTS NOT QUEUED!  RUN CONFORM^SD53P568 AFTER INSTALL FINISHES") Q
 D BMES^XPDUTL("NON-CONFORMING REPORTS QUEUED AS TASK # "_$G(ZTSK))
 Q
 ;
COMPILE ;Compiles SDB input template to make sure changes to file 44 are included
 N X,Y,DMAX
 S X="SDBT"
 S Y=$O(^DIE("B","SDB",0)) Q:'+Y  ;Template not found
 S DMAX=$$ROUSIZE^DILF
 D EN^DIEZ
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSD53P568   10811     printed  Sep 23, 2025@20:22:56                                                                                                                                                                                                   Page 2
SD53P568  ;ALB/DAN Patch 568 install related activities ;12/8/10  11:28
 +1       ;;5.3;Scheduling;**568**;AUG 13, 1993;Build 14
 +2       ;
 +3       ;DBIA Section
 +4       ;1147  - $$ADD^XPDMENU
 +5       ;2649  - $$ROUSIZE^DILF
 +6       ;10141 - XPDUTL
 +7       ;10086 - %ZIS
 +8       ;10089 - %ZISC
 +9       ;10006 - DIC
 +10      ;10070 - XMD
 +11      ;10103 - XLFDT
 +12      ;10104 - XLFSTR
 +13       QUIT 
 +14      ;
PRETRAN   ;Load conversion table into KIDS build
 +1        MERGE @XPDGREF@("SDSTOP")=^XTMP("SDSTOP")
 +2        QUIT 
 +3       ;
POST      ;Post installation processes
 +1        NEW SKIP,DUP,UPDATE
 +2       ;allow editing of fields during post-install, restrict fields upon completion
           DO UPDATEDD("O")
 +3       ;Add edit stop code option to menu
           DO UPDMENU
 +4       ;Load gold stop codes
           DO LOADGSC
 +5       ;Stop if error loading table
           IF +$GET(XPDQUIT)
               QUIT 
 +6       ;Identify any duplicate entries
           DO CHKDUPS
 +7       ;Update 40.7 to "gold" standard
           DO UPDCODES
 +8       ;Send message showing duplicates and updates
           DO MAIL
 +9       ;Run non-conforming clinic report in background
           DO QCONFORM
 +10      ;Set restrictions on file to make entries uneditable.
           DO UPDATEDD("C")
 +11      ;Compile SDB input template
           DO COMPILE
 +12       QUIT 
 +13      ;
LOADGSC   ;Load gold stop code global for comparison and removal of duplicates
 +1        KILL ^XTMP("SDSTOP")
 +2        MERGE ^XTMP("SDSTOP")=@XPDGREF@("SDSTOP")
 +3        IF '$DATA(^XTMP("SDSTOP"))
               DO BMES^XPDUTL("Conversion table not loaded - INSTALLATION ABORTED")
               SET XPDQUIT=2
               QUIT 
 +4       ;Set auto-delete date from XTMP global
           SET ^XTMP("SDSTOP",0)=$$FMADD^XLFDT(DT,30)_"^"_DT_"^Patch SD*5.3*568 conversion table"
 +5        QUIT 
 +6       ;
UPDATEDD(TYPE) ;Update DD for 40.7 to either unrestrict edits or restrict edits
 +1        NEW I
 +2       ;restrict file
           IF TYPE="C"
               Begin DoDot:1
 +3                SET ^DD(40.7,.01,7.5)="I $G(DIC(0))[""L"",'$D(SDAUMF) D EN^DDIOL(""Entries can only be added by the Stop Code Counsel."","""",""!?5"") K X"
 +4       ;Makes all fields uneditable
                   FOR I=1:1:6
                       IF $PIECE(^DD(40.7,I,0),U,2)'["I"
                           SET $PIECE(^DD(40.7,I,0),U,2)=$PIECE(^DD(40.7,I,0),U,2)_"I"
               End DoDot:1
 +5       ;remove restrictions
           IF TYPE="O"
               Begin DoDot:1
 +6                KILL ^DD(40.7,.01,7.5)
 +7                FOR I=1:1:6
                       SET $PIECE(^DD(40.7,I,0),U,2)=$TRANSLATE($PIECE(^DD(40.7,I,0),U,2),"I","")
               End DoDot:1
 +8        QUIT 
 +9       ;
 +1        NEW ADDED
 +2        SET ADDED=$$ADD^XPDMENU("SDSUP","SD EDIT LOCAL STOP CODE NAME")
 +3        DO BMES^XPDUTL("SD EDIT LOCAL STOP CODE NAME option "_$SELECT('+$GET(ADDED):"NOT ",1:"")_"added to menu SDSUP")
 +4        SET ADDED=$$ADD^XPDMENU("ECX SETUP CLINIC","SD CLINIC EDIT LOG","8")
 +5        DO BMES^XPDUTL("SD CLINIC EDIT LOG option "_$SELECT('+$GET(ADDED):"NOT ",1:"")_"added to menu ECX SETUP CLINIC")
 +6        QUIT 
 +7       ;
CHKDUPS   ;Look through file 40.7 and check for entries with duplicate AMIS STOP CODES
 +1        NEW SC,IEN,GST,I,ARRAY,CNT,SIEN,NUMACT
 +2        SET SC=0
           FOR 
               SET SC=$ORDER(^DIC(40.7,"C",SC))
               if '+SC
                   QUIT 
               Begin DoDot:1
 +3                KILL ARRAY
                   SET NUMACT=0
 +4                SET CNT=0
                   SET SIEN=0
                   FOR 
                       SET SIEN=$ORDER(^DIC(40.7,"C",SC,SIEN))
                       if '+SIEN
                           QUIT 
                       SET CNT=CNT+1
                       SET ARRAY(CNT,SIEN)=$SELECT($PIECE(^DIC(40.7,SIEN,0),U,3)'="":0,1:1)
                       IF ARRAY(CNT,SIEN)=1
                           SET NUMACT=NUMACT+1
 +5                IF CNT'<2
                       Begin DoDot:2
 +6       ;Stop code doesn't exist
                           IF '$DATA(^XTMP("SDSTOP",SC))
                               QUIT 
 +7       ;gold entry status 0 - inactive, 1 - active
                           SET GST=$SELECT($PIECE(^XTMP("SDSTOP",SC),U,4)'="":0,1:1)
 +8       ;Stop if gold entry is inactive, no duplicates can exist
                           if 'GST
                               QUIT 
 +9                        FOR I=1:1:CNT
                               SET IEN=$ORDER(ARRAY(I,0))
                               Begin DoDot:3
 +10                               IF NUMACT=0
                                       SET DUP(SC,IEN)=""
                                       SET SKIP(IEN)=""
                                       QUIT 
 +11                               IF NUMACT=1
                                       IF 'ARRAY(I,IEN)
                                           SET SKIP(IEN)=""
                                           QUIT 
 +12                               IF NUMACT'<2
                                       Begin DoDot:4
 +13                                       IF ARRAY(I,IEN)
                                               SET DUP(SC,IEN)=""
                                               SET SKIP(IEN)=""
 +14                                       IF 'ARRAY(I,IEN)
                                               SET SKIP(IEN)=""
                                       End DoDot:4
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +15       QUIT 
 +16      ;
UPDCODES  ;Compare existing entries in 40.7 with "gold" entries
 +1        NEW SC,IEN,DIE,DA,DR,LINE,GOLD,DIC,NODE,X,Y,SDAUMF
 +2        SET SC=0
           FOR 
               SET SC=$ORDER(^DIC(40.7,"C",SC))
               if '+SC
                   QUIT 
               Begin DoDot:1
 +3                SET IEN=0
                   FOR 
                       SET IEN=$ORDER(^DIC(40.7,"C",SC,IEN))
                       if '+IEN
                           QUIT 
                       Begin DoDot:2
 +4                        KILL LINE,GOLD,DR,DA
 +5       ;Entry in 40.7 isn't in gold listing
                           IF '$DATA(^XTMP("SDSTOP",SC))
                               Begin DoDot:3
 +6       ;Make entry inactive as of 11/1/10 if not already inactive
                                   IF $PIECE(^DIC(40.7,IEN,0),U,3)=""
                                       SET DIE=40.7
                                       SET DA=IEN
                                       SET DR="2////3101101"
                                       DO ^DIE
                                       SET UPDATE("I",IEN)=""
                               End DoDot:3
                               QUIT 
 +7       ;If entry is in the "SKIP" array then it doesn't need to be touched
                           IF $DATA(SKIP(IEN))
                               QUIT 
 +8       ;Compare entries, update where needed
 +9                        SET LINE=^DIC(40.7,IEN,0)
 +10                       SET GOLD=^XTMP("SDSTOP",SC)
 +11      ;If not a local entry, then compare name field
                           IF '(SC'<451&(SC'>485)&(SC'=457)&(SC'=474)&(SC'=480)&(SC'=481))
                               IF $PIECE(LINE,U)'=$PIECE(GOLD,U)
                                   SET DR=".01////"_$PIECE(GOLD,U)_";"
                                   SET UPDATE("U",IEN)=$PIECE(LINE,U)_"~"_$PIECE(GOLD,U)
 +12      ;if restriction type doesn't match, update it
                           IF $PIECE(LINE,U,6)'=$EXTRACT($PIECE(GOLD,U,2))
                               SET DR=$GET(DR)_"5////"_$EXTRACT($PIECE(GOLD,U,2))_";"
                               SET $PIECE(UPDATE("U",IEN),U,2)=$PIECE(LINE,U,6)_"~"_$EXTRACT($PIECE(GOLD,U,2))
 +13      ;If restriction date doesn't match, update it
                           IF $PIECE(LINE,U,7)'=$PIECE(GOLD,U,3)
                               SET DR=$GET(DR)_"6////"_$SELECT($PIECE(GOLD,U,3)="":"@",1:$PIECE(GOLD,U,3))_";"
                               SET $PIECE(UPDATE("U",IEN),U,3)=$PIECE(LINE,U,7)_"~"_$PIECE(GOLD,U,3)
 +14      ;if inactivation date doesn't match, update it
                           IF $PIECE(LINE,U,3)'=$PIECE(GOLD,U,4)
                               SET DR=$GET(DR)_"2////"_$SELECT($PIECE(GOLD,U,4)="":"@",1:$PIECE(GOLD,U,4))
                               SET $PIECE(UPDATE("U",IEN),U,4)=$PIECE(LINE,U,3)_"~"_$PIECE(GOLD,U,4)
 +15      ;update entry to "gold" values
                           IF $DATA(DR)
                               SET DA=IEN
                               SET DIE=40.7
                               DO ^DIE
                       End DoDot:2
               End DoDot:1
 +16      ;Add entries from GOLD that aren't in 40.7
 +17       SET SC=0
           FOR 
               SET SC=$ORDER(^XTMP("SDSTOP",SC))
               if '+SC
                   QUIT 
               Begin DoDot:1
 +18               IF '$DATA(^DIC(40.7,"C",SC))
                       Begin DoDot:2
 +19                       SET SDAUMF=1
 +20                       SET NODE=^XTMP("SDSTOP",SC)
 +21                       SET DIC=40.7
                           SET DIC(0)="LX"
                           SET X=$PIECE(NODE,U)
                           SET DIC("DR")="1////"_SC_";2////"_$PIECE(NODE,U,4)_";5////"_$EXTRACT($PIECE(NODE,U,2))_";6////"_$PIECE(NODE,U,3)
 +22      ;adds new entries with fields identified above
                           DO ^DIC
 +23      ;if entry fails, store it so it can be reported
                           IF Y=-1!('+$PIECE(Y,U,3))
                               SET UPDATE("NA",SC)=""
                               QUIT 
 +24                       SET UPDATE("N",SC)=""
                       End DoDot:2
               End DoDot:1
 +25       QUIT 
 +26      ;
MAIL      ;Send message indicating post install is finished
 +1        NEW XMSUB,XMTEXT,XMDUZ,XMY,XMZ,SDTXT,CNT,DIFROM,DIEN,NODE,SC,NAME,IEN,I,PIECE
 +2        SET XMDUZ="PATCH SD*5.3*568 POST-INSTALL"
 +3        DO GETXMY("ECXMGR",.XMY)
           DO GETXMY("SD SUPERVISOR",.XMY)
           SET XMY("G.CSPIMS@DOMAIN.EXT")=""
 +4       ;No duplicates
           IF '$DATA(DUP)
               Begin DoDot:1
 +5                SET SDTXT(1)="The Duplicate Stop Code Clean Up Process has been completed."
                   SET SDTXT(2)="No active duplicate stop codes were found."
               End DoDot:1
 +6       ;Duplicates found
           IF $DATA(DUP)
               Begin DoDot:1
 +7                SET SDTXT(1)="IEN"_$$REPEAT^XLFSTR(" ",7)_"NAME"_$$REPEAT^XLFSTR(" ",36)_"AMIS STOP CODE"
 +8                SET SDTXT(2)=" "
                   SET CNT=2
 +9                SET SC=0
                   FOR 
                       SET SC=$ORDER(DUP(SC))
                       if '+SC
                           QUIT 
                       SET DIEN=0
                       FOR 
                           SET DIEN=$ORDER(DUP(SC,DIEN))
                           if '+DIEN
                               QUIT 
                           Begin DoDot:2
 +10                           SET NAME=$PIECE($GET(^DIC(40.7,DIEN,0)),U,1)
 +11                           SET CNT=CNT+1
                               SET SDTXT(CNT)=DIEN_$$REPEAT^XLFSTR(" ",(10-$LENGTH(DIEN)))_NAME_$$REPEAT^XLFSTR(" ",(40-$LENGTH(NAME)))_SC
                           End DoDot:2
 +12               SET CNT=CNT+1
                   SET SDTXT(CNT)=" "
 +13               SET CNT=CNT+1
                   SET SDTXT(CNT)="**PLEASE log a REMEDY TICKET to the Scheduling package for"
                   SET CNT=CNT+1
                   SET SDTXT(CNT)="assistance from the PIMS Team in correction of these duplicates.**"
               End DoDot:1
 +14       SET XMTEXT="SDTXT("
           SET XMSUB="DUPLICATE STOP CODE CLEAN UP"
 +15      ;Send duplicate clean up message
           DO ^XMD
 +16      ;Now set up and send clean up/standardization message
 +17       KILL SDTXT
 +18       IF '$DATA(UPDATE)
               SET SDTXT(1)="The stop code clean up/standardization process has been completed"
               SET SDTXT(2)="and no stop codes were inactivated, modified, or added."
 +19       IF $DATA(UPDATE)
               Begin DoDot:1
 +20               SET CNT=1
 +21      ;codes that were not found in the gold listing
                   IF $DATA(UPDATE("I"))
                       Begin DoDot:2
 +22                       SET SDTXT(CNT)="The following entries were not found in the standardized list"
                           SET CNT=CNT+1
                           SET SDTXT(CNT)="and were inactivated with a date of 11/1/10."
                           SET CNT=CNT+1
                           SET SDTXT(CNT)=""
                           SET CNT=CNT+1
 +23                       SET SDTXT(CNT)="CODE  NAME"
                           SET CNT=CNT+1
 +24                       SET IEN=0
                           FOR 
                               SET IEN=$ORDER(UPDATE("I",IEN))
                               if '+IEN
                                   QUIT 
                               Begin DoDot:3
 +25                               SET NODE=^DIC(40.7,IEN,0)
 +26                               SET SDTXT(CNT)=$PIECE(NODE,U,2)_$$REPEAT^XLFSTR(" ",(6-$LENGTH($PIECE(NODE,U,2))))_$PIECE(NODE,U)
                                   SET CNT=CNT+1
                               End DoDot:3
 +27                       SET SDTXT(CNT)=""
                           SET CNT=CNT+1
                       End DoDot:2
 +28      ;codes that were modified to match the standardized listing
                   IF $DATA(UPDATE("U"))
                       Begin DoDot:2
 +29                       SET SDTXT(CNT)="The following entries have been modified to match the standardized list."
                           SET CNT=CNT+1
                           SET SDTXT(CNT)=""
                           SET CNT=CNT+1
 +30                       SET SDTXT(CNT)="     CODE NAME"_$$REPEAT^XLFSTR(" ",28)_"RESTRCT   RESTRCT   INACT"
                           SET CNT=CNT+1
                           SET SDTXT(CNT)=$$REPEAT^XLFSTR(" ",42)_"TYPE      DATE      DATE"
                           SET CNT=CNT+1
                           SET SDTXT(CNT)=""
                           SET CNT=CNT+1
 +31                       SET IEN=0
                           FOR 
                               SET IEN=$ORDER(UPDATE("U",IEN))
                               if '+IEN
                                   QUIT 
                               Begin DoDot:3
 +32                               SET NODE=^DIC(40.7,IEN,0)
 +33                               SET SDTXT(CNT)="Old: "_$PIECE(NODE,U,2)_$$REPEAT^XLFSTR(" ",(5-$LENGTH($PIECE(NODE,U,2))))
 +34                               FOR I=1:1:4
                                       SET PIECE=$PIECE($PIECE(UPDATE("U",IEN),U,I),"~")
                                       Begin DoDot:4
 +35                                       SET SDTXT(CNT)=SDTXT(CNT)_$SELECT(I=1!(I=2):PIECE,1:$$FMTE^XLFDT(PIECE,2))_$$REPEAT^XLFSTR(" ",($SELECT(I=1:32,1:10)-$LENGTH(PIECE)))
                                       End DoDot:4
 +36                               SET CNT=CNT+1
                                   SET SDTXT(CNT)="New: "_$PIECE(NODE,U,2)_$$REPEAT^XLFSTR(" ",(5-$LENGTH($PIECE(NODE,U,2))))
 +37                               FOR I=1:1:4
                                       SET PIECE=$PIECE($PIECE(UPDATE("U",IEN),U,I),"~",2)
                                       Begin DoDot:4
 +38                                       SET SDTXT(CNT)=SDTXT(CNT)_$SELECT(I=1!(I=2):PIECE,1:$$FMTE^XLFDT(PIECE,2))_$$REPEAT^XLFSTR(" ",($SELECT(I=1:32,1:10)-$LENGTH(PIECE)))
                                       End DoDot:4
 +39                               SET CNT=CNT+1
                                   SET SDTXT(CNT)=""
                                   SET CNT=CNT+1
                               End DoDot:3
                       End DoDot:2
 +40      ;new entries that were added to 40.7
                   IF $DATA(UPDATE("N"))
                       Begin DoDot:2
 +41                       SET SDTXT(CNT)="The following entries were added to your CLINIC STOP (#40.7) file."
                           SET CNT=CNT+1
 +42                       SET SDTXT(CNT)=""
                           SET CNT=CNT+1
                           SET SDTXT(CNT)="CODE  NAME"
                           SET CNT=CNT+1
 +43                       SET IEN=0
                           FOR 
                               SET IEN=$ORDER(UPDATE("N",IEN))
                               if '+IEN
                                   QUIT 
                               SET SDTXT(CNT)=IEN_$$REPEAT^XLFSTR(" ",(6-$LENGTH(IEN)))_$PIECE(^XTMP("SDSTOP",IEN),U)
                               SET CNT=CNT+1
 +44                       SET SDTXT(CNT)=""
                           SET CNT=CNT+1
                       End DoDot:2
 +45      ;new entries that couldn't be added for some reason
                   IF $DATA(UPDATE("NA"))
                       Begin DoDot:2
 +46                       SET SDTXT(CNT)="The following entries were NOT added to your CLINIC STOP (#40.7) file."
                           SET CNT=CNT+1
                           SET SDTXT(CNT)="Please log a remedy ticket for assistance in adding these entries."
                           SET CNT=CNT+1
 +47                       SET SDTXT(CNT)=""
                           SET CNT=CNT+1
                           SET SDTXT(CNT)="CODE  NAME"
                           SET CNT=CNT+1
 +48                       SET IEN=0
                           FOR 
                               SET IEN=$ORDER(UPDATE("NA",IEN))
                               if '+IEN
                                   QUIT 
                               SET SDTXT(CNT)=IEN_$$REPEAT^XLFSTR(" ",(6-$LENGTH(IEN)))_$PIECE(^XTMP("SDSTOP",IEN),U)
                               SET CNT=CNT+1
                       End DoDot:2
               End DoDot:1
 +49       SET XMTEXT="SDTXT("
           SET XMSUB="Clinic Stop Code file (#40.7) standardization/clean up"
 +50       DO GETXMY("ECXMGR",.XMY)
           DO GETXMY("SD SUPERVISOR",.XMY)
 +51       DO ^XMD
 +52       QUIT 
 +53      ;
CONFORM   ;Run the two non-conforming clinic reports
 +1        NEW DIC,X,Y,XMSUB,XMDUZ,XMY,IOP,SDPCF,XMQUIET,ECXPCF,ECX,REP,DIFROM
 +2        FOR REP=1:1:2
               Begin DoDot:1
 +3                SET DIC=3.5
                   SET DIC(0)="X"
                   SET X="P-MESSAGE-HFS"
                   DO ^DIC
 +4       ;Stop if p-message device doesn't exist
                   if '+Y
                       QUIT 
 +5       ;Set IOP to p-message device
                   SET IOP="`"_+Y
 +6                SET XMDUZ="Patch SD*5.3*568 Post-install"
 +7                SET XMSUB="Non-Conforming Clinics Stop Code Report for "_$SELECT(REP=1:"Scheduling",1:"DSS")
 +8       ;no screen interaction with p-message
                   SET XMQUIET=1
 +9       ;Stop if there is a problem with p-message device
                   DO ^%ZIS
                   if POP
                       QUIT 
 +10               USE IO
 +11               IF REP=1
                       Begin DoDot:2
 +12                       KILL XMY
 +13                       DO GETXMY("SD SUPERVISOR",.XMY)
                           DO GETXMY("ECXMGR",.XMY)
 +14                       SET SDPCF="A"
 +15                       DO PROCESS^SDSCRP
                       End DoDot:2
 +16               IF REP=2
                       Begin DoDot:2
 +17                       KILL XMY
 +18                       DO GETXMY("ECXMGR",.XMY)
                           DO GETXMY("SD SUPERVISOR",.XMY)
 +19                       SET ECXPCF="A"
 +20      ;Synch primary & secondary stop codes from file #44 with #728.44
 +21                       SET ECX=0
                           FOR 
                               SET ECX=$ORDER(^ECX(728.44,ECX))
                               if 'ECX
                                   QUIT 
                               DO FIX^ECXSCLD(ECX)
 +22                       DO PROCESS^ECXSCRP
                       End DoDot:2
 +23               DO ^%ZISC
               End DoDot:1
 +24       QUIT 
 +25      ;
GETXMY(KEY,XMY) ;
 +1        IF $GET(KEY)'=""
               MERGE XMY=^XUSEC(KEY)
 +2       ;Make sure there's at least one recipient
           if $GET(DUZ)
               SET XMY(DUZ)=""
 +3        QUIT 
 +4       ;
QCONFORM  ;Queue non-conforming reports
 +1        NEW ZTSK,ZTRTN,ZTDESC,ZTIO,ZTDTH
 +2        SET ZTRTN="CONFORM^SD53P568"
           SET ZTDESC="NON-CONFORMING REPORTS FROM PATCH SD*5.3*568"
           SET ZTIO=""
           SET ZTDTH=$HOROLOG
 +3        DO ^%ZTLOAD
 +4        IF '$DATA(ZTSK)
               DO BMES^XPDUTL("NON-CONFORMING REPORTS NOT QUEUED!  RUN CONFORM^SD53P568 AFTER INSTALL FINISHES")
               QUIT 
 +5        DO BMES^XPDUTL("NON-CONFORMING REPORTS QUEUED AS TASK # "_$GET(ZTSK))
 +6        QUIT 
 +7       ;
COMPILE   ;Compiles SDB input template to make sure changes to file 44 are included
 +1        NEW X,Y,DMAX
 +2        SET X="SDBT"
 +3       ;Template not found
           SET Y=$ORDER(^DIE("B","SDB",0))
           if '+Y
               QUIT 
 +4        SET DMAX=$$ROUSIZE^DILF
 +5        DO EN^DIEZ
 +6        QUIT