IBTRKR41 ;ALB/AAS - CLAIMS TRACKING - ADD/TRACK OUTPATIENT ENCOUNTERS ;13-AUG-93
;;2.0;INTEGRATED BILLING;**43,55,91,132,174,247,260,315,292,312,339,399**;21-MAR-94;Build 8
;;Per VHA Directive 2004-038, this routine should not be modified.
;
OPCHK ; -- check and add rx
N Y,Y0,IBSERV,IBAPPT
N IBSWINFO S IBSWINFO=$$SWSTAT^IBBAPI() ;IB*2.0*312
; IBDT is set from IBTRKR4
; Do NOT PROCESS on VistA if IBDT>=Switch Eff Date ;CCR-930
I +IBSWINFO,(IBDT+1)>$P(IBSWINFO,"^",2) Q ;IB*2.0*312
;
K IBRMARK
I '$D(ZTQUEUED),($G(IBTALK)) W "."
;
S IBOEDATA=$$SCE^IBSDU(IBOE),IBOESTAT=$P(IBOEDATA,"^",15)
S IBSERV=$S(+$P($G(^DIC(40.7,+$P(IBOEDATA,"^",3),0)),"^",2)=180:"DENTAL",1:"OUTPATIENT")
S IBAPPT=$P($G(^SD(409.1,+$P(IBOEDATA,"^",10),0)),"^",1)
S DFN=$P(IBOEDATA,"^",2)
I 'DFN G OPCHKQ
I $P(IBOEDATA,"^",5) S IBVSIT=$P(IBOEDATA,"^",5) I '$$BDSRC^IBEFUNC3(IBVSIT) G OPCHKQ ;non-billable data sources
; -- do not allow date/time duplicate claims before Jan. 1, 2006
I $O(^IBT(356,"APTY",DFN,IBOETYP,IBDT,0)),IBDT<3060101 G OPCHKQ
;
; -- see if tracking only insured and pt is insured/insured for outpt visits
I $P(IBTRKR,"^",3)=1,'$$INSURED^IBCNS1(DFN,IBDT) G OPCHKQ ; patient not insured
;
I '$$PTFTF^IBCNSU31(DFN,IBDT) S IBRMARK="FILING TIMEFRAME NOT MET"
;
; -- see if outpatient services are covered
I '$$PTCOV^IBCNSU3(DFN,IBDT,IBSERV,.IBANY) S IBRMARK=$S($G(IBANY)&(IBSERV="DENTAL"):"NO DENTAL COVERAGE",$G(IBANY):"NO OUTPATIENT COVERAGE",1:"NOT INSURED")
;
; -- see if appointment type is billable
I '$$RPT^IBEFUNC($P(IBOEDATA,"^",10),+IBOEDATA) S IBRMARK=$S(IBAPPT="RESEARCH":"RESEARCH VISIT",1:"NON-BILLABLE APPOINTMENT TYPE")
;
; -- check sc status, special conditions etc.
I $G(IBRMARK)="" S IBRMARK=$$CL(IBOEDATA)
;
; -- check for non-billable stops or clinic
S X=$P(IBOEDATA,"^",4) I X,$$NBCT^IBEFUNC(X,+IBOEDATA) S IBRMARK="NON-BILLABLE CLINIC"
S X=$P(IBOEDATA,"^",3) I X,$$NBST^IBEFUNC(X,+IBOEDATA) S IBRMARK="NON-BILLABLE STOP CODE"
;
; -- ok to add to tracking module
D OPT^IBTUTL1(DFN,IBOETYP,IBDT,IBOE,IBRMARK,$G(IBVSIT)) I '$D(ZTQUEUED),$G(IBTALK) W "+"
I IBRMARK'="" S IBCNT2=IBCNT2+1
I IBRMARK="" S IBCNT1=IBCNT1+1
OPCHKQ K IBANY,IBRMARK,VAEL,VA,IBOEDATA,IBVSIT,DFN,X,Y
Q
;
BULL ; -- send bulletin
;
S XMSUB="Outpatient Encounters added to Claims Tracking Complete"
S IBT(1)="The process to automatically add Opt Encounters has successfully completed."
S IBT(1.1)=""
S IBT(2)=" Start Date: "_$$DAT1^IBOUTL(IBTSBDT)
S IBT(3)=" End Date: "_$$DAT1^IBOUTL(IBTSEDT)
I $D(IBMESS) S IBT(3.1)=IBMESS
S IBT(4)=""
S IBT(5)=" Total Encounters Checked: "_$G(IBCNT)
S IBT(6)=" Total Encounters Added: "_$G(IBCNT1)
S IBT(7)=" Total Non-billable Encounters Added: "_$G(IBCNT2)
S IBT(8)=""
S IBT(9)="*The SC, Agent Orange, Southwest Asia, Ionizing Radiation,"
S IBT(10)="Military Sexual Trauma, Head Neck Cancer, Combat Veteran and Project 112/SHAD"
S IBT(11)="status visits have been added for insured patients but automatically"
S IBT(12)="indicated as not billable."
D SEND^IBTRKR31
BULLQ Q
;
CL(IBOEDATA,IBR) ; check out classification questions for encounter
; this new check will look at the V POV level then to the Visit level
; as necessary to determine if it relates or not. This will indicate
; if the WHOLE visit is not billable, otherwise it will say it is
; (even if just part is billable).
; call with the zero node of 409.68 in IBOEDATA
; assumes DFN and IBDT defined
; pass in IBR by ref to get values back
;
N IBRMARK,IBPCEX,IBCPT,IBARR,IBP,IBDX,IBVRNB,IBENCL
S IBRMARK="",IBPCEX=$P(IBOEDATA,"^",5)
;
; look up classification info needed (if any)
D CL^SDCO21(DFN,IBDT,"",.IBARR) I '$D(IBARR) G CLQ
;
; if no PCE event use old approach
I 'IBPCEX D:$G(IBOE) G CLQ
. S IBENCL=$$ENCL^IBAMTS2(IBOE) I IBENCL["1" D ; return 1 in string if true "ao^ir^sc^swa^mst^hnc^cv^shad"
. I $P(IBENCL,"^",3) S IBRMARK="SC TREATMENT" Q
. I $P(IBENCL,"^",1) S IBRMARK="AGENT ORANGE" Q
. I $P(IBENCL,"^",2) S IBRMARK="IONIZING RADIATION" Q
. I $P(IBENCL,"^",4) S IBRMARK="SOUTHWEST ASIA" Q
. I $P(IBENCL,"^",5) S IBRMARK="MILITARY SEXUAL TRAUMA" Q
. I $P(IBENCL,"^",6) S IBRMARK="HEAD/NECK CANCER" Q
. I $P(IBENCL,"^",7) S IBRMARK="COMBAT VETERAN" Q
. I $P(IBENCL,"^",8) S IBRMARK="PROJECT 112/SHAD" Q
;
; look up PCE info
D ENCEVENT^PXKENC(IBPCEX)
;
S IBVRNB=$$RNB($G(^TMP("PXKENC",$J,IBPCEX,"VST",IBPCEX,800)),.IBARR)
;
; find dx rnb's
S IBDX=0 F S IBDX=$O(^TMP("PXKENC",$J,IBPCEX,"POV",IBDX)) Q:'IBDX S IBDX(+$G(^TMP("PXKENC",$J,IBPCEX,"POV",IBDX,0)))=$$RNB($G(^TMP("PXKENC",$J,IBPCEX,"POV",IBDX,800)),.IBARR)
;
; look for v cpt's with IBDX
S IBCPT=0 F S IBCPT=$O(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT)) Q:'IBCPT F IBP=5,9,10,11 Q:'$D(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT,0)) D
. ;
. ; dx exists in v cpt but not v pov use visit level determination
. I $P(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT,0),"^",IBP),'$D(IBDX($P(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT,0),"^",IBP))) D:IBVRNB REL(IBVRNB) Q
. ;
. ; use dx determination (where dx exists on v cpt)
. I $P(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT,0),"^",IBP) D:$G(IBDX($P(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT,0),"^",IBP))) REL($G(IBDX($P(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT,0),"^",IBP)))) Q
;
; check for no assoc dx and apply visit level determination
S IBCPT=0 F S IBCPT=$O(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT)) Q:'IBCPT D
. S IBDX=0 F IBP=5,9,10,11 Q:IBDX I +$P($G(^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT,0)),"^",IBP) S IBDX=1
. I 'IBDX,IBVRNB D REL(IBVRNB)
;
; if some procedures left, then we need to bill, set return array
I $D(^TMP("PXKENC",$J,IBPCEX,"CPT")) S IBRMARK="" M IBR=^TMP("PXKENC",$J,IBPCEX)
;
CLQ K ^TMP("PXKENC",$J)
Q IBRMARK
;
RNB(IBDATA,IBARR) ; find rnb's
; pass in PCE 800 data (visit or v pov) to find any reasons not billalbe
; IBARR = classifications that could apply to patient
; the RNB number returned is from the IBARR number (SDCO21 array)
N IBX,IBR S IBR=""
S IBX=0 F S IBX=$O(IBARR(IBX)) Q:'IBX!(IBR) I $P(IBDATA,"^",$P($T(CLDATA+(IBX+1)),"^",2)) S IBR=IBX
Q IBR
;
REL(IBRNB) ; kills of tmp if related and set IBRMARK
K ^TMP("PXKENC",$J,IBPCEX,"CPT",IBCPT)
S IBRMARK=$P($T(CLDATA+(IBRNB+1)),"^",3)
Q
;
CLDATA ; classification data
; format is: SCDO21 array^vpov/vcpt/visit 800 piece^reason not billable
;;1^2^AGENT ORANGE
;;2^3^IONIZING RADIATION
;;3^1^SC TREATMENT
;;4^4^SOUTHWEST ASIA
;;5^5^MILITARY SEXUAL TRAUMA
;;6^6^HEAD/NECK CANCER
;;7^7^COMBAT VETERAN
;;8^8^PROJECT 112/SHAD
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBTRKR41 6737 printed Oct 16, 2024@18:29:19 Page 2
IBTRKR41 ;ALB/AAS - CLAIMS TRACKING - ADD/TRACK OUTPATIENT ENCOUNTERS ;13-AUG-93
+1 ;;2.0;INTEGRATED BILLING;**43,55,91,132,174,247,260,315,292,312,339,399**;21-MAR-94;Build 8
+2 ;;Per VHA Directive 2004-038, this routine should not be modified.
+3 ;
OPCHK ; -- check and add rx
+1 NEW Y,Y0,IBSERV,IBAPPT
+2 ;IB*2.0*312
NEW IBSWINFO
SET IBSWINFO=$$SWSTAT^IBBAPI()
+3 ; IBDT is set from IBTRKR4
+4 ; Do NOT PROCESS on VistA if IBDT>=Switch Eff Date ;CCR-930
+5 ;IB*2.0*312
IF +IBSWINFO
IF (IBDT+1)>$PIECE(IBSWINFO,"^",2)
QUIT
+6 ;
+7 KILL IBRMARK
+8 IF '$DATA(ZTQUEUED)
IF ($GET(IBTALK))
WRITE "."
+9 ;
+10 SET IBOEDATA=$$SCE^IBSDU(IBOE)
SET IBOESTAT=$PIECE(IBOEDATA,"^",15)
+11 SET IBSERV=$SELECT(+$PIECE($GET(^DIC(40.7,+$PIECE(IBOEDATA,"^",3),0)),"^",2)=180:"DENTAL",1:"OUTPATIENT")
+12 SET IBAPPT=$PIECE($GET(^SD(409.1,+$PIECE(IBOEDATA,"^",10),0)),"^",1)
+13 SET DFN=$PIECE(IBOEDATA,"^",2)
+14 IF 'DFN
GOTO OPCHKQ
+15 ;non-billable data sources
IF $PIECE(IBOEDATA,"^",5)
SET IBVSIT=$PIECE(IBOEDATA,"^",5)
IF '$$BDSRC^IBEFUNC3(IBVSIT)
GOTO OPCHKQ
+16 ; -- do not allow date/time duplicate claims before Jan. 1, 2006
+17 IF $ORDER(^IBT(356,"APTY",DFN,IBOETYP,IBDT,0))
IF IBDT<3060101
GOTO OPCHKQ
+18 ;
+19 ; -- see if tracking only insured and pt is insured/insured for outpt visits
+20 ; patient not insured
IF $PIECE(IBTRKR,"^",3)=1
IF '$$INSURED^IBCNS1(DFN,IBDT)
GOTO OPCHKQ
+21 ;
+22 IF '$$PTFTF^IBCNSU31(DFN,IBDT)
SET IBRMARK="FILING TIMEFRAME NOT MET"
+23 ;
+24 ; -- see if outpatient services are covered
+25 IF '$$PTCOV^IBCNSU3(DFN,IBDT,IBSERV,.IBANY)
SET IBRMARK=$SELECT($GET(IBANY)&(IBSERV="DENTAL"):"NO DENTAL COVERAGE",$GET(IBANY):"NO OUTPATIENT COVERAGE",1:"NOT INSURED")
+26 ;
+27 ; -- see if appointment type is billable
+28 IF '$$RPT^IBEFUNC($PIECE(IBOEDATA,"^",10),+IBOEDATA)
SET IBRMARK=$SELECT(IBAPPT="RESEARCH":"RESEARCH VISIT",1:"NON-BILLABLE APPOINTMENT TYPE")
+29 ;
+30 ; -- check sc status, special conditions etc.
+31 IF $GET(IBRMARK)=""
SET IBRMARK=$$CL(IBOEDATA)
+32 ;
+33 ; -- check for non-billable stops or clinic
+34 SET X=$PIECE(IBOEDATA,"^",4)
IF X
IF $$NBCT^IBEFUNC(X,+IBOEDATA)
SET IBRMARK="NON-BILLABLE CLINIC"
+35 SET X=$PIECE(IBOEDATA,"^",3)
IF X
IF $$NBST^IBEFUNC(X,+IBOEDATA)
SET IBRMARK="NON-BILLABLE STOP CODE"
+36 ;
+37 ; -- ok to add to tracking module
+38 DO OPT^IBTUTL1(DFN,IBOETYP,IBDT,IBOE,IBRMARK,$GET(IBVSIT))
IF '$DATA(ZTQUEUED)
IF $GET(IBTALK)
WRITE "+"
+39 IF IBRMARK'=""
SET IBCNT2=IBCNT2+1
+40 IF IBRMARK=""
SET IBCNT1=IBCNT1+1
OPCHKQ KILL IBANY,IBRMARK,VAEL,VA,IBOEDATA,IBVSIT,DFN,X,Y
+1 QUIT
+2 ;
BULL ; -- send bulletin
+1 ;
+2 SET XMSUB="Outpatient Encounters added to Claims Tracking Complete"
+3 SET IBT(1)="The process to automatically add Opt Encounters has successfully completed."
+4 SET IBT(1.1)=""
+5 SET IBT(2)=" Start Date: "_$$DAT1^IBOUTL(IBTSBDT)
+6 SET IBT(3)=" End Date: "_$$DAT1^IBOUTL(IBTSEDT)
+7 IF $DATA(IBMESS)
SET IBT(3.1)=IBMESS
+8 SET IBT(4)=""
+9 SET IBT(5)=" Total Encounters Checked: "_$GET(IBCNT)
+10 SET IBT(6)=" Total Encounters Added: "_$GET(IBCNT1)
+11 SET IBT(7)=" Total Non-billable Encounters Added: "_$GET(IBCNT2)
+12 SET IBT(8)=""
+13 SET IBT(9)="*The SC, Agent Orange, Southwest Asia, Ionizing Radiation,"
+14 SET IBT(10)="Military Sexual Trauma, Head Neck Cancer, Combat Veteran and Project 112/SHAD"
+15 SET IBT(11)="status visits have been added for insured patients but automatically"
+16 SET IBT(12)="indicated as not billable."
+17 DO SEND^IBTRKR31
BULLQ QUIT
+1 ;
CL(IBOEDATA,IBR) ; check out classification questions for encounter
+1 ; this new check will look at the V POV level then to the Visit level
+2 ; as necessary to determine if it relates or not. This will indicate
+3 ; if the WHOLE visit is not billable, otherwise it will say it is
+4 ; (even if just part is billable).
+5 ; call with the zero node of 409.68 in IBOEDATA
+6 ; assumes DFN and IBDT defined
+7 ; pass in IBR by ref to get values back
+8 ;
+9 NEW IBRMARK,IBPCEX,IBCPT,IBARR,IBP,IBDX,IBVRNB,IBENCL
+10 SET IBRMARK=""
SET IBPCEX=$PIECE(IBOEDATA,"^",5)
+11 ;
+12 ; look up classification info needed (if any)
+13 DO CL^SDCO21(DFN,IBDT,"",.IBARR)
IF '$DATA(IBARR)
GOTO CLQ
+14 ;
+15 ; if no PCE event use old approach
+16 IF 'IBPCEX
if $GET(IBOE)
Begin DoDot:1
+17 ; return 1 in string if true "ao^ir^sc^swa^mst^hnc^cv^shad"
SET IBENCL=$$ENCL^IBAMTS2(IBOE)
IF IBENCL["1"
Begin DoDot:2
End DoDot:2
+18 IF $PIECE(IBENCL,"^",3)
SET IBRMARK="SC TREATMENT"
QUIT
+19 IF $PIECE(IBENCL,"^",1)
SET IBRMARK="AGENT ORANGE"
QUIT
+20 IF $PIECE(IBENCL,"^",2)
SET IBRMARK="IONIZING RADIATION"
QUIT
+21 IF $PIECE(IBENCL,"^",4)
SET IBRMARK="SOUTHWEST ASIA"
QUIT
+22 IF $PIECE(IBENCL,"^",5)
SET IBRMARK="MILITARY SEXUAL TRAUMA"
QUIT
+23 IF $PIECE(IBENCL,"^",6)
SET IBRMARK="HEAD/NECK CANCER"
QUIT
+24 IF $PIECE(IBENCL,"^",7)
SET IBRMARK="COMBAT VETERAN"
QUIT
+25 IF $PIECE(IBENCL,"^",8)
SET IBRMARK="PROJECT 112/SHAD"
QUIT
End DoDot:1
GOTO CLQ
+26 ;
+27 ; look up PCE info
+28 DO ENCEVENT^PXKENC(IBPCEX)
+29 ;
+30 SET IBVRNB=$$RNB($GET(^TMP("PXKENC",$JOB,IBPCEX,"VST",IBPCEX,800)),.IBARR)
+31 ;
+32 ; find dx rnb's
+33 SET IBDX=0
FOR
SET IBDX=$ORDER(^TMP("PXKENC",$JOB,IBPCEX,"POV",IBDX))
if 'IBDX
QUIT
SET IBDX(+$GET(^TMP("PXKENC",$JOB,IBPCEX,"POV",IBDX,0)))=$$RNB($GET(^TMP("PXKENC",$JOB,IBPCEX,"POV",IBDX,800)),.IBARR)
+34 ;
+35 ; look for v cpt's with IBDX
+36 SET IBCPT=0
FOR
SET IBCPT=$ORDER(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT))
if 'IBCPT
QUIT
FOR IBP=5,9,10,11
if '$DATA(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT,0))
QUIT
Begin DoDot:1
+37 ;
+38 ; dx exists in v cpt but not v pov use visit level determination
+39 IF $PIECE(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT,0),"^",IBP)
IF '$DATA(IBDX($PIECE(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT,0),"^",IBP)))
if IBVRNB
DO REL(IBVRNB)
QUIT
+40 ;
+41 ; use dx determination (where dx exists on v cpt)
+42 IF $PIECE(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT,0),"^",IBP)
if $GET(IBDX($PIECE(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT,0),"^",IBP)))
DO REL($GET(IBDX($PIECE(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT,0),"^",IBP))))
QUIT
End DoDot:1
+43 ;
+44 ; check for no assoc dx and apply visit level determination
+45 SET IBCPT=0
FOR
SET IBCPT=$ORDER(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT))
if 'IBCPT
QUIT
Begin DoDot:1
+46 SET IBDX=0
FOR IBP=5,9,10,11
if IBDX
QUIT
IF +$PIECE($GET(^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT,0)),"^",IBP)
SET IBDX=1
+47 IF 'IBDX
IF IBVRNB
DO REL(IBVRNB)
End DoDot:1
+48 ;
+49 ; if some procedures left, then we need to bill, set return array
+50 IF $DATA(^TMP("PXKENC",$JOB,IBPCEX,"CPT"))
SET IBRMARK=""
MERGE IBR=^TMP("PXKENC",$JOB,IBPCEX)
+51 ;
CLQ KILL ^TMP("PXKENC",$JOB)
+1 QUIT IBRMARK
+2 ;
RNB(IBDATA,IBARR) ; find rnb's
+1 ; pass in PCE 800 data (visit or v pov) to find any reasons not billalbe
+2 ; IBARR = classifications that could apply to patient
+3 ; the RNB number returned is from the IBARR number (SDCO21 array)
+4 NEW IBX,IBR
SET IBR=""
+5 SET IBX=0
FOR
SET IBX=$ORDER(IBARR(IBX))
if 'IBX!(IBR)
QUIT
IF $PIECE(IBDATA,"^",$PIECE($TEXT(CLDATA+(IBX+1)),"^",2))
SET IBR=IBX
+6 QUIT IBR
+7 ;
REL(IBRNB) ; kills of tmp if related and set IBRMARK
+1 KILL ^TMP("PXKENC",$JOB,IBPCEX,"CPT",IBCPT)
+2 SET IBRMARK=$PIECE($TEXT(CLDATA+(IBRNB+1)),"^",3)
+3 QUIT
+4 ;
CLDATA ; classification data
+1 ; format is: SCDO21 array^vpov/vcpt/visit 800 piece^reason not billable
+2 ;;1^2^AGENT ORANGE
+3 ;;2^3^IONIZING RADIATION
+4 ;;3^1^SC TREATMENT
+5 ;;4^4^SOUTHWEST ASIA
+6 ;;5^5^MILITARY SEXUAL TRAUMA
+7 ;;6^6^HEAD/NECK CANCER
+8 ;;7^7^COMBAT VETERAN
+9 ;;8^8^PROJECT 112/SHAD
+10 ;