Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: SDES2REMAP

SDES2REMAP.m

Go to the documentation of this file.
SDES2REMAP ;ALB/BWF/JAS - REMAP DIVISION/CLINIC ; MAY 21, 2025
 ;;5.3;Scheduling;**908**;Aug 13, 1993;Build 2
 ;;Per VHA Directive 6402, this routine should not be modified
 ;
 Q
 ;
 ; SDCONTEXT - standard SDCONTEXT input array
 ;
 ; SDINPUT("DIVISION","ALL")                                       - Only used to re-map all divisions
 ;                                                                   This should only be passed if 'ALL' divisions are being re-mapped
 ;
 ; When re-mapping 'ALL' clinics, or a clinic list within
 ; a specific DIVISION, pass in the following:
 ; SDINPUT("DIVISION",DIVISION IEN,"CLINIC","ALL")=""              - re-maps all clinics within the division
 ; SDINPUT("DIVISION",DIVISION IEN,"CLINIC",CLINICIEN)=""          - list of clinics to remap
 ;
 ; When re-mapping a list of clinics that are not associated
 ; with a single division, send in a list of just the clinics
 ; being remapped:
 ; SDINPUT("CLINIC",CLINIC IEN)=""                                 - required, if division is not passed
 ;
 ; SDINPUT("START DATE")=ISO START DATE (i.e. 2024-12-01)          - required, re-map start date
 ; SDINPUT("END DATE")=ISO END DATE     (i.e. 2024-12-30)          - required, re-map end date
 ;
REMAP(RESULT,SDCONTEXT,SDINPUT) ;
 N ERRORS,VALDATES,STARTDATE,ENDDATE,QUEUEREMAP,TASKRES,GBL,SDUSER
 N %,D,D0,D1,D2,DG,DIC,DICR,DIW,SEQ,SEQ1,XMDUN,XMZ,Y
 S QUEUEREMAP=0
 D VALCONTEXT^SDES2VALCONTEXT(.ERRORS,.SDCONTEXT)
 I $D(ERRORS) D  Q
 .S ERRORS("ClinicRemap",1)=""
 .D BUILDJSON^SDES2JSON(.RESULT,.ERRORS)
 ;
 ; validate start/end date
 S VALDATES=$$VALISODATERANGE^SDES2VALISODTTM(.ERRORS,$G(SDINPUT("START DATE")),$G(SDINPUT("END DATE")),1)
 S STARTDATE=$P(VALDATES,U)
 S ENDDATE=$P(VALDATES,U,2)
 S SDUSER=$S($G(SDCONTEXT("USER DUZ")):SDCONTEXT("USER DUZ"),1:DUZ)
 ;
 I $D(ERRORS) D  Q
 .S ERRORS("ClinicRemap",1)=""
 .D BUILDJSON^SDES2JSON(.RESULT,.ERRORS)
 ;
 D VALIDATE^SDES2REMAPUTIL(.ERRORS,.SDINPUT,.QUEUEREMAP)
 I $D(ERRORS) D  Q
 .S ERRORS("ClinicRemap",1)=""
 .D BUILDJSON^SDES2JSON(.RESULT,.ERRORS)
 ;
 ; queue remap in background if QUEUEREMAP=1
 I QUEUEREMAP D  Q
 .D TASKREMAP^SDES2REMAPUTIL(.SDINPUT,STARTDATE,ENDDATE,.TASKRES,SDUSER)
 .I '$D(TASKRES) S TASKRES("ClinicRemap",1)=""
 .D BUILDJSON^SDES2JSON(.RESULT,.TASKRES)
 ;
 S GBL=$NA(^TMP("SDES2REMAP",$J)) K @GBL
 D REMAPFOREGROUND(.GBL,SDUSER)
 M TASKRES("ClinicRemap","Status")=^TMP("SDES2REMAP",$J)
 D BUILDJSON^SDES2JSON(.RESULT,.TASKRES)
 Q
 ;
