SDCED1 ;ALB/JCH - VSE ENCOUNTER XREF ; 19 Oct 14  04:11PM
 ;;5.3;Scheduling;**628**;Aug 13, 1993;Build 371
 ;;
 Q
 ;
EN(SDRPTAR,SDBEGRNG,SDENDRNG,SDNODE) ; 
 ;; This utility will build a cross reference for the ENCOUNTER (#409.68) file
 ;; that will contain all encounters for a provider, by date ( PROVIDER,DATE,ENCOUNTER )
 ;; and a cross reference that will contain all encounters for a facility, by date
 ;; ( LOCATION, DATE, ENCOUNTER) 
 ;
 N SDFAC,DATE,DT,SDWEEKS,SDATE,SDLCNT,SDRPT,SDBEGDT,SDENDDT,SDSTART
 S DT=$$NOW^XLFDT,SDATE=DT
 S SDATE=$O(^XTMP("SDVSE","DT","")) Q:'SDATE
 S SDSTART=$$FMADD^XLFDT(SDATE,-365)
 S SDFAC=+$$SITE^VASITE()
 S SDBEGRNG=$G(SDBEGRNG),SDENDRNG=$G(SDENDRNG)
 I ($G(SDBEGRNG)&$G(SDENDRNG)) S SDBEGDT=$P(SDBEGRNG,".")
 S SDENDATE=$S($G(SDBEGDT):$P(SDENDRNG,".")_".24",1:"")
 I $G(SDENDATE),$G(SDBEGDT) S DTRANGE=$P(SDBEGDT,".")_"-"_$P(SDENDATE,".")
 ;
 S SDNODE=$S($G(DTRANGE):$J_",SDCEX",1:"SDCEX")
 I $G(^XTMP(SDNODE,0))=$G(^XTMP("SDVSE",0)) Q
 K ^XTMP(SDNODE) S ^XTMP(SDNODE,0)=^XTMP("SDVSE",0)
 D WEEKS(SDSTART,.SDWEEKS)
 D PROVIDER(SDBEGRNG,SDENDRNG,$G(DTRANGE),SDNODE)
 D AGGDT(SDBEGRNG,SDENDRNG,$G(DTRANGE),SDNODE)
 D CLEAN(SDNODE)
 Q
 ;
PROVIDER(SDBEGRNG,SDENDRNG,DTRANGE,SDNODE) ; aggregate daily encounters by provider 
 N SDENC,SDEST,SDNEW,TELCATD,DIVEX,CLINEX,PROVEX,SDEFLT
 N SDIV,SDEC,SDCL,SDPR,SDACTDT,SDIV,SDGRP,AGGDATA,SDVSEBEG
 ;
 S SDEST=0,SDNEW=0,SDDT=0
 S SDEFLT=$$FMADD^XLFDT($$NOW^XLFDT,-366)
 ;
 S SDACTDT=$O(^XTMP("SDVSE","DT","")) Q:'SDACTDT
 S SDRPTYP="" F  S SDRPTYP=$O(SDRPTAR(SDRPTYP)) Q:SDRPTYP=""  D
 .S SDCL=0 F  S SDCL=$O(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL)) Q:'SDCL  D
 ..S SDIV=$$GETDIV(SDCL)
 ..S SDDT=$S($G(DTRANGE):+DTRANGE,1:SDEFLT),SDDT=$$FMADD^XLFDT(SDDT,,,-1)
 ..F  S SDDT=$O(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT)) Q:'SDDT!($G(DTRANGE)&($P(SDDT,".")>$P(DTRANGE,"-",2)))  D
 ...S SDPR="" F  S SDPR=$O(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT,SDPR)) Q:SDPR=""  D
 ....D ENCOUNTR(SDACTDT,SDRPTYP,SDFAC,SDIV,SDCL,SDDT,SDPR,$G(DTRANGE),SDNODE)
 ....D APPT(SDACTDT,SDRPTYP,SDFAC,SDIV,SDCL,SDDT,SDPR,$G(DTRANGE),SDNODE)
 ...N SUPPLY S SUPPLY=$G(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT,0,"APP","SUP"))
 ...Q:'SUPPLY
 ...D SUPPLY(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDCL,SUPPLY)
 Q
 ;
