1 | ACKQPCE1 ;HCIOFO/AG - Quasar/PCE Interface; August 1999. ; 5/6/03 11:06am
|
---|
2 | ;;3.0;QUASAR;**1,2,5,7,8**;Feb 11, 2000
|
---|
3 | ;
|
---|
4 | ; this routine contains the code for sending a Quasar visit to PCE
|
---|
5 | ; it is called from ACKQPCE.
|
---|
6 | ;
|
---|
7 | SENDPCE(ACKVIEN,ACKPKG,ACKSRC) ; send a Quasar Visit to PCE.
|
---|
8 | ; see SENDPCE^ACKQPCE for entry parameters and processing notes.
|
---|
9 | ; this routine should not be called directly, only from ACKQPCE
|
---|
10 | ; (this routine assumes all the entry parameters are passed!)
|
---|
11 | N ACKSENT,ACKLOCK,ACKRSN,ACKMSG,ACKFDA,ACKFDA2,ACKPCE,ACKE,ACKERR,ACKNARR
|
---|
12 | N ACKVDT,ACKVTM,ACKPAT,ACKSC,ACKAO,ACKIR,ACKEC,ACKCHKDT,ACKELIG,ACKPROCP
|
---|
13 | N ACKVSC,ACKCAT,ACKAPI,ACKCT,ACKPRIM,ACKSCND,ACKSTUD,ACKIEN,ACKICD9
|
---|
14 | N ACKCPT,ACKVOL,ACKIEN2,ACKMOD,ACKPROB,ACKARR,ACKDATE,ACKDPRIM,ACKK5
|
---|
15 | ; initialize
|
---|
16 | S ACKSENT=0,ACKLOCK=0,ACKERR=0
|
---|
17 | D NOW^%DTC S ACKDATE=% ; to be used for LAST SENT TO PCE field
|
---|
18 | ;
|
---|
19 | ; lock the visit
|
---|
20 | L +^ACK(509850.6,ACKVIEN):0 S ACKLOCK=$T
|
---|
21 | ; if unable to lock then exit
|
---|
22 | I 'ACKLOCK G SENDPCEX
|
---|
23 | ;
|
---|
24 | ; initialize temp file
|
---|
25 | K ^TMP("ACKQPCE1",$J)
|
---|
26 | ;
|
---|
27 | ; remove PCE errors from the visit
|
---|
28 | D CLEAR^ACKQPCE(ACKVIEN)
|
---|
29 | ;
|
---|
30 | ; get the visit data and place in temp file
|
---|
31 | D GETDATA
|
---|
32 | ;
|
---|
33 | ; if this visit exists in PCE then remove workload data
|
---|
34 | D CHKPCE I ACKERR G SENDPCEX
|
---|
35 | ;
|
---|
36 | ; build the temp file for sending to PCE
|
---|
37 | D BUILD
|
---|
38 | ;
|
---|
39 | ; now send
|
---|
40 | D SENDIT
|
---|
41 | ;
|
---|
42 | SENDPCEX ; exit point
|
---|
43 | ;
|
---|
44 | ; if visit was locked, unlock it
|
---|
45 | I ACKLOCK L -^ACK(509850.6,ACKVIEN)
|
---|
46 | ;
|
---|
47 | ; clear the temp file
|
---|
48 | ;K ^TMP("ACKQPCE1",$J)
|
---|
49 | ;
|
---|
50 | ; return
|
---|
51 | Q ACKSENT
|
---|
52 | ;
|
---|
53 | GETDATA ; get the visit data and place in temp file
|
---|
54 | S ACKFDA=$NA(^TMP("ACKQPCE1",$J,"FDA"))
|
---|
55 | D GETS^DIQ(509850.6,ACKVIEN_",","**","I",ACKFDA,"")
|
---|
56 | S ACKFDA2=$NA(^TMP("ACKQPCE1",$J,"FDA",509850.6,ACKVIEN_","))
|
---|
57 | ; data now stored in ..
|
---|
58 | ; ^TMP("ACKQPCE1",$J,"FDA",509850.6,visit_",",fldnum,"I")=internal value
|
---|
59 | ; simplified to @ACKFDA2@(fldnum,"I")=internal value
|
---|
60 | ; get the PCE visit ien
|
---|
61 | S ACKPCE=@ACKFDA2@(125,"I")
|
---|
62 | ; get the visit date and time, patient and clinic
|
---|
63 | S ACKVDT=@ACKFDA2@(.01,"I")
|
---|
64 | S ACKVTM=@ACKFDA2@(55,"I")
|
---|
65 | S ACKPAT=@ACKFDA2@(1,"I")
|
---|
66 | S ACKCLN=@ACKFDA2@(2.6,"I")
|
---|
67 | ; end of getdata
|
---|
68 | Q
|
---|
69 | ;
|
---|
70 | CHKPCE ; check if the visit is already in PCE and remove workload if it is
|
---|
71 | I 'ACKPCE Q
|
---|
72 | ;
|
---|
73 | ; check PCE visit is for same Patient, Clinic, Date and Time
|
---|
74 | ; if any item different then this Qsr visit is treated as new
|
---|
75 | ; and any data from Quasar is deleted from the original PCE visit
|
---|
76 | ; (sending ACKPKG and ACKSRC ensures that only data that originally
|
---|
77 | ; came from Quasar will be removed).
|
---|
78 | I +$$PCECHK^ACKQUTL3(ACKPCE,ACKVDT,ACKVTM,ACKPAT,ACKCLN)'=2 D Q
|
---|
79 | . S ACKE=$$DELVFILE^PXAPI("ALL",ACKPCE,ACKPKG,ACKSRC,0,0,"")
|
---|
80 | . S ACKPCE="" ; remove PCE Visit ien from Qsr visit
|
---|
81 | . K ACKARR S ACKARR(509850.6,ACKVIEN_",",125)="@"
|
---|
82 | . D FILE^DIE("","ACKARR","")
|
---|
83 | ;
|
---|
84 | ; remove all workload data from the PCE visit
|
---|
85 | S ACKE=$$DELVFILE^PXAPI("CPT^POV^PRV^VISIT",ACKPCE,"","",0,0,"")
|
---|
86 | S ACKERR=$S(ACKE>-1:0,ACKE=-4:0,1:1)
|
---|
87 | ;
|
---|
88 | ; if error occurred then store on visit file
|
---|
89 | I ACKERR D Q
|
---|
90 | . K ACKRSN S ACKMSG="Unable to delete original PCE visit data (error code="_ACKE_")"
|
---|
91 | . D ADDRSN^ACKQPCE2("PCE VISIT",ACKPCE,"",ACKMSG,.ACKRSN)
|
---|
92 | . D FILERSN^ACKQPCE(ACKVIEN,.ACKRSN) ; file errors on visit file
|
---|
93 | ;
|
---|
94 | ; if no error, check to see if the entire PCE visit has been deleted
|
---|
95 | ; and if so, blank out the PCE Visit ien variable so that a new one
|
---|
96 | ; can be allocated.
|
---|
97 | K ^TMP("PXKENC",$J)
|
---|
98 | D ENCEVENT^PXAPI(ACKPCE)
|
---|
99 | I '$D(^TMP("PXKENC",$J,ACKPCE)) D
|
---|
100 | . K ACKARR S ACKARR(509850.6,ACKVIEN_",",125)="@"
|
---|
101 | . D FILE^DIE("","ACKARR","")
|
---|
102 | . S ACKPCE=""
|
---|
103 | K ^TMP("PXKENC",$J)
|
---|
104 | ;
|
---|
105 | ; return
|
---|
106 | Q
|
---|
107 | ;
|
---|
108 | ;
|
---|
109 | BUILD ; now build array for passing data to PCE
|
---|
110 | K ^TMP("ACKQPCE1",$J,"PXAPI")
|
---|
111 | S ACKAPI=$NA(^TMP("ACKQPCE1",$J,"PXAPI"))
|
---|
112 | ;
|
---|
113 | ; ----------encounter date/time----------------
|
---|
114 | S @ACKAPI@("ENCOUNTER",1,"ENC D/T")=(ACKVDT\1+ACKVTM)
|
---|
115 | ; --------------patient-----------------------
|
---|
116 | S @ACKAPI@("ENCOUNTER",1,"PATIENT")=ACKPAT
|
---|
117 | ; ---------------clinic-----------------------
|
---|
118 | S @ACKAPI@("ENCOUNTER",1,"HOS LOC")=ACKCLN
|
---|
119 | ; ------------service connected---------------
|
---|
120 | S ACKSC=@ACKFDA2@(20,"I")
|
---|
121 | S @ACKAPI@("ENCOUNTER",1,"SC")=ACKSC
|
---|
122 | ; -------------agent orange,MST etc---------------
|
---|
123 | S ACKAO=@ACKFDA2@(25,"I")
|
---|
124 | S @ACKAPI@("ENCOUNTER",1,"AO")=ACKAO
|
---|
125 | S ACKIR=@ACKFDA2@(30,"I")
|
---|
126 | S @ACKAPI@("ENCOUNTER",1,"IR")=ACKIR
|
---|
127 | S ACKEC=@ACKFDA2@(35,"I")
|
---|
128 | S @ACKAPI@("ENCOUNTER",1,"EC")=ACKEC
|
---|
129 | S ACKMST=@ACKFDA2@(90,"I")
|
---|
130 | S @ACKAPI@("ENCOUNTER",1,"MST")=ACKMST
|
---|
131 | ; -------------checkout date/time-------------
|
---|
132 | D NOW^%DTC S ACKCHKDT=%
|
---|
133 | S @ACKAPI@("ENCOUNTER",1,"CHECKOUT D/T")=ACKCHKDT
|
---|
134 | ; -------------visit eligibility--------------
|
---|
135 | S ACKELIG=@ACKFDA2@(80,"I")
|
---|
136 | S @ACKAPI@("ENCOUNTER",1,"ELIGIBILITY")=ACKELIG
|
---|
137 | ; --------------service category--------------
|
---|
138 | S ACKVSC=@ACKFDA2@(4,"I")
|
---|
139 | S ACKCAT=$S(ACKVSC="AT":"T",ACKVSC="ST":"T",1:"X")
|
---|
140 | S @ACKAPI@("ENCOUNTER",1,"SERVICE CATEGORY")=ACKCAT
|
---|
141 | ; ---------------encounter type---------------
|
---|
142 | S @ACKAPI@("ENCOUNTER",1,"ENCOUNTER TYPE")="P"
|
---|
143 | ;
|
---|
144 | S ACKCT=0
|
---|
145 | ; ------------secondary provider-------------
|
---|
146 | S ACKK5=""
|
---|
147 | F S ACKK5=$O(^TMP("ACKQPCE1",$J,"FDA",509850.66,ACKK5)) Q:ACKK5="" D
|
---|
148 | . I $P(ACKK5,",",2)'=ACKVIEN Q
|
---|
149 | . S ACKSCND=$G(^TMP("ACKQPCE1",$J,"FDA",509850.66,ACKK5,".01","I"))
|
---|
150 | . I ACKSCND="" Q
|
---|
151 | . S ACKSCND=$$CONVERT1^ACKQUTL4(ACKSCND)
|
---|
152 | . S ACKCT=ACKCT+1,@ACKAPI@("PROVIDER",ACKCT,"NAME")=ACKSCND
|
---|
153 | ; ------------primary provider----------------
|
---|
154 | S ACKPRIM=@ACKFDA2@(6,"I")
|
---|
155 | I ACKPRIM'="" D
|
---|
156 | . S ACKPRIM=$$CONVERT1^ACKQUTL4(ACKPRIM)
|
---|
157 | . S ACKCT=ACKCT+1,@ACKAPI@("PROVIDER",ACKCT,"NAME")=ACKPRIM
|
---|
158 | . S @ACKAPI@("PROVIDER",ACKCT,"PRIMARY")=1
|
---|
159 | ;
|
---|
160 | ; ----------------diagnosis------------------
|
---|
161 | N ACKPBLM,ACKPBLMP,ACKIFN,ACKPLQT
|
---|
162 | S ACKCT=0,(ACKIEN,ACKDPRIM,ACKNARR,ACKPBLM,ACKPBLMP)=""
|
---|
163 | F S ACKIEN=$O(@ACKFDA@(509850.63,ACKIEN)) Q:ACKIEN="" D
|
---|
164 | . I $P(ACKIEN,",",2)'=ACKVIEN Q
|
---|
165 | . S ACKICD9=@ACKFDA@(509850.63,ACKIEN,.01,"I")
|
---|
166 | . S ACKCT=ACKCT+1,@ACKAPI@("DX/PL",ACKCT,"DIAGNOSIS")=ACKICD9
|
---|
167 | . S ACKNARR=$$LDIAGTXT^ACKQUTL8(ACKICD9,ACKVD)
|
---|
168 | . I ACKNARR'="" S @ACKAPI@("DX/PL",ACKCT,"NARRATIVE")=ACKNARR
|
---|
169 | . ; check for updating PCE problem list flag
|
---|
170 | . S ACKPBLM=@ACKFDA@(509850.63,ACKIEN,.13,"I") I ACKPBLM D
|
---|
171 | . . ; don't send if diagnosis provider blank
|
---|
172 | . . S ACKPBLMP=@ACKFDA@(509850.63,ACKIEN,.14,"I") Q:'ACKPBLMP
|
---|
173 | . . S ACKPLQT=$$PLIST^ACKQUTL6(ACKPAT,ACKICD9)
|
---|
174 | . . ; send new problem if not on list
|
---|
175 | . . I 'ACKPLQT S @ACKAPI@("DX/PL",ACKCT,"PL ADD")=1
|
---|
176 | . . ; make existing problem active if currently inactive
|
---|
177 | . . I +ACKPLQT=1 D
|
---|
178 | . . . S @ACKAPI@("DX/PL",ACKCT,"PL IEN")=$P(ACKPLQT,U,2)
|
---|
179 | . . . S @ACKAPI@("DX/PL",ACKCT,"PL ACTIVE")="A"
|
---|
180 | . . ; send event date and encounter provider if updating list
|
---|
181 | . . I +ACKPLQT'=2 D
|
---|
182 | . . . S @ACKAPI@("DX/PL",ACKCT,"EVENT D/T")=ACKVD
|
---|
183 | . . . S ACKPBLMP=$$CONVERT1^ACKQUTL4(ACKPBLMP)
|
---|
184 | . . . S @ACKAPI@("DX/PL",ACKCT,"ENC PROVIDER")=ACKPBLMP
|
---|
185 | . ; Check for primary diagnosis
|
---|
186 | . I 'ACKDPRIM,@ACKFDA@(509850.63,ACKIEN,.12,"I")=1 D
|
---|
187 | . . S @ACKAPI@("DX/PL",ACKCT,"PRIMARY")=1
|
---|
188 | . . S ACKDPRIM=1
|
---|
189 | ; First Diagnosis sent as Primary if No Primary defined on Visit file
|
---|
190 | I 'ACKDPRIM,ACKCT>0 S @ACKAPI@("DX/PL",1,"PRIMARY")=1
|
---|
191 | ;
|
---|
192 | ; -----------------procedures----------------
|
---|
193 | S ACKCT=0,ACKIEN="",ACKPROCP=""
|
---|
194 | F S ACKIEN=$O(@ACKFDA@(509850.61,ACKIEN)) Q:ACKIEN="" D
|
---|
195 | . I $P(ACKIEN,",",2)'=ACKVIEN Q
|
---|
196 | . S ACKCPT=@ACKFDA@(509850.61,ACKIEN,.01,"I") ; CPT IEN
|
---|
197 | . S ACKVOL=@ACKFDA@(509850.61,ACKIEN,.03,"I") ; Volume
|
---|
198 | . S ACKPROCP=@ACKFDA@(509850.61,ACKIEN,.05,"I") ; Provider
|
---|
199 | . I ACKPROCP'="" S ACKPROCP=$$CONVERT1^ACKQUTL4(ACKPROCP) ; Convert from QSR to Vista
|
---|
200 | . S ACKCT=ACKCT+1,@ACKAPI@("PROCEDURE",ACKCT,"PROCEDURE")=ACKCPT
|
---|
201 | . S @ACKAPI@("PROCEDURE",ACKCT,"QTY")=$S(ACKVOL:ACKVOL,1:1)
|
---|
202 | . I ACKPROCP'="" S @ACKAPI@("PROCEDURE",ACKCT,"ENC PROVIDER")=ACKPROCP
|
---|
203 | . ; --------------procedure modifiers-------------
|
---|
204 | . S ACKIEN2=""
|
---|
205 | . F S ACKIEN2=$O(@ACKFDA@(509850.64,ACKIEN2)) Q:ACKIEN2="" D
|
---|
206 | . . I $P(ACKIEN2,",",2,3)'=$P(ACKIEN,",",1,2) Q
|
---|
207 | . . S ACKMOD=@ACKFDA@(509850.64,ACKIEN2,.01,"I")
|
---|
208 | . . S ACKMOD=$$GET1^DIQ(509850.5,ACKMOD,.01,"E")
|
---|
209 | . . I $D(@ACKAPI@("PROCEDURE",ACKCT,"MODIFIERS"))#10=0 D
|
---|
210 | . . . S @ACKAPI@("PROCEDURE",ACKCT,"MODIFIERS")=""
|
---|
211 | . . S @ACKAPI@("PROCEDURE",ACKCT,"MODIFIERS",ACKMOD)=""
|
---|
212 | ;
|
---|
213 | ; end of build
|
---|
214 | Q
|
---|
215 | ;
|
---|
216 | SENDIT ; send the data to PCE
|
---|
217 | K ACKPROB
|
---|
218 | ;
|
---|
219 | ; call the PCE package API
|
---|
220 | S ACKE=$$DATA2PCE^PXAPI($NA(^TMP("ACKQPCE1",$J,"PXAPI")),ACKPKG,ACKSRC,.ACKPCE,"",0,.ACKE2,"",.ACKPROB)
|
---|
221 | ;
|
---|
222 | ; check for returned error messages
|
---|
223 | K ACKRSN S ACKRSN=0
|
---|
224 | I $D(ACKPROB) D CONVERT^ACKQPCE2(.ACKPROB,ACKAPI,.ACKRSN)
|
---|
225 | ;
|
---|
226 | ; if update failed but no errors were returned then create a message
|
---|
227 | I ACKE'=1,'ACKRSN D
|
---|
228 | . S ACKMSG="Unable to update PCE Visit (error code="_ACKE_")"
|
---|
229 | . D ADDRSN^ACKQPCE2("PCE VISIT","","",ACKMSG,.ACKRSN)
|
---|
230 | . I ACKPCE'>0 D ; pce ien has been corrupted by the API
|
---|
231 | . . K ACKARR S ACKARR(509850.6,ACKVIEN_",",125)="@"
|
---|
232 | . . D FILE^DIE("","ACKARR","")
|
---|
233 | ;
|
---|
234 | ; if errors found then file them on the Visit file and create exception
|
---|
235 | I ACKE'=1,ACKRSN D
|
---|
236 | . D FILERSN^ACKQPCE(ACKVIEN,.ACKRSN)
|
---|
237 | . K ACKARR
|
---|
238 | . S ACKARR(509850.6,ACKVIEN_",",125)=ACKPCE ; for new visits!
|
---|
239 | . D FILE^DIE("","ACKARR","")
|
---|
240 | ;
|
---|
241 | ; if no errors update the PCE fields
|
---|
242 | I ACKE=1 D
|
---|
243 | . K ACKARR
|
---|
244 | . S ACKARR(509850.6,ACKVIEN_",",125)=ACKPCE ; for new visits!
|
---|
245 | . S ACKARR(509850.6,ACKVIEN_",",135)=ACKDATE ; date last sent
|
---|
246 | . D FILE^DIE("","ACKARR","")
|
---|
247 | . S ACKSENT=1 ; return flag (1=sent,0=not sent)
|
---|
248 | ;
|
---|
249 | ; end of sendit
|
---|
250 | Q
|
---|
251 | ;
|
---|