| 1 | PRSARC07        ;WOIFO/JAH - Tour Hours Procedure ;01/07/08
 | 
|---|
| 2 |         ;;4.0;PAID;**112,116**;Sep 21, 1995;Build 23
 | 
|---|
| 3 |         ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |         Q
 | 
|---|
| 5 |         ;
 | 
|---|
| 6 | TOURHRS(THRARY,PPI,PRSIEN,TOURSTR)      ; Return data for TOUR OF DUTY
 | 
|---|
| 7 |         ;Input:
 | 
|---|
| 8 |         ;  PPI (optional) IEN of #458 otherwise curr PPI assumed.
 | 
|---|
| 9 |         ;    *If PPI and TOURSTR (or only PPI) defined then last pay period
 | 
|---|
| 10 |         ;     spill over from 2nd sat. is added to day 1.
 | 
|---|
| 11 |         ;    *If TOURSTR is defined but not PPI then tour hours
 | 
|---|
| 12 |         ;     from 2nd saturday of tour in TOURSTR are placed on 1st Sunday.
 | 
|---|
| 13 |         ;
 | 
|---|
| 14 |         ;  PRSIEN (required) IEN-File (#450). 
 | 
|---|
| 15 |         ;  TOURSTR (optional) if defined should contain 14 piece string
 | 
|---|
| 16 |         ;          delimited by "^" pieces 1-14 contain pointers
 | 
|---|
| 17 |         ;          to ToD file. Will be used instead of pp to determine
 | 
|---|
| 18 |         ;          tour hrs.
 | 
|---|
| 19 |         ; Output
 | 
|---|
| 20 |         ;  THRARY (TOUR HRS ARRAY)-2 piece array subsc by day #.
 | 
|---|
| 21 |         ;     W1 & W2 node w/ wkly tour hrs.
 | 
|---|
| 22 |         ;    Piece one = Shift code:
 | 
|---|
| 23 |         ;      -Null when no tour hrs fall on that day.
 | 
|---|
| 24 |         ;      -Always 0 for Wage Grades
 | 
|---|
| 25 |         ;      -1, 2, or 3 corresponds to earliest shift on day being reported.
 | 
|---|
| 26 |         ;    Piece two = total hrs for tours that fall on each day.
 | 
|---|
| 27 |         ;       Tours crossing midnight--hrs placed in node on day the occur
 | 
|---|
| 28 |         ;    SPECIAL CASE: COMPRESSED TOURS: "CT" node is defined
 | 
|---|
| 29 |         ;      Piece one set to shift (earliest for pp or 0 for wage)
 | 
|---|
| 30 |         ;      Piece 2 = total pp hrs 
 | 
|---|
| 31 |         ;
 | 
|---|
| 32 |         ;    Error Codes = ARRAY VARIABLE contains a 1 for success or 0 for
 | 
|---|
| 33 |         ;       failure.  If failed then error codes returned in Array 0 node
 | 
|---|
| 34 |         ;         1 = pp undef
 | 
|---|
| 35 |         ;         2 = emp undef
 | 
|---|
| 36 |         ;         3 = no timecard for emp in pp
 | 
|---|
| 37 |         ; Example
 | 
|---|
| 38 |         ; >D TOURHRS^PRSARC04(.THRS,257,12711)
 | 
|---|
| 39 |         ; >ZW THRS
 | 
|---|
| 40 |         ; THRS=1
 | 
|---|
| 41 |         ; THRS(1)=^0
 | 
|---|
| 42 |         ; THRS(2)=1^3
 | 
|---|
| 43 |         ; THRS(3)=1^6
 | 
|---|
| 44 |         ; ...
 | 
|---|
| 45 |         ; THRS(14)=^0
 | 
|---|
| 46 |         N SHIFTCD,ISWAGE,ZNODE,PRSD,SAT,LASTPPI
 | 
|---|
| 47 |         K THRARY
 | 
|---|
| 48 |         I '$D(^PRSPC(+$G(PRSIEN),0)) S THRARY=0,THRARY(0)="2^undefined employee"
 | 
|---|
| 49 |         I $G(TOURSTR)="" D
 | 
|---|
| 50 |         .  I $G(PPI)'>0 S PPI=$P(^PRST(458,0),"^",3)
 | 
|---|
| 51 |         .  I '$D(^PRST(458,+$G(PPI),0)) S THRARY=0,THRARY(0)="1^undefined pay period"
 | 
|---|
| 52 |         .  S LASTPPI=PPI-1
 | 
|---|
| 53 |         .  S ISWAGE=$$ISWAGE^PRSARC08(PRSIEN)
 | 
|---|
| 54 |         . ;
 | 
|---|
| 55 |         . ; Get ToD and Second ToD from last saturday of 
 | 
|---|
| 56 |         . ; prior PP to check for spill over hrs onto day 1 of this PP.
 | 
|---|
| 57 |         . S SAT=$G(^PRST(458,LASTPPI,"E",PRSIEN,"D",14,0))
 | 
|---|
| 58 |         . S PRSD=0,T1=$P(SAT,U,2),T2=$P(SAT,U,13)
 | 
|---|
| 59 |         . D PLACEHRS(.THRARY,PRSIEN,PRSD,T1,T2,LASTPPI)
 | 
|---|
| 60 |         . F PRSD=1:1:14 D
 | 
|---|
| 61 |         ..   S ZNODE=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0))
 | 
