| 1 | PRSPSAP2 ;WOIFO/JAH - Supervisor Approve-update pt phys timecard ;7/26/05 | 
|---|
| 2 | ;;4.0;PAID;**93**;Sep 21, 1995;Build 7 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | Q | 
|---|
| 5 | TRANSACT ; TRANSfer ACTions to the database | 
|---|
| 6 | ;  loop thru temp and update the time card and the ESR day stats | 
|---|
| 7 | N ACT,PRSIEN,PPI,PRSD | 
|---|
| 8 | S PRSIEN="" | 
|---|
| 9 | F  S PRSIEN=$O(^TMP($J,"PRSPSAP",PRSIEN)) Q:PRSIEN'>0  D | 
|---|
| 10 | .  S PPI=0 | 
|---|
| 11 | .  F  S PPI=$O(^TMP($J,"PRSPSAP",PRSIEN,PPI)) Q:PPI'>0  D | 
|---|
| 12 | ..     S PRSD=0 | 
|---|
| 13 | ..     F  S PRSD=$O(^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD)) Q:PRSD'>0  D | 
|---|
| 14 | ...       S ACT=$G(^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,1)) | 
|---|
| 15 | ...;      Ignore ESR days that the superV skipped or bypassed. | 
|---|
| 16 | ...       Q:(ACT="")!(ACT="B") | 
|---|
| 17 | ...; | 
|---|
| 18 | ...;      set ESR day status to resubmit and add remarks | 
|---|
| 19 | ...       I ACT="R" D | 
|---|
| 20 | ....          S REM=$G(^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,2)) | 
|---|
| 21 | ....          D UPESR(PRSIEN,PPI,PRSD,ACT,REM) | 
|---|
| 22 | ...       E  D | 
|---|
| 23 | ....; try to update the timecard and the ESR | 
|---|
| 24 | ....          N CAN S (CAN("CB"),CAN("AE"))=0 | 
|---|
| 25 | ....          D UPTCARD(.CAN,PRSIEN,PPI,PRSD) | 
|---|
| 26 | ....          I CAN("AE") D UPESR(PRSIEN,PPI,PRSD,ACT,"") | 
|---|
| 27 | ....          I CAN("CB") D PTP^PRSASR1(PRSIEN,PPI) | 
|---|
| 28 | Q | 
|---|
| 29 | UPESR(PRSIEN,PPI,PRSD,ACT,REM) ; update ESR with either Resubmit OR Approve | 
|---|
| 30 | N PRSFDA,IENS | 
|---|
| 31 | ; | 
|---|
| 32 | ; update ESR status and display any filing errors | 
|---|
| 33 | ; | 
|---|
| 34 | S IENS=PRSD_","_PRSIEN_","_PPI_"," | 
|---|
| 35 | S PRSFDA(458.02,IENS,146)=$S(ACT="A":"APPROVED",1:"RESUBMIT") | 
|---|
| 36 | I $G(REM)'="" S PRSFDA(458.02,IENS,148)=REM | 
|---|
| 37 | D FILE^DIE("E","PRSFDA") | 
|---|
| 38 | D MSG^DIALOG() | 
|---|
| 39 | Q | 
|---|
| 40 | ; | 
|---|
| 41 | UPTCARD(CAN,PRSIEN,PPI,PRSD) ; UPDATE A TIME CARD | 
|---|
| 42 | ;               WITH ESR LEAVE EXCEPTIONS AND HOLIDAY X | 
|---|
| 43 | ; Return CAN by reference. | 
|---|
| 44 | ;   CAN("AE") "CAN APPROVE ESR" is set to true if the ESR can be | 
|---|
| 45 | ;             approved.  i.e. timecard status is T-timekeep or there's | 
|---|
| 46 | ;             no affect on the timecard | 
|---|
| 47 | ;   CAN("CB") "CAN CALL BANK" is set to true when a call should be | 
|---|
| 48 | ;             made to the hours bank API (PTP^PRSASR1). | 
|---|
| 49 | ;             Calling routines must consider the order in which | 
|---|
| 50 | ;             to APPROVE ESR and CALL HOURS BANK since the API | 
|---|
| 51 | ;             PTP^PRSASR, will only count hrs with an approved status. | 
|---|
| 52 | ; | 
|---|
| 53 | ;458.02 (DAY MULTIPLE) | 
|---|
| 54 | ; FIELD:   10  TOUR LAST POSTED BY^P200 | 
|---|
| 55 | ;                identifies last person to post a tour for employee | 
|---|
| 56 | ;          101  POSTING STATUS^S^T:TIMEKEEPER POSTED; | 
|---|
| 57 | ;               P:PAYROLL REVIEWED;X:TRANSMITTED; | 
|---|
| 58 | ;          102  TIMEKEEPER POSTING^P200'^VA(200, | 
|---|
| 59 | ;          103  TK DATE/TIME ENTERED^DATE | 
|---|
| 60 | ;          104  POSTING TYPE^S^1:WORKED ENTIRE TOUR; | 
|---|
| 61 | ;               2:ABSENT ENTIRE TOUR;3:IRREGULAR TOUR; | 
|---|
| 62 | N TCN,ESRN,POST,PSTDT,POSTER,PTYPE | 
|---|
| 63 | N TCSTAT,DYSTAT,DUMB,POSTYPE,TOD,EARY,ERRORS | 
|---|
| 64 | S (CAN("CB"),CAN("AE"))=0 | 
|---|
| 65 | ;get the raw posting from the ESR | 
|---|
| 66 | S ESRN=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,5)) | 
|---|
| 67 | ; day signed on ESR with no work OR get the work segments | 
|---|
| 68 | I $P(ESRN,U)'="" S ESRN=$$GETAPTM(ESRN) | 
|---|
| 69 | ;get the timecard node | 
|---|
| 70 | S TCN=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,2)) | 
|---|
| 71 | S POST=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,10)) | 
|---|
| 72 | S PSTDT=$P(POST,U) | 
|---|
| 73 | S DYSTAT=$P(POST,U,2) | 
|---|
| 74 | S POSTER=$P(POST,U,3) | 
|---|
| 75 | S POSTYPE=$P(POST,U,4) | 
|---|
| 76 | ; if the timecard is still with timekeep it can be updated. | 
|---|
| 77 | S TCSTAT=$$TCSTAT(PPI,PRSIEN) | 
|---|
| 78 | I TCSTAT="T" D | 
|---|
| 79 | .   S CAN("AE")=1,CAN("CB")=0 | 
|---|
| 80 | .   D EDTCARD(PPI,PRSIEN,PRSD,ESRN) | 
|---|
| 81 | E  D | 
|---|
| 82 | . ;if timecard is in a payroll or transmit we can check | 
|---|
| 83 | . ; for any affect to TimeCard from the ESR.  If none | 
|---|
| 84 | .;  we can update the ESR to approved and we should make a | 
|---|
| 85 | .; a call to the hours bank after ESR is set to apporved | 
|---|
| 86 | .; the hours bank and quit | 
|---|
| 87 | .; otherwise we have to either return timecard or do corrcted timecard | 
|---|
| 88 | .; | 
|---|
| 89 | .;  If timecard has no postings and ESR has no exceptions | 
|---|
| 90 | .;  the ESR can be approved since no change to timecard is necessary | 
|---|
| 91 | .  I ESRN=""&(TCN="") S (CAN("AE"),CAN("CB"))=1 Q | 
|---|
| 92 | .; | 
|---|
| 93 | .; if ESR matches Timecard, update ESR no Timecard update necessary | 
|---|
| 94 | .  D CMPESRTC^PRSPSAP3(.ERRORS,.EARY,"","",PPI,PRSIEN,PRSD) | 
|---|
| 95 | .  I ERRORS=0 S (CAN("AE"),CAN("CB"))=1 Q | 
|---|
| 96 | .  I "^P^X^"["^"_TCSTAT_"^" S (CAN("AE"),CAN("CB"))=0 D  Q | 
|---|
| 97 | ..    D CANTPOST^PRSPSAP3(.EARY,TCSTAT,PPI,PRSIEN,PRSD,ESRN) | 
|---|
| 98 | ..    S DUMB=$$ASK^PRSLIB00(1) | 
|---|
| 99 | Q | 
|---|
| 100 | EDTCARD(PPI,PRSIEN,PRSD,ESRN) ; edit the timecard | 
|---|
| 101 | ; | 
|---|
| 102 | N EDTSTR,CLEAR,POSTTIME,PRSFDA,IENS | 
|---|
| 103 | ; | 
|---|
| 104 | ; if there's no work, no leave or only RG then ptp gets credit for | 
|---|
| 105 | ; entire day, otherwise we have some exceptions.  If the physician | 
|---|
| 106 | ; used leave the entire day then don't post meal and set ptype=2 | 
|---|
| 107 | ; | 
|---|
| 108 | S CLEAR=$$CLRTCDY^PRSPSAPU(PPI,PRSIEN,PRSD,5) | 
|---|
| 109 | S PTYPE=$S($P(ESRN,U)="":1,1:3) | 
|---|
| 110 | I PTYPE=3 D | 
|---|
| 111 | .  I $$ABSENT(ESRN,PPI,PRSIEN,PRSD) S PTYPE=2 | 
|---|
| 112 | .  S TCN=$$ESR2TC(ESRN,PTYPE) | 
|---|
| 113 | .; update the timecard with a global set | 
|---|
| 114 | .  S ^PRST(458,PPI,"E",PRSIEN,"D",PRSD,2)=TCN | 
|---|
| 115 | ; | 
|---|
| 116 | ; update timecard status | 
|---|
| 117 | N %,X,%I,%H D NOW^%DTC S POSTTIME=% | 
|---|
| 118 | ; | 
|---|
| 119 | ; update timecard status and display any filing errors | 
|---|
| 120 | ; | 
|---|
| 121 | S IENS=PRSD_","_PRSIEN_","_PPI_"," | 
|---|
| 122 | S PRSFDA(458.02,IENS,101)="T" | 
|---|
| 123 | S PRSFDA(458.02,IENS,102)=DUZ | 
|---|
| 124 | S PRSFDA(458.02,IENS,103)=POSTTIME | 
|---|
| 125 | S PRSFDA(458.02,IENS,104)=PTYPE | 
|---|
| 126 | D FILE^DIE("","PRSFDA") | 
|---|
| 127 | D MSG^DIALOG() | 
|---|
| 128 | Q | 
|---|
| 129 | ; | 
|---|
| 130 | ESR2TC(ESRN,PT) ;CONVERT ESR DATA TO TIMECARD FORMAT | 
|---|
| 131 | ; | 
|---|
| 132 | N ESR2TC,TCS,I,TSEG,ST,EN,TT,RE,ML,TCN | 
|---|
| 133 | ; | 
|---|
| 134 | S TCN="" | 
|---|
| 135 | F I=1:5:31 D | 
|---|
| 136 | .  S TSEG=$P(ESRN,U,I,I+4) | 
|---|
| 137 | .    S ST=$P(TSEG,U) | 
|---|
| 138 | .    Q:ST="" | 
|---|
| 139 | .    S EN=$P(TSEG,U,2) | 
|---|
| 140 | .    S TT=$P(TSEG,U,3) | 
|---|
| 141 | .    S RE=$P(TSEG,U,4) | 
|---|
| 142 | .    S ML=$P(TSEG,U,5) | 
|---|
| 143 | .;   if meal posted remove it from leave end time | 
|---|
| 144 | .    I (PT=3)&(ML>0) S EN=$$ENDML(EN,ML) | 
|---|
| 145 | .    S:$G(TCN)'="" TCN=TCN_"^" | 
|---|
| 146 | .    S TCS=ST_U_EN_U_TT_U_RE | 
|---|
| 147 | .    S TCN=TCN_TCS | 
|---|
| 148 | ; REMOVE A TRAILING UPARROW GENERATED BY NULL REMARKS CODE | 
|---|
| 149 | I $E(TCN,$L(TCN))=U S TCN=$E(TCN,1,$L(TCN)-1) | 
|---|
| 150 | Q TCN | 
|---|
| 151 | ; | 
|---|
| 152 | ; | 
|---|
| 153 | ABSENT(ESRN,PPI,PRSIEN,PRSD) ;return true if the ESR posting matches all | 
|---|
| 154 | ; the tour start and stop times and uses only one type of leave and | 
|---|
| 155 | ; the meal matches the tours meal. | 
|---|
| 156 | ; i.e. ESR posting equivalent to absent entire tour question. | 
|---|
| 157 | ; | 
|---|
| 158 | N TR1,TR2,TR1ML,TR2ML,TRMEAL,LASTTT,MULTITT,NODE0,RETURN,TCT | 
|---|
| 159 | N TCS,I,TSEG,ST,EN,TT,ML,TCTOUR,ESRTOUR | 
|---|
| 160 | ; | 
|---|
| 161 | S (ESRTOUR,LASTTT)="",(MULTITT,ML,RETURN)=0 | 
|---|
| 162 | F I=1:5:31 D | 
|---|
| 163 | .  S TSEG=$P(ESRN,U,I,I+4) | 
|---|
| 164 | .    S ST=$P(TSEG,U) | 
|---|
| 165 | .    Q:ST="" | 
|---|
| 166 | .    S EN=$P(TSEG,U,2) | 
|---|
| 167 | .    S TT=$P(TSEG,U,3) | 
|---|
| 168 | .    I LASTTT="" D | 
|---|
| 169 | ..      S LASTTT=TT | 
|---|
| 170 | .    E  D | 
|---|
| 171 | ..      I LASTTT'=TT S MULTITT=1 | 
|---|
| 172 | .    S ML=ML+$P(TSEG,U,5) | 
|---|
| 173 | .    S:$G(ESRTOUR)'="" ESRTOUR=ESRTOUR_"^" | 
|---|
| 174 | .    S TCS=ST_U_EN | 
|---|
| 175 | .    S ESRTOUR=ESRTOUR_TCS | 
|---|
| 176 | ; REMOVE A TRAILING UPARROW GENERATED BY NULL REMARKS CODE | 
|---|
| 177 | I $E(ESRTOUR,$L(ESRTOUR))=U S ESRTOUR=$E(ESRTOUR,1,$L(ESRTOUR)-1) | 
|---|
| 178 | ; | 
|---|
| 179 | ; | 
|---|
| 180 | S TCT=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,1)) | 
|---|
| 181 | S NODE0=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0)) | 
|---|
| 182 | S (TR1ML,TR2ML)=0 | 
|---|
| 183 | S TR1=$P(NODE0,U,2) I TR1>0 S TR1ML=$P($G(^PRST(457.1,TR1,0)),U,3) | 
|---|
| 184 | S TR2=$P(NODE0,U,15) I TR2>0 S TR2ML=$P($G(^PRST(457.1,TR2,0)),U,3) | 
|---|
| 185 | S TRMEAL=TR1ML+TR2ML | 
|---|
| 186 | S TCTOUR="" | 
|---|
| 187 | F I=1:3:31 D | 
|---|
| 188 | .  S TSEG=$P(TCT,U,I,I+4) | 
|---|
| 189 | .    S ST=$P(TSEG,U) | 
|---|
| 190 | .    Q:ST="" | 
|---|
| 191 | .    S EN=$P(TSEG,U,2) | 
|---|
| 192 | .    S:$G(TCTOUR)'="" TCTOUR=TCTOUR_"^" | 
|---|
| 193 | .    S TCS=ST_U_EN | 
|---|
| 194 | .    S TCTOUR=TCTOUR_TCS | 
|---|
| 195 | I (TCTOUR=ESRTOUR)&('MULTITT)&(TRMEAL=ML) S RETURN=1 | 
|---|
| 196 | Q RETURN | 
|---|
| 197 | ; | 
|---|
| 198 | ENDML(END,MEAL) ;GET AN END TIME AND DEDUCT THE MEAL FROM IT | 
|---|
| 199 | ; | 
|---|
| 200 | N X | 
|---|
| 201 | ; quit if we aint gots a good enought end time. | 
|---|
| 202 | Q:($G(END)'?2N.P.2N.A)&(END'="MID")&(END'="NOON") $G(END) | 
|---|
| 203 | S END=$$TWENTY4^PRSPESR2(END) | 
|---|
| 204 | S END=$E(END,1,2)_":"_$E(END,3,4) | 
|---|
| 205 | S END=$$MEALCUT(END,MEAL) | 
|---|
| 206 | ; Convert back to form stored in 458 start stop times | 
|---|
| 207 | S X=END D ^PRSATIM S END=X | 
|---|
| 208 | Q END | 
|---|
| 209 | ; | 
|---|
| 210 | MEALCUT(HHMM,MEAL) ;Subtract meal time from the end time | 
|---|
| 211 | ; (subtract a 15 minute increment from length of time | 
|---|
| 212 | ; in hh:mm format, i.e. hh:mm - mm | 
|---|
| 213 | ; | 
|---|
| 214 | N X,Y,DECR,OBJ,I,HH,MM | 
|---|
| 215 | S MM=$P(HHMM,":",2) ; get minutes | 
|---|
| 216 | ; quit minutes or meal not quarter hours | 
|---|
| 217 | Q:(MM#15'=0&(+MM)!((MEAL#15)'=0&(+MEAL))) HHMM | 
|---|
| 218 | ; get hours | 
|---|
| 219 | S HH=$P(HHMM,":") | 
|---|
| 220 | ; | 
|---|
| 221 | ; convert segment minutes and meal to a digit. | 
|---|
| 222 | ; | 
|---|
| 223 | S X=MM D MEALIN^PRSPESR2 S OBJ=X | 
|---|
| 224 | S X=$G(MEAL) D MEALIN^PRSPESR2 S DECR=X | 
|---|
| 225 | I OBJ=0 S OBJ=4 | 
|---|
| 226 | F I=1:1:DECR D | 
|---|
| 227 | .  I OBJ=4 D | 
|---|
| 228 | ..    I +HH=0 D | 
|---|
| 229 | ...     S HH=23 | 
|---|
| 230 | ..    E  D | 
|---|
| 231 | ...     S HH="0"_(+HH-1) S HH=$E(HH,$L(HH)-1,$L(HH)) | 
|---|
| 232 | . S OBJ=$S(OBJ=4:3,OBJ=3:2,OBJ=2:1,OBJ=1:4) | 
|---|
| 233 | S MM=$S(OBJ=1:15,OBJ=2:30,OBJ=3:45,1:"00") | 
|---|
| 234 | ; | 
|---|
| 235 | Q HH_MM | 
|---|
| 236 | ; | 
|---|
| 237 | TCSTAT(PPI,PRSIEN) ; get timecard status | 
|---|
| 238 | Q:(PPI'>0)!(PRSIEN'>0) 0 | 
|---|
| 239 | Q $P($G(^PRST(458,PPI,"E",PRSIEN,0)),U,2) | 
|---|
| 240 | ; | 
|---|
| 241 | GETAPTM(WORK) ; return the work node with only the time that should | 
|---|
| 242 | ; be posted to a PTP's timecard | 
|---|
| 243 | ; INPUT: WORK : ESR work node | 
|---|
| 244 | ; RETURN ESRN : ESR node with only time applicable to PTP's | 
|---|
| 245 | ; | 
|---|
| 246 | N I,TSEG | 
|---|
| 247 | S TCN="" | 
|---|
| 248 | F I=1:5:31 D | 
|---|
| 249 | .  S TSEG=$P(WORK,U,I,I+4) | 
|---|
| 250 | .  S TT=$P(TSEG,U,3) | 
|---|
| 251 | .  Q:TSEG="^^^^"!("^HX^AL^AA^DL^ML^RL^SL^CB^AD^WP^TR^TV^"'[(U_TT_U)) | 
|---|
| 252 | .  S TCN=TCN_TSEG_"^" | 
|---|
| 253 | Q TCN | 
|---|
| 254 | ; | 
|---|
| 255 | ; | 
|---|