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