Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: BSDWKR1

BSDWKR1.m

Go to the documentation of this file.
  1. BSDWKR1 ; IHS/ANMC/LJF - WORKLOAD STATS; [ 01/04/2005 4:42 PM ]
  1. ;;5.3;PIMS;**1001**;APR 26, 2002
  1. ;
  1. ASK ; -- ask user questions
  1. NEW VAUTC,VAUTD,POP,BSDBD,BSDED,BSDTT,BSDDET,BSDSUB,BSDSRT,BSDSEEN,Y
  1. ;
  1. S BSDSUB=$$READ^BDGF("SO^C:Clinic;P:Principal Clinic;V:Provider;T:Team","Subtotal Report by","","^D HELP1^BSDWKR1")
  1. Q:BSDSUB="" Q:BSDSUB=U
  1. ;
  1. ; get clinic arrays based on subtotal category
  1. I (BSDSUB="C")!(BSDSUB="P") D CLINIC^BSDU(2) Q:$D(BSDQ)
  1. I (BSDSUB="V")!(BSDSUB="T") D PCASK^BSDU(2,BSDSUB) Q:$D(BSDQ)
  1. ;
  1. S BSDBD=$$READ^BDGF("DO^::EX","Select First Date to Search") Q:'BSDBD
  1. S BSDED=$$READ^BDGF("DO^::EX","Select Last Date to Search") Q:'BSDED
  1. ;
  1. S BSDDET=$$READ^BDGF("Y","List Individual Dates","NO","^D HELP3^BSDWKR1") Q:BSDDET=U
  1. ;
  1. S BSDSRT=$$READ^BDGF("SO^1:Morning vs. Afternoon;2:Pediatric vs. Adult Patients;3:Male vs. Female Patients","Select addition sort (optional)")
  1. Q:BSDSRT=U S BSDSRT=+BSDSRT ;optional=0
  1. ;
  1. S BSDSEEN=$$READ^BDGF("YO","Assume Patient Seen if Appt NOT Checked In","NO","^D HELP2^BSDWKR1") Q:BSDSEEN="" Q:BSDSEEN=U
  1. ;
  1. S Y=$$BROWSE^BDGF Q:"PB"'[Y I Y="B" D EN Q ;browse in list mgr mode
  1. D ZIS^BDGF("PQ","START^BSDWKR1","WORKLOAD STATS","BSDDET;BSDSUB;BSDSRT;BSDSEEN;BSDBD;BSDED;VAUTC*;VAUTD*")
  1. Q
  1. ;
  1. START ;EP; -- re-entry for printing to paper
  1. D INIT,PRINT Q
  1. ;
  1. EN ; -- main entry point for BSDRM WORK STATS
  1. NEW VALMCNT D TERM^VALM0,CLEAR^VALM1
  1. D EN^VALM("BSDRM WORK STATS")
  1. D CLEAR^VALM1
  1. Q
  1. ;
  1. HDR ; -- header code
  1. S VALMHDR(1)=$$SP(25)_"Completed Appointments by Type"
  1. S VALMHDR(2)=$$SP(20)_"For dates: "_$$RANGE^BDGF(BSDBD,BSDED)
  1. Q
  1. ;
  1. INIT ; -- init variables and list array
  1. S VALMCNT=0 K ^TMP("BSDWKR1",$J),^TMP("BSD",$J)
  1. NEW BSDAR S BSDAR=$S(VAUTC:"^SC",1:"VAUTC")
  1. ;
  1. ; -- loop by clinic
  1. NEW CLN,NAME,SUB,APPT,APPN,PAT,STATUS,TYPE,SUB2,END
  1. S CLN=0 F S CLN=$O(@BSDAR@(CLN)) Q:'CLN D
  1. . ;IHS/ITSC/WAR 3/25/04 2 lines added to handle ALL/2 or more DIVs
  1. . Q:'$$GET1^DIQ(44,CLN,3.5,"I") ;No Div entered for this clinic
  1. . ;IHS/ITSC/WAR 12/29/04 PATCH 1001 fixed 'undefined' when selecting Prov or Team
  1. . ;Q:(VAUTD'=1&('$D(VAUTD($$GET1^DIQ(44,CLN,3.5,"I"))))) ;this Div notd
  1. . I $D(VAUTD) Q:(VAUTD'=1&('$D(VAUTD($$GET1^DIQ(44,CLN,3.5,"I"))))) ;this Div notd
  1. . Q:$D(^SC("AIHSPC",CLN)) ;quit if principal clinic
  1. . S NAME=$$GET1^DIQ(44,CLN,.01) ;set clinic's name
  1. . S SUB=$$SUB1(CLN,NAME) ;get subcategory for clinic
  1. . ;
  1. . ; -- then by appt date (within range)
  1. . S APPT=BSDBD,END=BSDED+.2400
  1. . F S APPT=$O(^SC(CLN,"S",APPT)) Q:'APPT!(APPT>END) D
  1. .. ;
  1. .. ; -- then find appts to count
  1. .. S APPN=0
  1. .. F S APPN=$O(^SC(CLN,"S",APPT,1,APPN)) Q:'APPN D
  1. ... S PAT=+^SC(CLN,"S",APPT,1,APPN,0) ;patient ien
  1. ... S STATUS=$$VAL^XBDIQ1(2.98,PAT_","_APPT,100) ;current status
  1. ... Q:STATUS["CANCEL" Q:STATUS="FUTURE"
  1. ... Q:STATUS="NON-COUNT" Q:STATUS="DELETED"
  1. ... I BSDSEEN=0 Q:STATUS="NO ACTION TAKEN"
  1. ... ;
  1. ... S TYPE=$$TYPE(CLN,APPT,APPN,PAT,STATUS) ;type of appt
  1. ... S SUB2=$$SUB2(APPT,PAT) ;2nd sort
  1. ... ;
  1. ... ; increment totals
  1. ... D INCR(SUB,TYPE,NAME,SUB2,APPT)
  1. ;
  1. ;
  1. ; put totals into display array
  1. NEW S1,S2,S3,S4,X,LINE,I,J,BSDI,BSDJ
  1. S S1=0 F S S1=$O(^TMP("BSD",$J,S1)) Q:S1="" D
  1. . ;
  1. . S LINE=$$PAD(S1,25) ;subtotal category name
  1. . ; line up 5 type of appt columns
  1. . F I=1:1:5 S LINE=LINE_$$SP(2)_$J(+$G(^TMP("BSD",$J,S1,I)),6)
  1. . S LINE=$$PAD(LINE,73)_$J(+$G(^TMP("BSD",$J,S1)),6) ;add in total
  1. . D SET(LINE,.VALMCNT)
  1. . ;
  1. . I BSDSRT D ;total of 2nd sort for subtotal category
  1. .. S BSDI=$$SUB21(BSDSRT),BSDJ=$$SUB22(BSDSRT)
  1. .. F J=BSDI,BSDJ D
  1. ... S LINE=$$PAD(" TOTAL "_J,25)
  1. ... F I=1:1:5 S LINE=LINE_$$SP(2)_$J(+$G(^TMP("BSD",$J,S1,I,0,J)),6)
  1. ... S LINE=$$PAD(LINE,73)_$J(+$G(^TMP("BSD",$J,S1,0,0,J)),6)
  1. ... D SET(LINE,.VALMCNT)
  1. . D SET("",.VALMCNT)
  1. . ;
  1. . ; totals by clinic
  1. . S S2=0 F S S2=$O(^TMP("BSD",$J,S1,0,S2)) Q:S2="" D
  1. .. I S2'=S1 D ;if sort by clinic, don't repeat data
  1. ... S LINE=$$PAD($$SP(3)_S2,25) ;clinic name
  1. ... F I=1:1:5 S LINE=LINE_$$SP(2)_$J(+$G(^TMP("BSD",$J,S1,I,S2)),6)
  1. ... S LINE=$$PAD(LINE,73)_$J(+$G(^TMP("BSD",$J,S1,0,S2)),6)
  1. ... D SET(LINE,.VALMCNT)
  1. ... ;
  1. ... ; subtotal clinics by 2nd subcategory
  1. ... I BSDSRT D
  1. .... S BSDI=$$SUB21(BSDSRT),BSDJ=$$SUB22(BSDSRT)
  1. .... F J=BSDI,BSDJ D
  1. ..... S LINE=$$PAD($$SP(4)_"TOTAL "_J,25)
  1. ..... F I=1:1:5 S LINE=LINE_$$SP(2)_$J(+$G(^TMP("BSD",$J,S1,I,S2,J)),6)
  1. ..... S LINE=$$PAD(LINE,73)_$J(+$G(^TMP("BSD",$J,S1,0,S2,J)),6)
  1. ..... D SET(LINE,.VALMCNT)
  1. .. ;
  1. .. ; subtotal clinics by date
  1. .. S S3="" F S S3=$O(^TMP("BSD",$J,S1,0,S2,S3)) Q:S3="" D
  1. ... S S4=0 F S S4=$O(^TMP("BSD",$J,S1,0,S2,S3,S4)) Q:S4="" D
  1. .... S X=$S(S3=0:"",1:" - "_S3) ;2nd category if used
  1. .... S LINE=$$PAD($$SP(4)_$$FMTE^XLFDT(S4)_X,25)
  1. .... F I=1:1:6 S LINE=LINE_$$SP(2)_$J(+$G(^TMP("BSD",$J,S1,I,S2,S3,S4)),6)
  1. .... S LINE=$$PAD(LINE,73)_$J(+$G(^TMP("BSD",$J,S1,0,S2,S3,S4)),6)
  1. .... D SET(LINE,.VALMCNT)
  1. .. D SET("",.VALMCNT)
  1. ;
  1. S LINE=$$PAD("REPORT TOTALS",25)
  1. F I=1:1:5 S LINE=LINE_$$SP(2)_$J(+$G(^TMP("BSD",$J,0,I)),6)
  1. S LINE=$$PAD(LINE,73)_$J(+$G(^TMP("BSD",$J,0)),6)
  1. D SET("",.VALMCNT),SET(LINE,.VALMCNT)
  1. ;
  1. K ^TMP("BSD",$J)
  1. Q
  1. ;
  1. SUB1(C,N) ; -- return name of subcategory for clinic C
  1. I BSDSUB="P" Q $$PRIN^BSDU(CLN)
  1. I BSDSUB="V" Q $P($$PRV^BSDU(CLN),U,2)
  1. I BSDSUB="T" Q $P($$TEAM^BSDU(CLN),U,2)
  1. Q N
  1. ;
  1. SUB2(D,P) ; -- returns value of 2nd sort if asked for
  1. I BSDSRT=0 Q 0
  1. I BSDSRT=1 NEW X S X=$E($P(D,".",2),1,2) Q $S(X<12:"AM",1:"PM")
  1. I BSDSRT=2 NEW X,Y S X=$$GET1^DIQ(2,P,.03,"I"),Y=$$FMDIFF^XLFDT(D,X)/365.25 Q $S(Y<15:"PEDS",1:"ADULT")
  1. I BSDSRT=3 Q $$GET1^DIQ(2,P,.02)
  1. Q "??" ;error in case one slips thru
  1. ;
  1. SUB21(X) ; returns external category
  1. Q $S(X=1:"AM",X=2:"PEDS",1:"MALE")
  1. ;
  1. SUB22(X) ; returns 2nd value of 2nd subcategory
  1. Q $S(X=1:"PM",X=2:"ADULT",1:"FEMALE")
  1. ;
  1. TYPE(C,D,N,P,S) ; -- return type of appt.
  1. ; returns column #
  1. ; 1=sched, 2=same day, 3=walk-in, 4=overbook, 5=inpt, 6=no-show
  1. I S["NO-SHOW" Q 6 ;no-show
  1. I S["INPAT" Q 5 ;inpatient
  1. NEW X S X=$P($G(^DPT(P,"S",D,0)),U,7) I X=4 Q 3 ;walkin
  1. I X=9,(D\1)=($P($G(^SC(C,"S",D,1,N,0)),U,7)\1) Q 3 ;same day CR
  1. I X=9,(D\1)'=($P($G(^SC(C,"S",D,1,N,0)),U,7)\1) Q 1 ;future CR
  1. I X=3,(D\1)=($P($G(^SC(C,"S",D,1,N,0)),U,7)\1) Q 2 ;same day appt
  1. I $G(^SC(C,"S",D,1,N,"OB"))="O" Q 4 ;sched overbook
  1. I X=3 Q 1 ;scheduled
  1. Q "??" ;error in case one slips thru
  1. ;
  1. INCR(SUB,TYPE,NAME,SUB2,APPT) ; increment totals
  1. NEW DATE S DATE=APPT\1
  1. I TYPE'=6 S ^TMP("BSD",$J,0)=$G(^TMP("BSD",$J,0))+1
  1. I TYPE'=6 S ^TMP("BSD",$J,SUB)=$G(^TMP("BSD",$J,SUB))+1
  1. S ^TMP("BSD",$J,0,TYPE)=$G(^TMP("BSD",$J,0,TYPE))+1
  1. S ^TMP("BSD",$J,SUB,TYPE)=$G(^TMP("BSD",$J,SUB,TYPE))+1
  1. I TYPE'=6 S ^TMP("BSD",$J,SUB,0,NAME)=$G(^TMP("BSD",$J,SUB,0,NAME))+1
  1. S ^TMP("BSD",$J,SUB,TYPE,NAME)=$G(^TMP("BSD",$J,SUB,TYPE,NAME))+1
  1. S ^TMP("BSD",$J,SUB,0,0,SUB2)=$G(^TMP("BSD",$J,SUB,0,0,SUB2))+1
  1. S ^TMP("BSD",$J,SUB,TYPE,0,SUB2)=$G(^TMP("BSD",$J,SUB,TYPE,0,SUB2))+1
  1. S ^TMP("BSD",$J,SUB,0,NAME,SUB2)=$G(^TMP("BSD",$J,SUB,0,NAME,SUB2))+1
  1. S ^TMP("BSD",$J,SUB,TYPE,NAME,SUB2)=$G(^TMP("BSD",$J,SUB,TYPE,NAME,SUB2))+1
  1. I BSDDET S ^TMP("BSD",$J,SUB,0,NAME,SUB2,DATE)=$G(^TMP("BSD",$J,SUB,0,NAME,SUB2,DATE))+1
  1. I BSDDET S ^TMP("BSD",$J,SUB,TYPE,NAME,SUB2,DATE)=$G(^TMP("BSD",$J,SUB,TYPE,NAME,SUB2,DATE))+1
  1. Q
  1. ;
  1. SET(LINE,NUM) ; -- sets display line into array
  1. S NUM=NUM+1
  1. S ^TMP("BSDWKR1",$J,NUM,0)=LINE
  1. Q
  1. ;
  1. HELP ; -- help code
  1. S X="?" D DISP^XQORM1 W !!
  1. Q
  1. ;
  1. HELP1 ;EP; help for subtotal question
  1. D MSG^BDGF("This report will subtotal results any of 4 ways:",2,0)
  1. D MSG^BDGF(" Choose C to subtotal by individual clinic;",1,0)
  1. D MSG^BDGF(" Choose P to subtotal by principal clinic;",1,0)
  1. D MSG^BDGF(" Choose V to subtotal by a clinic's provider;",1,0)
  1. D MSG^BDGF(" Choose T to subtotal by a clinic's team.",1,0)
  1. D MSG^BDGF("Clinics not affiliated with a principal clinic,",2,0)
  1. D MSG^BDGF("provider or team, will be subtotaled under the",1,0)
  1. D MSG^BDGF("""Unaffiliated"" designation.",1,1)
  1. Q
  1. ;
  1. HELP2 ;EP; help for assume patient seen question
  1. D MSG^BDGF("Answer YES if you want the report to assume patients",2,0)
  1. D MSG^BDGF("were seen even when their appointments were NOT",1,0)
  1. D MSG^BDGF("checked-in or flagged as no-shows.",1,0)
  1. D MSG^BDGF("Answer NO if only appointments with a check-in date/time",2,0)
  1. D MSG^BDGF("are to be counted. No-shows are counted separately.",1,0)
  1. D MSG^BDGF("The Appt. Management Report can list all appointments",1,0)
  1. D MSG^BDGF("without an action status so the data can be cleaned up.",1,1)
  1. Q
  1. ;
  1. HELP3 ;EP; help for print individual dates question
  1. D MSG^BDGF("Answer YES to have the report totals for each date",2,0)
  1. D MSG^BDGF("within the date range you have selected.",1,0)
  1. D MSG^BDGF("Answer NO to just have one set of totals for each",1,0)
  1. D MSG^BDGF("clinic for the entire date range.",1,1)
  1. Q
  1. ;
  1. EXIT ; -- exit code
  1. K ^TMP("BSDWKR1",$J)
  1. Q
  1. ;
  1. EXPND ; -- expand code
  1. Q
  1. ;
  1. PRINT ; print report to paper
  1. U IO D HDG
  1. NEW X S X=0 F S X=$O(^TMP("BSDWKR1",$J,X)) Q:'X D
  1. . I $Y>(IOSL-4) D HDG
  1. . W !,^TMP("BSDWKR1",$J,X,0)
  1. D ^%ZISC,EXIT
  1. Q
  1. ;
  1. HDG ; heading for paper report
  1. D HDR W @IOF,?30,"Workload Statistics"
  1. F I=1:1 Q:'$D(VALMHDR(I)) W !,VALMHDR(I)
  1. W !,$$REPEAT^XLFSTR("-",80)
  1. W !,"Category Names",?28,"SCHED",?34,"SAMEDAY",?43,"WALKIN"
  1. W ?51,"OVERBK",?61,"INPT",?70,"TOTAL SEEN"
  1. W !,$$REPEAT^XLFSTR("=",80)
  1. Q
  1. ;
  1. PAD(D,L) ;EP -- SUBRTN to pad length of data
  1. ; -- D=data L=length
  1. Q $E(D_$$REPEAT^XLFSTR(" ",L),1,L)
  1. ;
  1. SP(N) ; -- SUBRTN to pad N number of spaces
  1. Q $$PAD(" ",N)