| 1 | SDAMA203 ;BPIOFO/ACS-Scheduling API for IMO ;15 April 2003
 | 
|---|
| 2 |  ;;5.3;Scheduling;**285,406**;13 Aug 1993
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;Scheduling API to return encounter or appointment date/time for
 | 
|---|
| 5 |  ;a patient that can receive inpatient medication from an
 | 
|---|
| 6 |  ;authorized clinic
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ;**********************************************************************
 | 
|---|
| 9 |  ;                        CHANGE LOG
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ;  DATE      PATCH       DESCRIPTION                 DEVELOPER
 | 
|---|
| 12 |  ;--------  ----------    ----------------------------------------------
 | 
|---|
| 13 |  ;04/15/03  SD*5.3*285    ROUTINE WRITTEN             A SAUNDERS
 | 
|---|
| 14 |  ;10/12/06  SD*5.3*406    FIXED ERROR CODE -3         A SAUNDERS
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ;**********************************************************************
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  ;          **** TO BE CALLED WITH AN EXTRINISIC CALL ****
 | 
|---|
| 19 |  ;Example:  I $$SDIMO^SDAMA203(CLIEN,DFN) S APPTDT=SDIMO(1) K SDIMO(1)
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  ;INPUT
 | 
|---|
| 22 |  ;  SDCLIEN      Clinic IEN (required)
 | 
|---|
| 23 |  ;  SDPATDFN     Patient DFN (required)
 | 
|---|
| 24 |  ;  
 | 
|---|
| 25 |  ;OUTPUT
 | 
|---|
| 26 |  ;  The extrinsic call will return one of the following values:
 | 
|---|
| 27 |  ;     1   Patient has at least one scheduled appointment or checked-in
 | 
|---|
| 28 |  ;         visit in an authorized clinic
 | 
|---|
| 29 |  ;     0   Patient has no scheduled appointments or checked-in visits
 | 
|---|
| 30 |  ;         in an authorized clinic
 | 
|---|
| 31 |  ;    -1   Clinic is not an authorized clinic, clinic is inactive,
 | 
|---|
| 32 |  ;         or SDCLIEN is null
 | 
|---|
| 33 |  ;    -2   SDPATDFN is null
 | 
|---|
| 34 |  ;    -3   Scheduling database is unavailable
 | 
|---|
| 35 |  ;  
 | 
|---|
| 36 |  ;  If a 1 is returned, then SDIMO(1) = Encounter or appointment 
 | 
|---|
| 37 |  ;  date/time in FileMan format
 | 
|---|
| 38 |  ;   
 | 
|---|
| 39 |  ;**********************************************************************
 | 
|---|
| 40 |  ;   Special Logic:
 | 
|---|
| 41 |  ; - In line tag SDVISIT, the ACRP Toolkit API EXOE^SDOE is called 
 | 
|---|
| 42 |  ;   multiple times as needed.  This API returns the NEXT encounter, 
 | 
|---|
| 43 |  ;   given a start and end date/time.  We want to check ALL encounters
 | 
|---|
| 44 |  ;   for a match on clinic IEN
 | 
|---|
| 45 |  ; - In line tag SDDATE, if the current time is between midnight and 6am,
 | 
|---|
| 46 |  ;   the API will start to look for encounters and/or appointments on the 
 | 
|---|
| 47 |  ;   previous day
 | 
|---|
| 48 |  ;
 | 
|---|
| 49 |  ;  Internal variables:
 | 
|---|
| 50 |  ;  SDBACK   Contains the value to be returned from this call.  See 
 | 
|---|
| 51 |  ;           above for OUTPUT values and corresponding definitions
 | 
|---|
| 52 |  ;  SDCONT   Flag to indicate if processing should continue.  If
 | 
|---|
| 53 |  ;           the patient has an encounter in an authorized clinic
 | 
|---|
| 54 |  ;           today, then we can skip the last step and not look for
 | 
|---|
| 55 |  ;           a scheduled appointment
 | 
|---|
| 56 |  ;  SDFROM   The date to start searching for an encounter or appointment
 | 
|---|
| 57 |  ;  SDAPPTDT Encounter or appointment date/time returned in SDIMO(1)
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 |  ;**********************************************************************
 | 
|---|
| 60 | SDIMO(SDCLIEN,SDPATDFN) ;
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  ;--INITIALIZATION--
 | 
|---|
| 63 |  K SDIMO(1)
 | 
|---|
| 64 |  N SDBACK,SDCONT,SDFROM,SDAPPTDT
 | 
|---|
| 65 |  S SDBACK=1,SDCONT=1,SDAPPTDT=0,SDFROM=0
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ;--MAIN--
 | 
|---|
| 68 |  ; Valid variables passed in?
 | 
|---|
| 69 |  D SDVALVAR($G(SDPATDFN),$G(SDCLIEN),.SDBACK)
 | 
