BPSOSRX3 ;ALB/SS - ECME REQUESTS ;02-JAN-08
 ;;1.0;E CLAIMS MGMT ENGINE;**7,8,10,11,23,24,40**;JUN 2004;Build 25
 ;;Per VA Directive 6402, this routine should not be modified.
 ;
 ;Input
 ;BPREQTYP - request type:
 ; "C" - Submit a claim to ECME
 ;  If the claim has already been processed, and it's  resubmitted, then a reversal will be
 ;   done first, and then the resubmit. Intervening call to $$STATUS may show progress 
 ;  of the reversal before the resubmitted claim is processed.
 ; "U"- Reverse submitted claim.
 ;  The reversal will actually be done ONLY if the  most recent processing of the claim
 ;   resulted in something reversible, namely E PAYABLE or E REVERSAL REJECTED
 ; "E" - Eligibility Verification Request
 ;KEY1 - First Key for the BPS Request file
 ;KEY2 - Second Key for the BPS Request file
 ;MOREDATA - Array of data for transaction/claim
 ;BPCOBIND - payer sequence
 ;BILLNDC - NDC passed into EN^BPSNCPDP sent in BILLNDC variable or determined by EN^BPSNCPDP if it was null 
 ;at the very first time when EN^BPSNCPDP was called in "F" (foreground) mode
 ;BPSKIP(optional)=1 : skip the field, used when CLAIM request is created while the previous 
 ;request is in progress. That means - billing determination will be done upon activation)
 ;Return values:
 ; 1^BPS REQUEST ien = accepted for processing
 ; 0^reason = failure (should never happen)
