[613] | 1 | BPSJHLT ;BHAM ISC/LJF - HL7 Process Incoming MFN Messages ;05-NOV-2003
|
---|
| 2 | ;;1.0;E CLAIMS MGMT ENGINE;**1**;JUN 2004
|
---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
| 4 | ;
|
---|
| 5 | ;**Program Description**
|
---|
| 6 | ; This program will process incoming MFN messages and
|
---|
| 7 | ; update the appropriate tables
|
---|
| 8 | ;
|
---|
| 9 | ; Direct entry not allowed
|
---|
| 10 | Q
|
---|
| 11 | ;
|
---|
| 12 | PKY(PKYNM,PKYROOT,ADD) ;Lookup ien or add using PKYNM
|
---|
| 13 | N DA,DO,DIC,DIE,DINUM,DLAYGO,DTOUT,DUOUT,Y,X
|
---|
| 14 | I $G(PKYNM)]"",$G(PKYROOT)]"" S ADD=+$G(ADD)
|
---|
| 15 | E Q 0
|
---|
| 16 | S X=PKYNM,DIC=PKYROOT
|
---|
| 17 | I 'ADD S DIC(0)="X" D ^DIC
|
---|
| 18 | I ADD S DIC(0)="L",DLAYGO=PKYROOT D FILE^DICN
|
---|
| 19 | Q +Y
|
---|
| 20 | ;
|
---|
| 21 | EN(HL) ; Entry Point
|
---|
| 22 | ;
|
---|
| 23 | N BPSJACT,BPSJPKY,BPSJADT,BPSZPRER,BPSJROOT,PSIEN,APPACK
|
---|
| 24 | N ZPRS,BPSJSEG,HCT,ERRFLAG,NAFLG,NPFLG,SEG,MSG,MCT,FLN,FILE
|
---|
| 25 | N RBSTART,RBEND,RBCNT,ZPSNNAME,ZPRCNT,BPSETID,RCODE,MAXRX
|
---|
| 26 | N FS,CS,PSHTVER,NCPDPVER,NCPDPCK,BPSFILE,BPSJCNT,BPSJDEVN
|
---|
| 27 | N BPSJPROD,BPSJNAME,DIK,TCH
|
---|
| 28 | ;
|
---|
| 29 | S FS=$G(HL("FS")) I FS="" S FS="|" ; field separator
|
---|
| 30 | S CS=$E($G(HL("ECH"))) I CS="" S CS="^" ; component separator
|
---|
| 31 | ;
|
---|
| 32 | K ^TMP($J,"BPSJ-RBACK"),^TMP($J,"BPSJ-ERROR")
|
---|
| 33 | ;
|
---|
| 34 | D INITZPRS^BPSJZPR(.ZPRS)
|
---|
| 35 | S BPSFILE=9002313.92,BPSJROOT=$$ROOT^DILFD(BPSFILE)
|
---|
| 36 | S RBSTART=100,RBEND=230,NCPDPCK="51"
|
---|
| 37 | S (ZPSNNAME,BPSJPROD,NCPDPVER,BPSJACT,BPSJADT,BPSJPKY)=""
|
---|
| 38 | ;
|
---|
| 39 | ; Initialize some Application Acknowledgement data
|
---|
| 40 | D DGAPPACK^BPSJACK
|
---|
| 41 | S APPACK("MSA",1)="AE" ; Assume error
|
---|
| 42 | S APPACK("MSA",2)=$G(HL("MID")) ; Message ID
|
---|
| 43 | S APPACK("MFA",4,1)="U" ; Set flag type of "unsuccessful event"
|
---|
| 44 | S APPACK("MFA",6)="ST"
|
---|
| 45 | S APPACK("MFI",6)="NE"
|
---|
| 46 | ;
|
---|
| 47 | ; Init encoding char array
|
---|
| 48 | S TCH("\F\")="|",TCH("\R\")="~"
|
---|
| 49 | S TCH("\E\")="\",TCH("\T\")="&"
|
---|
| 50 | ;
|
---|
| 51 | S HCT=1,(MCT,NAFLG,NPFLG,ERRFLAG,ZPRCNT,MAXRX)=0
|
---|
| 52 | F D Q:'HCT I ERRFLAG Q
|
---|
| 53 | . K BPSJSEG S HCT=$O(^TMP($J,"BPSJHLI",HCT))
|
---|
| 54 | . D SPAR^BPSJUTL(.HL,.BPSJSEG,HCT) S SEG=$G(BPSJSEG(1))
|
---|
| 55 | . ;
|
---|
| 56 | . ; ; payer sheet detail (multiple)
|
---|
| 57 | . I SEG="ZPR" D Q ; Record #5+ (MSH is record #1)
|
---|
| 58 | .. ;
|
---|
| 59 | .. I ERRFLAG Q ; Fatal Error
|
---|
| 60 | .. S ZPRCNT=ZPRCNT+1,BPSETID=$G(BPSJSEG(2))
|
---|
| 61 | .. ;-If not numeric equivalent the warp engines are offline, Captain
|
---|
| 62 | .. I BPSETID'=ZPRCNT D FAKEREC(ZPRCNT)
|
---|
| 63 | .. D EN^BPSJZPR(PSIEN,.BPSJSEG,BPSJROOT,BPSFILE)
|
---|
| 64 | . ;
|
---|
| 65 | . I SEG="MFI" D Q ; Record #2
|
---|
| 66 | .. ;
|
---|
| 67 | .. ;-Required Field checks
|
---|
| 68 | .. D ERRMSG(0,"MFI","1,2,3",.BPSJSEG)
|
---|
| 69 | .. ;
|
---|
| 70 | .. S APPACK("MFI",1,1)=$P($G(BPSJSEG(2)),CS)
|
---|
| 71 | .. S APPACK("MFI",1,2)=$P($G(BPSJSEG(2)),CS,2)
|
---|
| 72 | .. I APPACK("MFI",1,1)]"",APPACK("MFI",1,2)]""
|
---|
| 73 | .. E D
|
---|
| 74 | ... ; hard code these for Version 1.0 of s/w
|
---|
| 75 | ... D FILE^DID(BPSFILE,,"NAME","BPSJNAME")
|
---|
| 76 | ... I APPACK("MFI",1,1)="" S APPACK("MFI",1,1)=BPSFILE
|
---|
| 77 | ... I APPACK("MFI",1,2)="" S APPACK("MFI",1,2)=$G(BPSJNAME("NAME"))
|
---|
| 78 | ... K BPSJNAME
|
---|
| 79 | ... ;
|
---|
| 80 | .. S APPACK("MFI",3)=$G(BPSJSEG(4))
|
---|
| 81 | . ;
|
---|
| 82 | . I SEG="MFE" D Q ; Record #3
|
---|
| 83 | .. ;
|
---|
| 84 | .. ;-Required Field checks
|
---|
| 85 | .. D ERRMSG(0,"MFE","1,2,4,5",.BPSJSEG)
|
---|
| 86 | .. ;
|
---|
| 87 | .. S BPSJADT=$$NOW^XLFDT()
|
---|
| 88 | .. S (BPSJACT,APPACK("MFA",1))=$G(BPSJSEG(2)) ; Action type
|
---|
| 89 | .. I $L(BPSJACT)=3,"^MAD^MUP^MDC^"[(U_BPSJACT_U)
|
---|
| 90 | .. E D ERRMSG(1,"MFE","1^INVALID EVENT CODE")
|
---|
| 91 | .. ;
|
---|
| 92 | .. S APPACK("MFA",2)=$G(BPSJSEG(3)) ; MFN Control ID
|
---|
| 93 | .. ;
|
---|
| 94 | .. ; Old/Current Sheet name
|
---|
| 95 | .. S (BPSJPKY,APPACK("MFA",5))=$G(BPSJSEG(5))
|
---|
| 96 | .. S APPACK("MFA",4,2)="Payer Sheet "_BPSJPKY
|
---|
| 97 | .. S BPSJPKY=$$DECODE^BPSJZPR(BPSJPKY,.TCH)
|
---|
| 98 | .. ;
|
---|
| 99 | .. ;-Get ien using sheet name, if one exists
|
---|
| 100 | .. S PSIEN=$$PKY(BPSJPKY,BPSJROOT)
|
---|
| 101 | .. ;
|
---|
| 102 | .. I PSIEN=0 D ERRMSG(91,"Fileman error") Q
|
---|
| 103 | .. ;
|
---|
| 104 | .. I PSIEN>0 D ; Exists: save current data for rollback
|
---|
| 105 | ... S APPACK("MFA",4,1)="P" ;Set flag type to "P"rior version
|
---|
| 106 | ... M ^TMP($J,"BPSJ-RBACK",PSIEN)=^BPSF(9002313.92,PSIEN)
|
---|
| 107 | ... ;-Kill appropriate existing Payer Sheet fields
|
---|
| 108 | ... F RBCNT=RBSTART:10:RBEND K ^BPSF(9002313.92,PSIEN,RBCNT)
|
---|
| 109 | .. ;
|
---|
| 110 | .. ;-Create development sheet
|
---|
| 111 | .. I PSIEN<0 S BPSJCNT=0 F S BPSJCNT=1+BPSJCNT D Q:PSIEN>0
|
---|
| 112 | ... S BPSJDEVN="BPSJ-DEV-"_$J_"-"_BPSJCNT
|
---|
| 113 | ... S PSIEN=$$PKY(BPSJDEVN,BPSJROOT) ; see if dev sheet exists
|
---|
| 114 | ... I PSIEN>-1 S PSIEN=0 Q
|
---|
| 115 | ... S PSIEN=$$PKY(BPSJDEVN,BPSJROOT,1) ; add new one
|
---|
| 116 | .. ;
|
---|
| 117 | .. I PSIEN=0 D ERRMSG(92,"Fileman error") Q
|
---|
| 118 | .. ;
|
---|
| 119 | .. ;-Flag the sheet as being in development by this process
|
---|
| 120 | .. K DA,DIE,DR S DA=PSIEN,DIE=BPSJROOT
|
---|
| 121 | .. S DR="1.06////1."_$J ;FOR DEVELOPMENT
|
---|
| 122 | .. D ^DIE
|
---|
| 123 | . ;
|
---|
| 124 | . ;payer sheet header
|
---|
| 125 | . I SEG="ZPS" D Q ; Record #4
|
---|
| 126 | .. ;
|
---|
| 127 | .. ;-Required Field checks
|
---|
| 128 | .. D ERRMSG(0,"ZPS","1,2,3,4,5,6,7",.BPSJSEG)
|
---|
| 129 | .. ;
|
---|
| 130 | .. ;-New sheet name, production status and Payer Sheet and NCPDP versions
|
---|
| 131 | .. S ZPSNNAME=$$DECODE^BPSJZPR($G(BPSJSEG(4)),.TCH) K TCH
|
---|
| 132 | .. I ZPSNNAME="" S ZPSNNAME=$G(BPSJPKY)
|
---|
| 133 | .. S BPSJPROD=$G(BPSJSEG(8)) I BPSJPROD'="P" S BPSJPROD="T"
|
---|
| 134 | .. S PSHTVER=$G(BPSJSEG(5)) I PSHTVER'=(PSHTVER\1) S ^TMP($J,"BPSJ-ERROR","ZPS",4)=""
|
---|
| 135 | .. S NCPDPVER=$G(BPSJSEG(6)) I NCPDPVER'=NCPDPCK S ^TMP($J,"BPSJ-ERROR","ZPS",5)=""
|
---|
| 136 | ;
|
---|
| 137 | I '$D(^TMP($J,"BPSJ-ERROR")) D
|
---|
| 138 | . S APPACK("MFA",4,1)="S" ; flag success
|
---|
| 139 | . S DR=".01////"_ZPSNNAME ; set the name
|
---|
| 140 | . S DA=PSIEN,DIE=BPSJROOT D ^DIE
|
---|
| 141 | . ;
|
---|
| 142 | . I BPSJACT="MDC" S BPSJACT=0 ;Disabled
|
---|
| 143 | . E D I 'BPSJACT S BPSJACT=0
|
---|
| 144 | .. I BPSJPROD="P" S BPSJACT=3 ;Production
|
---|
| 145 | .. I BPSJPROD="T" S BPSJACT=2 ;Testing
|
---|
| 146 | . S DR="1.06////"_BPSJACT,DA=PSIEN,DIE=BPSJROOT D ^DIE
|
---|
| 147 | . ; NCPDP Version
|
---|
| 148 | . S DR="1.02////"_NCPDPVER,DA=PSIEN,DIE=BPSJROOT D ^DIE
|
---|
| 149 | . ; Payer Sheet Version
|
---|
| 150 | . S DR="1.14////"_PSHTVER,DA=PSIEN,DIE=BPSJROOT D ^DIE
|
---|
| 151 | . ;
|
---|
| 152 | . I BPSJACT=2 D SETTEST(ZPSNNAME,PSIEN)
|
---|
| 153 | . ;
|
---|
| 154 | E I $G(PSIEN) D ;-Roll back
|
---|
| 155 | . ;-Remove if no prior existence
|
---|
| 156 | . I $G(^TMP($J,"BPSJ-RBACK",PSIEN,0))="" D Q
|
---|
| 157 | .. S DIK=BPSJROOT,DA=PSIEN D ^DIK
|
---|
| 158 | . ;
|
---|
| 159 | . ; Restore old data
|
---|
| 160 | . S ^BPSF(9002313.92,PSIEN,0)=$G(^TMP($J,"BPSJ-RBACK",PSIEN,0))
|
---|
| 161 | . S ^BPSF(9002313.92,PSIEN,1)=$G(^TMP($J,"BPSJ-RBACK",PSIEN,1))
|
---|
| 162 | . F RBCNT=RBSTART:10:RBEND D
|
---|
| 163 | .. K ^BPSF(9002313.92,PSIEN,RBCNT)
|
---|
| 164 | .. M ^BPSF(9002313.92,PSIEN,RBCNT)=^TMP($J,"BPSJ-RBACK",PSIEN,RBCNT)
|
---|
| 165 | ;
|
---|
| 166 | D APPACK^BPSJACK(.HL,.APPACK,PSIEN)
|
---|
| 167 | ;
|
---|
| 168 | K ^TMP($J,"BPSJ-RBACK"),^TMP($J,"BPSJ-ERROR")
|
---|
| 169 | ;
|
---|
| 170 | Q
|
---|
| 171 | ;
|
---|
| 172 | FAKEREC(REF) ; Setup a fake Record ID (Set ID)
|
---|
| 173 | N IX
|
---|
| 174 | ;
|
---|
| 175 | S REF=+$G(REF)
|
---|
| 176 | S IX=$G(BPSJSEG(2)),BPSJSEG(2)=REF
|
---|
| 177 | I IX="" D Q ; Missing
|
---|
| 178 | . S ^TMP($J,"BPSJ-ERROR","ZPR",REF,1)="V631-1,"_REF
|
---|
| 179 | ;
|
---|
| 180 | I IX=+IX,IX'=0
|
---|
| 181 | E D Q ; Invalid
|
---|
| 182 | . S ^TMP($J,"BPSJ-ERROR","ZPR",REF,1)="V631-2,"_REF
|
---|
| 183 | ;
|
---|
| 184 | ; We have a valid numeric to work with, but:
|
---|
| 185 | ;
|
---|
| 186 | ; Duplicate
|
---|
| 187 | I $G(^TMP($J,"BPSJ-ERROR","ZPR",IX))=IX D Q
|
---|
| 188 | . S ^TMP($J,"BPSJ-ERROR","ZPR",REF,1)="V631-4,"_REF
|
---|
| 189 | ;
|
---|
| 190 | ; Out Of Sequence
|
---|
| 191 | S ^TMP($J,"BPSJ-ERROR","ZPR",REF,1)="V631-3,"_REF
|
---|
| 192 | S ^TMP($J,"BPSJ-ERROR","ZPR",REF)=IX
|
---|
| 193 | ;
|
---|
| 194 | Q
|
---|
| 195 | ;
|
---|
| 196 | ERRMSG(SPECIAL,SEG,REQFLDS,BPSJSEG) ;
|
---|
| 197 | N FCNT,FNO,FIELD,C
|
---|
| 198 | S C=",",SPECIAL=+$G(SPECIAL),SEG=$G(SEG),REQFLDS=$G(REQFLDS)
|
---|
| 199 | I 'SPECIAL D Q
|
---|
| 200 | . ;-Evaluate required fields for non ZPR segs
|
---|
| 201 | . S FNO=$J(REQFLDS,C)
|
---|
| 202 | . F FCNT=1:1:FNO S FIELD=$P(REQFLDS,C,FCNT) I FIELD D
|
---|
| 203 | .. ;-Set flag for empty required field
|
---|
| 204 | .. I $G(BPSJSEG(FIELD+1))="" S ^TMP($J,"BPSJ-ERROR",SEG,FIELD)=""
|
---|
| 205 | ;
|
---|
| 206 | ;-"Special" handler
|
---|
| 207 | I SPECIAL=1 D Q
|
---|
| 208 | . ;-Set flag that field contains invalid value
|
---|
| 209 | . S ^TMP($J,"BPSJ-ERROR",SEG,+REQFLDS)=REQFLDS
|
---|
| 210 | ;
|
---|
| 211 | I SPECIAL>90 S ERRFLAG=1
|
---|
| 212 | Q
|
---|
| 213 | ;
|
---|
| 214 | SETTEST(TESTNAME,TESTIX) ; Test payer sheet handler
|
---|
| 215 | ; Massage to look like production version
|
---|
| 216 | ;
|
---|
| 217 | N PRODNM,PCNT,PRODIX,PRODDATA,TESTDATA,REVERSE
|
---|
| 218 | ;
|
---|
| 219 | I '$G(TESTIX) Q
|
---|
| 220 | ; Derive production version name
|
---|
| 221 | ; if test version name = ABCDE-001 then Prod version name = ABCDE
|
---|
| 222 | S PCNT=$L($G(TESTNAME),"-")-1 I PCNT<1 Q
|
---|
| 223 | S PRODNM=$P(TESTNAME,"-",1,PCNT)
|
---|
| 224 | ; Find Production version & get data if exists
|
---|
| 225 | S PRODIX=$O(^BPSF(9002313.92,"B",PRODNM,"")) I 'PRODIX Q
|
---|
| 226 | S PRODDATA=$G(^BPSF(9002313.92,PRODIX,1)) I PRODDATA="" Q
|
---|
| 227 | ; Get this test version's data
|
---|
| 228 | S TESTDATA=$G(^BPSF(9002313.92,TESTIX,1))
|
---|
| 229 | ; load test fields from production
|
---|
| 230 | S $P(TESTDATA,U,3)=$P(PRODDATA,U,3) ;Maximum RX's Per Claim
|
---|
| 231 | S $P(TESTDATA,U,7)=$P(PRODDATA,U,7) ;Is A Reversal Format
|
---|
| 232 | S $P(TESTDATA,U,13)=$P(PRODDATA,U,13) ;SOFTWARE VENDOR/CERT ID
|
---|
| 233 | S ^BPSF(9002313.92,TESTIX,1)=TESTDATA
|
---|
| 234 | ; Get Reversal Format pointer
|
---|
| 235 | S REVERSE=$G(^BPSF(9002313.92,PRODIX,"REVERSAL"))
|
---|
| 236 | ; Set test sheet to itself if production sheet points to itself.
|
---|
| 237 | I REVERSE=PRODIX S REVERSE=TESTIX
|
---|
| 238 | S ^BPSF(9002313.92,TESTIX,"REVERSAL")=REVERSE
|
---|
| 239 | ;
|
---|
| 240 | Q
|
---|