|---|
| 62 |         ..   S T1=$P(ZNODE,U,2),T2=$P(ZNODE,U,13)
 | 
|---|
| 63 |         ..   D PLACEHRS(.THRARY,PRSIEN,PRSD,T1,T2,PPI)
 | 
|---|
| 64 |         ..   D PLACESHF(.THRARY,PRSD,T1,T2,ISWAGE)
 | 
|---|
| 65 |         .;
 | 
|---|
| 66 |         .; add compressed tour node if necessary
 | 
|---|
| 67 |         .I $$ISCMPTR^PRSARC08(PPI,PRSIEN) S THRARY("CT")=$$EARLYSH^PRSARC08(.THRARY,ISWAGE)_"^"_$$TOTAL^PRSARC08(.THRARY)
 | 
|---|
| 68 |         E  D
 | 
|---|
| 69 |         .; use tourstring for tours
 | 
|---|
| 70 |         .; add prior tour spillover from 2nd Sat to first Sun
 | 
|---|
| 71 |         . I $G(PPI)>0 D
 | 
|---|
| 72 |         ..   S SAT=$G(^PRST(458,PPI-1,"E",PRSIEN,"D",14,0))
 | 
|---|
| 73 |         ..   S PRSD=0,T1=$P(SAT,U,2),T2=$P(SAT,U,13)
 | 
|---|
| 74 |         ..   D PLACEHRS(.THRARY,PRSIEN,PRSD,T1,T2,PPI)
 | 
|---|
| 75 |         . F PRSD=1:1:14 D
 | 
|---|
| 76 |         ..   S T1=$P(TOURSTR,U,PRSD),T2=""
 | 
|---|
| 77 |         ..   D PLACEHRS(.THRARY,PRSIEN,PRSD,T1,T2,PPI)
 | 
|---|
| 78 |         . ; wrap second saturday to first sunday (IF PPI NOT PASSED)
 | 
|---|
| 79 |         . I $G(PPI)="" S $P(THRARY(1),U,2)=$P(THRARY(1),U,2)+$P($G(THRARY(15)),U,2)
 | 
|---|
| 80 |         ; Prior Sat THRARY(0) only needed temp to get any part of a two day 
 | 
|---|
| 81 |         ; tour that spilled onto THRARY(1)-1st Sun. Next Sun THRARY(15) is 
 | 
|---|
| 82 |         ; only an artifact.
 | 