REMAPFOREGROUND(GBL,SDUSER) ;
 N DIVISIONIEN,CLINICIEN,TMPCOUNT
 S (DIVISIONIEN,TMPCOUNT)=0
 ; build report header
 D HEADER^SDES2REMAPUTIL(.GBL,.TMPCOUNT)
 I $D(SDINPUT("DIVISION")) D  Q
 .F  S DIVISIONIEN=$O(SDINPUT("DIVISION",DIVISIONIEN)) Q:'DIVISIONIEN  D
 ..; process all clinics
 ..I $D(SDINPUT("DIVISION",DIVISIONIEN,"CLINIC","ALL")) D  Q
 ...S CLINICIEN=0
 ...F  S CLINICIEN=$O(^SC(CLINICIEN)) Q:'CLINICIEN  D
 ....Q:'$$CLINDIVCHECK^SDES2REMAPUTIL(DIVISIONIEN,CLINICIEN)
 ....D REMAPCLIN(.GBL,CLINICIEN,STARTDATE,ENDDATE,.TMPCOUNT)
 ...D MAIL^SDES2REMAPUTIL(GBL,SDUSER)
 ..; process clinics in the list
 ..S CLINICIEN=0
 ..F  S CLINICIEN=$O(SDINPUT("DIVISION",DIVISIONIEN,"CLINIC",CLINICIEN)) Q:'CLINICIEN  D
 ...Q:'$$CLINDIVCHECK^SDES2REMAPUTIL(DIVISIONIEN,CLINICIEN)
 ...D REMAPCLIN(.GBL,CLINICIEN,STARTDATE,ENDDATE,.TMPCOUNT)
 ..D MAIL^SDES2REMAPUTIL(GBL,SDUSER)
 ;
 I $D(SDINPUT("CLINIC")) D  Q
 .S CLINIEN=0 F  S CLINIEN=$O(SDINPUT("CLINIC",CLINIEN)) Q:'CLINIEN  D
 ..Q:$$GET1^DIQ(44,CLINIEN,2,"I")'="C"
 ..Q:$$INACTIVE^SDES2UTIL(CLINIEN,DT)
 ..D REMAPCLIN(.GBL,CLINIEN,STARTDATE,ENDDATE,.TMPCOUNT)
 .D MAIL^SDES2REMAPUTIL(GBL,SDUSER)
 Q
 ;
