[613] | 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
|
---|