SDES2CRTCLNAVAL2 ;ALB/BLB,JDJ/BLB,JDJ,AGW,JDJ,AGW,AGW,AGW,AGW,AGW - SDES2 CREATE CLINIC AVAIL 2 ; JULY 22, 2026
;;5.3;Scheduling;**904,914,919,920,922,909,941,944,945,947,959,951**;Aug 13, 1993;Build 5
;;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,STARTDATE,CNT1,CANCELTYPE
;
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
..S CNT1=0 F S CNT1=$O(SLOTSTOCANCEL("CancelledSlots",CNT1)) Q:CNT1="" D
...S STARTDATE=$$ISOTFM^SDAMUTDT($G(SLOTSTOCANCEL("CancelledSlots",CNT1,"BeginTime")),CLINICIEN)
...Q:STARTDATE=""
...S CANCELTYPE=$S(STARTDATE[".":"P",1:"F")
...I ((CANCELTYPE="P")&($G(^SC(CLINICIEN,"SDCAN",STARTDATE,0))="")) Q
...I ((CANCELTYPE="F")&($G(^SC(CLINICIEN,"FULL DAY CANCEL",STARTDATE,1))="")) Q
...I CANCELTYPE="P" S SLOTSTOCANCEL("CancelledSlots",CNT1,"Remarks")=$G(^SC(CLINICIEN,"S",STARTDATE,"MES"))
...I CANCELTYPE="F" S SLOTSTOCANCEL("CancelledSlots",CNT1,"Remarks")=$G(^SC(CLINICIEN,"FULL DAY CANCEL",STARTDATE,1))
...Q
..D CREATEAVAIL^SDES2UTIL1(.SDRETURN,CLINICIEN,$G(DATES),$G(TIMES),$G(NUMBEROFSLOTS),.INDEFINITEUNTIL)
..I ($G(INPUTS("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@")&($G(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))=1) D
...N STARTDATE,TDAY
...S STARTDATE=$G(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
...S STARTDATE=$P($G(STARTDATE),";",1),STARTDATE=$$ISOTFM^SDAMUTDT(STARTDATE)
...S TDAY=$$DOW^XLFDT(STARTDATE,1)
...S INDEFINITEUNTIL=$O(^SC(CLINICIEN,"T"_TDAY,STARTDATE))
...S:INDEFINITEUNTIL=9999999 INDEFINITEUNTIL=""
...S:INDEFINITEUNTIL'="" INDEFINITEUNTIL=$$FMTISO^SDAMUTDT(INDEFINITEUNTIL)
...Q
..K DATES,TIMES,NUMBEROFSLOTS
..S RETURNAVAIL("clinicAvailability",CNT,"Pattern")="Pattern Filed"
..S RETURNAVAIL("clinicAvailability",CNT,"DateIndefiniteScheduleEnds")=$G(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)):$$GETLASTINDEFDATE(CLINICIEN,DATENEXTTIMESLOT),1:DATENEXTTIMESLOT)
..I $G(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)) D Q
...S DONE=0
...F Q:(DATENEXTTIMESLOT>CANSLOTSENDDATE) D
....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) ;
N FOUND,OSTDATE,LASTSTDATE,STDATE,STDATE1
;
S LASTSTDATE=$$FMADD^XLFDT(DT,1000)
S LASTSTDATE=$O(^SC(CLINICIEN,"ST",LASTSTDATE),-1)
S (STDATE,STDATE1)=DATE
S FOUND=0
F Q:(STDATE1>LASTSTDATE)!(STDATE1=-1) D
.S STDATE1=$$FMADD^XLFDT(STDATE1,7)
.I ($G(^SC(CLINICIEN,"ST",STDATE1,0))'="") S STDATE=STDATE1
Q $G(STDATE)
;
RECANCELSLOTS(SLOTSTOCANCEL,CLINICIEN,SDCONTEXT) ;
N CNT,CANCEL,CANCELRETURN
;
S CNT=0
F S CNT=$O(SLOTSTOCANCEL("CancelledSlots",CNT)) Q:'CNT D
.K CANCEL
.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"))
.S CANCEL("REMARKS")=$G(SLOTSTOCANCEL("CancelledSlots",CNT,"Remarks"))
.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^SDES2CRTCLNAVL2B(.ERRORS,CLINICIEN,.AVAILABILITY,NUMBEROFENTRIES)
D VALIDATESLOTS(.ERRORS,.AVAILABILITY)
D VALIDATEINDEF(.ERRORS,.AVAILABILITY)
D PATTERNLENGTH^SDES2CRTCLNAVL2B(.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
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDES2CRTCLNAVAL2 12085 printed Sep 17, 2026@21:39:48 Page 2
SDES2CRTCLNAVAL2 ;ALB/BLB,JDJ/BLB,JDJ,AGW,JDJ,AGW,AGW,AGW,AGW,AGW - SDES2 CREATE CLINIC AVAIL 2 ; JULY 22, 2026
+1 ;;5.3;Scheduling;**904,914,919,920,922,909,941,944,945,947,959,951**;Aug 13, 1993;Build 5
+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 MERGE INPUTS=AVAILABILITY
+4 DO VALCONTEXT^SDES2VALCONTEXT(.ERRORS,.SDCONTEXT)
+5 IF $DATA(ERRORS)
SET ERRORS("clinicAvailability")=""
KILL CNT,I
DO BUILDJSON^SDES2JSON(.JSON,.ERRORS)
QUIT
+6 IF $GET(SDCONTEXT("USER DUZ"))'=""
NEW DUZ
DO DUZ^XUP(SDCONTEXT("USER DUZ"))
+7 DO VALIDATE(.ERRORS,.AVAILABILITY,.CLINICIEN,.CLINICSTARTHOUR,.NUMBEROFENTRIES,.INPUTS)
+8 IF $DATA(ERRORS)
SET ERRORS("clinicAvailability")=""
KILL CNT,I
DO BUILDJSON^SDES2JSON(.JSON,.ERRORS)
QUIT
+9 DO CREATEAVAIL(.AVAILABILITY,.SDCONTEXT,.SLOTSTOCANCEL,CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1917,"I"),$$GET1^DIQ(44,CLINICIEN,1914,"I"),NUMBEROFENTRIES,.INPUTS,.INDEFINITEUNTIL,.RETURNAVAIL,.ERRORS)
+10 IF $LENGTH($GET(SLOTSTOCANCEL("CancelledSlots",1,"BeginTime")))
IF $GET(AVAILABILITY("KEEP CANCELLED SLOTS"))=1
Begin DoDot:1
+11 DO RECANCELSLOTS(.SLOTSTOCANCEL,CLINICIEN,.SDCONTEXT)
KILL SLOTSTOCANCEL
End DoDot:1
+12 IF '$DATA(RETURNAVAIL)
SET RETURNAVAIL("clinicAvailability")=""
+13 DO BUILDJSON^SDES2JSON(.JSON,.RETURNAVAIL)
+14 KILL CNT,I
+15 QUIT
+16 ;
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,STARTDATE,CNT1,CANCELTYPE
+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 SET CNT=0
+6 FOR
SET CNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
if 'CNT
QUIT
Begin DoDot:2
+7 IF $GET(SCHEDULEDDAYS)[$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")
QUIT
+8 DO CREATEDATESTIMES(.DATES,.TIMES,.NUMBEROFSLOTS,.INPUTS,$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"),NUMBEROFENTRIES,.SLOTSTOCANCEL)
+9 IF $DATA(SLOTSTOCANCEL("Error"))
MERGE RETURNAVAIL=SLOTSTOCANCEL
SET DONE=1
QUIT
+10 SET CNT1=0
FOR
SET CNT1=$ORDER(SLOTSTOCANCEL("CancelledSlots",CNT1))
if CNT1=""
QUIT
Begin DoDot:3
+11 SET STARTDATE=$$ISOTFM^SDAMUTDT($GET(SLOTSTOCANCEL("CancelledSlots",CNT1,"BeginTime")),CLINICIEN)
+12 if STARTDATE=""
QUIT
+13 SET CANCELTYPE=$SELECT(STARTDATE[".":"P",1:"F")
+14 IF ((CANCELTYPE="P")&($GET(^SC(CLINICIEN,"SDCAN",STARTDATE,0))=""))
QUIT
+15 IF ((CANCELTYPE="F")&($GET(^SC(CLINICIEN,"FULL DAY CANCEL",STARTDATE,1))=""))
QUIT
+16 IF CANCELTYPE="P"
SET SLOTSTOCANCEL("CancelledSlots",CNT1,"Remarks")=$GET(^SC(CLINICIEN,"S",STARTDATE,"MES"))
+17 IF CANCELTYPE="F"
SET SLOTSTOCANCEL("CancelledSlots",CNT1,"Remarks")=$GET(^SC(CLINICIEN,"FULL DAY CANCEL",STARTDATE,1))
+18 QUIT
End DoDot:3
+19 DO CREATEAVAIL^SDES2UTIL1(.SDRETURN,CLINICIEN,$GET(DATES),$GET(TIMES),$GET(NUMBEROFSLOTS),.INDEFINITEUNTIL)
+20 IF ($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@")&($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))=1)
Begin DoDot:3
+21 NEW STARTDATE,TDAY
+22 SET STARTDATE=$GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
+23 SET STARTDATE=$PIECE($GET(STARTDATE),";",1)
SET STARTDATE=$$ISOTFM^SDAMUTDT(STARTDATE)
+24 SET TDAY=$$DOW^XLFDT(STARTDATE,1)
+25 SET INDEFINITEUNTIL=$ORDER(^SC(CLINICIEN,"T"_TDAY,STARTDATE))
+26 if INDEFINITEUNTIL=9999999
SET INDEFINITEUNTIL=""
+27 if INDEFINITEUNTIL'=""
SET INDEFINITEUNTIL=$$FMTISO^SDAMUTDT(INDEFINITEUNTIL)
+28 QUIT
End DoDot:3
+29 KILL DATES,TIMES,NUMBEROFSLOTS
+30 SET RETURNAVAIL("clinicAvailability",CNT,"Pattern")="Pattern Filed"
+31 SET RETURNAVAIL("clinicAvailability",CNT,"DateIndefiniteScheduleEnds")=$GET(INDEFINITEUNTIL)
KILL INDEFINITEUNTIL
+32 SET SCHEDULEDDAYS=$GET(SCHEDULEDDAYS)_$PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")_U
End DoDot:2
End DoDot:1
+33 QUIT
+34 ;
CREATEDATESTIMES(DATES,TIMES,NUMBEROFSLOTS,INPUTS,AVAILABILITYDATE,NUMBEROFENTRIES,SLOTSTOCANCEL) ;
+1 NEW TIMESLOTCNT,CNT,SUBSCRIPT,STARTDATE,STARTTIME,ENDTIME,LASTTIMESLOTDATE,DONE,CANSLOTSENDDATE,DATENEXTTIMESLOT,TIME
+2 SET TIMESLOTCNT=0
SET DONE=0
+3 FOR
SET TIMESLOTCNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCNT))
if 'TIMESLOTCNT!(DONE=1)
QUIT
Begin DoDot:1
+4 SET CNT=0
+5 FOR
SET CNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
if 'CNT
QUIT
Begin DoDot:2
+6 IF $PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T")'=AVAILABILITYDATE
QUIT
+7 IF $GET(INPUTS("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))="@"
Begin DoDot:3
+8 SET DATES=$GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))_$SELECT($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)):";9999999",1:"")
+9 SET NUMBEROFSLOTS=""
End DoDot:3
QUIT
+10 SET LASTTIMESLOTDATE=0
SET LASTTIMESLOTDATE=$ORDER(DATES(LASTTIMESLOTDATE))
+11 IF $GET(LASTTIMESLOTDATE)=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))!('$GET(LASTTIMESLOTDATE))
Begin DoDot:3
+12 SET DATES=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))
+13 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)_";"
+14 SET NUMBEROFSLOTS=$GET(NUMBEROFSLOTS)_$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"NUMBER OF SLOTS",CNT))_";"
End DoDot:3
+15 IF $GET(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))
IF '$DATA(DATES(9999999))
Begin DoDot:3
+16 SET DATES=$GET(DATES)_";9999999"
End DoDot:3
+17 SET DATENEXTTIMESLOT=$$ISOTFM^SDAMUTDT($PIECE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT)),"T"))
+18 SET CANSLOTSENDDATE=$SELECT($GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)):$$GETLASTINDEFDATE(CLINICIEN,DATENEXTTIMESLOT),1:DATENEXTTIMESLOT)
+19 IF $GET(INPUTS("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))
Begin DoDot:3
+20 SET DONE=0
+21 FOR
if (DATENEXTTIMESLOT>CANSLOTSENDDATE)
QUIT
Begin DoDot:4
+22 DO GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)),CANSLOTSENDDATE,CNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
+23 SET DATENEXTTIMESLOT=$$FMADD^XLFDT(DATENEXTTIMESLOT,7)
End DoDot:4
End DoDot:3
QUIT
+24 DO GETCANSLOTS(CLINICIEN,.SLOTSTOCANCEL,$GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT)),CANSLOTSENDDATE,CNT,$$FMTISO^SDAMUTDT(DATENEXTTIMESLOT),.INPUTS,.SDCONTEXT)
End DoDot:2
End DoDot:1
+25 SET TIMES=$EXTRACT($GET(TIMES),1,$LENGTH($GET(TIMES))-1)
+26 IF $GET(NUMBEROFSLOTS)'=""
Begin DoDot:1
+27 SET NUMBEROFSLOTS=$EXTRACT($GET(NUMBEROFSLOTS),1,$LENGTH($GET(NUMBEROFSLOTS))-1)
End DoDot:1
+28 QUIT
+29 ;
GETLASTINDEFDATE(CLINICIEN,DATE) ;
+1 NEW FOUND,OSTDATE,LASTSTDATE,STDATE,STDATE1
+2 ;
+3 SET LASTSTDATE=$$FMADD^XLFDT(DT,1000)
+4 SET LASTSTDATE=$ORDER(^SC(CLINICIEN,"ST",LASTSTDATE),-1)
+5 SET (STDATE,STDATE1)=DATE
+6 SET FOUND=0
+7 FOR
if (STDATE1>LASTSTDATE)!(STDATE1=-1)
QUIT
Begin DoDot:1
+8 SET STDATE1=$$FMADD^XLFDT(STDATE1,7)
+9 IF ($GET(^SC(CLINICIEN,"ST",STDATE1,0))'="")
SET STDATE=STDATE1
End DoDot:1
+10 QUIT $GET(STDATE)
+11 ;
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 KILL CANCEL
+6 SET CANCEL("CLINIC IEN")=CLINICIEN
+7 SET CANCEL("FULL PARTIAL FLAG")=$SELECT($GET(SLOTSTOCANCEL("CancelledSlots",CNT,"BeginTime"))["T":"P",1:"F")
+8 SET CANCEL("START DATE TIME")=$GET(SLOTSTOCANCEL("CancelledSlots",CNT,"BeginTime"))
+9 SET CANCEL("END DATE TIME")=$GET(SLOTSTOCANCEL("CancelledSlots",CNT,"EndTime"))
+10 SET CANCEL("REMARKS")=$GET(SLOTSTOCANCEL("CancelledSlots",CNT,"Remarks"))
+11 DO CANCEL^SDES2CANCLNAVAIL(.CANCELRETURN,.SDCONTEXT,.CANCEL)
End DoDot:1
+12 QUIT
+13 ;
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 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 IF $DATA(SLOTSTOCANCEL("CancelledSlots",1,"BeginTime"))
IF $LENGTH($GET(SLOTS("CancelledSlots",1,"BeginTime")))
Begin DoDot:1
+13 SET NUM=""
SET NUM=$ORDER(SLOTSTOCANCEL("CancelledSlots",NUM),-1)
+14 SET SLOTNUM=0
+15 FOR
SET SLOTNUM=$ORDER(SLOTS("CancelledSlots",SLOTNUM))
if 'SLOTNUM
QUIT
Begin DoDot:2
+16 SET NUM=NUM+1
+17 SET SLOTSTOCANCEL("CancelledSlots",NUM,"BeginTime")=$GET(SLOTS("CancelledSlots",SLOTNUM,"BeginTime"))
+18 SET SLOTSTOCANCEL("CancelledSlots",NUM,"EndTime")=$GET(SLOTS("CancelledSlots",SLOTNUM,"EndTime"))
End DoDot:2
End DoDot:1
QUIT
+19 IF $DATA(SLOTS("CancelledSlots",1,"BeginTime"))
Begin DoDot:1
+20 MERGE SLOTSTOCANCEL=SLOTS
End DoDot:1
+21 SET SCHEDULEDATE=$$FMADD^XLFDT(SCHEDULEDATE,7)
KILL SLOTS
+22 QUIT
+23 ;
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 SET CLINICIEN=$GET(AVAILABILITY("CLINIC IEN"))
+6 SET CLINICSTARTHOUR=$$GET1^DIQ(44,CLINICIEN,1914,"I")
+7 SET NUMBEROFENTRIES=$ORDER(AVAILABILITY("TIMESLOT",""),-1)
+8 SET TIMESLOTCNT=0
+9 FOR
SET TIMESLOTCNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT))
if 'TIMESLOTCNT
QUIT
Begin DoDot:1
+10 SET DATETIMECNT=0
+11 FOR
SET DATETIMECNT=$ORDER(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT))
if 'DATETIMECNT
QUIT
Begin DoDot:2
+12 SET INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT)=$TRANSLATE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"START DATE TIME",DATETIMECNT)),":","")
+13 SET INPUTS("TIMESLOT",TIMESLOTCNT,"END DATE TIME",DATETIMECNT)=$TRANSLATE($GET(INPUTS("TIMESLOT",TIMESLOTCNT,"END DATE TIME",DATETIMECNT)),":","")
End DoDot:2
End DoDot:1
+14 IF $LENGTH($GET(AVAILABILITY("KEEP CANCELLED SLOTS")))
Begin DoDot:1
+15 IF $GET(AVAILABILITY("KEEP CANCELLED SLOTS"))'=1
IF $GET(AVAILABILITY("KEEP CANCELLED SLOTS"))'=0
DO ERRLOG^SDES2JSON(.ERRORS,656)
End DoDot:1
+16 DO VALFILEIEN^SDES2VALUTIL(.VAL,.ERRORS,44,CLINICIEN,1,,18,19)
+17 DO VALAPPTLENGTH(.ERRORS,$$GET1^DIQ(44,CLINICIEN,1912,"I"),CLINICIEN)
if $DATA(ERRORS)
QUIT
+18 DO VALSTARTHOUR^SDES2VAL44(.ERRORS,.CLINICSTARTHOUR)
+19 DO VALIDATEDATETIME^SDES2CRTCLNAVL2B(.ERRORS,CLINICIEN,.AVAILABILITY,NUMBEROFENTRIES)
+20 DO VALIDATESLOTS(.ERRORS,.AVAILABILITY)
+21 DO VALIDATEINDEF(.ERRORS,.AVAILABILITY)
+22 DO PATTERNLENGTH^SDES2CRTCLNAVL2B(.ERRORS,.AVAILABILITY,CLINICIEN,CLINICSTARTHOUR,$$GET1^DIQ(44,CLINICIEN,1917,"I"))
+23 QUIT
+24 ;
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 SET CNT=0
+7 FOR
SET CNT=$ORDER(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"START DATE TIME",CNT))
if 'CNT
QUIT
Begin DoDot:2
+8 IF $GET(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))=""
DO ERRLOG^SDES2JSON(.ERRORS,592)
QUIT
+9 IF '$DATA(AVAILABILITY("TIMESLOT",TIMESLOTCNT,"INDEFINITE",CNT))
DO ERRLOG^SDES2JSON(.ERRORS,592)
QUIT
+10 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
+11 QUIT
+12 ;
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