| 1 | IBCEOB01        ;ALB/ESG - 835 EDI EOB MSG PROCESSING CONT ;16-JAN-2008 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**377**;21-MAR-94;Build 23 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | Q | 
|---|
| 6 | ; | 
|---|
| 7 | ; This routine processes the "06" record on the incoming 835 and | 
|---|
| 8 | ; updates the patient insurance files with the corrected name and/or | 
|---|
| 9 | ; subscriber ID# data. | 
|---|
| 10 | ; | 
|---|
| 11 | UPD(IB0,IBEOB,IBIFN,DFN,SEQ)    ; update pat ins policy data | 
|---|
| 12 | ; IB0   - This is the full "06" record data | 
|---|
| 13 | ; IBEOB - ien# to file 361.1 | 
|---|
| 14 | ; IBIFN - ien# to file 399 | 
|---|
| 15 | ; DFN   - patient ien# to file 2 | 
|---|
| 16 | ; SEQ   - payer sequence number | 
|---|
| 17 | ; | 
|---|
| 18 | NEW CORRID,IBIT,IBZ,IBZ1,IDCHG,INS,MAX,NAMECHG,NNM,NNM1,PD,POL,X,MCRSFX,MCRLEN,LN | 
|---|
| 19 | ; | 
|---|
| 20 | ; patient ID# processing | 
|---|
| 21 | S IDCHG=0   ; flag indicating an ID# change | 
|---|
| 22 | S CORRID=$P(IB0,U,6)   ; corrected patient ID# | 
|---|
| 23 | S CORRID=$TR(CORRID,"-","") | 
|---|
| 24 | I CORRID'="" D | 
|---|
| 25 | . I $$VALHIC^IBCNSMM(CORRID) S IDCHG=1   ; valid HIC# | 
|---|
| 26 | . E  D MSG^IBCEOB(IBEOB,"The corrected ID# "_CORRID_" is not a valid Medicare HIC#.  No ID# correction done.") | 
|---|
| 27 | . Q | 
|---|
| 28 | ; | 
|---|
| 29 | ; corrected name processing | 
|---|
| 30 | S NAMECHG=0   ; flag indicating a name change | 
|---|
| 31 | I $P(IB0,U,3)="",$P(IB0,U,4)="",$P(IB0,U,5)="" G UPD1    ; no corrected name components indicated | 
|---|
| 32 | ; | 
|---|
| 33 | D F^IBCEF("N-CURR INSURED FULL NAME","IBZ",,IBIFN)   ; get the existing name in standard format (see CI2-2.9) | 
|---|
| 34 | I IBZ="" D MSG^IBCEOB(IBEOB,"Unable to determine the existing subscriber name.") G UPD1 | 
|---|
| 35 | S IBZ1=$$NAME^IBCEFG1(IBZ)   ; parse existing name into component pieces (see CI2-2.9) | 
|---|
| 36 | ; | 
|---|
| 37 | ; Determine if Medicare sent the suffix in the last name field | 
|---|
| 38 | S MCRSFX=""                              ; default Medicare suffix found in last name | 
|---|
| 39 | S LN=$P(IB0,U,3)                         ; last name | 
|---|
| 40 | S MCRLEN=$L(LN," ")                      ; how many " " pieces there are in the Medicare last name | 
|---|
| 41 | I MCRLEN>1 D | 
|---|
| 42 | . S MCRSFX=$$CHKSUF($P(LN," ",MCRLEN))   ; check the last piece to see if it is a common suffix | 
|---|
| 43 | . Q | 
|---|
| 44 | ; | 
|---|
| 45 | ; build new name components | 
|---|
| 46 | S NNM("FAMILY")=$S($P(IB0,U,3)'="":$P(IB0,U,3),1:$P(IBZ1,U,1)) | 
|---|
| 47 | S NNM("GIVEN")=$S($P(IB0,U,4)'="":$P(IB0,U,4),1:$P(IBZ1,U,2)) | 
|---|
| 48 | S NNM("MIDDLE")=$S($P(IB0,U,5)'="":$P(IB0,U,5),1:$P(IBZ1,U,3)) | 
|---|
| 49 | S NNM("SUFFIX")=$S(MCRSFX'="":"",1:$P(IBZ1,U,5))     ; if suffix is in the Medicare last name, blank it out here | 
|---|
| 50 | ; | 
|---|
| 51 | I NNM("FAMILY")="" D MSG^IBCEOB(IBEOB,"Last name is nil.") G UPD1 | 
|---|
| 52 | I NNM("GIVEN")="" D MSG^IBCEOB(IBEOB,"First name is nil.") G UPD1 | 
|---|
| 53 | ; | 
|---|
| 54 | K MAX D FIELD^DID(2.312,17,,"FIELD LENGTH","MAX") S MAX=$G(MAX("FIELD LENGTH")) | 
|---|
| 55 | I 'MAX D MSG^IBCEOB(IBEOB,"Unable to determine the maximum field length for 2.312,17.") G UPD1 | 
|---|
| 56 | S NNM1=$$NAMEFMT^XLFNAME(.NNM,"F","CL"_MAX)     ; construct the new name | 
|---|
| 57 | K IBIT D FIELD^DID(2.312,17,,"INPUT TRANSFORM","IBIT") S IBIT=$G(IBIT("INPUT TRANSFORM")) | 
|---|
| 58 | S X=NNM1 X IBIT        ; invoke the input transform on the field to see if it is valid | 
|---|
| 59 | I '$D(X) D MSG^IBCEOB(IBEOB,"New name '"_NNM1_"' failed the input transform for field 2.312,17.") G UPD1 | 
|---|
| 60 | ; | 
|---|
| 61 | ; at this point, all name checks have passed and we have a valid, new, corrected name in NNM1 | 
|---|
| 62 | S NAMECHG=1 | 
|---|
| 63 | ; | 
|---|
| 64 | UPD1    ; | 
|---|
| 65 | ; | 
|---|
| 66 | I 'NAMECHG,'IDCHG D MSG^IBCEOB(IBEOB,"No changes made.") G UPDX | 
|---|
| 67 | ; | 
|---|
| 68 | I NAMECHG D | 
|---|
| 69 | . N DIE,DA,DR | 
|---|
| 70 | . D MSG^IBCEOB(IBEOB,"Name corrected from "_IBZ_" to "_NNM1_".") | 
|---|
| 71 | . S DIE=361.1,DA=IBEOB,DR="6.01////^S X=NNM1" D ^DIE | 
|---|
| 72 | . Q | 
|---|
| 73 | ; | 
|---|
| 74 | I IDCHG D | 
|---|
| 75 | . N DIE,DA,DR | 
|---|
| 76 | . D MSG^IBCEOB(IBEOB,"ID# corrected from "_$$POLICY^IBCEF(IBIFN,2,SEQ)_" to "_CORRID_".") | 
|---|
| 77 | . S DIE=361.1,DA=IBEOB,DR="6.02////^S X=CORRID" D ^DIE | 
|---|
| 78 | . Q | 
|---|
| 79 | ; | 
|---|
| 80 | ; Loop thru patient policies looking to update all Medicare entries | 
|---|
| 81 | S POL=0 | 
|---|
| 82 | F  S POL=$O(^DPT(DFN,.312,POL)) Q:'POL  D | 
|---|
| 83 | . S PD=$G(^DPT(DFN,.312,POL,0))   ; policy data on the 0 node | 
|---|
| 84 | . S INS=+PD | 
|---|
| 85 | . I '$$MCRWNR^IBEFUNC(INS) Q      ; quit if ins co isn't Medicare | 
|---|
| 86 | . I IDCHG,CORRID'=$P(PD,U,2) D UPDID(DFN,POL,CORRID)   ; ID# change | 
|---|
| 87 | . I NAMECHG,NNM1'=$P(PD,U,17) D UPDNM(DFN,POL,NNM1)    ; name change | 
|---|
| 88 | . Q | 
|---|
| 89 | UPDX    ; | 
|---|
| 90 | Q | 
|---|
| 91 | ; | 
|---|
| 92 | UPDID(DFN,DA,ID)        ; update the subscriber ID# field | 
|---|
| 93 | N DR,DIE,DIC | 
|---|
| 94 | S DIE="^DPT("_DFN_",.312,",DA(1)=DFN | 
|---|
| 95 | S DR="1///^S X=ID" | 
|---|
| 96 | D ^DIE | 
|---|
| 97 | D UPDAUD(DFN,DA)           ; audit info | 
|---|
| 98 | Q | 
|---|
| 99 | ; | 
|---|
| 100 | UPDNM(DFN,DA,NM)        ; update the subscriber name field | 
|---|
| 101 | N DR,DIE,DIC | 
|---|
| 102 | S DIE="^DPT("_DFN_",.312,",DA(1)=DFN | 
|---|
| 103 | S DR="17///^S X=NM" | 
|---|
| 104 | D ^DIE | 
|---|
| 105 | D UPDAUD(DFN,DA)           ; audit info | 
|---|
| 106 | Q | 
|---|
| 107 | ; | 
|---|
| 108 | UPDAUD(DFN,DA)  ; update the audit information for this patient insurance policy | 
|---|
| 109 | N DR,DIE,DIC | 
|---|
| 110 | D UPDATPT^IBCNSP3(DFN,DA)   ; date and time last edited and by whom | 
|---|
| 111 | S DIE="^DPT("_DFN_",.312,",DA(1)=DFN | 
|---|
| 112 | S DR="1.09///MEDICARE"      ; source of information is MEDICARE | 
|---|
| 113 | D ^DIE | 
|---|
| 114 | D UPDCLM^IBCNSP1(DFN,DA)    ; update editable claims | 
|---|
| 115 | Q | 
|---|
| 116 | ; | 
|---|
| 117 | CHKSUF(X)       ; Return X if it looks like a suffix; otherwise, return null | 
|---|
| 118 | Q:"^I^II^III^IV^V^VI^VII^VIII^IX^X^JR^SR^DR^MD^ESQ^DDS^RN^"[(U_X_U) X | 
|---|
| 119 | Q:"^1ST^2ND^3RD^4TH^5TH^6TH^7TH^8TH^9TH^10TH^"[(U_X_U) X | 
|---|
| 120 | Q "" | 
|---|
| 121 | ; | 
|---|