|---|
| 83 |         S THRARY("W1")=$$TOTAL^PRSARC08(.THRARY,1)
 | 
|---|
| 84 |         S THRARY("W2")=$$TOTAL^PRSARC08(.THRARY,2)
 | 
|---|
| 85 |         K THRARY(0),THRARY(15)
 | 
|---|
| 86 |         Q
 | 
|---|
| 87 |         ;
 | 
|---|
| 88 | PLACEHRS(PRSTH,PRSIEN,PRSD,T1,T2,PPI)   ; procedure puts hrs from tours on current 
 | 
|---|
| 89 |         ; day and next.  called once for each day so a call for curr day 
 | 
|---|
| 90 |         ; may have hrs from prior two day tour
 | 
|---|
| 91 |         ;
 | 
|---|
| 92 |         N CURHRS,CURSHFT,TODAYND,TOMORND,TODHRS,TOMHRS,TOURHRS
 | 
|---|
| 93 |         S TODAYND=$G(PRSTH(PRSD))
 | 
|---|
| 94 |         S TOMORND=$G(PRSTH(PRSD+1))
 | 
|---|
| 95 |         S TODHRS=$P(TODAYND,U,2)
 | 
|---|
| 96 |         S TOMHRS=$P(TOMORND,U,2)
 | 
|---|
| 97 |         ;
 | 
|---|
| 98 |         ; get tour 1 hrs-add to today, tomorrow
 | 
|---|
| 99 |         I T1>0 D
 | 
|---|
| 100 |         .  S TOURHRS=$$TRHRS(1,PRSD,PRSIEN,T1,PPI)
 | 
|---|
| 101 |         .  S TODHRS=TODHRS+$P(TOURHRS,U)
 | 
|---|
| 102 |         .  S TOMHRS=TOMHRS+$P(TOURHRS,U,2)
 | 
|---|
| 103 |         ;
 | 
|---|
| 104 |         ; get tour 2 hrs-add to today, tomorrow
 | 
|---|
| 105 |         I T2>0 D
 | 
|---|
| 106 |         .  S TOURHRS=$$TRHRS(2,PRSD,PRSIEN,T2,PPI)
 | 
|---|
| 107 |         .  S TODHRS=TODHRS+$P(TOURHRS,U)
 | 
|---|
| 108 |         .  S TOMHRS=TOMHRS+$P(TOURHRS,U,2)
 | 
|---|
| 109 |         ;
 | 
|---|
| 110 |         ; add tour hrs to array
 | 
|---|
| 111 |         S $P(PRSTH(PRSD),U,2)=TODHRS
 | 
|---|
| 112 |         ;
 | 
|---|
| 113 |         ; add hrs to day node of array 
 | 
|---|
| 114 |         ;   (2 day tour hrs past midnight on last Sat. go in node 15)
 | 
|---|
| 115 |         ;
 | 
|---|
| 116 |         S $P(PRSTH(PRSD+1),U,2)=TOMHRS
 | 
|---|
| 117 |         Q
 | 
|---|
| 118 | TRHRS(TNUM,PRSD,PRSIEN,TOURIEN,PPI)     ; return string w/ todays hrs p1 ^ tomorrows hrs p2
 | 
|---|
| 119 |         ;
 | 
|---|
| 120 |         N TODHR,TOMHR,TOUR,TSEGS,TWODAYTR,REGHRS,DONE,CROSS,BEG,END,MEALTIME
 | 
|---|
| 121 |         N BEG24,END24,SEGTIME,SEGTOD,SEGTOM,I,SPECIND
 | 
|---|
| 122 |         ;
 | 
|---|
| 123 |         S TODHR=0,TOMHR=0
 | 
|---|
| 124 |         I $G(TOURIEN)'>0 Q TODHR_"^"_TOMHR
 | 
|---|
| 125 |         S TOUR=$G(^PRST(457.1,TOURIEN,0))
 | 
|---|
| 126 |         I TNUM=1 S TSEGS=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,1))
 | 
