1 | BPSECMPS ;BHAM ISC/FCS/DRS - Parse Claim Response ;06/15/2004
|
---|
2 | ;;1.0;E CLAIMS MGMT ENGINE;**1,2,5**;JUN 2004;Build 45
|
---|
3 | ;;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | PARSE(RREC,CLAIMIEN,RESPIEN) ;
|
---|
6 | N GS,FS,SS,FILE,ROOT,TRANSACT,TRANSCNT
|
---|
7 | N FDATA,FDAIEN,FDAIEN03
|
---|
8 | ;
|
---|
9 | ;Make sure input variables are defined
|
---|
10 | Q:$G(RREC)=""
|
---|
11 | Q:$G(CLAIMIEN)=""
|
---|
12 | ;
|
---|
13 | ;group and field separator characters
|
---|
14 | S GS="\X1D\",FS="\X1C\",SS="\X1E\"
|
---|
15 | S FILE="9002313.03"
|
---|
16 | S ROOT="FDATA(9002313.03)"
|
---|
17 | D TRANSMSN ;process the transmission level data
|
---|
18 | D TRANSACT ;process the transaction level data
|
---|
19 | ;
|
---|
20 | ; If the test payer routine exists, call the override routine
|
---|
21 | ; IEN59 and TRANTYPE are set in BPSECMC2
|
---|
22 | ; Commented for production. MUST be commented out for any release.
|
---|
23 | ;I $L($T(CHECK^ZZGIZOV1))>0,$$CHECK^ZZGIZOV1 D SETOVER^ZZGIZOV1(IEN59,TRANTYPE,.FDATA)
|
---|
24 | D UPDATE^DIE("S","FDATA(9002313.03)","FDAIEN")
|
---|
25 | F TRANSACT=1:1:TRANSCNT D
|
---|
26 | .D PROCRESP
|
---|
27 | .D PROCREJ
|
---|
28 | .D PROCAPP
|
---|
29 | .D PROCPPR
|
---|
30 | .D PROCOTH^BPSECMP2
|
---|
31 | .D PROCDUR^BPSECMP2
|
---|
32 | .S RESPIEN=FDAIEN(TRANSACT)
|
---|
33 | .D IBSEND^BPSECMP2(CLAIMIEN,RESPIEN,"","")
|
---|
34 | Q
|
---|
35 | ;
|
---|
36 | TRANSMSN ;This subroutine will work through the transmission level information
|
---|
37 | ;
|
---|
38 | N RTRANM,RHEADER,SEG,SEGMENT,SEGID
|
---|
39 | ;
|
---|
40 | ;Parse response transmission level from ascii record
|
---|
41 | S RTRANM=$P(RREC,GS,1)
|
---|
42 | ;
|
---|
43 | ; get just the header segment
|
---|
44 | S RHEADER=$P(RTRANM,SS,1) ;header- required/fixed length
|
---|
45 | D PARSEH
|
---|
46 | ;
|
---|
47 | ; There are 2 optional segments on the transmission level - message
|
---|
48 | ; and insurance. We'll check for both and parse what we find.
|
---|
49 | F SEG=2:1:3 D
|
---|
50 | . S SEGMENT=$P(RTRANM,SS,SEG)
|
---|
51 | . Q:SEGMENT=""
|
---|
52 | . S SEGID=$P(SEGMENT,FS,2)
|
---|
53 | . I $E(SEGID,1,2)="AM" D ;segment identification
|
---|
54 | .. S SEGFID=$E(SEGID,3,4)
|
---|
55 | .. D:(SEGFID=20)!(SEGFID=25) PARSETM
|
---|
56 | ;
|
---|
57 | Q
|
---|
58 | ;
|
---|
59 | TRANSACT ;This subroutine will work through the transaction level information
|
---|
60 | ;
|
---|
61 | N RTRAN,SEG,SEGMENT,MEDN,GRP
|
---|
62 | S MEDN=0
|
---|
63 | ;
|
---|
64 | F GRP=2:1 D Q:RTRAN=""
|
---|
65 | . S RTRAN=$P(RREC,GS,GRP) ;get the next transaction (could be 4)
|
---|
66 | . Q:RTRAN="" ;we're done if it's empty
|
---|
67 | . S MEDN=MEDN+1 ;transaction counter
|
---|
68 | . ;
|
---|
69 | . F SEG=2:1 D Q:SEGMENT="" ;break the record down by segments
|
---|
70 | .. S SEGMENT=$P(RTRAN,SS,SEG) ;get the segment
|
---|
71 | .. Q:SEGMENT=""
|
---|
72 | .. D PARSETN ;get the fields
|
---|
73 | Q
|
---|
74 | ;
|
---|
75 | PARSEH ; The header record is required on all responses, and is fixed
|
---|
76 | ; length. It is the only record that is fixed length.
|
---|
77 | ;
|
---|
78 | N FIELD,%,%H,%I
|
---|
79 | S FIELD=".01" D FDA^DILF(FILE,"+1",FIELD,"",CLAIMIEN,ROOT)
|
---|
80 | D NOW^%DTC
|
---|
81 | S FIELD=".02" D FDA^DILF(FILE,"+1",FIELD,"",%,ROOT)
|
---|
82 | S FIELD=".03" D FDA^DILF(FILE,"+1",FIELD,"",$H,ROOT)
|
---|
83 | S FIELD=102 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,33,34),ROOT) ;version/release number
|
---|
84 | S FIELD=103 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,35,36),ROOT) ;transaction code
|
---|
85 | S FIELD=109 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,37,37),ROOT) ;transaction count
|
---|
86 | S TRANSCNT=$E(RHEADER,37,37)
|
---|
87 | S FIELD=501 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,38,38),ROOT) ;response status header
|
---|
88 | S FIELD=202 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,39,40),ROOT) ;service provider id qualifier
|
---|
89 | S FIELD=201 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,41,55),ROOT) ;service provider id
|
---|
90 | S FIELD=401 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,56,63),ROOT) ;date of service
|
---|
91 | Q
|
---|
92 | ;
|
---|
93 | PARSETM ; This subroutine will parse the variable portions of the transmission
|
---|
94 | ;
|
---|
95 | N FIELD,PC,FLDNUM
|
---|
96 | ;
|
---|
97 | F PC=3:1 D Q:FIELD="" ;skip the seg id -already know its value
|
---|
98 | . S FIELD=$P(SEGMENT,FS,PC) ;piece through the record
|
---|
99 | . Q:FIELD="" ;stop - we hit the end
|
---|
100 | . S FLDNUM=$$GETNUM(FIELD) ;get the field number used for storage
|
---|
101 | . Q:FLDNUM="" ;shouldn't happen - but lets skip
|
---|
102 | . S FIELD=$E(FIELD,3,999)
|
---|
103 | . D FDA^DILF(FILE,"+1",FLDNUM,"",FIELD,ROOT)
|
---|
104 | Q
|
---|
105 | ;
|
---|
106 | PARSETN ; This subroutine will parse the transaction level segments. For
|
---|
107 | ;
|
---|
108 | ; Possible values of the SEGFID field:
|
---|
109 | ; 21 = Response Status Segment
|
---|
110 | ; 22 = Response Claim Segment
|
---|
111 | ; 23 = Response Pricing Segment
|
---|
112 | ; 24 = Response DUR/PPS Segment
|
---|
113 | ; 26 = Response Prior Authorization Segment
|
---|
114 | ;
|
---|
115 | N FIELD,PC,FLDNUM,RPTFLD,RCNT,REPEAT
|
---|
116 | N SEGID,SEGFID,CKRPT
|
---|
117 | ;
|
---|
118 | S RPTFLD=""
|
---|
119 | S SEGID=$P(SEGMENT,FS,2) ;this should be the segment id
|
---|
120 | Q:SEGID="" ;don't process without a Seg id
|
---|
121 | Q:$E(SEGID,1,2)'="AM" ;don't know what we have - skip
|
---|
122 | ;
|
---|
123 | S SEGFID=$E(SEGID,3,4) ;this should be the field ID
|
---|
124 | ;
|
---|
125 | ; setup the repeating flds based on the segment
|
---|
126 | I SEGFID=21 D ;status segment
|
---|
127 | . S RPTFLD=",548,511,546,"
|
---|
128 | . S (RCNT(548),RCNT(511),RCNT(546))=0
|
---|
129 | ;
|
---|
130 | I SEGFID=22 D ;claim segment
|
---|
131 | . S RPTFLD=",552,553,554,555,556,"
|
---|
132 | . S (RCNT(552),RCNT(553),RCNT(554),RCNT(555),RCNT(556))=0
|
---|
133 | ;
|
---|
134 | I SEGFID=23 D ;pricing segment
|
---|
135 | . S RPTFLD=",564,565,"
|
---|
136 | . S (RCNT(564),RCNT(565))=0
|
---|
137 | ;
|
---|
138 | I SEGFID=24 D ;DUR/PPS segment
|
---|
139 | . S RPTFLD=",439,528,529,530,531,532,533,9002313,544,567,"
|
---|
140 | . S (RCNT(439),RCNT(528),RCNT(529),RCNT(530),RCNT(531))=0
|
---|
141 | . S (RCNT(532),RCNT(533),RCNT(9002313),RCNT(567))=0,RCNT(544)=0
|
---|
142 | ;
|
---|
143 | ; now lets parse out the fields
|
---|
144 | ;
|
---|
145 | F PC=3:1 D Q:FIELD="" ;skip the seg id -jump to the other flds
|
---|
146 | . S FIELD=$P(SEGMENT,FS,PC) ;piece through the record
|
---|
147 | . Q:FIELD="" ;stop - we hit the end
|
---|
148 | . S FLDNUM=$$GETNUM(FIELD) ;get the field number used for storage
|
---|
149 | . Q:FLDNUM="" ;shouldn't happen - but lets skip
|
---|
150 | . S REPEAT=0 ;for this segment, lets figure
|
---|
151 | . S CKRPT=","_FLDNUM_"," ;out if the field is a repeating
|
---|
152 | . S:RPTFLD[CKRPT REPEAT=1 ;field
|
---|
153 | . ;
|
---|
154 | . I REPEAT D ;if rptg, store with a counter
|
---|
155 | .. S RCNT(FLDNUM)=$G(RCNT(FLDNUM))+1
|
---|
156 | .. S FDATA(MEDN,FLDNUM,RCNT(FLDNUM))=$E(FIELD,3,$L(FIELD))
|
---|
157 | . ;
|
---|
158 | . I 'REPEAT D ;not rptg, store without counter
|
---|
159 | .. S FDATA(MEDN,FLDNUM)=$E(FIELD,3,$L(FIELD))
|
---|
160 | Q
|
---|
161 | ;
|
---|
162 | GETNUM(FIELD) ; This routine will translate the field ID into a field number.
|
---|
163 | ; We will use the NCPDP field Defs files, cross ref "D" to
|
---|
164 | ; perform this translation. (The field number is needed to store
|
---|
165 | ; the data in the correct field within the response file.)
|
---|
166 | ;
|
---|
167 | N FLDID,FLDIEN,FLDNUM
|
---|
168 | S (FLDID,FLDNUM)=""
|
---|
169 | S FLDIEN=0
|
---|
170 | ;
|
---|
171 | S FLDID=$E(FIELD,1,2) ;field identifier
|
---|
172 | Q:FLDID=""
|
---|
173 | ;
|
---|
174 | I FLDID'="" D
|
---|
175 | . S FLDIEN=$O(^BPSF(9002313.91,"D",FLDID,FLDIEN)) ;internal fld #
|
---|
176 | . S:FLDIEN FLDNUM=$P($G(^BPSF(9002313.91,FLDIEN,0)),U) ;fld number
|
---|
177 | Q FLDNUM
|
---|
178 | ;
|
---|
179 | PROCRESP ;
|
---|
180 | N FILE,ROOT,FDATA03,FLDNUM,FIELD
|
---|
181 | S FILE="9002313.0301"
|
---|
182 | S ROOT="FDATA03(9002313.0301)"
|
---|
183 | K FDATA03
|
---|
184 | I '$D(FDATA(TRANSACT,501)) S FDATA(TRANSACT,501)=FDATA(TRANSACT,112)
|
---|
185 | I '$D(FDATA(TRANSACT,112)) S FDATA(TRANSACT,112)=FDATA(TRANSACT,501)
|
---|
186 | S FLDNUM=".01" D FDA^DILF(FILE,"+1,"_FDAIEN(TRANSACT),FLDNUM,"",TRANSACT,ROOT)
|
---|
187 | S FIELD=""
|
---|
188 | F S FIELD=$O(FDATA(TRANSACT,FIELD)) Q:FIELD="" D ;set all the non-repeating fields for 9002313.0301
|
---|
189 | .I $G(FDATA(TRANSACT,FIELD))'="" D
|
---|
190 | ..I FIELD=402 S FDATA(TRANSACT,FIELD)=$TR(FDATA(TRANSACT,FIELD),"\","") ;REMOVE EXTRANEOUS "\"
|
---|
191 | ..D FDA^DILF(FILE,"+"_TRANSACT_","_FDAIEN(TRANSACT),FIELD,"",FDATA(TRANSACT,FIELD),ROOT)
|
---|
192 | .E D
|
---|
193 | ..;
|
---|
194 | D UPDATE^DIE("S","FDATA03(9002313.0301)","FDAIEN03")
|
---|
195 | Q
|
---|
196 | ;
|
---|
197 | PROCREJ ;
|
---|
198 | Q:$G(FDATA(TRANSACT,510))=""
|
---|
199 | N FILE,ROOT,FLDNUM,FDAT3511,NUMREJS,NNDX
|
---|
200 | S FILE="9002313.03511"
|
---|
201 | S ROOT="FDAT3511(9002313.03511)"
|
---|
202 | S NUMREJS=FDATA(TRANSACT,510)
|
---|
203 | S NNDX=""
|
---|
204 | F S NNDX=$O(FDATA(TRANSACT,511,NNDX)) Q:NNDX="" D ;set all the non-repeating fields for 9002313.3511 rejections
|
---|
205 | .S FDATA(TRANSACT,511,NNDX)=$TR(FDATA(TRANSACT,511,NNDX),"\","")
|
---|
206 | .S FLDNUM=".01" D FDA^DILF(FILE,"+"_NNDX_","_FDAIEN03(TRANSACT)_","_FDAIEN(TRANSACT),FLDNUM,"",FDATA(TRANSACT,511,NNDX),ROOT)
|
---|
207 | D UPDATE^DIE("S","FDAT3511(9002313.03511)")
|
---|
208 | Q
|
---|
209 | ;
|
---|
210 | PROCAPP ;
|
---|
211 | Q:$G(FDATA(TRANSACT,548,1))=""
|
---|
212 | N FILE,ROOT,FLDNUM,FDAT1548,NNDX
|
---|
213 | S FILE="9002313.301548"
|
---|
214 | S ROOT="FDAT1548(9002313.0301548)"
|
---|
215 | S NNDX=""
|
---|
216 | F S NNDX=$O(FDATA(FDAIEN(TRANSACT),548,NNDX)) Q:NNDX="" D
|
---|
217 | .S FLDNUM=".01" D FDA^DILF(FILE,"+"_NNDX_","_FDAIEN03(TRANSACT)_","_FDAIEN(TRANSACT),FLDNUM,"",FDATA(TRANSACT,548,NNDX),ROOT)
|
---|
218 | D UPDATE^DIE("S","FDAT1548(9002313.301548)")
|
---|
219 | Q
|
---|
220 | ;
|
---|
221 | PROCPPR ;
|
---|
222 | Q:$G(FDATA(TRANSACT,551.01,1))=""
|
---|
223 | N FILE,ROOT,FLDNUM,FDAT1301,NNDX
|
---|
224 | S FILE="9002313.1301"
|
---|
225 | S ROOT="FDAT1301(9002313.1301)"
|
---|
226 | S NNDX=""
|
---|
227 | F S NNDX=$O(FDATA(FDAIEN(TRANSACT),551.01,NNDX)) Q:NNDX="" D
|
---|
228 | .S FLDNUM=".01" D FDA^DILF(FILE,"+"_NNDX_","_FDAIEN03(TRANSACT)_","_FDAIEN(TRANSACT),FLDNUM,"",FDATA(TRANSACT,551.01,NNDX),ROOT)
|
---|
229 | D UPDATE^DIE("S","FDAT1301(9002313.1301)")
|
---|
230 | Q
|
---|