ENCOUNTR(SDACTDT,SDRPTYP,SDFAC,SDIV,SDCL,SDDT,SDPR,DTRANGE,SDNODE) ; Get encounters from ^XTMP("SDVSE","DT"
 Q:'SDPR  ; Encounters must have a provider
 N SDUTLND,SVCAT,SDGRP,PRVNAM,CLNAM,STOPIEN,STOPGRP,SDEDDT,SDTEL
 S SDEDDT=SDDT
 S SDUTLND=$G(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDEDDT,SDPR,"ENC"))
 Q:SDUTLND=""
 S SDENC=$P(SDUTLND,"^"),SDNEW=$P(SDUTLND,"^",2),SDEST=$P(SDUTLND,"^",3),SDTEL=$P(SDUTLND,"^",4)
 ;S SDGRP=$P($G(^SC(+SDCL,0)),"^",7)
 D SDGRP^SDECXUTL(+SDCL,.SDGRP)
 ; Aggregate daily provider total
 I $G(DTRANGE) S SDEDDT=DTRANGE
 S PRVNAM=$P($G(^VA(200,+SDPR,0)),"^")
 S CLNAM=$P($G(^SC(+SDCL,0)),"^")
 N SDTMPND S SDTMPND=$G(^XTMP(SDNODE,"Date",SDRPTYP,$P(SDEDDT,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR))
 S AGGDATA="" N I F I=1:1:$L(SDUTLND,"^") D
 .S $P(AGGDATA,"^",I)=$P(SDUTLND,"^",I)+$P(SDTMPND,"^",I)
 S ^XTMP(SDNODE,"Date",SDRPTYP,$P(SDEDDT,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR)=AGGDATA
 ;
 N SDTMPND S SDTMPND=$G(^XTMP(SDNODE,"Date",SDRPTYP,$P(SDEDDT,"."),SDFAC,SDIV,0,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR))
 S AGGDATA="" N I F I=1:1:$L(SDUTLND,"^") D
 .S $P(AGGDATA,"^",I)=$P(SDUTLND,"^",I)+$P(SDTMPND,"^",I)
 S PRVNAM=$P($G(^VA(200,+SDPR,0)),"^")
 S ^XTMP(SDNODE,"Date",SDRPTYP,$P(SDEDDT,"."),SDFAC,SDIV,0,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR)=AGGDATA
 Q
 ;
APPT(SDACTDT,SDRPTYP,SDFAC,SDIV,SDCL,SDDT,SDPAT,DTRANGE,SDNODE) ; Get appointments from ^XTMP("SDVSE","DT"
 N SDUTLND,SDPR,SDTMPND,SDGRP,AGGDATA,LEN,STATUS,STOPIEN,STOPGRP
 S SDPR="" F  S SDPR=$O(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT,SDPAT,"APPT",SDPR)) Q:SDPR=""  D
 .S SDUTLND=$G(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT,SDPAT,"APPT",SDPR))
 .Q:SDUTLND=""
 .; Aggregate the total of all groups, and each group
 .D APPTG
 Q
 ;
APPTG ; Add data to groups "All" and SDGRP
 N PRVNAM,SDDATE,CLNAM,TMPGRP,SDGRP
 S PRVNAM=$S($G(SDPR):$P($G(^VA(200,+SDPR,0)),"^"),1:" None")
 S SDDATE=$S($G(DTRANGE):DTRANGE,1:SDDT)
 S CLNAM=$P($G(^SC(+$G(SDCL),0)),"^")
 D SDGRP^SDECXUTL(+SDCL,.TMPGRP)
 S SDGRP=TMPGRP
 ;
 ; Aggregate Overbooks^New^Established
 S LEN=$P(SDUTLND,"^",4),STATUS=$P(SDUTLND,"^",5)
 I 'LEN S LEN=$$APPLEN^SDCED2($G(SDCL))
 Q:'$G(LEN)
 ;
 ; Appointment Lengths specific ResourceGroup
 S AGGDATA=""
 S SDTMPND=$G(^XTMP(SDNODE,"Date",SDRPTYP,$P(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR,"APP","LEN",LEN,TMPGRP))
 S AGGDATA=$P(SDTMPND,"^")+LEN
 ; Continued
 N I F I=1:1:3 D
 .S $P(AGGDATA,"^",I+1)=$P(SDUTLND,"^",I)+$P(SDTMPND,"^",I+1)
 S ^XTMP(SDNODE,"Date",SDRPTYP,$P(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR,"APP","LEN",LEN,TMPGRP)=AGGDATA
 ;
 ; Appointment Status, Specific ResourceGroup
 S SDTMPND=$G(^XTMP(SDNODE,"Date",SDRPTYP,$P(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR,"APP","LEN",LEN,"STAT",STATUS))
 S SDTMPND=SDTMPND+1
 S ^XTMP(SDNODE,"Date",SDRPTYP,$P(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR,"APP","LEN",LEN,"STAT",STATUS)=SDTMPND
 ;
 Q
 ;
CLEAN(SDNODE) ; Clean up
 Q
 ;
CHKEST(DFN,BDATE,ENC,CLSTOP) ; Was Patient DFN's encounter on date DATE considered Established or New?
 N OLOC,SDLOC,OENCND,SDCHIT,PRVDATE,PRVENC,OCLSTOP S PRVDATE=BDATE,PRVENC=ENC
 Q:'$G(DFN) ""  Q:'$G(BDATE) ""  Q:'$G(ENC) ""  Q:'$D(^SCE(ENC,0)) ""
 S SDLOC=$P($G(^SCE(ENC,0)),"^",4),CLSTOP=""
 D CLSTOP(SDLOC,.CLSTOP) I 'CLSTOP S CLSTOP=$P($G(^SCE(ENC,0)),"^",3) Q:'CLSTOP ""
 S SDCHIT=0
 F  Q:$G(SDCHIT)  S PRVDATE=$O(^SCE("ADFN",DFN,PRVDATE),-1) Q:'PRVDATE!($$FMDIFF^XLFDT(BDATE,PRVDATE)>730)  S PRVENC=0 F  S PRVENC=$O(^SCE("ADFN",DFN,PRVDATE,PRVENC)) Q:'PRVENC!$G(SDCHIT)  D
 .S OENCND=$G(^SCE(PRVENC,0)) S OCLSTOP="",OLOC=$P(OENCND,"^",4)
 .D CLSTOP(OLOC,.OCLSTOP) S:'$G(OCLSTOP) OCLSTOP=$P(OENCND,"^",3)
 .I OCLSTOP=CLSTOP S SDCHIT=$P(^SCE(ENC,0),"^",4)
 Q $S($G(SDCHIT):$G(SDCHIT),1:0)
 ;
GETSCAT(SDLOC,SDSGNM,SDSGAR)  ; Get Stop Code Group Name
 N CSTOP S CSTOP="",SDSGNM="UNKNOWN"
 D CLSTOP(SDLOC,.CSTOP)
 I $G(CSTOP) D STOPCAT(CSTOP,.SDSGNM,.SDSGAR)
 Q
 ;
CLSTOP(SDLOC,CSTOP) ; Get Clinic Stop
 N SDCS K CSTOP S CSTOP=""
 S CSTOP=$P(^SC(SDLOC,0),U,7)
 Q:'CSTOP
 ; Get AMIS REPORTING STOP CODE
 S CSTOP=$P(^DIC(40.7,CSTOP,0),U,2)
 Q
STOPCAT(CLSTOP,CAT,STOPAR) ; Get stop code category (Mental Health, Specialty, Primary)
 N CLINEX,STPCNT,OK,TMPCAT,FOUND S FOUND=0
 Q:'$G(CLSTOP)  K CAT S TMPCAT="UNKNOWN"
 S STPCNT="" F  S STPCNT=$O(STOPAR(STPCNT)) Q:(STPCNT="")!$G(FOUND)  D
 .S CLINEX="" F  S CLINEX=$O(STOPAR(STPCNT,CLINEX)) Q:CLINEX=""!$G(FOUND)  D
 ..I +$P($G(STOPAR(STPCNT,CLINEX)),"^",2)=+CLSTOP S FOUND=CLSTOP
 ..S TMPCAT=STPCNT
 S CAT=$S(TMPCAT="S":"SPECIALTY CARE",TMPCAT="M":"MENTAL HEALTH",TMPCAT="P":"PRIMARY CARE",1:"UNKNOWN")
 Q
 ;
DIV(DIVINT) ; convert internal division to external
 N DIC,DA,DR,DIVAR,DIVXAR
 S DIC=40.8,DA=DIVINT,DR=".01"
 D GETS^DIQ(DIC,DA,DR,"E","DIVXAR")
 S DIVEX=$G(DIVXAR(40.8,DIVINT_",",.01,"E"))
 I DIVEX=""!($L(DIVEX)<3) S DIVEX=$P($$SITE^VASITE,"^",2)
 Q DIVEX
 ;
WEEKS(SDDT,WEEKS) ; Get ending dates for 52 weeks
 N TODAY,NEXTD,STARTD,NEXTW K WEEKS S WEEKS="",STARTD=""
 S TODAY=$$DOW^XLFDT(SDDT) I TODAY="Sunday" S STARTD=SDDT
 I TODAY'="Sunday" F I=1:1:6 D  Q:$G(STARTD)
 .S NEXTD=$$FMADD^XLFDT(SDDT,I) I $$DOW^XLFDT(NEXTD)="Sunday" S STARTD=NEXTD
 F I=1:1:53 S NEXTW=$P($$FMADD^XLFDT(STARTD,I*7),".") S WEEKS(NEXTW)=NEXTW
 Q
 ;
GETDIV(CLINIC) ; Return CLINIC's division from file 40.8
 N DIC,DA,DR,CLINAR
 Q:'$G(CLINIC) ""
 S DIQ(0)="I",DIC=44,DA=CLINIC,DR="3.5"
 D GETS^DIQ(DIC,+DA,DR,"I","CLINAR")
 S SDIV=$G(CLINAR(44,CLINIC_",",3.5,"I"))
 I '(SDIV>0) S SDIV=$P($$SITE^VASITE,"^",2)
 Q SDIV
 ;
AGGDT(SDBEGRNG,SDENDRNG,DTRANGE,SDNODE) ; Aggregate Facility, Divisions, Clinics, Providers by Date
 N SDFAC,SDIV,SDRPTYP,SDCL,SDPRV,SDDT,SDDTAG,SDENDATE,SDPRVND
 N TMPWK,TMPMON,TMPQRT,TMPYR,AGGDATA
 S SDRPTYP="" F  S SDRPTYP=$O(^XTMP(SDNODE,"Date",SDRPTYP)) Q:SDRPTYP=""  D
 .S SDDT=0 F  S SDDT=$O(^XTMP(SDNODE,"Date",SDRPTYP,SDDT)) Q:'SDDT  D
 ..S TMPMON=$E(SDDT,1,5)_"00"
 ..I '$G(TMPYR) S TMPYR=$E(SDDT,1,3)_"0000"
 ..S TMPWK=$$GETWEEK(SDDT,.SDWEEKS)
 ..S TMPQRT=$$GETQUART(SDDT)
 ..S SDFAC="" F  S SDFAC=$O(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC)) Q:SDFAC=""  D
 ...S SDIV="" F  S SDIV=$O(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV)) Q:'SDIV  D
 ....;Q:SDIV="APP"
 ....S SDGRP="" F  S SDGRP=$O(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP)) Q:SDGRP=""  D
 .....Q:SDGRP="APP"  Q:(SDGRP=0)
 .....S SDCL="" F  S SDCL=$O(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL)) Q:SDCL=""  D
 ......Q:SDCL="APP"  D SUP^SDCED2
 ......S SDPRV="" F  S SDPRV=$O(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL,SDPRV)) Q:SDPRV=""  D
 .......Q:(SDPRV'["^")
 .......;
 .......; Appointments
 .......D APPT^SDCED2(SDNODE,SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL,SDPRV,DTRANGE,TMPMON,TMPQRT,TMPYR,.SDWEEKS)
 .......;
 .......; Get smallest encounter aggregation
 .......S SDPRVND=$G(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL,SDPRV))
 .......Q:SDPRVND=""
 .......;
 .......; Add daily provider aggregation to Group
 .......D AGGSET("^XTMP(SDNODE,""Date"",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP)","Date",SDPRVND)
 .......;
 .......; Add daily provider aggregation to appropriate Clinic
 .......D AGGSET("^XTMP(SDNODE,""Date"",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL)","Date",SDPRVND)
 .......;
 .......N DTNAM,TOT1,TOT2,TOT3,TOT4,SDGLROOT,SDGLFULL
 .......I '($G(SDBEGRNG)&$G(SDENDRNG)) S SDGLROOT="^XTMP(SDNODE,DTNAM,SDRPTYP,TMPDT,SDFAC" D
 ........;  Aggregate Annual, Quarterly, Monthly, Weekly Group, Division, Clinic, Provider
 ........F DTNAM="Year","Month","Week","Quarter" D
 .........F SDGLFULL=SDGLROOT_")",SDGLROOT_",SDIV)",SDGLROOT_",SDIV,SDGRP)",SDGLROOT_",SDIV,SDGRP,SDCL)",SDGLROOT_",SDIV,SDGRP,SDCL,SDPRV)" D
 ..........; Don't add each group to facility and division totals - already done with group 0 (all)
 ..........;I SDGRP Q:(SDGLFULL[",SDIV)")!(SDGLFULL[",SDFAC)")
 ..........I SDGRP Q:'(SDGLFULL["SDGRP")
 ..........D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 .......;
 .......; Resource Group Specific aggregations (Annual, Quarterly, Monthly, Weekly, Daily)
 .......S SDGLROOT="^XTMP(SDNODE,""GROUP"",DTNAM,SDRPTYP,TMPDT" D
 ........F DTNAM="Year","Quarter","Month","Week","Date" D
 .........I $G(SDBEGRNG)&$G(SDENDRNG) Q:'(DTNAM="Date")
 .........S SDGLFULL=SDGLROOT_",SDFAC,SDGRP)" D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 .........S SDGLFULL=SDGLROOT_",SDFAC,SDGRP,""CLIN"",SDCL)" D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 .......;
 .......; Provider Specific aggregations (Annual, Quarterly, Monthly, Weekly, Daily)
 .......S SDGLROOT="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT"
 .......F DTNAM="Year","Quarter","Month","Week","Date" D
 ........I $G(SDBEGRNG)&$G(SDENDRNG) Q:'(DTNAM="Date")
 ........S SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""FAC"",SDFAC,SDPRV)" D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 ........S SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""FAC"",SDFAC,""CLIN"",SDCL,""PROV"",SDPRV)" D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 ........S SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""DIV"",SDIV,SDPRV)" D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 ........S SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""DIV"",SDIV,""CLIN"",SDCL,SDPRV)" D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 ........S SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""GRP"",SDGRP,SDPRV)" D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 ........S SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,"_SDIV_",""GRP"",SDGRP,SDPRV)" D AGGSET(SDGLFULL,DTNAM,SDPRVND)
 ........;
 ........; Don't add each group to facility and division totals - already done with group 0 (all)
 ........; Add daily provider aggregation to division
 ........Q:($G(SDGRP)=0)
 ........D AGGSET("^XTMP(SDNODE,DTNAM,SDRPTYP,TMPDT,SDFAC,SDIV)",DTNAM,SDPRVND)
 ........;
 ........; Add daily provider aggregation to facility
 ........D AGGSET("^XTMP(SDNODE,DTNAM,SDRPTYP,TMPDT,SDFAC)",DTNAM,SDPRVND)
 Q
 ;
