1 | FBFHLS ;OIFO/SAB-BUILD HL7 MESSAGE SEGMENTS ;11/21/2003
|
---|
2 | ;;3.5;FEE BASIS;**61,68**;JAN 30, 1995
|
---|
3 | ;;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
4 | Q
|
---|
5 | ;
|
---|
6 | EN ;
|
---|
7 | ; input
|
---|
8 | ; HLFS - HL7 field separator
|
---|
9 | ; HLECH - HL7 encoding characters
|
---|
10 | ; FBAAIN - invoice number
|
---|
11 | ; FBD( array containing the invoice data
|
---|
12 | ; Applicablity of a FBD node for a given transaction type (C,L, or X)
|
---|
13 | ; is indicated by the presence of the transaction type code at the
|
---|
14 | ; beginning of the line in the following table.
|
---|
15 | ;
|
---|
16 | ; Claim Level Data
|
---|
17 | ; CL FBD(0,"AMT") = Amount Disbursed^Amount Interest
|
---|
18 | ; X FBD(0,"CAN") = Cancel Date^Cancel Reason^Cancel Activity
|
---|
19 | ; C FBD(0,"DAYS") = Covered Days
|
---|
20 | ; C FBD(0,"DRG") = DRG Code^DRG Weight
|
---|
21 | ; CL FBD(0,"DT") = Invoice Date
|
---|
22 | ; CLX FBD(0,"FPPS") = FPPS Claim ID
|
---|
23 | ; CLX FBD(0,"INV") = Invoice #^Transaction Type^Station #
|
---|
24 | ;
|
---|
25 | ; Line Level Data (# is a sequential number)
|
---|
26 | ; CL FBD(#,"ADJ") = AdjReas1^AdjGrp1^AdjAmt1^AdjReas2^AdjGrp2^AdjAmt2
|
---|
27 | ; note: ADJ node is only defined when there is an adjustment
|
---|
28 | ; note: only 1 adjustment for C type
|
---|
29 | ; CL FBD(#,"AMT") = Amount Claimed^Amount Paid
|
---|
30 | ; CL FBD(#,"CK") = Check Number^Check Date^Payment Method
|
---|
31 | ; CL FBD(#,"DT") = Date of Service/Start Date^End Date
|
---|
32 | ; note: End Date only applicable for C type
|
---|
33 | ; CL FBD(#,"FPPS") = FPPS Line Item
|
---|
34 | ; CL FBD(#,"RMK") = Remittance Remark1,Remittance Remark2
|
---|
35 | ; L FBD(#,"SVC") = Service Code^Qualifier^Mod1,Mod2,Mod3,Mod4^Units
|
---|
36 | ; note: SVC node is not defined for pharmacy invoices
|
---|
37 | ;
|
---|
38 | ; If existing exceptions for invoice
|
---|
39 | ; ^TMP($J,"FBE",FBAAIN,seq number)=message
|
---|
40 | ; If existing warnings for invoice
|
---|
41 | ; ^TMP($J,"FBW",FBAAIN,seq number)=message
|
---|
42 | ;
|
---|
43 | ; output
|
---|
44 | ; ^TMP("HLS",$J) = HL global array for invoice
|
---|
45 | ; If new exceptions for invoice
|
---|
46 | ; ^TMP($J,"FBE",FBAAIN,seq number)=message
|
---|
47 | ; If new warnings for invoice
|
---|
48 | ; ^TMP($J,"FBW",FBAAIN,seq number)=message
|
---|
49 | ;
|
---|
50 | ; initialize variables
|
---|
51 | N FBTTYP
|
---|
52 | K ^TMP("HLS",$J)
|
---|
53 | ;
|
---|
54 | ; determine transaction type
|
---|
55 | S FBTTYP=$P($G(FBD(0,"INV")),U,2)
|
---|
56 | ;
|
---|
57 | I '$D(HLFS) D I '$D(HLFS) Q
|
---|
58 | . N FBHL
|
---|
59 | . D INIT^HLFNC2("FB FEE TO FPPS EVENT",.FBHL)
|
---|
60 | . I $G(FBHL) Q
|
---|
61 | . S HLFS=FBHL("FS")
|
---|
62 | . S HLECH=FBHL("ECH")
|
---|
63 | ;
|
---|
64 | ; check for required fields
|
---|
65 | D CHKREQ^FBFHLS1
|
---|
66 | ;
|
---|
67 | ; quit if exceptions
|
---|
68 | Q:$D(^TMP($J,"FBE",FBAAIN))
|
---|
69 | ;
|
---|
70 | ; build segments for invoice in ^TMP("HLS",$J,
|
---|
71 | I FBTTYP="C" D CL
|
---|
72 | I FBTTYP="L" D CL
|
---|
73 | I FBTTYP="X" D X
|
---|
74 | ;
|
---|
75 | Q
|
---|
76 | ;
|
---|
77 | CL ; Claim or Line Transaction
|
---|
78 | N FBCOMP,FBFLD,FBFT1,FBI,FBL,FBORC,FBX
|
---|
79 | S FBL=0 ; line counter for HL7 lines in ^TMP("HLS",$J,line
|
---|
80 | ; loop thru line items (Claim Transaction must have just 1 line)
|
---|
81 | S FBI=0 F S FBI=$O(FBD(FBI)) Q:'FBI D
|
---|
82 | . S FBORC="ORC"
|
---|
83 | . ; transaction type (005)
|
---|
84 | . S $P(FBORC,HLFS,6)=$P(FBD(0,"INV"),U,2)
|
---|
85 | . ;
|
---|
86 | . I FBTTYP="C" D
|
---|
87 | . . ; covered days (007.3)
|
---|
88 | . . S FBFLD=$P(FBORC,HLFS,8)
|
---|
89 | . . S $P(FBFLD,$E(HLECH,1),3)=$P(FBD(0,"DAYS"),U)
|
---|
90 | . . S $P(FBORC,HLFS,8)=FBFLD
|
---|
91 | . ;
|
---|
92 | . ; date of service/start date (007.4.1)
|
---|
93 | . S FBFLD=$P(FBORC,HLFS,8)
|
---|
94 | . S FBCOMP=$P(FBFLD,$E(HLECH,1),4)
|
---|
95 | . S $P(FBCOMP,$E(HLECH,2),1)=$$FMTHL7^XLFDT($P(FBD(FBI,"DT"),U))
|
---|
96 | . S $P(FBFLD,$E(HLECH,1),4)=FBCOMP
|
---|
97 | . S $P(FBORC,HLFS,8)=FBFLD
|
---|
98 | . ;
|
---|
99 | . I FBTTYP="C" D
|
---|
100 | . . ; end date (007.5.1)
|
---|
101 | . . S FBFLD=$P(FBORC,HLFS,8)
|
---|
102 | . . S FBCOMP=$P(FBFLD,$E(HLECH,1),5)
|
---|
103 | . . S $P(FBCOMP,$E(HLECH,2),1)=$$FMTHL7^XLFDT($P(FBD(FBI,"DT"),U,2))
|
---|
104 | . . S $P(FBFLD,$E(HLECH,1),5)=FBCOMP
|
---|
105 | . . S $P(FBORC,HLFS,8)=FBFLD
|
---|
106 | . ;
|
---|
107 | . ; invoice date (009.1)
|
---|
108 | . S FBFLD=$P(FBORC,HLFS,10)
|
---|
109 | . S $P(FBFLD,$E(HLECH,1),1)=$$FMTHL7^XLFDT($P(FBD(0,"DT"),U))
|
---|
110 | . S $P(FBORC,HLFS,10)=FBFLD
|
---|
111 | . ;
|
---|
112 | . ; station number (013.4.2)
|
---|
113 | . S FBFLD=$P(FBORC,HLFS,14)
|
---|
114 | . S FBCOMP=$P(FBFLD,$E(HLECH,1),4)
|
---|
115 | . S $P(FBCOMP,$E(HLECH,2),2)=$P(FBD(0,"INV"),U,3)
|
---|
116 | . S $P(FBFLD,$E(HLECH,1),4)=FBCOMP
|
---|
117 | . S $P(FBORC,HLFS,14)=FBFLD
|
---|
118 | . ;
|
---|
119 | . ; store HL ORC segment for the line item
|
---|
120 | . S FBX=FBORC D TMPHL
|
---|
121 | . ;
|
---|
122 | . S FBFT1="FT1"
|
---|
123 | . ;
|
---|
124 | . ; FPPS CLAIM-LINE (002)
|
---|
125 | . S $P(FBFT1,HLFS,3)=$P(FBD(0,"FPPS"),U)_"-"_$$EXPLIST($P(FBD(FBI,"FPPS"),U))
|
---|
126 | . ;
|
---|
127 | . ; INVOICE # (003)
|
---|
128 | . S $P(FBFT1,HLFS,4)=$P(FBD(0,"INV"),U)
|
---|
129 | . ;
|
---|
130 | . ; CHECK DATE (004)
|
---|
131 | . S $P(FBFT1,HLFS,5)=$$FMTHL7^XLFDT($P(FBD(FBI,"CK"),U,2))
|
---|
132 | . ;
|
---|
133 | . ; PAYMENT METHOD (006)
|
---|
134 | . S $P(FBFT1,HLFS,7)=$P(FBD(FBI,"CK"),U,3)
|
---|
135 | . ;
|
---|
136 | . I FBTTYP="L" D
|
---|
137 | . . ; UNITS PAID (010)
|
---|
138 | . . S $P(FBFT1,HLFS,11)=$P($G(FBD(FBI,"SVC")),U,4)
|
---|
139 | . ;
|
---|
140 | . ; REMITTANCE REMARKS (013)
|
---|
141 | . S $P(FBFT1,HLFS,14)=$P(FBD(FBI,"RMK"),U)
|
---|
142 | . ;
|
---|
143 | . I FBTTYP="L" D
|
---|
144 | . . ; SERVICE QUALIFIER (019)
|
---|
145 | . . S $P(FBFT1,HLFS,20)=$P($G(FBD(FBI,"SVC")),U,2)
|
---|
146 | . ;
|
---|
147 | . ; CHECK NUMBER (023)
|
---|
148 | . S $P(FBFT1,HLFS,24)=$P(FBD(FBI,"CK"),U)
|
---|
149 | . ;
|
---|
150 | . I FBTTYP="L" D
|
---|
151 | . . ; SERVICE PROVIDED (025)
|
---|
152 | . . S $P(FBFT1,HLFS,26)=$P($G(FBD(FBI,"SVC")),U)
|
---|
153 | . ;
|
---|
154 | . I FBTTYP="C" D
|
---|
155 | . . ; DRG (025)
|
---|
156 | . . S $P(FBFT1,HLFS,26)=$P(FBD(0,"DRG"),U)
|
---|
157 | . ;
|
---|
158 | . I FBTTYP="L" D
|
---|
159 | . . ; MODIFIERS (026)
|
---|
160 | . . S $P(FBFT1,HLFS,27)=$P($G(FBD(FBI,"SVC")),U,3)
|
---|
161 | . ;
|
---|
162 | . I FBTTYP="C" D
|
---|
163 | . . ; DRG WEIGHT (026)
|
---|
164 | . . S $P(FBFT1,HLFS,27)=$P(FBD(0,"DRG"),U,2)
|
---|
165 | . ;
|
---|
166 | . ; generate and store FT1s for each of the different $ amounts
|
---|
167 | . ; amount claimed
|
---|
168 | . S FBX=$$FT1(1,$P(FBD(FBI,"AMT"),U)) D TMPHL
|
---|
169 | . ; amount paid
|
---|
170 | . S FBX=$$FT1(2,$P(FBD(FBI,"AMT"),U,2)) D TMPHL
|
---|
171 | . ; interest amount (conditional)
|
---|
172 | . I $P(FBD(0,"AMT"),U,2)>0 S FBX=$$FT1(3,$P(FBD(0,"AMT"),U,2)) D TMPHL
|
---|
173 | . ; disbursed amount
|
---|
174 | . S FBX=$$FT1(4,$P(FBD(0,"AMT"),U)) D TMPHL
|
---|
175 | . ; adjustment amount 1 (conditional)
|
---|
176 | . I +$P($G(FBD(FBI,"ADJ")),U,3)'=0 S FBX=$$FT1(5,$P(FBD(FBI,"ADJ"),U,1,3)) D TMPHL
|
---|
177 | . I FBTTYP="L" D
|
---|
178 | . . ; adjustment amount 2 (conditional)
|
---|
179 | . . I +$P($G(FBD(FBI,"ADJ")),U,6)'=0 S FBX=$$FT1(5,$P(FBD(FBI,"ADJ"),U,4,6)) D TMPHL
|
---|
180 | ;
|
---|
181 | Q
|
---|
182 | ;
|
---|
183 | X ; Cancel Transaction
|
---|
184 | N FBCOMP,FBFLD,FBFT1,FBL,FBORC
|
---|
185 | S FBL=0 ; line counter for HL7 lines in ^TMP("HLS",$J,line
|
---|
186 | S FBORC="ORC"
|
---|
187 | ; transaction type (005)
|
---|
188 | S $P(FBORC,HLFS,6)=$P(FBD(0,"INV"),U,2)
|
---|
189 | ;
|
---|
190 | ; cancel date (009.1)
|
---|
191 | S FBFLD=$P(FBORC,HLFS,10)
|
---|
192 | S $P(FBFLD,$E(HLECH,1),1)=$$FMTHL7^XLFDT($P(FBD(0,"CAN"),U))
|
---|
193 | S $P(FBORC,HLFS,10)=FBFLD
|
---|
194 | ;
|
---|
195 | ; station number (013.4.2)
|
---|
196 | S FBFLD=$P(FBORC,HLFS,14)
|
---|
197 | S FBCOMP=$P(FBFLD,$E(HLECH,1),4)
|
---|
198 | S $P(FBCOMP,$E(HLECH,2),2)=$P(FBD(0,"INV"),U,3)
|
---|
199 | S $P(FBFLD,$E(HLECH,1),4)=FBCOMP
|
---|
200 | S $P(FBORC,HLFS,14)=FBFLD
|
---|
201 | ;
|
---|
202 | S FBFT1="FT1"
|
---|
203 | ;
|
---|
204 | ; FPPS CLAIM (002)
|
---|
205 | S $P(FBFT1,HLFS,3)=$P(FBD(0,"FPPS"),U)
|
---|
206 | ;
|
---|
207 | ; INVOICE # (003)
|
---|
208 | S $P(FBFT1,HLFS,4)=$P(FBD(0,"INV"),U)
|
---|
209 | ;
|
---|
210 | ; CANCEL ACTIVITY CODE (006)
|
---|
211 | S $P(FBFT1,HLFS,7)="F"_$P(FBD(0,"CAN"),U,3)
|
---|
212 | ;
|
---|
213 | ; CANCEL REASON (017)
|
---|
214 | S $P(FBFT1,HLFS,18)=$P(FBD(0,"CAN"),U,2)
|
---|
215 | ;
|
---|
216 | ; store HL segments for line item
|
---|
217 | S FBX=FBORC D TMPHL
|
---|
218 | S FBX=FBFT1 D TMPHL
|
---|
219 | ;
|
---|
220 | Q
|
---|
221 | ;
|
---|
222 | EXPLIST(FBLIST) ; expand ranges in a list
|
---|
223 | ; input FBIST - list or range or "ALL"
|
---|
224 | ; result expanded list (e.g. "1-3" returned as "1,2,3")
|
---|
225 | ;
|
---|
226 | N FBER,FBRET,FBLIST2,FBI,FBX,FBY
|
---|
227 | S FBRET=$G(FBLIST)
|
---|
228 | I FBRET["-" D
|
---|
229 | . S FBLIST2="" ; init new list
|
---|
230 | . ; loop thru comma pieces in original list
|
---|
231 | . F FBI=1:1 S FBX=$P(FBLIST,",",FBI) Q:FBX="" D
|
---|
232 | . . I FBX'["-" S FBLIST2=FBLIST2_FBX_"," Q ; not range - put in new
|
---|
233 | . . ; expand range then put in new
|
---|
234 | . . S FBER=""
|
---|
235 | . . F FBY=$P(FBX,"-"):1:$P(FBX,"-",2) S FBER=FBER_FBY_","
|
---|
236 | . . ; append expanded range to new list
|
---|
237 | . . S FBLIST2=FBLIST2_FBER
|
---|
238 | . ; replace return value with expanded list
|
---|
239 | . S FBRET=FBLIST2
|
---|
240 | ;
|
---|
241 | ; remove trailing comma
|
---|
242 | I $E(FBRET,$L(FBRET))="," S FBRET=$E(FBRET,1,$L(FBRET)-1)
|
---|
243 | ;
|
---|
244 | Q FBRET
|
---|
245 | ;
|
---|
246 | FT1(FBTYAMT,FBX) ; add amount to FT1 segment
|
---|
247 | ; input
|
---|
248 | ; FBTYAMT - type of amount (1,2,3,4,5)
|
---|
249 | ; FBX - if type 1-4 then amount
|
---|
250 | ; - if type 5 then adj reason^adjustment group^adj amount
|
---|
251 | ; FBFT1 - FT1 segment without an amount
|
---|
252 | ; result (string)
|
---|
253 | ; FT1 segment with amount (and reason, group) inserted
|
---|
254 | N FBRET
|
---|
255 | S FBRET=FBFT1
|
---|
256 | ;
|
---|
257 | ; TYPE AMOUNT (007)
|
---|
258 | S $P(FBRET,HLFS,8)=FBTYAMT
|
---|
259 | ;
|
---|
260 | ; AMOUNT (011)
|
---|
261 | I FBTYAMT<5 S $P(FBRET,HLFS,12)=$FN($P(FBX,U),"",2)
|
---|
262 | I FBTYAMT=5 S $P(FBRET,HLFS,12)=$FN($P(FBX,U,3),"",2)
|
---|
263 | ;
|
---|
264 | ; ADJUSTMENT REASON (017)
|
---|
265 | I FBTYAMT=5 S $P(FBRET,HLFS,18)=$P(FBX,U)
|
---|
266 | ;
|
---|
267 | ; ADJUSTMENT GROUP (018)
|
---|
268 | I FBTYAMT=5 S $P(FBRET,HLFS,19)=$P(FBX,U,2)
|
---|
269 | ;
|
---|
270 | Q FBRET
|
---|
271 | ;
|
---|
272 | TMPHL ; Place HL7 segment in ^TMP
|
---|
273 | ; input
|
---|
274 | ; FBL - last line written to ^TMP
|
---|
275 | ; FBX - HL7 segment
|
---|
276 | ; output
|
---|
277 | ; FBL - will be incremented by 1
|
---|
278 | ; stores FBX in ^TMP("HLS",$J,FBL+1)
|
---|
279 | ; if length of FBX exceeds 244 then continuation lines will be used
|
---|
280 | ; example ^TMP($J,"HLS",$J,FBL+1,1)
|
---|
281 | N FBLS
|
---|
282 | S FBL=FBL+1
|
---|
283 | I $L(FBX)<245 S ^TMP("HLS",$J,FBL)=FBX Q
|
---|
284 | S ^TMP("HLS",$J,FBL)=$E(FBX,1,244)
|
---|
285 | F FBLS=1:1 Q:$E(FBX,(FBLS*244)+1,(FBLS*244)+244)="" D
|
---|
286 | . S ^TMP("HLS",$J,FBL,FBLS)=$E(FBX,(FBLS*244)+1,(FBLS*244)+244)
|
---|
287 | Q
|
---|
288 | ;
|
---|
289 | ;FBFHLS
|
---|