[613] | 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 | ;
|
---|