- BPSPRRX3 ;ALB/SS - ePharmacy secondary billing ;16-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.
- ;
- ;External reference to file 399.3 supported by IA 3822
- ;External reference to $$INSUR^IBBAPI supported by IA 4419
- ;External reference to $$PLANEPS^IBNCPDPU supported by IA 5572
- ;
- PROMPTS(RX,FILL,DOS,BPSPRARR) ;
- ;BPSPRARR - array to pass values determined earlier (if any) and to return user's input/corrections
- ;Input:
- ; RX - Prescription IEN
- ; FILL - Fill Number
- ; DOS - Date of Service
- ; BPSPRARR - Array of data passed by reference
- ;Returns
- ; 1 = the data is correct
- ; -1 = the data is not correct - Do not create the claim
- ;
- ; Check paramters
- I '$G(RX) Q -1
- I $G(FILL)="" Q -1
- I '$G(DOS) Q -1
- ;
- ;
- N BPQ,BPSQ,IEN59PR,DFN,BPSPLAN,BPX,BPSDFLT,BPSSET
- N BPSPIEN,BPSSET,BPCNT,BPSRJ,BPSPAID,RETV,TOTAL
- N BPRATTYP,BPSPDRJ,BPSPLNSL,BPX1,BPSFIEN,BPSPSARR,BPSPSHV
- N IEN59SEC,BPSRET,BPSINS
- ;
- S (BPQ,BPSQ)=0
- ;
- ; Other Payer IEN defaults to 1 since we don't do tertiary
- S BPSPIEN=1
- ;
- ; Get Primary BPS Transaction
- S IEN59PR=$$IEN59^BPSOSRX(RX,FILL,1)
- ;
- ; Get/validate Patient DFN
- S DFN=$P($G(^BPST(IEN59PR,0)),U,6)
- I DFN="" S DFN=$$RXAPI1^BPSUTIL1(RX,2,"I")
- I DFN="" Q -1
- ;
- ; Get patient insurances
- S BPSRET=$$INSUR^IBBAPI(DFN,DOS,"E",.BPSINS,"1,7,8")
- ;
- ; Get the first Secondary insurance for default
- S BPSPRARR("PLAN")="",BPSPRARR("INS NAME")="",(BPX,BPQ)=0
- F S BPX=$O(BPSINS("IBBAPI","INSUR",BPX)) Q:'BPX D Q:BPQ
- . I $P(BPSINS("IBBAPI","INSUR",BPX,7),U)'=2 Q
- . S BPSPRARR("PLAN")=$P(BPSINS("IBBAPI","INSUR",BPX,8),U)
- . S BPSPRARR("INS NAME")=$P(BPSINS("IBBAPI","INSUR",BPX,1),U,2)
- . S BPQ=1
- . Q
- ;
- ; Get Rate Type for the Secondary Insurance
- S IEN59SEC=$$IEN59^BPSOSRX(RX,FILL,2)
- S BPSPRARR("RTYPE")=$$GETRTP59^BPSPRRX5(IEN59SEC)
- I BPSPRARR("RTYPE")="" S BPSPRARR("RTYPE")=8
- ;
- ; Display current COB fields
- D DISPSEC(.BPSPRARR)
- ;
- S BPQ=0
- I $G(BPSPRARR("PLAN"))=""!($G(BPSPRARR("RTYPE"))="")!($G(BPSPRARR("308-C8"))="") S BPQ=1
- I BPSQ=0 F BPX=4,5 I $P($G(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,BPX)="" S BPQ=1
- I BPQ=0,'$D(BPSPRARR("OTHER PAYER",BPSPIEN,"P")),'$D(BPSPRARR("OTHER PAYER",BPSPIEN,"R")) S BPQ=1
- ;
- ; Prompt to continue or not
- W !
- I BPQ=1 W !,"Required secondary claim information is missing. Enter all required information",!
- E S BPQ=$$YESNO^BPSSCRRS("Do you want to edit this Secondary Claim Information (Y/N)","N") Q:BPQ=-1 -1 G:BPQ=0 END
- ;
- ; Prompt for Secondary Insurance Plan
- W !
- F D Q:BPSQ'=0
- . S BPSPLAN=$$SELECTPL^BPSPRRX1(DFN,DOS,.BPSPLNSL,"SECONDARY INSURANCE POLICY",$G(BPSPRARR("PLAN")))
- . I BPSPLAN=0 S BPSQ=-1 Q
- . I $P(BPSPLNSL(7),U)'=2 W !,"Must select a Secondary insurance plan." Q
- . S BPSPRARR("PLAN")=BPSPLAN
- . S BPSPRARR("INS NAME")=$P(BPSPLNSL(1),U,2)
- . S BPSPSHV=$$PAYSHTV(BPSPLAN)
- . S BPSQ=1
- Q:BPSQ=-1 -1
- ;
- ; Prompt for Rate Type and store in BPSPRARR("RTYPE")
- F S BPRATTYP=$$RATETYPE^BPSPRRX2($S($G(BPSPRARR("RTYPE"))]"":BPSPRARR("RTYPE"),1:8)) Q:BPRATTYP'=""
- I BPRATTYP=-1 Q -1
- S BPSPRARR("RTYPE")=BPRATTYP
- ;
- ; Prompt for OTHER COVERAGE CODE
- I $G(BPSPRARR("308-C8"))="" S BPSPRARR("308-C8")="04"
- S BPSSET="" D SET308(.BPSSET)
- S RETV=$$PROMPT("SRA"_U_BPSSET,"OTHER COVERAGE CODE: ",$G(BPSPRARR("308-C8")),"Indicate whether or not the patient has other insurance coverage")
- Q:RETV<0 -1
- S BPSPRARR("308-C8")=RETV
- ;
- ; Prompt for OTHER PAYER ID
- S BPSDFLT=$P($G(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,4)
- S RETV=$$PROMPT("FR"_U_"0:10:","OTHER PAYER ID",$G(BPSDFLT),"ID assigned to the payer") Q:RETV<0 -1
- Q:RETV=-1 -1
- S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,4)=RETV
- ;
- ; Prompt for OTHER PAYER DATE
- S BPSDFLT=$P($G(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,5)
- S RETV=$$PROMPT("DR"_U_"","OTHER PAYER DATE",$$FMTE^XLFDT($G(BPSDFLT)),"Payment or denial date of the claim submitted to the other payer. Used for coordination of benefits.")
- Q:RETV=-1 -1
- S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,5)=RETV
- ;
- ; Prompt for OTHER PAYER RECONCILIATION ID
- S BPSDFLT=+$P($G(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,11)
- S RETV=$$PROMPT("Fr"_U_"0:30:","OTHER PAYER RECONCILIATION ID",$G(BPSDFLT),"ID assigned to the Payer Reconciliation") Q:RETV<0 -1
- Q:RETV=-1 -1
- S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,11)=RETV
- ;
- ; Prompt for Paid Amount or Reject Codes
- S BPSSET="PAID:PAID AMOUNTS;REJECT:REJECT CODES"
- S BPSDFLT=""
- I $D(BPSPRARR("OTHER PAYER",BPSPIEN,"P")) S BPSDFLT="PAID AMOUNTS"
- I $D(BPSPRARR("OTHER PAYER",BPSPIEN,"R")) S BPSDFLT=$S(BPSDFLT="PAID AMOUNTS":"",1:"REJECT CODES")
- S BPSPDRJ=$$PROMPT("SRA"_U_BPSSET,"Edit Paid Amounts or Reject Codes (PAID AMOUNTS/REJECT CODES): ",BPSDFLT,"Edit the Paid Amounts or Reject Codes")
- Q:BPSPDRJ=-1 -1
- ;
- ; Prompt to edit paid amounts
- D:BPSPDRJ="PAID"
- . ; Remove reject codes.
- . K BPSPRARR("OTHER PAYER",BPSPIEN,"R")
- . S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,7)=""
- . ;
- . K BPSPAID
- . S (BPCNT,BPX,BPQ,TOTAL)=0
- . ; BPS NCPDP FIELD DEFS for field 342 codes
- . S BPSSET=$$GETCDLST(BPSPSHV)
- . F BPX1=0:1 S BPX=$O(BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX)) Q:'BPX D Q:BPQ=1
- . . S BPSQUAL=$P(BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX,0),U,2)
- . . S BPSQUAL=$$GET1^DIQ(9002313.2,BPSQUAL,.01)
- . . S BPSAMT=$P(BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX,0),U,1)
- . . S BPQ=$$ASKPAID(BPSSET,BPSQUAL,BPSAMT,.BPCNT,.BPSPAID)
- . ;
- . I 'BPQ F S BPQ=$$ASKPAID(BPSSET,"","",.BPCNT,.BPSPAID) Q:BPQ=1
- . ; Enter updated values into the BPSPRARR array
- . K BPSPRARR("OTHER PAYER",BPSPIEN,"P")
- . S BPX=0 F BPX1=0:1 S BPX=$O(BPSPAID(1,BPX)) Q:BPX="" D
- . . S BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX,0)=BPSPAID(1,BPX)
- . . S TOTAL=TOTAL+BPSPAID(1,BPX)
- . . ;
- . ; Set the OTHER PAYER AMOUNT PAID COUNT
- . S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,6)=BPX1
- . Q
- ;
- ; Edit/add reject codes
- D:BPSPDRJ="REJECT"
- . ; Remove paid amounts on the prior claim.
- . K BPSPRARR("OTHER PAYER",BPSPIEN,"P")
- . S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,6)=""
- . ;
- . K BPSRJ
- . S (BPCNT,BPX)=0
- . F BPX1=0:1 S BPX=$O(BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX)) Q:'BPX D Q:BPCNT>4
- . . S BPSDFLT=BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX,0)
- . . S RETV=$$PROMPT("PO^9002313.93:AEMQ","OTHER PAYER REJECT CODE",$G(BPSDFLT),"Enter the reject code returned by the previous payer")
- . . Q:RETV=-1
- . . S BPCNT=BPCNT+1,BPSRJ(BPCNT)=$P(RETV,U,2)
- . I BPCNT=5 W !,"Maximum of 5 OTHER PAYER REJECT CODES reached."
- . I BPCNT<5 F S RETV=$$PROMPT("PO^9002313.93:AEMQ","OTHER PAYER REJECT CODE","","Enter the reject code returned by the previous payer") Q:RETV=-1 D Q:BPCNT>4
- . . S BPCNT=BPCNT+1
- . . S BPSRJ(BPCNT)=$P(RETV,U,2)
- . . I BPCNT>4 W !,"Maximum of 5 OTHER PAYER REJECT CODES reached."
- . K BPSPRARR("OTHER PAYER",BPSPIEN,"R")
- . S BPX=0 F BPX1=0:1 S BPX=$O(BPSRJ(BPX)) Q:BPX="" S BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX,0)=BPSRJ(BPX)
- . ; Set the OTHER PAYER REJECT COUNT
- . S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,7)=BPX1
- . Q
- ;
- I '$D(BPSPRARR("OTHER PAYER",BPSPIEN,"P")),'$D(BPSPRARR("OTHER PAYER",BPSPIEN,"R")) W !,"No Paid Amounts or Reject Codes entered" Q -1
- ;
- ; Default OTHER PAYER COVERAGE TYPE to PRIMARY
- S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,2)="01"
- ;
- ; Default OTHER PAYER ID QUALIFIER to BIN
- S $P(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,3)="03"
- ;
- ; If the PRIOR PAYMENT is 0 but the user entered paid amounts, update the PRIOR PAYMENT
- I +$G(BPSPRARR("PRIOR PAYMENT"))=0,$D(BPSPRARR("OTHER PAYER",BPSPIEN,"P")) D
- . S BPSPRARR("PRIOR PAYMENT")=TOTAL
- . I TOTAL>0 S BPSPRARR("308-C8")="02"
- . E S BPSPRARR("308-C8")="04"
- ;
- END ;
- Q 1
- ;
- ;
- ASKPAID(BPSSET,BPSQUAL,BPSAMT,BPCNT,BPSPAID) ;
- N RETV1,RETV2,BPSX,BPSPRA,BPSQ S BPSQ=0
- I BPCNT>8 W !," Maximum of 9 OTHER PAYER AMOUNT PAID reached." Q 1
- ASK1 S RETV1=$$PROMPT("SOA"_U_BPSSET,"OTHER PAYER AMOUNT PAID QUALIFIER: ",$G(BPSQUAL),"Type of payment from other sources (including coupons)")
- I RETV1=-1!(RETV1="") Q 1
- I RETV1="08",$D(BPSPAID(2)) W !," Qualifier '08' cannot be entered with other qualifiers" G ASK1
- S RETV2=$$PROMPT("NO"_U_"0:999999.99:2","OTHER PAYER AMOUNT PAID",$G(BPSAMT),"Amount of any payment from other sources (including coupons)")
- I RETV2=-1!(RETV2="") Q 1
- ; Check for duplicate qualifiers and add Amount Paid to previous amount entered
- I $D(BPSPAID(2,RETV1)) D Q 0
- . S BPSX="" F S BPSX=$O(BPSPAID(1,BPSX)) Q:BPSX="" D Q:BPSQ
- . . I $P(BPSPAID(1,BPSX),U,2)=RETV1 D
- . . . S BPSPRA=$P(BPSPAID(1,BPSX),U),$P(BPSPAID(1,BPSX),U)=BPSPRA+RETV2,BPSQ=1
- . . . W !," $",$FN(RETV2,",",2)," has been added to amount $",$FN(BPSPRA,",",2)," for Qualifier ",RETV1
- S BPCNT=BPCNT+1
- S BPSPAID(1,BPCNT)=RETV2_U_$$GETPDIEN^BPSPRRX6(RETV1)
- S BPSPAID(2,RETV1)=""
- I RETV1="08" Q 1
- Q 0
- ;
- DISPSEC(BPSPRARR) ;
- ; Validate and Display the current secondary insurance information and prompt to edit.
- ; Input:
- ; BPSPRARR - Array of COB data, passed by reference
- ;
- N BPSPIEN,BPSCOB,BPSCOV,BPX,BPSCOV,DATA
- ;
- ; Other Payer IEN defaults to 1 since we don't do tertiary
- S BPSPIEN=1,BPSCOB="SECONDARY"
- ;
- ; Get Coverage Code
- S BPSCOV=$G(BPSPRARR("308-C8"))
- I BPSCOV="02" S BPSCOV="02 (OTHER COVERAGE EXISTS - PAYMENT COLLECTED)"
- E I BPSCOV="03" S BPSCOV="03 (OTHER COVERAGE EXISTS - THIS CLAIM NOT COVERED)"
- E S BPSCOV="04 (OTHER COVERAGE EXISTS - PAYMENT NOT COLLECTED)"
- ;
- ; Write Data
- W !!,"Data for Secondary Claim"
- W !,"------------------------"
- W !,"Insurance: "_$G(BPSPRARR("INS NAME"))_" COB: "_BPSCOB
- W !,"Rate Type: "_$$GET1^DIQ(399.3,$G(BPSPRARR("RTYPE"))_",",.01,,,,)
- W !,"Other Coverage Code: "_BPSCOV
- W !,"Other Payer Coverage Type: 01 (PRIMARY)"
- W !,"Other Payer ID Qualifier: 03 (BANK INFORMATION NUMBER (BIN))"
- W !,"Other Payer ID: "_$P($G(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,4)
- W !,"Other Payer Date: "_$$FMTE^XLFDT($P($G(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,5))
- W !,"Other Payer Reconciliation ID: "_$P($G(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,11)
- ;
- ; Write Paid Amounts if previous claim if they are there
- I $D(BPSPRARR("OTHER PAYER",BPSPIEN,"P")) D
- . S BPX=0 F S BPX=$O(BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX)) Q:BPX="" D
- . . S DATA=BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX,0)
- . . W !,"Other Payer Paid Qualifier: "_$$GET1^DIQ(9002313.2,$P(DATA,U,2),.01)_" ("_$$GET1^DIQ(9002313.2,$P(DATA,U,2),.02)_")"
- . . W !,"Other Payer Amount Paid: $"_$FN($P(DATA,U,1),",",2)
- . . I $P(DATA,U,3)'="" D
- . . . W !,"Other Payer Patient Resp Amount Qualifier: 06 (AMT REPORTED BY PRIOR PAYER)"
- . . . W !,"Other Payer Patient Resp Amount: $"_$FN($P(DATA,U,3),",",2)
- ;
- ; Write Reject Codes if previous claims if they are there
- I $D(BPSPRARR("OTHER PAYER",BPSPIEN,"R")) D
- . S BPX=0 F S BPX=$O(BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX)) Q:BPX="" D
- . . W !,"Other Payer Reject Code: "_$$TRANREJ^BPSECFM($G(BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX,0)))
- Q
- ;
- PROMPT(ZERONODE,PRMTMSG,DFLTVAL,BPSHLP) ;
- ;prompts for selection
- ;returns selection
- ;OR -1 when timeout and uparrow
- ;
- N Y,DUOUT,DTOUT,BPQUIT,DIROUT
- N DIR
- S DIR(0)=ZERONODE
- S DIR("A")=PRMTMSG
- I BPSHLP]"" S DIR("?")=BPSHLP
- S:$L($G(DFLTVAL))>0 DIR("B")=DFLTVAL
- D ^DIR
- I (Y=-1)!$D(DIROUT)!$D(DUOUT)!$D(DTOUT) Q -1
- Q Y
- ;
- GETCDLST(VERSION) ; Returns a list of codes by field/version for use in PROMPTS
- N CSUB,VSUB,ARRAY,X,BPSSET,BPSCD,BPSV,BPSOK
- S VERSION=$G(VERSION)
- S VERSION=$S(VERSION=5.1:51,VERSION=51:51,VERSION="D.0":"D0",VERSION="D0":"D0",1:"D0")
- S BPSSET=""
- S BPSCD=0 F S BPSCD=$O(^BPS(9002313.2,BPSCD)) Q:BPSCD="" D
- . S (BPSOK,BPSV)=0 F S BPSV=$O(^BPS(9002313.2,BPSCD,1,BPSV)) Q:BPSV="" D Q:BPSOK
- . . I $P($G(^BPS(9002313.2,BPSCD,1,BPSV,0)),U)=VERSION S BPSOK=1
- . I BPSOK S ARRAY(BPSCD)=$P(^BPS(9002313.2,BPSCD,0),U,1)_U_$P(^BPS(9002313.2,BPSCD,0),U,2)
- S X=0 F S X=$O(ARRAY(X)) Q:X="" D
- . S BPSSET=BPSSET_$P(ARRAY(X),U)_":"_$P(ARRAY(X),U,2)_";"
- Q BPSSET
- ;
- PAYSHTV(BPSPLAN) ;Get the Billing Payer Sheet version for this plan
- ; BPSPLAN = IEN to GROUP INSURANCE PLAN file #355.3
- N BPSPSH,BPSBPSH
- ; Get Payer Sheets
- S BPSPSH=$$PLANEPS^IBNCPDPU(BPSPLAN)
- ; Get Billing Payer Sheet
- I +BPSPSH S BPSBPSH=$P($P(BPSPSH,"^",2),",")
- I $G(BPSBPSH)']"" Q ""
- Q $P(^BPSF(9002313.92,BPSBPSH,1),U,2)
- ;
- ;because the set of codes is too long to fit the MUMPS code line - use a special code to populte set of codes
- SET308(BPSSET) ;
- N BPX,BPZ
- F BPX=2:1 S BPZ=$P($T(SET308C8+BPX),";;",2) Q:BPZ="" D
- . S BPSSET=BPSSET_$P(BPZ,U)_";"
- Q
- ;
- SET308C8 ;set of codes for 308-C8
- ; set of codes
- ;;00:NOT SPECIFIED BY PATIENT
- ;;01:NO OTHER COVERAGE IDENTIFIED
- ;;02:OTHER COVERAGE EXISTS - PAYMENT COLLECTED
- ;;03:OTHER COVERAGE BILLED - CLAIM NOT COVERED
- ;;04:OTHER COVERAGE EXISTS - PAYMENT NOT COLLECTED
- ;;08:CLAIM IS BILLING FOR PATIENT FINANCIAL RESPONSIBILITY ONLY
- ;;
- ;
- ;BPSPRRX3
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HBPSPRRX3 13051 printed Mar 13, 2025@20:57:02 Page 2
- BPSPRRX3 ;ALB/SS - ePharmacy secondary billing ;16-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 ;External reference to file 399.3 supported by IA 3822
- +5 ;External reference to $$INSUR^IBBAPI supported by IA 4419
- +6 ;External reference to $$PLANEPS^IBNCPDPU supported by IA 5572
- +7 ;
- PROMPTS(RX,FILL,DOS,BPSPRARR) ;
- +1 ;BPSPRARR - array to pass values determined earlier (if any) and to return user's input/corrections
- +2 ;Input:
- +3 ; RX - Prescription IEN
- +4 ; FILL - Fill Number
- +5 ; DOS - Date of Service
- +6 ; BPSPRARR - Array of data passed by reference
- +7 ;Returns
- +8 ; 1 = the data is correct
- +9 ; -1 = the data is not correct - Do not create the claim
- +10 ;
- +11 ; Check paramters
- +12 IF '$GET(RX)
- QUIT -1
- +13 IF $GET(FILL)=""
- QUIT -1
- +14 IF '$GET(DOS)
- QUIT -1
- +15 ;
- +16 ;
- +17 NEW BPQ,BPSQ,IEN59PR,DFN,BPSPLAN,BPX,BPSDFLT,BPSSET
- +18 NEW BPSPIEN,BPSSET,BPCNT,BPSRJ,BPSPAID,RETV,TOTAL
- +19 NEW BPRATTYP,BPSPDRJ,BPSPLNSL,BPX1,BPSFIEN,BPSPSARR,BPSPSHV
- +20 NEW IEN59SEC,BPSRET,BPSINS
- +21 ;
- +22 SET (BPQ,BPSQ)=0
- +23 ;
- +24 ; Other Payer IEN defaults to 1 since we don't do tertiary
- +25 SET BPSPIEN=1
- +26 ;
- +27 ; Get Primary BPS Transaction
- +28 SET IEN59PR=$$IEN59^BPSOSRX(RX,FILL,1)
- +29 ;
- +30 ; Get/validate Patient DFN
- +31 SET DFN=$PIECE($GET(^BPST(IEN59PR,0)),U,6)
- +32 IF DFN=""
- SET DFN=$$RXAPI1^BPSUTIL1(RX,2,"I")
- +33 IF DFN=""
- QUIT -1
- +34 ;
- +35 ; Get patient insurances
- +36 SET BPSRET=$$INSUR^IBBAPI(DFN,DOS,"E",.BPSINS,"1,7,8")
- +37 ;
- +38 ; Get the first Secondary insurance for default
- +39 SET BPSPRARR("PLAN")=""
- SET BPSPRARR("INS NAME")=""
- SET (BPX,BPQ)=0
- +40 FOR
- SET BPX=$ORDER(BPSINS("IBBAPI","INSUR",BPX))
- if 'BPX
- QUIT
- Begin DoDot:1
- +41 IF $PIECE(BPSINS("IBBAPI","INSUR",BPX,7),U)'=2
- QUIT
- +42 SET BPSPRARR("PLAN")=$PIECE(BPSINS("IBBAPI","INSUR",BPX,8),U)
- +43 SET BPSPRARR("INS NAME")=$PIECE(BPSINS("IBBAPI","INSUR",BPX,1),U,2)
- +44 SET BPQ=1
- +45 QUIT
- End DoDot:1
- if BPQ
- QUIT
- +46 ;
- +47 ; Get Rate Type for the Secondary Insurance
- +48 SET IEN59SEC=$$IEN59^BPSOSRX(RX,FILL,2)
- +49 SET BPSPRARR("RTYPE")=$$GETRTP59^BPSPRRX5(IEN59SEC)
- +50 IF BPSPRARR("RTYPE")=""
- SET BPSPRARR("RTYPE")=8
- +51 ;
- +52 ; Display current COB fields
- +53 DO DISPSEC(.BPSPRARR)
- +54 ;
- +55 SET BPQ=0
- +56 IF $GET(BPSPRARR("PLAN"))=""!($GET(BPSPRARR("RTYPE"))="")!($GET(BPSPRARR("308-C8"))="")
- SET BPQ=1
- +57 IF BPSQ=0
- FOR BPX=4,5
- IF $PIECE($GET(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,BPX)=""
- SET BPQ=1
- +58 IF BPQ=0
- IF '$DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"P"))
- IF '$DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"R"))
- SET BPQ=1
- +59 ;
- +60 ; Prompt to continue or not
- +61 WRITE !
- +62 IF BPQ=1
- WRITE !,"Required secondary claim information is missing. Enter all required information",!
- +63 IF '$TEST
- SET BPQ=$$YESNO^BPSSCRRS("Do you want to edit this Secondary Claim Information (Y/N)","N")
- if BPQ=-1
- QUIT -1
- if BPQ=0
- GOTO END
- +64 ;
- +65 ; Prompt for Secondary Insurance Plan
- +66 WRITE !
- +67 FOR
- Begin DoDot:1
- +68 SET BPSPLAN=$$SELECTPL^BPSPRRX1(DFN,DOS,.BPSPLNSL,"SECONDARY INSURANCE POLICY",$GET(BPSPRARR("PLAN")))
- +69 IF BPSPLAN=0
- SET BPSQ=-1
- QUIT
- +70 IF $PIECE(BPSPLNSL(7),U)'=2
- WRITE !,"Must select a Secondary insurance plan."
- QUIT
- +71 SET BPSPRARR("PLAN")=BPSPLAN
- +72 SET BPSPRARR("INS NAME")=$PIECE(BPSPLNSL(1),U,2)
- +73 SET BPSPSHV=$$PAYSHTV(BPSPLAN)
- +74 SET BPSQ=1
- End DoDot:1
- if BPSQ'=0
- QUIT
- +75 if BPSQ=-1
- QUIT -1
- +76 ;
- +77 ; Prompt for Rate Type and store in BPSPRARR("RTYPE")
- +78 FOR
- SET BPRATTYP=$$RATETYPE^BPSPRRX2($SELECT($GET(BPSPRARR("RTYPE"))]"":BPSPRARR("RTYPE"),1:8))
- if BPRATTYP'=""
- QUIT
- +79 IF BPRATTYP=-1
- QUIT -1
- +80 SET BPSPRARR("RTYPE")=BPRATTYP
- +81 ;
- +82 ; Prompt for OTHER COVERAGE CODE
- +83 IF $GET(BPSPRARR("308-C8"))=""
- SET BPSPRARR("308-C8")="04"
- +84 SET BPSSET=""
- DO SET308(.BPSSET)
- +85 SET RETV=$$PROMPT("SRA"_U_BPSSET,"OTHER COVERAGE CODE: ",$GET(BPSPRARR("308-C8")),"Indicate whether or not the patient has other insurance coverage")
- +86 if RETV<0
- QUIT -1
- +87 SET BPSPRARR("308-C8")=RETV
- +88 ;
- +89 ; Prompt for OTHER PAYER ID
- +90 SET BPSDFLT=$PIECE($GET(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,4)
- +91 SET RETV=$$PROMPT("FR"_U_"0:10:","OTHER PAYER ID",$GET(BPSDFLT),"ID assigned to the payer")
- if RETV<0
- QUIT -1
- +92 if RETV=-1
- QUIT -1
- +93 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,4)=RETV
- +94 ;
- +95 ; Prompt for OTHER PAYER DATE
- +96 SET BPSDFLT=$PIECE($GET(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,5)
- +97 SET RETV=$$PROMPT("DR"_U_"","OTHER PAYER DATE",$$FMTE^XLFDT($GET(BPSDFLT)),"Payment or denial date of the claim submitted to the other payer. Used for coordination of benefits.")
- +98 if RETV=-1
- QUIT -1
- +99 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,5)=RETV
- +100 ;
- +101 ; Prompt for OTHER PAYER RECONCILIATION ID
- +102 SET BPSDFLT=+$PIECE($GET(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,11)
- +103 SET RETV=$$PROMPT("Fr"_U_"0:30:","OTHER PAYER RECONCILIATION ID",$GET(BPSDFLT),"ID assigned to the Payer Reconciliation")
- if RETV<0
- QUIT -1
- +104 if RETV=-1
- QUIT -1
- +105 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,11)=RETV
- +106 ;
- +107 ; Prompt for Paid Amount or Reject Codes
- +108 SET BPSSET="PAID:PAID AMOUNTS;REJECT:REJECT CODES"
- +109 SET BPSDFLT=""
- +110 IF $DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"P"))
- SET BPSDFLT="PAID AMOUNTS"
- +111 IF $DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"R"))
- SET BPSDFLT=$SELECT(BPSDFLT="PAID AMOUNTS":"",1:"REJECT CODES")
- +112 SET BPSPDRJ=$$PROMPT("SRA"_U_BPSSET,"Edit Paid Amounts or Reject Codes (PAID AMOUNTS/REJECT CODES): ",BPSDFLT,"Edit the Paid Amounts or Reject Codes")
- +113 if BPSPDRJ=-1
- QUIT -1
- +114 ;
- +115 ; Prompt to edit paid amounts
- +116 if BPSPDRJ="PAID"
- Begin DoDot:1
- +117 ; Remove reject codes.
- +118 KILL BPSPRARR("OTHER PAYER",BPSPIEN,"R")
- +119 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,7)=""
- +120 ;
- +121 KILL BPSPAID
- +122 SET (BPCNT,BPX,BPQ,TOTAL)=0
- +123 ; BPS NCPDP FIELD DEFS for field 342 codes
- +124 SET BPSSET=$$GETCDLST(BPSPSHV)
- +125 FOR BPX1=0:1
- SET BPX=$ORDER(BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX))
- if 'BPX
- QUIT
- Begin DoDot:2
- +126 SET BPSQUAL=$PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX,0),U,2)
- +127 SET BPSQUAL=$$GET1^DIQ(9002313.2,BPSQUAL,.01)
- +128 SET BPSAMT=$PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX,0),U,1)
- +129 SET BPQ=$$ASKPAID(BPSSET,BPSQUAL,BPSAMT,.BPCNT,.BPSPAID)
- End DoDot:2
- if BPQ=1
- QUIT
- +130 ;
- +131 IF 'BPQ
- FOR
- SET BPQ=$$ASKPAID(BPSSET,"","",.BPCNT,.BPSPAID)
- if BPQ=1
- QUIT
- +132 ; Enter updated values into the BPSPRARR array
- +133 KILL BPSPRARR("OTHER PAYER",BPSPIEN,"P")
- +134 SET BPX=0
- FOR BPX1=0:1
- SET BPX=$ORDER(BPSPAID(1,BPX))
- if BPX=""
- QUIT
- Begin DoDot:2
- +135 SET BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX,0)=BPSPAID(1,BPX)
- +136 SET TOTAL=TOTAL+BPSPAID(1,BPX)
- +137 ;
- End DoDot:2
- +138 ; Set the OTHER PAYER AMOUNT PAID COUNT
- +139 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,6)=BPX1
- +140 QUIT
- End DoDot:1
- +141 ;
- +142 ; Edit/add reject codes
- +143 if BPSPDRJ="REJECT"
- Begin DoDot:1
- +144 ; Remove paid amounts on the prior claim.
- +145 KILL BPSPRARR("OTHER PAYER",BPSPIEN,"P")
- +146 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,6)=""
- +147 ;
- +148 KILL BPSRJ
- +149 SET (BPCNT,BPX)=0
- +150 FOR BPX1=0:1
- SET BPX=$ORDER(BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX))
- if 'BPX
- QUIT
- Begin DoDot:2
- +151 SET BPSDFLT=BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX,0)
- +152 SET RETV=$$PROMPT("PO^9002313.93:AEMQ","OTHER PAYER REJECT CODE",$GET(BPSDFLT),"Enter the reject code returned by the previous payer")
- +153 if RETV=-1
- QUIT
- +154 SET BPCNT=BPCNT+1
- SET BPSRJ(BPCNT)=$PIECE(RETV,U,2)
- End DoDot:2
- if BPCNT>4
- QUIT
- +155 IF BPCNT=5
- WRITE !,"Maximum of 5 OTHER PAYER REJECT CODES reached."
- +156 IF BPCNT<5
- FOR
- SET RETV=$$PROMPT("PO^9002313.93:AEMQ","OTHER PAYER REJECT CODE","","Enter the reject code returned by the previous payer")
- if RETV=-1
- QUIT
- Begin DoDot:2
- +157 SET BPCNT=BPCNT+1
- +158 SET BPSRJ(BPCNT)=$PIECE(RETV,U,2)
- +159 IF BPCNT>4
- WRITE !,"Maximum of 5 OTHER PAYER REJECT CODES reached."
- End DoDot:2
- if BPCNT>4
- QUIT
- +160 KILL BPSPRARR("OTHER PAYER",BPSPIEN,"R")
- +161 SET BPX=0
- FOR BPX1=0:1
- SET BPX=$ORDER(BPSRJ(BPX))
- if BPX=""
- QUIT
- SET BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX,0)=BPSRJ(BPX)
- +162 ; Set the OTHER PAYER REJECT COUNT
- +163 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,7)=BPX1
- +164 QUIT
- End DoDot:1
- +165 ;
- +166 IF '$DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"P"))
- IF '$DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"R"))
- WRITE !,"No Paid Amounts or Reject Codes entered"
- QUIT -1
- +167 ;
- +168 ; Default OTHER PAYER COVERAGE TYPE to PRIMARY
- +169 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,2)="01"
- +170 ;
- +171 ; Default OTHER PAYER ID QUALIFIER to BIN
- +172 SET $PIECE(BPSPRARR("OTHER PAYER",BPSPIEN,0),U,3)="03"
- +173 ;
- +174 ; If the PRIOR PAYMENT is 0 but the user entered paid amounts, update the PRIOR PAYMENT
- +175 IF +$GET(BPSPRARR("PRIOR PAYMENT"))=0
- IF $DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"P"))
- Begin DoDot:1
- +176 SET BPSPRARR("PRIOR PAYMENT")=TOTAL
- +177 IF TOTAL>0
- SET BPSPRARR("308-C8")="02"
- +178 IF '$TEST
- SET BPSPRARR("308-C8")="04"
- End DoDot:1
- +179 ;
- END ;
- +1 QUIT 1
- +2 ;
- +3 ;
- ASKPAID(BPSSET,BPSQUAL,BPSAMT,BPCNT,BPSPAID) ;
- +1 NEW RETV1,RETV2,BPSX,BPSPRA,BPSQ
- SET BPSQ=0
- +2 IF BPCNT>8
- WRITE !," Maximum of 9 OTHER PAYER AMOUNT PAID reached."
- QUIT 1
- ASK1 SET RETV1=$$PROMPT("SOA"_U_BPSSET,"OTHER PAYER AMOUNT PAID QUALIFIER: ",$GET(BPSQUAL),"Type of payment from other sources (including coupons)")
- +1 IF RETV1=-1!(RETV1="")
- QUIT 1
- +2 IF RETV1="08"
- IF $DATA(BPSPAID(2))
- WRITE !," Qualifier '08' cannot be entered with other qualifiers"
- GOTO ASK1
- +3 SET RETV2=$$PROMPT("NO"_U_"0:999999.99:2","OTHER PAYER AMOUNT PAID",$GET(BPSAMT),"Amount of any payment from other sources (including coupons)")
- +4 IF RETV2=-1!(RETV2="")
- QUIT 1
- +5 ; Check for duplicate qualifiers and add Amount Paid to previous amount entered
- +6 IF $DATA(BPSPAID(2,RETV1))
- Begin DoDot:1
- +7 SET BPSX=""
- FOR
- SET BPSX=$ORDER(BPSPAID(1,BPSX))
- if BPSX=""
- QUIT
- Begin DoDot:2
- +8 IF $PIECE(BPSPAID(1,BPSX),U,2)=RETV1
- Begin DoDot:3
- +9 SET BPSPRA=$PIECE(BPSPAID(1,BPSX),U)
- SET $PIECE(BPSPAID(1,BPSX),U)=BPSPRA+RETV2
- SET BPSQ=1
- +10 WRITE !," $",$FNUMBER(RETV2,",",2)," has been added to amount $",$FNUMBER(BPSPRA,",",2)," for Qualifier ",RETV1
- End DoDot:3
- End DoDot:2
- if BPSQ
- QUIT
- End DoDot:1
- QUIT 0
- +11 SET BPCNT=BPCNT+1
- +12 SET BPSPAID(1,BPCNT)=RETV2_U_$$GETPDIEN^BPSPRRX6(RETV1)
- +13 SET BPSPAID(2,RETV1)=""
- +14 IF RETV1="08"
- QUIT 1
- +15 QUIT 0
- +16 ;
- DISPSEC(BPSPRARR) ;
- +1 ; Validate and Display the current secondary insurance information and prompt to edit.
- +2 ; Input:
- +3 ; BPSPRARR - Array of COB data, passed by reference
- +4 ;
- +5 NEW BPSPIEN,BPSCOB,BPSCOV,BPX,BPSCOV,DATA
- +6 ;
- +7 ; Other Payer IEN defaults to 1 since we don't do tertiary
- +8 SET BPSPIEN=1
- SET BPSCOB="SECONDARY"
- +9 ;
- +10 ; Get Coverage Code
- +11 SET BPSCOV=$GET(BPSPRARR("308-C8"))
- +12 IF BPSCOV="02"
- SET BPSCOV="02 (OTHER COVERAGE EXISTS - PAYMENT COLLECTED)"
- +13 IF '$TEST
- IF BPSCOV="03"
- SET BPSCOV="03 (OTHER COVERAGE EXISTS - THIS CLAIM NOT COVERED)"
- +14 IF '$TEST
- SET BPSCOV="04 (OTHER COVERAGE EXISTS - PAYMENT NOT COLLECTED)"
- +15 ;
- +16 ; Write Data
- +17 WRITE !!,"Data for Secondary Claim"
- +18 WRITE !,"------------------------"
- +19 WRITE !,"Insurance: "_$GET(BPSPRARR("INS NAME"))_" COB: "_BPSCOB
- +20 WRITE !,"Rate Type: "_$$GET1^DIQ(399.3,$GET(BPSPRARR("RTYPE"))_",",.01,,,,)
- +21 WRITE !,"Other Coverage Code: "_BPSCOV
- +22 WRITE !,"Other Payer Coverage Type: 01 (PRIMARY)"
- +23 WRITE !,"Other Payer ID Qualifier: 03 (BANK INFORMATION NUMBER (BIN))"
- +24 WRITE !,"Other Payer ID: "_$PIECE($GET(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,4)
- +25 WRITE !,"Other Payer Date: "_$$FMTE^XLFDT($PIECE($GET(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,5))
- +26 WRITE !,"Other Payer Reconciliation ID: "_$PIECE($GET(BPSPRARR("OTHER PAYER",BPSPIEN,0)),U,11)
- +27 ;
- +28 ; Write Paid Amounts if previous claim if they are there
- +29 IF $DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"P"))
- Begin DoDot:1
- +30 SET BPX=0
- FOR
- SET BPX=$ORDER(BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX))
- if BPX=""
- QUIT
- Begin DoDot:2
- +31 SET DATA=BPSPRARR("OTHER PAYER",BPSPIEN,"P",BPX,0)
- +32 WRITE !,"Other Payer Paid Qualifier: "_$$GET1^DIQ(9002313.2,$PIECE(DATA,U,2),.01)_" ("_$$GET1^DIQ(9002313.2,$PIECE(DATA,U,2),.02)_")"
- +33 WRITE !,"Other Payer Amount Paid: $"_$FNUMBER($PIECE(DATA,U,1),",",2)
- +34 IF $PIECE(DATA,U,3)'=""
- Begin DoDot:3
- +35 WRITE !,"Other Payer Patient Resp Amount Qualifier: 06 (AMT REPORTED BY PRIOR PAYER)"
- +36 WRITE !,"Other Payer Patient Resp Amount: $"_$FNUMBER($PIECE(DATA,U,3),",",2)
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +37 ;
- +38 ; Write Reject Codes if previous claims if they are there
- +39 IF $DATA(BPSPRARR("OTHER PAYER",BPSPIEN,"R"))
- Begin DoDot:1
- +40 SET BPX=0
- FOR
- SET BPX=$ORDER(BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX))
- if BPX=""
- QUIT
- Begin DoDot:2
- +41 WRITE !,"Other Payer Reject Code: "_$$TRANREJ^BPSECFM($GET(BPSPRARR("OTHER PAYER",BPSPIEN,"R",BPX,0)))
- End DoDot:2
- End DoDot:1
- +42 QUIT
- +43 ;
- PROMPT(ZERONODE,PRMTMSG,DFLTVAL,BPSHLP) ;
- +1 ;prompts for selection
- +2 ;returns selection
- +3 ;OR -1 when timeout and uparrow
- +4 ;
- +5 NEW Y,DUOUT,DTOUT,BPQUIT,DIROUT
- +6 NEW DIR
- +7 SET DIR(0)=ZERONODE
- +8 SET DIR("A")=PRMTMSG
- +9 IF BPSHLP]""
- SET DIR("?")=BPSHLP
- +10 if $LENGTH($GET(DFLTVAL))>0
- SET DIR("B")=DFLTVAL
- +11 DO ^DIR
- +12 IF (Y=-1)!$DATA(DIROUT)!$DATA(DUOUT)!$DATA(DTOUT)
- QUIT -1
- +13 QUIT Y
- +14 ;
- GETCDLST(VERSION) ; Returns a list of codes by field/version for use in PROMPTS
- +1 NEW CSUB,VSUB,ARRAY,X,BPSSET,BPSCD,BPSV,BPSOK
- +2 SET VERSION=$GET(VERSION)
- +3 SET VERSION=$SELECT(VERSION=5.1:51,VERSION=51:51,VERSION="D.0":"D0",VERSION="D0":"D0",1:"D0")
- +4 SET BPSSET=""
- +5 SET BPSCD=0
- FOR
- SET BPSCD=$ORDER(^BPS(9002313.2,BPSCD))
- if BPSCD=""
- QUIT
- Begin DoDot:1
- +6 SET (BPSOK,BPSV)=0
- FOR
- SET BPSV=$ORDER(^BPS(9002313.2,BPSCD,1,BPSV))
- if BPSV=""
- QUIT
- Begin DoDot:2
- +7 IF $PIECE($GET(^BPS(9002313.2,BPSCD,1,BPSV,0)),U)=VERSION
- SET BPSOK=1
- End DoDot:2
- if BPSOK
- QUIT
- +8 IF BPSOK
- SET ARRAY(BPSCD)=$PIECE(^BPS(9002313.2,BPSCD,0),U,1)_U_$PIECE(^BPS(9002313.2,BPSCD,0),U,2)
- End DoDot:1
- +9 SET X=0
- FOR
- SET X=$ORDER(ARRAY(X))
- if X=""
- QUIT
- Begin DoDot:1
- +10 SET BPSSET=BPSSET_$PIECE(ARRAY(X),U)_":"_$PIECE(ARRAY(X),U,2)_";"
- End DoDot:1
- +11 QUIT BPSSET
- +12 ;
- PAYSHTV(BPSPLAN) ;Get the Billing Payer Sheet version for this plan
- +1 ; BPSPLAN = IEN to GROUP INSURANCE PLAN file #355.3
- +2 NEW BPSPSH,BPSBPSH
- +3 ; Get Payer Sheets
- +4 SET BPSPSH=$$PLANEPS^IBNCPDPU(BPSPLAN)
- +5 ; Get Billing Payer Sheet
- +6 IF +BPSPSH
- SET BPSBPSH=$PIECE($PIECE(BPSPSH,"^",2),",")
- +7 IF $GET(BPSBPSH)']""
- QUIT ""
- +8 QUIT $PIECE(^BPSF(9002313.92,BPSBPSH,1),U,2)
- +9 ;
- +10 ;because the set of codes is too long to fit the MUMPS code line - use a special code to populte set of codes
- SET308(BPSSET) ;
- +1 NEW BPX,BPZ
- +2 FOR BPX=2:1
- SET BPZ=$PIECE($TEXT(SET308C8+BPX),";;",2)
- if BPZ=""
- QUIT
- Begin DoDot:1
- +3 SET BPSSET=BPSSET_$PIECE(BPZ,U)_";"
- End DoDot:1
- +4 QUIT
- +5 ;
- SET308C8 ;set of codes for 308-C8
- +1 ; set of codes
- +2 ;;00:NOT SPECIFIED BY PATIENT
- +3 ;;01:NO OTHER COVERAGE IDENTIFIED
- +4 ;;02:OTHER COVERAGE EXISTS - PAYMENT COLLECTED
- +5 ;;03:OTHER COVERAGE BILLED - CLAIM NOT COVERED
- +6 ;;04:OTHER COVERAGE EXISTS - PAYMENT NOT COLLECTED
- +7 ;;08:CLAIM IS BILLING FOR PATIENT FINANCIAL RESPONSIBILITY ONLY
- +8 ;;
- +9 ;
- +10 ;BPSPRRX3