BPSECMPS ;BHAM ISC/FCS/DRS - Parse Claim Response ;06/15/2004 ;;1.0;E CLAIMS MGMT ENGINE;**1,2,5**;JUN 2004;Build 45 ;;Per VHA Directive 2004-038, this routine should not be modified. ; PARSE(RREC,CLAIMIEN,RESPIEN) ; N GS,FS,SS,FILE,ROOT,TRANSACT,TRANSCNT N FDATA,FDAIEN,FDAIEN03 ; ;Make sure input variables are defined Q:$G(RREC)="" Q:$G(CLAIMIEN)="" ; ;group and field separator characters S GS="\X1D\",FS="\X1C\",SS="\X1E\" S FILE="9002313.03" S ROOT="FDATA(9002313.03)" D TRANSMSN ;process the transmission level data D TRANSACT ;process the transaction level data ; ; If the test payer routine exists, call the override routine ; IEN59 and TRANTYPE are set in BPSECMC2 ; Commented for production. MUST be commented out for any release. ;I $L($T(CHECK^ZZGIZOV1))>0,$$CHECK^ZZGIZOV1 D SETOVER^ZZGIZOV1(IEN59,TRANTYPE,.FDATA) D UPDATE^DIE("S","FDATA(9002313.03)","FDAIEN") F TRANSACT=1:1:TRANSCNT D .D PROCRESP .D PROCREJ .D PROCAPP .D PROCPPR .D PROCOTH^BPSECMP2 .D PROCDUR^BPSECMP2 .S RESPIEN=FDAIEN(TRANSACT) .D IBSEND^BPSECMP2(CLAIMIEN,RESPIEN,"","") Q ; TRANSMSN ;This subroutine will work through the transmission level information ; N RTRANM,RHEADER,SEG,SEGMENT,SEGID ; ;Parse response transmission level from ascii record S RTRANM=$P(RREC,GS,1) ; ; get just the header segment S RHEADER=$P(RTRANM,SS,1) ;header- required/fixed length D PARSEH ; ; There are 2 optional segments on the transmission level - message ; and insurance. We'll check for both and parse what we find. F SEG=2:1:3 D . S SEGMENT=$P(RTRANM,SS,SEG) . Q:SEGMENT="" . S SEGID=$P(SEGMENT,FS,2) . I $E(SEGID,1,2)="AM" D ;segment identification .. S SEGFID=$E(SEGID,3,4) .. D:(SEGFID=20)!(SEGFID=25) PARSETM ; Q ; TRANSACT ;This subroutine will work through the transaction level information ; N RTRAN,SEG,SEGMENT,MEDN,GRP S MEDN=0 ; F GRP=2:1 D Q:RTRAN="" . S RTRAN=$P(RREC,GS,GRP) ;get the next transaction (could be 4) . Q:RTRAN="" ;we're done if it's empty . S MEDN=MEDN+1 ;transaction counter . ; . F SEG=2:1 D Q:SEGMENT="" ;break the record down by segments .. S SEGMENT=$P(RTRAN,SS,SEG) ;get the segment .. Q:SEGMENT="" .. D PARSETN ;get the fields Q ; PARSEH ; The header record is required on all responses, and is fixed ; length. It is the only record that is fixed length. ; N FIELD,%,%H,%I S FIELD=".01" D FDA^DILF(FILE,"+1",FIELD,"",CLAIMIEN,ROOT) D NOW^%DTC S FIELD=".02" D FDA^DILF(FILE,"+1",FIELD,"",%,ROOT) S FIELD=".03" D FDA^DILF(FILE,"+1",FIELD,"",$H,ROOT) S FIELD=102 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,33,34),ROOT) ;version/release number S FIELD=103 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,35,36),ROOT) ;transaction code S FIELD=109 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,37,37),ROOT) ;transaction count S TRANSCNT=$E(RHEADER,37,37) S FIELD=501 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,38,38),ROOT) ;response status header S FIELD=202 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,39,40),ROOT) ;service provider id qualifier S FIELD=201 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,41,55),ROOT) ;service provider id S FIELD=401 D FDA^DILF(FILE,"+1",FIELD,"",$E(RHEADER,56,63),ROOT) ;date of service Q ; PARSETM ; This subroutine will parse the variable portions of the transmission ; N FIELD,PC,FLDNUM ; F PC=3:1 D Q:FIELD="" ;skip the seg id -already know its value . S FIELD=$P(SEGMENT,FS,PC) ;piece through the record . Q:FIELD="" ;stop - we hit the end . S FLDNUM=$$GETNUM(FIELD) ;get the field number used for storage . Q:FLDNUM="" ;shouldn't happen - but lets skip . S FIELD=$E(FIELD,3,999) . D FDA^DILF(FILE,"+1",FLDNUM,"",FIELD,ROOT) Q ; PARSETN ; This subroutine will parse the transaction level segments. For ; ; Possible values of the SEGFID field: ; 21 = Response Status Segment ; 22 = Response Claim Segment ; 23 = Response Pricing Segment ; 24 = Response DUR/PPS Segment ; 26 = Response Prior Authorization Segment ; N FIELD,PC,FLDNUM,RPTFLD,RCNT,REPEAT N SEGID,SEGFID,CKRPT ; S RPTFLD="" S SEGID=$P(SEGMENT,FS,2) ;this should be the segment id Q:SEGID="" ;don't process without a Seg id Q:$E(SEGID,1,2)'="AM" ;don't know what we have - skip ; S SEGFID=$E(SEGID,3,4) ;this should be the field ID ; ; setup the repeating flds based on the segment I SEGFID=21 D ;status segment . S RPTFLD=",548,511,546," . S (RCNT(548),RCNT(511),RCNT(546))=0 ; I SEGFID=22 D ;claim segment . S RPTFLD=",552,553,554,555,556," . S (RCNT(552),RCNT(553),RCNT(554),RCNT(555),RCNT(556))=0 ; I SEGFID=23 D ;pricing segment . S RPTFLD=",564,565," . S (RCNT(564),RCNT(565))=0 ; I SEGFID=24 D ;DUR/PPS segment . S RPTFLD=",439,528,529,530,531,532,533,9002313,544,567," . S (RCNT(439),RCNT(528),RCNT(529),RCNT(530),RCNT(531))=0 . S (RCNT(532),RCNT(533),RCNT(9002313),RCNT(567))=0,RCNT(544)=0 ; ; now lets parse out the fields ; F PC=3:1 D Q:FIELD="" ;skip the seg id -jump to the other flds . S FIELD=$P(SEGMENT,FS,PC) ;piece through the record . Q:FIELD="" ;stop - we hit the end . S FLDNUM=$$GETNUM(FIELD) ;get the field number used for storage . Q:FLDNUM="" ;shouldn't happen - but lets skip . S REPEAT=0 ;for this segment, lets figure . S CKRPT=","_FLDNUM_"," ;out if the field is a repeating . S:RPTFLD[CKRPT REPEAT=1 ;field . ; . I REPEAT D ;if rptg, store with a counter .. S RCNT(FLDNUM)=$G(RCNT(FLDNUM))+1 .. S FDATA(MEDN,FLDNUM,RCNT(FLDNUM))=$E(FIELD,3,$L(FIELD)) . ; . I 'REPEAT D ;not rptg, store without counter .. S FDATA(MEDN,FLDNUM)=$E(FIELD,3,$L(FIELD)) Q ; GETNUM(FIELD) ; This routine will translate the field ID into a field number. ; We will use the NCPDP field Defs files, cross ref "D" to ; perform this translation. (The field number is needed to store ; the data in the correct field within the response file.) ; N FLDID,FLDIEN,FLDNUM S (FLDID,FLDNUM)="" S FLDIEN=0 ; S FLDID=$E(FIELD,1,2) ;field identifier Q:FLDID="" ; I FLDID'="" D . S FLDIEN=$O(^BPSF(9002313.91,"D",FLDID,FLDIEN)) ;internal fld # . S:FLDIEN FLDNUM=$P($G(^BPSF(9002313.91,FLDIEN,0)),U) ;fld number Q FLDNUM ; PROCRESP ; N FILE,ROOT,FDATA03,FLDNUM,FIELD S FILE="9002313.0301" S ROOT="FDATA03(9002313.0301)" K FDATA03 I '$D(FDATA(TRANSACT,501)) S FDATA(TRANSACT,501)=FDATA(TRANSACT,112) I '$D(FDATA(TRANSACT,112)) S FDATA(TRANSACT,112)=FDATA(TRANSACT,501) S FLDNUM=".01" D FDA^DILF(FILE,"+1,"_FDAIEN(TRANSACT),FLDNUM,"",TRANSACT,ROOT) S FIELD="" F S FIELD=$O(FDATA(TRANSACT,FIELD)) Q:FIELD="" D ;set all the non-repeating fields for 9002313.0301 .I $G(FDATA(TRANSACT,FIELD))'="" D ..I FIELD=402 S FDATA(TRANSACT,FIELD)=$TR(FDATA(TRANSACT,FIELD),"\","") ;REMOVE EXTRANEOUS "\" ..D FDA^DILF(FILE,"+"_TRANSACT_","_FDAIEN(TRANSACT),FIELD,"",FDATA(TRANSACT,FIELD),ROOT) .E D ..; D UPDATE^DIE("S","FDATA03(9002313.0301)","FDAIEN03") Q ; PROCREJ ; Q:$G(FDATA(TRANSACT,510))="" N FILE,ROOT,FLDNUM,FDAT3511,NUMREJS,NNDX S FILE="9002313.03511" S ROOT="FDAT3511(9002313.03511)" S NUMREJS=FDATA(TRANSACT,510) S NNDX="" F S NNDX=$O(FDATA(TRANSACT,511,NNDX)) Q:NNDX="" D ;set all the non-repeating fields for 9002313.3511 rejections .S FDATA(TRANSACT,511,NNDX)=$TR(FDATA(TRANSACT,511,NNDX),"\","") .S FLDNUM=".01" D FDA^DILF(FILE,"+"_NNDX_","_FDAIEN03(TRANSACT)_","_FDAIEN(TRANSACT),FLDNUM,"",FDATA(TRANSACT,511,NNDX),ROOT) D UPDATE^DIE("S","FDAT3511(9002313.03511)") Q ; PROCAPP ; Q:$G(FDATA(TRANSACT,548,1))="" N FILE,ROOT,FLDNUM,FDAT1548,NNDX S FILE="9002313.301548" S ROOT="FDAT1548(9002313.0301548)" S NNDX="" F S NNDX=$O(FDATA(FDAIEN(TRANSACT),548,NNDX)) Q:NNDX="" D .S FLDNUM=".01" D FDA^DILF(FILE,"+"_NNDX_","_FDAIEN03(TRANSACT)_","_FDAIEN(TRANSACT),FLDNUM,"",FDATA(TRANSACT,548,NNDX),ROOT) D UPDATE^DIE("S","FDAT1548(9002313.301548)") Q ; PROCPPR ; Q:$G(FDATA(TRANSACT,551.01,1))="" N FILE,ROOT,FLDNUM,FDAT1301,NNDX S FILE="9002313.1301" S ROOT="FDAT1301(9002313.1301)" S NNDX="" F S NNDX=$O(FDATA(FDAIEN(TRANSACT),551.01,NNDX)) Q:NNDX="" D .S FLDNUM=".01" D FDA^DILF(FILE,"+"_NNDX_","_FDAIEN03(TRANSACT)_","_FDAIEN(TRANSACT),FLDNUM,"",FDATA(TRANSACT,551.01,NNDX),ROOT) D UPDATE^DIE("S","FDAT1301(9002313.1301)") Q