| 1 | BPSSCRU3 ;BHAM ISC/SS - ECME SCREEN UTILITIES ;05-APR-05
 | 
|---|
| 2 |  ;;1.0;E CLAIMS MGMT ENGINE;**1,5**;JUN 2004;Build 45
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;USER SCREEN
 | 
|---|
| 5 |  Q
 | 
|---|
| 6 |  ;get comment from BPS TRANSACTION file
 | 
|---|
| 7 |  ;BP59 - ien in that file
 | 
|---|
| 8 | COMMENT(BP59) ;
 | 
|---|
| 9 |  N BPCMNT,BPX
 | 
|---|
| 10 |  S BPCMNT=$O(^BPST(BP59,11,999999),-1)
 | 
|---|
| 11 |  I BPCMNT="" Q ""
 | 
|---|
| 12 |  S BPX=$G(^BPST(BP59,11,BPCMNT,0))
 | 
|---|
| 13 |  Q $$DATTIM($P(BPX,U,1)\1)_" - "_$P(BPX,U,3)_U_$$USERNAM^BPSCMT01($P(BPX,U,2))
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 | DATTIM(X) ;Convert FM date to displayable (mm/dd/yy HH:MM) format.
 | 
|---|
| 16 |  I +X=0 W ""
 | 
|---|
| 17 |  N DATE,YR,BPT,BPM,BPH,BPAP
 | 
|---|
| 18 |  I $G(X) S YR=$E(X,2,3)
 | 
|---|
| 19 |  I $G(X) S DATE=$S(X:$E(X,4,5)_"/"_$E(X,6,7)_"/"_YR,1:"")
 | 
|---|
| 20 |  S BPT=$P(X,".",2) S:$L(BPT)<4 BPT=BPT_$E("0000",1,4-$L(BPT))
 | 
|---|
| 21 |  S BPH=$E(BPT,1,2),BPM=$E(BPT,3,4)
 | 
|---|
| 22 |  S BPAP="a" I BPH>12 S BPH=BPH-12,BPAP="p" S:$L(BPH)<2 BPH="0"_BPH
 | 
|---|
| 23 |  I BPT S:'BPH BPH=12 S DATE=DATE_" "_BPH_":"_BPM_BPAP
 | 
|---|
| 24 |  Q $G(DATE)
 | 
|---|
| 25 |  ;/**
 | 
|---|
| 26 |  ;BP59 - ptr to 9002313.59
 | 
|---|
| 27 |  ;returns the string with none, one or more than one of the following:
 | 
|---|
| 28 |  ; PB - payable
 | 
|---|
| 29 |  ; RJ - rejected
 | 
|---|
| 30 |  ; RA - reversal accepted
 | 
|---|
| 31 |  ; RR
 | 
|---|
| 32 |  ; AR - autoreversal
 | 
|---|
| 33 |  ; SR - stranded
 | 
|---|
| 34 |  ; example: "^RV^AR"
 | 
|---|
| 35 | CLAIMST(BP59,BPDESRC) ;*/
 | 
|---|
| 36 |  N BPX,BPRET,BPSTATUS
 | 
|---|
| 37 |  S BPRET="^"
 | 
|---|
| 38 |  S BPX=$$RXREF^BPSSCRU2(BP59)
 | 
|---|
| 39 |  S BPSTATUS=$$STATUS^BPSOSRX(+BPX,$P(BPX,U,2))
 | 
|---|
| 40 |  Q $P(BPSTATUS,U,1,3)
 | 
|---|
| 41 |  ;Q $P(BPSTATUS,U,1)_U_$P(BPSTATUS,U,2)_U_$P(BPSTATUS,U,3)
 | 
