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