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

PXRMXX.m

Go to the documentation of this file.
  1. PXRMXX ; SLC/PJH - Extract Patient sample;07/29/2004
  1. ;;2.0;CLINICAL REMINDERS;;Feb 04, 2005
  1. ;
  1. ;Update ^TMP - all patients with encounters
  1. ;------------------------------------------
  1. TMP S ^TMP(NODE,$J,"TEMP",DFN)="" Q
  1. ;
  1. ;Save individual encounter into FIND1
  1. ;------------------------------------
  1. SAV S FCNT=FCNT+1,FOUND=1 M FIND1(FCNT)=FIND(ENC) Q
  1. ;
  1. ;Check if finding is in date range
  1. ;---------------------------------
  1. DCHK(DNODE) ;
  1. N DATE,LTERM,LTRAN,TNAM,SNUM,TERMNAM,TERMNAT
  1. S DATE=$G(FIND(ENC,DNODE)) Q:DATE=""
  1. ;
  1. I (DATE<BD)!(DATE>ED) Q
  1. ;Lab transforms
  1. I REM(PXRMITEM)="VA-NATIONAL EPI LAB EXTRACT" D Q:LTRAN
  1. .S LTRAN=0 D:$P(FIND(ENC,"FINDING"),";",2)="LAB(60," LTRAN
  1. ;National DB term mapping
  1. S TERMNAM=$P($G(FIND(ENC,"TERM")),U)
  1. ;If term exists check if it needs re-mapping for this reminder
  1. I TERMNAM]"" D
  1. .;Get the alternate name from the REM array
  1. .S TERMNAT=$G(REM(PXRMITEM,TERMNAM)) Q:TERMNAT=""
  1. .;National database code
  1. .S FIND(ENC,"ALTTRM")=TERMNAT
  1. ;Set source number code
  1. S SNUM=""
  1. I $G(FIND(ENC,"FILE NUMBER"))=9000011 S SNUM=1
  1. I $G(FIND(ENC,"FILE NUMBER"))=9000010.07 S SNUM=2
  1. I $G(FIND(ENC,"FILE NUMBER"))=45 S SNUM=3
  1. S FIND(ENC,"S/N")=SNUM
  1. ;
  1. ;Save encounter
  1. D SAV
  1. Q
  1. ;
  1. ;Check for findings
  1. ;------------------
  1. FCHEK(PXRMITEM) ;
  1. N ECNT,EDATE,ENC,LDONE,FOUND
  1. ;Get reminder name
  1. S PXRMNAM=$P($G(^PXD(811.9,PXRMITEM,0)),U)
  1. ;Check each encounter
  1. S ENC=0,ECNT=0,FOUND=0,LDONE=0
  1. F S ENC=$O(FIND(ENC)) Q:'ENC D
  1. .;Ignore medications - these are loaded from pharmacy
  1. .I $D(FIND(ENC,"DRUG")) Q
  1. .;Check if finding is in date range
  1. .I $D(FIND(ENC,"FINDING")) D DCHK("DATE")
  1. ;
  1. Q
  1. ;
  1. ;Update ^TMP - all patients with findings
  1. ;----------------------------------------
  1. FSAVE N CNT,FIEN,FCNT,FUNIQ,FREC
  1. N VDATA,VDATE,VFOUND,VLAST,VIEN,VLTYP,VOK,VSERV,VTYP
  1. ;Extract the visit date and type from visit record
  1. S CNT=0,FUNIQ=0,VLAST=0,VFOUND=0,VLTYP=""
  1. F S CNT=$O(FIND1(CNT)) Q:'CNT D
  1. .S VOK=0
  1. .I $D(FIND1(CNT,"VIEN")) D
  1. ..S VIEN=$G(FIND1(CNT,"VIEN")) Q:'VIEN
  1. ..S VDATA=$G(^AUPNVSIT(VIEN,0)) Q:VDATA=""
  1. ..;Get visit date and service from visit record
  1. ..S VDATE=$P(VDATA,U),VSERV=$P(VDATA,U,7),VFOUND=1,VOK=1,VTYP="O"
  1. ..;Calculate visit type from sevice
  1. ..I (VSERV="D")!(VSERV="H")!(VSERV="I") S VTYP="I"
  1. .;If no visit info default to finding date
  1. .I 'VOK S VDATE=$G(FIND1(CNT,"DATE")),VTYP="O" D
  1. ..N VAIN,VAINDT S VAINDT=VDATE D INP^VADPT
  1. ..I $G(VAIN(7))'="" S VTYP="I"
  1. .;Save encounter/finding date and type
  1. .S FIND1(CNT)=VDATE_U_VTYP
  1. .;Save count by finding for report
  1. .S FIEN=$G(FIND1(CNT,"FINDING")) I FIEN="" S FIEN="NO FINDING"
  1. .S FREC=$G(PXRMFIEN(FIEN)),FCNT=$P(FREC,U),FUNIQ=$P(FREC,U,2)
  1. .S FCNT=FCNT+1 I '$G(FUNIQ(FIEN)) S FUNIQ=FUNIQ+1
  1. .S PXRMFIEN(FIEN)=FCNT_U_FUNIQ,FUNIQ(FIEN)=1
  1. .;Save most recent
  1. .I VDATE>VLAST S VLAST=VDATE,VLTYP=VTYP
  1. ;
  1. ;Save patient
  1. S ^TMP(NODE,$J,DFN)=VLAST_U_VLTYP
  1. ;Save findings
  1. M ^TMP(NODE,$J,DFN,"FIND")=FIND1
  1. ;
  1. Q
  1. ;
  1. ;Check each patient for findings
  1. ;-------------------------------
  1. FIND N BD,DFN,ED,LAB,LABN,PXRMITEM,PXRMNAM,OR,REM,SAVE,SEARCH
  1. ;
  1. ;Build array of reminders and terms to be re-mapped
  1. ;
  1. ;This requires that LAB(69.51) is created to include a list of IEN's
  1. ;
  1. S PXRMITEM=0
  1. F S PXRMITEM=$O(^LAB(69.51,"B",PXRMITEM)) Q:'PXRMITEM D
  1. .S PXRMNAM=$P($G(^PXD(811.9,PXRMITEM,0)),U)
  1. .I PXRMNAM'="VA-NATIONAL EPI RX EXTRACT" S REM(PXRMITEM)=PXRMNAM
  1. .;Get finding list for these reminders and medication list
  1. .D REM^PXRMXX1(PXRMITEM,.SEARCH,.LAB)
  1. .;Hep A,B,C lab tests
  1. .S LABN("HEP C VIRUS ANTIBODY POSITIVE")=""
  1. .S LABN("HEP C VIRUS ANTIBODY NEGATIVE")=""
  1. .S LABN("HAV Ab positive")=""
  1. .S LABN("HAV IgM Ab positive")=""
  1. .S LABN("HAV IgG positive")=""
  1. .S LABN("HBs Ab positive")=""
  1. .S LABN("HBs Ag positive")=""
  1. .S LABN("HBc Ab IgM positive")=""
  1. .S LABN("HBe Ag positive")=""
  1. .;NDB Transformations
  1. .I PXRMNAM="VA-HEP C RISK ASSESSMENT" D
  1. ..S REM(PXRMITEM,"VA-DECLINED HEP C RISK ASSESSMENT")=1
  1. ..S REM(PXRMITEM,"VA-NO RISK FACTORS FOR HEP C")=2
  1. ..S REM(PXRMITEM,"VA-PREVIOUSLY ASSESSED HEP C RISK")=3
  1. ..S REM(PXRMITEM,"VA-RISK FACTOR FOR HEPATITIS C")=4
  1. ..S REM(PXRMITEM,"VA-HEP C VIRUS ANTIBODY POSITIVE")=5
  1. ..S REM(PXRMITEM,"VA-HEP C VIRUS ANTIBODY NEGATIVE")=6
  1. ..S REM(PXRMITEM,"VA-HEPATITIS C INFECTION")=7
  1. ;
  1. ;Build pharmacy codes list
  1. F FTYPE="PSNDF(50.6,","PSDRUG(","PS(50.605," D
  1. .S FIEN=""
  1. .F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
  1. ..S OR(FIEN_";"_FTYPE)=""
  1. ;
  1. ;Search for pharmacy outpatients
  1. I $O(OR(""))]"" D EN^PSOORAPI(PXRMBDT,PXRMEDT,.OR,"F","PXRMPSO"_NODE)
  1. ;
  1. ;Search for pharmacy inpatients
  1. I $O(OR(""))]"" D EN^PSJORAPI(PXRMBDT,PXRMEDT,.OR,"","PXRMPSI"_NODE)
  1. ;
  1. ;Build Lab codes list
  1. S FTYPE="LAB(60,",FIEN="" K OR
  1. F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
  1. .S OR(FIEN)=""
  1. ;
  1. ;Search for lab patients
  1. I $O(OR(""))]"" D LAB^PXRMXX2(PXRMBDT,PXRMEDT,.OR,NODE)
  1. ;
  1. ;Build Health Factors list
  1. S FTYPE="AUTTHF(",FIEN="" K OR
  1. F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
  1. .S OR(FIEN)=""
  1. ;
  1. ;Search for HF patients
  1. I $O(OR(""))]"" D HF^PXRMXX2(PXRMBDT,PXRMEDT,.OR,NODE)
  1. ;
  1. ;Build Patient Education list
  1. S FTYPE="AUTTEDT(",FIEN="" K OR
  1. F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
  1. .S OR(FIEN)=""
  1. ;
  1. ;Search for PED patients
  1. I $O(OR(""))]"" D PED^PXRMXX2(PXRMBDT,PXRMEDT,.OR,NODE)
  1. ;
  1. ;Build Examination list
  1. S FTYPE="AUTTEXAM(",FIEN="" K OR
  1. F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
  1. .S OR(FIEN)=""
  1. ;
  1. ;Search for Exam patients
  1. I $O(OR(""))]"" D EXAM^PXRMXX2(PXRMBDT,PXRMEDT,.OR,NODE)
  1. ;
  1. ;Build POV codes list
  1. S FTYPE="ICD9(",FIEN="" K OR
  1. F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
  1. .S OR(FIEN)="",^TMP("PXRMPOV"_NODE,$J,FIEN)=""
  1. ;
  1. ;Search for POV patients
  1. I $O(OR(""))]"" D POV^PXRMXX2(PXRMBDT,PXRMEDT,"PXRMPOV"_NODE,NODE)
  1. ;
  1. S BD=PXRMBDT-.0001,ED=PXRMEDT+.2359,DFN=""
  1. F S DFN=$O(^TMP(NODE,$J,"TEMP",DFN)) Q:'DFN Q:TSTOP=1 D
  1. .;Check if stop task requested
  1. .I $$S^%ZTLOAD S TSTOP=1 Q
  1. .;Update total patient count for report
  1. .S PXRMCNT=PXRMCNT+1
  1. .N FIND1,FCNT
  1. .;Process reminders
  1. .S PXRMITEM=0,FCNT=0
  1. .F S PXRMITEM=$O(REM(PXRMITEM)) Q:'PXRMITEM D
  1. ..;Check reminder exists
  1. ..Q:'$D(^PXD(811.9,PXRMITEM,0))
  1. ..;Evaluate reminder to obtain list of findings
  1. ..N FIND
  1. ..D FIDATA^PXRM(DFN,PXRMITEM,.FIND)
  1. ..;Check if findings exist for the date range
  1. ..D FCHEK(PXRMITEM)
  1. .;Save in ^TMP
  1. .I FCNT D FSAVE K FIND1 S PXRMFCNT=PXRMFCNT+1
  1. ;
  1. ;Merge in patients from Outpatient Pharmacy
  1. D PSMERG^PXRMXX1("PXRMPSO",NODE,.SEARCH)
  1. ;Merge in patients from Inpatient Pharmacy
  1. D PSMERG^PXRMXX1("PXRMPSI",NODE,.SEARCH)
  1. ;
  1. Q
  1. ;
  1. ;Complex logic to handle lab/reminder mismatches
  1. ;-----------------------------------------------
  1. LTRAN S LTERM=$P($G(FIND(ENC,"TERM")),U) Q:LTERM=""
  1. ;Skip terms not used in cohort logic
  1. I $D(LAB(LTERM)) S LTRAN=1 Q
  1. ;If one of selected list send the latest out of cohort entries instead
  1. I $D(LABN(LTERM)) S LTRAN=1 Q:LDONE=1 D
  1. .N ENC,TERM,DATE
  1. .S ENC=0,LDONE=1
  1. .F S ENC=$O(FIND(ENC)) Q:'ENC D
  1. ..S TERM=$P($G(FIND(ENC,"TERM")),U) Q:TERM=""
  1. ..;Check if the term is in the out of cohort list
  1. ..I $D(LAB(TERM)) D
  1. ...;Check if lab test is within date range or prior
  1. ...S DATE=$G(FIND(ENC,"DATE")) Q:DATE="" Q:DATE>ED
  1. ...D SAV
  1. ;
  1. Q
  1. ;
  1. ;
  1. ;Entry point for API
  1. ;-------------------
  1. PATS(PXRMBDT,PXRMEDT,NODE) ;
  1. ;
  1. ; PXRMBDT - Start date in fileman format
  1. ; PXRMEDT - End date in fileman format
  1. ; NODE - Target name for ^TMP(NODE,$J)
  1. ;
  1. ;Task stopped
  1. N TSTOP S TSTOP=0
  1. ;
  1. ;
  1. ;Build temporary array of all wards
  1. ;N PXRMLCHL,PXRMLOCN D LCHL^PXRMXAP(1,.PXRMLCHL)
  1. ;
  1. ;Patients, patients with findings, finding and term counts
  1. N PXRMCNT,PXRMFCNT,PXRMFIEN,PXRMTIEN S PXRMCNT=0,PXRMFCNT=0
  1. ;
  1. ;Clear ^TMP
  1. K ^TMP(NODE,$J)
  1. ;Current inpatients
  1. ;D INP
  1. ;Inpatient admissions
  1. ;D ADM
  1. ;Outpatient visits
  1. ;D VISITS Q:TSTOP=1
  1. ;
  1. ;Check for findings in the selected patients
  1. D FIND Q:TSTOP=1
  1. ;
  1. ;Save report
  1. D REPORT^PXRMXX1(NODE)
  1. ;
  1. ;Remove list of all patients with encounters
  1. K ^TMP(NODE,$J,"TEMP")
  1. ;Remove pharmacy outpatient list
  1. K ^TMP("PXRMPSO"_NODE,$J)
  1. ;Remove pharmacy inpatient list
  1. K ^TMP("PXRMPSI"_NODE,$J)
  1. ;Remove icd9 list
  1. K ^TMP("PXRMPOV"_NODE,$J)
  1. Q
  1. ;
  1. ;Build list of inpatients admissions
  1. ;-----------------------------------
  1. ADM N HLOCIEN,IC,DFN,BD,ED
  1. ;Get admissions for each selected location
  1. F IC=1:1 Q:'$D(PXRMLCHL(IC)) D
  1. .S HLOCIEN=$P(PXRMLCHL(IC),U,2) Q:HLOCIEN=""
  1. .; Get admissions from patient movements and return DFN's in PATS
  1. .S BD=PXRMBDT-.0001
  1. .S ED=PXRMEDT+.2359
  1. .N PATS D ADM^PXRMXAP(HLOCIEN,.PATS,BD,ED)
  1. .;Build ^TMP for selected patients
  1. .S DFN=""
  1. .F S DFN=$O(PATS(DFN)) Q:DFN="" D TMP
  1. Q
  1. ;
  1. ;Build list of Current inpatients
  1. ;--------------------------------
  1. INP N HLOCIEN,IC,DFN
  1. ;Get Current inpatients for each location
  1. F IC=1:1 Q:'$D(PXRMLCHL(IC)) D
  1. .S HLOCIEN=$P(PXRMLCHL(IC),U,2) Q:HLOCIEN=""
  1. .;Get WARDIEN,WARDNAM and return DFN's in PATS
  1. .N PATS D WARD^PXRMXAP(HLOCIEN,.PATS)
  1. .;Build ^TMP for selected patients
  1. .S DFN=""
  1. .F S DFN=$O(PATS(DFN)) Q:DFN="" D TMP
  1. Q
  1. ;
  1. ;Scan visit file to build list of patients
  1. ;-----------------------------------------
  1. VISITS N BD,DFN,ED,HLOCIEN,IC,VIEN,VISIT
  1. ;
  1. S BD=PXRMBDT-.0001
  1. S ED=PXRMEDT+.2359
  1. ;Get Date ; DBIA #2028
  1. F S BD=$O(^AUPNVSIT("B",BD)) Q:BD>ED Q:BD="" Q:TSTOP=1 D
  1. .S VIEN=0
  1. .;Get individual visit
  1. .F S VIEN=$O(^AUPNVSIT("B",BD,VIEN)) Q:VIEN="" Q:TSTOP=1 D
  1. ..;Check if stop task requested
  1. ..I $$S^%ZTLOAD S TSTOP=1 Q
  1. ..;Screen Individual Visit
  1. ..S VISIT=$G(^AUPNVSIT(VIEN,0)) Q:VISIT=""
  1. ..;Patient IEN
  1. ..S DFN=$P(VISIT,U,5) Q:'DFN
  1. ..;Build patient list in ^TMP
  1. ..D TMP
  1. Q