SDES2CRTCLNAVAL2 ;ALB/BLB,JDJ/BLB - SDES2 SET CLINIC AVAILABILITY ;JUN 06, 2025
 ;;5.3;Scheduling;**904,914**;Aug 13, 1993;Build 1
 ;;Per VHA Directive 6402, this routine should not be modified
 ;
 Q
 ;
CREATE(JSON,SDCONTEXT,AVAILABILITY) ;
 N ERRORS,RETURNAVAIL,CLINICIEN,CLINICSTARTHOUR,NUMBEROFENTRIES,INPUTS,INDEFINITEUNTIL,SDDISPPERHR,SDCLINSTARTHR,SLOTSTOCANCEL,%,%DT
 ;
 M INPUTS=AVAILABILITY
 D VALIDATE(.ERRORS,.AVAILABILITY,.CLINICIEN,.CLINICSTARTHOUR,.NUMBEROFENTRIES,.INPUTS)
 I $D(ERRORS) S ERRORS("clinicAvailability")="" K COUNT,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"))) D
 .D RECANCELSLOTS(.SLOTSTOCANCEL,CLINICIEN,.SDCONTEXT) K SLOTSTOCANCEL
 ;
 I '$D(RETURNAVAIL) S RETURNAVAIL("clinicAvailability")=""
 D BUILDJSON^SDES2JSON(.JSON,.RETURNAVAIL)
 K COUNT,I
 Q
 ;
CREATEAVAIL(AVAILABILITY,SDCONTEXT,SLOTSTOCANCEL,CLINICIEN,CLINICSTARTHOUR,SDDISPPERHR,SDCLINSTARTHR,NUMBEROFENTRIES,INPUTS,INDEFINITEUNTIL,RETURNAVAIL,ERRORS) ;
 N TIMESLOTCOUNT,COUNT,ENDDATE,DATES,TIMES,SCHEDULEDDAYS,DATENEXTTIMESLOT,CANSLOTSENDDATE,DONE,SDRETURN,SDONE,J,SDSAV,SDST1,SM,SS,SEQ,%H,ENDATE,SB
 ;
 S TIMESLOTCOUNT=0,DONE=0
 F  S TIMESLOTCOUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT)) Q:'TIMESLOTCOUNT!(DONE=1)  D
 .;
 .S COUNT=0
 .F  S COUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)) Q:'COUNT  D
 ..I $G(SCHEDULEDDAYS)[$P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T") Q
 ..;
 ..D CREATEDATESTIMES(.DATES,.TIMES,.INPUTS,$P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"),NUMBEROFENTRIES,.SLOTSTOCANCEL)
 ..I $D(SLOTSTOCANCEL("Error")) M RETURNAVAIL=SLOTSTOCANCEL S DONE=1 Q
 ..D CREATE^SDES2UTIL1(CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1912,"I"),$$DOW^XLFDT($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"."),1),.INDEFINITEUNTIL,.DATES,.TIMES,SDDISPPERHR,.SDRETURN,.ERRORS)
 ..K DATES,TIMES
 ..;
 ..S RETURNAVAIL("clinicAvailability",COUNT,"Pattern")="Pattern Filed"
 ..I $G(INDEFINITEUNTIL) D
 ...S RETURNAVAIL("clinicAvailability",COUNT,"DateIndefiniteScheduleEnds")=INDEFINITEUNTIL K INDEFINITEUNTIL
 ..S SCHEDULEDDAYS=$G(SCHEDULEDDAYS)_$P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T")_U
 Q
 ;
