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