- BPSPRRX6 ;ALB/SS - ePharmacy secondary billing ;12-DEC-08
- ;;1.0;E CLAIMS MGMT ENGINE;**8,10,11,19,23,24**;JUN 2004;Build 43
- ;;Per VA Directive 6402, this routine should not be modified.
- ;
- ;
- RXINFO(BPSRX) ;
- ;Check if if prescription with given number exists
- ;Input:
- ; BPSRX - RX#
- ;Return:
- ; 1st piece - ien of #52
- ; 2nd piece - ien of #2
- ; -1 if "^" was entered
- ;
- N BPSDFN,BPS52,BPSRET
- ;prompt for the patient
- S BPSDFN=$$PROMPT^BPSSCRCV("P^DPT(","SELECT PATIENT")
- I BPSDFN=-1 Q -1
- K ^TMP($J,"BPSPRRX")
- D RX^PSO52API(BPSDFN,"BPSPRRX",,BPSRX,"0")
- I +$G(^TMP($J,"BPSPRRX",BPSDFN,0))=-1 D Q 0
- . W !,"Incorrect RX# or patient name entered.",!
- S BPSRET=+$O(^TMP($J,"BPSPRRX",BPSDFN,0))_U_BPSDFN
- K ^TMP($J,"BPSPRRX")
- Q BPSRET
- ;
- RXREFIL(BPS52,BPSDFN,BPSRXNO) ;
- ; Prompt for the fill# and do the rest
- ;
- N BPSRF,BPSARR,BPSVAL,BPSELCTD,BPSRETV,BPORRFDT
- K ^TMP($J,"BPSPRRX")
- D RX^PSO52API(BPSDFN,"BPSPRRX",BPS52,,"R")
- I +$G(^TMP($J,"BPSPRRX",BPSDFN,BPS52,"RF",0))=0 Q 0
- S BPSRF=0
- F S BPSRF=$O(^TMP($J,"BPSPRRX",BPSDFN,BPS52,"RF",BPSRF)) Q:+BPSRF=0 D
- . S BPSVAL=$G(^TMP($J,"BPSPRRX",BPSDFN,BPS52,"RF",BPSRF,.01))
- . S BPSARR(BPSRF)=BPSRF_U_$P(BPSVAL,U)
- ;original fill date
- S BPORRFDT=$$RXFLDT^PSOBPSUT(BPS52,0)
- S BPSARR(0)=0_U_BPORRFDT
- F S BPSELCTD=$$SELREFIL^BPSPRRX5(.BPSARR,"SELECT A FILL TO BILL","RX #"_BPSRXNO_" has the following fills:") Q:$P(BPSELCTD,U)'=""
- I BPSELCTD<0 Q -1
- Q BPSELCTD
- ;
- SECBIL59(MOREDATA,IEN59) ;
- ; Populate secondary billing fields in BPS TRANSACTION
- ; MOREDATA array filed into 9002313.59
- N BPTYPE,BPSTIME,BPCOB
- N AMTIEN,BPIEN1,BPIEN2,BPZ5914,BPZ,BPZ1,BPZ2,OPAMT,OPAPQ,OPAYD,OPPRA,OPREJ,PIEN,REJIEN,BPQ
- I +$G(IEN59)=0 Q
- ;
- I $L($G(MOREDATA("337-4C"))) I $$FILLFLDS^BPSUTIL2(9002313.59,1204,IEN59,MOREDATA("337-4C"))<1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#1204) of (#9002313.59)") ; cob other payments count
- I $L($G(MOREDATA("308-C8"))) I $$FILLFLDS^BPSUTIL2(9002313.59,1205,IEN59,MOREDATA("308-C8"))<1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#1205) of (#9002313.59)") ; other coverage code
- ;
- ; store secondary billing related data entered by the user - esg 6/14/10
- S BPQ=0
- S PIEN=0 F S PIEN=$O(MOREDATA("OTHER PAYER",PIEN)) Q:'PIEN!BPQ D
- . S OPAYD=$G(MOREDATA("OTHER PAYER",PIEN,0)) Q:OPAYD=""
- . ;
- . ; count up the number of multiples we have in each set
- . S BPZ=0 F BPZ1=0:1 S BPZ=$O(MOREDATA("OTHER PAYER",PIEN,"P",BPZ)) Q:'BPZ
- . S BPZ=0 F BPZ2=0:1 S BPZ=$O(MOREDATA("OTHER PAYER",PIEN,"R",BPZ)) Q:'BPZ
- . I BPZ1,BPZ2 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot have both payments and rejects for the same OTHER PAYER.") Q
- . ;
- . ; add a new entry to subfile 9002313.5914
- . S BPZ5914=$$INSITEM^BPSUTIL2(9002313.5914,IEN59,PIEN,PIEN,"",,0)
- . I BPZ5914<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Can't create entry in COB OTHER PAYERS multiple of the BPS TRANSACTION file") Q
- . ;
- . ; set the rest of the pieces at this level
- . I $P(OPAYD,U,2)'="" I $$FILLFLDS^BPSUTIL2(9002313.5914,.02,PIEN_","_IEN59,$P(OPAYD,U,2))<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.02) of (#9002313.5914)") Q
- . I $P(OPAYD,U,3)'="" I $$FILLFLDS^BPSUTIL2(9002313.5914,.03,PIEN_","_IEN59,$P(OPAYD,U,3))<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.03) of (#9002313.5914)") Q
- . I $P(OPAYD,U,4)'="" I $$FILLFLDS^BPSUTIL2(9002313.5914,.04,PIEN_","_IEN59,$P(OPAYD,U,4))<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.04) of (#9002313.5914)") Q
- . I $P(OPAYD,U,5)'="" I $$FILLFLDS^BPSUTIL2(9002313.5914,.05,PIEN_","_IEN59,$P(OPAYD,U,5))<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.05) of (#9002313.5914)") Q
- . I $$FILLFLDS^BPSUTIL2(9002313.5914,.06,PIEN_","_IEN59,BPZ1)<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.06) of (#9002313.5914)") Q
- . I $$FILLFLDS^BPSUTIL2(9002313.5914,.07,PIEN_","_IEN59,BPZ2)<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.07) of (#9002313.5914)") Q
- . I $P(OPAYD,U,11)'="" I $$FILLFLDS^BPSUTIL2(9002313.5914,.11,PIEN_","_IEN59,$P(OPAYD,U,11))<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.11) of (#9002313.5914)") Q
- . ;
- . ; now loop thru the other payer payment array
- . S AMTIEN=0 F S AMTIEN=$O(MOREDATA("OTHER PAYER",PIEN,"P",AMTIEN)) Q:'AMTIEN!BPQ D
- .. S OPAMT=$G(MOREDATA("OTHER PAYER",PIEN,"P",AMTIEN,0))
- .. S OPAPQ=$P(OPAMT,U,2) ; 342-HC other payer amt paid qualifier (ncpdp 5.1 blank is OK)
- .. S OPPRA=$P(OPAMT,U,3) ; 352-NQ, Other Payer-Patient Responsibility Amount
- .. S OPAMT=+OPAMT ; 431-DV other payer amt paid
- .. ;
- .. ; add a new entry to subfile 9002313.59141
- .. S BPIEN1=$$INSITEM^BPSUTIL2(9002313.59141,PIEN_","_IEN59,OPAMT,AMTIEN,"",,0)
- .. I BPIEN1<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Can't create entry in 9002313.59141 subfile") Q
- .. ;
- .. ; set piece 2
- .. I OPAPQ'="" I $$FILLFLDS^BPSUTIL2(9002313.59141,.02,AMTIEN_","_PIEN_","_IEN59,OPAPQ)<1 D
- ... S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.02) of (#9002313.59141)")
- ... Q
- .. ;
- .. ; set piece 3
- .. I OPPRA'="" I $$FILLFLDS^BPSUTIL2(9002313.59141,.03,AMTIEN_","_PIEN_","_IEN59,OPPRA)<1 D
- ... S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Cannot populate (#.03) of (#9002313.59141)")
- ... Q
- .. ;
- .. Q
- . ;
- . ; now loop thru the other payer reject array
- . S REJIEN=0 F S REJIEN=$O(MOREDATA("OTHER PAYER",PIEN,"R",REJIEN)) Q:'REJIEN!BPQ D
- .. S OPREJ=$G(MOREDATA("OTHER PAYER",PIEN,"R",REJIEN,0)) Q:OPREJ="" Q:$P(OPREJ,U,1)=""
- .. ;
- .. ; add a new entry to subfile 9002313.59142
- .. S BPIEN2=$$INSITEM^BPSUTIL2(9002313.59142,PIEN_","_IEN59,$P(OPREJ,U,1),REJIEN,"",,0)
- .. I BPIEN2<1 S BPQ=1 D LOG^BPSOSL(IEN59,$T(+0)_"-Can't create entry in 9002313.59142 subfile") Q
- .. Q
- . Q
- Q
- ;
- SECDATA(RX,FILL,BPSPLAN,BPSPRDAT,BPSRTYPE) ;
- ;Populate array elements to resubmit SECONDARY claim. This builds the COB data using
- ; the secondary claim that was previously submitted.
- ;This will be called by the PRO option (BPSPRRX, BPSPRRX5) and Resubmit with Edits (BPSRES)
- ; if it cannot build the COB claim data from the primary claim, which will only happen
- ; if the primary claim is missing (primary claim was paper).
- ;This is also called by BPSNCPDP when the secondary data is missing. I believe that this
- ; will only happen for a Resubmit (RES) from the ECME User Screen. For this process, we
- ; also need to compile the PRIMARY BILL, insurance plan, and rate type.
- ;
- ;Input:
- ; RX - Prescription (#52) IEN
- ; FILL - Fill Number
- ; BPSPLAN - Plan (#355.3) IEN, by reference
- ; BPSPRDAT - Array with secondary data, by reference
- ; BPSRTYPE - Rate Type (#399.3) IEN, by reference
- ;Output:
- ; 1 - Success
- ; 0 - Cannot populate array
- ;
- N IEN59SEC,BPBILL
- I '$G(RX) Q 0
- I $G(FILL)="" Q 0
- ;
- ; Get Transaction IENs for the secondary transaction
- S IEN59SEC=$$IEN59^BPSOSRX(RX,FILL,2)
- ;
- ; Get Primary Bill for the secondary claim
- S BPBILL=$$PAYBLPRI^BPSUTIL2(IEN59SEC)
- I BPBILL>0 S BPSPRDAT("PRIMARY BILL")=BPBILL
- ;
- ; Get Plan, Rate Type, and Prior Payment from the secondary transaction
- S BPSPLAN=+$P($G(^BPST(IEN59SEC,10,1,0)),U,1)
- S BPSRTYPE=+$P($G(^BPST(IEN59SEC,10,1,0)),U,8)
- S BPSPRDAT("PRIOR PAYMENT")=$P($G(^BPST(IEN59SEC,10,1,2)),U,9)
- ;
- ; Build array of COB secondary claim data from the BPS Transaction file - esg - 6/14/10
- S BPSPRDAT("337-4C")=$P($G(^BPST(IEN59SEC,12)),U,4) ;1204 cob other payments count
- S BPSPRDAT("308-C8")=$P($G(^BPST(IEN59SEC,12)),U,5) ;1205 other coverage code
- ;
- ; Build COB data array - esg - 6/14/10
- N COBPIEN,APDIEN,REJIEN
- K BPSPRDAT("OTHER PAYER")
- S COBPIEN=0 F S COBPIEN=$O(^BPST(IEN59SEC,14,COBPIEN)) Q:'COBPIEN D
- . S BPSPRDAT("OTHER PAYER",COBPIEN,0)=$G(^BPST(IEN59SEC,14,COBPIEN,0))
- . ;
- . ; Retrieve data from other payer amount paid multiple
- . S APDIEN=0 F S APDIEN=$O(^BPST(IEN59SEC,14,COBPIEN,1,APDIEN)) Q:'APDIEN D
- .. S BPSPRDAT("OTHER PAYER",COBPIEN,"P",APDIEN,0)=$G(^BPST(IEN59SEC,14,COBPIEN,1,APDIEN,0))
- .. Q
- . ;
- . ; Retrieve data from other payer reject multiple
- . S REJIEN=0 F S REJIEN=$O(^BPST(IEN59SEC,14,COBPIEN,2,REJIEN)) Q:'REJIEN D
- .. S BPSPRDAT("OTHER PAYER",COBPIEN,"R",REJIEN,0)=$G(^BPST(IEN59SEC,14,COBPIEN,2,REJIEN,0))
- .. Q
- . Q
- Q 1
- ;
- PRIMDATA(RX,FILL,COBARRAY) ;
- ; Build COB data from primary claim and response
- ; This is called by PRO option (BPSPRRX, BPSPRRX5) and Resubmit with Edits (BPSRES)
- ;
- ; Input:
- ; RX - Prescription IEN
- ; FILL - Fill Number
- ; COBARRAY - Array that will be build, passed by reference
- ; Return:
- ; 0 = Invalid data (transactions, claim, or response is missing)
- ; 1 = Valid data
- ;
- I '$G(RX) Q 0
- I $G(FILL)="" Q 0
- N IEN59PR,BPSIEN,BPSCLM,BPSRESP,BPSSTAT,BIN,BPSOPDT,BPX,BPSPIEN,CNT
- N BPSRECID
- ;
- ; Get primary transaction and check that is exists
- S IEN59PR=$$IEN59^BPSOSRX(RX,FILL,1)
- I '$D(^BPST(IEN59PR)) Q 0
- ;
- ; Get Claim and Response and make sure they both exist
- S BPSCLM=+$P($G(^BPST(IEN59PR,0)),U,4)
- I BPSCLM=0 Q 0
- I '$D(^BPSC(BPSCLM)) Q 0
- S BPSRESP=+$P($G(^BPST(IEN59PR,0)),U,5)
- I BPSRESP=0 Q 0
- I '$D(^BPSR(BPSRESP)) Q 0
- ;
- ; Get status of primary transaction
- S BPSSTAT=$P($$STATUS^BPSOSRX(RX,FILL,,,1),U)
- ;
- ; If the primary claim is payable, get the PRIOR PAYMENT from the primary Response record
- S COBARRAY("PRIOR PAYMENT")=""
- I $$PAYABLE^BPSOSRX5(BPSSTAT),BPSRESP S COBARRAY("PRIOR PAYMENT")=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,500)),U,9))
- ;
- ; Get Coverage Code
- I $G(COBARRAY("PRIOR PAYMENT"))>0 S COBARRAY("308-C8")="02"
- E I BPSSTAT["E REJECTED" S COBARRAY("308-C8")="03"
- E S COBARRAY("308-C8")="04"
- ;
- ; Get BIN from the primary claim record
- S BIN=""
- I BPSCLM S BIN=$P($G(^BPSC(BPSCLM,100)),U)
- ;
- ; Get the Other Payer Date in internal format from the primary Response record
- S BPSOPDT=""
- I BPSRESP S BPSOPDT=($P($G(^BPSR(BPSRESP,0)),U,2))\1
- ;
- ; Default the Other Payer IEN 1 since we only do secondary
- S BPSPIEN=1
- S COBARRAY("337-4C")=BPSPIEN ; Other Payer Count
- ;
- ; Set array of Other Payer Data
- K COBARRAY("OTHER PAYER")
- S COBARRAY("OTHER PAYER",BPSPIEN,0)="1^01^03^"_BIN_"^"_BPSOPDT_"^0^0"
- ; Add Reconciliation ID to Other Payer Data, transmit on Secondary
- ; claim as Other Payer Reconciliation ID
- S BPSRECID=$$ANFF^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,"B98")),U,1),30)
- I BPSRECID'="" S $P(COBARRAY("OTHER PAYER",BPSPIEN,0),"^",11)=BPSRECID
- ;
- ; Build Paid Amounts if previous claim was paid
- I BPSSTAT["E PAYABLE",$G(COBARRAY("PRIOR PAYMENT"))]"" D
- . N BPARR,BPX D GETOPAP(BPSRESP,.BPARR)
- . S BPX=0 F CNT=0:1 S BPX=$O(BPARR(BPX)) Q:BPX="" S COBARRAY("OTHER PAYER",BPSPIEN,"P",BPX,0)=BPARR(BPX)
- . S $P(COBARRAY("OTHER PAYER",BPSPIEN,0),U,6)=CNT
- ;
- ; Build Reject Codes if previous claims was rejected
- I BPSSTAT["E REJECTED" D
- . N BPARR,BPX D GETRJCOD(BPSRESP,.BPARR)
- . S BPX=0 F CNT=0:1 S BPX=$O(BPARR(BPX)) Q:BPX="" S COBARRAY("OTHER PAYER",BPSPIEN,"R",BPX,0)=BPARR(BPX)
- . S $P(COBARRAY("OTHER PAYER",BPSPIEN,0),U,7)=CNT
- Q 1
- ;
- GETOPAP(BPSRESP,BPSDAT) ;
- ; Get the Other Payer Amount Paid values and qualifiers
- ; Input:
- ; BPSRESP = IEN of BPS RESPONSE file
- ; BPSDAT(N) = Array of Other Payer fields (passed by reference)
- ; [1] Patient Pay Amount
- ; [2] Qualifier
- ; [3] Other Payer Patient Responsibility Amount
- ;
- I '$G(BPSRESP) Q
- I '$D(^BPSR(BPSRESP,1000)) Q
- N CNT,BPS505,BPS509,BPS559,BPS558,BPS523,BPS563,BPS562,BPS521,BPSQUAL,BPSAMNT,BPSTAX,BPSOAP,BPSX
- S CNT=0
- ; Set up D.0 fields for COB segment
- S BPS509=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,500)),U,9))
- ; If Total Amount Paid is a negative number, set it to zero.
- ; Zero Pay amount is allowed
- I BPS509<0 S BPS509=0
- ;
- ; Cognitive Services Qualifier/Professional Service Fee Paid
- S BPS562=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,560)),U,2))
- I BPS562<0 S BPS562=0
- I +BPS562 S CNT=CNT+1,BPSDAT(CNT)=BPS562_U_"06"
- ;
- ; Incentive Qualifier/Incentive Amt Paid
- S BPS521=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,500)),U,21))
- I BPS521<0 S BPS521=0
- I +BPS521 S CNT=CNT+1,BPSDAT(CNT)=BPS521_U_"05"
- ; Subtract Incentive Qualifier from Paid Amount for Drug Benefit
- S BPS509=BPS509-BPS521
- ;
- ; Default all Tax values to zero for negative values
- S BPS559=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,550)),U,9)) ; Percentage Sales Tax Paid
- I BPS559<0 S BPS559=0
- S BPS558=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,550)),U,8)) ; Flat Sales Tax Paid
- I BPS558<0 S BPS558=0
- S BPS523=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,500)),U,23)) ; Amount Attributed to Sales Tax
- I BPS523<0 S BPS523=0
- ;
- ; Sales Tax Qualifier
- S BPSTAX=BPS559+BPS558-BPS523
- I BPSTAX<0 S BPSTAX=0
- I +BPSTAX S CNT=CNT+1,BPSDAT(CNT)=BPSTAX_U_"10"
- ; Subtract Sales Tax Qualifier from Paid Amount for Drug Benefit
- S BPS509=BPS509-BPSTAX
- ;
- ; Set OTHER AMOUNT PAID multiples
- S BPS563=0 F S BPS563=$O(^BPSR(BPSRESP,1000,1,563.01,BPS563)) Q:BPS563="" D
- . S BPSQUAL=$P($G(^BPSR(BPSRESP,1000,1,563.01,BPS563,1)),U,1)
- . ; Quit if qualifier = 99 since there is no NCPDP mapping for this qualifier
- . Q:BPSQUAL']""!(BPSQUAL=99)
- . S BPSAMNT=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,563.01,BPS563,1)),U,2))
- . ; Default negative amounts to zero
- . I BPSAMNT<0 S BPSAMNT=0
- . I $D(BPSOAP(BPSQUAL)) S BPSOAP(BPSQUAL)=BPSOAP(BPSQUAL)+BPSAMNT
- . I '$D(BPSOAP(BPSQUAL)) S BPSOAP(BPSQUAL)=BPSAMNT
- . ; Subtract Amount if Qualifier is 01, 02, 03, 04, 09 or 11
- . I "010203040911"[BPSQUAL S BPS509=BPS509-BPSAMNT
- I $D(BPSOAP) D
- . S BPSX="" F S BPSX=$O(BPSOAP(BPSX)) Q:BPSX="" D
- . . S CNT=CNT+1,BPSDAT(CNT)=BPSOAP(BPSX)_U_$$GETPDIEN(BPSX)
- ; Set Drug Benefit Qualifier
- I BPS509<0 S BPS509=0
- ; Set Patient Pay Amount
- S BPS505=$$DFF2EXT^BPSECFM($P($G(^BPSR(BPSRESP,1000,1,500)),U,5))
- ;
- S CNT=CNT+1,BPSDAT(CNT)=BPS509_U_$$GETPDIEN("07")_U_BPS505
- Q
- ;
- GETPDIEN(CODE) ;
- ; Get the Other Payer Amount Paid Qualifier IEN for BPS NCPCP OTHER
- ; PAYER AMOUNT PAID QUAL file
- I $G(CODE)="" Q ""
- Q $O(^BPS(9002313.2,"B",CODE,""))
- ;
- GETRJCOD(BPRESP,BPARR) ;
- ; Get the first five reject codes w/o getting duplicates
- ; Input:
- ; BPSRESP = IEN of BPS RESPONSE file
- ; BPSARR1 = Array of Reject Codes
- ;
- I '$G(BPRESP) Q
- I '$D(^BPSR(BPRESP,1000)) Q
- N BPRCNT,BPRJ,BPPOS,BPRJCOD
- ;
- ; Default BPPOS to the first transaction in the RESPONSE multiple
- ; We only want the first five reject codes and no duplicates
- S (BPRCNT,BPRJ)=0,BPPOS=1
- F S BPRJ=$O(^BPSR(BPRESP,1000,BPPOS,511,BPRJ)) Q:+BPRJ=0 D Q:BPRCNT>4
- . S BPRJCOD=$P($G(^BPSR(BPRESP,1000,BPPOS,511,BPRJ,0)),U)
- . Q:$L(BPRJCOD)=0
- . ; Only store if not a duplicate
- . I '$D(BPARR(BPRJCOD)) S BPRCNT=BPRCNT+1,BPARR(BPRCNT)=BPRJCOD
- Q
- ;BPSPRRX6
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HBPSPRRX6 14868 printed Apr 23, 2025@18:06:54 Page 2
- BPSPRRX6 ;ALB/SS - ePharmacy secondary billing ;12-DEC-08
- +1 ;;1.0;E CLAIMS MGMT ENGINE;**8,10,11,19,23,24**;JUN 2004;Build 43
- +2 ;;Per VA Directive 6402, this routine should not be modified.
- +3 ;
- +4 ;
- RXINFO(BPSRX) ;
- +1 ;Check if if prescription with given number exists
- +2 ;Input:
- +3 ; BPSRX - RX#
- +4 ;Return:
- +5 ; 1st piece - ien of #52
- +6 ; 2nd piece - ien of #2
- +7 ; -1 if "^" was entered
- +8 ;
- +9 NEW BPSDFN,BPS52,BPSRET
- +10 ;prompt for the patient
- +11 SET BPSDFN=$$PROMPT^BPSSCRCV("P^DPT(","SELECT PATIENT")
- +12 IF BPSDFN=-1
- QUIT -1
- +13 KILL ^TMP($JOB,"BPSPRRX")
- +14 DO RX^PSO52API(BPSDFN,"BPSPRRX",,BPSRX,"0")
- +15 IF +$GET(^TMP($JOB,"BPSPRRX",BPSDFN,0))=-1
- Begin DoDot:1
- +16 WRITE !,"Incorrect RX# or patient name entered.",!
- End DoDot:1
- QUIT 0
- +17 SET BPSRET=+$ORDER(^TMP($JOB,"BPSPRRX",BPSDFN,0))_U_BPSDFN
- +18 KILL ^TMP($JOB,"BPSPRRX")
- +19 QUIT BPSRET
- +20 ;
- RXREFIL(BPS52,BPSDFN,BPSRXNO) ;
- +1 ; Prompt for the fill# and do the rest
- +2 ;
- +3 NEW BPSRF,BPSARR,BPSVAL,BPSELCTD,BPSRETV,BPORRFDT
- +4 KILL ^TMP($JOB,"BPSPRRX")
- +5 DO RX^PSO52API(BPSDFN,"BPSPRRX",BPS52,,"R")
- +6 IF +$GET(^TMP($JOB,"BPSPRRX",BPSDFN,BPS52,"RF",0))=0
- QUIT 0
- +7 SET BPSRF=0
- +8 FOR
- SET BPSRF=$ORDER(^TMP($JOB,"BPSPRRX",BPSDFN,BPS52,"RF",BPSRF))
- if +BPSRF=0
- QUIT
- Begin DoDot:1
- +9 SET BPSVAL=$GET(^TMP($JOB,"BPSPRRX",BPSDFN,BPS52,"RF",BPSRF,.01))
- +10 SET BPSARR(BPSRF)=BPSRF_U_$PIECE(BPSVAL,U)
- End DoDot:1
- +11 ;original fill date
- +12 SET BPORRFDT=$$RXFLDT^PSOBPSUT(BPS52,0)
- +13 SET BPSARR(0)=0_U_BPORRFDT
- +14 FOR
- SET BPSELCTD=$$SELREFIL^BPSPRRX5(.BPSARR,"SELECT A FILL TO BILL","RX #"_BPSRXNO_" has the following fills:")
- if $PIECE(BPSELCTD,U)'=""
- QUIT
- +15 IF BPSELCTD<0
- QUIT -1
- +16 QUIT BPSELCTD
- +17 ;
- SECBIL59(MOREDATA,IEN59) ;
- +1 ; Populate secondary billing fields in BPS TRANSACTION
- +2 ; MOREDATA array filed into 9002313.59
- +3 NEW BPTYPE,BPSTIME,BPCOB
- +4 NEW AMTIEN,BPIEN1,BPIEN2,BPZ5914,BPZ,BPZ1,BPZ2,OPAMT,OPAPQ,OPAYD,OPPRA,OPREJ,PIEN,REJIEN,BPQ
- +5 IF +$GET(IEN59)=0
- QUIT
- +6 ;
- +7 ; cob other payments count
- IF $LENGTH($GET(MOREDATA("337-4C")))
- IF $$FILLFLDS^BPSUTIL2(9002313.59,1204,IEN59,MOREDATA("337-4C"))<1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#1204) of (#9002313.59)")
- +8 ; other coverage code
- IF $LENGTH($GET(MOREDATA("308-C8")))
- IF $$FILLFLDS^BPSUTIL2(9002313.59,1205,IEN59,MOREDATA("308-C8"))<1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#1205) of (#9002313.59)")
- +9 ;
- +10 ; store secondary billing related data entered by the user - esg 6/14/10
- +11 SET BPQ=0
- +12 SET PIEN=0
- FOR
- SET PIEN=$ORDER(MOREDATA("OTHER PAYER",PIEN))
- if 'PIEN!BPQ
- QUIT
- Begin DoDot:1
- +13 SET OPAYD=$GET(MOREDATA("OTHER PAYER",PIEN,0))
- if OPAYD=""
- QUIT
- +14 ;
- +15 ; count up the number of multiples we have in each set
- +16 SET BPZ=0
- FOR BPZ1=0:1
- SET BPZ=$ORDER(MOREDATA("OTHER PAYER",PIEN,"P",BPZ))
- if 'BPZ
- QUIT
- +17 SET BPZ=0
- FOR BPZ2=0:1
- SET BPZ=$ORDER(MOREDATA("OTHER PAYER",PIEN,"R",BPZ))
- if 'BPZ
- QUIT
- +18 IF BPZ1
- IF BPZ2
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot have both payments and rejects for the same OTHER PAYER.")
- QUIT
- +19 ;
- +20 ; add a new entry to subfile 9002313.5914
- +21 SET BPZ5914=$$INSITEM^BPSUTIL2(9002313.5914,IEN59,PIEN,PIEN,"",,0)
- +22 IF BPZ5914<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Can't create entry in COB OTHER PAYERS multiple of the BPS TRANSACTION file")
- QUIT
- +23 ;
- +24 ; set the rest of the pieces at this level
- +25 IF $PIECE(OPAYD,U,2)'=""
- IF $$FILLFLDS^BPSUTIL2(9002313.5914,.02,PIEN_","_IEN59,$PIECE(OPAYD,U,2))<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.02) of (#9002313.5914)")
- QUIT
- +26 IF $PIECE(OPAYD,U,3)'=""
- IF $$FILLFLDS^BPSUTIL2(9002313.5914,.03,PIEN_","_IEN59,$PIECE(OPAYD,U,3))<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.03) of (#9002313.5914)")
- QUIT
- +27 IF $PIECE(OPAYD,U,4)'=""
- IF $$FILLFLDS^BPSUTIL2(9002313.5914,.04,PIEN_","_IEN59,$PIECE(OPAYD,U,4))<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.04) of (#9002313.5914)")
- QUIT
- +28 IF $PIECE(OPAYD,U,5)'=""
- IF $$FILLFLDS^BPSUTIL2(9002313.5914,.05,PIEN_","_IEN59,$PIECE(OPAYD,U,5))<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.05) of (#9002313.5914)")
- QUIT
- +29 IF $$FILLFLDS^BPSUTIL2(9002313.5914,.06,PIEN_","_IEN59,BPZ1)<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.06) of (#9002313.5914)")
- QUIT
- +30 IF $$FILLFLDS^BPSUTIL2(9002313.5914,.07,PIEN_","_IEN59,BPZ2)<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.07) of (#9002313.5914)")
- QUIT
- +31 IF $PIECE(OPAYD,U,11)'=""
- IF $$FILLFLDS^BPSUTIL2(9002313.5914,.11,PIEN_","_IEN59,$PIECE(OPAYD,U,11))<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.11) of (#9002313.5914)")
- QUIT
- +32 ;
- +33 ; now loop thru the other payer payment array
- +34 SET AMTIEN=0
- FOR
- SET AMTIEN=$ORDER(MOREDATA("OTHER PAYER",PIEN,"P",AMTIEN))
- if 'AMTIEN!BPQ
- QUIT
- Begin DoDot:2
- +35 SET OPAMT=$GET(MOREDATA("OTHER PAYER",PIEN,"P",AMTIEN,0))
- +36 ; 342-HC other payer amt paid qualifier (ncpdp 5.1 blank is OK)
- SET OPAPQ=$PIECE(OPAMT,U,2)
- +37 ; 352-NQ, Other Payer-Patient Responsibility Amount
- SET OPPRA=$PIECE(OPAMT,U,3)
- +38 ; 431-DV other payer amt paid
- SET OPAMT=+OPAMT
- +39 ;
- +40 ; add a new entry to subfile 9002313.59141
- +41 SET BPIEN1=$$INSITEM^BPSUTIL2(9002313.59141,PIEN_","_IEN59,OPAMT,AMTIEN,"",,0)
- +42 IF BPIEN1<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Can't create entry in 9002313.59141 subfile")
- QUIT
- +43 ;
- +44 ; set piece 2
- +45 IF OPAPQ'=""
- IF $$FILLFLDS^BPSUTIL2(9002313.59141,.02,AMTIEN_","_PIEN_","_IEN59,OPAPQ)<1
- Begin DoDot:3
- +46 SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.02) of (#9002313.59141)")
- +47 QUIT
- End DoDot:3
- +48 ;
- +49 ; set piece 3
- +50 IF OPPRA'=""
- IF $$FILLFLDS^BPSUTIL2(9002313.59141,.03,AMTIEN_","_PIEN_","_IEN59,OPPRA)<1
- Begin DoDot:3
- +51 SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Cannot populate (#.03) of (#9002313.59141)")
- +52 QUIT
- End DoDot:3
- +53 ;
- +54 QUIT
- End DoDot:2
- +55 ;
- +56 ; now loop thru the other payer reject array
- +57 SET REJIEN=0
- FOR
- SET REJIEN=$ORDER(MOREDATA("OTHER PAYER",PIEN,"R",REJIEN))
- if 'REJIEN!BPQ
- QUIT
- Begin DoDot:2
- +58 SET OPREJ=$GET(MOREDATA("OTHER PAYER",PIEN,"R",REJIEN,0))
- if OPREJ=""
- QUIT
- if $PIECE(OPREJ,U,1)=""
- QUIT
- +59 ;
- +60 ; add a new entry to subfile 9002313.59142
- +61 SET BPIEN2=$$INSITEM^BPSUTIL2(9002313.59142,PIEN_","_IEN59,$PIECE(OPREJ,U,1),REJIEN,"",,0)
- +62 IF BPIEN2<1
- SET BPQ=1
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Can't create entry in 9002313.59142 subfile")
- QUIT
- +63 QUIT
- End DoDot:2
- +64 QUIT
- End DoDot:1
- +65 QUIT
- +66 ;
- SECDATA(RX,FILL,BPSPLAN,BPSPRDAT,BPSRTYPE) ;
- +1 ;Populate array elements to resubmit SECONDARY claim. This builds the COB data using
- +2 ; the secondary claim that was previously submitted.
- +3 ;This will be called by the PRO option (BPSPRRX, BPSPRRX5) and Resubmit with Edits (BPSRES)
- +4 ; if it cannot build the COB claim data from the primary claim, which will only happen
- +5 ; if the primary claim is missing (primary claim was paper).
- +6 ;This is also called by BPSNCPDP when the secondary data is missing. I believe that this
- +7 ; will only happen for a Resubmit (RES) from the ECME User Screen. For this process, we
- +8 ; also need to compile the PRIMARY BILL, insurance plan, and rate type.
- +9 ;
- +10 ;Input:
- +11 ; RX - Prescription (#52) IEN
- +12 ; FILL - Fill Number
- +13 ; BPSPLAN - Plan (#355.3) IEN, by reference
- +14 ; BPSPRDAT - Array with secondary data, by reference
- +15 ; BPSRTYPE - Rate Type (#399.3) IEN, by reference
- +16 ;Output:
- +17 ; 1 - Success
- +18 ; 0 - Cannot populate array
- +19 ;
- +20 NEW IEN59SEC,BPBILL
- +21 IF '$GET(RX)
- QUIT 0
- +22 IF $GET(FILL)=""
- QUIT 0
- +23 ;
- +24 ; Get Transaction IENs for the secondary transaction
- +25 SET IEN59SEC=$$IEN59^BPSOSRX(RX,FILL,2)
- +26 ;
- +27 ; Get Primary Bill for the secondary claim
- +28 SET BPBILL=$$PAYBLPRI^BPSUTIL2(IEN59SEC)
- +29 IF BPBILL>0
- SET BPSPRDAT("PRIMARY BILL")=BPBILL
- +30 ;
- +31 ; Get Plan, Rate Type, and Prior Payment from the secondary transaction
- +32 SET BPSPLAN=+$PIECE($GET(^BPST(IEN59SEC,10,1,0)),U,1)
- +33 SET BPSRTYPE=+$PIECE($GET(^BPST(IEN59SEC,10,1,0)),U,8)
- +34 SET BPSPRDAT("PRIOR PAYMENT")=$PIECE($GET(^BPST(IEN59SEC,10,1,2)),U,9)
- +35 ;
- +36 ; Build array of COB secondary claim data from the BPS Transaction file - esg - 6/14/10
- +37 ;1204 cob other payments count
- SET BPSPRDAT("337-4C")=$PIECE($GET(^BPST(IEN59SEC,12)),U,4)
- +38 ;1205 other coverage code
- SET BPSPRDAT("308-C8")=$PIECE($GET(^BPST(IEN59SEC,12)),U,5)
- +39 ;
- +40 ; Build COB data array - esg - 6/14/10
- +41 NEW COBPIEN,APDIEN,REJIEN
- +42 KILL BPSPRDAT("OTHER PAYER")
- +43 SET COBPIEN=0
- FOR
- SET COBPIEN=$ORDER(^BPST(IEN59SEC,14,COBPIEN))
- if 'COBPIEN
- QUIT
- Begin DoDot:1
- +44 SET BPSPRDAT("OTHER PAYER",COBPIEN,0)=$GET(^BPST(IEN59SEC,14,COBPIEN,0))
- +45 ;
- +46 ; Retrieve data from other payer amount paid multiple
- +47 SET APDIEN=0
- FOR
- SET APDIEN=$ORDER(^BPST(IEN59SEC,14,COBPIEN,1,APDIEN))
- if 'APDIEN
- QUIT
- Begin DoDot:2
- +48 SET BPSPRDAT("OTHER PAYER",COBPIEN,"P",APDIEN,0)=$GET(^BPST(IEN59SEC,14,COBPIEN,1,APDIEN,0))
- +49 QUIT
- End DoDot:2
- +50 ;
- +51 ; Retrieve data from other payer reject multiple
- +52 SET REJIEN=0
- FOR
- SET REJIEN=$ORDER(^BPST(IEN59SEC,14,COBPIEN,2,REJIEN))
- if 'REJIEN
- QUIT
- Begin DoDot:2
- +53 SET BPSPRDAT("OTHER PAYER",COBPIEN,"R",REJIEN,0)=$GET(^BPST(IEN59SEC,14,COBPIEN,2,REJIEN,0))
- +54 QUIT
- End DoDot:2
- +55 QUIT
- End DoDot:1
- +56 QUIT 1
- +57 ;
- PRIMDATA(RX,FILL,COBARRAY) ;
- +1 ; Build COB data from primary claim and response
- +2 ; This is called by PRO option (BPSPRRX, BPSPRRX5) and Resubmit with Edits (BPSRES)
- +3 ;
- +4 ; Input:
- +5 ; RX - Prescription IEN
- +6 ; FILL - Fill Number
- +7 ; COBARRAY - Array that will be build, passed by reference
- +8 ; Return:
- +9 ; 0 = Invalid data (transactions, claim, or response is missing)
- +10 ; 1 = Valid data
- +11 ;
- +12 IF '$GET(RX)
- QUIT 0
- +13 IF $GET(FILL)=""
- QUIT 0
- +14 NEW IEN59PR,BPSIEN,BPSCLM,BPSRESP,BPSSTAT,BIN,BPSOPDT,BPX,BPSPIEN,CNT
- +15 NEW BPSRECID
- +16 ;
- +17 ; Get primary transaction and check that is exists
- +18 SET IEN59PR=$$IEN59^BPSOSRX(RX,FILL,1)
- +19 IF '$DATA(^BPST(IEN59PR))
- QUIT 0
- +20 ;
- +21 ; Get Claim and Response and make sure they both exist
- +22 SET BPSCLM=+$PIECE($GET(^BPST(IEN59PR,0)),U,4)
- +23 IF BPSCLM=0
- QUIT 0
- +24 IF '$DATA(^BPSC(BPSCLM))
- QUIT 0
- +25 SET BPSRESP=+$PIECE($GET(^BPST(IEN59PR,0)),U,5)
- +26 IF BPSRESP=0
- QUIT 0
- +27 IF '$DATA(^BPSR(BPSRESP))
- QUIT 0
- +28 ;
- +29 ; Get status of primary transaction
- +30 SET BPSSTAT=$PIECE($$STATUS^BPSOSRX(RX,FILL,,,1),U)
- +31 ;
- +32 ; If the primary claim is payable, get the PRIOR PAYMENT from the primary Response record
- +33 SET COBARRAY("PRIOR PAYMENT")=""
- +34 IF $$PAYABLE^BPSOSRX5(BPSSTAT)
- IF BPSRESP
- SET COBARRAY("PRIOR PAYMENT")=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,500)),U,9))
- +35 ;
- +36 ; Get Coverage Code
- +37 IF $GET(COBARRAY("PRIOR PAYMENT"))>0
- SET COBARRAY("308-C8")="02"
- +38 IF '$TEST
- IF BPSSTAT["E REJECTED"
- SET COBARRAY("308-C8")="03"
- +39 IF '$TEST
- SET COBARRAY("308-C8")="04"
- +40 ;
- +41 ; Get BIN from the primary claim record
- +42 SET BIN=""
- +43 IF BPSCLM
- SET BIN=$PIECE($GET(^BPSC(BPSCLM,100)),U)
- +44 ;
- +45 ; Get the Other Payer Date in internal format from the primary Response record
- +46 SET BPSOPDT=""
- +47 IF BPSRESP
- SET BPSOPDT=($PIECE($GET(^BPSR(BPSRESP,0)),U,2))\1
- +48 ;
- +49 ; Default the Other Payer IEN 1 since we only do secondary
- +50 SET BPSPIEN=1
- +51 ; Other Payer Count
- SET COBARRAY("337-4C")=BPSPIEN
- +52 ;
- +53 ; Set array of Other Payer Data
- +54 KILL COBARRAY("OTHER PAYER")
- +55 SET COBARRAY("OTHER PAYER",BPSPIEN,0)="1^01^03^"_BIN_"^"_BPSOPDT_"^0^0"
- +56 ; Add Reconciliation ID to Other Payer Data, transmit on Secondary
- +57 ; claim as Other Payer Reconciliation ID
- +58 SET BPSRECID=$$ANFF^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,"B98")),U,1),30)
- +59 IF BPSRECID'=""
- SET $PIECE(COBARRAY("OTHER PAYER",BPSPIEN,0),"^",11)=BPSRECID
- +60 ;
- +61 ; Build Paid Amounts if previous claim was paid
- +62 IF BPSSTAT["E PAYABLE"
- IF $GET(COBARRAY("PRIOR PAYMENT"))]""
- Begin DoDot:1
- +63 NEW BPARR,BPX
- DO GETOPAP(BPSRESP,.BPARR)
- +64 SET BPX=0
- FOR CNT=0:1
- SET BPX=$ORDER(BPARR(BPX))
- if BPX=""
- QUIT
- SET COBARRAY("OTHER PAYER",BPSPIEN,"P",BPX,0)=BPARR(BPX)
- +65 SET $PIECE(COBARRAY("OTHER PAYER",BPSPIEN,0),U,6)=CNT
- End DoDot:1
- +66 ;
- +67 ; Build Reject Codes if previous claims was rejected
- +68 IF BPSSTAT["E REJECTED"
- Begin DoDot:1
- +69 NEW BPARR,BPX
- DO GETRJCOD(BPSRESP,.BPARR)
- +70 SET BPX=0
- FOR CNT=0:1
- SET BPX=$ORDER(BPARR(BPX))
- if BPX=""
- QUIT
- SET COBARRAY("OTHER PAYER",BPSPIEN,"R",BPX,0)=BPARR(BPX)
- +71 SET $PIECE(COBARRAY("OTHER PAYER",BPSPIEN,0),U,7)=CNT
- End DoDot:1
- +72 QUIT 1
- +73 ;
- GETOPAP(BPSRESP,BPSDAT) ;
- +1 ; Get the Other Payer Amount Paid values and qualifiers
- +2 ; Input:
- +3 ; BPSRESP = IEN of BPS RESPONSE file
- +4 ; BPSDAT(N) = Array of Other Payer fields (passed by reference)
- +5 ; [1] Patient Pay Amount
- +6 ; [2] Qualifier
- +7 ; [3] Other Payer Patient Responsibility Amount
- +8 ;
- +9 IF '$GET(BPSRESP)
- QUIT
- +10 IF '$DATA(^BPSR(BPSRESP,1000))
- QUIT
- +11 NEW CNT,BPS505,BPS509,BPS559,BPS558,BPS523,BPS563,BPS562,BPS521,BPSQUAL,BPSAMNT,BPSTAX,BPSOAP,BPSX
- +12 SET CNT=0
- +13 ; Set up D.0 fields for COB segment
- +14 SET BPS509=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,500)),U,9))
- +15 ; If Total Amount Paid is a negative number, set it to zero.
- +16 ; Zero Pay amount is allowed
- +17 IF BPS509<0
- SET BPS509=0
- +18 ;
- +19 ; Cognitive Services Qualifier/Professional Service Fee Paid
- +20 SET BPS562=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,560)),U,2))
- +21 IF BPS562<0
- SET BPS562=0
- +22 IF +BPS562
- SET CNT=CNT+1
- SET BPSDAT(CNT)=BPS562_U_"06"
- +23 ;
- +24 ; Incentive Qualifier/Incentive Amt Paid
- +25 SET BPS521=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,500)),U,21))
- +26 IF BPS521<0
- SET BPS521=0
- +27 IF +BPS521
- SET CNT=CNT+1
- SET BPSDAT(CNT)=BPS521_U_"05"
- +28 ; Subtract Incentive Qualifier from Paid Amount for Drug Benefit
- +29 SET BPS509=BPS509-BPS521
- +30 ;
- +31 ; Default all Tax values to zero for negative values
- +32 ; Percentage Sales Tax Paid
- SET BPS559=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,550)),U,9))
- +33 IF BPS559<0
- SET BPS559=0
- +34 ; Flat Sales Tax Paid
- SET BPS558=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,550)),U,8))
- +35 IF BPS558<0
- SET BPS558=0
- +36 ; Amount Attributed to Sales Tax
- SET BPS523=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,500)),U,23))
- +37 IF BPS523<0
- SET BPS523=0
- +38 ;
- +39 ; Sales Tax Qualifier
- +40 SET BPSTAX=BPS559+BPS558-BPS523
- +41 IF BPSTAX<0
- SET BPSTAX=0
- +42 IF +BPSTAX
- SET CNT=CNT+1
- SET BPSDAT(CNT)=BPSTAX_U_"10"
- +43 ; Subtract Sales Tax Qualifier from Paid Amount for Drug Benefit
- +44 SET BPS509=BPS509-BPSTAX
- +45 ;
- +46 ; Set OTHER AMOUNT PAID multiples
- +47 SET BPS563=0
- FOR
- SET BPS563=$ORDER(^BPSR(BPSRESP,1000,1,563.01,BPS563))
- if BPS563=""
- QUIT
- Begin DoDot:1
- +48 SET BPSQUAL=$PIECE($GET(^BPSR(BPSRESP,1000,1,563.01,BPS563,1)),U,1)
- +49 ; Quit if qualifier = 99 since there is no NCPDP mapping for this qualifier
- +50 if BPSQUAL']""!(BPSQUAL=99)
- QUIT
- +51 SET BPSAMNT=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,563.01,BPS563,1)),U,2))
- +52 ; Default negative amounts to zero
- +53 IF BPSAMNT<0
- SET BPSAMNT=0
- +54 IF $DATA(BPSOAP(BPSQUAL))
- SET BPSOAP(BPSQUAL)=BPSOAP(BPSQUAL)+BPSAMNT
- +55 IF '$DATA(BPSOAP(BPSQUAL))
- SET BPSOAP(BPSQUAL)=BPSAMNT
- +56 ; Subtract Amount if Qualifier is 01, 02, 03, 04, 09 or 11
- +57 IF "010203040911"[BPSQUAL
- SET BPS509=BPS509-BPSAMNT
- End DoDot:1
- +58 IF $DATA(BPSOAP)
- Begin DoDot:1
- +59 SET BPSX=""
- FOR
- SET BPSX=$ORDER(BPSOAP(BPSX))
- if BPSX=""
- QUIT
- Begin DoDot:2
- +60 SET CNT=CNT+1
- SET BPSDAT(CNT)=BPSOAP(BPSX)_U_$$GETPDIEN(BPSX)
- End DoDot:2
- End DoDot:1
- +61 ; Set Drug Benefit Qualifier
- +62 IF BPS509<0
- SET BPS509=0
- +63 ; Set Patient Pay Amount
- +64 SET BPS505=$$DFF2EXT^BPSECFM($PIECE($GET(^BPSR(BPSRESP,1000,1,500)),U,5))
- +65 ;
- +66 SET CNT=CNT+1
- SET BPSDAT(CNT)=BPS509_U_$$GETPDIEN("07")_U_BPS505
- +67 QUIT
- +68 ;
- GETPDIEN(CODE) ;
- +1 ; Get the Other Payer Amount Paid Qualifier IEN for BPS NCPCP OTHER
- +2 ; PAYER AMOUNT PAID QUAL file
- +3 IF $GET(CODE)=""
- QUIT ""
- +4 QUIT $ORDER(^BPS(9002313.2,"B",CODE,""))
- +5 ;
- GETRJCOD(BPRESP,BPARR) ;
- +1 ; Get the first five reject codes w/o getting duplicates
- +2 ; Input:
- +3 ; BPSRESP = IEN of BPS RESPONSE file
- +4 ; BPSARR1 = Array of Reject Codes
- +5 ;
- +6 IF '$GET(BPRESP)
- QUIT
- +7 IF '$DATA(^BPSR(BPRESP,1000))
- QUIT
- +8 NEW BPRCNT,BPRJ,BPPOS,BPRJCOD
- +9 ;
- +10 ; Default BPPOS to the first transaction in the RESPONSE multiple
- +11 ; We only want the first five reject codes and no duplicates
- +12 SET (BPRCNT,BPRJ)=0
- SET BPPOS=1
- +13 FOR
- SET BPRJ=$ORDER(^BPSR(BPRESP,1000,BPPOS,511,BPRJ))
- if +BPRJ=0
- QUIT
- Begin DoDot:1
- +14 SET BPRJCOD=$PIECE($GET(^BPSR(BPRESP,1000,BPPOS,511,BPRJ,0)),U)
- +15 if $LENGTH(BPRJCOD)=0
- QUIT
- +16 ; Only store if not a duplicate
- +17 IF '$DATA(BPARR(BPRJCOD))
- SET BPRCNT=BPRCNT+1
- SET BPARR(BPRCNT)=BPRJCOD
- End DoDot:1
- if BPRCNT>4
- QUIT
- +18 QUIT
- +19 ;BPSPRRX6