PXRRWLSE ;ISL/PKR,ISA/Zoltan - Sort encounters for encounter summary report. ;12/1/1998
;;1.0;PCE PATIENT CARE ENCOUNTER;**20,58,61**;Aug 12, 1996
;
;Sort the encounters according to the selection criteria.
SORT ;
N BYCLOC,BD,BUSY,CLINIC,CLINIEN,CPT,CSSCR
N DATE,DAY,DFN,ED,EM,EMLIST,FAC,FACILITY,FOUND
N HLOCIEN,HLOCNAM,HSSCR,IC,INOUT,LOCATION,NEWPIEN
N PCLASS,PPNAME
N PROVIDER,PRVCNT,PRVIEN,PRVSCR
N STOIND,TEMP,TOTUNIQ,TOTVIS,UPAT,VIEN,VISIT,VISIT150,VISITS
N MULTPR
;
D SORT2^PXRRWLS2
;
S BD=PXRRBDT-.0001
S ED=PXRREDT+.2359
NDATE S BD=$O(^AUPNVSIT("B",BD))
;If we have passed the ending date we are done.
I (BD>ED)!(BD="") G DONE
;
;If this is an interactive session let the user know that something
;is happening.
I '(PXRRQUE!$D(IO("S"))) D SPIN^PXRRBUSY("Sorting encounters",.BUSY)
;
;Check for a user request to stop the task.
I $$S^%ZTLOAD S ZTSTOP=1 D EXIT^PXRRGUT
;
;Get the VISIT IEN
S VIEN=0
VISIT S VIEN=$O(^AUPNVSIT("B",BD,VIEN))
I VIEN="" G NDATE
S VISIT=^AUPNVSIT(VIEN,0)
;
;Screen out inappropriate vists.
;Service categories.
I PXRRSCAT'[$P(VISIT,U,7) G VISIT
;Encounter types.
S VISIT150=$G(^AUPNVSIT(VIEN,150))
I PXRRENTY'[$P(VISIT150,U,3) G VISIT
;
;Make sure that the facility is on the list.
S FOUND=0
S FAC=$P(VISIT,U,6)
F IC=1:1:NFAC I $P(PXRRFAC(IC),U,1)=FAC D Q
. S FACILITY=FAC
. S FOUND=1
I 'FOUND G VISIT
;
S HLOCNAM=""
;
D VISIT2^PXRRWLS2
;
I 'FOUND G VISIT
;
;Get the Provider
S PRVCNT=0
S PRVIEN=0
S MULTPR=""
PRV ;
S PRVIEN=$O(^AUPNVPRV("AD",VIEN,PRVIEN))
I (PRVIEN="")&(PRVCNT>0) G VISIT
I (PRVIEN="") S NEWPIEN=0
E S NEWPIEN=+$P(^AUPNVPRV(PRVIEN,0),U,1)
S PRVCNT=PRVCNT+1
I NEWPIEN>0 S PPNAME=$P(^VA(200,NEWPIEN,0),U,1)_U_NEWPIEN
E S PPNAME="Unknown"_U_NEWPIEN
;
;Apply any Provider screens.
;List of providers.
I $D(PXRRPRPL) D G:'FOUND PRV
. S FOUND=0
. F IC=1:1:NPL I $P(PXRRPRPL(IC),U,2)=NEWPIEN D Q
..;Mark this provider as being matched.
.. S $P(PXRRPRPL(IC),U,4)="M"
.. S FOUND=1
;
;Person class screen.
I $D(PXRRPECL) D G:'FOUND PRV
. S PCLASS=$$OCCUP^PXBGPRV(NEWPIEN,BD,"",1,"")
. S FOUND=$$MATCH^PXRRPECU(PCLASS)
. S PPNAME=PPNAME_U_$P(PCLASS,U,7)
;
D PRV2^PXRRWLS2
;
CLOC ;
D CLOC2^PXRRWLS2
;
;Find the CPT code(s) and associated E&M codes for this encounter.
S IC=$O(^AUPNVCPT("AD",VIEN,""))
I +IC=0 D G BYCLOC
. S ^XTMP(PXRRXTMP,FACILITY,STOIND,"NOCPT")=$G(^XTMP(PXRRXTMP,FACILITY,STOIND,"NOCPT"))+1
.;Total for multiple provider encounters.
. I MULTPR S ^XTMP(PXRRXTMP,FACILITY,"&&","NOCPT")=$G(^XTMP(PXRRXTMP,FACILITY,"&&","NOCPT"))+1
;
S IC=""
GETCPT S IC=$O(^AUPNVCPT("AD",VIEN,IC))
I +IC>0 D GC2^PXRRWLS2 G GETCPT
;
BYCLOC ;If necessary accumulate the information about each clinic stop
;location.
I BYCLOC,$L(STOIND,U)=3 D G CLOC
. S HLOCIEN=$P(VISIT,U,22)
. ;Null Subscript: Visit is missing hospital location.
. ;Undefined: Hospital Location may have been deleted.
. S STOIND=STOIND_U_$P(^SC(HLOCIEN,0),U,1)
;Pass flag to report for header message.
I MULTPR=1 S ^XTMP(PXRRXTMP,"PXRRMPR")=1
; Get the next provider for the encounter...
S PXRRPRSC=$G(PXRRPRSC) ; Ensure it exists.
I $E(PXRRPRSC)="S",$G(NPL)>1 S MULTPR=1 G PRV
I $E(PXRRPRSC)="C"!($E(PXRRPRSC)="A") S MULTPR=1 G PRV
; ...or get the next encounter.
G VISIT
;
DONE ;
;Process the patient list, get the number of unique patients, and the
;number of visits. A visit is defined to be any activity for a patient
;within a 24 hour period.
;
S FACILITY=0
NFAC S FACILITY=$O(^TMP(PXRRXTMP,$J,FACILITY))
I +FACILITY=0 G SDONE
;
D NF2^PXRRWLS2
;
S STOIND="&"
NSTO S STOIND=$O(^TMP(PXRRXTMP,$J,FACILITY,STOIND))
I STOIND="" G NFAC
;
S TOTVIS=0
S UPAT=0
S VISITS(0)=0
S VISITS(1)=0
;
;If this is an interactive session let the user know that something
;is happening.
I '(PXRRQUE!$D(IO("S"))) D SPIN^PXRRBUSY("Sorting encounters",.BUSY)
;
S DFN=0
NDFN S DFN=$O(^TMP(PXRRXTMP,$J,FACILITY,STOIND,"PATIENT",DFN))
I +DFN=0 D G NSTO
. S ^XTMP(PXRRXTMP,FACILITY,STOIND,"TOTVIS")=TOTVIS
. S ^XTMP(PXRRXTMP,FACILITY,STOIND,"UPAT")=UPAT
. S ^XTMP(PXRRXTMP,FACILITY,STOIND,"VISITS",0)=VISITS(0)
. S ^XTMP(PXRRXTMP,FACILITY,STOIND,"VISITS",1)=VISITS(1)
S UPAT=UPAT+1
;
S DAY=""
NDAY S DAY=$O(^TMP(PXRRXTMP,$J,FACILITY,STOIND,"PATIENT",DFN,DAY))
I DAY="" G NDFN
S TOTVIS=TOTVIS+1
;
S INOUT=-1
NINOUT S INOUT=$O(^TMP(PXRRXTMP,$J,FACILITY,STOIND,"PATIENT",DFN,DAY,INOUT))
I INOUT="" G NDAY
S VISITS(INOUT)=VISITS(INOUT)+1
G NINOUT
;
SDONE ;Sorting is done.
I '(PXRRQUE!$D(IO("S"))) D DONE^PXRRBUSY("done")
K ^TMP(PXRRXTMP)
;
;If there were selected clinic stops build dummy entries for all
;those without entries.
I $D(PXRRCS) D
. F FAC=1:1:NFAC D
.. S FACILITY=$P(PXRRFAC(FAC),U,1)
.. F IC=1:1:NCS D
... I $P(PXRRCS(IC),U,4)'="M" D
.... S HLOCNAM=PXRRCS(IC)
.... S ^XTMP(PXRRXTMP,FACILITY,HLOCNAM,0,0)=""
;
;If there were selected hospital locations build dummy entries for all
;those without entries.
I $D(PXRRLCHL) D
. F FAC=1:1:NFAC D
.. S FACILITY=$P(PXRRFAC(FAC),U,1)
.. F IC=1:1:NHL D
... I $P(PXRRLCHL(IC),U,4)'="M" D
.... S HLOCNAM=PXRRLCHL(IC)
.... S ^XTMP(PXRRXTMP,FACILITY,HLOCNAM,0,0)=""
;
EXIT ;
;Sort the appointment information.
I PXRRQUE D
.;Start the appointment sorting that was queued but not scheduled.
. N DESC,ROUTINE,TASK
. S ROUTINE="PXRRWLSA"
. S DESC="Encounter Summary Report - sort appointments"
. S ZTDTH=$$NOW^XLFDT
. S TASK=^XTMP(PXRRXTMP,"SAZTSK")
. D REQUE^PXRRQUE(DESC,ROUTINE,TASK)
E D SORT^PXRRWLSA
Q
PXRRWLSE ;ISL/PKR,ISA/Zoltan - Sort encounters for encounter summary report. ;12/1/1998
+1 ;;1.0;PCE PATIENT CARE ENCOUNTER;**20,58,61**;Aug 12, 1996
+2 ;
+3 ;Sort the encounters according to the selection criteria.
SORT ;
+1 NEW BYCLOC,BD,BUSY,CLINIC,CLINIEN,CPT,CSSCR
+2 NEW DATE,DAY,DFN,ED,EM,EMLIST,FAC,FACILITY,FOUND
+3 NEW HLOCIEN,HLOCNAM,HSSCR,IC,INOUT,LOCATION,NEWPIEN
+4 NEW PCLASS,PPNAME
+5 NEW PROVIDER,PRVCNT,PRVIEN,PRVSCR
+6 NEW STOIND,TEMP,TOTUNIQ,TOTVIS,UPAT,VIEN,VISIT,VISIT150,VISITS
+7 NEW MULTPR
+8 ;
+9 DO SORT2^PXRRWLS2
+10 ;
+11 SET BD=PXRRBDT-.0001
+12 SET ED=PXRREDT+.2359
NDATE SET BD=$ORDER(^AUPNVSIT("B",BD))
+1 ;If we have passed the ending date we are done.
+2 IF (BD>ED)!(BD="")
GOTO DONE
+3 ;
+4 ;If this is an interactive session let the user know that something
+5 ;is happening.
+6 IF '(PXRRQUE!$DATA(IO("S")))
DO SPIN^PXRRBUSY("Sorting encounters",.BUSY)
+7 ;
+8 ;Check for a user request to stop the task.
+9 IF $$S^%ZTLOAD
SET ZTSTOP=1
DO EXIT^PXRRGUT
+10 ;
+11 ;Get the VISIT IEN
+12 SET VIEN=0
VISIT SET VIEN=$ORDER(^AUPNVSIT("B",BD,VIEN))
+1 IF VIEN=""
GOTO NDATE
+2 SET VISIT=^AUPNVSIT(VIEN,0)
+3 ;
+4 ;Screen out inappropriate vists.
+5 ;Service categories.
+6 IF PXRRSCAT'[$PIECE(VISIT,U,7)
GOTO VISIT
+7 ;Encounter types.
+8 SET VISIT150=$GET(^AUPNVSIT(VIEN,150))
+9 IF PXRRENTY'[$PIECE(VISIT150,U,3)
GOTO VISIT
+10 ;
+11 ;Make sure that the facility is on the list.
+12 SET FOUND=0
+13 SET FAC=$PIECE(VISIT,U,6)
+14 FOR IC=1:1:NFAC
IF $PIECE(PXRRFAC(IC),U,1)=FAC
Begin DoDot:1
+15 SET FACILITY=FAC
+16 SET FOUND=1
End DoDot:1
QUIT
+17 IF 'FOUND
GOTO VISIT
+18 ;
+19 SET HLOCNAM=""
+20 ;
+21 DO VISIT2^PXRRWLS2
+22 ;
+23 IF 'FOUND
GOTO VISIT
+24 ;
+25 ;Get the Provider
+26 SET PRVCNT=0
+27 SET PRVIEN=0
+28 SET MULTPR=""
PRV ;
+1 SET PRVIEN=$ORDER(^AUPNVPRV("AD",VIEN,PRVIEN))
+2 IF (PRVIEN="")&(PRVCNT>0)
GOTO VISIT
+3 IF (PRVIEN="")
SET NEWPIEN=0
+4 IF '$TEST
SET NEWPIEN=+$PIECE(^AUPNVPRV(PRVIEN,0),U,1)
+5 SET PRVCNT=PRVCNT+1
+6 IF NEWPIEN>0
SET PPNAME=$PIECE(^VA(200,NEWPIEN,0),U,1)_U_NEWPIEN
+7 IF '$TEST
SET PPNAME="Unknown"_U_NEWPIEN
+8 ;
+9 ;Apply any Provider screens.
+10 ;List of providers.
+11 IF $DATA(PXRRPRPL)
Begin DoDot:1
+12 SET FOUND=0
+13 FOR IC=1:1:NPL
IF $PIECE(PXRRPRPL(IC),U,2)=NEWPIEN
Begin DoDot:2
+14 ;Mark this provider as being matched.
+15 SET $PIECE(PXRRPRPL(IC),U,4)="M"
+16 SET FOUND=1
End DoDot:2
QUIT
End DoDot:1
IF 'FOUND
GOTO PRV
+17 ;
+18 ;Person class screen.
+19 IF $DATA(PXRRPECL)
Begin DoDot:1
+20 SET PCLASS=$$OCCUP^PXBGPRV(NEWPIEN,BD,"",1,"")
+21 SET FOUND=$$MATCH^PXRRPECU(PCLASS)
+22 SET PPNAME=PPNAME_U_$PIECE(PCLASS,U,7)
End DoDot:1
IF 'FOUND
GOTO PRV
+23 ;
+24 DO PRV2^PXRRWLS2
+25 ;
CLOC ;
+1 DO CLOC2^PXRRWLS2
+2 ;
+3 ;Find the CPT code(s) and associated E&M codes for this encounter.
+4 SET IC=$ORDER(^AUPNVCPT("AD",VIEN,""))
+5 IF +IC=0
Begin DoDot:1
+6 SET ^XTMP(PXRRXTMP,FACILITY,STOIND,"NOCPT")=$GET(^XTMP(PXRRXTMP,FACILITY,STOIND,"NOCPT"))+1
+7 ;Total for multiple provider encounters.
+8 IF MULTPR
SET ^XTMP(PXRRXTMP,FACILITY,"&&","NOCPT")=$GET(^XTMP(PXRRXTMP,FACILITY,"&&","NOCPT"))+1
End DoDot:1
GOTO BYCLOC
+9 ;
+10 SET IC=""
GETCPT SET IC=$ORDER(^AUPNVCPT("AD",VIEN,IC))
+1 IF +IC>0
DO GC2^PXRRWLS2
GOTO GETCPT
+2 ;
BYCLOC ;If necessary accumulate the information about each clinic stop
+1 ;location.
+2 IF BYCLOC
IF $LENGTH(STOIND,U)=3
Begin DoDot:1
+3 SET HLOCIEN=$PIECE(VISIT,U,22)
+4 ;Null Subscript: Visit is missing hospital location.
+5 ;Undefined: Hospital Location may have been deleted.
+6 SET STOIND=STOIND_U_$PIECE(^SC(HLOCIEN,0),U,1)
End DoDot:1
GOTO CLOC
+7 ;Pass flag to report for header message.
+8 IF MULTPR=1
SET ^XTMP(PXRRXTMP,"PXRRMPR")=1
+9 ; Get the next provider for the encounter...
+10 ; Ensure it exists.
SET PXRRPRSC=$GET(PXRRPRSC)
+11 IF $EXTRACT(PXRRPRSC)="S"
IF $GET(NPL)>1
SET MULTPR=1
GOTO PRV
+12 IF $EXTRACT(PXRRPRSC)="C"!($EXTRACT(PXRRPRSC)="A")
SET MULTPR=1
GOTO PRV
+13 ; ...or get the next encounter.
+14 GOTO VISIT
+15 ;
DONE ;
+1 ;Process the patient list, get the number of unique patients, and the
+2 ;number of visits. A visit is defined to be any activity for a patient
+3 ;within a 24 hour period.
+4 ;
+5 SET FACILITY=0
NFAC SET FACILITY=$ORDER(^TMP(PXRRXTMP,$JOB,FACILITY))
+1 IF +FACILITY=0
GOTO SDONE
+2 ;
+3 DO NF2^PXRRWLS2
+4 ;
+5 SET STOIND="&"
NSTO SET STOIND=$ORDER(^TMP(PXRRXTMP,$JOB,FACILITY,STOIND))
+1 IF STOIND=""
GOTO NFAC
+2 ;
+3 SET TOTVIS=0
+4 SET UPAT=0
+5 SET VISITS(0)=0
+6 SET VISITS(1)=0
+7 ;
+8 ;If this is an interactive session let the user know that something
+9 ;is happening.
+10 IF '(PXRRQUE!$DATA(IO("S")))
DO SPIN^PXRRBUSY("Sorting encounters",.BUSY)
+11 ;
+12 SET DFN=0
NDFN SET DFN=$ORDER(^TMP(PXRRXTMP,$JOB,FACILITY,STOIND,"PATIENT",DFN))
+1 IF +DFN=0
Begin DoDot:1
+2 SET ^XTMP(PXRRXTMP,FACILITY,STOIND,"TOTVIS")=TOTVIS
+3 SET ^XTMP(PXRRXTMP,FACILITY,STOIND,"UPAT")=UPAT
+4 SET ^XTMP(PXRRXTMP,FACILITY,STOIND,"VISITS",0)=VISITS(0)
+5 SET ^XTMP(PXRRXTMP,FACILITY,STOIND,"VISITS",1)=VISITS(1)
End DoDot:1
GOTO NSTO
+6 SET UPAT=UPAT+1
+7 ;
+8 SET DAY=""
NDAY SET DAY=$ORDER(^TMP(PXRRXTMP,$JOB,FACILITY,STOIND,"PATIENT",DFN,DAY))
+1 IF DAY=""
GOTO NDFN
+2 SET TOTVIS=TOTVIS+1
+3 ;
+4 SET INOUT=-1
NINOUT SET INOUT=$ORDER(^TMP(PXRRXTMP,$JOB,FACILITY,STOIND,"PATIENT",DFN,DAY,INOUT))
+1 IF INOUT=""
GOTO NDAY
+2 SET VISITS(INOUT)=VISITS(INOUT)+1
+3 GOTO NINOUT
+4 ;
SDONE ;Sorting is done.
+1 IF '(PXRRQUE!$DATA(IO("S")))
DO DONE^PXRRBUSY("done")
+2 KILL ^TMP(PXRRXTMP)
+3 ;
+4 ;If there were selected clinic stops build dummy entries for all
+5 ;those without entries.
+6 IF $DATA(PXRRCS)
Begin DoDot:1
+7 FOR FAC=1:1:NFAC
Begin DoDot:2
+8 SET FACILITY=$PIECE(PXRRFAC(FAC),U,1)
+9 FOR IC=1:1:NCS
Begin DoDot:3
+10 IF $PIECE(PXRRCS(IC),U,4)'="M"
Begin DoDot:4
+11 SET HLOCNAM=PXRRCS(IC)
+12 SET ^XTMP(PXRRXTMP,FACILITY,HLOCNAM,0,0)=""
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+13 ;
+14 ;If there were selected hospital locations build dummy entries for all
+15 ;those without entries.
+16 IF $DATA(PXRRLCHL)
Begin DoDot:1
+17 FOR FAC=1:1:NFAC
Begin DoDot:2
+18 SET FACILITY=$PIECE(PXRRFAC(FAC),U,1)
+19 FOR IC=1:1:NHL
Begin DoDot:3
+20 IF $PIECE(PXRRLCHL(IC),U,4)'="M"
Begin DoDot:4
+21 SET HLOCNAM=PXRRLCHL(IC)
+22 SET ^XTMP(PXRRXTMP,FACILITY,HLOCNAM,0,0)=""
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+23 ;
EXIT ;
+1 ;Sort the appointment information.
+2 IF PXRRQUE
Begin DoDot:1
+3 ;Start the appointment sorting that was queued but not scheduled.
+4 NEW DESC,ROUTINE,TASK
+5 SET ROUTINE="PXRRWLSA"
+6 SET DESC="Encounter Summary Report - sort appointments"
+7 SET ZTDTH=$$NOW^XLFDT
+8 SET TASK=^XTMP(PXRRXTMP,"SAZTSK")
+9 DO REQUE^PXRRQUE(DESC,ROUTINE,TASK)
End DoDot:1
+10 IF '$TEST
DO SORT^PXRRWLSA
+11 QUIT