| 1 | PRSPESR1 ;WOIFO/JAH - part time physicians ESR Edit ;11/04/04
 | 
|---|
| 2 |  ;;4.0;PAID;**93**;Sep 21, 1995;Build 7
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | ESRFRM(PRSIEN,PPI,PRSD) ;Run ScreenMan Form PRSA ESR EDIT on file 458
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  N TOD,TOD2,TOUR,STAT,GLOB,PRSN1,PRSN2,PRSN4,PRSN5,PRSN6,Y31,PRSDTE
 | 
|---|
| 8 |  N MLALLOW,PRSML,PRSML2,DFN,Z,ZENT,DIE,DA,DDSFILE,STOP,Z
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  S STAT=$$GETSTAT(PRSIEN,PPI,PRSD)
 | 
|---|
| 11 |  S TOD=$P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0)),U,2)
 | 
|---|
| 12 |  S TOD2=$P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0)),U,13)
 | 
|---|
| 13 |  ; NODES THAT WE MAY EDIT IN THE FORM
 | 
|---|
| 14 |  S PRSN1=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,1)) ; tour segmts
 | 
|---|
| 15 |  S PRSN4=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,4)) ; 2nd tour
 | 
|---|
| 16 |  S PRSN5=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,5)) ; esr wrk
 | 
|---|
| 17 |  S PRSN6=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,6)) ; daily esr remrks
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 |  ; get ALL TOUR SGMNTS + meal for display
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  S Y31=$$GETTOUR^PRSPESR3(PRSIEN,PRSD,TOD,PRSN1,PRSN4)
 | 
|---|
| 22 |  S PRSML=$P($G(^PRST(457.1,TOD,0)),U,3)
 | 
|---|
| 23 |  S MLALLOW=60
 | 
|---|
| 24 |  ;
 | 
|---|
| 25 |  ; If second tour, have meal time handy
 | 
|---|
| 26 |  I $G(TOD2)>0 D
 | 
|---|
| 27 |  .  S PRSML2=$P($G(^PRST(457.1,TOD2,0)),U,3)
 | 
|---|
| 28 |  .  S MLALLOW=120
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  S PRSDTE=$P($G(^PRST(458,PPI,2)),U,PRSD)
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 |  ; DFN needed for old call to lock record.
 | 
|---|
| 33 |  S DFN=PRSIEN I '$$AVAILREC^PRSLIB00("TK",.GLOB,.STOP) Q
 | 
|---|
| 34 |  ; ScreenMan
 | 
|---|
| 35 |  S DDSFILE=458,DDSFILE(1)=458.02,DA(2)=PPI,DA(1)=PRSIEN,DA=PRSD
 | 
|---|
| 36 |  S Z=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,5))
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ; allowed types of time for ESR 
 | 
|---|
| 39 |  ; days off only allow RG
 | 
|---|
| 40 |  S ZENT=$S(Y31="Day Off":"RG",1:"RG AL AA DL ML HX CP RL SL CB AD WP TV TR")
 | 
|---|
| 41 |  S DR="[PRSP ESR POST]" D ^DDS
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  ; remove blank rows from ESR
 | 
|---|
| 44 |  S Z=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,5))
 | 
|---|
| 45 |  S ^PRST(458,PPI,"E",PRSIEN,"D",PRSD,5)=$$BURP^PRSPESR2(Z)
 | 
|---|
| 46 |  D:GLOB]"" UNLOCK^PRSLIB00(GLOB)
 | 
|---|
| 47 |  Q
 | 
|---|
| 48 |  ;
 | 
|---|
| 49 | GETSTAT(PRSIEN,PPI,PRSD) ; func return status
 | 
|---|
| 50 |  ; esr daily status (#146) 1:NOT STARTED;2:PENDING;3:RESUBMIT;
 | 
|---|
| 51 |  ; 4:SIGNED;5:APPROVED;6:DAY OFF
 | 
|---|
| 52 |  Q $P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,7)),"^",1)
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 | ESRVALID ; Validate Daily ESR data
 | 
