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

ICDEXA2.m

Go to the documentation of this file.
  1. ICDEXA2 ;SLC/KER - ICD Extractor - APIs/Utilities (cont) ;04/21/2014
  1. ;;18.0;DRG Grouper;**57**;Oct 20, 2000;Build 7
  1. ;
  1. ; Global Variables
  1. ; ^ICD0("AVA" N/A
  1. ; ^ICD9("AVA" N/A
  1. ;
  1. ; External References
  1. ; $$DT^XLFDT ICR 10103
  1. ;
  1. Q
  1. NEXT(CODE,SYS,CDT) ; Next ICD Code (active or inactive)
  1. ;
  1. ; Input:
  1. ;
  1. ; CODE ICD Code or Null for the first code
  1. ; SYS Coding System - see ^ICDS
  1. ;
  1. ; 1 = ICD-9-CM
  1. ; 2 = ICD-9-PCS
  1. ; 30 = ICD-10-CM
  1. ; 31 = ICD-10-PCS
  1. ;
  1. ; CDT Code Date to check
  1. ; If CDT is passed, then the code
  1. ; returned is the next active code
  1. ; based on date. If it is not
  1. ; passed then the next code is
  1. ; returned regardless of status.
  1. ;
  1. ; Output:
  1. ;
  1. ; The Next ICD Code, Null if none
  1. ;
  1. N ICDB,ICDC,ICDG,ICDF,ICDD,ICDE,ICDI,ICDR,ICDS,ICDO,ICDN,ICDY
  1. S ICDC=$TR($G(CODE)," ",""),ICDD=$G(CDT),ICDB=ICDD?7N
  1. S ICDY=$$SYS^ICDEX(+($G(SYS)))
  1. S:ICDY'>0&($L(ICDC)) ICDY=$$SYS^ICDEX(ICDC)
  1. S ICDF=$$FILE^ICDEX(+ICDY)
  1. Q:'$L(ICDC)&(ICDY'>0) "" S ICDS=0,ICDE=""
  1. S:+ICDY>0 ICDS=+ICDY I $L(ICDC) D
  1. . S:"^80^80.1^"'[("^"_ICDF_"^") ICDF=$$CODEFI^ICDEX(ICDC)
  1. . S ICDE=$P($$CODECS^ICDEX(ICDC,ICDF),"^",1) S:ICDS>0 ICDE=ICDS
  1. Q:+ICDY>0&(+($G(ICDE))>0)&(+ICDY'=+($G(ICDE))) ""
  1. S:+ICDS'>0&(+($G(ICDE))>0) ICDS=+($G(ICDE))
  1. Q:+ICDS'>0 "" S ICDR=$$ROOT^ICDEX(ICDS) Q:'$L(ICDR) ""
  1. S ICDO=$$NUM^ICDEX(ICDC) Q:$L(ICDC)&(+ICDO'>0) ""
  1. I 'ICDB S ICDC="" D Q $S(ICDC="":"",1:ICDC)
  1. . S ICDN=$O(@(ICDR_"""AN"","_+ICDS_","_+ICDO_")"))
  1. . S ICDC=$S(+ICDN>0:$$COD^ICDEX(+ICDN),1:"")
  1. I ICDB S ICDC="" D Q $S(ICDC="":"",1:ICDC)
  1. . N ICDA S ICDA="" F S ICDO=$O(@(ICDR_"""AN"","_+ICDS_","_+ICDO_")")) Q:+ICDO'>0 D Q:$L(ICDC)
  1. . . N ICDI S ICDI=0 F S ICDI=$O(@(ICDR_"""AN"","_+ICDS_","_+ICDO_","_+ICDI_")")) Q:+ICDI'>0 D Q:$L(ICDC)
  1. . . . N ICDE,ICDH S ICDE=$O(@(ICDR_+ICDI_",66,""B"","_(ICDD+.001)_")"),-1) Q:ICDE'?7N
  1. . . . S ICDH=$O(@(ICDR_+ICDI_",66,""B"","_ICDE_","" "")"),-1) Q:+ICDH'>0
  1. . . . S ICDA=$G(@(ICDR_+ICDI_",66,"_ICDH_",0)")),ICDA=+($P(ICDA,"^",2))
  1. . . . S:+ICDA>0 ICDC=ICDO S ICDC=$S(+($G(ICDC))>0:$$COD^ICDEX(+ICDC),1:"")
  1. Q $S(ICDC="":"",1:ICDC)
  1. PREV(CODE,SYS,CDT) ; Previous ICD Code (active or inactive)
  1. ;
  1. ; Input:
  1. ;
  1. ; CODE ICD Code or Null for the last code
  1. ; SYS Coding System - see ^ICDS
  1. ;
  1. ; 1 = ICD-9-CM
  1. ; 2 = ICD-9-PCS
  1. ; 30 = ICD-10-CM
  1. ; 31 = ICD-10-PCS
  1. ;
  1. ; CDT Code Date to check
  1. ; If CDT is passed, then the code
  1. ; returned is the previous active
  1. ; code based on date. If it is
  1. ; not passed then the previous
  1. ; code is returned regardless of
  1. ; status.
  1. ;
  1. ; Output:
  1. ;
  1. ; The Previous ICD Code, Null if none
  1. ;
  1. N ICDB,ICDC,ICDG,ICDF,ICDD,ICDE,ICDI,ICDR,ICDS,ICDO,ICDN,ICDY
  1. S ICDC=$TR($G(CODE)," ",""),ICDD=$G(CDT),ICDB=ICDD?7N
  1. S ICDY=$$SYS^ICDEX(+($G(SYS)))
  1. S:ICDY'>0&($L(ICDC)) ICDY=$$SYS^ICDEX(ICDC)
  1. S ICDF=$$FILE^ICDEX(+ICDY)
  1. Q:'$L(ICDC)&(ICDY'>0) "" S ICDS=0,ICDE=""
  1. S:+ICDY>0 ICDS=+ICDY I $L(ICDC) D
  1. . S:"^80^80.1^"'[("^"_ICDF_"^") ICDF=$$CODEFI^ICDEX(ICDC)
  1. . S ICDE=$P($$CODECS^ICDEX(ICDC,ICDF),"^",1) S:ICDS>0 ICDE=ICDS
  1. Q:+ICDY>0&(+($G(ICDE))>0)&(+ICDY'=+($G(ICDE))) ""
  1. S:+ICDS'>0&(+($G(ICDE))>0) ICDS=+($G(ICDE)) Q:+ICDS'>0 ""
  1. S ICDR=$$ROOT^ICDEX(ICDS) Q:'$L(ICDR) ""
  1. S ICDO=$$NUM^ICDEX(ICDC) Q:$L(ICDC)&(+ICDO'>0) ""
  1. I 'ICDB D Q $S(ICDC="":"",1:ICDC)
  1. . S:+ICDO'>0 ICDO=$O(@(ICDR_"""AN"","_+ICDS_","" "")"),-1)+1
  1. . S ICDN=0,ICDC=""
  1. . S ICDN=$O(@(ICDR_"""AN"","_+ICDS_","_+ICDO_")"),-1)
  1. . S ICDC=$S(+ICDN>0:$$COD^ICDEX(+ICDN),1:"")
  1. I ICDB S ICDC="" D Q $S(ICDC="":"",1:ICDC)
  1. . N ICDA S ICDA="" S:+ICDO'>0 ICDO=$O(@(ICDR_"""AN"","_+ICDS_","" "")"),-1)+1
  1. . F S ICDO=$O(@(ICDR_"""AN"","_+ICDS_","_+ICDO_")"),-1) Q:+ICDO'>0 D Q:$L(ICDC)
  1. . . N ICDI S ICDI=0 F S ICDI=$O(@(ICDR_"""AN"","_+ICDS_","_+ICDO_","_+ICDI_")")) Q:+ICDI'>0 D Q:$L(ICDC)
  1. . . . N ICDE,ICDH S ICDE=$O(@(ICDR_+ICDI_",66,""B"","_(ICDD+.001)_")"),-1) Q:ICDE'?7N
  1. . . . S ICDH=$O(@(ICDR_+ICDI_",66,""B"","_ICDE_","" "")"),-1) Q:+ICDH'>0
  1. . . . S ICDA=$G(@(ICDR_+ICDI_",66,"_ICDH_",0)")),ICDA=+($P(ICDA,"^",2))
  1. . . . S:+ICDA>0 ICDC=ICDO S ICDC=$S(+($G(ICDC))>0:$$COD^ICDEX(+ICDC),1:"")
  1. Q $S(ICDC="":"",1:ICDC)
  1. HIST(CODE,ARY,SYS) ; Activation History
  1. ;
  1. ; Input:
  1. ;
  1. ; CODE ICD Code (required)
  1. ; .ARY Array, passed by Reference (required)
  1. ; SYS Coding System - see ^ICDS
  1. ;
  1. ; 1 = ICD-9-CM
  1. ; 2 = ICD-9-PCS
  1. ; 30 = ICD-10-CM
  1. ; 31 = ICD-10-PCS
  1. ;
  1. ; Output: Mirrors ARY(0) (or, -1 on error)
  1. ;
  1. ; ARY(0) = Number of Activation History Entries
  1. ; ARY(<date>) = status where: 1 is Active
  1. ; ARY("IEN") = <ien>
  1. ;
  1. Q:$G(CODE)="" -1 K ARY
  1. N ICDC,ICDF,ICDS,ICDE,ICDI,ICDA,ICDN,ICDD,ICDR,ICDF,ICDS,ICDY
  1. S ICDC=$TR($G(CODE)," ","") Q:'$L(ICDC) -1 S ICDY=$$SYS^ICDEX($G(SYS))
  1. S:+ICDY'>0 ICDY=$$SYS^ICDEX(ICDC)
  1. S ICDS=0 S:+ICDY>0 ICDS=+ICDY
  1. S ICDF=$$CODEFI^ICDEX(ICDC) Q:+ICDF'>0 -1
  1. S ICDE=$P($$CODECS^ICDEX(ICDC,ICDF),"^",1) Q:+ICDE'>0 -1
  1. S:+ICDS'>0&(+ICDE>0) ICDS=ICDE
  1. Q:+ICDS>0&(ICDS'=+ICDE) -1
  1. S ICDR=$$ROOT^ICDEX(ICDF) Q:'$L(ICDR) -1
  1. S ICDI=$$CODEABA^ICDEX(ICDC,ICDR,+ICDS) Q:+ICDI'>0 -1
  1. S ICDE=$P($G(@(ICDR_ICDI_",1)")),"^",1) Q:+ICDS>0&(ICDS'=+ICDE) -1
  1. S ARY("IEN")=ICDI,ICDA="" M ICDA=@(ICDR_ICDI_",66)")
  1. K ICDA("B") S ARY(0)=+($P($G(ICDA(0)),"^",4))
  1. S:+ARY(0)=0 ARY(0)=-1 K:ARY(0)=-1 ARY("IEN")
  1. S (ICDI,ICDC)=0 F S ICDI=$O(ICDA(ICDI)) Q:+ICDI=0 D
  1. . S ICDD=$P($G(ICDA(ICDI,0)),"^",1) Q:+ICDD=0
  1. . S ICDF=$P($G(ICDA(ICDI,0)),"^",2) Q:'$L(ICDF)
  1. . S ICDC=ICDC+1,ARY(0)=ICDC,ARY(ICDD)=ICDF
  1. Q ARY(0)
  1. PERIOD(CODE,ARY,SYS) ; Return Activation/Inactivation Period in ARY
  1. ;
  1. ; Input:
  1. ;
  1. ; CODE ICD Code (required)
  1. ; ARY Array, passed by Reference (required)
  1. ; SYS Coding System - see ^ICDS
  1. ;
  1. ; 1 = ICD-9-CM
  1. ; 2 = ICD-9-PCS
  1. ; 30 = ICD-10-CM
  1. ; 31 = ICD-10-PCS
  1. ;
  1. ; Output:
  1. ;
  1. ; $$PERIOD Number of activation periods found
  1. ;
  1. ; ARY(0) = IEN ^ Selectable ^ Error Message
  1. ;
  1. ; Where IEN = -1 if error
  1. ; Selectable = 0 for unselectable
  1. ; Error Message if applicable
  1. ;
  1. ; ARY(Activation Date) = Inactivation Date^Short Name
  1. ;
  1. ; Where the Short Name is versioned as follows:
  1. ;
  1. ; Period is active - Text for TODAY's date
  1. ; Period is inactive - Text for inactivation date
  1. ;
  1. I $G(CODE)="" S ARY(0)="-1^0^Code not specified" Q 0
  1. K ARY N ICD1,ICDC,ICDBA,ICDF,ICDG,ICDS,ICDE,ICDI,ICDI,ICDA,ICDN,ICDD,ICDR,ICDF,ICDS,ICDY,ICDP,ICDT
  1. S ICDC=$TR($G(CODE)," ","") I '$L(ICDC) S ARY(0)="-1^0^Invalid Code specified" Q 0
  1. I $D(^ICD9("AVA",(CODE_" ")))!($D(^ICD0("AVA",(CODE_" ")))) S ARY(0)="-1^0^Invalid Code specified" Q 0
  1. S ICDY=$$SYS^ICDEX($G(SYS))
  1. I +ICDY'>0 D
  1. . N ICDF,ICDE S ICDF=$$CODEFI^ICDEX(ICDC) Q:+ICDF'>0
  1. . S ICDE=$P($$CODECS^ICDEX(ICDC,ICDF),"^",1) Q:+ICDE'>0
  1. . S ICDY=$$SYS^ICDEX(ICDE)
  1. S ICDS=+($G(ICDY)) I +ICDS'>0 S ARY(0)="-1^0^Invalid or undetermined Coding System" Q 0
  1. S ICDR=$$ROOT^ICDEX(ICDS) I '$L(ICDR) S ARY(0)="-1^0^Undetermined global root" Q 0
  1. S ICDI=$$CODEABA^ICDEX(ICDC,ICDR,+ICDS) I +ICDI'>0 S ARY(0)="-1^0^IEN not found" Q 0
  1. S ICDP=$S(ICDR["ICD9":3,1:4),ICD1=$G(@(ICDR_ICDI_",1)")),ICDN=$$MRST(ICDR,ICDI)
  1. S ICDG=ICDR_ICDI_",67,",ICDT=$O(@(ICDG_"""B"","" "")"),-1),ICDT=$O(@(ICDG_"""B"","_+ICDT_","" "")"),-1)
  1. S ICDT=$P($G(@(ICDG_+ICDT_",0)")),"^",2),ARY(0)=ICDI_"^"_'$P(ICD1,"^",7)
  1. S (ICDA,ICDBA)=0,ICDG=ICDR_ICDI_",66,"
  1. F Q:ICDBA D
  1. . N ICDBI,ICDCA,ICDST,ICDV S ICDA=$O(@(ICDG_"""B"","_ICDA_")"))
  1. . I ICDA="" S ICDBA=1 Q
  1. . S ICDF=$O(@(ICDG_"""B"","_ICDA_",0)"))
  1. . I '+ICDF S ICDBA=1 Q
  1. . S ICDST=$P($G(@(ICDG_ICDF_",0)")),"^",2)
  1. . Q:'ICDST ;outer loop looks for active
  1. . ; Versioned text for activation date
  1. . S ICDV=$$MRST(ICDR,ICDI) S:$L(ICDV) ICDT=ICDV
  1. . S ARY(ICDA)="^"_ICDT,ICDBI=0,ICDI=ICDA
  1. . F Q:ICDBI D
  1. . . S ICDI=$O(@(ICDG_"""B"","_ICDI_")"))
  1. . . ; If no inactivation date for ICDA then use TODAY's text
  1. . . I ICDI="" S ARY(ICDA)="^"_ICDN,(ICDBI,ICDBA)=1 Q
  1. . . S ICDF=$O(@(ICDG_"""B"","_ICDI_",0)"))
  1. . . ; If no effective date ICDF for ICDI then use TODAY's text
  1. . . I '+ICDF S ARY(ICDA)="^"_ICDN,(ICDBI,ICDBA)=1 Q
  1. . . S ICDST=$P($G(@(ICDG_ICDF_",0)")),"^",2)
  1. . . ; If Status ICDST not Inactive then use TODAY's text
  1. . . I ICDST S ARY(ICDA)="^"_ICDN,ICDBI=1 Q
  1. . . ; Versioned text for inactive date
  1. . . S ICDV=$$MRST(ICDR,+($G(ARY(0))),ICDI)
  1. . . S:$L(ICDV) $P(ARY(ICDA),"^",2)=ICDV
  1. . . S $P(ARY(ICDA),"^")=ICDI
  1. . . S ICDBI=1,ICDA=ICDI,ICDCA=0
  1. S (ICDI,ICDC)=0 F S ICDI=$O(ARY(ICDI)) Q:+ICDI'>0 S ICDC=ICDC+1
  1. S:ICDC'>0 ARY(0)="-1^0^No activation periods found"
  1. Q ICDC
  1. MRST(ICD,X,Y) ; Most Recent Description from Date
  1. N ICDI,ICDT,ICDE,ICDH,ICDR S ICDR=$G(ICD),ICDI=+($G(X)),ICDT=$G(Y)
  1. Q:'$L(ICDR)!(ICDR'["^")!(ICDR'["(") "" Q:+ICDI'>0 "" I ICDT'>0 D Q X
  1. . N ICDE,ICDH S ICDE=+($O(@(ICDR_+ICDI_",67,""B"","" "")"),-1))
  1. . S ICDH=+($O(@(ICDR_+ICDI_",67,""B"","_ICDE_","" "")"),-1))
  1. . S X=$P($G(@(ICDR_+ICDI_",67,"_ICDH_",0)")),"^",2)
  1. S ICDE=+($O(@(ICDR_+ICDI_",67,""B"","_+ICDT_")"),-1))
  1. S ICDH=+($O(@(ICDR_+ICDI_",67,""B"","_ICDE_","" "")"),-1))
  1. S X=$P($G(@(ICDR_+ICDI_",67,"_ICDH_",0)")),"^",2)
  1. Q X