| 1 | PRSAOTT ;WCIOFO/JAH/PLT- 8B CODES ARRAY.  COMPARE OT (8B-vs-APPROVED). ;11/29/2006
 | 
|---|
| 2 |  ;;4.0;PAID;**37,43,54,112**;Sep 21, 1995;Build 54
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;Function & subroutine Index for this routine.
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  ; APOTWEEK(PAYPRD,WEEKID,EMP450).....return all approved OT in a week.
 | 
|---|
| 8 |  ; ARRAY8B(RECORD)...............Build employee 8B array for payperiod.
 | 
|---|
| 9 |  ; CODES(WEEK)........return string of valid time codes for week 1,2,3.
 | 
|---|
| 10 |  ; GET8BCDS(TT8B).................return timecode portion of 8B string.
 | 
|---|
| 11 |  ; GET8BOT(EMPIEN,WEEK,TT8B)..........return all OT in an 8b string.
 | 
|---|
| 12 |  ; GETOTS(PP,EI,T8,WK,.O8,.OA)......Get overtimes (tt8b & approved).
 | 
|---|
| 13 |  ; OTREQ(REC).................returns true if Request is type Overtime.
 | 
|---|
| 14 |  ; OTAPPR(REC)...................returns true if a Request is Approved.
 | 
|---|
| 15 |  ; WEEKRNG(PPE,WEEK,FIRST,LAST)........1st & last FM days in a pp week.
 | 
|---|
| 16 |  ; WARNSUP(PPE,EI,E8B,WK,OTERR,O8,OA)... check ot's for a week & warn.
 | 
|---|
| 17 |  Q
 | 
|---|
| 18 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 19 | GETOTS(PP,EI,T8,WK,O8,OA) ;Get overtimes (tt8b & approved)
 | 
|---|
| 20 |  ; Sample call:
 | 
|---|
| 21 |  ;   D GETOTS("98-05",1255,TT8BSTRING,1,.O8,.OA)
 | 
|---|
| 22 |  ;   where TT8BSTRING might be =
 | 
|---|
| 23 |  ;   "658229548868WIL   8B268380A106 AN320NA060DA030NR300SE080CD000790"
 | 
|---|
| 24 |  ;
 | 
|---|
| 25 |  ; subroutine returns overtime from request file & TT8B string for
 | 
|---|
| 26 |  ; week specified in parameter 4
 | 
|---|
| 27 |  ;
 | 
|---|
| 28 |  ;  Input:  PP - Pay period in format YY-PP.
 | 
|---|
| 29 |  ;          EI - Employees ien from file 450.
 | 
|---|
| 30 |  ;          T8   - Entire 8B record.  Stored in
 | 
|---|
| 31 |  ;                   ^PRST(458,PP,"E",EI,5).
 | 
|---|
| 32 |  ;  Output: O8 - TT8B overtime calculated
 | 
|---|
| 33 |  ;          OA - approved overtime in request fiLE
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 |  S (OA,O8)=0
 | 
|---|
| 36 |  Q:((WK'=1)&(WK'=2))
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  S O8=$$GET8BOT^PRSAOTT(EI,WK,T8) ;    get all OT from 8b string
 | 
|---|
| 39 |  S OA=$$APOTWEEK^PRSAOTT(PP,WK,EI) ;      get approved overtime
 | 
|---|
| 40 |  Q
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 43 | WARNSUP(PPE,EI,E8B,WK,OTERR,O8,OA) ;Gets overtime from request
 | 
|---|
| 44 |  ; file & TT8B string & displays warning if 8B string has more
 | 
|---|
| 45 |  ; OT than approved requests.
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 |  ;Input: PPE - (P)ay (P)eriod (E)xternal in format YY-PP.
 | 
|---|
| 48 |  ;       EI  - (E)mployees (I)nternal entry # from file 450.
 | 
|---|
| 49 |  ;       E8B - (E)ntire (8B) record.  Stored in ^PRST(458,PP,"E",EI,5).
 | 
|---|
| 50 |  ;       WK - week number 1 or 2 of pay period.
 | 
|---|
| 51 |  ;Output: Warning message to screen.
 | 
|---|
| 52 |  ;Local: OA - (O)vertime (A)pproved  from requests file.
 | 
|---|
| 53 |  ;       O8 - (O)vertime totaled from (8)b string.
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  S (OA,O8,OTERR)=0
 | 
|---|
| 56 |  ; Compare week of approved ot requests to 8B OT.
 | 
|---|
| 57 |  S O8=$$GET8BOT(EI,WK,E8B) ;   get all OT from 8b string
 | 
