1 package body PAY_INPUT_VALUES_PKG as
2 /* $Header: pyipv.pkb 120.5 2007/10/25 12:44:40 ckesanap noship $ */
3 -- Declare global variables and cursors
4
5 -- Dummy variable for selecting into when not interested in value of result
6 g_dummy number(30);
7 --
8 g_element_type_id number(15); -- For validating translation.
9 --
10 -- The end of time for date effective records
11 c_end_of_time constant date := to_date ('31/12/4712','DD/MM/YYYY');
12 c_user_id number;
13 c_login_id number;
14
15 -------------------------------------------------------------------------------
16 PROCEDURE set_translation_globals(p_element_type_id IN NUMBER) IS
17 BEGIN
18 g_element_type_id := p_element_type_id;
19 END;
20 -------------------------------------------------------------------------------
21 procedure validate_translation(input_value_id IN NUMBER,
22 language IN VARCHAR2,
23 input_name IN VARCHAR2) IS
24 /*
25
26 This procedure fails if a input value translation is already present in
27 the table for a given language. Otherwise, no action is performed. It is
28 used to ensure uniqueness of translated input value names.
29
30 */
31
32 --
33 -- This cursor implements the validation we require,
34 -- but this will only work if the record exists in the db already,
35 -- and we have a primary key id. Note: The legislation code column
36 -- can be null, hence use a decode and NVL - this also applies to the
37 -- business group column.
38 --
39 cursor c_translation(p_language IN VARCHAR2,
40 p_input_name IN VARCHAR2,
41 p_input_value_id IN NUMBER) IS
42 SELECT 1
43 FROM pay_input_values_f_tl inptl,
44 pay_input_values_f inp
45 WHERE upper(inptl.name) = upper(p_input_name)
46 AND inptl.input_value_id = inp.input_value_id
47 AND inptl.language = p_language
48 AND (inp.input_value_id <> p_input_value_id OR p_input_value_id IS NULL)
49 AND inp.element_type_id = g_element_type_id;
50
51 l_package_name VARCHAR2(80) := 'PAY_INPUT_VALUES_PKG.VALIDATE_TRANSLATION';
52 l_name pay_balance_types.balance_name%type := input_name;
53 l_dummy varchar2(100);
54
55 BEGIN
56
57 hr_utility.set_location (l_package_name,1);
58
59 BEGIN
60 hr_chkfmt.checkformat (l_name,
61 'PAY_NAME',
62 l_dummy, null, null, 'N', l_dummy, null);
63 hr_utility.set_location (l_package_name,2);
64
65 EXCEPTION
66 when app_exception.application_exception then
67 hr_utility.set_location (l_package_name,3);
68 fnd_message.set_name ('PAY','PAY_6365_ELEMENT_NO_DB_NAME'); -- checkformat failure
69 fnd_message.raise_error;
70 END;
71
72 hr_utility.set_location (l_package_name,10);
73 OPEN c_translation(language, input_name, input_value_id);
74 hr_utility.set_location (l_package_name,20);
75 FETCH c_translation INTO g_dummy;
76
77 IF c_translation%NOTFOUND THEN
78 hr_utility.set_location (l_package_name,30);
79 CLOSE c_translation;
80 ELSE
81 hr_utility.set_location (l_package_name,40);
82 CLOSE c_translation;
83 fnd_message.set_name('PAY','HR_TRANSLATION_EXISTS');
84 fnd_message.raise_error;
85 END IF;
86 hr_utility.set_location ('Leaving: '||l_package_name,60);
87
88 END validate_translation;
89
90
91 --------------------------------------------------------------------------------
92 function NO_DEFAULT_AT_LINK (
93
94 --******************************************************************************
95 --* Returns TRUE if there is no default value specified at the link. *
96 --* This will affect whether or not the default at the type may be deleted for *
97 --* hot-defaulted standard entries. *
98 --******************************************************************************
99
100 -- Parameters are:
101
102 p_input_value_id number,
103 p_effective_start_date date,
104 p_effective_end_date date,
105 p_error_if_true boolean := FALSE ) return boolean is
106
107 cursor csr_link is
108 select 1
109 from pay_link_input_values_f
110 where input_value_id = p_input_value_id
111 and default_value is null
112 and effective_start_date <=p_effective_end_date
113 and effective_end_date >=p_effective_start_date;
114
115 v_no_default boolean := FALSE;
116
117 begin
118 open csr_link;
119 fetch csr_link into g_dummy;
120 v_no_default := csr_link%found;
121 close csr_link;
122
123 if p_error_if_true and v_no_default then
124 hr_utility.set_message (801, 'PAY_INPVAL_MUST_HAVE_DEFAULT');
125 hr_utility.raise_error;
126 end if;
127
128 return v_no_default;
129
130 end no_default_at_link;
131 --------------------------------------------------------------------------------
132 function ELEMENT_ENTRY_NEEDS_DEFAULT (
133
134 --******************************************************************************
135 --* Returns TRUE if an entry value uses the input_value's hot default *
136 --******************************************************************************
137 --
138 -- Parameters are:
139 --
140 p_input_value_id number,
141 p_effective_start_date date,
142 p_effective_end_date date,
143 p_error_if_true boolean := FALSE ) return boolean is
144 --
145 cursor csr_hot_defaulted_entry is
146 select 1
147 from pay_element_entry_values_f ENTRY,
148 pay_link_input_values_f LINK
149 where link.input_value_id = p_input_value_id
150 and link.input_value_id = entry.input_value_id
151 and link.default_value is null
152 and entry.screen_entry_value is null
153 and entry.effective_start_date <= p_effective_end_date
154 and entry.effective_end_date >= p_effective_start_date
155 and link.effective_start_date <= p_effective_end_date
156 and link.effective_end_date >= p_effective_start_date;
157 --
158 v_hot_default_required boolean := FALSE;
159 --
160 begin
161 --
162 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.ELEMENT_ENTRY_NEEDS_DEFAULT',1);
163 --
164 open csr_hot_defaulted_entry;
165 fetch csr_hot_defaulted_entry into g_dummy;
166 v_hot_default_required := csr_hot_defaulted_entry%found;
167 close csr_hot_defaulted_entry;
168 --
169 if p_error_if_true and v_hot_default_required then
170 hr_utility.set_message (801,'PAY_6191_INPVAL_NO_ENTRY_DEFS');
171 hr_utility.raise_error;
172 end if;
173 --
174 return v_hot_default_required;
175 --
176 end ELEMENT_ENTRY_NEEDS_DEFAULT;
177 --------------------------------------------------------------------------------
178 function CANT_DELETE_ALL_INPUT_VALUES (
179 --
180 --******************************************************************************
181 --* Returns TRUE if any input value for a given element may not be deleted *
182 --******************************************************************************
183 --
184 -- Parameters are:
185 --
186 p_element_type_id number,
187 p_delete_mode varchar2,
188 p_validation_start_date date,
189 p_validation_end_date date,
190 p_error_if_true boolean default FALSE
191 --
192 ) return boolean is
193 --
194 cursor csr_input_values is
195 select *
196 from pay_input_values_f
197 where element_type_id = p_element_type_id
198 and effective_start_date <= p_validation_end_date
199 and effective_end_date >= p_validation_start_date;
200 --
201 v_protected_row_exists boolean := FALSE;
202 --
203 begin
204 --
205 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.cant_delete_all_input_values',1);
206 --
207 <<CHECK_EACH_INPUT_VALUE>>
208 for fetched_input_value in csr_input_values LOOP
209 --
210 if NOT deletion_allowed ( fetched_input_value.input_value_id,
211 p_delete_mode,
212 p_validation_start_date,
213 p_validation_end_date,
214 p_error_if_true ) then
215 --
216 v_protected_row_exists := TRUE;
217 --
218 end if;
219 --
220 exit when v_protected_row_exists;
221 --
222 end loop check_each_input_value;
223 --
224 return v_protected_row_exists;
225 --
226 end cant_delete_all_input_values;
227 --------------------------------------------------------------------------------
228 function RUN_RESULT_VALUE_EXISTS (
229 --
230 --******************************************************************************
231 --* Returns TRUE if there are any run result values for the input value *
232 --******************************************************************************
233 --
234 -- Parameters are:
235 --
236 p_input_value_id number,
237 p_validation_start_date date default to_date ('01/01/0001','DD/MM/YYYY'),
238 p_validation_end_date date default to_date ('31/12/4712','DD/MM/YYYY'),
239 p_error_if_true boolean default FALSE) return boolean is
240 --
241 v_value_exists boolean := FALSE;
242 --
243 cursor csr_value is
244 select 1
245 from dual
246 where exists
247 (select /*+ INDEX(RESULT PAY_RUN_RESULTS_PK) */ 1
248 from pay_run_result_values VALUE,
249 pay_run_results RESULT,
250 pay_assignment_actions ASSIGN,
251 pay_payroll_actions PAYROLL
252 where value.run_result_id = result.run_result_id
253 and assign.assignment_action_id = result.assignment_action_id
254 and assign.payroll_action_id = payroll.payroll_action_id
255 and value.input_value_id = p_input_value_id
256 and payroll.effective_date between p_validation_start_date
257 and p_validation_end_date);
258 --
259 begin
260 --
261 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.RUN_RESULT_VALUE_EXISTS',1);
262 open csr_value;
263 fetch csr_value into g_dummy;
264 v_value_exists := csr_value%found;
265 close csr_value;
266 --
267 if v_value_exists and p_error_if_true then
268 hr_utility.set_message (801,'PAY_6212_INPVAL_NO_RR_DEL');
269 hr_utility.raise_error;
270 end if;
271 --
272 return v_value_exists;
273 --
274 end run_result_value_exists;
275 --------------------------------------------------------------------------------
276 function BACKPAY_RULE_EXISTS (
277 --
278 --******************************************************************************
279 --* Returns TRUE if there are any backpay rules applying to this input value *
280 --******************************************************************************
281 --
282 -- Parameters are:
283 --
284 p_input_value_id number,
285 p_error_if_true boolean default FALSE) return boolean is
286 --
287 v_backpay_rules_exist boolean := FALSE;
288 --
289 cursor csr_backpay_rules is
290 select 1
291 from pay_backpay_rules
292 where input_value_id = p_input_value_id;
293 --
294 begin
295 --
296 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.BACKPAY_RULE_EXISTS',1);
297 open csr_backpay_rules;
298 fetch csr_backpay_rules into g_dummy;
299 v_backpay_rules_exist := csr_backpay_rules%found;
300 close csr_backpay_rules;
301 --
302 if v_backpay_rules_exist and p_error_if_true then
303 hr_utility.set_message (801,'PAY_6215_INPVAL_NO_DEL_BP');
304 hr_utility.raise_error;
305 end if;
306 --
307 return v_backpay_rules_exist;
308 --
309 end backpay_rule_exists;
310 --------------------------------------------------------------------------------
311 function ABSENCE_EXISTS (
312 --
313 --******************************************************************************
314 --* Returns TRUE if there are any absence records applying to an input value *
315 --* after the date of its date-effective deletion *
316 --******************************************************************************
317 --
318 -- Parameters are:
319 --
320 p_input_value_id number,
321 p_validation_start_date date default to_date ('01/01/0001','DD/MM/YYYY'),
322 p_validation_end_date date default to_date ('31/12/4712','DD/MM/YYYY'),
323 p_error_if_true boolean default FALSE
324 --
325 ) return boolean is
326 --
327 v_orphans_exist boolean := FALSE;
328 --
329 cursor csr_orphans is
330 select 1
331 from per_absence_attendance_types
332 where input_value_id = p_input_value_id
333 and date_effective between p_validation_start_date
334 and p_validation_end_date;
335 --
336 begin
337 --
338 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.ABSENCE_EXISTS',1);
339 open csr_orphans;
340 fetch csr_orphans into g_dummy;
341 v_orphans_exist := csr_orphans%found;
342 close csr_orphans;
343 --
344 if v_orphans_exist and p_error_if_true then
345 hr_utility.set_message (801,'PAY_6214_INPVAL_NO_ABS_DEL');
346 hr_utility.raise_error;
347 end if;
348 --
349 return v_orphans_exist;
350 --
351 end absence_exists;
352 --------------------------------------------------------------------------------
353 function ELEMENT_ENTRY_VALUE_EXISTS (
354 --
355 --******************************************************************************
356 --* Returns TRUE if there are any element entry values for the input value *
357 --******************************************************************************
358 --
359 -- Parameters are:
360 --
361 p_input_value_id number,
362 p_validation_start_date date default to_date ('01/01/0001','DD/MM/YYYY'),
363 p_validation_end_date date default to_date ('31/12/4712','DD/MM/YYYY'),
364 p_error_if_true boolean default FALSE
365 --
366 ) return boolean is
367 --
368 v_entries_exist boolean := FALSE;
369 --
370 cursor csr_entries is
371 select 1
372 from pay_element_entry_values_f
373 where input_value_id = p_input_value_id
374 and effective_start_date <= p_validation_end_date
375 and effective_end_date >= p_validation_start_date;
376 --
377 begin
378 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.ELEMENT_ENTRY_VALUE_EXISTS',1);
379 hr_utility.trace ('p_input_value_id = '||to_char(p_input_value_id));
380 hr_utility.trace ('p_val_start = '||p_validation_start_date);
381 hr_utility.trace ('p_val_end = '||p_validation_end_date);
382 --
383 open csr_entries;
384 fetch csr_entries into g_dummy;
385 v_entries_exist := csr_entries%found;
386 close csr_entries;
387 --
388 if v_entries_exist and p_error_if_true then
389 hr_utility.set_message (801,'PAY_6211_INPVAL_NO_DEL_ENTRY');
390 hr_utility.raise_error;
391 end if;
392 --
393 return v_entries_exist;
394 --
395 end element_entry_value_exists;
396 --------------------------------------------------------------------------------
397 function RESULT_RULE_EXISTS (
398 --
399 --******************************************************************************
400 --* Returns TRUE if there are any formula result rules applying to an input *
401 --* value after the date of its date-effective deletion *
402 --******************************************************************************
403 --
404 -- Parameters are:
405 --
406 p_input_value_id number,
407 p_validation_start_date date default to_date ('01/01/0001','DD/MM/YYYY'),
408 p_validation_end_date date default to_date ('31/12/4712','DD/MM/YYYY'),
409 p_error_if_true boolean default FALSE
410 --
411 ) return boolean is
412 --
413 v_orphans_exist boolean := FALSE;
414 --
415 cursor csr_orphans is
416 select 1
417 from pay_formula_result_rules_f
418 where input_value_id = p_input_value_id
419 and effective_start_date <= p_validation_end_date
420 and effective_end_date >= p_validation_start_date;
421 --
422 begin
423 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.RESULT_RULE_EXISTS',1);
424 --
425 open csr_orphans;
426 fetch csr_orphans into g_dummy;
427 v_orphans_exist := csr_orphans%found;
428 close csr_orphans;
429 --
430 if v_orphans_exist and p_error_if_true then
431 hr_utility.set_message (801,'PAY_6213_INPVAL_NO_FRR_DEL');
432 hr_utility.raise_error;
433 end if;
434 --
435 return v_orphans_exist;
436 --
437 end result_rule_exists;
438 --------------------------------------------------------------------------------
439 function INPUT_VALUE_USED_AS_PAY_BASIS (
440 --
441 p_input_value_id number,
442 p_error_if_true boolean default FALSE) return boolean IS
443 --
444 --******************************************************************************
445 --* Returns TRUE if the input value is used as a pay basis *
446 --******************************************************************************
447 --
448 v_pay_basis_input_value boolean := FALSE;
449 v_dummy_number number(1);
450 --
451 cursor csr_pay_basis is
452 select 1
453 from per_pay_bases
454 where input_value_id = p_input_value_id;
455 --
456 begin
457 --
458 open csr_pay_basis;
459 fetch csr_pay_basis into v_dummy_number;
460 v_pay_basis_input_value := csr_pay_basis%found;
461 close csr_pay_basis;
462 --
463 if v_pay_basis_input_value and p_error_if_true then
464 --
465 hr_utility.set_message(801,'PAY_6965_INPVAL_NO_DEL_SB');
466 hr_utility.raise_error;
467 --
468 end if;
469 --
470 return v_pay_basis_input_value;
471 --
472 end input_value_used_as_pay_basis;
473 --------------------------------------------------------------------------------
474 function DISTRIBUTED_COST_LINK_EXISTS (
475 --
476 --******************************************************************************
477 --* Returns TRUE if there are any element links for the input value's element *
478 --* which have a costable type of Distributed, and the input value is a Pay *
479 --* Value *
480 --******************************************************************************
481 --
482 -- Parameters are:
483 --
484 p_input_value_id number,
485 p_error_if_true boolean default FALSE) return boolean is
486 --
487 v_links_exist boolean := FALSE;
488 --
489 -- Find local name for pay values
490 v_pay_value_name hr_lookups.meaning%type := hr_general.pay_value;
491 --
492 cursor csr_links is
493 select 1
494 from pay_element_links_f LINK,
495 pay_input_values_f INPUT
496 where input.input_value_id = p_input_value_id
497 and input.name = 'Pay Value'
498 and link.element_type_id = input.element_type_id
499 and link.costable_type = 'D';
500 --
501 begin
502 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.DISTRIBUTED_COST_LINK_EXISTS',1);
503 --
504 open csr_links;
505 fetch csr_links into g_dummy;
506 v_links_exist := csr_links%found;
507 close csr_links;
508 --
509 if v_links_exist and p_error_if_true then
510 hr_utility.set_message (801,'PAY_6210_INPVAL_NO_LINKS_DEL');
511 hr_utility.raise_error;
512 end if;
513 --
514 return v_links_exist;
515 --
516 end distributed_cost_link_exists;
517 --------------------------------------------------------------------------------
518 function ASSIGNED_SALARY_BASE_EXISTS (
519 --
520 --******************************************************************************
521 --* Returns TRUE if there are any salary bases for the input value which are *
522 --* tied to assignments *
523 --******************************************************************************
524 --
525 -- Parameters are:
526 --
527 p_input_value_id number,
528 p_validation_start_date date default to_date ('01/01/0001','DD/MM/YYYY'),
529 p_validation_end_date date default to_date ('31/12/4712','DD/MM/YYYY'),
530 p_error_if_true boolean default FALSE) return boolean is
531 --
532 v_base_exists boolean := FALSE;
533 --
534 cursor csr_salary_base is
535 select 1
536 from per_pay_bases BASE
537 where base.input_value_id = p_input_value_id;
538 --
539 begin
540 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.ASSIGNED_SALARY_BASE_EXISTS',1);
541 --
542 open csr_salary_base;
543 fetch csr_salary_base into g_dummy;
544 v_base_exists := csr_salary_base%found;
545 close csr_salary_base;
546 --
547 if v_base_exists and p_error_if_true then
548 hr_utility.set_message (801,'PAY_6965_INPVAL_NO_DEL_SB');
549 hr_utility.raise_error;
550 end if;
551 --
552 return v_base_exists;
553 --
554 end assigned_salary_base_exists;
555 --------------------------------------------------------------------------------
556 function NET_CALCULATION_RULE_EXISTS (
557 --
558 --******************************************************************************
559 --* Returns TRUE if there are net calculation rules which make use of the
560 --* specified input value id.
561 --******************************************************************************
562 --
563 -- Parameters are:
564 --
565 p_input_value_id number,
566 p_error_if_true boolean default false) return boolean is
567 --
568 v_calculation_exists boolean := FALSE;
569 --
570 cursor csr_calc_rule is
571 select 1
572 from pay_net_calculation_rules
573 where input_value_id = p_input_value_id;
574 --
575 begin
576 --
577 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.NET_CALCULATION_RULES_EXIST',1);
578 --
579 open csr_calc_rule;
580 fetch csr_calc_rule into g_dummy;
581 v_calculation_exists := csr_calc_rule%found;
582 close csr_calc_rule;
583 --
584 if v_calculation_exists and p_error_if_true then
585 hr_utility.set_message (801, 'PAY_35559_INPVAL_NO_DEL_CALC');
586 hr_utility.raise_error;
587 end if;
588 --
589 return v_calculation_exists;
590 --
591 end net_calculation_rule_exists;
592 --------------------------------------------------------------------------------
593 function ACCRUAL_PLAN_EXISTS (
594 --
595 --******************************************************************************
596 --* Returns TRUE if there are any accrual plans which make use of the specified
597 --* input_value_id.
598 --******************************************************************************
599 --
600 -- Parameters are:
601 --
602 p_input_value_id number,
603 p_error_if_true boolean default FALSE) return boolean is
604 --
605 v_accrual_plan_exists boolean := FALSE;
606 --
607 cursor csr_accrual_plan is
608 select 1
609 from pay_accrual_plans
610 where p_input_value_id in ( pto_input_value_id,
611 co_input_value_id,
612 residual_input_value_id );
613 --
614 begin
615 --
616 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.ACCRUAL_PLAN_EXISTS',1);
617 --
618 open csr_accrual_plan;
619 fetch csr_accrual_plan into g_dummy;
620 v_accrual_plan_exists := csr_accrual_plan%found;
621 close csr_accrual_plan;
622 --
623 if v_accrual_plan_exists and p_error_if_true then
624 hr_utility.set_message (801,'PAY_35558_INPVAL_NO_DEL_ACCRUA');
625 hr_utility.raise_error;
626 end if;
627 --
628 return v_accrual_plan_exists;
629 --
630 end accrual_plan_exists;
631 --------------------------------------------------------------------------------
632 procedure PARENT_DELETED (
633 --
634 --******************************************************************************
635 --* Handles the case when the element type is deleted. *
636 --******************************************************************************
637 --
638 -- Parameters are:
639 --
640 -- Identifier of the element
641 p_element_type_id number,
642 --
643 -- The effective date
644 p_session_date date default trunc(sysdate),
645 --
646 -- The validation period
647 p_validation_start_date date,
648 p_validation_end_date date,
649 --
650 -- The type of Date Track deletion
651 p_delete_mode varchar2 default 'DELETE'
652 --
653 ) is
654 --
655 cursor csr_all_inputs_for_element is
656 select rowid,pay_input_values_f.*
657 from pay_input_values_f
658 where element_type_id = p_element_type_id
659 for update;
660 --
661 begin
662 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.PARENT_DELETED',1);
663 --
664 <<REMOVE_ORPHANED_ROWS>>
665 FOR fetched_input_value in csr_all_inputs_for_element LOOP
666 --
667 hr_balance_feeds.del_bf_input_value ( fetched_input_value.input_value_id,
668 p_delete_mode,
669 p_validation_start_date,
670 p_validation_end_date );
671 --
672 -- Delete input value if in ZAP mode
673 -- Delete input value if it is in the future and in DELETE mode
674 --
675 if p_delete_mode = 'ZAP'
676 or (p_delete_mode = 'DELETE'
677 and fetched_input_value.effective_start_date > p_session_date ) then
678 --
679 delete_row ( fetched_input_value.rowid,
680 fetched_input_value.input_value_id,
681 p_delete_mode,
682 p_session_date,
683 p_validation_start_date,
684 p_validation_end_date );
685 --
686 delete from hr_application_ownerships
687 where key_name = 'INPUT_VALUE_ID'
688 and key_value = fetched_input_value.input_value_id;
689 --
690 -- For date effective deletes, shut down the input value by ensuring its end
691 -- date matches that of its closed parent
692 --
693 elsif p_delete_mode = 'DELETE'
694 and p_session_date between fetched_input_value.effective_start_date
695 and fetched_input_value.effective_end_date then
696 --
697 update pay_input_values_f
698 set effective_end_date = p_session_date
699 where current of csr_all_inputs_for_element;
700 --
701 -- For delete next changes when there are no future rows for the element,
702 -- extend the input value's end date to the end of time to match the action
703 -- which will be performed on the parent
704 --
705 elsif p_delete_mode = 'DELETE_NEXT_CHANGE'
706 and p_validation_end_date = c_end_of_time then
707 --
708 -- bugfix 1507600
709 -- only update peices date effective as of session date
710 --
711 hr_utility.trace ('***** in DELETE_NEXT_CHANGE');
712 hr_utility.trace ('***** ESD>' ||
713 fetched_input_value.effective_start_date || '<');
714 hr_utility.trace ('***** EED>' ||
715 fetched_input_value.effective_end_date || '<');
716
717 -- if p_session_date >= fetched_input_value.effective_start_date and
718 -- p_session_date <= fetched_input_value.effective_end_date then
719 hr_utility.trace ('***** peice within ESD and EED');
720 hr_utility.trace ('***** ESD>' ||
721 fetched_input_value.effective_start_date || '<');
722 hr_utility.trace ('***** EED>' ||
723 fetched_input_value.effective_end_date || '<');
724 --
725 update pay_input_values_f
726 set effective_end_date = c_end_of_time
727 where --current of csr_all_inputs_for_element
728 rowid = fetched_input_value.rowid
729 and not exists
730 (select null
731 from pay_input_values_f pipv
732 where pipv.element_type_id = fetched_input_value.element_type_id
733 and pipv.input_value_id = fetched_input_value.input_value_id
734 and pipv.effective_start_date > fetched_input_value.effective_start_date);
735 -- end if;
736 --
737 end if;
738 --
739 end loop remove_orphaned_rows;
740 --
741 end parent_deleted;
742 -------------------------------------------------------------------------------
743 procedure RECREATE_DB_ITEMS (
744 --
745 --******************************************************************************
746 --* Drops and then creates new DB items for all input values belonging to an *
747 --* element. *
748 --******************************************************************************
749 --
750 -- Parameters are:
751 --
752 p_element_type_id number) is
753 --
754 cursor csr_input_values is
755 select *
756 from pay_input_values_f
757 where element_type_id = p_element_type_id
758 and generate_db_items_flag = 'Y'; -- Bug 6432304
759 --
760 begin
761 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.RECREATE_DB_ITEMS',1);
762 --
763 FOR fetched_input_value in csr_input_values LOOP
764 --
765 hrdyndbi.delete_input_value_dict (fetched_input_value.input_value_id);
766 --
767 hrdyndbi.create_input_value_dict (fetched_input_value.input_value_id,
768 fetched_input_value.effective_start_date);
769 --
770 end loop;
771 --
772 end recreate_db_items;
773 -------------------------------------------------------------------------------
774 function DELETION_ALLOWED (
775
776 --******************************************************************************
777 --* Returns TRUE if no business rules will be broken by deletion of the input *
778 --* value *
779 --******************************************************************************
780
781 -- Parameters are:
782
783 p_input_value_id number,
784 p_delete_mode varchar2,
785 p_validation_start_date date,
786 p_validation_end_date date,
787 p_error_if_true boolean default FALSE
788
789 ) return boolean is
790
791 v_deletion_allowed boolean := TRUE;
792
793 begin
794 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.DELETION_ALLOWED',1);
795
796 if (p_delete_mode = 'ZAP'
797
798 and (element_entry_value_exists ( p_input_value_id,
799 p_validation_start_date,
800 p_validation_end_date,
801 p_error_if_true )
802
803 or accrual_plan_exists ( p_input_value_id,
804 p_error_if_true)
805
806 or net_calculation_rule_exists (p_input_value_id,
807 p_error_if_true)
808
809 or assigned_salary_base_exists (p_input_value_id,
810 p_validation_start_date,
811 p_validation_end_date,
812 p_error_if_true)
813
814 or run_result_value_exists ( p_input_value_id,
815 p_validation_start_date,
816 p_validation_end_date,
817 p_error_if_true )
818
819 or result_rule_exists ( p_input_value_id,
820 p_validation_start_date,
821 p_validation_end_date,
822 p_error_if_true )
823
824 or absence_exists ( p_input_value_id,
825 p_validation_start_date,
826 p_validation_end_date,
827 p_error_if_true )
828
829 or backpay_rule_exists ( p_input_value_id,
830 p_error_if_true )
831
832 or distributed_cost_link_exists ( p_input_value_id,
833 p_error_if_true)
834 )
835 or input_value_used_as_pay_basis( p_input_value_id,
836 p_error_if_true))
837
838 or (p_delete_mode = 'DELETE'
839
840 and (result_rule_exists ( p_input_value_id,
841 p_validation_start_date,
842 p_validation_end_date,
843 p_error_if_true )
844
845 or absence_exists ( p_input_value_id,
846 p_validation_start_date,
847 p_validation_end_date,
848 p_error_if_true )
849
850 ))
851 or dt_api.rows_exist(
852 p_base_table_name => 'ben_acty_base_rt_f',
853 p_base_key_column => 'input_value_id',
854 p_base_key_value => p_input_value_id,
855 p_from_date => p_validation_start_date,
856 p_to_date => p_validation_end_date
857 )
858 then
859 v_deletion_allowed := FALSE;
860
861 end if;
862
863 return v_deletion_allowed;
864
865 end deletion_allowed;
866 -----------------------------------------------------------------------------
867 function NO_OF_INPUT_VALUES (p_element_type_id number) return number is
868 --
869 --******************************************************************************
870 --* Returns the number of input values on the database for a given element *
871 --******************************************************************************
872 --
873 v_no_of_input_values number(30);
874 --
875 cursor csr_count_input_values is
876 select count(distinct input_value_id)
877 from pay_input_values_f
878 where element_type_id = p_element_type_id;
879 --
880 begin
881 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.NO_OF_INPUT_VALUES',1);
882 --
883 open csr_count_input_values;
884 fetch csr_count_input_values into v_no_of_input_values;
885 close csr_count_input_values;
886 --
887 return v_no_of_input_values;
888 --
889 end no_of_input_values;
890 --------------------------------------------------------------------------------
891 function DATE_EFFECTIVELY_UPDATED (
892 --
893 --******************************************************************************
894 --* Returns TRUE if there is more than one date effective row for the input *
895 --* value *
896 --******************************************************************************
897 --
898 -- Parameters are:
899 --
900 -- Identifier of the input value and its particular instance
901 p_input_value_id number,
902 p_rowid varchar2) return boolean is
903 --
904 cursor csr_dated_updates is
905 select 1
906 from pay_input_values_f
907 where input_value_id = p_input_value_id
908 and rowid <> p_rowid;
909 --
910 v_date_effectively_updated boolean := FALSE;
911 --
912 begin
913 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.DATE_EFFECTIVELY_UPDATED',1);
914 --
915 open csr_dated_updates;
916 fetch csr_dated_updates into g_dummy;
917 v_date_effectively_updated := csr_dated_updates%found;
918 close csr_dated_updates;
919 --
920 return v_date_effectively_updated;
921 --
922 end date_effectively_updated;
923 --------------------------------------------------------------------------------
924 function NAME_NOT_UNIQUE (
925 --
926 --******************************************************************************
927 --* Returns TRUE if the input value name is NOT unique within the element type *
928 --******************************************************************************
929 --
930 -- Parameters are:
931 --
932 p_element_type_id number,
933 p_rowid varchar2 default null,
934 p_name varchar2,
935 p_error_if_true boolean default FALSE) return boolean is
936 --
937 l_ivid pay_input_values_f.input_value_id%type;
938 v_duplicate boolean := FALSE;
939 --
940 cursor csr_duplicate_name (p_ivid number) is
941 select 1
942 from pay_input_values_f_tl iv_tl,
943 pay_input_values_f iv
944 where iv.element_type_id = p_element_type_id
945 and (iv.rowid <> p_rowid or p_rowid is null)
946 and iv_tl.input_value_id = iv.input_value_id
947 and iv_tl.language = userenv('LANG')
948 and upper(iv_tl.name) = upper(p_name);
949 --
950 begin
951 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.NAME_NOT_UNIQUE',1);
952 --
953 if p_rowid is not null then
954 select input_value_id
955 into l_ivid
956 from pay_input_values_f
957 where rowid = p_rowid;
958 else
959 l_ivid := null;
960 end if;
961 --
962 open csr_duplicate_name(l_ivid);
963 fetch csr_duplicate_name into g_dummy;
964 v_duplicate := csr_duplicate_name%found;
965 close csr_duplicate_name;
966 --
967 if v_duplicate and p_error_if_true then
968 hr_utility.set_message (801,'PAY_6168_INPVAL_DUP_NAME');
969 hr_utility.raise_error;
970 end if;
971 --
972 return v_duplicate;
973 --
974 end name_not_unique;
975 --------------------------------------------------------------------------------
976 function MANDATORY_IN_FUTURE (
977 --
978 --******************************************************************************
979 --* Returns TRUE if the input value is mandatory in any future date effective
980 --* row. *
981 --******************************************************************************
982 --
983 -- Parameters are:
984 --
985 p_input_value_id number,
986 p_session_date date default trunc(sysdate),
987 p_error_if_true boolean default FALSE)
988 --
989 return boolean is
990 --
991 v_mandatory_in_future boolean;
992 --
993 cursor csr_mandatory_flag is
994 select 1
995 from pay_input_values_f
996 where input_value_id = p_input_value_id
997 and mandatory_flag = 'Y'
998 and effective_start_date > p_session_date;
999 --
1000 begin
1001 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.MANDATORY_IN_FUTURE',1);
1002 open csr_mandatory_flag;
1003 fetch csr_mandatory_flag into g_dummy;
1004 v_mandatory_in_future := csr_mandatory_flag%found;
1005 close csr_mandatory_flag;
1006 --
1007 if p_error_if_true and v_mandatory_in_future then
1008 hr_utility.set_message(801,'PAY_6179_INPVAL_MAND_NO_CHANGE');
1009 hr_utility.raise_error;
1010 end if;
1011 --
1012 return v_mandatory_in_future;
1013 --
1014 end mandatory_in_future;
1015 --------------------------------------------------------------------------------
1016 procedure INSERT_ROW (
1017 --
1018 --******************************************************************************
1019 --* Handles the insertion of an input value into the base table and ensures *
1020 --* that any cascaded actions are carried out
1021 --******************************************************************************
1022 --
1023 -- Parameters are:
1024 --
1025 -- All base table columns
1026 p_effective_start_date date default trunc (sysdate),
1027 p_effective_end_date date default to_date ('31/12/4712',
1028 'DD/MM/YYYY'),
1029 p_element_type_id number,
1030 p_lookup_type varchar2 default null,
1031 p_business_group_id number default null,
1032 p_legislation_code varchar2 default null,
1033 p_formula_id number default null,
1034 p_display_sequence number default 1,
1035 p_generate_db_items_flag varchar2 default 'Y',
1036 p_hot_default_flag varchar2 default 'N',
1037 p_mandatory_flag varchar2 default 'N',
1038
1039 -- change 115.12 - make p_name default to null
1040 --p_name varchar2 default 'Pay Value',
1041 p_name varchar2 default null,
1042 -- change 115.12 - make p_base_name a mandatory parameter
1043 --p_base_name varchar2 default 'Pay Value',
1044 p_base_name varchar2,
1045
1046 p_uom varchar2 default 'M',
1047 p_default_value varchar2 default null,
1048 p_legislation_subgroup varchar2 default null,
1049 p_max_value varchar2 default null,
1050 p_min_value varchar2 default null,
1051 p_warning_or_error varchar2 default null,
1052 --
1053 -- Attributes of the parent element type which will affect
1054 -- subsequent actions
1055 p_classification_id number default null,
1056 --
1057 -- Enhancement 2793978
1058 p_value_set_id number default null,
1059 --
1060 -- The identifiers generated by the system for return to the form
1061 p_input_value_id in out nocopy number,
1062 p_rowid in out nocopy varchar2
1063 --
1064 ) is
1065 --
1066 cursor csr_next_id is
1067 select pay_input_values_s.nextval
1068 from sys.dual;
1069 --
1070 cursor csr_input_value_rowid is
1071 --
1072 /* We need to know the value of the newly created
1073 rowid so that forms does not have to re-query */
1074 --
1075 select rowid
1076 from pay_input_values_f
1077 where input_value_id = p_input_value_id
1078 and effective_start_date = p_effective_start_date
1079 and effective_end_date = p_effective_end_date;
1080 --
1081 cursor c_language (c_input_value_id number) is
1082 select L.LANGUAGE_CODE
1083 from FND_LANGUAGES L
1084 where L.INSTALLED_FLAG in ('I', 'B')
1085 and not exists
1086 (select NULL
1087 from PAY_INPUT_VALUES_F_TL T
1088 where T.INPUT_VALUE_ID = c_input_value_id
1089 and T.LANGUAGE = L.LANGUAGE_CODE);
1090
1091 --
1092 -- Each system may have a different name for a pay value
1093 v_pay_value_name varchar2(255) := hr_general.pay_value;
1094 -- change 115.12
1095 l_name varchar2(80);
1096 --
1097 l_tl_name varchar2(255);
1098 --
1099 l_check_latest_balances boolean;
1100 --
1101 begin
1102 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.insert_row',1);
1103 --
1104
1105 -- change 115.12 - if p_name has not been specified then default it to
1106 -- p_base_name
1107 l_name := p_name;
1108 if l_name is null then
1109 l_name := p_base_name;
1110 end if;
1111
1112 open csr_next_id;
1113 fetch csr_next_id into p_input_value_id;
1114 close csr_next_id;
1115 --
1116 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.insert_row',2);
1117 --
1118 if no_of_input_values (p_element_type_id) >= 15 then
1119
1120 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.insert_row',3);
1121
1122 hr_utility.set_message (801, 'HR_7124_INPVAL_MAX_ENTRIES');
1123 hr_utility.raise_error;
1124
1125 end if;
1126
1127 insert into pay_input_values_f (
1128 --
1129 INPUT_VALUE_ID,
1130 EFFECTIVE_START_DATE,
1131 EFFECTIVE_END_DATE,
1132 ELEMENT_TYPE_ID,
1133 LOOKUP_TYPE,
1134 BUSINESS_GROUP_ID,
1135 LEGISLATION_CODE,
1136 FORMULA_ID,
1137 DISPLAY_SEQUENCE,
1138 GENERATE_DB_ITEMS_FLAG,
1139 HOT_DEFAULT_FLAG,
1140 MANDATORY_FLAG,
1141 NAME,
1142 UOM,
1143 DEFAULT_VALUE,
1144 LEGISLATION_SUBGROUP,
1145 MAX_VALUE,
1146 MIN_VALUE,
1147 WARNING_OR_ERROR,
1148 -- Enhancement 2793978
1149 VALUE_SET_ID,
1150 --
1151 last_update_date,
1152 last_updated_by,
1153 last_update_login,
1154 creation_date,
1155 created_by)
1156 --
1157 values (
1158 --
1159 p_input_value_id,
1160 p_effective_start_date,
1161 p_effective_end_date,
1162 p_element_type_id,
1163 p_lookup_type,
1164 p_business_group_id,
1165 p_legislation_code,
1166 p_formula_id,
1167 p_display_sequence,
1168 p_generate_db_items_flag,
1169 p_hot_default_flag,
1170 p_mandatory_flag,
1171 -- If the input value is a pay value, translate it to local language
1172 -- DECODE(UPPER(p_name),
1173 -- 'PAY VALUE', v_pay_value_name,
1174 -- p_name
1175 -- ),
1176 -- --
1177 -- only insert the base value into the _F table
1178 p_base_name,
1179 -- --
1180 p_uom,
1181 p_default_value,
1182 p_legislation_subgroup,
1183 p_max_value,
1184 p_min_value,
1185 p_warning_or_error,
1186 -- Enhancement 2793978
1187 p_value_set_id,
1188 --
1189 sysdate,
1190 c_user_id,
1191 c_login_id,
1192 sysdate,
1193 c_user_id);
1194 --
1195 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.insert_row',4);
1196 --
1197 -- ***********************************************************************
1198 -- Insert into MLS table (TL)
1199 --
1200 if (upper(l_name) = 'PAY VALUE') then
1201 for c_lang_rec in c_language(P_INPUT_VALUE_ID) loop
1202
1203 begin
1204 select meaning
1205 into l_tl_name
1206 from fnd_lookup_values
1207 where lookup_type = 'NAME_TRANSLATIONS'
1208 and lookup_code = 'PAY VALUE'
1209 and language = c_lang_rec.language_code;
1210 exception
1211 when no_data_found then
1212 l_tl_name := l_name;
1213 end;
1214
1215 insert into PAY_INPUT_VALUES_F_TL (
1216 INPUT_VALUE_ID,
1217 NAME,
1218 LAST_UPDATE_DATE,
1219 LAST_UPDATED_BY,
1220 LAST_UPDATE_LOGIN,
1221 CREATED_BY,
1222 CREATION_DATE,
1223 LANGUAGE,
1224 SOURCE_LANG
1225 ) select
1226 P_INPUT_VALUE_ID,
1227 l_tl_name,
1228 sysdate,
1229 c_user_id,
1230 c_user_id,
1231 c_login_id,
1232 sysdate,
1233 c_lang_rec.language_code,
1234 userenv('LANG')
1235 from dual;
1236
1237 end loop;
1238 else
1239
1240 insert into PAY_INPUT_VALUES_F_TL (
1241 INPUT_VALUE_ID,
1242 NAME,
1243 LAST_UPDATE_DATE,
1244 LAST_UPDATED_BY,
1245 LAST_UPDATE_LOGIN,
1246 CREATED_BY,
1247 CREATION_DATE,
1248 LANGUAGE,
1249 SOURCE_LANG
1250 ) select
1251 P_INPUT_VALUE_ID,
1252 l_name,
1253 sysdate,
1254 c_user_id,
1255 c_user_id,
1256 c_login_id,
1257 sysdate,
1258 L.LANGUAGE_CODE,
1259 userenv('LANG')
1260 from FND_LANGUAGES L
1261 where L.INSTALLED_FLAG in ('I', 'B')
1262 and not exists
1263 (select NULL
1264 from PAY_INPUT_VALUES_F_TL T
1265 where T.INPUT_VALUE_ID = P_INPUT_VALUE_ID
1266 and T.LANGUAGE = L.LANGUAGE_CODE);
1267
1268 end if;
1269
1270 --
1271 -- ***********************************************************************
1272 --
1273 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.insert_row',5);
1274 --
1275 open csr_input_value_rowid;
1276 fetch csr_input_value_rowid into p_rowid;
1277 --
1278 if csr_input_value_rowid%notfound then
1279 close csr_input_value_rowid;
1280 raise no_data_found;
1281 else
1282 --
1283 -- Create link input values for existing links
1284 --
1285 pay_link_input_values_pkg.create_link_input_value (
1286
1287 p_input_value_id,
1288 p_element_type_id,
1289 p_effective_start_date,
1290 p_effective_end_date,
1291 -- change 115.12
1292 l_name,
1293 p_hot_default_flag,
1294 p_default_value,
1295 p_min_value,
1296 p_max_value,
1297 p_warning_or_error);
1298
1299 -- Create balance feeds for pay values
1300 --
1301 -- change 115.12
1302 if (l_name = 'Pay Value' -- the default
1303 or upper (l_name) = upper (v_pay_value_name)) then
1304 l_check_latest_balances := HRASSACT.CHECK_LATEST_BALANCES;
1305 HRASSACT.CHECK_LATEST_BALANCES := FALSE;
1306 hr_balance_feeds.ins_bf_pay_value ( p_input_value_id );
1307 HRASSACT.CHECK_LATEST_BALANCES := l_check_latest_balances;
1308 end if;
1309 --
1310 -- Create DB item for the input value
1311 if p_generate_db_items_flag = 'Y' then
1312 hrdyndbi.create_input_value_dict ( p_input_value_id,
1313 p_effective_start_date );
1314 end if;
1315 --
1316 -- Create application ownership for startup pay value
1317 if upper (l_name) = upper (v_pay_value_name)
1318 and p_legislation_code is not null then
1319 --
1320 -- The 'not exists' clause is used to ensure that duplicate rows are not
1321 -- entered. This could arise because the forms startup code also handles
1322 -- application ownerships where a user enters a pay value on the form, but
1323 -- this code is intended to handle third party insertion from the element
1324 --
1325 insert into hr_application_ownerships
1326 (key_name,
1327 key_value,
1328 product_name)
1329 select 'INPUT_VALUE_ID',
1330 p_input_value_id,
1331 ao.product_name
1332 from hr_application_ownerships ao
1333 where ao.key_name = 'ELEMENT_TYPE_ID'
1334 and ao.key_value = p_element_type_id
1335 and not exists (select 'INPUT_VALUE_ID',
1336 p_input_value_id,
1337 ao.product_name
1338 from hr_application_ownerships ao
1339 where ao.key_name = 'ELEMENT_TYPE_ID'
1340 and ao.key_value = p_element_type_id);
1341 --
1342 end if;
1343 --
1344 end if;
1345 close csr_input_value_rowid;
1346 --
1347 --
1348 end insert_row;
1349 ---------------------------------------------------------------------------
1350 procedure UPDATE_ROW(
1351 --
1352 --******************************************************************************
1353 --* Handles the updating of the base table for the form which is based on a *
1354 --* non-updatable view *
1355 --******************************************************************************
1356 --
1357 -- Parameters are:
1358 --
1359 -- All base table columns
1360 p_ROWID VARCHAR2,
1361 p_INPUT_VALUE_ID NUMBER,
1362 p_EFFECTIVE_START_DATE DATE,
1363 p_EFFECTIVE_END_DATE DATE,
1364 p_ELEMENT_TYPE_ID NUMBER,
1365 p_LOOKUP_TYPE VARCHAR2,
1366 p_BUSINESS_GROUP_ID NUMBER,
1367 p_LEGISLATION_CODE VARCHAR2,
1368 p_FORMULA_ID NUMBER,
1369 p_DISPLAY_SEQUENCE NUMBER,
1370 p_GENERATE_DB_ITEMS_FLAG VARCHAR2,
1371 p_HOT_DEFAULT_FLAG VARCHAR2,
1372 p_MANDATORY_FLAG VARCHAR2,
1373 p_NAME VARCHAR2,
1374 p_UOM VARCHAR2,
1375 p_DEFAULT_VALUE VARCHAR2,
1376 p_LEGISLATION_SUBGROUP VARCHAR2,
1377 p_MAX_VALUE VARCHAR2,
1378 p_MIN_VALUE VARCHAR2,
1379 p_WARNING_OR_ERROR VARCHAR2,
1380 -- Enhancement 2793978
1381 p_value_set_id number default null,
1382 --
1383 p_recreate_db_items varchar2,
1384 p_base_name varchar2
1385 --
1386 ) is
1387 --
1388 begin
1389 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.update_row',1);
1390 --
1391 update pay_input_values_f
1392 set INPUT_VALUE_ID = p_INPUT_VALUE_ID,
1393 EFFECTIVE_START_DATE = p_EFFECTIVE_START_DATE,
1394 EFFECTIVE_END_DATE = p_EFFECTIVE_END_DATE,
1395 ELEMENT_TYPE_ID = p_ELEMENT_TYPE_ID,
1396 LOOKUP_TYPE = p_LOOKUP_TYPE,
1397 BUSINESS_GROUP_ID = p_BUSINESS_GROUP_ID,
1398 LEGISLATION_CODE = p_LEGISLATION_CODE,
1399 FORMULA_ID = p_FORMULA_ID,
1400 DISPLAY_SEQUENCE = p_DISPLAY_SEQUENCE,
1401 GENERATE_DB_ITEMS_FLAG = p_GENERATE_DB_ITEMS_FLAG,
1402 HOT_DEFAULT_FLAG = p_HOT_DEFAULT_FLAG,
1403 MANDATORY_FLAG = p_MANDATORY_FLAG,
1404 -- --
1405 NAME = p_base_NAME,
1406 -- --
1407 UOM = p_UOM,
1408 DEFAULT_VALUE = p_DEFAULT_VALUE,
1409 LEGISLATION_SUBGROUP = p_LEGISLATION_SUBGROUP,
1410 MAX_VALUE = p_MAX_VALUE,
1411 MIN_VALUE = p_MIN_VALUE,
1412 WARNING_OR_ERROR = p_WARNING_OR_ERROR,
1413 -- Enhancement 2793978
1414 VALUE_SET_ID = p_VALUE_SET_ID,
1415 --
1416 last_update_date = sysdate,
1417 last_updated_by = c_user_id,
1418 last_update_login = c_login_id
1419 where rowid = p_rowid;
1420 --
1421 if sql%notfound then
1422 raise no_data_found;
1423 end if;
1424 --
1425 --
1426 -- ************************************************************************
1427 -- update MLS table (TL)
1428 --
1429 update PAY_INPUT_VALUES_F_TL
1430 set
1431 NAME = P_NAME,
1432 last_update_date = sysdate,
1433 last_updated_by = c_user_id,
1434 last_update_login = c_login_id,
1435 SOURCE_LANG = userenv('LANG')
1436 where INPUT_VALUE_ID = P_INPUT_VALUE_ID
1437 and userenv('LANG') = LANGUAGE ; -- bug 6125295
1438 --
1439 if sql%notfound then -- trap system errors during update
1440 hr_utility.set_message (801,'HR_6153_ALL_PROCEDURE_FAIL');
1441 hr_utility.set_message_token('PROCEDURE','PAY_INPUT_VALUES_PKG.UPDATE_TL_ROW');
1442 hr_utility.raise_error;
1443 end if;
1444 --
1445 -- ************************************************************************
1446 --
1447 if p_recreate_db_items = 'Y' then
1448 --
1449 -- Recreate DB items
1450 hrdyndbi.delete_input_value_dict (p_input_value_id);
1451 hrdyndbi.create_input_value_dict (p_input_value_id,p_effective_start_date);
1452 --
1453 end if;
1454 --
1455 end update_row;
1456 ---------------------------------------------------------------------------
1457 procedure DELETE_ROW (
1458 --
1459 --******************************************************************************
1460 --* Handles deletion from the base table for the form which is based on a *
1461 --* non-updatable view, and maintains data integrity *
1462 --******************************************************************************
1463 --
1464 -- Parameters are:
1465 --
1466 -- Identifier of the row to be deleted
1467 p_rowid varchar2,
1468 p_input_value_id number,
1469 --
1470 -- Date Track delete mode
1471 p_delete_mode varchar2,
1472 --
1473 -- Validation period
1474 p_session_date date,
1475 p_validation_start_date date
1476 default to_date ('01/01/0001','DD/MM/YYYY'),
1477 p_validation_end_date date
1478 default to_date ('31/12/4712','DD/MM/YYYY')
1479 ) is
1480 --
1481 begin
1482 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.DELETE_ROW',1);
1483 --
1484 if deletion_allowed ( p_input_value_id,
1485 p_delete_mode,
1486 p_validation_start_date,
1487 p_validation_end_date ) then
1488 --
1489 hr_balance_feeds.del_bf_input_value ( p_input_value_id,
1490 p_delete_mode,
1491 p_validation_start_date,
1492 p_validation_end_date );
1493 --
1494 pay_link_input_values_pkg.parent_deleted ( p_input_value_id,
1495 p_session_date,
1496 p_validation_start_date,
1497 p_validation_end_date,
1498 p_delete_mode,
1499 'PAY_INPUT_VALUES_F' );
1500 --
1501 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.DELETE_ROW',2);
1502 --
1503 -- delete DB items
1504 hrdyndbi.delete_input_value_dict (p_input_value_id);
1505 --
1506 delete from pay_input_values_f
1507 where rowid = p_rowid;
1508 --
1509 if sql%notfound then
1510 hr_utility.set_message (801,'HR_6153_ALL_PROCEDURE_FAIL');
1511 hr_utility.set_message_token('PROCEDURE','PAY_INPUT_VALUES_PKG.DELETE_ROW');
1512 hr_utility.raise_error;
1513 end if;
1514 --
1515 --
1516 -- ****************************************************************************
1517 -- delete from MLS table (TL)
1518 --
1519
1520 --
1521 -- bugfix 1229606
1522 -- only delete data from the translated tables if the date track mode is ZAP,
1523 -- for all other date track modes the data should remain untouched
1524 --
1525 if p_delete_mode = 'ZAP' then
1526
1527 delete from PAY_INPUT_VALUES_F_TL
1528 where INPUT_VALUE_ID = P_INPUT_VALUE_ID;
1529 --
1530 if sql%notfound then -- trap system errors during deletion
1531 hr_utility.set_message (801,'HR_6153_ALL_PROCEDURE_FAIL');
1532 hr_utility.set_message_token('PROCEDURE','PAY_INPUT_VALUES_PKG.DELETE_TL_ROW');
1533 hr_utility.raise_error;
1534 end if;
1535
1536 end if;
1537 --
1538 -- ******************************************************************************
1539 --
1540 end if;
1541 --
1542 end delete_row;
1543 ---------------------------------------------------------------------------
1544 procedure LOCK_ROW (
1545 p_rowid VARCHAR2,
1546 p_INPUT_VALUE_ID NUMBER,
1547 p_EFFECTIVE_START_DATE DATE,
1548 p_EFFECTIVE_END_DATE DATE,
1549 p_ELEMENT_TYPE_ID NUMBER,
1550 p_LOOKUP_TYPE VARCHAR2,
1551 p_BUSINESS_GROUP_ID NUMBER,
1552 p_LEGISLATION_CODE VARCHAR2,
1553 p_FORMULA_ID NUMBER,
1554 p_DISPLAY_SEQUENCE NUMBER,
1555 p_GENERATE_DB_ITEMS_FLAG VARCHAR2,
1556 p_HOT_DEFAULT_FLAG VARCHAR2,
1557 p_MANDATORY_FLAG VARCHAR2,
1558 -- p_NAME VARCHAR2,
1559 -- --
1560 p_BASE_NAME VARCHAR2,
1561 -- --
1562 p_UOM VARCHAR2,
1563 p_DEFAULT_VALUE VARCHAR2,
1564 p_LEGISLATION_SUBGROUP VARCHAR2,
1565 p_MAX_VALUE VARCHAR2,
1566 p_MIN_VALUE VARCHAR2,
1567 p_WARNING_OR_ERROR VARCHAR2,
1568 -- Enhancement 2793978
1569 p_value_set_id NUMBER default null
1570 --
1571 ) is
1572 --
1573 cursor csr_lock_input_value is
1574 select *
1575 from pay_input_values_f
1576 where rowid = p_rowid
1577 for update of input_value_id nowait;
1578 --
1579 v_locked_row csr_lock_input_value%rowtype;
1580 -- MLS Row counter
1581 v_mls_count NUMBER:=0;
1582 --
1583 -- *****************************************************************
1584 -- cursor for MLS
1585 --
1586 cursor csr_lock_input_value_tl is
1587 select
1588 NAME,
1589 decode(LANGUAGE, userenv('LANG'), 'Y', 'N') BASELANG
1590 from PAY_INPUT_VALUES_F_TL
1591 where INPUT_VALUE_ID = P_INPUT_VALUE_ID
1592 and userenv('LANG') in (LANGUAGE, SOURCE_LANG)
1593 for update of INPUT_VALUE_ID nowait;
1594 --
1595 -- ****************************************************************
1596 --
1597 begin
1598 hr_utility.set_location ('PAY_INPUT_VALUES_PKG.lock_row',1);
1599 --
1600 open csr_lock_input_value;
1601 fetch csr_lock_input_value into v_locked_row;
1602 if csr_lock_input_value%notfound then
1603 close csr_lock_input_value;
1604 raise no_data_found;
1605 end if;
1606 close csr_lock_input_value;
1607 --
1608 /** sbilling **/
1609 -- removed explicit lock of _TL table,
1610 -- the MLS strategy requires that the base table is locked before update of the
1611 -- _TL table can take place,
1612 -- which implies it is not necessary to lock both tables.
1613 --
1614 -- ************************************************************************
1615 -- code for MLS
1616 --
1617 -- for tlinfo in csr_lock_input_value_tl LOOP
1618 -- v_mls_count := v_mls_count+1;
1619 -- if (tlinfo.BASELANG = 'Y') then
1620 -- if ( (tlinfo.NAME = P_NAME)
1621 -- ) then
1622 -- null;
1623 -- else
1624 -- hr_utility.set_message ('FND','FORM_RECORD_CHANGED');
1625 -- hr_utility.raise_error;
1626 -- end if;
1627 -- end if;
1628 -- end loop;
1629 --
1630 --
1631 -- if (v_mls_count=0) then -- Trap system errors
1632 -- hr_utility.set_message (801,'HR_6153_ALL_PROCEDURE_FAIL');
1633 -- hr_utility.set_message_token ('PROCEDURE','PAY_INPUT_VALUES_PKG.LOCK_TL_ROW');
1634 -- end if;
1635 --
1636 -- ************************************************************************
1637 --
1638 --
1639 if ((V_LOCKED_ROW.INPUT_VALUE_ID = p_INPUT_VALUE_ID) OR (V_LOCKED_ROW.INPUT_VALUE_ID is null and p_INPUT_VALUE_ID is null))
1640 and ((V_LOCKED_ROW.EFFECTIVE_START_DATE = p_EFFECTIVE_START_DATE) OR (V_LOCKED_ROW.EFFECTIVE_START_DATE is null and p_EFFECTIVE_START_DATE is null))
1641 and ((V_LOCKED_ROW.EFFECTIVE_END_DATE = p_EFFECTIVE_END_DATE) OR (V_LOCKED_ROW.EFFECTIVE_END_DATE is null and p_EFFECTIVE_END_DATE is null))
1642 and ((V_LOCKED_ROW.ELEMENT_TYPE_ID = p_ELEMENT_TYPE_ID) OR (V_LOCKED_ROW.ELEMENT_TYPE_ID is null and p_ELEMENT_TYPE_ID is null))
1643 and ((V_LOCKED_ROW.LOOKUP_TYPE = p_LOOKUP_TYPE) OR (V_LOCKED_ROW.LOOKUP_TYPE is null and p_LOOKUP_TYPE is null))
1644 and ((V_LOCKED_ROW.BUSINESS_GROUP_ID = p_BUSINESS_GROUP_ID) OR (V_LOCKED_ROW.BUSINESS_GROUP_ID is null and p_BUSINESS_GROUP_ID is null))
1645 and ((V_LOCKED_ROW.LEGISLATION_CODE = p_LEGISLATION_CODE) OR (V_LOCKED_ROW.LEGISLATION_CODE is null and p_LEGISLATION_CODE is null))
1646 and ((V_LOCKED_ROW.FORMULA_ID = p_FORMULA_ID) OR (V_LOCKED_ROW.FORMULA_ID is null and p_FORMULA_ID is null))
1647 and ((V_LOCKED_ROW.DISPLAY_SEQUENCE = p_DISPLAY_SEQUENCE) OR (V_LOCKED_ROW.DISPLAY_SEQUENCE is null and p_DISPLAY_SEQUENCE is null))
1648 and ((V_LOCKED_ROW.GENERATE_DB_ITEMS_FLAG= p_GENERATE_DB_ITEMS_FLAG) OR (V_LOCKED_ROW.GENERATE_DB_ITEMS_FLAG is null and p_GENERATE_DB_ITEMS_FLAG is null))
1649 and ((V_LOCKED_ROW.HOT_DEFAULT_FLAG = p_HOT_DEFAULT_FLAG) OR (V_LOCKED_ROW.HOT_DEFAULT_FLAG is null and p_HOT_DEFAULT_FLAG is null))
1650 and ((V_LOCKED_ROW.MANDATORY_FLAG = p_MANDATORY_FLAG) OR (V_LOCKED_ROW.MANDATORY_FLAG is null and p_MANDATORY_FLAG is null))
1651 --and ((V_LOCKED_ROW.NAME = p_NAME) OR (V_LOCKED_ROW.NAME is null and p_NAME is null))
1652 -- --
1653 and ((V_LOCKED_ROW.NAME = p_BASE_NAME) OR (V_LOCKED_ROW.NAME is null and p_BASE_NAME is null))
1654 -- --
1655 and ((V_LOCKED_ROW.UOM = p_UOM) OR (V_LOCKED_ROW.UOM is null and p_UOM is null))
1656 and ((V_LOCKED_ROW.DEFAULT_VALUE = p_DEFAULT_VALUE) OR (V_LOCKED_ROW.DEFAULT_VALUE is null and p_DEFAULT_VALUE is null))
1657 and ((V_LOCKED_ROW.LEGISLATION_SUBGROUP = p_LEGISLATION_SUBGROUP) OR (V_LOCKED_ROW.LEGISLATION_SUBGROUP is null and p_LEGISLATION_SUBGROUP is null))
1658 and ((V_LOCKED_ROW.MAX_VALUE = p_MAX_VALUE) OR (V_LOCKED_ROW.MAX_VALUE is null and p_MAX_VALUE is null))
1659 and ((V_LOCKED_ROW.MIN_VALUE = p_MIN_VALUE) OR (V_LOCKED_ROW.MIN_VALUE is null and p_MIN_VALUE is null))
1660 and ((V_LOCKED_ROW.WARNING_OR_ERROR = p_WARNING_OR_ERROR) OR (V_LOCKED_ROW.WARNING_OR_ERROR is null and p_WARNING_OR_ERROR is null)) then
1661 return;
1662 else
1663 hr_utility.set_message ('FND','FORM_RECORD_CHANGED');
1664 hr_utility.raise_error;
1665 end if;
1666 --
1667 end lock_row;
1668 ---------------------------------------------------------------------------
1669 procedure ADD_LANGUAGE
1670 is
1671 begin
1672 delete from PAY_INPUT_VALUES_F_TL T
1673 where not exists
1674 (select NULL
1675 from PAY_INPUT_VALUES_F B
1676 where B.INPUT_VALUE_ID = T.INPUT_VALUE_ID
1677 );
1678
1679 update PAY_INPUT_VALUES_F_TL T set (
1680 NAME
1681 ) = (select
1682 B.NAME
1683 from PAY_INPUT_VALUES_F_TL B
1684 where B.INPUT_VALUE_ID = T.INPUT_VALUE_ID
1685 and B.LANGUAGE = T.SOURCE_LANG)
1686 where (
1687 T.INPUT_VALUE_ID,
1688 T.LANGUAGE
1689 ) in (select
1690 SUBT.INPUT_VALUE_ID,
1691 SUBT.LANGUAGE
1692 from PAY_INPUT_VALUES_F_TL SUBB, PAY_INPUT_VALUES_F_TL SUBT
1693 where SUBB.INPUT_VALUE_ID = SUBT.INPUT_VALUE_ID
1694 and SUBB.LANGUAGE = SUBT.SOURCE_LANG
1695 and (SUBB.NAME <> SUBT.NAME
1696 ));
1697
1698 insert into PAY_INPUT_VALUES_F_TL (
1699 INPUT_VALUE_ID,
1700 NAME,
1701 LAST_UPDATE_DATE,
1702 LAST_UPDATED_BY,
1703 LAST_UPDATE_LOGIN,
1704 CREATED_BY,
1705 CREATION_DATE,
1706 LANGUAGE,
1707 SOURCE_LANG
1708 ) select
1709 B.INPUT_VALUE_ID,
1710 B.NAME,
1711 B.LAST_UPDATE_DATE,
1712 B.LAST_UPDATED_BY,
1713 B.LAST_UPDATE_LOGIN,
1714 B.CREATED_BY,
1715 B.CREATION_DATE,
1716 L.LANGUAGE_CODE,
1717 B.SOURCE_LANG
1718 from PAY_INPUT_VALUES_F_TL B, FND_LANGUAGES L
1719 where L.INSTALLED_FLAG in ('I', 'B')
1720 and B.LANGUAGE = userenv('LANG')
1721 and not exists
1722 (select NULL
1723 from PAY_INPUT_VALUES_F_TL T
1724 where T.INPUT_VALUE_ID = B.INPUT_VALUE_ID
1725 and T.LANGUAGE = L.LANGUAGE_CODE);
1726 end ADD_LANGUAGE;
1727 -----------------------------------------------------------
1728 procedure unique_chk(
1729 X_I_NAME in varchar2,
1730 X_I_LEGISLATION_CODE in varchar2,
1731 X_I_EFFECTIVE_START_DATE in date,
1732 X_I_EFFECTIVE_END_DATE in date,
1733 X_I_E_ELEMENT_NAME in varchar2,
1734 X_I_E_LEGISLATION_CODE in varchar2,
1735 X_I_E_EFFECTIVE_START_DATE in date,
1736 X_I_E_EFFECTIVE_END_DATE in date )
1737 is
1738 result varchar2(255);
1739 Begin
1740 SELECT count(*) INTO result
1741 FROM pay_element_types_f E, pay_input_values_F I
1742 WHERE I.ELEMENT_TYPE_ID = E.ELEMENT_TYPE_ID
1743 and nvl(E.ELEMENT_NAME,'~null~') = nvl(X_I_E_ELEMENT_NAME,'~null~')
1744 and nvl(E.LEGISLATION_CODE,'~null~') = nvl(X_I_E_LEGISLATION_CODE,'~null~')
1745 and E.EFFECTIVE_START_DATE = X_I_E_EFFECTIVE_START_DATE
1746 and E.EFFECTIVE_end_DATE = X_I_E_EFFECTIVE_END_DATE
1747 and X_I_E_EFFECTIVE_START_DATE is not NULL
1748 and X_I_E_EFFECTIVE_END_DATE is not NULL
1749 and E.BUSINESS_GROUP_ID is NULL
1750 and nvl(I.NAME,'~null~') = nvl(X_I_NAME,'~null~')
1751 and nvl(I.LEGISLATION_CODE,'~null~') = nvl(X_I_LEGISLATION_CODE,'~null~')
1752 and I.EFFECTIVE_START_DATE = X_I_EFFECTIVE_START_DATE
1753 and I.EFFECTIVE_end_DATE = X_I_EFFECTIVE_END_DATE
1754 and X_I_EFFECTIVE_START_DATE is not NULL
1755 and X_I_EFFECTIVE_END_DATE is not NULL
1756 and I.BUSINESS_GROUP_ID is NULL;
1757 --
1758 IF (result>1) THEN
1759 hr_utility.set_message(801,'HR_6153_ALL_PROCEDURE_FAIL');
1760 hr_utility.set_message_token('PROCEDURE','PAY_INPUT_VALUES_PKG.UNIQUE_CHK');
1761 hr_utility.set_message_token('STEP','1');
1762 hr_utility.raise_error;
1763 END IF;
1764 EXCEPTION
1765 when NO_DATA_FOUND then
1766 hr_utility.set_message(801,'HR_6153_ALL_PROCEDURE_FAIL');
1767 hr_utility.set_message_token('PROCEDURE','PAY_INPUT_VALUES_PKG.UNIQUE_CHK');
1768 hr_utility.set_message_token('STEP','1');
1769 hr_utility.raise_error;
1770 end unique_chk;
1771 --------------------------------------------------------------------------------
1772 procedure TRANSLATE_ROW (
1773 X_I_NAME in varchar2,
1774 X_I_LEGISLATION_CODE in varchar2,
1775 X_I_EFFECTIVE_START_DATE in date,
1776 X_I_EFFECTIVE_END_DATE in date,
1777 X_I_E_ELEMENT_NAME in varchar2,
1778 X_I_E_LEGISLATION_CODE in varchar2,
1779 X_I_E_EFFECTIVE_START_DATE in date,
1780 X_I_E_EFFECTIVE_END_DATE in date,
1781 X_NAME in varchar2,
1782 X_OWNER in varchar2 ) is
1783 --
1784 -- Fetch the input_value_id. This used to be a sub-query in the update
1785 -- statement.
1786 --
1787 cursor csr_ipv_id is
1788 select i.input_value_id
1789 from pay_element_types_f e
1790 , pay_input_values_f i
1791 WHERE i.element_type_id = e.element_type_id
1792 and nvl(e.element_name,'~null~') = nvl(x_i_e_element_name,'~null~')
1793 and nvl(e.legislation_code,'~null~') = nvl(x_i_e_legislation_code,'~null~')
1794 and e.effective_start_date = x_i_e_effective_start_date
1795 and e.effective_END_date = x_i_e_effective_end_date
1796 and x_i_e_effective_start_date is not null
1797 and x_i_e_effective_end_date is not null
1798 and e.business_group_id is null
1799 and nvl(i.name,'~null~') = nvl(x_i_name,'~null~')
1800 and nvl(i.legislation_code,'~null~') = nvl(x_i_legislation_code,'~null~')
1801 and i.effective_start_date = x_i_effective_start_date
1802 and i.effective_end_date = x_i_effective_end_date
1803 and x_i_effective_start_date is not null
1804 and x_i_effective_end_date is not null
1805 and i.business_group_id is null
1806 ;
1807 --
1808 -- Fetch information for the _TL rows that will be affected by the update.
1809 --
1810 cursor csr_tl_info
1811 (p_input_value_id in number
1812 ,p_language in varchar2
1813 ) is
1814 select name
1815 , language
1816 from pay_input_values_f_tl
1817 where input_value_id = p_input_value_id
1818 and p_language in (language, source_lang)
1819 ;
1820 --
1821 l_input_value_id number;
1822 l_found boolean;
1823 i binary_integer := 1;
1824 l_langs dbms_sql.varchar2s;
1825 l_lang varchar2(100);
1826 begin
1827 --
1828 -- Fetch the input_value_id.
1829 --
1830 open csr_ipv_id;
1831 fetch csr_ipv_id
1832 into l_input_value_id
1833 ;
1834 l_found := csr_ipv_id%found;
1835 close csr_ipv_id;
1836
1837
1838 l_lang := userenv('LANG');
1839
1840 if l_found then
1841 --
1842 -- Check if database item translations are supported.
1843 --
1844 if ff_dbi_utils_pkg.translations_supported
1845 (p_legislation_code => x_i_legislation_code
1846 ) then
1847 for crec in csr_tl_info
1848 (p_input_value_id => l_input_value_id
1849 ,p_language => l_lang
1850 ) loop
1851 if upper(crec.name) <> upper(x_name) then
1852 l_langs(i) := crec.language;
1853 i := i + 1;
1854 end if;
1855 end loop;
1856 end if;
1857
1858 UPDATE pay_input_values_f_tl
1859 SET name = nvl(x_name,name),
1860 last_update_date = sysdate,
1861 last_updated_by = decode(x_owner,'SEED',1,0),
1862 last_update_login = 0,
1863 source_lang = userenv('LANG')
1864 WHERE userenv('LANG') IN (language,source_lang)
1865 AND input_value_id = l_input_value_id
1866 ;
1867
1868 --
1869 -- Write any changes to PAY_DYNDBI_CHANGES.
1870 --
1871 if l_langs.count <> 0 then
1872 pay_dyndbi_changes_pkg.input_value_change
1873 (p_input_value_id => l_input_value_id
1874 ,p_languages => l_langs
1875 );
1876 end if;
1877 end if;
1878 end TRANSLATE_ROW;
1879 --------------------------------------------------------------------------------
1880 procedure init_where_clause (
1881 p_vset_defn in out nocopy fnd_vset.valueset_r
1882 )
1883 is
1884 --
1885 c_prof constant varchar2(20) := ':$PROFILES$.';
1886 --
1887 l_where_clause varchar2(32000);
1888 l_replace_string varchar2(200);
1889 l_src varchar2(100);
1890 l_value varchar2(240);
1891 l_default_value varchar2(240);
1892 l_idx number;
1893 l_ch varchar2(10);
1894 l_prof_len number;
1895 l_prof_found boolean;
1896 --
1897 begin
1898 --
1899 if p_vset_defn.validation_type <> 'F' or
1900 p_vset_defn.table_info.where_clause is null then
1901 --
1902 -- no where clause to initialize
1903 --
1904 return;
1905 --
1906 end if;
1907 --
1908 l_prof_len := length(c_prof);
1909 l_where_clause := p_vset_defn.table_info.where_clause;
1910 --
1911 loop
1912 --
1913 l_src := null;
1914 --
1915 -- find the position of ':$PROFILES$.' in the where clause
1916 --
1917 l_idx := instr(upper(l_where_clause),c_prof);
1918 --
1919 exit when l_idx = 0;
1920 --
1921 -- the where clause contains :$PROFILES$ references, the profile option
1922 -- needs to be resolved
1923 --
1924 l_prof_found := true;
1925 l_replace_string := substr(l_where_clause,l_idx,l_prof_len);
1926 l_idx := l_idx + l_prof_len;
1927 --
1928 -- loop to determine profile option name
1929 --
1930 loop
1931 --
1932 -- build up the profile option name 1 character at a time
1933 --
1934 l_ch := substr(l_where_clause,l_idx,1);
1935 --
1936 -- the profile option name can only contain alphanumeric characters and
1937 -- underscores so exit when l_ch is not one of these
1938 --
1939 exit when l_ch is null or
1940 not (upper(l_ch) between 'A' and 'Z' or l_ch between '0' and '9' or l_ch = '_');
1941 --
1942 l_src := l_src || l_ch;
1943 l_idx := l_idx + 1;
1944 --
1945 end loop;
1946 --
1947 l_default_value := null;
1948 --
1949 if l_ch = ':' then
1950 --
1951 -- a default value has been specified
1952 --
1953 l_idx := l_idx + 1;
1954 --
1955 -- loop to determine default value
1956 --
1957 loop
1958 --
1959 -- build up the default value 1 character at a time
1960 --
1961 l_ch := substr(l_where_clause,l_idx,1);
1962 --
1963 -- the default value can only contain alphanumeric characters and
1964 -- underscores so exit when l_ch is not one of these
1965 --
1966 exit when l_ch is null or
1967 not (upper(l_ch) between 'A' and 'Z' or l_ch between '0' and '9' or l_ch = '_');
1968 l_default_value := l_default_value || l_ch;
1969 l_idx := l_idx + 1;
1970 --
1971 end loop;
1972 --
1973 end if;
1974 --
1975 -- l_src now contains the profile option name, so append this to
1976 -- l_replace_string
1977 --
1978 l_replace_string := l_replace_string || l_src;
1979 --
1980 if l_default_value is not null then
1981 --
1982 -- l_default_value is not null so this also needs to be appended to
1983 -- l_replace_string
1984 --
1985 l_replace_string := l_replace_string ||':'||l_default_value;
1986 --
1987 end if;
1988 --
1989 -- now resolve the profile option value
1990 --
1991 l_value := null;
1992 fnd_profile.get(upper(l_src),l_value);
1993 --
1994 if l_value is null then
1995 --
1996 -- use the default value, or 'NULL' if the default is null
1997 --
1998 l_value := nvl(l_default_value,'NULL');
1999 --
2000 end if;
2001 --
2002 -- replace all occurrences of l_replace_string in l_where_clause with
2003 -- l_value (in single quotes)
2004 --
2005 l_where_clause := replace(l_where_clause,l_replace_string,''''||l_value||'''');
2006 --
2007 end loop;
2008 --
2009 -- all :$PROFILES$ references have been resolved, replace the where clause in
2010 -- p_vset_defn
2011 --
2012 if l_prof_found then
2013 --
2014 p_vset_defn.table_info.where_clause := l_where_clause;
2015 --
2016 end if;
2017 --
2018 end init_where_clause;
2019 --------------------------------------------------------------------------------
2020 -- Enhancement 2793978
2021 function decode_vset_value (
2022 p_value_set_id in number
2023 , p_value_set_value in varchar2
2024 )
2025 return varchar2 is
2026 --
2027 -- Returns the corresponding meaning from a value set for a given value.
2028 -- Returns meaning if hasmeaning() is true, returns value otherwise.
2029 --
2030 l_value_set_meaning varchar2(240);
2031 l_vset_defn fnd_vset.valueset_r;
2032 l_vset_fmt fnd_vset.valueset_dr;
2033 l_vset_value fnd_vset.value_dr;
2034 l_vset_row_count number;
2035 l_vset_value_found boolean;
2036 l_match_found boolean;
2037 --
2038 begin
2039 --
2040 fnd_vset.get_valueset(p_value_set_id,l_vset_defn,l_vset_fmt);
2041 init_where_clause(l_vset_defn);
2042 fnd_vset.get_value_init(l_vset_defn, true);
2043 fnd_vset.get_value(l_vset_defn,l_vset_row_count,l_vset_value_found,l_vset_value);
2044 --
2045 while l_vset_value_found loop
2046 --
2047 if l_vset_fmt.has_id and l_vset_value.id = p_value_set_value then
2048 l_match_found := true;
2049 elsif l_vset_value.value = p_value_set_value then
2050 l_match_found := true;
2051 else
2052 l_match_found := false;
2053 end if;
2054 --
2055 if l_match_found and l_vset_fmt.has_meaning then
2056 l_value_set_meaning := l_vset_value.meaning;
2057 exit;
2058 elsif l_match_found then
2059 l_value_set_meaning := l_vset_value.value;
2060 exit;
2061 end if;
2062 --
2063 fnd_vset.get_value(l_vset_defn,l_vset_row_count,l_vset_value_found,l_vset_value);
2064 --
2065 end loop;
2066 --
2067 fnd_vset.get_value_end(l_vset_defn);
2068 if l_match_found then
2069 return l_value_set_meaning;
2070 else
2071 return null;
2072 end if;
2073 --
2074 exception
2075 --
2076 when others then
2077 return null;
2078 --
2079 end decode_vset_value;
2080 --------------------------------------------------------------------------------
2081 -- Enhancement 2793978
2082 function decode_vset_meaning (
2083 p_value_set_id in number
2084 , p_value_set_meaning in varchar2
2085 )
2086 return varchar2 is
2087 --
2088 -- Returns the corresponding value from a value set for a given meaning.
2089 -- Returns id if hasid() is true, returns value otherwise.
2090 --
2091 l_value_set_value varchar2(150);
2092 l_vset_defn fnd_vset.valueset_r;
2093 l_vset_fmt fnd_vset.valueset_dr;
2094 l_vset_value fnd_vset.value_dr;
2095 l_vset_row_count number;
2096 l_vset_value_found boolean;
2097 l_match_found boolean;
2098 --
2099 begin
2100 --
2101 fnd_vset.get_valueset(p_value_set_id,l_vset_defn,l_vset_fmt);
2102 init_where_clause(l_vset_defn);
2103 fnd_vset.get_value_init(l_vset_defn, true);
2104 fnd_vset.get_value(l_vset_defn,l_vset_row_count,l_vset_value_found,l_vset_value);
2105 --
2106 while l_vset_value_found loop
2107 --
2108 if l_vset_fmt.has_meaning and l_vset_value.meaning = p_value_set_meaning then
2109 l_match_found := true;
2110 elsif l_vset_value.value = p_value_set_meaning then
2111 l_match_found := true;
2112 else
2113 l_match_found := false;
2114 end if;
2115 --
2116 if l_match_found and l_vset_fmt.has_id then
2117 l_value_set_value := l_vset_value.id;
2118 exit;
2119 elsif l_match_found then
2120 l_value_set_value := l_vset_value.value;
2121 exit;
2122 end if;
2123 --
2124 fnd_vset.get_value(l_vset_defn,l_vset_row_count,l_vset_value_found,l_vset_value);
2125 --
2126 end loop;
2127 --
2128 fnd_vset.get_value_end(l_vset_defn);
2129 if l_match_found and length(l_value_set_value) <= 60 then
2130 return l_value_set_value;
2131 else
2132 return null;
2133 end if;
2134 --
2135 exception
2136 --
2137 when others then
2138 return null;
2139 --
2140 end decode_vset_meaning;
2141 --------------------------------------------------------------------------------
2142 begin
2143 --
2144 c_user_id := fnd_global.user_id;
2145 c_login_id := fnd_global.login_id;
2146 --
2147 end PAY_INPUT_VALUES_PKG;