1 | PRSATP5 ;HISC/MGD-Timekeeper Post Absence ;04/18/06
|
---|
2 | ;;4.0;PAID;**102,108**;Sep 21, 1995
|
---|
3 | ;
|
---|
4 | CNV96(TDATA,NSEG,ARRAY,ZERO,DADRFM) ;
|
---|
5 | ; Convert the external representation of the start/stop time to
|
---|
6 | ; its 1 - 192 piece equivalent
|
---|
7 | ;
|
---|
8 | ; Input:
|
---|
9 | ; TDATA - Time segments to operate on passed by reference
|
---|
10 | ; NSEG - Number of Segments per start/stop time entry
|
---|
11 | ; 3 for tours, 4 for exceptions
|
---|
12 | ; ARRAY - Name of ordered array to create
|
---|
13 | ; 1st char - P = Prior (to holiday)
|
---|
14 | ; H = Holiday
|
---|
15 | ; N = Next day after holiday
|
---|
16 | ; 2nd char - T = Tour segments
|
---|
17 | ; E = Exception segments, does not include segments
|
---|
18 | ; that define periods of On-Call
|
---|
19 | ; O = Segments that define periods of On-Call
|
---|
20 | ; Could have come from Tour(s) or Exceptions
|
---|
21 | ; C = Segments of work performed during periods
|
---|
22 | ; of On-Call
|
---|
23 | ; Format for all arrays
|
---|
24 | ; ARRAY(START)=START^STOP^TOT
|
---|
25 | ; Note: Exceptions arrays (PE, HE, NE) will contain the
|
---|
26 | ; Remarks Code as the 4th piece of DATA
|
---|
27 | ; Exceptions(START)=START^STOP^TOT^RC
|
---|
28 | ;
|
---|
29 | ; ZERO - 0 node of day being processed
|
---|
30 | ;
|
---|
31 | ; DADRFM - variable needed for tracking of tours that
|
---|
32 | ; cross midnight. Passed by reference and may
|
---|
33 | ; be changed.
|
---|
34 | ;
|
---|
35 | Q:TDATA=""
|
---|
36 | N D,FLAG,K,LAST,K1,N,N1,N14,NDAY,QT,V,X,Y,Y1,Z
|
---|
37 | S N=$S(NSEG=4:2,1:1)
|
---|
38 | D CNV,COA
|
---|
39 | Q
|
---|
40 | ;
|
---|
41 | ; The CNV code was copied from PRS8SU and modified to fit
|
---|
42 | ; out needs
|
---|
43 | ;
|
---|
44 | ; loop thru data nodes for day
|
---|
45 | CNV S D(0)=ZERO,Z=TDATA,N1=NSEG,(N14,NDAY,LAST,QT)=0
|
---|
46 | ;
|
---|
47 | ; process tour and work nodes by looping thru postings in the node
|
---|
48 | F K=1:N1 S V=$P(Z,"^",K,K+1) Q:QT D
|
---|
49 | .S X=$P(Z,U,K,999)
|
---|
50 | .S:X?1"^"."^"!(X="")!(N14=1) QT=1
|
---|
51 | .I QT!($P(Z,U,K)="") Q
|
---|
52 | .;
|
---|
53 | .S:K=1 (NDAY,LAST)=0
|
---|
54 | .;
|
---|
55 | .; process start time and stop time for posting in node
|
---|
56 | .F K1=1,2 S X=$P(V,"^",K1),(Y,Y1)=K1-1 I X'="" D
|
---|
57 | ..;
|
---|
58 | ..; when a tour exception (N=2) start time (K1=1) is being processed
|
---|
59 | ..; determine if LAST should be reset (FLAG). If LAST is reset then
|
---|
60 | ..; the start time of the tour exception will initially be placed
|
---|
61 | ..; in the current day (X'>96) instead of the following day (X>96)
|
---|
62 | ..S FLAG=1
|
---|
63 | ..I N=2&(K1=1)&("^HW^"[("^"_$P(Z,"^",K+2)_"^")) D
|
---|
64 | ...S FLAG=$S(NDAY=1!(LAST>96)&("^HW^"[("^"_$P(Z,"^",K+2)_"^"))&((X["A")!(X["MID")):0,1:1),NDAY=0
|
---|
65 | ..S:$P(D(0),"^",14)'=""&(X="MID")&(LAST=96)&(N=2)&(K1=1) FLAG=0
|
---|
66 | ..S:N=2&(K1=1)&(FLAG=1) (NDAY,LAST)=0
|
---|
67 | ..;
|
---|
68 | ..S Y=K1-1 D 15^PRS8SU ; determine number (1-192) corresponding to time
|
---|
69 | ..;
|
---|
70 | ..; if some tour exceptions (such as leave) are not within a sched.
|
---|
71 | ..; tour then they must be for the following day (i.e. 2-day tour)
|
---|
72 | ..I N=2,"^RG^OT^CT^ON^SB^HW^"'[("^"_$P(Z,"^",K+2)_"^") D
|
---|
73 | ...S Y=+$O(DADRFM("S",(-X-.01))),Y1=+$O(DADRFM("F",(X-.01)))
|
---|
74 | ...I $G(DADRFM("S",Y))'=$G(DADRFM("F",Y1)) S X=X+96
|
---|
75 | ...;
|
---|
76 | ..S $P(Z,"^",K+(K1-1))=X ; replace time by number
|
---|
77 | ..;
|
---|
78 | ..; save scheduled tour start and stop times for later use when
|
---|
79 | ..; placing some tour exceptions on correct day for 2-day tours
|
---|
80 | ..I K1=1,N=1!(N=4) S DADRFM("S",-X)=DADRFM
|
---|
81 | ..I K1=2,N=1!(N=4) S DADRFM("F",X)=DADRFM,DADRFM=DADRFM+1
|
---|
82 | ..;
|
---|
83 | ..; End of code copied from PRS8SU
|
---|
84 | ..S $P(TDATA,U,K+(K1-1))=X
|
---|
85 | Q
|
---|
86 | ;
|
---|
87 | ; Create ordered arrays
|
---|
88 | COA N ARY,RC,SEG,STI,STOP,STRT,TOT
|
---|
89 | S RC=""
|
---|
90 | F SEG=0:1:6 D
|
---|
91 | .S STRT=$P(TDATA,U,(SEG*NSEG)+1)
|
---|
92 | .Q:STRT=""
|
---|
93 | .S STOP=$P(TDATA,U,(SEG*NSEG)+2),TOT=$P(TDATA,U,(SEG*NSEG)+3)
|
---|
94 | .; For Node1 & Node4 TOT will be numeric so we will need to get
|
---|
95 | .; its external representation (2 character string)
|
---|
96 | .; For Node2 TOT will be a 2 character string
|
---|
97 | .I NSEG=4 S RC=$P(TDATA,U,(SEG*NSEG)+4)
|
---|
98 | .S STI="" ; Special Tour Indicator
|
---|
99 | .I NSEG=3,TOT S STI=$P($G(^PRST(457.2,TOT,0)),U,2)
|
---|
100 | .;
|
---|
101 | .; Don't set exceptions defining periods of On-Call into Exception array
|
---|
102 | .I $E(ARRAY,2)="E",TOT'="ON" D
|
---|
103 | ..S @ARRAY@(STRT)=STRT_U_STOP_U_TOT_U_RC
|
---|
104 | .;
|
---|
105 | .; Set only Reg segments of tour where the Special Tour Indicator
|
---|
106 | .; is "" or RG into the Tour array
|
---|
107 | .I $E(ARRAY,2)="T" D
|
---|
108 | ..I TOT="" S @ARRAY@(STRT)=STRT_U_STOP_U_TOT
|
---|
109 | ..I STI="RG" S @ARRAY@(STRT)=STRT_U_STOP_U_TOT
|
---|
110 | .;
|
---|
111 | .; Only set segments that define On-Call into On-Call array
|
---|
112 | .I TOT="ON"!(STI="ON") D
|
---|
113 | ..S TOT=$S(TOT'="":TOT,1:STI)
|
---|
114 | ..S ARY=$E(ARRAY,1)_"O" S @ARY@(STRT)=STRT_U_STOP_U_TOT
|
---|
115 | .;
|
---|
116 | .; Only segments of work get in the Call-Back
|
---|
117 | .I "^RG^OT^CT^"[("^"_TOT_"^") D
|
---|
118 | .. S ARY=$E(ARRAY,1)_"C" S @ARY@(STRT)=STRT_U_STOP_U_TOT
|
---|
119 | Q
|
---|
120 | ;
|
---|
121 | GETPPP(PPIP,DFN,WDAY,BACK,QUIT) ;
|
---|
122 | ; Set appropriate variables for prior pay period
|
---|
123 | ; Input:
|
---|
124 | ; PPIP - Internal format of current pay period
|
---|
125 | ; DFN - IEN of employee
|
---|
126 | ; WDAY - Day currently being examined
|
---|
127 | ; QUIT - Null
|
---|
128 | ;
|
---|
129 | ; Output:
|
---|
130 | ; PPIP - IEN of Prior Pay Period
|
---|
131 | ; WDAY - Set to last day of prior pay period
|
---|
132 | ; BACK - Counter for number of pay period looked back
|
---|
133 | ; QUIT - Will be set to 1 if there is no timecard for
|
---|
134 | ; the employee in the prior pay period
|
---|
135 | ;
|
---|
136 | S PPIP=$O(^PRST(458,PPIP),-1) ; Get Prior PP
|
---|
137 | I 'PPIP S QUIT=1 Q ; No prior pay period on file
|
---|
138 | ; Check for employee timecard in this PP
|
---|
139 | I '$D(^PRST(458,PPIP,"E",DFN,0)) S QUIT=1 Q
|
---|
140 | S WDAY=14,BACK=BACK+1
|
---|
141 | Q
|
---|
142 | ;
|
---|
143 | GETNPP(PPIN,DFN,WDAY,NEXT,QUIT) ;
|
---|
144 | ; Set appropriate variables for next pay period
|
---|
145 | ; Input:
|
---|
146 | ; PPIN - Internal format of current pay period
|
---|
147 | ; DFN - IEN of employee
|
---|
148 | ; WDAY - Day currently being examined
|
---|
149 | ; QUIT - Null
|
---|
150 | ;
|
---|
151 | ; Output:
|
---|
152 | ; PPIN - IEN of Next Pay Period
|
---|
153 | ; WDAY - Set to first day of next pay period
|
---|
154 | ; BACK - Counter for number of pay period looked forward
|
---|
155 | ; QUIT - Will be set to 1 if there is no timecard for
|
---|
156 | ; the employee in the next pay period
|
---|
157 | ;
|
---|
158 | S PPIN=$O(^PRST(458,PPIN)) ; Get next PP
|
---|
159 | I 'PPIN S QUIT=1 Q ; Next pay period not on file
|
---|
160 | ; Check for employee timecard in this PP
|
---|
161 | I '$D(^PRST(458,PPIN,"E",DFN,0)) S QUIT=1 Q
|
---|
162 | S WDAY=1,NEXT=NEXT+1
|
---|
163 | Q
|
---|