| [613] | 1 | IBCNEHL3 ;DAOU/ALA - HL7 Process Incoming RPI Continued ;03-JUL-2002  ; Compiled June 2, 2005 14:20:19
 | 
|---|
 | 2 |  ;;2.0;INTEGRATED BILLING;**300**;21-MAR-94
 | 
|---|
 | 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 |  ;**Program Description**
 | 
|---|
 | 6 |  ;  This is a continuation of IBCNEHL1 which processes an incoming
 | 
|---|
 | 7 |  ;  RPI IIV message.
 | 
|---|
 | 8 |  ;  
 | 
|---|
 | 9 |  ;  This routine is based on IBCNEHLS which was introduced with patch 184, and subsequently
 | 
|---|
 | 10 |  ;  patched with patch 271.  IBCNEHLS is obsolete and deleted with patch 300.
 | 
|---|
 | 11 |  ;
 | 
|---|
 | 12 |  Q   ; no direct calls allow
 | 
|---|
 | 13 |  ;
 | 
|---|
 | 14 | ERROR(TQN,ERACT,ERCON,TRCN) ; Entry point
 | 
|---|
 | 15 |  ; Input:  TQN - IEN for IIV Transmission Queue (#365.1), required
 | 
|---|
 | 16 |  ;         ERACT - Error Action Code (#365.14), required
 | 
|---|
 | 17 |  ;         ERCON - Error Condition Code (#365.17), required
 | 
|---|
 | 18 |  ;         TRCN - Trace # from IIV Response (#365)
 | 
|---|
 | 19 |  ;
 | 
|---|
 | 20 |  ;         IIVSTAT - IIV status transmitted by EC
 | 
|---|
 | 21 |  ;                   Note: MAP(IIVSTAT) = IIV STATUS IEN
 | 
|---|
 | 22 |  N MSG,ERDESC,ERIEN,XMY,DA,DIE,DR
 | 
|---|
 | 23 |  ;
 | 
|---|
 | 24 |  I $G(TQN)="" G ERRORX
 | 
|---|
 | 25 |  ;
 | 
|---|
 | 26 |  ; Scenarios:
 | 
|---|
 | 27 |  ; #1 - If error message = "Resubmission Allowed" OR "Please Resubmit
 | 
|---|
 | 28 |  ;  Original Transaction" - set TQ
 | 
|---|
 | 29 |  ;  Fut Trans Dt to T + Comm Failure Days and Status to "Hold"
 | 
|---|
 | 30 |  I ERACT="R"!(ERACT="P") D  G ERRORX
 | 
|---|
 | 31 |  . I $P($G(^IBCN(365.1,TQN,0)),U,9)="" D  Q    ; first time payer asked us to resubmit
 | 
|---|
 | 32 |  . . ; Update IIV TQ fields: "Hold" (4), IIV Site Param Comm Failure Days
 | 
|---|
 | 33 |  . . D UPDATE(TQN,4,+$P($G(^IBE(350.9,1,51)),U,5),ERACT)
 | 
|---|
 | 34 |  . . ;
 | 
|---|
 | 35 |  . ; payer asked us to resubmit for the 2nd time for this inquiry
 | 
|---|
 | 36 |  . ; Update IIV TQ fields: "Response Received" (3), n/a ("")
 | 
|---|
 | 37 |  . D UPDATE(TQN,3,"",ERACT,ERCON)
 | 
|---|
 | 38 |  . ; clear future transmission date so it won't display in the buffer
 | 
|---|
 | 39 |  . S DA=TQN,DIE="^IBCN(365.1,",DR=".09///@" D ^DIE
 | 
|---|
 | 40 |  ;
 | 
|---|
 | 41 |  ; #2 - If error message = "Please Wait 30 Days and Resubmit" - set TQ
 | 
|---|
 | 42 |  ;  Fut Trans Dt to T + 30 and Status to "Hold"
 | 
|---|
 | 43 |  I ERACT="W" D  G ERRORX
 | 
|---|
 | 44 |  . ; Update IIV TQ fields: "Hold" (4), 30
 | 
|---|
 | 45 |  . D UPDATE(TQN,4,30,ERACT)
 | 
|---|
 | 46 |  ;
 | 
|---|
 | 47 |  ; #3 - If error message = "Please Wait 10 Days and Resubmit" - set TQ
 | 
|---|
 | 48 |  ;  Fut Trans Dt to T + 10 and Status to "Hold"
 | 
|---|
 | 49 |  I ERACT="X" D  G ERRORX
 | 
|---|
 | 50 |  . ; Update IIV TQ fields: "Hold" (4), 10
 | 
|---|
 | 51 |  . D UPDATE(TQN,4,10,ERACT)
 | 
|---|
 | 52 |  ;
 | 
|---|
 | 53 |  ; #4 - If error message = "Resubmission Not Allowed" or
 | 
|---|
 | 54 |  ;  "Do not resubmit ...." OR "Please correct and resubmit"
 | 
|---|
 | 55 |  ;  - set TQ Status to "Response Received"
 | 
|---|
 | 56 |  ; If we receive error txt, treat as an "N"
 | 
|---|
 | 57 |  I ERACT="" S ERACT="N"
 | 
|---|
 | 58 |  I ERACT="N"!(ERACT="Y")!(ERACT="S")!(ERACT="C") D  G ERRORX
 | 
|---|
 | 59 |  . ; Update IIV TQ fields: "Response Received" (3), n/a ("")
 | 
|---|
 | 60 |  . D UPDATE(TQN,3,"",ERACT,ERCON)
 | 
|---|
 | 61 |  ;
 | 
|---|
 | 62 |  ; #5 - Error message is unfamiliar - new Error Action Code
 | 
|---|
 | 63 |  ; *** Currently processed in IBCNEHL1 ***
 | 
|---|
 | 64 |  ;
 | 
|---|
 | 65 | ERRORX ; ERROR exit pt
 | 
|---|
 | 66 |  Q
 | 
|---|
 | 67 |  ;
 | 
|---|
 | 68 | UPDATE(TQN,TSTS,TDAYS,ERACT,ERCON) ;  Update Transmission Queue (#365.1)
 | 
|---|
 | 69 |  ; Update/Create Buffer information as necessary
 | 
|---|
 | 70 |  ; * If unsolicited error or negative Verification response do not
 | 
|---|
 | 71 |  ; update TQ entry.  However, create a new Buffer entry.
 | 
|---|
 | 72 |  ; Input Variables
 | 
|---|
 | 73 |  ; ERACT,ERCON,IIVSTAT,TDAYS,TQN,TSTS
 | 
|---|
 | 74 |  ;
 | 
|---|
 | 75 |  ; Output Variables
 | 
|---|
 | 76 |  ; IIVSTAT (updated)
 | 
|---|
 | 77 |  ;
 | 
|---|
 | 78 |  ; Init optional param
 | 
|---|
 | 79 |  S ERCON=$G(ERCON)
 | 
|---|
 | 80 |  ;
 | 
|---|
 | 81 |  ; Init vars
 | 
|---|
 | 82 |  N D,D0,DA,DFN,DI,DIC,DIE,DQ,DR,FTDT,IBDATA,IBIEN,IBQFL,IBSTS,IBSYM
 | 
|---|
 | 83 |  N INSIEN,RSTYPE,SYMBOL,TQDATA,X
 | 
|---|
 | 84 |  ;
 | 
|---|
 | 85 |  ; If no ZEB segment received, set IIVSTAT to "V"
 | 
|---|
 | 86 |  I $TR(IIVSTAT," ")="" S IIVSTAT="V"
 | 
|---|
 | 87 |  ;
 | 
|---|
 | 88 |  S TQDATA=$G(^IBCN(365.1,TQN,0))
 | 
|---|
 | 89 |  I TQDATA="" G UPDATX
 | 
|---|
 | 90 |  ;
 | 
|---|
 | 91 |  ; Ins Buffer IEN
 | 
|---|
 | 92 |  S IBIEN=$P(TQDATA,U,5)
 | 
|---|
 | 93 |  S IBQFL=$P(TQDATA,U,11)
 | 
|---|
 | 94 |  S RSTYPE=$P($G(^IBCN(365,RIEN,0)),U,10)
 | 
|---|
 | 95 |  ;
 | 
|---|
 | 96 |  ; If unsolicited error or negative Identification response DON'T
 | 
|---|
 | 97 |  ; update TQ entry or Buffer (includes not creating a new buffer)
 | 
|---|
 | 98 |  I RSTYPE="U",(IBQFL="I") G UPDATX
 | 
|---|
 | 99 |  ;
 | 
|---|
 | 100 |  I RSTYPE="U" S IBIEN=""  ; makes sure a new buffer is created
 | 
|---|
 | 101 |  ;
 | 
|---|
 | 102 |  ; Ins Buffer processing
 | 
|---|
 | 103 |  I IBIEN'="" D
 | 
|---|
 | 104 |  . ; Ins Buf data
 | 
|---|
 | 105 |  . S IBDATA=$G(^IBA(355.33,+IBIEN,0))
 | 
|---|
 | 106 |  . S IBSTS=$P(IBDATA,U,4)   ; Status
 | 
|---|
 | 107 |  . S IBSYM=$P(IBDATA,U,12)  ; Symbol
 | 
|---|
 | 108 |  . ; If IB status is (A)ccepted or (R)ejected or IB symbol is "*"
 | 
|---|
 | 109 |  . ;  (verified) or IB symbol is "-" (denied), update TQ status to
 | 
|---|
 | 110 |  . ;  Resp Rec'd (3) and DON'T update the Ins Buffer symbol
 | 
|---|
 | 111 |  . I IBSTS="A"!(IBSTS="R")!(IBSYM=8)!(IBSYM=9) S TSTS=3 Q
 | 
|---|
 | 112 |  . ; If TQ status is "Hold", update buffer symbol to "?" (10)
 | 
|---|
 | 113 |  . I TSTS=4 D BUFF^IBCNEUT2(IBIEN,10) Q  ; Set buffer symbol to "?"
 | 
|---|
 | 114 |  . ; If TQ status is "Response Received", update buffer symbol to "-" (9) for Error
 | 
|---|
 | 115 |  . ; Action Codes ('N','Y','S') & Action Codes ('P','R', if 2nd time payer sent that code)
 | 
|---|
 | 116 |  . I TSTS=3,(ERACT="N"!(ERACT="Y")!(ERACT="S")!(ERACT="C")!(ERACT="P")!(ERACT="R")) D  Q
 | 
|---|
 | 117 |  .. S SYMBOL=MAP(IIVSTAT)
 | 
|---|
 | 118 |  .. D BUFF^IBCNEUT2(IBIEN,SYMBOL) ; Set buffer symbol to EC value
 | 
|---|
 | 119 |  .. D IIVPROC(IBIEN)   ; Set IIV process date & IIV status
 | 
|---|
 | 120 |  . ; If TQ status is "Response Received", update buffer symbol to "!" (12 = B9) for new Error Action Code
 | 
|---|
 | 121 |  . I TSTS=3,",W,X,R,P,C,N,Y,S,"'[(","_ERACT_",") D BUFF^IBCNEUT2(IBIEN,22) Q
 | 
|---|
 | 122 |  ;
 | 
|---|
 | 123 |  ; Non-Ins Buffer processing, create entry only for Verification queries
 | 
|---|
 | 124 |  I IBIEN="",IBQFL="V" D
 | 
|---|
 | 125 |  . ; Determine Patient DFN
 | 
|---|
 | 126 |  . S DFN=$P(TQDATA,U,2)
 | 
|---|
 | 127 |  . ; Determine Patient Ins record IEN
 | 
|---|
 | 128 |  . S INSIEN=$P(TQDATA,U,13)  ; If INSIEN="" avoids TQ update
 | 
|---|
 | 129 |  . ; If ERACT="C" symbol is passed by EC
 | 
|---|
 | 130 |  . I ERACT="C" S SYMBOL=MAP(IIVSTAT) D BUF Q
 | 
|---|
 | 131 |  . ;  Resubmission Not Allowed or Do Not Resubmit ...
 | 
|---|
 | 132 |  . I ERACT="N"!(ERACT="Y")!(ERACT="S") S SYMBOL=MAP(IIVSTAT) D BUF Q
 | 
|---|
 | 133 |  . ; An unknown error action - generate a '#'
 | 
|---|
 | 134 |  . I ",W,X,R,P,C,N,Y,S,"'[(","_ERACT_",") S SYMBOL=22 D BUF Q
 | 
|---|
 | 135 |  ;
 | 
|---|
 | 136 |  I RSTYPE="U" G UPDATX  ; finished creating new buffer
 | 
|---|
 | 137 |  ;
 | 
|---|
 | 138 |  ; Update TQ record - Status
 | 
|---|
 | 139 |  D SST^IBCNEUT2(TQN,TSTS)
 | 
|---|
 | 140 |  ;
 | 
|---|
 | 141 |  ; If TQ Status = "Hold", update TQ record - Future Transmission Date
 | 
|---|
 | 142 |  I TSTS=4,+$G(TDAYS) D
 | 
|---|
 | 143 |  . S FTDT=$$FMADD^XLFDT($$DT^XLFDT,TDAYS)
 | 
|---|
 | 144 |  . S DIE="^IBCN(365.1,",DA=TQN,DR=".09///^S X=FTDT"
 | 
|---|
 | 145 |  . D ^DIE
 | 
|---|
 | 146 |  I TSTS=4,$P(TQDATA,U,8) D
 | 
|---|
 | 147 |  . S DIE="^IBCN(365.1,",DA=TQN,DR=".08///0"
 | 
|---|
 | 148 |  . D ^DIE
 | 
|---|
 | 149 |  ;
 | 
|---|
 | 150 | UPDATX ; UPDATE exit point
 | 
|---|
 | 151 |  Q
 | 
|---|
 | 152 |  ;
 | 
|---|
 | 153 | PCK ; Payer Check
 | 
|---|
 | 154 |  ;  Find the associated Response IEN
 | 
|---|
 | 155 |  ;
 | 
|---|
 | 156 |  ; Input Variables
 | 
|---|
 | 157 |  ; MSGID
 | 
|---|
 | 158 |  ;
 | 
|---|
 | 159 |  ; Output Variables
 | 
|---|
 | 160 |  ; RIEN,ERFLG
 | 
|---|
 | 161 |  ;
 | 
|---|
 | 162 |  N BUFF,DA,DFN,DIE,DR,IEN,IERN,IN1DATA,MDTM,QFL,PAYR,PIEN,PP
 | 
|---|
 | 163 |  N PRDATA,PRIEN,RSIEN,X
 | 
|---|
 | 164 |  N NOPAYER,TQIEN
 | 
|---|
 | 165 |  ;
 | 
|---|
 | 166 |  K ^TMP("IBCNEMID",$J)
 | 
|---|
 | 167 |  D FIND^DIC(365,"","","P",MSGID,"","B","","","^TMP(""IBCNEMID"",$J)")
 | 
|---|
 | 168 |  ;
 | 
|---|
 | 169 |  S PP=0,QFL=0,(RIEN,PIEN)=""
 | 
|---|
 | 170 |  S NOPAYER=$$FIND1^DIC(365.12,,"X","~NO PAYER"),TQIEN=$O(^IBCN(365.1,"C",MSGID,""))
 | 
|---|
 | 171 |  F  S PP=$O(^TMP("IBCNEMID",$J,"DILIST",PP)) Q:'PP  D  Q:QFL
 | 
|---|
 | 172 |  . S PRIEN=$P(^TMP("IBCNEMID",$J,"DILIST",PP,0),U,1)
 | 
|---|
 | 173 |  . ;
 | 
|---|
 | 174 |  . ;  If this is a response w/o an IN1 segment
 | 
|---|
 | 175 |  . ;  Get payer IEN from TQ as original response shell will change for
 | 
|---|
 | 176 |  . ;  ~NO PAYER if a payer response is received
 | 
|---|
 | 177 |  . S IN1DATA=$$GIN1()
 | 
|---|
 | 178 |  . I IN1DATA="",PRIEN'="",TQIEN'="" D
 | 
|---|
 | 179 |  ..  S QFL=1,PIEN=$P(^IBCN(365.1,TQIEN,0),U,3)
 | 
|---|
 | 180 |  . ;
 | 
|---|
 | 181 |  . I 'PIEN D PFN(IN1DATA) I 'PIEN S QFL=1 Q
 | 
|---|
 | 182 |  . ;
 | 
|---|
 | 183 |  . ; If message id/payer found & Response (#365) status is NOT
 | 
|---|
 | 184 |  . ; 'Response Received' update the existing response entry (set RIEN)
 | 
|---|
 | 185 |  . I $P(^IBCN(365,PRIEN,0),U,3)=PIEN,($P(^IBCN(365,PRIEN,0),U,6)'=3) D  Q
 | 
|---|
 | 186 |  .. S RIEN=PRIEN,QFL=1
 | 
|---|
 | 187 |  ..;
 | 
|---|
 | 188 |  ..; If message id/payer found & Response (#365) status equals
 | 
|---|
 | 189 |  . ; 'Response Received', RIEN is still null so that this tag knows
 | 
|---|
 | 190 |  . ; to create a new unsolicited response entry
 | 
|---|
 | 191 |  . ; 
 | 
|---|
 | 192 |  . ; If payer response received to ~NO PAYER, update IIV Response file
 | 
|---|
 | 193 |  . ; w/ responding payer
 | 
|---|
 | 194 |  . I RIEN="" S PRDATA=$G(^IBCN(365,PRIEN,0)) I $P(PRDATA,U,3)=NOPAYER,$P(PRDATA,U,6)'=3,$P(PRDATA,U,10)="O" D  Q
 | 
|---|
 | 195 |  .. S RIEN=PRIEN,QFL=1
 | 
|---|
 | 196 |  .. S DIE="^IBCN(365,",DA=RIEN,DR=".03///^S X=PIEN" D ^DIE
 | 
|---|
 | 197 |  ;
 | 
|---|
 | 198 |  ;  If message id/payer not found or unsolicited response, create new response entry
 | 
|---|
 | 199 |  I RIEN="" D  Q:ERFLG
 | 
|---|
 | 200 |  . I $G(PRIEN)'="" D
 | 
|---|
 | 201 |  .. S PRDATA=$G(^IBCN(365,PRIEN,0))
 | 
|---|
 | 202 |  .. S DFN=$P(PRDATA,U,2),IEN=$P(PRDATA,U,5),MDTM=$P(PRDATA,U,8)
 | 
|---|
 | 203 |  . ;
 | 
|---|
 | 204 |  . I PIEN="" D  Q:ERFLG
 | 
|---|
 | 205 |  ..  S IN1DATA=$$GIN1()
 | 
|---|
 | 206 |  ..  I IN1DATA]"" D PFN(IN1DATA) I 'PIEN S PIEN="",QFL=1
 | 
|---|
 | 207 |  . S PAYR=PIEN,(RSTYPE,BUFF)=""
 | 
|---|
 | 208 |  . D RESP^IBCNEDEQ
 | 
|---|
 | 209 |  . S RIEN=RSIEN
 | 
|---|
 | 210 |  ;
 | 
|---|
 | 211 |  ; If no payer in response file, set it
 | 
|---|
 | 212 |  I $G(PIEN)'="",$G(RIEN)'="",$P($G(^IBCN(365,PIEN,0)),U,3)="" D
 | 
|---|
 | 213 |  . S DIE="^IBCN(365,",DA=RIEN,DR=".03///^S X=PIEN" D ^DIE
 | 
|---|
 | 214 |  Q
 | 
|---|
 | 215 |  ;
 | 
|---|
 | 216 | BUF ; Create Buffer Record if Doesn't Exist
 | 
|---|
 | 217 |  ;
 | 
|---|
 | 218 |  ; Input Variables
 | 
|---|
 | 219 |  ; RIEN,RSTYPE,TQN
 | 
|---|
 | 220 |  ;
 | 
|---|
 | 221 |  ; Output Variables
 | 
|---|
 | 222 |  ; ERROR,SYMBOL is killed,TQIEN and IRIEN may be reset
 | 
|---|
 | 223 |  ;
 | 
|---|
 | 224 |  N BUFF,IBFDA,UP
 | 
|---|
 | 225 |  I $G(RSTYPE)="U" S (TQIEN,IRIEN)=""
 | 
|---|
 | 226 |  D RP^IBCNEBF(RIEN,1)
 | 
|---|
 | 227 |  S BUFF=+IBFDA
 | 
|---|
 | 228 |  S UP(365,RIEN_",",.04)=+IBFDA
 | 
|---|
 | 229 |  I RSTYPE="O" S UP(365.1,TQN_",",.05)=+IBFDA
 | 
|---|
 | 230 |  D FILE^DIE("I","UP","ERROR")
 | 
|---|
 | 231 |  K SYMBOL
 | 
|---|
 | 232 |  Q
 | 
|---|
 | 233 |  ;
 | 
|---|
 | 234 | IIVPROC(BUFF) ; Set IIV Processed Date to current dt/tm & IIV stat (aka SYMBOL)
 | 
|---|
 | 235 |  ; Input Variables
 | 
|---|
 | 236 |  ; BUFF
 | 
|---|
 | 237 |  ;
 | 
|---|
 | 238 |  ; Output Variables
 | 
|---|
 | 239 |  ; SYMBOL
 | 
|---|
 | 240 |  ;
 | 
|---|
 | 241 |  N IDUZ,UP
 | 
|---|
 | 242 |  S UP(355.33,BUFF_",",.15)=$$NOW^XLFDT()
 | 
|---|
 | 243 |  ;  Set IDUZ to the specific, non-human user.
 | 
|---|
 | 244 |  S IDUZ=$$FIND1^DIC(200,"","X","INTERFACE,IB IIV")
 | 
|---|
 | 245 |  D FILE^DIE("I","UP","ERROR")
 | 
|---|
 | 246 |  ; set the symbol of the buffer entry
 | 
|---|
 | 247 |  D BUFF^IBCNEUT2(BUFF,SYMBOL)  ; reset symbol to appropriate value
 | 
|---|
 | 248 |  Q
 | 
|---|
 | 249 |  ;
 | 
|---|
 | 250 | PFN(IN1DATA) ;  Find Payer from HL7 msg
 | 
|---|
 | 251 |  ;
 | 
|---|
 | 252 |  ; Input Variables
 | 
|---|
 | 253 |  ; IN1DATA, TRACE
 | 
|---|
 | 254 |  ;
 | 
|---|
 | 255 |  ; Output Variables
 | 
|---|
 | 256 |  ; ERFLG,ERROR,PIEN
 | 
|---|
 | 257 |  ;
 | 
|---|
 | 258 |  N IERN,PAYRID
 | 
|---|
 | 259 |  S PAYRID=$$CLNSTR^IBCNEHLU($P($P(IN1DATA,HLFS,4),$E(HL("ECH"))),HL("ECH"),$E(HL("ECH")))
 | 
|---|
 | 260 |  S PIEN=+$$FIND1^DIC(365.12,"","MX",PAYRID)
 | 
|---|
 | 261 |  I PIEN=0 D  Q
 | 
|---|
 | 262 |  . S ERFLG=1,IERN=$$ERRN^IBCNEUT7("ERROR(""DIERR"")")
 | 
|---|
 | 263 |  . S ERROR("DIERR",IERN,"TEXT",1)="National Id: "_PAYRID_" not found in Payer Table"
 | 
|---|
 | 264 |  . S ERROR("DIERR",IERN,"TEXT",2)="for Trace Number: "_TRACE
 | 
|---|
 | 265 |  Q
 | 
|---|
 | 266 |  ;
 | 
|---|
 | 267 | GIN1() ;Get IN1 segment
 | 
|---|
 | 268 |  ;
 | 
|---|
 | 269 |  ; Input Variables
 | 
|---|
 | 270 |  ; HCT
 | 
|---|
 | 271 |  ;
 | 
|---|
 | 272 |  ; Returns value of SEGMT
 | 
|---|
 | 273 |  ;
 | 
|---|
 | 274 |  N IPCT,SEGMT
 | 
|---|
 | 275 |  S IPCT=HCT,SEGMT=""
 | 
|---|
 | 276 |  F  S IPCT=$O(^TMP($J,"IBCNEHLI",IPCT)) Q:IPCT=""  D
 | 
|---|
 | 277 |  . I $E(^TMP($J,"IBCNEHLI",IPCT,0),1,3)="IN1" S SEGMT=^TMP($J,"IBCNEHLI",IPCT,0)
 | 
|---|
 | 278 |  Q SEGMT
 | 
|---|