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

RORUPD04.m

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