CREATEDATESTIMES(DATES,TIMES,INPUTS,AVAILABILITYDATE,NUMBEROFENTRIES,SLOTSTOCANCEL) ;
 N TIMESLOTCOUNT,COUNT,SUBSCRIPT,STARTDATE,STARTTIME,ENDTIME,SLOTS,LASTTIMESLOTDATE,DONE,CANSLOTSENDDATE,DATENEXTTIMESLOT,TIME
 ;
 S TIMESLOTCOUNT=0,DONE=0
 F  S TIMESLOTCOUNT=$O(INPUTS("TIMESLOT",TIMESLOTCOUNT)) Q:'TIMESLOTCOUNT!(DONE=1)  D
 .;
 .S COUNT=0
 .F  S COUNT=$O(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)) Q:'COUNT  D
 ..I $P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T")'=AVAILABILITYDATE Q
 ..;
 ..I $G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))="@" D  Q
 ...S DATES=$G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),DATES($$ISOTFM^SDAMUTDT(DATES))="",TIMES=""
 ..;
 ..S LASTTIMESLOTDATE=0,LASTTIMESLOTDATE=$O(DATES(LASTTIMESLOTDATE))
 ..I $G(LASTTIMESLOTDATE)=$$ISOTFM^SDAMUTDT($P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"))!('$G(LASTTIMESLOTDATE)) D
 ...S DATES=$$ISOTFM^SDAMUTDT($P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T")),DATES(DATES)=""
 ...S TIMES=$G(TIMES)_$P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T",2)_"-"_$P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),"T",2)_";"
 ...S TIME=$P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T",2)_"-"_$P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),"T",2)_U_$G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))
 ...S TIMES($P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T",2))=TIME
 ..;
 ..I $G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)),'$D(DATES(9999999)) D
 ...S DATES=$G(DATES)_";9999999",DATES(9999999)=""
 ..;
 ..S DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT($P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"))
 ..S CANSLOTSENDDATE=$S($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)):$$FMTISO^SDAMUTDT($$GETLASTINDEFDATE(CLINICIEN,DATENEXTTIMESLOT,$$GET1^DIQ(44,CLINICIEN,2002))),1:DATENEXTTIMESLOT)
 ..I $G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)) D  Q
 ...S DONE=0
 ...F  D  Q:DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT(CANSLOTSENDDATE)
 ....D GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)),CANSLOTSENDDATE,COUNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
 ....S DATENEXTTIMESLOT=$$FMADD^XLFDT(DATENEXTTIMESLOT,7)
 ..;
 ..D GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)),CANSLOTSENDDATE,COUNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
 S TIMES=$E($G(TIMES),1,$L($G(TIMES))-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 COUNT,CANCEL,CANCELRETURN
 ;
 S COUNT=0
 F  S COUNT=$O(SLOTSTOCANCEL("CancelledSlots",COUNT)) Q:'COUNT  D
 .S CANCEL("CLINIC IEN")=CLINICIEN
 .S CANCEL("FULL PARTIAL FLAG")=$S($G(SLOTSTOCANCEL("CancelledSlots",COUNT,"BeginTime"))["T":"P",1:"F")
 .S CANCEL("START DATE TIME")=$G(SLOTSTOCANCEL("CancelledSlots",COUNT,"BeginTime"))
 .S CANCEL("END DATE TIME")=$G(SLOTSTOCANCEL("CancelledSlots",COUNT,"EndTime"))
 .D CANCEL^SDES2CANCLNAVAIL(.CANCELRETURN,.SDCONTEXT,.CANCEL)
 Q
 ;
GETCANSLOTS(CLINICIEN,SLOTSTOCANCEL,INDEFINITE,ENDDATE,COUNT,SCHEDULEDATE,INPUTS,SDCONTEXT) ;
 N CANSLOTS,JSON,SLOTS,NUM,SLOTNUM
 ;
 I $$GET1^DIQ(44.005,$$ISOTFM^SDAMUTDT(SCHEDULEDATE)_","_CLINICIEN_",",1,"I")["CANCELLED" D  Q
 .S SLOTSTOCANCEL("CancelledSlots",1,"BeginTime")=SCHEDULEDATE
 .S SLOTSTOCANCEL("CancelledSlots",1,"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,TIMESLOTCOUNT,DATETIMECOUNT
 ;
 D VALCONTEXT^SDES2VALCONTEXT(.ERRORS,.SDCONTEXT)
 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 TIMESLOTCOUNT=0
 F  S TIMESLOTCOUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT)) Q:'TIMESLOTCOUNT  D
 .S DATETIMECOUNT=0
 .F  S DATETIMECOUNT=$O(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",DATETIMECOUNT)) Q:'DATETIMECOUNT  D
 ..S INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",DATETIMECOUNT)=$TR($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",DATETIMECOUNT)),":","")
 ..S INPUTS("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",DATETIMECOUNT)=$TR($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",DATETIMECOUNT)),":","")
 ;
 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 VALPATTERNS(CLINICIEN,.AVAILABILITY,.INPUTS,CLINICSTARTHOUR,NUMBEROFENTRIES)
 Q
 ;
VALIDATEINDEF(ERRORS,AVAILABILITY) ;
 N TIMESLOTCOUNT,COUNT
 ;
 I '$D(AVAILABILITY("TIMESLOT",1,"INDEFINITE",1)) D ERRLOG^SDES2JSON(.ERRORS,592) Q
 S TIMESLOTCOUNT=0
 F  S TIMESLOTCOUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT)) Q:'TIMESLOTCOUNT!($D(ERRORS))  D
 .;
 .S COUNT=0
 .F  S COUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)) Q:'COUNT  D
 ..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))="" D ERRLOG^SDES2JSON(.ERRORS,592) Q
 ..I '$D(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)) D ERRLOG^SDES2JSON(.ERRORS,592) Q
 ..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))'=1,$G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))'=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 TIMESLOTCOUNT,COUNT
 ;
 I '$D(AVAILABILITY("TIMESLOT",1,"NUMBER OF SLOTS",1)) D ERRLOG^SDES2JSON(.ERRORS,309) Q
 S TIMESLOTCOUNT=0
 F  S TIMESLOTCOUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT)) Q:'TIMESLOTCOUNT!($D(ERRORS))  D
 .;
 .S COUNT=0
 .F  S COUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)) Q:'COUNT  D
 ..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))="@" Q
 ..I '$D(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT)) D ERRLOG^SDES2JSON(.ERRORS,309) Q
 ..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))<1!($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))>26) D ERRLOG^SDES2JSON(.ERRORS,125)
 Q
 ;
