| 1 | PRSPSAP3 ;WOIFO/JAH - Supervisor Approve-update pt phys timecard ;01/05/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 | MARK(ACT,PRSIEN,PPI) ; mark supervisors action on temp global
 | 
|---|
| 6 |  ; ESR STATUS
 | 
|---|
| 7 |  ; when updating a single record we overwrite.  When updating
 | 
|---|
| 8 |  ; multiple records we will only update ones with no status.
 | 
|---|
| 9 |  N ITEM,OLDACT,REM,OLDREM
 | 
|---|
| 10 |  S ITEM=$P($G(ACT),U,2)
 | 
|---|
| 11 |  S ACT=$P($G(ACT),U)
 | 
|---|
| 12 |  I ITEM>0 D
 | 
|---|
| 13 |  .  S PRSD=$G(^TMP($J,"PRSPSAP",PRSIEN,PPI,"B",ITEM))
 | 
|---|
| 14 |  .  S ^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,1)=ACT
 | 
|---|
| 15 |  .;  add remarks to the resubmit action, otherwise remove old remarks
 | 
|---|
| 16 |  .  I ACT="R" D
 | 
|---|
| 17 |  ..    S OLDREM=$G(^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,2))
 | 
|---|
| 18 |  ..    S REM=$$GETREM(OLDREM)
 | 
|---|
| 19 |  ..    I REM'="^" S ^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,2)=$G(REM)
 | 
|---|
| 20 |  .  E  D
 | 
|---|
| 21 |  ..    K ^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,2)
 | 
|---|
| 22 |  E  D
 | 
|---|
| 23 |  .  I ACT="R" S REM=$$GETREM()
 | 
|---|
| 24 |  .  S PRSD=0
 | 
|---|
| 25 |  .  F  S PRSD=$O(^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD)) Q:PRSD'>0  D
 | 
|---|
| 26 |  ..   S OLDACT=$G(^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,1))
 | 
|---|
| 27 |  ..   I OLDACT="" D
 | 
|---|
| 28 |  ...     S ^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,1)=ACT
 | 
|---|
| 29 |  ...     I $G(ACT)="R" S ^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD,2)=$G(REM)
 | 
|---|
| 30 |  Q
 | 
|---|
| 31 | GETREM(SNIDE) ; return supervisor remark for a resubmit request
 | 
|---|
| 32 |  ; WE CAN'T EDIT THE FIELD DIRECTLY BECAUSE THIS IS A TRANSACTION
 | 
|---|
| 33 |  ; AND NOTHING IS COMMITED TO THE DB UNTIL THEY SIGN
 | 
|---|
| 34 |  N DIR,DIRUT,REM,DTOUT,DUOUT,X,Y
 | 
|---|
| 35 |  S REM=""
 | 
|---|
| 36 |  S DIR(0)="458.02,148^O"
 | 
|---|
| 37 |  I $G(SNIDE)'="" S DIR("B")=SNIDE
 | 
|---|
| 38 |  S DIR("A")="Enter Remarks"
 | 
|---|
| 39 |  D ^DIR
 | 
|---|
| 40 |  S REM=$G(Y)
 | 
|---|
| 41 |  I $D(DTOUT)!$D(DUOUT) S REM="^"
 | 
|---|
| 42 |  Q REM
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 | CANTPOST(ER,TCS,PPI,PRSIEN,PRSD,ESRN) ; GIVE SUPERVISOR CAN'T POST INFORMATION
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 |  N I,LNCNT
 | 
|---|
| 47 |  D HDR(PRSIEN,PPI,PRSD)
 | 
|---|
| 48 |  W !!,"Time Discrepancies must be resolved.    Timecard Status: "
 | 
|---|
| 49 |  W $S(TCS="P":"RELEASED TO PAYROLL",1:"TRANSMITTED TO AUSTIN")
 | 
|---|
| 50 |  W !,"Payroll must "
 | 
|---|
| 51 |  W $S(TCS="P":"return ",1:"initiate corrected ")
 | 
|---|
| 52 |  W "timecard or physician must resubmit ESR."
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  W !!!,$$ASK^PRSLIB00(1)
 | 
|---|
| 55 |  D HDR(PRSIEN,PPI,PRSD)
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  W !!,?15,"TIME DISCREPANCIES BETWEEN TIMECARD AND ESR"
 | 
|---|
| 59 |  ;W !,?15,"-------------------------------------------"
 | 
|---|
| 60 |  W !,?6,"Error",?21,"Type of Time",?39,"Timecard Hrs",?57,"ESR Hrs"
 | 
|---|
| 61 |  W !,?2,"--------------------------------------------------------------"
 | 
|---|
| 62 |  S I=0 F  S I=$O(ER(I)) Q:I'>0  D
 | 
