| 1 | BPSJZPR ;BHAM ISC/CMW/LJF - Process Incoming HL7 ZPR Message ;01-DEC-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 |  ; Description:
 | 
|---|
| 6 |  ; Process incoming HL7 ZPR Messages
 | 
|---|
| 7 |  ; Update Payer Sheet File (9002313.92)
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  Q
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ; Entry point
 | 
|---|
| 12 | EN(BPSJEN,BPSJSEG,BPSJROOT,BPSFILE) ;
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  N BPRCODE,BPSF,BPSFDIC,BPSEGID,BPORDER,BPMODE,BPNOTES,BPSETID
 | 
|---|
| 15 |  N FLN,FLNSC,FLNPN,FLNSPEC
 | 
|---|
| 16 |  N DIE,DIC,DLAYGO,DR,DA,DINUM
 | 
|---|
| 17 |  N C,X,Y,NCNT,BPND
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 |  I $G(BPSJEN),$G(BPSJROOT)]"",$G(BPSFILE)]"",$D(BPSJSEG)
 | 
|---|
| 20 |  E  Q   ; invalid info
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 |  S BPRCODE=$$ZPR(),DIE=$G(BPSJROOT),C=","
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  I BPRCODE,BPSEGID,BPORDER
 | 
|---|
| 25 |  E  Q
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  S BPSF=DIE_BPSJEN_C_BPSEGID_",0)"
 | 
|---|
| 28 |  I '$D(@BPSF) D
 | 
|---|
| 29 |  . S FLNSPEC=$$GET1^DID(BPSFILE,BPSEGID,"","SPECIFIER")
 | 
|---|
| 30 |  . S @BPSF=U_FLNSPEC_U_U
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 |  S (X,DINUM)=BPORDER
 | 
|---|
| 33 |  S DA(1)=BPSJEN,DIC=DIE_BPSJEN_C_BPSEGID_C
 | 
|---|
| 34 |  S DIC(0)="L",(DIC("P"),DLAYGO)=FLN
 | 
|---|
| 35 |  D ^DIC
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 |  S DA=+Y
 | 
|---|
| 38 |  S DIE=DIC
 | 
|---|
| 39 |  S DR=".02////"_BPRCODE_";.03////"_BPMODE
 | 
|---|
| 40 |  D ^DIE
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  S BPSFDIC=DIC ; save dictionary ID
 | 
|---|
| 43 |  ; NOTES
 | 
|---|
| 44 |  I $D(BPSJSEG(8)) D
 | 
|---|
| 45 |  . S DIC=BPSFDIC,DIE=BPSFDIC_BPORDER_",2,",BPSF=DIE_"0)"
 | 
|---|
| 46 |  . I '$D(@BPSF) S @BPSF=U_FLNPN_U_U
 | 
|---|
| 47 |  . S BPND="BPSJSEG(7,99)",NCNT=0
 | 
|---|
| 48 |  . F  S BPND=$Q(@BPND) Q:BPND=""  I $G(@BPND)]"" D
 | 
|---|
| 49 |  .. S DIC=BPSFDIC,DIE=BPSFDIC_BPORDER_",2,",BPSF=DIE_"0)"
 | 
|---|
| 50 |  .. K DA S DA(4)=BPSJEN,DA(3)=BPSEGID,DA(2)=BPORDER,DA(1)=2,(NCNT,DA)=NCNT+1
 | 
|---|
| 51 |  .. K DR S DR=".01////"_@BPND
 | 
|---|
| 52 |  .. D ^DIE
 | 
|---|
| 53 |  K BPSJSEG(8) ; kill 8 so $Q of 7 won't find it
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  ; Special Code
 | 
|---|
| 56 |  I $D(BPSJSEG(7)) D
 | 
|---|
| 57 |  . S DIC=BPSFDIC,DIE=BPSFDIC_BPORDER_",1,",BPSF=DIE_"0)"
 | 
|---|
| 58 |  . I '$D(@BPSF) S @BPSF=U_FLNSC_U_U
 | 
|---|
| 59 |  . S BPND="BPSJSEG(6,99)",NCNT=0
 | 
|---|
| 60 |  . F  S BPND=$Q(@BPND) Q:BPND=""  I $G(@BPND)]"" D
 | 
|---|
| 61 |  .. S DIC=BPSFDIC,DIE=BPSFDIC_BPORDER_",1,",BPSF=DIE_"0)"
 | 
|---|
| 62 |  .. K DA S DA(4)=BPSJEN,DA(3)=BPSEGID,DA(2)=BPORDER,DA(1)=1,(NCNT,DA)=NCNT+1
 | 
