| 1 | IBCEF1 ;ALB/TMP - FORMATTER SPECIFIC BILL FUNCTIONS - CONT ;30-JAN-96 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**52,124,51,137,210,155,349,371**;21-MAR-94;Build 57 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | OCC(IBIFN,REL,TEXT) ;Sets up an arrays of occurrence codes for various cks | 
|---|
| 6 | ;RETURNS 1^additional data for entry IBXSAVE("OCC",n) if REL or TEXT | 
|---|
| 7 | ;   parameters have been met or null if conditions not met | 
|---|
| 8 | ;If no REL or TEXT parameters sent, just extract codes array | 
|---|
| 9 | ; IBIFN = bill ien | 
|---|
| 10 | ; REL = 'OCC RELATED TO' value to check for | 
|---|
| 11 | ; TEXT = text to check for the .01 field of 399.1 entry pointed to | 
|---|
| 12 | ;         by the occurrence code | 
|---|
| 13 | N OCC,SORT,ARR,N,DATA,CODE,CT | 
|---|
| 14 | I '$D(IBXSAVE("OCC")),'$D(IBXSAVE("OCCS")) D | 
|---|
| 15 | .N IBI,Z,CT1,CT2,Z0 S (IBI,CT1,CT2)=0 | 
|---|
| 16 | .F  S IBI=$O(^DGCR(399,IBIFN,"OC",IBI)) Q:'IBI  S Z=$G(^(IBI,0)) D | 
|---|
| 17 | ..S Z0=$G(^DGCR(399.1,+Z,0)) | 
|---|
| 18 | ..Q:'$P(Z0,U,10)&'$P(Z0,U,4)  ;Not an occurrence code | 
|---|
| 19 | ..I $P(Z0,U,10) S CT2=CT2+1,IBXSAVE("OCCS",CT2)=$S($P(Z0,U,4):$P(Z0,U,2)_U_$P(Z,U,2),1:U)_U_$P(Z,U,4)_U_$P(Z0,U)_U_$P(Z0,U,9)_U_$P(Z,U,3)_U_$P(Z,U,2) | 
|---|
| 20 | ..I '$P(Z0,U,10) S CT1=CT1+1,IBXSAVE("OCC",CT1)=$S($P(Z0,U,4):$P(Z0,U,2)_U_$P(Z,U,2),1:U)_U_U_$P(Z0,U)_U_$P(Z0,U,9)_U_$P(Z,U,3)_U_$P(Z,U,2) | 
|---|
| 21 | I '$D(IBXSAVE("OCC"))&'$D(IBXSAVE("OCCS")) S IBXSAVE("OCC")="" G OCCQ | 
|---|
| 22 | ; | 
|---|
| 23 | ; esg - IB*2*349 - order the occurrence codes | 
|---|
| 24 | ;       Build the SORT array sorted by the occ code | 
|---|
| 25 | F ARR="OCC","OCCS" S N=0 F  S N=$O(IBXSAVE(ARR,N)) Q:'N  S DATA=$G(IBXSAVE(ARR,N)) I $P(DATA,U,1)'="" S CODE=" "_$P(DATA,U,1),SORT(ARR,CODE,N)=DATA | 
|---|
| 26 | ;       Loop thru the SORT array and re-build the IBXSAVE array | 
|---|
| 27 | F ARR="OCC","OCCS" K IBXSAVE(ARR) S CODE="",CT=0 F  S CODE=$O(SORT(ARR,CODE)) Q:CODE=""  S N=0 F  S N=$O(SORT(ARR,CODE,N)) Q:'N  S CT=CT+1,IBXSAVE(ARR,CT)=SORT(ARR,CODE,N) | 
|---|
| 28 | ; | 
|---|
| 29 | I $G(REL)'=""!($G(TEXT)'="") D OCC1("",.OCC,$G(REL),$G(TEXT)) D:'$D(OCC) OCC1("S",.OCC,$G(REL),$G(TEXT)) | 
|---|
| 30 | OCCQ Q $G(OCC) | 
|---|
| 31 | ; | 
|---|
| 32 | OCC1(ARR,OCC,REL,TEXT) ; Search thru local array for parameters met | 
|---|
| 33 | ; ARR = null to search OCC subscript, "S" to search OCCS subscript | 
|---|
| 34 | N Z | 
|---|
| 35 | S ARR="OCC"_ARR,Z=0 | 
|---|
| 36 | F  S Z=$O(IBXSAVE(ARR,Z)) Q:'Z  D | 
|---|
| 37 | .I $G(REL)'="",$P(IBXSAVE(ARR,Z),U,5)=REL S OCC="1"_$S(REL=2:U_$P(IBXSAVE(ARR,Z),U,6),1:"") Q | 
|---|
| 38 | .I $G(TEXT)'="",$P(IBXSAVE(ARR,Z),U,4)=TEXT S OCC="1^"_$P(IBXSAVE(ARR,Z),U,7) | 
|---|
| 39 | Q | 
|---|
| 40 | ; | 
|---|
| 41 | RX(IBIFN) ; Format billable prescription data for refills for 837 | 
|---|
| 42 | N Z,IBXDATA,CT | 
|---|
| 43 | I '$D(IBXSAVE("BOX24")) D B24^IBCEF3(.IBXSAVE,IBIFN,1) | 
|---|
| 44 | S Z="",CT=0 | 
|---|
| 45 | F  S Z=$O(IBXSAVE("BOX24",Z)) Q:Z=""  I $D(IBXSAVE("BOX24",Z,"RX")) S CT=CT+1,IBXDATA(Z)=IBXSAVE("BOX24",Z,"RX") | 
|---|
| 46 | RXQ Q CT | 
|---|
| 47 | ; | 
|---|
| 48 | OTHPAY(IBIFN,SEQ) ; Return the other insurance payment amount for bill | 
|---|
| 49 | ;  IBIFN and payer sequence SEQ (1-3) | 
|---|
| 50 | N AMT,IBIFN1 | 
|---|
| 51 | S IBIFN1=$P($G(^DGCR(399,IBIFN,"M1")),U,SEQ+4) | 
|---|
| 52 | I IBIFN1 D | 
|---|
| 53 | . I $$MCRWNR^IBEFUNC(+$G(^DGCR(399,IBIFN,"I"_SEQ))) S AMT=$$MCRPAY^IBCEU0(IBIFN) Q | 
|---|
| 54 | . S AMT=+$$TPR^PRCAFN(IBIFN1) Q:AMT  ; A/R amount | 
|---|
| 55 | . S AMT=+$P($G(^DGCR(399,IBIFN,"U2")),U,SEQ+3) ; amount on bill | 
|---|
| 56 | Q $G(AMT) | 
|---|
| 57 | ; | 
|---|
| 58 | OUTPT(IBIFN,IBPRINT) ; Moved for space | 
|---|
| 59 | D OUTPT^IBCEF11(IBIFN,$G(IBPRINT)) | 
|---|
| 60 | Q | 
|---|
| 61 | ; | 
|---|
| 62 | OCC92 ;Reformats IBXSAVE("OCC") and IBXSAVE("OCCS") to fit blocks on UB-04 | 
|---|
| 63 | ; Set up IBXSAVE(32-36) arrays | 
|---|
| 64 | N IBPG,IB32,IB33,IB34,IB35,IB36,IBFL,Z,Z0,PG | 
|---|
| 65 | S IBPG=0 | 
|---|
| 66 | F Z=32:1:36 K IBFL(Z) S IBFL(Z)=0 | 
|---|
| 67 | M IB32=IBXSAVE("OCC"),IB36=IBXSAVE("OCCS") | 
|---|
| 68 | S IB32=$O(IB32(""),-1),IB36=$O(IB36(""),-1),PG=1 | 
|---|
| 69 | D OCC^IBCF32 | 
|---|
| 70 | F Z=32:1:36 S Z0="" F  S Z0=$O(IBFL(Z,Z0)) Q:'Z0  S IBXSAVE("OC92",Z,Z0)=$P(IBFL(Z,Z0),U,1,3) | 
|---|
| 71 | Q | 
|---|
| 72 | ; | 
|---|
| 73 | BATCH() ; Moved for space IB*2*349 | 
|---|
| 74 | Q $$BATCH^IBCEF11() | 
|---|
| 75 | ; | 
|---|
| 76 | PROC(T,TYPE) ; Find procedure code, strip '.' Function returns result | 
|---|
| 77 | ; T = Procedure internal entry #;file reference | 
|---|
| 78 | ; TYPE = "CPT" for only CPT/HCPCS valid | 
|---|
| 79 | ;        "ICD" for only ICD9 valid or null for either | 
|---|
| 80 | N Q,S | 
|---|
| 81 | S Q="",S="^"_$P($P(T,";",2),"(") | 
|---|
| 82 | I $G(TYPE)="" D | 
|---|
| 83 | . I $E(S,2,3)="IC" S Q=$P($$PRCD(T),U) Q | 
|---|
| 84 | . I T["DIC(81.3" S Q=$$MOD^ICPTMOD(+T,"I") S Q=$S(Q>0:$P(Q,U,4),1:"") | 
|---|
| 85 | I $G(TYPE)="CPT",$E(S,2,3)="IC" S Q=$$PRCD(T) Q | 
|---|
| 86 | I $G(TYPE)="ICD",T["ICD0" S Q=$P($$ICD0^IBACSV(+T),U) | 
|---|
| 87 | Q $TR(Q,".") | 
|---|
| 88 | ; | 
|---|
| 89 | FACILITY(IBIFN) ;return the Facility (Institution pointer-#4) for a bill | 
|---|
| 90 | ; the institution of the Bill Division (399,.22) if defined, otherwise the Facility Name (350.9,.02) | 
|---|
| 91 | ; | 
|---|
| 92 | N IB0,IBIN S IBIN=0 | 
|---|
| 93 | S IB0=$G(^DGCR(399,+$G(IBIFN),0)) I +$P(IB0,U,22) S IBIN=$$SITE^VASITE(+$P(IB0,U,3),+$P(IB0,U,22)) | 
|---|
| 94 | I IBIN'>0 S IBIN=+$P($G(^IBE(350.9,1,0)),U,2) | 
|---|
| 95 | Q +IBIN | 
|---|
| 96 | ; | 
|---|
| 97 | ISRX(IBIFN) ; Function to determine if bill is a prescription refill bill | 
|---|
| 98 | ; Returns 0 if no Rx on bill or 1 if there is. | 
|---|
| 99 | ; | 
|---|
| 100 | N IBRX | 
|---|
| 101 | I $D(^IBA(362.4,"AIFN"_IBIFN)) S IBRX=1 | 
|---|
| 102 | Q +$G(IBRX) | 
|---|
| 103 | ; | 
|---|
| 104 | ISPROS(IBIFN) ; Function to determine if bill is a prosthetics bill | 
|---|
| 105 | ; Returns 0 if no Prosthetics on bill or 1 if there is. | 
|---|
| 106 | ; | 
|---|
| 107 | N IBPROS | 
|---|
| 108 | I $D(^IBA(362.5,"AIFN"_IBIFN)) S IBPROS=1 | 
|---|
| 109 | Q +$G(IBPROS) | 
|---|
| 110 | ; | 
|---|
| 111 | FINDINS(IBIFN,IBSEQ) ; Returns the internal entry number of the insurance | 
|---|
| 112 | ;  company for bill ien IBIFN for payer sequence IBSEQ (or current if | 
|---|
| 113 | ;  IBSEQ is null) | 
|---|
| 114 | Q $P($G(^DGCR(399,IBIFN,"I"_$$COBN^IBCEF(IBIFN,$G(IBSEQ)))),U) | 
|---|
| 115 | ; | 
|---|
| 116 | TOB(IBIFN) ; Returns UB-04 type of bill from data in the output formatter | 
|---|
| 117 | N IBTOB,IBZ1,IBZ2,IBZ3 | 
|---|
| 118 | D F^IBCEF("N-UB-04 LOCATION OF CARE","IBZ1",,IBIFN) | 
|---|
| 119 | D F^IBCEF("N-UB-04 BILL CLASSIFICATION","IBZ2",,IBIFN) | 
|---|
| 120 | D F^IBCEF("N-UB-04 TIMEFRAME OF BILL","IBZ3",,IBIFN) | 
|---|
| 121 | S IBTOB=IBZ1_IBZ2_IBZ3 | 
|---|
| 122 | Q IBTOB | 
|---|
| 123 | ; | 
|---|
| 124 | PRCD(PRIEN,ALL,EDT) ; Function returns the code that corresponds to the variable | 
|---|
| 125 | ; pointer data in PRIEN (ien;file) | 
|---|
| 126 | ; ALL = if ALL=1, returns the entire $$CPT^ICPTCOD for CPT or | 
|---|
| 127 | ;       ^code^name format for ICD result | 
|---|
| 128 | ;       or null if lookup fails | 
|---|
| 129 | ; EDT = Effective date to check (not used if +$G(ALL)=0) | 
|---|
| 130 | N CODE,IBX | 
|---|
| 131 | S CODE="" | 
|---|
| 132 | ;Modified for Code Set Versioning | 
|---|
| 133 | I PRIEN["ICPT" S IBX=$$CPT^ICPTCOD(+PRIEN,$G(EDT)) G:IBX'>0 PRCDQ S CODE=$S($G(ALL):IBX,1:$P(IBX,U,2)) | 
|---|
| 134 | I PRIEN["ICD0" S IBX=$$ICD0^IBACSV(+PRIEN,$G(EDT)) G:IBX="" PRCDQ S CODE=$S($G(ALL):U_$P(IBX,U)_U_$P(IBX,U,4),1:$P(IBX,U)) | 
|---|
| 135 | PRCDQ Q CODE | 
|---|
| 136 | ; | 
|---|
| 137 | NFT(FT,IBIFN) ; Returns 1 if bill IBIFN is not of form type FT (internal) | 
|---|
| 138 | ; so the data element should not be required | 
|---|
| 139 | S FT=$S($$FT^IBCEF(IBIFN)=FT:0,1:1) | 
|---|
| 140 | Q FT | 
|---|
| 141 | ; | 
|---|
| 142 | REQ(FT,INP,IBIFN) ; Determine if bill IBIFN is of form type FT and | 
|---|
| 143 | ; Inpatient (I) or Outpatient (O) status INP [or either if (null)] | 
|---|
| 144 | ; | 
|---|
| 145 | ;Returns 1 if both conditions FT and INP match for the bill | 
|---|
| 146 | ; or 0 if either of these conditions are not true | 
|---|
| 147 | ; I $$REQ^IBCEF1(2,"I",1) would mean if bill entry #1 is | 
|---|
| 148 | ;                         CMS-1500/inpatient the data would be required | 
|---|
| 149 | ; I '$$REQ^IBCEF1(2,"I",1) would mean if bill entry #1 is anything but | 
|---|
| 150 | ;                          CMS-1500/inpatient, the data would not be | 
|---|
| 151 | ;                          required | 
|---|
| 152 | N Z | 
|---|
| 153 | S Z=1 | 
|---|
| 154 | S:$$NFT(FT,IBIFN) Z=0 ; Not the form type for requirement | 
|---|
| 155 | I Z,$G(INP)'="" D | 
|---|
| 156 | . S Z0=$$INPAT^IBCEF(IBIFN,1),INP=$G(INP) | 
|---|
| 157 | . S Z=$S(Z0:INP="I",1:INP="O") ;Check if I/O matches required state | 
|---|
| 158 | Q Z | 
|---|
| 159 | ; | 
|---|
| 160 | SET1(IBIFN,A,IBZ,IBXDATA,IBXNOREQ) ; Utility to set variables for output | 
|---|
| 161 | ; formatter for professional EDI | 
|---|
| 162 | ; Returns values of A, IBXDATA, IBZ, IBXNOREQ | 
|---|
| 163 | N Z,CT | 
|---|
| 164 | S A="^TMP($J,""IBLCT"")" | 
|---|
| 165 | S (Z,CT)=0 | 
|---|
| 166 | F  S Z=$O(IBXDATA(Z)) Q:'Z  D  ; Don't transmit 0-charges | 
|---|
| 167 | . I $P(IBXDATA(Z),U,9),$P(IBXDATA(Z),U,8) S CT=CT+1 M IBZ(CT)=IBXDATA(Z) | 
|---|
| 168 | K IBXDATA | 
|---|
| 169 | S IBXNOREQ='$$REQ(2,"O",IBIFN) | 
|---|
| 170 | Q | 
|---|
| 171 | ; | 
|---|
| 172 | CIADDR(IBXDATA,IBXSAVE,LINE,FORM) ; Format current ins co address line LINE for FORM | 
|---|
| 173 | ; FORM = 1 for CMS-1500, 2 for UB-04 | 
|---|
| 174 | ; Called from output formatter - both IBXDATA, IBXSAVE parameters are | 
|---|
| 175 | ;  passed by reference | 
|---|
| 176 | ; | 
|---|
| 177 | K IBXDATA | 
|---|
| 178 | I $G(FORM)'=1 D | 
|---|
| 179 | . ; | 
|---|
| 180 | . ; esg - 11/17/06 - IB*2*349 - UB-04 FL-38 contains the payer name | 
|---|
| 181 | . ;       and address on 4 lines within this 5 line box.  All 5 lines | 
|---|
| 182 | . ;       are formatted here into the IBXDATA array.  This is the | 
|---|
| 183 | . ;       address that shows through the envelope window. | 
|---|
| 184 | . ; | 
|---|
| 185 | . ; esg - 9/13/07 - IB*2*371 - Line 1 of this box contains the print | 
|---|
| 186 | . ;       status (i.e. copy, 2nd notice, 3rd notice, MRA needed). | 
|---|
| 187 | . ; | 
|---|
| 188 | . N Z,Z1,LM,Q,ADDR,X,IBPSTAT | 
|---|
| 189 | . S LM=$P($G(^IBE(350.9,1,1)),U,31)   ; UB address column parameter | 
|---|
| 190 | . S Z="" | 
|---|
| 191 | . I LM S $P(Z," ",LM)=""              ; beginning spaces indent | 
|---|
| 192 | . S ADDR=$G(IBXSAVE("CADR"))          ; address data string | 
|---|
| 193 | . ; | 
|---|
| 194 | . D F^IBCEF("N-PRINT BILL SUBMIT STATUS","IBPSTAT",,+$G(IBXIEN)) | 
|---|
| 195 | . S Z1=Z I Z1="" S Z1=" "     ; line 1 can't start in column 1 | 
|---|
| 196 | . S IBXDATA(1)=Z1_$G(IBPSTAT),Q=1             ; line 1 print status | 
|---|
| 197 | . S Q=Q+1 | 
|---|
| 198 | . S IBXDATA(Q)=Z_$G(IBXSAVE("CADR_NAME"))     ; line 2 payer name | 
|---|
| 199 | . S X=$P(ADDR,U,1) | 
|---|
| 200 | . I X'="" S Q=Q+1,IBXDATA(Q)=Z_X              ; address line 1 | 
|---|
| 201 | . S X=$P(ADDR,U,2) | 
|---|
| 202 | . I X'="" S Q=Q+1,IBXDATA(Q)=Z_X D            ; address line 2 | 
|---|
| 203 | .. S X=$P(ADDR,U,3) | 
|---|
| 204 | .. I X'="" S IBXDATA(Q)=IBXDATA(Q)_" "_X      ; address line 3 | 
|---|
| 205 | .. Q | 
|---|
| 206 | . S Q=Q+1                                     ; city,st,zip on last line | 
|---|
| 207 | . S IBXDATA(Q)=Z_$P(ADDR,U,4)_", "_$$STATE^IBCEFG1($P(ADDR,U,5))_" "_$P(ADDR,U,6) | 
|---|
| 208 | . KILL IBXSAVE("CADR_NAME"),IBXSAVE("CADR")   ; cleanup | 
|---|
| 209 | . Q | 
|---|
| 210 | ; | 
|---|
| 211 | I $G(FORM)=1 D           ; CMS-1500 | 
|---|
| 212 | . N CT,X,Z | 
|---|
| 213 | . S:'$D(IBXSAVE("INDENT")) Z="",$P(Z," ",+$P($G(^IBE(350.9,1,1)),U,27)+1)="",IBXSAVE("INDENT")=Z | 
|---|
| 214 | . S CT=0 | 
|---|
| 215 | . S X=$P(IBXSAVE("CADR"),U) S:X'="" CT=CT+1,IBXDATA(CT)=IBXSAVE("INDENT")_X | 
|---|
| 216 | . S X=$S($P(IBXSAVE("CADR"),U,2)'="":$P(IBXSAVE("CADR"),U,2),1:"")_$S($P(IBXSAVE("CADR"),U,2)'="":" ",1:"")_$P(IBXSAVE("CADR"),U,3) S:X'="" CT=CT+1,IBXDATA(CT)=IBXSAVE("INDENT")_X | 
|---|
| 217 | . S CT=CT+1,IBXDATA(CT)=IBXSAVE("INDENT")_$P(IBXSAVE("CADR"),U,4)_", "_$$STATE^IBCEFG1($P(IBXSAVE("CADR"),U,5))_" "_$P(IBXSAVE("CADR"),U,6) | 
|---|
| 218 | . Q | 
|---|
| 219 | ; | 
|---|
| 220 | Q | 
|---|
| 221 | ; | 
|---|