RORX021A ;BPOIFO/CLR - HCV DAA CANDIDATES(QUERY & STORE) ;7/15/11 3:37pm
 ;;1.5;CLINICAL CASE REGISTRIES;**17,19,21,27,26,31,33,34,39**;Feb 17, 2006;Build 4
 ;
 ; This routine uses the following IAs:
 ;
 ; #10103 FMADD^XLFDT (supported)
 ; #10035 Direct read of the DOD field of the file #2 (supported)
 ; #10000 C^%DTC (supported)
 ; #10103 $$TRIM^XLFSTR (supported)
 ; #10103 $$UP^XLFSTR (supported)
 ;   
 ;******************************************************************************
 ;******************************************************************************
 ;                 --- ROUTINE MODIFICATION LOG ---
 ;        
 ;PKG/PATCH    DATE        DEVELOPER    MODIFICATION
 ;-----------  ----------  -----------  ----------------------------------------
 ;ROR*1.5*19   JUN  2012   K GUPTA      Support for ICD-10 Coding System
 ;ROR*1.5*21   SEP 2013    T KOPP       Added ICN as last report column if
 ;                                      additional identifier option selected
 ;ROR*1.5*27   FEB 2015    T KOPP       Remove requirement to skip patient in
 ;                                      report if they received Boceprevir or
 ;                                      Telaprevir, removed requirement that
 ;                                      only genotype 1 is included on the
 ;                                      report.
 ;ROR*1.5*26   MAR 2015    T KOPP       Added FIB-4 as report column if FIB-4
 ;                                      range option selected (STORE), calculate
 ;                                      FIB-4 score if parameter selected. 
 ;                                      Remove treatment status column. 
 ;ROR*1.5*31   MAY 2017    M FERRARESE  Adding PACT ,PCP,and AGE/DOB as additional
 ;                                      identifiers.
 ;ROR*1.5*33   APR 2018    F TRAXLER    Adding FUT_APPT as additional identifier.
 ;ROR*1.5*34   SEP 2018    F TRAXLER    Adding FUT_CLIN column.
 ;ROR*1.5*39   JUN 2021    F TRAXLER    Replace real SSN with zeroes.    
 ;******************************************************************************
 ;******************************************************************************
 Q
 ;
 ;***** LAB SEARCH CALLBACK
 ;
 ; .ROR8DST      Reference to the ROR8DST parameter.
 ;
 ; INVDT         IEN of the Lab test (inverted date)
 ;
 ; .RESULT       Reference to a local variable, which contains
 ;               the result (see the $$LTSEARCH^RORUTL10).
 ;
 ; Return Values:
 ;       <0  Error code (the search will be aborted)
 ;        0  Ok
 ;        1  Skip this result
 ;        2  Skip this and all remaining results
 ;