REMAPCLIN(GBL,CLINICIEN,STARTDATE,ENDDATE,TMPCOUNT) ;
 N CLINICNAME,SCHEDONHOLIDAY,STARTOFDAY,DISPINCPERHOUR,SDDAYOFWEEK,SDBEGO,SDX,REMAPDATE,DONE,ACTIVEAPPTS,X,AVAILABILITY,REMAPDAY,CLINTMPCNT
 N CLINGBL,FIRSTAPPTDTTM,PATTERNFILE,REMAPDAYNAME,SPECPATTERN,STDEFINED,SAVECAN,MASTERPATTERN,NEWPATTERN,HOURBEFORESTART,CLINAPPTLENGTH,SDSI
 N SDBEG,SDBEGZ,SDCNT,SDDAY,SDDOW,HSI,PATTERNDATE,DIVNAME
 S CLINGBL=$NA(^TMP("SDES2REMAPCLINIC",$J)) K @CLINGBL
 S CLINTMPCNT=0
 S CLINAPPTLENGTH=$$GET1^DIQ(44,CLINICIEN,1912,"I")  ; previously SL
 S CLINICNAME=$$GET1^DIQ(44,CLINICIEN,.01,"E")
 S SCHEDONHOLIDAY=$$GET1^DIQ(44,CLINICIEN,1918.5,"I")
 S SCHEDONHOLIDAY=$S(SCHEDONHOLIDAY="Y":1,1:0)
 S STARTOFDAY=$$GET1^DIQ(44,CLINICIEN,1914,"I")
 S DIVNAME=$$GET1^DIQ(44,CLINICIEN,3.5,"E")
 I $G(STARTOFDAY)="" S STARTOFDAY=8
 S DISPINCPERHOUR=$$GET1^DIQ(44,CLINICIEN,1917,"I") ; formerly SI
 S HSI=$S('DISPINCPERHOUR:4,DISPINCPERHOUR<3:8/DISPINCPERHOUR,1:2)
 S SDSI=DISPINCPERHOUR
 S DISPINCPERHOUR=$S(DISPINCPERHOUR:DISPINCPERHOUR,1:4) ; formerly SDSI
 S DISPINCPERHOUR=$S(DISPINCPERHOUR=1:4,DISPINCPERHOUR=2:4,1:DISPINCPERHOUR)
 ; grab the hour before 'hour clinic display begins'
 S HOURBEFORESTART=STARTOFDAY-1/100
 ;
 ;
 ; build clinic specific report header
 D HEADER^SDES2REMAPUTIL(.CLINGBL,.CLINTMPCNT)
 ;
 ; code needed for SDDOW array
 ;Set beginning date to use for indefinite clinic availabilities
 F SDDAYOFWEEK=0:1:6 S SDDOW(SDDAYOFWEEK,9999999)="" ;SD*5.3*674
 S SDBEGO="" F SDDAY=0:1:6 S SDCNT=0 F  S SDCNT=$O(^SC(CLINICIEN,"T"_SDDAY,SDCNT)) Q:'SDCNT  S SDBEGO=SDBEGO_U_SDCNT
 S SDX=0 F  S SDX=$O(^SC(CLINICIEN,"T",SDX)) Q:'SDX!(SDX>ENDDATE)  S SDBEGZ=$O(^SC(CLINICIEN,"T"_$$DOW^XLFDT(SDX,1),9999999),-1) D  ;Add SDBEGZ to check for duplicate OST entry
 .I '$D(^SC(CLINICIEN,"OST",SDX))!(SDBEGO[SDX)!(SDBEGZ=0)!($G(^SC(CLINICIEN,"T"_$$DOW^XLFDT(SDX,1),9999999))=""&(SDBEGZ>0)) S SDBEG=$G(^SC(CLINICIEN,"T",SDX,0),SDX) S SDDOW($$DOW^XLFDT(SDBEG,1),SDBEG)="" ;SD*5.3*674 and SD*5.3*726
 S REMAPDATE=$$FMADD^XLFDT(STARTDATE,-1)
 S DONE=0
 F  D  Q:DONE
 .S REMAPDATE=$$FMADD^XLFDT(REMAPDATE,1)
 .I REMAPDATE>ENDDATE S DONE=1 Q
 .S ACTIVEAPPTS=$$ACTIVEAPPTS^SDES2REMAPUTIL(CLINICIEN,REMAPDATE,.FIRSTAPPTDTTM)
 .S AVAILABILITY=$$GET1^DIQ(44.005,REMAPDATE_","_CLINICIEN_",",1,"E")
 .S REMAPDAY=$$DOW^XLFDT(REMAPDATE,1)
 .S REMAPDAYNAME=$P("SUN^MON^TUES^WEDNES^THURS^FRI^SATUR",U,REMAPDAY+1)
 .S STDEFINED=$D(^SC(CLINICIEN,"ST",REMAPDATE))
 .; day doesn't match
 .I $D(^SC(CLINICIEN,"ST",REMAPDATE,1)),AVAILABILITY'[$E(REMAPDAYNAME,1,2)&(AVAILABILITY["]") D  Q
 ..D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME,"Bogus clinic day"_$S(ACTIVEAPPTS:"- Appts!",1:""))
 .; canceled this day
 .I $D(^SC(CLINICIEN,"ST",REMAPDATE,1)),AVAILABILITY["CANCEL"!($E(AVAILABILITY,$F(AVAILABILITY,"["),999)?."X") D  Q
 ..D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME,"Cancelled")
 .; update holiday schedule
 .I $D(^HOLIDAY(REMAPDATE,0)),'SCHEDONHOLIDAY D  Q
 ..I 'ACTIVEAPPTS D  Q
 ...D NOSCHHOLIDAY(CLINICIEN,REMAPDATE,ACTIVEAPPTS,.GBL,.CLINGBL,CLINICNAME,DIVNAME,.TMPCOUNT,.CLINTMPCNT,SCHEDONHOLIDAY,REMAPDAYNAME)
 ..D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME)
 .S SAVECAN=$G(^SC(CLINICIEN,"ST",REMAPDATE,"CAN"))
 .S FDA(44.005,REMAPDATE_","_CLINICIEN_",",.01)="@"
 .D FILE^DIE(,"FDA") K FDA
 .S PATTERNDATE=+$O(^SC(CLINICIEN,"T"_REMAPDAY,REMAPDATE))
 .;
 .; handle OST pattern
 .;
 .I $D(^SC(CLINICIEN,"OST",REMAPDATE,1)) D  Q
 ..S (SPECPATTERN,NEWPATTERN)=$$GET1^DIQ(44.0002,REMAPDATE_","_CLINICIEN_",",1,"E")
 ..I SPECPATTERN="" Q
 ..S PATTERNDATE=0
 ..; rebuild pattern and file
 ..D REBUILDPATTERN(CLINICIEN,.NEWPATTERN,SPECPATTERN,REMAPDATE,REMAPDAY,DISPINCPERHOUR,FIRSTAPPTDTTM,CLINAPPTLENGTH,HSI,SDSI,HOURBEFORESTART)
 ..D FILEPATTERN(CLINICIEN,NEWPATTERN,REMAPDATE,.SDDOW,PATTERNDATE,SAVECAN)
 ..I ACTIVEAPPTS D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME)
 .S PATTERNFILE=$S(REMAPDAY=0:44.06,REMAPDAY=1:44.07,REMAPDAY=2:44.08,REMAPDAY=3:44.09,REMAPDAY=4:44.008,REMAPDAY=5:44.009,REMAPDAY=6:44.0001,1:"")
 .I 'PATTERNFILE Q
 .S MASTERPATTERN=$$GET1^DIQ(PATTERNFILE,PATTERNDATE_","_CLINICIEN_",",1,"E")
 .I '$D(^SC(CLINICIEN,"T"_REMAPDAY,PATTERNDATE,1)) D  Q
 ..I ACTIVEAPPTS D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME)
 .;  no master pattern, and ST was originally defined, log and quit
 .I MASTERPATTERN="",STDEFINED D  Q
 ..D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME,"no master pattern for this day")
 .;  no master pattern, no availability, no original ST defined, no active appts, and no cancelled times, so just quit
 .I MASTERPATTERN="",AVAILABILITY="",'STDEFINED,'ACTIVEAPPTS,'$D(^SC(CLINICIEN,"S",REMAPDATE,"MES")) Q
 .; fall through for all other scenarios
 .S NEWPATTERN=$P("SU^MO^TU^WE^TH^FR^SA",U,REMAPDAY+1)_" "_$E(REMAPDATE,6,7)_$J("",DISPINCPERHOUR+DISPINCPERHOUR-6)_MASTERPATTERN_$J("",64-$L(MASTERPATTERN))
 .; No active appointments, and no cancelled times.. Build the ST subscript and quit
 .I 'ACTIVEAPPTS&('$D(^SC(CLINICIEN,"S",REMAPDATE,"MES"))) D  Q
 ..D FILEPATTERN(CLINICIEN,NEWPATTERN,REMAPDATE,.SDDOW,PATTERNDATE,SAVECAN)
 .D REBUILDPATTERN(CLINICIEN,.NEWPATTERN,MASTERPATTERN,REMAPDATE,REMAPDAY,DISPINCPERHOUR,FIRSTAPPTDTTM,CLINAPPTLENGTH,HSI,SDSI,HOURBEFORESTART)
 .D FILEPATTERN(CLINICIEN,NEWPATTERN,REMAPDATE,.SDDOW,PATTERNDATE,SAVECAN)
 .D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME)
 K @CLINGBL
 Q
 ;
