SDES2CRTCLNAVAL2 ;ALB/BLB,JDJ/BLB,JDJ,AGW,JDJ,AGW,AGW - SDES2 SET CLINIC AVAILABILITY ;MAY 21, 2026
;;5.3;Scheduling;**904,914,919,920,922,909,941,944,945**;Aug 13, 1993;Build 2
;;Per VHA Directive 6402, this routine should not be modified
; Reference to DUZ^XUP is supported by IA #7487
;
Q
;
CREATE(JSON,SDCONTEXT,AVAILABILITY) ;
N ERRORS,RETURNAVAIL,CLINICIEN,CLINICSTARTHOUR,NUMBEROFENTRIES,INPUTS,INDEFINITEUNTIL,SDDISPPERHR,SDCLINSTARTHR,SLOTSTOCANCEL,%,%DT
N DIIX,X
;
M INPUTS=AVAILABILITY
D VALCONTEXT^SDES2VALCONTEXT(.ERRORS,.SDCONTEXT)
I $D(ERRORS) S ERRORS("clinicAvailability")="" K CNT,I D BUILDJSON^SDES2JSON(.JSON,.ERRORS) Q
I $G(SDCONTEXT("USER DUZ"))'="" N DUZ D DUZ^XUP(SDCONTEXT("USER DUZ"))
D VALIDATE(.ERRORS,.AVAILABILITY,.CLINICIEN,.CLINICSTARTHOUR,.NUMBEROFENTRIES,.INPUTS)
I $D(ERRORS) S ERRORS("clinicAvailability")="" K CNT,I D BUILDJSON^SDES2JSON(.JSON,.ERRORS) Q
;
D CREATEAVAIL(.AVAILABILITY,.SDCONTEXT,.SLOTSTOCANCEL,CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1917,"I"),$$GET1^DIQ(44,CLINICIEN,1914,"I"),NUMBEROFENTRIES,.INPUTS,.INDEFINITEUNTIL,.RETURNAVAIL,.ERRORS)
;
I $L($G(SLOTSTOCANCEL("CancelledSlots",1,"BeginTime"))),$G(AVAILABILITY("KEEP CANCELLED SLOTS"))=1 D
.D RECANCELSLOTS(.SLOTSTOCANCEL,CLINICIEN,.SDCONTEXT) K SLOTSTOCANCEL
;
I '$D(RETURNAVAIL) S RETURNAVAIL("clinicAvailability")=""
D BUILDJSON^SDES2JSON(.JSON,.RETURNAVAIL)
K CNT,I
Q
;
CREATEAVAIL(AVAILABILITY,SDCONTEXT,SLOTSTOCANCEL,CLINICIEN,CLINICSTARTHOUR,SDDISPPERHR,SDCLINSTARTHR,NUMBEROFENTRIES,INPUTS,INDEFINITEUNTIL,RETURNAVAIL,ERRORS) ;
N TIMESLOTCNT,CNT,ENDDATE,DATES,TIMES,NUMBEROFSLOTS,SCHEDULEDDAYS,DATENEXTTIMESLOT,CANSLOTSENDDATE,DONE,SDRETURN,SDONE,J,SDSAV,SDST1,SM,SS,SEQ,%H,ENDATE,SB
;
S TIMESLOTCNT=0,DONE=0
F S TIMESLOTCNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT)) Q:'TIMESLOTCNT!(DONE=1) D
.;
.S CNT=0
.F S CNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)) Q:'CNT D
..I $G(SCHEDULEDDAYS)[$P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T") Q
..;
..D CREATEDATESTIMES(.DATES,.TIMES,.NUMBEROFSLOTS,.INPUTS,$P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"),NUMBEROFENTRIES,.SLOTSTOCANCEL)
..I $D(SLOTSTOCANCEL("Error")) M RETURNAVAIL=SLOTSTOCANCEL S DONE=1 Q
..;
..D CREATEAVAIL^SDES2UTIL1(.SDRETURN,CLINICIEN,$G(DATES),$G(TIMES),$G(NUMBEROFSLOTS),.INDEFINITEUNTIL)
..K DATES,TIMES,NUMBEROFSLOTS
..;
..S RETURNAVAIL("clinicAvailability",CNT,"Pattern")="Pattern Filed"
..I $G(INDEFINITEUNTIL) D
...S RETURNAVAIL("clinicAvailability",CNT,"DateIndefiniteScheduleEnds")=INDEFINITEUNTIL K INDEFINITEUNTIL
..S SCHEDULEDDAYS=$G(SCHEDULEDDAYS)_$P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")_U
Q
;
CREATEDATESTIMES(DATES,TIMES,NUMBEROFSLOTS,INPUTS,AVAILABILITYDATE,NUMBEROFENTRIES,SLOTSTOCANCEL) ;
N TIMESLOTCNT,CNT,SUBSCRIPT,STARTDATE,STARTTIME,ENDTIME,LASTTIMESLOTDATE,DONE,CANSLOTSENDDATE,DATENEXTTIMESLOT,TIME
;
S TIMESLOTCNT=0,DONE=0
F S TIMESLOTCNT=$O(INPUTS("TIMESLOT",TIMESLOTCNT)) Q:'TIMESLOTCNT!(DONE=1) D
.S CNT=0
.F S CNT=$O(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)) Q:'CNT D
..I $P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")'=AVAILABILITYDATE Q
..;
..I $G(INPUTS("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@" D Q
...S DATES=$G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))_$S($G(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)):";9999999",1:"")
...S NUMBEROFSLOTS=""
..S LASTTIMESLOTDATE=0,LASTTIMESLOTDATE=$O(DATES(LASTTIMESLOTDATE))
..I $G(LASTTIMESLOTDATE)=$$ISOTFM^SDAMUTDT($P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))!('$G(LASTTIMESLOTDATE)) D
...S DATES=$$ISOTFM^SDAMUTDT($P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))
...S TIMES=$G(TIMES)_$P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T",2)_"-"_$P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),"T",2)_";"
...S NUMBEROFSLOTS=$G(NUMBEROFSLOTS)_$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))_";"
..I $G(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)),'$D(DATES(9999999)) D
...S DATES=$G(DATES)_";9999999"
..S DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT($P($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))
..S CANSLOTSENDDATE=$S($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)):$$FMTISO^SDAMUTDT($$GETLASTINDEFDATE(CLINICIEN,DATENEXTTIMESLOT,$$GET1^DIQ(44,CLINICIEN,2002))),1:DATENEXTTIMESLOT)
..I $G(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)) D Q
...S DONE=0
...F D Q:DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT(CANSLOTSENDDATE)
....D GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)),CANSLOTSENDDATE,CNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
....S DATENEXTTIMESLOT=$$FMADD^XLFDT(DATENEXTTIMESLOT,7)
..;
..D GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)),CANSLOTSENDDATE,CNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
S TIMES=$E($G(TIMES),1,$L($G(TIMES))-1)
I $G(NUMBEROFSLOTS)'="" D
.S NUMBEROFSLOTS=$E($G(NUMBEROFSLOTS),1,$L($G(NUMBEROFSLOTS))-1)
Q
;
GETLASTINDEFDATE(CLINICIEN,DATE,MAXBOOKINGDAYS) ;
N FOUND,OSTDATE
;
S OSTDATE=DATE,FOUND=0
F D Q:FOUND!(OSTDATE>$$FMADD^XLFDT(DT,MAXBOOKINGDAYS))
.S OSTDATE=$$FMADD^XLFDT(OSTDATE,7)
.I $D(^SC(CLINICIEN,"OST",OSTDATE)) S FOUND=1
Q $G(OSTDATE)
;
RECANCELSLOTS(SLOTSTOCANCEL,CLINICIEN,SDCONTEXT) ;
N CNT,CANCEL,CANCELRETURN
;
S CNT=0
F S CNT=$O(SLOTSTOCANCEL("CancelledSlots",CNT)) Q:'CNT D
.S CANCEL("CLINIC IEN")=CLINICIEN
.S CANCEL("FULL PARTIAL FLAG")=$S($G(SLOTSTOCANCEL("CancelledSlots",CNT,"BeginTime"))["T":"P",1:"F")
.S CANCEL("START DATE TIME")=$G(SLOTSTOCANCEL("CancelledSlots",CNT,"BeginTime"))
.S CANCEL("END DATE TIME")=$G(SLOTSTOCANCEL("CancelledSlots",CNT,"EndTime"))
.D CANCEL^SDES2CANCLNAVAIL(.CANCELRETURN,.SDCONTEXT,.CANCEL)
Q
;
GETCANSLOTS(CLINICIEN,SLOTSTOCANCEL,INDEFINITE,ENDDATE,CNT,SCHEDULEDATE,INPUTS,SDCONTEXT) ;
N CANSLOTS,JSON,SLOTS,NUM,SLOTNUM
;
I $$GET1^DIQ(44.005,$$ISOTFM^SDAMUTDT(SCHEDULEDATE)_","_CLINICIEN_",",1,"I")["CANCELLED" D
.S NUM=(+($O(SLOTSTOCANCEL("CancelledSlots",""),-1))+1)
.S SLOTSTOCANCEL("CancelledSlots",NUM,"BeginTime")=SCHEDULEDATE
.S SLOTSTOCANCEL("CancelledSlots",NUM,"EndTime")=SCHEDULEDATE
;
S CANSLOTS("CLINICIEN")=CLINICIEN
S CANSLOTS("SDESSTART")=SCHEDULEDATE_"T"_"0001"_$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT(SCHEDULEDATE),CLINICIEN)
S CANSLOTS("SDESENDDATE")=SCHEDULEDATE_"T"_2359_$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT(SCHEDULEDATE),CLINICIEN)
D GETCANCSLOTS^SDES2GETCANSLOTS(.JSON,.SDCONTEXT,.CANSLOTS) K CANSLOTS
D DECODE^XLFJSON("JSON","SLOTS")
;
I $D(SLOTSTOCANCEL("CancelledSlots",1,"BeginTime")),$L($G(SLOTS("CancelledSlots",1,"BeginTime"))) D Q
.S NUM="",NUM=$O(SLOTSTOCANCEL("CancelledSlots",NUM),-1)
.S SLOTNUM=0
.F S SLOTNUM=$O(SLOTS("CancelledSlots",SLOTNUM)) Q:'SLOTNUM D
..S NUM=NUM+1
..S SLOTSTOCANCEL("CancelledSlots",NUM,"BeginTime")=$G(SLOTS("CancelledSlots",SLOTNUM,"BeginTime"))
..S SLOTSTOCANCEL("CancelledSlots",NUM,"EndTime")=$G(SLOTS("CancelledSlots",SLOTNUM,"EndTime"))
;
I $D(SLOTS("CancelledSlots",1,"BeginTime")) D
.M SLOTSTOCANCEL=SLOTS
;
S SCHEDULEDATE=$$FMADD^XLFDT(SCHEDULEDATE,7) K SLOTS
Q
;
VALIDATE(ERRORS,AVAILABILITY,CLINICIEN,CLINICSTARTHOUR,NUMBEROFENTRIES,INPUTS) ;
N FDATA,VAL,TIMESLOTCNT,DATETIMECNT
;
D VALFILEIEN^SDES2VALUTIL(.VAL,.ERRORS,44,$G(AVAILABILITY("CLINIC IEN")),1,,18,19)
I $D(ERRORS) Q
;
S CLINICIEN=$G(AVAILABILITY("CLINIC IEN"))
S CLINICSTARTHOUR=$$GET1^DIQ(44,CLINICIEN,1914,"I")
;
S NUMBEROFENTRIES=$O(AVAILABILITY("TIMESLOT",""),-1)
;
S TIMESLOTCNT=0
F S TIMESLOTCNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT)) Q:'TIMESLOTCNT D
.S DATETIMECNT=0
.F S DATETIMECNT=$O(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT)) Q:'DATETIMECNT D
..S INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT)=$TR($G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT)),":","")
..S INPUTS("TIMESLOT",TIMESLOTCNT,"END DATE TIME",DATETIMECNT)=$TR($G(INPUTS("TIMESLOT",TIMESLOTCNT,"END DATE TIME",DATETIMECNT)),":","")
;
I $L($G(AVAILABILITY("KEEP CANCELLED SLOTS"))) D
.I $G(AVAILABILITY("KEEP CANCELLED SLOTS"))'=1,$G(AVAILABILITY("KEEP CANCELLED SLOTS"))'=0 D ERRLOG^SDES2JSON(.ERRORS,656)
;
D VALFILEIEN^SDES2VALUTIL(.VAL,.ERRORS,44,CLINICIEN,1,,18,19)
D VALAPPTLENGTH(.ERRORS,$$GET1^DIQ(44,CLINICIEN,1912,"I"),CLINICIEN) Q:$D(ERRORS)
D VALSTARTHOUR^SDES2VAL44(.ERRORS,.CLINICSTARTHOUR)
D VALIDATEDATETIME(.ERRORS,CLINICIEN,.AVAILABILITY,NUMBEROFENTRIES)
D VALIDATESLOTS(.ERRORS,.AVAILABILITY)
D VALIDATEINDEF(.ERRORS,.AVAILABILITY)
D PATTERNLENGTH(.ERRORS,.AVAILABILITY,CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1917,"I"))
Q
;
VALIDATEINDEF(ERRORS,AVAILABILITY) ;
N TIMESLOTCNT,CNT
;
I '$D(AVAILABILITY("TIMESLOT",1,"INDEFINITE",1)) D ERRLOG^SDES2JSON(.ERRORS,592) Q
S TIMESLOTCNT=0
F S TIMESLOTCNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT)) Q:'TIMESLOTCNT!($D(ERRORS)) D
.;
.S CNT=0
.F S CNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)) Q:'CNT D
..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))="" D ERRLOG^SDES2JSON(.ERRORS,592) Q
..I '$D(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)) D ERRLOG^SDES2JSON(.ERRORS,592) Q
..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))'=1,$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))'=0 D ERRLOG^SDES2JSON(.ERRORS,591) Q
Q
;
VALAPPTLENGTH(ERRORS,LENGTH,CLINICIEN) ;
I LENGTH="" D ERRLOG^SDES2JSON(.ERRORS,115) Q
I ((LENGTH<10)!(LENGTH>240)) D ERRLOG^SDES2JSON(.ERRORS,116) Q
I (LENGTH#10'=0),(LENGTH#15'=0) D ERRLOG^SDES2JSON(.ERRORS,116) Q
Q
;
VALIDATESLOTS(ERRORS,AVAILABILITY) ;
;
N TIMESLOTCNT,CNT,ISEMDEPT
S ISEMDEPT=0
I $$GET1^DIQ(40.7,$$GET1^DIQ(44,CLINICIEN,8,"I"),1,"I")="130" S ISEMDEPT=1
I '$D(AVAILABILITY("TIMESLOT",1,"NUMBER OF SLOTS",1)) D ERRLOG^SDES2JSON(.ERRORS,309) Q
S TIMESLOTCNT=0
F S TIMESLOTCNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT)) Q:'TIMESLOTCNT!($D(ERRORS)) D
.S CNT=0
.F S CNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)) Q:'CNT D
..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@" Q
..I '$D(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT)) D ERRLOG^SDES2JSON(.ERRORS,309) Q
..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))=0,ISEMDEPT=1 Q
..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))<1!($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))>26) D ERRLOG^SDES2JSON(.ERRORS,125)
Q
;
VALIDATEDATETIME(ERRORS,CLINICIEN,AVAILABILITY,NUMBEROFENTRIES) ;
;
N CNT,TIMEZONEOFFSET,TIME,TIMESLOTCNT,INDEFINITE
I '$D(AVAILABILITY("TIMESLOT",1,"START DATE TIME",1)) D ERRLOG^SDES2JSON(.ERRORS,25) Q
I '$D(AVAILABILITY("TIMESLOT",1,"END DATE TIME",1)) D ERRLOG^SDES2JSON(.ERRORS,26) Q
S TIMESLOTCNT=0
F S TIMESLOTCNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT)) Q:'TIMESLOTCNT!($D(ERRORS)) D
.S CNT=0
.F S CNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)) Q:'CNT!($D(ERRORS)) D
..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@" Q
..I $L($P($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T",2),"-",2))!($L($P($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),"T",2),"-",2))) D ERRLOG^SDES2JSON(.ERRORS,590) Q
..S TIMEZONEOFFSET=$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")),CLINICIEN)
..S AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)=$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))_TIMEZONEOFFSET
..S AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)=$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT))_TIMEZONEOFFSET
..D VALISODATERANGE^SDES2VALISODTTM(.ERRORS,$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),1,CLINICIEN)
..S AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)=$$ISOTFM^SDAMUTDT($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),CLINICIEN)
..S AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)=$$ISOTFM^SDAMUTDT($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),CLINICIEN)
..I AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)=-1 Q
..I AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)=-1 Q
..I $P(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT),".",2)=$P(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT),".",2) D ERRLOG^SDES2JSON(.ERRORS,52,"End time cannot be equal to start time") Q
..S INDEFINITE=$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))
..I '$G(INDEFINITE),$$FMDIFF^XLFDT(DT,$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)))>14 D ERRLOG^SDES2JSON(.ERRORS,655) Q
..I $G(INDEFINITE),$G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))<DT D ERRLOG^SDES2JSON(.ERRORS,71) Q
..I $$GET1^DIQ(44,CLINICIEN,1914,"I")*100>+$E($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),".",2)_"0000",1,4) D ERRLOG^SDES2JSON(.ERRORS,581) Q
..I '$$CHECKDURATION^SDES2UTIL1($E($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),".",2)_"000",1,4),$E($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),".",2)_"000",1,4),$$GET1^DIQ(44,CLINICIEN,1912,"I")) D Q
... D ERRLOG^SDES2JSON(.ERRORS,582)
..I $$INACTIVE^SDESUTIL(CLINICIEN,$P($G(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),".")) D ERRLOG^SDES2JSON(.ERRORS,583) Q
Q
;
PATTERNLENGTH(ERRORS,AVAILABILTY,CLINICIEN,STARTTIME,INCREMENT) ;
;
N ENDTIME,ENDTIME1,CNT,CNT1,PATTERNLENGTH,I,XX,INCFLAG
S CNT=0,ENDTIME1=0,STARTTIME=STARTTIME*100,INCFLAG=0
F S CNT=$O(AVAILABILITY("TIMESLOT",CNT)) Q:((CNT="")!(CNT]99999)!($D(ERRORS))) D
.S CNT1=0,ENDTIME=0
.F S CNT1=$O(AVAILABILITY("TIMESLOT",CNT,"END DATE TIME",CNT1)) Q:((CNT1="")!(CNT1]99999)!($D(ERRORS))) D
..S ENDTIME1=(($P($G(AVAILABILITY("TIMESLOT",CNT,"END DATE TIME",CNT1)),".",2)))
..Q:(ENDTIME1'?1.4N)
..S XX=$L(ENDTIME1),ENDTIME1=$S(XX=1:ENDTIME1_"000",XX=2:ENDTIME1_"00",XX=3:ENDTIME1_"0",1:ENDTIME1)
..S ENDTIME1=+ENDTIME1
..S:(ENDTIME1>ENDTIME) ENDTIME=ENDTIME1
..Q
.S:INCREMENT'>2 INCREMENT=4,INCFLAG=1
.S PATTERNLENGTH=(INCREMENT*2)*((ENDTIME\100*60)+(ENDTIME#100)-(STARTTIME\100*60)+(STARTTIME#100))/60+(INCREMENT*2)+($S((INCREMENT>2)&('($G(INCFLAG))):2,1:0))
.D:(PATTERNLENGTH>80) ERRLOG^SDES2JSON(.ERRORS,657)
.Q
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDES2CRTCLNAVAL2 14787 printed Jul 22, 2026@16:02:13 Page 2
SDES2CRTCLNAVAL2 ;ALB/BLB,JDJ/BLB,JDJ,AGW,JDJ,AGW,AGW - SDES2 SET CLINIC AVAILABILITY ;MAY 21, 2026
+1 ;;5.3;Scheduling;**904,914,919,920,922,909,941,944,945**;Aug 13, 1993;Build 2
+2 ;;Per VHA Directive 6402, this routine should not be modified
+3 ; Reference to DUZ^XUP is supported by IA #7487
+4 ;
+5 QUIT
+6 ;
CREATE(JSON,SDCONTEXT,AVAILABILITY) ;
+1 NEW ERRORS,RETURNAVAIL,CLINICIEN,CLINICSTARTHOUR,NUMBEROFENTRIES,INPUTS,INDEFINITEUNTIL,SDDISPPERHR,SDCLINSTARTHR,SLOTSTOCANCEL,%,%DT
+2 NEW DIIX,X
+3 ;
+4 MERGE INPUTS=AVAILABILITY
+5 DO VALCONTEXT^SDES2VALCONTEXT(.ERRORS,.SDCONTEXT)
+6 IF $DATA(ERRORS)
SET ERRORS("clinicAvailability")=""
KILL CNT,I
DO BUILDJSON^SDES2JSON(.JSON,.ERRORS)
QUIT
+7 IF $GET(SDCONTEXT("USER DUZ"))'=""
NEW DUZ
DO DUZ^XUP(SDCONTEXT("USER DUZ"))
+8 DO VALIDATE(.ERRORS,.AVAILABILITY,.CLINICIEN,.CLINICSTARTHOUR,.NUMBEROFENTRIES,.INPUTS)
+9 IF $DATA(ERRORS)
SET ERRORS("clinicAvailability")=""
KILL CNT,I
DO BUILDJSON^SDES2JSON(.JSON,.ERRORS)
QUIT
+10 ;
+11 DO CREATEAVAIL(.AVAILABILITY,.SDCONTEXT,.SLOTSTOCANCEL,CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1917,"I"),$$GET1^DIQ(44,CLINICIEN,1914,"I"),NUMBEROFENTRIES,.INPUTS,.INDEFINITEUNTIL,.RETURNAVAIL,.ERRORS)
+12 ;
+13 IF $LENGTH($GET(SLOTSTOCANCEL("CancelledSlots",1,"BeginTime")))
IF $GET(AVAILABILITY("KEEP CANCELLED SLOTS"))=1
Begin DoDot:1
+14 DO RECANCELSLOTS(.SLOTSTOCANCEL,CLINICIEN,.SDCONTEXT)
KILL SLOTSTOCANCEL
End DoDot:1
+15 ;
+16 IF '$DATA(RETURNAVAIL)
SET RETURNAVAIL("clinicAvailability")=""
+17 DO BUILDJSON^SDES2JSON(.JSON,.RETURNAVAIL)
+18 KILL CNT,I
+19 QUIT
+20 ;
CREATEAVAIL(AVAILABILITY,SDCONTEXT,SLOTSTOCANCEL,CLINICIEN,CLINICSTARTHOUR,SDDISPPERHR,SDCLINSTARTHR,NUMBEROFENTRIES,INPUTS,INDEFINITEUNTIL,RETURNAVAIL,ERRORS) ;
+1 NEW TIMESLOTCNT,CNT,ENDDATE,DATES,TIMES,NUMBEROFSLOTS,SCHEDULEDDAYS,DATENEXTTIMESLOT,CANSLOTSENDDATE,DONE,SDRETURN,SDONE,J,SDSAV,SDST1,SM,SS,SEQ,%H,ENDATE,SB
+2 ;
+3 SET TIMESLOTCNT=0
SET DONE=0
+4 FOR
SET TIMESLOTCNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT))
if 'TIMESLOTCNT!(DONE=1)
QUIT
Begin DoDot:1
+5 ;
+6 SET CNT=0
+7 FOR
SET CNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
if 'CNT
QUIT
Begin DoDot:2
+8 IF $GET(SCHEDULEDDAYS)[$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")
QUIT
+9 ;
+10 DO CREATEDATESTIMES(.DATES,.TIMES,.NUMBEROFSLOTS,.INPUTS,$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"),NUMBEROFENTRIES,.SLOTSTOCANCEL)
+11 IF $DATA(SLOTSTOCANCEL("Error"))
MERGE RETURNAVAIL=SLOTSTOCANCEL
SET DONE=1
QUIT
+12 ;
+13 DO CREATEAVAIL^SDES2UTIL1(.SDRETURN,CLINICIEN,$GET(DATES),$GET(TIMES),$GET(NUMBEROFSLOTS),.INDEFINITEUNTIL)
+14 KILL DATES,TIMES,NUMBEROFSLOTS
+15 ;
+16 SET RETURNAVAIL("clinicAvailability",CNT,"Pattern")="Pattern Filed"
+17 IF $GET(INDEFINITEUNTIL)
Begin DoDot:3
+18 SET RETURNAVAIL("clinicAvailability",CNT,"DateIndefiniteScheduleEnds")=INDEFINITEUNTIL
KILL INDEFINITEUNTIL
End DoDot:3
+19 SET SCHEDULEDDAYS=$GET(SCHEDULEDDAYS)_$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")_U
End DoDot:2
End DoDot:1
+20 QUIT
+21 ;
CREATEDATESTIMES(DATES,TIMES,NUMBEROFSLOTS,INPUTS,AVAILABILITYDATE,NUMBEROFENTRIES,SLOTSTOCANCEL) ;
+1 NEW TIMESLOTCNT,CNT,SUBSCRIPT,STARTDATE,STARTTIME,ENDTIME,LASTTIMESLOTDATE,DONE,CANSLOTSENDDATE,DATENEXTTIMESLOT,TIME
+2 ;
+3 SET TIMESLOTCNT=0
SET DONE=0
+4 FOR
SET TIMESLOTCNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCNT))
if 'TIMESLOTCNT!(DONE=1)
QUIT
Begin DoDot:1
+5 SET CNT=0
+6 FOR
SET CNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
if 'CNT
QUIT
Begin DoDot:2
+7 IF $PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")'=AVAILABILITYDATE
QUIT
+8 ;
+9 IF $GET(INPUTS("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@"
Begin DoDot:3
+10 SET DATES=$GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))_$SELECT($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)):";9999999",1:"")
+11 SET NUMBEROFSLOTS=""
End DoDot:3
QUIT
+12 SET LASTTIMESLOTDATE=0
SET LASTTIMESLOTDATE=$ORDER(DATES(LASTTIMESLOTDATE))
+13 IF $GET(LASTTIMESLOTDATE)=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))!('$GET(LASTTIMESLOTDATE))
Begin DoDot:3
+14 SET DATES=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))
+15 SET TIMES=$GET(TIMES)_$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T",2)_"-"_$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),"T",2)_";"
+16 SET NUMBEROFSLOTS=$GET(NUMBEROFSLOTS)_$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))_";"
End DoDot:3
+17 IF $GET(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))
IF '$DATA(DATES(9999999))
Begin DoDot:3
+18 SET DATES=$GET(DATES)_";9999999"
End DoDot:3
+19 SET DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))
+20 SET CANSLOTSENDDATE=$SELECT($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)):$$FMTISO^SDAMUTDT($$GETLASTINDEFDATE(CLINICIEN,DATENEXTTIMESLOT,$$GET1^DIQ(44,CLINICIEN,2002))),1:DATENEXTTIMESLOT)
+21 IF $GET(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))
Begin DoDot:3
+22 SET DONE=0
+23 FOR
Begin DoDot:4
+24 DO GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)),CANSLOTSENDDATE,CNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
+25 SET DATENEXTTIMESLOT=$$FMADD^XLFDT(DATENEXTTIMESLOT,7)
End DoDot:4
if DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT(CANSLOTSENDDATE)
QUIT
End DoDot:3
QUIT
+26 ;
+27 DO GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)),CANSLOTSENDDATE,CNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
End DoDot:2
End DoDot:1
+28 SET TIMES=$EXTRACT($GET(TIMES),1,$LENGTH($GET(TIMES))-1)
+29 IF $GET(NUMBEROFSLOTS)'=""
Begin DoDot:1
+30 SET NUMBEROFSLOTS=$EXTRACT($GET(NUMBEROFSLOTS),1,$LENGTH($GET(NUMBEROFSLOTS))-1)
End DoDot:1
+31 QUIT
+32 ;
GETLASTINDEFDATE(CLINICIEN,DATE,MAXBOOKINGDAYS) ;
+1 NEW FOUND,OSTDATE
+2 ;
+3 SET OSTDATE=DATE
SET FOUND=0
+4 FOR
Begin DoDot:1
+5 SET OSTDATE=$$FMADD^XLFDT(OSTDATE,7)
+6 IF $DATA(^SC(CLINICIEN,"OST",OSTDATE))
SET FOUND=1
End DoDot:1
if FOUND!(OSTDATE>$$FMADD^XLFDT(DT,MAXBOOKINGDAYS))
QUIT
+7 QUIT $GET(OSTDATE)
+8 ;
RECANCELSLOTS(SLOTSTOCANCEL,CLINICIEN,SDCONTEXT) ;
+1 NEW CNT,CANCEL,CANCELRETURN
+2 ;
+3 SET CNT=0
+4 FOR
SET CNT=$ORDER(SLOTSTOCANCEL("CancelledSlots",CNT))
if 'CNT
QUIT
Begin DoDot:1
+5 SET CANCEL("CLINIC IEN")=CLINICIEN
+6 SET CANCEL("FULL PARTIAL FLAG")=$SELECT($GET(SLOTSTOCANCEL("CancelledSlots",CNT,"BeginTime"))["T":"P",1:"F")
+7 SET CANCEL("START DATE TIME")=$GET(SLOTSTOCANCEL("CancelledSlots",CNT,"BeginTime"))
+8 SET CANCEL("END DATE TIME")=$GET(SLOTSTOCANCEL("CancelledSlots",CNT,"EndTime"))
+9 DO CANCEL^SDES2CANCLNAVAIL(.CANCELRETURN,.SDCONTEXT,.CANCEL)
End DoDot:1
+10 QUIT
+11 ;
GETCANSLOTS(CLINICIEN,SLOTSTOCANCEL,INDEFINITE,ENDDATE,CNT,SCHEDULEDATE,INPUTS,SDCONTEXT) ;
+1 NEW CANSLOTS,JSON,SLOTS,NUM,SLOTNUM
+2 ;
+3 IF $$GET1^DIQ(44.005,$$ISOTFM^SDAMUTDT(SCHEDULEDATE)_","_CLINICIEN_",",1,"I")["CANCELLED"
Begin DoDot:1
+4 SET NUM=(+($ORDER(SLOTSTOCANCEL("CancelledSlots",""),-1))+1)
+5 SET SLOTSTOCANCEL("CancelledSlots",NUM,"BeginTime")=SCHEDULEDATE
+6 SET SLOTSTOCANCEL("CancelledSlots",NUM,"EndTime")=SCHEDULEDATE
End DoDot:1
+7 ;
+8 SET CANSLOTS("CLINICIEN")=CLINICIEN
+9 SET CANSLOTS("SDESSTART")=SCHEDULEDATE_"T"_"0001"_$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT(SCHEDULEDATE),CLINICIEN)
+10 SET CANSLOTS("SDESENDDATE")=SCHEDULEDATE_"T"_2359_$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT(SCHEDULEDATE),CLINICIEN)
+11 DO GETCANCSLOTS^SDES2GETCANSLOTS(.JSON,.SDCONTEXT,.CANSLOTS)
KILL CANSLOTS
+12 DO DECODE^XLFJSON("JSON","SLOTS")
+13 ;
+14 IF $DATA(SLOTSTOCANCEL("CancelledSlots",1,"BeginTime"))
IF $LENGTH($GET(SLOTS("CancelledSlots",1,"BeginTime")))
Begin DoDot:1
+15 SET NUM=""
SET NUM=$ORDER(SLOTSTOCANCEL("CancelledSlots",NUM),-1)
+16 SET SLOTNUM=0
+17 FOR
SET SLOTNUM=$ORDER(SLOTS("CancelledSlots",SLOTNUM))
if 'SLOTNUM
QUIT
Begin DoDot:2
+18 SET NUM=NUM+1
+19 SET SLOTSTOCANCEL("CancelledSlots",NUM,"BeginTime")=$GET(SLOTS("CancelledSlots",SLOTNUM,"BeginTime"))
+20 SET SLOTSTOCANCEL("CancelledSlots",NUM,"EndTime")=$GET(SLOTS("CancelledSlots",SLOTNUM,"EndTime"))
End DoDot:2
End DoDot:1
QUIT
+21 ;
+22 IF $DATA(SLOTS("CancelledSlots",1,"BeginTime"))
Begin DoDot:1
+23 MERGE SLOTSTOCANCEL=SLOTS
End DoDot:1
+24 ;
+25 SET SCHEDULEDATE=$$FMADD^XLFDT(SCHEDULEDATE,7)
KILL SLOTS
+26 QUIT
+27 ;
VALIDATE(ERRORS,AVAILABILITY,CLINICIEN,CLINICSTARTHOUR,NUMBEROFENTRIES,INPUTS) ;
+1 NEW FDATA,VAL,TIMESLOTCNT,DATETIMECNT
+2 ;
+3 DO VALFILEIEN^SDES2VALUTIL(.VAL,.ERRORS,44,$GET(AVAILABILITY("CLINIC IEN")),1,,18,19)
+4 IF $DATA(ERRORS)
QUIT
+5 ;
+6 SET CLINICIEN=$GET(AVAILABILITY("CLINIC IEN"))
+7 SET CLINICSTARTHOUR=$$GET1^DIQ(44,CLINICIEN,1914,"I")
+8 ;
+9 SET NUMBEROFENTRIES=$ORDER(AVAILABILITY("TIMESLOT",""),-1)
+10 ;
+11 SET TIMESLOTCNT=0
+12 FOR
SET TIMESLOTCNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT))
if 'TIMESLOTCNT
QUIT
Begin DoDot:1
+13 SET DATETIMECNT=0
+14 FOR
SET DATETIMECNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT))
if 'DATETIMECNT
QUIT
Begin DoDot:2
+15 SET INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT)=$TRANSLATE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT)),":","")
+16 SET INPUTS("TIMESLOT",TIMESLOTCNT,"END DATE TIME",DATETIMECNT)=$TRANSLATE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"END DATE TIME",DATETIMECNT)),":","")
End DoDot:2
End DoDot:1
+17 ;
+18 IF $LENGTH($GET(AVAILABILITY("KEEP CANCELLED SLOTS")))
Begin DoDot:1
+19 IF $GET(AVAILABILITY("KEEP CANCELLED SLOTS"))'=1
IF $GET(AVAILABILITY("KEEP CANCELLED SLOTS"))'=0
DO ERRLOG^SDES2JSON(.ERRORS,656)
End DoDot:1
+20 ;
+21 DO VALFILEIEN^SDES2VALUTIL(.VAL,.ERRORS,44,CLINICIEN,1,,18,19)
+22 DO VALAPPTLENGTH(.ERRORS,$$GET1^DIQ(44,CLINICIEN,1912,"I"),CLINICIEN)
if $DATA(ERRORS)
QUIT
+23 DO VALSTARTHOUR^SDES2VAL44(.ERRORS,.CLINICSTARTHOUR)
+24 DO VALIDATEDATETIME(.ERRORS,CLINICIEN,.AVAILABILITY,NUMBEROFENTRIES)
+25 DO VALIDATESLOTS(.ERRORS,.AVAILABILITY)
+26 DO VALIDATEINDEF(.ERRORS,.AVAILABILITY)
+27 DO PATTERNLENGTH(.ERRORS,.AVAILABILITY,CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1917,"I"))
+28 QUIT
+29 ;
VALIDATEINDEF(ERRORS,AVAILABILITY) ;
+1 NEW TIMESLOTCNT,CNT
+2 ;
+3 IF '$DATA(AVAILABILITY("TIMESLOT",1,"INDEFINITE",1))
DO ERRLOG^SDES2JSON(.ERRORS,592)
QUIT
+4 SET TIMESLOTCNT=0
+5 FOR
SET TIMESLOTCNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT))
if 'TIMESLOTCNT!($DATA(ERRORS))
QUIT
Begin DoDot:1
+6 ;
+7 SET CNT=0
+8 FOR
SET CNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
if 'CNT
QUIT
Begin DoDot:2
+9 IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))=""
DO ERRLOG^SDES2JSON(.ERRORS,592)
QUIT
+10 IF '$DATA(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))
DO ERRLOG^SDES2JSON(.ERRORS,592)
QUIT
+11 IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))'=1
IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))'=0
DO ERRLOG^SDES2JSON(.ERRORS,591)
QUIT
End DoDot:2
End DoDot:1
+12 QUIT
+13 ;
VALAPPTLENGTH(ERRORS,LENGTH,CLINICIEN) ;
+1 IF LENGTH=""
DO ERRLOG^SDES2JSON(.ERRORS,115)
QUIT
+2 IF ((LENGTH<10)!(LENGTH>240))
DO ERRLOG^SDES2JSON(.ERRORS,116)
QUIT
+3 IF (LENGTH#10'=0)
IF (LENGTH#15'=0)
DO ERRLOG^SDES2JSON(.ERRORS,116)
QUIT
+4 QUIT
+5 ;
VALIDATESLOTS(ERRORS,AVAILABILITY) ;
+1 ;
+2 NEW TIMESLOTCNT,CNT,ISEMDEPT
+3 SET ISEMDEPT=0
+4 IF $$GET1^DIQ(40.7,$$GET1^DIQ(44,CLINICIEN,8,"I"),1,"I")="130"
SET ISEMDEPT=1
+5 IF '$DATA(AVAILABILITY("TIMESLOT",1,"NUMBER OF SLOTS",1))
DO ERRLOG^SDES2JSON(.ERRORS,309)
QUIT
+6 SET TIMESLOTCNT=0
+7 FOR
SET TIMESLOTCNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT))
if 'TIMESLOTCNT!($DATA(ERRORS))
QUIT
Begin DoDot:1
+8 SET CNT=0
+9 FOR
SET CNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
if 'CNT
QUIT
Begin DoDot:2
+10 IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@"
QUIT
+11 IF '$DATA(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))
DO ERRLOG^SDES2JSON(.ERRORS,309)
QUIT
+12 IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))=0
IF ISEMDEPT=1
QUIT
+13 IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))<1!($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))>26)
DO ERRLOG^SDES2JSON(.ERRORS,125)
End DoDot:2
End DoDot:1
+14 QUIT
+15 ;
VALIDATEDATETIME(ERRORS,CLINICIEN,AVAILABILITY,NUMBEROFENTRIES) ;
+1 ;
+2 NEW CNT,TIMEZONEOFFSET,TIME,TIMESLOTCNT,INDEFINITE
+3 IF '$DATA(AVAILABILITY("TIMESLOT",1,"START DATE TIME",1))
DO ERRLOG^SDES2JSON(.ERRORS,25)
QUIT
+4 IF '$DATA(AVAILABILITY("TIMESLOT",1,"END DATE TIME",1))
DO ERRLOG^SDES2JSON(.ERRORS,26)
QUIT
+5 SET TIMESLOTCNT=0
+6 FOR
SET TIMESLOTCNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT))
if 'TIMESLOTCNT!($DATA(ERRORS))
QUIT
Begin DoDot:1
+7 SET CNT=0
+8 FOR
SET CNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
if 'CNT!($DATA(ERRORS))
QUIT
Begin DoDot:2
+9 IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@"
QUIT
+10 IF $LENGTH($PIECE($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T",2),"-",2))!($LENGTH($PIECE($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),"T",2),"-",2)))
DO ERRLOG^SDES2JSON(.ERRORS,590)
QUIT
+11 SET TIMEZONEOFFSET=$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")),CLINICIEN)
+12 SET AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)=$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))_TIMEZONEOFFSET
+13 SET AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)=$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT))_TIMEZONEOFFSET
+14 DO VALISODATERANGE^SDES2VALISODTTM(.ERRORS,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),1,CLINICIEN)
+15 SET AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)=$$ISOTFM^SDAMUTDT($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),CLINICIEN)
+16 SET AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)=$$ISOTFM^SDAMUTDT($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),CLINICIEN)
+17 IF AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)=-1
QUIT
+18 IF AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)=-1
QUIT
+19 IF $PIECE(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT),".",2)=$PIECE(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT),".",2)
DO ERRLOG^SDES2JSON(.ERRORS,52,"End time cannot be equal to start time")
QUIT
+20 SET INDEFINITE=$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))
+21 IF '$GET(INDEFINITE)
IF $$FMDIFF^XLFDT(DT,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)))>14
DO ERRLOG^SDES2JSON(.ERRORS,655)
QUIT
+22 IF $GET(INDEFINITE)
IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))<DT
DO ERRLOG^SDES2JSON(.ERRORS,71)
QUIT
+23 IF $$GET1^DIQ(44,CLINICIEN,1914,"I")*100>+$EXTRACT($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),".",2)_"0000",1,4)
DO ERRLOG^SDES2JSON(.ERRORS,581)
QUIT
+24 IF '$$CHECKDURATION^SDES2UTIL1($EXTRACT($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),".",2)_"000",1,4),...
... $EXTRACT($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"END DATE TIME",CNT)),".",2)_"000",1,4),$$GET1^DIQ(44,CLINICIEN,1912,"I"))
Begin DoDot:3
+25 DO ERRLOG^SDES2JSON(.ERRORS,582)
End DoDot:3
QUIT
+26 IF $$INACTIVE^SDESUTIL(CLINICIEN,$PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"."))
DO ERRLOG^SDES2JSON(.ERRORS,583)
QUIT
End DoDot:2
End DoDot:1
+27 QUIT
+28 ;
PATTERNLENGTH(ERRORS,AVAILABILTY,CLINICIEN,STARTTIME,INCREMENT) ;
+1 ;
+2 NEW ENDTIME,ENDTIME1,CNT,CNT1,PATTERNLENGTH,I,XX,INCFLAG
+3 SET CNT=0
SET ENDTIME1=0
SET STARTTIME=STARTTIME*100
SET INCFLAG=0
+4 FOR
SET CNT=$ORDER(AVAILABILITY("TIMESLOT",CNT))
if ((CNT="")!(CNT]99999)!($DATA(ERRORS)))
QUIT
Begin DoDot:1
+5 SET CNT1=0
SET ENDTIME=0
+6 FOR
SET CNT1=$ORDER(AVAILABILITY("TIMESLOT",CNT,"END DATE TIME",CNT1))
if ((CNT1="")!(CNT1]99999)!($DATA(ERRORS)))
QUIT
Begin DoDot:2
+7 SET ENDTIME1=(($PIECE($GET(AVAILABILITY("TIMESLOT",CNT,"END DATE TIME",CNT1)),".",2)))
+8 if (ENDTIME1'?1.4N)
QUIT
+9 SET XX=$LENGTH(ENDTIME1)
SET ENDTIME1=$SELECT(XX=1:ENDTIME1_"000",XX=2:ENDTIME1_"00",XX=3:ENDTIME1_"0",1:ENDTIME1)
+10 SET ENDTIME1=+ENDTIME1
+11 if (ENDTIME1>ENDTIME)
SET ENDTIME=ENDTIME1
+12 QUIT
End DoDot:2
+13 if INCREMENT'>2
SET INCREMENT=4
SET INCFLAG=1
+14 SET PATTERNLENGTH=(INCREMENT*2)*((ENDTIME\100*60)+(ENDTIME#100)-(STARTTIME\100*60)+(STARTTIME#100))/60+(INCREMENT*2)+($SELECT((INCREMENT>2)&('($GET(INCFLAG))):2,1:0))
+15 if (PATTERNLENGTH>80)
DO ERRLOG^SDES2JSON(.ERRORS,657)
+16 QUIT
End DoDot:1
+17 QUIT