1 | PRS8ST ;HISC/MGD-DECOMPOSITION, START-UP ;05/09/07
|
---|
2 | ;;4.0;PAID;**45,92,102,112**;Sep 21, 1995;Build 54
|
---|
3 | ;;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | ;This routine is the one which actually gets everything moving.
|
---|
6 | ;It moves the information from the ^TMP global into a local array
|
---|
7 | ;[DAY(DAY)] for the three day period it's working with. It then
|
---|
8 | ;processes that information internally and, where necessary, by
|
---|
9 | ;calling certain external processes.
|
---|
10 | ;
|
---|
11 | ;Called by Routines: PRS8SU
|
---|
12 | ;
|
---|
13 | K SBY F DAY=1:1:14 D
|
---|
14 | .K DAY(DAY-2)
|
---|
15 | .S LP=$S(DAY=1:"0,1,2",1:(DAY+1)),JURY=0
|
---|
16 | .F II=1:1 S DY=$P(LP,",",II) Q:DY="" D
|
---|
17 | ..F J=0,1,2,4,10,"CP","DH1","DH2","HOL","ML","MT1","MT2","OFF","P","TOUR","TWO","W","r" D
|
---|
18 | ...S DAY(DY,J)=$G(^TMP($J,"PRS8",DY,J))
|
---|
19 | ...;
|
---|
20 | ...;P 45 INITIALIZE THE "F" NODE HERE BY SIMPLY COPYING THE
|
---|
21 | ...;THE "W" NODE FROM TEMP--FOR TESTING PURPOSES.
|
---|
22 | ...;THE NODE SHOULD BE INITIALIZED BY COPYING THE "F" NODE
|
---|
23 | ...;FROM THE TEMP GLOBAL.
|
---|
24 | ...S DAY(DY,"F")=$G(^TMP($J,"PRS8",DY,"W"))
|
---|
25 | .F II=1:1 S DY=$P(LP,",",II) Q:DY="" D
|
---|
26 | ..S WK=$S(DY<8:1,1:2)
|
---|
27 | ..S TOUR=$S(TYP'["W":1,+DAY(DY,"TOUR"):+DAY(DY,"TOUR"),1:+TOUR(WK))
|
---|
28 | ..D MOVE^PRS8AC
|
---|
29 | ..S N=DAY(DY,2),WK=$S(DY<8:1,1:2) ;exception node/week
|
---|
30 | ..I N["UN" S X1="UN" D 2 ;unavailable
|
---|
31 | ..I N["HX" S X1="HX" D 2 ;holiday excused
|
---|
32 | ..I N["ON" S X1="ON" D 2 ;on-call
|
---|
33 | ..I N["SB" S X1="SB" D 2 ;standby
|
---|
34 | ..; Process the scheduled tours
|
---|
35 | ..S N=DAY(DY,1),DH=DAY(DY,"DH1"),NN=1 D I DAY(DY,"TWO") S N=DAY(DY,4),DH=DAY(DY,"DH2"),NN=4 D
|
---|
36 | ...S QT=0 F PRS8=1:3 S V=$P(N,"^",PRS8,PRS8+2) Q:QT D
|
---|
37 | ....N PRS8AFFH S PRS8AFFH=0 ;fire fighter additional hours flag
|
---|
38 | ....S X=$P(DAY(DY,NN),"^",PRS8,999)
|
---|
39 | ....I X="" S QT=1 Q ;nothing left to check
|
---|
40 | ....I X?1"^"."^" S QT=1 Q ;only ^ left
|
---|
41 | ....;
|
---|
42 | ....; X = 9 is special tour CODE FOR FF ADDTL HRS.
|
---|
43 | ....; It gets converted to 'f'
|
---|
44 | ....S X=$P(V,"^",3),VAR=1 I X S VAR=$E("se1BC235f",+X) I '+VAR D ENT Q:Q
|
---|
45 | ....;if this segment is addt ff hrs then save a variable to signify
|
---|
46 | ....;that, but convert the time back to a 1 to use in the W node.
|
---|
47 | ....I "Ff"[TYP,VAR="f" S (PRS8AFFH,VAR)=1
|
---|
48 | ....;
|
---|
49 | ....I VAR,TYP'["W" S VAR=$S(VAR=5:5,1:1) ;only wg need shifts
|
---|
50 | ....S JURY=$G(^TMP($J,"PRS8",DY,2)) I JURY'="" D
|
---|
51 | .....F J=4,8,12,16,20,24,28 S:$P(JURY,"^",J)=6 JURY=1 Q
|
---|
52 | ....D ^PRS8AC ;build "W" node
|
---|
53 | ..; Process the exceptions
|
---|
54 | ..S N=DAY(DY,2),WK=$S(DY<8:1,1:2) ;exception node/week
|
---|
55 | ..S QT=0
|
---|
56 | ..; If there are Recess exceptions, process them first
|
---|
57 | ..I N["RS" D
|
---|
58 | ...; Since Recess will reduce hours worked in the week add P to TYP
|
---|
59 | ...I TYP'["P" S TYP=TYP_"P"
|
---|
60 | ...F PRS8=1:4:25 S V=$P(N,"^",PRS8,PRS8+3) Q:QT D
|
---|
61 | ....Q:$P(V,"^",3)='"RS"
|
---|
62 | ....I TYP["D",$P(V,"^",3)="" S QT=1 Q ;doctor
|
---|
63 | ....I TYP'["D",'+V,$P(V,"^",3)="" S QT=1 Q ;all others
|
---|
64 | ....S X=$P(V,"^",3)
|
---|
65 | ....I "^UN^ON^SB^HX^"'[("^"_X_"^") D ^PRS8EX
|
---|
66 | ...;
|
---|
67 | ...; Process all other types of exceptions
|
---|
68 | ..S QT=0
|
---|
69 | ..F PRS8=1:4:25 S V=$P(N,"^",PRS8,PRS8+3) Q:QT D
|
---|
70 | ...Q:$P(V,"^",3)="RS"
|
---|
71 | ...I TYP["D",$P(V,"^",3)="" S QT=1 Q ;doctor
|
---|
72 | ...I TYP'["D",'+V,$P(V,"^",3)="" S QT=1 Q ;all others
|
---|
73 | ...S X=$P(V,"^",3)
|
---|
74 | ...I "^UN^ON^SB^HX^"'[("^"_X_"^") D ^PRS8EX
|
---|
75 | ..;
|
---|
76 | ..S ^TMP($J,"PRS8",DY,"W")=DAY(DY,"W") ;save in ^TMP
|
---|
77 | ..S ^TMP($J,"PRS8",DY,"P")=DAY(DY,"P") ;save non-prem ot in ^TMP
|
---|
78 | ..S ^TMP($J,"PRS8",DY,"HOL")=DAY(DY,"HOL") ;holiday
|
---|
79 | ..S ^TMP($J,"PRS8",DY,"r")=DAY(DY,"r") ; Recess for 9mo AWS nurse
|
---|
80 | .S WK=$S(DAY<8:1,1:2),OFF=+DAY(DAY,"OFF") ;week/day off
|
---|
81 | .S TOUR=$S(TYP'["W":1,+DAY(DAY,"TOUR"):+DAY(DAY,"TOUR"),1:+TOUR(WK))
|
---|
82 | .I TYP["I",DAY>0,DAY<15,$G(DAY(DAY,"DWK")) D ;days worked
|
---|
83 | ..S DWK=DWK+1 ;count days worked
|
---|
84 | ..I CYA,DAY'<CYA S CAMISC=CAMISC+1 ;calendar year adjustment (CA)
|
---|
85 | .S MDY=+DAY D ^PRS8MT I +DAY=1 S MDY=0 D ^PRS8MT
|
---|
86 | .Q
|
---|
87 | ;
|
---|
88 | ;make DAY array available for prior, current, and next day
|
---|
89 | F DAY=1:1:14 D
|
---|
90 | .; I AWS Nurse check to see if hour counts need to be adjusted
|
---|
91 | .S WK=$S(DAY<8:1,1:2)
|
---|
92 | .; For each week, TYP should not contain "P" unless:
|
---|
93 | .; 36/40 AWS has NP or WP
|
---|
94 | .; 9mo AWS has Recess
|
---|
95 | .I +NAWS,(DAY=1!(DAY=8)) S TYP=$TR(TYP,"P","") D NAWS
|
---|
96 | .;
|
---|
97 | .K DAY(DAY-2)
|
---|
98 | .S LP=$S(DAY=1:"0,1,2",1:(DAY+1))
|
---|
99 | .F II=1:1 S DY=$P(LP,",",II) Q:DY="" D
|
---|
100 | ..F J=0,1,2,4,10,"CP","DH1","DH2","HOL","ML","MT1","MT2","OFF","P","TOUR","TWO","W","F","r" S DAY(DY,J)=$G(^TMP($J,"PRS8",DY,J))
|
---|
101 | .;
|
---|
102 | .S WK=$S(DAY<8:1,1:2),OFF=+DAY(DAY,"OFF") ;week/day off
|
---|
103 | .S TOUR=$S(TYP'["W":1,+DAY(DAY,"TOUR"):+DAY(DAY,"TOUR"),1:+TOUR(WK))
|
---|
104 | .;
|
---|
105 | .I ((TYP["I")!(TYP["P")),DAY>0,DAY<15 D ;FOR CY
|
---|
106 | ..I $S('CYA:1,DAY<CYA:1,1:0) Q ;quit if no calendar year adjustment
|
---|
107 | ..S IIX=0 I $E(ENT,2)'="D" F II=1:1:$L(DAY(DAY,"W")) D
|
---|
108 | ...I "4E"[$E(DAY(DAY,"W"),II) S IIX=IIX+1
|
---|
109 | ...S CYA2806=CYA2806+("ALSUMRVW1235OscXYFGD"[$E(DAY(DAY,"W"),II)) S:(IIX<33)&(FLX'="C"&(TH(WK)+IIX<163))!(FLX="C"&(TH+IIX<323)) CYA2806=CYA2806+("4E"[$E(DAY(DAY,"W"),II))
|
---|
110 | ...;SF2806 adjustment (CY) (163 & 323 because mt subtracted)
|
---|
111 | .;
|
---|
112 | .I CYA,DAY'<CYA,DAY(DAY,"W")["W" D ;count wop in hours for CA
|
---|
113 | ..F II=1:1:$L(DAY(DAY,"W")) S WPCYA=WPCYA+("W"=$E(DAY(DAY,"W"),II))
|
---|
114 | .;
|
---|
115 | .I TYP'["D",DAY(DAY,"W")'?1"0"."0" D ^PRS8PP ;nightdiff/shift premiums
|
---|
116 | .;
|
---|
117 | .F T=1:1:96 S VAR1=$E(DAY(DAY,"W"),T) S OK=0 D
|
---|
118 | ..I "BbCct"[VAR1 D ; process on-call/standby
|
---|
119 | ...I T=96!("BbCct"'[$E(DAY(DAY,"W"),T+1)) S OK=T
|
---|
120 | ...I DOUB D ^PRS8OC,^PRS8SB Q ;Prem. Pay of "W" or "V"
|
---|
121 | ...I VAR1'=""&("Cct"[VAR1) D ^PRS8OC Q ;compute on-call/2hr minimum
|
---|
122 | ...I "Bb"[VAR1 D ^PRS8SB ;standby
|
---|
123 | .I $G(SBY) D UP^PRS8SB
|
---|
124 | .;
|
---|
125 | .Q
|
---|
126 | ;
|
---|
127 | ;P 45 CODE O firefighters use PRS8MISC to calculated overtime
|
---|
128 | ;but code R and C firefighters use routine PRS8OTFF.
|
---|
129 | ;
|
---|
130 | I "Ff"[TYP&("RC"[PMP) D
|
---|
131 | . D ^PRS8OTFF
|
---|
132 | E D
|
---|
133 | . D ^PRS8MISC
|
---|
134 | K DH,DY,I,J,JURY,K,K1,LP,N,NN,OFF,PRS8L,TOUR,V,VAR,WG,X,Y,Y1
|
---|
135 | D ^PRS8WE ;Weekend premiums
|
---|
136 | D ^PRS8UP ;finish up Misc and non-time related activities
|
---|
137 | Q
|
---|
138 | ;
|
---|
139 | ENT ; --- check entitlement to activity for 1 node non-norm hrs
|
---|
140 | S Q=0
|
---|
141 | I '$E(ENT,$P("12^28^^29^26^^^29","^",+X)) S Q=1 ;entitlement string
|
---|
142 | ;PATCH 45: ADD CHECK FOR FIRE FIGHTER ADDITIONAL HOURS
|
---|
143 | ;SINCE THIS TYPE OF TIME IS NOT IN THE ENTITLEMENT TABLE
|
---|
144 | ;IT IS SET UP WITH TOUR IND. WITH CODE 9
|
---|
145 | I "Ff"[TYP,X=9 S Q=0
|
---|
146 | Q:X'=12 I TYP["W",TOUR>1,$E(ENT,11+TOUR) S Q=0
|
---|
147 | Q
|
---|
148 | ;
|
---|
149 | 2 ; --- get 2 node unavailable/oncall and standby
|
---|
150 | F PRS8=1:4:25 S V=$P(N,"^",PRS8,PRS8+2) Q:$P(V,"^",1)="" D
|
---|
151 | .S X=$P(V,"^",3) I X=X1 D ^PRS8EX
|
---|
152 | K PRS8,X,V
|
---|
153 | Q
|
---|
154 | ;
|
---|
155 | NAWS ; NAWS Nurse Alternate Work Schedules
|
---|
156 | ; If any NP or WP has been incurred for a nurse on the 36/40 AWS,
|
---|
157 | ; adjust their hours worked counts. 40 hrs/wk will now be used to
|
---|
158 | ; determine their qualification for OT and CT. Check piece 16 of
|
---|
159 | ; 0 node as NH will have been updated to 320 in PRS8SU.
|
---|
160 | ;
|
---|
161 | I +NAWS=36 D
|
---|
162 | .Q:$P(WK(WK),U,3)=""&($P(WK(WK),U,4)="")
|
---|
163 | .S TH(WK)=144-($P(WK(WK),U,3)+$P(WK(WK),U,4)) ; Adjust Total Hours per week
|
---|
164 | .S TH=TH(1)+TH(2) ; Adjust Total Hours per pay period
|
---|
165 | .S NH(WK)=144,NH=288 ; Adjust Normal Hours
|
---|
166 | .I TYP'["P" S TYP=TYP_"P" ; Make them into a PT employee
|
---|
167 | .S $E(ENT,2)=1 ; Make employee eligible for UN/US
|
---|
168 | ;
|
---|
169 | ; If any Recess has occurred for a nurse on the 9month AWS, adjust
|
---|
170 | ; their hours worked counts. These employees will be treated as PT
|
---|
171 | ; in determining the eligibility for OT/CT.
|
---|
172 | ;
|
---|
173 | I +NAWS=9 D
|
---|
174 | .Q:$P(WK(WK),U,48)=""
|
---|
175 | .S TH(WK)=TH(WK)-$P(WK(WK),U,48) ; Adjust total hours per week
|
---|
176 | .S TH=TH(1)+TH(2) ; Adjust Total Hours
|
---|
177 | .I TYP'["P" S TYP=TYP_"P" ; Adjust TYP to represent a PT employee
|
---|
178 | Q
|
---|