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