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