|---|
| 127 |         I TNUM=2 S TSEGS=$G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,4))
 | 
|---|
| 128 |         I TSEGS="" S TSEGS=$G(^PRST(457.1,TOURIEN,1))
 | 
|---|
| 129 |         S TWODAYTR=$P(TOUR,U,5)="Y"
 | 
|---|
| 130 |         S MEALTIME=$P(TOUR,U,3)
 | 
|---|
| 131 |         I TNUM=1 S REGHRS=$P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0)),U,8)
 | 
|---|
| 132 |         I TNUM=2 S REGHRS=$P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0)),U,14)
 | 
|---|
| 133 |         I REGHRS'>0 S REGHRS=$P(TOUR,U,6)
 | 
|---|
| 134 |         I TWODAYTR D
 | 
|---|
| 135 |         .  S (DONE,CROSS)=0
 | 
|---|
| 136 |         .  F I=1:3:19 D  Q:DONE
 | 
|---|
| 137 |         ..    S BEG=$P(TSEGS,U,I)
 | 
|---|
| 138 |         ..    I BEG="" S DONE=1 Q
 | 
|---|
| 139 |         ..    S END=$P(TSEGS,U,I+1)
 | 
|---|
| 140 |         ..    S SPECIND=$P(TSEGS,U,I+2)
 | 
|---|
| 141 |         ..;   only count regular hours
 | 
|---|
| 142 |         ..    I SPECIND,"RG"'[$P($G(^PRST(457.2,+SPECIND,0)),"^",2) Q
 | 
|---|
| 143 |         ..;  convert beg & end to 24 hr to check if one < other (Xes midnight)
 | 
|---|
| 144 |         ..;  also crossed midnight if not first seg starts at midnight.
 | 
|---|
| 145 |         ..;  CROSS is true so remaining segments recorded to tomorrow.
 | 
|---|
| 146 |         ..    S BEG24=$$TWENTY4^PRSPESR2(BEG)
 | 
|---|
| 147 |         ..    S END24=$$TWENTY4^PRSPESR2(END)
 | 
