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