| 1 | PXRMVAL ; SLC/KER - Validate Codes (ICD/ICP/CPT main)    ; 05/16/2000
 | 
|---|
| 2 |  ;;2.0;CLINICAL REMINDERS;;Feb 04, 2005
 | 
|---|
| 3 |  ;   
 | 
|---|
| 4 |  ; This routine checks both the format of a classification code
 | 
|---|
| 5 |  ; (pattern matching) and the value of a classification code
 | 
|---|
| 6 |  ; provided by a user. Both the format and the value of the
 | 
|---|
| 7 |  ; users input must be valid for this routine to return a "true"
 | 
|---|
| 8 |  ; condition (1). If either the format or the value is not valid
 | 
|---|
| 9 |  ; this routine will return a false condition (0) and the reason
 | 
|---|
| 10 |  ; (error) the code was not found to be valid.
 | 
|---|
| 11 |  ;   
 | 
|---|
| 12 |  ; Entry Points
 | 
|---|
| 13 |  ;   
 | 
|---|
| 14 |  ;    EN^PXRMVAL                                     Standard Lookup
 | 
|---|
| 15 |  ;    ============================================================
 | 
|---|
| 16 |  ;   
 | 
|---|
| 17 |  ;             Optional input:
 | 
|---|
| 18 |  ;   
 | 
|---|
| 19 |  ;                X     classification code (ICD/CPT)
 | 
|---|
| 20 |  ;   
 | 
|---|
| 21 |  ;               DIC    global root/#
 | 
|---|
| 22 |  ;   
 | 
|---|
| 23 |  ;                      If X equals      then DIC should be set to
 | 
|---|
| 24 |  ;                      ------------------------------------------
 | 
