SDES2SEARCHSLOTS ;ALB/BLB - SDES2 SEARCH CLINIC SLOTS ;May 28, 2025
;;5.3;Scheduling;**897,899,908**;May 28, 2025@8:05pm 1993;Build 2
;;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,RECURRING,FREQUENCY,$O(SEARCH("WEEKDAY",""),-1))
;
I '$D(MATCHINGSLOTS) S MATCHINGSLOTS("slotSearch",1)=""
D BUILDJSON^SDES2JSON(.JSON,.MATCHINGSLOTS)
Q
;
MATCHSLOTS(MATCHINGSLOTS,CONSECUTIVEDAYS,SLOTS,NUMBEROFAPPTS,RECURRING,FREQUENCY,WEEKDAYCOUNT) ;
N SLOTSTART,CONSECUTIVEDAY,CLINICIEN,MATCHINGDATE,RESULTCOUNT,MATCHCOUNT,PARTIALMATCHES,MISS,DEAD,MONTHCOUNT,WEEKCOUNT,SKIPPED,MONTHWEEKDAYCNT,LASTMATCHINGDAY,LASTDAYLASTWEEK,MONTHLYCOUNT
;
S CLINICIEN=0
F S CLINICIEN=$O(SLOTS(CLINICIEN)) Q:'CLINICIEN K RESULTCOUNT D
.;
.S CONSECUTIVEDAY=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=CONSECUTIVEDAY
...S MATCHINGDATE=$$FMADD^XLFDT(CONSECUTIVEDAY,-1),LASTMATCHINGDAY=0,LASTDAYLASTWEEK=0,MONTHCOUNT=0,WEEKCOUNT=0,MISS=0,DEAD=0
...F S MATCHINGDATE=$O(CONSECUTIVEDAYS(MATCHINGDATE))_"."_$P(SLOTSTART,".",2) Q:'MATCHINGDATE!($G(MATCHCOUNT)=NUMBEROFAPPTS)!(DEAD) D
....;
....I FREQUENCY="DAILY",$D(PARTIALMATCHES) D
.....S MATCHINGDATE=$$FMADD^XLFDT($P(MATCHINGDATE,"."),RECURRING-1)_"."_$P(SLOTSTART,".",2)
....;
....I FREQUENCY="WEEKS",$G(LASTDAYLASTWEEK),LASTMATCHINGDAY>=LASTDAYLASTWEEK D
.....S MATCHINGDATE=$$FMADD^XLFDT($P(MATCHINGDATE,"."),7*(RECURRING-1))_"."_$P(SLOTSTART,".",2)
....S LASTMATCHINGDAY=$P(MATCHINGDATE,".")
....S LASTDAYLASTWEEK=$$FMADD^XLFDT(LASTMATCHINGDAY,6-$$FMTH^XLFDT(LASTMATCHINGDAY)+3#7)
....;
....S WEEKCOUNT=WEEKCOUNT+1
....I FREQUENCY="MONTHS",WEEKCOUNT>WEEKDAYCOUNT D Q
.....S MATCHINGDATE=$$FMADD^XLFDT($P(MATCHINGDATE,"."),(28*(RECURRING-1))-1)_("."_$P(SLOTSTART,".",2))
.....S WEEKCOUNT=0
....;
....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,WEEKS
;
S DATE=$E(DATE,1,5)_"01",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,1) Q:DATE>=$$FMADD^XLFDT(STARTDATE,390) D
.;
.I FREQUENCY'="DAILY",'$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 FREQUENCY="MONTHS",WEEKCOUNT'=$G(OCCURRING) Q
.;
.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")!($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")
;
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 10061 printed Sep 23, 2025@20:31:19 Page 2
SDES2SEARCHSLOTS ;ALB/BLB - SDES2 SEARCH CLINIC SLOTS ;May 28, 2025
+1 ;;5.3;Scheduling;**897,899,908**;May 28, 2025@8:05pm 1993;Build 2
+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,RECURRING,FREQUENCY,$ORDER(SEARCH("WEEKDAY",""),-1))
+9 ;
+10 IF '$DATA(MATCHINGSLOTS)
SET MATCHINGSLOTS("slotSearch",1)=""
+11 DO BUILDJSON^SDES2JSON(.JSON,.MATCHINGSLOTS)
+12 QUIT
+13 ;
MATCHSLOTS(MATCHINGSLOTS,CONSECUTIVEDAYS,SLOTS,NUMBEROFAPPTS,RECURRING,FREQUENCY,WEEKDAYCOUNT) ;
+1 NEW SLOTSTART,CONSECUTIVEDAY,CLINICIEN,MATCHINGDATE,RESULTCOUNT,MATCHCOUNT,PARTIALMATCHES,MISS,DEAD,MONTHCOUNT,WEEKCOUNT,SKIPPED,MONTHWEEKDAYCNT,LASTMATCHINGDAY,LASTDAYLASTWEEK,MONTHLYCOUNT
+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
+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=CONSECUTIVEDAY
+13 SET MATCHINGDATE=$$FMADD^XLFDT(CONSECUTIVEDAY,-1)
SET LASTMATCHINGDAY=0
SET LASTDAYLASTWEEK=0
SET MONTHCOUNT=0
SET WEEKCOUNT=0
SET MISS=0
SET DEAD=0
+14 FOR
SET MATCHINGDATE=$ORDER(CONSECUTIVEDAYS(MATCHINGDATE))_"."_$PIECE(SLOTSTART,".",2)
if 'MATCHINGDATE!($GET(MATCHCOUNT)=NUMBEROFAPPTS)!(DEAD)
QUIT
Begin DoDot:4
+15 ;
+16 IF FREQUENCY="DAILY"
IF $DATA(PARTIALMATCHES)
Begin DoDot:5
+17 SET MATCHINGDATE=$$FMADD^XLFDT($PIECE(MATCHINGDATE,"."),RECURRING-1)_"."_$PIECE(SLOTSTART,".",2)
End DoDot:5
+18 ;
+19 IF FREQUENCY="WEEKS"
IF $GET(LASTDAYLASTWEEK)
IF LASTMATCHINGDAY>=LASTDAYLASTWEEK
Begin DoDot:5
+20 SET MATCHINGDATE=$$FMADD^XLFDT($PIECE(MATCHINGDATE,"."),7*(RECURRING-1))_"."_$PIECE(SLOTSTART,".",2)
End DoDot:5
+21 SET LASTMATCHINGDAY=$PIECE(MATCHINGDATE,".")
+22 SET LASTDAYLASTWEEK=$$FMADD^XLFDT(LASTMATCHINGDAY,6-$$FMTH^XLFDT(LASTMATCHINGDAY)+3#7)
+23 ;
+24 SET WEEKCOUNT=WEEKCOUNT+1
+25 IF FREQUENCY="MONTHS"
IF WEEKCOUNT>WEEKDAYCOUNT
Begin DoDot:5
+26 SET MATCHINGDATE=$$FMADD^XLFDT($PIECE(MATCHINGDATE,"."),(28*(RECURRING-1))-1)_("."_$PIECE(SLOTSTART,".",2))
+27 SET WEEKCOUNT=0
End DoDot:5
QUIT
+28 ;
+29 IF $DATA(SLOTS(CLINICIEN,MATCHINGDATE))
Begin DoDot:5
+30 SET RESULTCOUNT=$ORDER(MATCHINGSLOTS("slotSearch",CLINICIEN,"result",""),-1)+1
+31 DO BUILDMATCHES(.MATCHINGSLOTS,.PARTIALMATCHES,.MATCHCOUNT,.RESULTCOUNT,MATCHINGDATE,NUMBEROFAPPTS,CLINICIEN)
End DoDot:5
QUIT
+32 ;
+33 IF '$GET(MISS)
SET MISS=1
QUIT
+34 SET DEAD=1
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+35 QUIT
+36 ;
CONSECUTIVEDAYS(CONSECUTIVEDAYS,FREQUENCY,WEEKDAYS,RECURRING,OCCURRING,WEEKDAYCOUNT,DATE,STARTDATE) ;
+1 NEW WEEKCOUNT,WEEKS
+2 ;
+3 SET DATE=$EXTRACT(DATE,1,5)_"01"
SET DATE=$SELECT(FREQUENCY="DAILY":$$FMADD^XLFDT(STARTDATE,-RECURRING),FREQUENCY="WEEKS":$$FMADD^XLFDT(STARTDATE,-1),1:$$FMADD^XLFDT(DATE,-1))
+4 FOR
SET DATE=$$FMADD^XLFDT(DATE,1)
if DATE>=$$FMADD^XLFDT(STARTDATE,390)
QUIT
Begin DoDot:1
+5 ;
+6 IF FREQUENCY'="DAILY"
IF '$DATA(WEEKDAYS($$FMTH^XLFDT(DATE)+4#7))
QUIT
+7 ;
+8 SET WEEKCOUNT=$ORDER(WEEKS($EXTRACT(DATE,2,3),$EXTRACT(DATE,4,5),$$DOW^XLFDT(DATE),""),-1)+1
+9 SET WEEKS($EXTRACT(DATE,2,3),$EXTRACT(DATE,4,5),$$DOW^XLFDT(DATE),WEEKCOUNT)=DATE
+10 ;
+11 IF FREQUENCY="MONTHS"
IF WEEKCOUNT'=$GET(OCCURRING)
QUIT
+12 ;
+13 SET CONSECUTIVEDAYS(DATE)=""
End DoDot:1
+14 QUIT
+15 ;
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")!($PIECE($GET(^TMP($JOB,"SLOTSEARCH",SLOTCOUNT)),U,4)'>0)
QUIT
+21 ;
+22 IF '$PIECE(SLOTSTART,".",2)
Begin DoDot:3
+23 SET SLOTSTART=SLOTSTART_".0001"
End DoDot:3
+24 ;
+25 SET SLOTS(CLINICIEN,SLOTSTART)=""
End DoDot:2
End DoDot:1
+26 QUIT
+27 ;
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 ;
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 ;