- SDAMA303 ;BPOIFO/ACS-Filter API By Patient ; 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 PATIENT
- ;
- ;INPUT
- ; SDARRAY Appointment Filter array
- ; SDDV Appointment Data Values array
- ; SDFLTR Filter Flags array
- ;
- ;*****************************************************************
- PAT(SDARRAY,SDDV,SDFLTR) ;
- N SDCOUNT,SDX,SDQUIT,SDPATIEN,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 patient is not in global, get patient from filter list
- I SDARRAY("PATGBL")=0 D
- . S SDCOUNT=$L(SDARRAY(4),";")
- . ;for each patient in the filter:
- . F SDX=1:1:SDCOUNT D
- .. S SDPATIEN=$P(SDARRAY(4),";",SDX)
- .. D GETAPPT(SDPATIEN,SDSTART,SDEND,.SDARRAY)
- ;if patient is in global, get patient from global
- I SDARRAY("PATGBL")=1 D
- . S SDGBL=SDARRAY(4),SDPATIEN=0
- . ;for each patient in the global:
- . F S SDPATIEN=$O(@(SDGBL_"SDPATIEN)")) Q:+$G(SDPATIEN)=0 D
- .. D GETAPPT(SDPATIEN,SDSTART,SDEND,.SDARRAY)
- Q
- ;
- GETAPPT(SDPATIEN,SDSTART,SDEND,SDARRAY) ;
- ;if the patient has no appointments on ^DPT, get next patient
- Q:'$D(^DPT(SDPATIEN,"S"))
- ;since "by patient", 1st sort is patient
- S (SDARRAY("SORT1"),SDARRAY("PAT"))=SDPATIEN
- N SDAPPTDT
- ;
- ;get first "N" appointments
- I $G(SDARRAY("MAX"))'<0 D
- .S SDAPPTDT=SDSTART
- .;Spin through each appointment on DPT for current patient
- .F S SDAPPTDT=$O(^DPT(SDPATIEN,"S",SDAPPTDT)) Q:$S(+$G(SDAPPTDT)=0:1,SDAPPTDT>SDEND:1,SDARRAY("CNT")=$G(SDARRAY("MAX")):1,1:0) D
- .. D GETINFO(SDPATIEN,SDAPPTDT,.SDARRAY)
- ;
- ;get last "N" appointments
- I $G(SDARRAY("MAX"))<0 D
- .S SDAPPTDT=SDEND
- .;spin through each appointment on DPT for current patient (REVERSE Order)
- .F S SDAPPTDT=$O(^DPT(SDPATIEN,"S",SDAPPTDT),-1) Q:$S(+$G(SDAPPTDT)=0:1,SDAPPTDT<SDSTART:1,SDARRAY("CNT")=-$G(SDARRAY("MAX")):1,1:0) D
- .. D GETINFO(SDPATIEN,SDAPPTDT,.SDARRAY)
- Q
- ;
- GETINFO(SDPATIEN,SDAPPTDT,SDARRAY) ;
- N SDMATCH,SDCLINIC,SDA,SDQUIT
- S SDQUIT=0
- ; initialize array to hold data values
- S SDARRAY("DPT0")=$G(^DPT(SDPATIEN,"S",SDAPPTDT,0))
- S SDARRAY("DPT1")=$G(^DPT(SDPATIEN,"S",SDAPPTDT,1))
- S SDARRAY("DATE")=SDAPPTDT
- ;appointment must match the "patient" filter values
- I $$MATCH^SDAMA304("P",.SDARRAY,.SDFLTR,.SDDV) D
- . ;set clinic appointment data to null and get clinic
- . S (SDARRAY("SC0"),SDARRAY("SCC"),SDARRAY("SCOB"),SDARRAY("SCONS"))=""
- . S SDCLINIC=+$G(SDARRAY("DPT0"))
- . ;quit if clinic is null(0)
- . Q:SDCLINIC=0
- . ;since "by patient", 2nd sort is clinic
- . S SDARRAY("SORT2")=SDCLINIC
- . ;quit if this is a migrated appointment
- . Q:'($$CLMIG^SDAMA307(SDCLINIC,.SDARRAY))
- . S SDMATCH=1
- . ;if appointment is not cancelled on ^DPT and the PURGED parameter
- . ;is not set, then find the corresponding appt on ^SC and get data
- . I ('+$G(SDARRAY("PURGED"))&(";C;CA;PC;PCA;"'[(";"_$P($G(SDARRAY("DPT0")),"^",2)_";"))) D
- .. N SDCANCEL
- .. S SDQUIT=0,SDA=0,SDMATCH=0
- .. ;for current clinic and appt d/t, find matching appt on ^SC
- .. F S SDA=$O(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA)) Q:(($G(SDA)="")!(SDQUIT=1)) D
- ... S SDCANCEL=0
- ... ;get next appt if patient doesn't match
- ... Q:(+$G(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,0))'=SDPATIEN)
- ... ;get appointment data on ^SC
- ... S SDARRAY("SC0")=$G(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,0))
- ... ;get next appt if cancelled on SC
- ... S SDCANCEL=$P($G(SDARRAY("SC0")),"^",9)
- ... Q:($G(SDCANCEL)="C")
- ... ;get appointment "C" node on ^SC
- ... S SDARRAY("SCC")=$G(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,"C"))
- ... ;get appointment "OB" node on ^SC
- ... S SDARRAY("SCOB")=$G(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,"OB"))
- ... ;get appointment "CONS" node on ^SC
- ... S SDARRAY("SCONS")=$G(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,"CONS"))
- ... ;Corresponding appointment found on ^SC
- ... S SDQUIT=1,SDMATCH=1
- . ;if appointment matches the clinic filters, put appointment data into output array
- . I SDMATCH D
- .. I $$MATCH^SDAMA304("C",.SDARRAY,.SDFLTR,.SDDV) D SETARRAY^SDAMA305(.SDARRAY)
- Q
- SDAMA303 ;BPOIFO/ACS-Filter API By Patient ; 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 PATIENT
- +17 ;
- +18 ;INPUT
- +19 ; SDARRAY Appointment Filter array
- +20 ; SDDV Appointment Data Values array
- +21 ; SDFLTR Filter Flags array
- +22 ;
- +23 ;*****************************************************************
- PAT(SDARRAY,SDDV,SDFLTR) ;
- +1 NEW SDCOUNT,SDX,SDQUIT,SDPATIEN,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 patient is not in global, get patient from filter list
- +12 IF SDARRAY("PATGBL")=0
- Begin DoDot:1
- +13 SET SDCOUNT=$LENGTH(SDARRAY(4),";")
- +14 ;for each patient in the filter:
- +15 FOR SDX=1:1:SDCOUNT
- Begin DoDot:2
- +16 SET SDPATIEN=$PIECE(SDARRAY(4),";",SDX)
- +17 DO GETAPPT(SDPATIEN,SDSTART,SDEND,.SDARRAY)
- End DoDot:2
- End DoDot:1
- +18 ;if patient is in global, get patient from global
- +19 IF SDARRAY("PATGBL")=1
- Begin DoDot:1
- +20 SET SDGBL=SDARRAY(4)
- SET SDPATIEN=0
- +21 ;for each patient in the global:
- +22 FOR
- SET SDPATIEN=$ORDER(@(SDGBL_"SDPATIEN)"))
- IF +$GET(SDPATIEN)=0
- QUIT
- Begin DoDot:2
- +23 DO GETAPPT(SDPATIEN,SDSTART,SDEND,.SDARRAY)
- End DoDot:2
- End DoDot:1
- +24 QUIT
- +25 ;
- GETAPPT(SDPATIEN,SDSTART,SDEND,SDARRAY) ;
- +1 ;if the patient has no appointments on ^DPT, get next patient
- +2 IF '$DATA(^DPT(SDPATIEN,"S"))
- QUIT
- +3 ;since "by patient", 1st sort is patient
- +4 SET (SDARRAY("SORT1"),SDARRAY("PAT"))=SDPATIEN
- +5 NEW SDAPPTDT
- +6 ;
- +7 ;get first "N" appointments
- +8 IF $GET(SDARRAY("MAX"))'<0
- Begin DoDot:1
- +9 SET SDAPPTDT=SDSTART
- +10 ;Spin through each appointment on DPT for current patient
- +11 FOR
- SET SDAPPTDT=$ORDER(^DPT(SDPATIEN,"S",SDAPPTDT))
- IF $SELECT(+$GET(SDAPPTDT)=0
- QUIT
- Begin DoDot:2
- +12 DO GETINFO(SDPATIEN,SDAPPTDT,.SDARRAY)
- End DoDot:2
- End DoDot:1
- +13 ;
- +14 ;get last "N" appointments
- +15 IF $GET(SDARRAY("MAX"))<0
- Begin DoDot:1
- +16 SET SDAPPTDT=SDEND
- +17 ;spin through each appointment on DPT for current patient (REVERSE Order)
- +18 FOR
- SET SDAPPTDT=$ORDER(^DPT(SDPATIEN,"S",SDAPPTDT),-1)
- IF $SELECT(+$GET(SDAPPTDT)=0
- QUIT
- Begin DoDot:2
- +19 DO GETINFO(SDPATIEN,SDAPPTDT,.SDARRAY)
- End DoDot:2
- End DoDot:1
- +20 QUIT
- +21 ;
- GETINFO(SDPATIEN,SDAPPTDT,SDARRAY) ;
- +1 NEW SDMATCH,SDCLINIC,SDA,SDQUIT
- +2 SET SDQUIT=0
- +3 ; initialize array to hold data values
- +4 SET SDARRAY("DPT0")=$GET(^DPT(SDPATIEN,"S",SDAPPTDT,0))
- +5 SET SDARRAY("DPT1")=$GET(^DPT(SDPATIEN,"S",SDAPPTDT,1))
- +6 SET SDARRAY("DATE")=SDAPPTDT
- +7 ;appointment must match the "patient" filter values
- +8 IF $$MATCH^SDAMA304("P",.SDARRAY,.SDFLTR,.SDDV)
- Begin DoDot:1
- +9 ;set clinic appointment data to null and get clinic
- +10 SET (SDARRAY("SC0"),SDARRAY("SCC"),SDARRAY("SCOB"),SDARRAY("SCONS"))=""
- +11 SET SDCLINIC=+$GET(SDARRAY("DPT0"))
- +12 ;quit if clinic is null(0)
- +13 IF SDCLINIC=0
- QUIT
- +14 ;since "by patient", 2nd sort is clinic
- +15 SET SDARRAY("SORT2")=SDCLINIC
- +16 ;quit if this is a migrated appointment
- +17 IF '($$CLMIG^SDAMA307(SDCLINIC,.SDARRAY))
- QUIT
- +18 SET SDMATCH=1
- +19 ;if appointment is not cancelled on ^DPT and the PURGED parameter
- +20 ;is not set, then find the corresponding appt on ^SC and get data
- +21 IF ('+$GET(SDARRAY("PURGED"))&(";C;CA;PC;PCA;"'[(";"_$PIECE($GET(SDARRAY("DPT0")),"^",2)_";")))
- Begin DoDot:2
- +22 NEW SDCANCEL
- +23 SET SDQUIT=0
- SET SDA=0
- SET SDMATCH=0
- +24 ;for current clinic and appt d/t, find matching appt on ^SC
- +25 FOR
- SET SDA=$ORDER(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA))
- IF (($GET(SDA)="")!(SDQUIT=1))
- QUIT
- Begin DoDot:3
- +26 SET SDCANCEL=0
- +27 ;get next appt if patient doesn't match
- +28 IF (+$GET(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,0))'=SDPATIEN)
- QUIT
- +29 ;get appointment data on ^SC
- +30 SET SDARRAY("SC0")=$GET(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,0))
- +31 ;get next appt if cancelled on SC
- +32 SET SDCANCEL=$PIECE($GET(SDARRAY("SC0")),"^",9)
- +33 IF ($GET(SDCANCEL)="C")
- QUIT
- +34 ;get appointment "C" node on ^SC
- +35 SET SDARRAY("SCC")=$GET(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,"C"))
- +36 ;get appointment "OB" node on ^SC
- +37 SET SDARRAY("SCOB")=$GET(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,"OB"))
- +38 ;get appointment "CONS" node on ^SC
- +39 SET SDARRAY("SCONS")=$GET(^SC(SDCLINIC,"S",SDAPPTDT,1,SDA,"CONS"))
- +40 ;Corresponding appointment found on ^SC
- +41 SET SDQUIT=1
- SET SDMATCH=1
- End DoDot:3
- End DoDot:2
- +42 ;if appointment matches the clinic filters, put appointment data into output array
- +43 IF SDMATCH
- Begin DoDot:2
- +44 IF $$MATCH^SDAMA304("C",.SDARRAY,.SDFLTR,.SDDV)
- DO SETARRAY^SDAMA305(.SDARRAY)
- End DoDot:2
- End DoDot:1
- +45 QUIT