LTSCB(ROR8DST,INVDT,RESULT) ;
 N DATE,IEN,NAME,RC,TMP,VAL,CAT,SUB
 S IEN=+RESULT(2)           Q:IEN'>0 1   ; IEN of the Lab test
 S NAME=$P(RESULT(2),U,2)   Q:NAME="" 1  ; Name of the test
 S DATE=+$P(RESULT(1),U,1)  Q:DATE'>0 1  ; Date of the test
 S CAT=$P(RESULT(2),U,4)    Q:CAT="" 1   ; Category(lab group) of the test
 S VAL=$P(RESULT(1),U,3)    Q:VAL="" 1   ; Result of the test
 ;--- Skip if test is not in lab groups HepC GT, Quant, or Qual
 I CAT'="HepC GT",(CAT'="HepC Quant"),(CAT'="HepC Qual") Q 1
 ;=== Mark values as quantitative, qualitative or responded to treatment
 ;---  HCVQT=quant,HCVQL=qual,HCVOK=cured
 I CAT="HepC Quant"!(CAT="HepC Qual") D  Q:TMP 1
 . S TMP=0
 . S VAL=$$UP^XLFSTR(VAL)  ;convert to upper case
 . S VAL=$TR(VAL," ")  ;strip out all spaces
 . I VAL["POS" S SUB="HCVQL" Q
 . I $E(VAL,1,1)="P" S SUB="HCVQL" Q
 . I VAL["NEG" S SUB="HCVOK" Q
 . I VAL["NO" S SUB="HCVOK" Q
 . I $E(VAL,1,1)="N" S SUB="HCVOK" Q
 . I VAL["COMMENT"!(VAL["CANC")!(VAL["DNR")!(VAL["TNP") S TMP=1 Q
 . I +VAL=VAL,VAL<51 S TMP=1 Q  ;skip abnormally low values
 . I $$NUMERIC^RORUTL05($TR(VAL," >,GT")) S SUB="HCVQT" Q
 . I $$NUMERIC^RORUTL05($TR(VAL," <,LT")) S SUB="HCVOK" Q
 . S TMP=1
 S SUB=$S(CAT="HepC GT":"GT",1:SUB)
 ;--- Store the result
 S @ROR8DST@(SUB,DATE)=$P(RESULT(1),U,3)
 Q 0
 ;
 ;***** QUERIES THE REGISTRY
 ; REPORT        Parent IEN of report
 ; FLAGS         Flags for the $$SKIP^RORXU005
 ; .NSPT         Number of selected patients is returned here
 ; .RORLC        sub-file and LOINC codes to search for FIB4
 ;
 ; Return Values:
 ;       <0  Fatal error
 ;        0  Ok
 ;       >0  Number of non-fatal errors
 ;
QUERY(REPORT,FLAGS,NSPT,RORLC) ;
 N RORLDST       ; Descriptor for Lab search API
 N RORPTN        ; Number of patients in the registry
 N RORXDST       ; Descriptor for pharmacy search API
 N RORCDLIST     ; Flag to indicate whether a clinic or division list exists
 N RORCDSTDT     ; Start date for clinic/division utilization search
 N RORCDENDT     ; End date for clinic/division utilization search
 N RORXCDT       ; User selected cut off date for registry meds
 N RORTS         ; User selected treatment status categories
 N RORXEDT       ; RX end date
 N RORXSDT       ; RX start date
 N RORTH         ; Patient treatment status (EXP=experienced, NAIVE=naive)
 ;
 N CNT,ECNT,IEN,IENS,LTEDT,LTSDT,PATIEN,RC,RXEDT,SKIP,TMP,UTEDT,UTIL,UTSDT,VA,VADM,XREFNODE
 N RCC,FLAG,HCV,GT,ROR1,ROR2,ROR3
 S XREFNODE=$NA(^RORDATA(798,"AC",+RORREG))
 S (CNT,ECNT,NSPT,RC)=0,(UTEDT,UTSDT)=0
 ;=== Set up parameters
 ;--- Utilization date range
 D:$$PARAM^RORTSK01("PATIENTS","CAREONLY")
 . S UTSDT=$$PARAM^RORTSK01("DATE_RANGE_3","START")\1
 . S UTEDT=$$PARAM^RORTSK01("DATE_RANGE_3","END")\1
 ;--- Number of patients in the registry
 S RORPTN=$$REGSIZE^RORUTL02(+RORREG)  S:RORPTN<0 RORPTN=0
 ;--- Set up Treatment status parameters
 F TMP="NAIVE","EXP","EXP_DAYS" D
 . S RORTS(TMP)=$$PARAM^RORTSK01("TREATMENT_HISTORY",TMP)
 ;--- Lab parameters
 S RORLDST("RORCB")="$$LTSCB^RORX021A"
 ;--- Labs date range
 S LTSDT=""
 S LTEDT=DT
 ;--- Shift the Labs end date
 S LTEDT=$$FMADD^XLFDT(LTEDT,1)
 ;== Pharm parameters
 S RORXDST("GENERIC")=1  ;only meds with generic name
 S RORXDST("RORCB")="$$RXOCB^RORX021A"   ;call back routine
 ;--- RX cut off date (inverse)/shift cut off back one day
 N X1,X2,X S X2=-(+RORTS("EXP_DAYS")+1),X1=DT D C^%DTC S RORXCDT=99999999-X
 ;--- RX start and end dates
 S RORXSDT=2000101  ;start date 1/1/1900
 S RORXEDT=DT
 ;--- RX list of HepC registry drugs
 S RORXL=$$ALLOC^RORTMP()
 S RC=$$DRUGLIST^RORUTL16(RORXL,+RORREG)
 ;--- Shift the Labs end date
 S RORXEDT=$$FMADD^XLFDT(RORXEDT\1,1)
 ;--- Set up Clinic/Division list parameters date_range_3
 S RORCDLIST=$$CDPARMS^RORXU001(.RORTSK,.RORCDSTDT,.RORCDENDT,1)
 ;--- Set up ICD parameters
 S FLAG=$G(RORTSK("PARAMS","ICDFILT","A","FILTER"))
 ;=== Browse through the registry records
 S IEN=0
 F  S IEN=$O(@XREFNODE@(IEN))  Q:IEN'>0  D  Q:RC<0
 . S TMP=$S(RORPTN>0:CNT/RORPTN,1:"")
 . S RC=$$LOOP^RORTSK01(TMP)  Q:RC<0
 . S IENS=IEN_",",CNT=CNT+1
 . ;--- Get patient DFN
 . S PATIEN=$$PTIEN^RORUTL01(IEN)  Q:PATIEN'>0
 . I +$P($G(^DPT(PATIEN,.35)),U)>0 Q  ;patient has died
 . ;--- Check if the patient should be skipped based on standard filters
 . Q:$$SKIP^RORXU005(IEN,FLAGS,UTSDT,UTEDT)
 . ;--- Check if patient should be skipped because of ICD codes
 . S RCC=0
 . I FLAG'="ALL" D
 . . S RCC=$$ICD^RORXU010(PATIEN)
 . I (FLAG="INCLUDE")&(RCC=0) Q
 . I (FLAG="EXCLUDE")&(RCC=1) Q
 . ;
 . ;--- Check if patient should be skipped because of Clinic or Division 
 . I RORCDLIST,'$$CDUTIL^RORXU001(.RORTSK,PATIEN,RORCDSTDT,RORCDENDT) Q
 . ;=== Check labs and meds
 . S SKIP=1,UTIL=0
 . D  I RC<0  S ECNT=ECNT+1,RC=0  Q
 . . S RORLDST=$NA(^TMP("RORX021",$J,"PAT",PATIEN,"LR"))
 . . S RC=$$LTSEARCH^RORUTL10(PATIEN,+RORREG,.RORLDST,,LTSDT,LTEDT)
 . . Q:RC'>0
 . . ;=== Skip if patient no longer has HCV
 . . S ROR1=+$O(@RORLDST@("HCVOK","")),ROR2=+$O(@RORLDST@("HCVQL","")),ROR3=(+$O(@RORLDST@("HCVQT","")))
 . . I ROR1>0 D  Q:SKIP=1
 . . . ;--- Skip if date of most recent HCV test is normal
 . . . I (ROR1<ROR2),(ROR1<ROR3) S SKIP=1 Q
 . . . I (ROR1<ROR2),(ROR3=0) S SKIP=1 Q
 . . . I (ROR1<ROR3),(ROR2=0) S SKIP=1 Q
 . . . ;--- Skip if no qual or quant test
 . . . I ROR2+ROR3=0 S SKIP=1 Q
 . . . S SKIP=0
 . . ;--- Check if patient should be skipped because of user selected Treatment status
 . . S RORXDST=$NA(^TMP("RORX021",$J,"PAT",PATIEN,"RX"))
 . . S RC=$$RXSEARCH^RORUTL14(PATIEN,RORXL,.RORXDST,"EIOV",RORXSDT,RORXEDT)
 . . Q:RC<0  ;error occurred
 . . I $G(RORXDST("SKIP")) S SKIP=1 K RORXDST("SKIP") Q  ;skip if taking DAA meds
 . . I RC>0,'+RORTS("EXP") S SKIP=1 Q  ; skip naive patients 
 . . I RC=0,'+RORTS("NAIVE") S SKIP=1 Q  ;skip experienced patients
 . . I RC>0,$O(@RORXDST@(RORXCDT),-1) S SKIP=1 Q  ;skip if patient has meds after cutoff
 . . ;--- Include patient 
 . . S RORTH=$S(RC>0:"EXP",RC=0:"NAIVE",1:"")
 . . S SKIP=0
 . ;--- Check if patient should be skipped because no utilization in the corresponding date range
 . I 'SKIP D:$$PARAM^RORTSK01("PATIENTS","CAREONLY")
 . . K TMP  S TMP("ALL")=1
 . . S UTIL=+$$UTIL^RORXU003(UTSDT,UTEDT,PATIEN,.TMP)
 . . S:'UTIL SKIP=1
 . ;
 . ; Skip patient if FIB4 range has been selected and score does not match parameters
 . I 'SKIP,$G(RORDATA("IDLST")) D
 . . N OK
 . . S OK=$$CALCFIB^RORX019A(PATIEN,"",.RORDATA,IEN,.RORLC)
 . . I OK<0 S SKIP=1 Q
 . . I '$$INRANGE^RORX019(.RORDATA) S SKIP=1 Q  ;exclude patient from report if ANY score is out of range
 . . I '$$SKIP^RORX019(.RORDATA) S SKIP=1  ;exclude patient from report with null scores
 . ;--- Skip the patient if not all selection criteria have been met
 . I SKIP K ^TMP("RORX021",$J,"PAT",PATIEN)  Q
 . ;
 . ;--- Get and store the patient's data  last4^name^treatment status^ICN^FIB-4 score^PACT^PCP^AGE/DOB
 . D VADEM^RORUTL05(PATIEN,1) S VA("BID")="0000"
 . S TMP=$S($$PARAM^RORTSK01("PATIENTS","ICN"):$$ICN^RORUTL02(PATIEN),1:"")
 . S ^TMP("RORX021",$J,"PAT",PATIEN)=VA("BID")_U_VADM(1)_U_RORTH_U_TMP_U_$G(RORDATA("SCORE",4))
 . S AGETYPE=$$PARAM^RORTSK01("AGE_RANGE","TYPE") D
 . . S AGE=$S(AGETYPE="AGE":$P(VADM(4),U),AGETYPE="DOB":$$DATE^RORXU002($P(VADM(3),U)\1),1:"")
 . S TMP=$S($$PARAM^RORTSK01("PATIENTS","PACT"):$$PACT^RORUTL02(PATIEN),1:"")
 . S ^TMP("RORX021",$J,"PAT",PATIEN)=^TMP("RORX021",$J,"PAT",PATIEN)_U_TMP
 . S TMP=$S($$PARAM^RORTSK01("PATIENTS","PCP"):$$PCP^RORUTL02(PATIEN),1:"")
 . S ^TMP("RORX021",$J,"PAT",PATIEN)=^TMP("RORX021",$J,"PAT",PATIEN)_U_TMP_U_AGE
 . S TMP=$S($$PARAM^RORTSK01("OPTIONS","FUT_APPT"):$$FUTAPPT^RORUTL02(PATIEN,$$PARAM^RORTSK01("OPTIONS","FUT_APPT")),1:"")
 . S ^TMP("RORX021",$J,"PAT",PATIEN)=^TMP("RORX021",$J,"PAT",PATIEN)_U_$P(TMP,U)_U_$P(TMP,U,2)
 . S NSPT=NSPT+1   ;increment count of selected patients
 ;
 D FREE^RORTMP(RORXL)  ;clean up drug list
 Q $S(RC<0:RC,1:ECNT)
 ;
 ;***** CALLBACK FUNCTION FOR THE PHARMACY SEARCH API
 ;
 ;
 ;                .ROR8DST      Reference to the ROR8DST parameter.
 ;
 ;
 ;                 ORDER         Order number (from condensed list)
 ;
 ;                 FLAGS         Flags describing the order to be
 ;                               processed.
 ;
 ;                 DRUG          Dispensed drug
 ;                                 ^01: Drug IEN in file #50
 ;                                 ^02: Drug name
 ;
 ;                 DATE          Order date (issue date for outpatient
 ;                               drugs or start date for inpatient)
 ;
 ;Return Values:
 ;       <0  Error code (the search will be aborted)
 ;        0  Ok
 ;        1  Skip this result
 ;        2  Skip this and all remaining results
 ;
RXOCB(ROR8DST,ORDER,ORDFLG,DRUG,DATE) ;
 N DRUGIEN,DRUGNAME,IEN,IRP,OFD,RPSUB,RXBUF,RXCNT,RXNUM,TMP
 ;--- Skip med if med does not have a generic name
 I ROR8DST("GENERIC")  D
 . S DRUGIEN=+ROR8DST("RORXGEN"),DRUGNAME=$P(ROR8DST("RORXGEN"),U,2)
 E  Q 1
 Q:(DRUGIEN'>0)!(DRUGNAME="") 1
 ;--- Process the order
 S TMP=$G(^TMP("PS",$J,"RXN",0))
 S RXNUM=$P(TMP,U)  S:RXNUM="" RXNUM=" "
 S RXCNT=0
 ;--- Original prescription
 I ORDFLG["I"  D  ;--- Inpatient
 . S OFD=$P($G(^TMP("PS",$J,0)),U,5)         ; Start Date
 . S RXCNT=RXCNT+1
 . S @ROR8DST@((99999999-OFD),DRUGNAME,DRUGIEN,RXNUM,RXCNT)=""
 E  D             ;--- Outpatient
 . S OFD=+$P($G(^TMP("PS",$J,"RXN",0)),U,6)  ; Original Fill Date
 . Q:(OFD<ROR8DST("RORSDT"))!(OFD'<ROR8DST("ROREDT"))
 . S RXCNT=RXCNT+1
 . S @ROR8DST@((99999999-OFD),DRUGNAME,DRUGIEN,RXNUM,RXCNT)=""
 ;--- Refills and partials
 F RPSUB="REF","PAR"  D
 . S $P(RXBUF,U)=$E(RPSUB,1)
 . S IRP=0
 . F  S IRP=$O(^TMP("PS",$J,RPSUB,IRP))  Q:IRP'>0  D
 . . S TMP=$G(^TMP("PS",$J,RPSUB,IRP,0))
 . . I TMP>0  S RXCNT=RXCNT+1,TMP=99999999-TMP  D
 . . . S @ROR8DST@(+TMP,DRUGNAME,DRUGIEN,RXNUM,RXCNT)=""
 Q 0
 ;***** STORES THE REPORT DATA
 ;
 ; REPORT        IEN of the REPORT element
 ; NSPT          Number of selected patients
 ;
 ; Return Values:
 ;       <0  Error code
 ;        0  Ok
 ;       >0  Number of non-fatal errors
 ;
STORE(REPORT,NSPT) ;
 N RORFDT        ;med fill date
 N RORLBG        ;lab test type (GT, HCVQT,HCVQL)
 N RORLVAL       ;lab value
 N RORRX         ;med name
 N RORSTNAM      ;
 N RORLDST
 N RORXDST
 N RORICN
 N RORFIB4
 N RORPACT
 N RORPCP
 N RORBODY,PTAG  ;parent iens
 N CNT,DATE,DFN,ECNT,IEN,LAST4,LTLST,NAME,NODE,PTCNT,PTLST,PTNAME,RC,RXLST,TMP,VAL,THIST,AGE,AGETYPE
 N GT,HCVQT,HCV,HCVQL,RORAPPT,RORCLIN
 S (ECNT,RC)=0,(LTLST,PTLST,RXLST)=-1
 ;--- Create 'patients' table
 S RORBODY=$$ADDVAL^RORTSK11(RORTSK,"PATIENTS",,REPORT)
 D ADDATTR^RORTSK11(RORTSK,RORBODY,"TABLE","PATIENTS")
 S (CNT,DFN,PTCNT)=0
 F  S DFN=$O(^TMP("RORX021",$J,"PAT",DFN))  Q:DFN'>0  D  Q:RC<0
 . S TMP=$S(NSPT>0:CNT/NSPT,1:"")
 . S RC=$$LOOP^RORTSK01(TMP)  Q:RC<0
 . S CNT=CNT+1,NODE=$NA(^TMP("RORX021",$J,"PAT",DFN))
 . ;--- Patient's data
 . S TMP=$G(@NODE)
 . S LAST4=$P(TMP,U),PTNAME=$P(TMP,U,2),THIST=$P(TMP,U,3),RORICN=$P(TMP,U,4),RORFIB4=$P(TMP,U,5)
 . S RORPACT=$P(TMP,U,6),RORPCP=$P(TMP,U,7),AGE=$P(TMP,U,8),RORAPPT=$P(TMP,U,9),RORCLIN=$P(TMP,U,10)
 . ;--- get lab results
 . S RORLDST=$NA(^TMP("RORX021",$J,"PAT",DFN,"LR"))
 . S RORXDST=$NA(^TMP("RORX021",$J,"PAT",DFN,"RX"))
 . ;--- Gets most recent result for HepC Qual, HepC Quant and GT
 . ;    HCVQT=date of most recent quanitative test^result
 . ;    HCVQL=date of most recent qualitative test^result
 . ;    GT=date of most recent GT test^result
 . K HCVQT,HCVQL,GT
 . F RORLBG="HCVQT","HCVQL","GT" D
 . . S NODE=RORLBG,@NODE="^"
 . . S RORFDT=$O(@RORLDST@(RORLBG,""))
 . . Q:RORFDT=""
 . . S RORLVAL=$G(@RORLDST@(RORLBG,RORFDT))
 . . S RORFDT=9999999-RORFDT
 . . S RORFDT=RORFDT\1  ;strip time  
 . . S @NODE=(RORFDT)_U_RORLVAL
 . ;--- get most recent registry med if experienced
 . ;--- if more than one med give preference to INTERFERON
 . S RORFDT=$O(@RORXDST@("")),RORRX=""
 . I THIST="EXP" D
 . . S RORSTNAM="",RORRX=""
 . . F  S RORSTNAM=$O(@RORXDST@(RORFDT,RORSTNAM)) Q:RORSTNAM=""  D
 . . . S RORRX=$S(RORRX="":RORSTNAM,RORRX["INTERFERON":RORRX,1:RORSTNAM)
 . . S RORFDT=99999999-RORFDT
 . . S RORFDT=RORFDT\1
 . S PTAG=$$ADDVAL^RORTSK11(RORTSK,"PATIENT",,RORBODY,,DFN)
 . ;--- give preference to quant result over qual result
 . S HCV=$S(+$G(HCVQL)>+$G(HCVQT):HCVQL,$G(HCVQT):HCVQT,1:"")
 . ;--- store
 . D ADDVAL^RORTSK11(RORTSK,"NAME",PTNAME,PTAG,1)
 . D ADDVAL^RORTSK11(RORTSK,"LAST4",LAST4,PTAG,2)
 . S AGETYPE=$$PARAM^RORTSK01("AGE_RANGE","TYPE") I AGETYPE'="ALL" D
 . . D ADDVAL^RORTSK11(RORTSK,AGETYPE,AGE,PTAG,1)
 . ; I $G(RORDATA("LIST"))'["4" D ADDVAL^RORTSK11(RORTSK,"STATUS",THIST,PTAG,1)
 . D ADDVAL^RORTSK11(RORTSK,"HCV_DATE",$P(HCV,U),PTAG,1)
 . D ADDVAL^RORTSK11(RORTSK,"HCV",$P(HCV,U,2),PTAG,3)
 . D ADDVAL^RORTSK11(RORTSK,"GT",$P(GT,U,2),PTAG,1)
 . D ADDVAL^RORTSK11(RORTSK,"FILL_DATE",RORFDT,PTAG,1)
 . D ADDVAL^RORTSK11(RORTSK,"FILL_MED",RORRX,PTAG,1)
 . I $G(RORDATA("IDLST"))'="" D
 . . S:RORDATA("IDLST")["4" TMP=$$ADDVAL^RORTSK11(RORTSK,"FIB4",RORFIB4,PTAG,3)
 . I $$PARAM^RORTSK01("PATIENTS","ICN") D ADDVAL^RORTSK11(RORTSK,"ICN",RORICN,PTAG,1)
 . I $$PARAM^RORTSK01("PATIENTS","PACT") D ADDVAL^RORTSK11(RORTSK,"PACT",RORPACT,PTAG,1)
 . I $$PARAM^RORTSK01("PATIENTS","PCP") D ADDVAL^RORTSK11(RORTSK,"PCP",RORPCP,PTAG,1)
 . I $$PARAM^RORTSK01("OPTIONS","FUT_APPT") D
 . . D ADDVAL^RORTSK11(RORTSK,"FUT_APPT",RORAPPT,PTAG,1)
 . . D ADDVAL^RORTSK11(RORTSK,"FUT_CLIN",RORCLIN,PTAG,1)
 . S PTCNT=PTCNT+1
 ;--- Inactivate the patient list tag if the list is empty
 D:PTCNT'>0 UPDVAL^RORTSK11(RORTSK,PTLST,,,1)
 ;---
 Q ECNT
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HRORX021A   16508     printed  Sep 23, 2025@19:20:56                                                                                                                                                                                                   Page 2
RORX021A  ;BPOIFO/CLR - HCV DAA CANDIDATES(QUERY & STORE) ;7/15/11 3:37pm
 +1       ;;1.5;CLINICAL CASE REGISTRIES;**17,19,21,27,26,31,33,34,39**;Feb 17, 2006;Build 4
 +2       ;
 +3       ; This routine uses the following IAs:
 +4       ;
 +5       ; #10103 FMADD^XLFDT (supported)
 +6       ; #10035 Direct read of the DOD field of the file #2 (supported)
 +7       ; #10000 C^%DTC (supported)
 +8       ; #10103 $$TRIM^XLFSTR (supported)
 +9       ; #10103 $$UP^XLFSTR (supported)
 +10      ;   
 +11      ;******************************************************************************
 +12      ;******************************************************************************
 +13      ;                 --- ROUTINE MODIFICATION LOG ---
 +14      ;        
 +15      ;PKG/PATCH    DATE        DEVELOPER    MODIFICATION
 +16      ;-----------  ----------  -----------  ----------------------------------------
 +17      ;ROR*1.5*19   JUN  2012   K GUPTA      Support for ICD-10 Coding System
 +18      ;ROR*1.5*21   SEP 2013    T KOPP       Added ICN as last report column if
 +19      ;                                      additional identifier option selected
 +20      ;ROR*1.5*27   FEB 2015    T KOPP       Remove requirement to skip patient in
 +21      ;                                      report if they received Boceprevir or
 +22      ;                                      Telaprevir, removed requirement that
 +23      ;                                      only genotype 1 is included on the
 +24      ;                                      report.
 +25      ;ROR*1.5*26   MAR 2015    T KOPP       Added FIB-4 as report column if FIB-4
 +26      ;                                      range option selected (STORE), calculate
 +27      ;                                      FIB-4 score if parameter selected. 
 +28      ;                                      Remove treatment status column. 
 +29      ;ROR*1.5*31   MAY 2017    M FERRARESE  Adding PACT ,PCP,and AGE/DOB as additional
 +30      ;                                      identifiers.
 +31      ;ROR*1.5*33   APR 2018    F TRAXLER    Adding FUT_APPT as additional identifier.
 +32      ;ROR*1.5*34   SEP 2018    F TRAXLER    Adding FUT_CLIN column.
 +33      ;ROR*1.5*39   JUN 2021    F TRAXLER    Replace real SSN with zeroes.    
 +34      ;******************************************************************************
 +35      ;******************************************************************************
 +36       QUIT 
 +37      ;
 +38      ;***** LAB SEARCH CALLBACK
 +39      ;
 +40      ; .ROR8DST      Reference to the ROR8DST parameter.
 +41      ;
 +42      ; INVDT         IEN of the Lab test (inverted date)
 +43      ;
 +44      ; .RESULT       Reference to a local variable, which contains
 +45      ;               the result (see the $$LTSEARCH^RORUTL10).
 +46      ;
 +47      ; Return Values:
 +48      ;       <0  Error code (the search will be aborted)
 +49      ;        0  Ok
 +50      ;        1  Skip this result
 +51      ;        2  Skip this and all remaining results
 +52      ;
LTSCB(ROR8DST,INVDT,RESULT) ;
 +1        NEW DATE,IEN,NAME,RC,TMP,VAL,CAT,SUB
 +2       ; IEN of the Lab test
           SET IEN=+RESULT(2)
           if IEN'>0
               QUIT 1
 +3       ; Name of the test
           SET NAME=$PIECE(RESULT(2),U,2)
           if NAME=""
               QUIT 1
 +4       ; Date of the test
           SET DATE=+$PIECE(RESULT(1),U,1)
           if DATE'>0
               QUIT 1
 +5       ; Category(lab group) of the test
           SET CAT=$PIECE(RESULT(2),U,4)
           if CAT=""
               QUIT 1
 +6       ; Result of the test
           SET VAL=$PIECE(RESULT(1),U,3)
           if VAL=""
               QUIT 1
 +7       ;--- Skip if test is not in lab groups HepC GT, Quant, or Qual
 +8        IF CAT'="HepC GT"
               IF (CAT'="HepC Quant")
                   IF (CAT'="HepC Qual")
                       QUIT 1
 +9       ;=== Mark values as quantitative, qualitative or responded to treatment
 +10      ;---  HCVQT=quant,HCVQL=qual,HCVOK=cured
 +11       IF CAT="HepC Quant"!(CAT="HepC Qual")
               Begin DoDot:1
 +12               SET TMP=0
 +13      ;convert to upper case
                   SET VAL=$$UP^XLFSTR(VAL)
 +14      ;strip out all spaces
                   SET VAL=$TRANSLATE(VAL," ")
 +15               IF VAL["POS"
                       SET SUB="HCVQL"
                       QUIT 
 +16               IF $EXTRACT(VAL,1,1)="P"
                       SET SUB="HCVQL"
                       QUIT 
 +17               IF VAL["NEG"
                       SET SUB="HCVOK"
                       QUIT 
 +18               IF VAL["NO"
                       SET SUB="HCVOK"
                       QUIT 
 +19               IF $EXTRACT(VAL,1,1)="N"
                       SET SUB="HCVOK"
                       QUIT 
 +20               IF VAL["COMMENT"!(VAL["CANC")!(VAL["DNR")!(VAL["TNP")
                       SET TMP=1
                       QUIT 
 +21      ;skip abnormally low values
                   IF +VAL=VAL
                       IF VAL<51
                           SET TMP=1
                           QUIT 
 +22               IF $$NUMERIC^RORUTL05($TRANSLATE(VAL," >,GT"))
                       SET SUB="HCVQT"
                       QUIT 
 +23               IF $$NUMERIC^RORUTL05($TRANSLATE(VAL," <,LT"))
                       SET SUB="HCVOK"
                       QUIT 
 +24               SET TMP=1
               End DoDot:1
               if TMP
                   QUIT 1
 +25       SET SUB=$SELECT(CAT="HepC GT":"GT",1:SUB)
 +26      ;--- Store the result
 +27       SET @ROR8DST@(SUB,DATE)=$PIECE(RESULT(1),U,3)
 +28       QUIT 0
 +29      ;
 +30      ;***** QUERIES THE REGISTRY
 +31      ; REPORT        Parent IEN of report
 +32      ; FLAGS         Flags for the $$SKIP^RORXU005
 +33      ; .NSPT         Number of selected patients is returned here
 +34      ; .RORLC        sub-file and LOINC codes to search for FIB4
 +35      ;
 +36      ; Return Values:
 +37      ;       <0  Fatal error
 +38      ;        0  Ok
 +39      ;       >0  Number of non-fatal errors
 +40      ;
QUERY(REPORT,FLAGS,NSPT,RORLC) ;
 +1       ; Descriptor for Lab search API
           NEW RORLDST
 +2       ; Number of patients in the registry
           NEW RORPTN
 +3       ; Descriptor for pharmacy search API
           NEW RORXDST
 +4       ; Flag to indicate whether a clinic or division list exists
           NEW RORCDLIST
 +5       ; Start date for clinic/division utilization search
           NEW RORCDSTDT
 +6       ; End date for clinic/division utilization search
           NEW RORCDENDT
 +7       ; User selected cut off date for registry meds
           NEW RORXCDT
 +8       ; User selected treatment status categories
           NEW RORTS
 +9       ; RX end date
           NEW RORXEDT
 +10      ; RX start date
           NEW RORXSDT
 +11      ; Patient treatment status (EXP=experienced, NAIVE=naive)
           NEW RORTH
 +12      ;
 +13       NEW CNT,ECNT,IEN,IENS,LTEDT,LTSDT,PATIEN,RC,RXEDT,SKIP,TMP,UTEDT,UTIL,UTSDT,VA,VADM,XREFNODE
 +14       NEW RCC,FLAG,HCV,GT,ROR1,ROR2,ROR3
 +15       SET XREFNODE=$NAME(^RORDATA(798,"AC",+RORREG))
 +16       SET (CNT,ECNT,NSPT,RC)=0
           SET (UTEDT,UTSDT)=0
 +17      ;=== Set up parameters
 +18      ;--- Utilization date range
 +19       if $$PARAM^RORTSK01("PATIENTS","CAREONLY")
               Begin DoDot:1
 +20               SET UTSDT=$$PARAM^RORTSK01("DATE_RANGE_3","START")\1
 +21               SET UTEDT=$$PARAM^RORTSK01("DATE_RANGE_3","END")\1
               End DoDot:1
 +22      ;--- Number of patients in the registry
 +23       SET RORPTN=$$REGSIZE^RORUTL02(+RORREG)
           if RORPTN<0
               SET RORPTN=0
 +24      ;--- Set up Treatment status parameters
 +25       FOR TMP="NAIVE","EXP","EXP_DAYS"
               Begin DoDot:1
 +26               SET RORTS(TMP)=$$PARAM^RORTSK01("TREATMENT_HISTORY",TMP)
               End DoDot:1
 +27      ;--- Lab parameters
 +28       SET RORLDST("RORCB")="$$LTSCB^RORX021A"
 +29      ;--- Labs date range
 +30       SET LTSDT=""
 +31       SET LTEDT=DT
 +32      ;--- Shift the Labs end date
 +33       SET LTEDT=$$FMADD^XLFDT(LTEDT,1)
 +34      ;== Pharm parameters
 +35      ;only meds with generic name
           SET RORXDST("GENERIC")=1
 +36      ;call back routine
           SET RORXDST("RORCB")="$$RXOCB^RORX021A"
 +37      ;--- RX cut off date (inverse)/shift cut off back one day
 +38       NEW X1,X2,X
           SET X2=-(+RORTS("EXP_DAYS")+1)
           SET X1=DT
           DO C^%DTC
           SET RORXCDT=99999999-X
 +39      ;--- RX start and end dates
 +40      ;start date 1/1/1900
           SET RORXSDT=2000101
 +41       SET RORXEDT=DT
 +42      ;--- RX list of HepC registry drugs
 +43       SET RORXL=$$ALLOC^RORTMP()
 +44       SET RC=$$DRUGLIST^RORUTL16(RORXL,+RORREG)
 +45      ;--- Shift the Labs end date
 +46       SET RORXEDT=$$FMADD^XLFDT(RORXEDT\1,1)
 +47      ;--- Set up Clinic/Division list parameters date_range_3
 +48       SET RORCDLIST=$$CDPARMS^RORXU001(.RORTSK,.RORCDSTDT,.RORCDENDT,1)
 +49      ;--- Set up ICD parameters
 +50       SET FLAG=$GET(RORTSK("PARAMS","ICDFILT","A","FILTER"))
 +51      ;=== Browse through the registry records
 +52       SET IEN=0
 +53       FOR 
               SET IEN=$ORDER(@XREFNODE@(IEN))
               if IEN'>0
                   QUIT 
               Begin DoDot:1
 +54               SET TMP=$SELECT(RORPTN>0:CNT/RORPTN,1:"")
 +55               SET RC=$$LOOP^RORTSK01(TMP)
                   if RC<0
                       QUIT 
 +56               SET IENS=IEN_","
                   SET CNT=CNT+1
 +57      ;--- Get patient DFN
 +58               SET PATIEN=$$PTIEN^RORUTL01(IEN)
                   if PATIEN'>0
                       QUIT 
 +59      ;patient has died
                   IF +$PIECE($GET(^DPT(PATIEN,.35)),U)>0
                       QUIT 
 +60      ;--- Check if the patient should be skipped based on standard filters
 +61               if $$SKIP^RORXU005(IEN,FLAGS,UTSDT,UTEDT)
                       QUIT 
 +62      ;--- Check if patient should be skipped because of ICD codes
 +63               SET RCC=0
 +64               IF FLAG'="ALL"
                       Begin DoDot:2
 +65                       SET RCC=$$ICD^RORXU010(PATIEN)
                       End DoDot:2
 +66               IF (FLAG="INCLUDE")&(RCC=0)
                       QUIT 
 +67               IF (FLAG="EXCLUDE")&(RCC=1)
                       QUIT 
 +68      ;
 +69      ;--- Check if patient should be skipped because of Clinic or Division 
 +70               IF RORCDLIST
                       IF '$$CDUTIL^RORXU001(.RORTSK,PATIEN,RORCDSTDT,RORCDENDT)
                           QUIT 
 +71      ;=== Check labs and meds
 +72               SET SKIP=1
                   SET UTIL=0
 +73               Begin DoDot:2
 +74                   SET RORLDST=$NAME(^TMP("RORX021",$JOB,"PAT",PATIEN,"LR"))
 +75                   SET RC=$$LTSEARCH^RORUTL10(PATIEN,+RORREG,.RORLDST,,LTSDT,LTEDT)
 +76                   if RC'>0
                           QUIT 
 +77      ;=== Skip if patient no longer has HCV
 +78                   SET ROR1=+$ORDER(@RORLDST@("HCVOK",""))
                       SET ROR2=+$ORDER(@RORLDST@("HCVQL",""))
                       SET ROR3=(+$ORDER(@RORLDST@("HCVQT","")))
 +79                   IF ROR1>0
                           Begin DoDot:3
 +80      ;--- Skip if date of most recent HCV test is normal
 +81                           IF (ROR1<ROR2)
                                   IF (ROR1<ROR3)
                                       SET SKIP=1
                                       QUIT 
 +82                           IF (ROR1<ROR2)
                                   IF (ROR3=0)
                                       SET SKIP=1
                                       QUIT 
 +83                           IF (ROR1<ROR3)
                                   IF (ROR2=0)
                                       SET SKIP=1
                                       QUIT 
 +84      ;--- Skip if no qual or quant test
 +85                           IF ROR2+ROR3=0
                                   SET SKIP=1
                                   QUIT 
 +86                           SET SKIP=0
                           End DoDot:3
                           if SKIP=1
                               QUIT 
 +87      ;--- Check if patient should be skipped because of user selected Treatment status
 +88                   SET RORXDST=$NAME(^TMP("RORX021",$JOB,"PAT",PATIEN,"RX"))
 +89                   SET RC=$$RXSEARCH^RORUTL14(PATIEN,RORXL,.RORXDST,"EIOV",RORXSDT,RORXEDT)
 +90      ;error occurred
                       if RC<0
                           QUIT 
 +91      ;skip if taking DAA meds
                       IF $GET(RORXDST("SKIP"))
                           SET SKIP=1
                           KILL RORXDST("SKIP")
                           QUIT 
 +92      ; skip naive patients 
                       IF RC>0
                           IF '+RORTS("EXP")
                               SET SKIP=1
                               QUIT 
 +93      ;skip experienced patients
                       IF RC=0
                           IF '+RORTS("NAIVE")
                               SET SKIP=1
                               QUIT 
 +94      ;skip if patient has meds after cutoff
                       IF RC>0
                           IF $ORDER(@RORXDST@(RORXCDT),-1)
                               SET SKIP=1
                               QUIT 
 +95      ;--- Include patient 
 +96                   SET RORTH=$SELECT(RC>0:"EXP",RC=0:"NAIVE",1:"")
 +97                   SET SKIP=0
                   End DoDot:2
                   IF RC<0
                       SET ECNT=ECNT+1
                       SET RC=0
                       QUIT 
 +98      ;--- Check if patient should be skipped because no utilization in the corresponding date range
 +99               IF 'SKIP
                       if $$PARAM^RORTSK01("PATIENTS","CAREONLY")
                           Begin DoDot:2
 +100                          KILL TMP
                               SET TMP("ALL")=1
 +101                          SET UTIL=+$$UTIL^RORXU003(UTSDT,UTEDT,PATIEN,.TMP)
 +102                          if 'UTIL
                                   SET SKIP=1
                           End DoDot:2
 +103     ;
 +104     ; Skip patient if FIB4 range has been selected and score does not match parameters
 +105              IF 'SKIP
                       IF $GET(RORDATA("IDLST"))
                           Begin DoDot:2
 +106                          NEW OK
 +107                          SET OK=$$CALCFIB^RORX019A(PATIEN,"",.RORDATA,IEN,.RORLC)
 +108                          IF OK<0
                                   SET SKIP=1
                                   QUIT 
 +109     ;exclude patient from report if ANY score is out of range
                               IF '$$INRANGE^RORX019(.RORDATA)
                                   SET SKIP=1
                                   QUIT 
 +110     ;exclude patient from report with null scores
                               IF '$$SKIP^RORX019(.RORDATA)
                                   SET SKIP=1
                           End DoDot:2
 +111     ;--- Skip the patient if not all selection criteria have been met
 +112              IF SKIP
                       KILL ^TMP("RORX021",$JOB,"PAT",PATIEN)
                       QUIT 
 +113     ;
 +114     ;--- Get and store the patient's data  last4^name^treatment status^ICN^FIB-4 score^PACT^PCP^AGE/DOB
 +115              DO VADEM^RORUTL05(PATIEN,1)
                   SET VA("BID")="0000"
 +116              SET TMP=$SELECT($$PARAM^RORTSK01("PATIENTS","ICN"):$$ICN^RORUTL02(PATIEN),1:"")
 +117              SET ^TMP("RORX021",$JOB,"PAT",PATIEN)=VA("BID")_U_VADM(1)_U_RORTH_U_TMP_U_$GET(RORDATA("SCORE",4))
 +118              SET AGETYPE=$$PARAM^RORTSK01("AGE_RANGE","TYPE")
                   Begin DoDot:2
 +119                  SET AGE=$SELECT(AGETYPE="AGE":$PIECE(VADM(4),U),AGETYPE="DOB":$$DATE^RORXU002($PIECE(VADM(3),U)\1),1:"")
                   End DoDot:2
 +120              SET TMP=$SELECT($$PARAM^RORTSK01("PATIENTS","PACT"):$$PACT^RORUTL02(PATIEN),1:"")
 +121              SET ^TMP("RORX021",$JOB,"PAT",PATIEN)=^TMP("RORX021",$JOB,"PAT",PATIEN)_U_TMP
 +122              SET TMP=$SELECT($$PARAM^RORTSK01("PATIENTS","PCP"):$$PCP^RORUTL02(PATIEN),1:"")
 +123              SET ^TMP("RORX021",$JOB,"PAT",PATIEN)=^TMP("RORX021",$JOB,"PAT",PATIEN)_U_TMP_U_AGE
 +124              SET TMP=$SELECT($$PARAM^RORTSK01("OPTIONS","FUT_APPT"):$$FUTAPPT^RORUTL02(PATIEN,$$PARAM^RORTSK01("OPTIONS","FUT_APPT")),1:"")
 +125              SET ^TMP("RORX021",$JOB,"PAT",PATIEN)=^TMP("RORX021",$JOB,"PAT",PATIEN)_U_$PIECE(TMP,U)_U_$PIECE(TMP,U,2)
 +126     ;increment count of selected patients
                   SET NSPT=NSPT+1
               End DoDot:1
               if RC<0
                   QUIT 
 +127     ;
 +128     ;clean up drug list
           DO FREE^RORTMP(RORXL)
 +129      QUIT $SELECT(RC<0:RC,1:ECNT)
 +130     ;
 +131     ;***** CALLBACK FUNCTION FOR THE PHARMACY SEARCH API
 +132     ;
 +133     ;
 +134     ;                .ROR8DST      Reference to the ROR8DST parameter.
 +135     ;
 +136     ;
 +137     ;                 ORDER         Order number (from condensed list)
 +138     ;
 +139     ;                 FLAGS         Flags describing the order to be
 +140     ;                               processed.
 +141     ;
 +142     ;                 DRUG          Dispensed drug
 +143     ;                                 ^01: Drug IEN in file #50
 +144     ;                                 ^02: Drug name
 +145     ;
 +146     ;                 DATE          Order date (issue date for outpatient
 +147     ;                               drugs or start date for inpatient)
 +148     ;
 +149     ;Return Values:
 +150     ;       <0  Error code (the search will be aborted)
 +151     ;        0  Ok
 +152     ;        1  Skip this result
 +153     ;        2  Skip this and all remaining results
 +154     ;
RXOCB(ROR8DST,ORDER,ORDFLG,DRUG,DATE) ;
 +1        NEW DRUGIEN,DRUGNAME,IEN,IRP,OFD,RPSUB,RXBUF,RXCNT,RXNUM,TMP
 +2       ;--- Skip med if med does not have a generic name
 +3        IF ROR8DST("GENERIC")
               Begin DoDot:1
 +4                SET DRUGIEN=+ROR8DST("RORXGEN")
                   SET DRUGNAME=$PIECE(ROR8DST("RORXGEN"),U,2)
               End DoDot:1
 +5       IF '$TEST
               QUIT 1
 +6        if (DRUGIEN'>0)!(DRUGNAME="")
               QUIT 1
 +7       ;--- Process the order
 +8        SET TMP=$GET(^TMP("PS",$JOB,"RXN",0))
 +9        SET RXNUM=$PIECE(TMP,U)
           if RXNUM=""
               SET RXNUM=" "
 +10       SET RXCNT=0
 +11      ;--- Original prescription
 +12      ;--- Inpatient
           IF ORDFLG["I"
               Begin DoDot:1
 +13      ; Start Date
                   SET OFD=$PIECE($GET(^TMP("PS",$JOB,0)),U,5)
 +14               SET RXCNT=RXCNT+1
 +15               SET @ROR8DST@((99999999-OFD),DRUGNAME,DRUGIEN,RXNUM,RXCNT)=""
               End DoDot:1
 +16      ;--- Outpatient
          IF '$TEST
               Begin DoDot:1
 +17      ; Original Fill Date
                   SET OFD=+$PIECE($GET(^TMP("PS",$JOB,"RXN",0)),U,6)
 +18               if (OFD<ROR8DST("RORSDT"))!(OFD'<ROR8DST("ROREDT"))
                       QUIT 
 +19               SET RXCNT=RXCNT+1
 +20               SET @ROR8DST@((99999999-OFD),DRUGNAME,DRUGIEN,RXNUM,RXCNT)=""
               End DoDot:1
 +21      ;--- Refills and partials
 +22       FOR RPSUB="REF","PAR"
               Begin DoDot:1
 +23               SET $PIECE(RXBUF,U)=$EXTRACT(RPSUB,1)
 +24               SET IRP=0
 +25               FOR 
                       SET IRP=$ORDER(^TMP("PS",$JOB,RPSUB,IRP))
                       if IRP'>0
                           QUIT 
                       Begin DoDot:2
 +26                       SET TMP=$GET(^TMP("PS",$JOB,RPSUB,IRP,0))
 +27                       IF TMP>0
                               SET RXCNT=RXCNT+1
                               SET TMP=99999999-TMP
                               Begin DoDot:3
 +28                               SET @ROR8DST@(+TMP,DRUGNAME,DRUGIEN,RXNUM,RXCNT)=""
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +29       QUIT 0
 +30      ;***** STORES THE REPORT DATA
 +31      ;
 +32      ; REPORT        IEN of the REPORT element
 +33      ; NSPT          Number of selected patients
 +34      ;
 +35      ; Return Values:
 +36      ;       <0  Error code
 +37      ;        0  Ok
 +38      ;       >0  Number of non-fatal errors
 +39      ;
STORE(REPORT,NSPT) ;
 +1       ;med fill date
           NEW RORFDT
 +2       ;lab test type (GT, HCVQT,HCVQL)
           NEW RORLBG
 +3       ;lab value
           NEW RORLVAL
 +4       ;med name
           NEW RORRX
 +5       ;
           NEW RORSTNAM
 +6        NEW RORLDST
 +7        NEW RORXDST
 +8        NEW RORICN
 +9        NEW RORFIB4
 +10       NEW RORPACT
 +11       NEW RORPCP
 +12      ;parent iens
           NEW RORBODY,PTAG
 +13       NEW CNT,DATE,DFN,ECNT,IEN,LAST4,LTLST,NAME,NODE,PTCNT,PTLST,PTNAME,RC,RXLST,TMP,VAL,THIST,AGE,AGETYPE
 +14       NEW GT,HCVQT,HCV,HCVQL,RORAPPT,RORCLIN
 +15       SET (ECNT,RC)=0
           SET (LTLST,PTLST,RXLST)=-1
 +16      ;--- Create 'patients' table
 +17       SET RORBODY=$$ADDVAL^RORTSK11(RORTSK,"PATIENTS",,REPORT)
 +18       DO ADDATTR^RORTSK11(RORTSK,RORBODY,"TABLE","PATIENTS")
 +19       SET (CNT,DFN,PTCNT)=0
 +20       FOR 
               SET DFN=$ORDER(^TMP("RORX021",$JOB,"PAT",DFN))
               if DFN'>0
                   QUIT 
               Begin DoDot:1
 +21               SET TMP=$SELECT(NSPT>0:CNT/NSPT,1:"")
 +22               SET RC=$$LOOP^RORTSK01(TMP)
                   if RC<0
                       QUIT 
 +23               SET CNT=CNT+1
                   SET NODE=$NAME(^TMP("RORX021",$JOB,"PAT",DFN))
 +24      ;--- Patient's data
 +25               SET TMP=$GET(@NODE)
 +26               SET LAST4=$PIECE(TMP,U)
                   SET PTNAME=$PIECE(TMP,U,2)
                   SET THIST=$PIECE(TMP,U,3)
                   SET RORICN=$PIECE(TMP,U,4)
                   SET RORFIB4=$PIECE(TMP,U,5)
 +27               SET RORPACT=$PIECE(TMP,U,6)
                   SET RORPCP=$PIECE(TMP,U,7)
                   SET AGE=$PIECE(TMP,U,8)
                   SET RORAPPT=$PIECE(TMP,U,9)
                   SET RORCLIN=$PIECE(TMP,U,10)
 +28      ;--- get lab results
 +29               SET RORLDST=$NAME(^TMP("RORX021",$JOB,"PAT",DFN,"LR"))
 +30               SET RORXDST=$NAME(^TMP("RORX021",$JOB,"PAT",DFN,"RX"))
 +31      ;--- Gets most recent result for HepC Qual, HepC Quant and GT
 +32      ;    HCVQT=date of most recent quanitative test^result
 +33      ;    HCVQL=date of most recent qualitative test^result
 +34      ;    GT=date of most recent GT test^result
 +35               KILL HCVQT,HCVQL,GT
 +36               FOR RORLBG="HCVQT","HCVQL","GT"
                       Begin DoDot:2
 +37                       SET NODE=RORLBG
                           SET @NODE="^"
 +38                       SET RORFDT=$ORDER(@RORLDST@(RORLBG,""))
 +39                       if RORFDT=""
                               QUIT 
 +40                       SET RORLVAL=$GET(@RORLDST@(RORLBG,RORFDT))
 +41                       SET RORFDT=9999999-RORFDT
 +42      ;strip time  
                           SET RORFDT=RORFDT\1
 +43                       SET @NODE=(RORFDT)_U_RORLVAL
                       End DoDot:2
 +44      ;--- get most recent registry med if experienced
 +45      ;--- if more than one med give preference to INTERFERON
 +46               SET RORFDT=$ORDER(@RORXDST@(""))
                   SET RORRX=""
 +47               IF THIST="EXP"
                       Begin DoDot:2
 +48                       SET RORSTNAM=""
                           SET RORRX=""
 +49                       FOR 
                               SET RORSTNAM=$ORDER(@RORXDST@(RORFDT,RORSTNAM))
                               if RORSTNAM=""
                                   QUIT 
                               Begin DoDot:3
 +50                               SET RORRX=$SELECT(RORRX="":RORSTNAM,RORRX["INTERFERON":RORRX,1:RORSTNAM)
                               End DoDot:3
 +51                       SET RORFDT=99999999-RORFDT
 +52                       SET RORFDT=RORFDT\1
                       End DoDot:2
 +53               SET PTAG=$$ADDVAL^RORTSK11(RORTSK,"PATIENT",,RORBODY,,DFN)
 +54      ;--- give preference to quant result over qual result
 +55               SET HCV=$SELECT(+$GET(HCVQL)>+$GET(HCVQT):HCVQL,$GET(HCVQT):HCVQT,1:"")
 +56      ;--- store
 +57               DO ADDVAL^RORTSK11(RORTSK,"NAME",PTNAME,PTAG,1)
 +58               DO ADDVAL^RORTSK11(RORTSK,"LAST4",LAST4,PTAG,2)
 +59               SET AGETYPE=$$PARAM^RORTSK01("AGE_RANGE","TYPE")
                   IF AGETYPE'="ALL"
                       Begin DoDot:2
 +60                       DO ADDVAL^RORTSK11(RORTSK,AGETYPE,AGE,PTAG,1)
                       End DoDot:2
 +61      ; I $G(RORDATA("LIST"))'["4" D ADDVAL^RORTSK11(RORTSK,"STATUS",THIST,PTAG,1)
 +62               DO ADDVAL^RORTSK11(RORTSK,"HCV_DATE",$PIECE(HCV,U),PTAG,1)
 +63               DO ADDVAL^RORTSK11(RORTSK,"HCV",$PIECE(HCV,U,2),PTAG,3)
 +64               DO ADDVAL^RORTSK11(RORTSK,"GT",$PIECE(GT,U,2),PTAG,1)
 +65               DO ADDVAL^RORTSK11(RORTSK,"FILL_DATE",RORFDT,PTAG,1)
 +66               DO ADDVAL^RORTSK11(RORTSK,"FILL_MED",RORRX,PTAG,1)
 +67               IF $GET(RORDATA("IDLST"))'=""
                       Begin DoDot:2
 +68                       if RORDATA("IDLST")["4"
                               SET TMP=$$ADDVAL^RORTSK11(RORTSK,"FIB4",RORFIB4,PTAG,3)
                       End DoDot:2
 +69               IF $$PARAM^RORTSK01("PATIENTS","ICN")
                       DO ADDVAL^RORTSK11(RORTSK,"ICN",RORICN,PTAG,1)
 +70               IF $$PARAM^RORTSK01("PATIENTS","PACT")
                       DO ADDVAL^RORTSK11(RORTSK,"PACT",RORPACT,PTAG,1)
 +71               IF $$PARAM^RORTSK01("PATIENTS","PCP")
                       DO ADDVAL^RORTSK11(RORTSK,"PCP",RORPCP,PTAG,1)
 +72               IF $$PARAM^RORTSK01("OPTIONS","FUT_APPT")
                       Begin DoDot:2
 +73                       DO ADDVAL^RORTSK11(RORTSK,"FUT_APPT",RORAPPT,PTAG,1)
 +74                       DO ADDVAL^RORTSK11(RORTSK,"FUT_CLIN",RORCLIN,PTAG,1)
                       End DoDot:2
 +75               SET PTCNT=PTCNT+1
               End DoDot:1
               if RC<0
                   QUIT 
 +76      ;--- Inactivate the patient list tag if the list is empty
 +77       if PTCNT'>0
               DO UPDVAL^RORTSK11(RORTSK,PTLST,,,1)
 +78      ;---
 +79       QUIT ECNT