AGGSET(SDGLOB,DTNAM,PRVND) ; Perform generic aggregation of Pn values into SDGLOB
 ; Encounter data stored in @SDGLOB
 N I,TMPDT,TOT,AGGDATA
 S TMPDT=$S(DTNAM="Year":TMPYR,DTNAM="Quarter":TMPQRT,DTNAM="Month":TMPMON,DTNAM="Week":TMPWK,1:SDDT)
 S TOT=$G(@(SDGLOB))
 F I=1:1:$L(PRVND,"^") S $P(AGGDATA,"^",I)=($P(TOT,"^",I)+$P(PRVND,"^",I))
 S @(SDGLOB)=AGGDATA
 Q
 ;
GRP(LOC,GROUP) ; Get clinic groups
 ; Look in Clinic Group for now, until Medsphere code is available
 K GROUP S GROUP=""
 N LOCNUM,DIC,X,Y S DIC=44,DIC(0)="MZ",X=LOC D ^DIC Q:(Y<1)  S LOCNUM=+Y
 N CGRP S CGRP=0 F  S CGRP=$O(^PS(57.8,"AC",LOCNUM,CGRP)) Q:'CGRP  D
 .S GROUP(LOC,CGRP)=$P($G(^PS(57.8,+CGRP,0)),"^")
 Q
 ;
