DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_CN_AUDIT_XMLGEN

Source


1 PACKAGE BODY pay_cn_audit_xmlgen AS
2 /* $Header: pycnauxml.pkb 120.6 2010/10/27 11:15:36 mdubasi noship $ */
3 
4 /*
5  ===========================================================================+
6  |               Copyright (c) 1993 Oracle Corporation                        |
7  |                  Redwood Shores, California, USA                           |
8  |                       All rights reserved.                                 |
9  +============================================================================+
10  Name
11                 pay_cn_audit_xmlgen
12  File
13                 pycnauxml.pkb
14  Purpose
15 
16     The purpose of this package is to support the generation of XML for the process
17     China Payroll Data Export.
18 
19  Date                 Author          Verion       Bug         Details
20  ============================================================================
21 13-APR-2010           DDUVVURI         1.0        9469668      Initial file created
22 13-APR-2010           DDUVVURI         1.1        9469668      Resolved GSCC issues.
23 16-APR-2010           DDUVVURI         1.2        9469668      Modified cursor csr_assignments in procedure assact_xml to pick up
24                                                                ptp.payroll_id instead of arch_ppa.payroll_id
25 26-APR-2010           DDUVVURI         1.3        9648944      Modified cursor csr_payroll_elements in procedure gen_xml_header_pay
26                                                                and added 2 new cursors csr_arch_balances and csr_arch_stat_balances in
27                                                                procedure assact_xml
28 27-APR-2010           DDUVVURI         1.4        9648944      Modified cursor csr_arch_balances to pick up balances which have
29                                                                _ASG_PTD dimension only
30 12-May-2010           DDUVVURI         1.5        9696416      Modified issued found out post dev QA
31                                                                1. modified header info for ministry
32                                                                2. made formatting changes to Amount column in all cursors in PROCEDURE assact_xml
33                                                                3. fixed issue of certain balances not being picked in CURSOR csr_arch_balances
34                                                                4. fixed issues with exception report for SOE and Ministry
35 22-May-2010           DDUVVURI         1.6     9723217,9723261 Fixed all issues raised by QA
36 26-May-2010           DDUVVURI         1.7     9743013,9742923,9742617  Below are the issues fixed
37                                                 1. Formatting in amounts removed
38                                                 2. Exception Report for Ministry
39                                                      - payroll name is also archived in action_information_5
40                                                      - function get_message modified to add new parameter for payroll name
41                                                 3. Sorting in Group3 now on accounting period , payroll name , Employee number
42                                                 4. Sorting issues in Group4 corrected for multiple payrolls within
43                                                    single period. Sorting in Group 4 is based on
44                                                    Payroll Period number , Payroll Name , Employee number
45                                                 5. Issue of Balance not displayed if Display Value is entered at org level.
46 01-Jun-2010           DDUVVURI         1.8      9679498,9742617   Added character set conversion changes in deinitialization procedure and
47                                                          Group3 cursors have been modified completely. Group3 only shows employees who
48 							 have payrolls run for the period. Layout changes done in deinitialization procedure
49 							 for Chinese session. Also some error cases have also been checked.
50 27-Oct-2010           MDUBASI          1.11     10115998      Modified function get_cost_alloc_key_flex
51  ============================================================================
52 */
53 --
54 -- Global Variables
55 --
56     g_char_set                VARCHAR2(100);
57     g_proc_name               VARCHAR2(240);
58     g_debug                   BOOLEAN;
59     g_document_type           VARCHAR2(50);
60     EOL                       VARCHAR2(5) := fnd_global.local_chr(10);
61     g_opt_soe_or_min          VARCHAR2(10);
62     g_trfr_date_used          VARCHAR2(5);
63     l_proc                    VARCHAR2(200);
64 
65 /****************************************************************************
66     Name        : get_message_text
67     Description : This is called from inside the datatemplate query to
68                   report missing data in audit report.
69  *****************************************************************************/
70 
71 FUNCTION get_message_text(p_act_info1 VARCHAR2,
72                           p_act_info2 VARCHAR2,
73 			  p_act_info3 VARCHAR2,
74 			  p_act_info4 VARCHAR2,
75 			  p_act_info5 VARCHAR2) RETURN VARCHAR2
76 IS
77 l_text VARCHAR2(1000);
78 BEGIN
79    l_proc :=  g_proc_name||'get_message_text';
80    IF g_debug THEN
81        hr_utility.trace( 'Entering '||l_proc);
82    END IF;
83    IF p_act_info3 = 'CN_EMP_CATEGORY' THEN
84      fnd_message.set_name('PER', 'CN_EMP_CATEGORY');
85      fnd_message.set_token('EMPNUM', p_act_info1);
86      fnd_message.set_token('PERIOD', p_act_info2);
87    ELSIF p_act_info3 ='CN_EXPENDITURE_CODE' THEN
88      fnd_message.set_name('PER', 'CN_EXPENDITURE_CODE');
89      fnd_message.set_token('ENAME', p_act_info4);
90      fnd_message.set_token('PNAME', p_act_info5);
91 
92    END IF;
93 
94 l_text :=  hr_utility.get_message();
95    IF g_debug THEN
96        hr_utility.trace( 'Leaving '||l_proc);
97    END IF;
98 RETURN l_text;
99 END;
100 
101   /****************************************************************************
102     Name        : RANGE_CURSOR
103     Description : This procedure prepares range of persons to be processed for process
104                   'China Payroll Data Extract'. This procedure defines a SQL statement
105                   to fetch all the people to be included in the generic XML extract. This SQL
106                   statement is  used to define the 'chunks' for multi-threaded operation
107   Arguments
108       p_pactid  payroll action id for the report
109       p_sqlstr  the SQL statement to fetch the people
110   *****************************************************************************/
111 
112 PROCEDURE range_cursor ( p_pactid       IN      NUMBER,
113                          p_sqlstr       OUT     nocopy VARCHAR2
114                        )
115 IS
116 
117         p_year_start                    DATE;
118         p_year_end                      DATE;
119         p_business_group_id             NUMBER;
120         l_file                          VARCHAR2(100);
121 BEGIN
122 
123 l_proc :=  g_proc_name||'range_cursor';
124 
125    IF g_debug  THEN
126      hr_utility.trace ('Entering '||l_proc);
127    END IF ;
128 
129      p_sqlstr := 'SELECT DISTINCT person_id
130                     FROM per_people_f ppf,
131                          pay_payroll_actions ppa
132                    WHERE ppa.payroll_action_id = :payroll_action_id
133                      AND ppa.business_group_id +0 = ppf.business_group_id
134                    ORDER BY ppf.person_id';
135 
136      initialization_code (p_pactid);
137 
138    IF g_debug  THEN
139      hr_utility.trace ('Leaving '||l_proc);
140    END IF ;
141 
142 END range_cursor;
143 --
144 
145 /****************************************************************************
146     Name         : ACTION_CREATION
147     Description  : This procedure creates assignment actions for the payroll action associated
148                         process <China Payroll Data Extract>
149 
150                    The procedure processes assignments in 'chunks' to facilitate  multi-threaded
151                    operation. The chunk is defined by the size and the starting and ending person id.
152 
153                    One assignment action is created for each payroll period for each assignment
154 		   Creates action for Group4 XML - Individual_Payroll_Detailed_Records
155 		   Best way is to do Group3 also in multithreaded level. But Sorting
156 		   requirements won't be met.
157 
158  *****************************************************************************/
159 
160 PROCEDURE action_creation(
161                         p_pactid        IN NUMBER,
162                         p_stperson      IN NUMBER,
163                         p_endperson     IN NUMBER,
164                         p_chunk         IN NUMBER
165                         )
166 IS
167         -- Cursor to get the assignments Who were active for some period in the current year
168         -- Auditing Interested only for employees paid in current year, so check that atleast it has one payroll run
169 	-- g_start_date AND  g_end_date are accounting period start and end
170 	-- Pick up payroll runs, use g_trfr_date_used to determine the accounting_date on which they will be posted
171 	-- Ensure those are within the accounting period range
172         --
173    CURSOR csr_assignments IS
174    SELECT paf.assignment_id
175      FROM per_people_f ppf,
176           per_assignments_f paf,
177           per_periods_of_service pos
178     WHERE ppf.business_group_id = paf.business_group_id
179       AND pos.period_of_service_id = paf.period_of_service_id
180       AND paf.person_id =ppf.person_id
181       AND paf.person_id BETWEEN p_stperson AND p_endperson
182       AND  (
183            g_end_date BETWEEN paf.effective_start_date AND paf.effective_end_date
184            OR
185            (
186             pos.final_process_date  BETWEEN  g_start_date AND  g_end_date AND
187             pos.final_process_date BETWEEN paf.effective_start_date AND paf.effective_end_date
188            )
189            )
190       AND  (
191            ( nvl(pos.final_process_date,g_end_date) >=  g_end_date
192             AND g_end_date BETWEEN ppf.effective_start_date AND ppf.effective_end_date)
193            OR
194            (
195             pos.final_process_date  BETWEEN  g_start_date AND g_end_date AND
196             pos.final_process_date BETWEEN ppf.effective_start_date AND ppf.effective_end_date
197            )
198            )
199       AND ppf.business_group_id = g_bg_id
200       AND paf.business_group_id =g_bg_id
201       AND EXISTS (SELECT 1
202                     FROM pay_payroll_actions ppa,
203                          pay_assignment_actions paa
204                    WHERE paa.assignment_id =paf.assignment_id
205                      AND paa.payroll_action_id = ppa.payroll_action_id
206                      AND ppa.action_type in('R','Q')
207                      AND decode(g_trfr_date_used,'E',ppa.date_earned,ppa.effective_date) BETWEEN g_start_date AND  g_end_date
208        );
209         --
210         --      LOCAL VARIABLES
211         --
212         l_actid NUMBER;
213 
214 
215 -- Group4 is sorted by payroll_period
216 -- so add 1 assignment_action_id for each distinct payroll period
217 -- ppa.effective_date gives payroll year and period
218 -- Use this and populate serial_number
219 -- do not use accounting period to define serial_number
220 -- use serial number in sort_code to ensure XML sequence in output
221 -- 2010 01 Should come after 2009 12. So use period_num and year combination
222 
223 CURSOR c_get_periods(p_assignment_id IN NUMBER) IS
224 select distinct(to_CHAR(ppa.effective_date,'YYYY')||TO_CHAR(ppa.effective_date,'MM')||ppf.payroll_id) pnum
225   from pay_payroll_Actions ppa,
226        pay_assignment_actions paa,
227        pay_payrolls_f ppf
228 where paa.payroll_action_id = ppa.payroll_Action_id
229   and ppa.action_type in('R','Q')
230   and ppa.payroll_id = ppf.payroll_id
231   and paa.assignment_id = p_assignment_id
232   and paa.source_action_id is null
233   and decode(g_trfr_date_used,'E',ppa.date_earned,ppa.effective_date)  BETWEEN g_start_date AND  g_end_date
234   and g_end_date between ppf.effective_start_date and ppf.effective_end_date
235     ORDER BY pnum;
236 
237 --
238 BEGIN
239 
240 l_proc :=  g_proc_name||'action_creation';
241 
242    IF g_debug  THEN
243      hr_utility.trace ('Entering '||l_proc);
244    END IF ;
245 
246 IF g_bg_id IS NULL THEN
247   initialization_code (p_pactid);
248 END IF;
249 
250 
251    FOR i IN  csr_assignments LOOP
252      IF g_debug  THEN
253        hr_utility.trace (' Picking Assignment ID  '||i.assignment_id);
254      END IF;
255 
256      FOR q IN c_get_periods(i.assignment_id) LOOP
257        IF g_debug  THEN
258          hr_utility.trace (' Picking Period NUmber '||q.pnum);
259        END IF;
260 
261       SELECT pay_assignment_actions_s.NEXTVAL
262         INTO   l_actid
263         FROM   dual;
264 
265 
266        hr_nonrun_asact.insact(l_actid,i.assignment_id,p_pactid,p_chunk,NULL);
267 
268        UPDATE pay_assignment_actions
269           SET serial_number = q.pnum
270         WHERE assignment_action_id = l_actid
271           AND assignment_id = i.assignment_id
272           AND payroll_action_id = p_pactid;
273 
274     END LOOP;
275 END LOOP;
276 
277    IF g_debug  THEN
278      hr_utility.trace ('Leaving '||l_proc);
279    END IF ;
280 
281 END action_creation;
282 
283 /****************************************************************************
284     Name        : get_parameters
285     Description : This procedure gets the token value of a token from the
286                   legislative parameters string for a given payroll action id.
287 *****************************************************************************/
288 PROCEDURE get_parameters(p_payroll_action_id IN  NUMBER,
289                          p_token_name        IN  VARCHAR2,
290                          p_token_value       OUT  NOCOPY VARCHAR2)
291   IS
292 
293     CURSOR csr_parameter_info(p_pact_id NUMBER)
294     IS
295     SELECT  legislative_parameters
296            ,business_group_id
297       FROM  pay_payroll_actions
298      WHERE  payroll_action_id = p_pact_id;
299 
300     l_token_value VARCHAR2(150);
301     l_bg_id       NUMBER;
302     l_proc        VARCHAR2(100);
303     l_message     VARCHAR2(255);
304     l_param_string VARCHAR2(1000);
305     start_ptr   NUMBER;
306     end_ptr     NUMBER;
307     token_val   pay_payroll_actions.legislative_parameters%TYPE;
308 
309   BEGIN
310 
311     l_proc  := g_proc_name||'get_parameters';
312 
313    IF g_debug  THEN
314      hr_utility.trace ('Entering '||l_proc);
315    END IF ;
316 
317     OPEN csr_parameter_info(p_payroll_action_id);
318     FETCH csr_parameter_info INTO l_param_string,l_bg_id;
319     CLOSE csr_parameter_info;
320 
321      token_val := p_token_name||'=';
322 
323      start_ptr := INSTR(l_param_string, token_val) + LENGTH(token_val);
324      end_ptr := INSTR(l_param_string, ' ',start_ptr);
325 
326      IF end_ptr = 0 THEN
327         end_ptr := LENGTH(l_param_string)+1;
328      END IF;
329 
330      IF INSTR(l_param_string, token_val) = 0 THEN
331        l_token_value := NULL;
332      ELSE
333        l_token_value := SUBSTR(l_param_string, start_ptr, end_ptr - start_ptr);
334      END IF;
335 
336      p_token_value := TRIM(l_token_value);
337 
338     IF (p_token_name = 'BG_ID') THEN
339         p_token_value := l_bg_id;
340     END IF;
341 
342     IF (p_token_value IS NULL) THEN
343          p_token_value := '%';
344     END IF;
345 
346    IF g_debug  THEN
347      hr_utility.trace ('Leaving '||l_proc);
348    END IF ;
349 
350   END get_parameters;
351 
352 --
353 
354 /****************************************************************************
355     Name        : generate_xml
356     Description : This procedure fetches archived data, converts it to XML
357                   format and appends to pay_mag_tape.g_BLOB_value.
358 *****************************************************************************/
359 PROCEDURE generate_xml AS
360     l_old_assact_id                NUMBER;
361     l_final_xml_string             BLOB;
362     xml_string1                     VARCHAR2(2000);
363     l_pact_id                         NUMBER;
364     l_cur_pact                       NUMBER;
365     l_legislative_parameters   VARCHAR(2000);
366     l_cur_assact                   NUMBER ;
367     l_proc_name                   VARCHAR2(60) ;
368     l_offset                           NUMBER;
369     l_amount                        NUMBER;
370     l_count                         NUMBER;
371 --
372 BEGIN
373    IF g_debug  THEN
374     l_proc_name := g_proc_name || 'GENERATE_XML';
375      hr_utility.trace ('Entering '||l_proc_name);
376    END IF ;
377 
378    l_cur_assact := pay_magtape_generic.get_parameter_value('TRANSFER_ACT_ID' );
379    l_cur_pact := pay_magtape_generic.get_parameter_value('TRANSFER_PAYROLL_ACTION_ID' );
380 
381   assact_xml(l_cur_assact);
382 
383  EXCEPTION
384    WHEN no_data_found THEN
385    hr_utility.trace ('exiting from loop');
386 --
387    IF g_debug  THEN
388      hr_utility.trace ('Leaving '||l_proc_name);
389    END IF ;
390 END generate_xml;
391 
392 /****************************************************************************
393     Name        : initialization_code
394     Description : This procedure initialises global values
395                   We call it at the beginning of the archive
396 *****************************************************************************/
397 
398 PROCEDURE initialization_code (p_payroll_action_id  IN NUMBER)
399   IS
400   --
401     l_proc  VARCHAR2(100) ;
402     l_message     VARCHAR2(255);
403     l_chardate_start  VARCHAR2(255);
404     l_chardate_end    VARCHAR2(255);
405     l_tag varchar2(10);
406 
407     l_token_name    pay_in_utils.char_tab_type;
408     l_token_value   pay_in_utils.char_tab_type;
409 
410 
411   BEGIN
412   --
413     l_proc  :=  g_proc_name || 'initialization_code';
414 
415     if g_debug then
416        hr_utility.trace ('Entering '||l_proc);
417     end if ;
418 
419     g_payroll_action_id := p_payroll_action_id;
420     get_parameters(p_payroll_action_id,'YR',g_year);
421     get_parameters(p_payroll_action_id,'START_DATE',l_chardate_start);
422     g_start_date := fnd_date.canonical_to_date(l_chardate_start);
423     get_parameters(p_payroll_action_id,'END_DATE',l_chardate_end);
424     g_end_date := fnd_date.canonical_to_date(l_chardate_end);
425     get_parameters(p_payroll_action_id,'BG_ID',g_bg_id);
426     get_parameters(p_payroll_action_id,'XML_REPORT_TAG',l_tag);
427     get_parameters(p_payroll_action_id,'DEST_CHAR_SET',g_char_set);
428 
429     set_globals;
430     g_start_period := to_char(g_start_date,'MM');
431     g_end_period   := to_char(g_end_date,'MM');
432 
433 
434 
435     if g_debug then
436        hr_utility.trace ('YR  '||g_year);
437        hr_utility.trace ('g_bg_id  '||g_bg_id);
438        hr_utility.trace ('g_start_period  '||g_start_period);
439        hr_utility.trace ('g_end_period '||g_end_period);
440        hr_utility.trace ('g_start_date '||g_start_date);
441        hr_utility.trace ('g_end_date '||g_end_date);
442        hr_utility.trace ('XML REPORT TAG '||l_tag);
443        hr_utility.trace ('SOE/MINISTRY Flag '||g_opt_soe_or_min);
444        hr_utility.trace ('TGL Date Used '||g_trfr_date_used);
445        hr_utility.trace ('Destination character set '||g_char_set);
446        hr_utility.trace ('Leaving '||l_proc);
447     end if ;
448 
449   EXCEPTION
450     WHEN OTHERS THEN
451       RAISE;
452   END initialization_code;
453 
454   /****************************************************************************
455     Name        : gen_xml_header_pay
456     Description : This procedure generates XML header information and appends to
457                   magtape lob
458   *****************************************************************************/
459 PROCEDURE gen_xml_header_pay AS
460     l_proc_name varchar2(100);
461     l_buf      varchar2(2000);
462 --
463 /* Group1 - Payroll Periods */
464 /* Fetch payroll periods whose date_earned/regular_payment_date is between accounting reporting periods*/
465 /* Accounting date depends on g_trfr_date_used, hence the join*/
466 CURSOR csr_payroll_periods IS
467 SELECT to_char(ptp.period_num) pno,
468        to_CHAR(ptp.start_date,'YYYYMMDD') strt,
469        to_CHAR(ptp.end_date,'YYYYMMDD') ende,
470        to_CHAR(ptp.regular_payment_date,'YYYY') yr
471  FROM per_time_periods ptp,
472      pay_payrolls_f ppf
473 WHERE ptp.payroll_id = ppf.payroll_id
474   AND decode(g_trfr_date_used,'E',ptp.end_date,ptp.regular_payment_date) BETWEEN g_start_date and g_end_date
475   AND EXISTS(SELECT 1
476                FROM per_assignments_f paf
477               WHERE paf.payroll_id = ppf.payroll_id
478                 AND paf.business_group_id = g_bg_id)
479 order by ppf.payroll_name,yr,ptp.period_num;
480 
481 /* Group2 - Payroll Elements */
482 /* Fetch payroll elements from Org level Setup*/
483 CURSOR csr_payroll_elements IS
484 SELECT  DISTINCT pap.payroll_name   payroll_name,
485         fnd_number.canonical_to_number(hoi.org_information3)   element_id,
486         nvl(petl.reporting_name,petl.element_name) element_name,
487 	get_cost_alloc_key_flex(hoi.org_information3) exp_cat_code
488    FROM    hr_organization_information hoi
489           ,hr_organization_units       hou
490           ,pay_payrolls_f pap
491           ,pay_element_types_f_tl petl
492           ,pay_element_types_f pet
493  WHERE hoi.org_information_context = 'PER_CNAO_ORG_INFO'
494    AND hou.organization_id = hoi.organization_id
495    AND hou.business_group_id = g_bg_id
496    AND pap.payroll_id = fnd_number.canonical_to_number(hoi.org_information2)
497    AND EXISTS (SELECT 1
498                  FROM per_assignments_f paf
499                 WHERE paf.payroll_id = pap.payroll_id
500 		and paf.effective_end_date >= g_start_date
501 		and paf.effective_start_date <= g_end_date)
502   AND EXISTS (SELECT 1
503                  FROM per_assignments_f paf,
504                       hr_soft_coding_keyflex scl
505                 WHERE paf.soft_coding_keyflex_id = scl.soft_coding_keyflex_id
506                   AND scl.segment1 = hou.organization_id
507                   AND paf.business_group_id = g_bg_id
508                  )
509    AND petl.element_type_id = fnd_number.canonical_to_number(hoi.org_information3)
510    AND pet.element_type_id = petl.element_type_id
511    AND petl.language = userenv('LANG')
512    AND hou.date_from <= g_end_date
513    AND NVL(hou.date_to,TO_DATE('4712/12/31','YYYY/MM/DD')) >= g_start_date
514    AND g_end_date >= fnd_date.canonical_to_date(hoi.org_information4)
515    AND g_start_date <= NVL(fnd_date.canonical_to_date(hoi.org_information5),TO_DATE('4712/12/31','YYYY/MM/DD'))
516    AND g_end_date BETWEEN pet.effective_start_date AND pet.effective_end_date
517    AND g_end_date BETWEEN pap.effective_start_date AND pap.effective_end_date
518 UNION
519 SELECT  DISTINCT pap.payroll_name   payroll_name,
520         fnd_number.canonical_to_number(hoi.org_information2)   element_id,
521         nvl(PBT_TL.REPORTING_NAME,PBT_TL.BALANCE_NAME) element_name,
522         'X' exp_cat_code
523    FROM    hr_organization_information hoi
524           ,hr_organization_units       hou
525           ,pay_payrolls_f pap
526           ,PAY_BALANCE_TYPES PBT, PAY_BALANCE_TYPES_TL PBT_TL
527  WHERE hoi.org_information_context = 'PER_CNAO_BAL_INFO'
528    AND hou.organization_id = hoi.organization_id
529    AND hou.business_group_id = g_bg_id
530    AND pap.payroll_id = fnd_number.canonical_to_number(hoi.org_information4)
531    AND EXISTS (SELECT 1
532                  FROM per_assignments_f paf
533                 WHERE paf.payroll_id = pap.payroll_id
534 		and paf.effective_end_date >= g_start_date
535 		and paf.effective_start_date <= g_end_date)
536   AND EXISTS (SELECT 1
537                  FROM per_assignments_f paf,
538                       hr_soft_coding_keyflex scl
539                 WHERE paf.soft_coding_keyflex_id = scl.soft_coding_keyflex_id
540                   AND scl.segment1 = hou.organization_id
541                   AND paf.business_group_id = g_bg_id
542                  )
543    AND PBT_TL.balance_type_id = fnd_number.canonical_to_number(hoi.org_information2)
544    AND PBT.balance_type_id = PBT_TL.balance_type_id
545    AND PBT_TL.language = userenv('LANG')
546    AND g_end_date BETWEEN fnd_date.canonical_to_date(hoi.org_information5) AND NVL(fnd_date.canonical_to_date(hoi.org_information6),TO_DATE('4712/12/31','YYYY/MM/DD'));
547 
548 
549 /* Group 3 Individual Payroll Records */
550 -- Group each assignment by payroll
551 CURSOR csr_asg IS
552 SELECT paf.assignment_id ,
553        paf.assignment_number,
554        max(paa.assignment_action_id) assignment_action_id,
555        ppf.payroll_name
556    FROM per_assignments_f paf,
557           pay_payroll_actions ppa,
558           pay_assignment_actions paa,
559 	  pay_payrolls_f ppf
560     WHERE paf.effective_start_date <= g_end_date
561       AND paf.effective_end_date >= g_start_date
562       AND paf.business_group_id = g_bg_id
563       AND paa.assignment_id =paf.assignment_id
564       AND paa.payroll_action_id = ppa.payroll_action_id
565       AND ppa.action_type in('R','Q')
566       and ppa.action_status='C'
567       and ppf.payroll_id = ppa.payroll_id
568       AND paf.payroll_id = ppa.payroll_id
569       AND decode(g_trfr_date_used,'E',ppa.date_earned,ppa.effective_date)
570 		      BETWEEN ppf.effective_start_date AND  ppf.effective_end_date
571       AND decode(g_trfr_date_used,'E',ppa.date_earned,ppa.effective_date)
572 		      BETWEEN g_start_date AND  g_end_date
573  group by paf.assignment_id,paf.assignment_number,ppf.payroll_name, to_CHAR(ppa.effective_date,'YYYY')||TO_CHAR(ppa.effective_date,'MM')
574  order by to_number(to_CHAR(ppa.effective_date,'YYYY')||TO_CHAR(ppa.effective_date,'MM')),ppf.payroll_name, paf.assignment_number;
575 
576 
577 /* cursor to get lookup values based on lookup_type and lookup_code */
578 CURSOR get_lookup_values(p_type IN VARCHAR2, p_code IN VARCHAR2)
579 IS
580   SELECT lookup_code,meaning FROM fnd_lookup_values
581   WHERE lookup_type = p_type
582   AND enabled_flag = 'Y'
583   AND lookup_code LIKE p_code
584   AND language = USERENV('LANG')
585   ORDER BY lookup_code;
586 
587   CURSOR csr_group3_data(p_assignment_id IN NUMBER,
588                          p_assignment_action_id IN NUMBER)
589   IS
590   SELECT TO_CHAR(get_employee_number(paf.person_id,ppa.effective_date)) eno,
591        per_cn_shared_info.get_lookup_meaning(paf.employee_category,'EMPLOYEE_CATG') asg_cat ,
592        get_employee_name(paf.person_id,ppa.effective_date) emp_name,
593        to_char(paf.organization_id)  asg_org_id,
594        (select distinct p.payroll_name from pay_payrolls_f p where p.payroll_id = paf.payroll_id) pname,
595        to_CHAR(ppa.effective_date,'YYYY') yr,
596        to_number(TO_CHAR(ppa.effective_date,'MM')) pno,
597        to_CHAR(decode(g_trfr_date_used,'E',ppa.date_earned,ppa.effective_date) ,'YYYY') acct_yr,
598        to_number(to_CHAR(decode(g_trfr_date_used,'E',ppa.date_earned,ppa.effective_date) ,'MM')) accnt_prd,
599        'CNY' currency
600 from       per_all_assignments_f paf,
601            pay_payroll_actions ppa,
602 	   pay_assignment_actions paa
603 where  ppa.effective_date between  paf.effective_start_date and paf.effective_end_date
604  and   paf.assignment_id = p_assignment_id
605  and   paa.assignment_id = paf.assignment_id
606   and  paa.payroll_action_id = ppa.payroll_action_id
607   and  paa.assignment_action_id = p_assignment_action_id;
608 
609 CURSOR get_payroll_id(p_payroll_name IN VARCHAR2)
610 IS
611 select distinct payroll_id
612 from pay_payrolls_f
613 where payroll_name = p_payroll_name;
614 
615   v_pay_prd tab_pay_prd;
616   l_ctr NUMBER;
617   flag NUMBER;
618   rec_count NUMBER;
619   v_ptp_rec ptp_rec;
620   payrec tab_pay_prd_dis;
621   result tab_pay_prd_dis;
622   l_soe_header VARCHAR2(1000);
623   l_min_header VARCHAR2(1000);
624   l_action_info_id pay_action_information.action_information_id%TYPE;
625   l_ovn  NUMBER;
626   j NUMBER;
627   i NUMBER;
628   TYPE l_asg_bulk is TABLE OF csr_asg%ROWTYPE INDEX BY BINARY_INTEGER;
629    asgrec l_asg_bulk;
630 
631   group3rec  csr_group3_data%ROWTYPE;
632   l_payroll_id NUMBER;
633 
634   l_head_trans1 VARCHAR2(100);
635   l_head_trans2 VARCHAR2(100);
636 
637 BEGIN
638    IF g_debug THEN
639      l_proc_name := g_proc_name || 'gen_xml_header_pay';
640      hr_utility.trace ('Entering '||l_proc_name);
641    END IF ;
642 
643      IF g_opt_soe_or_min IS NULL OR g_opt_soe_or_min ='ENT' THEN
644       l_head_trans1 := per_cn_shared_info.get_lookup_meaning('HEADER_1','CN_SOE_LABELS');
645       l_head_trans2 := per_cn_shared_info.get_lookup_meaning('HEADER_2','CN_SOE_LABELS');
646       l_soe_header := l_head_trans1||' xsi:schemaLocation="http://sxbw.audit.gov.cn/AccountingSoftwareDataInterfaceStandard/2010/SOE/XMLSchema '||
647            l_head_trans1||'.xsd" xmlns:'||l_head_trans2||
648            '="http://sxbw.audit.gov.cn/AccountingSoftwareDataInterfaceStandard/2010/SOE/XMLSchema" xmlns="http://sxbw.audit.gov.cn/AccountingSoftwareDataInterfaceStandard/2010/SOE/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"';
649       load_xml_internal('SG',l_soe_header,null);
650      ELSE
651       l_head_trans1 := per_cn_shared_info.get_lookup_meaning('HEADER_1','CN_MINISTRY_LABELS');
652       l_head_trans2 := per_cn_shared_info.get_lookup_meaning('HEADER_2','CN_MINISTRY_LABELS');
653       l_min_header := l_head_trans1||' xsi:schemaLocation="http://sxbw.audit.gov.cn/AccountingSoftwareDataInterfaceStandard/2010/PSGA/XMLSchema '||
654          l_head_trans1||'.xsd" xmlns:'||l_head_trans2||
655          '="http://sxbw.audit.gov.cn/AccountingSoftwareDataInterfaceStandard/2010/PSGA/XMLSchema" xmlns="http://sxbw.audit.gov.cn/AccountingSoftwareDataInterfaceStandard/2010/PSGA/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"';
656       load_xml_internal('SG',l_min_header,null);
657      END IF;
658 
659    l_ctr := 0;
660 
661    OPEN csr_payroll_periods;
662    FETCH csr_payroll_periods BULK COLLECT INTO payrec;
663    CLOSE csr_payroll_periods;
664 
665    l_ctr := 0;
666    flag := 0;
667 
668 if payrec.COUNT > 0 THEN
669     FOR i in payrec.FIRST .. payrec.LAST LOOP
670          flag := 0;
671        FOR j in 0 .. l_ctr-1 LOOP
672          if (payrec(i).p_num = result(j).p_num and payrec(i).p_start = result(j).p_start and
673             payrec(i).p_end = result(j).p_end and payrec(i).p_year = result(j).p_year) then
674               flag := 1;
675               EXIT;
676          END IF;
677        END LOOP;
678       if flag <> 1 then
679       result(l_ctr).p_num := payrec(i).p_num;
680       result(l_ctr).p_start := payrec(i).p_start;
681       result(l_ctr).p_end := payrec(i).p_end;
682       result(l_ctr).p_year := payrec(i).p_year;
683       l_ctr := l_ctr + 1;
684       end if;
685     END LOOP;
686 
687    /* Below code to add Payroll information to the XML */
688     FOR p IN result.FIRST .. result.LAST LOOP
689          load_xml_internal('SG', g_pay_prd(0).p_meaning , NULL);
690          load_xml_internal('CG', g_pay_prd(1).p_meaning , result(p).p_year);
691          load_xml_internal('CG', g_pay_prd(2).p_meaning , result(p).p_num);
692          load_xml_internal('CG', g_pay_prd(3).p_meaning , result(p).p_start);
693          load_xml_internal('CG', g_pay_prd(4).p_meaning , result(p).p_end);
694          load_xml_internal('EG', g_pay_prd(0).p_meaning , NULL);
695     END LOOP;
696 
697 END IF;
698    /* Below code to add Element information to the XML */
699 
700     result.DELETE;
701     payrec.DELETE;
702     l_ctr := 0;
703 
704    for j in csr_payroll_elements LOOP
705         load_xml_internal('SG', g_pay_ele(0).p_meaning , NULL);
706         load_xml_internal('CG', g_pay_ele(1).p_meaning , j.payroll_name);
707         load_xml_internal('CG', g_pay_ele(2).p_meaning , j.element_id);
708         load_xml_internal('CG', g_pay_ele(3).p_meaning , j.element_name);
709         IF g_opt_soe_or_min = 'NPG' THEN
710            IF j.exp_cat_code IS NULL THEN
711 
712                 pay_action_information_api.create_action_information
713                 (p_action_context_id              =>     g_payroll_action_id
714                 ,p_action_context_type            =>     'PA'
715                 ,p_action_information_category    =>     'CN_AUDIT_MESSAGES'
716                 ,p_action_information3            =>     'CN_EXPENDITURE_CODE'
717                 ,p_action_information4            =>     j.element_name
718 		,p_action_information5            =>     j.payroll_name
719                 ,p_action_information_id          =>     l_action_info_id
720                 ,p_object_version_number          =>     l_ovn
721                 );
722 
723                 load_xml_internal('CG', g_pay_ele(4).p_meaning , per_cn_shared_info.get_lookup_meaning('NODATA','CN_AUDIT_DATA'));
724            ELSE
725               IF j.exp_cat_code = 'X' THEN
726                 load_xml_internal('CG', g_pay_ele(4).p_meaning , NULL);
727               ELSE
728                 load_xml_internal('CG', g_pay_ele(4).p_meaning , j.exp_cat_code);
729               END IF;
730            END IF;
731 
732         END IF;
733         load_xml_internal('EG', g_pay_ele(0).p_meaning , null);
734    END LOOP;
735 
736     v_pay_prd.DELETE;
737     v_ptp_rec.DELETE;
738     l_ctr := 0;
739 
740 OPEN csr_asg;
741 FETCH csr_asg BULK COLLECT INTO asgrec;
742 CLOSE csr_asg;
743 
744 
745 IF asgrec.COUNT > 0 THEN
746 for i in asgrec.first..asgrec.last LOOP
747 
748 
749   OPEN csr_group3_data(asgrec(i).assignment_id,asgrec(i).assignment_action_id);
750    FETCH csr_group3_data INTO group3rec;
751       IF csr_group3_data%FOUND THEN
752           IF group3rec.asg_cat IS NULL AND g_opt_soe_or_min ='ENT' then
753 
754               pay_action_information_api.create_action_information
755                 (p_action_context_id              =>     g_payroll_action_id
756                 ,p_action_context_type            =>     'PA'
757                 ,p_action_information_category    =>     'CN_AUDIT_MESSAGES'
758                 ,p_assignment_id                  =>     asgrec(i).assignment_id
759                 ,p_action_information1            =>     group3rec.eno
760                 ,p_action_information2            =>     group3rec.pno
761                 ,p_action_information3            =>     'CN_EMP_CATEGORY'
762                 ,p_action_information_id          =>     l_action_info_id
763                 ,p_object_version_number          =>     l_ovn
764                 );
765              hr_utility.trace('Emp Cat Code for '||group3rec.eno||' for period '||group3rec.accnt_prd);
766           end if;
767         load_xml_internal('SG', g_ind_asg(0).p_meaning , null);
768         load_xml_internal('CG', g_ind_asg(1).p_meaning , group3rec.eno);
769 
770 	IF g_opt_soe_or_min IS NULL OR g_opt_soe_or_min ='ENT' THEN
771             load_xml_internal('CG', g_ind_asg(2).p_meaning , nvl(group3rec.asg_cat,per_cn_shared_info.get_lookup_meaning('NODATA','CN_AUDIT_DATA')));
772         ELSE
773             load_xml_internal('CG', g_ind_asg(2).p_meaning , group3rec.emp_name);
774         END IF;
775 
776         load_xml_internal('CG', g_ind_asg(3).p_meaning , group3rec.asg_org_id);
777         load_xml_internal('CG', g_ind_asg(4).p_meaning , group3rec.pname);
778         load_xml_internal('CG', g_ind_asg(5).p_meaning , group3rec.yr);
779         load_xml_internal('CG', g_ind_asg(6).p_meaning , group3rec.pno);
780         load_xml_internal('CG', g_ind_asg(7).p_meaning , group3rec.acct_yr);
781         load_xml_internal('CG', g_ind_asg(8).p_meaning , group3rec.accnt_prd);
782         load_xml_internal('CG', g_ind_asg(9).p_meaning , group3rec.currency);
783         load_xml_internal('EG', g_ind_asg(0).p_meaning , null);
784       END IF;
785 
786   CLOSE csr_group3_data;
787 END LOOP;
788 END IF;
789    if g_debug then
790      hr_utility.trace ('Leaving '||l_proc_name);
791    end if ;
792 
793 END gen_xml_header_pay;
794 
795   /****************************************************************************
796     Name         : gen_xml_footer
797     Desc         : Footer
798   *****************************************************************************/
799 PROCEDURE gen_xml_footer AS
800   l_buf  varchar2(2000) ;
801   l_proc_name varchar2(100);
802   l_head_trans1 VARCHAR2(1000);
803 BEGIN
804     if g_debug  then
805       l_proc_name := g_proc_name || 'gen_xml_footer';
806       hr_utility.trace ('Entering '||l_proc_name);
807     end if ;
808 --
809      IF g_opt_soe_or_min IS NULL OR g_opt_soe_or_min ='ENT' THEN
810        l_head_trans1 := per_cn_shared_info.get_lookup_meaning('HEADER_1','CN_SOE_LABELS');
811        load_xml_internal('EG',l_head_trans1,null);
812      ELSE
813        l_head_trans1 := per_cn_shared_info.get_lookup_meaning('HEADER_1','CN_MINISTRY_LABELS');
814        load_xml_internal('EG',l_head_trans1,null);
815      END IF;
816     if g_debug then
817       hr_utility.trace ('Leaving '||l_proc_name);
818    end if ;
819 
820 END gen_xml_footer;
821 
822 /****************************************************************************
823     Name        : assact_xml
824     Arguments   : p_assignment_action_id
825     Description : This procedure creates xml for the assignment_action_id passed
826                   as parameter. It then writes the xml into magtape lob
827 		  We know the payroll period and assignment.
828 		  Get payroll runs in this period
829 		  Use payslip archive data to report the values
830 *****************************************************************************/
831 PROCEDURE assact_xml(p_assignment_action_id  IN NUMBER) IS
832 
833 -- p_pprd_num is payroll period . p_pyear is payroll year
834 -- Get payslip archive id that locks payroll runs within the chosen payroll period
835 -- MULTIPLE PAYROLLS and single archive - issue may come
836 -- Not using ptp.time_period_id joins due to Bug 9782488
837 CURSOR csr_assignments(p_assignment_id IN NUMBER,
838                        p_pprd_num IN varchar2,
839 		       p_pyear IN varchar2,
840 		       p_payroll_id IN NUMBER) IS
841 select arch_paa.assignment_action_id asg_action_id ,
842        ppa.payroll_id payroll_id,
843        ppa.date_earned earn_date,
844        ppa.effective_date eff_date
845   from pay_payroll_actions arch_ppa,
846        pay_assignment_actions arch_paa,
847        pay_action_interlocks intl,
848        pay_payroll_Actions ppa,
849        pay_assignment_actions paa
850 where arch_paa.assignment_action_id = intl.locking_action_id
851   and arch_paa.payroll_Action_id = arch_ppa.payroll_action_id
852   and arch_paa.source_action_id is not null
853   and arch_ppa.action_type='X'
854   and ARCH_ppa.report_type='CN_PAYSLIP_ARCHIVE'
855   and arch_paa.assignment_id = p_assignment_id
856   and intl.locked_action_id = paa.assignment_action_id
857   and  paa.payroll_action_id = ppa.payroll_Action_id
858   and ppa.action_type in('R','Q')
859   and ppa.payroll_id = p_payroll_id
860   and paa.assignment_id = p_assignment_id
861   and paa.source_action_id is null
862   and to_number(to_char(ppa.effective_date,'MM')) = p_pprd_num
863   and to_number(to_char(ppa.effective_date,'YYYY')) = p_pyear
864   order by payroll_id,asg_action_id;
865 
866 -- Archive element details
867 CURSOR csr_arch_elements(p_assignment_id IN NUMBER,
868 			 p_payroll_id IN NUMBER,
869 			 p_action_context_id IN NUMBER,
870 			 p_date_earned IN DATE,
871 			 p_effective_date IN DATE) IS
872 select person.employee_number eno,
873        pname.payroll_name pay_name,
874        to_char(p_effective_date,'YYYY') pyear,
875        to_number(to_char(p_effective_date,'MM')) pnum,
876        pet.element_type_id eid,
877        trim(to_char(fnd_number.canonical_to_number(pai.action_information5),'999999990.99')) current_amount
878   from pay_action_information pai,
879        (select pap.payroll_name
880           from pay_all_payrolls_f pap
881 	 where pap.payroll_id = p_payroll_id
882            AND g_end_date BETWEEN pap.effective_start_date AND pap.effective_end_date) pname,
883        (SELECT ppf.employee_number
884           FROM per_all_people_f ppf,
885 	       per_all_assignments_f paf
886 	 WHERE paf.person_id = ppf.person_id
887 	   AND paf.assignment_id = p_assignment_id
888 	   AND p_date_earned BETWEEN ppf.effective_start_date and ppf.effective_end_date
889 	   AND p_date_earned BETWEEN paf.effective_start_date and paf.effective_end_date) person,
890        hr_organization_information hoi,
891        hr_organization_units       hou,
892        pay_element_types_f_tl petl,
893        pay_element_types_f pet
894  where action_context_id = p_action_context_id
895    and pai.action_information_category = 'APAC ELEMENTS'
896    and pai.action_information1 = nvl(petl.reporting_name,petl.element_name)
897    and hoi.org_information_context = 'PER_CNAO_ORG_INFO'
898    AND hou.organization_id = hoi.organization_id
899    AND hou.business_group_id = g_bg_id
900    AND hoi.org_information2 = p_payroll_id
901    and petl.element_type_id = hoi.org_information3
902    and pet.element_type_id = petl.element_type_id
903    and petl.language = userenv('LANG')
904    AND g_end_date BETWEEN hou.date_from AND NVL(hou.date_to,TO_DATE('4712/12/31','YYYY/MM/DD'))
905    AND g_end_date BETWEEN fnd_date.canonical_to_date(hoi.org_information4) AND NVL(fnd_date.canonical_to_date(hoi.org_information5),TO_DATE('4712/12/31','YYYY/MM/DD'))
906    AND g_end_date BETWEEN pet.effective_start_date AND pet.effective_end_date;
907 
908 -- Archive Other balance details
909 CURSOR csr_arch_balances(p_assignment_id IN NUMBER,
910 			 p_payroll_id IN NUMBER,
911 			 p_action_context_id IN NUMBER,
912 			 p_date_earned IN DATE,
913 			 p_effective_date IN DATE) IS
914 select person.employee_number eno,
915        pname.payroll_name pay_name,
916        to_char(p_effective_date,'YYYY') pyear,
917        to_number(to_char(p_effective_date,'MM')) pnum,
918        pbt.balance_type_id eid,
919        trim(to_char(fnd_number.canonical_to_number(pai.action_information6),'999999990.99')) current_amount
920   from pay_action_information pai,
921        (select pap.payroll_name
922           from pay_all_payrolls_f pap
923 	 where pap.payroll_id = p_payroll_id
924            AND g_end_date BETWEEN pap.effective_start_date AND pap.effective_end_date) pname,
925        (SELECT ppf.employee_number
926           FROM per_all_people_f ppf,
927 	       per_all_assignments_f paf
928 	 WHERE paf.person_id = ppf.person_id
929 	   AND paf.assignment_id = p_assignment_id
930 	   AND p_date_earned BETWEEN ppf.effective_start_date and ppf.effective_end_date
931 	   AND p_date_earned BETWEEN paf.effective_start_date and paf.effective_end_date) person,
932        hr_organization_information hoi,
933        hr_organization_units       hou,
934        PAY_BALANCE_TYPES PBT, PAY_BALANCE_TYPES_TL PBT_TL
935  where action_context_id = p_action_context_id
936    and pai.action_information_category = 'EMPLOYEE OTHER INFORMATION'
937    and pai.action_information4 = (select nvl(h.ORG_INFORMATION7,PBT_TL.BALANCE_NAME)
938 			       from hr_organization_information h
939 			       where h.org_information_context = 'Business Group:Payslip Info'
940 		               and h.organization_id = g_bg_id
941 		               and h.ORG_INFORMATION1 = 'BALANCE'
942 	                       and h.ORG_INFORMATION4 = PBT_TL.BALANCE_TYPE_ID
943                 	       and h.ORG_INFORMATION5 = (select pbd.balance_dimension_id
944 			                                 from pay_balance_dimensions pbd
945 							 where legislation_code = 'CN'
946 							 and dimension_name = '_ASG_PTD')
947                        	        )
948    and pai.action_information5 = 'ASG_PTD'
949    and hoi.org_information_context = 'PER_CNAO_BAL_INFO'
950    AND hou.organization_id = hoi.organization_id
951    AND hou.business_group_id = g_bg_id
952    AND hoi.org_information4 = p_payroll_id
953    and PBT_TL.balance_type_id = hoi.org_information2
954    and PBT.balance_type_id = PBT_TL.balance_type_id
955    and PBT_TL.language = userenv('LANG')
956    AND g_end_date BETWEEN hou.date_from AND NVL(hou.date_to,TO_DATE('4712/12/31','YYYY/MM/DD'))
957    AND g_end_date BETWEEN fnd_date.canonical_to_date(hoi.org_information5) AND NVL(fnd_date.canonical_to_date(hoi.org_information6),TO_DATE('4712/12/31','YYYY/MM/DD'));
958 
959 -- Archive Statutory balance details
960 CURSOR csr_arch_stat_balances(p_assignment_id IN NUMBER,
961 			 p_payroll_id IN NUMBER,
962 			 p_action_context_id IN NUMBER,
963 			 p_date_earned IN DATE,
964 			 p_effective_date IN DATE) IS
965 select person.employee_number eno,
966        pname.payroll_name pay_name,
967        to_char(p_effective_date,'YYYY') pyear,
968        to_number(to_char(p_effective_date,'MM')) pnum,
969        pbt.balance_type_id eid,
970        trim(to_char(fnd_number.canonical_to_number(pai.action_information5),'999999990.99')) current_amount
971   from pay_action_information pai,
972        (select pap.payroll_name
973           from pay_all_payrolls_f pap
974 	 where pap.payroll_id = p_payroll_id
975            AND g_end_date BETWEEN pap.effective_start_date AND pap.effective_end_date) pname,
976        (SELECT ppf.employee_number
977           FROM per_all_people_f ppf,
978 	       per_all_assignments_f paf
979 	 WHERE paf.person_id = ppf.person_id
980 	   AND paf.assignment_id = p_assignment_id
981 	   AND p_date_earned BETWEEN ppf.effective_start_date and ppf.effective_end_date
982 	   AND p_date_earned BETWEEN paf.effective_start_date and paf.effective_end_date) person,
983        hr_organization_information hoi,
984        hr_organization_units       hou,
985        PAY_BALANCE_TYPES PBT, PAY_BALANCE_TYPES_TL PBT_TL
986  where action_context_id = p_action_context_id
987    and pai.action_information_category = 'APAC BALANCES'
988    and pai.action_information1 = nvl(PBT_TL.REPORTING_NAME,PBT_TL.BALANCE_NAME)
989    and hoi.org_information_context = 'PER_CNAO_BAL_INFO'
990    AND hou.organization_id = hoi.organization_id
991    AND hou.business_group_id = g_bg_id
992    AND hoi.org_information4 = p_payroll_id
993    and PBT_TL.balance_type_id = hoi.org_information2
994    and PBT.balance_type_id = PBT_TL.balance_type_id
995    and PBT_TL.language = userenv('LANG')
996    AND g_end_date BETWEEN hou.date_from AND NVL(hou.date_to,TO_DATE('4712/12/31','YYYY/MM/DD'))
997    AND g_end_date BETWEEN fnd_date.canonical_to_date(hoi.org_information5) AND NVL(fnd_date.canonical_to_date(hoi.org_information6),TO_DATE('4712/12/31','YYYY/MM/DD'));
998 
999 CURSOR get_lookup_values(p_type IN VARCHAR2, p_code IN VARCHAR2)
1000 IS
1001   select lookup_code,meaning from fnd_lookup_values
1002   where lookup_type = p_type
1003   and enabled_flag = 'Y'
1004   and lookup_code like p_code
1005   and language = userenv('lang')
1006   order by lookup_code;
1007 
1008 --Variables-----
1009  l_common_xml    VARCHAR2(4000);
1010  l_xml_begin     VARCHAR2(200);
1011  l_xml2          VARCHAR2(40);
1012  l_mag_asg_action_id   pay_assignment_actions.assignment_action_id%TYPE;
1013  l_assignment_id number;
1014  l_serial_number varchar2(500);
1015  l_pact number;
1016  l_ctr number;
1017  isdf_emp_c csr_assignments%ROWTYPE;
1018  v_pay_prd tab_pay_prd;
1019  l_year VARCHAR2(40);
1020  l_period number;
1021  l_assact_id number;
1022 l_payr_id number;
1023 
1024 
1025 BEGIN
1026 
1027   select assignment_id,payroll_action_id,serial_number
1028   into l_assignment_id,l_pact,l_serial_number
1029   from
1030   pay_assignment_Actions
1031   where assignment_Action_id = p_assignment_action_id;
1032 
1033   IF g_year IS NULL then
1034    initialization_code(l_pact);
1035   END IF;
1036 
1037 -- l_serial_number is combination of payroll year + payroll period
1038  l_year :=  SUBSTR(l_serial_number,1,4);
1039  l_period := SUBSTR(l_serial_number,5,2);
1040  l_payr_id := to_number(substr(l_serial_number,7));
1041 
1042 
1043     FOR i IN csr_assignments(l_assignment_id,l_period,l_year,l_payr_id) LOOP
1044 
1045         hr_utility.trace('Payroll YearPeriod for assignment action'||l_serial_number);
1046         if(l_assact_id is  null or  l_assact_id <> i.asg_action_id) then
1047 
1048         FOR j in  csr_arch_elements(l_assignment_id,i.payroll_id, i.asg_action_id,i.earn_date,i.eff_date) LOOP
1049         hr_utility.trace('XML elements being created for assignment_id id '||l_assignment_id);
1050         hr_utility.trace('Period for assignment action'||l_period);
1051 
1052         load_xml_internal('SG',g_ind_detail(0).p_meaning,NULL);
1053         load_xml_internal('CG',g_ind_detail(1).p_meaning,j.eno);
1054         load_xml_internal('CG',g_ind_detail(2).p_meaning,j.pay_name);
1055         load_xml_internal('CG',g_ind_detail(3).p_meaning,j.pyear);
1056         load_xml_internal('CG',g_ind_detail(4).p_meaning,j.pnum);
1057         load_xml_internal('CG',g_ind_detail(5).p_meaning,j.eid);
1058         load_xml_internal('CG',g_ind_detail(6).p_meaning,j.current_amount);
1059         load_xml_internal('EG',g_ind_detail(0).p_meaning,NULL);
1060         l_assact_id := i.asg_action_id;
1061 
1062        END LOOP;
1063         FOR k in  csr_arch_balances(l_assignment_id,i.payroll_id, i.asg_action_id,i.earn_date,i.eff_date) LOOP
1064         hr_utility.trace('XML balances being created for assignment_id id '||l_assignment_id);
1065         hr_utility.trace('Period for assignment action'||l_period);
1066 
1067         load_xml_internal('SG',g_ind_detail(0).p_meaning,NULL);
1068         load_xml_internal('CG',g_ind_detail(1).p_meaning,k.eno);
1069         load_xml_internal('CG',g_ind_detail(2).p_meaning,k.pay_name);
1070         load_xml_internal('CG',g_ind_detail(3).p_meaning,k.pyear);
1071         load_xml_internal('CG',g_ind_detail(4).p_meaning,k.pnum);
1072         load_xml_internal('CG',g_ind_detail(5).p_meaning,k.eid);
1073         load_xml_internal('CG',g_ind_detail(6).p_meaning,k.current_amount);
1074         load_xml_internal('EG',g_ind_detail(0).p_meaning,NULL);
1075         l_assact_id := i.asg_action_id;
1076 
1077        END LOOP;
1078 
1079         FOR x in  csr_arch_stat_balances(l_assignment_id,i.payroll_id, i.asg_action_id,i.earn_date,i.eff_date) LOOP
1080         hr_utility.trace('XML stat balances being created for assignment_id id '||l_assignment_id);
1081         hr_utility.trace('Period for assignment action'||l_period);
1082 
1083         load_xml_internal('SG',g_ind_detail(0).p_meaning,NULL);
1084         load_xml_internal('CG',g_ind_detail(1).p_meaning,x.eno);
1085         load_xml_internal('CG',g_ind_detail(2).p_meaning,x.pay_name);
1086         load_xml_internal('CG',g_ind_detail(3).p_meaning,x.pyear);
1087         load_xml_internal('CG',g_ind_detail(4).p_meaning,x.pnum);
1088         load_xml_internal('CG',g_ind_detail(5).p_meaning,x.eid);
1089         load_xml_internal('CG',g_ind_detail(6).p_meaning,x.current_amount);
1090         load_xml_internal('EG',g_ind_detail(0).p_meaning,NULL);
1091         l_assact_id := i.asg_action_id;
1092 
1093        END LOOP;
1094 
1095        end if;
1096     END LOOP;
1097 
1098  END assact_xml;
1099 
1100 /****************************************************************************
1101     Name        : load_xml_internal
1102     Arguments   : p_node_type ( starting tag / ending tag / centre data )
1103                   p_node ( Node name )
1104                   p_data ( Node Value = NULL for starting and ending tags)
1105     Description : This procedure writes the xml tag and its value to magtape lob
1106 *****************************************************************************/
1107 
1108 PROCEDURE load_xml_internal ( p_node_type     IN    VARCHAR2
1109                                ,p_node         IN     VARCHAR2
1110                                ,p_data         IN     VARCHAR2) IS
1111     l_proc_name VARCHAR2(100);
1112     l_data      VARCHAR2(240);
1113     l_xml       VARCHAR2(1000);
1114     l_node varchar2(2000);
1115 
1116   BEGIN
1117     l_proc_name := g_proc_name || 'LOAD_XML_INTERNAL';
1118 
1119     IF g_debug THEN
1120          hr_utility.trace ('Entering '||l_proc_name);
1121     END IF;
1122 
1123     IF p_node_type = 'ROOT' THEN
1124 
1125         l_xml := '<![CDATA['||p_node||']]>'||EOL;
1126 
1127     ELSIF p_node_type = 'SG' THEN
1128 
1129         l_xml := '<'||p_node||'>'||EOL;
1130 
1131     ELSIF p_node_type = 'EG' THEN
1132 
1133         l_xml := '</'||p_node||'>'||EOL;
1134 
1135     ELSIF p_node_type = 'CG' THEN
1136 
1137         /* Handle special charaters in node value */
1138         l_data := REPLACE (p_data, '&', '&');
1139         l_data := REPLACE (l_data, '>', '>');
1140         l_data := REPLACE (l_data, '<', '<');
1141         l_data := REPLACE (l_data, '''', ''');
1142         l_data := REPLACE (l_data, '"', '"');
1143         l_xml  := '<'||p_node||'>'||l_data||'</'||p_node||'>'||EOL;
1144 
1145     END IF;
1146 
1147     pay_core_files.write_to_magtape_lob(l_xml);
1148 
1149     IF g_debug THEN
1150          hr_utility.trace ('Leaving '||l_proc_name);
1151          hr_utility.trace ('XML Data being written is '||l_xml);
1152     END IF;
1153 
1154   END load_xml_internal;
1155 
1156 /****************************************************************************
1157     Name        : set_globals
1158     Description : This procedure sets the values of certain globals which will
1159                   be used during the archive process multiple times. Following
1160                   are the globals  which will be set:
1161                 1. Global to check if Date Earned/Date Paid is used for Ledger Transfer
1162                 2. Global to check if Auditing is for SOE / MINISTRY
1163                 3. Global table to store SOE/MINISTRY XML Tags for all the 4 groups
1164 *****************************************************************************/
1165 
1166 PROCEDURE set_globals IS
1167 
1168 CURSOR csr_transfer_to_gl_date IS
1169 SELECT parameter_value
1170   FROM pay_action_parameters
1171  WHERE parameter_name ='TGL_DATE_USED';
1172 
1173 CURSOR gen_xml_opt_soe_min
1174 IS
1175    SELECT  hoi.org_information16
1176    FROM    hr_organization_information hoi
1177           ,hr_organization_units       hou
1178    WHERE    hoi.org_information_context = 'PER_CORPORATE_INFO_CN'
1179    AND hou.organization_id = hoi.organization_id
1180    AND hou.business_group_id = g_bg_id
1181    AND EXISTS (SELECT 1
1182                  FROM per_assignments_f paf,
1183                       hr_soft_coding_keyflex scl
1184                  WHERE paf.soft_coding_keyflex_id = scl.soft_coding_keyflex_id
1185                  AND scl.segment1 = hou.organization_id
1186                  AND paf.business_group_id = g_bg_id
1187                  )
1188    ORDER BY org_information16;
1189 
1190 l_lookup_type hr_lookups.lookup_type%TYPE;
1191 
1192 
1193 BEGIN
1194 
1195      IF g_debug THEN
1196          hr_utility.trace('Entering set_globals procedure');
1197      END IF;
1198 
1199 -- capture the value of g_opt_soe_or_min
1200 OPEN gen_xml_opt_soe_min;
1201 FETCH gen_xml_opt_soe_min INTO g_opt_soe_or_min;
1202   IF gen_xml_opt_soe_min%NOTFOUND THEN
1203      g_opt_soe_or_min := NULL;
1204   END IF;
1205 CLOSE gen_xml_opt_soe_min;
1206 
1207 -- capture the value of g_trfr_date_used
1208 OPEN csr_transfer_to_gl_date;
1209  FETCH csr_transfer_to_gl_date into g_trfr_date_used;
1210    IF csr_transfer_to_gl_date%NOTFOUND THEN
1211     g_trfr_date_used :='E';
1212    END IF;
1213 CLOSE csr_transfer_to_gl_date;
1214 
1215 IF g_opt_soe_or_min ='ENT' THEN
1216   l_lookup_type := 'CN_SOE_LABELS';
1217 ELSIF g_opt_soe_or_min ='NPG' THEN
1218   l_lookup_type := 'CN_MINISTRY_LABELS';
1219 ELSE
1220   l_lookup_type := 'CN_SOE_LABELS';
1221 END IF;
1222 
1223 
1224 IF l_lookup_type IS NOT NULL THEN
1225     g_pay_prd(0).p_meaning := per_cn_shared_info.get_lookup_meaning('PERIOD',l_lookup_type);
1226     g_pay_prd(1).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_13',l_lookup_type);
1227     g_pay_prd(2).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_14',l_lookup_type);
1228     g_pay_prd(3).p_meaning := per_cn_shared_info.get_lookup_meaning('PERIOD_13',l_lookup_type);
1229     g_pay_prd(4).p_meaning := per_cn_shared_info.get_lookup_meaning('PERIOD_14',l_lookup_type);
1230 
1231     g_pay_ele(0).p_meaning := per_cn_shared_info.get_lookup_meaning('ELEMENT',l_lookup_type);
1232     g_pay_ele(1).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_12',l_lookup_type);
1233     g_pay_ele(2).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_15',l_lookup_type);
1234     g_pay_ele(3).p_meaning := per_cn_shared_info.get_lookup_meaning('ELEMENT_13',l_lookup_type);
1235     g_pay_ele(4).p_meaning := per_cn_shared_info.get_lookup_meaning('ELEMENT_14','CN_MINISTRY_LABELS');
1236 
1237     g_ind_asg(0).p_meaning := per_cn_shared_info.get_lookup_meaning('RECORD',l_lookup_type);
1238     g_ind_asg(1).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_11',l_lookup_type);
1239     g_ind_asg(2).p_meaning := per_cn_shared_info.get_lookup_meaning('RECORD_12',l_lookup_type);
1240     g_ind_asg(3).p_meaning := per_cn_shared_info.get_lookup_meaning('RECORD_13',l_lookup_type);
1241     g_ind_asg(4).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_12',l_lookup_type);
1242     g_ind_asg(5).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_13',l_lookup_type);
1243     g_ind_asg(6).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_14',l_lookup_type);
1244     g_ind_asg(7).p_meaning := per_cn_shared_info.get_lookup_meaning('RECORD_17',l_lookup_type);
1245     g_ind_asg(8).p_meaning := per_cn_shared_info.get_lookup_meaning('RECORD_18',l_lookup_type);
1246     g_ind_asg(9).p_meaning := per_cn_shared_info.get_lookup_meaning('RECORD_19',l_lookup_type);
1247 
1248 
1249     g_ind_detail(0).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL',l_lookup_type);
1250     g_ind_detail(1).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_11',l_lookup_type);
1251     g_ind_detail(2).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_12',l_lookup_type);
1252     g_ind_detail(3).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_13',l_lookup_type);
1253     g_ind_detail(4).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_14',l_lookup_type);
1254     g_ind_detail(5).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_15',l_lookup_type);
1255     g_ind_detail(6).p_meaning := per_cn_shared_info.get_lookup_meaning('DETAIL_16',l_lookup_type);
1256 
1257 
1258  END IF;
1259 
1260      IF g_debug THEN
1261          hr_utility.trace('Leaving set_globals procedure');
1262      END IF;
1263 
1264 END set_globals;
1265 
1266 /****************************************************************************
1267     Name        : get_employee_number
1268     Arguments   : 1. Person ID
1269                   2. Effective Date
1270     Description : This function fetches the employee number based on a given
1271                   person id and effective date and is used in some cursors above.
1272 *****************************************************************************/
1273 FUNCTION get_employee_number (p_person_id     in number,
1274                               p_effective_date    in date)
1275 RETURN VARCHAR2 IS
1276 
1277   CURSOR c_employee_number
1278       IS
1279    SELECT employee_number
1280     FROM per_all_people_f
1281    WHERE person_id = p_person_id
1282      AND p_effective_date BETWEEN effective_start_date AND effective_end_date;
1283 
1284   l_emp_num       per_all_people_f.employee_number%TYPE;
1285 
1286 BEGIN
1287 
1288      IF g_debug THEN
1289          hr_utility.trace('Entering get_employee_number function');
1290      END IF;
1291 
1292   OPEN c_employee_number;
1293   FETCH c_employee_number INTO l_emp_num;
1294   CLOSE c_employee_number;
1295 
1296      IF g_debug THEN
1297          hr_utility.trace('Leaving get_employee_number function');
1298      END IF;
1299 
1300   RETURN l_emp_num ;
1301 
1302 END get_employee_number;
1303 
1304 /****************************************************************************
1305     Name        : get_employee_name
1306     Arguments   : 1. Person ID
1307                   2. Effective Date
1308     Description : This function fetches the employee name based on a given
1309                   person id and effective date and is used in some cursors above.
1310 *****************************************************************************/
1311 FUNCTION get_employee_name(p_person_id     in number,
1312                            p_effective_date    in date)
1313 RETURN VARCHAR2 IS
1314 
1315   CURSOR c_employee_name
1316       IS
1317    SELECT full_name
1318     FROM per_all_people_f
1319    WHERE person_id = p_person_id
1320      AND p_effective_date BETWEEN effective_start_date AND effective_end_date;
1321 
1322 l_emp_name VARCHAR2(1000);
1323 BEGIN
1324 
1325   OPEN c_employee_name;
1326   FETCH c_employee_name INTO l_emp_name;
1327   CLOSE c_employee_name;
1328 
1329   RETURN l_emp_name ;
1330 
1331 END get_employee_name;
1332 
1333 /****************************************************************************
1334     Name        : get_cost_alloc_key_flex
1335     Arguments   : 1. Element Type ID
1336     Description : This function fetches the expenditure category code
1337                   from the element links window based on the payroll
1338                   costing segment
1339 *****************************************************************************/
1340 FUNCTION get_cost_alloc_key_flex(p_element_type_id IN NUMBER)
1341 RETURN VARCHAR2 IS
1342 
1343 /* cursor to get cost allocation segment number */
1344 CURSOR c_get_cost_seg IS
1345        select ORG_INFORMATION2
1346        from  HR_ORGANIZATION_INFORMATION
1347        where ORG_INFORMATION_CONTEXT='PER_CNAO_EXPEND_CODE_INFO'
1348          and ORGANIZATION_ID = g_bg_id;
1349 
1350 /* cursor to fetch the expense category code segment*/
1351 CURSOR c_exp_cat_code(p_element_id IN NUMBER) IS
1352 	select COST_ALLOCATION_KEYFLEX_ID
1353 	from pay_element_links_f
1354 	where business_group_id = g_bg_id
1355 	and element_type_id = p_element_id
1356 	and effective_start_date =
1357         (select min(effective_start_date) from pay_element_links_f where  business_group_id = g_bg_id
1358         and element_type_id = p_element_id);
1359 
1360 l_cost_seg VARCHAR2(100);
1361 l_cost_id NUMBER;
1362 l_segment VARCHAR2(100);
1363 statem     varchar2(256);
1364 y varchar2(100);
1365 
1366 BEGIN
1367 
1368 OPEN c_get_cost_seg;
1369 FETCH c_get_cost_seg INTO l_cost_seg;
1370 CLOSE c_get_cost_seg;
1371 
1372 OPEN c_exp_cat_code(p_element_type_id);
1373 FETCH c_exp_cat_code INTO l_cost_id;
1374 CLOSE c_exp_cat_code;
1375 
1376 IF l_cost_seg IS NOT NULL AND l_cost_id IS NOT NULL THEN
1377 statem := 'select '||l_cost_seg||' FROM PAY_COST_ALLOCATION_KEYFLEX '||' where COST_ALLOCATION_KEYFLEX_ID = :l_cost ';
1378 
1379 EXECUTE immediate statem INTO y USING l_cost_id;
1380 END IF;
1381 
1382 RETURN y;
1383 
1384 END get_cost_alloc_key_flex;
1385 /****************************************************************************
1386     Name        : deinitialization_code
1387     Arguments   : 1. payroll_action_id
1388     Description : This procedure is called in last phase of archive process
1389                   where we spawn the CNAO Exception Listing report and
1390                   print the PDF listing all the employees who have NULL assignment
1391                   category
1392 *****************************************************************************/
1393 
1394  PROCEDURE deinitialization_code (p_pactid IN NUMBER)
1395   IS
1396 
1397 /* cursor to check if there are any assignments with null assignment category
1398    for a given payroll action id */
1399   CURSOR get_error is
1400   SELECT 1
1401     FROM pay_action_information
1402   WHERE action_context_id = p_pactid;
1403 
1404   l_count NUMBER;
1405   i NUMBER;
1406   l_set_layout BOOLEAN;
1407   ln_reqid_gle               NUMBER;
1408   ln_reqid_cvt               NUMBER;
1409   lv_cvt_req_status          VARCHAR2(100);
1410   l_file VARCHAR2(1000);
1411   ln_reqid_chg               NUMBER;
1412   lv_chg_req_status          VARCHAR2(100);
1413   lv_error_flag              VARCHAR2(1);
1414   lv_error_status           BOOLEAN;
1415   l_lang VARCHAR2(100);
1416 
1417   BEGIN
1418 
1419      IF g_debug THEN
1420          hr_utility.trace('Entering deinitialization_code procedure');
1421      END IF;
1422 
1423    OPEN get_error;
1424    FETCH get_error INTO l_count;
1425    CLOSE get_error;
1426 
1427     IF nvl(l_count,0) >0 THEN
1428 
1429        SELECT USERENV('LANG')
1430        into l_lang
1431        from dual;
1432 
1433        IF l_lang='US' THEN
1434            l_set_layout := fnd_request.add_layout('PAY','PYCNAOT','en','US','PDF');
1435        ELSE
1436            l_set_layout := fnd_request.add_layout('PAY','PYCNAOT','zh','CN','PDF');
1437        END IF;
1438 
1439            i := FND_REQUEST.SUBMIT_REQUEST ( APPLICATION          => 'PAY',
1440                                         PROGRAM              => 'PYCNAOESP',
1441                                         ARGUMENT1            =>  p_pactid);
1442     END IF;
1443 
1444     COMMIT;
1445 
1446       SELECT
1447         request_id
1448       INTO
1449         ln_reqid_gle
1450       FROM
1451         pay_payroll_actions
1452       WHERE payroll_action_id = p_pactid;
1453 
1454      IF g_opt_soe_or_min IS NULL OR g_opt_soe_or_min = 'ENT' THEN
1455         l_file := per_cn_shared_info.get_lookup_meaning('SOE_NAME','CN_AUDIT_DATA');
1456      ELSE
1457         l_file := per_cn_shared_info.get_lookup_meaning('PSM_NAME','CN_AUDIT_DATA');
1458      END IF;
1459 
1460      l_file := l_file || g_year || lpad(to_char(g_start_period),2,'0') || lpad(to_char(g_end_period),2,'0');
1461 
1462           --Submit characrter set conversion program
1463           --to convert charaterset of output file
1464           JA_CN_UTILITY.Submit_XML_Charset_Conversion(p_xml_request_id      => ln_reqid_gle
1465                                                      ,p_source_charset      => JA_CN_UTILITY.Get_XML_Encoding
1466                                                      ,p_destination_charset => g_char_set --'UTF-8'
1467                                                      ,p_source_separator    => NULL
1468                                                      ,x_charset_request_id  => ln_reqid_cvt
1469                                                      ,x_result_flag         => lv_cvt_req_status
1470                                                      );
1471           IF lv_cvt_req_status='Success'
1472           THEN
1473 
1474 
1475 		    JA_CN_UTILITY.Change_Output_Filename(p_xml_request_id       => ln_reqid_gle
1476 							,p_destination_charset  => g_char_set --'UTF-8'
1477 							,p_destination_filename => l_file||'.xml'
1478 							,x_filename_request_id  => ln_reqid_chg
1479 							,x_result_flag          => lv_chg_req_status
1480 							);
1481 		    IF lv_chg_req_status='Success'
1482 		    THEN
1483 			NULL;
1484 		    ELSIF  lv_chg_req_status='Warning'
1485 		    THEN
1486 		      lv_error_flag:='W';
1487 		    ELSIF  lv_chg_req_status='Error'
1488 		    THEN
1489 		      lv_error_flag:='E';
1490 		    END IF;
1491 
1492           ELSIF lv_cvt_req_status='Warning'
1493           THEN
1494             lv_error_flag:='W';
1495           ELSIF lv_cvt_req_status='Error'
1496           THEN
1497             lv_error_flag:='E';
1498           END IF;
1499 
1500   IF lv_error_flag='W'
1501   THEN
1502     lv_error_status:=FND_CONCURRENT.Set_Completion_Status( status => 'WARNING'
1503                                                          , message => ''
1504                                                          );
1505   ELSIF lv_error_flag='E'
1506   THEN
1507     lv_error_status:=FND_CONCURRENT.Set_Completion_Status( status => 'ERROR'
1508                                                          , message => ''
1509                                                          );
1510   END IF;  --lv_error_flag='W'
1511 
1512      IF g_debug THEN
1513          hr_utility.trace('Leaving deinitialization_code procedure');
1514      END IF;
1515 
1516 END;
1517 
1518 
1519 /****************************************************************************
1520     Name        : sort_action
1521     Arguments   : 1. payroll_action_id
1522                   2. sql_string for deciding the sort order of data.
1523                   3. length of the sql_string
1524     Description : This procedure sorts the individual xml's generated by
1525                   assact_xml procedure based on SERIAL_NUMBER column which
1526                   is populated with payroll year, payroll period and payroll id.
1527 *****************************************************************************/
1528 
1529 PROCEDURE sort_action
1530 (
1531     payactid IN VARCHAR2,       /* payroll action id */
1532     sqlstr IN OUT NOCOPY VARCHAR2,     /* string holding the sql statement */
1533     len OUT NOCOPY NUMBER              /* length of the sql string */
1534 ) IS
1535 l_chardate_start  VARCHAR2(255);
1536  l_chardate_end    VARCHAR2(255);
1537 BEGIN
1538 
1539  IF g_debug THEN
1540    hr_utility.trace('Entering sort action procedure');
1541  END IF;
1542 
1543  initialization_code(payactid);
1544 
1545 
1546 sqlstr := ' select paa.rowid
1547             from  pay_assignment_actions paa,
1548                  pay_payroll_actions ppa ,
1549                  per_people_f ppf,
1550                  pay_payrolls_f p
1551             where ppa.payroll_action_id = :pactid
1552             and paa.payroll_action_id = ppa.payroll_action_id
1553             AND '''||g_end_date||''' between p.effective_start_date and p.effective_end_date
1554             and '''||g_end_date||''' BETWEEN ppf.effective_start_date AND ppf.effective_end_date
1555             AND substr(paa.serial_number,7) = p.payroll_id
1556             and ppf.person_id = (select paf.person_id
1557                                   from per_assignments_f paf
1558                                   where paf.assignment_id = paa.assignment_id
1559                                  and rownum =1)
1560            order by to_number(substr(paa.serial_number,1,6)),p.payroll_name,ppf.employee_number
1561            for update of paa.assignment_id';
1562 
1563 len := length(sqlstr); -- return the length of the string.
1564 
1565  IF g_debug THEN
1566    hr_utility.trace('Leaving sort action procedure');
1567  END IF;
1568 
1569 END sort_action;
1570 
1571 BEGIN
1572 
1573     g_proc_name := 'pay_cn_audit_xmlgen.';
1574     g_debug := hr_utility.debug_enabled;
1575     g_document_type := 'CNAO_XML_FOR_SOE_AND_MINISTRY';
1576 
1577 END pay_cn_audit_xmlgen;