|---|
| 70 |  ; If no error, is clinic active and authorized?
 | 
|---|
| 71 |  I SDBACK=1 D SDAUTHCL(SDCLIEN,.SDBACK)
 | 
|---|
| 72 |  ; If no error, set up search "start" date
 | 
|---|
| 73 |  I SDBACK=1 D SDDATE(.SDFROM)
 | 
|---|
| 74 |  ; If no error, does patient have an encounter in that clinic?
 | 
|---|
| 75 |  I SDBACK=1 D SDVISIT(SDPATDFN,SDCLIEN,.SDAPPTDT,.SDCONT,.SDBACK,SDFROM)
 | 
|---|
| 76 |  ; If no error and no encounter, does patient have an appointment in that
 | 
|---|
| 77 |  ; clinic?
 | 
|---|
| 78 |  I SDBACK=1,SDCONT=1 D SDAPPT(SDPATDFN,SDCLIEN,.SDAPPTDT,.SDBACK,SDFROM)
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 |  ;--FINALIZATION--
 | 
|---|
| 81 |  ; If no error
 | 
|---|
| 82 |  I SDBACK=1 D
 | 
|---|
| 83 |  . ; Set up output array with the encounter or appointment date/time
 | 
|---|
| 84 |  . ; Make sure the appointment date/time exists in SDAPPTDT
 | 
|---|
| 85 |  . I $G(SDAPPTDT)]"" D
 | 
|---|
| 86 |  .. S SDIMO(1)=SDAPPTDT
 | 
|---|
| 87 |  . I $G(SDAPPTDT)']"" D
 | 
|---|
| 88 |  .. S SDBACK=0
 | 
|---|
| 89 |  ; Return value
 | 
|---|
| 90 |  Q SDBACK
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ;----------------------------------------------------------------------
 | 
|---|
| 93 |  ;-Validate input variables
 | 
|---|
| 94 | SDVALVAR(SDPATDFN,SDCLIEN,SDBACK) ;
 | 
|---|
| 95 |  ; Clinic IEN and patient DFN cannot be null
 | 
|---|
| 96 |  I $G(SDCLIEN)="" S SDBACK=-1 Q
 | 
|---|
| 97 |  I $G(SDPATDFN)="" S SDBACK=-2 Q
 | 
|---|
| 98 |  Q
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 |  ;-Clinic must be type "C", authorized to administer inpatient meds,
 | 
|---|
| 101 |  ;-and active
 | 
|---|
| 102 | SDAUTHCL(SDCLIEN,SDBACK) ;
 | 
|---|
| 103 |  N SDAUTH,SDTYPE
 | 
|---|
| 104 |  S SDAUTH=0,SDTYPE=0
 | 
|---|
| 105 |  ; clinic must be type "C"
 | 
|---|
| 106 |  S SDTYPE=$P($G(^SC(SDCLIEN,0)),"^",3)
 | 
|---|
| 107 |  I $G(SDTYPE)="C" D
 | 
|---|
| 108 |  . ; clinic must be authorized to administer inpatient meds
 | 
|---|
| 109 |  . I $D(^SC("AE",1,SDCLIEN)) S SDAUTH=1
 | 
|---|
| 110 |  I SDAUTH'=1 S SDBACK=-1 Q
 | 
|---|
| 111 |  ; clinic must be active
 | 
|---|
| 112 |  ; if clinic inactivate date exists, check further
 | 
|---|
| 113 |  N SDINACT,SDREACT
 | 
|---|
| 114 |  S SDINACT=$P($G(^SC(SDCLIEN,"I")),"^",1)
 | 
|---|
| 115 |  I $G(SDINACT)]"" D
 | 
|---|
| 116 |  . ; if inactivate date is today or earlier, get reactivate date
 | 
|---|
| 117 |  . I SDINACT'>DT D
 | 
|---|
| 118 |  .. S SDREACT=$P($G(^SC(SDCLIEN,"I")),"^",2)
 | 
|---|
| 119 |  .. ; reactivate date can't be null
 | 
|---|
| 120 |  .. I $G(SDREACT)="" S SDBACK=-1
 | 
|---|
| 121 |  .. ; if reactivate date exists
 | 
|---|
| 122 |  .. E  D
 | 
|---|
| 123 |  ... ; reactivate date must be less than or equal to today
 | 
|---|
| 124 |  ... ; but greater than or equal to inactivate date
 | 
|---|
| 125 |  ... I (SDREACT>DT!(SDREACT<SDINACT)) S SDBACK=-1
 | 
|---|
| 126 |  Q
 | 
|---|
| 127 |  ;-Set up start date for encounters and appointments
 | 
|---|
| 128 | SDDATE(SDFROM) ;
 | 
|---|
| 129 |  N %,X
 | 
|---|
| 130 |  D NOW^%DTC
 | 