|---|
| 63 |  .. K DR S DR=".01////"_@BPND
 | 
|---|
| 64 |  .. D ^DIE
 | 
|---|
| 65 |  Q
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 | ZPR() ; Validate Fields and Initialize ZPR variables
 | 
|---|
| 68 |  N RCODE,WDATA
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  ; Reject reasons: 1=Missing ,2=Invalid
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  S BPSETID=$G(BPSJSEG(2))
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  S BPSEGID=$G(BPSJSEG(3))
 | 
|---|
| 75 |  I BPSEGID="" S BPSEGID=0 D
 | 
|---|
| 76 |  . S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,2)="V632-1,"_BPSETID
 | 
|---|
| 77 |  E  S BPSEGID=$G(ZPRS(BPSEGID)) D
 | 
|---|
| 78 |  . I 'BPSEGID S BPSEGID=0 D  Q
 | 
|---|
| 79 |  .. S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,2)="V632-2,"_BPSETID
 | 
|---|
| 80 |  . ;
 | 
|---|
| 81 |  . S FLN=$P(BPSEGID,U,2)
 | 
|---|
| 82 |  . S FLNSC=$P(BPSEGID,U,3)
 | 
|---|
| 83 |  . S FLNPN=$P(BPSEGID,U,4)
 | 
|---|
| 84 |  . S BPSEGID=+BPSEGID
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  S RCODE=$$GETPTR($G(BPSJSEG(4)))
 | 
|---|
| 87 |  I 'RCODE S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,3)="V633-2,"_BPSETID
 | 
|---|
| 88 |  I $G(BPSJSEG(4))="" S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,3)="V633-1,"_BPSETID
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 |  S BPORDER=$G(BPSJSEG(5))
 | 
|---|
| 91 |  I BPORDER="" S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,4)="V634,"_BPSETID
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 |  S BPMODE=$G(BPSJSEG(6))
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  I BPMODE'="X",BPMODE'="S" D
 | 
|---|
| 96 |  . S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,5)="V635,"_BPSETID
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 |  I '$L($G(BPSJSEG(7))),$D(BPSJSEG(7))'>1 K BPSJSEG(7)
 | 
|---|
| 99 |  E  D     ;NOTES(.BPSJSEG(7))
 | 
|---|
| 100 |  . K WDATA M WDATA(7)=BPSJSEG(7) D NOTES(.WDATA)
 | 
|---|
| 101 |  . K BPSJSEG(7) M BPSJSEG(7)=WDATA K WDATA
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 |  ; flag error if processing mode="X" and no special code
 | 
|---|
| 104 |  I BPMODE="X",'$D(BPSJSEG(7)) S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,6)="V636,"_BPSETID
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 |  I '$L($G(BPSJSEG(8))),$D(BPSJSEG(8))'>1 K BPSJSEG(8)
 | 
|---|
| 107 |  E  D   ;NOTES(.BPSJSEG(8))
 | 
|---|
| 108 |  . K WDATA M WDATA(8)=BPSJSEG(8) D NOTES(.WDATA)
 | 
|---|
| 109 |  . K BPSJSEG(8) M BPSJSEG(8)=WDATA K WDATA
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 |  Q RCODE
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 | NOTES(ARRAYIN,TRCH) ; fProgrammer Notes - Special Code handler
 | 
|---|
| 114 |  ;
 | 
|---|
| 115 |  N II,ODAT,NODENM
 | 
|---|
| 116 |  N ISDATA,ISDATA1,ISDATA2,ISDATA3
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  I '$D(TRCH) D   ; apply standard Vista/Vitria "Free Text" de-encoding
 | 
