- BSDNS2 ; IHS/ANMC/LJF - FREQUENT NO-SHOWS ;
- ;;5.3;PIMS;**1010**;APR 26, 2002
- ;
- ASK ; ask user questions
- NEW VAUTC,VAUTD,POP,BSDBD,BSDED,BSDSUB,BSDTT,Y,BSDSEEN
- N BSDCP,BSDP,BSDPCNT
- D CLINIC^BSDU(2) Q:$D(BSDQ)
- ;
- ;cmi/maw patch 1010 possibility to ask for patient in later patch
- ; get clinic arrays
- ;S BSDCP=$$READ^BDGF("S^C:Clinic;P:Patient","Select Clinic or Patient","Clinic") ;cmi/maw PATCH 1010
- ;Q:BSDCP=U ;cmi/maw PATCH 1010
- ;
- ;I BSDCP="C" D CLINIC^BSDU(2) Q:$D(BSDQ)
- ;I BSDCP="P" D
- ;. S VAUTC=1
- ;. S BSDP=$$READ^BDGF("S^A:All Patients;I:Individual Patients","All or Individual Patients","All")
- ;. Q:BSDP=U
- ;. I BSDP="I" S BSDPCNT=0 D PAT
- ;I BSDCP="P" Q:'$D(BSDP(1))
- ;
- S BSDBD=$$READ^BDGF("DO^::EX","Select First Date to Search") Q:'BSDBD
- S BSDED=$$READ^BDGF("DO^::EX","Select Last Date to Search") Q:'BSDED
- ;
- S BSDLMT=$$READ^BDGF("N^1:99","Number of No-Shows that defines Frequent","","^D HELP1^BSDNS2") Q:BSDLMT="" Q:BSDLMT=U
- ;
- S BSDMODE=$$READ^BDGF("S^F:Facility;P:Principal Clinic;C:Clinic;N:Patient;O:Clinic Code","No-Show Limit based on which category","","^D HELP2^BSDNS2") Q:BSDMODE="" Q:BSDMODE=U ;cmi/maw PATCH 1010 RQMT 1
- ;
- S BSDINFO=$$READ^BDGF("YO","Display Appt. Other Info","NO","^D HELP3^BSDNS2") Q:BSDINFO=U
- ;
- S Y=$$BROWSE^BDGF Q:"PB"'[Y I Y="B" D EN Q ;browse in list mgr mode
- D ZIS^BDGF("PQ","START^BSDNS2","FREQ NO-SHOWS","BSDINFO;BSDLMT;BSDMODE;BSDBD;BSDED;VAUTC*;VAUTD*")
- Q
- ;
- PAT ;-- select patients to show or all
- S DIC=9000001,DIC("A")="Select Patient: ",DIC(0)="AEMQZ"
- D ^DIC
- S BSDP=+Y
- Q:Y<0
- S BSDPCNT=BSDPCNT+1
- S BSDP(BSDPCNT)=+BSDP
- G PAT
- Q
- ;
- START ;EP; -- re-entry for printing to paper
- D INIT,PRINT Q
- ;
- EN ; -- main entry point for BSDRM FREQUENT NOSHOWS
- NEW VALMCNT D TERM^VALM0,CLEAR^VALM1
- D EN^VALM("BSDRM FREQUENT NOSHOWS")
- D CLEAR^VALM1
- Q
- ;
- HDR ; -- header code
- S VALMHDR(1)=$$SP(15)_$$CONF^BSDU
- S VALMHDR(2)=$$SP(11)_"For appointments between "_$$FMTE^XLFDT(BSDBD)
- S VALMHDR(2)=VALMHDR(2)_" and "_$$FMTE^XLFDT(BSDED)
- S VALMHDR(3)=$$SP(13)_"Patients with at least "_BSDLMT_" no-shows "_$$MODEMSG(BSDMODE)
- Q
- ;
- INIT ; -- init variables and list array
- S VALMCNT=0 K ^TMP("BSDNS2",$J),^TMP("BSDNS21",$J)
- NEW BSDAR S BSDAR=$S(VAUTC:"^SC",1:"VAUTC")
- ;
- ; -- loop by clinic
- NEW CLN,PC,APPT,IEN,CLNM,PATNM,DFN,X,NOSHOWS
- S CLN=0 F S CLN=$O(@BSDAR@(CLN)) Q:'CLN D
- . Q:$D(^SC("AIHSPC",CLN)) ;quit if principal clinic
- . S PC=$$PRIN^BSDU(CLN) ;principal clinic name
- . S CLNM=$$GET1^DIQ(44,CLN,.01) ;clinic's name
- . ;
- . ; now loop by date to find no-shows
- . ; loop backwards to find most recent no-show
- . S APPT=BSDED+.24,END=BSDBD
- . F S APPT=$O(^SC(CLN,"S",APPT),-1) Q:'APPT Q:APPT<BSDBD D
- .. S IEN=0 F S IEN=$O(^SC(CLN,"S",APPT,1,IEN)) Q:'IEN D
- ... S DFN=+^SC(CLN,"S",APPT,1,IEN,0) ;pat ien
- ... ; quit if not a no-show
- ... S X=$P($G(^DPT(DFN,"S",APPT,0)),U,2) Q:X="NT" Q:X'["N"
- ... S PATNM=$$GET1^DIQ(2,DFN,.01) ;pat name
- ... Q:$D(^TMP("BSDNS21",$J,PC,CLNM,PATNM,DFN)) ;patient already done
- ... ;
- ... S NOSHOWS=$$PDATA(DFN,CLN,APPT,BSDED) ;count no-shows for pat
- ... Q:'$$LIMIT(NOSHOWS,BSDLMT,BSDMODE) ;quit if not within limit
- ... I BSDMODE'="N" S ^TMP("BSDNS21",$J,PC,CLNM,PATNM,DFN)=NOSHOWS_U_APPT
- ... I BSDMODE="N" S ^TMP("BSDNS21",$J,PATNM,DFN,CLNM)=NOSHOWS_U_APPT ;cmi/maw PATCH 1010 RQMT 1
- ;
- ; put sorted list into display array
- ;below will be by clinic cmi/maw PATCH 1010 RQMT 1
- I BSDMODE'="N" D BYPC Q
- I BSDMODE="N" D BYPAT Q
- Q
- ;
- BYPC ;-- sort everything by clinic
- NEW LINE,COUNTS
- S PC=0 F S PC=$O(^TMP("BSDNS21",$J,PC)) Q:PC="" D
- . S LINE=$$PAD("Principal Clinic: "_PC,45)_" ("_$$LMT(PC)_")"
- . D SET(LINE,.VALMCNT)
- . ;
- . S CLNM=0 F S CLNM=$O(^TMP("BSDNS21",$J,PC,CLNM)) Q:CLNM="" D
- .. S LINE=" "_CLNM_" ("_$$LMT(CLNM)_")" ;clinic name
- .. D SET("",.VALMCNT),SET(LINE,.VALMCNT)
- .. ;
- .. S PATNM=0
- .. F S PATNM=$O(^TMP("BSDNS21",$J,PC,CLNM,PATNM)) Q:PATNM="" D
- ... S DFN=0
- ... F S DFN=$O(^TMP("BSDNS21",$J,PC,CLNM,PATNM,DFN)) Q:'DFN D
- .... S COUNTS=^TMP("BSDNS21",$J,PC,CLNM,PATNM,DFN) ;no-show counts
- .... S LINE=$$PAD($$SP(2)_PATNM,18)_$J($$HRCN^BDGF2(DFN,+$G(DUZ(2))),7)
- .... S LINE=$$PAD($$PAD(LINE,30)_$P(COUNTS,U,4),53) ;last noshow dt
- .... F I=3,2,1 S LINE=LINE_$J($P(COUNTS,U,I),8)
- .... D SET(LINE,.VALMCNT)
- .... I BSDINFO D SET($$SP(15)_$P(COUNTS,U,5),.VALMCNT)
- . D SET("",.VALMCNT)
- ;
- ;K ^TMP("BSDNS21",$J)
- Q
- ;
- BYPAT ;-- sort by patient
- NEW LINE,COUNTS
- S PAT=0 F S PAT=$O(^TMP("BSDNS21",$J,PAT)) Q:PAT="" D
- . S LINE=$$PAD("Patient Name: "_$E(PAT,1,20)_" Chart: "_$$HRCN^BDGF2($O(^TMP("BSDNS21",$J,PAT,0)),+$G(DUZ(2))),57)_" ("_$$LMT(PAT)_")"
- . D SET(LINE,.VALMCNT)
- . ;
- . S DFN=0 F S DFN=$O(^TMP("BSDNS21",$J,PAT,DFN)) Q:DFN="" D
- .. S CLNNM=0
- .. F S CLNNM=$O(^TMP("BSDNS21",$J,PAT,DFN,CLNNM)) Q:CLNNM="" D
- ... S COUNTS=^TMP("BSDNS21",$J,PAT,DFN,CLNNM) ;no-show counts
- ... S LINE=$$PAD($$SP(2)_CLNNM,18)
- ... S LINE=$$PAD($$PAD(LINE,30)_$P(COUNTS,U,4),53) ;last noshow dt
- ... F I=3,2,1 S LINE=LINE_$J($P(COUNTS,U,I),8)
- ... D SET(LINE,.VALMCNT)
- ... I BSDINFO D SET($$SP(15)_$P(COUNTS,U,5),.VALMCNT)
- . D SET("",.VALMCNT)
- Q
- ;
- PRINT ; -- print list to paper
- U IO NEW BSDN,BSDT
- S BSDN=0 D HDG
- F S BSDN=$O(^TMP("BSDNS2",$J,BSDN)) Q:'BSDN D
- . I $Y>(IOSL-5) D HDG
- . W !,^TMP("BSDNS2",$J,BSDN,0)
- D ^%ZISC,EXIT
- Q
- ;
- HDG ;Print report header
- NEW X,I
- W @IOF
- I '$D(BSDT) S X=$$HTFM^XLFDT($H),BSDT=$$FMTE^XLFDT($E(X,1,12),"2P")
- W !?20,"FREQUENT NO-SHOWS REPORT",?55,"Printed: ",BSDT
- D HDR F I=1:1:3 W !,VALMHDR(I)
- W !,$$REPEAT^XLFSTR("-",80)
- Q
- ;
- HELP ; -- help code
- S X="?" D DISP^XQORM1 W !!
- Q
- ;
- EXIT ; -- exit code
- K ^TMP("BSDNS2",$J)
- Q
- ;
- EXPND ; -- expand code
- Q
- ;
- HELP1 ;EP; help for number limit question
- D MSG^BDGF("Enter the number of no-shows a patient must have",2,0)
- D MSG^BDGF("within a clinic's time frame (up to a year) to be",1,0)
- D MSG^BDGF("included on this report.",1,1)
- Q
- ;
- HELP2 ;EP; help for limit category
- D MSG^BDGF("Please select the no-show limit category.",2,1)
- D MSG^BDGF("Answer F to include patients with at least "_BSDLMT_" no-shows for your whole FACILITY.",1,0)
- D MSG^BDGF("Answer P to include patients with at least "_BSDLMT_" no-shows within a PRINCIPAL clinic.",1,0)
- D MSG^BDGF("Answer C to include patients with at least "_BSDLMT_" no-shows within a selected CLINIC.",1,1)
- Q
- ;
- HELP3 ;EP; help for display other info question
- D MSG^BDGF("Answer YES to include appointment length and other info (used for appt reason).",2,0)
- D MSG^BDGF("Answer NO to list patient name, chart #, last no-show, and counts only.",2,1)
- Q
- ;
- PDATA(DFN,CLINIC,BEGDT,ENDT) ;EP; -- called to calculate # noshows for patient
- ; will count patient's no-shows in this clinic & principal clinic
- ; date range for search is based on division and clinic parameters
- NEW PRINC,TOTL,NOCLN,PCNT,LMT,LMT2,X,X1,X2,APPDT,LINE,LASTNOS,CLNCD
- S PRINC=$P($G(^SC(+CLINIC,"SL")),U,5) ;princ clinic
- S CLNCD=$P($G(^SC(+CLINIC,0)),U,7) ;clinic code
- S (TOTL,NOCLN,PCNT,CLNCNT)=0
- S LMT=$$GET1^DIQ(9009020.2,$$DIV^BSDU,.15) ;division limit
- I 'LMT S LMT=365
- S LMT2=$$GET1^DIQ(9009017.2,+CLINIC,.03) ;clinic limit
- S LMT2=$S(LMT2="":LMT,1:LMT2) ;clinic overrides div
- ;
- ; loop by division date limit to get patient's total no-shows for site
- S X1=BEGDT,X2=-LMT D C^%DTC S APPDT=X
- F S APPDT=$O(^DPT(DFN,"S",APPDT)) Q:'APPDT Q:(APPDT>(ENDT+.24)) D
- . S X=$P(^DPT(DFN,"S",APPDT,0),U,2) Q:(X="NT") Q:(X'["N")
- . S TOTL=TOTL+1
- ;
- ; loop by clinic date range for clinic specific totals
- S X1=BEGDT,X2=-LMT2 D C^%DTC S APPDT=X
- F S APPDT=$O(^DPT(DFN,"S",APPDT)) Q:'APPDT Q:(APPDT>(ENDT+.24)) D
- . S X=$P(^DPT(DFN,"S",APPDT,0),U,2) Q:(X="NT") Q:(X'["N")
- . ;
- . ; if appt for specified clinic, add to subtotal & set last no-show
- . I +^DPT(DFN,"S",APPDT,0)=+CLINIC D
- .. S NOCLN=NOCLN+1,LASTNOS=$$LASTNOS(DFN,+CLINIC,APPDT)
- . ;
- . ; if part of specified principal clinic, add to its subtotal
- . I PRINC]"",$D(^SC("AIHSPC",+PRINC,+^DPT(DFN,"S",APPDT,0))) S PCNT=PCNT+1
- . I CLNCD]"" S CLNCNT=CLNCNT+1
- ;
- ; returns numbers: total facility^total prin^total clinic^last noshow^clinic code count
- Q TOTL_U_$G(PCNT)_U_NOCLN_U_$G(LASTNOS)_U_CLNCNT
- ;
- LASTNOS(PAT,CLINIC,DATE) ; -- returns appt display line
- NEW X,Y,Z
- S X=$$FMTE^XLFDT(DATE,2)_" " ;appt date/time
- ; get info out of hospital location file entry
- S Y=0 F S Y=$O(^SC(+CLINIC,"S",DATE,1,Y)) Q:'Y!$D(Z) D
- . Q:$P(^SC(+CLINIC,"S",DATE,1,Y,0),U)'=PAT
- . S Z=^SC(+CLINIC,"S",DATE,1,Y,0)
- . S X=X_U_$P(Z,U,2)_"MIN "_$E($P(Z,U,4),1,25) ;appt length&other info
- Q X
- ;
- LIMIT(NUM,LMT,MODE) ; returns 1 if number within limit for mode
- ; +NUM=# of no-shows for patient
- ; LMT=# no-shows needed to be included
- ; MODE=(F:facility, P:principal clinic C:clinic)
- I MODE="F" Q $S(+NUM<LMT:0,1:1) ;enough for facility?
- I MODE="P" Q $S($P(NUM,U,2)<LMT:0,1:1) ;enough for princ clinic?
- I MODE="C" Q $S($P(NUM,U,3)<LMT:0,1:1) ;enough for this clinic?
- I MODE="N" Q $S(+NUM<LMT:0,1:1) ;enough for this patient? cmi/maw PATCH 1010 RQMT 1
- I MODE="O" Q $S($P(NUM,U,5)<LMT:0,1:1) ;enough for this clinic code
- Q 0
- ;
- LMT(CLN) ; return time limit for clinic
- NEW LMT,LMT2
- S LMT=$$GET1^DIQ(9009020.2,$$DIV^BSDU,.15) ;division limit
- I 'LMT S LMT=365
- S LMT2=$$GET1^DIQ(9009017.2,+CLN,.03) ;clinic limit
- Q "Count back "_$S(LMT2="":LMT,1:LMT2)_" days" ;clinic overrides div
- ;
- MODEMSG(MODE) ; return mode in external format
- I MODE="F" Q "for the facility"
- I MODE="P" Q "within principal clinics"
- Q "within any clinic"
- ;
- SET(LINE,NUM) ; put display line into display array
- S NUM=NUM+1
- S ^TMP("BSDNS2",$J,NUM,0)=LINE
- Q
- ;
- PAD(D,L) ; -- SUBRTN to pad length of data
- ; -- D=data L=length
- Q $E(D_$$REPEAT^XLFSTR(" ",L),1,L)
- ;
- SP(N) ; -- SUBRTN to pad N number of spaces
- Q $$PAD(" ",N)
- BSDNS2 ; IHS/ANMC/LJF - FREQUENT NO-SHOWS ;
- +1 ;;5.3;PIMS;**1010**;APR 26, 2002
- +2 ;
- ASK ; ask user questions
- +1 NEW VAUTC,VAUTD,POP,BSDBD,BSDED,BSDSUB,BSDTT,Y,BSDSEEN
- +2 NEW BSDCP,BSDP,BSDPCNT
- +3 DO CLINIC^BSDU(2)
- IF $DATA(BSDQ)
- QUIT
- +4 ;
- +5 ;cmi/maw patch 1010 possibility to ask for patient in later patch
- +6 ; get clinic arrays
- +7 ;S BSDCP=$$READ^BDGF("S^C:Clinic;P:Patient","Select Clinic or Patient","Clinic") ;cmi/maw PATCH 1010
- +8 ;Q:BSDCP=U ;cmi/maw PATCH 1010
- +9 ;
- +10 ;I BSDCP="C" D CLINIC^BSDU(2) Q:$D(BSDQ)
- +11 ;I BSDCP="P" D
- +12 ;. S VAUTC=1
- +13 ;. S BSDP=$$READ^BDGF("S^A:All Patients;I:Individual Patients","All or Individual Patients","All")
- +14 ;. Q:BSDP=U
- +15 ;. I BSDP="I" S BSDPCNT=0 D PAT
- +16 ;I BSDCP="P" Q:'$D(BSDP(1))
- +17 ;
- +18 SET BSDBD=$$READ^BDGF("DO^::EX","Select First Date to Search")
- IF 'BSDBD
- QUIT
- +19 SET BSDED=$$READ^BDGF("DO^::EX","Select Last Date to Search")
- IF 'BSDED
- QUIT
- +20 ;
- +21 SET BSDLMT=$$READ^BDGF("N^1:99","Number of No-Shows that defines Frequent","","^D HELP1^BSDNS2")
- IF BSDLMT=""
- QUIT
- IF BSDLMT=U
- QUIT
- +22 ;
- +23 ;cmi/maw PATCH 1010 RQMT 1
- SET BSDMODE=$$READ^BDGF("S^F:Facility;P:Principal Clinic;C:Clinic;N:Patient;O:Clinic Code","No-Show Limit based on which category","","^D HELP2^BSDNS2")
- IF BSDMODE=""
- QUIT
- IF BSDMODE=U
- QUIT
- +24 ;
- +25 SET BSDINFO=$$READ^BDGF("YO","Display Appt. Other Info","NO","^D HELP3^BSDNS2")
- IF BSDINFO=U
- QUIT
- +26 ;
- +27 ;browse in list mgr mode
- SET Y=$$BROWSE^BDGF
- IF "PB"'[Y
- QUIT
- IF Y="B"
- DO EN
- QUIT
- +28 DO ZIS^BDGF("PQ","START^BSDNS2","FREQ NO-SHOWS","BSDINFO;BSDLMT;BSDMODE;BSDBD;BSDED;VAUTC*;VAUTD*")
- +29 QUIT
- +30 ;
- PAT ;-- select patients to show or all
- +1 SET DIC=9000001
- SET DIC("A")="Select Patient: "
- SET DIC(0)="AEMQZ"
- +2 DO ^DIC
- +3 SET BSDP=+Y
- +4 IF Y<0
- QUIT
- +5 SET BSDPCNT=BSDPCNT+1
- +6 SET BSDP(BSDPCNT)=+BSDP
- +7 GOTO PAT
- +8 QUIT
- +9 ;
- START ;EP; -- re-entry for printing to paper
- +1 DO INIT
- DO PRINT
- QUIT
- +2 ;
- EN ; -- main entry point for BSDRM FREQUENT NOSHOWS
- +1 NEW VALMCNT
- DO TERM^VALM0
- DO CLEAR^VALM1
- +2 DO EN^VALM("BSDRM FREQUENT NOSHOWS")
- +3 DO CLEAR^VALM1
- +4 QUIT
- +5 ;
- HDR ; -- header code
- +1 SET VALMHDR(1)=$$SP(15)_$$CONF^BSDU
- +2 SET VALMHDR(2)=$$SP(11)_"For appointments between "_$$FMTE^XLFDT(BSDBD)
- +3 SET VALMHDR(2)=VALMHDR(2)_" and "_$$FMTE^XLFDT(BSDED)
- +4 SET VALMHDR(3)=$$SP(13)_"Patients with at least "_BSDLMT_" no-shows "_$$MODEMSG(BSDMODE)
- +5 QUIT
- +6 ;
- INIT ; -- init variables and list array
- +1 SET VALMCNT=0
- KILL ^TMP("BSDNS2",$JOB),^TMP("BSDNS21",$JOB)
- +2 NEW BSDAR
- SET BSDAR=$SELECT(VAUTC:"^SC",1:"VAUTC")
- +3 ;
- +4 ; -- loop by clinic
- +5 NEW CLN,PC,APPT,IEN,CLNM,PATNM,DFN,X,NOSHOWS
- +6 SET CLN=0
- FOR
- SET CLN=$ORDER(@BSDAR@(CLN))
- IF 'CLN
- QUIT
- Begin DoDot:1
- +7 ;quit if principal clinic
- IF $DATA(^SC("AIHSPC",CLN))
- QUIT
- +8 ;principal clinic name
- SET PC=$$PRIN^BSDU(CLN)
- +9 ;clinic's name
- SET CLNM=$$GET1^DIQ(44,CLN,.01)
- +10 ;
- +11 ; now loop by date to find no-shows
- +12 ; loop backwards to find most recent no-show
- +13 SET APPT=BSDED+.24
- SET END=BSDBD
- +14 FOR
- SET APPT=$ORDER(^SC(CLN,"S",APPT),-1)
- IF 'APPT
- QUIT
- IF APPT<BSDBD
- QUIT
- Begin DoDot:2
- +15 SET IEN=0
- FOR
- SET IEN=$ORDER(^SC(CLN,"S",APPT,1,IEN))
- IF 'IEN
- QUIT
- Begin DoDot:3
- +16 ;pat ien
- SET DFN=+^SC(CLN,"S",APPT,1,IEN,0)
- +17 ; quit if not a no-show
- +18 SET X=$PIECE($GET(^DPT(DFN,"S",APPT,0)),U,2)
- IF X="NT"
- QUIT
- IF X'["N"
- QUIT
- +19 ;pat name
- SET PATNM=$$GET1^DIQ(2,DFN,.01)
- +20 ;patient already done
- IF $DATA(^TMP("BSDNS21",$JOB,PC,CLNM,PATNM,DFN))
- QUIT
- +21 ;
- +22 ;count no-shows for pat
- SET NOSHOWS=$$PDATA(DFN,CLN,APPT,BSDED)
- +23 ;quit if not within limit
- IF '$$LIMIT(NOSHOWS,BSDLMT,BSDMODE)
- QUIT
- +24 IF BSDMODE'="N"
- SET ^TMP("BSDNS21",$JOB,PC,CLNM,PATNM,DFN)=NOSHOWS_U_APPT
- +25 ;cmi/maw PATCH 1010 RQMT 1
- IF BSDMODE="N"
- SET ^TMP("BSDNS21",$JOB,PATNM,DFN,CLNM)=NOSHOWS_U_APPT
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +26 ;
- +27 ; put sorted list into display array
- +28 ;below will be by clinic cmi/maw PATCH 1010 RQMT 1
- +29 IF BSDMODE'="N"
- DO BYPC
- QUIT
- +30 IF BSDMODE="N"
- DO BYPAT
- QUIT
- +31 QUIT
- +32 ;
- BYPC ;-- sort everything by clinic
- +1 NEW LINE,COUNTS
- +2 SET PC=0
- FOR
- SET PC=$ORDER(^TMP("BSDNS21",$JOB,PC))
- IF PC=""
- QUIT
- Begin DoDot:1
- +3 SET LINE=$$PAD("Principal Clinic: "_PC,45)_" ("_$$LMT(PC)_")"
- +4 DO SET(LINE,.VALMCNT)
- +5 ;
- +6 SET CLNM=0
- FOR
- SET CLNM=$ORDER(^TMP("BSDNS21",$JOB,PC,CLNM))
- IF CLNM=""
- QUIT
- Begin DoDot:2
- +7 ;clinic name
- SET LINE=" "_CLNM_" ("_$$LMT(CLNM)_")"
- +8 DO SET("",.VALMCNT)
- DO SET(LINE,.VALMCNT)
- +9 ;
- +10 SET PATNM=0
- +11 FOR
- SET PATNM=$ORDER(^TMP("BSDNS21",$JOB,PC,CLNM,PATNM))
- IF PATNM=""
- QUIT
- Begin DoDot:3
- +12 SET DFN=0
- +13 FOR
- SET DFN=$ORDER(^TMP("BSDNS21",$JOB,PC,CLNM,PATNM,DFN))
- IF 'DFN
- QUIT
- Begin DoDot:4
- +14 ;no-show counts
- SET COUNTS=^TMP("BSDNS21",$JOB,PC,CLNM,PATNM,DFN)
- +15 SET LINE=$$PAD($$SP(2)_PATNM,18)_$JUSTIFY($$HRCN^BDGF2(DFN,+$GET(DUZ(2))),7)
- +16 ;last noshow dt
- SET LINE=$$PAD($$PAD(LINE,30)_$PIECE(COUNTS,U,4),53)
- +17 FOR I=3,2,1
- SET LINE=LINE_$JUSTIFY($PIECE(COUNTS,U,I),8)
- +18 DO SET(LINE,.VALMCNT)
- +19 IF BSDINFO
- DO SET($$SP(15)_$PIECE(COUNTS,U,5),.VALMCNT)
- End DoDot:4
- End DoDot:3
- End DoDot:2
- +20 DO SET("",.VALMCNT)
- End DoDot:1
- +21 ;
- +22 ;K ^TMP("BSDNS21",$J)
- +23 QUIT
- +24 ;
- BYPAT ;-- sort by patient
- +1 NEW LINE,COUNTS
- +2 SET PAT=0
- FOR
- SET PAT=$ORDER(^TMP("BSDNS21",$JOB,PAT))
- IF PAT=""
- QUIT
- Begin DoDot:1
- +3 SET LINE=$$PAD("Patient Name: "_$EXTRACT(PAT,1,20)_" Chart: "_$$HRCN^BDGF2($ORDER(^TMP("BSDNS21",$JOB,PAT,0)),+$GET(DUZ(2))),57)_" ("_$$LMT(PAT)_")"
- +4 DO SET(LINE,.VALMCNT)
- +5 ;
- +6 SET DFN=0
- FOR
- SET DFN=$ORDER(^TMP("BSDNS21",$JOB,PAT,DFN))
- IF DFN=""
- QUIT
- Begin DoDot:2
- +7 SET CLNNM=0
- +8 FOR
- SET CLNNM=$ORDER(^TMP("BSDNS21",$JOB,PAT,DFN,CLNNM))
- IF CLNNM=""
- QUIT
- Begin DoDot:3
- +9 ;no-show counts
- SET COUNTS=^TMP("BSDNS21",$JOB,PAT,DFN,CLNNM)
- +10 SET LINE=$$PAD($$SP(2)_CLNNM,18)
- +11 ;last noshow dt
- SET LINE=$$PAD($$PAD(LINE,30)_$PIECE(COUNTS,U,4),53)
- +12 FOR I=3,2,1
- SET LINE=LINE_$JUSTIFY($PIECE(COUNTS,U,I),8)
- +13 DO SET(LINE,.VALMCNT)
- +14 IF BSDINFO
- DO SET($$SP(15)_$PIECE(COUNTS,U,5),.VALMCNT)
- End DoDot:3
- End DoDot:2
- +15 DO SET("",.VALMCNT)
- End DoDot:1
- +16 QUIT
- +17 ;
- PRINT ; -- print list to paper
- +1 USE IO
- NEW BSDN,BSDT
- +2 SET BSDN=0
- DO HDG
- +3 FOR
- SET BSDN=$ORDER(^TMP("BSDNS2",$JOB,BSDN))
- IF 'BSDN
- QUIT
- Begin DoDot:1
- +4 IF $Y>(IOSL-5)
- DO HDG
- +5 WRITE !,^TMP("BSDNS2",$JOB,BSDN,0)
- End DoDot:1
- +6 DO ^%ZISC
- DO EXIT
- +7 QUIT
- +8 ;
- HDG ;Print report header
- +1 NEW X,I
- +2 WRITE @IOF
- +3 IF '$DATA(BSDT)
- SET X=$$HTFM^XLFDT($HOROLOG)
- SET BSDT=$$FMTE^XLFDT($EXTRACT(X,1,12),"2P")
- +4 WRITE !?20,"FREQUENT NO-SHOWS REPORT",?55,"Printed: ",BSDT
- +5 DO HDR
- FOR I=1:1:3
- WRITE !,VALMHDR(I)
- +6 WRITE !,$$REPEAT^XLFSTR("-",80)
- +7 QUIT
- +8 ;
- HELP ; -- help code
- +1 SET X="?"
- DO DISP^XQORM1
- WRITE !!
- +2 QUIT
- +3 ;
- EXIT ; -- exit code
- +1 KILL ^TMP("BSDNS2",$JOB)
- +2 QUIT
- +3 ;
- EXPND ; -- expand code
- +1 QUIT
- +2 ;
- HELP1 ;EP; help for number limit question
- +1 DO MSG^BDGF("Enter the number of no-shows a patient must have",2,0)
- +2 DO MSG^BDGF("within a clinic's time frame (up to a year) to be",1,0)
- +3 DO MSG^BDGF("included on this report.",1,1)
- +4 QUIT
- +5 ;
- HELP2 ;EP; help for limit category
- +1 DO MSG^BDGF("Please select the no-show limit category.",2,1)
- +2 DO MSG^BDGF("Answer F to include patients with at least "_BSDLMT_" no-shows for your whole FACILITY.",1,0)
- +3 DO MSG^BDGF("Answer P to include patients with at least "_BSDLMT_" no-shows within a PRINCIPAL clinic.",1,0)
- +4 DO MSG^BDGF("Answer C to include patients with at least "_BSDLMT_" no-shows within a selected CLINIC.",1,1)
- +5 QUIT
- +6 ;
- HELP3 ;EP; help for display other info question
- +1 DO MSG^BDGF("Answer YES to include appointment length and other info (used for appt reason).",2,0)
- +2 DO MSG^BDGF("Answer NO to list patient name, chart #, last no-show, and counts only.",2,1)
- +3 QUIT
- +4 ;
- PDATA(DFN,CLINIC,BEGDT,ENDT) ;EP; -- called to calculate # noshows for patient
- +1 ; will count patient's no-shows in this clinic & principal clinic
- +2 ; date range for search is based on division and clinic parameters
- +3 NEW PRINC,TOTL,NOCLN,PCNT,LMT,LMT2,X,X1,X2,APPDT,LINE,LASTNOS,CLNCD
- +4 ;princ clinic
- SET PRINC=$PIECE($GET(^SC(+CLINIC,"SL")),U,5)
- +5 ;clinic code
- SET CLNCD=$PIECE($GET(^SC(+CLINIC,0)),U,7)
- +6 SET (TOTL,NOCLN,PCNT,CLNCNT)=0
- +7 ;division limit
- SET LMT=$$GET1^DIQ(9009020.2,$$DIV^BSDU,.15)
- +8 IF 'LMT
- SET LMT=365
- +9 ;clinic limit
- SET LMT2=$$GET1^DIQ(9009017.2,+CLINIC,.03)
- +10 ;clinic overrides div
- SET LMT2=$SELECT(LMT2="":LMT,1:LMT2)
- +11 ;
- +12 ; loop by division date limit to get patient's total no-shows for site
- +13 SET X1=BEGDT
- SET X2=-LMT
- DO C^%DTC
- SET APPDT=X
- +14 FOR
- SET APPDT=$ORDER(^DPT(DFN,"S",APPDT))
- IF 'APPDT
- QUIT
- IF (APPDT>(ENDT+.24))
- QUIT
- Begin DoDot:1
- +15 SET X=$PIECE(^DPT(DFN,"S",APPDT,0),U,2)
- IF (X="NT")
- QUIT
- IF (X'["N")
- QUIT
- +16 SET TOTL=TOTL+1
- End DoDot:1
- +17 ;
- +18 ; loop by clinic date range for clinic specific totals
- +19 SET X1=BEGDT
- SET X2=-LMT2
- DO C^%DTC
- SET APPDT=X
- +20 FOR
- SET APPDT=$ORDER(^DPT(DFN,"S",APPDT))
- IF 'APPDT
- QUIT
- IF (APPDT>(ENDT+.24))
- QUIT
- Begin DoDot:1
- +21 SET X=$PIECE(^DPT(DFN,"S",APPDT,0),U,2)
- IF (X="NT")
- QUIT
- IF (X'["N")
- QUIT
- +22 ;
- +23 ; if appt for specified clinic, add to subtotal & set last no-show
- +24 IF +^DPT(DFN,"S",APPDT,0)=+CLINIC
- Begin DoDot:2
- +25 SET NOCLN=NOCLN+1
- SET LASTNOS=$$LASTNOS(DFN,+CLINIC,APPDT)
- End DoDot:2
- +26 ;
- +27 ; if part of specified principal clinic, add to its subtotal
- +28 IF PRINC]""
- IF $DATA(^SC("AIHSPC",+PRINC,+^DPT(DFN,"S",APPDT,0)))
- SET PCNT=PCNT+1
- +29 IF CLNCD]""
- SET CLNCNT=CLNCNT+1
- End DoDot:1
- +30 ;
- +31 ; returns numbers: total facility^total prin^total clinic^last noshow^clinic code count
- +32 QUIT TOTL_U_$GET(PCNT)_U_NOCLN_U_$GET(LASTNOS)_U_CLNCNT
- +33 ;
- LASTNOS(PAT,CLINIC,DATE) ; -- returns appt display line
- +1 NEW X,Y,Z
- +2 ;appt date/time
- SET X=$$FMTE^XLFDT(DATE,2)_" "
- +3 ; get info out of hospital location file entry
- +4 SET Y=0
- FOR
- SET Y=$ORDER(^SC(+CLINIC,"S",DATE,1,Y))
- IF 'Y!$DATA(Z)
- QUIT
- Begin DoDot:1
- +5 IF $PIECE(^SC(+CLINIC,"S",DATE,1,Y,0),U)'=PAT
- QUIT
- +6 SET Z=^SC(+CLINIC,"S",DATE,1,Y,0)
- +7 ;appt length&other info
- SET X=X_U_$PIECE(Z,U,2)_"MIN "_$EXTRACT($PIECE(Z,U,4),1,25)
- End DoDot:1
- +8 QUIT X
- +9 ;
- LIMIT(NUM,LMT,MODE) ; returns 1 if number within limit for mode
- +1 ; +NUM=# of no-shows for patient
- +2 ; LMT=# no-shows needed to be included
- +3 ; MODE=(F:facility, P:principal clinic C:clinic)
- +4 ;enough for facility?
- IF MODE="F"
- QUIT $SELECT(+NUM<LMT:0,1:1)
- +5 ;enough for princ clinic?
- IF MODE="P"
- QUIT $SELECT($PIECE(NUM,U,2)<LMT:0,1:1)
- +6 ;enough for this clinic?
- IF MODE="C"
- QUIT $SELECT($PIECE(NUM,U,3)<LMT:0,1:1)
- +7 ;enough for this patient? cmi/maw PATCH 1010 RQMT 1
- IF MODE="N"
- QUIT $SELECT(+NUM<LMT:0,1:1)
- +8 ;enough for this clinic code
- IF MODE="O"
- QUIT $SELECT($PIECE(NUM,U,5)<LMT:0,1:1)
- +9 QUIT 0
- +10 ;
- LMT(CLN) ; return time limit for clinic
- +1 NEW LMT,LMT2
- +2 ;division limit
- SET LMT=$$GET1^DIQ(9009020.2,$$DIV^BSDU,.15)
- +3 IF 'LMT
- SET LMT=365
- +4 ;clinic limit
- SET LMT2=$$GET1^DIQ(9009017.2,+CLN,.03)
- +5 ;clinic overrides div
- QUIT "Count back "_$SELECT(LMT2="":LMT,1:LMT2)_" days"
- +6 ;
- MODEMSG(MODE) ; return mode in external format
- +1 IF MODE="F"
- QUIT "for the facility"
- +2 IF MODE="P"
- QUIT "within principal clinics"
- +3 QUIT "within any clinic"
- +4 ;
- SET(LINE,NUM) ; put display line into display array
- +1 SET NUM=NUM+1
- +2 SET ^TMP("BSDNS2",$JOB,NUM,0)=LINE
- +3 QUIT
- +4 ;
- PAD(D,L) ; -- SUBRTN to pad length of data
- +1 ; -- D=data L=length
- +2 QUIT $EXTRACT(D_$$REPEAT^XLFSTR(" ",L),1,L)
- +3 ;
- SP(N) ; -- SUBRTN to pad N number of spaces
- +1 QUIT $$PAD(" ",N)