GETWEEK(SDDT,SDWEEKS) ; Return the week-ending date for date SDDT
 K TMPWK
 S TMPWK=$G(SDWEEKS($P(SDDT,"."))) I 'TMPWK S TMPWK=$P($O(SDWEEKS(SDDT)),".") I TMPWK["."
 S TMPWK=$$FMADD^XLFDT(TMPWK,-1)
 Q TMPWK
 ;
GETQUART(SDDT)  ; Return quarter
 K SDQUART N MONTH,YEAR
 S YEAR=$$FMTE^XLFDT($E(SDDT,1,3)_"0000")
 S MONTH=$E(SDDT,4,5)
 S SDQUART=$S(MONTH<4:"Q1",MONTH<7:"Q2",MONTH<10:"Q3",MONTH<13:"Q4",1:"Q0")
 ;S SDQUART=SDQUART_"-"_YEAR
 S SDQUART=YEAR_"-"_SDQUART
 Q SDQUART
 ;
SUPPLY(SDNODE,DTINC,SDRPTYP,SDDT,SDFAC,SDIV,SDCL,SUPPLY) ; Get Supply
 Q:'SUPPLY
 N SDDATE,SDGRP,TMPSUP,CLNAM
 D SDGRP^SDECXUTL(+SDCL,.SDGRP)
 S SDDATE=$S($G(DTRANGE):DTRANGE,1:SDDT)
 S CLNAM=$S($G(SDCL):$P($G(^SC(+SDCL,0)),"^"),1:$P(SDCL,"^"))
 ;
 S TMPSUP=$G(^XTMP(SDNODE,DTINC,SDRPTYP,$P(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,"APP","SUP"))
 S TMPSUP=TMPSUP+SUPPLY
 S ^XTMP(SDNODE,DTINC,SDRPTYP,$P(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,"APP","SUP")=TMPSUP
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDCED1   14028     printed  Sep 23, 2025@20:25:23                                                                                                                                                                                                     Page 2
SDCED1    ;ALB/JCH - VSE ENCOUNTER XREF ; 19 Oct 14  04:11PM
 +1       ;;5.3;Scheduling;**628**;Aug 13, 1993;Build 371
 +2       ;;
 +3        QUIT 
 +4       ;
EN(SDRPTAR,SDBEGRNG,SDENDRNG,SDNODE) ; 
 +1       ;; This utility will build a cross reference for the ENCOUNTER (#409.68) file
 +2       ;; that will contain all encounters for a provider, by date ( PROVIDER,DATE,ENCOUNTER )
 +3       ;; and a cross reference that will contain all encounters for a facility, by date
 +4       ;; ( LOCATION, DATE, ENCOUNTER) 
 +5       ;
 +6        NEW SDFAC,DATE,DT,SDWEEKS,SDATE,SDLCNT,SDRPT,SDBEGDT,SDENDDT,SDSTART
 +7        SET DT=$$NOW^XLFDT
           SET SDATE=DT
 +8        SET SDATE=$ORDER(^XTMP("SDVSE","DT",""))
           if 'SDATE
               QUIT 
 +9        SET SDSTART=$$FMADD^XLFDT(SDATE,-365)
 +10       SET SDFAC=+$$SITE^VASITE()
 +11       SET SDBEGRNG=$GET(SDBEGRNG)
           SET SDENDRNG=$GET(SDENDRNG)
 +12       IF ($GET(SDBEGRNG)&$GET(SDENDRNG))
               SET SDBEGDT=$PIECE(SDBEGRNG,".")
 +13       SET SDENDATE=$SELECT($GET(SDBEGDT):$PIECE(SDENDRNG,".")_".24",1:"")
 +14       IF $GET(SDENDATE)
               IF $GET(SDBEGDT)
                   SET DTRANGE=$PIECE(SDBEGDT,".")_"-"_$PIECE(SDENDATE,".")
 +15      ;
 +16       SET SDNODE=$SELECT($GET(DTRANGE):$JOB_",SDCEX",1:"SDCEX")
 +17       IF $GET(^XTMP(SDNODE,0))=$GET(^XTMP("SDVSE",0))
               QUIT 
 +18       KILL ^XTMP(SDNODE)
           SET ^XTMP(SDNODE,0)=^XTMP("SDVSE",0)
 +19       DO WEEKS(SDSTART,.SDWEEKS)
 +20       DO PROVIDER(SDBEGRNG,SDENDRNG,$GET(DTRANGE),SDNODE)
 +21       DO AGGDT(SDBEGRNG,SDENDRNG,$GET(DTRANGE),SDNODE)
 +22       DO CLEAN(SDNODE)
 +23       QUIT 
 +24      ;
PROVIDER(SDBEGRNG,SDENDRNG,DTRANGE,SDNODE) ; aggregate daily encounters by provider 
 +1        NEW SDENC,SDEST,SDNEW,TELCATD,DIVEX,CLINEX,PROVEX,SDEFLT
 +2        NEW SDIV,SDEC,SDCL,SDPR,SDACTDT,SDIV,SDGRP,AGGDATA,SDVSEBEG
 +3       ;
 +4        SET SDEST=0
           SET SDNEW=0
           SET SDDT=0
 +5        SET SDEFLT=$$FMADD^XLFDT($$NOW^XLFDT,-366)
 +6       ;
 +7        SET SDACTDT=$ORDER(^XTMP("SDVSE","DT",""))
           if 'SDACTDT
               QUIT 
 +8        SET SDRPTYP=""
           FOR 
               SET SDRPTYP=$ORDER(SDRPTAR(SDRPTYP))
               if SDRPTYP=""
                   QUIT 
               Begin DoDot:1
 +9                SET SDCL=0
                   FOR 
                       SET SDCL=$ORDER(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL))
                       if 'SDCL
                           QUIT 
                       Begin DoDot:2
 +10                       SET SDIV=$$GETDIV(SDCL)
 +11                       SET SDDT=$SELECT($GET(DTRANGE):+DTRANGE,1:SDEFLT)
                           SET SDDT=$$FMADD^XLFDT(SDDT,,,-1)
 +12                       FOR 
                               SET SDDT=$ORDER(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT))
                               if 'SDDT!($GET(DTRANGE)&($PIECE(SDDT,".")>$PIECE(DTRANGE,"-",2)))
                                   QUIT 
                               Begin DoDot:3
 +13                               SET SDPR=""
                                   FOR 
                                       SET SDPR=$ORDER(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT,SDPR))
                                       if SDPR=""
                                           QUIT 
                                       Begin DoDot:4
 +14                                       DO ENCOUNTR(SDACTDT,SDRPTYP,SDFAC,SDIV,SDCL,SDDT,SDPR,$GET(DTRANGE),SDNODE)
 +15                                       DO APPT(SDACTDT,SDRPTYP,SDFAC,SDIV,SDCL,SDDT,SDPR,$GET(DTRANGE),SDNODE)
                                       End DoDot:4
 +16                               NEW SUPPLY
                                   SET SUPPLY=$GET(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT,0,"APP","SUP"))
 +17                               if 'SUPPLY
                                       QUIT 
 +18                               DO SUPPLY(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDCL,SUPPLY)
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +19       QUIT 
 +20      ;