MKRQST(BPREQTYP,KEY1,KEY2,MOREDATA,BPIENS78,BPCOBIND,BILLNDC,BPSKIP) ;
 N BPIEN77,BPCOB,BPQ,BPIEN772,BPERRMSG,BPIEN59,BPIEN78,BPZ
 N RETVAL,STAT,TYPE,RESULT,SUBMITDT,BPNOW,BPACTTYP,BP77LCK
 N DUR,BPIEN771,BPCNT,BPSDUPL
 S BPSKIP=+$G(BPSKIP)
 I $G(BPREQTYP)="" Q "0^Parameter error-Request Type"
 I '$G(KEY1) Q "0^Parameter error-Key1"
 I BPREQTYP="E",$G(KEY2)'>9000 Q "0^Parameter error-Key2 for eligibility"
 I '$G(BPCOBIND)="" Q "0^Parameter error-COB Indicator"
 I '$G(KEY2) S KEY2=0
 S BPIEN59=+$$IEN59^BPSOSRX(KEY1,KEY2,BPCOBIND)
 ;
 ;new record
 S BPERRMSG="Cannot create record in BPS REQUEST"
 S BPIEN77=$$INSITEM^BPSUTIL2(9002313.77,"",KEY1,"","","^BPS(9002313.77)",10)
 I BPIEN77<1 Q "0^"_BPERRMSG
 S BPNOW=$$NOW^BPSOSRX()
 S BPACTTYP=$G(MOREDATA("RX ACTION"))
 ; fill out the fields
 S BPERRMSG="Missing data for the "
 I $$FILLFLDS^BPSUTIL2(9002313.77,".02",BPIEN77,KEY2)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,.02)
 I $$FILLFLDS^BPSUTIL2(9002313.77,".03",BPIEN77,BPCOBIND)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,.03)
 ;set delay with the testing tool
 S BPZ=+$$SETDELAY^BPSTEST(BPIEN59) I BPZ>0 I $$FILLFLDS^BPSUTIL2(9002313.77,".08",BPIEN77,BPZ)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,.08)
 ;set the process flag to "WAITING"
 I $$FILLFLDS^BPSUTIL2(9002313.77,".04",BPIEN77,0)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,.04)
 I $$FILLFLDS^BPSUTIL2(9002313.77,"6.01",BPIEN77,BPNOW)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,6.01)
 I $$FILLFLDS^BPSUTIL2(9002313.77,"6.05",BPIEN77,BPNOW)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,6.05)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"6.02") I $$FILLFLDS^BPSUTIL2(9002313.77,"6.02",BPIEN77,+$G(MOREDATA("USER")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,6.02)
 I $$FILLFLDS^BPSUTIL2(9002313.77,"6.06",BPIEN77,+DUZ)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,6.06)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"1.01") I $$FILLFLDS^BPSUTIL2(9002313.77,"1.01",BPIEN77,$G(MOREDATA("RX ACTION")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.01)
 I $G(MOREDATA("DIVISION")),$$FILLFLDS^BPSUTIL2(9002313.77,"1.02",BPIEN77,MOREDATA("DIVISION"))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.02)
 I $$FILLFLDS^BPSUTIL2(9002313.77,"1.04",BPIEN77,BPREQTYP)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.04)
 ;if this is a queued "C" request then the billing will be done again upon activation so MOREDATA(BILL) is undefined
 ;that is why we are not checking this field
 I $$ACTFIELD(BPSKIP,BPREQTYP,"1.05") I $$FILLFLDS^BPSUTIL2(9002313.77,"1.05",BPIEN77,$P($G(MOREDATA("BILL")),U))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.05)
 I '$D(MOREDATA("ELIG")) I $$ACTFIELD(BPSKIP,BPREQTYP,"1.06") I $$FILLFLDS^BPSUTIL2(9002313.77,"1.06",BPIEN77,$P($G(MOREDATA("BILL")),U,3))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.06)
 I $D(MOREDATA("ELIG")) I $$ACTFIELD(BPSKIP,BPREQTYP,"1.06") I $$FILLFLDS^BPSUTIL2(9002313.77,"1.06",BPIEN77,$G(MOREDATA("ELIG")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.06)
 I $P($G(MOREDATA("BILL")),U,2)'="" I $$ACTFIELD(BPSKIP,BPREQTYP,"1.07") I $$FILLFLDS^BPSUTIL2(9002313.77,"1.07",BPIEN77,$P($G(MOREDATA("BILL")),U,2))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.07)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"1.13") I $$FILLFLDS^BPSUTIL2(9002313.77,"1.13",BPIEN77,$G(MOREDATA("RX")))<1,BPREQTYP'="E" Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.13)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"1.14") I $$FILLFLDS^BPSUTIL2(9002313.77,"1.14",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,4))<1,BPREQTYP'="E" Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.14)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"1.15") I $$FILLFLDS^BPSUTIL2(9002313.77,"1.15",BPIEN77,$G(MOREDATA("PATIENT")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.15)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"1.16"),$$FILLFLDS^BPSUTIL2(9002313.77,"1.16",BPIEN77,$P($G(MOREDATA("IBDATA",1,3)),U,7))<1,BPREQTYP="E" Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.16)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"2.01") I $$FILLFLDS^BPSUTIL2(9002313.77,"2.01",BPIEN77,+$G(MOREDATA("DATE OF SERVICE")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.01)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"2.02") I $$FILLFLDS^BPSUTIL2(9002313.77,"2.02",BPIEN77,$G(MOREDATA("REVERSAL REASON")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.02)
 I $L($G(MOREDATA("BPOVRIEN")))>0 I $$FILLFLDS^BPSUTIL2(9002313.77,"2.04",BPIEN77,$G(MOREDATA("BPOVRIEN")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.04)
 I $L($G(MOREDATA("BPSCLARF")))>0 I $$FILLFLDS^BPSUTIL2(9002313.77,"2.05",BPIEN77,$G(MOREDATA("BPSCLARF")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.05)
 I $L($G(BILLNDC))>0 I $$FILLFLDS^BPSUTIL2(9002313.77,"2.06",BPIEN77,BILLNDC)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.06)
 I $L($P($G(MOREDATA("BPSAUTH")),U))>0 I $$FILLFLDS^BPSUTIL2(9002313.77,"2.07",BPIEN77,$E($P(MOREDATA("BPSAUTH"),U,1),1,2))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.07)
 I $L($P($G(MOREDATA("BPSAUTH")),U,2))>0 I $$FILLFLDS^BPSUTIL2(9002313.77,"2.08",BPIEN77,$E($P(MOREDATA("BPSAUTH"),U,2),1,11))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.08)
 I $L($G(MOREDATA("BPSDELAY")))>0,$$FILLFLDS^BPSUTIL2(9002313.77,"2.1",BPIEN77,MOREDATA("BPSDELAY"))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.1)
 I $G(MOREDATA("BPSDX"))'="" I $$FILLFLDS^BPSUTIL2(9002313.77,"2.11",BPIEN77,$G(MOREDATA("BPSDX")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.11)
 I $$ACTFIELD(BPSKIP,BPREQTYP,"4.01") I $$FILLFLDS^BPSUTIL2(9002313.77,"4.01",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,1))
 I $$ACTFIELD(BPSKIP,BPREQTYP,"4.02") I $$FILLFLDS^BPSUTIL2(9002313.77,"4.02",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,2))
 I $$ACTFIELD(BPSKIP,BPREQTYP,"4.03") I $$FILLFLDS^BPSUTIL2(9002313.77,"4.03",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,3))
 I $$ACTFIELD(BPSKIP,BPREQTYP,"4.04"),$$FILLFLDS^BPSUTIL2(9002313.77,"4.04",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,4))
 I $P($G(MOREDATA("BPSDATA",1)),U,5)'="" I $$ACTFIELD(BPSKIP,BPREQTYP,"4.05") I $$FILLFLDS^BPSUTIL2(9002313.77,"4.05",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,5))
 I $P($G(MOREDATA("BPSDATA",1)),U,6)'="" I $$ACTFIELD(BPSKIP,BPREQTYP,"4.06") I $$FILLFLDS^BPSUTIL2(9002313.77,"4.06",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,6))
 I $$ACTFIELD(BPSKIP,BPREQTYP,"4.07") I $$FILLFLDS^BPSUTIL2(9002313.77,"4.07",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,7))
 I $$ACTFIELD(BPSKIP,BPREQTYP,"4.08") I $$FILLFLDS^BPSUTIL2(9002313.77,"4.08",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,8))
 I $$ACTFIELD(BPSKIP,BPREQTYP,"4.09") I $$FILLFLDS^BPSUTIL2(9002313.77,"4.09",BPIEN77,$P($G(MOREDATA("BPSDATA",1)),U,9))
 I $G(MOREDATA("CLOSE AFT REV"))=1 I $$FILLFLDS^BPSUTIL2(9002313.77,"7.01",BPIEN77,1)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,7.01)
 I $G(MOREDATA("CLOSE AFT REV REASON"))>0 I $$FILLFLDS^BPSUTIL2(9002313.77,"7.02",BPIEN77,+$G(MOREDATA("CLOSE AFT REV REASON")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,7.02)
 I $L($G(MOREDATA("CLOSE AFT REV COMMENT")))>0 I $$FILLFLDS^BPSUTIL2(9002313.77,"7.03",BPIEN77,$G(MOREDATA("CLOSE AFT REV COMMENT")))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,7.03)
 I $G(BPSARRY("SC/EI OVR"))=1 I $$FILLFLDS^BPSUTIL2(9002313.77,"2.09",BPIEN77,1)<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.09)
 ;
 ; secondary billing and primary Tricare billing related fields
 I $G(MOREDATA("RTYPE"))'="" I $$FILLFLDS^BPSUTIL2(9002313.77,"1.08",BPIEN77,MOREDATA("RTYPE"))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.08)
 I $G(MOREDATA("PRIMARY BILL"))'="" I $$FILLFLDS^BPSUTIL2(9002313.77,"1.09",BPIEN77,MOREDATA("PRIMARY BILL"))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.09)
 I $G(MOREDATA("PRIOR PAYMENT"))'="" I $$FILLFLDS^BPSUTIL2(9002313.77,"1.1",BPIEN77,MOREDATA("PRIOR PAYMENT"))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.1)
 I $G(MOREDATA("337-4C"))'="" I $$FILLFLDS^BPSUTIL2(9002313.77,1.11,BPIEN77,MOREDATA("337-4C"))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.11)   ; cob other payments count
 I $G(MOREDATA("308-C8"))'="" I $$FILLFLDS^BPSUTIL2(9002313.77,1.12,BPIEN77,MOREDATA("308-C8"))<1 Q "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.12)   ; other coverage code
 ;
 ; store secondary billing related data entered by the user - esg 6/8/10
 S BPQ=0,BPERRMSG=""
 I BPCOBIND=2 D
 . N AMTIEN,BPIEN1,BPIEN2,BPIEN778,BPZ,BPZ1,BPZ2,OPAMT,OPAPQ,OPAYD,OPPRA,OPREJ,PIEN,REJIEN
 . 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,BPERRMSG="Can't have both payments and rejects for the same OTHER PAYER" Q
 .. ;
 .. ; add a new entry to subfile 9002313.778
 .. S BPIEN778=$$INSITEM^BPSUTIL2(9002313.778,BPIEN77,PIEN,PIEN,"",,0)
 .. I BPIEN778<1 S BPERRMSG="Can't create entry in COB OTHER PAYERS multiple of the BPS REQUESTS file",BPQ=1 Q
 .. S BPERRMSG="Can't populate field in COB OTHER PAYERS multiple"   ; just in case BPQ is set below
 .. ;
 .. ; set the rest of the pieces at this level
 .. I $P(OPAYD,U,2)'="" I $$FILLFLDS^BPSUTIL2(9002313.778,.02,PIEN_","_BPIEN77,$P(OPAYD,U,2))<1 S BPQ=1 Q
 .. I $P(OPAYD,U,3)'="" I $$FILLFLDS^BPSUTIL2(9002313.778,.03,PIEN_","_BPIEN77,$P(OPAYD,U,3))<1 S BPQ=1 Q
 .. I $P(OPAYD,U,4)'="" I $$FILLFLDS^BPSUTIL2(9002313.778,.04,PIEN_","_BPIEN77,$P(OPAYD,U,4))<1 S BPQ=1 Q
 .. I $P(OPAYD,U,5)'="" I $$FILLFLDS^BPSUTIL2(9002313.778,.05,PIEN_","_BPIEN77,$P(OPAYD,U,5))<1 S BPQ=1 Q
 .. I $$FILLFLDS^BPSUTIL2(9002313.778,.06,PIEN_","_BPIEN77,BPZ1)<1 S BPQ=1 Q
 .. I $$FILLFLDS^BPSUTIL2(9002313.778,.07,PIEN_","_BPIEN77,BPZ2)<1 S BPQ=1 Q
 .. I $P(OPAYD,U,11)'="" I $$FILLFLDS^BPSUTIL2(9002313.778,.11,PIEN_","_BPIEN77,$P(OPAYD,U,11))<1 S BPQ=1 Q
 .. S BPERRMSG=""
 .. ;
 .. ; 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.7781
 ... S BPIEN1=$$INSITEM^BPSUTIL2(9002313.7781,PIEN_","_BPIEN77,OPAMT,AMTIEN,"",,0)
 ... I BPIEN1<1 S BPERRMSG="Can't create entry in 9002313.7781 subfile",BPQ=1 Q
 ... ;
 ... ; set piece 2
 ... I OPAPQ'="" I $$FILLFLDS^BPSUTIL2(9002313.7781,.02,AMTIEN_","_PIEN_","_BPIEN77,OPAPQ)<1 D
 .... S BPQ=1,BPERRMSG="Can't populate .02 field in 9002313.7781 subfile"
 .... Q
 ... ;
 ... ; set piece 3
 ... I OPPRA'="" I $$FILLFLDS^BPSUTIL2(9002313.7781,.03,AMTIEN_","_PIEN_","_BPIEN77,OPPRA)<1 D
 .... S BPQ=1,BPERRMSG="Can't populate .03 field in 9002313.7781 subfile"
 .... 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.7782
 ... S BPIEN2=$$INSITEM^BPSUTIL2(9002313.7782,PIEN_","_BPIEN77,$P(OPREJ,U,1),REJIEN,"",,0)
 ... I BPIEN2<1 S BPERRMSG="Can't create entry in 9002313.7782 subfile",BPQ=1 Q
 ... Q
 .. Q
 . Q
 I BPQ Q "0^"_BPERRMSG_" (COB DATA)"
 ;
 ;store DURREC info
 S BPQ=0
 S DUR=0
 F  S DUR=$O(MOREDATA("DUR",DUR)) Q:+DUR=0!(BPQ=1)  D
 . S BPIEN771=$$INSITEM^BPSUTIL2(9002313.771,BPIEN77,$P(MOREDATA("DUR",DUR,0),U),DUR,"",,0)
 . I BPIEN771<1 S BPERRMSG="Cannot create DUR record in DUR multiple of the BPS REQUEST file",BPQ=1 Q
 . S BPERRMSG="Cannot populate a field in DUR multiple"
 . I $$FILLFLDS^BPSUTIL2(9002313.771,".02",DUR_","_BPIEN77,$P(MOREDATA("DUR",DUR,0),U,2))<1 S BPQ=1 Q
 . I $$FILLFLDS^BPSUTIL2(9002313.771,".03",DUR_","_BPIEN77,$P(MOREDATA("DUR",DUR,0),U,3))<1 S BPQ=1 Q
 I BPQ=1 Q "0^"_BPERRMSG_" DUR DATA"
 ;
 ;store ins to IB INSURER DATA
 S BPQ=0
 S BPCOB=0 F  S BPCOB=$O(BPIENS78(BPCOB)) Q:+BPCOB=0!(BPQ=1)  D
 . S BPIEN772=$$INSITEM^BPSUTIL2(9002313.772,BPIEN77,BPCOB,BPCOB,"",,0)
 . I BPIEN772<1 S BPERRMSG="Cannot create record in IBDATA multiple of the BPS REQUEST file",BPQ=1 Q
 . S BPERRMSG="Cannot populate a field in IBDATA multiple"
 . I $$FILLFLDS^BPSUTIL2(9002313.772,".02",BPCOB_","_BPIEN77,$S(BPCOBIND=BPCOB:1,1:0))<1 S BPQ=1 Q
 . I $$FILLFLDS^BPSUTIL2(9002313.772,".03",BPCOB_","_BPIEN77,BPIENS78(BPCOB))<1 S BPQ=1 Q
 I BPQ=1 Q "0^"_BPERRMSG_"INSURER DATA"
 ;
 ;return 1 (success) and IEN of the 9002313.77 entry
 Q "1^"_BPIEN77
 ;
 ;check if the field is used in MOREDATA for the specified REQUEST TYPE - CLAIM="C" /UNCLAIM="U"
