Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: SDAMA300

SDAMA300.m

Go to the documentation of this file.
  1. SDAMA300 ;BPOIFO/ACS-Filter API Validate Filters ; 9/14/05 7:49am
  1. ;;5.3;Scheduling;**301,347,508,1015**;13 Aug 1993;Build 21
  1. ;PER VHA DIRECTIVE 2004-038, DO NOT MODIFY THIS ROUTINE
  1. ;
  1. ;*****************************************************************
  1. ; CHANGE LOG
  1. ;
  1. ; DATE PATCH DESCRIPTION
  1. ;-------- ---------- -----------------------------------------
  1. ;12/04/03 SD*5.3*301 ROUTINE COMPLETED
  1. ;08/06/04 SD*5.3*347 ADDITION OF A NEW FILTER - DATE APPOINTMENT
  1. ; MADE (FIELD #16) AND 2 NEW FIELDS TO RETURN:
  1. ; 1) AUTO-REBOOKED APPT DATE/TIME (FIELD #24)
  1. ; 2) NO-SHOW/CANCEL APPT DATE/TIME (FIELD #25)
  1. ;02/22/07 SD*5.3*508 SEE SDAMA301 FOR CHANGE LIST
  1. ;*****************************************************************
  1. ;
  1. ;*****************************************************************
  1. ;
  1. ; VALIDATE FILTER ARRAY CONTENTS
  1. ;INPUT
  1. ; SDARRAY Appointment filters
  1. ; SDFLTR Filter Flag array
  1. ;
  1. ;OUTPUT
  1. ; -1 if error
  1. ; 1 if no errors
  1. ;
  1. ;*****************************************************************
  1. VALARR(SDARRAY,SDFLTR) ;
  1. ;Initialize local variables
  1. N SDI,SDX,SDQUIT,SDDATA,SDCOUNT,SDERR
  1. S SDQUIT=0,SDERR=115
  1. ;
  1. ;Set filter flags and validate input array entries
  1. F SDI="MAX","FLDS","FLTRS","SORT","VSTAPPTS","PURGED" Q:SDQUIT D @SDI
  1. Q:(SDARRAY("CNT")=-1) -1
  1. ;filters allowed on these fields
  1. F SDI=1:1:4,13,16 Q:SDQUIT D
  1. . I $G(SDARRAY(SDI))']"" S SDFLTR(SDI)=0
  1. . E S SDFLTR(SDI)=1 D
  1. .. S SDCOUNT=$L(SDARRAY(SDI),";")
  1. .. S SDQUIT=0
  1. .. D @SDI
  1. ;
  1. I SDQUIT=0 D
  1. . ;filters not allowed on these fields
  1. . F SDI=5:1:12,14,15,17:1:26,28:1:SDARRAY("FC") Q:SDQUIT D NOFIL
  1. Q SDARRAY("CNT")
  1. ;
  1. ;*****************************************************************
  1. ;
  1. 1 ;SDARRAY(1): Appt dates
  1. ;validate from/to date(/time)s
  1. D CHKDTES($G(SDARRAY("FR")),$G(SDARRAY("TO")))
  1. Q:SDQUIT
  1. ;allow seconds in date/time filter!
  1. I $L(SDARRAY("FR"))>14 D ERROR(SDERR)
  1. Q:SDQUIT
  1. I $L(SDARRAY("TO"))>14 D ERROR(SDERR)
  1. Q
  1. 2 ;SDARRAY(2): Clinic IEN
  1. ;Clinic must be on ^SC
  1. ;Clinic list is not in global
  1. I SDARRAY("CLNGBL")'=1 D
  1. . ; get each clinic IEN in the string and validate
  1. . F SDX=1:1:SDCOUNT Q:SDQUIT D
  1. .. S SDDATA=$P(SDARRAY(2),";",SDX)
  1. .. I ($G(SDDATA)=""!'$D(^SC(SDDATA,0))) D ERROR(SDERR) Q
  1. .. D:$$CHKRSACL(SDDATA) ERROR(SDERR) ;validate RSA Clinic (Type R)
  1. ;Clinic list is in global or local array
  1. I SDARRAY("CLNGBL")=1 D
  1. . Q:SDARRAY(2)="^SC(" ; no validation required if clinic global
  1. . S SDX=SDARRAY(2)
  1. . ;check for existence of IENs
  1. . N SDIEN S SDIEN=$O(@(SDX_"0)")) I +$G(SDIEN)=0 D ERROR(SDERR)
  1. . Q:SDQUIT
  1. . S SDDATA=0
  1. . ; get each IEN in the array and validate
  1. . F S SDDATA=$O(@(SDX_"SDDATA)")) Q:(($G(SDDATA)="")!(SDQUIT)) D
  1. .. I '$D(^SC(SDDATA,0)) D ERROR(SDERR) Q
  1. .. D:$$CHKRSACL(SDDATA) ERROR(SDERR) ;validate RSA Clinic (Type R)
  1. Q
  1. 3 ;SDARRAY(3): Appointment Status Code
  1. F SDX=1:1:SDCOUNT Q:SDQUIT D
  1. . S SDDATA=";"_$P(SDARRAY(3),";",SDX)_";"
  1. . I ";I;R;NT;NS;NSR;CC;CCR;CP;CPR;"'[(SDDATA) D ERROR(SDERR)
  1. Q
  1. 4 ;SDARRAY(4): Patient DFN
  1. ;patient must be on ^DPT
  1. ;DFN list is not in global
  1. I SDARRAY("PATGBL")'=1 D
  1. . ; get each DFN in the string and validate
  1. . F SDX=1:1:SDCOUNT Q:SDQUIT D
  1. .. S SDDATA=$P(SDARRAY(4),";",SDX)
  1. .. I $G(SDDATA)="" D ERROR(SDERR)
  1. .. Q:SDQUIT
  1. .. I '$D(^DPT(SDDATA)) D ERROR(SDERR)
  1. .. Q:SDQUIT
  1. ;DFN list is in global or local array
  1. I SDARRAY("PATGBL")=1 D
  1. . Q:SDARRAY(4)="^DPT("
  1. . S SDX=SDARRAY(4)
  1. . ;check for existence of DFNs
  1. . N SDDFN S SDDFN=$O(@(SDX_"0)")) I +$G(SDDFN)=0 D ERROR(SDERR)
  1. . Q:SDQUIT
  1. . S SDDATA=0
  1. . ; get each DFN in the array and validate
  1. . F S SDDATA=$O(@(SDX_"SDDATA)")) Q:(($G(SDDATA)="")!(SDQUIT)) D
  1. .. I '$D(^DPT(SDDATA)) D ERROR(SDERR)
  1. .. Q:SDQUIT
  1. Q
  1. 12 ;SDARRAY(12): Encounter Exists
  1. ;Unpublished and should not be used by other applications
  1. ;validate value
  1. ;S SDQUIT=$S(SDARRAY("ENCTR")="":0,SDARRAY("ENCTR")="Y":0,SDARRAY("ENCTR")="N":0,1:1)
  1. ;D:SDQUIT ERROR(SDERR)
  1. Q
  1. 13 ;SDARRAY(13): Primary Stop Code
  1. ;primary stop code must exist on ^DIC(40.7,"C"
  1. F SDX=1:1:SDCOUNT Q:SDQUIT D
  1. . S SDDATA=$P(SDARRAY(13),";",SDX)
  1. . I '+SDDATA D ERROR(SDERR) Q
  1. . I '$D(^DIC(40.7,"C",SDDATA)) D ERROR(SDERR) Q
  1. Q
  1. 16 ;SDARRAY(16): Date Appointment Made
  1. ;validate from/to date(s)
  1. D CHKDTES($G(SDARRAY("DAMFR")),$G(SDARRAY("DAMTO")))
  1. Q:SDQUIT
  1. ;ensure time not entered
  1. I $L(SDARRAY("DAMFR"))>7 D ERROR(SDERR)
  1. Q:SDQUIT
  1. I $L(SDARRAY("DAMTO"))>7 D ERROR(SDERR)
  1. Q
  1. CHKRSACL(SDCL) ;validate RSA clinics
  1. ;
  1. ;Input SDCL - IEN of the clinic
  1. ;Output 0 - Clinic OK
  1. ; 1 - Clinic Error (Missing either Local Appointment
  1. ; purpose Id or Resource Id entry)
  1. ;
  1. ;initialize variables
  1. N SDRSA,SDRNODE,SDERR
  1. S SDERR=0
  1. ;quit if clinic is not of type "C" (Clinic)
  1. ; - RSA Clinic that has not completed migration
  1. Q:($P($G(^SC(SDCL,0)),"^",3)'="C") SDERR
  1. ;determine clinic (RSA or VistA)
  1. S SDRSA=$$RSACLNC^SDAMA307(SDCL)
  1. Q:SDRSA SDERR ;valid RSA clinic (has both Resource/LAP Ids)
  1. ;check to ensure valid VistA clinic
  1. S SDRNODE=$G(^SC(SDCL,"RSA"))
  1. ;error if either resource or lap defined
  1. S SDERR=$S((($P(SDRNODE,"^",4)="")&($P(SDRNODE,"^",5)="")):0,1:1)
  1. Q SDERR
  1. VSTAPPTS ;validate parameter for retrieving only VistA Appointments
  1. ;This flag supports the RPC View for RSA - unpublished feature
  1. Q:($G(SDARRAY("VSTAPPTS"))="")
  1. D:($G(SDARRAY("VSTAPPTS"))'=1) ERROR(SDERR)
  1. Q
  1. PURGED ;validate parameter for retrieving PURGED VistA appts
  1. Q:($G(SDARRAY("PURGED"))="") ;parameter not set/used
  1. D:($G(SDARRAY("PURGED"))'=1) ERROR(SDERR)
  1. Q:(SDQUIT) ;quit if parameter not set correctly
  1. ;throw error if patient filter not defined or invalid field requested
  1. D:($G(SDARRAY(4))']"") ERROR(SDERR)
  1. Q:(SDQUIT)
  1. N SDI F SDI=5:1:9,11,22,28,30,31,33 Q:(SDQUIT) D
  1. .D:((";"_$G(SDARRAY("FLDS"))_";")[(";"_SDI_";")) ERROR(SDERR)
  1. Q
  1. NOFIL ;No filter allowed
  1. I $G(SDARRAY(SDI))]"" D ERROR(SDERR)
  1. Q
  1. FMDATE(SDDATE,SDERR) ;
  1. ;dates must be valid internal FileMan format
  1. N X,Y,%H,%T,%Y
  1. S Y=SDDATE D DD^%DT I Y=-1 D ERROR(SDERR)
  1. Q:SDQUIT
  1. ;dates cannot be imprecise
  1. S X=SDDATE D H^%DTC I %H=0 D ERROR(SDERR)
  1. Q
  1. CHKDTES(SDFROM,SDTO) ;validate date(/time)s
  1. N SDI,X,Y,%DT
  1. S %DT="STX"
  1. F SDI=SDFROM,SDTO Q:SDQUIT D
  1. .;valid fileman format
  1. .I $G(SDI)'="" D
  1. ..D FMDATE(SDI,SDERR)
  1. ..Q:SDQUIT
  1. ..;check for valid dates / leap yr dates
  1. ..I SDI'[9999999 D
  1. ...S X=$$FMTE^XLFDT(SDI)
  1. ...D ^%DT
  1. ...I Y<0 D ERROR(SDERR)
  1. .Q:SDQUIT
  1. Q:SDQUIT
  1. ;from date(/time) can't be after to date(/time)
  1. I SDFROM>SDTO D ERROR(SDERR)
  1. Q
  1. MAX ;Maximum number of appointments requested
  1. ;max can't be 0
  1. N SDMAXAPT,SDPCOUNT,SDCCOUNT
  1. S SDMAXAPT=$G(SDARRAY("MAX"))
  1. S (SDPCOUNT,SDCCOUNT)=0
  1. I $G(SDMAXAPT)]"" D
  1. . ;Check Max Entry
  1. . I +SDMAXAPT'=SDMAXAPT S SDQUIT=1 Q
  1. . I SDMAXAPT=0 S SDQUIT=1 Q
  1. . I SDMAXAPT["." S SDQUIT=1 Q
  1. . ;Verify a SINGLE valid PATIENT &/OR CLINIC Entry
  1. . ;Get Number of Patients passed in
  1. . I SDARRAY("PATGBL")=1 S SDPCOUNT=$$CHKGBL(SDARRAY(4))
  1. . I SDARRAY("PATGBL")=0 S SDPCOUNT=$L(SDARRAY(4),";")
  1. . ;Get Number of Clinics passed in
  1. . I SDARRAY("CLNGBL")=1 S SDCCOUNT=$$CHKGBL(SDARRAY(2))
  1. . I SDARRAY("CLNGBL")=0 S SDCCOUNT=$L(SDARRAY(2),";")
  1. . I (SDPCOUNT>1)!(SDCCOUNT>1) S SDQUIT=1 Q
  1. . I SDPCOUNT=0,SDCCOUNT=0 S SDQUIT=1
  1. I SDQUIT D ERROR(SDERR)
  1. Q
  1. ;
  1. FLDS ;Quit if field list is null
  1. N SDFIELDS,SDFIELD
  1. I $G(SDARRAY("FLDS"))="" D ERROR(SDERR)
  1. Q:SDQUIT
  1. S SDFIELDS=SDARRAY("FLDS")
  1. S SDCOUNT=$L(SDFIELDS,";")
  1. F SDI=1:1:SDCOUNT Q:SDQUIT D
  1. . S SDFIELD=$P(SDFIELDS,";",SDI)
  1. . I (($G(SDFIELD)'?.N)!($G(SDFIELD)<1)!($G(SDFIELD)=27)!($G(SDFIELD)>SDARRAY("FC"))) D ERROR(SDERR) S SDQUIT=1
  1. Q
  1. ;
  1. FLTRS ;Quit if max filters exceeded
  1. N SDFCNT S SDFCNT=0
  1. F SDI=1:1:SDARRAY("FC") D
  1. . I $G(SDARRAY(SDI))]"" S SDFCNT=SDFCNT+1
  1. I SDFCNT>SDARRAY("MF") D ERROR(SDERR) S SDQUIT=1
  1. Q
  1. ;
  1. SORT ;Quit if SORT Filter is a value other than P or null
  1. N SDSORT
  1. S SDSORT=$G(SDARRAY("SORT"))
  1. I $G(SDSORT)="" Q
  1. I '($G(SDSORT)="P") D ERROR(SDERR)
  1. Q
  1. ;
  1. ERROR(SDERRNUM) ;Generate Error and put in ^TMP global
  1. S SDARRAY("CNT")=-1,SDQUIT=1
  1. S $P(^TMP($J,"SDAMA301",SDERRNUM),"^",1)=$P($T(@SDERRNUM),";;",2)
  1. Q
  1. ;
  1. 101 ;;DATABASE IS UNAVAILABLE
  1. 115 ;;INVALID INPUT ARRAY ENTRY
  1. 116 ;;DATA MISMATCH
  1. 117 ;;Fatal RSA error. See SDAM RSA ERROR LOG file.
  1. ;
  1. CHKGBL(SDGBL) ;Check Global for number of entries
  1. N SDIEN,SDCOUNT
  1. S (SDIEN,SDCOUNT)=0
  1. F S SDIEN=$O(@(SDGBL_"SDIEN)")) Q:(+$G(SDIEN)=0)!(SDCOUNT>2) D
  1. .S SDCOUNT=SDCOUNT+1
  1. Q SDCOUNT