DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_DELIVERABLE_UTILS

Source


1 PACKAGE BODY PA_DELIVERABLE_UTILS AS
2      /* $Header: PADLUTLB.pls 120.8 2007/11/23 06:02:29 rthumma ship $ */
3 g_module_name    VARCHAR2(100) := 'pa.plsql.PA_DELIVERABLE_UTILS';
4 l_debug_level2                  CONSTANT NUMBER := 2;
5 l_debug_level3                  CONSTANT NUMBER := 3;
6 l_debug_level4                  CONSTANT NUMBER := 4;
7 l_debug_level5                  CONSTANT NUMBER := 5;
8 
9 
10 -- SubProgram           : IS_DLV_TYPE_NAME_UNIQUE
11 -- Type                 : UTIL FUNCTION
12 -- Purpose              : This function will check whether deliverable type name is unique
13 -- Note                 : If the passed deliverable type name already exists in the database then it is not unique
14 -- Assumptions          : None
15 -- Parameter                      IN/OUT            Type         Required     Description and Purpose
16 -- --------------------------  ------------    ----------      ----------    --------------------------
17 
18 --  P_deliverable_type_name     IN          VARCHAR2           N           Deliverable Type Name
19 
20 FUNCTION IS_DLV_TYPE_NAME_UNIQUE
21 (
22      p_deliverable_type_name IN VARCHAR2
23 )   RETURN VARCHAR2
24 IS
25 
26 l_return_status  varchar2(1);
27 l_dummy          varchar2(1);
28 
29 
30 CURSOR c_deliverable_type_name_exists IS
31 SELECT 'X'
32 FROM PA_TASK_TYPES
33 WHERE TASK_TYPE = p_deliverable_type_name  -- 3946664 removed upper from both the sides
34 AND OBJECT_TYPE='PA_DLVR_TYPES';
35 
36 --The cursor c_deliverable_type_name_exists returns 'X'
37 --if there is atleast one row with the same deliverable type name
38 
39 BEGIN
40     OPEN c_deliverable_type_name_exists;
41     FETCH c_deliverable_type_name_exists into l_dummy ;
42     IF c_deliverable_type_name_exists%found THEN
43        l_return_status:='N';
44     ELSE
45        l_return_status:='Y';
46     END IF;
47     CLOSE c_deliverable_type_name_exists;
48 
49 return l_return_status;
50 
51 END IS_DLV_TYPE_NAME_UNIQUE;
52 
53 -- SubProgram           : IS_DLV_TYPE_IN_USE
54 -- Type                 : UTIL FUNCTION
55 -- Purpose              : This function will check whether deliverable type  is in use
56 -- Note                 : If there is an entry for the deliverable type id in the pa_proj_elements table
57 --                        it means that deliverable type is in use.
58 -- Assumptions          : None
59 -- Parameter                      IN/OUT           Type                   Required         Description and Purpose
60 -- ---------------------------  ------------    ----------                  ---------       ---------------------------
61 
62 --  p_deliverable_type_id        IN          PA_TASK_TYPES.TASK_TYPE_ID%TYPE  N              Deliverable Type Id
63 
64 
65 FUNCTION IS_DLV_TYPE_IN_USE
66 (
67      p_deliverable_type_id IN PA_TASK_TYPES.TASK_TYPE_ID%TYPE
68 )   RETURN VARCHAR2
69 IS
70 
71 l_return_status  varchar2(1);
72 l_dummy          varchar2(1);
73 
74 --The cursor c_dlv_type_in_use will return 'X'
75 --if the deliverable type id is present in the
76 --PA_PROJ_ELEMENTS table .If it is present then
77 --it means that it is in use.
78 
79 CURSOR c_dlv_type_in_use IS
80 SELECT 'X'
81 FROM DUAL
82     WHERE EXISTS (SELECT 'X'
83      FROM PA_PROJ_ELEMENTS
84      WHERE TYPE_ID = p_deliverable_type_id
85      AND OBJECT_TYPE='PA_DELIVERABLES');
86 
87 BEGIN
88      OPEN c_dlv_type_in_use;
89      FETCH c_dlv_type_in_use into l_dummy ;
90      IF c_dlv_type_in_use%found THEN
91        l_return_status:='Y';
92      ELSE
93        l_return_status:='N';
94      END IF;
95      CLOSE c_dlv_type_in_use;
96 
97 return l_return_status;
98 
99 END IS_DLV_TYPE_IN_USE;
100 
101 -- SubProgram           : IS_DLV_TYPE_ACTIONS_EXISTS
102 -- Type                 : UTIL FUNCTION
103 -- Purpose              : This function will check whether actions exist for the Deliverable Type
104 -- Note                 : If there are any actions by defaultly defined for a deliverable type,
105 --                        then that relationship will be present in the PA_OBJECT_RELATIONSHIPS table
106 --                        The relationship is defined by the relationship_type 'A'
107 --                        and the subtype is 'DLVR_TYPE_TO_ACTION'
108 -- Assumptions          : None
109 -- Parameter                      IN/OUT            Type               Required         Description and Purpose
110 -- ---------------------------  ------------    -----------            ---------       ---------------------------
111 
112 --  p_deliverable_type_id        IN     PA_TASK_TYPES.TASK_TYPE_ID%TYPE   N          Deliverable Type Id
113 
114 FUNCTION IS_DLV_TYPE_ACTIONS_EXISTS
115 (
116      p_deliverable_type_id IN PA_TASK_TYPES.TASK_TYPE_ID%TYPE
117 )   RETURN VARCHAR2
118 IS
119 
120 l_return_status  varchar2(1);
121 l_dummy          varchar2(1);
122 
123 --The cursor c_dlv_type_action_exists returns 'X' at the first hit
124 --If there exists a relationship 'DLVR_TYPE_TO_ACTION'
125 --FROM the passed p_deliverable_type_id of object_type 'PA_DLVR_TYPES'
126 --TO any of the deliverable actions of object_type 'PA_ACTIONS' in the PA_OBJECT_RELATIONSHIPS table
127 --Note : The relationship is defined by the relationship_type 'A'
128 
129 CURSOR c_dlv_type_action_exists IS
130 SELECT 'X'
131 FROM DUAL
132     WHERE EXISTS (SELECT 'X'
133                    FROM PA_OBJECT_RELATIONSHIPS obj
134                   WHERE obj.object_id_from2 = p_deliverable_type_id
135                          AND obj.object_type_from  = 'PA_DLVR_TYPES'
136                      AND obj.relationship_subtype  = 'DLVR_TYPE_TO_ACTION'
137                          AND obj.relationship_type  = 'A'
138                          AND obj.object_type_to = 'PA_ACTIONS');
139 
140 BEGIN
141      OPEN c_dlv_type_action_exists;
142      FETCH c_dlv_type_action_exists into l_dummy ;
143      IF c_dlv_type_action_exists%found THEN
144        l_return_status:='Y';
145      ELSE
146        l_return_status:='N';
147      END IF;
148      CLOSE c_dlv_type_action_exists;
149 
150 return l_return_status;
151 
152 END IS_DLV_TYPE_ACTIONS_EXISTS;
153 
154 -- SubProgram           : IS_DLV_ACTIONS_EXISTS
155 -- Type                 : UTIL FUNCTION
156 -- Purpose              : This function will check whether
157 --                        there exists a deliverable of type p_deliverable_type_id
158 --                        which is associated with actions
159 -- Note                 : If there are any actions are defined for a deliverable,
160 --                        then that relationship will be present in the PA_OBJECT_RELATIONSHIPS table
161 --                        The relationship is defined by the relationship_type 'A'
162 --                        and the subtype is 'DELIVERABLE_TO_ACTION'
163 -- Assumptions          : None
164 -- Parameter                      IN/OUT          Type                 Required         Description and Purpose
165 -- ---------------------------  ------------    ----------             ---------       ---------------------------
166 
167 --  p_deliverable_type_id       IN      PA_TASK_TYPES.TASK_TYPE_ID%TYPE    N           Deliverable Type Id
168 
169 FUNCTION IS_DLV_ACTIONS_EXISTS
170 (
171      p_deliverable_type_id IN PA_TASK_TYPES.TASK_TYPE_ID%TYPE
172 )   RETURN VARCHAR2
173 IS
174 
175 l_return_status  varchar2(1);
176 l_dummy          varchar2(1);
177 
178 --The cursor c_dlv_action_exists returns 'X' at the first hit
179 --If there exists a deliverable of object_type "PA_DELIVERABLES'
180 --of type p_deliverable_type_id
181 --and the deliverable has a relationship 'DELIVERABLE_TO_ACTION'
182 --WITH any of the Deliverable Actions of object_type 'PA_ACTIONS'
183 
184 --Note : The relationship is defined by the relationship_type 'A'
185 
186 CURSOR c_dlv_action_exists IS
187 SELECT 'X'
188 FROM DUAL
189 WHERE EXISTS  (SELECT 'X'
190                FROM PA_OBJECT_RELATIONSHIPS obj,
191                      PA_PROJ_ELEMENTS ppe
192                     where ppe.type_id = p_deliverable_type_id
193                     and ppe.object_type='PA_DELIVERABLES'
194                     and ppe.proj_element_id = obj.object_id_from2
195                   and obj.object_type_from  = 'PA_DELIVERABLES'
196                 and obj.object_type_to = 'PA_ACTIONS'
197                 and obj.relationship_subtype  = 'DELIVERABLE_TO_ACTION'
198                 and obj.relationship_type  = 'A');
199 
200 
201 BEGIN
202      OPEN c_dlv_action_exists;
203      FETCH c_dlv_action_exists into l_dummy ;
204      IF c_dlv_action_exists%found THEN
205        l_return_status:='Y';
206      ELSE
207        l_return_status:='N';
208      END IF;
209      CLOSE c_dlv_action_exists;
210 
211 return l_return_status;
212 
213 END IS_DLV_ACTIONS_EXISTS;
214 
215 -- SubProgram           : IS_DLV_BASED_ASSCN_EXISTS
216 -- Type                 : UTIL FUNCTION
217 -- Purpose              : This function will check whether
218 --                        there exists a deliverable of type p_deliverable_type_id
219 --                        has been associated with a Deliverable-based task
220 -- Note                 : 1) If a deliverable has been associated with a task
221 --                        then an entry corresponding to its association with the task can be found
222 --                        in the PA_OBJECT_RELATIONSHIPS table with the relationship_type defined by 'A'
223 --                        and relationship_sub_type 'TASK_TO_DELIVERABLE'
224 --                        2)If a task is deliverable then
225 --                        the progress rollup method of the task is "Deliverable-based" .This can be found
226 --                        from the PA_PROJ_ELEMENTS table.
227 -- Assumptions          : None
228 -- Parameter                      IN/OUT          Type                  Required         Description and Purpose
229 -- ---------------------------  ------------    ----------                ---------       ---------------------------
230 
231 --  p_deliverable_type_id         IN       PA_TASK_TYPES.TASK_TYPE_ID%TYPE     N          Deliverable Type Id
232 
233 
234 FUNCTION IS_DLV_BASED_ASSCN_EXISTS
235 (
236      p_deliverable_type_id IN PA_TASK_TYPES.TASK_TYPE_ID%TYPE
237 )   RETURN VARCHAR2
238 IS
239 l_return_status  varchar2(1);
240 l_dummy          varchar2(1);
241 
242 --The cursor c_dlv_based_task_exists returns 'X' at the first hit
243 --If there exists a deliverable of object_type 'PA_DELIVERABLES'
244 --of type p_deliverable_id
245 --and which has a relationship 'TASK_TO_DELIVERABLE' with a
246 --'DELIVERABLE' task of object_type 'PA_TASKS'
247 
248 --Note : The relationship is defined by the relationship_type 'A'
249 
250 CURSOR c_dlv_based_task_exists IS
251 SELECT 'X'
252 FROM DUAL
253 WHERE EXISTS (SELECT 'X'
254               FROM PA_OBJECT_RELATIONSHIPS obj,
255                   PA_PROJ_ELEMENTS ppe1,
256                   PA_PROJ_ELEMENTS ppe2
257                    where ppe1.type_id = p_deliverable_type_id
258                    and ppe1.object_type= 'PA_DELIVERABLES'
259                 and ppe1.proj_element_id = obj.object_id_to2
260                 and ppe2. proj_element_id = obj.object_id_from2
261                    and ppe2.object_type = 'PA_TASKS'
262                    and ppe2.project_id = ppe1.project_id
263                 and ppe2.base_percent_comp_deriv_code = 'DELIVERABLE'
264                  and obj.object_type_from  = 'PA_TASKS'
265                 and obj.object_type_to  = 'PA_DELIVERABLES'  -- 3570283 removed extra spaces
266                 and obj.relationship_subtype  = 'TASK_TO_DELIVERABLE'
267                 and obj.relationship_type  = 'A');
268 
269 
270 BEGIN
271      OPEN c_dlv_based_task_exists;
272      FETCH c_dlv_based_task_exists into l_dummy ;
273      IF c_dlv_based_task_exists%found THEN
274        l_return_status:='Y';
275      ELSE
276        l_return_status:='N';
277      END IF;
278      CLOSE c_dlv_based_task_exists;
279 
280 return l_return_status;
281 
282 END IS_DLV_BASED_ASSCN_EXISTS;
283 
284 -- SubProgram           : IS_EFF_FROM_TO_DATE_VALID
285 -- Type                 : UTIL FUNCTION
286 -- Purpose              : This function will check whether
287 --                        the entered start date and end date are valid
288 --                        If and Only if,the startdate is greater than the end date then it is Invalid
289 -- Note                 : None
290 -- Assumption           : If the startdate and enddate are the same,then it is valid
291 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
292 -- ---------------------------  ------------    ----------     ---------       ---------------------------
293 
294 --  p_start_date_Active         IN             DATE       N          Effetive Start date
295 --  p_end_date_Active            IN            DATE       N          Effective End date
296 
297 
298 FUNCTION IS_EFF_FROM_TO_DATE_VALID
299 (
300      p_start_date_active   IN  DATE,
301      p_end_date_active     IN  DATE
302 )    RETURN VARCHAR2
303 IS
304 
305 l_return_status  varchar2(1);
306 
307 BEGIN
308      IF p_end_date_active IS NOT NULL AND TRUNC(p_start_date_active) > TRUNC(p_end_date_active) THEN
309           l_return_status:='N';
310      ELSE
311           l_return_status:='Y';
312      END IF;
313 return l_return_status;
314 END IS_EFF_FROM_TO_DATE_VALID;
315 
316 -- SubProgram           : GET_ASSOCIATED_TASKS
317 -- Type                 : UTIL FUNCTION
318 -- Purpose              : This function will get the list of tasks associated to the deliverable
319 --                        in the format task1,task2,task3,More..
320 -- Note                 : None
321 -- Assumption           : None
322 -- Parameter                      IN/OUT            Type                    Required         Description and Purpose
323 -- ---------------------------  ------------    ----------                  ---------       ---------------------------
324 -- p_deliverable_id            IN        PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE    N            Deliverable Type Id
325 
326  FUNCTION GET_ASSOCIATED_TASKS
327  (
328      p_deliverable_id   IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
329  )   RETURN VARCHAR2
330  IS
331 
332  TYPE l_tbl IS TABLE OF VARCHAR2(350) INDEX BY BINARY_INTEGER;
333  l_name_number_tbl l_tbl ;
334  l_count NUMBER ;
335  l_string varchar2(500);
336  l_meaning varchar2(80);
337 
338 CURSOR c_associated_tasks IS
339 SELECT  ppe. name||'('|| ppe.element_number||')' name_number
340 FROM  PA_PROJ_ELEMENTS ppe ,
341       PA_OBJECT_RELATIONSHIPS obj
342 WHERE  ppe.object_type='PA_TASKS'
343   AND  ppe.proj_element_id = OBJ.object_id_from2
344   AND  OBJ.object_id_to2 =p_deliverable_id
345   AND  OBJ.object_type_to = 'PA_DELIVERABLES'
346   AND  OBJ.object_type_from = 'PA_TASKS'
347   AND  OBJ.relationship_type = 'A'
348   AND  OBJ.relationship_subtype = 'TASK_TO_DELIVERABLE'
349        ORDER BY ppe.base_percent_comp_deriv_code;
350 
351 CURSOR c_lookup_meaning IS
352 SELECT meaning
353 FROM pa_lookups
354 WHERE lookup_type = 'PA_DLV_MORE'
355   AND lookup_code = 'MORE';
356 BEGIN
357 OPEN c_associated_tasks;
358 OPEN c_lookup_meaning;
359 FETCH  c_associated_tasks BULK COLLECT INTO l_name_number_tbl;
360 CLOSE  c_associated_tasks;
361      IF  nvl(l_name_number_tbl.LAST,0)>0
362      THEN
363           FETCH  c_lookup_meaning INTO l_meaning;
364           CLOSE  c_lookup_meaning;
365           FOR l_count in l_name_number_tbl.FIRST..l_name_number_tbl.LAST LOOP
366              IF l_count = 1
367                THEN
368                     l_string :=l_name_number_tbl(l_count);
369                ELSE
370                     l_string := l_string||','||l_name_number_tbl(l_count);
371                END IF;
372           EXIT  WHEN l_count >= 3 ;
373           END LOOP ;
374         IF nvl(l_name_number_tbl.LAST,0)>3
375           THEN
376             l_string := l_string||','|| l_meaning||'..';
377         END IF ;
378           RETURN l_string;
379      ELSE
380           RETURN NULL;
381      END IF ;
382 END GET_ASSOCIATED_TASKS;
383 
384 -- SubProgram           : GET_OKE_FLAGS
385 -- Type                 : UTIL PROCEDURE
386 -- Purpose              : This procedure will return all the required flags for OKE
387 --                        validation . This API will call util APIs provided by OKE
388 --                        team.
389 -- Note                 : None
390 -- Assumption           : None
391 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
392 -- ---------------------------  ------------    ----------     ---------       ---------------------------
393 -- p_project_id                     IN            NUMBER          Y             Project Id
394 -- p_dlvr_item_id                   IN            NUMBER          Y             element id of the deliverable
395 -- p_dlvr_version_id                IN            NUMBER          Y             version id of the deliverable
396 -- p_action_item_id                 IN            NUMBER          Y             element id of the action
397 -- p_action_version_id              IN            VARCHAR2        Y             version id of the action
398 -- p_calling_module                 IN            VARCHAR2        Y             Calling module
399 -- x_ready_to_ship                  OUT           VARCHAR2        Y             Ready to ship flag
400 -- x_ready_to_procure               OUT           VARCHAR2        Y             Ready to procure flag
401 -- x_planning_initiated             OUT           VARCHAR2        Y             Planning initiated flag
402 -- x_proc_initiated                 OUT           VARCHAR2        Y             Procurement initiated flag
403 -- x_shipping_initiated             OUT           VARCHAR2        Y             Shipping initiated flag
404 -- x_item_exists                    OUT           VARCHAR2        Y             Item Exists Flag
405 -- x_item_shippable                 OUT           VARCHAR2        Y             Item Shippable Flag
406 -- x_item_billable                  OUT           VARCHAR2        Y             Item billable Flag
407 -- x_item_purchasable               OUT           VARCHAR2        Y             Item purchasable Flag
408 -- x_ship_procure_flag_dlv          OUT           VARCHAR2        Y             Shipping/Procurement Flag for deliverable
409 -- x_return_status                  OUT           VARCHAR2        Y
410 -- x_msg_count                      OUT           VARCHAR2        Y
411 -- x_msg_data                       OUT
412 
413 PROCEDURE GET_OKE_FLAGS
414          ( p_project_id             IN  pa_projects_all.project_id%TYPE
415           ,p_dlvr_item_id           IN  pa_proj_elements.proj_element_id%TYPE
416           ,p_dlvr_version_id        IN  pa_proj_element_versions.element_version_id%TYPE
417           ,p_action_item_id         IN  pa_proj_elements.proj_element_id%TYPE
418           ,p_action_version_id      IN  pa_proj_element_versions.element_version_id%TYPE
419           ,p_calling_module         IN  VARCHAR2
420           ,x_ready_to_ship          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
421           ,x_ready_to_procure       OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
422           ,x_planning_initiated     OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
423           ,x_proc_initiated         OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
424           ,x_shipping_initiated     OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
425           ,x_item_exists            OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
426           ,x_item_shippable         OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
427           ,x_item_billable          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
428           ,x_item_purchasable       OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
429           ,x_ship_procure_flag_dlv  OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
430           ,x_return_status          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
431           ,x_msg_count              OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
432           ,x_msg_data               OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
433          )
434 IS
435 
436      CURSOR ship_procure_flag_dlv IS
437      SELECT 'Y'
438        FROM dual
439      WHERE EXISTS ( SELECT 'Y'
440                       FROM  pa_object_relationships obj
441                            ,pa_proj_element_versions ver
442                       WHERE obj.object_id_from2 = p_dlvr_item_id
443                         AND obj.object_type_to = 'PA_ACTIONS'
444                         AND obj.object_type_from = 'PA_DELIVERABLES'
445                         AND obj.object_id_to2 = ver.proj_element_id
446                         AND obj.RELATIONSHIP_TYPE = 'A'
447                         AND obj.RELATIONSHIP_SUBTYPE = 'DELIVERABLE_TO_ACTION'
448                               AND (nvl(OKE_DELIVERABLE_UTILS_PUB.Ready_To_Ship_Yn(ver.element_version_id),'N') = 'Y'
449                                OR nvl(OKE_DELIVERABLE_UTILS_PUB.Ready_To_Procure_Yn(ver.element_version_id),'N') = 'Y' )
450                   ) ;
451 
452      l_debug_mode                 VARCHAR2(10);
453      l_msg_count                  NUMBER ;
454      l_data                       VARCHAR2(2000);
455      l_msg_data                   VARCHAR2(2000);
456      l_msg_index_out              NUMBER;
457 
458 BEGIN
459 
460      x_msg_count := 0;
461      x_return_status := FND_API.G_RET_STS_SUCCESS;
462      l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
463 
464      IF l_debug_mode = 'Y' THEN
465           PA_DEBUG.set_curr_function( p_function   => 'GET_OKE_FLAGS'
466                                      ,p_debug_mode => l_debug_mode );
467           pa_debug.g_err_stage:= 'Inside CREATE_DLV_ACTIONS_IN_BULK ';
468           pa_debug.write(g_module_name,pa_debug.g_err_stage,3) ;
469      END IF;
470 
471           x_ready_to_ship         := 'N' ;
472           x_ready_to_procure      := 'N' ;
473           x_planning_initiated    := 'N' ;
474           x_proc_initiated        := 'N' ;
475           x_shipping_initiated    := 'N' ;
476           x_item_exists           := 'N' ;
477           x_item_shippable        := 'N' ;
478           x_item_billable         := 'N' ;
479           x_item_purchasable      := 'N' ;
480           x_ship_procure_flag_dlv := 'N' ;
481 
482 --     IF p_calling_module  'DELETE_DELIVERABLE' THEN
483      IF p_calling_module IN ( 'DELETE_DELIVERABLE','DELETE_ASSOCIATION','UPDATE_DUE_DATE' ) THEN
484           OPEN ship_procure_flag_dlv ;
485           FETCH ship_procure_flag_dlv INTO x_ship_procure_flag_dlv ;
486           CLOSE ship_procure_flag_dlv ;
487      ELSE
488      -- Initialize all the out parameters
489 
490           x_ready_to_ship      := nvl(OKE_DELIVERABLE_UTILS_PUB.Ready_To_Ship_Yn (P_Action_ID => p_action_version_id),'N')   ;
491           x_ready_to_procure   := nvl(OKE_DELIVERABLE_UTILS_PUB.Ready_To_Procure_Yn(P_Action_ID => p_action_version_id ),'N')    ;
492           x_planning_initiated := nvl(OKE_DELIVERABLE_UTILS_PUB.MDS_Initiated_Yn(P_Action_ID => p_action_version_id ),'N')       ;
493           x_proc_initiated     := nvl(OKE_DELIVERABLE_UTILS_PUB.REQ_Initiated_Yn(P_Action_ID => p_action_version_id ),'N')       ;
494           x_shipping_initiated := nvl(OKE_DELIVERABLE_UTILS_PUB.WSH_Initiated_Yn(P_Action_ID => p_action_version_id ),'N')       ;
495 --          x_item_exists        := nvl(OKE_DELIVERABLE_UTILS_PUB.Item_Defined_Yn(P_Action_ID => p_action_version_id ),'N')        ;
496           x_item_exists        := nvl(OKE_DELIVERABLE_UTILS_PUB.Item_Defined_Yn( p_dlvr_version_id ),'N')        ;
497           x_item_shippable     := nvl(OKE_DELIVERABLE_UTILS_PUB.Item_Shippable_Yn(P_Deliverable_ID=>p_dlvr_version_id),'N')      ;
498           x_item_billable      := nvl(OKE_DELIVERABLE_UTILS_PUB.Item_Billable_Yn(P_Deliverable_ID => p_dlvr_version_id ),'N')    ;
499           x_item_purchasable   := nvl(OKE_DELIVERABLE_UTILS_PUB.Item_Purchasable_Yn(P_Deliverable_ID => p_dlvr_version_id ),'N') ;
500 
501           pa_debug.g_err_stage:= 'Inside CREATE_DLV_ACTIONS_IN_BULK ';
502           pa_debug.write(g_module_name,pa_debug.g_err_stage,3) ;
503      END IF ;
504 
505      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
506        pa_debug.reset_curr_function;
507      END IF ;
508 
509 EXCEPTION
510  WHEN OTHERS THEN
511      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
512      x_msg_count     := 1;
513      x_msg_data      := SQLERRM;
514 
515      FND_MSG_PUB.add_exc_msg( p_pkg_name=> 'PA_DELIVERABLE_UTILS'
516                      ,p_procedure_name  => 'GET_OKE_FLAGS');
517 
518      IF l_debug_mode = 'Y' THEN
519           pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
520           pa_debug.write('GET_OKE_FLAGS:'|| g_module_name,pa_debug.g_err_stage,5);
521           pa_debug.reset_curr_function;
522      END IF;
523      RAISE;
524 END GET_OKE_FLAGS ;
525 
526 -- SubProgram           : IS_TASK_ASSGMNT_EXISTS
527 -- Type                 : UTIL FUNCTION
528 -- Purpose              : This procedure will return 'Y' or 'N' based on whether
529 --                        deliverable is associated with task Assignment or not .
530 -- Note                 : None
531 -- Assumption           : None
532 --
533 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
534 -- ---------------------------  ------------    ----------     ---------       ---------------------------
535 -- p_project_id                     IN            NUMBER          Y             Project Id
536 -- p_dlvr_item_id                   IN            NUMBER          Y             element id of the deliverable
537 -- p_dlvr_version_id                IN            NUMBER          Y             version id of the deliverable
538 
539 FUNCTION IS_TASK_ASSGMNT_EXISTS
540          ( p_project_id             IN  pa_projects_all.project_id%TYPE
541           ,p_dlvr_item_id           IN  pa_proj_elements.proj_element_id%TYPE
542           ,p_dlvr_version_id        IN  pa_proj_element_versions.element_version_id%TYPE
543           )
544 RETURN VARCHAR2
545 IS
546      l_task_assignment_exists VARCHAR2(1) := 'N' ;
547      CURSOR C IS
548      SELECT 'Y'
549        FROM dual
550       WHERE EXISTS (SELECT 'X'
551                       from pa_object_relationships
552                      where object_id_to2 = p_dlvr_item_id
553                        and object_type_from = 'PA_ASSIGNMENTS'
554                        and object_type_to = 'PA_DELIVERABELS'
555                        and relationship_type = 'A'
556                        and relationship_subtype = 'ASSIGNMENT_TO_DELIVERABLE') ;
557 BEGIN
558      OPEN C ;
559      FETCH C INTO l_task_assignment_exists ;
560      CLOSE C ;
561 RETURN l_task_assignment_exists ;
562 END IS_TASK_ASSGMNT_EXISTS ;
563 
564 
565 -- SubProgram           : IS_DLV_STATUS_CHANGE_ALLOWED
566 -- Type                 : UTIL PROCEDURE
567 -- Purpose              : This procedure will return 'Y' or 'N' based on whether
568 --                        deliverable status change is allowed or not.
569 -- Note                 : None
570 -- Assumption           : None
571 --
572 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
573 -- ---------------------------  ------------    ----------     ---------       ---------------------------
574 -- p_project_id                     IN            NUMBER          Y             Project Id
575 -- p_dlvr_item_id                   IN            NUMBER          Y             element id of the deliverable
576 -- p_dlv_type_id                    IN            NUMBER          Y             Deliverable type id
577 -- p_dlvr_version_id                IN            NUMBER          Y             version id of the deliverable
578 -- x_return_status                  OUT           VARCHAR2
579 -- x_msg_count                      OUT           NUMBER
580 -- x_msg_data                       OUT           VARCHAR2
581 
582 
583 PROCEDURE IS_DLV_STATUS_CHANGE_ALLOWED
584        ( p_project_id             IN  pa_projects_all.project_id%TYPE
585         ,p_dlvr_item_id           IN  pa_proj_elements.proj_element_id%TYPE
586         ,p_dlvr_version_id        IN  pa_proj_element_versions.element_version_id%TYPE
587         ,p_dlv_type_id            IN  pa_task_types.task_type_id%TYPE
588         ,p_dlvr_status_code       IN  PA_PROJ_ELEMENTS.STATUS_CODE%TYPE
589         ,x_return_status          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
590         ,x_msg_count              OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
591         ,x_msg_data               OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
592        )
593 IS
594 
595      -- Cursor to check whether there existis any
596      -- action for the deliverable for which either
597      -- procurement is initiated or shipping has
598      -- been initiated or billing action exists
599 
600      CURSOR c_ship_procure_flag_dlv IS
601      SELECT 'Y'
602        FROM dual
603      WHERE EXISTS ( SELECT 'Y'
604                       FROM  pa_object_relationships obj
605                            ,pa_proj_element_versions ver
606                       WHERE obj.object_id_from2 = p_dlvr_item_id
607                         AND obj.object_type_to = 'PA_ACTIONS'
608                         AND obj.object_type_from = 'PA_DELIVERABLES'
609                         AND obj.object_id_to2 = ver.proj_element_id
610                         AND obj.relationship_type = 'A'
611                         AND obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
612                               AND (nvl(OKE_DELIVERABLE_UTILS_PUB.WSH_Initiated_Yn(ver.element_version_id),'N') = 'Y'
613                                OR  nvl(OKE_DELIVERABLE_UTILS_PUB.REQ_Initiated_Yn(ver.element_version_id),'N') = 'Y'
614                                OR PA_DELIVERABLE_UTILS.GET_FUNCTION_CODE(object_id_to2) = 'BILLING')
615                   ) ;
616 
617      -- This cursor will fetch the system_status_code
618      -- for the given status_code .
619 
620      CURSOR c_get_system_status IS
621      SELECT project_system_status_code
622        FROM pa_project_statuses
623       WHERE project_status_code = p_dlvr_status_code
624             AND status_type = 'DELIVERABLE' ;
625      -- Bug 3503296 In the following cursor ,we have to check
626      --"Whether Shipping Or Procurement has NOT been initiated for any of the deliverable's actions"
627      --If for atleast one hit that "Either Shipping Or Procurement has not been initiated for some action" then We cannot change
628      --the deliverable's status to completed .So,if this cursor returns 'Y' then status change to COMPLETED should not be allowed
629 
630      CURSOR c_complete_dlv_check IS
631      SELECT 'Y'
632        FROM dual
633      WHERE EXISTS ( SELECT 'Y'
634                       FROM  pa_object_relationships obj
635                            ,pa_proj_element_versions ver
636                       WHERE
637                             obj.object_id_from2          = p_dlvr_item_id
638                         AND obj.object_type_to           = 'PA_ACTIONS'
639                         AND obj.object_type_from         = 'PA_DELIVERABLES'
640                         AND obj.object_id_to2            = ver.proj_element_id
641                         AND
642                         (
643                           (
644                                   PA_DELIVERABLE_UTILS.GET_FUNCTION_CODE(object_id_to2) = 'SHIPPING'
645         -- Commented for Bug 3503296  AND  nvl(OKE_DELIVERABLE_UTILS_PUB.WSH_Initiated_Yn(ver.element_version_id),'N') = 'Y'
646                            AND  nvl(OKE_DELIVERABLE_UTILS_PUB.WSH_Initiated_Yn(ver.element_version_id),'N') = 'N' --Included for Bug 3503296
647                           )
648                           OR
649                           (
650                                     PA_DELIVERABLE_UTILS.GET_FUNCTION_CODE(object_id_to2) = 'PROCUREMENT'
651         -- Commented for Bug 3503296  AND   nvl(OKE_DELIVERABLE_UTILS_PUB.REQ_Initiated_Yn(ver.element_version_id),'N') = 'Y'
652                            AND   nvl(OKE_DELIVERABLE_UTILS_PUB.REQ_Initiated_Yn(ver.element_version_id),'N') = 'N' --Included for Bug 3503296
653                           )
654                         )
655                   );
656 
657 
658   -- Bug 3512346 CHECK_DELV_EVENT_PROCESSED API was uncommented by avaithia on 01-Apr-2004 (Also,Included Project Id,ElementVerId as params)
659      CURSOR c_complete_dlv_bill_check IS
660      SELECT 'Y'
661        FROM dual
662      WHERE EXISTS ( SELECT 'Y'
663                       FROM  pa_object_relationships obj
664                            ,pa_proj_element_versions ver
665                       WHERE
666                             obj.object_id_from2         = p_dlvr_item_id
667                         AND obj.object_type_to          = 'PA_ACTIONS'
668                         AND obj.object_type_from        = 'PA_DELIVERABLES'
669                         AND obj.object_id_to2           = ver.proj_element_id
670                         AND
671                         (
672                                 PA_DELIVERABLE_UTILS.GET_FUNCTION_CODE(object_id_to2) = 'BILLING'
673                             AND nvl(PA_BILLING_WRKBNCH_EVENTS.CHECK_DELV_EVENT_PROCESSED(ver.project_id,p_dlvr_version_id,ver.element_version_id) ,'N') = 'N'
674                         )
675                   );
676 
677      l_system_status_code  pa_lookups.lookup_code%TYPE  ;
678      l_status_change_allowed  VARCHAR2(1) ;
679 BEGIN
680 
681      x_return_status := FND_API.G_RET_STS_SUCCESS;
682 
683      OPEN c_get_system_status ;
684      FETCH c_get_system_status INTO l_system_status_code ;
685      IF c_get_system_status%NOTFOUND THEN
686           x_return_status := FND_API.G_RET_STS_SUCCESS;
687      END IF ;
688      CLOSE c_get_system_status ;
689 
690      -- Status mapped to system defined DLVR_ON_HOLD/DLVR_CANCELLED
691      -- is not allowed if :
692      --    1. Billing function extsts
693      --    2. Shipping has been initiated for any of the action
694      --    3. Procurement has been initiated for any of the action
695 
696      IF l_system_status_code IN ('DLVR_ON_HOLD','DLVR_CANCELLED') THEN
697 
698           OPEN c_ship_procure_flag_dlv ;
699           FETCH c_ship_procure_flag_dlv INTO l_status_change_allowed  ;
700 
701           IF c_ship_procure_flag_dlv%NOTFOUND THEN
702                l_status_change_allowed := 'Y' ;
703           ELSE
704                l_status_change_allowed := 'N' ;
705                -- 4229934 Added code to populate error  message if dlvr status change to cancel is
706                -- not allowed
707                PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
708                                      p_msg_name       => 'PA_DLV_STATUS_CHG_NOT_ALLOWED');
709                -- 4229934 end
710                x_return_status := FND_API.G_RET_STS_ERROR;
711           END IF ;
712 
713           CLOSE c_ship_procure_flag_dlv ;
714 
715      ELSE
716           l_status_change_allowed := 'Y' ;
717      END IF ;
718 
719      -- Status mapped to system defined DLVR_COMPLETED is not allowed if
720      --   1. Shipping has not been initiated for shipping action.
721      --   2. Procurement has not been initiated for procurement action .
722      --   3. Event has not been processed by billing action .
723      --   4. Document based deliverable has no deliverbale docs. defined.
724      --   5. Item based document has no item defined .
725 
726      IF l_system_status_code = 'DLVR_COMPLETED' THEN
727 
728           IF PA_DELIVERABLE_UTILS.GET_DLV_TYPE_CLASS_CODE(p_dlv_type_id) = 'DOCUMENT' THEN
729 
730                IF PA_DELIVERABLE_UTILS.IS_DLV_DOC_DEFINED(p_dlvr_item_id,p_dlvr_version_id) = 'N' THEN
731                     l_status_change_allowed := 'N' ;
732                     PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
733                                            p_msg_name       => 'PA_DLV_DOC_NOT_DEFINED');
734                     x_return_status := FND_API.G_RET_STS_ERROR;
735                ELSE
736                     l_status_change_allowed := 'Y' ;
737                END IF ;
738 
739           ELSIF PA_DELIVERABLE_UTILS.GET_DLV_TYPE_CLASS_CODE(p_dlv_type_id) = 'ITEM' THEN
740 
741                IF OKE_DELIVERABLE_UTILS_PUB.Item_Defined_Yn(p_dlvr_version_id) = 'N' THEN
742                     l_status_change_allowed := 'N' ;
743                     PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
744                                            p_msg_name     => 'PA_DLV_ITEM_NOT_DEFINED');
745                     x_return_status := FND_API.G_RET_STS_ERROR;
746                ELSE
747                     l_status_change_allowed := 'Y' ;
748                END IF ;
749 
750           END IF ;
751 
752           OPEN c_complete_dlv_check ;
753           FETCH c_complete_dlv_check INTO l_status_change_allowed ;
754 
755           IF c_complete_dlv_check%NOTFOUND THEN
756                l_status_change_allowed := 'Y' ;
757           ELSE
758                l_status_change_allowed := 'N' ;
759                PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
760                                       p_msg_name     => 'PA_DLV_WSH_REQ_NOT_INITIATED');
761                x_return_status := FND_API.G_RET_STS_ERROR;
762           END IF ;
763           CLOSE c_complete_dlv_check ;
764 
765 
766           OPEN c_complete_dlv_bill_check ;
767           FETCH c_complete_dlv_bill_check INTO l_status_change_allowed ;
768 
769           IF c_complete_dlv_bill_check%NOTFOUND THEN
770                l_status_change_allowed := 'Y' ;
771           ELSE
772                l_status_change_allowed := 'N' ;
773                PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
774                                       p_msg_name     => 'PA_DLV_BILL_EVT_NOT_INITIATED');
775                x_return_status := FND_API.G_RET_STS_ERROR;
776           END IF ;
777           CLOSE c_complete_dlv_bill_check ;
778 
779      END IF ;
780 EXCEPTION
781 WHEN OTHERS THEN
782 
783      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
784      x_msg_count     := 1;
785      x_msg_data      := SQLERRM;
786 
787      IF c_ship_procure_flag_dlv%ISOPEN THEN
788         CLOSE c_ship_procure_flag_dlv;
789      END IF;
790 
791      IF c_complete_dlv_check%ISOPEN THEN
792         CLOSE c_complete_dlv_check;
793      END IF;
794 
795      IF c_complete_dlv_bill_check%ISOPEN THEN
796         CLOSE c_complete_dlv_bill_check;
797      END IF;
798 
799      Fnd_Msg_Pub.add_exc_msg
800                    ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
801                     , p_procedure_name  => 'IS_DLV_STATUS_CHANGE_ALLOWED'
802                     , p_error_text      => x_msg_data);
803 
804 END IS_DLV_STATUS_CHANGE_ALLOWED ;
805 
806 -- SubProgram           : GET_DLV_TYPE_CLASS_CODE
807 -- Type                 : UTIL FUNCTION
808 -- Purpose              : This procedure will return Deliverable Type Class Code
809 -- Note                 : None
810 -- Assumption           : None
811 --
812 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
813 -- ---------------------------  ------------    ----------     ---------       ---------------------------
814 -- p_dlv_type_id                    IN            NUMBER          Y             Deliverable type id
815 
816 FUNCTION GET_DLV_TYPE_CLASS_CODE
817      (
818       p_dlvr_type_id IN pa_task_types.task_type_id%TYPE
819      )
820 RETURN VARCHAR2
821 IS
822 CURSOR c_dlv_type_class IS
823 SELECT task_type_class_code
824   FROM pa_task_types
825  WHERE task_type_id = p_dlvr_type_id ;
826  l_task_type_class_code pa_task_types.task_type_class_code%TYPE ;
827 BEGIN
828      OPEN c_dlv_type_class ;
829      FETCH c_dlv_type_class INTO l_task_type_class_code ;
830      IF c_dlv_type_class%NOTFOUND THEN
831           l_task_type_class_code := null ;
832      END IF ;
833      CLOSE c_dlv_type_class ;
834      RETURN l_task_type_class_code ;
835 END GET_DLV_TYPE_CLASS_CODE ;
836 
837 -- SubProgram           : GET_FUNCTION_CODE
838 -- Type                 : UTIL FUNCTION
839 -- Purpose              : This procedure will return function code of action
840 -- Note                 : None
841 -- Assumption           : None
842 --
843 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
844 -- ---------------------------  ------------    ----------     ---------       ---------------------------
845 -- p_action_element_id             IN            NUMBER          Y             Element Id Of Action
846 
847 FUNCTION GET_FUNCTION_CODE
848      (
849       p_action_element_id IN pa_proj_elements.proj_element_id%TYPE
850       )
851 RETURN VARCHAR2
852 IS
853      CURSOR c_function_code IS
854      SELECT function_code
855      FROM pa_proj_elements
856      WHERE proj_element_id = p_action_element_id ;
857      l_function_code pa_proj_elements.function_code%TYPE ;
858 BEGIN
859      OPEN c_function_code ;
860      FETCH c_function_code INTO l_function_code ;
861      IF c_function_code%NOTFOUND THEN
862           l_function_code := null ;
863      END IF ;
864      CLOSE c_function_code ;
865      RETURN l_function_code ;
866 END GET_FUNCTION_CODE ;
867 
868 -- SubProgram           : IS_DLV_DOC_DEFINED
869 -- Type                 : UTIL FUNCTION
870 -- Purpose              : This procedure will return 'Y' or 'N' based on whether
871 --                        Deliverable Documents is defined or not
872 -- Note                 : None
873 -- Assumption           : None
874 --
875 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
876 -- ---------------------------  ------------    ----------     ---------       ---------------------------
877 -- p_action_element_id             IN            NUMBER          Y             Element Id Of Action
878 -- p_dlvr_item_id                  IN            NUMBER          Y             Element Version Id of Action
879 
880 
881 FUNCTION IS_DLV_DOC_DEFINED
882      (
883          p_dlvr_item_id         IN      PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
884         ,p_dlvr_version_id      IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
885      )  RETURN VARCHAR2
886 IS
887 
888 l_doc_defined VARCHAR2(1) := 'N' ;
889 
890 CURSOR l_doc_exists_csr
891 IS
892 SELECT
893       'Y'
894 FROM
895       DUAL
896 WHERE EXISTS
897     (
898         SELECT
899                'Y'
900         FROM
901                FND_ATTACHED_DOCUMENTS ATT
902         WHERE
903                   ATT.ENTITY_NAME = 'PA_DLVR_DOC_ATTACH'
904               AND ATT.PK1_VALUE   = p_dlvr_version_id
905     );
906 
907 BEGIN
908 
909      OPEN l_doc_exists_csr ;
910      FETCH l_doc_exists_csr INTO l_doc_defined ;
911      CLOSE l_doc_exists_csr ;
912 
913      RETURN l_doc_defined ;
914 
915 EXCEPTION
916 
917 WHEN NO_DATA_FOUND THEN
918          l_doc_defined  := null;
919          return l_doc_defined;
920 
921 WHEN OTHERS THEN
922 
923      IF l_doc_exists_csr%ISOPEN THEN
924         CLOSE l_doc_exists_csr;
925      END IF;
926 
927      Fnd_Msg_Pub.add_exc_msg
928                    ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
929                     , p_procedure_name  => 'IS_DLV_DOC_DEFINED'
930                     , p_error_text      => SUBSTRB(SQLERRM,1,240));
931 
932 
933      RAISE;
934 
935 END IS_DLV_DOC_DEFINED;
936 
937 
938 -- dthakker :: added the following procedures and functions
939 
940 -- Procedure            : GET_STRUCTURE_INFO
941 -- Type                 : UTILITY
942 -- Purpose              : To retrieve Structure Information
943 -- Note                 : Fetch structure element_id and element_version_id from
944 --                      : the cursor
945 -- Assumptions          : Use this API to get structure info of only 'DELIVERABLE' structure type
946 --                        For other structure types it mau not work
947 -- Parameters                   Type     Required       Description and Purpose
948 -- ---------------------------  ------   --------       --------------------------------------------------------
949 -- p_api_version                NUMBER      N           1.0
950 -- p_calling_module             VARCHAR2    N           := 'SELF_SERVICE'
951 -- p_project_id                 NUMBER      Y           Project Id
952 -- p_structure_type             VARCHAR2    Y           Structure Type
953 -- x_proj_element_id            NUMBER
954 -- x_element_version_id         NUMBER
955 -- x_return_status              VARCHAR2    N           Return Status
956 -- x_msg_count                  NUMBER      N           Message Count
957 -- x_msg_data                   VARCHAR2    N           Message Data
958 
959 
960 PROCEDURE GET_STRUCTURE_INFO
961     (
962          p_api_version              IN      NUMBER   := 1.0
963         ,p_calling_module           IN      VARCHAR2 := 'SELF_SERVICE'
964         ,p_project_id               IN      PA_PROJ_ELEMENTS.PROJECT_ID%TYPE
965         ,p_structure_type           IN      VARCHAR2 := 'DELIVERABLE'
966         ,x_proj_element_id          OUT     NOCOPY PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE --File.Sql.39 bug 4440895
967         ,x_element_version_id       OUT     NOCOPY PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE --File.Sql.39 bug 4440895
968         ,x_return_status            OUT     NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
969         ,x_msg_count                OUT     NOCOPY NUMBER --File.Sql.39 bug 4440895
970         ,x_msg_data                 OUT     NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
971     )
972 IS
973 l_msg_count                      NUMBER := 0;
974 l_data                           VARCHAR2(2000);
975 l_msg_data                       VARCHAR2(2000);
976 l_msg_index_out                  NUMBER;
977 l_debug_mode                     VARCHAR2(1);
978 
979 l_debug_level2                   CONSTANT NUMBER := 2;
980 l_debug_level3                   CONSTANT NUMBER := 3;
981 l_debug_level4                   CONSTANT NUMBER := 4;
982 l_debug_level5                   CONSTANT NUMBER := 5;
983 
984 l_object_type                    VARCHAR2(150) := 'PA_STRUCTURES';
985 l_proj_element_id                NUMBER;
986 l_element_version_id             NUMBER;
987 
988 CURSOR l_struct_info_csr
989 IS
990 SELECT ppe.proj_element_id
991       ,ppe.element_version_id
992   FROM pa_proj_elem_ver_structure ppe
993       ,pa_proj_structure_types pst
994       ,pa_structure_types sty
995  WHERE ppe.project_id = p_project_id
996    AND ppe.proj_element_id = pst.proj_element_id
997    AND pst.structure_type_id = sty.structure_type_id
998    AND sty.structure_type = p_structure_type
999    AND sty.structure_type_class_code = p_structure_type ;
1000 
1001 /* Commented following existing code for Performance Fix : Bug  3614361
1002    Instead of deriving structure information in the way mentioned in commented code,a better
1003    approach will be to retrieve the Structure Information from pa_proj_elem_ver_structure table
1004    as above */
1005 
1006 /*Select
1007      ppe.proj_element_id
1008     ,pev.element_version_id
1009 From
1010     pa_proj_elements ppe,
1011     pa_proj_element_versions pev,
1012     pa_proj_structure_types pst,
1013     pa_structure_types st
1014 Where
1015             ppe.project_id = p_project_id
1016        and  pev.project_id = p_project_id
1017        and  ppe.object_type = l_object_type
1018        and  ppe.proj_element_id = pev.proj_element_id
1019        and  pev.object_type = l_object_type
1020        and  ppe.proj_element_id = pst.proj_element_id
1021        and  pst.STRUCTURE_TYPE_ID = st.STRUCTURE_TYPE_ID
1022        and  st.structure_type = p_structure_type
1023        and  st.structure_type_class_code = p_structure_type;
1024 */
1025 
1026 BEGIN
1027     x_msg_count := 0;
1028     x_return_status := FND_API.G_RET_STS_SUCCESS;
1029     l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
1030 
1031     IF l_debug_mode = 'Y' THEN
1032        PA_DEBUG.set_curr_function( p_function   => 'GET_STRICTURE_INFO',
1033                                      p_debug_mode => l_debug_mode );
1034     END IF;
1035 
1036     IF l_debug_mode = 'Y' THEN
1037        Pa_Debug.g_err_stage:= 'GET_STRICTURE_INFO : Printing Input parameters';
1038        Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
1039                                     l_debug_level3);
1040        Pa_Debug.WRITE(g_module_name,' P_PROJECT_ID '||':'|| p_project_id,
1041                                     l_debug_level3);
1042        Pa_Debug.WRITE(g_module_name,' P_STRUCTURE_TYPE '||':'|| p_structure_type,
1043                                     l_debug_level3);
1044     END IF;
1045 
1046     IF l_debug_mode = 'Y' THEN
1047        Pa_Debug.g_err_stage:= 'Fetch Structure Info From Cursor';
1048        Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
1049                                     l_debug_level3);
1050     END IF;
1051 
1052     OPEN l_struct_info_csr;
1053     FETCH l_struct_info_csr INTO l_proj_element_id, l_element_version_id;
1054     CLOSE l_struct_info_csr;
1055 
1056     x_proj_element_id := l_proj_element_id;
1057     x_element_version_id := l_element_version_id;
1058 
1059     x_return_status := FND_API.G_RET_STS_SUCCESS;
1060 
1061      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
1062        pa_debug.reset_curr_function;
1063      END IF ;
1064 
1065 EXCEPTION
1066 
1067 WHEN OTHERS THEN
1068 
1069      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1070      x_msg_count     := 1;
1071      x_msg_data      := SQLERRM;
1072 
1073      IF l_struct_info_csr%ISOPEN THEN
1074         CLOSE l_struct_info_csr;
1075      END IF;
1076 
1077      Fnd_Msg_Pub.add_exc_msg
1078                    ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1079                     , p_procedure_name  => 'GET_STRUCTURE_INFO'
1080                     , p_error_text      => x_msg_data);
1081 
1082      IF l_debug_mode = 'Y' THEN
1083           Pa_Debug.g_err_stage:= 'Unexpected Error'||x_msg_data;
1084           Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
1085                               l_debug_level5);
1086           Pa_Debug.reset_curr_function;
1087      END IF;
1088 
1089 END GET_STRUCTURE_INFO;
1090 
1091 
1092 -- Procedure            : GET_CARRYING_OUT_ORG
1093 -- Type                 : UTILITY
1094 -- Purpose              : To retrieve Carrying Out Organization Id
1095 -- Note                 : Retrieve Carrying Out Organization Id from pa_projects if task_id  is null,
1096 --                      : Retrieve Carrying Out Organization Id from pa_proj_elements if task_id is not null
1097 -- Assumptions          : None
1098 
1099 -- Parameters                   Type     Required       Description and Purpose
1100 -- ---------------------------  ------   --------       --------------------------------------------------------
1101 -- p_project_id                 NUMBER      Y           Project Id
1102 -- p_task_id                    NUMBER      Y           Task Id
1103 
1104 FUNCTION GET_CARRYING_OUT_ORG
1105         (
1106              p_project_id   PA_PROJ_ELEMENTS.PROJECT_ID%TYPE
1107             ,p_task_id      PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
1108         )
1109         RETURN NUMBER
1110 IS
1111         x_organization_id      PA_PROJ_ELEMENTS.CARRYING_OUT_ORGANIZATION_ID%TYPE;
1112 BEGIN
1113         -- if task_id is null then retrive carrying_out_organization_id from pa_projects
1114         IF (p_task_id IS NULL) THEN
1115                 SELECT
1116                     p.carrying_out_organization_id    INTO x_organization_id
1117                 FROM
1118                     PA_PROJECTS_ALL p
1119                 WHERE   p.project_id = p_project_id;
1120         -- else retrive carrying_out_organization_id from pa_proj_elements
1121         ELSE
1122              SELECT
1123                     ppe.carrying_out_organization_id INTO x_organization_id
1124              FROM
1125                     PA_PROJ_ELEMENTS ppe
1126              WHERE
1127                         ppe.proj_element_id = p_task_id
1128                     AND ppe.object_type     = 'PA_TASKS'
1129                     AND ppe.project_id      = p_project_id;
1130         END IF;
1131 
1132         return x_organization_id;
1133 EXCEPTION
1134 
1135 WHEN NO_DATA_FOUND THEN
1136          x_organization_id  := null;
1137          return x_organization_id;
1138 
1139 WHEN OTHERS THEN
1140 
1141          Fnd_Msg_Pub.add_exc_msg
1142                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1143                         , p_procedure_name  => 'GET_CARRYING_OUT_ORG'
1144                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1145 
1146          RAISE;
1147 
1148 END GET_CARRYING_OUT_ORG;
1149 
1150 -- Procedure            : GET_PROGRESS_ROLLUP_METHOD
1151 -- Type                 : UTILITY
1152 -- Purpose              : To retrieve Progress Rollup Method
1153 -- Note                 : Retrieve Progress Rollup Method from pa_proj_elements for task id
1154 --                      :
1155 -- Assumptions          : None
1156 
1157 -- Parameters                   Type     Required       Description and Purpose
1158 -- ---------------------------  ------   --------       --------------------------------------------------------
1159 -- p_task_id                    NUMBER      Y           Task Id
1160 
1161 
1162 FUNCTION GET_PROGRESS_ROLLUP_METHOD
1163             (
1164                 p_task_id   PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
1165             )
1166         RETURN VARCHAR2
1167 IS
1168         x_base_percent_comp_deriv_code      VARCHAR2(30);
1169 BEGIN
1170          SELECT ppe.base_percent_comp_deriv_code
1171            INTO x_base_percent_comp_deriv_code
1172          FROM   PA_PROJ_ELEMENTS ppe
1173          WHERE  ppe.proj_element_id = p_task_id
1174           AND   ppe.object_type = 'PA_TASKS';
1175 
1176         -- 3625019 when task type is changed from update task detail page
1177         -- base_percent_comp_deriv_code attribute is set to null and task type id
1178         -- is set to null value
1179 
1180         -- to handle above case, if base_percent_comp_deriv_code is null , retrieve
1181         -- progress rollup method from task type
1182 
1183         IF x_base_percent_comp_deriv_code IS NULL THEN
1184                  select ptt.base_percent_comp_deriv_code
1185                    INTO x_base_percent_comp_deriv_code
1186                    from pa_task_types ptt,
1187                         pa_proj_elements ppe
1188                   where ppe.proj_element_id = p_task_id
1189                     and ptt.task_type_id = ppe.type_id ;
1190         END IF;
1191 
1192         return x_base_percent_comp_deriv_code;
1193 EXCEPTION
1194 
1195 WHEN NO_DATA_FOUND THEN
1196 
1197          x_base_percent_comp_deriv_code  := null;
1198          return x_base_percent_comp_deriv_code;
1199 
1200 WHEN OTHERS THEN
1201 
1202          Fnd_Msg_Pub.add_exc_msg
1203                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1204                         , p_procedure_name  => 'GET_PROGRESS_ROLLUP_METHOD'
1205                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1206 
1207          RAISE;
1208 
1209 END GET_PROGRESS_ROLLUP_METHOD;
1210 
1211 
1212 -- Procedure            : IS_ACTIONS_EXISTS
1213 -- Type                 : UTILITY
1214 -- Purpose              : To check Deliverable Actions exists for Deliverable
1215 -- Note                 : Used in Update_Deliverable API
1216 --                      :
1217 -- Assumptions          : None
1218 
1219 -- Parameters                   Type     Required       Description and Purpose
1220 -- ---------------------------  ------   --------       --------------------------------------------------------
1221 -- p_proj_element_id            NUMBER      Y           Deliverable Id ( Proj Element Id )
1222 -- p_project_id                 NUMBER      Y           Project Id
1223 
1224 FUNCTION IS_ACTIONS_EXISTS
1225     (
1226          p_project_id        IN  PA_PROJ_ELEMENTS.PROJECT_ID%TYPE
1227         ,p_proj_element_id   IN  PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
1228     )
1229         RETURN VARCHAR2
1230 IS
1231         x_actions_exists        VARCHAR2(1)     := 'N';
1232         l_relationship_type     VARCHAR2(30)    := 'DELIVERABLE_TO_ACTION';
1233 BEGIN
1234 
1235          SELECT
1236                 'Y' into x_actions_exists
1237          FROM
1238                 DUAL
1239          WHERE
1240          EXISTS
1241                 (
1242                      SELECT
1243                             OBJECT_RELATIONSHIP_ID
1244                      FROM
1245                             PA_OBJECT_RELATIONSHIPS
1246                      WHERE
1247                                 OBJECT_ID_FROM2         = p_proj_element_id
1248                             AND RELATIONSHIP_SUBTYPE    = l_relationship_type
1249                             AND RELATIONSHIP_TYPE       = 'A'
1250                 );
1251 
1252          return nvl(x_actions_exists,'N');
1253 EXCEPTION
1254 
1255 WHEN NO_DATA_FOUND THEN
1256 
1257          x_actions_exists  := 'N';
1258          return x_actions_exists;
1259 
1260 WHEN OTHERS THEN
1261 
1262          Fnd_Msg_Pub.add_exc_msg
1263                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1264                         , p_procedure_name  => 'IS_ACTIONS_EXISTS'
1265                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1266 
1267          RAISE;
1268 
1269 END IS_ACTIONS_EXISTS;
1270 
1271 
1272 -- Procedure            : IS_BILLING_FUNCTION_EXISTS
1273 -- Type                 : UTILITY
1274 -- Purpose              : To check BILLING function exists for Deliverable Actions
1275 -- Note                 : Used in Update_Deliverable API
1276 --                      :
1277 -- Assumptions          : None
1278 
1279 -- Parameters                   Type     Required       Description and Purpose
1280 -- ---------------------------  ------   --------       --------------------------------------------------------
1281 -- p_proj_element_id            NUMBER      Y           Deliverable Id ( Proj Element Id )
1282 -- p_project_id                 NUMBER      Y           Project Id
1283 
1284 FUNCTION IS_BILLING_FUNCTION_EXISTS
1285     (
1286          p_project_id        IN  PA_PROJ_ELEMENTS.PROJECT_ID%TYPE
1287         ,p_proj_element_id   IN  PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
1288     )
1289         RETURN VARCHAR2
1290 IS
1291         x_biling_function_exists        VARCHAR2(1) := 'N';
1292         l_function_code                 VARCHAR2(30) := 'BILLING';
1293 BEGIN
1294 
1295          SELECT
1296                 'Y' into x_biling_function_exists
1297          FROM
1298                 DUAL
1299          WHERE
1300          EXISTS
1301                 (
1302                      SELECT
1303                             PPE.PROJ_ELEMENT_ID
1304                      FROM
1305                              PA_OBJECT_RELATIONSHIPS POR
1306                             ,PA_PROJ_ELEMENTS PPE
1307                      WHERE
1308                                 POR.OBJECT_ID_FROM2     =  p_proj_element_id
1309                             AND PPE.PROJ_ELEMENT_ID     =  POR.OBJECT_ID_TO2
1310                             AND POR.OBJECT_TYPE_FROM    = 'PA_DELIVERABLES'
1311                             AND POR.OBJECT_TYPE_TO      = 'PA_ACTIONS'
1312                             AND PPE.FUNCTION_CODE       =  l_function_code
1313                 );
1314 
1315          return nvl(x_biling_function_exists,'N');
1316 EXCEPTION
1317 
1318 WHEN NO_DATA_FOUND THEN
1319 
1320          x_biling_function_exists  := 'N';
1321          return x_biling_function_exists;
1322 
1323 WHEN OTHERS THEN
1324 
1325          Fnd_Msg_Pub.add_exc_msg
1326                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1327                         , p_procedure_name  => 'IS_BILLING_FUNCTION_EXISTS'
1328                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1329 
1330          RAISE;
1331 
1332 END IS_BILLING_FUNCTION_EXISTS;
1333 
1334 -- Procedure            : IS_DELIVERABLE_HAS_PROGRESS
1335 -- Type                 : UTILITY
1336 -- Purpose              : To check Progress Record Exists for Deliverable
1337 -- Note                 : Used in Update_Deliverable API
1338 --                      :
1339 -- Assumptions          : None
1340 
1341 -- Parameters                   Type     Required       Description and Purpose
1342 -- ---------------------------  ------   --------       --------------------------------------------------------
1343 -- p_proj_element_id            NUMBER      Y           Deliverable Id ( Proj Element Id )
1344 -- p_project_id                 NUMBER      Y           Project Id
1345 
1346 FUNCTION IS_DELIVERABLE_HAS_PROGRESS
1347     (
1348          p_project_id        IN  PA_PROJ_ELEMENTS.PROJECT_ID%TYPE
1349         ,p_proj_element_id   IN  PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
1350     )
1351         RETURN VARCHAR2
1352 IS
1353         x_deliverable_has_progress        VARCHAR2(1) := 'N';
1354 BEGIN
1355 
1356         -- 3279978 added function call to check progress records for deliverable
1357 
1358         x_deliverable_has_progress := PA_PROGRESS_UTILS.check_object_has_prog(
1359                                              p_project_id    =>  p_project_id
1360                                             ,p_object_id     =>  p_proj_element_id
1361                                             ,p_object_type   =>  'PA_DELIVERABLES'
1362                                       );
1363 
1364         return nvl(x_deliverable_has_progress,'N');
1365 EXCEPTION
1366 
1367 WHEN NO_DATA_FOUND THEN
1368 
1369          x_deliverable_has_progress  := 'N';
1370          return x_deliverable_has_progress;
1371 
1372 WHEN OTHERS THEN
1373          Fnd_Msg_Pub.add_exc_msg
1374                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1375                         , p_procedure_name  => 'IS_DELIVERABLE_HAS_PROGRESS'
1376                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1377 
1378          RAISE;
1379 END IS_DELIVERABLE_HAS_PROGRESS;
1380 
1381 
1382 -- Procedure            : GET_DLVR_TYPE_INFO
1383 -- Type                 : UTILITY
1384 -- Purpose              : To retrieve Deliverable Type Info
1385 -- Note                 :
1386 --                      :
1387 -- Assumptions          : None
1388 
1389 -- Parameters                   Type     Required       Description and Purpose
1390 -- ---------------------------  ------   --------       --------------------------------------------------------
1391 -- p_dlvr_type_id               NUMBER      Y           Task Id
1392 -- x_dlvr_prg_enabled           VARCHAR2                dlvr prg flag
1393 -- x_dlvr_action_enabled        VARCHAR2                enable_action_flag
1394 -- x_dlvr_default_status_code   VARCHAR2                default_status_code
1395 
1396 
1397 PROCEDURE GET_DLVR_TYPE_INFO
1398             (
1399                  p_dlvr_type_id              IN   PA_TASK_TYPES.TASK_TYPE_ID%TYPE
1400                 ,x_dlvr_prg_enabled          OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1401                 ,x_dlvr_action_enabled       OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1402                 ,x_dlvr_default_status_code  OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1403             )
1404 IS
1405 CURSOR l_dlvr_type_info_csr
1406 IS
1407      SELECT
1408              ptt.prog_entry_enable_flag
1409             ,ptt.enable_dlvr_actions_flag
1410             ,ptt.initial_status_code
1411      FROM
1412             PA_TASK_TYPES ptt
1413      WHERE
1414                 ptt.task_type_id = p_dlvr_type_id
1415             AND ptt.object_type = 'PA_DLVR_TYPES';
1416 
1417 BEGIN
1418 
1419         OPEN l_dlvr_type_info_csr;
1420         FETCH l_dlvr_type_info_csr INTO x_dlvr_prg_enabled, x_dlvr_action_enabled, x_dlvr_default_status_code;
1421         CLOSE l_dlvr_type_info_csr;
1422 
1423 EXCEPTION
1424 
1425 WHEN OTHERS THEN
1426 
1427          Fnd_Msg_Pub.add_exc_msg
1428                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1429                         , p_procedure_name  => 'IS_DLVR_PRG_ENABLED'
1430                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1431 
1432          IF l_dlvr_type_info_csr%ISOPEN THEN
1433             CLOSE l_dlvr_type_info_csr;
1434          END IF;
1435 
1436          RAISE;
1437 
1438 END GET_DLVR_TYPE_INFO;
1439 
1440 -- Procedure            : GET_DLVR_DETAIL
1441 -- Type                 : UTILITY
1442 -- Purpose              : To retrieve Deliverable name and number
1443 -- Note                 : Retrieve Name and Number from pa_proj_elements
1444 --                      :
1445 -- Assumptions          : None
1446 
1447 -- Parameters                   Type     Required       Description and Purpose
1448 -- ---------------------------  ------   --------       --------------------------------------------------------
1449 -- p_dlvr_version_id            NUMBER      Y           Deliverable Version Id
1450 -- x_name                       VARCHAR2                Deliverable Name
1451 -- x_number                     VARCHAR2                Deliverable Number
1452 
1453 
1454 PROCEDURE GET_DLVR_DETAIL
1455     (
1456           p_dlvr_ver_id         IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1457          ,x_name                OUT     NOCOPY PA_PROJ_ELEMENTS.NAME%TYPE --File.Sql.39 bug 4440895
1458          ,x_number              OUT     NOCOPY PA_PROJ_ELEMENTS.ELEMENT_NUMBER%TYPE --File.Sql.39 bug 4440895
1459     )
1460 IS
1461 CURSOR l_dlvr_info_csr
1462 IS
1463         SELECT
1464             PPE.NAME,
1465             PPE.ELEMENT_NUMBER
1466         FROM
1467             PA_PROJ_ELEMENTS PPE,
1468             PA_PROJ_ELEMENT_VERSIONS PEV
1469         WHERE
1470                 PEV.ELEMENT_VERSION_ID  = p_dlvr_ver_id
1471             AND PPE.PROJECT_ID          = PEV.PROJECT_ID
1472             AND PPE.PROJ_ELEMENT_ID     = PEV.PROJ_ELEMENT_ID
1473             AND PPE.OBJECT_TYPE         = 'PA_DELIVERABLES'
1474             AND PEV.OBJECT_TYPE         = 'PA_DELIVERABLES';
1475 
1476 BEGIN
1477 
1478         OPEN l_dlvr_info_csr;
1479         FETCH l_dlvr_info_csr INTO x_name, x_number;
1480         CLOSE l_dlvr_info_csr;
1481 
1482 EXCEPTION
1483 
1484 WHEN OTHERS THEN
1485 
1486          Fnd_Msg_Pub.add_exc_msg
1487                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1488                         , p_procedure_name  => 'GET_DLVR_DETAIL'
1489                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1490 
1491          IF l_dlvr_info_csr%ISOPEN THEN
1492             CLOSE l_dlvr_info_csr;
1493          END IF;
1494 
1495          RAISE;
1496 
1497 END GET_DLVR_DETAIL;
1498 
1499 
1500 -- Procedure            : GET_ACTION_DETAIL
1501 -- Type                 : UTILITY
1502 -- Purpose              : To retrieve Deliverable Action name and number
1503 -- Note                 : Retrieve Action Name and Number from pa_proj_elements
1504 --                      :
1505 -- Assumptions          : None
1506 
1507 -- Parameters                   Type     Required       Description and Purpose
1508 -- ---------------------------  ------   --------       --------------------------------------------------------
1509 -- p_dlvr_action_ver_id         NUMBER      Y           Delivearble Action Version Id
1510 -- x_name                       VARCHAR2                Deliverable Action Name
1511 -- x_number                     VARCHAR2                Deliverable Action Number
1512 
1513 
1514 PROCEDURE GET_ACTION_DETAIL
1515     (
1516           p_dlvr_action_ver_id       IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1517          ,x_name                     OUT     NOCOPY PA_PROJ_ELEMENTS.NAME%TYPE --File.Sql.39 bug 4440895
1518          ,x_number                   OUT     NOCOPY PA_PROJ_ELEMENTS.ELEMENT_NUMBER%TYPE --File.Sql.39 bug 4440895
1519     )
1520 IS
1521 
1522 CURSOR l_dlvr_action_info_csr
1523 IS
1524         SELECT
1525             PPE.NAME,
1526             PPE.ELEMENT_NUMBER
1527         FROM
1528             PA_PROJ_ELEMENTS PPE,
1529             PA_PROJ_ELEMENT_VERSIONS PEV
1530         WHERE
1531                 PEV.ELEMENT_VERSION_ID  = p_dlvr_action_ver_id
1532             AND PPE.PROJECT_ID          = PEV.PROJECT_ID
1533             AND PPE.PROJ_ELEMENT_ID     = PEV.PROJ_ELEMENT_ID
1534             AND PPE.OBJECT_TYPE         = 'PA_ACTIONS'
1535             AND PEV.OBJECT_TYPE         = 'PA_ACTIONS';
1536 
1537 
1538 BEGIN
1539 
1540         OPEN l_dlvr_action_info_csr;
1541         FETCH l_dlvr_action_info_csr INTO x_name, x_number;
1542         CLOSE l_dlvr_action_info_csr;
1543 
1544 EXCEPTION
1545 
1546 WHEN OTHERS THEN
1547 
1548          Fnd_Msg_Pub.add_exc_msg
1549                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1550                         , p_procedure_name  => 'GET_ACTION_DETAIL'
1551                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1552 
1553          IF l_dlvr_action_info_csr%ISOPEN THEN
1554             CLOSE l_dlvr_action_info_csr;
1555          END IF;
1556 
1557          RAISE;
1558 
1559 END GET_ACTION_DETAIL;
1560 
1561 
1562 -- Procedure            : GET_PROJ_CURRENCY_CODE
1563 -- Type                 : UTILITY
1564 -- Purpose              : To retrieve Project Currency Code
1565 -- Note                 : Retrieve projfunc_currency_code from pa_projects_all
1566 --                      :
1567 -- Assumptions          : None
1568 
1569 -- Parameters                   Type     Required       Description and Purpose
1570 -- ---------------------------  ------   --------       --------------------------------------------------------
1571 -- p_dlvr_ver_id                NUMBER      Y           Deliverable Version Id
1572 
1573 
1574 FUNCTION GET_PROJ_CURRENCY_CODE
1575             (
1576                 p_dlvr_ver_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1577             )
1578         RETURN VARCHAR2
1579 IS
1580         x_proj_currency_code      PA_PROJECTS_ALL.PROJFUNC_CURRENCY_CODE%TYPE  := null;
1581 
1582 CURSOR l_proj_currency_code_csr
1583 IS
1584         SELECT
1585                PPA.PROJFUNC_CURRENCY_CODE
1586         FROM
1587                PA_PROJECTS_ALL PPA,
1588                PA_PROJ_ELEMENT_VERSIONS PEV
1589         WHERE
1590                     PEV.ELEMENT_VERSION_ID = p_dlvr_ver_id
1591                AND  PEV.PROJECT_ID = PPA.PROJECT_ID
1592                AND  PEV.OBJECT_TYPE = 'PA_DELIVERABLES';
1593 
1594 BEGIN
1595 
1596         OPEN l_proj_currency_code_csr;
1597         FETCH l_proj_currency_code_csr INTO x_proj_currency_code;
1598         CLOSE l_proj_currency_code_csr;
1599 
1600         return x_proj_currency_code;
1601 
1602 EXCEPTION
1603 
1604 WHEN OTHERS THEN
1605 
1606          Fnd_Msg_Pub.add_exc_msg
1607                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1608                         , p_procedure_name  => 'GET_PROJ_CURRENCY_CODE'
1609                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1610 
1611          RAISE;
1612 
1613 END GET_PROJ_CURRENCY_CODE;
1614 
1615 -- Procedure            : GET_DLVR_PROJECT_DETAIL
1616 -- Type                 : UTILITY
1617 -- Purpose              : To retrieve Project Id and name
1618 -- Note                 : Retrieve Project Id and Name from pa_projects_all
1619 --                      :
1620 -- Assumptions          : None
1621 
1622 -- Parameters                   Type     Required       Description and Purpose
1623 -- ---------------------------  ------   --------       --------------------------------------------------------
1624 -- p_dlvr_ver_id                NUMBER      Y           Delivearble Version Id
1625 -- x_project_id                 NUMBER                  Project Id
1626 -- x_project_name               VARCHAR2                Project Name
1627 
1628 
1629 PROCEDURE GET_DLVR_PROJECT_DETAIL
1630     (
1631           p_dlvr_ver_id       IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1632          ,x_project_id        OUT     NOCOPY PA_PROJ_ELEMENTS.PROJECT_ID%TYPE --File.Sql.39 bug 4440895
1633          ,x_project_name      OUT     NOCOPY PA_PROJECTS_ALL.NAME%TYPE --File.Sql.39 bug 4440895
1634     )
1635 IS
1636 
1637 CURSOR l_project_info_csr
1638 IS
1639         SELECT
1640                PPA.PROJECT_ID,
1641                PPA.NAME
1642         FROM
1643                PA_PROJECTS_ALL PPA,
1644                PA_PROJ_ELEMENT_VERSIONS PEV
1645         WHERE
1646                     PEV.ELEMENT_VERSION_ID  = p_dlvr_ver_id
1647                AND  PEV.PROJECT_ID          = PPA.PROJECT_ID
1648                AND  PEV.OBJECT_TYPE         = 'PA_DELIVERABLES';
1649 
1650 BEGIN
1651 
1652         OPEN l_project_info_csr;
1653         FETCH l_project_info_csr INTO x_project_id, x_project_name;
1654         CLOSE l_project_info_csr;
1655 
1656 EXCEPTION
1657 
1658 WHEN OTHERS THEN
1659 
1660          Fnd_Msg_Pub.add_exc_msg
1661                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1662                         , p_procedure_name  => 'GET_DLVR_PROJECT_DETAIL'
1663                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1664 
1665          IF l_project_info_csr%ISOPEN THEN
1666             CLOSE l_project_info_csr;
1667          END IF;
1668 
1669          RAISE;
1670 
1671 END GET_DLVR_PROJECT_DETAIL;
1672 
1673 
1674 -- Procedure            : GET_ACTION_PROJECT_DETAIL
1675 -- Type                 : UTILITY
1676 -- Purpose              : To retrieve Project Id and name
1677 -- Note                 : Retrieve Project Id and Name from pa_projects_all
1678 --                      :
1679 -- Assumptions          : None
1680 
1681 -- Parameters                   Type     Required       Description and Purpose
1682 -- ---------------------------  ------   --------       --------------------------------------------------------
1683 -- p_dlvr_action_ver_id         NUMBER      Y           Delivearble Action Version Id
1684 -- x_project_id                 NUMBER                  Project Id
1685 -- x_project_name               VARCHAR2                Project Name
1686 
1687 
1688 PROCEDURE GET_ACTION_PROJECT_DETAIL
1689     (
1690           p_dlvr_action_ver_id       IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1691          ,x_project_id               OUT     NOCOPY PA_PROJ_ELEMENTS.PROJECT_ID%TYPE --File.Sql.39 bug 4440895
1692          ,x_project_name             OUT     NOCOPY PA_PROJECTS_ALL.NAME%TYPE --File.Sql.39 bug 4440895
1693     )
1694 IS
1695 
1696 CURSOR l_project_info_csr
1697 IS
1698         SELECT
1699                PPA.PROJECT_ID,
1700                PPA.NAME
1701         FROM
1702                PA_PROJECTS_ALL PPA,
1703                PA_PROJ_ELEMENT_VERSIONS PEV
1704         WHERE
1705                     PEV.ELEMENT_VERSION_ID = p_dlvr_action_ver_id
1706                AND  PEV.PROJECT_ID = PPA.PROJECT_ID
1707                AND  PEV.OBJECT_TYPE = 'PA_ACTIONS';
1708 
1709 BEGIN
1710 
1711         OPEN l_project_info_csr;
1712         FETCH l_project_info_csr INTO x_project_id, x_project_name;
1713         CLOSE l_project_info_csr;
1714 
1715 EXCEPTION
1716 
1717 WHEN OTHERS THEN
1718 
1719          Fnd_Msg_Pub.add_exc_msg
1720                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1721                         , p_procedure_name  => 'GET_ACTION_PROJECT_DETAIL'
1722                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1723 
1724          IF l_project_info_csr%ISOPEN THEN
1725             CLOSE l_project_info_csr;
1726          END IF;
1727 
1728          RAISE;
1729 
1730 END GET_ACTION_PROJECT_DETAIL;
1731 
1732 
1733 -- Procedure            : GET_ACTION_TASK_DETAIL
1734 -- Type                 : UTILITY
1735 -- Purpose              : To retrieve Task  number
1736 -- Note                 : Retrieve Task Number
1737 --                      :
1738 -- Assumptions          : None
1739 
1740 -- Parameters                   Type     Required       Description and Purpose
1741 -- ---------------------------  ------   --------       --------------------------------------------------------
1742 -- p_task_id                    NUMBER                  Task Versioin Id
1743 
1744 
1745 FUNCTION GET_ACTION_TASK_DETAIL
1746     (
1747           p_task_id                  IN     PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1748     )   RETURN VARCHAR2
1749 IS
1750 
1751 l_task_number       VARCHAR2(340) ;
1752 
1753 CURSOR l_task_info_csr
1754 IS
1755         SELECT
1756                PPE. NAME||'('|| PPE.ELEMENT_NUMBER||')' NAME_NUMBER
1757         FROM
1758                PA_PROJ_ELEMENTS PPE
1759         WHERE PPE.PROJ_ELEMENT_ID    = p_task_id
1760               AND PPE.OBJECT_TYPE    = 'PA_TASKS';
1761 
1762 BEGIN
1763 
1764         OPEN l_task_info_csr;
1765         FETCH l_task_info_csr INTO l_task_number;
1766         CLOSE l_task_info_csr;
1767 
1768         return l_task_number;
1769 EXCEPTION
1770 
1771 WHEN OTHERS THEN
1772 
1773          IF l_task_info_csr%ISOPEN THEN
1774             CLOSE l_task_info_csr;
1775          END IF;
1776 
1777          Fnd_Msg_Pub.add_exc_msg
1778                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1779                         , p_procedure_name  => 'GET_ACTION_TASK_DETAIL'
1780                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1781 
1782          RAISE;
1783 
1784 END GET_ACTION_TASK_DETAIL;
1785 
1786 
1787 -- Procedure            : GET_DEFAULT_DLVR_OWNER
1788 -- Type                 : UTILITY
1789 -- Purpose              : To retrieve Default Deliverable Owner Id And Name
1790 -- Note                 :
1791 --                      :
1792 -- Assumptions          : None
1793 
1794 -- Parameters                   Type     Required       Description and Purpose
1795 -- ---------------------------  ------   --------       --------------------------------------------------------
1796 -- p_project_id                 NUMBER      Y           Project Id
1797 -- p_task_ver_id                NUMBER      Y           Task Version Id
1798 -- x_owner_id                   NUMBER                  Owner Id
1799 -- x_owner_name                 VARCHAR                 Owner Name
1800 
1801 PROCEDURE GET_DEFAULT_DLVR_OWNER
1802     (
1803          p_project_id                   IN      PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
1804         ,p_task_ver_id                  IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1805         ,x_owner_id                     OUT     NOCOPY PER_ALL_PEOPLE_F.PERSON_ID%TYPE --File.Sql.39 bug 4440895
1806         ,x_owner_name                   OUT     NOCOPY PER_ALL_PEOPLE_F.FULL_NAME%TYPE --File.Sql.39 bug 4440895
1807     )
1808 IS
1809 
1810 CURSOR l_owner_info_csr
1811 IS
1812         SELECT
1813                 PPF.PERSON_ID
1814                ,PPF.FULL_NAME
1815         FROM
1816                PA_PROJ_ELEMENTS PPE,
1817                PER_ALL_PEOPLE_F PPF,
1818                PA_PROJ_ELEMENT_VERSIONS PEV
1819         WHERE
1820                    PEV.ELEMENT_VERSION_ID   = p_task_ver_id
1821                AND PEV.OBJECT_TYPE          = 'PA_TASKS'
1822                AND PEV.PROJ_ELEMENT_ID   = PPE.PROJ_ELEMENT_ID
1823                AND PPE.OBJECT_TYPE          = 'PA_TASKS'
1824                AND PPE.MANAGER_PERSON_ID    = PPF.PERSON_ID
1825                AND PPE.PROJECT_ID            = p_project_id
1826                AND PEV.PROJECT_ID            = p_project_id
1827                AND SYSDATE BETWEEN PPF.EFFECTIVE_START_DATE AND PPF.EFFECTIVE_END_DATE;
1828 
1829 BEGIN
1830 
1831         IF p_task_ver_id IS NOT NULL THEN
1832             OPEN l_owner_info_csr;
1833             FETCH l_owner_info_csr INTO x_owner_id, x_owner_name;
1834             CLOSE l_owner_info_csr;
1835         ELSE
1836             x_owner_id      :=  PA_PROJECT_PARTIES_UTILS.GET_PROJECT_MANAGER
1837                                     (
1838                                         p_project_id    =>  p_project_id
1839                                     );
1840             x_owner_name    :=  PA_PROJECT_PARTIES_UTILS.GET_PROJECT_MANAGER_NAME
1841                                     (
1842                                         p_project_id    =>  p_project_id
1843                                     );
1844         END IF;
1845 EXCEPTION
1846 
1847 WHEN OTHERS THEN
1848 
1849          Fnd_Msg_Pub.add_exc_msg
1850                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1851                         , p_procedure_name  => 'GET_DEFAULT_DLVR_OWNER'
1852                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1853 
1854          IF l_owner_info_csr%ISOPEN THEN
1855             CLOSE l_owner_info_csr;
1856          END IF;
1857 
1858          RAISE;
1859 
1860 END GET_DEFAULT_DLVR_OWNER;
1861 
1862 
1863 -- Procedure            : GET_DEFAULT_DLVR_DATE
1864 -- Type                 : UTILITY
1865 -- Purpose              : To retrieve Default Deliverable Due Date
1866 -- Note                 :
1867 --                      :
1868 -- Assumptions          : None
1869 
1870 -- Parameters                   Type     Required       Description and Purpose
1871 -- ---------------------------  ------   --------       --------------------------------------------------------
1872 -- p_project_id                 NUMBER      Y           Project Id
1873 -- p_task_ver_                  NUMBER      Y           Task Version Id
1874 -- x_due_date                   DATE                    Dlvr Due Date
1875 
1876 PROCEDURE GET_DEFAULT_DLVR_DATE
1877     (
1878          p_project_id                   IN      PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
1879         ,p_task_ver_id                  IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1880         ,x_due_date                     OUT     NOCOPY DATE --File.Sql.39 bug 4440895
1881     )
1882 IS
1883 
1884 l_scheduled_finish_date                 DATE    := NULL;
1885 l_target_finish_date                    DATE    := NULL;
1886 l_completion_date                       DATE    := NULL;
1887 l_sysdate                               DATE    := NULL;
1888 
1889 CURSOR l_proj_date_info_csr
1890 IS
1891         SELECT
1892                SCHEDULED_FINISH_DATE,
1893                TARGET_FINISH_DATE,
1894                COMPLETION_DATE,
1895                SYSDATE
1896         FROM
1897                PA_PROJECTS_ALL
1898         WHERE
1899                PROJECT_ID = p_project_id;
1900 
1901 
1902 CURSOR l_task_date_info_csr
1903 IS
1904       SELECT
1905              PES.SCHEDULED_FINISH_DATE,
1906              SYSDATE
1907       FROM
1908               PA_PROJ_ELEMENT_VERSIONS  PEV
1909              ,PA_PROJ_ELEM_VER_SCHEDULE PES
1910       WHERE
1911                  PEV.ELEMENT_VERSION_ID = p_task_ver_id
1912              AND PEV.ELEMENT_VERSION_ID = PES.ELEMENT_VERSION_ID ;
1913 
1914             /* AND PEV.OBJECT_TYPE        = 'PA_TASKS'
1915              AND PES.PROJECT_ID         = p_project_id;Commented Unnecessary joins -
1916              This Query was flagged by xpl utility because of missing index PA_PROJ_ELEM_VER_SCHEDULE_U2 in ch2m  3614361 */
1917 
1918 BEGIN
1919 
1920         IF p_task_ver_id IS NOT NULL THEN
1921 
1922             OPEN l_task_date_info_csr;
1923             FETCH l_task_date_info_csr INTO l_scheduled_finish_date ,l_sysdate;
1924             CLOSE l_task_date_info_csr;
1925 
1926             IF l_scheduled_finish_date IS NOT NULL THEN
1927                 x_due_date  :=  l_scheduled_finish_date;
1928             ELSE
1929                 x_due_date  :=  l_sysdate;
1930             END IF;
1931 
1932         ELSE
1933 
1934             OPEN l_proj_date_info_csr;
1935             FETCH l_proj_date_info_csr INTO l_scheduled_finish_date, l_target_finish_date, l_completion_date, l_sysdate ;
1936             CLOSE l_proj_date_info_csr;
1937 
1938 
1939             IF l_scheduled_finish_date IS NOT NULL THEN
1940                 x_due_date  :=  l_scheduled_finish_date;
1941             ELSIF l_target_finish_date IS NOT NULL THEN
1942                 x_due_date  :=  l_target_finish_date;
1943             ELSIF l_completion_date IS NOT NULL THEN
1944                 x_due_date  :=  l_completion_date;
1945             ELSE
1946                 x_due_date  :=  l_sysdate;
1947             END IF;
1948 
1949         END IF;
1950 EXCEPTION
1951 
1952 WHEN OTHERS THEN
1953 
1954          Fnd_Msg_Pub.add_exc_msg
1955                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
1956                         , p_procedure_name  => 'GET_DEFAULT_DLVR_DATE'
1957                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
1958 
1959          IF l_proj_date_info_csr%ISOPEN THEN
1960             CLOSE l_proj_date_info_csr;
1961          END IF;
1962 
1963          IF l_task_date_info_csr%ISOPEN THEN
1964             CLOSE l_task_date_info_csr;
1965          END IF;
1966 
1967          RAISE;
1968 
1969 END GET_DEFAULT_DLVR_DATE;
1970 
1971 
1972 -- Procedure            : GET_DEFAULT_ACTION_OWNER
1973 -- Type                 : UTILITY
1974 -- Purpose              : To retrieve Default Deliverable Owner Id And Name
1975 -- Note                 :
1976 --                      :
1977 -- Assumptions          : None
1978 
1979 -- Parameters                   Type     Required       Description and Purpose
1980 -- ---------------------------  ------   --------       --------------------------------------------------------
1981 -- p_dlvr_verid                 NUMBER      Y           Deliverable Version Id
1982 -- x_owner_id                   NUMBER                  Owner Id
1983 -- x_owner_name                 VARCHAR                 Owner Name
1984 
1985 PROCEDURE GET_DEFAULT_ACTION_OWNER
1986     (
1987          p_dlvr_ver_id                  IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
1988         ,x_owner_id                     OUT     NOCOPY PER_ALL_PEOPLE_F.PERSON_ID%TYPE --File.Sql.39 bug 4440895
1989         ,x_owner_name                   OUT     NOCOPY PER_ALL_PEOPLE_F.FULL_NAME%TYPE --File.Sql.39 bug 4440895
1990     )
1991 IS
1992 
1993 CURSOR l_owner_info_csr
1994 IS
1995          SELECT
1996                  PPF.PERSON_ID
1997                 ,PPF.FULL_NAME
1998          FROM
1999                  PA_PROJ_ELEMENT_VERSIONS PEV
2000                 ,PA_PROJ_ELEMENTS PPE
2001                 ,PER_ALL_PEOPLE_F PPF
2002          WHERE
2003                     PEV.ELEMENT_VERSION_ID       = p_dlvr_ver_id
2004                 AND PPE.OBJECT_TYPE              = 'PA_DELIVERABLES'
2005                 AND PPE.PROJ_ELEMENT_ID          = PEV.PROJ_ELEMENT_ID
2006                 AND PEV.OBJECT_TYPE              = 'PA_DELIVERABLES'
2007                 AND PPE.MANAGER_PERSON_ID        = PPF.PERSON_ID
2008                 AND SYSDATE BETWEEN PPF.EFFECTIVE_START_DATE AND PPF.EFFECTIVE_END_DATE;
2009 
2010 BEGIN
2011 
2012          OPEN l_owner_info_csr;
2013          FETCH l_owner_info_csr INTO x_owner_id, x_owner_name;
2014          CLOSE l_owner_info_csr;
2015 
2016 EXCEPTION
2017 
2018 WHEN OTHERS THEN
2019 
2020          Fnd_Msg_Pub.add_exc_msg
2021                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
2022                         , p_procedure_name  => 'GET_DEFAULT_ACTION_OWNER'
2023                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
2024 
2025          IF l_owner_info_csr%ISOPEN THEN
2026             CLOSE l_owner_info_csr;
2027          END IF;
2028 
2029          RAISE;
2030 
2031 END GET_DEFAULT_ACTION_OWNER;
2032 
2033 
2034 -- Procedure            : GET_DEFAULT_ACTION_DATE
2035 -- Type                 : UTILITY
2036 -- Purpose              : To retrieve Default Deliverable Action Due Date
2037 -- Note                 :
2038 --                      :
2039 -- Assumptions          : None
2040 
2041 -- Parameters                   Type     Required       Description and Purpose
2042 -- ---------------------------  ------   --------       --------------------------------------------------------
2043 -- p_dlvr_ver_id                NUMBER      Y           Dlvr Ver Id
2044 -- p_task_ver_id                NUMBER      Y           Task Ver Id
2045 -- p_calling_mode               NUMBER      Y           Possible Values are 'TEMPLATE', 'PROJECT'
2046 -- x_due_date                   DATE                    Dlvr Due Date
2047 -- x_earliest_start_date        DATE                    Earliest Start Date
2048 -- x_earliest_finish_date       DATE                    Earliest Finish Date
2049 
2050 PROCEDURE GET_DEFAULT_ACTION_DATE
2051     (
2052          p_dlvr_ver_id                  IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2053         ,p_task_ver_id                  IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2054         ,p_project_mode                 IN      VARCHAR2
2055         ,p_function_code                IN      PA_PROJ_ELEMENTS.FUNCTION_CODE%TYPE
2056         ,x_due_date                     OUT     NOCOPY DATE --File.Sql.39 bug 4440895
2057     )
2058 IS
2059 
2060 l_scheduled_finish_date                 DATE    := NULL;
2061 l_task_scheduled_finish_date            DATE    := NULL;
2062 l_sysdate                               DATE    := NULL;
2063 l_earliest_start_date                   DATE    := NULL;
2064 l_earliest_finish_date                  DATE    := NULL;
2065 
2066 CURSOR l_proj_date_info_csr
2067 IS
2068       SELECT
2069              PES.SCHEDULED_FINISH_DATE,
2070              SYSDATE
2071       FROM
2072              PA_PROJ_ELEMENT_VERSIONS  PEV,
2073              PA_PROJ_ELEM_VER_SCHEDULE PES
2074       WHERE
2075                  PEV.ELEMENT_VERSION_ID = p_dlvr_ver_id
2076              AND PEV.ELEMENT_VERSION_ID = PES.ELEMENT_VERSION_ID ;
2077 
2078          /*  AND PEV.OBJECT_TYPE        = 'PA_DELIVERABLES'
2079          AND PEV.PROJECT_ID         = PES.PROJECT_ID;
2080             Commented Unwanted Joins - This query was flagged by xpl utility because of missing index
2081             PA_PROJ_ELEM_VER_SCHEDULE_U2 in ch2m database Bug  3614361 */
2082 
2083 CURSOR l_task_date_info_csr
2084 IS
2085       SELECT
2086               PES.EARLY_START_DATE
2087              ,PES.EARLY_FINISH_DATE
2088              ,PES.SCHEDULED_FINISH_DATE
2089       FROM
2090               PA_PROJ_ELEMENT_VERSIONS  PEV
2091              ,PA_PROJ_ELEM_VER_SCHEDULE PES
2092       WHERE
2093                  PEV.ELEMENT_VERSION_ID = p_task_ver_id
2094              AND PEV.ELEMENT_VERSION_ID = PES.ELEMENT_VERSION_ID ;
2095 
2096         /*     AND PEV.OBJECT_TYPE        = 'PA_TASKS'
2097          AND PEV.PROJECT_ID = PES.PROJECT_ID;
2098             Commented Unwanted Joins - This query was flagged by xpl utility because of missing index
2099             PA_PROJ_ELEM_VER_SCHEDULE_U2 in ch2m database Bug  3614361 */
2100 BEGIN
2101 
2102         OPEN l_proj_date_info_csr;
2103         FETCH l_proj_date_info_csr INTO l_scheduled_finish_date, l_sysdate;
2104         CLOSE l_proj_date_info_csr;
2105 
2106         IF p_task_ver_id IS NULL THEN
2107             IF l_scheduled_finish_date IS NOT NULL THEN
2108                 x_due_date  :=  l_scheduled_finish_date;
2109             ELSE
2110                 x_due_date  :=  l_sysdate;
2111             END IF;
2112         ELSE
2113             IF p_project_mode = 'TEMPLATE' THEN
2114                 IF l_scheduled_finish_date IS NOT NULL THEN
2115                     x_due_date  :=  l_scheduled_finish_date;
2116                 ELSE
2117                     x_due_date  :=  l_sysdate;
2118                 END IF;
2119             ELSE
2120                 OPEN l_task_date_info_csr;
2121                 FETCH l_task_date_info_csr INTO l_earliest_start_date, l_earliest_finish_date, l_task_scheduled_finish_date;
2122                 CLOSE l_task_date_info_csr;
2123 
2124                 IF p_function_code = 'PROCUREMENT' THEN
2125                         x_due_date :=  l_earliest_start_date;
2126                 ELSIF p_function_code = 'SHIPPING' THEN
2127                         x_due_date :=  l_earliest_finish_date;
2128                 ELSE
2129                     IF l_scheduled_finish_date IS NOT NULL THEN
2130                         x_due_date  :=  l_scheduled_finish_date;
2131                     ELSIF l_task_scheduled_finish_date IS NOT NULL THEN
2132                         x_due_date  :=  l_task_scheduled_finish_date;
2133                     ELSE
2134                         x_due_date  :=  l_sysdate;
2135                     END IF;
2136                 END IF;
2137 
2138                 IF p_function_code = 'PROCUREMENT' or p_function_code = 'SHIPPING' THEN
2139                     IF x_due_date IS NULL THEN
2140                         IF l_scheduled_finish_date IS NOT NULL THEN
2141                             x_due_date  :=  l_scheduled_finish_date;
2142                         ELSIF l_task_scheduled_finish_date IS NOT NULL THEN
2143                             x_due_date  :=  l_task_scheduled_finish_date;
2144                         ELSE
2145                             x_due_date  :=  l_sysdate;
2146                         END IF;
2147                     END IF;
2148                 END IF;
2149             END IF;
2150         END IF;
2151 EXCEPTION
2152 
2153 WHEN OTHERS THEN
2154 
2155          Fnd_Msg_Pub.add_exc_msg
2156                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
2157                         , p_procedure_name  => 'GET_DEFAULT_ACTION_DATE'
2158                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
2159 
2160          IF l_proj_date_info_csr%ISOPEN THEN
2161             CLOSE l_proj_date_info_csr;
2162          END IF;
2163 
2164          IF l_task_date_info_csr%ISOPEN THEN
2165             CLOSE l_task_date_info_csr;
2166          END IF;
2167 
2168          RAISE;
2169 
2170 END GET_DEFAULT_ACTION_DATE;
2171 
2172 -- API to check whether deliverable based association
2173 -- exists for Deliverable
2174 
2175 FUNCTION IS_DLV_BASED_ASSCN_EXISTS
2176      (
2177           p_dlv_element_id IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
2178          ,p_dlv_version_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE := NULL
2179      )
2180 RETURN VARCHAR2
2181 IS
2182 l_dummy VARCHAR2(1) := 'N' ;
2183 l_return_status VARCHAR2(1) := 'N' ;
2184 -- Bug: 3902158 - Changing Cursor query to avoid call to function PA_DELIVERABLE_UTILS.GET_PROGRESS_ROLLUP_METHOD
2185 /*CURSOR c_dlv_based_task_exists IS
2186 SELECT 'X'
2187 FROM DUAL
2188 WHERE EXISTS (SELECT 'X'
2189               FROM PA_OBJECT_RELATIONSHIPS obj,
2190                   PA_PROJ_ELEMENTS ppe
2191                    where ppe.proj_element_id = p_dlv_element_id
2192                     and ppe.object_type= 'PA_DELIVERABLES'
2193                     and obj.object_id_to2 = ppe.proj_element_id
2194                     and obj.object_type_from  = 'PA_TASKS'
2195                     and obj.object_type_to  = 'PA_DELIVERABLES' -- 3570283 removed extra spaces
2196                     and obj.relationship_subtype  = 'TASK_TO_DELIVERABLE'
2197                     and obj.relationship_type  = 'A'
2198                     and nvl(PA_DELIVERABLE_UTILS.GET_PROGRESS_ROLLUP_METHOD(obj.object_id_from2),'X') = 'DELIVERABLE'
2199                    ); */
2200 
2201 CURSOR c_dlv_based_task_exists IS
2202 SELECT 'X'
2203  FROM DUAL
2204  WHERE EXISTS (SELECT 'X'
2205                FROM PA_OBJECT_RELATIONSHIPS obj,
2206                 pa_proj_elements ppe,
2207             pa_task_types ptt
2208                where obj.object_id_to2 = p_dlv_element_id
2209                  and obj.object_type_from  = 'PA_TASKS'
2210                  and obj.object_type_to  = 'PA_DELIVERABLES'
2211                  and obj.relationship_subtype  = 'TASK_TO_DELIVERABLE'
2212                  and obj.relationship_type  = 'A'
2213                  and ppe.proj_element_id = obj.object_id_from2
2214                  and ppe.type_id=ptt.task_type_id
2215                  and nvl(ppe.base_percent_comp_deriv_code,ptt.base_percent_comp_deriv_code) =  'DELIVERABLE');
2216 
2217 
2218 BEGIN
2219      OPEN c_dlv_based_task_exists;
2220      FETCH c_dlv_based_task_exists into l_dummy ;
2221      IF c_dlv_based_task_exists%found THEN
2222        l_return_status:='Y';
2223      ELSE
2224        l_return_status:='N';
2225      END IF;
2226      CLOSE c_dlv_based_task_exists;
2227      return l_return_status;
2228 END IS_DLV_BASED_ASSCN_EXISTS ;
2229 
2230 -- This function will return 'Y' if there exists any action
2231 -- with ready to ship flag as 'Y'
2232 
2233 FUNCTION GET_READY_TO_SHIP_FLAG
2234      (
2235           p_dlv_element_id IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
2236           ,p_dlv_version_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2237      )   RETURN VARCHAR2
2238 IS
2239      CURSOR ship_flag_dlv IS
2240      SELECT 'Y'
2241        FROM dual
2242      WHERE EXISTS ( SELECT 'Y'
2243                       FROM  pa_object_relationships obj
2244                            ,pa_proj_element_versions ver
2245                       WHERE obj.object_id_from2 = p_dlv_element_id
2246                         AND obj.object_type_to = 'PA_ACTIONS'
2247                         AND obj.object_type_from = 'PA_DELIVERABLES'
2248                         AND obj.object_id_to2 = ver.proj_element_id
2249                         AND obj.relationship_type = 'A'
2250                         AND obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
2251                         AND nvl(OKE_DELIVERABLE_UTILS_PUB.Ready_To_Ship_Yn(ver.element_version_id),'N') = 'Y'
2252                   ) ;
2253 l_dummy VARCHAR2(1) := 'N' ;
2254 l_return_status VARCHAR2(1) := 'N' ;
2255 BEGIN
2256      OPEN ship_flag_dlv;
2257      FETCH ship_flag_dlv into l_dummy ;
2258      IF ship_flag_dlv%found THEN
2259        l_return_status:='Y';
2260      ELSE
2261        l_return_status:='N';
2262      END IF;
2263      CLOSE ship_flag_dlv;
2264 return l_return_status;
2265 END GET_READY_TO_SHIP_FLAG ;
2266 
2267 FUNCTION GET_READY_TO_PROC_FLAG
2268      (
2269           p_dlv_element_id IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
2270           ,p_dlv_version_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2271      )   RETURN VARCHAR2
2272 IS
2273      CURSOR proc_flag_dlv IS
2274      SELECT 'Y'
2275        FROM dual
2276      WHERE EXISTS ( SELECT 'Y'
2277                       FROM  pa_object_relationships obj
2278                            ,pa_proj_element_versions ver
2279                       WHERE obj.object_id_from2 = p_dlv_element_id
2280                         AND obj.object_type_to = 'PA_ACTIONS'
2281                         AND obj.object_type_from = 'PA_DELIVERABLES'
2282                         AND obj.object_id_to2 = ver.proj_element_id
2283                         AND obj.relationship_type = 'A'
2284                         AND obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
2285                         AND nvl(OKE_DELIVERABLE_UTILS_PUB.Ready_To_Procure_Yn(ver.element_version_id),'N') = 'Y'
2286                    ) ;
2287 l_dummy VARCHAR2(1) := 'N' ;
2288 l_return_status VARCHAR2(1) := 'N' ;
2289 BEGIN
2290      OPEN proc_flag_dlv;
2291      FETCH proc_flag_dlv into l_dummy ;
2292      IF proc_flag_dlv%found THEN
2293        l_return_status:='Y';
2294      ELSE
2295        l_return_status:='N';
2296      END IF;
2297      CLOSE proc_flag_dlv;
2298 return l_return_status;
2299 END GET_READY_TO_PROC_FLAG ;
2300 
2301 -- This API will return 'Y' if for a task if there exists any
2302 -- progress enabled deliverable .
2303 
2304 FUNCTION IS_PROG_ENABLED_DLV_EXISTS
2305      (
2306           p_proj_element_id IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
2307      )   RETURN VARCHAR2
2308 IS
2309      CURSOR c_prog_enabled_dlv_exists IS
2310      SELECT 'Y'
2311        FROM dual
2312      WHERE EXISTS ( SELECT 'Y'
2313                       FROM  pa_object_relationships obj
2314                            ,pa_proj_elements ppe
2315                            ,pa_task_types  ptt
2316                       WHERE obj.object_id_from2 = p_proj_element_id
2317                         AND obj.object_type_to = 'PA_DELIVERABLES'
2318                         AND obj.object_type_from = 'PA_TASKS'
2319                         AND obj.relationship_type = 'A'
2320                         AND obj.relationship_subtype = 'TASK_TO_DELIVERABLE'
2321                         AND obj.object_id_to2 = ppe.proj_element_id
2322                         AND ppe.object_type = 'PA_DELIVERABLES'
2323                         AND ptt.task_type_id = ppe.type_id
2324                         AND nvl(ptt.prog_entry_enable_flag ,'N') = 'Y'
2325                    ) ;
2326 l_dummy VARCHAR2(1) := 'N' ;
2327 l_return_status VARCHAR2(1) := 'N' ;
2328 BEGIN
2329      OPEN c_prog_enabled_dlv_exists;
2330      FETCH c_prog_enabled_dlv_exists into l_dummy ;
2331      IF c_prog_enabled_dlv_exists%found THEN
2332        l_return_status:='Y';
2333      ELSE
2334        l_return_status:='N';
2335      END IF;
2336      CLOSE c_prog_enabled_dlv_exists;
2337 return l_return_status;
2338 END IS_PROG_ENABLED_DLV_EXISTS;
2339 
2340 -- This API will return 'Y' is progress is enabled for deliverable
2341 
2342 FUNCTION IS_PROGRESS_ENABLED
2343      (
2344           p_proj_element_id IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
2345      )   RETURN VARCHAR2
2346 IS
2347      CURSOR c_is_prog_enabled_dlv IS
2348      SELECT 'Y'
2349        FROM pa_proj_elements ppe
2350            ,pa_task_types ptt
2351       WHERE ppe.proj_element_id = p_proj_element_id
2352        AND  ppe.object_type = 'PA_DELIVERABLES'
2353        AND  ptt.task_type_id = ppe.type_id
2354        AND  nvl(ptt.prog_entry_enable_flag,'N') = 'Y'
2355        AND  ptt.object_type = 'PA_DLVR_TYPES' ;
2356 
2357 l_dummy VARCHAR2(1) := 'N' ;
2358 l_return_status VARCHAR2(1) := 'N' ;
2359 
2360 BEGIN
2361      OPEN c_is_prog_enabled_dlv;
2362      FETCH c_is_prog_enabled_dlv into l_dummy ;
2363      IF c_is_prog_enabled_dlv%found THEN
2364        l_return_status:='Y';
2365      ELSE
2366        l_return_status:='N';
2367      END IF;
2368      CLOSE c_is_prog_enabled_dlv;
2369 return l_return_status;
2370 END IS_PROGRESS_ENABLED;
2371 
2372 -- Procedure            : GET_PROJECT_DETAILS
2373 -- Type                 : UTILITY
2374 -- Purpose              : To retrieve Project Currency Code and Organization Id
2375 -- Note                 :
2376 --                      :
2377 -- Assumptions          : None
2378 
2379 -- Parameters                   Type     Required       Description and Purpose
2380 -- ---------------------------  ------   --------       --------------------------------------------------------
2381 -- p_project_id                 NUMBER      Y           Project Id
2382 -- x_projfunc_currency_code     VARCHAR                 Project Currency Code
2383 -- x_org_id                     VARCHAR                 Organization Id
2384 
2385 PROCEDURE GET_PROJECT_DETAILS
2386     (
2387          p_project_id                   IN      PA_PROJECTS_ALL.PROJECT_ID%TYPE
2388         ,x_projfunc_currency_code       OUT     NOCOPY PA_PROJECTS_ALL.PROJFUNC_CURRENCY_CODE%TYPE --File.Sql.39 bug 4440895
2389         ,x_org_id                       OUT     NOCOPY PA_PLAN_RES_DEFAULTS.item_master_id%TYPE -- 3462360 changed type --File.Sql.39 bug 4440895
2390     )
2391 IS
2392 
2393 l_return_status     VARCHAR2(1) := 'S';
2394 l_msg_data          VARCHAR2(2000);
2395 l_msg_count         NUMBER;
2396 
2397 CURSOR l_project_detail_csr
2398 IS
2399         SELECT
2400                 P.PROJFUNC_CURRENCY_CODE
2401 --               ,P.ORG_ID              -- 3462360 removed org_id column
2402         FROM
2403                PA_PROJECTS_ALL P
2404         WHERE
2405                P.PROJECT_ID = p_project_id;
2406 
2407 BEGIN
2408 
2409          OPEN l_project_detail_csr;
2410          FETCH l_project_detail_csr INTO x_projfunc_currency_code;
2411          CLOSE l_project_detail_csr;
2412 
2413          -- 3462360 added procedure call to retrieve material_Class_id
2414 
2415          PA_RESOURCE_UTILS1.Return_Material_Class_Id
2416                                    (
2417                                          x_material_class_id     =>  x_org_id
2418                                         ,x_return_status         =>  l_return_status
2419                                         ,x_msg_data              =>  l_msg_data
2420                                         ,x_msg_count             =>  l_msg_count
2421                                    );
2422 
2423 EXCEPTION
2424 
2425 WHEN OTHERS THEN
2426 
2427          Fnd_Msg_Pub.add_exc_msg
2428                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
2429                         , p_procedure_name  => 'GET_PROJECT_DETAILS'
2430                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
2431 
2432          IF l_project_detail_csr%ISOPEN THEN
2433             CLOSE l_project_detail_csr;
2434          END IF;
2435 
2436          RAISE;
2437 
2438 END GET_PROJECT_DETAILS;
2439 
2440 FUNCTION GET_DLV_DESCRIPTION
2441      (
2442           p_action_ver_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2443      )   RETURN VARCHAR2
2444 IS
2445      CURSOR c_dlv_desc IS
2446      SELECT ppe.description
2447        FROM pa_proj_elements ppe
2448            ,pa_object_relationships obj
2449            ,pa_proj_element_versions pev
2450       WHERE pev.element_version_id = p_action_ver_id
2451        AND pev.object_type = 'PA_ACTIONS' /*Included this clause for Performance fix Bug # 3614361 */
2452        AND  pev.proj_element_id = obj.object_id_to2
2453        AND  obj.relationship_type = 'A'
2454        AND  obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
2455        AND  obj.object_type_from = 'PA_DELIVERABLES'
2456        AND  obj.object_type_to = 'PA_ACTIONS'
2457        AND  obj.object_id_from2 = ppe.proj_element_id
2458        AND  ppe.object_type = 'PA_DELIVERABLES' /*Included this clause for Performance fix Bug # 3614361 */
2459        ;
2460 
2461 l_dummy pa_proj_elements.description%TYPE;
2462 BEGIN
2463      OPEN c_dlv_desc;
2464      FETCH c_dlv_desc into l_dummy ;
2465      CLOSE c_dlv_desc;
2466      RETURN l_dummy ;
2467 END GET_DLV_DESCRIPTION;
2468 
2469 -- 3470061 oke needed this api which will take deliverable version id as in parameter
2470 -- and return deliverable description
2471 
2472 FUNCTION GET_DELIVERABLE_DESCRIPTION
2473      (
2474           p_deliverable_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2475      )   RETURN VARCHAR2
2476 IS
2477      CURSOR c_dlv_desc IS
2478      SELECT
2479         ppe.description
2480        FROM
2481         pa_proj_elements ppe
2482            ,pa_proj_element_versions pev
2483       WHERE
2484         pev.element_version_id =  p_deliverable_id
2485            AND  ppe.object_type        =  'PA_DELIVERABLES'
2486            AND  pev.object_type        =  'PA_DELIVERABLES'
2487        AND  ppe.proj_element_id    =  pev.proj_element_id
2488        AND  ppe.project_id         =  pev.project_id;
2489 
2490 l_dummy pa_proj_elements.description%TYPE;
2491 
2492 BEGIN
2493      OPEN c_dlv_desc;
2494      FETCH c_dlv_desc into l_dummy ;
2495      CLOSE c_dlv_desc;
2496      RETURN l_dummy ;
2497 
2498 END GET_DELIVERABLE_DESCRIPTION;
2499 
2500 -- 3470061
2501 
2502 FUNCTION IS_DLV_ITEM_BASED
2503      (
2504           p_action_ver_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2505      )   RETURN VARCHAR2
2506 IS
2507      CURSOR  c_is_dlv_item_based IS
2508       SELECT 'Y'
2509        FROM  dual
2510 WHERE EXISTS (SELECT 'Y'
2511                 FROM pa_proj_elements ppe
2512                     ,pa_object_relationships obj
2513                     ,pa_proj_element_versions pev
2514                     ,pa_task_types ptt
2515                 WHERE pev.element_version_id = p_action_ver_id
2516                   AND pev.proj_element_id = obj.object_id_to2
2517                   AND obj.relationship_type = 'A'
2518                   AND obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
2519                   AND obj.object_type_from = 'PA_DELIVERABLES'
2520                   AND obj.object_type_to = 'PA_ACTIONS'
2521                   AND obj.object_id_from2 = ppe.proj_element_id
2522                   AND ptt.task_type_id = ppe.type_id
2523                   AND ptt.task_type_class_code = 'ITEM'
2524              ) ;
2525 l_dummy VARCHAR2(1) := 'N' ;
2526 BEGIN
2527      OPEN c_is_dlv_item_based;
2528      FETCH c_is_dlv_item_based into l_dummy ;
2529      CLOSE c_is_dlv_item_based;
2530      RETURN l_dummy ;
2531 END IS_DLV_ITEM_BASED ;
2532 
2533 -- Procedure            : GET_DEFAULT_ACTN_DATE
2534 -- Type                 : UTILITY
2535 -- Purpose              : To retrieve Default Deliverable Due Date
2536 -- Note                 :
2537 --                      :
2538 -- Assumptions          : None
2539 
2540 -- Parameters                   Type     Required       Description and Purpose
2541 -- ---------------------------  ------   --------       --------------------------------------------------------
2542 -- p_dlvr_ver_id                NUMBER      Y           Dlvr Ver Id
2543 -- p_task_ver_id                NUMBER      Y           Task Ver Id
2544 -- p_project_mode               NUMBER      Y           Possible Values are 'TEMPLATE', 'PROJECT'
2545 -- x_due_date                   DATE                    Dlvr Due Date
2546 -- x_earliest_start_date        DATE                    Earliest Start Date
2547 -- x_earliest_finish_date       DATE                    Earliest Finish Date
2548 
2549 PROCEDURE GET_DEFAULT_ACTN_DATE
2550     (
2551          p_dlvr_ver_id                  IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2552         ,p_task_ver_id                  IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
2553         ,p_project_mode                 IN      VARCHAR2
2554         ,x_due_date                     OUT     NOCOPY DATE --File.Sql.39 bug 4440895
2555         ,x_earliest_start_date          OUT     NOCOPY DATE --File.Sql.39 bug 4440895
2556         ,x_earliest_finish_date         OUT     NOCOPY DATE --File.Sql.39 bug 4440895
2557     )
2558 IS
2559 
2560 l_scheduled_finish_date                 DATE    := NULL;
2561 l_task_scheduled_finish_date            DATE    := NULL;
2562 l_sysdate                               DATE    := NULL;
2563 
2564 CURSOR l_proj_date_info_csr
2565 IS
2566       SELECT
2567              PES.SCHEDULED_FINISH_DATE,
2568              SYSDATE
2569       FROM
2570              PA_PROJ_ELEMENT_VERSIONS  PEV,
2571              PA_PROJ_ELEM_VER_SCHEDULE PES
2572       WHERE
2573                  PEV.ELEMENT_VERSION_ID = p_dlvr_ver_id
2574              AND PEV.ELEMENT_VERSION_ID = PES.ELEMENT_VERSION_ID
2575              AND PEV.OBJECT_TYPE        = 'PA_DELIVERABLES'
2576              AND PEV.PROJECT_ID         = PES.PROJECT_ID;/* Including this additional clause for Performance Fix : Bug  3614361 */
2577 
2578 CURSOR l_task_date_info_csr
2579 IS
2580       SELECT
2581               PES.EARLY_START_DATE
2582              ,PES.EARLY_FINISH_DATE
2583              ,PES.SCHEDULED_FINISH_DATE
2584       FROM
2585               PA_PROJ_ELEMENT_VERSIONS  PEV
2586              ,PA_PROJ_ELEM_VER_SCHEDULE PES
2587       WHERE
2588                  PEV.ELEMENT_VERSION_ID = p_task_ver_id
2589              AND PEV.ELEMENT_VERSION_ID = PES.ELEMENT_VERSION_ID
2590              AND PEV.OBJECT_TYPE        = 'PA_TASKS'
2591              AND PEV.PROJECT_ID         = PES.PROJECT_ID;/* Including this additional clause for Performance Fix : Bug  3614361 */
2592 
2593 BEGIN
2594 
2595         OPEN l_proj_date_info_csr;
2596         FETCH l_proj_date_info_csr INTO l_scheduled_finish_date, l_sysdate;
2597         CLOSE l_proj_date_info_csr;
2598 
2599         IF p_task_ver_id IS NULL THEN
2600 
2601             IF l_scheduled_finish_date IS NOT NULL THEN
2602                 x_due_date  :=  l_scheduled_finish_date;
2603             ELSE
2604                 x_due_date  :=  l_sysdate;
2605             END IF;
2606 
2607             x_earliest_start_date       := NULL;
2608             x_earliest_finish_date      := NULL;
2609 
2610         ELSE
2611 
2612             IF p_project_mode = 'TEMPLATE' THEN
2613 
2614                 IF l_scheduled_finish_date IS NOT NULL THEN
2615                     x_due_date  :=  l_scheduled_finish_date;
2616                 ELSE
2617                     x_due_date  :=  l_sysdate;
2618                 END IF;
2619 
2620                 x_earliest_start_date       := NULL;
2621                 x_earliest_finish_date      := NULL;
2622 
2623             ELSE
2624 
2625                 OPEN l_task_date_info_csr;
2626                 FETCH l_task_date_info_csr INTO x_earliest_start_date, x_earliest_finish_date, l_task_scheduled_finish_date;
2627                 CLOSE l_task_date_info_csr;
2628 
2629                 IF l_scheduled_finish_date IS NOT NULL THEN
2630                     x_due_date  :=  l_scheduled_finish_date;
2631                 ELSIF l_task_scheduled_finish_date IS NOT NULL THEN
2632                     x_due_date  :=  l_task_scheduled_finish_date;
2633                 ELSE
2634                     x_due_date  :=  l_sysdate;
2635                 END IF;
2636 
2637             END IF;
2638 
2639         END IF;
2640 EXCEPTION
2641 
2642 WHEN OTHERS THEN
2643 
2644          Fnd_Msg_Pub.add_exc_msg
2645                        ( p_pkg_name        => 'PA_DELIVERABLE_UTILS'
2646                         , p_procedure_name  => 'GET_DEFAULT_ACTN_DATE'
2647                         , p_error_text      => SUBSTRB(SQLERRM,1,240));
2648 
2649          IF l_proj_date_info_csr%ISOPEN THEN
2650             CLOSE l_proj_date_info_csr;
2651          END IF;
2652 
2653          IF l_task_date_info_csr%ISOPEN THEN
2654             CLOSE l_task_date_info_csr;
2655          END IF;
2656 
2657          RAISE;
2658 
2659 END GET_DEFAULT_ACTN_DATE;
2660 
2661 PROCEDURE CHECK_DLVR_DISABLE_ALLOWED( p_api_version    IN NUMBER := 1.0
2662                                       ,p_calling_module IN VARCHAR2 := 'SELF_SERVICE'
2663                                       ,p_debug_mode     IN VARCHAR2 := 'N'
2664                                       ,p_project_id     IN PA_PROJ_ELEMENTS.PROJECT_ID%TYPE
2665                                       ,x_return_flag        OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2666                                       ,x_return_status      OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2667                                       ,x_msg_count          OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
2668                                       ,x_msg_data           OUT NOCOPY VARCHAR2 ) --File.Sql.39 bug 4440895
2669 IS
2670 
2671 /* Bug 3597178 This cursor is no more needed
2672    As we dont need to check for existence of association b/w deliverable and  deliverable based tasks for that project
2673 CURSOR cur_tsk_assoc IS
2674 SELECT 1 FROM dual
2675 WHERE EXISTS(
2676           SELECT ppe.proj_element_id DlvrElemId, ppev.element_version_id DlvrElemVerId
2677           FROM pa_proj_elements ppe,
2678                pa_proj_element_versions ppev
2679           WHERE ppe.proj_element_id = ppev.proj_element_id
2680             AND ppe.project_id = p_project_id
2681             AND ppev.project_id = p_project_id
2682             AND ppe.object_type = ppev.object_type
2683             AND ppe.object_type = 'PA_DELIVERABLES'
2684             AND 'Y' = PA_DELIVERABLE_UTILS.IS_DLV_BASED_ASSCN_EXISTS(ppe.proj_element_id,ppev.element_version_id)
2685             );
2686 */
2687 
2688 CURSOR cur_dlvr_progress IS
2689 SELECT 1 FROM dual
2690 WHERE EXISTS(
2691           SELECT 1
2692           FROM pa_proj_elements ppe
2693           WHERE ppe.project_id = p_project_id
2694             AND ppe.object_type = 'PA_DELIVERABLES'
2695             AND 'Y' = PA_DELIVERABLE_UTILS.IS_DELIVERABLE_HAS_PROGRESS(p_project_id,ppe.proj_element_id)
2696             );
2697 /* Commented the following SELECT statement for Performance Bug Fix 3614361 */
2698 /*
2699 SELECT 1 FROM dual
2700 WHERE EXISTS(
2701           SELECT ppe.proj_element_id DlvrElemId, ppev.element_version_id DlvrElemVerId
2702           FROM pa_proj_elements ppe,
2703                pa_proj_element_versions ppev
2704           WHERE ppe.project_id = p_project_id
2705             AND ppe.object_type = 'PA_DELIVERABLES'
2706             AND 'Y' = PA_DELIVERABLE_UTILS.IS_DELIVERABLE_HAS_PROGRESS(p_project_id,ppe.proj_element_id)
2707             );
2708 */
2709 
2710 CURSOR cur_ship_or_proc IS
2711 SELECT 1 FROM dual
2712 WHERE EXISTS(
2713           SELECT ppe.proj_element_id DlvrElemId, ppev.element_version_id DlvrElemVerId
2714           FROM pa_proj_elements ppe,
2715                pa_proj_element_versions ppev
2716           WHERE ppe.proj_element_id = ppev.proj_element_id
2717             AND ppe.project_id = p_project_id
2718             AND ppev.project_id = p_project_id
2719             AND ppe.object_type = ppev.object_type
2720             AND ppe.object_type = 'PA_ACTIONS'
2721             AND ( 'Y' = PA_DELIVERABLE_UTILS.GET_READY_TO_SHIP_FLAG(ppe.proj_element_id,ppev.element_version_id)
2722                OR 'Y' = PA_DELIVERABLE_UTILS.GET_READY_TO_PROC_FLAG(ppe.proj_element_id,ppev.element_version_id) )
2723             );
2724 
2725 CURSOR cur_billing_fn IS
2726 SELECT 1 FROM dual
2727 WHERE EXISTS(
2728           SELECT 1
2729           FROM pa_proj_elements ppe
2730           WHERE ppe.project_id = p_project_id
2731             AND ppe.object_type = 'PA_ACTIONS'
2732             AND PA_DELIVERABLE_UTILS.GET_FUNCTION_CODE(ppe.proj_element_id) = 'BILLING'
2733             AND 'Y' = PA_Billing_Wrkbnch_Events.CHECK_BILLING_EVENT_EXISTS(p_project_id,ppe.proj_element_id)
2734             );
2735 
2736 l_debug_mode   VARCHAR2(1);
2737 l_debug_level2 CONSTANT NUMBER := 2;
2738 l_debug_level3 CONSTANT NUMBER := 3;
2739 l_debug_level4 CONSTANT NUMBER := 4;
2740 l_debug_level5 CONSTANT NUMBER := 5;
2741 
2742 l_dummy NUMBER;
2743 
2744 BEGIN
2745 
2746      x_return_flag := null;
2747      x_return_status := FND_API.G_RET_STS_SUCCESS;
2748      x_msg_count   := 0;
2749      l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
2750 
2751      IF l_debug_mode = 'Y' THEN
2752           PA_DEBUG.set_curr_function( p_function   => 'PA_DELIVERABLE_UTILS : CHECK_DLVR_DISABLE_ALLOWED',
2753                                       p_debug_mode => l_debug_mode );
2754      END IF;
2755 
2756      IF l_debug_mode = 'Y' THEN
2757           Pa_Debug.g_err_stage:= 'PA_DELIVERABLE_UTILS : CHECK_DLVR_DISABLE_ALLOWED : Printing Input parameters';
2758           Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
2759                                      l_debug_level3);
2760           Pa_Debug.WRITE(g_module_name,'p_project_id'||':'||p_project_id,
2761                                      l_debug_level3);
2762      END IF;
2763 
2764      IF 'N' = PA_PROJECT_STRUCTURE_UTILS.CHECK_DELIVERABLE_ENABLED(p_project_id) THEN
2765           x_return_flag := 'Y';
2766      ELSE
2767 
2768           /*  Bug 3597178 This check is not needed
2769           OPEN cur_tsk_assoc;
2770           FETCH cur_tsk_assoc INTO l_dummy;
2771           IF cur_tsk_assoc%FOUND THEN
2772                x_return_flag := 'N';
2773                x_return_status := FND_API.G_RET_STS_ERROR;
2774                PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2775                                      p_msg_name       => 'PA_DLV_TASK_ASSN_EXISTS' );
2776                CLOSE cur_tsk_assoc;
2777                return;
2778           ELSE
2779                CLOSE cur_tsk_assoc;
2780           END IF;
2781            End of Changes for Bug 3597178    */
2782 
2783           OPEN cur_dlvr_progress;
2784           FETCH cur_dlvr_progress INTO l_dummy;
2785           IF cur_dlvr_progress%FOUND THEN
2786                x_return_flag := 'N';
2787                x_return_status := FND_API.G_RET_STS_ERROR;
2788                PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2789                                      p_msg_name       => 'PA_DLV_HAS_PROGRESS' );
2790                CLOSE cur_dlvr_progress;
2791                return;
2792           ELSE
2793                CLOSE cur_dlvr_progress;
2794           END IF;
2795 
2796           OPEN cur_ship_or_proc;
2797           FETCH cur_ship_or_proc INTO l_dummy;
2798           IF cur_ship_or_proc%FOUND THEN
2799                x_return_flag := 'N';
2800                x_return_status := FND_API.G_RET_STS_ERROR;
2801                PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2802                                      p_msg_name       => 'PA_DLV_ACTION_TXN_EXISTS' );
2803                CLOSE cur_ship_or_proc;
2804                return;
2805           ELSE
2806                CLOSE cur_ship_or_proc;
2807           END IF;
2808 
2809           OPEN cur_billing_fn;
2810           FETCH cur_billing_fn INTO l_dummy;
2811           IF cur_billing_fn%FOUND THEN
2812                x_return_flag := 'N';
2813                x_return_status := FND_API.G_RET_STS_ERROR;
2814                PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2815                                      p_msg_name       => 'PA_DLV_ACTION_TXN_EXISTS' );
2816                CLOSE cur_billing_fn;
2817                return;
2818           ELSE
2819                CLOSE cur_billing_fn;
2820           END IF;
2821 
2822 --          x_return_flag := 'W';
2823 --          x_return_status := FND_API.G_RET_STS_ERROR;
2824 --          PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2825 --                                p_msg_name       => 'PA_DLV_DEFINED' );
2826           return;
2827      END IF;
2828 
2829      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
2830        pa_debug.reset_curr_function;
2831      END IF ;
2832 
2833 EXCEPTION
2834 WHEN OTHERS THEN
2835      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2836      x_msg_count     := 1;
2837      x_msg_data      := SQLERRM;
2838 
2839      IF cur_dlvr_progress%ISOPEN THEN
2840           CLOSE cur_dlvr_progress;
2841      END IF;
2842      IF cur_ship_or_proc%ISOPEN THEN
2843           CLOSE cur_ship_or_proc;
2844      END IF;
2845 
2846      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
2847        pa_debug.reset_curr_function;
2848      END IF ;
2849 
2850      Fnd_Msg_Pub.add_exc_msg
2851                        (  p_pkg_name        => 'PA_DELIVERABLE_UTILS'
2852                         , p_procedure_name  => 'CHECK_DLVR_DISABLE_ALLOWED'
2853                         , p_error_text      => x_msg_data );
2854      RAISE;
2855 END CHECK_DLVR_DISABLE_ALLOWED;
2856 
2857 
2858 
2859 
2860 
2861 PROCEDURE UPDATE_TSK_STATUS_CANCELLED( p_api_version    IN  NUMBER := 1.0
2862                                       ,p_calling_module IN  VARCHAR2 := 'SELF_SERVICE'
2863                                       ,p_debug_mode     IN  VARCHAR2 := 'N'
2864                                       ,p_task_id        IN  NUMBER
2865                                       ,p_status_code    IN  PA_PROJECT_STATUSES.PROJECT_STATUS_CODE%TYPE
2866                                       ,x_return_status  OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2867                                       ,x_msg_count      OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
2868                                       ,x_msg_data       OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2869                                       )
2870 IS
2871 
2872 CURSOR cur_check_cancel_possible IS
2873 SELECT 1 FROM dual
2874 WHERE EXISTS(
2875               SELECT 1
2876               FROM pa_proj_elements ppe,
2877                    pa_proj_element_versions ppv,
2878                    pa_object_relationships obj1,
2879                    pa_object_relationships obj2
2880               WHERE ppe.proj_element_id=p_task_id
2881                 AND ppe.object_type='PA_TASKS'
2882                 AND obj1.relationship_type='A'
2883               AND obj1.relationship_subtype='TASK_TO_DELIVERABLE'
2884               AND obj1.object_id_from2=p_task_id
2885               AND obj1.object_type_from='PA_TASKS'
2886               AND obj1.object_type_to='PA_DELIVERABLES'
2887                 AND obj2.relationship_type='A'
2888               AND obj2.relationship_subtype='DELIVERABLE_TO_ACTION'
2889               AND obj2.object_id_from2=obj1.object_id_to2
2890               AND obj2.object_type_from='PA_DELIVERABLES'
2891               AND obj2.object_type_to='PA_ACTIONS'
2892               AND ppv.proj_element_id=obj2.object_id_to2
2893                 AND ppv.object_type='PA_ACTIONS'
2894               AND (    nvl(OKE_DELIVERABLE_UTILS_PUB.WSH_Initiated_Yn(ppv.element_version_id),'N') = 'Y'
2895                       OR nvl(OKE_DELIVERABLE_UTILS_PUB.REQ_Initiated_Yn(ppv.element_version_id),'N') = 'Y'
2896                       OR PA_DELIVERABLE_UTILS.GET_FUNCTION_CODE(obj2.object_id_to2) = 'BILLING'  )
2897              );
2898 CURSOR cur_get_assoc_dlvr IS
2899 SELECT proj_element_id
2900 FROM pa_proj_elements ppe,
2901      pa_object_relationships obj
2902 WHERE obj.relationship_type='A'
2903   AND obj.relationship_subtype='TASK_TO_DELIVERABLE'
2904   AND obj.object_id_from2=p_task_id
2905   AND obj.object_type_from='PA_TASKS'
2906   AND obj.object_type_to='PA_DELIVERABLES'
2907   AND ppe.proj_element_id = obj.object_id_to2
2908   AND ppe.object_type = 'PA_DELIVERABLES';
2909 
2910 l_debug_mode   VARCHAR2(1);
2911 l_debug_level2 CONSTANT NUMBER := 2;
2912 l_debug_level3 CONSTANT NUMBER := 3;
2913 l_debug_level4 CONSTANT NUMBER := 4;
2914 l_debug_level5 CONSTANT NUMBER := 5;
2915 
2916 l_system_code PA_PROJECT_STATUSES.PROJECT_SYSTEM_STATUS_CODE%TYPE;
2917 l_dummy NUMBER;
2918 BEGIN
2919      x_return_status := FND_API.G_RET_STS_SUCCESS;
2920      x_msg_count   := 0;
2921      l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
2922 
2923      IF l_debug_mode = 'Y' THEN
2924           PA_DEBUG.set_curr_function( p_function   => 'PA_DELIVERABLE_UTILS : UPDATE_TSK_STATUS_CANCELLED',
2925                                       p_debug_mode => l_debug_mode );
2926      END IF;
2927      IF l_debug_mode = 'Y' THEN
2928           Pa_Debug.g_err_stage:= 'PA_DELIVERABLE_UTILS : UPDATE_TSK_STATUS_CANCELLED : Printing Input parameters';
2929           Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
2930                                      l_debug_level3);
2931           Pa_Debug.WRITE(g_module_name,'p_task_id'||':'||p_task_id,
2932                                      l_debug_level3);
2933           Pa_Debug.WRITE(g_module_name,'p_status_code'||':'||p_status_code,
2934                                      l_debug_level3);
2935      END IF;
2936 
2937      SELECT distinct PROJECT_SYSTEM_STATUS_CODE INTO l_system_code
2938      FROM pa_project_statuses
2939      WHERE STATUS_TYPE='TASK'
2940        AND PROJECT_STATUS_CODE=p_status_code;
2941 
2942      IF  'DELIVERABLE' <> PA_DELIVERABLE_UTILS.GET_PROGRESS_ROLLUP_METHOD(p_task_id)
2943      OR (l_system_code <> 'CANCELLED' AND l_system_code <> 'ON_HOLD') THEN
2944           return;
2945      ELSIF l_system_code = 'CANCELLED' THEN
2946           OPEN cur_check_cancel_possible;
2947           FETCH cur_check_cancel_possible INTO l_dummy;
2948           IF cur_check_cancel_possible%FOUND THEN
2949                x_return_status := FND_API.G_RET_STS_ERROR;
2950                PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2951                                      p_msg_name       => 'PA_TSK_DEL_TXN_EXISTS' );
2952                CLOSE cur_check_cancel_possible;
2953                return;
2954           ELSE
2955                CLOSE cur_check_cancel_possible;
2956           END IF;
2957      END IF;
2958      FOR assoc_dlvr_rec IN cur_get_assoc_dlvr LOOP
2959           UPDATE pa_proj_elements
2960           SET status_code = p_status_code
2961           WHERE proj_element_id = assoc_dlvr_rec.proj_element_id;
2962      END LOOP;
2963 
2964      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
2965        pa_debug.reset_curr_function;
2966      END IF ;
2967 
2968 EXCEPTION
2969 WHEN OTHERS THEN
2970      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2971      x_msg_count     := 1;
2972      x_msg_data      := SQLERRM;
2973 
2974      IF cur_check_cancel_possible%ISOPEN THEN
2975           CLOSE cur_check_cancel_possible;
2976      END IF;
2977      IF cur_get_assoc_dlvr%ISOPEN THEN
2978           CLOSE cur_get_assoc_dlvr;
2979      END IF;
2980 
2981      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
2982        pa_debug.reset_curr_function;
2983      END IF ;
2984 
2985      Fnd_Msg_Pub.add_exc_msg
2986                        (  p_pkg_name        => 'PA_DELIVERABLE_UTILS'
2987                         , p_procedure_name  => 'UPDATE_TSK_STATUS_CANCELLED'
2988                         , p_error_text      => x_msg_data );
2989      RAISE;
2990 END UPDATE_TSK_STATUS_CANCELLED;
2991 
2992 
2993 
2994 
2995 
2996 PROCEDURE CHECK_CHANGE_MAPPING_OK( p_api_version    IN  NUMBER := 1.0
2997                                   ,p_calling_module IN  VARCHAR2 := 'SELF_SERVICE'
2998                                   ,p_debug_mode     IN  VARCHAR2 := 'N'
2999                                   ,p_wp_task_version_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
3000                                   ,p_fp_task_verison_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
3001                                   ,x_return_status  OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3002                                   ,x_msg_count      OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
3003                                   ,x_msg_data       OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3004                                   )
3005 IS
3006 CURSOR cur_check_transaction_init IS
3007 SELECT 1 FROM dual
3008 WHERE EXISTS(
3009               SELECT 1
3010               FROM pa_proj_elements ppe,
3011                    pa_proj_element_versions ppv,
3012                    pa_object_relationships obj1,
3013                    pa_object_relationships obj2
3014               WHERE ppe.proj_element_id=p_wp_task_version_id
3015                 AND ppe.object_type='PA_TASKS'
3016                 AND obj1.relationship_type='A'
3017               AND obj1.relationship_subtype='TASK_TO_DELIVERABLE'
3018               AND obj1.object_id_from2=ppe.proj_element_id
3019               AND obj1.object_type_from='PA_TASKS'
3020               AND obj1.object_type_to='PA_DELIVERABLES'
3021                 AND obj2.relationship_type='A'
3022               AND obj2.relationship_subtype='DELIVERABLE_TO_ACTION'
3023               AND obj2.object_id_from2=obj1.object_id_to2
3024               AND obj2.object_type_from='PA_DELIVERABLES'
3025               AND obj2.object_type_to='PA_ACTIONS'
3026               AND ppv.proj_element_id=obj2.object_id_to2
3027                 AND ppv.object_type='PA_ACTIONS'
3028               AND (    nvl(OKE_DELIVERABLE_UTILS_PUB.WSH_Initiated_Yn(ppv.element_version_id),'N') = 'Y'
3029                       OR nvl(OKE_DELIVERABLE_UTILS_PUB.REQ_Initiated_Yn(ppv.element_version_id),'N') = 'Y'
3030                       OR nvl(OKE_DELIVERABLE_UTILS_PUB.MDS_Initiated_Yn(ppv.element_version_id),'N') = 'Y'
3031                       OR PA_DELIVERABLE_UTILS.GET_FUNCTION_CODE(obj2.object_id_to2) = 'BILLING'  )
3032              );
3033 
3034 l_debug_mode   VARCHAR2(1);
3035 l_debug_level2 CONSTANT NUMBER := 2;
3036 l_debug_level3 CONSTANT NUMBER := 3;
3037 l_debug_level4 CONSTANT NUMBER := 4;
3038 l_debug_level5 CONSTANT NUMBER := 5;
3039 
3040 l_dummy NUMBER;
3041 BEGIN
3042      x_return_status := FND_API.G_RET_STS_SUCCESS;
3043      x_msg_count   := 0;
3044      l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
3045 
3046      IF l_debug_mode = 'Y' THEN
3047           PA_DEBUG.set_curr_function( p_function   => 'PA_DELIVERABLE_UTILS : CHECK_CHANGE_MAPPING_OK',
3048                                       p_debug_mode => l_debug_mode );
3049      END IF;
3050 
3051      IF l_debug_mode = 'Y' THEN
3052           Pa_Debug.g_err_stage := 'PA_DELIVERABLE_UTILS : CHECK_CHANGE_MAPPING_OK : Printing Input parameters';
3053           Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
3054                                      l_debug_level3);
3055           Pa_Debug.WRITE(g_module_name,'p_wp_task_version_id'||':'||p_wp_task_version_id,
3056                                      l_debug_level3);
3057           Pa_Debug.WRITE(g_module_name,'p_fp_task_verison_id'||':'||p_fp_task_verison_id,
3058                                      l_debug_level3);
3059      END IF;
3060 
3061      OPEN cur_check_transaction_init;
3062      FETCH cur_check_transaction_init INTO l_dummy;
3063      IF cur_check_transaction_init%FOUND THEN
3064           x_return_status := FND_API.G_RET_STS_ERROR;
3065           PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
3066                                 p_msg_name       => 'PA_PS_WP_MAPPING_TXN_EXISTS' );
3067      END IF;
3068      CLOSE cur_check_transaction_init;
3069 
3070      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
3071        pa_debug.reset_curr_function;
3072      END IF ;
3073 
3074 EXCEPTION
3075 WHEN OTHERS THEN
3076      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3077      x_msg_count     := 1;
3078      x_msg_data      := SQLERRM;
3079 
3080      IF cur_check_transaction_init%ISOPEN THEN
3081           CLOSE cur_check_transaction_init;
3082      END IF;
3083      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
3084        pa_debug.reset_curr_function;
3085      END IF ;
3086      Fnd_Msg_Pub.add_exc_msg
3087                        (  p_pkg_name        => 'PA_DELIVERABLE_UTILS'
3088                         , p_procedure_name  => 'CHECK_DLVR_DISABLE_ALLOWED'
3089                         , p_error_text      => x_msg_data );
3090      RAISE;
3091 END CHECK_CHANGE_MAPPING_OK;
3092 
3093 
3094 -- Bug 3957706 < Start >
3095 -- This API is called from the following places :-
3096 -- 1) PA_TASK_PVT1.Update_Task API
3097 --    In this Context,
3098 --    p_task_id          - The Task's Proj Element ID
3099 --    p_prog_method_code - New Progress Method Code for the Task
3100 
3101 PROCEDURE CHECK_PROGRESS_MTH_CODE_VALID( p_api_version    IN  NUMBER := 1.0
3102                                         ,p_calling_module IN  VARCHAR2 := 'SELF_SERVICE'
3103                                         ,p_debug_mode     IN  VARCHAR2 := 'N'
3104                                         ,p_task_id        IN  PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
3105                                         ,p_prog_method_code IN PA_PROJ_ELEMENTS.BASE_PERCENT_COMP_DERIV_CODE%TYPE
3106                                         ,x_return_status      OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3107                                         ,x_msg_count          OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
3108                                         ,x_msg_data           OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3109                                         )
3110 IS
3111 /* Commented this Cursor as It is not used anywhere
3112 CURSOR cur_assoc_dlvr_has_prog IS
3113 SELECT 1 FROM dual
3114 WHERE EXISTS(
3115                SELECT ppe.proj_element_id
3116                FROM pa_proj_elements ppe,
3117                     pa_object_relationships obj
3118                WHERE obj.relationship_type='A'
3119                  AND obj.relationship_subtype='TASK_TO_DELIVERABLE'
3120                  AND obj.object_id_from2=p_task_id
3121                  AND obj.object_type_from='PA_TASKS'
3122                  AND obj.object_type_to='PA_DELIVERABLES'
3123                  AND ppe.proj_element_id = obj.object_id_to2
3124                  AND 'Y' = PA_DELIVERABLE_UTILS.IS_DELIVERABLE_HAS_PROGRESS(ppe.project_id,ppe.proj_element_id)
3125              );
3126 */
3127 
3128 CURSOR cur_dlvr_assoc_exists IS
3129 SELECT 1 FROM dual
3130 WHERE EXISTS(
3131               SELECT 1
3132               FROM pa_proj_elements ppe,
3133                    pa_object_relationships obj,
3134                    pa_proj_element_versions ppev
3135               WHERE ppe.proj_element_id=p_task_id
3136                 AND ppe.object_type='PA_TASKS'
3137                 AND obj.relationship_type='A'
3138               AND obj.relationship_subtype='TASK_TO_DELIVERABLE'
3139               AND obj.object_id_from2=ppe.proj_element_id
3140               AND obj.object_type_from='PA_TASKS'
3141               AND obj.object_type_to='PA_DELIVERABLES'
3142                 AND ppev.proj_element_id = obj.object_id_to2
3143                 AND ppev.project_id = ppe.project_id
3144                /*This AND Clause is Wrong as the 1st param passed is the Task ID whereas IS_DLV_BASED_ASSCN_EXISTS API
3145                  expects the 1st param as the Deliverable's Proj Element ID
3146                 AND 'Y' = PA_DELIVERABLE_UTILS.IS_DLV_BASED_ASSCN_EXISTS(ppe.proj_element_id,
3147                                                                          ppev.element_version_id)
3148                So,Included the new AND CLause as below */
3149                 AND 'Y' =  PA_DELIVERABLE_UTILS.IS_DLV_BASED_ASSCN_EXISTS(ppev.proj_element_id ,
3150                                                                           ppev.element_version_id)
3151              );
3152 
3153 l_dummy NUMBER;
3154 
3155 BEGIN
3156      x_return_status := FND_API.G_RET_STS_SUCCESS;
3157      x_msg_count   := 0;
3158 
3159 /*   Commented this code because we dont need this code
3160      In the Context ,this API is used .
3161      IF  'DELIVERABLE' = PA_DELIVERABLE_UTILS.GET_PROGRESS_ROLLUP_METHOD(p_task_id)
3162      AND 'DELIVERABLE' <> p_prog_method_code THEN
3163           OPEN cur_assoc_dlvr_has_prog;
3164           FETCH cur_assoc_dlvr_has_prog INTO l_dummy;
3165           IF cur_assoc_dlvr_has_prog%FOUND THEN
3166                x_return_status := FND_API.G_RET_STS_ERROR;
3167                PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
3168                                      p_msg_name       => 'PA_TSK_PROGRESS_LOSE_WARN' );
3169                CLOSE cur_assoc_dlvr_has_prog;
3170                return;
3171           ELSIF */
3172 
3173             --nvl check needed in following if Clause as NULL Value also can be returned
3174             IF 'DELIVERABLE' <> nvl(PA_DELIVERABLE_UTILS.GET_PROGRESS_ROLLUP_METHOD(p_task_id),'X')
3175             AND 'DELIVERABLE' = p_prog_method_code THEN
3176 
3177                OPEN cur_dlvr_assoc_exists;
3178                FETCH cur_dlvr_assoc_exists INTO l_dummy;
3179                CLOSE cur_dlvr_assoc_exists;
3180 
3181                IF nvl(l_dummy,0)=1 THEN
3182                     x_return_status := FND_API.G_RET_STS_ERROR;
3183                     PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
3184                                           p_msg_name       => 'PA_TSK_PROGRESS_MTH_ERR' );
3185                    /* CLOSE cur_assoc_dlvr_has_prog; Commented as Cursor not used*/
3186                END IF;
3187 
3188             END IF;
3189 
3190 /*          CLOSE cur_assoc_dlvr_has_prog;
3191 
3192      END IF; Commented as this cursor not used anymore */
3193 
3194 EXCEPTION
3195 WHEN OTHERS THEN
3196      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3197      x_msg_count     := 1;
3198      x_msg_data      := SQLERRM;
3199 
3200 /*     IF cur_assoc_dlvr_has_prog%ISOPEN THEN
3201           CLOSE cur_assoc_dlvr_has_prog;
3202      END IF;
3203 Commented as cursor not used */
3204 --Bug 3957706 < End >
3205 
3206      IF cur_dlvr_assoc_exists%ISOPEN THEN
3207           CLOSE cur_dlvr_assoc_exists;
3208      END IF;
3209 
3210      Fnd_Msg_Pub.add_exc_msg
3211                        (  p_pkg_name        => 'PA_DELIVERABLE_UTILS'
3212                         , p_procedure_name  => 'CHECK_PROGRESS_MTH_CODE_VALID'
3213                         , p_error_text      => x_msg_data );
3214      RAISE;
3215 END CHECK_PROGRESS_MTH_CODE_VALID;
3216 
3217 
3218 
3219 
3220 
3221 FUNCTION CHECK_PROJ_DLV_TXN_EXISTS( p_api_version    IN  NUMBER := 1.0
3222                                    ,p_calling_module IN  VARCHAR2 := 'SELF_SERVICE'
3223                                    ,p_debug_mode     IN  VARCHAR2 := 'N'
3224                                    ,p_project_id     IN PA_PROJ_ELEMENTS.PROJECT_ID%TYPE
3225                                    ,x_return_status      OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3226                                    ,x_msg_count          OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
3227                                    ,x_msg_data           OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3228                                    )
3229 RETURN VARCHAR2 IS
3230 
3231 CURSOR cur_proj_txn_exists IS
3232 SELECT 'Y' FROM dual
3233 WHERE EXISTS(
3234              SELECT 1
3235              FROM pa_proj_elements ppe,
3236                   pa_proj_elements ppe2,
3237                   pa_proj_element_versions ppev,
3238                   pa_object_relationships obj1,
3239                   pa_object_relationships obj2
3240              WHERE ppe.project_id  = p_project_id
3241               AND  ppe.object_type = 'PA_ACTIONS'
3242               AND  ppev.project_id = p_project_id
3243               AND  ppe.proj_element_id = ppev.proj_element_id
3244               AND  obj1.object_id_to2 = ppe.proj_element_id
3245               AND  obj1.relationship_type ='A'
3246               AND  obj1.relationship_subtype = 'DELIVERABLE_TO_ACTION'
3247               AND  obj1.object_type_from ='PA_DELIVERABLES'
3248               AND  obj1.object_type_to = 'PA_ACTIONS'
3249               AND  obj2.object_id_to2 = obj1.object_id_from2
3250               AND  obj2.relationship_type ='A'
3251               AND  obj2.relationship_subtype='TASK_TO_DELIVERABLE'
3252               AND  obj2.object_type_from = 'PA_TASKS'
3253               AND  obj2.object_type_to = 'PA_DELIVERABLES'
3254               AND  ppe2.proj_element_id=obj2.object_id_from1
3255               AND  ppe2.object_type='PA_TASKS'
3256               AND (     nvl(OKE_DELIVERABLE_UTILS_PUB.WSH_Initiated_Yn(ppev.element_version_id),'N') = 'Y'
3257                      OR nvl(OKE_DELIVERABLE_UTILS_PUB.REQ_Initiated_Yn(ppev.element_version_id),'N') = 'Y'
3258                      OR nvl(OKE_DELIVERABLE_UTILS_PUB.MDS_Initiated_Yn(ppev.element_version_id),'N') = 'Y'
3259                      OR PA_DELIVERABLE_UTILS.GET_FUNCTION_CODE(ppe.proj_element_id) = 'BILLING'  )
3260              );
3261 
3262 l_debug_mode   VARCHAR2(1);
3263 l_debug_level2 CONSTANT NUMBER := 2;
3264 l_debug_level3 CONSTANT NUMBER := 3;
3265 l_debug_level4 CONSTANT NUMBER := 4;
3266 l_debug_level5 CONSTANT NUMBER := 5;
3267 
3268 l_return_flag VARCHAR2(1) := 'Y';
3269 BEGIN
3270      x_return_status := FND_API.G_RET_STS_SUCCESS;
3271      x_msg_count   := 0;
3272      l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
3273 
3274      IF l_debug_mode = 'Y' THEN
3275           PA_DEBUG.set_curr_function( p_function   => 'PA_DELIVERABLE_UTILS : CHECK_PROJ_DLV_TXN_EXISTS',
3276                                       p_debug_mode => l_debug_mode );
3277      END IF;
3278      IF l_debug_mode = 'Y' THEN
3279           Pa_Debug.g_err_stage:= 'PA_DELIVERABLE_UTILS : CHECK_PROJ_DLV_TXN_EXISTS : Printing Input parameters';
3280           Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
3281                                      l_debug_level3);
3282           Pa_Debug.WRITE(g_module_name,'p_project_id'||':'||p_project_id,
3283                                      l_debug_level3);
3284      END IF;
3285 
3286      OPEN cur_proj_txn_exists;
3287      FETCH cur_proj_txn_exists INTO l_return_flag;
3288      IF cur_proj_txn_exists%FOUND THEN
3289           x_return_status := FND_API.G_RET_STS_ERROR;
3290           PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
3291                                 p_msg_name       => 'PA_STR_SETUP_CHANGE_ERR' );
3292      ELSE
3293           l_return_flag := 'N';
3294      END IF;
3295      CLOSE cur_proj_txn_exists;
3296 
3297      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
3298        pa_debug.reset_curr_function;
3299      END IF ;
3300 
3301      return l_return_flag;
3302 EXCEPTION
3303 WHEN OTHERS THEN
3304      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3305      x_msg_count     := 1;
3306      x_msg_data      := SQLERRM;
3307 
3308      IF cur_proj_txn_exists%ISOPEN THEN
3309           CLOSE cur_proj_txn_exists;
3310      END IF;
3311 
3312      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
3313        pa_debug.reset_curr_function;
3314      END IF ;
3315 
3316      Fnd_Msg_Pub.add_exc_msg
3317                        (  p_pkg_name        => 'PA_DELIVERABLE_UTILS'
3318                         , p_procedure_name  => 'CHECK_PROJ_DLV_TXN_EXISTS'
3319                         , p_error_text      => x_msg_data );
3320      RAISE;
3321 END CHECK_PROJ_DLV_TXN_EXISTS;
3322 
3323 FUNCTION GET_ASSOCIATED_DELIVERABLES
3324  (
3325      p_task_id   IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
3326  )   RETURN VARCHAR2
3327  IS
3328 
3329  TYPE l_tbl IS TABLE OF VARCHAR2(350) INDEX BY BINARY_INTEGER;
3330  l_name_number_tbl l_tbl ;
3331  l_count NUMBER ;
3332  l_string varchar2(5000); -- Modified size from 500 to 5000 for Bug#6153741
3333  l_meaning varchar2(80);
3334 
3335 CURSOR c_associated_deliverables IS
3336 SELECT  ppe. name||'('|| ppe.element_number||')' name_number
3337 FROM  PA_PROJ_ELEMENTS ppe ,
3338       PA_OBJECT_RELATIONSHIPS obj
3339 WHERE  ppe.object_type='PA_DELIVERABLES'
3340   AND  ppe.proj_element_id = OBJ.object_id_to2
3341   AND  OBJ.object_id_from2 =p_task_id
3342   AND  OBJ.object_type_to = 'PA_DELIVERABLES'
3343   AND  OBJ.object_type_from = 'PA_TASKS'
3344   AND  OBJ.relationship_type = 'A'
3345   AND  OBJ.relationship_subtype = 'TASK_TO_DELIVERABLE';
3346 
3347 CURSOR c_lookup_meaning IS
3348 SELECT meaning
3349 FROM pa_lookups
3350 WHERE lookup_type = 'PA_DLV_MORE'
3351   AND lookup_code = 'MORE';
3352 
3353 BEGIN
3354 
3355 OPEN c_associated_deliverables;
3356 -- Bug Fix 5609470.
3357 -- Moved the following code to inside the code to avoid unnecessary executions as the cursor
3358 -- gets opened even when the meaning is not used.
3359 -- Hence moving the open fetch and close as well to inside just before the usage.
3360 
3361 -- OPEN c_lookup_meaning;
3362 FETCH c_associated_deliverables BULK COLLECT INTO l_name_number_tbl;
3363 CLOSE c_associated_deliverables;
3364      IF  nvl(l_name_number_tbl.LAST,0)>0 THEN
3365 
3366        -- Bug Fix 5609470.
3367        -- Moved the following code to inside the code to avoid unnecessary executions as the cursor
3368        -- gets opened even when the meaning is not used.
3369        -- Hence moving the open fetch and close as well to inside just before the usage.
3370        --   FETCH  c_lookup_meaning INTO l_meaning;
3371        --   CLOSE  c_lookup_meaning;
3372 
3373           FOR l_count in l_name_number_tbl.FIRST..l_name_number_tbl.LAST LOOP
3374              IF l_count = 1
3375                THEN
3376                     l_string :=l_name_number_tbl(l_count);
3377                ELSE
3378                     l_string := l_string||','||l_name_number_tbl(l_count);
3379                END IF;
3380           EXIT  WHEN l_count >= 3 ;
3381           END LOOP ;
3382 
3383         IF nvl(l_name_number_tbl.LAST,0)>3 THEN
3384 
3385        -- Bug Fix 5609470.
3386        -- Moved the following code to here to avoid unnecessary executions as the cursor
3387        -- gets opened even when the meaning is not used.
3388        -- Hence moving the open fetch and close as well to inside just before the usage.
3389 
3390             OPEN c_lookup_meaning;
3391             FETCH  c_lookup_meaning INTO l_meaning;
3392             CLOSE  c_lookup_meaning;
3393 
3394        -- End of Bug Fix 5609470.
3395 
3396             l_string := l_string||','|| l_meaning||'..';
3397         END IF ;
3398           RETURN l_string;
3399      ELSE
3400           RETURN NULL;
3401      END IF ;
3402 END GET_ASSOCIATED_DELIVERABLES;
3403 
3404 /*===============================================================================================
3405 Deliverable Defaulting Logic for Copy From Project/Template Flow
3406 Case 1:
3407 Source Project/Template Dates
3408 |------------------|-----------------|----------------------|
3409 |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3410 |------------------|-----------------|----------------------|
3411 |     NULL         |      NULL       |            NULL      |
3412 |------------------|-----------------|----------------------|
3413 
3414 
3415 |------------------|-----------------|------------------|-----------------|----------------------|
3416 |  QE Start Date   |   QE End Date   |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3417 |------------------|-----------------|------------------|-----------------|----------------------|
3418 |     NULL         |      NULL       |     NULL         |      NULL       |            NULL      |
3419 |------------------|-----------------|------------------|-----------------|----------------------|
3420 |   01-APR-2002    |      NULL       |   01-APR-2002    |      NULL       |     01-APR-2002      |
3421 |------------------|-----------------|------------------|-----------------|----------------------|
3422 |   01-APR-2002    |   01-APR-2003   |   01-APR-2002    |   01-APR-2003   |     01-APR-2003      |
3423 |------------------|-----------------|------------------|-----------------|----------------------|
3424 
3425 Case 2:
3426 |------------------|-----------------|----------------------|
3427 |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3428 |------------------|-----------------|----------------------|
3429 |  01-APR-2002     |      NULL       |            NULL      |
3430 |------------------|-----------------|----------------------|
3431 
3432 |------------------|-----------------|------------------|-----------------|----------------------|
3433 |  QE Start Date   |   QE End Date   |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3434 |------------------|-----------------|------------------|-----------------|----------------------|
3435 |     NULL         |      NULL       |   01-APR-2002    |      NULL       |     01-APR-2002      |
3436 |------------------|-----------------|------------------|-----------------|----------------------|
3437 |   01-APR-2003    |      NULL       |   01-APR-2003    |      NULL       |     01-APR-2003      |
3438 |------------------|-----------------|------------------|-----------------|----------------------|
3439 |   01-APR-2003    |   01-APR-2004   |   01-APR-2003    |   01-APR-2004   |     01-APR-2004      |
3440 |------------------|-----------------|------------------|-----------------|----------------------|
3441 
3442 Case 3:
3443 |------------------|-----------------|----------------------|
3444 |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3445 |------------------|-----------------|----------------------|
3446 |  01-APR-2002     |      NULL       |   15-APR-2002        |
3447 |------------------|-----------------|----------------------|
3448 
3449 |------------------|-----------------|------------------|-----------------|----------------------|
3450 |  QE Start Date   |   QE End Date   |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3451 |------------------|-----------------|------------------|-----------------|----------------------|
3452 |     NULL         |      NULL       |   01-APR-2002    |      NULL       |     15-APR-2002      |
3453 |------------------|-----------------|------------------|-----------------|----------------------|
3454 |   01-APR-2003    |      NULL       |   01-APR-2003    |      NULL       |     15-APR-2003      |
3455 |------------------|-----------------|------------------|-----------------|----------------------|
3456 |   01-APR-2003    |   01-APR-2004   |   01-APR-2003    |   01-APR-2004   |     15-APR-2004      |
3457 |------------------|-----------------|------------------|-----------------|----------------------|
3458 |   01-APR-2003    |   12-APR-2003   |   01-APR-2003    |   12-APR-2003   |     12-APR-2003      |
3459 |------------------|-----------------|------------------|-----------------|----------------------|
3460 
3461 Case 4:
3462 |------------------|-----------------|----------------------|
3463 |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3464 |------------------|-----------------|----------------------|
3465 |     NULL         |      NULL       |    15-APR-2002       |
3466 |------------------|-----------------|----------------------|
3467 
3468 |------------------|-----------------|------------------|-----------------|----------------------|
3469 |  QE Start Date   |   QE End Date   |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3470 |------------------|-----------------|------------------|-----------------|----------------------|
3471 |     NULL         |      NULL       |        NULL      |      NULL       |     15-APR-2002      |
3472 |------------------|-----------------|------------------|-----------------|----------------------|
3473 |   01-APR-2003    |      NULL       |   01-APR-2003    |      NULL       |     01-APR-2003      |
3474 |------------------|-----------------|------------------|-----------------|----------------------|
3475 |   01-APR-2003    |   01-APR-2004   |   01-APR-2003    |   01-APR-2004   |     01-APR-2004      |
3476 |------------------|-----------------|------------------|-----------------|----------------------|
3477 
3478 Case 5:
3479 |------------------|-----------------|----------------------|
3480 |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3481 |------------------|-----------------|----------------------|
3482 |  01-APR-2002     |  15-APR-2003    |  15-APR-2002         |
3483 |------------------|-----------------|----------------------|
3484 
3485 |------------------|-----------------|------------------|-----------------|----------------------|
3486 |  QE Start Date   |   QE End Date   |ProjectStart Date |ProjectEnd Date  |Deliverable Due Date  |
3487 |------------------|-----------------|------------------|-----------------|----------------------|
3488 |     NULL         |      NULL       |   01-APR-2002    |   15-APR-2003   |     15-APR-2002      |
3489 |------------------|-----------------|------------------|-----------------|----------------------|
3490 |   01-APR-2003    |      NULL       |   01-APR-2003    |   15-APR-2004   |     15-APR-2003      |
3491 |------------------|-----------------|------------------|-----------------|----------------------|
3492 |   01-APR-2003    |   01-APR-2004   |   01-APR-2003    |   01-APR-2004   |     15-APR-2003      |
3493 |------------------|-----------------|------------------|-----------------|----------------------|
3494 |   01-APR-2003    |   12-APR-2003   |   01-APR-2003    |   12-APR-2003   |     12-APR-2003      |
3495 |------------------|-----------------|------------------|-----------------|----------------------|
3496 
3497 =================================================================================================*/
3498 
3499 FUNCTION GET_ADJUSTED_DATES
3500      (
3501           p_project_id   IN pa_projects_all.project_id%TYPE
3502          ,p_dlv_due_date IN DATE
3503          ,p_delta        IN NUMBER
3504      )   RETURN DATE
3505 IS
3506      CURSOR c_proj_dates IS
3507      SELECT start_date
3508            ,completion_date
3509        FROM pa_projects_all pa
3510       WHERE pa.project_id = p_project_id ;
3511 l_start_date   DATE ;
3512 l_end_date     DATE ;
3513 l_dlv_due_date DATE ;
3514 l_delta        NUMBER ;
3515 
3516 BEGIN
3517      OPEN c_proj_dates ;
3518      FETCH c_proj_dates into l_start_date,l_end_date ;
3519      CLOSE c_proj_dates ;
3520 
3521     IF p_dlv_due_date IS NULL THEN
3522           IF l_end_date IS NOT NULL THEN
3523                l_dlv_due_date := l_end_date ;
3524           ELSE
3525                l_dlv_due_date := l_start_date ;
3526           END IF ;
3527 
3528      ELSE
3529           l_delta := nvl(p_delta,0) ;
3530 
3531           IF l_end_date IS NOT NULL  THEN
3532                l_dlv_due_date := LEAST(l_end_date,p_dlv_due_date + l_delta);
3533           ELSE
3534                -- Bug#3601622
3535                -- GREATEST function returns null if any of the
3536                -- parameter is null. To avaid this added nvl on both side.
3537                l_dlv_due_date := GREATEST(nvl(l_start_date,p_dlv_due_date + l_delta),nvl(p_dlv_due_date + l_delta,l_start_date));
3538           END IF ;
3539 
3540          -- 3493612 , new defaulted due date will be always between adjusted project start date and end date
3541          -- or it will be project end date
3542 
3543          -- added below code to check new defaulted due date is between adjusted project start date and end date
3544          -- if it is not , defaulted due date will be set to adjusted project end date
3545 
3546          IF l_end_date IS NOT NULL AND l_start_date IS NOT NULL THEN
3547             IF NOT (l_dlv_due_date > l_start_date AND l_dlv_due_date < l_end_date) THEN
3548                 l_dlv_due_date := l_end_date;
3549             END IF;
3550          END IF;
3551 
3552          -- 3493612
3553 
3554      END IF ;
3555 
3556      RETURN l_dlv_due_date ;
3557 
3558 END GET_ADJUSTED_DATES;
3559 
3560 FUNCTION IS_ITEM_BASED_DLV_EXISTS RETURN VARCHAR2
3561 IS
3562 CURSOR C IS
3563 SELECT 'Y' FROM DUAL
3564 WHERE EXISTS(SELECT 'Y'
3565                FROM pa_proj_elements ppe,
3566                     pa_task_types ptt
3567                WHERE ppe.object_type = 'PA_DELIVERABLES'
3568                  AND ppe.type_id = ptt.task_type_id
3569                  AND ptt.task_type_class_code = 'ITEM'
3570                  AND ptt.object_type = 'PA_DLVR_TYPES'
3571                               ) ;
3572 l_dummy VARCHAR2(1) := 'N' ;
3573 BEGIN
3574 OPEN C ;
3575 FETCH C INTO l_dummy ;
3576 CLOSE C ;
3577 RETURN l_dummy ;
3578 END IS_ITEM_BASED_DLV_EXISTS ;
3579 
3580 FUNCTION IS_BILLING_FUNCTION
3581      (
3582       p_action_version_id IN pa_proj_element_versions.element_version_id%TYPE
3583       )
3584 RETURN VARCHAR2
3585 IS
3586      CURSOR C IS
3587      SELECT 'Y'
3588        FROM DUAL
3589   WHERE EXISTS (Select 'Y'
3590                   from pa_proj_elements ppe,
3591                        pa_proj_element_versions pev
3592                   where pev.element_version_id = p_action_version_id
3593                     and ppe.proj_element_id = pev.proj_element_id
3594                     and ppe.function_code = 'BILLING'
3595                  )   ;
3596 
3597 l_dummy VARCHAR2(1) := 'N' ;
3598 BEGIN
3599      OPEN C ;
3600      FETCH C INTO l_dummy  ;
3601      CLOSE C ;
3602      RETURN l_dummy ;
3603 END IS_BILLING_FUNCTION ;
3604 
3605 -- API name                      : Get_Project_Type_Class
3606 -- Type                          : Public procedure
3607 -- Pre-reqs                      : None
3608 -- Return Value                  : VARCHAR2
3609 -- Prameters
3610 -- p_project_id                 IN      NUMBER          REQUIRED
3611 -- x_return_status              OUT     VARCHAR2        REQUIRED
3612 
3613  FUNCTION Get_Project_Type_Class(
3614    p_project_id NUMBER ,
3615    x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3616  ) RETURN VARCHAR2 AS
3617 
3618   CURSOR cur_projects_all
3619   IS
3620     SELECT ppt.project_type_class_code
3621       FROM pa_projects_all ppa, pa_project_types ppt
3622      WHERE ppa.project_id = p_project_id
3623        AND ppa.project_type = ppt.project_type
3624        AND ppa.org_id = ppt.org_id; -- 4363092 MOAC Changes
3625 
3626   l_project_type_class_code  VARCHAR2(30);
3627 BEGIN
3628    OPEN cur_projects_all;
3629    FETCH cur_projects_all INTO l_project_type_class_code;
3630    CLOSE cur_projects_all;
3631    RETURN l_project_type_class_code;
3632    x_return_status:= FND_API.G_RET_STS_SUCCESS;
3633 EXCEPTION
3634     WHEN OTHERS THEN
3635     x_return_status:= FND_API.G_RET_STS_UNEXP_ERROR;
3636 END Get_Project_Type_Class;
3637 
3638 -- SubProgram           : IS_DLVR_ITEM_BASED
3639 -- Type                 : UTIL FUNCTION
3640 -- Purpose              : This function will check whether the deliverable is item based,
3641 --                        It takes the deliverable version id as input parameter
3642 -- Assumptions          : None
3643 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
3644 -- ---------------------------  ------------    -----------    ---------       ---------------------------
3645 
3646 --  p_deliverable_id               IN            VARCHAR2        N          Deliverable Version Id
3647 FUNCTION IS_DLVR_ITEM_BASED
3648      (
3649          p_deliverable_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
3650      )   RETURN VARCHAR2
3651 IS
3652      CURSOR  c_is_dlvr_item_based IS
3653      SELECT 'Y'
3654      FROM PA_TASK_TYPES
3655      WHERE TASK_TYPE_ID=(SELECT TYPE_ID
3656                            FROM PA_PROJ_ELEMENTS PPE,
3657                                 PA_PROJ_ELEMENT_VERSIONS PEV
3658                            WHERE PPE.PROJ_ELEMENT_ID= PEV.PROJ_ELEMENT_ID
3659                        AND PEV.ELEMENT_VERSION_ID = p_deliverable_id
3660                               AND PEV.OBJECT_TYPE='PA_DELIVERABLES'
3661                               AND PPE.OBJECT_TYPE='PA_DELIVERABLES')
3662        AND TASK_TYPE_CLASS_CODE='ITEM'
3663        AND OBJECT_TYPE='PA_DLVR_TYPES';
3664 l_dummy VARCHAR2(1) := 'N' ;
3665 BEGIN
3666      OPEN c_is_dlvr_item_based;
3667      FETCH c_is_dlvr_item_based into l_dummy ;
3668      CLOSE c_is_dlvr_item_based;
3669      RETURN nvl(l_dummy,'N') ;
3670 END IS_DLVR_ITEM_BASED ;
3671 
3672 -- 3454572 added function for TM Home Page
3673 
3674 -- SubProgram           : GET_DLVR_NAME_NUMBER
3675 -- Type                 : UTIL FUNCTION
3676 -- Purpose              : This function will return deliverale name and number
3677 -- Assumptions          : None
3678 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
3679 -- ---------------------------  ------------    -----------    ---------       ---------------------------
3680 
3681 --  p_deliverable_id               IN            VARCHAR2        N          Deliverable Version Id
3682 
3683 FUNCTION GET_DLVR_NAME_NUMBER
3684      (
3685           p_deliverable_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
3686      )   RETURN VARCHAR2
3687 IS
3688      CURSOR c_dlv_name_number IS
3689      SELECT
3690             ppe.name || '(' || ppe.element_number || ')'
3691        FROM
3692             pa_proj_elements ppe
3693             ,pa_proj_element_versions pev
3694       WHERE
3695             pev.element_version_id =  p_deliverable_id
3696        AND  ppe.object_type        =  'PA_DELIVERABLES'
3697        AND  pev.object_type        =  'PA_DELIVERABLES'
3698        AND  ppe.proj_element_id    =  pev.proj_element_id
3699        AND  ppe.project_id         =  pev.project_id;
3700 
3701 l_dummy VARCHAR2(350) := NULL;
3702 
3703 BEGIN
3704      OPEN c_dlv_name_number;
3705      FETCH c_dlv_name_number into l_dummy ;
3706      CLOSE c_dlv_name_number;
3707      RETURN l_dummy ;
3708 
3709 END GET_DLVR_NAME_NUMBER;
3710 
3711 -- SubProgram           : GET_DLVR_NUMBER
3712 -- Type                 : UTIL FUNCTION
3713 -- Purpose              : This function will return deliverale number
3714 -- Assumptions          : None
3715 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
3716 -- ---------------------------  ------------    -----------    ---------       ---------------------------
3717 
3718 --  p_deliverable_id               IN            VARCHAR2        N          Deliverable Version Id
3719 
3720 FUNCTION GET_DLVR_NUMBER
3721      (
3722           p_deliverable_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
3723      )   RETURN VARCHAR2
3724 IS
3725      CURSOR c_dlv_name_number IS
3726      SELECT
3727             ppe.ELEMENT_NUMBER
3728        FROM
3729             pa_proj_elements ppe
3730             ,pa_proj_element_versions pev
3731       WHERE
3732             pev.element_version_id =  p_deliverable_id
3733        AND  ppe.object_type        =  'PA_DELIVERABLES'
3734        AND  pev.object_type        =  'PA_DELIVERABLES'
3735        AND  ppe.proj_element_id    =  pev.proj_element_id
3736        AND  ppe.project_id         =  pev.project_id;
3737 
3738 l_dummy VARCHAR2(350) := NULL;
3739 
3740 BEGIN
3741      OPEN c_dlv_name_number;
3742      FETCH c_dlv_name_number into l_dummy ;
3743      CLOSE c_dlv_name_number;
3744      RETURN l_dummy ;
3745 
3746 END GET_DLVR_NUMBER;
3747 
3748 -- 3454572 end
3749 -- 3442451 added for deliverable security implementation
3750 
3751 -- SubProgram           : IS_DLVR_OWNER
3752 -- Type                 : UTIL FUNCTION
3753 -- Purpose              : This function will return Y, if user is deliverable owner
3754 -- Assumptions          : None
3755 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
3756 -- ---------------------------  ------------    -----------    ---------       ---------------------------
3757 --  p_deliverable_id               IN            VARCHAR2        Y               Deliverable Version Id
3758 --  p_user_id                      IN            NUMBER          Y               User Id
3759 
3760 
3761 FUNCTION IS_DLVR_OWNER
3762      (
3763            p_deliverable_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
3764           ,p_user_id        IN NUMBER
3765      )   RETURN VARCHAR2
3766 IS
3767      CURSOR c_dlvr_owner IS
3768         select
3769              ppe.manager_person_id
3770         from
3771              pa_proj_elements ppe,
3772              pa_proj_element_versions pev
3773         where
3774                  pev.element_version_id  = p_deliverable_id
3775              and pev.object_type                 = 'PA_DELIVERABLES'
3776              and ppe.object_type                 = 'PA_DELIVERABLES'
3777              and pev.proj_element_id     = ppe.proj_element_id
3778              and pev.project_id          = ppe.project_id
3779              and pev.object_type         = pev.object_type;
3780 
3781 l_is_owner          VARCHAR2(1) := 'N';
3782 l_dlvr_owner_id     NUMBER := NULL;
3783 l_person_id         NUMBER := NULL;
3784 
3785 BEGIN
3786 
3787      l_person_id := PA_UTILS.GetEmpIdFromUser(p_user_id);
3788 
3789      OPEN c_dlvr_owner;
3790      FETCH c_dlvr_owner into l_dlvr_owner_id ;
3791      CLOSE c_dlvr_owner;
3792 
3793      IF l_dlvr_owner_id = l_person_id THEN
3794         l_is_owner := 'Y';
3795      END IF;
3796     RETURN l_is_owner;
3797 
3798 END IS_DLVR_OWNER;
3799 
3800 -- 3442451 end
3801 /* ==============3435905 : FP M : Deliverables Changes For AMG - Start * =========================*/
3802 
3803 
3804 -- SubProgram           : VALIDATE_DELIVERABLE
3805 -- Type                 : UTIL FUNCTION
3806 -- Purpose              : This function will validate the IDs passed from AMG apis. It will be called
3807 --                        only when context is AMG, for both Create and Update
3808 -- Assumptions          : None
3809 
3810    Procedure Validate_Deliverable
3811    (
3812         p_deliverable_id         IN  NUMBER
3813       , p_deliverable_reference  IN  VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3814       , p_dlvr_number            IN  PA_PROJ_ELEMENTS.ELEMENT_NUMBER%TYPE  := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3815       , p_dlvr_name              IN  PA_PROJ_ELEMENTS.NAME%TYPE            := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3816       , px_dlvr_owner_id         IN  OUT NOCOPY PA_PROJ_ELEMENTS.MANAGER_PERSON_ID%TYPE --File.Sql.39 bug 4440895
3817       , p_dlvr_owner_name        IN  VARCHAR2    := NULL
3818       , p_dlvr_type_id           IN  PA_PROJ_ELEMENTS.TYPE_ID%TYPE         := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3819       , px_actual_finish_date    IN OUT NOCOPY DATE --File.Sql.39 bug 4440895
3820       , px_progress_weight       IN OUT NOCOPY PA_PROJ_ELEMENTS.PROGRESS_WEIGHT%TYPE --File.Sql.39 bug 4440895
3821       , px_status_code           IN OUT NOCOPY Pa_task_types.initial_status_code%TYPE --File.Sql.39 bug 4440895
3822       , p_carrying_out_org_id    IN  NUMBER                                := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3823       , p_project_id             IN  PA_PROJ_ELEMENTS.PROJECT_ID%TYPE
3824       , p_task_id                IN  PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
3825       , p_calling_mode           IN  VARCHAR2 := 'INSERT'
3826       , x_return_status          OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3827       , x_msg_count              OUT  NOCOPY NUMBER --File.Sql.39 bug 4440895
3828       , x_msg_data               OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3829    )
3830    IS
3831       l_api_name    CONSTANT    VARCHAR2(100) := 'VALIDATE_DELIVERABLE';
3832       l_debug_mode              VARCHAR2(1);
3833       l_msg_data                VARCHAR2(2000);
3834 
3835       l_dlvr_owner_id           PA_PROJ_ELEMENTS.MANAGER_PERSON_ID%TYPE;
3836       --added for Bug: 4537865
3837       l_new_dlvr_owner_id	PA_PROJ_ELEMENTS.MANAGER_PERSON_ID%TYPE;
3838       l_new_carrying_out_org_id PA_PROJ_ELEMENTS.CARRYING_OUT_ORGANIZATION_ID%TYPE;
3839       --added for Bug: 4537865
3840       l_carrying_out_org_id     PA_PROJ_ELEMENTS.CARRYING_OUT_ORGANIZATION_ID%TYPE;
3841       l_dlvr_prg_enabled              VARCHAR2(1)     := NULL;
3842       l_dlvr_action_enabled           VARCHAR2(1)     := NULL;
3843       l_status_code             PA_PROJ_ELEMENTS.PROGRESS_WEIGHT%TYPE    := NULL;
3844       l_status_code_valid       VARCHAR2(1) := NULL;
3845 
3846       l_project_number          Pa_Projects_All.Segment1%TYPE;
3847       l_task_number             Pa_Proj_Elements.Name%TYPE;
3848 
3849    BEGIN
3850 
3851        x_msg_count := 0;
3852        x_return_status := FND_API.G_RET_STS_SUCCESS;
3853        l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
3854 
3855        IF l_debug_mode = 'Y' THEN
3856           PA_DEBUG.set_curr_function( p_function   => 'VALIDATE_DELIVERABLE', p_debug_mode => l_debug_mode );
3857        END IF;
3858 
3859        IF px_dlvr_owner_id  = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM     THEN
3860           l_dlvr_owner_id := NULL;
3861        ELSE
3862           l_dlvr_owner_id := px_dlvr_owner_id;
3863        END IF;
3864 
3865        IF p_carrying_out_org_id  = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM     THEN
3866           l_carrying_out_org_id := NULL;
3867        ELSE
3868           l_carrying_out_org_id := p_carrying_out_org_id;
3869        END IF;
3870 
3871     -- Fetching Task Name , Project Name to use as token in Error Messages.
3872       IF (p_task_id IS NOT NULL AND p_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)  THEN
3873           SELECT name INTO   l_task_number
3874           FROM Pa_Proj_Elements
3875           WHERE  proj_element_id = p_task_id;
3876        ELSE
3877           l_task_number := null;
3878        END IF;
3879 
3880        SELECT segment1 INTO   l_project_number
3881        FROM Pa_Projects_All
3882        WHERE  project_id = p_project_id;
3883 
3884        IF l_debug_mode = 'Y' THEN
3885           Pa_Debug.WRITE(g_module_name, 'token values proj ['||l_Project_Number||'] task ['||l_task_Number||']',l_debug_level3);
3886        END IF;
3887 
3888     -- Validating deliverable_name - not null
3889        IF  p_dlvr_name   IS NULL
3890            OR  p_dlvr_name = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR    THEN
3891 
3892           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
3893                l_err_message := FND_MESSAGE.GET_STRING('PA','DLVR_NAME_MISSING') ;
3894               PA_UTILS.ADD_MESSAGE
3895                                (p_app_short_name => 'PA',
3896                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
3897                                 p_token1         => 'PROJECT',
3898                                 p_value1         =>  l_project_number,
3899                                 p_token2         =>  'TASK',
3900                                 p_value2         =>  l_task_number,
3901                                 p_token3         => 'DLVR_REFERENCE',
3902                                 p_value3         =>  p_deliverable_reference,
3903                                 p_token4         => 'MESSAGE',
3904                                 p_value4         =>  l_err_message
3905                                 );
3906           END IF;
3907           x_return_status             := FND_API.G_RET_STS_ERROR;
3908           RAISE FND_API.G_EXC_ERROR;
3909        END IF;
3910 
3911     IF l_debug_mode = 'Y' THEN
3912        Pa_Debug.WRITE(g_module_name,' validating deliverable name '||p_dlvr_name,  l_debug_level3);
3913     END IF;
3914 
3915     -- Validating deliverable_short_name - not null
3916        IF  p_dlvr_number   IS NULL
3917            OR  p_dlvr_number = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR    THEN
3918 
3919           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
3920               l_err_message := FND_MESSAGE.GET_STRING('PA','DLVR_NUMBER_MISSING') ;
3921               PA_UTILS.ADD_MESSAGE
3922                                (p_app_short_name => 'PA',
3923                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
3924                                 p_token1         => 'PROJECT',
3925                                 p_value1         =>  l_project_number,
3926                                 p_token2         =>  'TASK',
3927                                 p_value2         =>  l_task_number,
3928                                 p_token3         => 'DLVR_REFERENCE',
3929                                 p_value3         =>  p_deliverable_reference,
3930                                 p_token4         => 'MESSAGE',
3931                                 p_value4         =>  l_err_message
3932                                 );
3933           END IF;
3934           x_return_status             := FND_API.G_RET_STS_ERROR;
3935           RAISE FND_API.G_EXC_ERROR;
3936        END IF;
3937 
3938     IF l_debug_mode = 'Y' THEN
3939        Pa_Debug.WRITE(g_module_name,' validating deliverable short name '||p_dlvr_number,  l_debug_level3);
3940     END IF;
3941 
3942     -- Validating Deliverable Type Id - not null, valid value
3943        IF  p_dlvr_type_id   IS NULL
3944            OR  p_dlvr_type_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM    THEN
3945 
3946           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
3947               l_err_message := FND_MESSAGE.GET_STRING('PA','DLVR_TYPE_MISSING') ;
3948               PA_UTILS.ADD_MESSAGE
3949                                (p_app_short_name => 'PA',
3950                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
3951                                 p_token1         => 'PROJECT',
3952                                 p_value1         =>  l_project_number,
3953                                 p_token2         =>  'TASK',
3954                                 p_value2         =>  l_task_number,
3955                                 p_token3         => 'DLVR_REFERENCE',
3956                                 p_value3         =>  p_deliverable_reference,
3957                                 p_token4         => 'MESSAGE',
3958                                 p_value4         =>  l_err_message
3959                                 );
3960           END IF;
3961           x_return_status             := FND_API.G_RET_STS_ERROR;
3962           RAISE FND_API.G_EXC_ERROR;
3963 
3964        ELSE -- Deliverable type is not null, checking for valid value
3965           IF (Pa_Deliverable_Utils.IS_DLV_TYPE_ID_VALID(p_dlvr_type_id) = 'N') THEN
3966           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
3967               l_err_message := FND_MESSAGE.GET_STRING('PA','DLVR_TYPE_INVALID') ;
3968               PA_UTILS.ADD_MESSAGE
3969                                (p_app_short_name => 'PA',
3970                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
3971                                 p_token1         => 'PROJECT',
3972                                 p_value1         =>  l_project_number,
3973                                 p_token2         =>  'TASK',
3974                                 p_value2         =>  l_task_number,
3975                                 p_token3         => 'DLVR_REFERENCE',
3976                                 p_value3         =>  p_deliverable_reference,
3977                                 p_token4         => 'MESSAGE',
3978                                 p_value4         =>  l_err_message
3979                                 );
3980          END IF;
3981              x_return_status             := FND_API.G_RET_STS_ERROR;
3982              RAISE FND_API.G_EXC_ERROR;
3983       END IF;
3984        END IF;
3985 
3986     IF l_debug_mode = 'Y' THEN
3987        Pa_Debug.WRITE(g_module_name,' validating deliverable type'||p_dlvr_type_id,  l_debug_level3);
3988     END IF;
3989 
3990     -- Validating Deliverable Owner Id - valid value
3991        IF  (l_dlvr_owner_id   IS  NOT NULL ) THEN
3992           Pa_Tasks_Maint_Utils.CHECK_TASK_MGR_NAME_OR_ID (
3993           p_task_mgr_name  => p_dlvr_owner_name
3994              ,p_task_mgr_id    => l_dlvr_owner_id
3995              ,p_project_id     => p_project_id
3996              ,p_check_id_flag  => 'Y'
3997              ,p_calling_module => 'AMG'
3998           -- ,x_task_mgr_id    => l_dlvr_owner_id		* commenented for bug: 4537865
3999 	     ,x_task_mgr_id    => l_new_dlvr_owner_id		-- added for bug:      4537865
4000              ,x_return_status  => x_return_status
4001              ,x_error_msg_code => l_msg_data );
4002       IF l_debug_mode = 'Y' THEN
4003          Pa_Debug.WRITE(g_module_name,' validated owner id'||l_dlvr_owner_id||x_return_status , l_debug_level3);
4004       END IF;
4005 
4006           -- added for bug:      4537865
4007           IF x_return_status = FND_API.G_RET_STS_SUCCESS       THEN
4008 	  l_dlvr_owner_id := l_new_dlvr_owner_id;
4009           END IF;
4010           -- added for bug:      4537865
4011 
4012           IF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR   THEN
4013              RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
4014           ELSIF x_return_status = FND_API.G_RET_STS_ERROR      THEN
4015               l_err_message := FND_MESSAGE.GET_STRING('PA','DLVR_OWNER_INVALID') ;
4016               PA_UTILS.ADD_MESSAGE
4017                                (p_app_short_name => 'PA',
4018                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4019                                 p_token1         => 'PROJECT',
4020                                 p_value1         =>  l_project_number,
4021                                 p_token2         =>  'TASK',
4022                                 p_value2         =>  l_task_number,
4023                                 p_token3         => 'DLVR_REFERENCE',
4024                                 p_value3         =>  p_deliverable_reference,
4025                                 p_token4         => 'MESSAGE',
4026                                 p_value4         =>  l_err_message
4027                                 );
4028            x_return_status             := FND_API.G_RET_STS_ERROR;
4029                RAISE FND_API.G_EXC_ERROR;
4030           END IF;
4031        END IF;
4032 
4033  -- Validating Status Code - valid value
4034      l_status_code_valid := Pa_Deliverable_Utils.IS_STATUS_CODE_VALID(px_status_code, p_calling_mode);
4035 
4036      IF l_debug_mode = 'Y' THEN
4037          Pa_Debug.WRITE(g_module_name,' validated status code ['||px_status_code||'] outcome ['||l_status_code_valid||']' , l_debug_level3);
4038      END IF;
4039 
4040       IF (px_status_code IS NOT NULL and l_status_code_valid = 'N') THEN
4041        IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
4042               l_err_message := FND_MESSAGE.GET_STRING('PA','DLVR_STATUS_INVALID') ;
4043               PA_UTILS.ADD_MESSAGE
4044                                (p_app_short_name => 'PA',
4045                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4046                                 p_token1         => 'PROJECT',
4047                                 p_value1         =>  l_project_number,
4048                                 p_token2         =>  'TASK',
4049                                 p_value2         =>  l_task_number,
4050                                 p_token3         => 'DLVR_REFERENCE',
4051                                 p_value3         =>  p_deliverable_reference,
4052                                 p_token4         => 'MESSAGE',
4053                                 p_value4         =>  l_err_message
4054                                 );
4055 
4056            END IF;
4057            x_return_status             := FND_API.G_RET_STS_ERROR;
4058            RAISE FND_API.G_EXC_ERROR;
4059       END IF;
4060 
4061     -- Validating Carrying Out Org Id - valid value
4062        IF  (l_carrying_out_org_id   IS  NOT NULL ) THEN
4063           Pa_Hr_Org_Utils.CHECK_ORGNAME_OR_ID
4064             ( p_organization_id    => l_carrying_out_org_id
4065              ,p_organization_name  =>  NULL
4066              ,p_check_id_flag      => 'Y'
4067           -- ,x_organization_id    => l_carrying_out_org_id      * commented for Bug: 4537685
4068 	     ,x_organization_id    => l_new_carrying_out_org_id  -- added for Bug:    4537685
4069              ,x_return_status      => x_return_status
4070              ,x_error_msg_code     => l_msg_data);
4071            IF l_debug_mode = 'Y' THEN
4072                Pa_Debug.WRITE(g_module_name,' validating carrying out org'||l_carrying_out_org_id||x_return_status,  l_debug_level3);
4073            END IF;
4074 
4075           -- added for Bug:    4537685
4076           IF x_return_status = FND_API.G_RET_STS_SUCCESS   THEN
4077           l_carrying_out_org_id := l_new_carrying_out_org_id;
4078           END IF;
4079           -- added for Bug:    4537685
4080 
4081           IF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR   THEN
4082              RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
4083           ELSIF x_return_status = FND_API.G_RET_STS_ERROR      THEN
4084               l_err_message := FND_MESSAGE.GET_STRING('PA','DLVR_CARRYING_ORG_INVALID') ;
4085               PA_UTILS.ADD_MESSAGE
4086                                (p_app_short_name => 'PA',
4087                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4088                                 p_token1         => 'PROJECT',
4089                                 p_value1         =>  l_project_number,
4090                                 p_token2         =>  'TASK',
4091                                 p_value2         =>  l_task_number,
4092                                 p_token3         => 'DLVR_REFERENCE',
4093                                 p_value3         =>  p_deliverable_reference,
4094                                 p_token4         => 'MESSAGE',
4095                                 p_value4         =>  l_err_message
4096                                 );
4097            x_return_status             := FND_API.G_RET_STS_ERROR;
4098                RAISE FND_API.G_EXC_ERROR;
4099           END IF;
4100        END IF;
4101 
4102      Pa_Deliverable_Utils.Progress_Enabled_Validation
4103      (
4104           p_deliverable_id         =>   p_deliverable_id
4105         , p_project_id             =>   p_project_id
4106         , p_dlvr_type_id           =>   p_dlvr_type_id
4107         , px_actual_finish_date    =>   px_actual_finish_date
4108         , px_progress_weight       =>   px_progress_weight
4109         , px_status_code           =>   px_status_code
4110         , p_calling_Mode           =>   p_calling_Mode
4111       ) ;
4112 
4113      IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
4114        pa_debug.reset_curr_function;
4115      END IF ;
4116 
4117    EXCEPTION
4118       WHEN FND_API.G_EXC_ERROR        THEN
4119            x_return_status := FND_API.G_RET_STS_ERROR;
4120 	  IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
4121              pa_debug.reset_curr_function;
4122           END IF ;
4123 
4124       WHEN FND_API.G_EXC_UNEXPECTED_ERROR        THEN
4125            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4126 	  IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
4127              pa_debug.reset_curr_function;
4128           END IF ;
4129 
4130      WHEN OTHERS THEN
4131           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4132 
4133 	  IF l_debug_mode = 'Y' THEN       --Added for bug 4945876
4134              pa_debug.reset_curr_function;
4135           END IF ;
4136 
4137           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)       THEN
4138               FND_MSG_PUB.add_exc_msg
4139                    ( p_pkg_name            => g_module_name
4140                    , p_procedure_name      => l_api_name   );
4141           END IF;
4142 
4143    END Validate_Deliverable ;
4144 
4145 -- SubProgram           : IS_DLVR_TYPE_ID_VALID
4146 -- Type                 : UTIL FUNCTION
4147 -- Purpose              : This function will check whether the deliverable type id is valid
4148 -- Assumptions          : None
4149 
4150    FUNCTION IS_DLV_TYPE_ID_VALID
4151    (
4152         p_deliverable_type_id IN NUMBER
4153    )   RETURN VARCHAR2
4154    IS
4155 
4156    l_return_status  varchar2(1);
4157    l_dummy          varchar2(1);
4158 
4159    CURSOR c_dlvr_type_id_exists IS
4160    SELECT 'X'
4161    FROM PA_TASK_TYPES
4162    WHERE TASK_TYPE_ID = p_deliverable_type_id
4163    AND   sysdate between nvl(start_date_active,sysdate) and nvl(end_date_active, sysdate)
4164    AND OBJECT_TYPE='PA_DLVR_TYPES';
4165 
4166    BEGIN
4167        OPEN c_dlvr_type_id_exists;
4168        FETCH c_dlvr_type_id_exists into l_dummy ;
4169 
4170        IF c_dlvr_type_id_exists%found THEN
4171           l_return_status:='Y';
4172        ELSE
4173           l_return_status:='N';
4174        END IF;
4175 
4176        CLOSE c_dlvr_type_id_exists;
4177 
4178        return l_return_status;
4179 
4180    END IS_DLV_TYPE_ID_VALID;
4181 
4182 -- SubProgram           : get_deliverable_version_id
4183 -- Type                 : UTIL FUNCTION
4184 -- Purpose              : This function returns the deliverable version id of a deliverable
4185 -- Assumptions          : None
4186 
4187   FUNCTION get_deliverable_version_id
4188   (
4189       p_deliverable_id         IN NUMBER     ,
4190       p_structure_version_id   IN NUMBER     ,
4191       p_project_id             IN NUMBER
4192    ) RETURN NUMBER
4193    IS
4194 
4195    l_dummy          pa_proj_element_versions.element_version_id%TYPE;
4196 
4197    CURSOR c_dlvr_version IS
4198    SELECT
4199        pev.element_version_id
4200    FROM
4201        pa_proj_elements ppe
4202       ,pa_proj_element_versions pev
4203    WHERE
4204     pev.proj_element_id    =  p_deliverable_id
4205    AND  ppe.object_type        =  'PA_DELIVERABLES'
4206    AND  pev.object_type        =  'PA_DELIVERABLES'
4207    AND  ppe.proj_element_id    =  pev.proj_element_id
4208    AND  ppe.project_id         =  pev.project_id
4209    AND  ppe.project_id         = p_project_id
4210    AND  pev.parent_structure_version_id = nvl(p_structure_version_id, pev.parent_structure_version_id);
4211 
4212    BEGIN
4213        OPEN c_dlvr_version;
4214        FETCH c_dlvr_version into l_dummy ;
4215 
4216        IF c_dlvr_version%found THEN
4217           CLOSE c_dlvr_version;
4218           RETURN l_dummy;
4219        ELSE
4220           CLOSE c_dlvr_version;
4221           RETURN NULL;
4222        END IF;
4223 
4224    END get_deliverable_version_id;
4225 
4226 
4227 -- SubProgram           : GET_DLVR_TASK_ASSCN_ID
4228 -- Type                 : UTIL FUNCTION
4229 -- Purpose              : This function returns the object_relationship_id of task and deliverable association
4230 -- Assumptions          : None
4231 
4232    FUNCTION GET_DLVR_TASK_ASSCN_ID
4233    (
4234       p_deliverable_id         IN NUMBER     ,
4235       p_task_id             IN NUMBER
4236    ) RETURN NUMBER
4237    IS
4238 
4239    l_dummy          pa_object_relationships.object_relationship_Id%TYPE;
4240 
4241     CURSOR  c_dlvr_task_asscn IS
4242     SELECT  obj.object_relationship_id
4243     FROM    PA_OBJECT_RELATIONSHIPS obj
4244     WHERE   OBJ.object_id_from2 = p_task_id
4245     AND     OBJ.object_id_to2 =p_deliverable_id
4246     AND     OBJ.object_type_to = 'PA_DELIVERABLES'
4247     AND     OBJ.object_type_from = 'PA_TASKS'
4248     AND     OBJ.relationship_type = 'A'
4249     AND     OBJ.relationship_subtype = 'TASK_TO_DELIVERABLE';
4250 
4251    BEGIN
4252        OPEN c_dlvr_task_asscn;
4253        FETCH c_dlvr_task_asscn into l_dummy ;
4254 
4255        IF c_dlvr_task_asscn%found THEN
4256           CLOSE c_dlvr_task_asscn;
4257           RETURN l_dummy;
4258        ELSE
4259           CLOSE c_dlvr_task_asscn;
4260           RETURN NULL;
4261        END IF;
4262 
4263    END GET_DLVR_TASK_ASSCN_ID;
4264 
4265 -- SubProgram           : IS_STATUS_CODE_VALID
4266 -- Type                 : UTIL FUNCTION
4267 -- Purpose              : This function will check whether the status code is valid
4268 -- Assumptions          : None
4269 
4270    FUNCTION IS_STATUS_CODE_VALID
4271    (
4272         p_status_code IN VARCHAR2
4273       , p_calling_mode IN VARCHAR2 := 'INSERT'
4274    )   RETURN VARCHAR2
4275    IS
4276 
4277    l_return_status  varchar2(1);
4278    l_dummy          varchar2(1);
4279 
4280    CURSOR c_status_code_exists IS
4281    SELECT 'X'
4282    FROM PA_PROJECT_STATUSES
4283    WHERE UPPER(project_status_code)  = UPPER(p_status_code)
4284    AND   UPPER(project_system_status_code) = DECODE(p_calling_mode, 'INSERT', 'DLVR_NOT_STARTED',project_system_status_code)
4285    AND   status_type = 'DELIVERABLE'
4286    AND   sysdate between nvl(start_date_active, sysdate) and nvl(end_date_active,sysdate);
4287 
4288    BEGIN
4289        OPEN c_status_code_exists;
4290        FETCH c_status_code_exists into l_dummy ;
4291        IF c_status_code_exists%found THEN
4292           l_return_status:='Y';
4293        ELSE
4294           l_return_status:='N';
4295        END IF;
4296        CLOSE c_status_code_exists;
4297 
4298    return l_return_status;
4299 
4300    END IS_STATUS_CODE_VALID;
4301 
4302    --====================================================================================
4303    --Name:               is_dlvr_reference_unique
4304    --Type:               procedure
4305    --Description:        Checking if deliverable_reference is passed or not. If passed is
4306    --                    unique or not
4307    --
4308    --Called subprograms: none
4309    --
4310    --
4311    --
4312    --History:
4313    --    19-AUG-1996        Puneet     Created
4314    --
4315    PROCEDURE is_dlvr_reference_unique
4316    (p_deliverable_reference IN VARCHAR2  := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4317    ,p_project_id         IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4318    ,x_unique_flag          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4319    ,x_return_status        OUT NOCOPY VARCHAR2                            ) --File.Sql.39 bug 4440895
4320 
4321    IS
4322 
4323       CURSOR l_dlvr_ref_csr
4324       IS
4325       SELECT  elem.proj_element_id, proj.segment1
4326       FROM    pa_proj_elements elem, pa_projects_all proj
4327       where   pm_source_reference = p_deliverable_reference
4328       and     elem.project_id = p_project_id
4329       and     elem.project_id = proj.project_id
4330       and     object_type = 'PA_DELIVERABLES';
4331 
4332       l_api_name      CONSTANT        VARCHAR2(30) := 'is_dlvr_reference_unique';
4333       l_deliverable_id                NUMBER ;
4334       l_dummy                         VARCHAR2(1);
4335 
4336       l_err_message             Fnd_New_Messages.Message_text%TYPE;  -- for AMG message
4337       l_project_number          Pa_Projects_All.Segment1%TYPE;
4338 
4339 
4340    BEGIN
4341 
4342        x_return_status :=  FND_API.G_RET_STS_SUCCESS;
4343 
4344        IF p_deliverable_reference <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4345           AND p_deliverable_reference IS NOT NULL
4346        THEN
4347            OPEN l_dlvr_ref_csr;
4348            FETCH l_dlvr_ref_csr INTO l_deliverable_id, l_project_number;
4349 
4350            IF l_dlvr_ref_csr%FOUND
4351            THEN
4352               IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
4353                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_DUP_DLVR_REFERENCE') ;
4354                   PA_UTILS.ADD_MESSAGE
4355                                (p_app_short_name => 'PA',
4356                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4357                                 p_token1         => 'PROJECT',
4358                                 p_value1         =>  l_project_number,
4359                                 p_token2         =>  'TASK',
4360                                 p_value2         =>  null,
4361                                 p_token3         => 'DLVR_REFERENCE',
4362                                 p_value3         =>  p_deliverable_reference,
4363                                 p_token4         => 'MESSAGE',
4364                                 p_value4         =>  l_err_message
4365                                );
4366           END IF;
4367           x_unique_flag := 'N';
4368           --RAISE FND_API.G_EXC_ERROR;  Commented bug 3651538 as Exception should not be raised as
4369           --                             it indicates that dlvr is to be updated.
4370            ELSE --l_dlvr_ref_csr%FOUND
4371           x_unique_flag := 'Y';
4372        END IF; --l_dlvr_ref_csr%FOUND
4373        CLOSE l_dlvr_ref_csr;
4374 
4375         ELSE
4376 
4377        IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
4378                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_DLVR_REF_AND_ID_MISSING') ;
4379                   PA_UTILS.ADD_MESSAGE
4380                                (p_app_short_name => 'PA',
4381                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4382                                 p_token1         => 'PROJECT',
4383                                 p_value1         =>  l_project_number,
4384                                 p_token2         =>  'TASK',
4385                                 p_value2         =>  null,
4386                                 p_token3         => 'DLVR_REFERENCE',
4387                                 p_value3         =>  p_deliverable_reference,
4388                                 p_token4         => 'MESSAGE',
4389                                 p_value4         =>  l_err_message
4390                                );
4391            END IF;
4392        x_unique_flag := Null;
4393            RAISE FND_API.G_EXC_ERROR;
4394 
4395         END IF; -- If p_deliverable_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4396 
4397 
4398    EXCEPTION
4399         WHEN FND_API.G_EXC_ERROR   THEN
4400             x_return_status := FND_API.G_RET_STS_ERROR;
4401 
4402         WHEN FND_API.G_EXC_UNEXPECTED_ERROR    THEN
4403             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4404 
4405         WHEN OTHERS THEN
4406             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4407             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4408                 FND_MSG_PUB.add_exc_msg
4409                                 ( p_pkg_name            => G_MODULE_NAME
4410                                 , p_procedure_name      => l_api_name   );
4411             END IF;
4412 
4413    END is_dlvr_reference_unique;
4414 
4415    --====================================================================================
4416    --Name:               convert_pm_dlvrref_to_id
4417    --Type:               Procedure
4418    --Description:        This procedure can be used to converse
4419    --                    an incoming deliverable reference to
4420    --                    a deliverable ID.
4421    --
4422    --Called subprograms: none
4423    --
4424    --
4425    --
4426    --History:
4427    --    19-AUG-1996        Puneet     Created
4428    --
4429    PROCEDURE Convert_pm_dlvrref_to_id
4430    (p_deliverable_reference IN VARCHAR2  := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4431    ,p_deliverable_id        IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4432    ,p_project_id            IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4433    ,p_out_deliverable_id    OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
4434    ,p_return_status         OUT NOCOPY VARCHAR2                            ) --File.Sql.39 bug 4440895
4435 
4436    IS
4437 
4438    CURSOR  l_dlvr_id_csr
4439    IS
4440    SELECT  'X'
4441    FROM    pa_proj_elements
4442    where   proj_element_id = p_deliverable_id
4443    and     project_id = p_project_id
4444    and     object_type = 'PA_DELIVERABLES';
4445 
4446    CURSOR l_dlvr_ref_csr
4447    IS
4448    SELECT  proj_element_id
4449    FROM    pa_proj_elements
4450    where   pm_source_reference = p_deliverable_reference
4451    and     project_id = p_project_id
4452    and     object_type = 'PA_DELIVERABLES';
4453 
4454    CURSOR  proj_num
4455    IS
4456    SELECT  segment1
4457    FROM    pa_projects_all
4458    WHERE   project_id = p_project_id;
4459 
4460    l_api_name      CONSTANT        VARCHAR2(30) := 'Convert_pm_dlvrref_to_id';
4461    l_deliverable_id                NUMBER ;
4462    l_dummy                         VARCHAR2(1);
4463    l_project_number          Pa_Projects_All.Segment1%TYPE;
4464 
4465    BEGIN
4466 
4467        p_return_status :=  FND_API.G_RET_STS_SUCCESS;
4468 
4469        OPEN proj_num;
4470        FETCH proj_num INTO l_project_number;
4471        CLOSE proj_num;
4472 
4473        IF p_deliverable_id <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4474        AND p_deliverable_id IS NOT NULL
4475        THEN
4476 
4477            --check validity of this ID
4478            OPEN l_dlvr_id_csr;
4479            FETCH l_dlvr_id_csr INTO l_dummy;
4480 
4481            IF l_dlvr_id_csr%NOTFOUND
4482            THEN
4483                IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4484                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_DLVR_ID_INVALID') ;
4485                   PA_UTILS.ADD_MESSAGE
4486                                (p_app_short_name => 'PA',
4487                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4488                                 p_token1         => 'PROJECT',
4489                                 p_value1         =>  l_project_number,
4490                                 p_token2         =>  'TASK',
4491                                 p_value2         =>  null,
4492                                 p_token3         => 'DLVR_REFERENCE',
4493                                 p_value3         =>  p_deliverable_reference,
4494                                 p_token4         => 'MESSAGE',
4495                                 p_value4         =>  l_err_message
4496                                );
4497                END IF;
4498                CLOSE l_dlvr_id_csr;
4499                RAISE FND_API.G_EXC_ERROR;
4500            END IF;
4501 
4502            CLOSE l_dlvr_id_csr;
4503            p_out_deliverable_id := p_deliverable_id;
4504 
4505        ELSIF  p_deliverable_reference <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4506           AND p_deliverable_reference IS NOT NULL
4507        THEN
4508 
4509            --check validity of this reference
4510            OPEN l_dlvr_ref_csr;
4511            FETCH l_dlvr_ref_csr INTO l_deliverable_id;
4512 
4513            IF l_dlvr_ref_csr%NOTFOUND
4514            THEN
4515               IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4516                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_DLVR_REF_INVALID') ;
4517                   PA_UTILS.ADD_MESSAGE
4518                                (p_app_short_name => 'PA',
4519                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4520                                 p_token1         => 'PROJECT',
4521                                 p_value1         =>  l_project_number,
4522                                 p_token2         =>  'TASK',
4523                                 p_value2         =>  null,
4524                                 p_token3         => 'DLVR_REFERENCE',
4525                                 p_value3         =>  p_deliverable_reference,
4526                                 p_token4         => 'MESSAGE',
4527                                 p_value4         =>  l_err_message
4528                                );
4529               END IF;
4530           CLOSE l_dlvr_ref_csr;
4531               RAISE FND_API.G_EXC_ERROR;
4532           END IF;
4533 
4534           CLOSE l_dlvr_ref_csr;
4535           p_out_deliverable_id := l_deliverable_id;
4536         ELSE
4537            IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
4538                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_DLVR_REF_AND_ID_MISSING') ;
4539                   PA_UTILS.ADD_MESSAGE
4540                                (p_app_short_name => 'PA',
4541                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4542                                 p_token1         => 'PROJECT',
4543                                 p_value1         =>  l_project_number,
4544                                 p_token2         => 'DLVR_REFERENCE',
4545                                 p_value2         =>  p_deliverable_reference,
4546                                 p_token3         => 'MESSAGE',
4547                                 p_value3         =>  l_err_message
4548                                );
4549            END IF;
4550            RAISE FND_API.G_EXC_ERROR;
4551 
4552         END IF; -- If p_deliverable_id <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4553 
4554    EXCEPTION
4555         WHEN FND_API.G_EXC_ERROR   THEN
4556             p_return_status := FND_API.G_RET_STS_ERROR;
4557 
4558         WHEN FND_API.G_EXC_UNEXPECTED_ERROR    THEN
4559             p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4560 
4561         WHEN OTHERS THEN
4562             p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4563             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4564                 FND_MSG_PUB.add_exc_msg
4565                                 ( p_pkg_name            => G_MODULE_NAME
4566                                 , p_procedure_name      => l_api_name   );
4567             END IF;
4568 
4569    END Convert_pm_dlvrref_to_id;
4570 
4571 -- SubProgram           : get_action_version_id
4572 -- Type                 : UTIL FUNCTION
4573 -- Purpose              : This function returns the action version id of an action
4574 -- Assumptions          : None
4575 
4576    FUNCTION get_action_version_id
4577    (
4578        p_action_id              IN NUMBER     ,
4579        p_structure_version_id  IN NUMBER     ,
4580        p_project_id             IN NUMBER
4581    ) RETURN NUMBER
4582    IS
4583 
4584    l_dummy          pa_proj_element_versions.element_version_id%TYPE;
4585 
4586    CURSOR c_action_version IS
4587    SELECT
4588        pev.element_version_id
4589    FROM
4590        pa_proj_elements ppe
4591       ,pa_proj_element_versions pev
4592    WHERE
4593     pev.proj_element_id    =  p_action_id
4594    AND  ppe.object_type        =  'PA_ACTIONS'
4595    AND  pev.object_type        =  'PA_ACTIONS'
4596    AND  ppe.proj_element_id    =  pev.proj_element_id
4597    AND  ppe.project_id         =  pev.project_id
4598    AND  ppe.project_id         =  p_project_id
4599    AND  nvl(pev.parent_structure_version_id,-99) = nvl(nvl(p_structure_version_id, pev.parent_structure_version_id),-99);
4600 
4601    BEGIN
4602        OPEN c_action_version;
4603        FETCH c_action_version into l_dummy ;
4604 
4605        IF c_action_version%found THEN
4606           CLOSE c_action_version;
4607           RETURN l_dummy;
4608        ELSE
4609           CLOSE c_action_version;
4610           RETURN NULL;
4611        END IF;
4612 
4613    END get_action_version_id;
4614 
4615 -- SubProgram           : is_action_reference_unique
4616 -- Type                 : UTIL FUNCTION
4617 -- Purpose              : Check if action_reference is passed or not. Is it unique or not
4618 -- Assumptions          : None
4619 
4620    PROCEDURE is_action_reference_unique
4621    (
4622        p_action_reference      IN VARCHAR2  :=PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4623       ,p_deliverable_id        IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4624       ,p_project_id            IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4625       ,x_unique_flag          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4626       ,x_return_status        OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4627     )
4628    IS
4629 
4630       CURSOR l_action_ref_csr
4631       IS
4632       SELECT  'X'
4633       FROM    pa_proj_elements  ppe,
4634               pa_object_relationships por
4635       WHERE   por.object_id_from2 = p_deliverable_id
4636       AND     object_id_to2 =ppe.proj_element_id
4637       AND     ppe.pm_source_reference = p_action_reference
4638       and     project_id = p_project_id
4639       and     object_type = 'PA_ACTIONS'
4640       and     object_type_from = 'PA_DELIVERABLES';
4641 
4642       CURSOR  proj_num   IS
4643       SELECT  proj.segment1
4644             , elem.name
4645       FROM    pa_projects_all proj
4646             , pa_proj_elements elem
4647       WHERE   proj.project_id = p_project_id
4648       AND     elem.project_id = proj.project_id
4649       AND     elem.object_type = 'PA_DELIVERABLES'
4650       AND     elem.proj_element_id = p_deliverable_id;
4651 
4652       l_api_name            CONSTANT        VARCHAR2(30) := 'is_action_reference_unique';
4653       l_action_id                           NUMBER ;
4654       l_dummy                               VARCHAR2(1);
4655       l_project_number                      Pa_Projects_All.Segment1%TYPE;
4656       l_deliverable_name                    Pa_proj_elements.name%TYPE;
4657 
4658    BEGIN
4659 
4660        x_return_status :=  FND_API.G_RET_STS_SUCCESS;
4661 
4662        OPEN proj_num;
4663        FETCH proj_num INTO l_project_number, l_deliverable_name;
4664        CLOSE proj_num;
4665 
4666        IF p_action_reference <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4667           AND p_action_reference IS NOT NULL
4668        THEN
4669            OPEN l_action_ref_csr;
4670            FETCH l_action_ref_csr INTO l_dummy;   -- 3749462 changed from l_action_id to l_dummy
4671 
4672            IF l_action_ref_csr%FOUND THEN
4673               IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4674                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_ACTION_REF_INVALID') ;
4675                   PA_UTILS.ADD_MESSAGE
4676                                (p_app_short_name => 'PA',
4677                                 p_msg_name       => 'PA_ACTION_VALID_ERR',
4678                                 p_token1         => 'PROJECT',
4679                                 p_value1         =>  l_project_number,
4680                                 p_token2         => 'DLVR_REFERENCE',
4681                                 p_value2         =>  l_deliverable_name,
4682                                 p_token3         => 'ACTION_REFERENCE',
4683                                 p_value3         =>  p_action_reference,
4684                                 p_token4         => 'MESSAGE',
4685                                 p_value4         =>  l_err_message
4686                                );
4687               END IF; -- fnd_msg_pub.g_msg_lvl_error
4688 
4689               CLOSE l_action_ref_csr;
4690               x_unique_flag := 'N';
4691               RAISE FND_API.G_EXC_ERROR;
4692 
4693           END IF; -- l_action_dlvr_relation%FOUND
4694           CLOSE l_action_ref_csr;
4695 
4696         ELSE -- p_action_reference IS NULL
4697             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
4698                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_ACTION_REF_AND_ID_MISSING') ;
4699                   PA_UTILS.ADD_MESSAGE
4700                                (p_app_short_name => 'PA',
4701                                 p_msg_name       => 'PA_ACTION_VALID_ERR',
4702                                 p_token1         => 'PROJECT',
4703                                 p_value1         =>  l_project_number,
4704                                 p_token2         => 'DLVR_REFERENCE',
4705                                 p_value2         =>  l_deliverable_name,
4706                                 p_token3         => 'ACTION_REFERENCE',
4707                                 p_value3         =>  p_action_reference,
4708                                 p_token4         => 'MESSAGE',
4709                                 p_value4         =>  l_err_message
4710                                );
4711             END IF;-- fnd_msg_pub.g_msg_lvl_error
4712 
4713             x_unique_flag := Null;
4714 
4715             RAISE FND_API.G_EXC_ERROR;
4716 
4717         END IF; -- p_action_reference IS NULL
4718 
4719         x_unique_flag := 'Y';
4720 
4721    EXCEPTION
4722         WHEN FND_API.G_EXC_ERROR   THEN
4723             x_return_status := FND_API.G_RET_STS_ERROR;
4724 
4725         WHEN FND_API.G_EXC_UNEXPECTED_ERROR    THEN
4726             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4727 
4728         WHEN OTHERS THEN
4729             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4730             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4731                 FND_MSG_PUB.add_exc_msg
4732                                 ( p_pkg_name            => G_MODULE_NAME
4733                                 , p_procedure_name      => l_api_name   );
4734             END IF;
4735 
4736    END is_action_reference_unique;
4737 
4738    --Name:               IS_FUNCTION_CODE_VALID
4739    --Type:               FUNCTION
4740    --Description:        This functions validate the function code based on lookup values
4741    --                    an action ID.
4742 
4743    FUNCTION IS_FUNCTION_CODE_VALID
4744    (
4745         p_function_code       IN VARCHAR2
4746    ) RETURN VARCHAR2
4747    IS
4748 
4749      CURSOR c_func_code  IS
4750      SELECT 'X'
4751      FROM   pa_lookups
4752      WHERE  lookup_type = 'PA_DLVR_ACTION_FUNCTION'
4753      AND    lookup_code = p_function_code;
4754 
4755      l_dummy VARCHAR2(1) := 'Y';
4756 
4757    BEGIN
4758 
4759        OPEN c_func_code;
4760        FETCH c_func_code into l_dummy;
4761 
4762        IF c_func_code%NOTFOUND THEN
4763       CLOSE c_Func_code;
4764           return 'N';
4765        ELSE
4766       CLOSE c_Func_code;
4767           return 'Y';
4768        END IF;
4769 
4770    END IS_FUNCTION_CODE_VALID;
4771 
4772    --Name:               convert_pm_actionref_to_id
4773    --Type:               Procedure
4774    --Description:        This procedure can be used to converse an incoming action reference to
4775    --                    an action ID.
4776 
4777     PROCEDURE Convert_pm_actionref_to_id
4778     (
4779        p_action_reference IN VARCHAR2  := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4780       ,p_action_id        IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4781       ,p_deliverable_id   IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4782       ,p_project_id       IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4783       ,p_out_action_id    OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
4784       ,p_return_status    OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4785     )
4786    IS
4787 
4788    CURSOR  l_action_id_csr
4789    IS
4790       SELECT  ppe.proj_element_id
4791       FROM    pa_proj_elements  ppe,
4792               pa_object_relationships por
4793       WHERE   por.object_id_from2 = p_deliverable_id
4794       AND     object_id_to2 = ppe.proj_element_id
4795       AND     ppe.proj_element_id = p_action_id
4796       and     ppe.project_id = p_project_id
4797       and     object_type = 'PA_ACTIONS'
4798       and     object_type_from = 'PA_DELIVERABLES';
4799 
4800    CURSOR  l_action_ref_csr
4801    IS
4802       SELECT  ppe.proj_element_id
4803       FROM    pa_proj_elements  ppe,
4804               pa_object_relationships por
4805       WHERE   por.object_id_from2 = p_deliverable_id
4806       AND     object_id_to2 = ppe.proj_element_id
4807       AND     ppe.pm_source_reference = p_action_reference
4808       and     ppe.project_id = p_project_id
4809       and     object_type = 'PA_ACTIONS'
4810       and     object_type_from = 'PA_DELIVERABLES';
4811 
4812       CURSOR  proj_num   IS
4813       SELECT  proj.segment1
4814             , elem.name
4815       FROM    pa_projects_all proj
4816             , pa_proj_elements elem
4817       WHERE   proj.project_id = p_project_id
4818       AND     elem.project_id = proj.project_id
4819       AND     elem.object_type = 'PA_DELIVERABLES'
4820       AND     elem.proj_element_id = p_deliverable_id;
4821 
4822 
4823    l_api_name      CONSTANT        VARCHAR2(30) := 'Convert_pm_dlvrref_to_id';
4824    l_action_id                     NUMBER ;
4825    l_dummy                         VARCHAR2(1);
4826    l_project_number          Pa_Projects_All.Segment1%TYPE;
4827    l_deliverable_name        Pa_proj_elements.name%TYPE;
4828 
4829    BEGIN
4830 
4831        p_return_status :=  FND_API.G_RET_STS_SUCCESS;
4832 
4833        OPEN proj_num;
4834        FETCH proj_num INTO l_project_number, l_deliverable_name;
4835        CLOSE proj_num;
4836 
4837        IF p_action_id <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4838        AND p_action_id IS NOT NULL
4839        THEN
4840 
4841            --check validity of this ID
4842            OPEN l_action_id_csr;
4843            FETCH l_action_id_csr INTO l_action_id;
4844 
4845            IF l_action_id_csr%NOTFOUND
4846            THEN
4847                IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4848                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_ACTION_ID_INVALID') ;
4849                   PA_UTILS.ADD_MESSAGE
4850                                (p_app_short_name => 'PA',
4851                                 p_msg_name       => 'PA_ACTION_VALID_ERR',
4852                                 p_token1         => 'PROJECT',
4853                                 p_value1         =>  l_project_number,
4854                                 p_token2         => 'DLVR_REFERENCE',
4855                                 p_value2         =>  l_deliverable_name,
4856                                 p_token3         => 'ACTION_REFERENCE',
4857                                 p_value3         =>  p_action_reference,
4858                                 p_token4         => 'MESSAGE',
4859                                 p_value4         =>  l_err_message
4860                                );
4861 
4862                    END IF;
4863                    CLOSE l_action_id_csr;
4864                    RAISE FND_API.G_EXC_ERROR;
4865            END IF;
4866 
4867            CLOSE l_action_id_csr;
4868            p_out_action_id := p_action_id;
4869 
4870        ELSIF  p_action_reference <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4871           AND p_action_reference IS NOT NULL
4872        THEN
4873 
4874            --check validity of this reference
4875            OPEN l_action_ref_csr;
4876            FETCH l_action_ref_csr INTO l_action_id;
4877 
4878            IF l_action_ref_csr%NOTFOUND
4879            THEN
4880               IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4881                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_ACTION_REF_INVALID') ;
4882                   PA_UTILS.ADD_MESSAGE
4883                                (p_app_short_name => 'PA',
4884                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4885                                 p_token1         => 'PROJECT',
4886                                 p_value1         =>  l_project_number,
4887                                 p_token2         => 'DLVR_REFERENCE',
4888                                 p_value2         =>  l_deliverable_name,
4889                                 p_token3         => 'ACTION_REFERENCE',
4890                                 p_value3         =>  p_action_reference,
4891                                 p_token4         => 'MESSAGE',
4892                                 p_value4         =>  l_err_message
4893                                );
4894               END IF;
4895 
4896               CLOSE l_action_ref_csr;
4897               RAISE FND_API.G_EXC_ERROR;
4898            END IF;
4899 
4900            CLOSE l_action_ref_csr;
4901            p_out_action_id := l_action_id;
4902         ELSE
4903            IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
4904                   l_err_message := FND_MESSAGE.GET_STRING('PA','PA_ACTION_REF_AND_ID_MISSING') ;
4905                   PA_UTILS.ADD_MESSAGE
4906                                (p_app_short_name => 'PA',
4907                                 p_msg_name       => 'PA_DLVR_VALID_ERR',
4908                                 p_token1         => 'PROJECT',
4909                                 p_value1         =>  l_project_number,
4910                                 p_token2         => 'DLVR_REFERENCE',
4911                                 p_value2         =>  l_deliverable_name,
4912                                 p_token3         => 'ACTION_REFERENCE',
4913                                 p_value3         =>  p_action_reference,
4914                                 p_token4         => 'MESSAGE',
4915                                 p_value4         =>  l_err_message
4916                                );
4917            END IF;
4918            RAISE FND_API.G_EXC_ERROR;
4919 
4920         END IF; -- If p_action_id <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4921 
4922    EXCEPTION
4923         WHEN FND_API.G_EXC_ERROR   THEN
4924             p_return_status := FND_API.G_RET_STS_ERROR;
4925 
4926         WHEN FND_API.G_EXC_UNEXPECTED_ERROR    THEN
4927             p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4928 
4929         WHEN OTHERS THEN
4930             p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4931             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4932                 FND_MSG_PUB.add_exc_msg
4933                                 ( p_pkg_name            => G_MODULE_NAME
4934                                 , p_procedure_name      => l_api_name   );
4935             END IF;
4936 
4937    END Convert_pm_actionref_to_id;
4938 
4939    --Name:               Progress_Enabled_Validation
4940    --Type:               Procedure
4941    --Description:        This procedure is used to modify/validate
4942    --                     completion date, status code, progress weight
4943    --                    based on progress enabled or not for a dlvr.
4944    --
4945    -- Logic :
4946    --   FOR CREATE
4947    --     Progress  Completion  Status                      Progress
4948    --     Enabled   Date        Code                        Weight
4949    --
4950    --         Y     Null        mapped to DLV_NOT_STARTED    User value
4951    --         N     Null        mapped to DLV_NOT_STARTED    Null
4952    --   FOR UPDATE
4953    --         Y     No updation  No updation                 User Value
4954    --         N     User Value   User Value                   Null
4955 
4956    PROCEDURE Progress_Enabled_Validation
4957    (
4958       p_deliverable_id         IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4959     , p_project_id             IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4960     , p_dlvr_type_id           IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4961     , px_actual_finish_date    IN OUT NOCOPY DATE --File.Sql.39 bug 4440895
4962     , px_progress_weight       IN OUT NOCOPY PA_PROJ_ELEMENTS.PROGRESS_WEIGHT%TYPE --File.Sql.39 bug 4440895
4963     , px_status_code           IN OUT NOCOPY Pa_task_types.initial_status_code%TYPE --File.Sql.39 bug 4440895
4964     , p_calling_Mode           IN VARCHAR2  := 'INSERT'
4965    ) IS
4966 
4967        Cursor C1 IS
4968        SELECT  completion_date, status_code
4969        FROM    pa_deliverables_v
4970        WHERE   project_id = p_project_id
4971        AND     proj_element_id = p_deliverable_id
4972        AND     dlvr_type_id = p_dlvr_type_id;
4973 
4974 
4975        l_dlvr_prg_enabled              VARCHAR2(1)     := NULL;
4976        l_dlvr_action_enabled           VARCHAR2(1)     := NULL;
4977        l_status_code            Pa_task_types.initial_status_code%TYPE := NULL;
4978 
4979    BEGIN
4980    -- Fetching information based on deliverable type
4981       PA_DELIVERABLE_UTILS.get_dlvr_type_info
4982       (
4983          p_dlvr_type_id              =>  p_dlvr_type_id,
4984          x_dlvr_prg_enabled          =>  l_dlvr_prg_enabled,
4985          x_dlvr_action_enabled       =>  l_dlvr_action_enabled,
4986          x_dlvr_default_status_code  =>  l_status_code
4987        );
4988 
4989      Pa_Debug.WRITE(g_module_name,'Progress_Enabled dlvr_type['||p_dlvr_type_id||']Prg Enabled[' ||l_dlvr_prg_enabled||
4990                      ']Action Enabled['||l_dlvr_action_enabled||']status['||l_status_code||']',l_debug_level3);
4991 
4992  -- Override the default status code in case passed by customer.
4993       IF px_status_code IS NOT NULL THEN
4994       l_status_code := px_status_code;
4995       END IF;
4996 
4997       IF (l_dlvr_prg_enabled = 'Y') THEN
4998 
4999          IF ( p_calling_mode = 'INSERT') THEN
5000              px_actual_finish_date := NULL;
5001              px_status_code        := l_status_code;
5002          px_progress_weight    := px_progress_weight;
5003      ELSE  --p_calling_mode = 'UPDATE'
5004          OPEN C1;
5005          FETCH C1 INTO  px_actual_finish_date , px_status_code;
5006          px_progress_weight    := px_progress_weight;
5007          CLOSE C1;
5008      END IF;  --p_calling_mode = 'INSERT'
5009 
5010       ELSE -- l_dlvr_prg_enabled = 'N'
5011 
5012          IF ( p_calling_mode = 'INSERT') THEN
5013              px_actual_finish_date := NULL;
5014              px_status_code        := l_status_code;
5015          px_progress_weight    := NULL;
5016      ELSE  --p_calling_mode = 'UPDATE'
5017              px_actual_finish_date := px_actual_finish_date;
5018              px_status_code        := l_status_code;
5019          px_progress_weight    := NULL;
5020      END IF;  --p_calling_mode = 'INSERT'
5021 
5022       END IF; -- l_dlvr_prg_enabled = 'Y'
5023    END Progress_Enabled_Validation;
5024 
5025    --Name:               enable_deliverable
5026    --Type:               Procedure
5027    --Description:        This api calls Pa_Project_Structure_Pub1 apis for
5028    --                    creating Structure, Structure Versions, Structure Version Attributes
5029 
5030    Procedure enable_deliverable(
5031     p_api_version            IN  NUMBER     := 1.0
5032    ,p_init_msg_list          IN  VARCHAR2    := FND_API.G_TRUE
5033    ,p_commit                 IN  VARCHAR2    := FND_API.G_FALSE
5034   , p_debug_mode             IN  VARCHAR2   := 'N'
5035   , p_validate_only          IN VARCHAR2  :=FND_API.G_TRUE
5036   , p_project_id             IN   Pa_Projects_All.project_id%TYPE
5037   , x_return_status          OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5038   , x_msg_count              OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
5039   , x_msg_data               OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5040   )IS
5041     Cursor C_name  IS
5042            SELECT  segment1||':Deliverable'
5043            FROM    pa_Projects_All
5044            WHERE   Project_id = p_Project_Id;
5045 
5046     l_name                      Pa_Proj_Elements.Name%TYPE;
5047     l_structure_id              Pa_Proj_Elements.Proj_Element_Id%TYPE;
5048     l_structure_version_id      Pa_Proj_Element_Versions.Element_Version_Id%TYPE;
5049     l_pev_structure_id          Pa_Proj_Element_Versions.Element_Version_Id%TYPE;
5050 
5051     l_api_name      CONSTANT  VARCHAR2(30)     := 'ENABLE_DELIVERABLES';
5052     l_msg_index_out              NUMBER;
5053     -- added for Bug:4537865
5054     l_new_msg_data 		 VARCHAR2(2000);
5055     -- added for Bug:4537865
5056 BEGIN
5057 
5058  --  Initialize the message table if requested.
5059     IF FND_API.TO_BOOLEAN( p_init_msg_list )  THEN
5060        FND_MSG_PUB.initialize;
5061     END IF;
5062 
5063     IF (p_commit = FND_API.G_TRUE) THEN
5064        savepoint CREATE_DELIVERABLE_PUB;
5065     END IF;
5066 
5067     IF p_debug_mode = 'Y' THEN
5068           PA_DEBUG.set_curr_function( p_function   => l_api_name,
5069                                       p_debug_mode => p_debug_mode );
5070           pa_debug.g_err_stage:= 'Inside '||l_api_name;
5071           pa_debug.write(g_module_name,pa_debug.g_err_stage,3) ;
5072      END IF;
5073 
5074    --  Set API return status to success
5075     x_return_status     := FND_API.G_RET_STS_SUCCESS;
5076 
5077      OPEN   C_name;
5078      FETCH  C_name INTO l_name;
5079      CLOSE  C_name;
5080 
5081      PA_PROJECT_STRUCTURE_PUB1.create_structure (
5082              p_api_version       => p_api_version
5083          ,   p_init_msg_list     => p_init_msg_list
5084          ,   p_commit            => p_commit
5085          ,   p_debug_mode        => p_debug_mode
5086          ,   p_validate_only     => p_validate_only
5087          ,   p_project_id        => p_project_id
5088          ,   p_calling_flag      => 'DELIVERABLE'
5089          ,   p_calling_module    => 'AMG'
5090          ,   p_structure_name    => l_name
5091          ,   p_structure_description  => l_name
5092          ,   x_return_status     => x_return_status
5093          ,   x_msg_count         => x_msg_count
5094          ,   x_msg_data          => x_msg_data
5095          ,   x_structure_id      => l_structure_Id
5096          );
5097 
5098      IF p_debug_mode = 'Y' THEN
5099            pa_debug.write(g_module_name,'PA_PROJECT_STRUCTURE_PUB1.create_structure Return Status ['||x_return_status||']Struc ID['||l_structure_id||']',3) ;
5100      END IF;
5101 
5102      IF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR     THEN
5103           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5104      ELSIF x_return_status = FND_API.G_RET_STS_ERROR     THEN
5105           RAISE FND_API.G_EXC_ERROR;
5106      END IF;
5107 
5108 
5109       PA_PROJECT_STRUCTURE_PUB1.Create_Structure_Version (
5110              p_api_version       => p_api_version
5111          ,   p_init_msg_list     => p_init_msg_list
5112          ,   p_commit            => p_commit
5113          ,   p_debug_mode        => p_debug_mode
5114          ,   p_validate_only     => p_validate_only
5115          ,   p_calling_module    => 'AMG'
5116          ,   p_structure_id      => l_structure_id
5117          ,   x_return_status     => x_return_status
5118          ,   x_msg_count         => x_msg_count
5119          ,   x_msg_data          => x_msg_data
5120          ,   x_structure_version_id => l_structure_version_id
5121          );
5122 
5123      IF p_debug_mode = 'Y' THEN
5124            pa_debug.write(g_module_name,'PA_PROJECT_STRUCTURE_PUB1.Create_Structure_Version Return Status ['||x_return_status||']Struc Vers ID['||l_structure_version_id||']',3) ;
5125      END IF;
5126 
5127      IF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR     THEN
5128           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5129      ELSIF x_return_status = FND_API.G_RET_STS_ERROR     THEN
5130           RAISE FND_API.G_EXC_ERROR;
5131      END IF;
5132 
5133 
5134       PA_PROJECT_STRUCTURE_PUB1.Create_Structure_Version_Attr (
5135              p_api_version            => p_api_version
5136          ,   p_init_msg_list          => p_init_msg_list
5137          ,   p_commit                 => p_commit
5138          ,   p_debug_mode             => p_debug_mode
5139          ,   p_validate_only          => p_validate_only
5140          ,   p_calling_module         => 'AMG'
5141          ,   p_structure_version_id   => l_structure_version_id
5142          ,   p_structure_version_name => l_name
5143          ,   p_structure_version_desc => l_name
5144          ,   p_change_reason_code     =>  null
5145          ,   x_pev_structure_id       => l_pev_structure_id
5146          ,   x_return_status          => x_return_status
5147          ,   x_msg_count              => x_msg_count
5148          ,   x_msg_data               => x_msg_data
5149          );
5150 
5151      IF p_debug_mode = 'Y' THEN
5152            pa_debug.write(g_module_name,'PA_PROJECT_STRUCTURE_PUB1.Create_Structure_Version_Attr Return Status ['||x_return_status||']Struc ID['||l_pev_structure_id||']',3) ;
5153      END IF;
5154 
5155      IF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR     THEN
5156           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5157      ELSIF x_return_status = FND_API.G_RET_STS_ERROR     THEN
5158           RAISE FND_API.G_EXC_ERROR;
5159      END IF;
5160 
5161      IF p_debug_mode = 'Y' THEN       --Added for bug 4945876
5162        pa_debug.reset_curr_function;
5163      END IF ;
5164 
5165 EXCEPTION
5166    WHEN FND_API.G_EXC_ERROR        THEN
5167       IF (p_commit = FND_API.G_TRUE) THEN
5168          ROLLBACK TO CREATE_DELIVERABLE_PUB;
5169       END IF;
5170       IF p_debug_mode = 'Y' THEN
5171           pa_debug.reset_curr_function;
5172           pa_debug.write(g_module_name,l_api_name||': Inside G_EXC_ERROR exception',5);
5173       END IF;
5174       x_return_status := FND_API.G_RET_STS_ERROR;
5175       x_msg_count := FND_MSG_PUB.count_msg;
5176 
5177       IF x_msg_count = 1 THEN
5178            PA_INTERFACE_UTILS_PUB.get_messages
5179                (p_encoded        => FND_API.G_FALSE,
5180                 p_msg_index      => 1,
5181                 p_msg_count      => x_msg_count,
5182                 p_msg_data       => x_msg_data,
5183             --  p_data           => x_msg_data, 	* commented for Bug: 4537865
5184 		p_data           => l_new_msg_data,     -- added for Bug: 4537865
5185                 p_msg_index_out  => l_msg_index_out);
5186 
5187 		 -- added for Bug: 4537865
5188 		x_msg_data := l_new_msg_data;
5189 		 -- added for Bug: 4537865
5190      END IF;
5191 
5192    WHEN FND_API.G_EXC_UNEXPECTED_ERROR        THEN
5193       IF (p_commit = FND_API.G_TRUE) THEN
5194          ROLLBACK TO CREATE_DELIVERABLE_PUB;
5195       END IF;
5196       IF p_debug_mode = 'Y' THEN
5197           pa_debug.reset_curr_function;
5198 
5199           pa_debug.write(g_module_name,l_api_name||': Inside G_EXC_UNEXPECTED_ERROR exception',5);
5200       END IF;
5201       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5202       x_msg_count := FND_MSG_PUB.count_msg;
5203 
5204       IF x_msg_count = 1 THEN
5205            PA_INTERFACE_UTILS_PUB.get_messages
5206                (p_encoded        => FND_API.G_FALSE,
5207                 p_msg_index      => 1,
5208                 p_msg_count      => x_msg_count,
5209                 p_msg_data       => x_msg_data,
5210          --     p_data           => x_msg_data,     * commented for Bug: 4537865
5211 		p_data           => l_new_msg_data, -- added for Bug: 4537865
5212                 p_msg_index_out  => l_msg_index_out);
5213 
5214 		-- added for Bug: 4537865
5215 		 x_msg_data := l_new_msg_data;
5216 		-- added for Bug: 4537865
5217 
5218      END IF;
5219 
5220    WHEN OTHERS THEN
5221       IF (p_commit = FND_API.G_TRUE) THEN
5222          ROLLBACK TO CREATE_DELIVERABLE_PUB;
5223       END IF;
5224       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5225       x_msg_count := 1;
5226       x_msg_data := SQLERRM;
5227 
5228       IF p_debug_mode = 'Y' THEN
5229           pa_debug.g_err_stage:=l_api_name||': Unexpected Error'||SQLERRM;
5230           pa_debug.write(g_module_name,pa_debug.g_err_stage,5);
5231           pa_debug.reset_curr_function;
5232       END IF;
5233 
5234 
5235    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)       THEN
5236        FND_MSG_PUB.add_exc_msg
5237                    ( p_pkg_name            => g_module_name
5238                    , p_procedure_name      => l_api_name   );
5239   END IF;
5240 END enable_deliverable;
5241 
5242 /* ==============3435905 : FP M : Deliverables Changes For AMG - END * =========================*/
5243 
5244 -- SubProgram           : IS_DLV_PROGRESSABLE
5245 -- Type                 : UTIL FUNCTION
5246 -- Purpose              : This function will check whether  the given delievrable has progress
5247 --                        entry allowed
5248 -- Note                 :
5249 -- Assumptions          : None
5250 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
5251 -- ---------------------------  ------------    -----------    ---------       ---------------------------
5252 --      p_project_id                     IN                  NUMBER              Project Id
5253 --      p_deliverable_id                 IN                  NUMBER              Deliverable Proj Element Id
5254 
5255 FUNCTION IS_DLV_PROGRESSABLE
5256 (
5257      p_project_id     IN NUMBER
5258     ,p_deliverable_id IN NUMBER
5259 )   RETURN VARCHAR2
5260 IS
5261 
5262 l_dummy          varchar2(1):='N';
5263 
5264 CURSOR c_dlv_type IS
5265 SELECT nvl(prog_entry_enable_flag,'N')
5266 from pa_proj_elements elem
5267 , pa_task_types dlvtype
5268 where elem.type_id = dlvtype.task_type_id
5269 and elem.proj_element_id = p_deliverable_id
5270 and elem.object_type = 'PA_DELIVERABLES'
5271 and elem.project_id = p_project_id;
5272 
5273 BEGIN
5274      OPEN c_dlv_type;
5275      FETCH c_dlv_type into l_dummy ;
5276      IF c_dlv_type%notfound THEN
5277        l_dummy:='N';
5278      END IF;
5279      CLOSE c_dlv_type;
5280 
5281 return l_dummy;
5282 
5283 END IS_DLV_PROGRESSABLE;
5284 
5285 -- SubProgram           : IS_STR_TASK_HAS_DELIVERABLES
5286 -- Type                 : UTIL FUNCTION
5287 -- Purpose              : This function will check whether  the given task has deliverables
5288 -- Note                 :
5289 -- Assumptions          : None
5290 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
5291 -- ---------------------------  ------------    -----------    ---------       ---------------------------
5292 --      p_str_task_id                    IN                  NUMBER              Proj Element Id of structure or task
5293 
5294 FUNCTION IS_STR_TASK_HAS_DELIVERABLES
5295 (
5296     p_str_task_id IN NUMBER
5297 )   RETURN VARCHAR2
5298 IS
5299 
5300 l_dummy          varchar2(1):='N';
5301 
5302 CURSOR c_task_dlvs IS
5303 SELECT 'Y'
5304 FROM dual
5305 WHERE exists
5306 (Select 'xyz'
5307 from pa_object_relationships
5308 where object_id_from2 = p_str_task_id
5309 and relationship_type = 'A'
5310 and relationship_subtype IN ('STRUCTURE_TO_DELIVERABLE', 'TASK_TO_DELIVERABLE')
5311 );
5312 
5313 BEGIN
5314      OPEN c_task_dlvs;
5315      FETCH c_task_dlvs into l_dummy ;
5316      IF c_task_dlvs%found THEN
5317        l_dummy:='Y';
5318      ELSE
5319        l_dummy:='N';
5320      END IF;
5321 
5322      CLOSE c_task_dlvs;
5323 
5324 return l_dummy;
5325 
5326 END IS_STR_TASK_HAS_DELIVERABLES;
5327 
5328 -- SubProgram           : GET_TASK_DATES ( 3442451 )
5329 -- Type                 : UTIL FUNCTION
5330 -- Purpose              : This function will retrun date ( i.e. schedule_start_date / schedule_finish_date /
5331 --                        actual_start_date / actual_finish_date / earliest_start_date / earliest_finish_date )
5332 --                        based on p_date_type parameter
5333 -- Note                 :
5334 -- Assumptions          : None
5335 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
5336 -- ---------------------------  ------------    -----------    ---------       ---------------------------
5337 -- p_project_id                    IN               NUMBER       Yes           Project Id
5338 -- p_date_type                     IN               VARCHAR2     Yes           Date Type
5339 -- p_task_id                       IN               NUMBER       Yes           proj element id of task
5340 
5341 FUNCTION GET_TASK_DATES
5342 (
5343      p_project_id           IN NUMBER
5344     ,p_date_type            IN VARCHAR2
5345     ,p_task_id              IN NUMBER
5346 )  RETURN DATE
5347 IS
5348 
5349 
5350 -- 3578694 removed the cursor
5351 -- as PA_PROJ_ELEMENT_VERSIONS had join with object relationship table
5352 -- and one of the where condition was checking the structure_to_task relationship subtype
5353 -- so for child tasks, above condition is failing
5354 
5355 --cursor c_task_exists(l_struct_ver_id IN NUMBER) IS
5356 --    SELECT
5357 --           PEV.ELEMENT_VERSION_ID
5358 --    FROM
5359 --           PA_OBJECT_RELATIONSHIPS POR
5360 --           ,PA_PROJ_ELEMENT_VERSIONS PEV
5361 --    WHERE
5362 --           POR.OBJECT_ID_FROM1 = l_struct_ver_id
5363 --       AND PEV.PROJ_ELEMENT_ID = p_task_id
5364 --       AND POR.OBJECT_ID_TO1 = PEV.ELEMENT_VERSION_ID
5365 --       AND POR.OBJECT_TYPE_FROM = 'PA_STRUCTURES'
5366 --       AND POR.OBJECT_TYPE_TO = 'PA_TASKS'
5367 --       AND POR.RELATIONSHIP_SUBTYPE = 'STRUCTURE_TO_TASK';
5368 
5369 -- 3578694 cursor will return task element version id for the
5370 -- passed structure version id
5371 cursor c_task_exists(l_struct_ver_id IN NUMBER) IS
5372     SELECT
5373            PEV.ELEMENT_VERSION_ID
5374     FROM
5375            PA_PROJ_ELEMENT_VERSIONS PEV
5376     WHERE
5377            PEV.PARENT_STRUCTURE_VERSION_ID = l_struct_ver_id
5378        AND PEV.PROJ_ELEMENT_ID = p_task_id
5379        AND PEV.PROJECT_ID = p_project_id;
5380 
5381 CURSOR c_task_info(l_task_ver_id IN NUMBER) IS
5382     SELECT
5383             SCHEDULED_START_DATE
5384            ,SCHEDULED_FINISH_DATE
5385            ,ACTUAL_START_DATE
5386            ,ACTUAL_FINISH_DATE
5387            ,EARLY_START_DATE
5388            ,EARLY_FINISH_DATE
5389     FROM
5390            PA_PROJ_ELEM_VER_SCHEDULE
5391     WHERE
5392            ELEMENT_VERSION_ID = l_task_ver_id ;
5393 
5394          /*AND  PROJECT_ID = p_project_id Commented Unwanted Join 3614361 */
5395 
5396 l_date                              DATE := NULL;
5397 
5398 l_latest_pub_wp_struct_id           NUMBER := NULL;
5399 l_current_working_wp_struct_id      NUMBER := NULL;
5400 l_wp_struct_id                      NUMBER := NULL;
5401 
5402 l_task_ver_id                       NUMBER := NULL;
5403 
5404 is_task_in_published_ver            VARCHAR(1) := 'N';
5405 is_task_in_curnt_wrkng_ver          VARCHAR(1) := 'N';
5406 
5407 c_task_rec c_task_exists%rowtype;
5408 c_task_date_rec c_task_info%rowtype;
5409 
5410 BEGIN
5411 
5412     -- retrieve published wp structure version id
5413 
5414     l_latest_pub_wp_struct_id := PA_PROJ_ELEMENTS_UTILS.latest_published_ver_id(p_project_id);
5415 
5416     -- check whether task exists for published wp structure
5417     -- if yes
5418     --     retrieve task version id, set is_task_in_published_ver to 'Y' and task version id in local variable
5419     -- else
5420     --     retrieve current working wp structure version id
5421     --     if yes retrieve task version id,
5422     --        set is_task_in_published_ver to 'Y' and task version id in local variible
5423     --     end if
5424     -- end if
5425     -- if task_vers_id retrieved is not null , i.e. task is either in published or current working
5426     --    retrieve the required dates for the task version id based on date type variable value
5427     -- else
5428     --    return null value
5429     -- end if
5430 
5431     -- 3578694 added if condition for checking l_latest_pub_wp_struct_id for NULL
5432     -- if l_latest_pub_wp_struct_id is null, set is_task_in_published_ver to 'N'
5433     -- and do not check for task existance for that particular structure version
5434 
5435     IF l_latest_pub_wp_struct_id IS NULL THEN
5436         is_task_in_published_ver := 'N';
5437     ELSE
5438 
5439         OPEN c_task_exists(l_latest_pub_wp_struct_id);
5440         FETCH c_task_exists into c_task_rec;
5441 
5442         IF c_task_exists%NOTFOUND THEN
5443             is_task_in_published_ver := 'N';
5444         ELSE
5445             is_task_in_published_ver := 'Y';
5446             l_task_ver_id := c_task_rec.ELEMENT_VERSION_ID;
5447         END IF;
5448 
5449         CLOSE c_task_exists;
5450     END IF;
5451 
5452     IF is_task_in_published_ver = 'N' THEN
5453         l_current_working_wp_struct_id := PA_PROJECT_STRUCTURE_UTILS.get_current_working_ver_id(p_project_id);
5454 
5455         OPEN c_task_exists(l_current_working_wp_struct_id);
5456         FETCH c_task_exists into c_task_rec ;
5457 
5458         IF c_task_exists%notfound THEN
5459             is_task_in_curnt_wrkng_ver := 'N';
5460         ELSE
5461             is_task_in_curnt_wrkng_ver := 'Y';
5462             l_task_ver_id := c_task_rec.ELEMENT_VERSION_ID;
5463         END IF;
5464 
5465         CLOSE c_task_exists;
5466     END IF;
5467 
5468     IF l_task_ver_id IS NOT NULL THEN
5469         OPEN c_task_info(l_task_ver_id);
5470         FETCH c_task_info into c_task_date_rec ;
5471         CLOSE c_task_info;
5472 
5473         IF p_date_type = 'SCH_START_DATE' THEN
5474             l_date := c_task_date_rec.SCHEDULED_START_DATE;
5475         ELSIF p_date_type = 'SCH_FINISH_DATE' THEN
5476             l_date := c_task_date_rec.SCHEDULED_FINISH_DATE;
5477         ELSIF p_date_type = 'ACT_START_DATE' THEN
5478             l_date := c_task_date_rec.ACTUAL_START_DATE;
5479         ELSIF p_date_type = 'ACT_FINISH_DATE' THEN
5480             l_date := c_task_date_rec.ACTUAL_FINISH_DATE;
5481         ELSIF p_date_type = 'EARLY_START_DATE' THEN
5482             l_date := c_task_date_rec.EARLY_START_DATE;
5483         ELSIF p_date_type = 'EARLY_FINISH_DATE' THEN
5484             l_date := c_task_date_rec.EARLY_FINISH_DATE;
5485         ELSE
5486             l_date := NULL;
5487         END IF;
5488     END IF;
5489 
5490     return l_date;
5491 
5492 END GET_TASK_DATES;
5493 
5494 FUNCTION IS_DLV_BASED_TASK_EXISTS
5495 (
5496     p_project_id IN NUMBER
5497 )   RETURN VARCHAR2
5498 IS
5499   CURSOR dlv_based_task IS
5500   SELECT 'Y'
5501     FROM dual
5502   WHERE EXISTS ( SELECT 'Y'
5503                    FROM pa_proj_elements
5504                    WHERE base_percent_comp_deriv_code = 'DELIVERABLE'
5505                      AND object_type = 'PA_TASKS'
5506                      AND project_id = p_project_id);
5507  l_dummy VARCHAR2(1) := 'N' ;
5508 BEGIN
5509    OPEN dlv_based_task ;
5510   FETCH dlv_based_task INTO l_dummy ;
5511   CLOSE dlv_based_task ;
5512 
5513   RETURN l_dummy ;
5514 END IS_DLV_BASED_TASK_EXISTS ;
5515 
5516 FUNCTION IS_DELIVERABLES_DEFINED
5517 (
5518     p_project_id IN NUMBER
5519 )   RETURN VARCHAR2
5520 IS
5521  CURSOR is_dlv_exists IS
5522   SELECT 'Y'
5523     FROM dual
5524   WHERE EXISTS ( SELECT 'Y'
5525                    FROM pa_proj_elements
5526                    WHERE object_type = 'PA_DELIVERABLES'
5527                      AND project_id = p_project_id);
5528  l_dummy VARCHAR2(1) := 'N' ;
5529 BEGIN
5530 
5531   OPEN is_dlv_exists ;
5532   FETCH is_dlv_exists INTO l_dummy ;
5533   CLOSE is_dlv_exists ;
5534 
5535   RETURN l_dummy ;
5536 END IS_DELIVERABLES_DEFINED ;
5537 
5538 FUNCTION CHECK_USER_VIEW_DLV_PRIVILEGE
5539 (
5540     p_project_id IN NUMBER
5541 )   RETURN VARCHAR2
5542 IS
5543 l_ret_code VARCHAR2(1) ;
5544 BEGIN
5545 l_ret_code := PA_SECURITY_PVT.check_user_privilege
5546   ( p_privilege    => 'PA_DELIVERABLE_VIEW'
5547    ,p_object_name  => 'PA_PROJECTS'
5548    ,p_object_key   => p_project_id
5549    ) ;
5550 RETURN l_ret_code ;
5551 END CHECK_USER_VIEW_DLV_PRIVILEGE;
5552 
5553 
5554 PROCEDURE GET_DEFAULT_TASK
5555 (
5556     p_dlv_element_id    IN  NUMBER
5557    ,p_dlv_version_id    IN  NUMBER
5558    ,p_project_id        IN  NUMBER
5559    ,x_oke_task_id       OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
5560    ,x_oke_task_name     OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5561    ,x_oke_task_number   OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5562    ,x_bill_task_id      OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
5563    ,x_bill_task_name    OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5564    ,x_bill_task_number  OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5565    ,x_return_status     OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5566    ,x_msg_count         OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
5567    ,x_msg_data          OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5568 )
5569 IS
5570   -- This cursor will return the fin. task id which are mapped to WP
5571   -- task which are associated to give deliverable for SPLIT
5572   -- MAPPING setup.
5573 
5574   -- 3586196 changed cursor for where conditions and
5575   -- added task name number column
5576   CURSOR split_mapping(c_parent_struct_ver_id IN NUMBER) IS
5577   SELECT distinct  pt.task_id
5578                   ,pt.task_name
5579                   ,pt.task_number
5580     FROM pa_tasks pt
5581         ,pa_proj_element_versions pev1
5582         ,pa_proj_element_versions pev2
5583         ,pa_object_relationships obj1
5584         ,pa_object_relationships obj2
5585    WHERE obj1.object_id_to2 = p_dlv_element_id
5586      AND obj1.relationship_type = 'A'
5587      AND obj1.relationship_subtype = 'TASK_TO_DELIVERABLE'
5588      AND obj1.object_type_from = 'PA_TASKS'
5589      AND obj1.object_type_to = 'PA_DELIVERABLES'
5590      AND pev1.proj_element_id = obj1.object_id_from2
5591      AND pev1.parent_structure_version_id = c_parent_struct_ver_id
5592      AND pev1.project_id = p_project_id
5593      AND obj2.object_id_from1 = pev1.element_version_id
5594      AND obj2.relationship_type = 'M'
5595      AND pev2.element_version_id = obj2.object_id_to1
5596      AND pt.project_id = p_project_id
5597      AND pt.task_id = pev2.proj_element_id
5598      AND pt.chargeable_flag = 'Y' ;
5599 
5600   -- This cursor will return the fin. task id in PARTLY /FULLY
5601   -- SHARED structure
5602   CURSOR share_partial_or_full(c_parent_struct_ver_id IN NUMBER) IS
5603   SELECT distinct  pt.task_id
5604                    ,pt.task_name
5605                    ,pt.task_number
5606     FROM pa_tasks pt
5607         ,pa_proj_element_versions pev
5608         ,pa_object_relationships obj
5609    WHERE obj.object_id_to2 = p_dlv_element_id
5610      AND obj.relationship_type = 'A'
5611      AND obj.relationship_subtype = 'TASK_TO_DELIVERABLE'
5612      AND obj.object_type_from = 'PA_TASKS'
5613      AND obj.object_type_to = 'PA_DELIVERABLES'
5614      AND pev.proj_element_id = obj.object_id_from2
5615      AND pev.parent_structure_version_id = c_parent_struct_ver_id
5616      AND pev.project_id = p_project_id
5617      AND pev.proj_element_id = pt.task_id
5618      AND pt.project_id = p_project_id
5619      AND pt.chargeable_flag = 'Y' ;
5620 
5621 
5622   -- This cursor will return the fin. top task id which are
5623   -- mapped to WP task which are associated to give deliver
5624   -- able for SPLIT MAPPING setup.
5625   CURSOR split_mapping_bill(c_parent_struct_ver_id IN NUMBER) IS
5626   SELECT distinct  pt.top_task_id
5627                    ,pt1.task_name
5628                    ,pt1.task_number
5629     FROM pa_tasks pt
5630         ,pa_proj_element_versions pev1
5631         ,pa_proj_element_versions pev2
5632         ,pa_object_relationships obj1
5633         ,pa_object_relationships obj2
5634         ,pa_tasks pt1
5635    WHERE obj1.object_id_to2 = p_dlv_element_id
5636      AND obj1.relationship_type = 'A'
5637      AND obj1.relationship_subtype = 'TASK_TO_DELIVERABLE'
5638      AND obj1.object_type_from = 'PA_TASKS'
5639      AND obj1.object_type_to = 'PA_DELIVERABLES'
5640      AND pev1.proj_element_id = obj1.object_id_from2
5641      AND pev1.parent_structure_version_id = c_parent_struct_ver_id
5642      AND pev1.project_id = p_project_id
5643      AND obj2.object_id_from1 = pev1.element_version_id
5644      AND obj2.relationship_type = 'M'
5645      AND pev2.element_version_id = obj2.object_id_to1
5646      AND pt.project_id = p_project_id
5647      AND pt.task_id = pev2.proj_element_id
5648      AND pt1.task_id = pt.top_task_id
5649      AND pt1.project_id = p_project_id;
5650 
5651   -- This cursor will return the fin. top task id which in PARTLY/FULLY
5652   -- SHARED STRUCTURE
5653   CURSOR share_partial_or_full_bill(c_parent_struct_ver_id IN NUMBER) IS
5654   SELECT distinct  pt.top_task_id
5655                    ,pt1.task_name
5656                    ,pt1.task_number
5657     FROM pa_tasks pt
5658         ,pa_proj_element_versions pev
5659         ,pa_object_relationships obj
5660         ,pa_tasks pt1
5661    WHERE obj.object_id_to2 = p_dlv_element_id
5662      AND obj.relationship_type = 'A'
5663      AND obj.relationship_subtype = 'TASK_TO_DELIVERABLE'
5664      AND obj.object_type_from = 'PA_TASKS'
5665      AND obj.object_type_to = 'PA_DELIVERABLES'
5666      AND pev.proj_element_id = obj.object_id_from2
5667      AND pev.parent_structure_version_id = c_parent_struct_ver_id
5668      AND pev.project_id = p_project_id
5669      AND pev.proj_element_id = pt.task_id
5670      AND pt.project_id = p_project_id
5671      AND pt1.task_id = pt.top_task_id
5672      AND pt1.project_id = p_project_id;
5673 
5674 
5675 i                    NUMBER ;
5676 l_share_type         VARCHAR2(30) := null ;
5677 l_struct_version_id  NUMBER := null ;
5678 l_debug_mode         VARCHAR2(1) ;
5679 
5680 BEGIN
5681 
5682 x_msg_count := 0;
5683 x_return_status := FND_API.G_RET_STS_SUCCESS;
5684 l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
5685 
5686 IF l_debug_mode = 'Y' THEN
5687      PA_DEBUG.set_curr_function( p_function   => 'GET_DEFAULT_TASK'
5688                                 ,p_debug_mode => l_debug_mode );
5689      pa_debug.g_err_stage:= 'Inside GET_DEFAULT_TASK ';
5690      pa_debug.write(g_module_name,pa_debug.g_err_stage,3) ;
5691 END IF;
5692 
5693 l_share_type := PA_PROJ_TASK_STRUC_PUB.GET_SHARE_TYPE(p_project_id => p_project_id );
5694 
5695 -- 3586196 added debug statements
5696 
5697 IF l_debug_mode = 'Y' THEN
5698      pa_debug.write(g_module_name,'l_share_type: ' || l_share_type,3);
5699 END IF;
5700 
5701 -- First get the current working version. If its not available get the latest published version.
5702 l_struct_version_id := PA_PROJECT_STRUCTURE_UTILS.GET_CURRENT_WORKING_VER_ID(p_project_id => p_project_id) ;
5703 
5704 IF l_debug_mode = 'Y' THEN
5705      pa_debug.write(g_module_name,'l_struct_version_id: ' || l_struct_version_id,3);
5706 END IF;
5707 
5708 If nvl(l_struct_version_id,-99)=-99 THEN
5709      l_struct_version_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION(p_project_id => p_project_id) ;
5710 END IF ;
5711 
5712 IF l_debug_mode = 'Y' THEN
5713      pa_debug.write(g_module_name,'l_struct_version_id: ' || l_struct_version_id,3);
5714 END IF;
5715 
5716 IF l_share_type = 'SPLIT_MAPPING' THEN
5717 
5718      -- Get the default task id for OKE
5719      OPEN split_mapping(l_struct_version_id) ;
5720      i:=0 ;
5721      LOOP
5722           i:=i+1 ;
5723           FETCH split_mapping INTO x_oke_task_id, x_oke_task_name, x_oke_task_number ;
5724      EXIT WHEN (split_mapping%NOTFOUND OR i>2) ;
5725      END LOOP;
5726      CLOSE split_mapping ;
5727 
5728      IF l_debug_mode = 'Y' THEN
5729         pa_debug.write(g_module_name,'i: ' || i,3);
5730      END IF;
5731 
5732      IF i>2 THEN
5733           x_oke_task_id := null ;
5734           x_oke_task_name := null;
5735           x_oke_task_number := null;
5736      END IF ;
5737 
5738      -- Get the default task id for BILLING
5739      OPEN split_mapping_bill(l_struct_version_id) ;
5740      i:=0 ;
5741      LOOP
5742           i:=i+1 ;
5743           FETCH split_mapping_bill INTO x_bill_task_id, x_bill_task_name, x_bill_task_number ;
5744      EXIT WHEN (split_mapping_bill%NOTFOUND OR i>2) ;
5745      END LOOP;
5746      CLOSE split_mapping_bill ;
5747 
5748      IF l_debug_mode = 'Y' THEN
5749         pa_debug.write(g_module_name,'i: ' || i,3);
5750      END IF;
5751 
5752      IF i>2 THEN
5753           x_bill_task_id := null ;
5754           x_bill_task_name := null;
5755      END IF ;
5756 
5757 ELSIF l_share_type IN ('SHARE_PARTIAL','SHARE_FULL')  THEN
5758 
5759      -- Get the default task id for OKE
5760      OPEN share_partial_or_full(l_struct_version_id) ;
5761      i:=0 ;
5762      LOOP
5763           i:=i+1 ;
5764           FETCH share_partial_or_full INTO x_oke_task_id, x_oke_task_name, x_oke_task_number ;
5765      EXIT WHEN (share_partial_or_full%NOTFOUND OR i>2) ;
5766      END LOOP;
5767      CLOSE share_partial_or_full ;
5768 
5769      IF i>2 THEN
5770           x_oke_task_id := null ;
5771           x_oke_task_name := null;
5772           x_oke_task_number := null;
5773      END IF ;
5774 
5775      IF l_debug_mode = 'Y' THEN
5776         pa_debug.write(g_module_name,'i: ' || i,3);
5777      END IF;
5778 
5779      -- Get the default task id for BILLING
5780      OPEN share_partial_or_full_bill(l_struct_version_id) ;
5781      i:=0 ;
5782      LOOP
5783           i:=i+1 ;
5784           FETCH share_partial_or_full_bill INTO x_bill_task_id, x_bill_task_name, x_bill_task_number ;
5785      EXIT WHEN (share_partial_or_full_bill%NOTFOUND OR i>2) ;
5786      END LOOP;
5787      CLOSE share_partial_or_full_bill ;
5788 
5789      IF l_debug_mode = 'Y' THEN
5790         pa_debug.write(g_module_name,'i: ' || i,3);
5791      END IF;
5792 
5793      IF i>2 THEN
5794           x_bill_task_id := null ;
5795           x_bill_task_name := null;
5796           x_bill_task_number := null;
5797      END IF ;
5798 
5799 END IF ;
5800 
5801  IF l_debug_mode = 'Y' THEN
5802     pa_debug.write(g_module_name,'x_oke_task_id: ' || x_oke_task_id,3);
5803     pa_debug.write(g_module_name,'x_oke_task_name: ' || x_oke_task_name,3);
5804     pa_debug.write(g_module_name,'x_oke_task_number: ' || x_oke_task_number,3);
5805     pa_debug.write(x_bill_task_id,'x_bill_task_id: ' || x_bill_task_id,3);
5806     pa_debug.write(g_module_name,'x_bill_task_name: ' || x_bill_task_name,3);
5807     pa_debug.write(g_module_name,'x_bill_task_number: ' || x_bill_task_number,3);
5808  END IF;
5809 
5810 
5811 IF l_debug_mode = 'Y' THEN
5812       pa_debug.g_err_stage:= 'Exiting GET_DEFAULT_TASK' ;
5813       pa_debug.write(g_module_name,pa_debug.g_err_stage,3);
5814       pa_debug.reset_curr_function;
5815 END IF;
5816 EXCEPTION
5817 WHEN OTHERS THEN
5818      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5819      x_msg_count     := 1;
5820      x_msg_data      := SQLERRM;
5821 
5822      FND_MSG_PUB.add_exc_msg( p_pkg_name=> 'PA_DELIVERABLE_UTILS'
5823                      ,p_procedure_name  => 'GET_DEFAULT_TASK');
5824 
5825      IF l_debug_mode = 'Y' THEN
5826           pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
5827           pa_debug.write('GET_DEFAULT_TASK: ' || g_module_name,pa_debug.g_err_stage,5);
5828           pa_debug.reset_curr_function;
5829      END IF;
5830      RAISE;
5831 END GET_DEFAULT_TASK;
5832 
5833 
5834 
5835 -- SubProgram           : IS_SHIPPING_INITIATED ( 3555460 )
5836 -- Type                 : UTIL FUNCTION
5837 -- Purpose              : This function will 'Y' if shipping is initiated for deliverable
5838 --                        'N' if shipping is not initiated
5839 -- Note                 :
5840 -- Assumptions          : None
5841 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
5842 -- ---------------------------  ------------    -----------    ---------       ---------------------------
5843 -- p_dlv_element_id                IN               NUMBER       Yes           Deliverale Element ID
5844 -- p_dlv_version_id                IN               NUMBER       Yes           Deliverable Version Id
5845 
5846 FUNCTION IS_SHIPPING_INITIATED
5847      (
5848           p_dlv_element_id IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
5849           ,p_dlv_version_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
5850      )   RETURN VARCHAR2
5851 IS
5852      CURSOR ship_flag_dlv IS
5853      SELECT 'Y'
5854        FROM dual
5855      WHERE EXISTS ( SELECT 'Y'
5856                       FROM  pa_object_relationships obj
5857                            ,pa_proj_element_versions ver
5858                       WHERE obj.object_id_from2 = p_dlv_element_id
5859                         AND obj.object_type_to = 'PA_ACTIONS'
5860                         AND obj.object_type_from = 'PA_DELIVERABLES'
5861                         AND obj.object_id_to2 = ver.proj_element_id
5862                         AND obj.relationship_type = 'A'
5863                         AND obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
5864                         AND nvl(OKE_DELIVERABLE_UTILS_PUB.WSH_Initiated_Yn(ver.element_version_id),'N') = 'Y'
5865                   ) ;
5866 l_dummy VARCHAR2(1) := 'N' ;
5867 l_return_status VARCHAR2(1) := 'N' ;
5868 BEGIN
5869      OPEN ship_flag_dlv;
5870      FETCH ship_flag_dlv into l_dummy ;
5871      IF ship_flag_dlv%found THEN
5872        l_return_status:='Y';
5873      ELSE
5874        l_return_status:='N';
5875      END IF;
5876      CLOSE ship_flag_dlv;
5877 return l_return_status;
5878 END IS_SHIPPING_INITIATED ;
5879 
5880 -- SubProgram           : IS_PROCUREMENT_INITIATED ( 3555460 )
5881 -- Type                 : UTIL FUNCTION
5882 -- Purpose              : This function will 'Y' if procurement is initiated for deliverable
5883 --                        'N' if procurement is not initiated
5884 -- Note                 :
5885 -- Assumptions          : None
5886 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
5887 -- ---------------------------  ------------    -----------    ---------       ---------------------------
5888 -- p_dlv_element_id                IN               NUMBER       Yes           Deliverale Element ID
5889 -- p_dlv_version_id                IN               NUMBER       Yes           Deliverable Version Id
5890 
5891 
5892 FUNCTION IS_PROCUREMENT_INITIATED
5893      (
5894           p_dlv_element_id IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
5895           ,p_dlv_version_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
5896      )   RETURN VARCHAR2
5897 IS
5898      CURSOR proc_flag_dlv IS
5899      SELECT 'Y'
5900        FROM dual
5901      WHERE EXISTS ( SELECT 'Y'
5902                       FROM  pa_object_relationships obj
5903                            ,pa_proj_element_versions ver
5904                       WHERE obj.object_id_from2 = p_dlv_element_id
5905                         AND obj.object_type_to = 'PA_ACTIONS'
5906                         AND obj.object_type_from = 'PA_DELIVERABLES'
5907                         AND obj.object_id_to2 = ver.proj_element_id
5908                         AND obj.relationship_type = 'A'
5909                         AND obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
5910                         AND nvl(OKE_DELIVERABLE_UTILS_PUB.REQ_Initiated_Yn(ver.element_version_id),'N') = 'Y'
5911                   ) ;
5912 l_dummy VARCHAR2(1) := 'N' ;
5913 l_return_status VARCHAR2(1) := 'N' ;
5914 BEGIN
5915      OPEN proc_flag_dlv;
5916      FETCH proc_flag_dlv into l_dummy ;
5917      IF proc_flag_dlv%found THEN
5918        l_return_status:='Y';
5919      ELSE
5920        l_return_status:='N';
5921      END IF;
5922      CLOSE proc_flag_dlv;
5923 return l_return_status;
5924 END IS_PROCUREMENT_INITIATED ;
5925 
5926 -- SubProgram           : IS_BILLING_EVENT_PROCESSED ( 3555460 )
5927 -- Type                 : UTIL FUNCTION
5928 -- Purpose              : This function will 'Y' if billing event  is processed for deliverable
5929 --                        'N' if billing event is not processed
5930 -- Note                 :
5931 -- Assumptions          : None
5932 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
5933 -- ---------------------------  ------------    -----------    ---------       ---------------------------
5934 -- p_dlv_element_id                IN               NUMBER       Yes           Deliverale Element ID
5935 -- p_dlv_version_id                IN               NUMBER       Yes           Deliverable Version Id
5936 
5937 
5938 FUNCTION IS_BILLING_EVENT_PROCESSED
5939      (
5940           p_dlv_element_id IN PA_PROJ_ELEMENTS.PROJ_ELEMENT_ID%TYPE
5941           ,p_dlv_version_id IN PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
5942      )   RETURN VARCHAR2
5943 IS
5944      CURSOR bill_flag_dlv IS
5945      SELECT 'Y'
5946        FROM dual
5947      WHERE EXISTS ( SELECT 'Y'
5948                       FROM  pa_object_relationships obj
5949                            ,pa_proj_element_versions ver
5950                       WHERE obj.object_id_from2 = p_dlv_element_id
5951                         AND obj.object_type_to = 'PA_ACTIONS'
5952                         AND obj.object_type_from = 'PA_DELIVERABLES'
5953                         AND obj.object_id_to2 = ver.proj_element_id
5954                         AND obj.relationship_type = 'A'
5955                         AND obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
5956                         AND nvl(PA_BILLING_WRKBNCH_EVENTS.CHECK_DELV_EVENT_PROCESSED(ver.project_id,p_dlv_version_id,ver.element_version_id),'N') = 'Y'
5957                   ) ;
5958 l_dummy VARCHAR2(1) := 'N' ;
5959 l_return_status VARCHAR2(1) := 'N' ;
5960 BEGIN
5961      OPEN bill_flag_dlv;
5962      FETCH bill_flag_dlv into l_dummy ;
5963      IF bill_flag_dlv%found THEN
5964        l_return_status:='Y';
5965      ELSE
5966        l_return_status:='N';
5967      END IF;
5968      CLOSE bill_flag_dlv;
5969 return l_return_status;
5970 END IS_BILLING_EVENT_PROCESSED ;
5971 
5972 
5973 -- Procedure            : GET_BILLING_DETAILS ( 3622126 )
5974 -- Type                 : UTILITY
5975 -- Purpose              : To return billing action description and completion date
5976 -- Note                 : Retrieve action description and completion date
5977 --                      :
5978 -- Assumptions          : None
5979 
5980 -- Parameters                   Type     Required       Description and Purpose
5981 -- ---------------------------  ------   --------       --------------------------------------------------------
5982 -- p_action_version_id         NUMBER      Y            Delivearble Action Version Id
5983 -- x_bill_completion_date      DATE                     Billing Event Date
5984 -- x_bill_description          VARCHAR2                 Billing Action Description
5985 
5986 PROCEDURE GET_BILLING_DETAILS
5987 (
5988     p_action_version_id     IN  PA_PROJ_ELEM_VER_SCHEDULE.ELEMENT_VERSION_ID%TYPE
5989    ,x_bill_completion_date  OUT NOCOPY PA_PROJ_ELEM_VER_SCHEDULE.ACTUAL_FINISH_DATE%TYPE --File.Sql.39 bug 4440895
5990    ,x_bill_description      OUT NOCOPY PA_PROJ_ELEMENTS.DESCRIPTION%TYPE --File.Sql.39 bug 4440895
5991    ,x_return_status         OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5992    ,x_msg_count             OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
5993    ,x_msg_data              OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
5994 )
5995 IS
5996 
5997   CURSOR bill_details IS
5998   SELECT
5999             PPE.DESCRIPTION
6000            ,PES.ACTUAL_FINISH_DATE
6001   FROM
6002            PA_PROJ_ELEMENTS PPE,
6003            PA_PROJ_ELEM_VER_SCHEDULE PES
6004   WHERE
6005            PES.ELEMENT_VERSION_ID = p_action_version_id
6006        AND PES.PROJ_ELEMENT_ID    = PPE.PROJ_ELEMENT_ID
6007        AND PPE.OBJECT_TYPE        = 'PA_ACTIONS'
6008        AND PPE.FUNCTION_CODE      = 'BILLING'
6009        AND PPE.PROJECT_ID         = PES.PROJECT_ID ;
6010 
6011 
6012 l_debug_mode         VARCHAR2(1) ;
6013 
6014 BEGIN
6015 
6016 x_msg_count := 0;
6017 x_return_status := FND_API.G_RET_STS_SUCCESS;
6018 l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
6019 
6020 IF l_debug_mode = 'Y' THEN
6021      PA_DEBUG.set_curr_function( p_function   => 'GET_BILLING_DETAILS'
6022                                 ,p_debug_mode => l_debug_mode );
6023      pa_debug.g_err_stage:= 'Inside GET_BILLING_DETAILS ';
6024      pa_debug.write(g_module_name,pa_debug.g_err_stage,3) ;
6025 END IF;
6026 
6027 OPEN bill_details;
6028 FETCH bill_details into x_bill_description, x_bill_completion_date ;
6029 CLOSE bill_details;
6030 
6031 IF l_debug_mode = 'Y' THEN
6032       pa_debug.g_err_stage:= 'Exiting GET_BILLING_DETAILS' ;
6033       pa_debug.write(g_module_name,pa_debug.g_err_stage,3);
6034       pa_debug.reset_curr_function;
6035 END IF;
6036 
6037 EXCEPTION
6038 WHEN OTHERS THEN
6039      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6040      x_msg_count     := 1;
6041      x_msg_data      := SQLERRM;
6042 
6043      FND_MSG_PUB.add_exc_msg( p_pkg_name=> 'PA_DELIVERABLE_UTILS'
6044                      ,p_procedure_name  => 'GET_BILLING_DETAILS');
6045 
6046      IF l_debug_mode = 'Y' THEN
6047           pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
6048           pa_debug.write('GET_BILLING_DETAILS: ' || g_module_name,pa_debug.g_err_stage,5);
6049           pa_debug.reset_curr_function;
6050      END IF;
6051      RAISE;
6052 END GET_BILLING_DETAILS;
6053 
6054 
6055 -- SubProgram           : GET_TASK_INFO ( 3651340 )
6056 -- Type                 : UTIL FUNCTION
6057 -- Purpose              : This function returns task version id if p_task_or_struct is 'T'
6058 --                        parent structure version id if p_task_or_struct is 'S'
6059 -- Note                 :
6060 -- Assumptions          : None
6061 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
6062 -- ---------------------------  ------------    -----------    ---------       ---------------------------
6063 -- p_project_id                    IN               NUMBER       Yes           Project Id
6064 -- p_task_id                       IN               NUMBER       Yes           proj element id of task
6065 -- p_task_or_struct                IN               VARCHAR2     Yes           Valid Values are ( 'T' - for task version id, 'S' -
6066 --                                                                             for parent structure version id
6067 
6068 FUNCTION GET_TASK_INFO
6069 (
6070      p_project_id           IN NUMBER
6071     ,p_task_id              IN NUMBER
6072     ,p_task_or_struct       IN VARCHAR2
6073 )  RETURN NUMBER
6074 IS
6075 
6076 cursor c_task_exists(l_struct_ver_id IN NUMBER) IS
6077     SELECT
6078            PEV.ELEMENT_VERSION_ID
6079     FROM
6080            PA_PROJ_ELEMENT_VERSIONS PEV
6081     WHERE
6082            PEV.PARENT_STRUCTURE_VERSION_ID = l_struct_ver_id
6083        AND PEV.PROJ_ELEMENT_ID = p_task_id
6084        AND PEV.PROJECT_ID = p_project_id;
6085 
6086 -- 3651340 added desc to order by clause in cursor
6087 
6088 CURSOR c_task_in_wp_version IS
6089      SELECT  PPEVS.ELEMENT_VERSION_ID STRUCT_VER_ID
6090             ,PEV.ELEMENT_VERSION_ID TASK_VER_ID
6091         FROM
6092              PA_PROJ_ELEM_VER_STRUCTURE PPEVS
6093             ,PA_PROJ_ELEMENT_VERSIONS PEV
6094        WHERE PEV.PROJECT_ID = p_project_id
6095          AND PEV.PARENT_STRUCTURE_VERSION_ID = PPEVS.ELEMENT_VERSION_ID
6096          AND PEV.PROJ_ELEMENT_ID = p_task_id
6097          AND PEV.PROJECT_ID = PPEVS.PROJECT_ID
6098          AND ROWNUM < 2
6099          ORDER BY PPEVS.LAST_UPDATE_DATE DESC;
6100 
6101 l_latest_pub_wp_struct_id           NUMBER := NULL;
6102 l_current_working_wp_struct_id      NUMBER := NULL;
6103 l_task_ver_id                       NUMBER := NULL;
6104 l_wp_structure_ver_id               NUMBER := NULL;
6105 
6106 BEGIN
6107 
6108     -- retrieve published wp structure version id
6109     -- if task is in in latest published wp verion, return task version id and parent structure version id
6110 
6111     l_latest_pub_wp_struct_id := PA_PROJ_ELEMENTS_UTILS.latest_published_ver_id(p_project_id);
6112 
6113     IF l_latest_pub_wp_struct_id IS NOT NULL THEN
6114 
6115         OPEN c_task_exists(l_latest_pub_wp_struct_id);
6116         FETCH c_task_exists into l_task_ver_id;
6117         CLOSE c_task_exists;
6118 
6119         l_wp_structure_ver_id := l_latest_pub_wp_struct_id;
6120 
6121     END IF;
6122 
6123     -- if task is not in the latest published version, retrieve current working structure version id
6124     -- if task is in the current working version, return task version id and parent structure version id
6125 
6126     IF l_task_ver_id IS NULL THEN
6127 
6128         l_current_working_wp_struct_id := PA_PROJECT_STRUCTURE_UTILS.get_current_working_ver_id(p_project_id);
6129 
6130         IF l_current_working_wp_struct_id IS NOT NULL THEN
6131 
6132             OPEN c_task_exists(l_current_working_wp_struct_id);
6133             FETCH c_task_exists into l_task_ver_id ;
6134             CLOSE c_task_exists;
6135             l_wp_structure_ver_id := l_current_working_wp_struct_id;
6136         END IF;
6137 
6138     END IF;
6139 
6140     -- if task is not in current working versioin, retrieve the last updated structure version
6141     -- for which task is associated to structure
6142 
6143     IF l_task_ver_id IS NULL THEN
6144 
6145         OPEN c_task_in_wp_version;
6146         FETCH c_task_in_wp_version into l_wp_structure_ver_id, l_task_ver_id;
6147         CLOSE c_task_in_wp_version;
6148 
6149     END IF;
6150 
6151     -- if p_task_or_struct is 'T' then return task version id
6152     -- if p_task_or_struct is 'S' then return parent structure version id
6153 
6154     IF p_task_or_struct = 'T' THEN
6155         return l_task_ver_id;
6156     ELSIF p_task_or_struct = 'S' THEN
6157         return l_wp_structure_ver_id;
6158     END IF;
6159 
6160 END GET_TASK_INFO;
6161 
6162 -- added for bug# 3911050
6163 -- SubProgram           : GET_SHIP_PROC_ACTN_DETAIL ( 3911050 )
6164 -- Type                 : UTIL FUNCTION
6165 -- Purpose              : This function returns shipping and procurement action details ( name, id, due date )
6166 -- Note                 : OKE is calling this procedure while create dlvr to default dlvr type actions to dlvr
6167 -- Assumptions          : None
6168 -- Parameter                      IN/OUT            Type       Required         Description and Purpose
6169 -- ---------------------------  ------------    -----------    ---------       ---------------------------
6170 --   p_dlvr_id                      IN          NUMBER          Yes             Dlvr Ver Id
6171 --   x_ship_id                      OUT         NUMBER                          Shipping Action Ver Id
6172 --   x_ship_name                    OUT         VARCHAR2                        Shipping Action Name
6173 --   x_ship_due_date                OUT         Date                            Shipping Due Date
6174 --   x_proc_id                      OUT         NUMBER                          Procurement Action Ver Id
6175 --   x_proc_name                    OUT         VARCHAR2                        Procurement Action Name
6176 --   x_proc_due_date                OUT         Date                            Procurement Due Date
6177 --
6178 
6179 PROCEDURE GET_SHIP_PROC_ACTN_DETAIL
6180     (
6181          p_dlvr_id                      IN      PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE
6182         ,x_ship_id                      OUT     NOCOPY PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE --File.Sql.39 bug 4440895
6183         ,x_ship_name                    OUT     NOCOPY PA_PROJ_ELEMENTS.NAME%TYPE --File.Sql.39 bug 4440895
6184         ,x_ship_due_date                OUT     NOCOPY PA_PROJ_ELEM_VER_SCHEDULE.SCHEDULED_FINISH_DATE%TYPE --File.Sql.39 bug 4440895
6185         ,x_proc_id                      OUT     NOCOPY PA_PROJ_ELEMENT_VERSIONS.ELEMENT_VERSION_ID%TYPE --File.Sql.39 bug 4440895
6186         ,x_proc_name                    OUT     NOCOPY PA_PROJ_ELEMENTS.NAME%TYPE --File.Sql.39 bug 4440895
6187         ,x_proc_due_date                OUT     NOCOPY PA_PROJ_ELEM_VER_SCHEDULE.SCHEDULED_FINISH_DATE%TYPE --File.Sql.39 bug 4440895
6188     )
6189 IS
6190 
6191 CURSOR l_ship_info_csr
6192 IS
6193     select
6194            obj.object_id_to1
6195           ,ppe.name
6196           ,ppevs.scheduled_finish_date
6197     from
6198            pa_object_relationships obj
6199           ,pa_proj_elements ppe
6200           ,pa_proj_elem_ver_schedule ppevs
6201           ,pa_proj_element_versions pev
6202     where
6203           pev.element_version_id   = p_dlvr_id
6204       and obj.object_id_from2      = pev.proj_element_id
6205       and pev.object_type          = 'PA_DELIVERABLES'
6206       and obj.object_type_from     = 'PA_DELIVERABLES'
6207       and obj.object_type_to       = 'PA_ACTIONS'
6208       and obj.relationship_type    = 'A'
6209       and obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
6210       and ppe.proj_element_id      = obj.object_id_to2
6211       and ppe.proj_element_id      = ppevs.proj_element_id
6212       and ppe.project_id           = ppevs.project_id
6213       and ppe.function_code        = 'SHIPPING';
6214 
6215 CURSOR l_proc_info_csr
6216 IS
6217     select
6218            obj.object_id_to1
6219           ,ppe.name
6220           ,ppevs.scheduled_finish_date
6221     from
6222            pa_object_relationships obj
6223           ,pa_proj_elements ppe
6224           ,pa_proj_elem_ver_schedule ppevs
6225           ,pa_proj_element_versions pev
6226     where
6227           pev.element_version_id   = p_dlvr_id
6228       and obj.object_id_from2      = pev.proj_element_id
6229       and pev.object_type          = 'PA_DELIVERABLES'
6230       and obj.object_type_from     = 'PA_DELIVERABLES'
6231       and obj.object_type_to       = 'PA_ACTIONS'
6232       and obj.relationship_type    = 'A'
6233       and obj.relationship_subtype = 'DELIVERABLE_TO_ACTION'
6234       and ppe.proj_element_id      = obj.object_id_to2
6235       and ppe.proj_element_id      = ppevs.proj_element_id
6236       and ppe.project_id           = ppevs.project_id
6237       and ppe.function_code        = 'PROCUREMENT';
6238 
6239 BEGIN
6240 
6241      OPEN l_ship_info_csr;
6242      FETCH l_ship_info_csr into x_ship_id, x_ship_name, x_ship_due_date ;
6243      CLOSE l_ship_info_csr;
6244 
6245      OPEN l_proc_info_csr;
6246      FETCH l_proc_info_csr into x_proc_id, x_proc_name, x_proc_due_date ;
6247      CLOSE l_proc_info_csr;
6248 
6249 END GET_SHIP_PROC_ACTN_DETAIL;
6250 
6251 END PA_DELIVERABLE_UTILS;