VALIDATEDATETIME(ERRORS,CLINICIEN,AVAILABILITY,NUMBEROFENTRIES) ;
 N COUNT,TIMEZONEOFFSET,TIME,TIMESLOTCOUNT,COUNT
 ;
 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 TIMESLOTCOUNT=0
 F  S TIMESLOTCOUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT)) Q:'TIMESLOTCOUNT!($D(ERRORS))  D
 .;
 .S COUNT=0
 .F  S COUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)) Q:'COUNT!($D(ERRORS))  D
 ..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))="@" Q
 ..;
 ..I $L($P($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T",2),"-",2))!($L($P($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),"T",2),"-",2))) D ERRLOG^SDES2JSON(.ERRORS,590) Q
 ..S TIMEZONEOFFSET=$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T")),CLINICIEN)
 ..S AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)=$G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))_TIMEZONEOFFSET
 ..S AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)=$G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT))_TIMEZONEOFFSET
 ..;
 ..D VALISODATERANGE^SDES2VALISODTTM(.ERRORS,$G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),$G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),1,CLINICIEN)
 ..S AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)=$$ISOTFM^SDAMUTDT($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),CLINICIEN)
 ..S AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)=$$ISOTFM^SDAMUTDT($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),CLINICIEN)
 ..I AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)=-1 Q
 ..I AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)=-1 Q
 ..I $G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))<DT D ERRLOG^SDES2JSON(.ERRORS,71) Q
 ..;
 ..I $$GET1^DIQ(44,CLINICIEN,1914,"I")*100>+$E($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),".",2)_"0000",1,4) D ERRLOG^SDES2JSON(.ERRORS,581) Q
 ..I '$$CHECKDURATION^SDES2UTIL1($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),$G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),$$GET1^DIQ(44,CLINICIEN,1912,"I")) D ERRLOG^SDES2JSON(.ERRORS,582) Q
 ..I $$INACTIVE^SDESUTIL(CLINICIEN,$P($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),".")) D ERRLOG^SDES2JSON(.ERRORS,583) Q
 ..I $$GET1^DIQ(44,CLINICIEN,1918.5,"I")'="Y",$D(^HOLIDAY($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"."),0)) D ERRLOG^SDES2JSON(.ERRORS,465) Q
 Q
 ;
