1 PACKAGE BODY HXT_UTIL AS
2 /* $Header: hxtutl.pkb 120.8.12010000.2 2008/08/05 09:50:55 ubhat ship $ */
3
4 g_debug boolean := hr_utility.debug_enabled;
5 --BEGIN HXT11i1
6 FUNCTION GetPersonID(p_TIM_ID NUMBER) RETURN NUMBER; -- ER230
7 FUNCTION GetPayrollID(p_PTP_ID NUMBER) RETURN NUMBER; -- ER230
8 --END HXT11i1
9
10 --BEGIN HXT115
11 Procedure DEBUG(p_string IN VARCHAR2) IS
12 BEGIN
13 g_debug :=hr_utility.debug_enabled;
14 -- Uncomment line below to turn-on OTM package debug messages.
15 if g_debug then
16 hr_utility.trace(p_string);
17 end if;
18 -- NULL;
19 END DEBUG;
20 --END HXT115
21
22 /*----------------------Procedure GEN_ERROR NEWEST--------------------------*/
23 Procedure GEN_ERROR (p_PPB_ID IN NUMBER
24 ,p_TIM_ID IN NUMBER
25 , p_HRW_ID IN NUMBER
26 , p_PTP_ID IN NUMBER
27 , p_ERROR_MSG IN VARCHAR2
28 , p_LOCATION IN VARCHAR2
29 , p_ORA_MSG IN VARCHAR2
30 , p_EFFECTIVE_START_DATE IN DATE --ORA135
31 , p_EFFECTIVE_END_DATE IN DATE --ORA135
32 , p_TYPE IN VARCHAR2) IS --HXT11i1
33 -- Procedure GEN_ERROR
34 --
35 -- Purpose
36 -- Insert record in HXT_ERRORS table when an error is found regarding a
37 -- Timecard, summary or detailed Hours Worked or Pay Period record.
38 --
39 -- Returns
40 -- 0 - No errors occurred
41 -- 1 - Warnings occurred
42 -- 2 - Errors occurred
43 --
44 -- Arguments
45 -- p_TIM_ID - The source of the error is the BATCH record
46 -- p_TIM_ID - The source of the error is the TIMECARD record
47 -- p_HRW_ID - The source of the error is the Hours Worked record
48 -- p_PTP_ID - The source of the error is the TIME PERIOD RECORD.
49 --*** p_TYPE - will = 'NEW' until p_type is deleted from the HXT_ERRORS table *********
50 -- p_ERROR_MSG - the error message to show the user
51 -- p_LOCATION - the Procedure or Source
52 -- p_ORA_MSG - the ORACLE error number and message if any
53 --
54 -- Local Variables
55 l_CREATION_DATE DATE; --- the date time of the error
56 l_CREATED_BY NUMBER; --- the user logged in when the error occurred
57 l_EXCEP_seqno NUMBER; --- the next sequence number for new error record
58 l_ERROR_MSG VARCHAR2(240);
59 l_error VARCHAR2(240);
60 l_person_id NUMBER;
61 l_payroll_id NUMBER;
62
63 --
64 --
65 BEGIN
66 --
67 SELECT hxt_seqno.nextval
68 INTO l_EXCEP_seqno
69 FROM dual;
70 l_CREATED_BY := FND_GLOBAL.user_id;
71
72 l_person_id := GetPersonID(p_TIM_ID);
73 l_payroll_id := GetPayrollID(p_PTP_ID);
74
75 BEGIN
76
77 IF p_ERROR_MSG IS NULL THEN
78 l_ERROR_MSG := FND_MESSAGE.GET;
79 FND_MESSAGE.CLEAR;
80 ELSE
81 l_ERROR_MSG := p_ERROR_MSG;
82 END IF;
83
84 insert into hxt_errors_f(id, error_msg, creation_date, location,--ORA135
85 created_by, err_type, PPB_ID, TIM_ID, HRW_ID, PTP_ID, ora_message
86 ,EFFECTIVE_START_DATE
87 ,EFFECTIVE_END_DATE
88 ,PERSON_ID
89 ,PAYROLL_ID
90 )
91 values(l_EXCEP_seqno,
92 substr(nvl(l_ERROR_MSG,'NOTPROVIDED'),1,239),
93 sysdate,
94 substr(nvl(p_LOCATION,'NOTPROVIDED'),1,119),
95 nvl(l_CREATED_BY,-1),
96 p_TYPE, p_PPB_id, p_TIM_id, p_HRW_ID, p_PTP_ID,
97 substr(p_ORA_MSG,1,119)
98 ,nvl(p_EFFECTIVE_START_DATE,sysdate)
99 ,nvl(p_EFFECTIVE_END_DATE,hr_general.end_of_time)
100 ,l_Person_ID
101 ,l_Payroll_ID
102 ); --FORMS60
103
104
105 EXCEPTION
106 WHEN others THEN
107 FND_MESSAGE.SET_NAME('HXT','HXT_39469_ERR_INS_HXT_ERR');
108 l_error := SQLERRM;
109 insert into hxt_errors_f(id, error_msg, creation_date, location,
110 created_by, err_type, PPB_ID, TIM_ID, HRW_ID, PTP_ID, ora_message
111 ,EFFECTIVE_START_DATE
112 ,EFFECTIVE_END_DATE)
113 values(l_EXCEP_seqno,
114 FND_MESSAGE.GET||' '||nls_initcap(substr(p_error_msg,1,100)),
115 sysdate, 'ERROR', 999, 'NEW', 999, 999, 999, 999,
116 l_error
117 ,nvl(p_EFFECTIVE_START_DATE,sysdate)
118 ,nvl(p_EFFECTIVE_END_DATE,hr_general.end_of_time)); --FORMS60
119 FND_MESSAGE.CLEAR;
120 END;
121 END gen_error;
122 --
123 /*-------------------------Procedure GEN_ERROR---------------------------------*/
124 Procedure GEN_ERROR (p_TIM_ID IN NUMBER
125 , p_HRW_ID IN NUMBER
126 , p_PTP_ID IN NUMBER
127 , p_ERROR_MSG IN VARCHAR2
128 , p_LOCATION IN VARCHAR2
129 , p_ORA_MSG IN VARCHAR2
130 , p_EFFECTIVE_START_DATE IN DATE
131 , p_EFFECTIVE_END_DATE IN DATE
132 , p_TYPE IN VARCHAR2) IS
133 -- Procedure GEN_ERROR
134 --
135 -- Purpose
136 -- Insert record in HXT_ERRORS table when an error is found regarding a
137 -- Timecard, summary or detailed Hours Worked or Pay Period record.
138 --
139 -- Returns
140 -- 0 - No errors occurred
141 -- 1 - Warnings occurred
142 -- 2 - Errors occurred
143 --
144 -- Arguments
145 -- p_TIM_ID - The source of the error is the TIMECARD record
146 -- p_HRW_ID - The source of the error is the Hours Worked record
147 -- p_PTP_ID - The source of the error is the TIME PERIOD RECORD.
148 -- p_ERROR_MSG - the error message to show the user
149 -- p_LOCATION - the Procedure or Source
150 -- p_ORA_MSG - the ORACLE error number and message if any
151 --
152 -- Local Variables
153 l_CREATION_DATE DATE; --- the date time of the error
154 l_CREATED_BY NUMBER; --- the user logged in when the error occurred
155 l_EXCEP_seqno NUMBER; --- the next sequence number for new error record
156 l_error VARCHAR2(240);
157 l_ERROR_MSG VARCHAR2(240);
158 l_person_id NUMBER;
159 l_payroll_id NUMBER;
160 --
161 --
162 BEGIN
163 --
164 --
165 SELECT hxt_seqno.nextval
166 INTO l_EXCEP_seqno
167 FROM dual;
168 l_CREATED_BY := FND_GLOBAL.user_id;
169
170 l_person_id := GetPersonID(p_TIM_ID);
171 l_payroll_id := GetPayrollID(p_PTP_ID);
172
173 IF p_ERROR_MSG IS NULL THEN
174 l_ERROR_MSG := FND_MESSAGE.GET;
175 FND_MESSAGE.CLEAR;
176 ELSE
177 l_ERROR_MSG := p_ERROR_MSG;
178 END IF;
179 BEGIN
180 insert into hxt_errors_f(id, error_msg, creation_date, location,--ORA135
181 created_by, err_type, TIM_ID, HRW_ID, PTP_ID, ora_message
182 ,EFFECTIVE_START_DATE
183 ,EFFECTIVE_END_DATE
184 ,PERSON_ID --ER230
185 ,PAYROLL_ID --ER230
186 )
187 values(l_EXCEP_seqno,
188 substr(nvl(l_ERROR_MSG,'NOTPROVIDED'),1,239),
189 sysdate,
190 substr(nvl(p_LOCATION,'NOTPROVIDED'),1,119),
191 nvl(l_CREATED_BY,-1),
192 p_TYPE, p_TIM_id, p_HRW_ID, p_PTP_ID,
193 substr(p_ORA_MSG,1,119)
194 ,nvl(p_EFFECTIVE_START_DATE,sysdate)
195 ,nvl(p_EFFECTIVE_END_DATE,hr_general.end_of_time)
196 ,l_Person_ID
197 ,l_Payroll_ID
198 );
199 EXCEPTION
200 WHEN others THEN
201 FND_MESSAGE.SET_NAME('HXT','HXT_39469_ERR_INS_HXT_ERR');
202 l_error := SQLERRM;
203 insert into hxt_errors_f(id, error_msg, creation_date, location,
204 created_by, err_type, TIM_ID, HRW_ID, PTP_ID, ora_message
205 ,EFFECTIVE_START_DATE
206 ,EFFECTIVE_END_DATE)
207 values(l_EXCEP_seqno,
208 FND_MESSAGE.GET||' '||nls_initcap(substr(p_error_msg,1,100)),
209 sysdate, 'ERROR', 999, 'NEW', 999, 999, 999,
210 l_error
211 ,nvl(p_EFFECTIVE_START_DATE,sysdate)
212 ,nvl(p_EFFECTIVE_END_DATE,hr_general.end_of_time));
213 FND_MESSAGE.CLEAR;
214 END;
215 END gen_error;
216 --
217 -------------------------------------Procedure autogen_error-------------------------------------
218 --ORA136 removed.
219 ------------------------------------old --PROCEDURE GEN_ERROR-------------------------------------
220 --ORA136 removed.
221 ------------------------------------------PROCEDURE chk_absence------------------------------------
222 PROCEDURE chk_absence(P_assignment_id IN NUMBER,
223 P_period_id IN NUMBER,
224 P_calculation_date IN DATE,
225 P_element_type_id IN NUMBER,
226 P_hours IN NUMBER,
227 P_net_amt OUT NOCOPY NUMBER,
228 P_period_amt OUT NOCOPY NUMBER,
229 P_available_amt OUT NOCOPY NUMBER,
230 P_abs_status OUT NOCOPY NUMBER) IS
231 --
232 -- Procedure chk_absence
233 --
234 -- Purpose
235 -- Check the net accrual for a specific Absenece Element for sufficient hours
236 -- in order to allow person to take hours requested. If enough, then return
237 -- P_abs_status = 0; if not, then return P_abs_status = 1; if NO PTO Accrual Plan,
238 -- then return P_abs_status = 2.
239 --
240 -- Arguments
241 p_PLAN_ID NUMBER;
242 p_PLAN_NAME VARCHAR2(80);
243 p_PLAN_ELEMENT_TYPE_ID NUMBER;
244 p_PLAN_CATEGORY VARCHAR2(30);
245 p_PLAN_CATEGORY_NAME VARCHAR2(80);
246 p_PTO_ELEMENT_TYPE_ID NUMBER;
247 p_PTO_ELEMENT_NAME VARCHAR2(80);
248 p_PTO_INPUT_VALUE_ID NUMBER;
249 p_PTO_INPUT_VALUE_NAME VARCHAR2(30);
250 --
251 -- Local Variables
252 l_amount NUMBER;
253 l_total_period_hrs NUMBER;
254 --
255 -- Get PTO ACCRUAL PLAN for Absence Element
256 --
257 CURSOR pto_plan(p_element_type_id NUMBER) IS
258 select
259 ACCRUAL_PLAN_ID,
260 ACCRUAL_PLAN_NAME,
261 ACCRUAL_PLAN_ELEMENT_TYPE_ID,
262 ACCRUAL_CATEGORY,
263 ACCRUAL_CATEGORY_NAME,
264 PTO_ELEMENT_TYPE_ID,
265 PTO_ELEMENT_NAME,
266 PTO_INPUT_VALUE_ID,
267
268 PTO_INPUT_VALUE_NAME
269 FROM PAY_ACCRUAL_PLANS_V
270 WHERE PTO_ELEMENT_TYPE_ID = p_element_type_id;
271 --
272 -- Total all hours for Absence Element for current pay period
273 --
274 CURSOR hr_amt(p_period_id NUMBER,p_assignement_id NUMBER,p_element_type_id NUMBER) IS
275 select sum(hours)
276 from hxt_timecards tim, hxt_sum_hours_worked hrw
277 where hrw.tim_id = tim.id
278 and tim.time_period_id = p_period_id
279 and hrw.assignment_id = p_assignement_id
280 and hrw.element_type_id = p_element_type_id;
281 BEGIN
282 --
283 -- Initialize OUT variables;
284 P_net_amt := NULL;
285 P_period_amt := NULL;
286 P_abs_status := NULL;
287 P_available_amt := NULL;
288 --
289 -- Get PTO plan for element type passed
290 --
291 open pto_plan(p_element_type_id);
292 --
293 fetch pto_plan into p_PLAN_ID,
294 p_PLAN_NAME,
295 p_PLAN_ELEMENT_TYPE_ID,
296 p_PLAN_CATEGORY,
297 p_PLAN_CATEGORY_NAME,
298 p_PTO_ELEMENT_TYPE_ID,
299 p_PTO_ELEMENT_NAME,
300 p_PTO_INPUT_VALUE_ID,
301 p_PTO_INPUT_VALUE_NAME;
302 --
303 close pto_plan;
304 --
305 IF p_PLAN_ID IS NULL THEN
306 P_abs_status := 2; --- Element does not belong to an Accrual Plan
307 ELSE
308 --
309 -- Get net Accrual plan amount
310 --
311 l_amount := pay_us_pto_accrual.get_net_accrual( P_assignment_id ,
312 P_calculation_date,
313 P_plan_id ,
314 P_plan_category);
315 P_net_amt := l_amount;
316 --
317 -- Get total Absence Element hours for current pay period
318 --
319 open hr_amt(p_period_id,p_assignment_id,p_element_type_id);
320 --
321 fetch hr_amt into l_total_period_hrs;
322 --
323 close hr_amt;
324 --
325 -- Total Absence Element hours for current pay period
326 --
327 P_period_amt := l_total_period_hrs;
328 --
329 IF l_total_period_hrs IS NULL THEN
330 l_total_period_hrs := 0;
331 END IF;
332 l_total_period_hrs := l_total_period_hrs + p_hours;
333 --
334 -- Calculate net Accrual available if all Absence Elements are taken
335 P_available_amt := l_amount - l_total_period_hrs;
336 --
337 -- Check that Hours to be charge to this Accrual plan are available to take
338 --
339 IF l_total_period_hrs <= l_amount THEN
340 P_abs_status := 0;
341 ELSE
342 P_abs_status := 1;
343 END IF;
344 END IF;
345 --
346 EXCEPTION
347 WHEN others THEN
348 P_abs_status := 3;
349 END;
350 --
351 --------------------------Submit Req --------------------------
352 FUNCTION submit_req (p_program varchar2,
353 p_desc varchar2,
354 p_msg varchar2,
355 p_loc varchar2,
356 p_1 varchar2,p_2 varchar2,p_3 varchar2,p_4 varchar2,
357 p_5 varchar2,p_6 varchar2,p_7 varchar2,p_8 varchar2,
358 p_9 varchar2,p_10 varchar2,p_11 varchar2,p_12 varchar2,
359 p_13 varchar2,p_14 varchar2,p_15 varchar2,p_16 varchar2,
360 p_17 varchar2,p_18 varchar2,p_19 varchar2,p_20 varchar2,
361 p_21 varchar2,p_22 varchar2,p_23 varchar2,p_24 varchar2,
362 p_25 varchar2,p_26 varchar2,p_27 varchar2,p_28 varchar2,
363 p_29 varchar2,p_30 varchar2,p_31 varchar2,p_32 varchar2,
364 p_33 varchar2,p_34 varchar2,p_35 varchar2,p_36 varchar2,
365 p_37 varchar2,p_38 varchar2,p_39 varchar2,p_40 varchar2,
366 p_41 varchar2,p_42 varchar2,p_43 varchar2,p_44 varchar2,
367 p_45 varchar2,p_46 varchar2,p_47 varchar2,p_48 varchar2,
368 p_49 varchar2,p_50 varchar2,p_51 varchar2,p_52 varchar2,
369 p_53 varchar2,p_54 varchar2,p_55 varchar2,p_56 varchar2,
370 p_57 varchar2,p_58 varchar2,p_59 varchar2,p_60 varchar2,
371 p_61 varchar2,p_62 varchar2,p_63 varchar2,p_64 varchar2,
372 p_65 varchar2,p_66 varchar2,p_67 varchar2,p_68 varchar2,
373 p_69 varchar2,p_70 varchar2,p_71 varchar2,p_72 varchar2,
374 p_73 varchar2,p_74 varchar2,p_75 varchar2,p_76 varchar2,
375 p_77 varchar2,p_78 varchar2,p_79 varchar2,p_80 varchar2,
376 p_81 varchar2,p_82 varchar2,p_83 varchar2,p_84 varchar2,
377 p_85 varchar2,p_86 varchar2,p_87 varchar2,p_88 varchar2,
378 p_89 varchar2,p_90 varchar2,p_91 varchar2,p_92 varchar2,
379 p_93 varchar2,p_94 varchar2,p_95 varchar2,p_96 varchar2,
380 p_97 varchar2,p_98 varchar2,p_99 varchar2,p_100 varchar2
381 ) RETURN number IS
382 l_req_id number;
383 v_flag number := 0;
384 BEGIN
385 RETURN (v_flag);
386 END submit_req;
387 --
388 --------------------------Check For Holiday --------------------------
389 PROCEDURE check_for_holiday (p_date in DATE
390 ,p_hol_id in NUMBER
391 ,p_day_id OUT NOCOPY NUMBER
392 ,p_hours OUT NOCOPY NUMBER
393 ,p_retcode OUT NOCOPY NUMBER) IS
394 --
395 -- Procedure
396 -- Check_For_Holiday
397 -- Purpose
398 -- Check to see if a date is a holiday or the day before or after a holiday.
399 --
400 -- Arguments
401 -- p_date The date being checked.
402 -- p_hol_id The Holiday Calendar to be checked.
403 --
404 -- Returns:
405 -- p_day_id - holiday calendar day ID
406 -- p_hours - paid hours for holiday
407 -- p_retcode:
408 -- 0 - regular day
409 -- 1 - holiday
410 -- 2 - day before or after a holiday
411 --
412 -- Define cursor to return any holiday that falls between
413 -- the day before and the day after the date passed
414 CURSOR holiday_cur IS
415 select hdy.id, hdy.hours, hdy.holiday_date
416 from hxt_holiday_days hdy
417 ,hxt_holiday_calendars hcl
418 where hdy.holiday_date between p_date - 1 and p_date + 1
419 and hdy.hcl_id = hcl.id
420 and p_date between hcl.effective_start_date
421 and hcl.effective_end_date
422 and hcl.id = p_hol_id;
423 BEGIN
424 -- Initialize return code
425 p_retcode := 0;
426 -- Step through all holidays in three day range
427 FOR data in holiday_cur
428 LOOP
429 -- Check if date passed is holiday
430 IF p_date = data.holiday_date THEN
431 p_retcode := 1;
432 p_day_id := data.id;
433 p_hours := data.hours;
434 EXIT ; -- TA35 Loop must end when holiday is found. PWM 07/02/96 --ORA137
435 -- Otherwise, date passed is before or after holiday
436 ELSE
437 p_retcode := 2;
438 p_day_id := null;
439 p_hours := null;
440 END IF;
441 END LOOP;
442 END;
443 --
444 --------------------------Fnd Username --------------------------
445 FUNCTION Fnd_Username( a_user_id NUMBER ) RETURN VARCHAR2 IS
446 -- Get FND user name
447 CURSOR cur_user is
448 SELECT user_name
449 FROM fnd_user
450 WHERE user_id = a_user_id;
451 l_user_name fnd_user.user_name%TYPE;
452 BEGIN
453 OPEN cur_user;
454 FETCH cur_user INTO l_user_name;
455 CLOSE cur_user;
456 return (l_user_name);
457 END fnd_username;
458 --
459 --------------------------Element Cat --------------------------
460 -- BEGIN ORACLE bug #712501
461 FUNCTION element_cat(p_element_type_id IN NUMBER,
462 p_date_worked IN DATE) RETURN varchar2 IS
463
464 -- Returns earning category of the given element type
465 l_earning_cat VARCHAR2(30);
466 BEGIN
467 BEGIN
468 SELECT eltv.hxt_earning_category
469 INTO l_earning_cat
470 FROM hxt_pay_element_types_f_ddf_v eltv
471 WHERE eltv.element_type_id = p_element_type_id
472 AND p_date_worked BETWEEN eltv.effective_start_date
473 AND eltv.effective_end_date;
474 EXCEPTION
475 WHEN no_data_found THEN
476 l_earning_cat := NULL;
477 WHEN OTHERS THEN
478 l_earning_cat := 'ERR'; -- this done to flag error in calling routine
479 --
480 END;
481 return(l_earning_cat);
482 END;
483 --
484 --------------------------Check Policy Use --------------------------
485 FUNCTION check_policy_use (
486 p_policy_id IN NUMBER,
487 p_policy_name IN VARCHAR2,
488 p_policy_end_date IN DATE
489 )
490 RETURN BOOLEAN
491 IS
492
493 -- Function
494 -- check_policy_use
495 -- Purpose
496 -- Ensure ID values for ROTATION_PLAN, WORK_PLAN,
497 -- SHIFT_DIFFERENTIAL_POLICY, OVERTIME_POLICY or
498 -- HOUR_DEDUCT_POLICY have not been linked to the
499 -- ASSIGNMENT table if an attempt is made to delete them
500 -- or determine if a policy is currently assigned before
501 -- it is closed.
502 --
503 -- Arguments
504 -- p_policy_id the object Policy id.
505 -- p_policy_name the object Policy name.
506 -- p_policy_end_date the object Policy Date to (null if assignment check)
507 --
508 CURSOR assign_dfv (p_policy_id NUMBER)
509 IS
510 SELECT 1
511 FROM hxt_per_aei_ddf_v aeiv
512 WHERE ( aeiv.hxt_rotation_plan = p_policy_id
513 OR aeiv.hxt_earning_policy = p_policy_id
514 OR aeiv.hxt_hour_deduction_policy = p_policy_id
515 OR aeiv.hxt_shift_differential_policy = p_policy_id
516 )
517 AND ( p_policy_end_date
518 + 1 BETWEEN aeiv.effective_start_date
519 AND aeiv.effective_end_date
520 OR p_policy_end_date IS NULL
521 );
522
523 v_id NUMBER (15);
524 v_flag BOOLEAN;
525 -- v_date date;
526 -- v_session_date date;
527 BEGIN
528 v_id := NULL;
529 OPEN assign_dfv (p_policy_id);
530 FETCH assign_dfv INTO v_id;
531
532 IF assign_dfv%FOUND
533 THEN
534 v_flag := (TRUE);
535 ELSE
536 v_flag := (FALSE);
537 END IF;
538
539 CLOSE assign_dfv;
540 RETURN (v_flag);
541 END check_policy_use;
542 --
543 --------------------------Get Policies --------------------------
544 PROCEDURE get_policies(p_earn_pol_id IN NUMBER
545 ,p_assignment_id IN NUMBER
546 ,p_date IN DATE
547 ,p_work_plan OUT NOCOPY NUMBER
548 ,p_rotation_plan OUT NOCOPY NUMBER
549 ,p_ep_id OUT NOCOPY NUMBER
550 ,p_hdp_id OUT NOCOPY NUMBER
551 ,p_sdp_id OUT NOCOPY NUMBER
552 ,p_ep_type OUT NOCOPY VARCHAR2
553 ,p_egt_id OUT NOCOPY NUMBER
554 ,p_pep_id OUT NOCOPY NUMBER
555 ,p_pip_id OUT NOCOPY NUMBER
556 ,p_hcl_id OUT NOCOPY NUMBER
557 ,p_min_tcard_intvl OUT NOCOPY NUMBER
558 ,p_round_up OUT NOCOPY NUMBER
559 ,p_hcl_element_type_id OUT NOCOPY NUMBER
560 ,p_error OUT NOCOPY NUMBER) IS
561 --
562 --
563 -- Procedure GET_POLICIES
564 -- Purpose: Gets policies assigned to an input person on an input date.
565 -- Shift premiums returned by procedure Get_Shift_Info.
566 --
567 -- Returns p_error:
568 -- 0 - No errors occured
569 -- Other - Oracle error number
570 --
571 --
572 --
573 -- Modification Log:
574 -- 12/14/95 PJA Added Min_Tcard_Intvl and Round_Up.
575 -- 01/03/96 PJA Handle date effectivity and return error code.
576 --
577 --
578 CURSOR policies_cur(c_earn_pol_id NUMBER, c_assignment_id NUMBER, c_date DATE) IS
579 SELECT aeiv.hxt_rotation_plan
580 , egp.id
581 , aeiv.hxt_hour_deduction_policy
582 , aeiv.hxt_shift_differential_policy
583 , egp.fcl_earn_type
584 , egp.egt_id
585 , egp.pep_id
586 , egp.pip_id
587 , egp.hcl_id
588 , egp.min_tcard_intvl
589 , egp.round_up
590 , hcl.element_type_id
591 FROM
592 hxt_earning_policies egp
593 , hxt_holiday_calendars hcl
594 , hxt_per_aei_ddf_v aeiv
595 , per_all_assignments_f asm
596 WHERE asm.assignment_id = p_assignment_id
597 AND asm.assignment_id = aeiv.assignment_id
598 AND c_date between aeiv.effective_start_date
599 and aeiv.effective_end_date
600 AND c_date between asm.effective_start_date
601 and asm.effective_end_date
602 AND c_date between hcl.effective_start_date
603 and hcl.effective_end_date
604 AND egp.hcl_id = hcl.id
605 AND c_date between egp.effective_start_date
606 and egp.effective_end_date
607 AND egp.id = DECODE(c_earn_pol_id, NULL, aeiv.hxt_earning_policy, c_earn_pol_id);
608
609
610 BEGIN
611 OPEN policies_cur(p_earn_pol_id, p_assignment_id, p_date);
612 FETCH policies_cur
613 INTO p_rotation_plan
614 ,p_ep_id
615 ,p_hdp_id
616 ,p_sdp_id
617 ,p_ep_type
618 ,p_egt_id
619 ,p_pep_id
620 ,p_pip_id
621 ,p_hcl_id
622 ,p_min_tcard_intvl
623 ,p_round_up
624 ,p_hcl_element_type_id;
625 CLOSE policies_cur;
626
627 --
628 -- Set error code to no error
629 p_error := 0;
630 -- line C243 by BC
631 p_work_plan := null;
632 --
633 EXCEPTION
634 -- Return Oracle error number
635 WHEN others THEN
636 p_error := SQLCODE;
637 END;
638 --
639 --------------------------Get Shift Info --------------------------
640 PROCEDURE get_shift_info( p_date IN DATE
641 , p_work_id IN OUT NOCOPY NUMBER
642 , p_rotation_id IN NUMBER
643 , p_osp_id OUT NOCOPY NUMBER
644 , p_sdf_id OUT NOCOPY NUMBER
645 , p_standard_start OUT NOCOPY NUMBER
646 , p_standard_stop OUT NOCOPY NUMBER
647 , p_early_start OUT NOCOPY NUMBER
648 , p_late_stop OUT NOCOPY NUMBER
649 , p_hours OUT NOCOPY NUMBER --SIR212
650 , p_error OUT NOCOPY NUMBER) IS
651 --
652 -- Procedure GET_SHIFT_INFO
653 -- Purpose: Gets shift diff and off-shift premium for the person's
654 -- assigned shift on an input date
655 --
656 -- Returns p_error:
657 -- 0 - No errors occured
658 -- Other - Oracle error number
659 --
660 --
661 --
662 -- Modification Log:
663 -- 01/05/96 PJA Handle date effectivity and eturn error code.
664 -- 01/22/96 PJA Return shift start and stop times. Return weekly work
665 -- schedule ID if person assigned rotation schedule.
666 --
667 --
668 l_date DATE;
669 BEGIN
670 p_osp_id := NULL;
671 p_sdf_id := NULL;
672 p_early_start := NULL;
673 p_late_stop := NULL;
674 -- If rotation plan, get applicable work schedule id
675 -- Find rotation containing work date
676 SELECT rts.tws_id
677 INTO p_work_id
678 FROM hxt_rotation_schedules rts
679 WHERE rts.rtp_id = p_rotation_id
680 AND rts.start_date = (SELECT MAX(start_date)
681 FROM hxt_rotation_schedules
682 WHERE rtp_id = p_rotation_id
683 AND start_date <= p_date
684 );
685 --ORACLE END IF;
686 -- Get shift diff and off-shift premiums
687 SELECT wsh.off_shift_prem_id,
688 wsh.shift_diff_ovrrd_id,
689 sht.standard_start,
690 sht.standard_stop,
691 sht.early_start,
692 sht.late_stop,
693 sht.hours
694 INTO p_osp_id,
695 p_sdf_id,
696 p_standard_start,
697 p_standard_stop,
698 p_early_start,
699 p_late_stop,
700 p_hours
701 FROM hxt_shifts sht,
702 hxt_weekly_work_schedules wws,
703 hxt_work_shifts wsh
704 WHERE wsh.week_day = hxt_util.get_week_day(p_date)
705 AND wws.id = wsh.tws_id
706 AND p_date between wws.date_from
707 and nvl(wws.date_to, p_date)
708 AND wws.id = p_work_id
709 AND sht.id = wsh.sht_id;
710 --
711 -- Set error code to no error
712 p_error := 0;
713 --
714 EXCEPTION
715 -- Return Oracle error number
716 WHEN others THEN
717 p_error := SQLCODE;
718 END;
719 --
720 -------------------------- Get Period End Date --------------------------
721 --
722 FUNCTION get_period_end_date(p_batch_id IN NUMBER) return VARCHAR2 IS
723 --
724 cursor csr_period_end IS
725 select ptp.end_date
726 from per_time_periods ptp,
727 hxt_timecards_f htf
728 where htf.batch_id = p_batch_id
729 and htf.time_period_id = ptp.time_period_id;
730 --
731 cursor csr_retro_end IS
732 select ptp.end_date
733 from per_time_periods ptp,
734 hxt_det_hours_worked_f hdh,
735 hxt_timecards_f htf
736 where hdh.retro_batch_id = p_batch_id
737 and hdh.tim_id = htf.id
738 and htf.time_period_id = ptp.time_period_id;
739 --
740 l_period_end_date DATE;
741 --
742 BEGIN
743 --
744 OPEN csr_period_end;
745 FETCH csr_period_end into l_period_end_date;
746 --
747 IF csr_period_end%NOTFOUND THEN
748 --
749 OPEN csr_retro_end;
750 FETCH csr_retro_end into l_period_end_date;
751 CLOSE csr_retro_end;
752 --
753 END IF;
754 --
755 CLOSE csr_period_end;
756 --
757 RETURN fnd_date.date_to_displaydate(l_period_end_date);
758 --
759 END;
760 --
761 --------------------------Round Time --------------------------
762 FUNCTION round_time (p_time DATE
763 , p_interval NUMBER
764 , p_round_up NUMBER) RETURN DATE IS
765 l_min NUMBER;
766 l_mod NUMBER;
767 BEGIN
768 -- Get number of minutes past midnite
769 l_min := ( p_time - Trunc( p_time,'DD') ) * (24*60);
770 --
771 -- Get number of minutes past interval
772 l_mod := Mod( l_min, p_interval);
773 --
774 -- Apply interval rules to number of minutes (if remainder is less than round value,
775 -- deduct the remainder - otherwise, deduct the remainder then add the interval)
776 IF ( l_mod < p_round_up ) THEN
777 l_min := l_min - l_mod;
778 ELSE
779 l_min := l_min - l_mod + p_interval;
780 END IF;
781 --
782 -- Return new time (add minutes (converted to date) to date at midnite).
783 -- Round to prevent truncation
784 RETURN Round( ( Trunc( p_time,'DD') + (l_min/60/24) ), 'MI' );
785 --
786 END;
787 --
788 --------------------------Time to Hours --------------------------
789 FUNCTION time_to_hours(
790 P_TIME IN NUMBER ) RETURN NUMBER
791 IS
792 BEGIN
793 BEGIN
794 RETURN(FLOOR((p_time / 100)) +(MOD(p_time, 100) / 60));
795 END;
796 END time_to_hours;
797 --------------------------Get Next Seqno --------------------------
798 FUNCTION Get_Next_Seqno(a_timecard_id IN NUMBER, a_date_worked IN DATE) RETURN
799 NUMBER IS
800 -- Returns the max sequence + 10 of summary records of a given day on a given timecard
801 returned_seqno NUMBER;
802 BEGIN
803 SELECT NVL(MAX(seqno),0) INTO returned_seqno FROM hxt_sum_hours_worked thw --C421
804 WHERE thw.tim_id = a_timecard_id
805 AND thw.date_worked = a_date_worked;
806 RETURN returned_seqno + 10;
807 END;
808 --BEGIN SPR C166 BY BC
809 --
810 --------------------------Get Period Start --------------------------
811 FUNCTION Get_Period_Start(a_period_id IN NUMBER) RETURN DATE IS
812 -- Returns the end date of pay period a_period_id
813 returned_date DATE DEFAULT NULL; --SPR C166 BY BC
814 BEGIN
815 SELECT start_date INTO returned_date
816 FROM per_time_periods
817 WHERE TIME_PERIOD_ID = a_period_id;
818 RETURN returned_date;
819 EXCEPTION
820 WHEN OTHERS THEN
821 RETURN returned_date; --SPR C166 BY BC
822 END;
823 --
824 --------------------------Get Period End --------------------------
825 FUNCTION Get_Period_End(a_period_id IN NUMBER) RETURN DATE IS
826 -- Returns the end date of pay period a_period_id
827 returned_date DATE DEFAULT NULL; --SPR C166 BY BC
828 BEGIN
829 SELECT end_date INTO returned_date
830 FROM per_time_periods
831 WHERE TIME_PERIOD_ID = a_period_id;
832 RETURN returned_date;
833 EXCEPTION
834 WHEN OTHERS THEN
835 RETURN returned_date; --SPR C166 BY BC
836 END;
837 --
838 --------------------------Set Tim Status --------------------------
839 --ORAXXX removed
840 --
841 --------------------------Date Range --------------------------
842 FUNCTION date_range (start_date_in IN DATE,
843 end_date_in IN DATE,
844 check_time_in IN VARCHAR2 := 'NOTIME') RETURN VARCHAR2
845 /*
846 || date_range returns a string containing a date range
847 || in the format 'BETWEEN x AND y'
848 ||
849 || Parameters:
850 || start_date_in - The start date of the range. If NULL
851 || then use the min_start_date. If that is NULL, range
852 || has form '<= end_date'.
853 ||
854
855 || end_date_in - The end date of the range. If NULL
856 || then use the max_end_date. If that is NULL, range has
857 || form '>= start_date'.
858 ||
859 || check_time_in - If 'TIME' then use the time component
860 || of the dates as part of the comparison.
861 || If 'NOTIME' then strip off the time.
862 */
863
864 IS
865 /* String versions of parameters to place in return value */
866 start_date_int VARCHAR2(30);
867 end_date_int VARCHAR2(30);
868 /* Date mask for date<->character conversions. */
869 mask_int VARCHAR2(15) := 'MMDDYYYY';
870 /* Version of date mask which fits right into date range string */
871 mask_string VARCHAR2(30) := NULL;
872 /* The return value for the function. */
873 return_value VARCHAR2(1000) := NULL;
874 BEGIN
875 /*
876 || Finalize the date mask. If user wants to use time, add that to
877 || the mask. Then set the string version by embedding the mask
878 || in single quotes and with a trailing paranthesis.
879 */
880 IF UPPER (check_time_in) = 'TIME'
881 THEN
882 mask_int := mask_int || ' HHMISS';
883 END IF;
884 /*
885 || Convert mask. Example:
886 || If mask is: MMDDYYYY HHMISS
887 || then mask string is: ', 'MMDDYYYY HHMISS')
888 */
889 mask_string := ''', ''' || mask_int || ''')';
890 /* Now convert the dates to character strings using format mask */
891 start_date_int := TO_CHAR (start_date_in, mask_int);
892 end_date_int := TO_CHAR (end_date_in, mask_int);
893 /* If both start and end are NULL, then return NULL. */
894 IF start_date_int IS NULL AND end_date_int IS NULL
895 THEN
896 return_value := NULL;
897 /* If no start point then return "<=" format. */
898 ELSIF start_date_int IS NULL
899 THEN
900 return_value := '<= TO_DATE (''' || end_date_int || mask_string;
901 /* If no end point then return ">=" format. */
902 ELSIF end_date_int IS NULL
903 THEN
904 return_value := '>= TO_DATE (''' || start_date_int || mask_string;
905 /* Have start and end. A true range, so just put it together. */
906 ELSE
907 return_value :=
908 'BETWEEN TO_DATE (''' || start_date_int || mask_string ||
909 ' AND TO_DATE (''' || end_date_int || mask_string;
910 END IF;
911 RETURN return_value;
912 END;
913 --
914 --------------------------Get Retro Batch id --------------------------
915 FUNCTION Get_Retro_Batch_Id(p_tim_id IN NUMBER,
916 p_batch_name IN VARCHAR2 DEFAULT NULL,
917 p_batch_ref IN VARCHAR2 DEFAULT NULL) RETURN NUMBER IS
918 l_retro_id NUMBER(15) := 0;
919 l_retcode NUMBER(15) := 0;
920 l_assignment_id NUMBER(15) := 0;
921
922 /*
923 cursor existing_batch is
924 select retro_batch_id, assignment_id
925 from hxt_det_hours_worked det,
926 hxt_batch_states tbs
927 where det.tim_id = p_tim_id
928 and tbs.batch_id=det.retro_batch_id
929 and tbs.status in ('H','VE')
930 and pay_status = 'R';
931 */
932
933 cursor existing_batch is
934 select retro_batch_id, assignment_id, pbh.batch_reference
935 from hxt_det_hours_worked det,
936 hxt_batch_states tbs,
937 pay_batch_headers pbh
938 where det.tim_id = p_tim_id
939 and tbs.batch_id = det.retro_batch_id
940 and tbs.status in ('H','VE')
941 and pay_status = 'R'
942 and pbh.batch_id = tbs.batch_id;
943
944 cursor batch_param is
945 select payroll_id, time_period_id, for_person_id
946 from hxt_timecards
947 where id = p_tim_id;
948
949 bp batch_param%ROWTYPE;
950 l_batch_ref VARCHAR2(30);
951
952 BEGIN
953 open existing_batch;
954 fetch existing_batch into l_retro_id,l_assignment_id, l_batch_ref;
955 if existing_batch%NOTFOUND then
956 open batch_param;
957 fetch batch_param into bp;
958 if batch_param%FOUND then
959 l_retcode := HXT_UTIL.create_batch('R', --source is retro-pay
960 p_batch_name,
961 p_batch_ref,
962 bp.payroll_id,
963 bp.time_period_id,
964 l_assignment_id,
965 bp.for_person_id,
966 l_retro_id);
967 if l_retcode <> 0 then
968 l_retro_id := 0;
969 end if;
970 else
971 l_retro_id := 0;
972 end if;
973 close batch_param;
974 else
975 IF p_batch_ref IS NOT NULL THEN
976 IF l_batch_ref NOT like p_batch_ref THEN
977 l_retcode := HXT_UTIL.create_batch('R',
978 p_batch_name,
979 p_batch_ref,
980 bp.payroll_id,
981 bp.time_period_id,
982 l_assignment_id,
983 bp.for_person_id,
984 l_retro_id);
985 if l_retcode <> 0 then
986 l_retro_id := 0;
987 end if;
988 END IF;
989 END IF;
990 end if;
991 close existing_batch;
992 return (l_retro_id);
993
994 END;
995 --
996 --------------------------Create Batch --------------------------
997 FUNCTION create_batch( i_source IN VARCHAR2,
998 p_batch_name IN VARCHAR2 DEFAULT NULL,
999 p_batch_ref IN VARCHAR2 DEFAULT NULL,
1000 i_payroll_id IN NUMBER,
1001 i_time_period_id IN NUMBER,
1002 i_assignment_id IN NUMBER,
1003 i_person_id IN NUMBER,
1004 o_batch_id OUT NOCOPY NUMBER) RETURN NUMBER IS
1005
1006 l_batch_id pay_batch_headers.batch_id%TYPE DEFAULT NULL;
1007 l_reference_num pay_batch_headers.batch_reference%TYPE DEFAULT NULL;
1008 l_batch_name pay_batch_headers.batch_name%TYPE DEFAULT NULL;
1009 l_error_text VARCHAR2(128) DEFAULT NULL;
1010 l_batch_id_error EXCEPTION;
1011 l_reference_num_error EXCEPTION;
1012 l_retcode NUMBER DEFAULT 0;
1013 l_user_id fnd_user.user_id%TYPE := FND_GLOBAL.User_Id;
1014 l_user_name fnd_user.user_name%TYPE := 'OTM';
1015 l_sysdate DATE := trunc(SYSDATE);
1016 l_bus_group_id hr_organization_units.business_group_id%TYPE :=
1017 FND_PROFILE.Value( 'PER_BUSINESS_GROUP_ID' );
1018
1019 l_object_version_number pay_batch_headers.object_version_number%TYPE;
1020 cursor assign_param(c_person_id NUMBER) IS
1021 select asm.business_group_id
1022 from per_assignment_status_types ast,
1023 per_assignments_f asm
1024 where asm.person_id = c_person_id
1025 and ast.assignment_status_type_id = asm.assignment_status_type_id
1026 and ast.pay_system_status = 'P'; -- Check payroll status
1027
1028 BEGIN
1029 IF p_batch_ref IS NULL THEN
1030 hxt_user_exits.Define_Reference_Number(i_payroll_id,
1031 i_time_period_id,
1032 i_assignment_id,
1033 i_person_id,
1034 l_user_name,
1035 i_source,
1036 l_reference_num,
1037 l_error_text);
1038 ELSE
1039 l_reference_num := p_batch_ref || ' R';
1040 END IF;
1041
1042 IF l_error_text <> NULL THEN
1043 RETURN 1;
1044 END IF;
1045
1046 -- Get business_group_id from PER_ASSIGNMENTS_F table
1047 open assign_param(i_person_id);
1048 fetch assign_param into l_bus_group_id;
1049 if assign_param%NOTFOUND then
1050 close assign_param;
1051 RETURN 2;
1052 end if;
1053 close assign_param;
1054
1055 /* Get next batch number */
1056 -- create a batch first
1057 pay_batch_element_entry_api.create_batch_header (
1058 p_session_date=> l_sysdate,
1059 p_batch_name=> to_char(sysdate, 'DD-MM-RRRR HH24:MI:SS'),
1060 p_batch_status=> 'U',
1061 p_business_group_id=> l_bus_group_id,
1062 p_action_if_exists=> 'I',
1063 p_batch_reference=> l_reference_num,
1064 p_batch_source=> 'OTM',
1065 p_purge_after_transfer=> 'N',
1066 p_reject_if_future_changes=> 'N',
1067 p_batch_id=> l_batch_id,
1068 p_object_version_number=> l_object_version_number
1069 );
1070
1071 -- from the batch id, get the batch name
1072 IF p_batch_name IS NULL
1073 THEN
1074 hxt_user_exits.define_batch_name (
1075 l_batch_id,
1076 l_batch_name,
1077 l_error_text
1078 );
1079
1080 /* l_batch_id := hxt_time_gen.Get_Next_Batch_Id;
1081 IF l_batch_id = NULL THEN
1082 RETURN 2;
1083 END IF;
1084 --
1085 IF p_batch_name IS NULL THEN
1086 hxt_user_exits.Define_Batch_Name(l_batch_id, l_batch_name, l_error_text);*/
1087 ELSE
1088 l_batch_name := p_batch_name || 'R' || to_char(l_batch_id);
1089 END IF;
1090
1091 IF l_error_text <> NULL THEN
1092 RETURN 1;
1093 END IF;
1094
1095 /* INSERT INTO pay_batch_headers
1096 (batch_id,
1097 business_group_id,
1098 batch_name,
1099 batch_status,
1100 action_if_exists,
1101 batch_reference,
1102 batch_source,
1103 purge_after_transfer,
1104 reject_if_future_changes,
1105 created_by,
1106 creation_date)
1107 VALUES
1108 (l_batch_id,
1109 l_bus_group_id,
1110 l_batch_name,
1111 'U',
1112 'I',
1113 l_reference_num,
1114 'OTM',
1115 'N',
1116 'N',
1117 l_user_id,
1118 l_sysdate);*/
1119 --update the batch name
1120 pay_batch_element_entry_api.update_batch_header (
1121 p_session_date => l_sysdate,
1122 p_batch_id=> l_batch_id,
1123 p_object_version_number=> l_object_version_number,
1124 p_batch_name=> l_batch_name
1125 );
1126
1127 --COMMIT;
1128 o_batch_id := l_batch_id;
1129 return 0;
1130 END create_batch;
1131 --------------------------Gen Exception --------------------------
1132 PROCEDURE GEN_EXCEPTION
1133 (p_LOCATION IN VARCHAR2
1134 ,p_HXT_ERROR_MSG IN VARCHAR2
1135 ,p_ORACLE_ERROR_MSG IN VARCHAR2
1136 ,p_RESOLUTION IN VARCHAR2) IS
1137 l_EXCEP_seqno NUMBER; --- the next sequence number for new error record
1138 BEGIN
1139
1140 DEBUG(p_LOCATION || ' - ' || p_HXT_ERROR_MSG || ' : ' || p_ORACLE_ERROR_MSG ||
1141 ' => ' || p_RESOLUTION); --HXT115
1142 null;
1143 EXCEPTION WHEN OTHERS THEN
1144 null;
1145 END gen_exception;
1146 --
1147 --------------------------Build Cost Alloc Flex Entry --------------------------
1148 /******************************************************************
1149 build_cost_alloc_flex_entry()
1150 Select vital information from the fnd_id_flex_structures and
1151 fnd_id_flex_segments tables to build concatenated segments
1152 string using the segment values passed into this function.
1153 Then create a new entry to the pay_cost_allocation_keyflex table
1154 for the Cost Allocation Flexfield or retrieve the id of an existing
1155 one by calling the hr function hr_entry.maintain_cost_keyflex.
1156 ******************************************************************/
1157 FUNCTION build_cost_alloc_flex_entry(i_segment1 IN VARCHAR2,
1158 i_segment2 IN VARCHAR2,
1159 i_segment3 IN VARCHAR2,
1160 i_segment4 IN VARCHAR2,
1161 i_segment5 IN VARCHAR2,
1162 i_segment6 IN VARCHAR2,
1163 i_segment7 IN VARCHAR2,
1164 i_segment8 IN VARCHAR2,
1165 i_segment9 IN VARCHAR2,
1166 i_segment10 IN VARCHAR2,
1167 i_segment11 IN VARCHAR2,
1168 i_segment12 IN VARCHAR2,
1169 i_segment13 IN VARCHAR2,
1170 i_segment14 IN VARCHAR2,
1171 i_segment15 IN VARCHAR2,
1172 i_segment16 IN VARCHAR2,
1173 i_segment17 IN VARCHAR2,
1174 i_segment18 IN VARCHAR2,
1175 i_segment19 IN VARCHAR2,
1176 i_segment20 IN VARCHAR2,
1177 i_segment21 IN VARCHAR2,
1178 i_segment22 IN VARCHAR2,
1179 i_segment23 IN VARCHAR2,
1180 i_segment24 IN VARCHAR2,
1181 i_segment25 IN VARCHAR2,
1182 i_segment26 IN VARCHAR2,
1183 i_segment27 IN VARCHAR2,
1184 i_segment28 IN VARCHAR2,
1185 i_segment29 IN VARCHAR2,
1186 i_segment30 IN VARCHAR2,
1187 i_business_group_id IN NUMBER,
1188 io_keyflex_id IN OUT NOCOPY NUMBER,
1189 o_error_msg OUT NOCOPY VARCHAR2)
1190 -- p_mode IN VARCHAR2 default 'INSERT')
1191 RETURN NUMBER IS
1192
1193 /* This cursor selects Cost Allocation Flexfield info needed */
1194 /* to build an entry to pay_cost_allocation_keyflex */
1195
1196 CURSOR cost_cur IS
1197 SELECT fifs.concatenated_segment_delimiter,
1198 fifs.dynamic_inserts_allowed_flag,
1199 fifs.enabled_flag,
1200 fifs.freeze_flex_definition_flag
1201 FROM fnd_id_flex_structures fifs,
1202 per_business_groups_perf pbg
1203 WHERE fifs.id_flex_code = 'COST'
1204 AND fifs.application_id = 801
1205 AND pbg.business_group_id = i_business_group_id
1206 AND pbg.cost_allocation_structure = fifs.id_flex_num;
1207
1208 cost_rec cost_cur%ROWTYPE;
1209
1210 /* This cursor selects Cost Allocation Flexfield segments */
1211 /* that have been defined and are enabled and have been */
1212 /* qualified for element entry */
1213
1214 --CURSOR seg_cur IS
1215 --CURSOR seg_cur(c_id_flex_num NUMBER) IS
1216 -- SELECT seg.application_column_name,
1217 -- seg.display_size,
1218 -- seg.segment_num
1219 -- FROM fnd_id_flex_segments seg
1220 -- WHERE seg.id_flex_code = 'COST'
1221 -- AND seg.application_id = 801
1222 -- AND seg.id_flex_num = c_id_flex_num
1223 -- AND seg.application_column_name IN
1224 -- ('SEGMENT1','SEGMENT2','SEGMENT3','SEGMENT4','SEGMENT5',
1225 -- 'SEGMENT6','SEGMENT7','SEGMENT8','SEGMENT9','SEGMENT10',
1226 -- 'SEGMENT11','SEGMENT12','SEGMENT13','SEGMENT14','SEGMENT15',
1227 -- 'SEGMENT16','SEGMENT17','SEGMENT18','SEGMENT19','SEGMENT20',
1228 -- 'SEGMENT21','SEGMENT22','SEGMENT23','SEGMENT24','SEGMENT25',
1229 -- 'SEGMENT26','SEGMENT27','SEGMENT28','SEGMENT29','SEGMENT30')
1230 -- AND seg.enabled_flag = 'Y'
1231 -- AND EXISTS (SELECT 'X'
1232 -- FROM fnd_segment_attribute_values fsav
1233 -- WHERE fsav.id_flex_code = 'COST'
1234 -- AND fsav.application_id = 801
1235 -- AND fsav.id_flex_num = seg.id_flex_num
1236 -- AND fsav.application_column_name = seg.application_column_name
1237 -- AND fsav.attribute_value = 'Y')
1238 -- ORDER BY seg.segment_num;
1239
1240 /* This cursor checks to see if this particular segment combination already exists */
1241
1242 --CURSOR exist_flex_cur(c_concatenated_segments pay_cost_allocation_keyflex.concatenated_segments%TYPE)IS
1243 -- SELECT pcak.cost_allocation_keyflex_id
1244 -- FROM pay_cost_allocation_keyflex pcak
1245 -- WHERE pcak.concatenated_segments = c_concatenated_segments;
1246
1247 /* Cursor to generate a new Cost Allocation Keyflex Id */
1248
1249 --CURSOR flex_id_cur IS
1250 -- SELECT pay_cost_allocation_keyflex_s.nextval
1251 -- FROM sys.dual;
1252
1253 l_return_code NUMBER;
1254
1255 --l_concatenated_segments pay_cost_allocation_keyflex.concatenated_segments%TYPE DEFAULT NULL;
1256
1257 l_id_flex_num fnd_id_flex_structures.id_flex_num%TYPE;
1258 l_delimiter fnd_id_flex_structures.concatenated_segment_delimiter%TYPE;
1259 l_allowed fnd_id_flex_structures.dynamic_inserts_allowed_flag%TYPE;
1260 l_enabled fnd_id_flex_structures.enabled_flag%TYPE;
1261 l_frozen fnd_id_flex_structures.freeze_flex_definition_flag%TYPE;
1262
1263 --l_key_num VARCHAR2(32);
1264
1265 flex_not_found EXCEPTION;
1266 cost_flex_not_enabled EXCEPTION;
1267 cost_flex_not_frozen EXCEPTION;
1268 no_structure_found EXCEPTION;
1269
1270 BEGIN
1271
1272 pay_paywsqee_pkg.populate_context_items(i_business_group_id, l_id_flex_num);
1273
1274 IF l_id_flex_num IS NULL THEN
1275 RAISE no_structure_found;
1276 END IF;
1277 OPEN cost_cur;
1278 FETCH cost_cur
1279 INTO l_delimiter,
1280 l_allowed,
1281 l_enabled,
1282 l_frozen;
1283 IF cost_cur%NOTFOUND THEN
1284 RAISE flex_not_found;
1285 CLOSE cost_cur;
1286 END IF;
1287 CLOSE cost_cur;
1288
1289 IF l_enabled = 'N' THEN
1290 RAISE cost_flex_not_enabled;
1291 END IF;
1292
1293 IF l_frozen = 'N' THEN
1294 RAISE cost_flex_not_frozen;
1295 END IF;
1296
1297 --used new procedure hr_entry.maintain_cost_keyflex --2711607
1298
1299 io_keyflex_id:=
1300 hr_entry.maintain_cost_keyflex(
1301 p_cost_keyflex_structure => l_id_flex_num,
1302 p_cost_allocation_keyflex_id => -1,
1303 p_concatenated_segments => NULL,
1304 p_summary_flag => 'N',
1305 p_start_date_active => NULL,
1306 p_end_date_active => NULL,
1307 p_segment1 => i_segment1,
1308 p_segment2 => i_segment2,
1309 p_segment3 => i_segment3,
1310 p_segment4 => i_segment4,
1311 p_segment5 => i_segment5,
1312 p_segment6 => i_segment6,
1313 p_segment7 => i_segment7,
1314 p_segment8 => i_segment8,
1315 p_segment9 => i_segment9,
1316 p_segment10 => i_segment10,
1317 p_segment11 => i_segment11,
1318 p_segment12 => i_segment12,
1319 p_segment13 => i_segment13,
1320 p_segment14 => i_segment14,
1321 p_segment15 => i_segment15,
1322 p_segment16 => i_segment16,
1323 p_segment17 => i_segment17,
1324 p_segment18 => i_segment18,
1325 p_segment19 => i_segment19,
1326 p_segment20 => i_segment20,
1327 p_segment21 => i_segment21,
1328 p_segment22 => i_segment22,
1329 p_segment23 => i_segment23,
1330 p_segment24 => i_segment24,
1331 p_segment25 => i_segment25,
1332 p_segment26 => i_segment26,
1333 p_segment27 => i_segment27,
1334 p_segment28 => i_segment28,
1335 p_segment29 => i_segment29,
1336 p_segment30 => i_segment30);
1337
1338 RETURN 0;
1339 -------------------------------------------
1340 --commented as part of 2711607
1341 -- FOR seg_rec IN seg_cur(l_id_flex_num) LOOP
1342 -- IF seg_rec.application_column_name = 'SEGMENT1' THEN
1343 -- l_concatenated_segments := l_concatenated_segments || i_segment1 || l_delimiter;
1344 -- ELSIF seg_rec.application_column_name = 'SEGMENT2' THEN
1345 -- l_concatenated_segments := l_concatenated_segments || i_segment2 || l_delimiter;
1346 -- ELSIF seg_rec.application_column_name = 'SEGMENT3' THEN
1347 -- l_concatenated_segments := l_concatenated_segments || i_segment3 || l_delimiter;
1348 -- ELSIF seg_rec.application_column_name = 'SEGMENT4' THEN
1349 -- l_concatenated_segments := l_concatenated_segments || i_segment4 || l_delimiter;
1350 -- ELSIF seg_rec.application_column_name = 'SEGMENT5' THEN
1351 -- l_concatenated_segments := l_concatenated_segments || i_segment5 || l_delimiter;
1352 -- ELSIF seg_rec.application_column_name = 'SEGMENT6' THEN
1353 -- l_concatenated_segments := l_concatenated_segments || i_segment6 || l_delimiter;
1354 -- ELSIF seg_rec.application_column_name = 'SEGMENT7' THEN
1355 -- l_concatenated_segments := l_concatenated_segments || i_segment7 || l_delimiter;
1356 -- ELSIF seg_rec.application_column_name = 'SEGMENT8' THEN
1357 -- l_concatenated_segments := l_concatenated_segments || i_segment8 || l_delimiter;
1358 -- ELSIF seg_rec.application_column_name = 'SEGMENT9' THEN
1359 -- l_concatenated_segments := l_concatenated_segments || i_segment9 || l_delimiter;
1360 -- ELSIF seg_rec.application_column_name = 'SEGMENT10' THEN
1361 -- l_concatenated_segments := l_concatenated_segments || i_segment10 || l_delimiter;
1362 -- ELSIF seg_rec.application_column_name = 'SEGMENT11' THEN
1363 -- l_concatenated_segments := l_concatenated_segments || i_segment11 || l_delimiter;
1364 -- ELSIF seg_rec.application_column_name = 'SEGMENT12' THEN
1365 -- l_concatenated_segments := l_concatenated_segments || i_segment12 || l_delimiter;
1366 -- ELSIF seg_rec.application_column_name = 'SEGMENT13' THEN
1367 -- l_concatenated_segments := l_concatenated_segments || i_segment13 || l_delimiter;
1368 -- ELSIF seg_rec.application_column_name = 'SEGMENT14' THEN
1369 -- l_concatenated_segments := l_concatenated_segments || i_segment14 || l_delimiter;
1370 -- ELSIF seg_rec.application_column_name = 'SEGMENT15' THEN
1371 -- l_concatenated_segments := l_concatenated_segments || i_segment15 || l_delimiter;
1372 -- ELSIF seg_rec.application_column_name = 'SEGMENT16' THEN
1373 -- l_concatenated_segments := l_concatenated_segments || i_segment16 || l_delimiter;
1374 -- ELSIF seg_rec.application_column_name = 'SEGMENT17' THEN
1375 -- l_concatenated_segments := l_concatenated_segments || i_segment17 || l_delimiter;
1376 -- ELSIF seg_rec.application_column_name = 'SEGMENT18' THEN
1377 -- l_concatenated_segments := l_concatenated_segments || i_segment18 || l_delimiter;
1378 -- ELSIF seg_rec.application_column_name = 'SEGMENT19' THEN
1379 -- l_concatenated_segments := l_concatenated_segments || i_segment19 || l_delimiter;
1380 -- ELSIF seg_rec.application_column_name = 'SEGMENT20' THEN
1381 -- l_concatenated_segments := l_concatenated_segments || i_segment20 || l_delimiter;
1382 -- ELSIF seg_rec.application_column_name = 'SEGMENT21' THEN
1383 -- l_concatenated_segments := l_concatenated_segments || i_segment21 || l_delimiter;
1384 -- ELSIF seg_rec.application_column_name = 'SEGMENT22' THEN
1385 -- l_concatenated_segments := l_concatenated_segments || i_segment22 || l_delimiter;
1386 -- ELSIF seg_rec.application_column_name = 'SEGMENT23' THEN
1387 -- l_concatenated_segments := l_concatenated_segments || i_segment23 || l_delimiter;
1388 -- ELSIF seg_rec.application_column_name = 'SEGMENT24' THEN
1389 -- l_concatenated_segments := l_concatenated_segments || i_segment24 || l_delimiter;
1390 -- ELSIF seg_rec.application_column_name = 'SEGMENT25' THEN
1391 -- l_concatenated_segments := l_concatenated_segments || i_segment25 || l_delimiter;
1392 -- ELSIF seg_rec.application_column_name = 'SEGMENT26' THEN
1393 -- l_concatenated_segments := l_concatenated_segments || i_segment26 || l_delimiter;
1394 -- ELSIF seg_rec.application_column_name = 'SEGMENT27' THEN
1395 -- l_concatenated_segments := l_concatenated_segments || i_segment27 || l_delimiter;
1396 -- ELSIF seg_rec.application_column_name = 'SEGMENT28' THEN
1397 -- l_concatenated_segments := l_concatenated_segments || i_segment28 || l_delimiter;
1398 -- ELSIF seg_rec.application_column_name = 'SEGMENT29' THEN
1399 -- l_concatenated_segments := l_concatenated_segments || i_segment29 || l_delimiter;
1400 -- ELSIF seg_rec.application_column_name = 'SEGMENT30' THEN
1401 -- l_concatenated_segments := l_concatenated_segments || i_segment30 || l_delimiter;
1402 -- END IF;
1403 -- END LOOP;
1404
1405 /* Strip off a trailing delimiter if one exists */
1406 -- IF SUBSTR(l_concatenated_segments,-1) = l_delimiter THEN
1407 -- l_concatenated_segments := SUBSTR(l_concatenated_segments,0,LENGTH(l_concatenated_segments)-1);
1408 -- END IF;
1409
1410 /* Return NULL when no values exist */
1411 -- IF LTRIM(l_concatenated_segments, l_delimiter) IS NULL THEN
1412 -- io_keyflex_id := NULL;
1413 -- RETURN 0;
1414 -- END IF;
1415
1416 -- DEBUG('Concatenated Segments : ' || l_concatenated_segments);
1417
1418 /* Attempt to find a matching keyflex entry */
1419 -- OPEN exist_flex_cur(l_concatenated_segments);
1420 -- FETCH exist_flex_cur INTO io_keyflex_id;
1421
1422 /*When no match exists,create a new entry in pay_cost_allocation_keyflex */
1423 -- IF exist_flex_cur%NOTFOUND THEN
1424 -- CLOSE exist_flex_cur;
1425
1426 -- OPEN flex_id_cur;
1427 -- FETCH flex_id_cur INTO io_keyflex_id;
1428 -- CLOSE flex_id_cur;
1429
1430 -- INSERT INTO pay_cost_allocation_keyflex
1431 -- (cost_allocation_keyflex_id
1432 -- ,concatenated_segments
1433 -- ,id_flex_num
1434 -- ,last_update_date
1435 -- ,last_updated_by
1436 -- ,summary_flag
1437 -- ,enabled_flag
1438 -- ,start_date_active
1439 -- ,end_date_active
1440 -- ,segment1
1441 -- ,segment2
1442 -- ,segment3
1443 -- ,segment4
1444 -- ,segment5
1445 -- ,segment6
1446 -- ,segment7
1447 -- ,segment8
1448 -- ,segment9
1449 -- ,segment10
1450 -- ,segment11
1451 -- ,segment12
1452 -- ,segment13
1453 -- ,segment14
1454 -- ,segment15
1455 -- ,segment16
1456 -- ,segment17
1457 -- ,segment18
1458 -- ,segment19
1459 -- ,segment20
1460 -- ,segment21
1461 -- ,segment22
1462 -- ,segment23
1463 -- ,segment24
1464 -- ,segment25
1465 -- ,segment26
1466 -- ,segment27
1467 -- ,segment28
1468 -- ,segment29
1469 -- ,segment30)
1470 -- VALUES
1471 -- (io_keyflex_id
1472 -- ,l_concatenated_segments
1473 -- ,l_id_flex_num
1474 -- ,SYSDATE
1475 -- ,NULL
1476 -- ,'N'
1477 -- ,'Y'
1478 -- ,to_date('01-01-1900', 'DD-MM-YYYY') --fnd_date.chardate_to_date('1900/01/01')
1479 -- ,NULL
1480 -- ,i_segment1
1481 -- ,i_segment2
1482 -- ,i_segment3
1483 -- ,i_segment4
1484 -- ,i_segment5
1485 -- ,i_segment6
1486 -- ,i_segment7
1487 -- ,i_segment8
1488 -- ,i_segment9
1489 -- ,i_segment10
1490 -- ,i_segment11
1491 -- ,i_segment12
1492 -- ,i_segment13
1493 -- ,i_segment14
1494 -- ,i_segment15
1495 -- ,i_segment16
1496 -- ,i_segment17
1497 -- ,i_segment18
1498 -- ,i_segment19
1499 -- ,i_segment20
1500 -- ,i_segment21
1501 -- ,i_segment22
1502 -- ,i_segment23
1503 -- ,i_segment24
1504 -- ,i_segment25
1505 -- ,i_segment26
1506 -- ,i_segment27
1507 -- ,i_segment28
1508 -- ,i_segment29
1509 -- ,i_segment30);
1510 -- ELSE
1511 -- CLOSE exist_flex_cur;
1512 -- END IF;
1513
1514 -- RETURN 0;
1515
1516 EXCEPTION
1517 WHEN no_structure_found THEN
1518 FND_MESSAGE.SET_NAME('HXT','HXT_39470_CA_NOT_LOC_4_BUS_GRP');
1519 o_error_msg := FND_MESSAGE.GET;
1520 FND_MESSAGE.CLEAR;
1521 DEBUG('Cost Allocation Structure not located for this Business Group');
1522 RETURN 1;
1523 WHEN flex_not_found THEN
1524 FND_MESSAGE.SET_NAME('HXT','HXT_39471_CA_NOT_LOC_4_APP');
1525 o_error_msg := FND_MESSAGE.GET;
1526 FND_MESSAGE.CLEAR;
1527 DEBUG('Cost Allocation Flexfield not located for application 801');
1528 RETURN 1;
1529 WHEN cost_flex_not_enabled THEN
1530 FND_MESSAGE.SET_NAME('HXT','HXT_39472_CA_NOT_ENABLED');
1531 o_error_msg := FND_MESSAGE.GET;
1532 FND_MESSAGE.CLEAR;
1533 DEBUG('Cost Allocation Flexfield is not enabled');
1534 RETURN 1;
1535 WHEN cost_flex_not_frozen THEN
1536 FND_MESSAGE.SET_NAME('HXT','HXT_39473_CA_NOT_COMPILED');
1537 o_error_msg := FND_MESSAGE.GET;
1538 FND_MESSAGE.CLEAR;
1539 DEBUG('Cost Allocation Flexfield needs to be frozen and compiled');
1540 RETURN 1;
1541 WHEN OTHERS THEN
1542 o_error_msg := SQLERRM;
1543 DEBUG(SQLERRM); --HXT115
1544 RETURN 2;
1545
1546 END build_cost_alloc_flex_entry;
1547 --End COSTING
1548 --------------------------------------------PROCEDURE check_absence------------------------------------
1549 -- added 07/31/97 RDB
1550 PROCEDURE check_absence(
1551 P_assignment_id IN NUMBER,
1552 P_period_id IN NUMBER,
1553 P_tim_id IN NUMBER,
1554 P_calculation_date IN DATE,
1555 P_element_type_id IN NUMBER,
1556 P_hours IN NUMBER,
1557 P_net_amt OUT NOCOPY NUMBER,
1558 P_period_amt OUT NOCOPY NUMBER,
1559 P_available_amt OUT NOCOPY NUMBER,
1560 P_abs_status OUT NOCOPY NUMBER) IS
1561 --
1562 -- Updated 07-23-97 by RDB ... added EXTRA DATES AND CHANGED CALL FROM
1563 -- PAY_US_PTO_ACCRUAL.GET_NET_ACCRUAL TO
1564 -- TA_UTIL.TA_GET_NEXT_ACCRUAL.
1565 -- Procedure check_absence
1566 --
1567 -- Purpose
1568 -- Check the net accrual for a specific Absenece Element for sufficient hours
1569 -- in order to allow person to take hours requested. If enough, then return
1570 -- P_abs_status = 0; if not, then return P_abs_status = 1; if NO PTO Accrual Plan,
1571 -- then return P_abs_status = 2.
1572 --
1573 -- Arguments
1574 p_plan_id nuMBER;
1575 p_PLAN_NAME VARCHAR2(80);
1576 p_PLAN_ELEMENT_TYPE_ID NUMBER;
1577 p_PLAN_CATEGORY VARCHAR2(30);
1578 p_PLAN_CATEGORY_NAME VARCHAR2(80);
1579 p_PTO_ELEMENT_TYPE_ID NUMBER;
1580 p_PTO_ELEMENT_NAME VARCHAR2(80);
1581 p_PTO_INPUT_VALUE_ID NUMBER;
1582 p_PTO_INPUT_VALUE_NAME VARCHAR2(30);
1583 --
1584 -- Local Variables
1585 l_amount NUMBER;
1586 l_total_period_hrs NUMBER;
1587 --
1588 -- Get PTO ACCRUAL PLAN for Absence Element
1589 --
1590 CURSOR pto_plan (p_assignment_id NUMBER,
1591 p_calculation_date DATE) IS
1592 SELECT
1593 PAP.ACCRUAL_PLAN_ID,
1594 PAP.ACCRUAL_CATEGORY
1595 FROM
1596 PAY_ELEMENT_TYPES_F PETF,
1597 PAY_ELEMENT_CLASSIFICATIONS PEC,
1598 PAY_ELEMENT_ENTRIES_F PEEF,
1599 PAY_ELEMENT_LINKS_F PELF,
1600 PAY_ACCRUAL_PLANS PAP
1601 WHERE
1602 PEEF.ASSIGNMENT_ID=P_assignment_id
1603 AND PETF.CLASSIFICATION_ID=PEC.CLASSIFICATION_ID
1604 AND UPPER(PEC.CLASSIFICATION_NAME) LIKE UPPER('PTO Accrual%')
1605 AND PETF.ELEMENT_TYPE_ID=PELF.ELEMENT_TYPE_ID
1606 AND PEEF.ELEMENT_LINK_ID=PELF.ELEMENT_LINK_ID
1607 AND p_calculation_date BETWEEN PETF.EFFECTIVE_START_DATE
1608 AND PETF.EFFECTIVE_END_DATE
1609 AND PETF.ELEMENT_TYPE_ID = PAP.ACCRUAL_PLAN_ELEMENT_TYPE_ID;
1610
1611 --
1612 -- Total all hours for Absence Element for current pay period
1613 --
1614 CURSOR hr_amt(p_tim_id NUMBER,
1615 p_assignment_id NUMBER,
1616 p_element_type_id NUMBER) IS
1617 select sum(hrw.hours)
1618 from
1619 hxt_sum_hours_worked_x hrw
1620 where
1621 hrw.tim_id = p_tim_id
1622 and hrw.assignment_id = p_assignment_id
1623 and hrw.element_type_id = p_element_type_id;
1624
1625 --
1626 BEGIN
1627 --
1628 -- Initialize OUT variables;
1629 P_net_amt := NULL;
1630 P_period_amt := NULL;
1631 P_abs_status := NULL;
1632 P_available_amt := NULL;
1633 --
1634 -- Get PTO plan for element type passed
1635 --
1636 open pto_plan(p_assignment_id,
1637 p_calculation_date);
1638 --
1639 --
1640 fetch pto_plan into P_PLAN_ID,
1641 p_PLAN_CATEGORY;
1642 --
1643 close pto_plan;
1644 --
1645 IF p_PLAN_ID IS NULL THEN
1646 P_abs_status := 2; --- Element does not belong to an Accrual Plan
1647 ELSE
1648 --
1649 -- Get net Accrual plan amount
1650 --
1651 l_amount := PAY_US_PTO_ACCRUAL.GET_NET_ACCRUAL( P_assignment_id,
1652 P_calculation_date,
1653 P_plan_id,
1654 P_plan_category);
1655
1656 --
1657 P_net_amt := l_amount;
1658 --
1659 -- Get total Absence Element hours for current pay period
1660 --
1661 open hr_amt(p_tim_id,p_assignment_id,p_element_type_id);
1662 --
1663 fetch hr_amt into l_total_period_hrs;
1664
1665
1666 --
1667 close hr_amt;
1668 --
1669 -- Total Absence Element hours for current pay period
1670 --
1671
1672 IF l_total_period_hrs IS NULL THEN
1673 l_total_period_hrs := 0;
1674 END IF;
1675
1676 P_period_amt := l_total_period_hrs;
1677
1678
1679 l_total_period_hrs := l_total_period_hrs + p_hours;
1680 --
1681 -- Calculate net Accrual available if all Absence Elements are taken
1682 P_available_amt := l_amount - l_total_period_hrs;
1683 --
1684 -- Check that Hours to be charge to this Accrual plan are available to take
1685 --
1686 IF l_total_period_hrs <= l_amount THEN
1687 P_abs_status := 0;
1688 ELSE
1689 -- P_abs_status := 1;
1690 P_abs_status := 0;
1691 END IF;
1692 END IF;
1693 --
1694 EXCEPTION
1695 WHEN others THEN
1696 P_abs_status := 3;
1697 --
1698 END CHECK_ABSENCE;
1699 FUNCTION accrual_exceeded( p_tim_id IN NUMBER,
1700 P_calculation_date IN DATE,
1701 P_accrual_plan_name OUT NOCOPY VARCHAR2,
1702 P_accrued_hrs OUT NOCOPY NUMBER,
1703 P_charged_hrs OUT NOCOPY NUMBER) return BOOLEAN IS
1704
1705 -- get all accrual plans for all assignments on this timecard
1706 CURSOR plan_cur (p_assignment_id NUMBER) is
1707 SELECT vap.assignment_id, vap.accrual_plan_id, vap.accrual_plan_name,
1708 vap.accrual_category, vap.business_group_id
1709 FROM pay_view_accrual_plans_v vap
1710 WHERE vap.assignment_id = p_assignment_id
1711 AND p_calculation_date BETWEEN vap.asg_effective_start_date
1712 AND vap.asg_effective_end_date
1713 AND p_calculation_date BETWEEN vap.iv_effective_start_date
1714 AND vap.iv_effective_end_date
1715 AND p_calculation_date BETWEEN vap.e_entry_effective_start_date
1716 AND vap.e_entry_effective_end_date
1717 AND p_calculation_date BETWEEN vap.e_type_effective_start_date
1718 AND vap.e_type_effective_end_date
1719 AND p_calculation_date BETWEEN vap.e_link_effective_start_date
1720 AND vap.e_link_effective_end_date;
1721
1722 CURSOR get_asg_id ( p_tim_id NUMBER, p_calculation_date DATE ) IS
1723 SELECT DISTINCT (assignment_id)
1724 FROM hxt_sum_hours_worked_f
1725 WHERE tim_id = p_tim_id
1726 AND DATE_WORKED=p_calculation_date
1727 AND SYSDATE BETWEEN effective_start_date AND effective_end_date;
1728
1729
1730 -- get total on this timecard for all elements in the
1731 -- net calculation rules for this accrual plan
1732 CURSOR tc_tot_by_net_calc(p_tim_id NUMBER,
1733 p_assignment_id NUMBER,
1734 p_accrual_plan_id NUMBER,
1735 p_bus_group_id NUMBER) IS
1736 -- Bug 6785744
1737 -- Changed the query to look at the base tables instead of the
1738 -- view. The view was over multiple TL tables and was adding
1739 -- to the perf issues here.
1740 -- We may make the same changes to the below cursor for retro total too.
1741
1742 /*
1743 SELECT sum(hrw.hours*(-1)*(ncr.add_or_subtract))
1744 FROM hxt_sum_hours_worked_f hrw,
1745 pay_net_calculation_rules_v ncr
1746 WHERE hrw.tim_id = p_tim_id
1747 and SYSDATE between hrw.effective_start_date
1748 and hrw.effective_end_date
1749 AND hrw.assignment_id = p_assignment_id
1750 AND ncr.business_group_id +0 = p_bus_group_id
1751 AND ncr.accrual_plan_id = p_accrual_plan_id
1752 AND ncr.element_type_id = hrw.element_type_id;
1753 */
1754
1755 SELECT /*+ ORDERED */
1756 SUM(hrw.hours*(-1)*(ncr.add_or_subtract))
1757 FROM hxt_sum_hours_worked_f hrw,
1758 pay_element_types_f pef,
1759 pay_input_values_f piv,
1760 pay_net_calculation_rules ncr
1761 WHERE hrw.tim_id = p_tim_id
1762 AND SYSDATE BETWEEN hrw.effective_start_date
1763 AND hrw.effective_end_date
1764 AND hrw.assignment_id = p_assignment_id
1765 AND pef.element_type_id = hrw.element_type_id
1766 AND SYSDATE BETWEEN pef.effective_start_date
1767 AND pef.effective_end_date
1768 AND piv.element_type_id = pef.element_type_id
1769 AND SYSDATE BETWEEN piv.effective_start_date
1770 AND piv.effective_end_date
1771 AND piv.input_value_id = ncr.input_value_id
1772 AND ncr.business_group_id +0 = p_bus_group_id
1773 AND ncr.accrual_plan_id = p_accrual_plan_id ;
1774
1775
1776 cursor get_max_retro_batch is
1777 select max(batch_id) from pay_batch_headers pbh
1778 where pbh.batch_status='T'
1779 and pbh.batch_id in (select distinct retro_batch_id from hxt_det_hours_worked_f
1780 where tim_id=p_tim_id);
1781
1782
1783 cursor chk_retro_batch_status is
1784 select batch_id from pay_batch_headers pbh
1785 where pbh.batch_status='T'
1786 and pbh.batch_id in (select distinct retro_batch_id from hxt_det_hours_worked_f
1787 where tim_id=p_tim_id);
1788
1789
1790 cursor chk_original_batch_status is
1791 select null from pay_batch_headers pbh
1792 where pbh.batch_status='T'
1793 and pbh.batch_id in (select distinct batch_id from hxt_timecards_f
1794 where id=p_tim_id);
1795
1796 cursor get_retro_total( p_tim_id NUMBER,
1797 p_assignment_id NUMBER,
1798 p_accrual_plan_id NUMBER,
1799 p_bus_group_id NUMBER,
1800 p_batch_id number) is
1801 SELECT nvl(sum(det.hours*(-1)*(ncr.add_or_subtract)),0)
1802 FROM hxt_det_hours_worked_f det,
1803 pay_net_calculation_rules_v ncr
1804 WHERE det.tim_id = p_tim_id
1805 AND det.assignment_id = p_assignment_id
1806 AND ncr.business_group_id = p_bus_group_id
1807 AND ncr.accrual_plan_id = p_accrual_plan_id
1808 AND ncr.element_type_id = det.element_type_id
1809 AND det.retro_batch_id=p_batch_id;
1810
1811 cursor get_org_total( p_tim_id NUMBER,
1812 p_assignment_id NUMBER,
1813 p_accrual_plan_id NUMBER,
1814 p_bus_group_id NUMBER) is
1815 SELECT nvl(sum(det.hours*(-1)*(ncr.add_or_subtract)),0)
1816 FROM hxt_det_hours_worked_f det,
1817 pay_net_calculation_rules_v ncr
1818 WHERE det.tim_id = p_tim_id
1819 AND det.assignment_id = p_assignment_id
1820 AND ncr.business_group_id = p_bus_group_id
1821 AND ncr.accrual_plan_id = p_accrual_plan_id
1822 AND ncr.element_type_id = det.element_type_id
1823 AND det.retro_batch_id is null;
1824
1825
1826
1827
1828 l_charged_hrs NUMBER(7,3);
1829 l_accrued_hrs NUMBER(7,3);
1830 l_batch_id NUMBER;
1831 l_old_total NUMBER;
1832
1833 l_asg_id per_all_assignments_f.assignment_id%TYPE;
1834
1835
1836 BEGIN
1837
1838 OPEN get_asg_id ( p_tim_id, p_calculation_date);
1839 FETCH get_asg_id INTO l_asg_id;
1840 CLOSE get_asg_id;
1841
1842 FOR rec_plan IN plan_cur(l_asg_id) LOOP
1843 -- Get net Accrual plan amount
1844 --
1845 OPEN tc_tot_by_net_calc(p_tim_id,
1846 rec_plan.assignment_id,
1847 rec_plan.accrual_plan_id,
1848 rec_plan.business_group_id);
1849 FETCH tc_tot_by_net_calc into l_charged_hrs;
1850 CLOSE tc_tot_by_net_calc;
1851
1852 l_batch_id:=0;
1853 l_old_total:=0;
1854
1855 --check if timecard has been retro edited and is transferred to payroll
1856
1857 open chk_retro_batch_status ;
1858 fetch chk_retro_batch_status into l_batch_id;
1859
1860 if chk_retro_batch_status %notfound then
1861
1862 -- if timecard has been retro edited but not transferred to payroll
1863 -- or it is new timecard
1864
1865 l_batch_id :=0;
1866 open chk_original_batch_status ;
1867 fetch chk_original_batch_status into l_batch_id;
1868 if chk_original_batch_status %notfound then
1869 --it is new timecard
1870 l_batch_id :=0;
1871 end if;
1872 close chk_original_batch_status ;
1873 else
1874
1875 -- since the retro batch exists get the last batch_id
1876
1877 open get_max_retro_batch ;
1878 fetch get_max_retro_batch into l_batch_id;
1879 close get_max_retro_batch ;
1880 end if;
1881 close chk_retro_batch_status ;
1882
1883
1884
1885 if(l_batch_id is not null ) then
1886
1887 -- get the hours corresponding to retro batch
1888
1889 open get_retro_total(p_tim_id,
1890 rec_plan.assignment_id,
1891 rec_plan.accrual_plan_id,
1892 rec_plan.business_group_id,
1893 l_batch_id);
1894 fetch get_retro_total into l_old_total;
1895
1896 if(get_retro_total%notfound) then
1897 l_old_total:=0;
1898 end if;
1899 close get_retro_total;
1900
1901 else
1902 -- get the hours corresponding to non retro timecard
1903
1904 open get_org_total(p_tim_id,
1905 rec_plan.assignment_id,
1906 rec_plan.accrual_plan_id,
1907 rec_plan.business_group_id);
1908 fetch get_org_total into l_old_total;
1909 if(get_org_total%notfound) then
1910 l_old_total:=0;
1911 end if;
1912 close get_org_total;
1913 end if;
1914
1915 if l_charged_hrs <> 0 then
1916 l_accrued_hrs :=
1917 pay_us_pto_accrual.get_net_accrual( rec_plan.assignment_id,
1918 p_calculation_date,
1919 rec_plan.accrual_plan_id ,
1920 -- rec_plan.accrual_category);
1921 NULL);
1922 if nvl((l_charged_hrs-l_old_total),0) > l_accrued_hrs then
1923 p_accrual_plan_name := rec_plan.accrual_plan_name;
1924 p_charged_hrs := l_charged_hrs;
1925 p_accrued_hrs := l_accrued_hrs;
1926 return TRUE;
1927 end if;
1928 end if;
1929 END LOOP;
1930
1931 RETURN FALSE;
1932 END;
1933
1934 --BEGIN SIR450
1935 FUNCTION get_costable_type(p_element_type_id IN NUMBER,
1936 p_date_worked IN DATE,
1937 p_assignment_id IN NUMBER) return VARCHAR2 IS
1938
1939 CURSOR cur_costable_type IS
1940 SELECT pel.costable_type
1941 FROM pay_element_links_f pel,
1942 per_assignments_f asm
1943 WHERE asm.assignment_id = p_assignment_id
1944 AND p_date_worked BETWEEN asm.effective_start_date
1945 AND asm.effective_end_date
1946 AND nvl(pel.organization_id,nvl(asm.organization_id,-1)) = nvl(asm.organization_id,-1)
1947 AND (pel.people_group_id IS NULL
1948 OR exists (SELECT 'X'
1949 FROM pay_assignment_link_usages_f usage
1950 WHERE usage.assignment_id = asm.assignment_id
1951 AND usage.element_link_id = pel.element_link_id
1952 AND p_date_worked BETWEEN usage.effective_start_date
1953 AND usage.effective_end_date))
1954 AND nvl(pel.job_id, nvl(asm.job_id,-1)) = nvl(asm.job_id,-1)
1955 AND nvl(pel.position_id, nvl(asm.position_id,-1)) = nvl(asm.position_id,-1)
1956 AND nvl(pel.grade_id,nvl(asm.grade_id,-1)) = nvl(asm.grade_id,-1)
1957 AND nvl(pel.location_id,nvl(asm.location_id,-1)) = nvl(asm.location_id,-1)
1958 AND nvl(pel.payroll_id,nvl(asm.payroll_id,-1)) = nvl(asm.payroll_id,-1)
1959 AND nvl(pel.employment_category,nvl(asm.employment_category,-1)) = nvl(asm.employment_category,-1)
1960 AND nvl(pel.pay_basis_id,nvl(asm.pay_basis_id,-1)) = nvl(asm.pay_basis_id,-1)
1961 AND nvl(pel.business_group_id,nvl(asm.business_group_id,-1)) = nvl(asm.business_group_id,-1)
1962 AND p_date_worked BETWEEN pel.effective_start_date
1963 AND pel.effective_end_date
1964 AND pel.element_type_id = p_element_type_id;
1965
1966 l_costable_type VARCHAR2(30);
1967
1968 BEGIN
1969 OPEN cur_costable_type;
1970 FETCH cur_costable_type into l_costable_type;
1971 RETURN(l_costable_type);
1972 EXCEPTION
1973 WHEN others THEN
1974 RETURN('?');
1975 END get_costable_type;
1976
1977 /********************************************************************
1978 * PROCEDURE SET_TIMECARD_ERROR -- ER178 SDM 09-03-98 *
1979 * *
1980 * Purpose *
1981 * Retrieve Error Type From QUICK CODES then value is used to *
1982 * inserting record in HXT_ERRORS table when an error is found *
1983 * regarding Timecard, summary, detailed Hours Worked orPay *
1984 * Period record.of hxt_errors. *
1985 * *
1986 * Arguments *
1987 * p_PBD_ID - The source of the error is the BATCH record *
1988 * p_TIM_ID - The source of the error is the TIMECARD record *
1989 * p_HRW_ID - The source of the error is the Hours Worked record *
1990 * p_PTP_ID - The source of the error is the TIME PERIOD RECORD. *
1991 * p_ERROR_MSG - the error message to show the user *
1992 * p_LOCATION - the Procedure or Source *
1993 * p_ORA_MSG - the ORACLE error number and message if any *
1994 * *
1995 ********************************************************************/
1996 Procedure SET_TIMECARD_ERROR (p_PPB_ID IN NUMBER,
1997 p_TIM_ID IN NUMBER,
1998 p_HRW_ID IN NUMBER,
1999 p_PTP_ID IN NUMBER,
2000 p_ERROR_MSG IN OUT NOCOPY VARCHAR2,
2001 p_LOCATION IN VARCHAR2,
2002 p_ORA_MSG IN VARCHAR2,
2003 p_LOOKUP_CODE IN VARCHAR2,
2004 p_valid OUT NOCOPY VARCHAR,
2005 p_msg_level OUT NOCOPY VARCHAR2) IS
2006
2007 CURSOR tim_dates is
2008 SELECT effective_start_date,
2009 effective_end_date
2010 FROM HXT_TIMECARDS_X
2011 WHERE id = p_tim_id;
2012
2013
2014 -- Local Variables
2015 l_CREATION_DATE DATE; --- the date time of the error
2016 l_CREATED_BY NUMBER; --- the user logged in when the error occurred
2017 l_EXCEP_seqno NUMBER; --- the next sequence number for new error record
2018 l_error_msg VARCHAR2(240);
2019 l_error VARCHAR2(240);
2020 l_meaning VARCHAR2(80);
2021 l_type VARCHAR2(80); --- Error type either 'ERR', 'WRN' or 'SKIP'
2022 l_eff_start DATE;
2023 l_eff_end DATE;
2024 l_person_id NUMBER; -- ER230
2025 l_payroll_id NUMBER; -- ER230
2026 --
2027 --
2028 BEGIN
2029
2030 OPEN tim_dates;
2031 FETCH tim_dates into l_eff_start, l_eff_end;
2032 if tim_dates%FOUND then
2033 get_quick_codes(p_lookup_code,
2034 'HXT_TIMECARD_VALIDATION',
2035 808,
2036 l_meaning,
2037 l_type);
2038
2039 -- GPM v115.17
2040
2041 -- we need to check whether or not the lookup code
2042 -- has changed since now the lookup type is 'User'
2043
2044 IF ( l_meaning = 'XXX' )
2045 THEN
2046
2047 -- the USER has modified the lookup_code
2048
2049 fnd_message.set_name('PAY', 'HR_6153_ALL_PROCEDURE_FAIL');
2050 fnd_message.set_token('PROCEDURE', 'HXTUTL');
2051 fnd_message.set_token('STEP','Invalid HXT_TIMECARD_VALIDATION-'||p_lookup_code);
2052 fnd_message.raise_error;
2053
2054
2055 ELSE
2056
2057 FND_MESSAGE.SET_NAME('HXT',l_meaning);
2058 p_error_msg := FND_MESSAGE.GET;
2059 IF l_type = 'SKIP' THEN
2060 p_msg_level := ' ';
2061 p_valid := ' ';
2062 RETURN;
2063 ELSIF l_type = 'ERR' THEN
2064 FND_MESSAGE.SET_NAME('HXT','HXT_39503_QUICK_CODE_STOP');
2065 l_error_msg := FND_MESSAGE.GET || p_error_msg;
2066 p_msg_level := 'E';
2067 ELSIF l_type = 'WRN' THEN
2068 FND_MESSAGE.SET_NAME('HXT','HXT_39504_QUICK_CODE_WARN');
2069 l_error_msg := FND_MESSAGE.GET || p_error_msg;
2070 p_msg_level := 'W';
2071 ELSE
2072 FND_MESSAGE.SET_NAME('HXT','HXT_39505_INVALID_QUICK_CODE');
2073 l_error_msg := FND_MESSAGE.GET;
2074 l_type := 'ERR';
2075 p_msg_level := 'E';
2076 END IF;
2077
2078 p_valid := 'N';
2079
2080 SELECT hxt_seqno.nextval
2081 INTO l_EXCEP_seqno
2082 FROM dual;
2083 l_CREATED_BY := FND_GLOBAL.user_id;
2084 l_person_id := GetPersonID(p_TIM_ID); -- ER230
2085 l_payroll_id := GetPayrollID(p_PTP_ID); -- ER230
2086
2087 insert into hxt_errors_f(
2088 id,
2089 error_msg,
2090 creation_date,
2091 location,
2092 created_by,
2093 err_type,
2094 PPB_ID,
2095 TIM_ID,
2096 HRW_ID,
2097 PTP_ID,
2098 ora_message,
2099 EFFECTIVE_START_DATE,
2100 EFFECTIVE_END_DATE
2101 ,PERSON_ID --ER230
2102 ,PAYROLL_ID --ER230
2103 )
2104 values(l_EXCEP_seqno,
2105 substr(nvl(l_ERROR_MSG,'NOTPROVIDED'),1,239),
2106 sysdate,
2107 substr(nvl(p_LOCATION,'NOTPROVIDED'),1,119),
2108 nvl(l_CREATED_BY,-1),
2109 l_TYPE,
2110 p_PPB_id,
2111 p_TIM_id,
2112 p_HRW_ID,
2113 p_PTP_ID,
2114 substr(p_ORA_MSG,1,119),
2115 nvl(l_eff_start,sysdate),
2116 nvl(l_eff_end,hr_general.end_of_time)
2117 ,l_Person_ID /* ER230 */
2118 ,l_Payroll_ID /* ER230 */
2119 );
2120 END IF;
2121
2122 CLOSE tim_dates;
2123
2124 END IF; -- l_meaning = 'XXX'
2125
2126 EXCEPTION
2127 WHEN others THEN
2128 l_error := SQLERRM;
2129
2130 FND_MESSAGE.SET_NAME('HXT','HXT_39469_ERR_INS_HXT_ERR');
2131 insert into hxt_errors_f(
2132 id,
2133 error_msg,
2134 creation_date,
2135 location,
2136 created_by,
2137 err_type,
2138 PPB_ID,
2139 TIM_ID,
2140 HRW_ID,
2141 PTP_ID,
2142 ora_message,
2143 EFFECTIVE_START_DATE,
2144 EFFECTIVE_END_DATE)
2145 values(l_EXCEP_seqno,
2146 FND_MESSAGE.GET
2147 ||nls_initcap(substr(p_error_msg,1,100)),
2148 sysdate,
2149 'SET_TIMECARD_ERROR',
2150 -1,
2151 'NEW',
2152 NULL,
2153 NULL,
2154 NULL,
2155 NULL,
2156 l_error,
2157 nvl(l_eff_start,sysdate),
2158 nvl(l_eff_end,hr_general.end_of_time)
2159 );
2160
2161 END SET_TIMECARD_ERROR;
2162
2163 /********************************************************************
2164 * PROCEDURE GET_QUICK_CODES -- ER178 SDM 09-03-98 *
2165 * *
2166 * Purpose *
2167 * Retrieve Values from QUICK CODES and retrun values *
2168 * *
2169 * Arguments *
2170 * Inputs *
2171 * p_lookup_code *
2172 * p_lookup_type *
2173 * p_application_id *
2174 * Outputs: *
2175 * p_lookup_meaning *
2176 * p_TAG *
2177 * *
2178 ********************************************************************/
2179
2180 Procedure GET_QUICK_CODES(p_lookup_code IN VARCHAR2,
2181 p_lookup_type IN VARCHAR2,
2182 p_application_id IN NUMBER,
2183 p_lookup_meaning OUT NOCOPY VARCHAR2,
2184 p_lookup_description OUT NOCOPY VARCHAR2) is
2185
2186 CURSOR quick_codes IS
2187 select
2188 meaning,
2189 UPPER(TAG)
2190 FROM fnd_lookup_values
2191 WHERE lookup_code = p_lookup_code
2192 AND SYSDATE BETWEEN NVL(start_date_active, SYSDATE)
2193 AND NVL(end_date_active, SYSDATE)
2194 AND LANGUAGE = userenv('LANG')
2195 AND VIEW_APPLICATION_ID = 3
2196 AND SECURITY_GROUP_ID = fnd_global.lookup_security_group(LOOKUP_TYPE,VIEW_APPLICATION_ID)
2197 AND enabled_flag = 'Y'
2198 AND lookup_type = p_lookup_type;
2199
2200 BEGIN
2201 OPEN quick_codes;
2202 FETCH quick_codes into p_lookup_meaning, p_lookup_description;
2203 IF quick_codes%notfound then
2204 p_lookup_meaning := 'XXX';
2205 p_lookup_description := 'XXX';
2206 END IF;
2207 CLOSE quick_codes;
2208
2209 END get_quick_codes;
2210
2211 FUNCTION GetPersonID(p_TIM_ID NUMBER) RETURN NUMBER IS
2212 cursor person_cur(c_tim_id NUMBER) is
2213 select tim.for_person_id
2214 from hxt_timecards_x tim
2215 where tim.id = c_tim_id;
2216
2217 l_person_id NUMBER := NULL;
2218
2219 BEGIN
2220 if p_tim_id is null then
2221 return null;
2222 end if;
2223 open person_cur(p_tim_id);
2224 fetch person_cur into l_person_id;
2225 close person_cur;
2226 return l_person_id;
2227 END GetPersonID;
2228
2229
2230 FUNCTION GetPayrollID(p_PTP_ID NUMBER) RETURN NUMBER IS
2231
2232 cursor payroll_cur(c_ptp_id NUMBER) is
2233 select ptp.payroll_id
2234 from per_time_periods ptp
2235 where ptp.time_period_id = c_ptp_id;
2236
2237 l_payroll_id NUMBER := NULL;
2238
2239 BEGIN
2240 if p_ptp_id is null then
2241 return null;
2242 end if;
2243 open payroll_cur(p_ptp_id);
2244 fetch payroll_cur into l_payroll_id;
2245 close payroll_cur;
2246 return l_payroll_id;
2247 END GetPayrollID;
2248
2249 PROCEDURE check_batch_states(P_BATCH_ID IN NUMBER) --3739107
2250 IS
2251 CURSOR c_chk_tc_exists
2252 IS
2253 SELECT 'Y'
2254 FROM pay_batch_headers pbh
2255 WHERE pbh.batch_status <> 'T'
2256 AND pbh.batch_id = p_batch_id
2257 AND EXISTS ((SELECT HTF.batch_id
2258 FROM hxt_timecards_f HTF
2259 WHERE HTF.batch_id = pbh.batch_id)
2260 UNION
2261 (SELECT hdhw.retro_batch_id
2262 FROM hxt_det_hours_worked_f hdhw
2263 WHERE hdhw.retro_batch_id = pbh.batch_id));
2264 l_dummy VARCHAR2 (1);
2265 BEGIN
2266 g_debug :=hr_utility.debug_enabled;
2267 --hr_utility.trace_on(null,'Y');
2268 if g_debug then
2269 hr_utility.trace('inside def');
2270 end if;
2271 OPEN c_chk_tc_exists;
2272 FETCH c_chk_tc_exists INTO l_dummy;
2273
2274 IF (c_chk_tc_exists%FOUND)
2275 THEN
2276 if g_debug then
2277 hr_utility.trace('inside def1');
2278 end if;
2279 HR_UTILITY.SET_MESSAGE(808, 'HXT_39144_CANT_DELETE_BATCH'); --This message is
2280 --not the actuall message, it is just meant for testing purpose
2281 CLOSE c_chk_tc_exists;
2282 hr_utility.raise_error;
2283
2284 END IF;
2285 CLOSE c_chk_tc_exists;
2286 END check_batch_states;
2287
2288
2289
2290 FUNCTION get_week_day(p_date in Date ) RETURN varchar2 IS
2291
2292 cursor weekday_cur(c_date Date) is
2293 select DECODE (MOD (trunc(p_date)-trunc(hr_general.START_OF_TIME),7),
2294 0,'SAT',
2295 1,'SUN',
2296 2,'MON',
2297 3,'TUE',
2298 4,'WED',
2299 5,'THU',
2300 6,'FRI'
2301 )
2302 from dual;
2303
2304
2305
2306 l_week_day varchar2(80) := NULL;
2307 BEGIN
2308 if p_date is null then
2309 return null;
2310 end if;
2311 open weekday_cur(p_date);
2312 fetch weekday_cur into l_week_day;
2313 close weekday_cur;
2314 return l_week_day;
2315
2316 END get_week_day;
2317
2318 FUNCTION is_valid_time_entry (
2319 p_raw_time_in IN hxt_det_hours_worked_f.time_in%TYPE,
2320 p_rounded_time_in IN hxt_det_hours_worked_f.time_in%TYPE,
2321 p_raw_time_out IN hxt_det_hours_worked_f.time_in%TYPE,
2322 p_rounded_time_out IN hxt_det_hours_worked_f.time_in%TYPE
2323 )
2324 RETURN BOOLEAN AS
2325
2326 l_proc VARCHAR2 (30) ;
2327 l_valid_entry BOOLEAN := TRUE;
2328 c_hours_format CONSTANT VARCHAR2 (6) := 'HH24MI';
2329
2330 BEGIN
2331
2332 g_debug :=hr_utility.debug_enabled;
2333 if g_debug then
2334 l_proc := 'is_valid_time_entry';
2335
2336 hr_utility.set_location ( 'Entering: ' || l_proc, 10);
2337 end if;
2338
2339 IF ( ( (TO_CHAR (p_raw_time_in, c_hours_format) <
2340 TO_CHAR (p_raw_time_out, c_hours_format)
2341 )
2342 AND (TO_CHAR (p_rounded_time_in, c_hours_format) >
2343 TO_CHAR (p_rounded_time_out, c_hours_format)
2344 )
2345 )
2346 OR ( (TO_CHAR (p_raw_time_in, c_hours_format) >
2347 TO_CHAR (p_raw_time_out, c_hours_format)
2348 )
2349 AND (TO_CHAR (p_rounded_time_in, c_hours_format) <
2350 TO_CHAR (p_rounded_time_out, c_hours_format)
2351 ) ) ) THEN
2352 if g_debug then
2353 hr_utility.set_location ( 'Invalid entry: ' || l_proc, 20);
2354 end if;
2355 l_valid_entry := FALSE;
2356 ELSE
2357 if g_debug then
2358 hr_utility.set_location ( 'Valid entry: ' || l_proc, 30);
2359 end if;
2360 l_valid_entry := TRUE;
2361 END IF;
2362
2363 if g_debug then
2364 hr_utility.set_location ( 'Leaving: ' || l_proc, 100);
2365 end if;
2366
2367 RETURN l_valid_entry;
2368
2369 END is_valid_time_entry;
2370
2371
2372 PROCEDURE check_timecard_exists (p_person_id IN NUMBER)
2373 IS
2374 CURSOR csr_chk_tc_exists_hxt
2375 IS
2376 SELECT 'Y'
2377 FROM hxt_timecards_f
2378 WHERE for_person_id = p_person_id;
2379
2380
2381 CURSOR csr_chk_tc_exists_ss
2382 IS
2383 SELECT 'Y'
2384 FROM hxc_time_building_blocks
2385 WHERE resource_id = p_person_id
2386 AND date_to=hr_general.end_of_time
2387 AND ROWNUM<2;
2388
2389 l_dummy VARCHAR2 (1);
2390 BEGIN
2391 OPEN csr_chk_tc_exists_hxt;
2392 FETCH csr_chk_tc_exists_hxt INTO l_dummy;
2393
2394 IF (csr_chk_tc_exists_hxt%FOUND)
2395 THEN
2396 CLOSE csr_chk_tc_exists_hxt;
2397 hr_utility.set_message (808, 'HXT_CANT_DEL_PERSON');
2398 hr_utility.raise_error;
2399 ElSE
2400
2401 CLOSE csr_chk_tc_exists_hxt;
2402
2403 OPEN csr_chk_tc_exists_ss;
2404 FETCH csr_chk_tc_exists_ss INTO l_dummy;
2405
2406 IF (csr_chk_tc_exists_ss%FOUND)
2407 THEN
2408 CLOSE csr_chk_tc_exists_ss;
2409 hr_utility.set_message (808, 'HXT_CANT_DEL_PERSON');
2410 hr_utility.raise_error;
2411 END IF;
2412
2413 CLOSE csr_chk_tc_exists_ss;
2414
2415 END IF;
2416 END check_timecard_exists;
2417
2418
2419 --end ER230
2420 --END HXT11i1
2421
2422 END hxt_util;