| 1 | IBCEOB00 ;ALB/ESG - 835 EDI EOB MSG PROCESSING CONT ;30-JUN-2003
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**155,349**;21-MAR-94;Build 46
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  Q
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | RCRU(IBZDATA,IB0,IBLN) ; Revenue Code Roll-up procedure check -
 | 
|---|
| 7 |  ; Total up outbound line items by revenue code and compare with
 | 
|---|
| 8 |  ; incoming EOB 40 record to see if it has been rolled up
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  ; IBZDATA - UB output formatter array, passed by reference
 | 
|---|
| 11 |  ; IB0     - 40 record data
 | 
|---|
| 12 |  ; IBLN    - output parameter, passed by reference
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  NEW Z,LN,REV,UN,CH,RUD,RUD2,UCH,MRAUCH
 | 
|---|
| 15 |  I $P(IB0,U,4)="" G RCRUX
 | 
|---|
| 16 |  S IBLN="",Z=0
 | 
|---|
| 17 |  F  S Z=$O(IBZDATA(Z)) Q:'Z  S LN=IBZDATA(Z) D
 | 
|---|
| 18 |  . S REV=$P(LN,U,1),UN=$P(LN,U,4),CH=$P(LN,U,5),UCH=+$P(LN,U,3)
 | 
|---|
| 19 |  . I REV="" Q
 | 
|---|
| 20 |  . ;
 | 
|---|
| 21 |  . S RUD=$G(RUD(REV))                 ; roll up data array for rev code
 | 
|---|
| 22 |  . S $P(RUD,U,1)=$P(RUD,U,1)+CH       ; total charges
 | 
|---|
| 23 |  . S $P(RUD,U,2)=$P(RUD,U,2)+UN       ; total units
 | 
|---|
| 24 |  . S $P(RUD,U,3)=$P(RUD,U,3)+1        ; total line items
 | 
|---|
| 25 |  . S RUD(REV)=RUD
 | 
|---|
| 26 |  . S RUD(REV,Z)=""
 | 
|---|
| 27 |  . ;
 | 
|---|
| 28 |  . S RUD2=$G(RUD2(REV,UCH))           ; roll up data array for rev code
 | 
|---|
| 29 |  . S $P(RUD2,U,1)=$P(RUD2,U,1)+CH     ; total charges
 | 
|---|
| 30 |  . S $P(RUD2,U,2)=$P(RUD2,U,2)+UN     ; total units
 | 
|---|
| 31 |  . S $P(RUD2,U,3)=$P(RUD2,U,3)+1      ; total line items
 | 
|---|
| 32 |  . S RUD2(REV,UCH)=RUD2
 | 
|---|
| 33 |  . S RUD2(REV,UCH,Z)=""
 | 
|---|
| 34 |  . ;
 | 
|---|
| 35 |  . Q
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 |  I '$D(RUD),'$D(RUD2) G RCRUX
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 |  ; delete the revenue code roll-up, if only 1 line item.
 | 
|---|
| 40 |  S REV=""     ; this is not a roll up situation
 | 
|---|
| 41 |  F  S REV=$O(RUD(REV)) Q:REV=""  I $P(RUD(REV),U,3)=1 KILL RUD(REV)
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  S (REV,UCH)=""
 | 
|---|
| 44 |  F  S REV=$O(RUD2(REV)) Q:REV=""  F  S UCH=$O(RUD2(REV,UCH)) Q:UCH=""  I $P(RUD2(REV,UCH),U,3)=1 KILL RUD2(REV,UCH)
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 |  I '$D(RUD),'$D(RUD2) G RCRUX
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 |  S RUD=$G(RUD($P(IB0,U,4)))      ; compare with 40 record data
 | 
|---|
| 49 |  I RUD="" G RCRU2                ; make sure it exists
 | 
|---|
| 50 |  I $P(RUD,U,1)'=+$$DOLLAR^IBCEOB($P(IB0,U,15)) G RCRU2    ; charges
 | 
|---|
| 51 |  I $P(RUD,U,2)'=$P(IB0,U,16) G RCRU2                      ; units
 | 
|---|
| 52 |  S IBLN=$O(RUD($P(IB0,U,4),""))  ; use the first line# found
 | 