|---|
| 58 |  S OA=$$APOTWEEK(PPE,WK,EI) ;     get approved overtime
 | 
|---|
| 59 |  I OA<O8 D DISPLAY(EI,O8,OA,WK) S OTERR=1 ; Display warning if calc>apprv
 | 
|---|
| 60 |  Q
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 63 | DISPLAY(IEN,OT8B,OTRQ,WK) ;Output warning message.  8b ot > approved ot.
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 |  ;  Input:  IEN - employees 450 ien.
 | 
|---|
| 66 |  ;          OT8B - employees total overtime calculated from 8b string.
 | 
|---|
| 67 |  ;          OTRQ - employees total approved OT request's from 458.2
 | 
|---|
| 68 |  ;          WK   - week 1 or 2 of payperiod.
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  W !,?3,"WARNING: Week ",WK," -Overtime being paid (",OT8B,") is more than approved (",OTRQ,")."
 | 
|---|
| 71 |  Q
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 74 | GET8BOT(EMPIEN,WEEK,TT8B) ;
 | 
|---|
| 75 |  ;  Output:  Function returns total hrs of overtime that is coded
 | 
|---|
| 76 |  ;           into  TT8B string for either week (1) or (2).
 | 
|---|
| 77 |  ;  Input:   EMPIEN - internal entry # of employee to check 8B overtime
 | 
|---|
| 78 |  ;           WEEK   - week (1) or (2) of pay period to check 8B overtime.
 | 
|---|
| 79 |  ;           TT8B   - full 8B string stub & values.
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  N PPIEN,TT8BOT,OTCODES,CODE,OTTOTAL,OTTMP
 | 
|---|
| 82 |  S OTTOTAL=0
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  ; get time coded portion of 8B string
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  S TT8B=$$GET8BCDS(TT8B)
 | 
|---|
| 87 |  Q:$L(TT8B)<2 OTTOTAL ;    Aint no coded OT if there aint no codes.
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  ; create array of codes & values for this 8b string.
 | 
|---|
| 90 |  D ARRAY8B(TT8B)
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ; create string with all overtime codes.
 | 
|---|
| 93 |  S OTCODES=$S(WEEK=1:"^DA^DB^DC^OA^OB^OC^OK^",1:"^DE^DF^DG^OE^OF^OG^OS^")
 | 
|---|
| 94 |  ; Only count total regular hours @ OT rate when not a firefighter
 | 
|---|
| 95 |  ; with premium pay code "R" or "C". These firefighters get RA/RE from
 | 
|---|
| 96 |  ; their scheduled tour and do not need to have overtime requests. *54
 | 
|---|
| 97 |  I "^R^C^"'[(U_$P($G(^PRSPC(EMPIEN,"PREMIUM")),U,6)_U) D
 | 
|---|
| 98 |  . S OTCODES=OTCODES_$S(WEEK=1:"RA^RB^RC^",1:"RE^RF^RG^")
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 |  ; loop thru employees 8b array to see if they have any of
 | 
|---|
| 101 |  ; overtime codes & add any of them up.
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 |  S CODE=""
 | 
|---|
| 104 |  F  S CODE=$O(TT8B(WEEK,CODE)) Q:CODE=""  D
 | 
