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

BGPMUA09.m

Go to the documentation of this file.
  1. BGPMUA09 ; IHS/MSC/MGH - MI measure NQF0062 & NQF0064 ;25-Jul-2011 08:19;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 NQA0062 for nephropathy
  1. N START,END,BGPNUM,BGPDEN,BGPNUM,STRING,BGPHYPER,BGPHYPL
  1. N IEN,INV,VISIT,DATA,VDATE,VALUE,EXCEPT,FIRST,VIEN,EXCEPT,RESULT
  1. N CNT,DIAB,NUM,EXC,DIAB,OUTENC,OPHENC,NONENC,VENC,DIABDX,ERENC,INENC
  1. S (BGPDEN,BGPNUM,RESULT)=0
  1. S START=9999999-BGPBDATE,END=9999999-BGPEDATE,VALUE=0
  1. S START=START_".2359"
  1. S (STRING,STRING2)="",DIABDX=0
  1. S (DIAB,EXC,NUM)=0
  1. ;Pts must be >18 and <75
  1. ;No need to check further if no age match
  1. Q:BGPAGEE<18!(BGPAGEE>75)
  1. S CNT=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 D VSTSTORE Q
  1. ..S OPHENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU OPTHAMOLOGY CPTS")
  1. ..I +OPHENC D VSTSTORE Q
  1. ..S NONENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU NON-ACUTE INPT CPT")
  1. ..I +NONENC D VSTSTORE Q
  1. ..S INENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU ACUTE INPT ENC")
  1. ..I +INENC D VSTSTORE Q
  1. ..S ERENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU DIAB ED ENCOUNTER CPT")
  1. ..I +ERENC D VSTSTORE Q
  1. ..S VENC=$$VSTPOV^BGPMUUT3(DFN,IEN,"BGPMU ENC OUTPATIENT ICD")
  1. ..I +VENC D VSTSTORE Q
  1. ;Next check to see if the patient is in the denominator
  1. ;Denominator is that the pt had a diabetes medicine
  1. ;in the last 2 years or a DX of diabetes in the last 2 years along with
  1. ;one inpt visit or 2 or more outpt visits
  1. S DIAB=$$DIAB^BGPMUA06(DFN,BGPBDATE,BGPEDATE,CNT,DIABDX)
  1. I +DIAB D
  1. .;If the patient is diabetetic, 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&(+DIAB=2) S EXC=$$EXCEPT^BGPMUA06(DFN,BGPBDATE,BGPEDATE,DIABDX)
  1. .D TOTAL1(DFN,DIAB,NUM,EXC)
  1. Q
  1. VSTSTORE ;Store compliant visit in array
  1. S CNT=CNT+1
  1. S VDATE=$P($G(^AUPNVSIT(IEN,0)),U,1)
  1. S VIEN(CNT)=IEN_U_VDATE
  1. S STRING(CNT)=$$DATE^BGPMUUTL(VDATE)
  1. Q
  1. TOTAL1(DFN,DIAB,NUM,EXC) ;See where this patient ends up
  1. N PTCNT,EXCCT,DENCT,NUMCT,NOTNUM,TOTALS,DXTIME,DEN
  1. S TOTALS=$G(^TMP("BGPMU0062",$J,BGPMUTF,"TOT"))
  1. S DENCT=+$G(^TMP("BGPMU0062",$J,BGPMUTF,"DEN"))
  1. S NUMCT=+$G(^TMP("BGPMU0062",$J,BGPMUTF,"NUM"))
  1. S EXCCT=+$G(^TMP("BGPMU0062",$J,BGPMUTF,"EXC"))
  1. S NOTNUM=+$G(^TMP("BGPMU0062",$J,BGPMUTF,"NOT"))
  1. S PTCNT=TOTALS
  1. S PTCNT=PTCNT+1
  1. S (DEN,DXTIME)=""
  1. S DENCT=DENCT+1 S ^TMP("BGPMU0062",$J,BGPMUTF,"DEN")=DENCT
  1. I $P(DIAB,U,3)'="" S DXTIME=$$DATE^BGPMUUTL($P(DIAB,U,3))
  1. S DEN=$P(DIAB,U,2)_" "_DXTIME
  1. I $D(STRING(1)) S DEN=DEN_";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("BGPMU0062",$J,BGPMUTF,"EXC")=EXCCT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0062",$J,"PAT",BGPMUTF,"EXC",PTCNT)=DFN_U_DEN_U_"EXCLUDE"
  1. I +NUM D
  1. .S NUMCT=NUMCT+1 S ^TMP("BGPMU0062",$J,BGPMUTF,"NUM")=NUMCT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0062",$J,"PAT",BGPMUTF,"NUM",PTCNT)=DFN_U_DEN_U_"M:"_$P(NUM,U,2)_";"_$P(NUM,U,3)
  1. I +NUM=0&(EXC=0) D
  1. .S NOTNUM=NOTNUM+1 S ^TMP("BGPMU0062",$J,BGPMUTF,"NOT")=NOTNUM
  1. .I BGPMUTF="C" S ^TMP("BGPMU0062",$J,"PAT",BGPMUTF,"NOT",PTCNT)=DFN_U_DEN_U_"NM:"_$P(NUM,U,2)_";"_$P(NUM,U,3)
  1. S ^TMP("BGPMU0062",$J,BGPMUTF,"TOT")=PTCNT
  1. ;Setup iCare array for patient
  1. S BGPICARE("MU.EP.0062.1",BGPMUTF)=1_U_+NUM_U_+EXC_U_DEN_";"_$P(NUM,U,2)_";"_$P(NUM,U,3)
  1. Q
  1. NUM1(DFN,BGPBDATE,BGPEDATE) ;Look for wide range of items to satisfy this measure
  1. N FOUND,YR1,YR2,HGBA1C,DATA,IEN,RESULT,TAX,NEPHDX,NEPHDX2,NEPCPT,NEPICD0,ACE,ARB
  1. N LABIEN,MICRO,VAL,VAL2,DATA2,RESULT2,SCREEN,NEPHDX
  1. S FOUND=0
  1. ;Set date 1yr before end
  1. N X1,X2,X S X1=BGPEDATE,X2=-365 D C^%DTC S YR1=X
  1. ;First check for DX of nephropathy
  1. S NEPHDX=$$LASTDX^BGPMUUT2(DFN,BGPBDATE,BGPEDATE,"BGPMU DIAB NEPHROPATHY DX")
  1. I +NEPHDX S FOUND=1_U_$P(NEPHDX,U,2)_U_$P(NEPHDX,U,3) Q FOUND
  1. S NEPHDX2=$$PLTAX^BGPMUUT1(DFN,"BGPMU DIAB NEPHROPATHY DX","A",BGPEDATE)
  1. I +NEPHDX2 S FOUND=1_U_$P(NEPHDX2,U,2)_U_$P(NEPHDX2,U,3) Q FOUND
  1. ;Second, check for nephropathy procedures
  1. S NEPCPT=$$CPT^BGPMUUT1(DFN,BGPBDATE,BGPEDATE,"BGPMU DIAB NEPH PROC CPT")
  1. I +NEPCPT S FOUND=1_U_$P(NEPCPT,U,2)_U_$P(NEPCPT,U,3) Q FOUND
  1. S NEPICD0=$$LASTPRC^BGPMUUT2(DFN,BGPBDATE,BGPEDATE,"BGPMU DIAB NEPH PROC ICD0")
  1. I +NEPICD0 S FOUND=1_U_$P(NEPICD0,U,2)_U_$P(NEPICD0,U,3) Q FOUND
  1. ;Third check to see if the patient is on an ACE/ARB
  1. S ACE=$$FIND^BGPMUUT8(DFN,"BGPMU ACE INHIBITOR NDC",BGPBDATE,"",BGPEDATE)
  1. I +ACE S FOUND=1_U_"ACE"_U_$P(ACE,U,3) Q FOUND
  1. S ARB=$$FIND^BGPMUUT8(DFN,"BGPMU ARB NDCS",BGPBDATE,"",BGPEDATE)
  1. I +ARB S FOUND=1_U_"ARB"_U_$P(ARB,U,3) Q FOUND
  1. ;Fourth check for microalbumin
  1. S MICRO=$$CPT^BGPMUUT1(DFN,BGPBDATE,BGPEDATE,"BGPMU DIAB MICRO CPT")
  1. I +MICRO S FOUND=1_U_$P(MICRO,U,2)_U_$P(MICRO,U,3) Q FOUND
  1. S TAX="BGPMU LAB CPT MICRO"
  1. D LABCPT^BGPMUUT5(.DATA,DFN,TAX,BGPBDATE,BGPEDATE)
  1. S VAL="" S VAL=$O(DATA(VAL))
  1. I +VAL D
  1. .S RESULT=$G(DATA(VAL))
  1. .I +RESULT>0 S FOUND=1_U_"ACR"_U_(9999999-VAL)
  1. E D
  1. .S TAX="BGPMU LAB LOINC MICROALBUMIN"
  1. .D LAB^BGPMUUT5(.DATA,DFN,TAX,BGPBDATE,BGPEDATE)
  1. .S VAL="" S VAL=$O(DATA(VAL))
  1. .I VAL="" S FOUND=$$VLAB^BGPMUA08(DFN,BGPBDATE,BGPEDATE,TAX)
  1. .E D
  1. ..S RESULT=$G(DATA(VAL))
  1. ..I +RESULT>0 S FOUND=1_U_"ACR"_U_(9999999-VAL)
  1. I +FOUND Q FOUND
  1. ;Fifth check for nephropathy screening
  1. S SCREEN=$$CPT^BGPMUUT1(DFN,YR1,BGPEDATE,"BGPMU DIAB NEPH SCREEN CPT")
  1. I +SCREEN S FOUND=1_U_$P(SCREEN,U,2)_U_$P(SCREEN,U,3) Q FOUND
  1. S TAX="BGPMU LAB CPT NEPH"
  1. D LABCPT^BGPMUUT5(.DATA,DFN,TAX,BGPBDATE,BGPEDATE)
  1. S VAL="" S VAL=$O(DATA(VAL))
  1. I +VAL D
  1. .S RESULT=$G(DATA(VAL))
  1. .I +RESULT>0 S FOUND=1_U_"NEP"_U_(9999999-VAL)
  1. E D
  1. .S TAX="BGPMU LAB LOINC NEPHROPATHY"
  1. .D LAB^BGPMUUT5(.DATA2,DFN,TAX,BGPBDATE,BGPEDATE)
  1. .S VAL2="" S VAL2=$O(DATA2(VAL2))
  1. .I VAL2="" S FOUND=$$VLAB(DFN,BGPBDATE,BGPEDATE,TAX)
  1. .E D
  1. ..S RESULT2=$G(DATA2(VAL2))
  1. ..I +RESULT2 S FOUND=1_U_"NEP"_U_(9999999-VAL2)
  1. Q FOUND
  1. VLAB(DFN,BGPBDATE,BGPEDATE,TAX) ;get lab results
  1. N VLAB,LABVAL,LIEN
  1. S LABVAL=0
  1. S VLAB=$$LOINC^BGPMUUT2(DFN,BGPBDATE,BGPEDATE,TAX)
  1. I VLAB D
  1. .S LIEN=$P(VLAB,U,2)
  1. .S LABVAL=1_U_$P($G(^AUPNVLAB(LIEN,0)),U,4)_U_$P(VLAB,U,1)
  1. Q LABVAL
  1. ENTRY2 ;EP Entry point for NQA0064 for LDL<100
  1. N START,END,BGPNUM,BGPDEN,BGPNUM,AENC,BENC,STRING,STRING2
  1. N IEN,INV,VISIT,DATA,VDATE,VALUE,EXCEPT,FIRST,VIEN,EXCEPT,RESULT,INENC
  1. N CNT,DIAB,EXC,NUM1,NUM2,DIAB,OUTENC,OPHENC,NONENC,VENC,DIABDX,ERENC
  1. S (BGPDEN,BGPNUM,RESULT)=0
  1. S START=9999999-BGPBDATE,END=9999999-BGPEDATE,VALUE=0
  1. S START=START_".2359"
  1. S (STRING,STRING2)="",DIABDX=0
  1. S (DIAB,EXC,NUM)=0
  1. ;Pts must be >18 and <75
  1. ;No need to check further if no age match
  1. Q:BGPAGEE<18!(BGPAGEE>75)
  1. S CNT=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 D VSTSTORE Q
  1. ..S OPHENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU OPTHAMOLOGY CPTS")
  1. ..I +OPHENC D VSTSTORE Q
  1. ..S NONENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU NON-ACUTE INPT CPT")
  1. ..I +NONENC D VSTSTORE Q
  1. ..S INENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU ACUTE INPT ENC")
  1. ..I +INENC D VSTSTORE Q
  1. ..S ERENC=$$VSTCPT^BGPMUUT1(DFN,IEN,"BGPMU DIAB ED ENCOUNTER CPT")
  1. ..I +ERENC D VSTSTORE Q
  1. ..S VENC=$$VSTPOV^BGPMUUT3(DFN,IEN,"BGPMU ENC OUTPATIENT ICD")
  1. ..I +VENC D VSTSTORE Q
  1. ;Next check to see if the patient is in the denominator
  1. ;Denominator is that the pt had a diabetes medicine
  1. ;in the last 2 years or a DX of diabetes in the last 2 years along with
  1. ;one inpt visit or 2 or more outpt visits
  1. S DIAB=$$DIAB^BGPMUA06(DFN,BGPBDATE,BGPEDATE,CNT,DIABDX)
  1. I +DIAB D
  1. .;If the patient is diabetetic, 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&(+DIAB=2) S EXC=$$EXCEPT^BGPMUA06(DFN,BGPBDATE,BGPEDATE,DIABDX)
  1. .D TOTAL2(DFN,DIAB,NUM,EXC)
  1. Q
  1. TOTAL2(DFN,DIAB,NUM,EXC) ;See where this patient ends up
  1. N PTCNT,EXCCT,DENCT,NUM1CT,NUM2CT,NOTNUM,TOTALS,DXTIME,DEN,NOTNUM1,NOTNUM2
  1. S TOTALS=$G(^TMP("BGPMU0064",$J,BGPMUTF,"TOT"))
  1. S DENCT=+$G(^TMP("BGPMU0064",$J,BGPMUTF,"DEN"))
  1. S NUM1CT=+$G(^TMP("BGPMU0064",$J,BGPMUTF,"NUM1"))
  1. S NUM2CT=+$G(^TMP("BGPMU0064",$J,BGPMUTF,"NUM2"))
  1. S EXCCT=+$G(^TMP("BGPMU0064",$J,BGPMUTF,"EXC"))
  1. S NOTNUM1=+$G(^TMP("BGPMU0064",$J,BGPMUTF,"NOT1"))
  1. S NOTNUM2=+$G(^TMP("BGPMU0064",$J,BGPMUTF,"NOT2"))
  1. S PTCNT=TOTALS
  1. S PTCNT=PTCNT+1
  1. S (DEN,DXTIME)=""
  1. S DENCT=DENCT+1 S ^TMP("BGPMU0064",$J,BGPMUTF,"DEN")=DENCT
  1. I $P(DIAB,U,3)'="" S DXTIME=$$DATE^BGPMUUTL($P(DIAB,U,3))
  1. S DEN=$P(DIAB,U,2)_" "_DXTIME
  1. I $D(STRING(1)) S DEN=DEN_";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("BGPMU0064",$J,BGPMUTF,"EXC")=EXCCT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0064",$J,"PAT",BGPMUTF,"EXC",PTCNT)=DFN_U_DEN_U_"EXCLUDE"
  1. I +NUM D
  1. .S NUM1CT=NUM1CT+1 S ^TMP("BGPMU0064",$J,BGPMUTF,"NUM1")=NUM1CT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0064",$J,"PAT",BGPMUTF,"NUM1",PTCNT)=DFN_U_DEN_U_"M:"_$P(NUM,U,3)_";"_$P(NUM,U,4)
  1. I +NUM=0&(EXC=0) D
  1. .S NOTNUM1=NOTNUM1+1 S ^TMP("BGPMU0064",$J,BGPMUTF,"NOT1")=NOTNUM1
  1. .I BGPMUTF="C" S ^TMP("BGPMU0064",$J,"PAT",BGPMUTF,"NOT1",PTCNT)=DFN_U_DEN_U_"NM:"_$P(NUM,U,3)_";"_$P(NUM,U,4)
  1. I $P(NUM,U,2)=1 D
  1. .S NUM2CT=NUM2CT+1 S ^TMP("BGPMU0064",$J,BGPMUTF,"NUM2")=NUM2CT
  1. .I BGPMUTF="C" S ^TMP("BGPMU0064",$J,"PAT",BGPMUTF,"NUM2",PTCNT)=DFN_U_DEN_U_"M:"_$P(NUM,U,3)_";"_$P(NUM,U,4)
  1. I $P(NUM,U,2)=0&(EXC=0) D
  1. .S NOTNUM2=NOTNUM2+1 S ^TMP("BGPMU0064",$J,BGPMUTF,"NOT2")=NOTNUM2
  1. .I BGPMUTF="C" S ^TMP("BGPMU0064",$J,"PAT",BGPMUTF,"NOT2",PTCNT)=DFN_U_DEN_U_"NM:"_$P(NUM,U,3)_";"_$P(NUM,U,4)
  1. S ^TMP("BGPMU0064",$J,BGPMUTF,"TOT")=PTCNT
  1. ;Setup iCare array for patient
  1. S BGPICARE("MU.EP.0064.1",BGPMUTF)=1_U_+NUM_U_+EXC_U_DEN_";"_$P(NUM,U,3)_";"_$P(NUM,U,4)
  1. S BGPICARE("MU.EP.0064.2",BGPMUTF)=1_U_+$P(NUM,U,2)_U_+EXC_U_DEN_";"_$P(NUM,U,3)_";"_$P(NUM,U,4)
  1. Q
  1. NUM2(DFN,BGPBDATE,BGPEDATE) ; Find the latest LDL
  1. N FOUND,YR1,YR2,LDL,DATA,VAL,IEN,RESULT,TAX,CPT
  1. S FOUND=0_U_0
  1. S RESULT=0
  1. S CPT=$$CPT^BGPMUUT1(DFN,BGPBDATE,BGPEDATE,"BGPMU DIAB LDL CPT")
  1. I +CPT S FOUND=1_U_0_$P(CPT,U,2)_U_$P(CPT,U,3)
  1. S TAX="BGPMU DIAB LDL CPT"
  1. D LAB^BGPMUUT5(.DATA,DFN,TAX,BGPBDATE,BGPEDATE)
  1. S VAL="" S VAL=$O(DATA(VAL))
  1. I +VAL D
  1. .S RESULT=$G(DATA(VAL))
  1. .I RESULT<100 S FOUND=1_U_1_U_RESULT_U_(9999999-VAL)
  1. .E S FOUND=1_U_0_U_RESULT_U_(9999999-VAL)
  1. E D
  1. .S TAX="BGPMU DIAB LDL LOINC"
  1. .D LAB^BGPMUUT5(.DATA,DFN,TAX,BGPBDATE,BGPEDATE)
  1. .S VAL="" S VAL=$O(DATA(VAL))
  1. .I VAL'="" D
  1. ..S RESULT=$G(DATA(VAL))
  1. ..I RESULT<100 S FOUND=1_U_1_U_RESULT_U_(9999999-VAL)
  1. ..E S FOUND=1_U_0_U_RESULT_U_(9999999-VAL)
  1. .I VAL="" D
  1. ..S RESULT=$$VLAB2(DFN,BGPBDATE,BGPEDATE,TAX)
  1. ..I +RESULT S FOUND=RESULT
  1. Q FOUND
  1. VLAB2(DFN,BGPBDATE,BGPEDATE,TAX) ;Get lab results
  1. N VLAB,LABVAL,LIEN,VAL
  1. S LABVAL=0
  1. S VLAB=$$LOINC^BGPMUUT2(DFN,BGPBDATE,BGPEDATE,TAX)
  1. I +VLAB D
  1. .S LIEN=$P(VLAB,U,2)
  1. .S VAL=$P($G(^AUPNVLAB(LIEN,0)),U,4)
  1. .I +VAL D
  1. ..I VAL<100.0 S LABVAL=1_U_1_U_VAL_U_$P(VLAB,U,1)
  1. ..E S LABVAL=1_U_0_U_VAL_U_$P(VLAB,U,1)
  1. Q LABVAL