SDAMA302 ;BPOIFO/ACS-Filter API By Clinic ; 9/14/05 12:45pm
;;5.3;Scheduling;**301,347,508,1015**;13 Aug 1993;Build 21
;PER VHA DIRECTIVE 2004-038, DO NOT MODIFY THIS ROUTINE
;
;*****************************************************************
; CHANGE LOG
;
; DATE PATCH DESCRIPTION
;-------- ---------- -----------------------------------------
;12/04/03 SD*5.3*301 ROUTINE COMPLETED
;08/06/04 SD*5.3*347 CHANGE CALL TO ^SDAMA305 TO SETARRAY
;02/22/07 SD*5.3*508 SEE SDAMA301 FOR CHANGE LIST
;*****************************************************************
;
;*****************************************************************
;
; GET APPOINTMENT DATA BY CLINIC
;
;INPUT
; SDARRAY Appointment Filter array
; SDDV Appointment Data Values array
; SDFLTR Filter Flags array
;
;*****************************************************************
CLIN(SDARRAY,SDDV,SDFLTR) ;
N SDCOUNT,SDX,SDQUIT,SDCLIEN,SDSTART,SDEND,SDGBL
S (SDCOUNT,SDQUIT)=0
;Set up start and end date/times for search criteria
I $G(SDARRAY("MAX"))'<0 D
.S SDSTART=$S(SDARRAY("FR")'="":(SDARRAY("FR")-.000001),1:0)
.S SDEND=SDARRAY("TO")
I $G(SDARRAY("MAX"))<0 D
.S SDSTART=$S($G(SDARRAY("FR"))'="":SDARRAY("FR"),1:0)
.S SDEND=(SDARRAY("TO")+.000001)
;
;If clinic filter is populated
I $L($G(SDARRAY(2)))>0 D
. ;if clinic is in a list:
. I SDARRAY("CLNGBL")=0 D
.. S SDCOUNT=$L(SDARRAY(2),";")
.. ;For each clinic in the filter:
.. F SDX=1:1:SDCOUNT D
... S SDCLIEN=$P(SDARRAY(2),";",SDX)
... ;call VistA for appointment information
... D CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY)
. ;if clinic is in array, get IENs
. I SDARRAY("CLNGBL")=1 D
.. S SDGBL=SDARRAY(2),SDCLIEN=0
.. ;for each clinic in the global:
.. F S SDCLIEN=$O(@(SDGBL_"SDCLIEN)")) Q:$G(SDCLIEN)="" D
... ;call VistA for appointment information
... D CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY)
;
;If clinic filter is not populated
I $L(SDARRAY(2))'>0 D
. ;for each clinic on ^SC
. S SDCLIEN=0 F S SDCLIEN=$O(^SC(SDCLIEN)) Q:(+$G(SDCLIEN)=0) D
.. ;call VistA for appointment information
.. D CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY)
Q
;
CALLVSTA(SDCLIEN,SDSTART,SDEND,SDARRAY) ;
;retrieve appointment information from VistA
I $$CLMIG^SDAMA307(SDCLIEN,.SDARRAY) D
. ;adjust end time if clinic has completed migration
. ;(Only Non-migrated appointments returned from VistA)
. I $G(SDARRAY("MIG"))]"" D
.. S SDEND=+$G(SDARRAY("MIG"))
.. ;increment SDEND to capture all appointments when ordering
.. S:$G(SDARRAY("MAX"))<0 SDEND=(SDEND+.000001)
. D GETAPPT(SDCLIEN,SDSTART,SDEND,.SDARRAY)
Q
;
GETAPPT(SDCLIEN,SDSTART,SDEND,SDARRAY) ;
;since "by clinic", 1st sort is clinic
S SDARRAY("SORT1")=SDCLIEN
N SDAPPTDT,SDA
;if the current clinic has no appointments on ^SC, get next clinic
Q:'$D(^SC(SDCLIEN,"S"))
;
;get first "N" appointments
I $G(SDARRAY("MAX"))'<0 D
.S SDAPPTDT=SDSTART
.;spin through each date/time for current clinic
.F S SDAPPTDT=$O(^SC(SDCLIEN,"S",SDAPPTDT)) Q:$S(+$G(SDAPPTDT)=0:1,SDAPPTDT>SDEND:1,SDARRAY("CNT")=$G(SDARRAY("MAX")):1,1:0) D
.. ;spin through each appointment for that date/time
.. S SDA=0 F S SDA=$O(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA)) Q:$S(+$G(SDA)=0:1,SDARRAY("CNT")=$G(SDARRAY("MAX")):1,1:0) D
... D GETINFO(SDCLIEN,SDAPPTDT,SDA,.SDARRAY)
;
;get last "N" appointments
I $G(SDARRAY("MAX"))<0 D
.S SDAPPTDT=SDEND
.;spin through each date/time for current clinic (REVERSE Order)
.F S SDAPPTDT=$O(^SC(SDCLIEN,"S",SDAPPTDT),-1) Q:$S(+$G(SDAPPTDT)=0:1,SDAPPTDT<SDSTART:1,SDARRAY("CNT")=-$G(SDARRAY("MAX")):1,1:0) D
.. ;spin through each appointment for that date/time (REVERSE Order)
.. S SDA="" F S SDA=$O(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA),-1) Q:$S(+$G(SDA)=0:1,SDARRAY("CNT")=-$G(SDARRAY("MAX")):1,1:0) D
... D GETINFO(SDCLIEN,SDAPPTDT,SDA,.SDARRAY)
Q
;
GETINFO(SDCLIEN,SDAPPTDT,SDA,SDARRAY) ;
N SDPATIEN,SDCAN,SDQUIT
S SDQUIT=0
;get appointment data on ^SC
S SDARRAY("SC0")=$G(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,0))
S SDARRAY("SCC")=$G(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"C"))
S SDARRAY("SCOB")=$G(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"OB"))
S SDARRAY("SCONS")=$G(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"CONS"))
S SDARRAY("DATE")=SDAPPTDT
;exclude cancelled appts
S SDCAN=$P($G(SDARRAY("SC0")),"^",9)
Q:$G(SDCAN)="C"
;initialize patient appointment data to null and get patient DFN
S (SDARRAY("DPT0"),SDARRAY("DPT1"))=""
S (SDPATIEN,SDARRAY("PAT"))=+SDARRAY("SC0")
;quit if patient is null on ^SC
Q:SDPATIEN=0
;since "by clinic", 2nd sort is patient
S SDARRAY("SORT2")=SDPATIEN
;get corresponding appt zero node on ^DPT
S SDARRAY("DPT0")=$G(^DPT(SDPATIEN,"S",SDAPPTDT,0))
;skip if appointment is cancelled on DPT
Q:($P($G(SDARRAY("DPT0")),"^",2)["C")
;skip if appointment on DPT is for different clinic
Q:(+$G(SDARRAY("DPT0"))'=SDCLIEN)
;get appointment 1 node on ^DPT
S SDARRAY("DPT1")=$G(^DPT(SDPATIEN,"S",SDAPPTDT,1))
;appointment must match the "clinic" filter values
I $$MATCH^SDAMA304("C",.SDARRAY,.SDFLTR,.SDDV) D
. ;if appointment matches the "patient" filter values, put appointment data into output array
. I $$MATCH^SDAMA304("P",.SDARRAY,.SDFLTR,.SDDV) D SETARRAY^SDAMA305(.SDARRAY)
Q
SDAMA302 ;BPOIFO/ACS-Filter API By Clinic ; 9/14/05 12:45pm
+1 ;;5.3;Scheduling;**301,347,508,1015**;13 Aug 1993;Build 21
+2 ;PER VHA DIRECTIVE 2004-038, DO NOT MODIFY THIS ROUTINE
+3 ;
+4 ;*****************************************************************
+5 ; CHANGE LOG
+6 ;
+7 ; DATE PATCH DESCRIPTION
+8 ;-------- ---------- -----------------------------------------
+9 ;12/04/03 SD*5.3*301 ROUTINE COMPLETED
+10 ;08/06/04 SD*5.3*347 CHANGE CALL TO ^SDAMA305 TO SETARRAY
+11 ;02/22/07 SD*5.3*508 SEE SDAMA301 FOR CHANGE LIST
+12 ;*****************************************************************
+13 ;
+14 ;*****************************************************************
+15 ;
+16 ; GET APPOINTMENT DATA BY CLINIC
+17 ;
+18 ;INPUT
+19 ; SDARRAY Appointment Filter array
+20 ; SDDV Appointment Data Values array
+21 ; SDFLTR Filter Flags array
+22 ;
+23 ;*****************************************************************
CLIN(SDARRAY,SDDV,SDFLTR) ;
+1 NEW SDCOUNT,SDX,SDQUIT,SDCLIEN,SDSTART,SDEND,SDGBL
+2 SET (SDCOUNT,SDQUIT)=0
+3 ;Set up start and end date/times for search criteria
+4 IF $GET(SDARRAY("MAX"))'<0
Begin DoDot:1
+5 SET SDSTART=$SELECT(SDARRAY("FR")'="":(SDARRAY("FR")-.000001),1:0)
+6 SET SDEND=SDARRAY("TO")
End DoDot:1
+7 IF $GET(SDARRAY("MAX"))<0
Begin DoDot:1
+8 SET SDSTART=$SELECT($GET(SDARRAY("FR"))'="":SDARRAY("FR"),1:0)
+9 SET SDEND=(SDARRAY("TO")+.000001)
End DoDot:1
+10 ;
+11 ;If clinic filter is populated
+12 IF $LENGTH($GET(SDARRAY(2)))>0
Begin DoDot:1
+13 ;if clinic is in a list:
+14 IF SDARRAY("CLNGBL")=0
Begin DoDot:2
+15 SET SDCOUNT=$LENGTH(SDARRAY(2),";")
+16 ;For each clinic in the filter:
+17 FOR SDX=1:1:SDCOUNT
Begin DoDot:3
+18 SET SDCLIEN=$PIECE(SDARRAY(2),";",SDX)
+19 ;call VistA for appointment information
+20 DO CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY)
End DoDot:3
End DoDot:2
+21 ;if clinic is in array, get IENs
+22 IF SDARRAY("CLNGBL")=1
Begin DoDot:2
+23 SET SDGBL=SDARRAY(2)
SET SDCLIEN=0
+24 ;for each clinic in the global:
+25 FOR
SET SDCLIEN=$ORDER(@(SDGBL_"SDCLIEN)"))
IF $GET(SDCLIEN)=""
QUIT
Begin DoDot:3
+26 ;call VistA for appointment information
+27 DO CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY)
End DoDot:3
End DoDot:2
End DoDot:1
+28 ;
+29 ;If clinic filter is not populated
+30 IF $LENGTH(SDARRAY(2))'>0
Begin DoDot:1
+31 ;for each clinic on ^SC
+32 SET SDCLIEN=0
FOR
SET SDCLIEN=$ORDER(^SC(SDCLIEN))
IF (+$GET(SDCLIEN)=0)
QUIT
Begin DoDot:2
+33 ;call VistA for appointment information
+34 DO CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY)
End DoDot:2
End DoDot:1
+35 QUIT
+36 ;
CALLVSTA(SDCLIEN,SDSTART,SDEND,SDARRAY) ;
+1 ;retrieve appointment information from VistA
+2 IF $$CLMIG^SDAMA307(SDCLIEN,.SDARRAY)
Begin DoDot:1
+3 ;adjust end time if clinic has completed migration
+4 ;(Only Non-migrated appointments returned from VistA)
+5 IF $GET(SDARRAY("MIG"))]""
Begin DoDot:2
+6 SET SDEND=+$GET(SDARRAY("MIG"))
+7 ;increment SDEND to capture all appointments when ordering
+8 IF $GET(SDARRAY("MAX"))<0
SET SDEND=(SDEND+.000001)
End DoDot:2
+9 DO GETAPPT(SDCLIEN,SDSTART,SDEND,.SDARRAY)
End DoDot:1
+10 QUIT
+11 ;
GETAPPT(SDCLIEN,SDSTART,SDEND,SDARRAY) ;
+1 ;since "by clinic", 1st sort is clinic
+2 SET SDARRAY("SORT1")=SDCLIEN
+3 NEW SDAPPTDT,SDA
+4 ;if the current clinic has no appointments on ^SC, get next clinic
+5 IF '$DATA(^SC(SDCLIEN,"S"))
QUIT
+6 ;
+7 ;get first "N" appointments
+8 IF $GET(SDARRAY("MAX"))'<0
Begin DoDot:1
+9 SET SDAPPTDT=SDSTART
+10 ;spin through each date/time for current clinic
+11 FOR
SET SDAPPTDT=$ORDER(^SC(SDCLIEN,"S",SDAPPTDT))
IF $SELECT(+$GET(SDAPPTDT)=0
QUIT
Begin DoDot:2
+12 ;spin through each appointment for that date/time
+13 SET SDA=0
FOR
SET SDA=$ORDER(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA))
IF $SELECT(+$GET(SDA)=0
QUIT
Begin DoDot:3
+14 DO GETINFO(SDCLIEN,SDAPPTDT,SDA,.SDARRAY)
End DoDot:3
End DoDot:2
End DoDot:1
+15 ;
+16 ;get last "N" appointments
+17 IF $GET(SDARRAY("MAX"))<0
Begin DoDot:1
+18 SET SDAPPTDT=SDEND
+19 ;spin through each date/time for current clinic (REVERSE Order)
+20 FOR
SET SDAPPTDT=$ORDER(^SC(SDCLIEN,"S",SDAPPTDT),-1)
IF $SELECT(+$GET(SDAPPTDT)=0
QUIT
Begin DoDot:2
+21 ;spin through each appointment for that date/time (REVERSE Order)
+22 SET SDA=""
FOR
SET SDA=$ORDER(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA),-1)
IF $SELECT(+$GET(SDA)=0
QUIT
Begin DoDot:3
+23 DO GETINFO(SDCLIEN,SDAPPTDT,SDA,.SDARRAY)
End DoDot:3
End DoDot:2
End DoDot:1
+24 QUIT
+25 ;
GETINFO(SDCLIEN,SDAPPTDT,SDA,SDARRAY) ;
+1 NEW SDPATIEN,SDCAN,SDQUIT
+2 SET SDQUIT=0
+3 ;get appointment data on ^SC
+4 SET SDARRAY("SC0")=$GET(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,0))
+5 SET SDARRAY("SCC")=$GET(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"C"))
+6 SET SDARRAY("SCOB")=$GET(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"OB"))
+7 SET SDARRAY("SCONS")=$GET(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"CONS"))
+8 SET SDARRAY("DATE")=SDAPPTDT
+9 ;exclude cancelled appts
+10 SET SDCAN=$PIECE($GET(SDARRAY("SC0")),"^",9)
+11 IF $GET(SDCAN)="C"
QUIT
+12 ;initialize patient appointment data to null and get patient DFN
+13 SET (SDARRAY("DPT0"),SDARRAY("DPT1"))=""
+14 SET (SDPATIEN,SDARRAY("PAT"))=+SDARRAY("SC0")
+15 ;quit if patient is null on ^SC
+16 IF SDPATIEN=0
QUIT
+17 ;since "by clinic", 2nd sort is patient
+18 SET SDARRAY("SORT2")=SDPATIEN
+19 ;get corresponding appt zero node on ^DPT
+20 SET SDARRAY("DPT0")=$GET(^DPT(SDPATIEN,"S",SDAPPTDT,0))
+21 ;skip if appointment is cancelled on DPT
+22 IF ($PIECE($GET(SDARRAY("DPT0")),"^",2)["C")
QUIT
+23 ;skip if appointment on DPT is for different clinic
+24 IF (+$GET(SDARRAY("DPT0"))'=SDCLIEN)
QUIT
+25 ;get appointment 1 node on ^DPT
+26 SET SDARRAY("DPT1")=$GET(^DPT(SDPATIEN,"S",SDAPPTDT,1))
+27 ;appointment must match the "clinic" filter values
+28 IF $$MATCH^SDAMA304("C",.SDARRAY,.SDFLTR,.SDDV)
Begin DoDot:1
+29 ;if appointment matches the "patient" filter values, put appointment data into output array
+30 IF $$MATCH^SDAMA304("P",.SDARRAY,.SDFLTR,.SDDV)
DO SETARRAY^SDAMA305(.SDARRAY)
End DoDot:1
+31 QUIT