| 1 | IBCONS2 ;ALB/CPM - NSC W/INSURANCE OUTPUT (CON'T) ;31-JAN-92 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**19,36,54,66,91,99,108,120,142,174,155**;21-MAR-94 | 
|---|
| 3 | ; | 
|---|
| 4 | ;MAP TO DGCRONS2 | 
|---|
| 5 | ; | 
|---|
| 6 | LOOP1 ; Compilation for both Inpatient Admisssion and Discharge reports. | 
|---|
| 7 | N DA,IBADM K ^TMP($J,"PATIENT INCLUDE"),^TMP($J,"PATIENT EXCLUDE") | 
|---|
| 8 | D DIV | 
|---|
| 9 | F I=(IBBEG-.0001):0 S I=$O(^DGPM(IBSUB,I)) Q:'I!(I>(IBEND+.99))  D | 
|---|
| 10 | . S DFN=0 F  S DFN=$O(^DGPM(IBSUB,I,DFN)) Q:'DFN  S DA=+$O(^(DFN,0)) D  D:PTF PTF I $G(IBDV) D PROC K IBADMVT | 
|---|
| 11 | ..  S:IBINPT=2 DA=+$P($G(^DGPM(DA,0)),"^",14),IBADM=+$G(^DGPM(DA,0)) | 
|---|
| 12 | ..  S PTF=$P($G(^DGPM(DA,0)),"^",16) | 
|---|
| 13 | ..  S IBADMVT=DA | 
|---|
| 14 | ..  S IBDV=+$P($G(^DIC(42,+$P($G(^DGPM(DA,0)),"^",6),0)),"^",11) | 
|---|
| 15 | K ^TMP($J,"PATIENT INCLUDE"),^TMP($J,"PATIENT EXCLUDE") | 
|---|
| 16 | Q | 
|---|
| 17 | ; | 
|---|
| 18 | ; | 
|---|
| 19 | LOOP2 ; Compilation for the Outpatient report | 
|---|
| 20 | N DFN,IBDTA,IBDV,IBVAL,IBFILTER,IBCBK,IBNO,IBOE,IBOE0,IBSTOP,IBOEZ,Y,Y0,IBQUERY2 | 
|---|
| 21 | D DIV K ^TMP($J,"PATIENT INCLUDE"),^TMP($J,"PATIENT EXCLUDE") | 
|---|
| 22 | ; | 
|---|
| 23 | S IBQUERY2="" | 
|---|
| 24 | S IBVAL("BDT")=IBBEG,IBVAL("EDT")=IBEND+.99 | 
|---|
| 25 | S IBFILTER="I '$P(Y0,U,6)" | 
|---|
| 26 | S IBCBK="D CALLBCK^IBCONS2(Y,Y0,.IBQUERY2)" | 
|---|
| 27 | K ^TMP("IBOEC",$J) | 
|---|
| 28 | D SCAN^IBSDU("DATE/TIME",.IBVAL,IBFILTER,IBCBK,1) K ^TMP("DIERR",$J) | 
|---|
| 29 | I $G(IBQUERY2) D CLOSE^IBSDU(IBQUERY2) | 
|---|
| 30 | ; | 
|---|
| 31 | ; Process stand-alone add/edits extracted | 
|---|
| 32 | S DFN=0 F  S DFN=$O(^TMP("IBOEC",$J,DFN)) Q:'DFN  I $D(^DPT(DFN,0)) D | 
|---|
| 33 | . S IBDTA=0 F  S IBDTA=$O(^TMP("IBOEC",$J,DFN,IBDTA)) Q:'IBDTA  D | 
|---|
| 34 | .. K IBOE,IBSTOP,IBCOMB | 
|---|
| 35 | .. S IBNO=1 | 
|---|
| 36 | .. S IBOEZ=0 F  S IBOEZ=$O(^TMP("IBOEC",$J,DFN,IBDTA,IBOEZ)) Q:'IBOEZ  S IBOE0=$$SCE^IBSDU(IBOEZ,"",0) D | 
|---|
| 37 | ... S IBDV=$P(IBOE0,U,11) | 
|---|
| 38 | ... S:$L($G(IBOE(IBNO)))+$L(IBOEZ)+1>200 IBNO=IBNO+1 | 
|---|
| 39 | ... S IBOE(IBNO)=$G(IBOE(IBNO))_IBOEZ_U I '$G(IBOE) S IBOE=+IBOE(1) | 
|---|
| 40 | ... S Z=+$P($G(^DIC(40.7,+$P(IBOE0,U,3),0)),U,2) S:Z IBCOMB(Z)=$G(IBCOMB(Z))+1 | 
|---|
| 41 | .. S:'$D(IBSTOP) IBSTOP="Add/Edit Stop Code^" | 
|---|
| 42 | .. S Z=0 F  S Z=$O(IBCOMB(Z)) Q:'Z  S IBSTOP=IBSTOP_Z_$S(IBCOMB(Z)=1:"",1:"(x"_IBCOMB(Z)_")")_U | 
|---|
| 43 | .. ; | 
|---|
| 44 | .. S I=IBDTA | 
|---|
| 45 | .. I $G(IBOE) D PROCO ;All add/edit encounters for a patient/date on a single line | 
|---|
| 46 | ; | 
|---|
| 47 | K ^TMP("IBOEC",$J),^TMP($J,"PATIENT INCLUDE"),^TMP($J,"PATIENT EXCLUDE") | 
|---|
| 48 | Q | 
|---|
| 49 | ; | 
|---|
| 50 | CALLBCK(IBOE,IBOE0,IBQUERY2) ; Executed by scan call back logic to process encounters | 
|---|
| 51 | ; IBOE = encounter ien | 
|---|
| 52 | ; IBOE0 = 0-node of the encounter | 
|---|
| 53 | ; | 
|---|
| 54 | N DFN,I,IBDC,IBDS,IBDV,IBSTOP,IBT,Z | 
|---|
| 55 | I '$$BDSRC^IBEFUNC3($P($G(IBOE0),U,5)) Q  ; non-billable visit data source | 
|---|
| 56 | ; | 
|---|
| 57 | S IBT=$P(IBOE0,U,8),DFN=$P(IBOE0,U,2),IBDV=$P(IBOE0,U,11),(IBDS,IBDC)="" | 
|---|
| 58 | S I=+IBOE0 | 
|---|
| 59 | Q:'I  Q:DFN="" | 
|---|
| 60 | I IBT=1 D | 
|---|
| 61 | . S IBDC=+$P(IBOE0,U,4) | 
|---|
| 62 | . I IBDV="" S IBDV=$P($G(^SC(IBDC,0)),U,15) | 
|---|
| 63 | ; | 
|---|
| 64 | I IBT=3 D | 
|---|
| 65 | . S IBDS=$$DISND^IBSDU(IBOE,IBOE0) | 
|---|
| 66 | . I IBDV="" S IBDV=$P(IBDS,U,4) | 
|---|
| 67 | ; | 
|---|
| 68 | Q:'$$VALID() | 
|---|
| 69 | ; | 
|---|
| 70 | ; Screen to only include 1-3 originating process and | 
|---|
| 71 | ;  for 1 or 2, include only those that have appt types indicating they | 
|---|
| 72 | ;  are included on reports | 
|---|
| 73 | ; | 
|---|
| 74 | I $S(IBT<3:$$RPT^IBEFUNC($P(IBOE0,U,10),+IBOE0),1:IBT=3) D | 
|---|
| 75 | . ; Extract add/edits to global so we can combine the data into one line (2 lines if RNB defined) | 
|---|
| 76 | . I IBT=2 D  Q  ; Stand-alone Add/Edits | 
|---|
| 77 | .. I VAUTD'=1 Q:'$D(VAUTD(+IBDV)) | 
|---|
| 78 | .. I VAUTD=1 Q:'IBDV | 
|---|
| 79 | .. I +$$RNBOE(IBOE) S ^TMP("IBOEC",$J,DFN,(IBOE0\1)_".",IBOE)="" Q | 
|---|
| 80 | .. S ^TMP("IBOEC",$J,DFN,IBOE0\1,IBOE)="" | 
|---|
| 81 | . ; | 
|---|
| 82 | . I IBT=1 D  Q  ;Appointments | 
|---|
| 83 | .. I IBDC D | 
|---|
| 84 | ... S X=$$CHILD(IBOE,IBOE0,.IBVAL,.IBSTOP,.IBQUERY2) | 
|---|
| 85 | ... S IBSTOP="Clinic: "_$P($G(^SC(IBDC,0)),U)_$S('X:"",1:"  --  "_IBSTOP) | 
|---|
| 86 | ... S I=+IBOE0 D PROCO | 
|---|
| 87 | . ; | 
|---|
| 88 | . I IBT=3 D  Q  ;Registration | 
|---|
| 89 | .. N X | 
|---|
| 90 | .. Q:'$$DISCT^IBEFUNC(IBOE,IBOE0) | 
|---|
| 91 | .. S X=$$CHILD(IBOE,IBOE0,.IBVAL,.IBSTOP,.IBQUERY2) | 
|---|
| 92 | .. S IBSTOP="Registration: "_$P($G(^DIC(37,+$P(IBDS,U,7),0)),U)_$S('X:"",1:"  --  "_IBSTOP) | 
|---|
| 93 | .. S I=+IBOE0 D PROCO | 
|---|
| 94 | ; | 
|---|
| 95 | Q | 
|---|
| 96 | ; | 
|---|
| 97 | CHILD(IBOE,IBOE0,IBVAL,IBSTOP,IBQUERY2) ;Find any child add/edits | 
|---|
| 98 | ;  IBSTOP and IBQUERY2 are returned | 
|---|
| 99 | N IBVAL1,IBFILTER,IBCBK,IBCOMB,Z | 
|---|
| 100 | M IBVAL1=IBVAL | 
|---|
| 101 | S (IBFILTER,IBSTOP)="",IBVAL1("DFN")=+$P(IBOE0,U,2) | 
|---|
| 102 | S IBCBK="I $S(Y=IBOE:1,1:$P(Y0,U,6)=IBOE),$P(Y0,U,3),$$RPT^IBEFUNC($P(Y0,U,10),+Y0) S Z=+$P($G(^DIC(40.7,+$P(Y0,U,3),0)),U,2) S:Z IBCOMB(Z)=$G(IBCOMB(Z))+1" | 
|---|
| 103 | D SCAN^IBSDU("PATIENT/DATE",.IBVAL1,IBFILTER,IBCBK,0,.IBQUERY2) K ^TMP("DIERR",$J) | 
|---|
| 104 | S Z=0 F  S Z=$O(IBCOMB(Z)) Q:'Z  S IBSTOP=$S(IBSTOP="":"Stop Codes^",1:IBSTOP)_Z_$S(IBCOMB(Z)=1:"",1:"(x"_IBCOMB(Z)_")")_U | 
|---|
| 105 | Q (IBSTOP'="") | 
|---|
| 106 | ; | 
|---|
| 107 | PROC ;  -process each episode of care | 
|---|
| 108 | Q:'$$VALID() | 
|---|
| 109 | PROCO ; Entrypoint for outpatient loop2 | 
|---|
| 110 | K IBRMARK | 
|---|
| 111 | I '$G(IBSC) D TRACK^IBCONS3 ;     -find tracking entry get reason not billable | 
|---|
| 112 | I +$G(IBSC) S IBRMARK="{ALL MOVES SC}" ; stays with all SC moves not added to CT but on rpt w/RNB  ** PATCH 66 | 
|---|
| 113 | D BILL,SET ;          -on billed or unbilled list | 
|---|
| 114 | Q | 
|---|
| 115 | ; | 
|---|
| 116 | VALID() ; | 
|---|
| 117 | N IBOK | 
|---|
| 118 | S IBOK=0 | 
|---|
| 119 | I +$G(IBSELRNG),$D(^TMP($J,"PATIENT EXCLUDE",DFN)) G VALIDQ ; pat already excluded from select range ** PATCH 66 | 
|---|
| 120 | I +$G(IBSELRNG),+$G(IBSELRNG)<3,'$$PAT(DFN) G VALIDQ ; patient in selected range  ** PATCH 66 | 
|---|
| 121 | I VAUTD'=1 G:'$D(VAUTD(+IBDV)) VALIDQ | 
|---|
| 122 | I VAUTD=1 G:'IBDV VALIDQ | 
|---|
| 123 | D PTCHK G:'IBFLAG VALIDQ ;  -is patient a vet and have ins data | 
|---|
| 124 | D INS G:'IBFLAG VALIDQ ;    -is insurance valid for date of care | 
|---|
| 125 | I +$G(IBSELRNG)=3,'$$PTINS(DFN) G VALIDQ ; patient ins is included in range  ** PATCH 66 | 
|---|
| 126 | S IBOK=1 | 
|---|
| 127 | VALIDQ Q IBOK | 
|---|
| 128 | ; | 
|---|
| 129 | INS S IBFLAG=$$INSURED^IBCNS1(DFN,I) | 
|---|
| 130 | I +IBFLAG,+IBINPT,'$$PTCOV^IBCNSU3(DFN,+I,"INPATIENT") S IBFLAG=0 | 
|---|
| 131 | Q | 
|---|
| 132 | ; | 
|---|
| 133 | PTCHK S IBFLAG=0 I $D(^DPT(+DFN,.312)),$G(^("VET"))="Y" S IBFLAG=1 | 
|---|
| 134 | ; Patch #36 - removes non-veteran eligibilities and inpatient visits | 
|---|
| 135 | I 'IBINPT D | 
|---|
| 136 | .N IBTEMP,IBOE0 S IBTEMP=$$SCE^IBSDU(+IBOE,13,0),IBOE0=$$SCE^IBSDU(+IBOE) | 
|---|
| 137 | .I $P($G(^DIC(8,+IBTEMP,0)),U,5)="N" S IBFLAG=0 Q | 
|---|
| 138 | .I '$$APPTCT^IBEFUNC(IBOE0) S IBFLAG=0 Q | 
|---|
| 139 | Q | 
|---|
| 140 | ; | 
|---|
| 141 | SET N DPT0,IBSUBSC2,IBSUBSC3,IBSUBSC4,IBSUBSC6 S DPT0=$G(^DPT(+DFN,0)) | 
|---|
| 142 | S IBSUBSC2=+IBDV I +$G(IBSELCDV) S IBSUBSC2="COMBINED" | 
|---|
| 143 | S IBSUBSC3=$S(B]"":2,1:1) | 
|---|
| 144 | S IBSUBSC4=$P(DPT0,U,1) I +$G(IBSELTRM) S IBSUBSC4=+$$TERMDG(DFN) | 
|---|
| 145 | S IBSUBSC6=I F IBSUBSC6=IBSUBSC6:.000001 Q:'$D(^TMP($J,IBSUBSC2,IBSUBSC3,IBSUBSC4,DFN,IBSUBSC6)) | 
|---|
| 146 | S ^TMP($J,IBSUBSC2,IBSUBSC3,IBSUBSC4,DFN,IBSUBSC6)=B | 
|---|
| 147 | I $D(IBSTOP),'$D(^TMP($J,IBSUBSC2,IBSUBSC3,IBSUBSC4,DFN,IBSUBSC6,1)) S ^(1)=IBSTOP | 
|---|
| 148 | I $G(IBRMARK)'="" S ^TMP($J,IBSUBSC2,IBSUBSC3,IBSUBSC4,DFN,IBSUBSC6,2)=$G(IBRMARK) | 
|---|
| 149 | K IBSTOP,IBRMARK | 
|---|
| 150 | Q | 
|---|
| 151 | ; | 
|---|
| 152 | BILL ;  Add to billed list if is insurance bill, not canceled | 
|---|
| 153 | ;     if opt, date is in list, if inpt, admission date = event date | 
|---|
| 154 | ;  ** PATCH 66 modified to include check for bill authorized status and add that to the stored TMP array | 
|---|
| 155 | ; | 
|---|
| 156 | S B="",I1=$S(IBINPT=2:IBADM,IBINPT:I,1:I\1),IBAUTH=2 N IB0 | 
|---|
| 157 | ; -- the following line modified in patch 19 to check for only inpt. bills ($p(^(0),u,5)<3) are counted as bills, | 
|---|
| 158 | ;    for when there is an outpatient bill with the same event date. | 
|---|
| 159 | I IBINPT,$D(^DGCR(399,"C",DFN)) F M=0:0 S M=$O(^DGCR(399,"C",DFN,M)) Q:'M  D  Q:$L(B)>200 | 
|---|
| 160 | . S IB0=$G(^DGCR(399,M,0)) | 
|---|
| 161 | . I IB0'="",$P(IB0,"^",5)<3,$P(IB0,"^",13)<7,$P($P(IB0,"^",3),".")=$P(I1,"."),$P(IB0,"^",11)="i" S B=B_M_"^" I $P(IB0,"^",13)<2 S IBAUTH=1 | 
|---|
| 162 | ; | 
|---|
| 163 | I 'IBINPT,$D(^DGCR(399,"AOPV",DFN,I1)) F M=0:0 S M=$O(^DGCR(399,"AOPV",DFN,I1,M)) Q:'M  D  Q:$L(B)>200 | 
|---|
| 164 | . S IB0=$G(^DGCR(399,M,0)) | 
|---|
| 165 | . I IB0'="",$P(IB0,"^",13)<7,$P(IB0,"^",11)="i" S B=B_M_"^" I $P(IB0,"^",13)<2 S IBAUTH=1 | 
|---|
| 166 | I +B S B=IBAUTH_"^"_B | 
|---|
| 167 | Q | 
|---|
| 168 | ; | 
|---|
| 169 | PTF ;  if all movements are for sc condition then not billable | 
|---|
| 170 | ; | 
|---|
| 171 | S IBSC="" Q:'$D(^DGPT(+PTF)) | 
|---|
| 172 | S IBMOV=0 F  S IBMOV=$O(^DGPT(PTF,"M",IBMOV)) Q:'IBMOV  S IBSC=$P($G(^(IBMOV,0)),"^",18) I IBSC=2!(IBSC="") Q | 
|---|
| 173 | S IBSC=$S(IBSC=2!(IBSC=""):0,1:1) | 
|---|
| 174 | Q | 
|---|
| 175 | DIV ;adds the requested divisions to the report | 
|---|
| 176 | N IBDIV I +$G(IBSELCDV) S ^TMP($J,"COMBINED")="" Q | 
|---|
| 177 | I VAUTD'=1 D | 
|---|
| 178 | .S IBDIV="" F  S IBDIV=$O(VAUTD(IBDIV)) Q:'IBDIV  S ^TMP($J,IBDIV)="" | 
|---|
| 179 | I VAUTD=1 D | 
|---|
| 180 | .S IBDIV="" F  S IBDIV=$O(^DG(40.8,IBDIV)) Q:IBDIV']""!(+IBDIV'=IBDIV)  I $P($G(^DG(40.8,IBDIV,0)),"^",1)]"" S ^TMP($J,IBDIV)="" | 
|---|
| 181 | Q | 
|---|
| 182 | ; | 
|---|
| 183 | PAT(DFN) ; true if patient is included in range requested   ** PATCH 66 | 
|---|
| 184 | N IBX,IBY S IBX=1 | 
|---|
| 185 | I $D(^TMP($J,"PATIENT INCLUDE",DFN)) S IBX=1 G PATQ | 
|---|
| 186 | I $D(^TMP($J,"PATIENT EXCLUDE",DFN)) S IBX=0 G PATQ | 
|---|
| 187 | ; | 
|---|
| 188 | I +$G(IBSELRNG)=2 S IBY=$$TERMDG(DFN) D | 
|---|
| 189 | . I IBY<$G(IBSELSR1) S IBX=0 | 
|---|
| 190 | . I +$G(IBSELSR2),IBY>IBSELSR2 S IBX=0 | 
|---|
| 191 | ; | 
|---|
| 192 | I +$G(IBSELRNG)=1 S IBY=$P($G(^DPT(+DFN,0)),U,1),IBX=$$STGRNG(IBY) | 
|---|
| 193 | ; | 
|---|
| 194 | I +IBX S ^TMP($J,"PATIENT INCLUDE",DFN)="" | 
|---|
| 195 | I 'IBX S ^TMP($J,"PATIENT EXCLUDE",DFN)="" | 
|---|
| 196 | PATQ Q IBX | 
|---|
| 197 | ; | 
|---|
| 198 | PTINS(DFN) ; check if patients ins is within selected range  ** PATCH 66 | 
|---|
| 199 | N IBY,IBX,IBAR,IBI S IBX=1 | 
|---|
| 200 | I $D(^TMP($J,"PATIENT INCLUDE",DFN)) S IBX=1 G PTINSQ | 
|---|
| 201 | I $D(^TMP($J,"PATIENT EXCLUDE",DFN)) S IBX=0 G PTINSQ | 
|---|
| 202 | ; | 
|---|
| 203 | I $G(IBSELRNG)=3 D ALL^IBCNS1(DFN,"IBAR",1,IBBEG),ALL^IBCNS1(DFN,"IBAR",1,IBEND) S IBX=0 | 
|---|
| 204 | S IBI=0 F  S IBI=$O(IBAR(IBI)) Q:'IBI  S IBY=+$G(IBAR(IBI,0)),IBY=$P($G(^DIC(36,+IBY,0)),U,1) I +$$STGRNG(IBY) S IBX=1 Q | 
|---|
| 205 | ; | 
|---|
| 206 | I +IBX S ^TMP($J,"PATIENT INCLUDE",DFN)="" | 
|---|
| 207 | I 'IBX S ^TMP($J,"PATIENT EXCLUDE",DFN)="" | 
|---|
| 208 | PTINSQ Q IBX | 
|---|
| 209 | ; | 
|---|
| 210 | STGRNG(STRNG) ; check if the string passed in is contained within the selected ASCII range  ** PATCH 66 | 
|---|
| 211 | N IBSB,IBSE,IBI,IBY,IBX S IBX=1,STRNG=$$ASCII($G(STRNG)) | 
|---|
| 212 | F IBI=1:1 S IBSB=$P($G(IBSELSR1),",",IBI),IBY=$P(STRNG,",",IBI) Q:'IBSB  Q:IBSB<IBY  I IBSB>IBY S IBX=0 Q | 
|---|
| 213 | F IBI=1:1 S IBSE=$P($G(IBSELSR2),",",IBI),IBY=$P(STRNG,",",IBI) Q:'IBSE  Q:IBSE>IBY  I IBSE<IBY S IBX=0 Q | 
|---|
| 214 | Q IBX | 
|---|
| 215 | ; | 
|---|
| 216 | ASCII(STRNG) ; returns string in ASCII ** PATCH 66 | 
|---|
| 217 | N IBI,IBX,IBY S IBX="" | 
|---|
| 218 | I $G(STRNG)'="" F IBI=1:1 S IBY=$E(STRNG,IBI) Q:IBY=""  S IBX=IBX_$A(IBY)_"," Q:$L(IBX)>196 | 
|---|
| 219 | Q IBX | 
|---|
| 220 | ; | 
|---|
| 221 | TERMDG(DFN) ; returns a patients terminal digit  ** PATCH 66 | 
|---|
| 222 | N TERMD,DPT0,SSN S TERMD="",DPT0=$G(^DPT(+DFN,0)),SSN=$P(DPT0,"^",9) | 
|---|
| 223 | S TERMD=$E(SSN,8,9)_$E(SSN,6,7)_$E(SSN,4,5)_$E(SSN,1,3) | 
|---|
| 224 | Q TERMD | 
|---|
| 225 | ; | 
|---|
| 226 | RNBOE(IBOE) ; return a Reason Not Billable for the encounter if one can be found | 
|---|
| 227 | N IBX,IBR S IBR="" I +$G(IBOE) S IBX=+$O(^IBT(356,"ASCE",+IBOE,0)) I +IBX S IBR=$P($G(^IBT(356,IBX,0)),U,19) | 
|---|
| 228 | Q IBR | 
|---|