|---|
| 25 |  ;                      ICD diagnosis         ^ICD9( or 80
 | 
|---|
| 26 |  ;                      ICD procedure         ^ICD0( or 80.1
 | 
|---|
| 27 |  ;                      CPT procedure         ^ICPT( or 81
 | 
|---|
| 28 |  ;   
 | 
|---|
| 29 |  ;   
 | 
|---|
| 30 |  ;   
 | 
|---|
| 31 |  ;    $$CODE^PXRMVAL(<code>,<file>)               Extrinsic Function
 | 
|---|
| 32 |  ;    ============================================================
 | 
|---|
| 33 |  ;   
 | 
|---|
| 34 |  ;             Mandatory input:
 | 
|---|
| 35 |  ;   
 | 
|---|
| 36 |  ;              <code>  classification code (ICD/CPT), may be null
 | 
|---|
| 37 |  ;   
 | 
|---|
| 38 |  ;              <file>  file number or global root
 | 
|---|
| 39 |  ;   
 | 
|---|
| 40 |  ;                      If X equals      then DIC should be set to
 | 
|---|
| 41 |  ;                      ------------------------------------------
 | 
|---|
| 42 |  ;                      ICD diagnosis         ^ICD9( or 80
 | 
|---|
| 43 |  ;                      ICD procedure         ^ICD0( or 80.1
 | 
|---|
| 44 |  ;                      CPT procedure         ^ICPT( or 81
 | 
|---|
| 45 |  ;                      HCPCS procedure       ^ICPT( or 81
 | 
|---|
| 46 |  ;   
 | 
|---|
| 47 |  ;   
 | 
|---|
| 48 |  ;   
 | 
|---|
| 49 |  ; EN^PXRMVAL returns the variable Y and 
 | 
|---|
| 50 |  ; $$CODE^PXRMVAL returns a value in the
 | 
|---|
| 51 |  ; form of:
 | 
|---|
| 52 |  ;   
 | 
|---|
| 53 |  ;          <validity>^<input code>^<output code>^<error>^<file>^
 | 
|---|
| 54 |  ;          <root>^<type>^<input IEN>^<input inactive flag>^
 | 
|---|
| 55 |  ;          <output IEN>^<output inactive flag>^<description>
 | 
|---|
| 56 |  ;   
 | 
|---|
| 57 |  ;           1  Validity      1=valid   0=invalid
 | 
|---|
| 58 |  ;           2  Input code    Code entered by user (input)
 | 
|---|
| 59 |  ;           3  Output code   Code (after transformation, output)
 | 
|---|
| 60 |  ;           4  Error         Error text
 | 
|---|
| 61 |  ;           5  File #        File number used to check code
 | 
|---|
| 62 |  ;           6  Root          Global root (location)
 | 
|---|
| 63 |  ;           7  Type          Type of code checked (ICD, CPT)
 | 
|---|
| 64 |  ;           8  Input IEN     Entry number of input code
 | 
|---|
| 65 |  ;           9  Input flag    ""=active  1=inactive
 | 
|---|
| 66 |  ;          10  Output IEN    Entry number of output code
 | 
|---|
| 67 |  ;          11  Output flag   ""=active  1=inactive
 | 
|---|
| 68 |  ;          12  Name          Descriptive name of Coded entry
 | 
|---|
| 69 |  ;   
 | 
|---|
| 70 |  ;   
 | 
|---|
| 71 |  ; If X (code) or DIC (file) do not exist, then the user will be
 | 
|---|
| 72 |  ; prompted for the missing data.
 | 
|---|
| 73 |  ;   
 | 
|---|
| 74 | EN ; Validate a code format (ICD or CPT)
 | 
|---|
| 75 |  K Y N FI,TY,OX S FI=$G(DIC) S (OX,X)=$G(X) N DIC S DIC=$G(FI) D FD S Y="0^"_OX_"^"_X_"^Unknown error"
 | 
|---|
| 76 |  ;   Quit if no code provided
 | 
|---|
| 77 |  S:'$L(X) (OX,X)=$$SO I '$L(X) S Y="0^"_OX_"^"_X_"^No ICD/CPT code provided" Q
 | 
|---|
| 78 |  ;   Quit if no file provided
 | 
|---|
| 79 |  I $G(DIC)="" S DIC=$G(FI) D FD I '$L(DIC) S DIC=$$FI(OX) D FD
 | 
|---|
| 80 |  I '$L(DIC)!(DIC="^")!(DIC="^^") S Y="0^"_OX_"^"_X_"^No classification code file provided (DIC)" Q
 | 
|---|
| 81 |  ;   Quit if no file found
 | 
|---|
| 82 |  S TY=$$TYPE^PXRMVALU(X,DIC),FI=$G(@(DIC_"0)")) I '$L(FI) S Y="0^"_OX_"^"_X_"^No "_TY_" file found^^^" Q
 | 
|---|
| 83 |  S FI=$S(DIC["ICD9":80,DIC["ICD0":80.1,DIC["ICPT":81,1:0) I FI=0 S Y="0^"_OX_"^"_X_"^No "_TY_" file found^^^" Q
 | 
|---|
| 84 |  ; Validate code
 | 
|---|
| 85 |  S Y=$$VAL(FI,X) Q
 | 
|---|
| 86 |  ;   
 | 
|---|
| 87 | CODE(X,DIC) ; Extrinsic Function to check code format and value
 | 
|---|
| 88 |  S X=$G(X),DIC=$G(DIC) N Y D EN S X=Y Q X
 | 
|---|
| 89 |  ;   
 | 
|---|
| 90 | VAL(X,Y) ; Validate code
 | 
|---|
| 91 |  N FILENUM,CODE S FILENUM=$G(X),CODE=$G(Y)
 | 
|---|
| 92 |  Q:+($G(FILENUM))=80 $$ICD^PXRMVALC(CODE)
 | 
|---|
| 93 |  Q:+($G(FILENUM))=80.1 $$ICP^PXRMVALC(CODE)
 | 
|---|
| 94 |  Q:+($G(FILENUM))=81 $$CPT^PXRMVALC(CODE)
 | 
|---|
| 95 |  Q "0^"_CODE_"^"_CODE_"^Unidentified code type"
 | 
|---|
| 96 |  ;   
 | 
|---|
| 97 | SO(X) ; Prompt user for source code (CODE)
 | 
|---|
| 98 |  N DIR,Y,DTOUT,DUOUT,DIRUT,DIROUT
 | 
|---|
| 99 |  S X=$G(X),DIR(0)="FAO^3:7"
 | 
|---|
| 100 |  S DIR("A")="Enter a classification code:  "
 | 
|---|
| 101 |  S:$L(X)>4&($L(X)<8) DIR("B")=X
 | 
|---|
| 102 |  D ^DIR S X=Y S:$D(DTOUT)!($D(DUOUT))!($D(DIRUT))!($D(DIROUT)) X=""
 | 
|---|
| 103 |  Q X
 | 
|---|
| 104 |  ;   
 | 
|---|
| 105 | FI(SO) ; Prompt user for file (FI,DIC)
 | 
|---|
| 106 |  N DIC,DO,DLAYGO,DINUM,X,Y,DTOUT,DUOUT,FILEDEF,FILENM
 | 
|---|
| 107 |  S SO=$G(SO) S FILEDEF=""  S:$L(SO) FILEDEF=$$FILE^PXRMVALU(SO)
 | 
|---|
| 108 |  S FILENM=$$FN(+FILEDEF),FILEDEF=$S($L(FILENM):FILENM,1:"")
 | 
|---|
| 109 |  S:$L(FILEDEF) DIC("B")=FILEDEF S DIC("A")="Enter classification code file:  "
 | 
|---|
| 110 |  S:$L($G(SO)) DIC("A")="Enter classification file for code """_SO_""":  "
 | 
|---|
| 111 |  S DIC("S")="I +Y=80!(+Y=80.1)!(+Y=81)"
 | 
|---|
| 112 |  S DIC="^DIC(",DIC(0)="AEMQ" D ^DIC S SO=+($G(Y)) S:SO'>0 SO="" Q SO
 | 
|---|
| 113 |  ;   
 | 
|---|
| 114 | FD ; File and file root based on DIC
 | 
|---|
| 115 |  S:'$L(DIC) (FI,DIC)="" Q:'$L(DIC)
 | 
|---|
| 116 |  I $L($$GL(+DIC)),+($$DD(+DIC))>0 D  Q
 | 
|---|
| 117 |  . S FI=+DIC,DIC=$$GL(+DIC) S:FI'=80&(FI'=80.1)&(FI'=81) (FI,DIC)=""
 | 
|---|
| 118 |  I $E(DIC,1)="^",$L($P(DIC,"^",2)),$P(DIC,"^",2)["(",$L(DIC,"^")=2,$D(@(DIC_"0)")) D  Q
 | 
|---|
| 119 |  . S FI=+($P($G(@(DIC_"0)")),"^",2)) S:FI'=80&(FI'=80.1)&(FI'=81) (FI,DIC)=""
 | 
|---|
| 120 |  S (FI,DIC)="" Q
 | 
|---|
| 121 | DD(X) ; DD Exist?  (DBIA #2052)
 | 
|---|
| 122 |  N PXRMF S X=+($G(X)) Q:X=0 ""
 | 
|---|
| 123 |  D FIELD^DID(X,.01,"N","LABEL","PXRMF") S X=$S($L($G(PXRMF("LABEL"))):1,1:0) Q X
 | 
|---|
| 124 | GL(X) ; Global Location (DBIA #2052)
 | 
|---|
| 125 |  N PXRMF S X=+($G(X)) Q:X=0 "" D FILE^DID(X,"N","GLOBAL NAME","PXRMF") S X=$G(PXRMF("GLOBAL NAME")) Q X
 | 
|---|
| 126 | FN(X) ; File Name (DBIA #2052)
 | 
|---|
| 127 |  N PXRMF S X=+($G(X)) Q:X=0 "" D FILE^DID(X,"N","NAME","PXRMF") S X=$G(PXRMF("NAME")) Q X
 | 
|---|