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