ENCOUNTR(SDACTDT,SDRPTYP,SDFAC,SDIV,SDCL,SDDT,SDPR,DTRANGE,SDNODE) ; Get encounters from ^XTMP("SDVSE","DT"
 +1       ; Encounters must have a provider
           if 'SDPR
               QUIT 
 +2        NEW SDUTLND,SVCAT,SDGRP,PRVNAM,CLNAM,STOPIEN,STOPGRP,SDEDDT,SDTEL
 +3        SET SDEDDT=SDDT
 +4        SET SDUTLND=$GET(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDEDDT,SDPR,"ENC"))
 +5        if SDUTLND=""
               QUIT 
 +6        SET SDENC=$PIECE(SDUTLND,"^")
           SET SDNEW=$PIECE(SDUTLND,"^",2)
           SET SDEST=$PIECE(SDUTLND,"^",3)
           SET SDTEL=$PIECE(SDUTLND,"^",4)
 +7       ;S SDGRP=$P($G(^SC(+SDCL,0)),"^",7)
 +8        DO SDGRP^SDECXUTL(+SDCL,.SDGRP)
 +9       ; Aggregate daily provider total
 +10       IF $GET(DTRANGE)
               SET SDEDDT=DTRANGE
 +11       SET PRVNAM=$PIECE($GET(^VA(200,+SDPR,0)),"^")
 +12       SET CLNAM=$PIECE($GET(^SC(+SDCL,0)),"^")
 +13       NEW SDTMPND
           SET SDTMPND=$GET(^XTMP(SDNODE,"Date",SDRPTYP,$PIECE(SDEDDT,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR))
 +14       SET AGGDATA=""
           NEW I
           FOR I=1:1:$LENGTH(SDUTLND,"^")
               Begin DoDot:1
 +15               SET $PIECE(AGGDATA,"^",I)=$PIECE(SDUTLND,"^",I)+$PIECE(SDTMPND,"^",I)
               End DoDot:1
 +16       SET ^XTMP(SDNODE,"Date",SDRPTYP,$PIECE(SDEDDT,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR)=AGGDATA
 +17      ;
 +18       NEW SDTMPND
           SET SDTMPND=$GET(^XTMP(SDNODE,"Date",SDRPTYP,$PIECE(SDEDDT,"."),SDFAC,SDIV,0,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR))
 +19       SET AGGDATA=""
           NEW I
           FOR I=1:1:$LENGTH(SDUTLND,"^")
               Begin DoDot:1
 +20               SET $PIECE(AGGDATA,"^",I)=$PIECE(SDUTLND,"^",I)+$PIECE(SDTMPND,"^",I)
               End DoDot:1
 +21       SET PRVNAM=$PIECE($GET(^VA(200,+SDPR,0)),"^")
 +22       SET ^XTMP(SDNODE,"Date",SDRPTYP,$PIECE(SDEDDT,"."),SDFAC,SDIV,0,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR)=AGGDATA
 +23       QUIT 
 +24      ;
APPT(SDACTDT,SDRPTYP,SDFAC,SDIV,SDCL,SDDT,SDPAT,DTRANGE,SDNODE) ; Get appointments from ^XTMP("SDVSE","DT"
 +1        NEW SDUTLND,SDPR,SDTMPND,SDGRP,AGGDATA,LEN,STATUS,STOPIEN,STOPGRP
 +2        SET SDPR=""
           FOR 
               SET SDPR=$ORDER(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT,SDPAT,"APPT",SDPR))
               if SDPR=""
                   QUIT 
               Begin DoDot:1
 +3                SET SDUTLND=$GET(^XTMP("SDVSE","DT",SDACTDT,SDRPTYP,SDCL,SDDT,SDPAT,"APPT",SDPR))
 +4                if SDUTLND=""
                       QUIT 
 +5       ; Aggregate the total of all groups, and each group
 +6                DO APPTG
               End DoDot:1
 +7        QUIT 
 +8       ;
APPTG     ; Add data to groups "All" and SDGRP
 +1        NEW PRVNAM,SDDATE,CLNAM,TMPGRP,SDGRP
 +2        SET PRVNAM=$SELECT($GET(SDPR):$PIECE($GET(^VA(200,+SDPR,0)),"^"),1:" None")
 +3        SET SDDATE=$SELECT($GET(DTRANGE):DTRANGE,1:SDDT)
 +4        SET CLNAM=$PIECE($GET(^SC(+$GET(SDCL),0)),"^")
 +5        DO SDGRP^SDECXUTL(+SDCL,.TMPGRP)
 +6        SET SDGRP=TMPGRP
 +7       ;
 +8       ; Aggregate Overbooks^New^Established
 +9        SET LEN=$PIECE(SDUTLND,"^",4)
           SET STATUS=$PIECE(SDUTLND,"^",5)
 +10       IF 'LEN
               SET LEN=$$APPLEN^SDCED2($GET(SDCL))
 +11       if '$GET(LEN)
               QUIT 
 +12      ;
 +13      ; Appointment Lengths specific ResourceGroup
 +14       SET AGGDATA=""
 +15       SET SDTMPND=$GET(^XTMP(SDNODE,"Date",SDRPTYP,$PIECE(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR,"APP","LEN",LEN,TMPGRP))
 +16       SET AGGDATA=$PIECE(SDTMPND,"^")+LEN
 +17      ; Continued
 +18       NEW I
           FOR I=1:1:3
               Begin DoDot:1
 +19               SET $PIECE(AGGDATA,"^",I+1)=$PIECE(SDUTLND,"^",I)+$PIECE(SDTMPND,"^",I+1)
               End DoDot:1
 +20       SET ^XTMP(SDNODE,"Date",SDRPTYP,$PIECE(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR,"APP","LEN",LEN,TMPGRP)=AGGDATA
 +21      ;
 +22      ; Appointment Status, Specific ResourceGroup
 +23       SET SDTMPND=$GET(^XTMP(SDNODE,"Date",SDRPTYP,$PIECE(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR,"APP","LEN",LEN,"STAT",STATUS))
 +24       SET SDTMPND=SDTMPND+1
 +25       SET ^XTMP(SDNODE,"Date",SDRPTYP,$PIECE(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,PRVNAM_"^"_SDPR,"APP","LEN",LEN,"STAT",STATUS)=SDTMPND
 +26      ;
 +27       QUIT 
 +28      ;
CLEAN(SDNODE) ; Clean up
 +1        QUIT 
 +2       ;
CHKEST(DFN,BDATE,ENC,CLSTOP) ; Was Patient DFN's encounter on date DATE considered Established or New?
 +1        NEW OLOC,SDLOC,OENCND,SDCHIT,PRVDATE,PRVENC,OCLSTOP
           SET PRVDATE=BDATE
           SET PRVENC=ENC
 +2        if '$GET(DFN)
               QUIT ""
           if '$GET(BDATE)
               QUIT ""
           if '$GET(ENC)
               QUIT ""
           if '$DATA(^SCE(ENC,0))
               QUIT ""
 +3        SET SDLOC=$PIECE($GET(^SCE(ENC,0)),"^",4)
           SET CLSTOP=""
 +4        DO CLSTOP(SDLOC,.CLSTOP)
           IF 'CLSTOP
               SET CLSTOP=$PIECE($GET(^SCE(ENC,0)),"^",3)
               if 'CLSTOP
                   QUIT ""
 +5        SET SDCHIT=0
 +6        FOR 
               if $GET(SDCHIT)
                   QUIT 
               SET PRVDATE=$ORDER(^SCE("ADFN",DFN,PRVDATE),-1)
               if 'PRVDATE!($$FMDIFF^XLFDT(BDATE,PRVDATE)>730)
                   QUIT 
               SET PRVENC=0
               FOR 
                   SET PRVENC=$ORDER(^SCE("ADFN",DFN,PRVDATE,PRVENC))
                   if 'PRVENC!$GET(SDCHIT)
                       QUIT 
                   Begin DoDot:1
 +7                    SET OENCND=$GET(^SCE(PRVENC,0))
                       SET OCLSTOP=""
                       SET OLOC=$PIECE(OENCND,"^",4)
 +8                    DO CLSTOP(OLOC,.OCLSTOP)
                       if '$GET(OCLSTOP)
                           SET OCLSTOP=$PIECE(OENCND,"^",3)
 +9                    IF OCLSTOP=CLSTOP
                           SET SDCHIT=$PIECE(^SCE(ENC,0),"^",4)
                   End DoDot:1
 +10       QUIT $SELECT($GET(SDCHIT):$GET(SDCHIT),1:0)
 +11      ;
GETSCAT(SDLOC,SDSGNM,SDSGAR) ; Get Stop Code Group Name
 +1        NEW CSTOP
           SET CSTOP=""
           SET SDSGNM="UNKNOWN"
 +2        DO CLSTOP(SDLOC,.CSTOP)
 +3        IF $GET(CSTOP)
               DO STOPCAT(CSTOP,.SDSGNM,.SDSGAR)
 +4        QUIT 
 +5       ;
CLSTOP(SDLOC,CSTOP) ; Get Clinic Stop
 +1        NEW SDCS
           KILL CSTOP
           SET CSTOP=""
 +2        SET CSTOP=$PIECE(^SC(SDLOC,0),U,7)
 +3        if 'CSTOP
               QUIT 
 +4       ; Get AMIS REPORTING STOP CODE
 +5        SET CSTOP=$PIECE(^DIC(40.7,CSTOP,0),U,2)
 +6        QUIT 
STOPCAT(CLSTOP,CAT,STOPAR) ; Get stop code category (Mental Health, Specialty, Primary)
 +1        NEW CLINEX,STPCNT,OK,TMPCAT,FOUND
           SET FOUND=0
 +2        if '$GET(CLSTOP)
               QUIT 
           KILL CAT
           SET TMPCAT="UNKNOWN"
 +3        SET STPCNT=""
           FOR 
               SET STPCNT=$ORDER(STOPAR(STPCNT))
               if (STPCNT="")!$GET(FOUND)
                   QUIT 
               Begin DoDot:1
 +4                SET CLINEX=""
                   FOR 
                       SET CLINEX=$ORDER(STOPAR(STPCNT,CLINEX))
                       if CLINEX=""!$GET(FOUND)
                           QUIT 
                       Begin DoDot:2
 +5                        IF +$PIECE($GET(STOPAR(STPCNT,CLINEX)),"^",2)=+CLSTOP
                               SET FOUND=CLSTOP
 +6                        SET TMPCAT=STPCNT
                       End DoDot:2
               End DoDot:1
 +7        SET CAT=$SELECT(TMPCAT="S":"SPECIALTY CARE",TMPCAT="M":"MENTAL HEALTH",TMPCAT="P":"PRIMARY CARE",1:"UNKNOWN")
 +8        QUIT 
 +9       ;
DIV(DIVINT) ; convert internal division to external
 +1        NEW DIC,DA,DR,DIVAR,DIVXAR
 +2        SET DIC=40.8
           SET DA=DIVINT
           SET DR=".01"
 +3        DO GETS^DIQ(DIC,DA,DR,"E","DIVXAR")
 +4        SET DIVEX=$GET(DIVXAR(40.8,DIVINT_",",.01,"E"))
 +5        IF DIVEX=""!($LENGTH(DIVEX)<3)
               SET DIVEX=$PIECE($$SITE^VASITE,"^",2)
 +6        QUIT DIVEX
 +7       ;
WEEKS(SDDT,WEEKS) ; Get ending dates for 52 weeks
 +1        NEW TODAY,NEXTD,STARTD,NEXTW
           KILL WEEKS
           SET WEEKS=""
           SET STARTD=""
 +2        SET TODAY=$$DOW^XLFDT(SDDT)
           IF TODAY="Sunday"
               SET STARTD=SDDT
 +3        IF TODAY'="Sunday"
               FOR I=1:1:6
                   Begin DoDot:1
 +4                    SET NEXTD=$$FMADD^XLFDT(SDDT,I)
                       IF $$DOW^XLFDT(NEXTD)="Sunday"
                           SET STARTD=NEXTD
                   End DoDot:1
                   if $GET(STARTD)
                       QUIT 
 +5        FOR I=1:1:53
               SET NEXTW=$PIECE($$FMADD^XLFDT(STARTD,I*7),".")
               SET WEEKS(NEXTW)=NEXTW
 +6        QUIT 
 +7       ;
GETDIV(CLINIC) ; Return CLINIC's division from file 40.8
 +1        NEW DIC,DA,DR,CLINAR
 +2        if '$GET(CLINIC)
               QUIT ""
 +3        SET DIQ(0)="I"
           SET DIC=44
           SET DA=CLINIC
           SET DR="3.5"
 +4        DO GETS^DIQ(DIC,+DA,DR,"I","CLINAR")
 +5        SET SDIV=$GET(CLINAR(44,CLINIC_",",3.5,"I"))
 +6        IF '(SDIV>0)
               SET SDIV=$PIECE($$SITE^VASITE,"^",2)
 +7        QUIT SDIV
 +8       ;
AGGDT(SDBEGRNG,SDENDRNG,DTRANGE,SDNODE) ; Aggregate Facility, Divisions, Clinics, Providers by Date
 +1        NEW SDFAC,SDIV,SDRPTYP,SDCL,SDPRV,SDDT,SDDTAG,SDENDATE,SDPRVND
 +2        NEW TMPWK,TMPMON,TMPQRT,TMPYR,AGGDATA
 +3        SET SDRPTYP=""
           FOR 
               SET SDRPTYP=$ORDER(^XTMP(SDNODE,"Date",SDRPTYP))
               if SDRPTYP=""
                   QUIT 
               Begin DoDot:1
 +4                SET SDDT=0
                   FOR 
                       SET SDDT=$ORDER(^XTMP(SDNODE,"Date",SDRPTYP,SDDT))
                       if 'SDDT
                           QUIT 
                       Begin DoDot:2
 +5                        SET TMPMON=$EXTRACT(SDDT,1,5)_"00"
 +6                        IF '$GET(TMPYR)
                               SET TMPYR=$EXTRACT(SDDT,1,3)_"0000"
 +7                        SET TMPWK=$$GETWEEK(SDDT,.SDWEEKS)
 +8                        SET TMPQRT=$$GETQUART(SDDT)
 +9                        SET SDFAC=""
                           FOR 
                               SET SDFAC=$ORDER(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC))
                               if SDFAC=""
                                   QUIT 
                               Begin DoDot:3
 +10                               SET SDIV=""
                                   FOR 
                                       SET SDIV=$ORDER(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV))
                                       if 'SDIV
                                           QUIT 
                                       Begin DoDot:4
 +11      ;Q:SDIV="APP"
 +12                                       SET SDGRP=""
                                           FOR 
                                               SET SDGRP=$ORDER(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP))
                                               if SDGRP=""
                                                   QUIT 
                                               Begin DoDot:5
 +13                                               if SDGRP="APP"
                                                       QUIT 
                                                   if (SDGRP=0)
                                                       QUIT 
 +14                                               SET SDCL=""
                                                   FOR 
                                                       SET SDCL=$ORDER(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL))
                                                       if SDCL=""
                                                           QUIT 
                                                       Begin DoDot:6
 +15                                                       if SDCL="APP"
                                                               QUIT 
                                                           DO SUP^SDCED2
 +16                                                       SET SDPRV=""
                                                           FOR 
                                                               SET SDPRV=$ORDER(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL,SDPRV))
                                                               if SDPRV=""
                                                                   QUIT 
                                                               Begin DoDot:7
 +17                                                               if (SDPRV'["^")
                                                                       QUIT 
 +18      ;
 +19      ; Appointments
 +20                                                               DO APPT^SDCED2(SDNODE,SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL,SDPRV,DTRANGE,TMPMON,TMPQRT,TMPYR,.SDWEEKS)
 +21      ;
 +22      ; Get smallest encounter aggregation
 +23                                                               SET SDPRVND=$GET(^XTMP(SDNODE,"Date",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL,SDPRV))
 +24                                                               if SDPRVND=""
                                                                       QUIT 
 +25      ;
 +26      ; Add daily provider aggregation to Group
 +27                                                               DO AGGSET("^XTMP(SDNODE,""Date"",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP)","Date",SDPRVND)
 +28      ;
 +29      ; Add daily provider aggregation to appropriate Clinic
 +30                                                               DO AGGSET("^XTMP(SDNODE,""Date"",SDRPTYP,SDDT,SDFAC,SDIV,SDGRP,SDCL)","Date",SDPRVND)
 +31      ;
 +32                                                               NEW DTNAM,TOT1,TOT2,TOT3,TOT4,SDGLROOT,SDGLFULL
 +33                                                               IF '($GET(SDBEGRNG)&$GET(SDENDRNG))
                                                                       SET SDGLROOT="^XTMP(SDNODE,DTNAM,SDRPTYP,TMPDT,SDFAC"
                                                                       Begin DoDot:8
 +34      ;  Aggregate Annual, Quarterly, Monthly, Weekly Group, Division, Clinic, Provider
 +35                                                                       FOR DTNAM="Year","Month","Week","Quarter"
                                                                               Begin DoDot:9
 +36                                                                               FOR SDGLFULL=SDGLROOT_")",SDGLROOT_",SDIV)",SDGLROOT_",SDIV,SDGRP)",SDGLROOT_",SDIV,SDGRP,SDCL)",SDGLROOT_",SDIV,SDGRP,SDCL,SDPRV)"
                                                                                       Begin DoDot:10
 +37      ; Don't add each group to facility and division totals - already done with group 0 (all)
 +38      ;I SDGRP Q:(SDGLFULL[",SDIV)")!(SDGLFULL[",SDFAC)")
 +39                                                                                       IF SDGRP
                                                                                               if '(SDGLFULL["SDGRP")
                                                                                                   QUIT 
 +40                                                                                       DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
                                                                                       End DoDot:10
                                                                               End DoDot:9
                                                                       End DoDot:8
 +41      ;
 +42      ; Resource Group Specific aggregations (Annual, Quarterly, Monthly, Weekly, Daily)
 +43                                                               SET SDGLROOT="^XTMP(SDNODE,""GROUP"",DTNAM,SDRPTYP,TMPDT"
                                                                   Begin DoDot:8
 +44                                                                   FOR DTNAM="Year","Quarter","Month","Week","Date"
                                                                           Begin DoDot:9
 +45                                                                           IF $GET(SDBEGRNG)&$GET(SDENDRNG)
                                                                                   if '(DTNAM="Date")
                                                                                       QUIT 
 +46                                                                           SET SDGLFULL=SDGLROOT_",SDFAC,SDGRP)"
                                                                               DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
 +47                                                                           SET SDGLFULL=SDGLROOT_",SDFAC,SDGRP,""CLIN"",SDCL)"
                                                                               DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
                                                                           End DoDot:9
                                                                   End DoDot:8
 +48      ;
 +49      ; Provider Specific aggregations (Annual, Quarterly, Monthly, Weekly, Daily)
 +50                                                               SET SDGLROOT="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT"
 +51                                                               FOR DTNAM="Year","Quarter","Month","Week","Date"
                                                                       Begin DoDot:8
 +52                                                                       IF $GET(SDBEGRNG)&$GET(SDENDRNG)
                                                                               if '(DTNAM="Date")
                                                                                   QUIT 
 +53                                                                       SET SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""FAC"",SDFAC,SDPRV)"
                                                                           DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
 +54                                                                       SET SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""FAC"",SDFAC,""CLIN"",SDCL,""PROV"",SDPRV)"
                                                                           DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
 +55                                                                       SET SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""DIV"",SDIV,SDPRV)"
                                                                           DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
 +56                                                                       SET SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""DIV"",SDIV,""CLIN"",SDCL,SDPRV)"
                                                                           DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
 +57                                                                       SET SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,""GRP"",SDGRP,SDPRV)"
                                                                           DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
 +58                                                                       SET SDGLFULL="^XTMP(SDNODE,""PROVIDER"",DTNAM,SDRPTYP,TMPDT,"_SDIV_",""GRP"",SDGRP,SDPRV)"
                                                                           DO AGGSET(SDGLFULL,DTNAM,SDPRVND)
 +59      ;
 +60      ; Don't add each group to facility and division totals - already done with group 0 (all)
 +61      ; Add daily provider aggregation to division
 +62                                                                       if ($GET(SDGRP)=0)
                                                                               QUIT 
 +63                                                                       DO AGGSET("^XTMP(SDNODE,DTNAM,SDRPTYP,TMPDT,SDFAC,SDIV)",DTNAM,SDPRVND)
 +64      ;
 +65      ; Add daily provider aggregation to facility
 +66                                                                       DO AGGSET("^XTMP(SDNODE,DTNAM,SDRPTYP,TMPDT,SDFAC)",DTNAM,SDPRVND)
                                                                       End DoDot:8
                                                               End DoDot:7
                                                       End DoDot:6
                                               End DoDot:5
                                       End DoDot:4
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +67       QUIT 
 +68      ;