|---|
| 55 |  ; called when PTP attempts to save ScrMn form PRSP ESR POST (F458)
 | 
|---|
| 56 |  ; DDSERROR set to prevent save.
 | 
|---|
| 57 |  ; DDSBR set takes user field
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 |  ;  Z - combo: global time segs + form edits.
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 |  ;  If data unchanged, skip validation and esig
 | 
|---|
| 62 |  ;  But if status = Pend OR Resub, PTP may sign even if data unchanged.
 | 
|---|
| 63 |  N STR,WARNING
 | 
|---|
| 64 |  I $G(Z)'="",$G(Z)=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,5)),STAT'=2,STAT'=3 D  Q
 | 
|---|
| 65 |  .  D MSG^DDSUTL("...No edits to save")
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ; If DDSERROR (bad user data), return to ScreenMan
 | 
|---|
| 68 |  D CHKDATA
 | 
|---|
| 69 |  Q:$G(DDSERROR)
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 |  ; display warning if any are found but don't stop user from signing
 | 
|---|
| 72 |  I $G(WARNING) D WARNMSG^PRSPESR3(STR)
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  ; If user hits return at sign prompt, save as pending
 | 
|---|
| 75 |  ; If user types "^" don't save changes
 | 
|---|
| 76 |  ; If user signs, save.
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  N X1
 | 
|---|
| 79 |  D SIG^XUSESIG
 | 
|---|
| 80 |  I X1="" D
 | 
|---|
| 81 |  . N PRSMSG
 | 
|---|
| 82 |  . S PRSMSG="CANCEL: ESR day changes were not saved."
 | 
|---|
| 83 |  .  I $G(X)="^" D
 | 
|---|
| 84 |  ..    S DDSERROR=1
 | 
|---|
| 85 |  ..    D MSG^DDSUTL(PRSMSG)
 | 
|---|
| 86 |  .  E  D
 | 
|---|
| 87 |  ..    N DIE,DR,DA
 | 
|---|
| 88 |  ..    S DA(2)=$G(PPI),DA(1)=$G(PRSIEN),DA=$G(PRSD)
 | 
|---|
| 89 |  ..;  if status is resubmit and they didn't sign then leave it resubmit
 | 
|---|
| 90 |  ..    I STAT=3 D
 | 
|---|
| 91 |  ...     S DR="146///RESUBMIT;149///MANUAL POST"
 | 
|---|
| 92 |  ...     S PRSMSG="RESUBMIT: changes saved w/out signature, but status remains Resubmit."
 | 
|---|
| 93 |  ..    E  D
 | 
|---|
| 94 |  ...     S DR="146///PENDING;149///MANUAL POST"
 | 
|---|
| 95 |  ...     S PRSMSG="PENDING: ESR day changes saved w/out signature."
 | 
|---|
| 96 |  ...     S STAT=2 ; form global var ESR DAILY STATUS gets PENDING
 | 
|---|
| 97 |  ..    S DIE="^PRST(458,"_DA(2)_",""E"","_DA(1)_",""D"","
 | 
|---|
| 98 |  ..    D ^DIE
 | 
|---|
| 99 |  ..    K X ; reset X since it's saved to dataBse.
 | 
|---|
| 100 |  ..    D MSG^DDSUTL(PRSMSG)
 | 
|---|
| 101 |  E  D
 | 
|---|
| 102 |  .; update ESR DAILY STATUS and ESR LAST SIGN METHOD
 | 
|---|
| 103 |  .  N PRSFDA,IENS,STAMP
 | 
|---|
| 104 |  .  S STAMP=$$NOW^XLFDT()
 | 
|---|
| 105 |  .;
 | 
|---|
| 106 |  .  S IENS=PRSD_","_PRSIEN_","_PPI_","
 | 
|---|
| 107 |  .  S PRSFDA(458.02,IENS,146)=4
 | 
|---|
| 108 |  .  S PRSFDA(458.02,IENS,147)=STAMP
 | 
|---|
| 109 |  .  S PRSFDA(458.02,IENS,149)=1
 | 
|---|
| 110 |  .  D FILE^DIE("","PRSFDA")
 | 
