1 package body pycadar_pkg as
2 /* $Header: pycadar.pkb 120.2.12020000.6 2013/03/04 06:14:57 sbachu ship $ */
3 /*
4 --
5 rem +======================================================================+
6 rem | Copyright (c) 1993 Oracle Corporation |
7 rem | Redwood Shores, California, USA |
8 rem | All rights reserved. |
9 rem +======================================================================+
10 Name :pycadar
11 --
12 Change List
13 -----------
14 Date Name Vers Description
15 ----------- ---------- ----- -----------------------------------
16 03-JUN-1999 mmukherj 110.0 Created
17 07-AUG-2000 mmukherj 115.1 Taken out serveroutput on and dbms_output
18 23-MAR-2001 vpandya 115.2 Added get_labels function with three
19 input parameters.
20 09-MAY-2002 vpandya 115.4 Both Regular Salary and an element set up as
21 separate check like Bonus were printing only
22 one deposit advice.
23 Modified action creation cursor to
24 achieve this functonality.
25 12-JUN-2002 vpandya 115.5 For Multiple Assignment Payment functionality
26 Added procedure archive_action_creation that
27 will create assignment action when Canadian
28 Deposit Advice is run for Archiver.
29 17-JUL-2002 vpandya 115.6 Changed archive_action_creation and replaced
30 pay.multi_assignments_flag with
31 nvl(pay.multi_assignments_flag,'N') in SQL.
32 20-SEP-2002 pganguly 115.7 Changed the cursor c_actions, added
33 pay_payrolls_f in the from list. Added a NVL
34 in the where clause so if the payroll is not
35 passed then join to the ppa_mag.payroll_id.
36 Also joined the consolidation id passed with
37 consolidation_id of the pay_payrolls_f.
38 21-SEP-2002 pganguly 115.8 Added whenever oserror ...
39 04-NOV-2002 pganguly 115.9 Fixed Bug# 2579614. Added code in the range
40 cursor/assignment_action_creation so that
41 if assignment set is passed then it prints
42 'Deposit Advice' for those assignments only.
43 27-Jan-2003 vpandya 115.10 Fixed Bug# 2763252. Modified action_creation
44 and added condtion to check payroll id of
45 pay_payrolls_f if payroll id is null for
46 Direct Deposit(when Direct Deposit is run by
47 consolidation set only), so Deposit advice
48 should work for consolidation set only or
49 consolidation set along with payroll.
50 27-Jan-2003 vpandya 115.11 Added nocopy with out parameter as per gscc.
51 25-Feb-2003 vpandya 115.12 Changed archive_action_creation, checking
52 fetch only those assignment action for that
53 archiver has been run.
54 24-Mar-2003 vpandya 115.13 Bug 2862554: Changed archive_action_creation,
55 added distinct and person id in cursor.
56 03-Apr-2003 vpandya 115.14 Bug 2882568: Changed archive_action_creation,
57 commented line paa_run.source_action_id is
58 null to create assignment action for all GREs
59 13-May-2003 vpandya 115.15 Bug 2942093: Changed action_creation for live
60 Deposit Advice. Added distinct in select
61 clause and assignment_action_id in order by
62 clause in c_action cursor to get uniq deposit
63 advice.
64 22-Jul-2003 vpandya 115.16 Bug 3046204: Changed action_creation for live
65 Deposit Advice to print zero net pay deposit
66 advice.
67 24-Mar-2004 ssattini 115.17 Bug 3331023: 11510 changes done in
68 range_cursor and action_creation procedures
69 by removing rule hint and tuning them. Still
70 changes need to be done for archive_action_
71 creation procedure.
72 27-Jul-2004 ssattini 115.20 Bug 3438254: 11510 Performance changes done.
73 Changed the cursors and logic in
74 archive_action_creation procedure, also
75 added get_payroll_action procedure and
76 check_if_assignment_paid function. Tuned
77 c_actions_asg_set cursor in action_creation
78 procedure. Used the get_payroll_action
79 in range_cursor, action_creation procedures.
80 Added assignment_set validation logic for
81 c_actions_zero_pay records in
82 action_creation procedure.
83 15-Mar-2005 ssouresr 115.21 The condition that the consolidation set
84 should be linked to a payroll has been
85 removed from the range cursor and the
86 action creation functions
87 27-Apr-2005 sackumar 115.22 Bug 3800169. Modification in the logic of
88 action_creation_procedure. Merge the Zero pay
89 cursor in the c_action and c_actions_asg_set
90 cursor and introduce a flag_variable for zero pay
91 in the cursor fetch loop.
92 16-JUN-2005 mmukherj Removed the changes mentioned in 115.22.
93 in 115.22 the changes has been done by
94 merging the two cursors c_actions_zero_pay
95 and c_actions_asg_set. So what was happening
96 is that the cursoe c_actions_asg_set was
97 being called only if the assignment_set has
98 been passed , so the zero pay actions was not
99 checked if the Deposit Advice was not run
100 with assignment set. That was not the intention
101 of this fix.
102 22-Sep-2011 Pkoduri 115.24 bug#12377778 - Added the order by clause to the range cursor,
103 for the scenario where we run deposit advice with
104 Assignment Set.
105 This is to ensure that all the employees in that range
106 are picked up - because later we process only the emp
107 between the start and end assignments returned by range cursor.
108 05-MAR-2012 sgotlasw 115.25 " CANADIAN DEPOSIT ADVICE (XML) ENHANCEMENT "
109 Added following methods and set of new variables.
110 qualifying_proc - This method is invoked from
111 action creation code of generic package,
112 PAY_GENERIC_UPGRADE.
113 This qualifying procedure name is mentioned
114 PAY_REPORT_GROUPS table for 'PAYSLIP_REPORT_CA'
115 check_if_qualified_for_CA
116 08-MAR-2012 sgotlasw 115.26 Commented out condition in csr_asg, csr_inc_asg.
117 12-APR-2012 sgotlasw 115.27 Modified cursor in archive action creation code to pick
118 all the employees when 'Canadian Deposit Advice' is run
119 for particular date range.
120 11-MAY-2012 sgotlasw 115.28 Modified 'c_direct_deposit_run' cursor to check if the
121 payment is voided.
122 01-MAR-2013 sgotlasw 115.29 Created 'c_non_void_pymts' cursor to check if any of
123 non void payments exists for given archive action id
124 before creating assignment_actions.
125
126 --
127 --
128
129 */
130
131 ---------------------------------- get_payroll_action -------------------
132 /**********************************************************************
133 ** PROCEDURE : get_payroll_action
134 ** Description: Bug 3438254
135 ** This procedure returns the details for payroll action for
136 ** deposit advice. This is called in the range cursor,
137 ** action_creation and archive_action_creation procedures.
138 **********************************************************************/
139 PROCEDURE get_payroll_action(p_payroll_action_id in number
140 ,p_deposit_start_date out nocopy date
141 ,p_deposit_end_date out nocopy date
142 ,p_assignment_set_id out nocopy number
143 ,p_payroll_id out nocopy number
144 ,p_consolidation_set_id out nocopy number
145 )
146 IS
147 cursor c_get_payroll_action
148 (cp_payroll_action_id in number) is
149 select legislative_parameters,
150 start_date,
151 effective_date
152 from pay_payroll_actions
153 where payroll_action_id = cp_payroll_action_id;
154
155 lv_legislative_parameters VARCHAR2(2000);
156
157 ln_assignment_set_id NUMBER;
158 ln_payroll_id NUMBER;
159 ln_consolidation_set_id NUMBER;
160 ld_deposit_start_date DATE;
161 ld_deposit_end_date DATE;
162
163 BEGIN
164 open c_get_payroll_action(p_payroll_action_id);
165 fetch c_get_payroll_action into lv_legislative_parameters,
166 ld_deposit_start_date,
167 ld_deposit_end_date;
168 close c_get_payroll_action;
169
170 ln_assignment_set_id := pycadar_pkg.get_parameter(
171 'ASG_SET_ID',
172 lv_legislative_parameters);
173 ln_payroll_id := pycadar_pkg.get_parameter(
174 'PAYROLL_ID',
175 lv_legislative_parameters);
176 ln_consolidation_set_id := pycadar_pkg.get_parameter(
177 'CONSOLIDATION_SET_ID',
178 lv_legislative_parameters);
179
180 p_deposit_start_date := ld_deposit_start_date;
181 p_deposit_end_date := ld_deposit_end_date;
182 p_payroll_id := ln_payroll_id;
183 p_assignment_set_id := ln_assignment_set_id;
184 p_consolidation_set_id := ln_consolidation_set_id;
185
186 END get_payroll_action;
187
188 ----------------------------------- range_cursor ------------------------------
189 --
190 procedure range_cursor (pactid in number, sqlstr out nocopy varchar2) is
191 l_payroll_id number;
192 -- leg_param pay_payroll_actions.legislative_parameters%type;
193 l_asg_set_id hr_assignment_sets.assignment_set_id%TYPE;
194
195 --Bug 3331023
196 l_db_version varchar2(20);
197 -- Bug#4338254
198 ld_deposit_start_date DATE;
199 ld_deposit_end_date DATE;
200 ln_consolidation_set_id NUMBER;
201 --
202 begin
203
204 get_payroll_action(p_payroll_action_id => pactid
205 ,p_deposit_start_date => ld_deposit_start_date
206 ,p_deposit_end_date => ld_deposit_end_date
207 ,p_assignment_set_id => l_asg_set_id
208 ,p_payroll_id => l_payroll_id
209 ,p_consolidation_set_id => ln_consolidation_set_id);
210
211 /* Removed old code to use get_payroll_action bug#3438254 */
212
213 hr_utility.trace('l_payroll_id = ' || to_char(l_payroll_id));
214 hr_utility.trace('l_asg_set_id = ' || to_char(l_asg_set_id));
215
216 --Database Version --Bug 3331023
217
218 if (nvl(hr_general2.get_oracle_db_version, 0) < 10.0) then
219 l_db_version := '/*+ RULE */';
220 else
221 l_db_version := '/* NO RULE*/';
222 end if;
223
224 --
225 if l_asg_set_id is NOT NULL then
226
227 sqlstr := 'select
228 distinct paf.person_id
229 from
230 hr_assignment_set_amendments hasa,
231 per_all_assignments_f paf,
232 pay_payroll_actions ppa
233 where
234 ppa.payroll_action_id = :PACTID and
235 hasa.assignment_set_id = ' || to_char(l_asg_set_id) ||
236 ' and hasa.assignment_id = paf.assignment_id and
237 ppa.effective_date between
238 paf.effective_start_date and
239 paf.effective_end_date
240 order by paf.person_id '; --12377778
241
242 else
243
244 if l_payroll_id is not null then
245 --Bug 3331023-- Rule hint is used only for database version < 10.0
246 sqlstr := 'select '||l_db_version||' distinct pos.person_id
247 from pay_assignment_actions act,
248 per_all_assignments_f asg,
249 per_periods_of_service pos,
250 pay_payroll_actions pa2,
251 pay_payroll_actions pa1,
252 pay_all_payrolls_f ppf
253 where pa1.payroll_action_id = :payroll_action_id
254 and ppf.payroll_id = pycadar_pkg.get_parameter(''PAYROLL_ID'',
255 pa1.legislative_parameters)
256 and pa2.consolidation_set_id =
257 pycadar_pkg.get_parameter(''CONSOLIDATION_SET_ID'',
258 pa1.legislative_parameters)
259 and pa2.payroll_id = ppf.payroll_id
260 and pa2.effective_date between
261 pa1.start_date and pa1.effective_date
262 and pa2.effective_date between
263 ppf.effective_start_date and ppf.effective_end_date
264 and pa2.payroll_action_id= act.payroll_action_id
265 and asg.assignment_id = act.assignment_id
266 and pa2.effective_date between
267 asg.effective_start_date and asg.effective_end_date
268 and pos.period_of_service_id = asg.period_of_service_id
269 order by pos.person_id';
270
271 --
272 else
273 --Bug 3331023-- Rule hint is used only for database version < 10.0
274 sqlstr := 'select '||l_db_version||' distinct pos.person_id
275 from pay_assignment_actions act,
276 per_all_assignments_f asg,
277 per_periods_of_service pos,
278 pay_payroll_actions pa2,
279 pay_payroll_actions pa1,
280 pay_all_payrolls_f ppf
281 where pa1.payroll_action_id = :payroll_action_id
282 and pa2.consolidation_set_id =
283 pycadar_pkg.get_parameter(''CONSOLIDATION_SET_ID'',
284 pa1.legislative_parameters)
285 and pa2.payroll_id = ppf.payroll_id
286 and pa2.effective_date between
287 pa1.start_date and pa1.effective_date
288 and pa2.effective_date between
289 ppf.effective_start_date and ppf.effective_end_date
290 and act.payroll_action_id = pa2.payroll_action_id
291 and asg.assignment_id = act.assignment_id
292 and pa2.effective_date between
293 asg.effective_start_date and asg.effective_end_date
294 and pos.period_of_service_id = asg.period_of_service_id
295 order by pos.person_id';
296
297 --
298 end if; -- l_payroll_id validation
299
300 end if; -- End if Assignment Set ID
301
302 end range_cursor;
303
304
305 ---------------------------------- check_if_assignment_paid -------------------
306 /**********************************************************************
307 ** FUNCTION : check_if_assignment_paid
308 ** Parameters :
309 ** Description: Bug#3438254
310 ** Function call is added for eliminating the cursor
311 ** c_actions_zero_pay. This is called in the archive
312 ** action creation procedure.
313 **********************************************************************/
314 FUNCTION check_if_assignment_paid(p_prepayment_action_id in number,
315 p_deposit_start_date in date,
316 p_deposit_end_date in date,
317 p_consolidation_set_id in number)
318 RETURN VARCHAR2
319 IS
320 cursor c_direct_deposit_run
321 (cp_prepayment_action_id in number,
322 cp_deposit_start_date in date,
323 cp_deposit_end_date in date,
324 cp_consolidation_set_id in number
325 ) is
326 select 1
327 from dual
328 where exists
329 (select 1
330 from pay_action_interlocks pai_mag,
331 pay_assignment_actions paa_mag,
332 pay_payroll_actions ppa_mag
333 where pai_mag.locked_action_id = cp_prepayment_action_id
334 and pai_mag.locking_Action_id = paa_mag.assignment_action_id
335 and paa_mag.payroll_action_id = ppa_mag.payroll_action_id
336 and ppa_mag.action_type = 'M'
337 and ppa_mag.effective_date between cp_deposit_start_date
338 and cp_deposit_end_date
339 and ppa_mag.consolidation_set_id +0 = cp_consolidation_set_id
340 /* Bug 14061942 : Added to check if payment is voided. */
341 and not exists
342 (
343 select 1
344 from pay_action_interlocks pai,
345 pay_assignment_actions paa,
346 pay_payroll_actions ppa
347 where pai.locked_action_id = paa_mag.assignment_action_id
348 and pai.locking_Action_id = paa.assignment_action_id
349 and paa.payroll_action_id = ppa.payroll_action_id
350 and ppa.action_type = 'D'
351 )
352 );
353
354 cursor c_no_prepayments (cp_prepayment_action_id in number) is
355 select 1
356 from dual
357 where not exists
358 (select 1
359 from pay_pre_payments ppp
360 where ppp.assignment_action_id = cp_prepayment_action_id
361 );
362
363 lc_dd_flag VARCHAR2(1);
364 lc_no_prepayment_flag VARCHAR2(1);
365
366 lc_return_flag VARCHAR2(1);
367
368 BEGIN
369 hr_utility.trace(' p_prepayment_action_id '|| to_char(p_prepayment_action_id));
370 hr_utility.trace(' p_deposit_start_date ' || to_char(p_deposit_start_date)); hr_utility.trace(' p_deposit_end_date ' || to_char(p_deposit_end_date));
371 hr_utility.trace(' p_consolidation_set_id '|| to_char(p_consolidation_set_id));
372
373 lc_return_flag := 'N';
374 open c_direct_deposit_run(p_prepayment_action_id,
375 p_deposit_start_date,
376 p_deposit_end_date,
377 p_consolidation_set_id);
378 fetch c_direct_deposit_run into lc_dd_flag;
379 if c_direct_deposit_run%found then
380 lc_return_flag := 'Y';
381 hr_utility.trace('c_direct_deposit_run%found lc_return_flag: '|| lc_return_flag);
382
383 else
384 open c_no_prepayments(p_prepayment_action_id);
385 fetch c_no_prepayments into lc_no_prepayment_flag;
386 if c_no_prepayments%found then
387 lc_return_flag := 'Y';
388 hr_utility.trace('c_no_prepayments%found lc_return_flag: '|| lc_return_flag);
389 end if;
390 close c_no_prepayments;
391 end if;
392 close c_direct_deposit_run;
393
394 return (lc_return_flag);
395
396 END check_if_assignment_paid;
397 ---------------------------------- action_creation -----------------------------
398 --
399 procedure action_creation(pactid in number,
400 stperson in number,
401 endperson in number,
402 chunk in number) is
403
404 --Bug 3331023
405 l_db_version varchar2(20);
406 l_actions varchar2(4000);
407
408 TYPE PaidActions is REF CURSOR;
409 c_actions PaidActions;
410 --
411 --
412 -- Bug#3331023 removed rule hint for c_actions_zero_pay cursor and
413 -- added pay_all_payrolls_f table in the main query to use correct indexes
414
415 CURSOR c_actions_zero_pay
416 (
417 pactid number,
418 stperson number,
419 endperson number
420 ) is
421 select act.assignment_action_id,
422 act.assignment_id,
423 act.tax_unit_id
424 from pay_assignment_actions act,
425 per_all_assignments_f paf1,
426 per_periods_of_service pos,
427 pay_payroll_actions ppa_dar,
428 pay_payroll_actions ppa_mag_pmts,
429 pay_all_payrolls_f ppf
430 where ( ppa_dar.payroll_action_id = pactid
431 and ppa_mag_pmts.consolidation_set_id =
432 pycadar_pkg.get_parameter('CONSOLIDATION_SET_ID',
433 ppa_dar.legislative_parameters)
434 and ppa_mag_pmts.payroll_id = ppf.payroll_id
435 and ppa_mag_pmts.effective_date between ppa_dar.start_date
436 and ppa_dar.effective_date
437 and ppa_mag_pmts.effective_date between ppf.effective_start_date
438 and ppf.effective_end_date
439 and act.payroll_action_id = ppa_mag_pmts.payroll_action_id
440 and act.action_status = 'C'
441 and ppa_mag_pmts.action_type in ('P', 'U')
442 and paf1.assignment_id = act.assignment_id
443 and ppa_mag_pmts.effective_date between
444 paf1.effective_start_date and paf1.effective_end_date
445 and pos.period_of_service_id = paf1.period_of_service_id
446 and pos.person_id between stperson and endperson
447 and (paf1.payroll_id =
448 pycadar_pkg.get_parameter('PAYROLL_ID',
449 ppa_dar.legislative_parameters)
450 or pycadar_pkg.get_parameter('PAYROLL_ID',
451 ppa_dar.legislative_parameters)
452 is null)
453 -- No run results.
454 AND NOT EXISTS (SELECT ' '
455 FROM pay_pre_payments ppp,
456 pay_org_payment_methods_f popm
457 WHERE ppp.assignment_action_id = act.assignment_action_id
458 and ppp.org_payment_method_id = popm.org_payment_method_id
459 and popm.defined_balance_id IS NOT NULL)
460 -- and is not a reversal.
461 AND NOT EXISTS
462 ( Select ' '
463 from pay_action_interlocks int2,
464 pay_action_interlocks int4,
465 pay_assignment_actions paa4,
466 pay_payroll_actions ppa_run, --- RUN
467 pay_payroll_actions pact4, --- Reversal
468 pay_assignment_actions paa_run --- RUN
469 where int2.locking_action_id = act.assignment_action_id -- prepayment action
470 and int2.locked_action_id = paa_run.assignment_action_id
471 and paa_run.payroll_action_id = ppa_run.payroll_action_id
472 and ppa_run.action_type in ('R', 'Q')
473 and paa_run.assignment_action_id = int4.locked_action_id
474 and int4.locking_action_id = paa4.assignment_action_id
475 and pact4.payroll_action_id = paa4.payroll_action_id
476 and pact4.action_type = 'V'
477 )
478 )
479 order by pos.person_id, act.assignment_id DESC;
480
481
482 --
483 -- if assignment_set is passed then the cursor ignores
484 -- consolidation set and payroll passed a takes the payroll
485 -- considation set of the assignment set.
486 --
487 CURSOR c_actions_asg_set
488 (
489 pactid number,
490 stperson number,
491 endperson number,
492 p_assignment_set_id number
493 ) is
494 select act.assignment_action_id,
495 act.assignment_id,
496 act.tax_unit_id
497 from pay_assignment_actions act,
498 per_all_assignments_f paf1,
499 per_all_assignments_f paf2,
500 per_periods_of_service pos,
501 pay_payroll_actions ppa_dar,
502 pay_payroll_actions ppa_mag,
503 pay_all_payrolls_f ppf,
504 hr_assignment_sets has,
505 hr_assignment_set_amendments hasa
506 where ppa_dar.payroll_action_id = pactid
507 and has.assignment_set_id = p_assignment_set_id
508 and ppa_mag.effective_date between
509 ppa_dar.start_date and ppa_dar.effective_date
510 and ppa_mag.consolidation_set_id =
511 pycadar_pkg.get_parameter('CONSOLIDATION_SET_ID',ppa_dar.legislative_parameters)
512
513 and (( has.payroll_id is null
514 and nvl(ppa_mag.payroll_id,ppf.payroll_id) =
515 nvl(pycadar_pkg.get_parameter('PAYROLL_ID',ppa_dar.legislative_parameters),
516 nvl(ppa_mag.payroll_id,ppf.payroll_id))
517 ) or
518
519 nvl(ppa_mag.payroll_id,has.payroll_id) = has.payroll_id
520 )
521 and ppa_mag.effective_date between
522 ppf.effective_start_date and ppf.effective_end_date
523 and act.payroll_action_id = ppa_mag.payroll_action_id
524 and act.action_status = 'C'
525 and ppa_mag.action_type = 'M'
526 and hasa.assignment_set_id = has.assignment_set_id
527 and hasa.assignment_id = act.assignment_id
528 and hasa.include_or_exclude = 'I'
529 and paf1.assignment_id = act.assignment_id
530 and ppa_mag.effective_date between
531 paf1.effective_start_date and paf1.effective_end_date
532 and paf2.assignment_id = act.assignment_id
533 and ppa_dar.effective_date between
534 paf2.effective_start_date and paf2.effective_end_date
535 and paf2.payroll_id + 0 = paf1.payroll_id + 0
536 and pos.period_of_service_id = paf1.period_of_service_id
537 and pos.person_id between stperson and endperson
538 and (paf1.payroll_id = ppa_dar.payroll_id or ppa_dar.payroll_id is null)
539 and not exists
540 ( select ''
541 from pay_action_interlocks int2,
542 pay_action_interlocks int3,
543 pay_assignment_actions paa4,
544 pay_payroll_actions ppa_run, --- RUN
545 pay_payroll_actions pact4, --- Reversal
546 pay_assignment_actions paa_run, --- RUN
547 pay_assignment_actions paa_pp --- PREPAY
548 where int3.locked_action_id = act.assignment_action_id
549 and int3.locking_action_id = paa_pp.assignment_action_id
550 and int2.locked_action_id = paa_pp.assignment_action_id
551 and int2.locking_action_id = paa_run.assignment_action_id
552 and paa_run.payroll_action_id = ppa_run.payroll_action_id
553 and ppa_run.action_type in ('R', 'Q')
554 and paa_run.assignment_action_id = int3.locked_action_id
555 and int3.locking_action_id = paa4.assignment_action_id
556 and pact4.payroll_action_id = paa4.payroll_action_id
557 and pact4.action_type = 'V'
558 )
559 order by act.assignment_id;
560 --
561 /*****************************************************************
562 ** This cursor solves problem when there are multiple pre-payments
563 ** and multiple assignment actions , in this case we only want 1
564 ** assignment action for each pre-payment.
565 *****************************************************************/
566 cursor c_pre_payments (cp_dd_action_id in number) is
567 select locked_action_id
568 from pay_action_interlocks pai
569 where pai.locking_action_id = cp_dd_action_id; --Direct Deposit dd
570
571 /*****************************************************************
572 ** This cursor will get all the source actions for which the
573 ** assignment should get a deposit advice.
574 ** assignment action for each pre-payment (bug 890222) i.e.
575 ** Seperate Depsoit Advice for Seperate Check and Regular Run
576 *****************************************************************/
577 cursor c_payments (cp_pre_pymt_action_id in number) is
578 select distinct ppp.source_action_id
579 from pay_pre_payments ppp
580 where ppp.assignment_action_id = cp_pre_pymt_action_id
581 order by ppp.source_action_id;
582
583 cursor c_payroll_run (cp_pre_pymt_action_id in number) is
584 select assignment_action_id
585 from pay_action_interlocks pai,
586 pay_assignment_actions paa
587 where pai.locking_action_id = cp_pre_pymt_action_id
588 and paa.assignment_Action_id = pai.locked_action_id
589 and paa.run_type_id is null
590 order by action_sequence desc;
591
592 lockingactid number;
593 lockedactid number;
594 assignid number;
595 greid number;
596 num number;
597 --
598 ln_pre_pymt_action_id NUMBER;
599 ln_prev_pre_pymt_action_id NUMBER;
600
601 ln_source_action_id NUMBER;
602 ln_prev_source_action_id NUMBER;
603
604 ln_master_action_id NUMBER;
605
606 ln_prev_asg_act_id NUMBER;
607 --
608 ln_direct_dep_act_id NUMBER;
609 ln_deposit_action_id NUMBER;
610 ln_assignment_id NUMBER;
611 ln_tax_unit_id NUMBER;
612 --
613 l_asg_set_id hr_assignment_sets.assignment_set_id%TYPE;
614 --
615 /* Removed cur_leg_param cursor to use get_payroll_action bug#3438254 */
616
617 -- Bug#4338254
618 ld_deposit_start_date DATE;
619 ld_deposit_end_date DATE;
620 ln_payroll_id NUMBER;
621 ln_consolidation_set_id NUMBER;
622 lv_ass_set_on VARCHAR2(10);
623 --
624 -- algorithm is quite similar to the other process cases,
625 -- but we have to take into account assignments and
626 -- personal payment methods.
627 begin
628 -- hr_utility.trace_on('Y','CAASGSET');
629 hr_utility.set_location('pycadar.action_creation',1);
630 -- Initialising local variables here to avoid GSCC warnings
631 ln_prev_pre_pymt_action_id := null;
632 ln_prev_source_action_id := null;
633 ln_prev_asg_act_id := -999999;
634
635 -- checking Database Version Bug 3331023
636 if (nvl(hr_general2.get_oracle_db_version, 0) < 10.0) then
637 l_db_version := '/*+ RULE */';
638 else
639 l_db_version := '/* NO RULE*/';
640 end if;
641 --
642
643 -- Bug 3331023 Query string for the reference cursor c_actions used rule hint
644 -- if db_version is < 10 Bug 3331023
645 l_actions := 'select '||l_db_version||' distinct act.assignment_action_id,
646 act.assignment_id,
647 act.tax_unit_id
648 from pay_assignment_actions act,
649 per_all_assignments_f paf1,
650 per_all_assignments_f paf2,
651 per_periods_of_service pos,
652 pay_payroll_actions ppa_dar,
653 pay_payroll_actions ppa_mag,
654 pay_all_payrolls_f ppf
655 where ppa_dar.payroll_action_id = :pactid
656 and nvl(ppa_mag.payroll_id,ppf.payroll_id) =
657 NVL(pycadar_pkg.get_parameter(''PAYROLL_ID'',
658 ppa_dar.legislative_parameters),
659 nvl(ppa_mag.payroll_id,ppf.payroll_id))
660 and nvl(ppa_mag.payroll_id,ppf.payroll_id) = ppf.payroll_id
661 and ppa_mag.effective_date between
662 ppf.effective_start_date and ppf.effective_end_date
663 and nvl(ppf.multi_assignments_flag,''N'') = ''N''
664 and ppa_mag.consolidation_set_id + 0 =
665 pycadar_pkg.get_parameter(''CONSOLIDATION_SET_ID'',
666 ppa_dar.legislative_parameters)
667 and ppa_mag.effective_date between
668 ppa_dar.start_date and ppa_dar.effective_date
669 and act.payroll_action_id = ppa_mag.payroll_action_id
670 and act.action_status = ''C''
671 and ppa_mag.action_type = ''M''
672 and paf1.assignment_id = act.assignment_id
673 and ppa_mag.effective_date between
674 paf1.effective_start_date and paf1.effective_end_date
675 and paf2.assignment_id = act.assignment_id
676 and ppa_dar.effective_date between
677 paf2.effective_start_date and paf2.effective_end_date
678 and paf2.payroll_id + 0 = paf1.payroll_id + 0
679 and pos.period_of_service_id = paf1.period_of_service_id
680 and pos.person_id between :stperson and :endperson
681 and (( paf1.payroll_id = pycadar_pkg.get_parameter(''PAYROLL_ID'',
682 ppa_dar.legislative_parameters) )
683 or
684 ( pycadar_pkg.get_parameter(''PAYROLL_ID'',
685 ppa_dar.legislative_parameters) is null )
686 )
687 and not exists
688 (
689 Select ''''
690 from pay_action_interlocks int2,
691 pay_action_interlocks int3,
692 pay_assignment_actions paa4,
693 pay_payroll_actions ppa_run, --- RUN
694 pay_payroll_actions pact4, --- Reversal
695 pay_assignment_actions paa_run, --- RUN
696 pay_assignment_actions paa_pp --- PREPAY
697 where int3.locked_action_id = act.assignment_action_id
698 and int3.locking_action_id = paa_pp.assignment_action_id
699 and int2.locked_action_id = paa_pp.assignment_action_id
700 and int2.locking_action_id = paa_run.assignment_action_id
701 and paa_run.payroll_action_id = ppa_run.payroll_action_id
702 and ppa_run.action_type in (''R'', ''Q'')
703 and paa_run.assignment_action_id = int3.locked_action_id
704 and int3.locking_action_id = paa4.assignment_action_id
705 and pact4.payroll_action_id = paa4.payroll_action_id
706 and pact4.action_type = ''V''
707 )
708 order by act.assignment_id, act.assignment_action_id';
709
710 get_payroll_action(p_payroll_action_id => pactid
711 ,p_deposit_start_date => ld_deposit_start_date
712 ,p_deposit_end_date => ld_deposit_end_date
713 ,p_assignment_set_id => l_asg_set_id
714 ,p_payroll_id => ln_payroll_id
715 ,p_consolidation_set_id => ln_consolidation_set_id);
716
717 /* removed old code to use get_payroll_action bug#3438254 */
718
719 hr_utility.set_location('pycadar.action_creation l_asg_set_id = '
720 ,l_asg_set_id);
721
722 IF l_asg_set_id IS NOT NULL THEN
723 open c_actions_asg_set(pactid,stperson,endperson,l_asg_set_id);
724 ELSE
725
726 -- Reference cursor opened for the query string l_paid_actions Bug 3331023
727 open c_actions for l_actions using pactid, stperson, endperson;
728 END IF;
729
730 num := 0;
731 loop
732 hr_utility.set_location('pycadar.action_creation',2);
733 IF l_asg_set_id IS NOT NULL THEN
734 fetch c_actions_asg_set into lockedactid,assignid,greid;
735 if c_actions_asg_set%found then num := num + 1; end if;
736 exit when c_actions_asg_set%notfound;
737 ELSE
738 fetch c_actions into lockedactid,assignid,greid;
739 if c_actions%found then
740 num := num + 1;
741 end if;
742 exit when c_actions%notfound;
743 END IF;
744 --
745 IF lockedactid <> ln_prev_asg_act_id THEN
746
747 hr_utility.trace(' c_actions.lockedactid is '||to_char(lockedactid));
748 open c_pre_payments (lockedactid);
749 fetch c_pre_payments into ln_pre_pymt_action_id;
750 hr_utility.trace(' c_pre_payments.ln_pre_pymt_action_id is'
751 ||to_char(ln_pre_pymt_action_id));
752 close c_pre_payments;
753
754 -- we need to insert one action for each of the
755 -- rows that we return from the cursor (i.e. one
756 -- for each assignment/pre-payment).
757
758 hr_utility.trace(' ln_prev_pre_pymt_action_id is'
759 ||to_char(ln_prev_pre_pymt_action_id));
760 if (ln_prev_pre_pymt_action_id is null or
761 ln_prev_pre_pymt_action_id <> ln_pre_pymt_action_id) then
762 open c_payments (ln_pre_pymt_action_id);
763 loop
764 hr_utility.set_location('procdar',99);
765 fetch c_payments into ln_source_action_id;
766 hr_utility.trace(' ln_source_action_id is'
767 ||to_char(ln_source_action_id));
768
769 hr_utility.set_location('procdar',98);
770 if c_payments%notfound then
771 exit;
772 end if;
773 hr_utility.set_location('procdar',97);
774 /**************************************************************
775 ** we need to insert one action for each of the rows that we
776 ** return from the cursor (i.e. one for each
777 ** assignment/pre-payment source).
778 **************************************************************/
779 hr_utility.trace(' ln_prev_source_action_id is'
780 ||to_char(ln_prev_source_action_id));
781 if (ln_prev_source_action_id is null or
782 ln_source_action_id <> ln_prev_source_action_id or
783 ln_source_action_id is null) then
784
785 hr_utility.set_location('procdar',3);
786 select pay_assignment_actions_s.nextval
787 into lockingactid
788 from dual;
789
790 -- insert the action record.
791 hr_nonrun_asact.insact(lockingactid,assignid,
792 pactid,chunk,greid);
793 hr_utility.trace('Inserted into paa');
794 hr_utility.trace(' assignment_id is ' ||to_char(assignid));
795 -- insert an interlock to this action.
796 hr_nonrun_asact.insint(lockingactid,lockedactid);
797 hr_utility.trace('Inserted into interlock');
798
799 if ln_source_action_id is not null then
800
801 hr_utility.trace('serial number updated if loop ');
802 hr_utility.trace('serial number is '||ln_source_action_id);
803 update pay_assignment_Actions
804 set serial_number = 'P'||ln_source_action_id
805 --set serial_number = ln_source_action_id
806 where assignment_action_id = lockingactid;
807 else
808 hr_utility.trace('serial number else ');
809 open c_payroll_run (ln_pre_pymt_action_id);
810 fetch c_payroll_run into ln_master_action_id;
811 close c_payroll_run;
812 hr_utility.trace(' ln_master_action_id is'
813 ||to_char(ln_master_action_id));
814
815 update pay_assignment_Actions
816 set serial_number = 'M'||ln_master_action_id
817 --set serial_number = ln_master_action_id
818 where assignment_action_id = lockingactid;
819 end if;
820
821 -- skip till next source action id
822 ln_prev_source_action_id := ln_source_action_id;
823 end if;
824 end loop;
825 close c_payments;
826
827 ln_prev_pre_pymt_action_id := ln_pre_pymt_action_id;
828
829 end if;
830
831 ln_prev_asg_act_id := lockedactid;
832
833 END IF;
834 end loop;
835 if l_asg_set_id is not null then
836 close c_actions_asg_set;
837 else
838 close c_actions;
839 end if;
840
841 /* removed the commented code bug#3438254 */
842
843 hr_utility.set_location('procdar',4);
844 ln_prev_pre_pymt_action_id := null;
845 open c_actions_zero_pay(pactid,stperson,endperson);
846
847 loop
848 hr_utility.set_location('procdar',5);
849 lv_ass_set_on := 'N';
850 hr_utility.trace('Start of c_actions_zero_pay ');
851 fetch c_actions_zero_pay INTO ln_direct_dep_act_id, --gives P,U
852 ln_assignment_id,
853 ln_tax_unit_id;
854 exit WHEN c_actions_zero_pay%NOTFOUND;
855 hr_utility.trace(' NZ PrePayment Id is' ||ln_direct_dep_act_id);
856
857 /* Added this code for Assignment set validation bug#3438254,
858 Otherwise it was displaying all the assignments that are
859 not in the given Assignment Set.
860 */
861 lv_ass_set_on := hr_assignment_set.assignment_in_set(
862 l_asg_set_id,
863 ln_assignment_id);
864 hr_utility.trace('lv_ass_set_on : '||lv_ass_set_on);
865
866 If lv_ass_set_on = 'Y' then
867
868 open c_pre_payments (ln_direct_dep_act_id); --gives me R,Q
869 fetch c_pre_payments into ln_pre_pymt_action_id;
870 close c_pre_payments;
871
872 hr_utility.trace(' NZ Run ActionId is' ||to_char(ln_pre_pymt_action_id));
873 hr_utility.trace(' NZ ln_prev_pre_pymt_action_id is' ||to_char(ln_prev_pre_pymt_action_id));
874
875 if (ln_prev_pre_pymt_action_id is null or
876 ln_prev_pre_pymt_action_id <> ln_pre_pymt_action_id) then
877
878 hr_utility.set_location('procdar',6);
879 select pay_assignment_actions_s.nextval
880 into ln_deposit_action_id
881 from dual;
882
883 -- insert the action record.
884 hr_nonrun_asact.insact(ln_deposit_action_id,
885 ln_assignment_id,
886 pactid, chunk, ln_tax_unit_id);
887
888 -- insert an interlock to this action.
889 hr_nonrun_asact.insint(ln_deposit_action_id,ln_direct_dep_act_id);
890 hr_utility.trace(' NZ Inserted into paa');
891 hr_utility.trace(' Asg id: '||to_char(ln_assignment_id));
892
893 /* removed the commented code bug#3438254 */
894
895 update pay_assignment_Actions
896 set serial_number = 'Z'||ln_direct_dep_act_id
897 where assignment_action_id = ln_deposit_action_id;
898
899 -- skip till next pre payment action id
900 ln_prev_pre_pymt_action_id := ln_pre_pymt_action_id;
901
902 end if;
903
904 End if; -- lv_ass_set_on = 'Y'
905
906 end loop;
907 close c_actions_zero_pay;
908 -- hr_utility.trace_off;
909
910 commit;
911 end action_creation;
912 --------------------- archive_action_creation ----------------------------
913 PROCEDURE archive_action_creation(pactid in number,
914 stperson in number,
915 endperson in number,
916 chunk in number) is
917
918 -- Bug#3438254 -- Cursor definition changed to improve performance.
919 cursor c_paid_actions
920 (cp_start_person in number,
921 cp_end_person in number,
922 cp_payroll_id in number,
923 cp_consolidation_set_id in number,
924 cp_deposit_start_date in date,
925 cp_deposit_end_date in date) is
926 select paa_pyarch.assignment_action_id,
927 paa_pyarch.assignment_id,
928 paa_pyarch.tax_unit_id
929 from pay_payroll_actions ppa_pyarch,
930 pay_assignment_actions paa_pyarch,
931 per_assignments_f paf,
932 pay_action_interlocks pai_pre
933 where ppa_pyarch.report_type = 'PY_ARCHIVER'
934 and ppa_pyarch.report_category = 'RT'
935 and ppa_pyarch.report_qualifier = 'PYCAPYAR'
936 /* and cp_deposit_end_date between ppa_pyarch.start_date
937 and ppa_pyarch.effective_date */
938 /* Bug 13934170 : Modified above date range condition as follows */
939 and ppa_pyarch.effective_date between cp_deposit_start_date
940 and cp_deposit_end_date
941 and cp_deposit_end_date between paf.effective_start_date
942 and paf.effective_end_date
943 and pycadar_pkg.get_parameter('CONSOLIDATION_SET_ID',
944 ppa_pyarch.legislative_parameters)
945 = cp_consolidation_set_id
946 and paa_pyarch.payroll_action_id = ppa_pyarch.payroll_action_id
947 -- the statement below will make sure only Pre Payment Archive
948 -- Actions are picked up
949 and substr(paa_pyarch.serial_number,1,1) not in ('V', 'B')
950 and paa_pyarch.assignment_id = paf.assignment_id
951 and ppa_pyarch.effective_date between paf.effective_start_date
952 and paf.effective_end_date
953 and pai_pre.locking_Action_id = paa_pyarch.assignment_action_id
954 and (cp_payroll_id is null
955 or
956 pycadar_pkg.get_parameter('PAYROLL_ID',
957 ppa_pyarch.legislative_parameters)
958 = cp_payroll_id
959 )
960 and paf.person_id between cp_start_person and cp_end_person
961 and pay_us_employee_payslip_web.get_doc_eit(
962 'PAYSLIP','PRINT',
963 'ASSIGNMENT',paf.assignment_id,
964 cp_deposit_end_date
965 ) = 'Y'
966 and pycadar_pkg.check_if_assignment_paid(
967 pai_pre.locked_action_id,
968 cp_deposit_start_date,
969 cp_deposit_end_date,
970 cp_consolidation_set_id) = 'Y'
971 and not exists
972 (Select 1
973 from pay_action_interlocks pai_run, --Pre > Run
974 pay_action_interlocks pai_rev, --Run > Rev
975 pay_assignment_actions paa_rev, --Rev
976 pay_payroll_actions ppa_rev --Rev
977 where pai_run.locking_action_id = pai_pre.locked_action_id
978 and pai_rev.locked_action_id = pai_run.locked_action_id
979 and paa_rev.assignment_action_id = pai_run.locking_action_id
980 and ppa_rev.payroll_action_id = paa_rev.payroll_action_id
981 and ppa_rev.action_type in ('V')
982 )
983 and exists (select 1
984 from pay_action_information pai
985 where pai.action_context_id = paa_pyarch.assignment_action_id)
986 order by paf.person_id, paf.assignment_id desc;
987
988 /*Added the following cursor to check if any non void payments exist
989 for given archiver action id for bug 16387461*/
990 cursor c_non_void_pymts (cp_action_id in number) is
991 select 1
992 from dual
993 where exists
994 (select 1
995 from PAY_EMP_NET_DIST_ACTION_INFO_V net_pay,
996 pay_assignment_actions paa_mag,
997 pay_payroll_actions ppa_mag
998 where net_pay.action_context_id = cp_action_id
999 and net_pay.pre_payment_id = paa_mag.pre_payment_id
1000 and ppa_mag.payroll_action_id = paa_mag.payroll_action_id
1001 and ppa_mag.action_type = 'M'
1002 and paa_mag.action_status = 'C'
1003 and net_pay.pre_payment_id is not null
1004 and not exists
1005 (
1006 select 1
1007 from pay_action_interlocks pai,
1008 pay_assignment_actions paa,
1009 pay_payroll_actions ppa
1010 where pai.locked_action_id = paa_mag.assignment_action_id
1011 and pai.locking_Action_id = paa.assignment_action_id
1012 and paa.payroll_action_id = ppa.payroll_action_id
1013 and ppa.action_type = 'D'
1014 )
1015 );
1016
1017
1018 lc_nv_flag VARCHAR2(1); /* Bug 16387461 sbachu*/
1019 ln_dd_action_id NUMBER;
1020 ln_deposit_action_id NUMBER;
1021
1022 ln_person_id NUMBER;
1023 ln_assignment_id NUMBER;
1024 ln_tax_unit_id NUMBER;
1025 ld_effective_date DATE;
1026
1027
1028 ln_asg_set_id NUMBER;
1029 lv_ass_set_on VARCHAR2(10);
1030
1031 -- Bug#4338254
1032 ld_deposit_start_date DATE;
1033 ld_deposit_end_date DATE;
1034 ln_payroll_id NUMBER;
1035 ln_consolidation_set_id NUMBER;
1036
1037 BEGIN
1038
1039 get_payroll_action(p_payroll_action_id => pactid
1040 ,p_deposit_start_date => ld_deposit_start_date
1041 ,p_deposit_end_date => ld_deposit_end_date
1042 ,p_assignment_set_id => ln_asg_set_id
1043 ,p_payroll_id => ln_payroll_id
1044 ,p_consolidation_set_id => ln_consolidation_set_id);
1045
1046 -- hr_utility.trace_on(null, 'ARCH_DEPADV');
1047 hr_utility.set_location('pycadar archive_action_creation',1);
1048 open c_paid_actions(stperson, endperson,
1049 ln_payroll_id,
1050 ln_consolidation_set_id,
1051 ld_deposit_start_date,
1052 ld_deposit_end_date);
1053 loop
1054 hr_utility.set_location('pycadar archive_action_creation',2);
1055
1056 lv_ass_set_on := 'N';
1057
1058 fetch c_paid_actions into ln_dd_action_id,
1059 ln_assignment_id,
1060 ln_tax_unit_id;
1061 exit WHEN c_paid_actions%NOTFOUND;
1062
1063 open c_non_void_pymts(ln_dd_action_id); /* Bug 16387461 sbachu*/
1064 fetch c_non_void_pymts into lc_nv_flag;
1065 if c_non_void_pymts%found then
1066
1067 lv_ass_set_on := hr_assignment_set.assignment_in_set(
1068 ln_asg_set_id,
1069 ln_assignment_id);
1070 hr_utility.trace('lv_ass_set_on : '||lv_ass_set_on);
1071
1072 IF lv_ass_set_on = 'Y' THEN
1073 hr_utility.trace('c_paid_actions.ln_dd_action_id is' ||to_char(ln_dd_action_id));
1074 hr_utility.trace(' ln_assignment_id is' ||to_char(ln_assignment_id));
1075 hr_utility.trace(' ln_tax_unit_id is' ||to_char(ln_tax_unit_id));
1076
1077 hr_utility.set_location('pycadar archive_action_creation',3);
1078 select pay_assignment_actions_s.nextval
1079 into ln_deposit_action_id
1080 from dual;
1081
1082 -- insert the action record.
1083 hr_nonrun_asact.insact(ln_deposit_action_id,
1084 ln_assignment_id,
1085 pactid, chunk, ln_tax_unit_id);
1086 hr_utility.trace('Inserted into paa, New Asg_act_id:'||to_char(ln_deposit_action_id));
1087 -- insert an interlock to this action.
1088 hr_nonrun_asact.insint(ln_deposit_action_id, ln_dd_action_id);
1089
1090 update pay_assignment_Actions
1091 set serial_number = ln_dd_action_id
1092 where assignment_action_id = ln_deposit_action_id;
1093
1094 END IF;
1095 end if;
1096 close c_non_void_pymts;
1097 end loop;
1098 close c_paid_actions;
1099
1100 hr_utility.set_location('pycadar archive_action_creation',4);
1101
1102 END archive_action_creation;
1103
1104 ---------------------------------- sort_action -------------------------------
1105 procedure sort_action
1106 (
1107 procname in varchar2, /* name of the select statement to use */
1108 sqlstr in out nocopy varchar2, /* string holding the sql statement */
1109 len out nocopy number /* length of the sql string */
1110 ) is
1111 begin
1112 -- go through each of the sql sub strings and see if
1113 -- they are needed.
1114 sqlstr := 'select paa.rowid
1115 from hr_organization_units hou,
1116 per_people_f ppf,
1117 per_assignments_f paf,
1118 pay_assignment_actions paa,
1119 pay_payroll_actions ppa
1120 where ppa.payroll_action_id = :pactid
1121 and paa.payroll_action_id = ppa.payroll_action_id
1122 and paa.assignment_id = paf.assignment_id
1123 and ppa.effective_date between
1124 paf.effective_start_date and paf.effective_end_date
1125 and paf.person_id = ppf.person_id
1126 and ppa.effective_date between
1127 ppf.effective_start_date and ppf.effective_end_date
1128 and paf.organization_id = hou.organization_id
1129 order by hou.name,ppf.last_name,ppf.first_name
1130 for update of paf.assignment_id';
1131 len := length(sqlstr); -- return the length of the string.
1132 end sort_action;
1133 --
1134 ------------------------------ get_parameter -------------------------------
1135 function get_parameter(name in varchar2,
1136 parameter_list varchar2) return varchar2
1137 is
1138 start_ptr number;
1139 end_ptr number;
1140 token_val pay_payroll_actions.legislative_parameters%type;
1141 par_value pay_payroll_actions.legislative_parameters%type;
1142 begin
1143 --
1144 token_val := name||'=';
1145 --
1146 start_ptr := instr(parameter_list, token_val) + length(token_val);
1147 end_ptr := instr(parameter_list, ' ', start_ptr);
1148 --
1149 /* if there is no spaces use then length of the string */
1150 if end_ptr = 0 then
1151 end_ptr := length(parameter_list)+1;
1152 end if;
1153 --
1154 /* Did we find the token */
1155 if instr(parameter_list, token_val) = 0 then
1156 par_value := NULL;
1157 else
1158 par_value := substr(parameter_list, start_ptr, end_ptr - start_ptr);
1159 end if;
1160 --
1161 return par_value;
1162 --
1163 end get_parameter;
1164 --
1165
1166 function get_labels(p_lookup_type in VARCHAR2,
1167 p_lookup_code in VARCHAR2)
1168 return VARCHAR2 is
1169 cursor csr_label_meaning is
1170 select meaning
1171 from hr_lookups
1172 where lookup_type = p_lookup_type
1173 and lookup_code = p_lookup_code;
1174
1175 l_label_meaning varchar2(80);
1176 begin
1177 open csr_label_meaning;
1178
1179 fetch csr_label_meaning into l_label_meaning;
1180 if csr_label_meaning%NOTFOUND then
1181 l_label_meaning := NULL;
1182 end if;
1183 close csr_label_meaning;
1184
1185 return l_label_meaning;
1186 end get_labels;
1187
1188 --
1189 function get_labels(p_lookup_type in VARCHAR2,
1190 p_lookup_code in VARCHAR2,
1191 p_person_language in varchar2)
1192 return VARCHAR2 is
1193 cursor csr_label_meaning is
1194 select 1 ord, meaning
1195 from fnd_lookup_values
1196 where lookup_type = p_lookup_type
1197 and lookup_code = p_lookup_code
1198 and ( ( p_person_language is null and language = 'US' ) or
1199 ( p_person_language is not null and language = p_person_language ) )
1200 union all
1201 select 2 ord, meaning
1202 from fnd_lookup_values
1203 where lookup_type = p_lookup_type
1204 and lookup_code = p_lookup_code
1205 and ( language = 'US' and p_person_language is not null
1206 and language <> p_person_language )
1207 order by 1;
1208
1209 l_order number;
1210 l_label_meaning varchar2(80);
1211 begin
1212 open csr_label_meaning;
1213
1214 fetch csr_label_meaning into l_order, l_label_meaning;
1215 if csr_label_meaning%NOTFOUND then
1216 l_label_meaning := NULL;
1217 end if;
1218 close csr_label_meaning;
1219
1220 return l_label_meaning;
1221 end get_labels;
1222
1223 /* Bug 13773865: CANADIAN DEPOSIT ADVICE (XML) ENHANCEMENT
1224 Added following 2 sub program units.
1225 qualifying_proc
1226 check_if_qualified_for_CA
1227 */
1228
1229 PROCEDURE qualifying_proc(p_assignment_id IN NUMBER
1230 ,p_qualifier OUT NOCOPY VARCHAR2 ) IS
1231 --
1232 l_actid NUMBER;
1233 l_rep_group pay_report_groups.report_group_name%TYPE;
1234 l_rep_category pay_report_categories.category_name%TYPE;
1235 l_effective_date DATE;
1236 l_business_group_id NUMBER;
1237 l_assignment_set_id NUMBER;
1238 l_assignment_id NUMBER;
1239 l_inc_exc VARCHAR2(1);
1240 l_asg_inc_exc VARCHAR2(1);
1241 --
1242 l_payroll_id NUMBER;
1243 l_consolidation_set_id NUMBER;
1244 l_start_date VARCHAR2(20);
1245 l_end_date VARCHAR2(20);
1246 l_legislation_code VARCHAR2(10);
1247 l_start_dt DATE;
1248 l_end_dt DATE;
1249 l_qualifier VARCHAR2(1);
1250 --
1251 ln_curr_payroll_act_id NUMBER;
1252 k NUMBER;
1253 ln_assignment_id NUMBER;
1254 ln_action_ctx_id NUMBER;
1255 --
1256 sql_cur NUMBER;
1257 l_rows NUMBER;
1258 statem VARCHAR2(256);
1259 --
1260 CURSOR csr_asg(c_payroll_id NUMBER
1261 ,c_consolidation_set_id NUMBER
1262 ,c_start_date DATE
1263 ,c_end_date DATE
1264 ,c_pa_token VARCHAR2
1265 ,c_cs_token VARCHAR2
1266 ,c_legislation_code VARCHAR2) IS
1267 SELECT /* 'Y' */
1268 distinct paa.assignment_id
1269 ,pai.action_context_id
1270 FROM pay_assignment_actions paa
1271 ,pay_payroll_actions ppa
1272 ,hr_lookups hrl
1273 ,pay_action_information pai
1274 ,per_time_periods ptp
1275 WHERE /* paa.assignment_id = c_assignment_id */
1276 ppa.effective_Date BETWEEN c_start_date
1277 AND c_end_date
1278 AND ppa.report_type = hrl.meaning
1279 AND hrl.lookup_type = 'PAYSLIP_REPORT_TYPES'
1280 AND hrl.lookup_code = c_legislation_code
1281 AND NVL(c_payroll_id,NVL(pay_payslip_report.get_parameter(ppa.legislative_parameters,c_pa_token),-1))
1282 = NVL(pay_payslip_report.get_parameter(ppa.legislative_parameters,c_pa_token),-1)
1283 AND c_consolidation_set_id = pay_payslip_report.get_parameter(ppa.legislative_parameters,c_cs_token)
1284
1285 --
1286 --
1287 AND ppa.payroll_action_id = paa.payroll_action_id
1288 -- AND paa.source_action_id IS NULL --RLN P1 8941027
1289 --
1290 --
1291 AND pai.assignment_id = paa.assignment_id
1292 AND pai.action_context_type = 'AAP'
1293 AND pai.action_information_category = 'EMPLOYEE DETAILS'
1294 AND pai.action_context_id = paa.assignment_action_id
1295 AND ptp.time_period_id = pai.ACTION_INFORMATION16;
1296
1297 /* AND check_if_qualified_for_CA(pai.action_context_id
1298 ,paa.assignment_id
1299 ,c_start_date
1300 ,c_end_date
1301 ,c_consolidation_set_id) = 'Y'; */
1302
1303 --
1304 CURSOR csr_inc_asg(c_payroll_id NUMBER
1305 ,c_consolidation_set_id NUMBER
1306 ,c_start_date DATE
1307 ,c_end_date DATE
1308 ,c_pa_token VARCHAR2
1309 ,c_cs_token VARCHAR2
1310 ,c_legislation_code VARCHAR2
1311 ,c_assignment_set_id NUMBER ) IS
1312 SELECT /* 'Y' */
1313 distinct paa.assignment_id
1314 ,pai.action_context_id
1315 FROM pay_assignment_actions paa
1316 ,pay_payroll_actions ppa
1317 ,hr_lookups hrl
1318 ,hr_assignment_set_amendments hasa
1319 ,pay_action_information pai
1320 ,per_time_periods ptp
1321 WHERE ppa.effective_Date BETWEEN c_start_date
1322 AND c_end_date
1323 AND ppa.report_type = hrl.meaning
1324 AND hrl.lookup_type = 'PAYSLIP_REPORT_TYPES'
1325 AND hrl.lookup_code = c_legislation_code
1326 AND NVL(c_payroll_id,NVL(pay_payslip_report.get_parameter(ppa.legislative_parameters,c_pa_token),-1))
1327 = NVL(pay_payslip_report.get_parameter(ppa.legislative_parameters,c_pa_token),-1)
1328 AND c_consolidation_set_id = pay_payslip_report.get_parameter(ppa.legislative_parameters,c_cs_token)
1329 AND ppa.payroll_action_id = paa.payroll_action_id
1330 --AND paa.source_action_id IS NULL --RLN P1 894102
1331 AND paa.assignment_id = hasa.assignment_id
1332 AND hasa.assignment_set_id = c_assignment_set_id
1333 AND hasa.include_or_exclude = 'I'
1334 AND pai.assignment_id = paa.assignment_id
1335 AND pai.action_context_type = 'AAP'
1336 AND pai.action_information_category = 'EMPLOYEE DETAILS'
1337 AND pai.action_context_id = paa.assignment_action_id
1338 AND ptp.time_period_id = pai.ACTION_INFORMATION16;
1339
1340 /* AND check_if_qualified_for_CA(pai.action_context_id
1341 ,paa.assignment_id
1342 ,c_start_date
1343 ,c_end_date
1344 ,c_consolidation_set_id) = 'Y'; */
1345
1346 --
1347 -- The Assignment Set Logic is handled only for either Include or Exclude
1348 -- and not for both. This doesn't handle the assignment_set_criteria.
1349 --
1350 CURSOR csr_inc_exc(c_assignment_set_id NUMBER
1351 ,c_assignment_id NUMBER) IS
1352 SELECT include_or_exclude
1353 FROM hr_assignment_set_amendments
1354 WHERE assignment_set_id = c_assignment_set_id
1355 AND assignment_id = nvl(c_assignment_id,assignment_id);
1356 --
1357 --
1358 --
1359
1360 BEGIN
1361 hr_utility.trace('###### IN Qualifying Proc');
1362 --
1363 l_actid := pay_proc_environment_pkg.get_pactid;
1364 --
1365 ln_curr_payroll_act_id := l_actid;
1366 hr_utility.trace('In QualProc l_actid := ' || l_actid);
1367 hr_utility.trace('p_assignment_id := ' || p_assignment_id);
1368
1369 IF pycadar_pkg.g_payroll_act_id <> ln_curr_payroll_act_id THEN
1370 pycadar_pkg.g_payroll_act_id := ln_curr_payroll_act_id;
1371
1372 pay_payslip_report.get_all_parameters(l_actid
1373 ,l_payroll_id
1374 ,l_consolidation_set_id
1375 ,l_start_date
1376 ,l_end_date
1377 ,l_rep_group
1378 ,l_rep_category
1379 ,l_assignment_set_id
1380 ,l_assignment_id
1381 ,l_effective_date
1382 ,l_business_group_id
1383 ,l_legislation_code);
1384
1385 -- hr_utility.trace('l_payroll_id :='||l_payroll_id);
1386 -- hr_utility.trace('l_consolidation_set_id :='||l_consolidation_set_id);
1387 -- hr_utility.trace('l_start_date :='||l_start_date);
1388 -- hr_utility.trace('l_end_date :='||l_end_date);
1389 -- hr_utility.trace('l_rep_group :='||l_rep_group);
1390 -- hr_utility.trace('l_rep_category :='||l_rep_category);
1391 -- hr_utility.trace('l_assignment_set_id :='||l_assignment_set_id);
1392 -- hr_utility.trace('l_assignment_id :='||l_assignment_id);
1393 -- hr_utility.trace('l_effective_date :='||l_effective_date);
1394 -- hr_utility.trace('l_business_group_id :='||l_business_group_id);
1395 -- hr_utility.trace('l_legislation_code :='||l_legislation_code);
1396
1397 --
1398 l_start_dt := TO_DATE(l_start_date,'YYYY/MM/DD');
1399 l_end_dt := TO_DATE(l_end_date,'YYYY/MM/DD');
1400 --
1401 -- Fetching legislative prameters for the very first time
1402 -- And caching them into global variables.
1403
1404 pycadar_pkg.g_payroll_id := l_payroll_id;
1405 pycadar_pkg.g_consolidation_set_id := l_consolidation_set_id;
1406 pycadar_pkg.g_start_dt := l_start_dt;
1407 pycadar_pkg.g_end_dt := l_end_dt;
1408 pycadar_pkg.g_rep_group := l_rep_group;
1409 pycadar_pkg.g_rep_category := l_rep_category;
1410 pycadar_pkg.g_assignment_set_id := l_assignment_set_id;
1411 pycadar_pkg.g_assignment_id := l_assignment_id;
1412 pycadar_pkg.g_effective_date := l_effective_date;
1413 pycadar_pkg.g_business_group_id := l_business_group_id;
1414 pycadar_pkg.g_legislation_code := l_legislation_code;
1415
1416 --
1417 DECLARE
1418 BEGIN
1419 statem := 'BEGIN pay_'||l_legislation_code||'_rules.get_token_names(:p_pa_token, :p_cs_token); END;';
1420 --hr_utility.trace(statem);
1421 sql_cur := dbms_sql.open_cursor;
1422 dbms_sql.parse(sql_cur
1423 ,statem
1424 ,dbms_sql.v7);
1425 dbms_sql.bind_variable(sql_cur, 'p_pa_token', pay_payslip_report.g_pa_token, 50);
1426 dbms_sql.bind_variable(sql_cur, 'p_cs_token', pay_payslip_report.g_cs_token, 50);
1427 l_rows := dbms_sql.execute(sql_cur);
1428 dbms_sql.variable_value(sql_cur, 'p_pa_token', pay_payslip_report.g_pa_token);
1429 dbms_sql.variable_value(sql_cur, 'p_cs_token', pay_payslip_report.g_cs_token);
1430 dbms_sql.close_cursor(sql_cur);
1431 Exception
1432 WHEN OTHERS THEN
1433 pay_payslip_report.g_pa_token := NVL(pay_payslip_report.g_pa_token,'PAYROLL_ID');
1434 pay_payslip_report.g_cs_token := NVL(pay_payslip_report.g_cs_token,'CONSOLIDATION_SET_ID');
1435 --
1436 IF dbms_sql.IS_OPEN(sql_cur) THEN
1437 dbms_sql.close_cursor(sql_cur);
1438 END IF;
1439 END;
1440 --
1441 --
1442 --hr_utility.trace('pay_payslip_report.g_pa_token :='||pay_payslip_report.g_pa_token);
1443 --hr_utility.trace('pay_payslip_report.g_cs_token :='||pay_payslip_report.g_cs_token);
1444
1445 IF pycadar_pkg.g_assignment_set_id IS NULL THEN
1446 OPEN csr_asg(pycadar_pkg.g_payroll_id
1447 ,pycadar_pkg.g_consolidation_set_id
1448 ,pycadar_pkg.g_start_dt
1449 ,pycadar_pkg.g_end_dt
1450 ,pay_payslip_report.g_pa_token
1451 ,pay_payslip_report.g_cs_token
1452 ,pycadar_pkg.g_legislation_code);
1453 LOOP
1454
1455 ln_assignment_id := -1;
1456 ln_action_ctx_id := -1;
1457
1458 FETCH csr_asg INTO ln_assignment_id, ln_action_ctx_id;
1459
1460
1461 IF csr_asg%NOTFOUND THEN
1462 hr_utility.trace('csr_asg didnot return any row');
1463 EXIT;
1464 ELSE
1465 IF check_if_qualified_for_CA(ln_action_ctx_id
1466 ,ln_assignment_id
1467 ,pycadar_pkg.g_start_dt
1468 ,pycadar_pkg.g_end_dt
1469 ,pycadar_pkg.g_consolidation_set_id) = 'Y' THEN
1470
1471 g_tmp_tbl(ln_assignment_id) := ln_assignment_id;
1472 hr_utility.trace('g_tmp_tbl(' || ln_assignment_id || ') := ' || ln_assignment_id);
1473
1474 END IF;
1475 END IF;
1476
1477 END LOOP;
1478 CLOSE csr_asg;
1479 --
1480 ELSE
1481 OPEN csr_inc_asg(pycadar_pkg.g_payroll_id
1482 ,pycadar_pkg.g_consolidation_set_id
1483 ,pycadar_pkg.g_start_dt
1484 ,pycadar_pkg.g_end_dt
1485 ,pay_payslip_report.g_pa_token
1486 ,pay_payslip_report.g_cs_token
1487 ,pycadar_pkg.g_legislation_code
1488 ,pycadar_pkg.g_assignment_set_id);
1489 LOOP
1490
1491 ln_assignment_id := -1;
1492 ln_action_ctx_id := -1;
1493
1494 FETCH csr_inc_asg INTO ln_assignment_id, ln_action_ctx_id;
1495
1496 IF csr_inc_asg%NOTFOUND THEN
1497 EXIT;
1498 ELSE
1499 IF check_if_qualified_for_CA(ln_action_ctx_id
1500 ,ln_assignment_id
1501 ,pycadar_pkg.g_start_dt
1502 ,pycadar_pkg.g_end_dt
1503 ,pycadar_pkg.g_consolidation_set_id) = 'Y' THEN
1504
1505 g_tmp_tbl(ln_assignment_id) := ln_assignment_id;
1506 hr_utility.trace('g_tmp_tbl(' || ln_assignment_id || ') := ' || ln_assignment_id);
1507 END IF;
1508 END IF;
1509
1510 END LOOP;
1511 CLOSE csr_inc_asg;
1512
1513 END IF;
1514 END IF;
1515
1516 l_qualifier := 'N';
1517 k := 1;
1518
1519 hr_utility.trace('g_tmp_tbl.COUNT := ' || g_tmp_tbl.COUNT);
1520
1521 IF g_tmp_tbl.EXISTS(p_assignment_id) THEN
1522 l_qualifier := 'Y';
1523 END IF;
1524
1525 hr_utility.trace('B4 Return l_qualifier := ' || l_qualifier);
1526
1527
1528 IF l_qualifier = 'Y' THEN
1529 p_qualifier := 'Y' ;
1530 END IF;
1531
1532 END qualifying_proc;
1533
1534
1535 FUNCTION check_if_qualified_for_CA(p_archive_action_id IN NUMBER
1536 ,p_assignment_id IN NUMBER
1537 ,p_deposit_start_date IN DATE
1538 ,p_deposit_end_date IN DATE
1539 ,p_consolidation_set_id IN NUMBER)
1540 RETURN VARCHAR2
1541 IS
1542 /****************************************************************
1543 ** If archiver is locking the pre-payment assignment_action_id,
1544 ** we get it from interlocks.
1545 ****************************************************************/
1546 cursor c_prepay_arch_action(cp_assignment_action_id in number) is
1547 select paa.assignment_action_id
1548 from pay_action_interlocks paci,
1549 pay_assignment_actions paa,
1550 pay_payroll_actions ppa
1551 where paci.locking_action_id = cp_assignment_action_id
1552 and paa.assignment_action_id = paci.locked_action_id
1553 and ppa.payroll_action_id = paa.payroll_action_id
1554 and ppa.action_type in ('P', 'U');
1555
1556 /****************************************************************
1557 ** If archiver is locking the run assignment_action_id, we get
1558 ** the corresponding run assignment_action_id and then get
1559 ** the pre-payment assignemnt_action_id.
1560 ** This cursor is only required when there are child action which
1561 ** means there is a seperate check.
1562 * ***************************************************************/
1563 cursor c_prepay_run_arch_action(cp_assignment_action_id in number) is
1564 select paa_pre.assignment_action_id
1565 from pay_action_interlocks pai_run,
1566 pay_action_interlocks pai_pre,
1567 pay_assignment_actions paa_pre,
1568 pay_payroll_actions ppa_pre
1569 where pai_run.locking_action_id = cp_assignment_action_id
1570 and pai_pre.locked_action_id = pai_run.locked_action_id
1571 and paa_pre.assignment_Action_id = pai_pre.locking_action_id
1572 and ppa_pre.payroll_action_id = paa_pre.payroll_action_id
1573 and ppa_pre.action_type in ('P', 'U');
1574
1575 ln_prepay_action_id NUMBER;
1576 lv_rev_run_exists VARCHAR2(1);
1577 BEGIN
1578 --
1579 --
1580 hr_utility.trace('Entering check_if_qualified_for_CA');
1581
1582 OPEN c_prepay_arch_action(p_archive_action_id);
1583 FETCH c_prepay_arch_action INTO ln_prepay_action_id;
1584 IF c_prepay_arch_action%notfound THEN
1585 OPEN c_prepay_run_arch_action(p_archive_action_id);
1586 FETCH c_prepay_run_arch_action INTO ln_prepay_action_id;
1587 IF c_prepay_run_arch_action%notfound THEN
1588 RETURN('N');
1589 END IF;
1590 CLOSE c_prepay_run_arch_action;
1591 END IF;
1592 CLOSE c_prepay_arch_action;
1593 --
1594 --
1595 hr_utility.trace('ln_prepay_action_id :='||ln_prepay_action_id);
1596
1597 IF pay_us_employee_payslip_web.get_doc_eit(
1598 'PAYSLIP'
1599 ,'PRINT'
1600 ,'ASSIGNMENT'
1601 ,p_assignment_id
1602 ,p_deposit_end_date) = 'Y'
1603 AND pycadar_pkg.check_if_assignment_paid(
1604 ln_prepay_action_id
1605 ,p_deposit_start_date
1606 ,p_deposit_end_date
1607 ,p_consolidation_set_id) = 'Y' --Bug 3512116
1608 THEN
1609
1610 lv_rev_run_exists := NULL;
1611
1612 BEGIN
1613 SELECT '1'
1614 INTO lv_rev_run_exists
1615 FROM dual
1616 where exists
1617 (Select /*+ ORDERED */ 1
1618 from pay_action_interlocks pai_run, --Pre > Run
1619 pay_action_interlocks pai_rev, --Run > Rev
1620 pay_assignment_actions paa_rev, --Rev
1621 pay_payroll_actions ppa_rev --Rev
1622 where pai_run.locking_action_id = ln_prepay_action_id
1623 and pai_rev.locked_action_id = pai_run.locked_action_id
1624 and paa_rev.assignment_action_id = pai_run.locking_action_id
1625 and ppa_rev.payroll_action_id = paa_rev.payroll_action_id
1626 and ppa_rev.action_type in ('V')
1627 );
1628 EXCEPTION
1629 WHEN OTHERS THEN
1630 lv_rev_run_exists := NULL;
1631 END;
1632
1633 IF lv_rev_run_exists = '1' then
1634 RETURN 'N';
1635 ELSE
1636 RETURN 'Y';
1637 END IF;
1638 ELSE
1639 RETURN 'N';
1640 END IF;
1641 END check_if_qualified_for_CA;
1642
1643 end pycadar_pkg;