| 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
 | 
|---|