| 1 | SDAMA302 ;BPOIFO/ACS-Filter API By Clinic ; 9/14/05 12:45pm | 
|---|
| 2 | ;;5.3;Scheduling;**301,347,508**;13 Aug 1993 | 
|---|
| 3 | ;PER VHA DIRECTIVE 2004-038, DO NOT MODIFY THIS ROUTINE | 
|---|
| 4 | ; | 
|---|
| 5 | ;***************************************************************** | 
|---|
| 6 | ;              CHANGE LOG | 
|---|
| 7 | ; | 
|---|
| 8 | ;  DATE      PATCH       DESCRIPTION | 
|---|
| 9 | ;--------  ----------    ----------------------------------------- | 
|---|
| 10 | ;12/04/03  SD*5.3*301    ROUTINE COMPLETED | 
|---|
| 11 | ;08/06/04  SD*5.3*347    CHANGE CALL TO ^SDAMA305 TO SETARRAY | 
|---|
| 12 | ;02/22/07  SD*5.3*508    SEE SDAMA301 FOR CHANGE LIST | 
|---|
| 13 | ;***************************************************************** | 
|---|
| 14 | ; | 
|---|
| 15 | ;***************************************************************** | 
|---|
| 16 | ; | 
|---|
| 17 | ;               GET APPOINTMENT DATA BY CLINIC | 
|---|
| 18 | ; | 
|---|
| 19 | ;INPUT | 
|---|
| 20 | ;  SDARRAY   Appointment Filter array | 
|---|
| 21 | ;  SDDV      Appointment Data Values array | 
|---|
| 22 | ;  SDFLTR    Filter Flags array | 
|---|
| 23 | ; | 
|---|
| 24 | ;***************************************************************** | 
|---|
| 25 | CLIN(SDARRAY,SDDV,SDFLTR) ; | 
|---|
| 26 | N SDCOUNT,SDX,SDQUIT,SDCLIEN,SDSTART,SDEND,SDGBL | 
|---|
| 27 | S (SDCOUNT,SDQUIT)=0 | 
|---|
| 28 | ;Set up start and end date/times for search criteria | 
|---|
| 29 | I $G(SDARRAY("MAX"))'<0  D | 
|---|
| 30 | .S SDSTART=$S(SDARRAY("FR")'="":(SDARRAY("FR")-.000001),1:0) | 
|---|
| 31 | .S SDEND=SDARRAY("TO") | 
|---|
| 32 | I $G(SDARRAY("MAX"))<0  D | 
|---|
| 33 | .S SDSTART=$S($G(SDARRAY("FR"))'="":SDARRAY("FR"),1:0) | 
|---|
| 34 | .S SDEND=(SDARRAY("TO")+.000001) | 
|---|
| 35 | ; | 
|---|
| 36 | ;If clinic filter is populated | 
|---|
| 37 | I $L($G(SDARRAY(2)))>0 D | 
|---|
| 38 | . ;if clinic is in a list: | 
|---|
| 39 | . I SDARRAY("CLNGBL")=0 D | 
|---|
| 40 | .. S SDCOUNT=$L(SDARRAY(2),";") | 
|---|
| 41 | .. ;For each clinic in the filter: | 
|---|
| 42 | .. F SDX=1:1:SDCOUNT D | 
|---|
| 43 | ... S SDCLIEN=$P(SDARRAY(2),";",SDX) | 
|---|
| 44 | ... ;call VistA for appointment information | 
|---|
| 45 | ... D CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY) | 
|---|
| 46 | . ;if clinic is in array, get IENs | 
|---|
| 47 | . I SDARRAY("CLNGBL")=1 D | 
|---|
| 48 | .. S SDGBL=SDARRAY(2),SDCLIEN=0 | 
|---|
| 49 | .. ;for each clinic in the global: | 
|---|
| 50 | .. F  S SDCLIEN=$O(@(SDGBL_"SDCLIEN)")) Q:$G(SDCLIEN)=""  D | 
|---|
| 51 | ... ;call VistA for appointment information | 
|---|
| 52 | ... D CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY) | 
|---|
| 53 | ; | 
|---|
| 54 | ;If clinic filter is not populated | 
|---|
| 55 | I $L(SDARRAY(2))'>0 D | 
|---|
| 56 | . ;for each clinic on ^SC | 
|---|
| 57 | . S SDCLIEN=0 F  S SDCLIEN=$O(^SC(SDCLIEN)) Q:(+$G(SDCLIEN)=0)  D | 
|---|
| 58 | .. ;call VistA for appointment information | 
|---|
| 59 | .. D CALLVSTA(SDCLIEN,SDSTART,SDEND,.SDARRAY) | 
|---|
| 60 | Q | 
|---|
| 61 | ; | 
|---|
| 62 | CALLVSTA(SDCLIEN,SDSTART,SDEND,SDARRAY) ; | 
|---|
| 63 | ;retrieve appointment information from VistA | 
|---|
| 64 | I $$CLMIG^SDAMA307(SDCLIEN,.SDARRAY) D | 
|---|
| 65 | . ;adjust end time if clinic has completed migration | 
|---|
| 66 | . ;(Only Non-migrated appointments returned from VistA) | 
|---|
| 67 | . I $G(SDARRAY("MIG"))]"" D | 
|---|
| 68 | .. S SDEND=+$G(SDARRAY("MIG")) | 
|---|
| 69 | .. ;increment SDEND to capture all appointments when ordering | 
|---|
| 70 | .. S:$G(SDARRAY("MAX"))<0 SDEND=(SDEND+.000001) | 
|---|
| 71 | . D GETAPPT(SDCLIEN,SDSTART,SDEND,.SDARRAY) | 
|---|
| 72 | Q | 
|---|
| 73 | ; | 
|---|
| 74 | GETAPPT(SDCLIEN,SDSTART,SDEND,SDARRAY) ; | 
|---|
| 75 | ;since "by clinic", 1st sort is clinic | 
|---|
| 76 | S SDARRAY("SORT1")=SDCLIEN | 
|---|
| 77 | N SDAPPTDT,SDA | 
|---|
| 78 | ;if the current clinic has no appointments on ^SC, get next clinic | 
|---|
| 79 | Q:'$D(^SC(SDCLIEN,"S")) | 
|---|
| 80 | ; | 
|---|
| 81 | ;get first "N" appointments | 
|---|
| 82 | I $G(SDARRAY("MAX"))'<0  D | 
|---|
| 83 | .S SDAPPTDT=SDSTART | 
|---|
| 84 | .;spin through each date/time for current clinic | 
|---|
| 85 | .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 | 
|---|
| 86 | .. ;spin through each appointment for that date/time | 
|---|
| 87 | .. 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 | 
|---|
| 88 | ... D GETINFO(SDCLIEN,SDAPPTDT,SDA,.SDARRAY) | 
|---|
| 89 | ; | 
|---|
| 90 | ;get last "N" appointments | 
|---|
| 91 | I $G(SDARRAY("MAX"))<0  D | 
|---|
| 92 | .S SDAPPTDT=SDEND | 
|---|
| 93 | .;spin through each date/time for current clinic (REVERSE Order) | 
|---|
| 94 | .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 | 
|---|
| 95 | .. ;spin through each appointment for that date/time (REVERSE Order) | 
|---|
| 96 | .. 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 | 
|---|
| 97 | ... D GETINFO(SDCLIEN,SDAPPTDT,SDA,.SDARRAY) | 
|---|
| 98 | Q | 
|---|
| 99 | ; | 
|---|
| 100 | GETINFO(SDCLIEN,SDAPPTDT,SDA,SDARRAY) ; | 
|---|
| 101 | N SDPATIEN,SDCAN,SDQUIT | 
|---|
| 102 | S SDQUIT=0 | 
|---|
| 103 | ;get appointment data on ^SC | 
|---|
| 104 | S SDARRAY("SC0")=$G(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,0)) | 
|---|
| 105 | S SDARRAY("SCC")=$G(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"C")) | 
|---|
| 106 | S SDARRAY("SCOB")=$G(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"OB")) | 
|---|
| 107 | S SDARRAY("SCONS")=$G(^SC(SDCLIEN,"S",SDAPPTDT,1,SDA,"CONS")) | 
|---|
| 108 | S SDARRAY("DATE")=SDAPPTDT | 
|---|
| 109 | ;exclude cancelled appts | 
|---|
| 110 | S SDCAN=$P($G(SDARRAY("SC0")),"^",9) | 
|---|
| 111 | Q:$G(SDCAN)="C" | 
|---|
| 112 | ;initialize patient appointment data to null and get patient DFN | 
|---|
| 113 | S (SDARRAY("DPT0"),SDARRAY("DPT1"))="" | 
|---|
| 114 | S (SDPATIEN,SDARRAY("PAT"))=+SDARRAY("SC0") | 
|---|
| 115 | ;quit if patient is null on ^SC | 
|---|
| 116 | Q:SDPATIEN=0 | 
|---|
| 117 | ;since "by clinic", 2nd sort is patient | 
|---|
| 118 | S SDARRAY("SORT2")=SDPATIEN | 
|---|
| 119 | ;get corresponding appt zero node on ^DPT | 
|---|
| 120 | S SDARRAY("DPT0")=$G(^DPT(SDPATIEN,"S",SDAPPTDT,0)) | 
|---|
| 121 | ;skip if appointment is cancelled on DPT | 
|---|
| 122 | Q:($P($G(SDARRAY("DPT0")),"^",2)["C") | 
|---|
| 123 | ;skip if appointment on DPT is for different clinic | 
|---|
| 124 | Q:(+$G(SDARRAY("DPT0"))'=SDCLIEN) | 
|---|
| 125 | ;get appointment 1 node on ^DPT | 
|---|
| 126 | S SDARRAY("DPT1")=$G(^DPT(SDPATIEN,"S",SDAPPTDT,1)) | 
|---|
| 127 | ;appointment must match the "clinic" filter values | 
|---|
| 128 | I $$MATCH^SDAMA304("C",.SDARRAY,.SDFLTR,.SDDV) D | 
|---|
| 129 | . ;if appointment matches the "patient" filter values, put appointment data into output array | 
|---|
| 130 | . I $$MATCH^SDAMA304("P",.SDARRAY,.SDFLTR,.SDDV) D SETARRAY^SDAMA305(.SDARRAY) | 
|---|
| 131 | Q | 
|---|