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