|---|
| 131 |  ;if the current time is before 6am, set 'start' date to yesterday
 | 
|---|
| 132 |  I ("."_$P(%,".",2))<.060000 S SDFROM=(X-1)
 | 
|---|
| 133 |  E  S SDFROM=X
 | 
|---|
| 134 |  Q
 | 
|---|
| 135 |  ;-Look for encounter that occurred in the authorized clinic
 | 
|---|
| 136 | SDVISIT(SDPATDFN,SDCLIEN,SDAPPTDT,SDCONT,SDBACK,SDFROM) ;
 | 
|---|
| 137 |  N SDSTART,SDEND,SDENCNUM,SDENCDT,SDENCCL
 | 
|---|
| 138 |  ; set up start and end date/time
 | 
|---|
| 139 |  S SDSTART=SDFROM_".0000"
 | 
|---|
| 140 |  S SDEND=DT_".2359"
 | 
|---|
| 141 |  ; get encounters
 | 
|---|
| 142 |  F  D  Q:+SDENCNUM=0
 | 
|---|
| 143 |  . ; call API to get next encounter
 | 
|---|
| 144 |  . S SDENCNUM=+$$EXOE^SDOE(SDPATDFN,SDSTART,SDEND)
 | 
|---|
| 145 |  . I $G(SDENCNUM) D
 | 
|---|
| 146 |  .. ; encounter found.  call API to get more encounter data
 | 
|---|
| 147 |  .. D GETGEN^SDOE(SDENCNUM,"SDDATA")
 | 
|---|
| 148 |  .. I $G(SDDATA(0)) D
 | 
|---|
| 149 |  ... ; get encounter date/time and clinic IEN
 | 
|---|
| 150 |  ... S SDENCDT=$P($G(SDDATA(0)),"^",1),SDENCCL=$P($G(SDDATA(0)),"^",4)
 | 
|---|
| 151 |  ... ; if encounter clinic matches authorized clinic, set flags
 | 
|---|
| 152 |  ... I $G(SDENCCL)=SDCLIEN S SDENCNUM=0,SDCONT=0,SDAPPTDT=$G(SDENCDT)
 | 
|---|
| 153 |  ... ; if no match on clinic, reset start date for next encounter
 | 
|---|
| 154 |  ... I $G(SDENCCL)'=SDCLIEN S SDSTART=(SDENCDT+.000001)
 | 
|---|
| 155 |  ... K SDDATA
 | 
|---|
| 156 |  Q
 | 
|---|
| 157 |  ;-Look for scheduled appointment in the authorized clinic
 | 
|---|
| 158 | SDAPPT(SDPATDFN,SDCLIEN,SDAPPTDT,SDBACK,SDFROM) ;
 | 
|---|
| 159 |  N SDRESULT,SDAPPTCL,SDMATCH
 | 
|---|
| 160 |  S SDMATCH=0
 | 
|---|
| 161 |  ; call API to get appointments for this patient
 | 
|---|
| 162 |  D GETAPPT^SDAMA201(SDPATDFN,"1;2","R;NT",SDFROM,,.SDRESULT)
 | 
|---|
| 163 |  ; SDRESULT contains a count of the returned appointments
 | 
|---|
| 164 |  I SDRESULT>0 D
 | 
|---|
| 165 |  . N SDI
 | 
|---|
| 166 |  . ; spin through returned appointments and look for match on clinic IEN
 | 
|---|
| 167 |  . F SDI=1:1:SDRESULT D  Q:SDMATCH=1
 | 
|---|
| 168 |  .. S SDAPPTCL=$G(^TMP($J,"SDAMA201","GETAPPT",SDI,2))
 | 
|---|
| 169 |  .. I +$G(SDAPPTCL)=SDCLIEN D
 | 
|---|
| 170 |  ... S SDAPPTDT=$G(^TMP($J,"SDAMA201","GETAPPT",SDI,1))
 | 
|---|
| 171 |  ... S SDMATCH=1
 | 
|---|
| 172 |  . ; delete appointment array returned from Scheduling API
 | 
|---|
| 173 |  . K ^TMP($J,"SDAMA201","GETAPPT")
 | 
|---|
| 174 |  I ((SDRESULT=0)!(SDMATCH=0)) S SDBACK=0
 | 
|---|
| 175 |  I SDRESULT=-1 D
 | 
|---|
| 176 |  . S SDBACK=0
 | 
|---|
| 177 |  . ; if database unavailable, set database-specific flag
 | 
|---|
| 178 |  . I $D(^TMP($J,"SDAMA201","GETAPPT","ERROR",101)) S SDBACK=-3
 | 
|---|
| 179 |  . ; delete error array returned from Scheduling API
 | 
|---|
| 180 |  . K ^TMP($J,"SDAMA201","GETAPPT")
 | 
|---|
| 181 |  Q
 | 
|---|