| 1 | SDVSIT ;MJK/ALB - Visit Tracking Processing ; 3/28/01 2:12pm
 | 
|---|
| 2 |  ;;5.3;Scheduling;**27,44,75,96,132,161,219**;Aug 13, 1993
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | AEUPD(SDVIEN,SDATYPE,SDOEP) ; -- update one entry in multiple
 | 
|---|
| 5 |  ; input: SDVIEN := Visit file pointer
 | 
|---|
| 6 |  ;        SDATYPE := Appointment Type                         [optional]
 | 
|---|
| 7 |  ;         SDOEP := ien of ^SCE that is the parent encounter [optional]
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  N SDOE,DA,DR,DE,DQ,DIE,SD0,SDVSIT,SDT,SDLOCK,SDCL0
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  G AEUPDQ:'$G(^AUPNVSIT(+$G(SDVIEN),0)) S SD0=^(0)
 | 
|---|
| 12 |  S SDT=+SD0
 | 
|---|
| 13 |  S SDVSIT("DFN")=$P(SD0,U,5)
 | 
|---|
| 14 |  I ('SDVSIT("DFN")) G AEUPDQ
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ; -- set lock data and lock
 | 
|---|
| 17 |  S SDLOCK("DFN")=$P(SD0,U,5)
 | 
|---|
| 18 |  S SDLOCK("EVENT DATE/TIME")=SDT
 | 
|---|
| 19 |  D LOCK(.SDLOCK)
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  ; -- quit if encounter does exist for visit
 | 
|---|
| 22 |  IF $O(^SCE("AVSIT",SDVIEN,0)) G AEUPDQ
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  S SDVSIT("DIV")=+$P($G(^SC(+$P(SD0,U,22),0)),U,15)
 | 
|---|
| 25 |  S SDVSIT("DIV")=$$DIV(SDVSIT("DIV"))
 | 
|---|
| 26 |  I ('SDVSIT("DIV")) G AEUPDQ
 | 
|---|
| 27 |  ;
 | 
|---|
| 28 |  S SDVSIT("CLN")=+$P(SD0,U,8)
 | 
|---|
| 29 |  ; -- this may not be needed any longer but doesn't hurt (mjk)
 | 
|---|
| 30 |  I $P($G(^DIC(40.7,+$P(SD0,U,8),0)),U,2)=900 S SDVSIT("CLN")=+$P($G(^SC(+$P(SD0,U,22),0)),U,7)
 | 
|---|
| 31 |  I 'SDVSIT("CLN") G AEUPDQ
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  S:$P(SD0,U,22) SDVSIT("LOC")=$P(SD0,U,22)
 | 
|---|
| 34 |  S:$P(SD0,U,21) SDVSIT("ELG")=$P(SD0,U,21)
 | 
|---|
| 35 |  S SDVSIT("TYP")=$G(SDATYPE)
 | 
|---|
| 36 |  S SDVSIT("PAR")=$G(SDOEP)
 | 
|---|
| 37 |  S SDVSIT("ORG")=2
 | 
|---|
| 38 |  S SDVSIT("REF")=""
 | 
|---|
| 39 |  S SDOE=$$SDOE(SDT,.SDVSIT,SDVIEN,$G(SDOEP))
 | 
|---|
| 40 |  S SDCL0=$G(^SC(+SDVSIT("LOC"),0))
 | 
|---|
| 41 |  D CSTOP(SDOE,SDCL0,.SDVSIT,SDT)  ;Process credit stop if applicable
 | 
|---|
| 42 | AEUPDQ D UNLOCK(.SDLOCK)
 | 
|---|
| 43 |  Q
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 | APPT(DFN,SDT,SDCL,SDVIEN) ; -- process appt
 | 
|---|
| 46 |  ; input        DFN = ien of patient file entry
 | 
|---|
| 47 |  ;              SDT = visit date internal format
 | 
|---|
| 48 |  ;             SDCL = ien of hospital location file entry
 | 
|---|
| 49 |  ;           SDVIEN = Visit file pointer [optional]
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 |  N SDVSIT,SDOE,DA,DIE,DR,SDPT,SDSC,SDCL0,SDDA,SDLOCK
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  ; -- set lock data and lock
 | 
|---|
| 54 |  S SDLOCK("DFN")=DFN
 | 
|---|
| 55 |  S SDLOCK("EVENT DATE/TIME")=SDT
 | 
|---|
| 56 |  D LOCK(.SDLOCK)
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  ; -- set node vars
 | 
|---|
| 59 |  S SDPT=$G(^DPT(DFN,"S",SDT,0))
 | 
|---|
| 60 |  S SDCL0=$G(^SC(SDCL,0)),SDDA=+$$FIND^SDAM2(DFN,SDT,SDCL)
 | 
|---|
| 61 |  S SDSC=$G(^SC(SDCL,"S",SDT,1,SDDA,0))
 | 
|---|
| 62 |  S SDVSIT("CLN")=$P(SDCL0,U,7),SDVSIT("DIV")=$$DIV($P(SDCL0,U,15))
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 |  ; -- do checks
 | 
|---|
| 65 |  I 'SDPT!('SDSC)!($P(SDCL0,U,3)'="C") G APPTQ
 | 
|---|
| 66 |  I SDCL,+SDPT'=SDCL G APPTQ
 | 
|---|
| 67 |  I $P(SDPT,U,20) G APPTQ
 | 
|---|
| 68 |  I 'SDVSIT("CLN")!('SDVSIT("DIV")) G APPTQ
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  ; -- set the rest
 | 
|---|
| 71 |  S SDVSIT("DFN")=DFN,SDVSIT("LOC")=SDCL
 | 
|---|
| 72 |  S:$P(SDSC,U,10) SDVSIT("ELG")=$P(SDSC,U,10)
 | 
|---|
| 73 |  S:$P(SDPT,U,16) SDVSIT("TYP")=$P(SDPT,U,16)
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ; -- call logic to add opt encounter(s)
 | 
|---|
| 76 |  S SDVSIT("ORG")=1,SDVSIT("REF")=SDDA,SDOE=$$SDOE(SDT,.SDVSIT,$G(SDVIEN))
 | 
|---|
| 77 |  I SDOE D
 | 
|---|
| 78 |  .N DA,DIE,DR
 | 
|---|
| 79 |  .S DA=SDT,DA(1)=DFN,DR="21////"_SDOE,DIE="^DPT("_DFN_",""S""," D ^DIE
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  D CSTOP(SDOE,SDCL0,.SDVSIT,SDT)  ;Process credit stop if applicable
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 | APPTQ D UNLOCK(.SDLOCK)
 | 
|---|
| 84 |  Q
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 | CSTOP(SDOE,SDCL0,SDVSIT,SDT) ;Process credit stop
 | 
|---|
| 87 |  ;Input: SDOE=encounter ien
 | 
|---|
| 88 |  ;Input: SDCL0=zeroeth node of HOSPITAL LOCATION file record
 | 
|---|
| 89 |  ;Input: SDVSIT=visit data array (pass by reference)
 | 
|---|
| 90 |  ;Input: SDT=encounter date/time
 | 
|---|
| 91 |  ; -- does clinic have a credit stop code?
 | 
|---|
| 92 |  ; -- process only if non non-count and not equal to credit
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  I SDOE,$P(SDCL0,U,18),($P(SDCL0,U,18)'=SDVSIT("CLN")),($P(SDCL0,U,17)'="Y") D
 | 
|---|
| 95 |  . N X,SDVIENSV,SDVIENOR
 | 
|---|
| 96 |  . S X=$G(^DIC(40.7,$P(SDCL0,U,18),0))
 | 
|---|
| 97 |  .; -- is stop code active?
 | 
|---|
| 98 |  . I $S('$P(X,U,3):1,1:SDT<$P(X,U,3)) D
 | 
|---|
| 99 |  . . S SDVSIT("CLN")=$P(SDCL0,U,18)
 | 
|---|
| 100 |  . . S SDVIENOR=$G(SDVSIT("ORG"))
 | 
|---|
| 101 |  . . S SDVSIT("ORG")=4
 | 
|---|
| 102 |  . . S SDVSIT("PAR")=SDOE
 | 
|---|
| 103 |  . . S SDVIENSV=$G(SDVSIT("VST"))
 | 
|---|
| 104 |  . . K SDVSIT("VST")
 | 
|---|
| 105 |  . . S X=$$SDOE(SDT,.SDVSIT)
 | 
|---|
| 106 |  . . IF X D LOGDATA^SDAPIAP(X)
 | 
|---|
| 107 |  . .;
 | 
|---|
| 108 |  . .; -- restore SDVSIT
 | 
|---|
| 109 |  . . S SDVSIT("CLN")=$P(SDCL0,U,7)
 | 
|---|
| 110 |  . . S SDVSIT("ORG")=SDVIENOR
 | 
|---|
| 111 |  . . S SDVSIT("VST")=SDVIENSV
 | 
|---|
| 112 |  . . K SDVSIT("PAR")
 | 
|---|
| 113 |  . . Q
 | 
|---|
| 114 |  . Q
 | 
|---|
| 115 |  Q
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 | DISP(DFN,SDT,SDVIEN) ; -- process disposition
 | 
|---|
| 118 |  ; input        DFN = ien of patient file entry
 | 
|---|
| 119 |  ;              SDT = visit date internal format
 | 
|---|
| 120 |  ;             SDIV = ien of med ctr file entry
 | 
|---|
| 121 |  ;           SDVIEN = Visit file pointer [optional]
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 |  N SDVSIT,SDOE,DA,DIE,DR,SDIS,SDDA,SDLOCK
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  ; -- set lock data and lock
 | 
|---|
| 126 |  S SDLOCK("DFN")=DFN
 | 
|---|
| 127 |  S SDLOCK("EVENT DATE/TIME")=SDT
 | 
|---|
| 128 |  D LOCK(.SDLOCK)
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  ; -- set up array and other vars
 | 
|---|
| 131 |  D ARRAY(.DFN,.SDT,.SDDA,.SDIS,.SDVSIT)
 | 
|---|
| 132 |  ;
 | 
|---|
| 133 |  ; -- do checks
 | 
|---|
| 134 |  I $P(SDIS,U,2)=2!($P(SDIS,U,2)="")!($P(SDIS,U,18)) G DISPQ
 | 
|---|
| 135 |  I 'SDVSIT("CLN")!('SDVSIT("DIV")) G DISPQ
 | 
|---|
| 136 |  ;
 | 
|---|
| 137 |  ; -- call logic to add opt encounter/visit
 | 
|---|
| 138 |  S SDOE=$$SDOE(SDT,.SDVSIT,$G(SDVIEN))
 | 
|---|
| 139 |  I SDOE S DA=SDDA,DA(1)=DFN,DR="18////"_SDOE,DIE="^DPT("_DFN_",""DIS""," D ^DIE
 | 
|---|
| 140 | DISPQ D UNLOCK(.SDLOCK)
 | 
|---|
| 141 |  Q
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 | ARRAY(DFN,SDT,SDDA,SDIS,SDVSIT) ; -- setup sdvsit for disposition
 | 
|---|
| 144 |  S SDDA=9999999-SDT
 | 
|---|
| 145 |  S SDIS=$G(^DPT(DFN,"DIS",SDDA,0))
 | 
|---|
| 146 |  S SDVSIT("CLN")=$O(^DIC(40.7,"C",102,0))
 | 
|---|
| 147 |  S SDVSIT("DIV")=$$DIV(+$P(SDIS,U,4))
 | 
|---|
| 148 |  S:$P(SDIS,U,13) SDVSIT("ELG")=$P(SDIS,U,13)
 | 
|---|
| 149 |  S SDVSIT("DFN")=DFN
 | 
|---|
| 150 |  S SDVSIT("ORG")=3
 | 
|---|
| 151 |  S SDVSIT("REF")=SDDA
 | 
|---|
| 152 |  S SDVSIT("VST")=""
 | 
|---|
| 153 |  S SDVSIT("TYP")=9
 | 
|---|
| 154 |  Q
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 | LOCK(SDLOCK) ; -- lock "ADFN" node
 | 
|---|
| 157 |  L +^SCE("ADFN",+$G(SDLOCK("DFN")),+$G(SDLOCK("EVENT DATE/TIME")))
 | 
|---|
| 158 |  Q
 | 
|---|
| 159 |  ;
 | 
|---|
| 160 | UNLOCK(SDLOCK) ; -- unlock "ADFN" node
 | 
|---|
| 161 |  L -^SCE("ADFN",+$G(SDLOCK("DFN")),+$G(SDLOCK("EVENT DATE/TIME")))
 | 
|---|
| 162 |  Q
 | 
|---|
| 163 |  ;
 | 
|---|
| 164 | DIV(DIV) ; -- determine med div
 | 
|---|
| 165 |  I $P($G(^DG(43,1,"GL")),U,2),$D(^DG(40.8,+DIV,0)) G DIVQ ; multi-div?
 | 
|---|
| 166 |  S DIV=+$O(^DG(40.8,0))
 | 
|---|
| 167 | DIVQ Q DIV
 | 
|---|
| 168 |  ;
 | 
|---|
| 169 |  ; -- see bottom of SDVSIT0 for additional doc
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 | SDOE(SDT,SDVSIT,SDVIEN,SDOEP) ; -- get visit & encounter
 | 
|---|
| 172 |  S SDVSIT("VST")=$G(SDVIEN)
 | 
|---|
| 173 |  IF 'SDVSIT("VST") D VISIT^SDVSIT0(SDT,.SDVSIT)
 | 
|---|
| 174 |  Q $$NEW^SDVSIT0(SDT,.SDVSIT)
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 |  ;
 | 
|---|
| 177 | DATECHCK(DATETIME) ;Validate FileMan date/time
 | 
|---|
| 178 |  ;Input  : DATETIME - Date and optional time in FileMan format
 | 
|---|
| 179 |  ;Output : DATETIME - Valid date/time in FileMan format
 | 
|---|
| 180 |  ;Notes  : If time was not included on input, time will not be included
 | 
|---|
| 181 |  ;         on output
 | 
|---|
| 182 |  ;       : If time rolls past midnight, 235959 (one second before
 | 
|---|
| 183 |  ;         midnight) will be used
 | 
|---|
| 184 |  ;       : Current date/time will be returned on NULL input
 | 
|---|
| 185 |  ;       : Current date will be used if input date is not valid
 | 
|---|
| 186 |  ;
 | 
|---|
| 187 |  ;Check input
 | 
|---|
| 188 |  Q:($G(DATETIME)="") $$NOW^XLFDT()
 | 
|---|
| 189 |  ;Declare variables
 | 
|---|
| 190 |  N DATE,TIME,HR,MIN,SEC,X,Y,%DT
 | 
|---|
| 191 |  ;Break out date & time
 | 
|---|
| 192 |  S DATE=$P(DATETIME,".",1)
 | 
|---|
| 193 |  S TIME=$P(DATETIME,".",2)_"000000"
 | 
|---|
| 194 |  ;Validate date
 | 
|---|
| 195 |  S X=DATE
 | 
|---|
| 196 |  S %DT="X"
 | 
|---|
| 197 |  D ^%DT
 | 
|---|
| 198 |  ;Date not valid - use current date
 | 
|---|
| 199 |  S:(Y<0) DATE=$$DT^XLFDT()
 | 
|---|
| 200 |  ;No time - return date
 | 
|---|
| 201 |  Q:('TIME) DATE
 | 
|---|
| 202 |  ;Break out hours, minutes, and seconds
 | 
|---|
| 203 |  S HR=$E(TIME,1,2)
 | 
|---|
| 204 |  S MIN=$E(TIME,3,4)
 | 
|---|
| 205 |  S SEC=$E(TIME,5,6)
 | 
|---|
| 206 |  ;Validate seconds - increment minutes if needed
 | 
|---|
| 207 |  S:(SEC>59) MIN=MIN+1,SEC=SEC-60
 | 
|---|
| 208 |  ;Validate minutes - increment hours if needed
 | 
|---|
| 209 |  S:(MIN>59) HR=HR+1,MIN=MIN-60
 | 
|---|
| 210 |  ;Validate hours - revert to one second before midnight
 | 
|---|
| 211 |  S:(HR>23) HR=23,MIN=59,SEC=59
 | 
|---|
| 212 |  ;Append leading zeros to hours, minutes, and seconds
 | 
|---|
| 213 |  S HR="00"_HR
 | 
|---|
| 214 |  S HR=$E(HR,($L(HR)-1),$L(HR))
 | 
|---|
| 215 |  S MIN="00"_MIN
 | 
|---|
| 216 |  S MIN=$E(MIN,($L(MIN)-1),$L(MIN))
 | 
|---|
| 217 |  S SEC="00"_SEC
 | 
|---|
| 218 |  S SEC=$E(SEC,($L(SEC)-1),$L(SEC))
 | 
|---|
| 219 |  ;Rebuild time
 | 
|---|
| 220 |  S TIME=HR_MIN_SEC
 | 
|---|
| 221 |  ;Done - return date and time (trailing zeros removed)
 | 
|---|
| 222 |  Q +(DATE_"."_TIME)
 | 
|---|