| 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
 | 
|---|