1 | ICPTMOD2 ;ALB/DEK/KER - CPT MODIFIER APIS ;08/18/2007
|
---|
2 | ;;6.0;CPT/HCPCS;**30,37**;May 19, 1997;Build 25
|
---|
3 | ;
|
---|
4 | ; Global Variables
|
---|
5 | ; ^DIC(81.3
|
---|
6 | ; ^ICPT(
|
---|
7 | ;
|
---|
8 | ; External References
|
---|
9 | ; $$DT^XLFDT DBIA 10103
|
---|
10 | ; $$FMADD^XLFDT DBIA 10103
|
---|
11 | ;
|
---|
12 | Q
|
---|
13 | MODA ; Create an array of Modifiers for a CPT Code
|
---|
14 | ;
|
---|
15 | ; Input
|
---|
16 | ;
|
---|
17 | ; CODE CPT/HCPCS Code ?7N / ?1A4N / ?4N1A
|
---|
18 | ; VDT Versioning Date (date service provided)
|
---|
19 | ; .ARY Name of a Local Array passed by value
|
---|
20 | ;
|
---|
21 | ; Output
|
---|
22 | ;
|
---|
23 | ; ARY Only returns Active Modifiers
|
---|
24 | ; ARY(0) = 4 Piece String
|
---|
25 | ; 4 Piece String
|
---|
26 | ; 1 # of Modifiers found for code CODE (input)
|
---|
27 | ; 2 # of Modifiers w/Active Ranges
|
---|
28 | ; 3 # of Modifiers w/Inactive Ranges
|
---|
29 | ; 4 Code
|
---|
30 | ;
|
---|
31 | ; ARY(ST,MOD) = 8 Piece Output String
|
---|
32 | ;
|
---|
33 | ; ST Status A=Active I=Inactive
|
---|
34 | ; MOD Modifier (external format)
|
---|
35 | ; 8 Piece String
|
---|
36 | ; 1 IEN of Modifier
|
---|
37 | ; 2 Versioned Short Text (name)
|
---|
38 | ; 3 Activation date of Modifier
|
---|
39 | ; 4 Beginning Range Code
|
---|
40 | ; 5 Ending Range Code
|
---|
41 | ; 6 Activation Date of Range
|
---|
42 | ; 7 Inactivation Date of Range
|
---|
43 | ; 8 Modifier Identifier
|
---|
44 | ;
|
---|
45 | N A,EFF,I,ID,MIEN,MOD,SRC,ST,X K ARY
|
---|
46 | S CODE=$G(CODE) Q:'$D(^ICPT("BA",(CODE_" ")))
|
---|
47 | S VDT=$G(VDT) S:+VDT'>0 VDT=$$DT^XLFDT Q:VDT'?7N
|
---|
48 | S SRC=3,MIEN=0 F S MIEN=$O(^DIC(81.3,MIEN)) Q:+MIEN'>0 D
|
---|
49 | . S (EFF,ST)=$O(^DIC(81.3,MIEN,60,"B"," "),-1) Q:ST'>0 S ST=$O(^DIC(81.3,MIEN,60,"B",ST," "),-1) Q:ST'>0 S ST=$P($G(^DIC(81.3,MIEN,60,ST,0)),"^",2) Q:ST'>0
|
---|
50 | . S MOD=$P($G(^DIC(81.3,MIEN,0)),"^",1) Q:'$L(MOD)
|
---|
51 | . S X=$$MODP(CODE,MIEN,"I",VDT,0) S ID=$P(X,"^",6) S ID=$S(+ID>0:"I",1:"A")
|
---|
52 | . S:+X>0 ARY(ID,MOD)=$P(X,"^",1,2)_"^"_EFF_"^"_$P(X,"^",3,7)
|
---|
53 | S (A,I)=0,ST="" F S ST=$O(ARY(ST)) Q:ST="" S MOD="" F S MOD=$O(ARY(ST,MOD)) Q:MOD="" S:ST="A" A=A+1 S:ST="I" I=I+1
|
---|
54 | S ST=A+I,ARY(0)=ST_"^"_A_"^"_I_"^"_CODE
|
---|
55 | Q
|
---|
56 | ;
|
---|
57 | MODP(CODE,MOD,MFT,MDT,SRC,DFN) ; Check if modifier can be used with code (pair)
|
---|
58 | ;
|
---|
59 | ; Input:
|
---|
60 | ;
|
---|
61 | ; CODE CPT/HCPCS Code ?7N / ?1A4N / ?4N1A
|
---|
62 | ; MOD Modifier (External or Internal)
|
---|
63 | ; MFT Modifier Format "E" - or "I"
|
---|
64 | ; VDT Date service provided
|
---|
65 | ; SRC Source Screen
|
---|
66 | ; If 0 or Null, Level I and II modifiers
|
---|
67 | ; If >0, Level I, II, and III modifiers
|
---|
68 | ; Output:
|
---|
69 | ;
|
---|
70 | ; If pair is acceptable - Positive "^" Delimited String
|
---|
71 | ;
|
---|
72 | ; 1 - IEN of CPT Modifier
|
---|
73 | ; 2 - Versioned Short Text
|
---|
74 | ; 3 - Beginning Code for Code Range
|
---|
75 | ; 4 - Ending Code for Code Range
|
---|
76 | ; 5 - Code Range Activaiton Date
|
---|
77 | ; 6 - Code Range Inactivation Date
|
---|
78 | ; 7 - Modifier Identifier
|
---|
79 | ;
|
---|
80 | ; If pair is unacceptable
|
---|
81 | ;
|
---|
82 | ; 0 or
|
---|
83 | ; -1 with error message
|
---|
84 | ;
|
---|
85 | N ADT,BEGA,BEGR,CDT,CODEA,CODN,ENDA,ENDR,ICD,IDT,LACT,LINA,MIEN,MODEFF,MODI,MODNM,MODST,ND,NSTA,RIEN,RSTA,SIEN,STA,STI,STX,TA,TEFF,TI,TIEN,VDT
|
---|
86 | S:$G(MFT)="" MFT="E" Q:"^E^I^"'[("^"_MFT_"^") "-1^Invalid Modifier Format" S VDT=$P($G(MDT),".",1)
|
---|
87 | S:+VDT'?7N VDT=$$DT^XLFDT S:VDT#10000=0 VDT=VDT+101 S:VDT#100=0 VDT=VDT+1 S VDT=$S(VDT<2890101:2890101,1:VDT)
|
---|
88 | Q:+VDT'>0!(VDT'?7N) "-1^Invalid Date" I MFT="E" D I +($G(MIEN))'>0 Q "-1^Multiple Modifiers with the same name, use IEN"
|
---|
89 | . S MIEN=0 S (TIEN,TI)=0 F S TIEN=$O(^DIC(81.3,"B",MOD,TIEN)) Q:+TIEN'>0 D
|
---|
90 | . . S TEFF=$$EFF^ICPTSUPT(81.3,TIEN,VDT) Q:'$P(TEFF,"^",2) S TI=TI+1,TA(TI)=TIEN,TA(0)=TI
|
---|
91 | . S:+($G(TA(0)))=1 MIEN=+($G(TA(1)))
|
---|
92 | S:MFT="I" MIEN=+MOD S CODE=$G(CODE),CODN=$S(CODE?1.N:+CODE,1:$$CODEN^ICPTCOD(CODE)) I CODN<1!'$D(^ICPT(CODN,0)) Q "-1^NO SUCH CPT CODE"
|
---|
93 | S CODE=$P($G(^ICPT(CODN,0)),"^") Q:'$L(CODE) "-1^No such CPT Code" Q:$L(CODE)'=5 "-1^Invalid Code"
|
---|
94 | S CODEA=$S(CODE?1N.4N:+CODE,CODE?4N1A:$A($E(CODE,5))*10_$E(CODE,1,4),1:$A(CODE)_$E(CODE,2,5)) Q:+CODEA'>0 "-1^Invalid Code Source"
|
---|
95 | S MIEN=$G(MIEN) Q:+MIEN'>0 "-1^Invalid Modifier" S SRC=$S(+($G(SRC))>0:1,1:0),SIEN=$O(^ICPT("BA",(CODE_" "),0)) Q:+SIEN'>0 "-3^Invalid Code"
|
---|
96 | Q:$P($G(^ICPT(+SIEN,0)),"^",6)="L"&(SRC'>0) "-1^Invalid Code Source"
|
---|
97 | S MODEFF=$$EFF^ICPTSUPT(81.3,MIEN,VDT) Q:'$P(MODEFF,"^",2) "-1^Modifier Inactive"
|
---|
98 | S MODNM=$P($G(^DIC(81.3,MIEN,0)),"^",2) Q:'$L(MODNM) "-1^Invalid Modifier Name"
|
---|
99 | S MODI=$P($G(^DIC(81.3,MIEN,0)),"^",1) Q:'$L(MODI) "-1^Invalid Modifier ID"
|
---|
100 | S MODST=$$VSTCM^ICPTMOD(MIEN,VDT) K STX S (STA,STI)=0 S CDT=VDT+.001
|
---|
101 | S (LINA,LACT)="",RSTA=0,RIEN=0 F S RIEN=$O(^DIC(81.3,MIEN,10,RIEN)) Q:+RIEN'>0 D
|
---|
102 | . N NSTA S NSTA=0,ND=$G(^DIC(81.3,MIEN,10,RIEN,0))
|
---|
103 | . S BEGR=$P(ND,"^",1) Q:$L(BEGR)'=5 S BEGA=$S(BEGR?1N.4N:+BEGR,BEGR?4N1A:$A($E(BEGR,5))*10_$E(BEGR,1,4),1:$A(BEGR)_$E(BEGR,2,5)) Q:+CODEA<+BEGA
|
---|
104 | . S ENDR=$P(ND,"^",2) S:$L(ENDR)'=5 ENDR=BEGR S ENDA=$S(ENDR?1N.4N:+ENDR,ENDR?4N1A:$A($E(ENDR,5))*10_$E(ENDR,1,4),1:$A(ENDR)_$E(ENDR,2,5))
|
---|
105 | . Q:$L(ENDR)&(CODEA>ENDA) S ADT=$P(ND,"^",3),(ICD,IDT)=$P(ND,"^",4) S:ADT="" ADT=2890101
|
---|
106 | . I +CODEA'<+BEGA,+CODEA'>ENDA,+ADT>0,+IDT'>0 S RSTA=1,NSTA=1 S:+ADT>0&(+ADT>(+LACT)) LACT=+ADT
|
---|
107 | . I +CODEA'<+BEGA,+CODEA'>ENDA,+ADT>0,+IDT>0,CDT>ADT,CDT'>IDT S RSTA=1,NSTA=1 S:+ADT>0&(+ADT>(+LACT)) LACT=+ADT
|
---|
108 | . I +CODEA'<+BEGA,+CODEA'>ENDA,+ADT>0,+IDT>0 S:+IDT>0&(+IDT>(+LINA)) LINA=+IDT
|
---|
109 | . Q:NSTA'>0 S:'$L(IDT) IDT=$$FMADD^XLFDT($$DT^XLFDT,365) S ADT=$P(ND,"^",3),(ICD,IDT)=$P(ND,"^",4) S:ADT="" ADT=2890101
|
---|
110 | . S:'$L(IDT) IDT=$$FMADD^XLFDT($$DT^XLFDT,365) S STA=+($G(STA))+1,STX(STA)=MIEN_"^"_MODST_"^"_BEGR_"^"_ENDR_"^"_ADT_"^"_ICD_"^"_MODI,STX("B",+ADT,+STA)=""
|
---|
111 | S:+LACT>0&(+LINA>0)&(LINA'>CDT)&(+LINA>+LACT) RSTA=0
|
---|
112 | S ADT=$O(STX("B",+CDT),-1),STA=$O(STX("B",+ADT," "),-1),MOD=$G(STX(+STA))
|
---|
113 | Q:+MOD'>0 "0" Q:+RSTA'>0 "0"
|
---|
114 | Q MOD
|
---|
115 | ;
|
---|
116 | MODC(MOD) ; Checks modifier for active range including code
|
---|
117 | ;
|
---|
118 | ; Input:
|
---|
119 | ; MOD - modifier ien
|
---|
120 | ;
|
---|
121 | N MODNM,MODEFF
|
---|
122 | S MODEFF=$$EFF^ICPTSUPT(81.3,MOD,MDT)
|
---|
123 | I '$P(MODEFF,"^",2) S STR="-1^modifier inactive" Q
|
---|
124 | S PR=CODEA_.0001,PR=$O(^DIC(81.3,MOD,"M",PR),-1)
|
---|
125 | I 'PR S STR=0 Q
|
---|
126 | S PRN=^DIC(81.3,MOD,"M",PR)
|
---|
127 | I 'PRN S STR="-1^bad modifier file entry" Q
|
---|
128 | I PRN<CODEA S STR=0 Q
|
---|
129 | S MODNM=$P($G(^DIC(81.3,MOD,0)),"^",2)
|
---|
130 | S STR=MOD_"^"_MODNM
|
---|
131 | Q
|
---|
132 | ;
|
---|
133 | MULT ; Finds iens for all modifiers with same 2-letter code
|
---|
134 | ; MOD = .01, check B x-ref for dupliate .01 fields
|
---|
135 | ; Output:
|
---|
136 | ; STR - a ";" delimited string of IENS for modifier MOD
|
---|
137 | F MODN=0:0 S MODN=$O(^DIC(81.3,"B",MOD,MODN)) Q:'MODN S STR=STR_MODN_"; "
|
---|
138 | Q
|
---|