| 1 | LEXSRC2 ; ISL/KER/FJF Classification Code Source Util ; 01/01/2004 | 
|---|
| 2 | ;;2.0;LEXICON UTILITY;**25,28**;Sep 23, 1996 | 
|---|
| 3 | ; | 
|---|
| 4 | ; External References | 
|---|
| 5 | ;   DBIA  3992  $$STATCHK^ICDAPIU | 
|---|
| 6 | ;   DBIA  1997  $$STATCHK^ICPTAPIU | 
|---|
| 7 | ;   DBIA 10103  $$DT^XLFDT | 
|---|
| 8 | ; | 
|---|
| 9 | Q | 
|---|
| 10 | CPT(LEXC,LEXVDT) ; Return Pointer to Active CPT | 
|---|
| 11 | ; | 
|---|
| 12 | ; Input  CPT Code | 
|---|
| 13 | ; Output IEN file 81 of Active Codes only | 
|---|
| 14 | S LEXC=$G(LEXC) Q:'$L(LEXC) ""  S LEXVDT=$G(LEXVDT) S:+LEXVDT'>0 LEXVDT=$$DT^XLFDT | 
|---|
| 15 | S LEXC=$$STATCHK^ICPTAPIU(LEXC,LEXVDT) Q:+LEXC'>0 ""  S LEXC=$P(LEXC,"^",2) Q:+LEXC'>0 "" | 
|---|
| 16 | Q +LEXC | 
|---|
| 17 | ; | 
|---|
| 18 | ICD(LEXC,LEXVDT) ; Return Pointer to Active ICD/ICP | 
|---|
| 19 | ; | 
|---|
| 20 | ; Input ICD9 or ICD0 Code | 
|---|
| 21 | ; Output IEN file 80 or 80.1 of Active Codes only | 
|---|
| 22 | S LEXC=$G(LEXC) Q:'$L(LEXC) ""  S LEXVDT=$G(LEXVDT) S:+LEXVDT'>0 LEXVDT=$$DT^XLFDT | 
|---|
| 23 | S LEXC=$$STATCHK^ICDAPIU(LEXC,LEXVDT) Q:+LEXC'>0 ""  S LEXC=$P(LEXC,"^",2) Q:+LEXC'>0 "" | 
|---|
| 24 | Q +LEXC | 
|---|
| 25 | ; | 
|---|
| 26 | STATCHK(CODE,CDT,LEX) ; Check Status of a Code | 
|---|
| 27 | ; | 
|---|
| 28 | ; Input: | 
|---|
| 29 | ;   CODE - Any Code (ICD/CPT/DSM etc) | 
|---|
| 30 | ;   CDT  - Date to screen against (default = today) | 
|---|
| 31 | ;   LEX  - Output Array, passed by reference | 
|---|
| 32 | ; | 
|---|
| 33 | ; Output: | 
|---|
| 34 | ; | 
|---|
| 35 | ;   2-Piece String containing the code's status | 
|---|
| 36 | ;   and the IEN if the code exists, else -1. | 
|---|
| 37 | ;   The following are possible outputs: | 
|---|
| 38 | ;           1 ^ IEN         Active Code | 
|---|
| 39 | ;           0 ^ IEN         Inactive Code | 
|---|
| 40 | ;           0 ^ -1          Code not Found | 
|---|
| 41 | ; | 
|---|
| 42 | ;   ASTM Triplet in array LEX passed by reference (optional) | 
|---|
| 43 | ; | 
|---|
| 44 | ;     LEX(0) = <ien 757.02> ^ <code> | 
|---|
| 45 | ;              2-Piece String containing the IEN of | 
|---|
| 46 | ;              the code and the code | 
|---|
| 47 | ; | 
|---|
| 48 | ;     LEX(1) = <ien 757.01> ^ <expression> | 
|---|
| 49 | ;              2-Piece String containing the IEN of | 
|---|
| 50 | ;              the code's expression and the expression | 
|---|
| 51 | ; | 
|---|
| 52 | ;     LEX(2) = <ien 757.03> ^ <abbr> ^ <nomen> ^ <name> | 
|---|
| 53 | ;              4-Piece String containing the IEN of | 
|---|
| 54 | ;              the code's classification system, the | 
|---|
| 55 | ;              source abbreviation, Nomenclature and | 
|---|
| 56 | ;              the name of the classification system | 
|---|
| 57 | ; | 
|---|
| 58 | ; This API requires the ACT Cross-Reference | 
|---|
| 59 | ;       ^LEX(757.02,"ACT",<code>,<status>,<date>,<ien>) | 
|---|
| 60 | ; | 
|---|
| 61 | ; | 
|---|
| 62 | N LEXC,LEXAIEN,LEXIEN,LEXDT,X,PREVACT,PREVINA,MOSTREC,STATUS | 
|---|
| 63 | S LEXC=$G(CODE) I '$L(LEXC) S (LEX,X)="0^-1" D UPD Q X | 
|---|
| 64 | S LEXDT=$P($G(CDT),".",1),LEXDT=$S(+LEXDT>0:LEXDT,1:$$DT^XLFDT) | 
|---|
| 65 | ; | 
|---|
| 66 | ; Find preceding date for active codes | 
|---|
| 67 | S PREVACT=+$O(^LEX(757.02,"ACT",LEXC_" ",3,LEXDT+.00001),-1) | 
|---|
| 68 | S LEXAIEN=0 S:+PREVACT>0 LEXAIEN=+$O(^LEX(757.02,"ACT",LEXC_" ",3,+PREVACT," "),-1) | 
|---|
| 69 | ; | 
|---|
| 70 | ; Find preceding date for inactive codes | 
|---|
| 71 | S PREVINA=+$O(^LEX(757.02,"ACT",LEXC_" ",2,LEXDT+.00001),-1) | 
|---|
| 72 | S:+LEXAIEN>0&(+$O(^LEX(757.02,"ACT",LEXC_" ",2,PREVINA," "),-1)'=LEXAIEN) PREVINA=0 | 
|---|
| 73 | ; | 
|---|
| 74 | ; Check that both are not zero | 
|---|
| 75 | I PREVACT=0,PREVINA=0 S (LEX,X)="0^-1" D UPD Q X | 
|---|
| 76 | ; | 
|---|
| 77 | ; Find the most recent of the two dates and matching status | 
|---|
| 78 | S MOSTREC=$S(PREVACT>PREVINA:PREVACT,1:PREVINA) | 
|---|
| 79 | S STATUS=$S(PREVACT>PREVINA:1,1:0) | 
|---|
| 80 | ; | 
|---|
| 81 | ; Now cope with difficulties arising from boundary conditions | 
|---|
| 82 | I $$BOUND D | 
|---|
| 83 | .S STATUS='STATUS | 
|---|
| 84 | .S MOSTREC=$O(^LEX(757.02,"ACT",LEXC_" ",STATUS+2,LEXDT),-1) | 
|---|
| 85 | ; | 
|---|
| 86 | ; Get code IEN | 
|---|
| 87 | S LEXIEN=$O(^LEX(757.02,"ACT",LEXC_" ",STATUS+2,MOSTREC,"")) | 
|---|
| 88 | ; | 
|---|
| 89 | ; Quit with valid status and code IEN | 
|---|
| 90 | S (LEX,X)=STATUS_"^"_LEXIEN D UPD | 
|---|
| 91 | Q X | 
|---|
| 92 | ; | 
|---|
| 93 | BOUND() ; Do we have a boundary? | 
|---|
| 94 | ; Check if we have an entry for the next day of the complementary | 
|---|
| 95 | ; status, if so then we need to obtain the status for the | 
|---|
| 96 | ; preceding day | 
|---|
| 97 | I $D(^LEX(757.02,"ACT",LEXC_" ",2+'STATUS,$$DPLUS1(MOSTREC))) Q 1 | 
|---|
| 98 | Q 0 | 
|---|
| 99 | ; | 
|---|
| 100 | DPLUS1(DATE)    ; Add a day to the date | 
|---|
| 101 | ; | 
|---|
| 102 | Q $$HTFM^XLFDT($$FMTH^XLFDT(DATE)+1) | 
|---|
| 103 | ; | 
|---|
| 104 | UPD ; Update Array | 
|---|
| 105 | N LEXI,LEXC,LEXN,LEXE,LEXS S LEXI=+($P($G(X),"^",2)) Q:+LEXI'>0 | 
|---|
| 106 | S LEXN=$G(^LEX(757.02,+LEXI,0)),LEXE=+LEXN,LEXC=$P(LEXN,"^",2) | 
|---|
| 107 | S LEXS=+($P(LEXN,"^",3)),LEX(0)=+LEXI_"^"_LEXC | 
|---|
| 108 | S LEX(1)=LEXE_"^"_$P($G(^LEX(757.01,+LEXE,0)),"^",1) | 
|---|
| 109 | S LEX(2)=LEXS_"^"_$P($G(^LEX(757.03,+LEXS,0)),"^",1,3) | 
|---|
| 110 | Q | 
|---|
| 111 | PI(X) ; Preferred IEN for code X | 
|---|
| 112 | N LEXE,LEXLA,LEXA,LEXS,LEXC,LEXP,LEXPF,LEXF,LEXI,LEXC,LEXFL | 
|---|
| 113 | S LEXC=$G(X) Q:'$L(LEXC) ""  S (LEXP,LEXF,LEXI)=0,LEXPF(0)=LEXC | 
|---|
| 114 | F  S LEXI=$O(^LEX(757.02,"CODE",(LEXC_" "),LEXI)) Q:+LEXI=0!(LEXP>0)  D | 
|---|
| 115 | . S:+LEXF'>0 LEXF=LEXI S LEXFL=$S(+($P($G(^LEX(757.02,+LEXI,0)),"^",5))>0:1,1:0) | 
|---|
| 116 | . S LEXE=0,LEXLA="" F  S LEXE=$O(^LEX(757.02,+LEXI,4,LEXE)) Q:+LEXE=0  D | 
|---|
| 117 | . . S LEXS=$P($G(^LEX(757.02,+LEXI,4,LEXE,0)),"^",2) Q:+LEXS'>0 | 
|---|
| 118 | . . S LEXA=$P($G(^LEX(757.02,+LEXI,4,LEXE,0)),"^",1) | 
|---|
| 119 | . . S:+LEXA>+LEXLA LEXLA=+LEXA | 
|---|
| 120 | . S:+LEXLA>0 LEXPF(LEXFL,LEXLA,LEXI)="" | 
|---|
| 121 | S X="" I $D(LEXPF(1)) S X=$O(LEXPF(1," "),-1),X=$O(LEXPF(1,+X," "),-1) | 
|---|
| 122 | I '$D(LEXPF(1)),$D(LEXPF(0)) S X=$O(LEXPF(0," "),-1),X=$O(LEXPF(0,+X," "),-1) | 
|---|
| 123 | Q X | 
|---|
| 124 | ; | 
|---|
| 125 | HIST(CODE,ARY) ; Activation History | 
|---|
| 126 | ; | 
|---|
| 127 | ; Input: | 
|---|
| 128 | ;    CODE - Code - REQUIRED | 
|---|
| 129 | ;    .ARY - Array, passed by Reference | 
|---|
| 130 | ; | 
|---|
| 131 | ; Output: | 
|---|
| 132 | ;    ARY(0) = Number of Activation History Entries | 
|---|
| 133 | ;    ARY(<date>) = status    where: 1 is Active | 
|---|
| 134 | ;    ARY("IEN") = <ien> | 
|---|
| 135 | ; | 
|---|
| 136 | N LEXC,LEXI,LEXN,LEXD,LEXF,LEXO S LEXC=$G(CODE) Q:'$L(LEXC) -1 | 
|---|
| 137 | S LEXI=$$PI(LEXC),ARY("IEN")=LEXI,LEXO="" | 
|---|
| 138 | M LEXO=^LEX(757.02,+LEXI,4) K LEXO("B") | 
|---|
| 139 | S ARY(0)=+($P($G(LEXO(0)),U,4)) | 
|---|
| 140 | S:+ARY(0)=0 ARY(0)=-1 K:ARY(0)=-1 ARY("IEN") | 
|---|
| 141 | S (LEXI,LEXC)=0 F  S LEXI=$O(LEXO(LEXI)) Q:+LEXI=0  D | 
|---|
| 142 | . S LEXD=$P($G(LEXO(LEXI,0)),U,1) Q:+LEXD=0 | 
|---|
| 143 | . S LEXF=$P($G(LEXO(LEXI,0)),U,2) Q:'$L(LEXF) | 
|---|
| 144 | . S LEXC=LEXC+1,ARY(0)=LEXC,ARY(LEXD)=LEXF | 
|---|
| 145 | Q ARY(0) | 
|---|