RORUPD04 ;HCIOFO/SG - PROCESSING OF THE LAB DATA ;12/8/05 8:20am
 ;;1.5;CLINICAL CASE REGISTRIES;**14,37,38**;Feb 17, 2006;Build 2
 ;
 Q
 ;
 ;******************************************************************************
 ;******************************************************************************
 ;                       --- ROUTINE MODIFICATION LOG ---
 ;        
 ;PKG/PATCH    DATE        DEVELOPER    MODIFICATION
 ;-----------  ----------  -----------  ----------------------------------------
 ;ROR*1.5*14   APR  2011   A SAUNDERS   LAB: added call to new tag HCV to look
 ;                                      for HCV results.
 ;ROR*1.5*37   NOV 2020    F TRAXLER    Adding UNDET check in CHKIND subroutine
 ;ROR*1.5*38   APR 2021    F TRAXLER    Fix bug introduced by ROR*1.5*37 change.
 ;******************************************************************************
 ;******************************************************************************
 ;***** CHECKS AN INDICATOR CONDITION
 ;
 ; LSI           Indicator (internal value)
 ; VAL           Indicated value
 ; .RESULT(      Result value
 ;   "RH")       Reference high
 ;   "RL")       Reference low
 ;
 ; Return Values:
 ;        0  False
 ;       >0  True
 ;