|---|
| 63 |  . W !,?2,$P(ER(I),U,2),?26,$P(ER(I),U),?44,$P(ER(I),U,3),?60,$P(ER(I),U,4)
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 |  W !!,?32,"ESR POSTING"
 | 
|---|
| 66 |  ;W !,?32,"-----------"
 | 
|---|
| 67 |  N ESR,DAYLNS,DTE,PDT,DAY
 | 
|---|
| 68 |  S PDT=$G(^PRST(458,PPI,2))
 | 
|---|
| 69 |  S DTE=$P(PDT,U,PRSD)
 | 
|---|
| 70 |  D GETESR^PRSPSAP1(.ESR,PPI,PRSIEN,PRSD)
 | 
|---|
| 71 |  D COLHDRS^PRSPSAP1
 | 
|---|
| 72 |  W ! F I=1:1:(IOM-1) W "-"
 | 
|---|
| 73 |  W ! D DAY^PRSPSAPU(.DAYLNS,PRSD_"^"_DTE,.ESR,PRSIEN,PPI)
 | 
|---|
| 74 |  W !!,?30,"TIMECARD POSTING"
 | 
|---|
| 75 |  ;W !,?30,"----------------"
 | 
|---|
| 76 |  W !,?7,"Date",?21,"Scheduled Tour",?46,"Tour Exceptions"
 | 
|---|
| 77 |  W !,?2,"------------------------------------------------------------"
 | 
|---|
| 78 |  N DFN S DAY=PRSD,DFN=PRSIEN D F0^PRSADP1
 | 
|---|
| 79 |  W !
 | 
|---|
| 80 |  Q
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 | HDR(PRSIEN,PPI,PRSD) ;
 | 
|---|
| 83 |  W @IOF,!!,"ESR approval REJECTED for "
 | 
|---|
| 84 |  W $P($G(^PRSPC(PRSIEN,0)),"^")," on day ",PRSD," in PP "
 | 
|---|
| 85 |  W $P($G(^PRST(458,PPI,0)),U),"."
 | 
|---|
| 86 |  Q
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 |  ;===================================================================
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 | CMPESRTC(ERCNT,ERMSG,ESRN,TCN,PPI,PRSIEN,PRSD) ;compare the ESR to the timecard
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ; OUTPUT VARIABLE
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  ;  ERMSG: Array of mismatches in a 4 piece ^ message format
 | 
|---|
| 95 |  ;          type of time ^ message ^ timecard total ^ ESR total
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 |  ; LOCAL VARS
 | 
|---|
| 98 |  ;   TT : Type of time code from type of time file (2 exceptions for
 | 
|---|
| 99 |  ;        WP on timecard with remark 3, awol is "WPAWOL" OR
 | 
|---|
| 100 |  ;        remarks 4, on suspension is "WPSUSP")
 | 
|---|
| 101 |  ;   ERFND : flag that some mismatch was found
 | 
|---|
| 102 |  ;   ESRT
 | 
|---|
| 103 |  ;   TCT   : total time 
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 |  N TT,ERFND,ESRT,TCT,PRSTA
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  S (ERFND,ERMSG,ERCNT)=0
 | 
|---|
| 108 |  I ($G(PPI)'>0)!($G(PRSIEN)'>0)!($G(PRSD)'>0) D  Q
 | 
|---|
| 109 |  .  S ERMSG=U_"FATAL ERROR: Missing internal lookup parameters."_U_U
 | 
|---|
| 110 |  I $G(ESRN)="" S ESRN=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,5))
 | 
|---|
| 111 |  I $G(TCN)="" S TCN=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,2))
 | 
|---|
| 112 |  D ESRTCAR(.PRSTA,ESRN,TCN,PPI,PRSIEN,PRSD)
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 |  ;
 | 
|---|
| 115 |  ; Check for any leave posting mismatch (IGNORE WPAWOL, WPSUSP, RG)
 | 
|---|
| 116 |  S TT=""
 | 
|---|
| 117 |  F  S TT=$O(PRSTA(TT)) Q:TT=""  D
 | 
|---|
| 118 |  . Q:"^HX^AL^AA^DL^ML^RL^SL^CB^AD^WP^TR^TV^"'[(U_TT_U)
 | 
|---|
| 119 |  . S TCT=+$P(PRSTA(TT),U),ESRT=+$P(PRSTA(TT),U,2)
 | 
|---|
| 120 |  . I TCT'=ESRT D
 | 
|---|
| 121 |  ..   S ERCNT=ERCNT+1
 | 
|---|
| 122 |  ..   S ERMSG(ERCNT)=TT_U_"LEAVE mismatch"_U_TCT_U_ESRT,ERFND=1
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 |  ; Check for problems with NON PAY.  If non pay is on the timecard
 | 
|---|
| 125 |  ; then only NO WORK is accepatable on the ESR.
 | 
|---|
| 126 |  ; 
 | 