AGGSET(SDGLOB,DTNAM,PRVND) ; Perform generic aggregation of Pn values into SDGLOB
 +1       ; Encounter data stored in @SDGLOB
 +2        NEW I,TMPDT,TOT,AGGDATA
 +3        SET TMPDT=$SELECT(DTNAM="Year":TMPYR,DTNAM="Quarter":TMPQRT,DTNAM="Month":TMPMON,DTNAM="Week":TMPWK,1:SDDT)
 +4        SET TOT=$GET(@(SDGLOB))
 +5        FOR I=1:1:$LENGTH(PRVND,"^")
               SET $PIECE(AGGDATA,"^",I)=($PIECE(TOT,"^",I)+$PIECE(PRVND,"^",I))
 +6        SET @(SDGLOB)=AGGDATA
 +7        QUIT 
 +8       ;
GRP(LOC,GROUP) ; Get clinic groups
 +1       ; Look in Clinic Group for now, until Medsphere code is available
 +2        KILL GROUP
           SET GROUP=""
 +3        NEW LOCNUM,DIC,X,Y
           SET DIC=44
           SET DIC(0)="MZ"
           SET X=LOC
           DO ^DIC
           if (Y<1)
               QUIT 
           SET LOCNUM=+Y
 +4        NEW CGRP
           SET CGRP=0
           FOR 
               SET CGRP=$ORDER(^PS(57.8,"AC",LOCNUM,CGRP))
               if 'CGRP
                   QUIT 
               Begin DoDot:1
 +5                SET GROUP(LOC,CGRP)=$PIECE($GET(^PS(57.8,+CGRP,0)),"^")
               End DoDot:1
 +6        QUIT 
 +7       ;
