- BPSOSQ4 ;BHAM ISC/FCS/DRS/DLF - Process responses ;12/7/07 15:48
- ;;1.0;E CLAIMS MGMT ENGINE;**1,5,7,10,30**;JUN 2004;Build 19
- ;;Per VA Directive 6402, this routine should not be modified.
- ;
- ; This routine has two components
- ; Procedures to report Response info
- ; Procedures to handle insurer asleep functions
- Q
- ;
- ; The following are separate little utilities called from elsewhere.
- ;
- PAID(IEN59) ;quick query to see if it's paid
- N TMP D RESPINFO(IEN59,.TMP) Q:'$D(TMP("RSP")) 0
- N X S X=TMP("RSP")
- I X="Payable" Q 1
- Q 0
- RESPINFO(IEN59,DST) ;EP - BPSOS6M
- ; quick way to get all the response info for a given BPS Transaction
- ; IMPORTANT!! Do not change spelling, case, wording, or spacing!!!
- ; If a reversal was attempted, it complicates things.
- ; fills DST array as follows:
- ; DST("HDR")=Response Status (header)
- ; DST("RSP")=Response Status (transaction)
- ; This could be: "Payable", "Rejected", "Accepted", "Captured",
- ; "Duplicate", or "null"
- ; DST("REJ",0)=count of reject codes
- ; DST("REJ",n)=each reject code
- ; DST("MSG")=message with the response
- ; All of these are defined, even if originals were '$D.
- ; The external forms are returned.
- N REVERSAL S REVERSAL=$G(^BPST(IEN59,4))>0
- N RESP
- I 'REVERSAL S RESP=$P(^BPST(IEN59,0),U,5)
- E S RESP=$P(^BPST(IEN59,4),U,2)
- I 'RESP Q
- N ECME S POS=$P(^BPST(IEN59,0),U,9) Q:'POS
- N FMT S FMT="E"
- S DST("HDR")=$$RESP500(RESP,FMT)
- S DST("RSP")=$$RESP1000(RESP,POS,FMT)
- S DST("REJ",0)=$$REJCOUNT(RESP,POS,FMT)
- I DST("REJ",0) D
- . N I F I=1:1:DST("REJ",0) S DST("REJ",I)=$$REJCODE(RESP,POS,I,FMT)
- S DST("MSG")=$$RESPMSG(RESP,POS)
- ; Dealing with oddities of PCS (and others'?) response to reversals
- I REVERSAL,DST("RSP")["null" D
- . I DST("RSP")["null" S DST("RSP")=DST("HDR")_" reversal"
- Q
- ; In the following quickies:
- ; RESP = RESPIEN, pointer to 9002313.03
- ; FMT = "I" for internal, "E" for external, defaults to internal
- RESP500(RESP,FMT) ;EP - BPSOS57,BPSOSUC
- ; returns the response header status
- N X S X=$P($G(^BPSR(RESP,500)),U)
- I $G(FMT)'="E" Q X
- I X="" S X="null"
- S X=$S(X="A":"Accepted",X="R":"Rejected",1:"?"_X)
- Q X
- RESP1000(RESP,POS,FMT) ;EP - BPSOSUC
- ; returns the transaction response status
- ; Note! Could be DP or DC for duplicates
- N X S X=$P($G(^BPSR(RESP,1000,POS,500)),U)
- I $G(FMT)'="E" Q X
- I X="" S X="null"
- ;
- ;IHS/SD/lwj 10/07/02 NCPDP 5.1 changes - they will send an "A" back
- ; now on the transaction level to indicate that it has been accepted
- ; Next code line remarked out - following added
- ;
- S X=$S(X="A":"Accepted",X="P":"Payable",X="R":"Rejected",X="C":"Captured",X="D"!(X="DP")!(X="DC"):"Duplicate",1:"?"_X)
- Q X
- ;
- REJCOUNT(RESP,POS,FMT) ; returns rejection count
- Q +$P($G(^BPSR(RESP,1000,POS,511,0)),U,3)
- ;
- REJCODE(RESP,POS,N,FMT) ; returns Nth rejection code
- ; if FMT="E", returns code:text
- N CODE S CODE=$P($G(^BPSR(RESP,1000,POS,511,N,0)),U)
- I CODE="" S CODE="null"
- I FMT'="E" Q CODE
- N X S X=$O(^BPSF(9002313.93,"B",CODE,0))
- I X]"" S CODE=CODE_":"_$P($G(^BPSF(9002313.93,X,0)),U,2)
- E S CODE="?"_CODE
- Q CODE
- ;
- ; NCPDP 5.1 changes - message may not come back in 504. They may
- ; come back in 526 instead
- ; NCPDP D.0 change - 526 is a repeating field
- RESPMSG(RESP,POS) ; response message - additional text from insurer
- ;
- I '$G(RESP) Q ""
- I '$G(POS) S POS=1
- N MSG
- S MSG=""
- S MSG=$G(^BPSR(RESP,504))
- I MSG]"" Q MSG
- N ADDMESS,N
- D ADDMESS^BPSSCRLG(RESP,POS,.ADDMESS)
- S N="" F S N=$O(ADDMESS(N)) Q:'N S MSG=MSG_$S(N=1:"",1:"~")_ADDMESS(N)
- Q MSG
- ;
- ;
- NOW() ;
- Q $$NOW^XLFDT
- ;
- ; The xxxSLEEP functions are called from BPSOSQL
- ; ISASLEEP also called by BPSOSQA
- ;
- REJSLEEP(BPSRESP,BPSPOS,IEN59) ;
- ; Check if the insurer should be asleep based on the reject codes
- ; Input
- ; BPSRESP - BPS Response IEN
- ; BPSPOS - Multiple IEN
- ; IEN59 - BPS TRANSACTION IEN
- ; Return
- ; 1 if the insurer should go to sleep
- ; 0 if the insurer should not go to sleep
- ;
- N BPSSITE,REJCD,GRPLAN,BPSRET
- ;
- ; Validate parameters
- I '$G(BPSRESP) Q 0
- I '$G(BPSPOS) Q 0
- I '$G(IEN59) Q 0
- ;
- ; Check asleep parameters to see asleep functionality is disabled
- S BPSSITE=$G(^BPS(9002313.99,1,0))
- I '$P(BPSSITE,"^",5)!('$P(BPSSITE,"^",6)) Q 0
- ;
- ; Do not do insurer asleep for Eligibility Verification requests
- I $P($G(^BPST(IEN59,0)),U,15)="E" Q 0
- ;
- ; Get the Group Insurance Plan and verify if asleep functionality is on
- S GRPLAN=$$GETPLN59^BPSUTIL2(IEN59) I 'GRPLAN Q 0
- I $$IGNORE^BPSOSQF(+GRPLAN) Q 0
- ;
- ; Don't sleep if response has reject 88 (DUR), 943 (DUR), or 79 (Refill Too Soon)
- I $D(^BPSR(BPSRESP,1000,BPSPOS,511,"B",88)) Q 0
- I $D(^BPSR(BPSRESP,1000,BPSPOS,511,"B",943)) Q 0
- I $D(^BPSR(BPSRESP,1000,BPSPOS,511,"B",79)) Q 0
- ;
- ; Is this a reject code to consider?
- S BPSRET=0
- F REJCD=90,91,92,95,96,97,98 I $D(^BPSR(BPSRESP,1000,BPSPOS,511,"B",REJCD)) S BPSRET=1 Q
- ;
- Q BPSRET
- ;
- ADDSLEEP(IEN59) ;
- ; Adds a payer (if not already there) to the Asleep file
- ; Input
- ; IEN59 - BPS TRANSACTION IEN
- ; Return
- ; 0 - No BPS Asleep Payer record created
- ; BPS Asleep Payer IEN
- ;
- I '$G(IEN59) Q 0
- N GRPLAN,DIC,X,Y,DO,DTOUT,DUOUT
- ;
- ; Find the Group Insurance Plan
- S GRPLAN=$$GETPLN59^BPSUTIL2(IEN59) I 'GRPLAN Q 0
- ;
- ; If already in file quit
- I $D(^BPS(9002313.15,"B",+GRPLAN)) Q 0
- ;
- S DIC=9002313.15,DIC(0)="",X=+GRPLAN
- S DIC("DR")=".02///0;.03///0;.04////^S X=IEN59"
- D FILE^DICN
- ;
- Q Y
- ;
- INCSLEEP(IEN59) ; called from BPSOSQL
- ; INCSLEEP - Increment sleep time for this insurer
- ; Input
- ; IEN59 - BPS TRANSACTION IEN
- ; Return
- ; 0 - Awake now
- ; 1 - Still asleep
- ;
- I '$G(IEN59) Q 0
- N GRPLAN,BPSIEN15,RETCNT,BPSPARAM,BPSRETRY,PROBER,IEN59T
- N DIE,DA,DR,DTOUT
- ;
- ; Get GROUP INSURANCE PLAN
- S GRPLAN=$$GETPLN59^BPSUTIL2(IEN59) I 'GRPLAN Q 0
- ;
- ; If the payer is not already asleep, add it to the BPS ASLEEP PAYERS file
- S BPSIEN15=$O(^BPS(9002313.15,"B",+GRPLAN,0))
- I 'BPSIEN15 S BPSIEN15=+$$ADDSLEEP(IEN59)
- I BPSIEN15<1 Q 0
- ;
- ; Get the prober.
- S PROBER=$P($G(^BPS(9002313.15,BPSIEN15,0)),U,4)
- ;
- ; If there is a prober and this is not it, just put this transaction to sleep and quit
- I PROBER,IEN59'=PROBER D SETSLEEP(IEN59,BPSIEN15,$T(+0)_"-Insurer Asleep-Waiting for Prober Transaction "_PROBER_" to complete") Q 1
- ;
- ; Get Asleep Paramters from BPS SETUP
- ; If the parameters are off, return 0
- S BPSPARAM=^BPS(9002313.99,1,0)
- I '$P(BPSPARAM,"^",5)!('$P(BPSPARAM,"^",6)) Q 0
- ;
- ; If maximum retries reached, flag to wake up and set status to complete.
- S RETCNT=$P($G(^BPS(9002313.15,BPSIEN15,0)),U,2)+1
- I RETCNT>$P(BPSPARAM,"^",6) D Q 0
- . D LOG^BPSOSL(IEN59,$T(+0)_"-Maximum retries reached for insurer. Completing BPS TRANSACTION: "_IEN59)
- ;
- ; Set RETRY TIME based on site parameters and update retry count and retry time
- S BPSRETRY=$$FMADD^XLFDT($$NOW^XLFDT,,,$P(BPSPARAM,"^",5))
- I $$FILLFLDS^BPSUTIL2(9002313.15,".02",BPSIEN15,RETCNT)<1 Q 0
- I $$FILLFLDS^BPSUTIL2(9002313.15,".05",BPSIEN15,BPSRETRY)<1 Q 0
- ;
- ; Put the prober to Sleep
- S MSG="Retry number "_RETCNT_" scheduled for "_$$FMTE^XLFDT(BPSRETRY)
- D SETSLEEP(IEN59,BPSIEN15,$T(+0)_"-Insurer Asleep for "_$P(GRPLAN,U,2)_". "_MSG)
- ;
- ; Update the Last Update date/time for associated claims so that they don't
- ; end up on the View/Unstand Submission Screen
- S IEN59T="" F S IEN59T=$O(^BPST("ASL",BPSIEN15,IEN59T)) Q:IEN59T="" D
- . I IEN59T=PROBER Q
- . S DIE=9002313.59,DA=IEN59T,DR="7///NOW" D ^DIE
- . D LOG^BPSOSL(IEN59T,$T(+0)_"-INCSLEEP is resetting the LAST UPDATE field to the current date/time")
- ;
- ; Queue packeter to restart at next retry time+10 seconds
- D TASKAT^BPSOSQA($$FMADD^XLFDT(BPSRETRY,,,,10))
- ;
- Q 1
- ;
- SETSLEEP(IEN59,BPSIEN15,MSG) ;
- ; Put transaction to sleep
- ; Input
- ; IEN59 - BPS Transaction IEN
- ; BPSIEN15 - BPS Asleep Payer IEN
- ; MSG - Message used for Log
- ;
- I '$G(IEN59) Q
- I '$G(BPSIEN15) Q
- N DIE,DA,DR,DTOUT
- ;
- ; If the BPS TRANSACTION is not already pointing to the asleep payer, update it
- I '$D(^BPST("ASL",BPSIEN15,IEN59)) S DIE=9002313.59,DA=IEN59,DR="801////^S X=BPSIEN15" D ^DIE
- ;
- ; Set to 31% (Wait for retry (insurer asleep)) and log message
- D SETSTAT^BPSOSU(IEN59,31)
- I $G(MSG)="" S MSG=$T(+0)_"-Transaction being put to sleep by SETSLEEP"
- D LOG^BPSOSL(IEN59,MSG)
- Q
- ;
- CLRSLEEP(GRPLAN,IEN59) ;EP - BPSOSQL
- ; Clear insurer sleeping condition
- ; Input:
- ; GRPLAN - Group Insurance Plan IEN
- ; IEN59 - BPS Transaction IEN
- ;
- I '$G(GRPLAN) Q
- N BPSIEN15,DA,DIE,DR,DTOUT,DIK,IEN59T
- ;
- ; Get the BPS ASLEEP PAYER record
- S BPSIEN15=$O(^BPS(9002313.15,"B",+GRPLAN,0))
- I BPSIEN15="" Q
- ;
- ; Logging message and creating a comment
- I $G(IEN59) D LOG^BPSOSL(IEN59,$T(+0)_"-Clearing sleep for "_$P(GRPLAN,U,2))
- ;
- ; Delete the BPS ASLEEP PAYER record
- S DA=BPSIEN15,DIK="^BPS(9002313.15," D ^DIK
- ;
- ; Clear any pointers to the sleep payer
- S IEN59T="" F S IEN59T=$O(^BPST("ASL",BPSIEN15,IEN59T)) Q:IEN59T="" D
- . S DIE=9002313.59,DA=IEN59T,DR="801///@" D ^DIE
- . D LOG^BPSOSL(IEN59T,$T(+0)_"-CLRSLEEP is clearing pointer to ASLEEP PAYER")
- ;
- ; Run the packeter to resubmit any other claims for the this payer
- D TASK^BPSOSQA
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HBPSOSQ4 9377 printed Feb 18, 2025@23:18:16 Page 2
- BPSOSQ4 ;BHAM ISC/FCS/DRS/DLF - Process responses ;12/7/07 15:48
- +1 ;;1.0;E CLAIMS MGMT ENGINE;**1,5,7,10,30**;JUN 2004;Build 19
- +2 ;;Per VA Directive 6402, this routine should not be modified.
- +3 ;
- +4 ; This routine has two components
- +5 ; Procedures to report Response info
- +6 ; Procedures to handle insurer asleep functions
- +7 QUIT
- +8 ;
- +9 ; The following are separate little utilities called from elsewhere.
- +10 ;
- PAID(IEN59) ;quick query to see if it's paid
- +1 NEW TMP
- DO RESPINFO(IEN59,.TMP)
- if '$DATA(TMP("RSP"))
- QUIT 0
- +2 NEW X
- SET X=TMP("RSP")
- +3 IF X="Payable"
- QUIT 1
- +4 QUIT 0
- RESPINFO(IEN59,DST) ;EP - BPSOS6M
- +1 ; quick way to get all the response info for a given BPS Transaction
- +2 ; IMPORTANT!! Do not change spelling, case, wording, or spacing!!!
- +3 ; If a reversal was attempted, it complicates things.
- +4 ; fills DST array as follows:
- +5 ; DST("HDR")=Response Status (header)
- +6 ; DST("RSP")=Response Status (transaction)
- +7 ; This could be: "Payable", "Rejected", "Accepted", "Captured",
- +8 ; "Duplicate", or "null"
- +9 ; DST("REJ",0)=count of reject codes
- +10 ; DST("REJ",n)=each reject code
- +11 ; DST("MSG")=message with the response
- +12 ; All of these are defined, even if originals were '$D.
- +13 ; The external forms are returned.
- +14 NEW REVERSAL
- SET REVERSAL=$GET(^BPST(IEN59,4))>0
- +15 NEW RESP
- +16 IF 'REVERSAL
- SET RESP=$PIECE(^BPST(IEN59,0),U,5)
- +17 IF '$TEST
- SET RESP=$PIECE(^BPST(IEN59,4),U,2)
- +18 IF 'RESP
- QUIT
- +19 NEW ECME
- SET POS=$PIECE(^BPST(IEN59,0),U,9)
- if 'POS
- QUIT
- +20 NEW FMT
- SET FMT="E"
- +21 SET DST("HDR")=$$RESP500(RESP,FMT)
- +22 SET DST("RSP")=$$RESP1000(RESP,POS,FMT)
- +23 SET DST("REJ",0)=$$REJCOUNT(RESP,POS,FMT)
- +24 IF DST("REJ",0)
- Begin DoDot:1
- +25 NEW I
- FOR I=1:1:DST("REJ",0)
- SET DST("REJ",I)=$$REJCODE(RESP,POS,I,FMT)
- End DoDot:1
- +26 SET DST("MSG")=$$RESPMSG(RESP,POS)
- +27 ; Dealing with oddities of PCS (and others'?) response to reversals
- +28 IF REVERSAL
- IF DST("RSP")["null"
- Begin DoDot:1
- +29 IF DST("RSP")["null"
- SET DST("RSP")=DST("HDR")_" reversal"
- End DoDot:1
- +30 QUIT
- +31 ; In the following quickies:
- +32 ; RESP = RESPIEN, pointer to 9002313.03
- +33 ; FMT = "I" for internal, "E" for external, defaults to internal
- RESP500(RESP,FMT) ;EP - BPSOS57,BPSOSUC
- +1 ; returns the response header status
- +2 NEW X
- SET X=$PIECE($GET(^BPSR(RESP,500)),U)
- +3 IF $GET(FMT)'="E"
- QUIT X
- +4 IF X=""
- SET X="null"
- +5 SET X=$SELECT(X="A":"Accepted",X="R":"Rejected",1:"?"_X)
- +6 QUIT X
- RESP1000(RESP,POS,FMT) ;EP - BPSOSUC
- +1 ; returns the transaction response status
- +2 ; Note! Could be DP or DC for duplicates
- +3 NEW X
- SET X=$PIECE($GET(^BPSR(RESP,1000,POS,500)),U)
- +4 IF $GET(FMT)'="E"
- QUIT X
- +5 IF X=""
- SET X="null"
- +6 ;
- +7 ;IHS/SD/lwj 10/07/02 NCPDP 5.1 changes - they will send an "A" back
- +8 ; now on the transaction level to indicate that it has been accepted
- +9 ; Next code line remarked out - following added
- +10 ;
- +11 SET X=$SELECT(X="A":"Accepted",X="P":"Payable",X="R":"Rejected",X="C":"Captured",X="D"!(X="DP")!(X="DC"):"Duplicate",1:"?"_X)
- +12 QUIT X
- +13 ;
- REJCOUNT(RESP,POS,FMT) ; returns rejection count
- +1 QUIT +$PIECE($GET(^BPSR(RESP,1000,POS,511,0)),U,3)
- +2 ;
- REJCODE(RESP,POS,N,FMT) ; returns Nth rejection code
- +1 ; if FMT="E", returns code:text
- +2 NEW CODE
- SET CODE=$PIECE($GET(^BPSR(RESP,1000,POS,511,N,0)),U)
- +3 IF CODE=""
- SET CODE="null"
- +4 IF FMT'="E"
- QUIT CODE
- +5 NEW X
- SET X=$ORDER(^BPSF(9002313.93,"B",CODE,0))
- +6 IF X]""
- SET CODE=CODE_":"_$PIECE($GET(^BPSF(9002313.93,X,0)),U,2)
- +7 IF '$TEST
- SET CODE="?"_CODE
- +8 QUIT CODE
- +9 ;
- +10 ; NCPDP 5.1 changes - message may not come back in 504. They may
- +11 ; come back in 526 instead
- +12 ; NCPDP D.0 change - 526 is a repeating field
- RESPMSG(RESP,POS) ; response message - additional text from insurer
- +1 ;
- +2 IF '$GET(RESP)
- QUIT ""
- +3 IF '$GET(POS)
- SET POS=1
- +4 NEW MSG
- +5 SET MSG=""
- +6 SET MSG=$GET(^BPSR(RESP,504))
- +7 IF MSG]""
- QUIT MSG
- +8 NEW ADDMESS,N
- +9 DO ADDMESS^BPSSCRLG(RESP,POS,.ADDMESS)
- +10 SET N=""
- FOR
- SET N=$ORDER(ADDMESS(N))
- if 'N
- QUIT
- SET MSG=MSG_$SELECT(N=1:"",1:"~")_ADDMESS(N)
- +11 QUIT MSG
- +12 ;
- +13 ;
- NOW() ;
- +1 QUIT $$NOW^XLFDT
- +2 ;
- +3 ; The xxxSLEEP functions are called from BPSOSQL
- +4 ; ISASLEEP also called by BPSOSQA
- +5 ;
- REJSLEEP(BPSRESP,BPSPOS,IEN59) ;
- +1 ; Check if the insurer should be asleep based on the reject codes
- +2 ; Input
- +3 ; BPSRESP - BPS Response IEN
- +4 ; BPSPOS - Multiple IEN
- +5 ; IEN59 - BPS TRANSACTION IEN
- +6 ; Return
- +7 ; 1 if the insurer should go to sleep
- +8 ; 0 if the insurer should not go to sleep
- +9 ;
- +10 NEW BPSSITE,REJCD,GRPLAN,BPSRET
- +11 ;
- +12 ; Validate parameters
- +13 IF '$GET(BPSRESP)
- QUIT 0
- +14 IF '$GET(BPSPOS)
- QUIT 0
- +15 IF '$GET(IEN59)
- QUIT 0
- +16 ;
- +17 ; Check asleep parameters to see asleep functionality is disabled
- +18 SET BPSSITE=$GET(^BPS(9002313.99,1,0))
- +19 IF '$PIECE(BPSSITE,"^",5)!('$PIECE(BPSSITE,"^",6))
- QUIT 0
- +20 ;
- +21 ; Do not do insurer asleep for Eligibility Verification requests
- +22 IF $PIECE($GET(^BPST(IEN59,0)),U,15)="E"
- QUIT 0
- +23 ;
- +24 ; Get the Group Insurance Plan and verify if asleep functionality is on
- +25 SET GRPLAN=$$GETPLN59^BPSUTIL2(IEN59)
- IF 'GRPLAN
- QUIT 0
- +26 IF $$IGNORE^BPSOSQF(+GRPLAN)
- QUIT 0
- +27 ;
- +28 ; Don't sleep if response has reject 88 (DUR), 943 (DUR), or 79 (Refill Too Soon)
- +29 IF $DATA(^BPSR(BPSRESP,1000,BPSPOS,511,"B",88))
- QUIT 0
- +30 IF $DATA(^BPSR(BPSRESP,1000,BPSPOS,511,"B",943))
- QUIT 0
- +31 IF $DATA(^BPSR(BPSRESP,1000,BPSPOS,511,"B",79))
- QUIT 0
- +32 ;
- +33 ; Is this a reject code to consider?
- +34 SET BPSRET=0
- +35 FOR REJCD=90,91,92,95,96,97,98
- IF $DATA(^BPSR(BPSRESP,1000,BPSPOS,511,"B",REJCD))
- SET BPSRET=1
- QUIT
- +36 ;
- +37 QUIT BPSRET
- +38 ;
- ADDSLEEP(IEN59) ;
- +1 ; Adds a payer (if not already there) to the Asleep file
- +2 ; Input
- +3 ; IEN59 - BPS TRANSACTION IEN
- +4 ; Return
- +5 ; 0 - No BPS Asleep Payer record created
- +6 ; BPS Asleep Payer IEN
- +7 ;
- +8 IF '$GET(IEN59)
- QUIT 0
- +9 NEW GRPLAN,DIC,X,Y,DO,DTOUT,DUOUT
- +10 ;
- +11 ; Find the Group Insurance Plan
- +12 SET GRPLAN=$$GETPLN59^BPSUTIL2(IEN59)
- IF 'GRPLAN
- QUIT 0
- +13 ;
- +14 ; If already in file quit
- +15 IF $DATA(^BPS(9002313.15,"B",+GRPLAN))
- QUIT 0
- +16 ;
- +17 SET DIC=9002313.15
- SET DIC(0)=""
- SET X=+GRPLAN
- +18 SET DIC("DR")=".02///0;.03///0;.04////^S X=IEN59"
- +19 DO FILE^DICN
- +20 ;
- +21 QUIT Y
- +22 ;
- INCSLEEP(IEN59) ; called from BPSOSQL
- +1 ; INCSLEEP - Increment sleep time for this insurer
- +2 ; Input
- +3 ; IEN59 - BPS TRANSACTION IEN
- +4 ; Return
- +5 ; 0 - Awake now
- +6 ; 1 - Still asleep
- +7 ;
- +8 IF '$GET(IEN59)
- QUIT 0
- +9 NEW GRPLAN,BPSIEN15,RETCNT,BPSPARAM,BPSRETRY,PROBER,IEN59T
- +10 NEW DIE,DA,DR,DTOUT
- +11 ;
- +12 ; Get GROUP INSURANCE PLAN
- +13 SET GRPLAN=$$GETPLN59^BPSUTIL2(IEN59)
- IF 'GRPLAN
- QUIT 0
- +14 ;
- +15 ; If the payer is not already asleep, add it to the BPS ASLEEP PAYERS file
- +16 SET BPSIEN15=$ORDER(^BPS(9002313.15,"B",+GRPLAN,0))
- +17 IF 'BPSIEN15
- SET BPSIEN15=+$$ADDSLEEP(IEN59)
- +18 IF BPSIEN15<1
- QUIT 0
- +19 ;
- +20 ; Get the prober.
- +21 SET PROBER=$PIECE($GET(^BPS(9002313.15,BPSIEN15,0)),U,4)
- +22 ;
- +23 ; If there is a prober and this is not it, just put this transaction to sleep and quit
- +24 IF PROBER
- IF IEN59'=PROBER
- DO SETSLEEP(IEN59,BPSIEN15,$TEXT(+0)_"-Insurer Asleep-Waiting for Prober Transaction "_PROBER_" to complete")
- QUIT 1
- +25 ;
- +26 ; Get Asleep Paramters from BPS SETUP
- +27 ; If the parameters are off, return 0
- +28 SET BPSPARAM=^BPS(9002313.99,1,0)
- +29 IF '$PIECE(BPSPARAM,"^",5)!('$PIECE(BPSPARAM,"^",6))
- QUIT 0
- +30 ;
- +31 ; If maximum retries reached, flag to wake up and set status to complete.
- +32 SET RETCNT=$PIECE($GET(^BPS(9002313.15,BPSIEN15,0)),U,2)+1
- +33 IF RETCNT>$PIECE(BPSPARAM,"^",6)
- Begin DoDot:1
- +34 DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Maximum retries reached for insurer. Completing BPS TRANSACTION: "_IEN59)
- End DoDot:1
- QUIT 0
- +35 ;
- +36 ; Set RETRY TIME based on site parameters and update retry count and retry time
- +37 SET BPSRETRY=$$FMADD^XLFDT($$NOW^XLFDT,,,$PIECE(BPSPARAM,"^",5))
- +38 IF $$FILLFLDS^BPSUTIL2(9002313.15,".02",BPSIEN15,RETCNT)<1
- QUIT 0
- +39 IF $$FILLFLDS^BPSUTIL2(9002313.15,".05",BPSIEN15,BPSRETRY)<1
- QUIT 0
- +40 ;
- +41 ; Put the prober to Sleep
- +42 SET MSG="Retry number "_RETCNT_" scheduled for "_$$FMTE^XLFDT(BPSRETRY)
- +43 DO SETSLEEP(IEN59,BPSIEN15,$TEXT(+0)_"-Insurer Asleep for "_$PIECE(GRPLAN,U,2)_". "_MSG)
- +44 ;
- +45 ; Update the Last Update date/time for associated claims so that they don't
- +46 ; end up on the View/Unstand Submission Screen
- +47 SET IEN59T=""
- FOR
- SET IEN59T=$ORDER(^BPST("ASL",BPSIEN15,IEN59T))
- if IEN59T=""
- QUIT
- Begin DoDot:1
- +48 IF IEN59T=PROBER
- QUIT
- +49 SET DIE=9002313.59
- SET DA=IEN59T
- SET DR="7///NOW"
- DO ^DIE
- +50 DO LOG^BPSOSL(IEN59T,$TEXT(+0)_"-INCSLEEP is resetting the LAST UPDATE field to the current date/time")
- End DoDot:1
- +51 ;
- +52 ; Queue packeter to restart at next retry time+10 seconds
- +53 DO TASKAT^BPSOSQA($$FMADD^XLFDT(BPSRETRY,,,,10))
- +54 ;
- +55 QUIT 1
- +56 ;
- SETSLEEP(IEN59,BPSIEN15,MSG) ;
- +1 ; Put transaction to sleep
- +2 ; Input
- +3 ; IEN59 - BPS Transaction IEN
- +4 ; BPSIEN15 - BPS Asleep Payer IEN
- +5 ; MSG - Message used for Log
- +6 ;
- +7 IF '$GET(IEN59)
- QUIT
- +8 IF '$GET(BPSIEN15)
- QUIT
- +9 NEW DIE,DA,DR,DTOUT
- +10 ;
- +11 ; If the BPS TRANSACTION is not already pointing to the asleep payer, update it
- +12 IF '$DATA(^BPST("ASL",BPSIEN15,IEN59))
- SET DIE=9002313.59
- SET DA=IEN59
- SET DR="801////^S X=BPSIEN15"
- DO ^DIE
- +13 ;
- +14 ; Set to 31% (Wait for retry (insurer asleep)) and log message
- +15 DO SETSTAT^BPSOSU(IEN59,31)
- +16 IF $GET(MSG)=""
- SET MSG=$TEXT(+0)_"-Transaction being put to sleep by SETSLEEP"
- +17 DO LOG^BPSOSL(IEN59,MSG)
- +18 QUIT
- +19 ;
- CLRSLEEP(GRPLAN,IEN59) ;EP - BPSOSQL
- +1 ; Clear insurer sleeping condition
- +2 ; Input:
- +3 ; GRPLAN - Group Insurance Plan IEN
- +4 ; IEN59 - BPS Transaction IEN
- +5 ;
- +6 IF '$GET(GRPLAN)
- QUIT
- +7 NEW BPSIEN15,DA,DIE,DR,DTOUT,DIK,IEN59T
- +8 ;
- +9 ; Get the BPS ASLEEP PAYER record
- +10 SET BPSIEN15=$ORDER(^BPS(9002313.15,"B",+GRPLAN,0))
- +11 IF BPSIEN15=""
- QUIT
- +12 ;
- +13 ; Logging message and creating a comment
- +14 IF $GET(IEN59)
- DO LOG^BPSOSL(IEN59,$TEXT(+0)_"-Clearing sleep for "_$PIECE(GRPLAN,U,2))
- +15 ;
- +16 ; Delete the BPS ASLEEP PAYER record
- +17 SET DA=BPSIEN15
- SET DIK="^BPS(9002313.15,"
- DO ^DIK
- +18 ;
- +19 ; Clear any pointers to the sleep payer
- +20 SET IEN59T=""
- FOR
- SET IEN59T=$ORDER(^BPST("ASL",BPSIEN15,IEN59T))
- if IEN59T=""
- QUIT
- Begin DoDot:1
- +21 SET DIE=9002313.59
- SET DA=IEN59T
- SET DR="801///@"
- DO ^DIE
- +22 DO LOG^BPSOSL(IEN59T,$TEXT(+0)_"-CLRSLEEP is clearing pointer to ASLEEP PAYER")
- End DoDot:1
- +23 ;
- +24 ; Run the packeter to resubmit any other claims for the this payer
- +25 DO TASK^BPSOSQA
- +26 QUIT