| 1 | PXRMINTR ; SLC/PKR/PJH - Input transforms for Clinical Reminders.;04/17/2006 | 
|---|
| 2 | ;;2.0;CLINICAL REMINDERS;**4**;Feb 04, 2005;Build 21 | 
|---|
| 3 | ;======================================================= | 
|---|
| 4 | VASP(DA,X) ;Check for valid associate sponsor in file 811.6. | 
|---|
| 5 | ;Do not execute as part of a verify fields. | 
|---|
| 6 | I $G(DIUTIL)="VERIFY FIELDS" Q 1 | 
|---|
| 7 | ;Do not execute as part of exchange. | 
|---|
| 8 | I $G(PXRMEXCH) Q 1 | 
|---|
| 9 | ;Make sure that an associated sponsor does not point to itself. | 
|---|
| 10 | I X=DA D  Q 0 | 
|---|
| 11 | . D EN^DDIOL("An associated sponsor cannot point to itself.") | 
|---|
| 12 | ;A sponsor cannot be an associated sponsor if it contains associated | 
|---|
| 13 | ;sponsors. | 
|---|
| 14 | I $D(^PXRMD(811.6,X,2,"B")) D  Q 0 | 
|---|
| 15 | . D EN^DDIOL("A sponsor cannot be selected as an associated sponsor if it contains associated sponsors.") | 
|---|
| 16 | ;The class of an associated sponsor must match that of the sponsor. | 
|---|
| 17 | N ASCLASS,SCLASS | 
|---|
| 18 | S SCLASS=$P(^PXRMD(811.6,DA,0),U,2) | 
|---|
| 19 | S ASCLASS=$P(^PXRMD(811.6,X,0),U,2) | 
|---|
| 20 | I ASCLASS'=SCLASS D  Q 0 | 
|---|
| 21 | . N TEXT | 
|---|
| 22 | . S TEXT="The associated sponsor's class is "_ASCLASS_", it does not match the sponsor's class which is "_SCLASS_". They must match." | 
|---|
| 23 | . D EN^DDIOL(TEXT) | 
|---|
| 24 | Q 1 | 
|---|
| 25 | ; | 
|---|
| 26 | ;======================================================= | 
|---|
| 27 | VCLASS(X) ;Check for valid CLASS field, ordinary users cannot create | 
|---|
| 28 | ;National classes. | 
|---|
| 29 | ;Do not execute as part of a verify fields. | 
|---|
| 30 | I $G(DIUTIL)="VERIFY FIELDS" Q 1 | 
|---|
| 31 | ;Do not execute as part of exchange. | 
|---|
| 32 | I $G(PXRMEXCH) Q 1 | 
|---|
| 33 | I (X["N"),(($G(PXRMINST)'=1)!(DUZ(0)'="@")) D  Q 0 | 
|---|
| 34 | . D EN^DDIOL("You are not allowed to create a NATIONAL class") | 
|---|
| 35 | E  Q 1 | 
|---|
| 36 | ; | 
|---|
| 37 | ;======================================================= | 
|---|
| 38 | VDT(X) ;Check for a valid date/time. Input transform on | 
|---|
| 39 | ;beginning date/time and ending date/time fields. | 
|---|
| 40 | N FMDATE,VALID | 
|---|
| 41 | S FMDATE=$$CTFMD^PXRMDATE(X) | 
|---|
| 42 | S VALID=$S(FMDATE=-1:0,1:1) | 
|---|
| 43 | I 'VALID D | 
|---|
| 44 | . N TEXT | 
|---|
| 45 | . S TEXT=X_" is not a valid date/time" | 
|---|
| 46 | . D EN^DDIOL(TEXT) | 
|---|
| 47 | Q VALID | 
|---|
| 48 | ; | 
|---|
| 49 | ;======================================================= | 
|---|
| 50 | VFINDING(X) ;Check X to see if it is a valid finding. This is the input | 
|---|
| 51 | ;transform on the .01 field of the reminder findings multiple. Data | 
|---|
| 52 | ;element 811.902,.01. | 
|---|
| 53 | ;Include stubs for all possible finding types in case we need input | 
|---|
| 54 | ;transforms on them. | 
|---|
| 55 | ;I X["AUTTEDT(" Q 1 | 
|---|
| 56 | ;I X["AUTTEXAM(" Q 1 | 
|---|
| 57 | I X["AUTTHF(" Q $$VHF(X) | 
|---|
| 58 | ;I X["AUTTIMM(" Q 1 | 
|---|
| 59 | ;I X["AUTTSK(" Q 1 | 
|---|
| 60 | ;I X["GMRD(120.51," Q 1 | 
|---|
| 61 | I X["LAB(60," Q $$VLAB(X) | 
|---|
| 62 | ;I X["ORD(101.43," Q 1 | 
|---|
| 63 | I X["PXD(811.2," Q $$VTAX(X) | 
|---|
| 64 | ;I X["PXRMD(811.4," Q 1 | 
|---|
| 65 | ;I X["PXRMD(811.5," Q 1 | 
|---|
| 66 | ;I X["PS(50.605," Q 1 | 
|---|
| 67 | ;I X["PSDRUG(" Q 1 | 
|---|
| 68 | ;I X["PSNDF(50.6," Q 1 | 
|---|
| 69 | ;I X["RAMIS(71," Q 1 | 
|---|
| 70 | I X["YTT(601," Q $$VMH(X) | 
|---|
| 71 | Q 1 | 
|---|
| 72 | ; | 
|---|
| 73 | ;======================================================= | 
|---|
| 74 | VHF(X) ;Check for valid health factor findings. It must be a factor, not | 
|---|
| 75 | ;a category. | 
|---|
| 76 | N CAT,IEN,TEMP,TYPE | 
|---|
| 77 | S IEN=$P(X,";",1) | 
|---|
| 78 | S TEMP=$G(^AUTTHF(IEN,0)) | 
|---|
| 79 | S TYPE=$P(TEMP,U,10) | 
|---|
| 80 | I TYPE="C" D  Q 0 | 
|---|
| 81 | . D EN^DDIOL("Category health factors cannot be used in reminder definitions!") | 
|---|
| 82 | I TYPE'="F" D  Q 0 | 
|---|
| 83 | . D EN^DDIOL("Only factor health factors can be used in reminder definitions!") | 
|---|
| 84 | ;Make sure that the health factor has a category. | 
|---|
| 85 | S CAT=$P(TEMP,U,3) | 
|---|
| 86 | I CAT="" D  Q 0 | 
|---|
| 87 | . D EN^DDIOL("Factor health factors must have a category!") | 
|---|
| 88 | Q 1 | 
|---|
| 89 | ; | 
|---|
| 90 | ;======================================================= | 
|---|
| 91 | VIGNAC(X) ;Check X to see if it contains valid IGNORE ON N/A codes. | 
|---|
| 92 | ;This is part of the input transform for this field. The length of the | 
|---|
| 93 | ;IGNORE ON N/A field is 8 characters. The valid codes are: | 
|---|
| 94 | ;   A - age | 
|---|
| 95 | ;   I - inactive | 
|---|
| 96 | ;   R - race | 
|---|
| 97 | ;   S - sex | 
|---|
| 98 | ;   * - wildcard matches anything. | 
|---|
| 99 | N LEN | 
|---|
| 100 | S LEN=$L(X) | 
|---|
| 101 | I (LEN>8)!(LEN<1) Q 0 | 
|---|
| 102 | ; | 
|---|
| 103 | N TEMP,TEXT | 
|---|
| 104 | S TEMP=X | 
|---|
| 105 | S TEMP=$TR(TEMP,"A","") | 
|---|
| 106 | S TEMP=$TR(TEMP,"I","") | 
|---|
| 107 | S TEMP=$TR(TEMP,"R","") | 
|---|
| 108 | S TEMP=$TR(TEMP,"S","") | 
|---|
| 109 | S TEMP=$TR(TEMP,"*","") | 
|---|
| 110 | ;At this point TEMP should be NULL,if it is not then there are | 
|---|
| 111 | ;bad codes. | 
|---|
| 112 | S LEN=$L(TEMP) | 
|---|
| 113 | I LEN=1 D  Q 0 | 
|---|
| 114 | . S TEXT=TEMP_" is not a valid IGNORE ON N/A code!" | 
|---|
| 115 | . D EN^DDIOL(TEXT) | 
|---|
| 116 | I LEN>1 D  Q 0 | 
|---|
| 117 | . S TEXT=TEMP_" are not valid IGNORE ON N/A codes!" | 
|---|
| 118 | . D EN^DDIOL(TEXT) | 
|---|
| 119 | Q 1 | 
|---|
| 120 | ; | 
|---|
| 121 | ;======================================================= | 
|---|
| 122 | VLAB(X) ;Check for valid lab findings. Everything but a panel is ok. | 
|---|
| 123 | I X'["LAB(60" Q 1 | 
|---|
| 124 | N DATANAME,LAB0,LABTEST,SUB,TEST,TEXT | 
|---|
| 125 | S LABTEST=$P(X,";",1) | 
|---|
| 126 | ;DBIA #91-A | 
|---|
| 127 | S LAB0=^LAB(60,LABTEST,0) | 
|---|
| 128 | S SUB=$P(LAB0,U,4) | 
|---|
| 129 | ;BB and WK not allowed | 
|---|
| 130 | I (SUB="BB")!(SUB="WK") D  Q 0 | 
|---|
| 131 | . S TEXT=SUB_" tests cannot be used as reminder findings." | 
|---|
| 132 | . D EN^DDIOL(.TEXT) | 
|---|
| 133 | ;The concept of lab panel only applies to CH tests. | 
|---|
| 134 | I SUB'["CH" Q 1 | 
|---|
| 135 | S DATANAME=$P(LAB0,U,5) | 
|---|
| 136 | ;If DATA NAME is null then it is a panel. | 
|---|
| 137 | I DATANAME="" D  Q 0 | 
|---|
| 138 | . S TEXT(1)=$P(LAB0,U,1)_" is a lab panel, cannot be used for a reminder!" | 
|---|
| 139 | . S TEXT(2)="Contact your Lab ADPAC for help" | 
|---|
| 140 | . D EN^DDIOL(.TEXT) | 
|---|
| 141 | Q 1 | 
|---|
| 142 | ; | 
|---|
| 143 | ;======================================================= | 
|---|
| 144 | VMH(X) ;The site must have the routine YTAPI installed in order to use | 
|---|
| 145 | ;mental health instrument findings. | 
|---|
| 146 | N EXISTS | 
|---|
| 147 | S EXISTS=$$EXISTS^PXRMEXCF("YTAPI") | 
|---|
| 148 | I EXISTS Q 1 | 
|---|
| 149 | N TEXT | 
|---|
| 150 | S TEXT(1)="Your site does not have the routine YTAPI installed." | 
|---|
| 151 | S TEXT(2)="It is required in order to use Mental Instrument findings." | 
|---|
| 152 | S TEXT(3)="The routine was originally released in patch YS*5.01*53." | 
|---|
| 153 | S TEXT(4)=" " | 
|---|
| 154 | D EN^DDIOL(.TEXT) | 
|---|
| 155 | Q 0 | 
|---|
| 156 | ; | 
|---|
| 157 | ;======================================================= | 
|---|
| 158 | VNAME(NAME,FILE) ;Check for valid .01 value. | 
|---|
| 159 | ;For files 801.41, 811.2, 811.4 and 811.9 the name cannot start with VA- | 
|---|
| 160 | ;unless this is a national reminder. | 
|---|
| 161 | ;Do not execute as part of a verify fields. | 
|---|
| 162 | I $G(DIUTIL)="VERIFY FIELDS" Q 1 | 
|---|
| 163 | ;Do not execute as part of exchange. | 
|---|
| 164 | I $G(PXRMEXCH) Q 1 | 
|---|
| 165 | N STEXT,TEXT,VALID | 
|---|
| 166 | S VALID=1 | 
|---|
| 167 | I (FILE=811.2)!(FILE=811.4)!(FILE=811.9)!(FILE=801.41) D | 
|---|
| 168 | . S STEXT=$E(NAME,1,3) | 
|---|
| 169 | . I (STEXT="VA-"),(($G(PXRMINST)'=1)!(DUZ(0)'="@")) D | 
|---|
| 170 | .. S TEXT=NAME_" cannot start with ""VA-"", reserved for national distribution!" | 
|---|
| 171 | .. D EN^DDIOL(TEXT) | 
|---|
| 172 | .. H 2 | 
|---|
| 173 | .. S VALID=0 | 
|---|
| 174 | Q VALID | 
|---|
| 175 | ; | 
|---|
| 176 | ;======================================================= | 
|---|
| 177 | VSPONSOR(X) ;Make sure file Class and Sponsor Class match. | 
|---|
| 178 | ;If there is no sponsor don't do the check. | 
|---|
| 179 | I X="" Q 1 | 
|---|
| 180 | ;Do not execute as part of a verify fields. | 
|---|
| 181 | I $G(DIUTIL)="VERIFY FIELDS" Q 1 | 
|---|
| 182 | ;Do not execute as part of exchange. | 
|---|
| 183 | I $G(PXRMEXCH) Q 1 | 
|---|
| 184 | N FCLASS,FILENUM,SCLASS,TEXT,VALID | 
|---|
| 185 | S VALID=1 | 
|---|
| 186 | I $G(X)="" Q VALID | 
|---|
| 187 | I $G(DIC)="" Q 0 | 
|---|
| 188 | S FILENUM=+$P(@(DIC_"0)"),U,2) | 
|---|
| 189 | S FCLASS=$P(@(DIC_DA_",100)"),U,1) | 
|---|
| 190 | S SCLASS=$P(^PXRMD(811.6,X,100),U,1) | 
|---|
| 191 | I SCLASS'=FCLASS D | 
|---|
| 192 | . S FCLASS=$$EXTERNAL^DILFD(FILENUM,100,"",FCLASS) | 
|---|
| 193 | . S SCLASS=$$EXTERNAL^DILFD(811.6,100,"",SCLASS) | 
|---|
| 194 | . S TEXT="Sponsor Class is "_SCLASS_", File Class is "_FCLASS_" they must match!" | 
|---|
| 195 | . D EN^DDIOL(TEXT) | 
|---|
| 196 | . S VALID=0 | 
|---|
| 197 | Q VALID | 
|---|
| 198 | ; | 
|---|
| 199 | ;======================================================= | 
|---|
| 200 | VTAX(X) ;Make sure the taxonomy is active. | 
|---|
| 201 | N IEN,INACTIVE | 
|---|
| 202 | S IEN=$P(X,";",1) | 
|---|
| 203 | S INACTIVE=$P(^PXD(811.2,IEN,0),U,6) | 
|---|
| 204 | I INACTIVE D  Q 0 | 
|---|
| 205 | . D EN^DDIOL("This taxonomy is inactive and cannot be selected.") | 
|---|
| 206 | E  Q 1 | 
|---|
| 207 | ; | 
|---|
| 208 | ;======================================================= | 
|---|
| 209 | VTPER(X) ;Check for valid time period. They must be of the form NS, | 
|---|
| 210 | ; where N is a number and S is D for days, M for months, or Y for years. | 
|---|
| 211 | N LEN | 
|---|
| 212 | S X=$$UP^XLFSTR(X) | 
|---|
| 213 | S LEN=$L(X) | 
|---|
| 214 | I (LEN>5)!(LEN<2) Q 0 | 
|---|
| 215 | I ((X'?1N.N1"D")&(X'?1N.N1"M")&(X'?1N.N1"Y")) Q 0 | 
|---|
| 216 | Q 1 | 
|---|
| 217 | ; | 
|---|
| 218 | ;======================================================= | 
|---|
| 219 | VUSAGE(X) ;Check X to see if it contains valid USAGE codes. | 
|---|
| 220 | ;This is part of the input transform for this field. The length of the | 
|---|
| 221 | ;USAGE field is 10 characters. The valid codes are: | 
|---|
| 222 | ;   C - CPRS | 
|---|
| 223 | ;   L - Reminder Patient List | 
|---|
| 224 | ;   P - Patient | 
|---|
| 225 | ;   R - Reports | 
|---|
| 226 | ;   X - Extracts | 
|---|
| 227 | ;   * - Wildcard matches anything, except P. | 
|---|
| 228 | N LEN | 
|---|
| 229 | S LEN=$L(X) | 
|---|
| 230 | I (LEN>10)!(LEN<1) Q 0 | 
|---|
| 231 | ; | 
|---|
| 232 | N TEMP,TEXT | 
|---|
| 233 | S TEMP=$$UP^XLFSTR(X) | 
|---|
| 234 | S TEMP=$TR(TEMP,"C","") | 
|---|
| 235 | S TEMP=$TR(TEMP,"L","") | 
|---|
| 236 | S TEMP=$TR(TEMP,"P","") | 
|---|
| 237 | S TEMP=$TR(TEMP,"R","") | 
|---|
| 238 | S TEMP=$TR(TEMP,"X","") | 
|---|
| 239 | S TEMP=$TR(TEMP,"*","") | 
|---|
| 240 | ;At this point TEMP should be NULL,if it is not then there are | 
|---|
| 241 | ;bad codes. | 
|---|
| 242 | S LEN=$L(TEMP) | 
|---|
| 243 | I LEN=1 D  Q 0 | 
|---|
| 244 | . S TEXT=TEMP_" is not a valid USAGE code!" | 
|---|
| 245 | . D EN^DDIOL(TEXT) | 
|---|
| 246 | I LEN>1 D  Q 0 | 
|---|
| 247 | . S TEXT=TEMP_" are not valid USAGE codes!" | 
|---|
| 248 | . D EN^DDIOL(TEXT) | 
|---|
| 249 | Q 1 | 
|---|