| 1 | ICPTCOD ;ALB/DEK/KER - CPT CODE APIS ;11/29/2007
 | 
|---|
| 2 |  ;;6.0;CPT/HCPCS;**6,12,13,14,16,19,40**;May 19, 1997;Build 6
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; External References
 | 
|---|
| 5 |  ;   DBIA  10103  $$DT^XLFDT
 | 
|---|
| 6 |  ;                         
 | 
|---|
| 7 |  Q
 | 
|---|
| 8 | CPT(CODE,CDT,SRC,DFN) ; returns basic info on CPT/HCPCS code
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  ; Input:   CODE   CPT/HCPCS or IEN (Required)
 | 
|---|
| 11 |  ;          CDT    Date  (default = TODAY)
 | 
|---|
| 12 |  ;          SRC    Screen source
 | 
|---|
| 13 |  ;                   If '$G(SRC), check Level I and II codes only
 | 
|---|
| 14 |  ;                   If $G(SRC), check Level I, II, and III codes
 | 
|---|
| 15 |  ;          DFN    Not in use, future need
 | 
|---|
| 16 |  ; 
 | 
|---|
| 17 |  ; Output:  Returns a 10 piece string delimited ^
 | 
|---|
| 18 |  ; 
 | 
|---|
| 19 |  ;            1  IEN of code in ^ICPT
 | 
|---|
| 20 |  ;            2  CPT Code (.01 field)
 | 
