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

RORTSK13.m

Go to the documentation of this file.
  1. RORTSK13 ;HIOFO/SG,VAC - PARSER FOR REPORT PARAMETERS ;4/7/09 2:05pm
  1. ;;1.5;CLINICAL CASE REGISTRIES;**1,8,19**;Feb 17, 2006;Build 43
  1. ;
  1. ; Modified March 2009 to support ICD9FILT parameter passed in
  1. ;
  1. ; This routine uses the following IAs:
  1. ;
  1. ; #1995 $$CODEN^ICPTCOD (supported)
  1. ; #3990 $$CODEN^ICDCODE (supported)
  1. ; #5747 $$CODEABA^ICDEX (controlled)
  1. ; #4149 EN^MXMLPRSE (supported)
  1. ;
  1. ; RORXML -------------- DESCRIPTOR FOR THE XML PARSING
  1. ;
  1. ; RORXML(
  1. ;
  1. ; "ERR") Number of parsing errors
  1. ;
  1. ; "PATH") Path to the current XML tag
  1. ;
  1. ; "RXGRP") Name of the current drug group
  1. ;
  1. ; "TI") Number of the current text line of
  1. ; the current tag value
  1. ;
  1. ;******************************************************************************
  1. ;******************************************************************************
  1. ; --- ROUTINE MODIFICATION LOG ---
  1. ;
  1. ;PKG/PATCH DATE DEVELOPER MODIFICATION
  1. ;----------- ---------- ----------- ----------------------------------------
  1. ;ROR*1.5*19 FEB 2012 K GUPTA Support for ICD-10 Coding System
  1. ;******************************************************************************
  1. ;******************************************************************************
  1. ;
  1. Q
  1. ;
  1. ;***** START DOCUMENT CALLBACK FOR THE SAX PARSER
  1. DOCSTART ;
  1. S RORXML("PATH")="",RORXML("ERR")=0
  1. K RORXML("RXGRP")
  1. Q
  1. ;
  1. ;***** DUMMY CALLBACKS FOR THE SAX PARSER
  1. DUMMY(DUMMY1,DUMMY2,DUMMY3) ;
  1. DUMMY1 Q
  1. ;
  1. ;***** END ELEMENT CALLBACK FOR THE SAX PARSER
  1. ;
  1. ; ELMT Name of the element
  1. ;
  1. ELEND(ELMT) ;
  1. ;--- Reset the drug group name in the end of the group
  1. K:RORXML("PATH")="PARAMS,DRUGS,GROUP" RORXML("RXGRP")
  1. ;--- Reset the ICD group name in the end of the group
  1. K:RORXML("PATH")="PARAMS,ICDLST,GROUP" RORXML("ICDGRP")
  1. K:RORXML("PATH")="PARAMS,ICDFILT,GROUP" RORXML("ICDGRP")
  1. ;--- Update the current element path
  1. S RORXML("PATH")=$P(RORXML("PATH"),",",1,$L(RORXML("PATH"),",")-1)
  1. Q
  1. ;
  1. ;***** START DOCUMENT CALLBACK FOR THE SAX PARSER
  1. ;
  1. ; ELMT Name of the element
  1. ; .ATTR List of attributes and their values
  1. ;
  1. ELSTART(ELMT,ATTR) ;
  1. N GROUP,ID,IEN,ITEM,LIST,LVL,RC,SECTION,TMP,RORICDTYPE,RORCODSYS,RORPROCMODE,RORROOTFILE
  1. ;--- Update the current element path
  1. S RORXML("PATH")=RORXML("PATH")_$S(RORXML("PATH")'="":",",1:"")_ELMT
  1. S RORXML("TI")=1
  1. ;--- Ignore everything except parameters
  1. Q:$P(RORXML("PATH"),",")'="PARAMS"
  1. S LVL=$L(RORXML("PATH"),",")
  1. ;
  1. ;=== Store 3-level lists
  1. I LVL=5 D Q
  1. . S LIST=$P(RORXML("PATH"),",",LVL-3,LVL-1)
  1. . ;--- Medications and drug classes
  1. . I $P(LIST,",",1,2)="DRUGS,GROUP" D Q
  1. . . S GROUP=$G(RORXML("RXGRP")) Q:GROUP=""
  1. . . S SECTION=$P(LIST,",",3) Q:SECTION=""
  1. . . S ID=$G(ATTR("ID")) Q:ID=""
  1. . . S RORTSK("PARAMS","DRUGS","G",GROUP,SECTION,ID)=$G(ATTR("CODE"))
  1. ;
  1. ;=== Store 2-level lists
  1. I LVL=4 D Q
  1. . S LIST=$P(RORXML("PATH"),",",LVL-2,LVL-1)
  1. . ;--- ICD diagnosis or procedure codes
  1. . I LIST="ICDLST,GROUP" D Q
  1. . . S GROUP=$G(RORXML("ICDGRP")) Q:GROUP=""
  1. . . S ID=$G(ATTR("ID")) Q:ID=""
  1. . . S RORICDTYPE=$G(ATTR("VERSION"))
  1. . . S RORPROCMODE=$G(RORTSK("PARAMS","ICDLST","A","PROCMODE"))
  1. . . S RORCODSYS=$S(RORICDTYPE="ICD-10":$S(RORPROCMODE:"31",1:"30"),RORICDTYPE="ICD-9":$S(RORPROCMODE:"2",1:"1"),1:"")
  1. . . Q:RORCODSYS=""
  1. . . S RORROOTFILE=$S(RORPROCMODE:"80.1",1:"80")
  1. . . S IEN=$$CODEABA^ICDEX(ID,RORROOTFILE,RORCODSYS)
  1. . . S:IEN>0 RORTSK("PARAMS","ICDLST","G",GROUP,"C",IEN)=ID_U_RORCODSYS
  1. .;--- ICD codes
  1. . I LIST="ICDFILT,GROUP" D Q
  1. . . S GROUP=$G(RORXML("ICDGRP")) Q:GROUP=""
  1. . . S ID=$G(ATTR("ID")) Q:ID=""
  1. . . S RORICDTYPE=$G(ATTR("VERSION"))
  1. . . S RORCODSYS=$S(RORICDTYPE="ICD-10":"30",RORICDTYPE="ICD-9":"1",1:"")
  1. . . Q:RORCODSYS=""
  1. . . S IEN=$$CODEABA^ICDEX(ID,"80",RORCODSYS)
  1. . . S:IEN>0 RORTSK("PARAMS","ICDFILT","G",GROUP,"C",IEN)=ID_U_RORCODSYS
  1. ;
  1. ;=== Store the lists
  1. I LVL=3 D Q
  1. . S LIST=$P(RORXML("PATH"),",",LVL-1)
  1. . ;--- List of CPT codes
  1. . I LIST="CPTLST" D:ELMT="CPT" Q
  1. . . S ID=$G(ATTR("ID")) Q:ID=""
  1. . . S IEN=+$$CODEN^ICPTCOD(ID)
  1. . . S:IEN>0 RORTSK("PARAMS",LIST,"C",IEN)=ID
  1. . ;--- Name of the current drug group and its attributes
  1. . I LIST="DRUGS" D:ELMT="GROUP" Q
  1. . . S (RORXML("RXGRP"),ID)=$G(ATTR("ID")) Q:ID=""
  1. . . M RORTSK("PARAMS","DRUGS","G",ID,"A")=ATTR
  1. . . K RORTSK("PARAMS","DRUGS","G",ID,"A","ID")
  1. . ;--- Name of the current ICD group
  1. . I (LIST="ICDLST")!(LIST="ICDFILT") D:ELMT="GROUP" Q
  1. . . S RORXML("ICDGRP")=$G(ATTR("ID"))
  1. . ;--- List of ICD-9 codes
  1. . ;I LIST="ICD9LST" D:ELMT="ICD9" Q
  1. . ;. S ID=$G(ATTR("ID")) Q:ID=""
  1. . ;. S TMP=$S($G(RORTSK("PARAMS","ICD9LST","A","PROC")):80.1,1:80)
  1. . ;. S IEN=+$$CODEN^ICDCODE(ID,TMP)
  1. . ;. S:IEN>0 RORTSK("PARAMS",LIST,"C",IEN)=ID
  1. . ;--- Lab tests
  1. . I LIST="LABTESTS" D:ELMT="LT" Q
  1. . . S ID=$G(ATTR("ID")) Q:ID=""
  1. . . S RORTSK("PARAMS","LABTESTS","C",ID)=""
  1. . . S TMP=$G(ATTR("LOW"))
  1. . . S:TMP'="" RORTSK("PARAMS","LABTESTS","C",ID,"L")=TMP
  1. . . S TMP=$G(ATTR("HIGH"))
  1. . . S:TMP'="" RORTSK("PARAMS","LABTESTS","C",ID,"H")=TMP
  1. . ;--- Laboratory test ranges
  1. . I LIST="LRGRANGES" D:ELMT="LRGRANGE" Q
  1. . . S ID=$G(ATTR("ID")) Q:'$G(ATTR("USE"))!(ID="")
  1. . . S RORTSK("PARAMS",LIST,"C",ID)=""
  1. . . S TMP=$G(ATTR("LOW"))
  1. . . S:TMP'="" RORTSK("PARAMS",LIST,"C",ID,"L")=TMP
  1. . . S TMP=$G(ATTR("HIGH"))
  1. . . S:TMP'="" RORTSK("PARAMS",LIST,"C",ID,"H")=TMP
  1. . ;--- "Include/Exclude" list processing
  1. . I (LIST="LOCAL_FIELDS")!(LIST="OTHER_REGISTRIES") D Q
  1. . . S ID=$G(ATTR("ID")) Q:ID=""
  1. . . S TMP=+$G(ATTR("MODE")) ; 1 - Include; -1 - Exclude
  1. . . S:TMP RORTSK("PARAMS",LIST,"C",ID)=TMP
  1. . ;--- Default processing
  1. . S TMP=","_LIST_","
  1. . Q:'(",CLINICS,DIVISIONS,OPTIONAL_COLUMNS,PATIENTS,SELRULES,UTIL_TYPES,"[TMP)
  1. . S ID=$G(ATTR("ID"))
  1. . S:ID'="" RORTSK("PARAMS",LIST,"C",ID)=""
  1. ;
  1. ;=== Store the top-level attributes
  1. I LVL=2 D Q
  1. . ;--- Date range(s)
  1. . I ELMT?1"DATE_RANGE".1(1"_"1.N) D Q
  1. . . N STDT,ENDT
  1. . . S RC=$$DTRANGE^RORTSK14(.ATTR,.STDT,.ENDT) Q:RC<0
  1. . . S RORTSK("PARAMS",ELMT,"A","START")=STDT
  1. . . S RORTSK("PARAMS",ELMT,"A","END")=ENDT
  1. . ;--- Ignore internal nodes
  1. . Q:ELMT="PANELS"
  1. . ;--- Default processing
  1. . M RORTSK("PARAMS",ELMT,"A")=ATTR
  1. ;
  1. ;--- Ignore everything else
  1. Q
  1. ;
  1. ;***** TEXT CALLBACK FOR THE SAX PARSER
  1. ;
  1. ; TXT Line of unmarked text
  1. ;
  1. ELTEXT(TXT) ;
  1. N ITEM,LIST,LVL
  1. S LVL=$L(RORXML("PATH"),",")
  1. ;--- Store top-level values
  1. I LVL=2 D Q
  1. . S ITEM=$P(RORXML("PATH"),",",LVL)
  1. . S RORTSK("PARAMS",ITEM)=$G(RORTSK("PARAMS",ITEM))_TXT
  1. ;--- Ignore everything else
  1. Q
  1. ;
  1. ;***** ERROR CALLBACK FOR THE SAX PARSER
  1. ;
  1. ; .ERR Reference to a local variable containing
  1. ; informations about the error
  1. ;
  1. ERROR(ERR) ;
  1. N ERRCODE,RORINFO,TMP
  1. I ERR("SEV") D
  1. . S ERRCODE=-105,RORXML("ERR")=$G(RORXML("ERR"))+1
  1. E S ERRCODE=-104
  1. ;--- Prepare message details
  1. S RORINFO(1)=$TR(ERR("MSG"),U,"~")
  1. S TMP=$P("Warning^Validation Error^Conformance Error",U,ERR("SEV")+1)
  1. S RORINFO(2)=TMP_" in line #"_ERR("LIN")_" (pos#"_ERR("POS")_")"
  1. S RORINFO(3)=$TR(ERR("XML"),$C(9,10,13)," ")
  1. ;--- Record the error message
  1. D ERROR^RORERR(ERRCODE,,.RORINFO)
  1. Q
  1. ;
  1. ;***** PARSES AND PREPARES THE REPORT PARAMETERS
  1. ;
  1. ; .PARAMS Reference to a local variable that contains report
  1. ; parameters in XML format. This variable is KILL'ed
  1. ; by this function.
  1. ;
  1. ; .RORTSK Reference to a local variable that contains a task
  1. ; descriptor.
  1. ;
  1. ; Return Values:
  1. ; <0 Error code
  1. ; 0 Ok
  1. ;
  1. PARSEPRM(PARAMS,RORTSK) ;
  1. K RORTSK("PARAMS")
  1. Q:$D(PARAMS)<10 0
  1. ;---
  1. N CBK,RORSRC,RORSUBS,RORTMP,RORXML
  1. S RORSRC=$$ALLOC^RORTMP() ; Source buffer for XML
  1. S RORTMP=$$ALLOC^RORTMP(.RORSUBS) ; Temporary buffer
  1. ;--- Copy the XML document into a global since the parser
  1. ;--- cannot read it from a local variable
  1. M @RORSRC=PARAMS K PARAMS
  1. ;--- Parse the parameters
  1. S CBK("CHARACTERS")="ELTEXT^RORTSK13"
  1. S CBK("COMMENT")="DUMMY^RORTSK13"
  1. S CBK("DOCTYPE")="DUMMY^RORTSK13"
  1. S CBK("ENDDOCUMENT")="DUMMY1^RORTSK13"
  1. S CBK("ENDELEMENT")="ELEND^RORTSK13"
  1. S CBK("ERROR")="ERROR^RORTSK13"
  1. S CBK("EXTERNAL")="DUMMY^RORTSK13"
  1. S CBK("NOTATION")="DUMMY^RORTSK13"
  1. S CBK("PI")="DUMMY^RORTSK13"
  1. S CBK("STARTDOCUMENT")="DOCSTART^RORTSK13"
  1. S CBK("STARTELEMENT")="ELSTART^RORTSK13"
  1. D EN^MXMLPRSE(RORSRC,.CBK,"W")
  1. ;--- Cleanup
  1. D FREE^RORTMP(RORTMP),FREE^RORTMP(RORSRC)
  1. Q $S($G(RORXML("ERR"))>0:$$ERROR^RORERR(-106),1:0)