VALPATTERNS(CLINIEN,AVAILABILITY,INPUTS,STARTDAY,NUMBEROFENTRIES) ;
 N SLT,DOW,DISPINCPERHR,TIMESLOTCOUNT,DATES,TIMES,SLOTSTOCANCEL,DONE,COUNT
 S SLT=$$GET1^DIQ(44,CLINIEN,1912,"I")
 S DISPINCPERHR=$$GET1^DIQ(44,CLINIEN,1917,"I")
 S TIMESLOTCOUNT=0,DONE=0
 F  S TIMESLOTCOUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT)) Q:'TIMESLOTCOUNT!($D(ERRORS))  D
 .;
 .S COUNT=0
 .F  S COUNT=$O(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)) Q:'COUNT!($D(ERRORS))  D
 ..;
 ..S DOW=$$DOW^XLFDT($P($G(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"."),1)
 ..D CREATEDATESTIMES(.DATES,.TIMES,.INPUTS,$P($G(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"),NUMBEROFENTRIES,.SLOTSTOCANCEL)
 ..;
 ..D CHECKLEN^SDES2CRTCLNAVAIL(CLINIEN,STARTDAY,SLT,DOW,,.DATES,.TIMES,DISPINCPERHR,,.ERRORS)
 Q
 ;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDES2CRTCLNAVAL2   14159     printed  Sep 23, 2025@20:30:08                                                                                                                                                                                           Page 2
SDES2CRTCLNAVAL2 ;ALB/BLB,JDJ/BLB - SDES2 SET CLINIC AVAILABILITY ;JUN 06, 2025
 +1       ;;5.3;Scheduling;**904,914**;Aug 13, 1993;Build 1
 +2       ;;Per VHA Directive 6402, this routine should not be modified
 +3       ;
 +4        QUIT 
 +5       ;
CREATE(JSON,SDCONTEXT,AVAILABILITY) ;
 +1        NEW ERRORS,RETURNAVAIL,CLINICIEN,CLINICSTARTHOUR,NUMBEROFENTRIES,INPUTS,INDEFINITEUNTIL,SDDISPPERHR,SDCLINSTARTHR,SLOTSTOCANCEL,%,%DT
 +2       ;
 +3        MERGE INPUTS=AVAILABILITY
 +4        DO VALIDATE(.ERRORS,.AVAILABILITY,.CLINICIEN,.CLINICSTARTHOUR,.NUMBEROFENTRIES,.INPUTS)
 +5        IF $DATA(ERRORS)
               SET ERRORS("clinicAvailability")=""
               KILL COUNT,I
               DO BUILDJSON^SDES2JSON(.JSON,.ERRORS)
               QUIT 
 +6       ;
 +7        DO CREATEAVAIL(.AVAILABILITY,.SDCONTEXT,.SLOTSTOCANCEL,CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1917,"I"),$$GET1^DIQ(44,CLINICIEN,1914,"I"),NUMBEROFENTRIES,.INPUTS,.INDEFINITEUNTIL,.RETURNAVAIL,.ERRORS)
 +8       ;
 +9        IF $LENGTH($GET(SLOTSTOCANCEL("CancelledSlots",1,"BeginTime")))
               Begin DoDot:1
 +10               DO RECANCELSLOTS(.SLOTSTOCANCEL,CLINICIEN,.SDCONTEXT)
                   KILL SLOTSTOCANCEL
               End DoDot:1
 +11      ;
 +12       IF '$DATA(RETURNAVAIL)
               SET RETURNAVAIL("clinicAvailability")=""
 +13       DO BUILDJSON^SDES2JSON(.JSON,.RETURNAVAIL)
 +14       KILL COUNT,I
 +15       QUIT 
 +16      ;
CREATEAVAIL(AVAILABILITY,SDCONTEXT,SLOTSTOCANCEL,CLINICIEN,CLINICSTARTHOUR,SDDISPPERHR,SDCLINSTARTHR,NUMBEROFENTRIES,INPUTS,INDEFINITEUNTIL,RETURNAVAIL,ERRORS) ;
 +1        NEW TIMESLOTCOUNT,COUNT,ENDDATE,DATES,TIMES,SCHEDULEDDAYS,DATENEXTTIMESLOT,CANSLOTSENDDATE,DONE,SDRETURN,SDONE,J,SDSAV,SDST1,SM,SS,SEQ,%H,ENDATE,SB
 +2       ;
 +3        SET TIMESLOTCOUNT=0
           SET DONE=0
 +4        FOR 
               SET TIMESLOTCOUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT))
               if 'TIMESLOTCOUNT!(DONE=1)
                   QUIT 
               Begin DoDot:1
 +5       ;
 +6                SET COUNT=0
 +7                FOR 
                       SET COUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))
                       if 'COUNT
                           QUIT 
                       Begin DoDot:2
 +8                        IF $GET(SCHEDULEDDAYS)[$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T")
                               QUIT 
 +9       ;
 +10                       DO CREATEDATESTIMES(.DATES,.TIMES,.INPUTS,$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"),NUMBEROFENTRIES,.SLOTSTOCANCEL)
 +11                       IF $DATA(SLOTSTOCANCEL("Error"))
                               MERGE RETURNAVAIL=SLOTSTOCANCEL
                               SET DONE=1
                               QUIT 
 +12                       DO CREATE^SDES2UTIL1(CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1912,"I"),$$DOW^XLFDT($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"."),1),.INDEFINITEUNTIL,.DATES,.TIMES,SDDISPPERHR,.SDRETUR
N,.ERRORS)
 +13                       KILL DATES,TIMES
 +14      ;
 +15                       SET RETURNAVAIL("clinicAvailability",COUNT,"Pattern")="Pattern Filed"
 +16                       IF $GET(INDEFINITEUNTIL)
                               Begin DoDot:3
 +17                               SET RETURNAVAIL("clinicAvailability",COUNT,"DateIndefiniteScheduleEnds")=INDEFINITEUNTIL
                                   KILL INDEFINITEUNTIL
                               End DoDot:3
 +18                       SET SCHEDULEDDAYS=$GET(SCHEDULEDDAYS)_$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T")_U
                       End DoDot:2
               End DoDot:1
 +19       QUIT 
 +20      ;