|---|
| 148 |         ..    I 'CROSS&(((BEG24'<END24)&(BEG24'=2400))!((I>1)&(BEG24=2400))) D
 | 
|---|
| 149 |         ...     S CROSS=1
 | 
|---|
| 150 |         ...     S SEGTOD=$S(BEG24=2400:0,1:$$AMT^PRSPSAPU(BEG,"MID",0))
 | 
|---|
| 151 |         ...     S SEGTOM=$$AMT^PRSPSAPU("MID",END,0)
 | 
|---|
| 152 |         ...     S TODHR=TODHR+SEGTOD
 | 
|---|
| 153 |         ...     S TOMHR=TOMHR+SEGTOM
 | 
|---|
| 154 |         ..    E  D
 | 
|---|
| 155 |         ...     S SEGTIME=$$AMT^PRSPSAPU(BEG,END,0)
 | 
|---|
| 156 |         ...     I CROSS D
 | 
|---|
| 157 |         ....      S TOMHR=TOMHR+SEGTIME
 | 
|---|
| 158 |         ...     E  D
 | 
|---|
| 159 |         ....      S TODHR=TODHR+SEGTIME
 | 
|---|
| 160 |         . ;Pull meal off hrs for today, tomorrow or both.
 | 
|---|
| 161 |         . N HOURS S HOURS=$$PLACEML^PRSARC08(TODHR,TOMHR,MEALTIME)
 | 
|---|
| 162 |         . S TODHR=$P(HOURS,U)
 | 
|---|
| 163 |         . S TOMHR=$P(HOURS,U,2)
 | 
|---|
| 164 |         E  D
 | 
|---|
| 165 |         .  S TODHR=REGHRS
 | 
|---|
| 166 |         Q TODHR_"^"_TOMHR
 | 
|---|
| 167 |         ;
 | 
|---|
| 168 | PLACESHF(PRSTH,PRSD,T1,T2,WAGER)        ;Place earliest shift from
 | 
|---|
| 169 |         ; tour 1 and tour 2 in SDA Tour array (PRSTH)
 | 
|---|
| 170 |         ;INPUT:
 | 
|---|
| 171 |         ;  PRSTH - array to store SDA tour info p1=shift, p2=tour hrs.
 | 
|---|
| 172 |         ;  PRSD - day number in pp 1-14
 | 
|---|
| 173 |         ;  T1, T2 - tour 1 and 2 (ien in ToD file)
 | 
|---|
| 174 |         ;  WAGER - 0 or 1 for whether this is a wage grade employee.
 | 
|---|
| 175 |         ;OUTPUT:
 | 
|---|
| 176 |         ;  PRSTH by reference.  Update "^" piece 1 with shift indicator
 | 
|---|
| 177 |         ;
 | 
|---|
| 178 |         N SHIFT,T1SHFTS,T2SHFTS,SHIFTINI,EARLIEST,SHIFT2
 | 
|---|
| 179 |         ;
 | 
|---|
| 180 |         ; Wage grade always have a 0 for shift
 | 
|---|
| 181 |         I WAGER D
 | 
|---|
| 182 |         .  S $P(PRSTH(PRSD),U)=0
 | 
|---|
| 183 |         E  D 
 | 
|---|
| 184 |         .  S T1SHFTS=$$TRSHFTS^PRSARC08(T1) ; get tour 1 shift for today and tomorrow
 | 
|---|
| 185 |         .  S T2SHFTS=$$TRSHFTS^PRSARC08(T2) ; and tour 2
 | 
|---|
| 186 |         .;  Get any shift placed by a two day tour from yesterday.
 | 
|---|
| 187 |         .;  Then find earliest shift from t1, t2 and two day carryover
 | 
|---|
| 188 |         .  S SHIFTINI=$P($G(PRSTH(PRSD)),U) I SHIFTINI="" S SHIFTINI=4
 | 
|---|
| 189 |         .  S SHIFT=$P(T1SHFTS,U) I SHIFT="" S SHIFT=4
 | 
|---|
| 190 |         .  S SHIFT2=$P(T2SHFTS,U) I SHIFT2="" S SHIFT2=4
 | 
|---|
| 191 |         .  S EARLIEST=SHIFTINI
 | 
|---|
| 192 |         .  I SHIFT<SHIFTINI S EARLIEST=SHIFT
 | 
|---|
| 193 |         .  I SHIFT2<EARLIEST S EARLIEST=SHIFT2
 | 
|---|
| 194 |         .  I EARLIEST=4 S EARLIEST=""
 | 
|---|
| 195 |         .  S $P(PRSTH(PRSD),U)=EARLIEST
 | 
|---|
| 196 |         . ;
 | 
|---|
| 197 |         . ; Now do anything for tomorrow
 | 
|---|
| 198 |         .  S SHIFTINI=$P($G(PRSTH(PRSD+1)),U,1) I SHIFTINI="" S SHIFTINI=4
 | 
|---|
| 199 |         .  S SHIFT=$P(T1SHFTS,U,2) I SHIFT="" S SHIFT=4
 | 
|---|
| 200 |         .  S SHIFT2=$P(T2SHFTS,U,2) I SHIFT2="" S SHIFT2=4
 | 
|---|
| 201 |         .  S EARLIEST=SHIFTINI
 | 
|---|
| 202 |         .  I SHIFT<SHIFTINI S EARLIEST=SHIFT
 | 
|---|
| 203 |         .  I SHIFT2<EARLIEST S EARLIEST=SHIFT2
 | 
|---|
| 204 |         .  I EARLIEST=4 S EARLIEST=""
 | 
|---|
| 205 |         .  S $P(PRSTH(PRSD+1),U)=EARLIEST
 | 
|---|
| 206 |         Q
 | 
|---|
| 207 |         ;
 | 
|---|