DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_PURGE

Source


1 Package body pa_purge as
2 /* $Header: PAXPRMNB.pls 120.4 2007/12/09 10:24:43 vvjoshi ship $ */
3 
4 -- Start of comments
5 -- API name         : Purge_Project
6 -- Type             : Private
7 -- Pre-reqs         : None
8 -- Function         : Invokes the procedure for purge for a specific project for the
9 --                    various modules ( Costing , billing ,Project tracking , capital
10 --                    projects) based on the option selection during the purge batch
11 --                    creation.
12 --                    In addition also invokes a client extension
13 --                    for any customer specific purge procedures
14 --
15 -- Parameters         p_batch_id			IN     NUMBER
16 --                              The purge batch id for which rows have
17 --                              to be purged/archived.
18 --		      p_project_Id			IN     NUMBER,
19 --                              The project id for which records have
20 --                              to be purged/archived.
21 --		      p_Active_Closed_Flag		IN     VARCHAR2,
22 --                              Indicates if batch contains ACTIVE or CLOSED projects
23 --                              ( 'A' - Active , 'C' - Closed)
24 --		      p_Purge_Release                   IN     VARCHAR2,
25 --                              Oracle Projects release (10.7 , 11.0)
26 --		      p_Purge_Summary_Flag		IN     VARCHAR2,
27 --                              Purge Summary tables data
28 --		      p_Purge_Capital_Flag		IN     VARCHAR2,
29 --                              Purge Capital projects tables data
30 --		      p_Purge_Budgets_Flag		IN     VARCHAR2,
31 --                              Purge Budget tables data
32 --		      p_Purge_Actuals_Flag		IN     VARCHAR2,
33 --                              Purge Actuals tables data i.e. Costing and Billing tables
34 --		      p_Archive_Summary_Flag		IN     VARCHAR2,
35 --                              Archive Summary tables data
36 --		      p_Archive_Capital_Flag 		IN     VARCHAR2,
37 --                              Purge Capital projects tables data
38 --		      p_Archive_Budgets_Flag		IN     VARCHAR2,
39 --                              Archive Budget tables data
40 --		      p_Archive_Actuals_Flag 	 	IN     VARCHAR2,
41 --                              Archive Actuals tables data i.e. Costing and Billing tables
42 --		      p_Txn_To_Date			IN     DATE,
43 --                              Date on or before which all transactions are to be purged
44 --                              (Will be used by Costing only)
45 --		      p_Commit_Size			IN     NUMBER,
46 --                              The commit size
47 --		      X_Err_Stack			IN OUT VARCHAR2,
48 --                              Error stack
49 --		      X_Err_Stage		        IN OUT VARCHAR2,
50 --                              Stage in the procedure where error occurred
51 --		      X_Err_Code		        IN OUT NUMBER
52 --                              Error code returned from the procedure
53 --                              = 0 SUCCESS
54 --                              > 0 Application error
55 --                              < 0 Oracle error
56 -- End of comments
57  Procedure Purge_Project(
58 		p_batch_id			IN     NUMBER,
59 		p_project_Id			IN     NUMBER,
60 		p_Active_Closed_Flag		IN     VARCHAR2,
61 		p_Purge_Release                 IN     VARCHAR2,
62 		p_Purge_Summary_Flag		IN     VARCHAR2,
63 		p_Purge_Capital_Flag		IN     VARCHAR2,
64 		p_Purge_Budgets_Flag		IN     VARCHAR2,
65 		p_Purge_Actuals_Flag		IN     VARCHAR2,
66 		p_Archive_Summary_Flag		IN     VARCHAR2,
67 		p_Archive_Capital_Flag 		IN     VARCHAR2,
68 		p_Archive_Budgets_Flag		IN     VARCHAR2,
69 		p_Archive_Actuals_Flag 	 	IN     VARCHAR2,
70 		p_Txn_To_Date			IN     DATE,
71 		p_Commit_Size			IN     NUMBER,
72 		X_Err_Stack			IN OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
73 		X_Err_Stage		        IN OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
74 		X_Err_Code		        IN OUT NOCOPY NUMBER) is --File.Sql.39 bug 4440895
75 
76  l_old_err_stack VARCHAR2(2000); -- Bug 4227589. Changed size from 1024 to 2000
77  l_project_status_code VARCHAR2(30);
78  l_project_type_class   pa_project_types_all.project_type_class_code%TYPE; -- Added for bug 3583748
79  begin
80     l_old_err_stack := X_err_stack;
81     X_err_stack := X_err_stack ||'->pa_purge.purge_project';
82     X_err_stack := X_err_stack ||'Batch Id: '||p_batch_id || 'Project Id: '||p_project_id ;
83     X_err_code  := 0;
84 
85     pa_debug.debug(X_err_stack);
86 
87    -- Call user defined extension to purge customer specific tables
88     pa_debug.debug('--Calling client extension procedure');
89     pa_purge_extn.pa_purge_client_extn(
90 		       	     p_purge_batch_id        => p_batch_id,
91                              p_project_id            => p_project_id,
92                              p_purge_release         => p_purge_release,
93                              p_txn_through_date      => p_txn_to_date,
94                              p_archive_flag          => p_archive_actuals_flag,
95                              p_calling_place         => 'BEFORE_PURGE',
96 		             p_Commit_Size           => p_Commit_Size,
97                              X_Err_Stack             => X_Err_Stack,
98                              X_Err_Stage             => X_Err_Stage,
99                              X_Err_Code              => X_Err_Code);
100 
101 
102  -- Call the procedures conditionally based on the various flag values
103  --
104    -- If summarization need to be purged and project is closed then call
105    -- main summarization purge procedure
106    --
107 
108    IF P_purge_summary_flag = 'Y'  THEN
109      if P_active_closed_flag =  'C' then
110        pa_debug.debug('--Calling procedure pa_purge_summary.pa_summary_main_purge');
111        pa_purge_summary.pa_summary_main_purge (
112    			     p_purge_batch_id        => p_batch_id,
113                              p_project_id            => p_project_id,
114                              p_purge_release         => p_purge_release,
115                              p_txn_to_date           => p_txn_to_date,
116                              p_archive_flag          => p_archive_summary_flag,
117 		             p_Commit_Size           => p_Commit_Size,
118                              X_Err_Stack             => X_Err_Stack,
119                              X_Err_Stage             => X_Err_Stage,
120                              X_Err_Code              => X_Err_Code);
121      end if ;
122    END IF;
123 
124    -- If budgets need to be purged and project is closed then call
125    -- main budgets purge procedure
126    --
127   /***
128    IF P_purge_budgets_flag = 'Y' THEN
129      if P_active_closed_flag =  'C' then
130        pa_debug.debug('--Calling procedure pa_purge_budget.pa_budget_main_purge');
131        pa_purge_budget.pa_budget_main_purge (
132 			     p_batch_id,
133                              p_project_id,
134                              p_purge_release,
135                              p_txn_to_date,
136                              p_archive_budgets_flag,
137 		             p_Commit_Size,
138                              X_Err_Stack,
139                              X_Err_Stage,
140                              X_Err_Code);
141 
142      end if ;
143    END IF;
144  **/
145     -- If capital tables need to be purged and project is closed then call
146     -- the main capital purge procedure
147     --
148 
149     IF  P_purge_capital_flag = 'Y' THEN
150      if  P_active_closed_flag  = 'C' then
151       pa_debug.debug('--Calling procedure pa_purge_capital.pa_capital_main_purge');
152       pa_purge_capital.pa_capital_main_purge   (
153    			     p_purge_batch_id        => p_batch_id,
154                              p_project_id            => p_project_id,
155                              p_purge_release         => p_purge_release,
156                              p_txn_to_date           => p_txn_to_date,
157                              p_archive_flag          => p_archive_capital_flag,
158 		             p_Commit_Size           => p_Commit_Size,
159                              p_Err_Stack             => X_Err_Stack,
160                              p_Err_Stage             => X_Err_Stage,
161                              p_Err_Code              => X_Err_Code);
162       end if ;
163     END IF;
164 
165 
166 
167     IF p_purge_actuals_flag = 'Y'	 THEN
168 
169    -- Billing purge procedure to be called only in case of 'CLOSED' projects
170    --
171    -- Added for bug 3583748
172       select project_type_class_code
173         into l_project_type_class
174         from pa_project_types_all ppt
175             ,pa_projects_all  ppa
176        where ppt.project_type = ppa.project_type
177          and ppt.org_id = ppa.org_id /* added for Bug 5099516*/ -- Removed NVL for bug#5908179 by vvjoshi
178          and project_id = p_project_id;
179 
180        If p_active_closed_flag = 'C'
181         and l_project_type_class = 'CONTRACT' Then  --  added for bug 3583748
182           pa_debug.debug('--Calling procedure pa_purge_billing.pa_billing_main_purge ');
183           pa_purge_billing.pa_billing_main_purge    (
184 			     p_purge_batch_id        => p_batch_id,
185                              p_project_id            => p_project_id,
186                              p_purge_release         => p_purge_release,
187                              p_txn_to_date           => p_txn_to_date,
188                              p_archive_flag          => p_archive_actuals_flag,
189 		             p_Commit_Size           => p_Commit_Size,
190                              X_Err_Stack             => X_Err_Stack,
191                              X_Err_Stage             => X_Err_Stage,
192                              X_Err_Code              => X_Err_Code);
193        end if ;
194 
195 /* Bug#2416385 Code added for the Phase III of Archive and Purge, starts here */
196 
197     -- Call the Intercomapany and Interproject Billing purge procedure
198     --
199        pa_debug.debug('--Calling procedure pa_purge_icip.PA_DraftInvDetails');
200        pa_purge_icip.PA_DraftInvDetails (
201                              p_purge_batch_id        => p_batch_id,
202                              p_project_id            => p_project_id,
203                              p_purge_release         => p_purge_release,
204                              p_txn_to_date           => p_txn_to_date,
205                              p_archive_flag          => p_archive_actuals_flag,
206                              p_Commit_Size           => p_Commit_Size,
207                              X_Err_Stack             => X_Err_Stack,
208                              X_Err_Stage             => X_Err_Stage,
209                              X_Err_Code              => X_Err_Code);
210 
211 /* Bug#2441479 Code added for the PJR  Archive and Purge, starts here */
212 
213        pa_debug.debug('--Calling procedure PA_PURGE_PJR_TXNS.PA_REQUIREMENTS_PURGE');
214        pa_purge_pjr_txns.pa_requirements_purge (
215                              p_purge_batch_id        => p_batch_id,
216                              p_project_id            => p_project_id,
217                              p_purge_release         => p_purge_release,
218                              p_txn_to_date           => p_txn_to_date,
219                              p_archive_flag          => p_archive_actuals_flag,
220                              p_Commit_Size           => p_Commit_Size,
221                              X_Err_Stack             => X_Err_Stack,
222                              X_Err_Stage             => X_Err_Stage,
223                              X_Err_Code              => X_Err_Code);
224 
225        pa_debug.debug('--Calling procedure PA_PURGE_PJR_TXNS.PA_ASSIGNMENTS_PURGE');
226        pa_purge_pjr_txns.pa_assignments_purge (
227                              p_purge_batch_id        => p_batch_id,
228                              p_project_id            => p_project_id,
229                              p_purge_release         => p_purge_release,
230                              p_txn_to_date           => p_txn_to_date,
231                              p_archive_flag          => p_archive_actuals_flag,
232                              p_Commit_Size           => p_Commit_Size,
233                              X_Err_Stack             => X_Err_Stack,
237 
234                              X_Err_Stage             => X_Err_Stage,
235                              X_Err_Code              => X_Err_Code);
236 
238 /* Bug#2416385 Code added for the Phase III of Archive and Purge, ends here */
239 
240     -- Call the main costing purge procedure
241     --
242        pa_debug.debug('--Calling procedure pa_purge_costing.pa_costing_main_purge');
243        pa_purge_costing.pa_costing_main_purge (
244 			     p_purge_batch_id        => p_batch_id,
245                              p_project_id            => p_project_id,
246                              p_purge_release         => p_purge_release,
247                              p_txn_to_date           => p_txn_to_date,
248                              p_archive_flag          => p_archive_actuals_flag,
249 		             p_Commit_Size           => p_Commit_Size,
250                              X_Err_Stack             => X_Err_Stack,
251                              X_Err_Stage             => X_Err_Stage,
252                              X_Err_Code              => X_Err_Code);
253 
254     END IF;
255 
256    -- Call user defined extension to purge customer specific tables after the
257    -- main tables are purged
258     pa_debug.debug('--Calling client extension procedure');
259     pa_purge_extn.pa_purge_client_extn(
260 		       	     p_purge_batch_id        => p_batch_id,
261                              p_project_id            => p_project_id,
262                              p_purge_release         => p_purge_release,
263                              p_txn_through_date      => p_txn_to_date,
264                              p_archive_flag          => p_archive_actuals_flag,
265                              p_calling_place         => 'AFTER_PURGE',
266 		             p_Commit_Size           => p_Commit_Size,
267                              X_Err_Stack             => X_Err_Stack,
268                              X_Err_Stage             => X_Err_Stage,
269                              X_Err_Code              => X_Err_Code);
270 
271 
272     -- Set completed status for the project
273     pa_debug.debug('--Before update of pa_purge_projects batch id :
274                    '|| p_batch_id || ' project id : '|| p_project_id);
275 
276     update pa_purge_projects
277     set
278         purged_date=sysdate
279        ,last_update_date=sysdate
280        ,last_updated_by=fnd_global.user_id
281        ,last_update_login=fnd_global.login_id
282        ,program_id = fnd_global.conc_program_id
283        ,program_application_id = fnd_global.prog_appl_id
284        ,request_id = fnd_global.conc_request_id
285        ,program_update_date = sysdate
286     where purge_batch_id = p_batch_id
287     and project_id = p_project_id;
288 
289     commit;
290 
291     pa_debug.debug('--After update of pa_purge_projects batch id :
292                    '|| p_batch_id || ' project id : '|| p_project_id);
293 
294    -- For closed projects set the project status to fully purged or partially purged
295    -- For active projects set the project status code to old project status code
296 
297    pa_debug.debug('--Before update of pa_projects_all batch id :
298                    '|| p_batch_id || ' project id : '|| p_project_id);
299 
300 
301    l_project_status_code := pa_purge.get_post_purge_status(p_project_id,p_batch_id);
302 
303    update pa_projects_all
304    set project_status_code = l_project_status_code
305    where project_id = p_project_id;
306    commit;
307    pa_debug.debug('--After update of pa_projects_all batch id :
308                    '|| p_batch_id || ' project id : '|| p_project_id);
309 
310    X_err_stack := l_old_err_stack;
311 
312  Exception
313   WHEN PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error then
314        RAISE PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error ;
315 
316   WHEN OTHERS THEN
317     pa_debug.debug('Error Procedure Name  := PA_PURGE.PURGE_PROJECT' );
318     pa_debug.debug('Error stage is '||x_err_stage );
319     pa_debug.debug('Error stack is '||x_err_stack );
320     pa_debug.debug(SQLERRM);
321     PA_PROJECT_UTILS2.g_sqlerrm := SQLERRM ;
322 
323     RAISE PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error ;
324 
325  End purge_project;
326 
327 -- Start of comments
328 -- API name         : Purge
329 -- Type             : Public
330 -- Pre-reqs         : None
331 -- Function         : This procedure is called from the form.
332 --                    Main purge procedure.
333 --                    Invokes the purge_project procedure for each project
334 --                    in the purge batch
335 -- Parameters         p_batch_id			IN     NUMBER
336 --                              The purge batch id for which rows have
337 --                              to be purged/archived.
338 --		      p_Commit_Size			IN     NUMBER,
339 --                              The commit size
340 --		      errbuf 			        IN OUT VARCHAR2,
341 --                              error buffer containing the SQLERRM
342 --		      retcode 		                IN OUT NUMBER
343 --                              Standard error code returned from the procedure
344 --                              = 0 SUCCESS
345 --                              < 0 Oracle error
346 -- End of comments
347 Procedure Purge (
348 		p_Batch_Id		IN     NUMBER ,
349 		p_Commit_Size		IN     NUMBER ,
350                 ret_code                IN OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
351                 errbuf                  IN OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
355     l_err_stack     VARCHAR2(2000);
352 
353     l_active_closed_flag VARCHAR2(1);
354     l_purge_release VARCHAR2(30);
356     l_err_stage     VARCHAR2(2000);
357     l_err_code      NUMBER;
358     l_project_id    NUMBER;
359     COUNT_MRC_SET_OF_BOOKS NUMBER;
360 
361  Begin
362 
363     l_err_stack  := '->pa_purge.purge';
364     l_err_code   := 0;
365     l_err_stage  := 'Purge for batch_id: ' || to_char(p_batch_id);
366     l_project_id := -9999;
367 
368     pa_debug.debug(l_err_stage);
369 
370     -- Count MRC reporting set of books
371     -- and set ARPUR_MRC_COMMIT_SIZE.
372 
373     PA_UTILS2.ARPUR_Commit_Size     := p_commit_size;
374     PA_UTILS2.ARPUR_MRC_Commit_Size := p_commit_size;
375 
376     SELECT count(*)
377         INTO   COUNT_MRC_SET_OF_BOOKS
378         FROM   pa_implementations pi, gl_alc_ledger_rships_v gal --gl_mc_reporting_options glm. Bug 4468366.
379         WHERE  (gal.org_id = -99 OR pi.org_id = gal.org_id) --pi.org_id = glm.org_id. Bug 4468366.
380         AND    gal.relationship_enabled_flag = 'Y' --glm.enabled_flag = 'Y'. Bug 4468366.
381         AND    gal.application_id = 275; --glm.application_Id = 275; Bug 4468366.
382    PA_UTILS2.ARPUR_MRC_Commit_Size := PA_UTILS2.ARPUR_Commit_size/(1+COUNT_MRC_SET_OF_BOOKS);
383    pa_debug.debug('Calculate ARPUR_Commit_Size and ARPUR_MRC_Commit_Size');
384 
385 
386     -- Set working status for the batch
387     pa_debug.debug('Before update of pa_purge_batches to pending');
388     Update pa_purge_batches
389     Set batch_status_code='P' ,
390         request_id = fnd_global.conc_request_id
391     Where purge_batch_id = p_batch_id;
392 
393     Commit;
394     pa_debug.debug('After update of pa_purge_batches to pending');
395 
396     -- Lock the batch row
397     pa_debug.debug('Before locking table pa_purge_batches');
398     Select  active_closed_flag , purge_release
399     Into  l_active_closed_flag , l_purge_release
400     From pa_purge_batches
401     Where purge_batch_id = p_batch_id
402     and   request_id = fnd_global.conc_request_id
403     For update;
404 
405     pa_debug.debug('After locking table pa_purge_batches');
406 
407     -- Select the projects in the batch that have not been purged
408     -- (Purged date is Null)
409 
410     pa_debug.debug('Before FOR loop');
411   For pp_rec In
412  (
413   Select
414              project_id,
415 	     purge_summary_flag,
416 	     purge_capital_flag,
417 	     purge_budgets_flag,
418              purge_actuals_flag,
419 	     archive_summary_flag,
420              archive_capital_flag,
421 	     archive_budgets_flag,
422              archive_actuals_flag,
423              txn_to_date,
424              last_project_status_code,
425              next_pp_project_status_code,
426              next_p_project_status_code
427      From pa_purge_projects
428      Where purge_batch_id = p_Batch_Id
429      And purged_date is NULL
430      Order By project_id
431  )
432   Loop
433 
434      l_project_id  :=  pp_rec.project_id ;
435 
436   -- For each project call procedure to purge
437      pa_debug.debug('Calling pa_purge.purge_project with project_id : '||pp_rec.project_id);
438            pa_purge.purge_project(
439 		p_batch_id                     => p_batch_id,
440                 p_project_id                   => pp_rec.project_id,
441                 p_active_closed_flag           => l_active_closed_flag,
442                 p_purge_release                => l_purge_release,
443 		p_purge_summary_flag           => pp_rec.purge_summary_flag,
444                 p_purge_capital_flag           => pp_rec.purge_capital_flag,
445 		p_purge_budgets_flag           => pp_rec.purge_budgets_flag,
446                 p_purge_actuals_flag           => pp_rec.purge_actuals_flag,
447 		p_archive_summary_flag         => pp_rec.archive_summary_flag,
448                 p_archive_capital_flag         => pp_rec.archive_capital_flag,
449 		p_archive_budgets_flag         => pp_rec.archive_budgets_flag,
450                 p_archive_actuals_flag         => pp_rec.archive_actuals_flag,
451 		p_txn_to_date                  => pp_rec.txn_to_date,
452                 p_Commit_Size                  => p_commit_size,
453 		X_Err_Stack                    => l_Err_Stack,
454                 X_Err_Stage                    => l_Err_Stage,
455                 X_Err_Code                     => l_Err_Code);
456 
457   End Loop;
458 
459     -- The following three procedure calls purges pa_routings, pa_expenditures_all
460     -- and pa-expenditure_history. It was originally in the call for costing
461     -- tables purge. But there it will be called for every project. Here it is called
462     -- after purging all the other tables for all the projects. So it will be called
463     -- only once.
464 
465     -- Purging of PA_EXPENDITURES_ALL and PA_ROUTINGS are removed for the time being. It
466     -- will be done at a later point of time
467 /*
468     pa_debug.debug('*-> About to purge expenditures ');
469     l_err_stage := 'About to purge expenditures without any expenditure items ';
470     pa_purge_costing.PA_Expenditures1(p_purge_batch_id   => p_batch_id,
471                                      p_project_id       => l_project_id,
472                                      p_purge_release    => l_purge_release,
473                                      p_archive_flag     => 'Y',
477                                      x_err_stage        => l_err_stage
474                                      p_commit_size      => p_commit_size,
475                                      x_err_code         => l_err_code,
476                                      x_err_stack        => l_err_stack,
478                                     ) ;
479 
480     pa_debug.debug('*-> About to purge routings ');
481     l_err_stage := 'About to purge routing records ';
482     pa_purge_costing.PA_Routings1(p_purge_batch_id   => p_batch_id,
483                                  p_project_id       => l_project_id,
484                                  p_purge_release    => l_purge_release,
485                                  p_archive_flag     => 'Y',
486                                  p_commit_size      => p_commit_size,
487                                  x_err_code         => l_err_code,
488                                  x_err_stack        => l_err_stack,
489                                  x_err_stage        => l_err_stage
490                                 ) ;
491 
492 */
493     -- Set completed status for the batch
494     pa_debug.debug('Before update of pa_purge_batches to complete ');
495     Update pa_purge_batches
496     Set batch_status_code='C'
497        ,purged_date=sysdate
498        ,last_update_date=sysdate
499        ,last_updated_by=fnd_global.user_id
500        ,last_update_login=fnd_global.login_id
501     Where purge_batch_id = p_batch_id;
502 
503     Commit;
504     pa_debug.debug('After update of pa_purge_batches to complete');
505 
506 
507  Exception
508 
509   WHEN PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error THEN
510         errbuf := PA_PROJECT_UTILS2.g_sqlerrm ;
511         ret_code := -1 ;
512   WHEN OTHERS THEN
513     errbuf := SQLERRM ;
514     ret_code := -1 ;
515 
516  End purge;
517 
518 -- Start of comments
519 -- API name         : CommitProcess
520 -- Type             : Public
521 -- Pre-reqs         : None
522 -- Function         : Common procedure for commit.
523 --                    Will be invoked from the various purge procedures
524 --
525 -- Parameters         p_batch_id			IN     NUMBER
526 --                              The purge batch id for which rows have
527 --                              been purged/archived.
528 --		      p_project_Id			IN     NUMBER,
529 --                              The project id for which records have
530 --                              been purged/archived.
531 --                    p_table_name		        IN VARCHAR2,
532 --                              The table for which rows have been purged
533 --                    p_NoOfRecordsIns                  IN NUMBER,
534 --                              No. of records inserted into the archive table
535 --                    p_NoOfRecordsDel                  IN NUMBER,
536 --                              No. of records deleted from table
537 -- 		      X_Err_Stack			IN OUT VARCHAR2,
538 --                              Error stack
539 --		      X_Err_Stage		        IN OUT VARCHAR2,
540 --                              Stage in the procedure where error occurred
541 --		      X_Err_Code		        IN OUT NUMBER,
542 --                              Error code returned from the procedure
543 --                              = 0 SUCCESS
544 --                              > 0 Application error
545 --                              < 0 Oracle error
546 --                    p_MRC_table_name                      IN VARCHAR2,
547 --                              The MRC table for which rows have been purged
548 --                    p_MRC_NoOfRecordsIns                  IN NUMBER,
549 --                              No. of records inserted into the MRC archive table
550 --                    p_MRC_NoOfRecordsDel                  IN NUMBER
551 --                              No. of records deleted from MRC table
552 -- End of comments
553  Procedure  CommitProcess(p_purge_batch_id              IN NUMBER,
554                           p_project_id                  IN NUMBER,
555                           p_table_name		        IN VARCHAR2,
556                           p_NoOfRecordsIns              IN NUMBER,
557                           p_NoOfRecordsDel              IN NUMBER,
558                           x_err_code                    IN OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
559                           x_err_stack                   IN OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
560                           x_err_stage                   IN OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
561                           p_MRC_table_name              IN VARCHAR2  DEFAULT NULL,
562                           p_MRC_NoOfRecordsIns          IN NUMBER    DEFAULT NULL,
563                           p_MRC_NoOfRecordsDel          IN NUMBER    DEFAULT NULL
564                           ) Is
565 
566  l_old_err_stack VARCHAR2(2000);  -- Increased the size from 1024 to 2000. Bug 4104182.
567  l_dummy VARCHAR2(1);
568  Begin
569 
570     l_old_err_stack := x_err_stack;
571 
572     X_err_stack := X_err_stack ||'->pa_purge.CommitProcess';
573     X_err_stack := X_err_stack ||'Batch Id: '||p_purge_batch_id || 'Project Id: '||p_project_id ;
574 
575     pa_debug.debug(X_err_stack);
576 
577     -- update the pa_project_details with statistics
578     pa_debug.debug('Before update of pa_project_details' );
579 
580       Update PA_PURGE_PRJ_DETAILS
581       Set    num_recs_purged   = nvl(num_recs_purged,0) + nvl(p_NoOfRecordsDel,0)
582             ,num_recs_archived = nvl(num_recs_archived,0) + nvl(p_NoOfRecordsIns,0)
586             ,program_id = fnd_global.conc_program_id
583             ,last_update_date=sysdate
584             ,last_updated_by=fnd_global.user_id
585             ,last_update_login=fnd_global.login_id
587             ,program_application_id = fnd_global.prog_appl_id
588             ,request_id = fnd_global.conc_request_id
589             ,program_update_date = sysdate
590       Where purge_batch_id = p_purge_batch_id
591       And   project_id     = p_project_id
592       And   Table_name     = p_table_name;
593 
594     pa_debug.debug('After update of pa_project_details' );
595    -- If row doesnt exist then insert new row with statistics
596    --
597       IF SQL%Rowcount = 0 Then
598 
599       pa_debug.debug('Before insert into pa_project_details' );
600          Insert into PA_PURGE_PRJ_DETAILS
601          (
602           purge_batch_id,
603           project_id,
604           table_name,
605 	  num_recs_purged,
606           num_recs_archived,
607           created_by,
608           last_update_date,
609           last_updated_by,
610           last_update_login,
611           creation_date,
612           program_id,
613           program_application_id,
614           request_id,
615           program_update_date
616          )
617          values
618          (
619 	  p_purge_batch_id,
620 	  p_project_id,
621           p_table_name,
622           p_NoOfRecordsDel,
623           p_NoOfRecordsIns,
624           fnd_global.user_id,
625 	  sysdate,
626           fnd_global.user_id,
627           fnd_global.user_id,
628           sysdate,
629           fnd_global.conc_program_id,
630           fnd_global.prog_appl_id,
631           fnd_global.conc_request_id,
632           sysdate
633 	 );
634 
635      pa_debug.debug('After insert into pa_project_details' );
636      END IF;
637 
638      IF p_MRC_table_name is not null then
639          X_err_stack := X_err_stack ||'->pa_purge.CommitProcess';
640          X_err_stack := X_err_stack ||'Batch Id: '||p_purge_batch_id || 'Project Id: '||
641                         p_project_id || 'MRC details' ;
642 
643          pa_debug.debug(X_err_stack);
644 
645          -- update the pa_project_details with MRC statistics
646          pa_debug.debug('Before update of pa_project_details for MRC' );
647 
648          Update PA_PURGE_PRJ_DETAILS
649          Set    num_recs_purged   = nvl(num_recs_purged,0) + nvl(p_MRC_NoOfRecordsDel,0)
650                 ,num_recs_archived = nvl(num_recs_archived,0) + nvl(p_MRC_NoOfRecordsIns,0)
651                 ,last_update_date=sysdate
652                 ,last_updated_by=fnd_global.user_id
653                 ,last_update_login=fnd_global.login_id
654                 ,program_id = fnd_global.conc_program_id
655                 ,program_application_id = fnd_global.prog_appl_id
656                 ,request_id = fnd_global.conc_request_id
657                 ,program_update_date = sysdate
658           Where purge_batch_id = p_purge_batch_id
659           And   project_id     = p_project_id
660           And   Table_name     = p_MRC_table_name;
661 
662           pa_debug.debug('After MRC update of pa_project_details' );
663           -- If row doesnt exist then insert new row with statistics
664           --
665           IF SQL%Rowcount = 0 Then
666 
667               pa_debug.debug('Before insert MRC into pa_project_details' );
668               Insert into PA_PURGE_PRJ_DETAILS
669               (
670               purge_batch_id,
671               project_id,
672               table_name,
673               num_recs_purged,
674               num_recs_archived,
675               created_by,
676               last_update_date,
677               last_updated_by,
678               last_update_login,
679               creation_date,
680               program_id,
681               program_application_id,
682               request_id,
683               program_update_date
684               )
685               values
686               (
687               p_purge_batch_id,
688               p_project_id,
689               p_MRC_table_name,
690               p_MRC_NoOfRecordsDel,
691               p_MRC_NoOfRecordsIns,
692               fnd_global.user_id,
693               sysdate,
694               fnd_global.user_id,
695               fnd_global.user_id,
696               sysdate,
697               fnd_global.conc_program_id,
698               fnd_global.prog_appl_id,
699               fnd_global.conc_request_id,
700               sysdate
701               );
702 
703           pa_debug.debug('After insert MRC into pa_project_details' );
704           END IF;
705       END IF;
706 
707      commit;
708 
709      -- Get the lock again after commit
710      --
711 /* Added the condition for the bug#2510609 */
712    if p_table_name not in ('PA_FORECAST_ITEMS', 'PA_FORECAST_ITEM_DETAILS', 'PA_FI_AMOUNT_DETAILS') then
713 
714      pa_debug.debug('Before locking pa_purge_batches again');
715 
716      Select  'x'
717      Into l_dummy
718      From pa_purge_batches
719      Where purge_batch_id = p_purge_batch_id
720      and request_id = fnd_global.conc_request_id
721      For update;
722 
723      pa_debug.debug('After locking pa_purge_batches again');
724 
725    end if;
726 
730   WHEN PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error then
727   x_err_stack := l_old_err_stack;
728 
729   Exception
731        RAISE PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error ;
732 
733   WHEN OTHERS THEN
734     pa_debug.debug('Error Procedure Name  := PA_PURGE.CommitProcess' );
735     pa_debug.debug('Error stage is '||x_err_stage );
736     pa_debug.debug('Error stack is '||x_err_stack );
737     pa_debug.debug(SQLERRM);
738     PA_PROJECT_UTILS2.g_sqlerrm := SQLERRM ;
739 
740     RAISE PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error ;
741  end CommitProcess;
742 
743 -- Start of comments
744 -- API name         : get_post_purge_status
745 -- Type             : Private
746 -- Pre-reqs         : None
747 -- Function         : This function checks if the project is fully purged or
748 --                    partially purged for close projects and returns
749 --                    Returns the project status code ' Fully_Purged' or 'Partially_Purged'
750 --                    For active projects returns the old project status code
751 -- Parameters
752 --		      p_project_Id			IN     NUMBER,
753 --                              The project id for which purge status is to be determined
754 --                    p_batch_id                        IN     NUMBER,
755 --                              The purge batch id
756 -- End of comments
757  Function get_post_purge_status ( p_project_id IN NUMBER, p_batch_id IN NUMBER)
758                                 Return VARCHAR2 IS
759 
760   l_purge_actuals_flag VARCHAR2(1);
761   l_purge_capital_flag VARCHAR2(1);
762   l_purge_budgets_flag VARCHAR2(1);
763   l_purge_summary_flag VARCHAR2(1);
764   l_active_closed_flag VARCHAR2(1);
765 
766 /*  Changed the data length of l_next_p_project_status_code and l_next_pp_project_status_code to 90 for UTF8.
767   l_last_project_status_code VARCHAR2(30);
768 */
769   l_last_project_status_code pa_purge_projects.Last_project_status_code%TYPE;
770   l_project_type_class_code VARCHAR2(30);
771 
772 
773  CURSOR next_p_pp_status IS
774     SELECT next_p_project_status_code, next_pp_project_status_code
775     FROM   pa_purge_projects
776     WHERE  purge_batch_id = p_batch_id
777     AND    project_id = p_project_id;
778 
779 /*  Changed the data length of l_next_p_project_status_code and l_next_pp_project_status_code to 90 for UTF8.
780  l_next_p_project_status_code  VARCHAR2(30);
781  l_next_pp_project_status_code VARCHAR2(30);
782  */
783 
784  l_next_p_project_status_code  pa_purge_projects.next_p_project_status_code%TYPE;
785  l_next_pp_project_status_code pa_purge_projects.next_pp_project_status_code%TYPE;
786 
787 BEGIN
788 
789   pa_debug.debug(' In function get_post_purge_status ');
790 
791   Select active_closed_flag
792   into   l_active_closed_flag
793   from   pa_purge_batches
794   where  purge_batch_id = p_batch_id;
795 
796   IF  l_active_closed_flag = 'C'         THEN
797   -- Select MAX of the flags for all rows of the project
798   -- across all the purge batches that have been processed
799   -- If the all the flags are 'Y' then the status is 'PURGED'
800   -- else 'PARTIALLY_PURGED'
801   --
802 	  Select MAX(purge_actuals_flag),
803 	         MAX(purge_capital_flag),
804 	         MAX(purge_budgets_flag),
805 	         MAX(purge_summary_flag)
806 	  Into   l_purge_actuals_flag,
807 	         l_purge_capital_flag,
808 		 l_purge_budgets_flag,
809 	         l_purge_summary_flag
810 	  From   pa_purge_projects
811 	  Where  project_id = p_project_id
812 	  And    purged_date is not null;
813 
814           OPEN next_p_pp_status;
815           FETCH next_p_pp_status into l_next_p_project_status_code,
816                                     l_next_pp_project_status_code;
817           CLOSE next_p_pp_status;
818 
819 -- Here if the Project is not a Capital Project then "purge_capital_flag" On pa_purge_projects
820 -- Will not be Y and will return the status as 'PARTIALLY PURGED' as there is no question
821 -- of purging any capital data for non capital project. So is project is NON CAPITAL then
822 -- traeting this as it has been purged for capital data completely.
823 
824           Select  pt.project_type_class_code
825           into    l_project_type_class_code
826           From    pa_projects_all p, pa_project_types_all pt
827           where   p.project_type = pt.project_type
828           and     p.org_id = pt.org_id -- Removed NVL for bug#5908179 by vvjoshi
829           and     p.project_id = p_project_id;
830 
831           IF l_project_type_class_code <> 'CAPITAL' THEN
832              l_purge_capital_flag := 'Y';
833           END IF;
834 
835 	  If    (l_purge_actuals_flag = 'N'
836 	     OR l_purge_capital_flag = 'N'
837 	     OR l_purge_summary_flag = 'N') THEN
838 
839              Return(l_next_pp_project_status_code);
840 
841 	  Else
842 
843              Return(l_next_p_project_status_code);
844 
845 
846 	  End if;
847  ELSE
848 	Select LAST_PROJECT_STATUS_CODE
849 	Into   l_last_project_status_code
850         From   pa_purge_projects
851         Where  project_id = p_project_id
852         And    purge_batch_id   = p_batch_id;
853 
854         Return (l_last_project_status_code);
855 
856  END IF;
857 
858  exception
859   WHEN PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error then
860        RAISE PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error ;
861 
862   WHEN OTHERS THEN
863     pa_debug.debug('Error functio Name  := PA_PURGE.get_post_purge_status ' );
864     pa_debug.debug(SQLERRM);
865     PA_PROJECT_UTILS2.g_sqlerrm := SQLERRM ;
866 
867     RAISE PA_PROJECT_UTILS2.PA_Arch_Pur_Subroutine_Error ;
868 
869  end get_post_purge_status ;
870 
871 end pa_purge ; /*Package Body*/