- SDESCHECKOUT ;ALB/BWF,CGP,JAS,ANU - Checkout Appointment - VISTA SCHEDULING RPCS ;JAN 11, 2024
- ;;5.3;Scheduling;**826,827,836,853,867,869**;Aug 13, 1993;Build 13
- ;;Per VHA Directive 6402, this routine should not be modified
- ; Reference to MAS PARAMETERS in ICR #483
- ; Reference to WARD LOCATION in ICR #1377
- ; Reference to MAS PARAMETERS in ICR #2296
- ; Reference to VISIT in ICR #2028
- ;
- Q
- CHECKOUT(SDECY,APPTIEN,CHKOUTDT) ;Check Out appt
- ; Returns SDECY
- ; Input -- APPTIEN Appt IEN from 409.84
- ; CHKOUTDT Appt Checkout Date/Time in ISO
- ;
- N CLINICIEN,SDASK,SDCOACT,SDDA,SDLNE,SDQUIET,APPTIENS,RESOURCE,ERRORS,DFN,APPTDATA,DFN,RESOURCE,CLINICIEN,CHKOUT
- S APPTIEN=$G(APPTIEN),CHKOUTDT=$G(CHKOUTDT)
- D VALAPPTIEN^SDESVALUTIL(.ERRORS,APPTIEN)
- S APPTIENS=APPTIEN_","
- D GETS^DIQ(409.84,APPTIENS,".01;.05;.07;.12;.16","I","APPTDATA")
- I $G(APPTDATA(409.84,APPTIENS,.12,"I")) D ERRLOG^SDESJSON(.ERRORS,322)
- S APPTDTTM=$G(APPTDATA(409.84,APPTIENS,.01,"I"))
- S DFN=$G(APPTDATA(409.84,APPTIENS,.05,"I"))
- S RESOURCE=$G(APPTDATA(409.84,APPTIENS,.07,"I"))
- S VPRV=$G(APPTDATA(409.84,APPTIENS,.16,"I"))
- S CLINICIEN=$$GET1^DIQ(409.831,RESOURCE,.04,"I")
- S CHKOUTDT=$$VALCHKOUTDT(.ERRORS,CHKOUTDT,CLINICIEN)
- I $D(ERRORS) S ERRORS("CheckOut",1)="" D BUILDJSON^SDESBUILDJSON(.SDECY,.ERRORS) Q
- ;
- S SDDA=0
- S SDASK=0
- S SDCOACT="CO"
- S SDLNE=""
- S SDQUIET=1
- ; Event driver "BEFORE" actions - from SD*5.3*717 10/25/18
- N SDATA,SDDA,SDCIHDL ;
- S SDDA=$$FIND(DFN,APPTDTTM,CLINICIEN)
- I 'SDDA D Q
- .D ERRLOG^SDESJSON(.ERRORS,317)
- .S ERRORS("CheckOut",1)="" D BUILDJSON^SDESBUILDJSON(.SDECY,.ERRORS)
- I '$$GET1^DIQ(44.003,SDDA_","_APPTDTTM_","_CLINICIEN_",",309,"I") D Q
- .D ERRLOG^SDESJSON(.ERRORS,318)
- .S ERRORS("CheckOut",1)="" D BUILDJSON^SDESBUILDJSON(.SDECY,.ERRORS)
- ;
- S SDATA=SDDA_U_DFN_U_APPTDTTM_U_CLINICIEN
- S SDCIHDL=$$HANDLE^SDAMEVT(1) ;
- ; Event driver "BEFORE"
- D BEFORE^SDAMEVT(.SDATA,DFN,APPTDTTM,CLINICIEN,SDDA,SDCIHDL) ;
- ; Appointment checkout
- D CHKOUT(DFN,APPTDTTM,CLINICIEN,SDDA,SDASK,CHKOUTDT,SDCOACT,SDLNE,APPTIEN,SDQUIET,VPRV,.ERRORS)
- ; Skip event driver actions if err occurred checking appointment out. - wtc SD*5.3*717 10/25/2018
- I $D(ERRORS) S ERRORS("CheckOut",1)="" D BUILDJSON^SDESBUILDJSON(.SDECY,.ERRORS) Q
- ; Event driver "AFTER"
- D AFTER^SDAMEVT(.SDATA,DFN,APPTDTTM,CLINICIEN,SDDA,SDCIHDL) ;
- ; Execute event driver. 5=check out (see #409.66), 2=non-interactive
- D EVT^SDAMEVT(.SDATA,5,2,SDCIHDL) ;
- S CHKOUT("CheckOut",1)="Checked Out." D BUILDJSON^SDESBUILDJSON(.SDECY,.CHKOUT)
- Q
- VALCHKOUTDT(ERRORS,CHKOUTDT,CLINIC) ;
- N CHKOUTDTFM,CHKIN
- S CHKIN=$$GET1^DIQ(409.84,APPTIEN,.03,"I")
- S CHKOUTDTFM=""
- I CHKOUTDT="" D ERRLOG^SDESJSON(.ERRORS,23) Q CHKOUTDTFM
- S CHKOUTDTFM=$$ISOTFM^SDAMUTDT(CHKOUTDT,CLINIC)
- I CHKOUTDTFM<0 D ERRLOG^SDESJSON(.ERRORS,24) Q CHKOUTDTFM
- I $P(CHKOUTDTFM,".",2)="" D ERRLOG^SDESJSON(.ERRORS,321) Q CHKOUTDTFM
- ; checkout time cannot be in the future
- I CHKOUTDTFM>$$NOW^XLFDT D ERRLOG^SDESJSON(.ERRORS,320) Q CHKOUTDTFM
- ; checkout time is after checkin time
- I CHKOUTDTFM'>CHKIN D ERRLOG^SDESJSON(.ERRORS,52,"Check Out time must be at least 1 minute after the Check In time of "_$TR($$FMTE^XLFDT(CHKIN),"@"," ")_".")
- Q CHKOUTDTFM
- ;
- FIND(DFN,APPTDTTM,CLINICIEN) ; -- return appt ifn for pat
- ; input: DFN := ifn of pat.
- ; APPTDTTM := appt d/t
- ; CLINICIEN := ifn of clinic
- ; output: [returned] := ifn if pat has appt on date/time
- ;
- N Y,FOUND,RET
- S RET=""
- S (Y,FOUND)=0
- F S Y=$O(^SC(CLINICIEN,"S",APPTDTTM,1,Y)) Q:'Y!(FOUND) D
- .I '$D(^SC(CLINICIEN,"S",APPTDTTM,1,Y,0)) Q
- .I DFN'=$$GET1^DIQ(44.003,Y_","_APPTDTTM_","_CLINICIEN_",",.01,"I") Q
- .I $D(^DPT(DFN,"S",APPTDTTM,0)),$$VALID(DFN,CLINICIEN,APPTDTTM,Y) S FOUND=1,RET=Y Q
- Q RET
- ;
- VALID(DFN,CLINICIEN,APPTDTTM,SDDA) ;
- ; input: DFN := ifn of pat.
- ; APPTDTTM := appt d/t
- ; CLINICIEN := ifn of clinic
- ; SDDA := ifn of appt
- ; output: [returned] := 1 for valid appt., 0 for not valid
- N APPTCAN44,APPTCAN2
- S APPTCAN44=$$GET1^DIQ(44.003,SDDA_","_APPTDTTM_","_CLINICIEN_",",310,"I")
- S APPTCAN2=$$GET1^DIQ(2.98,APPTDTTM_","_DFN_",",3,"I")
- Q $S(APPTCAN44'="C":1,APPTCAN2["C":1,1:0)
- ;
- ; from CO^SDEC25A
- CHKOUT(DFN,APPTDTTM,CLINICIEN,SDDA,SDASK,CHKOUTDT,SDCOACT,SDLNE,SDECAPTID,SDQUIET,VPRV,ERRORS) ;Appt Check Out
- ; Input -- DFN Patient file IEN
- ; APPTDTTM Appointment Date/Time
- ; CLINICIEN Hospital Location file IEN for Appt
- ; SDDA IEN in ^SC multiple or null [Optional]
- ; SDASK Ask Check Out Date/Time [Optional]
- ; CHKOUTDT Date/Time of Check Out [Optional]
- ; SDCOACT Appt Mgmt Check Out Action [Optional]
- ; SDLNE Appt Mgmt Line Number [Optional]
- ; Input -- SDECAPTID Appointment ID
- ; SDQUIET No Terminal output 0=allow display 1=do not allow
- ; VPRV V Provider IEN - pointer to V PROVIDER file
- ; ERRORS Returned Array of errors
- ;
- N SDCOQUIT,SDOE,SDATA
- S SDATA=$G(^DPT(DFN,"S",APPTDTTM,0))
- ;-- if new encounter, pass to PCE
- I $$NEW(APPTDTTM) D Q
- .N SDCOED
- .;ANU - Add ERRORS
- .S SDOE=$$GETAPT(DFN,APPTDTTM,CLINICIEN,.ERRORS)
- .I $D(ERRORS) Q
- .;
- .S SDCOED=$$CHK($TR($$STATUS(DFN,APPTDTTM,CLINICIEN,SDATA,SDDA),";","^"))
- .; -- appt has already been checked out
- .I $$CODT(DFN,APPTDTTM,CLINICIEN,SDDA)!(SDCOED) D Q
- ..D ERRLOG^SDESJSON(.ERRORS,319)
- .D CHKOUT2(SDOE,DFN,APPTDTTM,CLINICIEN,CHKOUTDT,SDECAPTID,SDQUIET,VPRV,.ERRORS)
- Q
- CODT(DFN,SDT,SDCL,SDDA) ; -- does appt have co date
- Q $$GET1^DIQ(44.003,SDDA_","_SDT_","_SDCL_",",303,"I")
- ;
- NEW(DATE) ;-- return 1 if SD is turned on for
- ; Visit Tracking and optionally check if the date is past
- ; the cut over date for the new PCE interface.
- ; INPUT : DATE (Optional) Date to check for cut over.
- ; OUTPUT: 1 Yes, 0 No
- N SDRES,SDX,SDY
- I '$G(DATE) S DATE=DT
- ;-- is Scheduling on ?
- S SDRES=0,SDY=$$PKGON^VSIT("SD")
- ;-- if date is it pass cut over?
- S SDX=1 I $G(DATE) S SDX=$$SWITCHCK^PXAPI(DATE)
- ;-- And together
- I SDX,SDY S SDRES=1
- Q SDRES
- ;
- GETAPT(DFN,SDT,SDCL,SDVIEN,ERRORS) ;
- ; ANU - Added ERRORS
- ; This utility will return the existing IEN for an Outpatient
- ; Encounter. If it fails to find an existing encounter,
- ; it will create a new Encounter and return the new IEN.
- ;
- ; Input -- DFN Patient file IEN
- ; SDT Appointment Date/Time
- ; SDCL Hospital Location file IEN for Appt
- ; SDVIEN Visit file pointer [optional]
- ; Output -- Outpatient Encounter file IEN
- N Y
- S Y=$$GET1^DIQ(2.98,SDT_","_DFN_",",21,"I")
- I 'Y D APPT(DFN,SDT,SDCL,$G(SDVIEN),.ERRORS)
- I $D(ERRORS) Q +$G(Y)
- I '$D(ERRORS) S Y=$$GET1^DIQ(2.98,SDT_","_DFN_",",21,"I")
- ;
- I Y D VIEN(Y,$G(SDVIEN))
- Q +$G(Y)
- ;
- ; FROM APPT^SDVSIT
- APPT(DFN,SDT,SDCL,SDVIEN,ERRORS) ; -- process appt
- ; input DFN = ien of patient file entry
- ; SDT = visit date internal format
- ; SDCL = ien of hospital location file entry
- ; SDVIEN = Visit file pointer [optional]
- ;
- N SDVSIT,SDOE,DA,DIE,DR,SDPT,SDSC,SDCL0,SDDA,SDLOCK,SDLCKS
- ;
- ; -- set lock data and lock
- S SDLOCK("DFN")=DFN
- S SDLOCK("EVENT DATE/TIME")=SDT
- ;ANU
- ;D LOCK(.SDLOCK)
- I '$$LOCK(.SDLOCK) D ERRLOG^SDESJSON(.ERRORS,174) Q
- ;
- ; -- set node vars
- S SDPT=$G(^DPT(DFN,"S",SDT,0))
- S SDCL0=$G(^SC(SDCL,0)),SDDA=+$$FIND^SDAM2(DFN,SDT,SDCL)
- S SDSC=$G(^SC(SDCL,"S",SDT,1,SDDA,0))
- S SDVSIT("CLN")=$P(SDCL0,U,7),SDVSIT("DIV")=$$DIV($P(SDCL0,U,15))
- ;
- ; -- do checks
- I 'SDPT!('SDSC)!($P(SDCL0,U,3)'="C") D UNLOCK(.SDLOCK) Q
- I SDCL,+SDPT'=SDCL D UNLOCK(.SDLOCK) Q
- I $P(SDPT,U,20) D UNLOCK(.SDLOCK) Q
- I 'SDVSIT("CLN")!('SDVSIT("DIV")) D UNLOCK(.SDLOCK)
- ;
- ; -- set the rest
- S SDVSIT("DFN")=DFN,SDVSIT("LOC")=SDCL
- S:$P(SDSC,U,10) SDVSIT("ELG")=$P(SDSC,U,10)
- S:$P(SDPT,U,16) SDVSIT("TYP")=$P(SDPT,U,16)
- ;
- ; -- call logic to add opt encounter(s)
- S SDVSIT("ORG")=1,SDVSIT("REF")=SDDA,SDOE=$$SDOE(SDT,.SDVSIT,$G(SDVIEN))
- I SDOE D
- .;869 - Convert ///
- .;N DA,DIE,DR
- .;S DA=SDT,DA(1)=DFN,DR="21////"_SDOE,DIE="^DPT("_DFN_",""S""," D ^DIE
- .N FDAIENS,ERR298,FDA298
- .S FDAIENS=SDT_","_DFN_","
- .S FDA298(2.98,FDAIENS,21)=SDOE
- .D FILE^DIE(,"FDA298","ERR298")
- .;
- D CSTOP(SDOE,SDCL,.SDVSIT,SDT) ;Process credit stop if applicable
- D UNLOCK(.SDLOCK)
- Q
- ; FROM LOCK^SDVSIT
- ; Anu - function to return lock error
- ; Status = 1 if success, 0 if fail
- LOCK(SDLOCK) ; -- lock "ADFN" node
- N SDC
- ;F L +^SCE("ADFN",+$G(SDLOCK("DFN")),+$G(SDLOCK("EVENT DATE/TIME"))):$G(DILOCKTM,3) Q:$T ;LLS - 05-JAN-15 - SD*5.3*630 added timeout on lock
- F SDC=1:1:5 L +^SCE("ADFN",+$G(SDLOCK("DFN")),+$G(SDLOCK("EVENT DATE/TIME"))):$G(DILOCKTM,3) Q:$T
- I $T Q 1
- Q 0
- ; FROM UNLOCK^SDVSIT
- UNLOCK(SDLOCK) ; -- unlock "ADFN" node
- L -^SCE("ADFN",+$G(SDLOCK("DFN")),+$G(SDLOCK("EVENT DATE/TIME")))
- Q
- ; FROM SDOE^SDVSIT
- SDOE(SDT,SDVSIT,SDVIEN,SDOEP) ; -- get visit & encounter
- N SDTR,SDI ;LLS 22-DEC-2014 - SD*5.3*630 - added
- S SDTR=9999999-$P(SDT,".") ;LLS 22-DEC-2014 - SD*5.3*630 - added
- I SDT["." S SDTR=SDTR_"."_$P(SDT,".",2) ;LLS 22-DEC-2014 - SD*5.3*630 - added
- I '$D(SDVSIT("PAR")),$G(SDVIEN)="" D ;LLS 22-DEC-2014 - SD*5.3*630 - added the following section
- .N SDVISARR,SDVIEN1
- .S SDVIEN1="" F S SDVIEN1=$O(^AUPNVSIT("AA",DFN,SDTR,SDVIEN1)) Q:SDVIEN1="" D Q:$G(SDVIEN)]""
- ..; COMPARE VISIT: SERVICE CATEGORY, POINTER TO CLINIC STOP FILE, POINTER TO #44
- ..; FILE, & ENCOUNTER TYPE BEFORE SELECTING EXISTING VISIT INSTEAD OF CREATING A NEW ONE
- ..D GETS^DIQ(9000010,SDVIEN1_",",".07;.08;.22;15003","I","SDVISARR")
- ..;Q:SDVISARR(9000010,SDVIEN1_",",.07,"I")'=$S($G(SDVSIT("SVC"))]"":SDVSIT("SVC"),$$INP^SDAM2(DFN,SDTR)="I":"I",1:"A")
- ..Q:SDVISARR(9000010,SDVIEN1_",",.07,"I")'=$S($G(SDVSIT("SVC"))]"":SDVSIT("SVC"),$$INP(DFN,SDTR)="I":"I",1:"A")
- ..Q:SDVISARR(9000010,SDVIEN1_",",.08,"I")'=$G(SDVSIT("CLN"))
- ..Q:SDVISARR(9000010,SDVIEN1_",",.22,"I")'=$G(SDVSIT("LOC"))
- ..Q:SDVISARR(9000010,SDVIEN1_",",15003,"I")'="P"
- ..S SDVIEN=SDVIEN1
- S SDVSIT("VST")=$G(SDVIEN)
- ; bwf - SD*826 - leaving calls to SDVSIT0 - consider bringing into SDES* namespace in the future
- I 'SDVSIT("VST") D VISIT^SDVSIT0(SDT,.SDVSIT)
- Q $$NEW^SDVSIT0(SDT,.SDVSIT)
- ;
- INP(DFN,VDATE) ; -- determine inpatient status ; dom is not an inpatient appt
- N SDINP,VAINDT,VADMVT,WARDLOC
- S SDINP="",VAINDT=VDATE D ADM^VADPT2 I 'VADMVT Q SDINP
- S WARDLOC=$$GET1^DIQ(405,VADMVT,.06,"I")
- I $$GET1^DIQ(43,1,16,"I"),$$GET1^DIQ(42,WARDLOC,.03,"I")="D" Q SDINP
- S SDINP="I"
- Q SDINP
- ;
- DIV(DIV) ; -- determine med div
- ; multi-div
- I $$GET1^DIQ(43,1,11,"I"),$D(^DG(40.8,+DIV,0)) Q DIV
- S DIV=+$O(^DG(40.8,0))
- Q DIV
- ;
- ; FROM CSTOP^SDVSIT
- CSTOP(SDOE,SDCL,SDVSIT,SDT) ;Process credit stop
- ;Input: SDOE=encounter ien
- ;Input: SDCL0=zeroeth node of HOSPITAL LOCATION file record
- ;Input: SDVSIT=visit data array (pass by reference)
- ;Input: SDT=encounter date/time
- ; -- does clinic have a credit stop code?
- ; -- process only if non non-count and not equal to credit
- ;
- N CREDSCODE,NONCOUNT,CLINSTOPCODE,CSTOPINACTDT,IENS,CLINDAT
- S IENS=SDCL_","
- D GETS^DIQ(44,IENS,"8;2502;2503","I","CLINDAT","ERR")
- S CREDSCODE=$G(CLINDAT(44,IENS,2503,"I"))
- S NONCOUNT=$G(CLINDAT(44,IENS,2502,"I"))
- S CLINSTOPCODE=$G(CLINDAT(44,IENS,8,"I"))
- S CSTOPINACTDT=$$GET1^DIQ(40.7,CLINSTOPCODE,2,"I")
- I SDOE,CREDSCODE,(CREDSCODE'=SDVSIT("CLN")),NONCOUNT'="Y" D
- .N X,SDVIENSV,SDVIENOR
- .; -- is stop code active?
- .I $S('CSTOPINACTDT:1,1:SDT<CSTOPINACTDT) D
- ..S SDVSIT("CLN")=CREDSCODE
- ..S SDVIENOR=$G(SDVSIT("ORG"))
- ..S SDVSIT("ORG")=4
- ..S SDVSIT("PAR")=SDOE
- ..S SDVIENSV=$G(SDVSIT("VST"))
- ..K SDVSIT("VST")
- ..S X=$$SDOE(SDT,.SDVSIT)
- ..I X D LOGDATA(X)
- ..; -- restore SDVSIT
- ..S SDVSIT("CLN")=CLINSTOPCODE
- ..S SDVSIT("ORG")=SDVIENOR
- ..S SDVSIT("VST")=SDVIENSV
- ..K SDVSIT("PAR")
- ..Q
- .Q
- Q
- LOGDATA(SDOE,SDLOG) ; -- log user, date/time and other data
- N DIE,DA,DR,Y,X
- S SDLOG("USER")=$G(DUZ)
- S SDLOG("DATE/TIME")=$$NOW^XLFDT()
- S DIE="^SCE(",DA=SDOE,DR="[SD ENCOUNTER LOG]" D ^DIE
- Q
- ;
- VIEN(SDOE,SDVIEN) ; -- stuff in Visit IEN if not already set
- ; -- needed for those sites that don't have
- ; scheduling turned on in Visit Tracking
- ; Required input SDOE = Outpatient Encounter pointer
- ; SDVIEN = Visit file pointer or null or zero
- ;
- ; -- quit if no vien passed
- Q:'SDVIEN
- ; -- quit is no encounter
- Q:'$D(^SCE(+SDOE,0))
- ; -- set visit ien if vien not already set
- I '$$GET1^DIQ(409.68,+SDOE,.05,"I") D
- .;869 - Convert ////
- .;S DIE="^SCE(",DA=SDOE,DR=".05////"_SDVIEN D ^DIE
- .N FDA40968,ERR40968
- .S FDA40968(409.68,SDOE_",",.05)=SDVIEN
- .D FILE^DIE(,"FDA40968","ERR40968") K FDA40968
- .;
- I '$$GET1^DIQ(409.68,+SDOE,.04,"I") D
- .;869 - Converting ////
- .N SDLOC,FDA40968,ERR40968
- .S SDLOC=$$GET1^DIQ(9000010,SDVIEN,.22,"I")
- .;I SDLOC S DIE="^SCE(",DA=SDOE,DR=".04////"_SDLOC D ^DIE
- .I SDLOC D
- ..S FDA40968(409.68,SDOE_",",.04)=SDLOC
- ..D FILE^DIE(,"FDA40968","ERR40968")
- Q
- ;
- ;CO^SDEC25B
- CHKOUT2(SDOE,DFN,APPTDTTM,CLINICIEN,CHKOUTDT,SDECAPTID,SDQUIET,VPRV,ERRORS) ;EP; called to ask check-out date/time ;SAT ADDED PARAMETERS CHKOUTDT, SDECAPTID, & SDQUIET
- ; Called by SDCO1
- ; SDOE = Outpatient Encounter IEN
- ; DFN = Patient IEN
- ; APPTDTTM = Appt Date/Time
- ; CLINICIEN = Clinic IEN
- ; CHKOUTDT = APPT CHECKOUT TIME [OPTIONAL - USED WHEN SDQUIET=1] USER ENTERED FORMAT
- ; SDECAPTID = APPT ID - POINTER TO ^SDECAPPT
- ; SDQUIET = ALLOW NO TERMINAL INPUT/OUTPUT 0=ALLOW; 1=DO NOT ALLOW
- ; VPRV = V Provider IEN - pointer to V PROVIDER file
- ; ERRORS = Returned Array of errors
- ;
- N DIE,DA,DR,SDECNOD,SDN,SDV,AUPNVSIT,PROVIEN40984,PSTAT
- ;
- ; 869 - Convert ///
- ;S DR="303///"_CHKOUTDT_";304///`"_DUZ_";306///"_$$NOW^XLFDT
- ;D ^DIE
- ;S DIE="^SC("_CLINICIEN_",""S"","_APPTDTTM_",1,"
- ;S DA(2)=CLINICIEN,DA(1)=APPTDTTM
- N IENS44,ERR44003,FDA
- S (DA,SDN)=$$SCIEN(DFN,CLINICIEN,APPTDTTM)
- S IENS44=$$GET44RECORDIENS^SDESCANCELAPPTS(CLINICIEN,APPTDTTM,DFN)
- S FDA(44.003,IENS44,303)=CHKOUTDT
- S FDA(44.003,IENS44,304)=DUZ
- S FDA(44.003,IENS44,306)=$$NOW^XLFDT
- D FILE^DIE(,"FDA","ERR44003") K ERR44003
- ;
- ; if checked out and status not updated, do it now
- I $$GET1^DIQ(44.003,DA_","_APPTDTTM_","_CLINICIEN_",",303,"I")]"" D
- .;UPDATE APPT SCHEDULE GLOBAL ^SDEC(409.84
- .I $G(SDECAPTID) D
- ..S PSTAT=$$GET1^DIQ(409.68,SDOE,.12,"I")
- ..;869 - Convert ///
- ..;S DA=SDECAPTID
- ..;S DR=".14///"_$G(CHKOUTDT)_";.19///"_PSTAT
- ..;D ^DIE
- ..N FDA40984,ERR40984
- ..S FDA40984(409.84,SDECAPTID_",",.14)=$G(CHKOUTDT)
- ..S FDA40984(409.84,SDECAPTID_",",.19)=$G(PSTAT)
- ..D FILE^DIE(,"FDA40984","ERR40984")
- ..;
- ..;possibly update VProvider
- ..S SDECNOD=^SDEC(409.84,SDECAPTID,0)
- ..S PROVIEN40984=$$GET1^DIQ(409.84,SDECAPTID,.15,"I")
- ..I $G(VPRV),PROVIEN40984 D
- ...;get SDEC appt schedule
- ...;869 - Convert ///
- ...;S DA=PROVIEN40984 ;S DR=".01///"_VPRV
- ...;D ^DIE
- ...N FDA91006,ERR91006
- ...S FDA91006(9000010.06,PROVIEN40984_",",.01)=VPRV
- ...D FILE^DIE(,"FDA91006","ERR91006") K FDA91006
- .;
- .Q:$$GET1^DIQ(409.68,SDOE,.12)="CHECKED OUT"
- .;869 - Convert ///
- .;S DIE=409.68,DA=SDOE,DR=".12///14;101///"_DUZ_";102///"_$$NOW^XLFDT
- .;D ^DIE
- .N FDA40968,ERR40968
- .S FDA40968(409.68,SDOE_",",.12)=14
- .S FDA40968(409.68,SDOE_",",101)=DUZ
- .S FDA40968(409.68,SDOE_",",102)=$$NOW^XLFDT
- .D FILE^DIE(,"FDA40968","ERR40968")
- .;
- .; if visit pointer stored, update visit checkout date/time
- .S SDV=$$GET1^DIQ(409.68,SDOE,.05,"I") Q:'SDV
- .Q:'$D(^AUPNVSIT(SDV,0)) Q:$$GET1^DIQ(9000010,SDV,.05,"I")'=DFN
- .Q:$$GET1^DIQ(9000010,SDV,.11,"I")=1 ;deleted
- .;cmi/maw 5/1/2009 PATCH 1010 RQMT 34
- .;869 - Convert ///
- .;S DIE="^AUPNVSIT(",DA=SDV
- .;S DR=".18///"_$$GET1^DIQ(44.003,SDN_","_APPTDTTM_","_CLINICIEN_",",303,"I")
- .;D ^DIE
- .N FDA9000010,ERR9000010
- .S FDA9000010(9000010,SDV_",",.18)=$$GET1^DIQ(44.003,SDN_","_APPTDTTM_","_CLINICIEN_",",303,"I")
- .D FILE^DIE(,"FDA9000010","ERR9000010") K FDA9000010
- .;
- Q
- ;
- SCIEN(PAT,CLINIC,DATE) ;PEP; returns ien for appt in ^SC
- NEW X,IEN
- S X=0 F S X=$O(^SC(CLINIC,"S",DATE,1,X)) Q:'X Q:$G(IEN) D
- . Q:$P($G(^SC(CLINIC,"S",DATE,1,X,0)),U,9)="C" ;cancelled
- . I +$G(^SC(CLINIC,"S",DATE,1,X,0))=PAT S IEN=X
- Q $G(IEN)
- ;
- ;
- CHK(SDSTB) ; -- is appointment checked out
- N Y
- I "^2^8^12^"[("^"_+SDSTB_"^"),$P(SDSTB,"^",3)["CHECKED OUT" S Y=1
- Q +$G(Y)
- ;
- STATUS(DFN,SDT,SDCL,SDATA,SDDA) ; -- return appt status
- ; input: DFN := ifn of pat.
- ; SDT := appt d/t
- ; SDCL := ifn of clinic
- ; SDATA := 0th node of pat appt entry
- ; SDDA := ifn for ^SC(clinic,"S",date,1,ifn) {optional}
- ; output: [returned] := appt status ifn ^ status name ^ print status ^
- ; check in d/t ^ check out d/t ^ adm mvt ifn
- ;
- ;S = status ; C = ci/co indicator ; Y = 'C' node ; P = print status
- N S,C,Y,P,VADMVT,VAINDT,STATUS,SDSCE,SDIEN,CHKINDT,CHKOUTDT
- ;
- ; -- get data for evaluation
- S:'$G(SDDA) SDDA=+$$FIND^SDAM2(DFN,SDT,SDCL)
- S CHKINDT=$$GET1^DIQ(44.003,SDDA_","_SDT_","_SDCL_",",309,"I")
- S CHKOUTDT=$$GET1^DIQ(44.003,SDDA_","_SDT_","_SDCL_",",303,"I")
- ;retrieve CHECK OUT from OUTPATIENT ENCOUNTER file if not in Hospital Location file/PURGED or edited
- S SDSCE=$$GET1^DIQ(2.98,SDT_","_DFN_",",21,"I")
- I SDSCE D ;pointer to OE
- .I CHKOUTDT="" S CHKOUTDT=$$GET1^DIQ(409.68,SDSCE,.07,"I")
- .S SDIEN=SDSCE_"," S STATUS=$$GET1^DIQ(409.68,SDIEN,.12)
- ;
- ; -- set initial status value ; non-count clinic?
- S S=$S($P(SDATA,"^",2)]"":$P($P($P(^DD(2.98,3,0),"^",3),$P(SDATA,"^",2)_":",2),";"),$P($G(^SC(SDCL,0)),U,17)="Y":"NON-COUNT",1:"")
- I SDSCE&(S="NO ACTION TAKEN") S S=""
- ;
- ; -- inpatient?
- S VAINDT=SDT D ADM^VADPT2
- I S["INPATIENT",$S('VADMVT:1,'$P(^DG(43,1,0),U,21):0,1:$P($G(^DIC(42,+$P($G(^DGPM(VADMVT,0)),U,6),0)),U,3)="D") S S=""
- ;
- ; -- determine ci/co indicator
- S C=$S(CHKOUTDT:"CHECKED OUT",CHKINDT:"CHECKED IN",S]"":"",SDT>(DT+.2359):"FUTURE",1:"NO ACTION TAKEN") S:S="" S=C
- ;
- I S="NO ACTION TAKEN",$P(SDT,".")=DT,C'["CHECKED" S C="TODAY"
- ; -- $$REQ & $$COCMP in SDM1A not used for speed
- I S="CHECKED OUT"!(S="CHECKED IN"),SDT'<$P(^DG(43,1,"SCLR"),U,23),'$P(SDATA,U,20) S S="NO ACTION TAKEN"
- ;
- ; -- determine print status
- S P=$S(S=C!(C=""):S,1:"")
- I P="" D
- .I S["INPATIENT",$P($G(^SC(SDCL,0)),U,17)'="Y",$P($G(^SCE(+$P(SDATA,U,20),0)),U,7)="" S P=$P(S," ")_"/ACT REQ" Q
- .I S="NO ACTION TAKEN",C="CHECKED OUT"!(C="CHECKED IN") S P="ACT REQ/"_C D Q
- ..I SDSCE I $P($G(^SCE(SDSCE,0)),U,7) S P="CHECKED OUT"
- .S P=$S(S="NO ACTION TAKEN":S,1:$P(S," "))_"/"_C
- I S["INPATIENT",C="" D
- .I SDT>(DT+.2359) S P=$P(S," ")_"/FUTURE" Q
- .S P=$P(S," ")_"/NO ACT TAKN"
- I S["INPATIENT" Q +$O(^SD(409.63,"AC",S,0))_";"_S_";"_P_";"_CHKINDT_";"_CHKOUTDT_";"_+VADMVT
- I S["NO-SHOW" Q +$O(^SD(409.63,"AC",S,0))_";"_S_";"_P_";"_CHKINDT_";"_CHKOUTDT_";"_+VADMVT
- I $G(SDSCE) I $D(^SCE(SDSCE,0)) D
- .I $G(STATUS)="NON-COUNT" D Q
- ..I CHKOUTDT S P="NON-COUNT/CHECKED OUT" Q
- ..I CHKINDT S P="NON-COUNT/CHECKED IN"
- .I $G(STATUS)="CHECKED OUT" S P="CHECKED OUT" Q
- .I CHKOUTDT S P="ACT REQ/CHECKED OUT" D Q
- ..I $G(STATUS)="ACTION REQUIRED" S S="NO ACTION TAKEN" Q
- ..I $G(STATUS)="" I $P($G(^SCE(SDSCE,0)),U,7) S P="CHECKED OUT"
- .I CHKINDT S P="ACT REQ/CHECKED IN" D
- ..I $G(STATUS)="ACTION REQUIRED" S S="NO ACTION TAKEN"
- Q +$O(^SD(409.63,"AC",S,0))_";"_S_";"_P_";"_CHKINDT_";"_CHKOUTDT_";"_+VADMVT
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDESCHECKOUT 19871 printed Feb 19, 2025@00:22:36 Page 2
- SDESCHECKOUT ;ALB/BWF,CGP,JAS,ANU - Checkout Appointment - VISTA SCHEDULING RPCS ;JAN 11, 2024
- +1 ;;5.3;Scheduling;**826,827,836,853,867,869**;Aug 13, 1993;Build 13
- +2 ;;Per VHA Directive 6402, this routine should not be modified
- +3 ; Reference to MAS PARAMETERS in ICR #483
- +4 ; Reference to WARD LOCATION in ICR #1377
- +5 ; Reference to MAS PARAMETERS in ICR #2296
- +6 ; Reference to VISIT in ICR #2028
- +7 ;
- +8 QUIT
- CHECKOUT(SDECY,APPTIEN,CHKOUTDT) ;Check Out appt
- +1 ; Returns SDECY
- +2 ; Input -- APPTIEN Appt IEN from 409.84
- +3 ; CHKOUTDT Appt Checkout Date/Time in ISO
- +4 ;
- +5 NEW CLINICIEN,SDASK,SDCOACT,SDDA,SDLNE,SDQUIET,APPTIENS,RESOURCE,ERRORS,DFN,APPTDATA,DFN,RESOURCE,CLINICIEN,CHKOUT
- +6 SET APPTIEN=$GET(APPTIEN)
- SET CHKOUTDT=$GET(CHKOUTDT)
- +7 DO VALAPPTIEN^SDESVALUTIL(.ERRORS,APPTIEN)
- +8 SET APPTIENS=APPTIEN_","
- +9 DO GETS^DIQ(409.84,APPTIENS,".01;.05;.07;.12;.16","I","APPTDATA")
- +10 IF $GET(APPTDATA(409.84,APPTIENS,.12,"I"))
- DO ERRLOG^SDESJSON(.ERRORS,322)
- +11 SET APPTDTTM=$GET(APPTDATA(409.84,APPTIENS,.01,"I"))
- +12 SET DFN=$GET(APPTDATA(409.84,APPTIENS,.05,"I"))
- +13 SET RESOURCE=$GET(APPTDATA(409.84,APPTIENS,.07,"I"))
- +14 SET VPRV=$GET(APPTDATA(409.84,APPTIENS,.16,"I"))
- +15 SET CLINICIEN=$$GET1^DIQ(409.831,RESOURCE,.04,"I")
- +16 SET CHKOUTDT=$$VALCHKOUTDT(.ERRORS,CHKOUTDT,CLINICIEN)
- +17 IF $DATA(ERRORS)
- SET ERRORS("CheckOut",1)=""
- DO BUILDJSON^SDESBUILDJSON(.SDECY,.ERRORS)
- QUIT
- +18 ;
- +19 SET SDDA=0
- +20 SET SDASK=0
- +21 SET SDCOACT="CO"
- +22 SET SDLNE=""
- +23 SET SDQUIET=1
- +24 ; Event driver "BEFORE" actions - from SD*5.3*717 10/25/18
- +25 ;
- NEW SDATA,SDDA,SDCIHDL
- +26 SET SDDA=$$FIND(DFN,APPTDTTM,CLINICIEN)
- +27 IF 'SDDA
- Begin DoDot:1
- +28 DO ERRLOG^SDESJSON(.ERRORS,317)
- +29 SET ERRORS("CheckOut",1)=""
- DO BUILDJSON^SDESBUILDJSON(.SDECY,.ERRORS)
- End DoDot:1
- QUIT
- +30 IF '$$GET1^DIQ(44.003,SDDA_","_APPTDTTM_","_CLINICIEN_",",309,"I")
- Begin DoDot:1
- +31 DO ERRLOG^SDESJSON(.ERRORS,318)
- +32 SET ERRORS("CheckOut",1)=""
- DO BUILDJSON^SDESBUILDJSON(.SDECY,.ERRORS)
- End DoDot:1
- QUIT
- +33 ;
- +34 SET SDATA=SDDA_U_DFN_U_APPTDTTM_U_CLINICIEN
- +35 ;
- SET SDCIHDL=$$HANDLE^SDAMEVT(1)
- +36 ; Event driver "BEFORE"
- +37 ;
- DO BEFORE^SDAMEVT(.SDATA,DFN,APPTDTTM,CLINICIEN,SDDA,SDCIHDL)
- +38 ; Appointment checkout
- +39 DO CHKOUT(DFN,APPTDTTM,CLINICIEN,SDDA,SDASK,CHKOUTDT,SDCOACT,SDLNE,APPTIEN,SDQUIET,VPRV,.ERRORS)
- +40 ; Skip event driver actions if err occurred checking appointment out. - wtc SD*5.3*717 10/25/2018
- +41 IF $DATA(ERRORS)
- SET ERRORS("CheckOut",1)=""
- DO BUILDJSON^SDESBUILDJSON(.SDECY,.ERRORS)
- QUIT
- +42 ; Event driver "AFTER"
- +43 ;
- DO AFTER^SDAMEVT(.SDATA,DFN,APPTDTTM,CLINICIEN,SDDA,SDCIHDL)
- +44 ; Execute event driver. 5=check out (see #409.66), 2=non-interactive
- +45 ;
- DO EVT^SDAMEVT(.SDATA,5,2,SDCIHDL)
- +46 SET CHKOUT("CheckOut",1)="Checked Out."
- DO BUILDJSON^SDESBUILDJSON(.SDECY,.CHKOUT)
- +47 QUIT
- VALCHKOUTDT(ERRORS,CHKOUTDT,CLINIC) ;
- +1 NEW CHKOUTDTFM,CHKIN
- +2 SET CHKIN=$$GET1^DIQ(409.84,APPTIEN,.03,"I")
- +3 SET CHKOUTDTFM=""
- +4 IF CHKOUTDT=""
- DO ERRLOG^SDESJSON(.ERRORS,23)
- QUIT CHKOUTDTFM
- +5 SET CHKOUTDTFM=$$ISOTFM^SDAMUTDT(CHKOUTDT,CLINIC)
- +6 IF CHKOUTDTFM<0
- DO ERRLOG^SDESJSON(.ERRORS,24)
- QUIT CHKOUTDTFM
- +7 IF $PIECE(CHKOUTDTFM,".",2)=""
- DO ERRLOG^SDESJSON(.ERRORS,321)
- QUIT CHKOUTDTFM
- +8 ; checkout time cannot be in the future
- +9 IF CHKOUTDTFM>$$NOW^XLFDT
- DO ERRLOG^SDESJSON(.ERRORS,320)
- QUIT CHKOUTDTFM
- +10 ; checkout time is after checkin time
- +11 IF CHKOUTDTFM'>CHKIN
- DO ERRLOG^SDESJSON(.ERRORS,52,"Check Out time must be at least 1 minute after the Check In time of "_$TRANSLATE($$FMTE^XLFDT(CHKIN),"@"," ")_".")
- +12 QUIT CHKOUTDTFM
- +13 ;
- FIND(DFN,APPTDTTM,CLINICIEN) ; -- return appt ifn for pat
- +1 ; input: DFN := ifn of pat.
- +2 ; APPTDTTM := appt d/t
- +3 ; CLINICIEN := ifn of clinic
- +4 ; output: [returned] := ifn if pat has appt on date/time
- +5 ;
- +6 NEW Y,FOUND,RET
- +7 SET RET=""
- +8 SET (Y,FOUND)=0
- +9 FOR
- SET Y=$ORDER(^SC(CLINICIEN,"S",APPTDTTM,1,Y))
- if 'Y!(FOUND)
- QUIT
- Begin DoDot:1
- +10 IF '$DATA(^SC(CLINICIEN,"S",APPTDTTM,1,Y,0))
- QUIT
- +11 IF DFN'=$$GET1^DIQ(44.003,Y_","_APPTDTTM_","_CLINICIEN_",",.01,"I")
- QUIT
- +12 IF $DATA(^DPT(DFN,"S",APPTDTTM,0))
- IF $$VALID(DFN,CLINICIEN,APPTDTTM,Y)
- SET FOUND=1
- SET RET=Y
- QUIT
- End DoDot:1
- +13 QUIT RET
- +14 ;
- VALID(DFN,CLINICIEN,APPTDTTM,SDDA) ;
- +1 ; input: DFN := ifn of pat.
- +2 ; APPTDTTM := appt d/t
- +3 ; CLINICIEN := ifn of clinic
- +4 ; SDDA := ifn of appt
- +5 ; output: [returned] := 1 for valid appt., 0 for not valid
- +6 NEW APPTCAN44,APPTCAN2
- +7 SET APPTCAN44=$$GET1^DIQ(44.003,SDDA_","_APPTDTTM_","_CLINICIEN_",",310,"I")
- +8 SET APPTCAN2=$$GET1^DIQ(2.98,APPTDTTM_","_DFN_",",3,"I")
- +9 QUIT $SELECT(APPTCAN44'="C":1,APPTCAN2["C":1,1:0)
- +10 ;
- +11 ; from CO^SDEC25A
- CHKOUT(DFN,APPTDTTM,CLINICIEN,SDDA,SDASK,CHKOUTDT,SDCOACT,SDLNE,SDECAPTID,SDQUIET,VPRV,ERRORS) ;Appt Check Out
- +1 ; Input -- DFN Patient file IEN
- +2 ; APPTDTTM Appointment Date/Time
- +3 ; CLINICIEN Hospital Location file IEN for Appt
- +4 ; SDDA IEN in ^SC multiple or null [Optional]
- +5 ; SDASK Ask Check Out Date/Time [Optional]
- +6 ; CHKOUTDT Date/Time of Check Out [Optional]
- +7 ; SDCOACT Appt Mgmt Check Out Action [Optional]
- +8 ; SDLNE Appt Mgmt Line Number [Optional]
- +9 ; Input -- SDECAPTID Appointment ID
- +10 ; SDQUIET No Terminal output 0=allow display 1=do not allow
- +11 ; VPRV V Provider IEN - pointer to V PROVIDER file
- +12 ; ERRORS Returned Array of errors
- +13 ;
- +14 NEW SDCOQUIT,SDOE,SDATA
- +15 SET SDATA=$GET(^DPT(DFN,"S",APPTDTTM,0))
- +16 ;-- if new encounter, pass to PCE
- +17 IF $$NEW(APPTDTTM)
- Begin DoDot:1
- +18 NEW SDCOED
- +19 ;ANU - Add ERRORS
- +20 SET SDOE=$$GETAPT(DFN,APPTDTTM,CLINICIEN,.ERRORS)
- +21 IF $DATA(ERRORS)
- QUIT
- +22 ;
- +23 SET SDCOED=$$CHK($TRANSLATE($$STATUS(DFN,APPTDTTM,CLINICIEN,SDATA,SDDA),";","^"))
- +24 ; -- appt has already been checked out
- +25 IF $$CODT(DFN,APPTDTTM,CLINICIEN,SDDA)!(SDCOED)
- Begin DoDot:2
- +26 DO ERRLOG^SDESJSON(.ERRORS,319)
- End DoDot:2
- QUIT
- +27 DO CHKOUT2(SDOE,DFN,APPTDTTM,CLINICIEN,CHKOUTDT,SDECAPTID,SDQUIET,VPRV,.ERRORS)
- End DoDot:1
- QUIT
- +28 QUIT
- CODT(DFN,SDT,SDCL,SDDA) ; -- does appt have co date
- +1 QUIT $$GET1^DIQ(44.003,SDDA_","_SDT_","_SDCL_",",303,"I")
- +2 ;
- NEW(DATE) ;-- return 1 if SD is turned on for
- +1 ; Visit Tracking and optionally check if the date is past
- +2 ; the cut over date for the new PCE interface.
- +3 ; INPUT : DATE (Optional) Date to check for cut over.
- +4 ; OUTPUT: 1 Yes, 0 No
- +5 NEW SDRES,SDX,SDY
- +6 IF '$GET(DATE)
- SET DATE=DT
- +7 ;-- is Scheduling on ?
- +8 SET SDRES=0
- SET SDY=$$PKGON^VSIT("SD")
- +9 ;-- if date is it pass cut over?
- +10 SET SDX=1
- IF $GET(DATE)
- SET SDX=$$SWITCHCK^PXAPI(DATE)
- +11 ;-- And together
- +12 IF SDX
- IF SDY
- SET SDRES=1
- +13 QUIT SDRES
- +14 ;
- GETAPT(DFN,SDT,SDCL,SDVIEN,ERRORS) ;
- +1 ; ANU - Added ERRORS
- +2 ; This utility will return the existing IEN for an Outpatient
- +3 ; Encounter. If it fails to find an existing encounter,
- +4 ; it will create a new Encounter and return the new IEN.
- +5 ;
- +6 ; Input -- DFN Patient file IEN
- +7 ; SDT Appointment Date/Time
- +8 ; SDCL Hospital Location file IEN for Appt
- +9 ; SDVIEN Visit file pointer [optional]
- +10 ; Output -- Outpatient Encounter file IEN
- +11 NEW Y
- +12 SET Y=$$GET1^DIQ(2.98,SDT_","_DFN_",",21,"I")
- +13 IF 'Y
- DO APPT(DFN,SDT,SDCL,$GET(SDVIEN),.ERRORS)
- +14 IF $DATA(ERRORS)
- QUIT +$GET(Y)
- +15 IF '$DATA(ERRORS)
- SET Y=$$GET1^DIQ(2.98,SDT_","_DFN_",",21,"I")
- +16 ;
- +17 IF Y
- DO VIEN(Y,$GET(SDVIEN))
- +18 QUIT +$GET(Y)
- +19 ;
- +20 ; FROM APPT^SDVSIT
- APPT(DFN,SDT,SDCL,SDVIEN,ERRORS) ; -- process appt
- +1 ; input DFN = ien of patient file entry
- +2 ; SDT = visit date internal format
- +3 ; SDCL = ien of hospital location file entry
- +4 ; SDVIEN = Visit file pointer [optional]
- +5 ;
- +6 NEW SDVSIT,SDOE,DA,DIE,DR,SDPT,SDSC,SDCL0,SDDA,SDLOCK,SDLCKS
- +7 ;
- +8 ; -- set lock data and lock
- +9 SET SDLOCK("DFN")=DFN
- +10 SET SDLOCK("EVENT DATE/TIME")=SDT
- +11 ;ANU
- +12 ;D LOCK(.SDLOCK)
- +13 IF '$$LOCK(.SDLOCK)
- DO ERRLOG^SDESJSON(.ERRORS,174)
- QUIT
- +14 ;
- +15 ; -- set node vars
- +16 SET SDPT=$GET(^DPT(DFN,"S",SDT,0))
- +17 SET SDCL0=$GET(^SC(SDCL,0))
- SET SDDA=+$$FIND^SDAM2(DFN,SDT,SDCL)
- +18 SET SDSC=$GET(^SC(SDCL,"S",SDT,1,SDDA,0))
- +19 SET SDVSIT("CLN")=$PIECE(SDCL0,U,7)
- SET SDVSIT("DIV")=$$DIV($PIECE(SDCL0,U,15))
- +20 ;
- +21 ; -- do checks
- +22 IF 'SDPT!('SDSC)!($PIECE(SDCL0,U,3)'="C")
- DO UNLOCK(.SDLOCK)
- QUIT
- +23 IF SDCL
- IF +SDPT'=SDCL
- DO UNLOCK(.SDLOCK)
- QUIT
- +24 IF $PIECE(SDPT,U,20)
- DO UNLOCK(.SDLOCK)
- QUIT
- +25 IF 'SDVSIT("CLN")!('SDVSIT("DIV"))
- DO UNLOCK(.SDLOCK)
- +26 ;
- +27 ; -- set the rest
- +28 SET SDVSIT("DFN")=DFN
- SET SDVSIT("LOC")=SDCL
- +29 if $PIECE(SDSC,U,10)
- SET SDVSIT("ELG")=$PIECE(SDSC,U,10)
- +30 if $PIECE(SDPT,U,16)
- SET SDVSIT("TYP")=$PIECE(SDPT,U,16)
- +31 ;
- +32 ; -- call logic to add opt encounter(s)
- +33 SET SDVSIT("ORG")=1
- SET SDVSIT("REF")=SDDA
- SET SDOE=$$SDOE(SDT,.SDVSIT,$GET(SDVIEN))
- +34 IF SDOE
- Begin DoDot:1
- +35 ;869 - Convert ///
- +36 ;N DA,DIE,DR
- +37 ;S DA=SDT,DA(1)=DFN,DR="21////"_SDOE,DIE="^DPT("_DFN_",""S""," D ^DIE
- +38 NEW FDAIENS,ERR298,FDA298
- +39 SET FDAIENS=SDT_","_DFN_","
- +40 SET FDA298(2.98,FDAIENS,21)=SDOE
- +41 DO FILE^DIE(,"FDA298","ERR298")
- +42 ;
- End DoDot:1
- +43 ;Process credit stop if applicable
- DO CSTOP(SDOE,SDCL,.SDVSIT,SDT)
- +44 DO UNLOCK(.SDLOCK)
- +45 QUIT
- +46 ; FROM LOCK^SDVSIT
- +47 ; Anu - function to return lock error
- +48 ; Status = 1 if success, 0 if fail
- LOCK(SDLOCK) ; -- lock "ADFN" node
- +1 NEW SDC
- +2 ;F L +^SCE("ADFN",+$G(SDLOCK("DFN")),+$G(SDLOCK("EVENT DATE/TIME"))):$G(DILOCKTM,3) Q:$T ;LLS - 05-JAN-15 - SD*5.3*630 added timeout on lock
- +3 FOR SDC=1:1:5
- LOCK +^SCE("ADFN",+$GET(SDLOCK("DFN")),+$GET(SDLOCK("EVENT DATE/TIME"))):$GET(DILOCKTM,3)
- if $TEST
- QUIT
- +4 IF $TEST
- QUIT 1
- +5 QUIT 0
- +6 ; FROM UNLOCK^SDVSIT
- UNLOCK(SDLOCK) ; -- unlock "ADFN" node
- +1 LOCK -^SCE("ADFN",+$GET(SDLOCK("DFN")),+$GET(SDLOCK("EVENT DATE/TIME")))
- +2 QUIT
- +3 ; FROM SDOE^SDVSIT
- SDOE(SDT,SDVSIT,SDVIEN,SDOEP) ; -- get visit & encounter
- +1 ;LLS 22-DEC-2014 - SD*5.3*630 - added
- NEW SDTR,SDI
- +2 ;LLS 22-DEC-2014 - SD*5.3*630 - added
- SET SDTR=9999999-$PIECE(SDT,".")
- +3 ;LLS 22-DEC-2014 - SD*5.3*630 - added
- IF SDT["."
- SET SDTR=SDTR_"."_$PIECE(SDT,".",2)
- +4 ;LLS 22-DEC-2014 - SD*5.3*630 - added the following section
- IF '$DATA(SDVSIT("PAR"))
- IF $GET(SDVIEN)=""
- Begin DoDot:1
- +5 NEW SDVISARR,SDVIEN1
- +6 SET SDVIEN1=""
- FOR
- SET SDVIEN1=$ORDER(^AUPNVSIT("AA",DFN,SDTR,SDVIEN1))
- if SDVIEN1=""
- QUIT
- Begin DoDot:2
- +7 ; COMPARE VISIT: SERVICE CATEGORY, POINTER TO CLINIC STOP FILE, POINTER TO #44
- +8 ; FILE, & ENCOUNTER TYPE BEFORE SELECTING EXISTING VISIT INSTEAD OF CREATING A NEW ONE
- +9 DO GETS^DIQ(9000010,SDVIEN1_",",".07;.08;.22;15003","I","SDVISARR")
- +10 ;Q:SDVISARR(9000010,SDVIEN1_",",.07,"I")'=$S($G(SDVSIT("SVC"))]"":SDVSIT("SVC"),$$INP^SDAM2(DFN,SDTR)="I":"I",1:"A")
- +11 if SDVISARR(9000010,SDVIEN1_",",.07,"I")'=$SELECT($GET(SDVSIT("SVC"))]""
- QUIT
- +12 if SDVISARR(9000010,SDVIEN1_",",.08,"I")'=$GET(SDVSIT("CLN"))
- QUIT
- +13 if SDVISARR(9000010,SDVIEN1_",",.22,"I")'=$GET(SDVSIT("LOC"))
- QUIT
- +14 if SDVISARR(9000010,SDVIEN1_",",15003,"I")'="P"
- QUIT
- +15 SET SDVIEN=SDVIEN1
- End DoDot:2
- if $GET(SDVIEN)]""
- QUIT
- End DoDot:1
- +16 SET SDVSIT("VST")=$GET(SDVIEN)
- +17 ; bwf - SD*826 - leaving calls to SDVSIT0 - consider bringing into SDES* namespace in the future
- +18 IF 'SDVSIT("VST")
- DO VISIT^SDVSIT0(SDT,.SDVSIT)
- +19 QUIT $$NEW^SDVSIT0(SDT,.SDVSIT)
- +20 ;
- INP(DFN,VDATE) ; -- determine inpatient status ; dom is not an inpatient appt
- +1 NEW SDINP,VAINDT,VADMVT,WARDLOC
- +2 SET SDINP=""
- SET VAINDT=VDATE
- DO ADM^VADPT2
- IF 'VADMVT
- QUIT SDINP
- +3 SET WARDLOC=$$GET1^DIQ(405,VADMVT,.06,"I")
- +4 IF $$GET1^DIQ(43,1,16,"I")
- IF $$GET1^DIQ(42,WARDLOC,.03,"I")="D"
- QUIT SDINP
- +5 SET SDINP="I"
- +6 QUIT SDINP
- +7 ;
- DIV(DIV) ; -- determine med div
- +1 ; multi-div
- +2 IF $$GET1^DIQ(43,1,11,"I")
- IF $DATA(^DG(40.8,+DIV,0))
- QUIT DIV
- +3 SET DIV=+$ORDER(^DG(40.8,0))
- +4 QUIT DIV
- +5 ;
- +6 ; FROM CSTOP^SDVSIT
- CSTOP(SDOE,SDCL,SDVSIT,SDT) ;Process credit stop
- +1 ;Input: SDOE=encounter ien
- +2 ;Input: SDCL0=zeroeth node of HOSPITAL LOCATION file record
- +3 ;Input: SDVSIT=visit data array (pass by reference)
- +4 ;Input: SDT=encounter date/time
- +5 ; -- does clinic have a credit stop code?
- +6 ; -- process only if non non-count and not equal to credit
- +7 ;
- +8 NEW CREDSCODE,NONCOUNT,CLINSTOPCODE,CSTOPINACTDT,IENS,CLINDAT
- +9 SET IENS=SDCL_","
- +10 DO GETS^DIQ(44,IENS,"8;2502;2503","I","CLINDAT","ERR")
- +11 SET CREDSCODE=$GET(CLINDAT(44,IENS,2503,"I"))
- +12 SET NONCOUNT=$GET(CLINDAT(44,IENS,2502,"I"))
- +13 SET CLINSTOPCODE=$GET(CLINDAT(44,IENS,8,"I"))
- +14 SET CSTOPINACTDT=$$GET1^DIQ(40.7,CLINSTOPCODE,2,"I")
- +15 IF SDOE
- IF CREDSCODE
- IF (CREDSCODE'=SDVSIT("CLN"))
- IF NONCOUNT'="Y"
- Begin DoDot:1
- +16 NEW X,SDVIENSV,SDVIENOR
- +17 ; -- is stop code active?
- +18 IF $SELECT('CSTOPINACTDT:1,1:SDT<CSTOPINACTDT)
- Begin DoDot:2
- +19 SET SDVSIT("CLN")=CREDSCODE
- +20 SET SDVIENOR=$GET(SDVSIT("ORG"))
- +21 SET SDVSIT("ORG")=4
- +22 SET SDVSIT("PAR")=SDOE
- +23 SET SDVIENSV=$GET(SDVSIT("VST"))
- +24 KILL SDVSIT("VST")
- +25 SET X=$$SDOE(SDT,.SDVSIT)
- +26 IF X
- DO LOGDATA(X)
- +27 ; -- restore SDVSIT
- +28 SET SDVSIT("CLN")=CLINSTOPCODE
- +29 SET SDVSIT("ORG")=SDVIENOR
- +30 SET SDVSIT("VST")=SDVIENSV
- +31 KILL SDVSIT("PAR")
- +32 QUIT
- End DoDot:2
- +33 QUIT
- End DoDot:1
- +34 QUIT
- LOGDATA(SDOE,SDLOG) ; -- log user, date/time and other data
- +1 NEW DIE,DA,DR,Y,X
- +2 SET SDLOG("USER")=$GET(DUZ)
- +3 SET SDLOG("DATE/TIME")=$$NOW^XLFDT()
- +4 SET DIE="^SCE("
- SET DA=SDOE
- SET DR="[SD ENCOUNTER LOG]"
- DO ^DIE
- +5 QUIT
- +6 ;
- VIEN(SDOE,SDVIEN) ; -- stuff in Visit IEN if not already set
- +1 ; -- needed for those sites that don't have
- +2 ; scheduling turned on in Visit Tracking
- +3 ; Required input SDOE = Outpatient Encounter pointer
- +4 ; SDVIEN = Visit file pointer or null or zero
- +5 ;
- +6 ; -- quit if no vien passed
- +7 if 'SDVIEN
- QUIT
- +8 ; -- quit is no encounter
- +9 if '$DATA(^SCE(+SDOE,0))
- QUIT
- +10 ; -- set visit ien if vien not already set
- +11 IF '$$GET1^DIQ(409.68,+SDOE,.05,"I")
- Begin DoDot:1
- +12 ;869 - Convert ////
- +13 ;S DIE="^SCE(",DA=SDOE,DR=".05////"_SDVIEN D ^DIE
- +14 NEW FDA40968,ERR40968
- +15 SET FDA40968(409.68,SDOE_",",.05)=SDVIEN
- +16 DO FILE^DIE(,"FDA40968","ERR40968")
- KILL FDA40968
- +17 ;
- End DoDot:1
- +18 IF '$$GET1^DIQ(409.68,+SDOE,.04,"I")
- Begin DoDot:1
- +19 ;869 - Converting ////
- +20 NEW SDLOC,FDA40968,ERR40968
- +21 SET SDLOC=$$GET1^DIQ(9000010,SDVIEN,.22,"I")
- +22 ;I SDLOC S DIE="^SCE(",DA=SDOE,DR=".04////"_SDLOC D ^DIE
- +23 IF SDLOC
- Begin DoDot:2
- +24 SET FDA40968(409.68,SDOE_",",.04)=SDLOC
- +25 DO FILE^DIE(,"FDA40968","ERR40968")
- End DoDot:2
- End DoDot:1
- +26 QUIT
- +27 ;
- +28 ;CO^SDEC25B
- CHKOUT2(SDOE,DFN,APPTDTTM,CLINICIEN,CHKOUTDT,SDECAPTID,SDQUIET,VPRV,ERRORS) ;EP; called to ask check-out date/time ;SAT ADDED PARAMETERS CHKOUTDT, SDECAPTID, & SDQUIET
- +1 ; Called by SDCO1
- +2 ; SDOE = Outpatient Encounter IEN
- +3 ; DFN = Patient IEN
- +4 ; APPTDTTM = Appt Date/Time
- +5 ; CLINICIEN = Clinic IEN
- +6 ; CHKOUTDT = APPT CHECKOUT TIME [OPTIONAL - USED WHEN SDQUIET=1] USER ENTERED FORMAT
- +7 ; SDECAPTID = APPT ID - POINTER TO ^SDECAPPT
- +8 ; SDQUIET = ALLOW NO TERMINAL INPUT/OUTPUT 0=ALLOW; 1=DO NOT ALLOW
- +9 ; VPRV = V Provider IEN - pointer to V PROVIDER file
- +10 ; ERRORS = Returned Array of errors
- +11 ;
- +12 NEW DIE,DA,DR,SDECNOD,SDN,SDV,AUPNVSIT,PROVIEN40984,PSTAT
- +13 ;
- +14 ; 869 - Convert ///
- +15 ;S DR="303///"_CHKOUTDT_";304///`"_DUZ_";306///"_$$NOW^XLFDT
- +16 ;D ^DIE
- +17 ;S DIE="^SC("_CLINICIEN_",""S"","_APPTDTTM_",1,"
- +18 ;S DA(2)=CLINICIEN,DA(1)=APPTDTTM
- +19 NEW IENS44,ERR44003,FDA
- +20 SET (DA,SDN)=$$SCIEN(DFN,CLINICIEN,APPTDTTM)
- +21 SET IENS44=$$GET44RECORDIENS^SDESCANCELAPPTS(CLINICIEN,APPTDTTM,DFN)
- +22 SET FDA(44.003,IENS44,303)=CHKOUTDT
- +23 SET FDA(44.003,IENS44,304)=DUZ
- +24 SET FDA(44.003,IENS44,306)=$$NOW^XLFDT
- +25 DO FILE^DIE(,"FDA","ERR44003")
- KILL ERR44003
- +26 ;
- +27 ; if checked out and status not updated, do it now
- +28 IF $$GET1^DIQ(44.003,DA_","_APPTDTTM_","_CLINICIEN_",",303,"I")]""
- Begin DoDot:1
- +29 ;UPDATE APPT SCHEDULE GLOBAL ^SDEC(409.84
- +30 IF $GET(SDECAPTID)
- Begin DoDot:2
- +31 SET PSTAT=$$GET1^DIQ(409.68,SDOE,.12,"I")
- +32 ;869 - Convert ///
- +33 ;S DA=SDECAPTID
- +34 ;S DR=".14///"_$G(CHKOUTDT)_";.19///"_PSTAT
- +35 ;D ^DIE
- +36 NEW FDA40984,ERR40984
- +37 SET FDA40984(409.84,SDECAPTID_",",.14)=$GET(CHKOUTDT)
- +38 SET FDA40984(409.84,SDECAPTID_",",.19)=$GET(PSTAT)
- +39 DO FILE^DIE(,"FDA40984","ERR40984")
- +40 ;
- +41 ;possibly update VProvider
- +42 SET SDECNOD=^SDEC(409.84,SDECAPTID,0)
- +43 SET PROVIEN40984=$$GET1^DIQ(409.84,SDECAPTID,.15,"I")
- +44 IF $GET(VPRV)
- IF PROVIEN40984
- Begin DoDot:3
- +45 ;get SDEC appt schedule
- +46 ;869 - Convert ///
- +47 ;S DA=PROVIEN40984 ;S DR=".01///"_VPRV
- +48 ;D ^DIE
- +49 NEW FDA91006,ERR91006
- +50 SET FDA91006(9000010.06,PROVIEN40984_",",.01)=VPRV
- +51 DO FILE^DIE(,"FDA91006","ERR91006")
- KILL FDA91006
- End DoDot:3
- End DoDot:2
- +52 ;
- +53 if $$GET1^DIQ(409.68,SDOE,.12)="CHECKED OUT"
- QUIT
- +54 ;869 - Convert ///
- +55 ;S DIE=409.68,DA=SDOE,DR=".12///14;101///"_DUZ_";102///"_$$NOW^XLFDT
- +56 ;D ^DIE
- +57 NEW FDA40968,ERR40968
- +58 SET FDA40968(409.68,SDOE_",",.12)=14
- +59 SET FDA40968(409.68,SDOE_",",101)=DUZ
- +60 SET FDA40968(409.68,SDOE_",",102)=$$NOW^XLFDT
- +61 DO FILE^DIE(,"FDA40968","ERR40968")
- +62 ;
- +63 ; if visit pointer stored, update visit checkout date/time
- +64 SET SDV=$$GET1^DIQ(409.68,SDOE,.05,"I")
- if 'SDV
- QUIT
- +65 if '$DATA(^AUPNVSIT(SDV,0))
- QUIT
- if $$GET1^DIQ(9000010,SDV,.05,"I")'=DFN
- QUIT
- +66 ;deleted
- if $$GET1^DIQ(9000010,SDV,.11,"I")=1
- QUIT
- +67 ;cmi/maw 5/1/2009 PATCH 1010 RQMT 34
- +68 ;869 - Convert ///
- +69 ;S DIE="^AUPNVSIT(",DA=SDV
- +70 ;S DR=".18///"_$$GET1^DIQ(44.003,SDN_","_APPTDTTM_","_CLINICIEN_",",303,"I")
- +71 ;D ^DIE
- +72 NEW FDA9000010,ERR9000010
- +73 SET FDA9000010(9000010,SDV_",",.18)=$$GET1^DIQ(44.003,SDN_","_APPTDTTM_","_CLINICIEN_",",303,"I")
- +74 DO FILE^DIE(,"FDA9000010","ERR9000010")
- KILL FDA9000010
- +75 ;
- End DoDot:1
- +76 QUIT
- +77 ;
- SCIEN(PAT,CLINIC,DATE) ;PEP; returns ien for appt in ^SC
- +1 NEW X,IEN
- +2 SET X=0
- FOR
- SET X=$ORDER(^SC(CLINIC,"S",DATE,1,X))
- if 'X
- QUIT
- if $GET(IEN)
- QUIT
- Begin DoDot:1
- +3 ;cancelled
- if $PIECE($GET(^SC(CLINIC,"S",DATE,1,X,0)),U,9)="C"
- QUIT
- +4 IF +$GET(^SC(CLINIC,"S",DATE,1,X,0))=PAT
- SET IEN=X
- End DoDot:1
- +5 QUIT $GET(IEN)
- +6 ;
- +7 ;
- CHK(SDSTB) ; -- is appointment checked out
- +1 NEW Y
- +2 IF "^2^8^12^"[("^"_+SDSTB_"^")
- IF $PIECE(SDSTB,"^",3)["CHECKED OUT"
- SET Y=1
- +3 QUIT +$GET(Y)
- +4 ;
- STATUS(DFN,SDT,SDCL,SDATA,SDDA) ; -- return appt status
- +1 ; input: DFN := ifn of pat.
- +2 ; SDT := appt d/t
- +3 ; SDCL := ifn of clinic
- +4 ; SDATA := 0th node of pat appt entry
- +5 ; SDDA := ifn for ^SC(clinic,"S",date,1,ifn) {optional}
- +6 ; output: [returned] := appt status ifn ^ status name ^ print status ^
- +7 ; check in d/t ^ check out d/t ^ adm mvt ifn
- +8 ;
- +9 ;S = status ; C = ci/co indicator ; Y = 'C' node ; P = print status
- +10 NEW S,C,Y,P,VADMVT,VAINDT,STATUS,SDSCE,SDIEN,CHKINDT,CHKOUTDT
- +11 ;
- +12 ; -- get data for evaluation
- +13 if '$GET(SDDA)
- SET SDDA=+$$FIND^SDAM2(DFN,SDT,SDCL)
- +14 SET CHKINDT=$$GET1^DIQ(44.003,SDDA_","_SDT_","_SDCL_",",309,"I")
- +15 SET CHKOUTDT=$$GET1^DIQ(44.003,SDDA_","_SDT_","_SDCL_",",303,"I")
- +16 ;retrieve CHECK OUT from OUTPATIENT ENCOUNTER file if not in Hospital Location file/PURGED or edited
- +17 SET SDSCE=$$GET1^DIQ(2.98,SDT_","_DFN_",",21,"I")
- +18 ;pointer to OE
- IF SDSCE
- Begin DoDot:1
- +19 IF CHKOUTDT=""
- SET CHKOUTDT=$$GET1^DIQ(409.68,SDSCE,.07,"I")
- +20 SET SDIEN=SDSCE_","
- SET STATUS=$$GET1^DIQ(409.68,SDIEN,.12)
- End DoDot:1
- +21 ;
- +22 ; -- set initial status value ; non-count clinic?
- +23 SET S=$SELECT($PIECE(SDATA,"^",2)]"":$PIECE($PIECE($PIECE(^DD(2.98,3,0),"^",3),$PIECE(SDATA,"^",2)_":",2),";"),$PIECE($GET(^SC(SDCL,0)),U,17)="Y":"NON-COUNT",1:"")
- +24 IF SDSCE&(S="NO ACTION TAKEN")
- SET S=""
- +25 ;
- +26 ; -- inpatient?
- +27 SET VAINDT=SDT
- DO ADM^VADPT2
- +28 IF S["INPATIENT"
- IF $SELECT('VADMVT:1,'$PIECE(^DG(43,1,0),U,21):0,1:$PIECE($GET(^DIC(42,+$PIECE($GET(^DGPM(VADMVT,0)),U,6),0)),U,3)="D")
- SET S=""
- +29 ;
- +30 ; -- determine ci/co indicator
- +31 SET C=$SELECT(CHKOUTDT:"CHECKED OUT",CHKINDT:"CHECKED IN",S]"":"",SDT>(DT+.2359):"FUTURE",1:"NO ACTION TAKEN")
- if S=""
- SET S=C
- +32 ;
- +33 IF S="NO ACTION TAKEN"
- IF $PIECE(SDT,".")=DT
- IF C'["CHECKED"
- SET C="TODAY"
- +34 ; -- $$REQ & $$COCMP in SDM1A not used for speed
- +35 IF S="CHECKED OUT"!(S="CHECKED IN")
- IF SDT'<$PIECE(^DG(43,1,"SCLR"),U,23)
- IF '$PIECE(SDATA,U,20)
- SET S="NO ACTION TAKEN"
- +36 ;
- +37 ; -- determine print status
- +38 SET P=$SELECT(S=C!(C=""):S,1:"")
- +39 IF P=""
- Begin DoDot:1
- +40 IF S["INPATIENT"
- IF $PIECE($GET(^SC(SDCL,0)),U,17)'="Y"
- IF $PIECE($GET(^SCE(+$PIECE(SDATA,U,20),0)),U,7)=""
- SET P=$PIECE(S," ")_"/ACT REQ"
- QUIT
- +41 IF S="NO ACTION TAKEN"
- IF C="CHECKED OUT"!(C="CHECKED IN")
- SET P="ACT REQ/"_C
- Begin DoDot:2
- +42 IF SDSCE
- IF $PIECE($GET(^SCE(SDSCE,0)),U,7)
- SET P="CHECKED OUT"
- End DoDot:2
- QUIT
- +43 SET P=$SELECT(S="NO ACTION TAKEN":S,1:$PIECE(S," "))_"/"_C
- End DoDot:1
- +44 IF S["INPATIENT"
- IF C=""
- Begin DoDot:1
- +45 IF SDT>(DT+.2359)
- SET P=$PIECE(S," ")_"/FUTURE"
- QUIT
- +46 SET P=$PIECE(S," ")_"/NO ACT TAKN"
- End DoDot:1
- +47 IF S["INPATIENT"
- QUIT +$ORDER(^SD(409.63,"AC",S,0))_";"_S_";"_P_";"_CHKINDT_";"_CHKOUTDT_";"_+VADMVT
- +48 IF S["NO-SHOW"
- QUIT +$ORDER(^SD(409.63,"AC",S,0))_";"_S_";"_P_";"_CHKINDT_";"_CHKOUTDT_";"_+VADMVT
- +49 IF $GET(SDSCE)
- IF $DATA(^SCE(SDSCE,0))
- Begin DoDot:1
- +50 IF $GET(STATUS)="NON-COUNT"
- Begin DoDot:2
- +51 IF CHKOUTDT
- SET P="NON-COUNT/CHECKED OUT"
- QUIT
- +52 IF CHKINDT
- SET P="NON-COUNT/CHECKED IN"
- End DoDot:2
- QUIT
- +53 IF $GET(STATUS)="CHECKED OUT"
- SET P="CHECKED OUT"
- QUIT
- +54 IF CHKOUTDT
- SET P="ACT REQ/CHECKED OUT"
- Begin DoDot:2
- +55 IF $GET(STATUS)="ACTION REQUIRED"
- SET S="NO ACTION TAKEN"
- QUIT
- +56 IF $GET(STATUS)=""
- IF $PIECE($GET(^SCE(SDSCE,0)),U,7)
- SET P="CHECKED OUT"
- End DoDot:2
- QUIT
- +57 IF CHKINDT
- SET P="ACT REQ/CHECKED IN"
- Begin DoDot:2
- +58 IF $GET(STATUS)="ACTION REQUIRED"
- SET S="NO ACTION TAKEN"
- End DoDot:2
- End DoDot:1
- +59 QUIT +$ORDER(^SD(409.63,"AC",S,0))_";"_S_";"_P_";"_CHKINDT_";"_CHKOUTDT_";"_+VADMVT