REBUILDPATTERN(CLINICIEN,NEWPATTERN,MASTERPATTERN,REMAPDATE,REMAPDAY,DISPINCPERHOUR,FIRSTAPPTDTTM,CLINAPPTLENGTH,HSI,SDSI,HOURBEFORESTART)  ; Was 'I' in SDD0
 N STARTLOC,SLOTPOSITION,PTRNAPPTANDPAST,PTRNBEFOREAPPT,APPTIEN,APPTIENS,LENGTHOFAPPT,SDSLOT,INCREMENT,STR,STDATA,APPTDTTM
 S STR="{}&%?#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz"
 S APPTDTTM=FIRSTAPPTDTTM-.01
 F  S APPTDTTM=$O(^SC(CLINICIEN,"S",APPTDTTM)) Q:'APPTDTTM!($P(APPTDTTM,".")>REMAPDATE)  D
 .S STARTLOC=APPTDTTM#1  ; get remainder (hour of the appointment)
 .S STARTLOC=STARTLOC-HOURBEFORESTART*100 ; find the starting location (location of the first appointment)
 .; Calculate the position
 .S SLOTPOSITION=STARTLOC#1*DISPINCPERHOUR\.6+(STARTLOC\1*DISPINCPERHOUR)*2
 .S PTRNAPPTANDPAST=$E(NEWPATTERN,SLOTPOSITION,999)   ; FORMERLY SM
 .S PTRNBEFOREAPPT=$E(NEWPATTERN,1,SLOTPOSITION-1) ; FORMERLY S
 .;check for cancellations at this time
 .I $D(^SC(CLINICIEN,"S",APPTDTTM,"MES")) D  Q
 ..D CAN(CLINICIEN,APPTDTTM,.NEWPATTERN,PTRNBEFOREAPPT,PTRNAPPTANDPAST,STARTOFDAY,DISPINCPERHOUR)
 .; process appointment adjustments
 .S APPTIEN=0 F  S APPTIEN=$O(^SC(CLINICIEN,"S",APPTDTTM,1,APPTIEN)) Q:'APPTIEN  D
 ..S APPTIENS=APPTIEN_","_APPTDTTM_","_CLINICIEN
 ..Q:$$GET1^DIQ(44.003,APPTIENS,310,"I")="C"  ; ignore cancelled appointments
 ..Q:$D(^SC(CLINICIEN,"S",APPTDTTM,"MES"))
 ..; might be able to move this into the appointment date/time loop
 ..Q:+$E($P(APPTDTTM,".",2)_"000",1,4)<$S(STARTOFDAY>0:STARTOFDAY_"00",1:800)
 ..; LENGTHOFAPPT = SDSL
 ..S LENGTHOFAPPT=$$GET1^DIQ(44.003,APPTIENS,1,"I")
 ..S SDSLOT=LENGTHOFAPPT/CLINAPPTLENGTH*(CLINAPPTLENGTH\(60/SDSI))*HSI-HSI
 ..F INCREMENT=0:HSI:SDSLOT D
 ...S STDATA=$E(PTRNAPPTANDPAST,INCREMENT+2)
 ...I STDATA="" S STDATA=" "
 ...S PTRNAPPTANDPAST=$E(PTRNAPPTANDPAST,1,INCREMENT+2-1)_$S("{}&%?#"[STDATA:STDATA,1:$E(STR,$F(STR,STDATA)-2))_$E(PTRNAPPTANDPAST,INCREMENT+3,999)
 .S NEWPATTERN=PTRNBEFOREAPPT_PTRNAPPTANDPAST
 Q
 ;
CAN(CLINICIEN,APPTDTTM,NEWPATTERN,PTRNBEFOREAPPT,PTRNAPPTANDPAST,STARTOFDAY,DISPINCPERHOUR)  ;
 N APPTTIME,CANCELSTRTLOC,CANCELENDLOC,CANCELENDTIME,TEMPPATTERN,CHAR,LOOP,S,P,SDIF
 Q:'$D(^SC(CLINICIEN,"SDCAN",APPTDTTM,0))
 S APPTTIME=$E($P(APPTDTTM,".",2)_"0000",1,4)
 S TEMPPATTERN=PTRNBEFOREAPPT_PTRNAPPTANDPAST
 S CANCELSTRTLOC=$$TIMELOCATION(APPTTIME,STARTOFDAY,DISPINCPERHOUR)
 S CANCELENDTIME=$$GET1^DIQ(44.05,APPTDTTM_","_CLINICIEN_",",1)
 S CANCELENDLOC=$$TIMELOCATION(CANCELENDTIME,STARTOFDAY,DISPINCPERHOUR)
 S TEMPPATTERN=TEMPPATTERN_$J("",CANCELENDLOC-$L(TEMPPATTERN))
 S CHAR=""
 F LOOP=0:2:CANCELENDLOC D
 .S S=$E(TEMPPATTERN,LOOP+DISPINCPERHOUR+DISPINCPERHOUR)
 .S P=$S(LOOP<CANCELSTRTLOC:S_$E(TEMPPATTERN,LOOP+1+DISPINCPERHOUR+DISPINCPERHOUR),LOOP=CANCELENDLOC:$S(CHAR="[":CHAR,1:S)_$E(TEMPPATTERN,LOOP+1+DISPINCPERHOUR+DISPINCPERHOUR),1:$S(CHAR="["&(LOOP=CANCELSTRTLOC):"]",1:"X")_"X")
 .S CHAR=$S(S="]":"",S="[":S,1:CHAR)
 .S TEMPPATTERN=$E(TEMPPATTERN,1,LOOP-1+DISPINCPERHOUR+DISPINCPERHOUR)_P_$E(TEMPPATTERN,LOOP+2+DISPINCPERHOUR+DISPINCPERHOUR,999)
 I '$F(TEMPPATTERN,"[") D
 .S SDIF=$F(TEMPPATTERN,"X")
 .S TEMPPATTERN=$E(TEMPPATTERN,1,(SDIF-2))_"["_$E(TEMPPATTERN,SDIF,999)
 S NEWPATTERN=TEMPPATTERN
 Q
TIMELOCATION(TIME,STARTOFDAY,DISPINCPERHOUR) ;
 N MINUTES,INCREMENT
 S MINUTES=$E(TIME,3,4)
 S INCREMENT=TIME\100-STARTOFDAY*DISPINCPERHOUR+(MINUTES*DISPINCPERHOUR\60)*2
 Q INCREMENT
 ;
NOSCHHOLIDAY(CLINIEN,REMAPDATE,ACTIVEAPPTS,GBL,CLINGBL,CLINICNAME,DIVNAME,TMPCOUNT,CLINTMPCNT,SCHEDONHOLIDAY,REMAPDAYNAME) ;
 N HOLIDAYNAME,SCHEDIEN,FDA,FERR
 S HOLIDAYNAME=$$GET1^DIQ(40.5,REMAPDATE,2,"E")
 I 'ACTIVEAPPTS D  Q
 .I $D(^SC(CLINIEN,"ST",REMAPDATE)) D
 ..S FDA(44.005,REMAPDATE_","_CLINIEN_",",.01)=REMAPDATE
 ..S FDA(44.005,REMAPDATE_","_CLINIEN_",",1)="   "_$E(REMAPDATE,6,7)_"    "_HOLIDAYNAME
 ..D FILE^DIE(,"FDA","FERR") K FDA
 .I '$D(^SC(CLINIEN,"ST",REMAPDATE)) D
 ..S SCHEDIEN(1)=REMAPDATE
 ..S FDA(44.005,"+1,"_CLINIEN_",",.01)=REMAPDATE
 ..S FDA(44.005,"+1,"_CLINIEN_",",1)="   "_$E(REMAPDATE,6,7)_"    "_HOLIDAYNAME
 ..D UPDATE^DIE(,"FDA","SCHEDIEN","FERR")
 .I $D(FERR) D ERRLOG^SDES2JSON(.ERRORS,52,"Error filing holiday pattern. Clinic: "_CLINICNAME_" for remap date: "_$$FMTISO^SDAMUTDT(REMAPDATE)) Q
 .D EN^SDTMPHLC(CLINIEN,REMAPDATE,,"C",HOLIDAYNAME)
 .;D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME,HOLIDAYNAME_"- Inserted")
 D LOGDATA^SDES2REMAPUTIL(.GBL,.CLINGBL,.TMPCOUNT,.CLINTMPCNT,CLINICNAME,DIVNAME,REMAPDATE,SCHEDONHOLIDAY,ACTIVEAPPTS,REMAPDAYNAME,HOLIDAYNAME_"- Appts!")
 Q
