DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_CORE_PAYSLIP_UTILS

Source


1 PACKAGE BODY pay_core_payslip_utils  AS
2 /* $Header: pycopysl.pkb 115.0 2004/04/02 01:45:38 tbattoo noship $ */
3 
4 
5 g_package                CONSTANT VARCHAR2(30) := 'pay_core_payslip_utils.';
6 
7 PROCEDURE get_parameters(p_payroll_action_id IN  NUMBER,
8                          p_token_name        IN  VARCHAR2,
9                          p_token_value       OUT  NOCOPY VARCHAR2) IS
10 
11 CURSOR csr_parameter_info(p_pact_id NUMBER,
12                           p_token   CHAR) IS
13 SELECT SUBSTR(legislative_parameters,
14                INSTR(legislative_parameters,p_token)+(LENGTH(p_token)+1),
15                 INSTR(legislative_parameters,' ',
16                        INSTR(legislative_parameters,p_token))
17                  - (INSTR(legislative_parameters,p_token)+LENGTH(p_token))),
18        business_group_id
19 FROM   pay_payroll_actions
20 WHERE  payroll_action_id = p_pact_id;
21 
22 l_business_group_id               VARCHAR2(20);
23 l_token_value                     VARCHAR2(50);
24 
25 l_proc                            VARCHAR2(50) := g_package || 'get_parameters';
26 
27 BEGIN
28 
29   hr_utility.set_location('Entering ' || l_proc,10);
30 
31   hr_utility.set_location('Step ' || l_proc,20);
32   hr_utility.set_location('p_token_name = ' || p_token_name,20);
33 
34   OPEN csr_parameter_info(p_payroll_action_id,
35                           p_token_name);
36 
37   FETCH csr_parameter_info INTO l_token_value,
38                                 l_business_group_id;
39 
40   CLOSE csr_parameter_info;
41 
42   IF p_token_name = 'BG_ID'
43 
44   THEN
45 
46      p_token_value := l_business_group_id;
47 
48   ELSE
49 
50      p_token_value := l_token_value;
51 
52   END IF;
53 
54   hr_utility.set_location('l_token_value = ' || l_token_value,20);
55   hr_utility.set_location('Leaving         ' || l_proc,30);
56 
57 END get_parameters;
58 
59 /*
60     Name: range_cursor
61     Desrciption:
62           This code returns the select statement that
63           should be used to generate the ranges.
64 */
65 PROCEDURE range_cursor (pactid IN NUMBER,
66                         sqlstr OUT  NOCOPY VARCHAR2)
67 -- public procedure which archives the payroll information, then returns a
68 -- varchar2 defining a SQL statement to select all the people that may be
69 -- eligible for payslip reports.
70 -- The archiver uses this cursor to split the people into chunks for parallel
71 -- processing.
72 IS
73   --
74   l_proc    CONSTANT VARCHAR2(50):= g_package||'range_cursor';
75   -- vars for constructing the sqlstr
76 BEGIN
77 
78   hr_utility.set_location('Entering ' || l_proc,10);
79 
80   sqlstr := 'SELECT DISTINCT person_id
81              FROM   per_people_f ppf,
82                     pay_payroll_actions ppa
83              WHERE  ppa.payroll_action_id = :payroll_action_id
84              AND    ppa.business_group_id +0 = ppf.business_group_id
85              ORDER BY ppf.person_id';
86 
87   hr_utility.set_location('Leaving ' || l_proc,40);
88 
89 END range_cursor;
90 
91 /*
92     Name: action_creation
93     Desrciption:
94           This code should be used to generate the
95           master assignment actions for the
96           payslip archive.
97 */
98 PROCEDURE action_creation (pactid in number,
99                            stperson in number,
100                            endperson in number,
101                            chunk in number,
102                            p_report_type in varchar2,
103                            p_report_qualifier in varchar2) is
104 --
105 CURSOR csr_prepaid_assignments(p_pact_id          NUMBER,
106                                stperson           NUMBER,
107                                endperson          NUMBER,
108                                p_payroll_id       NUMBER,
109                                p_consolidation_id NUMBER,
110                                p_report_type      VARCHAR2,
111                                p_report_qualifier VARCHAR2) IS
112 SELECT act.assignment_id assignment_id,
113        act.assignment_action_id run_action_id,
114        act1.assignment_action_id prepaid_action_id
115 FROM   pay_payroll_actions ppa,
116        pay_payroll_actions appa,
117        pay_payroll_actions appa2,
118        pay_assignment_actions act,
119        pay_assignment_actions act1,
120        pay_action_interlocks pai,
121        per_all_assignments_f as1
122 WHERE  ppa.payroll_action_id = p_pact_id
123 AND    appa2.consolidation_set_id = p_consolidation_id
124 AND    appa2.effective_date BETWEEN
125          ppa.start_date AND ppa.effective_date
126 AND    as1.person_id BETWEEN
127          stperson AND endperson
128 AND    appa.action_type IN ('R','Q')                             -- Payroll Run or Quickpay Run
129 AND    act.payroll_action_id = appa.payroll_action_id
130 AND    act.source_action_id IS NULL
131 AND    as1.assignment_id = act1.assignment_id
132 AND    ppa.effective_date BETWEEN
133          as1.effective_start_date AND as1.effective_end_date
134 AND    act.action_status = 'C'
135 AND    act.assignment_action_id = pai.locked_action_id
136 AND    act1.assignment_action_id = pai.locking_action_id
137 AND    act1.action_status = 'C'
138 AND    act1.payroll_action_id = appa2.payroll_action_id
139 AND    appa2.action_type IN ('P','U')                            -- Prepayments or Quickpay Prepayments
140 AND    (as1.payroll_id = p_payroll_id OR p_payroll_id IS NULL)
141 AND    NOT EXISTS (SELECT /*+ ORDERED */ NULL
142                    FROM   pay_action_interlocks pai1,
143                           pay_assignment_actions act2,
144                           pay_payroll_actions appa3
145                    WHERE  pai1.locked_action_id = act.assignment_action_id
146                    AND    act2.assignment_action_id = pai1.locking_action_id
147                    AND    act2.payroll_action_id = appa3.payroll_action_id
148                    AND    appa3.action_type = 'X'
149                    AND    appa3.report_type = p_report_type
150                    AND    appa3.report_qualifier = p_report_qualifier)
151 ORDER BY act.assignment_id, act.assignment_action_id
152 FOR UPDATE OF as1.assignment_id;
153 
154 l_actid                           NUMBER;
155 l_canonical_end_date              DATE;
156 l_canonical_start_date            DATE;
157 l_consolidation_set               VARCHAR2(30);
158 l_end_date                        VARCHAR2(20);
159 l_payroll_id                      NUMBER;
160 l_prepay_action_id                NUMBER;
161 l_start_date                      VARCHAR2(20);
162 
163 l_proc VARCHAR2(50) := g_package||'action_creation';
164 
165 BEGIN
166 
167   hr_utility.set_location('Entering ' || l_proc,10);
168 
169   get_parameters (
170     p_payroll_action_id => pactid
171   , p_token_name        => 'PAYROLL'
172   , p_token_value       => l_payroll_id);
173 
174   get_parameters (
175     p_payroll_action_id => pactid
176   , p_token_name        => 'CONSOLIDATION'
177   , p_token_value       => l_consolidation_set);
178 
179   get_parameters (
180     p_payroll_action_id => pactid
181   , p_token_name        => 'START_DATE'
182   , p_token_value       => l_start_date);
183 
184   get_parameters (
185     p_payroll_action_id => pactid
186   , p_token_name        => 'END_DATE'
187   , p_token_value       => l_end_date);
188 
189   hr_utility.set_location('Step ' || l_proc,20);
190   hr_utility.set_location('l_payroll_id = ' || l_payroll_id,20);
191   hr_utility.set_location('l_start_date = ' || l_start_date,20);
192   hr_utility.set_location('l_end_date   = ' || l_end_date,20);
193 
194   l_canonical_start_date := TO_DATE(l_start_date,'yyyy/mm/dd');
195   l_canonical_end_date   := TO_DATE(l_end_date,'yyyy/mm/dd');
196 
197   l_prepay_action_id := 0;
198 
199   FOR csr_rec IN csr_prepaid_assignments(pactid,
200                                          stperson,
201                                          endperson,
202                                          l_payroll_id,
203                                          l_consolidation_set,
204                                          p_report_type,
205                                          p_report_qualifier)
206 
207   LOOP
208 
209     IF l_prepay_action_id <> csr_rec.prepaid_action_id
210 
211     THEN
212 
213     SELECT pay_assignment_actions_s.NEXTVAL
214     INTO   l_actid
215     FROM   dual;
216 
217     -- CREATE THE ARCHIVE ASSIGNMENT ACTION FOR THE MASTER ASSIGNMENT ACTION
218 
219     hr_nonrun_asact.insact(l_actid,csr_rec.assignment_id,pactid,chunk,NULL);
220 
221     -- CREATE THE ARCHIVE TO PAYROLL MASTER ASSIGNMENT ACTION INTERLOCK AND
222     -- THE ARCHIVE TO PREPAYMENT ASSIGNMENT ACTION INTERLOCK
223 
224     hr_utility.set_location('creating lock1 ' || l_actid || ' to ' || csr_rec.run_action_id,20);
225     hr_utility.set_location('creating lock2 ' || l_actid || ' to ' || csr_rec.prepaid_action_id,20);
226 
227     hr_nonrun_asact.insint(l_actid,csr_rec.prepaid_action_id);
228 
229     END IF;
230 
231     hr_nonrun_asact.insint(l_actid,csr_rec.run_action_id);
232 
233     l_prepay_action_id := csr_rec.prepaid_action_id;
234 
235   END LOOP;
236 
237   hr_utility.set_location('Leaving ' || l_proc,20);
238 
239 END action_creation;
240 
241 function get_max_nor_act_seq(p_payroll_action_id    in number,
242                              p_assignment_action_id in number,
243                              p_effective_date       in date)
244 return number
245 is
246 l_run_type_id pay_payroll_actions.run_type_id%type;
247 l_act_seq     pay_assignment_actions.action_sequence%type;
248 begin
249 --
250    select run_type_id
251      into l_run_type_id
252      from pay_payroll_actions
253     where payroll_action_id = p_payroll_action_id;
254 --
255    /* If the run type id is null then run
256       types are not being used
257    */
258    if (l_run_type_id is null) then
259      select action_sequence
260        into l_act_seq
261        from pay_assignment_actions
262       where assignment_action_id = p_assignment_action_id;
263    else
264       SELECT MAX(paa1.action_sequence)
265         into l_act_seq
266         FROM   pay_assignment_actions paa1,
267                pay_assignment_actions paa2,
268                pay_run_types_f prt1
269        WHERE  prt1.run_type_id = paa1.run_type_id
270        AND    prt1.run_method IN ('N','P')
271        AND    paa1.payroll_action_id = p_payroll_action_id
272        AND    paa1.assignment_id = paa2.assignment_id
273        AND    paa1.source_action_id = paa2.assignment_action_id
274        AND    paa2.assignment_action_id = p_assignment_action_id
275        AND    p_effective_date BETWEEN
276                 prt1.effective_start_date AND prt1.effective_end_date;
277    end if;
278 --
279    return l_act_seq;
280 --
281 end get_max_nor_act_seq;
282 /*
283     Name: generate_child_actions
284     Desrciption:
285         This procedure should be the first procedure called
286         from the payslip archive archive_code section.
287 
288         The procedure generates the child assignment actions
289         it is these that determine the number of payslips
290         to archive
291 */
292 PROCEDURE generate_child_actions(p_assactid       in number,
293                                  p_effective_date in date) IS
294 
295 CURSOR csr_assignment_actions(p_locking_action_id NUMBER) IS
296 SELECT pre.locked_action_id      pre_assignment_action_id,
297        pay.locked_action_id      master_assignment_action_id,
298        assact.assignment_id      assignment_id,
299        assact.payroll_action_id  pay_payroll_action_id,
300        paa.effective_date        effective_date,
301        ppaa.effective_date       pre_effective_date,
302        paa.date_earned           date_earned,
303        paa.time_period_id        time_period_id
304 FROM   pay_action_interlocks pre,
305        pay_action_interlocks pay,
306        pay_payroll_actions paa,
307        pay_payroll_actions ppaa,
308        pay_assignment_actions assact,
309        pay_assignment_actions passact
310 WHERE  pre.locked_action_id = pay.locking_action_id
311 AND    pre.locking_action_id = p_locking_action_id
312 AND    pre.locked_action_id = passact.assignment_action_id
313 AND    passact.payroll_action_id = ppaa.payroll_action_id
314 AND    ppaa.action_type IN ('P','U')
315 AND    pay.locked_action_id = assact.assignment_action_id
316 AND    assact.payroll_action_id = paa.payroll_action_id
317 AND    assact.source_action_id IS NULL
318 ORDER BY pay.locked_action_id;
319 
320 CURSOR csr_child_actions(p_master_assignment_action NUMBER,
321                          p_payroll_action_id        NUMBER,
322                          p_assignment_id            NUMBER,
323                          p_effective_date           DATE  ) IS
324 SELECT paa.assignment_action_id child_assignment_action_id,
325        'S' run_type
326 FROM   pay_assignment_actions paa,
327        pay_run_types_f prt
328 WHERE  paa.source_action_id = p_master_assignment_action
329 AND    paa.payroll_action_id = p_payroll_action_id
330 AND    paa.assignment_id = p_assignment_id
331 AND    paa.run_type_id = prt.run_type_id
332 AND    prt.run_method = 'S'
333 AND    p_effective_date BETWEEN
334          prt.effective_start_date AND prt.effective_end_date
335 UNION
336 SELECT paa.assignment_action_id child_assignment_action_id,
337        'NP' run_type
338 FROM   pay_assignment_actions paa
339 WHERE  paa.payroll_action_id = p_payroll_action_id
340 AND    paa.assignment_id = p_assignment_id
341 AND    paa.action_sequence =
342          pay_core_payslip_utils.get_max_nor_act_seq(p_payroll_action_id,
343                              p_master_assignment_action,
344                              p_effective_date);
345 
346 CURSOR csr_np_children (p_assignment_action_id NUMBER,
347                         p_payroll_action_id    NUMBER,
348                         p_assignment_id        NUMBER,
349                         p_effective_date       DATE) IS
350 SELECT paa.assignment_action_id np_assignment_action_id,
351        prt.run_method
352 FROM   pay_assignment_actions paa,
353        pay_run_types_f prt
354 WHERE  paa.source_action_id = p_assignment_action_id
355 AND    paa.payroll_action_id = p_payroll_action_id
356 AND    paa.assignment_id = p_assignment_id
357 AND    paa.run_type_id = prt.run_type_id
358 AND    prt.run_method IN ('N','P')
359 AND    p_effective_date BETWEEN
360          prt.effective_start_date AND prt.effective_end_date
361 UNION
362 SELECT paa.assignment_action_id np_assignment_action_id,
363        'N'
364 FROM   pay_assignment_actions paa,
365        pay_payroll_actions ppa
366 WHERE  paa.assignment_action_id = p_assignment_action_id
367 AND    ppa.payroll_action_id = p_payroll_action_id
368 AND    ppa.payroll_action_id = paa.payroll_action_id
369 AND    ppa.run_type_id is null
370 AND    paa.assignment_id = p_assignment_id;
371 
372 l_actid                           NUMBER;
373 l_action_context_id               NUMBER;
374 l_action_info_id                  NUMBER(15);
375 l_assignment_action_id            NUMBER;
376 l_business_group_id               NUMBER;
377 l_chunk_number                    NUMBER;
378 l_date_earned                     DATE;
379 l_ovn                             NUMBER;
380 l_person_id                       NUMBER;
381 l_salary                          VARCHAR2(10);
382 l_sequence                        NUMBER;
383 
384 l_proc                            VARCHAR2(50) := g_package || 'archive_code';
385 
386 l_standard_asg_act_id       pay_assignment_actions.assignment_action_id%type;
387 l_pactid                    pay_assignment_actions.payroll_action_id%type;
388 
389 BEGIN
390 
391   hr_utility.set_location('Entering '|| l_proc,10);
392 
393   hr_utility.set_location('Step '|| l_proc,20);
394   hr_utility.set_location('p_assactid = ' || p_assactid,20);
395 
396   -- retrieve the chunk number for the current assignment action
397 
398   SELECT paa.chunk_number,
399          paa.payroll_action_id
400   INTO   l_chunk_number,
401          l_pactid
402   FROM   pay_assignment_actions paa
403   WHERE  paa.assignment_action_id = p_assactid;
404 
405   l_standard_asg_act_id := null;
406 
407   -- Select all the master run actions.
408   FOR csr_rec IN csr_assignment_actions(p_assactid)
409 
410   LOOP
411 
412     hr_utility.set_location('csr_rec.master_assignment_action_id = ' ||
413                           csr_rec.master_assignment_action_id,20);
414     hr_utility.set_location('csr_rec.pre_assignment_action_id    = ' ||
415                           csr_rec.pre_assignment_action_id,20);
416     hr_utility.set_location('csr_rec.assignment_id    = ' ||
417                           csr_rec.assignment_id,20);
418     hr_utility.set_location('csr_rec.date_earned    = ' ||
419                           to_char( csr_rec.date_earned,'dd-mon-yyyy'),20);
423                       csr_rec.time_period_id,20);
420     hr_utility.set_location('csr_rec.pre_effective_date    = '
421                      ||to_char( csr_rec.pre_effective_date,'dd-mon-yyyy'),20);
422     hr_utility.set_location('csr_rec.time_period_id    = ' ||
424 
425   -- Select all the child actions
426   FOR csr_child_rec IN csr_child_actions(csr_rec.master_assignment_action_id,
427                                          csr_rec.pay_payroll_action_id,
428                                          csr_rec.assignment_id,
429                                          csr_rec.effective_date)
430 
431     LOOP
432 
433     -- create additional archive assignment actions and interlocks
434 
435       IF csr_child_rec.run_type = 'S'
436 
437       THEN
438 
439          SELECT pay_assignment_actions_s.NEXTVAL
440          INTO   l_actid
441          FROM dual;
442 
443          hr_utility.set_location('csr_child_rec.run_type              = ' ||
444                                   csr_child_rec.run_type,30);
445          hr_utility.set_location('csr_rec.master_assignment_action_id = ' ||
446                                   csr_rec.master_assignment_action_id,30);
447 
448          hr_nonrun_asact.insact(
449            lockingactid => l_actid
450          , assignid     => csr_rec.assignment_id
451          , pactid       => l_pactid
452          , chunk        => l_chunk_number
453          , greid        => NULL
454          , prepayid     => NULL
455          , status       => 'C'
456          , source_act   => p_assactid);
457 
458         hr_utility.set_location('creating lock3 ' ||
459               l_actid || ' to ' ||
460                      csr_child_rec.child_assignment_action_id,30);
461 
462         hr_nonrun_asact.insint(
463           lockingactid => l_actid
464         , lockedactid  => csr_child_rec.child_assignment_action_id);
465 
466         l_action_context_id := l_actid;
467 
468       END IF;
469 
470       IF csr_child_rec.run_type = 'NP'
471 
472       THEN
473 
474         if (l_standard_asg_act_id is null) then
475 --
476           SELECT pay_assignment_actions_s.NEXTVAL
477           INTO   l_actid
478           FROM dual;
479 
480           hr_utility.set_location('csr_child_rec.run_type              = ' ||
481                                    csr_child_rec.run_type,30);
482           hr_utility.set_location('csr_rec.master_assignment_action_id = ' ||
483                                    csr_rec.master_assignment_action_id,30);
484 
485            hr_nonrun_asact.insact(
486              lockingactid => l_actid
487            , assignid     => csr_rec.assignment_id
488            , pactid       => l_pactid
489            , chunk        => l_chunk_number
490            , greid        => NULL
491            , prepayid     => NULL
492            , status       => 'C'
493            , source_act   => p_assactid);
494 --
495            l_standard_asg_act_id := l_actid;
496 --
497         else
498 --
499            l_actid := l_standard_asg_act_id;
500 --
501         end if;
502 --
503         FOR csr_np_rec IN csr_np_children(csr_rec.master_assignment_action_id,
504                                           csr_rec.pay_payroll_action_id,
505                                           csr_rec.assignment_id,
506                                           csr_rec.effective_date)
507 
508         LOOP
509 
510           hr_utility.set_location('creating lock4 ' ||
511                l_actid || ' to ' || csr_np_rec.np_assignment_action_id,30);
512 
513           hr_nonrun_asact.insint(
514             lockingactid => l_actid
515           , lockedactid  => csr_np_rec.np_assignment_action_id);
516 
517         END LOOP;
518 
519       END IF;
520 
521     END LOOP; -- child assignment actions
522 
523 
524   END LOOP;
525   hr_utility.set_location('Leaving '|| l_proc,80);
526 
527 END generate_child_actions;
528 
529 END pay_core_payslip_utils;