CREATEDATESTIMES(DATES,TIMES,INPUTS,AVAILABILITYDATE,NUMBEROFENTRIES,SLOTSTOCANCEL) ;
 +1        NEW TIMESLOTCOUNT,COUNT,SUBSCRIPT,STARTDATE,STARTTIME,ENDTIME,SLOTS,LASTTIMESLOTDATE,DONE,CANSLOTSENDDATE,DATENEXTTIMESLOT,TIME
 +2       ;
 +3        SET TIMESLOTCOUNT=0
           SET DONE=0
 +4        FOR 
               SET TIMESLOTCOUNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCOUNT))
               if 'TIMESLOTCOUNT!(DONE=1)
                   QUIT 
               Begin DoDot:1
 +5       ;
 +6                SET COUNT=0
 +7                FOR 
                       SET COUNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))
                       if 'COUNT
                           QUIT 
                       Begin DoDot:2
 +8                        IF $PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T")'=AVAILABILITYDATE
                               QUIT 
 +9       ;
 +10                       IF $GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))="@"
                               Begin DoDot:3
 +11                               SET DATES=$GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))
                                   SET DATES($$ISOTFM^SDAMUTDT(DATES))=""
                                   SET TIMES=""
                               End DoDot:3
                               QUIT 
 +12      ;
 +13                       SET LASTTIMESLOTDATE=0
                           SET LASTTIMESLOTDATE=$ORDER(DATES(LASTTIMESLOTDATE))
 +14                       IF $GET(LASTTIMESLOTDATE)=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"))!('$GET(LASTTIMESLOTDATE))
                               Begin DoDot:3
 +15                               SET DATES=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"))
                                   SET DATES(DATES)=""
 +16                               SET TIMES=$GET(TIMES)_$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T",2)_"-"_$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),"T",2)_";"
 +17                               SET TIME=$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T",2)_"-"_$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),"T",2)_U_$GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS
