| 1 | ICPTMOD ;ALB/DEK/KER - CPT MODIFIER APIS ;08/18/2007
 | 
|---|
| 2 |  ;;6.0;CPT/HCPCS;**6,12,13,14,19,30,37**;May 19, 1997;Build 25
 | 
|---|
| 3 |  ;             
 | 
|---|
| 4 |  ; Global Variables
 | 
|---|
| 5 |  ;    ^DIC(81.3
 | 
|---|
| 6 |  ;    ^TMP("ICPTD"     SACC 2.3.2.5.1
 | 
|---|
| 7 |  ;             
 | 
|---|
| 8 |  ; External References
 | 
|---|
| 9 |  ;    $$DT^XLFDT       DBIA  10103
 | 
|---|
| 10 |  ;             
 | 
|---|
| 11 |  ; External References
 | 
|---|
| 12 |  ;
 | 
|---|
| 13 |  Q
 | 
|---|
| 14 | MOD(MOD,MFT,MDT,SRC,DFN) ;  returns basic info on CPT MODIFIERs
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ; Input:   MOD   Modifier, Internal or External (Required)
 | 
|---|
| 17 |  ;          MFT   Format  "I"=IEN  "E"=.01 field (Default)
 | 
|---|
| 18 |  ;          MDT   Version Date, FileMan format (default = TODAY)
 | 
|---|
| 19 |  ;          SRC   Source Screen
 | 
|---|
| 20 |  ;                  If 0 or Null, Level I and II only
 | 
|---|
| 21 |  ;                  If >0, Level I, II, and III
 | 
|---|
| 22 |  ;          DFN   Not used
 | 
|---|
| 23 |  ; 
 | 
|---|
| 24 |  ; Output:  10 piece string delimited by the up-arrow (^)
 | 
|---|
| 25 |  ; 
 | 
|---|
| 26 |  ;            1  IEN
 | 
|---|
| 27 |  ;            2  Modifier (0;1)
 | 
|---|
| 28 |  ;            3  Versioned Name (61, 0;1)
 | 
|---|
| 29 |  ;            4  Code (0;3)
 | 
|---|
| 30 |  ;            5  Source (0;4)
 | 
|---|
| 31 |  ;            6  Effective Date (60, 0;1)
 | 
|---|
| 32 |  ;            7  Status (60, 0;2) 0:inactive; 1:active
 | 
|---|
| 33 |  ;            8  Inactivation Date (60, 0;1)
 | 
|---|
| 34 |  ;            9  Activation Date (60, 0;1)
 | 
|---|
| 35 |  ;           10  Message
 | 
|---|
| 36 |  ;        or 
 | 
|---|
| 37 |  ;           -1^Error
 | 
|---|
| 38 |  ; 
 | 
|---|
| 39 |  N DATA,EFF,EFFX,EFFS,STR,MODN,MODST
 | 
|---|
| 40 |  I $G(MOD)="" S STR="-1^NO MODIFIER SELECTED" G MODQ
 | 
|---|
| 41 |  I $G(MFT)="" S MFT="E"
 | 
|---|
| 42 |  I "E^I"'[MFT S STR="-1^INVALID MODIFIER FORMAT" G MODQ
 | 
|---|
| 43 |  S MDT=$S($G(MDT)="":$$DT^XLFDT,1:$$DTBR^ICPTSUPT(MDT))
 | 
|---|
| 44 |  I MFT="E" S MODN=$O(^DIC(81.3,"B",MOD,0)) I $O(^(MODN)) S STR="-1^Multiple modifiers w/same name.  Select IEN: " D MULT G MODQ
 | 
|---|
| 45 |  I MFT="E" S MOD=MODN
 | 
|---|
| 46 |  S MOD=+MOD
 | 
|---|
| 47 |  I 'MOD!'$D(^DIC(81.3,MOD)) S STR="-1^NO SUCH MODIFIER" G MODQ
 | 
|---|
| 48 |  S DATA=$G(^DIC(81.3,MOD,0))
 | 
|---|
| 49 |  S MODST=$$VSTCM(MOD,MDT)
 | 
|---|
| 50 |  I '$L(DATA) S STR="-1^NO DATA" G MODQ
 | 
|---|
| 51 |  S STR=MOD_"^"_$P(DATA,"^",1,4)
 | 
|---|
| 52 |  I '$G(SRC),$P(STR,"^",5)="V" Q "-1^VA LOCAL MODIFIER SELECTED"
 | 
|---|
| 53 |  S EFF=$$EFF^ICPTSUPT(81.3,MOD,MDT)
 | 
|---|
| 54 |  I EFF<1 S $P(EFF,"^",2)=0
 | 
|---|
| 55 |  S STR=STR_"^"_EFF_"^"_$$MSG^ICPTSUPT(MDT)
 | 
|---|
| 56 |  S:$L(MODST) $P(STR,"^",3)=MODST
 | 
|---|
| 57 | MODQ ; Modifier Quit
 | 
|---|
| 58 |  Q STR
 | 
|---|
| 59 |  ;
 | 
|---|
| 60 | MODD(CODE,OUTARR,DFN,CDT)       ; returns CPT description in array
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  ; Input:   CODE   CPT Modifier, internal or external (Required)
 | 
|---|
| 63 |  ;          ARY    Output Array Name
 | 
|---|
| 64 |  ;                   e.g. "ABC" or "ABC("TEST")" 
 | 
|---|
| 65 |  ;                   Default = ^TMP("ICPTD",$J)
 | 
|---|
| 66 |  ;          DFN    Not used
 | 
|---|
| 67 |  ;          CDT    Versioning Date (default = TODAY)
 | 
|---|
| 68 |  ;                   If prior to 1/1/1989, 1/1/1989 will be used
 | 
|---|
| 69 |  ;                   If year only, use first of that year
 | 
|---|
| 70 |  ;                   If month/year only, use first of the month
 | 
|---|
| 71 |  ;                   If later than today, TODAY will be used
 | 
|---|
| 72 |  ; 
 | 
|---|
| 73 |  ; Output:  #      Number of lines in description
 | 
|---|
| 74 |  ; 
 | 
|---|
| 75 |  ;          @ARY(1:n) - Versioned Description (multiple 62)
 | 
|---|
| 76 |  ;          @ARY(n+1) - blank
 | 
|---|
| 77 |  ;          @ARY(n+1) - message: CODE TEXT MAY BE INACCURATE
 | 
|---|
| 78 |  ;      or
 | 
|---|
| 79 |  ;          -1^Error
 | 
|---|
| 80 |  ; 
 | 
|---|
| 81 |  ;  ** User must initialize ^TMP("ICPTD",$J), if used **
 | 
|---|
| 82 |  ; 
 | 
|---|
| 83 |  N ARR,END,CTV,I,N
 | 
|---|
| 84 |  I $G(CODE)="" S N="-1^NO CODE SELECTED" G MODDQ
 | 
|---|
| 85 |  I $G(OUTARR)="" S OUTARR="^TMP(""ICPTD"",$J,"
 | 
|---|
| 86 |  I OUTARR'["(" S OUTARR=OUTARR_"("
 | 
|---|
| 87 |  I OUTARR[")" S OUTARR=$P(OUTARR,")")
 | 
|---|
| 88 |  S END=$E(OUTARR,$L(OUTARR)) I END'="("&(END'=",") S OUTARR=OUTARR_","
 | 
|---|
| 89 |  I OUTARR="^TMP(""ICPTD"",$J," K ^TMP("ICPTD",$J)
 | 
|---|
| 90 |  S CODE=$S(CODE?1.N:+CODE,1:$$CODEN(CODE)),I=0,N=0
 | 
|---|
| 91 |  I CODE<1!'$D(^DIC(81.3,CODE)) S N="-1^NO SUCH CODE" G MODDQ
 | 
|---|
| 92 |  S CDT=$S($G(CDT)="":$$DT^XLFDT,1:$$DTBR^ICPTSUPT(CDT))
 | 
|---|
| 93 |  D VLTCM(+CODE,CDT,.CTV)
 | 
|---|
| 94 |  S (N,I)=0 F  S I=$O(CTV(I)) Q:+I=0  D
 | 
|---|
| 95 |  . S N=N+1,ARR=OUTARR_N_")",@ARR=$$TRIM($G(CTV(I)))
 | 
|---|
| 96 |  I +N>0 D
 | 
|---|
| 97 |  . S N=N+1,ARR=OUTARR_N_")",@ARR=" "
 | 
|---|
| 98 |  . S N=N+1,ARR=OUTARR_N_")",@ARR=$$MSG^ICPTSUPT(CDT,1)
 | 
|---|
| 99 |  I +N'>0 S N="-1^VERSIONED DESCRIPTION NOT FOUND FOR MODIFIER "_$P($G(^DIC(81.3,+CODE,0)),"^",1)
 | 
|---|
| 100 | MODDQ ; Modifier Description Quit
 | 
|---|
| 101 |  Q N
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 | MODA(CODE,VDT,ARY) ; Return an array of Modifiers for a CPT Code
 | 
|---|
| 104 |  D MODA^ICPTMOD2 Q
 | 
|---|
| 105 | MODP(CODE,MOD,MFT,MDT,SRC,DFN) ;  Check if modifier can be used with code
 | 
|---|
| 106 |  Q $$MODP^ICPTMOD2($G(CODE),$G(MOD),$G(MFT),$G(MDT),$G(SRC),$G(DFN))
 | 
|---|
| 107 | MODC(MOD) ; Checks modifier for range including code
 | 
|---|
| 108 |  D MODC^ICPTMOD2($G(MOD))
 | 
|---|
| 109 |  Q
 | 
|---|
| 110 | MULT ; Finds Duplicate Modifiers
 | 
|---|
| 111 |  D MULT^ICPTMOD2 Q
 | 
|---|
| 112 | CODEN(CODE)    ; Return the IEN of a CPT modifier CODE
 | 
|---|
| 113 |  Q:$G(CODE)="" -1
 | 
|---|
| 114 |  N COD S COD=+$O(^DIC(81.3,"BA",(CODE_" "),0))
 | 
|---|
| 115 |  Q $S(COD>0:COD,1:-1)
 | 
|---|
| 116 | VSTCM(IEN,VDATE) ; Versioned Short Text (CPT Modifier)
 | 
|---|
| 117 |  N CPT0,CPTC,CPTI,CPTSTD,CPTSTI,CPTVDT,CPTTXT,CPTTD,CPTTI
 | 
|---|
| 118 |  S CPTI=+($G(IEN)) Q:+CPTI'>0 ""  Q:'$D(^DIC(81.3,+CPTI)) ""
 | 
|---|
| 119 |  S CPTVDT=$G(VDATE) S:'$L(CPTVDT)!(+CPTVDT'>0) CPTVDT=$$DT^XLFDT Q:$P(CPTVDT,".",1)'?7N ""
 | 
|---|
| 120 |  S CPT0=$G(^DIC(81.3,+CPTI,0)),CPTC=$P(CPT0,"^",1) Q:'$L(CPTC) ""
 | 
|---|
| 121 |  S CPTSTD=0 S CPTTD=CPTVDT+.000001 F  S CPTTD=$O(^DIC(81.3,"AST",(CPTC_" "),CPTTD),-1) Q:+CPTTD=0  Q:+CPTSTD>0  D
 | 
|---|
| 122 |  . S CPTTI=$O(^DIC(81.3,"AST",(CPTC_" "),CPTTD," "),-1) S:CPTTI=CPTI CPTSTD=CPTTD
 | 
|---|
| 123 |  I +CPTSTD>0 D  Q:$L($G(CPTTXT)) $G(CPTTXT)
 | 
|---|
| 124 |  . S CPTSTI=$O(^DIC(81.3,"AST",(CPTC_" "),CPTSTD,+CPTI," "),-1),CPTTXT=$P($G(^DIC(81.3,+CPTI,61,+CPTSTI,0)),"^",2)
 | 
|---|
| 125 |  S CPTSTD=$O(^DIC(81.3,+CPTI,61,"B",0)) I +CPTSTD>0 D  Q:$L($G(CPTTXT)) $G(CPTTXT)
 | 
|---|
| 126 |  . S CPTSTI=$O(^DIC(81.3,+CPTI,61,"B",CPTSTD,0)),CPTTXT=$P($G(^DIC(81.3,+CPTI,61,+CPTSTI,0)),"^",2)
 | 
|---|
| 127 |  Q $$TRIM($P(CPT0,"^",2))
 | 
|---|
| 128 | VLTCM(IEN,VDATE,ARY) ; Versioned Description - Long Text (CPT Modifier)
 | 
|---|
| 129 |  N CPT0,CPTC,CPTD,CPTI,CPTSTD,CPTSTI,CPTT,CPTVDT,CPTTXT,CPTTD,CPTTI
 | 
|---|
| 130 |  S CPTI=+($G(IEN)) Q:+CPTI'>0  Q:'$D(^DIC(81.3,+CPTI))
 | 
|---|
| 131 |  S CPTVDT=$G(VDATE) S:'$L(CPTVDT)!(+CPTVDT'>0) CPTVDT=$$DT^XLFDT Q:$P(CPTVDT,".",1)'?7N
 | 
