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