SDES2SEARCHSLOTS ;ALB/BLB,MCB,BLB,JAS,BLB - SDES2 SEARCH CLINIC SLOTS ;Oct 22, 2025
;;5.3;Scheduling;**897,899,908,918,922**;Aug 13, 1993;Build 7
;;Per VHA Directive 6402, this routine should not be modified
;
Q
;
SEARCH(JSON,SDCONTEXT,SEARCH) ;
N ERRORS,WEEKDAYS,NUMBEROFAPPTS,RECURRING,OCCURRING,MATCHINGSLOTS,FREQUENCY,SLOTS,CONSECUTIVEDAYS,STARTDATE
;
D VALIDATE(.ERRORS,.SDCONTEXT,.SEARCH,.WEEKDAYS,.RECURRING,.OCCURRING,.NUMBEROFAPPTS,.FREQUENCY,.STARTDATE)
I $D(ERRORS) S ERRORS("slotSearch",1)="" D BUILDJSON^SDESBUILDJSON(.JSON,.ERRORS) Q
;
D GETSLOTS(.SLOTS,$G(SEARCH("AM OR PM")),$G(SEARCH("LENGTH")),.SEARCH)
D CONSECUTIVEDAYS(.CONSECUTIVEDAYS,.FREQUENCY,.WEEKDAYS,.RECURRING,.OCCURRING,$O(SEARCH("WEEKDAY",""),-1),.STARTDATE,$$ISOTFM^SDAMUTDT($G(SEARCH("START DATE"))))
D MATCHSLOTS(.MATCHINGSLOTS,.CONSECUTIVEDAYS,.SLOTS,.NUMBEROFAPPTS)
;
I '$D(MATCHINGSLOTS) S MATCHINGSLOTS("slotSearch",1)=""
D BUILDJSON^SDES2JSON(.JSON,.MATCHINGSLOTS)
Q
;
MATCHSLOTS(MATCHINGSLOTS,CONSECUTIVEDAYS,SLOTS,NUMBEROFAPPTS) ;
N SLOTSTART,CONSECUTIVEDAY,CLINICIEN,MATCHINGDATE,RESULTCOUNT,MATCHCOUNT,PARTIALMATCHES,MISS,DEAD,NEXTWEEK
;
S CLINICIEN=0
F S CLINICIEN=$O(SLOTS(CLINICIEN)) Q:'CLINICIEN K RESULTCOUNT D
.;
.S CONSECUTIVEDAY=0,NEXTWEEK=0
.F S CONSECUTIVEDAY=$O(CONSECUTIVEDAYS(CONSECUTIVEDAY)) Q:'CONSECUTIVEDAY!($G(RESULTCOUNT)=10) D
..;
..S SLOTSTART=CONSECUTIVEDAY K PARTIALMATCHES
..F S SLOTSTART=$O(SLOTS(CLINICIEN,SLOTSTART)),MATCHCOUNT=0 Q:'SLOTSTART!($P(SLOTSTART,".")>CONSECUTIVEDAY)!($G(RESULTCOUNT)=10) D
...;
...S MATCHINGDATE=$$FMADD^XLFDT(CONSECUTIVEDAY,-1),MISS=0,DEAD=0
...F S MATCHINGDATE=$O(CONSECUTIVEDAYS(MATCHINGDATE))_"."_$P(SLOTSTART,".",2) Q:'MATCHINGDATE!($G(MATCHCOUNT)=NUMBEROFAPPTS)!(DEAD) D
....;
....I $D(SLOTS(CLINICIEN,MATCHINGDATE)) D Q
.....S RESULTCOUNT=$O(MATCHINGSLOTS("slotSearch",CLINICIEN,"result",""),-1)+1
.....D BUILDMATCHES(.MATCHINGSLOTS,.PARTIALMATCHES,.MATCHCOUNT,.RESULTCOUNT,MATCHINGDATE,NUMBEROFAPPTS,CLINICIEN)
....;
....I '$G(MISS) S MISS=1 Q
....S DEAD=1
Q
;
CONSECUTIVEDAYS(CONSECUTIVEDAYS,FREQUENCY,WEEKDAYS,RECURRING,OCCURRING,WEEKDAYCOUNT,DATE,STARTDATE) ;
N WEEKCOUNT,KEPTLASTDATE,SKIPPEDLASTDATE,FIRSTWEEKMATCHES,FIRSTMONTHMATCH,WEEKS,VARIABLELENGTH,WEEKDAYOFFSET,LASTDAYFIRSTWEEK
;
S FIRSTWEEKMATCHES=0,FIRSTMONTHMATCH=0,SKIPPEDLASTDATE=0,KEPTLASTDATE=0,LASTDAYFIRSTWEEK=0
S LASTDAYFIRSTWEEK=$$FMADD^XLFDT(STARTDATE,6-$$FMTH^XLFDT(STARTDATE)+3#7)
S DATE=$E(DATE,1,5)_"01"
S DATE=$S(FREQUENCY="DAILY":$$FMADD^XLFDT(STARTDATE,-RECURRING),FREQUENCY="WEEKS":$$FMADD^XLFDT(STARTDATE,-1),1:$$FMADD^XLFDT(DATE,-1))
F S DATE=$$FMADD^XLFDT(DATE,$S(FREQUENCY="DAILY":RECURRING,1:1)) Q:DATE>=$$FMADD^XLFDT(STARTDATE,390) D
.;
.I FREQUENCY="DAILY" S CONSECUTIVEDAYS(DATE)="" Q
.I '$D(WEEKDAYS($$FMTH^XLFDT(DATE)+4#7)) Q
.;
.S WEEKCOUNT=$O(WEEKS($E(DATE,2,3),$E(DATE,4,5),$$DOW^XLFDT(DATE),""),-1)+1
.S WEEKS($E(DATE,2,3),$E(DATE,4,5),$$DOW^XLFDT(DATE),WEEKCOUNT)=DATE
.;
.I WEEKCOUNT'=$G(OCCURRING),FREQUENCY'="WEEKS" Q
.;
.I FREQUENCY="MONTHS",FIRSTMONTHMATCH<WEEKDAYCOUNT D Q
..S CONSECUTIVEDAYS(DATE)=""
..S FIRSTMONTHMATCH=FIRSTMONTHMATCH+1
.;
.I FREQUENCY="WEEKS",DATE'>LASTDAYFIRSTWEEK D Q
..S CONSECUTIVEDAYS(DATE)=""
.;
.I WEEKDAYCOUNT*(RECURRING-1)>SKIPPEDLASTDATE D Q
..S SKIPPEDLASTDATE=SKIPPEDLASTDATE+1 Q
.;
.S KEPTLASTDATE=KEPTLASTDATE+1
.I KEPTLASTDATE=WEEKDAYCOUNT D
..S KEPTLASTDATE=0,SKIPPEDLASTDATE=0
.;
.S CONSECUTIVEDAYS(DATE)=""
Q
;
GETSLOTS(SLOTS,AMPM,LENGTH,SEARCH) ;
N CLINCOUNT,CLINICIEN,SLOTCOUNT,SLOTSTART,CLINICLENGTH,VARIABLELENGTH
;
S CLINCOUNT=0
F S CLINCOUNT=$O(SEARCH("CLINIC IEN",CLINCOUNT)) Q:'CLINCOUNT D
.;
.S CLINICIEN=$G(SEARCH("CLINIC IEN",CLINCOUNT))
.S CLINICLENGTH=$$GET1^DIQ(44,CLINICIEN,1912,"I")
.S VARIABLELENGTH=$$GET1^DIQ(44,CLINICIEN,1913,"I")
.;
.I LENGTH'=CLINICLENGTH,VARIABLELENGTH'="V" Q
.I LENGTH'=CLINICLENGTH,VARIABLELENGTH="V",LENGTH#CLINICLENGTH'=0 Q
.;
.K @$NA(^TMP($J,"SLOTSEARCH"))
.D GETSLOTS^SDEC57($NA(^TMP($J,"SLOTSEARCH")),$$GETRES^SDES2UTIL1(CLINICIEN),SEARCH("START DATE"),$$FMADD^XLFDT($$ISOTFM^SDAMUTDT(SEARCH("START DATE"),CLINICIEN),390))
.;
.S SLOTCOUNT=0
.F S SLOTCOUNT=$O(^TMP($J,"SLOTSEARCH",SLOTCOUNT)) Q:'SLOTCOUNT D
..;
..S SLOTSTART=+$P($G(^TMP($J,"SLOTSEARCH",SLOTCOUNT)),U,2)
..I $L(AMPM),AMPM'=$S($P(SLOTSTART,".")_.12>SLOTSTART:"AM",1:"PM") Q
..I $P($G(^TMP($J,"SLOTSEARCH",SLOTCOUNT)),U,4)'>0 Q
..;
..I '$P(SLOTSTART,".",2) D
...S SLOTSTART=SLOTSTART_".0001"
..;
..S SLOTS(CLINICIEN,SLOTSTART)=""
Q
;
BUILDMATCHES(MATCHINGSLOTS,PARTIALMATCHES,MATCHCOUNT,RESULTCOUNT,MATCHINGDATE,NUMBEROFAPPTS,CLINICIEN) ;
N MIDNIGHT,CLINICNAME
;
S CLINICNAME=$$GET1^DIQ(44,CLINICIEN,.01)
S MATCHCOUNT=$G(MATCHCOUNT)+1
S PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT)=$$FMTISO^SDAMUTDT(MATCHINGDATE,CLINICIEN)
;
I $P($P(PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT),":",2),"-")="01" D
.S MIDNIGHT=$P(PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT),":")
.S MIDNIGHT=MIDNIGHT_":00-"_$P(PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT),"-",4)
.S PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT)=MIDNIGHT
;
I MATCHCOUNT=NUMBEROFAPPTS D
.M MATCHINGSLOTS=PARTIALMATCHES K PARTIALMATCHES
.S MATCHINGSLOTS("slotSearch",CLINICIEN,"defaultProvider")=$$DEFAULTPROVIDER(CLINICIEN)
.S MATCHINGSLOTS("slotSearch",CLINICIEN,"clinicName")=CLINICNAME
.S MATCHINGSLOTS("slotSearch",CLINICIEN,"clinicIen")=CLINICIEN
Q
;
DEFAULTPROVIDER(CLINICIEN) ;
N PROVIDERIEN,DEFAULTPROVIEN
;
S PROVIDERIEN=0,DEFAULTPROVIEN=""
F S PROVIDERIEN=$O(^SC(CLINICIEN,"PR",PROVIDERIEN)) Q:'PROVIDERIEN!($G(DEFAULTPROVIEN)) D
.I $$GET1^DIQ(44.1,PROVIDERIEN_","_CLINICIEN_",",.02,"I") S DEFAULTPROVIEN=$$GET1^DIQ(44.1,PROVIDERIEN_","_CLINICIEN_",",.01,"I")
Q $$GET1^DIQ(200,DEFAULTPROVIEN,.01,"E")
;
NEXTVALIDWEEKDAY(WEEKDAY) ;
N DIFF
;
S DIFF=WEEKDAY-$$DOW^XLFDT(DT,1)
I DIFF<0 S DIFF=DIFF+7
Q $$FMADD^XLFDT(DT,DIFF)
;
VALIDATE(ERRORS,SDCONTEXT,SEARCH,WEEKDAYS,RECURRING,OCCURRING,NUMBEROFAPPTS,FREQUENCY,STARTDATE) ;
D VALCONTEXT^SDES2VALCONTEXT(.ERRORS,.SDCONTEXT)
I $D(ERRORS) Q
;
D VALIDATECLINIC(.ERRORS,.SEARCH)
D VALIDATELENGTH(.ERRORS,.SEARCH)
D VALIDATENUMAPPTS(.ERRORS,.SEARCH,.NUMBEROFAPPTS)
D VALIDATEFREQUENC(.ERRORS,.SEARCH,.FREQUENCY)
D VALIDATEWEEKDAYS(.ERRORS,.SEARCH,.WEEKDAYS,.FREQUENCY)
I $D(ERRORS) Q
;
D VALIDATERECUR(.ERRORS,.SEARCH,.RECURRING,$G(SEARCH("RECURRING EVERY")),$G(SEARCH("FREQUENCY")))
D VALIDATEOCCUR(.ERRORS,.SEARCH,.OCCURRING,$G(SEARCH("FREQUENCY")),$G(SEARCH("OCCURRING EVERY")))
;
S STARTDATE=$$VALISODTTM^SDES2VALISODTTM(.ERRORS,$G(SEARCH("START DATE")),,1,572,299)
I $D(ERRORS) Q
;
I $L($P($$FMTISO^SDAMUTDT($G(SEARCH("START DATE"))),"T",2)) D ERRLOG^SDES2JSON(618,.ERRORS,)
I $$ISOTFM^SDAMUTDT($G(SEARCH("START DATE")))<DT D ERRLOG^SDES2JSON(.ERRORS,71)
I $L($G(SEARCH("AM OR PM"))),$G(SEARCH("AM OR PM"))'="AM",$G(SEARCH("AM OR PM"))'="PM" D ERRLOG^SDES2JSON(.ERRORS,607)
Q
;
VALIDATEOCCUR(ERRORS,SEARCH,OCCURRING,FREQUENCY,OCCURRENCE) ;
I FREQUENCY'="MONTHS" Q
I '$L($G(OCCURRENCE)) D ERRLOG^SDES2JSON(.ERRORS,617) Q
I OCCURRENCE<1!(OCCURRENCE>5) D ERRLOG^SDES2JSON(.ERRORS,618) Q
S OCCURRING=$G(SEARCH("OCCURRING EVERY"))
Q
;
VALIDATERECUR(ERRORS,SEARCH,RECURRING,RECURRENCE,FREQUENCY) ;
I '$L($G(RECURRENCE)) D ERRLOG^SDES2JSON(.ERRORS,615) Q
I '$G(RECURRENCE) D ERRLOG^SDES2JSON(.ERRORS,616) Q
I RECURRENCE'>0 D ERRLOG^SDES2JSON(.ERRORS,616) Q
;
I $G(FREQUENCY)="DAILY",RECURRENCE>390 D ERRLOG^SDES2JSON(.ERRORS,616) Q
I $G(FREQUENCY)="WEEKS",RECURRENCE>55 D ERRLOG^SDES2JSON(.ERRORS,616) Q
I $G(FREQUENCY)="MONTHS",RECURRENCE>12 D ERRLOG^SDES2JSON(.ERRORS,616) Q
;
S RECURRING=$G(SEARCH("RECURRING EVERY"))
Q
;
VALIDATEFREQUENC(ERRORS,SEARCH,FREQUENCY) ;
S FREQUENCY=$G(SEARCH("FREQUENCY"))
I '$L(FREQUENCY) D ERRLOG^SDES2JSON(.ERRORS,611) Q
I FREQUENCY'="DAILY",FREQUENCY'="WEEKS",FREQUENCY'="MONTHS" D ERRLOG^SDES2JSON(.ERRORS,610) Q
Q
;
WEEKDAYNUM(WEEKDAY) ;
Q $S(WEEKDAY="SUNDAY":0,WEEKDAY="MONDAY":1,WEEKDAY="TUESDAY":2,WEEKDAY="WEDNESDAY":3,WEEKDAY="THURSDAY":4,WEEKDAY="FRIDAY":5,WEEKDAY="SATURDAY":6,1:"")
;
VALIDATEWEEKDAYS(ERRORS,SEARCH,WEEKDAYS,FREQUENCY) ;
N COUNT,DAYOFTHEWEEK
;
I FREQUENCY="DAILY" Q
I '$L($G(SEARCH("WEEKDAY",1))) D ERRLOG^SDES2JSON(.ERRORS,609) Q
;
S COUNT=0
F S COUNT=$O(SEARCH("WEEKDAY",COUNT)) Q:'COUNT!($D(ERRORS)) D
.S DAYOFTHEWEEK=$G(SEARCH("WEEKDAY",COUNT))
.I DAYOFTHEWEEK'="SUNDAY",DAYOFTHEWEEK'="MONDAY",DAYOFTHEWEEK'="TUESDAY",DAYOFTHEWEEK'="WEDNESDAY",DAYOFTHEWEEK'="THURSDAY",DAYOFTHEWEEK'="FRIDAY",DAYOFTHEWEEK'="SATURDAY" D ERRLOG^SDES2JSON(.ERRORS,608) Q
.S WEEKDAYS($$WEEKDAYNUM(SEARCH("WEEKDAY",COUNT)))=SEARCH("WEEKDAY",COUNT)
Q
;
VALIDATENUMAPPTS(ERRORS,SEARCH,NUMBEROFAPPTS) ;
S NUMBEROFAPPTS=$G(SEARCH("NUMBER OF APPTS"))
I '$L(NUMBEROFAPPTS) D ERRLOG^SDES2JSON(.ERRORS,606) Q
I NUMBEROFAPPTS<2!(NUMBEROFAPPTS>60) D ERRLOG^SDES2JSON(.ERRORS,605) Q
Q
;
VALIDATECLINIC(ERRORS,SEARCH) ;
N COUNT
;
I '$G(SEARCH("CLINIC IEN",1)) D ERRLOG^SDES2JSON(.ERRORS,18) Q
S COUNT=0
F S COUNT=$O(SEARCH("CLINIC IEN",COUNT)) Q:'COUNT!($D(ERRORS)) D
.I '$G(SEARCH("CLINIC IEN",COUNT)) D ERRLOG^SDES2JSON(.ERRORS,18) Q
.I '$D(^SC($G(SEARCH("CLINIC IEN",COUNT)))) D ERRLOG^SDES2JSON(.ERRORS,19) Q
.I $$INACTIVE^SDESUTIL($G(SEARCH("CLINIC IEN",COUNT))) D ERRLOG^SDES2JSON(.ERRORS,525)
Q
;
VALIDATELENGTH(ERRORS,SEARCH) ;
N LENGTH
;
S LENGTH=$G(SEARCH("LENGTH"))
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
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDES2SEARCHSLOTS 10053 printed Jan 29, 2026@15:53:54 Page 2
SDES2SEARCHSLOTS ;ALB/BLB,MCB,BLB,JAS,BLB - SDES2 SEARCH CLINIC SLOTS ;Oct 22, 2025
+1 ;;5.3;Scheduling;**897,899,908,918,922**;Aug 13, 1993;Build 7
+2 ;;Per VHA Directive 6402, this routine should not be modified
+3 ;
+4 QUIT
+5 ;
SEARCH(JSON,SDCONTEXT,SEARCH) ;
+1 NEW ERRORS,WEEKDAYS,NUMBEROFAPPTS,RECURRING,OCCURRING,MATCHINGSLOTS,FREQUENCY,SLOTS,CONSECUTIVEDAYS,STARTDATE
+2 ;
+3 DO VALIDATE(.ERRORS,.SDCONTEXT,.SEARCH,.WEEKDAYS,.RECURRING,.OCCURRING,.NUMBEROFAPPTS,.FREQUENCY,.STARTDATE)
+4 IF $DATA(ERRORS)
SET ERRORS("slotSearch",1)=""
DO BUILDJSON^SDESBUILDJSON(.JSON,.ERRORS)
QUIT
+5 ;
+6 DO GETSLOTS(.SLOTS,$GET(SEARCH("AM OR PM")),$GET(SEARCH("LENGTH")),.SEARCH)
+7 DO CONSECUTIVEDAYS(.CONSECUTIVEDAYS,.FREQUENCY,.WEEKDAYS,.RECURRING,.OCCURRING,$ORDER(SEARCH("WEEKDAY",""),-1),.STARTDATE,$$ISOTFM^SDAMUTDT($GET(SEARCH("START DATE"))))
+8 DO MATCHSLOTS(.MATCHINGSLOTS,.CONSECUTIVEDAYS,.SLOTS,.NUMBEROFAPPTS)
+9 ;
+10 IF '$DATA(MATCHINGSLOTS)
SET MATCHINGSLOTS("slotSearch",1)=""
+11 DO BUILDJSON^SDES2JSON(.JSON,.MATCHINGSLOTS)
+12 QUIT
+13 ;
MATCHSLOTS(MATCHINGSLOTS,CONSECUTIVEDAYS,SLOTS,NUMBEROFAPPTS) ;
+1 NEW SLOTSTART,CONSECUTIVEDAY,CLINICIEN,MATCHINGDATE,RESULTCOUNT,MATCHCOUNT,PARTIALMATCHES,MISS,DEAD,NEXTWEEK
+2 ;
+3 SET CLINICIEN=0
+4 FOR
SET CLINICIEN=$ORDER(SLOTS(CLINICIEN))
if 'CLINICIEN
QUIT
KILL RESULTCOUNT
Begin DoDot:1
+5 ;
+6 SET CONSECUTIVEDAY=0
SET NEXTWEEK=0
+7 FOR
SET CONSECUTIVEDAY=$ORDER(CONSECUTIVEDAYS(CONSECUTIVEDAY))
if 'CONSECUTIVEDAY!($GET(RESULTCOUNT)=10)
QUIT
Begin DoDot:2
+8 ;
+9 SET SLOTSTART=CONSECUTIVEDAY
KILL PARTIALMATCHES
+10 FOR
SET SLOTSTART=$ORDER(SLOTS(CLINICIEN,SLOTSTART))
SET MATCHCOUNT=0
if 'SLOTSTART!($PIECE(SLOTSTART,".")>CONSECUTIVEDAY)!($GET(RESULTCOUNT)=10)
QUIT
Begin DoDot:3
+11 ;
+12 SET MATCHINGDATE=$$FMADD^XLFDT(CONSECUTIVEDAY,-1)
SET MISS=0
SET DEAD=0
+13 FOR
SET MATCHINGDATE=$ORDER(CONSECUTIVEDAYS(MATCHINGDATE))_"."_$PIECE(SLOTSTART,".",2)
if 'MATCHINGDATE!($GET(MATCHCOUNT)=NUMBEROFAPPTS)!(DEAD)
QUIT
Begin DoDot:4
+14 ;
+15 IF $DATA(SLOTS(CLINICIEN,MATCHINGDATE))
Begin DoDot:5
+16 SET RESULTCOUNT=$ORDER(MATCHINGSLOTS("slotSearch",CLINICIEN,"result",""),-1)+1
+17 DO BUILDMATCHES(.MATCHINGSLOTS,.PARTIALMATCHES,.MATCHCOUNT,.RESULTCOUNT,MATCHINGDATE,NUMBEROFAPPTS,CLINICIEN)
End DoDot:5
QUIT
+18 ;
+19 IF '$GET(MISS)
SET MISS=1
QUIT
+20 SET DEAD=1
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+21 QUIT
+22 ;
CONSECUTIVEDAYS(CONSECUTIVEDAYS,FREQUENCY,WEEKDAYS,RECURRING,OCCURRING,WEEKDAYCOUNT,DATE,STARTDATE) ;
+1 NEW WEEKCOUNT,KEPTLASTDATE,SKIPPEDLASTDATE,FIRSTWEEKMATCHES,FIRSTMONTHMATCH,WEEKS,VARIABLELENGTH,WEEKDAYOFFSET,LASTDAYFIRSTWEEK
+2 ;
+3 SET FIRSTWEEKMATCHES=0
SET FIRSTMONTHMATCH=0
SET SKIPPEDLASTDATE=0
SET KEPTLASTDATE=0
SET LASTDAYFIRSTWEEK=0
+4 SET LASTDAYFIRSTWEEK=$$FMADD^XLFDT(STARTDATE,6-$$FMTH^XLFDT(STARTDATE)+3#7)
+5 SET DATE=$EXTRACT(DATE,1,5)_"01"
+6 SET DATE=$SELECT(FREQUENCY="DAILY":$$FMADD^XLFDT(STARTDATE,-RECURRING),FREQUENCY="WEEKS":$$FMADD^XLFDT(STARTDATE,-1),1:$$FMADD^XLFDT(DATE,-1))
+7 FOR
SET DATE=$$FMADD^XLFDT(DATE,$SELECT(FREQUENCY="DAILY":RECURRING,1:1))
if DATE>=$$FMADD^XLFDT(STARTDATE,390)
QUIT
Begin DoDot:1
+8 ;
+9 IF FREQUENCY="DAILY"
SET CONSECUTIVEDAYS(DATE)=""
QUIT
+10 IF '$DATA(WEEKDAYS($$FMTH^XLFDT(DATE)+4#7))
QUIT
+11 ;
+12 SET WEEKCOUNT=$ORDER(WEEKS($EXTRACT(DATE,2,3),$EXTRACT(DATE,4,5),$$DOW^XLFDT(DATE),""),-1)+1
+13 SET WEEKS($EXTRACT(DATE,2,3),$EXTRACT(DATE,4,5),$$DOW^XLFDT(DATE),WEEKCOUNT)=DATE
+14 ;
+15 IF WEEKCOUNT'=$GET(OCCURRING)
IF FREQUENCY'="WEEKS"
QUIT
+16 ;
+17 IF FREQUENCY="MONTHS"
IF FIRSTMONTHMATCH<WEEKDAYCOUNT
Begin DoDot:2
+18 SET CONSECUTIVEDAYS(DATE)=""
+19 SET FIRSTMONTHMATCH=FIRSTMONTHMATCH+1
End DoDot:2
QUIT
+20 ;
+21 IF FREQUENCY="WEEKS"
IF DATE'>LASTDAYFIRSTWEEK
Begin DoDot:2
+22 SET CONSECUTIVEDAYS(DATE)=""
End DoDot:2
QUIT
+23 ;
+24 IF WEEKDAYCOUNT*(RECURRING-1)>SKIPPEDLASTDATE
Begin DoDot:2
+25 SET SKIPPEDLASTDATE=SKIPPEDLASTDATE+1
QUIT
End DoDot:2
QUIT
+26 ;
+27 SET KEPTLASTDATE=KEPTLASTDATE+1
+28 IF KEPTLASTDATE=WEEKDAYCOUNT
Begin DoDot:2
+29 SET KEPTLASTDATE=0
SET SKIPPEDLASTDATE=0
End DoDot:2
+30 ;
+31 SET CONSECUTIVEDAYS(DATE)=""
End DoDot:1
+32 QUIT
+33 ;
GETSLOTS(SLOTS,AMPM,LENGTH,SEARCH) ;
+1 NEW CLINCOUNT,CLINICIEN,SLOTCOUNT,SLOTSTART,CLINICLENGTH,VARIABLELENGTH
+2 ;
+3 SET CLINCOUNT=0
+4 FOR
SET CLINCOUNT=$ORDER(SEARCH("CLINIC IEN",CLINCOUNT))
if 'CLINCOUNT
QUIT
Begin DoDot:1
+5 ;
+6 SET CLINICIEN=$GET(SEARCH("CLINIC IEN",CLINCOUNT))
+7 SET CLINICLENGTH=$$GET1^DIQ(44,CLINICIEN,1912,"I")
+8 SET VARIABLELENGTH=$$GET1^DIQ(44,CLINICIEN,1913,"I")
+9 ;
+10 IF LENGTH'=CLINICLENGTH
IF VARIABLELENGTH'="V"
QUIT
+11 IF LENGTH'=CLINICLENGTH
IF VARIABLELENGTH="V"
IF LENGTH#CLINICLENGTH'=0
QUIT
+12 ;
+13 KILL @$NAME(^TMP($JOB,"SLOTSEARCH"))
+14 DO GETSLOTS^SDEC57($NAME(^TMP($JOB,"SLOTSEARCH")),$$GETRES^SDES2UTIL1(CLINICIEN),SEARCH("START DATE"),$$FMADD^XLFDT($$ISOTFM^SDAMUTDT(SEARCH("START DATE"),CLINICIEN),390))
+15 ;
+16 SET SLOTCOUNT=0
+17 FOR
SET SLOTCOUNT=$ORDER(^TMP($JOB,"SLOTSEARCH",SLOTCOUNT))
if 'SLOTCOUNT
QUIT
Begin DoDot:2
+18 ;
+19 SET SLOTSTART=+$PIECE($GET(^TMP($JOB,"SLOTSEARCH",SLOTCOUNT)),U,2)
+20 IF $LENGTH(AMPM)
IF AMPM'=$SELECT($PIECE(SLOTSTART,".")_.12>SLOTSTART:"AM",1:"PM")
QUIT
+21 IF $PIECE($GET(^TMP($JOB,"SLOTSEARCH",SLOTCOUNT)),U,4)'>0
QUIT
+22 ;
+23 IF '$PIECE(SLOTSTART,".",2)
Begin DoDot:3
+24 SET SLOTSTART=SLOTSTART_".0001"
End DoDot:3
+25 ;
+26 SET SLOTS(CLINICIEN,SLOTSTART)=""
End DoDot:2
End DoDot:1
+27 QUIT
+28 ;
BUILDMATCHES(MATCHINGSLOTS,PARTIALMATCHES,MATCHCOUNT,RESULTCOUNT,MATCHINGDATE,NUMBEROFAPPTS,CLINICIEN) ;
+1 NEW MIDNIGHT,CLINICNAME
+2 ;
+3 SET CLINICNAME=$$GET1^DIQ(44,CLINICIEN,.01)
+4 SET MATCHCOUNT=$GET(MATCHCOUNT)+1
+5 SET PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT)=$$FMTISO^SDAMUTDT(MATCHINGDATE,CLINICIEN)
+6 ;
+7 IF $PIECE($PIECE(PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT),":",2),"-")="01"
Begin DoDot:1
+8 SET MIDNIGHT=$PIECE(PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT),":")
+9 SET MIDNIGHT=MIDNIGHT_":00-"_$PIECE(PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT),"-",4)
+10 SET PARTIALMATCHES("slotSearch",CLINICIEN,"result",RESULTCOUNT,"apptDateTime",MATCHCOUNT)=MIDNIGHT
End DoDot:1
+11 ;
+12 IF MATCHCOUNT=NUMBEROFAPPTS
Begin DoDot:1
+13 MERGE MATCHINGSLOTS=PARTIALMATCHES
KILL PARTIALMATCHES
+14 SET MATCHINGSLOTS("slotSearch",CLINICIEN,"defaultProvider")=$$DEFAULTPROVIDER(CLINICIEN)
+15 SET MATCHINGSLOTS("slotSearch",CLINICIEN,"clinicName")=CLINICNAME
+16 SET MATCHINGSLOTS("slotSearch",CLINICIEN,"clinicIen")=CLINICIEN
End DoDot:1
+17 QUIT
+18 ;
DEFAULTPROVIDER(CLINICIEN) ;
+1 NEW PROVIDERIEN,DEFAULTPROVIEN
+2 ;
+3 SET PROVIDERIEN=0
SET DEFAULTPROVIEN=""
+4 FOR
SET PROVIDERIEN=$ORDER(^SC(CLINICIEN,"PR",PROVIDERIEN))
if 'PROVIDERIEN!($GET(DEFAULTPROVIEN))
QUIT
Begin DoDot:1
+5 IF $$GET1^DIQ(44.1,PROVIDERIEN_","_CLINICIEN_",",.02,"I")
SET DEFAULTPROVIEN=$$GET1^DIQ(44.1,PROVIDERIEN_","_CLINICIEN_",",.01,"I")
End DoDot:1
+6 QUIT $$GET1^DIQ(200,DEFAULTPROVIEN,.01,"E")
+7 ;
NEXTVALIDWEEKDAY(WEEKDAY) ;
+1 NEW DIFF
+2 ;
+3 SET DIFF=WEEKDAY-$$DOW^XLFDT(DT,1)
+4 IF DIFF<0
SET DIFF=DIFF+7
+5 QUIT $$FMADD^XLFDT(DT,DIFF)
+6 ;
VALIDATE(ERRORS,SDCONTEXT,SEARCH,WEEKDAYS,RECURRING,OCCURRING,NUMBEROFAPPTS,FREQUENCY,STARTDATE) ;
+1 DO VALCONTEXT^SDES2VALCONTEXT(.ERRORS,.SDCONTEXT)
+2 IF $DATA(ERRORS)
QUIT
+3 ;
+4 DO VALIDATECLINIC(.ERRORS,.SEARCH)
+5 DO VALIDATELENGTH(.ERRORS,.SEARCH)
+6 DO VALIDATENUMAPPTS(.ERRORS,.SEARCH,.NUMBEROFAPPTS)
+7 DO VALIDATEFREQUENC(.ERRORS,.SEARCH,.FREQUENCY)
+8 DO VALIDATEWEEKDAYS(.ERRORS,.SEARCH,.WEEKDAYS,.FREQUENCY)
+9 IF $DATA(ERRORS)
QUIT
+10 ;
+11 DO VALIDATERECUR(.ERRORS,.SEARCH,.RECURRING,$GET(SEARCH("RECURRING EVERY")),$GET(SEARCH("FREQUENCY")))
+12 DO VALIDATEOCCUR(.ERRORS,.SEARCH,.OCCURRING,$GET(SEARCH("FREQUENCY")),$GET(SEARCH("OCCURRING EVERY")))
+13 ;
+14 SET STARTDATE=$$VALISODTTM^SDES2VALISODTTM(.ERRORS,$GET(SEARCH("START DATE")),,1,572,299)
+15 IF $DATA(ERRORS)
QUIT
+16 ;
+17 IF $LENGTH($PIECE($$FMTISO^SDAMUTDT($GET(SEARCH("START DATE"))),"T",2))
DO ERRLOG^SDES2JSON(618,.ERRORS,)
+18 IF $$ISOTFM^SDAMUTDT($GET(SEARCH("START DATE")))<DT
DO ERRLOG^SDES2JSON(.ERRORS,71)
+19 IF $LENGTH($GET(SEARCH("AM OR PM")))
IF $GET(SEARCH("AM OR PM"))'="AM"
IF $GET(SEARCH("AM OR PM"))'="PM"
DO ERRLOG^SDES2JSON(.ERRORS,607)
+20 QUIT
+21 ;
VALIDATEOCCUR(ERRORS,SEARCH,OCCURRING,FREQUENCY,OCCURRENCE) ;
+1 IF FREQUENCY'="MONTHS"
QUIT
+2 IF '$LENGTH($GET(OCCURRENCE))
DO ERRLOG^SDES2JSON(.ERRORS,617)
QUIT
+3 IF OCCURRENCE<1!(OCCURRENCE>5)
DO ERRLOG^SDES2JSON(.ERRORS,618)
QUIT
+4 SET OCCURRING=$GET(SEARCH("OCCURRING EVERY"))
+5 QUIT
+6 ;
VALIDATERECUR(ERRORS,SEARCH,RECURRING,RECURRENCE,FREQUENCY) ;
+1 IF '$LENGTH($GET(RECURRENCE))
DO ERRLOG^SDES2JSON(.ERRORS,615)
QUIT
+2 IF '$GET(RECURRENCE)
DO ERRLOG^SDES2JSON(.ERRORS,616)
QUIT
+3 IF RECURRENCE'>0
DO ERRLOG^SDES2JSON(.ERRORS,616)
QUIT
+4 ;
+5 IF $GET(FREQUENCY)="DAILY"
IF RECURRENCE>390
DO ERRLOG^SDES2JSON(.ERRORS,616)
QUIT
+6 IF $GET(FREQUENCY)="WEEKS"
IF RECURRENCE>55
DO ERRLOG^SDES2JSON(.ERRORS,616)
QUIT
+7 IF $GET(FREQUENCY)="MONTHS"
IF RECURRENCE>12
DO ERRLOG^SDES2JSON(.ERRORS,616)
QUIT
+8 ;
+9 SET RECURRING=$GET(SEARCH("RECURRING EVERY"))
+10 QUIT
+11 ;
VALIDATEFREQUENC(ERRORS,SEARCH,FREQUENCY) ;
+1 SET FREQUENCY=$GET(SEARCH("FREQUENCY"))
+2 IF '$LENGTH(FREQUENCY)
DO ERRLOG^SDES2JSON(.ERRORS,611)
QUIT
+3 IF FREQUENCY'="DAILY"
IF FREQUENCY'="WEEKS"
IF FREQUENCY'="MONTHS"
DO ERRLOG^SDES2JSON(.ERRORS,610)
QUIT
+4 QUIT
+5 ;
WEEKDAYNUM(WEEKDAY) ;
+1 QUIT $SELECT(WEEKDAY="SUNDAY":0,WEEKDAY="MONDAY":1,WEEKDAY="TUESDAY":2,WEEKDAY="WEDNESDAY":3,WEEKDAY="THURSDAY":4,WEEKDAY="FRIDAY":5,WEEKDAY="SATURDAY":6,1:"")
+2 ;
VALIDATEWEEKDAYS(ERRORS,SEARCH,WEEKDAYS,FREQUENCY) ;
+1 NEW COUNT,DAYOFTHEWEEK
+2 ;
+3 IF FREQUENCY="DAILY"
QUIT
+4 IF '$LENGTH($GET(SEARCH("WEEKDAY",1)))
DO ERRLOG^SDES2JSON(.ERRORS,609)
QUIT
+5 ;
+6 SET COUNT=0
+7 FOR
SET COUNT=$ORDER(SEARCH("WEEKDAY",COUNT))
if 'COUNT!($DATA(ERRORS))
QUIT
Begin DoDot:1
+8 SET DAYOFTHEWEEK=$GET(SEARCH("WEEKDAY",COUNT))
+9 IF DAYOFTHEWEEK'="SUNDAY"
IF DAYOFTHEWEEK'="MONDAY"
IF DAYOFTHEWEEK'="TUESDAY"
IF DAYOFTHEWEEK'="WEDNESDAY"
IF DAYOFTHEWEEK'="THURSDAY"
IF DAYOFTHEWEEK'="FRIDAY"
IF DAYOFTHEWEEK'="SATURDAY"
DO ERRLOG^SDES2JSON(.ERRORS,608)
QUIT
+10 SET WEEKDAYS($$WEEKDAYNUM(SEARCH("WEEKDAY",COUNT)))=SEARCH("WEEKDAY",COUNT)
End DoDot:1
+11 QUIT
+12 ;
VALIDATENUMAPPTS(ERRORS,SEARCH,NUMBEROFAPPTS) ;
+1 SET NUMBEROFAPPTS=$GET(SEARCH("NUMBER OF APPTS"))
+2 IF '$LENGTH(NUMBEROFAPPTS)
DO ERRLOG^SDES2JSON(.ERRORS,606)
QUIT
+3 IF NUMBEROFAPPTS<2!(NUMBEROFAPPTS>60)
DO ERRLOG^SDES2JSON(.ERRORS,605)
QUIT
+4 QUIT
+5 ;
VALIDATECLINIC(ERRORS,SEARCH) ;
+1 NEW COUNT
+2 ;
+3 IF '$GET(SEARCH("CLINIC IEN",1))
DO ERRLOG^SDES2JSON(.ERRORS,18)
QUIT
+4 SET COUNT=0
+5 FOR
SET COUNT=$ORDER(SEARCH("CLINIC IEN",COUNT))
if 'COUNT!($DATA(ERRORS))
QUIT
Begin DoDot:1
+6 IF '$GET(SEARCH("CLINIC IEN",COUNT))
DO ERRLOG^SDES2JSON(.ERRORS,18)
QUIT
+7 IF '$DATA(^SC($GET(SEARCH("CLINIC IEN",COUNT))))
DO ERRLOG^SDES2JSON(.ERRORS,19)
QUIT
+8 IF $$INACTIVE^SDESUTIL($GET(SEARCH("CLINIC IEN",COUNT)))
DO ERRLOG^SDES2JSON(.ERRORS,525)
End DoDot:1
+9 QUIT
+10 ;
VALIDATELENGTH(ERRORS,SEARCH) ;
+1 NEW LENGTH
+2 ;
+3 SET LENGTH=$GET(SEARCH("LENGTH"))
+4 IF LENGTH=""
DO ERRLOG^SDES2JSON(.ERRORS,115)
QUIT
+5 IF LENGTH<10!(LENGTH>240)
DO ERRLOG^SDES2JSON(.ERRORS,116)
QUIT
+6 IF LENGTH#10'=0
IF LENGTH#15'=0
DO ERRLOG^SDES2JSON(.ERRORS,116)
+7 QUIT
+8 ;