| 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 %
 | 
|---|