1 | PRS8OC ;HISC/MGD-DECOMPOSITION, ON-CALL ;02/17/04
|
---|
2 | ;;4.0;PAID;**63,92**;Sep 21, 1995
|
---|
3 | ;
|
---|
4 | ;The following MUMPS code is used to credit the appropriate
|
---|
5 | ;categories on the timecard for work performed while On-Call.
|
---|
6 | ;All hours during which an individual is identified as being
|
---|
7 | ;On-Call are credited to blocks YD and YH (On Call Hrs) on
|
---|
8 | ;the timecard. Hours during an On-Call episode where an
|
---|
9 | ;individual is actually called in to perform work are credited
|
---|
10 | ;to blocks YA and YE (Sch CB OT) as appropriate. This credit
|
---|
11 | ;is given under the 2-hour minimum rule. When OT work is
|
---|
12 | ;performed during On-Call the actual On-Call Hours reported
|
---|
13 | ;are reduced by the ACTUAL number of hours worked (not by the
|
---|
14 | ;2-hour minimum).
|
---|
15 | ;
|
---|
16 | ;Called by Routines: PRS8ST
|
---|
17 | ;
|
---|
18 | ;C = On-Call
|
---|
19 | ;c = OT during OC
|
---|
20 | ;t = CT during OC
|
---|
21 | ;
|
---|
22 | S (I,D)=$S(T'>96:DAY,1:(DAY+1))
|
---|
23 | S OC=$G(OC),OC(DAY)=$G(OC(DAY)),OC(DAY+1)=$G(OC(DAY+1)) ;oc variables
|
---|
24 | S CC=$G(CC),CC(DAY)=$G(CC(DAY)),CC(DAY+1)=$G(CC(DAY+1)) ;CT on OC count
|
---|
25 | S Y=35,Y(1)=1 D SET
|
---|
26 | I VAR1="C" D:OC!(CC) OCS ;on-call episode (ot OR ct)
|
---|
27 | S:"ct"[VAR1 OC=OC+1,OC(D)=OC(D)+1 S:VAR1="t" CC=CC+1,CC(D)=CC(D)+1
|
---|
28 | I "ct"[VAR1,DAY>0,DAY<15 S CBCK(WK)=CBCK(WK)+1 ;count actual CB hrs
|
---|
29 | Q:'OK!('$D(OC))
|
---|
30 | I OC S Y=23 D OCS ;get rest of them
|
---|
31 | K OC,CC,Y,D Q
|
---|
32 | ;
|
---|
33 | OCS ; --- set On-Call minimum hours
|
---|
34 | ;set YA/YE for PPI="W" or "V" else set OT
|
---|
35 | S Y=$S(CC:7,'DOUB:TOUR+19,1:23)
|
---|
36 | N X,Z,DD,TT,CCCNT,NEXTT,OCCNT,TIMECNT
|
---|
37 | S TT=$S(T>96:T-96,1:T),TIMECNT=0
|
---|
38 | S X=$E(DAY($S(T>96:DAY+1,1:DAY),"W"),TT)
|
---|
39 | ;
|
---|
40 | ; If the current segment is the last of the On-Call OR the last of
|
---|
41 | ; the On-Call Callback and the next time segment is Unavailable ("-")
|
---|
42 | ; or not a type of work ("0") check to see if OT/reg sched is prior
|
---|
43 | ; to on call worked.
|
---|
44 | ;
|
---|
45 | S NEXTT=$S(T+1>96:T-95,1:TT+1) ; Next time segment
|
---|
46 | I "C"[X!(("ct"[X)&("-0"[$E($S(T+1>96:DAY(DAY+1,"W"),1:DAY(DAY,"W")),NEXTT))) D
|
---|
47 | .K XH S X=0 F Z=1:1:8-(OC(DAY)+$G(OC(DAY+1))) D Q:"01"[X
|
---|
48 | ..S DD=OC(DAY)+OC(DAY+1)+Z
|
---|
49 | ..I TT-DD>0 S X=$E(DAY(DAY,"W"),TT-DD) S:X="O"&($E(DAY(DAY,"HOL"),TT-DD)=2) X="h"
|
---|
50 | ..E S X=$E(DAY(DAY-1,"W"),96+T-DD) S:X="O"&($E(DAY(DAY-1,"HOL"),96+T-DD)=2) X="h"
|
---|
51 | ..I "123nHMLSWNARXYFGD"[X S X=1 Q ; on call abuts a reg sched TOD.
|
---|
52 | ..E I "EOhoscte"[X D ; on call abuts time worked outside posted TOD.
|
---|
53 | ...I "ct"'[X S TIMECNT=TIMECNT+1 ; Time already counted in WK().
|
---|
54 | ...S XH=$S(X'="h":0,1:1),X=2
|
---|
55 | ..E S X=0
|
---|
56 | ..Q
|
---|
57 | .Q
|
---|
58 | E D ; Check to see if OT/reg sched is after on call worked
|
---|
59 | .K XH S X=0 F Z=1:1:8-(OC(DAY)+$G(OC(DAY+1))) D Q:"01"[X
|
---|
60 | ..S DD=OC(DAY)+OC(DAY+1)+Z
|
---|
61 | ..I T+Z'>96 S X=$E(DAY(DAY,"W"),T+Z) S:X="O"&($E(DAY(DAY,"HOL"),T+Z)=2) X="h"
|
---|
62 | ..E S X=$E(DAY(DAY+1,"W"),T-96+Z) S:X="O"&($E(DAY(DAY+1,"HOL"),T-96+Z)=2) X="h"
|
---|
63 | ..I "123nHMLSWNARXYFGD"[X S X=1 Q ; on call abuts a reg sched TOD.
|
---|
64 | ..E I "EOhoscte"[X D
|
---|
65 | ...I "ct"'[X S TIMECNT=TIMECNT+1 ; Time already counted in WK().
|
---|
66 | ...S XH=$S(X'="h":0,1:1),X=2
|
---|
67 | ..E S X=0
|
---|
68 | ..Q
|
---|
69 | .Q
|
---|
70 | I $G(XH)'="" S:XH=1!'X Z=Z-1,X=2
|
---|
71 | ;
|
---|
72 | ; Check if Scheduled Call-Back OT crosses Midnight
|
---|
73 | ;
|
---|
74 | I '$D(CRSMID(D)),$E(DAY(DAY,"W"),1)="c",$E(DAY(DAY-1,"W"),96)="c" S FG=0 D Q:FG=1
|
---|
75 | .S CRSMID(D)=1
|
---|
76 | .I OC<7 D Q:FG=1
|
---|
77 | ..; crosses midnight, check if its <2 hours, CRSMID variable set to
|
---|
78 | ..; only do on segment that cross mid, not others
|
---|
79 | ..S CNTR=0 F CX=1:1:8-OC S:$E(DAY(DAY-1,"W"),97-CX)="c" CNTR=CNTR+1
|
---|
80 | ..I OC+CNTR'>8 D
|
---|
81 | ...S Y(1)=$S(X=1:OC,1:8-CNTR)
|
---|
82 | ...D CHOL
|
---|
83 | ...S (OC,OC(D),CC,CC(D))=0,FG=1
|
---|
84 | ..Q
|
---|
85 | ;
|
---|
86 | ; Check if Comp Time crosses Midnight
|
---|
87 | ;
|
---|
88 | I '$D(CRSMID(D)),$E(DAY(DAY,"W"),1)="t",$E(DAY(DAY-1,"W"),96)="t" S FG=0 D Q:FG=1
|
---|
89 | .S CRSMID(D)=1
|
---|
90 | .I OC<7 D Q:FG=1
|
---|
91 | ..; crosses midnight, check if its <2 hours, CRSMID variable set to
|
---|
92 | ..; only do on segment that cross mid, not others
|
---|
93 | ..S CNTR=0 F CX=1:1:8-OC S:$E(DAY(DAY-1,"W"),97-CX)="t" CNTR=CNTR+1
|
---|
94 | ..I OC+CNTR'>8 D
|
---|
95 | ...S Y(1)=$S(X=1:OC,1:8-CNTR)
|
---|
96 | ...D CHOL
|
---|
97 | ...S (OC,OC(D),CC,CC(D))=0,FG=1
|
---|
98 | ..Q
|
---|
99 | ;
|
---|
100 | I CC>0,CC<OC D ;SPLIT SEGMENT, MUST DO TWICE (FOR CT THEN FOR OT)
|
---|
101 | .F I=DAY:1:(DAY+1) I OC(I) D
|
---|
102 | ..S (OCCNT,CCCNT)=0
|
---|
103 | ..I X=2,OC(I)+TIMECNT<8 D ; Add time if 2 hour minimum was not met.
|
---|
104 | ...S TIMECNT=8-OC(I)-TIMECNT ; Amount of time short of the 2 hour min.
|
---|
105 | ...;
|
---|
106 | ...; If TIMECNT is an even number divide needed time equally among the
|
---|
107 | ...; CT and OT.
|
---|
108 | ...I TIMECNT#2=0 S CCCNT=TIMECNT/2,OCCNT=TIMECNT/2
|
---|
109 | ...;
|
---|
110 | ...; If TIMECNT is not an even number divide the time needed as equally
|
---|
111 | ...; as possible among the CT and OT w/ remaining 15 minutes going to OC.
|
---|
112 | ...I TIMECNT#2=1 S CCCNT=TIMECNT\2,OCCNT=(TIMECNT\2)+1
|
---|
113 | ...;
|
---|
114 | ..S Y(1)=$S(X=2:CC(I)+CCCNT,X:CC(I),OC(I)>7:CC(I),1:4),Y=7
|
---|
115 | ..D CHOL
|
---|
116 | ..S Y(1)=$S(X=2:OC(I)-CC(I)+OCCNT,X:OC(I)-CC(I),OC(I)>7:OC(I)-CC(I),1:4)
|
---|
117 | ..S Y=$S('DOUB:TOUR+19,1:23)
|
---|
118 | ..D CHOL
|
---|
119 | ..Q
|
---|
120 | .Q
|
---|
121 | E D ;NOT SPLIT SEGMENT
|
---|
122 | .F I=DAY:1:(DAY+1) I OC(I) D
|
---|
123 | ..I OC(I)<8,X=2 D
|
---|
124 | ...I T'=96 S OC(I)=8-TIMECNT
|
---|
125 | ...I T=96,"ct"'[$E(DAY(DAY+1,"W"),1) S OC(I)=8-TIMECNT
|
---|
126 | ..S Y(1)=$S(X:OC(I),OC(I)>7:OC(I),1:8)
|
---|
127 | ..D CHOL
|
---|
128 | ..Q
|
---|
129 | .Q
|
---|
130 | K OC,CC Q
|
---|
131 | ;
|
---|
132 | CHOL ; --- Check for Holiday Callback
|
---|
133 | S TMP=Y,Y=0
|
---|
134 | ; Don't convert Overtime to Comptime
|
---|
135 | I TMP'=7,$E(ENT,25),$$HOLIDAY^PRS8UT(PY,DFN,+D) S Y=24 ;ot on actual hol
|
---|
136 | I 'Y,$E($G(DAY(I,"HOL")),$S(T>96:(T-96),1:T)) S Y=TOUR+28 ;holiday callback
|
---|
137 | I 'Y S Y=TMP
|
---|
138 | D SET S Y=$S(CC:7,'DOUB:TOUR+19,1:23)
|
---|
139 | Q
|
---|
140 | ;
|
---|
141 | SET ; --- set WK array
|
---|
142 | S W=$S(I<8:1,1:2)
|
---|
143 | I I<1!(I>14) Q
|
---|
144 | I Y(1)>32,'DOUB,$P(C0,"^",12)="N",Y'=7 D
|
---|
145 | .S $P(WK(W),"^",TOUR+15)=$P(WK(W),"^",TOUR+15)+(Y(1)-32)
|
---|
146 | .S $P(WK(W),"^",Y)=$P(WK(W),"^",Y)+32 ;if FLSA=N set >8 = DA
|
---|
147 | E S $P(WK(W),"^",Y)=$P(WK(W),"^",Y)+Y(1)
|
---|
148 | Q
|
---|