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