ACTFIELD(BPSKIP,BPREQTYP,BPFLD) ;
 ;For Reversal or Skip, only do RX Action, Date of Service, Reversal Reason, and User who made the Request
 I (BPREQTYP="U")!(BPSKIP=1) Q ";1.01;2.01;2.02;6.02;"[(";"_BPFLD_";")
 ;For Eligibility Verification, skip Eligibility
 I BPREQTYP="E",";1.06;"[(";"_BPFLD_";") Q 0
 Q 1
 ;
 ;Lock BPS REQUEST
LOCK77(BPTIMOUT,IEN59,BPSRC) ;
 N BPRET
 L +^BPS(9002313.77):+$G(BPTIMOUT)
 S BPRET=$T
 I $G(IEN59)>0 D LOG^BPSOSL(IEN59,$G(BPSRC)_$S(BPRET=1:"-Lock",1:"-Failed to Lock")_" BPS REQUEST file")
 Q BPRET
 ;
 ;UnLock BPS REQUEST
UNLOCK77(IEN59,BPSRC) ;
 L -^BPS(9002313.77)
 I $G(IEN59)>0 D LOG^BPSOSL(IEN59,$G(BPSRC)_"-Unlock BPS REQUEST file")
 Q
 ;
 ;BP77 - ien of BPS REQUEST
ERRFIELD(BP77,BPRFILE,BPMESS,BPFILENO,BPFLDNO) ;
 I $G(BP77)>0 D DELREQST^BPSOSRX4(BP77) ;delete incomplete record
 Q $$FIELDMSG^BPSOSRX2(BPRFILE,BPMESS,BPFILENO,BPFLDNO)
 ;
 ;BPSOSRX3
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HBPSOSRX3   15314     printed  Sep 23, 2025@19:28:14                                                                                                                                                                                                   Page 2
BPSOSRX3  ;ALB/SS - ECME REQUESTS ;02-JAN-08
 +1       ;;1.0;E CLAIMS MGMT ENGINE;**7,8,10,11,23,24,40**;JUN 2004;Build 25
 +2       ;;Per VA Directive 6402, this routine should not be modified.
 +3       ;
 +4       ;Input
 +5       ;BPREQTYP - request type:
 +6       ; "C" - Submit a claim to ECME
 +7       ;  If the claim has already been processed, and it's  resubmitted, then a reversal will be
 +8       ;   done first, and then the resubmit. Intervening call to $$STATUS may show progress 
 +9       ;  of the reversal before the resubmitted claim is processed.
 +10      ; "U"- Reverse submitted claim.
 +11      ;  The reversal will actually be done ONLY if the  most recent processing of the claim
 +12      ;   resulted in something reversible, namely E PAYABLE or E REVERSAL REJECTED
 +13      ; "E" - Eligibility Verification Request
 +14      ;KEY1 - First Key for the BPS Request file
 +15      ;KEY2 - Second Key for the BPS Request file
 +16      ;MOREDATA - Array of data for transaction/claim
 +17      ;BPCOBIND - payer sequence
 +18      ;BILLNDC - NDC passed into EN^BPSNCPDP sent in BILLNDC variable or determined by EN^BPSNCPDP if it was null 
 +19      ;at the very first time when EN^BPSNCPDP was called in "F" (foreground) mode
 +20      ;BPSKIP(optional)=1 : skip the field, used when CLAIM request is created while the previous 
 +21      ;request is in progress. That means - billing determination will be done upon activation)
 +22      ;Return values:
 +23      ; 1^BPS REQUEST ien = accepted for processing
 +24      ; 0^reason = failure (should never happen)
MKRQST(BPREQTYP,KEY1,KEY2,MOREDATA,BPIENS78,BPCOBIND,BILLNDC,BPSKIP) ;
 +1        NEW BPIEN77,BPCOB,BPQ,BPIEN772,BPERRMSG,BPIEN59,BPIEN78,BPZ
 +2        NEW RETVAL,STAT,TYPE,RESULT,SUBMITDT,BPNOW,BPACTTYP,BP77LCK
 +3        NEW DUR,BPIEN771,BPCNT,BPSDUPL
 +4        SET BPSKIP=+$GET(BPSKIP)
 +5        IF $GET(BPREQTYP)=""
               QUIT "0^Parameter error-Request Type"
 +6        IF '$GET(KEY1)
               QUIT "0^Parameter error-Key1"
 +7        IF BPREQTYP="E"
               IF $GET(KEY2)'>9000
                   QUIT "0^Parameter error-Key2 for eligibility"
 +8        IF '$GET(BPCOBIND)=""
               QUIT "0^Parameter error-COB Indicator"
 +9        IF '$GET(KEY2)
               SET KEY2=0
 +10       SET BPIEN59=+$$IEN59^BPSOSRX(KEY1,KEY2,BPCOBIND)
 +11      ;
 +12      ;new record
 +13       SET BPERRMSG="Cannot create record in BPS REQUEST"
 +14       SET BPIEN77=$$INSITEM^BPSUTIL2(9002313.77,"",KEY1,"","","^BPS(9002313.77)",10)
 +15       IF BPIEN77<1
               QUIT "0^"_BPERRMSG
 +16       SET BPNOW=$$NOW^BPSOSRX()
 +17       SET BPACTTYP=$GET(MOREDATA("RX ACTION"))
 +18      ; fill out the fields
 +19       SET BPERRMSG="Missing data for the "
 +20       IF $$FILLFLDS^BPSUTIL2(9002313.77,".02",BPIEN77,KEY2)<1
               QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,.02)
 +21       IF $$FILLFLDS^BPSUTIL2(9002313.77,".03",BPIEN77,BPCOBIND)<1
               QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,.03)
 +22      ;set delay with the testing tool
 +23       SET BPZ=+$$SETDELAY^BPSTEST(BPIEN59)
           IF BPZ>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,".08",BPIEN77,BPZ)<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,.08)
 +24      ;set the process flag to "WAITING"
 +25       IF $$FILLFLDS^BPSUTIL2(9002313.77,".04",BPIEN77,0)<1
               QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,.04)
 +26       IF $$FILLFLDS^BPSUTIL2(9002313.77,"6.01",BPIEN77,BPNOW)<1
               QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,6.01)
 +27       IF $$FILLFLDS^BPSUTIL2(9002313.77,"6.05",BPIEN77,BPNOW)<1
               QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,6.05)
 +28       IF $$ACTFIELD(BPSKIP,BPREQTYP,"6.02")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"6.02",BPIEN77,+$GET(MOREDATA("USER")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,6.02)
 +29       IF $$FILLFLDS^BPSUTIL2(9002313.77,"6.06",BPIEN77,+DUZ)<1
               QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,6.06)
 +30       IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.01")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.01",BPIEN77,$GET(MOREDATA("RX ACTION")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.01)
 +31       IF $GET(MOREDATA("DIVISION"))
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.02",BPIEN77,MOREDATA("DIVISION"))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.02)
 +32       IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.04",BPIEN77,BPREQTYP)<1
               QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.04)
 +33      ;if this is a queued "C" request then the billing will be done again upon activation so MOREDATA(BILL) is undefined
 +34      ;that is why we are not checking this field
 +35       IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.05")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.05",BPIEN77,$PIECE($GET(MOREDATA("BILL")),U))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.05)
 +36       IF '$DATA(MOREDATA("ELIG"))
               IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.06")
                   IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.06",BPIEN77,$PIECE($GET(MOREDATA("BILL")),U,3))<1
                       QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.06)
 +37       IF $DATA(MOREDATA("ELIG"))
               IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.06")
                   IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.06",BPIEN77,$GET(MOREDATA("ELIG")))<1
                       QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.06)
 +38       IF $PIECE($GET(MOREDATA("BILL")),U,2)'=""
               IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.07")
                   IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.07",BPIEN77,$PIECE($GET(MOREDATA("BILL")),U,2))<1
                       QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.07)
 +39       IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.13")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.13",BPIEN77,$GET(MOREDATA("RX")))<1
                   IF BPREQTYP'="E"
                       QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.13)
 +40       IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.14")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.14",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,4))<1
                   IF BPREQTYP'="E"
                       QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.14)
 +41       IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.15")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.15",BPIEN77,$GET(MOREDATA("PATIENT")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.15)
 +42       IF $$ACTFIELD(BPSKIP,BPREQTYP,"1.16")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.16",BPIEN77,$PIECE($GET(MOREDATA("IBDATA",1,3)),U,7))<1
                   IF BPREQTYP="E"
                       QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.16)
 +43       IF $$ACTFIELD(BPSKIP,BPREQTYP,"2.01")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.01",BPIEN77,+$GET(MOREDATA("DATE OF SERVICE")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.01)
 +44       IF $$ACTFIELD(BPSKIP,BPREQTYP,"2.02")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.02",BPIEN77,$GET(MOREDATA("REVERSAL REASON")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.02)
 +45       IF $LENGTH($GET(MOREDATA("BPOVRIEN")))>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.04",BPIEN77,$GET(MOREDATA("BPOVRIEN")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.04)
 +46       IF $LENGTH($GET(MOREDATA("BPSCLARF")))>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.05",BPIEN77,$GET(MOREDATA("BPSCLARF")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.05)
 +47       IF $LENGTH($GET(BILLNDC))>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.06",BPIEN77,BILLNDC)<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.06)
 +48       IF $LENGTH($PIECE($GET(MOREDATA("BPSAUTH")),U))>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.07",BPIEN77,$EXTRACT($PIECE(MOREDATA("BPSAUTH"),U,1),1,2))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.07)
 +49       IF $LENGTH($PIECE($GET(MOREDATA("BPSAUTH")),U,2))>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.08",BPIEN77,$EXTRACT($PIECE(MOREDATA("BPSAUTH"),U,2),1,11))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.08)
 +50       IF $LENGTH($GET(MOREDATA("BPSDELAY")))>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.1",BPIEN77,MOREDATA("BPSDELAY"))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.1)
 +51       IF $GET(MOREDATA("BPSDX"))'=""
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.11",BPIEN77,$GET(MOREDATA("BPSDX")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.11)
 +52       IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.01")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.01",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,1))
 +53       IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.02")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.02",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,2))
 +54       IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.03")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.03",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,3))
 +55       IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.04")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.04",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,4))
 +56       IF $PIECE($GET(MOREDATA("BPSDATA",1)),U,5)'=""
               IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.05")
                   IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.05",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,5))
 +57       IF $PIECE($GET(MOREDATA("BPSDATA",1)),U,6)'=""
               IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.06")
                   IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.06",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,6))
 +58       IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.07")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.07",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,7))
 +59       IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.08")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.08",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,8))
 +60       IF $$ACTFIELD(BPSKIP,BPREQTYP,"4.09")
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"4.09",BPIEN77,$PIECE($GET(MOREDATA("BPSDATA",1)),U,9))
 +61       IF $GET(MOREDATA("CLOSE AFT REV"))=1
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"7.01",BPIEN77,1)<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,7.01)
 +62       IF $GET(MOREDATA("CLOSE AFT REV REASON"))>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"7.02",BPIEN77,+$GET(MOREDATA("CLOSE AFT REV REASON")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,7.02)
 +63       IF $LENGTH($GET(MOREDATA("CLOSE AFT REV COMMENT")))>0
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"7.03",BPIEN77,$GET(MOREDATA("CLOSE AFT REV COMMENT")))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,7.03)
 +64       IF $GET(BPSARRY("SC/EI OVR"))=1
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"2.09",BPIEN77,1)<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,2.09)
 +65      ;
 +66      ; secondary billing and primary Tricare billing related fields
 +67       IF $GET(MOREDATA("RTYPE"))'=""
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.08",BPIEN77,MOREDATA("RTYPE"))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.08)
 +68       IF $GET(MOREDATA("PRIMARY BILL"))'=""
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.09",BPIEN77,MOREDATA("PRIMARY BILL"))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.09)
 +69       IF $GET(MOREDATA("PRIOR PAYMENT"))'=""
               IF $$FILLFLDS^BPSUTIL2(9002313.77,"1.1",BPIEN77,MOREDATA("PRIOR PAYMENT"))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.1)
 +70      ; cob other payments count
           IF $GET(MOREDATA("337-4C"))'=""
               IF $$FILLFLDS^BPSUTIL2(9002313.77,1.11,BPIEN77,MOREDATA("337-4C"))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.11)
 +71      ; other coverage code
           IF $GET(MOREDATA("308-C8"))'=""
               IF $$FILLFLDS^BPSUTIL2(9002313.77,1.12,BPIEN77,MOREDATA("308-C8"))<1
                   QUIT "0^"_$$ERRFIELD(BPIEN77,1,BPERRMSG,9002313.77,1.12)
 +72      ;
 +73      ; store secondary billing related data entered by the user - esg 6/8/10
 +74       SET BPQ=0
           SET BPERRMSG=""
 +75       IF BPCOBIND=2
               Begin DoDot:1
 +76               NEW AMTIEN,BPIEN1,BPIEN2,BPIEN778,BPZ,BPZ1,BPZ2,OPAMT,OPAPQ,OPAYD,OPPRA,OPREJ,PIEN,REJIEN
 +77               SET PIEN=0
                   FOR 
                       SET PIEN=$ORDER(MOREDATA("OTHER PAYER",PIEN))
                       if 'PIEN!BPQ
                           QUIT 
                       Begin DoDot:2
 +78                       SET OPAYD=$GET(MOREDATA("OTHER PAYER",PIEN,0))
                           if OPAYD=""
                               QUIT 
 +79      ;
 +80      ; count up the number of multiples we have in each set
 +81                       SET BPZ=0
                           FOR BPZ1=0:1
                               SET BPZ=$ORDER(MOREDATA("OTHER PAYER",PIEN,"P",BPZ))
                               if 'BPZ
                                   QUIT 
 +82                       SET BPZ=0
                           FOR BPZ2=0:1
                               SET BPZ=$ORDER(MOREDATA("OTHER PAYER",PIEN,"R",BPZ))
                               if 'BPZ
                                   QUIT 
 +83                       IF BPZ1
                               IF BPZ2
                                   SET BPQ=1
                                   SET BPERRMSG="Can't have both payments and rejects for the same OTHER PAYER"
                                   QUIT 
 +84      ;
 +85      ; add a new entry to subfile 9002313.778
 +86                       SET BPIEN778=$$INSITEM^BPSUTIL2(9002313.778,BPIEN77,PIEN,PIEN,"",,0)
 +87                       IF BPIEN778<1
                               SET BPERRMSG="Can't create entry in COB OTHER PAYERS multiple of the BPS REQUESTS file"
                               SET BPQ=1
                               QUIT 
 +88      ; just in case BPQ is set below
                           SET BPERRMSG="Can't populate field in COB OTHER PAYERS multiple"
 +89      ;
 +90      ; set the rest of the pieces at this level
 +91                       IF $PIECE(OPAYD,U,2)'=""
                               IF $$FILLFLDS^BPSUTIL2(9002313.778,.02,PIEN_","_BPIEN77,$PIECE(OPAYD,U,2))<1
                                   SET BPQ=1
                                   QUIT 
 +92                       IF $PIECE(OPAYD,U,3)'=""
                               IF $$FILLFLDS^BPSUTIL2(9002313.778,.03,PIEN_","_BPIEN77,$PIECE(OPAYD,U,3))<1
                                   SET BPQ=1
                                   QUIT 
 +93                       IF $PIECE(OPAYD,U,4)'=""
                               IF $$FILLFLDS^BPSUTIL2(9002313.778,.04,PIEN_","_BPIEN77,$PIECE(OPAYD,U,4))<1
                                   SET BPQ=1
                                   QUIT 
 +94                       IF $PIECE(OPAYD,U,5)'=""
                               IF $$FILLFLDS^BPSUTIL2(9002313.778,.05,PIEN_","_BPIEN77,$PIECE(OPAYD,U,5))<1
                                   SET BPQ=1
                                   QUIT 
 +95                       IF $$FILLFLDS^BPSUTIL2(9002313.778,.06,PIEN_","_BPIEN77,BPZ1)<1
                               SET BPQ=1
                               QUIT 
 +96                       IF $$FILLFLDS^BPSUTIL2(9002313.778,.07,PIEN_","_BPIEN77,BPZ2)<1
                               SET BPQ=1
                               QUIT 
 +97                       IF $PIECE(OPAYD,U,11)'=""
                               IF $$FILLFLDS^BPSUTIL2(9002313.778,.11,PIEN_","_BPIEN77,$PIECE(OPAYD,U,11))<1
                                   SET BPQ=1
                                   QUIT 
 +98                       SET BPERRMSG=""
 +99      ;
 +100     ; now loop thru the other payer payment array
 +101                      SET AMTIEN=0
                           FOR 
                               SET AMTIEN=$ORDER(MOREDATA("OTHER PAYER",PIEN,"P",AMTIEN))
                               if 'AMTIEN!BPQ
                                   QUIT 
                               Begin DoDot:3
 +102                              SET OPAMT=$GET(MOREDATA("OTHER PAYER",PIEN,"P",AMTIEN,0))
 +103     ; 342-HC other payer amt paid qualifier (ncpdp 5.1 blank is OK)
                                   SET OPAPQ=$PIECE(OPAMT,U,2)
 +104     ; 352-NQ, Other Payer-Patient Responsibility Amount
                                   SET OPPRA=$PIECE(OPAMT,U,3)
 +105     ; 431-DV other payer amt paid
                                   SET OPAMT=+OPAMT
 +106     ;
 +107     ; add a new entry to subfile 9002313.7781
 +108                              SET BPIEN1=$$INSITEM^BPSUTIL2(9002313.7781,PIEN_","_BPIEN77,OPAMT,AMTIEN,"",,0)
 +109                              IF BPIEN1<1
                                       SET BPERRMSG="Can't create entry in 9002313.7781 subfile"
                                       SET BPQ=1
                                       QUIT 
 +110     ;
 +111     ; set piece 2
 +112                              IF OPAPQ'=""
                                       IF $$FILLFLDS^BPSUTIL2(9002313.7781,.02,AMTIEN_","_PIEN_","_BPIEN77,OPAPQ)<1
                                           Begin DoDot:4
 +113                                          SET BPQ=1
                                               SET BPERRMSG="Can't populate .02 field in 9002313.7781 subfile"
 +114                                          QUIT 
                                           End DoDot:4
 +115     ;
 +116     ; set piece 3
 +117                              IF OPPRA'=""
                                       IF $$FILLFLDS^BPSUTIL2(9002313.7781,.03,AMTIEN_","_PIEN_","_BPIEN77,OPPRA)<1
                                           Begin DoDot:4
 +118                                          SET BPQ=1
                                               SET BPERRMSG="Can't populate .03 field in 9002313.7781 subfile"
 +119                                          QUIT 
                                           End DoDot:4
 +120     ;
 +121                              QUIT 
                               End DoDot:3
 +122     ;
 +123     ; now loop thru the other payer reject array
 +124                      SET REJIEN=0
                           FOR 
                               SET REJIEN=$ORDER(MOREDATA("OTHER PAYER",PIEN,"R",REJIEN))
                               if 'REJIEN!BPQ
                                   QUIT 
                               Begin DoDot:3
 +125                              SET OPREJ=$GET(MOREDATA("OTHER PAYER",PIEN,"R",REJIEN,0))
                                   if OPREJ=""
                                       QUIT 
                                   if $PIECE(OPREJ,U,1)=""
                                       QUIT 
 +126     ;
 +127     ; add a new entry to subfile 9002313.7782
 +128                              SET BPIEN2=$$INSITEM^BPSUTIL2(9002313.7782,PIEN_","_BPIEN77,$PIECE(OPREJ,U,1),REJIEN,"",,0)
 +129                              IF BPIEN2<1
                                       SET BPERRMSG="Can't create entry in 9002313.7782 subfile"
                                       SET BPQ=1
                                       QUIT 
 +130                              QUIT 
                               End DoDot:3
 +131                      QUIT 
                       End DoDot:2
 +132              QUIT 
               End DoDot:1
 +133      IF BPQ
               QUIT "0^"_BPERRMSG_" (COB DATA)"
 +134     ;
 +135     ;store DURREC info
 +136      SET BPQ=0
 +137      SET DUR=0
 +138      FOR 
               SET DUR=$ORDER(MOREDATA("DUR",DUR))
               if +DUR=0!(BPQ=1)
                   QUIT 
               Begin DoDot:1
 +139              SET BPIEN771=$$INSITEM^BPSUTIL2(9002313.771,BPIEN77,$PIECE(MOREDATA("DUR",DUR,0),U),DUR,"",,0)
 +140              IF BPIEN771<1
                       SET BPERRMSG="Cannot create DUR record in DUR multiple of the BPS REQUEST file"
                       SET BPQ=1
                       QUIT 
 +141              SET BPERRMSG="Cannot populate a field in DUR multiple"
 +142              IF $$FILLFLDS^BPSUTIL2(9002313.771,".02",DUR_","_BPIEN77,$PIECE(MOREDATA("DUR",DUR,0),U,2))<1
                       SET BPQ=1
                       QUIT 
 +143              IF $$FILLFLDS^BPSUTIL2(9002313.771,".03",DUR_","_BPIEN77,$PIECE(MOREDATA("DUR",DUR,0),U,3))<1
                       SET BPQ=1
                       QUIT 
               End DoDot:1
 +144      IF BPQ=1
               QUIT "0^"_BPERRMSG_" DUR DATA"
 +145     ;
 +146     ;store ins to IB INSURER DATA
 +147      SET BPQ=0
 +148      SET BPCOB=0
           FOR 
               SET BPCOB=$ORDER(BPIENS78(BPCOB))
               if +BPCOB=0!(BPQ=1)
                   QUIT 
               Begin DoDot:1
 +149              SET BPIEN772=$$INSITEM^BPSUTIL2(9002313.772,BPIEN77,BPCOB,BPCOB,"",,0)
 +150              IF BPIEN772<1
                       SET BPERRMSG="Cannot create record in IBDATA multiple of the BPS REQUEST file"
                       SET BPQ=1
                       QUIT 
 +151              SET BPERRMSG="Cannot populate a field in IBDATA multiple"
 +152              IF $$FILLFLDS^BPSUTIL2(9002313.772,".02",BPCOB_","_BPIEN77,$SELECT(BPCOBIND=BPCOB:1,1:0))<1
                       SET BPQ=1
                       QUIT 
 +153              IF $$FILLFLDS^BPSUTIL2(9002313.772,".03",BPCOB_","_BPIEN77,BPIENS78(BPCOB))<1
                       SET BPQ=1
                       QUIT 
               End DoDot:1
 +154      IF BPQ=1
               QUIT "0^"_BPERRMSG_"INSURER DATA"
 +155     ;
 +156     ;return 1 (success) and IEN of the 9002313.77 entry
 +157      QUIT "1^"_BPIEN77
 +158     ;
 +159     ;check if the field is used in MOREDATA for the specified REQUEST TYPE - CLAIM="C" /UNCLAIM="U"