|---|
| 127 |  I $P($G(PRSTA("NP")),U)>0 D
 | 
|---|
| 128 |  .  S TT=""
 | 
|---|
| 129 |  .  F  S TT=$O(PRSTA(TT)) Q:TT=""!(ERFND)  D
 | 
|---|
| 130 |  ..   S ESRT=+$P(PRSTA(TT),U,2)
 | 
|---|
| 131 |  ..   I +ESRT>0 D
 | 
|---|
| 132 |  ...  S ERCNT=ERCNT+1
 | 
|---|
| 133 |  ...  S ERMSG(ERCNT)=TT_U_"NON PAY mismatch"_U_U_ESRT
 | 
|---|
| 134 |  Q
 | 
|---|
| 135 |  ; 
 | 
|---|
| 136 |  ;===================================================================
 | 
|---|
| 137 |  ;
 | 
|---|
| 138 | ESRTCAR(PRSTA,ESRN,TCN,PPI,PRSIEN,PRSD) ;
 | 
|---|
| 139 |  ; return an array subscripted by types of time (TT) for each TT
 | 
|---|
| 140 |  ; found in either the ESR or timecard.  Piece 1 of each TT subscript
 | 
|---|
| 141 |  ; represents the timcard and piece 2 represents the ESR.
 | 
|---|
| 142 |  ; Both pieces contain the total hours in decimal format of that TT.
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  ; loop through the timecard and the ESR totaling the various types of
 | 
|---|
| 146 |  ; time for each.  Exceptions are as follows:
 | 
|---|
| 147 |  ;   1. when timecard has WP with remarks AWOL or On Suspension then
 | 
|---|
| 148 |  ;      don't add to WP total, since this can never be recorded on 
 | 
|---|
| 149 |  ;      the ESR, instead store on special node ("WPAWOL") or ("WPSUSP")
 | 
|---|
| 150 |  ;
 | 
|---|
| 151 |  ; INPUT VARIABLES
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 |  ; ESRN : electronic subsidiary record posting node
 | 
|---|
| 154 |  ; TCN  : timecard posting node
 | 
|---|
| 155 |  ; PPI, PRSIEN, PRSD : package standard
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  ; 
 | 
|---|
| 158 |  ;LOCAL variables
 | 
|---|
| 159 |  ;  TCPT  : timecard posting type (worked or absent all day or except) 
 | 
|---|
| 160 |  ;  TOD   : Tour of duty pointer
 | 
|---|
| 161 |  ;  PRSML : Length of meal in minutes
 | 
|---|
| 162 |  ;  PRSTA : Time Array subscripted by type of time code (piece one is
 | 
|---|
| 163 |  ;            the timecard total time and piece 2 is esr total time
 | 
|---|
| 164 |  ;  MTT   : Type of time associated with the meal
 | 
|---|
| 165 |  ;  ZNODE : zero node from timecard for tour pointers and lengths
 | 
|---|
| 166 |  ;  
 | 
|---|
| 167 |  ;
 | 
|---|
| 168 |  N TCPT,TOD,PRSML,ZNODE,T1LEN,T2LEN,NETRG,TCEXAMT
 | 
|---|
| 169 |  N TSEG,TT,BEG,END,MEAL,HRS,SEGHRS,TRC
 | 
|---|
| 170 |  K PRSTA
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  S ZNODE=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0))
 | 
|---|
| 173 |  ;
 | 
|---|
| 174 |  ; get tour length in case we need to determine amount of time
 | 
|---|
| 175 |  ; for the tour when we don't have exceptions on the timecard or
 | 
|---|
| 176 |  ; we need the implied RG
 | 
|---|
| 177 |  ;
 | 
|---|
| 178 |  S T1LEN=$P(ZNODE,U,8)
 | 
|---|
| 179 |  S T2LEN=$P(ZNODE,U,14)
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 |  ;
 | 
|---|
| 182 |  ;ESR
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 |  ;
 | 
|---|
| 185 |  F I=1:5:31 D
 | 
|---|
| 186 |  .  S TSEG=$P(ESRN,U,I,I+4)
 | 
|---|
| 187 |  .  S TT=$P(TSEG,U,3)
 | 
|---|
| 188 |  .;
 | 
|---|
| 189 |  .;this line may need to be removed since we are simply looking
 | 
|---|
| 190 |  .; at all types of time at this stage (also would make this call
 | 
|---|
| 191 |  .; more useful as an API to get all types of time)
 | 
|---|
| 192 |  .; 
 | 
|---|
| 193 |  .  Q:"^RG^HX^AL^AA^DL^ML^RL^SL^CB^AD^WP^TR^TV^"'[(U_TT_U)
 | 
|---|
| 194 |  .  S HRS=$P($G(PRSTA(TT)),U,2)
 | 
|---|
| 195 |  .  S BEG=$P(TSEG,U)
 | 