|---|
| 53 |  G RCRUX
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 | RCRU2 ; check roll-up data by rev code and unit charge
 | 
|---|
| 56 |  S MRAUCH=0
 | 
|---|
| 57 |  I $P(IB0,U,16) S MRAUCH=+$$DOLLAR^IBCEOB($P(IB0,U,15))/$P(IB0,U,16)
 | 
|---|
| 58 |  S RUD2=$G(RUD2($P(IB0,U,4),MRAUCH))     ; compare with 40 record data
 | 
|---|
| 59 |  I RUD2="" G RCRUX                       ; make sure it exists
 | 
|---|
| 60 |  I $P(RUD2,U,1)'=+$$DOLLAR^IBCEOB($P(IB0,U,15)) G RCRUX   ; charges
 | 
|---|
| 61 |  I $P(RUD2,U,2)'=$P(IB0,U,16) G RCRUX                     ; units
 | 
|---|
| 62 |  S IBLN=$O(RUD2($P(IB0,U,4),MRAUCH,""))  ; use the first line# found
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 | RCRUX ;
 | 
|---|
| 65 |  Q
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 | ICN(IBEOB,ICN,COBN,IBOK) ; File the 835 ICN into the Bill
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ; Input parameters
 | 
|---|
| 70 |  ;   IBEOB - ien to file 361.1
 | 
|---|
| 71 |  ;   ICN   - the ICN# from the 835 transmission
 | 
|---|
| 72 |  ;   COBN  - the insurance sequence#
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  ; Output parameter
 | 
|---|
| 75 |  ;   IBOK  - returns as 0 if we get a filing error here
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  ; The field in file 399 depends on the current payer sequence
 | 
|---|
| 78 |  ;     399,453 - primary ICN
 | 
|---|
| 79 |  ;     399,454 - secondary ICN
 | 
|---|
| 80 |  ;     399,455 - tertiary ICN
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 |  NEW IBIFN,FIELD,D,D0,DA,DI,DIC,DIE,DQ,DR,X,Y
 | 
|---|
| 83 |  S IBEOB=+$G(IBEOB),COBN=+$G(COBN)
 | 
|---|
| 84 |  I 'IBEOB!'COBN G ICNX
 | 
|---|
| 85 |  S IBIFN=+$P($G(^IBM(361.1,IBEOB,0)),U,1)
 | 
|---|
| 86 |  I '$D(^DGCR(399,IBIFN)) G ICNX
 | 
|---|
| 87 |  I $G(ICN)="" G ICNX
 | 
|---|
| 88 |  I '$F(".1.2.3.","."_COBN_".") G ICNX
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 |  S FIELD=452+COBN
 | 
|---|
| 91 |  S DIE=399,DA=IBIFN,DR=FIELD_"////"_ICN D ^DIE
 | 
|---|
| 92 |  S IBOK=($D(Y)=0)
 | 
|---|
| 93 |  I 'IBOK S ^TMP(IBEGBL,$J,+$O(^TMP(IBEGBL,$J,""),-1)+1)="Error in filing the ICN into the Bill/Claims file"
 | 
|---|
| 94 | ICNX ;
 | 
|---|
| 95 |  Q
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 | 35(IB0,IBEGBL,IBEOB) ; Record '35'
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 |  N A,IBOK
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 |  S A="3;4.12;1;0;0^4;4.13;1;0;0^5;4.14;0;1;1^6;4.15;1;0;0^7;4.16;1;0;0^8;4.17;1;0;0^9;4.18;1;0;0^10;4.04;1;0;0^11;3.01;0;1;1^12;3.02;1;0;0^13;3.08;1;0;0^14;3.09;1;0;0"
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 |  S IBOK=$$STORE^IBCEOB1(A,IB0,IBEOB)
 | 
|---|
| 104 |  I 'IBOK S ^TMP(IBEGBL,$J,+$O(^TMP(IBEGBL,$J,""),-1)+1)="Bad MEDICARE Inpt Adjudication data"
 | 
|---|
| 105 | Q35 Q $G(IBOK)
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 | 37(IB0,IBEGBL,IBEOB) ; Record '37'
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 |  N IBOK,IBCT
 | 
