| 1 | BPSOSQ2 ;BHAM ISC/FCS/DRS/DLF - form transmission packets ;06/01/2004 | 
|---|
| 2 | ;;1.0;E CLAIMS MGMT ENGINE;**1,5**;JUN 2004;Build 45 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; Construct packets for transmission | 
|---|
| 5 | Q | 
|---|
| 6 | ; | 
|---|
| 7 | PACKETS ; EP - Tasked by BPSOSQA | 
|---|
| 8 | ; | 
|---|
| 9 | ; Initialize | 
|---|
| 10 | N ERROR,RXILIST,STATUS | 
|---|
| 11 | ; | 
|---|
| 12 | ; First handle insurer alseep transactions | 
|---|
| 13 | D STATUS31^BPSOSQF | 
|---|
| 14 | ; | 
|---|
| 15 | ; Handle claims that need the packet to be built | 
|---|
| 16 | I $D(^BPST("AD",30)) D STATUS30 | 
|---|
| 17 | ; | 
|---|
| 18 | ; If there are still any claims with status 30 (perhaps due to failed | 
|---|
| 19 | ;   LOCK59), queue up BPSOSQ2 to run again | 
|---|
| 20 | I $O(^BPST("AD",30,0)) H 60 D TASK^BPSOSQA | 
|---|
| 21 | Q | 
|---|
| 22 | ; | 
|---|
| 23 | ; Walk through claims at 30%, bundle, and create the claim | 
|---|
| 24 | STATUS30 ; | 
|---|
| 25 | N IEN59 | 
|---|
| 26 | S IEN59="" | 
|---|
| 27 | I '$$LOCK59(30) Q | 
|---|
| 28 | ; | 
|---|
| 29 | ; Loop though claims at 30%, bundle with other 30% claims, and process | 
|---|
| 30 | F  S IEN59=$$NEXT59(IEN59,30) Q:IEN59=""  D | 
|---|
| 31 | . ; Intialize the list | 
|---|
| 32 | . K RXILIST | 
|---|
| 33 | . S RXILIST(IEN59)="" | 
|---|
| 34 | . ; | 
|---|
| 35 | . ; Update the status to 40 (Building the packet) | 
|---|
| 36 | . D SETSTAT^BPSOSU(IEN59,40) | 
|---|
| 37 | . ; | 
|---|
| 38 | . ; If reversal, only one claim per packet | 
|---|
| 39 | . I $G(^BPST(IEN59,4)) G POINTX | 
|---|
| 40 | . ; | 
|---|
| 41 | . ; If prior auth are entered, only one claim per packet | 
|---|
| 42 | . G:$$CHKPA() POINTX | 
|---|
| 43 | . ; | 
|---|
| 44 | . ; Code below is for bundling claims.  The VA is not doing this | 
|---|
| 45 | . ; so we are skipping it.  However, the code is left here in | 
|---|
| 46 | . ; case we do bundling in the future.  If so, the code will need to be | 
|---|
| 47 | . ; rewritten to look at the corect fields. | 
|---|
| 48 | . G POINTX | 
|---|
| 49 | . ; | 
|---|
| 50 | . N RA0,RA1 S RA0=^BPST(IEN59,0),RA1=^(1) | 
|---|
| 51 | . N IEN59 S IEN59="" ; preserve the top-level index! | 
|---|
| 52 | . F  S IEN59=$$NEXT59(IEN59,30) Q:'IEN59  D | 
|---|
| 53 | .. N RB0,RB1 S RB0=^BPST(IEN59,0),RB1=^(1) | 
|---|
| 54 | .. ; Only bundle when you have the same: | 
|---|
| 55 | .. ; Patient, Visit, Division, Division Source, Insurer, Pharmacy | 
|---|
| 56 | .. I $P(RA0,U,6,7)'=$P(RB0,U,6,7) Q | 
|---|
| 57 | .. I $P(RA1,U,4,7)'=$P(RB1,U,4,7) Q | 
|---|
| 58 | .. I $P(RB0,U,2)'=30 Q  ; might have been canceled, or maybe 31'd | 
|---|
| 59 | .. D SETSTAT^BPSOSU(IEN59,40) | 
|---|
| 60 | .. S RXILIST(IEN59)="" | 
|---|
| 61 | POINTX . ; Reversals and prior auth claims branch to here to bypass multi-claim packeting | 
|---|
| 62 | . ; | 
|---|
| 63 | . ; BPSOSQG will build the claim data, create the packet, and send to HL7 | 
|---|
| 64 | . S ERROR=$$PACKET^BPSOSQG | 
|---|
| 65 | . ; | 
|---|
| 66 | . ; If an error is returned, log the error to each transaction | 
|---|
| 67 | . I ERROR S IEN59="" F  S IEN59=$O(RXILIST(IEN59)) Q:IEN59=""  D | 
|---|
| 68 | .. D ERROR^BPSOSU($T(+0),IEN59,$P(ERROR,U),$P(ERROR,U,2,$L(ERROR,U))) | 
|---|
| 69 | D UNLOCK59(30) | 
|---|
| 70 | Q | 
|---|
| 71 | ; | 
|---|
| 72 | NEXT59(IEN59,STATUS) ;EP - BPSOSQF | 
|---|
| 73 | N INS,PAYSH,PAYSHNM,RETRY | 
|---|
| 74 | N59A ; | 
|---|
| 75 | ; Get next transaction for the given status | 
|---|
| 76 | S IEN59=$O(^BPST("AD",STATUS,IEN59)) | 
|---|
| 77 | I IEN59="" Q IEN59  ; end of list, return "" | 
|---|
| 78 | ; | 
|---|
| 79 | ; but if the insurer is asleep, don't take this one | 
|---|
| 80 | S INS=$P(^BPST(IEN59,9),U,1) | 
|---|
| 81 | ; | 
|---|
| 82 | ; Not sure when this would happen, but do not want to take it out | 
|---|
| 83 | I INS="" S INS=1,$P(^BPST(IEN59,9),U,1)=INS  ;LJE;8/25/03  ;current insurance | 
|---|
| 84 | ; | 
|---|
| 85 | ; Get the payer sheet, name, and retry time | 
|---|
| 86 | S PAYSH=$$PAYERSH^BPSOSQF(IEN59) | 
|---|
| 87 | S PAYSHNM=$$GET1^DIQ(9002313.92,PAYSH_",",.01,"E") | 
|---|
| 88 | S RETRY=$$GET1^DIQ(9002313.92,PAYSH_",",1.12,"I")    ;RETRY TIME | 
|---|
| 89 | ; | 
|---|
| 90 | ; If no retry time, insurer is not asleep and we can return the transaction | 
|---|
| 91 | I 'RETRY Q IEN59 | 
|---|
| 92 | ; | 
|---|
| 93 | ; Insurer is asleep - | 
|---|
| 94 | ; If necessary, update the .59's record of when to retry | 
|---|
| 95 | I $P($G(^BPST(IEN59,8)),U)'=RETRY D  ; | 
|---|
| 96 | . S $P(^BPST(IEN59,8),U)=RETRY ; stamp with latest retry time | 
|---|
| 97 | . D SETSTAT^BPSOSU(IEN59,31) ; force screen update, too | 
|---|
| 98 | . D LOG^BPSOSL(IEN59,$T(+0)_"-Insurer still asleep - retry at "_RETRY_" for "_$G(PAYSHNM)) | 
|---|
| 99 | ; | 
|---|
| 100 | ; If time to retry, return this transaction for processing | 
|---|
| 101 | I RETRY'>$$NOW Q IEN59 | 
|---|
| 102 | ; | 
|---|
| 103 | ; If we are checking status 30, convert to insurer asleep | 
|---|
| 104 | I STATUS=30 D | 
|---|
| 105 | . D SETSTAT^BPSOSU(IEN59,31) | 
|---|
| 106 | . S $P(^BPST(IEN59,8),U)=$P($G(^BPSF(9002313.92,PAYSH,1)),"^",12) | 
|---|
| 107 | . S $P(^BPST(IEN59,8),U,3)=PAYSH | 
|---|
| 108 | ; | 
|---|
| 109 | ; Still asleep, go to next transaction | 
|---|
| 110 | G N59A | 
|---|
| 111 | ; | 
|---|
| 112 | ; | 
|---|
| 113 | LOCK59(STATUS) ;EP - BPSOSQF | 
|---|
| 114 | L +^BPST("AD",STATUS):60 | 
|---|
| 115 | Q $T | 
|---|
| 116 | ; | 
|---|
| 117 | UNLOCK59(STATUS) ;EP - BPSOSQF | 
|---|
| 118 | L -^BPST("AD",STATUS) | 
|---|
| 119 | Q | 
|---|
| 120 | ; | 
|---|
| 121 | CHKPA() ; | 
|---|
| 122 | N PATYP,PANUM,PACLM | 
|---|
| 123 | S PACLM=0 | 
|---|
| 124 | ; | 
|---|
| 125 | S PATYP=$P($G(^BPST(IEN59,1)),U,15)    ;prior auth type code | 
|---|
| 126 | S PANUM=$P($G(^BPST(IEN59,1)),U,9)     ;prior auth number | 
|---|
| 127 | I ($G(PATYP)'="")!($G(PANUM)'="") S PACLM=1 | 
|---|
| 128 | ; | 
|---|
| 129 | Q PACLM | 
|---|
| 130 | ; | 
|---|
| 131 | NOW() N %,%H,%I,X D NOW^%DTC Q % | 
|---|