|---|
| 111 |  .  D MSG^DIALOG()
 | 
|---|
| 112 |  .;
 | 
|---|
| 113 |  .  K X ; reset X, it's saved to database.
 | 
|---|
| 114 |  .  S STAT=4 ; form global var ESR DAILY STATUS gets SIGNED
 | 
|---|
| 115 |  .  D MSG^DDSUTL("SIGNED:  ESR data saved with signature.")
 | 
|---|
| 116 |  Q
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 | CHKDATA ; called to validate screenman posting on ESR daily
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  ; Z initialized to data that appears on the unedited form.
 | 
|---|
| 121 |  ; when a field on ScreenMan form changes the appropriate piece
 | 
|---|
| 122 |  ; of Z is updated in the post action change field in ScreenMan.
 | 
|---|
| 123 |  ; so Z contains the original data for a day plus any changes that
 | 
|---|
| 124 |  ; the user is trying to save.
 | 
|---|
| 125 |  ;  each 5 pieces of z hold START, STOP, TYPE OF TIME, REMARKS, MEAL
 | 
|---|
| 126 |  ;
 | 
|---|
| 127 |  N T,K,ZS,NOTHING,MLP,DY2,MTOT,TWO,Z1,Z2,Y
 | 
|---|
| 128 |  S ZS=""
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  ; 2 day tour?
 | 
|---|
| 131 |  S TWO=$P($G(^PRST(457.1,+TOD,0)),U,5)
 | 
|---|
| 132 |  S DY2=TWO="Y"
 | 
|---|
| 133 |  I TOD2,'DY2 S TWO=$P($G(^PRST(457.1,+TOD2,0)),U,5),DY2=TWO="Y"
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 |  ;loop thru 5 columns, 7 time segments
 | 
|---|
| 136 |  ; quit if we encounter an error
 | 
|---|
| 137 |  F K=1:5:31 Q:$G(DDSERROR)  D
 | 
|---|
| 138 |  .;
 | 
|---|
| 139 |  .; if absolutely nothing on any segments in the row or just a zero
 | 
|---|
| 140 |  .; in meal column then skip row.
 | 
|---|
| 141 |  .;
 | 
|---|
| 142 |  .  S NOTHING=(($P(Z,U,K)="")&($P(Z,U,K+1)="")&($P(Z,U,K+2)="")&($P(Z,U,K+3)="")&(($P(Z,U,K+4)="")!($P(Z,U,K+4)=0)))
 | 
|---|
| 143 |  .  Q:NOTHING
 | 
|---|
| 144 |  .;
 | 
|---|
| 145 |  .;  missing start or stop
 | 
|---|
| 146 |  .  I $P(Z,U,K)=""!($P(Z,U,K+1)="") D E8 S DDSERROR=1 Q
 | 
|---|
| 147 |  .;
 | 
|---|
| 148 |  .; 2nd day posting on 1 day tour (ALLOW RG POSTING ACROSS MID)
 | 
|---|
| 149 |  .  S X=$P(Z,U,K)_U_$P(Z,U,K+1)
 | 
|---|
| 150 |  .  D CNV^PRSATIM S Z1=$P(Y,U,1),Z2=$P(Y,U,2)
 | 
|---|
| 151 |  .  D V0^PRSATP1
 | 
|---|
| 152 |  .  I Z2>1440,TWO'="Y","RG OT CT SB ON UA"'[$P(Z,U,K+2) D  Q
 | 
|---|
| 153 |  ..    D E4
 | 
|---|
| 154 |  ..    S DDSERROR=1
 | 
|---|
| 155 |  .;
 | 
|---|
| 156 |  .; posted more than 48 hrs (2880 min)
 | 
|---|
| 157 |  .  I Z2>2880 D E5 S DDSERROR=1 Q
 | 
|---|
| 158 |  .;
 | 
|---|
| 159 |  .; no type of time
 | 
|---|
| 160 |  .  I $P(Z,U,K+2)="" D E9 S DDSERROR=1 Q
 | 
|---|
| 161 |  .;
 | 
|---|
| 162 |  .   I '(Z["HX"&("ON HW"[$P(Z,U,K+2))),'(Z["^ON"&(Z["OT")),'(Z["^ON"&(Z["CT")),$D(T(Z1)) S DDSERROR=1 D E3 Q
 | 
|---|
| 163 |  .   I $P(Z,U,K+2)="HW",Z'["HX",'$P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0)),U,12) S DDSERROR=1 D E7 Q
 | 
