1 PACKAGE BODY per_gb_absence_rules AS
2 /* $Header: pegbabsr.pkb 120.8.12010000.5 2008/09/07 10:28:23 npershad ship $ */
3
4
5 -------------------------------------------------------------------------------
6 -- CHECK_ABS_OVERLAP
7 ---------------------------------------------------------------------------------
8 -- Bug 6708992
9 -- Procedure to raise error if overlapping absences of same type are present
10 PROCEDURE check_abs_overlap( p_person_id IN NUMBER
11 ,p_date_start IN DATE
12 ,p_date_end IN DATE
13 ,p_time_start IN VARCHAR2
14 ,p_time_end IN VARCHAR2
15 ,p_absence_attendance_id IN NUMBER
16 --,p_absence_attendance_type_id IN NUMBER) IS --Absence category instead of Absence type 6888892
17 ,p_absence_category IN VARCHAR2) IS
18
19 -- 6888892 Changed this cursor, so that the check is based on Absence Categories
20 cursor c_abs_overlap_another is
21 select 1
22 from per_absence_attendances abs, per_absence_attendance_types paat
23 where paat.absence_category = p_absence_category
24 and paat.absence_attendance_type_id = abs.absence_attendance_type_id
25 and abs.person_id = p_person_id
26 and (p_absence_attendance_id is null or
27 p_absence_attendance_id <> abs.absence_attendance_id)
28 and abs.date_start is not null
29 and p_date_start is not null
30 and ((
31 to_date(to_char(abs.date_start,'YYYY-MM-DD')|| ' ' ||
32 nvl(abs.time_start,'00:00'),'YYYY-MM-DD HH24:MI:SS')
33 between
34 to_date(to_char(p_date_start,'YYYY-MM-DD')|| ' ' ||
35 nvl(p_time_start,'00:00'),'YYYY-MM-DD HH24:MI:SS')
36 AND
37 to_date(to_char(nvl(p_date_end,hr_api.g_eot),'YYYY-MM-DD')|| ' ' ||
38 nvl(p_time_end,'23:59'),'YYYY-MM-DD HH24:MI:SS'))
39 OR
40 (
41 to_date(to_char(p_date_start,'YYYY-MM-DD')|| ' ' ||
42 nvl(p_time_start,'00:00'),'YYYY-MM-DD HH24:MI:SS')
43 between
44 to_date(to_char(abs.date_start,'YYYY-MM-DD')|| ' ' ||
45 nvl(abs.time_start,'00:00'),'YYYY-MM-DD HH24:MI:SS')
46 AND
47 to_date(to_char(nvl(abs.date_end,hr_api.g_eot),'YYYY-MM-DD')|| ' ' ||
48 nvl(abs.time_end,'23:59'),'YYYY-MM-DD HH24:MI:SS')
49 )
50 );
51
52 l_exists NUMBER ;
53 BEGIN
54 open c_abs_overlap_another;
55 fetch c_abs_overlap_another INTO l_exists;
56 if c_abs_overlap_another%found then
57 close c_abs_overlap_another;
58 hr_utility.set_message(804,'SSP_35084_SIMILAR_ABS_OVERLAP');
59 hr_utility.raise_error;
60 else
61 close c_abs_overlap_another;
62 end if ;
63 END check_abs_overlap;
64
65 --
66 --
67
68 PROCEDURE sickness_date_update
69 (p_absence_attendance_id IN NUMBER
70 ) IS
71 --
72 l_proc VARCHAR2(30) ;
73 --
74 CURSOR get_abs_category IS
75 SELECT paat.absence_category
76 FROM per_absence_attendance_types paat,
77 per_absence_attendances paa
78 WHERE paa.absence_attendance_id = p_absence_attendance_id
79 AND paa.absence_attendance_type_id = paat.absence_attendance_type_id;
80 --
81 l_abs_category per_absence_attendance_types.absence_category%TYPE;
82 --
83 BEGIN
84 --
85 -- Added for GSI Bug 5472781
86 --
87 IF hr_utility.chk_product_install('Oracle Human Resources', 'GB') THEN
88 --
89 l_proc := 'PER_GB_ABSENCE_RULES';
90
91 hr_utility.set_location('Entering:'|| l_proc, 10);
92 hr_utility.trace(l_proc||': Opening get_abs_category'||
93 ', p_absence_attendance_id='||p_absence_attendance_id);
94 --
95 -- Get absence_category
96 --
97 OPEN get_abs_category;
98 FETCH get_abs_category INTO l_abs_category;
99 CLOSE get_abs_category;
100 --
101 hr_utility.trace(l_proc||': Closed get_abs_category'||
102 ', l_abs_category='||l_abs_category);
103 --
104 --7157943 when this procedure is called from after delete hook l_abs_category will be NULL
105 --IF l_abs_category = 'S' THEN
106 IF nvl(l_abs_category,'S') = 'S' THEN
107 -- call recalculate_SSP_and_SMP to create/update stoppages and/or element entries.
108
109 ssp_smp_support_pkg.recalculate_SSP_and_SMP(p_deleting=>FALSE);
110
111 END IF;
112 --
113 END IF;
114 --
115 hr_utility.set_location('Leaving:'|| l_proc, 200);
116 --
117 END sickness_date_update;
118 --
119
120 -------------------------------------------------------------------------------
121 -- VALIDATE_ABS_CREATE
122 -------------------------------------------------------------------------------
123 PROCEDURE validate_abs_create(p_business_group_id IN NUMBER
124 ,p_person_id IN NUMBER
125 ,p_date_start IN DATE
126 ,p_date_end IN DATE -- Bug 6708992
127 ,p_time_start IN VARCHAR2 -- Bug 6708992
128 ,p_time_end IN VARCHAR2 -- Bug 6708992
129 ,p_absence_attendance_type_id IN NUMBER
130 ) IS
131
132 CURSOR get_abs_category IS
133 SELECT paat.absence_category
134 FROM per_absence_attendance_types paat
135 WHERE paat.absence_attendance_type_id = p_absence_attendance_type_id
136 AND paat.business_group_id = p_business_group_id;
137
138 CURSOR csr_absences
139 IS
140 SELECT 1
141 FROM per_absence_attendances PAA
142 WHERE PAA.person_id = p_person_id
143 and PAA.business_group_id = p_business_group_id
144 AND PAA.sickness_start_date is not null
145 AND p_date_start < (select max(ABS.sickness_start_date)
146 from per_absence_attendances ABS
147 where ABS.business_group_id = p_business_group_id
148 and ABS.person_id = p_person_id);
149
150 l_absence NUMBER;
151 l_abs_category per_absence_attendance_types.absence_category%TYPE;
152
153 BEGIN
154 --
155 -- Added for GSI Bug 5472781
156 --
157 IF hr_utility.chk_product_install('Oracle Human Resources', 'GB') THEN
158 --
159 -- Get absence_category
160 --
161 OPEN get_abs_category;
162 FETCH get_abs_category INTO l_abs_category;
163 CLOSE get_abs_category;
164 --
165 --
166 IF l_abs_category = 'S' THEN
167
168 OPEN csr_absences;
169 FETCH csr_absences INTO l_absence;
170 if csr_absences%found then
171 close csr_absences;
172 hr_utility.set_message(804,'SSP_35037_PIW_BROKEN');
173 hr_utility.raise_error;
174 else
175 close csr_absences;
176 end if;
177 END IF;
178
179 -- Bug 6708992
180 -- Raise error if overlapping absences of same type are present
181 -- Bug 6888892 begin
182 -- To check only in case below mentioned absence categories also
183 -- changed the check to be based on Absence Category
184 if l_abs_category in ('S','M','GB_ADO','GB_PAT_BIRTH','GB_PAT_ADO') then
185 check_abs_overlap( p_person_id, p_date_start, p_date_end
186 ,p_time_start, p_time_end, null
187 --,p_absence_attendance_type_id) ;
188 ,l_abs_category);
189 end if;
190 -- Bug 6888892 begin
191
192 END IF;
193
194 END validate_abs_create;
195
196 -------------------------------------------------------------------------------
197 -- VALIDATE_ABS_UPDATE
198 -------------------------------------------------------------------------------
199 PROCEDURE validate_abs_update(p_date_start IN DATE,
200 p_date_end IN DATE,
201 p_time_start IN VARCHAR2, -- Bug 6708992
202 p_time_end IN VARCHAR2, -- Bug 6708992
203 p_absence_attendance_id IN NUMBER) IS
204
205 cursor csr_abs_details is
206 select absence_attendance_type_id,
207 business_group_id,
208 person_id,
209 sickness_start_date,
210 sickness_end_date
211 --7287548 begin
212 ,date_start,time_start,date_end,time_end
213 --7287548 End
214 from per_absence_attendances
215 where absence_attendance_id = p_absence_attendance_id;
216
217 CURSOR get_abs_category(p_abs_type_id number,
218 p_bus_group number) IS
219 SELECT paat.absence_category
220 FROM per_absence_attendance_types paat
221 WHERE paat.absence_attendance_type_id = p_abs_type_id
222 AND paat.business_group_id = p_bus_group;
223
224 CURSOR csr_absences(p_person_id number,
225 p_business_group_id number,
226 p_start date)IS
227 SELECT 1
228 FROM per_absence_attendances PAA
229 WHERE PAA.person_id = p_person_id
230 and PAA.business_group_id = p_business_group_id
231 AND PAA.sickness_start_date is not null
232 AND PAA.sickness_start_date > p_start
233 AND PAA.absence_attendance_id <> p_absence_attendance_id;
234
235 l_absence number;
236 l_business_group_id number;
237 l_person_id number;
238 l_abs_type_id number;
239 l_param_start date;
240 l_current_start date;
241 l_current_end date;
242 l_abs_category per_absence_attendance_types.absence_category%TYPE;
243 --7287548 begin
244 l_date_start date;
245 l_time_start varchar2(5);
246 l_date_end date;
247 l_time_end varchar2(5);
248 v_date_start date;
249 v_time_start varchar2(5);
250 v_date_end date;
251 v_time_end varchar2(5);
252 --7287548 End
253
254 BEGIN
255 --
256 -- Added for GSI Bug 5472781
257 --
258 IF hr_utility.chk_product_install('Oracle Human Resources', 'GB') THEN
259 -- Get absence details
260 open csr_abs_details;
261 fetch csr_abs_details into l_abs_type_id,
262 l_business_group_id,
263 l_person_id,
264 l_current_start,
265 l_current_end
266 --7287548 begin
267 ,l_date_start
268 ,l_time_start
269 ,l_date_end
270 ,l_time_end;
271 --7287548 End
272 close csr_abs_details;
273 --
274 -- Check if default date is passed in for start/end date
275 -- logic
276 -- if not updating start or end date then skip
277 -- if not updating start or end date, but date is pass in then skip
278 -- if updating start/end and exists a future absence then error
279 if trunc(p_date_start) = trunc(hr_api.g_date) and
280 trunc(p_date_end) = trunc(hr_api.g_date) then
281 -- not updating sickness start/end date so skip
282 null;
283 else
284 if trunc(l_current_start) = trunc(p_date_start) and
285 trunc(l_current_end) = trunc(p_date_end) then
286 -- not updating sickness start/end date so skip
287 null;
288 else
289 -- going to update start or end date, check for future absence
290 -- Get absence_category
291 --
292 OPEN get_abs_category(l_abs_type_id, l_business_group_id);
293 FETCH get_abs_category INTO l_abs_category;
294 CLOSE get_abs_category;
295 --
296 --
297 IF l_abs_category = 'S' THEN
298 if trunc(p_date_start) = trunc(hr_api.g_date) then
299 l_param_start := trunc(l_current_start);
300 else
301 l_param_start := trunc(p_date_start);
302 end if;
303 OPEN csr_absences(l_person_id, l_business_group_id,l_param_start);
304 FETCH csr_absences INTO l_absence;
305 if csr_absences%found then
306 close csr_absences;
307 hr_utility.set_message(804,'SSP_35037_PIW_BROKEN');
308 hr_utility.raise_error;
309 else
310 close csr_absences;
311 end if;
312 END IF;
313 end if;
314 end if;
315
316 --7287548 begin
317 If (p_date_start = hr_api.g_date) then
318 hr_utility.trace(' p_date_start value is defaulted '||p_date_start||' Repl by'||l_date_start);
319 v_date_start := l_date_start;
320 else
321 v_date_start := p_date_start;
322 End If;
323
324 If (p_date_end = hr_api.g_date) then
325 hr_utility.trace(' p_date_end value is defaulted '||p_date_end||' Repl by'||l_date_end);
326 v_date_end := l_date_end;
327 else
328 v_date_end := p_date_end;
329 End If;
330
331 If (p_time_start = hr_api.g_varchar2) then
332 hr_utility.trace(' p_time_start value is defaulted '||p_time_start||' Repl by'||l_time_start);
333 v_time_start := l_time_start;
334 else
335 v_time_start := p_time_start;
336 End If;
337
338 If (p_time_end = hr_api.g_varchar2) then
339 hr_utility.trace(' p_time_end value is defaulted '||p_time_end||' Repl by'||l_time_end);
340 v_time_end := l_time_end;
341 else
342 v_time_end := p_time_end;
343 End If;
344
345 --7287548 end
346
347
348 -- Bug 6708992
349 -- Raise error if overlapping absences of same type are present
350 -- Bug 6888892 begin
351 -- To check only in case below mentioned absence categories also
352 -- changed the check to be based on Absence Category
353 if l_abs_category in ('S','M','GB_ADO','GB_PAT_BIRTH','GB_PAT_ADO') then
354 check_abs_overlap( l_person_id, v_date_start, v_date_end
355 ,v_time_start, v_time_end, p_absence_attendance_id
356 -- ,l_abs_type_id) ;
357 ,l_abs_category);
358 end if;
359 -- Bug 6888892 begin
360
361 END IF;
362 END validate_abs_update;
363
364 -------------------------------------------------------------------------------
365 -- VALIDATE_ABS_DELETE
366 -------------------------------------------------------------------------------
367 PROCEDURE validate_abs_delete(p_absence_attendance_id IN NUMBER
368 ) IS
369
370
371
372 CURSOR get_abs_category IS
373 SELECT paat.absence_category
374 FROM per_absence_attendance_types paat,
375 per_absence_attendances paa
376 WHERE paa.absence_attendance_id = p_absence_attendance_id
377 AND paa.absence_attendance_type_id = paat.absence_attendance_type_id;
378
379
380 CURSOR csr_absences IS
381 SELECT 1
382 FROM per_absence_attendances PAA
383 WHERE PAA.absence_attendance_id = p_absence_attendance_id
384 AND PAA.sickness_start_date is not null
385 AND PAA.sickness_start_date < (select max(ABS.sickness_start_date)
386 from per_absence_attendances ABS
387 where ABS.person_id =PAA.person_id);
388
389 l_absence NUMBER;
390 l_abs_category per_absence_attendance_types.absence_category%TYPE;
391
392 --
393 BEGIN
394 --
395 -- Added for GSI Bug 5472781
396 --
397 IF hr_utility.chk_product_install('Oracle Human Resources', 'GB') THEN
398 --
399 -- Get absence_category
400 --
401 OPEN get_abs_category;
402 FETCH get_abs_category INTO l_abs_category;
403 CLOSE get_abs_category;
404
405
406 IF l_abs_category = 'S' THEN
407
408 OPEN csr_absences;
409 FETCH csr_absences INTO l_absence;
410 if csr_absences%found then
411 close csr_absences;
412 hr_utility.set_message(804,'SSP_35037_PIW_BROKEN');
413 hr_utility.raise_error;
414 else
415 close csr_absences;
416 end if;
417 END IF;
418 END IF;
419 END validate_abs_delete;
420 --
421 END per_gb_absence_rules;