CHKIND(LSI,VAL,RESULT) ;
 S RESULT=$$UP^XLFSTR(RESULT)
 ;--- Reference Range. (Note: See subfile #798.92, field #1(INDICATOR) for LSI values 0-6.
 I LSI=1  D  Q LSI
 . I $G(RESULT("RL"))'=""  Q:RESULT<RESULT("RL")
 . I $G(RESULT("RH"))'=""  Q:RESULT>RESULT("RH")
 . S LSI=0
 ;--- Positive Result
 I LSI=6  S VAL=0  D  Q VAL
 . I RESULT["UNDET" Q
 . I (RESULT="P")!(RESULT="R")  S VAL=1  Q
 . I RESULT'["POS",RESULT'["REA",RESULT'["DETEC" Q
 . I RESULT'["NEG",RESULT'["NO",RESULT'["IND" S VAL=1
 ;--- Compare to the value
 Q:VAL="" 0
 I LSI=3  Q (RESULT>VAL)  ;greater than
 I LSI=4  Q (RESULT<VAL)  ;less than
 S VAL=$$UP^XLFSTR(VAL)
 I LSI=2  Q (RESULT[VAL)  ;contains
 I LSI=5  Q (RESULT=VAL)  ;equal to
 Q 0
 ;
 ;***** PROCESSING OF THE 'LAB DATA' FILE
 ;
 ; UPDSTART      Date of the earliest update (DO NOT pass by
 ;               reference)
 ; PATIEN        Patient IEN
 ;
 ; Return values:
 ;       <0  Error code
 ;        0  Continue processing of the current patient
 ;        1  Stop processing
 ;
LAB(UPDSTART,PATIEN) ;
 N RORFILE       ; File number
 ;
 N DM,DSEND,LABIENS,RC,RORLAB,TMP
 S RORFILE=63,DSEND=RORUPD("DSEND")
 K RORVALS("LS")
 ;--- If the start date is more than 60 days in the past, results
 ;    should be loaded using collection dates. Otherwise, dates of
 ;--- the results are used).
 S DM=$S($$FMDIFF^XLFDT(DT,UPDSTART)>60:"^CD",1:"^RAD")
 ;--- Check the event references if the events are enabled
 I $G(RORUPD("FLAGS"))["E"  D  Q:RC'>0 RC
 . S RC=$$GET^RORUPP02(PATIEN,1,.UPDSTART,.DSEND)
 . ;--- If dates have been modified according to the event references,
 . ;--- they are the collection dates/times.
 . S:RC>1 UPDSTART=UPDSTART\1,DSEND=$$FMADD^XLFDT(DSEND\1,1),DM="^CD"
 ;---
 S TMP=$$LABREF^RORUTL18(PATIEN)  Q:TMP'>0 TMP
 S LABIENS=TMP_",",RC=0
 ;
 S RORLAB=$$ALLOC^RORTMP()  D  D FREE^RORTMP(RORLAB)
 . ;--- Load the Lab results
 . I $G(RORLRC)="" S RORLRC="CH,MI"
 . S RC=$$LABRSLTS^RORUTL02(PATIEN,UPDSTART_DM,DSEND_DM,RORLAB)
 . I RC<0  D INCEC^RORUPDUT(.RC)  Q
 . ;--- Process the results
 . Q:$$RESULTS(PATIEN,RORLAB)<0
 . ;--- Load necessary data elements
 . I $D(RORUPD("SR",RORFILE,"F"))>1  D  I TMP<0  D INCEC^RORUPDUT()  Q
 . . S TMP=$$LOAD(LABIENS)
 . ;--- Apply "before" rules
 . S RC=$$APLRULES^RORUPDUT(RORFILE,LABIENS,"B")
 . I RC  D INCEC^RORUPDUT(.RC)  Q
 . ;--- Apply "after" rules
 . S RC=$$APLRULES^RORUPDUT(RORFILE,LABIENS,"A")
 . I RC  D INCEC^RORUPDUT(.RC)  Q
 . ;check if patient has positive HCV LOINC test result
 . D HCV(PATIEN,RORLAB)
 ;
 D CLRDES^RORUPDUT(RORFILE)
 Q RC
 ;
 ;***** LOAD DATA ELEMENTS
 ;
 ; IENS          IENS of the current record
 ;
 ; Return values:
 ;       <0  Error code
 ;        0  Ok
 ;
LOAD(IENS) ;
 N RC  S RC=0
 ;--- API #1
 I $D(RORUPD("SR",RORFILE,"F",1))  D  Q:RC<0 RC
 . S RC=$$LOADFLDS^RORUPDUT(RORFILE,IENS)
 ;--- API #2
 Q 0
 ;
 ;***** EXTRACTS PROPER RESULT CODE FROM THE OBSERVATION ID
 ;
 ; OID           Observation ID in HL7 format
 ; CS            HL7 component separator
 ;
 ; Return values:
 ;           Lab result code (see the LA7SC parameter of
 ;           the GCPR^LA7QRY entry point)
 ;             ^1: Result code
 ;             ^2: Coding system ("LN" or "NLT")
 ;           Or an empty string if coding system is unknown or there
 ;           are no active search indicators exist for this code.
 ;
RESCODE(OID,CS) ;
 N CODE,I,RESCODE,TYPE
 S RESCODE=""
 F I=1,4  D  Q:RESCODE'=""
 . S CODE=$P(OID,CS,I),TYPE=$P(OID,CS,I+2)             Q:CODE=""
 . S TYPE=$S(TYPE="LN":"LN",TYPE="99VA64":"NLT",1:"")  Q:TYPE=""
 . ;--- Check if the search indicators exist for this code
 . S RESCODE=CODE_U_TYPE
 . S:$D(@RORUPDPI@("LS",RESCODE))<10 RESCODE=""
 Q RESCODE
 ;
 ;***** LOADS AND PROCESSES RESULTS OF THE TESTS
 ;
 ; PATIEN        Patient IEN
 ; ROR8LAB       Closed root of the HL7 message created by GCPR^LA7QRY
 ;
 ; Return values:
 ;       <0  Error code
 ;        0  Ok
 ;
RESULTS(PATIEN,ROR8LAB) ;
 N CS,DATE,FS,I,ISEG,LOCATION,LSIEN,LSNODE,RC,RESCODE,RESVAL,RORHL,SEG,SEGTYPE,TMP
 S ISEG="",RC=0
 F  S ISEG=$O(@ROR8LAB@(ISEG))  Q:ISEG=""  D  Q:RC<0
 . S SEG=$G(@ROR8LAB@(ISEG))
 . ;--- Extract separators from the MSH segment
 . I $E(SEG,1,3)="MSH"  D  Q
 . . S (RORHL("FS"),FS)=$E(SEG,4),TMP=$P(SEG,FS,2)
 . . S CS=$E(TMP,1)
 . ;--- Skip all segments except OBX
 . S SEGTYPE=$P(SEG,FS)
 . Q:SEGTYPE'="OBX"
 . ;--- Get lab result code
 . S RESCODE=$$RESCODE($P(SEG,FS,4),CS)  Q:RESCODE=""
 . ;--- Load the full segment
 . D LOADSEG^RORHL7A(.SEG,$NA(@ROR8LAB@(ISEG)))
 . ;--- Get the result data
 . S RESVAL=$G(SEG(5)),TMP=$G(SEG(7))
 . S RESVAL("RL")=$P(TMP,"-",1) ; Reference Low
 . S RESVAL("RH")=$P(TMP,"-",2) ; Reference High
 . S DATE=$$HL7TFM^XLFDT($G(SEG(14)),"L")\1
 . ;--- Analyze the result
 . K LOCATION
 . S LSNODE=$NA(@RORUPDPI@("LS",RESCODE))
 . S LSIEN=""
 . F  S LSIEN=$O(@LSNODE@(LSIEN))  Q:LSIEN=""  D  Q:RC<0
 . . S I="",RC=0
 . . F  S I=$O(@LSNODE@(LSIEN,I))  Q:I=""  D  Q:RC
 . . . S TMP=$G(@LSNODE@(LSIEN,I))
 . . . S RC=$$CHKIND(+TMP,$P(TMP,U,2),.RESVAL)
 . . Q:RC'>0
 . . S TMP=+$G(RORVALS("LS",LSIEN))
 . . I TMP  Q:(DATE'>0)!(DATE'<TMP)
 . . S:'$D(LOCATION) LOCATION=$$IEN^XUAF4($P($G(SEG(15)),CS))
 . . S RORVALS("LS",LSIEN)=DATE_U_LOCATION
 ;---
 Q $S(RC<0:RC,1:0)
 ;
 ;***** IMPLEMENTATION OF THE SELECTION RULE
 ;
 ; LSIEN         Lab Search IEN
 ;
 ; Return values:
 ;        0  Skip the patient
 ;        1  Add the patient
 ;
RULE(LSIEN) ;
 Q:'$D(RORVALS("LS",LSIEN)) 0
 N DATE,LOC,SRDT
 S DATE=+$G(RORVALS("LS",LSIEN))
 D:DATE>0
 . S LOC=$P($G(RORVALS("LS",LSIEN)),U,2)
 . S SRDT=$$GETVAL^RORUPDUT("ROR SRDT")
 . I (DATE<SRDT)!(SRDT'>0)  D  Q
 . . S RORVALS("SV","ROR SRDT")=DATE
 . . S RORVALS("SV","ROR SRLOC")=LOC
 . I DATE=SRDT  D:$$GETVAL^RORUPDUT("ROR SRLOC")=""  Q
 . . S RORVALS("SV","ROR SRLOC")=LOC
 Q 1
 ;
 ;***** ADD PATIENT TO ARRAY IF THEY HAVE A POSITIVE HCV TEST RESULT
 ;Patients will be automatically confirmed into the registry during the
 ;nightly job in ADD^RORUPD50 if they have a positive HCV test result
 ;Note: all other registry 'update' criteria must be met as well
 ;
 ;Input
 ;  DFN      Patient DFN
 ;  RORLAB   Array with patient's lab test results.  In HL7 format,
 ;           returned from GCPR^LA7QRY
 ;
 ;Output
 ;  ^TMP("ROR HCV CONFIRM",$J,DFN)=""  patient is added to this array if they
 ;  have positive HCV test result.  Array is used in ADD^RORUPD50.
 ;
HCV(DFN,RORLAB) ;
 N RORI,RORSEG,RORTYPE,RORVAL,HLFS,HLCS,RORLOINC,RORDONE
 S HLFS="|",HLCS="^" ;HL7 field and component separator in the Lab data array
 ;loop through lab output and see if the test result value is for an HCV LOINC
 ;Array is used in ADD^RORUPD50
 S RORI=0,RORDONE=0
 F  S RORI=$O(@RORLAB@(RORI)) Q:'RORI  Q:RORDONE  D
 . S RORSEG=$G(@RORLAB@(RORI)) ;entire HL7 segment data
 . S SEGTYPE=$P(RORSEG,HLFS,1) ;segment type (PID,OBR,OBX,etc.)
 . Q:SEGTYPE'="OBX"  ;we only want OBX segments
 . S RORLOINC=$P($P($G(RORSEG),HLFS,4),HLCS,1)
 . I $G(RORLOINC)'="",'$D(^TMP("ROR HCV LIST",$J,RORLOINC)) Q  ;quit if not HCV LOINC
 . S RORVAL=$P(RORSEG,HLFS,6) ; HCV test result value
 . I $L($G(RORVAL))>0 S RORVAL=$TR(RORVAL,"""","") ;get rid of any double quotes
 . I $E($G(RORVAL),1,1)=">" D  ;if positive test result
 .. S ^TMP("ROR HCV CONFIRM",$J,DFN)="" ;add patient to HCV auto-confirm list
 .. S RORDONE=1 ;end of HCV processing for this patient
 ;
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HRORUPD04   8805     printed  Sep 23, 2025@19:19:39                                                                                                                                                                                                    Page 2
RORUPD04  ;HCIOFO/SG - PROCESSING OF THE LAB DATA ;12/8/05 8:20am
 +1       ;;1.5;CLINICAL CASE REGISTRIES;**14,37,38**;Feb 17, 2006;Build 2
 +2       ;
 +3        QUIT 
 +4       ;
 +5       ;******************************************************************************
 +6       ;******************************************************************************
 +7       ;                       --- ROUTINE MODIFICATION LOG ---
 +8       ;        
 +9       ;PKG/PATCH    DATE        DEVELOPER    MODIFICATION
 +10      ;-----------  ----------  -----------  ----------------------------------------
 +11      ;ROR*1.5*14   APR  2011   A SAUNDERS   LAB: added call to new tag HCV to look
 +12      ;                                      for HCV results.
 +13      ;ROR*1.5*37   NOV 2020    F TRAXLER    Adding UNDET check in CHKIND subroutine
 +14      ;ROR*1.5*38   APR 2021    F TRAXLER    Fix bug introduced by ROR*1.5*37 change.
 +15      ;******************************************************************************
 +16      ;******************************************************************************
 +17      ;***** CHECKS AN INDICATOR CONDITION
 +18      ;
 +19      ; LSI           Indicator (internal value)
 +20      ; VAL           Indicated value
 +21      ; .RESULT(      Result value
 +22      ;   "RH")       Reference high
 +23      ;   "RL")       Reference low
 +24      ;
 +25      ; Return Values:
 +26      ;        0  False
 +27      ;       >0  True
 +28      ;
CHKIND(LSI,VAL,RESULT) ;
 +1        SET RESULT=$$UP^XLFSTR(RESULT)
 +2       ;--- Reference Range. (Note: See subfile #798.92, field #1(INDICATOR) for LSI values 0-6.
 +3        IF LSI=1
               Begin DoDot:1
 +4                IF $GET(RESULT("RL"))'=""
                       if RESULT<RESULT("RL")
                           QUIT 
 +5                IF $GET(RESULT("RH"))'=""
                       if RESULT>RESULT("RH")
                           QUIT 
 +6                SET LSI=0
               End DoDot:1
               QUIT LSI
 +7       ;--- Positive Result
 +8        IF LSI=6
               SET VAL=0
               Begin DoDot:1
 +9                IF RESULT["UNDET"
                       QUIT 
 +10               IF (RESULT="P")!(RESULT="R")
                       SET VAL=1
                       QUIT 
 +11               IF RESULT'["POS"
                       IF RESULT'["REA"
                           IF RESULT'["DETEC"
                               QUIT 
 +12               IF RESULT'["NEG"
                       IF RESULT'["NO"
                           IF RESULT'["IND"
                               SET VAL=1
               End DoDot:1
               QUIT VAL
 +13      ;--- Compare to the value
 +14       if VAL=""
               QUIT 0
 +15      ;greater than
           IF LSI=3
               QUIT (RESULT>VAL)
 +16      ;less than
           IF LSI=4
               QUIT (RESULT<VAL)
 +17       SET VAL=$$UP^XLFSTR(VAL)
 +18      ;contains
           IF LSI=2
               QUIT (RESULT[VAL)
 +19      ;equal to
           IF LSI=5
               QUIT (RESULT=VAL)
 +20       QUIT 0
 +21      ;
 +22      ;***** PROCESSING OF THE 'LAB DATA' FILE
 +23      ;
 +24      ; UPDSTART      Date of the earliest update (DO NOT pass by
 +25      ;               reference)
 +26      ; PATIEN        Patient IEN
 +27      ;
 +28      ; Return values:
 +29      ;       <0  Error code
 +30      ;        0  Continue processing of the current patient
 +31      ;        1  Stop processing
 +32      ;
LAB(UPDSTART,PATIEN) ;
 +1       ; File number
           NEW RORFILE
 +2       ;
 +3        NEW DM,DSEND,LABIENS,RC,RORLAB,TMP
 +4        SET RORFILE=63
           SET DSEND=RORUPD("DSEND")
 +5        KILL RORVALS("LS")
 +6       ;--- If the start date is more than 60 days in the past, results
 +7       ;    should be loaded using collection dates. Otherwise, dates of
 +8       ;--- the results are used).
 +9        SET DM=$SELECT($$FMDIFF^XLFDT(DT,UPDSTART)>60:"^CD",1:"^RAD")
 +10      ;--- Check the event references if the events are enabled
 +11       IF $GET(RORUPD("FLAGS"))["E"
               Begin DoDot:1
 +12               SET RC=$$GET^RORUPP02(PATIEN,1,.UPDSTART,.DSEND)
 +13      ;--- If dates have been modified according to the event references,
 +14      ;--- they are the collection dates/times.
 +15               if RC>1
                       SET UPDSTART=UPDSTART\1
                       SET DSEND=$$FMADD^XLFDT(DSEND\1,1)
                       SET DM="^CD"
               End DoDot:1
               if RC'>0
                   QUIT RC
 +16      ;---
 +17       SET TMP=$$LABREF^RORUTL18(PATIEN)
           if TMP'>0
               QUIT TMP
 +18       SET LABIENS=TMP_","
           SET RC=0
 +19      ;
 +20       SET RORLAB=$$ALLOC^RORTMP()
           Begin DoDot:1
 +21      ;--- Load the Lab results
 +22           IF $GET(RORLRC)=""
                   SET RORLRC="CH,MI"
 +23           SET RC=$$LABRSLTS^RORUTL02(PATIEN,UPDSTART_DM,DSEND_DM,RORLAB)
 +24           IF RC<0
                   DO INCEC^RORUPDUT(.RC)
                   QUIT 
 +25      ;--- Process the results
 +26           if $$RESULTS(PATIEN,RORLAB)<0
                   QUIT 
 +27      ;--- Load necessary data elements
 +28           IF $DATA(RORUPD("SR",RORFILE,"F"))>1
                   Begin DoDot:2
 +29                   SET TMP=$$LOAD(LABIENS)
                   End DoDot:2
                   IF TMP<0
                       DO INCEC^RORUPDUT()
                       QUIT 
 +30      ;--- Apply "before" rules
 +31           SET RC=$$APLRULES^RORUPDUT(RORFILE,LABIENS,"B")
 +32           IF RC
                   DO INCEC^RORUPDUT(.RC)
                   QUIT 
 +33      ;--- Apply "after" rules
 +34           SET RC=$$APLRULES^RORUPDUT(RORFILE,LABIENS,"A")
 +35           IF RC
                   DO INCEC^RORUPDUT(.RC)
                   QUIT 
 +36      ;check if patient has positive HCV LOINC test result
 +37           DO HCV(PATIEN,RORLAB)
           End DoDot:1
           DO FREE^RORTMP(RORLAB)
 +38      ;
 +39       DO CLRDES^RORUPDUT(RORFILE)
 +40       QUIT RC
 +41      ;
 +42      ;***** LOAD DATA ELEMENTS
 +43      ;
 +44      ; IENS          IENS of the current record
 +45      ;
 +46      ; Return values:
 +47      ;       <0  Error code
 +48      ;        0  Ok
 +49      ;
LOAD(IENS) ;
 +1        NEW RC
           SET RC=0
 +2       ;--- API #1
 +3        IF $DATA(RORUPD("SR",RORFILE,"F",1))
               Begin DoDot:1
 +4                SET RC=$$LOADFLDS^RORUPDUT(RORFILE,IENS)
               End DoDot:1
               if RC<0
                   QUIT RC
 +5       ;--- API #2
 +6        QUIT 0
 +7       ;
 +8       ;***** EXTRACTS PROPER RESULT CODE FROM THE OBSERVATION ID
 +9       ;
 +10      ; OID           Observation ID in HL7 format
 +11      ; CS            HL7 component separator
 +12      ;
 +13      ; Return values:
 +14      ;           Lab result code (see the LA7SC parameter of
 +15      ;           the GCPR^LA7QRY entry point)
 +16      ;             ^1: Result code
 +17      ;             ^2: Coding system ("LN" or "NLT")
 +18      ;           Or an empty string if coding system is unknown or there
 +19      ;           are no active search indicators exist for this code.
 +20      ;
RESCODE(OID,CS) ;
 +1        NEW CODE,I,RESCODE,TYPE
 +2        SET RESCODE=""
 +3        FOR I=1,4
               Begin DoDot:1
 +4                SET CODE=$PIECE(OID,CS,I)
                   SET TYPE=$PIECE(OID,CS,I+2)
                   if CODE=""
                       QUIT 
 +5                SET TYPE=$SELECT(TYPE="LN":"LN",TYPE="99VA64":"NLT",1:"")
                   if TYPE=""
                       QUIT 
 +6       ;--- Check if the search indicators exist for this code
 +7                SET RESCODE=CODE_U_TYPE
 +8                if $DATA(@RORUPDPI@("LS",RESCODE))<10
                       SET RESCODE=""
               End DoDot:1
               if RESCODE'=""
                   QUIT 
 +9        QUIT RESCODE
 +10      ;
 +11      ;***** LOADS AND PROCESSES RESULTS OF THE TESTS
 +12      ;
 +13      ; PATIEN        Patient IEN
 +14      ; ROR8LAB       Closed root of the HL7 message created by GCPR^LA7QRY
 +15      ;
 +16      ; Return values:
 +17      ;       <0  Error code
 +18      ;        0  Ok
 +19      ;
RESULTS(PATIEN,ROR8LAB) ;
 +1        NEW CS,DATE,FS,I,ISEG,LOCATION,LSIEN,LSNODE,RC,RESCODE,RESVAL,RORHL,SEG,SEGTYPE,TMP
 +2        SET ISEG=""
           SET RC=0
 +3        FOR 
               SET ISEG=$ORDER(@ROR8LAB@(ISEG))
               if ISEG=""
                   QUIT 
               Begin DoDot:1
 +4                SET SEG=$GET(@ROR8LAB@(ISEG))
 +5       ;--- Extract separators from the MSH segment
 +6                IF $EXTRACT(SEG,1,3)="MSH"
                       Begin DoDot:2
 +7                        SET (RORHL("FS"),FS)=$EXTRACT(SEG,4)
                           SET TMP=$PIECE(SEG,FS,2)
 +8                        SET CS=$EXTRACT(TMP,1)
                       End DoDot:2
                       QUIT 
 +9       ;--- Skip all segments except OBX
 +10               SET SEGTYPE=$PIECE(SEG,FS)
 +11               if SEGTYPE'="OBX"
                       QUIT 
 +12      ;--- Get lab result code
 +13               SET RESCODE=$$RESCODE($PIECE(SEG,FS,4),CS)
                   if RESCODE=""
                       QUIT 
 +14      ;--- Load the full segment
 +15               DO LOADSEG^RORHL7A(.SEG,$NAME(@ROR8LAB@(ISEG)))
 +16      ;--- Get the result data
 +17               SET RESVAL=$GET(SEG(5))
                   SET TMP=$GET(SEG(7))
 +18      ; Reference Low
                   SET RESVAL("RL")=$PIECE(TMP,"-",1)
 +19      ; Reference High
                   SET RESVAL("RH")=$PIECE(TMP,"-",2)
 +20               SET DATE=$$HL7TFM^XLFDT($GET(SEG(14)),"L")\1
 +21      ;--- Analyze the result
 +22               KILL LOCATION
 +23               SET LSNODE=$NAME(@RORUPDPI@("LS",RESCODE))
 +24               SET LSIEN=""
 +25               FOR 
                       SET LSIEN=$ORDER(@LSNODE@(LSIEN))
                       if LSIEN=""
                           QUIT 
                       Begin DoDot:2
 +26                       SET I=""
                           SET RC=0
 +27                       FOR 
                               SET I=$ORDER(@LSNODE@(LSIEN,I))
                               if I=""
                                   QUIT 
                               Begin DoDot:3
 +28                               SET TMP=$GET(@LSNODE@(LSIEN,I))
 +29                               SET RC=$$CHKIND(+TMP,$PIECE(TMP,U,2),.RESVAL)
                               End DoDot:3
                               if RC
                                   QUIT 
 +30                       if RC'>0
                               QUIT 
 +31                       SET TMP=+$GET(RORVALS("LS",LSIEN))
 +32                       IF TMP
                               if (DATE'>0)!(DATE'<TMP)
                                   QUIT 
 +33                       if '$DATA(LOCATION)
                               SET LOCATION=$$IEN^XUAF4($PIECE($GET(SEG(15)),CS))
 +34                       SET RORVALS("LS",LSIEN)=DATE_U_LOCATION
                       End DoDot:2
                       if RC<0
                           QUIT 
               End DoDot:1
               if RC<0
                   QUIT 
 +35      ;---
 +36       QUIT $SELECT(RC<0:RC,1:0)
 +37      ;
 +38      ;***** IMPLEMENTATION OF THE SELECTION RULE
 +39      ;
 +40      ; LSIEN         Lab Search IEN
 +41      ;
 +42      ; Return values:
 +43      ;        0  Skip the patient
 +44      ;        1  Add the patient
 +45      ;
RULE(LSIEN) ;
 +1        if '$DATA(RORVALS("LS",LSIEN))
               QUIT 0
 +2        NEW DATE,LOC,SRDT
 +3        SET DATE=+$GET(RORVALS("LS",LSIEN))
 +4        if DATE>0
               Begin DoDot:1
 +5                SET LOC=$PIECE($GET(RORVALS("LS",LSIEN)),U,2)
 +6                SET SRDT=$$GETVAL^RORUPDUT("ROR SRDT")
 +7                IF (DATE<SRDT)!(SRDT'>0)
                       Begin DoDot:2
 +8                        SET RORVALS("SV","ROR SRDT")=DATE
 +9                        SET RORVALS("SV","ROR SRLOC")=LOC
                       End DoDot:2
                       QUIT 
 +10               IF DATE=SRDT
                       if $$GETVAL^RORUPDUT("ROR SRLOC")=""
                           Begin DoDot:2
 +11                           SET RORVALS("SV","ROR SRLOC")=LOC
                           End DoDot:2
                       QUIT 
               End DoDot:1
 +12       QUIT 1
 +13      ;
 +14      ;***** ADD PATIENT TO ARRAY IF THEY HAVE A POSITIVE HCV TEST RESULT
 +15      ;Patients will be automatically confirmed into the registry during the
 +16      ;nightly job in ADD^RORUPD50 if they have a positive HCV test result
 +17      ;Note: all other registry 'update' criteria must be met as well
 +18      ;
 +19      ;Input
 +20      ;  DFN      Patient DFN
 +21      ;  RORLAB   Array with patient's lab test results.  In HL7 format,
 +22      ;           returned from GCPR^LA7QRY
 +23      ;
 +24      ;Output
 +25      ;  ^TMP("ROR HCV CONFIRM",$J,DFN)=""  patient is added to this array if they
 +26      ;  have positive HCV test result.  Array is used in ADD^RORUPD50.
 +27      ;
HCV(DFN,RORLAB) ;
 +1        NEW RORI,RORSEG,RORTYPE,RORVAL,HLFS,HLCS,RORLOINC,RORDONE
 +2       ;HL7 field and component separator in the Lab data array
           SET HLFS="|"
           SET HLCS="^"
 +3       ;loop through lab output and see if the test result value is for an HCV LOINC
 +4       ;Array is used in ADD^RORUPD50
 +5        SET RORI=0
           SET RORDONE=0
 +6        FOR 
               SET RORI=$ORDER(@RORLAB@(RORI))
               if 'RORI
                   QUIT 
               if RORDONE
                   QUIT 
               Begin DoDot:1
 +7       ;entire HL7 segment data
                   SET RORSEG=$GET(@RORLAB@(RORI))
 +8       ;segment type (PID,OBR,OBX,etc.)
                   SET SEGTYPE=$PIECE(RORSEG,HLFS,1)
 +9       ;we only want OBX segments
                   if SEGTYPE'="OBX"
                       QUIT 
 +10               SET RORLOINC=$PIECE($PIECE($GET(RORSEG),HLFS,4),HLCS,1)
 +11      ;quit if not HCV LOINC
                   IF $GET(RORLOINC)'=""
                       IF '$DATA(^TMP("ROR HCV LIST",$JOB,RORLOINC))
                           QUIT 
 +12      ; HCV test result value
                   SET RORVAL=$PIECE(RORSEG,HLFS,6)
 +13      ;get rid of any double quotes
                   IF $LENGTH($GET(RORVAL))>0
                       SET RORVAL=$TRANSLATE(RORVAL,"""","")
 +14      ;if positive test result
                   IF $EXTRACT($GET(RORVAL),1,1)=">"
                       Begin DoDot:2
 +15      ;add patient to HCV auto-confirm list
                           SET ^TMP("ROR HCV CONFIRM",$JOB,DFN)=""
 +16      ;end of HCV processing for this patient
                           SET RORDONE=1
                       End DoDot:2
               End DoDot:1
 +17      ;
 +18       QUIT