| 1 | SDAMA300 ;BPOIFO/ACS-Filter API Validate Filters ; 9/14/05 7:49am | 
|---|
| 2 | ;;5.3;Scheduling;**301,347,508**;13 Aug 1993 | 
|---|
| 3 | ;PER VHA DIRECTIVE 2004-038, DO NOT MODIFY THIS ROUTINE | 
|---|
| 4 | ; | 
|---|
| 5 | ;***************************************************************** | 
|---|
| 6 | ;              CHANGE LOG | 
|---|
| 7 | ; | 
|---|
| 8 | ;  DATE      PATCH       DESCRIPTION | 
|---|
| 9 | ;--------  ----------    ----------------------------------------- | 
|---|
| 10 | ;12/04/03  SD*5.3*301    ROUTINE COMPLETED | 
|---|
| 11 | ;08/06/04  SD*5.3*347    ADDITION OF A NEW FILTER - DATE APPOINTMENT | 
|---|
| 12 | ;                        MADE (FIELD #16) AND 2 NEW FIELDS TO RETURN: | 
|---|
| 13 | ;                        1) AUTO-REBOOKED APPT DATE/TIME (FIELD #24) | 
|---|
| 14 | ;                        2) NO-SHOW/CANCEL APPT DATE/TIME (FIELD #25) | 
|---|
| 15 | ;02/22/07  SD*5.3*508    SEE SDAMA301 FOR CHANGE LIST | 
|---|
| 16 | ;***************************************************************** | 
|---|
| 17 | ; | 
|---|
| 18 | ;***************************************************************** | 
|---|
| 19 | ; | 
|---|
| 20 | ;              VALIDATE FILTER ARRAY CONTENTS | 
|---|
| 21 | ;INPUT | 
|---|
| 22 | ;  SDARRAY    Appointment filters | 
|---|
| 23 | ;  SDFLTR     Filter Flag array | 
|---|
| 24 | ; | 
|---|
| 25 | ;OUTPUT | 
|---|
| 26 | ;  -1 if error | 
|---|
| 27 | ;   1 if no errors | 
|---|
| 28 | ; | 
|---|
| 29 | ;***************************************************************** | 
|---|
| 30 | VALARR(SDARRAY,SDFLTR) ; | 
|---|
| 31 | ;Initialize local variables | 
|---|
| 32 | N SDI,SDX,SDQUIT,SDDATA,SDCOUNT,SDERR | 
|---|
| 33 | S SDQUIT=0,SDERR=115 | 
|---|
| 34 | ; | 
|---|
| 35 | ;Set filter flags and validate input array entries | 
|---|
| 36 | F SDI="MAX","FLDS","FLTRS","SORT","VSTAPPTS","PURGED" Q:SDQUIT  D @SDI | 
|---|
| 37 | Q:(SDARRAY("CNT")=-1) -1 | 
|---|
| 38 | ;filters allowed on these fields | 
|---|
| 39 | F SDI=1:1:4,13,16 Q:SDQUIT  D | 
|---|
| 40 | . I $G(SDARRAY(SDI))']"" S SDFLTR(SDI)=0 | 
|---|
| 41 | . E  S SDFLTR(SDI)=1 D | 
|---|
| 42 | .. S SDCOUNT=$L(SDARRAY(SDI),";") | 
|---|
| 43 | .. S SDQUIT=0 | 
|---|
| 44 | .. D @SDI | 
|---|
| 45 | ; | 
|---|
| 46 | I SDQUIT=0 D | 
|---|
| 47 | . ;filters not allowed on these fields | 
|---|
| 48 | . F SDI=5:1:12,14,15,17:1:26,28:1:SDARRAY("FC") Q:SDQUIT  D NOFIL | 
|---|
| 49 | Q SDARRAY("CNT") | 
|---|
| 50 | ; | 
|---|
| 51 | ;***************************************************************** | 
|---|
| 52 | ; | 
|---|
| 53 | 1 ;SDARRAY(1): Appt dates | 
|---|
| 54 | ;validate from/to date(/time)s | 
|---|
| 55 | D CHKDTES($G(SDARRAY("FR")),$G(SDARRAY("TO"))) | 
|---|
| 56 | Q:SDQUIT | 
|---|
| 57 | ;allow seconds in date/time filter! | 
|---|
| 58 | I $L(SDARRAY("FR"))>14 D ERROR(SDERR) | 
|---|
| 59 | Q:SDQUIT | 
|---|
| 60 | I $L(SDARRAY("TO"))>14 D ERROR(SDERR) | 
|---|
| 61 | Q | 
|---|
| 62 | 2 ;SDARRAY(2): Clinic IEN | 
|---|
| 63 | ;Clinic must be on ^SC | 
|---|
| 64 | ;Clinic list is not in global | 
|---|
| 65 | I SDARRAY("CLNGBL")'=1 D | 
|---|
| 66 | . ; get each clinic IEN in the string and validate | 
|---|
| 67 | . F SDX=1:1:SDCOUNT Q:SDQUIT  D | 
|---|
| 68 | .. S SDDATA=$P(SDARRAY(2),";",SDX) | 
|---|
| 69 | .. I ($G(SDDATA)=""!'$D(^SC(SDDATA,0))) D ERROR(SDERR) Q | 
|---|
| 70 | .. D:$$CHKRSACL(SDDATA) ERROR(SDERR)    ;validate RSA Clinic (Type R) | 
|---|
| 71 | ;Clinic list is in global or local array | 
|---|
| 72 | I SDARRAY("CLNGBL")=1 D | 
|---|
| 73 | . Q:SDARRAY(2)="^SC("   ; no validation required if clinic global | 
|---|
| 74 | . S SDX=SDARRAY(2) | 
|---|
| 75 | . ;check for existence of IENs | 
|---|
| 76 | . N SDIEN S SDIEN=$O(@(SDX_"0)")) I +$G(SDIEN)=0 D ERROR(SDERR) | 
|---|
| 77 | . Q:SDQUIT | 
|---|
| 78 | . S SDDATA=0 | 
|---|
| 79 | . ; get each IEN in the array and validate | 
|---|
| 80 | . F  S SDDATA=$O(@(SDX_"SDDATA)")) Q:(($G(SDDATA)="")!(SDQUIT))  D | 
|---|
| 81 | .. I '$D(^SC(SDDATA,0)) D ERROR(SDERR) Q | 
|---|
| 82 | .. D:$$CHKRSACL(SDDATA) ERROR(SDERR)    ;validate RSA Clinic (Type R) | 
|---|
| 83 | Q | 
|---|
| 84 | 3 ;SDARRAY(3): Appointment Status Code | 
|---|
| 85 | F SDX=1:1:SDCOUNT Q:SDQUIT  D | 
|---|
| 86 | . S SDDATA=";"_$P(SDARRAY(3),";",SDX)_";" | 
|---|
| 87 | . I ";I;R;NT;NS;NSR;CC;CCR;CP;CPR;"'[(SDDATA) D ERROR(SDERR) | 
|---|
| 88 | Q | 
|---|
| 89 | 4 ;SDARRAY(4): Patient DFN | 
|---|
| 90 | ;patient must be on ^DPT | 
|---|
| 91 | ;DFN list is not in global | 
|---|
| 92 | I SDARRAY("PATGBL")'=1 D | 
|---|
| 93 | . ; get each DFN in the string and validate | 
|---|
| 94 | . F SDX=1:1:SDCOUNT Q:SDQUIT  D | 
|---|
| 95 | .. S SDDATA=$P(SDARRAY(4),";",SDX) | 
|---|
| 96 | .. I $G(SDDATA)="" D ERROR(SDERR) | 
|---|
| 97 | .. Q:SDQUIT | 
|---|
| 98 | .. I '$D(^DPT(SDDATA)) D ERROR(SDERR) | 
|---|
| 99 | .. Q:SDQUIT | 
|---|
| 100 | ;DFN list is in global or local array | 
|---|
| 101 | I SDARRAY("PATGBL")=1 D | 
|---|
| 102 | . Q:SDARRAY(4)="^DPT(" | 
|---|
| 103 | . S SDX=SDARRAY(4) | 
|---|
| 104 | . ;check for existence of DFNs | 
|---|
| 105 | . N SDDFN S SDDFN=$O(@(SDX_"0)")) I +$G(SDDFN)=0 D ERROR(SDERR) | 
|---|
| 106 | . Q:SDQUIT | 
|---|
| 107 | . S SDDATA=0 | 
|---|
| 108 | . ; get each DFN in the array and validate | 
|---|
| 109 | . F  S SDDATA=$O(@(SDX_"SDDATA)")) Q:(($G(SDDATA)="")!(SDQUIT))  D | 
|---|
| 110 | .. I '$D(^DPT(SDDATA)) D ERROR(SDERR) | 
|---|
| 111 | .. Q:SDQUIT | 
|---|
| 112 | Q | 
|---|
| 113 | 12 ;SDARRAY(12): Encounter Exists | 
|---|
| 114 | ;Unpublished and should not be used by other applications | 
|---|
| 115 | ;validate value | 
|---|
| 116 | ;S SDQUIT=$S(SDARRAY("ENCTR")="":0,SDARRAY("ENCTR")="Y":0,SDARRAY("ENCTR")="N":0,1:1) | 
|---|
| 117 | ;D:SDQUIT ERROR(SDERR) | 
|---|
| 118 | Q | 
|---|
| 119 | 13 ;SDARRAY(13): Primary Stop Code | 
|---|
| 120 | ;primary stop code must exist on ^DIC(40.7,"C" | 
|---|
| 121 | F SDX=1:1:SDCOUNT Q:SDQUIT  D | 
|---|
| 122 | . S SDDATA=$P(SDARRAY(13),";",SDX) | 
|---|
| 123 | . I '+SDDATA D ERROR(SDERR) Q | 
|---|
| 124 | . I '$D(^DIC(40.7,"C",SDDATA)) D ERROR(SDERR) Q | 
|---|
| 125 | Q | 
|---|
| 126 | 16 ;SDARRAY(16): Date Appointment Made | 
|---|
| 127 | ;validate from/to date(s) | 
|---|
| 128 | D CHKDTES($G(SDARRAY("DAMFR")),$G(SDARRAY("DAMTO"))) | 
|---|
| 129 | Q:SDQUIT | 
|---|
| 130 | ;ensure time not entered | 
|---|
| 131 | I $L(SDARRAY("DAMFR"))>7 D ERROR(SDERR) | 
|---|
| 132 | Q:SDQUIT | 
|---|
| 133 | I $L(SDARRAY("DAMTO"))>7 D ERROR(SDERR) | 
|---|
| 134 | Q | 
|---|
| 135 | CHKRSACL(SDCL) ;validate RSA clinics | 
|---|
| 136 | ; | 
|---|
| 137 | ;Input     SDCL - IEN of the clinic | 
|---|
| 138 | ;Output    0 - Clinic OK | 
|---|
| 139 | ;          1 - Clinic Error (Missing either Local Appointment | 
|---|
| 140 | ;              purpose Id or Resource Id entry) | 
|---|
| 141 | ; | 
|---|
| 142 | ;initialize variables | 
|---|
| 143 | N SDRSA,SDRNODE,SDERR | 
|---|
| 144 | S SDERR=0 | 
|---|
| 145 | ;quit if clinic is not of type "C" (Clinic) | 
|---|
| 146 | ; - RSA Clinic that has not completed migration | 
|---|
| 147 | Q:($P($G(^SC(SDCL,0)),"^",3)'="C") SDERR | 
|---|
| 148 | ;determine clinic (RSA or VistA) | 
|---|
| 149 | S SDRSA=$$RSACLNC^SDAMA307(SDCL) | 
|---|
| 150 | Q:SDRSA SDERR  ;valid RSA clinic (has both Resource/LAP Ids) | 
|---|
| 151 | ;check to ensure valid VistA clinic | 
|---|
| 152 | S SDRNODE=$G(^SC(SDCL,"RSA")) | 
|---|
| 153 | ;error if either resource or lap defined | 
|---|
| 154 | S SDERR=$S((($P(SDRNODE,"^",4)="")&($P(SDRNODE,"^",5)="")):0,1:1) | 
|---|
| 155 | Q SDERR | 
|---|
| 156 | VSTAPPTS ;validate parameter for retrieving only VistA Appointments | 
|---|
| 157 | ;This flag supports the RPC View for RSA - unpublished feature | 
|---|
| 158 | Q:($G(SDARRAY("VSTAPPTS"))="") | 
|---|
| 159 | D:($G(SDARRAY("VSTAPPTS"))'=1) ERROR(SDERR) | 
|---|
| 160 | Q | 
|---|
| 161 | PURGED ;validate parameter for retrieving PURGED VistA appts | 
|---|
| 162 | Q:($G(SDARRAY("PURGED"))="")  ;parameter not set/used | 
|---|
| 163 | D:($G(SDARRAY("PURGED"))'=1) ERROR(SDERR) | 
|---|
| 164 | Q:(SDQUIT)  ;quit if parameter not set correctly | 
|---|
| 165 | ;throw error if patient filter not defined or invalid field requested | 
|---|
| 166 | D:($G(SDARRAY(4))']"") ERROR(SDERR) | 
|---|
| 167 | Q:(SDQUIT) | 
|---|
| 168 | N SDI F SDI=5:1:9,11,22,28,30,31,33 Q:(SDQUIT)  D | 
|---|
| 169 | .D:((";"_$G(SDARRAY("FLDS"))_";")[(";"_SDI_";")) ERROR(SDERR) | 
|---|
| 170 | Q | 
|---|
| 171 | NOFIL ;No filter allowed | 
|---|
| 172 | I $G(SDARRAY(SDI))]"" D ERROR(SDERR) | 
|---|
| 173 | Q | 
|---|
| 174 | FMDATE(SDDATE,SDERR) ; | 
|---|
| 175 | ;dates must be valid internal FileMan format | 
|---|
| 176 | N X,Y,%H,%T,%Y | 
|---|
| 177 | S Y=SDDATE D DD^%DT I Y=-1 D ERROR(SDERR) | 
|---|
| 178 | Q:SDQUIT | 
|---|
| 179 | ;dates cannot be imprecise | 
|---|
| 180 | S X=SDDATE D H^%DTC I %H=0 D ERROR(SDERR) | 
|---|
| 181 | Q | 
|---|
| 182 | CHKDTES(SDFROM,SDTO) ;validate date(/time)s | 
|---|
| 183 | N SDI,X,Y,%DT | 
|---|
| 184 | S %DT="STX" | 
|---|
| 185 | F SDI=SDFROM,SDTO Q:SDQUIT  D | 
|---|
| 186 | .;valid fileman format | 
|---|
| 187 | .I $G(SDI)'="" D | 
|---|
| 188 | ..D FMDATE(SDI,SDERR) | 
|---|
| 189 | ..Q:SDQUIT | 
|---|
| 190 | ..;check for valid dates / leap yr dates | 
|---|
| 191 | ..I SDI'[9999999 D | 
|---|
| 192 | ...S X=$$FMTE^XLFDT(SDI) | 
|---|
| 193 | ...D ^%DT | 
|---|
| 194 | ...I Y<0 D ERROR(SDERR) | 
|---|
| 195 | .Q:SDQUIT | 
|---|
| 196 | Q:SDQUIT | 
|---|
| 197 | ;from date(/time) can't be after to  date(/time) | 
|---|
| 198 | I SDFROM>SDTO D ERROR(SDERR) | 
|---|
| 199 | Q | 
|---|
| 200 | MAX ;Maximum number of appointments requested | 
|---|
| 201 | ;max can't be 0 | 
|---|
| 202 | N SDMAXAPT,SDPCOUNT,SDCCOUNT | 
|---|
| 203 | S SDMAXAPT=$G(SDARRAY("MAX")) | 
|---|
| 204 | S (SDPCOUNT,SDCCOUNT)=0 | 
|---|
| 205 | I $G(SDMAXAPT)]"" D | 
|---|
| 206 | . ;Check Max Entry | 
|---|
| 207 | . I +SDMAXAPT'=SDMAXAPT S SDQUIT=1 Q | 
|---|
| 208 | . I SDMAXAPT=0 S SDQUIT=1 Q | 
|---|
| 209 | . I SDMAXAPT["." S SDQUIT=1 Q | 
|---|
| 210 | . ;Verify a SINGLE valid PATIENT &/OR CLINIC Entry | 
|---|
| 211 | . ;Get Number of Patients passed in | 
|---|
| 212 | . I SDARRAY("PATGBL")=1 S SDPCOUNT=$$CHKGBL(SDARRAY(4)) | 
|---|
| 213 | . I SDARRAY("PATGBL")=0 S SDPCOUNT=$L(SDARRAY(4),";") | 
|---|
| 214 | . ;Get Number of Clinics passed in | 
|---|
| 215 | . I SDARRAY("CLNGBL")=1 S SDCCOUNT=$$CHKGBL(SDARRAY(2)) | 
|---|
| 216 | . I SDARRAY("CLNGBL")=0 S SDCCOUNT=$L(SDARRAY(2),";") | 
|---|
| 217 | . I (SDPCOUNT>1)!(SDCCOUNT>1) S SDQUIT=1 Q | 
|---|
| 218 | . I SDPCOUNT=0,SDCCOUNT=0 S SDQUIT=1 | 
|---|
| 219 | I SDQUIT D ERROR(SDERR) | 
|---|
| 220 | Q | 
|---|
| 221 | ; | 
|---|
| 222 | FLDS ;Quit if field list is null | 
|---|
| 223 | N SDFIELDS,SDFIELD | 
|---|
| 224 | I $G(SDARRAY("FLDS"))="" D ERROR(SDERR) | 
|---|
| 225 | Q:SDQUIT | 
|---|
| 226 | S SDFIELDS=SDARRAY("FLDS") | 
|---|
| 227 | S SDCOUNT=$L(SDFIELDS,";") | 
|---|
| 228 | F SDI=1:1:SDCOUNT Q:SDQUIT  D | 
|---|
| 229 | . S SDFIELD=$P(SDFIELDS,";",SDI) | 
|---|
| 230 | . I (($G(SDFIELD)'?.N)!($G(SDFIELD)<1)!($G(SDFIELD)=27)!($G(SDFIELD)>SDARRAY("FC"))) D ERROR(SDERR) S SDQUIT=1 | 
|---|
| 231 | Q | 
|---|
| 232 | ; | 
|---|
| 233 | FLTRS ;Quit if max filters exceeded | 
|---|
| 234 | N SDFCNT S SDFCNT=0 | 
|---|
| 235 | F SDI=1:1:SDARRAY("FC") D | 
|---|
| 236 | . I $G(SDARRAY(SDI))]"" S SDFCNT=SDFCNT+1 | 
|---|
| 237 | I SDFCNT>SDARRAY("MF") D ERROR(SDERR) S SDQUIT=1 | 
|---|
| 238 | Q | 
|---|
| 239 | ; | 
|---|
| 240 | SORT ;Quit if SORT Filter is a value other than P or null | 
|---|
| 241 | N SDSORT | 
|---|
| 242 | S SDSORT=$G(SDARRAY("SORT")) | 
|---|
| 243 | I $G(SDSORT)="" Q | 
|---|
| 244 | I '($G(SDSORT)="P") D ERROR(SDERR) | 
|---|
| 245 | Q | 
|---|
| 246 | ; | 
|---|
| 247 | ERROR(SDERRNUM) ;Generate Error and put in ^TMP global | 
|---|
| 248 | S SDARRAY("CNT")=-1,SDQUIT=1 | 
|---|
| 249 | S $P(^TMP($J,"SDAMA301",SDERRNUM),"^",1)=$P($T(@SDERRNUM),";;",2) | 
|---|
| 250 | Q | 
|---|
| 251 | ; | 
|---|
| 252 | 101 ;;DATABASE IS UNAVAILABLE | 
|---|
| 253 | 115 ;;INVALID INPUT ARRAY ENTRY | 
|---|
| 254 | 116 ;;DATA MISMATCH | 
|---|
| 255 | 117 ;;Fatal RSA error. See SDAM RSA ERROR LOG file. | 
|---|
| 256 | ; | 
|---|
| 257 | CHKGBL(SDGBL) ;Check Global for number of entries | 
|---|
| 258 | N SDIEN,SDCOUNT | 
|---|
| 259 | S (SDIEN,SDCOUNT)=0 | 
|---|
| 260 | F  S SDIEN=$O(@(SDGBL_"SDIEN)"))  Q:(+$G(SDIEN)=0)!(SDCOUNT>2)  D | 
|---|
| 261 | .S SDCOUNT=SDCOUNT+1 | 
|---|
| 262 | Q SDCOUNT | 
|---|