|---|
| 21 |  ;            3  Versioned Short Name (from #61 multiple)
 | 
|---|
| 22 |  ;            4  Category IEN (#3 field)
 | 
|---|
| 23 |  ;            5  Source (#6 field) C:CPT; H:HCPCS; L:VA LOCAL
 | 
|---|
| 24 |  ;            6  Effective Date (from #60 multiple)
 | 
|---|
| 25 |  ;            7  Status (from #60 multiple)
 | 
|---|
| 26 |  ;            8  Inactivation Date (from #60 multiple)
 | 
|---|
| 27 |  ;            9  Activation Date (from #60 multiple)
 | 
|---|
| 28 |  ;           10  Message (CODE TEXT MAY BE INACCURATE)
 | 
|---|
| 29 |  ; 
 | 
|---|
| 30 |  ;            or 
 | 
|---|
| 31 |  ; 
 | 
|---|
| 32 |  ;           -1^Error Description
 | 
|---|
| 33 |  ; 
 | 
|---|
| 34 |  N DATA,EFF,STR,VCPT
 | 
|---|
| 35 |  I $G(CODE)="" S STR="-1^NO CODE SELECTED" G CPTQ
 | 
|---|
| 36 |  S CODE=$G(CODE),CODE=$S(CODE?1.N:+CODE,1:$$CODEN(CODE))
 | 
|---|
| 37 |  I CODE<1!'$D(^ICPT(CODE)) S STR="-1^NO SUCH ENTRY" G CPTQ
 | 
|---|
| 38 |  I '$G(SRC),$P(^ICPT(CODE,0),"^",6)="L" S STR="-1^VA LOCAL CODE SELECTED" G CPTQ
 | 
|---|
| 39 |  S DATA=$G(^ICPT(CODE,0))
 | 
|---|
| 40 |  I '$L(DATA) S STR="-1^NO DATA" G CPTQ
 | 
|---|
| 41 |  S CDT=$S($G(CDT)="":$$DT^XLFDT,1:$$DTBR^ICPTSUPT(CDT))
 | 
|---|
| 42 |  S VCPT=$$VSTCP(CODE,CDT)
 | 
|---|
| 43 |  S STR=CODE_"^"_DATA,$P(STR,"^",5)=$P(STR,"^",7),STR=$P(STR,"^",1,5)
 | 
|---|
| 44 |  S EFF=$$EFF^ICPTSUPT(81,CODE,CDT) S:EFF<1 $P(EFF,"^",2)=0
 | 
|---|
| 45 |  S STR=STR_"^"_EFF_"^"_$$MSG^ICPTSUPT(CDT) S:$L(VCPT) $P(STR,"^",3)=VCPT
 | 
|---|
| 46 | CPTQ Q STR
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 | CPTD(CODE,OUTARR,DFN,CDT) ; Returns CPT description
 | 
|---|
| 49 |  ;
 | 
|---|
| 50 |  ; Input:   CODE   CPT/HCPCS code or IEN (Required)
 | 
|---|
| 51 |  ;          OUTARR Output Array Name for description
 | 
|---|
| 52 |  ;                   e.g. "ABC" or "ABC("TEST")" 
 | 
|---|
| 53 |  ;                   Default = ^TMP("ICPTD",$J)
 | 
|---|
| 54 |  ;          DFN    Not in use, future need
 | 
|---|
| 55 |  ;          CDT    Date (default = TODAY)
 | 
|---|
| 56 |  ; 
 | 
|---|
| 57 |  ; Output:  #      Number of lines in description
 | 
|---|
| 58 |  ; 
 | 
|---|
| 59 |  ;          @OUTARR(1:n) - Versioned Description (lines 1-n) (from the 62 multiple)
 | 
|---|
| 60 |  ;          @OUTARR(n+1) - blank
 | 
|---|
| 61 |  ;          @OUTARR(n+1) - a message stating: CODE TEXT MAY BE INACCURATE
 | 
|---|
| 62 |  ; 
 | 
|---|
| 63 |  ;           or
 | 
|---|
| 64 |  ; 
 | 
|---|
| 65 |  ;          -1^Error Description
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ; ** NOTE - User must initialize ^TMP("ICPTD",$J), if used **
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  N ARR,END,I,N,CTV
 | 
|---|
| 70 |  I $G(CODE)="" S N="-1^NO CODE SELECTED" G CPTDQ
 | 
|---|
| 71 |  I $G(OUTARR)="" S OUTARR="^TMP(""ICPTD"",$J,"
 | 
|---|
| 72 |  I OUTARR'["(" S OUTARR=OUTARR_"("
 | 
|---|
| 73 |  I OUTARR[")" S OUTARR=$P(OUTARR,")")
 | 
|---|
| 74 |  S END=$E(OUTARR,$L(OUTARR)) I END'="("&(END'=",") S OUTARR=OUTARR_","
 | 
|---|
| 75 |  I OUTARR="^TMP(""ICPTD"",$J," K ^TMP("ICPTD",$J)
 | 
|---|
| 76 |  S CODE=$S(CODE?1.N:+CODE,1:$$CODEN(CODE)),I=0,N=0
 | 
|---|
| 77 |  I CODE<1!'$D(^ICPT(CODE)) S N="-1^NO SUCH CODE" G CPTDQ
 | 
|---|
| 78 |  S CDT=$S($G(CDT)="":$$DT^XLFDT,1:$$DTBR^ICPTSUPT(CDT))
 | 
|---|
| 79 |  D VLTCP(+CODE,CDT,.CTV) S (N,I)=0 F  S I=$O(CTV(I)) Q:+I=0  D
 | 
|---|
| 80 |  . S N=N+1,ARR=OUTARR_N_")",@ARR=$$TRIM($G(CTV(I)))
 | 
|---|
| 81 |  I +N>0 S N=N+1,ARR=OUTARR_N_")",@ARR=" ",N=N+1,ARR=OUTARR_N_")",@ARR=$$MSG^ICPTSUPT(CDT,1)
 | 
|---|
| 82 |  I +N'>0 S N="-1^VERSIONED DESCRIPTION NOT FOUND FOR MODIFIER "_$P($G(^DIC(81.3,+CODE,0)),"^",1)
 | 
|---|
| 83 | CPTDQ Q N
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 | CODM(CODE,OUTARR,SRC,CDT,DFN) ; returns list of modifiers for a code
 | 
|---|
| 86 |  ; 
 | 
|---|
| 87 |  ; Input:   CODE  CPT/HCPCS code, Internal or External Format (Required)
 | 
|---|
| 88 |  ;          ARY   Array Name for list returned
 | 
|---|
| 89 |  ;                  e.g. "ABC" or "ABC("TEST")"
 | 
|---|
| 90 |  ;                  Default = ^TMP("ICPTM",$J)
 | 
|---|
| 91 |  ;          SRC   Source Screen
 | 
|---|
| 92 |  ;                  If 0 or Null, check Level I/II code/modifiers
 | 
|---|
| 93 |  ;                  If >0, check Level I/II/III code/modifiers
 | 
|---|
| 94 |  ;          CDT   Date (default = TODAY)
 | 
|---|
| 95 |  ;          DFN   Not in use, future need
 | 
|---|
| 96 |  ; 
 | 
|---|
| 97 |  ; Output:  #     Number of modifiers that apply
 | 
|---|
| 98 |  ; 
 | 
|---|
| 99 |  ;          OUTARR Array in the format: 
 | 
|---|
| 100 |  ; 
 | 
|---|
| 101 |  ;                 ARY(Mod) = Versioned Name^Mod IEN 
 | 
|---|
| 102 |  ; 
 | 
|---|
| 103 |  ;                 Where
 | 
|---|
| 104 |  ;                   Mod is the .01 field)
 | 
|---|
| 105 |  ;                   Versioned Name is 1 field of the 61 multiple
 | 
|---|
| 106 |  ; 
 | 
|---|
| 107 |  ;           or 
 | 
|---|
| 108 |  ; 
 | 
|---|
| 109 |  ;           -1^Error Description
 | 
|---|
| 110 |  ; 
 | 
|---|
| 111 |  ;   ** NOTE - User must initialize ^TMP("ICPTM",$J) array if used **
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 |  N ARR,CODI,CODA,BR,END,ER,MD,MDST,MI,MN,STR,CODEC,ACTMD,MVST
 | 
|---|
| 114 |  S CDT=$G(CDT)
 | 
|---|
| 115 |  I $G(CODE)="" S STR="-1^NO CPT SELECTED" G CODMQ
 | 
|---|
| 116 |  I $G(OUTARR)="" S OUTARR="^TMP(""ICPTM"",$J,"
 | 
|---|
| 117 |  S STR=0,CODI=$S(CODE?1.N:+CODE,1:$$CODEN(CODE))
 | 
|---|
| 118 |  I CODI<1!'$D(^ICPT(CODI,0)) S STR="-1^NO SUCH CODE" G CODMQ
 | 
|---|
| 119 |  I '$G(SRC),$P(^ICPT(CODI,0),"^",6)="L" S STR="-1^VA LOCAL CODE SELECTED" G CODMQ
 | 
|---|
| 120 |  S CODEC=$$CODEC(CODI),CODA=$$NUM^ICPTAPIU(CODEC)
 | 
|---|
| 121 |  I OUTARR'["(" S OUTARR=OUTARR_"("
 | 
|---|
| 122 |  I OUTARR[")" S OUTARR=$P(OUTARR,")")
 | 
|---|
| 123 |  S END=$E(OUTARR,$L(OUTARR)) I END'="("&(END'=",") S OUTARR=OUTARR_","
 | 
|---|
| 124 |  I OUTARR="^TMP(""ICPTM"",$J," K ^TMP("ICPTM",$J)
 | 
|---|
| 125 |  S:$G(CDT)]"" CDT=$$DTBR^ICPTSUPT(CDT)
 | 
|---|
| 126 |  S BR="" F  S BR=$O(^DIC(81.3,"M",BR)) Q:BR>CODA!'BR  D
 | 
|---|
| 127 |  .S ER="" F  S ER=$O(^DIC(81.3,"M",BR,ER)) Q:'ER  I CODA'>ER D
 | 
|---|
| 128 |  ..S MI=0 F  S MI=$O(^DIC(81.3,"M",BR,ER,MI)) Q:'MI  D
 | 
|---|
| 129 |  ...N MDPS
 | 
|---|
| 130 |  ...S MDST=$G(^DIC(81.3,MI,0)) Q:'$L(MDST)
 | 
|---|
| 131 |  ...S MDPS=$$MODP^ICPTMOD(CODE,+MI,"I",$G(CDT),$G(SRC)) Q:+MDPS'>0
 | 
|---|
| 132 |  ...I '$G(SRC) Q:$P(MDST,"^",4)="V"
 | 
|---|
| 133 |  ...I $G(CDT) S ACTMD="",ACTMD=$$MOD^ICPTMOD(MI,"I",CDT,$G(SRC)) Q:($P(ACTMD,"^")=-1)!($P(ACTMD,"^",7)=0)
 | 
|---|
| 134 |  ...S MD=$P(MDST,"^",1,2),MN=$P(MD,"^")
 | 
|---|
| 135 |  ...I $L(MN)'=2 Q
 | 
|---|
| 136 |  ...S MVST=$$VSTCM^ICPTMOD(MI,CDT)
 | 
|---|
| 137 |  ...S ARR=OUTARR_""""_MN_""")",@ARR=MVST_"^"_MI,STR=STR+1
 | 
|---|
| 138 |  I 'STR S STR=0
 | 
|---|
| 139 | CODMQ Q STR
 | 
|---|
| 140 |  ;
 | 
|---|
| 141 | CODEN(CODE) ; Rreturn the IEN of a CPT/HCPCS code
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  ;   Input:  CPT/HCPCS code
 | 
|---|
| 144 |  ;  Output:  ien of code
 | 
|---|
| 145 |  ;
 | 
|---|
| 146 |  I $G(CODE)="" Q -1
 | 
|---|
| 147 |  N COD
 | 
|---|
| 148 |  S COD=+$O(^ICPT("B",CODE,0))
 | 
|---|
| 149 |  Q $S(COD>0:COD,1:-1)
 | 
|---|
| 150 |  ;
 | 
|---|
| 151 | CODEC(CODE) ; Return the CPT/HCPCS Code
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 |  ;  Input: IEN of CPT/HCPCS code
 | 
|---|
| 154 |  ; Output: CPT/HCPCS code
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 |  I $G(CODE)="" Q -1
 | 
|---|
| 157 |  N Y
 | 
|---|
| 158 |  S Y=$P($G(^ICPT(CODE,0)),"^")
 | 
|---|
| 159 |  Q $S(Y="":-1,1:Y)
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 | VALCPT(CODE,CDT,SRC,DFN) ;check if CPT code is valid for selection
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  ; Input:
 | 
|---|
| 164 |  ;
 | 
|---|
| 165 |  ;    CODE - CPT or HCPCS code, ien or .01 format, REQUIRED
 | 
|---|
| 166 |  ;    CTD  - Date, default = today
 | 
|---|
| 167 |  ;    SRC  - SCREEN SOURCE
 | 
|---|
| 168 |  ;              '$G(SRC) level 1, Level 2 only
 | 
|---|
| 169 |  ;              $G(SRC) include level 3
 | 
|---|
| 170 |  ;    DFN  - not in use, future need
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  ; Output: STR:  1                  if valid code for selection
 | 
|---|
| 173 |  ;              -1^error message    if not selectable
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 |  N STR
 | 
|---|
| 176 |  S CODE=$G(CODE),SRC=$G(SRC),DFN=$G(DFN)
 | 
|---|
| 177 |  S CDT=$S($G(CDT)="":$$DT^XLFDT,1:$$DTBR^ICPTSUPT(CDT)) ;date business rules
 | 
|---|
| 178 |  S STR=$$CPT(CODE,CDT,SRC,DFN)
 | 
|---|
| 179 |  I STR<0 G VALCPTQ
 | 
|---|
| 180 |  I '$P(STR,"^",7) S STR="-1^INACTIVE CODE"
 | 
|---|
| 181 |  I STR>0 S STR=1
 | 
|---|
| 182 | VALCPTQ Q STR
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 |  ;
 | 
|---|
| 185 |  Q
 | 
|---|
| 186 | VST(IEN,VDATE,TYPE)     ; Versioned Short Text
 | 
|---|
| 187 |  Q:TYPE["ICPT(" $$VSTCP($G(IEN),$G(VDATE))
 | 
|---|
| 188 |  Q:TYPE["DIC(81.3" $$VSTCM^ICPTMOD($G(IEN),$G(VDATE))
 | 
|---|
| 189 |  Q ""
 | 
|---|
| 190 | VSTCP(IEN,VDATE) ; Versioned Short Text (CPT Procedure)
 | 
|---|
| 191 |  N CPT0,CPTC,CPTI,CPTSTD,CPTSTI,CPTVDT,CPTTXT
 | 
|---|
| 192 |  S CPTI=+($G(IEN)) Q:+CPTI'>0 ""  Q:'$D(^ICPT(+CPTI)) ""
 | 
|---|
| 193 |  S CPTVDT=$G(VDATE) S:'$L(CPTVDT)!(+CPTVDT'>0) CPTVDT=$$DT^XLFDT Q:CPTVDT\1'?7N ""
 | 
|---|
| 194 |  S CPT0=$G(^ICPT(+CPTI,0)),CPTC=$P(CPT0,"^",1) Q:'$L(CPTC) ""
 | 
|---|
| 195 |  S CPTSTD=$O(^ICPT("AST",(CPTC_" "),(CPTVDT+.000001)),-1)
 | 
|---|
| 196 |  I +CPTSTD>0 D  Q:$L($G(CPTTXT)) $G(CPTTXT)
 | 
|---|
| 197 |  . S CPTSTI=$O(^ICPT("AST",(CPTC_" "),CPTSTD,+CPTI," "),-1),CPTTXT=$$TRIM($P($G(^ICPT(+CPTI,61,+CPTSTI,0)),"^",2))
 | 
|---|
| 198 |  S CPTSTD=$O(^ICPT(+CPTI,61,"B",0)) I +CPTSTD>0 D  Q:$L($G(CPTTXT)) $G(CPTTXT)
 | 
|---|
| 199 |  . S CPTSTI=$O(^ICPT(+CPTI,61,"B",CPTSTD,0)),CPTTXT=$$TRIM($P($G(^ICPT(+CPTI,61,+CPTSTI,0)),"^",2))
 | 
|---|
| 200 |  Q $$TRIM($P(CPT0,"^",2))
 | 
|---|
| 201 | VLTCP(IEN,VDATE,ARY) ; Versioned Description - Long Text (CPT Procedure)
 | 
|---|
| 202 |  N CPT0,CPTC,CPTI,CPTSTD,CPTSTI,CPTVDT,CPTTXT,CPTD,CPTT,CPTE
 | 
|---|
| 203 |  S CPTI=+($G(IEN)) Q:+CPTI'>0  Q:'$D(^ICPT(+CPTI))
 | 
|---|
| 204 |  S CPTVDT=$G(VDATE) S:'$L(CPTVDT)!(+CPTVDT'>0) CPTVDT=$$DT^XLFDT Q:CPTVDT\1'?7N
 | 
|---|
| 205 |  S CPT0=$G(^ICPT(+CPTI,0)),CPTC=$P(CPT0,"^",1) Q:'$L(CPTC)
 | 
|---|
| 206 |  S CPTSTD=$O(^ICPT("ADS",(CPTC_" "),(CPTVDT+.000001)),-1)
 | 
|---|
| 207 |  I +CPTSTD>0 D  Q:+($O(ARY(0)))>0
 | 
|---|
| 208 |  . S CPTSTI=$O(^ICPT("ADS",(CPTC_" "),CPTSTD,+CPTI," "),-1)
 | 
|---|
| 209 |  . S (CPTD,CPTT)=0 F  S CPTD=$O(^ICPT(+CPTI,62,CPTSTI,1,CPTD)) Q:+CPTD=0  D
 | 
|---|
| 210 |  . . S CPTT=CPTT+1,ARY(CPTT)=$$TRIM($G(^ICPT(+CPTI,62,+CPTSTI,1,+CPTD,0))),ARY(0)=CPTT
 | 
|---|
| 211 |  S CPTSTD=$O(^ICPT(+CPTI,62,"B",0)) I +CPTSTD>0 D  Q:+($O(ARY(0)))>0
 | 
|---|
| 212 |  . S CPTSTI=$O(^ICPT(+CPTI,62,"B",CPTSTD,0))
 | 
|---|
| 213 |  . S (CPTD,CPTT)=0 F  S CPTD=$O(^ICPT(+CPTI,62,CPTSTI,1,CPTD)) Q:+CPTD=0  D
 | 
|---|
| 214 |  . . S CPTT=CPTT+1,ARY(CPTT)=$$TRIM($G(^ICPT(+CPTI,62,+CPTSTI,1,+CPTD,0))),ARY(0)=CPTT
 | 
|---|
| 215 |  K ARY S (CPTD,CPTT)=0 F  S CPTD=$O(^ICPT(CPTI,"D",CPTD)) Q:+CPTD=0  D
 | 
|---|
| 216 |  . S CPTT=CPTT+1,ARY(CPTT)=$$TRIM($G(^ICPT(CPTI,"D",CPTD,0))),ARY(0)=CPTT
 | 
|---|
| 217 |  Q
 | 
|---|
| 218 | TRIM(X) ; Trim Spaces
 | 
|---|
| 219 |  S X=$G(X) Q:X="" X F  Q:$E(X,1)'=" "  S X=$E(X,2,$L(X))
 | 
|---|
| 220 |  F  Q:$E(X,$L(X))'=" "  S X=$E(X,1,($L(X)-1))
 | 
|---|
| 221 |  F  Q:X'["  "  S X=$P(X,"  ",1)_" "_$P(X,"  ",2,229)
 | 
|---|
| 222 |  Q X
 | 
|---|