GETWEEK(SDDT,SDWEEKS) ; Return the week-ending date for date SDDT
 +1        KILL TMPWK
 +2        SET TMPWK=$GET(SDWEEKS($PIECE(SDDT,".")))
           IF 'TMPWK
               SET TMPWK=$PIECE($ORDER(SDWEEKS(SDDT)),".")
               IF TMPWK["."
 +3        SET TMPWK=$$FMADD^XLFDT(TMPWK,-1)
 +4        QUIT TMPWK
 +5       ;
GETQUART(SDDT) ; Return quarter
 +1        KILL SDQUART
           NEW MONTH,YEAR
 +2        SET YEAR=$$FMTE^XLFDT($EXTRACT(SDDT,1,3)_"0000")
 +3        SET MONTH=$EXTRACT(SDDT,4,5)
 +4        SET SDQUART=$SELECT(MONTH<4:"Q1",MONTH<7:"Q2",MONTH<10:"Q3",MONTH<13:"Q4",1:"Q0")
 +5       ;S SDQUART=SDQUART_"-"_YEAR
 +6        SET SDQUART=YEAR_"-"_SDQUART
 +7        QUIT SDQUART
 +8       ;
SUPPLY(SDNODE,DTINC,SDRPTYP,SDDT,SDFAC,SDIV,SDCL,SUPPLY) ; Get Supply
 +1        if 'SUPPLY
               QUIT 
 +2        NEW SDDATE,SDGRP,TMPSUP,CLNAM
 +3        DO SDGRP^SDECXUTL(+SDCL,.SDGRP)
 +4        SET SDDATE=$SELECT($GET(DTRANGE):DTRANGE,1:SDDT)
 +5        SET CLNAM=$SELECT($GET(SDCL):$PIECE($GET(^SC(+SDCL,0)),"^"),1:$PIECE(SDCL,"^"))
 +6       ;
 +7        SET TMPSUP=$GET(^XTMP(SDNODE,DTINC,SDRPTYP,$PIECE(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,"APP","SUP"))
 +8        SET TMPSUP=TMPSUP+SUPPLY
 +9        SET ^XTMP(SDNODE,DTINC,SDRPTYP,$PIECE(SDDATE,"."),SDFAC,SDIV,SDGRP,CLNAM_"^"_SDCL,"APP","SUP")=TMPSUP
 +10       QUIT