DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_PROGRESS_UTILS

Source


1 package body PA_PROGRESS_UTILS as
2 /* $Header: PAPCUTLB.pls 120.31.12010000.6 2008/12/17 20:33:36 bifernan ship $ */
3 /* Addition for bug 6156686 */
4 
5 l_bcws_project_id            NUMBER  ;
6 l_bcws_object_id             NUMBER  ;
7 l_bcws_proj_element_id       NUMBER  ;
8 l_bcws_as_of_date            DATE    ;
9 l_bcws_structure_version_id  NUMBER  ;
10 l_bcws_rollup_method         VARCHAR2(30);
11 l_bcws_scheduled_start_date  DATE ;
12 l_bcws_scheduled_end_date    DATE  ;
13 l_bcws_prj_currency_code     VARCHAR2(30);
14 l_bcws_structure_type        VARCHAR2(30);
15 l_bcws_value                 NUMBER;
16 
17 -- Start Changes for bug 6664716
18 TYPE bcws_rec_type IS RECORD
19 (labor_hrs          number,   --Stores the sum of prorated and before as of date amounts
20  equip_hrs          number,
21  prj_brdn_cost      number,
22  sch_start_date     date,
23  sch_end_date       date,
24  pstart_date        date,
25  pend_date          date,
26  as_of_date         date,
27  parent_task_id     number,
28  tlbr_hrs_baod      number,     -- Stores the sum of lbr hours prior to as of date period
29  teqp_hrs_baod      number,
30  tpbc_hrs_baod      number,
31  cur_lbr_hrs        number,     -- Stores the current period amount.
32  cur_eqp_hrs        number,
33  cur_pbc            number
34  );
35 
36 TYPE bcws_hash_tbl IS TABLE OF bcws_rec_type
37       INDEX BY varchar2(17);
38 
39 l_bcws_hash_tbl bcws_hash_tbl;
40 
41 l_prv_bcws_project_id             NUMBER := -1;
42 l_prv_bcws_struc_ver_id           NUMBER := -1;
43 l_ovr_task_id                         NUMBER := -1;
44 -- End Changes for bug 6664716
45 
46 
47 FUNCTION GET_LATEST_TASK_VER_ID (p_project_id      IN  NUMBER,
48                                  p_task_id         IN  NUMBER) return NUMBER IS
49     x_task_version_id    NUMBER;
50 BEGIN
51     select ppev1.element_version_id
52       into x_task_version_id
53       from pa_proj_element_versions ppev1,
54            pa_proj_element_versions ppev2,
55            pa_proj_elem_ver_structure ppevs,
56            pa_structure_types pst,
57            pa_proj_structure_types ppst
58      where ppevs.project_id = p_project_id
59        and ppevs.latest_eff_published_flag = 'Y'
60        and ppevs.element_version_id = ppev1.parent_structure_version_id
61        and ppevs.element_version_id = ppev2.element_version_id
62        and ppev2.proj_element_id = ppst.proj_element_id
63        and ppst.structure_type_id = pst.structure_type_id
64        and pst.structure_type_class_code = 'WORKPLAN'
65        and ppev1.proj_element_id = p_task_id
66        and ppev1.object_type = 'PA_TASKS';
67     return x_task_version_id;
68 exception when others then
69      return -999;
70 END;
71 
72 FUNCTION PROGRESS_RECORD_EXISTS(p_element_version_id IN  NUMBER,
73                                 p_object_type        IN  VARCHAR2
74                 ,p_project_id        IN  NUMBER -- Fixed bug # 3688901.
75                 ) return VARCHAR2 IS
76     x_record_exists  VARCHAR2(1);
77 BEGIN
78     select 'Y'
79       into x_record_exists
80       from pa_percent_completes
81      where object_version_id = p_element_version_id
82        and object_type = p_object_type
83        and published_flag = 'Y'
84        and project_id = p_project_id; -- Fixed bug # 3688901
85 
86     return x_record_exists;
87 exception when no_data_found then
88      return 'N';
89 when others then
90      return 'Y';
91 END;
92 
93 FUNCTION GET_LATEST_STRUCTURE_VER_ID (p_project_id      IN  NUMBER) return NUMBER IS
94     x_structure_version_id    NUMBER;
95 BEGIN
96     select ppevs.element_version_id
97       into x_structure_version_id
98       from pa_proj_elem_ver_structure ppevs,
99            pa_proj_element_versions ppev,
100            pa_structure_types pst,
101            pa_proj_structure_types ppst
102      where ppevs.project_id = p_project_id
103        and ppevs.latest_eff_published_flag = 'Y'
104        and ppevs.element_version_id = ppev.element_version_id
105        and ppev.proj_element_id = ppst.proj_element_id
106        and ppst.structure_type_id = pst.structure_type_id
107        and pst.structure_type_class_code = 'WORKPLAN';
108     return x_structure_version_id;
109 exception when others then
110      return -999;
111 END;
112 
113 FUNCTION isUserProjectManager(p_user_id       IN   NUMBER,
114                               p_project_id    IN   NUMBER) return VARCHAR2 is
115     l_person_id  number;
116     x_val        varchar2(1) := 'N';
117 BEGIN
118     l_person_id := pa_utils.getempidfromuser(p_user_id);
119 
120     select 'Y'
121       into x_val
122      from pa_project_parties
123     where project_id = p_project_id
124       and resource_source_id = l_person_id
125       and project_role_id = 1
126       and trunc(sysdate) between trunc(start_date_active) and trunc(nvl(end_date_active,sysdate)); ----- Project Manager
127 
128     return x_val;
129 
130 exception when others then
131     return 'N';
132 
133 END;
134 
135 -- FPM Dev CR 3 : Not used
136 FUNCTION Get_Working_Progress_Id(p_project_id    IN   NUMBER,
137                                  p_task_id       IN   NUMBER) return NUMBER is
138     l_percent_complete_id  number;
139 BEGIN
140 
141     select percent_complete_id
142       into l_percent_complete_id
143      from pa_percent_completes
144     where project_id = p_project_id
145       and task_id = p_task_id
146       and current_flag = 'N'
147       and published_flag = 'N';
148 
149     return l_percent_complete_id;
150 
151 exception when others then
152     return -999;
153 
154 END;
155 
156 PROCEDURE UPDATE_TASK_PROG_REQ_DATE(p_commit        in varchar2 := FND_API.G_TRUE,
157                                   p_object_id      in number,
158                                   p_object_type    in varchar2,
159                                   x_return_status  out NOCOPY varchar2, --File.Sql.39 bug 4440895
160                                   x_msg_count      out NOCOPY number, --File.Sql.39 bug 4440895
161                                   x_msg_data       out NOCOPY varchar2) IS --File.Sql.39 bug 4440895
162   CURSOR get_setup_info
163   IS SELECT
164          object_id, object_type,  reporting_cycle_id,
165          next_reporting_date, record_version_number,
166          initial_progress_status, final_progress_status,
167          rollup_progress_status, object_page_layout_id
168      FROM pa_object_page_layouts popl
169      WHERE
170          page_type_code = 'TPR'
171      AND page_id = -99
172      AND object_id = p_object_id
173      AND object_type = p_object_type;
174 
175  l_object_id                  number;
176  l_object_type                varchar2(30);
177  l_report_cycle_id            number;
178  l_next_reporting_date        date;
179  l_record_version_number      number;
180  l_initial_progress_status    varchar2(30);
181  l_final_progress_status      varchar2(30);
182  l_rollup_progress_status     varchar2(1);
183  l_object_page_layout_id      number;
184  x_next_reporting_date        date;
185  x_report_end_date            date;
186 BEGIN
187            x_return_status := FND_API.G_RET_STS_SUCCESS;
188 
189            OPEN get_setup_info;
190            FETCH get_setup_info INTO l_object_id, l_object_type, l_report_cycle_id,l_next_reporting_date, l_record_version_number, l_initial_progress_status, l_final_progress_status, l_rollup_progress_status, l_object_page_layout_id;
191            CLOSE get_setup_info;
192 
193            IF (l_report_cycle_id IS NOT null) then
194             if (l_next_reporting_date is null) then
195                 l_next_reporting_date := trunc(sysdate);
196             end if;
197 
198             x_next_reporting_date := PA_Billing_Cycles_Pkg.Get_Billing_Date(l_Object_Id
199                                                         ,l_next_reporting_date+1
200                                                         ,l_Report_Cycle_Id
201                                                         ,sysdate
202                                                         ,l_next_reporting_date);
203 
204              pa_progress_report_pkg.update_object_page_layout_row
205              (
206               p_object_id                 => l_OBJECT_ID ,
207               p_object_Type               => l_OBJECT_TYPE ,
208               p_page_id                   => -99 ,
209               p_page_type_code            => 'TPR' ,
210               p_approval_required         => null ,
211               p_reporting_cycle_id        => l_report_cycle_id ,
212               p_reporting_offset_days     => null,
213               p_next_reporting_date       => x_next_reporting_date ,
214               p_reminder_days             => null ,
215               p_reminder_days_type        => null ,
216               p_initial_progress_status   => l_initial_progress_status,
217               p_final_progress_status     => l_final_progress_status,
218               p_rollup_progress_status    => l_rollup_progress_status,
219               P_REPORT_TYPE_ID            => null,
220               P_APPROVER_SOURCE_ID        => null,
221               P_APPROVER_SOURCE_TYPE      => null,
222               P_EFFECTIVE_FROM            => null,
223               P_EFFECTIVE_TO              => null,
224               p_object_page_layout_id     => l_object_page_layout_id,
225               p_record_version_number     => l_record_version_number,
226               x_return_status             => x_return_status ,
227               x_msg_count                 => x_msg_count,
228               x_msg_data                  => x_msg_data
229               );
230            END IF;
231 
232   IF (p_commit = FND_API.G_TRUE AND  x_return_status = FND_API.g_ret_sts_success  )THEN
233      COMMIT;
234   END IF;
235 -- Introduced Exception Block : 4537865
236 EXCEPTION
237 WHEN OTHERS THEN
238      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
239      x_msg_count     := 1;
240      x_msg_data      := SUBSTRB(SQLERRM,1,240);
241 
242      FND_MSG_PUB.add_exc_msg( p_pkg_name=> 'PA_PROGRESS_UTILS'
243                      ,p_procedure_name  => 'UPDATE_TASK_PROG_REQ_DATE'
244              ,p_error_text => x_msg_data );
245 
246      RAISE;
247 END UPDATE_TASK_PROG_REQ_DATE;
248 
249 PROCEDURE adjust_reminder_date(
250         p_commit                         in varchar2 := FND_API.G_TRUE
251        ,p_project_id                     IN  NUMBER
252        ,x_return_status                  OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
253        ,x_msg_count                      OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
254        ,x_msg_data                       OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
255 IS
256   l_reporting_date DATE;
257   l_offset_days NUMBER;
258   l_cycle_id NUMBER;
259   l_sysdate DATE := TRUNC(sysdate);
260 BEGIN
261   -- 4537865 Should x_return_status be initialized to Success here  ?
262   -- If it is initialized Commit will happen here in this API,which might
263   -- wash-out all previously established savepoints. Not sure,whether to do this fix or not
264 
265   SELECT next_reporting_date, reporting_cycle_id, report_offset_days
266   INTO l_reporting_date, l_cycle_id, l_offset_days
267   FROM pa_object_page_layouts
268   WHERE object_id = p_project_id
269     AND object_type = 'PA_PROJECTS'
270     AND page_type_code = 'TPR';
271 
272     if ( l_reporting_date is not null and l_reporting_date < l_sysdate
273             and l_cycle_id is not null ) then
274         while (l_reporting_date < l_sysdate) Loop
275             l_reporting_date := PA_Billing_Cycles_Pkg.Get_Next_Billing_Date(
276                             p_project_id
277                             ,l_reporting_date
278                             ,l_cycle_id
279                             ,l_offset_days
280                             ,l_reporting_date
281                             ,l_reporting_date-1);
282 
283         End Loop;
284 
285         UPDATE pa_object_page_layouts
286             SET next_reporting_date = l_reporting_date
287             WHERE object_id = p_project_id
288             AND object_type = 'PA_PROJECTS'
289             AND page_type_code = 'TPR';
290         IF (p_commit = FND_API.G_TRUE AND  x_return_status = FND_API.g_ret_sts_success  )THEN
291             COMMIT;
292         end if;
293     End If;
294 
295 EXCEPTION
296     When OTHERS then
297 
298      -- 4537865
299          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
300      x_msg_count := 1 ;
301      x_msg_data := SUBSTRB(SQLERRM,1,240);
302          Fnd_Msg_Pub.add_exc_msg
303                    ( p_pkg_name        => 'PA_PROGRESS_UTILS'
304                     , p_procedure_name  => 'adjust_reminder_date'
305                     , p_error_text      => x_msg_data);
306     -- 4537865
307     RAISE;
308 END adjust_reminder_date;
309 
310 FUNCTION PROJ_TASK_PROG_EXISTS(p_project_id IN  NUMBER,
311                           p_task_id    IN  NUMBER) return VARCHAR2 IS
312     x_record_exists  VARCHAR2(1);
313 BEGIN
314     select 'Y'
315       into x_record_exists
316       from pa_percent_completes
317      where project_id = p_project_id
318        and task_id = decode(p_task_id,0,task_id,p_task_id)
319        and published_flag = 'Y';
320 
321     return x_record_exists;
322 exception when no_data_found then
323      return 'N';
324 when others then
325      return 'Y';
326 END;
327 
328 FUNCTION GET_PRIOR_PERCENT_COMPLETE(p_project_id IN  NUMBER,
329                                     p_task_id    IN  NUMBER,
330                                     p_as_of_date IN  DATE) return NUMBER IS
331     prior_pc  NUMBER;
332     /*--Added by rtarway, bug 4324504
333     CURSOR c_get_prior_percent_complete(l_task_id NUMBER, l_project_id NUMBER, l_as_of_date DATE) IS
334         select  completed_percentage
335     from    pa_percent_completes
336     where   project_id = l_project_id
337     and task_id = l_task_id
338     and published_flag = 'Y'
339     and structure_type = 'WORKPLAN'
340     and date_computed  < l_as_of_date
341     and object_type = 'PA_TASKS'
342     order by date_computed desc;*/
343 
344     ---- bug 5042445
345    CURSOR c_get_prior_percent_complete(l_task_id NUMBER, l_project_id NUMBER, l_as_of_date DATE) IS
346    select nvl(completed_percentage,eff_rollup_percent_comp)
347      from pa_progress_rollup
348     where project_id = l_project_id
349     and object_id = l_task_id
350     and object_type in ('PA_STRUCTURES', 'PA_TASKS')
351     and structure_Type = 'WORKPLAN'
352     and structure_version_id is null
353     and as_of_date < l_as_of_date
354     order by as_of_date desc;
355 BEGIN
356     --Commented by rtarway, bug 4324504
357     /*select completed_percentage
358       into prior_pc
359       from pa_percent_completes
360      where project_id = p_project_id
361        and task_id = p_task_id
362        and published_flag = 'Y'
363        and structure_type = 'WORKPLAN' -- FPM Dev CR 3
364        and date_computed <= p_as_of_date;*/
365 
366      OPEN  c_get_prior_percent_complete(p_task_id, p_project_id, trunc(p_as_of_date));
367      FETCH c_get_prior_percent_complete  INTO prior_pc;
368 
369      IF (c_get_prior_percent_complete%NOTFOUND) THEN
370         prior_pc := 0 ;
371      END IF;
372 
373      CLOSE c_get_prior_percent_complete;
374 
375      return prior_pc;
376 
377 exception when others then
378      return 0;
379 END;
380 
381 
382 FUNCTION GET_LATEST_AS_OF_DATE(
383     p_task_id      NUMBER
384     ,p_project_id   NUMBER := null -- FPM Development Bug 3420093
385     ,p_object_id   NUMBER := null -- FPM Development Bug 3420093
386     , p_object_type VARCHAR2 := 'PA_TASKS'-- FPM Development Bug 3420093
387     ,p_structure_type VARCHAR2 := 'WORKPLAN' -- FPM Development Bug 3420093
388     ) RETURN DATE IS
389 
390 --Added for performance improvements bug 2679612
391   CURSOR cur_proj_elem
392   IS
393     SELECT project_id
394      FROM pa_proj_elements
395     WHERE proj_element_id = p_task_id;
396     l_project_id          NUMBER;
397 --Added for performance improvements bug 2679612
398 
399   CURSOR cur_ppc(c_project_id NUMBER )
400   IS
401     SELECT date_computed
402       FROM pa_percent_completes
403      WHERE object_id = decode(p_object_id, null, p_task_id, p_object_id)
404        AND project_id = c_project_id
405        and object_type = p_object_type
406        AND current_flag = 'Y'
407        AND published_flag = 'Y'
408        AND structure_type = p_structure_type
409        AND NVL(task_id, -1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id, NVL(task_id, -1)), NVL(p_task_id,p_object_id)) /* Amit : Modified for IB4 Progress CR. */
410        ;
411   l_as_of_date  DATE;
412 BEGIN
413 
414      IF p_project_id is NULL THEN
415 --Added for performance improvements bug 2679612
416         OPEN cur_proj_elem;
417         FETCH cur_proj_elem INTO l_project_id;
418         CLOSE cur_proj_elem;
419      ELSE
420         l_project_id := p_project_id;
421      END IF;
422 
423 --Added for performance improvements bug 2679612
424 
425      OPEN cur_ppc(l_project_id);
426      FETCH cur_ppc INTO l_as_of_date;
427      CLOSE cur_ppc;
428      RETURN l_as_of_date ;
429 
430 exception when others then
431      return null;
432 
433 END GET_LATEST_AS_OF_DATE;
434 
435 function    Get_AS_OF_DATE (
436                 X_Project_ID            IN  Number,
437                 X_Project_Start_Date    IN  Date    default NULL,
438                 X_Billing_Cycle_ID      IN  Number  default NULL,
439                 X_Billing_Offset_Days   IN  Number  default NULL,
440                 X_Bill_Thru_Date        IN  Date    default NULL,
441                 X_Last_Bill_Thru_Date   IN  Date    default NULL
442                                 )   RETURN DATE
443 IS
444 
445 return_number            NUMBER;
446 previous_return_date     DATE;
447 next_return_date         DATE;
448 return_date              DATE;
449 
450 date_count         NUMBER := 0;
451 temp_index         NUMBER := 0;
452 
453 future_date_record NUMBER := 0;
454 prev_return_date Date;
455 
456 BEGIN
457 
458 if PA_PROGRESS_UTILS.x_bill_thru_date is null then
459     PA_PROGRESS_UTILS.x_bill_thru_date := x_project_start_date;
460 end if;
461 
462 if PA_PROGRESS_UTILS.project_id <> X_Project_ID OR
463    i >= 10 then
464 
465   --Initializing variables
466   PA_PROGRESS_UTILS.l_return_date.delete;
467   PA_PROGRESS_UTILS.project_id            := X_Project_ID;
468   PA_PROGRESS_UTILS.previous_record_count := 0;
469   PA_PROGRESS_UTILS.next_record_count     := 0;
470   PA_PROGRESS_UTILS.previous_record_index := 0;
471   PA_PROGRESS_UTILS.current_index         := 0;
472   PA_PROGRESS_UTILS.x_bill_thru_date      := X_Last_Bill_Thru_Date;
473   PA_PROGRESS_UTILS.i                     := 0;
474 
475 --------my_error_msg( 'X_Billing_Cycle_ID ' || X_Billing_Cycle_ID );
476 
477  while TRUE loop
478 
479  prev_return_date := return_date;
480 
481   IF X_Billing_Cycle_ID IS NOT NULL THEN
482    return_date := PA_Billing_Cycles_Pkg.Get_Next_Billing_Date
483                     (X_Project_ID          => X_Project_ID,
484                      X_Project_Start_Date  => X_Project_Start_Date,
485                      X_Billing_Cycle_ID    => X_Billing_Cycle_ID,
486                      X_Billing_Offset_Days => X_Billing_Offset_Days,
487                      X_Bill_Thru_Date      => X_Bill_Thru_Date,
488                      X_Last_Bill_Thru_Date => PA_PROGRESS_UTILS.x_bill_thru_date);
489   ELSE
490    return_date := PA_PROGRESS_UTILS.x_bill_thru_date + 1;
491   END IF;
492 
493   PA_PROGRESS_UTILS.x_bill_thru_date := return_date;
494 
495   IF  ((trunc(sysdate) - trunc(return_date) <= 5) OR (trunc(return_date) >= trunc(sysdate))) then
496 
497    date_count := date_count + 1;
498 
499 
500    PA_PROGRESS_UTILS.l_return_date.extend(1);
501    PA_PROGRESS_UTILS.l_return_date(date_count) := to_char(return_date, 'MM-DD-RR');
502 
503   END IF;
504 
505 
506 
507    if trunc(return_date) >= trunc(sysdate) then
508 
509       if PA_PROGRESS_UTILS.current_index = 0 then
510          PA_PROGRESS_UTILS.current_index := date_count;
511          PA_PROGRESS_UTILS.previous_record_index := PA_PROGRESS_UTILS.current_index - 5;
512          IF PA_PROGRESS_UTILS.previous_record_index <= 0
513          THEN
514             PA_PROGRESS_UTILS.previous_record_index := 1;
515          END IF;
516       end if;
517 
518       future_date_record := future_date_record + 1;
519 
520    end if;
521 
522    if future_date_record = 5 then
523       exit;
524    end if;
525 
526    if prev_return_date = return_date then
527       exit;
528    end if;
529 
530 end loop;
531 
532 end if;
533 
534 
535 if  PA_PROGRESS_UTILS.previous_record_count < 5 AND
536     PA_PROGRESS_UTILS.previous_record_index > 0 AND
537     PA_PROGRESS_UTILS.previous_record_index < PA_PROGRESS_UTILS.current_index
538 then
539      if (PA_PROGRESS_UTILS.l_return_date.exists(PA_PROGRESS_UTILS.previous_record_index)) then--If Condition Added by rtarway for BUG4111124
540           return_date := to_date(PA_PROGRESS_UTILS.l_return_date(PA_PROGRESS_UTILS.previous_record_index), 'MM-DD-RR');
541 
542           PA_PROGRESS_UTILS.previous_record_count :=  PA_PROGRESS_UTILS.previous_record_count + 1;
543           PA_PROGRESS_UTILS.previous_record_index :=  PA_PROGRESS_UTILS.previous_record_index + 1;
544      end if;
545 
546 elsif  PA_PROGRESS_UTILS.next_record_count < 5 then
547 
548     temp_index := PA_PROGRESS_UTILS.current_index+PA_PROGRESS_UTILS.next_record_count;
549 
550     if (PA_PROGRESS_UTILS.l_return_date.exists(temp_index)) then --If Condition Added by rtarway for BUG4111124
551          return_date := to_date(PA_PROGRESS_UTILS.l_return_date(temp_index), 'MM-DD-RR');
552 
553          PA_PROGRESS_UTILS.next_record_count := PA_PROGRESS_UTILS.next_record_count + 1;
554     end if;
555 
556 end if;
557 
558 RETURN (return_date);
559 
560 EXCEPTION
561     When OTHERS then
562     RAISE;
563 END Get_AS_OF_DATE;
564 
565 
566 FUNCTION as_of_date(
567         X_Project_ID                    IN      NUMBER                          ,
568         X_Object_id                     IN      NUMBER                          ,
569         X_Billing_Cycle_ID              IN      NUMBER  DEFAULT NULL            ,
570         X_Object_type                   IN      VARCHAR2  DEFAULT 'PA_TASKS'    ,-- FPM Development Bug 3420093
571         X_structure_type                IN      VARCHAR2  DEFAULT 'WORKPLAN'    ,-- FPM Development Bug 3420093
572     X_proj_element_id               IN      NUMBER    := null   /* Amit : Modified for IB4 Progress CR. */
573           ) RETURN DATE IS
574 
575 -- Bug  3974627 : Commented
576 /*
577    CURSOR cur_pa_ppc
578    IS
579      SELECT max( date_computed )
580        FROM pa_percent_completes
581       WHERE project_id = X_Project_ID
582         AND object_id = x_object_id
583         AND object_type = x_object_type
584         AND current_flag = 'Y'
585         AND published_flag = 'Y'
586         AND structure_type = x_structure_type
587     AND NVL(task_id,-1) = DECODE(X_Object_type, 'PA_DELIVERABLES', NVL(X_proj_element_id, NVL(task_id,-1)), NVL(X_proj_element_id, X_Object_id))
588     ;
589 */
590 
591 -- Bug  3974627 : Added Cursors cur_pa_ppc_str_task, cur_pa_ppc_asgn, cur_pa_ppc_dlv
592    CURSOR cur_pa_ppc_str_task
593    IS
594      SELECT max( date_computed )
595        FROM pa_percent_completes
596       WHERE project_id = X_Project_ID
597         AND object_id = x_object_id
598         AND current_flag = 'Y'
599         AND published_flag = 'Y'
600         AND object_type = x_object_type
601         AND structure_type = X_structure_type
602     AND task_id = NVL(X_proj_element_id,x_object_id)
603     ;
604 
605    CURSOR cur_pa_ppc_asgn
606    IS
607      SELECT max( date_computed )
608        FROM pa_percent_completes
609       WHERE project_id = X_Project_ID
610         AND current_flag = 'Y'
611         AND published_flag = 'Y'
612         AND ((object_type = 'PA_ASSIGNMENTS' and object_id = x_object_id)
613              or (object_type = 'PA_TASKS' and object_id = X_proj_element_id))
614         AND structure_type = X_structure_type
615     AND task_id = X_proj_element_id
616     ;
617 
618 
619 
620    CURSOR cur_dlv_get_asso_task(c_del_elem_id NUMBER)
621    IS
622           SELECT por.object_id_from2
623           FROM pa_object_relationships por
624           WHERE
625           por.object_type_to = 'PA_DELIVERABLES'
626       AND por.relationship_subtype IN  ('STRUCTURE_TO_DELIVERABLE', 'TASK_TO_DELIVERABLE')
627       AND por.relationship_type = 'A'
628       AND por.object_id_to2 = c_del_elem_id
629       ;
630    l_del_task_id NUMBER;
631 
632    CURSOR cur_pa_ppc_dlv_notask
633    IS
634      SELECT max( date_computed )
635        FROM pa_percent_completes
636       WHERE project_id = X_Project_ID
637         AND object_id = x_object_id
638         AND current_flag = 'Y'
639         AND published_flag = 'Y'
640         AND object_type = 'PA_DELIVERABLES'
641         AND structure_type = X_structure_type
642     AND NVL(task_id, -1) = NVL(X_proj_element_id, NVL(task_id, -1))
643     ;
644 
645    CURSOR cur_pa_ppc_dlv_task(c_task_id NUMBER)
646    IS
647      SELECT max( date_computed )
648        FROM pa_percent_completes
649       WHERE project_id = X_Project_ID
650         AND ((object_id = x_object_id and object_type = 'PA_DELIVERABLES') or
651             (object_id = c_task_id and object_type = 'PA_TASKS'))
652         AND current_flag = 'Y'
653         AND published_flag = 'Y'
654         AND structure_type = X_structure_type
655         ;
656 
657 
658 
659    CURSOR cur_pa_proj
660    IS
661      SELECT start_date, completion_date
662        from pa_projects_all
663       where project_id = x_project_id;
664 
665    l_return_date DATE;
666 
667    CURSOR c_get_max_rollup_dt IS
668    SELECT max(as_of_date)
669    FROM pa_progress_rollup
670    where project_id = X_Project_ID
671    and object_type IN ('PA_TASKS', 'PA_STRUCTURES')
672    and object_id = x_object_id
673    and structure_type = 'WORKPLAN'
674    and structure_version_id is null;
675 
676    l_cycle_type     varchar2(30);
677    l_value1         number;
678    cursor get_cycle_info is
679    Select Billing_Cycle_Type, Billing_Value1
680    From    PA_Billing_Cycles
681    Where   Billing_Cycle_ID = X_Billing_Cycle_ID;
682 
683 begin
684 
685 
686      IF PA_PROGRESS_UTILS.project_id <> X_Project_ID OR i >= 10 then
687 
688         -- Bug  3974627 Commented
689         --OPEN cur_pa_ppc;
690         --FETCH cur_pa_ppc INTO PA_PROGRESS_UTILS.l_last_progress_date;
691         --CLOSE cur_pa_ppc;
692      -- 4535784 Begin
693      -- To Show 30 dates in case rollup records exists after 5 cycle dates
694      -- Note that j_task is checked against 6 because each run is for 10 in which we get 5 future date and 5 null date(previous date implementaion, obsoleted now)
695      -- So we need to get 60 rows for 30 dates
696      IF ((x_object_type IN ('PA_TASKS', 'PA_STRUCTURES') and X_structure_type = 'WORKPLAN') and (j_task >=6 OR g_task_id <> x_object_id or PA_PROGRESS_UTILS.project_id <> X_Project_ID)) THEN
697     j_task := 0;
698     g_task_id := x_object_id;
699     OPEN c_get_max_rollup_dt;
700     FETCH c_get_max_rollup_dt INTO g_max_rollup_dt;
701     CLOSE c_get_max_rollup_dt;
702      END IF;
703      -- 4535784 End
704         -- Bug  3974627 Begin
705     IF x_object_type IN ('PA_TASKS', 'PA_STRUCTURES') THEN
706             -- 4535784 Begin
707         j_task := j_task+1;
708         IF j_task > 1 AND X_structure_type = 'WORKPLAN' and g_task_id = x_object_id AND trunc(nvl(g_max_rollup_dt,sysdate)) > trunc(PA_PROGRESS_UTILS.x_bill_thru_date) THEN
709             PA_PROGRESS_UTILS.l_last_progress_date := PA_PROGRESS_UTILS.x_bill_thru_date;
710         ELSE
711             IF j_task =1 THEN
712                 OPEN cur_pa_ppc_str_task;
713                 FETCH cur_pa_ppc_str_task INTO PA_PROGRESS_UTILS.l_last_progress_date;
714                 CLOSE cur_pa_ppc_str_task;
715             ELSE
716                 return null; -- This make sure that no extra processing is done when max date is reached
717             END IF;
718         END IF;
719             -- 4535784 End
720     ELSIF x_object_type = 'PA_ASSIGNMENTS' THEN
721         OPEN cur_pa_ppc_asgn;
722         FETCH cur_pa_ppc_asgn INTO PA_PROGRESS_UTILS.l_last_progress_date;
723         CLOSE cur_pa_ppc_asgn;
724     ELSIF x_object_type = 'PA_DELIVERABLES' THEN
725             OPEN cur_dlv_get_asso_task(x_object_id);
726         FETCH cur_dlv_get_asso_task INTO l_del_task_id;
727         CLOSE cur_dlv_get_asso_task;
728 
729                 if l_del_task_id is not null then
730                    OPEN cur_pa_ppc_dlv_task(l_del_task_id);
731            FETCH cur_pa_ppc_dlv_task INTO PA_PROGRESS_UTILS.l_last_progress_date;
732            CLOSE cur_pa_ppc_dlv_task;
733                 else
734                    OPEN cur_pa_ppc_dlv_notask;
735                    FETCH cur_pa_ppc_dlv_notask INTO PA_PROGRESS_UTILS.l_last_progress_date;
736                    CLOSE cur_pa_ppc_dlv_notask;
737                 end if;
738     END IF;
739     -- Bug  3974627 End
740 
741 
742         OPEN cur_pa_proj;
743         FETCH cur_pa_proj INTO X_project_start_date,X_project_finish_date;
744         CLOSE cur_pa_proj;
745 
746         IF PA_PROGRESS_UTILS.l_last_progress_date IS NULL
747         THEN
748 --           PA_PROGRESS_UTILS.l_last_progress_date :=  NVL( X_project_start_date,TRUNC(SYSDATE));
749              PA_PROGRESS_UTILS.l_last_progress_date := TRUNC(SYSDATE)-1;  --bug 2641630
750         END IF;
751 
752         --- as of date to remain same if in future 5226910(5212999)
753         if (PA_PROGRESS_UTILS.l_last_progress_date >= trunc(sysdate)) then
754            open get_cycle_info;
755            fetch get_cycle_info into l_cycle_type, l_value1;
756            close get_cycle_info;
757            If l_Cycle_Type = 'BILLING CYCLE DAYS' Then
758               PA_PROGRESS_UTILS.l_Last_Bill_Thru_Date := PA_PROGRESS_UTILS.l_last_progress_date -l_value1;
759            else
760               PA_PROGRESS_UTILS.l_Last_Bill_Thru_Date := PA_PROGRESS_UTILS.l_last_progress_date -1;
761            End if;
762         else
763            PA_PROGRESS_UTILS.l_Last_Bill_Thru_Date := PA_PROGRESS_UTILS.l_last_progress_date;
764         end if;
765      END IF;
766 ---     IF X_Billing_Cycle_ID IS NOT NULL
767 ---     THEN
768 
769          l_return_date := Get_AS_OF_DATE (
770                  X_Project_ID            => x_project_id
771                 ,X_Project_Start_Date    => PA_PROGRESS_UTILS.l_last_progress_date
772                 ,X_Billing_Cycle_ID      => X_Billing_Cycle_ID
773                 ,X_Billing_Offset_Days   => 0
774                 ,X_Bill_Thru_Date        => X_project_finish_date
775                 ,X_Last_Bill_Thru_Date   => PA_PROGRESS_UTILS.l_Last_Bill_Thru_Date
776              );
777 ---     END IF;
778      i := i + 1;
779 
780      RETURN ( l_return_date );
781 
782 end as_of_date;
783 
784 FUNCTION get_next_ppc_id RETURN NUMBER IS
785    l_return_ppc_id NUMBER;
786 BEGIN
787         select PA_PERCENT_COMPLETES_S.nextval
788         into l_return_ppc_id
789         from dual;
790 
791         RETURN l_return_ppc_id;
792 END get_next_ppc_id;
793 
794 
795 -- FPM Development Bug 3420093 : Added p_object_type
796 
797 FUNCTION CHECK_VALID_AS_OF_DATE(p_as_of_date IN DATE
798     , p_project_id IN NUMBER
799     , p_object_id NUMBER
800     , p_object_type VARCHAR2 := 'PA_TASKS'
801     , p_proj_element_id  IN      NUMBER    := null  /* Amit : Modified for IB4 Progress CR. */)
802 RETURN VARCHAR2 IS
803 
804 
805 --  CURSOR as_of_dates_csr
806 --  IS
807 --  SELECT 'Y'
808 --  FROM DUAL
809 --  WHERE trunc(p_as_of_date) IN
810 --    (SELECT trunc(as_of_date)
811 --     FROM PA_PROG_AS_OF_DATES
812 --     WHERE project_id = p_project_id
813 --       AND proj_element_id = p_object_id
814 --       AND object_id = p_object_id
815 --       AND object_type = p_object_type
816 --       AND rownum < 11);
817 
818 --  l_dummy    VARCHAR2(1);
819   l_dummy    Date ; -- For performance improvement used Minus operator
820 
821 /* -- FPM Dev CR 3
822 CURSOR as_of_dates_csr
823   IS
824   SELECT trunc(p_as_of_date) FROM DUAL
825   MINUS
826   SELECT
827     trunc(as_of_date)
828      FROM PA_PROG_AS_OF_DATES
829      WHERE project_id = p_project_id
830 --       AND proj_element_id = p_object_id
831        AND object_id = p_object_id
832        AND object_type = p_object_type
833        AND rownum < 11;*/
834 
835 -- FPM Dev CR 3 : Added two new cursors. Now we are not relying on pa_prog_as_of_dates view.
836   CURSOR as_of_dates_task_dlvr_csr
837   IS
838   SELECT trunc(p_as_of_date) FROM DUAL
839   MINUS
840   SELECT PA_PROGRESS_UTILS.AS_OF_DATE(ppe.project_id,  ppe.proj_element_id, ppp.progress_cycle_id, ppe.object_type, 'WORKPLAN', p_proj_element_id/* Amit : Modified for IB4 Progress CR. */) as_of_date
841   from  pa_project_statuses po, pa_proj_progress_attr ppp, pa_proj_elements ppe -- Bug 4535784 Changed from pa_resource_types to pa_project_statuses
842   where ppe.project_id = ppp.project_id(+)
843   AND ppp.structure_type (+) = 'WORKPLAN'
844   and ppe.project_id= p_project_id
845   and ppe.proj_element_id = p_object_id
846   and ppe.object_type = p_object_type
847   and ((ppe.object_type in ('PA_TASKS', 'PA_STRUCTURES') and rownum <61) or (ppe.object_type = 'PA_DELIVERABLES' and rownum <11)) -- Bug 4535784
848   --and rownum <11
849   ;
850 
851 
852   /* Modified for IB4 Progress CR. */
853 
854   CURSOR as_of_dates_assgn_csr
855   IS
856   SELECT trunc(p_as_of_date) FROM DUAL
857   MINUS
858   SELECT PA_PROGRESS_UTILS.AS_OF_DATE(ppe.project_id,  ppe.resource_list_member_id, ppp.progress_cycle_id, 'PA_ASSIGNMENTS', 'WORKPLAN', p_proj_element_id/* Amit : Modified for IB4 Progress CR. */) as_of_date
859   from  pa_resource_types po, pa_proj_progress_attr ppp, PA_TASK_ASSIGNMENTS_V ppe
860   where ppe.project_id = ppp.project_id(+)
861   AND ppp.structure_type (+) = 'WORKPLAN'
862   and ppe.project_id= p_project_id
863   and ppe.resource_list_member_id = p_object_id /* Modified for IB4 Progress CR. */
864   and ppe.task_id = p_proj_element_id /* Amit : Modified for IB4 Progress CR. */
865   and rownum <11;
866 
867 BEGIN
868   /* FPM Dev CR 3
869   OPEN as_of_dates_csr;
870   FETCH as_of_dates_csr INTO l_dummy;
871 --  if as_of_dates_csr%NOTFOUND then
872   ----my_error_msg( 'Project '||p_project_id);
873   ----my_error_msg( 'Invalid ');
874   --  return 'N';
875   --end if;
876   ------my_error_msg( 'Project '||p_project_id);
877   ------my_error_msg( 'valid ');
878   --return 'Y';
879   CLOSE as_of_dates_csr;
880   */
881   -- FPM Dev CR 3
882   IF p_object_type = 'PA_ASSIGNMENTS' THEN
883     OPEN as_of_dates_assgn_csr;
884     FETCH as_of_dates_assgn_csr INTO l_dummy;
885     CLOSE as_of_dates_assgn_csr;
886   ELSE
887     OPEN as_of_dates_task_dlvr_csr;
888     FETCH as_of_dates_task_dlvr_csr INTO l_dummy;
889     CLOSE as_of_dates_task_dlvr_csr;
890   END IF;
891 
892   if l_dummy is null then
893         return 'Y';
894   else
895         return 'N';
896   end if;
897 END CHECK_VALID_AS_OF_DATE;
898 
899 FUNCTION Calc_base_percent(
900  p_task_id     NUMBER,
901  p_incr_work_qty NUMBER,
902  p_cuml_work_qty NUMBER,
903  p_est_remaining_effort NUMBER
904 ) RETURN NUMBER IS
905 
906 /* Replacing this sql with the following sqls: for bug 2679612
907  CURSOR cur_pa_task_prg
908  IS
909    SELECT PLANNED_WORK_QUANTITY,
910           WQ_ACTUAL_ENTRY_CODE
911      FROM pa_latest_proj_task_prog_v
912     WHERE task_id = p_task_id;
913 */
914 
915 --Bug fix 2679612
916   CURSOR cur_pa_task_prg1
917   IS
918     SELECT WQ_PLANNED_QUANTITY
919       FROM pa_proj_elements ppe,
920            pa_proj_element_versions ppev,
921            pa_proj_elem_ver_schedule ppevsh
922      WHERE ppe.project_id = ppev.project_id
923        AND ppe.proj_element_id = p_task_id
924        AND ppev.proj_element_id = ppe.proj_element_id
925        AND ppev.element_version_id = ppevsh.element_version_id
926        AND ppev.project_id = ppevsh.project_id
927        AND ppev.parent_structure_version_id = PA_PROJ_ELEMENTS_UTILS.latest_published_ver_id(ppe.project_id, 'WORKPLAN');
928 
929   CURSOR cur_pa_task_prg2
930   IS
931     SELECT nvl(ppe.WQ_ACTUAL_ENTRY_CODE,ptt.ACTUAL_WQ_ENTRY_CODE)
932      FROM pa_proj_elements ppe, pa_task_types ptt
933     WHERE ppe.type_id = ptt.task_type_id(+)
934       AND ptt.object_type = 'PA_TASKS' /* bug 3279978 FP M Enhancement */
935       AND ppe.proj_element_id = p_task_id ;
936 
937 --Bug fix 2679612
938 
939 
940  l_return_value   NUMBER := 0;
941  l_WQ_ACTUAL_ENTRY_CODE        VARCHAR2(30);
942  l_planned_work_quantity       NUMBER;
943  l_last_cumulative_wrk_qty     NUMBER;
944 BEGIN
945 
946     OPEN cur_pa_task_prg1;
947     FETCH cur_pa_task_prg1 INTO l_planned_work_quantity;
948     CLOSE cur_pa_task_prg1;
949 
950 -- Bug fix 2740446  cannot divide by 0
951     if (nvl(l_planned_work_quantity,0) = 0) then
952         return 0;
953     end if;
954 
955 --Bug fix 2679612
956     OPEN cur_pa_task_prg2;
957     FETCH cur_pa_task_prg2 INTO l_WQ_ACTUAL_ENTRY_CODE;
958     CLOSE cur_pa_task_prg2;
959 --Bug fix 2679612
960 
961 
962     IF l_WQ_ACTUAL_ENTRY_CODE = 'CUMULATIVE'
963     THEN
964        l_return_value := ( ( NVL(p_cuml_work_qty,0)/l_planned_work_quantity ) * 100 );
965     ELSE
966 
967 --bugfix :2670679
968 /*       OPEN cur_cumltv;
969        FETCH cur_cumltv INTO l_last_cumulative_wrk_qty;
970        if cur_cumltv%notfound then
971            l_last_cumulative_wrk_qty := 0;
972        end if;
973        CLOSE cur_cumltv;
974        l_return_value := ( ( ( l_last_cumulative_wrk_qty + p_incr_work_qty ) /l_planned_work_quantity) * 100 );
975 */
976        l_return_value := ( ( ( NVL(p_cuml_work_qty,0) + NVL(p_incr_work_qty,0) ) /l_planned_work_quantity) * 100 );
977     END IF;
978     if l_return_value > 100 then
979        return 100;
980     else
981        return nvl(l_return_value,0);
982     end if;
983 END Calc_base_percent;
984 
985 -- 4392189 Phase 2: This method is not used anywhere
986 /*
987 PROCEDURE get_rollup_attrs(
988  p_task_id                           NUMBER,
989  p_as_of_date                        DATE,
990  x_EFF_ROLLUP_PROG_STAT_CODE         OUT VARCHAR2,
991  x_EFF_ROLLUP_PROG_STAT_NAME         OUT VARCHAR2,
992  x_ESTIMATED_REMAINING_EFFORT        OUT NUMBER,
993  x_BASE_PERCENT_COMPLETE             OUT NUMBER,
994  x_EFF_ROLLUP_PERCENT_COMP           OUT NUMBER,
995  x_ESTIMATED_START_DATE              OUT DATE,
996  x_ESTIMATED_FINISH_DATE             OUT DATE,
997  x_ACTUAL_START_DATE                 OUT DATE,
998  x_ACTUAL_FINISH_DATE                OUT DATE,
999  x_status_icon_ind                   OUT VARCHAR2,
1000  x_status_icon_active_ind            OUT VARCHAR2
1001 ) IS
1002 
1003 
1004 --Added for performance improvements bug 2679612
1005   CURSOR cur_proj_elem
1006   IS
1007     SELECT project_id
1008      FROM pa_proj_elements
1009     WHERE proj_element_id = p_task_id;
1010     l_project_id          NUMBER;
1011 --Added for performance improvements bug 2679612
1012 
1013   CURSOR cur_pa_prg_rollup( c_project_id NUMBER )
1014   IS
1015     SELECT EFF_ROLLUP_PROG_STAT_CODE,
1016            pps.project_status_name,
1017            ESTIMATED_REMAINING_EFFORT,
1018            BASE_PERCENT_COMPLETE, EFF_ROLLUP_PERCENT_COMP,
1019            ESTIMATED_START_DATE, ESTIMATED_FINISH_DATE,
1020            ACTUAL_START_DATE, ACTUAL_FINISH_DATE,
1021            pps.status_icon_ind, pps.status_icon_active_ind
1022       FROM pa_progress_rollup ppr, pa_project_statuses pps
1023      WHERE object_id = p_task_id
1024        AND project_id = l_project_id
1025        AND ppr.eff_rollup_prog_stat_code = pps.project_status_code(+)
1026        AND as_of_date = ( SELECT max( as_of_date ) from pa_progress_rollup
1027                             WHERE object_id = p_task_id and as_of_date <= p_as_of_date
1028                              AND project_id = l_project_id );
1029 BEGIN
1030 --Added for performance improvements bug 2679612
1031      OPEN cur_proj_elem;
1032      FETCH cur_proj_elem INTO l_project_id;
1033      CLOSE cur_proj_elem;
1034 --Added for performance improvements bug 2679612
1035 
1036      OPEN cur_pa_prg_rollup(l_project_id);
1037      FETCH cur_pa_prg_rollup INTO x_EFF_ROLLUP_PROG_STAT_CODE, x_EFF_ROLLUP_PROG_STAT_NAME,
1038            x_ESTIMATED_REMAINING_EFFORT,
1039            x_BASE_PERCENT_COMPLETE, x_EFF_ROLLUP_PERCENT_COMP,
1040            x_ESTIMATED_START_DATE, x_ESTIMATED_FINISH_DATE,
1041            x_ACTUAL_START_DATE, x_ACTUAL_FINISH_DATE,
1042            x_status_icon_ind, x_status_icon_active_ind;
1043            ----my_error_msg( 'x_BASE_PERCENT_COMPLETE '|| x_BASE_PERCENT_COMPLETE );
1044            ----my_error_msg( 'x_EFF_ROLLUP_PERCENT_COMP '||x_EFF_ROLLUP_PERCENT_COMP );
1045 
1046      CLOSE cur_pa_prg_rollup;
1047 
1048 END get_rollup_attrs;
1049 */
1050 FUNCTION get_next_progress_cycle(
1051  p_project_id NUMBER,
1052  p_task_id NUMBER,
1053  p_object_id NUMBER := null, -- FPM Development Bug 3420093
1054  p_object_type VARCHAR2 := 'PA_TASKS', -- FPM Development Bug 3420093
1055  p_structure_type VARCHAR2 := 'WORKPLAN', -- FPM Development Bug 3420093
1056  p_start_date  DATE := to_date(null)  -- FPM Development Bug 3420093
1057 )  RETURN DATE IS
1058 
1059 /* Bug 3974627 : Commnted and added new cusrosrs
1060    CURSOR cur_pa_ppc
1061    IS
1062      SELECT max( date_computed )
1063        FROM pa_percent_completes
1064       WHERE project_id = p_Project_ID
1065         AND object_id = decode(p_object_id, null, p_task_id, p_object_id) -- This is done to avoid any impact of parameter additions
1066         AND current_flag = 'Y'
1067         AND published_flag = 'Y'
1068         AND object_type = p_object_type
1069         AND structure_type = p_structure_type
1070     AND NVL(task_id, -1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id, NVL(task_id, -1)), NVL(p_task_id,p_object_id))
1071     ;
1072 */
1073 
1074 -- Bug  3974627 : Added Cursors cur_pa_ppc_str_task, cur_pa_ppc_asgn, cur_pa_ppc_dlv
1075    CURSOR cur_pa_ppc_str_task
1076    IS
1077      SELECT max( date_computed )
1078        FROM pa_percent_completes
1079       WHERE project_id = p_Project_ID
1080         AND object_id = decode(p_object_id, null, p_task_id, p_object_id)
1081         AND current_flag = 'Y'
1082         AND published_flag = 'Y'
1083         AND object_type = p_object_type
1084         AND structure_type = p_structure_type
1085     AND task_id = NVL(p_task_id,p_object_id)
1086     ;
1087 
1088    CURSOR cur_pa_ppc_asgn
1089    IS
1090      SELECT max( date_computed )
1091        FROM pa_percent_completes
1092       WHERE project_id = p_Project_ID
1093         AND current_flag = 'Y'
1094         AND published_flag = 'Y'
1095         AND object_type IN ('PA_ASSIGNMENTS' ,'PA_TASKS')
1096         AND structure_type = p_structure_type
1097     AND task_id = p_task_id
1098     ;
1099 
1100    CURSOR cur_dlv_get_asso_task(c_del_elem_id NUMBER)
1101    IS
1102           SELECT por.object_id_from2
1103           FROM pa_object_relationships por
1104           WHERE
1105           por.object_type_to = 'PA_DELIVERABLES'
1106       AND por.relationship_subtype IN  ('STRUCTURE_TO_DELIVERABLE', 'TASK_TO_DELIVERABLE')
1107       AND por.relationship_type = 'A'
1108       AND por.object_id_to2 = c_del_elem_id
1109       ;
1110    l_del_task_id NUMBER;
1111 
1112    CURSOR cur_pa_ppc_dlv(c_task_id NUMBER)
1113    IS
1114      SELECT max( date_computed )
1115        FROM pa_percent_completes
1116       WHERE project_id = p_Project_ID
1117         AND ((c_task_id IS NULL AND object_id =p_object_id) OR (c_task_id IS NOT NULL AND object_id IN (c_task_id, p_object_id)))
1118         AND current_flag = 'Y'
1119         AND published_flag = 'Y'
1120         AND object_type IN ('PA_DELIVERABLES' ,'PA_TASKS')
1121         AND structure_type = p_structure_type
1122     AND NVL(task_id, -1) = NVL(p_task_id, NVL(task_id, -1))
1123     ;
1124 
1125 
1126    CURSOR cur_pa_proj_prg_attr
1127    IS
1128      SELECT progress_cycle_id
1129        FROM pa_proj_progress_attr
1130       WHERE project_id = p_project_id
1131       AND structure_type = p_structure_type;
1132 
1133    CURSOR cur_pa_proj
1134    IS
1135    SELECT start_date, completion_date
1136      FROM pa_projects_all
1137     WHERE project_id = p_project_id;
1138 
1139 
1140    l_last_progress_date  DATE;
1141    l_progress_cycle_id   NUMBER;
1142    l_return_date         DATE;
1143 
1144   l_proj_finish_date    DATE;
1145   l_proj_start_date     DATE;
1146 
1147   l_cycle_type     varchar2(30);
1148   l_value1         number;
1149   cursor get_cycle_info is
1150   Select Billing_Cycle_Type, Billing_Value1
1151   From    PA_Billing_Cycles
1152   Where   Billing_Cycle_ID = l_progress_cycle_id;
1153 
1154 BEGIN
1155    ---5226910(5212999)
1156    OPEN cur_pa_proj_prg_attr;
1157    FETCH cur_pa_proj_prg_attr INTO l_progress_cycle_id;
1158    CLOSE cur_pa_proj_prg_attr;
1159 
1160    if (p_start_date is null) then
1161      OPEN cur_pa_proj;
1162      FETCH cur_pa_proj INTO l_proj_start_date, l_proj_finish_date;
1163      CLOSE cur_pa_proj;
1164 
1165      -- Bug  3974627 Commented
1166      --OPEN cur_pa_ppc;
1167      --FETCH cur_pa_ppc INTO l_last_progress_date;
1168      --CLOSE cur_pa_ppc;
1169 
1170      -- Bug  3974627 Begin
1171      IF p_object_type IN ('PA_TASKS', 'PA_STRUCTURES') THEN
1172     OPEN cur_pa_ppc_str_task;
1173     FETCH cur_pa_ppc_str_task INTO l_last_progress_date;
1174     CLOSE cur_pa_ppc_str_task;
1175      ELSIF p_object_type = 'PA_ASSIGNMENTS' THEN
1176     OPEN cur_pa_ppc_asgn;
1177     FETCH cur_pa_ppc_asgn INTO l_last_progress_date;
1178     CLOSE cur_pa_ppc_asgn;
1179      ELSIF p_object_type = 'PA_DELIVERABLES' THEN
1180         OPEN cur_dlv_get_asso_task(p_object_id);
1181     FETCH cur_dlv_get_asso_task INTO l_del_task_id;
1182     CLOSE cur_dlv_get_asso_task;
1183 
1184     OPEN cur_pa_ppc_dlv(l_del_task_id);
1185     FETCH cur_pa_ppc_dlv INTO l_last_progress_date;
1186     CLOSE cur_pa_ppc_dlv;
1187      END IF;
1188      -- Bug  3974627 End
1189 
1190      IF l_last_progress_date IS NULL
1191      THEN
1192         ----l_last_progress_date := NVL( l_proj_start_date, TRUNC(SYSDATE) );
1193         l_last_progress_date := TRUNC(SYSDATE)-1;
1194      END IF;
1195 
1196      --- as of date to remain same if in future  5226910 (5212999)
1197      if (l_last_progress_date >= trunc(sysdate)) then
1198          open get_cycle_info;
1199          fetch get_cycle_info into l_cycle_type, l_value1;
1200          close get_cycle_info;
1201          If l_Cycle_Type = 'BILLING CYCLE DAYS' Then
1202             l_last_progress_date := l_last_progress_date -l_value1;
1203          else
1204             l_last_progress_date := l_last_progress_date -1;
1205          end if;
1206      else
1207          l_last_progress_date := l_last_progress_date;
1208      end if;
1209    else
1210      l_last_progress_date := p_start_date;
1211    end if;
1212 
1213      OPEN cur_pa_proj_prg_attr;
1214      FETCH cur_pa_proj_prg_attr INTO l_progress_cycle_id;
1215      CLOSE cur_pa_proj_prg_attr;
1216 
1217      if (l_progress_cycle_id is not null) then
1218         l_return_date := PA_Billing_Cycles_Pkg.Get_Next_Billing_Date
1219                     (X_Project_ID          => p_Project_ID,
1220                      X_Project_Start_Date  => l_last_progress_date,
1221                      X_Billing_Cycle_ID    => l_progress_cycle_id,
1222                      X_Billing_Offset_Days => 0,
1223                      X_Bill_Thru_Date      => l_proj_finish_date,
1224                      X_Last_Bill_Thru_Date => l_last_progress_date );
1225      else
1226         l_return_date := l_last_progress_date + 1;
1227      end if;
1228 
1229      RETURN ( l_return_date );
1230 END get_next_progress_cycle;
1231 
1232 
1233 
1234 FUNCTION get_prog_dt_closest_to_sys_dt(
1235  p_project_id NUMBER,
1236  p_task_id NUMBER, -- From deliverables it will be passed as null
1237  p_object_id NUMBER := null, -- FPM Development Bug 3420093
1238  p_object_type VARCHAR2 := 'PA_TASKS', -- FPM Development Bug 3420093
1239  p_structure_type VARCHAR2 := 'WORKPLAN'
1240 ) RETURN DATE IS
1241    l_last_progress_date  DATE;
1242    l_progress_cycle_id   NUMBER;
1243    l_return_date         DATE;
1244    l_next_progress_date  DATE;
1245    l_dates_array         PA_VC_1000_10 := PA_VC_1000_10(1000);
1246    l_previous_date_index NUMBER;
1247    l_next_date_index     NUMBER;
1248    l_prev_diff           NUMBER;
1249    l_next_diff           NUMBER;
1250    l_closest_date        DATE;
1251    l_date_index          NUMBER;
1252 
1253 
1254    CURSOR cur_pa_proj
1255    IS
1256    SELECT start_date, completion_date
1257      FROM pa_projects_all
1258     WHERE project_id = p_project_id;
1259 
1260 -- Bug  3974627 : Commented this cursor and added new ones
1261 /*
1262    CURSOR cur_pa_ppc
1263    IS
1264      SELECT max( date_computed )
1265        FROM pa_percent_completes
1266       WHERE project_id = p_Project_ID
1267 --        AND object_id    = p_task_id
1268         AND object_id    = decode(p_object_id, null, p_task_id, p_object_id) -- This is Done to avoid the impact
1269         AND object_type = p_object_type
1270         AND current_flag = 'Y'
1271         AND published_flag = 'Y'
1272         AND structure_type = p_structure_type
1273     AND NVL(task_id, -1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id, NVL(task_id, -1)), NVL(p_task_id,p_object_id))
1274     --and task_id = p_task_id
1275     ;
1276 */
1277 
1278 -- Bug  3974627 : Added Cursors cur_pa_ppc_str_task, cur_pa_ppc_asgn, cur_pa_ppc_dlv
1279    CURSOR cur_pa_ppc_str_task
1280    IS
1281      SELECT max( date_computed )
1282        FROM pa_percent_completes
1283       WHERE project_id = p_Project_ID
1284         AND object_id = decode(p_object_id, null, p_task_id, p_object_id)
1285         AND current_flag = 'Y'
1286         AND published_flag = 'Y'
1287         AND object_type = p_object_type
1288         AND structure_type = p_structure_type
1289     AND task_id = NVL(p_task_id,p_object_id)
1290     ;
1291 
1292    CURSOR cur_pa_ppc_asgn
1293    IS
1294      SELECT max( date_computed )
1295        FROM pa_percent_completes
1296       WHERE project_id = p_Project_ID
1297         AND current_flag = 'Y'
1298         AND published_flag = 'Y'
1299         AND ((object_type = 'PA_ASSIGNMENTS' and object_id = p_object_id)
1300              or (object_type = 'PA_TASKS' and object_id = p_task_id))
1301         AND structure_type = p_structure_type
1302         AND task_id = p_task_id
1303         ;
1304 
1305    CURSOR cur_dlv_get_asso_task(c_del_elem_id NUMBER)
1306    IS
1307           SELECT por.object_id_from2
1308           FROM pa_object_relationships por
1309           WHERE
1310           por.object_type_to = 'PA_DELIVERABLES'
1311       AND por.relationship_subtype IN  ('STRUCTURE_TO_DELIVERABLE', 'TASK_TO_DELIVERABLE')
1312       AND por.relationship_type = 'A'
1313       AND por.object_id_to2 = c_del_elem_id
1314       ;
1315    l_del_task_id NUMBER;
1316 
1317    CURSOR cur_pa_ppc_dlv_notask
1318    IS
1319      SELECT max( date_computed )
1320        FROM pa_percent_completes
1321       WHERE project_id = p_Project_ID
1322         AND object_id = p_object_id
1323         AND current_flag = 'Y'
1324         AND published_flag = 'Y'
1325         AND object_type = 'PA_DELIVERABLES'
1326         AND structure_type = p_structure_type
1327         AND NVL(task_id, -1) = NVL(p_task_id, NVL(task_id, -1))
1328         ;
1329 
1330    CURSOR cur_pa_ppc_dlv_task(c_task_id NUMBER)
1331    IS
1332      SELECT max( date_computed )
1333        FROM pa_percent_completes
1334       WHERE project_id = p_Project_ID
1335         AND ((object_id = p_object_id and object_type = 'PA_DELIVERABLES') or
1336             (object_id = p_task_id and object_type = 'PA_TASKS'))
1337         AND current_flag = 'Y'
1338         AND published_flag = 'Y'
1339         AND structure_type = p_structure_type
1340         ;
1341   CURSOR cur_pa_ppc_w
1342    IS
1343      SELECT max( date_computed )
1344        FROM pa_percent_completes
1345       WHERE project_id = p_Project_ID
1346 --        AND object_id    = p_task_id
1347         AND object_id    = decode(p_object_id, null, p_task_id, p_object_id) -- This is Done to avoid the impact
1348         AND object_type = p_object_type
1349         AND current_flag = 'N'
1350         AND published_flag = 'N'
1351         AND structure_type = p_structure_type
1352         AND NVL(task_id, -1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id, NVL(task_id, -1)), NVL(p_task_id,p_object_id)) /* Amit : Modified for IB4 Progress CR. */
1353     --and task_id = p_task_id /* Modified for IB4 Progress CR. */;
1354     ;
1355 
1356    CURSOR cur_pa_proj_prg_attr
1357    IS
1358      SELECT progress_cycle_id
1359        FROM pa_proj_progress_attr
1360       WHERE project_id = p_project_id
1361       AND structure_type = p_structure_type;
1362 
1363   l_proj_finish_date    DATE;
1364   l_proj_start_date     DATE;
1365   l_valid_as_of_date varchar2(1);
1366 
1367   l_cycle_type     varchar2(30);
1368   l_value1         number;
1369   cursor get_cycle_info is
1370   Select Billing_Cycle_Type, Billing_Value1
1371   From    PA_Billing_Cycles
1372   Where   Billing_Cycle_ID = l_progress_cycle_id;
1373 
1374 BEGIN
1375      OPEN cur_pa_proj;
1376      FETCH cur_pa_proj INTO l_proj_start_date, l_proj_finish_date;
1377      CLOSE cur_pa_proj;
1378 
1379      OPEN cur_pa_ppc_w;
1380      FETCH cur_pa_ppc_w INTO l_last_progress_date;
1381      CLOSE cur_pa_ppc_w;
1382 
1383      IF p_object_type = 'PA_TASKS' THEN -- This is Done to avoid the impact
1384         l_valid_as_of_date := CHECK_VALID_AS_OF_DATE ( l_last_progress_date, p_project_id, p_task_id);
1385      ELSE
1386         l_valid_as_of_date := CHECK_VALID_AS_OF_DATE ( l_last_progress_date, p_project_id, p_object_id, p_object_type,p_task_id/* Amit : Modified for IB4 Progress CR. */ );
1387      END IF;
1388 
1389 
1390 
1391      if (l_last_progress_date is not null) then
1392          IF l_valid_as_of_date = 'Y'
1393          THEN
1394              return l_last_progress_date;
1395          --if the there is working version and the progress cycle id is cahnegd then return the next valid date.
1396          --we do not need to write any else here.
1397          END IF;
1398      end if;
1399 
1400      -- Bug  3974627 : Commented
1401      --OPEN cur_pa_ppc;
1402      --FETCH cur_pa_ppc INTO l_last_progress_date;
1403      --CLOSE cur_pa_ppc;
1404 
1405      -- Bug  3974627 Begin
1406      IF p_object_type IN ('PA_TASKS', 'PA_STRUCTURES') THEN
1407     OPEN cur_pa_ppc_str_task;
1408     FETCH cur_pa_ppc_str_task INTO l_last_progress_date;
1409     CLOSE cur_pa_ppc_str_task;
1410      ELSIF p_object_type = 'PA_ASSIGNMENTS' THEN
1411     OPEN cur_pa_ppc_asgn;
1412     FETCH cur_pa_ppc_asgn INTO l_last_progress_date;
1413     CLOSE cur_pa_ppc_asgn;
1414      ELSIF p_object_type = 'PA_DELIVERABLES' THEN
1415     OPEN cur_dlv_get_asso_task(p_object_id);
1416     FETCH cur_dlv_get_asso_task INTO l_del_task_id;
1417     CLOSE cur_dlv_get_asso_task;
1418 
1419         if l_del_task_id is not null then
1420             OPEN cur_pa_ppc_dlv_task(l_del_task_id);
1421             FETCH cur_pa_ppc_dlv_task INTO l_last_progress_date;
1422             CLOSE cur_pa_ppc_dlv_task;
1423         else
1424             OPEN cur_pa_ppc_dlv_notask;
1425             FETCH cur_pa_ppc_dlv_notask INTO l_last_progress_date;
1426             CLOSE cur_pa_ppc_dlv_notask;
1427         end if;
1428      END IF;
1429      -- Bug  3974627 End
1430 
1431      IF l_last_progress_date IS NULL
1432      THEN
1433         l_last_progress_date := trunc(sysdate)-1; -----NVL( l_proj_start_date, TRUNC(SYSDATE) );
1434      END IF;
1435 
1436 --------my_error_msg( 'l_last_progress_date '|| l_last_progress_date );
1437 
1438      OPEN cur_pa_proj_prg_attr;
1439      FETCH cur_pa_proj_prg_attr INTO l_progress_cycle_id;
1440      CLOSE cur_pa_proj_prg_attr;
1441 
1442      --- as of date to remain same if in future 5212999
1443      if (l_last_progress_date >= trunc(sysdate)) then
1444         open get_cycle_info;
1445          fetch get_cycle_info into l_cycle_type, l_value1;
1446          close get_cycle_info;
1447          If l_Cycle_Type = 'BILLING CYCLE DAYS' Then
1448             l_last_progress_date := l_last_progress_date -l_value1;
1449          else
1450             l_next_progress_date := l_last_progress_date -1;
1451          end if;
1452      else
1453          l_next_progress_date := l_last_progress_date;
1454      end if;
1455      IF l_progress_cycle_id IS NULL
1456      THEN
1457          RETURN l_last_progress_date + 1;
1458      END IF;
1459 
1460   WHILE NVL( l_return_date, SYSDATE ) <= SYSDATE
1461   LOOP
1462      l_return_date := PA_Billing_Cycles_Pkg.Get_Next_Billing_Date
1463                     (X_Project_ID          => p_Project_ID,
1464                      X_Project_Start_Date  => l_last_progress_date,
1465                      X_Billing_Cycle_ID    => l_progress_cycle_id,
1466                      X_Billing_Offset_Days => 0,
1467                      X_Bill_Thru_Date      => l_proj_finish_date,
1468                      X_Last_Bill_Thru_Date => l_next_progress_date );
1469 
1470      l_date_index := NVL( l_date_index, 0 ) + 1;
1471 
1472      l_dates_array.extend(1);
1473      l_dates_array(l_date_index) := to_char(l_return_date, 'MM-DD-RR');
1474 
1475      l_next_progress_date := l_return_date;
1476 
1477      IF l_date_index >= 999  -- Bug 3795916, changed from 1000 to 999
1478      THEN
1479         exit;
1480      END IF;
1481 
1482   END LOOP;
1483 
1484 --  FOR i in 1..1000 LOOP Modified for bug 3795916
1485   FOR i in l_dates_array.FIRST..l_dates_array.LAST LOOP
1486       IF  to_date( l_dates_array(i), 'MM-DD-RR' ) >= TRUNC(SYSDATE)  -- Added trunc for bug 3795916
1487       THEN
1488          IF i > 1
1489          THEN
1490              l_previous_date_index := i - 1;
1491          ELSE
1492              l_previous_date_index := i;
1493          END IF;
1494          l_next_date_index := i;
1495          exit;
1496       END IF;
1497   END LOOP;
1498 
1499   l_prev_diff := SYSDATE - to_date( l_dates_array(l_previous_date_index), 'MM-DD-RR' );
1500   l_next_diff := to_date( l_dates_array(l_next_date_index), 'MM-DD-RR' ) - SYSDATE;
1501 
1502   IF l_prev_diff < l_next_diff
1503   THEN
1504     l_closest_date := to_date( l_dates_array(l_previous_date_index), 'MM-DD-RR' );
1505   ELSE
1506     l_closest_date := to_date( l_dates_array(l_next_date_index), 'MM-DD-RR' );
1507   END IF;
1508 
1509   RETURN ( l_closest_date );
1510 
1511 END get_prog_dt_closest_to_sys_dt;
1512 
1513 --aod --as of date
1514 --This function returns 'N' if there does not exists any progress
1515 --on passed as_of_date otherwise it
1516 --will return 'WORKING' or 'PUBLISHED' progress depending on the
1517 --publish flag.
1518 FUNCTION check_prog_exists_on_aod(
1519  p_project_id       NUMBER,
1520  p_object_type      VARCHAR2,
1521  p_object_version_id NUMBER,
1522  p_task_id NUMBER := null/* Amit : Modified for IB4 Progress CR. */     ,
1523  p_as_of_date DATE,
1524  p_structure_type VARCHAR2 := 'WORKPLAN' -- FPM Development Bug 3420093
1525  ,p_object_id   NUMBER := null /* Modified for IB4 Progress CR. */
1526 ) RETURN VARCHAR2 IS
1527 
1528   CURSOR cur_ppc
1529   IS
1530     SELECT decode( published_flag, 'Y', 'PUBLISHED', 'N', 'WORKING' )
1531       FROM pa_percent_completes
1532      WHERE object_id = nvl(p_object_id, p_task_id) /* Modified for IB4 Progress CR. */
1533        AND object_type = p_object_type
1534        AND project_id  = p_project_id
1535        AND date_computed = p_as_of_date
1536        AND structure_type = p_structure_type
1537        and NVL(task_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id,NVL(task_id,-1)),NVL(p_task_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
1538        order by published_flag;  --bug 4185364
1539   l_return_value   VARCHAR2(15);
1540 BEGIN
1541     OPEN cur_ppc;
1542     FETCH cur_ppc INTO l_return_value;
1543     CLOSE cur_ppc;
1544     RETURN NVL( l_return_value, 'N' );
1545 END check_prog_exists_on_aod;
1546 
1547 FUNCTION get_ppc_id(
1548  p_project_id    NUMBER
1549 ,p_object_id     NUMBER
1550 ,p_object_type   VARCHAR2
1551 ,p_object_version_id  NUMBER
1552 ,p_as_of_date    DATE
1553 ,p_structure_type VARCHAR2 := 'WORKPLAN' -- FPM Development Bug 3420093
1554 ,p_task_id NUMBER := null /* Modified for IB4 Progress CR. */
1555 ) RETURN NUMBER IS
1556 
1557    CURSOR cur_ppc_id
1558    IS
1559      SELECT percent_complete_id
1560        FROM pa_percent_completes
1561       WHERE object_type = p_object_type
1562         AND object_id = p_object_id
1563         AND project_id = p_project_id
1564 --        AND object_version_id = p_object_version_id
1565         AND date_computed = p_as_of_date
1566         AND structure_type = p_structure_type
1567         and NVL(task_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id,NVL(task_id,-1)),NVL(p_task_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
1568     --and task_id = nvl(p_task_id, p_object_id)  /* Modified for IB4 Progress CR. */
1569        order by published_flag  --bug 4185364
1570        ;
1571 
1572    l_ppc_id NUMBER;
1573 
1574 BEGIN
1575 
1576    OPEN cur_ppc_id;
1577    FETCH cur_ppc_id INTO l_ppc_id;
1578    CLOSE cur_ppc_id;
1579 
1580    RETURN l_ppc_id;
1581 
1582 END get_ppc_id;
1583 
1584 FUNCTION get_prog_rollup_id(
1585  p_project_id    NUMBER
1586 ,p_object_id     NUMBER
1587 ,p_object_type   VARCHAR2
1588 ,p_object_version_id NUMBER
1589 ,p_as_of_date    DATE
1590 ,p_structure_type VARCHAR2 := 'WORKPLAN' -- FPM Development Bug 3420093
1591 ,p_structure_version_id NUMBER := null -- FPM Development Bug 3420093
1592 ,x_record_version_number OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
1593 ,p_proj_element_id NUMBER := null /* Modified for IB4 Progress CR. */
1594 ,p_action          VARCHAR2 := 'PUBLISH' -- Bug 3879461
1595  ) RETURN NUMBER
1596 IS
1597 
1598    CURSOR cur_prog_rollup_id_pub_wp
1599    IS
1600      SELECT progress_rollup_id, record_version_number
1601        FROM pa_progress_rollup
1602       WHERE object_type = p_object_type
1603         AND object_id = p_object_id
1604         AND project_id = p_project_id
1605 --        AND object_version_id = p_object_version_id
1606         AND as_of_date = p_as_of_date
1607         AND structure_type = p_structure_type
1608         AND structure_version_id is null
1609     and ((p_action = 'SAVE' AND current_flag = 'W') OR (p_action = 'PUBLISH' AND current_flag IN ('Y', 'N'))) -- Bug 3879461
1610         and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */;
1611     --and proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
1612 
1613 
1614    CURSOR cur_prog_rollup_id_work_wp
1615    IS
1616      SELECT progress_rollup_id, record_version_number
1617        FROM pa_progress_rollup
1618       WHERE object_type = p_object_type
1619         AND object_id = p_object_id
1620         AND project_id = p_project_id
1621         AND structure_type = p_structure_type
1622         AND structure_version_id = p_structure_version_id
1623         and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */;
1624     --and proj_element_id = nvl(p_proj_element_id,p_object_id) /* Modified for IB4 Progress CR. */;
1625 
1626    l_prog_rollup_id NUMBER;
1627 
1628 BEGIN
1629 
1630 IF p_structure_version_id is NULL THEN
1631    OPEN cur_prog_rollup_id_pub_wp;
1632    FETCH cur_prog_rollup_id_pub_wp INTO l_prog_rollup_id, x_record_version_number;
1633    CLOSE cur_prog_rollup_id_pub_wp;
1634 ELSE
1635    OPEN cur_prog_rollup_id_work_wp;
1636    FETCH cur_prog_rollup_id_work_wp INTO l_prog_rollup_id, x_record_version_number;
1637    CLOSE cur_prog_rollup_id_work_wp;
1638 END IF;
1639 
1640    RETURN l_prog_rollup_id;
1641 
1642 END get_prog_rollup_id;
1643 
1644 FUNCTION check_task_has_progress(
1645 p_task_id    NUMBER ) RETURN VARCHAR2 IS
1646 
1647 --Added for performance improvements bug 2679612
1648   CURSOR cur_proj_elem
1649   IS
1650     SELECT project_id
1651      FROM pa_proj_elements
1652     WHERE proj_element_id = p_task_id;
1653     l_project_id          NUMBER;
1654 --Added for performance improvements bug 2679612
1655 
1656     CURSOR cur_pa_prog_exists(c_project_id NUMBER )
1657     IS
1658       SELECT 'X'
1659         FROM pa_percent_completes
1660        WHERE object_id = p_task_id
1661          AND project_id = c_project_id;
1662     l_dummy_char    VARCHAR2(1);
1663 BEGIN
1664 
1665 --Added for performance improvements bug 2679612
1666    OPEN cur_proj_elem;
1667    FETCH cur_proj_elem INTO l_project_id;
1668    CLOSE cur_proj_elem;
1669 --Added for performance improvements bug 2679612
1670 
1671     OPEN cur_pa_prog_exists( l_project_id );
1672     FETCH cur_pa_prog_exists INTO l_dummy_char;
1673     IF cur_pa_prog_exists%FOUND
1674     THEN
1675        CLOSE cur_pa_prog_exists;
1676        RETURN 'Y';
1677     ELSE
1678        CLOSE cur_pa_prog_exists;
1679        RETURN 'N';
1680     END IF;
1681 
1682 END check_task_has_progress;
1683 
1684 -- FPM Dev CR 3 : This function is not used.
1685 FUNCTION get_last_cumulative(
1686  p_project_id    NUMBER
1687 ,p_object_id     NUMBER
1688 ,p_object_type   VARCHAR2
1689 ,p_as_of_date    DATE )
1690 RETURN NUMBER IS
1691  -- 4348710 : Added structure_type and structure_version_id joins
1692    CURSOR cur_cumla
1693    IS
1694      SELECT cumulative_work_quantity
1695        FROM pa_progress_rollup
1696       WHERE project_id = p_project_id
1697         AND object_id = p_object_id
1698         AND object_type = p_object_type
1699     AND structure_type = 'WORKPLAN'
1700     AND structure_version_id is null
1701         AND as_of_date = ( SELECT max( as_of_date )
1702                              FROM pa_progress_rollup
1703                             WHERE project_id = p_project_id
1704                               AND object_id = p_object_id
1705                               AND object_type = p_object_type
1706                               AND as_of_date < p_as_of_date
1707                   AND structure_type = 'WORKPLAN'
1708                   AND structure_version_id is null
1709                   );
1710 
1711    l_cumulative_work_qty NUMBER;
1712 BEGIN
1713      OPEN cur_cumla;
1714      FETCH cur_cumla INTO l_cumulative_work_qty;
1715      CLOSE cur_cumla;
1716      RETURN NVL( l_cumulative_work_qty, 0 );
1717 END get_last_cumulative;
1718 
1719 FUNCTION get_planned_wq(
1720  p_project_id    NUMBER
1721 ,p_object_id     NUMBER
1722 ,p_object_version_id NUMBER ) RETURN NUMBER IS
1723 
1724  CURSOR cur_prj_sch
1725  IS
1726     SELECT NVL( wq_planned_quantity, 0 )
1727       FROM pa_proj_elem_ver_schedule
1728      WHERE project_id = p_project_id
1729        AND proj_element_id = p_object_id
1730        AND element_version_id = p_object_version_id;
1731  l_planned_qty   NUMBER;
1732 BEGIN
1733      OPEN cur_prj_sch;
1734      FETCH cur_prj_sch INTO l_planned_qty;
1735      CLOSE cur_prj_sch;
1736      ----my_error_msg( 'p_object_version_id '|| p_object_version_id );
1737      ----my_error_msg( 'l_planned_qty '|| l_planned_qty );
1738      RETURN NVL( l_planned_qty, 0 );
1739 END get_planned_wq;
1740 
1741 PROCEDURE clear_prog_outdated_flag(
1742  p_project_id    NUMBER
1743 ,p_object_id     NUMBER
1744 ,p_object_type   VARCHAR2
1745 ,p_structure_version_id   NUMBER   default null    --bug 3851528
1746 ,x_return_status              OUT       NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1747 ,x_msg_count          OUT       NOCOPY NUMBER --File.Sql.39 bug 4440895
1748 ,x_msg_data                 OUT         NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1749 ) IS
1750 
1751   l_proj_element_id     NUMBER;
1752 
1753 BEGIN
1754      x_return_status := FND_API.G_RET_STS_SUCCESS;
1755 
1756   IF p_structure_version_id IS NULL
1757   THEN
1758      IF p_object_type = 'PA_TASKS'
1759      THEN
1760          l_proj_element_id := p_object_id;
1761          UPDATE pa_proj_elements
1762             SET progress_outdated_flag = 'N'
1763            WHERE proj_element_id = l_proj_element_id;
1764      ELSIF p_object_type = 'PA_STRUCTURES'
1765      THEN
1766          UPDATE pa_proj_elements ppe
1767             SET progress_outdated_flag = 'N'
1768           WHERE proj_element_id = ( SELECT proj_element_id
1769                                       FROM pa_proj_structure_types ppst
1770                                      WHERE ppst.structure_type_id = 1      --WORKPLAN
1771                                        AND ppst.proj_element_id = ppe.proj_element_id )
1772             AND project_id = p_project_id;
1773      END IF;
1774   ELSIF p_structure_version_id IS NOT NULL
1775   THEN
1776         UPDATE pa_proj_elements
1777            SET progress_outdated_flag = 'N'
1778         WHERE proj_element_id in ( SELECT proj_element_id
1779                                      FROM pa_proj_element_versions
1780                                      WHERE project_id = p_project_id
1781                                        AND parent_structure_version_id = p_structure_version_id
1782                                        AND object_type in ( 'PA_STRUCTURES', 'PA_TASKS' )  )
1783         AND object_type in ( 'PA_STRUCTURES', 'PA_TASKS' )
1784         AND project_id = p_project_id
1785         ;
1786   END IF;
1787 
1788 EXCEPTION
1789     WHEN FND_API.G_EXC_ERROR THEN
1790       x_return_status := FND_API.G_RET_STS_ERROR;
1791     WHEN OTHERS THEN
1792       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1793       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
1794                               p_procedure_name => 'clear_prog_outdated_flag',
1795                               p_error_text     => SUBSTRB(SQLERRM,1,120));
1796       x_msg_count := FND_MSG_PUB.count_msg;
1797       x_msg_data := SUBSTRB(SQLERRM,1,120) ; -- 4537865
1798       RAISE;
1799 END clear_prog_outdated_flag;
1800 
1801 
1802 -- FPM Development Bug 3420093
1803 PROCEDURE get_project_progress_defaults(
1804  p_project_id                   NUMBER
1805 ,p_structure_type               IN VARCHAR2
1806 ,x_WQ_ENABLED_FLAG              OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1807 ,x_EFFORT_ENABLED_FLAG          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1808 ,x_PERCENT_COMP_ENABLED_FLAG    OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1809 ,x_task_weight_basis_code       OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1810 ,X_ALLOW_COLLAB_PROG_ENTRY      OUT NOCOPY VARCHAR2  --File.Sql.39 bug 4440895
1811 ,X_ALLW_PHY_PRCNT_CMP_OVERRIDES OUT NOCOPY VARCHAR2  --File.Sql.39 bug 4440895
1812 ) IS
1813 
1814   CURSOR cur_prg_deflts
1815     IS
1816       SELECT
1817         WQ_ENABLE_FLAG,
1818         REMAIN_EFFORT_ENABLE_FLAG,
1819         PERCENT_COMP_ENABLE_FLAG,
1820         task_weight_basis_code,
1821         ALLOW_COLLAB_PROG_ENTRY,
1822         ALLOW_PHY_PRCNT_CMP_OVERRIDES
1823        FROM pa_proj_progress_attr
1824        WHERE project_id = p_project_id
1825          AND structure_type = p_structure_type;
1826 
1827 BEGIN
1828      OPEN cur_prg_deflts;
1829      FETCH cur_prg_deflts INTO x_WQ_ENABLED_FLAG
1830                               ,x_EFFORT_ENABLED_FLAG
1831                               ,x_PERCENT_COMP_ENABLED_FLAG
1832                               ,x_task_weight_basis_code
1833                               ,X_ALLOW_COLLAB_PROG_ENTRY
1834                               ,X_ALLW_PHY_PRCNT_CMP_OVERRIDES;
1835      CLOSE cur_prg_deflts;
1836 
1837 -- 4537865
1838 EXCEPTION
1839 WHEN OTHERS THEN
1840 
1841     x_WQ_ENABLED_FLAG              := NULL ;
1842     x_EFFORT_ENABLED_FLAG          := NULL ;
1843     x_PERCENT_COMP_ENABLED_FLAG    := NULL ;
1844     x_task_weight_basis_code       := NULL ;
1845     x_ALLOW_COLLAB_PROG_ENTRY      := NULL ;
1846     x_ALLW_PHY_PRCNT_CMP_OVERRIDES := NULL ;
1847 
1848       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
1849                               p_procedure_name => 'get_project_progress_defaults',
1850                               p_error_text     => SUBSTRB(SQLERRM,1,240));
1851       raise;
1852 
1853 END get_project_progress_defaults;
1854 
1855 
1856 -- This API should be used to get the progress setup values at the project and task type level.
1857 -- This will not be used for deliverable type values
1858 PROCEDURE get_progress_defaults(
1859  p_project_id                   NUMBER
1860 ,p_object_version_id            NUMBER
1861 ,p_object_type                  VARCHAR2
1862 ,p_object_id                    NUMBER
1863 ,p_as_of_date                   DATE
1864 ,p_structure_type               VARCHAR2 := 'WORKPLAN'  -- FPM Development Bug 3420093
1865 ,x_WQ_ACTUAL_ENTRY_CODE         OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1866 ,x_WQ_ENABLED_FLAG              OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1867 ,x_EFFORT_ENABLED_FLAG          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1868 ,x_BASE_PERCENT_COMP_DERIV_CODE OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1869 ,x_PERCENT_COMP_ENABLED_FLAG    OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1870 ,X_PROGRESS_ENTRY_ENABLE_FLAG    OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1871 ,X_ALLOW_COLLAB_PROG_ENTRY      OUT NOCOPY VARCHAR2 -- FPM Development Bug 3420093 --File.Sql.39 bug 4440895
1872 ,X_ALLW_PHY_PRCNT_CMP_OVERRIDES OUT NOCOPY VARCHAR2 -- FPM Development Bug 3420093 --File.Sql.39 bug 4440895
1873 ,x_task_weight_basis_code       OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1874 ) IS
1875 
1876    /*  replacing this sql with the following for bug 2679612
1877     CURSOR cur_prg_deflts
1878     IS
1879       SELECT WQ_ACTUAL_ENTRY_CODE, WQ_ENABLED_FLAG,
1880              EFFORT_ENABLED_FLAG, BASE_PERCENT_COMP_DERIV_CODE,
1881              PERCENT_COMP_ENABLED_FLAG, PROG_ENTRY_ENABLE_FLAG
1882         FROM PA_LATEST_proj_TASK_PROG_V
1883        WHERE project_id = p_project_id
1884          AND task_id = p_object_id
1885          AND object_type = p_object_type
1886          ;
1887          --AND element_version_id = p_object_version_id
1888          --AND as_of_date = p_as_of_date;
1889 */
1890 
1891   CURSOR cur_prg_deflts
1892     IS
1893       SELECT
1894         nvl(ppe.WQ_ACTUAL_ENTRY_CODE,ptt.ACTUAL_WQ_ENTRY_CODE),
1895         decode(ppe.object_type,'PA_STRUCTURES',pppa.WQ_ENABLE_FLAG,
1896                decode(ptt.WQ_ENABLE_FLAG, 'Y', decode(pppa.WQ_ENABLE_FLAG, 'Y', 'Y', 'N'), 'N')),
1897         decode(ppe.object_type,'PA_STRUCTURES',pppa.REMAIN_EFFORT_ENABLE_FLAG,
1898                decode(ptt.REMAIN_EFFORT_ENABLE_FLAG, 'Y', decode(pppa.REMAIN_EFFORT_ENABLE_FLAG, 'Y', 'Y', 'N'), 'N')),
1899         NVL( ppe.base_percent_comp_deriv_code, ptt.base_percent_comp_deriv_code),
1900         decode(ppe.object_type,'PA_STRUCTURES',pppa.PERCENT_COMP_ENABLE_FLAG,
1901                decode(ptt.PERCENT_COMP_ENABLE_FLAG, 'Y', decode(pppa.PERCENT_COMP_ENABLE_FLAG, 'Y', 'Y','N'), 'N')),
1902         decode(ppe.object_type,'PA_TASKS',ptt.PROG_ENTRY_ENABLE_FLAG,'Y'),
1903         pppa.ALLOW_COLLAB_PROG_ENTRY,
1904         pppa.ALLOW_PHY_PRCNT_CMP_OVERRIDES,
1905         pppa.TASK_WEIGHT_BASIS_CODE
1906        FROM pa_proj_elements ppe, pa_task_types ptt, pa_proj_progress_attr pppa, pa_proj_elem_ver_structure ppvs, pa_proj_structure_types ppst
1907        WHERE ppe.project_id = p_project_id
1908          AND ppe.proj_element_id = p_object_id
1909          AND ppe.object_type = p_object_type
1910          AND ppe.type_id = ptt.task_type_id(+)
1911          AND ppvs.project_id = pppa.project_id(+)
1912          AND pppa.structure_type = p_structure_type
1913          AND ppe.project_id = ppvs.project_id
1914          AND ppvs.latest_eff_published_flag = 'Y'
1915          AND ppvs.proj_element_id = pppa.object_id(+)
1916          AND ppvs.proj_element_id = ppst.proj_element_id
1917          AND ptt.object_type(+) = 'PA_TASKS'  /* bug 3279978 FP M Enhancement */ --bug 4330450 added outer join
1918          AND ppst.structure_type_id =1;
1919 
1920 BEGIN
1921      OPEN cur_prg_deflts;
1922      FETCH cur_prg_deflts INTO x_WQ_ACTUAL_ENTRY_CODE
1923                               ,x_WQ_ENABLED_FLAG
1924                               ,x_EFFORT_ENABLED_FLAG
1925                               ,x_BASE_PERCENT_COMP_DERIV_CODE
1926                               ,x_PERCENT_COMP_ENABLED_FLAG
1927                               ,X_PROGRESS_ENTRY_ENABLE_FLAG
1928                               ,X_ALLOW_COLLAB_PROG_ENTRY
1929                               ,X_ALLW_PHY_PRCNT_CMP_OVERRIDES
1930                               ,x_task_weight_basis_code
1931                                ;
1932      CLOSE cur_prg_deflts;
1933 
1934      /*x_WQ_ACTUAL_ENTRY_CODE := 'INCREMENTAL';
1935      x_WQ_ENABLED_FLAG := 'Y';
1936      x_EFFORT_ENABLED_FLAG := 'Y';
1937 --     x_BASE_PERCENT_COMP_DERIV_CODE
1938      x_PERCENT_COMP_ENABLED_FLAG := 'Y';*/
1939 --  4537865
1940 EXCEPTION
1941 WHEN OTHERS THEN
1942     x_WQ_ENABLED_FLAG              := NULL ;
1943     x_EFFORT_ENABLED_FLAG          := NULL ;
1944     x_BASE_PERCENT_COMP_DERIV_CODE := NULL ;
1945     x_PERCENT_COMP_ENABLED_FLAG    := NULL ;
1946     X_PROGRESS_ENTRY_ENABLE_FLAG   := NULL ;
1947     X_ALLOW_COLLAB_PROG_ENTRY      := NULL ;
1948     X_ALLW_PHY_PRCNT_CMP_OVERRIDES := NULL ;
1949     x_task_weight_basis_code       := NULL ;
1950       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
1951                               p_procedure_name => 'get_progress_defaults',
1952                               p_error_text     => SUBSTRB(SQLERRM,1,240));
1953       raise;
1954 END get_progress_defaults;
1955 
1956 FUNCTION chk_prg_since_last_prg(
1957  p_project_id                   NUMBER
1958 ,p_percent_complete_id          NUMBER
1959 ,p_object_type                  VARCHAR2
1960 ,p_object_id                    NUMBER
1961 ,p_task_id          NUMBER := null /* Modified for IB4 Progress CR. */
1962 ) RETURN VARCHAR2 IS
1963 BEGIN
1964 
1965   IF Working_version_exist(
1966        p_task_id          => p_task_id --nvl(p_task_id, p_object_id) /* Amit : Modified for IB4 Progress CR. */
1967       ,p_project_id       => p_project_id
1968       ,p_object_type      => p_object_type
1969       ,p_object_id    => p_object_id /* Modified for IB4 Progress CR. */
1970       )  IS NOT NULL
1971   THEN
1972      RETURN 'Y';
1973   ELSE
1974      RETURN 'N';
1975   END IF;
1976 
1977 END chk_prg_since_last_prg;
1978 
1979 /*
1980 FUNCTION check_project_has_progress(
1981 p_project_id    NUMBER ,
1982 p_object_id     NUMBER) RETURN VARCHAR2 IS
1983     CURSOR cur_pa_prog_exists
1984     IS
1985       SELECT 'X'
1986         FROM pa_percent_completes
1987        WHERE project_id = p_project_id
1988          AND object_id = decode(nvl(p_object_id,0),0,object_id,p_object_id)
1989          AND object_type = 'PA_STRUCTURES'
1990          AND task_id = 0;
1991     l_dummy_char    VARCHAR2(1);
1992 BEGIN
1993     OPEN cur_pa_prog_exists;
1994     FETCH cur_pa_prog_exists INTO l_dummy_char;
1995     IF cur_pa_prog_exists%FOUND
1996     THEN
1997        CLOSE cur_pa_prog_exists;
1998        RETURN 'Y';
1999     ELSE
2000        CLOSE cur_pa_prog_exists;
2001        RETURN 'N';
2002     END IF;
2003 END check_project_has_progress;
2004 */
2005 
2006 FUNCTION check_project_has_progress(
2007  	 p_project_id    NUMBER ,
2008  	 p_object_id     NUMBER,
2009  	 p_structure_type VARCHAR2 := null) RETURN VARCHAR2 IS     -- added a new parameter for the BUG 6903050
2010 CURSOR cur_pa_prog_exists
2011 IS
2012  SELECT 'X'
2013    FROM pa_percent_completes
2014   WHERE project_id = p_project_id
2015     AND object_id = decode(nvl(p_object_id,0),0,object_id,p_object_id)
2016     AND object_type = 'PA_STRUCTURES'
2017     AND task_id = 0;
2018 
2019 CURSOR cur_pa_prog_exists_wp          -- added a new cursor for the BUG 6903050
2020     IS
2021      SELECT 'X'
2022        FROM pa_percent_completes
2023       WHERE project_id = p_project_id
2024         AND object_id = decode(nvl(p_object_id,0),0,object_id,p_object_id)
2025         AND object_type = 'PA_STRUCTURES'
2026         AND task_id = 0
2027         AND STRUCTURE_TYPE = p_structure_type;
2028 
2029 l_dummy_char    VARCHAR2(1);
2030 BEGIN
2031 
2032     IF (p_structure_type = 'WORKPLAN')    -- added a new check for WORKPLAN for the BUG 6903050
2033     THEN
2034       OPEN  cur_pa_prog_exists_wp;
2035       FETCH cur_pa_prog_exists_wp INTO l_dummy_char;
2036       IF cur_pa_prog_exists_wp%FOUND
2037       THEN
2038         CLOSE cur_pa_prog_exists_wp;
2039         RETURN 'Y';
2040       ELSE
2041         CLOSE cur_pa_prog_exists_wp;
2042         RETURN 'N';
2043       END IF;
2044 
2045     ELSE
2046       OPEN cur_pa_prog_exists;
2047       FETCH cur_pa_prog_exists INTO l_dummy_char;
2048       IF cur_pa_prog_exists%FOUND
2049       THEN
2050         CLOSE cur_pa_prog_exists;
2051         RETURN 'Y';
2052       ELSE
2053         CLOSE cur_pa_prog_exists;
2054         RETURN 'N';
2055       END IF;
2056     END IF;
2057 END check_project_has_progress;
2058 
2059 FUNCTION get_task_prog_profile(
2060 p_profile_name    VARCHAR2 ) RETURN VARCHAR2
2061 IS
2062 BEGIN
2063     RETURN ( fnd_profile.value_specific(p_profile_name, fnd_global.user_id ) );
2064 END get_task_prog_profile;
2065 
2066 -- this function is modified to return working record only upto the passed as of date
2067 FUNCTION Working_version_exist(
2068      p_task_id          NUMBER := null /* Amit : Modified for IB4 Progress CR. */
2069     ,p_project_id       NUMBER
2070     ,p_object_type      VARCHAR2
2071     ,p_object_id    NUMBER := null /* Modified for IB4 Progress CR. */
2072     ,p_as_of_date       DATE := null  -- bug 4185364
2073     ) RETURN DATE IS
2074 
2075     CURSOR cur_pa_pcc
2076     IS
2077       SELECT date_computed
2078         FROM pa_percent_completes
2079        WHERE project_id = p_project_id
2080          AND object_id = nvl(p_object_id, p_task_id)  /* Modified for IB4 Progress CR. */
2081          AND object_type = p_object_type
2082      AND structure_type = 'WORKPLAN' -- FPM Dev CR 3
2083          AND published_flag = 'N'
2084          AND current_flag = 'N'
2085          and NVL(task_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id,NVL(task_id,-1)),NVL(p_task_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
2086      and trunc(date_computed) <= trunc(p_as_of_date); --bug 4185364
2087      --and task_id = p_task_id /* Modified for IB4 Progress CR. */;
2088 
2089      l_return_date  DATE := null;
2090 BEGIN
2091 
2092      OPEN cur_pa_pcc;
2093      FETCH cur_pa_pcc INTO l_return_date;
2094      CLOSE  cur_pa_pcc;
2095      RETURN l_return_date;
2096 END Working_version_exist;
2097 
2098 FUNCTION check_status_referenced(
2099 p_status_code    VARCHAR2 ) RETURN BOOLEAN
2100 is
2101  Cursor c_percent_complete
2102  is
2103   select 'X' from pa_percent_completes
2104   where ( progress_status_code = p_status_code
2105   or status_code = p_status_code)
2106   AND rownum <= 1;
2107 
2108  Cursor c_prog_rollup
2109  is
2110    select 'X' from pa_progress_rollup
2111    where ( progress_status_code = p_status_code
2112    or base_progress_status_code = p_status_code
2113    or eff_rollup_prog_stat_code = p_status_code)
2114    AND rownum <= 1;
2115 
2116  Cursor c_proj_elements
2117  is
2118  select 'X' from pa_proj_elements
2119  where status_code = p_status_code
2120    AND rownum <= 1;
2121 
2122  Cursor c_proj_elem_ver_structure
2123  is
2124  select 'X' from pa_proj_elem_ver_structure
2125  where status_code = p_status_code
2126   AND rownum <= 1;
2127 
2128  Cursor c_task_types
2129  is
2130  select 'X' from pa_task_types
2131  where ( initial_status_code = p_status_code
2132  or initial_progress_status_code = p_status_code)
2133  AND object_type = 'PA_TASKS' /* bug 3279978 FP M Enhancement */
2134  AND rownum <= 1;
2135 
2136  l_return_value boolean := FALSE;
2137  l_dummy  varchar2(1);
2138 
2139  Begin
2140    open c_percent_complete;
2141    fetch c_percent_complete into l_dummy;
2142    if (c_percent_complete%FOUND) then
2143      l_return_value := TRUE;
2144    end if;
2145    close c_percent_complete;
2146 
2147    -- Check referense in pa_progress_rollup
2148    if(NOT l_return_value) then
2149      open c_prog_rollup;
2150      fetch c_prog_rollup into l_dummy;
2151      if(c_prog_rollup%FOUND) then
2152        l_return_value := TRUE;
2153      end if;
2154      close c_prog_rollup;
2155    end if;
2156    -- Check referense in pa_proj_elements
2157    if(NOT l_return_value) then
2158      open c_proj_elements;
2159      fetch c_proj_elements into l_dummy;
2160      if(c_proj_elements%FOUND) then
2161        l_return_value := TRUE;
2162      end if;
2163      close c_proj_elements;
2164    end if;
2165 
2166    -- Check referense in pa_proj_elem_ver_structure
2167    if(NOT l_return_value) then
2168      open c_proj_elem_ver_structure;
2169      fetch c_proj_elem_ver_structure into l_dummy;
2170      if(c_proj_elem_ver_structure%FOUND) then
2171        l_return_value := TRUE;
2172      end if;
2173      close c_proj_elem_ver_structure;
2174    end if;
2175    -- Check referense in pa_task_types
2176    if(NOT l_return_value) then
2177      open c_task_types;
2178      fetch c_task_types into l_dummy;
2179      if(c_task_types%FOUND) then
2180        l_return_value := TRUE;
2181      end if;
2182      close c_task_types;
2183    end if;
2184 
2185    return l_return_value;
2186 
2187  End check_status_referenced;
2188 
2189 -- FPM Dev CR 3 : Not Used
2190 FUNCTION GET_LATEST_AS_OF_DATE2(
2191     p_task_id      NUMBER
2192     ,p_as_of_date  DATE ) RETURN DATE IS
2193 
2194 --Added for performance improvements bug 2679612
2195   CURSOR cur_proj_elem
2196   IS
2197     SELECT project_id
2198      FROM pa_proj_elements
2199     WHERE proj_element_id = p_task_id;
2200     l_project_id          NUMBER;
2201 --Added for performance improvements bug 2679612
2202 
2203   CURSOR cur_ppc(c_project_id NUMBER )
2204   IS
2205     SELECT MAX( date_computed )
2206       FROM pa_percent_completes
2207      WHERE object_id = p_task_id
2208        AND project_id = c_project_id
2209        AND date_computed < p_as_of_Date
2210     ;
2211   l_as_of_date  DATE;
2212 BEGIN
2213 
2214      OPEN cur_proj_elem;
2215      FETCH cur_proj_elem INTO l_project_id;
2216      CLOSE cur_proj_elem;
2217 
2218      OPEN cur_ppc( l_project_id );
2219      FETCH cur_ppc INTO l_as_of_date;
2220      CLOSE cur_ppc;
2221      RETURN l_as_of_date ;
2222 
2223 exception when others then
2224      return null;
2225 
2226 END GET_LATEST_AS_OF_DATE2;
2227 
2228 FUNCTION is_parent_on_hold(
2229    p_object_version_id     NUMBER
2230 ) RETURN VARCHAR2 IS
2231     CURSOR cur_pa_proj
2232     IS
2233       SELECT ppe.status_code
2234         FROM pa_object_relationships por,
2235              pa_proj_element_versions ppev,
2236              pa_proj_elements ppe,
2237              pa_project_statuses pps
2238        WHERE object_id_to1 = p_object_version_id
2239          AND ppev.element_version_id = por.object_id_from1
2240          AND ppev.proj_element_id = ppe.proj_element_id
2241          AND ppev.object_type = ppe.object_type
2242          AND ppe.object_type = 'PA_TASKS'
2243          AND ppe.status_code = pps.project_status_code
2244          AND pps.project_system_status_code = 'ON_HOLD';
2245 
2246    l_status_code   VARCHAR2(150);
2247 BEGIN
2248      OPEN cur_pa_proj;
2249      FETCH cur_pa_proj INTO l_status_code;
2250      IF cur_pa_proj%FOUND
2251      THEN
2252          CLOSE cur_pa_proj;
2253          RETURN 'Y';
2254      ELSE
2255          CLOSE cur_pa_proj;
2256          RETURN 'N';
2257      END IF;
2258 END is_parent_on_hold;
2259 
2260 FUNCTION get_task_status(
2261   p_project_id     NUMBER
2262  ,p_object_id     NUMBER
2263  , p_object_type  VARCHAR2 := 'PA_TASKS' -- FPM Development Bug 3420093
2264  ) RETURN VARCHAR2 IS
2265 
2266    CURSOR cur_pa_proj_elems
2267    IS
2268      SELECT status_code
2269        FROM pa_proj_elements
2270       WHERE proj_element_id = p_object_id
2271         AND project_id      = p_project_id
2272         AND object_type = p_object_type;
2273 
2274     l_status_code VARCHAR2(150);
2275 BEGIN
2276     OPEN cur_pa_proj_elems;
2277     FETCH cur_pa_proj_elems INTO l_status_code;
2278     CLOSE cur_pa_proj_elems;
2279     RETURN l_status_code;
2280 END get_task_status;
2281 
2282 
2283 FUNCTION get_system_task_status(
2284  p_status_code   VARCHAR2
2285 ,p_object_type   VARCHAR2 := 'PA_TASKS' -- FPM Development Bug 3420093
2286  ) RETURN VARCHAR2 IS
2287 
2288    CURSOR cur_sys_status
2289    IS
2290      SELECT project_system_status_code
2291        FROM pa_project_statuses pps   -----, fnd_lookup_values flv
2292       WHERE project_status_code = p_status_code
2293         AND status_type = decode(p_object_type, 'PA_TASKS', 'TASK', 'PA_DELIVERABLES', 'DELIVERABLE');
2294     /*  bug 4699567 flv was not used in the query anyways
2295         AND lookup_type = decode(p_object_type, 'PA_TASKS', 'TASK_SYSTEM_STATUS', 'PA_DELIVERABLES', 'DELIVERABLE_SYSTEM_STATUS')
2296         AND language = 'US'; */
2297 
2298     l_status_code VARCHAR2(150);
2299 BEGIN
2300     OPEN cur_sys_status;
2301     FETCH cur_sys_status INTO l_status_code;
2302     CLOSE cur_sys_status;
2303     RETURN l_status_code;
2304 END get_system_task_status;
2305 
2306 Function is_cycle_ok_to_delete(p_progress_cycle_id  IN  NUMBER) return
2307 varchar2
2308 IS
2309    cursor prog_cycle is
2310    select 'N'
2311     from pa_proj_progress_attr
2312    where progress_cycle_id = p_progress_cycle_id
2313    and structure_type = 'WORKPLAN';-- FPM Dev CR 3
2314 
2315    retval   varchar2(1);
2316    l_prog_cycle  prog_cycle%rowtype;
2317 
2318 Begin
2319   open prog_cycle;
2320   fetch prog_cycle into l_prog_cycle;
2321   if prog_cycle%found then
2322       close prog_cycle;
2323       return 'N';
2324   else
2325       close prog_cycle;
2326       return 'Y';
2327   end if;
2328 End is_cycle_ok_to_delete;
2329 
2330 -- FPM Dev CR 3 : Not Used
2331 function get_max_ppc_id(p_project_id   IN  NUMBER,
2332                         p_object_id    IN  NUMBER,
2333                         p_object_type  IN  VARCHAR2,
2334                         p_as_of_date   IN  DATE) return number is
2335 
2336 l_ppc_id      number;
2337 begin
2338 select nvl(max(percent_complete_id),-99)
2339             into l_ppc_id
2340             from pa_percent_completes
2341            where project_id = p_project_id
2342              and object_id = p_object_id
2343              and object_type = p_object_type
2344              and date_computed <= p_as_of_date;
2345 return l_ppc_id;
2346 
2347 exception when others then
2348   return -99;
2349 end get_max_ppc_id;
2350 
2351 function get_max_rollup_asofdate(p_project_id   IN  NUMBER,
2352                                  p_object_id    IN  NUMBER,
2353                                  p_object_type  IN  VARCHAR2,
2354                                  p_as_of_date   IN  DATE,
2355                                  p_object_version_id  IN  NUMBER,
2356                  p_structure_type IN VARCHAR2 := 'WORKPLAN', -- FPM Dev CR 3
2357                  p_structure_version_id NUMBER := NULL -- FPM Dev CR 4
2358                  ,p_proj_element_id NUMBER := null /* Modified for IB4 Progress CR. */
2359                  ) return date is
2360 l_rollup_date   date;
2361 begin
2362 
2363 /*     -- FPM Dev CR 4 : Added condition for PA_TASKS and structure_version_id
2364    if (((p_object_type = 'PA_TASKS') AND (nvl(PA_PROJ_ELEMENTS_UTILS.IS_LOWEST_TASK(p_task_version_id => p_object_version_id ),'N') = 'N')) OR p_structure_version_id is not null) then
2365 
2366            select max(as_of_date)
2367              into l_rollup_date
2368              from pa_progress_rollup
2369             where project_id = p_project_id
2370               and object_id = p_object_id
2371               and object_type = p_object_type
2372           and structure_type = p_structure_type -- FPM Dev CR 3
2373               and as_of_date <= p_as_of_date
2374           and ((p_structure_version_id is null AND structure_version_id is null) OR (p_structure_version_id is not null AND structure_version_id = p_structure_version_id)) -- FPM Dev CR 4
2375           ;
2376     else
2377            select max(as_of_date)
2378              into l_rollup_date
2379              from pa_progress_rollup
2380             where project_id = p_project_id
2381               and object_id = p_object_id
2382               and object_type = p_object_type
2383               and structure_type = p_structure_type -- FPM Dev CR 3
2384               and trunc(as_of_date) = (select max(trunc(date_computed))
2385                                        from pa_percent_completes
2386                                       where project_id = p_project_id
2387                                         and object_id = p_object_id
2388                                         and object_type = p_object_type
2389                         and structure_type = p_structure_type -- FPM Dev CR 3
2390                                         and published_flag = 'Y'
2391                                         and date_computed <= p_as_of_date);
2392     end if;
2393 */
2394 
2395 -- FPM Dev CR 6 : Commented the above code and added this new code to get the date.
2396            select max(as_of_date)
2397              into l_rollup_date
2398              from pa_progress_rollup
2399             where project_id = p_project_id
2400               and object_id = p_object_id
2401               and object_type = p_object_type
2402           and structure_type = p_structure_type
2403               and as_of_date <= p_as_of_date
2404           and ((p_structure_version_id is null AND structure_version_id is null) OR (p_structure_version_id is not null AND structure_version_id = p_structure_version_id))
2405               AND current_flag <> 'W'   -- Bug 3879461
2406 --        and as_of_date not in (select trunc(date_computed)
2407 --                       from pa_percent_completes
2408 --                                      where project_id = p_project_id
2409 --                                        and object_id = p_object_id
2410 --                                        and object_type = p_object_type
2411 --                      and structure_type = p_structure_type
2412 --                                        and published_flag = 'N'
2413 --                                        and date_computed <= p_as_of_date
2414 --                  and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES'
2415 -- , NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
2416 
2417 -- Begin fix for Bug # 4243074.
2418 
2419 and NVL(proj_element_id,-1) = DECODE(p_structure_type, 'FINANCIAL'
2420                              , DECODE(p_object_type, 'PA_STRUCTURES'
2421                                            , 0
2422                                        --bug 4250623, for deliverable dont compare with p_proj_element_id as it may not be associated with task
2423                                        --, (DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id))))
2424                                        , (DECODE(p_object_type, 'PA_DELIVERABLES', NVL(proj_element_id,-1),NVL(p_proj_element_id, p_object_id))))
2425                              --bug 4250623, for deliverable dont compare with p_proj_element_id as it may not be associated with task
2426                              --,(DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id))))
2427                              ,(DECODE(p_object_type, 'PA_DELIVERABLES', NVL(proj_element_id,-1),NVL(p_proj_element_id, p_object_id))))
2428 
2429 -- End fix for Bug # 4243074.
2430 
2431                     --and task_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
2432 --                                     )
2433 
2434 --              and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
2435 -- Commented out to fix Bug # 4243074.
2436 
2437           --and proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
2438           ;
2439 
2440 return l_rollup_date;
2441 
2442 exception when others then
2443   return null;
2444 end get_max_rollup_asofdate;
2445 
2446 function get_project_wq_flag(p_project_id  IN  NUMBER) return varchar2 is
2447   l_wq_enable_flag   varchar2(1);
2448 begin
2449    select wq_enable_flag
2450      into l_wq_enable_flag
2451      from pa_proj_progress_attr
2452     where project_id = p_project_id
2453       and object_Type = 'PA_STRUCTURES'
2454       and structure_type = 'WORKPLAN' -- FPM Dev CR 3
2455       ;
2456 
2457     return l_wq_enable_flag;
2458 exception when others then
2459     return 'N';
2460 end get_project_wq_flag;
2461 
2462 PROCEDURE copy_attachments (
2463   p_project_id                  IN NUMBER,
2464   p_object_id                   IN NUMBER,
2465   p_object_type                 IN VARCHAR2,
2466   p_from_pc_id                  IN NUMBER,
2467   p_to_pc_id                    IN NUMBER,
2468   x_return_status               OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2469   x_msg_count                   OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2470   x_msg_data                    OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2471 )
2472 IS
2473 cursor get_ppc_id is
2474   select percent_complete_id
2475     from pa_percent_completes
2476    where project_id = p_project_id
2477      and object_id = p_object_id
2478      and object_type = p_object_type
2479      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
2480      and published_flag = 'Y'
2481      and current_flag = 'Y';
2482 
2483  l_from_pc_id  NUMBER;
2484 BEGIN
2485 
2486   x_return_status := 'S';
2487   x_msg_count := 0;
2488   x_msg_data := '';
2489 
2490   if (p_from_pc_id is null) then
2491       open get_ppc_id;
2492       fetch get_ppc_id into l_from_pc_id;
2493       close get_ppc_id;
2494   else
2495       l_from_pc_id := p_from_pc_id;
2496   end if;
2497 
2498   if (l_from_pc_id is not null) then
2499     fnd_attached_documents2_pkg.copy_attachments(
2500       X_from_entity_name => 'PA_PERCENT_COMPLETES',
2501       X_from_pk1_value => l_from_pc_id,
2502       X_to_entity_name => 'PA_PERCENT_COMPLETES',
2503       X_to_pk1_value => p_to_pc_id,
2504       X_created_by => fnd_global.user_id,
2505       X_last_update_login => fnd_global.login_id);
2506   end if;
2507 
2508 
2509   fnd_msg_pub.count_and_get(p_count => x_msg_count,
2510                             p_data  => x_msg_data);
2511 
2512 
2513 EXCEPTION
2514   WHEN OTHERS THEN
2515     x_return_status := 'U';
2516     fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
2517                             p_procedure_name => 'COPY_ATTACHMENTS',
2518                             p_error_text     => SUBSTRB(SQLERRM,1,120));
2519 
2520     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2521                               p_data  => x_msg_data);
2522 END copy_attachments;
2523 
2524 
2525 function is_task_manager (p_task_id           IN  NUMBER,
2526                           p_project_id        IN  NUMBER,
2527                           p_user_id           IN  NUMBER) return varchar2 IS
2528 
2529   CURSOR l_get_task_manager(c_element_version_id NUMBER)
2530   IS
2531   SELECT ppe.manager_person_id
2532   FROM pa_proj_elements PPE,
2533        pa_proj_element_versions PPEV
2534   WHERE ppev.element_version_id = c_element_version_id
2535   AND ppev.proj_element_id = ppe.proj_element_id;
2536 
2537   CURSOR l_get_parent_task(c_element_version_id NUMBER)
2538   IS
2539   SELECT rel.object_id_from1
2540   FROM pa_object_relationships rel
2541   WHERE rel.object_id_to1 = c_element_version_id
2542   AND rel.object_type_to = 'PA_TASKS'
2543   AND rel.relationship_type = 'S'
2544   AND rel.object_type_from = 'PA_TASKS';
2545 
2546   CURSOR l_get_element_version_id(c_proj_element_id NUMBER, c_parent_structure_version_id NUMBER)
2547   IS
2548   SELECT ppev.element_version_id
2549   FROM pa_proj_element_versions ppev
2550   WHERE ppev.proj_element_id = c_proj_element_id
2551   AND ppev.parent_structure_version_id = c_parent_structure_version_id;
2552 
2553   CURSOR l_get_latest_pub_structure_ver
2554   IS
2555   SELECT ppevs.element_version_id
2556   FROM pa_proj_elem_ver_structure ppevs
2557   WHERE ppevs.project_id = p_project_id
2558   AND ppevs.latest_eff_published_flag = 'Y';
2559 
2560   l_person_id NUMBER;
2561   l_temp_person_id NUMBER;
2562   l_is_task_manager VARCHAR2(1);
2563   l_latest_pub_structure_ver_id NUMBER;
2564   l_element_version_id NUMBER;
2565 BEGIN
2566   l_is_task_manager := 'N';
2567   l_person_id := PA_UTILS.GetEmpIdFromUser(p_user_id);
2568 
2569 /*
2570   OPEN l_get_latest_pub_structure_ver;
2571   FETCH l_get_latest_pub_structure_ver INTO l_latest_pub_structure_ver_id;
2572   CLOSE l_get_latest_pub_structure_ver;
2573 */
2574 
2575   --Added the following line instead of the above cursor.
2576   l_latest_pub_structure_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION(p_project_id); --maansari7/22
2577 
2578   OPEN l_get_element_version_id(p_task_id, l_latest_pub_structure_ver_id);
2579   FETCH l_get_element_version_id INTO l_element_version_id;
2580   CLOSE l_get_element_version_id;
2581 
2582   WHILE((l_element_version_id is not NULL) AND (l_is_task_manager = 'N')) LOOP
2583     OPEN l_get_task_manager(l_element_version_id);
2584     FETCH l_get_task_manager INTO l_temp_person_id;
2585     CLOSE l_get_task_manager;
2586 
2587     if(l_person_id = l_temp_person_id) then
2588       l_is_task_manager := 'Y';
2589     end if;
2590 
2591     OPEN l_get_parent_task(l_element_version_id);
2592     FETCH l_get_parent_task INTO l_element_version_id;
2593     if l_get_parent_task%NOTFOUND then
2594       l_element_version_id := NULL;
2595     end if;
2596     CLOSE l_get_parent_task;
2597   END LOOP;
2598 
2599   return l_is_task_manager;
2600 
2601 EXCEPTION
2602   WHEN OTHERS THEN
2603     return 'N';
2604 END is_task_manager;
2605 
2606 -- Bug 3010538 : New API for the Task Weighting Enhancement.
2607 -- This is a function that returns the task weighting basis code given the project id.
2608 FUNCTION GET_TASK_WEIGHTING_BASIS(
2609     p_project_id  IN  pa_projects_all.project_id%TYPE
2610     , p_structure_type IN VARCHAR2 := 'WORKPLAN' -- FPM Dev CR 3
2611 )
2612 RETURN VARCHAR2 IS
2613      -- This cursor obtains the task weight basis code for the project id.
2614      Cursor cur_weight_basis_code (c_project_id pa_projects_all.project_id%TYPE)
2615      Is
2616      Select ppa.task_weight_basis_code
2617      From   pa_proj_progress_attr ppa,pa_proj_structure_types pst,pa_structure_types st
2618      Where  ppa.project_id  = c_project_id
2619      And    ppa.object_type = 'PA_STRUCTURES'
2620      And ppa.structure_type = p_structure_type -- FPM Dev CR 3
2621      And    ppa.object_id   = pst.proj_element_id
2622         And    st.structure_type = 'WORKPLAN'
2623      And    st.structure_type_id = pst.structure_type_id;
2624 
2625      l_weight_basis_code PA_PROJ_PROGRESS_ATTR.task_weight_basis_code%TYPE;
2626 BEGIN
2627      open cur_weight_basis_code(p_project_id);
2628      fetch cur_weight_basis_code into l_weight_basis_code;
2629      close cur_weight_basis_code;
2630 
2631      return l_weight_basis_code;
2632 
2633 END GET_TASK_WEIGHTING_BASIS;
2634 
2635 FUNCTION is_object_progressable(p_project_id            IN              NUMBER
2636                                 ,p_proj_element_id      IN              NUMBER
2637                                 ,p_object_id            IN              NUMBER
2638                                 ,p_object_type          IN              VARCHAR2) return VARCHAR2
2639 IS
2640     l_return_value      VARCHAR2(1) := 'N';
2641     l_status_code       VARCHAR2(150);
2642     l_system_status_code    VARCHAR2(30);
2643 BEGIN
2644     if (p_object_type = 'PA_STRUCTURES' or p_object_type = 'PA_ASSIGNMENTS') then
2645         l_return_value := 'Y';
2646     elsif (p_object_type = 'PA_TASKS') then
2647 
2648         select status_code
2649         into l_status_code
2650         from pa_proj_elements
2651         where project_id = p_project_id
2652         and proj_element_id = p_proj_element_id
2653         and object_type = p_object_type;
2654 
2655         l_system_status_code := pa_progress_utils.get_system_task_status(l_status_code);
2656 
2657 --Commented by rtarway for BUG 3762650
2658 --      if (l_system_status_code = 'CANCELLED' or l_system_status_code = 'ON_HOLD') then
2659             if (l_system_status_code = 'CANCELLED' ) then
2660 
2661             l_return_value := 'N';
2662         else
2663 
2664             select ptt.prog_entry_enable_flag
2665             into l_return_value
2666             from pa_proj_elements ppe, pa_task_types ptt
2667             where ppe.type_id = ptt.task_type_id(+)
2668             and ppe.project_id = p_project_id
2669             and ppe.proj_element_id = p_proj_element_id;
2670         end if;
2671     elsif (p_object_type = 'PA_DELIVERABLES') then
2672         l_return_value := PA_DELIVERABLE_UTILS.IS_DLV_PROGRESSABLE(p_project_id,p_proj_element_id);
2673     end if;
2674     return(l_return_value);
2675 END is_object_progressable;
2676 
2677 
2678 FUNCTION check_wp_working_prog_exists(p_project_id            IN              NUMBER
2679                                 ,p_structure_version_id      IN              NUMBER
2680                 ) return VARCHAR2
2681 IS
2682    l_return_value    VARCHAR2(1) := 'Y';
2683 BEGIN
2684    RETURN l_return_value;
2685 END check_wp_working_prog_exists;
2686 
2687 
2688 FUNCTION is_pc_override_allowed(p_project_id            IN              NUMBER
2689                                 ,p_structure_type        IN              VARCHAR2 := 'WORKPLAN'
2690                 ) return VARCHAR2
2691 IS
2692    l_return_value    VARCHAR2(1) := 'N';
2693    l_percent_comp_enable_flag VARCHAR2(1) := NULL;
2694    l_allow_phy_prcnt_cmp_overrds VARCHAR2(1) := NULL;
2695 
2696     cursor c1(p_project_id NUMBER, p_structure_type VARCHAR2) is
2697         select percent_comp_enable_flag,allow_phy_prcnt_cmp_overrides
2698         from pa_proj_progress_attr
2699         where project_id = p_project_id
2700         and structure_type = p_structure_type;
2701 
2702     l_c1rec c1%rowtype;
2703 
2704 BEGIN
2705     open c1(p_project_id, p_structure_type);
2706     fetch c1 into l_c1rec;
2707     close c1;
2708 
2709     if (l_c1rec.percent_comp_enable_flag = 'N') then
2710         l_return_value := l_c1rec.percent_comp_enable_flag;
2711     else
2712         l_return_value := l_c1rec.allow_phy_prcnt_cmp_overrides;
2713     end if;
2714 
2715     RETURN l_return_value;
2716 
2717 END is_pc_override_allowed;
2718 
2719 FUNCTION calculate_percentage( p_actual_value   NUMBER
2720                                ,p_planned_value  NUMBER ) return NUMBER
2721 IS
2722 BEGIN
2723    RETURN ((p_actual_value/p_planned_value)*100);
2724 END calculate_percentage;
2725 
2726 FUNCTION GET_EARLIEST_AS_OF_DATE(
2727      p_project_id   NUMBER
2728     ,p_object_id   NUMBER
2729     ,p_object_type VARCHAR2
2730     ,p_structure_type VARCHAR2 := 'WORKPLAN' -- FPM Development Bug 3420093
2731     ,p_task_id     NUMBER := null /* Modified for IB4 Progress CR. */
2732     ) RETURN DATE IS
2733 
2734   CURSOR cur_ppc
2735   IS
2736     SELECT min(date_computed)
2737       FROM pa_percent_completes
2738      WHERE object_id = p_object_id
2739        AND project_id = p_project_id
2740        and object_type = p_object_type
2741        AND structure_type = p_structure_type
2742        and NVL(task_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id,NVL(task_id,-1)),NVL(p_task_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
2743        --and task_id = nvl(p_task_id, p_object_id) /* Modified for IB4 Progress CR. */;
2744        ;
2745   l_as_of_date  DATE;
2746 BEGIN
2747 
2748      OPEN cur_ppc;
2749      FETCH cur_ppc INTO l_as_of_date;
2750      CLOSE cur_ppc;
2751      RETURN l_as_of_date ;
2752 
2753 exception when others then
2754      return null;
2755 
2756 END GET_EARLIEST_AS_OF_DATE;
2757 
2758 FUNCTION check_assignment_exists(
2759      p_project_id   NUMBER
2760     ,p_object_version_id   NUMBER
2761     ,p_object_type VARCHAR2
2762     ,p_structure_type VARCHAR2 := 'WORKPLAN' -- FPM Development Bug 3420093
2763  ) RETURN VARCHAR2
2764 IS
2765 
2766 l_return_value VARCHAR2(1) := 'Y';
2767 
2768 BEGIN
2769 
2770     l_return_value := pa_task_assignment_utils.check_asgmt_exists_in_task(p_object_version_id);
2771 
2772     RETURN (l_return_value);
2773 END check_assignment_exists;
2774 
2775 -- Bug 3633293 : Added check_deliverable_exists
2776 FUNCTION check_deliverable_exists(
2777      p_project_id   NUMBER
2778     ,p_object_id    NUMBER
2779  ) RETURN VARCHAR2
2780 IS
2781 l_return_value VARCHAR2(1) := 'Y';
2782 l_dummy VARCHAR2(1);
2783 CURSOR c_get_del_associated_task IS
2784    SELECT 'x'
2785    FROM pa_proj_elements ppe,
2786     pa_object_relationships por,
2787     pa_task_types ttype
2788    WHERE
2789               ppe.object_type = 'PA_TASKS'
2790           and ppe.proj_element_id = por.object_id_from2
2791           and por.object_type_from = 'PA_TASKS'
2792           and por.object_type_to = 'PA_DELIVERABLES'
2793           and por.relationship_type = 'A'
2794           and por.relationship_subtype = 'TASK_TO_DELIVERABLE'
2795           and nvl(ppe.base_percent_comp_deriv_code,ttype.base_percent_comp_deriv_code)='DELIVERABLE'
2796       and ppe.proj_element_id = p_object_id
2797       and ppe.type_id = ttype.task_type_id;
2798 
2799 BEGIN
2800     OPEN c_get_del_associated_task;
2801     FETCH c_get_del_associated_task INTO l_dummy;
2802     IF c_get_del_associated_task%NOTFOUND THEN
2803         l_return_value := 'N';
2804     ELSE
2805         l_return_value := 'Y';
2806     END IF;
2807     CLOSE c_get_del_associated_task;
2808     RETURN (l_return_value);
2809 END check_deliverable_exists;
2810 
2811 FUNCTION get_last_effort(
2812      p_project_id   NUMBER
2813     ,p_object_id   NUMBER
2814     ,p_object_type VARCHAR2
2815     ,p_as_of_date  DATE
2816     ,p_structure_type VARCHAR2 := 'WORKPLAN' -- FPM Development Bug 3420093
2817     ,p_proj_element_id NUMBER := null /* Modified for IB4 Progress CR. */
2818 ) RETURN NUMBER IS
2819 
2820   CURSOR cur_task_effort
2821   IS
2822     SELECT NVL( EQPMT_ACT_EFFORT_TO_DATE, 0 ) + NVL( PPL_ACT_EFFORT_TO_DATE, 0 ) + nvl(oth_quantity_to_date,0)
2823      FROM pa_progress_rollup
2824     WHERE  project_id = p_project_id
2825      AND   object_id  = p_object_id
2826      --Commented by rtarway for BUG 3835474
2827      /*AND   as_of_date = ( SELECT max(as_of_date)
2828                            from pa_progress_rollup
2829                           WHERE as_of_date < p_as_of_date
2830                            AND  project_id = p_project_id
2831                            AND object_id  = p_object_id
2832                            AND object_type = p_object_type
2833                            AND structure_type = p_structure_type
2834                            and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR.
2835                    --and proj_element_id = nvl(p_proj_element_id, p_object_id)  Modified for IB4 Progress CR.
2836                        )*/
2837      --Added by rtarway for BUG 3835474
2838      AND   as_of_date = ( SELECT max(as_of_date)
2839                            from pa_progress_rollup ppr2
2840                           WHERE ppr2.as_of_date <= p_as_of_date
2841                            AND  ppr2.project_id = p_project_id
2842                            AND ppr2.object_id  = p_object_id
2843                            AND ppr2.object_type = p_object_type
2844                            AND ppr2.structure_type = p_structure_type
2845                AND ppr2.current_flag <> 'W'   -- Bug 3879461
2846                AND ppr2.structure_version_id is null   -- Bug 3879461
2847                            and NVL(ppr2.proj_element_id,-1)
2848                            = DECODE(p_object_type, 'PA_DELIVERABLES',
2849                                     NVL(p_proj_element_id,
2850                                         NVL(ppr2.proj_element_id,-1)),
2851                                     NVL(p_proj_element_id, p_object_id)
2852                                    ) /* Amit : Modified for IB4 Progress CR. */
2853 --                           AND NOT EXISTS
2854 --                           (
2855 --                      SELECT 'X' FROM pa_percent_completes ppc
2856 --                      WHERE ppc.date_computed = ppr2.as_of_date
2857 --                      AND   ppc.project_id = p_project_id
2858 --                      AND   ppc.object_id  = p_object_id
2859 --                      AND   ppc.object_type = p_object_type
2860 --                      AND   ppc.structure_type = p_structure_type
2861 --                      AND   ppc.published_flag = 'N'
2862 --                           )
2863                       )
2864      AND   object_type = p_object_type
2865      AND structure_type = p_structure_type
2866      AND current_flag <> 'W'   -- Bug 3879461
2867      AND structure_version_id is null   -- Bug 3879461
2868      and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
2869      --and proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
2870     ;
2871     l_last_submitted_effort    NUMBER;
2872 BEGIN
2873 
2874     OPEN cur_task_effort;
2875     FETCH cur_task_effort INTO l_last_submitted_effort;
2876     CLOSE cur_task_effort;
2877 
2878     RETURN l_last_submitted_effort;
2879 END get_last_effort;
2880 
2881 FUNCTION get_last_cost(
2882      p_project_id   NUMBER
2883     ,p_object_id   NUMBER
2884     ,p_object_type VARCHAR2
2885     ,p_as_of_date  DATE
2886     ,p_structure_type VARCHAR2 := 'WORKPLAN' -- FPM Development Bug 3420093
2887     ,p_proj_element_id NUMBER := null /* Modified for IB4 Progress CR. */
2888 ) RETURN NUMBER IS
2889 
2890   CURSOR cur_task_cost
2891   IS
2892     SELECT (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)+nvl(ppr.eqpmt_act_cost_to_date_tc,0))
2893      FROM pa_progress_rollup ppr
2894     WHERE  ppr.project_id = p_project_id
2895      AND   ppr.object_id  = p_object_id
2896      AND   ppr.as_of_date = ( SELECT max(as_of_date)
2897                            from pa_progress_rollup ppr2
2898                           WHERE ppr2.as_of_date < p_as_of_date
2899                            AND  ppr2.project_id = p_project_id
2900                            AND ppr2.object_id  = p_object_id
2901                            AND ppr2.object_type = p_object_type
2902                            AND ppr2.structure_type = p_structure_type
2903                AND ppr2.current_flag <> 'W'   -- Bug 3879461
2904                AND ppr2.structure_version_id is null   -- Bug 3879461
2905                        and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
2906                        --and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
2907                        )
2908      AND   ppr.object_type = p_object_type
2909      AND ppr.structure_type = p_structure_type
2910      AND ppr.current_flag <> 'W'   -- Bug 3879461
2911      AND ppr.structure_version_id is null   -- Bug 3879461
2912      and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
2913      --and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
2914      ;
2915 
2916   l_last_submitted_cost    NUMBER;
2917 
2918 BEGIN
2919 
2920     OPEN cur_task_cost;
2921     FETCH cur_task_cost INTO l_last_submitted_cost;
2922     CLOSE cur_task_cost;
2923 
2924     RETURN l_last_submitted_cost;
2925 END get_last_cost;
2926 
2927 
2928 -- Bug 4372462 : Rewritten this API again...
2929 
2930 PROCEDURE convert_currency_amounts(
2931   p_api_version                 IN      NUMBER          :=1.0
2932  ,p_init_msg_list               IN      VARCHAR2        :=FND_API.G_TRUE
2933  ,p_commit                      IN      VARCHAR2        :=FND_API.G_FALSE
2934  ,p_validate_only               IN      VARCHAR2        :=FND_API.G_TRUE
2935  ,p_validation_level            IN      NUMBER          :=FND_API.G_VALID_LEVEL_FULL
2936  ,p_calling_module              IN      VARCHAR2        :='SELF_SERVICE'
2937  ,p_debug_mode                  IN      VARCHAR2        :='N'
2938  ,p_max_msg_count               IN      NUMBER          :=PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2939  ,p_project_id                  IN      NUMBER
2940  ,p_task_id                     IN      NUMBER
2941  ,p_as_of_date                  IN      DATE
2942  ,P_txn_cost                    IN      NUMBER
2943  ,P_txn_curr_code               IN      VARCHAR2
2944  ,p_structure_version_id        IN      NUMBER      -- Bug 3627787
2945  ,p_calling_mode        IN  VARCHAR2        := 'ACTUAL_RATES' -- Bug 4372462
2946  ,p_budget_version_id           IN      NUMBER          := null -- Bug 4372462
2947  ,p_res_assignment_id           IN      NUMBER          := null -- Bug 4372462
2948  ,p_init_inout_vars             IN      VARCHAR2        := 'Y' -- Bug 4372462
2949  ,P_project_curr_code           IN OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2950  ,P_project_rate_type           IN OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2951  ,P_project_rate_date           IN OUT  NOCOPY DATE --File.Sql.39 bug 4440895
2952  ,P_project_exch_rate           IN OUT  NOCOPY NUMBER --File.Sql.39 bug 4440895
2953  ,P_project_raw_cost            IN OUT  NOCOPY NUMBER --File.Sql.39 bug 4440895
2954  ,P_projfunc_curr_code          IN OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2955  ,P_projfunc_cost_rate_type     IN OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2956  ,P_projfunc_cost_rate_date     IN OUT  NOCOPY DATE --File.Sql.39 bug 4440895
2957  ,P_projfunc_cost_exch_rate     IN OUT  NOCOPY NUMBER --File.Sql.39 bug 4440895
2958  ,P_projfunc_raw_cost           IN OUT  NOCOPY NUMBER --File.Sql.39 bug 4440895
2959  ,x_return_status               OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2960  ,x_msg_count                   OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
2961  ,x_msg_data                    OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2962 ) IS
2963 
2964 l_api_name           CONSTANT   VARCHAR2(30)    := 'CONVERT_CURRENCY_AMOUNTS';
2965 l_api_version        CONSTANT   NUMBER          := p_api_version;
2966 l_user_id                       NUMBER          := FND_GLOBAL.USER_ID;
2967 l_login_id                      NUMBER          := FND_GLOBAL.LOGIN_ID;
2968 l_return_status                 VARCHAR2(1);
2969 l_msg_count                     NUMBER;
2970 
2971 --bug 3828542
2972 l_status               VARCHAR2(30);
2973 
2974 CURSOR ou_exp_org_id IS
2975 SELECT org_id from pa_implementations;
2976 
2977 -- Bug 4372462 : written new cursor proj_all
2978 --CURSOR proj_all IS
2979 --SELECT project_currency_code, projfunc_currency_code
2980 --FROM pa_projects_all
2981 --WHERE project_id = p_project_id;
2982 
2983 CURSOR proj_all IS
2984 SELECT ppa.project_currency_code,
2985     ppfo.project_cost_rate_type,
2986     ppfo.project_cost_rate_date_type,
2987     ppfo.project_cost_rate_date,
2988     ppa.projfunc_currency_code,
2989     ppfo.projfunc_cost_rate_type,
2990     ppfo.projfunc_cost_rate_date_type,
2991     ppfo.projfunc_cost_rate_date,
2992     ppfo.proj_fp_options_id
2993 FROM pa_projects_all ppa,
2994     pa_proj_fp_options ppfo
2995 WHERE ppa.project_id = p_project_id
2996 and ppfo.fin_plan_type_id = (select fin_plan_type_id
2997             from pa_fin_plan_types_b
2998                where use_for_workplan_flag = 'Y')
2999 and ppfo.project_id = p_project_id
3000 and ppfo.fin_plan_option_level_code = 'PLAN_TYPE';
3001 
3002 -- Bug 4372462 Begin
3003 --- get the override conversion rates for PC and PFC
3004 CURSOR bgt_line_rates(c_budget_version_id NUMBER, c_res_assignment_id NUMBER, c_txn_curr_code VARCHAR2, c_as_of_date Date) IS
3005 SELECT resource_assignment_id,
3006        start_date,
3007        end_date,
3008        project_cost_rate_type,
3009        project_cost_rate_date_type,
3010        project_cost_rate_date,
3011        project_cost_exchange_rate,
3012        projfunc_cost_rate_type,
3013        projfunc_cost_rate_date_type,
3014        projfunc_cost_rate_date,
3015        projfunc_cost_exchange_rate
3016 FROM pa_budget_lines
3017 where budget_version_id = c_budget_version_id
3018 and resource_assignment_id = c_res_assignment_id
3019 and c_as_of_date between start_date and end_date
3020 and txn_currency_code = c_txn_curr_code;
3021 
3022 --- get the user rates if rate tyep is User
3023 CURSOR user_cur_details(c_proj_fp_options_id NUMBER, c_txn_curr_code VARCHAR2) IS
3024 SELECT c.projfunc_cost_exchange_rate
3025   ,c.project_cost_exchange_rate
3026 FROM pa_fp_txn_currencies c
3027 WHERE c.proj_fp_options_id = c_proj_fp_options_id
3028 AND   c.txn_currency_code = c_txn_curr_code ;
3029 
3030 --- this cursor gets period set name and time phasing for project for use
3031 --- by next cursor defined
3032 CURSOR get_name_and_type_csr(c_budget_version_id NUMBER) IS
3033 SELECT gsb.period_set_name
3034     ,gsb.accounted_period_type
3035     ,pia.pa_period_type
3036     ,decode(pbv.version_type,
3037         'COST',ppfo.cost_time_phased_code,
3038         'REVENUE',ppfo.revenue_time_phased_code,
3039          ppfo.all_time_phased_code) time_phase_code
3040 FROM gl_sets_of_books           gsb
3041     ,pa_implementations_all pia
3042     ,pa_projects_all        ppa
3043     ,pa_budget_versions     pbv
3044     ,pa_proj_fp_options     ppfo
3045 WHERE ppa.project_id        = pbv.project_id
3046 AND pbv.budget_version_id = ppfo.fin_plan_version_id
3047 --AND nvl(ppa.org_id,-99)   = nvl(pia.org_id,-99)  R12: Bug 4363092:
3048 AND ppa.org_id   = pia.org_id
3049 AND gsb.set_of_books_id   = pia.set_of_books_id
3050 AND pbv.budget_version_id = c_budget_version_id;
3051 
3052 --- this cursor is used to get start_date and end_Date for periods
3053 --- need this for rate_date_type
3054 CURSOR get_gl_periods_csr(c_period_set_name VARCHAR2, c_accounted_period_type VARCHAR2, c_pa_period_type VARCHAR2, c_time_phase_code VARCHAR2, c_as_of_date Date ) IS
3055 SELECT START_DATE, END_DATE, PERIOD_NAME
3056 FROM gl_periods gp
3057 WHERE gp.period_set_name  = c_period_set_name
3058 AND gp.period_type      = decode(c_time_phase_code,'G',c_accounted_period_type,'P',c_pa_period_type)
3059 AND gp.adjustment_period_flag = 'N'
3060 AND gp.start_date  <= c_as_of_date
3061 AND gp.end_date   >= c_as_of_date
3062 ORDER BY gp.start_date;
3063 
3064 l_proj_all          proj_all%rowtype;
3065 l_bgt_line_rates        bgt_line_rates%rowtype;
3066 l_user_cur_details      user_cur_details%rowtype;
3067 l_pc_conv           VARCHAR2(1) := 'N';
3068 l_pfc_conv          VARCHAR2(1) := 'N';
3069 l_time_phase_code       VARCHAR2(1);
3070 l_period_set_name       VARCHAR2(15);
3071 l_accounted_period_type     VARCHAR2(15);
3072 l_pa_period_type        VARCHAR2(15);
3073 
3074 l_start_date            DATE;
3075 l_end_date          DATE;
3076 
3077 l_period_name           VARCHAR2(15);
3078 l_projfunc_cost_exchange_rate   NUMBER;
3079 l_project_cost_exchange_rate    NUMBER;
3080 tmp_project_rate_type       VARCHAR2(30);
3081 tmp_project_rate_date       DATE;
3082 tmp_project_exch_rate       NUMBER;
3083 tmp_project_raw_cost        NUMBER;
3084 tmp_projfunc_rate_type      VARCHAR2(30);
3085 tmp_projfunc_rate_date      DATE;
3086 tmp_projfunc_exch_rate      NUMBER;
3087 tmp_projfunc_raw_cost       NUMBER;
3088 
3089 g1_debug_mode           VARCHAR2(1);
3090 -- Bug 4372462 End
3091 
3092 l_org_id            NUMBER;
3093 l_acct_rate_date        DATE;
3094 l_acct_rate_type        VARCHAR2(30);
3095 l_acct_exch_rate        NUMBER;
3096 l_acct_raw_cost         NUMBER;
3097 l_project_curr_code     VARCHAR2(30);
3098 l_projfunc_curr_code        VARCHAR2(30);
3099 l_project_curr_code2        VARCHAR2(30);
3100 l_projfunc_curr_code2       VARCHAR2(30);
3101 --bug# 3627315
3102 --l_stage                   VARCHAR2(2000);
3103 l_stage             NUMBER;
3104 
3105 
3106 BEGIN
3107 
3108         x_return_status := FND_API.G_RET_STS_SUCCESS;
3109         g1_debug_mode := NVL(FND_PROFILE.value_specific('PA_DEBUG_MODE',l_user_id,l_login_id,275,null,null), 'N');
3110 
3111         IF g1_debug_mode  = 'Y' THEN
3112         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'Starts', x_Log_Level=> 3);
3113         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'p_project_id='||p_project_id, x_Log_Level=> 3);
3114         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'p_task_id='||p_task_id, x_Log_Level=> 3);
3115         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'p_as_of_date='||p_as_of_date, x_Log_Level=> 3);
3116         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_txn_cost='||P_txn_cost, x_Log_Level=> 3);
3117         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_txn_curr_code='||P_txn_curr_code, x_Log_Level=> 3);
3118         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'p_structure_version_id='||p_structure_version_id, x_Log_Level=> 3);
3119         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'p_calling_mode='||p_calling_mode, x_Log_Level=> 3);
3120         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'p_budget_version_id='||p_budget_version_id, x_Log_Level=> 3);
3121         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'p_res_assignment_id='||p_res_assignment_id, x_Log_Level=> 3);
3122         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_project_curr_code='||P_project_curr_code, x_Log_Level=> 3);
3123         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_projfunc_curr_code='||P_projfunc_curr_code, x_Log_Level=> 3);
3124         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'p_init_inout_vars='||p_init_inout_vars, x_Log_Level=> 3);
3125     END IF;
3126 
3127     IF p_init_inout_vars = 'Y' THEN
3128             -- This is being done so that if calling API's have two consecutive calls of
3129         -- this API with same local variables. Then they will get wrong data.
3130         -- instead of changing all of the calling API's, we are changing it here
3131         P_project_rate_type           := null;
3132         P_project_rate_date           := null;
3133         P_project_exch_rate           := null;
3134         P_project_raw_cost            := null;
3135         P_projfunc_cost_rate_type     := null;
3136         P_projfunc_cost_rate_date     := null;
3137         P_projfunc_cost_exch_rate     := null;
3138         P_projfunc_raw_cost           := null;
3139     END IF;
3140 
3141 
3142         OPEN ou_exp_org_id;
3143         FETCH ou_exp_org_id INTO l_org_id;
3144         CLOSE ou_exp_org_id;
3145 
3146     -- Bug 4372462 : New call below
3147         --OPEN proj_all;
3148         --FETCH proj_all INTO l_project_curr_code2, l_projfunc_curr_code2;
3149         --CLOSE proj_all;
3150 
3151         OPEN proj_all;
3152         FETCH proj_all INTO l_proj_all;
3153         CLOSE proj_all;
3154 
3155 
3156         IF p_project_curr_code IS NULL
3157         THEN
3158             l_project_curr_code := l_proj_all.project_currency_code;
3159         ELSE
3160             l_project_curr_code := p_project_curr_code;
3161         END IF;
3162 
3163         IF p_projfunc_curr_code  IS NULL
3164         THEN
3165             l_projfunc_curr_code := l_proj_all.projfunc_currency_code;
3166         ELSE
3167             l_projfunc_curr_code := p_projfunc_curr_code;
3168         END IF;
3169 
3170         IF g1_debug_mode  = 'Y' THEN
3171         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_org_id='||l_org_id, x_Log_Level=> 3);
3172         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.project_currency_code='||l_proj_all.project_currency_code, x_Log_Level=> 3);
3173         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.project_cost_rate_type='||l_proj_all.project_cost_rate_type, x_Log_Level=> 3);
3174         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.project_cost_rate_date_type='||l_proj_all.project_cost_rate_date_type, x_Log_Level=> 3);
3175         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.project_cost_rate_date='||l_proj_all.project_cost_rate_date, x_Log_Level=> 3);
3176         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.projfunc_currency_code='||l_proj_all.projfunc_currency_code, x_Log_Level=> 3);
3177         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.projfunc_cost_rate_type='||l_proj_all.projfunc_cost_rate_type, x_Log_Level=> 3);
3178         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.projfunc_cost_rate_date_type='||l_proj_all.projfunc_cost_rate_date_type, x_Log_Level=> 3);
3179         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.projfunc_cost_rate_date='||l_proj_all.projfunc_cost_rate_date, x_Log_Level=> 3);
3180         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_proj_all.proj_fp_options_id='||l_proj_all.proj_fp_options_id, x_Log_Level=> 3);
3181     END IF;
3182 
3183     IF P_txn_curr_code = l_project_curr_code THEN
3184         P_project_raw_cost := P_txn_cost;
3185         l_pc_conv := 'Y';
3186     END IF;
3187     IF P_txn_curr_code = l_projfunc_curr_code THEN
3188         P_projfunc_raw_cost := P_txn_cost;
3189         l_pfc_conv := 'Y';
3190     END IF;
3191 
3192     IF p_calling_mode = 'PLAN_RATES' AND (l_pc_conv = 'N' OR l_pfc_conv = 'N') THEN
3193         IF p_budget_version_id IS NULL OR p_res_assignment_id IS NULL THEN
3194             PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA'
3195                         ,p_msg_name       => 'PA_INV_PARAM_PASSED');
3196             x_msg_data := 'PA_INV_PARAM_PASSED';
3197             x_return_status := FND_API.G_RET_STS_ERROR;
3198             RAISE  FND_API.G_EXC_ERROR;
3199         END IF;
3200 
3201         OPEN bgt_line_rates(p_budget_version_id, p_res_assignment_id, p_txn_curr_code, p_as_of_date);
3202         FETCH bgt_line_rates INTO l_bgt_line_rates;
3203         CLOSE bgt_line_rates;
3204 
3205         OPEN user_cur_details(l_proj_all.proj_fp_options_id, p_txn_curr_code);
3206         FETCH user_cur_details INTO l_projfunc_cost_exchange_rate, l_project_cost_exchange_rate;
3207         CLOSE user_cur_details;
3208 
3209         IF g1_debug_mode  = 'Y' THEN
3210             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.resource_assignment_id='||l_bgt_line_rates.resource_assignment_id, x_Log_Level=> 3);
3211             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.project_cost_exchange_rate='||l_bgt_line_rates.project_cost_exchange_rate, x_Log_Level=> 3);
3212             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.project_cost_rate_type='||l_bgt_line_rates.project_cost_rate_type, x_Log_Level=> 3);
3213             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.project_cost_rate_date='||l_bgt_line_rates.project_cost_rate_date, x_Log_Level=> 3);
3214             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.project_cost_rate_date_type='||l_bgt_line_rates.project_cost_rate_date_type, x_Log_Level=> 3);
3215             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.projfunc_cost_exchange_rate='||l_bgt_line_rates.projfunc_cost_exchange_rate, x_Log_Level=> 3);
3216             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.projfunc_cost_rate_type='||l_bgt_line_rates.projfunc_cost_rate_type, x_Log_Level=> 3);
3217             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.projfunc_cost_rate_date='||l_bgt_line_rates.projfunc_cost_rate_date, x_Log_Level=> 3);
3218             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_bgt_line_rates.projfunc_cost_rate_date_type='||l_bgt_line_rates.projfunc_cost_rate_date_type, x_Log_Level=> 3);
3219             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_projfunc_cost_exchange_rate='||l_projfunc_cost_exchange_rate, x_Log_Level=> 3);
3220             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'l_project_cost_exchange_rate='||l_project_cost_exchange_rate, x_Log_Level=> 3);
3221         END IF;
3222 
3223 
3224         IF l_bgt_line_rates.resource_assignment_id IS NOT NULL THEN
3225             -- Data is there in budget lines table
3226 
3227             --- PC Conv
3228             IF l_pc_conv = 'N' THEN
3229                 IF l_bgt_line_rates.project_cost_exchange_rate is not null THEN
3230                     --- calc cost
3231                     l_pc_conv := 'Y';
3232                     P_project_curr_code     := l_project_curr_code;
3233                     P_project_rate_type     := l_bgt_line_rates.project_cost_rate_type;
3234                     P_project_rate_date     := l_bgt_line_rates.project_cost_rate_date;
3235                     P_project_exch_rate     := l_bgt_line_rates.project_cost_exchange_rate;
3236                     P_project_raw_cost      := P_txn_cost * P_project_exch_rate;
3237                 ELSIF NVL(l_bgt_line_rates.project_cost_rate_type,l_proj_all.project_cost_rate_type) is not null THEN
3238                     --- use this rate type
3239                     IF NVL(l_bgt_line_rates.project_cost_rate_type,l_proj_all.project_cost_rate_type) = 'User' THEN
3240                         --- calc cost
3241                         l_pc_conv := 'Y';
3242                         P_project_curr_code   := l_project_curr_code;
3243                         P_project_rate_type   := nvl(l_bgt_line_rates.project_cost_rate_type,l_proj_all.project_cost_rate_type);
3244                         P_project_rate_date   := nvl(l_bgt_line_rates.project_cost_rate_date, l_proj_all.project_cost_rate_date);
3245                         P_project_exch_rate   := l_project_cost_exchange_rate;
3246                         P_project_raw_cost    := P_txn_cost * P_project_exch_rate;
3247 
3248                         IF l_project_cost_exchange_rate IS NULL THEN
3249                             PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA'
3250                                 ,p_msg_name       => 'PA_FP_USER_EXCH_RATE_REQ');
3251                             x_msg_data := 'PA_FP_USER_EXCH_RATE_REQ';
3252                             x_return_status := FND_API.G_RET_STS_ERROR;
3253                             RAISE  FND_API.G_EXC_ERROR;
3254                         END IF;
3255                     ELSE
3256                         P_project_curr_code     := l_project_curr_code;
3257                         P_project_rate_type     := nvl(l_bgt_line_rates.project_cost_rate_Type,l_proj_all.project_cost_rate_type);
3258                         IF NVL(l_bgt_line_rates.project_cost_rate_date, l_proj_all.project_cost_rate_date) IS NOT NULL THEN
3259                             P_project_rate_date := NVL(l_bgt_line_rates.project_cost_rate_date, l_proj_all.project_cost_rate_date);
3260                         ELSE
3261                             IF NVL(l_bgt_line_rates.project_cost_rate_date_type, l_proj_all.project_cost_rate_date_type) = 'START_DATE' THEN
3262                                 P_project_rate_date := l_bgt_line_rates.start_date;
3263                             ELSIF NVL(l_bgt_line_rates.project_cost_rate_date_type, l_proj_all.project_cost_rate_date_type) = 'END_DATE' THEN
3264                                 P_project_rate_date := l_bgt_line_rates.end_date;
3265                             ELSIF NVL(l_bgt_line_rates.project_cost_rate_date_type, l_proj_all.project_cost_rate_date_type) = 'FIXED_DATE' THEN
3266                                 P_project_rate_date := NVL(l_bgt_line_rates.project_cost_rate_date, l_proj_all.project_cost_rate_date);
3267                                 -- This case should never come...This is an error
3268                             ELSE
3269                                 P_project_rate_date := null; -- Costing API will derive using implmentation option setup
3270                             END IF;
3271                         END IF;
3272                     END IF; -- NVL(l_bgt_line_rates.project_cost_rate_type,l_proj_all.project_cost_rate_type) = 'User'
3273                 END IF;   -- l_bgt_line_rates.project_cost_exchange_rate is not null
3274             END IF ; -- IF l_pc_conv = 'N'
3275 
3276             --- PFC Conv
3277             IF l_pfc_conv = 'N' THEN
3278                 IF l_bgt_line_rates.projfunc_cost_exchange_rate is not null THEN
3279                     --- calc cost
3280                     l_pfc_conv := 'Y';
3281                     P_projfunc_curr_code        := l_projfunc_curr_code;
3282                     P_projfunc_cost_rate_type   := l_bgt_line_rates.projfunc_cost_rate_type;
3283                     P_projfunc_cost_rate_date   := l_bgt_line_rates.projfunc_cost_rate_date;
3284                     P_projfunc_cost_exch_rate   := l_bgt_line_rates.projfunc_cost_exchange_rate;
3285                     P_projfunc_raw_cost     := P_txn_cost * P_projfunc_cost_exch_rate;
3286                 ELSIF NVL(l_bgt_line_rates.projfunc_cost_rate_type,l_proj_all.projfunc_cost_rate_type) is not null THEN
3287                     --- use this rate type
3288                     IF NVL(l_bgt_line_rates.projfunc_cost_rate_type,l_proj_all.projfunc_cost_rate_type) = 'User' THEN
3289                         --- calc cost
3290                         l_pfc_conv := 'Y';
3291                         P_projfunc_curr_code        := l_projfunc_curr_code;
3292                         P_projfunc_cost_rate_type   := nvl(l_bgt_line_rates.projfunc_cost_rate_type,l_proj_all.projfunc_cost_rate_type);
3293                         P_projfunc_cost_rate_date   := nvl(l_bgt_line_rates.projfunc_cost_rate_date, l_proj_all.projfunc_cost_rate_date);
3294                         P_projfunc_cost_exch_rate   := l_projfunc_cost_exchange_rate;
3295                         P_projfunc_raw_cost     := P_txn_cost * P_projfunc_cost_exch_rate;
3296 
3297                         IF l_projfunc_cost_exchange_rate IS NULL THEN
3298                             PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA'
3299                                 ,p_msg_name       => 'PA_FP_USER_EXCH_RATE_REQ');
3300                             x_msg_data := 'PA_FP_USER_EXCH_RATE_REQ';
3301                             x_return_status := FND_API.G_RET_STS_ERROR;
3302                             RAISE  FND_API.G_EXC_ERROR;
3303                         END IF;
3304                     ELSE
3305                         P_projfunc_curr_code     := l_projfunc_curr_code;
3306                         P_projfunc_cost_rate_type     := nvl(l_bgt_line_rates.projfunc_cost_rate_type,l_proj_all.projfunc_cost_rate_type);
3307                         IF NVL(l_bgt_line_rates.projfunc_cost_rate_date, l_proj_all.projfunc_cost_rate_date) IS NOT NULL THEN
3308                             P_projfunc_cost_rate_date := NVL(l_bgt_line_rates.projfunc_cost_rate_date, l_proj_all.projfunc_cost_rate_date);
3309                         ELSE
3310                             IF NVL(l_bgt_line_rates.projfunc_cost_rate_date_type, l_proj_all.projfunc_cost_rate_date_type) = 'START_DATE' THEN
3311                                 P_projfunc_cost_rate_date := l_bgt_line_rates.start_date;
3312                             ELSIF NVL(l_bgt_line_rates.projfunc_cost_rate_date_type, l_proj_all.projfunc_cost_rate_date_type) = 'END_DATE' THEN
3313                                 P_projfunc_cost_rate_date := l_bgt_line_rates.end_date;
3314                             ELSIF NVL(l_bgt_line_rates.projfunc_cost_rate_date_type, l_proj_all.projfunc_cost_rate_date_type) = 'FIXED_DATE' THEN
3315                                 P_projfunc_cost_rate_date := NVL(l_bgt_line_rates.project_cost_rate_date, l_proj_all.project_cost_rate_date);
3316                                 -- This case should never come...This is an error
3317                             ELSE
3318                                 P_projfunc_cost_rate_date := null; -- Costing API will derive using implmentation option setup
3319                             END IF;
3320                         END IF;
3321                     END IF; -- NVL(l_bgt_line_rates.projfunc_cost_rate_type,l_proj_all.projfunc_cost_rate_type) = 'User'
3322                 END IF;   -- l_bgt_line_rates.projfunc_cost_exchange_rate is not null THEN
3323             END IF; -- IF l_pfc_conv = 'N'
3324         ELSE -- l_bgt_line_rates.resource_assignment_id IS NOT NULL
3325             OPEN get_name_and_type_csr(p_budget_version_id);
3326             FETCH get_name_and_type_csr INTO l_period_set_name, l_accounted_period_type, l_pa_period_type, l_time_phase_code;
3327             CLOSE get_name_and_type_csr;
3328 
3329             OPEN get_gl_periods_csr(l_period_set_name, l_accounted_period_type, l_pa_period_type, l_time_phase_code, p_as_of_date);
3330             FETCH get_gl_periods_csr INTO l_start_date, l_end_date, l_period_name;
3331             CLOSE get_gl_periods_csr;
3332 
3333             -- PC Conversion
3334             IF l_pc_conv = 'N' THEN
3335                 IF (l_proj_all.project_cost_rate_type is null) THEN
3336                     null; -- means no currency rates override at WP level
3337                 ELSE
3338                     --- use this rate type
3339                     IF l_proj_all.project_cost_rate_type = 'User' THEN
3340                         --- calc cost
3341                         l_pc_conv := 'Y';
3342                         P_project_curr_code   := l_project_curr_code;
3343                         P_project_rate_type   := l_proj_all.project_cost_rate_type;
3344                         P_project_rate_date   := l_proj_all.project_cost_rate_date;
3345                         P_project_exch_rate   := l_project_cost_exchange_rate;
3346                         P_project_raw_cost    := P_txn_cost * P_project_exch_rate;
3347 
3348                         IF l_project_cost_exchange_rate IS NULL THEN
3349                             PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA'
3350                                 ,p_msg_name       => 'PA_FP_USER_EXCH_RATE_REQ');
3351                             x_msg_data := 'PA_FP_USER_EXCH_RATE_REQ';
3352                             x_return_status := FND_API.G_RET_STS_ERROR;
3353                             RAISE  FND_API.G_EXC_ERROR;
3354                         END IF;
3355                     ELSE
3356                         P_project_curr_code     := l_project_curr_code;
3357                         P_project_rate_type     := l_proj_all.project_cost_rate_type;
3358                         IF l_proj_all.project_cost_rate_date IS NOT NULL THEN
3359                             P_project_rate_date := l_proj_all.project_cost_rate_date;
3360                         ELSE
3361                             IF l_proj_all.project_cost_rate_date_type = 'START_DATE' THEN
3362                                 P_project_rate_date := l_start_date;
3363                             ELSIF l_proj_all.project_cost_rate_date_type = 'END_DATE' THEN
3364                                 P_project_rate_date := l_end_date;
3365                             ELSIF l_proj_all.project_cost_rate_date_type = 'FIXED_DATE' THEN
3366                                 P_project_rate_date :=  l_proj_all.project_cost_rate_date;
3367                                 -- This case should never come...This is an error
3368                             ELSE
3369                                 P_project_rate_date := null; -- Costing API will derive using implmentation option setup
3370                             END IF;
3371                         END IF;
3372                     END IF; -- l_proj_all.project_cost_rate_type = 'User'
3373                 END IF;   -- l_proj_all.project_cost_rate_type is null
3374             END IF ; -- IF l_pc_conv = 'N' THEN
3375 
3376             -- PFC Conversion
3377             IF l_pfc_conv = 'N' THEN
3378                 IF (l_proj_all.projfunc_cost_rate_type is null) THEN
3379                     null; -- means no currency rates override at proj level
3380                 ELSE
3381                     --- use this rate type
3382                     IF l_proj_all.projfunc_cost_rate_type = 'User' THEN
3383                         --- calc cost
3384                         l_pfc_conv := 'Y';
3385                         P_projfunc_curr_code        := l_projfunc_curr_code;
3386                         P_projfunc_cost_rate_type   := l_proj_all.projfunc_cost_rate_type;
3387                         P_projfunc_cost_rate_date   := l_proj_all.projfunc_cost_rate_date;
3388                         P_projfunc_cost_exch_rate   := l_projfunc_cost_exchange_rate;
3389                         P_projfunc_raw_cost     := P_txn_cost * P_projfunc_cost_exch_rate;
3390 
3391                         IF l_projfunc_cost_exchange_rate IS NULL THEN
3392                             PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA'
3393                                 ,p_msg_name       => 'PA_FP_USER_EXCH_RATE_REQ');
3394                             x_msg_data := 'PA_FP_USER_EXCH_RATE_REQ';
3395                             x_return_status := FND_API.G_RET_STS_ERROR;
3396                             RAISE  FND_API.G_EXC_ERROR;
3397                         END IF;
3398                     ELSE
3399                         P_projfunc_curr_code        := l_projfunc_curr_code;
3400                         P_projfunc_cost_rate_type   := l_proj_all.projfunc_cost_rate_type;
3401                         IF l_proj_all.projfunc_cost_rate_date IS NOT NULL THEN
3402                             P_projfunc_cost_rate_date := l_proj_all.projfunc_cost_rate_date;
3403                         ELSE
3404                             IF l_proj_all.projfunc_cost_rate_date_type = 'START_DATE' THEN
3405                                 P_projfunc_cost_rate_date := l_start_date;
3406                             ELSIF l_proj_all.projfunc_cost_rate_date_type = 'END_DATE' THEN
3407                                 P_projfunc_cost_rate_date := l_end_date;
3408                             ELSIF l_proj_all.projfunc_cost_rate_date_type = 'FIXED_DATE' THEN
3409                                 P_projfunc_cost_rate_date :=  l_proj_all.project_cost_rate_date;
3410                                 -- This case should never come...This is an error
3411                             ELSE
3412                                 P_projfunc_cost_rate_date := null; -- Costing API will derive using implmentation option setup
3413                             END IF;
3414                         END IF;
3415                     END IF; -- l_proj_all.projfunc_cost_rate_type = 'User'
3416                 END IF;   -- l_proj_all.projfunc_cost_rate_type is null
3417             END IF;--IF l_pfc_conv = 'N' THEN
3418 
3419         END IF; -- l_bgt_line_rates.resource_assignment_id IS NOT NULL
3420     END IF; -- p_calling_mode = 'PLAN_RATES'
3421 
3422     IF (l_pc_conv = 'N' OR l_pfc_conv = 'N') THEN
3423         tmp_project_rate_type := P_project_rate_type;
3424         tmp_project_rate_date := P_project_rate_date;
3425         tmp_project_exch_rate := P_project_exch_rate;
3426         tmp_project_raw_cost  := P_project_raw_cost;
3427 
3428         tmp_projfunc_rate_type := P_projfunc_cost_rate_type;
3429         tmp_projfunc_rate_date := P_projfunc_cost_rate_date;
3430         tmp_projfunc_exch_rate := P_projfunc_cost_exch_rate;
3431         tmp_projfunc_raw_cost  := P_projfunc_raw_cost;
3432 
3433         IF l_pc_conv = 'Y' THEN
3434             -- This is possible when TXN to PC is User and rate is found
3435             -- So if we pass this rate type to Costing API
3436             -- It will error out..
3437             tmp_project_rate_type := P_projfunc_cost_rate_type;
3438             tmp_project_rate_date := P_projfunc_cost_rate_date;
3439             tmp_project_exch_rate := P_projfunc_cost_exch_rate;
3440             tmp_project_raw_cost := P_projfunc_raw_cost;
3441         END IF;
3442         IF l_pfc_conv = 'Y' THEN
3443             tmp_projfunc_rate_type := P_project_rate_type;
3444             tmp_projfunc_rate_date := P_project_rate_date;
3445             tmp_projfunc_exch_rate := P_project_exch_rate;
3446             tmp_projfunc_raw_cost  := P_project_raw_cost;
3447         END IF;
3448 
3449         BEGIN
3450             IF g1_debug_mode  = 'Y' THEN
3451                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'Calling pa_multi_currency_txn.get_currency_amounts', x_Log_Level=> 3);
3452                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'tmp_project_rate_type='||tmp_project_rate_type, x_Log_Level=> 3);
3453                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'tmp_project_rate_date='||tmp_project_rate_date, x_Log_Level=> 3);
3454                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'tmp_project_exch_rate='||tmp_project_exch_rate, x_Log_Level=> 3);
3455                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'tmp_project_raw_cost='||tmp_project_raw_cost, x_Log_Level=> 3);
3456                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'tmp_projfunc_rate_type='||tmp_projfunc_rate_type, x_Log_Level=> 3);
3457                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'tmp_projfunc_rate_date='||tmp_projfunc_rate_date, x_Log_Level=> 3);
3458                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'tmp_projfunc_exch_rate='||tmp_projfunc_exch_rate, x_Log_Level=> 3);
3459                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'tmp_projfunc_raw_cost='||tmp_projfunc_raw_cost, x_Log_Level=> 3);
3460             END IF;
3461 
3462             pa_multi_currency_txn.get_currency_amounts (
3463                 p_calling_module        => 'WORKPLAN', -- FPM Dev CR 3
3464                 P_project_id            => p_project_id,
3465                 P_exp_org_id            => l_org_id,
3466                 P_task_id               => p_task_id,
3467                 P_EI_date               => p_as_of_date,
3468                 P_denom_raw_cost        => p_txn_cost,
3469                 P_denom_curr_code       => P_txn_curr_code,
3470                 P_acct_curr_code        => P_txn_curr_code,
3471                 P_acct_rate_date        => l_acct_rate_date,
3472                 P_acct_rate_type        => l_acct_rate_type,
3473                 P_acct_exch_rate        => l_acct_exch_rate,
3474                 P_acct_raw_cost         => l_acct_raw_cost,
3475                 P_project_curr_code     => l_project_curr_code,
3476                 P_project_rate_type     => tmp_project_rate_type ,
3477                 P_project_rate_date     => tmp_project_rate_date,
3478                 P_project_exch_rate     => tmp_project_exch_rate,
3479                 P_project_raw_cost      => tmp_project_raw_cost,
3480                 P_projfunc_curr_code    => l_projfunc_curr_code,
3481                 p_projfunc_cost_rate_type  => tmp_projfunc_rate_type,
3482                 P_projfunc_cost_rate_date  => tmp_projfunc_rate_date,
3483                 P_projfunc_cost_exch_rate  => tmp_projfunc_exch_rate,
3484                 P_projfunc_raw_cost        => tmp_projfunc_raw_cost,
3485                 --P_status                   => l_return_status, --bug 3828542
3486                 P_status                   => l_status,
3487                 P_stage                    => l_stage,
3488                 p_structure_version_id     => p_structure_version_id -- 3627787
3489                    );
3490 
3491             IF g1_debug_mode  = 'Y' THEN
3492                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'After Call l_status='||l_status, x_Log_Level=> 3);
3493                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'After Call l_stage='||l_stage, x_Log_Level=> 3);
3494             END IF;
3495 
3496 
3497         EXCEPTION
3498             WHEN OTHERS THEN
3499                 fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
3500                     p_procedure_name => 'CONVERT_CURRENCY_AMOUNTS',
3501                     p_error_text     => SUBSTRB('pa_multi_currency_txn.get_currency_amounts:'||SQLERRM,1,120));
3502                 RAISE FND_API.G_EXC_ERROR;
3503 
3504         END;
3505         --bug 3828542 start
3506         IF ( l_status IS NOT NULL ) THEN
3507             PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA'
3508                      ,p_msg_name       => l_status);
3509             x_msg_data := l_status;
3510             l_return_status := 'E';
3511         END IF;
3512         --bug 3828542 end
3513 
3514         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3515             x_return_status := 'E';
3516             RAISE  FND_API.G_EXC_ERROR;
3517         END IF;
3518 
3519 
3520         IF l_pc_conv = 'N' THEN
3521             P_project_rate_type := tmp_project_rate_type;
3522             P_project_rate_date := tmp_project_rate_date;
3523             P_project_exch_rate := tmp_project_exch_rate;
3524             P_project_raw_cost := tmp_project_raw_cost;
3525         END IF;
3526         IF l_pfc_conv = 'N' THEN
3527             P_projfunc_cost_rate_type := tmp_projfunc_rate_type;
3528             P_projfunc_cost_rate_date := tmp_projfunc_rate_date;
3529             P_projfunc_cost_exch_rate := tmp_projfunc_exch_rate;
3530             P_projfunc_raw_cost := tmp_projfunc_raw_cost;
3531         END IF;
3532     END IF; --  IF (l_pc_conv = 'N' or l_pfc_conv = 'N') THEN
3533 
3534         IF g1_debug_mode  = 'Y' THEN
3535         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'Ends', x_Log_Level=> 3);
3536         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_project_curr_code='||P_project_curr_code, x_Log_Level=> 3);
3537         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_project_rate_type='||P_project_rate_type, x_Log_Level=> 3);
3538         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_project_rate_date='||P_project_rate_date, x_Log_Level=> 3);
3539         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_project_exch_rate='||P_project_exch_rate, x_Log_Level=> 3);
3540         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_project_raw_cost='||P_project_raw_cost, x_Log_Level=> 3);
3541         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_projfunc_curr_code='||P_projfunc_curr_code, x_Log_Level=> 3);
3542         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_projfunc_cost_rate_type='||P_projfunc_cost_rate_type, x_Log_Level=> 3);
3543         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_projfunc_cost_rate_date='||P_projfunc_cost_rate_date, x_Log_Level=> 3);
3544         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_projfunc_cost_exch_rate='||P_projfunc_cost_exch_rate, x_Log_Level=> 3);
3545         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS', x_Msg => 'P_projfunc_raw_cost='||P_projfunc_raw_cost, x_Log_Level=> 3);
3546 
3547     END IF;
3548 
3549 EXCEPTION
3550     when FND_API.G_EXC_ERROR then
3551       x_return_status := FND_API.G_RET_STS_ERROR;
3552 
3553         -- 4537865 : Start
3554     ----    p_project_curr_code         := NULL ;  5081809
3555         P_project_rate_type         := NULL ;
3556         P_project_rate_date         := NULL ;
3557         P_project_exch_rate         := NULL ;
3558         P_project_raw_cost          := NULL ;
3559     ----    P_projfunc_curr_code        := NULL ;  5081809
3560         P_projfunc_cost_rate_type   := NULL ;
3561         P_projfunc_cost_rate_date   := NULL ;
3562         P_projfunc_cost_exch_rate   := NULL ;
3563         P_projfunc_raw_cost         := NULL ;
3564         -- 4537865 : End
3565 
3566     when FND_API.G_EXC_UNEXPECTED_ERROR then
3567       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3568       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
3569                               p_procedure_name => 'convert_currency_amounts',
3570                               p_error_text     => SUBSTRB(SQLERRM,1,120));
3571         -- 4537865 : Start
3572     ----    p_project_curr_code         := NULL ;  5081809
3573         P_project_rate_type         := NULL ;
3574         P_project_rate_date         := NULL ;
3575         P_project_exch_rate         := NULL ;
3576         P_project_raw_cost          := NULL ;
3577     ----    P_projfunc_curr_code        := NULL ;  5081809
3578         P_projfunc_cost_rate_type   := NULL ;
3579         P_projfunc_cost_rate_date   := NULL ;
3580         P_projfunc_cost_exch_rate   := NULL ;
3581         P_projfunc_raw_cost         := NULL ;
3582         -- 4537865 : End
3583 
3584     when OTHERS then
3585       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3586       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
3587                               p_procedure_name => 'convert_currency_amounts',
3588                               p_error_text     => SUBSTRB(SQLERRM,1,120));
3589 
3590     -- 4537865 : Start
3591     ---- p_project_curr_code         := NULL ;  5081809
3592     P_project_rate_type         := NULL ;
3593     P_project_rate_date         := NULL ;
3594     P_project_exch_rate         := NULL ;
3595     P_project_raw_cost          := NULL ;
3596     ---- P_projfunc_curr_code        := NULL ;  5081809
3597     P_projfunc_cost_rate_type   := NULL ;
3598     P_projfunc_cost_rate_date   := NULL ;
3599     P_projfunc_cost_exch_rate   := NULL ;
3600     P_projfunc_raw_cost         := NULL ;
3601     -- 4537865 : End
3602       raise;
3603 
3604 END convert_currency_amounts;
3605 
3606 FUNCTION get_time_phase_period(p_structure_version_id   IN  NUMBER
3607                    ,p_project_id        IN      NUMBER := NULL) return VARCHAR2
3608 IS
3609     l_time_phase_code   VARCHAR2(30);
3610     l_structure_version_id  NUMBER;
3611 BEGIN
3612     if p_structure_version_id is null then
3613         l_structure_version_id := PA_PROJ_ELEMENTS_UTILS.latest_published_ver_id(p_project_id, 'WORKPLAN');
3614     else
3615         l_structure_version_id := p_structure_version_id;
3616     end if;
3617     BEGIN
3618         l_time_phase_code := PA_FIN_PLAN_UTILS.Get_wp_bv_time_phase(l_structure_version_id);
3619      EXCEPTION
3620                 WHEN OTHERS THEN
3621                         fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROGRESS_UTILS',
3622                                         p_procedure_name => 'get_time_phase_period',
3623                                         p_error_text     => SUBSTRB('PA_FIN_PLAN_UTILS.Get_wp_bv_time_phase:'||SQLERRM,1,120));
3624                         RAISE FND_API.G_EXC_ERROR;
3625          END;
3626 
3627     RETURN(l_time_phase_code);
3628 END get_time_phase_period;
3629 
3630 -- Bug 3879461 : Get_incremental functions are not used anymore
3631 -- Moreover getting the previous period amount logic is wrong...
3632 -- Now things are directly derived in pa_progress_pub.POPULATE_PRG_ACT_TEMP_TBL
3633 FUNCTION get_incremental_actual_cost(p_as_of_date           IN              DATE
3634                                     ,p_period_name          IN              VARCHAR2
3635                                     ,pgn_flag               IN              VARCHAR2
3636                                     ,p_project_id           IN              NUMBER
3637                                     ,p_object_id            IN              NUMBER
3638                                     ,p_object_version_id    IN              NUMBER
3639                                     ,currency_flag          IN              VARCHAR2 := 'T'
3640                                     ,p_structure_version_id IN              NUMBER := null  --3694031
3641                ,p_proj_element_id       IN  NUMBER := null /* Modified for IB4 Progress CR. */
3642                             ) return NUMBER
3643 IS
3644     l_actual_cost   NUMBER := NULL;
3645     l_prev_period_actual_cost NUMBER;
3646 BEGIN
3647 
3648     if (currency_flag = 'P') then
3649 
3650        if p_structure_version_id IS NULL
3651        THEN
3652 
3653     if (pgn_flag = 'P') then
3654 
3655           begin
3656             select (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)
3657             +nvl(ppr.eqpmt_act_cost_to_date_pc,0)+nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
3658             +nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0))
3659             into l_actual_cost
3660                 from pa_progress_rollup ppr
3661                 where ppr.project_id = p_project_id
3662                 and ppr.object_id = p_object_id
3663                 and prog_pa_period_name = p_period_name
3664             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3665                 and ppr.structure_version_id IS NULL   --bug 3802177
3666             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3667                 and ppr.as_of_date = (select max(as_of_date)
3668                                      from pa_progress_rollup ppr2
3669                                      where ppr2.project_id = ppr.project_id
3670                                      and ppr2.object_id = ppr.object_id
3671                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3672                                      and ppr2.structure_version_id IS NULL   --bug 3802177
3673                                      and ppr2.prog_pa_period_name = ppr.prog_pa_period_name
3674                      and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
3675              );
3676 
3677            exception when no_data_found then
3678                 l_actual_cost := 0;
3679            end;
3680 
3681            begin
3682             select (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)
3683             +nvl(ppr.eqpmt_act_cost_to_date_pc,0)+nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
3684             +nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0))
3685                   into l_prev_period_actual_cost
3686                   from pa_progress_rollup ppr
3687                  where ppr.project_id = p_project_id
3688                    and ppr.object_id = p_object_id
3689                    and ppr.structure_type = 'WORKPLAN'
3690                    and ppr.structure_version_id IS NULL
3691                and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3692                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
3693                                  from pa_progress_rollup ppr1
3694                                 where ppr1.project_id = ppr.project_id
3695                                   and ppr1.object_id = ppr.object_id
3696                                   and ppr1.structure_type = 'WORKPLAN'
3697                                   and ppr1.structure_version_id IS NULL   --bug 3802177
3698                    and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
3699                                   and as_of_date < ( select min(as_of_date)
3700                                                    from pa_progress_rollup ppr2
3701                                                    where ppr2.project_id = ppr1.project_id
3702                                                      and ppr2.object_id = ppr1.object_id
3703                                                      and structure_type = 'WORKPLAN'
3704                                                      and ppr2.structure_version_id IS NULL   --bug 3802177
3705                                                      and ppr2.prog_pa_period_name = p_period_name
3706                              and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
3707                                                 ));
3708            exception when no_data_found then
3709                 l_prev_period_actual_cost := 0;
3710            end;
3711     elsif (pgn_flag ='G') then
3712           begin
3713             select (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)
3714             +nvl(ppr.eqpmt_act_cost_to_date_pc,0)+nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
3715             +nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0))
3716             into l_actual_cost
3717                 from pa_progress_rollup ppr
3718                 where ppr.project_id = p_project_id
3719                 and ppr.object_id = p_object_id
3720                 and prog_gl_period_name = p_period_name
3721             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3722                                   and ppr.structure_version_id IS NULL   --bug 3802177
3723                 and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3724                 and ppr.as_of_date = (select max(as_of_date)
3725                                      from pa_progress_rollup ppr2
3726                                      where ppr2.project_id = ppr.project_id
3727                                      and ppr2.object_id = ppr.object_id
3728                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3729                                   and ppr2.structure_version_id IS NULL   --bug 3802177
3730                                      and ppr2.prog_gl_period_name = ppr.prog_gl_period_name
3731                      and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
3732 
3733            exception when no_data_found then
3734                 l_actual_cost := 0;
3735            end;
3736 
3737            begin
3738             select (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)
3739             +nvl(ppr.eqpmt_act_cost_to_date_pc,0)+nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
3740             +nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0))
3741                   into l_prev_period_actual_cost
3742                   from pa_progress_rollup ppr
3743                  where ppr.project_id = p_project_id
3744                    and ppr.object_id = p_object_id
3745                    and ppr.structure_type = 'WORKPLAN'
3746                    and ppr.structure_version_id IS NULL
3747        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3748                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
3749                                  from pa_progress_rollup ppr1
3750                                 where ppr1.project_id = ppr.project_id
3751                                   and ppr1.object_id = ppr.object_id
3752                                   and ppr1.structure_type = 'WORKPLAN'
3753                                   and ppr1.structure_version_id IS NULL   --bug 3802177
3754             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
3755                                   and as_of_date < ( select min(as_of_date)
3756                                                    from pa_progress_rollup ppr2
3757                                                    where ppr2.project_id = ppr1.project_id
3758                                                      and ppr2.object_id = ppr1.object_id
3759                                                      and structure_type = 'WORKPLAN'
3760                                   and ppr2.structure_version_id IS NULL   --bug 3802177
3761                                                      and ppr2.prog_gl_period_name = p_period_name
3762             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
3763                                                 ));
3764            exception when no_data_found then
3765                 l_prev_period_actual_cost := 0;
3766            end;
3767     elsif (pgn_flag = 'N') then
3768                 select (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)
3769             +nvl(ppr.eqpmt_act_cost_to_date_pc,0)+nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
3770             +nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0))
3771                 into l_actual_cost
3772                 from pa_progress_rollup ppr
3773                 where ppr.project_id = p_project_id
3774                 and ppr.object_id = p_object_id
3775                 --and ppr.object_version_id = p_object_version_id
3776             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3777                                   and ppr.structure_version_id IS NULL   --bug 3802177
3778                 and ppr.as_of_date = p_as_of_date
3779     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
3780     end if; -- pgn flag.
3781       ELSIF p_structure_version_id IS NOT NULL
3782       THEN
3783            select (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)
3784                     +nvl(ppr.eqpmt_act_cost_to_date_pc,0)+nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
3785                     +nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0))
3786            into l_actual_cost
3787            from pa_progress_rollup ppr
3788           where ppr.project_id = p_project_id
3789             and ppr.object_id = p_object_id
3790             and ppr.structure_version_id = p_structure_version_id
3791             and structure_type = 'WORKPLAN'
3792         and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
3793 
3794       END IF;
3795 
3796     elsif (currency_flag) = 'T' then
3797 
3798       IF p_structure_version_id IS NULL
3799       THEN
3800 
3801     if (pgn_flag = 'P') then
3802           begin
3803             select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
3804             +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
3805             +nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0))
3806             into l_actual_cost
3807                 from pa_progress_rollup ppr
3808                 where ppr.project_id = p_project_id
3809                 and ppr.object_id = p_object_id
3810                 and prog_pa_period_name = p_period_name
3811                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3812                                   and ppr.structure_version_id IS NULL   --bug 3802177
3813     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3814                 and ppr.as_of_date = (select max(as_of_date)
3815                                      from pa_progress_rollup ppr2
3816                                      where ppr2.project_id = ppr.project_id
3817                                      and ppr2.object_id = ppr.object_id
3818                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3819                                   and ppr2.structure_version_id IS NULL   --bug 3802177
3820                                      and ppr2.prog_pa_period_name = ppr.prog_pa_period_name
3821             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
3822 
3823            exception when no_data_found then
3824                 l_actual_cost := 0;
3825            end;
3826 
3827            begin
3828             select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
3829             +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
3830             +nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0))
3831                   into l_prev_period_actual_cost
3832                   from pa_progress_rollup ppr
3833                  where ppr.project_id = p_project_id
3834                    and ppr.object_id = p_object_id
3835                    and ppr.structure_type = 'WORKPLAN'
3836                    and ppr.structure_version_id IS NULL
3837        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3838                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
3839                                  from pa_progress_rollup ppr1
3840                                 where ppr1.project_id = ppr.project_id
3841                                   and ppr1.object_id = ppr.object_id
3842                                   and ppr1.structure_type = 'WORKPLAN'
3843                                   and ppr1.structure_version_id IS NULL   --bug 3802177
3844             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
3845                                   and as_of_date < ( select min(as_of_date)
3846                                                    from pa_progress_rollup ppr2
3847                                                    where ppr2.project_id = ppr1.project_id
3848                                                      and ppr2.object_id = ppr1.object_id
3849                                                      and structure_type = 'WORKPLAN'
3850                                   and ppr2.structure_version_id IS NULL   --bug 3802177
3851                                                      and ppr2.prog_pa_period_name = p_period_name
3852             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
3853                                                 ));
3854            exception when no_data_found then
3855                 l_prev_period_actual_cost := 0;
3856            end;
3857     elsif (pgn_flag ='G') then
3858 
3859           begin
3860             select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
3861             +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
3862             +nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0))
3863             into l_actual_cost
3864                 from pa_progress_rollup ppr
3865                 where ppr.project_id = p_project_id
3866                 and ppr.object_id = p_object_id
3867                 and prog_gl_period_name = p_period_name
3868                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3869                                   and ppr.structure_version_id IS NULL   --bug 3802177
3870     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3871                 and ppr.as_of_date = (select max(as_of_date)
3872                                      from pa_progress_rollup ppr2
3873                                      where ppr2.project_id = ppr.project_id
3874                                      and ppr2.object_id = ppr.object_id
3875                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3876                                   and ppr2.structure_version_id IS NULL   --bug 3802177
3877                                      and ppr2.prog_gl_period_name = ppr.prog_gl_period_name
3878             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
3879 
3880            exception when no_data_found then
3881                 l_actual_cost := 0;
3882            end;
3883 
3884            begin
3885             select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
3886             +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
3887             +nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0))
3888                   into l_prev_period_actual_cost
3889                   from pa_progress_rollup ppr
3890                  where ppr.project_id = p_project_id
3891                    and ppr.object_id = p_object_id
3892                    and ppr.structure_type = 'WORKPLAN'
3893                    and ppr.structure_version_id IS NULL
3894        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3895                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
3896                                  from pa_progress_rollup ppr1
3897                                 where ppr1.project_id = ppr.project_id
3898                                   and ppr1.object_id = ppr.object_id
3899                                   and ppr1.structure_type = 'WORKPLAN'
3900                                   and ppr1.structure_version_id IS NULL   --bug 3802177
3901             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
3902                                   and as_of_date < ( select min(as_of_date)
3903                                                    from pa_progress_rollup ppr2
3904                                                    where ppr2.project_id = ppr1.project_id
3905                                                      and ppr2.object_id = ppr1.object_id
3906                                                      and structure_type = 'WORKPLAN'
3907                                   and ppr2.structure_version_id IS NULL   --bug 3802177
3908                                                      and ppr2.prog_gl_period_name = p_period_name
3909             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
3910                                                 ));
3911            exception when no_data_found then
3912                 l_prev_period_actual_cost := 0;
3913            end;
3914     elsif (pgn_flag = 'N') then
3915                 select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
3916             +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
3917             +nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0))
3918                 into l_actual_cost
3919                 from pa_progress_rollup ppr
3920                 where ppr.project_id = p_project_id
3921                 and ppr.object_id = p_object_id
3922                 and ppr.object_version_id = p_object_version_id
3923             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3924                                   and ppr.structure_version_id IS NULL   --bug 3802177
3925                 and ppr.as_of_date = p_as_of_date
3926     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
3927     end if; -- pgn flag.
3928     ELSIF p_structure_version_id IS NOT NULL
3929     THEN
3930                select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
3931                         +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
3932                         +nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0))
3933                 into l_actual_cost
3934                 from pa_progress_rollup ppr
3935                 where ppr.project_id = p_project_id
3936                 and ppr.object_id = p_object_id
3937                 and ppr.object_version_id = p_object_version_id
3938                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3939                 and ppr.structure_version_id = p_structure_version_id
3940     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
3941     END IF;
3942 
3943   elsif (currency_flag = 'F') then
3944 
3945      IF p_structure_version_id IS NULL
3946      THEN
3947     if (pgn_flag = 'P') then
3948           begin
3949             select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)
3950             +nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)
3951             +nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0))
3952             into l_actual_cost
3953                 from pa_progress_rollup ppr
3954                 where ppr.project_id = p_project_id
3955                 and ppr.object_id = p_object_id
3956                 and prog_pa_period_name = p_period_name
3957                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3958                                   and ppr.structure_version_id IS NULL   --bug 3802177
3959     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3960                 and ppr.as_of_date = (select max(as_of_date)
3961                                      from pa_progress_rollup ppr2
3962                                      where ppr2.project_id = ppr.project_id
3963                                      and ppr2.object_id = ppr.object_id
3964                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
3965                                   and ppr2.structure_version_id IS NULL   --bug 3802177
3966                                      and ppr2.prog_pa_period_name = ppr.prog_pa_period_name
3967             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
3968 
3969            exception when no_data_found then
3970                 l_actual_cost := 0;
3971            end;
3972 
3973            begin
3974             select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)
3975             +nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)
3976             +nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0))
3977                   into l_prev_period_actual_cost
3978                   from pa_progress_rollup ppr
3979                  where ppr.project_id = p_project_id
3980                    and ppr.object_id = p_object_id
3981                    and ppr.structure_type = 'WORKPLAN'
3982                    and ppr.structure_version_id IS NULL
3983        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
3984                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
3985                                  from pa_progress_rollup ppr1
3986                                 where ppr1.project_id = ppr.project_id
3987                                   and ppr1.object_id = ppr.object_id
3988                                   and ppr1.structure_type = 'WORKPLAN'
3989                                   and ppr1.structure_version_id IS NULL   --bug 3802177
3990             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
3991                                   and as_of_date < ( select min(as_of_date)
3992                                                    from pa_progress_rollup ppr2
3993                                                    where ppr2.project_id = ppr1.project_id
3994                                                      and ppr2.object_id = ppr1.object_id
3995                                                      and structure_type = 'WORKPLAN'
3996                                   and ppr2.structure_version_id IS NULL   --bug 3802177
3997                                                      and ppr2.prog_pa_period_name = p_period_name
3998             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
3999                                                 ));
4000            exception when no_data_found then
4001                 l_prev_period_actual_cost := 0;
4002            end;
4003     elsif (pgn_flag ='G') then
4004           begin
4005             select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)
4006             +nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)
4007             +nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0))
4008             into l_actual_cost
4009                 from pa_progress_rollup ppr
4010                 where ppr.project_id = p_project_id
4011                 and ppr.object_id = p_object_id
4012                 and prog_gl_period_name = p_period_name
4013                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4014                                   and ppr.structure_version_id IS NULL   --bug 3802177
4015     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4016                 and ppr.as_of_date = (select max(as_of_date)
4017                                      from pa_progress_rollup ppr2
4018                                      where ppr2.project_id = ppr.project_id
4019                                      and ppr2.object_id = ppr.object_id
4020                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4021                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4022                                      and ppr2.prog_gl_period_name = ppr.prog_gl_period_name
4023             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4024 
4025            exception when no_data_found then
4026                 l_actual_cost := 0;
4027            end;
4028 
4029            begin
4030             select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)
4031             +nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)
4032             +nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0))
4033                   into l_prev_period_actual_cost
4034                   from pa_progress_rollup ppr
4035                  where ppr.project_id = p_project_id
4036                    and ppr.object_id = p_object_id
4037                    and ppr.structure_type = 'WORKPLAN'
4038                    and ppr.structure_version_id IS NULL
4039        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4040                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4041                                  from pa_progress_rollup ppr1
4042                                 where ppr1.project_id = ppr.project_id
4043                                   and ppr1.object_id = ppr.object_id
4044                                   and ppr1.structure_type = 'WORKPLAN'
4045                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4046             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4047                                   and as_of_date < ( select min(as_of_date)
4048                                                    from pa_progress_rollup ppr2
4049                                                    where ppr2.project_id = ppr1.project_id
4050                                                      and ppr2.object_id = ppr1.object_id
4051                                                      and structure_type = 'WORKPLAN'
4052                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4053                                                      and ppr2.prog_gl_period_name = p_period_name
4054             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4055                                                 ));
4056            exception when no_data_found then
4057                 l_prev_period_actual_cost := 0;
4058            end;
4059     elsif (pgn_flag = 'N') then
4060                 select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)
4061             +nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)
4062             +nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0))
4063                 into l_actual_cost
4064                 from pa_progress_rollup ppr
4065                 where ppr.project_id = p_project_id
4066                 and ppr.object_id = p_object_id
4067                 and ppr.object_version_id = p_object_version_id
4068             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4069                                   and ppr.structure_version_id IS NULL   --bug 3802177
4070                 and ppr.as_of_date = p_as_of_date
4071     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4072     end if; -- pgn flag.
4073 
4074     ELSIF p_structure_version_id IS NOT NULL
4075     THEN
4076                 select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)
4077                         +nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)
4078                         +nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0))
4079                 into l_actual_cost
4080                 from pa_progress_rollup ppr
4081                 where ppr.project_id = p_project_id
4082                 and ppr.object_id = p_object_id
4083                 and ppr.object_version_id = p_object_version_id
4084                 and structure_type = 'WORKPLAN'
4085                 and ppr.structure_version_id = p_structure_version_id
4086     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4087     END IF;
4088 
4089    end if; -- currency_flag.
4090 
4091     return(NVL(l_actual_cost,0) - nvl(l_prev_period_actual_cost,0));
4092 
4093 END get_incremental_actual_cost;
4094 
4095 FUNCTION get_incremental_actual_rawcost(p_as_of_date           IN              DATE
4096                                     ,p_period_name          IN              VARCHAR2
4097                                     ,pgn_flag               IN              VARCHAR2
4098                                     ,p_project_id           IN              NUMBER
4099                                     ,p_object_id            IN              NUMBER
4100                                     ,p_object_version_id    IN              NUMBER
4101                                     ,currency_flag          IN              VARCHAR2 := 'T'
4102                                     ,p_structure_version_id IN              NUMBER := null  --3694031
4103                 ,p_proj_element_id      IN  NUMBER := null /* Modified for IB4 Progress CR. */
4104                         ) return NUMBER
4105 IS
4106     l_actual_rawcost    NUMBER := NULL;
4107     l_prev_period_actual_rawcost NUMBER;
4108 BEGIN
4109 
4110   if (currency_flag = 'P') then
4111 
4112      IF p_structure_version_id IS NULL
4113      THEN
4114 
4115     if (pgn_flag = 'P') then
4116 
4117           begin
4118             select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
4119             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
4120             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
4121             into l_actual_rawcost
4122                 from pa_progress_rollup ppr
4123                 where ppr.project_id = p_project_id
4124                 and ppr.object_id = p_object_id
4125                 and prog_pa_period_name = p_period_name
4126                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4127                                   and ppr.structure_version_id IS NULL   --bug 3802177
4128     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4129                 and ppr.as_of_date = (select max(as_of_date)
4130                                      from pa_progress_rollup ppr2
4131                                      where ppr2.project_id = ppr.project_id
4132                                      and ppr2.object_id = ppr.object_id
4133                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4134                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4135                                      and ppr2.prog_pa_period_name = ppr.prog_pa_period_name
4136             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4137 
4138            exception when no_data_found then
4139                 l_actual_rawcost := 0;
4140            end;
4141 
4142            begin
4143             select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
4144             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
4145             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
4146                   into l_prev_period_actual_rawcost
4147                   from pa_progress_rollup ppr
4148                  where ppr.project_id = p_project_id
4149                    and ppr.object_id = p_object_id
4150                    and ppr.structure_type = 'WORKPLAN'
4151                    and ppr.structure_version_id IS NULL
4152        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4153                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4154                                  from pa_progress_rollup ppr1
4155                                 where ppr1.project_id = ppr.project_id
4156                                   and ppr1.object_id = ppr.object_id
4157                                   and ppr1.structure_type = 'WORKPLAN'
4158                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4159             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4160                                   and as_of_date < ( select min(as_of_date)
4161                                                    from pa_progress_rollup ppr2
4162                                                    where ppr2.project_id = ppr1.project_id
4163                                                      and ppr2.object_id = ppr1.object_id
4164                                                      and structure_type = 'WORKPLAN'
4165                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4166                                                      and ppr2.prog_pa_period_name = p_period_name
4167             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4168                                                 ));
4169            exception when no_data_found then
4170                 l_prev_period_actual_rawcost := 0;
4171            end;
4172     elsif (pgn_flag ='G') then
4173           begin
4174             select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
4175             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
4176             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
4177             into l_actual_rawcost
4178                 from pa_progress_rollup ppr
4179                 where ppr.project_id = p_project_id
4180                 and ppr.object_id = p_object_id
4181                 and prog_gl_period_name = p_period_name
4182                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4183                                   and ppr.structure_version_id IS NULL   --bug 3802177
4184     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4185                 and ppr.as_of_date = (select max(as_of_date)
4186                                      from pa_progress_rollup ppr2
4187                                      where ppr2.project_id = ppr.project_id
4188                                      and ppr2.object_id = ppr.object_id
4189                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4190                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4191                                      and ppr2.prog_gl_period_name = ppr.prog_gl_period_name
4192             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4193 
4194            exception when no_data_found then
4195                 l_actual_rawcost := 0;
4196            end;
4197 
4198            begin
4199             select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
4200             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
4201             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
4202                   into l_prev_period_actual_rawcost
4203                   from pa_progress_rollup ppr
4204                  where ppr.project_id = p_project_id
4205                    and ppr.object_id = p_object_id
4206                    and ppr.structure_type = 'WORKPLAN'
4207                    and ppr.structure_version_id IS NULL
4208        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4209                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4210                                  from pa_progress_rollup ppr1
4211                                 where ppr1.project_id = ppr.project_id
4212                                   and ppr1.object_id = ppr.object_id
4213                                   and ppr1.structure_type = 'WORKPLAN'
4214                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4215             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4216                                   and as_of_date < ( select min(as_of_date)
4217                                                    from pa_progress_rollup ppr2
4218                                                    where ppr2.project_id = ppr1.project_id
4219                                                      and ppr2.object_id = ppr1.object_id
4220                                                      and structure_type = 'WORKPLAN'
4221                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4222                                                      and ppr2.prog_gl_period_name = p_period_name
4223             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4224                                                 ));
4225            exception when no_data_found then
4226                 l_prev_period_actual_rawcost := 0;
4227            end;
4228     elsif (pgn_flag = 'N') then
4229                 select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
4230             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
4231             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
4232                 into l_actual_rawcost
4233                 from pa_progress_rollup ppr
4234                 where ppr.project_id = p_project_id
4235                 and ppr.object_id = p_object_id
4236                 --and ppr.object_version_id = p_object_version_id
4237             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4238                                   and ppr.structure_version_id IS NULL   --bug 3802177
4239                 and ppr.as_of_date = p_as_of_date
4240     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4241     end if; -- pgn flag.
4242      ELSIF p_structure_version_id IS NOT NULL
4243      THEN
4244                 select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
4245                         +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
4246                         +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
4247                 into l_actual_rawcost
4248                 from pa_progress_rollup ppr
4249                 where ppr.project_id = p_project_id
4250                 and ppr.object_id = p_object_id
4251                 and ppr.object_version_id = p_object_version_id
4252                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4253                 and ppr.structure_version_id = p_structure_version_id
4254     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4255      END IF;
4256 
4257    elsif (currency_flag) = 'T' then
4258 
4259      IF p_structure_version_id IS NULL
4260      THEN
4261     if (pgn_flag = 'P') then
4262           begin
4263             select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
4264             +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
4265             +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0))
4266             into l_actual_rawcost
4267                 from pa_progress_rollup ppr
4268                 where ppr.project_id = p_project_id
4269                 and ppr.object_id = p_object_id
4270                 and prog_pa_period_name = p_period_name
4271                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4272                                   and ppr.structure_version_id IS NULL   --bug 3802177
4273     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4274                 and ppr.as_of_date = (select max(as_of_date)
4275                                      from pa_progress_rollup ppr2
4276                                      where ppr2.project_id = ppr.project_id
4277                                      and ppr2.object_id = ppr.object_id
4278                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4279                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4280                                      and ppr2.prog_pa_period_name = ppr.prog_pa_period_name
4281             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4282 
4283            exception when no_data_found then
4284                 l_actual_rawcost := 0;
4285            end;
4286 
4287            begin
4288             select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
4289             +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
4290             +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0))
4291                   into l_prev_period_actual_rawcost
4292                   from pa_progress_rollup ppr
4293                  where ppr.project_id = p_project_id
4294                    and ppr.object_id = p_object_id
4295                    and ppr.structure_type = 'WORKPLAN'
4296                    and ppr.structure_version_id IS NULL
4297        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4298                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4299                                  from pa_progress_rollup ppr1
4300                                 where ppr1.project_id = ppr.project_id
4301                                   and ppr1.object_id = ppr.object_id
4302                                   and ppr1.structure_type = 'WORKPLAN'
4303                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4304             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4305                                   and as_of_date < ( select min(as_of_date)
4306                                                    from pa_progress_rollup ppr2
4307                                                    where ppr2.project_id = ppr1.project_id
4308                                                      and ppr2.object_id = ppr1.object_id
4309                                                      and structure_type = 'WORKPLAN'
4310                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4311                                                      and ppr2.prog_pa_period_name = p_period_name
4312             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4313                                                 ));
4314            exception when no_data_found then
4315                 l_prev_period_actual_rawcost := 0;
4316            end;
4317     elsif (pgn_flag ='G') then
4318 
4319           begin
4320             select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
4321             +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
4322             +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0))
4323             into l_actual_rawcost
4324                 from pa_progress_rollup ppr
4325                 where ppr.project_id = p_project_id
4326                 and ppr.object_id = p_object_id
4327                 and prog_gl_period_name = p_period_name
4328                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4329                                   and ppr.structure_version_id IS NULL   --bug 3802177
4330     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4331                 and ppr.as_of_date = (select max(as_of_date)
4332                                      from pa_progress_rollup ppr2
4333                                      where ppr2.project_id = ppr.project_id
4334                                      and ppr2.object_id = ppr.object_id
4335                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4336                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4337                                      and ppr2.prog_gl_period_name = ppr.prog_gl_period_name
4338             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4339 
4340            exception when no_data_found then
4341                 l_actual_rawcost := 0;
4342            end;
4343 
4344            begin
4345             select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
4346             +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
4347             +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0))
4348                   into l_prev_period_actual_rawcost
4349                   from pa_progress_rollup ppr
4350                  where ppr.project_id = p_project_id
4351                    and ppr.object_id = p_object_id
4352                    and ppr.structure_type = 'WORKPLAN'
4353                    and ppr.structure_version_id IS NULL
4354        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4355                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4356                                  from pa_progress_rollup ppr1
4357                                 where ppr1.project_id = ppr.project_id
4358                                   and ppr1.object_id = ppr.object_id
4359                                   and ppr1.structure_type = 'WORKPLAN'
4360                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4361             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4362                                   and as_of_date < ( select min(as_of_date)
4363                                                    from pa_progress_rollup ppr2
4364                                                    where ppr2.project_id = ppr1.project_id
4365                                                      and ppr2.object_id = ppr1.object_id
4366                                                      and structure_type = 'WORKPLAN'
4367                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4368                                                      and ppr2.prog_gl_period_name = p_period_name
4369             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4370                                                 ));
4371            exception when no_data_found then
4372                 l_prev_period_actual_rawcost := 0;
4373            end;
4374     elsif (pgn_flag = 'N') then
4375                 select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
4376             +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
4377             +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0))
4378                 into l_actual_rawcost
4379                 from pa_progress_rollup ppr
4380                 where ppr.project_id = p_project_id
4381                 and ppr.object_id = p_object_id
4382                 and ppr.object_version_id = p_object_version_id
4383             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4384                                   and ppr.structure_version_id IS NULL   --bug 3802177
4385                 and ppr.as_of_date = p_as_of_date
4386     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4387     end if; -- pgn flag.
4388       ELSIF p_structure_version_id IS NOT NULL
4389       THEN
4390                 select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
4391                         +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
4392                         +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0))
4393                 into l_actual_rawcost
4394                 from pa_progress_rollup ppr
4395                 where ppr.project_id = p_project_id
4396                 and ppr.object_id = p_object_id
4397                 and ppr.object_version_id = p_object_version_id
4398                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4399                 and ppr.structure_version_id = p_structure_version_id
4400     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4401       END IF;
4402 
4403    elsif (currency_flag = 'F') then
4404 
4405       IF p_structure_version_id IS NULL
4406       THEN
4407     if (pgn_flag = 'P') then
4408           begin
4409             select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
4410             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
4411             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0))
4412             into l_actual_rawcost
4413                 from pa_progress_rollup ppr
4414                 where ppr.project_id = p_project_id
4415                 and ppr.object_id = p_object_id
4416                 and prog_pa_period_name = p_period_name
4417                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4418                                   and ppr.structure_version_id IS NULL   --bug 3802177
4419     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4420                 and ppr.as_of_date = (select max(as_of_date)
4421                                      from pa_progress_rollup ppr2
4422                                      where ppr2.project_id = ppr.project_id
4423                                      and ppr2.object_id = ppr.object_id
4424                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4425                                   and ppr2.structure_version_id IS NULL   --bug 3802177
4426                                      and ppr2.prog_pa_period_name = ppr.prog_pa_period_name
4427             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4428 
4429            exception when no_data_found then
4430                 l_actual_rawcost := 0;
4431            end;
4432 
4433            begin
4434             select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
4435             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
4436             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0))
4437                   into l_prev_period_actual_rawcost
4438                   from pa_progress_rollup ppr
4439                  where ppr.project_id = p_project_id
4440                    and ppr.object_id = p_object_id
4441                    and ppr.structure_type = 'WORKPLAN'
4442                    and ppr.structure_version_id IS NULL
4443        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4444                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4445                                  from pa_progress_rollup ppr1
4446                                 where ppr1.project_id = ppr.project_id
4447                                   and ppr1.object_id = ppr.object_id
4448                                   and ppr1.structure_type = 'WORKPLAN'
4449                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4450                             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4451                                   and as_of_date < ( select min(as_of_date)
4452                                                    from pa_progress_rollup ppr2
4453                                                    where ppr2.project_id = ppr1.project_id
4454                                                      and ppr2.object_id = ppr1.object_id
4455                                                      and structure_type = 'WORKPLAN'
4456                                                      and ppr2.structure_version_id IS NULL   --bug 3802177
4457                                                      and ppr2.prog_pa_period_name = p_period_name
4458             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4459                                                 ));
4460            exception when no_data_found then
4461                 l_prev_period_actual_rawcost := 0;
4462            end;
4463     elsif (pgn_flag ='G') then
4464           begin
4465             select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
4466             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
4467             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0))
4468             into l_actual_rawcost
4469                 from pa_progress_rollup ppr
4470                 where ppr.project_id = p_project_id
4471                 and ppr.object_id = p_object_id
4472                 and prog_gl_period_name = p_period_name
4473                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4474                 and ppr.structure_version_id IS NULL   --bug 3802177
4475     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4476                 and ppr.as_of_date = (select max(as_of_date)
4477                                      from pa_progress_rollup ppr2
4478                                      where ppr2.project_id = ppr.project_id
4479                                      and ppr2.object_id = ppr.object_id
4480                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4481                                      and ppr2.structure_version_id IS NULL   --bug 3802177
4482                                      and ppr2.prog_gl_period_name = ppr.prog_gl_period_name
4483             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4484 
4485            exception when no_data_found then
4486                 l_actual_rawcost := 0;
4487            end;
4488 
4489            begin
4490             select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
4491             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
4492             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0))
4493                   into l_prev_period_actual_rawcost
4494                   from pa_progress_rollup ppr
4495                  where ppr.project_id = p_project_id
4496                    and ppr.object_id = p_object_id
4497                    and ppr.structure_type = 'WORKPLAN'
4498                    and ppr.structure_version_id IS NULL
4499        and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4500                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4501                                  from pa_progress_rollup ppr1
4502                                 where ppr1.project_id = ppr.project_id
4503                                   and ppr1.object_id = ppr.object_id
4504                                   and ppr1.structure_type = 'WORKPLAN'
4505                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4506             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4507                                   and as_of_date < ( select min(as_of_date)
4508                                                    from pa_progress_rollup ppr2
4509                                                    where ppr2.project_id = ppr1.project_id
4510                                                      and ppr2.object_id = ppr1.object_id
4511                                                      and structure_type = 'WORKPLAN'
4512                                                      and ppr2.structure_version_id IS NULL   --bug 3802177
4513                                                      and ppr2.prog_gl_period_name = p_period_name
4514             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4515                                                 ));
4516            exception when no_data_found then
4517                 l_prev_period_actual_rawcost := 0;
4518            end;
4519     elsif (pgn_flag = 'N') then
4520                 select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
4521             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
4522             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0))
4523                 into l_actual_rawcost
4524                 from pa_progress_rollup ppr
4525                 where ppr.project_id = p_project_id
4526                 and ppr.object_id = p_object_id
4527                 and ppr.object_version_id = p_object_version_id
4528             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4529                 and ppr.structure_version_id IS NULL   --bug 3802177
4530                 and ppr.as_of_date = p_as_of_date
4531     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4532     end if; -- pgn flag.
4533      ELSIF p_structure_version_id IS NOT NULL
4534      THEN
4535                select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
4536                         +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
4537                         +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0))
4538                 into l_actual_rawcost
4539                 from pa_progress_rollup ppr
4540                 where ppr.project_id = p_project_id
4541                 and ppr.object_id = p_object_id
4542                 and ppr.object_version_id = p_object_version_id
4543                 and structure_type = 'WORKPLAN'
4544                 and ppr.structure_version_id = p_structure_version_id
4545     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4546      END IF;
4547 
4548     end if; -- currency_flag.
4549 
4550     return(NVL(l_actual_rawcost,0) - nvl(l_prev_period_actual_rawcost,0));
4551 
4552 END get_incremental_actual_rawcost;
4553 
4554 FUNCTION get_incremental_actual_effort(p_as_of_date           IN              DATE
4555                                       ,p_period_name          IN              VARCHAR2
4556                                       ,pgn_flag               IN              VARCHAR2
4557                                       ,p_project_id           IN              NUMBER
4558                                       ,p_object_id            IN              NUMBER
4559                                       ,p_object_version_id    IN              NUMBER
4560                                       ,p_structure_version_id IN              NUMBER := null  --3694031
4561                   ,p_proj_element_id      IN   NUMBER := null /* Modified for IB4 Progress CR. */
4562                                       ) return NUMBER
4563 IS
4564     l_actual_effort NUMBER := NULL;
4565     l_prev_period_actual_effort  NUMBER;  --maansari6/15 bug 3694031
4566 BEGIN
4567 
4568     IF p_structure_version_id IS NULL
4569     THEN
4570     if (pgn_flag = 'P') then
4571 --maansari6/15  3694031
4572           begin
4573                 select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0))
4574                 into l_actual_effort
4575                 from pa_progress_rollup ppr
4576                 where ppr.project_id = p_project_id
4577                 and ppr.object_id = p_object_id
4578                 and prog_pa_period_name = p_period_name
4579                 and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4580                 and ppr.structure_version_id IS NULL   --bug 3802177
4581             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4582                 and ppr.as_of_date = (select max(as_of_date)
4583                                      from pa_progress_rollup ppr2
4584                                      where ppr2.project_id = ppr.project_id
4585                                      and ppr2.object_id = ppr.object_id
4586                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4587                                      and ppr2.structure_version_id IS NULL   --bug 3802177
4588                                      and ppr2.prog_pa_period_name = ppr.prog_pa_period_name
4589                          and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4590 
4591            exception when no_data_found then
4592                 l_actual_effort := 0;
4593            end;
4594 
4595            begin
4596                 select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0))
4597                   into l_prev_period_actual_effort
4598                   from pa_progress_rollup ppr
4599                  where ppr.project_id = p_project_id
4600                    and ppr.object_id = p_object_id
4601                    and ppr.structure_type = 'WORKPLAN'
4602                    and ppr.structure_version_id IS NULL
4603                and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4604                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4605                                  from pa_progress_rollup ppr1
4606                                 where ppr1.project_id = ppr.project_id
4607                                   and ppr1.object_id = ppr.object_id
4608                                   and ppr1.structure_type = 'WORKPLAN'
4609                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4610                           and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4611                                   and as_of_date < ( select min(as_of_date)
4612                                                    from pa_progress_rollup ppr2
4613                                                    where ppr2.project_id = ppr1.project_id
4614                                                      and ppr2.object_id = ppr1.object_id
4615                                                      and structure_type = 'WORKPLAN'
4616                                                      and ppr2.structure_version_id IS NULL   --bug 3802177
4617                                                      and ppr2.prog_pa_period_name = p_period_name
4618             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4619                                                 ));
4620            exception when no_data_found then
4621                 l_prev_period_actual_effort := 0;
4622            end;
4623     elsif (pgn_flag ='G') then
4624 
4625 --maansari6/15  3694031
4626           begin
4627                 select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0))
4628                 into l_actual_effort
4629                 from pa_progress_rollup ppr
4630                 where ppr.project_id = p_project_id
4631                 and ppr.object_id = p_object_id
4632                 and prog_gl_period_name = p_period_name
4633             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4634                 and ppr.structure_version_id IS NULL   --bug 3802177
4635     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4636                 and ppr.as_of_date = (select max(as_of_date)
4637                                      from pa_progress_rollup ppr2
4638                                      where ppr2.project_id = ppr.project_id
4639                                      and ppr2.object_id = ppr.object_id
4640                                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4641                 and ppr2.structure_version_id IS NULL   --bug 3802177
4642                              and ppr2.prog_gl_period_name = ppr.prog_gl_period_name --maansari6/15 bug 3694031
4643             and ppr2.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */);
4644 
4645            exception when no_data_found then
4646                 l_actual_effort := 0;
4647            end;
4648 
4649            begin
4650                 select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0))
4651                   into l_prev_period_actual_effort
4652                   from pa_progress_rollup ppr
4653                  where ppr.project_id = p_project_id
4654                    and ppr.object_id = p_object_id
4655                    and ppr.structure_type = 'WORKPLAN'
4656                    and ppr.structure_version_id IS NULL
4657                and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
4658                    and ppr.as_of_date = ( select max(ppr1.as_of_date)
4659                                  from pa_progress_rollup ppr1
4660                                 where ppr1.project_id = ppr.project_id
4661                                   and ppr1.object_id = ppr.object_id
4662                                   and ppr1.structure_type = 'WORKPLAN'
4663                                   and ppr1.structure_version_id IS NULL   --bug 3802177
4664                             and ppr1.proj_element_id = ppr.proj_element_id /* Modified for IB4 Progress CR. */
4665                                   and as_of_date < ( select min(as_of_date)
4666                                                    from pa_progress_rollup ppr2
4667                                                    where ppr2.project_id = ppr1.project_id
4668                                                      and ppr2.object_id = ppr1.object_id
4669                                                      and structure_type = 'WORKPLAN'
4670                                                      and ppr2.structure_version_id IS NULL   --bug 3802177
4671                                                      and ppr2.prog_gl_period_name = p_period_name
4672             and ppr2.proj_element_id = ppr1.proj_element_id /* Modified for IB4 Progress CR. */
4673                                                 ));
4674            exception when no_data_found then
4675                 l_prev_period_actual_effort := 0;
4676            end;
4677     --maansari6/15
4678 
4679     elsif (pgn_flag = 'N') then
4680                 select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0))
4681                 into l_actual_effort
4682                 from pa_progress_rollup ppr
4683                 where ppr.project_id = p_project_id
4684                 and ppr.object_id = p_object_id
4685                 and ppr.object_version_id = p_object_version_id
4686             and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4687                 and ppr.structure_version_id IS NULL   --bug 3802177
4688                 and ppr.as_of_date = p_as_of_date
4689             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4690     end if;
4691 
4692    ELSIF p_structure_version_id IS NOT NULL
4693    THEN
4694                select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0))
4695                 into l_actual_effort
4696                 from pa_progress_rollup ppr
4697                 where ppr.project_id = p_project_id
4698                 and ppr.object_id = p_object_id
4699                 and ppr.object_version_id = p_object_version_id
4700              and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4701                 and ppr.structure_version_id = p_structure_version_id
4702     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4703    END IF;
4704 
4705     return(nvl(l_actual_effort,0) - nvl(l_prev_period_actual_effort,0)); --maansari6/15
4706 END get_incremental_actual_effort;
4707 
4708 -- Bug 3879461 : This function is not used anywhere except AMG view PA_TASK_ASSIGNMENTS_AMG_V
4709 -- there it needs to be replaced with get_act_txn_cost_this_period
4710 -- THIS FUNCTION IS NOW USED IN ASSIGNMENT VIEWS patvw009.sql and patvw021.sql. Please refer bug 3910193
4711 FUNCTION get_act_cost_this_period (
4712                                      p_as_of_date      IN     DATE
4713                                     ,p_project_id        IN     NUMBER
4714                                     ,p_object_id         IN     NUMBER
4715                                     ,p_object_version_id IN     NUMBER
4716                                     ,p_proj_element_id   IN     NUMBER := null /* Modified for IB4 Progress CR. */) return NUMBER
4717 IS
4718     l_act_cost_period   NUMBER := NULL;
4719     l_act_cost_date     NUMBER := NULL;
4720     l_act_cost_pub      NUMBER := NULL;
4721 
4722         cursor c_prev_prog_rec is
4723                  select (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)
4724                      +nvl(ppr.eqpmt_act_cost_to_date_pc,0)+nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
4725                      +nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0)) act_cost_to_date
4726                 from pa_progress_rollup ppr
4727                 where ppr.project_id = p_project_id
4728                 and ppr.object_id = p_object_id
4729                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4730                         and ppr.structure_version_id is null -- Bug 3764224
4731                 and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
4732                 and current_flag = 'Y'
4733                 ;
4734 
4735                 cursor c_this_prog_rec is
4736                  select (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)
4737                      +nvl(ppr.eqpmt_act_cost_to_date_pc,0)+nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
4738                      +nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0)) act_cost_to_date
4739                 from pa_progress_rollup ppr
4740                 where ppr.project_id = p_project_id
4741                 and ppr.object_id = p_object_id
4742                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4743                 and ppr.structure_version_id is null -- Bug 3764224
4744                 and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
4745                 and ppr.current_flag= 'W'
4746                 ;
4747 
4748 BEGIN
4749 
4750     open c_prev_prog_rec;
4751     fetch c_prev_prog_rec into l_act_cost_pub;
4752     close c_prev_prog_rec;
4753 
4754     open c_this_prog_rec;
4755     fetch c_this_prog_rec into l_act_cost_date;
4756     close c_this_prog_rec;
4757 
4758     l_act_cost_period := (nvl(l_act_cost_date,0) - nvl(l_act_cost_pub,0));
4759 
4760         if (l_act_cost_period < 0) then
4761                 l_act_cost_period := 0;
4762     end if;
4763 
4764     return(l_act_cost_period);
4765 END get_act_cost_this_period;
4766 
4767 FUNCTION get_act_txn_cost_this_period (p_as_of_date      IN     DATE
4768                                     ,p_project_id        IN     NUMBER
4769                                     ,p_object_id         IN     NUMBER
4770                                     ,p_object_version_id IN     NUMBER
4771         ,p_proj_element_id   IN     NUMBER := null /* Modified for IB4 Progress CR. */) return NUMBER
4772 IS
4773     l_act_cost_period   NUMBER := NULL;
4774     l_act_cost_date     NUMBER := NULL;
4775     l_act_cost_pub      NUMBER := NULL;
4776 
4777 /*
4778     cursor c1 is
4779          select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)+nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)+nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) act_cost_to_date
4780                 from pa_progress_rollup ppr
4781                 where ppr.project_id = p_project_id
4782                 and ppr.object_id = p_object_id
4783                 -- and ppr.object_version_id = p_object_version_id
4784          and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4785     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
4786                 and ppr.as_of_date = (select max(ppr2.as_of_date)
4787                                      from pa_progress_rollup ppr2
4788                                      where ppr2.project_id = p_project_id
4789                                      and ppr2.object_id = p_object_id
4790                                      -- and ppr2.object_version_id = p_object_version_id
4791                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
4792                                      and ppr2.as_of_date > p_as_of_date
4793     and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR. );
4794     l_c1rec     c1%rowtype;
4795 */
4796 
4797 /* BEGIN: Commenting code for Bug # 3808127.
4798     cursor c_prev_prog_rec is
4799          select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)+nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)+nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) act_cost_to_date
4800                 from pa_progress_rollup ppr
4801                 where ppr.project_id = p_project_id
4802                 and ppr.object_id = p_object_id
4803                 -- and ppr.object_version_id = p_object_version_id
4804             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4805         and ppr.structure_version_id is null -- Bug 3764224
4806             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
4807                 and ppr.as_of_date = (select max(ppr2.as_of_date)
4808                                      from pa_progress_rollup ppr2
4809                                      where ppr2.project_id = p_project_id
4810                                      and ppr2.object_id = p_object_id
4811                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4812                      and ppr2.structure_version_id is null -- Bug 3764224
4813                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
4814                                      and ppr2.as_of_date < p_as_of_date);
4815 
4816     cursor c_this_prog_rec is
4817         select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)+nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)+nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) act_cost_to_date
4818                 from pa_progress_rollup ppr
4819                 where ppr.project_id = p_project_id
4820                 and ppr.object_id = p_object_id
4821                 -- and ppr.object_version_id = p_object_version_id
4822             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4823         and ppr.structure_version_id is null -- Bug 3764224
4824             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
4825                 and ppr.as_of_date = (select max(ppr2.as_of_date)
4826                                      from pa_progress_rollup ppr2
4827                                      where ppr2.project_id = p_project_id
4828                                      and ppr2.object_id = p_object_id
4829                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4830                      and ppr2.structure_version_id is null -- Bug 3764224
4831                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
4832                                      and ppr2.as_of_date >= p_as_of_date);
4833 
4834  END: Commenting code for Bug # 3808127. */
4835 
4836 -- BEGIN: Adding code for Bug # 3808127.
4837 
4838         cursor c_prev_prog_rec is
4839                  select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
4840                      +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
4841                      +nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) act_cost_to_date
4842                 from pa_progress_rollup ppr
4843                 where ppr.project_id = p_project_id
4844                 and ppr.object_id = p_object_id
4845                 -- and ppr.object_version_id = p_object_version_id
4846                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4847                         and ppr.structure_version_id is null -- Bug 3764224
4848                 and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
4849                 and current_flag = 'Y'
4850                 ;
4851 
4852                 cursor c_this_prog_rec is
4853                  select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
4854                      +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
4855                      +nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) act_cost_to_date
4856                 from pa_progress_rollup ppr
4857         -- Bug 3879461 : No need to have percent complete table join now we can directly check current_flag as W
4858 --                    ,pa_percent_completes ppc
4859                 where ppr.project_id = p_project_id
4860                 and ppr.object_id = p_object_id
4861                 -- and ppr.object_version_id = p_object_version_id
4862                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4863                 and ppr.structure_version_id is null -- Bug 3764224
4864                 and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
4865 --                and ppr.object_id = ppc.object_id
4866 --                and ppr.as_of_date = ppc.date_computed
4867 --                and ppr.percent_complete_id = ppc.percent_complete_id
4868 --                and ppr.project_id = ppc.project_id
4869 --                and ppr.proj_element_id=ppc.task_id
4870 --                and ppr.structure_type = ppc.structure_type
4871 --                and ppc.current_flag= 'N'
4872 --                and ppc.published_flag = 'N'
4873                   and ppr.current_flag= 'W'
4874                 ;
4875 
4876 -- END: Adding code for Bug # 3808127.
4877 
4878 BEGIN
4879 -- Bug 3764224 : This function(_this_peiord) are used only in assignment cases. So it is safe to select from rollup table itself
4880 -- no need to go in percent complete table
4881 -- Bug 3764224 : RLM Changes : Commented the below code. This was not calculating the actual this period
4882 /*
4883     open c1;
4884     fetch c1 into l_c1rec;
4885     if c1%found then
4886         select (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)+nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)+nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0))
4887                 into l_act_cost_pub
4888                 from pa_progress_rollup ppr,pa_percent_completes ppc
4889                 where ppr.project_id = ppc.project_id
4890             and ppr.object_id = ppc.object_id
4891             and ppr.object_version_id = ppc.object_version_id
4892             and ppr.as_of_date = ppc.date_computed (+)
4893         and ppr.project_id = p_project_id
4894                 and ppr.object_id = p_object_id
4895                 -- and ppr.object_version_id = p_object_version_id
4896     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
4897             and ppr.percent_complete_id = ppc.percent_complete_id
4898          and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4899          and ppr.structure_type = ppc.structure_type(+) -- FPM Dev CR 3
4900         and ppr.proj_element_id = ppc.task_id (+) -- Modified for IB4 Progress CR.
4901                 and ppr.as_of_date = (select max(ppc2.date_computed)
4902                                      from pa_percent_completes ppc2
4903                                      where ppc2.project_id = p_project_id
4904                                      and ppc2.object_id = p_object_id
4905                                      -- and ppc2.object_version_id = p_object_version_id
4906                      and ppc2.published_flag = 'Y'
4907                      and ppc2.current_flag = 'Y'
4908                          and ppc2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
4909         and ppc2.task_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
4910                      );
4911                 l_act_cost_period := (nvl(l_c1rec.act_cost_to_date,0) - nvl(l_act_cost_pub,0));
4912 
4913     end if;
4914     close c1;
4915 */
4916 
4917     open c_prev_prog_rec;
4918     fetch c_prev_prog_rec into l_act_cost_pub;
4919     close c_prev_prog_rec;
4920 
4921     open c_this_prog_rec;
4922     fetch c_this_prog_rec into l_act_cost_date;
4923     close c_this_prog_rec;
4924 
4925     l_act_cost_period := (nvl(l_act_cost_date,0) - nvl(l_act_cost_pub,0));
4926 
4927         if (l_act_cost_period < 0) then
4928                 l_act_cost_period := 0;
4929     end if;
4930 
4931     return(l_act_cost_period);
4932 END get_act_txn_cost_this_period;
4933 
4934 -- Bug 3621404 : Raw Cost Changes, Added this procedure
4935 PROCEDURE get_all_amounts_cumulative
4936     (p_project_id       IN     NUMBER
4937     ,p_object_id        IN     NUMBER
4938     ,p_object_type          IN     VARCHAR2
4939         ,p_structure_version_id IN     NUMBER := NULL -- Do not pass if published structure version
4940     ,p_as_of_date           IN     DATE   := NULL -- Must pass if published structure version
4941     ,x_act_bur_cost_tc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4942     ,x_act_bur_cost_pc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4943     ,x_act_bur_cost_fc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4944     ,x_act_raw_cost_tc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4945     ,x_act_raw_cost_pc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4946     ,x_act_raw_cost_fc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4947     ,x_etc_bur_cost_tc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4948     ,x_etc_bur_cost_pc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4949     ,x_etc_bur_cost_fc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4950     ,x_etc_raw_cost_tc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4951     ,x_etc_raw_cost_pc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4952     ,x_etc_raw_cost_fc  OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4953     ,x_act_effort       OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4954     ,x_etc_effort       OUT    NOCOPY NUMBER --File.Sql.39 bug 4440895
4955         ,x_return_status        OUT    NOCOPY VARCHAR2       --File.Sql.39 bug 4440895
4956         ,x_msg_count            OUT    NOCOPY NUMBER         --File.Sql.39 bug 4440895
4957         ,x_msg_data             OUT    NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4958     ,p_proj_element_id  IN     NUMBER   /* Modified for IB4 Progress CR. */
4959     )
4960 IS
4961     -- Bug 3627315 Issue 8 :Ccolumns were wrongly selected. Corrected it.
4962 
4963     CURSOR C_GET_WORKING_AMOUNT IS
4964      SELECT  (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)+nvl(ppr.eqpmt_act_cost_to_date_tc,0)
4965                      +nvl(ppr.subprj_oth_act_cost_to_date_tc,0)+nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) act_bur_cost_tc,
4966          (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)+nvl(ppr.eqpmt_act_cost_to_date_pc,0)
4967                      +nvl(ppr.subprj_oth_act_cost_to_date_pc,0)+nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0)) act_bur_cost_pc,
4968          (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)+nvl(ppr.eqpmt_act_cost_to_date_fc,0)
4969                      +nvl(ppr.subprj_oth_act_cost_to_date_fc,0)+nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0)) act_bur_cost_fc,
4970          (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)+nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)
4971                      +nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)+nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_raw_cost_tc,
4972          (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)+nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)
4973                      +nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)+nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0)) act_raw_cost_pc,
4974          (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)+nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)
4975                      +nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)+nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0)) act_raw_cost_fc,
4976          (nvl(ppr.oth_etc_cost_tc,0)+nvl(ppr.ppl_etc_cost_tc,0)+nvl(ppr.eqpmt_etc_cost_tc,0)
4977                      +nvl(ppr.subprj_oth_etc_cost_tc,0)+nvl(ppr.subprj_ppl_etc_cost_tc,0)+nvl(ppr.subprj_eqpmt_etc_cost_tc,0)) etc_bur_cost_tc,
4978          (nvl(ppr.oth_etc_cost_pc,0)+nvl(ppr.ppl_etc_cost_pc,0)+nvl(ppr.eqpmt_etc_cost_pc,0)
4979                      +nvl(ppr.subprj_oth_etc_cost_pc,0)+nvl(ppr.subprj_ppl_etc_cost_pc,0)+nvl(ppr.subprj_eqpmt_etc_cost_pc,0)) etc_bur_cost_pc,
4980          (nvl(ppr.oth_etc_cost_fc,0)+nvl(ppr.ppl_etc_cost_fc,0)+nvl(ppr.eqpmt_etc_cost_fc,0)
4981                      +nvl(ppr.subprj_oth_etc_cost_fc,0)+nvl(ppr.subprj_ppl_etc_cost_fc,0)+nvl(ppr.subprj_eqpmt_etc_cost_fc,0)) etc_bur_cost_fc,
4982          (nvl(ppr.oth_etc_rawcost_tc,0)+nvl(ppr.ppl_etc_rawcost_tc,0)+nvl(ppr.eqpmt_etc_rawcost_tc,0)
4983                      +nvl(ppr.subprj_oth_etc_rawcost_tc,0)+nvl(ppr.subprj_ppl_etc_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_etc_rawcost_tc,0)) etc_raw_cost_tc,
4984          (nvl(ppr.oth_etc_rawcost_pc,0)+nvl(ppr.ppl_etc_rawcost_pc,0)+nvl(ppr.eqpmt_etc_rawcost_pc,0)
4985                      +nvl(ppr.subprj_oth_etc_rawcost_pc,0)+nvl(ppr.subprj_ppl_etc_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_etc_rawcost_pc,0)) etc_raw_cost_pc,
4986          (nvl(ppr.oth_etc_rawcost_fc,0)+nvl(ppr.ppl_etc_rawcost_fc,0)+nvl(ppr.eqpmt_etc_rawcost_fc,0)
4987                      +nvl(ppr.subprj_oth_etc_rawcost_fc,0)+nvl(ppr.subprj_ppl_etc_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_etc_rawcost_fc,0)) etc_raw_cost_fc,
4988          (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0))--+nvl(ppr.oth_quantity_to_date,0))Oth quantity is not required as it can be in diffrent UOM
4989                      +nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0) act_effort,
4990          (nvl(ppr.estimated_remaining_effort,0)+nvl(ppr.eqpmt_etc_effort,0))--+nvl(ppr.oth_etc_quantity,0))Oth quantity is not required as it can be in diffrent UOM
4991                      +nvl(ppr.subprj_ppl_etc_effort,0)+nvl(ppr.subprj_eqpmt_etc_effort,0) etc_effort
4992                 FROM pa_progress_rollup ppr
4993                 WHERE ppr.project_id = p_project_id
4994                 AND ppr.object_id = p_object_id
4995         AND ppr.object_type = p_object_type
4996                 AND ppr.structure_version_id = p_structure_version_id
4997             AND ppr.structure_type = 'WORKPLAN'
4998     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */;
4999 
5000     CURSOR C_GET_PUBLISHED_AMOUNT IS
5001      SELECT  (nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)+nvl(ppr.eqpmt_act_cost_to_date_tc,0)
5002                      +nvl(ppr.subprj_oth_act_cost_to_date_tc,0)+nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) act_bur_cost_tc,
5003          (nvl(ppr.oth_act_cost_to_date_pc,0)+nvl(ppr.ppl_act_cost_to_date_pc,0)+nvl(ppr.eqpmt_act_cost_to_date_pc,0)
5004                      +nvl(ppr.subprj_oth_act_cost_to_date_pc,0)+nvl(ppr.subprj_ppl_act_cost_pc,0)+nvl(ppr.subprj_eqpmt_act_cost_pc,0)) act_bur_cost_pc,
5005          (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)+nvl(ppr.eqpmt_act_cost_to_date_fc,0)
5006                      +nvl(ppr.subprj_oth_act_cost_to_date_fc,0)+nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0)) act_bur_cost_fc,
5007          (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)+nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)
5008                      +nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)+nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_raw_cost_tc,
5009          (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)+nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)
5010                      +nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)+nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0)) act_raw_cost_pc,
5011          (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)+nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)
5012                      +nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)+nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0)) act_raw_cost_fc,
5013          (nvl(ppr.oth_etc_cost_tc,0)+nvl(ppr.ppl_etc_cost_tc,0)+nvl(ppr.eqpmt_etc_cost_tc,0)
5014                      +nvl(ppr.subprj_oth_etc_cost_tc,0)+nvl(ppr.subprj_ppl_etc_cost_tc,0)+nvl(ppr.subprj_eqpmt_etc_cost_tc,0)) etc_bur_cost_tc,
5015          (nvl(ppr.oth_etc_cost_pc,0)+nvl(ppr.ppl_etc_cost_pc,0)+nvl(ppr.eqpmt_etc_cost_pc,0)
5016                      +nvl(ppr.subprj_oth_etc_cost_pc,0)+nvl(ppr.subprj_ppl_etc_cost_pc,0)+nvl(ppr.subprj_eqpmt_etc_cost_pc,0)) etc_bur_cost_pc,
5017          (nvl(ppr.oth_etc_cost_fc,0)+nvl(ppr.ppl_etc_cost_fc,0)+nvl(ppr.eqpmt_etc_cost_fc,0)
5018                      +nvl(ppr.subprj_oth_etc_cost_fc,0)+nvl(ppr.subprj_ppl_etc_cost_fc,0)+nvl(ppr.subprj_eqpmt_etc_cost_fc,0)) etc_bur_cost_fc,
5019          (nvl(ppr.oth_etc_rawcost_tc,0)+nvl(ppr.ppl_etc_rawcost_tc,0)+nvl(ppr.eqpmt_etc_rawcost_tc,0)
5020                      +nvl(ppr.subprj_oth_etc_rawcost_tc,0)+nvl(ppr.subprj_ppl_etc_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_etc_rawcost_tc,0)) etc_raw_cost_tc,
5021          (nvl(ppr.oth_etc_rawcost_pc,0)+nvl(ppr.ppl_etc_rawcost_pc,0)+nvl(ppr.eqpmt_etc_rawcost_pc,0)
5022                      +nvl(ppr.subprj_oth_etc_rawcost_pc,0)+nvl(ppr.subprj_ppl_etc_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_etc_rawcost_pc,0)) etc_raw_cost_pc,
5023          (nvl(ppr.oth_etc_rawcost_fc,0)+nvl(ppr.ppl_etc_rawcost_fc,0)+nvl(ppr.eqpmt_etc_rawcost_fc,0)
5024                      +nvl(ppr.subprj_oth_etc_rawcost_fc,0)+nvl(ppr.subprj_ppl_etc_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_etc_rawcost_fc,0)) etc_raw_cost_fc,
5025          (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0))--+nvl(ppr.oth_quantity_to_date,0))Oth quantity is not required as it can be in diffrent UOM
5026                      +nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0) act_effort,
5027          (nvl(ppr.estimated_remaining_effort,0)+nvl(ppr.eqpmt_etc_effort,0))--+nvl(ppr.oth_etc_quantity,0))Oth quantity is not required as it can be in diffrent UOM
5028                      +nvl(ppr.subprj_ppl_etc_effort,0)+nvl(ppr.subprj_eqpmt_etc_effort,0) etc_effort
5029                 FROM pa_progress_rollup ppr
5030                 WHERE ppr.project_id = p_project_id
5031                 AND ppr.object_id = p_object_id
5032         AND ppr.object_type = p_object_type
5033                 AND ppr.structure_version_id is null
5034             AND ppr.structure_type = 'WORKPLAN'
5035             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
5036             AND ppr.current_flag <> 'W'   -- Bug 3879461
5037         AND trunc(as_of_date) = (
5038                 SELECT trunc(max(as_of_date))
5039                 FROM pa_progress_rollup ppr2
5040                         WHERE ppr2.project_id = p_project_id
5041                 AND ppr2.object_id = p_object_id
5042                 AND ppr2.object_type = p_object_type
5043                 AND ppr2.structure_version_id is null
5044                 AND ppr2.structure_type = 'WORKPLAN'
5045                 AND as_of_date <= p_as_of_date
5046                     AND ppr2.current_flag <> 'W'   -- Bug 3879461
5047                             and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
5048             );
5049 
5050 BEGIN
5051     x_return_status := 'S';
5052 
5053     IF p_structure_version_id IS NOT NULL THEN
5054         OPEN C_GET_WORKING_AMOUNT;
5055         FETCH C_GET_WORKING_AMOUNT INTO x_act_bur_cost_tc, x_act_bur_cost_pc,
5056                         x_act_bur_cost_fc, x_act_raw_cost_tc,
5057                         x_act_raw_cost_pc, x_act_raw_cost_fc,
5058                         x_etc_bur_cost_tc, x_etc_bur_cost_pc,
5059                         x_etc_bur_cost_fc, x_etc_raw_cost_tc,
5060                         x_etc_raw_cost_pc, x_etc_raw_cost_fc,
5061                         x_act_effort, x_etc_effort;
5062 
5063         IF C_GET_WORKING_AMOUNT%NOTFOUND THEN
5064             x_act_bur_cost_tc := 0;
5065             x_act_bur_cost_pc := 0;
5066             x_act_bur_cost_fc := 0;
5067             x_act_raw_cost_tc := 0;
5068             x_act_raw_cost_pc := 0;
5069             x_act_raw_cost_fc := 0;
5070             x_etc_bur_cost_tc := 0;
5071             x_etc_bur_cost_pc := 0;
5072             x_etc_bur_cost_fc := 0;
5073             x_etc_raw_cost_tc := 0;
5074             x_etc_raw_cost_pc := 0;
5075             x_etc_raw_cost_fc := 0;
5076             x_act_effort := 0;
5077             x_etc_effort := 0;
5078         END IF;
5079         CLOSE C_GET_WORKING_AMOUNT;
5080     ELSE
5081         OPEN C_GET_PUBLISHED_AMOUNT;
5082         FETCH C_GET_PUBLISHED_AMOUNT INTO x_act_bur_cost_tc, x_act_bur_cost_pc,
5083                         x_act_bur_cost_fc, x_act_raw_cost_tc,
5084                         x_act_raw_cost_pc, x_act_raw_cost_fc,
5085                         x_etc_bur_cost_tc, x_etc_bur_cost_pc,
5086                         x_etc_bur_cost_fc, x_etc_raw_cost_tc,
5087                         x_etc_raw_cost_pc, x_etc_raw_cost_fc,
5088                         x_act_effort, x_etc_effort;
5089 
5090         IF C_GET_PUBLISHED_AMOUNT%NOTFOUND THEN
5091             x_act_bur_cost_tc := 0;
5092             x_act_bur_cost_pc := 0;
5093             x_act_bur_cost_fc := 0;
5094             x_act_raw_cost_tc := 0;
5095             x_act_raw_cost_pc := 0;
5096             x_act_raw_cost_fc := 0;
5097             x_etc_bur_cost_tc := 0;
5098             x_etc_bur_cost_pc := 0;
5099             x_etc_bur_cost_fc := 0;
5100             x_etc_raw_cost_tc := 0;
5101             x_etc_raw_cost_pc := 0;
5102             x_etc_raw_cost_fc := 0;
5103             x_act_effort := 0;
5104             x_etc_effort := 0;
5105         END IF;
5106         CLOSE C_GET_PUBLISHED_AMOUNT;
5107     END IF;
5108 EXCEPTION
5109     WHEN OTHERS THEN
5110      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5111      x_msg_count     := 1;
5112      x_msg_data      := SUBSTRB(SQLERRM,1,120);
5113 
5114      fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
5115                               p_procedure_name => 'GET_ALL_AMOUNTS_CUMULATIVE',
5116                               p_error_text     => SUBSTRB(SQLERRM,1,120));
5117 
5118      -- 4537865
5119      x_act_bur_cost_tc := 0;
5120      x_act_bur_cost_pc := 0;
5121      x_act_bur_cost_fc := 0;
5122      x_act_raw_cost_tc := 0;
5123      x_act_raw_cost_pc := 0;
5124      x_act_raw_cost_fc := 0;
5125      x_etc_bur_cost_tc := 0;
5126      x_etc_bur_cost_pc := 0;
5127      x_etc_bur_cost_fc := 0;
5128      x_etc_raw_cost_tc := 0;
5129      x_etc_raw_cost_pc := 0;
5130      x_etc_raw_cost_fc := 0;
5131      x_act_effort := 0;
5132      x_etc_effort := 0;
5133      -- 4537865
5134 
5135      raise;
5136 END get_all_amounts_cumulative;
5137 
5138 -- Bug 3879461 : This function is not used.
5139 FUNCTION get_act_pfn_cost_this_period (p_as_of_date      IN     DATE
5140                                     ,p_project_id        IN     NUMBER
5141                                     ,p_object_id         IN     NUMBER
5142                                     ,p_object_version_id IN     NUMBER
5143                           ,p_proj_element_id   IN     NUMBER := null /* Modified for IB4 Progress CR. */) return NUMBER
5144 IS
5145     l_act_cost_period   NUMBER := NULL;
5146     l_act_cost_date     NUMBER := NULL;
5147     l_act_cost_pub      NUMBER := NULL;
5148 
5149 /*
5150         cursor c1 is
5151          select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)+nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)+nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0)) act_cost_to_date
5152                 from pa_progress_rollup ppr
5153                 where ppr.project_id = p_project_id
5154                 and ppr.object_id = p_object_id
5155                 -- and ppr.object_version_id = p_object_version_id
5156          and structure_type = 'WORKPLAN' -- FPM Dev CR 3
5157     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id)  --Modified for IB4 Progress CR.
5158                 and ppr.as_of_date = (select max(ppr2.as_of_date)
5159                                      from pa_progress_rollup ppr2
5160                                      where ppr2.project_id = p_project_id
5161                                      and ppr2.object_id = p_object_id
5162                                      -- and ppr2.object_version_id = p_object_version_id
5163                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
5164                                      and ppr2.as_of_date > p_as_of_date
5165         and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR. );
5166     l_c1rec     c1%rowtype;
5167 */
5168 
5169     cursor c_prev_prog_rec is
5170          select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)+nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)+nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0)) act_cost_to_date
5171                 from pa_progress_rollup ppr
5172                 where ppr.project_id = p_project_id
5173                 and ppr.object_id = p_object_id
5174                 -- and ppr.object_version_id = p_object_version_id
5175             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5176         and ppr.structure_version_id is null -- Bug 3764224
5177             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
5178                 and ppr.as_of_date = (select max(ppr2.as_of_date)
5179                                      from pa_progress_rollup ppr2
5180                                      where ppr2.project_id = p_project_id
5181                                      and ppr2.object_id = p_object_id
5182                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5183                      and ppr2.structure_version_id is null -- Bug 3764224
5184                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
5185                                      and ppr2.as_of_date < p_as_of_date);
5186 
5187     cursor c_this_prog_rec is
5188          select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)+nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)+nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0)) act_cost_to_date
5189                 from pa_progress_rollup ppr
5190                 where ppr.project_id = p_project_id
5191                 and ppr.object_id = p_object_id
5192                 -- and ppr.object_version_id = p_object_version_id
5193             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5194         and ppr.structure_version_id is null -- Bug 3764224
5195             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
5196                 and ppr.as_of_date = (select max(ppr2.as_of_date)
5197                                      from pa_progress_rollup ppr2
5198                                      where ppr2.project_id = p_project_id
5199                                      and ppr2.object_id = p_object_id
5200                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5201                      and ppr2.structure_version_id is null -- Bug 3764224
5202                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
5203                                      and ppr2.as_of_date >= p_as_of_date);
5204 
5205 
5206 BEGIN
5207 -- Bug 3764224 : This function(_this_peiord) are used only in assignment cases. So it is safe to select from rollup table itself
5208 -- no need to go in percent complete table
5209 -- Bug 3764224 : RLM Changes : Commented the below code. This was not calculating the actual this period
5210 
5211 /*  open c1;
5212     fetch c1 into l_c1rec;
5213     if c1%found then
5214         select (nvl(ppr.oth_act_cost_to_date_fc,0)+nvl(ppr.ppl_act_cost_to_date_fc,0)+nvl(ppr.eqpmt_act_cost_to_date_fc,0)+nvl(ppr.subprj_oth_act_cost_to_date_fc,0)+nvl(ppr.subprj_ppl_act_cost_fc,0)+nvl(ppr.subprj_eqpmt_act_cost_fc,0))
5215                 into l_act_cost_pub
5216                 from pa_progress_rollup ppr,pa_percent_completes ppc
5217                 where ppr.project_id = ppc.project_id
5218             and ppr.object_id = ppc.object_id
5219             and ppr.object_version_id = ppc.object_version_id
5220             and ppr.as_of_date = ppc.date_computed (+)
5221         and ppr.project_id = p_project_id
5222                 and ppr.object_id = p_object_id
5223                 -- and ppr.object_version_id = p_object_version_id
5224     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
5225             and ppr.percent_complete_id = ppc.percent_complete_id
5226          and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5227          and ppr.structure_type = ppc.structure_type(+) -- FPM Dev CR 3
5228         and ppr.proj_element_id = ppc.task_id (+) -- Modified for IB4 Progress CR.
5229                 and ppr.as_of_date = (select max(ppc2.date_computed)
5230                                      from pa_percent_completes ppc2
5231                                      where ppc2.project_id = p_project_id
5232                                      and ppc2.object_id = p_object_id
5233                                      -- and ppc2.object_version_id = p_object_version_id
5234                      and ppc2.published_flag = 'Y'
5235                      and ppc2.current_flag = 'Y'
5236                          and ppc2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5237         and ppc2.task_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
5238                      );
5239                 l_act_cost_period := (nvl(l_c1rec.act_cost_to_date,0) - nvl(l_act_cost_pub,0));
5240     end if;
5241     close c1;
5242 */
5243 
5244     open c_prev_prog_rec;
5245     fetch c_prev_prog_rec into l_act_cost_pub;
5246     close c_prev_prog_rec;
5247 
5248     open c_this_prog_rec;
5249     fetch c_this_prog_rec into l_act_cost_date;
5250     close c_this_prog_rec;
5251 
5252     l_act_cost_period := (nvl(l_act_cost_date,0) - nvl(l_act_cost_pub,0));
5253 
5254 
5255         if (l_act_cost_period < 0) then
5256                 l_act_cost_period := 0;
5257         end if;
5258 
5259     return(l_act_cost_period);
5260 
5261 END get_act_pfn_cost_this_period;
5262 
5263 
5264 FUNCTION get_act_effort_this_period (p_as_of_date        IN     DATE
5265                                     ,p_project_id        IN     NUMBER
5266                                     ,p_object_id         IN     NUMBER
5267                                     ,p_object_version_id IN     NUMBER
5268                     ,p_proj_element_id   IN     NUMBER := null /* Modified for IB4 Progress CR. */) return NUMBER
5269 IS
5270     l_act_effort_period     NUMBER := NULL;
5271     l_act_effort_date       NUMBER := NULL;
5272     l_act_effort_pub        NUMBER := NULL;
5273 
5274 
5275 /*
5276     cursor c1 is
5277          select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0)) act_effort_to_date
5278                 from pa_progress_rollup ppr
5279                 where ppr.project_id = p_project_id
5280                 and ppr.object_id = p_object_id
5281                 -- and ppr.object_version_id = p_object_version_id
5282          and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5283                 and ppr.as_of_date = (select max(ppr2.as_of_date)
5284                                      from pa_progress_rollup ppr2
5285                                      where ppr2.project_id = p_project_id
5286                                      and ppr2.object_id = p_object_id
5287                                      -- and ppr2.object_version_id = p_object_version_id
5288                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5289                                      and ppr2.as_of_date > p_as_of_date);
5290 */
5291 
5292     cursor c_prev_prog_rec is
5293          select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0)) act_effort_to_date
5294                 from pa_progress_rollup ppr
5295                 where ppr.project_id = p_project_id
5296                 and ppr.object_id = p_object_id
5297                 -- and ppr.object_version_id = p_object_version_id
5298                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5299                 and ppr.structure_version_id is null -- Bug 3764224
5300                 and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
5301                 and current_flag = 'Y'
5302                 ;
5303             /* commented by maansari7/25
5304                 and ppr.as_of_date = (select max(ppr2.as_of_date)
5305                                      from pa_progress_rollup ppr2
5306                                      where ppr2.project_id = p_project_id
5307                                      and ppr2.object_id = p_object_id
5308                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5309                      and ppr2.structure_version_id is null -- Bug 3764224
5310                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
5311                                      and ppr2.as_of_date <= p_as_of_date);
5312             */
5313 
5314     cursor c_this_prog_rec is
5315          select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0)) act_effort_to_date
5316                 from pa_progress_rollup ppr
5317               -- Bug 3879461 : Now percent complete join is not required. current_flag = W can be used
5318 --                    ,pa_percent_completes ppc
5319                 where ppr.project_id = p_project_id
5320                 and ppr.object_id = p_object_id
5321                 -- and ppr.object_version_id = p_object_version_id
5322                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5323             and ppr.structure_version_id is null -- Bug 3764224
5324             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
5325 --                and ppr.object_id = ppc.object_id
5326 --                and ppr.as_of_date = ppc.date_computed
5327 --                and ppr.percent_complete_id = ppc.percent_complete_id
5328 --                and ppr.project_id = ppc.project_id
5329 --                and ppr.proj_element_id=ppc.task_id
5330 --                and ppr.structure_type = ppc.structure_type
5331 --                and ppc.current_flag= 'N'
5332 --                and ppc.published_flag = 'N'
5333                 and ppr.current_flag= 'W'
5334                 ;
5335                 /* commented by maansari7/25
5336                 and ppr.as_of_date = (select max(ppr2.as_of_date)
5337                                      from pa_progress_rollup ppr2
5338                                      where ppr2.project_id = p_project_id
5339                                      and ppr2.object_id = p_object_id
5340                                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5341                                      and ppr2.structure_version_id is null -- Bug 3764224
5342                                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
5343                                      and ppr2.as_of_date > p_as_of_date);
5344                                      */
5345 
5346     --l_c1rec       c1%rowtype;
5347 
5348 --bug 3738651
5349 -- Bug 3764224 : RLM Changes : This code is commented, the earlier cusrsor code c1 was fine expept instead of greater than it should have been less than sign
5350 --  cursor cur_effort_this_period
5351 --      is
5352 --      select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0))
5353 --                from pa_progress_rollup ppr,pa_percent_completes ppc
5354 --                where ppr.project_id = ppc.project_id
5355 --          and ppr.object_id = ppc.object_id
5356 --          and ppr.as_of_date = ppc.date_computed
5357 --          and ppr.project_id = p_project_id
5358 --            and ppr.object_id = p_object_id
5359 --      and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
5360 --            and ppr.percent_complete_id = ppc.percent_complete_id
5361 --          and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5362 --            and ppr.structure_type = ppc.structure_type (+) -- FPM Dev CR 3
5363 --       and ppr.proj_element_id = ppc.task_id (+) /* Modified for IB4 Progress CR. */
5364 --            and ppc.current_flag = 'N'
5365 --            and ppc.published_flag = 'N'
5366 --            ;
5367 
5368 BEGIN
5369 -- Bug 3764224 : This function(_this_peiord) are used only in assignment cases. So it is safe to select from rollup table itself
5370 -- no need to go in percent complete table
5371 -- Bug 3764224 : RLM Changes : Commented the below code. This was not calculating the actual this period
5372 
5373 /*
5374     open c1;
5375     fetch c1 into l_c1rec;
5376     if c1%found then
5377         select (nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)+nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)+nvl(ppr.oth_quantity_to_date,0))
5378                 into l_act_effort_pub
5379                 from pa_progress_rollup ppr,pa_percent_completes ppc
5380                 where ppr.project_id = ppc.project_id
5381             and ppr.object_id = ppc.object_id
5382             and ppr.object_version_id = ppc.object_version_id
5383             and ppr.as_of_date = ppc.date_computed (+)
5384         and ppr.project_id = p_project_id
5385                 and ppr.object_id = p_object_id
5386                 -- and ppr.object_version_id = p_object_version_id
5387             and ppr.percent_complete_id = ppc.percent_complete_id
5388          and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5389          and ppr.structure_type = ppc.structure_type (+) -- FPM Dev CR 3
5390                 and ppr.as_of_date = (select max(ppc2.date_computed)
5391                                      from pa_percent_completes ppc2
5392                                      where ppc2.project_id = p_project_id
5393                                      and ppc2.object_id = p_object_id
5394                                      -- and ppc2.object_version_id = p_object_version_id
5395                      and ppc2.published_flag = 'Y'
5396                      and ppc2.current_flag = 'Y'
5397                      and ppc2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
5398                      );
5399         l_act_effort_period := (nvl(l_c1rec.act_effort_to_date,0) - nvl(l_act_effort_pub,0));
5400     end if;
5401     close c1;
5402 */
5403 
5404     open c_this_prog_rec;
5405     fetch c_this_prog_rec into l_act_effort_date;
5406     if c_this_prog_rec%notfound
5407     then
5408         close c_this_prog_rec;
5409         return 0;
5410     end if;
5411     close c_this_prog_rec;
5412 
5413     open c_prev_prog_rec;
5414     fetch c_prev_prog_rec into l_act_effort_pub;
5415     close c_prev_prog_rec;
5416 
5417 /*  commneted by maansari7/25
5418     open c_this_prog_rec;
5419     fetch c_this_prog_rec into l_act_effort_date;
5420     close c_this_prog_rec;
5421 */
5422 
5423     l_act_effort_period := (nvl(l_act_effort_date,0) - nvl(l_act_effort_pub,0));
5424 
5425     if (l_act_effort_period < 0 ) then
5426         l_act_effort_period := 0;
5427     end if;
5428 
5429     return(l_act_effort_period);
5430 
5431 
5432 
5433 --  OPEN cur_effort_this_period;
5434 --  FETCH cur_effort_this_period INTO l_act_effort_period;
5435 --  IF cur_effort_this_period%FOUND
5436 --  THEN
5437 --          CLOSE cur_effort_this_period;
5438 --          RETURN l_act_effort_period;
5439 --        ELSE
5440 --          CLOSE cur_effort_this_period;
5441 --          RETURN null;
5442 --  END IF;
5443 END get_act_effort_this_period;
5444 
5445 FUNCTION check_wwp_prog_publishing_ok(
5446     p_project_id              IN NUMBER
5447    ,p_structure_version_id    IN NUMBER
5448 ) RETURN VARCHAR2
5449 IS
5450 /* Commented for bug 5665310
5451         CURSOR C1 is
5452         select 'N'
5453         from pa_proj_elem_ver_structure ppevs
5454         where ppevs.project_id = p_project_id
5455         and ppevs.element_version_id = p_structure_version_id
5456         and ppevs.date_prog_applied_on_wver < (select max(l_update_date)
5457                                               from (
5458                                               select max(last_update_date) l_update_date
5459                                               from pa_progress_rollup ppr
5460                                               where ppr.project_id = p_project_id
5461                                               and object_type in ('PA_ASSIGNMENTS','PA_DELIVERABLES')
5462                                               and structure_type = 'WORKPLAN'
5463                                               and current_flag = 'Y'
5464                                               and ppr.structure_version_id is null
5465                                               union
5466                                               select max(last_update_date) l_update_date
5467                                               from pa_percent_completes
5468                                               where project_id = p_project_id
5469                                               and structure_type = 'WORKPLAN'
5470                                               and published_flag = 'Y'));
5471 
5472         CURSOR C2 is
5473         select 'N'
5474         from pa_proj_elem_ver_structure ppevs
5475         where ppevs.project_id = p_project_id
5476         and ppevs.element_version_id = p_structure_version_id
5477         and ppevs.date_prog_applied_on_wver is null
5478         and exists (select '1'
5479                       from pa_progress_rollup ppr
5480                      where ppr.project_id = p_project_id
5481                       and object_type in ('PA_ASSIGNMENTS','PA_DELIVERABLES')
5482                       and structure_type = 'WORKPLAN'
5483                       and current_flag = 'Y'
5484                       and ppr.structure_version_id is null
5485                     union
5486                     select '1'
5487                       from pa_percent_completes
5488                      where project_id = p_project_id
5489                       and structure_type = 'WORKPLAN'
5490                       and published_flag = 'Y');     */
5491 
5492         l_return_value    VARCHAR2(1) := null;
5493         -- Added for Bug 5665310
5494         l_date_prog_applied_on_wver            DATE;
5495         l_last_update_date                     DATE;
5496 	l_program_flag                         VARCHAR2(1) := null;
5497 
5498 BEGIN
5499         /* Commented for bug 5665310
5500 	OPEN c1;
5501                 fetch c1 INTO l_return_value;
5502         CLOSE c1;
5503 
5504         if l_return_value is null then
5505            open c2;
5506            fetch c2 INTO l_return_value;
5507            close c2;
5508         end if;   */
5509 
5510 --Start of Addition for bug 5665310
5511 
5512 	SELECT date_prog_applied_on_wver
5513         INTO   l_date_prog_applied_on_wver
5514         FROM   pa_proj_elem_ver_structure ppevs
5515         WHERE  ppevs.project_id = p_project_id
5516         AND    ppevs.element_version_id = p_structure_version_id;
5517 
5518 	l_program_flag := PA_PROJECT_STRUCTURE_UTILS.check_program_flag_enable(p_project_id);
5519 
5520         IF l_date_prog_applied_on_wver IS NOT NULL THEN
5521 
5522 	    If nvl(l_program_flag,'N') = 'Y' then
5523 		SELECT
5524 			MAX(ppr.last_update_date)
5525 			INTO   l_last_update_date
5526 			FROM   pa_progress_rollup ppr
5527 			WHERE  ppr.project_id = p_project_id
5528 			AND    ppr.object_type in ('PA_ASSIGNMENTS','PA_DELIVERABLES')
5529 			AND    ppr.structure_type = 'WORKPLAN'
5530 			AND    ppr.current_flag = 'Y'
5531 			AND    ppr.structure_version_id is null;
5532 	    else
5533 	          SELECT
5534 			MAX(ppr.last_update_date)
5535 			INTO   l_last_update_date
5536 			FROM   pa_progress_rollup ppr, pa_proj_elem_ver_structure ppevs
5537 			WHERE  ppr.project_id = p_project_id
5538 			AND    ppr.object_id = ppevs.PROJ_ELEMENT_ID
5539 			AND    ppr.object_type ='PA_STRUCTURES'
5540 			AND    ppr.structure_type = 'WORKPLAN'
5541 			AND    ppr.PROJ_ELEMENT_ID = ppevs.PROJ_ELEMENT_ID
5542 			AND    ppr.current_flag = 'Y'
5543 			AND    ppr.structure_version_id is null
5544 			AND    ppevs.project_id = ppr.project_id
5545 			AND    ppevs.element_version_id = p_structure_version_id;
5546 
5547 	    end if;
5548 
5549             IF l_date_prog_applied_on_wver >= NVL(l_last_update_date,l_date_prog_applied_on_wver) THEN
5550 		If nvl(l_program_flag,'N') = 'Y' then
5551 			SELECT MAX(last_update_date)
5552 			INTO   l_last_update_date
5553 			FROM   pa_percent_completes ppr
5554 			WHERE  project_id = p_project_id
5555 			AND    structure_type = 'WORKPLAN'
5556 			AND    published_flag = 'Y'
5557 			AND    current_flag = 'Y';
5558 		end if;
5559 
5560                 IF l_date_prog_applied_on_wver < NVL(l_last_update_date,l_date_prog_applied_on_wver) THEN
5561 
5562                     l_return_value := 'N';
5563 
5564                 END IF;
5565 
5566             ELSE
5567 
5568                 l_return_value := 'N';
5569 
5570             END IF;
5571 
5572         ELSE
5573 
5574             BEGIN
5575                 SELECT 'N'
5576                 INTO   l_return_value
5577                 FROM   DUAL
5578                 WHERE  EXISTS (  SELECT '1'
5579                                  FROM   pa_progress_rollup ppr
5580                                  WHERE  ppr.project_id = p_project_id
5581                                  AND    object_type in ('PA_ASSIGNMENTS','PA_DELIVERABLES')
5582                                  AND    structure_type = 'WORKPLAN'
5583                                  AND    current_flag = 'Y'
5584                                  AND    ppr.structure_version_id IS NULL);
5585 
5586             EXCEPTION
5587             WHEN NO_DATA_FOUND THEN
5588                 NULL;
5589             END;
5590 
5591             IF l_return_value IS NULL THEN
5592 
5593                 BEGIN
5594 
5595                     SELECT 'N'
5596                     INTO   l_return_value
5597                     FROM   DUAL
5598                     WHERE  EXISTS (  SELECT '1'
5599                                      FROM   pa_percent_completes
5600                                      WHERE  project_id = p_project_id
5601                                      AND    structure_type = 'WORKPLAN'
5602                                      AND    published_flag = 'Y');
5603 
5604                 EXCEPTION
5605                 WHEN NO_DATA_FOUND THEN
5606                     NULL;
5607                 END;
5608 
5609             END IF;
5610 
5611         END IF;
5612 -- End of addition for bug 5665310
5613 
5614         return (NVL(l_return_value,'Y'));
5615 
5616 END check_wwp_prog_publishing_ok;
5617 
5618 FUNCTION Get_BAC_Value(
5619     p_project_id                IN NUMBER
5620    ,p_task_weight_method        IN VARCHAR2
5621    ,p_proj_element_id           IN NUMBER
5622    ,p_structure_version_id      IN NUMBER
5623    ,p_structure_type            IN VARCHAR2
5624    ,p_working_wp_prog_flag      IN VARCHAR2 default 'N' --maansari7/18. To get the planned in case of apply lp flow
5625    ,p_program_flag              IN VARCHAR2 default 'Y' -- Bug 4493105
5626 ) RETURN NUMBER
5627 IS
5628 l_msg_code                      VARCHAR2(30);
5629 l_return_status                 VARCHAR2(1);
5630 l_value                         NUMBER;
5631 l_plan_version_id               NUMBER;
5632 BEGIN
5633 -- FPM Dev CR 3 : Changes done to not call PJI Api for Workplan.
5634 
5635 -- Bug 3627315 : Now this function will not call populate_workplan_data. It shd be called from calling environment
5636 IF p_structure_type = 'FINANCIAL' THEN
5637 
5638     /* Begin Fix for Bug # 4115607. */
5639 
5640         -- l_plan_version_id := PA_FIN_PLAN_UTILS.Get_app_budget_cost_cb_ver(p_project_id);
5641 
5642     l_plan_version_id := pa_progress_utils.get_app_cost_budget_cb_wor_ver(p_project_id);
5643 
5644     /* End fix for Bug # 4115607. */
5645 
5646         BEGIN
5647 
5648 --  IF   p_project_id <> G_bac_value_project_id THEN
5649 
5650 --      PJI_FM_XBS_ACCUM_UTILS.populate_workplan_data(
5651 --              p_project_id        => p_project_id,
5652 --              p_struct_ver_id     => p_structure_version_id,
5653     --                  p_base_struct_ver_id   IN   NUMBER DEFAULT NULL,
5654 --              p_plan_version_id   => l_plan_version_id,
5655 --  --                  p_progress_actuals_flag IN  VARCHAR2 DEFAULT 'N',
5656 --              x_return_status     => l_return_status,
5657 --              x_msg_code          => l_msg_code
5658 --              );
5659 --      G_bac_value_project_id := p_project_id;
5660 --  END IF;
5661 
5662 -- Bug 3627315 : In case of Financial Structure, it should select normal(without BASE)  columns from PJI table
5663 -- Anyhow it is baselined plan version
5664 --                SELECT decode(p_task_weight_method, 'EFFORT',nvl(BASE_LABOR_HOURS,0)+nvl(BASE_EQUIP_HOURS,0), PRJ_BASE_BRDN_COST)
5665                 SELECT
5666         /*+ INDEX(pji_fm_xbs_accum_tmp1 pji_fm_xbs_accum_tmp1_n1)*/ -- Fix for Bug # 4162534.
5667     decode(p_task_weight_method, 'EFFORT',nvl(LABOR_HOURS,0)+nvl(EQUIPMENT_HOURS,0), PRJ_BRDN_COST)
5668                 INTO  l_value
5669                 FROM PJI_FM_XBS_ACCUM_TMP1
5670                 WHERE project_id = p_project_id
5671                 AND project_element_id = p_proj_element_id
5672                 AND PLAN_VERSION_ID = l_plan_version_id
5673         AND txn_currency_code is null    --bug no. 3646988
5674                 AND res_list_member_id is null;
5675         EXCEPTION
5676          WHEN OTHERS THEN
5677                 l_value := null;
5678         END;
5679 ELSE
5680     --No Need to call PJI APi to populate its temp table. From Workplan pages, we are calling this API.
5681     -- We are calling this From AMG pa_status_pub too.
5682     -- As of now we are not calling it from Financial Forms and pages, hence it needs to be called for Financial Structure
5683     BEGIN
5684 
5685         if p_working_wp_prog_flag = 'N' then
5686 
5687         --bug 3896273, CR, latest published changes
5688         /*SELECT decode(p_task_weight_method, 'EFFORT',nvl(BASE_LABOR_HOURS,nvl(LABOR_HOURS,0))+
5689                                                              nvl(BASE_EQUIP_HOURS,nvl(EQUIPMENT_HOURS,0)),
5690                                                      NVL(PRJ_BASE_BRDN_COST,nvl(PRJ_BRDN_COST,0)))  --if base is not avilable then select the published planned. bug 3781922*/
5691                 -- Bug 4493105 : Added p_program_flag decode
5692         SELECT
5693         /*+ INDEX(pji_fm_xbs_accum_tmp1 pji_fm_xbs_accum_tmp1_n1)*/ -- Fix for Bug # 4162534.
5694                decode(p_task_weight_method, 'EFFORT', decode(p_program_flag, 'N',    nvl(P_BASE_LBR_HOURS, nvl(P_LPB_LBR_HOURS, nvl(P_LBR_HOURS,0)))+
5695                                                                                      nvl(P_BASE_EQP_HOURS, nvl(P_LPB_EQP_HOURS, nvl(P_EQP_HOURS,0))),
5696                                                      nvl(BASE_LABOR_HOURS, nvl(LPB_LABOR_HOURS, nvl(LABOR_HOURS,0)))+
5697                                                                                  nvl(BASE_EQUIP_HOURS, nvl(LPB_EQUIP_HOURS, nvl(EQUIPMENT_HOURS,0)))
5698                                  ),
5699                                                      decode(p_program_flag, 'N',NVL(P_BASE_BRDN_COST, nvl(P_LPB_BRDN_COST, nvl(P_BRDN_COST,0)))
5700                                                        ,NVL(PRJ_BASE_BRDN_COST, nvl(PRJ_LPB_BRDN_COST, nvl(PRJ_BRDN_COST,0)))
5701                                    )
5702              )  --if base is not avilable then select the published planned. bug 3781922
5703                 INTO  l_value
5704                 FROM PJI_FM_XBS_ACCUM_TMP1
5705                 WHERE project_id = p_project_id
5706                 AND struct_version_id = p_structure_version_id
5707                 AND project_element_id = p_proj_element_id
5708                 AND txn_currency_code is null    --bug no. 3646988
5709                 AND res_list_member_id is null;
5710 
5711              else
5712                 -- Bug 4493105 : Added p_program_flag decode
5713                 SELECT
5714         /*+ INDEX(pji_fm_xbs_accum_tmp1 pji_fm_xbs_accum_tmp1_n1)*/ -- Fix for Bug # 4162534.
5715     decode(p_task_weight_method, 'EFFORT',decode(p_program_flag,'N',nvl(P_LBR_HOURS,0)+nvl(P_EQP_HOURS,0)
5716                                                                   ,nvl(LABOR_HOURS,0)+nvl(EQUIPMENT_HOURS,0))
5717                                , decode(p_program_flag,'N',P_BRDN_COST,PRJ_BRDN_COST))
5718                 INTO  l_value
5719                 FROM PJI_FM_XBS_ACCUM_TMP1
5720                 WHERE project_id = p_project_id
5721                 AND struct_version_id = p_structure_version_id
5722                 AND project_element_id = p_proj_element_id
5723         AND txn_currency_code is null    --bug no. 3646988
5724                 AND res_list_member_id is null;
5725 
5726         end if;
5727 
5728         EXCEPTION
5729          WHEN OTHERS THEN
5730                 l_value := null;
5731         END;
5732 END IF;
5733 
5734 return l_value;
5735 EXCEPTION
5736 WHEN OTHERS THEN
5737         return null;
5738 END Get_BAC_Value;
5739 
5740 FUNCTION Get_EARLY_PROGRESS_ENTRY_DATE(
5741      p_project_id  NUMBER
5742     ,p_object_id   NUMBER
5743     ,p_object_type VARCHAR2 := 'PA_TASKS'
5744     ,p_structure_type VARCHAR2 := 'WORKPLAN'
5745     ,p_task_id  NUMBER := null /* Modified for IB4 Progress CR. */
5746     ) RETURN DATE
5747 IS
5748 l_first_date Date;
5749 CURSOR cur_ppc
5750   IS
5751     SELECT min(trunc(last_update_date))
5752       FROM pa_percent_completes
5753      WHERE object_id = p_object_id
5754        AND project_id = p_project_id
5755        and object_type = p_object_type
5756        AND published_flag = 'Y'
5757        AND structure_type = p_structure_type
5758        and NVL(task_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id,NVL(task_id,-1)),NVL(p_task_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
5759        --and task_id = nvl(p_task_id, p_object_id) /* Modified for IB4 Progress CR. */;
5760        ;
5761 BEGIN
5762 
5763 OPEN cur_ppc;
5764 FETCH cur_ppc INTO l_first_date;
5765 CLOSE cur_ppc;
5766 
5767 return l_first_date;
5768 
5769 EXCEPTION
5770 WHEN OTHERS THEN
5771         return null;
5772 END Get_EARLY_PROGRESS_ENTRY_DATE;
5773 
5774 FUNCTION Get_LATEST_PROGRESS_ENTRY_DATE(
5775      p_project_id  NUMBER
5776     ,p_object_id   NUMBER
5777     ,p_object_type VARCHAR2 := 'PA_TASKS'
5778     ,p_structure_type VARCHAR2 := 'WORKPLAN'
5779     ,p_task_id  NUMBER := null /* Amit : Modified for IB4 Progress CR. */
5780     ) RETURN DATE
5781 IS
5782 l_first_date Date;
5783 CURSOR cur_ppc
5784   IS
5785     SELECT max(trunc(last_update_date))
5786       FROM pa_percent_completes
5787      WHERE object_id = p_object_id
5788        AND project_id = p_project_id
5789        and object_type = p_object_type
5790        AND published_flag = 'Y'
5791        AND structure_type = p_structure_type
5792        and NVL(task_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_task_id,NVL(task_id,-1)),NVL(p_task_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
5793        ;
5794 BEGIN
5795 
5796 OPEN cur_ppc;
5797 FETCH cur_ppc INTO l_first_date;
5798 CLOSE cur_ppc;
5799 
5800 return l_first_date;
5801 
5802 EXCEPTION
5803 WHEN OTHERS THEN
5804         return null;
5805 END Get_LATEST_PROGRESS_ENTRY_DATE;
5806 
5807 FUNCTION latest_published_progress_date(p_project_id      IN    NUMBER
5808                     ,p_structure_type IN    VARCHAR2 ) RETURN DATE
5809 IS
5810     l_return_date   DATE;
5811   CURSOR cur_latest_date
5812   IS
5813     select max(date_computed)
5814     from pa_percent_completes ppc
5815     where ppc.project_id = p_project_id
5816     and ppc.structure_type = p_structure_type;
5817 
5818 BEGIN
5819      OPEN cur_latest_date;
5820      FETCH cur_latest_date INTO l_return_date;
5821      CLOSE cur_latest_date;
5822 
5823      return(l_return_date);
5824 END latest_published_progress_date;
5825 
5826 FUNCTION check_object_has_prog(
5827          p_project_id                           IN      NUMBER -- FPM Dev CR 7 : Removed defaulting
5828         ,p_proj_element_id                      IN      NUMBER := null /* Modified for IB4 Progress CR. */
5829         ,p_object_id                            IN      NUMBER -- FPM Dev CR 7 : Removed defaulting
5830         ,p_object_type                          IN      VARCHAR2:='PA_TASKS'
5831         ,p_structure_type                       IN      VARCHAR2:='WORKPLAN'
5832         ,p_progress_status                      IN      VARCHAR2:='ANY'
5833         )       RETURN VARCHAR2
5834 IS
5835     l_return_status VARCHAR2(1) := 'N';
5836     -- FPM Dev CR 7 : Note that p_proj_element_id is not needed, but keeping it to avoid impacts to other code
5837 CURSOR myCursor is
5838     select 'Y'
5839     from pa_progress_rollup ppr
5840     where ppr.project_id = p_project_id
5841     and ppr.object_id = p_object_id
5842     and ppr.object_type = p_object_type
5843     and ppr.structure_type = p_structure_type
5844     and ppr.structure_version_id is null -- FPM Dev CR 7
5845         and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
5846     --and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
5847     ;
5848 
5849 CURSOR myCursor_pub is
5850         select 'Y'
5851         from pa_progress_rollup ppr
5852         where ppr.project_id = p_project_id
5853         and ppr.object_id = p_object_id
5854         and ppr.object_type = p_object_type
5855         and ppr.structure_type = p_structure_type
5856         and ppr.structure_version_id is null -- FPM Dev CR 7
5857         and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
5858         and current_flag in ('Y','N');
5859 result myCursor%rowtype;
5860 
5861 BEGIN
5862 
5863     if (p_progress_status = 'PUBLISHED') then
5864        OPEN myCursor_pub;
5865        FETCH myCursor_pub INTO result;
5866        if myCursor_pub%FOUND THEN
5867             close myCursor_pub;
5868             return 'Y';
5869        ELSE
5870             close myCursor_pub;
5871             return 'N';
5872        END IF;
5873     else
5874        OPEN myCursor;
5875        FETCH myCursor INTO result;
5876        if myCursor%FOUND THEN
5877             close myCursor;
5878         return 'Y';
5879        ELSE
5880             close myCursor;
5881             return 'N';
5882        END IF;
5883     end if;
5884 END check_object_has_prog;
5885 
5886 --- Following APIs added by Bhumesh
5887 
5888 Function Prog_Get_Pa_Period_Name (p_Date  IN Date
5889 , p_org_id IN NUMBER :=null -- 4746476
5890 )
5891 RETURN VARCHAR2
5892 IS
5893   l_Org_ID pa_implementations_all.org_id%TYPE;
5894   l_Period_Name  varchar2(100);
5895 BEGIN
5896 -- 4746476 : Added IF
5897 IF p_org_id IS NULL THEN
5898   SELECT org_id INTO l_Org_ID FROM PA_Implementations;
5899 ELSE
5900   l_Org_ID := p_org_id;
5901 END IF;
5902 
5903   l_Period_Name := PA_UTILS2.get_pa_period_name (p_txn_date => p_Date,
5904                          p_org_id   => l_Org_ID );
5905 
5906   Return l_Period_Name;
5907 END Prog_Get_Pa_Period_Name;
5908 
5909 Function Prog_Get_GL_Period_Name (P_Date  IN Date
5910 , p_org_id IN NUMBER :=null -- 4746476
5911 )
5912 RETURN VARCHAR2
5913 IS
5914   l_Org_ID pa_implementations_all.org_id%TYPE;
5915   l_Period_Name  varchar2(100);
5916 BEGIN
5917 -- 4746476 : Added IF
5918 IF p_org_id IS NULL THEN
5919   SELECT org_id INTO l_Org_ID FROM PA_Implementations;
5920 ELSE
5921   l_Org_ID := p_org_id;
5922 END IF;
5923 
5924   l_Period_Name := PA_UTILS2.get_GL_period_name (p_gl_date  => p_Date,
5925                          p_org_id   => l_Org_ID );
5926 
5927   Return l_Period_Name;
5928 
5929 END Prog_Get_GL_Period_Name;
5930 
5931 -- History
5932 -- 02-aug-04
5933 -- Added two params p_structure_version_id and p_structure_status to return base percent complete
5934 -- from a working version also.
5935 -- This change is done for B and F
5936 Procedure REDEFAULT_BASE_PC    (
5937     p_Project_ID                IN NUMBER
5938    ,p_Proj_element_id           IN NUMBER
5939    ,p_Structure_type            IN VARCHAR2 DEFAULT 'WORKPLAN'
5940    ,p_object_type               IN VARCHAR2 DEFAULT 'PA_TASKS'
5941    ,p_As_Of_Date                IN DATE
5942    ,p_structure_version_id      IN NUMBER    DEFAULT null
5943    ,p_structure_status          IN VARCHAR2  DEFAULT null
5944    ,p_calling_context           IN VARCHAR2  DEFAULT 'PROGRESS'
5945    ,X_base_percent_complete     OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
5946    ,x_return_status             OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5947    ,x_msg_count                 OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
5948    ,x_msg_data                  OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5949 )
5950 IS
5951   l_msg_code        VARCHAR2(30);
5952   l_return_status   VARCHAR2(1);
5953   l_value       NUMBER;
5954 
5955 -- 4392189 : Program Reporting Changes - Phase 2
5956 -- If p_calling_context is PROGRESS, then it will work as it is
5957 -- If it is FINANCIAL_PLANNING then it will return project % complete for Workplan
5958 
5959   Cursor CUR_Base_Perc_Complete_task
5960     IS
5961 -- 4392189
5962 --      Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
5963 --                                        'FINANCIAL_PLANNING', NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP))
5964       Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
5965                                         'FINANCIAL_PLANNING',
5966                           decode(p_structure_type, 'FINANCIAL',  NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP)
5967                                                               ,  NVL(completed_percentage,BASE_PERCENT_COMPLETE)))
5968       From   PA_Progress_Rollup
5969       Where  Project_ID     = P_Project_ID
5970       AND    Object_ID      = P_Proj_Element_ID
5971       AND    Object_Type        = p_object_type
5972       AND    current_flag       <> 'W'     --bug 3879461
5973       AND    As_Of_Date     = ( select max(As_Of_Date) from pa_progress_rollup
5974                                     where  Project_ID         = P_Project_ID
5975                                       AND    Object_ID          = P_Proj_Element_ID
5976                                       AND    Object_Type        = p_object_type
5977                                       AND    structure_version_id IS NULL
5978                                       AND    current_flag       <> 'W'     --bug 3879461
5979                                       AND    Structure_type     = p_structure_type
5980                                       AND   as_of_date <= p_as_of_date
5981                                    )
5982       AND    structure_version_id IS NULL
5983       AND    Structure_type = p_structure_type;
5984 
5985   Cursor CUR_Base_Perc_Complete_proj
5986     IS
5987 -- 4392189
5988 --      Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
5989 --                                        'FINANCIAL_PLANNING', NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP))
5990       Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
5991                                         'FINANCIAL_PLANNING',
5992                           decode(p_structure_type, 'FINANCIAL',  NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP)
5993                                                               ,  NVL(completed_percentage,BASE_PERCENT_COMPLETE)))
5994       From   PA_Progress_Rollup
5995       Where  Project_ID         = P_Project_ID
5996       AND    Object_Type        = p_object_type
5997       AND    current_flag       <> 'W'     --bug 3879461
5998       AND    As_Of_Date         = ( select max(As_Of_Date) from pa_progress_rollup
5999                                     where  Project_ID         = P_Project_ID
6000                                       AND    Object_Type        = p_object_type
6001                                       AND    structure_version_id IS NULL
6002                                       AND    current_flag       <> 'W'     --bug 3879461
6003                                       AND    Structure_type     = p_structure_type
6004                                       AND   as_of_date <= p_as_of_date
6005                                    )
6006 
6007       AND    structure_version_id IS NULL
6008       AND    Structure_type     = p_structure_type;
6009 
6010 --bug 3879461 selects percent complete from working progress record.
6011   Cursor CUR_Base_Perc_Complete_task_2
6012     IS
6013 -- 4392189
6014 --      Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
6015 --                                        'FINANCIAL_PLANNING', NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP))
6016       Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
6017                                         'FINANCIAL_PLANNING',
6018                           decode(p_structure_type, 'FINANCIAL',  NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP)
6019                                                               ,  NVL(completed_percentage,BASE_PERCENT_COMPLETE)))
6020       From   PA_Progress_Rollup
6021       Where  Project_ID         = P_Project_ID
6022       AND    Object_ID          = P_Proj_Element_ID
6023       AND    Object_Type        = p_object_type
6024       AND    current_flag       = 'W'     --bug 3879461
6025       AND    As_Of_Date         = ( select max(As_Of_Date) from pa_progress_rollup
6026                                     where  Project_ID         = P_Project_ID
6027                                       AND    Object_ID          = P_Proj_Element_ID
6028                                       AND    Object_Type        = p_object_type
6029                                       AND    structure_version_id IS NULL
6030                                       AND    current_flag       = 'W'     --bug 3879461
6031                                       AND    Structure_type     = p_structure_type
6032                                       AND   as_of_date <= p_as_of_date
6033                                    )
6034       AND    structure_version_id IS NULL
6035       AND    Structure_type     = p_structure_type;
6036 
6037   Cursor CUR_Base_Perc_Complete_proj_2
6038     IS
6039 -- 4392189
6040 --      Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
6041 --                                        'FINANCIAL_PLANNING', NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP))
6042       Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
6043                                         'FINANCIAL_PLANNING',
6044                           decode(p_structure_type, 'FINANCIAL',  NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP)
6045                                                               ,  NVL(completed_percentage,BASE_PERCENT_COMPLETE)))
6046       From   PA_Progress_Rollup
6047       Where  Project_ID         = P_Project_ID
6048       AND    Object_Type        = p_object_type
6049       AND    current_flag       = 'W'     --bug 3879461
6050       AND    As_Of_Date         = ( select max(As_Of_Date) from pa_progress_rollup
6051                                     where  Project_ID         = P_Project_ID
6052                                       AND    Object_Type        = p_object_type
6053                                       AND    structure_version_id IS NULL
6054                                       AND    current_flag       = 'W'     --bug 3879461
6055                                       AND    Structure_type     = p_structure_type
6056                                       AND   as_of_date <= p_as_of_date
6057                                    )
6058 
6059       AND    structure_version_id IS NULL
6060       AND    Structure_type     = p_structure_type;
6061 --end bug 3879461 selects percent complete from working progress record.
6062 
6063 
6064 
6065   Cursor CUR_Base_Perc_Complete_task_w
6066     IS
6067 -- 4392189
6068 --      Select NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage)
6069 --      Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
6070 --                                        'FINANCIAL_PLANNING', NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP))
6071       Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
6072                                         'FINANCIAL_PLANNING',
6073                           decode(p_structure_type, 'FINANCIAL',  NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP)
6074                                                           ,  NVL(completed_percentage,BASE_PERCENT_COMPLETE)))
6075       From   PA_Progress_Rollup
6076       Where  Project_ID         = P_Project_ID
6077       AND    Object_ID          = P_Proj_Element_ID
6078       AND    Object_Type        = p_object_type
6079       --AND    As_Of_Date         = p_As_Of_Date
6080       AND    structure_version_id = p_structure_version_id
6081       AND    Structure_type     = p_structure_type;
6082 
6083   Cursor CUR_Base_Perc_Complete_proj_w
6084     IS
6085 -- 4392189
6086 --      Select NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage)
6087 --      Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
6088 --                                        'FINANCIAL_PLANNING', NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP))
6089       Select decode( p_calling_context, 'PROGRESS', NVL(EFF_ROLLUP_PERCENT_COMP,completed_percentage),
6090                                         'FINANCIAL_PLANNING',
6091                           decode(p_structure_type, 'FINANCIAL',  NVL(completed_percentage,EFF_ROLLUP_PERCENT_COMP)
6092                                                               ,  NVL(completed_percentage,BASE_PERCENT_COMPLETE)))
6093       From   PA_Progress_Rollup
6094       Where  Project_ID         = P_Project_ID
6095       AND    Object_Type        = p_object_type
6096       --AND    As_Of_Date         = p_As_Of_Date
6097       AND    structure_version_id = p_structure_version_id
6098       AND    Structure_type     = p_structure_type;
6099 
6100 
6101 BEGIN
6102     x_return_status := FND_API.G_RET_STS_SUCCESS ;
6103     X_base_percent_complete := null;   --bug 3879461
6104 
6105     IF ( p_structure_version_id IS NULL AND p_structure_status IS NULL ) OR
6106        ( p_structure_status = 'PUBLISHED')
6107     THEN
6108 
6109 --bug 3879461 selects percent complete from working progress record.
6110      if p_calling_context = 'PROGRESS'
6111      then
6112     if p_proj_element_id is null then
6113             Open CUR_Base_Perc_Complete_proj_2;
6114         Fetch CUR_Base_Perc_Complete_proj_2 INTO X_base_percent_complete;
6115         Close CUR_Base_Perc_Complete_proj_2;
6116     else
6117                 Open CUR_Base_Perc_Complete_task_2;
6118                 Fetch CUR_Base_Perc_Complete_task_2 INTO X_base_percent_complete;
6119                 Close CUR_Base_Perc_Complete_task_2;
6120     end if;
6121       end if;
6122 --bug 3879461 selects percent complete from working progress record.
6123 
6124       if X_base_percent_complete IS NULL    --bug 3879461
6125       then
6126         if p_proj_element_id is null then
6127                 Open CUR_Base_Perc_Complete_proj;
6128                 Fetch CUR_Base_Perc_Complete_proj INTO X_base_percent_complete;
6129                 Close CUR_Base_Perc_Complete_proj;
6130         else
6131                 Open CUR_Base_Perc_Complete_task;
6132                 Fetch CUR_Base_Perc_Complete_task INTO X_base_percent_complete;
6133                 Close CUR_Base_Perc_Complete_task;
6134         end if;
6135       end if;
6136 
6137     ELSIF ( p_structure_version_id IS NOT NULL AND p_structure_status IS NOT NULL ) OR
6138           ( p_structure_status = 'WORKING')
6139     THEN
6140 
6141         if p_proj_element_id is null then
6142                 Open CUR_Base_Perc_Complete_proj_w;
6143                 Fetch CUR_Base_Perc_Complete_proj_w INTO X_base_percent_complete;
6144                 Close CUR_Base_Perc_Complete_proj_w;
6145         else
6146                 Open CUR_Base_Perc_Complete_task_w;
6147                 Fetch CUR_Base_Perc_Complete_task_w INTO X_base_percent_complete;
6148                 Close CUR_Base_Perc_Complete_task_w;
6149         end if;
6150 
6151     END IF;
6152 
6153 -- Progress Management Changes. Bug # 3420093.
6154 
6155     X_base_percent_complete := round(X_base_percent_complete,2);
6156 
6157 -- Progress Management Changes. Bug # 3420093.
6158 
6159 EXCEPTION WHEN OTHERS THEN
6160       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6161       x_Msg_Count     := 0;
6162       x_Msg_Data      := '';
6163       fnd_msg_pub.add_exc_msg( p_pkg_name       => 'PA_PROGRESS_UTILS'
6164                   ,p_procedure_name => 'REDEFAULT_BASE_PC'
6165                   ,p_error_text     => SUBSTRB(SQLERRM,1,120));
6166     RAISE FND_API.G_EXC_ERROR;
6167 END REDEFAULT_BASE_PC;
6168 
6169 Procedure RECALCULATE_PROG_STATS (
6170     p_project_id        IN NUMBER
6171    ,p_proj_element_id       IN NUMBER
6172    ,p_task_version_id       IN NUMBER
6173    ,p_structure_type        IN VARCHAR2 DEFAULT 'WORKPLAN'
6174    ,p_As_Of_Date        IN DATE
6175    ,P_Overide_Percent_Complete  IN NUMBER
6176    ,p_Actual_Effort     IN NUMBER
6177    ,p_Actual_Cost       IN NUMBER
6178    ,p_Planned_Effort        IN NUMBER
6179    ,p_Planned_Cost      IN NUMBER
6180    ,p_baselined_Effort      IN NUMBER
6181    ,p_baselined_Cost        IN NUMBER
6182    ,x_BCWS          OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
6183    ,X_BCWP          OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
6184    ,X_SCH_Performance_Index OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
6185    ,X_COST_Performance_Index    OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
6186    ,x_Sch_At_Completion     OUT NOCOPY DATE --File.Sql.39 bug 4440895
6187    ,x_Complete_Performance_Index OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
6188    ,x_return_status             OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
6189    ,x_msg_count                 OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
6190    ,x_msg_data                  OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
6191 )
6192 IS
6193   l_TASK_WEIGHT_BASIS_CODE  VARCHAR2(30);
6194   l_Planned_Amount      NUMBER ;
6195   l_Actual_Amount       NUMBER ;
6196   l_Baseline_Amount     NUMBER ;
6197   l_BCWS                NUMBER;
6198   l_SCH_Performance_Index NUMBER;
6199   l_tcpi_denom            NUMBER;
6200 
6201     CURSOR cur_sch_dates
6202     IS
6203       SELECT scheduled_start_date, scheduled_finish_date
6204       from pa_proj_elem_ver_schedule ppevs
6205       where project_id=p_project_id
6206        and element_version_id=p_task_version_id
6207        ;
6208 
6209        l_sch_start_date DATE;
6210        l_sch_finish_date DATE;
6211 
6212     CURSOR cur_str_ver_id
6213       is
6214       select parent_structure_version_id
6215       from pa_proj_element_versions
6216       where project_id = p_project_id
6217       and proj_element_id =     p_proj_element_id
6218       and element_version_id = p_task_version_id
6219       ;
6220 
6221       l_str_ver_id  NUMBER;
6222 
6223     /* Bug # 3861344: Modified API: recalculate_prog_stats(). */
6224 
6225     -- Cursor to get baselined dates.
6226 
6227     cursor cur_baselined_dates is
6228     select baseline_start_date, baseline_finish_date
6229     from pa_proj_elements
6230     where project_id = p_project_id
6231     and proj_element_id = p_proj_element_id;
6232 
6233     l_base_start_date DATE := NULL;
6234     l_base_finish_date DATE := NULL;
6235 
6236         --bug 4308359, start
6237     CURSOR cur_proj_curr
6238     IS
6239       SELECT project_currency_code from pa_projects_all where project_id=p_project_id;
6240 
6241         l_prj_currency_code      VARCHAR2(120);
6242         --bug 4308359, end
6243 
6244 
6245 BEGIN
6246   x_return_status := FND_API.G_RET_STS_SUCCESS ;
6247 
6248   Select TASK_WEIGHT_BASIS_CODE
6249   INTO   l_TASK_WEIGHT_BASIS_CODE
6250   From   pa_proj_progress_attr
6251   Where  Project_ID     = p_project_id
6252   AND    Structure_type = p_structure_type;
6253 
6254     If l_TASK_WEIGHT_BASIS_CODE = 'EFFORT' then
6255        l_Planned_Amount    := p_Planned_Effort;
6256        l_Actual_Amount     := p_Actual_Effort;
6257        l_Baseline_Amount   := p_baselined_Effort;
6258 
6259     ELSE
6260        l_Planned_Amount    := p_Planned_Cost;
6261        l_Actual_Amount     := p_Actual_Cost;
6262        l_Baseline_Amount   := p_baselined_Cost;
6263 
6264        OPEN cur_proj_curr;
6265        FETCH  cur_proj_curr INTO l_prj_currency_code;
6266        CLOSE cur_proj_curr;
6267 
6268     End if;
6269 
6270     -- Progress Management Changes. Bug # 3420093.
6271 
6272     /* Begin fix for Bug # 4050324. */
6273 
6274     -- x_BCWP := trunc((l_Planned_Amount*P_Overide_Percent_Complete)/100,2);
6275 
6276     --bug 4308359
6277     --x_BCWP := trunc((l_Baseline_Amount*P_Overide_Percent_Complete)/100,2);
6278      If l_TASK_WEIGHT_BASIS_CODE = 'EFFORT' then
6279         x_BCWP := round((l_Baseline_Amount*P_Overide_Percent_Complete)/100,5);
6280      else
6281         --x_BCWP := pa_currency.round_trans_currency_amt((l_Baseline_Amount*P_Overide_Percent_Complete)/100, l_prj_currency_code);
6282         x_BCWP := pa_currency.round_trans_currency_amt1((l_Baseline_Amount*P_Overide_Percent_Complete)/100, l_prj_currency_code);
6283      end if;
6284 
6285     /* End fix for Bug # 4050324. */
6286 
6287     -- Progress Management Changes. Bug # 3420093.
6288 
6289     --Select (l_Planned_Amount*P_Overide_Percent_Complete)/100
6290     /*
6291     INTO   x_BCWP  -- Earned Value
6292     From   PA_Progress_Rollup
6293     Where  Project_ID       = P_Project_ID
6294     AND    Proj_Element_ID  = P_Proj_Element_ID
6295     AND    object_id = P_Proj_Element_ID
6296     --AND    Object_Type        = 'PA_ASSIGNMENTS'
6297     AND    As_Of_Date       = p_As_Of_Date
6298     AND    Structure_type   = p_structure_type;*/
6299 
6300 
6301     /* 3793758 */
6302     OPEN cur_sch_dates;
6303     FETCH cur_sch_dates INTO l_sch_start_date, l_sch_finish_date;
6304     CLOSE cur_sch_dates;
6305 
6306     OPEN cur_str_ver_id;
6307     FETCH cur_str_ver_id into l_str_ver_id;
6308     CLOSE cur_str_ver_id;
6309 
6310     -- Begin: Fix for Bug # 3926529.
6311 
6312     /* Begin commenting out the following code.
6313     l_bcws := pa_progress_utils.get_bcws(p_project_id => p_project_id
6314                             ,p_object_id => p_proj_element_id
6315                             ,p_proj_element_id => p_proj_element_id
6316                             ,p_as_of_date => p_as_of_date
6317                             ,p_structure_version_id => l_str_ver_id
6318                             ,p_structure_type => p_structure_type
6319                             ,p_scheduled_start_date =>l_sch_start_date
6320                             ,p_scheduled_end_date => l_sch_finish_date
6321                               );
6322     End commenting out the above code. */
6323 
6324      -- Get baselined dates.
6325 
6326         OPEN cur_baselined_dates;
6327         FETCH cur_baselined_dates INTO l_base_start_date, l_base_finish_date;
6328         CLOSE cur_baselined_dates;
6329 
6330 
6331      -- Call API: pa_progress_utils.get_bcws() with baselined dates.
6332 
6333     l_bcws := pa_progress_utils.get_bcws(p_project_id => p_project_id
6334                                         ,p_object_id => p_proj_element_id
6335                                         ,p_proj_element_id => p_proj_element_id
6336                                         ,p_as_of_date => p_as_of_date
6337                                         ,p_structure_version_id => l_str_ver_id
6338                                         ,p_structure_type => p_structure_type
6339                                         ,p_scheduled_start_date =>l_base_start_date
6340                                         ,p_scheduled_end_date => l_base_finish_date);
6341 
6342      -- End: Fix for Bug # 3926529.
6343 
6344     --bug 4308359
6345         --x_bcws := trunc(nvl(l_bcws,0),2);
6346         x_bcws := nvl(l_bcws,0);
6347 
6348     if l_BCWS is null or l_BCWS = 0
6349     then
6350        l_bcws := 1;
6351     else
6352        l_bcws := l_BCWS;
6353     end if;
6354 
6355     -- Progress Management Changes. Bug # 3420093.
6356     --bug 4308359
6357     --X_SCH_Performance_Index    := trunc((x_BCWP / l_BCWS),2);
6358     X_SCH_Performance_Index      := round((x_BCWP / l_BCWS),2);
6359 
6360    -- Progress Management Changes. Bug # 3420093.
6361 
6362     if X_SCH_Performance_Index = 0 or X_SCH_Performance_Index = null
6363     then
6364        l_SCH_Performance_Index := 1;
6365     else
6366        l_SCH_Performance_Index := X_SCH_Performance_Index;
6367     end if;
6368 
6369     if l_Actual_Amount is null or l_Actual_Amount = 0
6370     then
6371         l_Actual_Amount := 1;
6372     else
6373         l_Actual_Amount := l_Actual_Amount;
6374     end if;
6375 
6376     -- Progress Management Changes. Bug # 3420093.
6377     --bug 4308359
6378     --X_COST_Performance_Index   := trunc((x_BCWP/l_Actual_Amount),2);
6379     X_COST_Performance_Index     := round((x_BCWP/l_Actual_Amount),2);
6380 
6381     -- Progress Management Changes. Bug # 3420093.
6382 
6383     if p_task_version_id is not null
6384     then
6385       /*select
6386       scheduled_start_date+((scheduled_finish_date-scheduled_start_date)/l_SCH_Performance_Index)
6387       into x_Sch_At_Completion
6388       from pa_proj_elem_ver_schedule
6389        where project_id = p_project_id
6390       and proj_element_id = p_proj_element_id
6391       and element_version_id = p_task_version_id;
6392       */
6393 
6394     /* Bug # 3861344: Modified API: recalculate_prog_stats(). */
6395 
6396     -- x_Sch_At_Completion := l_sch_start_date+((l_sch_finish_date-l_sch_start_date)/l_SCH_Performance_Index);
6397 
6398     -- Get baselined dates.
6399 
6400     OPEN cur_baselined_dates;
6401     FETCH cur_baselined_dates INTO l_base_start_date, l_base_finish_date;
6402     CLOSE cur_baselined_dates;
6403 
6404     -- Calculate schedule at completion.
6405 
6406     x_Sch_At_Completion := pa_progress_utils.return_start_end_date(l_sch_start_date,l_base_start_date,p_project_id,p_proj_element_id,'PA_TASKS','S')
6407                 +((pa_progress_utils.return_start_end_date(l_sch_finish_date,l_base_finish_date,p_project_id,p_proj_element_id,'PA_TASKS','E')
6408                 -pa_progress_utils.return_start_end_date(l_sch_start_date,l_base_start_date,p_project_id,p_proj_element_id,'PA_TASKS','S'))
6409                 /l_SCH_Performance_Index);
6410 
6411     end if;
6412 
6413     l_tcpi_denom := l_Baseline_Amount-l_Actual_Amount;
6414 
6415     if l_tcpi_denom is null or l_tcpi_denom = 0
6416     then
6417         l_tcpi_denom := 1;
6418     end if;
6419 
6420     -- Progress Management Changes. Bug # 3420093.
6421     --bug 4308359
6422     --x_Complete_Performance_Index := trunc(((l_Baseline_Amount- x_BCWP)/l_tcpi_denom),2);
6423     x_Complete_Performance_Index := round(((l_Baseline_Amount- x_BCWP)/l_tcpi_denom),2);
6424 
6425     -- Progress Management Changes. Bug # 3420093.
6426 
6427   EXCEPTION WHEN OTHERS THEN
6428       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6429       x_Msg_Count     := 1;  -- 4537865 Corrected as '1' .Earlier it was defined as '0'
6430       x_Msg_Data      :=  SUBSTRB(SQLERRM,1,120) ; -- 4537865 : Corrected as err message stack .Earlier it was ''
6431       fnd_msg_pub.add_exc_msg( p_pkg_name       => 'PA_PROGRESS_UTILS'
6432                   ,p_procedure_name => 'RECALCULATE_PROG_STATS'
6433                   ,p_error_text     => SUBSTRB(SQLERRM,1,120));
6434 
6435       -- 4537865
6436       x_BCWS                       := 0 ;
6437       X_BCWP                       := 0 ;
6438       X_SCH_Performance_Index      := 0 ;
6439       X_COST_Performance_Index     := 0 ;
6440       x_Sch_At_Completion          := NULL ;
6441       x_Complete_Performance_Index := 0 ;
6442      -- 4537865
6443 
6444     RAISE FND_API.G_EXC_ERROR;
6445 END RECALCULATE_PROG_STATS;
6446 
6447 -- Bug 3879461 : This function is not used
6448 Procedure DEF_DATES_FROM_RESOURCES (
6449     p_project_id        IN NUMBER
6450    ,p_proj_element_id       IN NUMBER
6451    ,p_structure_type        IN VARCHAR2 DEFAULT 'WORKPLAN'
6452    ,p_As_Of_Date        IN DATE
6453    ,x_Actual_Start_Date     OUT NOCOPY DATE --File.Sql.39 bug 4440895
6454    ,x_Actual_Finish_Date    OUT NOCOPY DATE --File.Sql.39 bug 4440895
6455    ,x_Estimated_Start_Date  OUT NOCOPY DATE --File.Sql.39 bug 4440895
6456    ,x_Estimated_Finish_Date OUT NOCOPY DATE --File.Sql.39 bug 4440895
6457    ,x_return_status             OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
6458    ,x_msg_count                 OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
6459    ,x_msg_data                  OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
6460 )
6461 IS
6462   Cursor CUR_Est_Sch_Dates
6463     IS
6464     Select MIN(Estimated_Start_Date), MAX(Estimated_Finish_Date), MIN(Actual_Start_Date), MAX(Actual_Finish_Date)
6465     FROM   PA_Progress_Rollup
6466     Where  Project_ID       = P_Project_ID
6467     AND    Proj_Element_ID  = P_Proj_Element_ID
6468     AND    Object_Type      = 'PA_ASSIGNMENTS'
6469     AND    As_Of_Date       = p_As_Of_Date
6470     AND    Structure_type   = p_structure_type;
6471 
6472 BEGIN
6473   x_return_status := FND_API.G_RET_STS_SUCCESS ;
6474 
6475   Open CUR_Est_Sch_Dates;
6476   FETCH CUR_Est_Sch_Dates Into
6477     x_Estimated_Start_Date, x_Estimated_Finish_Date, x_Actual_Start_Date, x_Actual_Finish_Date;
6478   Close CUR_Est_Sch_Dates;
6479 
6480   EXCEPTION WHEN OTHERS THEN
6481       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6482       x_Msg_Count     := 1; -- 4537865 Changed from 0 to 1.
6483       x_Msg_Data      :=  SUBSTRB(SQLERRM,1,120); -- 4537865 Changed from '' to   SUBSTRB(SQLERRM,1,120)
6484 
6485    -- 4537865
6486    x_Actual_Start_Date         := NULL ;
6487    x_Actual_Finish_Date        := NULL ;
6488    x_Estimated_Start_Date      := NULL ;
6489    x_Estimated_Finish_Date     := NULL ;
6490   -- 4537865
6491 
6492       fnd_msg_pub.add_exc_msg( p_pkg_name       => 'PA_PROGRESS_UTILS'
6493                   ,p_procedure_name => 'DEF_DATES_FROM_RESOURCES'
6494                   ,p_error_text     => x_msg_data);
6495     RAISE FND_API.G_EXC_ERROR;
6496 END DEF_DATES_FROM_RESOURCES;
6497 
6498 --- End of addding new APIs
6499 
6500 FUNCTION check_actuals_allowed (p_project_id     IN NUMBER
6501                                ,p_structure_type IN VARCHAR2 := 'WORKPLAN') RETURN VARCHAR2
6502 IS
6503     l_return_value VARCHAR2(1) := null;
6504 BEGIN
6505 
6506     select remain_effort_enable_flag
6507     into l_return_value
6508     from pa_proj_progress_attr
6509     where project_id = p_project_id
6510     and structure_type = p_structure_type;
6511 
6512     return(l_return_value);
6513 
6514 END check_actuals_allowed;
6515 
6516 -- Progress Management Changes. Bug # 3420093.
6517 
6518 FUNCTION get_bcws (p_project_id                 IN NUMBER
6519                   ,p_object_id                  IN NUMBER
6520                   ,p_proj_element_id            IN NUMBER
6521                   ,p_as_of_date                 IN DATE
6522                   ,p_structure_version_id       IN NUMBER   := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
6523                   ,p_rollup_method              IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6524                   ,p_scheduled_start_date       IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
6525                   ,p_scheduled_end_date         IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
6526           ,p_prj_currency_code          IN VARCHAR2 := null           --bug 3824042
6527           ,p_structure_type             IN VARCHAR2 := 'WORKPLAN'   --maansari4/10
6528           ) RETURN NUMBER
6529 IS
6530     l_return_bcws NUMBER := null;
6531     l_multiplier  NUMBER := 0;
6532     l_rollup_method VARCHAR2(15) := null;
6533 
6534 -- Progress Management Changes. Bug # 3420093.
6535 
6536     cursor c1 (p_project_id NUMBER, p_object_id NUMBER) is
6537     select pppa.task_weight_basis_code
6538     from pa_proj_progress_attr pppa
6539     where pppa.project_id = p_project_id
6540     and pppa.structure_type = p_structure_type;
6541 
6542     cursor c2 (p_project_id NUMBER, p_proj_element_id NUMBER, p_structure_version_id NUMBER) is
6543     select
6544         /*+ INDEX(pji_fm_xbs_accum_tmp1 pji_fm_xbs_accum_tmp1_n1)*/ -- Fix for Bug # 4162534.
6545         nvl(pfxat.BASE_LABOR_HOURS,pfxat.labor_hours) labor_hours
6546            ,nvl(pfxat.BASE_EQUIP_HOURS,pfxat.equipment_hours) equipment_hours
6547            ,nvl(pfxat.PRJ_BASE_BRDN_COST,pfxat.prj_brdn_cost) prj_brdn_cost
6548     from pji_fm_xbs_accum_tmp1 pfxat
6549     where pfxat.struct_version_id = p_structure_version_id
6550     and pfxat.project_id = p_project_id
6551     and pfxat.project_element_id = p_proj_element_id
6552     and pfxat.plan_version_id > 0
6553     AND pfxat.txn_currency_code is null    --bug no. 3646988
6554     and pfxat.calendar_type  = 'A';
6555 
6556     c1rec c1%rowtype;
6557     c2rec c2%rowtype;
6558 
6559         --bug 3908112
6560     CURSOR cur_proj_curr
6561     IS
6562       SELECT project_currency_code from pa_projects_all where project_id=p_project_id;
6563 
6564         l_prj_currency_code      VARCHAR2(120);
6565         --end bug 3908112
6566 
6567         -- Begin: Fix for Bug # 3926529.
6568 
6569         cursor cur_baselined_dates is
6570         select ppe.baseline_start_date, ppe.baseline_finish_date
6571         from pa_proj_elements ppe
6572         where ppe.project_id = p_project_id
6573         and ppe.proj_element_id = p_proj_element_id;
6574 
6575         cursor cur_scheduled_dates is
6576         select ppevs.scheduled_start_date, ppevs.scheduled_finish_date
6577         from pa_proj_elem_ver_schedule ppevs
6578         where ppevs.project_id = p_project_id
6579         and ppevs.proj_element_id = p_proj_element_id
6580         and ppevs.element_version_id = (select ppev.element_version_id
6581                                         from pa_proj_element_versions ppev
6582                                         where ppev.project_id = p_project_id
6583                                         and ppev.proj_element_id = p_proj_element_id
6584                                         and ppev.parent_structure_version_id = p_structure_version_id);
6585         l_start_date    DATE;
6586 
6587         l_end_date      DATE;
6588 
6589         -- End: Fix for Bug # 3926529.
6590 
6591 BEGIN
6592 /* Addition for bug 6156686 */
6593 /* Commeted for bug 6664716
6594     IF NVL(l_bcws_project_id,-1)               =  NVL(p_project_id,-1)                AND
6595      NVL(l_bcws_object_id,-1)                  =  NVL(p_object_id,-1)                 AND
6596      NVL(l_bcws_proj_element_id,-1)            =  NVL(p_proj_element_id,-1)           AND
6597      NVL(l_bcws_as_of_date,sysdate)            =  NVL(p_as_of_date,sysdate)           AND
6598      NVL(l_bcws_structure_version_id,-1)       =  NVL(p_structure_version_id,-1)      AND
6599      NVL(l_bcws_rollup_method,'-99')           =  NVL(p_rollup_method,'-99')          AND
6600      NVL(l_bcws_scheduled_start_date,sysdate)  =  NVL(p_scheduled_start_date,sysdate) AND
6601      NVL(l_bcws_scheduled_end_date,sysdate)    =  NVL(p_scheduled_end_date,sysdate)   AND
6602      NVL(l_bcws_prj_currency_code,'-99')       =  NVL(p_prj_currency_code,'-99')      AND
6603      NVL(l_bcws_structure_type,'-99')          =  NVL(p_structure_type,'-99') THEN
6604 
6605         RETURN l_bcws_value;
6606 
6607     ELSE
6608 
6609         l_bcws_project_id            := p_project_id          ;
6610         l_bcws_object_id             := p_object_id           ;
6611         l_bcws_proj_element_id       := p_proj_element_id     ;
6612         l_bcws_as_of_date            := p_as_of_date          ;
6613         l_bcws_structure_version_id  := p_structure_version_id;
6614         l_bcws_rollup_method         := p_rollup_method       ;
6615         l_bcws_scheduled_start_date  := p_scheduled_start_date;
6616         l_bcws_scheduled_end_date    := p_scheduled_end_date  ;
6617         l_bcws_prj_currency_code     := p_prj_currency_code   ;
6618         l_bcws_structure_type        := p_structure_type      ;
6619 
6620     END IF;
6621 */
6622 
6623     open c2(p_project_id,p_proj_element_id,p_structure_version_id);
6624     fetch c2 into c2rec;
6625     close c2;
6626 
6627     --bug  6664716
6628     IF p_project_id <> l_prv_bcws_project_id OR
6629        p_structure_version_id <> l_prv_bcws_struc_ver_id
6630     THEN
6631        get_plan_value(p_project_id,p_structure_version_id,p_proj_element_id,p_as_of_date );
6632     END IF;
6633     --bug  6664716
6634 
6635     if (p_rollup_method IS NOT NULL and p_rollup_method <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) then
6636 
6637         if p_rollup_method = 'EFFORT' then
6638                 --bug 3824042
6639                     --l_return_bcws := trunc((nvl(c2rec.labor_hours,0)+nvl(c2rec.equipment_hours,0)),2);
6640 
6641       --Start Changes for Bug 6664716
6642       IF l_bcws_hash_tbl.exists('PA'||p_proj_element_id) THEN
6643         l_return_bcws := nvl(l_bcws_hash_tbl('PA'||p_proj_element_id).labor_hrs,0)
6644                     +nvl(l_bcws_hash_tbl('PA'||p_proj_element_id).equip_hrs,0);
6645       ELSE
6646         l_return_bcws := nvl(c2rec.labor_hours,0)+nvl(c2rec.equipment_hours,0);
6647       END IF;
6648       l_rollup_method := 'EFFORT';
6649       --End Changes for Bug 6664716
6650 
6651                 else
6652                 --bug 3824042
6653                         --l_return_bcws := trunc(nvl(c2rec.prj_brdn_cost,0),2);
6654 
6655       --Start Changes for Bug 6664716
6656       IF l_bcws_hash_tbl.exists('PA'||p_proj_element_id) THEN
6657         l_return_bcws := nvl(l_bcws_hash_tbl('PA'||p_proj_element_id).prj_brdn_cost,0);
6658       ELSE
6659         l_return_bcws := nvl(c2rec.prj_brdn_cost,0);
6660       END IF;
6661       --End Changes for Bug 6664716
6662 
6663                 end if;
6664     else
6665         open c1(p_project_id,p_object_id);
6666             fetch c1 into c1rec;
6667         close c1;
6668 
6669                 if c1rec.task_weight_basis_code = 'EFFORT' then
6670                 --bug 3824042
6671                     --l_return_bcws := trunc((nvl(c2rec.labor_hours,0)+nvl(c2rec.equipment_hours,0)),2);
6672 
6673         --Start Changes for Bug 6664716
6674         IF l_bcws_hash_tbl.exists('PA'||p_proj_element_id) THEN
6675           l_return_bcws := nvl(l_bcws_hash_tbl('PA'||p_proj_element_id).labor_hrs,0)
6676                         +nvl(l_bcws_hash_tbl('PA'||p_proj_element_id).equip_hrs,0);
6677         ELSE
6678           l_return_bcws := nvl(c2rec.labor_hours,0)+nvl(c2rec.equipment_hours,0);
6679         END IF;
6680         --End Changes for Bug 6664716
6681 
6682             l_rollup_method := 'EFFORT';
6683                 else
6684                 --bug 3824042
6685                         --l_return_bcws := trunc(nvl(c2rec.prj_brdn_cost,0),2);
6686               --Start Changes for Bug 6664716
6687               IF l_bcws_hash_tbl.exists('PA'||p_proj_element_id) THEN
6688                 l_return_bcws := nvl(l_bcws_hash_tbl('PA'||p_proj_element_id).prj_brdn_cost,0);
6689               ELSE
6690                 l_return_bcws := nvl(c2rec.prj_brdn_cost,0);
6691               END IF;
6692               --End Changes for Bug 6664716
6693                 end if;
6694     end if;
6695 
6696         -- This if condition will be used when period typd is non timephased then the calcualtion of planned value is done
6697         -- in the same way as done previosly.
6698         IF l_bcws_hash_tbl.exists('PA'||p_proj_element_id) THEN
6699           NULL;
6700   ELSE
6701 
6702         -- Begin: Fix for Bug # 3926529.
6703 
6704         -- If input dates are not null use the input dates.
6705 
6706         if (p_scheduled_start_date is not null) and (p_scheduled_end_date is not null) then
6707 
6708                 l_start_date := p_scheduled_start_date;
6709 
6710                 l_end_date := p_scheduled_end_date;
6711         else
6712 
6713          -- If input dates are null use the baselined dates.
6714 
6715                 open cur_baselined_dates;
6716 
6717                 fetch cur_baselined_dates into l_start_date, l_end_date;
6718 
6719                 -- If baselined dates do not exist then use the scheduled dates.
6720 
6721                 if cur_baselined_dates%notfound OR (l_start_date is null and l_end_date is null) then  ----5478084
6722 
6723                         open cur_scheduled_dates;
6724 
6725                         fetch cur_scheduled_dates into l_start_date, l_end_date;
6726 
6727                         close cur_scheduled_dates;
6728 
6729                 end if;
6730 
6731                 close cur_baselined_dates;
6732         end if;
6733 
6734         -- Determine the multiplier using the above dates.
6735     -- Bug 4587056 : if l_start_date - p_as_of_date is 0 then multiplier should be 1 instead of 0
6736     /* bug 5478084 if l_start_date - p_as_of_date is 0 then multiplier should be 1/duration
6737         if ((l_start_date - p_as_of_date) = 0) then
6738 
6739                 l_multiplier := 1; */
6740 
6741         if ((l_start_date - p_as_of_date) > 0) then
6742 
6743                 l_multiplier := 0;
6744 
6745         elsif ((p_as_of_date - l_end_date) >= 0) then
6746 
6747                 l_multiplier := 1;
6748 
6749         elsif (nvl((l_end_date - l_start_date),0) > 0) then
6750 
6751                 --bug# 3825683, Satish
6752                 --l_multiplier := trunc((nvl((p_as_of_date - l_start_date),0)/
6753                 --              nvl((l_end_date - l_start_date),0)),2);
6754                 l_multiplier := nvl((trunc(p_as_of_date) - trunc(l_start_date)+1),0)/
6755                                 nvl((trunc(l_end_date) - trunc(l_start_date)+1),1); --bug 6058342
6756         end if;
6757 
6758         /* Begin commenting out the following code
6759 
6760     if ((p_scheduled_start_date - p_as_of_date) >= 0) then
6761 
6762         l_multiplier := 0;
6763 
6764     elsif ((p_as_of_date - p_scheduled_end_date) >= 0) then
6765 
6766         l_multiplier := 1;
6767 
6768     elsif (nvl((p_scheduled_end_date - p_scheduled_start_date),0) > 0) then
6769 
6770         --bug# 3825683, Satish
6771         --l_multiplier := trunc((nvl((p_as_of_date - p_scheduled_start_date),0)/
6772         --      nvl((p_scheduled_end_date - p_scheduled_start_date),0)),2);
6773         l_multiplier := nvl((trunc(p_as_of_date) - trunc(p_scheduled_start_date)+1),0)/
6774                 nvl((trunc(p_scheduled_end_date) - trunc(p_scheduled_start_date)+1),0);
6775     end if;
6776 
6777         End commenting out the above code. */
6778 
6779         -- End: Fix for Bug # 3926529.
6780 
6781 -- Progress Management Changes. Bug # 3420093.
6782 
6783     l_return_bcws := l_return_bcws * l_multiplier;
6784 
6785         END IF; -- _bcws_hash_tbl.exists('PA'||p_proj_element_id)
6786 
6787     --bug 3824042, start
6788     if (l_rollup_method = 'EFFORT')
6789     THEN
6790         l_return_bcws := round(l_return_bcws, 5);
6791     ELSE
6792 
6793             --bug 3908112
6794             if p_prj_currency_code is null
6795             then
6796                OPEN cur_proj_curr;
6797                FETCH  cur_proj_curr INTO l_prj_currency_code;
6798                CLOSE cur_proj_curr;
6799             else
6800                l_prj_currency_code := p_prj_currency_code;
6801             end if;
6802               l_return_bcws := pa_currency.round_trans_currency_amt1(l_return_bcws, l_prj_currency_code);
6803             --l_return_bcws := pa_currency.round_trans_currency_amt(l_return_bcws, l_prj_currency_code);
6804         --l_return_bcws := pa_currency.round_trans_currency_amt(l_return_bcws, p_prj_currency_code);
6805             --end bug 3908112
6806 
6807     END IF;
6808     --bug 3824042, end
6809     l_bcws_value := l_return_bcws; -- Added for bug 6339381
6810     return(l_return_bcws);
6811 
6812 END get_bcws;
6813 
6814 FUNCTION get_latest_ass_prog_date(p_project_id          IN      NUMBER
6815                                  ,p_structure_type      IN      VARCHAR2
6816                                  ,p_object_id           IN      NUMBER
6817                                  ,p_object_type         IN      VARCHAR2
6818          ,p_task_id IN  NUMBER := null /* Modified for IB4 Progress CR. */) RETURN DATE
6819 IS
6820     l_return_date   DATE;
6821 BEGIN
6822 
6823     select max(date_computed)
6824     into l_return_date
6825     from pa_percent_completes ppc
6826     where ppc.project_id = p_project_id
6827     and ppc.structure_type = p_structure_type
6828     and ppc.object_id = p_object_id
6829     and ppc.object_type = p_object_type
6830     and ppc.task_id = nvl(p_task_id, p_object_id) /* Modified for IB4 Progress CR. */;
6831 
6832     return(l_return_date);
6833 
6834 END get_latest_ass_prog_date;
6835 
6836 FUNCTION get_resource_list_id ( p_resource_list_member_id NUMBER) RETURN NUMBER IS
6837      CURSOR cur_res_list_id
6838      IS
6839       SELECT resource_list_id
6840         FROM pa_resource_list_members
6841        WHERE resource_list_member_id = p_resource_list_member_id ;
6842 
6843     l_resource_list_id    NUMBER;
6844 BEGIN
6845      OPEN cur_res_list_id;
6846      FETCH cur_res_list_id INTO l_resource_list_id;
6847      CLOSE cur_res_list_id;
6848      RETURN l_resource_list_id;
6849 END get_resource_list_id;
6850 
6851 function get_max_rollup_asofdate2(p_project_id   IN  NUMBER,
6852                                  p_object_id    IN  NUMBER,
6853                                  p_object_type  IN  VARCHAR2,
6854                  p_structure_type IN VARCHAR2 := 'WORKPLAN', -- FPM Dev CR 3
6855                  p_structure_version_id IN NUMBER := NULL -- FPM Dev CR 4
6856                  ,p_proj_element_id IN NUMBER  := null /* Modified for IB4 Progress CR. */
6857                                  ) return date is
6858 l_rollup_date   date;
6859 CURSOR cur_rollupdate
6860 IS
6861            select max(as_of_date)
6862              from pa_progress_rollup
6863             where project_id = p_project_id
6864               and object_id = p_object_id
6865               and object_type = p_object_type
6866           and structure_type = p_structure_type -- FPM Dev CR 4
6867           and ((p_structure_version_id is null AND structure_version_id is null) OR (p_structure_version_id is not null AND structure_version_id = p_structure_version_id)) -- FPM Dev CR 4
6868 
6869 --              and NVL(proj_element_id,-1) = DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id)) /* Amit : Modified for IB4 Progress CR. */
6870 --  Commented out to fix Bug # 4243074.
6871 
6872 -- Begin fix for Bug # 4243074.
6873 
6874 and NVL(proj_element_id,-1) = DECODE(p_structure_type, 'FINANCIAL'
6875                                                      , DECODE(p_object_type, 'PA_STRUCTURES'
6876                                                                            , 0
6877                                                                            , (DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id))))
6878                                                      ,(DECODE(p_object_type, 'PA_DELIVERABLES', NVL(p_proj_element_id,NVL(proj_element_id,-1)),NVL(p_proj_element_id, p_object_id))))
6879 
6880 -- End fix for Bug # 4243074.
6881 
6882           and current_flag <> 'W' -- Bug 3879461
6883          -- and proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
6884           ;
6885 begin
6886 
6887    OPEN cur_rollupdate;
6888    FETCH cur_rollupdate INTO l_rollup_date;
6889    CLOSE cur_rollupdate;
6890 
6891 return l_rollup_date;
6892 
6893 exception when others then
6894   return null;
6895 end get_max_rollup_asofdate2;
6896 
6897 procedure set_prog_as_of_Date(p_project_id   IN NUMBER,
6898                               p_task_id      IN NUMBER,
6899                               p_as_of_date   IN DATE default to_date(null),
6900                   p_object_id    IN NUMBER := null, -- Bug 3974627
6901                   p_object_type  IN VARCHAR2 := 'PA_TASKS' -- Bug 3974627
6902                   ) IS
6903 BEGIN
6904     if p_as_of_date is null then
6905     IF p_object_type = 'PA_TASKS' THEN
6906            G_prog_as_of_date := get_prog_dt_closest_to_sys_dt(p_project_id => p_project_id,
6907                          p_task_id    => p_task_id);
6908     ELSE  -- Bug 3974627 : Added ELSE and call of get_prog_dt_closest_to_sys_dt
6909            G_prog_as_of_date := get_prog_dt_closest_to_sys_dt(p_project_id => p_project_id,
6910                          p_task_id    => p_task_id,
6911                          p_object_id => p_object_id,
6912                          p_object_type => p_object_type);
6913     END IF;
6914     else
6915        G_prog_as_of_date := p_as_of_date;
6916     end if;
6917 
6918 exception when others then
6919     null;
6920 END set_prog_as_of_Date;
6921 
6922 function get_prog_asofdate return date is
6923 begin
6924   return pa_progress_utils.g_prog_as_of_date;
6925 end get_prog_asofdate;
6926 
6927 
6928 --The following api is used to render cost region on Task progress Details -summary page
6929 --bug  4085786, start
6930 /*function check_workplan_cost ( p_project_id   NUMBER)  RETURN VARCHAR2 IS
6931 
6932   l_workplan_cost   VARCHAR2(1) := 'Y';
6933   l_labor_cost_flag VARCHAR2(1) := 'Y';
6934 BEGIN
6935 
6936   l_labor_cost_flag := PA_SECURITY.view_labor_costs(p_project_id);
6937   l_workplan_cost := Pa_Fp_wp_gen_amt_utils.get_wp_track_cost_amt_flag(p_project_id);
6938 
6939   --return 'N' if any of the cost is allowed.
6940 
6941   IF l_labor_cost_flag <> 'Y' OR l_workplan_cost <> 'Y'
6942   THEN
6943      return 'N';
6944   ELSE
6945      return 'Y';
6946   END IF;
6947 END check_workplan_cost;*/
6948 
6949 function check_workplan_cost ( p_project_id IN NUMBER,
6950                    p_task_id    IN NUMBER   := NULL,
6951                    p_object_id  IN NUMBER   := NULL,
6952                    p_object_type    IN VARCHAR2 := 'PA_TASKS',
6953                    p_structure_version_id IN NUMBER := NULL
6954                  )  RETURN VARCHAR2 IS
6955 
6956   l_workplan_cost   VARCHAR2(1) := 'Y';
6957   l_labor_cost_flag VARCHAR2(1) := 'Y';
6958   l_person_id       NUMBER;             -- Added for Bug 3964394
6959 
6960   CURSOR c_assgmt_count IS
6961   SELECT count(*) FROM pa_task_asgmts_v
6962   WHERE project_id = p_project_id
6963   AND   task_id  = p_task_id
6964   AND   structure_version_id = p_structure_version_id
6965   AND   ta_display_flag = 'Y';
6966 
6967   CURSOR c_get_task_res_class_code IS
6968   SELECT resource_class_code FROM pa_task_asgmts_v
6969   WHERE project_id = p_project_id
6970   AND   task_id  = p_task_id
6971   AND   structure_version_id = p_structure_version_id
6972   AND   ta_display_flag = 'Y';
6973 
6974   CURSOR c_get_res_class_code IS
6975   SELECT resource_class_code, ta_display_flag FROM pa_task_asgmts_v
6976   WHERE project_id = p_project_id
6977   AND   task_id  = p_task_id
6978   AND   resource_list_member_id = p_object_id
6979   AND   structure_version_id = p_structure_version_id;
6980 
6981   l_tot_assgmts  NUMBER;
6982   l_res_class_code VARCHAR2(20);
6983   l_ta_display_flag VARCHAR2(1);
6984 BEGIN
6985 
6986 
6987   --l_labor_cost_flag := PA_SECURITY.view_labor_costs(p_project_id);   /* Commented for Bug 3964394 */
6988 
6989   /* Start Bug 3964394 - Changed the function call from view_labor_costs to check_labor_cost_access */
6990   IF ( FND_GLOBAL.USER_ID IS NOT NULL ) THEN
6991      l_person_id := pa_utils.GetEmpIdFromUser( FND_GLOBAL.USER_ID );
6992      l_labor_cost_flag := PA_SECURITY.check_labor_cost_access(l_person_id, p_project_id);
6993   ELSE
6994      l_labor_cost_flag := 'N';       -- In case the user_id is null then don't show the region.
6995   END IF;
6996   /* End Bug 3964394 */
6997 
6998   l_workplan_cost := Pa_Fp_wp_gen_amt_utils.get_wp_track_cost_amt_flag(p_project_id);
6999 
7000   IF l_workplan_cost <> 'Y'
7001   THEN
7002     return 'N';
7003   END IF;
7004 
7005   IF p_task_id IS NULL
7006   THEN
7007     return l_labor_cost_flag;
7008   END IF;
7009 
7010   IF p_object_type = 'PA_TASKS'
7011   THEN
7012     OPEN c_assgmt_count;
7013     FETCH c_assgmt_count INTO l_tot_assgmts;
7014     CLOSE c_assgmt_count;
7015     IF l_tot_assgmts = 1
7016     THEN
7017         OPEN c_get_task_res_class_code;
7018         FETCH c_get_task_res_class_code INTO l_res_class_code;
7019         CLOSE c_get_task_res_class_code;
7020         IF l_res_class_code = 'PEOPLE'
7021         THEN
7022             return l_labor_cost_flag;
7023         ELSE
7024             return 'Y';
7025         END IF;
7026     ELSE
7027         return 'Y';
7028     END IF;
7029   ELSIF p_object_type = 'PA_ASSIGNMENTS'
7030   THEN
7031     OPEN c_get_res_class_code;
7032     FETCH c_get_res_class_code INTO l_res_class_code, l_ta_display_flag;
7033     CLOSE c_get_res_class_code;
7034 
7035     IF l_res_class_code = 'PEOPLE' AND l_ta_display_flag = 'Y'
7036     THEN
7037         return l_labor_cost_flag;
7038     ELSE
7039         return 'Y';
7040     END IF;
7041   END IF;
7042 
7043 END check_workplan_cost;
7044 --bug  4085786, end
7045 
7046 -- Progress Management Changes. Bug # 3420093.
7047 
7048 procedure get_actuals_for_task(p_project_id             IN      NUMBER
7049                               ,p_wp_task_id             IN      NUMBER
7050                   ,p_res_list_mem_id        IN      NUMBER
7051                               ,p_as_of_date             IN      DATE
7052                               ,x_planned_work_qty       OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7053                               ,x_actual_work_qty        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7054                               ,x_ppl_act_cost_pc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7055                               ,x_eqpmt_act_cost_pc      OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7056                               ,x_oth_act_cost_pc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7057                               ,x_ppl_act_cost_fc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7058                               ,x_eqpmt_act_cost_fc      OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7059                               ,x_oth_act_cost_fc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7060                   ,x_act_labor_effort   OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
7061                   ,x_act_eqpmt_effort   OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
7062                   ,x_unit_of_measure        OUT     NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
7063                               ,x_txn_currency_code      OUT     NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
7064                               ,x_ppl_act_cost_tc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7065                               ,x_eqpmt_act_cost_tc      OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7066                               ,x_oth_act_cost_tc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7067                               ,x_ppl_act_rawcost_pc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7068                               ,x_eqpmt_act_rawcost_pc      OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7069                               ,x_oth_act_rawcost_pc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7070                               ,x_ppl_act_rawcost_fc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7071                               ,x_eqpmt_act_rawcost_fc      OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7072                               ,x_oth_act_rawcost_fc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7073                               ,x_ppl_act_rawcost_tc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7074                               ,x_eqpmt_act_rawcost_tc      OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7075                               ,x_oth_act_rawcost_tc        OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7076                   ,x_oth_quantity          OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7077                               ,x_return_status          OUT     NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
7078                               ,x_msg_count              OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7079                               ,x_msg_data               OUT     NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
7080 
7081 IS
7082 
7083 l_wp_task_id        NUMBER := NULL;
7084 l_wp_task_ver_id    NUMBER := NULL;
7085 
7086 l_wp_str_ver_id         NUMBER := NULL;
7087 
7088 l_return_status         VARCHAR2(1) := null;
7089 l_msg_count             NUMBER := null;
7090 l_msg_data              VARCHAR2(250) := null;
7091 
7092 cursor c1_task (p_project_id number, p_object_id number, p_as_of_date date) is
7093 select cumulative_work_quantity, ppl_act_cost_to_date_pc, eqpmt_act_cost_to_date_pc, oth_act_cost_to_date_pc,
7094 ppl_act_cost_to_date_fc, eqpmt_act_cost_to_date_fc, oth_act_cost_to_date_fc, ppl_act_effort_to_date,
7095 eqpmt_act_effort_to_date, ppl_act_cost_to_date_tc, eqpmt_act_cost_to_date_tc, oth_act_cost_to_date_tc,
7096 txn_currency_code, ppl_act_rawcost_to_date_pc, eqpmt_act_rawcost_to_date_pc, oth_act_rawcost_to_date_pc,
7097 ppl_act_rawcost_to_date_fc, eqpmt_act_rawcost_to_date_fc, oth_act_rawcost_to_date_fc,
7098 ppl_act_rawcost_to_date_tc, eqpmt_act_rawcost_to_date_tc, oth_act_rawcost_to_date_tc, oth_quantity_to_date
7099 from pa_progress_rollup ppr1
7100 where ppr1.project_id = p_project_id
7101 and ppr1.object_id = p_object_id
7102 and ppr1.structure_version_id is null
7103 AND ppr1.current_flag <> 'W'   -- Bug 3879461
7104 and ppr1.as_of_date = ( SELECT max(ppr2.as_of_date)
7105                      from pa_progress_rollup ppr2
7106                     WHERE ppr2.as_of_date <= p_as_of_date
7107                       AND ppr2.object_id = p_object_id
7108                       AND ppr2.project_id = p_project_id
7109                       and ppr2.structure_type = 'WORKPLAN'
7110                       AND ppr2.current_flag <> 'W'   -- Bug 3879461
7111                       and ppr2.structure_version_id is null
7112                    )
7113 and ppr1.structure_type = 'WORKPLAN'
7114 ;
7115 
7116 cursor c1_assgn (p_project_id number, p_object_id number, p_proj_element_id number, p_as_of_date date) is
7117 select cumulative_work_quantity, ppl_act_cost_to_date_pc, eqpmt_act_cost_to_date_pc, oth_act_cost_to_date_pc,
7118 ppl_act_cost_to_date_fc, eqpmt_act_cost_to_date_fc, oth_act_cost_to_date_fc, ppl_act_effort_to_date,
7119 eqpmt_act_effort_to_date, ppl_act_cost_to_date_tc, eqpmt_act_cost_to_date_tc, oth_act_cost_to_date_tc,
7120 txn_currency_code, ppl_act_rawcost_to_date_pc, eqpmt_act_rawcost_to_date_pc, oth_act_rawcost_to_date_pc,
7121 ppl_act_rawcost_to_date_fc, eqpmt_act_rawcost_to_date_fc, oth_act_rawcost_to_date_fc,
7122 ppl_act_rawcost_to_date_tc, eqpmt_act_rawcost_to_date_tc, oth_act_rawcost_to_date_tc, oth_quantity_to_date
7123 from pa_progress_rollup ppr1
7124 where ppr1.project_id = p_project_id
7125 and ppr1.object_id = p_object_id
7126 and ppr1.proj_element_id = p_proj_element_id
7127 and ppr1.structure_version_id is null
7128 AND ppr1.current_flag <> 'W'   -- Bug 3879461
7129 and ppr1.as_of_date = ( SELECT max(ppr2.as_of_date)
7130                      from pa_progress_rollup ppr2
7131                     WHERE ppr2.as_of_date <= p_as_of_date
7132                       AND ppr2.object_id = p_object_id
7133               AND ppr2.proj_element_id = p_proj_element_id
7134                       AND ppr2.project_id = p_project_id
7135                       and ppr2.structure_type = 'WORKPLAN'
7136                       AND ppr2.current_flag <> 'W'   -- Bug 3879461
7137                       and ppr2.structure_version_id is null
7138                    )
7139 and ppr1.structure_type = 'WORKPLAN'
7140 ;
7141 
7142 c1rec c1_task%rowtype;
7143 
7144 cursor c4(p_project_id number, p_proj_element_id number) is
7145 select wq_uom_code
7146 from pa_proj_elements
7147 where project_id = p_project_id
7148 and proj_element_id = p_proj_element_id;
7149 
7150 cursor c2(p_element_version_id NUMBER) is
7151 select proj_element_id
7152 from pa_proj_element_versions
7153 where element_version_id = p_element_version_id;
7154 
7155 cursor c3(p_project_id NUMBER, p_element_version_id NUMBER) is
7156 select wq_planned_quantity
7157 from pa_proj_elem_ver_schedule
7158 where project_id = p_project_id
7159 and element_version_id = p_element_version_id;
7160 
7161 
7162 cursor c1_proj_level IS
7163 select cumulative_work_quantity, ppl_act_cost_to_date_pc, eqpmt_act_cost_to_date_pc, oth_act_cost_to_date_pc,
7164 ppl_act_cost_to_date_fc, eqpmt_act_cost_to_date_fc, oth_act_cost_to_date_fc, ppl_act_effort_to_date,
7165 eqpmt_act_effort_to_date
7166 from pa_progress_rollup ppr1
7167 where ppr1.project_id = p_project_id
7168 and ppr1.object_type = 'PA_STRUCTURES'
7169 and ppr1.structure_version_id is null
7170 AND ppr1.current_flag <> 'W'   -- Bug 3879461
7171 and ppr1.as_of_date = ( SELECT max(ppr2.as_of_date)
7172                      from pa_progress_rollup ppr2
7173                     WHERE ppr2.as_of_date <= p_as_of_date
7174                       AND ppr2.object_type = 'PA_STRUCTURES'
7175                       AND ppr2.project_id = p_project_id
7176                       and ppr2.structure_type = 'WORKPLAN'
7177                       and ppr2.structure_version_id is null
7178                       AND ppr2.current_flag <> 'W'   -- Bug 3879461
7179                    )
7180 and ppr1.structure_type = 'WORKPLAN'
7181 ;
7182 
7183 /* Begin code to fix Bug # 4172372. */
7184 
7185 cursor cur_task_version(c_project_id NUMBER, c_wp_task_id NUMBER, c_wp_str_ver_id NUMBER) is
7186 select ppev.element_version_id
7187 from pa_proj_element_versions ppev
7188 where ppev.project_id = c_project_id
7189 and ppev.proj_element_id = c_wp_task_id
7190 and ppev.parent_structure_version_id = c_wp_str_ver_id;
7191 
7192 /* End code to fix Bug # 4172372. */
7193 
7194 BEGIN
7195     savepoint get_actuals_for_task;
7196 
7197     l_return_status := FND_API.G_RET_STS_SUCCESS;
7198 
7199 
7200     /* Begin commenting the following code as we are now accepting workplan task id's in the API.
7201 
7202     -- Get workplan task version id for finacial task id.
7203 
7204     IF p_fin_task_id IS NOT NULL THEN   --bug 3753042
7205 
7206     l_wp_task_ver_id := pa_progress_utils.wp_task_ver_id_for_fin_task_id(p_project_id,p_fin_task_id);
7207 
7208     -- Get workplan task id for workplan task version id.
7209 
7210     open c2(l_wp_task_ver_id);
7211     fetch c2 into l_wp_task_id;
7212     close c2;
7213 
7214     -- Get planned work quantity.
7215 
7216     open c3(p_project_id,l_wp_task_ver_id);
7217         fetch c3 into x_planned_work_qty;
7218         close c3;
7219 
7220     -- Get actuals for the workplan task.
7221 
7222     open c1(p_project_id,l_wp_task_id,l_wp_task_ver_id,p_as_of_date);
7223     fetch c1 into c1rec;
7224     close c1;
7225 
7226     ELSE  --get the project level data if financial task id is null  bug 3753042
7227 
7228         l_wp_task_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION(p_project_id);
7229 
7230         open c3(p_project_id,l_wp_task_ver_id);
7231         fetch c3 into x_planned_work_qty;
7232         close c3;
7233 
7234        -- Get actuals for the workplan task.
7235 
7236         open c1_proj_level;
7237         fetch c1_proj_level into c1rec;
7238         close c1_proj_level;
7239 
7240 
7241     END IF;
7242     End commenting the following code as we are now accepting workplan task id's in the API. */
7243 
7244 
7245         l_wp_task_id := p_wp_task_id;
7246         l_wp_str_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION(p_project_id);
7247 
7248         -- If task level information is requested.
7249 
7250         if (p_res_list_mem_id is null) then
7251 
7252            -- Get actuals and txn currency code for the workplan task.
7253 
7254            open c1_task(p_project_id,l_wp_task_id,p_as_of_date);
7255            fetch c1_task into c1rec;
7256            close c1_task;
7257 
7258     -- If assignment level information is requested.
7259 
7260     else
7261 
7262        open c1_assgn(p_project_id,p_res_list_mem_id,l_wp_task_id,p_as_of_date);
7263            fetch c1_assgn into c1rec;
7264            close c1_assgn;
7265 
7266     end if;
7267 
7268     -- Get actuals and txn currency code for the workplan task.
7269 
7270         x_actual_work_qty := c1rec.cumulative_work_quantity;
7271         x_ppl_act_cost_pc := c1rec.ppl_act_cost_to_date_pc;
7272         x_eqpmt_act_cost_pc := c1rec.eqpmt_act_cost_to_date_pc;
7273         x_oth_act_cost_pc := c1rec.oth_act_cost_to_date_pc;
7274         x_ppl_act_cost_fc := c1rec.ppl_act_cost_to_date_fc;
7275         x_eqpmt_act_cost_fc := c1rec.eqpmt_act_cost_to_date_fc;
7276         x_oth_act_cost_fc := c1rec.oth_act_cost_to_date_fc;
7277         x_act_labor_effort := c1rec.ppl_act_effort_to_date;
7278         x_act_eqpmt_effort := c1rec.eqpmt_act_effort_to_date;
7279         x_ppl_act_cost_tc := c1rec.ppl_act_cost_to_date_tc;
7280         x_eqpmt_act_cost_tc := c1rec.eqpmt_act_cost_to_date_tc;
7281         x_oth_act_cost_tc := c1rec.oth_act_cost_to_date_tc;
7282         x_txn_currency_code := c1rec.txn_currency_code;
7283 
7284 
7285     -- Get actuals in rawcost and other_quantity_to_date.
7286 
7287     x_ppl_act_rawcost_pc     := c1rec.ppl_act_rawcost_to_date_pc;
7288     x_eqpmt_act_rawcost_pc   := c1rec.eqpmt_act_rawcost_to_date_pc;
7289     x_oth_act_rawcost_pc     := c1rec.oth_act_rawcost_to_date_pc;
7290     x_ppl_act_rawcost_fc     := c1rec.ppl_act_rawcost_to_date_fc;
7291     x_eqpmt_act_rawcost_fc   := c1rec.eqpmt_act_rawcost_to_date_fc;
7292     x_oth_act_rawcost_fc     := c1rec.oth_act_rawcost_to_date_fc;
7293     x_ppl_act_rawcost_tc     := c1rec.ppl_act_rawcost_to_date_tc;
7294     x_eqpmt_act_rawcost_tc   := c1rec.eqpmt_act_rawcost_to_date_tc;
7295     x_oth_act_rawcost_tc     := c1rec.oth_act_rawcost_to_date_tc;
7296     x_oth_quantity       := c1rec.oth_quantity_to_date;
7297 
7298 
7299     /* Begin code to fix Bug # 4172372. */
7300 
7301     -- Get the task_version_id for the workplan task.
7302 
7303     open cur_task_version(p_project_id, l_wp_task_id, l_wp_str_ver_id);
7304     fetch cur_task_version into l_wp_task_ver_id;
7305     close cur_task_version;
7306 
7307         /* End code to fix Bug # 4172372. */
7308 
7309     -- Get planned work quantity for worplan task.
7310 
7311     open c3(p_project_id, l_wp_task_ver_id); -- Fix for Bug # 4172372.
7312         fetch c3 into x_planned_work_qty;
7313         close c3;
7314 
7315     -- Get unit of measure for the workplan task
7316 
7317         open c4(p_project_id,l_wp_task_id);
7318         fetch c4 into x_unit_of_measure;
7319         close c4;
7320 
7321     x_return_status := l_return_status;
7322     x_msg_count := l_msg_count;
7323     x_msg_data := l_msg_data;
7324 
7325         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7326                 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
7327                                      p_msg_name       => l_msg_data);
7328                 x_msg_data := l_msg_data;
7329                 x_return_status := 'E';
7330                 x_msg_count := l_msg_count;
7331                 RAISE  FND_API.G_EXC_ERROR;
7332         END IF;
7333 
7334 EXCEPTION
7335 
7336     when FND_API.G_EXC_ERROR then
7337       rollback to get_actuals_for_task;
7338       x_return_status := FND_API.G_RET_STS_ERROR;
7339 
7340     when FND_API.G_EXC_UNEXPECTED_ERROR then
7341       rollback to get_actuals_for_task;
7342       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7343       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
7344                               p_procedure_name => 'get_actuals_for_task',
7345                               p_error_text     => SUBSTRB(SQLERRM,1,120));
7346     when OTHERS then
7347       rollback to get_actuals_fortask;
7348       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7349       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
7350                               p_procedure_name => 'get_actuals_for_task',
7351                               p_error_text     => SUBSTRB(SQLERRM,1,120));
7352       raise;
7353 
7354 END get_actuals_for_task;
7355 
7356 -- Progress Management Changes. Bug # 3420093.
7357 
7358 FUNCTION wp_task_ver_id_for_fin_task_id(p_project_id NUMBER, p_fin_task_id NUMBER) return NUMBER
7359 IS
7360     l_fin_str_ver_id        NUMBER := NULL;
7361     l_fin_task_ver_id       NUMBER := NULL;
7362     l_wp_task_ver_id        NUMBER := NULL;
7363     l_structure_sharing_code    VARCHAR2(30) := NULL;
7364 
7365     cursor c1(p_proj_element_id NUMBER, p_structure_version_id NUMBER) is
7366     select element_version_id
7367     from pa_proj_element_versions
7368     where project_id = p_project_id
7369     and proj_element_id = p_proj_element_id
7370     and parent_structure_version_id = p_structure_version_id;
7371 
7372     cursor c2(p_fin_task_ver_id NUMBER) is
7373     select object_id_from1
7374         from pa_object_relationships
7375         where relationship_type='M'
7376         and object_type_from='PA_TASKS'
7377         and object_type_to='PA_TASKS'
7378         and object_id_to1 = p_fin_task_ver_id;
7379 
7380     cursor c3(p_project_id NUMBER) is
7381     select structure_sharing_code
7382     from pa_projects_all
7383     where project_id = p_project_id;
7384 
7385 BEGIN
7386 
7387     open c3(p_project_id);
7388     fetch c3 into l_structure_sharing_code;
7389     close c3;
7390 
7391     -- Get financial structure version id.
7392 
7393     l_fin_str_ver_id :=  PA_PROJECT_STRUCTURE_UTILS.GET_FIN_STRUC_VER_ID(p_project_id);
7394 
7395     -- Get financial task version id.
7396 
7397     open c1(p_fin_task_id,l_fin_str_ver_id);
7398     fetch c1 into l_fin_task_ver_id;
7399     close c1;
7400 
7401     -- Get workplan task version id.
7402 
7403     if l_structure_sharing_code = 'SPLIT_MAPPING' then
7404 
7405         open c2(l_fin_task_ver_id);
7406         fetch c2 into l_wp_task_ver_id;
7407         close c2;
7408 
7409     else
7410 
7411         l_wp_task_ver_id := l_fin_task_ver_id;
7412 
7413     end if;
7414 
7415     return(l_wp_task_ver_id);
7416 
7417 END wp_task_ver_id_for_fin_task_id;
7418 
7419 /* Bug 3595585 : Added the following procedure */
7420 FUNCTION get_last_etc_effort(
7421      p_project_id   NUMBER
7422     ,p_object_id   NUMBER
7423     ,p_object_type VARCHAR2
7424     ,p_as_of_date  DATE
7425     ,p_structure_type VARCHAR2 := 'WORKPLAN'
7426     ,p_proj_element_id NUMBER := null /* Modified for IB4 Progress CR. */
7427 ) RETURN NUMBER IS
7428 
7429   CURSOR cur_task_etc_effort
7430   IS
7431     SELECT NVL( ESTIMATED_REMAINING_EFFORT, 0 ) + NVL( EQPMT_ETC_EFFORT, 0 )
7432      FROM pa_progress_rollup
7433     WHERE  project_id = p_project_id
7434      AND   object_id  = p_object_id
7435      and proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
7436      --Commented by rtarway for BUG 3835474
7437      /*AND   as_of_date = ( SELECT max(as_of_date)
7438                            from pa_progress_rollup
7439                           WHERE as_of_date < p_as_of_date
7440                            AND  project_id = p_project_id
7441                            AND object_id  = p_object_id
7442                            AND object_type = p_object_type
7443                            AND structure_type = p_structure_type
7444         and proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR.
7445                        )*/
7446      --Added by rtarway for BUG 3835474
7447      AND   as_of_date = ( SELECT max(as_of_date)
7448                            from pa_progress_rollup ppr2
7449                           WHERE ppr2.as_of_date <= p_as_of_date
7450                            AND  ppr2.project_id = p_project_id
7451                            AND ppr2.object_id  = p_object_id
7452                            AND ppr2.object_type = p_object_type
7453                            AND ppr2.structure_type = p_structure_type
7454                            AND ppr2.structure_version_id is null -- Bug 3879461
7455                    and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR.*/
7456                            AND ppr2.current_flag <> 'W'   -- Bug 3879461
7457 --                           AND NOT EXISTS (
7458 --                      SELECT 'X' FROM pa_percent_completes ppc
7459 --                      WHERE ppc.date_computed = ppr2.as_of_date
7460 --                      AND   ppc.project_id = p_project_id
7461 --                      AND   ppc.object_id  = p_object_id
7462 --                      AND   ppc.object_type = p_object_type
7463 --                      AND   ppc.structure_type = p_structure_type
7464 --                      AND   ppc.published_flag = 'N'
7465 --                    )
7466                        )
7467      AND   object_type = p_object_type
7468      AND structure_type = p_structure_type
7469      AND structure_version_id is null -- Bug 3879461
7470      AND current_flag <> 'W'   -- Bug 3879461
7471     ;
7472     l_last_submitted_etc_effort    NUMBER;
7473 BEGIN
7474 
7475     OPEN cur_task_etc_effort;
7476     FETCH cur_task_etc_effort INTO l_last_submitted_etc_effort;
7477     CLOSE cur_task_etc_effort;
7478 
7479     RETURN l_last_submitted_etc_effort;
7480 END get_last_etc_effort;
7481 
7482 /* Bug 3595585 : Added the following procedure */
7483 FUNCTION get_last_etc_cost(
7484      p_project_id   NUMBER
7485     ,p_object_id   NUMBER
7486     ,p_object_type VARCHAR2
7487     ,p_as_of_date  DATE
7488     ,p_structure_type VARCHAR2 := 'WORKPLAN'
7489     ,p_proj_element_id NUMBER := null /* Modified for IB4 Progress CR. */
7490 ) RETURN NUMBER IS
7491 
7492   CURSOR cur_task_etc_cost
7493   IS
7494     SELECT (nvl(ppr.oth_etc_cost_tc,0)+nvl(ppr.ppl_etc_cost_tc,0)+nvl(ppr.eqpmt_etc_cost_tc,0))
7495      FROM pa_progress_rollup ppr
7496     WHERE  ppr.project_id = p_project_id
7497      AND   ppr.object_id  = p_object_id
7498      and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
7499      AND   ppr.as_of_date = ( SELECT max(as_of_date)
7500                            from pa_progress_rollup ppr2
7501                           WHERE ppr2.as_of_date < p_as_of_date
7502                            AND  ppr2.project_id = p_project_id
7503                            AND ppr2.object_id  = p_object_id
7504                            AND ppr2.object_type = p_object_type
7505                            AND ppr2.structure_type = p_structure_type
7506                AND ppr2.structure_version_id is null -- Bug 3879461
7507                           AND ppr2.current_flag <> 'W'   -- Bug 3879461
7508                         and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
7509                        )
7510      AND   ppr.object_type = p_object_type
7511      AND ppr.structure_type = p_structure_type
7512      AND ppr.structure_version_id is null -- Bug 3879461
7513      AND ppr.current_flag <> 'W'   -- Bug 3879461
7514 
7515      ;
7516 
7517   l_last_submitted_etc_cost    NUMBER;
7518 
7519 BEGIN
7520 
7521     OPEN cur_task_etc_cost;
7522     FETCH cur_task_etc_cost INTO l_last_submitted_etc_cost;
7523     CLOSE cur_task_etc_cost;
7524 
7525     RETURN l_last_submitted_etc_cost;
7526 END get_last_etc_cost;
7527 
7528 --Commented the following API for BUG 4091457, by rtarway
7529 --
7530 /*
7531  --Bug 3595585 : Added the following procedure
7532  --Bug 3621404 : Added burden parameters
7533 PROCEDURE get_last_etc_all(p_project_id             IN      NUMBER
7534                               ,p_object_id      IN      NUMBER
7535                               ,p_object_type            IN      VARCHAR2
7536                               ,p_as_of_date     IN  DATE
7537                               ,p_structure_type     IN  VARCHAR2    := 'WORKPLAN'
7538                               ,x_etc_txn_raw_cost_last_subm OUT     NUMBER
7539                               ,x_etc_prj_raw_cost_last_subm OUT     NUMBER
7540                               ,x_etc_pfc_raw_cost_last_subm OUT     NUMBER
7541                               ,x_etc_txn_bur_cost_last_subm OUT     NUMBER
7542                               ,x_etc_prj_bur_cost_last_subm OUT     NUMBER
7543                               ,x_etc_pfc_bur_cost_last_subm OUT     NUMBER
7544                               ,x_etc_effort_last_subm   OUT     NUMBER
7545                               ,x_return_status          OUT     VARCHAR2
7546                               ,x_msg_count              OUT     NUMBER
7547                               ,x_msg_data               OUT     VARCHAR2
7548               ,p_proj_element_id    IN  NUMBER := null )
7549 IS
7550   CURSOR cur_task_etc_all
7551   IS
7552     SELECT (nvl(ppr.oth_etc_rawcost_tc,0)+nvl(ppr.ppl_etc_rawcost_tc,0)+nvl(ppr.eqpmt_etc_rawcost_tc,0)) etc_txn_raw_rawcost_last_subm
7553     ,(nvl(ppr.oth_etc_rawcost_pc,0)+nvl(ppr.ppl_etc_rawcost_pc,0)+nvl(ppr.eqpmt_etc_rawcost_pc,0)) etc_prj_raw_rawcost_last_subm
7554     ,(nvl(ppr.oth_etc_rawcost_fc,0)+nvl(ppr.ppl_etc_rawcost_fc,0)+nvl(ppr.eqpmt_etc_rawcost_fc,0)) etc_pfc_raw_rawcost_last_subm
7555         ,(nvl(ppr.oth_etc_cost_tc,0)+nvl(ppr.ppl_etc_cost_tc,0)+nvl(ppr.eqpmt_etc_cost_tc,0)) etc_txn_bur_cost_last_subm
7556     ,(nvl(ppr.oth_etc_cost_pc,0)+nvl(ppr.ppl_etc_cost_pc,0)+nvl(ppr.eqpmt_etc_cost_pc,0)) etc_prj_bur_cost_last_subm
7557     ,(nvl(ppr.oth_etc_cost_fc,0)+nvl(ppr.ppl_etc_cost_fc,0)+nvl(ppr.eqpmt_etc_cost_fc,0)) etc_pfc_bur_cost_last_subm
7558     , (NVL( ESTIMATED_REMAINING_EFFORT, 0 ) + NVL( EQPMT_ETC_EFFORT, 0 )) etc_effort_last_subm
7559      FROM pa_progress_rollup ppr
7560     WHERE  ppr.project_id = p_project_id
7561      AND   ppr.object_id  = p_object_id
7562      and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id)
7563      --Commented by rtarway for BUG 3835474
7564      --AND   ppr.as_of_date = ( SELECT max(as_of_date)
7565      --                      from pa_progress_rollup ppr2
7566      --                     WHERE ppr2.as_of_date < p_as_of_date
7567      --                      AND  ppr2.project_id = p_project_id
7568      --                      AND ppr2.object_id  = p_object_id
7569      --                      AND ppr2.object_type = p_object_type
7570      --                      AND ppr2.structure_type = p_structure_type
7571     --and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
7572      --                  )
7573      --Added by rtarway for BUG 3835474
7574      AND   ppr.as_of_date = ( SELECT max(as_of_date)
7575                            from pa_progress_rollup ppr2
7576                           WHERE ppr2.as_of_date <= p_as_of_date
7577                            AND  ppr2.project_id = p_project_id
7578                            AND ppr2.object_id  = p_object_id
7579                            AND ppr2.object_type = p_object_type
7580                            AND ppr2.structure_type = p_structure_type
7581                            AND ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id)
7582                AND ppr2.structure_version_id is null -- Bug 3879461
7583                            AND ppr2.current_flag <> 'W'   -- Bug 3879461
7584 --                            AND NOT EXISTS
7585 --                                (
7586 --                                  SELECT 'X' FROM pa_percent_completes ppc
7587 --                                  WHERE ppc.date_computed = ppr2.as_of_date
7588 --                                  AND   ppc.project_id = p_project_id
7589 --                                  AND   ppc.object_id  = p_object_id
7590 --                                  AND   ppc.object_type = p_object_type
7591 --                                  AND   ppc.structure_type = p_structure_type
7592 --                                  AND   ppc.published_flag = 'N'
7593 --                                )
7594                            )
7595      AND ppr.object_type = p_object_type
7596      AND ppr.structure_type = p_structure_type
7597      AND ppr.structure_version_id is null -- Bug 3879461
7598      AND ppr.current_flag <> 'W'   -- Bug 3879461
7599 
7600      ;
7601 BEGIN
7602 
7603     x_return_status := 'S';
7604 
7605     OPEN cur_task_etc_all;
7606     FETCH cur_task_etc_all INTO x_etc_txn_raw_cost_last_subm, x_etc_prj_raw_cost_last_subm, x_etc_pfc_raw_cost_last_subm, x_etc_txn_bur_cost_last_subm, x_etc_prj_bur_cost_last_subm, x_etc_pfc_bur_cost_last_subm, x_etc_effort_last_subm;
7607     CLOSE cur_task_etc_all;
7608 EXCEPTION
7609 WHEN NO_DATA_FOUND THEN
7610     null;
7611 WHEN OTHERS THEN
7612       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7613       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
7614                               p_procedure_name => 'get_last_etc_all',
7615                               p_error_text     => SUBSTRB(SQLERRM,1,120));
7616       raise;
7617 END get_last_etc_all;*/
7618 
7619 
7620 PROCEDURE get_last_etc_all(    p_project_id             IN      NUMBER
7621                               ,p_object_id      IN      NUMBER
7622                               ,p_object_type            IN      VARCHAR2
7623                               ,p_as_of_date     IN    DATE
7624                               ,p_structure_type     IN    VARCHAR2   := 'WORKPLAN'
7625                               ,x_etc_txn_raw_cost_last_subm OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7626                               ,x_etc_prj_raw_cost_last_subm OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7627                               ,x_etc_pfc_raw_cost_last_subm OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7628                               ,x_etc_txn_bur_cost_last_subm OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7629                               ,x_etc_prj_bur_cost_last_subm OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7630                               ,x_etc_pfc_bur_cost_last_subm OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7631                               ,x_etc_effort_last_subm    OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7632                               ,x_return_status          OUT     NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
7633                               ,x_msg_count              OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
7634                               ,x_msg_data               OUT     NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
7635                   ,p_proj_element_id    IN    NUMBER := null /* Modified for IB4 Progress CR. */
7636                   ,p_resource_class_code IN VARCHAR2    := 'PEOPLE' -- Bug 3836485
7637                     )
7638 IS
7639   CURSOR cur_task_etc_all
7640   IS
7641     SELECT
7642      decode( p_resource_class_code, 'PEOPLE', ppr.ppl_etc_rawcost_tc
7643                                    ,'EQUIPMENT', ppr.eqpmt_etc_rawcost_tc
7644                                    ,ppr.oth_etc_rawcost_tc )  etc_txn_raw_rawcost_last_subm
7645     ,decode(p_resource_class_code, 'PEOPLE', ppr.ppl_etc_rawcost_pc
7646                                   ,'EQUIPMENT', ppr.eqpmt_etc_rawcost_pc
7647                                   , ppr.oth_etc_rawcost_pc ) etc_prj_raw_rawcost_last_subm
7648     ,decode(p_resource_class_code, 'PEOPLE', ppr.ppl_etc_rawcost_fc
7649                                   ,'EQUIPMENT', ppr.eqpmt_etc_rawcost_fc
7650                                   ,ppr.oth_etc_rawcost_fc) etc_pfc_raw_rawcost_last_subm
7651     ,decode(p_resource_class_code, 'PEOPLE', ppr.ppl_etc_cost_tc
7652                                   ,'EQUIPMENT', ppr.eqpmt_etc_cost_tc
7653                                   ,ppr.oth_etc_cost_tc ) etc_txn_bur_cost_last_subm
7654     ,decode(p_resource_class_code, 'PEOPLE', ppr.ppl_etc_cost_pc
7655                                   ,'EQUIPMENT', ppr.eqpmt_etc_cost_pc
7656                   ,ppr.oth_etc_cost_pc ) etc_prj_bur_cost_last_subm
7657     ,decode(p_resource_class_code, 'PEOPLE', ppr.ppl_etc_cost_fc
7658                                   ,'EQUIPMENT', ppr.eqpmt_etc_cost_fc
7659                                   ,ppr.oth_etc_cost_fc ) etc_pfc_bur_cost_last_subm
7660     ,decode(p_resource_class_code, 'PEOPLE', ESTIMATED_REMAINING_EFFORT
7661                                   ,'EQUIPMENT', EQPMT_ETC_EFFORT
7662                   , ppr.OTH_ETC_QUANTITY) etc_effort_last_subm
7663      FROM pa_progress_rollup ppr
7664     WHERE  ppr.project_id = p_project_id
7665      AND   ppr.object_id  = p_object_id
7666      and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
7667      AND   ppr.as_of_date = ( SELECT max(as_of_date)
7668                            from pa_progress_rollup ppr2
7669                           WHERE ppr2.as_of_date <= p_as_of_date--Added eqaulity condition, 4091457, rtarway
7670                            AND  ppr2.project_id = p_project_id
7671                            AND ppr2.object_id  = p_object_id
7672                            AND ppr2.object_type = p_object_type
7673                            AND ppr2.structure_type = p_structure_type
7674                            AND ppr2.structure_version_id is null -- Bug 3879461
7675                            AND ppr2.current_flag <> 'W'   -- Bug 3879461
7676                            and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) /* Modified for IB4 Progress CR. */
7677                        )
7678      AND ppr.object_type = p_object_type
7679      AND ppr.structure_type = p_structure_type
7680      AND ppr.structure_version_id is null -- Bug 3879461
7681      AND ppr.current_flag <> 'W'   -- Bug 3879461
7682      ;
7683 BEGIN
7684 
7685     x_return_status := 'S';
7686 
7687     OPEN cur_task_etc_all;
7688     FETCH cur_task_etc_all INTO x_etc_txn_raw_cost_last_subm,
7689     x_etc_prj_raw_cost_last_subm, x_etc_pfc_raw_cost_last_subm,
7690     x_etc_txn_bur_cost_last_subm, x_etc_prj_bur_cost_last_subm,
7691     x_etc_pfc_bur_cost_last_subm, x_etc_effort_last_subm;
7692     CLOSE cur_task_etc_all;
7693 
7694 
7695 EXCEPTION
7696 WHEN NO_DATA_FOUND THEN
7697     null;
7698 WHEN OTHERS THEN
7699       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7700       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
7701                               p_procedure_name => 'get_last_etc_all',
7702                               p_error_text     => SUBSTRB(SQLERRM,1,120));
7703 
7704       -- 4537865
7705       x_etc_txn_raw_cost_last_subm := NULL ;
7706       x_etc_prj_raw_cost_last_subm := NULL ;
7707       x_etc_pfc_raw_cost_last_subm := NULL ;
7708       x_etc_txn_bur_cost_last_subm := NULL ;
7709       x_etc_prj_bur_cost_last_subm := NULL ;
7710       x_etc_pfc_bur_cost_last_subm := NULL ;
7711       x_etc_effort_last_subm        := NULL ;
7712       -- 4537865
7713       raise;
7714 END get_last_etc_all;
7715 
7716 -- Progress Management Changes. Bug # 3420093.
7717 
7718 function sum_etc_values(
7719      p_planned_value            NUMBER := null
7720      ,p_ppl_etc_value           NUMBER := null
7721      ,p_eqpmt_etc_value         NUMBER := null
7722      ,p_oth_etc_value           NUMBER := null
7723      ,p_subprj_ppl_etc_value    NUMBER := null
7724      ,p_subprj_eqpmt_etc_value  NUMBER := null
7725      ,p_subprj_oth_etc_value    NUMBER := null
7726      ,p_oth_etc_quantity        NUMBER := null
7727      ,p_actual_value            NUMBER := null
7728      ,p_mode                    VARCHAR2 := 'PUBLISH'
7729 )return number
7730 is
7731     l_sum_etc_values    NUMBER;
7732 begin
7733 if p_mode = 'PUBLISH'   --commenting out IF-THNE-ELSE clause for bug 3927404 issue #2  --again uncommenting 5726773
7734   then
7735     if ((p_ppl_etc_value is null) and (p_eqpmt_etc_value is null)
7736          and (p_oth_etc_value is null) and (p_subprj_ppl_etc_value is null)
7737          and (p_subprj_eqpmt_etc_value is null) and (p_subprj_oth_etc_value is null)
7738          and (p_oth_etc_quantity is null)) then
7739 
7740         ---5726773 l_sum_etc_values := nvl(p_planned_value,0) - nvl(p_actual_value,0);
7741  	l_sum_etc_values := PA_FP_FCST_GEN_AMT_UTILS.get_etc_from_plan_act(nvl(p_planned_value,0), nvl(p_actual_value,0));
7742 
7743     else
7744 
7745         l_sum_etc_values := (nvl(p_ppl_etc_value,0)+nvl(p_eqpmt_etc_value,0)
7746                     +nvl(p_oth_etc_value,0)+nvl(p_subprj_ppl_etc_value,0)
7747                             +nvl(p_subprj_eqpmt_etc_value,0)+nvl(p_subprj_oth_etc_value,0)
7748                     +nvl(p_oth_etc_quantity,0));
7749 
7750     end if;
7751   else
7752       -- Start Changes for bug 6714865
7753       -- l_sum_etc_values := nvl(p_planned_value,0) - nvl(p_actual_value,0);
7754       l_sum_etc_values := PA_FP_FCST_GEN_AMT_UTILS.get_etc_from_plan_act(nvl(p_planned_value,0),
7755 nvl(p_actual_value,0));
7756       -- End Changes for bug 6714865
7757   end if;
7758 
7759     -- if l_sum_etc_values is negative return 0.
7760    /*5726773
7761     if (nvl(l_sum_etc_values,0) < 0) then
7762         l_sum_etc_values := 0;
7763     end if;
7764     */
7765     return(l_sum_etc_values);
7766 
7767 end sum_etc_values;
7768 
7769 -- Progress Management Changes. Bug # 3420093.
7770 -- Bug 3879461 : This function is not used.
7771 FUNCTION get_act_rawcost_this_period (p_as_of_date        IN     DATE
7772                                      ,p_project_id        IN     NUMBER
7773                                      ,p_object_id         IN     NUMBER
7774                                      ,p_object_version_id IN     NUMBER
7775       ,p_proj_element_id      IN     NUMBER := null /* Modified for IB4 Progress CR. */) return NUMBER
7776 IS
7777     l_act_rawcost_period        NUMBER := NULL;
7778     l_act_rawcost_date      NUMBER := NULL;
7779     l_act_rawcost_pub       NUMBER := NULL;
7780 
7781 /*
7782 cursor c1 is
7783          select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
7784             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
7785             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
7786             act_rawcost_to_date
7787                 from pa_progress_rollup ppr
7788                 where ppr.project_id = p_project_id
7789                 and ppr.object_id = p_object_id
7790                 -- and ppr.object_version_id = p_object_version_id
7791          and structure_type = 'WORKPLAN' -- FPM Dev CR 3
7792     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id)-- Modified for IB4 Progress CR.
7793                 and ppr.as_of_date = (select max(ppr2.as_of_date)
7794                                      from pa_progress_rollup ppr2
7795                                      where ppr2.project_id = p_project_id
7796                                      and ppr2.object_id = p_object_id
7797                                      -- and ppr2.object_version_id = p_object_version_id
7798                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
7799                                      and ppr2.as_of_date > p_as_of_date
7800     and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id)); --Modified for IB4 Progress CR. );
7801     l_c1rec     c1%rowtype;
7802 */
7803 
7804     cursor c_prev_prog_rec is
7805          select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
7806             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
7807             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
7808             act_rawcost_to_date
7809                 from pa_progress_rollup ppr
7810                 where ppr.project_id = p_project_id
7811                 and ppr.object_id = p_object_id
7812                 -- and ppr.object_version_id = p_object_version_id
7813             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7814         and ppr.structure_version_id is null -- Bug 3764224
7815             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
7816                 and ppr.as_of_date = (select max(ppr2.as_of_date)
7817                                      from pa_progress_rollup ppr2
7818                                      where ppr2.project_id = p_project_id
7819                                      and ppr2.object_id = p_object_id
7820                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7821                      and ppr2.structure_version_id is null -- Bug 3764224
7822                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
7823                                      and ppr2.as_of_date < p_as_of_date);
7824 
7825     cursor c_this_prog_rec is
7826          select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
7827             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
7828             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
7829             act_rawcost_to_date
7830                 from pa_progress_rollup ppr
7831                 where ppr.project_id = p_project_id
7832                 and ppr.object_id = p_object_id
7833                 -- and ppr.object_version_id = p_object_version_id
7834             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7835         and ppr.structure_version_id is null -- Bug 3764224
7836             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
7837                 and ppr.as_of_date = (select max(ppr2.as_of_date)
7838                                      from pa_progress_rollup ppr2
7839                                      where ppr2.project_id = p_project_id
7840                                      and ppr2.object_id = p_object_id
7841                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7842                      and ppr2.structure_version_id is null -- Bug 3764224
7843                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
7844                                      and ppr2.as_of_date >= p_as_of_date);
7845 
7846 
7847 BEGIN
7848 -- Bug 3764224 : This function(_this_peiord) are used only in assignment cases. So it is safe to select from rollup table itself
7849 -- no need to go in percent complete table
7850 -- Bug 3764224 : RLM Changes : Commented the below code. This was not calculating the actual this period
7851 /*
7852     open c1;
7853     fetch c1 into l_c1rec;
7854     if c1%found then
7855         select (nvl(ppr.oth_act_rawcost_to_date_pc,0)+nvl(ppr.ppl_act_rawcost_to_date_pc,0)
7856             +nvl(ppr.eqpmt_act_rawcost_to_date_pc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_pc,0)
7857             +nvl(ppr.subprj_ppl_act_rawcost_pc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_pc,0))
7858                 into l_act_rawcost_pub
7859                 from pa_progress_rollup ppr,pa_percent_completes ppc
7860                 where ppr.project_id = ppc.project_id
7861             and ppr.object_id = ppc.object_id
7862             and ppr.object_version_id = ppc.object_version_id
7863             and ppr.as_of_date = ppc.date_computed (+)
7864         and ppr.project_id = p_project_id
7865                 and ppr.object_id = p_object_id
7866                 -- and ppr.object_version_id = p_object_version_id
7867     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
7868             and ppr.percent_complete_id = ppc.percent_complete_id
7869          and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7870          and ppr.structure_type = ppc.structure_type(+) -- FPM Dev CR 3
7871         and ppr.proj_element_id = ppc.task_id (+) -- Modified for IB4 Progress CR.
7872                 and ppr.as_of_date = (select max(ppc2.date_computed)
7873                                      from pa_percent_completes ppc2
7874                                      where ppc2.project_id = p_project_id
7875                                      and ppc2.object_id = p_object_id
7876                                      -- and ppc2.object_version_id = p_object_version_id
7877                      and ppc2.published_flag = 'Y'
7878                      and ppc2.current_flag = 'Y'
7879                          and ppc2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7880         and ppc2.task_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
7881                      );
7882 
7883         l_act_rawcost_period := (nvl(l_c1rec.act_rawcost_to_date,0) - nvl(l_act_rawcost_pub,0));
7884 
7885     end if;
7886     close c1;
7887 */
7888 
7889     open c_prev_prog_rec;
7890     fetch c_prev_prog_rec into l_act_rawcost_pub;
7891     close c_prev_prog_rec;
7892 
7893     open c_this_prog_rec;
7894     fetch c_this_prog_rec into l_act_rawcost_date;
7895     close c_this_prog_rec;
7896 
7897     l_act_rawcost_period := (nvl(l_act_rawcost_date,0) - nvl(l_act_rawcost_pub,0));
7898 
7899     if (l_act_rawcost_period < 0) then
7900         l_act_rawcost_period := 0;
7901     end if;
7902 
7903     return(l_act_rawcost_period);
7904 
7905 END get_act_rawcost_this_period;
7906 
7907 -- Progress Management Changes. Bug # 3621404.
7908 
7909 FUNCTION get_act_txn_rawcost_thisperiod (p_as_of_date        IN     DATE
7910                                         ,p_project_id        IN     NUMBER
7911                                         ,p_object_id         IN     NUMBER
7912                                         ,p_object_version_id IN     NUMBER
7913     ,p_proj_element_id      IN     NUMBER := null /* Modified for IB4 Progress CR. */) return NUMBER
7914 IS
7915     l_act_rawcost_period        NUMBER := NULL;
7916     l_act_rawcost_date      NUMBER := NULL;
7917     l_act_rawcost_pub       NUMBER := NULL;
7918 /*
7919 
7920     cursor c1 is
7921          select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
7922             +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
7923             +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_rawcost_to_date
7924                 from pa_progress_rollup ppr
7925                 where ppr.project_id = p_project_id
7926                 and ppr.object_id = p_object_id
7927                 -- and ppr.object_version_id = p_object_version_id
7928          and structure_type = 'WORKPLAN' -- FPM Dev CR 3
7929                 and ppr.as_of_date = (select max(ppr2.as_of_date)
7930                                      from pa_progress_rollup ppr2
7931                                      where ppr2.project_id = p_project_id
7932                                      and ppr2.object_id = p_object_id
7933                                      -- and ppr2.object_version_id = p_object_version_id
7934                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
7935                                      and ppr2.as_of_date > p_as_of_date);
7936     l_c1rec     c1%rowtype;
7937 */
7938 
7939 --bug 3738651
7940 /*        cursor cur_rawcost_tc_this_period
7941             is
7942               select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
7943                      +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
7944                      +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_rawcost_to_date
7945                 from pa_progress_rollup ppr,pa_percent_completes ppc
7946                 where ppr.project_id = ppc.project_id
7947                 and ppr.object_id = ppc.object_id
7948                 and ppr.as_of_date = ppc.date_computed
7949                 and ppr.project_id = p_project_id
7950             and ppr.object_id = p_object_id
7951         and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
7952             and ppr.percent_complete_id = ppc.percent_complete_id
7953                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7954             and ppr.structure_type = ppc.structure_type (+) -- FPM Dev CR 3
7955         and ppr.proj_element_id = ppc.task_id (+) -- Modified for IB4 Progress CR.
7956             and ppc.current_flag = 'N'
7957             and ppc.published_flag = 'N'
7958             ;
7959 */
7960 
7961 /* added by maansari7/25 */
7962     cursor c_prev_prog_rec is
7963          select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
7964                      +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
7965                      +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_rawcost_to_date
7966                 from pa_progress_rollup ppr
7967                 where ppr.project_id = p_project_id
7968                 and ppr.object_id = p_object_id
7969                 -- and ppr.object_version_id = p_object_version_id
7970                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7971                 and ppr.structure_version_id is null -- Bug 3764224
7972                 and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
7973                 and current_flag = 'Y'
7974                 ;
7975 
7976 /* commented by maansari 7/25
7977   cursor c_prev_prog_rec is
7978          select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
7979                      +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
7980                      +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_rawcost_to_date
7981                 from pa_progress_rollup ppr
7982                 where ppr.project_id = p_project_id
7983                 and ppr.object_id = p_object_id
7984                 -- and ppr.object_version_id = p_object_version_id
7985             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7986         and ppr.structure_version_id is null -- Bug 3764224
7987             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
7988                 and ppr.as_of_date = (select max(ppr2.as_of_date)
7989                                      from pa_progress_rollup ppr2
7990                                      where ppr2.project_id = p_project_id
7991                                      and ppr2.object_id = p_object_id
7992                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
7993                      and ppr2.structure_version_id is null -- Bug 3764224
7994                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
7995                                      and ppr2.as_of_date < p_as_of_date);
7996    */
7997 
7998    /* commented by maansari 7/25
7999     cursor c_this_prog_rec is
8000          select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
8001                      +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
8002                      +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_rawcost_to_date
8003                 from pa_progress_rollup ppr
8004                 where ppr.project_id = p_project_id
8005                 and ppr.object_id = p_object_id
8006                 -- and ppr.object_version_id = p_object_version_id
8007             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8008         and ppr.structure_version_id is null -- Bug 3764224
8009             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
8010                 and ppr.as_of_date = (select max(ppr2.as_of_date)
8011                                      from pa_progress_rollup ppr2
8012                                      where ppr2.project_id = p_project_id
8013                                      and ppr2.object_id = p_object_id
8014                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8015                      and ppr2.structure_version_id is null -- Bug 3764224
8016                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
8017                                      and ppr2.as_of_date >= p_as_of_date);
8018         */
8019 /* added by maansari7/25 */
8020             cursor c_this_prog_rec is
8021          select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
8022                      +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
8023                      +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_rawcost_to_date
8024                 from pa_progress_rollup ppr
8025              -- Bug 3879461 : percemnt compete join is not required. current_flag = W is sufficient
8026 --                    ,pa_percent_completes ppc
8027                 where ppr.project_id = p_project_id
8028                 and ppr.object_id = p_object_id
8029                 -- and ppr.object_version_id = p_object_version_id
8030                 and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8031             and ppr.structure_version_id is null -- Bug 3764224
8032                 and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
8033 --               and ppr.object_id = ppc.object_id
8034 --               and ppr.as_of_date = ppc.date_computed
8035 --                and ppr.percent_complete_id = ppc.percent_complete_id
8036 --                and ppr.project_id = ppc.project_id
8037 --                and ppr.proj_element_id=ppc.task_id
8038 --                and ppr.structure_type = ppc.structure_type
8039 --                and ppc.current_flag= 'N'
8040 --                and ppc.published_flag = 'N'
8041                 and ppr.current_flag= 'W'
8042                 ;
8043 
8044 
8045 BEGIN
8046 
8047 -- Bug 3764224 : This function(_this_peiord) are used only in assignment cases. So it is safe to select from rollup table itself
8048 -- no need to go in percent complete table
8049 -- Bug 3764224 : RLM Changes : Commented the below code. This was not calculating the actual this period
8050 
8051 /*
8052     open c1;
8053     fetch c1 into l_c1rec;
8054     if c1%found then
8055         select (nvl(ppr.oth_act_rawcost_to_date_tc,0)+nvl(ppr.ppl_act_rawcost_to_date_tc,0)
8056             +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
8057             +nvl(ppr.subprj_ppl_act_rawcost_tc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_tc,0))
8058                 into l_act_rawcost_pub
8059                 from pa_progress_rollup ppr,pa_percent_completes ppc
8060                 where ppr.project_id = ppc.project_id
8061             and ppr.object_id = ppc.object_id
8062             and ppr.object_version_id = ppc.object_version_id
8063             and ppr.as_of_date = ppc.date_computed (+)
8064         and ppr.project_id = p_project_id
8065                 and ppr.object_id = p_object_id
8066                 -- and ppr.object_version_id = p_object_version_id
8067             and ppr.percent_complete_id = ppc.percent_complete_id
8068          and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8069          and ppr.structure_type = ppc.structure_type(+) -- FPM Dev CR 3
8070                 and ppr.as_of_date = (select max(ppc2.date_computed)
8071                                      from pa_percent_completes ppc2
8072                                      where ppc2.project_id = p_project_id
8073                                      and ppc2.object_id = p_object_id
8074                                       -- and ppc2.object_version_id = p_object_version_id
8075                      and ppc2.published_flag = 'Y'
8076                      and ppc2.current_flag = 'Y'
8077                          and ppc2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8078                      );
8079         l_act_rawcost_period := (nvl(l_c1rec.act_rawcost_to_date,0) - nvl(l_act_rawcost_pub,0));
8080     end if;
8081     close c1;
8082 
8083     if (l_act_rawcost_period < 0) then
8084         l_act_rawcost_period := 0;
8085     end if;
8086 
8087     return(l_act_rawcost_period);
8088 */
8089 
8090 /*        OPEN cur_rawcost_tc_this_period;
8091         FETCH cur_rawcost_tc_this_period INTO l_act_rawcost_period;
8092         IF cur_rawcost_tc_this_period%FOUND
8093         THEN
8094                 CLOSE cur_rawcost_tc_this_period;
8095                 RETURN l_act_rawcost_period;
8096         ELSE
8097                 CLOSE cur_rawcost_tc_this_period;
8098                 RETURN null;
8099         END IF;
8100 */
8101 
8102     open c_this_prog_rec;
8103     fetch c_this_prog_rec into l_act_rawcost_date;
8104     if c_this_prog_rec%notfound
8105     then
8106         close c_this_prog_rec;
8107         return 0;
8108     end if;
8109     close c_this_prog_rec;
8110 
8111     open c_prev_prog_rec;
8112     fetch c_prev_prog_rec into l_act_rawcost_pub;
8113     close c_prev_prog_rec;
8114 
8115 /*  commneted by maansari7/25
8116     open c_this_prog_rec;
8117     fetch c_this_prog_rec into l_act_rawcost_date;
8118     close c_this_prog_rec;
8119 */
8120     l_act_rawcost_period := (nvl(l_act_rawcost_date,0) - nvl(l_act_rawcost_pub,0));
8121 
8122     if (l_act_rawcost_period < 0) then
8123         l_act_rawcost_period := 0;
8124     end if;
8125 
8126     return(l_act_rawcost_period);
8127 
8128 END get_act_txn_rawcost_thisperiod;
8129 
8130 -- Progress Management Changes. Bug # 3621404.
8131 -- Bug 3879461 : This function is not used now.
8132 FUNCTION get_act_pfn_rawcost_thisperiod (p_as_of_date        IN     DATE
8133                                         ,p_project_id        IN     NUMBER
8134                                         ,p_object_id         IN     NUMBER
8135                                         ,p_object_version_id IN     NUMBER
8136     ,p_proj_element_id      IN     NUMBER := null /* Modified for IB4 Progress CR. */) return NUMBER
8137 IS
8138     l_act_rawcost_period        NUMBER := NULL;
8139     l_act_rawcost_date      NUMBER := NULL;
8140     l_act_rawcost_pub       NUMBER := NULL;
8141 
8142 /*
8143     cursor c1 is
8144          select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
8145             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
8146             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0)) act_rawcost_to_date
8147                 from pa_progress_rollup ppr
8148                 where ppr.project_id = p_project_id
8149                 and ppr.object_id = p_object_id
8150                 -- and ppr.object_version_id = p_object_version_id
8151     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
8152          and structure_type = 'WORKPLAN' -- FPM Dev CR 3
8153                 and ppr.as_of_date = (select max(ppr2.as_of_date)
8154                                      from pa_progress_rollup ppr2
8155                                      where ppr2.project_id = p_project_id
8156                                      and ppr2.object_id = p_object_id
8157                                      -- and ppr2.object_version_id = p_object_version_id
8158                      and structure_type = 'WORKPLAN' -- FPM Dev CR 3
8159                                      and ppr2.as_of_date > p_as_of_date
8160     and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR. );
8161     l_c1rec     c1%rowtype;
8162 */
8163 
8164     cursor c_prev_prog_rec is
8165          select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
8166             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
8167             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0)) act_rawcost_to_date
8168                 from pa_progress_rollup ppr
8169                 where ppr.project_id = p_project_id
8170                 and ppr.object_id = p_object_id
8171                 -- and ppr.object_version_id = p_object_version_id
8172             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8173         and ppr.structure_version_id is null -- Bug 3764224
8174             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
8175                 and ppr.as_of_date = (select max(ppr2.as_of_date)
8176                                      from pa_progress_rollup ppr2
8177                                      where ppr2.project_id = p_project_id
8178                                      and ppr2.object_id = p_object_id
8179                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8180                      and ppr2.structure_version_id is null -- Bug 3764224
8181                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
8182                                      and ppr2.as_of_date < p_as_of_date);
8183 
8184     cursor c_this_prog_rec is
8185          select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
8186             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
8187             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0)) act_rawcost_to_date
8188                 from pa_progress_rollup ppr
8189                 where ppr.project_id = p_project_id
8190                 and ppr.object_id = p_object_id
8191                 -- and ppr.object_version_id = p_object_version_id
8192             and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8193         and ppr.structure_version_id is null -- Bug 3764224
8194             and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
8195                 and ppr.as_of_date = (select max(ppr2.as_of_date)
8196                                      from pa_progress_rollup ppr2
8197                                      where ppr2.project_id = p_project_id
8198                                      and ppr2.object_id = p_object_id
8199                      and ppr2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8200                      and ppr2.structure_version_id is null -- Bug 3764224
8201                      and ppr2.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Bug 3764224
8202                                      and ppr2.as_of_date >= p_as_of_date);
8203 
8204 
8205 BEGIN
8206 
8207 -- Bug 3764224 : This function(_this_peiord) are used only in assignment cases. So it is safe to select from rollup table itself
8208 -- no need to go in percent complete table
8209 -- Bug 3764224 : RLM Changes : Commented the below code. This was not calculating the actual this period
8210 
8211 /*
8212     open c1;
8213     fetch c1 into l_c1rec;
8214     if c1%found then
8215         select (nvl(ppr.oth_act_rawcost_to_date_fc,0)+nvl(ppr.ppl_act_rawcost_to_date_fc,0)
8216             +nvl(ppr.eqpmt_act_rawcost_to_date_fc,0)+nvl(ppr.spj_oth_act_rawcost_to_date_fc,0)
8217             +nvl(ppr.subprj_ppl_act_rawcost_fc,0)+nvl(ppr.subprj_eqpmt_act_rawcost_fc,0))
8218                 into l_act_rawcost_pub
8219                 from pa_progress_rollup ppr,pa_percent_completes ppc
8220                 where ppr.project_id = ppc.project_id
8221             and ppr.object_id = ppc.object_id
8222             and ppr.object_version_id = ppc.object_version_id
8223             and ppr.as_of_date = ppc.date_computed (+)
8224         and ppr.project_id = p_project_id
8225                 and ppr.object_id = p_object_id
8226                 -- and ppr.object_version_id = p_object_version_id
8227     and ppr.proj_element_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
8228             and ppr.percent_complete_id = ppc.percent_complete_id
8229          and ppr.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8230          and ppr.structure_type = ppc.structure_type(+) -- FPM Dev CR 3
8231         and ppr.proj_element_id = ppc.task_id (+) -- Modified for IB4 Progress CR.
8232                 and ppr.as_of_date = (select max(ppc2.date_computed)
8233                                      from pa_percent_completes ppc2
8234                                      where ppc2.project_id = p_project_id
8235                                      and ppc2.object_id = p_object_id
8236                                      -- and ppc2.object_version_id = p_object_version_id
8237                      and ppc2.published_flag = 'Y'
8238                      and ppc2.current_flag = 'Y'
8239                          and ppc2.structure_type = 'WORKPLAN' -- FPM Dev CR 3
8240         and ppc2.task_id = nvl(p_proj_element_id, p_object_id) -- Modified for IB4 Progress CR.
8241                      );
8242         l_act_rawcost_period := (nvl(l_c1rec.act_rawcost_to_date,0) - nvl(l_act_rawcost_pub,0));
8243     end if;
8244     close c1;
8245 */
8246 
8247     open c_prev_prog_rec;
8248     fetch c_prev_prog_rec into l_act_rawcost_pub;
8249     close c_prev_prog_rec;
8250 
8251     open c_this_prog_rec;
8252     fetch c_this_prog_rec into l_act_rawcost_date;
8253     close c_this_prog_rec;
8254 
8255     l_act_rawcost_period := (nvl(l_act_rawcost_date,0) - nvl(l_act_rawcost_pub,0));
8256 
8257     if (l_act_rawcost_period < 0) then
8258         l_act_rawcost_period := 0;
8259     end if;
8260 
8261     return(l_act_rawcost_period);
8262 END get_act_pfn_rawcost_thisperiod;
8263 
8264 -- Bug 3621404 : Added Get_Res_Rate_Burden_Multiplier
8265 Procedure Get_Res_Rate_Burden_Multiplier(P_res_list_mem_id           IN  NUMBER
8266                                 ,P_project_id                        IN  NUMBER
8267                 ,P_task_id                      IN  NUMBER := null     --bug 3860575
8268                                 ,p_as_of_Date                   IN  DATE   := null     --bug 3901289
8269                                 --maansari6/14 bug 3686920
8270                                 ,p_structure_version_id              IN NUMBER   default null
8271                                 ,p_currency_code                     IN  VARCHAR2 default null
8272                                 --maansari6/14 bug 3686920
8273                                 ,p_init_msg_list                     IN  VARCHAR2        := FND_API.G_FALSE
8274                         ,p_calling_mode                      IN  VARCHAR2        := 'ACTUAL_RATES' -- Bug 3627315
8275                 --,P_dummy_override_raw_cost         IN  NUMBER Bug 3632946
8276                         --,P_override_txn_currency_code      IN  VARCHAR2 Bug 3632946
8277                         ,x_resource_curr_code                OUT NOCOPY VARCHAR2
8278                                 ,x_resource_raw_rate                 OUT NOCOPY NUMBER
8279                                 ,x_resource_burden_rate              OUT NOCOPY NUMBER
8280                         -- ,X_dummy_burden_cost              OUT NOCOPY NUMBER Bug 3632946
8281                         ,X_burden_multiplier                 OUT NOCOPY NUMBER
8282                                 ,x_return_status                     OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
8283                                 ,x_msg_count                         OUT  NOCOPY NUMBER --File.Sql.39 bug 4440895
8284                                 ,x_msg_data                          OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
8285                        )
8286 AS
8287 
8288    l_msg_count                      NUMBER :=0;
8289    l_data                           VARCHAR2(2000);
8290    l_msg_data                       VARCHAR2(2000);
8291    l_error_msg_code                 VARCHAR2(30);
8292    l_msg_index_out                  NUMBER;
8293    l_return_status                  VARCHAR2(2000);
8294    l_debug_mode                     VARCHAR2(30);
8295    -- added for Bug: 4537865
8296    l_new_msg_data           VARCHAR2(2000);
8297    -- added for Bug: 4537865
8298    l_resource_class_flag_tbl         SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
8299    l_resource_class_code_tbl         SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8300    l_resource_class_id_tbl           SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8301    l_res_type_code_tbl               SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8302    l_job_id_tbl                      SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8303    l_person_id_tbl                   SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8304    l_person_type_code_tbl            SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8305    l_named_role_tbl                  SYSTEM.PA_VARCHAR2_80_TBL_TYPE    := SYSTEM.PA_VARCHAR2_80_TBL_TYPE();
8306    l_bom_resource_id_tbl             SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8307    l_non_labor_resource_tbl          SYSTEM.PA_VARCHAR2_20_TBL_TYPE    := SYSTEM.PA_VARCHAR2_20_TBL_TYPE();
8308    l_inventory_item_id_tbl           SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8309    l_item_category_id_tbl            SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8310    l_project_role_id_tbl             SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8311    l_organization_id_tbl             SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8312    l_fc_res_type_code_tbl            SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8313    l_expenditure_type_tbl            SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8314    l_expenditure_category_tbl        SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8315    l_event_type_tbl                  SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8316    l_revenue_category_code_tbl       SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8317    l_supplier_id_tbl                 SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8318    l_unit_of_measure_tbl             SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8319    l_spread_curve_id_tbl             SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8320    l_etc_method_code_tbl             SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8321    l_mfc_cost_type_id_tbl            SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8322    l_procure_resource_flag_tbl       SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
8323    l_incurred_by_res_flag_tbl        SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
8324    l_Incur_by_res_class_code_tbl     SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8325    l_Incur_by_role_id_tbl            SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8326    l_org_id_tbl                      SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8327    l_rate_based_flag_tbl             SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
8328    l_rate_expenditure_type_tbl       SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8329    l_rate_func_curr_code_tbl         SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8330    l_rate_incurred_by_org_id_tbl     SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8331    l_resource_assignment_id_tbl      SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8332    l_assignment_description_tbl      SYSTEM.PA_VARCHAR2_240_TBL_TYPE   := SYSTEM.PA_VARCHAR2_240_TBL_TYPE();
8333    l_planning_resource_alias_tbl     SYSTEM.PA_VARCHAR2_80_TBL_TYPE    := SYSTEM.PA_VARCHAR2_80_TBL_TYPE();
8334    l_resource_name_tbl               SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8335    l_project_role_name_tbl           SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8336    l_organization_name_tbl           SYSTEM.PA_VARCHAR2_240_TBL_TYPE   := SYSTEM.PA_VARCHAR2_240_TBL_TYPE();
8337    l_financial_category_code_tbl     SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8338    l_project_assignment_id_tbl       SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8339    l_use_task_schedule_flag_tbl      SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
8340    l_planning_start_date_tbl         SYSTEM.PA_DATE_TBL_TYPE           := SYSTEM.PA_DATE_TBL_TYPE();
8341    l_planning_end_date_tbl           SYSTEM.PA_DATE_TBL_TYPE           := SYSTEM.PA_DATE_TBL_TYPE();
8342    l_total_quantity_tbl              SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8343    l_override_currency_code_tbl      SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8344    l_billable_percent_tbl            SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8345    l_cost_rate_override_tbl          SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8346    l_burdened_rate_override_tbl      SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
8347    l_sp_fixed_date_tbl               SYSTEM.PA_DATE_TBL_TYPE           := SYSTEM.PA_DATE_TBL_TYPE();
8348    l_financial_category_name_tbl     SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8349    l_supplier_name_tbl               SYSTEM.PA_VARCHAR2_240_TBL_TYPE   := SYSTEM.PA_VARCHAR2_240_TBL_TYPE();
8350    l_ATTRIBUTE_CATEGORY_tbl          SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
8351    l_ATTRIBUTE1_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8352    l_ATTRIBUTE2_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8353    l_ATTRIBUTE3_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8354    l_ATTRIBUTE4_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8355    l_ATTRIBUTE5_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8356    l_ATTRIBUTE6_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8357    l_ATTRIBUTE7_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8358    l_ATTRIBUTE8_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8359    l_ATTRIBUTE9_tbl                  SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8360    l_ATTRIBUTE10_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8361    l_ATTRIBUTE11_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8362    l_ATTRIBUTE12_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8363    l_ATTRIBUTE13_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8364    l_ATTRIBUTE14_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8365    l_ATTRIBUTE15_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8366    l_ATTRIBUTE16_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8367    l_ATTRIBUTE17_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8368    l_ATTRIBUTE18_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8369    l_ATTRIBUTE19_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8370    l_ATTRIBUTE20_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8371    l_ATTRIBUTE21_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8372    l_ATTRIBUTE22_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8373    l_ATTRIBUTE23_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8374    l_ATTRIBUTE24_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8375    l_ATTRIBUTE25_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8376    l_ATTRIBUTE26_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8377    l_ATTRIBUTE27_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8378    l_ATTRIBUTE28_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8379    l_ATTRIBUTE29_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8380    l_ATTRIBUTE30_tbl                 SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
8381   --End of variables for Variable for Resource Attributes
8382 
8383   l_task_id                          pa_tasks.task_id%TYPE := P_task_id;   --bug 3860575, Satish
8384   l_top_task_id                      pa_tasks.task_id%TYPE;
8385   l_bill_job_group_id                pa_projects_all.bill_job_group_id%TYPE;
8386   l_project_type                     pa_projects_all.project_type%TYPE;
8387   l_expenditure_type                 pa_resource_assignments.expenditure_type%TYPE;
8388   l_org_id                           pa_projects_all.org_id%TYPE;
8389   l_expenditure_OU                   pa_projects_all.org_id%TYPE;
8390   l_resource_class_code              pa_resource_assignments.resource_class_code%TYPE;
8391   l_non_labor_resource               pa_resource_assignments.non_labor_resource%TYPE;
8392   l_nlr_organization_id              pa_resource_assignments.organization_id%TYPE;
8393   l_rate_override_to_organz_id       pa_resource_assignments.organization_id%TYPE;
8394   l_rate_incurred_by_organz_id       pa_resource_assignments.organization_id%TYPE;
8395   l_inventory_item_id                pa_resource_assignments.inventory_item_id%TYPE;
8396   l_bom_resource_id                  pa_resource_assignments.bom_resource_id%TYPE;
8397   l_txn_currency_code_override       pa_fp_res_assignments_tmp.txn_currency_code_override%TYPE;
8398   l_cost_rate_multiplier             CONSTANT pa_labor_cost_multipliers.multiplier%TYPE := 1;
8399 --  l_burden_override_multiplier       pa_fp_res_assignments_tmp.b_multiplier_override%TYPE;
8400   l_burden_override_multiplier       Number;
8401   l_cost_override_rate               pa_fp_res_assignments_tmp.rw_cost_rate_override%TYPE;
8402   l_raw_cost                         pa_fp_res_assignments_tmp.txn_raw_cost%TYPE;
8403   -- added for Bug: 4537865
8404   l_new_raw_cost             pa_fp_res_assignments_tmp.txn_raw_cost%TYPE;
8405   -- added for Bug: 4537865
8406   l_raw_cost_rate                    pa_fp_res_assignments_tmp.raw_cost_rate%TYPE;
8407   l_burden_cost                      pa_fp_res_assignments_tmp.txn_burdened_cost%TYPE;
8408   l_mfc_cost_type_id                 pa_resource_assignments.mfc_cost_type_id%TYPE;
8409   l_mfc_cost_source                  CONSTANT NUMBER := 2;
8410   l_item_category_id                 pa_resource_assignments.item_category_id%TYPE;
8411   l_job_id                           pa_resource_assignments.job_id%TYPE;
8412   l_person_id                        pa_resource_list_members.person_id%TYPE;
8413 
8414  --Out variables
8415   l_trxn_curr_code                   varchar2(100);
8416   l_txn_raw_cost                     number;
8417   l_txn_cost_rate                    number;
8418   l_txn_burden_cost                  number;
8419   l_txn_burden_cost_rate             number;
8420   l_burden_multiplier                number;
8421   l_cost_ind_compiled_set_id         number;
8422   l_raw_cost_rejection_code          varchar2(1000);
8423   l_burden_cost_rejection_code       varchar2(1000);
8424   l_insufficient_paramters           EXCEPTION; -- Added to raised exception if any required paramter is missing for PA_COST1 api
8425   l_resource_alias                   pa_task_assignments_v.resource_alias%TYPE; -- Added if any required paramter is missing for PA_COST1 api
8426 
8427   l_null_above                       VARCHAR2(1) := 'N';  -- Added if any required paramter is miss ing for PA_COST1 api
8428 
8429   l_incur_by_res_type                SYSTEM.PA_VARCHAR2_30_TBL_TYPE; -- Bug # 3473324.
8430   g1_debug_mode                      VARCHAR2(1);
8431   l_res_list_memb_id_tbl             SYSTEM.PA_NUM_TBL_TYPE := SYSTEM.PA_NUM_TBL_TYPE()         ;
8432 
8433   l_plan_cost_burden_sch_id          NUMBER; -- Bug 3632946
8434 
8435 
8436   --maansari6/14 bug 3686920
8437   l_plan_cost_job_rate_sch_id        NUMBER;
8438   l_plan_cost_emp_rate_sch_id        NUMBER;
8439   l_plan_cost_nlr_rate_sch_id        NUMBER;
8440   l_fp_cols_rec                      PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
8441   l_plan_version_id                  NUMBER;
8442   l_res_class_sch_id                 NUMBER;
8443   --maansari6/14
8444 
8445   --amksingh 3686920
8446   l_calling_mode                     VARCHAR2(15);
8447   l_use_planning_rates_flag          VARCHAR2(1);
8448   --amksingh 3686920
8449 
8450 --bug 3733606
8451   l_unit_of_measure                  VARCHAR2(150);
8452   l_carrying_out_org_id              NUMBER;
8453   l_cost_res_class_rate_sch_id       NUMBER;
8454   l_revenue_rejection_code           VARCHAR2(30);
8455 
8456   l_bill_rate                        NUMBER;
8457   l_raw_revenue                      NUMBER;
8458   l_bill_markup_percentage           NUMBER;
8459   l_cost_markup_percentage           NUMBER;
8460   l_rev_txn_curr_code                VARCHAR2(120);
8461   -- Bug 3691289 : Added following two variables
8462   l_pl_res_class_raw_cost_sch_id        NUMBER;
8463   l_pl_cost_res_class_rate_sc_id       NUMBER;
8464 
8465   --bug# 3801523  Satish  start
8466   l_rate_based_flag                  VARCHAR2(1);
8467   l_burd_sch_cp_structure        VARCHAR2(1000);
8468   l_burd_sch_cost_base           VARCHAR2(1000);
8469   l_burd_sch_fixed_date          DATE;
8470   l_burd_sch_id                      NUMBER;
8471   l_burd_sch_rev_id          NUMBER;
8472   --bug# 3801523  Satish  end
8473 
8474 /*
8475   --bug 3821299
8476   CURSOR get_assignment_id( c_structure_version_id NUMBER, c_task_id NUMBER, c_resource_list_member_id NUMBER )
8477   IS
8478     SELECT resource_assignment_id
8479      FROM pa_task_assignments_v
8480     WHERE structure_version_id = c_structure_version_id
8481       AND task_id              = c_task_id
8482       AND resource_list_member_id = c_resource_list_member_id
8483      ;
8484 */
8485 
8486   CURSOR get_override_rate ( c_budget_version_id NUMBER, c_resource_assignment_id NUMBER )
8487   IS
8488    SELECT NVL(TXN_COST_RATE_OVERRIDE,TXN_STANDARD_COST_RATE) -- Bug 3951555, Added nvl and TXN_STANDARD_COST_RATE
8489       , nvl(BURDEN_COST_RATE_OVERRIDE, BURDEN_COST_RATE) -- Bug 3951555, Added nvl and BURDEN_COST_RATE
8490      FROM pa_budget_lines
8491     WHERE budget_version_id = c_budget_version_id
8492       AND resource_assignment_id = c_resource_assignment_id
8493       AND TXN_CURRENCY_CODE = p_currency_code
8494       AND p_as_of_date BETWEEN start_date and end_date
8495   ;
8496 
8497   ---- check override rates in pa_resource_assgn_rate (IPM changes)
8498   CURSOR get_asgn_override_rate ( c_budget_version_id NUMBER, c_resource_assignment_id NUMBER )
8499   IS                                                                                  SELECT TXN_RAW_COST_RATE_OVERRIDE, TXN_BURDEN_COST_RATE_OVERRIDE
8500      FROM pa_resource_asgn_curr                                                        WHERE budget_version_id = c_budget_version_id
8501       AND resource_assignment_id = c_resource_assignment_id                              AND TXN_CURRENCY_CODE = p_currency_code;
8502 
8503   l_resource_assignment_id     NUMBER;
8504   l_raw_override_rate          NUMBER := null;
8505   l_burden_override_rate       NUMBER := null;
8506   l_asgn_raw_override_rate     NUMBER := null;  ---IPM changes
8507   l_asgn_burden_override_rate  NUMBER := null;  ---IPM changes
8508   l_etc_flag                   VARCHAR2(1) := 'N';
8509   --bug 3821299
8510 
8511   -- Bug 3965584 Begin
8512   CURSOR c_get_assgn_details(c_project_id NUMBER, c_task_id NUMBER, c_structure_version_id NUMBER, c_resource_list_member_id NUMBER)
8513   IS
8514   SELECT pra.person_id,
8515         pra.resource_class_code,
8516         pra.expenditure_type,
8517         pra.rate_expenditure_type,
8518         pra.RATE_EXPENDITURE_ORG_ID,
8519         pra.non_labor_resource,
8520         pra.organization_id,
8521         pra.bom_resource_id,
8522         pra.inventory_item_id,
8523         pra.mfc_cost_type_id,
8524         pra.item_category_id,
8525         pra.job_id,
8526         pra.unit_of_measure,
8527         pra.rate_based_flag,
8528         pra.resource_assignment_id,
8529         rlm.alias
8530   FROM pa_resource_assignments pra,  ----pa_task_assignments_v  4871809
8531        pa_budget_versions pbv,
8532        pa_resource_list_members rlm
8533   WHERE pbv.project_structure_version_id  = c_structure_version_id
8534   AND pbv.budget_version_id = pra.budget_version_id
8535   AND pra.task_id           = c_task_id
8536   AND pra.resource_list_member_id   = c_resource_list_member_id
8537   AND pra.project_id        = c_project_id
8538   AND pra.resource_list_member_id = rlm.resource_list_member_id
8539     ;
8540   l_assgn_rec   c_get_assgn_details%ROWTYPE;
8541   -- Bug 3965584 End
8542 
8543 
8544 
8545 Begin
8546 
8547     l_return_status := FND_API.G_RET_STS_SUCCESS ;
8548     -- FPM Dev CR 8 : Added debug messages
8549     g1_debug_mode := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
8550 
8551         IF FND_API.TO_BOOLEAN(NVL(p_init_msg_list,FND_API.G_FALSE)) THEN -- Added for required prarameter validation
8552              FND_MSG_PUB.initialize;
8553         END IF;
8554 
8555 
8556     -- Bug 3691289 Added condtion to return if no res list mem id
8557     IF P_res_list_mem_id IS NULL THEN
8558         -- As per Clint Effort to Cost Conversion should not happen if planned effort is not entered at task(which means
8559         -- hiden assignment does not exists)
8560         return;
8561     END IF;
8562 
8563 
8564 
8565     -- Bug 3965584 Begin
8566     -- Get the values from Task assignment.
8567 
8568     OPEN c_get_assgn_details(p_project_id, p_task_id, p_structure_version_id, P_res_list_mem_id);
8569     FETCH c_get_assgn_details INTO l_assgn_rec;
8570     CLOSE c_get_assgn_details;
8571 
8572     l_person_id             := l_assgn_rec.person_id;
8573     l_resource_class_code           := l_assgn_rec.resource_class_code;
8574     l_expenditure_type          := nvl(l_assgn_rec.expenditure_type, l_assgn_rec.rate_expenditure_type);
8575     l_expenditure_ou            := l_assgn_rec.RATE_EXPENDITURE_ORG_ID;
8576     l_org_id                := null;
8577     l_non_labor_resource            := l_assgn_rec.non_labor_resource;
8578     l_nlr_organization_id           := l_assgn_rec.organization_id;
8579     l_rate_incurred_by_organz_id        := l_assgn_rec.organization_id;
8580     l_bom_resource_id           := l_assgn_rec.bom_resource_id;
8581     l_inventory_item_id         := l_assgn_rec.inventory_item_id;
8582     l_txn_currency_code_override        := null;
8583     l_cost_override_rate            := null;
8584     l_mfc_cost_type_id          := l_assgn_rec.mfc_cost_type_id;
8585     l_item_category_id          := l_assgn_rec.item_category_id;
8586     l_job_id                := l_assgn_rec.job_id;
8587     l_unit_of_measure           := l_assgn_rec.unit_of_measure;
8588     l_rate_based_flag           := l_assgn_rec.rate_based_flag;
8589     l_resource_assignment_id        := l_assgn_rec.resource_assignment_id;
8590         l_resource_alias                        := l_assgn_rec.alias;
8591 
8592     IF g1_debug_mode  = 'Y' THEN
8593         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'Values retrived from pa_task_assignments_v', x_Log_Level=> 3);
8594         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_person_id='||l_person_id, x_Log_Level=> 3);
8595         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_resource_class_code='||l_resource_class_code, x_Log_Level=> 3);
8596         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_expenditure_type='||l_expenditure_type, x_Log_Level=> 3);
8597         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_expenditure_ou='||l_expenditure_ou, x_Log_Level=> 3);
8598         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_org_id='||l_org_id, x_Log_Level=> 3);
8599         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_non_labor_resource='||l_non_labor_resource, x_Log_Level=> 3);
8600         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_nlr_organization_id='||l_nlr_organization_id, x_Log_Level=> 3);
8601         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_rate_incurred_by_organz_id='||l_rate_incurred_by_organz_id, x_Log_Level=> 3);
8602         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_bom_resource_id='||l_bom_resource_id, x_Log_Level=> 3);
8603         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_inventory_item_id='||l_inventory_item_id, x_Log_Level=> 3);
8604         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_txn_currency_code_override='||l_txn_currency_code_override, x_Log_Level=> 3);
8605         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_cost_override_rate='||l_cost_override_rate, x_Log_Level=> 3);
8606         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_mfc_cost_type_id='||l_mfc_cost_type_id, x_Log_Level=> 3);
8607         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_item_category_id='||l_item_category_id, x_Log_Level=> 3);
8608         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_job_id='||l_job_id, x_Log_Level=> 3);
8609         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_unit_of_measure='||l_unit_of_measure, x_Log_Level=> 3);
8610         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_rate_based_flag='||l_rate_based_flag, x_Log_Level=> 3);
8611         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_unit_of_measure='||l_unit_of_measure, x_Log_Level=> 3);
8612         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_resource_assignment_id='||l_resource_assignment_id, x_Log_Level=> 3);
8613     END IF;
8614 
8615 
8616     -- Bug 3965584 End
8617 
8618 
8619 
8620     -- If any values are not there at assignment level, then get it using resourse defaults
8621 
8622     l_res_list_memb_id_tbl.extend(1);
8623     l_res_list_memb_id_tbl(1)       := P_res_list_mem_id;
8624     l_calling_mode := p_calling_mode;
8625 
8626     BEGIN
8627             IF g1_debug_mode  = 'Y' THEN
8628                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'Calling get_resource_defaults', x_Log_Level=> 3);
8629                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_task_id '||l_task_id, x_Log_Level=> 3);
8630             END IF;
8631         PA_PLANNING_RESOURCE_UTILS.get_resource_defaults(
8632           p_resource_list_members        =>  l_res_list_memb_id_tbl,
8633           p_project_id                   =>  p_project_id,
8634           x_resource_class_flag          =>  l_resource_class_flag_tbl,
8635           x_resource_class_code          =>  l_resource_class_code_tbl,
8636           x_resource_class_id            =>  l_resource_class_id_tbl,
8637           x_res_type_code                =>  l_res_type_code_tbl,
8638           x_person_id                    =>  l_person_id_tbl,
8639           x_job_id                       =>  l_job_id_tbl,
8640           x_person_type_code             =>  l_person_type_code_tbl,
8641           x_named_role                   =>  l_named_role_tbl,
8642           x_bom_resource_id              =>  l_bom_resource_id_tbl,
8643           x_non_labor_resource           =>  l_non_labor_resource_tbl,
8644           x_inventory_item_id            =>  l_inventory_item_id_tbl,
8645           x_item_category_id             =>  l_item_category_id_tbl,
8646           x_project_role_id              =>  l_project_role_id_tbl,
8647           x_organization_id              =>  l_organization_id_tbl,
8648           x_fc_res_type_code             =>  l_fc_res_type_code_tbl,
8649           x_expenditure_type             =>  l_expenditure_type_tbl,
8650           x_expenditure_category         =>  l_expenditure_category_tbl,
8651           x_event_type                   =>  l_event_type_tbl,
8652           x_revenue_category_code        =>  l_revenue_category_code_tbl,
8653           x_supplier_id                  =>  l_supplier_id_tbl,
8654           x_unit_of_measure              =>  l_unit_of_measure_tbl,
8655           x_spread_curve_id              =>  l_spread_curve_id_tbl,
8656           x_etc_method_code              =>  l_etc_method_code_tbl,
8657           x_mfc_cost_type_id             =>  l_mfc_cost_type_id_tbl,
8658           x_incurred_by_res_flag         =>  l_incurred_by_res_flag_tbl,
8659           x_incur_by_res_class_code      =>  l_incur_by_res_class_code_tbl,
8660           x_Incur_by_role_id             =>  l_Incur_by_role_id_tbl,
8661           x_org_id                       =>  l_org_id_tbl,
8662           X_rate_based_flag              =>  l_rate_based_flag_tbl,
8663           x_rate_expenditure_type        =>  l_rate_expenditure_type_tbl,
8664           x_rate_func_curr_code          =>  l_rate_func_curr_code_tbl,
8665           X_incur_by_res_type        =>  l_incur_by_res_type, -- Bug # 3473324 changes.
8666           x_msg_data                     =>  l_msg_data,
8667           x_msg_count                    =>  l_msg_count,
8668           x_return_status                =>  l_return_status);
8669 
8670     EXCEPTION
8671           WHEN OTHERS THEN
8672            fnd_msg_pub.add_exc_msg(p_pkg_name       => 'pa_progress_utils',
8673                                    p_procedure_name => 'Get_Res_Rate_Burden_Multiplier',
8674                                    p_error_text     => SUBSTRB('pa_planning_resource_utils.get_resource_defaults:'||SQLERRM,1,120));
8675             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_error_text='||SUBSTRB('pa_planning_resource_utils.get_resource_defaults:'||SQLERRM,1,120), x_Log_Level=> 3);
8676             raise fnd_api.g_exc_error;
8677     END;
8678 
8679     -- IF l_return_status =  FND_API.G_RET_STS_SUCCESS THEN  --------------------------------{
8680     FOR i IN l_res_list_memb_id_tbl.FIRST .. l_res_list_memb_id_tbl.LAST LOOP
8681 
8682         -- Bug 3965584 : Values will be taken only if they are not presnt already
8683         IF l_person_id IS NULL THEN
8684             IF l_person_id_tbl.EXISTS(i) AND l_person_id_tbl(i) is not null THEN
8685              l_person_id := l_person_id_tbl(i);
8686             ELSE
8687              l_person_id := null;
8688             END IF;
8689         END IF;
8690 
8691         IF l_resource_class_code IS NULL THEN
8692             IF l_resource_class_code_tbl.EXISTS(i) AND l_resource_class_code_tbl(i) is not null THEN
8693              l_resource_class_code := l_resource_class_code_tbl(i);
8694             ELSE
8695              l_resource_class_code := null;
8696             END IF;
8697             END IF;
8698 
8699             IF l_expenditure_type IS NULL THEN
8700         IF l_expenditure_type_tbl.EXISTS(i) and l_expenditure_type_tbl(i) is not null THEN
8701             l_expenditure_type := l_expenditure_type_tbl(i);
8702         ELSE
8703             IF l_rate_expenditure_type_tbl.EXISTS(i) THEN
8704                 l_expenditure_type := l_rate_expenditure_type_tbl(i);
8705             ELSE
8706                 l_expenditure_type := null;
8707             END IF;
8708         END IF;
8709         END IF;
8710 
8711         --bug# 3819400 Satish start
8712             /*IF l_rate_incurred_by_org_id_tbl.EXISTS(i) and l_rate_incurred_by_org_id_tbl(i) is not null THEN
8713                 l_expenditure_OU := l_rate_incurred_by_org_id_tbl(i);
8714             ELSE
8715                 l_expenditure_OU := null;
8716             END IF;*/
8717 
8718         /* bug 3823945
8719             IF l_organization_id_tbl.EXISTS(i) and l_organization_id_tbl(i) is not null THEN
8720                 l_expenditure_OU := l_organization_id_tbl(i);
8721             ELSE
8722                 l_expenditure_OU := null;
8723             END IF;
8724         */
8725         --bug# 3819400 Satish end
8726 
8727         -- bug 3823945
8728         IF l_expenditure_OU  IS NULL THEN
8729             IF l_org_id_tbl.EXISTS(i) and l_org_id_tbl(i) is not null THEN
8730             l_expenditure_OU := l_org_id_tbl(i);
8731             ELSE
8732             l_expenditure_OU := null;
8733             END IF;
8734         END IF;
8735         -- bug 3823945
8736 
8737         IF l_org_id  IS NULL THEN
8738             IF l_org_id_tbl.EXISTS(i) and l_org_id_tbl(i) is not null THEN
8739             l_org_id := l_org_id_tbl(i);
8740             ELSE
8741             l_org_id := null;
8742             END IF;
8743         END IF;
8744 
8745         IF l_non_labor_resource  IS NULL THEN
8746             IF l_non_labor_resource_tbl.EXISTS(i) and l_non_labor_resource_tbl(i) is not null THEN
8747             l_non_labor_resource := l_non_labor_resource_tbl(i);
8748             ELSE
8749             l_non_labor_resource := null;
8750             END IF;
8751         END IF;
8752 
8753         IF l_nlr_organization_id  IS NULL THEN
8754             IF l_organization_id_tbl.EXISTS(i) and l_organization_id_tbl(i) is not null THEN
8755              l_nlr_organization_id := l_organization_id_tbl(i);
8756             ELSE
8757              l_nlr_organization_id := null;
8758             END IF;
8759             END IF;
8760 
8761         IF l_rate_incurred_by_organz_id  IS NULL THEN
8762             IF l_rate_incurred_by_org_id_tbl.EXISTS(i) and l_rate_incurred_by_org_id_tbl(i) is not null THEN
8763              --l_rate_incurred_by_organz_id := l_rate_incurred_by_org_id_tbl(i);
8764              l_rate_incurred_by_organz_id := l_organization_id_tbl(i);  --bug 3901289
8765             ELSE
8766              l_rate_incurred_by_organz_id := null;
8767             END IF;
8768             END IF;
8769 
8770         IF l_bom_resource_id  IS NULL THEN
8771             IF l_bom_resource_id_tbl.EXISTS(i) and l_bom_resource_id_tbl(i) is not null THEN
8772               l_bom_resource_id := l_bom_resource_id_tbl(i);
8773             ELSE
8774               l_bom_resource_id := null;
8775             END IF;
8776             END IF;
8777 
8778         IF l_inventory_item_id  IS NULL THEN
8779             IF l_inventory_item_id_tbl.EXISTS(i) and l_inventory_item_id_tbl(i) is not null THEN
8780             l_inventory_item_id := l_inventory_item_id_tbl(i);
8781             ELSE
8782             l_inventory_item_id := null;
8783             END IF;
8784             END IF;
8785 
8786         -- Bug 3965584 : Not required
8787             --IF l_override_currency_code_tbl.EXISTS(i) and l_override_currency_code_tbl(i) is not null THEN
8788             --    l_txn_currency_code_override := l_override_currency_code_tbl(i);
8789             --ELSE
8790             --    l_txn_currency_code_override := null;
8791             --END IF;
8792 
8793         -- Bug 3965584 : Not required
8794             --IF l_cost_rate_override_tbl.EXISTS(i) and l_cost_rate_override_tbl(i) is not null THEN
8795             --    l_cost_override_rate := l_cost_rate_override_tbl(i);
8796             --ELSE
8797             --    l_cost_override_rate := null;
8798             --END IF;
8799 
8800         IF l_mfc_cost_type_id  IS NULL THEN
8801             IF l_mfc_cost_type_id_tbl.EXISTS(i) and l_mfc_cost_type_id_tbl(i) is not null THEN
8802             l_mfc_cost_type_id := l_mfc_cost_type_id_tbl(i);
8803             ELSE
8804             l_mfc_cost_type_id := null;
8805             END IF;
8806             END IF;
8807 
8808         IF l_item_category_id  IS NULL THEN
8809             IF l_item_category_id_tbl.EXISTS(i) and l_item_category_id_tbl(i) is not null THEN
8810             l_item_category_id := l_item_category_id_tbl(i);
8811             ELSE
8812             l_item_category_id := null;
8813             END IF;
8814             END IF;
8815 
8816         IF l_job_id  IS NULL THEN
8817             IF l_job_id_tbl.EXISTS(i) and l_job_id_tbl(i) is not null THEN
8818             l_job_id := l_job_id_tbl(i);
8819             ELSE
8820             l_job_id := null;
8821             END IF;
8822             END IF;
8823 
8824         IF l_rate_based_flag  IS NULL THEN
8825             IF l_rate_based_flag_tbl.EXISTS(i) and l_rate_based_flag_tbl(i) is not null THEN
8826             l_rate_based_flag := l_rate_based_flag_tbl(i);
8827             ELSE
8828             l_rate_based_flag := null;
8829             END IF;
8830             END IF;
8831         --bug 3733606
8832 
8833         IF l_unit_of_measure  IS NULL THEN
8834             IF l_unit_of_measure_tbl.EXISTS(i) and l_unit_of_measure_tbl(i) is not null THEN
8835             l_unit_of_measure := l_unit_of_measure_tbl(i);
8836             ELSE
8837             l_unit_of_measure := null;
8838             END IF;
8839             END IF;
8840     END LOOP; -- Bug 3965584 : Reduced the scope of FOR LOOP
8841 
8842     IF g1_debug_mode  = 'Y' THEN
8843         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'Values retrived from get_res_defaults', x_Log_Level=> 3);
8844         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_person_id='||l_person_id, x_Log_Level=> 3);
8845         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_resource_class_code='||l_resource_class_code, x_Log_Level=> 3);
8846         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_expenditure_type='||l_expenditure_type, x_Log_Level=> 3);
8847         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_expenditure_ou='||l_expenditure_ou, x_Log_Level=> 3);
8848         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_org_id='||l_org_id, x_Log_Level=> 3);
8849         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_non_labor_resource='||l_non_labor_resource, x_Log_Level=> 3);
8850         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_nlr_organization_id='||l_nlr_organization_id, x_Log_Level=> 3);
8851         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_rate_incurred_by_organz_id='||l_rate_incurred_by_organz_id, x_Log_Level=> 3);
8852         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_bom_resource_id='||l_bom_resource_id, x_Log_Level=> 3);
8853         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_inventory_item_id='||l_inventory_item_id, x_Log_Level=> 3);
8854         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_txn_currency_code_override='||l_txn_currency_code_override, x_Log_Level=> 3);
8855         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_cost_override_rate='||l_cost_override_rate, x_Log_Level=> 3);
8856         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_mfc_cost_type_id='||l_mfc_cost_type_id, x_Log_Level=> 3);
8857         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_item_category_id='||l_item_category_id, x_Log_Level=> 3);
8858         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_job_id='||l_job_id, x_Log_Level=> 3);
8859         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_unit_of_measure='||l_unit_of_measure, x_Log_Level=> 3);
8860         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_rate_based_flag='||l_rate_based_flag, x_Log_Level=> 3);
8861         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_unit_of_measure='||l_unit_of_measure, x_Log_Level=> 3);
8862         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_resource_assignment_id='||l_resource_assignment_id, x_Log_Level=> 3);
8863     END IF;
8864 
8865     --bug 3821299
8866     IF p_calling_mode = 'PLAN_RATES' THEN
8867         l_etc_flag := 'Y';
8868     END IF;
8869     --bug 3821299
8870 
8871 
8872 
8873         /* Select the project Type */
8874         SELECT project_type, carrying_out_organization_id
8875         INTO   l_project_type, l_carrying_out_org_id
8876         FROM   pa_projects_all
8877         WHERE  project_id = p_project_id;
8878 
8879 
8880     /* Select the resource name  TO BE CHECKED
8881     BEGIN
8882         SELECT resource_alias
8883         INTO   l_resource_alias
8884         FROM   pa_task_assignments_v
8885         WHERE  resource_list_member_id = l_BOM_resource_id
8886         AND project_id = p_project_id; -- Modifications for Bug # 3688902.
8887     EXCEPTION
8888         WHEN NO_DATA_FOUND THEN
8889             NULL;
8890         WHEN OTHERS THEN
8891             NULL;
8892     END;
8893         */
8894     --bug 3860575 start
8895     /*-- FPM Dev CR 5 Begin
8896      BEGIN
8897          SELECT task_id
8898          INTO   l_task_id
8899          FROM   pa_task_assignments_v
8900          WHERE  resource_list_member_id = l_res_list_memb_id_tbl(i)
8901          AND project_id = p_project_id ;
8902     EXCEPTION
8903         WHEN NO_DATA_FOUND THEN
8904             NULL;
8905         WHEN OTHERS THEN
8906             NULL;
8907     END;
8908     -- FPM Dev CR 5 End*/
8909 
8910     --bug 3860575 end
8911 
8912     -- FPM Dev CR 5
8913     IF upper(l_resource_class_code) = 'PEOPLE' AND l_rate_override_to_organz_id IS NULL AND l_person_id is NOT NULL THEN
8914         --l_rate_override_to_organz_id := l_nlr_organization_id;
8915         l_rate_override_to_organz_id := null;  --bug 3901289
8916     END IF;
8917 
8918     /* Calling the  Api to get the Burden/Raw Rate */
8919     --bug# 3801523  moved this begin below.
8920     --Begin
8921 
8922     --maansari6/14   bug 3686920
8923     -- amksingh
8924     -- 3686920 : using l_use_planning_rates_flag to call the API GET_PLAN_VERSION_DTLS
8925     -- also when l_use_planning_rates_flag is N then we should be using ACTUAL RATES so passing ACTUAL_RATES
8926     -- to costing API
8927     -- We should not be calling Get_Default_Sch_Ids as it will not retun actual values
8928     -- If at all we need this, then we should get this value from pa_tasks and then from pa_projects
8929     --bug 3733606 moved from below
8930 
8931     BEGIN
8932         l_plan_version_id := Pa_Fp_wp_gen_amt_utils.get_wp_version_id(
8933                     p_project_id => p_project_id,
8934                     p_plan_type_id => -1,
8935                         p_proj_str_ver_id => p_structure_version_id);
8936 
8937         -- Selecting res_class_raw_cost_sch_id here as it is not available in FP rec type
8938         SELECT use_planning_rates_flag,res_class_raw_cost_sch_id INTO l_use_planning_rates_flag, l_pl_res_class_raw_cost_sch_id
8939         FROM pa_proj_fp_options
8940         WHERE fin_plan_version_id = l_plan_version_id
8941         AND project_id = p_project_id;
8942 
8943     EXCEPTION
8944         WHEN OTHERS THEN
8945             fnd_msg_pub.add_exc_msg(p_pkg_name       => 'pa_progress_utils',
8946                                p_procedure_name => 'Get_Res_Rate_Burden_Multiplier',
8947                                p_error_text     => SUBSTRB('Pa_Fp_wp_gen_amt_utils.get_wp_version_id:'||SQLERRM,1,120));
8948             pa_debug.write(x_Module=>'Pa_Fp_wp_gen_amt_utils.get_wp_version_id', x_Msg => 'p_error_text='||SUBSTRB('PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS:'||SQLERRM,1,120), x_Log_Level=> 3);
8949             raise fnd_api.g_exc_error;
8950     END;
8951 
8952     -- Bug 3691289 , rates from pa_proj_fp_options shd be selected always as we need them further even in actual rate mode
8953     --   IF p_calling_mode = 'PLAN_RATES'
8954     --   THEN
8955     -- Bug 4233420 : Moved the logic of getting rates from budget_lines up in the code here.
8956     IF l_etc_flag = 'Y' THEN
8957         IF g1_debug_mode  = 'Y' THEN
8958             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_etc_flag is Y' , x_Log_Level=> 3);
8959             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_plan_version_id='||l_plan_version_id, x_Log_Level=> 3);
8960             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_resource_assignment_id='||l_resource_assignment_id, x_Log_Level=> 3);
8961         END IF;
8962 
8963         OPEN get_override_rate(l_plan_version_id, l_resource_assignment_id);
8964         FETCH get_override_rate INTO l_raw_override_rate, l_burden_override_rate;
8965         CLOSE get_override_rate;
8966 
8967         --- IPM changes
8968         OPEN get_asgn_override_rate(l_plan_version_id, l_resource_assignment_id);
8969         FETCH get_asgn_override_rate INTO l_asgn_raw_override_rate, l_asgn_burden_override_rate;
8970         CLOSE get_asgn_override_rate;
8971 
8972         IF g1_debug_mode  = 'Y' THEN
8973             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_raw_override_rate='||l_raw_override_rate, x_Log_Level=> 3);
8974             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_burden_override_rate='||l_burden_override_rate, x_Log_Level=> 3);
8975         END IF;
8976 
8977         --- IPM changes
8978         IF l_raw_override_rate IS NOT NULL THEN
8979               x_resource_raw_rate := l_raw_override_rate;
8980         ELSIF l_asgn_raw_override_rate IS NOT NULL THEN
8981               x_resource_raw_rate := l_asgn_raw_override_rate;
8982         END IF;
8983 
8984         IF l_burden_override_rate IS NOT NULL THEN
8985                x_resource_burden_rate := l_burden_override_rate;
8986                x_burden_multiplier := (l_burden_override_rate - 1); -- only for non rate based assignments.
8987         ELSIF l_asgn_burden_override_rate IS NOT NULL THEN
8988                x_resource_burden_rate := l_asgn_burden_override_rate;
8989                x_burden_multiplier := (l_asgn_burden_override_rate -1);---only for non rate based assignments.
8990         END IF;
8991 
8992         x_resource_curr_code := p_currency_code;
8993 
8994         -- NOTE: The reason that we are setting: x_burden_multiplier := (l_burden_multiplier - 1) and passing this
8995         -- value to the calling API, when a non-rate based resource has an override burden rate is because of the
8996         -- following:
8997         -- The calling API uses the formula: etc burden cost = etc raw cost * (x_burden_multiplier + 1) to calculate
8998         -- the value of etc burden cost.
8999         -- For a non-rate based resource without any override burden rate the burden multiplier is derived from the
9000         -- burden schedule and the above formula holds good.
9001         -- However, when a non-rate based resource has an override burden rate we should calculate the the value of
9002         -- etc burden cost as: etc burden cost = etc raw cost * override burden rate. Hence, we pass back:
9003         -- x_burden_multiplier = (override burden rate - 1) through our above code to the calling API so that the
9004         -- formula: etc raw cost * (x_burden_multiplier + 1) in the calling API equates to:
9005         -- etc raw cost * override burden rate.
9006     END IF;  -- l_etc_flag = 'Y'
9007 
9008     IF l_rate_based_flag = 'Y' THEN
9009         IF x_resource_raw_rate IS NOT NULL AND x_resource_burden_rate IS NOT NULL THEN
9010             return;
9011         END IF;
9012     ELSE
9013         IF x_burden_multiplier IS NOT NULL THEN
9014             return;
9015         END IF;
9016     END IF;
9017 
9018 
9019     BEGIN
9020         --     IF l_use_planning_rates_flag = 'Y' THEN
9021         PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS(
9022               P_PROJECT_ID                     => p_project_id,
9023               P_BUDGET_VERSION_ID              => l_plan_version_id,
9024               X_FP_COLS_REC                    => l_fp_cols_rec,
9025               X_RETURN_STATUS                  => l_return_status,
9026               X_MSG_COUNT                      => l_msg_count,
9027               X_MSG_DATA                       => l_msg_data);
9028 
9029 
9030         l_plan_cost_burden_sch_id       := l_fp_cols_rec.X_BURDEN_RATE_SCH_ID;
9031         l_plan_cost_job_rate_sch_id     := l_fp_cols_rec.X_COST_JOB_RATE_SCH_ID;
9032         l_plan_cost_emp_rate_sch_id     := l_fp_cols_rec.X_COST_EMP_RATE_SCH_ID;
9033         l_plan_cost_nlr_rate_sch_id     := l_fp_cols_rec.X_CNON_LABOR_RES_RATE_SCH_ID;
9034         --    l_pl_res_class_raw_cost_sch_id  := l_fp_cols_rec.x_fp_res_cl_raw_cost_sch_id;
9035         l_pl_cost_res_class_rate_sc_id := l_fp_cols_rec.X_cost_res_class_rate_sch_id;
9036 
9037         IF l_use_planning_rates_flag = 'Y' THEN
9038             l_cost_res_class_rate_sch_id := l_pl_cost_res_class_rate_sc_id;
9039         ELSE
9040             l_cost_res_class_rate_sch_id := l_pl_res_class_raw_cost_sch_id;
9041         END IF;
9042 
9043     EXCEPTION when others then
9044         fnd_msg_pub.add_exc_msg(p_pkg_name       => 'pa_progress_utils',
9045                                p_procedure_name => 'Get_Res_Rate_Burden_Multiplier',
9046                                p_error_text     => SUBSTRB('PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS:'||SQLERRM,1,120));
9047         pa_debug.write(x_Module=>'PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS', x_Msg => 'p_error_text='||SUBSTRB('PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS:'||SQLERRM,1,120), x_Log_Level=> 3);
9048         raise fnd_api.g_exc_error;
9049     END;
9050 
9051     IF  l_return_status <> 'S' AND l_msg_data IS NOT NULL   THEN
9052             PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
9053                              p_msg_name       => l_msg_data);
9054             x_msg_data := l_msg_data;
9055             x_return_status := 'E';
9056             x_msg_count := fnd_msg_pub.count_msg;
9057             RAISE  FND_API.G_EXC_ERROR;
9058     END IF;
9059 
9060 
9061     --   END IF;   --<< p_calling_modfe = 'PLAN_RATES'
9062 
9063 
9064     IF NVL(l_use_planning_rates_flag,'N') = 'N' THEN
9065         l_calling_mode := 'ACTUAL_RATES';
9066     ELSE
9067         l_calling_mode := p_calling_mode;
9068     END IF;
9069 
9070     -- Bug 3691289 : Added below condition so that planning rates are not passed to the API if mode is actual rates
9071     IF l_calling_mode = 'ACTUAL_RATES' THEN
9072           l_plan_cost_burden_sch_id      := null;
9073           l_plan_cost_job_rate_sch_id    := null;
9074           l_plan_cost_emp_rate_sch_id    := null;
9075           l_plan_cost_nlr_rate_sch_id    := null;
9076     END IF;
9077 
9078     --bug# 3801523 If cost based assignments then call Get_burden_sch_details  Satish start
9079 
9080     IF g1_debug_mode  = 'Y' THEN
9081         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_rate_based_flag :'||l_rate_based_flag, x_Log_Level=> 3);
9082     END IF;
9083 
9084     IF l_rate_based_flag = 'Y' THEN
9085     --maansari6/14
9086             IF g1_debug_mode  = 'Y' THEN
9087             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'Calling Get_Plan_Actual_Cost_Rates', x_Log_Level=> 3);
9088             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_calling_mode='||l_calling_mode, x_Log_Level=> 3);
9089             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_project_type='||l_project_type, x_Log_Level=> 3);
9090             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_project_id='||p_project_id, x_Log_Level=> 3);
9091             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_task_id='||to_number(null), x_Log_Level=> 3);
9092             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_top_task_id='||l_top_task_id, x_Log_Level=> 3);
9093             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_Exp_item_date='||sysdate, x_Log_Level=> 3);
9094             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_as_of_date='||p_as_of_date, x_Log_Level=> 3);   --
9095             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_expenditure_type='||l_expenditure_type, x_Log_Level=> 3);
9096             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_expenditure_OU='||l_expenditure_OU, x_Log_Level=> 3);
9097             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_project_OU='||l_org_id, x_Log_Level=> 3);
9098             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_Quantity='||1, x_Log_Level=> 3);
9099             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_resource_class='||l_resource_class_code, x_Log_Level=> 3);
9100             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_person_id='||l_person_id, x_Log_Level=> 3);
9101             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_non_labor_resource='||l_non_labor_resource, x_Log_Level=> 3);
9102             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_NLR_organization_id='||l_nlr_organization_id, x_Log_Level=> 3);
9103             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_override_organization_id='||l_rate_override_to_organz_id, x_Log_Level=> 3);
9104             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_incurred_by_organization_id='||l_rate_incurred_by_organz_id, x_Log_Level=> 3);
9105             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_inventory_item_id='||l_inventory_item_id, x_Log_Level=> 3);
9106             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_BOM_resource_id='||l_BOM_resource_id, x_Log_Level=> 3);
9107             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_override_trxn_curr_code='||l_txn_currency_code_override, x_Log_Level=> 3);
9108             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_override_burden_cost_rate='||l_burden_override_multiplier, x_Log_Level=> 3);
9109             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_override_trxn_cost_rate='||l_cost_override_rate, x_Log_Level=> 3);
9110             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_override_trxn_raw_cost='||l_raw_cost, x_Log_Level=> 3);
9111             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_override_trxn_burden_cost='||l_burden_cost, x_Log_Level=> 3);
9112             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_mfc_cost_type_id='||l_mfc_cost_type_id, x_Log_Level=> 3);
9113             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_mfc_cost_source='||l_mfc_cost_source, x_Log_Level=> 3);
9114             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_item_category_id='||l_item_category_id, x_Log_Level=> 3);
9115             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_plan_cost_burden_sch_id='||l_plan_cost_burden_sch_id, x_Log_Level=> 3);
9116             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_plan_cost_job_rate_sch_id='||l_plan_cost_job_rate_sch_id, x_Log_Level=> 3);
9117             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_plan_cost_emp_rate_sch_id='||l_plan_cost_emp_rate_sch_id, x_Log_Level=> 3);
9118             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_plan_cost_nlr_rate_sch_id='||l_plan_cost_nlr_rate_sch_id, x_Log_Level=> 3);
9119             END IF;
9120 
9121         BEGIN
9122 
9123              PA_COST1.Get_Plan_Actual_Cost_Rates
9124             (p_calling_mode                 =>l_calling_mode --'ACTUAL_RATES' Bug 3627315
9125             ,p_project_type                 =>l_project_type
9126             ,p_project_id                   =>p_project_id
9127             --,p_task_id                      => null ---- TILL THE ISSUE IS FIXED l_task_id
9128             ,p_task_id                      => l_task_id --bug 3860575
9129             ,p_top_task_id                  =>l_top_task_id
9130             ,p_Exp_item_date                => p_as_of_date   --bug 3901289
9131             ,p_expenditure_type             =>l_expenditure_type
9132             ,p_expenditure_OU               =>l_expenditure_OU
9133             ,p_project_OU                   =>l_org_id
9134             ,p_Quantity                     =>1
9135             ,p_resource_class               =>l_resource_class_code    /* resource_class_code for Resource Class */
9136             ,p_person_id                    =>l_person_id
9137             ,p_non_labor_resource           =>l_non_labor_resource
9138             ,p_NLR_organization_id          =>l_nlr_organization_id
9139             ,p_override_organization_id     =>l_rate_override_to_organz_id
9140             ,p_incurred_by_organization_id  =>l_rate_incurred_by_organz_id
9141             ,p_inventory_item_id            =>l_inventory_item_id
9142             ,p_BOM_resource_id              =>l_BOM_resource_id
9143             ,p_override_trxn_curr_code      =>l_txn_currency_code_override -- P_override_txn_currency_code Bug 3632946
9144             ,p_override_burden_cost_rate    =>l_burden_override_multiplier
9145             ,p_override_trxn_cost_rate      =>l_cost_override_rate
9146             ,p_override_trxn_raw_cost       =>l_raw_cost --P_dummy_override_raw_cost Bug 3632946
9147             ,p_override_trxn_burden_cost    =>l_burden_cost
9148             ,p_mfc_cost_type_id             =>l_mfc_cost_type_id
9149             ,p_mfc_cost_source              =>l_mfc_cost_source
9150             ,p_item_category_id             =>l_item_category_id
9151             ,p_job_id                       =>l_job_id
9152             --bug 3686920
9153             --maansari6/14      ,p_plan_cost_burden_sch_id      => l_plan_cost_burden_sch_id -- Bug 3632946 : Added this parameter
9154             --maansari6/14
9155             ,p_plan_cost_burden_sch_id      => l_plan_cost_burden_sch_id
9156             ,p_plan_cost_job_rate_sch_id    => l_plan_cost_job_rate_sch_id
9157             ,p_plan_cost_emp_rate_sch_id    => l_plan_cost_emp_rate_sch_id
9158             ,p_plan_cost_nlr_rate_sch_id    => l_plan_cost_nlr_rate_sch_id
9159             --maansari6/14   bug 3686920
9160             ,x_trxn_curr_code               =>l_trxn_curr_code
9161             ,x_trxn_raw_cost                =>l_txn_raw_cost
9162             ,x_trxn_raw_cost_rate           =>l_txn_cost_rate
9163             ,x_trxn_burden_cost             =>l_txn_burden_cost
9164             ,x_trxn_burden_cost_rate        =>l_txn_burden_cost_rate
9165             ,x_burden_multiplier            =>l_burden_multiplier
9166             ,x_cost_ind_compiled_set_id     =>l_cost_ind_compiled_set_id
9167             ,x_raw_cost_rejection_code      =>l_raw_cost_rejection_code
9168             ,x_burden_cost_rejection_code   =>l_burden_cost_rejection_code
9169             ,x_return_status                =>l_return_status
9170             ,x_error_msg_code               =>l_msg_data );
9171 
9172                 IF g1_debug_mode  = 'Y' THEN
9173                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'After call PA_COST1.Get_Plan_Actual_Cost_Rates', x_Log_Level=> 3);
9174                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_return_status='||l_return_status, x_Log_Level=> 3);
9175                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_msg_data='||l_msg_data, x_Log_Level=> 3);
9176                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_trxn_curr_code='||l_trxn_curr_code, x_Log_Level=> 3);
9177                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_txn_raw_cost='||l_txn_raw_cost, x_Log_Level=> 3);
9178                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_txn_cost_rate='||l_txn_cost_rate, x_Log_Level=> 3);
9179                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_txn_burden_cost='||l_txn_burden_cost, x_Log_Level=> 3);
9180                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_txn_burden_cost_rate='||l_txn_burden_cost_rate, x_Log_Level=> 3);
9181                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_burden_multiplier='||l_burden_multiplier, x_Log_Level=> 3);
9182                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_cost_ind_compiled_set_id='||l_cost_ind_compiled_set_id, x_Log_Level=> 3);
9183                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_raw_cost_rejection_code='||l_raw_cost_rejection_code, x_Log_Level=> 3);
9184                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_burden_cost_rejection_code='||l_burden_cost_rejection_code, x_Log_Level=> 3);
9185             END IF;
9186         EXCEPTION
9187             WHEN OTHERS THEN
9188 
9189              -- FPM Dev CR 5 : If the above API does not retun then populate it with 0
9190                 x_resource_raw_rate := 0;
9191             x_resource_burden_rate := 0;
9192             x_resource_curr_code :=  l_trxn_curr_code;
9193             --  X_dummy_burden_cost := 0;
9194                 X_burden_multiplier := 0;
9195                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_error_text='||SUBSTRB('PA_COST1.Get_Plan_Actual_Cost_Rates:'||SQLERRM,1,120), x_Log_Level=> 3);
9196         END;
9197 
9198         --bug 3733606
9199         IF l_return_status <> 'S' THEN
9200             -- Bug 3691289 : l_cost_res_class_rate_sch_id is derived above
9201             -- IF l_resource_class_code <> 'PEOPLE'
9202             -- THEN
9203             --    l_cost_res_class_rate_sch_id := l_plan_cost_nlr_rate_sch_id;
9204             -- ELSE
9205             --    IF l_plan_cost_emp_rate_sch_id IS NOT NULL
9206             --    THEN
9207             --        l_cost_res_class_rate_sch_id := l_plan_cost_emp_rate_sch_id;
9208             --    ELSE
9209             --        l_cost_res_class_rate_sch_id := l_plan_cost_job_rate_sch_id;
9210             --    END IF;
9211             -- END IF;
9212 
9213             BEGIN
9214                     IF g1_debug_mode  = 'Y' THEN
9215                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'Calling PA_PLAN_REVENUE.Get_plan_res_class_rates', x_Log_Level=> 3);
9216                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_project_type='||l_project_type, x_Log_Level=> 3);
9217                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_project_id='||p_project_id, x_Log_Level=> 3);
9218                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_resource_class='||l_resource_class_code, x_Log_Level=> 3);
9219                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_use_planning_rates_flag='||l_use_planning_rates_flag, x_Log_Level=> 3);
9220                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_rate_based_flag='||'Y', x_Log_Level=> 3);
9221                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_uom='||l_unit_of_measure, x_Log_Level=> 3);
9222                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_project_organz_id='||l_carrying_out_org_id, x_Log_Level=> 3);
9223                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_cost_res_class_rate_sch_id='||l_cost_res_class_rate_sch_id, x_Log_Level=> 3);
9224                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_plan_burden_cost_sch_id='||l_plan_cost_burden_sch_id, x_Log_Level=> 3);
9225                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_project_org_id='||l_org_id, x_Log_Level=> 3);
9226                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_incurred_by_organz_id='||l_rate_incurred_by_organz_id, x_Log_Level=> 3);
9227                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_override_to_organz_id='||l_rate_override_to_organz_id, x_Log_Level=> 3);
9228                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_expenditure_org_id='||l_expenditure_OU, x_Log_Level=> 3);
9229                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_nlr_organization_id='||l_nlr_organization_id, x_Log_Level=> 3);
9230                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_txn_currency_code='||p_currency_code, x_Log_Level=> 3);
9231                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_expenditure_type='||l_expenditure_type, x_Log_Level=> 3);
9232                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_raw_cost='||l_raw_cost, x_Log_Level=> 3);
9233                 END IF;
9234 
9235                 PA_PLAN_REVENUE.Get_plan_res_class_rates  (
9236                        p_project_type                   => l_project_type
9237                       ,p_project_id                     => p_project_id
9238                       --,p_task_id                        => null
9239                       ,p_task_id                      => l_task_id --bug 3860575
9240                       ,p_resource_class                 => l_resource_class_code
9241                       ,p_use_planning_rates_flag        => l_use_planning_rates_flag
9242                       ,p_rate_based_flag                => 'Y'
9243                       ,p_uom                            => l_unit_of_measure
9244                       ,p_project_organz_id              => l_carrying_out_org_id
9245                       ,p_cost_res_class_rate_sch_id     => l_cost_res_class_rate_sch_id
9246                       ,p_plan_burden_cost_sch_id        => l_plan_cost_burden_sch_id
9247                       ,p_quantity                       => 1
9248                       ,p_item_date                      => p_as_of_date  --SYSDATE
9249               --bug 3954250
9250                       ,p_schedule_type                  => 'COST'
9251                       ,p_project_org_id                 => l_org_id
9252                       ,p_incurred_by_organz_id          => l_rate_incurred_by_organz_id
9253                       ,p_override_to_organz_id          => l_rate_override_to_organz_id
9254                       ,p_expenditure_org_id             => l_expenditure_OU
9255                       ,p_nlr_organization_id            => l_nlr_organization_id
9256                       ,p_txn_currency_code              => p_currency_code
9257                       ,p_expenditure_type               => l_expenditure_type
9258                       ,p_raw_cost                       => l_raw_cost
9259                       ,p_system_linkage                 => null
9260                       ,p_person_id                      => l_person_id -- Bug 3861970, 3879461
9261                       ,p_job_id                         => l_job_id -- Bug 3861970, 3879461
9262                       ,x_bill_rate                      => l_bill_rate
9263                       ,x_cost_rate                      => l_txn_cost_rate
9264                       ,x_burden_cost_rate               => l_txn_burden_cost_rate
9265                       ,x_burden_multiplier              => l_burden_multiplier
9266                    -- ,x_raw_cost                       => l_raw_cost   * commented for Bug: 4537865
9267                       ,x_raw_cost           => l_new_raw_cost  --added for Bug 4537865
9268                       ,x_burden_cost                    => l_burden_cost
9269                       ,x_raw_revenue                    => l_raw_revenue
9270                       ,x_bill_markup_percentage         => l_bill_markup_percentage
9271                       ,x_cost_markup_percentage         => l_cost_markup_percentage
9272                       ,x_cost_txn_curr_code             => l_trxn_curr_code
9273                       ,x_rev_txn_curr_code              => l_rev_txn_curr_code
9274                       ,x_raw_cost_rejection_code        => l_raw_cost_rejection_code
9275                       ,x_burden_cost_rejection_code     => l_burden_cost_rejection_code
9276                       ,x_revenue_rejection_code         => l_revenue_rejection_code
9277                       ,x_cost_ind_compiled_set_id       => l_cost_ind_compiled_set_id
9278                       ,x_return_status                  => l_return_status
9279                       ,x_msg_count                      => l_msg_count
9280                       ,x_msg_data                       => l_msg_data
9281                      );
9282                 --added for Bug 4537865
9283                 IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
9284                     l_raw_cost := l_new_raw_cost;
9285                     END IF;
9286                  --added for Bug 4537865
9287                 IF g1_debug_mode  = 'Y' THEN
9288                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'After Call PA_PLAN_REVENUE.Get_plan_res_class_rates', x_Log_Level=> 3);
9289                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_return_status='||l_return_status, x_Log_Level=> 3);
9290                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_msg_count='||l_msg_count, x_Log_Level=> 3);
9291                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_msg_data='||l_msg_data, x_Log_Level=> 3);
9292                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_bill_rate='||l_bill_rate, x_Log_Level=> 3);
9293                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_txn_cost_rate='||l_txn_cost_rate, x_Log_Level=> 3);
9294                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_txn_burden_cost_rate='||l_txn_burden_cost_rate, x_Log_Level=> 3);
9295                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_burden_multiplier='||l_burden_multiplier, x_Log_Level=> 3);
9296                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_raw_cost='||l_raw_cost, x_Log_Level=> 3);
9297                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_burden_cost='||l_burden_cost, x_Log_Level=> 3);
9298                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_raw_revenue='||l_raw_revenue, x_Log_Level=> 3);
9299                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_bill_markup_percentage='||l_bill_markup_percentage, x_Log_Level=> 3);
9300                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_cost_markup_percentage='||l_cost_markup_percentage, x_Log_Level=> 3);
9301                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_trxn_curr_code='||l_trxn_curr_code, x_Log_Level=> 3);
9302                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_rev_txn_curr_code='||l_rev_txn_curr_code, x_Log_Level=> 3);
9303                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_raw_cost_rejection_code='||l_raw_cost_rejection_code, x_Log_Level=> 3);
9304                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_burden_cost_rejection_code='||l_burden_cost_rejection_code, x_Log_Level=> 3);
9305                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_revenue_rejection_code='||l_revenue_rejection_code, x_Log_Level=> 3);
9306                     pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_cost_ind_compiled_set_id='||l_cost_ind_compiled_set_id, x_Log_Level=> 3);
9307                 END IF;
9308             EXCEPTION
9309                 WHEN OTHERS THEN
9310                 fnd_msg_pub.add_exc_msg(p_pkg_name       => 'pa_progress_utils',
9311                                    p_procedure_name => 'Get_Res_Rate_Burden_Multiplier',
9312                                    p_error_text     => SUBSTRB('PA_PLAN_REVENUE.Get_plan_res_class_rates:'||SQLERRM,1,120));
9313                     pa_debug.write(x_Module=>'PA_PLAN_REVENUE.Get_plan_res_class_rates', x_Msg => 'p_error_text='||SUBSTRB('PA_PLAN_REVENUE.Get_plan_res_class_rates:'||SQLERRM,1,120), x_Log_Level=> 3);
9314                 raise fnd_api.g_exc_error;
9315             END;
9316         END IF;   --< l_return_status <> 'S'>
9317         --bug 3733606
9318 
9319         IF g1_debug_mode  = 'Y' THEN
9320             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'After Call Get_Plan_Actual_Cost_Rates', x_Log_Level=> 3);
9321             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_return_status='||l_return_status, x_Log_Level=> 3);
9322             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'fnd_msg_count='||fnd_msg_pub.count_msg, x_Log_Level=> 3);
9323             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_trxn_curr_code='||l_trxn_curr_code, x_Log_Level=> 3);
9324             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_trxn_raw_cost='||l_txn_raw_cost, x_Log_Level=> 3);
9325             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_trxn_raw_cost_rate='||l_txn_cost_rate, x_Log_Level=> 3);
9326             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_trxn_burden_cost='||l_txn_burden_cost, x_Log_Level=> 3);
9327             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_trxn_burden_cost_rate='||l_txn_burden_cost_rate, x_Log_Level=> 3);
9328             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_burden_multiplier='||l_burden_multiplier, x_Log_Level=> 3);
9329             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_cost_ind_compiled_set_id='||l_cost_ind_compiled_set_id, x_Log_Level=> 3);
9330             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_raw_cost_rejection_code='||l_raw_cost_rejection_code, x_Log_Level=> 3);
9331             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'x_burden_cost_rejection_code='||l_burden_cost_rejection_code, x_Log_Level=> 3);
9332         END IF;
9333 
9334         x_resource_raw_rate := nvl(l_txn_cost_rate,0);
9335         x_resource_burden_rate := nvl(l_txn_burden_cost_rate,0);
9336         x_resource_curr_code :=  l_trxn_curr_code;
9337         --X_dummy_burden_cost := nvl(l_txn_burden_cost,0); Bug 3632946
9338         X_burden_multiplier := nvl(l_burden_multiplier,0);
9339 
9340         -- FPM Dev CR 8 : Added error stack population
9341         -- It is subjected to change if values are coming from lookups.
9342         IF  l_raw_cost_rejection_code IS NOT NULL AND l_raw_override_rate IS NULL     --bug 3821299 do not throw error if there is override.
9343         THEN
9344             PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
9345                          p_msg_name       => l_raw_cost_rejection_code);
9346             x_msg_data := l_raw_cost_rejection_code;
9347             x_return_status := 'E';
9348             x_msg_count := fnd_msg_pub.count_msg;
9349             RAISE  FND_API.G_EXC_ERROR;
9350         END IF;
9351 
9352         IF  l_burden_cost_rejection_code IS NOT NULL AND l_burden_override_rate IS NULL --bug 3821299 do not throw error if there is override.
9353         THEN
9354             PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
9355                          p_msg_name       => l_burden_cost_rejection_code);
9356             x_msg_data := l_burden_cost_rejection_code;
9357             x_return_status := 'E';
9358             x_msg_count := fnd_msg_pub.count_msg;
9359             RAISE  FND_API.G_EXC_ERROR;
9360         END IF;
9361 
9362     ELSE -- l_rate_based_flag = 'N' bug# 3801523
9363         IF g1_debug_mode  = 'Y' THEN
9364             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'Before Calling Get_burden_sch_details ', x_Log_Level=> 3);
9365             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_project_type '||l_project_type, x_Log_Level=> 3);
9366             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_expenditure_OU '||l_expenditure_OU, x_Log_Level=> 3);
9367             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_expenditure_type '||l_expenditure_type, x_Log_Level=> 3);
9368             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_currency_code '||p_currency_code, x_Log_Level=> 3);
9369             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_plan_cost_burden_sch_id '||l_plan_cost_burden_sch_id, x_Log_Level=> 3);
9370             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_rate_override_to_organz_id '||l_rate_override_to_organz_id, x_Log_Level=> 3);
9371             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_rate_incurred_by_organz_id '||l_rate_incurred_by_organz_id, x_Log_Level=> 3);
9372             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_nlr_organization_id '||l_nlr_organization_id, x_Log_Level=> 3);
9373             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'p_currency_code '||p_currency_code, x_Log_Level=> 3);
9374             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_calling_mode '||l_calling_mode, x_Log_Level=> 3);
9375         END IF;
9376 
9377         pa_cost1.Get_burden_sch_details
9378                 (
9379          p_calling_mode                 =>l_calling_mode
9380                 ,p_exp_item_id                  => NULL
9381                 ,p_trxn_type                    => NULL
9382                 ,p_project_type                 => l_project_type
9383                 ,p_project_id                   => p_project_id
9384                 --,p_task_id                      => null
9385                 ,p_task_id                      => l_task_id --bug 3860575
9386         -- Bug  3837292 ,p_exp_organization_id          => l_expenditure_OU Bug 3837292
9387                 ,p_exp_organization_id          => NVL(l_rate_override_to_organz_id,NVl(l_rate_incurred_by_organz_id,l_nlr_organization_id))
9388         ,p_expenditure_type             => l_expenditure_type
9389                 ,p_schedule_type                => 'COST'
9390                 ,p_exp_item_date                => p_as_of_date   --bug 3901289
9391                 ,p_trxn_curr_code               => p_currency_code
9392                 ,p_burden_schedule_id           => l_plan_cost_burden_sch_id
9393                 ,x_schedule_id                  => l_burd_sch_id
9394                 ,x_sch_revision_id              => l_burd_sch_rev_id
9395                 ,x_sch_fixed_date               => l_burd_sch_fixed_date
9396                 ,x_cost_base                    => l_burd_sch_cost_base
9397                 ,x_cost_plus_structure          => l_burd_sch_cp_structure
9398                 ,x_compiled_set_id              => l_cost_ind_compiled_set_id
9399                 ,x_burden_multiplier            => l_burden_multiplier
9400                 ,x_return_status                => l_return_status
9401                 ,x_error_msg_code               => l_msg_data
9402         );
9403 
9404         IF g1_debug_mode  = 'Y' THEN
9405             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'After Calling Get_burden_sch_details l_return_status '||l_return_status, x_Log_Level=> 3);
9406             pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier', x_Msg => 'l_burden_multiplier '||l_burden_multiplier, x_Log_Level=> 3);
9407         END IF;
9408         X_burden_multiplier := nvl(l_burden_multiplier,0);
9409 
9410 -- Begin fix for Bug # 4065674.
9411 -- For non-rate based resources also we need to use the override burden rate to convert the etc raw cost to
9412 -- etc burden cost. Hence we replace the default burden multiplier obtained from the burden schedule
9413 -- with the override burden rate.
9414 
9415 
9416 -- End fix for Bug # 4065674.
9417 
9418 
9419     END IF; -- l_rate_based_flag = 'Y'
9420     --bug# 3801523 Satish end.
9421 
9422     --maansari6/5
9423     IF  l_return_status <> 'S' AND l_msg_data IS NOT NULL
9424     THEN
9425                 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
9426                              p_msg_name       => l_msg_data);
9427                 x_msg_data := l_msg_data;
9428                 x_return_status := 'E';
9429                 x_msg_count := fnd_msg_pub.count_msg;
9430                 RAISE  FND_API.G_EXC_ERROR;
9431     END IF;
9432     --maansari6/5
9433     --  END LOOP; Bug 3965584 : Reduced the scope of FOR LOOP
9434     -- END IF;   ---------------------------------------------------------------------------}
9435         x_return_status := l_return_status;
9436         x_msg_count     := fnd_msg_pub.count_msg; -- FPM Dev CR 8
9437 
9438 EXCEPTION
9439      -- FPM Dev CR 5
9440      WHEN FND_API.G_EXC_ERROR THEN
9441                 x_return_status := FND_API.G_RET_STS_ERROR;
9442                  x_msg_count := FND_MSG_PUB.Count_Msg;
9443                  If x_msg_count = 1 THEN
9444                                 pa_interface_utils_pub.get_messages
9445                                         (p_encoded        => FND_API.G_TRUE,
9446                                         p_msg_index      => 1,
9447                                         p_msg_count      => x_msg_count,
9448                                         p_msg_data       => x_msg_data,
9449                                   --    p_data           => x_msg_data,     * commented for Bug: 4537865
9450                     p_data       => l_new_msg_data,     --added for Bug: 4537865
9451                                         p_msg_index_out  => l_msg_index_out );
9452                  --added for Bug: 4537865
9453                     x_msg_data := l_new_msg_data;
9454                  --added for Bug: 4537865
9455                  End If;
9456 
9457         -- 4537865
9458          x_resource_curr_code       := NULL ;
9459          x_resource_raw_rate        := NULL ;
9460          x_resource_burden_rate     := NULL ;
9461          X_burden_multiplier        := NULL ;
9462 
9463      WHEN l_insufficient_paramters THEN
9464                  PA_UTILS.add_message('PA','PA_PROG_INSUFFICIENT_PARA',
9465                  'RES_NAME', l_resource_alias);
9466                  x_return_status := FND_API.G_RET_STS_ERROR;
9467                  x_msg_data      := 'PA_PROG_INSUFFICIENT_PARA';
9468                  x_msg_count := FND_MSG_PUB.Count_Msg;
9469                  If x_msg_count = 1 THEN
9470                                 pa_interface_utils_pub.get_messages
9471                                         (p_encoded        => FND_API.G_TRUE,
9472                                         p_msg_index      => 1,
9473                                         p_msg_count      => x_msg_count,
9474                                         p_msg_data       => x_msg_data,
9475                                   --    p_data           => x_msg_data,     * commented for Bug: 4537865
9476                     p_data       => l_new_msg_data,      -- added for Bug: 4537865
9477                                         p_msg_index_out  => l_msg_index_out );
9478                   --added for Bug: 4537865
9479                     x_msg_data := l_new_msg_data;
9480                   --added for Bug: 4537865
9481                  End If;
9482 
9483                 -- 4537865
9484                  x_resource_curr_code       := NULL ;
9485                  x_resource_raw_rate        := NULL ;
9486                  x_resource_burden_rate     := NULL ;
9487                  X_burden_multiplier        := NULL ;
9488 
9489          WHEN OTHERS THEN
9490                  x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9491                  x_msg_count     := 1;
9492                  x_msg_data      := SUBSTR(SQLERRM,1,120);
9493                  FND_MSG_PUB.add_exc_msg( p_pkg_name         => 'PA_PROGRESS_UTILS',
9494                          p_procedure_name   => 'Get_Res_Rate_Burden_Multiplier');
9495                  If x_msg_count = 1 THEN
9496                                 pa_interface_utils_pub.get_messages
9497                                         (p_encoded        => FND_API.G_TRUE,
9498                                         p_msg_index      => 1,
9499                                         p_msg_count      => x_msg_count,
9500                                         p_msg_data       => x_msg_data,
9501                                      -- p_data           => x_msg_data,     * commented for Bug: 4537865
9502                     p_data           => l_new_msg_data,      -- added for Bug: 4537865
9503                                         p_msg_index_out  => l_msg_index_out );
9504                    --added for Bug: 4537865
9505                                         x_msg_data := l_new_msg_data;
9506                     --added for Bug: 4537865
9507                  End If;
9508 
9509                 -- 4537865
9510                  x_resource_curr_code       := NULL ;
9511                  x_resource_raw_rate        := NULL ;
9512                  x_resource_burden_rate     := NULL ;
9513                  X_burden_multiplier        := NULL ;
9514 
9515                  RAISE;
9516 
9517 end Get_Res_Rate_Burden_Multiplier;
9518 -- Progress Management Changes. Bug # 3621404.
9519 
9520 function derive_etc_values(
9521      p_planned_value            NUMBER := null
9522      ,p_ppl_act_value           NUMBER := null
9523      ,p_eqpmt_act_value         NUMBER := null
9524      ,p_oth_act_value           NUMBER := null
9525      ,p_subprj_ppl_act_value    NUMBER := null
9526      ,p_subprj_eqpmt_act_value  NUMBER := null
9527      ,p_subprj_oth_act_value    NUMBER := null
9528      ,p_oth_quantity_to_date    NUMBER := null
9529 )return number
9530 is
9531     l_derived_etc_value NUMBER;
9532 begin
9533 
9534     l_derived_etc_value :=  nvl(p_planned_value,0) - (nvl(p_ppl_act_value,0)+nvl(p_eqpmt_act_value,0)
9535                     +nvl(p_oth_act_value,0)+nvl(p_subprj_ppl_act_value,0)
9536                             +nvl(p_subprj_eqpmt_act_value,0)+nvl(p_subprj_oth_act_value,0)
9537                     +nvl(p_oth_quantity_to_date,0));
9538 
9539     if (l_derived_etc_value < 0) then
9540         l_derived_etc_value := 0;
9541     end if;
9542 
9543     return(l_derived_etc_value);
9544 
9545 end derive_etc_values;
9546 
9547 function published_dlv_prog_exists
9548 (
9549  p_project_id        PA_PROJECTS_ALL.PROJECT_ID%TYPE,
9550  p_dlv_proj_elt_id   PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
9551 )return VARCHAR2
9552 IS
9553     l_result VARCHAR2(1) ;
9554 
9555     CURSOR published_rec_exists
9556     IS
9557                 SELECT 'Y'
9558                 FROM PA_PERCENT_COMPLETES
9559         WHERE object_id = p_dlv_proj_elt_id
9560                   AND object_type = 'PA_DELIVERABLES'
9561                   AND project_id  = p_project_id
9562                   AND structure_type = 'WORKPLAN'
9563                   AND published_flag = 'Y';
9564 
9565 BEGIN
9566 
9567      OPEN published_rec_exists ;
9568      FETCH published_rec_exists INTO l_result ;
9569 
9570      IF published_rec_exists%NOTFOUND THEN
9571          l_result := 'N' ;
9572      END IF;
9573 
9574      CLOSE published_rec_exists ;
9575 
9576      return l_result ;
9577 
9578 END published_dlv_prog_exists ;
9579 
9580 
9581 --Added for performance improvements in the view pa_prog_act_by_period_v
9582 --can be used anywhere else too.
9583 procedure set_global_str_ver_id(p_structure_version_id NUMBER)
9584 IS
9585 BEGIN
9586      PA_PROGRESS_UTILS.g_structure_version_id := p_structure_version_id;
9587 END set_global_str_ver_id;
9588 
9589 function get_global_str_ver_id RETURN NUMBER IS
9590 BEGIN
9591    return PA_PROGRESS_UTILS.g_structure_version_id;
9592 END get_global_str_ver_id;
9593 
9594 procedure set_global_time_phase_period(p_period_name VARCHAR2)
9595 IS
9596 BEGIN
9597    PA_PROGRESS_UTILS.g_time_phase_period_name := p_period_name;
9598 END set_global_time_phase_period;
9599 
9600 function get_global_time_phase_period RETURN VARCHAR2 IS
9601 BEGIN
9602   return PA_PROGRESS_UTILS.g_time_phase_period_name;
9603 END get_global_time_phase_period;
9604 
9605 
9606 
9607 -- Added following function for bug 3709439
9608 FUNCTION Percent_Spent_Value
9609 (
9610   p_actual_value       NUMBER
9611  ,p_planned_value      NUMBER
9612 ) RETURN NUMBER
9613 
9614 IS
9615     l_percent_spent_value NUMBER := 0;
9616 
9617 BEGIN
9618 
9619      -- 5726773
9620  	     -- IF NVL(p_actual_value,0) <= 0 THEN
9621  	     --   l_percent_spent_value := 0;
9622  	     IF (NVL(p_actual_value,0) <= 0 and p_planned_value >= 0) or (NVL(p_actual_value,0) >= 0 and p_planned_value < 0) THEN  --5726773
9623        l_percent_spent_value := 0;
9624     ELSIF NVL(p_planned_value,0) = 0 THEN
9625         l_percent_spent_value := 100;
9626     ELSE
9627        l_percent_spent_value := ( (p_actual_value/p_planned_value) *100 );
9628     END IF;
9629 
9630     --bug 3824042
9631     --RETURN TRUNC(l_percent_spent_value,2) ;
9632     RETURN ROUND(l_percent_spent_value,2) ;
9633 
9634 END Percent_Spent_Value ;
9635 
9636 
9637 -- Added following function for bug 3709439
9638 FUNCTION Percent_Complete_Value
9639 (
9640   p_actual_value       NUMBER
9641  ,p_etc_value          NUMBER
9642 ) RETURN NUMBER
9643 
9644 IS
9645     l_percent_complete_value NUMBER := 0;
9646     l_act_etc                NUMBER := NVL(p_actual_value,0) + NVL(p_etc_value,0) ;
9647 
9648 BEGIN
9649 
9650      ---5726773
9651       IF (NVL(p_actual_value,0) <= 0 and l_act_etc > 0) or (NVL(p_actual_value,0) >= 0 and l_act_etc < 0) THEN  --5726773
9652        l_percent_complete_value := 0;
9653 --    ELSIF NVL(p_etc_value,0) = 0 THEN
9654 --        l_percent_complete_value := 100;
9655     ELSE
9656        IF (l_act_etc = 0 ) THEN
9657           l_act_etc := 1;
9658        END IF;
9659        l_percent_complete_value := (  ( p_actual_value/l_act_etc ) * 100  );
9660        if (l_percent_complete_value > 100) then
9661  	            l_percent_complete_value := 100;
9662  	elsif (l_percent_complete_value < 0) then
9663  	            l_percent_complete_value := 0;
9664  	end if;
9665     END IF;
9666 
9667     --bug 3824042
9668     --RETURN TRUNC(l_percent_complete_value,2) ;
9669     RETURN ROUND(l_percent_complete_value,2) ;
9670 
9671 END Percent_Complete_Value ;
9672 
9673 -- Bug 3784324 : Added procedure convert_effort_to_cost
9674 PROCEDURE convert_effort_to_cost
9675 (   p_resource_list_mem_id        IN  NUMBER
9676     ,p_project_id                 IN  NUMBER
9677     ,p_structure_version_id       IN  NUMBER
9678     ,p_txn_currency_code              IN  VARCHAR
9679     ,p_planned_effort             IN  NUMBER
9680     ,p_planned_rawcost_tc         IN  NUMBER
9681     ,p_act_effort_this_period     IN  NUMBER
9682     ,p_act_effort                 IN  NUMBER
9683     ,p_etc_effort                 IN  NUMBER
9684     ,p_rate_based_flag            IN  VARCHAR := 'Y'
9685     ,p_act_rawcost_tc             IN  NUMBER
9686     ,x_act_rawcost_tc_this_period IN OUT NOCOPY NUMBER    --File.Sql.39 bug 4440895
9687     ,x_etc_rawcost_tc             IN OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
9688     ,x_prcnt_comp_effort          OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
9689     ,x_prcnt_spent_effort         OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
9690     ,x_eac_effort                 OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
9691     ,x_prcnt_comp_rawcost_tc      OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
9692     ,x_prcnt_spent_rawcost_tc     OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
9693     ,x_eac_rawcost_tc             OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
9694     ,x_return_status          OUT    NOCOPY VARCHAR2       --File.Sql.39 bug 4440895
9695     ,x_msg_count          OUT    NOCOPY NUMBER         --File.Sql.39 bug 4440895
9696     ,x_msg_data           OUT    NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
9697 )
9698 IS
9699 
9700     l_act_rawcost_tc          NUMBER     := null;
9701     l_etc_rawcost_tc          NUMBER     := null;
9702     l_prcnt_comp_effort          NUMBER     := null;
9703     l_prcnt_spent_effort      NUMBER     := null;
9704     l_eac_effort              NUMBER     := null;
9705     l_prcnt_comp_rawcost_tc      NUMBER     := null;
9706     l_prcnt_spent_rawcost_tc  NUMBER     := null;
9707     l_eac_rawcost_tc          NUMBER     := null;
9708 
9709     --added Satish
9710     X_ACT_RAWCOST_TC         NUMBER;
9711     l_actual_effort_to_date   NUMBER    := null;
9712     l_actual_rawcost_to_date   NUMBER    := null;
9713     l_act_rawcost_tc_this_period NUMBER  := null;
9714 
9715     l_plan_res_cur_code           VARCHAR2(30)     := null;
9716     l_plan_res_raw_rate           NUMBER           := null;
9717     l_plan_res_burden_rate       NUMBER           := null;
9718     l_plan_burden_multiplier   NUMBER           := null;
9719     l_return_status               VARCHAR2(1)      := null;
9720     l_msg_count                   NUMBER           := null;
9721     l_msg_data                   VARCHAR2(250)    := null;
9722     g1_debug_mode            VARCHAR2(1)                                    ;
9723 
9724 
9725 
9726 
9727 BEGIN
9728 
9729      g1_debug_mode := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
9730      IF g1_debug_mode  = 'Y' THEN
9731          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_resource_list_mem_id='||p_resource_list_mem_id, x_Log_Level=> 3);
9732          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_project_id='||p_project_id, x_Log_Level=> 3);
9733          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_structure_version_id='||p_structure_version_id, x_Log_Level=> 3);
9734          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_txn_currency_code='||p_txn_currency_code, x_Log_Level=> 3);
9735          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_planned_effort='||p_planned_effort, x_Log_Level=> 3);
9736          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_planned_rawcost_tc='||p_planned_rawcost_tc, x_Log_Level=> 3);
9737          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_act_effort_this_period='||p_act_effort_this_period, x_Log_Level=> 3);
9738          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_act_effort='||p_act_effort, x_Log_Level=> 3);
9739          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_etc_effort='||p_etc_effort, x_Log_Level=> 3);
9740          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_rate_based_flag='||p_rate_based_flag, x_Log_Level=> 3);
9741          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'p_act_rawcost_tc='||p_act_rawcost_tc, x_Log_Level=> 3);
9742      END IF;
9743 
9744     x_return_status := fnd_api.g_ret_sts_success ; -- 4537865
9745 
9746     If (p_rate_based_flag = 'N') then
9747         -- If (p_rate_based_flag  = 'N') the Rawcost values are inputs.
9748         l_etc_rawcost_tc := nvl(x_etc_rawcost_tc,0);
9749         l_act_rawcost_tc := nvl(p_act_rawcost_tc,0);
9750     l_act_rawcost_tc_this_period := nvl(x_act_rawcost_tc_this_period, 0);
9751 
9752         -- Calculate the EAC Rawcost, Percent Complete Rawcost and Percent Spent Rawcost
9753         -- using the input Rawcost values.
9754     l_actual_rawcost_to_date := nvl(l_act_rawcost_tc,0)  + nvl(l_act_rawcost_tc_this_period,0);
9755         l_eac_rawcost_tc := (nvl(l_actual_rawcost_to_date,0) + nvl(l_etc_rawcost_tc,0));
9756         l_prcnt_comp_rawcost_tc := PA_PROGRESS_UTILS.Percent_Complete_Value(l_actual_rawcost_to_date,l_etc_rawcost_tc);
9757         l_prcnt_spent_rawcost_tc := PA_PROGRESS_UTILS.Percent_Spent_Value(l_actual_rawcost_to_date,p_planned_rawcost_tc);
9758     else
9759         -- ETC effort to ETC Rawcost Conversion.
9760         l_plan_res_cur_code         := null;
9761         l_plan_res_raw_rate            := null;
9762         l_plan_res_burden_rate        := null;
9763         l_plan_burden_multiplier    := null;
9764         l_return_status                := null;
9765         l_msg_count                    := null;
9766         l_msg_data                    := null;
9767 
9768         PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier(
9769             P_res_list_mem_id             => p_resource_list_mem_id
9770            ,P_project_id                  => p_project_id
9771            ,p_structure_version_id        => p_structure_version_id
9772            ,p_currency_code               => p_txn_currency_code
9773            ,p_calling_mode                => 'PLAN_RATES'
9774            ,x_resource_curr_code          => l_plan_res_cur_code
9775            ,x_resource_raw_rate           => l_plan_res_raw_rate
9776            ,x_resource_burden_rate        => l_plan_res_burden_rate
9777            ,X_burden_multiplier           => l_plan_burden_multiplier
9778            ,x_return_status               => l_return_status
9779            ,x_msg_count                   => l_msg_count
9780            ,x_msg_data                    => l_msg_data);
9781 
9782     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9783         x_return_status := 'E';
9784         RAISE  FND_API.G_EXC_ERROR;
9785     END IF;
9786 
9787         l_etc_rawcost_tc := (nvl(p_etc_effort,0) * nvl(l_plan_res_raw_rate,0));
9788 
9789     IF g1_debug_mode  = 'Y' THEN
9790         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => '1. l_plan_res_raw_rate='||l_plan_res_raw_rate, x_Log_Level=> 3);
9791     END IF;
9792 
9793 
9794         -- ACT Effort to ACT Rawcost Conversion.
9795 
9796         l_plan_res_cur_code         := null;
9797         l_plan_res_raw_rate            := null;
9798         l_plan_res_burden_rate        := null;
9799         l_plan_burden_multiplier    := null;
9800         l_return_status                := null;
9801         l_msg_count                    := null;
9802         l_msg_data                    := null;
9803 
9804         PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier(
9805             P_res_list_mem_id             => p_resource_list_mem_id
9806            ,P_project_id                  => p_project_id
9807            ,p_structure_version_id        => p_structure_version_id
9808            ,p_currency_code               => p_txn_currency_code
9809            ,p_calling_mode                => 'ACTUAL_RATES'
9810            ,x_resource_curr_code          => l_plan_res_cur_code
9811            ,x_resource_raw_rate           => l_plan_res_raw_rate
9812            ,x_resource_burden_rate        => l_plan_res_burden_rate
9813            ,X_burden_multiplier           => l_plan_burden_multiplier
9814            ,x_return_status               => l_return_status
9815            ,x_msg_count                   => l_msg_count
9816            ,x_msg_data                    => l_msg_data);
9817 
9818     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9819         x_return_status := 'E';
9820         RAISE  FND_API.G_EXC_ERROR;
9821     END IF;
9822 
9823     IF g1_debug_mode  = 'Y' THEN
9824         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => '2. l_plan_res_raw_rate='||l_plan_res_raw_rate, x_Log_Level=> 3);
9825     END IF;
9826 
9827     IF (p_act_rawcost_tc is NULL)
9828     THEN
9829         l_act_rawcost_tc := (nvl(p_act_effort,0) * nvl(l_plan_res_raw_rate,0));
9830     ELSE
9831     l_act_rawcost_tc := p_act_rawcost_tc;
9832     END IF;
9833 
9834 
9835         l_act_rawcost_tc_this_period := (nvl(p_act_effort_this_period,0) * nvl(l_plan_res_raw_rate,0));   --added new
9836 
9837         -- EAC Effort and EAC Rawcost calculations.
9838 
9839     IF g1_debug_mode  = 'Y' THEN
9840         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'l_act_rawcost_tc_this_period='||l_act_rawcost_tc_this_period, x_Log_Level=> 3);
9841     END IF;
9842     -- Calculate cumulative values
9843     l_actual_effort_to_date := nvl(p_act_effort,0) + nvl(p_act_effort_this_period,0);
9844     l_actual_rawcost_to_date := nvl(l_act_rawcost_tc,0)  + nvl(l_act_rawcost_tc_this_period,0);
9845 
9846         l_eac_effort := (nvl(p_etc_effort,0) + l_actual_effort_to_date);
9847         l_eac_rawcost_tc := ( nvl(l_etc_rawcost_tc,0) +l_actual_rawcost_to_date );
9848 
9849     IF g1_debug_mode  = 'Y' THEN
9850         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'l_eac_effort='||l_eac_effort, x_Log_Level=> 3);
9851         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'l_eac_rawcost_tc='||l_eac_rawcost_tc, x_Log_Level=> 3);
9852     END IF;
9853 
9854         -- Percent Complete Effort and Percent Complete Rawcost calculations.
9855 
9856         l_prcnt_comp_effort := PA_PROGRESS_UTILS.Percent_Complete_Value(l_actual_effort_to_date,p_etc_effort);
9857         l_prcnt_comp_rawcost_tc := PA_PROGRESS_UTILS.Percent_Complete_Value(l_actual_rawcost_to_date,l_etc_rawcost_tc);
9858 
9859     IF g1_debug_mode  = 'Y' THEN
9860         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'l_prcnt_comp_effort='||l_prcnt_comp_effort, x_Log_Level=> 3);
9861         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'l_prcnt_comp_rawcost_tc='||l_prcnt_comp_rawcost_tc, x_Log_Level=> 3);
9862     END IF;
9863 
9864         -- Percent Spent Effort and Percent Spent Rawcost calculations.
9865 
9866         l_prcnt_spent_effort := PA_PROGRESS_UTILS.Percent_Spent_Value(l_actual_effort_to_date,p_planned_effort);
9867         l_prcnt_spent_rawcost_tc := PA_PROGRESS_UTILS.Percent_Spent_Value(l_actual_rawcost_to_date,p_planned_rawcost_tc);
9868 
9869     IF g1_debug_mode  = 'Y' THEN
9870         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'l_prcnt_spent_effort='||l_prcnt_spent_effort, x_Log_Level=> 3);
9871         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost', x_Msg => 'l_prcnt_spent_rawcost_tc='||l_prcnt_spent_rawcost_tc, x_Log_Level=> 3);
9872     END IF;
9873 
9874     end if;  -- If (p_rate_based_flag = 'N')
9875 
9876     x_act_rawcost_tc_this_period :=  nvl(l_act_rawcost_tc_this_period, 0);
9877     x_etc_rawcost_tc           :=    nvl(l_etc_rawcost_tc,0);
9878     x_prcnt_comp_effort        :=    nvl(l_prcnt_comp_effort,0);
9879     x_prcnt_spent_effort       :=    nvl(l_prcnt_spent_effort,0);
9880     x_eac_effort               :=    nvl(l_eac_effort,0);
9881     x_prcnt_comp_rawcost_tc    :=    nvl(l_prcnt_comp_rawcost_tc,0);
9882     x_prcnt_spent_rawcost_tc   :=    nvl(l_prcnt_spent_rawcost_tc,0);
9883     x_eac_rawcost_tc           :=    nvl(l_eac_rawcost_tc,0);
9884 
9885 EXCEPTION
9886     WHEN FND_API.G_EXC_ERROR THEN
9887       x_return_status := FND_API.G_RET_STS_ERROR;
9888       x_msg_count := Fnd_Msg_Pub.count_msg;
9889 
9890             -- 4537865
9891             x_act_rawcost_tc_this_period := 0 ;
9892         x_etc_rawcost_tc             := 0 ;
9893         x_prcnt_comp_effort          := 0 ;
9894         x_prcnt_spent_effort         := 0 ;
9895         x_eac_effort                 := 0 ;
9896         x_prcnt_comp_rawcost_tc      := 0 ;
9897         x_prcnt_spent_rawcost_tc     := 0 ;
9898         x_eac_rawcost_tc             := 0 ;
9899 
9900     WHEN OTHERS THEN
9901       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
9902       x_msg_count     := 1;
9903       x_msg_data      := SUBSTRB(SQLERRM,1,240);
9904 
9905             -- 4537865
9906             x_act_rawcost_tc_this_period := 0 ;
9907             x_etc_rawcost_tc             := 0 ;
9908             x_prcnt_comp_effort          := 0 ;
9909             x_prcnt_spent_effort         := 0 ;
9910             x_eac_effort                 := 0 ;
9911             x_prcnt_comp_rawcost_tc      := 0 ;
9912             x_prcnt_spent_rawcost_tc     := 0 ;
9913             x_eac_rawcost_tc             := 0 ;
9914     RAISE;
9915 
9916 END convert_effort_to_cost;
9917 --Added by rtarway for BUG 3815202
9918 FUNCTION get_last_published_perc_comp(
9919   p_project_id       NUMBER
9920  ,p_object_id        NUMBER
9921  ,p_as_of_date       Date
9922  ,p_object_type      VARCHAR2
9923 ) RETURN NUMBER
9924 IS
9925 l_last_submitted_perc_comp NUMBER ;
9926 Cursor c_get_last_submitted_perc_comp
9927 is
9928      select ppr.completed_percentage
9929      from pa_progress_rollup ppr
9930      where ppr.project_id = p_project_id
9931      and ppr.object_id = p_object_id
9932      and ppr.structure_type = 'WORKPLAN'
9933      and ppr.structure_version_id is null
9934      and ppr.object_type = p_object_type
9935      and ppr.current_flag <> 'W' -- Bug 3879461
9936      and ppr.as_of_date =
9937      (
9938           select max(ppr2.as_of_date)
9939           from pa_progress_rollup ppr2
9940           where ppr2.project_id = p_project_id
9941           and ppr2.object_id = p_object_id
9942           and ppr2.structure_type = 'WORKPLAN'
9943           and ppr2.structure_version_id is null
9944           and ppr.object_type = p_object_type
9945           and ppr2.as_of_date <= p_as_of_date
9946           and ppr2.current_flag = 'Y'
9947      );
9948 
9949 Begin
9950 l_last_submitted_perc_comp := null;
9951 OPEN c_get_last_submitted_perc_comp;
9952 FETCH c_get_last_submitted_perc_comp into l_last_submitted_perc_comp;
9953 CLOSE c_get_last_submitted_perc_comp;
9954 
9955 return l_last_submitted_perc_comp;
9956 END get_last_published_perc_comp;
9957 --Added by rtarway for BUG 3815202
9958 
9959 /* Bug # 3861344: Created API: return_start_end_date(). */
9960 
9961 Function return_start_end_date(
9962 p_scheduled_date    DATE        := NULL
9963 ,p_baselined_date   DATE        := NULL
9964 ,p_project_id       NUMBER
9965 ,p_proj_element_id  NUMBER
9966 ,p_object_type          VARCHAR2        := 'PA_TASKS'
9967 ,p_start_end_flag   VARCHAR2    := 'S'
9968 ) return date
9969 
9970 is
9971 
9972 cursor cur_lp_sch_start_date(p_str_ver_id NUMBER) is
9973 select scheduled_start_date
9974 from pa_proj_elem_ver_schedule ppevs
9975 where ppevs.project_id = p_project_id
9976 and  ppevs.proj_element_id = p_proj_element_id
9977 and ppevs.element_version_id = (select ppev.element_version_id
9978                 from pa_proj_element_versions ppev
9979                 where ppev.project_id = p_project_id
9980                 and ppev.proj_element_id = p_proj_element_id
9981                 and ppev.object_type = p_object_type
9982                 and ppev.parent_structure_version_id = p_str_ver_id);
9983 
9984 cursor cur_lp_sch_end_date(p_str_ver_id NUMBER) is
9985 select scheduled_finish_date
9986 from pa_proj_elem_ver_schedule ppevs
9987 where ppevs.project_id = p_project_id
9988 and  ppevs.proj_element_id = p_proj_element_id
9989 and ppevs.element_version_id = (select ppev.element_version_id
9990                                 from pa_proj_element_versions ppev
9991                                 where ppev.project_id = p_project_id
9992                                 and ppev.proj_element_id = p_proj_element_id
9993                                 and ppev.object_type = p_object_type
9994                                 and ppev.parent_structure_version_id = p_str_ver_id);
9995 
9996 l_lp_str_ver_id NUMBER  := NULL;
9997 
9998 l_return_date DATE  := NULL;
9999 
10000 begin
10001 
10002     -- If baselined date exists return the baselined date.
10003 
10004     if l_return_date is NULL then
10005 
10006         l_return_date := p_baselined_date;
10007 
10008     end if;
10009 
10010     -- If baselined date does not exist return the scheduled date from the latest published version.
10011 
10012     if l_return_date is NULL then
10013 
10014         -- Get latest published structure version id.
10015 
10016         l_lp_str_ver_id := PA_PROJ_ELEMENTS_UTILS.latest_published_ver_id(p_project_id,'WORKPLAN');
10017 
10018         if p_start_end_flag = 'S' then
10019 
10020             open cur_lp_sch_start_date(l_lp_str_ver_id);
10021             fetch cur_lp_sch_start_date into l_return_date;
10022             close cur_lp_sch_start_date;
10023 
10024         else
10025 
10026             open cur_lp_sch_end_date(l_lp_str_ver_id);
10027                     fetch cur_lp_sch_end_date into l_return_date;
10028                     close cur_lp_sch_end_date;
10029 
10030         end if;
10031 
10032     end if;
10033 
10034     -- If baselined date does and scheduled date from the latest published version do not exist
10035     -- return the scheduled date for the current element version.
10036 
10037     if l_return_date is NULL then
10038 
10039         l_return_date := p_scheduled_date;
10040 
10041     end if;
10042 
10043     return(l_return_date);
10044 
10045 end;
10046 
10047 
10048 -- Procedure to be called when applying latest progress to / publishing the working workplan version
10049 PROCEDURE check_txn_currency_diff
10050 (
10051     p_structure_version_id IN  NUMBER,
10052     p_context              IN  VARCHAR2 DEFAULT 'PUBLISH_STRUCTURE',
10053     x_return_status        OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
10054 )
10055 
10056 IS
10057 
10058 -- This cursor returns the information for the assignments with mismatched currencies.
10059 -- Bug 5059828. Changed substr to substrb
10060 
10061 CURSOR c_get_diff_cur_asgmts(p_struct_ver_id IN NUMBER) IS
10062     SELECT
10063     ra.resource_assignment_id,
10064     substrb(pe.element_number,1,30), -- Bug 4348814 : Added substr
10065     substrb(pe.name,1,30), -- Bug 4348814 : Added substr
10066     substrb(rlm.alias,1,40), -- Bug 4348814 : Added substr
10067     bl.txn_currency_code,
10068     pr.txn_currency_code
10069     FROM
10070     pa_proj_element_versions pev,
10071     pa_proj_elements pe,
10072     pa_resource_assignments ra,
10073     pa_resource_list_members rlm,
10074     pa_budget_lines bl,
10075     pa_progress_rollup pr
10076     WHERE
10077     pev.parent_structure_version_id = p_struct_ver_id AND
10078     pe.proj_element_id = pev.proj_element_id AND
10079     ra.wbs_element_version_id = pev.element_version_id AND
10080     rlm.resource_list_member_id = ra.resource_list_member_id AND
10081     bl.resource_assignment_id = ra.resource_assignment_id AND
10082     pr.project_id = ra.project_id AND
10083     pr.object_id = ra.resource_list_member_id AND
10084     pr.object_type = 'PA_ASSIGNMENTS' AND
10085     pr.structure_type = 'WORKPLAN' AND
10086     pr.proj_element_id = ra.task_id AND
10087     pr.current_flag = 'Y' AND
10088     pr.structure_version_id IS NULL AND
10089     bl.txn_currency_code <> pr.txn_currency_code
10090     GROUP BY
10091     ra.resource_assignment_id,
10092     pe.element_number,
10093     pe.name,
10094     rlm.alias,
10095     bl.txn_currency_code,
10096     pr.txn_currency_code;
10097 
10098 -- Bug 4348814 : Task number is 100 chars, name is 240 chars, currency is 15 chars in DB.
10099 -- whereas beloe plsql size is wrong.
10100 
10101 l_resource_assignment_id_tbl SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
10102 l_task_number_tbl            SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
10103 l_task_name_tbl              SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
10104 l_alias_tbl                  SYSTEM.PA_VARCHAR2_80_TBL_TYPE := SYSTEM.PA_VARCHAR2_80_TBL_TYPE();
10105 
10106 -- Bug 4348814 : Changed the currency table to 15 from 20
10107 l_currency_tbl               SYSTEM.PA_VARCHAR2_15_TBL_TYPE := SYSTEM.PA_VARCHAR2_15_TBL_TYPE();
10108 l_actual_currency_tbl            SYSTEM.PA_VARCHAR2_15_TBL_TYPE := SYSTEM.PA_VARCHAR2_15_TBL_TYPE();
10109 
10110 l_error_msg VARCHAR2(2000);
10111 l_error_count NUMBER;
10112 l_debug_mode varchar2(1);
10113 BEGIN
10114     -- Bug 4348814 : Added Debug Msgs
10115     x_return_status := FND_API.G_RET_STS_SUCCESS;
10116 
10117         l_debug_mode := NVL(FND_PROFILE.value_specific('PA_DEBUG_MODE',fnd_global.user_id,fnd_global.login_id,275,null,null), 'N');
10118 
10119         IF l_debug_mode  = 'Y' THEN
10120                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CHECK_TXN_CURRENCY_DIFF', x_Msg => 'p_structure_version_id='||p_structure_version_id, x_Log_Level=>     3);
10121                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CHECK_TXN_CURRENCY_DIFF', x_Msg => 'p_context='||p_context, x_Log_Level=>     3);
10122                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CHECK_TXN_CURRENCY_DIFF', x_Msg => 'Open Cursor c_get_diff_cur_asgmts', x_Log_Level=>     3);
10123         END IF;
10124 
10125 
10126     OPEN c_get_diff_cur_asgmts(p_structure_version_id);
10127     FETCH c_get_diff_cur_asgmts BULK COLLECT INTO l_resource_assignment_id_tbl, l_task_number_tbl,
10128     l_task_name_tbl, l_alias_tbl, l_currency_tbl, l_actual_currency_tbl;
10129     CLOSE c_get_diff_cur_asgmts;
10130 
10131     l_error_count := l_resource_assignment_id_tbl.COUNT;
10132 
10133         IF l_debug_mode  = 'Y' THEN
10134                 pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.CHECK_TXN_CURRENCY_DIFF', x_Msg => 'l_error_count='||l_error_count, x_Log_Level=>     3);
10135         END IF;
10136 
10137 
10138     IF l_error_count > 0 THEN
10139         x_return_status := FND_API.G_RET_STS_ERROR;
10140         FOR i in 1..l_error_count LOOP
10141             IF i = 1 THEN
10142                 l_error_msg := l_task_number_tbl(i) || ', ' || l_alias_tbl(i) || ', ' || l_actual_currency_tbl(i);
10143             ELSE
10144                 IF length (l_error_msg) >= 1700 THEN -- Bug 4348814 : Added so numeric and value error does not come
10145                     exit;
10146                 END IF;
10147                 l_error_msg := l_error_msg || '; ' || l_task_number_tbl(i) || ', ' || l_alias_tbl(i) || ', ' || l_actual_currency_tbl(i);
10148             END IF;
10149         END LOOP;
10150 
10151         --Bug 5059828. Doing this to avoid numeric/value error. Pls refer to code above
10152         --that has a similar check.
10153         l_error_msg := substrb(l_error_msg,1,1700);
10154 
10155         IF p_context = 'PUBLISH_STRUCTURE' THEN
10156             PA_UTILS.ADD_MESSAGE
10157             (
10158                 p_app_short_name => 'PA',
10159                 p_msg_name       => 'PA_PUB_MISM_CUR_ERR',
10160                 p_token1         => 'PL_RES_LIST',
10161                 p_value1         =>  l_error_msg
10162             );
10163         ELSIF p_context = 'APPLY_PROGRESS' THEN
10164             PA_UTILS.ADD_MESSAGE
10165             (
10166                 p_app_short_name => 'PA',
10167                 p_msg_name       => 'PA_APPLY_PROG_MISM_CUR_ERR',
10168                 p_token1         => 'PL_RES_LIST',
10169                 p_value1         =>  l_error_msg
10170             );
10171         END IF;
10172     END IF;
10173 
10174     EXCEPTION WHEN OTHERS THEN
10175         x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR ; -- 4537865
10176         RAISE;
10177 
10178 END check_txn_currency_diff;
10179 
10180 
10181 
10182 
10183 
10184 -- Procedure to be called when updating task assignments for progress related business rules check.
10185 PROCEDURE check_prog_for_update_asgmts
10186 (
10187     p_task_assignment_tbl IN  PA_TASK_ASSIGNMENT_UTILS.l_resource_rec_tbl_type,
10188     x_return_status       OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
10189 )
10190 
10191 IS
10192 
10193 CURSOR get_all_parameters IS
10194     SELECT
10195     ra.resource_assignment_id,
10196     ra.resource_list_member_id,
10197     rat.resource_list_member_id,
10198     pr.txn_currency_code,
10199     rat.override_currency_code,
10200     ra.project_role_id,
10201     rat.project_role_id,
10202     ra.total_plan_quantity,
10203     rat.total_quantity,
10204     decode(ra.resource_class_code, 'PEOPLE', pr.ppl_act_effort_to_date,
10205                                    'EQUIPMENT', pr.eqpmt_act_effort_to_date ,pr.oth_quantity_to_date),
10206     pr.actual_finish_date,
10207     ra.schedule_start_date,
10208     ra.schedule_end_date,
10209     rat.schedule_start_date,
10210     rat.schedule_end_date,
10211     decode(pr.structure_version_id, NULL, 'Y', 'N')
10212     FROM
10213     pa_res_asgmts_temp rat,
10214     pa_resource_assignments ra,
10215     pa_proj_element_versions pev,
10216     pa_progress_rollup pr
10217     WHERE
10218     ra.resource_assignment_id = rat.resource_assignment_id AND
10219     pev.element_version_id = ra.wbs_element_version_id AND
10220     pr.project_id = ra.project_id AND
10221     pr.object_id = ra.resource_list_member_id AND
10222     pr.object_type = 'PA_ASSIGNMENTS' AND
10223     pr.structure_type = 'WORKPLAN' AND
10224     pr.proj_element_id = ra.task_id AND
10225     pr.current_flag = 'Y' AND
10226     (pr.structure_version_id IS NULL OR pr.structure_version_id = pev.parent_structure_version_id);
10227 
10228 l_res_asgmt_id_tbl          SYSTEM.PA_NUM_TBL_TYPE          := SYSTEM.PA_NUM_TBL_TYPE();
10229 l_old_rlm_id_tbl            SYSTEM.PA_NUM_TBL_TYPE          := SYSTEM.PA_NUM_TBL_TYPE();
10230 l_new_rlm_id_tbl            SYSTEM.PA_NUM_TBL_TYPE          := SYSTEM.PA_NUM_TBL_TYPE();
10231 l_actual_cur_tbl            SYSTEM.PA_VARCHAR2_15_TBL_TYPE  := SYSTEM.PA_VARCHAR2_15_TBL_TYPE();
10232 l_override_cur_tbl          SYSTEM.PA_VARCHAR2_15_TBL_TYPE  := SYSTEM.PA_VARCHAR2_15_TBL_TYPE();
10233 l_old_project_role_id_tbl   SYSTEM.PA_NUM_TBL_TYPE          := SYSTEM.PA_NUM_TBL_TYPE();
10234 l_new_project_role_id_tbl   SYSTEM.PA_NUM_TBL_TYPE          := SYSTEM.PA_NUM_TBL_TYPE();
10235 l_old_total_qty_tbl         SYSTEM.PA_NUM_TBL_TYPE          := SYSTEM.PA_NUM_TBL_TYPE();
10236 l_new_total_qty_tbl         SYSTEM.PA_NUM_TBL_TYPE          := SYSTEM.PA_NUM_TBL_TYPE();
10237 l_actual_qty_tbl            SYSTEM.PA_NUM_TBL_TYPE          := SYSTEM.PA_NUM_TBL_TYPE();
10238 l_actual_finish_date_tbl    SYSTEM.PA_DATE_TBL_TYPE         := SYSTEM.PA_DATE_TBL_TYPE();
10239 l_old_sched_start_date_tbl  SYSTEM.PA_DATE_TBL_TYPE         := SYSTEM.PA_DATE_TBL_TYPE();
10240 l_old_sched_finish_date_tbl SYSTEM.PA_DATE_TBL_TYPE         := SYSTEM.PA_DATE_TBL_TYPE();
10241 l_new_sched_start_date_tbl  SYSTEM.PA_DATE_TBL_TYPE         := SYSTEM.PA_DATE_TBL_TYPE();
10242 l_new_sched_finish_date_tbl SYSTEM.PA_DATE_TBL_TYPE         := SYSTEM.PA_DATE_TBL_TYPE();
10243 l_lat_pub_prog_flag_tbl     SYSTEM.PA_VARCHAR2_1_TBL_TYPE   := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
10244 
10245 l_num_of_asgmts NUMBER;
10246 l_viol_indicator NUMBER;
10247 l_num_of_rows NUMBER;
10248 l_db_block_size NUMBER;
10249 l_num_blocks NUMBER;
10250 
10251 BEGIN
10252 
10253     x_return_status := FND_API.G_RET_STS_SUCCESS;
10254 
10255     l_num_of_asgmts := p_task_assignment_tbl.COUNT;
10256 
10257     SELECT to_number(value)
10258     INTO   l_db_block_size
10259     FROM   v$parameter
10260     WHERE  name = 'db_block_size';
10261 
10262     l_num_blocks := 1.25 * (l_num_of_asgmts * 75) / l_db_block_size;
10263 
10264     IF l_num_of_asgmts > 0 THEN
10265 
10266         -- Put the input parameters in individual tables for insert.
10267         l_res_asgmt_id_tbl.extend(l_num_of_asgmts);
10268         l_new_rlm_id_tbl.extend(l_num_of_asgmts);
10269         l_override_cur_tbl.extend(l_num_of_asgmts);
10270         l_new_project_role_id_tbl.extend(l_num_of_asgmts);
10271         l_new_total_qty_tbl.extend(l_num_of_asgmts);
10272         l_new_sched_start_date_tbl.extend(l_num_of_asgmts);
10273         l_new_sched_finish_date_tbl.extend(l_num_of_asgmts);
10274 
10275         FOR i IN 1..l_num_of_asgmts LOOP
10276             l_res_asgmt_id_tbl(i)           := p_task_assignment_tbl(i).resource_assignment_id;
10277             l_new_rlm_id_tbl(i)             := p_task_assignment_tbl(i).resource_list_member_id;
10278             l_override_cur_tbl(i)           := p_task_assignment_tbl(i).override_currency_code;
10279             l_new_project_role_id_tbl(i)    := p_task_assignment_tbl(i).project_role_id;
10280             l_new_total_qty_tbl(i)          := p_task_assignment_tbl(i).total_quantity;
10281             l_new_sched_start_date_tbl(i)   := p_task_assignment_tbl(i).schedule_start_date;
10282             l_new_sched_finish_date_tbl(i)  := p_task_assignment_tbl(i).schedule_end_date;
10283         END LOOP;
10284 
10285         -- Manually seed the statistics for the temporary table.
10286         -- Need to do it before populating the table otherwise the table will be emptied.
10287         PA_TASK_ASSIGNMENT_UTILS.set_table_stats('PA','PA_RES_ASGMTS_TEMP', l_num_of_asgmts, l_num_blocks, 75);
10288 
10289         -- Populate the temporary table with the parameters passed in.
10290         DELETE pa_res_asgmts_temp;
10291         FORALL j IN 1..p_task_assignment_tbl.COUNT
10292             INSERT INTO pa_res_asgmts_temp VALUES
10293                 (l_res_asgmt_id_tbl(j), l_new_rlm_id_tbl(j), l_override_cur_tbl(j), l_new_project_role_id_tbl(j),
10294                 l_new_total_qty_tbl(j), l_new_sched_start_date_tbl(j), l_new_sched_finish_date_tbl(j));
10295 
10296         -- Initialize the arrays.
10297         l_res_asgmt_id_tbl          := SYSTEM.PA_NUM_TBL_TYPE();
10298         l_new_rlm_id_tbl            := SYSTEM.PA_NUM_TBL_TYPE();
10299         l_override_cur_tbl          := SYSTEM.PA_VARCHAR2_15_TBL_TYPE();
10300         l_new_project_role_id_tbl   := SYSTEM.PA_NUM_TBL_TYPE();
10301         l_new_total_qty_tbl         := SYSTEM.PA_NUM_TBL_TYPE();
10302         l_new_sched_start_date_tbl  := SYSTEM.PA_DATE_TBL_TYPE();
10303         l_new_sched_finish_date_tbl := SYSTEM.PA_DATE_TBL_TYPE();
10304 
10305         -- Populate all the parameters.
10306         OPEN get_all_parameters;
10307         FETCH get_all_parameters BULK COLLECT INTO l_res_asgmt_id_tbl, l_old_rlm_id_tbl, l_new_rlm_id_tbl,
10308         l_actual_cur_tbl, l_override_cur_tbl, l_old_project_role_id_tbl, l_new_project_role_id_tbl,
10309         l_old_total_qty_tbl, l_new_total_qty_tbl, l_actual_qty_tbl, l_actual_finish_date_tbl,
10310         l_old_sched_start_date_tbl, l_old_sched_finish_date_tbl, l_new_sched_start_date_tbl,
10311         l_new_sched_finish_date_tbl, l_lat_pub_prog_flag_tbl;
10312         CLOSE get_all_parameters;
10313 
10314         l_num_of_rows := l_res_asgmt_id_tbl.COUNT;
10315 
10316         IF l_num_of_rows > 0 THEN
10317 
10318             FOR k IN 1..l_num_of_rows LOOP
10319 
10320                 -- Initialize the indicator.
10321                 l_viol_indicator := NULL;
10322 
10323                 -- Latest progress entered. Use this row to compare the override currency and the currency of the actuals.
10324                 IF l_lat_pub_prog_flag_tbl(k) = 'Y' THEN
10325 
10326                     -- Cannot override the currency if progress has been collected.
10327                     IF ( l_actual_cur_tbl(k) IS NOT NULL AND l_override_cur_tbl(k) IS NOT NULL
10328                          AND l_actual_cur_tbl(k) <> l_override_cur_tbl(k) ) THEN
10329                         l_viol_indicator := 1;
10330                     END IF;
10331 
10332                 -- Progress applied to the working version. Check the other business rules.
10333                 ELSE -- l_lat_pub_prog_flag_tbl(k) <> 'Y'
10334 
10335                     -- Cannot change the planning resource if progress has been applied to the working version.
10336                     IF ( l_new_rlm_id_tbl(k) = FND_API.G_MISS_NUM AND l_old_rlm_id_tbl IS NOT NULL) OR
10337                        ( l_new_rlm_id_tbl(k) <> FND_API.G_MISS_NUM AND l_new_rlm_id_tbl(k) IS NOT NULL
10338                          AND ( l_new_rlm_id_tbl(k) <> l_old_rlm_id_tbl(k) OR l_old_rlm_id_tbl(k) IS NULL) ) THEN
10339                         l_viol_indicator := 2;
10340                     END IF;
10341 
10342                     -- Cannot change the project role if progress has been applied to the working version.
10343                     IF ( l_new_project_role_id_tbl(k) = FND_API.G_MISS_NUM AND l_old_project_role_id_tbl(k) IS NOT NULL )
10344                        OR ( l_new_project_role_id_tbl(k) <> FND_API.G_MISS_NUM AND l_new_project_role_id_tbl(k) IS NOT NULL AND
10345                        ( l_old_project_role_id_tbl(k) <> l_new_project_role_id_tbl(k) OR l_old_project_role_id_tbl(k) IS NULL ) ) THEN
10346                         l_viol_indicator := 3;
10347                     END IF;
10348 		    /* Bug Fix 5726773
10349  	                As a part of supporting negative quantities and amounts the following check is commented out.
10350 
10351                     -- Cannot decrease planned quantity below actual quantity.
10352                     IF ( l_actual_qty_tbl(k) IS NOT NULL AND l_new_total_qty_tbl(k) IS NOT NULL AND
10353                        ( l_new_total_qty_tbl(k) = FND_API.G_MISS_NUM OR l_new_total_qty_tbl(k) < l_actual_qty_tbl(k) ) ) THEN
10354                         l_viol_indicator := 4;
10355                     END IF;
10356 		    */
10357  	            -- End of Bug Fix 5726773
10358 
10359                     /* Bug 4570108
10360 		    9/02 M-closeout - Based on discussion with Koushik, Sakthi, Ansari, removing this check:
10361                     -- If the assignment is completed.
10362                     IF ( l_actual_finish_date_tbl(k) IS NOT NULL ) THEN
10363 
10364                         -- Cannot change the scheduled start date if an actual end date has been entered.
10365                         IF ( l_new_sched_start_date_tbl(k) = FND_API.G_MISS_DATE AND l_old_sched_start_date_tbl(k) IS NOT NULL )
10366                            OR ( l_new_sched_start_date_tbl(k) <> FND_API.G_MISS_DATE AND l_new_sched_start_date_tbl(k) IS NOT NULL AND
10367                               (l_new_sched_start_date_tbl(k) <> l_old_sched_start_date_tbl(k) OR l_old_sched_start_date_tbl(k) IS NULL) ) THEN
10368                             l_viol_indicator := 6;
10369                         END IF;
10370 
10371                         -- Cannot change the scheduled finish date if an actual end date has been entered.
10372                         IF ( l_new_sched_finish_date_tbl(k) = FND_API.G_MISS_DATE
10373                            AND l_old_sched_finish_date_tbl(k) IS NOT NULL ) OR
10374                            ( l_new_sched_finish_date_tbl(k) <> FND_API.G_MISS_DATE AND
10375                            l_new_sched_finish_date_tbl(k) IS NOT NULL AND ( l_new_sched_finish_date_tbl(k) <> l_old_sched_finish_date_tbl(k)
10376                            OR l_old_sched_finish_date_tbl(k) IS NULL) ) THEN
10377                             l_viol_indicator := 7;
10378                         END IF;
10379 
10380                     END IF; -- l_actual_finish_date_tbl(k) IS NOT NULL
10381 		    */
10382 
10383                 END IF; -- l_lat_pub_prog_flag_tbl(k) = 'Y'
10384 
10385                 IF l_viol_indicator IS NOT NULL THEN
10386 
10387                     x_return_status := FND_API.G_RET_STS_ERROR;
10388 
10389                     IF l_viol_indicator = 1 THEN
10390                         PA_UTILS.ADD_MESSAGE
10391                         (
10392                             p_app_short_name => 'PA',
10393                             p_msg_name       => 'PA_UP_TA_CUR_ERR',
10394                             p_token1         => 'ACTUAL_CURRENCY',
10395                             p_value1         =>  l_actual_cur_tbl(k)
10396                         );
10397                     ELSIF l_viol_indicator = 2 OR l_viol_indicator = 3 THEN
10398                         PA_UTILS.ADD_MESSAGE
10399                         (
10400                             p_app_short_name => 'PA',
10401                             p_msg_name       => 'PA_UP_TA_PL_RES_ERR'
10402                         );
10403                     ELSIF l_viol_indicator = 4 THEN
10404                         PA_UTILS.ADD_MESSAGE
10405                         (
10406                             p_app_short_name => 'PA',
10407                             p_msg_name       => 'PA_UP_TA_DECR_QTY_ERR'
10408                         );
10409                     ELSIF l_viol_indicator = 6 OR l_viol_indicator = 7 THEN
10410                         PA_UTILS.ADD_MESSAGE
10411                         (
10412                             p_app_short_name => 'PA',
10413                             p_msg_name       => 'PA_UP_TA_ASMT_END_ERR'
10414                         );
10415                     END IF; -- l_viol_indicator
10416 
10417                 END IF; -- l_viol_indicator IS NOT NULL
10418 
10419             END LOOP;
10420 
10421         END IF; -- l_num_of_rows > 0
10422 
10423     END IF; -- l_num_of_asgmts > 0
10424 
10425     EXCEPTION WHEN OTHERS THEN
10426         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10427         RAISE;
10428 
10429 END check_prog_for_update_asgmts;
10430 
10431 -- Bug # 3910193: Created API: convert_effort_to_cost_brdn_pc().
10432 
10433 PROCEDURE convert_effort_to_cost_brdn_pc
10434 (   p_resource_list_mem_id      IN                        NUMBER
10435     ,p_project_id                   IN                        NUMBER
10436     ,p_task_id              IN                    NUMBER
10437     ,p_as_of_date           IN                    DATE
10438     ,p_structure_version_id         IN                        NUMBER
10439     ,p_txn_currency_code            IN                        VARCHAR
10440     ,p_planned_quantity             IN                        NUMBER
10441     ,p_act_quantity_this_period     IN                        NUMBER
10442     ,p_act_quantity                 IN                        NUMBER
10443     ,p_act_brdncost_pc              IN                        NUMBER
10444     ,p_etc_quantity                 IN                        NUMBER
10445     ,p_rate_based_flag              IN                        VARCHAR := 'Y'
10446     ,x_act_brdncost_pc_this_period      OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10447     ,x_etc_brdncost_pc                  OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10448     ,x_prcnt_comp_quantity              OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10449     ,x_prcnt_spent_quantity             OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10450     ,x_eac_quantity                 OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10451     ,x_prcnt_comp_brdncost_pc       OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10452     ,x_prcnt_spent_brdncost_pc      OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10453     ,x_eac_brdncost_pc              OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10454     ,x_return_status            OUT                       NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
10455     ,x_msg_count            OUT                       NOCOPY NUMBER --File.Sql.39 bug 4440895
10456     ,x_msg_data             OUT                       NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
10457 )
10458 
10459 IS
10460       /* commented out, performance issue
10461     cursor cur_ptav is
10462     select planned_bur_cost_proj_cur
10463     from pa_task_asgmts_v
10464     where project_id = p_project_id
10465     and task_id = p_task_id
10466     and structure_version_id = p_structure_version_id
10467     and resource_list_member_id = p_resource_list_mem_id;
10468       */
10469 
10470      cursor cur_ptav is
10471      select pra.total_project_burdened_cost as planned_bur_cost_proj_cur
10472      , pra.resource_assignment_id -- Bug 4372462
10473      , pra.budget_version_id -- Bug 4372462
10474        FROM pa_resource_assignments pra,
10475             PA_PROJ_ELEMENT_VERSIONS PPEV
10476       where pra.resource_list_member_id = p_resource_list_mem_id
10477         and pra.task_id = p_task_id
10478         AND PPEV.PROJECT_ID = p_project_id
10479         AND PPEV.PARENT_STRUCTURE_VERSION_ID = p_structure_version_id
10480         AND pra.TASK_ID = PPEV.PROJ_ELEMENT_ID
10481         AND pra.wbs_element_version_id = ppev.element_version_id;
10482 
10483     l_cur_ptav          NUMBER;
10484     l_resource_assignment_id    NUMBER; -- Bug 4372462
10485     l_budget_version_id     NUMBER; -- Bug 4372462
10486 
10487     l_planned_brdncost_pc       NUMBER       := null;
10488 
10489         l_plan_res_cur_code             VARCHAR2(30)     := null;
10490 
10491         l_plan_res_burden_rate_etc      NUMBER           := null;
10492         l_plan_res_burden_rate_act      NUMBER           := null;
10493 
10494         l_plan_res_raw_rate         NUMBER           := null;
10495 
10496         l_plan_burden_multiplier_etc    NUMBER           := null;
10497         l_plan_burden_multiplier_act    NUMBER           := null;
10498 
10499     l_rawcost_pc            NUMBER       := null;
10500     l_rawcost_fc            NUMBER       := null;
10501 
10502     l_txn_currency_code     VARCHAR2(15)     := null;
10503 
10504     l_project_curr_code             VARCHAR2(30);
10505         l_project_rate_type             VARCHAR2(30);
10506         l_project_rate_date             DATE;
10507         l_project_exch_rate             NUMBER;
10508 
10509     l_projfunc_curr_code            VARCHAR2(30);
10510         l_projfunc_cost_rate_type       VARCHAR2(30);
10511         l_projfunc_cost_rate_date       DATE;
10512         l_projfunc_cost_exch_rate       NUMBER;
10513 
10514     l_etc_brdncost_tc       NUMBER        := null;
10515     l_etc_brdncost_pc       NUMBER        := null;
10516 
10517     l_act_brdncost_pc       NUMBER        := null;
10518 
10519     l_act_brdncost_tc_this_period   NUMBER        := null;
10520     l_act_brdncost_pc_this_period   NUMBER        := null;
10521 
10522     l_act_quantity_to_date      NUMBER        := null;
10523     l_act_brdncost_to_date_pc   NUMBER        := null;
10524 
10525     l_eac_quantity          NUMBER        := null;
10526     l_eac_brdncost_pc       NUMBER        := null;
10527 
10528     l_prcnt_comp_quantity       NUMBER        := null;
10529     l_prcnt_spent_quantity      NUMBER        := null;
10530 
10531     l_prcnt_comp_brdncost_pc    NUMBER        := null;
10532     l_prcnt_spent_brdncost_pc   NUMBER        := null;
10533 
10534     l_return_status                 VARCHAR2(1)       := null;
10535         l_msg_count                     NUMBER            := null;
10536         l_msg_data                      VARCHAR2(250)     := null;
10537 
10538         g1_debug_mode               VARCHAR2(1);
10539     l_track_wp_cost_flag  VARCHAR2(1) := 'Y'; -- Bug 3921624
10540 
10541 
10542 BEGIN
10543      l_return_status := fnd_api.g_ret_sts_success ; -- 4537865
10544      g1_debug_mode := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
10545 
10546      IF g1_debug_mode  = 'Y' THEN
10547          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_resource_list_mem_id='||p_resource_list_mem_id, x_Log_Level=> 3);
10548          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_project_id='||p_project_id, x_Log_Level=> 3);
10549          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_structure_version_id='||p_structure_version_id, x_Log_Level=> 3);
10550          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_txn_currency_code='||p_txn_currency_code, x_Log_Level=> 3);
10551          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_planned_quantity='||p_planned_quantity, x_Log_Level=> 3);
10552          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_act_quantity_this_period='||p_act_quantity_this_period, x_Log_Level=> 3);
10553          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_act_quantity='||p_act_quantity, x_Log_Level=> 3);
10554              pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_act_brdncost_pc='||p_act_brdncost_pc, x_Log_Level=> 3);
10555          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_etc_quantity='||p_etc_quantity, x_Log_Level=> 3);
10556          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'p_rate_based_flag='||p_rate_based_flag, x_Log_Level=> 3);
10557      END IF;
10558 
10559      FND_MSG_PUB.initialize;
10560 
10561      l_track_wp_cost_flag :=  pa_fp_wp_gen_amt_utils.get_wp_track_cost_amt_flag(p_project_id);  --Bug 3921624
10562 
10563      IF NVL(l_track_wp_cost_flag, 'Y') = 'Y' THEN   --Bug 3921624
10564     --  1). Get the input act_brdncost_pc into the corresponding local variable.
10565 
10566         l_act_brdncost_pc := nvl(p_act_brdncost_pc,0);
10567 
10568     --  2). Get the planned_brdncost_pc from pa_task_assignments_v;
10569 
10570     open cur_ptav;
10571     fetch cur_ptav into l_cur_ptav, l_resource_assignment_id,l_budget_version_id ; -- Bug 4372462 : Added l_resource_assignment_id and l_budget_version_id
10572     close cur_ptav;
10573 
10574 
10575     l_planned_brdncost_pc := nvl(l_cur_ptav,0);
10576 
10577     -- 3.1). Get resource rate burden multiplier to convert etc_rawcost to etc_brdncost and resource burden rate to convert etc_effort to etc_brdncost in tc.
10578 
10579     l_plan_res_cur_code               := null;
10580         l_plan_res_raw_rate           := null;
10581         l_return_status                   := null;
10582         l_msg_count                       := null;
10583         l_msg_data                        := null;
10584     l_plan_burden_multiplier_etc      := null;
10585     l_plan_res_burden_rate_etc        := null;
10586 
10587     PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier(
10588                 P_res_list_mem_id              => p_resource_list_mem_id
10589                 ,P_project_id                  => p_project_id
10590                 ,P_task_id                     => p_task_id      --bug 3927159
10591             ,p_as_of_date                  => p_as_of_date   --bug 3927159
10592                 ,p_structure_version_id        => p_structure_version_id
10593                 ,p_currency_code               => p_txn_currency_code
10594                 ,p_calling_mode                => 'PLAN_RATES'
10595                 ,x_resource_curr_code          => l_plan_res_cur_code
10596                 ,x_resource_raw_rate           => l_plan_res_raw_rate
10597                 ,x_resource_burden_rate        => l_plan_res_burden_rate_etc
10598                 ,X_burden_multiplier           => l_plan_burden_multiplier_etc
10599                 ,x_return_status               => l_return_status
10600                 ,x_msg_count                   => l_msg_count
10601                 ,x_msg_data                    => l_msg_data);
10602 
10603     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10604             x_return_status := 'E';
10605         RAISE  FND_API.G_EXC_ERROR;
10606     END IF;
10607 
10608         -- 3.2). If the rate_based_flag is 'Y' and the resource burden rate currency code is not the same as the txn currency code, convert the resource burden rate into txn currency.
10609     --    To do this we use the API: PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS() and we pass in
10610     --    txn_currency code into the projfunc_currency_code parameter and read out the value of
10611     --    the parameter projfunc_raw_cost.
10612 
10613     IF ((p_rate_based_flag = 'Y') and (p_txn_currency_code <> l_plan_res_cur_code)) then
10614             l_rawcost_pc := null;
10615             l_txn_currency_code := p_txn_currency_code;
10616 
10617         PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS(
10618                 p_project_id               =>  p_project_id
10619                 ,p_task_id                  => p_task_id
10620                 ,p_as_of_date               => p_as_of_date
10621                 ,p_txn_cost                 => l_plan_res_burden_rate_etc
10622                 ,p_txn_curr_code            => l_plan_res_cur_code
10623             ,p_structure_version_id     => p_structure_version_id
10624             ,p_project_curr_code        => l_txn_currency_code ---l_project_curr_code
10625                 ,p_project_rate_type        => l_project_rate_type
10626                 ,p_project_rate_date        => l_project_rate_date
10627                 ,p_project_exch_rate        => l_project_exch_rate
10628                 ,p_project_raw_cost         => l_rawcost_pc
10629             ,p_projfunc_curr_code       => l_projfunc_curr_code ---txn_currency_code
10630                 ,p_projfunc_cost_rate_type  => l_projfunc_cost_rate_type
10631                 ,p_projfunc_cost_rate_date  => l_projfunc_cost_rate_date
10632                 ,p_projfunc_cost_exch_rate  => l_projfunc_cost_exch_rate
10633                 ,p_projfunc_raw_cost        => l_rawcost_fc
10634                 ,x_return_status            => l_return_status
10635                 ,x_msg_count                => l_msg_count
10636                 ,x_msg_data                 => l_msg_data
10637             );
10638 
10639             IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10640         x_return_status := 'E';
10641         RAISE  FND_API.G_EXC_ERROR;
10642             END IF;
10643 
10644         l_plan_res_burden_rate_etc :=   l_rawcost_pc;
10645 
10646     END IF;
10647 
10648     -- 4.1). Get resource rate burden multiplier to convert act_rawcost_this_period to
10649     --    act_brdncost_this_period and resource burden rate to convert act_effort_this_period
10650     --    to act_brdncost_tc_this_period.
10651 
10652     l_plan_res_cur_code               := null;
10653         l_plan_res_raw_rate           := null;
10654         l_return_status                   := null;
10655         l_msg_count                       := null;
10656         l_msg_data                        := null;
10657 
10658     l_plan_burden_multiplier_act      := null;
10659     l_plan_res_burden_rate_act        := null;
10660 
10661     PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier(
10662                     P_res_list_mem_id              => p_resource_list_mem_id
10663                 ,P_project_id                  => p_project_id
10664                 ,P_task_id                     => p_task_id      --bug 3927159
10665             ,p_as_of_date                  => p_as_of_date   --bug 3927159
10666                 ,p_structure_version_id        => p_structure_version_id
10667                 ,p_currency_code               => p_txn_currency_code
10668                 ,p_calling_mode                => 'ACTUAL_RATES'
10669                 ,x_resource_curr_code          => l_plan_res_cur_code
10670                 ,x_resource_raw_rate           => l_plan_res_raw_rate
10671                 ,x_resource_burden_rate        => l_plan_res_burden_rate_act
10672                 ,X_burden_multiplier           => l_plan_burden_multiplier_act
10673                 ,x_return_status               => l_return_status
10674                 ,x_msg_count                   => l_msg_count
10675                 ,x_msg_data                    => l_msg_data);
10676 
10677     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10678              x_return_status := 'E';
10679              RAISE  FND_API.G_EXC_ERROR;
10680     END IF;
10681 
10682     -- 4.2). If the rate_based_flag is 'Y' and the resource burden rate currency code is
10683     --    not the same as the txn currency code, convert the resource burden rate into txn currency.
10684     --    To do this we use the API: PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS() and we pass in
10685     --    txn_currency code into the projfunc_currency_code parameter and read out the value of
10686     --    the parameter projfunc_raw_cost.
10687 
10688     IF ((p_rate_based_flag = 'Y') and (p_txn_currency_code <> l_plan_res_cur_code)) then
10689 
10690         l_rawcost_pc := null;
10691             l_txn_currency_code := p_txn_currency_code;
10692         PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS(
10693                 p_project_id               =>  p_project_id
10694                 ,p_task_id                  => p_task_id
10695                 ,p_as_of_date               => p_as_of_date
10696                 ,p_txn_cost                 => l_plan_res_burden_rate_act
10697                 ,p_txn_curr_code            => l_plan_res_cur_code
10698             ,p_structure_version_id     => p_structure_version_id
10699             ,p_project_curr_code        => l_txn_currency_code ---l_project_curr_code
10700                 ,p_project_rate_type        => l_project_rate_type
10701                 ,p_project_rate_date        => l_project_rate_date
10702                 ,p_project_exch_rate        => l_project_exch_rate
10703                 ,p_project_raw_cost         => l_rawcost_pc
10704             ,p_projfunc_curr_code       => l_projfunc_curr_code ---l_txn_currency_code
10705                 ,p_projfunc_cost_rate_type  => l_projfunc_cost_rate_type
10706                 ,p_projfunc_cost_rate_date  => l_projfunc_cost_rate_date
10707                 ,p_projfunc_cost_exch_rate  => l_projfunc_cost_exch_rate
10708                 ,p_projfunc_raw_cost        => l_rawcost_fc
10709                 ,x_return_status            => l_return_status
10710                 ,x_msg_count                => l_msg_count
10711                 ,x_msg_data                 => l_msg_data
10712             );
10713 
10714             IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10715         x_return_status := 'E';
10716         RAISE  FND_API.G_EXC_ERROR;
10717             END IF;
10718 
10719         l_plan_res_burden_rate_act :=   l_rawcost_pc;
10720     END IF;
10721 
10722      -- If (p_rate_based_flag  = 'N'), the input quantity values are rawcost_tc values.
10723     If (p_rate_based_flag = 'N') then
10724 
10725       -- 5.1). Use the resource rate burden multiplier to convert etc_rawcost_tc into etc_brdncost_tc.
10726 
10727       --l_etc_brdncost_tc := nvl(pa_currency.round_trans_currency_amt((nvl(p_etc_quantity,0) * nvl(l_plan_burden_multiplier_etc,0)), p_txn_currency_code),0) + nvl(p_etc_quantity,0);
10728             l_etc_brdncost_tc := nvl(pa_currency.round_trans_currency_amt1((nvl(p_etc_quantity,0) * nvl(l_plan_burden_multiplier_etc,0)), p_txn_currency_code),0) + nvl(p_etc_quantity,0);
10729       -- 5.2). Use the resource rate burden multiplier to convert act_rawcost_tc_this_period into  act_brdncost_tc_this_period.
10730 
10731       --l_act_brdncost_tc_this_period := nvl(pa_currency.round_trans_currency_amt(
10732     --          (nvl(p_act_quantity_this_period,0) * nvl(l_plan_burden_multiplier_act,0)), p_txn_currency_code),0) + nvl(p_act_quantity_this_period,0);
10733 
10734         l_act_brdncost_tc_this_period := nvl(pa_currency.round_trans_currency_amt1(
10735                 (nvl(p_act_quantity_this_period,0) * nvl(l_plan_burden_multiplier_act,0)), p_txn_currency_code),0) + nvl(p_act_quantity_this_period,0);
10736 
10737     else
10738 
10739        -- 6.1). Use resource burden rate to convert etc_effort into etc_brdncost_tc:
10740 
10741        --l_etc_brdncost_tc := pa_currency.round_trans_currency_amt((nvl(p_etc_quantity,0) * nvl(l_plan_res_burden_rate_etc,0)), p_txn_currency_code);
10742        l_etc_brdncost_tc := pa_currency.round_trans_currency_amt1((nvl(p_etc_quantity,0) * nvl(l_plan_res_burden_rate_etc,0)), p_txn_currency_code);
10743 
10744         -- 6.2). Use resource burden rate to convert act_effort_this_period into
10745         --       act_brdncost_tc_this_period.
10746 
10747            --l_act_brdncost_tc_this_period := pa_currency.round_trans_currency_amt(
10748         --      (nvl(p_act_quantity_this_period,0) * nvl(l_plan_res_burden_rate_act,0)), p_txn_currency_code);
10749          l_act_brdncost_tc_this_period := pa_currency.round_trans_currency_amt1(
10750                 (nvl(p_act_quantity_this_period,0) * nvl(l_plan_res_burden_rate_act,0)), p_txn_currency_code);
10751      end if;     -- If (p_rate_based_flag = 'N') then
10752 
10753          -- 7.1). Convert etc_brdncost_tc into etc_brdncost_pc. To do this we use the API:
10754      --      PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS() and we pass in etc_brdncost_tc
10755      --  into the txn_cost parameter and read out the value of the parameter project_raw_cost.
10756 
10757      l_rawcost_pc := null;
10758 
10759          PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS(
10760                 p_project_id                => p_project_id
10761                 ,p_task_id                  => p_task_id
10762                 ,p_as_of_date               => p_as_of_date
10763                 ,p_txn_cost                 => l_etc_brdncost_tc
10764                 ,p_txn_curr_code            => p_txn_currency_code
10765             ,p_structure_version_id     => p_structure_version_id
10766             ,p_project_curr_code        => l_project_curr_code
10767                 ,p_project_rate_type        => l_project_rate_type
10768                 ,p_project_rate_date        => l_project_rate_date
10769                 ,p_project_exch_rate        => l_project_exch_rate
10770                 ,p_project_raw_cost         => l_rawcost_pc
10771             ,p_projfunc_curr_code       => l_projfunc_curr_code
10772                 ,p_projfunc_cost_rate_type  => l_projfunc_cost_rate_type
10773                 ,p_projfunc_cost_rate_date  => l_projfunc_cost_rate_date
10774                 ,p_projfunc_cost_exch_rate  => l_projfunc_cost_exch_rate
10775                 ,p_projfunc_raw_cost        => l_rawcost_fc
10776             ,p_calling_mode         => 'PLAN_RATES' -- Bug 4372462
10777             ,p_budget_version_id        => l_budget_version_id -- Bug 4372462
10778             ,p_res_assignment_id        => l_resource_assignment_id -- Bug 4372462
10779                 ,x_return_status            => l_return_status
10780                 ,x_msg_count                => l_msg_count
10781                 ,x_msg_data                 => l_msg_data
10782             );
10783 
10784      IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10785         x_return_status := 'E';
10786         RAISE  FND_API.G_EXC_ERROR;
10787      END IF;
10788 
10789      l_etc_brdncost_pc := l_rawcost_pc;
10790 
10791      -- 7.2). Convert act_brdncost_tc_this_period into act_brdncost_pc_this_period.
10792      --  To do this we use the API: PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS()
10793      --      and we pass in act_brdncost_tc_this_period into the txn_cost parameter and
10794      --  read out the value of the parameter project_raw_cost.
10795 
10796      l_rawcost_pc := null;
10797 
10798      PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS(
10799                 p_project_id                => p_project_id
10800                 ,p_task_id                  => p_task_id
10801                 ,p_as_of_date               => p_as_of_date
10802                 ,p_txn_cost                 => l_act_brdncost_tc_this_period
10803                 ,p_txn_curr_code            => p_txn_currency_code
10804             ,p_structure_version_id     => p_structure_version_id
10805             ,p_project_curr_code        => l_project_curr_code
10806                 ,p_project_rate_type        => l_project_rate_type
10807                 ,p_project_rate_date        => l_project_rate_date
10808                 ,p_project_exch_rate        => l_project_exch_rate
10809                 ,p_project_raw_cost         => l_rawcost_pc
10810             ,p_projfunc_curr_code       => l_projfunc_curr_code
10811                 ,p_projfunc_cost_rate_type  => l_projfunc_cost_rate_type
10812                 ,p_projfunc_cost_rate_date  => l_projfunc_cost_rate_date
10813                 ,p_projfunc_cost_exch_rate  => l_projfunc_cost_exch_rate
10814                 ,p_projfunc_raw_cost        => l_rawcost_fc
10815                 ,x_return_status            => l_return_status
10816                 ,x_msg_count                => l_msg_count
10817                 ,x_msg_data                 => l_msg_data
10818             );
10819 
10820       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10821         x_return_status := 'E';
10822         RAISE  FND_API.G_EXC_ERROR;
10823       END IF;
10824 
10825       l_act_brdncost_pc_this_period := l_rawcost_pc;
10826 
10827       END IF;  -- bug 3921624, IF NVL(l_track_wp_cost_flag, 'Y') = 'Y'
10828 
10829       l_act_quantity_to_date := nvl(p_act_quantity,0) + nvl(p_act_quantity_this_period,0);
10830       l_eac_quantity := (nvl(p_etc_quantity,0) + l_act_quantity_to_date);
10831       l_prcnt_comp_quantity := PA_PROGRESS_UTILS.Percent_Complete_Value(l_act_quantity_to_date,p_etc_quantity);
10832       l_prcnt_spent_quantity := PA_PROGRESS_UTILS.Percent_Spent_Value(l_act_quantity_to_date,p_planned_quantity);
10833 
10834       IF NVL(l_track_wp_cost_flag, 'Y') = 'Y' THEN -- bug 3921624
10835     l_act_brdncost_to_date_pc := nvl(l_act_brdncost_pc,0)  + nvl(l_act_brdncost_pc_this_period,0);
10836     l_eac_brdncost_pc := (nvl(l_etc_brdncost_pc,0) + l_act_brdncost_to_date_pc );
10837     l_prcnt_comp_brdncost_pc := PA_PROGRESS_UTILS.Percent_Complete_Value(l_act_brdncost_to_date_pc,l_etc_brdncost_pc);
10838     l_prcnt_spent_brdncost_pc := PA_PROGRESS_UTILS.Percent_Spent_Value(l_act_brdncost_to_date_pc,l_planned_brdncost_pc);
10839       END IF;
10840 
10841       IF g1_debug_mode  = 'Y' THEN
10842         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'l_eac_quantity='||l_eac_quantity, x_Log_Level=> 3);
10843         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'l_eac_brdncost_pc='||l_eac_brdncost_pc, x_Log_Level=> 3);
10844         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'l_prcnt_comp_quantity='||l_prcnt_comp_quantity, x_Log_Level=> 3);
10845         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'l_prcnt_comp_brdncost_pc='||l_prcnt_comp_brdncost_pc, x_Log_Level=> 3);
10846         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'l_prcnt_spent_quantity='||l_prcnt_spent_quantity, x_Log_Level=> 3);
10847         pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.convert_effort_to_cost_brdn_pc', x_Msg => 'l_prcnt_spent_brdncost_pc='||l_prcnt_spent_brdncost_pc, x_Log_Level=> 3);
10848       END IF;
10849 
10850     -- Set the values to the output parameters:
10851 
10852     x_act_brdncost_pc_this_period           :=    nvl(l_act_brdncost_pc_this_period, 0);
10853     x_etc_brdncost_pc                       :=    nvl(l_etc_brdncost_pc,0);
10854 
10855     x_prcnt_comp_quantity                   :=    nvl(l_prcnt_comp_quantity,0);
10856     x_prcnt_spent_quantity                  :=    nvl(l_prcnt_spent_quantity,0);
10857     x_eac_quantity                          :=    nvl(l_eac_quantity,0);
10858 
10859     x_prcnt_comp_brdncost_pc                :=    nvl(l_prcnt_comp_brdncost_pc,0);
10860     x_prcnt_spent_brdncost_pc               :=    nvl(l_prcnt_spent_brdncost_pc,0);
10861     x_eac_brdncost_pc                       :=    nvl(l_eac_brdncost_pc,0);
10862 
10863     x_return_status                 :=    l_return_status;
10864     x_msg_count                     :=    l_msg_count;
10865     x_msg_data                      :=    l_msg_data;
10866 
10867 EXCEPTION
10868 
10869     WHEN FND_API.G_EXC_ERROR THEN
10870       x_return_status := FND_API.G_RET_STS_ERROR;
10871       x_msg_count := Fnd_Msg_Pub.count_msg;
10872 
10873     -- 4537865
10874     x_act_brdncost_pc_this_period   := 0 ;
10875     x_etc_brdncost_pc               := 0 ;
10876     x_prcnt_comp_quantity           := 0 ;
10877     x_prcnt_spent_quantity          := 0 ;
10878     x_eac_quantity                  := 0 ;
10879     x_prcnt_comp_brdncost_pc        := 0 ;
10880     x_prcnt_spent_brdncost_pc       := 0 ;
10881     x_eac_brdncost_pc               := 0 ;
10882 
10883     WHEN OTHERS THEN
10884       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
10885       x_msg_count     := 1;
10886       x_msg_data      := SUBSTRB(SQLERRM,1,240);
10887     -- 4537865
10888     x_act_brdncost_pc_this_period   := 0 ;
10889     x_etc_brdncost_pc               := 0 ;
10890     x_prcnt_comp_quantity           := 0 ;
10891     x_prcnt_spent_quantity          := 0 ;
10892     x_eac_quantity                  := 0 ;
10893     x_prcnt_comp_brdncost_pc        := 0 ;
10894     x_prcnt_spent_brdncost_pc       := 0 ;
10895     x_eac_brdncost_pc               := 0 ;
10896     RAISE;
10897 
10898 END convert_effort_to_cost_brdn_pc;
10899 
10900 function get_actual_summ_date(p_project_id   IN  NUMBER) return date
10901 is
10902  l_prog_act_summ_date   date := null;
10903 begin
10904  /*
10905    select next_progress_update_date
10906      into l_prog_act_summ_date
10907      from pa_proj_progress_attr
10908     where project_id = p_project_id
10909       and object_type = 'PA_STRUCTURES'
10910       and structure_type = 'WORKPLAN';
10911 
10912    --- adding if statement for bug 4490380
10913    if l_prog_act_summ_date is null then
10914  */
10915    --- Bug 4652132 always return latest as_of_date for the project/program.
10916       select as_of_date
10917         into l_prog_act_summ_date
10918         from pa_progress_rollup
10919        where project_id = p_project_id
10920          and object_type = 'PA_STRUCTURES'
10921          and structure_type = 'WORKPLAN'
10922          and structure_version_id is null
10923          and current_flag = 'Y';
10924 
10925    return l_prog_act_summ_date;
10926 
10927 exception when others then
10928     return to_date(null);
10929 end;
10930 
10931 /* Bug # 3956235: Created API: get_cost_variance(). */
10932 
10933 -- 4392189 Phase 2: ignore p_base_percent_complete
10934 Function get_cost_variance(
10935     p_project_id                NUMBER
10936     , p_proj_element_id         NUMBER
10937     , p_structure_version_id        NUMBER
10938     , p_task_weight_method              VARCHAR2
10939     , p_structure_type          VARCHAR2 := 'WORKPLAN'
10940     , p_base_percent_complete       NUMBER
10941     , p_eff_rollup_percent_comp     NUMBER
10942     , p_earned_value            NUMBER
10943     , p_oth_act_cost_to_date_pc     NUMBER
10944     , p_ppl_act_cost_to_date_pc     NUMBER
10945     , p_eqpmt_act_cost_to_date_pc       NUMBER
10946     , p_spj_oth_act_cost_to_date_pc     NUMBER
10947     , p_spj_ppl_act_cost_pc         NUMBER
10948     , p_spj_eqpmt_act_cost_pc       NUMBER
10949 ) return number
10950 is
10951 
10952     l_cost_variance NUMBER  := null;
10953     l_bac_value NUMBER  := null;
10954     l_earned_value  NUMBER  := null;
10955 
10956 begin
10957 
10958     if (p_task_weight_method = 'EFFORT') then
10959 
10960         /* Get the corresponding BAC cost value by passing p_task_weight_method as 'COST'. */
10961 
10962             l_bac_value := pa_progress_utils.get_bac_value(
10963                         p_project_id        => p_project_id
10964                     ,p_task_weight_method   => 'COST'
10965                     ,p_proj_element_id  => p_proj_element_id
10966                     ,p_structure_version_id => p_structure_version_id
10967                     ,p_structure_type   => p_structure_type
10968                     );
10969 
10970         /* Calculate the corresponding earned_value cost using the BAC cost value. */
10971 
10972 --          l_earned_value := round((nvl(nvl(p_base_percent_complete
10973 --                           ,p_eff_rollup_percent_comp),0)
10974 --                      * nvl(l_bac_value,0)/100),5);
10975             l_earned_value := round((nvl(p_eff_rollup_percent_comp,0)
10976                         * nvl(l_bac_value,0)/100),5);
10977 
10978 
10979     else
10980 
10981         /* Set earned_value as the input earned_value. */
10982 
10983             l_earned_value := nvl(p_earned_value,0);
10984 
10985     end if;
10986 
10987     /* Calculate the cost_variance. */
10988 
10989         l_cost_variance := nvl(l_earned_value,0)-(nvl(p_oth_act_cost_to_date_pc,0)
10990                               +nvl(p_ppl_act_cost_to_date_pc,0)
10991                               +nvl(p_eqpmt_act_cost_to_date_pc,0)
10992                               +nvl(p_spj_oth_act_cost_to_date_pc,0)
10993                                   +nvl(p_spj_ppl_act_cost_pc,0)
10994                               +nvl(p_spj_eqpmt_act_cost_pc,0));
10995 
10996     /* Return the calcualted cost variance. */
10997 
10998         return(l_cost_variance);
10999 
11000 end  get_cost_variance;
11001 
11002 -- Begin fix for Bug # 4073659.
11003 
11004 FUNCTION check_prog_exists_and_delete(
11005  p_project_id       NUMBER
11006  ,p_task_id     NUMBER
11007  ,p_object_type     VARCHAR2 := 'PA_TASKS'
11008  ,p_object_id       NUMBER   := null
11009  ,p_structure_type  VARCHAR2 := 'WORKPLAN'
11010  ,p_delete_progress_flag    VARCHAR2 := 'Y' -- Fix for Bug # 4140984.
11011 
11012 ) RETURN VARCHAR2 IS
11013 
11014   CURSOR cur_ppc_assgn(c_object_id NUMBER, c_task_id NUMBER, c_object_type VARCHAR2
11015                , c_project_id NUMBER, c_structure_type VARCHAR2)
11016   IS
11017      SELECT 'Y'
11018      FROM pa_percent_completes ppc
11019      WHERE ppc.object_id = c_object_id
11020      AND ppc.task_id = c_task_id
11021      AND ppc.object_type = c_object_type
11022      AND ppc.project_id  = c_project_id
11023      AND ppc.structure_type = c_structure_type
11024      AND ppc.published_flag = 'Y';
11025 
11026   CURSOR cur_ppr_assgn(c_object_id NUMBER, c_task_id NUMBER, c_object_type VARCHAR2
11027                        , c_project_id NUMBER, c_structure_type VARCHAR2)
11028   IS
11029     SELECT 'Y'
11030     FROM pa_progress_rollup ppr
11031     WHERE ppr.object_id = c_object_id
11032     AND ppr.proj_element_id = c_task_id
11033     AND ppr.object_type = c_object_type
11034     AND ppr.project_id  = c_project_id
11035     AND ppr.structure_type = p_structure_type
11036     AND (((nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
11037        +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
11038            + nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) <> 0 ) -- 4417665 : making it <> 0 rather than >0
11039      OR
11040          ((nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)
11041        +nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)) <> 0) -- 4417665 : making it <> 0 rather than >0
11042      OR
11043      ((nvl(ppr.oth_etc_cost_tc,0)+nvl(ppr.ppl_etc_cost_tc,0)
11044        +nvl(ppr.eqpmt_etc_cost_tc,0)+nvl(ppr.subprj_oth_etc_cost_tc,0)
11045            +nvl(ppr.subprj_ppl_etc_cost_tc,0) +nvl(ppr.subprj_eqpmt_etc_cost_tc,0)) > 0)
11046      OR
11047      ((nvl(ppr.estimated_remaining_effort,0)+nvl(ppr.eqpmt_etc_effort,0)
11048        +nvl(ppr.subprj_ppl_etc_effort,0)+nvl(ppr.subprj_eqpmt_etc_effort,0)) > 0))
11049      AND ppr.current_flag in ('Y', 'W')
11050      AND ppr.structure_version_id is null;
11051 
11052   CURSOR cur_ppc_task(c_task_id NUMBER, c_object_type VARCHAR2
11053                       , c_project_id NUMBER, c_structure_type VARCHAR2)
11054   IS
11055      SELECT 'Y'
11056      FROM pa_percent_completes ppc
11057      WHERE ppc.task_id = c_task_id
11058      AND ppc.object_type = c_object_type
11059      AND ppc.project_id  = c_project_id
11060      AND ppc.structure_type = c_structure_type
11061      AND ppc.published_flag = 'Y';
11062 
11063   CURSOR cur_ppr_task(c_task_id NUMBER, c_object_type VARCHAR2
11064                        , c_project_id NUMBER, c_structure_type VARCHAR2)
11065   IS
11066     SELECT 'Y'
11067     FROM pa_progress_rollup ppr
11068     WHERE ppr.proj_element_id = c_task_id
11069     AND ppr.object_type = c_object_type
11070     AND ppr.project_id  = c_project_id
11071     AND ppr.structure_type = p_structure_type
11072     AND (((nvl(ppr.oth_act_cost_to_date_tc,0)+nvl(ppr.ppl_act_cost_to_date_tc,0)
11073            +nvl(ppr.eqpmt_act_cost_to_date_tc,0)+nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
11074            + nvl(ppr.subprj_ppl_act_cost_tc,0)+nvl(ppr.subprj_eqpmt_act_cost_tc,0)) <> 0 ) ---- 4417665 : making it <> 0 rather than >0
11075          OR
11076          ((nvl(ppr.ppl_act_effort_to_date,0)+nvl(ppr.eqpmt_act_effort_to_date,0)
11077            +nvl(ppr.subprj_ppl_act_effort,0)+nvl(ppr.subprj_eqpmt_act_effort,0)) <> 0) -- 4417665 : making it <> 0 rather than >0
11078          OR
11079          ((nvl(ppr.oth_etc_cost_tc,0)+nvl(ppr.ppl_etc_cost_tc,0)
11080            +nvl(ppr.eqpmt_etc_cost_tc,0)+nvl(ppr.subprj_oth_etc_cost_tc,0)
11081            +nvl(ppr.subprj_ppl_etc_cost_tc,0) +nvl(ppr.subprj_eqpmt_etc_cost_tc,0)) > 0)
11082          OR
11083          ((nvl(ppr.estimated_remaining_effort,0)+nvl(ppr.eqpmt_etc_effort,0)
11084            +nvl(ppr.subprj_ppl_etc_effort,0)+nvl(ppr.subprj_eqpmt_etc_effort,0)) > 0))
11085      AND ppr.current_flag in ('Y', 'W')
11086      AND ppr.structure_version_id is null;
11087 
11088   l_return_value        VARCHAR2(1) := 'N';
11089 
11090 BEGIN
11091 
11092 
11093      -- 1). Default l_return_value.
11094 
11095      l_return_value := 'N';
11096 
11097      -- 2). If progress check and deletion is requested for a single assignment.
11098 
11099     if (p_object_type = 'PA_ASSIGNMENTS') then
11100 
11101          -- 2.1). If published progress exists for the assignment
11102      --   return ''Y'.
11103         -- 4469270 : Removed the check for ppc records
11104             --OPEN cur_ppc_assgn (p_object_id, p_task_id, p_object_type, p_project_id, p_structure_type);
11105             --FETCH cur_ppc_assgn INTO l_return_value;
11106             --CLOSE cur_ppc_assgn;
11107 
11108             IF NVL(l_return_value,'N') <> 'Y' THEN
11109 
11110             -- 2.2). If published progress does not exist for the assignment but latest published
11111             --       or working rollup records exist and actuals /  etc > 0 for the assignment
11112             --       assignment return 'Y'.
11113 
11114                 OPEN cur_ppr_assgn (p_object_id, p_task_id, p_object_type, p_project_id, p_structure_type);
11115                     FETCH cur_ppr_assgn INTO l_return_value;
11116                     CLOSE cur_ppr_assgn;
11117 
11118                 l_return_value := NVL(l_return_value, 'N');
11119 
11120             END IF;
11121 
11122         -- 2.3). If no published progress exists for the assignment and actuals / etc are = 0 on
11123         --   the latest published or working rollup records for the assignment then delete
11124         --   the rollup records for the assignment.
11125 
11126         if ((l_return_value = 'N') and (p_delete_progress_flag = 'Y')) then -- fix for Bug # 4140984.
11127 
11128             DELETE FROM pa_progress_rollup ppr
11129             WHERE ppr.object_id = p_object_id
11130             AND ppr.proj_element_id = p_task_id
11131                 AND ppr.object_type = p_object_type
11132                 AND ppr.project_id  = p_project_id
11133                 AND ppr.structure_type = p_structure_type;
11134 
11135         end if;
11136 
11137     -- 3). If progress check and deletion is requested for all the assignments of a task.
11138 
11139     elsif (p_object_type = 'PA_TASKS') then
11140 
11141             -- 3.1). If published progress exists for any of the assignments for the task then
11142         --   return 'Y'.
11143             -- 4469270 : Removed the check for ppc records
11144                     --OPEN cur_ppc_task (p_task_id, 'PA_ASSIGNMENTS'
11145             --            , p_project_id, p_structure_type);
11146                     --FETCH cur_ppc_task INTO l_return_value;
11147                     --CLOSE cur_ppc_task;
11148 
11149             IF NVL(l_return_value,'N') <> 'Y' THEN
11150 
11151                         -- 3.2). If published progress does not exist for any of the assignments for the
11152             --   task but latest published or working rollup records exist and actuals / etc
11153             --   > 0 for any of the assignments return 'Y'.
11154 
11155                                 OPEN cur_ppr_task (p_task_id, 'PA_ASSIGNMENTS'
11156                                                    , p_project_id, p_structure_type);
11157                                 FETCH cur_ppr_task INTO l_return_value;
11158                                 CLOSE cur_ppr_task;
11159 
11160                                 l_return_value := NVL(l_return_value, 'N');
11161 
11162                         END IF;
11163 
11164                 -- 3.3). If no published progress exists for any of the assignments and actuals / etc  = 0
11165         --   on the latest published or working rollup records for all the assignments then
11166         --   delete all the rollup records for all the assignments for the given task.
11167 
11168                 if ((l_return_value = 'N') and (p_delete_progress_flag = 'Y')) then -- Fix for Bug # 4140984.
11169 
11170                         DELETE FROM pa_progress_rollup ppr
11171                         WHERE ppr.proj_element_id = p_task_id
11172             AND ppr.object_type = 'PA_ASSIGNMENTS'
11173                         AND ppr.project_id  = p_project_id
11174                         AND ppr.structure_type = p_structure_type;
11175 
11176                 end if;
11177 
11178     end if;
11179 
11180     return(l_return_value);
11181 
11182 END check_prog_exists_and_delete;
11183 
11184 -- End fix for Bug # 4073659.
11185 
11186 /* Begin fix for bug # 4115607. */
11187 
11188 FUNCTION get_app_cost_budget_cb_wor_ver(p_project_id NUMBER)
11189 return NUMBER
11190 IS
11191 
11192 l_plan_version_id               NUMBER := null;
11193 l_plan_type_id                  NUMBER;
11194 l_fp_options_id                 NUMBER;
11195 l_return_status                 VARCHAR2(2000);
11196 l_msg_data                      VARCHAR2(2000);
11197 l_msg_count                     NUMBER;
11198 
11199 BEGIN
11200 
11201         -- Call the FP API to get the approved cost budget current baselined version id.
11202 
11203         l_plan_version_id := PA_FIN_PLAN_UTILS.Get_app_budget_cost_cb_ver(p_project_id);
11204 
11205 
11206         -- If approved cost budget current baselined version is null then get the approved cost budget
11207         -- plan_type_id.
11208 
11209         if l_plan_version_id is null then
11210 
11211         -- First get the approved cost budget plan_type_id.
11212 
11213         PA_FIN_PLAN_UTILS.Get_Appr_Cost_Plan_Type_Info(
11214         p_project_id            => p_project_id
11215         ,x_plan_type_id         => l_plan_type_id
11216         ,x_return_status        => l_return_status
11217         ,x_msg_count            => l_msg_count
11218         ,x_msg_data             => l_msg_data);
11219 
11220         -- If plan_type_id is not null,  use the plan_type_id to get the approved cost budget current working        -- version id.
11221 
11222                 if (l_plan_type_id is not null) then
11223 
11224                         PA_FIN_PLAN_UTILS.Get_Curr_Working_Version_Info(
11225                         p_project_id            => p_project_id
11226                         ,p_fin_plan_type_id     => l_plan_type_id
11227                         ,p_version_type         => 'COST'
11228                         ,x_fp_options_id        => l_fp_options_id
11229                         ,x_fin_plan_version_id  => l_plan_version_id
11230                         ,x_return_status        => l_return_status
11231                         ,x_msg_count            => l_msg_count
11232                         ,x_msg_data             => l_msg_data);
11233 
11234                 end if;
11235 
11236         end if;
11237 
11238         return(l_plan_version_id);
11239 
11240 END  get_app_cost_budget_cb_wor_ver;
11241 
11242 /* End fix for bug # 4115607. */
11243 
11244 -- procedure to get resource raw and brdn rates
11245 --Bug 5027965. introduced parameter p_etc_cost_calc_mode which  can be either COPY or DERIVE.
11246 --If its COPY then
11247 ----the etc cost in the current working workplan version will returned. In this case
11248 ----the parameter p_budget_version_id will contain the budget version id corresponding to the
11249 ----current working workplan version
11250 --If its DERIVE then
11251 ----the etc cost will be derived based on the rate setup on p_as_of_date
11252 ----p_budget_version_id will contain the budget version id corresponding to the latest published
11253 ---- workplan version
11254 procedure get_plan_costs_for_qty
11255 (  p_etc_cost_calc_mode         IN        VARCHAR2 DEFAULT 'DERIVE'   --Bug 5027965
11256   ,p_resource_list_mem_id       IN    NUMBER
11257   ,p_project_id                 IN    NUMBER
11258   ,p_task_id            IN    NUMBER
11259   ,p_as_of_date         IN    DATE
11260   ,p_structure_version_id       IN    NUMBER
11261   ,p_txn_currency_code          IN    VARCHAR
11262   ,p_rate_based_flag            IN    VARCHAR := 'Y'
11263   ,p_quantity                   IN        NUMBER
11264   ,p_budget_version_id          IN        NUMBER -- Bug 4372462
11265   ,p_res_assignment_id          IN        NUMBER
11266   ,x_rawcost_tc                 OUT       NOCOPY NUMBER --File.Sql.39 bug 4440895
11267   ,x_brdncost_tc                OUT       NOCOPY NUMBER --File.Sql.39 bug 4440895
11268   ,x_rawcost_pc                 OUT       NOCOPY NUMBER --File.Sql.39 bug 4440895
11269   ,x_brdncost_pc                OUT       NOCOPY NUMBER --File.Sql.39 bug 4440895
11270   ,x_rawcost_fc                 OUT       NOCOPY NUMBER --File.Sql.39 bug 4440895
11271   ,x_brdncost_fc                OUT       NOCOPY NUMBER --File.Sql.39 bug 4440895
11272   ,x_return_status      OUT       NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
11273   ,x_msg_count          OUT       NOCOPY NUMBER --File.Sql.39 bug 4440895
11274   ,x_msg_data           OUT       NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
11275 )
11276 
11277 IS
11278         x_res_brdn_mult_ovrate          NUMBER;
11279         x_res_raw_rate                  NUMBER;
11280         L_PLAN_RES_CUR_CODE             VARCHAR2(30);
11281         l_plan_res_burden_rate_etc      NUMBER           := null;
11282         l_plan_res_burden_rate_act      NUMBER           := null;
11283 
11284         l_plan_res_raw_rate         NUMBER           := null;
11285 
11286         l_plan_burden_multiplier_etc    NUMBER           := null;
11287         l_plan_burden_multiplier_act    NUMBER           := null;
11288 
11289     l_rawcost_pc            NUMBER       := null;
11290     l_rawcost_fc            NUMBER       := null;
11291 
11292     l_txn_currency_code     VARCHAR2(30)     := null;
11293 
11294     l_project_curr_code             VARCHAR2(30);
11295         l_project_rate_type             VARCHAR2(30);
11296         l_project_rate_date             DATE;
11297         l_project_exch_rate             NUMBER;
11298 
11299     l_projfunc_curr_code            VARCHAR2(30);
11300         l_projfunc_cost_rate_type       VARCHAR2(30);
11301         l_projfunc_cost_rate_date       DATE;
11302         l_projfunc_cost_exch_rate       NUMBER;
11303 
11304         g1_debug_mode               VARCHAR2(1);
11305     l_track_wp_cost_flag  VARCHAR2(1) := 'Y'; -- Bug 3921624
11306 
11307 
11308 BEGIN
11309 
11310      g1_debug_mode := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
11311      x_return_status := 'S';
11312 
11313      IF g1_debug_mode  = 'Y' THEN
11314 
11315          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.get_plan_costs_for_qty', x_Msg => 'p_resource_list_mem_id='||p_resource_list_mem_id, x_Log_Level=> 3);
11316          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.get_plan_costs_for_qty', x_Msg => 'p_project_id='||p_project_id, x_Log_Level=> 3);
11317          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.get_plan_costs_for_qty', x_Msg => 'p_structure_version_id='||p_structure_version_id, x_Log_Level=> 3);
11318          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.get_plan_costs_for_qty', x_Msg => 'p_txn_currency_code='||p_txn_currency_code, x_Log_Level=> 3);
11319          pa_debug.write(x_Module=>'PA_PROGRESS_UTILS.get_plan_costs_for_qty', x_Msg => 'p_rate_based_flag='||p_rate_based_flag, x_Log_Level=> 3);
11320 
11321      END IF;
11322 
11323    l_track_wp_cost_flag :=  pa_fp_wp_gen_amt_utils.get_wp_track_cost_amt_flag(p_project_id);
11324 
11325    IF NVL(l_track_wp_cost_flag, 'Y') = 'Y' THEN   --Bug 3921624
11326 
11327      --Bug 5027965
11328      IF p_etc_cost_calc_mode='DERIVE' THEN
11329 
11330          -- 3.1). Get resource rate burden multiplier to convert etc_rawcost to etc_brdncost and resource burden rate to convert etc_effort to etc_brdncost in tc.
11331 
11332         l_plan_res_cur_code               := null;
11333         l_plan_res_raw_rate           := null;
11334         l_plan_burden_multiplier_etc      := null;
11335         l_plan_res_burden_rate_etc        := null;
11336 
11337         PA_PROGRESS_UTILS.Get_Res_Rate_Burden_Multiplier(
11338                 P_res_list_mem_id              => p_resource_list_mem_id
11339                 ,P_project_id                  => p_project_id
11340                 ,P_task_id                     => p_task_id      --bug 3927159
11341                 ,p_as_of_date                  => p_as_of_date   --bug 3927159
11342                 ,p_structure_version_id        => p_structure_version_id
11343                 ,p_currency_code               => p_txn_currency_code
11344                 ,p_calling_mode                => 'PLAN_RATES'
11345                 ,x_resource_curr_code          => l_plan_res_cur_code
11346                 ,x_resource_raw_rate           => l_plan_res_raw_rate
11347                 ,x_resource_burden_rate        => l_plan_res_burden_rate_etc
11348                 ,X_burden_multiplier           => l_plan_burden_multiplier_etc
11349                 ,x_return_status               => x_return_status
11350                 ,x_msg_count                   => x_msg_count
11351                 ,x_msg_data                    => x_msg_data);
11352         x_res_raw_rate := l_plan_res_raw_rate;
11353 
11354         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11355            RAISE  FND_API.G_EXC_ERROR;
11356         END IF;
11357 
11358         -- 3.2). If the rate_based_flag is 'Y' and the resource burden rate currency code is not the same as the txn currency code, convert the resource burden rate into txn currency.
11359         -- to do this we use the API: PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS() and we pass in
11360         -- txn_currency code into the project_currency_code parameter and read out the value of
11361         -- the parameter project_raw_cost.
11362 
11363         IF ((p_rate_based_flag = 'Y') and (p_txn_currency_code <> l_plan_res_cur_code)) then
11364             l_rawcost_pc := null;
11365             l_txn_currency_code := p_txn_currency_code;
11366 
11367             PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS(
11368                 p_project_id               =>  p_project_id
11369                 ,p_task_id                  => p_task_id
11370                 ,p_as_of_date               => p_as_of_date
11371                 ,p_txn_cost                 => l_plan_res_burden_rate_etc
11372                 ,p_txn_curr_code            => l_plan_res_cur_code
11373             ,p_structure_version_id     => p_structure_version_id
11374             ,p_project_curr_code        => l_txn_currency_code ---l_project_curr_code
11375                 ,p_project_rate_type        => l_project_rate_type
11376                 ,p_project_rate_date        => l_project_rate_date
11377                 ,p_project_exch_rate        => l_project_exch_rate
11378                 ,p_project_raw_cost         => l_rawcost_pc
11379             ,p_projfunc_curr_code       => l_projfunc_curr_code
11380                 ,p_projfunc_cost_rate_type  => l_projfunc_cost_rate_type
11381                 ,p_projfunc_cost_rate_date  => l_projfunc_cost_rate_date
11382                 ,p_projfunc_cost_exch_rate  => l_projfunc_cost_exch_rate
11383                 ,p_projfunc_raw_cost        => l_rawcost_fc
11384                 ,x_return_status            => x_return_status
11385                 ,x_msg_count                => x_msg_count
11386                 ,x_msg_data                 => x_msg_data
11387             );
11388 
11389             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11390                 RAISE FND_API.G_EXC_ERROR;
11391             END IF;
11392 
11393             l_plan_res_burden_rate_etc :=   l_rawcost_pc;
11394             if (l_plan_res_raw_rate <> l_plan_res_burden_rate_etc) then
11395                 l_rawcost_pc := null;
11396 
11397                 PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS(
11398                         p_project_id               =>  p_project_id
11399                         ,p_task_id                  => p_task_id
11400                         ,p_as_of_date               => p_as_of_date
11401                         ,p_txn_cost                 => l_plan_res_raw_rate
11402                         ,p_txn_curr_code            => l_plan_res_cur_code
11403                         ,p_structure_version_id     => p_structure_version_id
11404                         ,p_project_curr_code        => l_txn_currency_code ---l_project_curr_code
11405                         ,p_project_rate_type        => l_project_rate_type
11406                         ,p_project_rate_date        => l_project_rate_date
11407                         ,p_project_exch_rate        => l_project_exch_rate
11408                         ,p_project_raw_cost         => l_rawcost_pc
11409                         ,p_projfunc_curr_code       => l_projfunc_curr_code
11410                         ,p_projfunc_cost_rate_type  => l_projfunc_cost_rate_type
11411                         ,p_projfunc_cost_rate_date  => l_projfunc_cost_rate_date
11412                         ,p_projfunc_cost_exch_rate  => l_projfunc_cost_exch_rate
11413                         ,p_projfunc_raw_cost        => l_rawcost_fc
11414                         ,x_return_status            => x_return_status
11415                         ,x_msg_count                => x_msg_count
11416                         ,x_msg_data                 => x_msg_data
11417                         );
11418 
11419                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11420                     RAISE  FND_API.G_EXC_ERROR;
11421                 END IF;
11422                 x_res_raw_rate := l_rawcost_pc;
11423             end if;
11424         END IF;
11425         if (p_rate_based_flag = 'N') then
11426            x_res_raw_rate := 1;
11427            x_res_brdn_mult_ovrate := l_plan_burden_multiplier_etc;
11428 --           x_brdncost_tc := nvl(pa_currency.round_trans_currency_amt((nvl(p_quantity,0) * nvl(x_res_brdn_mult_ovrate,0)), p_txn_currency_code),0) + nvl(p_quantity,0);
11429              x_brdncost_tc := nvl(pa_currency.round_trans_currency_amt1((nvl(p_quantity,0) * nvl(x_res_brdn_mult_ovrate,0)), p_txn_currency_code),0) + nvl(p_quantity,0);
11430         else
11431            x_res_brdn_mult_ovrate := l_plan_res_burden_rate_etc;
11432            --x_brdncost_tc := nvl(pa_currency.round_trans_currency_amt((nvl(p_quantity,0) * nvl(x_res_brdn_mult_ovrate,0)), p_txn_currency_code),0);
11433          x_brdncost_tc := nvl(pa_currency.round_trans_currency_amt1((nvl(p_quantity,0) * nvl(x_res_brdn_mult_ovrate,0)), p_txn_currency_code),0);
11434         end if;
11435         --x_rawcost_tc := nvl(pa_currency.round_trans_currency_amt((nvl(p_quantity,0) * nvl(x_res_raw_rate,0)), p_txn_currency_code),0);
11436     x_rawcost_tc := nvl(pa_currency.round_trans_currency_amt1((nvl(p_quantity,0) * nvl(x_res_raw_rate,0)), p_txn_currency_code),0);
11437 
11438         -- convert all costs to proj curr and proj func curr
11439 
11440         PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS(
11441                         p_project_id               =>  p_project_id
11442                         ,p_task_id                  => p_task_id
11443                         ,p_as_of_date               => p_as_of_date
11444                         ,p_txn_cost                 => x_rawcost_tc
11445                         ,p_txn_curr_code            => p_txn_currency_code
11446                         ,p_structure_version_id     => p_structure_version_id
11447                         ,p_calling_mode             => 'PLAN_RATES' -- Bug 4372462
11448                         ,p_budget_version_id        => p_budget_version_id -- Bug 4372462
11449                         ,p_res_assignment_id        => p_res_assignment_id -- Bug 4372462
11450                         ,p_project_curr_code        => l_project_curr_code
11451                         ,p_project_rate_type        => l_project_rate_type
11452                         ,p_project_rate_date        => l_project_rate_date
11453                         ,p_project_exch_rate        => l_project_exch_rate
11454                         ,p_project_raw_cost         => l_rawcost_pc
11455                         ,p_projfunc_curr_code       => l_projfunc_curr_code
11456                         ,p_projfunc_cost_rate_type  => l_projfunc_cost_rate_type
11457                         ,p_projfunc_cost_rate_date  => l_projfunc_cost_rate_date
11458                         ,p_projfunc_cost_exch_rate  => l_projfunc_cost_exch_rate
11459                         ,p_projfunc_raw_cost        => l_rawcost_fc
11460                         ,x_return_status            => x_return_status
11461                         ,x_msg_count                => x_msg_count
11462                         ,x_msg_data                 => x_msg_data
11463                         );
11464 
11465         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11466              RAISE  FND_API.G_EXC_ERROR;
11467         END IF;
11468         x_rawcost_pc := l_rawcost_pc;
11469         x_rawcost_fc := l_rawcost_fc;
11470 
11471         PA_PROGRESS_UTILS.CONVERT_CURRENCY_AMOUNTS(
11472                         p_project_id               =>  p_project_id
11473                         ,p_task_id                  => p_task_id
11474                         ,p_as_of_date               => p_as_of_date
11475                         ,p_txn_cost                 => x_brdncost_tc
11476                         ,p_txn_curr_code            => p_txn_currency_code
11477                         ,p_structure_version_id     => p_structure_version_id
11478                         ,p_calling_mode             => 'PLAN_RATES' -- Bug 4372462
11479                         ,p_budget_version_id        => p_budget_version_id -- Bug 4372462
11480                         ,p_res_assignment_id        => p_res_assignment_id -- Bug 4372462
11481                         ,p_project_curr_code        => l_project_curr_code
11482                         ,p_project_rate_type        => l_project_rate_type
11483                         ,p_project_rate_date        => l_project_rate_date
11484                         ,p_project_exch_rate        => l_project_exch_rate
11485                         ,p_project_raw_cost         => l_rawcost_pc
11486                         ,p_projfunc_curr_code       => l_projfunc_curr_code
11487                         ,p_projfunc_cost_rate_type  => l_projfunc_cost_rate_type
11488                         ,p_projfunc_cost_rate_date  => l_projfunc_cost_rate_date
11489                         ,p_projfunc_cost_exch_rate  => l_projfunc_cost_exch_rate
11490                         ,p_projfunc_raw_cost        => l_rawcost_fc
11491                         ,x_return_status            => x_return_status
11492                         ,x_msg_count                => x_msg_count
11493                         ,x_msg_data                 => x_msg_data
11494                         );
11495 
11496         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11497              RAISE  FND_API.G_EXC_ERROR;
11498         END IF;
11499         x_brdncost_pc := l_rawcost_pc;
11500         x_brdncost_fc := l_rawcost_fc;
11501      --Bug 5027965
11502      ELSIF p_etc_cost_calc_mode='COPY' THEN
11503 
11504              SELECT NVL(SUM(NVL(pbl.txn_raw_cost,0)-NVL(pbl.txn_init_raw_cost,0)),0),
11505                     NVL(SUM(NVL(pbl.txn_burdened_cost,0)-NVL(pbl.txn_init_burdened_cost,0)),0),
11506                     NVL(SUM(NVL(pbl.project_raw_cost,0)-NVL(pbl.project_init_raw_cost,0)),0),
11507                     NVL(SUM(NVL(pbl.project_burdened_cost,0)-NVL(pbl.project_init_burdened_cost,0)),0),
11508                     NVL(SUM(NVL(pbl.raw_cost,0)-NVL(pbl.init_raw_cost,0)),0),
11509                     NVL(SUM(NVL(pbl.burdened_cost,0)-NVL(pbl.init_burdened_cost,0)),0)
11510              INTO   x_rawcost_tc,
11511                     x_brdncost_tc,
11512                     x_rawcost_pc,
11513                     x_brdncost_pc,
11514                     x_rawcost_fc,
11515                     x_brdncost_fc
11516              FROM   pa_budget_lines pbl,
11517                     pa_resource_assignments pra
11518              WHERE  pra.budget_version_id=p_budget_version_id
11519              AND    pra.project_id=p_project_id
11520              AND    pra.task_id=p_task_id
11521              AND    pra.resource_list_member_id=p_resource_list_mem_id
11522              AND    pbl.resource_assignment_id=pra.resource_assignment_id
11523              AND    pbl.txn_currency_code=p_txn_currency_code;
11524 
11525      END IF;
11526    END IF;
11527 
11528 
11529 EXCEPTION
11530 
11531     WHEN FND_API.G_EXC_ERROR THEN
11532       x_return_status := FND_API.G_RET_STS_ERROR;
11533       x_msg_count := Fnd_Msg_Pub.count_msg;
11534 
11535       -- 4537865
11536 
11537         x_rawcost_tc       := NULL ;
11538     x_brdncost_tc      := NULL ;
11539     x_rawcost_pc       := NULL ;
11540     x_brdncost_pc      := NULL ;
11541     x_rawcost_fc       := NULL ;
11542     x_brdncost_fc      := NULL ;
11543 
11544     WHEN OTHERS THEN
11545       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
11546       x_msg_count     := 1;
11547       x_msg_data      := SUBSTRB(SQLERRM,1,240);
11548 
11549       -- 4537865
11550         x_rawcost_tc       := NULL ;
11551     x_brdncost_tc      := NULL ;
11552     x_rawcost_pc       := NULL ;
11553     x_brdncost_pc      := NULL ;
11554     x_rawcost_fc       := NULL ;
11555     x_brdncost_fc      := NULL ;
11556     RAISE;
11557 END get_plan_costs_for_qty;
11558 
11559 /* Begin Fix for Bug # 4108270.*/
11560 
11561 FUNCTION get_pc_from_sub_tasks_assgn
11562 (p_project_id           NUMBER
11563 ,p_proj_element_id      NUMBER
11564 ,p_structure_version_id     NUMBER
11565 ,p_include_sub_tasks_flag   VARCHAR2 := 'Y'
11566 ,p_structure_type       VARCHAR2 := 'WORKPLAN'
11567 ,p_object_type          VARCHAR2 := 'PA_TASKS'
11568 ,p_as_of_date           DATE := null
11569 ,p_program_flag                 VARCHAR2 := 'Y' -- 4392189 : Program Reporting Changes - Phase 2
11570 )
11571 RETURN NUMBER
11572 IS
11573 
11574    CURSOR cur_assgn( c_task_ver_id NUMBER, c_task_per_comp_deriv_method VARCHAR2
11575                      , c_published_structure VARCHAR2, c_wp_rollup_method VARCHAR2
11576                      , c_as_of_date DATE, c_structure_type VARCHAR2
11577                      , c_structure_version_id NUMBER)
11578    IS
11579    SELECT asgn.resource_assignment_id resource_assignment_id
11580         , asgn.task_version_id task_version_id
11581         , 'PA_ASSIGNMENTS' object_type
11582         , asgn.resource_class_code resource_class_code
11583         , asgn.rate_based_flag rate_based_flag
11584         , decode(asgn.rate_based_flag,'Y','EFFORT','N','COST') assignment_type
11585     , ppr.PPL_ACT_EFFORT_TO_DATE + ppr.EQPMT_ACT_EFFORT_TO_DATE total_act_effort_to_date
11586     , ppr.EQPMT_ETC_EFFORT + ppr.estimated_remaining_effort total_etc_effort
11587     , ppr.OTH_ACT_COST_TO_DATE_TC + ppr.PPL_ACT_COST_TO_DATE_TC + ppr.EQPMT_ACT_COST_TO_DATE_TC total_act_cost_to_date_tc
11588         , ppr.OTH_ACT_COST_TO_DATE_PC + ppr.PPL_ACT_COST_TO_DATE_PC + ppr.EQPMT_ACT_COST_TO_DATE_PC total_act_cost_to_date_pc
11589         , ppr.OTH_ACT_COST_TO_DATE_FC + ppr.PPL_ACT_COST_TO_DATE_FC + ppr.EQPMT_ACT_COST_TO_DATE_FC total_act_cost_to_date_fc
11590         , ppr.OTH_ETC_COST_TC + ppr.PPL_ETC_COST_TC + ppr.EQPMT_ETC_COST_TC total_etc_cost_tc
11591         , ppr.OTH_ETC_COST_PC + ppr.PPL_ETC_COST_PC + ppr.EQPMT_ETC_COST_PC total_etc_cost_pc
11592         , ppr.OTH_ETC_COST_FC + ppr.PPL_ETC_COST_FC + ppr.EQPMT_ETC_COST_FC total_etc_cost_fc
11593 
11594     , decode(c_task_per_comp_deriv_method,'EFFORT'
11595                 , ( nvl(ppr.PPL_ACT_EFFORT_TO_DATE,0)
11596                      + nvl(ppr.EQPMT_ACT_EFFORT_TO_DATE,0))
11597                 , ( nvl(ppr.OTH_ACT_COST_TO_DATE_PC,0)
11598                      + nvl(ppr.PPL_ACT_COST_TO_DATE_PC,0)
11599                      + nvl(ppr.EQPMT_ACT_COST_TO_DATE_PC,0))) earned_value
11600         , decode(c_wp_rollup_method, 'COST'
11601                  , nvl(ppr.OTH_ACT_COST_TO_DATE_PC,0)
11602                    + nvl(ppr.PPL_ACT_COST_TO_DATE_PC,0)
11603                                + nvl(ppr.EQPMT_ACT_COST_TO_DATE_PC,0)
11604                    + nvl(ppr.OTH_ETC_COST_PC,0)
11605                    + nvl(ppr.PPL_ETC_COST_PC,0)
11606                            + nvl(ppr.EQPMT_ETC_COST_PC,0)
11607                  , 'EFFORT'
11608                  , decode(rate_based_flag,'N', 0,
11609                          nvl(ppr.PPL_ACT_EFFORT_TO_DATE,0)
11610                          + nvl(ppr.EQPMT_ACT_EFFORT_TO_DATE,0)
11611                          + nvl(ppr.EQPMT_ETC_EFFORT,0)
11612                          + nvl(ppr.estimated_remaining_effort,0)), 0) bac_value_in_rollup_method
11613         , decode(c_task_per_comp_deriv_method,'EFFORT'
11614                  , ( NVL( decode( asgn.rate_based_flag, 'Y',
11615                                   decode( asgn.resource_class_code,
11616                                          'PEOPLE', nvl(ppr.PPL_ACT_EFFORT_TO_DATE,0)
11617                                + nvl(ppr.estimated_remaining_effort,
11618                                                    decode(sign(nvl(asgn.planned_quantity,0)
11619                                     -nvl(ppr.PPL_ACT_EFFORT_TO_DATE,0)), -1, 0,
11620                                                  nvl( asgn.planned_quantity-ppr.PPL_ACT_EFFORT_TO_DATE,0))),
11621                                           'EQUIPMENT', nvl(ppr.EQPMT_ACT_EFFORT_TO_DATE,0)
11622                                + nvl(ppr.EQPMT_ETC_EFFORT,
11623                                                      decode(sign(nvl(asgn.planned_quantity,0)
11624                                  -nvl(ppr.EQPMT_ACT_EFFORT_TO_DATE,0)), -1, 0,
11625                                                  nvl( asgn.planned_quantity-ppr.EQPMT_ACT_EFFORT_TO_DATE,0)))),0),0)
11626                                    ),
11627                                  ( NVL( decode( asgn.resource_class_code,
11628                                        'FINANCIAL_ELEMENTS',
11629                                          nvl(ppr.OTH_ACT_COST_TO_DATE_PC,0) + nvl(ppr.OTH_ETC_COST_PC,
11630                                             decode(sign(nvl(asgn.planned_bur_cost_proj_cur,0)
11631                             -nvl(ppr.OTH_ACT_COST_TO_DATE_PC,0)), -1, 0,
11632                                                  nvl(asgn.planned_bur_cost_proj_cur-ppr.OTH_ACT_COST_TO_DATE_PC,0))),
11633                                        'MATERIAL_ITEMS',
11634                                          nvl(ppr.OTH_ACT_COST_TO_DATE_PC,0) + nvl(ppr.OTH_ETC_COST_PC,
11635                                             decode(sign(nvl(asgn.planned_bur_cost_proj_cur,0)
11636                            -nvl(ppr.OTH_ACT_COST_TO_DATE_PC,0)), -1, 0,
11637                                                  nvl( asgn.planned_bur_cost_proj_cur-ppr.OTH_ACT_COST_TO_DATE_PC,0))),
11638                                        'PEOPLE',
11639                                         nvl(ppr.PPL_ACT_COST_TO_DATE_PC,0) + nvl(ppr.PPL_ETC_COST_PC,
11640                                          decode(sign(nvl(asgn.planned_bur_cost_proj_cur,0)
11641                         -nvl(ppr.PPL_ACT_COST_TO_DATE_PC,0)), -1, 0,
11642                                                 nvl(asgn.planned_bur_cost_proj_cur-ppr.PPL_ACT_COST_TO_DATE_PC,0))),
11643                                        'EQUIPMENT',
11644                                         nvl(ppr.EQPMT_ACT_COST_TO_DATE_PC,0) + nvl(ppr.EQPMT_ETC_COST_PC,
11645                                          decode(sign(nvl(asgn.planned_bur_cost_proj_cur,0)
11646                         -nvl(ppr.EQPMT_ACT_COST_TO_DATE_PC,0)), -1, 0,
11647                                                 nvl(asgn.planned_bur_cost_proj_cur-ppr.EQPMT_ACT_COST_TO_DATE_PC,0)))),
11648                                     nvl(asgn.planned_bur_cost_proj_cur,0)
11649                                     ))) bac_value_in_task_deriv
11650    FROM
11651            pa_task_asgmts_v  asgn
11652            , pa_progress_rollup ppr
11653    WHERE asgn.task_version_id = c_task_ver_id
11654          AND asgn.project_id = p_project_id  ---4871809
11655          AND asgn.task_id = p_proj_element_id
11656          AND asgn.ta_display_flag = 'Y'
11657          AND asgn.project_id = ppr.project_id
11658          AND asgn.RESOURCE_LIST_MEMBER_ID = ppr.object_id
11659          AND asgn.task_id = ppr.proj_element_id
11660          AND ppr.object_type = 'PA_ASSIGNMENTS'
11661          AND ppr.as_of_date = pa_progress_utils.get_max_rollup_asofdate(asgn.project_id
11662                        ,asgn.RESOURCE_LIST_MEMBER_ID, 'PA_ASSIGNMENTS'
11663                        ,c_as_of_date,asgn.task_version_id, c_structure_type
11664                        , decode(c_published_structure, 'Y', null, c_structure_version_id), asgn.task_id)
11665          AND ppr.current_flag <> 'W'
11666          AND ppr.structure_type = c_structure_type
11667          AND ((c_published_structure = 'Y' AND ppr.structure_version_id is null)
11668                OR (c_published_structure = 'N'
11669                    AND ppr.structure_version_id = c_structure_version_id))
11670    UNION ALL
11671    SELECT asgn.resource_assignment_id resource_assignment_id
11672           , asgn.task_version_id task_version_id
11673           , 'PA_ASSIGNMENTS' object_type
11674           , asgn.resource_class_code resource_class_code
11675           , asgn.rate_based_flag rate_based_flag
11676           , decode(asgn.rate_based_flag,'Y','EFFORT','N','COST') assignment_type
11677           , to_number(null) total_act_effort_to_date
11678           , to_number(null) total_etc_effort
11679           , to_number(null) total_act_cost_to_date_tc
11680           , to_number(null) total_act_cost_to_date_pc
11681           , to_number(null) total_act_cost_to_date_fc
11682           , to_number(null) total_etc_cost_tc
11683           , to_number(null) total_etc_cost_pc
11684           , to_number(null) total_etc_cost_fc
11685           , to_number(null) earned_value
11686           , to_number(null) bac_value_in_rollup_method
11687           , decode(c_task_per_comp_deriv_method,'EFFORT',
11688                    decode(asgn.rate_based_flag,'Y',
11689                           decode(asgn.resource_class_code,'PEOPLE'
11690                                  , asgn.planned_quantity, 'EQUIPMENT'
11691                              , asgn.planned_quantity, 0),0)
11692                                 ,asgn.planned_bur_cost_proj_cur) bac_value_in_task_deriv
11693     FROM
11694           pa_task_asgmts_v  asgn
11695     WHERE asgn.task_version_id = c_task_ver_id
11696           AND  asgn.project_id = p_project_id  ---4871809
11697           AND  asgn.task_id = p_proj_element_id
11698           AND  pa_progress_utils.get_max_rollup_asofdate(asgn.project_id
11699                                         , asgn.RESOURCE_LIST_MEMBER_ID
11700                                 , 'PA_ASSIGNMENTS',c_as_of_date
11701                                 ,asgn.task_version_id
11702                                 , c_structure_type
11703                                 , decode(c_published_structure, 'Y', null
11704                                  , c_structure_version_id)
11705                             , asgn.task_id) IS NULL
11706           AND asgn.ta_display_flag = 'Y';
11707 
11708    CURSOR cur_check_published_version(c_structure_version_id NUMBER, c_project_id NUMBER)
11709    IS
11710    SELECT decode(status.project_system_status_code, 'STRUCTURE_PUBLISHED', 'Y', 'N')
11711    FROM pa_proj_elem_ver_structure str
11712    , pa_project_statuses status
11713    where str.element_version_id = c_structure_version_id
11714    AND str.project_id = c_project_id
11715    AND str.status_code = status.project_status_code;
11716 
11717    CURSOR cur_max_as_of_date_leq(c_project_id NUMBER, c_object_id NUMBER
11718                      , c_object_type VARCHAR2
11719                  , c_structure_type VARCHAR2
11720                  , c_published_structure VARCHAR2
11721                  , c_structure_version_id NUMBER
11722                  , c_as_of_date DATE)
11723    IS
11724    SELECT max(as_of_date)
11725    FROM pa_progress_rollup
11726    WHERE project_id = c_project_id
11727    AND object_id = c_object_id
11728    AND object_type = c_object_type
11729    AND structure_type = c_structure_type
11730    AND ((c_published_structure = 'Y' AND structure_version_id is null)
11731          OR (c_published_structure = 'N'
11732              AND structure_version_id = c_structure_version_id)
11733          OR (c_structure_type = 'FINANCIAL' AND structure_version_id is null)    /* Bug#6485646 */
11734         )
11735    AND current_flag <> 'W'
11736    AND as_of_date <= c_as_of_date;
11737 
11738    CURSOR cur_max_as_of_date(c_project_id NUMBER, c_object_id NUMBER
11739                              , c_object_type VARCHAR2, c_structure_type VARCHAR2
11740                              , c_published_structure VARCHAR2
11741                              , c_structure_version_id NUMBER)
11742    IS
11743    SELECT max(as_of_date)
11744    FROM pa_progress_rollup ppr, pa_proj_element_versions ppev -- Bug # 4658185.
11745    WHERE ppr.project_id = c_project_id
11746    AND ppr.object_id = c_object_id
11747    AND ppr.object_type = c_object_type
11748    AND ppr.structure_type = c_structure_type
11749    AND ppr.project_id = ppev.project_id  -- Bug # 4658185.
11750    AND ppr.object_id = ppev.proj_element_id  -- Bug # 4658185.
11751    AND ppr.object_version_id = ppev.element_version_id  -- Bug # 4658185.
11752    AND ppev.parent_structure_version_id = c_structure_version_id  -- Bug # 4658185.
11753    AND ((c_published_structure = 'Y' AND ppr.structure_version_id is null)
11754              OR (c_published_structure = 'N'
11755                      AND ppr.structure_version_id = c_structure_version_id))
11756    AND ppr.current_flag <> 'W';
11757 
11758 
11759     CURSOR cur_percent_comp(c_project_id NUMBER, c_object_id NUMBER
11760                 , c_object_type VARCHAR2, c_structure_type VARCHAR2
11761                 , c_as_of_date DATE, c_published_structure VARCHAR2
11762                 , c_structure_version_id NUMBER
11763                 , c_program_flag VARCHAR2 -- 4392189 : Program Reporting Changes - Phase 2
11764                 )
11765     IS
11766     SELECT nvl(ppr.completed_percentage,decode(nvl(c_program_flag,'Y'),'Y', ppr.eff_rollup_percent_comp, ppr.base_percent_complete))
11767     -- 4392189 : Program Reporting Changes - Phase 2 : Added Decode above
11768     FROM pa_progress_rollup ppr
11769     WHERE ppr.project_id = c_project_id
11770     and ppr.object_id = c_object_id
11771     and ppr.object_type = c_object_type
11772     and ppr.structure_type = c_structure_type
11773     and ((c_published_structure = 'Y' AND structure_version_id is null)
11774          OR (c_published_structure = 'N'
11775              AND structure_version_id = c_structure_version_id)
11776          OR (c_structure_type = 'FINANCIAL' AND structure_version_id is null)    /* Bug#6485646 */
11777              )
11778     and current_flag <> 'W'
11779     and ppr.as_of_date = c_as_of_date;
11780 
11781     CURSOR cur_base_pc_deriv_code(c_task_id NUMBER, c_project_id NUMBER
11782                       , c_object_type VARCHAR2)
11783     IS
11784     SELECT decode(elem.base_percent_comp_deriv_code, null
11785                   , ttype.base_percent_comp_deriv_code,'^'
11786                   ,ttype.base_percent_comp_deriv_code,elem.base_percent_comp_deriv_code)
11787     FROM pa_proj_elements elem
11788          , pa_task_types ttype
11789     where elem.proj_element_id = c_task_id
11790     AND elem.project_id = c_project_id
11791     AND elem.object_type =c_object_type
11792     AND elem.type_id = ttype.task_type_id;
11793 
11794     CURSOR cur_progress_rollup_method(c_project_id NUMBER, c_task_id NUMBER
11795                       , c_structure_type VARCHAR2
11796                       , c_object_type VARCHAR2)
11797     IS
11798     SELECT task_weight_basis_code
11799     from pa_proj_progress_attr pppa
11800     where pppa.project_id = c_project_id
11801     AND pppa.object_id = c_task_id
11802     AND pppa.structure_type = c_structure_type
11803     and pppa.object_type = c_object_type;
11804 
11805     l_return_pc                  NUMBER := null;
11806     l_act_cost               NUMBER := null;
11807     l_act_effort                 NUMBER := null;
11808     l_bac_value_in_rollup_method         NUMBER := null;
11809     l_task_per_comp_deriv_method         VARCHAR2(30) := null;
11810     l_progress_rollup_method         VARCHAR2(30) := null;
11811 
11812     l_published_structure            VARCHAR2(1) := null;
11813     l_as_of_date                 DATE := null;
11814 
11815 BEGIN
11816 
11817      -- 1). Determine if the input structure_version_id corresponds to a published
11818      --     structure version or not.
11819 
11820     OPEN cur_check_published_version(p_structure_version_id, p_project_id);
11821         FETCH cur_check_published_version INTO l_published_structure;
11822         CLOSE cur_check_published_version;
11823 
11824      -- 2.1). If the input structure_type is 'FINANCIAL' and input as_of_date is not null
11825      --       then use the max as_of_date in the pa_progress_rollup_table less than or equal to
11826      --       the input as_of_date.
11827 
11828      if ((p_structure_type = 'FINANCIAL') and (p_as_of_date is not null)) then
11829 
11830         open cur_max_as_of_date_leq(p_project_id, p_proj_element_id, p_object_type
11831                             , p_structure_type, l_published_structure
11832                                 , p_structure_version_id, p_as_of_date);
11833         fetch cur_max_as_of_date_leq into l_as_of_date;
11834         close cur_max_as_of_date_leq;
11835 
11836      -- 2.2). Else use the latest as_of_date in the pa_progress_rollup table for the
11837      --   given task or structure.
11838 
11839      else
11840 
11841         open cur_max_as_of_date(p_project_id, p_proj_element_id, p_object_type
11842                             , p_structure_type, l_published_structure
11843                             , p_structure_version_id);
11844         fetch cur_max_as_of_date into l_as_of_date;
11845         close cur_max_as_of_date;
11846 
11847      end if;
11848 
11849      -- 3.1). If the p_include_sub_tasks_flag = 'Y' or if the input proj_element_id
11850      --       is a structure_id then return the rolled-up percent complete for the task
11851      --       from the pa_progress_rollup table for the above determined as_of_date.
11852 
11853      if ((p_include_sub_tasks_flag = 'Y') or (p_object_type = 'PA_STRUCTURES')) then
11854 
11855         open cur_percent_comp(p_project_id, p_proj_element_id, p_object_type
11856                           , p_structure_type, l_as_of_date, l_published_structure
11857                           , p_structure_version_id
11858                           , p_program_flag) ; -- 4392189 : Program Reporting Changes - Phase 2
11859         fetch cur_percent_comp into l_return_pc;
11860         close cur_percent_comp;
11861 
11862      -- 3.2). If the p_include_sub_tasks_flag = 'N' then return the rolled-up
11863      --       percent complete from all the assignments directly associated with
11864      --       the task.
11865 
11866      else
11867 
11868          open cur_base_pc_deriv_code(p_proj_element_id, p_project_id, p_object_type);
11869          fetch cur_base_pc_deriv_code into l_task_per_comp_deriv_method;
11870          close cur_base_pc_deriv_code;
11871 
11872          open cur_progress_rollup_method(p_project_id, p_proj_element_id
11873                          , p_structure_type, p_object_type);
11874          fetch cur_progress_rollup_method into l_progress_rollup_method;
11875          close cur_progress_rollup_method;
11876 
11877          for cur_assgn_rec in cur_assgn(p_proj_element_id
11878                         , l_task_per_comp_deriv_method
11879                         , l_published_structure
11880                         , l_progress_rollup_method
11881                         , l_as_of_date
11882                         , p_structure_type
11883                         , p_structure_version_id)
11884          loop
11885 
11886              l_act_cost := (l_act_cost +  cur_assgn_rec.total_act_cost_to_date_pc);
11887              l_act_effort := (l_act_effort + cur_assgn_rec.total_act_effort_to_date);
11888              l_bac_value_in_rollup_method := (l_bac_value_in_rollup_method
11889                                   + cur_assgn_rec.bac_value_in_rollup_method);
11890 
11891          end loop;
11892 
11893          if (nvl(l_progress_rollup_method, 'COST') = 'EFFORT') then
11894 
11895             l_return_pc := (l_act_effort / l_bac_value_in_rollup_method);
11896 
11897          else
11898 
11899             l_return_pc := (l_act_cost / l_bac_value_in_rollup_method);
11900 
11901          end if;
11902 
11903      end if;
11904 
11905      -- Return the calculated value of percent complete.
11906 
11907      return(l_return_pc);
11908 
11909 END get_pc_from_sub_tasks_assgn;
11910 
11911 /* End Fix for Bug # 4108270.*/
11912 
11913 
11914 /* Begin fix for Bug # 4185974. */
11915 
11916 FUNCTION get_act_for_prev_asofdate (p_as_of_date         IN     DATE
11917                                 ,p_project_id        IN     NUMBER
11918                                 ,p_object_id         IN     NUMBER
11919                                 ,p_object_version_id IN     NUMBER
11920                     ,p_proj_element_id   IN     NUMBER := null
11921                     ,p_effort_cost_flag  IN VARCHAR2 := 'C'
11922                     ,p_cost_type_flag    IN VARCHAR2 := 'B'
11923                     ,p_currency_flag     IN VARCHAR2 := 'T') return NUMBER
11924 IS
11925 
11926     l_act_for_prev_asofdate     NUMBER := NULL;
11927 
11928         -- Begin fix for Bug # 4185974.
11929 
11930         cursor cur_proj_sharing_code is
11931                 select structure_sharing_Code
11932                 from pa_projects_all
11933                 where project_id=p_project_id;
11934 
11935         l_project_sharing_code          VARCHAR2(150);
11936 
11937         l_as_of_date                    DATE;
11938 
11939         -- End fix for Bug # 4185974.
11940 
11941     cursor cur_effort is
11942          select (nvl(ppr.ppl_act_effort_to_date,0)
11943              +nvl(ppr.eqpmt_act_effort_to_date,0)
11944              +nvl(ppr.subprj_ppl_act_effort,0)
11945              +nvl(ppr.subprj_eqpmt_act_effort,0)
11946              +nvl(ppr.oth_quantity_to_date,0)) act_effort_prev_asofdate
11947                 from pa_progress_rollup ppr
11948                 where ppr.project_id = p_project_id
11949                 and ppr.object_id = p_object_id
11950                 and ppr.structure_type = 'WORKPLAN'
11951         and ppr.proj_element_id = p_proj_element_id
11952         and ppr.structure_version_id is null
11953                 and ppr.as_of_date = (select max(ppr2.as_of_date)
11954                                       from pa_progress_rollup ppr2
11955                                       where ppr2.project_id = p_project_id
11956                                       and ppr2.object_id = p_object_id
11957                       and ppr2.structure_type = 'WORKPLAN'
11958                       and ppr2.proj_element_id = p_proj_element_id
11959                       and ppr2.structure_version_id is null
11960                       and ppr2.current_flag <> 'W' -- Fix for Bug # 4249286.
11961                                    -- Fix for Bug # 4185974.
11962                       and ppr2.as_of_date < l_as_of_date); -- Fix for Bug # 4185974.
11963                                       -- and ppr2.as_of_date < pa_progress_utils.get_prog_asofdate()+1);
11964                                         -- Fix for Bug # 4222702.
11965                                         -- Fix for Bug # 4185974.
11966 
11967 --- adding 1 in pa_progress_utils.get_prog_asofdate so that it works fine for shared structures
11968     cursor cur_bur_cost_tc is
11969         select (nvl(ppr.oth_act_cost_to_date_tc,0)
11970             +nvl(ppr.ppl_act_cost_to_date_tc,0)
11971                         +nvl(ppr.eqpmt_act_cost_to_date_tc,0)
11972             +nvl(ppr.subprj_oth_act_cost_to_date_tc,0)
11973                         +nvl(ppr.subprj_ppl_act_cost_tc,0)
11974             +nvl(ppr.subprj_eqpmt_act_cost_tc,0)) act_bur_cost_tc_prev_asofdate
11975                 from pa_progress_rollup ppr
11976                 where ppr.project_id = p_project_id
11977                 and ppr.object_id = p_object_id
11978                 and ppr.structure_type = 'WORKPLAN'
11979         and ppr.proj_element_id = p_proj_element_id
11980         and ppr.structure_version_id is null
11981                 and ppr.as_of_date = (select max(ppr2.as_of_date)
11982                                       from pa_progress_rollup ppr2
11983                                       where ppr2.project_id = p_project_id
11984                                       and ppr2.object_id = p_object_id
11985                       and ppr2.structure_type = 'WORKPLAN'
11986                       and ppr2.proj_element_id = p_proj_element_id
11987                       and ppr2.structure_version_id is null
11988                       and ppr2.current_flag <> 'W' -- Fix for Bug # 4249286.
11989                                   -- Fix for Bug # 4185974.
11990                       and ppr2.as_of_date < l_as_of_date); -- Fix for Bug # 4185974.
11991                                       -- and ppr2.as_of_date < pa_progress_utils.get_prog_asofdate()+1);
11992                                         -- Fix for Bug # 4222702.
11993                                         -- Fix for Bug # 4185974.
11994         cursor cur_bur_cost_pc is
11995                  select (nvl(ppr.oth_act_cost_to_date_pc,0)
11996              +nvl(ppr.ppl_act_cost_to_date_pc,0)
11997                          +nvl(ppr.eqpmt_act_cost_to_date_pc,0)
11998              +nvl(ppr.subprj_oth_act_cost_to_date_pc,0)
11999                          +nvl(ppr.subprj_ppl_act_cost_pc,0)
12000              +nvl(ppr.subprj_eqpmt_act_cost_pc,0)) act_bur_cost_pc_prev_asofdate
12001                 from pa_progress_rollup ppr
12002                 where ppr.project_id = p_project_id
12003                 and ppr.object_id = p_object_id
12004                 and ppr.structure_type = 'WORKPLAN'
12005                 and ppr.proj_element_id = p_proj_element_id
12006                 and ppr.structure_version_id is null
12007                 and ppr.as_of_date = (select max(ppr2.as_of_date)
12008                                       from pa_progress_rollup ppr2
12009                                       where ppr2.project_id = p_project_id
12010                                       and ppr2.object_id = p_object_id
12011                                       and ppr2.structure_type = 'WORKPLAN'
12012                                       and ppr2.proj_element_id = p_proj_element_id
12013                                       and ppr2.structure_version_id is null
12014                       and ppr2.current_flag <> 'W' -- Fix for Bug # 4249286.
12015                                    -- Fix for Bug # 4185974.
12016                       and ppr2.as_of_date < l_as_of_date); -- Fix for Bug # 4185974.
12017                                       -- and ppr2.as_of_date < pa_progress_utils.get_prog_asofdate()+1);
12018                                         -- Fix for Bug # 4222702.
12019                                         -- Fix for Bug # 4185974.
12020 
12021         cursor cur_raw_cost_tc is
12022          select (nvl(ppr.oth_act_rawcost_to_date_tc,0)
12023              +nvl(ppr.ppl_act_rawcost_to_date_tc,0)
12024                          +nvl(ppr.eqpmt_act_rawcost_to_date_tc,0)
12025              +nvl(ppr.spj_oth_act_rawcost_to_date_tc,0)
12026                          +nvl(ppr.subprj_ppl_act_rawcost_tc,0)
12027              +nvl(ppr.subprj_eqpmt_act_rawcost_tc,0)) act_raw_cost_tc_prev_asofdate
12028                 from pa_progress_rollup ppr
12029                 where ppr.project_id = p_project_id
12030                 and ppr.object_id = p_object_id
12031                 and ppr.structure_type = 'WORKPLAN'
12032                 and ppr.proj_element_id = p_proj_element_id
12033                 and ppr.structure_version_id is null
12034                 and ppr.as_of_date = (select max(ppr2.as_of_date)
12035                                       from pa_progress_rollup ppr2
12036                                       where ppr2.project_id = p_project_id
12037                                       and ppr2.object_id = p_object_id
12038                                       and ppr2.structure_type = 'WORKPLAN'
12039                                       and ppr2.proj_element_id = p_proj_element_id
12040                                       and ppr2.structure_version_id is null
12041                       and ppr2.current_flag <> 'W' -- Fix for Bug # 4249286.
12042                                   -- Fix for Bug # 4185974.
12043                       and ppr2.as_of_date < l_as_of_date); -- Fix for Bug # 4185974.
12044                                       -- and ppr2.as_of_date < pa_progress_utils.get_prog_asofdate()+1);
12045                                         -- Fix for Bug # 4222702.
12046                                         -- Fix for Bug # 4185974.
12047 
12048 BEGIN
12049 
12050     -- Begin fix for Bug # 4185974.
12051 
12052          l_as_of_date := pa_progress_utils.get_prog_asofdate();
12053 
12054          open cur_proj_sharing_code;
12055 
12056          fetch cur_proj_sharing_code into l_project_sharing_code;
12057 
12058          close cur_proj_sharing_code;
12059 
12060          if (nvl(l_project_sharing_Code,'X') = 'SHARE_FULL') then
12061 
12062             l_as_of_date := l_as_of_date + 1;
12063 
12064          end if;
12065 
12066     -- End fix for Bug # 4185974.
12067 
12068      if (p_effort_cost_flag = 'E') then
12069 
12070         open cur_effort;
12071         fetch cur_effort into l_act_for_prev_asofdate;
12072         close cur_effort;
12073 
12074      else
12075 
12076         if ((p_cost_type_flag  = 'B') and (p_currency_flag  = 'T'))  then
12077 
12078             open cur_bur_cost_tc;
12079             fetch cur_bur_cost_tc into l_act_for_prev_asofdate;
12080             close cur_bur_cost_tc;
12081 
12082         elsif ((p_cost_type_flag  = 'B') and (p_currency_flag  = 'P'))  then
12083 
12084                         open cur_bur_cost_pc;
12085                         fetch cur_bur_cost_pc into l_act_for_prev_asofdate;
12086                         close cur_bur_cost_pc;
12087 
12088         elsif ((p_cost_type_flag  = 'R') and (p_currency_flag  = 'T'))  then
12089 
12090                         open cur_raw_cost_tc;
12091                         fetch cur_raw_cost_tc into l_act_for_prev_asofdate;
12092                         close cur_raw_cost_tc;
12093 
12094         end if;
12095 
12096     end if;
12097 
12098 
12099     l_act_for_prev_asofdate := nvl(l_act_for_prev_asofdate,0);
12100 
12101 /*      4378391  -ive act is allowed
12102         if (l_act_for_prev_asofdate < 0 ) then
12103 
12104         l_act_for_prev_asofdate := 0;
12105 
12106     end if; */
12107 
12108     return(l_act_for_prev_asofdate);
12109 
12110 END get_act_for_prev_asofdate;
12111 
12112 /* End fix for Bug # 4185974. */
12113 
12114 
12115 -- Begin fix for Bug # 4319171.
12116 
12117 function calc_act(p_ppl_cost_eff        IN NUMBER := null
12118                   , p_eqpmt_cost_eff        IN NUMBER := null
12119                   , p_oth_cost_eff      IN NUMBER := null
12120                   , p_subprj_ppl_cost_eff   IN NUMBER := null
12121           , p_subprj_eqpmt_cost_eff     IN NUMBER := null
12122           , p_subprj_oth_cost_eff   IN NUMBER := null) return NUMBER
12123 is
12124 
12125     l_calc_act NUMBER := null;
12126 
12127 begin
12128 
12129     if ((p_ppl_cost_eff is null)
12130             and (p_eqpmt_cost_eff is null)
12131             and (p_oth_cost_eff is null)
12132         and (p_subprj_ppl_cost_eff is null)
12133             and (p_subprj_eqpmt_cost_eff is null)
12134             and (p_subprj_oth_cost_eff is null)) then
12135 
12136         l_calc_act := null;
12137 
12138     else
12139 
12140         l_calc_act := (nvl(p_ppl_cost_eff,0)
12141                            + nvl(p_eqpmt_cost_eff,0)
12142                            + nvl(p_oth_cost_eff,0)
12143                            + nvl(p_subprj_ppl_cost_eff,0)
12144                            + nvl(p_subprj_eqpmt_cost_eff,0)
12145                            + nvl(p_subprj_oth_cost_eff,0));
12146 
12147     end if;
12148 
12149     return(l_calc_act);
12150 
12151 end calc_act;
12152 
12153 function calc_etc(p_planned_cost_eff        IN NUMBER := null
12154           , p_ppl_cost_eff              IN NUMBER := null
12155                   , p_eqpmt_cost_eff            IN NUMBER := null
12156                   , p_oth_cost_eff              IN NUMBER := null
12157                   , p_subprj_ppl_cost_eff       IN NUMBER := null
12158                   , p_subprj_eqpmt_cost_eff     IN NUMBER := null
12159                   , p_subprj_oth_cost_eff       IN NUMBER := null
12160                   , p_oth_quantity              IN NUMBER := null
12161           , p_act_cost_eff      IN NUMBER := null) return NUMBER
12162 is
12163 
12164         l_calc_etc NUMBER := null;
12165 
12166 begin
12167 
12168         if ((p_ppl_cost_eff is null)
12169             and (p_eqpmt_cost_eff is null)
12170             and (p_oth_cost_eff is null)
12171             and (p_subprj_ppl_cost_eff is null)
12172             and (p_subprj_eqpmt_cost_eff is null)
12173             and (p_subprj_oth_cost_eff is null)
12174         and (p_oth_quantity is null)) then
12175 
12176 
12177         if ((p_planned_cost_eff is null)
12178             and (p_act_cost_eff is null)) then
12179 
12180             l_calc_etc := null;
12181 
12182         elsif (p_act_cost_eff is null) then
12183 
12184             l_calc_etc := p_planned_cost_eff;
12185 
12186         elsif (p_planned_cost_eff is null) then
12187 
12188 
12189             l_calc_etc := 0;
12190 
12191 
12192         else
12193 
12194             ---5726773        l_calc_etc := (nvl(p_planned_cost_eff,0) - nvl(p_act_cost_eff,0));
12195  	    l_calc_etc := PA_FP_FCST_GEN_AMT_UTILS.get_etc_from_plan_act(nvl(p_planned_cost_eff,0), nvl(p_act_cost_eff,0));
12196 
12197         end if;
12198 
12199         else
12200 
12201                 l_calc_etc := (nvl(p_ppl_cost_eff,0)
12202                                + nvl(p_eqpmt_cost_eff,0)
12203                                + nvl(p_oth_cost_eff,0)
12204                                + nvl(p_subprj_ppl_cost_eff,0)
12205                                + nvl(p_subprj_eqpmt_cost_eff,0)
12206                                + nvl(p_subprj_oth_cost_eff,0)
12207                    + nvl(p_oth_quantity,0));
12208 
12209     end if;
12210 
12211 /* 5726773
12212     if (l_calc_etc < 0) then
12213 
12214         l_calc_etc := 0;
12215 
12216     end if;
12217 */
12218 
12219     return(l_calc_etc);
12220 
12221 end calc_etc;
12222 
12223 function calc_wetc(p_planned_cost_eff           IN NUMBER := null
12224                   , p_ppl_cost_eff              IN NUMBER := null
12225                   , p_eqpmt_cost_eff            IN NUMBER := null
12226                   , p_oth_cost_eff              IN NUMBER := null
12227                   , p_subprj_ppl_cost_eff       IN NUMBER := null
12228                   , p_subprj_eqpmt_cost_eff     IN NUMBER := null
12229                   , p_subprj_oth_cost_eff       IN NUMBER := null
12230                   , p_oth_quantity              IN NUMBER := null) return NUMBER
12231 is
12232 
12233         l_calc_wetc NUMBER := null;
12234 
12235 begin
12236 
12237         if ((p_planned_cost_eff is null)
12238         and (p_ppl_cost_eff is null)
12239             and (p_eqpmt_cost_eff is null)
12240             and (p_oth_cost_eff is null)
12241             and (p_subprj_ppl_cost_eff is null)
12242             and (p_subprj_eqpmt_cost_eff is null)
12243             and (p_subprj_oth_cost_eff is null)
12244             and (p_oth_quantity is null)) then
12245 
12246         l_calc_wetc := null;
12247 
12248     else
12249 
12250         l_calc_wetc := nvl(p_planned_cost_eff,0) - (nvl(p_ppl_cost_eff,0)
12251                                                 + nvl(p_eqpmt_cost_eff,0)
12252                                                 + nvl(p_oth_cost_eff,0)
12253                                                 + nvl(p_subprj_ppl_cost_eff,0)
12254                                                 + nvl(p_subprj_eqpmt_cost_eff,0)
12255                                                 + nvl(p_subprj_oth_cost_eff,0)
12256                                                 + nvl(p_oth_quantity,0));
12257 
12258     end if;
12259 
12260         if (l_calc_wetc < 0) then
12261 
12262                 l_calc_wetc := 0;
12263 
12264         end if;
12265 
12266         return(l_calc_wetc);
12267 
12268 end calc_wetc;
12269 
12270 function calc_plan(p_ppl_cost_eff                IN NUMBER := null
12271                    , p_eqpmt_cost_eff            IN NUMBER := null
12272                    , p_oth_cost_eff              IN NUMBER := null) return NUMBER
12273 
12274 is
12275 
12276         l_calc_plan NUMBER := null;
12277 
12278 begin
12279 
12280         if ((p_ppl_cost_eff is null)
12281             and (p_eqpmt_cost_eff is null)
12282             and (p_oth_cost_eff is null)) then
12283 
12284                 l_calc_plan := null;
12285 
12286         else
12287 
12288                 l_calc_plan := (nvl(p_ppl_cost_eff,0)
12289                                + nvl(p_eqpmt_cost_eff,0)
12290                                + nvl(p_oth_cost_eff,0));
12291 
12292         end if;
12293 
12294         return(l_calc_plan);
12295 
12296 end calc_plan;
12297 
12298 -- End fix for Bug # 4319171.
12299 
12300 -- Bug 4490532 Begin
12301 function get_self_amounts(p_amount_type         IN VARCHAR2
12302                    , p_structure_sharing_code   IN VARCHAR2
12303                    , p_prg_group                IN NUMBER
12304            , p_project_id       IN NUMBER
12305            , p_object_version_id    IN NUMBER
12306            , p_proj_element_id      IN NUMBER
12307            , p_as_of_date       IN DATE
12308            , p_current_flag     IN VARCHAR2
12309            , p_record_version_number    IN NUMBER
12310            ) return NUMBER
12311 IS
12312 
12313 
12314 CURSOR c_get_assgn_prog_rec IS
12315 -- 4573486 Just consider ppl amounts, not eqp
12316 --select nvl(ppl_act_effort_to_date,0)+nvl(eqpmt_act_effort_to_date,0) asgn_act_eff
12317 --  ,nvl(ppl_act_cost_to_date_pc,0)+nvl(eqpmt_act_cost_to_date_pc,0)+nvl(oth_act_cost_to_date_pc,0) asgn_act_cost
12318 --  ,nvl(estimated_remaining_effort,0)+nvl(eqpmt_etc_effort,0) asgn_etc_eff
12319 --  ,nvl(ppl_etc_cost_pc,0)+nvl(eqpmt_etc_cost_pc,0)+nvl(oth_etc_cost_pc,0) agn_etc_cost
12320 select nvl(ppl_act_effort_to_date,0) asgn_act_eff
12321     ,nvl(ppl_act_cost_to_date_pc,0) asgn_act_cost
12322     ,nvl(estimated_remaining_effort,0) asgn_etc_eff
12323     ,nvl(ppl_etc_cost_pc,0) agn_etc_cost
12324 from pa_progress_rollup ppr
12325 where ppr.project_id = p_project_id
12326 and ppr.proj_element_id = p_proj_element_id
12327 and ppr.structure_type = 'WORKPLAN'
12328 and ppr.structure_version_id is null
12329 and ppr.object_type = 'PA_ASSIGNMENTS'
12330 and ppr.current_flag = p_current_flag
12331 and ppr.as_of_date = p_as_of_date;
12332 
12333 l_actual_effort NUMBER;
12334 l_actual_cost NUMBER;
12335 l_etc_effort NUMBER;
12336 l_etc_cost NUMBER;
12337 l_need_fetch VARCHAR2(1):='N';
12338 
12339 BEGIN
12340     IF p_prg_group is NULL THEN
12341         return to_number(null);
12342     END IF;
12343     IF g_self_project_id IS NOT NULL THEN
12344         IF g_self_project_id = p_project_id AND g_self_object_version_id = p_object_version_id
12345            AND g_self_as_of_date = p_as_of_date AND g_self_current_flag = p_current_flag
12346            AND g_self_rec_version_number = p_record_version_number
12347         THEN
12348             l_actual_effort := g_self_act_effort;
12349             l_actual_cost := g_self_act_cost;
12350             l_etc_effort := g_self_etc_effort;
12351             l_etc_cost := g_self_etc_cost;
12352   	    -- 4591308 : Added code below
12353 	    -- This is a temporary solution, ideally We should include progress_rollup_id also to this
12354 	    -- function and it should be passed from the veiws patvw018.sql and patvw007.sql.
12355 	    IF  p_amount_type = 'ACT_COST' THEN
12356 		l_need_fetch := 'Y';
12357 	    END IF;
12358         ELSE
12359             l_need_fetch := 'Y';
12360         END IF;
12361     ELSE
12362         l_need_fetch := 'Y';
12363     END IF;
12364 
12365     IF l_need_fetch = 'Y' THEN
12366 
12367         IF PA_PROGRESS_UTILS.check_assignment_exists(p_project_id, p_object_version_id, 'PA_TASKS') = 'Y' THEN
12368             l_actual_effort := null;
12369             l_actual_cost := null;
12370             l_etc_effort := null;
12371             l_etc_cost := null;
12372         ELSE
12373             OPEN c_get_assgn_prog_rec;
12374             FETCH c_get_assgn_prog_rec INTO l_actual_effort, l_actual_cost, l_etc_effort, l_etc_cost;
12375             CLOSE c_get_assgn_prog_rec;
12376             IF p_structure_sharing_code = 'SHARE_FULL' THEN
12377                 l_actual_effort := null;
12378                 l_actual_cost := null;
12379             END IF;
12380         END IF;
12381 
12382         g_self_project_id := p_project_id;
12383         g_self_object_version_id := p_object_version_id;
12384         g_self_as_of_date := p_as_of_date;
12385         g_self_current_flag := p_current_flag;
12386         g_self_rec_version_number := p_record_version_number;
12387         g_self_act_effort := l_actual_effort;
12388         g_self_act_cost := l_actual_cost;
12389         g_self_etc_effort := l_etc_effort;
12390         g_self_etc_cost := l_etc_cost;
12391     END IF;
12392 
12393     IF p_amount_type = 'ACT_COST' THEN
12394         return l_actual_cost;
12395     ELSIF p_amount_type = 'ACT_EFFORT' THEN
12396         return l_actual_effort;
12397     ELSIF p_amount_type = 'ETC_COST' THEN
12398         return l_etc_cost;
12399     ELSIF p_amount_type = 'ETC_EFFORT' THEN
12400         return l_etc_effort;
12401     ELSE
12402         return to_number(null);
12403     END IF;
12404 END get_self_amounts;
12405 -- Bug 4490532 End
12406 
12407 function check_etc_overridden(p_plan_qty    IN   NUMBER,
12408  	                               p_actual_qty  IN   NUMBER,
12409  	                               p_etc_qty     IN   NUMBER) return varchar2 IS
12410  	 begin
12411  	     if (nvl(p_actual_qty,0) >= nvl(p_plan_qty,0) and nvl(p_plan_qty,0) < 0 and nvl(p_etc_qty,0) = nvl(p_plan_qty,0) - nvl(p_actual_qty,0)) then
12412  	        return 'N';
12413  	     elsif (nvl(p_actual_qty,0) >= nvl(p_plan_qty,0) and nvl(p_plan_qty,0) > 0 and nvl(p_etc_qty,0) = 0) then
12414  	        return 'N';
12415  	     elsif (nvl(p_actual_qty,0) <= nvl(p_plan_qty,0) and nvl(p_plan_qty,0) < 0 and nvl(p_etc_qty,0) = 0) then
12416  	        return 'N';
12417  	     elsif (nvl(p_actual_qty,0) <= nvl(p_plan_qty,0) and nvl(p_plan_qty,0) > 0 and nvl(p_etc_qty,0) = nvl(p_plan_qty,0) - nvl(p_actual_qty,0)) then
12418  	        return 'N';
12419  	     else  return 'Y';
12420  	     end if;
12421 end check_etc_overridden;
12422 
12423 
12424 -- Bug 4871809, added this function for performance reasons, used in pa_progress_pvt
12425 function get_w_pub_prupid_asofdate(p_project_id  IN  number,
12426                                    p_object_id   IN  number,
12427                                    p_object_type IN  varchar2,
12428                                    p_task_id     IN  number,
12429                                    p_as_of_date  IN  date,
12430                                    p_chk_task    IN  varchar2 default 'Y') return number is
12431 cursor get_work_prog_rollupid is
12432 select progress_rollup_id
12433             FROM pa_progress_rollup
12434            WHERE project_id = p_project_id
12435              AND object_id = p_object_id
12436              AND decode(p_chk_task,'Y',proj_element_id,p_task_id) = p_task_id
12437              AND object_type = p_object_type
12438              AND structure_type = 'WORKPLAN'
12439              AND structure_version_id is null
12440              AND as_of_date <= p_as_of_date
12441              AND current_flag = 'W';
12442 
12443 cursor get_pub_prog_rollupid is
12444 select progress_rollup_id
12445   from pa_progress_rollup ppr
12446  WHERE ppr.project_id = p_project_id
12447    AND ppr.object_id = p_object_id
12448    AND decode(p_chk_task,'Y',ppr.proj_element_id,p_task_id) = p_task_id
12449    AND ppr.object_type = p_object_Type
12450    AND ppr.structure_type = 'WORKPLAN'
12451    AND ppr.structure_version_id is null
12452    AND ppr.as_of_date = (select max(as_of_date)
12453                       from pa_progress_rollup
12454                      where project_id = p_project_id
12455                        AND object_id = p_object_id
12456                        AND decode(p_chk_task,'Y',proj_element_id,p_task_id) = p_task_id
12457                        AND object_type = p_object_Type
12458                        AND structure_type = 'WORKPLAN'
12459                        AND structure_version_id is null
12460                        AND as_of_Date <= p_as_of_date);
12461 
12462  l_prog_rid number;
12463  l_date     date;
12464 begin
12465   open get_work_prog_rollupid;
12466   fetch get_work_prog_rollupid into l_prog_rid;
12467   close get_work_prog_rollupid;
12468 
12469   if l_prog_rid is not null then
12470      return l_prog_rid;
12471   else
12472      open get_pub_prog_rollupid;
12473      fetch get_pub_prog_rollupid into l_prog_rid;
12474      close get_pub_prog_rollupid;
12475      if (l_prog_rid is not null) then
12476         return l_prog_rid;
12477      else
12478         return -99;
12479      end if;
12480   end if;
12481 
12482 end get_w_pub_prupid_asofdate;
12483 
12484 function get_w_pub_currflag(p_project_id  IN  number,
12485                             p_object_id   IN  number,
12486                             p_object_type IN  varchar2,
12487                             p_task_id     IN  number,
12488                             p_chk_task    IN  varchar2 default 'N') return varchar2 is
12489   cursor get_w_pub_currflag is
12490   select current_flag
12491     FROM pa_progress_rollup
12492    WHERE project_id = p_project_id
12493      AND object_id = p_object_id
12494      AND object_type = p_object_type
12495      AND decode(p_chk_task,'Y',proj_element_id,nvl(p_task_id,-99)) = nvl(p_task_id,-99)
12496      AND structure_type = 'WORKPLAN'
12497      AND structure_version_id is null
12498      AND current_flag in ('W','Y')
12499    order by current_flag asc;
12500 
12501   l_curr_flag   varchar2(1):= null;
12502 begin
12503   open get_w_pub_currflag;
12504   fetch get_w_pub_currflag into l_curr_flag;
12505   close get_w_pub_currflag;
12506 
12507 return nvl(l_curr_flag,'X');
12508 
12509 end get_w_pub_currflag;
12510 
12511 function check_ta_has_prog(
12512                            p_project_id IN NUMBER,
12513                            p_proj_element_id IN NUMBER,
12514                            p_element_ver_id IN NUMBER ) return varchar2 is
12515 	cursor C_TA_PROG_CURSOR is
12516 	select 'Y'
12517 	from
12518 	pa_resource_assignments pra,
12519 	pa_progress_rollup ppr
12520 	where pra.ta_display_flag = 'N'
12521 			and pra.wbs_element_version_id = p_element_ver_id
12522 			and pra.project_id = p_project_id
12523 			and ppr.project_id = p_project_id
12524 			and ppr.object_type = 'PA_ASSIGNMENTS'
12525 			and ppr.object_id = pra.resource_list_member_id
12526 			and ppr.structure_type = 'WORKPLAN'
12527 			and ppr.structure_version_id is null
12528 			and ppr.proj_element_id = p_proj_element_id
12529 			and rownum = 1;
12530 
12531 	l_result varchar2(10);
12532 begin
12533    open C_TA_PROG_CURSOR;
12534 			fetch C_TA_PROG_CURSOR into l_result;
12535 			if C_TA_PROG_CURSOR%FOUND THEN
12536         close C_TA_PROG_CURSOR;
12537         return 'Y';
12538    ELSE
12539         close C_TA_PROG_CURSOR;
12540         return 'N';
12541    END IF;
12542 end check_ta_has_prog;
12543 
12544 --Bug 6664716
12545 -- This function is used to calculate the planned value prorated for the period and the amounts are rolled up
12546 -- to the parent tasks. This proc stores the planned value all the elements of the given structure id in
12547 -- temporary table the first time when it is called and uses the values from this table for next calls.
12548 PROCEDURE get_plan_value(p_project_id number, p_structure_version_id number, p_element_id number, p_as_of_date date)
12549 
12550 IS
12551 
12552 -- Bug 7259306 - Outer join added to the inner inline view for all 6 cursors on pa_progress_rollup table.
12553 
12554 -- Working as of date
12555 
12556 --This cursor retrieves the accumulated amounts for the periods before each task  before as of date period
12557   cursor cur_accum_amts_w (p_project_id NUMBER, p_structure_version_id NUMBER, p_baseline_struc_id NUMBER,
12558                          p_proj_element_id NUMBER,p_cal_id NUMBER, p_cal_type varchar, p_as_of_date date) is
12559   select time_id.proj_element_id proj_element_id
12560        ,time_id.as_of_date as_of_date
12561        ,sum(pfxaf.labor_hrs) labor_hours
12562        ,sum(pfxaf.equipment_hours) equipment_hours
12563        ,sum(pfxaf.brdn_cost) prj_brdn_cost
12564     from   pji_fp_xbs_accum_f pfxaf,
12565            pa_budget_versions pbv,
12566            (
12567             select prog_date.proj_element_id proj_element_id,
12568             prog_date.as_of_date as_of_date,
12569             ptcpv.cal_period_id cal_period_id,
12570             ptcpv.name period_name,
12571             ptcpv.start_date pstart_date,
12572             ptcpv.end_date pend_date
12573             from
12574             PJI_TIME_CAL_PERIOD_V ptcpv,
12575              (
12576                select ppv.proj_element_id proj_element_id,
12577                       nvl(p_as_of_date,(ppr.as_of_date)) as_of_date
12578                from pa_progress_rollup ppr,
12579                       pa_proj_element_versions ppv
12580                 where ppv.parent_structure_version_id=p_structure_version_id
12581                   and ppv.project_id=p_project_id
12582                 and ppv.proj_element_id=p_proj_element_id
12583                 and ppr.object_id (+) =ppv.proj_element_id
12584                 and ppr.object_version_id (+) =ppv.element_version_id
12585                 and ppr.project_id (+) = ppv.project_id
12586                 and ppr.structure_version_id (+) = ppv.parent_structure_version_id
12587                 and ppr.structure_type (+) = 'WORKPLAN'
12588                 and ppr.current_flag (+) = 'Y'
12589              )prog_date
12590              where ptcpv.calendar_id=p_cal_id
12591             -- and ptcpv.start_date <= prog_date.as_of_date
12592              and ptcpv.end_date <= prog_date.as_of_date
12593            )time_id
12594     where  pfxaf.project_id=p_project_id
12595     and    pfxaf.project_id=pbv.project_id
12596     and    pbv.project_structure_version_id=p_baseline_struc_id
12597     and    pbv.budget_version_id=pfxaf.plan_version_id
12598     and    pfxaf.project_element_id=time_id.proj_element_id
12599     and    pfxaf.wbs_rollup_flag='N'
12600     and    pfxaf.rbs_aggr_level='T'
12601     and    pfxaf.prg_rollup_flag='N'
12602     and    pfxaf.period_type_id=32
12603     and    pfxaf.calendar_type=p_cal_type
12604     and    pfxaf.time_id=time_id.cal_period_id
12605     group by time_id.proj_element_id
12606        ,time_id.as_of_date ;
12607 
12608   cursor cur_curr_prd_amts_w (p_project_id NUMBER, p_structure_version_id NUMBER, p_baseline_struc_id NUMBER,
12609                          p_proj_element_id NUMBER,p_cal_id NUMBER, p_cal_type varchar, p_as_of_date date) is
12610   select pfxaf.project_element_id proj_element_id
12611        ,time_id.pstart_date pstart_date
12612        ,time_id.pend_date pend_date
12613        ,time_id.as_of_date as_of_date
12614        ,pfxaf.labor_hrs labor_hours
12615        ,pfxaf.equipment_hours equipment_hours
12616        ,pfxaf.brdn_cost prj_brdn_cost
12617     from   pji_fp_xbs_accum_f pfxaf,
12618            pa_budget_versions pbv,
12619            (
12620             select prog_date.proj_element_id proj_element_id,
12621             prog_date.as_of_date as_of_date,
12622             ptcpv.cal_period_id cal_period_id,
12623             ptcpv.name period_name,
12624             ptcpv.start_date pstart_date,
12625             ptcpv.end_date pend_date
12626             from
12627             PJI_TIME_CAL_PERIOD_V ptcpv,
12628              (
12629                select ppv.proj_element_id proj_element_id,
12630                       nvl(p_as_of_date,(ppr.as_of_date)) as_of_date
12631                from pa_progress_rollup ppr,
12632                       pa_proj_element_versions ppv
12633                 where ppv.parent_structure_version_id=p_structure_version_id
12634                   and ppv.project_id=p_project_id
12635                 and ppv.proj_element_id=p_proj_element_id
12636                 and ppr.object_id (+) =ppv.proj_element_id
12637                 and ppr.object_version_id (+) =ppv.element_version_id
12638                 and ppr.project_id (+) = ppv.project_id
12639                 and ppr.structure_version_id (+) = ppv.parent_structure_version_id
12640                 and ppr.structure_type (+) = 'WORKPLAN'
12641                 and ppr.current_flag (+) = 'Y'
12642              )prog_date
12643              where ptcpv.calendar_id=p_cal_id
12644              and ptcpv.start_date <= prog_date.as_of_date
12645              and ptcpv.end_date >prog_date.as_of_date
12646            )time_id
12647     where  pfxaf.project_id=p_project_id
12648     and    pfxaf.project_id=pbv.project_id
12649     and    pbv.project_structure_version_id=p_baseline_struc_id
12650     and    pbv.budget_version_id=pfxaf.plan_version_id
12651     and    pfxaf.project_element_id=time_id.proj_element_id
12652     and    pfxaf.wbs_rollup_flag='N'
12653     and    pfxaf.rbs_aggr_level='T'
12654     and    pfxaf.prg_rollup_flag='N'
12655     and    pfxaf.period_type_id=32
12656     and    pfxaf.calendar_type=p_cal_type
12657     and    pfxaf.time_id=time_id.cal_period_id
12658     ;
12659 
12660 
12661 
12662 -- Latest Published
12663 --This cursor retrieves the accumulated amounts for lastest published the periods before each task  before as of date period
12664   cursor cur_accum_amts_l (p_project_id NUMBER, p_structure_version_id NUMBER, p_baseline_struc_id NUMBER,
12665                          p_proj_element_id NUMBER,p_cal_id NUMBER, p_cal_type varchar, p_as_of_date date) is
12666   select time_id.proj_element_id proj_element_id
12667        ,time_id.as_of_date as_of_date
12668        ,sum(pfxaf.labor_hrs) labor_hours
12669        ,sum(pfxaf.equipment_hours) equipment_hours
12670        ,sum(pfxaf.brdn_cost) prj_brdn_cost
12671     from   pji_fp_xbs_accum_f pfxaf,
12672            pa_budget_versions pbv,
12673            (
12674             select prog_date.proj_element_id proj_element_id,
12675             prog_date.as_of_date as_of_date,
12676             ptcpv.cal_period_id cal_period_id,
12677             ptcpv.name period_name,
12678             ptcpv.start_date pstart_date,
12679             ptcpv.end_date pend_date
12680             from
12681             PJI_TIME_CAL_PERIOD_V ptcpv,
12682              (
12683                select ppv.proj_element_id proj_element_id,
12684                       nvl(p_as_of_date,(ppr.as_of_date)) as_of_date
12685                from pa_progress_rollup ppr,
12686                       pa_proj_element_versions ppv
12687                 where ppv.parent_structure_version_id=p_structure_version_id
12688                   and ppv.project_id=p_project_id
12689                 and ppv.proj_element_id=p_proj_element_id
12690                 and ppr.object_id (+) =ppv.proj_element_id
12691                 and ppr.object_version_id (+) =ppv.element_version_id
12692                 and ppr.project_id (+) = ppv.project_id
12693                 and ppr.structure_version_id (+) IS NULL
12694                 and ppr.structure_type (+) = 'WORKPLAN'
12695                 and ppr.current_flag (+) ='Y'
12696               --group by ppv.proj_element_id
12697              )prog_date
12698              where ptcpv.calendar_id=p_cal_id
12699             -- and ptcpv.start_date <= prog_date.as_of_date
12700              and ptcpv.end_date <= prog_date.as_of_date
12701            )time_id
12702     where  pfxaf.project_id=p_project_id
12703     and    pfxaf.project_id=pbv.project_id
12704     and    pbv.project_structure_version_id=p_baseline_struc_id
12705     and    pbv.budget_version_id=pfxaf.plan_version_id
12706     and    pfxaf.project_element_id=time_id.proj_element_id
12707     and    pfxaf.wbs_rollup_flag='N'
12708     and    pfxaf.rbs_aggr_level='T'
12709     and    pfxaf.prg_rollup_flag='N'
12710     and    pfxaf.period_type_id=32
12711     and    pfxaf.calendar_type=p_cal_type
12712     and    pfxaf.time_id=time_id.cal_period_id
12713     group by time_id.proj_element_id
12714        ,time_id.as_of_date ;
12715 
12716   cursor cur_curr_prd_amts_l (p_project_id NUMBER, p_structure_version_id NUMBER, p_baseline_struc_id NUMBER,
12717                          p_proj_element_id NUMBER,p_cal_id NUMBER, p_cal_type varchar, p_as_of_date date) is
12718   select pfxaf.project_element_id proj_element_id
12719        ,time_id.pstart_date pstart_date
12720        ,time_id.pend_date pend_date
12721        ,time_id.as_of_date as_of_date
12722        ,pfxaf.labor_hrs labor_hours
12723        ,pfxaf.equipment_hours equipment_hours
12724        ,pfxaf.brdn_cost prj_brdn_cost
12725     from   pji_fp_xbs_accum_f pfxaf,
12726            pa_budget_versions pbv,
12727            (
12728             select prog_date.proj_element_id proj_element_id,
12729             prog_date.as_of_date as_of_date,
12730             ptcpv.cal_period_id cal_period_id,
12731             ptcpv.name period_name,
12732             ptcpv.start_date pstart_date,
12733             ptcpv.end_date pend_date
12734             from
12735             PJI_TIME_CAL_PERIOD_V ptcpv,
12736              (
12737                select ppv.proj_element_id proj_element_id,
12738                       nvl(p_as_of_date,(ppr.as_of_date)) as_of_date
12739                from pa_progress_rollup ppr,
12740                       pa_proj_element_versions ppv
12741                 where ppv.parent_structure_version_id=p_structure_version_id
12742                   and ppv.project_id=p_project_id
12743                 and ppv.proj_element_id=p_proj_element_id
12744                 and ppr.object_id (+) =ppv.proj_element_id
12745                 and ppr.object_version_id (+) =ppv.element_version_id
12746                 and ppr.project_id (+) = ppv.project_id
12747                 and ppr.structure_version_id (+) IS NULL
12748                 and ppr.structure_type (+) = 'WORKPLAN'
12749                 and ppr.current_flag (+) = 'Y'
12750               --group by ppv.proj_element_id
12751              )prog_date
12752              where ptcpv.calendar_id=p_cal_id
12753              and ptcpv.start_date <= prog_date.as_of_date
12754              and ptcpv.end_date >prog_date.as_of_date
12755            )time_id
12756     where  pfxaf.project_id=p_project_id
12757     and    pfxaf.project_id=pbv.project_id
12758     and    pbv.project_structure_version_id=p_baseline_struc_id
12759     and    pbv.budget_version_id=pfxaf.plan_version_id
12760     and    pfxaf.project_element_id=time_id.proj_element_id
12761     and    pfxaf.wbs_rollup_flag='N'
12762     and    pfxaf.rbs_aggr_level='T'
12763     and    pfxaf.prg_rollup_flag='N'
12764     and    pfxaf.period_type_id=32
12765     and    pfxaf.calendar_type=p_cal_type
12766     and    pfxaf.time_id=time_id.cal_period_id
12767     ;
12768 
12769 
12770 
12771  --Not a Latest Published Seperate cursor for previously published plan is used coz the as of the is picked from older version
12772  --if the passed structure id does have as of date in the progress_rollup table.
12773 --This cursor retrieves the accumulated amounts for lastest published the for periods before before as of date
12774   cursor cur_accum_amts_p (p_project_id NUMBER, p_structure_version_id NUMBER, p_baseline_struc_id NUMBER,
12775                          p_proj_element_id NUMBER,p_cal_id NUMBER, p_cal_type varchar, p_as_of_date date) is
12776   select time_id.proj_element_id proj_element_id
12777        ,time_id.as_of_date as_of_date
12778        ,sum(pfxaf.labor_hrs) labor_hours
12779        ,sum(pfxaf.equipment_hours) equipment_hours
12780        ,sum(pfxaf.brdn_cost) prj_brdn_cost
12781     from   pji_fp_xbs_accum_f pfxaf,
12782            pa_budget_versions pbv,
12783            (
12784             select prog_date.proj_element_id proj_element_id,
12785             prog_date.as_of_date as_of_date,
12786             ptcpv.cal_period_id cal_period_id,
12787             ptcpv.name period_name,
12788             ptcpv.start_date pstart_date,
12789             ptcpv.end_date pend_date
12790             from
12791             PJI_TIME_CAL_PERIOD_V ptcpv,
12792              (
12793                select ppv.proj_element_id proj_element_id,
12794                       max(ppv.parent_structure_version_id) parent_structure_id,
12795                       nvl(p_as_of_date,max(ppr.as_of_date)) as_of_date
12796                from pa_progress_rollup ppr,
12797                       pa_proj_element_versions ppv
12798                 where ppv.parent_structure_version_id<=p_structure_version_id
12799                   and ppv.project_id=p_project_id
12800                 and ppv.proj_element_id=p_proj_element_id
12801                 and ppr.object_id (+) =ppv.proj_element_id
12802                 and ppr.object_version_id (+) =ppv.element_version_id
12803                 and ppr.project_id (+) = ppv.project_id
12804                 and ppr.structure_version_id (+) IS NULL
12805                 and ppr.structure_type (+) = 'WORKPLAN'
12806                 and ppr.current_flag (+) <> 'W'
12807               group by ppv.proj_element_id
12808              )prog_date
12809              where ptcpv.calendar_id=p_cal_id
12810             -- and ptcpv.start_date <= prog_date.as_of_date
12811              and ptcpv.end_date <= prog_date.as_of_date
12812            )time_id
12813     where  pfxaf.project_id=p_project_id
12814     and    pfxaf.project_id=pbv.project_id
12815     and    pbv.project_structure_version_id=p_baseline_struc_id
12816     and    pbv.budget_version_id=pfxaf.plan_version_id
12817     and    pfxaf.project_element_id=time_id.proj_element_id
12818     and    pfxaf.wbs_rollup_flag='N'
12819     and    pfxaf.rbs_aggr_level='T'
12820     and    pfxaf.prg_rollup_flag='N'
12821     and    pfxaf.period_type_id=32
12822     and    pfxaf.calendar_type=p_cal_type
12823     and    pfxaf.time_id=time_id.cal_period_id
12824     group by time_id.proj_element_id
12825        ,time_id.as_of_date ;
12826 
12827   cursor cur_curr_prd_amts_p (p_project_id NUMBER, p_structure_version_id NUMBER, p_baseline_struc_id NUMBER,
12828                          p_proj_element_id NUMBER,p_cal_id NUMBER, p_cal_type varchar, p_as_of_date date) is
12829   select pfxaf.project_element_id proj_element_id
12830        ,time_id.pstart_date pstart_date
12831        ,time_id.pend_date pend_date
12832        ,time_id.as_of_date as_of_date
12833        ,pfxaf.labor_hrs labor_hours
12834        ,pfxaf.equipment_hours equipment_hours
12835        ,pfxaf.brdn_cost prj_brdn_cost
12836     from   pji_fp_xbs_accum_f pfxaf,
12837            pa_budget_versions pbv,
12838            (
12839             select prog_date.proj_element_id proj_element_id,
12840             prog_date.as_of_date as_of_date,
12841             ptcpv.cal_period_id cal_period_id,
12842             ptcpv.name period_name,
12843             ptcpv.start_date pstart_date,
12844             ptcpv.end_date pend_date
12845             from
12846             PJI_TIME_CAL_PERIOD_V ptcpv,
12847              (
12848                select ppv.proj_element_id proj_element_id,
12849                       max(ppv.parent_structure_version_id) parent_structure_id,
12850                       nvl(p_as_of_date,max(ppr.as_of_date)) as_of_date
12851                from pa_progress_rollup ppr,
12852                       pa_proj_element_versions ppv
12853                 where ppv.parent_structure_version_id<=p_structure_version_id
12854                   and ppv.project_id=p_project_id
12855                 and ppv.proj_element_id=p_proj_element_id
12856                 and ppr.object_id (+) =ppv.proj_element_id
12857                 and ppr.object_version_id (+) =ppv.element_version_id
12858                 and ppr.project_id (+) = ppv.project_id
12859                 and ppr.structure_version_id (+) IS NULL
12860                 and ppr.structure_type (+) = 'WORKPLAN'
12861                 and ppr.current_flag (+) <> 'W'
12862               group by ppv.proj_element_id
12863              )prog_date
12864              where ptcpv.calendar_id=p_cal_id
12865              and ptcpv.start_date <= prog_date.as_of_date
12866              and ptcpv.end_date >prog_date.as_of_date
12867            )time_id
12868     where  pfxaf.project_id=p_project_id
12869     and    pfxaf.project_id=pbv.project_id
12870     and    pbv.project_structure_version_id=p_baseline_struc_id
12871     and    pbv.budget_version_id=pfxaf.plan_version_id
12872     and    pfxaf.project_element_id=time_id.proj_element_id
12873     and    pfxaf.wbs_rollup_flag='N'
12874     and    pfxaf.rbs_aggr_level='T'
12875     and    pfxaf.prg_rollup_flag='N'
12876     and    pfxaf.period_type_id=32
12877     and    pfxaf.calendar_type=p_cal_type
12878     and    pfxaf.time_id=time_id.cal_period_id
12879     ;
12880 
12881 cursor cur_parent_tasks_info(p_project_id number, p_structure_version_id number) is
12882   select ppev1.proj_element_id proj_element_id,
12883          ppev2.proj_element_id parent_task_id,
12884          ppev1.wbs_level,
12885          nvl(ppe.baseline_start_date,ppevs.scheduled_start_date) sch_start_date,
12886          nvl(ppe.baseline_finish_date,ppevs.scheduled_finish_date) sch_end_date
12887   from pa_proj_element_versions ppev1,
12888            pa_proj_element_versions ppev2,
12889        pa_object_relationships por,
12890            pa_proj_elements ppe,
12891            pa_proj_elem_ver_schedule ppevs
12892   where ppev1.parent_structure_version_id = p_structure_version_id
12893   and  ppev1.proj_element_id=ppe.proj_element_id
12894   and  nvl(ppe.link_task_flag,'N') = 'N'
12895   and  ppev1.element_version_id=ppevs.element_version_id
12896   and    ppev1.element_version_id = por.object_id_to1
12897   and  ppev2.element_version_id = por.object_id_from1
12898   and  por.relationship_type = 'S'
12899   order by  ppev1.wbs_level desc;
12900 
12901   cursor c1(p_structure_version_id number) is
12902   select 'Y'
12903     from pa_proj_elem_ver_structure
12904    where project_id = p_project_id
12905      and element_version_id = p_structure_version_id
12906      and status_code = 'STRUCTURE_PUBLISHED';
12907 
12908   l_cal_id          number :=0;
12909   l_cal_type        varchar2(1);
12910   l_parent_task_id  number;
12911   l_temp_start_date date;
12912   l_temp_end_date   date;
12913   l_temp_as_of_date date;
12914   l_multiplier      number;
12915   l_flag            varchar2(1) := 'N';
12916   l_work_struc_id   number := -1;
12917   l_baseline_struc_id  number := -1;
12918   l_as_of_date_ovr  date := NULL;
12919   l_dummy           varchar2(1) := 'N';
12920 
12921 BEGIN
12922 
12923 -- Initializing
12924   l_bcws_hash_tbl.delete();
12925 
12926         l_prv_bcws_project_id             := p_project_id;
12927   l_prv_bcws_struc_ver_id           := p_structure_version_id;
12928 
12929   l_work_struc_id := PA_PROJECT_STRUCTURE_UTILS.get_current_working_ver_id(p_project_id);
12930 
12931   -- To decide the structure_version_id passed is latest published or current working or published version
12932   IF PA_PROJECT_STRUCTURE_UTILS.get_current_working_ver_id(p_project_id) = p_structure_version_id THEN
12933     l_flag := 'W';
12934   ELSIF PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION(p_project_id) = p_structure_version_id THEN
12935     l_flag := 'L';
12936   ELSE
12937     -- Doing this handling for split structures where it is possible  to have multiple working versions.
12938     OPEN c1(p_structure_version_id);
12939     FETCH c1 into l_dummy;
12940     CLOSE c1;
12941 
12942     IF nvl(l_dummy,'N') = 'Y' THEN
12943       l_flag := 'P';
12944     ELSE
12945       l_flag := 'W';
12946     END IF;
12947 
12948   END IF;
12949 
12950   --Code for getting the calendar id.
12951   SELECT ppfo.cost_time_phased_code INTO l_cal_type
12952   FROM pa_proj_fp_options ppfo, pa_budget_versions pbv
12953   WHERE pbv.project_id=p_project_id
12954   AND   pbv.project_structure_version_id=p_structure_version_id
12955   AND   pbv.budget_version_id=ppfo.fin_plan_version_id
12956   AND   ppfo.fin_plan_option_level_code='PLAN_VERSION';
12957 
12958   -- To calculate planned value based on the existing functionality
12959   -- when workplan is non time phased.
12960   IF l_cal_type = 'N'
12961   THEN
12962     return;
12963   END IF;
12964 
12965   IF l_cal_type = 'G' THEN
12966     SELECT ftcn.calendar_id INTO l_cal_id
12967     FROM fii_time_cal_name ftcn,
12968          pa_projects_all ppa,
12969          pa_implementations_all pia,
12970          gl_sets_of_books gsb
12971     WHERE ppa.project_id=p_project_id
12972     AND   ppa.org_id=pia.org_id
12973     AND   pia.set_of_books_id=gsb.set_of_books_id
12974     AND   gsb.period_set_name=ftcn.period_set_name
12975     AND   gsb.accounted_period_type=ftcn.period_type;
12976   ELSIF l_cal_type = 'P' THEN
12977     SELECT ftcn.calendar_id INTO l_cal_id
12978     FROM fii_time_cal_name ftcn,
12979          pa_projects_all ppa,
12980          pa_implementations_all pia
12981     WHERE ppa.project_id=p_project_id
12982     AND   ppa.org_id=pia.org_id
12983     AND   pia.period_set_name=ftcn.period_set_name
12984     AND   pia.pa_period_type=ftcn.period_type;
12985   END IF;
12986 
12987         -- Retriving baseline structure id to retrive planned values information from baselined structure.
12988         l_baseline_struc_id := PA_PROJECT_STRUCTURE_UTILS.Get_Baseline_Struct_Ver(p_project_id);
12989 
12990         IF l_baseline_struc_id = -1 THEN
12991           l_baseline_struc_id := p_structure_version_id;
12992         END IF;
12993 
12994   -- Populating the parent task id as well as calculating the com and rolls up the amounts to parent task.
12995   FOR cur_parent_tasks_info_rec in cur_parent_tasks_info(p_project_id, p_structure_version_id)
12996   LOOP
12997     l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).parent_task_id := cur_parent_tasks_info_rec.parent_task_id;
12998     l_as_of_date_ovr := NULL;
12999     l_parent_task_id := NULL;
13000 
13001     -- Bug 7259306
13002     -- In the absence of progress, the planned value is calculated based on the as of date displayed in the progress report tab.
13003     IF (PA_PROJECT_STRUCTURE_UTILS.CHECK_STRUC_VER_PUBLISHED(p_project_id, p_structure_version_id) = 'Y') AND
13004        (PA_PROGRESS_UTILS.PROJ_TASK_PROG_EXISTS(p_project_id, cur_parent_tasks_info_rec.proj_element_id) = 'N') THEN
13005         l_as_of_date_ovr := get_def_as_of_date_prog_report(p_project_id, cur_parent_tasks_info_rec.proj_element_id);
13006     END IF;
13007 
13008     -- Overriding the as of date for showing the changed planned value in progress details page:
13009           IF l_ovr_task_id IS NOT NULL AND l_ovr_task_id <> -1 AND (l_ovr_task_id = p_element_id) THEN
13010             IF l_bcws_hash_tbl.exists('PA'||l_ovr_task_id) AND (l_ovr_task_id = cur_parent_tasks_info_rec.proj_element_id) THEN
13011               l_as_of_date_ovr    := p_as_of_date;
13012             END IF;
13013           END IF;
13014 
13015     IF l_flag = 'W' THEN
13016       FOR cur_accum_amts_w_rec in cur_accum_amts_w(p_project_id, p_structure_version_id, l_baseline_struc_id, cur_parent_tasks_info_rec.proj_element_id,
13017           l_cal_id,l_cal_type, l_as_of_date_ovr)
13018       LOOP
13019               l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tlbr_hrs_baod := cur_accum_amts_w_rec.labor_hours;
13020             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).teqp_hrs_baod := cur_accum_amts_w_rec.equipment_hours;
13021             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tpbc_hrs_baod := cur_accum_amts_w_rec.prj_brdn_cost;
13022 
13023             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).as_of_date    := cur_accum_amts_w_rec.as_of_date;
13024             END LOOP;
13025 
13026             --This loop is used to populate the current period amounts.
13027           FOR cur_curr_prd_amts_w_rec in cur_curr_prd_amts_w(p_project_id, p_structure_version_id, l_baseline_struc_id, cur_parent_tasks_info_rec.proj_element_id,
13028           l_cal_id,l_cal_type, l_as_of_date_ovr)
13029           LOOP
13030             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_lbr_hrs   := cur_curr_prd_amts_w_rec.labor_hours;
13031             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_eqp_hrs   := cur_curr_prd_amts_w_rec.equipment_hours;
13032             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_pbc       := cur_curr_prd_amts_w_rec.prj_brdn_cost;
13033 
13034             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).pstart_date   := cur_curr_prd_amts_w_rec.pstart_date;
13035             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).pend_date     := cur_curr_prd_amts_w_rec.pend_date;
13036             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).as_of_date    := cur_curr_prd_amts_w_rec.as_of_date;
13037           END LOOP;
13038     ELSIF l_flag ='L' THEN
13039       FOR cur_accum_amts_l_rec in cur_accum_amts_l(p_project_id, p_structure_version_id, l_baseline_struc_id, cur_parent_tasks_info_rec.proj_element_id,
13040           l_cal_id,l_cal_type,l_as_of_date_ovr)
13041       LOOP
13042               l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tlbr_hrs_baod := cur_accum_amts_l_rec.labor_hours;
13043             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).teqp_hrs_baod := cur_accum_amts_l_rec.equipment_hours;
13044             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tpbc_hrs_baod := cur_accum_amts_l_rec.prj_brdn_cost;
13045 
13046             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).as_of_date    := cur_accum_amts_l_rec.as_of_date;
13047             END LOOP;
13048 
13049             --This loop is used to populate the current period amounts.
13050           FOR cur_curr_prd_amts_l_rec in cur_curr_prd_amts_l(p_project_id, p_structure_version_id, l_baseline_struc_id, cur_parent_tasks_info_rec.proj_element_id,
13051           l_cal_id,l_cal_type,l_as_of_date_ovr)
13052           LOOP
13053             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_lbr_hrs   := cur_curr_prd_amts_l_rec.labor_hours;
13054             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_eqp_hrs   := cur_curr_prd_amts_l_rec.equipment_hours;
13055             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_pbc       := cur_curr_prd_amts_l_rec.prj_brdn_cost;
13056 
13057             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).pstart_date   := cur_curr_prd_amts_l_rec.pstart_date;
13058             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).pend_date     := cur_curr_prd_amts_l_rec.pend_date;
13059             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).as_of_date    := cur_curr_prd_amts_l_rec.as_of_date;
13060           END LOOP;
13061     ELSIF l_flag ='P' THEN
13062 
13063       FOR cur_accum_amts_p_rec in cur_accum_amts_p(p_project_id, p_structure_version_id, l_baseline_struc_id, cur_parent_tasks_info_rec.proj_element_id,
13064           l_cal_id,l_cal_type,l_as_of_date_ovr)
13065       LOOP
13066               l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tlbr_hrs_baod := cur_accum_amts_p_rec.labor_hours;
13067             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).teqp_hrs_baod := cur_accum_amts_p_rec.equipment_hours;
13068             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tpbc_hrs_baod := cur_accum_amts_p_rec.prj_brdn_cost;
13069 
13070             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).as_of_date    := cur_accum_amts_p_rec.as_of_date;
13071             END LOOP;
13072 
13073             --This loop is used to populate the current period amounts.
13074           FOR cur_curr_prd_amts_p_rec in cur_curr_prd_amts_p(p_project_id, p_structure_version_id, l_baseline_struc_id, cur_parent_tasks_info_rec.proj_element_id,
13075           l_cal_id,l_cal_type,l_as_of_date_ovr)
13076           LOOP
13077             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_lbr_hrs   := cur_curr_prd_amts_p_rec.labor_hours;
13078             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_eqp_hrs   := cur_curr_prd_amts_p_rec.equipment_hours;
13079             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_pbc       := cur_curr_prd_amts_p_rec.prj_brdn_cost;
13080 
13081             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).pstart_date   := cur_curr_prd_amts_p_rec.pstart_date;
13082             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).pend_date     := cur_curr_prd_amts_p_rec.pend_date;
13083             l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).as_of_date    := cur_curr_prd_amts_p_rec.as_of_date;
13084           END LOOP;
13085 
13086     END IF;
13087 
13088 
13089     -- TO populate the schedule dates from schedule dates  table if baseline date is null
13090     l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).sch_start_date := cur_parent_tasks_info_rec.sch_start_date;
13091           l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).sch_end_date   := cur_parent_tasks_info_rec.sch_end_date;
13092 
13093     l_temp_start_date := NULL;
13094     l_temp_end_date   := NULL;
13095     l_temp_as_of_date := NULL;
13096     l_multiplier      := NULL;
13097 
13098     l_temp_start_date := greatest(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).sch_start_date,
13099                     l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).pstart_date);
13100     l_temp_end_date := least(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).sch_end_date,
13101                     l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).pend_date);
13102     l_temp_as_of_date := l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).as_of_date;
13103 
13104 
13105     IF ((l_temp_start_date - l_temp_as_of_date) > 0) THEN
13106       l_multiplier := 0;
13107     ELSIF ((l_temp_as_of_date - l_temp_end_date) >= 0) THEN
13108       l_multiplier := 1;
13109     ELSIF (nvl((l_temp_end_date - l_temp_start_date),0) >= 0) then
13110       l_multiplier := nvl((trunc(l_temp_as_of_date) - trunc(l_temp_start_date)+1),0)/
13111                       nvl((trunc(l_temp_end_date) - trunc(l_temp_start_date)+1),1);
13112     END IF;
13113 
13114     IF l_multiplier IS NOT NULL THEN
13115       l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).labor_hrs :=
13116         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).labor_hrs,0) +
13117         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tlbr_hrs_baod,0) +
13118         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_lbr_hrs,0) * l_multiplier;
13119 
13120       l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).equip_hrs :=
13121         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).equip_hrs,0) +
13122         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).teqp_hrs_baod,0) +
13123         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_eqp_hrs,0) * l_multiplier;
13124 
13125       l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).prj_brdn_cost :=
13126         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).prj_brdn_cost,0) +
13127         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tpbc_hrs_baod,0) +
13128         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_pbc,0) * l_multiplier;
13129 
13130     ELSE -- IF mulitplication factor is null then add complete curr period amount to
13131 
13132       l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).labor_hrs :=
13133         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).labor_hrs,0) +
13134         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tlbr_hrs_baod,0) +
13135         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_lbr_hrs,0);
13136 
13137       l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).equip_hrs :=
13138         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).equip_hrs,0) +
13139         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).teqp_hrs_baod,0) +
13140         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_eqp_hrs,0);
13141 
13142       l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).prj_brdn_cost :=
13143         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).prj_brdn_cost,0) +
13144         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).tpbc_hrs_baod,0) +
13145         nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).cur_pbc,0);
13146 
13147     END IF;
13148 
13149 
13150     l_parent_task_id := l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).parent_task_id;
13151 
13152     -- elements amounts are rolled upto corresponding parent task id.
13153     IF l_bcws_hash_tbl.exists('PA'||l_parent_task_id) THEN
13154       l_bcws_hash_tbl('PA'||l_parent_task_id).labor_hrs := nvl(l_bcws_hash_tbl('PA'||l_parent_task_id).labor_hrs,0) +
13155                                                nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).labor_hrs,0);
13156 
13157       l_bcws_hash_tbl('PA'||l_parent_task_id).equip_hrs := nvl(l_bcws_hash_tbl('PA'||l_parent_task_id).equip_hrs,0) +
13158                                                nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).equip_hrs,0);
13159 
13160       l_bcws_hash_tbl('PA'||l_parent_task_id).prj_brdn_cost := nvl(l_bcws_hash_tbl('PA'||l_parent_task_id).prj_brdn_cost,0) +
13161                                                nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).prj_brdn_cost,0);
13162     ELSE
13163       l_bcws_hash_tbl('PA'||l_parent_task_id).labor_hrs := nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).labor_hrs,0);
13164 
13165       l_bcws_hash_tbl('PA'||l_parent_task_id).equip_hrs := nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).equip_hrs,0);
13166 
13167       l_bcws_hash_tbl('PA'||l_parent_task_id).prj_brdn_cost := nvl(l_bcws_hash_tbl('PA'||cur_parent_tasks_info_rec.proj_element_id).prj_brdn_cost,0);
13168     END IF;
13169   END LOOP;
13170 
13171 EXCEPTION
13172     WHEN OTHERS THEN
13173       fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROGRESS_UTILS',
13174                               p_procedure_name => 'get_plan_value',
13175                               p_error_text     => SUBSTRB(SQLERRM,1,120));
13176 
13177 END get_plan_value;
13178 
13179 -- This is procedure is used to clear the cache.
13180 PROCEDURE clear_tmp_tables(p_task_id Number Default Null)
13181 IS
13182 BEGIN
13183 
13184         l_prv_bcws_project_id             := -1;
13185   l_prv_bcws_struc_ver_id           := -1;
13186   l_ovr_task_id                     := p_task_id;
13187 END clear_tmp_tables;
13188 --Bug 6664716
13189 
13190 -- Bug 7259306
13191 -- Returns the date displayed in the Progress Report tab
13192 -- Cursor is based on the VO - ProgressAsOfDatesVO which is used to populate the 'as of date' poplist
13193 FUNCTION get_def_as_of_date_prog_report(
13194     p_project_id        pa_progress_rollup.project_id%TYPE,
13195     p_proj_element_id   pa_progress_rollup.proj_element_id%TYPE,
13196     p_object_type       pa_progress_rollup.object_type%TYPE := 'PA_TASKS'
13197 ) RETURN DATE IS
13198     l_return_date         DATE;
13199 
13200     CURSOR cur_get_def_as_of_date
13201     IS
13202     SELECT  as_of_date FROM (
13203     SELECT  ppe.project_id project_id,
13204             PA_PROGRESS_UTILS.AS_OF_DATE(ppe.project_id, ppe.proj_element_id, ppp.progress_cycle_id, ppe.object_type) as_of_date ,
13205             ppe.object_type object_type
13206     FROM    pa_project_statuses po,
13207             pa_proj_progress_attr ppp,
13208             pa_proj_elements ppe
13209     WHERE   ppe.project_id         = ppp.project_id(+)
13210     AND ppp.structure_type (+) = 'WORKPLAN'
13211     AND ppe.project_id         = p_project_id
13212     AND ppe.proj_element_id    = p_proj_element_id
13213     AND ppe.object_type        = p_object_type
13214     AND ((ppe.object_type     IN ('PA_TASKS', 'PA_STRUCTURES')
13215     AND rownum                 <61)
13216      OR (ppe.object_type       = 'PA_DELIVERABLES'
13217     AND rownum                 <11))
13218     MINUS
13219     SELECT  to_number(p_project_id) project_id,
13220             to_date(NULL) as_of_date,
13221             TO_CHAR(p_object_type) object_type
13222     FROM    dual
13223     )
13224     WHERE ROWNUM = 1;
13225 
13226 BEGIN
13227      OPEN cur_get_def_as_of_date;
13228      FETCH cur_get_def_as_of_date INTO l_return_date;
13229      CLOSE cur_get_def_as_of_date;
13230 
13231      -- Bug 7633088
13232      IF g_override_as_of_date is NOT NULL THEN
13233        RETURN ( g_override_as_of_date );
13234      ELSE
13235        RETURN ( l_return_date );
13236      END IF;
13237 
13238 END get_def_as_of_date_prog_report;
13239 
13240 -- Bug 7633088
13241 PROCEDURE set_override_as_of_date(p_as_of_date IN DATE) IS
13242 BEGIN
13243     g_override_as_of_date := p_as_of_date;
13244 END set_override_as_of_date;
13245 
13246 
13247 END PA_PROGRESS_UTILS;