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

APCM25E9.m

Go to the documentation of this file.
  1. APCM25E9 ;IHS/CMI/LAB - IHS MU; ; 29 Jul 2013 4:09 PM
  1. ;;1.0;MU PERFORMANCE REPORTS;**7,8,9,10**;MAR 26, 2012;Build 31
  1. ;;;;;;Build 3
  1. CPOE ;EP - CALCULATE EPRESCRIBING
  1. ;for each provider or for the facility count all prescriptions that meet criteria and if it is not written it meets numerator
  1. K ^TMP($J,"PATSRX")
  1. K APCMRXS
  1. D TOTRX
  1. K ^TMP($J,"ORDERSPROCESSED")
  1. NEW APCMP,N,F
  1. S (APCMD1,APCMN1)=0
  1. I APCMRPTT=1 S APCMP=0 F S APCMP=$O(APCMPRV(APCMP)) Q:APCMP'=+APCMP D
  1. .I $P($G(APCMRXS(APCMP)),U,1)<100 S F=$P(^APCM25OB(APCMIC,0),U,11) D
  1. ..D S^APCM25E1(APCMRPT,APCMIC,"Provider is excluded from this measure as he/she had < 100 medication orders during the EHR reporting period.",APCMP,APCMRPTT,APCMTIME,F,1)
  1. D .;set denominator value into field
  1. .S F=$P(^APCM25OB(APCMIC,0),U,8) ;denom field for this measure
  1. .S N=$P($G(APCMRXS(APCMP)),U,1) ;returns # of prescriptions^# not written by nature of order
  1. .D S^APCM25E1(APCMRPT,APCMIC,N,APCMP,APCMRPTT,APCMTIME,F)
  1. .;now set patient list for this provider
  1. .S P=0 F S P=$O(^TMP($J,"PATSRX",APCMP,P)) Q:P'=+P D
  1. ..S D=$P(^TMP($J,"PATSRX",APCMP,P),U,1),N=$P(^TMP($J,"PATSRX",APCMP,P),U,2) S APCMVALU="# Orders: "_D_"|||"_"# CPOE: "_N_" # NOT CPOE: "_(D-N)
  1. ..S DFN=P D SETLIST^APCM25E1
  1. .;numerator?
  1. .S F=$P(^APCM25OB(APCMIC,0),U,9)
  1. .S N=$P($G(APCMRXS(APCMP)),U,2)
  1. .D S^APCM25E1(APCMRPT,APCMIC,N,APCMP,APCMRPTT,APCMTIME,F)
  1. I APCMRPTT=2 D
  1. .S APCMP=APCMFAC
  1. .S F=$P(^APCM25OB(APCMIC,0),U,8) ;denom field for this measure
  1. .S N=$P($G(APCMRXS(APCMFAC)),U,1) ;returns # of prescriptions^# not written by nature of order
  1. .D S^APCM25E1(APCMRPT,APCMIC,N,APCMFAC,APCMRPTT,APCMTIME,F)
  1. .;now set patient list for this FACILITY
  1. .S P=0 F S P=$O(^TMP($J,"PATSRX",APCMFAC,P)) Q:P'=+P D
  1. ..S D=$P(^TMP($J,"PATSRX",APCMFAC,P),U,1),N=$P(^TMP($J,"PATSRX",APCMFAC,P),U,2) S APCMVALU="# Orders: "_D_"|||"_"# CPOE: "_N_" # NOT CPOE: "_(D-N)
  1. ..S DFN=P D SETLIST^APCM25E1
  1. .;numerator?
  1. .S F=$P(^APCM25OB(APCMIC,0),U,9)
  1. .S N=$P($G(APCMRXS(APCMFAC)),U,2)
  1. .D S^APCM25E1(APCMRPT,APCMIC,N,APCMFAC,APCMRPTT,APCMTIME,F)
  1. K ^TMP($J,"PATSRX")
  1. Q
  1. TOTRX ;EP - did patient have a RX in file 52 with an issue date
  1. ;between BD and ED
  1. ;SET ARRAY APCMRXS to APCMRXS(prov ien)=denom^numer
  1. K ^TMP($J,"ORDERSPROCESSED")
  1. NEW ID,C,Y,X,D,S,N,A,B,R,PAT,G,ORIEN,ORPFILE,ORPTST,ORNS,PATLOC,ORACT0,ORORD,ORDEB
  1. S ID=$$FMADD^XLFDT(APCMBDAT,-1),ID=ID_".9999"
  1. F S ID=$O(^OR(100,"AF",ID)) Q:ID'=+ID!($P(ID,".")>APCMEDAT) D
  1. .S ORIEN=0 F S ORIEN=$O(^OR(100,"AF",ID,ORIEN)) Q:ORIEN'=+ORIEN D
  1. ..Q:$D(^TMP($J,"ORDERSPROCESSED",ORIEN))
  1. ..S ^TMP($J,"ORDERSPROCESSED",ORIEN)=""
  1. ..S ORPFILE=$P($G(^OR(100,ORIEN,0)),"^",2) Q:ORPFILE="" ;Quit if no object of order
  1. ..Q:$P(ORPFILE,";",2)'["DPT" ;only patient orders
  1. ..S PAT=+$P($G(^OR(100,ORIEN,0)),U,2) ;GET Patient DFN
  1. ..Q:$$DEMO^APCLUTL(PAT,APCMDEMO) ;Quit if demo patient
  1. ..Q:+$P($G(^OR(100,ORIEN,3)),"^",11)'=0 ;190 quit if order type not standard
  1. ..S ORPTST=$P($G(^OR(100,ORIEN,0)),"^",12) ;patient status (in/out)
  1. ..S ORNS=$$NMSP($P($G(^OR(100,ORIEN,0)),"^",14)) ;get package namespace
  1. ..I ORNS'="PS" Q ;if not getting all types of orders then quit if order is not from pharmacy
  1. ..S ORACT0=$G(^OR(100,ORIEN,8,1,0))
  1. ..Q:$P(ORACT0,U,1)'=ID
  1. ..S ORORD=$P(ORACT0,"^",12) ;ORORD holds nature of order ien
  1. ..Q:ORORD=4 ;skip service corrections
  1. ..S ORPVID=$P(ORACT0,"^",3)
  1. ..S G=0
  1. ..I APCMRPTT=1 D
  1. ...Q:ORPTST'="O" ;Quit if patient status is not outpatient and in EP report
  1. ...S ORPVID=$P(ORACT0,"^",3) Q:'$D(APCMPRV(ORPVID)) ;quit if ordering provider doesn't match user selected provider
  1. ...S PATLOC=+$P($G(^OR(100,ORIEN,0)),U,10)
  1. ...S C="" I PATLOC,$D(^SC(PATLOC,0)) S C=$P(^SC(PATLOC,0),U,7) I C Q:$P($G(^DIC(40.7,C,0)),U,2)=30 ;IF ER IN HOSP LOC Q
  1. ...S G=1
  1. ..I APCMRPTT=2 D
  1. ...I ORPTST="I" S G=1 Q
  1. ...Q:APCMMETH="O"
  1. ...S PATLOC=+$P($G(^OR(100,ORIEN,0)),U,10)
  1. ...Q:'PATLOC
  1. ...S C="" I PATLOC,$D(^SC(PATLOC,0)) S C=$P(^SC(PATLOC,0),U,7) I C Q:$P($G(^DIC(40.7,C,0)),U,2)'=30 ;IF NOT ER IN HOSP LOC Q
  1. ...I PATLOC,$D(^SC(PATLOC,0)) S C=$P(^SC(PATLOC,0),U,4) I C,C'=APCMFAC Q
  1. ...S G=1
  1. ..Q:'G
  1. ..S ORORD=$P(ORACT0,"^",12) ;ORORD holds nature of order ien
  1. ..;SET DENOM COUNT FOR THIS EP = INCREMENT BY 1
  1. ..I APCMRPTT=1 S $P(APCMRXS(ORPVID),U,1)=$P($G(APCMRXS(ORPVID)),U,1)+1,$P(^TMP($J,"PATSRX",ORPVID,PAT),U,1)=$P($G(^TMP($J,"PATSRX",ORPVID,PAT)),U,1)+1
  1. ..I APCMRPTT=2 S $P(APCMRXS(APCMFAC),U,1)=$P($G(APCMRXS(APCMFAC)),U,1)+1,$P(^TMP($J,"PATSRX",APCMFAC,PAT),U,1)=$P($G(^TMP($J,"PATSRX",APCMFAC,PAT)),U,1)+1
  1. ..;
  1. ..;now check to see if it has a nature of order IS equal to 1-written if so, quit and don't set numerator
  1. ..I ORORD=1 Q ;this is a written order so do not put in numerator
  1. ..S ORDEB=$P(^OR(100,ORIEN,8,1,0),"^",13) ;this is the person who entered the order (ENTERED BY)
  1. ..;Q:'$$ORES(ORDEB,$P(ID,".",1)) ;quit if this person does not have ORES or ORESLE on date of order so don't count in numerator
  1. ..; DUZ=2793 W " NUMER"
  1. ..I APCMRPTT=1 S $P(APCMRXS(ORPVID),U,2)=$P(APCMRXS(ORPVID),U,2)+1,$P(^TMP($J,"PATSRX",ORPVID,PAT),U,2)=$P($G(^TMP($J,"PATSRX",ORPVID,PAT)),U,2)+1
  1. ..I APCMRPTT=2 S $P(APCMRXS(APCMFAC),U,2)=$P($G(APCMRXS(APCMFAC)),U,2)+1,$P(^TMP($J,"PATSRX",APCMFAC,PAT),U,2)=$P($G(^TMP($J,"PATSRX",APCMFAC,PAT)),U,2)+1
  1. Q
  1. NMSP(PKG) ; -- Returns package namespace from pointer
  1. N Y S Y=$$GET1^DIQ(9.4,+PKG_",",1)
  1. S:$E(Y,1,2)="PS" Y="PS" S:Y="GMRV" Y="OR"
  1. Q Y
  1. ;
  1. ORES(R,D) ;EP - DID PROVIDER HAVE ORES OR ORESLE ON DATE D
  1. I '$G(R) Q ""
  1. I '$D(^VA(200,R,0)) Q ""
  1. NEW K,J
  1. S K=$O(^DIC(19.1,"B","ORES",0))
  1. S J=$O(^DIC(19.1,"B","ORELSE",0))
  1. I $D(^VA(200,R,51,K,0)),$P(^VA(200,R,51,K,0),U,3)'>D Q 1
  1. I $D(^VA(200,R,51,J,0)),$P(^VA(200,R,51,J,0),U,3)'>D Q 1
  1. Q ""
  1. PEA ;EP - PATIENT ELECTRONIC ACCESS
  1. ;does visit have AF-PHR or HIE logged for that visit
  1. NEW APCMP
  1. S (APCMD1,APCMN1)=0
  1. I APCMRPTT=1 S APCMP=0 F S APCMP=$O(APCMPRV(APCMP)) Q:APCMP'=+APCMP D
  1. .I '$D(APCMHVTP(APCMP)) G B ;no visits to this provider for this patient so don't bother, the patient is not in the denominator
  1. .;numerator?
  1. .S APCMEP=$$HASPEA(DFN,APCMBDAT,APCMEDAT,APCMP,1,.APCMVSTS) ;return # of visits^# w/AF-PHR or logged in HIE log
  1. .;set denominator value into field
  1. .S APCMTV=$P(APCMEP,U),APCMTE=$P(APCMEP,U,2)
  1. .S F=$P(^APCM25OB(APCMIC,0),U,8) ;denom field for this measure
  1. .D S^APCM25E1(APCMRPT,APCMIC,1,APCMP,APCMRPTT,APCMTIME,F)
  1. .;numerator?
  1. .S APCMVALU="# visits: "_$P(APCMEP,U,1)_" # elec access: "_+$P(APCMEP,U,2)_" |||"_$P(APCMEP,U,3)_" "_$P(APCMEP,U,4)_"|||"_$S($P(APCMEP,U,2):1,1:0)
  1. .S F=$P(^APCM25OB(APCMIC,0),U,9)
  1. .D S^APCM25E1(APCMRPT,APCMIC,$S(APCMTE:1,1:0),APCMP,APCMRPTT,APCMTIME,F)
  1. B .;measure b - did they access in ehr report period
  1. .I $P($G(APCMATTE("S2.020.EP.1",APCMP)),U,1)="Yes"!($P($G(APCMATTE("S2.026.EP",APCMP)),U,1)="Yes") S F=$P(^APCM25OB($O(^APCM25OB("B","S2.020.EP.1",0)),0),U,11) D
  1. ..D S^APCM25E1(APCMRPT,$O(^APCM25OB("B","S2.020.EP.1",0)),"Yes",APCMP,APCMRPTT,APCMTIME,F,1)
  1. .I '$D(APCMHVTP(APCMP)) Q
  1. .S APCMNEDV=DT ;ALL YEARS
  1. .;I $G(APCMEDUD),APCMEDUD>DT S APCMNEDV=DT
  1. .;I $G(APCMEDUD),APCMEDUD'>DT S APCMNEDV=APCMEDUD
  1. .I $G(APCMEDUD) S APCMNEDV=APCMEDUD
  1. .I APCMNEDV>DT S APCMNEDV=DT
  1. .S V="" I $T(PHR^BPHRMUPM)]"" D PHR^BPHRMUPM(DFN,APCMBDAT,APCMNEDV,.V)
  1. .;I DUZ=2881 W !,"DFN: ",DFN,"V: ",V
  1. .S APCMVALU="# visits: "_$P(APCMEP,U,1)_" # elec access: "_+$P(APCMEP,U,2)_" |||"_$P(APCMEP,U,3)_" "_$P(APCMEP,U,4)_" accessed PHR: "_$$DATE^APCM1UTL($P(V,U,4))_"|||"_$S($P(APCMEP,U,2):1,1:0)_"|||"_$P(V,U,3)
  1. .I $P(V,U,1)="-1" S APCMVDTE=1_U_"("_$P($P(V,U,10),":")_")"
  1. .;set measure B
  1. .S Y=$O(^APCM25OB("B","S2.020.EP.1",0))
  1. .S F=$P(^APCM25OB(Y,0),U,8)
  1. .D S^APCM25E1(APCMRPT,Y,1,APCMP,APCMRPTT,APCMTIME,F)
  1. .S F=$P(^APCM25OB(Y,0),U,9)
  1. .D S^APCM25E1(APCMRPT,Y,$P(V,U,3),APCMP,APCMRPTT,APCMTIME,F)
  1. .;Q:$P(APCMEP,U,1)=0
  1. .D SETLIST^APCM25E1
  1. I APCMRPTT=2 D
  1. .S APCMP=APCMFAC
  1. .;GET ARRAY OF DISCHARGES/ER VISITS
  1. .NEW APCMHERL,CNT,APCMHER
  1. .K APCMHER
  1. .S CNT=0
  1. .S X=0 F S X=$O(^AUPNVINP("AC",DFN,X)) Q:X'=+X D
  1. ..Q:'$D(^AUPNVINP(X,0))
  1. ..S D=$P($P(^AUPNVINP(X,0),U,1),".")
  1. ..Q:D<APCMBDAT
  1. ..Q:D>APCMEDAT
  1. ..Q:$$LOCENC^APCLV($P(^AUPNVINP(X,0),U,3))'=APCMFAC
  1. ..Q:$$SC^APCLV($P(^AUPNVINP(X,0),U,3))'="H" ;don't count Events
  1. ..S CNT=CNT+1
  1. ..S $P(APCMHER(CNT),U,5)=$P(^AUPNVINP(X,0),U,3) ;visit array
  1. .;IF ED METHOD ;NOW GET ALL ER VISITS
  1. .I APCMMETH="E" D
  1. ..S X=0 F S X=$O(APCMVSTS(X)) Q:X'=+X D
  1. ...S V=$P(APCMVSTS(X),U,5)
  1. ...Q:$$CLINIC^APCLV(V,"C")'=30
  1. ...Q:$$LOCENC^APCLV(V)'=APCMFAC
  1. ...Q:$$SC^APCLV(V)'="A"
  1. ...S CNT=CNT+1
  1. ...S $P(APCMHER(CNT),U,5)=V
  1. .I APCMMETH="O" D
  1. ..S X=0 F S X=$O(APCMVSTS(X)) Q:X'=+X D
  1. ...S V=$P(APCMVSTS(X),U,5)
  1. ...Q:$$SC^APCLV(V)'="O"
  1. ...S CNT=CNT+1
  1. ...S $P(APCMHER(CNT),U,5)=V
  1. .I '$D(APCMHER) G HB ;Q ;no visits
  1. .S APCMEP=$$HASPEA(DFN,APCMBDAT,APCMEDAT,APCMP,2,.APCMHER) ;return # of visits^# w/AF-PHR or logged in HIE log
  1. .;set denominator value into field
  1. .S APCMTV=$P(APCMEP,U),APCMTE=$P(APCMEP,U,2)
  1. .S F=$P(^APCM25OB(APCMIC,0),U,8) ;denom field for this measure
  1. .D S^APCM25E1(APCMRPT,APCMIC,1,APCMP,APCMRPTT,APCMTIME,F)
  1. .;numerator?
  1. .S APCMVALU="# visits: "_$P(APCMEP,U,1)_" # elec access: "_+$P(APCMEP,U,2)_" |||"_$P(APCMEP,U,3)_" "_$P(APCMEP,U,4)_"|||"_$S($P(APCMEP,U,2):1,1:0)
  1. .S F=$P(^APCM25OB(APCMIC,0),U,9)
  1. .D S^APCM25E1(APCMRPT,APCMIC,$S(APCMTE:1,1:0),APCMP,APCMRPTT,APCMTIME,F)
  1. HB .;measure b - did they access in ehr report period
  1. .I $G(APCMATTE("S2.025.H.1",APCMP))="Yes" S F=$P(^APCM25OB($O(^APCM25OB("B","S2.025.H.1",0)),0),U,11) D
  1. ..D S^APCM25E1(APCMRPT,$O(^APCM25OB("B","S2.025.H.1",0)),"Yes",APCMP,APCMRPTT,APCMTIME,F,1)
  1. .Q:'$D(APCMHER)
  1. .;S V="" I $T(PHR^BPHRMUPM)]"" D PHR^BPHRMUPM(DFN,APCMBDAT,DT,.V) ;IHS/CMI/LAB - PATCH 9
  1. .S APCMNEDV=DT ;ALL YEARS
  1. .;I $G(APCMEDUD),APCMEDUD>DT S APCMNEDV=DT
  1. .;I $G(APCMEDUD),APCMEDUD'>DT S APCMNEDV=APCMEDUD
  1. .I $G(APCMEDUD) S APCMNEDV=APCMEDUD
  1. .S V="" I $T(PHR^BPHRMUPM)]"" D PHR^BPHRMUPM(DFN,APCMBDAT,APCMNEDV,.V)
  1. .;I DUZ=2881 W !,"DFN: ",DFN,!,V
  1. .S APCMVALU="# visits: "_$P(APCMEP,U,1)_" # elec access: "_+$P(APCMEP,U,2)_" |||"_$P(APCMEP,U,3)_" "_$P(APCMEP,U,4)_" accessed PHR: "_$$DATE^APCM1UTL($P(V,U,4))_"|||"_$S($P(APCMEP,U,2):1,1:0)_"|||"_$P(V,U,3)
  1. .I $P(V,U,1)="-1" S APCMVDTE=1_U_"("_$P($P(V,U,10),":")_")"
  1. .;set measure B
  1. .S Y=$O(^APCM25OB("B","S2.025.H.1",0))
  1. .S F=$P(^APCM25OB(Y,0),U,8)
  1. .D S^APCM25E1(APCMRPT,Y,1,APCMP,APCMRPTT,APCMTIME,F)
  1. .S F=$P(^APCM25OB(Y,0),U,9)
  1. .D S^APCM25E1(APCMRPT,Y,$P(V,U,3),APCMP,APCMRPTT,APCMTIME,F)
  1. .;Q:$P(APCMEP,U,1)=0
  1. .D SETLIST^APCM25E1
  1. .Q
  1. Q
  1. HASPEA(P,BD,ED,R,RPT,VSTS) ;did a ccda get transmitted for each visit? return #visits^#w/ccda
  1. ;
  1. NEW A,B,C,D,E,X,Y,V,PWH,T,W,Z,Q,PED,EDUC
  1. ;LOOP THROUGH ALL VISITS AND COUNT VISIT AND ccda'S
  1. S PWH="0^0"
  1. ;check 89 multiple in AUPNPAT for a YES in .02 field
  1. S Z=0 F S Z=$O(^AUPNPAT(P,89,Z)) Q:Z'=+Z I $P($G(^AUPNPAT(P,89,Z,0)),U,2) D
  1. .Q:$P(^AUPNPAT(P,89,Z,0),U,1)>ED ;after report period
  1. .S $P(PWH,U,3)="PT REG HANDOUT on "_$$DATE^APCM1UTL($P(^AUPNPAT(P,89,Z,0),U,1))
  1. ;if no handout, check education for AF-PHR
  1. I $P(PWH,U,3)="" D
  1. .K EDUC
  1. .S Y="EDUC("
  1. .S Z=P_"^ALL EDUC AF-PHR;DURING "_$$FMTE^XLFDT($$DOB^AUPNPAT(P))_"-"_$$FMTE^XLFDT(ED) S E=$$START1^APCLDF(Z,Y)
  1. .I $D(EDUC(1)) D
  1. ..S $P(PWH,U,3)="AF-PHR on "_$$DATE^APCM1UTL($P(EDUC(1),U,1))
  1. .Q
  1. S X=0 F S X=$O(VSTS(X)) Q:X'=+X!($P(PWH,U,2)) D
  1. .S G=0
  1. .S V=$P(VSTS(X),U,5)
  1. .I '$D(^AUPNVSIT(V,0)) Q
  1. .I $P(^AUPNVSIT(V,0),U,11) Q ;deleted
  1. .I RPT=2 G SETD
  1. .I "AOSM"'[$P(^AUPNVSIT(V,0),U,7) Q ;not correct service category/OFFICE VISIT
  1. .S Y=0 F S Y=$O(^AUPNVPRV("AD",V,Y)) Q:Y'=+Y!(G) D
  1. ..I $P($G(^AUPNVPRV(Y,0)),U)'=R Q
  1. ..Q:$P(^AUPNVPRV(Y,0),U,4)'="P"
  1. ..S G=1
  1. .Q:'G ;not a visit to this provider
  1. .S C=$$CLINIC^APCLV(V,"C")
  1. .Q:C=30 ;NO ER
  1. .Q:C=77 ;NO CASE MANAGEMENT
  1. .Q:C=76 ;no lab
  1. .Q:C=63 ;NO RAD
  1. .Q:C=39 ;NO PHARMACY
  1. SETD .S $P(PWH,U,1)=$P(PWH,U,1)+1
  1. .;RIGHT HERE CHECK DAVID'S API, if date returned was within 4 business days count it and go on to check for patient ed - IT IS HOSP USE 3 DAYS AFTER DISCHARGE
  1. .S B=""
  1. .I RPT=1 S D=$$GET1^DIQ(9000010,V,1109,"I")
  1. .I RPT=2 D
  1. ..I $P(^AUPNVSIT(V,0),U,7)="H" S D=$$DDTM^APCLV(V) Q
  1. ..S D=$$ERDDT(V)
  1. ..I D="" S D=$$GET1^DIQ(9000010,V,1109,"I")
  1. .I $T(AUDITHIE^BCCDUTIL)]"" S B=$$AUDITHIE^BCCDUTIL(V,D)
  1. .I B="" Q ;doesn't fit numerator as it was never transmitted
  1. .;now check date B against date D to see if it is 4 business days FOR RPT 1, 36 hours for rpt 2
  1. .I RPT=1 S E=$$BD^APCM25E4(D,4) ;get date that is 4 business days from D
  1. .I RPT=2 S E=$$FMDIFF^XLFDT(B,D,2),E=E/60,E=E/60
  1. .I RPT=1,B>E Q ;more that 4 business days/36 HOURS
  1. .I RPT=2,E>36 Q
  1. .Q:$P(PWH,U,3)="" ;doesn't have other stuff so don't count in numerator
  1. .S $P(PWH,U,4)="Visit "_$$DATE^APCM1UTL($$VD^APCLV(V))_" w/HIE Date "_$$DATE^APCM1UTL(B)
  1. .S $P(PWH,U,2)=$P(PWH,U,2)+1
  1. Q PWH
  1. ERDDT(V) ;EP - get ER departure date/time
  1. I '$G(V) Q ""
  1. NEW X,Y
  1. S X=$O(^AUPNVER("AD",V,0))
  1. I 'X Q ""
  1. Q $$GET1^DIQ(9000010.29,X,.13,"I")