",COUNT))
 +18                               SET TIMES($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T",2))=TIME
                               End DoDot:3
 +19      ;
 +20                       IF $GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))
                               IF '$DATA(DATES(9999999))
                                   Begin DoDot:3
 +21                                   SET DATES=$GET(DATES)_";9999999"
                                       SET DATES(9999999)=""
                                   End DoDot:3
 +22      ;
 +23                       SET DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"))
 +24                       SET CANSLOTSENDDATE=$SELECT($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)):$$FMTISO^SDAMUTDT($$GETLASTINDEFDATE(CLINICIEN,DATENEXTTIMESLOT,$$GET1^DIQ(44,CLINICIEN,2002))),1:DATENEXTTIMESLOT)
 +25                       IF $GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))
                               Begin DoDot:3
 +26                               SET DONE=0
 +27                               FOR 
                                       Begin DoDot:4
 +28                                       DO GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)),CANSLOTSENDDATE,COUNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
 +29                                       SET DATENEXTTIMESLOT=$$FMADD^XLFDT(DATENEXTTIMESLOT,7)
                                       End DoDot:4
                                       if DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT(CANSLOTSENDDATE)
                                           QUIT 
                               End DoDot:3
                               QUIT 
 +30      ;
 +31                       DO GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT)),CANSLOTSENDDATE,COUNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
                       End DoDot:2
               End DoDot:1
 +32       SET TIMES=$EXTRACT($GET(TIMES),1,$LENGTH($GET(TIMES))-1)
 +33       QUIT 
 +34      ;
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 COUNT,CANCEL,CANCELRETURN
 +2       ;
 +3        SET COUNT=0
 +4        FOR 
               SET COUNT=$ORDER(SLOTSTOCANCEL("CancelledSlots",COUNT))
               if 'COUNT
                   QUIT 
               Begin DoDot:1
 +5                SET CANCEL("CLINIC IEN")=CLINICIEN
 +6                SET CANCEL("FULL PARTIAL FLAG")=$SELECT($GET(SLOTSTOCANCEL("CancelledSlots",COUNT,"BeginTime"))["T":"P",1:"F")
 +7                SET CANCEL("START DATE TIME")=$GET(SLOTSTOCANCEL("CancelledSlots",COUNT,"BeginTime"))
 +8                SET CANCEL("END DATE TIME")=$GET(SLOTSTOCANCEL("CancelledSlots",COUNT,"EndTime"))
 +9                DO CANCEL^SDES2CANCLNAVAIL(.CANCELRETURN,.SDCONTEXT,.CANCEL)
               End DoDot:1
 +10       QUIT 
 +11      ;
GETCANSLOTS(CLINICIEN,SLOTSTOCANCEL,INDEFINITE,ENDDATE,COUNT,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 SLOTSTOCANCEL("CancelledSlots",1,"BeginTime")=SCHEDULEDATE
 +5                SET SLOTSTOCANCEL("CancelledSlots",1,"EndTime")=SCHEDULEDATE
               End DoDot:1
               QUIT 
 +6       ;
 +7        SET CANSLOTS("CLINICIEN")=CLINICIEN
 +8        SET CANSLOTS("SDESSTART")=SCHEDULEDATE_"T"_"0001"_$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT(SCHEDULEDATE),CLINICIEN)
 +9        SET CANSLOTS("SDESENDDATE")=SCHEDULEDATE_"T"_2359_$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT(SCHEDULEDATE),CLINICIEN)
 +10       DO GETCANCSLOTS^SDES2GETCANSLOTS(.JSON,.SDCONTEXT,.CANSLOTS)
           KILL CANSLOTS
 +11       DO DECODE^XLFJSON("JSON","SLOTS")
 +12      ;
 +13       IF $DATA(SLOTSTOCANCEL("CancelledSlots",1,"BeginTime"))
               IF $LENGTH($GET(SLOTS("CancelledSlots",1,"BeginTime")))
                   Begin DoDot:1
 +14                   SET NUM=""
                       SET NUM=$ORDER(SLOTSTOCANCEL("CancelledSlots",NUM),-1)
 +15                   SET SLOTNUM=0
 +16                   FOR 
                           SET SLOTNUM=$ORDER(SLOTS("CancelledSlots",SLOTNUM))
                           if 'SLOTNUM
                               QUIT 
                           Begin DoDot:2
 +17                           SET NUM=NUM+1
 +18                           SET SLOTSTOCANCEL("CancelledSlots",NUM,"BeginTime")=$GET(SLOTS("CancelledSlots",SLOTNUM,"BeginTime"))
 +19                           SET SLOTSTOCANCEL("CancelledSlots",NUM,"EndTime")=$GET(SLOTS("CancelledSlots",SLOTNUM,"EndTime"))
                           End DoDot:2
                   End DoDot:1
                   QUIT 
 +20      ;
 +21       IF $DATA(SLOTS("CancelledSlots",1,"BeginTime"))
               Begin DoDot:1
 +22               MERGE SLOTSTOCANCEL=SLOTS
               End DoDot:1
 +23      ;
 +24       SET SCHEDULEDATE=$$FMADD^XLFDT(SCHEDULEDATE,7)
           KILL SLOTS
 +25       QUIT 
 +26      ;
