| 1 | IBCEU4 ;ALB/TMP - EDI UTILITIES ;02-OCT-96
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**51,137,210,155,290**;21-MAR-94
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | TESTFLD ;  Entrypoint to call to test the output the formatter will
 | 
|---|
| 5 |  ;  produce for a specific entry in file 364.7
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  N X,Y,DIC,IBCT
 | 
|---|
| 8 |  K IBXDATA,IBXSAVE
 | 
|---|
| 9 |  S IBCT=0
 | 
|---|
| 10 |  F  W !,$S(IBCT:"Another ",1:""),"Bill: " S DIC="^DGCR(399,",DIC(0)="AEMQ" D ^DIC Q:Y<0  D
 | 
|---|
| 11 |  . S IBCT=1
 | 
|---|
| 12 |  . K ^TMP($J),^TMP("IBXSAVE",$J),^TMP("IBXDATA",$J),IBXSAVE,IBXDATA
 | 
|---|
| 13 |  . D FLDS(+Y)
 | 
|---|
| 14 |  . F  R !!,"VARIABLE TO DISPLAY (IBXDATA): ",X:DTIME Q:X["^"  S:X="" X="IBXDATA" D
 | 
|---|
| 15 |  .. I $S($E(X,$L(X))'=")"&($L(X,"(")>1):1,1:$L(X,"(")'=$L(X,")")) W !,"BAD VARIABLE NAME" Q
 | 
|---|
| 16 |  .. I '$D(@X) W "   *** NO DATA TO DISPLAY" Q
 | 
|---|
| 17 |  .. N S S S=X
 | 
|---|
| 18 |  .. W !,X," = ",$G(@X)
 | 
|---|
| 19 |  .. F  S X=$Q(@X) Q:X'[S  W !,X," = ",@X
 | 
|---|
| 20 |  .. W !
 | 
|---|
| 21 |  Q
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 | FLDS(IBIFN) ; Extract fields for bill IBIFN
 | 
|---|
| 24 |  N X,Y,DIC,IB1,IBI,IBAR,IBXPG,IBXLN,IBXCOL,IBXREC,Z,Z0
 | 
|---|
| 25 |  W !,"Remember to run this for flds that set up pre-requisite data (if any) first",!
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  S IB1=1
 | 
|---|
| 28 |  F  W !,$S('IB1:"Another ",1:""),"Form Field: " S DIC="^IBA(364.7,",DIC(0)="AEMQZ" D ^DIC Q:Y<0  D
 | 
|---|
| 29 |  . S IB1=0
 | 
|---|
| 30 |  . N IBZXX,IBXIEN
 | 
|---|
| 31 |  . ; Execute data element logic for fld
 | 
|---|
| 32 |  . S IBI=+Y,Z=$P($G(^IBA(364.5,+$P(Y(0),U,3),0)),U)
 | 
|---|
| 33 |  . S Z0=$G(^IBA(364.6,+Y(0),0))
 | 
|---|
| 34 |  . S IBAR=$G(^IBA(364.5,+$P(Y(0),U,3),2)) S:IBAR="" IBAR="IBXDATA"
 | 
|---|
| 35 |  . S IBXPG=$P(Z0,U,4),IBXLN=$P(Z0,U,5),IBXCOL=$P(Z0,U,8),IBXREC=1
 | 
|---|
| 36 |  . D F^IBCEF(Z,"IBZXX","",IBIFN)
 | 
|---|
| 37 |  . Q:'$D(IBZXX)
 | 
|---|
| 38 |  . K @IBAR
 | 
|---|
| 39 |  . M @IBAR=IBZXX
 | 
|---|
| 40 |  . I $G(^IBA(364.7,IBI,1))'="" S IBXIEN=IBIFN X ^IBA(364.7,IBI,1)
 | 
|---|
| 41 |  . D CLEAN^DILF
 | 
|---|
| 42 |  Q
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 | DATE(X) ; Convert date in YYYYMMDD or YYMMDD format to MM DD YYYY or MM DD YY
 | 
|---|
| 45 |  N Z
 | 
|---|
| 46 |  S Z=X
 | 
|---|
| 47 |  I $L(X)=8 S Z=$E(X,5,6)_" "_$E(X,7,8)_" "_$E(X,1,4)
 | 
|---|
| 48 |  I $L(X)=6 S Z=$E(X,3,4)_" "_$E(X,5,6)_" "_$E(X,1,2)
 | 
|---|
| 49 |  Q Z
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 | MCRSPEC(IBIFN,MCR,IBPIEN) ; Returns specialty code for a provider on bill
 | 
|---|
| 52 |  ; IBIFN = bill ien (file 399)
 | 
|---|
| 53 |  ; MCR = 1 if 2-digit MCR code should be returned 0 or null=3 digit code
 | 
|---|
| 54 |  ; IBPIEN = vp of the provider for which to get the
 | 
|---|
| 55 |  ;   specialty, otherwise it returns specialty code for the 'required'
 | 
|---|
| 56 |  ;   provider on bill (default is file 200 if no file designated)
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  N IBZ,IBDT
 | 
|---|
| 59 |  S IBZ="99" ;default if none found
 | 
|---|
| 60 |  S IBDT=$P($G(^DGCR(399,+IBIFN,"U")),U,1)  ; use statement from date
 | 
|---|
| 61 |  I '$G(IBPIEN) D F^IBCEF("N-SPECIALTY CODE","IBZ",,IBIFN)
 | 
|---|
| 62 |  I $G(IBPIEN) S:$P(IBPIEN,";",2)="" IBPIEN=IBPIEN_";VA(200," S IBZ=$$SPEC^IBCEU(IBPIEN,IBDT)
 | 
|---|
| 63 |  I '$G(MCR) S IBZ="0"_IBZ
 | 
|---|
| 64 |  Q IBZ
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 | ECODE(IBP,CD) ; Function returns 1 if procedure ien IBP is an E-code
 | 
|---|
| 67 |  ; CD = returned = the external code, if passed by reference
 | 
|---|
| 68 |  N Q
 | 
|---|
| 69 |  S CD=$P($$ICD9^IBACSV(+IBP),U)
 | 
|---|
| 70 |  Q ($E(CD)="E")
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 | BOX82NM(IBIFN,IBZSAVE) ; Returns the data to be printed in form locators 82
 | 
|---|
| 73 |  ; and 83 on the UB92 for bill ien IBIFN, based on the providers on the
 | 
|---|
| 74 |  ; bill
 | 
|---|
| 75 |  ; Pass array IBZSAVE by reference
 | 
|---|
| 76 |  N Z,IBZ,IBCT
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  D F^IBCEF("N-ALL PROVIDERS","IBZ",,IBIFN)
 | 
|---|
| 79 |  F Z=1:1:6 S IBZSAVE("PRV-82",Z)=""
 | 
|---|
| 80 |  ; Find Providers and store them (if found) in this order:
 | 
|---|
| 81 |  ; Attending/Rendering, Operating, Referring, Other
 | 
|---|
| 82 |  F Z=4,2,1,9 D
 | 
|---|
| 83 |  . S IBCT=$S(Z=4:0,1:IBCT) Q:IBCT>4
 | 
|---|
| 84 |  . I Z=4,$$FT^IBCEF(IBIFN)=2 S Z=3    ; Find rendering for HCFA 1500
 | 
|---|
| 85 |  . I $S(Z=4!(Z=3):0,1:'$O(IBZ(Z,0))) Q
 | 
|---|
| 86 |  . S IBCT=IBCT+1
 | 
|---|
| 87 |  . I Z=4,$G(IBZ(4,1))="",$$FT^IBCEF(IBIFN)=3,'$D(^DGCR(399,IBIFN,"PRV")) S IBZ(Z,1)="DEPT OF VETERANS AFFAIRS" ;Default for old bills w/o prv
 | 
|---|
| 88 |  . I $O(IBZ(Z,1,1)) S IBZSAVE("PRV-82",IBCT)=$G(IBZ(Z,1,2))_" "_$G(IBZ(Z,1,3))
 | 
|---|
| 89 |  . S IBCT=IBCT+1,IBZSAVE("PRV-82",IBCT)=$P($G(IBZ(Z,1,1)),U)_" "_$P($G(IBZ(Z,1)),U)
 | 
|---|
| 90 |  Q
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 | STATOK(IBIFN,VALST) ; Returns 1 if status of bill IBIFN is one of the valid
 | 
|---|
| 93 |  ;  status codes in VALST
 | 
|---|
| 94 |  N OK,Z
 | 
|---|
| 95 |  S OK=0
 | 
|---|
| 96 |  I $G(VALST)'="" S OK=$L(VALST,$P($G(^DGCR(399,IBIFN,0)),U,13))>1
 | 
|---|
| 97 |  Q OK
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 | RXPRLOOK(IBX) ; Do a FM lookup of procedures for RX that can be linked
 | 
|---|
| 100 |  ; to a specific revenue code (ones that are not already soft-linked)
 | 
|---|
| 101 |  ; Function returns ien of the 'CP' node multiple for the selected proc
 | 
|---|
| 102 |  ; OR  "" if none selected or selection is invalid
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 |  ; IBX = the procedure code
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 |  N IBZ,IBMAX,IBEACH,IBMANY,IBHLP,IBNEXT,Z
 | 
|---|
| 107 |  S IBMAX=50,IBEACH=5,IBHLP=0
 | 
|---|
| 108 |  K ^TMP("DILIST",$J),^TMP("DIERR",$J),^TMP("DIHELP",$J),^TMP("IBLIST",$J)
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  S IBZ=IBX
 | 
|---|
| 111 |  I IBX?1"?".E,'$D(DIQUIET) D
 | 
|---|
| 112 |  . I IBX?2"?".E S IBMAX=50,IBEACH=20 D RXPRHLP(IBMAX,.IBNEXT) S IBHLP=1
 | 
|---|
| 113 |  . S IBX=""
 | 
|---|
| 114 |  . ;
 | 
|---|
| 115 |  I IBX'="" D
 | 
|---|
| 116 |  . S:$L(IBX)<5 IBX="`"_IBX
 | 
|---|
| 117 |  . D FIND^DIC(399.0304,","_DA(1)_",","@;.01E","A",IBX,IBMAX,,"I '$$LINKED^IBCEU4(.DA,Y)")
 | 
|---|
| 118 |  . D XFER(0)
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  S IBMANY=($G(^TMP("IBLIST",$J,0))>1)
 | 
|---|
| 121 |  I IBMANY D  ;More than one match found
 | 
|---|
| 122 |  . I $D(DIQUIET) S ^TMP("IBLIST",$J,0)=0,IBX="" Q
 | 
|---|
| 123 |  . N IB1,IB2,IBSEL,IBGOT,IBCNT,Q,Q1
 | 
|---|
| 124 |  . S (IBGOT,IB1,IB2)=0
 | 
|---|
| 125 |  . F  S IB1=$O(^TMP("IBLIST",$J,2,IB1)) Q:'IB1  D  Q:IBGOT
 | 
|---|
| 126 |  .. S IB2=IB2+1
 | 
|---|
| 127 |  .. S Q=$J("",5)_$S('IBHLP:$E(IB2_$J("",5),1,5),1:"")_^TMP("IBLIST",$J,2,IB1)
 | 
|---|
| 128 |  .. F Q1=0:0 S Q1=$O(^TMP("IBLIST",$J,"ID",IB1,Q1)) Q:'Q1  D
 | 
|---|
| 129 |  ... I $G(^TMP("IBLIST",$J,"ID",IB1,Q1))'="" S Q=Q_"  "_^TMP("IBLIST",$J,"ID",IB1,Q1) Q
 | 
|---|
| 130 |  ... I $G(^TMP("IBLIST",$J,"ID",IB1,Q1,"E"))'="" S Q=Q_"  "_^TMP("IBLIST",$J,"ID",IB1,Q1,"E")
 | 
|---|
| 131 |  .. S IBSEL($S(IB2#IBEACH:IB2#IBEACH,1:IBEACH))=Q
 | 
|---|
| 132 |  .. I '$O(^TMP("IBLIST",$J,2,IB1))!'(IB1#IBEACH) D
 | 
|---|
| 133 |  ... M DIR("A")=IBSEL K IBSEL
 | 
|---|
| 134 |  ... I 'IBHLP D
 | 
|---|
| 135 |  .... S:$O(^TMP("IBLIST",$J,2,IB1)) DIR("A",6)="Press <RETURN> to see more, '^' to exit this list, OR"
 | 
|---|
| 136 |  .... S DIR("A")="SELECT 1-"_IB2_": "
 | 
|---|
| 137 |  .... S DIR(0)="NAO^1:"_IB2_":0"
 | 
|---|
| 138 |  .... S DIR("?")="Enter your selection for procedure from 1 to "_IB2
 | 
|---|
| 139 |  ... I IBHLP D
 | 
|---|
| 140 |  .... I $S(IB2'=+$G(^TMP("IBLIST",$J,0)):1,1:$P($G(^(0)),U,3)) S DIR("A")="'^' TO STOP: ",DIR(0)="EA" Q
 | 
|---|
| 141 |  .... S Z=0 F  S Z=$O(DIR("A",Z)) Q:'Z  W !,DIR("A",Z)
 | 
|---|
| 142 |  .... S Y="^" K DIR W ! Q
 | 
|---|
| 143 |  ... I $D(DIR("A")) D ^DIR K DIR
 | 
|---|
| 144 |  ... I IBHLP S Y=$S(Y=1:"",1:"^")
 | 
|---|
| 145 |  ... I Y="" D  Q
 | 
|---|
| 146 |  .... I $O(^TMP("IBLIST",$J,2,IB1)) Q
 | 
|---|
| 147 |  .... S IBX=""
 | 
|---|
| 148 |  .... W:'IBHLP !
 | 
|---|
| 149 |  .... I $P($G(^TMP("IBLIST",$J,0)),U,3),IB1'<IBMAX D
 | 
|---|
| 150 |  ..... I 'IBHLP W !!,"There were more than ",IBMAX," matches found.  Please try again with more specific input",! Q
 | 
|---|
| 151 |  ..... D RXPRHLP(IBMAX,.IBNEXT)
 | 
|---|
| 152 |  ... I Y["^" S IBX="",IBGOT=1 Q
 | 
|---|
| 153 |  ... I Y>0 S IBGOT=1,IBX=$G(^TMP("IBLIST",$J,2,+Y)) D RECALL^DILFD(399.0304,+IBX_",",DUZ)
 | 
|---|
| 154 |  . I 'IBGOT S ^TMP("IBLIST",$J,0)=0
 | 
|---|
| 155 |  I 'IBMANY,$G(^TMP("IBLIST",$J,0)) D
 | 
|---|
| 156 |  . N Q,Q1
 | 
|---|
| 157 |  . S Q=^TMP("IBLIST",$J,2,1)
 | 
|---|
| 158 |  . F Q1=0:0 S Q1=$O(^TMP("IBLIST",$J,"ID",1,Q1)) Q:'Q1  D
 | 
|---|
| 159 |  .. I $G(^TMP("IBLIST",$J,"ID",1,Q1))'="" S Q=Q_"  "_^TMP("IBLIST",$J,"ID",1,Q1) Q
 | 
|---|
| 160 |  .. I $G(^TMP("IBLIST",$J,"ID",1,Q1,"E"))'="" S Q=Q_"  "_^TMP("IBLIST",$J,"ID",1,Q1,"E")
 | 
|---|
| 161 |  . D EN^DDIOL($J("",16)_Q) S IBX=$G(^TMP("IBLIST",$J,2,1)) D RECALL^DILFD(399.0304,+IBX_",",DUZ)
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  D CLEAN^DILF
 | 
|---|
| 164 |  K ^TMP("IBLIST",$J)
 | 
|---|
| 165 |  Q IBX
 | 
|---|
| 166 |  ;
 | 
|---|
| 167 | RXPRHLP(IBMAX,IBNEXT) ; Get list for ?? help
 | 
|---|
| 168 |  ;
 | 
|---|
| 169 |  ; IBMAX = The maximum # of entries to extract at once
 | 
|---|
| 170 |  ; IBNEXT = Contains the value of the index to start at
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  N IBQ,IBZ
 | 
|---|
| 173 |  S IBQ=+$O(^TMP("IBLIST",$J,2,""),-1),IBZ=","_DA(1)_","
 | 
|---|
| 174 |  D LIST^DIC(399.0304,IBZ,"@;.01EI;1E",,IBMAX,.IBNEXT,,"B","I '$$LINKED^IBCEU4(.DA,Y)"),XFER(IBQ)
 | 
|---|
| 175 |  Q
 | 
|---|
| 176 |  ;
 | 
|---|
| 177 | LINKED(DA,Y) ; Function returns 1 if proc already linked to an RX rev code
 | 
|---|
| 178 |  ; DA = the DA array from the RC multiple
 | 
|---|
| 179 |  ; Y = the ien of the CP multiple
 | 
|---|
| 180 |  N Z
 | 
|---|
| 181 |  S Z=+$O(^DGCR(399,DA(1),"RC","ACP",Y,0))
 | 
|---|
| 182 |  Q $S(Z:Z'=DA,1:0)
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 | XFER(IBQ) ; Transfer DILIST to IBLIST array
 | 
|---|
| 185 |  ; IBQ = the number of entries already found
 | 
|---|
| 186 |  N Z,IBZ
 | 
|---|
| 187 |  S (Z,IBZ)=0
 | 
|---|
| 188 |  F  S Z=$O(^TMP("DILIST",$J,2,Z)) Q:'Z  S IBZ=IBZ+1,^TMP("IBLIST",$J,2,IBZ+IBQ)=^TMP("DILIST",$J,2,Z) M ^TMP("IBLIST",$J,"ID",IBZ+IBQ)=^TMP("DILIST",$J,"ID",Z)
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 |  I $D(^TMP("DILIST",$J,0)) S ^TMP("IBLIST",$J,0)=^TMP("DILIST",$J,0)
 | 
|---|
| 191 |  S $P(^TMP("IBLIST",$J,0),U)=IBQ+IBZ
 | 
|---|
| 192 |  Q
 | 
|---|
| 193 |  ;
 | 
|---|
| 194 | NOREV(DA,IBRX) ; Returns 1 if no other revenue code on bill DA(1)
 | 
|---|
| 195 |  ; is linked to prescription entry IBRX
 | 
|---|
| 196 |  N X,Z
 | 
|---|
| 197 |  S X=1,Z=0 F  S Z=$O(^DGCR(399,DA(1),"RC",Z)) Q:'Z  I DA'=Z,$P($G(^(Z,0)),U,11)=IBRX S X=0 Q
 | 
|---|
| 198 |  Q X
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 | ASKRX(DA) ; Returns the selected RX entry in file 362.4
 | 
|---|
| 201 |  N DIR,X,Y
 | 
|---|
| 202 |  S DIR(0)="PAO^IBA(362.4,"
 | 
|---|
| 203 |  S DIR("A")="  RX: ",DIR("B")=$P($G(^IBA(362.4,+$P($G(^DGCR(399,DA(1),"RC",DA,0)),U,11),0)),U)
 | 
|---|
| 204 |  S DIR("S")="I $P(^(0),U,2)=DA(1),$$NOREV^IBCEU4(.DA,Y)"
 | 
|---|
| 205 |  D ^DIR K DIR
 | 
|---|
| 206 |  Q $S(Y>0:+Y,1:"")
 | 
|---|
| 207 |  ;
 | 
|---|
| 208 | SLF(IBIFN) ;  Returns 1 if Attending/Rendering provider id is SLF000
 | 
|---|
| 209 |  N IB,IBZ
 | 
|---|
| 210 |  S IB=0
 | 
|---|
| 211 |  D F^IBCEF("N-ATT/REND PROVIDER ID","IBZ",,IBIFN)
 | 
|---|
| 212 |  S:$G(IBZ)="SLF000" IB=1
 | 
|---|
| 213 |  Q IB
 | 
|---|
| 214 |  ;
 | 
|---|