|---|
| 119 |  . S TRCH("\F\")="|",TRCH("\R\")="~",TRCH("\E\")="\"
 | 
|---|
| 120 |  . S TRCH("\T\")="&",TRCH("\S\")="^"
 | 
|---|
| 121 |  . S TRCH("\.b")=1,TRCH("\.br\")=1
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 |  S NODENM="ARRAYIN"
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  S (ODAT,ISDATA1)=""
 | 
|---|
| 126 |  F  S NODENM=$Q(@NODENM) Q:NODENM=""  S ISDATA=@NODENM D
 | 
|---|
| 127 |  . ; clean up partial string if any
 | 
|---|
| 128 |  . I $L(ISDATA1) D  I '$L(ISDATA) Q
 | 
|---|
| 129 |  .. S ISDATA1=ISDATA1_$E(ISDATA,1,10)
 | 
|---|
| 130 |  .. S ISDATA3=$$DECODE(ISDATA1,.TRCH,.ODAT,.ISDATA2)
 | 
|---|
| 131 |  .. S $E(ISDATA,1,10)=ISDATA2
 | 
|---|
| 132 |  . ;
 | 
|---|
| 133 |  . S ISDATA2=$$DECODE(ISDATA,.TRCH,.ODAT,.ISDATA1)
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 |  S ODAT=ODAT_ISDATA1 D NWNODE(.ODAT) K ARRAYIN M ARRAYIN=ODAT
 | 
|---|
| 136 |  Q
 | 
|---|
| 137 |  ;
 | 
|---|
| 138 | NWNODE(FREERAY) ; build free text array
 | 
|---|
| 139 |  N CNT
 | 
|---|
| 140 |  S CNT=1+$O(FREERAY(""),-1),FREERAY(CNT)=FREERAY,FREERAY=""
 | 
|---|
| 141 |  Q
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 | DECODE(INSTR,TCH,WDAT,INSTR1) ;
 | 
|---|
| 144 |  ; INSTR - Input string
 | 
|---|
| 145 |  ; TCH   - translation array
 | 
|---|
| 146 |  ; WDAT  - Output in a Vista compliant "Free Text" array
 | 
|---|
| 147 |  ; INSTR1 - Remainder of text when last or
 | 
|---|
| 148 |  ;          second to last INSTR char = "\"
 | 
|---|
| 149 |  ;Development Note:
 | 
|---|
| 150 |  ;\.br\ - removed and new node created
 | 
|---|
| 151 |  ;\E\.br\E\ = \.br\ - (no further translation)
 | 
|---|
| 152 |  ;non-printable character translation not supported
 | 
|---|
| 153 |  ;Output Array nodes will contain no more than 200 characters each
 | 
|---|
| 154 |  ;
 | 
|---|
| 155 |  N II,CH
 | 
|---|
| 156 |  S INSTR1="",WDAT=$G(WDAT)
 | 
|---|
| 157 |  F II=1:1:$L(INSTR) S CH=$E(INSTR,II) D:CH="\"  S WDAT=WDAT_CH I $L(WDAT)>199 D NWNODE(.WDAT)
 | 
|---|
| 158 |  . ;
 | 
|---|
| 159 |  . ;  Partial TCH string, if \.br\ (CR-LF) translation allowed
 | 
|---|
| 160 |  . I $L($E(INSTR,II,II+2))<3,$G(TCH("\.br\")) D  Q
 | 
|---|
| 161 |  .. S INSTR1=$E(INSTR,II,II+2),II=$L(INSTR),CH=""
 | 
|---|
| 162 |  . ;
 | 
|---|
| 163 |  . I '$D(TCH($E(INSTR,II,II+2))) Q     ; not one we're interested in
 | 
|---|
| 164 |  . I +$G(TCH($E(INSTR,II,II+2))) D  Q  ; \.br\ to <CR-LF> conversion
 | 
|---|
| 165 |  .. I (II+4)>$L(INSTR) S INSTR1=$E(INSTR,II,$L(INSTR)),II=$L(INSTR),CH="" Q
 | 
|---|
| 166 |  .. I +$G(TCH($E(INSTR,II,II+4))) S II=II+4,CH="" D NWNODE(.WDAT)
 | 
|---|
| 167 |  . ;
 | 
|---|
| 168 |  . S CH=TCH($E(INSTR,II,II+2)),II=II+2  ; std conversion
 | 
|---|
| 169 |  Q WDAT   ; Return top node of WDAT - for strings less than 200 characters
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 | GETPTR(BPDAT) ; Get pointer into BPS NCPDP FIELD DEFS
 | 
|---|
| 172 |  N BPSFNM,BPSFNO,BPSIX,BPSIXALT,BPSFX,BPNAMIX,BPNUMIX,BPSFNOCK
 | 
|---|
| 173 |  ;
 | 
|---|
| 174 |  S BPSFNM=$P($G(BPDAT),"-",2),BPSFNO=+$G(BPDAT)
 | 
|---|
| 175 |  I BPSFNM]"",BPSFNO S (BPSIX,BPSIXALT)=0,BPSFX=BPSFNO_U_BPSFNM
 | 
|---|
| 176 |  E  Q 0
 | 
|---|
| 177 |  S BPNAMIX=$O(^BPSF(9002313.91,"D",BPSFNM,""))
 | 
|---|
| 178 |  S BPNUMIX=$O(^BPSF(9002313.91,"B",BPSFNO,""))
 | 
|---|
| 179 |  ;
 | 
|---|
| 180 |  ;-if NAME and NUMBER point to the same IEN (but not 0)
 | 
|---|
| 181 |  I BPNAMIX,BPNUMIX=BPNAMIX Q BPNAMIX
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  ;-else might be in another node of the "D" x-ref
 | 
|---|
| 184 |  I BPNAMIX,BPNUMIX F  D  Q:BPSIX  Q:'BPNAMIX
 | 
|---|
| 185 |  . S BPNAMIX=$O(^BPSF(9002313.91,"D",BPSFNM,BPNAMIX))
 | 
|---|
| 186 |  . I BPNUMIX=BPNAMIX S BPSIX=BPNAMIX
 | 
|---|
| 187 |  ;
 | 
|---|
| 188 |  ;-If not found, try "B" x-ref value
 | 
|---|
| 189 |  I 'BPSIX,BPNUMIX D
 | 
|---|
| 190 |  . I $P($G(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM S BPSIX=BPNUMIX Q
 | 
|---|
| 191 |  . I 'BPSIXALT,$P($G(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX S BPSIXALT=BPNUMIX Q
 | 
|---|
| 192 |  . ;
 | 
|---|
| 193 |  . ;-try additional "B" x-ref's for this NUMBER
 | 
|---|
| 194 |  . F  D  Q:BPSIX  Q:'BPNUMIX
 | 
|---|
| 195 |  .. S BPNUMIX=$O(^BPSF(9002313.91,"B",BPSFNO,BPNUMIX))
 | 
|---|
| 196 |  .. I BPNUMIX D
 | 
|---|
| 197 |  ... I $P($G(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM S BPSIX=BPNUMIX
 | 
|---|
| 198 |  ... I 'BPSIXALT,$P($G(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX S BPSIXALT=BPNUMIX
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 |  ;-Last resort - go through all iens'
 | 
|---|
| 201 |  I 'BPSIX S BPNUMIX=0 F  D  Q:BPSIX  Q:'BPNUMIX
 | 
|---|
| 202 |  . S BPNUMIX=$O(^BPSF(9002313.91,BPNUMIX))
 | 
|---|
| 203 |  . I BPNUMIX,+$G(^BPSF(9002313.91,BPNUMIX,0))[BPSFNO D
 | 
|---|
| 204 |  .. S BPSFNOCK=+$G(^BPSF(9002313.91,BPNUMIX,0))
 | 
|---|
| 205 |  .. ; Note: Special coding included for BPSFNO of 498 (498.nn)
 | 
|---|
| 206 |  .. I BPSFNOCK'=BPSFNO,$P(BPSFNOCK,".")'=498 Q
 | 
|---|
| 207 |  .. I $P($G(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM S BPSIX=BPNUMIX
 | 
|---|
| 208 |  .. I 'BPSIXALT,$P($G(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX S BPSIXALT=BPNUMIX
 | 
|---|
| 209 |  ;
 | 
|---|
| 210 |  Q BPSIX
 | 
|---|
| 211 |  ;
 | 
|---|
| 212 | INITZPRS(ZPRS) ;BPSEGID^FLN^FLNSC^FLNPN
 | 
|---|
| 213 |  S ZPRS(0)="100^9002313.9205^9002313.92051^9002313.92052"
 | 
|---|
| 214 |  S ZPRS(1)="110^9002313.9206^9002313.92061^9002313.92062"
 | 
|---|
| 215 |  S ZPRS(2)="140^9002313.9209^9002313.92091^9002313.92092"
 | 
|---|
| 216 |  S ZPRS(3)="150^9002313.921^9002313.9211^9002313.9212"
 | 
|---|
| 217 |  S ZPRS(4)="120^9002313.9207^9002313.92071^9002313.92072"
 | 
|---|
| 218 |  S ZPRS(5)="160^9002313.9213^9002313.92131^9002313.92132"
 | 
|---|
| 219 |  S ZPRS(6)="170^9002313.9214^9002313.92141^9002313.92142"
 | 
|---|
| 220 |  S ZPRS(7)="130^9002313.9208^9002313.92081^9002313.92082"
 | 
|---|
| 221 |  S ZPRS(8)="180^9002313.9215^9002313.92151^9002313.92152"
 | 
|---|
| 222 |  S ZPRS(9)="200^9002313.9217^9002313.92171^9002313.92172"
 | 
|---|
| 223 |  S ZPRS(10)="210^9002313.9218^9002313.92181^9002313.92182"
 | 
|---|
| 224 |  S ZPRS(11)="190^9002313.9216^9002313.92161^9002313.92162"
 | 
|---|
| 225 |  S ZPRS(12)="220^9002313.9219^9002313.92191^9002313.92192"
 | 
|---|
| 226 |  S ZPRS(13)="230^9002313.922^9002313.9221^9002313.9222"
 | 
|---|
| 227 |  Q
 | 
|---|