ACTFIELD(BPSKIP,BPREQTYP,BPFLD) ;
 +1       ;For Reversal or Skip, only do RX Action, Date of Service, Reversal Reason, and User who made the Request
 +2        IF (BPREQTYP="U")!(BPSKIP=1)
               QUIT ";1.01;2.01;2.02;6.02;"[(";"_BPFLD_";")
 +3       ;For Eligibility Verification, skip Eligibility
 +4        IF BPREQTYP="E"
               IF ";1.06;"[(";"_BPFLD_";")
                   QUIT 0
 +5        QUIT 1
 +6       ;
 +7       ;Lock BPS REQUEST
LOCK77(BPTIMOUT,IEN59,BPSRC) ;
 +1        NEW BPRET
 +2        LOCK +^BPS(9002313.77):+$GET(BPTIMOUT)
 +3        SET BPRET=$TEST
 +4        IF $GET(IEN59)>0
               DO LOG^BPSOSL(IEN59,$GET(BPSRC)_$SELECT(BPRET=1:"-Lock",1:"-Failed to Lock")_" BPS REQUEST file")
 +5        QUIT BPRET
 +6       ;
 +7       ;UnLock BPS REQUEST
UNLOCK77(IEN59,BPSRC) ;
 +1        LOCK -^BPS(9002313.77)
 +2        IF $GET(IEN59)>0
               DO LOG^BPSOSL(IEN59,$GET(BPSRC)_"-Unlock BPS REQUEST file")
 +3        QUIT 
 +4       ;
 +5       ;BP77 - ien of BPS REQUEST
ERRFIELD(BP77,BPRFILE,BPMESS,BPFILENO,BPFLDNO) ;
 +1       ;delete incomplete record
           IF $GET(BP77)>0
               DO DELREQST^BPSOSRX4(BP77)
 +2        QUIT $$FIELDMSG^BPSOSRX2(BPRFILE,BPMESS,BPFILENO,BPFLDNO)
 +3       ;
 +4       ;BPSOSRX3