| 1 | ECXUTL5 ;ALB/JRC - Utilities for DSS Extracts ; 10/17/07 3:49pm | 
|---|
| 2 | ;;3.0;DSS EXTRACTS;**71,84,92,103,105**;Dec 22, 1997;Build 70 | 
|---|
| 3 | ; | 
|---|
| 4 | REPEAT(CHAR,TIMES) ;REPEAT A STRING | 
|---|
| 5 | ;INPUT  : CHAR - Character to repeat | 
|---|
| 6 | ;         TIMES - Number of times to repeat CHAR | 
|---|
| 7 | ;OUTPUT : s - String of CHAR that is TIMES long | 
|---|
| 8 | ;         "" - Error (bad input) | 
|---|
| 9 | ; | 
|---|
| 10 | ;CHECK INPUT | 
|---|
| 11 | Q:($G(CHAR)="") "" | 
|---|
| 12 | Q:((+$G(TIMES))=0) "" | 
|---|
| 13 | ;RETURN STRING | 
|---|
| 14 | Q $TR($J("",TIMES)," ",CHAR) | 
|---|
| 15 | INSERT(INSTR,OUTSTR,COLUMN,LENGTH) ;INSERT A STRING INTO ANOTHER | 
|---|
| 16 | ;INPUT  : INSTR - String to insert | 
|---|
| 17 | ;         OUTSTR - String to insert into | 
|---|
| 18 | ;         COLUMN - Where to begin insertion (defaults to end of OUTSTR) | 
|---|
| 19 | ;         LENGTH - Number of characters to clear from OUTSTR | 
|---|
| 20 | ;                  (defaults to length of INSTR) | 
|---|
| 21 | ;OUTPUT : s - INSTR will be placed into OUTSTR starting at COLUMN | 
|---|
| 22 | ;             using LENGTH characters | 
|---|
| 23 | ;         "" - Error (bad input) | 
|---|
| 24 | ; | 
|---|
| 25 | ;NOTE : This module is based on $$SETSTR^VALM1 | 
|---|
| 26 | ; | 
|---|
| 27 | ;CHECK INPUT | 
|---|
| 28 | Q:('$D(INSTR)) "" | 
|---|
| 29 | Q:('$D(OUTSTR)) "" | 
|---|
| 30 | S:('$D(COLUMN)) COLUMN=$L(OUTSTR)+1 | 
|---|
| 31 | S:('$D(LENGTH)) LENGTH=$L(INSTR) | 
|---|
| 32 | ;DECLARE VARIABLES | 
|---|
| 33 | N FRONT,END | 
|---|
| 34 | S FRONT=$E((OUTSTR_$J("",COLUMN-1)),1,(COLUMN-1)) | 
|---|
| 35 | S END=$E(OUTSTR,(COLUMN+LENGTH),$L(OUTSTR)) | 
|---|
| 36 | ;INSERT STRING | 
|---|
| 37 | Q FRONT_$E((INSTR_$J("",LENGTH)),1,LENGTH)_END | 
|---|
| 38 | TYPE(DFN) ;Determine patient type DBIA #2511 | 
|---|
| 39 | ;   input | 
|---|
| 40 | ;   DFN = patient ien | 
|---|
| 41 | ; | 
|---|
| 42 | ;   output | 
|---|
| 43 | ;   ECXPTYPE = patient type external value from fle 391 | 
|---|
| 44 | ; | 
|---|
| 45 | ;          AC = ACTIVE DUTY        MI = MILITARY RETIREE | 
|---|
| 46 | ;          AL = ALLIED VETERAN     NO = NON-VETERAN (OTHER) | 
|---|
| 47 | ;          CO = COLLATERAL         NS = NSC VETERAN | 
|---|
| 48 | ;          EM = EMPLOYEE           SC = SC VETERAN | 
|---|
| 49 | ;          IN = INELIGIBLE         TR = TRICARE | 
|---|
| 50 | ;          return value 0 if no data found, 1 if data found | 
|---|
| 51 | ; | 
|---|
| 52 | N TYPE,ECXPTYPE | 
|---|
| 53 | ;Check input | 
|---|
| 54 | Q:'$D(DFN) "" | 
|---|
| 55 | S (TYPE,ECXPTYPE)="" | 
|---|
| 56 | S TYPE=$G(^DPT(DFN,"TYPE")) | 
|---|
| 57 | I 'TYPE Q ECXPTYPE | 
|---|
| 58 | S ECXPTYPE=$P($G(^DG(391,TYPE,0)),U,1) | 
|---|
| 59 | S ECXPTYPE=$E(ECXPTYPE,1,2) | 
|---|
| 60 | Q ECXPTYPE | 
|---|
| 61 | CVEDT(DFN,DATE) ;Determine patient CV status DBIA #4156 | 
|---|
| 62 | ;   input | 
|---|
| 63 | ;   DFN = patient ien | 
|---|
| 64 | ; | 
|---|
| 65 | ;   output | 
|---|
| 66 | ;   ECXCVE = combat veteran status eligibility | 
|---|
| 67 | ;   ECXCVEDT = combat veteran eligibility end date | 
|---|
| 68 | ;   ECXCVENC = combat veteran encounter | 
|---|
| 69 | ;Initialize variables | 
|---|
| 70 | N CVSTAT | 
|---|
| 71 | S (CVSTAT,ECXCVE,ECXCVEDT,ECXCVENC)="" | 
|---|
| 72 | ;Check input | 
|---|
| 73 | Q:'$D(DFN) 0 | 
|---|
| 74 | ;Call CV API | 
|---|
| 75 | S CVSTAT=$$CVEDT^DGCV(DFN,DATE) | 
|---|
| 76 | I CVSTAT<1 Q 0 | 
|---|
| 77 | ;Veteran been given CV eligibility | 
|---|
| 78 | S ECXCVE=$S($P(CVSTAT,U,3)=1:"Y",$P(CVSTAT,U,3)=0:"E",1:"") | 
|---|
| 79 | ;Save CV eligibility end date and convert from FM to HL7 format | 
|---|
| 80 | S ECXCVEDT=$P(CVSTAT,U,2) | 
|---|
| 81 | S ECXCVEDT=$$FMTHL7^XLFDT(ECXCVEDT) | 
|---|
| 82 | ;Is the veteran eligible for CV in the date of encounter | 
|---|
| 83 | S ECXCVENC=$S($P(CVSTAT,U,3)=1:"Y",1:"") | 
|---|
| 84 | Q 1 | 
|---|
| 85 | NPRF ;National patient record flags DBIA #3860 | 
|---|
| 86 | N ECXARR,FLG | 
|---|
| 87 | S ECXNPRFI="",CNT=$$GETACT^DGPFAPI(ECXDFN,"ECXARR"),FLG="" | 
|---|
| 88 | I 'CNT Q | 
|---|
| 89 | F I=1:1:CNT D  Q:FLG | 
|---|
| 90 | .I ECXARR(I,"CATEGORY")["NATIONAL" S ECXNPRFI="Y",FLG=1 | 
|---|
| 91 | Q | 
|---|
| 92 | RXPTST(K) ;Rx patient status DBIA #2511 | 
|---|
| 93 | N ECXDIC,STAT | 
|---|
| 94 | S (ECXDIC,STAT)="" | 
|---|
| 95 | ;Check input | 
|---|
| 96 | Q:'$D(K) STAT | 
|---|
| 97 | S DA=K,DIC="^PS(53,",DIQ(0)="I",DIQ="ECXDIC",DR="6" | 
|---|
| 98 | D EN^DIQ1 | 
|---|
| 99 | S STAT=$G(ECXDIC(53,K,6,"I")) | 
|---|
| 100 | S STAT=$S(STAT=1:"SC",STAT=2:"AA",STAT=3:"OTH",STAT=4:"INP",STAT=5:"NON",1:"") | 
|---|
| 101 | Q STAT | 
|---|
| 102 | NONVAP(K) ;Non-va prescriber DBIA #10060 | 
|---|
| 103 | N ECXDIC,NONVAP | 
|---|
| 104 | S (ECXDIC,NONVAP)="" | 
|---|
| 105 | Q:'$D(K) NONVAP | 
|---|
| 106 | S DA=K,DIC="^VA(200,",DIQ(0)="I",DIQ="ECXDIC",DR="53.91" | 
|---|
| 107 | D EN^DIQ1 | 
|---|
| 108 | S NONVAP=$G(ECXDIC(200,K,53.91,"I")) | 
|---|
| 109 | I NONVAP S NONVAP="Y" | 
|---|
| 110 | Q NONVAP | 
|---|
| 111 | DOIVPO(K,L) ;Add destination for outpatient ivp orders | 
|---|
| 112 | ;     Input     K - DFN | 
|---|
| 113 | ;               L - Order # from Pharmacy Patient File (#55) | 
|---|
| 114 | ; | 
|---|
| 115 | ;     Output     ordering stop code | 
|---|
| 116 | ; | 
|---|
| 117 | N ECXDIC,ECXDICA,ECXDICB,DOIVPO,CLINIC,SCODE,DIC,DIQ,DR,DA | 
|---|
| 118 | S (ECXDIC,ECXDICA,ECXDICB,DOIVPO,CLINIC,SCODE)="" | 
|---|
| 119 | ;Check input | 
|---|
| 120 | Q:'K!'(L) SCODE | 
|---|
| 121 | ;Check treating specialty | 
|---|
| 122 | S SCODE=$$TSSC($G(ECXTS)) I SCODE>0 Q SCODE | 
|---|
| 123 | ;Go to pharmacy patient file (#55) and return value of field (#136) | 
|---|
| 124 | S DIC=55,DIQ(0)="I",DIQ="ECXDIC",DR="100",DR(55.01)="136",DA=K,DA(55.01)=L | 
|---|
| 125 | D EN^DIQ1 | 
|---|
| 126 | S CLINIC=$G(ECXDIC(55.01,L,136,"I")) | 
|---|
| 127 | I 'CLINIC Q SCODE | 
|---|
| 128 | ;Get stop code pointer to file 40.7 from file 44 | 
|---|
| 129 | S DIC="^SC(",DIQ(0)="I",DIQ="ECXDICA",DR="8",DA=CLINIC D EN^DIQ1 | 
|---|
| 130 | S SCODE=ECXDICA(44,CLINIC,8,"I") | 
|---|
| 131 | ;Get stop code external value | 
|---|
| 132 | S DIC="^DIC(40.7,",DIQ(0)="E",DIQ="ECXDICB",DR="1",DA=SCODE D EN^DIQ1 | 
|---|
| 133 | S SCODE=$G(ECXDICB(40.7,SCODE,1,"E")) | 
|---|
| 134 | Q SCODE | 
|---|
| 135 | ; | 
|---|
| 136 | DOUDO(K,L) ;Add destination for outpatient udp orders | 
|---|
| 137 | ;     Input     K - DFN | 
|---|
| 138 | ;               L - Order # from Pharmacy Patient File (#55) | 
|---|
| 139 | ; | 
|---|
| 140 | ;     Output     ordering stop code | 
|---|
| 141 | ; | 
|---|
| 142 | N ECXDIC,ECXDICA,ECXDICB,DOIVPO,CLINIC,SCODE,DIC,DIQ,DR,DA | 
|---|
| 143 | S (ECXDIC,ECXDICA,ECXDICB,DOIVPO,CLINIC,SCODE)="" | 
|---|
| 144 | ;Check treating specialty | 
|---|
| 145 | S SCODE=$$TSSC($G(ECXTS)) I SCODE>0 Q SCODE | 
|---|
| 146 | ;Check input | 
|---|
| 147 | Q:'K!'(L) SCODE | 
|---|
| 148 | S DIC=55,DIQ(0)="I",DIQ="ECXDIC",DR="62",DR(55.06)="130",DA=K,DA(55.06)=L | 
|---|
| 149 | D EN^DIQ1 | 
|---|
| 150 | S CLINIC=$G(ECXDIC(55.06,L,130,"I")) | 
|---|
| 151 | I 'CLINIC Q SCODE | 
|---|
| 152 | ;Get stop code pointer to file 40.7 from file 44 | 
|---|
| 153 | S DIC="^SC(",DIQ(0)="I",DIQ="ECXDICA",DR="8",DA=CLINIC D EN^DIQ1 | 
|---|
| 154 | S SCODE=ECXDICA(44,CLINIC,8,"I") | 
|---|
| 155 | ;Get stop code external value | 
|---|
| 156 | S DIC="^DIC(40.7,",DIQ(0)="E",DIQ="ECXDICB",DR="1",DA=SCODE D EN^DIQ1 | 
|---|
| 157 | S SCODE=$G(ECXDICB(40.7,SCODE,1,"E")) | 
|---|
| 158 | Q SCODE | 
|---|
| 159 | ; | 
|---|
| 160 | PHAAPI(DRUG) ;Call Pharmacy drug file API dbia 4483 | 
|---|
| 161 | ;   Input: drug file (#50) ien | 
|---|
| 162 | ; | 
|---|
| 163 | ;   Output: generic name ^ classification ^ ndc ^ dea hand | 
|---|
| 164 | ;            ^ ndf file entry # ^ psndf va product entry ^ | 
|---|
| 165 | ;            price per disp unit ^ dispense unit | 
|---|
| 166 | ; | 
|---|
| 167 | ;Initialize variables and scratch global | 
|---|
| 168 | N NAME,CLASS,NDC,INV,NDF,P1,P3,PPDU,UNIT,ARRAY,DATA | 
|---|
| 169 | S (NAME,CLASS,NDC,INV,NDF,P1,P3,PPDU,ARRAY,DATA)="" | 
|---|
| 170 | S ARRAY="^TMP($J,""ECXLIST"")" | 
|---|
| 171 | K @ARRAY | 
|---|
| 172 | D DATA^PSS50(DRUG,,,,,"ECXLIST") | 
|---|
| 173 | I @ARRAY@(0)'>0 Q "^^^^^^" | 
|---|
| 174 | S NAME=@ARRAY@(DRUG,.01),CLASS=@ARRAY@(DRUG,2),NDC=@ARRAY@(DRUG,31) | 
|---|
| 175 | S INV=@ARRAY@(DRUG,3),P1=$P(@ARRAY@(DRUG,20),U),P3=$P(@ARRAY@(DRUG,22),U),PPDU=@ARRAY@(DRUG,16),UNIT=@ARRAY@(DRUG,14.5) | 
|---|
| 176 | K @ARRAY | 
|---|
| 177 | Q NAME_U_CLASS_U_NDC_U_INV_U_P1_U_P3_U_PPDU_U_UNIT | 
|---|
| 178 | ; | 
|---|
| 179 | TSSC(X) ;Check treating specialty (ts) and if ts equals any of the following | 
|---|
| 180 | ;18,23,24,36,41,65,94 then assign predefined code and return value | 
|---|
| 181 | ; | 
|---|
| 182 | ;    Input: treating specialty | 
|---|
| 183 | ;    Output: Ordering stop code | 
|---|
| 184 | ; | 
|---|
| 185 | S CODE=$S(X=18:293,X=23:295,X=24:290,X=36:294,X=41:296,X=65:291,X=94:292,1:"") | 
|---|
| 186 | Q CODE | 
|---|
| 187 | ; | 
|---|
| 188 | PSJ59P5(X) ;Get iv room division | 
|---|
| 189 | ;   Input  X - iv room ien | 
|---|
| 190 | ; | 
|---|
| 191 | ;   Output - field .02 division | 
|---|
| 192 | ;Init variables | 
|---|
| 193 | N DIV S DIV="" | 
|---|
| 194 | ;Check input | 
|---|
| 195 | I 'X  Q DIV | 
|---|
| 196 | D ALL^PSJ59P5(X,,"ECXDIV") | 
|---|
| 197 | S DIV=$P($G(^TMP($J,"ECXDIV",X,.02)),U) | 
|---|
| 198 | K ^TMP($J,"ECXDIV") | 
|---|
| 199 | Q DIV | 
|---|
| 200 | ; | 
|---|
| 201 | SCRX(IEN) ;Service connected prescription | 
|---|
| 202 | ;Init variables | 
|---|
| 203 | N DIC,DR,DA,ECXDIQ | 
|---|
| 204 | ;Check input | 
|---|
| 205 | I '$G(IEN) Q "" | 
|---|
| 206 | S DIC=52,DR="116",DA=IEN,DIQ="ECXDIQ" | 
|---|
| 207 | D DIQ^PSODI(DIC,DIC,DR,DA,DIQ) | 
|---|
| 208 | Q $S($G(ECXDIQ(52,DA,116))="YES":"Y",$G(ECXDIQ(52,DA,116))="NO":"N",1:"") | 
|---|
| 209 | ; | 
|---|
| 210 | SSN(SSN,FILE) ; extended validation of ssn | 
|---|
| 211 | ;       input:     ssn - social security number to validate | 
|---|
| 212 | ;                  file - optional "", 2 or 67, the only check is for | 
|---|
| 213 | ;                         reference lab file (#67) in which case ssn | 
|---|
| 214 | ;                         "000123456" is considered a valid ssn. | 
|---|
| 215 | ;        output:   0 - test patient or invalid ssn | 
|---|
| 216 | ;                  1 - valid ssn | 
|---|
| 217 | ; | 
|---|
| 218 | ;check input | 
|---|
| 219 | I $G(SSN)']"" Q 0 | 
|---|
| 220 | S FILE=$G(FILE) | 
|---|
| 221 | I (FILE=67)&(SSN="000123456") Q 1 | 
|---|
| 222 | I "89"[$E(SSN) Q 0 | 
|---|
| 223 | I (SSN="123456789")!(SSN="111111111")!(SSN="222222222")!(SSN="333333333")!(SSN="444444444")!(SSN="555555555")!($E(SSN,1,3)="666")!($E(SSN,4,5)="00")!($E(SSN,1,3)="000") Q 0 | 
|---|
| 224 | Q 1 | 
|---|