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