DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_RBS_VERSIONS_PUB

Source


1 package body Pa_Rbs_Versions_Pub as
2 --$Header: PARBSVPB.pls 120.0 2005/06/03 13:50:35 appldev noship $
3 
4 g_module_name   VARCHAR2(100) := 'pa.plsql.Freeze_Working_Version';
5 
6 -- =======================================================================
7 -- Start of Comments
8 -- API Name      : Update_Working_Version
9 -- Type          : Public
10 -- Pre-Reqs      : None
11 -- Type          : Procedure
12 -- Function      : This procedure allows for the update of the current working version for a rbs header.
13 --
14 --  Parameters:
15 --
16 --  IN
17 --      P_Commit                - Varchar2 Default Fnd_Api.G_False
18 --      P_Init_Msg_List         - Varchar2 Default Fnd_Api.G_True
19 --      P_Api_Version_Number    - Number
20 --      P_RBS_Version_Id        - Number
21 --      P_Name                  - Varchar2(240)
22 --      P_Description           - Varchar2(2000)
23 --      P_Version_Start_Date    - Date
24 --      P_Job_Group_Id          - Number
25 --      P_Record_Version_Number - Number
26 --      P_Init_Debugging_Flag   - Varchar2 Default 'Y'
27 --  OUT
28 --      X_Record_Version_Number - Number
29 --      X_Return_Status         - Varchar2(1)
30 --      X_Msg_Count             - Number
31 --      X_Error_Msg_Data        - Varchar2(30)
32 /*-------------------------------------------------------------------------*/
33 
34 Procedure Update_Working_Version(
35         P_Commit                IN         Varchar2 Default Fnd_Api.G_False,
36         P_Init_Msg_List         IN         Varchar2 Default Fnd_Api.G_True,
37         P_API_Version_Number    IN         Number,
38 	P_RBS_Version_Id	IN	   Number,
39 	P_Name			IN	   Varchar2,
40 	P_Description		IN	   Varchar2,
41 	P_Version_Start_Date	IN	   Date,
42 	P_Job_Group_Id		IN	   Number,
43 	P_Record_Version_Number	IN	   Number,
44         P_Init_Debugging_Flag   IN         Varchar2 Default 'Y',
45 	X_Record_Version_Number OUT NOCOPY Number,
46         X_Return_Status         OUT NOCOPY Varchar2,
47         X_Msg_Count             OUT NOCOPY Number,
48         X_Error_Msg_Data        OUT NOCOPY Varchar2)
49 
50 Is
51 
52         l_Api_Name Varchar2(30) := 'Update_Working_Version';
53 	l_Error    Exception;
54 
55         Cursor c1 (P_Rbs_Ver_Id IN Number,
56                    P_Rec_Num IN Number) Is
57         Select
58                Status_Code,
59                Job_Group_Id
60         From
61                Pa_Rbs_Versions_B
62         Where
63                Rbs_Version_Id = P_Rbs_Version_Id
64         And    Status_Code = 'WORKING'
65         And    Record_Version_Number = P_Rec_Num
66         For Update Of Version_Start_Date NoWait;
67 
68         l_Ver_Rec  c1%RowType;
69 
70         Cursor c2 (P_Rbs_Ver_Id IN Number) Is
71         Select
72                H.Effective_From_Date,
73                H.Effective_To_Date,
74                H.Rbs_Header_Id,
75                TL.Name
76         From
77                Pa_Rbs_Headers_B H,
78                Pa_Rbs_Headers_TL TL,
79                Pa_Rbs_Versions_B V
80         Where
81                TL.Rbs_Header_Id = H.Rbs_Header_Id
82         And    UserEnv('LANG') in (TL.Language, TL.Source_Lang)
83         And    H.Rbs_Header_Id = V.Rbs_Header_Id
84         And    V.Rbs_Version_Id = P_Rbs_Ver_Id;
85 
86         l_Hdr_Rec c2%RowType;
87 
88         Cursor GetLatestFrozenRbsVersionId(P_Id IN Number) Is
89         Select
90                 Max(Rbs_Version_Id)
91         From
92                 Pa_Rbs_Versions_B
93         Where
94                Rbs_Header_Id = P_Id
95         And    Status_Code <> 'WORKING';
96 
97         Cursor GetVersionEndDate(P_Id IN Number) Is
98         Select
99                Version_Start_Date,
100                Version_End_Date
101         From
102                Pa_Rbs_Versions_B
103         Where
104                Rbs_Version_Id = P_Id;
105 
106         l_Prior_Rbs_Ver_Id     Number(15) := Null;
107         l_Prior_Rbs_Ver_Rec    GetVersionEndDate%RowType;
108 
109         Cursor CheckJobsExist(P_Rbs_Ver_Id IN Number) Is
110         Select
111                Count(*)
112         From
113                Pa_Rbs_Elements
114         Where
115                Job_Id Is Not Null
116         And    User_Created_Flag = 'Y'
117         And    Rbs_Version_Id = P_Rbs_Ver_Id;
118 
119         l_Job_Count  Number := 0;
120 
121 Begin
122 
123         If P_Init_Debugging_Flag = 'Y' Then
124 
125                 Pa_Debug.G_Path := ' ';
126 
127         End If;
128 
129         Pa_Debug.G_Stage := 'Entering Update_Working_Version() Pub.';
130         Pa_Debug.TrackPath('ADD','Update_Working_Version Pub');
131 
132         Pa_Debug.G_Stage := 'Call Compatibility API.';
133         If Not Fnd_Api.Compatible_API_Call (
134                         Pa_Rbs_Versions_Pub.G_Api_Version_Number,
135                         P_Api_Version_Number,
136                         l_Api_Name,
137                         Pa_Rbs_Versions_Pub.G_Pkg_Name) Then
138 
139                 Raise Fnd_Api.G_Exc_Unexpected_Error;
140 
141         End If;
142 
143 	Pa_Debug.G_Stage := 'Check if need to initialize message stack.';
144         If Fnd_Api.To_Boolean(nvl(P_Init_Msg_List,Fnd_Api.G_True)) Then
145 
146 		Pa_Debug.G_Stage := 'Initialize Message Stack.';
147                 Fnd_Msg_Pub.Initialize;
148 
149         End If;
150 
151         Pa_Debug.G_Stage := 'Initialize error handling variables.';
152         X_Msg_Count := 0;
153         X_Error_Msg_Data := Null;
154         X_Return_Status := Fnd_Api.G_Ret_Sts_Success;
155 
156         Pa_Debug.G_Stage := 'Lock the version record.';
157         Open c1(P_Rbs_Ver_Id => P_Rbs_Version_Id, P_Rec_Num => P_Record_Version_Number);
158         Fetch c1 Into l_Ver_Rec;
159 
160         Pa_Debug.G_Stage := 'Check able to lock version rec for update.';
161         If c1%NotFound Then
162 
163              Pa_Debug.G_Stage := 'Unable to lock version record for update.  ' ||
164                                             'Add error message to stack.';
165              Pa_Utils.Add_Message(
166                   P_App_Short_Name => 'PA',
167                   P_Msg_Name       => 'PA_RECORD_ALREADY_UPDATED');
168              Close c1;
169              Raise l_Error;
170 
171         End If;
172 
173         Open c2(P_Rbs_Ver_Id => P_Rbs_Version_Id);
174         Fetch c2 Into l_Hdr_Rec;
175         Close c2;
176 
177         Pa_Debug.G_Stage := 'Check if the version start date is not null.';
178         If P_Version_Start_Date is not null Then
179 
180                 Pa_Debug.G_Stage := 'The version start date is Null.';
181                 If P_Version_Start_Date < l_Hdr_Rec.Effective_From_Date Then
182 
183                      Pa_Debug.G_Stage := 'The version start date is before the header from date.';
184                      Pa_Utils.Add_Message(
185                           P_App_Short_Name => 'PA',
186                           P_Msg_Name       => 'PA_VER_START_<_HDR_FROM_DATE',
187                           P_Token1         => 'RBSNAME',
188 			  P_Value1         => l_Hdr_Rec.Name);
189 
190                      Raise l_Error;
191 
192                 End If;
193 
194         Else
195 
196                 Pa_Debug.G_Stage := 'The version start date is null.  Add error message to stack.';
197                 Pa_Utils.Add_Message(
198                      P_App_Short_Name => 'PA',
199                      P_Msg_Name       => 'PA_VER_START_DATE_IS_NULL',
200                      P_Token1         => 'RBSNAME',
201                      P_Value1         => l_Hdr_Rec.Name);
202 
203                 Raise l_Error;
204 
205         End If;
206 
207         -- Per bug 3602821 don't need to check the end date of the header for anything.
208         -- Pa_Debug.G_Stage := 'Check and see if the version start date is after the header end date.';
209         -- If P_Version_Start_Date > Nvl(l_Hdr_Rec.Effective_To_Date,P_Version_Start_Date) Then
210 
211         --      Pa_Debug.G_Stage := 'The version start date is after the header end date.';
212         --      Pa_Utils.Add_Message(
213         --           P_App_Short_Name => 'PA',
214         --           P_Msg_Name       => 'PA_VER_START_>_HDR_TO_DATE',
215         --           P_Token1         => 'RBSNAME',
216         --           P_Value1         => l_Hdr_Rec.Name);
217 
218         --      Raise l_Error;
219 
220         -- End If;
221 
222         Pa_Debug.G_Stage := 'Get the prior working version rbs version id if exists.';
223         Open GetLatestFrozenRbsVersionId(P_Id => l_Hdr_Rec.Rbs_Header_Id);
224         Fetch GetLatestFrozenRbsVersionId Into l_Prior_Rbs_Ver_Id;
225 
226         If GetLatestFrozenRbsVersionId%NotFound Then
227 
228 	        Close GetLatestFrozenRbsVersionId;
229 
230         Else
231 
232                 Close GetLatestFrozenRbsVersionId;
233 
234                 Pa_Debug.G_Stage := 'Get the prior working version end date.';
235                 Open GetVersionEndDate(P_Id => l_Prior_Rbs_Ver_Id);
236                 Fetch GetVersionEndDate Into l_Prior_Rbs_Ver_Rec;
237                 Close GetVersionEndDate;
238 
239                 If P_Version_Start_Date < l_Prior_Rbs_Ver_Rec.Version_Start_Date Then
240 
241                         Pa_Debug.G_Stage := 'Version Start Date less than prior version.  Add error message to stack.';
242                         Pa_Utils.Add_Message(
243                                 P_App_Short_Name => 'PA',
244                                 P_Msg_Name       => 'PA_RBS_VER_DATES_OVERLAP');
245 
246                         Raise l_Error;
247 
248                 End If;
249 
250         End If;
251 
252         -- Check If the job_group has changed and if it has then check to see if there are job assigned to any of the
253         -- elements/nodes for the rbs.  If there are job elements then raise an error.  You can't change the job_group
254         -- when there are element/nodes with jobs assigned to them.
255 
256         Pa_Debug.G_Stage := 'Check if the current working record job group is populated.';
257         If l_Ver_Rec.Job_Group_Id Is Not Null Then
258 
259                 Pa_Debug.G_Stage := 'Check if the current parameter job group is populated.';
260                 If P_Job_Group_Id Is Not Null Then
261 
262                         If P_Job_Group_Id <> l_Ver_Rec.Job_Group_Id Then
263 
264                                 Open CheckJobsExist(P_Rbs_Ver_Id => P_Rbs_Version_Id);
265                                 Fetch CheckJobsExist Into l_Job_Count;
266                                 Close CheckJobsExist;
267 
268                                 If l_Job_Count > 0 Then
269 
270                                         Pa_Debug.G_Stage := 'There are elements with jobs.  Cannot change job group.  Raise error.';
271                                         Pa_Utils.Add_Message(
272                                                 P_App_Short_Name => 'PA',
273                                                 P_Msg_Name       => 'PA_RBS_CANT_CHANGE_JOB_GROUP');
274 
275                                         Raise l_Error;
276 
277                                 End If;
278 
279                         End If;
280 
281                 Else
282 
283                         Open CheckJobsExist(P_Rbs_Ver_Id => P_Rbs_Version_Id);
284                         Fetch CheckJobsExist Into l_Job_Count;
285                         Close CheckJobsExist;
286 
287                         If l_Job_Count > 0 Then
288 
289                                 Pa_Debug.G_Stage := 'There are element with jobs.  Cannot change job group.  Raise error.';
290                                 Pa_Utils.Add_Message(
291                                         P_App_Short_Name => 'PA',
292                                         P_Msg_Name       => 'PA_RBS_CANT_CHANGE_JOB_GROUP');
293 
294                                 Raise l_Error;
295 
296                         End If;
297 
298                 End If;
299 
300         End If;
301 
302 	Pa_Debug.G_Stage := 'Call Pa_Rbs_Versions_Pvt.Update_Working_Version() procedure.';
303         Pa_Rbs_Versions_Pvt.Update_Working_Version(
304                 P_Rbs_Version_Id	=> P_Rbs_Version_Id,
305 		P_Name			=> P_Name,
306 		P_Description		=> P_Description,
307 		P_Version_Start_Date	=> P_Version_Start_Date,
308 		P_Job_Group_Id		=> P_Job_Group_Id,
309 		P_Record_Version_Number	=> P_Record_Version_Number,
310 		X_Record_Version_Number => X_Record_Version_Number,
311 		X_Error_Msg_Data	=> X_Error_Msg_Data);
312 
313 	If X_Error_Msg_Data Is Not Null Then
314 
315 		Raise l_Error;
316 
317 	End If;
318 
319         Pa_Debug.G_Stage := 'Check to do commit(T-True,F-False) - ' || P_Commit;
320         If Fnd_Api.To_Boolean(Nvl(P_Commit,Fnd_Api.G_False)) Then
321 
322                 Commit;
323 
324         End If;
325 
326         Pa_Debug.G_Stage := 'Leaving Update_Working_Version() Pub procedure.';
327         Pa_Debug.TrackPath('STRIP','Update_Working_Version Pub');
328 
329 Exception
330         When l_Error Then
331                 X_Return_Status := 'E';
332                 X_Msg_Count := 1;
333                 Pa_Debug.G_Stage := 'Leaving Update_Working_Version() Pub procedure.';
334                 Pa_Debug.TrackPath('STRIP','Update_Working_Version Pub');
335         When Others Then
336                 X_Return_Status := 'U';
337                 X_Msg_Count := 1;
338                 X_Error_Msg_Data := Pa_Rbs_Versions_Pub.G_Pkg_Name || ':::' || Pa_Debug.G_Path || '::' || Pa_Debug.G_Stage ||
339                                     ':' || SqlErrm;
340                 If P_Init_Debugging_Flag = 'Y' Then
341                         Rollback;
342                 Else
343                         Raise;
344                 End If;
345 
346 End Update_Working_Version;
347 
348 
349 -- =======================================================================
350 -- Start of Comments
351 -- API Name      : Delete_Working_Version
352 -- Type          : Public
353 -- Pre-Reqs      : None
354 -- Type          : Procedure
355 -- Function      : This procedure deletes the working rbs version as well as it elements/nodes.
356 --
357 --  Parameters:
358 --
359 --  IN
360 --      P_Commit                - Varchar2 Default Fnd_Api.G_False
361 --      P_Init_Msg_List         - Varchar2 Default Fnd_Api.G_True
362 --      P_Api_Version_Number    - Number
363 --      P_RBS_Version_Id        - Number(15)
364 --      P_Record_Version_Number - Number(15)
365 --  OUT
366 --      X_Return_Status         - Varchar2(1)
367 --      X_Msg_Count             - Number
368 --      X_Error_Msg_Data        - Varchar2(30)
369 --
370 /*-------------------------------------------------------------------------*/
371 
372 Procedure Delete_Working_Version(
373         P_Commit                IN         Varchar2 Default Fnd_Api.G_False,
374         P_Init_Msg_List         IN         Varchar2 Default Fnd_Api.G_True,
375         P_Api_Version_Number    IN         Number,
376         P_RBS_Version_Id        IN         Number,
377         P_Record_Version_Number IN         Number,
378         X_Return_Status         OUT NOCOPY Varchar2,
379         X_Msg_Count             OUT NOCOPY Number,
380         X_Error_Msg_Data        OUT NOCOPY Varchar2)
381 
382 Is
383 
384 	l_Api_Name Varchar2(30) := 'Delete_Working_Version';
385 	l_Error    Exception;
386 
387 Begin
388 
389 
390         Pa_Debug.G_Path := ' ';
391 
392         Pa_Debug.G_Stage := 'Entering Delete_Working_Version() Pub.';
393         Pa_Debug.TrackPath('ADD','Delete_Working_Version Pub');
394 
395         Pa_Debug.G_Stage := 'Call Compatibility API.';
396         If Not Fnd_Api.Compatible_API_Call (
397                         Pa_Rbs_Versions_Pub.G_Api_Version_Number,
398                         P_Api_Version_Number,
399                         l_Api_Name,
400                         Pa_Rbs_Versions_Pub.G_Pkg_Name) Then
401 
402                 Raise Fnd_Api.G_Exc_Unexpected_Error;
403 
404         End If;
405 
406 	Pa_Debug.G_Stage := 'Check if need to initialize message stack.';
407         If Fnd_Api.To_Boolean(nvl(P_Init_Msg_List,Fnd_Api.G_True)) Then
408 
409 		Pa_Debug.G_Stage := 'Initialize Message Stack.';
410                 Fnd_Msg_Pub.Initialize;
411 
412         End If;
413 
414         Pa_Debug.G_Stage := 'Initialize error handling variables.';
415         X_Msg_Count := 0;
416         X_Error_Msg_Data := Null;
417         X_Return_Status := Fnd_Api.G_Ret_Sts_Success;
418 
419 	Pa_Debug.G_Stage := 'Call Pa_Rbs_Versions_Pvt.Delete_Working_Version() procedure.';
420 	Pa_Rbs_Versions_Pvt.Delete_Working_Version(
421 		P_Rbs_Version_Id        => P_RBS_Version_Id,
422 		P_Record_Version_Number => P_Record_Version_Number,
423 		P_Mode                  => Null,
424 		X_Error_Msg_Data        => X_Error_Msg_Data);
425 
426 	Pa_Debug.G_Stage := 'Check if error message data is populated.';
427 	If X_Error_Msg_Data Is Not Null Then
428 
429 		Pa_Debug.G_Stage := 'Raise user defined error due to error msg data parameter being populated.';
430 		Raise l_error;
431 
432 	End If;
433 
434 	Pa_Debug.G_Stage := 'Check to do commit(T-True,F-False) - ' || P_Commit;
435         If Fnd_Api.To_Boolean(Nvl(P_Commit,Fnd_Api.G_False)) Then
436 
437                 Commit;
438 
439         End If;
440 
441         Pa_Debug.G_Stage := 'Leaving Delete_Working_Version() Pub procedure.';
442         Pa_Debug.TrackPath('STRIP','Delete_Working_Version Pub');
443 
444 Exception
445 	When l_Error Then
446 		X_Return_Status := 'E';
447 		X_Msg_Count := 1;
448 	When Others Then
449 		X_Return_Status := 'U';
450 		X_Msg_Count := 1;
451 		X_Error_Msg_Data := Pa_Rbs_Versions_Pub.G_Pkg_Name || ':::' || Pa_Debug.G_Path || '::' || Pa_Debug.G_Stage ||
452                                     ':' || SqlErrm;
453 		Rollback;
454 
455 End Delete_Working_Version;
456 
457 
458 -- =======================================================================
459 -- Start of Comments
460 -- API Name      : Create_Working_Version
461 -- Type          : Public
462 -- Pre-Reqs      : None
463 -- Type          : Procedure
464 -- Function      : This procedure create a new working rbs version based on a previously frozen rbs version.
465 --
466 --  Parameters:
467 --
468 --  IN
469 --      P_Commit                - Varchar2 Default Fnd_Api.G_False,
470 --      P_Init_Msg_List         - Varchar2 Default Fnd_Api.G_True,
471 --      P_Api_Version_Number    - Number
472 --      P_RBS_Version_Id        - Number(15) is the frozen version id to copy from(should not be null copying)
473 --      P_Rbs_Header_Id         - Number(15) is Header for the frozen and the working version
474 --      P_Rec_Version_Number    - Number(15) is for the current working version
475 -- OUT
476 --      X_Return_Status         - Varchar2(1)
477 --      X_Msg_Count             - Number
478 --      X_Error_Msg_Data        - Varchar2(30)
479 --
480 /*-------------------------------------------------------------------------*/
481 
482 Procedure Create_Working_Version (
483 	P_Commit		IN	   Varchar2 Default Fnd_Api.G_False,
484 	P_Init_Msg_List		IN	   Varchar2 Default Fnd_Api.G_True,
485 	P_Api_Version_Number	IN	   Number,
486 	P_RBS_Version_Id	IN	   Number Default Null,
487 	P_Rbs_Header_Id		IN	   Number,
488 	P_Rec_Version_Number	IN	   Number Default Null,
489         P_Init_Debugging_Flag   IN         Varchar2 Default 'Y',
490 	X_Return_Status		OUT NOCOPY Varchar2,
491 	X_Msg_Count		OUT NOCOPY Number,
492 	X_Error_Msg_Data	OUT NOCOPY Varchar2 )
493 
494 Is
495 
496 	l_Api_Name Varchar2(30) := 'Create_Working_Version';
497 	l_Error    Exception;
498 
499 Begin
500 
501         If P_Init_Debugging_Flag = 'Y' Then
502                 Pa_Debug.G_Path := ' ';
503         End If;
504 
505         Pa_Debug.G_Stage := 'Entering Create_Working_Version().';
506         Pa_Debug.TrackPath('ADD','Create_Working_Version');
507 
508         Pa_Debug.G_Stage := 'Call Compatibility API.';
509         If Not Fnd_Api.Compatible_API_Call (
510                         Pa_Rbs_Versions_Pub.G_Api_Version_Number,
511                         P_Api_Version_Number,
512                         l_Api_Name,
513                         Pa_Rbs_Versions_Pub.G_Pkg_Name) Then
514 
515                 Raise Fnd_Api.G_Exc_Unexpected_Error;
516 
517         End If;
518 
519         Pa_Debug.G_Stage := 'Check if need to initialize message stack.';
520         If Fnd_Api.To_Boolean(nvl(P_Init_Msg_List,Fnd_Api.G_True)) Then
521 
522                 Pa_Debug.G_Stage := 'Initialize Message Stack.';
523                 Fnd_Msg_Pub.Initialize;
524 
525         End If;
526 
527         Pa_Debug.G_Stage := 'Initialize error handling variables.';
528         X_Msg_Count := 0;
529         X_Error_Msg_Data := Null;
530         X_Return_Status := Fnd_Api.G_Ret_Sts_Success;
531 
532 	Pa_Debug.G_Stage := 'Call Pa_Rbs_Versions_Pvt.Create_New_Working_Version() procedure.';
533         Pa_Rbs_Versions_Pvt.Create_New_Working_Version(
534         	P_RBS_Version_Id        => P_RBS_Version_Id,
535        	 	P_Rbs_Header_Id     	=> P_Rbs_Header_Id,
536         	P_Record_Version_Number => P_Rec_Version_Number,
537         	X_Error_Msg_Data        => X_Error_Msg_Data);
538 
539         Pa_Debug.G_Stage := 'Check if error message data is populated.';
540         If X_Error_Msg_Data Is Not Null Then
541 
542                 Pa_Debug.G_Stage := 'Raise user defined error due to error msg data parameter being populated.';
543                 Raise l_error;
544 
545         End If;
546 
547         Pa_Debug.G_Stage := 'Check to do commit(T-True,F-False) - ' || P_Commit;
548         If Fnd_Api.To_Boolean(Nvl(P_Commit,Fnd_Api.G_False)) Then
549 
550                 Commit;
551 
552         End If;
553 
554         Pa_Debug.G_Stage := 'Leaving Create_Working_Version() procedure.';
555         Pa_Debug.TrackPath('STRIP','Create_Working_Version');
556 
557 Exception
558         When l_Error Then
559                 X_Return_Status := 'E';
560                 X_Msg_Count := 1;
561         When Others Then
562                 X_Return_Status := 'U';
563                 X_Msg_Count := 1;
564                 X_Error_Msg_Data := Pa_Rbs_Versions_Pub.G_Pkg_Name || ':::' || Pa_Debug.G_Path || '::' || Pa_Debug.G_Stage ||
565                                     ':' || SqlErrm;
566                 If P_Init_Debugging_Flag = 'Y' Then
567                         Rollback;
568                 Else
569                         Raise;
570                 End If;
571 
572 End Create_Working_Version;
573 
574 
575 -- =======================================================================
576 -- Start of Comments
577 -- API Name      : Freeze_Working_Version
578 -- Type          : Public
579 -- Pre-Reqs      : None
580 -- Type          : Procedure
581 -- Function      : This procedure freezes working version and creates a new working version based on this frozen rbs version.
582 --		   If the RBS has no rules as its element then a copy of the version hierarchy is created with user_created_flag=N
583 --		   for RBS usage in allocation rules.
584 --
585 --  Parameters:
586 --
587 --  IN
588 --      P_Commit                                - Varchar2 Default Fnd_Api.G_False,
589 --      P_Init_Msg_List                         - Varchar2 Default Fnd_Api.G_True,
590 --      P_Rbs_Version_Id                        - Number(15) is the version id of the version to be freezed
591 --      P_Rbs_Version_Record_Ver_Num            - Number(15) is record version number of the version to be freezed
592 --      P_Init_Debugging_Flag                   - Vachar2(1)
593 -- OUT
594 --      X_Return_Status                         - Varchar2(1)
595 --      X_Msg_Count                             - Number
596 --      X_Error_Msg_Data                        - Varchar2(30)
597 --
598 
599 PROCEDURE Freeze_Working_Version(
600         P_Commit                     IN         Varchar2 Default Fnd_Api.G_False,
601         P_Init_Msg_List              IN         Varchar2 Default Fnd_Api.G_True,
602         P_Rbs_Version_Id             IN         Number,
603         P_Rbs_Version_Record_Ver_Num IN         Number Default Null,
604         P_Init_Debugging_Flag        IN         Varchar2 Default 'Y',
605         X_Return_Status              OUT NOCOPY Varchar2,
606         X_Msg_Count                  OUT NOCOPY Number,
607         X_Error_Msg_Data             OUT NOCOPY Varchar2)
608 IS
609 
610         l_version_start_date            Date;
611 	l_end_date			Date   := Null;
612         l_latest_freezed_version_id     Number;
613         l_Error                         Exception;
614 	l_Rbs_Header_Id                 Number := Null;
615         l_Rec_Version_Number            Number := Null;
616 
617         l_msg_count                     Number := 0;
618         l_data                          Varchar2(2000);
619         l_msg_data                      Varchar2(2000);
620         l_msg_index_out                 Number;
621 	l_old_rbs_version_id		Number := Null;
622 	l_new_rbs_version_id		Number := Null;
623   	l_project_id                    Number := Null;
624         l_count                         Number := Null;
625         l_assoc_count                   Number := Null;
626         --This cursor gets the latest frozen versions Rbs_version_id
627         Cursor GetLatestFrozenRbsVersionId(l_Rbs_Header_Id IN Number) Is
628         Select
629                 Max(Rbs_Version_Id)
630         From
631                 Pa_Rbs_Versions_B
632         Where
633                Rbs_Header_Id = l_Rbs_Header_Id
634         And    Status_Code <> 'WORKING';
635 
636         Cursor c_GetVersionDates(P_Rbs_Ver_Id IN Number) Is
637         Select
638                Version_Start_Date,
639                Nvl(Version_End_Date,SysDate) Version_End_Date
640         From
641                Pa_Rbs_Versions_B
642         Where
643                Rbs_Version_Id = P_Rbs_Ver_Id;
644 
645         l_Ver_Dates_Rec c_GetVersionDates%RowType;
646 
647         Cursor c_Record_Ver_No is
648         Select
649                Record_Version_Number
650         From
651                Pa_Rbs_Versions_B
652         Where
653                Rbs_Version_Id = P_Rbs_Version_Id
654         For Update Of Version_Start_Date NoWait;
655 
656         RecInfo c_Record_Ver_No%RowType;
657 
658         l_Api_Name Varchar2(30) := 'Freeze_Working_Version';
659         l_Api_Version_Number   Number := Null;
660 	--l_use_for_alloc_flag VARCHAR2(1);
661 
662 BEGIN
663 
664         If P_Init_Debugging_Flag = 'Y' Then
665                 Pa_Debug.G_Path := ' ';
666         End If;
667 
668         Pa_Debug.G_Stage := 'Entering Freeze_Working_Version().';
669         Pa_Debug.TrackPath('ADD','Freeze_Working_Version');
670 
671         --Initialize the message stack if not initialized
672         Pa_Debug.G_Stage := 'Check if need to initialize the error message stack.';
673         If Fnd_Api.To_Boolean(nvl(P_Init_Msg_List,Fnd_Api.G_True)) Then
674 
675                 Pa_Debug.G_Stage := 'Initialize the error message stack by calling Fnd_Msg_Pub.Initialize().';
676                 Fnd_Msg_Pub.Initialize;
677 
678         End If;
679 
680 	Pa_Debug.G_Stage := 'Initialize error handling variables.';
681         X_Msg_Count := 0;
682         X_Error_Msg_Data := Null;
683         X_Return_Status := Fnd_Api.G_Ret_Sts_Success;
684 
685 
686         Pa_Debug.G_Stage := 'Check if the version record is locked.';
687         Open c_record_ver_no;
688         Fetch c_record_ver_no Into recinfo;
689 
690         If (c_Record_Ver_No%NotFound) Then
691                 Close c_Record_Ver_No;
692         End If;
693 
694         Close c_record_ver_no;
695 
696         Pa_Debug.G_Stage := 'Check if Rbs Version record_version_number matches.';
697         IF RecInfo.Record_Version_Number = P_Rbs_Version_Record_Ver_Num Then
698 
699                 Null;
700 
701         Else
702 
703                 Pa_Debug.G_Stage := 'Rbs Version record_version_number does not match.  Add error to message stack.';
704                 x_return_status := Fnd_Api.G_Ret_Sts_Error;
705 
706                 Pa_Utils.Add_Message(
707                         P_App_Short_Name => 'FND', /* Bug 3819654: Changed short name from PA to FND */
708                         P_Msg_Name       => 'FND_LOCK_RECORD_ERROR');
709 
710                 l_msg_count := Fnd_Msg_Pub.Count_Msg;
711                 If l_Msg_Count = 1 Then
712 
713                         Pa_Interface_Utils_Pub.Get_Messages(
714                                 P_Encoded      => Fnd_Api.G_True,
715                                 P_Msg_Index     => 1,
716                                 P_Msg_Count     => l_Msg_Count,
717                                 P_Msg_Data      => l_Msg_Data,
718                                 P_Data          => l_Data,
719 				P_Msg_Index_Out => l_Msg_Index_Out);
720 
721                         X_Error_Msg_Data := l_Data;
722                         X_Msg_Count := l_Msg_Count;
723 
724                 Else
725 
726                         X_Msg_Count := l_Msg_Count;
727 
728                 End If;
729 
730                 Raise l_error;
731 
732         END IF;
733 
734         Pa_Debug.G_Stage := 'Get the Version_Start_Date and Rbs_Header_Id of working version.';
735         Select
736                 Version_Start_Date,
737                 Rbs_Header_Id
738         Into
739                 l_Version_Start_Date,
740                 l_Rbs_Header_Id
741         From
742                 Pa_Rbs_Versions_B
743         Where
744                 Rbs_Version_Id = P_Rbs_Version_Id;
745 
746 	--commented out since checking of this flag is not needed to copy hierarchy of elements when we freeze a version
747 	-- For bug 3659078
748 	--SELECT
749 	--	USE_FOR_ALLOC_FLAG
750 	--INTO
751 	--	l_use_for_alloc_flag
752 	--FROM
753 	--	Pa_Rbs_Headers_b
754 	--Where
755 	--	Rbs_Header_Id=l_Rbs_Header_Id;
756 
757         Pa_Debug.G_Stage:= 'Getting version id of the latest freezed version';
758         Open GetLatestFrozenRbsVersionId(l_Rbs_Header_Id);
759         Fetch GetLatestFrozenRbsVersionId Into l_latest_freezed_version_id;
760 	Close GetLatestFrozenRbsVersionId;
761 
762         --If either resource type id or resource source id is different for each element of working version compared to latest,
763         --freezed version,give them new element identifiers.
764 
765         Pa_Debug.G_Stage:= 'Updating element identifiers of the rbs elements for the working version which do not match latest freeze.';
766         -- Bug 3635614 changed the update statement by removing the start with and connect by prior clause and used where clause instead
767         Update pa_rbs_elements
768         Set
769               Element_Identifier = Pa_Rbs_Element_Identifier_S.NextVal
770         Where
771               Rbs_Element_Id IN (
772                                 Select
773                                        Distinct a.Rbs_Element_Id
774                                 From
775                                        Pa_Rbs_Elements a,
776                                        Pa_Rbs_Elements b
777                                 Where
778                                        a.Element_Identifier = b.Element_Identifier
779                                 And    a.Rbs_Version_Id = P_Rbs_Version_Id
780                                 And    b.Rbs_Version_Id = l_Latest_Freezed_Version_Id
781                                 And    a.Resource_Type_Id <> -1
782                                 And    b.Resource_Type_id <> -1
783                                 And  ( a.Resource_Source_Id <> b.Resource_Source_Id Or
784                                        a.Resource_Type_Id <> b.Resource_Type_Id) );
785 
786 	-- For Bug 3659078
787 	--Description
788 	--When the RBS is frozen, we will create a copy of that
789 	--hierarchy with "user_created_flag = 'N' if use_for_alloc_flag is set to Y.
790 
791 	--The above logic is changed. We copy hierarchy only when we freeze a RBS having no rules as its elements
792 	--irrespective of the use_for_alloc_flag value.
793 
794 	IF PA_RBS_HEADER_PVT.Validate_Rbs_For_Allocations(p_rbs_id=>l_Rbs_Header_Id)='N' Then --When RBS has no rules as its element
795 	--If l_use_for_alloc_flag='Y' Then
796 
797 		Pa_Debug.G_Stage:= 'Copying All Elements With user_created_Flag = N';
798 
799 		Pa_Debug.G_Stage:= 'Delete All Records From Pa_Rbs_Elements_Temp';
800 		Begin
801 
802                 	Delete
803                 	From Pa_Rbs_Elements_Temp;
804 
805         	Exception
806                 	When No_Data_Found Then
807                         	null;
808 
809         	End;
810 
811 		Pa_Debug.G_Stage:= 'Insert Pa_Rbs_Elements_Temp table with new element_ids';
812 
813         	Insert Into Pa_Rbs_Elements_Temp(
814                 	New_Element_Id,
815                 	Old_Element_Id,
816                 	Old_Parent_Element_Id,
817                 	New_Parent_Element_Id )
818         	(Select
819                 	Pa_Rbs_Elements_S.NextVal,
820                 	Rbs_Element_Id,
821                 	Parent_Element_Id,
822                 	Null
823          	From
824                 	Pa_Rbs_Elements
825          	Where
826                 	Rbs_Version_Id = P_Rbs_Version_Id
827          	and    user_created_flag = 'Y' );
828 
829 		Update Pa_Rbs_Elements_Temp Tmp1
830         	Set New_Parent_Element_Id =
831                 	(Select
832                         	New_Element_Id
833                  	From
834                         	Pa_Rbs_Elements_Temp Tmp2
835                  	Where
836                         	Tmp1.Old_Parent_Element_Id = Tmp2.Old_Element_Id);
837 
838 		Pa_Debug.G_Stage:= 'Insert all records with user_created_flag=N with new element ids updated with new parent element ids';
839 
840 		/*Bug 4377886 : Included explicitly the column names in the INSERT statement
841 				to remove the GSCC Warning File.Sql.33 */
842 		Insert Into pa_rbs_elements
843                 (
844                 RBS_ELEMENT_ID,
845 	 	RBS_ELEMENT_NAME_ID,
846 		RBS_VERSION_ID,
847 		OUTLINE_NUMBER,
848 		ORDER_NUMBER,
849 		RESOURCE_TYPE_ID,
850 		RESOURCE_SOURCE_ID,
851 		PERSON_ID,
852 		JOB_ID,
853 		ORGANIZATION_ID,
854 		EXPENDITURE_TYPE_ID,
855 		EVENT_TYPE_ID,
856 		EXPENDITURE_CATEGORY_ID,
857 		REVENUE_CATEGORY_ID,
858 		inventory_item_id,
859 		item_category_id,
860 		bom_labor_id,
861 		bom_equipment_id,
862 		non_labor_resource_id,
863 		role_id,
864 		person_type_id,
865 		resource_class_id,
866 		supplier_id,
867 		rule_flag,
868 		PARENT_ELEMENT_ID,
869 		rbs_level,
870 		element_identifier,
871 		user_defined_custom1_id,
872 		user_defined_custom2_id,
873 		user_defined_custom3_id,
874 		user_defined_custom4_id,
875 		user_defined_custom5_id,
876 		USER_CREATED_FLAG,
877 		LAST_UPDATE_DATE,
878 		LAST_UPDATED_BY,
879 		CREATION_DATE,
880 		CREATED_BY,
881 		LAST_UPDATE_LOGIN,
882 		RECORD_VERSION_NUMBER)
883 		SELECT
884 			Tmp.New_Element_Id,
885 			Ele.rbs_element_name_id,
886 			P_Rbs_Version_Id,
887 			Ele.outline_number,
888 			Ele.order_Number,
889 			Ele.resource_type_id,
890 			Ele.resource_source_id,
891 			Ele.person_id,
892 			Ele.job_id,
893 			Ele.organization_id,
894 			Ele.Expenditure_Type_Id,
895 			Ele.Event_Type_Id,
896 			Ele.expenditure_category_id,
897 			Ele.revenue_category_id,
898 			Ele.inventory_item_id,
899 			Ele.item_category_id,
900 			Ele.bom_labor_id,
901 			Ele.bom_equipment_id,
902 			Ele.non_labor_resource_id,
903 			Ele.role_id,
904 			Ele.person_type_id,
905 			Ele.resource_class_id,
906 			Ele.supplier_id,
907 			Ele.rule_flag,
908 			Tmp.New_parent_element_id,
909 			Ele.rbs_level,
910 			Ele.element_identifier,
911 			Ele.user_defined_custom1_id,
912 			Ele.user_defined_custom2_id,
913 			Ele.user_defined_custom3_id,
914 			Ele.user_defined_custom4_id,
915 			Ele.user_defined_custom5_id,
916 			'N',
917 			sysdate,
918 			fnd_global.user_id,
919 			sysdate,
920 			fnd_global.user_id,
921 			fnd_global.login_id,
922 			1
923 		FROM
924 			Pa_Rbs_Elements Ele,
925 			Pa_Rbs_Elements_Temp Tmp
926 		WHERE
927 			Tmp.Old_Element_Id=Ele.Rbs_Element_Id;
928 
929 	End IF; --End of changes made for bug 3659078. modified for bug 3703364
930 
931         Pa_Debug.G_Stage := 'Mark the working version as frozen.';
932         Update Pa_Rbs_Versions_B
933         Set
934                 Status_code = 'FROZEN'
935         Where
936                 Rbs_Version_Id = P_Rbs_Version_Id;
937 
938 
939         Open c_GetVersionDates(P_Rbs_Ver_Id => l_Latest_Freezed_Version_Id);
940         Fetch c_GetVersionDates Into l_Ver_Dates_Rec;
941         Close c_GetVersionDates;
942 
943 
944 	Pa_Debug.G_Stage := 'Set the version end date of latest freezed version to 1 minus start date of version being freezed,';
945 	Pa_Debug.G_Stage := 'if they are not equal';
946 
947 	Pa_Debug.G_Stage := 'Set the version end date of latest freezed version to start date of version being freezed,';
948         Pa_Debug.G_Stage := 'if they are equal';
949 
950 	If ((l_version_start_date-1)<(l_ver_dates_rec.Version_start_date)) Then
951 
952 		  l_end_date := l_version_start_date;
953 	Else
954 
955 		  l_end_date := l_version_start_date-1;
956 
957 	End If;
958 
959 
960         Update Pa_Rbs_Versions_B
961         Set
962                 Version_End_Date = l_end_date
963         Where
964                 Rbs_Version_Id = l_Latest_Freezed_Version_Id;
965 
966         /***********************************************************
967          * Bug - 3617050
968          * Desc - we are getting the count of the versions associated
969          *        with the header id.
970          *        If the count is one, only then we will set the current
971          *        reporting flag as Null.
972          *        because more than 1 version for a header cannot have
973          *        current_reporting_flag set. so we are only setting it
974          *        for the 1st frozen version.
975          ******************************************************************/
976          BEGIN
977             SELECT count(*)
978             INTO l_count
979             FROM pa_rbs_versions_b
980             where rbs_header_id = l_rbs_header_id;
981          EXCEPTION
982          WHEN OTHERS THEN
983             l_count := 0;
984          END;
985 
986          IF l_count = 1 THEN
987             Update pa_rbs_versions_b
988             Set current_reporting_flag = 'Y'
989             where rbs_version_id = p_rbs_version_id;
990          END IF;
991 
992         -- Bug 3987478 - If RBS is not associated to any projects, the
993         -- PJI push will not pick it up.  We still need to set the current
994 	-- reporting flag as Yes for the latest frozen version.
995 
996         -- Check any associations exist for the RBS Header.
997         SELECT count(*)
998           INTO l_assoc_count
999           FROM pa_rbs_prj_assignments
1000          WHERE rbs_header_id = l_rbs_header_id;
1001 
1002         IF l_assoc_count = 0 THEN
1003            UPDATE pa_rbs_versions_b
1004            SET    current_reporting_flag = 'Y'
1005            WHERE  rbs_version_id = p_rbs_version_id;
1006 
1007            UPDATE pa_rbs_versions_b
1008            SET    current_reporting_flag = NULL
1009            WHERE  rbs_header_id = l_rbs_header_id
1010            AND    rbs_version_id <> p_rbs_version_id;
1011 
1012            -- Similarly, if an RBS is used in allocations but not projects,
1013            -- need to update the latest version to allocations.
1014            PA_ALLOC_UTILS.ASSOCIATE_RBS_TO_ALLOC_RULE(
1015              p_rbs_header_id  => l_rbs_header_id,
1016              p_rbs_version_id => p_rbs_version_id,
1017              x_return_status  => x_return_status,
1018              x_error_code     => x_error_msg_data);
1019 
1020            IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1021               pa_debug.G_Stage := 'Error in API PA_ALLOC_UTILS.ASSOCIATE_RBS_TO_ALLOC_RULE';
1022               Raise l_error;
1023            END IF;
1024 
1025         END IF; /* End of Bug 3987478 changes */
1026 
1027         Pa_Debug.G_Stage := 'Check if we have a error message populated.';
1028 	If X_Error_Msg_Data Is Not Null Then
1029 
1030                 Pa_Debug.G_Stage := 'We have a error message populated.  Raise error.';
1031                 Raise l_error;
1032 
1033 	Else
1034 
1035                 Pa_Debug.G_Stage := 'Prepare to call Pji_FM_Xbs_Accum_Maint.Rbs_Push() procedure.';
1036 		l_Old_Rbs_Version_Id := l_latest_freezed_version_id;
1037 		l_New_Rbs_Version_Id := P_Rbs_Version_Id;
1038 
1039                 Pa_Debug.G_Stage := 'Call Pji_FM_Xbs_Accum_Maint.Rbs_Push() procedure.';
1040 		Pji_FM_Xbs_Accum_Maint.Rbs_Push(
1041 		        P_Old_Rbs_Version_Id => l_Old_Rbs_Version_Id,
1042 		        P_New_Rbs_Version_Id => l_New_Rbs_Version_Id,
1043 		        P_Project_Id         => l_Project_Id,
1044 		        X_Return_Status      => X_Return_Status,
1045 		        X_Msg_Code           => X_Error_Msg_Data);
1046 
1047 	End If;
1048 
1049 	--For Bug 3678165
1050 	If X_Error_Msg_Data Is Not Null Then
1051 		Pa_Debug.G_Stage := 'We have a error message populated.  Raise error.';
1052                 Raise l_error;
1053 
1054         Else
1055 
1056                 Pa_Debug.G_Stage := 'Prepare to call pa_rbs_mapping.create_mapping_rules() procedure.';
1057 		Pa_Rbs_Mapping.Create_Mapping_Rules(
1058 			P_Rbs_Version_Id    => P_Rbs_Version_Id,
1059 			X_Return_Status     => X_Return_Status,
1060 			X_Msg_Count         => X_Msg_Count,
1061 			X_Msg_Data          => X_Error_Msg_Data);
1062 	End If;
1063 
1064         l_Api_Version_Number := 1;
1065 
1066         Pa_Debug.G_Stage := 'Create a copy of the version being freezed which will be the working version for this header.';
1067         Pa_Rbs_Versions_Pub.Create_Working_Version(
1068                 P_Commit              => Fnd_Api.G_False,
1069                 P_Init_Msg_List       => Fnd_Api.G_False,
1070                 P_Api_Version_Number  => l_Api_Version_Number,
1071                 P_RBS_Version_Id      => P_RBS_Version_Id,
1072                 P_Rbs_Header_Id       => l_Rbs_Header_Id,
1073                 P_Rec_Version_Number  => l_Rec_Version_Number,
1074                 P_Init_Debugging_Flag => 'N',
1075                 X_Return_Status       => X_Return_Status,
1076                 X_Msg_Count           => X_Msg_Count,
1077                 X_Error_Msg_Data      => X_Error_Msg_Data);
1078 
1079         Pa_Debug.G_Stage := 'Check if Pa_Rbs_Versions_Pub.Create_Working_Version() procedure return error.';
1080         IF X_Error_Msg_Data Is Not Null Then
1081 
1082                 Pa_Debug.G_Stage := 'Check if Pa_Rbs_Versions_Pub.Create_Working_Version() procedure return error.';
1083                 Raise l_error;
1084 
1085         END IF;
1086 
1087         Pa_Debug.G_Stage := 'Check if need to do commit.';
1088         If Fnd_Api.To_Boolean(Nvl(P_Commit,Fnd_Api.G_False)) Then
1089 
1090                 Pa_Debug.G_Stage := 'Commit changes to the db.';
1091                 Commit;
1092 
1093         End If;
1094 
1095         Pa_Debug.G_Stage := 'Leaving Freeze_Working_Version() procedure.';
1096         Pa_Debug.TrackPath('STRIP','Freeze_Working_Version');
1097 
1098 Exception
1099         When l_Error Then
1100                 X_Return_Status := 'E';
1101                 X_Msg_Count := 1;
1102 
1103         When Others Then
1104                 X_Return_Status := 'E';
1105                 X_Msg_Count := 1;
1106                 X_Error_Msg_Data := Pa_Rbs_Versions_Pub.G_Pkg_Name || ':::' || Pa_Debug.G_Path || '::' || Pa_Debug.G_Stage ||
1107                                     ':' || SqlErrm;
1108                 If P_Init_Debugging_Flag = 'Y' Then
1109                        Rollback;
1110                 Else
1111                        Raise;
1112                 End If;
1113 
1114 END Freeze_Working_Version;
1115 
1116 End Pa_Rbs_Versions_Pub;