| 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 | 
|---|