|---|
| 105 |  .  I OTCODES[("^"_CODE_"^") D
 | 
|---|
| 106 |  ..   S OTTMP=TT8B(WEEK,CODE)
 | 
|---|
| 107 |  ..   S OTTOTAL=OTTOTAL+$E(OTTMP,1,2)+($E(OTTMP,3)*.25)
 | 
|---|
| 108 |  Q OTTOTAL
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 | APOTWEEK(PAYPRD,WEEKID,EMP450) ;
 | 
|---|
| 113 |  ;Function returns approved overtime totals for a week.
 | 
|---|
| 114 |  ;Input:  PPE,PAYPRD   - pay period of concern. YY-PP
 | 
|---|
| 115 |  ;        WEEKID   - week (1) or week (2) of pay period
 | 
|---|
| 116 |  ;        EMP450   - employees internal entry number in file 450.
 | 
|---|
| 117 |  ;Output: TOTALOT  - total hrs of overtime for a week
 | 
|---|
| 118 |  ;
 | 
|---|
| 119 |  ;local vars:  D1 - 1st day of payperiod-returned by NX^PRSAPPU
 | 
|---|
| 120 |  ;             OTREC - a record containing 1 overtime request.
 | 
|---|
| 121 |  ;             START,STOP - 1st & last FM days of week (Sun,Sat)
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 |  ; quit returning 0 if anything is missing.
 | 
|---|
| 124 |  Q:$G(PAYPRD)=""!$G(WEEKID)=""!$G(EMP450)="" 0
 | 
|---|
| 125 |  ;
 | 
|---|
| 126 |  ; Loop thru OT/CT requests file x-ref on requested work date &
 | 
|---|
| 127 |  ; add up all employees approved OT requests within week.
 | 
|---|
| 128 |  ;
 | 
|---|
| 129 |  N D1,PPE,TOTALOT,START,STOP,OTREC
 | 
|---|
| 130 |  S TOTALOT=0
 | 
|---|
| 131 |  D WEEKRNG(PAYPRD,WEEKID,.START,.STOP)
 | 
|---|
| 132 |  S D1=START-.1
 | 
|---|
| 133 |  F  S D1=$O(^PRST(458.2,"AD",EMP450,D1)) Q:D1>STOP!(D1="")  D
 | 
|---|
| 134 |  .  S OTREC=""
 | 
|---|
| 135 |  .  F  S OTREC=$O(^PRST(458.2,"AD",EMP450,D1,OTREC)) Q:OTREC=""  D
 | 
|---|
| 136 |  ..    I $$OTREQ(OTREC),$$OTAPPR(OTREC) D
 | 
|---|
| 137 |  ...     S TOTALOT=TOTALOT+$P($G(^PRST(458.2,OTREC,0)),"^",6)
 | 
|---|
| 138 |  Q TOTALOT
 | 
|---|
| 139 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 140 | OTREQ(REC) ;Function returns true if Request is type Overtime.
 | 
|---|
| 141 |  Q:$G(REC)="" 0
 | 
|---|
| 142 |  Q $P($G(^PRST(458.2,REC,0)),"^",5)="OT"
 | 
|---|
| 143 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 144 | OTAPPR(REC) ;Function returns true if a Request is Approved.
 | 
|---|
| 145 |  Q:$G(REC)="" 0
 | 
|---|
| 146 |  Q "AS"[$P($G(^PRST(458.2,REC,0)),"^",8)
 | 
|---|
| 147 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 148 | WEEKRNG(PPE,WEEK,FIRST,LAST) ;
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 |  ; Routine takes a pay period & a week number & returns
 | 
|---|
| 151 |  ; 1st & last FileMan days of specified week.
 | 
|---|
| 152 |  ;  Input:  PPE - pay period in format YY-PP.
 | 
|---|
| 153 |  ;          WEEK - week (1) or (2).
 | 
|---|
| 154 |  ;  Output: .FIRST - first day of specified week-FM format
 | 
|---|
| 155 |  ;          .LAST  - last day of specified week-FM format
 | 
|---|
| 156 |  N D1,X1,X2,PPD1
 | 
|---|
| 157 |  D NX^PRSAPPU S PPD1=D1
 | 
|---|
| 158 |  I WEEK=1 D
 | 
|---|
| 159 |  . S (FIRST,X1)=PPD1,X2=6 D C^%DTC S LAST=X
 | 
|---|
| 160 |  E  D
 | 
|---|
| 161 |  . S X1=PPD1,X2=7 D C^%DTC S FIRST=X
 | 
|---|
| 162 |  . S X1=PPD1,X2=13 D C^%DTC S LAST=X
 | 
|---|
| 163 |  Q
 | 
|---|
| 164 |  ;
 | 
|---|
| 165 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 166 | GET8BCDS(TT8B) ; GET 8B time CoDeS
 | 
|---|
| 167 |  ;  Input:   Full 8b record as stored on node 5 of employee record
 | 
|---|
| 168 |  ;           in time & attendance file.
 | 
|---|
| 169 |  ;  Output:  Function returns section of 8b record with pay 
 | 
|---|
| 170 |  ;           codes & values.
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  ;  i.e. return last portion of 8b record  ----- <<AN280AL120CD00040>>
 | 
|---|
| 173 |  ; ^PRST(458,,"E",,5)=658226944741FLI 8B256280A112 AN280AL120CD00040
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 |  ;  Input:   FULL 8B RECORD
 | 
|---|
| 176 |  ;
 | 
|---|
| 177 |  Q $E(TT8B,33,$L(TT8B))
 | 
|---|
| 178 |  ;
 | 
|---|
| 179 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 180 | ARRAY8B(RECORD) ; Build employee 8B array.
 | 
|---|
| 181 |  ; calls to this routine are responsible for cleaning up TT8B( array.
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  ; Build a TT8B array which contains ONLY codes & values 
 | 
|---|
| 184 |  ; that are in employees 8B record.
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 |  ; Input:  RECORD - last portion of 8B array with codes & values.
 | 
|---|
| 187 |  ;                  e.g. <<AN280AL120CD00040>> (see GET8BCDS^PRSAOTT)
 | 
|---|
| 188 |  ;
 | 
|---|
| 189 |  ; Output: array subscripted by time code & set equal to value.
 | 
|---|
| 190 |  ;   e.g.     TT8B(1,"AN")=010
 | 
|---|
| 191 |  ;            TT8B(1,"DA")=020
 | 
|---|
| 192 |  ;            TT8B(1,"NA")=020
 | 
|---|
| 193 |  ;            TT8B(2,"SL")=080
 | 
|---|
| 194 |  ;            TT8B(3,"CD")=000130
 | 
|---|
| 195 |  ;
 | 
|---|
| 196 |  K TT8B S TT8B(0)=0
 | 
|---|
| 197 |  Q:$G(RECORD)=""
 | 
|---|
| 198 |  N EOR,TYPE,VALUE,LOOP,WK
 | 
|---|
| 199 |  S EOR=0
 | 
|---|
| 200 |  F  D  Q:EOR=1
 | 
|---|
| 201 |  .  S TYPE=$E(RECORD,1,2)
 | 
|---|
| 202 |  .;  I TYPE="CD" S VALUE=$E(RECORD,3,$L(RECORD)) S EOR=1
 | 
|---|
| 203 |  .;
 | 
|---|
| 204 |  .;traverse record to next code so LOOP gets len of curr code value
 | 
|---|
| 205 |  .;
 | 
|---|
| 206 |  .  F LOOP=3:1:$L(RECORD) Q:$E(RECORD,LOOP)?1U
 | 
|---|
| 207 |  .  S:LOOP=$L(RECORD) EOR=1
 | 
|---|
| 208 |  .  S VALUE=$S(EOR=1:$E(RECORD,3,LOOP),1:$E(RECORD,3,LOOP-1))
 | 
|---|
| 209 |  .  S:EOR=0 RECORD=$E(RECORD,LOOP,$L(RECORD))
 | 
|---|
| 210 |  .;
 | 
|---|
| 211 |  .;Put code into corresponding week of TT8B array.
 | 
|---|
| 212 |  .;
 | 
|---|
| 213 |  .  S WK=$S($F($$CODES(1),TYPE):1,$F($$CODES(2),TYPE):2,$F($$CODES(3),TYPE):3,1:"unknown")
 | 
|---|
| 214 |  .  S TT8B(WK,TYPE)=VALUE,TT8B(0)=TT8B(0)+1
 | 
|---|
| 215 |  Q
 | 
|---|
| 216 |  ;
 | 
|---|
| 217 |  ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
 | 
|---|
| 218 | CODES(WEEK) ;
 | 
|---|
| 219 |  ; 8b string can contain any number of codes.  Some of codes
 | 
|---|
| 220 |  ; are strictly for types of time in week 1 & some are for week 2.
 | 
|---|
| 221 |  ; There are also pay period codes that are independant from weeks.
 | 
|---|
| 222 |  ;
 | 
|---|
| 223 |  ; This function returns a string of codes for specified 
 | 
|---|
| 224 |  ; week (1) or (2)  -OR- (3)---8b codes independant of week.
 | 
|---|
| 225 |  ;
 | 
|---|
| 226 |  ;  Input:  WEEK - week (1) (2) of pay period. 
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  Q:$G(WEEK)="" 0
 | 
|---|
| 229 |  Q:WEEK=1 "AN SK WD NO AU RT CE CU UN NA NB SP SA SB SC DA DB DC TF OA OB OC YA OK OM RA RB RC HA HB HC PT PA ON YD HD VC EA EB TA TC FA FC AD NT RS ND SR SD"
 | 
|---|
| 230 |  ;
 | 
|---|
| 231 |  Q:WEEK=2 "AL SL WP NP AB RL CT CO US NR NS SQ SE SF SG DE DF DG TG OE OF OG YE OS OU RE RF RG HL HM HN PH PB CL YH HO VS EC ED TB TD FB FD AF NH RN NU SS SH"
 | 
|---|
| 232 |  ;
 | 
|---|
| 233 |  Q:WEEK=3 "NL DW IN TL LU LN LD DT TO LA ML CA PC CY RR FF FE CD"
 | 
|---|
| 234 |  Q 0
 | 
|---|