|---|
| 196 |  .  S END=$P(TSEG,U,2)
 | 
|---|
| 197 |  .  S MEAL=$P(TSEG,U,5)
 | 
|---|
| 198 |  .  S SEGHRS=$$AMT^PRSPSAPU(BEG,END,MEAL)
 | 
|---|
| 199 |  .  S $P(PRSTA(TT),U,2)=SEGHRS+HRS
 | 
|---|
| 200 |  ;
 | 
|---|
| 201 |  ; if timecard isn't posted there's no point in going on
 | 
|---|
| 202 |  Q:(+$P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,10)),U,2)'>0)
 | 
|---|
| 203 |  ;
 | 
|---|
| 204 |  ;Timecard with exceptions (no full day work or leave)
 | 
|---|
| 205 |  ;
 | 
|---|
| 206 |  S TCPT=$P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,10)),U,4)
 | 
|---|
| 207 |  I '((TCPT=1)!(TCPT=2)) D
 | 
|---|
| 208 |  .  F I=1:4:24 D
 | 
|---|
| 209 |  ..   S TSEG=$P(TCN,U,I,I+3)
 | 
|---|
| 210 |  ..   S TT=$P(TSEG,U,3)
 | 
|---|
| 211 |  ..   S TRC=$P(TSEG,U,4)
 | 
|---|
| 212 |  ..;  check for awol and store separate from other WP
 | 
|---|
| 213 |  ..   I TT="WP" S TT=$S(TRC=3:"WPAWOL",TRC=4:"WPSUSP",1:TT)
 | 
|---|
| 214 |  ..   Q:"^HX^AL^AA^DL^ML^RL^SL^CB^AD^WP^TR^TV^"'[(U_TT_U)
 | 
|---|
| 215 |  ..   S HRS=$P($G(PRSTA(TT)),U)
 | 
|---|
| 216 |  ..   S BEG=$P(TSEG,U)
 | 
|---|
| 217 |  ..   S END=$P(TSEG,U,2)
 | 
|---|
| 218 |  ..   S SEGHRS=$$AMT^PRSPSAPU(BEG,END,0)
 | 
|---|
| 219 |  ..   S $P(PRSTA(TT),U)=SEGHRS+HRS
 | 
|---|
| 220 |  E  D
 | 
|---|
| 221 |  .;
 | 
|---|
| 222 |  .;  if timecard is posted w/exception or work for the full day
 | 
|---|
| 223 |  .;  then use the tour 1 and 2 lengths to record hours
 | 
|---|
| 224 |  .;
 | 
|---|
| 225 |  .  I TCPT=2 D
 | 
|---|
| 226 |  ..;  full day exception posted: get type of time and remarks
 | 
|---|
| 227 |  ..    S TT="" F I=1:4:24 Q:TT'=""  S TT=$P(TCN,U,I+2),TRC=$P(TCN,U,I+3)
 | 
|---|
| 228 |  ..    I TT="WP" S TT=$S(TRC=3:"WPAWOL",TRC=4:"WPSUSP",1:TT)
 | 
|---|
| 229 |  .  ;
 | 
|---|
| 230 |  .  ; full day work
 | 
|---|
| 231 |  .  I TCPT=1 S TT="RG"
 | 
|---|
| 232 |  .;
 | 
|---|
| 233 |  .  S $P(PRSTA(TT),U)=T1LEN+T2LEN
 | 
|---|
| 234 |  ;
 | 
|---|
| 235 |  ; RG should not be coded on the PTP's timecard but we will tabulate
 | 
|---|
| 236 |  ; the implied RG by reducing the tour length by any exceptions totals
 | 
|---|
| 237 |  ;
 | 
|---|
| 238 |  I $P($G(PRSTA("RG")),U)="" D
 | 
|---|
| 239 |  .  S NETRG=T1LEN+T2LEN
 | 
|---|
| 240 |  .  S TT=""
 | 
|---|
| 241 |  .  F  S TT=$O(PRSTA(TT)) Q:TT=""  D
 | 
|---|
| 242 |  ..;  only times that reduce RG are included
 | 
|---|
| 243 |  ..;    (WP, WPAWOL, WPSUSP & NP) reduce RG
 | 
|---|
| 244 |  ..   Q:"^HX^AL^AA^DL^ML^RL^SL^CB^AD^TR^TV^"[(U_TT_U)
 | 
|---|
| 245 |  ..   Q:TT="RG"
 | 
|---|
| 246 |  ..   S TCEXAMT=$P(PRSTA(TT),U)
 | 
|---|
| 247 |  ..   S NETRG=NETRG-TCEXAMT
 | 
|---|
| 248 |  .  S $P(PRSTA("RG"),U)=NETRG
 | 
|---|
| 249 |  ;
 | 
|---|
| 250 |  Q
 | 
|---|