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