|---|
| 42 |  ;/**
 | 
|---|
| 43 |  ;BP59 - ptr to 9002313.59
 | 
|---|
| 44 |  ;returns the string with none, one or more tha one of the following:
 | 
|---|
| 45 |  ; PB - payable
 | 
|---|
| 46 |  ; RJ - rejected
 | 
|---|
| 47 |  ; RV - reversal
 | 
|---|
| 48 |  ; AR - autoreversal
 | 
|---|
| 49 |  ; SR - stranded
 | 
|---|
| 50 |  ; example: "^RV^AR"
 | 
|---|
| 51 | CLAIMST2(BP59) ;*/
 | 
|---|
| 52 |  N BPX,BPRET,BPSTATUS
 | 
|---|
| 53 |  S BPRET="^"
 | 
|---|
| 54 |  S BPX=$$RXREF^BPSSCRU2(BP59)
 | 
|---|
| 55 |  S BPSTATUS=$$STATUS^BPSOSRX(+BPX,$P(BPX,U,2))
 | 
|---|
| 56 |  I BPSTATUS["E REVERSAL" S BPRET=BPRET_"RV^"
 | 
|---|
| 57 |  I BPSTATUS["E PAYABLE" S BPRET=BPRET_"PB^"
 | 
|---|
| 58 |  I BPSTATUS["E REJECTED" S BPRET=BPRET_"RJ^"
 | 
|---|
| 59 |  I BPSTATUS["E STRANDED" S BPRET=BPRET_"SR^"
 | 
|---|
| 60 |  I BPSTATUS["E REVERSAL STRANDED" S BPRET=BPRET_"SR^"
 | 
|---|
| 61 |  Q BPRET
 | 
|---|
| 62 |  ;/**
 | 
|---|
| 63 |  ;pointers for RESPONSE file (#9002313.03) by pointer in TRANSACTION file #9002313.59
 | 
|---|
| 64 |  ;B59 - ptr to #9002313.59
 | 
|---|
| 65 |  ;BPRESP - ptr to #9002313.03
 | 
|---|
| 66 |  ;BPPOS - position inside #9002313.03 (i.e. the number 
 | 
|---|
| 67 |  ;of the claim in the transmission - currently we always have only 1
 | 
|---|
| 68 | GRESPPOS(BP59,BPRESP,BPPOS) ;*/
 | 
|---|
| 69 |  I $G(^BPST(BP59,4)) D  ; reversal kind of message
 | 
|---|
| 70 |  . S BPRESP=+$P(^BPST(BP59,4),U,2)
 | 
|---|
| 71 |  . S BPPOS=1
 | 
|---|
| 72 |  E  D
 | 
|---|
| 73 |  . S BPRESP=+$P($G(^BPST(BP59,0)),U,5)
 | 
|---|
| 74 |  . S BPPOS=+$P($G(^BPST(BP59,0)),U,9)
 | 
|---|
| 75 |  Q:+BPRESP=0 0
 | 
|---|
| 76 |  Q:+BPPOS=0 0
 | 
|---|
| 77 |  Q 1
 | 
|---|
| 78 |  ;
 | 
|---|
| 79 |  ;/**
 | 
|---|
| 80 |  ;reject message from RESPONSE file
 | 
|---|
| 81 |  ;BP59 - ptr to 9002313.59
 | 
|---|
| 82 |  ;BPTOP - top level index (for exmpl "504" for ^BPSR(D0,504)= (#504) Message [1F]
 | 
|---|
| 83 |  ;BPDEEP - lower level (for exmpl BPTOP=1000 and BPDEEP=525 for  
 | 
|---|
| 84 |  ;  ^BPSR(D0,1000,D1,525)= (#525) DUR Response Data [1F]
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 | GETMESS(BPTOP,BPDEEP,BP59) ;
 | 
|---|
| 87 |  N BP59DAT,BPRESP,BPPOS
 | 
|---|
| 88 |  N BP1
 | 
|---|
| 89 |  ;S (BPRESP,BPPOS)=0
 | 
|---|
| 90 |  ;get response and position in the BPS RESPONSE file
 | 
|---|
| 91 |  I $$GRESPPOS(BP59,.BPRESP,.BPPOS)=0 Q ""
 | 
|---|
| 92 |  ; -------- transmission specific message ----------
 | 
|---|
| 93 |  I BPTOP=504 Q $P($G(^BPSR(BPRESP,504)),U)
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  ; -------claim specific message-----------
 | 
|---|
| 96 |  ;assuming there is only one claim/response per transmission
 | 
|---|
| 97 |  S BP1=$O(^BPSR(BPRESP,BPTOP,0))
 | 
|---|
| 98 |  I BP1=0 Q ""
 | 
|---|
| 99 |  ;---525: DUR
 | 
|---|
| 100 |  ;---526: Additional Message Information
 | 
|---|
| 101 |  ;---504: Message for the claim
 | 
|---|
| 102 |  I (BPDEEP=525)!(BPDEEP=526)!(BPDEEP=504) Q $P($G(^BPSR(BPRESP,1000,BPPOS,BPDEEP)),U)
 | 
|---|
| 103 |  Q ""
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 |  ;reject message from RESPONSE file
 | 
|---|
| 106 |  ;BP59 - ptr to 9002313.59
 | 
|---|
| 107 |  ;BPARR1 - array to return messages (by ref)
 | 
|---|
| 108 |  ;BPN1 - index for the array (by ref - will 
 | 
|---|
| 109 |  ;  be incremented if more than one node added)
 | 
|---|
| 110 |  ;BPMLEN - max length for each string
 | 
|---|
| 111 |  ;PBPREF - for prefix string
 | 
|---|
| 112 |  ;. D GETMESS^BPSSCRU3(1000,504,BP59,.BPARR,.BPN,50)
 | 
|---|
| 113 |  ;compare GETRJCOD from BPSSCRu2
 | 
|---|
| 114 | GETRJCOD(BP59,BPARR1,BPN1,BPMLEN,PBPREF) ;
 | 
|---|
| 115 |  N BP59DAT S BP59DAT=$G(^BPST(BP59,0))
 | 
|---|
| 116 |  N BPRESP,BPPOS
 | 
|---|
| 117 |  N BPRJCOD
 | 
|---|
| 118 |  N BPRJTXT
 | 
|---|
| 119 |  N BPSTR
 | 
|---|
| 120 |  N BPRJ
 | 
|---|
| 121 |  ;pointers for RESPONSE file (#9002313.03) by pointer in TRANSACTION file #9002313.59
 | 
|---|
| 122 |  ;get response and position 
 | 
|---|
| 123 |  I $$GRESPPOS(BP59,.BPRESP,.BPPOS)=0 Q
 | 
|---|
| 124 |  S BPRJ=0
 | 
|---|
| 125 |  S BPSTR=""
 | 
|---|
| 126 |  F  S BPRJ=$O(^BPSR(BPRESP,1000,BPPOS,511,BPRJ)) Q:+BPRJ=0  D
 | 
|---|
| 127 |  . S BPRJCOD=$P($G(^BPSR(BPRESP,1000,BPPOS,511,BPRJ,0)),U)
 | 
|---|
| 128 |  . Q:$L(BPRJCOD)=0
 | 
|---|
| 129 |  . S BPRJTXT=$$GETRJNAM(BPRJCOD)
 | 
|---|
| 130 |  . S BPN1=BPN1+1,BPARR1(BPN1)=PBPREF_BPRJTXT
 | 
|---|
| 131 |  Q BPN1
 | 
|---|
| 132 |  ;/**
 | 
|---|
| 133 |  ;Input:
 | 
|---|
| 134 |  ; BP59 - pointer to file #9002313.59
 | 
|---|
| 135 |  ;Output:
 | 
|---|
| 136 |  ; BPRCODES - array for reject codes by reference
 | 
|---|
| 137 | REJCODES(BP59,BPRCODES) ;get reject codes
 | 
|---|
| 138 |  N BPRESP,BPPOS,BPA,BPR
 | 
|---|
| 139 |  ;pointers for RESPONSE file (#9002313.03) by pointer in TRANSACTION file #9002313.59
 | 
|---|
| 140 |  ;get response and position
 | 
|---|
| 141 |  I $$GRESPPOS(BP59,.BPRESP,.BPPOS)=0 Q
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  S BPA=0
 | 
|---|
| 144 |  F  S BPA=$O(^BPSR(BPRESP,1000,BPPOS,511,BPA)) Q:'BPA  D
 | 
|---|
| 145 |  . S BPR=$P(^BPSR(BPRESP,1000,BPPOS,511,BPA,0),U)
 | 
|---|
| 146 |  . I BPR'="" S BPRCODES(BPR)=""
 | 
|---|
| 147 |  Q
 | 
|---|
| 148 |  ;/**
 | 
|---|
| 149 |  ;BPRJCODE - code
 | 
|---|
| 150 | GETRJNAM(BPRJCODE) ;*/
 | 
|---|
| 151 |  N BPRJIEN
 | 
|---|
| 152 |  S BPRJIEN=$O(^BPSF(9002313.93,"B",BPRJCODE,0))
 | 
|---|
| 153 |  Q:+BPRJIEN=0 ""
 | 
|---|
| 154 |  Q BPRJCODE_":"_$P($G(^BPSF(9002313.93,BPRJIEN,0)),U,2)
 | 
|---|
| 155 |  ;/**
 | 
|---|
| 156 |  ;BP59 - ptr to 9002313.59
 | 
|---|
| 157 |  ;was the claim ever autoreversed ?
 | 
|---|
| 158 | AUTOREV(BP59) ;*/
 | 
|---|
| 159 |  N BP02
 | 
|---|
| 160 |  S BP02=+$P($G(^BPST(BP59,0)),U,4)
 | 
|---|
| 161 |  Q +$P($G(^BPSC(BP02,0)),U,7)
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  ;/**
 | 
|---|
| 164 |  ;BP59 - ptr to 9002313.59
 | 
|---|
| 165 |  ;returns :
 | 
|---|
| 166 |  ;0 Waiting to start
 | 
|---|
| 167 |  ;10 Gathering claim info
 | 
|---|
| 168 |  ;19 Special Grouping
 | 
|---|
| 169 |  ;30 Waiting for packet build
 | 
|---|
| 170 |  ;31 Wait for retry (insurer asleep)
 | 
|---|
| 171 |  ;40 Packet being built
 | 
|---|
| 172 |  ;50 Waiting for transmit
 | 
|---|
| 173 |  ;51 Wait for retry (comms error)
 | 
|---|
| 174 |  ;60 Transmitting
 | 
|---|
| 175 |  ;70 Receiving Response
 | 
|---|
| 176 |  ;80 Waiting to process response
 | 
|---|
| 177 |  ;90 Processing response
 | 
|---|
| 178 |  ;99 Done
 | 
|---|
| 179 |  ;
 | 
|---|
| 180 | PRCNTG(BP59) ;*/
 | 
|---|
| 181 |  Q +$P($G(^BPST(BP59,0)),U,2)
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 | LINE(BPN,BPCH) ;
 | 
|---|
| 185 |  N BP1
 | 
|---|
| 186 |  S $P(BP1,BPCH,BPN+1)=""
 | 
|---|
| 187 |  Q BP1
 | 
|---|
| 188 |  ;
 | 
|---|
| 189 | DTTIME(X) ;Convert FM date to displayable (mm/dd/yy HH:MM) format.
 | 
|---|
| 190 |  I +X=0 W ""
 | 
|---|
| 191 |  N DATE,YR,BPT,BPM,BPH,BPAP,BPS
 | 
|---|
| 192 |  I $G(X) S YR=$E(X,1,3)+1700
 | 
|---|
| 193 |  I $G(X) S DATE=$S(X:$E(X,4,5)_"/"_$E(X,6,7)_"/"_YR,1:"")
 | 
|---|
| 194 |  S BPT=$P(X,".",2)
 | 
|---|
| 195 |  I BPT S:$L(BPT)<6 BPT=BPT_$E("000000",1,6-$L(BPT))
 | 
|---|
| 196 |  S BPH=$E(BPT,1,2),BPM=$E(BPT,3,4),BPS=$E(BPT,5,6)
 | 
|---|
| 197 |  I BPT S DATE=DATE_"@"_BPH_":"_BPM_":"_BPS
 | 
|---|
| 198 |  Q $G(DATE)
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 |  ;call IB API to get insurance data, then select proper insurance by its name
 | 
|---|
| 201 |  ;get its phone number
 | 
|---|
| 202 |  ;input: 
 | 
|---|
| 203 |  ; DFN - patient IEN in #2
 | 
|---|
| 204 |  ; BPDOS - date of service
 | 
|---|
| 205 |  ; BPINSNM - insurance name
 | 
|---|
| 206 |  ;output: insurance ien^insurance name^phone
 | 
|---|
| 207 | GETPHONE(BPDFN,BPDOS,BPINSNM) ;
 | 
|---|
| 208 |  N BPX,BPZZ,BP1,BPPHONE
 | 
|---|
| 209 |  S BPPHONE=""
 | 
|---|
| 210 |  I $$INSUR^IBBAPI(BPDFN,BPDOS,,.BPZZ,"1,6")'=1 Q ""
 | 
|---|
| 211 |  S BP1="" F  S BP1=$O(BPZZ("IBBAPI","INSUR",BP1)) Q:+BP1=0  D
 | 
|---|
| 212 |  . I BPINSNM=$P($G(BPZZ("IBBAPI","INSUR",BP1,1)),U,2) S BPPHONE=$G(BPZZ("IBBAPI","INSUR",BP1,6)) Q
 | 
|---|
| 213 |  Q BPPHONE
 | 
|---|
| 214 |  ;
 | 
|---|
| 215 |  ;try to get insurance name and phone from #9002313.59, #9002313.57 and from INSUR^IBBAPI 
 | 
|---|
| 216 |  ;input: BP59 - ien in #9002313.59
 | 
|---|
| 217 |  ;return insurance_name^phone#
 | 
|---|
| 218 | NAMEPHON(BP59) ;
 | 
|---|
| 219 |  N BPHONE,BPINSNM,BPINSID,BP57,BPINSN
 | 
|---|
| 220 |  S BPHONE=$P($G(^BPST(BP59,10,+$G(^BPST(BP59,9)),3)),U,2)
 | 
|---|
| 221 |  S BPINSNM=$P($G(^BPST(BP59,10,+$G(^BPST(BP59,9)),0)),U,7)
 | 
|---|
| 222 |  S BP57=0
 | 
|---|
| 223 |  F  Q:(BPHONE'="")&(BPINSNM'="")  S BP57=$O(^BPSTL("B",BP59,BP57)) Q:+BP57=0  D
 | 
|---|
| 224 |  . S BPINSN=+$G(^BPSTL(BP57,9))
 | 
|---|
| 225 |  . S:BPHONE="" BPHONE=$P($G(^BPSTL(BP57,10,BPINSN,3)),U,2)
 | 
|---|
| 226 |  . S:BPINSNM="" BPINSNM=$P($G(^BPSTL(BP57,10,BPINSN,0)),U,7)
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  I (BPINSNM'="")&(BPHONE="") D
 | 
|---|
| 229 |  . S BPDOS=+$P($G(^BPST(BP59,12)),U,2)\1
 | 
|---|
| 230 |  . I BPDOS=0 S BPDOS=+$P($G(^BPST(BP59,0)),U,8)\1
 | 
|---|
| 231 |  . S BPDFN=+$P($G(^BPST(BP59,0)),U,6)
 | 
|---|
| 232 |  . S BPHONE=$$GETPHONE(BPDFN,BPDOS,BPINSNM)
 | 
|---|
| 233 |  Q BPINSNM_U_BPHONE
 | 
|---|
| 234 |  ;
 | 
|---|