| 1 | SDAMA307 ;BPOIFO/ACS-Filter API Call RSA ; 9/14/05 12:45pm | 
|---|
| 2 | ;;5.3;Scheduling;**301,508**;13 Aug 1993 | 
|---|
| 3 | ;PER VHA DIRECTIVE 2004-038, DO NOT MODIFY THIS ROUTINE | 
|---|
| 4 | ; | 
|---|
| 5 | ;**              GET APPOINTMENT DATA FROM RSA                ** | 
|---|
| 6 | ; | 
|---|
| 7 | ;*************************************************************** | 
|---|
| 8 | ;              CHANGE LOG | 
|---|
| 9 | ; | 
|---|
| 10 | ;  DATE      PATCH       DESCRIPTION | 
|---|
| 11 | ;--------  ----------    --------------------------------------- | 
|---|
| 12 | ;12/04/03  SD*5.3*301    ROUTINE COMPLETED | 
|---|
| 13 | ;09/14/05  SD*5.3*372    Phase II Apptmts on Multiple Databases | 
|---|
| 14 | ;02/22/07  SD*5.3*508    SEE SDAMA301 FOR CHANGE LIST | 
|---|
| 15 | ;*************************************************************** | 
|---|
| 16 | ; | 
|---|
| 17 | ;*************************************************************** | 
|---|
| 18 | ;INPUT | 
|---|
| 19 | ;       SDARRAY  APPOINTMENT FILTER ARRAY (by reference) | 
|---|
| 20 | ;       SDVRFR   OVERLOAD PARAMETER FOR VERIFIER [optional] | 
|---|
| 21 | ;                (Returns Screened RSA Appts (Migrating)) | 
|---|
| 22 | ;*************************************************************** | 
|---|
| 23 | DATA(SDARRAY,SDVRFR) ;Get RSA appointment data (Phase II) | 
|---|
| 24 | ;Initialize variables | 
|---|
| 25 | N SDRESP,SDCOUNT,SDDFN,SDX,SDGBL | 
|---|
| 26 | S SDX=0 | 
|---|
| 27 | ;if patient filter defined ensure that at least 1 patient has | 
|---|
| 28 | ;an ICN. if no patient in the list or global has an icn then RSA | 
|---|
| 29 | ;does not need to be called (No Appointments will exist.) | 
|---|
| 30 | I (($G(SDARRAY(4))]"")&($G(SDARRAY(4))'="^DPT(")) D  Q:'SDX | 
|---|
| 31 | .;patients in global | 
|---|
| 32 | .I SDARRAY("PATGBL")=1 D | 
|---|
| 33 | ..S SDGBL=SDARRAY(4),SDDFN=0 | 
|---|
| 34 | ..F  S SDDFN=$O(@(SDGBL_"SDDFN)")) Q:((+$G(SDDFN)=0)!SDX)  D | 
|---|
| 35 | ...S:(+$$GETICN^MPIF001(SDDFN)>0) SDX=1 | 
|---|
| 36 | .;patients in list | 
|---|
| 37 | .I SDARRAY("PATGBL")=0 D | 
|---|
| 38 | ..S SDCOUNT=$L(SDARRAY(4),";") | 
|---|
| 39 | ..F SDDFN=1:1:SDCOUNT Q:SDX  D | 
|---|
| 40 | ...S:(+$$GETICN^MPIF001($P(SDARRAY(4),";",SDDFN))>0) SDX=1 | 
|---|
| 41 | ;if patient filter is not defined ensure that if the status | 
|---|
| 42 | ;filter is defined that it has more than cancelled appt statuses | 
|---|
| 43 | ;(Cancelled Appts not returned if Patient filter not defined) | 
|---|
| 44 | I (($G(SDARRAY(4))']"")&($G(SDARRAY(3))]"")) D  Q:'SDX | 
|---|
| 45 | .N SDSTAT,SDI S SDSTAT="",SDX=0 | 
|---|
| 46 | .F SDI=1:1:$L(SDARRAY(3),";") Q:SDX  D | 
|---|
| 47 | ..S:($P(SDARRAY(3),";",SDI)'["C") SDX=1 | 
|---|
| 48 | ;Call RSA Business Delegate | 
|---|
| 49 | ;S SDRESP=$$XMLDLGT^SDAMA309(.SDARRAY,$G(SDVRFR)) | 
|---|
| 50 | ;error occurred creating appt records | 
|---|
| 51 | I SDRESP<0 S SDARRAY("CNT")=-1 | 
|---|
| 52 | ;no errors/update total appt counter/adjust appts to max filter | 
|---|
| 53 | ;as RSA appts were appended to output and may exceed the MAX | 
|---|
| 54 | I '(SDRESP<0) D | 
|---|
| 55 | .S SDARRAY("CNT")=SDARRAY("CNT")+SDRESP | 
|---|
| 56 | .;adjust total number of appointments | 
|---|
| 57 | .D MAXAPPTS(.SDARRAY) | 
|---|
| 58 | Q | 
|---|
| 59 | ; | 
|---|
| 60 | ;*************************************************************** | 
|---|
| 61 | ;OUTPUT | 
|---|
| 62 | ;    If RSA Implemented, return 1,10 or 11 if Appt Entry Exists | 
|---|
| 63 | ;    If RSA NOT Implemented, return 0 | 
|---|
| 64 | ;*************************************************************** | 
|---|
| 65 | IMP() ;RSA Implemented | 
|---|
| 66 | Q $D(^XOB(18.08,"B",$$GETSRVNM)) | 
|---|
| 67 | ; | 
|---|
| 68 | ;*************************************************************** | 
|---|
| 69 | ;OUTPUT | 
|---|
| 70 | ;       Returns RSA Application Server Name | 
|---|
| 71 | ;*************************************************************** | 
|---|
| 72 | GETSRVNM() ;return the VL 2.0 application server name | 
|---|
| 73 | Q "SDAM-RSA" | 
|---|
| 74 | ; | 
|---|
| 75 | ;*************************************************************** | 
|---|
| 76 | ;INPUT | 
|---|
| 77 | ;       SDCLIEN      Clinic's Internal Entry Number (Required) | 
|---|
| 78 | ;       SDARRAY      APPOINTMENT FILTER ARRAY (by reference) | 
|---|
| 79 | ;OUTPUT | 
|---|
| 80 | ;       1 Return a Patients or Clinics VistA Appointments | 
|---|
| 81 | ;       0 Exclude a Patients or Clinics VistA Appointments | 
|---|
| 82 | ; | 
|---|
| 83 | ;       SDARRAY("RSA")=1 will exist if RSA has to be Called | 
|---|
| 84 | ;       SDARRAY("MIG") will exist for VistA Clinics that have an | 
|---|
| 85 | ;                      earliest migrated date/time and has | 
|---|
| 86 | ;                      completed migration. | 
|---|
| 87 | ; *************************************************************** | 
|---|
| 88 | CLMIG(SDCLIEN,SDARRAY) ;clinic status switch | 
|---|
| 89 | ;initialize variables | 
|---|
| 90 | N SDRSA | 
|---|
| 91 | S SDARRAY("CLIN")=SDCLIEN,SDARRAY("MIG")="" | 
|---|
| 92 | ;quit if clinic is not of type "C" (Clinic) | 
|---|
| 93 | Q:($P($G(^SC(SDCLIEN,0)),"^",3)'="C") 0 | 
|---|
| 94 | ;determine if RSA Clinic, | 
|---|
| 95 | ;if RSA Clinic Quit VistA doesnt need to be called | 
|---|
| 96 | S SDRSA=$$RSACLNC(SDCLIEN) | 
|---|
| 97 | ; | 
|---|
| 98 | ;RSA CLINIC (Check-In Point) Logic | 
|---|
| 99 | ;Call RSA for Future Migrated/New appointments | 
|---|
| 100 | I SDRSA S SDARRAY("RSA")=1 Q 0 | 
|---|
| 101 | ; | 
|---|
| 102 | ;VISTA CLINIC Logic | 
|---|
| 103 | ;return all VistA appointments (Migration not completed) | 
|---|
| 104 | Q:($P($G(^SC(SDCLIEN,"RSA")),"^",6)']"") 1 | 
|---|
| 105 | ;retrieve earliest migrated date/time | 
|---|
| 106 | S SDARRAY("MIG")=+$P($G(^SC(SDCLIEN,"RSA")),"^",3) | 
|---|
| 107 | ;return non-migrated VistA appointments | 
|---|
| 108 | Q:(SDARRAY("MIG")>+$G(SDARRAY("DATE"))) 1 | 
|---|
| 109 | ;migrated VistA appointments not returned | 
|---|
| 110 | Q 0 | 
|---|
| 111 | ; | 
|---|
| 112 | ;*************************************************************** | 
|---|
| 113 | ;INPUT | 
|---|
| 114 | ;   SDCLNC  -  Clinic IEN | 
|---|
| 115 | ;OUTPUT | 
|---|
| 116 | ;   1 - Is an RSA Clinic | 
|---|
| 117 | ;   0 - Is not an RSA Clinic | 
|---|
| 118 | ;*************************************************************** | 
|---|
| 119 | RSACLNC(SDCLNC) ;determine if Clinic is an RSA Clinic | 
|---|
| 120 | ;RSA Clinic if Resource Id (#44.203) and | 
|---|
| 121 | ;              Appt Purpose ID (#44.204) exist | 
|---|
| 122 | ;initialize variables | 
|---|
| 123 | N SDRID,SDLAPID | 
|---|
| 124 | ;get resource id | 
|---|
| 125 | S SDRID=$P($G(^SC(SDCLNC,"RSA")),"^",4) | 
|---|
| 126 | ;get local appt purpose id | 
|---|
| 127 | S SDLAPID=$P($G(^SC(SDCLNC,"RSA")),"^",5) | 
|---|
| 128 | Q $S(((SDRID'="")&(SDLAPID'="")):1,1:0) | 
|---|
| 129 | ; | 
|---|
| 130 | ;*************************************************************** | 
|---|
| 131 | ;OUTPUT | 
|---|
| 132 | ;   Returns the Sites VistA Instance Number | 
|---|
| 133 | ;*************************************************************** | 
|---|
| 134 | VI() ;Get VistA Instance | 
|---|
| 135 | N SDVI | 
|---|
| 136 | S SDVI=$$SITE^VASITE | 
|---|
| 137 | Q +$P(SDVI,"^",3) | 
|---|
| 138 | ; | 
|---|
| 139 | ;****************************************************************** | 
|---|
| 140 | ;INPUT | 
|---|
| 141 | ;   SDARRAY         APPOINTMENT FILTER ARRAY (by reference) | 
|---|
| 142 | ;****************************************************************** | 
|---|
| 143 | MAXAPPTS(SDARRAY) ;Adjust combined appointments (VistA/RSA) to MAX | 
|---|
| 144 | N SDDIFF,SDDIR,SDREF,SDMAX,SDI,SDDTM,SDSORT1,SDSORT2 | 
|---|
| 145 | S SDMAX=$S(SDARRAY("MAX")<0:SDARRAY("MAX")*-1,1:SDARRAY("MAX")) | 
|---|
| 146 | S SDDIR=1,SDREF="^TMP($J,""SDRSRT"")" | 
|---|
| 147 | ;quit if max filter not defined / max equals appt count / or | 
|---|
| 148 | ;appt count is less than max | 
|---|
| 149 | Q:($S(SDARRAY("MAX")="":1,SDMAX=SDARRAY("CNT"):1,SDARRAY("CNT")<SDMAX:1,1:0)) | 
|---|
| 150 | ;determine how many appts to kill and QUERY direction | 
|---|
| 151 | I SDARRAY("MAX")>0 D | 
|---|
| 152 | .S SDDIFF=SDARRAY("CNT")-SDARRAY("MAX"),SDDIR=-1 | 
|---|
| 153 | .I $G(SDARRAY("SORT"))="P" S SDREF="^TMP($J,""SDRSRT"",""A"",""A"")" | 
|---|
| 154 | .E  S SDREF="^TMP($J,""SDRSRT"",""A"",""A"",""A"")" | 
|---|
| 155 | S:SDARRAY("MAX")<0 SDDIFF=SDARRAY("CNT")+SDARRAY("MAX") | 
|---|
| 156 | ;create temporary resorted output global by Date/Time | 
|---|
| 157 | ;D MAXRESRT^SDAMA309(.SDARRAY) | 
|---|
| 158 | ; | 
|---|
| 159 | ;loop through appt set and kill the excess appts | 
|---|
| 160 | F  Q:'SDDIFF  D | 
|---|
| 161 | .S SDREF=$Q(@SDREF,SDDIR) | 
|---|
| 162 | .;retrieve subscribpt to delete from output global | 
|---|
| 163 | .S SDDTM=$P(SDREF,",",3),SDSORT1=+$P(SDREF,",",4),SDSORT2=+$P(SDREF,",",5) | 
|---|
| 164 | .K:($G(SDARRAY("SORT"))="P") ^TMP($J,"SDAMA301",SDSORT1,SDDTM) | 
|---|
| 165 | .K:($G(SDARRAY("SORT"))'="P") ^TMP($J,"SDAMA301",SDSORT1,SDSORT2,SDDTM) | 
|---|
| 166 | .K @SDREF  ;delete resorted temp output copy | 
|---|
| 167 | .S SDDIFF=SDDIFF-1 | 
|---|
| 168 | ;reset total appt count to max | 
|---|
| 169 | S SDARRAY("CNT")=$S(SDARRAY("MAX")>0:SDARRAY("MAX"),1:(SDARRAY("MAX")*(-1))) | 
|---|
| 170 | K ^TMP($J,"SDRSRT") | 
|---|
| 171 | Q | 
|---|
| 172 | ; | 
|---|
| 173 | ;Both Patient and Clinic Filter Defined, Determine if RSA should be | 
|---|
| 174 | ;called, by evaluating the Clinic Filter List. Patient may have no | 
|---|
| 175 | ;appointments in VistA, so Clinic Filter has to be evaluated. | 
|---|
| 176 | ;****************************************************************** | 
|---|
| 177 | ;INPUT | 
|---|
| 178 | ;   SDARRAY         APPOINTMENT FILTER ARRAY (by reference) | 
|---|
| 179 | ;****************************************************************** | 
|---|
| 180 | CALLRSA(SDARRAY) ; | 
|---|
| 181 | ;initialize variables | 
|---|
| 182 | N SDCOUNT,SDX,SDCLIEN,SDQUIT,SDGBL,SDRSLT | 
|---|
| 183 | S (SDCOUNT,SDQUIT)=0 | 
|---|
| 184 | ;if clinic is in a list: | 
|---|
| 185 | I SDARRAY("CLNGBL")=0 D | 
|---|
| 186 | . S SDCOUNT=$L(SDARRAY(2),";") | 
|---|
| 187 | . ;For each clinic in the filter (LIST): | 
|---|
| 188 | . F SDX=1:1:SDCOUNT Q:SDQUIT  D | 
|---|
| 189 | .. S SDCLIEN=$P(SDARRAY(2),";",SDX) | 
|---|
| 190 | .. ;determine if clinic has migrated (Call RSA) | 
|---|
| 191 | .. S SDRSLT='$$CLMIG(SDCLIEN,.SDARRAY) | 
|---|
| 192 | .. S SDQUIT=+$G(SDARRAY("RSA")) | 
|---|
| 193 | ;if clinic is in array, get IENs | 
|---|
| 194 | I SDARRAY("CLNGBL")=1 D | 
|---|
| 195 | . S SDGBL=SDARRAY(2),SDCLIEN=0 | 
|---|
| 196 | . ;for each clinic in the filter (GLOBAL): | 
|---|
| 197 | . F  S SDCLIEN=$O(@(SDGBL_"SDCLIEN)")) Q:(($G(SDCLIEN)="")!(SDQUIT))  D | 
|---|
| 198 | .. ;determine if clinic has migrated (Call RSA) | 
|---|
| 199 | .. S SDRSLT='$$CLMIG(SDCLIEN,.SDARRAY) | 
|---|
| 200 | .. S SDQUIT=+$G(SDARRAY("RSA")) | 
|---|
| 201 | Q | 
|---|
| 202 | ; | 
|---|
| 203 | ;**************************************************************** | 
|---|
| 204 | ;INPUT | 
|---|
| 205 | ;   SDERRNUM  Appropriate error diagnosing problem (REQUIRED) | 
|---|
| 206 | ;              101     Database Unavailable | 
|---|
| 207 | ;              115     Invalid Input Array Entry | 
|---|
| 208 | ;              116     Data Mismatch | 
|---|
| 209 | ;              117     SDAPI Error (Other Error) | 
|---|
| 210 | ;   SDVLRHNL  Request Handle (optional) | 
|---|
| 211 | ; | 
|---|
| 212 | ;Output | 
|---|
| 213 | ;   N/A | 
|---|
| 214 | ;**************************************************************** | 
|---|
| 215 | ERROR(SDERRNUM,SDVLRHNL) ;error handling | 
|---|
| 216 | ;clean up locations | 
|---|
| 217 | ;D:$G(SDVLRHNL)'="" CLEAN^XOBVJLIB(SDVLRHNL) | 
|---|
| 218 | ;kill existing global entries | 
|---|
| 219 | K ^TMP($J,"SDAMA301") | 
|---|
| 220 | ;create error entry in global | 
|---|
| 221 | D ERROR^SDAMA300(SDERRNUM) | 
|---|
| 222 | Q | 
|---|
| 223 | ; | 
|---|
| 224 | ;**************************************************************** | 
|---|
| 225 | ;INPUT | 
|---|
| 226 | ;   SDVLRHNL  VistALink Request Handle (REQUIRED) | 
|---|
| 227 | ;   SDVRFR    OVERLOAD PARAMETER FOR VERIFIER [optional] | 
|---|
| 228 | ;             (Creates Error Info in Output Global - 101 Returned) | 
|---|
| 229 | ;**************************************************************** | 
|---|
| 230 | VLERR(SDVLRHNL,SDVRFR) ;write vistalink errors to err log | 
|---|
| 231 | N SDERR  ;initialize variables | 
|---|
| 232 | ;setup err log variables and call err log handler | 
|---|
| 233 | S SDERR(1)="SDAMA301" | 
|---|
| 234 | ;S SDERR(5)="VistALink returned ERROR Code: "_$$GETFLTCD^XOBVJRQ(SDVLRHNL)_" ERROR Message: "_$$GETFLTMS^XOBVJRQ(SDVLRHNL) | 
|---|
| 235 | S SDERR(6)="SDRSA101" | 
|---|
| 236 | ;remove special characters from VL calls | 
|---|
| 237 | S SDERR(5)=$E(SDERR(5),1,$L(SDERR(5))-1) | 
|---|
| 238 | ;D LOGERR^SDAMA314(.SDERR) | 
|---|
| 239 | D:($G(SDVRFR)) ERROR(101,SDVLRHNL) ;write error to output global | 
|---|
| 240 | Q | 
|---|