- SDES2GETVISIT ;ALB/JAS,TJB - SDES2 VISTA SCHEDULING API for Visit Retrieval and Checkin functions ;Jun 17, 2024
- ;;5.3;Scheduling;**878,881**;Aug 13, 1993;Build 10
- ;;Per VHA Directive 6402, this routine should not be modified
- ;
- ; Based off of SDECAPI4 & SDECAPI with portions of code pulled from SDECU2 & SDECV
- ;
- Q
- ;
- GETVISIT(SDOUTPUT,SDINPUT) ;Private Entry Point
- ; >> All date/time variables must be in FileMan internal format
- ; Special Incoming Variables:
- ; SDINPUT("FORCE ADD") = 1 ; no matter what, create new visit (Optional)
- ; SDINPUT("NEVER ADD") = 1 ; never add visit, just try to find one or more (Optional)
- ; SDINPUT("ANCILLARY") = 1 ; for ancillary packages to create noon visit if no match found (Optional)
- ; SDINPUT("SHOW VISITS") = 1 ; this will display visits if more than one match
- ; Incoming Variables used in Matching: REQUIRED
- ; SDINPUT("PAT") = patient IEN (file 2 or 9000001)
- ; SDINPUT("VISIT DATE") = visit date & time (same as check-in date & time)
- ; SDINPUT ("SITE") = location of encounter IEN (file 4 or 9999999.06)
- ; SDINPUT("VISIT TYPE") = internal value for field .03 in Visit file
- ; SDINPUT("SRV CAT") = internal value for service category
- ; SDINPUT("TIME RANGE") = # ; range in minutes for matching on visit time; REQUIRED unless FORCE ADD set
- ; ; zero=exact matches only; -1=don't match on time
- ; These are used to match if sent (Optional)
- ; SDINPUT("PROVIDER") = IEN for provider to match from file 200
- ; SDINPUT("CLINIC CODE") = IEN of clinic stop code (file 40.7)
- ; SDINPUT("HOS LOC") = IEN of hospital location (file 44, field .22 in VISIT file)
- ; Incoming Variables used in creating appt and visit
- ; SDINPUT("APPT DATE") = appt date & time (Required for scheduled appts and walk-ins; check-in will be performed)
- ; SDINPUT("USR") = user IEN in file 200; REQUIRED
- ; SDINPUT("OPT") = name for Option Used To Create field, for check-in only (Optional)
- ; SDINPUT("OI") = reason for appointment; for walk-ins (Optional)
- ; Incoming PCC variables for adding additional info to visit (Optional)
- ; SDINPUT("SDTPB") = Third Party Billed (#.04)
- ; SDINPUT("SDPVL") = Parent Visit Link (#.12)
- ; SDINPUT("SDAPPT") = WalkIn/Appt (#.16)
- ; SDINPUT("SDEVM") = Evaluation and Management Code (#.17)
- ; SDINPUT("SDCODT") = Check Out Date & Time (#.18)
- ; SDINPUT("SDLS") = Level of Service -PCC Form (#.19).
- ; SDINPUT("SDVELG") = Eligibility (#.21)
- ; SDINPUT("SDPROT") = Protocol (#.25).
- ; SDINPUT("SDOPT") = Option Used To Create (#.24)
- ; SDINPUT("SDOLOC") = Outside Location (#2101)
- ; Outgoing Array:
- ; SDOUTPUT(0) always set; if = 0 none found and may have error message in 2nd piece
- ; if = 1 and SDOUTPUT(visit ien)="ADD" new visit just created
- ; if = 1 and SDOUTPUT(visit ien)=#; # is time difference in minutes
- ; if >1, multiple SDOUTPUT(visit ien) entries exist
- N SDARRAY K SDOUTPUT
- M SDARRAY=SDINPUT ;preserve incoming array
- I '$$HAVEREQ(.SDOUTPUT,.SDARRAY) Q ;check required fields
- I '$G(SDARRAY("SDOPT")) D
- . I $G(SDARRAY("OPT"))]"",SDARRAY("OPT")?.N,$D(^DIC(19,SDARRAY("OPT"))) S SDARRAY("SDOPT")=SDARRAY("OPT") Q
- . I $G(SDARRAY("OPT"))]"",$E(SDARRAY("OPT"),1,1)="`" S SDARRAY("SDOPT")=$TR(SDARRAY("OPT"),"`") Q
- . I $G(SDARRAY("OPT"))]"",SDARRAY("OPT")'?.N S SDARRAY("SDOPT")=$O(^DIC(19,"B",SDARRAY("OPT"),0)) Q
- . I $G(SDARRAY("SDOPT"))]"",$E(SDARRAY("SDOPT"),1,1)="`" S SDARRAY("SDOPT")=$TR(SDARRAY("SDOPT"),"`") Q
- . I $G(SDARRAY("SDOPT"))]"",SDARRAY("SDOPT")'?.N S SDARRAY("SDOPT")=$O(^DIC(19,"B",SDARRAY("SDOPT"),0)) Q
- I $G(SDARRAY("FORCE ADD")) D ADDVIST(.SDOUTPUT,.SDARRAY) Q
- ; attempt to find matching visits; return SDOUTPUT array
- I '$G(SDARRAY("FORCE ADD")) D MATCH(.SDOUTPUT,.SDARRAY)
- ; if no appointment date/time sent, just create visit and quit
- I '$G(SDARRAY("APPT DATE")) D ADDVIST(.SDOUTPUT,.SDARRAY) Q
- ; if one matching visit found, continue to check-in
- I SDOUTPUT(0)=1 S SDARRAY("VIEN")=$O(SDOUTPUT(0))
- ; if patient already has appt at this time, call Check-in then quit
- N IEN,ERR,VISIT
- S IEN=$$SCIEN(SDARRAY("PAT"),SDARRAY("HOS LOC"),SDARRAY("APPT DATE")) ;find appt
- I IEN D Q
- . ; set variables used by checkin call
- . S SDARRAY("CDT")=SDARRAY("VISIT DATE")
- . S SDARRAY("CC")=$G(SDARRAY("CLINIC CODE"))
- . S SDARRAY("PRV")=$G(SDARRAY("PROVIDER"))
- . S SDARRAY("CLN")=$G(SDARRAY("HOS LOC"))
- . S SDARRAY("ADT")=$G(SDARRAY("APPT DATE"))
- . S ERR=$$CHECKIN(.SDARRAY) ;check in
- . ; reset SDOUTPUT only if truly added one.
- . I 'ERR S VISIT=$$GETVST(SDARRAY("PAT"),SDARRAY("APPT DATE")) I VISIT,'$G(SDARRAY("VIEN")) S:SDOUTPUT(0)=0 SDOUTPUT(0)=1 S SDOUTPUT(VISIT)="ADD" Q
- . I ERR S SDOUTPUT(0)=0_U_$P(ERR,U,2)
- ; else call walk-in (which calls make appt, checkin and create visit)
- D WALKIN(.SDOUTPUT,.SDARRAY)
- Q
- ;
- MATCH(SDOUT,SDINPUT) ; find matching visits based on input array
- S SDOUT(0)=0
- N END,DATE,VIEN,STOP,DIFF,MATCH
- S MATCH=0
- D TIME(SDINPUT("TIME RANGE"),SDINPUT("VISIT DATE"),.DATE,.END)
- F S DATE=$O(^AUPNVSIT("AA",SDINPUT("PAT"),DATE)) Q:'DATE Q:(DATE>END) D
- . S VIEN=0
- . F S VIEN=$O(^AUPNVSIT("AA",SDINPUT("PAT"),DATE,VIEN)) Q:'VIEN D
- . . I $$GET1^DIQ(9000010,VIEN,.11)="DELETED" Q ;check for delete flag just in case xref not killed
- . . I SDINPUT("SITE")'=$$GET1^DIQ(9000010,VIEN,.06,"I") Q ;no match on loc of enc
- . . I SDINPUT("VISIT TYPE")'=$$GET1^DIQ(9000010,VIEN,.03,"I") Q ;no match on visit type
- . . ; get observation and day surgery visits
- . . I SDINPUT("SRV CAT")["CENRT" Q ;don't look at HIM excluded visits
- . . I $$GET1^DIQ(90000010,VIEN,.07,"I")["CENRT" Q ;don't look at HIM excluded visits
- . . I SDINPUT("SRV CAT")=$$GET1^DIQ(9000010,VIEN,.07,"I") S MATCH=1 ;no match on service category
- . . I SDINPUT("SRV CAT")="A",$G(SDINPUT("ANCILLARY")),$$GET1^DIQ(9000010,VIEN,.07,"I")="O" S MATCH=1 ;match if observation
- . . I SDINPUT("SRV CAT")="A",$G(SDINPUT("ANCILLARY")),$$GET1^DIQ(9000010,VIEN,.07,"I")="D" S MATCH=1
- . . I '$G(MATCH) Q
- . . I SDINPUT("TIME RANGE")>-1 S STOP=0 D Q:STOP ;check time range
- . . . S DIFF=$$TIMEDIF(SDINPUT("VISIT DATE"),VIEN) ;find difference in minutes
- . . . I $$ABS^XLFMTH(DIFF)>SDINPUT("TIME RANGE") S STOP=1
- . . I '$$PRVMTCH(.SDINPUT,VIEN) Q ; if provider sent and didn't match, skip
- . . ; if called by ancillary, falls through and sets visit into array
- . . ; otherwise, check if app wants to match on clinic code or hosp location
- . . I '$G(SDINPUT("ANCILLARY")) S STOP=0 D Q:STOP
- . . . I $G(SDINPUT("HOS LOC")),'$G(SDINPUT("CLINIC CODE")) S SDINPUT("CLINIC CODE")=$$GET1^DIQ(44,SDINPUT("HOS LOC"),8,"I")
- . . . I $G(SDINPUT("CLINIC CODE")),SDINPUT("CLINIC CODE")'=$$GET1^DIQ(9000010,VIEN,.08,"I") S STOP=1 Q ;no match on clinic code
- . . . ; if both have appt date and visit was triage clinic, is a match
- . . . ; create visit on same day no matter what
- . . . I $G(SDINPUT("HOS LOC")),(SDINPUT("HOS LOC")'=$$GET1^DIQ(9000010,VIEN,.22,"I")) S STOP=1 Q ;no match on hospital location
- . . . ; if same clinic & same provider but not triage, make new visit
- . . . I $G(SDINPUT("APPT DATE")),$$GET1^DIQ(9000010,VIEN,.26,"I"),'$$TRIAGE(VIEN) S STOP=1 Q
- . . ; must be good match, increment counter and set array node
- . . S SDOUT(0)=SDOUT(0)+1
- . . S SDOUT(VIEN)=$$TIMEDIF(SDINPUT("VISIT DATE"),VIEN)
- Q
- ;
- PRVMTCH(SDINPUT,VIEN) ; do visits match on provider?
- N PRVS,IEN
- I '$G(SDINPUT("PROVIDER")) Q 1 ; if no provider sent, assume okay
- ; if visit is triage clinic & new encounter is not ancillary, skip provider match
- I $$TRIAGE(VIEN),'$G(SDINPUT("ANCILLARY")) Q 1
- ; find all v provider entries for visit
- S IEN=0 F S IEN=$O(^AUPNVPRV("AD",VIEN,IEN)) Q:'IEN D
- . S PRVS($$GET1^DIQ(9000010.06,IEN_",",.01,"I"))=""
- ; if incoming provider in list, this is match
- I $D(PRVS(SDINPUT("PROVIDER"))) Q 1
- ; otherwise, no match
- Q 0
- ;
- TIMEDIF(VDTTM,VIEN) ; return time diff between incoming time and current visit
- Q $$FMDIFF^XLFDT(VDTTM,+$G(^AUPNVSIT(VIEN,0)),2)\60
- ;
- ADDVIST(SDOUTPUT,SDARRAY) ;
- N %DT,SDVISITIN,SUB,X,Y
- S SUB="SD" F S SUB=$O(SDARRAY(SUB)) Q:SUB="" Q:$E(SUB,1,2)'="SD" S SDVISITIN(SUB)=SDARRAY(SUB)
- S SDVISITIN("AUPNTALK")="",SDVISITIN("SDANE")="" ;keep it silent
- S SDVISITIN("SDLOC")=$G(SDARRAY("SITE")) ;facility
- S SDVISITIN("SDPAT")=$G(SDARRAY("PAT")) ;patient
- S SDVISITIN("SDTYPE")=$G(SDARRAY("VISIT TYPE")) ;visit type
- S SDVISITIN("SDCAT")=$G(SDARRAY("SRV CAT")) ;srv cat
- S SDVISITIN("SDDATE")=$G(SDARRAY("VISIT DATE")) ;chkin dt
- I $G(SDARRAY("CLINIC CODE")) S SDVISITIN("SDCLN")="`"_SDARRAY("CLINIC CODE") ;clinic code ien w/`
- S SDVISITIN("SDHL")=$G(SDARRAY("HOS LOC")) ;clinic name
- S SDVISITIN("SDAPDT")=$G(SDARRAY("APPT DATE")) ;appt date
- S SDVISITIN("SDUSR")=$G(SDARRAY("USR"))
- S SDVISITIN("SDADD")=1 ;force add
- ; create visit
- N SDVISITOUT
- D EN1^SDES2CRTVISIT(.SDVISITOUT,.SDVISITIN)
- ; if no visit created,error quit
- I '$G(SDVISITOUT("SDVSIT")) D Q
- . S SDOUTPUT(0)="0^Error Creating Visit"
- ; set new visit info in out array
- S SDOUTPUT(SDVISITOUT("SDVSIT"))="ADD",SDOUTPUT(0)=1
- K SDVISITIN,SDVISITOUT
- Q
- ;
- WALKIN(SDOUT,SDWALKIN) ;Create walkin appt which is checked in and visit created
- N ERR,VISIT
- S SDOUT(0)=0 ;initialize outgoing count
- S SDWALKIN("CLN")=$G(SDWALKIN("HOS LOC"))
- S SDWALKIN("TYP")=4 ;4=walkin
- S SDWALKIN("ADT")=$G(SDWALKIN("APPT DATE"))
- I '$D(SDWALKIN("LEN")) S SDWALKIN("LEN")=$$GET1^DIQ(44,SDWALKIN("CLN"),1912)
- ; make walkin appt
- S ERR=$$MAKE(.SDWALKIN) I ERR S $P(SDOUT(0),U,2)=$P(ERR,U,2) Q
- ; set variables used by checkin call
- S SDWALKIN("CDT")=SDWALKIN("VISIT DATE")
- S SDWALKIN("CC")=$G(SDWALKIN("CLINIC CODE"))
- S SDWALKIN("PRV")=$G(SDWALKIN("PROVIDER"))
- ; check in appt and create visit
- S ERR=$$CHECKIN(.SDWALKIN)
- ; update out array based on result
- ; reset SDOUTPUT(0) only if added new visit
- I 'ERR S VISIT=$$GETVST(SDWALKIN("PAT"),SDWALKIN("APPT DATE")) I VISIT,'$G(SDARRAY("VIEN")) S:SDOUT(0)=0 SDOUT(0)=1 S SDOUT(VISIT)="ADD" ;visit added
- I ERR S $P(SDOUT(0),U,2)=$P(ERR,U,2) ;error
- Q
- ;
- HAVEREQ(SDOUT,SDINPUT) ; check required fields
- I '$G(SDINPUT("FORCE ADD")),'$D(SDINPUT("TIME RANGE")) S SDOUT(0)="0^Missing Time Range" Q 0
- I '$D(SDINPUT("PAT")) S SDOUT(0)="0^Missing Patient IEN" Q 0
- I '$D(SDINPUT("VISIT DATE")) S SDOUT(0)="0^Missing Visit Date" Q 0
- I '$D(SDINPUT("SITE")) S SDOUT(0)="0^Missing Facility/Site" Q 0
- I '$D(SDINPUT("VISIT TYPE")) S SDOUT(0)="0^Missing Visit Type" Q 0
- I '$D(SDINPUT("SRV CAT")) S SDOUT(0)="0^Missing Service Category" Q 0
- I '$D(SDINPUT("USR")) S SDOUT(0)="0^Missing User IEN" Q 0
- I $G(SDINPUT("HOS LOC")),'$G(SDINPUT("CLINIC CODE")) S SDINPUT("CLINIC CODE")=$$GET1^DIQ(44,SDINPUT("HOS LOC"),8,"I")
- ; convert service category
- I $G(SDINPUT("APPT DATE")),$G(SDINPUT("HOS LOC")) S SDINPUT("SRV CAT")=$$SERCAT(SDINPUT("HOS LOC"),SDINPUT("PAT"))
- Q 1
- ;
- TIME(RANGE,VISIT,DATE,END) ; set DATE and END based on TIME RANGE setting in minutes
- N TMDIF,SW
- S TMDIF=$S(RANGE<1:0,1:RANGE)
- S DATE=$$FMADD^XLFDT(VISIT,,,-TMDIF)
- S END=$$FMADD^XLFDT(VISIT,,,TMDIF)
- I (DATE\1)<(END\1) S SW=(END\1),END=(DATE\1)_".9999",DATE=SW
- S DATE=(9999999-(DATE\1)_"."_$P(DATE,".",2))-.0001
- S END=9999999-(END\1)_"."_$P(END,".",2)
- I RANGE=-1 S END=(END\1)_".9999",DATE=(DATE\1) ;no time range used
- Q
- ;
- TRIAGE(VST) ; returns 1 if visit's hosp loc is triage type
- N HSPLOC
- S HSPLOC=$$GET1^DIQ(9000010,VST,.22,"I") I 'HSPLOC Q 0
- Q +$$GET1^DIQ(9009017.2,HSPLOC,.16,"I")
- ;
- MAKE(SDAPPTIN) ;Call to store appt made
- ;
- ; Make call using: S ERR=$$MAKE^SDES2GETVISIT(.ARRAY)
- ;
- ; Input Array -
- ; SDAPPTIN("PAT") = ien of patient in file 2
- ; SDAPPTIN("CLN") = ien of clinic in file 44
- ; SDAPPTIN("TYP") = 3 for scheduled appts, 4 for walkins
- ; SDAPPTIN("ADT") = appointment date and time
- ; SDAPPTIN("LEN") = appointment length in minutes (5-240)
- ; SDAPPTIN("OI") = reason for appt - up to 150 characters
- ; SDAPPTIN("USR") = user who made appt
- ;
- ; Output: error status and message
- ; = 0 or null: everything okay
- ; = 1^message: error and reason
- ;
- N SDERROR
- I '$D(^DPT(+$G(SDAPPTIN("PAT")),0)) Q 1_U_"Patient not on file: "_$G(SDAPPTIN("PAT"))
- I '$D(^SC(+$G(SDAPPTIN("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(SDAPPTIN("CLN"))
- I ($G(SDAPPTIN("TYP"))<3)!($G(SDAPPTIN("TYP"))>4) Q 1_U_"Appt Type error: "_$G(SDAPPTIN("TYP"))
- I $G(SDAPPTIN("ADT"))'?7N1"."1N.N Q 1_U_"Appt Date/Time error: "_$G(SDAPPTIN("ADT")) ;PWC allow any time combination of numbers #694
- I ($G(SDAPPTIN("LEN"))<5)!($G(SDAPPTIN("LEN"))>240) Q 1_U_"Appt Length error: "_$G(SDAPPTIN("LEN"))
- I '$D(^VA(200,+$G(SDAPPTIN("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(SDAPPTIN("USR"))
- I $D(^DPT(SDAPPTIN("PAT"),"S",SDAPPTIN("ADT"),0)),$$GET1^DIQ(2.98,SDAPPTIN("ADT")_","_SDAPPTIN("PAT")_",",3,"I")'="C" Q 1_U_"Patient "_SDAPPTIN("PAT")_" already has appt at "_SDAPPTIN("ADT")
- ;
- N DIC,DA,Y,X,DD,DO,DLAYGO
- I $D(^DPT(SDAPPTIN("PAT"),"S",SDAPPTIN("ADT"),0)),$$GET1^DIQ(2.98,SDAPPTIN("ADT")_","_SDAPPTIN("PAT")_",",3,"I")="C" D
- . ; "un-cancel" existing appt in file 2
- . N SDAPPTFDA,SDAPPTIENS,SDAPPTERR
- . S SDAPPTIENS=SDAPPTIN("ADT")_","_SDAPPTIN("PAT")_","
- . S SDAPPTFDA(2.98,SDAPPTIENS,".01")=SDAPPTIN("CLN")
- . S SDAPPTFDA(2.98,SDAPPTIENS,"3")=""
- . S SDAPPTFDA(2.98,SDAPPTIENS,"9")=SDAPPTIN("TYP")
- . S SDAPPTFDA(2.98,SDAPPTIENS,"9.5")=9
- . S SDAPPTFDA(2.98,SDAPPTIENS,"14")=""
- . S SDAPPTFDA(2.98,SDAPPTIENS,"15")=""
- . S SDAPPTFDA(2.98,SDAPPTIENS,"16")=""
- . S SDAPPTFDA(2.98,SDAPPTIENS,"19")=""
- . S SDAPPTFDA(2.98,SDAPPTIENS,"20")=$$NOW^XLFDT
- . D FILE^DIE("","SDAPPTFDA","SDAPPTERR")
- . N SDAPPTTMP S SDAPPTTMP=$G(SDAPPTERR)
- E D I $G(SDERROR(1)) Q 1_U_"FileMan add to DPT error: Patient="_SDAPPTIN("PAT")_" Appt="_SDAPPTIN("ADT")
- . ; add appt to file 2
- . ; call to silent server call
- . N SDAPPTFDA,SDAPPTIENS,SDAPPTERR
- . S SDAPPTIENS="?+2,"_SDAPPTIN("PAT")_","
- . S SDAPPTIENS(2)=SDAPPTIN("ADT")
- . S SDAPPTFDA(2.98,SDAPPTIENS,.01)=SDAPPTIN("CLN")
- . S SDAPPTFDA(2.98,SDAPPTIENS,"9")=SDAPPTIN("TYP")
- . S SDAPPTFDA(2.98,SDAPPTIENS,"9.5")=9
- . S SDAPPTFDA(2.98,SDAPPTIENS,"20")=$$NOW^XLFDT
- . D UPDATE^DIE("","SDAPPTFDA","SDAPPTIENS","SDERROR(1)")
- ;
- ; add appt to file 44
- K DIC,DA,X,Y,DLAYGO,DD,DO
- I '$D(^SC(SDAPPTIN("CLN"),"S",0)) S ^SC(SDAPPTIN("CLN"),"S",0)="^44.001DA^^"
- I '$D(^SC(SDAPPTIN("CLN"),"S",SDAPPTIN("ADT"),0)) D I Y<1 Q 1_U_"Error adding date to file 44: Clinic="_SDAPPTIN("CLN")_" Date="_SDAPPTIN("ADT")
- . S DIC="^SC("_SDAPPTIN("CLN")_",""S"",",DA(1)=SDAPPTIN("CLN"),(X,DINUM)=SDAPPTIN("ADT")
- . S DIC("P")="44.001DA",DIC(0)="L",DLAYGO=44.001
- . S Y=1 I '$D(@(DIC_X_")")) D FILE^DICN
- ;
- K DIC,DA,X,Y,DLAYGO,DD,DO,DINUM
- S DIC="^SC("_SDAPPTIN("CLN")_",""S"","_SDAPPTIN("ADT")_",1,"
- S DA(2)=SDAPPTIN("CLN"),DA(1)=SDAPPTIN("ADT"),X=SDAPPTIN("PAT")
- S DIC("DR")="1///"_SDAPPTIN("LEN")_";3///"_$E($G(SDAPPTIN("OI")),1,150)_";7///"_SDAPPTIN("USR")_";8///"_$$NOW^XLFDT
- S DIC("P")="44.003PA",DIC(0)="L",DLAYGO=44.003
- D FILE^DICN
- ;
- ; call event driver
- N DFN,SDT,SDCL,SDDA,SDMODE
- S DFN=SDAPPTIN("PAT"),SDT=SDAPPTIN("ADT"),SDCL=SDAPPTIN("CLN"),SDMODE=2
- S SDDA=$$SCIEN(SDAPPTIN("PAT"),SDAPPTIN("CLN"),SDAPPTIN("ADT"))
- D MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE)
- Q 0
- ;
- CHECKIN(SDAPPTIN) ;Call to add checkin info to appt
- ;
- ; Input array -
- ; SDAPPTIN("PAT") = ien of patient in file 2
- ; SDAPPTIN("CLN") = ien of clinic in file 44
- ; SDAPPTIN("ADT") = appt date/time
- ; SDAPPTIN("CDT") = checkin date/time
- ; SDAPPTIN("USR") = checkin user
- ; SDAPPTIN("OPT") = option used to create visit (optional)
- ; SDAPPTIN("VIEN") = visit IEN (sent if new visit is NOT to be created)
- ;
- ; variables to create visit under event driver
- ; SDAPPTIN("CC") = clinic code for creating visit - optional
- ; SDAPPTIN("PRV") = visit provider - pointer to file 200
- ;
- ; Output value = 0 (successful)
- ; = 1^error message
- ;
- I '$D(^DPT(+$G(SDAPPTIN("PAT")),0)) Q 1_U_"Patient not on file: "_$G(SDAPPTIN("PAT"))
- I '$D(^SC(+$G(SDAPPTIN("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(SDAPPTIN("CLN"))
- I $G(SDAPPTIN("ADT"))'?7N1"."1N.N Q 1_U_"Appt Date/Time error: "_$G(SDAPPTIN("ADT"))
- I $G(SDAPPTIN("CDT"))'?7N1"."1N.N Q 1_U_"Checkin Date/Time error: "_$G(SDAPPTIN("CDT"))
- I '$D(^VA(200,+$G(SDAPPTIN("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(SDAPPTIN("USR"))
- ;
- ; find ien for appt in file 44
- N IEN,DIE,DA,DR,SDVSTN
- S IEN=$$SCIEN(SDAPPTIN("PAT"),SDAPPTIN("CLN"),SDAPPTIN("ADT"))
- I 'IEN Q 1_U_"Error trying to find appointment for checkin: Patient="_SDAPPTIN("PAT")_" Clinic="_SDAPPTIN("CLN")_" Appt="_SDAPPTIN("ADT")
- ;
- ; remember before status
- N SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
- S DFN=SDAPPTIN("PAT"),SDT=SDAPPTIN("ADT"),SDCL=SDAPPTIN("CLN"),SDMODE=2,SDDA=IEN
- S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
- D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
- ;
- ; set checkin
- N SDFDA
- S SDFDA(44.003,IEN_","_SDAPPTIN("ADT")_","_SDAPPTIN("CLN")_",",305)=$$NOW^XLFDT()
- S SDFDA(44.003,IEN_","_SDAPPTIN("ADT")_","_SDAPPTIN("CLN")_",",309)=SDAPPTIN("CDT")
- D FILE^DIE("","SDFDA")
- K SDFDA
- ; Updating 302 separately because of trigger on field 309 uses logged-in DUZ
- S SDFDA(44.003,IEN_","_SDAPPTIN("ADT")_","_SDAPPTIN("CLN")_",",302)=SDAPPTIN("USR")
- D FILE^DIE("","SDFDA")
- ;
- ; set after status
- S SDDA=$$SCIEN(SDAPPTIN("PAT"),SDAPPTIN("CLN"),SDAPPTIN("ADT"))
- S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
- D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
- ;
- Q 0
- ;
- SERCAT(CLINIC,PAT) ;Returns service category for visit
- N CLNCAT
- I $$GET1^DIQ(2,PAT_",",.1)]"" Q "I" ;in hospital if inpt
- S CLNCAT=$$GET1^DIQ(9009017.2,CLINIC,.12,"I") ;clinic's service category
- Q $S(CLNCAT]"":CLNCAT,1:"A")
- ;
- SCIEN(PAT,CLINIC,DATE) ;Returns ien for appt in ^SC
- N APPTIEN,VALIDIEN
- S APPTIEN=0 F S APPTIEN=$O(^SC(CLINIC,"S",DATE,1,APPTIEN)) Q:'APPTIEN Q:$G(VALIDIEN) D
- . Q:$$GET1^DIQ(44.003,APPTIEN_","_DATE_","_CLINIC,310,"I")="C" ;cancelled
- . I $$GET1^DIQ(44.003,APPTIEN_","_DATE_","_CLINIC,.01,"I")=PAT S VALIDIEN=APPTIEN
- Q $G(VALIDIEN)
- ;
- GETVST(PAT,DATE) ;Returns visit ien for appt date and patient
- I ('PAT)!('DATE) Q 0
- N OUTPTENC
- S OUTPTENC=$$GET1^DIQ(2.98,DATE_","_PAT_",",21,"I")
- I 'OUTPTENC Q 0 ;outpt encounter ptr
- ;
- I $$GET1^DIQ(409.68,OUTPTENC_",",.02,"I")'=PAT Q 0 ;patient ptr
- Q $$GET1^DIQ(409.68,OUTPTENC_",",.05,"I") ;visit ptr
- ;
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDES2GETVISIT 19054 printed Jan 18, 2025@03:55:27 Page 2
- SDES2GETVISIT ;ALB/JAS,TJB - SDES2 VISTA SCHEDULING API for Visit Retrieval and Checkin functions ;Jun 17, 2024
- +1 ;;5.3;Scheduling;**878,881**;Aug 13, 1993;Build 10
- +2 ;;Per VHA Directive 6402, this routine should not be modified
- +3 ;
- +4 ; Based off of SDECAPI4 & SDECAPI with portions of code pulled from SDECU2 & SDECV
- +5 ;
- +6 QUIT
- +7 ;
- GETVISIT(SDOUTPUT,SDINPUT) ;Private Entry Point
- +1 ; >> All date/time variables must be in FileMan internal format
- +2 ; Special Incoming Variables:
- +3 ; SDINPUT("FORCE ADD") = 1 ; no matter what, create new visit (Optional)
- +4 ; SDINPUT("NEVER ADD") = 1 ; never add visit, just try to find one or more (Optional)
- +5 ; SDINPUT("ANCILLARY") = 1 ; for ancillary packages to create noon visit if no match found (Optional)
- +6 ; SDINPUT("SHOW VISITS") = 1 ; this will display visits if more than one match
- +7 ; Incoming Variables used in Matching: REQUIRED
- +8 ; SDINPUT("PAT") = patient IEN (file 2 or 9000001)
- +9 ; SDINPUT("VISIT DATE") = visit date & time (same as check-in date & time)
- +10 ; SDINPUT ("SITE") = location of encounter IEN (file 4 or 9999999.06)
- +11 ; SDINPUT("VISIT TYPE") = internal value for field .03 in Visit file
- +12 ; SDINPUT("SRV CAT") = internal value for service category
- +13 ; SDINPUT("TIME RANGE") = # ; range in minutes for matching on visit time; REQUIRED unless FORCE ADD set
- +14 ; ; zero=exact matches only; -1=don't match on time
- +15 ; These are used to match if sent (Optional)
- +16 ; SDINPUT("PROVIDER") = IEN for provider to match from file 200
- +17 ; SDINPUT("CLINIC CODE") = IEN of clinic stop code (file 40.7)
- +18 ; SDINPUT("HOS LOC") = IEN of hospital location (file 44, field .22 in VISIT file)
- +19 ; Incoming Variables used in creating appt and visit
- +20 ; SDINPUT("APPT DATE") = appt date & time (Required for scheduled appts and walk-ins; check-in will be performed)
- +21 ; SDINPUT("USR") = user IEN in file 200; REQUIRED
- +22 ; SDINPUT("OPT") = name for Option Used To Create field, for check-in only (Optional)
- +23 ; SDINPUT("OI") = reason for appointment; for walk-ins (Optional)
- +24 ; Incoming PCC variables for adding additional info to visit (Optional)
- +25 ; SDINPUT("SDTPB") = Third Party Billed (#.04)
- +26 ; SDINPUT("SDPVL") = Parent Visit Link (#.12)
- +27 ; SDINPUT("SDAPPT") = WalkIn/Appt (#.16)
- +28 ; SDINPUT("SDEVM") = Evaluation and Management Code (#.17)
- +29 ; SDINPUT("SDCODT") = Check Out Date & Time (#.18)
- +30 ; SDINPUT("SDLS") = Level of Service -PCC Form (#.19).
- +31 ; SDINPUT("SDVELG") = Eligibility (#.21)
- +32 ; SDINPUT("SDPROT") = Protocol (#.25).
- +33 ; SDINPUT("SDOPT") = Option Used To Create (#.24)
- +34 ; SDINPUT("SDOLOC") = Outside Location (#2101)
- +35 ; Outgoing Array:
- +36 ; SDOUTPUT(0) always set; if = 0 none found and may have error message in 2nd piece
- +37 ; if = 1 and SDOUTPUT(visit ien)="ADD" new visit just created
- +38 ; if = 1 and SDOUTPUT(visit ien)=#; # is time difference in minutes
- +39 ; if >1, multiple SDOUTPUT(visit ien) entries exist
- +40 NEW SDARRAY
- KILL SDOUTPUT
- +41 ;preserve incoming array
- MERGE SDARRAY=SDINPUT
- +42 ;check required fields
- IF '$$HAVEREQ(.SDOUTPUT,.SDARRAY)
- QUIT
- +43 IF '$GET(SDARRAY("SDOPT"))
- Begin DoDot:1
- +44 IF $GET(SDARRAY("OPT"))]""
- IF SDARRAY("OPT")?.N
- IF $DATA(^DIC(19,SDARRAY("OPT")))
- SET SDARRAY("SDOPT")=SDARRAY("OPT")
- QUIT
- +45 IF $GET(SDARRAY("OPT"))]""
- IF $EXTRACT(SDARRAY("OPT"),1,1)="`"
- SET SDARRAY("SDOPT")=$TRANSLATE(SDARRAY("OPT"),"`")
- QUIT
- +46 IF $GET(SDARRAY("OPT"))]""
- IF SDARRAY("OPT")'?.N
- SET SDARRAY("SDOPT")=$ORDER(^DIC(19,"B",SDARRAY("OPT"),0))
- QUIT
- +47 IF $GET(SDARRAY("SDOPT"))]""
- IF $EXTRACT(SDARRAY("SDOPT"),1,1)="`"
- SET SDARRAY("SDOPT")=$TRANSLATE(SDARRAY("SDOPT"),"`")
- QUIT
- +48 IF $GET(SDARRAY("SDOPT"))]""
- IF SDARRAY("SDOPT")'?.N
- SET SDARRAY("SDOPT")=$ORDER(^DIC(19,"B",SDARRAY("SDOPT"),0))
- QUIT
- End DoDot:1
- +49 IF $GET(SDARRAY("FORCE ADD"))
- DO ADDVIST(.SDOUTPUT,.SDARRAY)
- QUIT
- +50 ; attempt to find matching visits; return SDOUTPUT array
- +51 IF '$GET(SDARRAY("FORCE ADD"))
- DO MATCH(.SDOUTPUT,.SDARRAY)
- +52 ; if no appointment date/time sent, just create visit and quit
- +53 IF '$GET(SDARRAY("APPT DATE"))
- DO ADDVIST(.SDOUTPUT,.SDARRAY)
- QUIT
- +54 ; if one matching visit found, continue to check-in
- +55 IF SDOUTPUT(0)=1
- SET SDARRAY("VIEN")=$ORDER(SDOUTPUT(0))
- +56 ; if patient already has appt at this time, call Check-in then quit
- +57 NEW IEN,ERR,VISIT
- +58 ;find appt
- SET IEN=$$SCIEN(SDARRAY("PAT"),SDARRAY("HOS LOC"),SDARRAY("APPT DATE"))
- +59 IF IEN
- Begin DoDot:1
- +60 ; set variables used by checkin call
- +61 SET SDARRAY("CDT")=SDARRAY("VISIT DATE")
- +62 SET SDARRAY("CC")=$GET(SDARRAY("CLINIC CODE"))
- +63 SET SDARRAY("PRV")=$GET(SDARRAY("PROVIDER"))
- +64 SET SDARRAY("CLN")=$GET(SDARRAY("HOS LOC"))
- +65 SET SDARRAY("ADT")=$GET(SDARRAY("APPT DATE"))
- +66 ;check in
- SET ERR=$$CHECKIN(.SDARRAY)
- +67 ; reset SDOUTPUT only if truly added one.
- +68 IF 'ERR
- SET VISIT=$$GETVST(SDARRAY("PAT"),SDARRAY("APPT DATE"))
- IF VISIT
- IF '$GET(SDARRAY("VIEN"))
- if SDOUTPUT(0)=0
- SET SDOUTPUT(0)=1
- SET SDOUTPUT(VISIT)="ADD"
- QUIT
- +69 IF ERR
- SET SDOUTPUT(0)=0_U_$PIECE(ERR,U,2)
- End DoDot:1
- QUIT
- +70 ; else call walk-in (which calls make appt, checkin and create visit)
- +71 DO WALKIN(.SDOUTPUT,.SDARRAY)
- +72 QUIT
- +73 ;
- MATCH(SDOUT,SDINPUT) ; find matching visits based on input array
- +1 SET SDOUT(0)=0
- +2 NEW END,DATE,VIEN,STOP,DIFF,MATCH
- +3 SET MATCH=0
- +4 DO TIME(SDINPUT("TIME RANGE"),SDINPUT("VISIT DATE"),.DATE,.END)
- +5 FOR
- SET DATE=$ORDER(^AUPNVSIT("AA",SDINPUT("PAT"),DATE))
- if 'DATE
- QUIT
- if (DATE>END)
- QUIT
- Begin DoDot:1
- +6 SET VIEN=0
- +7 FOR
- SET VIEN=$ORDER(^AUPNVSIT("AA",SDINPUT("PAT"),DATE,VIEN))
- if 'VIEN
- QUIT
- Begin DoDot:2
- +8 ;check for delete flag just in case xref not killed
- IF $$GET1^DIQ(9000010,VIEN,.11)="DELETED"
- QUIT
- +9 ;no match on loc of enc
- IF SDINPUT("SITE")'=$$GET1^DIQ(9000010,VIEN,.06,"I")
- QUIT
- +10 ;no match on visit type
- IF SDINPUT("VISIT TYPE")'=$$GET1^DIQ(9000010,VIEN,.03,"I")
- QUIT
- +11 ; get observation and day surgery visits
- +12 ;don't look at HIM excluded visits
- IF SDINPUT("SRV CAT")["CENRT"
- QUIT
- +13 ;don't look at HIM excluded visits
- IF $$GET1^DIQ(90000010,VIEN,.07,"I")["CENRT"
- QUIT
- +14 ;no match on service category
- IF SDINPUT("SRV CAT")=$$GET1^DIQ(9000010,VIEN,.07,"I")
- SET MATCH=1
- +15 ;match if observation
- IF SDINPUT("SRV CAT")="A"
- IF $GET(SDINPUT("ANCILLARY"))
- IF $$GET1^DIQ(9000010,VIEN,.07,"I")="O"
- SET MATCH=1
- +16 IF SDINPUT("SRV CAT")="A"
- IF $GET(SDINPUT("ANCILLARY"))
- IF $$GET1^DIQ(9000010,VIEN,.07,"I")="D"
- SET MATCH=1
- +17 IF '$GET(MATCH)
- QUIT
- +18 ;check time range
- IF SDINPUT("TIME RANGE")>-1
- SET STOP=0
- Begin DoDot:3
- +19 ;find difference in minutes
- SET DIFF=$$TIMEDIF(SDINPUT("VISIT DATE"),VIEN)
- +20 IF $$ABS^XLFMTH(DIFF)>SDINPUT("TIME RANGE")
- SET STOP=1
- End DoDot:3
- if STOP
- QUIT
- +21 ; if provider sent and didn't match, skip
- IF '$$PRVMTCH(.SDINPUT,VIEN)
- QUIT
- +22 ; if called by ancillary, falls through and sets visit into array
- +23 ; otherwise, check if app wants to match on clinic code or hosp location
- +24 IF '$GET(SDINPUT("ANCILLARY"))
- SET STOP=0
- Begin DoDot:3
- +25 IF $GET(SDINPUT("HOS LOC"))
- IF '$GET(SDINPUT("CLINIC CODE"))
- SET SDINPUT("CLINIC CODE")=$$GET1^DIQ(44,SDINPUT("HOS LOC"),8,"I")
- +26 ;no match on clinic code
- IF $GET(SDINPUT("CLINIC CODE"))
- IF SDINPUT("CLINIC CODE")'=$$GET1^DIQ(9000010,VIEN,.08,"I")
- SET STOP=1
- QUIT
- +27 ; if both have appt date and visit was triage clinic, is a match
- +28 ; create visit on same day no matter what
- +29 ;no match on hospital location
- IF $GET(SDINPUT("HOS LOC"))
- IF (SDINPUT("HOS LOC")'=$$GET1^DIQ(9000010,VIEN,.22,"I"))
- SET STOP=1
- QUIT
- +30 ; if same clinic & same provider but not triage, make new visit
- +31 IF $GET(SDINPUT("APPT DATE"))
- IF $$GET1^DIQ(9000010,VIEN,.26,"I")
- IF '$$TRIAGE(VIEN)
- SET STOP=1
- QUIT
- End DoDot:3
- if STOP
- QUIT
- +32 ; must be good match, increment counter and set array node
- +33 SET SDOUT(0)=SDOUT(0)+1
- +34 SET SDOUT(VIEN)=$$TIMEDIF(SDINPUT("VISIT DATE"),VIEN)
- End DoDot:2
- End DoDot:1
- +35 QUIT
- +36 ;
- PRVMTCH(SDINPUT,VIEN) ; do visits match on provider?
- +1 NEW PRVS,IEN
- +2 ; if no provider sent, assume okay
- IF '$GET(SDINPUT("PROVIDER"))
- QUIT 1
- +3 ; if visit is triage clinic & new encounter is not ancillary, skip provider match
- +4 IF $$TRIAGE(VIEN)
- IF '$GET(SDINPUT("ANCILLARY"))
- QUIT 1
- +5 ; find all v provider entries for visit
- +6 SET IEN=0
- FOR
- SET IEN=$ORDER(^AUPNVPRV("AD",VIEN,IEN))
- if 'IEN
- QUIT
- Begin DoDot:1
- +7 SET PRVS($$GET1^DIQ(9000010.06,IEN_",",.01,"I"))=""
- End DoDot:1
- +8 ; if incoming provider in list, this is match
- +9 IF $DATA(PRVS(SDINPUT("PROVIDER")))
- QUIT 1
- +10 ; otherwise, no match
- +11 QUIT 0
- +12 ;
- TIMEDIF(VDTTM,VIEN) ; return time diff between incoming time and current visit
- +1 QUIT $$FMDIFF^XLFDT(VDTTM,+$GET(^AUPNVSIT(VIEN,0)),2)\60
- +2 ;
- ADDVIST(SDOUTPUT,SDARRAY) ;
- +1 NEW %DT,SDVISITIN,SUB,X,Y
- +2 SET SUB="SD"
- FOR
- SET SUB=$ORDER(SDARRAY(SUB))
- if SUB=""
- QUIT
- if $EXTRACT(SUB,1,2)'="SD"
- QUIT
- SET SDVISITIN(SUB)=SDARRAY(SUB)
- +3 ;keep it silent
- SET SDVISITIN("AUPNTALK")=""
- SET SDVISITIN("SDANE")=""
- +4 ;facility
- SET SDVISITIN("SDLOC")=$GET(SDARRAY("SITE"))
- +5 ;patient
- SET SDVISITIN("SDPAT")=$GET(SDARRAY("PAT"))
- +6 ;visit type
- SET SDVISITIN("SDTYPE")=$GET(SDARRAY("VISIT TYPE"))
- +7 ;srv cat
- SET SDVISITIN("SDCAT")=$GET(SDARRAY("SRV CAT"))
- +8 ;chkin dt
- SET SDVISITIN("SDDATE")=$GET(SDARRAY("VISIT DATE"))
- +9 ;clinic code ien w/`
- IF $GET(SDARRAY("CLINIC CODE"))
- SET SDVISITIN("SDCLN")="`"_SDARRAY("CLINIC CODE")
- +10 ;clinic name
- SET SDVISITIN("SDHL")=$GET(SDARRAY("HOS LOC"))
- +11 ;appt date
- SET SDVISITIN("SDAPDT")=$GET(SDARRAY("APPT DATE"))
- +12 SET SDVISITIN("SDUSR")=$GET(SDARRAY("USR"))
- +13 ;force add
- SET SDVISITIN("SDADD")=1
- +14 ; create visit
- +15 NEW SDVISITOUT
- +16 DO EN1^SDES2CRTVISIT(.SDVISITOUT,.SDVISITIN)
- +17 ; if no visit created,error quit
- +18 IF '$GET(SDVISITOUT("SDVSIT"))
- Begin DoDot:1
- +19 SET SDOUTPUT(0)="0^Error Creating Visit"
- End DoDot:1
- QUIT
- +20 ; set new visit info in out array
- +21 SET SDOUTPUT(SDVISITOUT("SDVSIT"))="ADD"
- SET SDOUTPUT(0)=1
- +22 KILL SDVISITIN,SDVISITOUT
- +23 QUIT
- +24 ;
- WALKIN(SDOUT,SDWALKIN) ;Create walkin appt which is checked in and visit created
- +1 NEW ERR,VISIT
- +2 ;initialize outgoing count
- SET SDOUT(0)=0
- +3 SET SDWALKIN("CLN")=$GET(SDWALKIN("HOS LOC"))
- +4 ;4=walkin
- SET SDWALKIN("TYP")=4
- +5 SET SDWALKIN("ADT")=$GET(SDWALKIN("APPT DATE"))
- +6 IF '$DATA(SDWALKIN("LEN"))
- SET SDWALKIN("LEN")=$$GET1^DIQ(44,SDWALKIN("CLN"),1912)
- +7 ; make walkin appt
- +8 SET ERR=$$MAKE(.SDWALKIN)
- IF ERR
- SET $PIECE(SDOUT(0),U,2)=$PIECE(ERR,U,2)
- QUIT
- +9 ; set variables used by checkin call
- +10 SET SDWALKIN("CDT")=SDWALKIN("VISIT DATE")
- +11 SET SDWALKIN("CC")=$GET(SDWALKIN("CLINIC CODE"))
- +12 SET SDWALKIN("PRV")=$GET(SDWALKIN("PROVIDER"))
- +13 ; check in appt and create visit
- +14 SET ERR=$$CHECKIN(.SDWALKIN)
- +15 ; update out array based on result
- +16 ; reset SDOUTPUT(0) only if added new visit
- +17 ;visit added
- IF 'ERR
- SET VISIT=$$GETVST(SDWALKIN("PAT"),SDWALKIN("APPT DATE"))
- IF VISIT
- IF '$GET(SDARRAY("VIEN"))
- if SDOUT(0)=0
- SET SDOUT(0)=1
- SET SDOUT(VISIT)="ADD"
- +18 ;error
- IF ERR
- SET $PIECE(SDOUT(0),U,2)=$PIECE(ERR,U,2)
- +19 QUIT
- +20 ;
- HAVEREQ(SDOUT,SDINPUT) ; check required fields
- +1 IF '$GET(SDINPUT("FORCE ADD"))
- IF '$DATA(SDINPUT("TIME RANGE"))
- SET SDOUT(0)="0^Missing Time Range"
- QUIT 0
- +2 IF '$DATA(SDINPUT("PAT"))
- SET SDOUT(0)="0^Missing Patient IEN"
- QUIT 0
- +3 IF '$DATA(SDINPUT("VISIT DATE"))
- SET SDOUT(0)="0^Missing Visit Date"
- QUIT 0
- +4 IF '$DATA(SDINPUT("SITE"))
- SET SDOUT(0)="0^Missing Facility/Site"
- QUIT 0
- +5 IF '$DATA(SDINPUT("VISIT TYPE"))
- SET SDOUT(0)="0^Missing Visit Type"
- QUIT 0
- +6 IF '$DATA(SDINPUT("SRV CAT"))
- SET SDOUT(0)="0^Missing Service Category"
- QUIT 0
- +7 IF '$DATA(SDINPUT("USR"))
- SET SDOUT(0)="0^Missing User IEN"
- QUIT 0
- +8 IF $GET(SDINPUT("HOS LOC"))
- IF '$GET(SDINPUT("CLINIC CODE"))
- SET SDINPUT("CLINIC CODE")=$$GET1^DIQ(44,SDINPUT("HOS LOC"),8,"I")
- +9 ; convert service category
- +10 IF $GET(SDINPUT("APPT DATE"))
- IF $GET(SDINPUT("HOS LOC"))
- SET SDINPUT("SRV CAT")=$$SERCAT(SDINPUT("HOS LOC"),SDINPUT("PAT"))
- +11 QUIT 1
- +12 ;
- TIME(RANGE,VISIT,DATE,END) ; set DATE and END based on TIME RANGE setting in minutes
- +1 NEW TMDIF,SW
- +2 SET TMDIF=$SELECT(RANGE<1:0,1:RANGE)
- +3 SET DATE=$$FMADD^XLFDT(VISIT,,,-TMDIF)
- +4 SET END=$$FMADD^XLFDT(VISIT,,,TMDIF)
- +5 IF (DATE\1)<(END\1)
- SET SW=(END\1)
- SET END=(DATE\1)_".9999"
- SET DATE=SW
- +6 SET DATE=(9999999-(DATE\1)_"."_$PIECE(DATE,".",2))-.0001
- +7 SET END=9999999-(END\1)_"."_$PIECE(END,".",2)
- +8 ;no time range used
- IF RANGE=-1
- SET END=(END\1)_".9999"
- SET DATE=(DATE\1)
- +9 QUIT
- +10 ;
- TRIAGE(VST) ; returns 1 if visit's hosp loc is triage type
- +1 NEW HSPLOC
- +2 SET HSPLOC=$$GET1^DIQ(9000010,VST,.22,"I")
- IF 'HSPLOC
- QUIT 0
- +3 QUIT +$$GET1^DIQ(9009017.2,HSPLOC,.16,"I")
- +4 ;
- MAKE(SDAPPTIN) ;Call to store appt made
- +1 ;
- +2 ; Make call using: S ERR=$$MAKE^SDES2GETVISIT(.ARRAY)
- +3 ;
- +4 ; Input Array -
- +5 ; SDAPPTIN("PAT") = ien of patient in file 2
- +6 ; SDAPPTIN("CLN") = ien of clinic in file 44
- +7 ; SDAPPTIN("TYP") = 3 for scheduled appts, 4 for walkins
- +8 ; SDAPPTIN("ADT") = appointment date and time
- +9 ; SDAPPTIN("LEN") = appointment length in minutes (5-240)
- +10 ; SDAPPTIN("OI") = reason for appt - up to 150 characters
- +11 ; SDAPPTIN("USR") = user who made appt
- +12 ;
- +13 ; Output: error status and message
- +14 ; = 0 or null: everything okay
- +15 ; = 1^message: error and reason
- +16 ;
- +17 NEW SDERROR
- +18 IF '$DATA(^DPT(+$GET(SDAPPTIN("PAT")),0))
- QUIT 1_U_"Patient not on file: "_$GET(SDAPPTIN("PAT"))
- +19 IF '$DATA(^SC(+$GET(SDAPPTIN("CLN")),0))
- QUIT 1_U_"Clinic not on file: "_$GET(SDAPPTIN("CLN"))
- +20 IF ($GET(SDAPPTIN("TYP"))<3)!($GET(SDAPPTIN("TYP"))>4)
- QUIT 1_U_"Appt Type error: "_$GET(SDAPPTIN("TYP"))
- +21 ;PWC allow any time combination of numbers #694
- IF $GET(SDAPPTIN("ADT"))'?7N1"."1N.N
- QUIT 1_U_"Appt Date/Time error: "_$GET(SDAPPTIN("ADT"))
- +22 IF ($GET(SDAPPTIN("LEN"))<5)!($GET(SDAPPTIN("LEN"))>240)
- QUIT 1_U_"Appt Length error: "_$GET(SDAPPTIN("LEN"))
- +23 IF '$DATA(^VA(200,+$GET(SDAPPTIN("USR")),0))
- QUIT 1_U_"User Who Made Appt Error: "_$GET(SDAPPTIN("USR"))
- +24 IF $DATA(^DPT(SDAPPTIN("PAT"),"S",SDAPPTIN("ADT"),0))
- IF $$GET1^DIQ(2.98,SDAPPTIN("ADT")_","_SDAPPTIN("PAT")_",",3,"I")'="C"
- QUIT 1_U_"Patient "_SDAPPTIN("PAT")_" already has appt at "_SDAPPTIN("ADT")
- +25 ;
- +26 NEW DIC,DA,Y,X,DD,DO,DLAYGO
- +27 IF $DATA(^DPT(SDAPPTIN("PAT"),"S",SDAPPTIN("ADT"),0))
- IF $$GET1^DIQ(2.98,SDAPPTIN("ADT")_","_SDAPPTIN("PAT")_",",3,"I")="C"
- Begin DoDot:1
- +28 ; "un-cancel" existing appt in file 2
- +29 NEW SDAPPTFDA,SDAPPTIENS,SDAPPTERR
- +30 SET SDAPPTIENS=SDAPPTIN("ADT")_","_SDAPPTIN("PAT")_","
- +31 SET SDAPPTFDA(2.98,SDAPPTIENS,".01")=SDAPPTIN("CLN")
- +32 SET SDAPPTFDA(2.98,SDAPPTIENS,"3")=""
- +33 SET SDAPPTFDA(2.98,SDAPPTIENS,"9")=SDAPPTIN("TYP")
- +34 SET SDAPPTFDA(2.98,SDAPPTIENS,"9.5")=9
- +35 SET SDAPPTFDA(2.98,SDAPPTIENS,"14")=""
- +36 SET SDAPPTFDA(2.98,SDAPPTIENS,"15")=""
- +37 SET SDAPPTFDA(2.98,SDAPPTIENS,"16")=""
- +38 SET SDAPPTFDA(2.98,SDAPPTIENS,"19")=""
- +39 SET SDAPPTFDA(2.98,SDAPPTIENS,"20")=$$NOW^XLFDT
- +40 DO FILE^DIE("","SDAPPTFDA","SDAPPTERR")
- +41 NEW SDAPPTTMP
- SET SDAPPTTMP=$GET(SDAPPTERR)
- End DoDot:1
- +42 IF '$TEST
- Begin DoDot:1
- +43 ; add appt to file 2
- +44 ; call to silent server call
- +45 NEW SDAPPTFDA,SDAPPTIENS,SDAPPTERR
- +46 SET SDAPPTIENS="?+2,"_SDAPPTIN("PAT")_","
- +47 SET SDAPPTIENS(2)=SDAPPTIN("ADT")
- +48 SET SDAPPTFDA(2.98,SDAPPTIENS,.01)=SDAPPTIN("CLN")
- +49 SET SDAPPTFDA(2.98,SDAPPTIENS,"9")=SDAPPTIN("TYP")
- +50 SET SDAPPTFDA(2.98,SDAPPTIENS,"9.5")=9
- +51 SET SDAPPTFDA(2.98,SDAPPTIENS,"20")=$$NOW^XLFDT
- +52 DO UPDATE^DIE("","SDAPPTFDA","SDAPPTIENS","SDERROR(1)")
- End DoDot:1
- IF $GET(SDERROR(1))
- QUIT 1_U_"FileMan add to DPT error: Patient="_SDAPPTIN("PAT")_" Appt="_SDAPPTIN("ADT")
- +53 ;
- +54 ; add appt to file 44
- +55 KILL DIC,DA,X,Y,DLAYGO,DD,DO
- +56 IF '$DATA(^SC(SDAPPTIN("CLN"),"S",0))
- SET ^SC(SDAPPTIN("CLN"),"S",0)="^44.001DA^^"
- +57 IF '$DATA(^SC(SDAPPTIN("CLN"),"S",SDAPPTIN("ADT"),0))
- Begin DoDot:1
- +58 SET DIC="^SC("_SDAPPTIN("CLN")_",""S"","
- SET DA(1)=SDAPPTIN("CLN")
- SET (X,DINUM)=SDAPPTIN("ADT")
- +59 SET DIC("P")="44.001DA"
- SET DIC(0)="L"
- SET DLAYGO=44.001
- +60 SET Y=1
- IF '$DATA(@(DIC_X_")"))
- DO FILE^DICN
- End DoDot:1
- IF Y<1
- QUIT 1_U_"Error adding date to file 44: Clinic="_SDAPPTIN("CLN")_" Date="_SDAPPTIN("ADT")
- +61 ;
- +62 KILL DIC,DA,X,Y,DLAYGO,DD,DO,DINUM
- +63 SET DIC="^SC("_SDAPPTIN("CLN")_",""S"","_SDAPPTIN("ADT")_",1,"
- +64 SET DA(2)=SDAPPTIN("CLN")
- SET DA(1)=SDAPPTIN("ADT")
- SET X=SDAPPTIN("PAT")
- +65 SET DIC("DR")="1///"_SDAPPTIN("LEN")_";3///"_$EXTRACT($GET(SDAPPTIN("OI")),1,150)_";7///"_SDAPPTIN("USR")_";8///"_$$NOW^XLFDT
- +66 SET DIC("P")="44.003PA"
- SET DIC(0)="L"
- SET DLAYGO=44.003
- +67 DO FILE^DICN
- +68 ;
- +69 ; call event driver
- +70 NEW DFN,SDT,SDCL,SDDA,SDMODE
- +71 SET DFN=SDAPPTIN("PAT")
- SET SDT=SDAPPTIN("ADT")
- SET SDCL=SDAPPTIN("CLN")
- SET SDMODE=2
- +72 SET SDDA=$$SCIEN(SDAPPTIN("PAT"),SDAPPTIN("CLN"),SDAPPTIN("ADT"))
- +73 DO MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE)
- +74 QUIT 0
- +75 ;
- CHECKIN(SDAPPTIN) ;Call to add checkin info to appt
- +1 ;
- +2 ; Input array -
- +3 ; SDAPPTIN("PAT") = ien of patient in file 2
- +4 ; SDAPPTIN("CLN") = ien of clinic in file 44
- +5 ; SDAPPTIN("ADT") = appt date/time
- +6 ; SDAPPTIN("CDT") = checkin date/time
- +7 ; SDAPPTIN("USR") = checkin user
- +8 ; SDAPPTIN("OPT") = option used to create visit (optional)
- +9 ; SDAPPTIN("VIEN") = visit IEN (sent if new visit is NOT to be created)
- +10 ;
- +11 ; variables to create visit under event driver
- +12 ; SDAPPTIN("CC") = clinic code for creating visit - optional
- +13 ; SDAPPTIN("PRV") = visit provider - pointer to file 200
- +14 ;
- +15 ; Output value = 0 (successful)
- +16 ; = 1^error message
- +17 ;
- +18 IF '$DATA(^DPT(+$GET(SDAPPTIN("PAT")),0))
- QUIT 1_U_"Patient not on file: "_$GET(SDAPPTIN("PAT"))
- +19 IF '$DATA(^SC(+$GET(SDAPPTIN("CLN")),0))
- QUIT 1_U_"Clinic not on file: "_$GET(SDAPPTIN("CLN"))
- +20 IF $GET(SDAPPTIN("ADT"))'?7N1"."1N.N
- QUIT 1_U_"Appt Date/Time error: "_$GET(SDAPPTIN("ADT"))
- +21 IF $GET(SDAPPTIN("CDT"))'?7N1"."1N.N
- QUIT 1_U_"Checkin Date/Time error: "_$GET(SDAPPTIN("CDT"))
- +22 IF '$DATA(^VA(200,+$GET(SDAPPTIN("USR")),0))
- QUIT 1_U_"User Who Made Appt Error: "_$GET(SDAPPTIN("USR"))
- +23 ;
- +24 ; find ien for appt in file 44
- +25 NEW IEN,DIE,DA,DR,SDVSTN
- +26 SET IEN=$$SCIEN(SDAPPTIN("PAT"),SDAPPTIN("CLN"),SDAPPTIN("ADT"))
- +27 IF 'IEN
- QUIT 1_U_"Error trying to find appointment for checkin: Patient="_SDAPPTIN("PAT")_" Clinic="_SDAPPTIN("CLN")_" Appt="_SDAPPTIN("ADT")
- +28 ;
- +29 ; remember before status
- +30 NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
- +31 SET DFN=SDAPPTIN("PAT")
- SET SDT=SDAPPTIN("ADT")
- SET SDCL=SDAPPTIN("CLN")
- SET SDMODE=2
- SET SDDA=IEN
- +32 SET SDCIHDL=$$HANDLE^SDAMEVT(1)
- SET SDATA=SDDA_U_DFN_U_SDT_U_SDCL
- +33 DO BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
- +34 ;
- +35 ; set checkin
- +36 NEW SDFDA
- +37 SET SDFDA(44.003,IEN_","_SDAPPTIN("ADT")_","_SDAPPTIN("CLN")_",",305)=$$NOW^XLFDT()
- +38 SET SDFDA(44.003,IEN_","_SDAPPTIN("ADT")_","_SDAPPTIN("CLN")_",",309)=SDAPPTIN("CDT")
- +39 DO FILE^DIE("","SDFDA")
- +40 KILL SDFDA
- +41 ; Updating 302 separately because of trigger on field 309 uses logged-in DUZ
- +42 SET SDFDA(44.003,IEN_","_SDAPPTIN("ADT")_","_SDAPPTIN("CLN")_",",302)=SDAPPTIN("USR")
- +43 DO FILE^DIE("","SDFDA")
- +44 ;
- +45 ; set after status
- +46 SET SDDA=$$SCIEN(SDAPPTIN("PAT"),SDAPPTIN("CLN"),SDAPPTIN("ADT"))
- +47 SET SDCIHDL=$$HANDLE^SDAMEVT(1)
- SET SDATA=SDDA_U_DFN_U_SDT_U_SDCL
- +48 DO AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
- +49 ;
- +50 QUIT 0
- +51 ;
- SERCAT(CLINIC,PAT) ;Returns service category for visit
- +1 NEW CLNCAT
- +2 ;in hospital if inpt
- IF $$GET1^DIQ(2,PAT_",",.1)]""
- QUIT "I"
- +3 ;clinic's service category
- SET CLNCAT=$$GET1^DIQ(9009017.2,CLINIC,.12,"I")
- +4 QUIT $SELECT(CLNCAT]"":CLNCAT,1:"A")
- +5 ;
- SCIEN(PAT,CLINIC,DATE) ;Returns ien for appt in ^SC
- +1 NEW APPTIEN,VALIDIEN
- +2 SET APPTIEN=0
- FOR
- SET APPTIEN=$ORDER(^SC(CLINIC,"S",DATE,1,APPTIEN))
- if 'APPTIEN
- QUIT
- if $GET(VALIDIEN)
- QUIT
- Begin DoDot:1
- +3 ;cancelled
- if $$GET1^DIQ(44.003,APPTIEN_","_DATE_","_CLINIC,310,"I")="C"
- QUIT
- +4 IF $$GET1^DIQ(44.003,APPTIEN_","_DATE_","_CLINIC,.01,"I")=PAT
- SET VALIDIEN=APPTIEN
- End DoDot:1
- +5 QUIT $GET(VALIDIEN)
- +6 ;
- GETVST(PAT,DATE) ;Returns visit ien for appt date and patient
- +1 IF ('PAT)!('DATE)
- QUIT 0
- +2 NEW OUTPTENC
- +3 SET OUTPTENC=$$GET1^DIQ(2.98,DATE_","_PAT_",",21,"I")
- +4 ;outpt encounter ptr
- IF 'OUTPTENC
- QUIT 0
- +5 ;
- +6 ;patient ptr
- IF $$GET1^DIQ(409.68,OUTPTENC_",",.02,"I")'=PAT
- QUIT 0
- +7 ;visit ptr
- QUIT $$GET1^DIQ(409.68,OUTPTENC_",",.05,"I")
- +8 ;