|---|
| 132 |  S CPT0=$G(^DIC(81.3,+CPTI,0)),CPTC=$P(CPT0,"^",1) Q:'$L(CPTC)
 | 
|---|
| 133 |  S CPTSTD=0 S CPTTD=CPTVDT+.000001 F  S CPTTD=$O(^DIC(81.3,"ADS",(CPTC_" "),CPTTD),-1) Q:+CPTTD=0  Q:+CPTSTD>0  D
 | 
|---|
| 134 |  . S CPTTI=$O(^DIC(81.3,"ADS",(CPTC_" "),CPTTD," "),-1) S:CPTTI=CPTI CPTSTD=CPTTD
 | 
|---|
| 135 |  I +CPTSTD>0 D  Q:+($O(ARY(0)))>0
 | 
|---|
| 136 |  . S CPTSTI=$O(^DIC(81.3,"ADS",(CPTC_" "),CPTSTD,+CPTI," "),-1)
 | 
|---|
| 137 |  . S (CPTD,CPTT)=0 F  S CPTD=$O(^DIC(81.3,+CPTI,62,CPTSTI,1,CPTD)) Q:+CPTD=0  D
 | 
|---|
| 138 |  . . S CPTT=CPTT+1,ARY(CPTT)=$$TRIM($G(^DIC(81.3,+CPTI,62,+CPTSTI,1,+CPTD,0))),ARY(0)=CPTT
 | 
