[Home] [Help]
PACKAGE BODY: APPS.HXT_TIME_CLOCK
Source
1 PACKAGE BODY HXT_TIME_CLOCK AS
2 /* $Header: hxttclk.pkb 120.0 2005/05/29 05:58:03 appldev noship $ */
3
4 FUNCTION get_time_period(i_payroll_id IN NUMBER,
5 i_date_worked IN DATE,
6 o_time_period OUT NOCOPY NUMBER,
7 o_start_date OUT NOCOPY DATE,
8 o_end_date OUT NOCOPY DATE)RETURN NUMBER;
9 FUNCTION check_for_timecard(i_person_id IN NUMBER,
10 i_time_period_id IN NUMBER,
11 o_timecard_id OUT NOCOPY NUMBER,
12 o_auto_gen_flag OUT NOCOPY VARCHAR2)RETURN NUMBER;
13 FUNCTION create_timecard(i_person_id IN NUMBER,
14 i_assignment_id IN NUMBER,
15 i_payroll_id IN NUMBER,
16 i_time_period_id IN NUMBER,
17 o_timecard_id OUT NOCOPY NUMBER)RETURN NUMBER;
18 FUNCTION create_batch( i_source IN VARCHAR2,
19 i_payroll_id IN NUMBER,
20 i_time_period_id IN NUMBER,
21 i_assignment_id IN NUMBER,
22 i_person_id IN NUMBER,
23 o_batch_id OUT NOCOPY NUMBER) RETURN NUMBER;
24 --BEGIN SIR343
25 --FUNCTION find_existing_batch(o_batch_id OUT NUMBER)RETURN NUMBER;
26 FUNCTION find_existing_batch(i_payroll_id IN NUMBER,
27 i_time_period_id IN NUMBER,
28 o_batch_id OUT NOCOPY NUMBER)RETURN NUMBER;
29 --END SIR343
30 FUNCTION create_holiday_hours( i_person_id IN NUMBER,
31 i_hcl_id IN NUMBER,
32 i_hxt_rotation_plan IN NUMBER, --SIR344
33 i_start_date IN DATE,
34 i_end_date IN DATE,
35 i_timecard_id IN NUMBER,
36 i_assignment_id IN NUMBER)RETURN NUMBER;
37 FUNCTION record_hours_worked( b_generate_holiday IN BOOLEAN,
38 i_timecard_id IN NUMBER,
39 i_assignment_id IN NUMBER,
40 i_person_id IN NUMBER,
41 i_date_worked IN DATE,
42 i_element_id IN NUMBER,
43 i_hours IN NUMBER,
44 i_start_time IN DATE,
45 i_end_time IN DATE,
46 i_start_date IN DATE)RETURN NUMBER;
47 PROCEDURE record_time( employee_number IN VARCHAR2,
48 assignment_id IN NUMBER,
49 start_time IN DATE,
50 end_time IN DATE,
51 ret_code OUT NOCOPY NUMBER,
52 err_buf OUT NOCOPY VARCHAR2)IS
53 l_person_id per_people_f.person_id%TYPE DEFAULT NULL;
54 l_last_name per_people_f.last_name%TYPE DEFAULT NULL;
55 l_first_name per_people_f.first_name%TYPE DEFAULT NULL;
56 l_bus_grp_id per_assignments_f.business_group_id%TYPE DEFAULT NULL;
57 l_timecard_id hxt_timecards.id%TYPE DEFAULT NULL;
58 l_date_worked DATE DEFAULT NULL;
59 l_time_period_id per_time_periods.time_period_id%TYPE DEFAULT NULL;
60 l_start_date DATE DEFAULT NULL;
61 l_end_date DATE DEFAULT NULL;
62 l_auto_gen_flag hxt_timecards.auto_gen_flag%TYPE DEFAULT NULL;
63 l_timecard_exists BOOLEAN DEFAULT TRUE;
64 l_hours NUMBER DEFAULT NULL;
65 l_person_id_data_err EXCEPTION;
66 l_person_id_sys_err EXCEPTION;
67 l_assign_id_data_err EXCEPTION;
68 l_assign_id_sys_err EXCEPTION;
69 l_pay_date_data_err EXCEPTION;
70 l_pay_date_sys_err EXCEPTION;
71 l_time_per_data_err EXCEPTION;
72 l_time_per_sys_err EXCEPTION;
73 l_istimecard_sys_err EXCEPTION;
74 l_make_card_data_err EXCEPTION;
75 l_make_card_sys_err EXCEPTION;
76 l_make_hol_data_err EXCEPTION;
77 l_make_hol_sys_err EXCEPTION;
78 l_autogen_error EXCEPTION;
79 l_rec_hours_data_err EXCEPTION;
80 l_rec_hours_sys_err EXCEPTION;
81 l_retcode NUMBER DEFAULT 0;
82 l_error_text VARCHAR2(240) DEFAULT NULL;
83 l_exists VARCHAR2(1);
84 CURSOR l_employee_cur(c_person_id NUMBER) IS
85 SELECT asm.payroll_id,
86 asm.assignment_id,
87 asm.business_group_id, --GLOBAL
88 asm.effective_start_date,
89 asm.effective_end_date,
90 aeiv.hxt_rotation_plan, --SIR344
91 egp.hcl_id
92 FROM hxt_earning_policies egp,
93 --ORACLE per_assignments_f_dfv asmv,
94 hxt_per_aei_ddf_v aeiv,--ORACLE
95 per_assignment_status_types ast,
96 per_assignments_f asm
97 WHERE c_person_id = asm.person_id
98 AND ast.assignment_status_type_id = asm.assignment_status_type_id
99 AND ast.pay_system_status = 'P' -- Check payroll status
100 --ORACLE AND asmv.row_id = asm.rowid
101 AND aeiv.assignment_id = asm.assignment_id --ORACLE
102 AND l_date_worked BETWEEN aeiv.effective_start_date /* GLOBAL */
103 AND aeiv.effective_end_date /* GLOBAL */
104 /*GLOBAL AND aeiv.information_type = 'HXT_ASS_INFO' --ORACLE */
105 --ORACLE AND egp.id(+) = asmv.hxt_earning_policy;
106 AND egp.id(+) = aeiv.hxt_earning_policy; --ORACLE
107 l_emp_rec l_employee_cur%ROWTYPE;
108 --
109 -- Fassadi 25/OCT/00 Get the Bug_id for the get_person_id procedure.
110 --
111 Cursor l_bus_grp_cur ( p_asg_id NUMBER ) is
112 select business_group_id
113 from per_assignments_f asm
114 where asm.assignment_id = p_asg_id;
115
116 --this to fix bug 756293
117 --
118 cursor C_session_exists is
119 select 'Y'
120 from fnd_sessions
121 where session_id = userenv('sessionid')
122 and trunc(effective_date) = trunc(sysdate);
123 --
124 --
125 BEGIN
126 /*Obtain date worked from user exit*/
127
128 -- Before anything insert a row in fdn_sessions.
129 -- fix for bug 756293
130 open C_session_exists;
131 fetch C_session_exists into l_exists;
132 if C_session_exists%notfound then
133 insert into fnd_sessions
134 (effective_date, session_id)
135 values (sysdate, userenv('sessionid'));
136 HXT_UTIL.DEBUG('Inserted a row in fnd session '); --HXT115
137 end if;
138 close C_session_exists;
139 --
140 -- End of fix for bug 756293
141
142 --
143 l_retcode := hxt_clock_user_edits.determine_pay_date( start_time,
144 end_time,
145 l_person_id,
146 l_date_worked);
147 HXT_UTIL.DEBUG('determine_pay_date returns: '|| fnd_date.date_to_chardate(l_date_worked));--DEBUG ONLY --FORMS60 --HXT115
148 IF l_retcode = 1 THEN
149 RAISE l_pay_date_data_err;
150 ELSIF l_retcode = 2 THEN
151 RAISE l_pay_date_sys_err;
152 END IF;
153 --
154 -- Get the bus_grp_id to pass it to the get_person_id procedure.
155 --
156 BEGIN
157 OPEN l_bus_grp_cur ( assignment_id );
158 FETCH l_bus_grp_cur INTO l_bus_grp_id;
159 CLOSE l_bus_grp_cur;
160 EXCEPTION
161 WHEN NO_DATA_FOUND THEN
162 l_retcode := 1;
163 RAISE l_assign_id_data_err;
164 WHEN OTHERS THEN
165 l_retcode := 2;
166 RAISE l_assign_id_sys_err;
167 END;
168 --
169 /* Obtain person id from user exit */
170 l_retcode := hxt_clock_user_edits.get_person_id(employee_number,
171 l_bus_grp_id,
172 l_date_worked,
173 l_person_id,
174 l_last_name,
175 l_first_name);
176 HXT_UTIL.DEBUG('get_person_id returns: '|| TO_CHAR(l_retcode));--DEBUG ONLY --HXT115
177 IF l_retcode = 1 THEN
178 RAISE l_person_id_data_err;
179 ELSIF l_retcode = 2 THEN
180 RAISE l_person_id_sys_err;
181 END IF;
182 --
183 /* Obtain vital employee information*/
184 BEGIN
185 HXT_UTIL.DEBUG('Opening Cursor');--DEBUG ONLY --HXT115
186 OPEN l_employee_cur(l_person_id);
187 HXT_UTIL.DEBUG('Fetching Cursor');--DEBUG ONLY --HXT115
188 FETCH l_employee_cur
189 INTO l_emp_rec;
190 HXT_UTIL.DEBUG('Closing Cursor');--DEBUG ONLY --HXT115
191 CLOSE l_employee_cur;
192 g_bus_group_id := l_emp_rec.business_group_id; --GLOBAL
193 EXCEPTION
194 WHEN NO_DATA_FOUND THEN
195 l_retcode := 1;
196 RAISE l_assign_id_data_err;
197 WHEN OTHERS THEN
198 l_retcode := 2;
199 RAISE l_assign_id_sys_err;
200 END;
201 --DEBUG ONLY BEGIN
202 HXT_UTIL.DEBUG('Payroll id : '||TO_CHAR(l_emp_rec.payroll_id)); --HXT115
203 HXT_UTIL.DEBUG('Assignment id: '||TO_CHAR(l_emp_rec.assignment_id)); --HXT115
204 HXT_UTIL.DEBUG('Business Group id: '||TO_CHAR(l_emp_rec.business_group_id)); --GLOBAL
205 HXT_UTIL.DEBUG('Effective Start Date: '||fnd_date.date_to_chardate(l_emp_rec.effective_start_date)); --FORMS60 --HXT115
206 HXT_UTIL.DEBUG('Effective End Date: '||fnd_date.date_to_chardate(l_emp_rec.effective_end_date)); --FORMS60 --HXT115
207 HXT_UTIL.DEBUG('hcl_id: '||TO_CHAR(l_emp_rec.hcl_id)); --HXT115
208 HXT_UTIL.DEBUG('hxt_rotation_plan: '||l_emp_rec.hxt_rotation_plan); --SIR344 --HXT115
209 --DEBUG ONLY END
210 --
211 /*Obtain the current time period id for this payroll and date*/
212 l_retcode := get_time_period( l_emp_rec.payroll_id,
213 l_date_worked,
214 l_time_period_id,
215 l_start_date,
216 l_end_date);
217 HXT_UTIL.DEBUG('get_time_period returns period: '|| --HXT115
218 TO_CHAR(l_time_period_id)|| ' start date: '||
219 fnd_date.date_to_chardate(l_start_date)|| ' end date: '|| -- FORMS60
220 fnd_date.date_to_chardate(l_end_date));--DEBUG ONLY --FORMS60
221 IF l_retcode = 1 THEN
222 RAISE l_time_per_data_err;
223 ELSIF l_retcode = 2 THEN
224 RAISE l_time_per_data_err;
225 END IF;
226 g_time_period_err_id := l_time_period_id;
227 --
228 /*Determine effective start date*/
229 IF l_emp_rec.effective_start_date > l_start_date THEN
230 l_start_date := l_emp_rec.effective_start_date;
231 END IF;
232 IF l_emp_rec.effective_end_date < l_end_date THEN
233 l_end_date := l_emp_rec.effective_end_date;
234 END IF;
235 --
236 /*Check for an existing timecard */
237 l_retcode := check_for_timecard(l_person_id, l_time_period_id, l_timecard_id, l_auto_gen_flag);
238 HXT_UTIL.DEBUG('check_for_timecard returns timecard id: '|| TO_CHAR(l_timecard_id));--DEBUG ONLY --HXT115
239 --
240 IF l_retcode = 0 THEN
241 g_timecard_err_id := l_timecard_id;
242 ELSIF l_retcode = 1 THEN
243 /*Create a timecard when none exists*/
244 l_retcode := create_timecard(l_person_id,
245 l_emp_rec.assignment_id,
246 l_emp_rec.payroll_id,
247 l_time_period_id,
248 l_timecard_id);
249 IF l_retcode = 1 THEN
250 RAISE l_make_card_data_err;
251 ELSIF l_retcode = 2 THEN
252 RAISE l_make_card_sys_err;
253 END IF;
254 g_timecard_err_id := l_timecard_id;
255 /*Create holiday hours on the new timecard*/
256 HXT_UTIL.DEBUG('Now generating holidays'); --HXT115
257 l_retcode := create_holiday_hours(l_person_id,
258 l_emp_rec.hcl_id,
259 l_emp_rec.hxt_rotation_plan, --SIR344
260 l_start_date,
261 l_end_date,
262 l_timecard_id,
263 l_emp_rec.assignment_id);
264 IF l_retcode = 1 THEN
265 RAISE l_make_hol_data_err;
266 ELSIF l_retcode = 2 THEN
267 RAISE l_make_hol_sys_err;
268 END IF;
269 ELSIF l_retcode = 2 THEN
270 RAISE l_istimecard_sys_err;
271 END IF;
272 HXT_UTIL.DEBUG('Hours will be charged to Timecard id: '||TO_CHAR(l_timecard_id));--DEBUG ONLY --HXT115
273 --
274 /*Check to see if pre-existing timecards were autogened*/
275 IF l_auto_gen_flag = 'A' THEN
276 RAISE l_autogen_error;
277 END IF;
278 --
279 /*Calculate the hours worked*/
280 l_hours := 24 * (TRUNC(end_time,'MI') - TRUNC(start_time,'MI'));
281 HXT_UTIL.DEBUG('Hours worked: '||TO_CHAR(l_hours));--DEBUG ONLY --HXT115
282 /*Insert hours to the hxt_hours_worked table and call generate details*/
283 l_retcode := record_hours_worked( FALSE,
284 l_timecard_id,
285 l_emp_rec.assignment_id,
286 l_person_id,
287 l_date_worked,
288 NULL,
289 l_hours,
290 start_time,
291 end_time,
292 l_start_date);
293 IF l_retcode = 1 THEN
294 RAISE l_rec_hours_data_err;
295 ELSIF l_retcode = 2 THEN
296 RAISE l_rec_hours_sys_err;
297 END IF;
298 ret_code := 0;
299 --HXT11err_buf := 'Successful Completion. Time has posted.';
300 FND_MESSAGE.SET_NAME('HXT','HXT_39400_TIME_POSTED'); -- HXT11
301 err_buf := FND_MESSAGE.GET; -- HXT11
302 FND_MESSAGE.CLEAR; -- HXT11
303
304 RETURN;
305 EXCEPTION
306 WHEN l_person_id_data_err THEN
307 ret_code := l_retcode;
308 --HXT11err_buf := 'Data Error: Query Error Form for ACLOCK';
309 FND_MESSAGE.SET_NAME('HXT','HXT_39401_QRY_ERR_DATA'); -- HXT11
310 err_buf := FND_MESSAGE.GET; -- HXT11
311 FND_MESSAGE.CLEAR; -- HXT11
312
313 --HXT11l_error_text := 'No Employee was located for Employee Number ' || employee_number;
314 FND_MESSAGE.SET_NAME('HXT','HXT_39308_EMPLYEE_NF'); -- HXT11
315 FND_MESSAGE.SET_TOKEN('EMP_NUMBER', employee_number); --HXT11
316 l_retcode := log_clock_errors(FALSE, NULL,'EMPL', NULL);
317 RETURN;
318
319 WHEN l_person_id_sys_err THEN
320 ret_code := l_retcode;
321 --HXT11err_buf := 'Sys. Error: Query Error Form for ACLOCK';
322 FND_MESSAGE.SET_NAME('HXT','HXT_39402_QRY_ERR_SYS'); -- HXT11
323 err_buf := FND_MESSAGE.GET; -- HXT11
324 FND_MESSAGE.CLEAR; -- HXT11
325
326 --HXT11l_error_text := 'System Error occurred while attempting to access Employee Data.' ||
327 --HXT11'Employee Number ' || employee_number ||
328 --HXT11'Function hxt_clock_user_edits.get_person_id';
329 FND_MESSAGE.SET_NAME('HXT','HXT_39308_EMPLYEE_NF'); -- HXT11
330 FND_MESSAGE.SET_TOKEN('EMP_NUMBER', employee_number); --HXT11
331 l_retcode := log_clock_errors(FALSE, NULL,'EMPL', SQLERRM);
332 RETURN;
333
334 WHEN l_assign_id_data_err THEN
335 ret_code := l_retcode;
336 --HXT11err_buf := 'Data Error: Query Error Form for ACLOCK';
337 FND_MESSAGE.SET_NAME('HXT','HXT_39401_QRY_ERR_DATA'); -- HXT11
338 err_buf := FND_MESSAGE.GET; -- HXT11
339 FND_MESSAGE.CLEAR; -- HXT11
340
341 --HXT11l_error_text := 'No Assignment was located for '||l_first_name||' '||l_last_name||
342 --HXT11 '(Employee Number: '|| employee_number ||').';
343 FND_MESSAGE.SET_NAME('HXT','HXT_39306_ASSIGN_NF'); -- HXT11
344 FND_MESSAGE.SET_TOKEN('FIRST_NAME', l_first_name); --HXT11
345 FND_MESSAGE.SET_TOKEN('LAST_NAME', l_last_name); --HXT11
346 FND_MESSAGE.SET_TOKEN('EMP_NUMBER', employee_number); --HXT11
347 l_retcode := log_clock_errors(FALSE, NULL,'EMPL', NULL);
348 RETURN;
349
350 WHEN l_assign_id_sys_err THEN
351 ret_code := l_retcode;
352 --HXT11err_buf := 'Sys. Error: Query Error Form for ACLOCK';
353 FND_MESSAGE.SET_NAME('HXT','HXT_39402_QRY_ERR_SYS'); -- HXT11
354 err_buf := FND_MESSAGE.GET; -- HXT11
355 FND_MESSAGE.CLEAR; -- HXT11
356
357 --HXT11l_error_text := 'System Error occurred atempting to Fetch Assignment.';
358 FND_MESSAGE.SET_NAME('HXT','HXT_39319_ERR_GET_ASSIGN'); -- HXT11
359 l_retcode := log_clock_errors(FALSE, NULL,'EMPL', SQLERRM);
360 RETURN;
361
362 WHEN l_pay_date_data_err THEN
363 ret_code := l_retcode;
364 --HXT11err_buf := 'Data Error: Query Error Form for ACLOCK';
365 FND_MESSAGE.SET_NAME('HXT','HXT_39401_QRY_ERR_DATA'); -- HXT11
366 err_buf := FND_MESSAGE.GET; -- HXT11
367 FND_MESSAGE.CLEAR; -- HXT11
368
369 --HXT11l_error_text := 'Unable to determine date worked from user exit. Start time: ' || TO_CHAR(start_time);
370 FND_MESSAGE.SET_NAME('HXT','HXT_39331_CANT_CALC_DAT_WRKED'); -- HXT11
371 FND_MESSAGE.SET_TOKEN('START_TIME', TO_CHAR(start_time)); --HXT11
372 l_retcode := log_clock_errors(FALSE, NULL,'EMPL', NULL);
373 RETURN;
374
375 WHEN l_pay_date_sys_err THEN
376 ret_code := l_retcode;
377 --HXT11err_buf := 'Sys. Error: Query Error Form for ACLOCK';
378 FND_MESSAGE.SET_NAME('HXT','HXT_39402_QRY_ERR_SYS'); -- HXT11
379 err_buf := FND_MESSAGE.GET; -- HXT11
380 FND_MESSAGE.CLEAR; -- HXT11
381
382 --HXT11l_error_text := 'System error occurred while attempting to determine date worked.';
383 FND_MESSAGE.SET_NAME('HXT','HXT_39323_ERR_DATE_WRKED'); -- HXT11
387 WHEN l_time_per_data_err THEN
384 l_retcode := log_clock_errors(FALSE, NULL,'EMPL', SQLERRM);
385 RETURN;
386
388 ret_code := l_retcode;
389 --HXT11err_buf := 'Data Error: Query Error Form for ACLOCK';
390 FND_MESSAGE.SET_NAME('HXT','HXT_39401_QRY_ERR_DATA'); -- HXT11
391 err_buf := FND_MESSAGE.GET; -- HXT11
392 FND_MESSAGE.CLEAR; -- HXT11
393
394 --HXT11l_error_text := 'Unable to determine a time period for date worked of: '||TO_CHAR(l_date_worked)||
395 --HXT11' Payroll: '|| TO_CHAR(l_emp_rec.payroll_id);
396 FND_MESSAGE.SET_NAME('HXT','HXT_39330_CANT_CALC_TIM_PER'); -- HXT11
397 FND_MESSAGE.SET_TOKEN('DATE_WORKED', fnd_date.date_to_chardate(l_date_worked)); --HXT11 --FORMS60
398 FND_MESSAGE.SET_TOKEN('PAYROLL', TO_CHAR(l_emp_rec.payroll_id)); --HXT11
399 l_retcode := log_clock_errors(FALSE, NULL,'EMPL', NULL);
400 RETURN;
401
402 WHEN l_time_per_sys_err THEN
403 ret_code := l_retcode;
404 --HXT11err_buf := 'Sys. Error: Query Error Form for ACLOCK';
405 FND_MESSAGE.SET_NAME('HXT','HXT_39402_QRY_ERR_SYS'); -- HXT11
406 err_buf := FND_MESSAGE.GET; -- HXT11
407 FND_MESSAGE.CLEAR; -- HXT11
408
409 --HXT11l_error_text := 'System error occurred while attempting to obtain time period. ' || SQLERRM;
410 FND_MESSAGE.SET_NAME('HXT','HXT_39324_ERR_TIME_PERIOD'); -- HXT11
411 FND_MESSAGE.SET_TOKEN('SQLERR', SQLERRM); --HXT11
412 l_retcode := log_clock_errors(FALSE, NULL,'EMPL', NULL);
413 RETURN;
414
415 WHEN l_istimecard_sys_err THEN
416 ret_code := l_retcode;
417 --HXT11err_buf := 'Sys. Error: Query Error Form for ACLOCK';
418 FND_MESSAGE.SET_NAME('HXT','HXT_39402_QRY_ERR_SYS'); -- HXT11
419 err_buf := FND_MESSAGE.GET; -- HXT11
420 FND_MESSAGE.CLEAR; -- HXT11
421
422 --HXT11l_error_text := 'Error occurred while checking for an existing timecard. ';
423 FND_MESSAGE.SET_NAME('HXT','HXT_39298_ERR_GET_TIMCARD'); -- HXT11
424 l_retcode := log_clock_errors(FALSE, NULL,'TIM', SQLERRM);
425 RETURN;
426
427 WHEN l_autogen_error THEN
428 ret_code := l_retcode;
429 --HXT11err_buf := 'Data Error: Query Error Form for ACLOCK';
430 FND_MESSAGE.SET_NAME('HXT','HXT_39401_QRY_ERR_DATA'); -- HXT11
431 err_buf := FND_MESSAGE.GET; -- HXT11
432 FND_MESSAGE.CLEAR; -- HXT11
433
434 --HXT11l_error_text := 'An autogen timecard exists for '||l_first_name||' '||l_last_name||
435 --HXT11' (Employee: '|| employee_number ||').'||
436 --HXT11' Autogen timecards may not accept time from a timeclock.';
437 FND_MESSAGE.SET_NAME('HXT','HXT_39267_AG_TCARD_EXISTS'); -- HXT11
438 FND_MESSAGE.SET_TOKEN('FIRST_NAME', l_first_name); --HXT11
439 FND_MESSAGE.SET_TOKEN('LAST_NAME', l_last_name); --HXT11
440 FND_MESSAGE.SET_TOKEN('EMP_NUMBER', employee_number); --HXT11
441 l_retcode := log_clock_errors(TRUE, NULL,'TIM', NULL);
442 RETURN;
443
444 WHEN l_make_card_data_err THEN
445 ret_code := l_retcode;
446 --HXT11err_buf := 'Data Error: Query Error Form for ACLOCK';
447 FND_MESSAGE.SET_NAME('HXT','HXT_39401_QRY_ERR_DATA'); -- HXT11
448 err_buf := FND_MESSAGE.GET; -- HXT11
449 FND_MESSAGE.CLEAR; -- HXT11
450
451 --HXT11l_error_text := 'Data Error during create timecard processing for '||
452 --HXT11l_first_name||' '||l_last_name||' (Employee: '|| employee_number ||').';
453 FND_MESSAGE.SET_NAME('HXT','HXT_39291_CRT_TCARD_ERR'); -- HXT11
454 FND_MESSAGE.SET_TOKEN('FIRST_NAME', l_first_name); --HXT11
455 FND_MESSAGE.SET_TOKEN('LAST_NAME', l_last_name); --HXT11
456 FND_MESSAGE.SET_TOKEN('EMP_NUMBER', employee_number); --HXT11
457 l_retcode := log_clock_errors(FALSE, NULL,'TIM', NULL);
458 RETURN;
459
460 WHEN l_make_card_sys_err THEN
461 ret_code := l_retcode;
462 --HXT11err_buf := 'Sys. Error: Query Error Form for ACLOCK';
463 FND_MESSAGE.SET_NAME('HXT','HXT_39402_QRY_ERR_SYS'); -- HXT11
464 err_buf := FND_MESSAGE.GET; -- HXT11
465 FND_MESSAGE.CLEAR; -- HXT11
466
467 --HXT11l_error_text := 'System error during create timecard processing for '||
468 --HXT11 l_first_name||' '||l_last_name||' (Employee: '|| employee_number ||').';
469 FND_MESSAGE.SET_NAME('HXT','HXT_39318_ERR_CREAT_TCARD'); -- HXT11
470 FND_MESSAGE.SET_TOKEN('FIRST_NAME', l_first_name); --HXT11
471 FND_MESSAGE.SET_TOKEN('LAST_NAME', l_last_name); --HXT11
472 FND_MESSAGE.SET_TOKEN('EMP_NUMBER', employee_number); --HXT11
473 l_retcode := log_clock_errors(FALSE, NULL,'TIM', SQLERRM);
474 RETURN;
475
476 WHEN l_make_hol_data_err THEN
477 ret_code := l_retcode;
478 --HXT11err_buf := 'Data Error: Query timecard for'|| TO_CHAR(l_date_worked); --SIR149
479 FND_MESSAGE.SET_NAME('HXT','HXT_39404_QRY_DAT_TOK'); -- HXT11
480 FND_MESSAGE.SET_TOKEN('1', fnd_date.date_to_chardate(l_date_worked)); --HXT11 --SIR149 --FORMS60
481 err_buf := FND_MESSAGE.GET; -- HXT11
482 FND_MESSAGE.CLEAR; -- HXT11
483
484 --HXT11l_error_text := 'Data error occurred during create holiday hours processing for '||
485 --HXT11 l_first_name||' '||l_last_name||' (Employee: '|| employee_number ||').';
486 FND_MESSAGE.SET_NAME('HXT','HXT_39292_CRT_HOL_HRS'); -- HXT11
487 FND_MESSAGE.SET_TOKEN('FIRST_NAME', l_first_name); --HXT11
488 FND_MESSAGE.SET_TOKEN('LAST_NAME', l_last_name); --HXT11
489 FND_MESSAGE.SET_TOKEN('EMP_NUMBER', employee_number); --HXT11
490 l_retcode := log_clock_errors(TRUE, NULL,'HOL', NULL);
494 ret_code := l_retcode;
491 RETURN;
492
493 WHEN l_make_hol_sys_err THEN
495 --HXT11err_buf := 'Sys. Error: Query timecard for'|| TO_CHAR(l_date_worked); --SIR149
496 FND_MESSAGE.SET_NAME('HXT','HXT_39405_QRY_SYS_TOK'); -- HXT11
497 FND_MESSAGE.SET_TOKEN('1', fnd_date.date_to_chardate(l_date_worked)); --HXT11 --SIR149 --FORMS60
498 err_buf := FND_MESSAGE.GET; -- HXT11
499 FND_MESSAGE.CLEAR; -- HXT11
500
501 --HXT11l_error_text := 'System error occurred during create holiday hours processing for '||
502 --HXT11 l_first_name||' '||l_last_name||' (Employee: '|| employee_number ||').';
503 FND_MESSAGE.SET_NAME('HXT','HXT_39320_ERR_CREAT_HOL'); -- HXT11
504 FND_MESSAGE.SET_TOKEN('FIRST_NAME', l_first_name); --HXT11
505 FND_MESSAGE.SET_TOKEN('LAST_NAME', l_last_name); --HXT11
506 FND_MESSAGE.SET_TOKEN('EMP_NUMBER', employee_number); --HXT11
507 l_retcode := log_clock_errors(TRUE, NULL,'HOL', SQLERRM);
508 RETURN;
509
510 WHEN l_rec_hours_data_err THEN
511 ret_code := l_retcode;
512 --HXT11err_buf := 'Data Error: Query timecard for'|| TO_CHAR(l_date_worked); --SIR149
513 FND_MESSAGE.SET_NAME('HXT','HXT_39404_QRY_DAT_TOK'); -- HXT11
514 FND_MESSAGE.SET_TOKEN('1', fnd_date.date_to_chardate(l_date_worked)); --HXT11 --SIR149 --FORMS60
515 err_buf := FND_MESSAGE.GET; -- HXT11
516 FND_MESSAGE.CLEAR; -- HXT11
517
518 --HXT11l_error_text := 'Data Error occurred in the record hours functionality';
519 FND_MESSAGE.SET_NAME('HXT','HXT_39293_REC_HRS_ERR'); -- HXT11
520 l_retcode := log_clock_errors(TRUE, NULL,'RECHRS', NULL);
521 RETURN;
522
523 WHEN l_rec_hours_sys_err THEN
524 ret_code := l_retcode;
525 --HXT11err_buf := 'Sys. Error: Query timecard for'|| TO_CHAR(l_date_worked); --SIR149
526 FND_MESSAGE.SET_NAME('HXT','HXT_39405_QRY_SYS_TOK'); -- HXT11
527 FND_MESSAGE.SET_TOKEN('1', fnd_date.date_to_chardate(l_date_worked)); --HXT11 --SIR149 --FORMS60
528 err_buf := FND_MESSAGE.GET; -- HXT11
529 FND_MESSAGE.CLEAR; -- HXT11
530
531 --HXT11l_error_text := 'System error occurred in the record hours functionality';
532 FND_MESSAGE.SET_NAME('HXT','HXT_39321_ERR_REC_HRS'); -- HXT11
533 l_retcode := log_clock_errors(TRUE, NULL,'RECHRS', SQLERRM);
534 RETURN;
535
536 WHEN g_error_log_error THEN
537 --HXT11err_buf := 'Error in hxt_time_clock.log_clock_errors';
538 FND_MESSAGE.SET_NAME('HXT','HXT_39403_LOG_ERR_ERR'); -- HXT11
539 err_buf := FND_MESSAGE.GET; -- HXT11
540 FND_MESSAGE.CLEAR; -- HXT11
541
542 HXT_UTIL.DEBUG('Error in hxt_time_clock.log_clock_errors'); --DEBUG ONLY --HXT115
543 ret_code := 2;
544 RETURN;
545
546 WHEN OTHERS THEN
547 --HXT11err_buf := 'Sys. Error: Query timecard for'|| TO_CHAR(l_date_worked); --SIR149
548 FND_MESSAGE.SET_NAME('HXT','HXT_39405_QRY_SYS_TOK'); -- HXT11
549 FND_MESSAGE.SET_TOKEN('1', fnd_date.date_to_chardate(l_date_worked)); --HXT11 --SIR149 --FORMS60
550 err_buf := FND_MESSAGE.GET; -- HXT11
551 FND_MESSAGE.CLEAR; -- HXT11
552
553 ret_code := 2;
554 FND_MESSAGE.SET_NAME('HXT','HXT_39406_EXCP_REC_TIME'); -- HXT11
555 l_retcode := log_clock_errors(FALSE, NULL,'TIMEXCP', SQLERRM);
556 RETURN;
557 END record_time;
558 /***********************************
559 get_time_period()
560 Obtain the time period identifier
561 for this particular pay date
562 ************************************/
563 FUNCTION get_time_period(i_payroll_id IN NUMBER,
564 i_date_worked IN DATE,
565 o_time_period OUT NOCOPY NUMBER,
566 o_start_date OUT NOCOPY DATE,
567 o_end_date OUT NOCOPY DATE)RETURN NUMBER IS
568 BEGIN
569 SELECT time_period_id,
570 start_date,
571 end_date
572 INTO o_time_period,
573 o_start_date,
574 o_end_date
575 FROM per_time_periods
576 WHERE payroll_id = i_payroll_id
577 AND TRUNC(i_date_worked) BETWEEN TRUNC(start_date) AND TRUNC(end_date);
578 RETURN 0;
579 EXCEPTION
580 WHEN NO_DATA_FOUND THEN
581 RETURN 1;
582 WHEN OTHERS THEN
583 RETURN 2;
584 END get_time_period;
585 /****************************************************
586 check_for_timecard()
587 Check the HXT_TIMECARDS table to see if a timecard
588 already exists for the person punching the clock
589 ****************************************************/
590 FUNCTION check_for_timecard( i_person_id IN NUMBER,
591 i_time_period_id IN NUMBER,
592 o_timecard_id OUT NOCOPY NUMBER,
593 o_auto_gen_flag OUT NOCOPY VARCHAR2)RETURN NUMBER IS
594 BEGIN
595 SELECT id,
596 auto_gen_flag,
597 batch_id
598 INTO o_timecard_id,
599 o_auto_gen_flag,
600 g_batch_err_id
601 FROM hxt_timecards
602 WHERE for_person_id = i_person_id
603 AND time_period_id = i_time_period_id;
604 RETURN 0;
605 EXCEPTION
606 WHEN NO_DATA_FOUND THEN
607 RETURN 1;
608 WHEN OTHERS THEN
609 RETURN 2;
610 END check_for_timecard;
611 /********************************************************
612 create_timecard()
613 Creates a timecard for the person punching the clock
614 for this particular time period based on the payroll
615 for this person.
616 *********************************************************/
620 i_time_period_id IN NUMBER,
617 FUNCTION create_timecard(i_person_id IN NUMBER,
618 i_assignment_id IN NUMBER,
619 i_payroll_id IN NUMBER,
621 o_timecard_id OUT NOCOPY NUMBER)RETURN NUMBER IS
622 l_retcode NUMBER DEFAULT 0;
623 l_batch_creation_error EXCEPTION;
624 l_batch_location_error EXCEPTION;
625 l_tim_id_creation_error EXCEPTION;
626 --BEGIN GLOBAL
627 -- l_batch_id pay_pdt_batch_headers.batch_id%TYPE DEFAULT NULL;
628 l_batch_id pay_batch_headers.batch_id%TYPE DEFAULT NULL;
629 --END GLOBAL
630 l_timecard_id hxt_timecards.id%TYPE DEFAULT NULL;
631 BEGIN
632 /* Obtain a batch id for the new timecard */
633 --BEGIN SIR343
634 -- l_retcode := find_existing_batch(l_batch_id);
635 l_retcode := find_existing_batch(i_payroll_id,
636 i_time_period_id,
637 l_batch_id);
638 --END SIR343
639 /* If Not Found */
640 IF l_retcode = 1 THEN
641 /* Create a batch id for the new timecard */
642 HXT_UTIL.DEBUG('Creating new batch'); --DEBUG ONLY --HXT115
643 l_retcode := create_batch( 'C', --source is timeclock
644 i_payroll_id,
645 i_time_period_id,
646 i_assignment_id,
647 i_person_id,
648 l_batch_id);
649 IF l_retcode <> 0 THEN
650 RAISE l_batch_creation_error;
651 END IF;
652 ELSIF l_retcode = 2 THEN
653 RAISE l_batch_location_error;
654 END IF;
655 g_batch_err_id := l_batch_id;
656 HXT_UTIL.DEBUG('Batch id is: '||TO_CHAR(l_batch_id));--DEBUG ONLY --HXT115
657 /* Generate a unique timecard id for the new timecard */
658 l_timecard_id := hxt_time_gen.Get_HXT_Seqno;
659 IF l_timecard_id = NULL THEN
660 RAISE l_tim_id_creation_error;
661 END IF;
662 HXT_UTIL.DEBUG('Timecard id is: '||TO_CHAR(l_timecard_id));--DEBUG ONLY --HXT115
663 /* Insert new timecard info to hxt_timecards */
664 --SIR012 INSERT into hxt_timecards
665 INSERT into hxt_timecards_f --SIR012
666 ( id,
667 for_person_id,
668 payroll_id,
669 time_period_id,
670 batch_id,
671 auto_gen_flag,
672 created_by,
673 creation_date
674 , effective_start_date --SIR012
675 , effective_end_date) --SIR012
676 VALUES
677 ( l_timecard_id,
678 i_person_id,
679 i_payroll_id,
680 i_time_period_id,
681 l_batch_id,
682 'T',
683 g_user_id,
684 g_sysdate
685 , g_sysdate --SIR012
686 ,hr_general.end_of_time); --SIR149 --FORMS60
687 COMMIT;
688 o_timecard_id := l_timecard_id;
689 RETURN 0;
690 EXCEPTION
691 WHEN l_batch_creation_error THEN
692 RETURN l_retcode;
693 WHEN l_batch_location_error THEN
694 RETURN l_retcode;
695 WHEN l_tim_id_creation_error THEN
696 FND_MESSAGE.SET_NAME('HXT','HXT_39407_CREATE_TIM'); -- HXT11
697 l_retcode := log_clock_errors(FALSE, NULL,'TIMCRT', NULL);
698 --HXT11l_retcode := log_clock_errors(FALSE, 'Error creating timecard id in hxt_time_gen.Get_HXT_Seqno','Timecard Creation', NULL);
699 RETURN 2;
700 WHEN OTHERS THEN
701 FND_MESSAGE.SET_NAME('HXT','HXT_39408_CREATE_TIM_FUNC'); -- HXT11
702 l_retcode := log_clock_errors(FALSE, NULL,'Timecard Creation', SQLERRM);
703 --HXT11l_retcode := log_clock_errors(FALSE, 'Error in function create_timecard','Timecard Creation', SQLERRM);
704 RETURN 2;
705 END create_timecard;
706 /******************************************************************
707 create_batch()
708 Obtains an existing clock batch id for this particular timecard.
709 If no clock batch id with less than 50 timecards exists.
710 Creates a new batch id for this particular timecard.
711 ******************************************************************/
712 FUNCTION create_batch( i_source IN VARCHAR2,
713 i_payroll_id IN NUMBER,
714 i_time_period_id IN NUMBER,
715 i_assignment_id IN NUMBER,
716 i_person_id IN NUMBER,
717 o_batch_id OUT NOCOPY NUMBER) RETURN NUMBER IS
718 --BEGIN GLOBAL
719 -- l_batch_id pay_pdt_batch_headers.batch_id%TYPE DEFAULT NULL;
720 -- l_reference_num pay_pdt_batch_headers.reference_num%TYPE DEFAULT NULL;
721 l_batch_id pay_batch_headers.batch_id%TYPE DEFAULT NULL;
722 l_reference_num pay_batch_headers.batch_reference%TYPE DEFAULT NULL;
723 l_batch_name pay_batch_headers.batch_name%TYPE DEFAULT NULL;
724 l_batch_name_error EXCEPTION;
725 --END GLOBAL
726 l_error_text VARCHAR2(128) DEFAULT NULL;
727 l_batch_id_error EXCEPTION;
728 l_reference_num_error EXCEPTION;
729 l_retcode NUMBER DEFAULT 0;
730 l_object_version_number pay_batch_headers.object_version_number%TYPE;
731 BEGIN
732 hxt_user_exits.Define_Reference_Number(i_payroll_id,
733 i_time_period_id,
734 i_assignment_id,
735 i_person_id,
736 g_user_name,
737 i_source,
738 l_reference_num,
739 l_error_text);
743 -- create a batch first
740 IF l_error_text <> NULL THEN
741 RAISE l_reference_num_error;
742 END IF;
744 pay_batch_element_entry_api.create_batch_header (
745 p_session_date=> g_sysdate,
746 p_batch_name=> to_char(sysdate, 'DD-MM-RRRR HH24:MI:SS'),
747 p_batch_status=> 'U',
748 p_business_group_id=> g_bus_group_id,
749 p_action_if_exists=> 'I',
750 p_batch_reference=> l_reference_num,
751 p_batch_source=> 'OTM',
752 p_purge_after_transfer=> 'N',
753 p_reject_if_future_changes=> 'N',
754 p_batch_id=> l_batch_id,
755 p_object_version_number=> l_object_version_number
756 );
757
758 -- from the batch id, get the batch name
759 hxt_user_exits.define_batch_name (
760 l_batch_id,
761 l_batch_name,
762 l_error_text
763 );
764
765 IF l_error_text <> NULL
766 THEN
767 RAISE l_batch_name_error;
768 END IF;
769
770 --update the batch name
771 pay_batch_element_entry_api.update_batch_header (
772 p_session_date => g_sysdate,
773 p_batch_id=> l_batch_id,
774 p_object_version_number=> l_object_version_number,
775 p_batch_name=> l_batch_name
776 );
777
778
779 --END GLOBAL
780 COMMIT;
781 o_batch_id := l_batch_id;
782 return 0;
783 EXCEPTION
784 WHEN l_batch_id_error THEN
785 FND_MESSAGE.SET_NAME('HXT','HXT_39409_CREATE_BATCH'); -- HXT11
786 l_retcode := log_clock_errors(FALSE, NULL,'TIMCRT', SQLERRM);
787 --HXT11l_retcode := log_clock_errors(FALSE, 'Error creating batch id in hxt_time_gen.Get_Next_Batch_Id','Timecard Creation', SQLERRM);
788 RETURN 2;
789
790 WHEN l_reference_num_error THEN
791 FND_MESSAGE.SET_NAME('HXT','HXT_39410_CREATE_REF_FUNC'); -- HXT11
792 l_retcode := log_clock_errors(FALSE, NULL,'Timecard Creation', SQLERRM);
793 --HXT11l_retcode := log_clock_errors(FALSE, 'Error creating reference number in hxt_user_exits.Define_Reference_Number','Timecard Creation', SQLERRM);
794 RETURN l_retcode;
795
796 --BEGIN GLOBAL
797 WHEN l_batch_name_error THEN
798 FND_MESSAGE.SET_NAME('HXT','HXT_39484_CREATE_BATCH_NAME');
799 l_retcode := log_clock_errors(FALSE, NULL,'Timecard Creation', SQLERRM);
800 RETURN l_retcode;
801 --END GLOBAL
802
803 WHEN OTHERS THEN
804 FND_MESSAGE.SET_NAME('HXT','HXT_39411_CREATE_BATCH_FUNC'); -- HXT11
805 l_retcode := log_clock_errors(FALSE, NULL,'TIMCRT', SQLERRM);
806 --HXT11l_retcode := log_clock_errors(FALSE, 'Error in function create_batch','Timecard Creation', SQLERRM);
807 RETURN 2;
808 END create_batch;
809 /********************************************************************
810 find_existing_batch()
811 Examine the pay_pdt_batch_headers and the hxt_timeclocks
812 tables for existing unprocessed timeclock batches. The
813 batches must be in a hold status (batch_status = 'H')
814 and have less than the max amount of timecards allowed per batch.
815 ********************************************************************/
816 --BEGIN SIR343
817 --FUNCTION find_existing_batch(o_batch_id OUT NUMBER)RETURN NUMBER IS
818 FUNCTION find_existing_batch(i_payroll_id IN NUMBER,
819 i_time_period_id IN NUMBER,
820 o_batch_id OUT NOCOPY NUMBER)RETURN NUMBER IS
821 --END SIR343
822 l_max_batches NUMBER := fnd_profile.Value('HXT_BATCH_SIZE');
823 l_retcode NUMBER DEFAULT 0;
824 BEGIN
825 --BEGIN GLOBAL
826 -- SELECT bat.batch_id
827 -- INTO o_batch_id
828 -- FROM pay_pdt_batch_headers bat
829 -- WHERE bat.reference_num like 'C_%'
830 -- AND bat.batch_id = (SELECT MAX(bat2.batch_id)
831 -- FROM pay_pdt_batch_headers bat2
832 -- WHERE bat2.batch_status = 'H')
833 -- AND l_max_batches > (SELECT COUNT(tim.id)
834 -- FROM hxt_timecards tim
835 -- WHERE tim.batch_id = bat.batch_id);
836 --BEGIN SIR343
837 -- SELECT bat.batch_id
838 -- INTO o_batch_id
839 -- FROM pay_batch_headers bat
840 -- WHERE bat.batch_reference like 'C_%'
841 -- AND bat.batch_id = (SELECT MAX(bat2.batch_id)
842 -- FROM pay_batch_headers bat2
843 -- WHERE bat2.batch_status = 'U')
844 -- AND l_max_batches > (SELECT COUNT(tim.id)
845 -- FROM hxt_timecards tim
846 -- WHERE tim.batch_id = bat.batch_id);
847 SELECT MAX(bat.batch_id)
848 INTO o_batch_id
849 FROM pay_batch_headers bat
850 WHERE bat.batch_status = 'U'
851 AND bat.batch_reference like 'C_%'
852 AND not exists (SELECT 'x'
853 FROM hxt_timecards tim
854 WHERE tim.batch_id = bat.batch_id
855 AND (tim.time_period_id <> i_time_period_id
856 OR tim.payroll_id <> i_payroll_id))
857 AND l_max_batches > (SELECT COUNT(tim2.id)
858 FROM hxt_timecards tim2
859 WHERE tim2.batch_id = bat.batch_id);
860 --END SIR343
861 --END GLOBAL
862 RETURN 0;
863 EXCEPTION
864 WHEN NO_DATA_FOUND THEN
865 RETURN 1;
869 --HXT11l_retcode := log_clock_errors(FALSE, 'Error in function find_existing_batch','Timecard Creation', SQLERRM);
866 WHEN OTHERS THEN
867 FND_MESSAGE.SET_NAME('HXT','HXT_39412_FIND_BATCH_FUNC'); -- HXT11
868 l_retcode := log_clock_errors(FALSE, NULL,'TIMCRT', SQLERRM);
870 RETURN 2;
871 END find_existing_batch;
872 /**********************************************************
873 create_holiday_hours()
874 Creates hours on new timecards for all holidays falling
875 between the start and end dates of the pay period.
876 **********************************************************/
877 FUNCTION create_holiday_hours( i_person_id IN NUMBER,
878 i_hcl_id IN NUMBER,
879 i_hxt_rotation_plan IN NUMBER, --SIR344
880 i_start_date IN DATE,
881 i_end_date IN DATE,
882 i_timecard_id IN NUMBER,
883 i_assignment_id IN NUMBER)RETURN NUMBER IS
884 CURSOR l_hol_cur( c_start_date DATE, c_end_date DATE, c_hcl_id NUMBER) IS
885 SELECT hcl.element_type_id,
886 hdy.hours,
887 hdy.holiday_date
888 FROM hxt_holiday_calendars hcl,
889 hxt_holiday_days hdy
890 WHERE TRUNC(hdy.holiday_date,'DD') BETWEEN TRUNC(c_start_date,'DD') AND TRUNC(c_end_date,'DD')
891 AND hcl.id = hdy.hcl_id
892 AND hdy.holiday_date BETWEEN hcl.effective_start_date AND hcl.effective_end_date
893 AND hcl.id = c_hcl_id;
894 -- not needed. declared in for loop l_hol_rec l_hol_cur%ROWTYPE;
895 l_retcode NUMBER DEFAULT 0;
896 l_hours_worked_error EXCEPTION;
897 --BEGIN SIR344
898 l_time_in DATE := NULL;
899 l_time_out DATE := NULL;
900 l_hours NUMBER;
901 l_work_id NUMBER;
902 l_osp_id NUMBER;
903 l_sdf_id NUMBER;
904 l_standard_start NUMBER;
905 l_standard_stop NUMBER;
906 l_early_start NUMBER;
907 l_late_stop NUMBER;
908 --END SIR344
909 BEGIN
910 FOR l_hol_rec IN l_hol_cur(i_start_date, i_end_date, i_hcl_id)
911 LOOP
912 --BEGIN SIR344
913 IF (fnd_profile.value('HXT_HOL_HOURS_FROM_HOL_CAL') = 'Y' OR
914 fnd_profile.value('HXT_HOL_HOURS_FROM_HOL_CAL') IS NULL) THEN
915 l_hours := l_hol_rec.hours;
916 l_time_out := NULL;
917 l_time_in := NULL;
918 ELSE
919 IF i_hxt_rotation_plan IS NOT NULL THEN
920 HXT_UTIL.get_shift_info(l_hol_rec.holiday_date,
921 l_work_id,
922 i_hxt_rotation_plan,
923 l_osp_id,
924 l_sdf_id,
925 l_standard_start,
926 l_standard_stop,
927 l_early_start,
928 l_late_stop,
929 l_hours,
930 l_retcode);
931 IF l_retcode <> 0 THEN
932 RAISE l_hours_worked_error;
933 END IF;
934 IF l_hours IS NOT NULL THEN
935 l_time_out := NULL;
936 l_time_in := NULL;
937 ELSE
938 l_time_in := to_date(to_char(l_hol_rec.holiday_date,'DDMMYYYY ')||
939 to_char(l_standard_start,'0009'), 'DDMMYYYY HH24MI');
940 l_time_out := to_date(to_char(l_hol_rec.holiday_date,'DDMMYYYY ')||
941 to_char(l_standard_stop,'0009'), 'DDMMYYYY HH24MI');
942 l_hours := 24 * (l_time_out - l_time_in);
943 IF l_hours = 0 THEN
944 l_time_out := NULL;
945 l_time_in := NULL;
946 END IF;
947 END IF;
948 END IF;
949 END IF;
950 --END SIR344
951 HXT_UTIL.DEBUG('The following holiday information was obtained');--DEBUG ONLY --HXT115
952 HXT_UTIL.DEBUG(fnd_date.date_to_chardate(l_hol_rec.holiday_date)); --DEBUG ONLY --FORMS60 --HXT115
953 HXT_UTIL.DEBUG(TO_CHAR(l_hol_rec.element_type_id)); --DEBUG ONLY --HXT115
954 --BEGIN SIR344
955 HXT_UTIL.DEBUG(TO_CHAR(l_hours)); --DEBUG ONLY --HXT115
956 HXT_UTIL.DEBUG(TO_CHAR(l_time_in,'MM-DD-YYYY HH24:MI')); --DEBUG ONLY --HXT115
957 HXT_UTIL.DEBUG(TO_CHAR(l_time_out,'MM-DD-YYYY HH24:MI')); --DEBUG ONLY --HXT115
958 --END SIR344
959 IF l_hours >= 0 THEN --SIR344
960 l_retcode := record_hours_worked( TRUE,
961 i_timecard_id,
962 i_assignment_id,
963 i_person_id,
964 l_hol_rec.holiday_date,
965 l_hol_rec.element_type_id,
966 l_hours, --SIR344
967 l_time_in, --SIR344
968 l_time_out, --SIR344
969 i_start_date);
970 END IF;
971 IF l_retcode <> 0 THEN
972 RAISE l_hours_worked_error;
973 END IF;
974 END LOOP;
975 RETURN 0;
976 EXCEPTION
977 WHEN NO_DATA_FOUND THEN
978 RETURN 0;
979 WHEN l_hours_worked_error THEN
980 RETURN 1;
981 WHEN OTHERS THEN
982 FND_MESSAGE.SET_NAME('HXT','HXT_39413_LOC_HOL'); -- HXT11
983 FND_MESSAGE.SET_TOKEN('ASG_ID',TO_CHAR(i_assignment_id)); -- HXT11
984 l_retcode := log_clock_errors(TRUE,NULL, 'TIMCRT', SQLERRM);
985 --HXT11l_retcode := log_clock_errors(TRUE,'Error attempting to locate holiday information'||
986 --HXT11 'while creating a timecard for Assignment: '||
987 --HXT11 TO_CHAR(i_assignment_id)||' in function create_holiday_hours',
991 END create_holiday_hours;
988 --HXT11 'Timecard Creation',
989 --HXT11 SQLERRM);
990 RETURN 2;
992 /*************************************************************************
993 record_hours_worked()
994 Fetches additional assignment details about employees.
995 Creates hours worked records on the hxt_hours_worked database table.
996 Calls the hxt_time_summary.generate_details function to explode details.
997 **************************************************************************/
998 FUNCTION record_hours_worked( b_generate_holiday IN BOOLEAN,
999 i_timecard_id IN NUMBER,
1000 i_assignment_id IN NUMBER,
1001 i_person_id IN NUMBER,
1002 i_date_worked IN DATE,
1003 i_element_id IN NUMBER,
1004 i_hours IN NUMBER,
1005 i_start_time IN DATE,
1006 i_end_time IN DATE,
1007 i_start_date IN DATE)RETURN NUMBER IS
1008 l_hol_yn CHAR DEFAULT 'N';
1009 l_details_error EXCEPTION;
1010 l_details_system_error EXCEPTION;
1011 l_hours_worked_id_error EXCEPTION;
1012 l_seq_num_error EXCEPTION;
1013 l_generate_details_error EXCEPTION;
1014 l_retcode NUMBER DEFAULT 0;
1015 l_hours_worked_id NUMBER DEFAULT NULL;
1016 l_sequence_number NUMBER DEFAULT NULL;
1017 l_rowid ROWID; --SIR012
1018
1019 -- ***** Start commented code for Bug 2669059 **************
1020 -- Commenting this cursor and adding two different cursors
1021 -- CURSOR l_details_cur(c_assignment_id NUMBER, c_date_worked DATE) IS
1022 -- SELECT aeiv.hxt_earning_policy, -- ORACLE
1023 -- aeiv.hxt_shift_differential_policy, -- ORACLE
1024 -- aeiv.hxt_hour_deduction_policy, -- ORACLE
1025 -- egp.fcl_earn_type,
1026 -- egp.egt_id,
1027 -- egp.pep_id,
1028 -- egp.pip_id,
1029 -- wsh.off_shift_prem_id,
1030 -- wsh.shift_diff_ovrrd_id
1031 -- FROM hxt_earning_policies egp,
1032 ----ORACLE per_assignments_f_dfv asmv,
1033 -- hxt_per_aei_ddf_v aeiv, --ORACLE
1034 -- per_assignment_status_types ast,
1035 -- per_assignments_f asm,
1036 -- hxt_shifts sht,
1037 -- hxt_weekly_work_schedules wws,
1038 -- hxt_work_shifts wsh,
1039 -- hxt_rotation_schedules rts
1040 -- WHERE c_assignment_id = asm.assignment_id
1041 -- AND ast.assignment_status_type_id = asm.assignment_status_type_id
1042 -- AND ast.pay_system_status = 'P' -- Check payroll status
1043 --ORACLE AND asmv.row_id = asm.rowid
1044 -- AND aeiv.assignment_id = asm.assignment_id --ORACLE
1045 -- AND c_date_worked BETWEEN aeiv.effective_start_date /* GLOBAL */
1046 -- AND aeiv.effective_end_date /* GLOBAL */
1047 --/*GLOBAL AND aeiv.information_type = 'HXT_ASS_INFO' --ORACLE */
1048 ----ORACLE AND egp.id(+) = asmv.hxt_earning_policy
1049 -- AND egp.id(+) = aeiv.hxt_earning_policy --ORACLE
1050 -- AND c_date_worked >= rts.start_date
1051 -- AND wsh.week_day = to_char(c_date_worked,'DY')
1052 -- AND wws.id = wsh.tws_id
1053 -- AND c_date_worked between wws.date_from AND nvl(wws.date_to, c_date_worked)
1054 -- AND wws.id = rts.tws_id
1055 -- AND sht.id = wsh.sht_id;
1056 -- ***** End commented code for Bug 2669059 **************
1057
1058 -- ***** Start new code for Bug 2669059 **************
1059 CURSOR l_details_cur(c_assignment_id NUMBER, c_date_worked DATE) IS
1060
1061 SELECT
1062 aeiv.hxt_earning_policy,
1063 aeiv.hxt_shift_differential_policy,
1064 aeiv.hxt_hour_deduction_policy,
1065 aeiv.hxt_rotation_plan,
1066 egp.fcl_earn_type,
1067 egp.egt_id,
1068 egp.pep_id,
1069 egp.pip_id
1070 FROM hxt_earning_policies egp,
1071 hxt_per_aei_ddf_v aeiv,
1072 per_assignment_status_types past,
1073 per_assignments_f paf
1074 WHERE c_assignment_id = paf.assignment_id
1075 AND c_date_worked BETWEEN paf.effective_start_date AND paf.effective_end_date
1076 AND past.assignment_status_type_id = paf.assignment_status_type_id
1077 AND past.pay_system_status = 'P' -- Check payroll status
1078 AND aeiv.assignment_id = paf.assignment_id
1079 AND c_date_worked BETWEEN aeiv.effective_start_date
1080 AND aeiv.effective_end_date
1081 AND egp.id = aeiv.hxt_earning_policy
1082 AND c_date_worked BETWEEN egp.effective_start_date
1083 AND egp.effective_end_date;
1084
1085 -- ***** End new code for Bug 2669059 **************
1086
1087 l_det_rec l_details_cur%ROWTYPE;
1088
1089 -- ***** Start new code for Bug 2669059 **************
1090 CURSOR l_wsh_details_cur(c_hxt_rotation_plan NUMBER, c_date_worked DATE) IS
1091 SELECT hws.off_shift_prem_id, hws.shift_diff_ovrrd_id
1092 FROM hxt_rotation_plans hrp,
1093 hxt_rotation_schedules hrs,
1094 hxt_weekly_work_schedules hwws,
1095 hxt_work_shifts hws
1096 WHERE hrp.id = c_hxt_rotation_plan
1097 AND c_date_worked BETWEEN hrp.date_from
1098 AND NVL (hrp.date_to, c_date_worked )
1099 AND hrs.rtp_id = hrp.id
1100 AND c_date_worked >= hrs.start_date
1101 AND hwws.id = hrs.tws_id
1102 AND c_date_worked BETWEEN hwws.date_from
1103 AND NVL (hwws.date_to, c_date_worked)
1104 AND hws.tws_id = hwws.id
1108
1105 AND hws.week_day = hxt_util.get_week_day(c_date_worked);
1106
1107 l_wsh_det_rec l_wsh_details_cur%ROWTYPE;
1109 -- ***** End new code Bug 2669059 **************
1110
1111 BEGIN
1112 /*Fetch additional assignment details about this employee*/
1113 BEGIN
1114 HXT_UTIL.DEBUG('Opening details Cursor');--DEBUG ONLY --HXT115
1115 OPEN l_details_cur(i_assignment_id, i_date_worked);
1116 HXT_UTIL.DEBUG('Fetching details Cursor');--DEBUG ONLY --HXT115
1117 FETCH l_details_cur
1118 INTO l_det_rec;
1119 HXT_UTIL.DEBUG('Closing details Cursor');--DEBUG ONLY --HXT115
1120 CLOSE l_details_cur;
1121 --DEBUG ONLY BEGIN
1122 HXT_UTIL.DEBUG('earning policy : '||l_det_rec.hxt_earning_policy);--HXT115
1123 HXT_UTIL.DEBUG('shift differential policy: '||l_det_rec.hxt_shift_differential_policy); --HXT115
1124 HXT_UTIL.DEBUG('hour deduction policy: '||l_det_rec.hxt_hour_deduction_policy); --HXT115
1125 HXT_UTIL.DEBUG('fcl earn type: '||l_det_rec.fcl_earn_type); --HXT115
1126 HXT_UTIL.DEBUG('egt id: '||TO_CHAR(l_det_rec.egt_id)); --HXT115
1127 HXT_UTIL.DEBUG('pep id: '||TO_CHAR(l_det_rec.pep_id)); --HXT115
1128 HXT_UTIL.DEBUG('pip id: '||TO_CHAR(l_det_rec.pip_id)); --HXT115
1129
1130 -- ***** Start commented code for Bug 2669059 **************
1131 -- HXT_UTIL.DEBUG('off_shift_prem_id: '||TO_CHAR(l_det_rec.off_shift_prem_id)); --HXT115
1132 -- HXT_UTIL.DEBUG('shift_diff_ovrrd_id: '||TO_CHAR(l_det_rec.shift_diff_ovrrd_id)); --HXT115
1133 -- ***** End commented code for Bug 2669059 **************
1134
1135 --DEBUG ONLY END
1136 EXCEPTION
1137 WHEN NO_DATA_FOUND THEN
1138 RAISE l_details_error;
1139 WHEN OTHERS THEN
1140 RAISE l_details_system_error;
1141 END; /*end additional assignment details*/
1142
1143 -- ***** Start new code for Bug 2669059 **************
1144
1145 IF l_det_rec.hxt_rotation_plan is not null THEN
1146 HXT_UTIL.DEBUG('Opening wsh details Cursor');--DEBUG ONLY --HXT115
1147 OPEN l_wsh_details_cur(l_det_rec.hxt_rotation_plan,i_date_worked);
1148 HXT_UTIL.DEBUG('Fetching wsh details Cursor');--DEBUG ONLY --HXT115
1149 FETCH l_wsh_details_cur
1150 INTO l_wsh_det_rec;
1151 HXT_UTIL.DEBUG('Closing wsh details Cursor');--DEBUG ONLY --HXT115
1152 CLOSE l_wsh_details_cur;
1153 END IF;
1154
1155
1156 HXT_UTIL.DEBUG('off_shift_prem_id: '||TO_CHAR(l_wsh_det_rec.off_shift_prem_id)); --HXT115
1157 HXT_UTIL.DEBUG('shift_diff_ovrrd_id: '||TO_CHAR(l_wsh_det_rec.shift_diff_ovrrd_id)); --HXT115
1158
1159 -- ***** End new code for Bug 2669059 **************
1160
1161 /*Flag holidays being generated*/
1162 IF b_generate_holiday = TRUE THEN
1163 l_hol_yn := 'Y';
1164 END IF;
1165 /*Obtain a unique hours worked id*/
1166 l_hours_worked_id := hxt_time_gen.Get_HXT_Seqno;
1167 IF l_hours_worked_id = NULL THEN
1168 RAISE l_hours_worked_id_error;
1169 END IF;
1170 g_hours_worked_err_id := l_hours_worked_id;
1171 /*Obtain the next sequence number for hours worked on this day*/
1172 l_sequence_number := hxt_util.Get_Next_Seqno( i_timecard_id, i_date_worked);
1173 IF l_sequence_number = NULL THEN
1174 RAISE l_seq_num_error;
1175 END IF;
1176 HXT_UTIL.DEBUG('Hours Worked Id is: '||TO_CHAR(l_hours_worked_id));--DEBUG ONLY --HXT115
1177 HXT_UTIL.DEBUG('Hours Worked Sequence Number is: '||TO_CHAR(l_sequence_number));--DEBUG ONLY --HXT115
1178 --SIR012 INSERT INTO hxt_sum_hours_worked --C421
1179 INSERT INTO hxt_sum_hours_worked_f --SIR012
1180 ( id,
1181 tim_id,
1182 -- C421 parent_id,
1183 date_worked,
1184 seqno,
1185 hours,
1186 assignment_id,
1187 element_type_id,
1188 time_in,
1189 time_out,
1190 created_by,
1191 creation_date
1192 , earn_pol_id --SIR012
1193 , effective_start_date --SIR012
1194 , effective_end_date) --SIR012
1195 VALUES
1196 ( l_hours_worked_id,
1197 i_timecard_id,
1198 -- C421 0,
1199 i_date_worked,
1200 l_sequence_number,
1201 i_hours,
1202 i_assignment_id,
1203 i_element_id,
1204 i_start_time,
1205 i_end_time,
1206 g_user_id,
1207 g_sysdate
1208 , l_det_rec.hxt_earning_policy --SIR012
1209 , g_sysdate --SIR012
1210 , hr_general.end_of_time); --SIR149 --FORMS60
1211 COMMIT;
1212 HXT_UTIL.DEBUG('Hours Worked Successfully inserted');--DEBUG ONLY --HXT115
1213
1214 select rowid --SIR012
1215 into l_rowid --SIR012
1216 from HXT_SUM_HOURS_WORKED --SIR012
1217 where id = l_hours_worked_id; --SIR012
1218
1219 /*Generate time details*/
1220 l_retcode := hxt_time_summary.Generate_Details(
1221 l_det_rec.hxt_earning_policy,
1222 l_det_rec.fcl_earn_type,
1223 l_det_rec.egt_id,
1227 l_det_rec.pep_id,
1224 l_det_rec.hxt_shift_differential_policy,
1225 l_det_rec.hxt_hour_deduction_policy,
1226 NULL, --Holiday day id
1228 l_det_rec.pip_id,
1229 l_wsh_det_rec.shift_diff_ovrrd_id,
1230 l_wsh_det_rec.off_shift_prem_id,
1231 NULL, --standard start
1232 NULL, --standard stop
1233 NULL, --early start
1234 NULL, --late stop
1235 l_hol_yn,
1236 i_person_id,
1237 'hxt_time_clock',
1238 l_hours_worked_id,
1239 -- C421 0, -- parent id
1240 i_timecard_id,
1241 --SIR012 NULL, -- line status
1242 i_date_worked,
1243 i_assignment_id,
1244 i_hours,
1245 i_start_time,
1246 i_end_time,
1247 i_element_id,
1248 NULL, --fcl_earn_reason_code
1249 NULL, --ffv_cost_center_id
1250 NULL, --ffv_labor_account_id
1251 NULL, --tas_id
1252 NULL, --location_id
1253 NULL, --sht_id
1254 NULL, --hrw_comment
1255 NULL, --ffv_rate_code_id
1256 NULL, --rate_multiple
1257 NULL, --hourly_rate
1258 NULL, --amount
1259 NULL, --fcl_tax_rule_code
1260 NULL, --separarate_check_flag
1261 l_sequence_number,
1262 g_user_id,
1263 g_sysdate,
1264 NULL, --last_updated_by
1265 NULL, --last_update_date
1266 NULL, --last_update_login
1267 i_start_date,
1268 l_rowid, --SIR012
1269 trunc(sysdate), --SIR012
1270 hr_general.end_of_time, --SIR149 --FORMS60
1271 NULL, --SIR012
1272 NULL, --SIR012
1273 'P', --SIR012
1274 'P', --SIR012
1275 NULL, --SIR012
1276 'C'); --SIR012
1277 IF l_retcode = 2 THEN
1278 RAISE l_generate_details_error;
1279 END IF;
1280 COMMIT;
1281 RETURN 0;
1282
1283 EXCEPTION
1284 WHEN l_details_error THEN
1285 FND_MESSAGE.SET_NAME('HXT','HXT_39414_LOC_ADDL_ASG'); -- HXT11
1286 FND_MESSAGE.SET_TOKEN('ASG_ID',TO_CHAR(i_assignment_id)); -- HXT11
1287 l_retcode := log_clock_errors(TRUE, NULL,'RECHRS', NULL);
1288 --HXT11l_retcode := log_clock_errors(TRUE, 'Additional Assignment details not located for Assignment '||TO_CHAR(i_assignment_id),'Record Hours', NULL);
1289 RETURN 1;
1290
1291 WHEN l_details_system_error THEN
1292 FND_MESSAGE.SET_NAME('HXT','HXT_39415_FETCH_ASG_DET'); -- HXT11
1293 FND_MESSAGE.SET_TOKEN('ASG_ID',TO_CHAR(i_assignment_id)); -- HXT11
1294 l_retcode := log_clock_errors(TRUE, NULL,'RECHRS', SQLERRM);
1295 --HXT11l_retcode := log_clock_errors(TRUE,
1296 --HXT11 'System Error occurred atempting to Fetch Assignment details'||
1297 --HXT11 'for Assignment '||TO_CHAR(i_assignment_id)||
1298 --HXT11 ' in Function record_hours_worked.',
1299 --HXT11 'Record Hours',SQLERRM);
1300 RETURN 2;
1301
1302 WHEN l_hours_worked_id_error THEN
1303 FND_MESSAGE.SET_NAME('HXT','HXT_39416_GET_HRW_ID'); -- HXT11
1304 l_retcode := log_clock_errors(TRUE, NULL,'RECHRS', SQLERRM);
1305 --HXT11l_retcode := log_clock_errors(TRUE, 'Error while attempting to obtain hours worked id from hxt_time_gen.Get_HXT_Seqno.','Record Hours', SQLERRM);
1306 RETURN 2;
1307
1308 WHEN l_generate_details_error THEN
1309 FND_MESSAGE.SET_NAME('HXT','HXT_39417_PROB_GEN_DET'); -- HXT11
1310 l_retcode := log_clock_errors(TRUE, NULL,'RECHRS', SQLERRM);
1311 --HXT11l_retcode := log_clock_errors(TRUE,'A problem occurred in the function hxt_time_summary.Generate_Details.','Record Hours', SQLERRM);
1312 RETURN 2;
1313
1314 WHEN l_seq_num_error THEN
1315 FND_MESSAGE.SET_NAME('HXT','HXT_39418_GET_HRW_SEQ'); -- HXT11
1316 l_retcode := log_clock_errors(TRUE, NULL,'RECHRS', SQLERRM);
1317 --HXT11l_retcode := log_clock_errors(TRUE,'Error while attempting to obtain hours worked sequence number in function record_hours_worked.','Record Hours', SQLERRM);
1318 RETURN 2;
1319
1320 WHEN OTHERS THEN
1321 FND_MESSAGE.SET_NAME('HXT','HXT_39419_SYSERR_RECFUNC'); -- HXT11
1322 l_retcode := log_clock_errors(TRUE, NULL,'RECHRS', SQLERRM);
1323 --HXT11l_retcode := log_clock_errors(TRUE,'System Error occurred in Function record_hours_worked','Record Hours',SQLERRM);
1324 RETURN 2;
1325 END record_hours_worked;
1326 /****************************************************
1327 log_clock_errors()
1328 Records errors for timeclock processing.
1329 The timecard available flag determines
1330 where to post the error:
1331 * In Phase I all errors are posted to HXT_ERRORS.
1332 * In Phase II errors with no timecard will be
1333 posted to a new table called HXT_TIMECLOCK_ERRORS.
1334 ****************************************************/
1335 FUNCTION log_clock_errors(i_timecard_available IN BOOLEAN,
1336 i_error_text IN VARCHAR2,
1337 i_error_location IN VARCHAR2,
1338 i_sql_message IN VARCHAR2)RETURN NUMBER IS
1342 HXT_UTIL.DEBUG('g_batch_err_id = ' || TO_CHAR(g_batch_err_id)); --DEBUG ONLY --HXT115
1339 l_error_seqno NUMBER DEFAULT NULL;
1340 l_err_buf VARCHAR2(240); -- HXT11
1341 BEGIN
1343 HXT_UTIL.DEBUG('g_timecard_err_id = ' || TO_CHAR(g_timecard_err_id)); --DEBUG ONLY --HXT115
1344 HXT_UTIL.DEBUG('g_hours_worked_err_id = ' || TO_CHAR(g_hours_worked_err_id)); --DEBUG ONLY --HXT115
1345 HXT_UTIL.DEBUG('g_time_period_err_id = ' || g_time_period_err_id); --DEBUG ONLY --HXT115
1346 HXT_UTIL.DEBUG(i_error_text || i_sql_message); --DEBUG ONLY --HXT115
1347 --begin HXT11
1348 l_err_buf := FND_MESSAGE.GET;
1349 FND_MESSAGE.CLEAR;
1350 --end HXT11
1351 IF i_timecard_available THEN
1352 HXT_UTIL.DEBUG('TC available. Calling hxt_util.Gen_error'); --DEBUG ONLY --HXT115
1353 hxt_util.Gen_Error( g_batch_err_id,
1354 g_timecard_err_id,
1355 g_hours_worked_err_id,
1356 g_time_period_err_id,
1357 i_error_text,
1358 i_error_location,
1359 i_sql_message,
1360 trunc(sysdate), --SIR012
1361 hr_general.end_of_time, --SIR149 --FORMS60
1362 'ERR'); --HXT11i1
1363 HXT_UTIL.DEBUG('Back from calling hxt_util.Gen_error'); --DEBUG ONLY --HXT115
1364 ELSE
1365 SELECT hxt_seqno.nextval
1366 INTO l_error_seqno
1367 FROM DUAL;
1368 --SIR012 insert into hxt_errors( id,
1369 --SIR012 error_msg,
1370 --SIR012 creation_date,
1371 --SIR012 location,
1372 --SIR12 created_by,
1373 --SIR12 err_type,
1374 --SIR12 PPB_ID,
1375 --SIR12 TIM_ID,
1376 --SIR12 HRW_ID,
1377 --SIR12 PTP_ID,
1378 --SIR12 ora_message)
1379 --SIR12 values( l_error_seqno,
1380 --SIR12 i_error_text,
1381 --SIR12 sysdate,
1382 --SIR12 i_error_location,
1383 --SIR12 g_user_id,
1384 --SIR12 'CLK',
1385 --SIR12 g_batch_err_id,
1386 --SIR12 g_timecard_err_id,
1387 --SIR12 g_hours_worked_err_id,
1388 --SIR12 g_time_period_err_id,
1389 --SIR12 i_sql_message);
1390
1391 HXT_UTIL.DEBUG('TC not available. Calling hxt_util.Gen_error'); --DEBUG ONLY --HXT115
1392 HXT_util.Gen_Error( 0, --SIR12
1393 0, --SIR12
1394 0, --SIR12
1395 0, --SIR12
1396 i_error_text, --SIR12
1397 i_error_location, --SIR12
1398 i_sql_message, --SIR12
1399 trunc(sysdate) --SIR12
1400 , hr_general.end_of_time, --SIR149 --FORMS60
1401 'ERR'); --HXT11i1
1402 COMMIT;
1403 END IF;
1404 RETURN 0;
1405 EXCEPTION
1406 WHEN OTHERS THEN
1407 RAISE g_error_log_error;
1408 END log_clock_errors;
1409 END hxt_time_clock;