| 1 | BPSECA1 ;BHAM ISC/FCS/DRS/VA/DLF - Assemble formatted claim ;05/14/2004 | 
|---|
| 2 | ;;1.0;E CLAIMS MGMT ENGINE;**1,5**;JUN 2004;Build 45 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ;---------------------------------------------------------------------- | 
|---|
| 5 | ; Assemble ASCII formatted claim submission record | 
|---|
| 6 | ; | 
|---|
| 7 | ; Input Variables: | 
|---|
| 8 | ;  CLAIMIEN - pointer into 9002313.02 | 
|---|
| 9 | ;  MSG - Array passed by reference - This will have the claim packet | 
|---|
| 10 | ; | 
|---|
| 11 | ; NCPDP 5.1 changes | 
|---|
| 12 | ;     5.1 has 14 claim segments (header, patient, insurance, claim | 
|---|
| 13 | ;                                pharmacy provider, prescriber, | 
|---|
| 14 | ;                                COB, workers comp, DUR, Pricing, | 
|---|
| 15 | ;                                coupon, compound, prior auth, | 
|---|
| 16 | ;                                clinical) | 
|---|
| 17 | ;    5.1 requires field identifiers and separators on all fields | 
|---|
| 18 | ;        other than the header | 
|---|
| 19 | ;    5.1 Segment separators are required prior to each segment | 
|---|
| 20 | ;        following the header | 
|---|
| 21 | ;    5.1 Group separators appear at the end of each | 
|---|
| 22 | ;        transaction (prescription) | 
|---|
| 23 | ; | 
|---|
| 24 | ;   Adjustments were also made to the reversal logic as well. | 
|---|
| 25 | ; | 
|---|
| 26 | ASCII(CLAIMIEN,MSG) ;EP - from BPSOSQG | 
|---|
| 27 | N IEN,RECORD,BPS,UERETVAL,DET51,WP | 
|---|
| 28 | ; | 
|---|
| 29 | ; Quit if no Claim IEN | 
|---|
| 30 | I '$G(CLAIMIEN) Q | 
|---|
| 31 | I '$D(^BPSC(CLAIMIEN,0)) Q | 
|---|
| 32 | ; | 
|---|
| 33 | ; Setup IEN variables (used when executing format code) | 
|---|
| 34 | S IEN(9002313.02)=CLAIMIEN | 
|---|
| 35 | ; | 
|---|
| 36 | ; Get Payer Sheet pointer | 
|---|
| 37 | S IEN(9002313.92)=$P($G(^BPSC(IEN(9002313.02),0)),U,2) | 
|---|
| 38 | ; | 
|---|
| 39 | ; Quit if the payer sheet pointer is missing | 
|---|
| 40 | I 'IEN(9002313.92) Q | 
|---|
| 41 | ; | 
|---|
| 42 | ; Quit if the payer sheet does not exist | 
|---|
| 43 | I '$D(^BPSF(9002313.92,+IEN(9002313.92),0)) Q | 
|---|
| 44 | ; | 
|---|
| 45 | ; Retrieve claim submission record (used when executing format code) | 
|---|
| 46 | D GETBPS2^BPSECX0(IEN(9002313.02),.BPS) | 
|---|
| 47 | ; | 
|---|
| 48 | ; Assemble required claim header and optional format sections | 
|---|
| 49 | S RECORD="" | 
|---|
| 50 | ; | 
|---|
| 51 | ; Do non-repeating claim segments | 
|---|
| 52 | D XLOOP^BPSOSH2("100^110^120",.IEN,.BPS,.RECORD) | 
|---|
| 53 | ; | 
|---|
| 54 | ; Set list of repeating claim segments | 
|---|
| 55 | S DET51="130^140^150^160^170^180^190^200^210^220^230" | 
|---|
| 56 | ; | 
|---|
| 57 | ; Loop through prescription multiple and get create repeation segments | 
|---|
| 58 | S IEN(9002313.01)=0 | 
|---|
| 59 | F  S IEN(9002313.01)=$O(^BPSC(IEN(9002313.02),400,IEN(9002313.01))) Q:'IEN(9002313.01)  D | 
|---|
| 60 | . ; | 
|---|
| 61 | . ;Retrieve prescription information (used when executing format code) | 
|---|
| 62 | . K BPS(9002313.0201) | 
|---|
| 63 | . D GETBPS3^BPSECX0(IEN(9002313.02),IEN(9002313.01),.BPS) | 
|---|
| 64 | . ; | 
|---|
| 65 | . ; Handle the DUR repeating flds | 
|---|
| 66 | . D DURVALUE | 
|---|
| 67 | . ; | 
|---|
| 68 | . ; Append group separator character | 
|---|
| 69 | . S RECORD=RECORD_$C(29) | 
|---|
| 70 | . ; | 
|---|
| 71 | . ; Assemble claim information required and optional sections | 
|---|
| 72 | . D XLOOP^BPSOSH2(DET51,.IEN,.BPS,.RECORD) | 
|---|
| 73 | ; | 
|---|
| 74 | ; Need to store by segment due to HL7 constraints.  Had to change field, group, | 
|---|
| 75 | ; and segment separators to control characters for Vitria/AAC processing as well as | 
|---|
| 76 | ; shortening the length of the xmit. | 
|---|
| 77 | ; DMB 11/27/2006 - If the first NNODES has $C(30), this will bomb since OREC will not | 
|---|
| 78 | ;   have a value.  Need to look into this. | 
|---|
| 79 | N NNODES,INDEX,ONE,TWO,OREC | 
|---|
| 80 | S NNODES=0 F  S NNODES=$O(RECORD(NNODES)) Q:NNODES=""  D | 
|---|
| 81 | . I RECORD(NNODES)[$C(30) D | 
|---|
| 82 | .. S ONE=$P(RECORD(NNODES),($C(30)_$C(28)),1),TWO=$P(RECORD(NNODES),($C(30)_$C(28)),2) | 
|---|
| 83 | .. S RECORD(OREC)=RECORD(OREC)_ONE_$C(30)_$C(28),RECORD(NNODES)=TWO | 
|---|
| 84 | . S OREC=NNODES | 
|---|
| 85 | ; | 
|---|
| 86 | ; Put claim packet into local array to be passed back to calling routine | 
|---|
| 87 | S NNODES="" | 
|---|
| 88 | S INDEX=1 F  S NNODES=$O(RECORD(NNODES)) Q:NNODES=""  D | 
|---|
| 89 | . S MSG("HLS",INDEX)=RECORD(NNODES) | 
|---|
| 90 | . S WP(INDEX/100+1,0)=RECORD(NNODES) | 
|---|
| 91 | . S INDEX=INDEX+1 | 
|---|
| 92 | S MSG("HLS",0)=INDEX-1 | 
|---|
| 93 | ; | 
|---|
| 94 | ; Store raw data into the BPS Claims record | 
|---|
| 95 | D WP^DIE(9002313.02,CLAIMIEN_",",9999,"","WP") | 
|---|
| 96 | Q | 
|---|
| 97 | ; | 
|---|
| 98 | ; DURVALUE - This subroutine will loop through the DUR/PPS repeating | 
|---|
| 99 | ; fields and load their values into the BPS array for the claim | 
|---|
| 100 | ; generation process | 
|---|
| 101 | DURVALUE ; | 
|---|
| 102 | N DURCNT,DUR | 
|---|
| 103 | ; | 
|---|
| 104 | K BPS(9002313.1001) | 
|---|
| 105 | ; | 
|---|
| 106 | ; Get the number of DUR records | 
|---|
| 107 | S DURCNT=$P($G(^BPSC(IEN(9002313.02),400,IEN(9002313.01),473.01,0)),U,4) | 
|---|
| 108 | ; | 
|---|
| 109 | ; Loop through DURS and get the data | 
|---|
| 110 | F DUR=1:1:DURCNT  D | 
|---|
| 111 | . D GETBPS4^BPSECX0(IEN(9002313.02),IEN(9002313.01),DUR,.BPS) | 
|---|
| 112 | Q | 
|---|