VALIDATE(ERRORS,AVAILABILITY,CLINICIEN,CLINICSTARTHOUR,NUMBEROFENTRIES,INPUTS) ;
 +1        NEW FDATA,VAL,TIMESLOTCOUNT,DATETIMECOUNT
 +2       ;
 +3        DO VALCONTEXT^SDES2VALCONTEXT(.ERRORS,.SDCONTEXT)
 +4        DO VALFILEIEN^SDES2VALUTIL(.VAL,.ERRORS,44,$GET(AVAILABILITY("CLINIC IEN")),1,,18,19)
 +5        IF $DATA(ERRORS)
               QUIT 
 +6       ;
 +7        SET CLINICIEN=$GET(AVAILABILITY("CLINIC IEN"))
 +8        SET CLINICSTARTHOUR=$$GET1^DIQ(44,CLINICIEN,1914,"I")
 +9       ;
 +10       SET NUMBEROFENTRIES=$ORDER(AVAILABILITY("TIMESLOT",""),-1)
 +11      ;
 +12       SET TIMESLOTCOUNT=0
 +13       FOR 
               SET TIMESLOTCOUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT))
               if 'TIMESLOTCOUNT
                   QUIT 
               Begin DoDot:1
 +14               SET DATETIMECOUNT=0
 +15               FOR 
                       SET DATETIMECOUNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",DATETIMECOUNT))
                       if 'DATETIMECOUNT
                           QUIT 
                       Begin DoDot:2
 +16                       SET INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",DATETIMECOUNT)=$TRANSLATE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",DATETIMECOUNT)),":","")
 +17                       SET INPUTS("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",DATETIMECOUNT)=$TRANSLATE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",DATETIMECOUNT)),":","")
                       End DoDot:2
               End DoDot:1
 +18      ;
 +19       DO VALFILEIEN^SDES2VALUTIL(.VAL,.ERRORS,44,CLINICIEN,1,,18,19)
 +20       DO VALAPPTLENGTH(.ERRORS,$$GET1^DIQ(44,CLINICIEN,1912,"I"),CLINICIEN)
           if $DATA(ERRORS)
               QUIT 
 +21       DO VALSTARTHOUR^SDES2VAL44(.ERRORS,.CLINICSTARTHOUR)
 +22       DO VALIDATEDATETIME(.ERRORS,CLINICIEN,.AVAILABILITY,NUMBEROFENTRIES)
 +23       DO VALIDATESLOTS(.ERRORS,.AVAILABILITY)
 +24       DO VALIDATEINDEF(.ERRORS,.AVAILABILITY)
 +25       DO VALPATTERNS(CLINICIEN,.AVAILABILITY,.INPUTS,CLINICSTARTHOUR,NUMBEROFENTRIES)
 +26       QUIT 
 +27      ;
VALIDATEINDEF(ERRORS,AVAILABILITY) ;
 +1        NEW TIMESLOTCOUNT,COUNT
 +2       ;
 +3        IF '$DATA(AVAILABILITY("TIMESLOT",1,"INDEFINITE",1))
               DO ERRLOG^SDES2JSON(.ERRORS,592)
               QUIT 
 +4        SET TIMESLOTCOUNT=0
 +5        FOR 
               SET TIMESLOTCOUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT))
               if 'TIMESLOTCOUNT!($DATA(ERRORS))
                   QUIT 
               Begin DoDot:1
 +6       ;
 +7                SET COUNT=0
 +8                FOR 
                       SET COUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))
                       if 'COUNT
                           QUIT 
                       Begin DoDot:2
 +9                        IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))=""
                               DO ERRLOG^SDES2JSON(.ERRORS,592)
                               QUIT 
 +10                       IF '$DATA(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))
                               DO ERRLOG^SDES2JSON(.ERRORS,592)
                               QUIT 
 +11                       IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))'=1
                               IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"INDEFINITE",COUNT))'=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        NEW TIMESLOTCOUNT,COUNT
 +2       ;
 +3        IF '$DATA(AVAILABILITY("TIMESLOT",1,"NUMBER OF SLOTS",1))
               DO ERRLOG^SDES2JSON(.ERRORS,309)
               QUIT 
 +4        SET TIMESLOTCOUNT=0
 +5        FOR 
               SET TIMESLOTCOUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT))
               if 'TIMESLOTCOUNT!($DATA(ERRORS))
                   QUIT 
               Begin DoDot:1
 +6       ;
 +7                SET COUNT=0
 +8                FOR 
                       SET COUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))
                       if 'COUNT
                           QUIT 
                       Begin DoDot:2
 +9                        IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))="@"
                               QUIT 
 +10                       IF '$DATA(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))
                               DO ERRLOG^SDES2JSON(.ERRORS,309)
                               QUIT 
 +11                       IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))<1!($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))>26)
                               DO ERRLOG^SDES2JSON(.ERRORS,125)
                       End DoDot:2
               End DoDot:1
 +12       QUIT 
 +13      ;
