| 1 | IBAMTS1 ;ALB/CPM - PROCESS NEW OUTPATIENT ENCOUNTERS ; 22-JUL-93 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**20,52,132,153,166,156,167,247,339**;21-MAR-94;Build 2 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | NEW ; Appointment fully processed - prepare a new charge. | 
|---|
| 6 | ; | 
|---|
| 7 | ;  ibbilled is set to 1 if the patient has already been billed on this | 
|---|
| 8 | ;  date.  if the date is after 12/5/01, check the type of bill to see | 
|---|
| 9 | ;  if it is an upgrade from primary (1st bill) to specialty (new bill) | 
|---|
| 10 | I IBBILLED D:IBDAT'<3011206 CHKPRIM I IBBILLED G NEWQ | 
|---|
| 11 | ; | 
|---|
| 12 | ; - for registrations, get disposition, and use log-out date/time | 
|---|
| 13 | I IBORG=3 D  G:'IBDISP NEWQ | 
|---|
| 14 | .S IBDISP=+$P($G(^TMP("SDEVT",$J,SDHDL,IBORG,"DIS",0,"AFTER")),"^",7) | 
|---|
| 15 | .Q:'IBDISP | 
|---|
| 16 | .S IBTEMP=+$P($G(^TMP("SDEVT",$J,SDHDL,IBORG,"DIS",0,"AFTER")),"^",6) | 
|---|
| 17 | .S:IBTEMP IBDT=IBTEMP,IBDAT=$P(IBDT,".") | 
|---|
| 18 | ; | 
|---|
| 19 | I '$$BIL^DGMTUB(DFN,IBDT) G NEWQ ; patient is not Means Test billable | 
|---|
| 20 | ; | 
|---|
| 21 | ; - perform batch of edits | 
|---|
| 22 | I '$$CHKS G NEWQ | 
|---|
| 23 | ; | 
|---|
| 24 | ; - quit if AO/IR/SWA/MST/HNC/CV/SHAD exposure is indicated, or SC related | 
|---|
| 25 | D CLSF(0,.IBCLSF) | 
|---|
| 26 | I IBCLSF[1 G NEWQ | 
|---|
| 27 | ; | 
|---|
| 28 | S IBSL="409.68:"_IBOE | 
|---|
| 29 | ; | 
|---|
| 30 | BLD ; - build the charge. May also enter from IBAMTS2 (requires IBSL) | 
|---|
| 31 | ; | 
|---|
| 32 | ;  find the clinic stop code in 409.68 (dbia402) and find the matching | 
|---|
| 33 | ;  entry in file 352.5.  the 352.5 entry is populated in the 350 field | 
|---|
| 34 | ;  for reference using the ibstopda variable | 
|---|
| 35 | N %,IBSTOPDA,IBTYPE | 
|---|
| 36 | S %=$$GETSC^IBEMTSCU(IBSL,IBDAT) I % S IBSTOPDA=% | 
|---|
| 37 | ; | 
|---|
| 38 | ;  get the rate, ibtype = primary or specialty | 
|---|
| 39 | S IBTYPE=$P($G(^IBE(352.5,+$G(IBSTOPDA),0)),"^",3) I IBTYPE=0 Q | 
|---|
| 40 | ;  if the type is not defined, must be a local created sc, set it to primary | 
|---|
| 41 | I 'IBTYPE S IBTYPE=1 | 
|---|
| 42 | S IBX="O" D TYPE^IBAUTL2 G:IBY<0 NEWQ | 
|---|
| 43 | S IBUNIT=1,(IBFR,IBTO)=IBDAT,IBEVDA="*" | 
|---|
| 44 | D ADD^IBECEAU3 G:IBY<0 NEWQ | 
|---|
| 45 | ; | 
|---|
| 46 | ; - if enctr is exempt from classification, but patient isn't, send msg | 
|---|
| 47 | I $$EXOE^SDCOU2($S($G(IBOEN):IBOEN,1:IBOE)),$$CLPT(DFN,IBDAT) D BULL^IBAMTS | 
|---|
| 48 | ; | 
|---|
| 49 | ; - if the opt billing rate is over a year old, place the charge on hold | 
|---|
| 50 | ;I $$OLDRATE(IBRTED,IBFR) D  G CLOCK | 
|---|
| 51 | ;.S DIE="^IB(",DA=IBN,DR=".05////20" D ^DIE K DIE,DA,DR | 
|---|
| 52 | ; | 
|---|
| 53 | ; - drop the charge into the background filer | 
|---|
| 54 | D IBFLR G:IBY<0 NEWQ | 
|---|
| 55 | ; | 
|---|
| 56 | ; - if there is no active billing clock, add one | 
|---|
| 57 | CLOCK I '$D(^IBE(351,"ACT",DFN)) S IBCLDT=IBDAT D CLADD^IBAUTL3 | 
|---|
| 58 | ; | 
|---|
| 59 | NEWQ I IBY<0 D ^IBAERR1 | 
|---|
| 60 | K IBDISP,IBCLSF,IBCLDA,IBMED,IBCLDT,IBN,IBBS,IBTEMP | 
|---|
| 61 | K IBUNIT,IBFR,IBTO,IBSL,IBEVDA,IBX,IBDESC,IBATYP,IBCHG | 
|---|
| 62 | Q | 
|---|
| 63 | ; | 
|---|
| 64 | CHKS() ; Perform a batch of edits to determine whether to bill. | 
|---|
| 65 | ;  Input variables required:   IBEVT  --  encounter | 
|---|
| 66 | ;                             IBAPTY  --  appt type | 
|---|
| 67 | ;                              IBDAT  --  appt date | 
|---|
| 68 | ;                               IBDT  --  appt date/time | 
|---|
| 69 | ;                              IBORG  --  originating process | 
|---|
| 70 | ;                             IBDISP  --  disposition (if registration) | 
|---|
| 71 | N IBRESULT | 
|---|
| 72 | ; | 
|---|
| 73 | ;  default is fail the checks | 
|---|
| 74 | S IBRESULT=0 | 
|---|
| 75 | ; | 
|---|
| 76 | ;  for appts prior to 12/6/2001 | 
|---|
| 77 | I IBDAT<3011206 D  Q IBRESULT | 
|---|
| 78 | .   ; - non-count clinic | 
|---|
| 79 | .   I $P($G(^SC(+$P(IBEVT,"^",4),0)),"^",17)="Y" Q | 
|---|
| 80 | .   ; | 
|---|
| 81 | .   ; - non-billable appointment type | 
|---|
| 82 | .   I $$IGN^IBEFUNC(IBAPTY,IBDAT) Q | 
|---|
| 83 | .   ; | 
|---|
| 84 | .   ; - non-billable disposition/stop code/clinic | 
|---|
| 85 | .   I IBORG=1!(IBORG=2),$$NBCL^IBEFUNC(+$P(IBEVT,"^",4),IBDT) Q | 
|---|
| 86 | .   I IBORG=1!(IBORG=2),$$NBCSC^IBEFUNC(+$P(IBEVT,"^",3),IBDT) Q | 
|---|
| 87 | .   I IBORG=3,$$NBDIS^IBEFUNC(IBDISP,IBDT) Q | 
|---|
| 88 | .   ; | 
|---|
| 89 | .   ; - ignore if checked out late and pt was an inpatient at midnight | 
|---|
| 90 | .   I DT>IBDAT,$$INPT(DFN,IBDAT_".2359") Q | 
|---|
| 91 | .   ; | 
|---|
| 92 | .   ;  pass the checks | 
|---|
| 93 | .   S IBRESULT=1 | 
|---|
| 94 | ; | 
|---|
| 95 | ;  for appts on or after 12/6/2001 | 
|---|
| 96 | ; | 
|---|
| 97 | ; - non-billable appointment type | 
|---|
| 98 | I $$IGN^IBEFUNC(IBAPTY,IBDAT) Q 0 | 
|---|
| 99 | ; | 
|---|
| 100 | ; - non-count clinic | 
|---|
| 101 | I $P($G(^SC(+$P(IBEVT,"^",4),0)),"^",17)="Y" Q 0 | 
|---|
| 102 | ; | 
|---|
| 103 | ; - ignore if checked out late and pt was an inpatient at midnight | 
|---|
| 104 | I DT>IBDAT,$$INPT(DFN,IBDAT_".2359") Q 0 | 
|---|
| 105 | ; | 
|---|
| 106 | ;  pass the checks | 
|---|
| 107 | Q 1 | 
|---|
| 108 | ; | 
|---|
| 109 | ; | 
|---|
| 110 | IBFLR ; Drop the charge into the IB Background filer. | 
|---|
| 111 | N IBSEQNO,IBNOS,IBNOW,IBTOTL,IBSERV,IBWHER,IBFAC,IBSITE,IBAFY,IBARTYP,IBIL,IBTRAN | 
|---|
| 112 | D NOW^%DTC S IBNOW=%,IBNOS=IBN | 
|---|
| 113 | S IBSEQNO=$P($G(^IBE(350.1,+IBATYP,0)),"^",5) I 'IBSEQNO S IBY="-1^IB023" | 
|---|
| 114 | I IBY>0 D ^IBAFIL | 
|---|
| 115 | Q | 
|---|
| 116 | ; | 
|---|
| 117 | CLPT(DFN,VDATE) ; Should the patient be asked the classification questions? | 
|---|
| 118 | ;  Input:     DFN  --  Pointer to the patient in file #2 | 
|---|
| 119 | ;           VDATE  --  Visit date | 
|---|
| 120 | N IBARR D CL^SDCO21(DFN,VDATE,"",.IBARR) | 
|---|
| 121 | Q $D(IBARR)>0 | 
|---|
| 122 | ; | 
|---|
| 123 | INPT(DFN,VAINDT) ; Was the patient an inpatient at VAINDT? | 
|---|
| 124 | ;  Input:     DFN  --  Pointer to the patient in file #2 | 
|---|
| 125 | ;          VAINDT  --  Date/time to check for inpatient status | 
|---|
| 126 | ; Output:       1 - inpatient | 0 - not an inpatient | 
|---|
| 127 | N VADMVT D ADM^VADPT2 | 
|---|
| 128 | Q VADMVT>0 | 
|---|
| 129 | ; | 
|---|
| 130 | CLSF(IBUPD,Y) ; Examine classification questions. | 
|---|
| 131 | ;  Input:   IBUPD  --  0 if event just checked out | 
|---|
| 132 | ;                      1 if event is being updated | 
|---|
| 133 | ;               Y  --  array to place output | 
|---|
| 134 | ;  Output:  indicators returned as  ao^ir^sc^swa^mst^hnc^cv^shad [1|yes, 0|no] | 
|---|
| 135 | ;             if IBUPD=0, Y is returned as a single string | 
|---|
| 136 | ;             if IBUPD=1, Y("BEFORE"),Y("AFTER") are defined. | 
|---|
| 137 | N X,ZA,ZB S:'$G(IBUPD) Y="" S:$G(IBUPD) (Y("BEFORE"),Y("AFTER"))="" | 
|---|
| 138 | S X=0 F  S X=$O(^TMP("SDEVT",$J,SDHDL,IBORG,"SDOE",IBOE,"CL",X)) Q:'X  S ZB=$G(^(X,0,"BEFORE")),ZA=$G(^("AFTER")) D | 
|---|
| 139 | .I '$G(IBUPD) S:ZA $P(Y,"^",+ZA)=+$P(ZA,"^",3) Q | 
|---|
| 140 | .S $P(Y("BEFORE"),"^",+ZB)=+$P(ZB,"^",3),$P(Y("AFTER"),"^",+ZA)=+$P(ZA,"^",3) | 
|---|
| 141 | Q | 
|---|
| 142 | ; | 
|---|
| 143 | OLDRATE(IBRTED,IBFR) ; See if the copay rate effective date is too old. | 
|---|
| 144 | ;  Input:   IBRTED  --  Charge Effective Date | 
|---|
| 145 | ;             IBFR  --  Visit Date | 
|---|
| 146 | ;  Output:       1  --  Effective Date is too old | 
|---|
| 147 | ;                0  --  Not | 
|---|
| 148 | ; | 
|---|
| 149 | N IBNUM,IBYR | 
|---|
| 150 | S IBNUM=$$FMDIFF^XLFDT(IBFR,IBRTED),IBYR=$E(IBFR,1,3) | 
|---|
| 151 | Q IBYR#4&(IBNUM>364)!(IBYR#4=0&(IBNUM>365)) | 
|---|
| 152 | ; | 
|---|
| 153 | ; | 
|---|
| 154 | CHKPRIM ;  check to see if patient has been billed for primary | 
|---|
| 155 | ;  and this is a specialty stop.  if so, cancel the primary | 
|---|
| 156 | ;  bill and let the software create the new specialty charge | 
|---|
| 157 | ;  input ibbilled  = last parent bill to check (ien 350) | 
|---|
| 158 | ;                    used to check the rate | 
|---|
| 159 | ;  output ibbilled = last parent bill number to prevent | 
|---|
| 160 | ;                    adding specialty charge | 
|---|
| 161 | N %,IBSTOPDA,IBTYPE,IBCRES,IBI,IBS | 
|---|
| 162 | ; | 
|---|
| 163 | ;  get the stop code for the 2nd visit on the same day | 
|---|
| 164 | S IBSTOPDA=$$GETSC^IBEMTSCU("409.68:"_IBOE,IBDAT) I 'IBSTOPDA Q | 
|---|
| 165 | ; | 
|---|
| 166 | ;  get the rate, ibtype = primary or specialty | 
|---|
| 167 | S IBTYPE=$P(^IBE(352.5,IBSTOPDA,0),"^",3) | 
|---|
| 168 | ;  if the new appt is not specialty, quit ... no need to create | 
|---|
| 169 | ;  a new charge | 
|---|
| 170 | I IBTYPE'=2 Q | 
|---|
| 171 | ; | 
|---|
| 172 | ;  if the last charge was billed at specialty, quit | 
|---|
| 173 | I $P($G(^IBE(352.5,+$P($G(^IB(+IBBILLED,0)),"^",20),0)),"^",3)=2 Q | 
|---|
| 174 | ; | 
|---|
| 175 | ;  cancel the charge | 
|---|
| 176 | ;  cancellation reason = billed at higher tier rate | 
|---|
| 177 | S IBCRES=6,IBS=$P($G(^IB(+IBBILLED,0)),"^",5) | 
|---|
| 178 | ; | 
|---|
| 179 | ; if not billed, on hold, or cacelled wait | 
|---|
| 180 | I IBS'=3!(IBS'=8)!(IBS'=10) F IBI=1:1:10 H 1 S IBS=$P($G(^IB(+IBBILLED,0)),"^",5) I IBS=3!(IBS=8)!(IBS=10) Q | 
|---|
| 181 | ; | 
|---|
| 182 | D CANC^IBAMTS2 | 
|---|
| 183 | ; | 
|---|
| 184 | ;  set ibbilled = 0 to create the specialty charge | 
|---|
| 185 | S IBBILLED=0 | 
|---|
| 186 | Q | 
|---|