|---|
| 139 |  S CPTSTD=$O(^DIC(81.3,+CPTI,62,"B",0)) I +CPTSTD>0 D  Q:+($O(ARY(0)))>0
 | 
|---|
| 140 |  . S CPTSTI=$O(^DIC(81.3,+CPTI,62,"B",CPTSTD,0))
 | 
|---|
| 141 |  . S (CPTD,CPTT)=0 F  S CPTD=$O(^DIC(81.3,+CPTI,62,CPTSTI,1,CPTD)) Q:+CPTD=0  D
 | 
|---|
| 142 |  . . S CPTT=CPTT+1,ARY(CPTT)=$$TRIM($G(^DIC(81.3,+CPTI,62,+CPTSTI,1,+CPTD,0))),ARY(0)=CPTT
 | 
|---|
| 143 |  K ARY S (CPTD,CPTT)=0 F  S CPTD=$O(^DIC(81.3,CPTI,"D",CPTD)) Q:+CPTD=0  D
 | 
|---|
| 144 |  . S CPTT=CPTT+1,ARY(CPTT)=$$TRIM($G(^DIC(81.3,CPTI,"D",CPTD,0))),ARY(0)=CPTT
 | 
|---|
| 145 |  Q
 | 
|---|
| 146 | TRIM(X) ; Trim Spaces
 | 
|---|
| 147 |  S X=$G(X) Q:X="" X F  Q:$E(X,1)'=" "  S X=$E(X,2,$L(X))
 | 
|---|
| 148 |  F  Q:$E(X,$L(X))'=" "  S X=$E(X,1,($L(X)-1))
 | 
|---|
| 149 |  F  Q:X'["  "  S X=$P(X,"  ",1)_" "_$P(X,"  ",2,229)
 | 
|---|
| 150 |  Q X
 | 
|---|
| 151 | MO(X) ; Modifier             X = Modifier IEN
 | 
|---|
| 152 |  Q $P($G(^DIC(81.3,+($G(X)),0)),"^",1)
 | 
|---|