VALIDATEDATETIME(ERRORS,CLINICIEN,AVAILABILITY,NUMBEROFENTRIES) ;
 +1        NEW COUNT,TIMEZONEOFFSET,TIME,TIMESLOTCOUNT,COUNT
 +2       ;
 +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       ;
 +6        SET TIMESLOTCOUNT=0
 +7        FOR 
               SET TIMESLOTCOUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT))
               if 'TIMESLOTCOUNT!($DATA(ERRORS))
                   QUIT 
               Begin DoDot:1
 +8       ;
 +9                SET COUNT=0
 +10               FOR 
                       SET COUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))
                       if 'COUNT!($DATA(ERRORS))
                           QUIT 
                       Begin DoDot:2
 +11                       IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"NUMBER OF SLOTS",COUNT))="@"
                               QUIT 
 +12      ;
 +13                       IF $LENGTH($PIECE($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T",2),"-",2))!($LENGTH($PIECE($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),"T",2),"-",2)))
                               DO ERRLOG^SDES2JSON(.ERRORS,590)
                               QUIT 
 +14                       SET TIMEZONEOFFSET=$$GETTZOFFSET^SDESUTIL($$ISOTFM^SDAMUTDT($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T")),CLINICIEN)
 +15                       SET AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)=$GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))_TIMEZONEOFFSET
 +16                       SET AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)=$GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT))_TIMEZONEOFFSET
 +17      ;
 +18                       DO VALISODATERANGE^SDES2VALISODTTM(.ERRORS,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),$GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),1,CLINICIEN)
 +19                       SET AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)=$$ISOTFM^SDAMUTDT($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),CLINICIEN)
 +20                       SET AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)=$$ISOTFM^SDAMUTDT($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),CLINICIEN)
 +21                       IF AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)=-1
                               QUIT 
 +22                       IF AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)=-1
                               QUIT 
 +23                       IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))<DT
                               DO ERRLOG^SDES2JSON(.ERRORS,71)
                               QUIT 
 +24      ;
 +25                       IF $$GET1^DIQ(44,CLINICIEN,1914,"I")*100>+$EXTRACT($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),".",2)_"0000",1,4)
                               DO ERRLOG^SDES2JSON(.ERRORS,581)
                               QUIT 
 +26                       IF '$$CHECKDURATION^SDES2UTIL1($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),$GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"END DATE TIME",COUNT)),$$GET1^DIQ(44,CLINICIEN,1912,"I"))
                               DO ERRLOG^SDES2JSON(.ERRORS,582)
                               QUIT 
 +27                       IF $$INACTIVE^SDESUTIL(CLINICIEN,$PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"."))
                               DO ERRLOG^SDES2JSON(.ERRORS,583)
                               QUIT 
 +28                       IF $$GET1^DIQ(44,CLINICIEN,1918.5,"I")'="Y"
                               IF $DATA(^HOLIDAY($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"."),0))
                                   DO ERRLOG^SDES2JSON(.ERRORS,465)
                                   QUIT 
                       End DoDot:2
               End DoDot:1
 +29       QUIT 
 +30      ;
VALPATTERNS(CLINIEN,AVAILABILITY,INPUTS,STARTDAY,NUMBEROFENTRIES) ;
 +1        NEW SLT,DOW,DISPINCPERHR,TIMESLOTCOUNT,DATES,TIMES,SLOTSTOCANCEL,DONE,COUNT
 +2        SET SLT=$$GET1^DIQ(44,CLINIEN,1912,"I")
 +3        SET DISPINCPERHR=$$GET1^DIQ(44,CLINIEN,1917,"I")
 +4        SET TIMESLOTCOUNT=0
           SET DONE=0
 +5        FOR 
               SET TIMESLOTCOUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT))
               if 'TIMESLOTCOUNT!($DATA(ERRORS))
                   QUIT 
               Begin DoDot:1
 +6       ;
 +7                SET COUNT=0
 +8                FOR 
                       SET COUNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT))
                       if 'COUNT!($DATA(ERRORS))
                           QUIT 
                       Begin DoDot:2
 +9       ;
 +10                       SET DOW=$$DOW^XLFDT($PIECE($GET(AVAILABILITY("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"."),1)
 +11                       DO CREATEDATESTIMES(.DATES,.TIMES,.INPUTS,$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCOUNT,"START DATE TIME",COUNT)),"T"),NUMBEROFENTRIES,.SLOTSTOCANCEL)
 +12      ;
 +13                       DO CHECKLEN^SDES2CRTCLNAVAIL(CLINIEN,STARTDAY,SLT,DOW,,.DATES,.TIMES,DISPINCPERHR,,.ERRORS)
                       End DoDot:2
               End DoDot:1
 +14       QUIT 
 +15      ;