|---|
| 164 |  .  I $P(Z,U,K+2)'="" S T(Z1,K)=Z2_U_$P(Z,U,K,K+3)
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  ;  T: 1st subscript is start time (minutes from midnight)
 | 
|---|
| 167 |  ;     2nd subsc is segment number on form (or in Z var)
 | 
|---|
| 168 |  ;     piece 1 stop time in minutes from midnight. 
 | 
|---|
| 169 |  ;   for 3 segment postings will look like the following:
 | 
|---|
| 170 |  ;        T(945,1)=1140^03:45P^07:00P^RG^
 | 
|---|
| 171 |  ;        T(1140,6)=1305^07:00P^09:45P^RG^
 | 
|---|
| 172 |  ;        T(1320,11)=1380^10:00P^11:00P^RG
 | 
|---|
| 173 |  I $G(DDSERROR) D HLP^DDSUTL(.STR) Q
 | 
|---|
| 174 |  I '$D(T) Q
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 |  ; segment overlap
 | 
|---|
| 177 |  I Z'["HX",'(Z["^ON"&(Z["OT")),'(Z["^ON"&(Z["CT")) D
 | 
|---|
| 178 |  .  S Z1=""
 | 
|---|
| 179 |  .  F  S Z1=$O(T(Z1)) Q:Z1=""!($G(DDSERROR))  D
 | 
|---|
| 180 |  ..   I Z1'<T(Z1,$O(T(Z1,0))) D
 | 
|---|
| 181 |  ...     D E1
 | 
|---|
| 182 |  ...     S DDSERROR=1
 | 
|---|
| 183 |  ..   E  D
 | 
|---|
| 184 |  ...    S Y=$O(T(Z1))
 | 
|---|
| 185 |  ...    I Y,T(Z1,$O(T(Z1,0)))>Y S DDSERROR=1 D E2
 | 
|---|
| 186 |  I $G(DDSERROR) D HLP^DDSUTL(.STR) Q
 | 
|---|
| 187 |  ;
 | 
|---|
| 188 |  ; leave outside time segments
 | 
|---|
| 189 |  I $$VALIDLV^PRSPESR2(PRSN1,.T),$$VALIDLV^PRSPESR2(PRSN4,.T) S DDSERROR=1 D E14,HLP^DDSUTL(.STR) Q
 | 
|---|
| 190 |  ;
 | 
|---|
| 191 |  S Z1=$$GET^DDSVAL(DIE,.DA,145)
 | 
|---|
| 192 |  ;
 | 
|---|
| 193 |  ; make sure we have some txt in remarks field when required
 | 
|---|
| 194 |  I Z1="" D
 | 
|---|
| 195 |  .  F K=1:5:31 Q:$G(DDSERROR)  D
 | 
|---|
| 196 |  ..   I $P(Z,U,K+2)="AA" D E6 S DDSERROR=1 Q
 | 
|---|
| 197 |  ..   I $P(Z,U,K+2)="WP",$P(Z,U,K+3)=3 D E10 S DDSERROR=1 Q
 | 
|---|
| 198 |  I $G(DDSERROR) D HLP^DDSUTL(.STR) Q
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 |  ; check for too much total meal for whole day
 | 
|---|
| 201 |  S MTOT=0
 | 
|---|
| 202 |  F K=1:5:31 S MTOT=MTOT+$P(Z,U,K+4)
 | 
|---|
| 203 |  I MTOT>MLALLOW D E15 S DDSERROR=1 D HLP^DDSUTL(.STR) Q
 | 
|---|
| 204 |  ;
 | 
|---|
| 205 |  ; check for too much meal on any segment
 | 
|---|
| 206 |  F K=1:5:31 Q:$G(DDSERROR)  D
 | 
|---|
| 207 |  .  S MLP=$P(Z,U,K+4)
 | 
|---|
| 208 |  .  I MLP>0 D
 | 
|---|
| 209 |  ..    N WORK S WORK=$$ELAPSE^PRSPESR2(MLP,$P(Z,U,K),$P(Z,U,K+1))
 | 
|---|
| 210 |  ..    I $E(WORK,1,1)="-"!(WORK="00:00")!(WORK=0) D E17 S DDSERROR=1
 | 
|---|
| 211 |  I $G(DDSERROR) D HLP^DDSUTL(.STR) Q
 | 
|---|
| 212 |  ;
 | 
|---|
| 213 |  ; check for comptime earned and used w/out remarks
 | 
|---|
| 214 |  F K=1:5:31 Q:$G(DDSERROR)  D
 | 
|---|
| 215 |  . I ($P(Z,U,K+2)="CT")&($P(Z,U,K+3)="") D E11 S DDSERROR=1
 | 
|---|
| 216 |  I $G(DDSERROR) D HLP^DDSUTL(.STR) Q
 | 
|---|
| 217 |  ;
 | 
|---|
| 218 |  F K=1:5:31 Q:$G(DDSERROR)  D
 | 
|---|
| 219 |  . I ($P(Z,U,K+2)="CU")&($P(Z,U,K+3)="") D E12 S DDSERROR=1
 | 
|---|
| 220 |  I $G(DDSERROR) D HLP^DDSUTL(.STR) Q
 | 
|---|
| 221 |  ;
 | 
|---|
| 222 |  ;make sure compressed tours don't post credit hrs remarks.
 | 
|---|
| 223 |  I $$COMPR^PRSATP1(PPI,DFN) D
 | 
|---|
| 224 |  .  F K=1:5:31 Q:$G(DDSERROR)  D
 | 
|---|
| 225 |  ..    I $$CTCH^PRSATP1(Z,K) D E13 S DDSERROR=1
 | 
|---|
| 226 |  I $G(DDSERROR) D HLP^DDSUTL(.STR) Q
 | 
|---|
| 227 |  Q
 | 
|---|
| 228 | E1 S STR="A start time is not less than a stop time." Q
 | 
|---|
| 229 | E2 S STR="End of one segment must not be greater than start of next." Q
 | 
|---|
| 230 | E3 S STR="Duplicate start times encountered." Q
 | 
|---|
| 231 | E4 S STR="Segment of second day encountered; no two-day tour specified." Q
 | 
|---|
| 232 | E5 S STR="Segment of third day encountered." Q
 | 
|---|
| 233 | E6 S STR="Remarks must be entered when AA is posted." Q
 | 
|---|
| 234 | E7 S STR="HW can only be posted with HX or on a Holiday." Q
 | 
|---|
| 235 | E8 S STR="Start or Stop Time not entered for a segment." Q
 | 
|---|
| 236 | E9 S STR="Type of Time not entered for a segment." Q
 | 
|---|
| 237 | E10 S STR="Remarks must be entered for WP due to AWOL." Q
 | 
|---|
| 238 | E11 S STR="REMARKS CODE must be entered when CT is posted." Q
 | 
|---|
| 239 | E12 S STR="REMARKS CODE must be entered when CU is posted." Q
 | 
|---|
| 240 | E13 S STR="REMARKS CODE:  Compressed tours can't earn credit hours." Q
 | 
|---|
| 241 | E14 S STR="Leave cannot be posted outside tour." Q
 | 
|---|
| 242 | E15 S STR="Meal time cannot exceed "_MLALLOW_" minutes." Q
 | 
|---|
| 243 | E16 S STR="Warning: A segment crosses midnight and a subsequent segment appears to be earlier in the day.  This is o.k. as long as all start times begin on the selected ESR day."
 | 
|---|
| 244 | E17 S STR="Meal time must be less than time on the segment it is posted with." Q
 | 
|---|
| 245 |  Q
 | 
|---|