SDAMA201 ;BPOIFO/ACS-Scheduling Replacement APIs ; 12/13/04 3:14pm
;;5.3;Scheduling;**253,275,283,316,347,1015**;13 Aug 1993;Build 21
;
;GETAPPT - Returns appointment information for a patient
;NEXTAPPT - Returns next appointment information for a patient
;
;** BEFORE USING THE APIS IN THIS ROUTINE, PLEASE SUBSCRIBE **
;** TO DBIA #3859 **
;
;*****************************************************************
; CHANGE LOG
;
; DATE PATCH DESCRIPTION
;-------- ---------- -----------------------------------------
;09/20/02 SD*5.3*253 ROUTINE COMPLETED
;12/10/02 SD*5.3*275 ADDED PATIENT STATUS FILTER
;07/03/03 SD*5.3*283 REMOVED 'NO ACTION TAKEN' EDIT
;09/16/03 SD*5.3*316 CHANGED 'NEXTAPPT' TO START LOOKING 'NOW'
;07/26/04 SD*5.3*347 NEW VARIABLES USED IN ^%DTC CALL.
; NEXTAPPT TO GET DATA FROM SDAPI NOT VISTA.
; GETAPPT WILL RETRIEVE APPT DATA THROUGH
; SDAPI API. PATIENT STATUS TO OVERWRITE
; APPOINTMENT STATUS OF "R" OR "R;I".
; GETAPPT CALLS GETAPPT^SDAMA205.
;
;*****************************************************************
GETAPPT(SDPATIEN,SDFIELDS,SDAPSTAT,SDSTART,SDEND,SDRESULT,SDIOSTAT) ;
;*****************************************************************
;
; GET APPOINTMENTS FOR PATIENT
;
;INPUT
; SDPATIEN Patient IEN (required)
; SDFIELDS Fields requested (optional)
; SDAPSTAT Appointment Status Filter (optional)
; SDSTART Start date/time (optional)
; SDEND End date/time (optional)
; SDRESULT Record count returned here (optional)
; SDIOSTAT Patient Status filter (optional)
;
;OUTPUT
; ^TMP($J,"SDAMA201","GETAPPT",X,Y)=FieldYdata
; where "X" is an incremental appointment counter and
; "Y" is the field number requested
;
;*****************************************************************
; Call API to Get Appointment(s) for Patient.
D GETAPPT^SDAMA205(.SDPATIEN,.SDFIELDS,.SDAPSTAT,.SDSTART,.SDEND,.SDRESULT,.SDIOSTAT)
Q
;
NEXTAPPT(SDPATIEN,SDFIELDS,SDAPSTAT,SDIOSTAT) ;
;*****************************************************************
;
; GET NEXT APPOINTMENT FOR PATIENT
;
; This API should be called with an EXTRINISIC call. It will
; return "-1" if an error occurs, "1" if a future appointment
; exists, or "0" if no future appointment exists. If the user
; enters field numbers into the optional SDFIELDS parameter and a
; next appointment is found, the requested fields for that next
; appointment will be retrieved and put into:
; ^TMP($J,"SDAMA201","NEXTAPPT")
;
;INPUT
; SDPATIEN Patient IEN (required)
; SDFIELDS Fields requested (optional)
; SDAPSTAT Appointment status filter (optional)
; SDIOSTAT Patient status filter (optional)
;
;OUTPUT
; -1: error
; 0: no future appointment
; 1: future appointment exists
;
; If "1" is returned and the user has requested fields in the
; SDFIELDS parameter, the following global is populated:
; ^TMP($J,"SDAMA201","NEXTAPPT",Y)=FieldYdata
; where "Y" is the field number requested
;
;*****************************************************************
N SDAPINAM,SDRTNNAM,SDSTART,SDRESULT,%,%H,%I,X
S SDAPINAM="NEXTAPPT",SDRTNNAM="SDAMA201",SDRESULT=0
K ^TMP($J,SDRTNNAM,SDAPINAM)
;
;Validate input parameters
S SDRESULT=$$VALIDATE^SDAMA200(.SDPATIEN,.SDFIELDS,.SDAPSTAT,,,SDAPINAM,SDRTNNAM,.SDIOSTAT)
I SDRESULT=-1 Q -1
;
;Get current date/time
D NOW^%DTC
S SDSTART=$E(%,1,12)
;GET NEXT APPOINTMENT DATA
;If an appt was found and the user wants data returned, get fields requested
N SDICN,SDARRAY,SDCOUNT,SDAPLST,SDI,SDTMP,SDNUM,SDERR,SDFLDCNT,SDR,SDFLD,SD310
N SDAPT,SDCLN,SDFFLD,SDFS
S SDAPLST=""
;
S SDARRAY(1)=SDSTART ; set searchpoint to current date/time
; Translate and set up Appointment Status List
I $L($G(SDAPSTAT))>0 D
. ;Remove a leading and a trailing semicolon
. I $E(SDAPSTAT,$L(SDAPSTAT))=";" S SDAPSTAT=$E(SDAPSTAT,1,($L(SDAPSTAT)-1))
. I $E(SDAPSTAT)=";" S SDAPSTAT=$E(SDAPSTAT,2,$L(SDAPSTAT))
. ;IO/Appt Statuses have been validated by SDAMA200 to be I or O/R NT
. I $L($G(SDIOSTAT))=1 S SDAPLST=$S(SDIOSTAT="I":"I;",SDIOSTAT="O":SDAPSTAT_";")
. I $L($G(SDIOSTAT))'=1 D
.. ;Reset appointment status R=R;I C=CC;CP;CCR;CPR N=NS,NSR
.. S SDNUM=$L(SDAPSTAT,";") F SDI=1:1:SDNUM D
... S SDTMP=$P(SDAPSTAT,";",SDI)
... S SDTMP=$S(SDTMP="R":"R;I",SDTMP="C":"CC;CP;CCR;CPR",SDTMP="N":"NS;NSR",1:SDTMP)
... S SDAPLST=SDAPLST_SDTMP_";"
. S SDARRAY(3)=$E(SDAPLST,1,($L(SDAPLST)-1)) ; Axe trailing semicolon
S SDARRAY(4)=SDPATIEN
S SDARRAY("MAX")=1
; Must request at least 1 field, will ask for date/time which is field 1
S SDFIELDS=$G(SDFIELDS),(SDFFLD,SDFIELDS)=$S(SDFIELDS'="":SDFIELDS,1:1)
; Strip out field 12 if it exists, replace with 3 if 3 is not already there
; If we have both 3 and 12 in the field list, remove the 12 and a semicolon
I (";"_SDFIELDS_";")[";12;",((";"_SDFIELDS_";")[";3;") D
. S SDNUM=$L(SDFFLD,";"),SDI=$F(SDFFLD,12)
. I SDI=3 S SDFFLD=$E(SDFFLD,4,$L(SDFFLD)) Q
. S SDFFLD=$E(SDFFLD,1,(SDI-4))_$E(SDFFLD,SDI,$L(SDFFLD))
I ((";"_SDFIELDS_";")[";12;")&((";"_SDFIELDS_";")'[";3;") S SDNUM=$L(SDFFLD,";") D
. F SDI=1:1:SDNUM S SDR=$P(SDFFLD,";",SDI) I SDR=12 S $P(SDFFLD,";",SDI)=3 Q
;
S SDARRAY("FLDS")=$S(SDFFLD'="":SDFFLD,1:1)
F SDI=1:1 S SDTMP=$P(SDFIELDS,";",SDI) Q:SDTMP="" S SDFS(SDTMP)=SDI
; Setup done, call SDAPI, quit if no appointment (SDCOUNT=0) and return 0
S SDCOUNT=$$SDAPI^SDAMA301(.SDARRAY) Q:SDCOUNT=0 0
;If we have an appointment, process it
I SDCOUNT=1,SDFIELDS'="" S SDFLDCNT=$L(SDFIELDS,";") D:SDPATIEN'=""
. ;If malformed appointment data, set SDCOUNT to 0, quit
. S SDCLN=$O(^TMP($J,"SDAMA301",SDPATIEN,"")) I SDCLN="" S SDCOUNT=0 Q
. S SDAPT=$O(^TMP($J,"SDAMA301",SDPATIEN,SDCLN,"")) I SDAPT="" S SDCOUNT=0 Q
. S SD310=$G(^TMP($J,"SDAMA301",SDPATIEN,SDCLN,SDAPT)) I SD310="" S SDCOUNT=0 Q
. S SDTMP="" F SDI=1:1:SDFLDCNT S SDTMP=$O(SDFS(SDTMP)) Q:SDTMP="" D
.. I "^1^5^9^11^"[(U_SDTMP_U) S ^TMP($J,"SDAMA201","NEXTAPPT",SDTMP)=$P(SD310,U,SDTMP) Q
.. I "^2^4^8^10^"[(U_SDTMP_U) S ^TMP($J,"SDAMA201","NEXTAPPT",SDTMP)=$TR($P(SD310,U,SDTMP),";","^") Q
.. I SDTMP=7 S ^TMP($J,"SDAMA201","NEXTAPPT",SDTMP)=$S($P(SD310,"^",SDTMP)="":"N",1:$P(SD310,"^",SDTMP)) Q
.. S SDFLD="FLD"_SDTMP
.. I "^3^6^12^"[(U_SDTMP_U) D @(SDFLD)
;If err, set up err node
I SDCOUNT=-1 D
. S SDERR=$O(^TMP($J,"SDAMA301",""))
. S SDERR=$S(SDERR=101:101,SDERR=115:114,SDERR=116:114,1:117)
. D ERROR^SDAMA200(SDERR,"NEXTAPPT",0,"SDAMA201")
K ^TMP($J,"SDAMA301")
Q SDCOUNT
;Xlate output from SDAPI as required
FLD3 S SDR=$P($P(SD310,U,SDTMP),";",1)
S SDR=$S(SDR="I":"R",SDR?1(1"CC",1"CP",1"CPR"):"C",SDR?1(1"NS",1"NSR"):"N",1:SDR)
S ^TMP($J,"SDAMA201","NEXTAPPT",SDTMP)=SDR Q
FLD6 S SDR=$G(^TMP($J,"SDAMA301",SDPATIEN,SDCLN,SDAPT,"C"))
S ^TMP($J,"SDAMA201","NEXTAPPT",SDTMP)=SDR Q
FLD12 S SDR=$P($P(SD310,U,3),";",1)
S SDR=$S(SDR="I":"I",SDR="R":"O",SDR="NT":"O",1:"")
S ^TMP($J,"SDAMA201","NEXTAPPT",SDTMP)=SDR Q
SDAMA201 ;BPOIFO/ACS-Scheduling Replacement APIs ; 12/13/04 3:14pm
+1 ;;5.3;Scheduling;**253,275,283,316,347,1015**;13 Aug 1993;Build 21
+2 ;
+3 ;GETAPPT - Returns appointment information for a patient
+4 ;NEXTAPPT - Returns next appointment information for a patient
+5 ;
+6 ;** BEFORE USING THE APIS IN THIS ROUTINE, PLEASE SUBSCRIBE **
+7 ;** TO DBIA #3859 **
+8 ;
+9 ;*****************************************************************
+10 ; CHANGE LOG
+11 ;
+12 ; DATE PATCH DESCRIPTION
+13 ;-------- ---------- -----------------------------------------
+14 ;09/20/02 SD*5.3*253 ROUTINE COMPLETED
+15 ;12/10/02 SD*5.3*275 ADDED PATIENT STATUS FILTER
+16 ;07/03/03 SD*5.3*283 REMOVED 'NO ACTION TAKEN' EDIT
+17 ;09/16/03 SD*5.3*316 CHANGED 'NEXTAPPT' TO START LOOKING 'NOW'
+18 ;07/26/04 SD*5.3*347 NEW VARIABLES USED IN ^%DTC CALL.
+19 ; NEXTAPPT TO GET DATA FROM SDAPI NOT VISTA.
+20 ; GETAPPT WILL RETRIEVE APPT DATA THROUGH
+21 ; SDAPI API. PATIENT STATUS TO OVERWRITE
+22 ; APPOINTMENT STATUS OF "R" OR "R;I".
+23 ; GETAPPT CALLS GETAPPT^SDAMA205.
+24 ;
+25 ;*****************************************************************
GETAPPT(SDPATIEN,SDFIELDS,SDAPSTAT,SDSTART,SDEND,SDRESULT,SDIOSTAT) ;
+1 ;*****************************************************************
+2 ;
+3 ; GET APPOINTMENTS FOR PATIENT
+4 ;
+5 ;INPUT
+6 ; SDPATIEN Patient IEN (required)
+7 ; SDFIELDS Fields requested (optional)
+8 ; SDAPSTAT Appointment Status Filter (optional)
+9 ; SDSTART Start date/time (optional)
+10 ; SDEND End date/time (optional)
+11 ; SDRESULT Record count returned here (optional)
+12 ; SDIOSTAT Patient Status filter (optional)
+13 ;
+14 ;OUTPUT
+15 ; ^TMP($J,"SDAMA201","GETAPPT",X,Y)=FieldYdata
+16 ; where "X" is an incremental appointment counter and
+17 ; "Y" is the field number requested
+18 ;
+19 ;*****************************************************************
+20 ; Call API to Get Appointment(s) for Patient.
+21 DO GETAPPT^SDAMA205(.SDPATIEN,.SDFIELDS,.SDAPSTAT,.SDSTART,.SDEND,.SDRESULT,.SDIOSTAT)
+22 QUIT
+23 ;
NEXTAPPT(SDPATIEN,SDFIELDS,SDAPSTAT,SDIOSTAT) ;
+1 ;*****************************************************************
+2 ;
+3 ; GET NEXT APPOINTMENT FOR PATIENT
+4 ;
+5 ; This API should be called with an EXTRINISIC call. It will
+6 ; return "-1" if an error occurs, "1" if a future appointment
+7 ; exists, or "0" if no future appointment exists. If the user
+8 ; enters field numbers into the optional SDFIELDS parameter and a
+9 ; next appointment is found, the requested fields for that next
+10 ; appointment will be retrieved and put into:
+11 ; ^TMP($J,"SDAMA201","NEXTAPPT")
+12 ;
+13 ;INPUT
+14 ; SDPATIEN Patient IEN (required)
+15 ; SDFIELDS Fields requested (optional)
+16 ; SDAPSTAT Appointment status filter (optional)
+17 ; SDIOSTAT Patient status filter (optional)
+18 ;
+19 ;OUTPUT
+20 ; -1: error
+21 ; 0: no future appointment
+22 ; 1: future appointment exists
+23 ;
+24 ; If "1" is returned and the user has requested fields in the
+25 ; SDFIELDS parameter, the following global is populated:
+26 ; ^TMP($J,"SDAMA201","NEXTAPPT",Y)=FieldYdata
+27 ; where "Y" is the field number requested
+28 ;
+29 ;*****************************************************************
+30 NEW SDAPINAM,SDRTNNAM,SDSTART,SDRESULT,%,%H,%I,X
+31 SET SDAPINAM="NEXTAPPT"
SET SDRTNNAM="SDAMA201"
SET SDRESULT=0
+32 KILL ^TMP($JOB,SDRTNNAM,SDAPINAM)
+33 ;
+34 ;Validate input parameters
+35 SET SDRESULT=$$VALIDATE^SDAMA200(.SDPATIEN,.SDFIELDS,.SDAPSTAT,,,SDAPINAM,SDRTNNAM,.SDIOSTAT)
+36 IF SDRESULT=-1
QUIT -1
+37 ;
+38 ;Get current date/time
+39 DO NOW^%DTC
+40 SET SDSTART=$EXTRACT(%,1,12)
+41 ;GET NEXT APPOINTMENT DATA
+42 ;If an appt was found and the user wants data returned, get fields requested
+43 NEW SDICN,SDARRAY,SDCOUNT,SDAPLST,SDI,SDTMP,SDNUM,SDERR,SDFLDCNT,SDR,SDFLD,SD310
+44 NEW SDAPT,SDCLN,SDFFLD,SDFS
+45 SET SDAPLST=""
+46 ;
+47 ; set searchpoint to current date/time
SET SDARRAY(1)=SDSTART
+48 ; Translate and set up Appointment Status List
+49 IF $LENGTH($GET(SDAPSTAT))>0
Begin DoDot:1
+50 ;Remove a leading and a trailing semicolon
+51 IF $EXTRACT(SDAPSTAT,$LENGTH(SDAPSTAT))=";"
SET SDAPSTAT=$EXTRACT(SDAPSTAT,1,($LENGTH(SDAPSTAT)-1))
+52 IF $EXTRACT(SDAPSTAT)=";"
SET SDAPSTAT=$EXTRACT(SDAPSTAT,2,$LENGTH(SDAPSTAT))
+53 ;IO/Appt Statuses have been validated by SDAMA200 to be I or O/R NT
+54 IF $LENGTH($GET(SDIOSTAT))=1
SET SDAPLST=$SELECT(SDIOSTAT="I":"I;",SDIOSTAT="O":SDAPSTAT_";")
+55 IF $LENGTH($GET(SDIOSTAT))'=1
Begin DoDot:2
+56 ;Reset appointment status R=R;I C=CC;CP;CCR;CPR N=NS,NSR
+57 SET SDNUM=$LENGTH(SDAPSTAT,";")
FOR SDI=1:1:SDNUM
Begin DoDot:3
+58 SET SDTMP=$PIECE(SDAPSTAT,";",SDI)
+59 SET SDTMP=$SELECT(SDTMP="R":"R;I",SDTMP="C":"CC;CP;CCR;CPR",SDTMP="N":"NS;NSR",1:SDTMP)
+60 SET SDAPLST=SDAPLST_SDTMP_";"
End DoDot:3
End DoDot:2
+61 ; Axe trailing semicolon
SET SDARRAY(3)=$EXTRACT(SDAPLST,1,($LENGTH(SDAPLST)-1))
End DoDot:1
+62 SET SDARRAY(4)=SDPATIEN
+63 SET SDARRAY("MAX")=1
+64 ; Must request at least 1 field, will ask for date/time which is field 1
+65 SET SDFIELDS=$GET(SDFIELDS)
SET (SDFFLD,SDFIELDS)=$SELECT(SDFIELDS'="":SDFIELDS,1:1)
+66 ; Strip out field 12 if it exists, replace with 3 if 3 is not already there
+67 ; If we have both 3 and 12 in the field list, remove the 12 and a semicolon
+68 IF (";"_SDFIELDS_";")[";12;"
IF ((";"_SDFIELDS_";")[";3;")
Begin DoDot:1
+69 SET SDNUM=$LENGTH(SDFFLD,";")
SET SDI=$FIND(SDFFLD,12)
+70 IF SDI=3
SET SDFFLD=$EXTRACT(SDFFLD,4,$LENGTH(SDFFLD))
QUIT
+71 SET SDFFLD=$EXTRACT(SDFFLD,1,(SDI-4))_$EXTRACT(SDFFLD,SDI,$LENGTH(SDFFLD))
End DoDot:1
+72 IF ((";"_SDFIELDS_";")[";12;")&((";"_SDFIELDS_";")'[";3;")
SET SDNUM=$LENGTH(SDFFLD,";")
Begin DoDot:1
+73 FOR SDI=1:1:SDNUM
SET SDR=$PIECE(SDFFLD,";",SDI)
IF SDR=12
SET $PIECE(SDFFLD,";",SDI)=3
QUIT
End DoDot:1
+74 ;
+75 SET SDARRAY("FLDS")=$SELECT(SDFFLD'="":SDFFLD,1:1)
+76 FOR SDI=1:1
SET SDTMP=$PIECE(SDFIELDS,";",SDI)
IF SDTMP=""
QUIT
SET SDFS(SDTMP)=SDI
+77 ; Setup done, call SDAPI, quit if no appointment (SDCOUNT=0) and return 0
+78 SET SDCOUNT=$$SDAPI^SDAMA301(.SDARRAY)
IF SDCOUNT=0
QUIT 0
+79 ;If we have an appointment, process it
+80 IF SDCOUNT=1
IF SDFIELDS'=""
SET SDFLDCNT=$LENGTH(SDFIELDS,";")
IF SDPATIEN'=""
Begin DoDot:1
+81 ;If malformed appointment data, set SDCOUNT to 0, quit
+82 SET SDCLN=$ORDER(^TMP($JOB,"SDAMA301",SDPATIEN,""))
IF SDCLN=""
SET SDCOUNT=0
QUIT
+83 SET SDAPT=$ORDER(^TMP($JOB,"SDAMA301",SDPATIEN,SDCLN,""))
IF SDAPT=""
SET SDCOUNT=0
QUIT
+84 SET SD310=$GET(^TMP($JOB,"SDAMA301",SDPATIEN,SDCLN,SDAPT))
IF SD310=""
SET SDCOUNT=0
QUIT
+85 SET SDTMP=""
FOR SDI=1:1:SDFLDCNT
SET SDTMP=$ORDER(SDFS(SDTMP))
IF SDTMP=""
QUIT
Begin DoDot:2
+86 IF "^1^5^9^11^"[(U_SDTMP_U)
SET ^TMP($JOB,"SDAMA201","NEXTAPPT",SDTMP)=$PIECE(SD310,U,SDTMP)
QUIT
+87 IF "^2^4^8^10^"[(U_SDTMP_U)
SET ^TMP($JOB,"SDAMA201","NEXTAPPT",SDTMP)=$TRANSLATE($PIECE(SD310,U,SDTMP),";","^")
QUIT
+88 IF SDTMP=7
SET ^TMP($JOB,"SDAMA201","NEXTAPPT",SDTMP)=$SELECT($PIECE(SD310,"^",SDTMP)="":"N",1:$PIECE(SD310,"^",SDTMP))
QUIT
+89 SET SDFLD="FLD"_SDTMP
+90 IF "^3^6^12^"[(U_SDTMP_U)
DO @(SDFLD)
End DoDot:2
End DoDot:1
+91 ;If err, set up err node
+92 IF SDCOUNT=-1
Begin DoDot:1
+93 SET SDERR=$ORDER(^TMP($JOB,"SDAMA301",""))
+94 SET SDERR=$SELECT(SDERR=101:101,SDERR=115:114,SDERR=116:114,1:117)
+95 DO ERROR^SDAMA200(SDERR,"NEXTAPPT",0,"SDAMA201")
End DoDot:1
+96 KILL ^TMP($JOB,"SDAMA301")
+97 QUIT SDCOUNT
+98 ;Xlate output from SDAPI as required
FLD3 SET SDR=$PIECE($PIECE(SD310,U,SDTMP),";",1)
+1 SET SDR=$SELECT(SDR="I":"R",SDR?1(1"CC",1"CP",1"CPR"):"C",SDR?1(1"NS",1"NSR"):"N",1:SDR)
+2 SET ^TMP($JOB,"SDAMA201","NEXTAPPT",SDTMP)=SDR
QUIT
FLD6 SET SDR=$GET(^TMP($JOB,"SDAMA301",SDPATIEN,SDCLN,SDAPT,"C"))
+1 SET ^TMP($JOB,"SDAMA201","NEXTAPPT",SDTMP)=SDR
QUIT
FLD12 SET SDR=$PIECE($PIECE(SD310,U,3),";",1)
+1 SET SDR=$SELECT(SDR="I":"I",SDR="R":"O",SDR="NT":"O",1:"")
+2 SET ^TMP($JOB,"SDAMA201","NEXTAPPT",SDTMP)=SDR
QUIT