FILEPATTERN(CLINIEN,PATTERN,REMAPDATE,SDDOW,PATTERNDATE,SAVECAN) ; reset ST subscript for remapdate
 N FDA,FDAIEN,FILERR
 I $L(PATTERN)>PATTERN,(REMAPDATE>=$O(SDDOW($$DOW^XLFDT(REMAPDATE,1),(REMAPDATE+1)),-1)&($O(SDDOW($$DOW^XLFDT(REMAPDATE,1),(REMAPDATE+1)),-1)))!($D(^SC(CLINIEN,"OST",REMAPDATE))) D
 .I $D(^SC(CLINIEN,"ST",REMAPDATE)) D  Q
 ..S FDA(44.005,REMAPDATE_","_CLINIEN_",",.01)=REMAPDATE
 ..S FDA(44.005,REMAPDATE_","_CLINIEN_",",1)=PATTERN
 ..I PATTERNDATE'>0 S FDA(44.005,REMAPDATE_","_CLINIEN_",",3)=REMAPDATE
 ..D FILE^DIE(,"FDA") K FDA
 ..I $G(SAVECAN)]"" S ^SC(CLINIEN,"ST",REMAPDATE,"CAN")=SAVECAN
 .I '$D(^SC(CLINIEN,"ST",REMAPDATE)) D
 ..S FDA(44.005,"+1,"_CLINIEN_",",.01)=REMAPDATE
 ..S FDA(44.005,"+1,"_CLINIEN_",",1)=PATTERN
 ..I PATTERNDATE'>0 S FDA(44.005,"+1,"_CLINIEN_",",3)=REMAPDATE
 ..S FDAIEN(1)=REMAPDATE
 ..D UPDATE^DIE(,"FDA","FDAIEN","FILERR")
 ..I $G(SAVECAN)]"" S ^SC(CLINIEN,"ST",REMAPDATE,"CAN")=SAVECAN
 Q