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

BGPMUA10.m

Go to the documentation of this file.
  1. BGPMUA10 ; IHS/MSC/MGH - MI measure NQF0067 & NQF0070 ;11-Jul-2011 10:50;DU
  1. ;;11.1;IHS CLINICAL REPORTING SYSTEM;**1**;JUN 27, 2011;Build 106
  1. ;Code to collect meaningful use reports
  1. ENTRY1 ;EP Entry point for NQA0067 for CAD and antiplatelet therapy
  1. N START,END,BGPNUM,BGPDEN,BGPNUM,STRING,OUTCT,NFCT,INCT
  1. N IEN,INV,VISIT,DATA,VDATE,VALUE,EXCEPT,FIRST,VIEN,EXCEPT,RESULT
  1. N CNT,DIAB,NUM,EXC,DIAB,OUTENC,NFENC,INENC,CADDX
  1. S (BGPDEN,BGPNUM,RESULT)=0
  1. S START=9999999-BGPBDATE,END=9999999-BGPEDATE,VALUE=0
  1. S START=START_".2359"
  1. S STRING="",CADDX=0
  1. S (CAD,EXC,NUM)=0
  1. ;Pts must be >18
  1. ;No need to check further if no age match
  1. Q:BGPAGEE<18
  1. S (CNT,OUTCT,NFCT,INCT)=0
  1. S FIRST=END-0.1 F S FIRST=$O(^AUPNVSIT("AA",DFN,FIRST)) Q:FIRST=""!($P(FIRST,".",1)>START) D
  1. .S IEN=0 F S IEN=$O(^AUPNVSIT("AA",DFN,FIRST,IEN)) Q:'+IEN D
  1. ..;Check provider, Only visits for chosen provider
  1. ..Q:'$$PRV^BGPMUUT1(IEN,BGPPROV)
  1. ..S OUTENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU ENCOUNTER OUTPT")
  1. ..I +OUTENC S OUTCT=OUTCT+1
  1. ..S NFENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU NURSING FAC EM")
  1. ..I +NFENC S NFCT=NFCT+1
  1. ..S INENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU ENC CAD INPATIENT CPT")
  1. ..I +INENC S INCT=INCT+1
  1. ..I +OUTENC!(+NFENC)!(+INENC) D
  1. ...S VDATE=$P($G(^AUPNVSIT(IEN,0)),U,1)
  1. ...S CNT=CNT+1
  1. ...S VIEN(CNT)=IEN_U_VDATE_U_$$DATE^BGPMUUTL(VDATE)
  1. ...S STRING(CNT)=$$DATE^BGPMUUTL(VDATE)
  1. ;Next check to see if the patient is in the denominator
  1. ;Denominator is that the pt has DX of CAD or cardiac surgery before found visits
  1. I OUTCT>1!(NFCT>1)!(INCT>0) D
  1. .S CADDATE=$P($P($G(VIEN(1)),U,2),".")
  1. .S CAD=$$CAD(DFN,CADDATE)
  1. .I +CAD D
  1. ..;If the patient had CAD, check to see if they are in the numerator
  1. ..S NUM=$$NUM1(DFN,BGPBDATE,BGPEDATE)
  1. ..;If not in the numerator,see if they are an exception
  1. ..I +NUM=0 S EXC=$$EXCEPT(.VIEN,DFN,CADDATE,BGPEDATE,CNT)
  1. ..D TOTAL1(DFN,CAD,NUM,EXC)
  1. Q
  1. TOTAL1(DFN,CAD,NUM,EXC) ;See where this patient ends up
  1. N PTCNT,EXCCT,DENCT,NUMCT,NOTNUM,TOTALS,DXTIME,DEN
  1. S TOTALS=$G(^TMP("BGPMU0067",$J,BGPMUTF,"TOT"))
  1. S DENCT=+$G(^TMP("BGPMU0067",$J,BGPMUTF,"DEN"))
  1. S NUMCT=+$G(^TMP("BGPMU0067",$J,BGPMUTF,"NUM"))
  1. S EXCCT=+$G(^TMP("BGPMU0067",$J,BGPMUTF,"EXC"))
  1. S NOTNUM=+$G(^TMP("BGPMU0067",$J,BGPMUTF,"NOT"))
  1. S PTCNT=TOTALS
  1. S PTCNT=PTCNT+1
  1. S (DEN,DXTIME)=""
  1. S DENCT=DENCT+1 S ^TMP("BGPMU0067",$J,BGPMUTF,"DEN")=DENCT
  1. I $P(CAD,U,3)'="" S DXTIME=$$DATE^BGPMUUTL($P(CAD,U,3))
  1. S DEN=$P(CAD,U,2)_DXTIME_";EN:"_STRING(1)
  1. I $D(STRING(2)) S DEN=DEN_";EN:"_STRING(2)
  1. I +EXC D
  1. .S EXCCT=EXCCT+1 S ^TMP("BGPMU0067",$J,BGPMUTF,"EXC")=EXCCT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0067",$J,"PAT",BGPMUTF,"EXC",PTCNT)=DFN_U_DEN_U_"EXCLUDE"
  1. I +NUM D
  1. .S NUMCT=NUMCT+1 S ^TMP("BGPMU0067",$J,BGPMUTF,"NUM")=NUMCT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0067",$J,"PAT",BGPMUTF,"NUM",PTCNT)=DFN_U_DEN_U_"M:MED;"_$P(NUM,U,3)
  1. I +NUM=0&(EXC=0) D
  1. .S NOTNUM=NOTNUM+1 S ^TMP("BGPMU0067",$J,BGPMUTF,"NOT")=NOTNUM
  1. .I BGPMUTF="C" S ^TMP("BGPMU0067",$J,"PAT",BGPMUTF,"NOT",PTCNT)=DFN_U_DEN_U_"NM:"_$P(NUM,U,2)_";"_$P(NUM,U,3)
  1. S ^TMP("BGPMU0067",$J,BGPMUTF,"TOT")=PTCNT
  1. ;Setup iCare array for patient
  1. S BGPICARE("MU.EP.0067.1",BGPMUTF)=1_U_+NUM_U_+EXC_U_DEN_";"_$P(NUM,U,2)_";"_$P(NUM,U,3)
  1. Q
  1. CAD(DFN,CADDATE) ; Get the denominator
  1. N RESULT,CADA,CADB,CADDX,CADSUR,DOB
  1. S RESULT=0
  1. ;Check for coronary artery disease
  1. S DOB=$$GET1^DIQ(2,DFN,.03,"I")
  1. S CADA=$$LASTDX^BGPMUUT2(DFN,"",CADDATE,"BGPMU CAD DX")
  1. S CADB=$$PLTAX^BGPMUUT1(DFN,"BGPMU CAD DX","C",CADDATE)
  1. I +CADA S CADDX=CADA
  1. I +CADB S CADDX=CADB
  1. I +CADA!(+CADB) S RESULT=1_U_"CAD:"_U_$P(CADDX,U,3) Q RESULT
  1. ;Check for cardiac surgery
  1. S CADSUR=$$CPT^BGPMUUT1(DFN,DOB,CADDATE,"BGPMU CARDIAC SURGERY CPT")
  1. I +CADSUR S RESULT=1_U_"CSP:"_U_$P(CADSUR,U,3)
  1. Q RESULT
  1. EXCEPT(VIEN,DFN,CADDATE,BGPEDATE,CNT) ;Find exceptions
  1. N FOUND,BLEED,BLEED1,REF,ALLER
  1. ;Check for bleeding disorder
  1. S (BLEED,BLEED1,ALLER,REF,FOUND)=0
  1. S BLEED=$$LASTDX^BGPMUUT2(DFN,"",CADDATE,"BGPMU BLEEDING COAGULATION DX")
  1. I +BLEED S FOUND=1_U_$P(BLEED,U,2)_U_$P(BLEED,U,3) Q FOUND
  1. S BLEED1=$$PLTAX^BGPMUUT1(DFN,"BGPMU BLEEDING COAGULATION DX","A")
  1. I +BLEED1 S FOUND=1_U_$P(BLEED1,U,2)_U_$P(BLEED1,U,3) Q FOUND
  1. ;Next check for allergy
  1. S ALLER=$$ALLER("BL117","")
  1. I +ALLER S FOUND=1_U_$P(ALLER,U,1)
  1. ;Check for refusals
  1. S TAX="BGPMU ANTIPLATELET NDCS"
  1. S REF=$$REF(.VIEN,TAX,BGPEDATE)
  1. I +REF S FOUND=1_U_$P(REF,U,1)
  1. Q FOUND
  1. ALLER(CLASS,DRUG) ;Check for allergies
  1. N AA,BB,X,Y,TEST,INAC
  1. S (AA,TEST)=0
  1. F S AA=$O(^GMR(120.8,"B",DFN,AA)) Q:AA'>0!(+TEST=1) D
  1. .I $P(^GMR(120.8,AA,0),"^",16)'=1 Q ;Quit if not verified
  1. .I $D(^GMR(120.8,AA,"ER")),$P(^GMR(120.8,AA,"ER"),"^",1)=1 Q
  1. .S INAC=$$INACTIVE^GMRADSP6(AA)
  1. .Q:+INAC ;Quit if inactive
  1. .I DRUG'="" D
  1. ..S X=$P(^GMR(120.8,AA,0),"^",2) X ^%ZOSF("UPPERCASE")
  1. ..I (X[DRUG) S TEST="1^"_X
  1. .S BB=0
  1. .F S BB=$O(^GMR(120.8,AA,3,"B",BB)) Q:BB'>0 D
  1. ..I $P(^PS(50.605,BB,0),"^",1)=CLASS S TEST="1^"_CLASS
  1. Q TEST
  1. REF(VIEN,TAX,BGPEDATE) ;Look for refusals
  1. N MED,VST,EVT,X
  1. S MED=0
  1. S X=999 F S X=$O(VIEN(X),-1) Q:X=""!(+MED=1) D
  1. .S VST=$P(VIEN(X),U,1)
  1. .S EVT=$P($P($G(^AUPNVSIT(VST,0)),U,1),".",1)
  1. .S MED=$$MEDREF^BGPMUUT2(DFN,EVT,BGPEDATE,TAX)
  1. Q MED
  1. NUM1(DFN,BGPBDATE,BGPEDATE) ;check for meds in numerator
  1. N FOUND,PMED
  1. S FOUND=0
  1. S PMED=$$FIND^BGPMUUT8(DFN,"BGPMU ANTIPLATELET NDCS",BGPBDATE,"",BGPEDATE)
  1. I +PMED S FOUND=2_U_$P(PMED,U,2)_U_$P(PMED,U,3)
  1. Q FOUND
  1. ENTRY2 ;EP Entry point for NQA0070 for CAD and beta blockers
  1. N START,END,BGPNUM,BGPDEN,BGPNUM,STRING,OUTCT,NFCT,INCT
  1. N IEN,INV,VISIT,DATA,VDATE,VALUE,EXCEPT,FIRST,VIEN,EXCEPT,RESULT
  1. N CNT,DIAB,NUM,EXC,DIAB,OUTENC,NFENC,INENC,CADDX
  1. S (BGPDEN,BGPNUM,RESULT)=0
  1. S START=9999999-BGPBDATE,END=9999999-BGPEDATE,VALUE=0
  1. S START=START_".2359"
  1. S STRING="",CADDX=0
  1. S (CAD,EXC,NUM)=0
  1. ;Pts must be >18
  1. ;No need to check further if no age match
  1. Q:BGPAGEE<18
  1. S (CNT,OUTCT,NFCT,INCT)=0
  1. S FIRST=END-0.1 F S FIRST=$O(^AUPNVSIT("AA",DFN,FIRST)) Q:FIRST=""!($P(FIRST,".",1)>START) D
  1. .S IEN=0 F S IEN=$O(^AUPNVSIT("AA",DFN,FIRST,IEN)) Q:'+IEN D
  1. ..;Check provider, Only visits for chosen provider
  1. ..Q:'$$PRV^BGPMUUT1(IEN,BGPPROV)
  1. ..S OUTENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU ENCOUNTER OUTPT")
  1. ..I +OUTENC S OUTCT=OUTCT+1
  1. ..S NFENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU NURSING FAC EM")
  1. ..I +NFENC S NFCT=NFCT+1
  1. ..S INENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU ENC CAD INPATIENT CPT")
  1. ..I +INENC S INCT=INCT+1
  1. ..I +OUTENC!(+NFENC)!(+INENC) D
  1. ...S VDATE=$P($G(^AUPNVSIT(IEN,0)),U,1)
  1. ...S CNT=CNT+1
  1. ...S VIEN(CNT)=IEN_U_VDATE_U_$$DATE^BGPMUUTL(VDATE)
  1. ...S STRING(CNT)=$$DATE^BGPMUUTL(VDATE)
  1. ;Next check to see if the patient is in the denominator
  1. ;Denominator is that the pt has DX of CAD or cardiac surgery before found visits
  1. I OUTCT>1!(NFCT>1)!(INCT>0) D
  1. .S CADDATE=$P($P($G(VIEN(1)),U,2),".")
  1. .S CAD=$$CADMI(DFN,CADDATE,CNT)
  1. .I +CAD D
  1. ..;If the patient had CAD, check to see if they are in the numerator
  1. ..S NUM=$$NUM2(DFN,BGPBDATE,BGPEDATE)
  1. ..;If not in the numerator,see if they are an exception
  1. ..I +NUM=0 S EXC=$$EXCEPT2(.VIEN,DFN,CADDATE,BGPEDATE,CNT)
  1. ..D TOTAL2(DFN,CAD,NUM,EXC)
  1. Q
  1. TOTAL2(DFN,CAD,NUM,EXC) ;See where this patient ends up
  1. N PTCNT,EXCCT,DENCT,NUMCT,NOTNUM,TOTALS,DXTIME,DEN
  1. S TOTALS=$G(^TMP("BGPMU0070",$J,BGPMUTF,"TOT"))
  1. S DENCT=+$G(^TMP("BGPMU0070",$J,BGPMUTF,"DEN"))
  1. S NUMCT=+$G(^TMP("BGPMU0070",$J,BGPMUTF,"NUM"))
  1. S EXCCT=+$G(^TMP("BGPMU0070",$J,BGPMUTF,"EXC"))
  1. S NOTNUM=+$G(^TMP("BGPMU0070",$J,BGPMUTF,"NOT"))
  1. S PTCNT=TOTALS
  1. S PTCNT=PTCNT+1
  1. S (DEN,DXTIME)=""
  1. S DENCT=DENCT+1 S ^TMP("BGPMU0070",$J,BGPMUTF,"DEN")=DENCT
  1. I $P(CAD,U,3)'="" S DXTIME=$$DATE^BGPMUUTL($P(CAD,U,3))
  1. S DEN=$P(CAD,U,2)_DXTIME_";EN:"_STRING(1)
  1. I $D(STRING(2)) S DEN=DEN_";EN:"_STRING(2)
  1. I +EXC D
  1. .S EXCCT=EXCCT+1 S ^TMP("BGPMU0070",$J,BGPMUTF,"EXC")=EXCCT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0070",$J,"PAT",BGPMUTF,"EXC",PTCNT)=DFN_U_DEN_U_"EXCLUDE"
  1. I +NUM D
  1. .S NUMCT=NUMCT+1 S ^TMP("BGPMU0070",$J,BGPMUTF,"NUM")=NUMCT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0070",$J,"PAT",BGPMUTF,"NUM",PTCNT)=DFN_U_DEN_U_"M:MED;"_$P(NUM,U,3)
  1. I +NUM=0&(EXC=0) D
  1. .S NOTNUM=NOTNUM+1 S ^TMP("BGPMU0070",$J,BGPMUTF,"NOT")=NOTNUM
  1. .I BGPMUTF="C" S ^TMP("BGPMU0070",$J,"PAT",BGPMUTF,"NOT",PTCNT)=DFN_U_DEN_U_"NM:"_$P(NUM,U,2)_";"_$P(NUM,U,3)
  1. S ^TMP("BGPMU0070",$J,BGPMUTF,"TOT")=PTCNT
  1. ;Setup iCare array for patient
  1. S BGPICARE("MU.EP.0070.1",BGPMUTF)=1_U_+NUM_U_+EXC_U_DEN_";"_$P(NUM,U,2)_";"_$P(NUM,U,3)
  1. Q
  1. CADMI(DFN,CADDATE,CNT) ; Get the denominator
  1. N RESULT,CADA,CADB,CADDX,CADSUR,DOB,MIFND,I
  1. S RESULT=0,MIFND=0,CADDX=0
  1. S DOB=$$GET1^DIQ(2,DFN,.03,"I")
  1. ;Check for coronary artery disease
  1. S I=CNT+1 F S I=$O(VIEN(I),-1) Q:I=""!(+RESULT) D
  1. .S CADDATE=$P($G(VIEN(I)),U,2)
  1. .S CADA=$$LASTDX^BGPMUUT2(DFN,"",CADDATE,"BGPMU CAD-NO MI DX")
  1. .S CADB=$$PLTAX^BGPMUUT1(DFN,"BGPMU CAD-NO MI DX","C",CADDATE)
  1. .I +CADA S CADDX=1_U_"CAD:"_U_$P(CADA,U,3)
  1. .I +CADB S CADDX=1_U_"CAD:"_U_$P(CADB,U,3)
  1. .;Check for cardiac surgery
  1. .I +CADDX=0 D
  1. ..S CADSUR=$$CPT^BGPMUUT1(DFN,DOB,CADDATE,"BGPMU CARDIAC SURGERY CPT")
  1. ..I +CADSUR S CADDX=1_U_"CSP:"_U_$P(CADSUR,U,3)
  1. .;If pt has CAD or cardiac surgery, find previous heart attack
  1. .I +CADDX D
  1. ..S MIFND=$$MI(DFN,CADDATE)
  1. ..I +MIFND D
  1. ...I $P(MIFND,U,3)<CADDATE S RESULT=CADDX
  1. Q RESULT
  1. MI(DFN,CADDATE) ;Find MI diagnoses only inactive problem
  1. N FOUND,MIA,MIB
  1. S FOUND=0
  1. ; MIA=$$LASTDX^BGPMUUT2(DFN,"",CADDATE,"BGPMU MI DX")
  1. S MIB=$$PLTAX^BGPMUUT1(DFN,"BGPMU MI DX","I",CADDATE)
  1. ;I +MIA S FOUND=1_U_$P(MIA,U,2)_U_$P(MIA,U,3)
  1. I +MIB S FOUND=1_U_$P(MIB,U,2)_U_$P(MIB,U,3)
  1. Q FOUND
  1. EXCEPT2(VIEN,DFN,CADDATE,BGPEDATE,CNT) ;Find exceptions
  1. N RESULT,ARRY,HYPO,ASTHMA,BRADY,ATRESIA,MONITOR,PACE,PACE1,AVBLOCK
  1. ;Check for arrythmia
  1. S RESULT=0
  1. S ARRY=$$DXCK(DFN,"BGPMU ARRHYTHMIA DX",CADDATE)
  1. I +ARRY S RESULT=ARRY Q RESULT
  1. ;Check for hypotension
  1. S HYPO=$$DXCK(DFN,"BGPMU HYPOTENSION DX",CADDATE)
  1. I +HYPO S RESULT=HYPO Q RESULT
  1. ;Check for asthma
  1. S ASTHMA=$$DXCK(DFN,"BGPMU ASTHMA DX ICD",CADDATE)
  1. I +ASTHMA S RESULT=ASTHMA Q RESULT
  1. ;Check for bradycardia
  1. S BRADY=$$DXCK(DFN,"BGPMU BRADYCARDIA DX",CADDATE)
  1. I +BRADY S RESULT=BRADY Q RESULT
  1. ;Check for atresia and stenosis of the aorta
  1. S ATRESIA=$$DXCK(DFN,"BGPMU ATRESIA STENOSIS DX",CADDATE)
  1. I +ATRESIA S RESULT=ATRESIA Q RESULT
  1. ;Check for av block
  1. S AVBLOCK=$$DXCK(DFN,"BGPMU AV BLOCK DX",CADDATE)
  1. I +AVBLOCK D
  1. .S PACE=$$LASTPRC^BGPMUUT2(DFN,"",BGPEDATE,"BGPMU CARDIAC PACER ICD0")
  1. .S PACE1=$$DXCK(DFN,"BGPMU CARDIAC PACER IN SITU DX",BGPEDATE)
  1. .I PACE=0&(PACE1=0) S RESULT=AVBLOCK
  1. I +RESULT Q RESULT
  1. ;Check for monitoring
  1. S MONITOR=$$LASTPRC^BGPMUUT2(DFN,BGPBDATE,BGPEDATE,"BGPMU CARDIAC MONITORING ICD0")
  1. I +MONITOR S RESULT=MONITOR Q RESULT
  1. S MONITOR=$$CPT^BGPMUUT1(DFN,BGPBDATE,BGPEDATE,"BGPMU CARDIAC MONITORING CPT")
  1. I +MONITOR S RESULT=MONITOR Q RESULT
  1. ;Next check for allergy
  1. S ALLER=$$ALLER("CV100","")
  1. I +ALLER S RESULT=1_U_$P(ALLER,U,1) Q RESULT
  1. ;Check for refusals
  1. S TAX="BGPMU BETABLOCKER NDCS"
  1. S REF=$$REF(.VIEN,TAX,BGPEDATE)
  1. I +REF S RESULT=1_U_$P(REF,U,1) Q RESULT
  1. S RESULT=$$PULSE(DFN)
  1. Q RESULT
  1. DXCK(DFN,TAX,CKDATE) ;Find dx on problem list or POV
  1. N A1,A2,FOUND
  1. S FOUND=0
  1. S A1=$$LASTDX^BGPMUUT2(DFN,"",CKDATE,TAX)
  1. I +A1 S FOUND=1_U_$P(A1,U,2)_U_$P(A1,U,3) Q FOUND
  1. S A2=$$PLTAX^BGPMUUT1(DFN,TAX,"C")
  1. I +A2 S FOUND=1_U_$P(A2,U,2)_U_$P(A2,U,3)
  1. Q FOUND
  1. NUM2(DFN,BGPBDATE,BGPEDATE) ;check for meds in numerator
  1. N FOUND,PMED
  1. S FOUND=0
  1. S PMED=$$FIND^BGPMUUT8(DFN,"BGPMU BETABLOCKER NDCS",BGPBDATE,"",BGPEDATE)
  1. I +PMED S FOUND=2_U_$P(PMED,U,2)_U_$P(PMED,U,3)
  1. Q FOUND
  1. PULSE(DFN) ;Search for any 2 consecutive pulse measurements less than 50
  1. N FOUND,X,PU,MTYP,IEN,SAVE,CNT,X,YR2
  1. S FOUND=0,CNT=0,SAVE=0
  1. S MTYP="" S MTYP=$O(^AUTTMSR("B","PU",MTYP))
  1. N X1,X2,X S X1=BGPEDATE,X2=-672 D C^%DTC S YR2=X
  1. S X=9999999-BGPEDATE,END=9999999-YR2
  1. F S X=$O(^AUPNVMSR("AA",DFN,MTYP,X)) Q:X=""!(+FOUND)!(X>END) D
  1. .S IEN="" F S IEN=$O(^AUPNVMSR("AA",DFN,MTYP,X,IEN)) Q:IEN=""!(+FOUND) D
  1. ..S VST=$P($G(^AUPNVMSR(IEN,0)),U,3)
  1. ..I $P($G(^AUPNVMSR(IEN,0)),U,4)<50 D
  1. ...I SAVE=0 S SAVE=VST
  1. ...I SAVE=VST Q
  1. ...I SAVE'=VST S FOUND=1_U_"PULSE"
  1. ..I $P($G(^AUPNVMSR(IEN,0)),U,4)>49 D
  1. ...I SAVE>0&(SAVE'=VST) S SAVE=0
  1. Q FOUND