|---|
| 110 |  S IBCT=$G(^TMP($J,37))+1
 | 
|---|
| 111 |  I IBCT>5 S ^TMP(IBEGBL,$J,+$O(^TMP(IBEGBL,$J,""),-1)+1)="Too many Medicare Claim Level Adjudication Remarks" G Q37    ; Max 5 allowed
 | 
|---|
| 112 |  S A="4;"_$S($P(IB0,U,3)="O":"3.0"_(IBCT+2),1:"5.0"_IBCT)_";0;0;0^5;5.0"_IBCT_"1;0;0;0"
 | 
|---|
| 113 |  S IBOK=$$STORE^IBCEOB1(A,IB0,IBEOB)
 | 
|---|
| 114 |  I 'IBOK S ^TMP(IBEGBL,$J,+$O(^TMP(IBEGBL,$J,""),-1)+1)="Bad Medicare Claim Level Adjudication Remarks data"
 | 
|---|
| 115 |  ;
 | 
|---|
| 116 |  ; 4/22/03 - esg - If claim level remark code MA15 is reported, then
 | 
|---|
| 117 |  ;         this is a split EOB and we need to change the REVIEW STATUS
 | 
|---|
| 118 |  ;         of this EOB to be ACCEPTED-INTERIM EOB.
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  I $P(IB0,U,4)["MA15" D
 | 
|---|
| 121 |  . N DA,DIE,DR,DIC
 | 
|---|
| 122 |  . S DA=IBEOB,DIE=361.1,DR=".16////2" D ^DIE S IBOK=($D(Y)=0)
 | 
|---|
| 123 |  . I 'IBOK S ^TMP(IBEGBL,$J,+$O(^TMP(IBEGBL,$J,""),-1)+1)="Split EOB, but review status was not updated correctly"
 | 
|---|
| 124 |  . Q
 | 
|---|
| 125 |  ;
 | 
|---|
| 126 | Q37 S ^TMP($J,37)=$G(^TMP($J,37))+1 ; Saves the # of entries for 37 records
 | 
|---|
| 127 |  Q $G(IBOK)
 | 
|---|
| 128 |  ;
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 | DET40(IB0,ARRAY) ; Format important details of record 40 for error
 | 
|---|
| 131 |  ; IB0 = data on 40 record (some pieces pre-formatted)
 | 
|---|
| 132 |  ;  ARRAY(n)=formatted line is returned if passed by ref
 | 
|---|
| 133 |  N Q
 | 
|---|
| 134 |  S ARRAY(1)="Payer reported the following was billed to them:"
 | 
|---|
| 135 |  S ARRAY(2)=" "_$S($P(IB0,U,21)="NU":"Rev Cd",1:"Proc")_": "_$S($P(IB0,U,10)'="":$P(IB0,U,10),1:"Same as adjudicated")_"  Chg: "_$J($P(IB0,U,15)/100,"",2)_"  Units: "_$S($P(IB0,U,16):$P(IB0,U,16),1:1)
 | 
|---|
| 136 |  S ARRAY(3)="  Svc Date(s): "_$S($P(IB0,U,19)'="":$$FDT($P(IB0,U,19)),1:"??")_$S($P(IB0,U,20)'="":"-"_$$FDT($P(IB0,U,20)),1:"")
 | 
|---|
| 137 |  I $P(IB0,U,11)'="" S ARRAY(3)=ARRAY(3)_"  Mods: " F Q=11:1:14 I $P(IB0,U,Q)'="" S ARRAY(3)=ARRAY(3)_$P(IB0,U,Q)_$S(Q=14:"",$P(IB0,U,Q+1)'="":",",1:"")
 | 
|---|
| 138 |  S ARRAY(4)="Payer reported adjudication on:"
 | 
|---|
| 139 |  S ARRAY(5)=" "_$S($P(IB0,U,21)="NU":"Rev Cd",1:"Proc")_": "_$S($P(IB0,U,3)'="":$P(IB0,U,3),1:$P(IB0,U,4))
 | 
|---|
| 140 |  S ARRAY(5)=ARRAY(5)_"  Type: "_$P(IB0,U,21)_$S($P(IB0,U,21)'="NU":"  Rev Cd: "_$P(IB0,U,4),1:"")_"  Units: "_$S($P(IB0,U,18):$P(IB0,U,18)/100,1:1)_"  Amt: "_$J($P(IB0,U,17)/100,"",2)
 | 
|---|
| 141 |  I $P(IB0,U,5)'="" S ARRAY(5)=ARRAY(5)_"  Mods: " F Q=5:1:8 I $P(IB0,U,Q)'="" S ARRAY(5)=ARRAY(5)_$P(IB0,U,Q)_$S(Q=8:"",$P(IB0,U,Q+1)'="":",",1:"")
 | 
|---|
| 142 |  Q
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 | DET4X(RECID,IB0,ARRAY) ; Format important details of record 41-45 for error
 | 
|---|
| 145 |  ; RECID = 41,42,45
 | 
|---|
| 146 |  ; IB0 = data on RECID record
 | 
|---|
| 147 |  ;  ARRAY(n)=formatted line is returned if passed by ref
 | 
|---|
| 148 |  N CT,Q
 | 
|---|
| 149 |  I RECID=41 D  Q
 | 
|---|
| 150 |  . S ARRAY(1)="Allowed Amt: "_$J($P(IB0,U,3)/100,"",2)_"  Per Diem Amt: "_$J($P(IB0,U,4)/100,"",2)
 | 
|---|
| 151 |  ;
 | 
|---|
| 152 |  I RECID=42 D  Q
 | 
|---|
| 153 |  . S ARRAY(1)="Line Item Remark Code: "_$P(IB0,U,3)
 | 
|---|
| 154 |  . I $P(IB0,U,4)'="" S CT=1 F Q=0:80:190 I $E($P(IB0,U,4),Q+1,Q+80)'="" S CT=CT+1,ARRAY(CT)=$E($P(IB0,U,4),Q+1,Q+80)
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 |  I RECID=45 D
 | 
|---|
| 157 |  . S ARRAY(1)="Adj Group Cd: "_$P(IB0,U,3)_"  Reason Cd: "_$P(IB0,U,4)_"  Amt: "_$J($P(IB0,U,5)/100,"",2)_"  Quantity: "_+$P(IB0,U,6)
 | 
|---|
| 158 |  . I $P(IB0,U,7)'="" S CT=1 F Q=0:80:190 I $E($P(IB0,U,7),Q+1,Q+80)'="" S CT=CT+1,ARRAY(CT)=$E($P(IB0,U,7),Q+1,Q+80)
 | 
|---|
| 159 |  Q
 | 
|---|
| 160 |  ; 
 | 
|---|
| 161 | FDT(X) ; Format date in X (YYYYMMDD) to MM/DD/YYYY
 | 
|---|
| 162 |  S:X'="" X=$E(X,5,6)_"/"_$E(X,7,8)_"/"_$E(X,1,4)
 | 
|---|
| 163 |  Q X
 | 
|---|
| 164 |  ;
 | 
|---|
| 165 | UPDNM(IBEOB,IB0,IBBULL,IBDR) ; Update name on claim if it comes back changed
 | 
|---|
| 166 |  ; IBEOB = the internal entry # of the entry in file 361.1
 | 
|---|
| 167 |  ; IB0 = the raw data returned from the 835 flat file
 | 
|---|
| 168 |  ; IBBULL = holds result of name change check in piece 1 - if name
 | 
|---|
| 169 |  ;          changed, first '^' piece is 1, 3rd '^' piece is the old
 | 
|---|
| 170 |  ;          insured's name
 | 
|---|
| 171 |  ; IBDR = returned as the updated 'DR' string with the name changed
 | 
|---|
| 172 |  ;       fields to use to update the EOB file (361.1) - pass by reference
 | 
|---|
| 173 |  ;
 | 
|---|
| 174 |  N IBCHGED,IBIFN,IBNEW,IBCOB,DIE,DR,X,Y
 | 
|---|
| 175 |  I $P(IB0,U,7) D
 | 
|---|
| 176 |  . S IBNEW=$P(IB0,U,3)_","_$P(IB0,U,4)_$S($P(IB0,U,5)'="":" "_$P(IB0,U,5),1:""),$P(IBBULL,U)=1
 | 
|---|
| 177 |  . S IBCOB=+$P($G(^IBM(361.1,IBEOB,0)),U,15)
 | 
|---|
| 178 |  . S IBIFN=+$G(^IBM(361.1,+IBEOB,0))
 | 
|---|
| 179 |  . S IB=$G(^DGCR(399,IBIFN,"I"_IBCOB))
 | 
|---|
| 180 |  . ;
 | 
|---|
| 181 |  . I IB'="",$P(IB,U,17)'=IBNEW D
 | 
|---|
| 182 |  .. ; Update the claim data only
 | 
|---|
| 183 |  .. S $P(IBBULL,U,3)=$P(IB,U,17) ; save old value
 | 
|---|
| 184 |  .. S $P(IB,U,17)=IBNEW
 | 
|---|
| 185 |  .. S DIE="^DGCR(399,",DA=IBIFN,DR="30"_IBCOB_"////"_IB
 | 
|---|
| 186 |  .. D:DA ^DIE
 | 
|---|
| 187 |  .. S IBCHGED=1
 | 
|---|
| 188 |  . S IBDR=$G(IBDR)_"6.01////"_$P(IB0,U,3)_","_$P(IB0,U,4)_" "_$P(IB0,U,5)_";"
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 |  Q $G(IBCHGED)
 | 
|---|
| 191 |  ;
 | 
|---|
| 192 | UPDID(IBEOB,IB0,IBBULL,IBDR) ; Update id # on claim and policy if it comes back
 | 
|---|
| 193 |  ;   changed
 | 
|---|
| 194 |  ; IBEOB = the internal entry # of the entry in file 361.1
 | 
|---|
| 195 |  ; IB0 = the raw data returned from the 835 flat file
 | 
|---|
| 196 |  ; IBBULL = holds result of id change check in piece 2 - if id changed,
 | 
|---|
| 197 |  ;          second '^' piece = 1,4th '^' piece is the old insured's id
 | 
|---|
| 198 |  ; IBDR = returned as the updated 'DR' string with the id changed fields
 | 
|---|
| 199 |  ;        to use to update the EOB file (361.1) - pass by reference
 | 
|---|
| 200 |  ;
 | 
|---|
| 201 |  N IBCHGED,IBNEW,IBCOB,IB,DIE,DR,DA,X,Y
 | 
|---|
| 202 |  I $P(IB0,U,8) D
 | 
|---|
| 203 |  . S IBNEW=$P(IB0,U,6),$P(IBBULL,U,2)=1
 | 
|---|
| 204 |  . S IBIFN=+$G(^IBM(361.1,+IBEOB,0))
 | 
|---|
| 205 |  . S IBCOB=+$P($G(^IBM(361.1,IBEOB,0)),U,15)
 | 
|---|
| 206 |  . S IB=$G(^DGCR(399,IBIFN,"I"_IBCOB))
 | 
|---|
| 207 |  . ;
 | 
|---|
| 208 |  . I IB'="",$P(IB,U,2)'=IBNEW D
 | 
|---|
| 209 |  .. ; Update the claim
 | 
|---|
| 210 |  .. S $P(IBBULL,U,4)=$P(IB,U,2) ; save old value
 | 
|---|
| 211 |  .. S $P(IB,U,2)=IBNEW
 | 
|---|
| 212 |  .. S DIE="^DGCR(399,",DA=IBIFN,DR="30"_IBCOB_"////"_IB D ^DIE
 | 
|---|
| 213 |  .. ;
 | 
|---|
| 214 |  .. ; Update the policy
 | 
|---|
| 215 |  .. S DA(1)=$P($G(^DGCR(399,IBIFN,0)),U,2),DA=$P($G(^("M")),U,(11+IBCOB)),DR="1////"_IBNEW,DIE="^DPT("_DA(1)_",.312,"
 | 
|---|
| 216 |  .. I DA(1),DA D ^DIE
 | 
|---|
| 217 |  .. S IBCHGED=1
 | 
|---|
| 218 |  . S IBDR=$G(IBDR)_"6.02////"_$P(IB0,U,6)_";"
 | 
|---|
| 219 |  ;
 | 
|---|
| 220 |  Q $G(IBCHGED)
 | 
|---|
| 221 |  ;
 | 
|---|