Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: IBCNEDST

IBCNEDST.m

Go to the documentation of this file.
  1. IBCNEDST ;ALB/YMG - HL7 Registration Message Statistics ; 07-MAR-2013
  1. ;;2.0;INTEGRATED BILLING;**497,506,549,595,659,664,668,702,737**;21-MAR-94;Build 19
  1. ;;Per VA Directive 6402, this routine should not be modified.
  1. ;
  1. Q
  1. ;
  1. GETSTAT2() ;EP
  1. ; IB*2.0*549 - Added method
  1. ; Get additional IB Site Parameter fields
  1. ; Input: None
  1. ; Output: A1^A2^A3^A4^A5 - Where:
  1. ; A1 - 350.9, 51.27 - 270 MASTER SWITCH REALTIME
  1. ; A2 - 350.9, 51.28 - 270 MASTER SWITCH NIGHTLY
  1. ; A3 - 350.9, 51.15 - HL7 MAXIMUM NUMBER
  1. ; A4 - 350.9002, .05 - MAXIMUM EXTRACT NUMBER (appt)
  1. ; A5 - 350.9002, .05 - MAXIMUM EXTRACT NUMBER (buffer)
  1. ; A6 - 350.9, 51.32 - MEDICARE FRESHNESS DAYS ;/vd - IB*2*659
  1. ;
  1. N DATA,XX
  1. S DATA=$$GET1^DIQ(350.9,"1,",51.27,"I") ; 270 Master Switch Realtime
  1. S $P(DATA,"^",2)=$$GET1^DIQ(350.9,"1,",51.28,"I") ; 270 Master Switch Nightly
  1. S $P(DATA,"^",3)=$$GET1^DIQ(350.9,"1,",51.15,"I") ; HL7 Maximum Number
  1. S XX=$O(^IBE(350.9,1,51.17,"B",2,"")) ; Find Appointment multiple
  1. S XX=$$GET1^DIQ(350.9002,XX_",1,",.05,"I") ; Maximum Appointment Extract
  1. S $P(DATA,"^",4)=XX
  1. S XX=$O(^IBE(350.9,1,51.17,"B",1,"")) ; Find Buffer multiple
  1. S XX=$$GET1^DIQ(350.9002,XX_",1,",.05,"I") ; Maximum Buffer Extract
  1. S $P(DATA,"^",5)=XX
  1. S $P(DATA,"^",6)=$$GET1^DIQ(350.9,"1,",51.32,"I") ; MEDICARE Freshness Days ;/vd - IB*2*659
  1. Q DATA
  1. ;
  1. GETSTAT(MCAUTO) ; get statistical data
  1. ; Statistics are to match the eIV Statistical Report (^IBCNEPR8)
  1. ; IB*664/DW Added parameter "MCAUTO" - this will be used to split out the count of
  1. ; Medicare auto-updated responses from the all other eIV responses that
  1. ; were auto updated. We now have two calculated totals. Medicare and
  1. ; not Medicare eIV responses that were auto-updated.
  1. ;
  1. ; returns the following string, delimited by "^":
  1. ;
  1. ; piece 1 - Number of patients with potential secondary/tertiary insurance as identified by Medicare
  1. ; piece 2 - Number of automatically updated patient insurance records processed yesterday only
  1. ; piece 3 - Number of 270 inquiries pending receipt of 271 responses
  1. ; piece 4 - Number of queued 270 inquiries
  1. ; piece 5 - Number of deferred 270 inquiries
  1. ; piece 6 - Number of insurance companies with no National ID
  1. ; piece 7 - Number of locally disabled payers
  1. ; piece 8 - Number of Verified (*) buffer entries ; IB*737/DTG will be zero, not use '*' verified
  1. ; piece 9 - Number of buffer entries indicated as having Active insurance (+)
  1. ; piece 10 - Number of buffer entries indicated as having Inactive insurance (-)
  1. ; piece 11 - Number of buffer entries indicated as policy status undetermined (#)
  1. ; piece 12 - Number of buffer entries indicated as requiring correction before 270 can be sent (!)
  1. ; piece 13 - Number of buffer entries awaiting processing
  1. ; piece 14 - Number of buffer entries indicated as waiting for a 271 response (?)
  1. ; piece 15 - Number of buffer entries entered by manual process with no further processing (blank)
  1. ; piece 16 - Number of unlinked insurance companies
  1. ;
  1. N BUFINFO,PAYINFO,RESPINFO,STARTDTTM,TQINFO,STATS
  1. ;
  1. S STARTDTTM=$$FMADD^XLFDT($$NOW^XLFDT(),,-24) ; set to current date/time - 24 hours
  1. ; IB*664/DW Added parameter "MCAUTO" to line below
  1. S RESPINFO=$$RESPINFO(STARTDTTM,.MCAUTO) ; get data from file 365
  1. S TQINFO=$$TQINFO() ; get data from file 365.1
  1. S PAYINFO=$$PAYINFO() ; get data from file 36 & 365.12
  1. S BUFINFO=$$BUFINFO() ; get data from file 355.33
  1. S STATS=RESPINFO_U_TQINFO_U_$P(PAYINFO,U)_U_$P(PAYINFO,U,2)
  1. S STATS=STATS_U_BUFINFO_U_$P(PAYINFO,U,3)
  1. Q STATS
  1. ;
  1. RESPINFO(DTTM,MCAUTO) ; get data from IIV Response file (file 365)
  1. ; DTTM - start date/time
  1. ; MCAUTO - total # of auto-updated eIV responses that ARE Medicare related
  1. ; IB*664/DW Added parameter "MCAUTO"
  1. ;
  1. ; returns the following string, delimited by "^":
  1. ; piece 1: number of patients with potential secondary/tertiary insurance as identified by Medicare
  1. ; piece 2: Number of automatically updated patient insurance records processed yesterday only
  1. ; piece 3: Number of 270 inquiries pending receipt of 271 responses
  1. ;
  1. ; also returns MCAUTO - # of eIV responses from the Medicare payer that were auto-updated
  1. ;
  1. N AUTOUPD,DATE,DFN,EBIEN,IEN,INSNAMES,INSTYPE,INQP,POLICY,PAYER,PAYERWNR,PYRNAME,SECINS,Z
  1. ; IB*2.0*702/DTG- start Added number of outgoing EICD (A1) 270 transactions.
  1. ; Number of outgoing EICD-triggered (A2) 270 transactions.
  1. ; Number of outgoing MBI Request 270 transactions.
  1. ; Number of incoming MBI positive responses that indicated as having returned the MBI (%).
  1. N IB1P,IB2D,IB3IEN,IBA1,IBA2,IB40,IBTQ,IBTYP,IBQRY,IBAT1,IBAT2,IBSID,IBMBI,IBMBS
  1. S (IB1P,IB2D,IB3IEN,IBA1,IBA2,IB40,IBAT1,IBAT2,IBMBI,IBMBS)=""
  1. S DSTATPA=$G(DSTATPA),DSTATI=$G(DSTATI)
  1. ; IB*2.0*702/DTG - end Added
  1. S SECINS=0
  1. S PAYERWNR=$P($G(^IBE(350.9,1,51)),U,25) ; get Medicare payer ien from IB site parameters
  1. ;
  1. ; IB*664/DW - Added 1st 3 parameters to PATINFO, changed from extrinsic function
  1. D PATINFO(.AUTOUPD,PAYERWNR,.MCAUTO) ; IB*2*595/DM rewrote PATINFO
  1. S DATE=DTTM-0.000001 F S DATE=$O(^IBCN(365,"AD",DATE)) Q:DATE="" D
  1. .;IB*2*595/DM next 4 lines no longer applicable
  1. .; if response received within the last 24 hrs, check if it auto-updated insurance policy
  1. .;S PAYER=0 F S PAYER=$O(^IBCN(365,"AD",DATE,PAYER)) Q:PAYER="" D
  1. .;.S DFN=0 F S DFN=$O(^IBCN(365,"AD",DATE,PAYER,DFN)) Q:DFN="" S AUTOUPD=AUTOUPD+$$PATINFO(DFN)
  1. .;.Q
  1. .I PAYERWNR,$D(^IBCN(365,"AD",DATE,PAYERWNR)) D
  1. ..S DFN=0 F S DFN=$O(^IBCN(365,"AD",DATE,PAYERWNR,DFN)) Q:DFN="" D
  1. ...; create array of ins. company names for this patient (active policies only)
  1. ...K INSNAMES S INSTYPE=0 F S INSTYPE=$O(^DPT(DFN,.312,"B",INSTYPE)) Q:INSTYPE="" D
  1. ....S POLICY=0 F S POLICY=$O(^DPT(DFN,.312,"B",INSTYPE,POLICY)) Q:POLICY="" D
  1. .....; skip policies that are not active
  1. .....I $$CHK^IBCNS1(^DPT(DFN,.312,POLICY,0),DT,1) S INSNAMES($$EXTERNAL^DILFD(2.312,.01,,INSTYPE))=""
  1. .....Q
  1. ....Q
  1. ...S IEN=0 F S IEN=$O(^IBCN(365,"AD",DATE,PAYERWNR,DFN,IEN)) Q:IEN="" D
  1. ....S Z="" F S Z=$O(^IBCN(365,IEN,2,"B",Z)) Q:Z="" D
  1. .....S EBIEN=$O(^IBCN(365,IEN,2,"B",Z,""))
  1. .....; make sure eligibility code is "R"
  1. .....I $$GET1^DIQ(365.02,EBIEN_","_IEN_",",.02)'="R" Q
  1. .....S PYRNAME=$E($P($G(^IBCN(365,IEN,2,EBIEN,3)),U,3),1,30) ; grab first 30 chars to compare to 36/.01
  1. .....I PYRNAME'="",'$D(INSNAMES(PYRNAME)) S SECINS=SECINS+1
  1. . ; IB*2.0*702/DTG- start Added number of outgoing EICD (A1) 270 transactions. number of outgoing EICD-triggered (A2) 270 transactions
  1. . ; number of outgoing MBI Request 270 transactions
  1. . I $G(DSTATI)=1 D ;<
  1. . . S IB1P="" F S IB1P=$O(^IBCN(365,"AD",DATE,IB1P)) Q:IB1P="" S IB2D="" D ;<
  1. . . . F S IB2D=$O(^IBCN(365,"AD",DATE,IB1P,IB2D)) Q:IB2D="" S IB3IEN="" D ;<
  1. . . . . F S IB3IEN=$O(^IBCN(365,"AD",DATE,IB1P,IB2D,IB3IEN)) Q:IB3IEN="" D ;<
  1. . . . . . S IENS=IB3IEN_"," K IB40 D GETS^DIQ(365,IENS,"13.02;.05;.1","IE","IB40")
  1. . . . . . I $G(IB40(365,IENS,.1,"I"))'="O" Q
  1. . . . . . S IBSID=$G(IB40(365,IENS,13.02,"I"))
  1. . . . . . S IBTQ=$G(IB40(365,IENS,.05,"I"))
  1. . . . . . S IBTYP=$$GET1^DIQ(365.1,IBTQ_",",.1,"I"),IBQRY=$$GET1^DIQ(365.1,IBTQ_",",.11,"I")
  1. . . . . . ; IBMBI - Number of incoming MBI positive responses that indicated as having returned the MBI (%)
  1. . . . . . I IBTYP=7&(IBSID'="") S IBMBI=$G(IBMBI)+1 Q
  1. ;
  1. I $G(DSTATI)=1 D ;<
  1. . S DATE=DTTM-0.000001 F S DATE=$O(^IBCN(365,"AE",DATE)) Q:DATE="" D ;<
  1. . . S IB3IEN="" F S IB3IEN=$O(^IBCN(365,"AE",DATE,IB3IEN)) Q:IB3IEN="" D ;<
  1. . . . S IENS=IB3IEN_"," K IB40 D GETS^DIQ(365,IENS,"13.02;.05;.1","IE","IB40")
  1. . . . I $G(IB40(365,IENS,.1,"I"))'="O" Q
  1. . . . S IBSID=$G(IB40(365,IENS,13.02,"I"))
  1. . . . S IBTQ=$G(IB40(365,IENS,.05,"I"))
  1. . . . S IBTYP=$$GET1^DIQ(365.1,IBTQ_",",.1,"I"),IBQRY=$$GET1^DIQ(365.1,IBTQ_",",.11,"I")
  1. . . . ; IBA1 - Number of outgoing EICD (A1) 270 transactions
  1. . . . ; IBA2 - Number of outgoing EICD-triggered (A2) 270 transactions
  1. . . . ; IBMBS - Number of outgoing MBI Request 270 transactions
  1. . . . I IBTYP=7 S IBMBS=$G(IBMBS)+1 Q
  1. . . . I IBTYP=4 S:IBQRY="I" IBA1=$G(IBA1)+1 S:IBQRY="V" IBA2=$G(IBA2)+1
  1. . . ; IB*2.0*702/DTG - end Added
  1. ;
  1. ; IB*2.0*702/DTG - start Added
  1. I $G(DSTATI)=1 S DSTAT3=+$G(IBA1)_DSTATPA_+$G(IBA2)_DSTATPA_+$G(IBMBS)_DSTATPA_+$G(IBMBI)
  1. ; IB*2.0*702/DTG - end Added
  1. ;
  1. ; Number of 270 inquiries pending receipt of 271 responses
  1. S (INQP,IEN)=0 F S IEN=$O(^IBCN(365,"AC",2,IEN)) Q:'IEN D ; Transmitted status = 2
  1. . S INQP=INQP+1
  1. Q SECINS_U_AUTOUPD_U_INQP
  1. ;
  1. ;PATINFO() was fully replace for IB*2*595/DM
  1. ;PATINFO(DFN) ; get data from pat. insurance multiple (file 2.312)
  1. ;; DFN - file 2 ien
  1. ;;
  1. ;; returns
  1. ;; number of automatically updated patient insurance records for a given patient within last 24 hours
  1. ;;
  1. ;N AUTOUPD,INSTYPE,POLICY
  1. ;I 'DFN Q
  1. ;S AUTOUPD=0
  1. ;S INSTYPE=0 F S INSTYPE=$O(^DPT(DFN,.312,"B",INSTYPE)) Q:INSTYPE="" D
  1. ;.S POLICY=0 F S POLICY=$O(^DPT(DFN,.312,"B",INSTYPE,POLICY)) Q:POLICY="" D
  1. ;..; if DATE LAST VERIFIED is no more than one day old and EIV AUTO-UPDATE is set, increment auto-update counter
  1. ;..I +$P($G(^DPT(DFN,.312,POLICY,4)),U,4),$$FMDIFF^XLFDT(DT,+$P($G(^DPT(DFN,.312,POLICY,1)),U,3),1)<2 S AUTOUPD=AUTOUPD+1
  1. ;..Q
  1. ;.Q
  1. ;Q AUTOUPD
  1. ;;
  1. PATINFO(IBAUTO,PAYERWNR,MCAUTO) ; IB*2*595/DM
  1. ; compile an auto-update count for all patient policies from yesterday
  1. ; read all response records from yesterday via the "AUTO" cross reference
  1. ;
  1. ; PAYERWNR - ien of the current Medicare payer from file #350.9
  1. ; returns:
  1. ; IBAUTO - total count of auto-updated eIV responses that are not Medicare related
  1. ; MCAUTO - total count of auto-updated eIV responses that ARE Medicare related
  1. ;
  1. ; IB*664/DW added 1st three parameters, added logic to split out Medicare auto-updates
  1. ;
  1. N IBAUTOX,IBDATE,IBENDDT,IBIEN,IBPYRIEN,IBPATIEN,IBINSIEN
  1. S (IBAUTO,MCAUTO)=0
  1. S IBDATE=$$FMADD^XLFDT($$DT^XLFDT(),-2,23,59,59)
  1. S IBENDDT=$$FMADD^XLFDT($$DT^XLFDT(),-1,23,59,59)
  1. ;
  1. F S IBDATE=$O(^IBCN(365,"AUTO",IBDATE)) Q:'IBDATE!(IBDATE>IBENDDT) D
  1. .S IBPYRIEN=0 F S IBPYRIEN=$O(^IBCN(365,"AUTO",IBDATE,IBPYRIEN)) Q:'IBPYRIEN D
  1. ..S IBPATIEN=0 F S IBPATIEN=$O(^IBCN(365,"AUTO",IBDATE,IBPYRIEN,IBPATIEN)) Q:'IBPATIEN D
  1. ...S IBINSIEN=0 F S IBINSIEN=$O(^IBCN(365,"AUTO",IBDATE,IBPYRIEN,IBPATIEN,IBINSIEN)) Q:'IBINSIEN D
  1. ....; IB*2.0*664/DW Count Medicare auto-updates separately
  1. ....; IB*664 Added last 2 FOR-LOOPS, original counting was wrong)
  1. ....;S IBAUTO=IBAUTO+1
  1. ....S IBAUTOX=0 F S IBAUTOX=$O(^IBCN(365,"AUTO",IBDATE,IBPYRIEN,IBPATIEN,IBINSIEN,IBAUTOX)) Q:'IBAUTOX D
  1. .... .Q:IBAUTOX'=1 ;Auto updated records will be a "1"
  1. .... .S IBIEN=0 F S IBIEN=$O(^IBCN(365,"AUTO",IBDATE,IBPYRIEN,IBPATIEN,IBINSIEN,IBAUTOX,IBIEN)) Q:'IBIEN D
  1. .... ..I IBPYRIEN=PAYERWNR S MCAUTO=MCAUTO+1 Q
  1. .... ..S IBAUTO=IBAUTO+1 ; non-Medicare responses
  1. Q
  1. ;
  1. TQINFO() ; get data from transmission queue (file 365.1)
  1. ; returns the following string, delimited by "^":
  1. ; piece 1 - Number of queued 270 inquiries
  1. ; piece 2 - Number of deferred 270 inquiries
  1. ;
  1. N INQD,INQQ,INQUIRY,INSTS,TQSTATUS
  1. S (INQD,INQQ)=0
  1. ;
  1. ; Queued inquiries (Ready to Transmit - 1/Retry - 6) and
  1. ; Deferred inquiries (Hold - 4)
  1. F INSTS=1,6,4 D
  1. .S INQUIRY=0 F S INQUIRY=$O(^IBCN(365.1,"AC",INSTS,INQUIRY)) Q:'INQUIRY D
  1. ..I INSTS'=4 S INQQ=INQQ+1 Q ; counter for queued inquiries
  1. ..S INQD=INQD+1 ; counter for deferred inquiries
  1. ..Q
  1. .Q
  1. Q INQQ_U_INQD
  1. ;
  1. PAYINFO() ; get data from payer (file 365.12) & insurance company (file #36)
  1. ; returns the following string, delimited by "^":
  1. ; piece 1 - Number of insurance companies with no National ID
  1. ; piece 2 - Number of locally disabled payers
  1. ; piece 3 - Number of unlinked insurance companies
  1. ;
  1. N ACTIVE,APP,DATA,IDLIST,INSCO,INSTID,LOCDIS,NONATID,PAYER,PROFID,UNLINK
  1. S (LOCDIS,NONATID,UNLINK)=0
  1. ;
  1. ; Determine # of locally disabled payers
  1. ; loop through PAYER file
  1. S PAYER=0 F S PAYER=$O(^IBE(365.12,PAYER)) Q:'PAYER D
  1. .;I '$$ACTAPP^IBCNEUT5(PAYER) Q ; no active payer applications
  1. .; Check for National ID
  1. .S DATA=^IBE(365.12,PAYER,0)
  1. .I $P(DATA,U,2)="" Q ;Must have National ID
  1. .;
  1. .; Check for Locally Disabled
  1. .;IB*668/TAZ - Changed Payer Application from IIV to EIV
  1. .S APP=$$PYRAPP^IBCNEUT5("EIV",PAYER) I 'APP Q
  1. .S DATA=$G(^IBE(365.12,PAYER,1,APP,0))
  1. .I $P(DATA,U,2),'$P(DATA,U,3) S LOCDIS=LOCDIS+1 ; nationally active but locally disabled payers
  1. .Q
  1. ;
  1. ; Loop through INSURANCE COMPANY file for insurance companies not linked to a payer
  1. ; and insurance companies with No National ID
  1. ; No National ID [defined by VA CBO as no EDI IDs fields (#36,3.02) & (#36,3.04) - 3/4/14]
  1. ; This is *Not* a check for the 'VA NATIONAL ID' associated with linked payer.
  1. ;
  1. S INSCO=0 F S INSCO=$O(^DIC(36,INSCO)) Q:'INSCO D
  1. .S ACTIVE=$$ACTIVE^IBCNEUT4(INSCO) Q:'ACTIVE I $$EXCLUDE^IBCNEUT4($P(ACTIVE,U,2)) Q ; Exclude Medicaid, etc.
  1. .S PAYER=$P($G(^DIC(36,INSCO,3)),U,10) ; associated payer
  1. .I 'PAYER S UNLINK=UNLINK+1 ; Not linked to a payer. Increment UNLINK
  1. .I ($$GET1^DIQ(36,INSCO_",",3.02)=""),($$GET1^DIQ(36,INSCO_",",3.04)="") S NONATID=NONATID+1
  1. .Q
  1. Q NONATID_U_LOCDIS_U_UNLINK
  1. ;
  1. BUFINFO() ; get data from insurance buffer (file 355.33)
  1. ; DTTM - start date/time
  1. ;
  1. ; returns the following string, delimited by "^":
  1. ; piece 1 - Number of Verified (*) buffer entries within last 24 hours ; IB*737/DTG stop use of '*' verified
  1. ; piece 2 - Number of buffer entries indicated as having Active insurance (+) within last 24 hours
  1. ; piece 3 - Number of buffer entries indicated as having Inactive insurance (-) within last 24 hours
  1. ; piece 4 - Number of buffer entries indicated as policy status undetermined (#) within last 24 hours
  1. ; piece 5 - Number of buffer entries indicated as requiring correction before 270 can be sent (!) within last 24 hours
  1. ; piece 6 - Number of buffer entries awaiting processing within last 24 hours
  1. ; piece 7 - Number of buffer entries indicated as waiting for a 271 response (?) within last 24 hours
  1. ; piece 8 - Number of buffer entries entered by manual process with no further processing (blank) within last 24 hours
  1. ;
  1. N ACTIVE,AMBIG,BUFF,DATE,ERROR,INACTIVE,MANUAL,PROCWAIT,RESPWAIT,STATUS,SYM,VERIFIED
  1. S (ACTIVE,AMBIG,ERROR,INACTIVE,MANUAL,PROCWAIT,RESPWAIT,VERIFIED)=0
  1. S DATE=0 F S DATE=$O(^IBA(355.33,"AEST","E",DATE)) Q:DATE="" D
  1. .S BUFF=0 F S BUFF=$O(^IBA(355.33,"AEST","E",DATE,BUFF)) Q:BUFF="" D
  1. ..S SYM=$$SYMBOL^IBCNBLL(BUFF)
  1. ..;I SYM="*" S VERIFIED=VERIFIED+1 Q ; verified entries ; IB*737/DTG stop use of '*' verified
  1. ..I SYM="+" S ACTIVE=ACTIVE+1 Q ; active insurance
  1. ..I SYM="$" S ACTIVE=ACTIVE+1 Q ; include "$" (Escalated entries) in with the active insurance - IB*2.0*506 (vd)
  1. ..I SYM="-" S INACTIVE=INACTIVE+1 Q ; inactive insurance
  1. ..I SYM="#" S AMBIG=AMBIG+1 Q ; ambiguous response
  1. ..I SYM="!" S ERROR=ERROR+1 Q ; entries requiring correction
  1. ..I SYM="?" S RESPWAIT=RESPWAIT+1 Q ; awaiting response
  1. ..I SYM=" " S MANUAL=MANUAL+1 ; manually entered entries (no further processing)
  1. .S PROCWAIT=RESPWAIT+MANUAL ; entries awaiting processing
  1. Q VERIFIED_U_ACTIVE_U_INACTIVE_U_AMBIG_U_ERROR_U_PROCWAIT_U_RESPWAIT_U_MANUAL
  1. ;