DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_PROJ_ELEMENTS_UTILS

Source


1 PACKAGE BODY PA_PROJ_ELEMENTS_UTILS AS
2 /* $Header: PATSK1UB.pls 120.23.12020000.4 2013/05/23 13:05:09 djambhek ship $ */
3 
4 Invalid_Arg_Exc_WP     Exception ;
5 g_module_name VARCHAR2(100) := 'pa.plsql.pa_proj_elements_utils';
6 
7 -- Added for Bug 6156686
8 TYPE l_lookup_cache_tbl_typ IS TABLE OF VARCHAR2(80)
9 INDEX BY VARCHAR2(70);
10 
11 l_lookup_cache_tbl l_lookup_cache_tbl_typ;
12 
13 TYPE l_fndlkp_cache_tbl_typ IS TABLE OF VARCHAR2(80)
14 INDEX BY VARCHAR2(70);
15 
16 l_fndlkp_cache_tbl l_lookup_cache_tbl_typ;
17 
18 PROCEDURE SetGlobalStrucVerId ( p_structure_version_id IN NUMBER )
19 IS
20 BEGIN
21   PA_PROJ_ELEMENTS_UTILS.g_Struc_Ver_Id := p_structure_version_id;
22 END SetGlobalStrucVerId;
23 
24 FUNCTION GetGlobalStrucVerId RETURN NUMBER
25 IS
26 BEGIN
27   RETURN ( PA_PROJ_ELEMENTS_UTILS.g_Struc_Ver_Id  );
28 END GetGlobalStrucVerId;
29 
30 --This function checks if a WORKPLAN (split or shared) task
31 --may be updtaed by the logged in user.
32 --Do not use this function for split FINANCIAL tasks
33 -- 5/13/05: DHI ER: Allowing multiple user to update task assignment
34 --          Added p_require_lock_flag parameter defauled to 'Y'.
35 -- 8/29/05: R12 Bug fix 4533152: Added p_add_error_flag paramter
36 --          defaulted to 'N'.
37 FUNCTION Check_Edit_Task_Ok(p_project_id IN NUMBER,
38                             p_structure_version_id IN NUMBER,
39                             p_curr_struct_version_id IN NUMBER,
40                             p_element_id IN NUMBER := NULL,
41                             p_require_lock_flag IN VARCHAR := 'Y',
42                             p_add_error_flag IN VARCHAR := 'N')
43 RETURN VARCHAR2
44 IS
45   l_ret_code  varchar2(1);
46   l_ret_stat  varchar2(1);
47   l_msg_count NUMBER;
48   l_msg_data  varchar2(250);
49 
50   cursor c1 IS
51     select '1' from pa_projects_all
52      where project_id = p_project_id
53        and template_flag = 'Y';
54   l_dummy VARCHAR2(1);
55   -- bug 4239490
56   l_lock  VARCHAR2(1);
57   l_is_task_manager_flag   VARCHAR2(1);
58   l_version_enable_flag    VARCHAR2(1);
59    --bug 4239490
60 BEGIN
61 
62   OPEN c1;
63   FETCH c1 into l_dummy;
64   IF c1%FOUND THEN
65     CLOSE c1;
66     return 'Y';
67   END IF;
68   CLOSE c1;
69 
70   --check if this is published
71 --  IF (PA_PROJECT_STRUCTURE_UTILS.Check_Struc_Ver_Published(p_project_id, p_structure_version_id) = 'Y') THEN
72 --    return 'N';
73 --  END IF;
74   IF ('N' = PA_PROJECT_STRUCTURE_UTILS.check_edit_wp_ok(p_project_id, p_structure_version_id)) THEN
75     -- Bug 4533152
76     IF p_add_error_flag = 'Y' THEN
77       PA_UTILS.ADD_MESSAGE
78                     (p_app_short_name => 'PA',
79                      p_msg_name       => 'PA_CHANGE_PUB_VER_ERR');
80     END IF;
81     -- End of Bug 4533152
82     return 'N';
83   END IF;
84 /* commented out--bug 3071008
85    since linking is not shipped
86   --check if this is linked element version
87   If (p_structure_version_id = p_curr_struct_version_id) THEN
88     --Same structure
89     return 'Y';
90   END IF;
91 */
92 
93   l_version_enable_flag := PA_WORKPLAN_ATTR_UTILS.CHECK_WP_VERSIONING_ENABLED(p_project_id);
94   --check if this is locked
95   --bug 3071008: added condition for versioned projects only
96   IF (l_version_enable_flag = 'Y') THEN
97     -- The following API returns 'Y' if locked by current user , '0' if Locked by some other user and 'N' if no one is locking
98     -- If no one is locking we can still allow editing.
99     --bug 4239490
100     l_lock := PA_PROJECT_STRUCTURE_UTILS.IS_STRUC_VER_LOCKED_BY_USER(FND_GLOBAL.USER_ID, p_structure_version_id);
101 
102     -- Bug Fix: 4725901
103     -- DHI ER:
104     -- Need to consider the p_require_lock_flag.
105     -- Currently the flow is returning N which is preventing other users
106     -- to update/create/delete the task assignments using the PA_TASK_ASSIGNMENT_PUB
107     --
108     -- In order to allow the users to update/delete/create the Task Assignments
109     -- even though the structure is locked we need to consider the p_required_lock flag.
110     -- The flow will be
111     -- If the structure is locked AND p_required_lock_flag is Y then only return N
112     -- In case of DHI ER the call to this procedure from
113     -- PA_TASK_ASSIGNMENT_UTILS.check_edit_task_ok will pass N. So the error is
114     -- bypassed.
115     --
116     -- IF (l_lock = 'O') THEN    --bug 4239490
117 
118     IF ((l_lock = 'O') AND (p_require_lock_flag = 'Y')) THEN    --bug 4725901
119 
120       -- Bug 4533152
121       IF p_add_error_flag = 'Y' THEN
122         PA_UTILS.ADD_MESSAGE
123                     (p_app_short_name => 'PA',
124                      p_msg_name       => 'PA_STR_LOCKED_BY_OTHER');
125       END IF;
126       -- End of Bug 4533152
127       return 'N';
128 
129     END IF;
130 
131   END IF;
132 
133   -- This API can be called from so many other places also,where this p_element_id may not be available
134   -- Hence PA_PROGRESS_UTILS.IS_TASK_MANAGER API will return 'N'
135   -- which may produce undesirable results
136   -- Here ,Introduced the condition to call this API if and only if p_element_id is passed
137 
138   IF p_element_id is NOT NULL -- 4267419 <avaithia> tracking
139   THEN
140   --bug 4239490 No access if there is no lock and the user is not task manager.
141   l_is_task_manager_flag := PA_PROGRESS_UTILS.IS_TASK_MANAGER(p_element_id, p_project_id, FND_GLOBAL.USER_ID);
142 
143   IF l_version_enable_flag = 'Y' AND
144      l_is_task_manager_flag = 'N' and l_lock = 'N' AND
145      p_require_lock_flag = 'Y'      -- 5/13/05: DHI ER: Allowing multiple user to update task assignment
146                                     --          If structure version is NOT locked by another user,
147                                     --          also return 'Y';
148   THEN
149       -- Bug 4533152
150       IF p_add_error_flag = 'Y' THEN
151         PA_UTILS.ADD_MESSAGE
152                     (p_app_short_name => 'PA',
153                      p_msg_name       => 'PA_UPDATE_PUB_VER_ERR');
154       END IF;
155       -- End of Bug 4533152
156      return 'N';
157   END IF;
158    --end bug 4239490
159   END IF ; -- 4267419 <avaithia> tracking
160 
161   --check if user can edit
162   IF (PA_SECURITY_PVT.check_user_privilege('PA_PAXPREPR_OPT_WORKPLAN_STR', 'PA_PROJECTS', p_project_id
163       , 'N') -- Fix for Bug # 4319137.
164       <> FND_API.G_TRUE) THEN
165      IF p_element_id is NOT NULL THEN
166         IF (l_is_task_manager_flag = 'Y') THEN   --bug 4239490  replaced the is_task_manager api call with the variable.
167            IF (PA_SECURITY_PVT.check_user_privilege('PA_TASKS_UPDATE_DETAILS', 'PA_PROJECTS', p_project_id
168 	       , 'N') -- Fix for Bug # 4319137.
169              <> FND_API.G_TRUE) THEN
170                -- Bug 4533152
171                IF p_add_error_flag = 'Y' THEN
172                  PA_UTILS.ADD_MESSAGE
173                     (p_app_short_name => 'PA',
174                      p_msg_name       => 'PA_UPDATE_PUB_VER_ERR');
175                END IF;
176                -- End of Bug 4533152
177                return 'N';
178            END IF;
179         ELSE
180           -- Bug 4533152
181           IF p_add_error_flag = 'Y' THEN
182             PA_UTILS.ADD_MESSAGE
183                     (p_app_short_name => 'PA',
184                      p_msg_name       => 'PA_UPDATE_PUB_VER_ERR');
185           END IF;
186           -- End of Bug 4533152
187           return 'N';
188         END IF;
189      ELSE
190         -- Bug 4533152
191         IF p_add_error_flag = 'Y' THEN
192           PA_UTILS.ADD_MESSAGE
193                     (p_app_short_name => 'PA',
194                      p_msg_name       => 'PA_UPDATE_PUB_VER_ERR');
195         END IF;
196         -- End of Bug 4533152
197         return 'N';
198      END IF;
199   END IF;
200   return 'Y';
201 END Check_Edit_Task_Ok;
202 
203 
204 PROCEDURE Get_Structure_Attributes(
205     p_element_version_id       NUMBER,
206     p_structure_type_code       VARCHAR2 := 'WORKPLAN',
207     x_task_name                 OUT NOCOPY VARCHAR2, -- 4537865
208     x_task_number               OUT NOCOPY VARCHAR2, -- 4537865
209     x_task_version_id           OUT NOCOPY NUMBER, -- 4537865
210     x_structure_version_name    OUT NOCOPY VARCHAR2, -- 4537865
211     x_structure_version_number  OUT NOCOPY NUMBER, -- 4537865
212     x_structure_name            OUT NOCOPY VARCHAR2, -- 4537865
213     x_structure_number          OUT NOCOPY VARCHAR2, -- 4537865
214     x_structure_id              OUT NOCOPY NUMBER, -- 4537865
215     x_structure_type_code_name  OUT NOCOPY VARCHAR2, -- 4537865
216     x_structure_version_id      OUT NOCOPY NUMBER, -- 4537865
217     x_project_id                OUT NOCOPY NUMBER -- 4537865
218 
219 ) AS
220 
221     CURSOR cur_elem_ver
222     IS
223       SELECT ppe.name, ppe.element_number, ppev.parent_structure_version_id, ppe.project_id
224         FROM pa_proj_element_versions ppev,
225              pa_proj_elements ppe
226        WHERE ppe.proj_element_id = ppev.proj_element_id
227          AND ppev.element_version_id = p_element_version_id
228          AND ppev.object_type = 'PA_TASKS';
229 
230 /* Bug 2680486 -- Performance changes -- Added one more condition to compare project_id in the following cursor.
231                   The project_id is got from pa_proj_element_versions*/
232 
233     CURSOR cur_elem_ver_stru( p_version_id NUMBER )
234     IS
235       SELECT ppevs.version_number, ppevs.name, ppe.element_number, ppe.name, ppe.proj_element_id, ppe.project_id
236         FROM pa_proj_elem_ver_structure ppevs,
237              pa_proj_elements ppe
238        WHERE ppevs.element_version_id = p_version_id
239          AND ppe.proj_element_id = ppevs.proj_element_id
240          AND ppevs.project_id = (select project_id
241                                  from pa_proj_element_versions
242                                  where element_version_id = p_version_id) ;
243 
244     CURSOR cur_lookups
245     IS
246       SELECT meaning
247         FROM pa_lookups
248        WHERE lookup_type = 'PA_STRUCTURE_TYPE_CLASS'
249          AND lookup_code = p_structure_type_code;
250 
251 
252    x_version_id    NUMBER;
253 BEGIN
254      OPEN cur_elem_ver;
255      FETCH cur_elem_ver INTO  x_task_name, x_task_number, x_structure_version_id,x_project_id;
256      IF cur_elem_ver%FOUND THEN
257         --If element is TASK Get the structure details. This structure is parent of the task p_elemnt_version_id.
258         x_version_id := x_structure_version_id;
259         --here we get the task.
260         x_task_version_id := p_element_version_id;
261      ELSE
262         --If element is STRUCTURE. Pass back only STRUCTURE details.
263         x_version_id := p_element_version_id;
264         x_structure_version_id := p_element_version_id;
265      END IF;
266      CLOSE cur_elem_ver;
267 
268      OPEN cur_elem_ver_stru( x_version_id );
269      FETCH cur_elem_ver_stru INTO x_structure_version_number, x_structure_version_name,
270                                   x_structure_number, x_structure_name, x_structure_id, x_project_id;
271      CLOSE cur_elem_ver_stru;
272 
273      OPEN cur_lookups;
274      FETCH cur_lookups INTO x_structure_type_code_name;
275      CLOSE cur_lookups;
276 
277 -- 4537865 I havent changed WHEN OTHERS block because existing code wanted to ignore it.
278 -- Discussed with Rajnish  reg. this
279 
280 EXCEPTION WHEN OTHERS THEN
281      null;
282 END Get_Structure_Attributes;
283 
284 
285 FUNCTION latest_published_ver_id(
286     p_project_id             NUMBER,
287     p_structure_type_code    VARCHAR2 := 'WORKPLAN'
288 ) RETURN NUMBER IS
289     CURSOR cur_elem_ver_stru
290     IS
291       SELECT element_version_id
292         FROM pa_proj_elem_ver_structure ppevs,
293              pa_proj_structure_types ppst,
294              pa_structure_types pst
295        WHERE ppevs.project_id = p_project_id
296          AND latest_eff_published_flag = 'Y'
297          AND ppst.proj_element_id = ppevs.proj_element_id
298          AND ppst.structure_type_id = pst.structure_type_id
299          AND pst.structure_type_class_code = p_structure_type_code;
300     v_element_version_id  NUMBER;
301 BEGIN
302      OPEN cur_elem_ver_stru;
303      FETCH cur_elem_ver_stru INTO v_element_version_id;
304      CLOSE cur_elem_ver_stru;
305      RETURN NVL( v_element_version_id, -1);
306 END latest_published_ver_id;
307 
308 -- POST K:Added for Shortcut to get the last updated Workplan version
309 
310 Procedure Get_Last_Upd_Working_Wp_Ver(
311        p_project_id            IN   pa_proj_elem_ver_structure.project_id%TYPE
312       ,x_pev_structure_id      OUT NOCOPY  pa_proj_elem_ver_structure.pev_structure_id%TYPE -- 4537865
313       ,x_element_version_id    OUT NOCOPY  pa_proj_elem_ver_structure.element_version_id%TYPE -- 4537865
314       ,x_element_version_name  OUT NOCOPY pa_proj_elem_ver_structure.name%TYPE -- 4537865
315       ,x_record_version_number OUT NOCOPY pa_proj_elem_ver_structure.record_version_number%TYPE -- 4537865
316       ,x_return_status         OUT NOCOPY VARCHAR2 -- 4537865
317       ,x_msg_count             OUT NOCOPY  NUMBER -- 4537865
318       ,x_msg_data              OUT NOCOPY VARCHAR2) -- 4537865
319 AS
320 
321 l_msg_index_out                 NUMBER;
322 l_debug_mode                           VARCHAR2(1);
323 
324 l_data                          VARCHAR2(2000); -- 4537865
325 
326 l_debug_level2                   CONSTANT NUMBER := 2;
327 l_debug_level3                   CONSTANT NUMBER := 3;
328 l_debug_level4                   CONSTANT NUMBER := 4;
329 l_debug_level5                   CONSTANT NUMBER := 5;
330 l_module_name                    VARCHAR2(100) := 'pa.plsql.PA_PROJ_ELEMENTS_UTILS';
331 
332 l_date1                   DATE ;
333 l_pev_structure_id1       pa_proj_elem_ver_structure.pev_structure_id%TYPE      ;
334 l_element_version_id1     pa_proj_elem_ver_structure.element_version_id%TYPE    ;
335 l_element_version_name1   pa_proj_elem_ver_structure.name%TYPE                  ;
336 l_record_version_number1  pa_proj_elem_ver_structure.record_version_number%TYPE ;
337 
338 l_date2                   DATE ;
339 l_pev_structure_id2       pa_proj_elem_ver_structure.pev_structure_id%TYPE      ;
340 l_element_version_id2     pa_proj_elem_ver_structure.element_version_id%TYPE    ;
341 l_element_version_name2   pa_proj_elem_ver_structure.name%TYPE                  ;
342 l_record_version_number2  pa_proj_elem_ver_structure.record_version_number%TYPE ;
343 
344     CURSOR cur_elem_ver_stru1
345     IS
346       SELECT ppevs.last_update_date,
347              ppevs.pev_structure_id,
348              ppevs.element_version_id,
349              ppevs.name,
350              ppevs.record_version_number
351         FROM pa_proj_elem_ver_structure ppevs,
352              pa_proj_structure_types ppst,
353              pa_structure_types pst
354        WHERE ppevs.project_id = p_project_id
355          AND ppevs.status_code = 'STRUCTURE_WORKING'
356          AND ppst.proj_element_id = ppevs.proj_element_id
357          AND ppst.structure_type_id = pst.structure_type_id
358          AND pst.structure_type_class_code = 'WORKPLAN'
359          ORDER BY ppevs.last_update_date desc ;
360 
361    --bug#2956325 :
362    --Added the below mentioned cursor to take care of
363    --scenerios such as delete,indent,outdent,move,add
364    --etc.The above cursor doesn't take care of these
365    --scenerios as the last_updated_date is not updated
366    --for the structure version in pa_proj_elem_ver_structure
367    --table.The above cursor is though needed when the structure
368    --version infirmation such as description is updated.
369 
370    --Now after the fix ,both the maximum dates from
371    --pa_proj_elem_ver_structure and pa_proj_elem_ver_schedule
372    --are compared.The structure version info corresponding
373    --to greater last_updated_date is returned.
374 
375     CURSOR cur_elem_ver_stru2
376     IS
377       SELECT MAX(a.last_update_date),
378              c.pev_structure_id,
379              c.element_version_id,
380                    c.name,
381                    c.record_version_number
382         FROM pa_proj_element_versions b,
383              pa_proj_elem_ver_schedule a,
384              pa_proj_elem_ver_structure c,
385              pa_structure_types d ,
386              pa_proj_structure_types e
387        WHERE a.element_version_id= b.element_version_id
388          AND a.project_id = b.project_id
389          AND a.proj_element_id = b.proj_element_id
390          AND b.parent_structure_version_id = c.element_version_id
391          AND b.project_id = c.project_id
392          AND b.project_id = p_project_id
393             AND c.status_code = 'STRUCTURE_WORKING'
394          AND e.proj_element_id = c.proj_element_id
395          AND d.structure_type_id = e.structure_type_id
396          AND d.structure_type_class_code = 'WORKPLAN'
397     GROUP BY c.pev_structure_id
398                   ,c.element_version_id
399                   ,c.name
400                   ,c.record_version_number
401    ORDER BY MAX(a.last_update_date) desc  ;
402 
403    --cursor to select the structure version id for a workplan structure
404     CURSOR cur_elem_ver_stru3
405     IS
406       SELECT ppe.proj_element_id
407         FROM pa_proj_elements ppe,
408              pa_proj_structure_types ppst,
409              pa_structure_types pst
410        WHERE ppe.project_id = p_project_id
411          AND ppe.object_type = 'PA_STRUCTURES'
412 --         AND ppe.status_code <> 'STRUCTURE_PUBLISHED'
413          AND ppst.proj_element_id = ppe.proj_element_id
414          AND ppst.structure_type_id = pst.structure_type_id
415          AND pst.structure_type_class_code = 'WORKPLAN';
416     l_structure_id NUMBER;
417 
418     /* Bug No 3692971, For performance reasons the following tables are removed from the cursor query as */
419     /* pa_proj_structure_types, pa_structure_types tables are not used in select list and where clause.  */
420     /* In case these two tables are required please add the following two join conditions to avoid full  */
421     /* table scan on the structure_type tables                                                           */
422     /* AND ppst.proj_element_id = ppevs.proj_element_id   */
423     /* AND ppst.structure_type_id = pst.structure_type_id */
424     CURSOR cur_elem_ver_stru4(c_struc_id NUMBER, c_struc_ver_id NUMBER)
425     IS
426       SELECT ppevs.last_update_date,
427              ppevs.pev_structure_id,
428              ppevs.element_version_id,
429              ppevs.name,
430              ppevs.record_version_number
431         FROM pa_proj_elem_ver_structure ppevs
432        WHERE ppevs.project_id = p_project_id
433          AND ppevs.proj_element_id = c_struc_id
434          AND ppevs.element_version_id = c_struc_ver_id;
435 /*      SELECT ppevs.last_update_date,
436              ppevs.pev_structure_id,
437              ppevs.element_version_id,
438              ppevs.name,
439              ppevs.record_version_number
440         FROM pa_proj_elem_ver_structure ppevs,
441              pa_proj_structure_types ppst,
442              pa_structure_types pst
443        WHERE ppevs.project_id = p_project_id
444          AND ppevs.proj_element_id = c_struc_id
445          AND ppevs.element_version_id = c_struc_ver_id;*/
446 BEGIN
447 
448      x_msg_count := 0;
449      x_return_status := FND_API.G_RET_STS_SUCCESS;
450      l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
451 
452 
453      IF l_debug_mode = 'Y' THEN
454           --Moved here for bug 4252182
455           pa_debug.set_curr_function( p_function   => 'Get_Last_Upd_Working_Wp_Ver',
456                                  p_debug_mode => l_debug_mode );
457 
458           pa_debug.g_err_stage:= 'Validating input parameters';
459           pa_debug.write(l_module_name,pa_debug.g_err_stage,l_debug_level3);
460      END IF;
461 
462      IF (p_project_id IS NULL) THEN
463           IF l_debug_mode = 'Y' THEN
464                   pa_debug.g_err_stage:= 'Value of input parameter = '|| p_project_id;
465                   pa_debug.write(l_module_name,pa_debug.g_err_stage,l_debug_level5);
466           END IF;
467           PA_UTILS.ADD_MESSAGE
468                 (p_app_short_name => 'PA',
469                   p_msg_name     => 'PA_FP_INV_PARAM_PASSED');
470           RAISE Invalid_Arg_Exc_WP;
471 
472      END IF;
473 
474 --added for bug 3476162
475      OPEN cur_elem_ver_stru3;
476      FETCH cur_elem_ver_stru3 into l_structure_id;
477      CLOSE cur_elem_ver_stru3;
478 
479      x_element_version_id := PA_PROJECT_STRUCTURE_UTILS.get_last_updated_working_ver(l_structure_id);
480 
481      OPEN cur_elem_ver_stru4(l_structure_id, x_element_version_id);
482      FETCH cur_elem_ver_stru4 INTO
483           l_date1
484          ,l_pev_structure_id1
485          ,l_element_version_id1
486          ,l_element_version_name1
487          ,l_record_version_number1;
488      IF cur_elem_ver_stru4%NOTFOUND THEN
489         x_pev_structure_id      := -1  ;
490         x_element_version_id    := -1  ;
491         x_element_version_name  := '-1';
492         x_record_version_number := -1;
493      ELSE
494         x_pev_structure_id      := l_pev_structure_id1      ;
495         x_element_version_id    := l_element_version_id1    ;
496         x_element_version_name  := l_element_version_name1  ;
497         x_record_version_number := l_record_version_number1 ;
498      END IF;
499      CLOSE cur_elem_ver_stru4;
500 --end added for bug 3476162
501 
502 --commented out for bug 3476162
503 /*
504      OPEN cur_elem_ver_stru1;
505      FETCH cur_elem_ver_stru1 INTO
506           l_date1
507          ,l_pev_structure_id1
508          ,l_element_version_id1
509          ,l_element_version_name1
510          ,l_record_version_number1;
511      IF cur_elem_ver_stru1%NOTFOUND THEN
512            x_pev_structure_id      := -1  ;
513            x_element_version_id    := -1  ;
514         x_element_version_name  := '-1';
515         x_record_version_number := -1  ;
516      CLOSE cur_elem_ver_stru1 ;
517      ELSE
518      OPEN cur_elem_ver_stru2;
519      FETCH cur_elem_ver_stru2 INTO
520           l_date2
521          ,l_pev_structure_id2
522          ,l_element_version_id2
523          ,l_element_version_name2
524          ,l_record_version_number2;
525 
526           IF l_date1>l_date2 THEN
527                 x_pev_structure_id      := l_pev_structure_id1      ;
528                 x_element_version_id    := l_element_version_id1    ;
529                 x_element_version_name  := l_element_version_name1  ;
530                 x_record_version_number := l_record_version_number1 ;
531           ELSE
532                 x_pev_structure_id      := l_pev_structure_id2      ;
533                 x_element_version_id    := l_element_version_id2    ;
534                 x_element_version_name  := l_element_version_name2  ;
535                 x_record_version_number := l_record_version_number2 ;
536           END IF ;
537      CLOSE cur_elem_ver_stru2 ;
538      END IF;
539 */
540 
541      IF l_debug_mode = 'Y' THEN  --For bug 4252182
542 
543         pa_debug.reset_curr_function;
544 
545      END IF;
546 
547 EXCEPTION
548 
549 WHEN Invalid_Arg_Exc_WP THEN
550 
551      x_return_status := FND_API.G_RET_STS_ERROR;
552      x_msg_count := FND_MSG_PUB.count_msg;
553 
554       -- 4537865 RESET OUT PARAMS
555       x_pev_structure_id      := NULL ;
556       x_element_version_id    := NULL ;
557       x_element_version_name  := NULL ;
558       x_record_version_number := NULL ;
559 
560      IF x_msg_count = 1 and x_msg_data IS NULL THEN
561           PA_INTERFACE_UTILS_PUB.get_messages
562               (p_encoded        => FND_API.G_TRUE
563               ,p_msg_index      => 1
564               ,p_msg_count      => x_msg_count
565               ,p_msg_data       => x_msg_data
566               ,p_data           => l_data, -- 4537865
567               p_msg_index_out  => l_msg_index_out);
568 
569 		x_msg_data := l_data ; -- 4537865
570 
571       END IF;
572 
573      IF l_debug_mode = 'Y' THEN --For bug 4252182
574          pa_debug.reset_curr_function;
575      END IF;
576 
577      RETURN;
578 
579 WHEN others THEN
580      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
581      x_msg_count     := 1;
582      x_msg_data      := SQLERRM;
583 
584       -- 4537865 RESET OUT PARAMS
585       x_pev_structure_id      := NULL ;
586       x_element_version_id    := NULL ;
587       x_element_version_name  := NULL ;
588       x_record_version_number := NULL ;
589 
590      IF cur_elem_ver_stru1%ISOPEN THEN
591           CLOSE cur_elem_ver_stru1;
592      END IF;
593      IF cur_elem_ver_stru2%ISOPEN THEN
594           CLOSE cur_elem_ver_stru2;
595      END IF;
596 
597      FND_MSG_PUB.add_exc_msg
598                    ( p_pkg_name        => 'PA_PROJ_ELEMENTS_UTILS'
599                     ,p_procedure_name  => 'Get_Last_Upd_Working_Wp_Ver'
600                     ,p_error_text      => x_msg_data);
601 
602      IF l_debug_mode = 'Y' THEN
603           pa_debug.g_err_stage:= 'Unexpected Error'||x_msg_data;
604           pa_debug.write(l_module_name,pa_debug.g_err_stage,
605                               l_debug_level5);
606           pa_debug.reset_curr_function; --For bug 4252182
607      END IF;
608      RAISE;
609 END Get_Last_Upd_Working_Wp_Ver;
610 
611 FUNCTION element_has_child(
612     p_structure_version_id NUMBER
613 ) RETURN VARCHAR2 IS
614    CURSOR cur_obj_rel
615    IS
616      SELECT 'x'
617        FROM pa_object_relationships por, pa_proj_elements ppe, pa_proj_element_versions ppev
618       WHERE object_id_from1 = p_structure_version_id
619         AND relationship_type = 'S'
620         AND por.object_id_to1 = ppev.element_version_id
621         AND ppe.proj_element_id = ppev.proj_element_id
622         AND ppe.link_task_flag = 'N';
623       /*START WITH object_id_from1 = p_structure_version_id
624       CONNECT BY object_id_from1 = PRIOR object_id_to1;*/
625    v_dummy_char  VARCHAR2(1);
626 BEGIN
627     OPEN cur_obj_rel;
628     FETCH cur_obj_rel INTO v_dummy_char;
629     IF cur_obj_rel%FOUND
630     THEN
631        CLOSE cur_obj_rel;
632        RETURN 'Y';
633     ELSE
634        CLOSE cur_obj_rel;
635        RETURN 'N';
636     END IF;
637 END element_has_child;
638 
639 -- API name                      : IS_LOWEST_Task
640 -- Type                          : Task Utils API
641 -- Pre-reqs                      : None
642 -- Return Value                  : 1 if it is lowest task; 0 if not.
643 -- Parameters
644 --  p_task_version_id                   IN      NUMBER
645 --
646 --  History
647 --
648 --  31-OCT-01   HSIU             -Created
649 --
650 
651 
652 function IS_LOWEST_TASK(p_task_version_id NUMBER) RETURN VARCHAR2
653 IS
654   l_dummy number;
655 
656   cursor child_exist IS
657   select 1
658    from pa_object_relationships
659   where object_type_from = 'PA_TASKS'
660     and object_id_from1 = p_task_version_id
661     and relationship_type = 'S';
662 
663 BEGIN
664 
665   OPEN child_exist;
666   FETCH child_exist into l_dummy;
667   IF child_exist%NOTFOUND then
668     --Cannot find child. It is lowest task
669     CLOSE child_exist;
670     return 'Y';
671   ELSE
672     --Child found. Not lowest task
673     CLOSE child_exist;
674     return 'N';
675   END IF;
676 EXCEPTION
677   WHEN OTHERS THEN
678     return (SQLCODE);
679 END IS_LOWEST_TASK;
680 
681 -- API name                      : Check_element_Name_Unique
682 -- Type                          : Utils API
683 -- Pre-reqs                      : None
684 -- Return Value                  : Y if not exists; N if exists.
685 -- Parameters
686 --   p_element_name               IN      VARCHAR2
687 --   p_element_id                 IN      NUMBER
688 --   p_project_id                   IN      NUMBER
689 --   p_object_type                     IN  VARCHAR2 := 'PA_TASKS'
690 --
691 --  History
692 --
693 --  01-NOV-01   MAANSARI             -Created
694 --
695 --
696 
697   function Check_element_NUmber_Unique
698   (
699     p_element_number                    IN  VARCHAR2
700    ,p_element_id                      IN  NUMBER
701    ,p_project_id                      IN  NUMBER
702    ,p_structure_id                    IN  NUMBER
703    ,p_object_type                     IN  VARCHAR2 := 'PA_TASKS'
704   ) return VARCHAR2
705   IS
706     cursor c1 is
707            select 1 from pa_proj_elements
708            where project_id = p_project_id
709            and object_type = p_object_type
710            and element_number = p_element_number
711            and PARENT_STRUCTURE_ID = p_structure_id
712            and (p_element_id is NULL or proj_element_id <> p_element_id);
713 
714     l_dummy NUMBER;
715 
716   BEGIN
717     if (p_project_id IS NULL or p_element_number is NULL) then
718       return (null);
719     end if;
720 
721     open c1;
722     fetch c1 into l_dummy;
723     if c1%notfound THEN
724       close c1;
725       return('Y');
726     else
727       close c1;
728       return('N');
729     end if;
730   EXCEPTION
731     when others then
732       return (SQLCODE);
733   END Check_element_number_Unique;
734 
735 -- API name                      : Check_Struc_Published
736 -- Type                          : Utils API
737 -- Pre-reqs                      : None
738 -- Return Value                  : N if not published; Y if published.
739 -- Parameters
740 --    p_structure_id              IN  NUMBER
741 --    p_project_id              IN  NUMBER
742 --
743 --  History
744 --
745 --  01-NOV-01   MAANSARI             -Created
746 --
747 --
748 
749 
750   function Check_Struc_Published
751   (
752     p_project_id                        IN  NUMBER
753    ,p_structure_id                      IN  NUMBER
754   ) return VARCHAR2
755   IS
756     cursor c1 is
757       select '1'
758       from pa_proj_elem_ver_structure
759       where project_id = p_project_id
760       and proj_element_id = p_structure_id
761       and published_date IS NULL;
762     c1_rec c1%rowtype;
763 
764   BEGIN
765     if (p_project_id IS NULL or p_structure_id IS NULL) then
766       return (null);
767     end if;
768 
769     open c1;
770     fetch c1 into c1_rec;
771     if c1%notfound THEN
772       close c1;
773       return('N');
774     else
775       close c1;
776       return('Y');
777     end if;
778   EXCEPTION
779     when others then
780       return (SQLCODE);
781   END Check_Struc_Published;
782 
783 
784 -- API name                      : Check_Delete_task_Ver_Ok
785 -- Type                          : Utils API
786 -- Pre-reqs                      : None
787 -- Return Value                  : N/A
788 -- Parameters
789 --   p_structure_version_id         IN      NUMBER
790 --   x_return_status                OUT     VARCHAR2
791 --   x_error_msg_code           OUT     VARCHAR2
792 --
793 --  History
794 --
795 --  25-JUN-01   HSIU             -Created
796 --
797 --
798 
799 
800   procedure Check_Delete_task_Ver_Ok
801   (
802     p_project_id                        IN  NUMBER
803    ,p_task_version_id                   IN  NUMBER
804    ,p_parent_structure_ver_id           IN  NUMBER
805    ,p_validation_mode                      IN  VARCHAR2   DEFAULT 'U' --bug 2947492
806    ,x_return_status                     OUT NOCOPY VARCHAR2  -- 4537865
807    ,x_error_message_code                OUT NOCOPY VARCHAR2  -- 4537865
808   )
809   IS
810     l_user_id  NUMBER;
811     l_person_id NUMBER;
812     l_dummy     VARCHAR2(1);
813     l_proj_element_id   NUMBER;
814 
815     l_err_code          VARCHAR2(2000);
816     l_err_stage         VARCHAR2(2000);
817     l_err_stack         VARCHAR2(2000);
818 
819     cursor get_person_id(p_user_id NUMBER) IS
820     select p.person_id
821       from per_all_people_f p, fnd_user f
822      where f.employee_id = p.person_id
823        and sysdate between p.effective_start_date and p.effective_end_date
824        and f.user_id = p_user_id;
825 
826     cursor get_lock_user(p_person_id NUMBER) IS
827     select '1'
828       from pa_proj_element_versions v, pa_proj_elem_ver_structure s
829      where v.element_version_id = p_parent_structure_ver_id
830        and v.project_id = s.project_id
831        and v.element_version_id = s.element_version_id
832        and (locked_by_person_id IS NULL
833         or locked_by_person_id = p_person_id);
834 
835     cursor get_link IS
836     select '1'
837       from pa_object_relationships
838      where ( object_id_from1 = p_task_version_id
839              or object_id_to1 = p_task_version_id )
840        and relationship_type = 'L';
841 
842     CURSOR cur_chk_last_ver
843     IS
844       SELECT 'x'
845         FROM pa_proj_element_versions
846        WHERE proj_element_id = ( SELECT proj_element_id
847                                    FROM pa_proj_element_versions
848                                   WHERE element_version_id = p_task_version_id )
849          AND element_version_id <>  p_task_version_id;
850 
851     CURSOR cur_proj_elem_ver
852     IS
853       SELECT ppev.proj_element_id
854         FROM pa_proj_element_versions ppev, pa_tasks pt
855        WHERE ppev.element_version_id = p_task_version_id
856          and ppev.proj_element_id = pt.task_id;
857 
858     -- Bug 3933576 : Added cursor cur_wp_proj_elem_ver and variable l_wp_proj_elem_id
859     CURSOR cur_wp_proj_elem_ver
860     IS
861       SELECT ppev.proj_element_id
862         FROM pa_proj_element_versions ppev
863        WHERE ppev.element_version_id = p_task_version_id
864     ;
865 
866 
867 --hsiu: added for bug 2682805
868     l_dummy2    NUMBER;
869 
870 -- anlee Added for ENG
871     l_return_status VARCHAR2(1);
872     l_msg_count NUMBER;
873     l_msg_data VARCHAR2(2000);
874     l_delete_ok VARCHAR2(250);
875 
876   BEGIN
877     l_user_id := FND_GLOBAL.USER_ID;
878 --dbms_output.put_line('user id = '||l_user_id);
879     --get the current user's person_id
880     open get_person_id(l_user_id);
881     fetch get_person_id into l_person_id;
882     if get_person_id%NOTFOUND then
883       l_person_id := -1;
884     end if;
885     close get_person_id;
886 
887 --dbms_output.put_line( 'Person Id = '||l_person_id);
888 
889 --comment out because linking is not available
890 --    open get_lock_user(l_person_id);
891 --    fetch get_lock_user into l_dummy;
892 --    if get_lock_user%NOTFOUND then
893 --      --the structure version is locked by another user.
894 --      close get_lock_user;
895 --      x_return_status := FND_API.G_RET_STS_ERROR;
896 --      x_error_message_code := 'PA_PS_STRUC_VER_LOCKED';
897 --      --return;
898 --      raise FND_API.G_EXC_ERROR;
899 --
900 --    end if;
901 --    close get_lock_user;
902 
903 --dbms_output.put_line( 'Check if this is a published version ');
904 
905     --Check if this is a published version
906 --hsiu
907 --versioning changes
908 --
909 --    If (PA_PROJECT_STRUCTURE_UTILS.Check_Struc_Ver_Published(p_project_id, p_parent_structure_ver_id) = 'Y') THEN
910       --version is published. Error.
911 --      x_return_status := FND_API.G_RET_STS_ERROR;
912 --      x_error_message_code := 'PA_PS_STRUC_VER_LOCKED';
913 --      return;
914 --    END IF;
915 
916     --check if the structure is worplan
917 --dbms_output.put_line( 'Before if 1 ');
918 
919 --hsiu: added for bug 2682805
920     -- Bug 3933576 : proj_element_id shd come from  cur_wp_proj_elem_ver rather than cur_proj_elem_ver
921     -- because CI, EGO Items and progress check will happen, even if entry is not there in pa_tasks.
922 
923     -- OPEN cur_proj_elem_ver;
924     -- FETCH cur_proj_elem_ver INTO l_proj_element_id;
925     -- CLOSE cur_proj_elem_ver;
926 
927      OPEN cur_wp_proj_elem_ver;
928      FETCH cur_wp_proj_elem_ver INTO l_proj_element_id;
929      CLOSE cur_wp_proj_elem_ver;
930 
931 
932      IF (1 = PA_CONTROL_ITEMS_UTILS.CHECK_CONTROL_ITEM_EXISTS(p_project_id, l_proj_element_id) ) THEN
933        x_return_status := FND_API.G_RET_STS_ERROR;
934 --use this error message according to mthai: PA_CI_ITEMS_EXIST
935 --changed to PA_CI_PROJ_TASK_IN_USE, according to Margaret
936        x_error_message_code := 'PA_CI_PROJ_TASK_IN_USE';
937        return;
938      END IF;
939 --end bug 2682805
940 
941 --anlee
942 --Added for ENG integration
943 
944         PA_EGO_WRAPPER_PUB.check_delete_task_ok_eng(
945                 p_api_version           => 1.0                  ,
946                 p_task_id               => l_proj_element_id    ,
947                 p_init_msg_list         => NULL                 ,
948                 x_delete_ok             => l_delete_ok          ,
949                 x_return_status         => l_return_status      ,
950                 x_errorcode             => l_err_code           ,
951                 x_msg_count             => l_msg_count          ,
952                 x_msg_data              => l_msg_data );
953 
954      IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
955        x_return_status := l_return_status;
956        return;
957      END IF;
958 -- anlee end of changes
959 
960      IF   PA_PROJ_ELEMENTS_UTILS.structure_type(
961                  p_structure_version_id     => p_parent_structure_ver_id
962                  ,p_task_version_id          => null
963                  ,p_structure_type           => 'WORKPLAN'
964                  ) = 'Y'
965      THEN
966          --call selvas API
967      -- Bug 3933576 : NO need to open cursor cur_proj_elem_ver here, l_proj_element_id is already fetched
968          --OPEN cur_proj_elem_ver;
969          --FETCH cur_proj_elem_ver INTO l_proj_element_id;
970          --CLOSE cur_proj_elem_ver;
971 
972          -- 4201927 commented below code as check_task_progress_exist is deriving project id and then
973          -- calling check_object_has_prog api
974          /*
975          IF pa_project_structure_utils.check_task_progress_exist(l_proj_element_id) = 'Y' THEN
976              x_return_status := FND_API.G_RET_STS_ERROR;
977              x_error_message_code := 'PA_PS_TASK_HAS_PROG';
978              raise FND_API.G_EXC_ERROR;
979          END IF;
980          */
981 
982          -- using the direct api check_object_has_prog
983 
984          IF pa_progress_utils.check_object_has_prog(p_project_id => p_project_id, p_object_id => l_proj_element_id) = 'Y' THEN
985              x_return_status := FND_API.G_RET_STS_ERROR;
986              x_error_message_code := 'PA_PS_TASK_HAS_PROG';
987              raise FND_API.G_EXC_ERROR;
988          END IF;
989         -- 4201927 end
990 
991         -- 4201927 , delete dlvr to task association api should get called for
992         -- all the tasks
993 
994         PA_DELIVERABLE_PUB.delete_dlv_task_asscn_in_bulk
995          (
996              p_task_element_id      => l_proj_element_id
997             ,p_project_id           => p_project_id
998             ,p_task_version_id      => p_task_version_id
999             ,p_delete_or_validate   => 'V'
1000             ,x_return_status        => l_return_status
1001             ,x_msg_count            => l_msg_count
1002             ,x_msg_data             => l_msg_data
1003          );
1004 
1005 	 --  4537865 Changed from x_return_status to l_return_status
1006          IF l_return_status = FND_API.G_RET_STS_ERROR then
1007              RAISE FND_API.G_EXC_ERROR;
1008          End If;
1009 
1010          -- 4201927 end
1011 
1012 /*
1013          IF pa_progress_utils.PROJ_TASK_PROG_EXISTS(p_project_id, l_proj_element_id) = 'Y' THEN
1014              x_return_status := FND_API.G_RET_STS_ERROR;
1015              x_error_message_code := 'PA_PS_TASK_HAS_PROG';
1016              raise FND_API.G_EXC_ERROR;
1017          END IF;
1018 
1019          IF pa_progress_utils.progress_record_exists( p_task_version_id, 'PA_TASKS'
1020                             ,p_project_id) = 'Y' -- Fixed bug # 3688901.
1021          THEN
1022              x_return_status := FND_API.G_RET_STS_ERROR;
1023              x_error_message_code := 'PA_PS_CANT_DELETE_TASK_VER';
1024              PA_UTILS.ADD_MESSAGE('PA', 'PA_PS_CANT_DELETE_TASK_VER');
1025              raise FND_API.G_EXC_ERROR;
1026          END IF;
1027 */
1028      END IF;
1029 
1030      IF PA_PROJ_ELEMENTS_UTILS.structure_type(
1031                  p_structure_version_id     => p_parent_structure_ver_id
1032                  ,p_task_version_id          => null
1033                  ,p_structure_type           => 'FINANCIAL'
1034                  ) = 'Y' THEN
1035         --Check if this is a billing/costing structure version
1036          --if it is, check to see if it is the last version
1037 
1038          --dbms_output.put_line( 'Before cur_chk_last_ver');
1039 
1040 --         OPEN cur_chk_last_ver;
1041 --         FETCH cur_chk_last_ver INTO l_dummy;
1042 --         IF cur_chk_last_ver%NOTFOUND -- p_task_version is the last version
1043 --         THEN
1044              OPEN cur_proj_elem_ver;
1045              FETCH cur_proj_elem_ver INTO l_proj_element_id;
1046              CLOSE cur_proj_elem_ver;
1047              --Check if it is okay to delete task
1048 
1049              IF (l_proj_element_id IS NOT NULL) THEN --it can be partial share
1050                PA_TASK_UTILS.CHECK_DELETE_TASK_OK( x_task_id     => l_proj_element_id,
1051                                                  x_validation_mode => p_validation_mode,   --bug 2947492
1052                                                  x_err_code    => l_err_code,
1053                                                  x_err_stage   => l_err_stage,
1054                                                  x_err_stack   => l_err_stack);
1055 
1056                IF (l_err_code <> 0) THEN
1057                   x_return_status := FND_API.G_RET_STS_ERROR;
1058                   x_error_message_code := l_err_stage;
1059                   raise FND_API.G_EXC_ERROR;
1060                END IF;
1061              END IF;
1062 
1063 --         END IF;
1064 --         CLOSE cur_chk_last_ver;
1065      END IF;
1066 
1067 --linking is not available yet. Comment out
1068     --Check if this task version has any links
1069 --    open get_link;
1070 --    fetch get_link into l_dummy;
1071 --    if get_link%FOUND then
1072 --      --a link exists
1073 --      close get_link;
1074 --      x_return_status := FND_API.G_RET_STS_ERROR;
1075 --      x_error_message_code := 'PA_PS_LINK_EXISTS';
1076 --      return;
1077 --    end if;
1078 --    close get_link;
1079 
1080     x_return_status := FND_API.G_RET_STS_SUCCESS;
1081 
1082   EXCEPTION
1083     WHEN FND_API.G_EXC_ERROR THEN
1084       x_return_status := FND_API.G_RET_STS_ERROR;
1085 
1086       -- 4537865
1087       -- Not Resetting x_error_message_code unconditionally as after its population only
1088       -- it will reach here. In case if its not populated then,populate the generic msg
1089 
1090       IF x_error_message_code is NULL THEN
1091 	 x_error_message_code :=  'PA_CHECK_DELETE_TASK_FAILED';
1092       END IF;
1093 
1094     WHEN OTHERS THEN
1095       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1096 
1097       -- 4537865
1098       x_error_message_code := SQLCODE;
1099       fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJ_ELEMENTS_UTILS',
1100                               p_procedure_name => 'Check_Delete_task_Ver_Ok',
1101 			      p_error_text => SUBSTRB(SQLERRM,1,240)); -- 4537865
1102       RAISE;
1103   END Check_Delete_task_Ver_Ok;
1104 
1105   function structure_type(
1106     p_structure_version_id NUMBER,
1107     p_task_version_id      NUMBER,
1108     p_structure_type       VARCHAR2 ) RETURN VARCHAR2 IS
1109 
1110     CURSOR cur_proj_elem
1111     IS
1112       SELECT parent_structure_version_id
1113         FROM pa_proj_element_versions
1114        WHERE element_version_id = p_task_version_id
1115          AND object_type = 'PA_TASKS';
1116 
1117     CURSOR cur_struc_type( x_structure_version_id NUMBER )
1118     IS
1119       SELECT 'Y'
1120         FROM pa_proj_element_versions ppev
1121             ,pa_proj_structure_types ppst
1122             ,pa_structure_types pst
1123        WHERE ppev.element_version_id = x_structure_version_id
1124          AND ppev.proj_element_id = ppst.proj_element_id
1125          AND ppst.structure_type_id = pst.structure_type_id
1126          AND pst.structure_type_class_code = p_structure_type;
1127 
1128 
1129    l_structure_version_id  NUMBER;
1130    l_dummy_char            VARCHAR2(1);
1131   begin
1132       OPEN cur_proj_elem;
1133       FETCH cur_proj_elem INTO l_structure_version_id;
1134       CLOSE cur_proj_elem;
1135 
1136       IF l_structure_version_id IS NULL
1137       THEN
1138          l_structure_version_id := p_structure_version_id;
1139       END IF;
1140 
1141       OPEN cur_struc_type( l_structure_version_id );
1142       FETCH cur_struc_type INTO l_dummy_char;
1143       IF cur_struc_type%FOUND
1144       THEN
1145          CLOSE cur_struc_type;
1146          RETURN 'Y';
1147       ELSE
1148          CLOSE cur_struc_type;
1149          RETURN 'N';
1150       END IF;
1151 
1152   end structure_type;
1153 
1154 FUNCTION is_summary_task_or_structure( p_element_version_id NUMBER
1155                                      , p_structure_type VARCHAR2 -- Bug# 10385414
1156                                      ) RETURN VARCHAR2 IS
1157  /*  CURSOR cur_obj_rel
1158    IS
1159     SELECT 'x'
1160       FROM  pa_object_relationships
1161      WHERE object_id_from1 = p_element_version_id
1162      --hsiu: bug 2800553: performance
1163        and rownum < 2
1164       --start with object_id_from1 = p_element_version_id
1165         AND object_type_from = 'PA_TASKS'
1166         AND relationship_type = 'S'
1167         And object_id_to1 NOT IN (
1168           select b.object_id_from1
1169             from pa_object_relationships a,
1170                  pa_object_relationships b
1171            where a.object_id_from1 = p_element_version_id
1172              and a.object_id_to1 = b.object_id_from1
1173              and a.relationship_type = 'S'
1174              and b.relationship_type IN ('LW', 'LF'))
1175        ;*/
1176 
1177 -- Bug 6156686
1178        CURSOR cur_obj_rel
1179        IS
1180        SELECT NULL
1181        FROM   DUAL
1182        WHERE  EXISTS
1183        (SELECT NULL
1184         FROM   pa_object_relationships por,
1185                pa_proj_element_versions pev,
1186                pa_proj_elements pe
1187         WHERE  por.object_id_from1 = p_element_version_id
1188         AND    por.object_type_from ='PA_TASKS'
1189         AND    por.relationship_type = 'S'
1190         AND    por.object_id_to1=pev.element_version_id
1191         AND    pe.proj_element_id=pev.proj_element_id
1192         AND    (((NVL(pe.link_task_flag,'N') <> 'Y'))
1193    --     AND    pev.financial_task_flag = 'Y'))
1194                 OR    (pe.task_status is not null)));  -- Added AND Condition for Bug 7210236
1195 				--Added the OR condition for bug 8992059
1196 
1197      --connect by object_id_from1 = prior object_id_to1 ;
1198 
1199 	   -- Bug#10385414 - Cursor specific to financial structure. Cursor is important
1200 	   -- when there is a partially shared structure and the same data is shared between
1201 	   -- workplan and financial structure, but some tasks are not marked for financial structure
1202        CURSOR cur_obj_rel_fin
1203        IS
1204        SELECT NULL
1205        FROM   DUAL
1206        WHERE  EXISTS
1207        (SELECT NULL
1208         FROM   pa_object_relationships por,
1209                pa_proj_element_versions pev,
1210                pa_proj_elements pe
1211         WHERE  por.object_id_from1 = p_element_version_id
1212         AND    por.object_type_from ='PA_TASKS'
1213         AND    por.relationship_type = 'S'
1214         AND    por.object_id_to1=pev.element_version_id
1215         AND    pe.proj_element_id=pev.proj_element_id
1216         AND    NVL(pe.link_task_flag,'N') <> 'Y'
1217         AND    pev.financial_task_flag = 'Y'); -- checks for financial subtask for current task
1218 
1219 
1220 v_dummy_char VARCHAR2(1);
1221 BEGIN
1222 
1223   IF p_structure_type = 'FINANCIAL' THEN
1224     OPEN cur_obj_rel_fin;
1225    FETCH cur_obj_rel_fin INTO v_dummy_char;
1226    IF cur_obj_rel_fin%FOUND
1227    THEN
1228       CLOSE cur_obj_rel_fin;
1229       RETURN 'Y';
1230    ELSE
1231       CLOSE cur_obj_rel_fin;
1232       RETURN 'N';
1233    END IF;
1234   ELSE -- if Structure is Workplan - which is the default option
1235 
1236    OPEN cur_obj_rel;
1237    FETCH cur_obj_rel INTO v_dummy_char;
1238    IF cur_obj_rel%FOUND
1239    THEN
1240       CLOSE cur_obj_rel;
1241       RETURN 'Y';
1242    ELSE
1243       CLOSE cur_obj_rel;
1244       RETURN 'N';
1245    END IF;
1246   END IF;
1247 
1248 END is_summary_task_or_structure;
1249 
1250 
1251   procedure Check_Date_range
1252   (
1253     p_scheduled_start_date      IN      DATE            :=null
1254    ,p_scheduled_end_date        IN      DATE            :=null
1255    ,p_obligation_start_date   IN        DATE          :=null
1256    ,p_obligation_end_date       IN      DATE          :=null
1257    ,p_actual_start_date       IN        DATE          :=null
1258    ,p_actual_finish_date        IN      DATE          :=null
1259    ,p_estimate_start_date       IN      DATE          :=null
1260    ,p_estimate_finish_date      IN      DATE          :=null
1261    ,p_early_start_date        IN        DATE            :=null
1262    ,p_early_end_date          IN        DATE          :=null
1263    ,p_late_start_date         IN        DATE          :=null
1264    ,p_late_end_date           IN        DATE          :=null
1265    ,x_return_status                     OUT NOCOPY VARCHAR2 -- 4537865
1266    ,x_error_message_code                OUT NOCOPY VARCHAR2 -- 4537865
1267   ) IS
1268 
1269 begin
1270     x_return_status := FND_API.G_RET_STS_SUCCESS;
1271 
1272     IF p_scheduled_start_date IS NOT NULL AND p_scheduled_end_date IS NOT NULL
1273     THEN
1274        IF p_scheduled_start_date > p_scheduled_end_date
1275        THEN
1276           x_return_status := FND_API.G_RET_STS_ERROR;
1277           x_error_message_code := 'PA_PS_SCH_ST_DT_GT_EN_DT';
1278           return;
1279        END IF;
1280     END IF;
1281 
1282     IF p_obligation_start_date IS NOT NULL AND p_obligation_end_date IS NOT NULL
1283     THEN
1284        IF p_obligation_start_date > p_obligation_end_date
1285        THEN
1286           x_return_status := FND_API.G_RET_STS_ERROR;
1287           x_error_message_code := 'PA_PS_OBL_ST_DT_GT_EN_DT';
1288           return;
1289        END IF;
1290     END IF;
1291 
1292     IF p_actual_start_date IS NOT NULL AND p_actual_finish_date IS NOT NULL
1293     THEN
1294        IF p_actual_start_date > p_actual_finish_date
1295        THEN
1296           x_return_status := FND_API.G_RET_STS_ERROR;
1297           x_error_message_code := 'PA_PS_ACT_ST_DT_GT_EN_DT';
1298           return;
1299        END IF;
1300     END IF;
1301 
1302     IF p_estimate_start_date IS NOT NULL AND p_estimate_finish_date IS NOT NULL
1303     THEN
1304        IF p_estimate_start_date > p_estimate_finish_date
1305        THEN
1306           x_return_status := FND_API.G_RET_STS_ERROR;
1307           x_error_message_code := 'PA_PS_EST_ST_DT_GT_EN_DT';
1308           return;
1309        END IF;
1310     END IF;
1311 
1312     IF p_early_start_date IS NOT NULL AND p_early_end_date IS NOT NULL
1313     THEN
1314        IF p_early_start_date > p_early_end_date
1315        THEN
1316           x_return_status := FND_API.G_RET_STS_ERROR;
1317           x_error_message_code := 'PA_PS_ERL_ST_DT_GT_EN_DT';
1318           return;
1319        END IF;
1320     END IF;
1321 
1322     IF p_late_start_date IS NOT NULL AND p_late_end_date IS NOT NULL
1323     THEN
1324        IF p_late_start_date > p_late_end_date
1325        THEN
1326           x_return_status := FND_API.G_RET_STS_ERROR;
1327           x_error_message_code := 'PA_PS_LAT_ST_DT_GT_EN_DT';
1328           return;
1329        END IF;
1330     END IF;
1331 -- 4537865
1332 EXCEPTION
1333 	WHEN OTHERS THEN
1334 		x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
1335 		x_error_message_code := SQLCODE ;
1336 		fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROJ_ELEMENTS_UTILS',
1337                               p_procedure_name => 'Check_Date_range',
1338                               p_error_text     => SUBSTRB(SQLERRM,1,240));
1339 		RAISE;
1340 end Check_Date_range;
1341 
1342 PROCEDURE Project_Name_Or_Id
1343   (
1344     p_project_name                      IN  VARCHAR2
1345    ,p_project_id                        IN  NUMBER
1346    ,p_check_id_flag                     IN  VARCHAR2 := 'Y'
1347    ,x_project_id                        OUT NOCOPY  NUMBER -- 4537865
1348    ,x_return_status                     OUT NOCOPY VARCHAR2 -- 4537865
1349    ,x_error_msg_code                OUT  NOCOPY VARCHAR2 -- 4537865
1350   )
1351   IS
1352   BEGIN
1353     IF (p_project_id IS NOT NULL) THEN
1354       IF (p_check_id_flag = 'Y') THEN
1355         select project_id
1356           into x_project_id
1357           from pa_projects_all
1358          where project_id = p_project_id;
1359       ELSE
1360         x_project_id := p_project_id;
1361       END IF;
1362     ELSE
1363       select project_id
1364         into x_project_id
1365         from pa_projects_all
1366        where segment1 = p_project_name;
1367     END IF;
1368     x_return_status := FND_API.G_RET_STS_SUCCESS;
1369   EXCEPTION
1370        WHEN no_data_found THEN
1371          x_return_status:= FND_API.G_RET_STS_ERROR;
1372          x_error_msg_code:= 'PA_PS_INVALID_PRJ_NAME';
1373 	 x_project_id := NULL ; -- 4537865
1374 
1375        WHEN too_many_rows THEN
1376          x_return_status:= FND_API.G_RET_STS_ERROR;
1377          x_error_msg_code:= 'PA_PS_PRJ_NAME_NOT_UNIQUE';
1378 	 x_project_id := NULL ; -- 4537865
1379        WHEN OTHERS THEN
1380          x_return_status:= FND_API.G_RET_STS_UNEXP_ERROR;
1381 	  x_project_id := NULL ; -- 4537865
1382          RAISE;
1383   END Project_Name_Or_Id;
1384 
1385 PROCEDURE task_Ver_Name_Or_Id
1386   (
1387     p_task_name                         IN  VARCHAR2
1388    ,p_task_version_id                   IN  NUMBER
1389    ,p_structure_version_id              IN NUMBER
1390    ,p_check_id_flag                     IN  VARCHAR2 := 'Y'
1391    ,x_task_version_id                   OUT NOCOPY  NUMBER  -- 4537865
1392    ,x_return_status                     OUT NOCOPY VARCHAR2  -- 4537865
1393    ,x_error_msg_code                    OUT NOCOPY VARCHAR2  -- 4537865
1394   )
1395   IS
1396   BEGIN
1397     IF (p_task_version_id IS NOT NULL) THEN
1398       IF (p_check_id_flag = 'Y') THEN
1399         select element_version_id
1400           into x_task_version_id
1401           from pa_proj_element_versions
1402          where element_version_id = p_task_version_id;
1403       ELSE
1404         x_task_version_id := p_task_version_id;
1405       END IF;
1406     ELSE
1407       select element_version_id
1408         into x_task_version_id
1409         from pa_proj_elements ppe, pa_proj_element_versions ppev
1410        where ppe.proj_element_id = ppev.proj_element_id
1411          AND ppe.name = p_task_name
1412          AND ppev.parent_structure_version_id = p_structure_version_id;
1413        null;
1414     END IF;
1415     x_return_status := FND_API.G_RET_STS_SUCCESS;
1416   EXCEPTION
1417        WHEN no_data_found THEN
1418          x_return_status:= FND_API.G_RET_STS_ERROR;
1419          x_error_msg_code:= 'PA_PS_INVALID_TSK_NAME';
1420 	 -- 4537865
1421 	 x_task_version_id := NULL ;
1422 
1423        WHEN too_many_rows THEN
1424          x_return_status:= FND_API.G_RET_STS_ERROR;
1425          x_error_msg_code:= 'PA_PS_TSK_NAME_NOT_UNIQUE';
1426          -- 4537865
1427          x_task_version_id := NULL ;
1428 
1429        WHEN OTHERS THEN
1430          x_return_status:= FND_API.G_RET_STS_UNEXP_ERROR;
1431          -- 4537865
1432          x_task_version_id := NULL ;
1433 	 x_error_msg_code:= SQLCODE ;
1434 
1435          RAISE;
1436 END task_Ver_Name_Or_Id;
1437 
1438 /* ----------------------------------------------------------------------
1439 ||
1440 ||  Procedure Name:  UPDATE_WBS_NUMBERS
1441 ||
1442 ||  Author        : Andrew Lee
1443 ||  Description:
1444 ||     This procedure is called update the wbs numbers in the task
1445 ||     hierarchy whenever any of the following actions occur:
1446 ||     INSERT
1447 ||     INDENT
1448 ||     OUTDENT
1449 ||     COPY
1450 ||     DELETE
1451 || ---------------------------------------------------------------------
1452 */
1453 PROCEDURE UPDATE_WBS_NUMBERS ( p_commit                  IN        VARCHAR2
1454                               ,p_debug_mode              IN        VARCHAR2
1455                               ,p_parent_structure_ver_id IN        NUMBER
1456                               ,p_task_id                 IN        NUMBER
1457                               ,p_display_seq             IN        NUMBER
1458                               ,p_action                  IN        VARCHAR2
1459                               ,p_parent_task_id          IN        NUMBER
1460 			                  ,p_task_version_id         IN        NUMBER   DEFAULT -1    --bug 13895419
1461 			                  ,p_ref_task_version_id     IN        NUMBER   DEFAULT -1    --bug 13895419
1462 			                  ,p_peer_or_sub             IN        VARCHAR2 DEFAULT 'xxx' --bug 13895419
1463                               ,x_return_status          OUT NOCOPY       VARCHAR2) -- 4537865
1464 IS
1465   CURSOR TASK_INFO_CSR(c_task_id NUMBER)
1466   IS
1467   SELECT rel.object_id_from1 parent_task_id, pev.wbs_number
1468   FROM   PA_PROJ_ELEMENT_VERSIONS pev, PA_OBJECT_RELATIONSHIPS rel
1469   WHERE  pev.element_version_id = c_task_id
1470   AND    pev.object_type = 'PA_TASKS'
1471   AND    rel.object_id_to1 = pev.element_version_id
1472   AND    rel.relationship_type = 'S'
1473   AND    rel.object_type_from in ('PA_TASKS', 'PA_STRUCTURES');
1474 
1475   CURSOR UPDATE_MASKED_TASKS_CSR (c_parent_structure_ver_id NUMBER, c_display_seq NUMBER, c_mask VARCHAR2)
1476   IS
1477   SELECT element_version_id task_id, wbs_number, display_sequence
1478   FROM   PA_PROJ_ELEMENT_VERSIONS
1479   WHERE  parent_structure_version_id = c_parent_structure_ver_id
1480   AND    object_type = 'PA_TASKS'
1481   AND    abs(display_sequence) >= abs(c_display_seq)
1482   AND    display_sequence <> c_display_seq
1483   --  AND    substr(wbs_number, 1, length(c_mask)) = c_mask   Commented for bug 3581030
1484   AND    substr(wbs_number, 1, length(c_mask)+1) = c_mask||'.'  -- Added for bug 3581030
1485   ORDER BY abs(display_sequence);
1486 
1487   CURSOR UPDATE_TASKS_CSR (c_parent_structure_ver_id NUMBER, c_display_seq NUMBER)
1488   IS
1489   SELECT element_version_id task_id, wbs_number, display_sequence
1490   FROM   PA_PROJ_ELEMENT_VERSIONS
1491   WHERE  parent_structure_version_id = c_parent_structure_ver_id
1492   AND    object_type = 'PA_TASKS'
1493   AND    abs(display_sequence) >= abs(c_display_seq)
1494   AND    display_sequence <> c_display_seq
1495   ORDER BY abs(display_sequence);
1496 
1497   CURSOR GET_TASK_CSR (c_parent_structure_ver_id NUMBER, c_display_seq NUMBER)
1498   IS
1499   SELECT element_version_id task_id
1500   FROM   PA_PROJ_ELEMENT_VERSIONS
1501   WHERE  parent_structure_version_id = c_parent_structure_ver_id
1502   AND    object_type = 'PA_TASKS'
1503   AND  display_sequence = c_display_seq;
1504 
1505   CURSOR GET_PREV_PEER_TASK_CSR(c_parent_structure_ver_id NUMBER, c_parent_task_id NUMBER, c_display_seq NUMBER)
1506   IS
1507   SELECT element_version_id task_id
1508   FROM   PA_PROJ_ELEMENT_VERSIONS
1509   WHERE  parent_structure_version_id = c_parent_structure_ver_id
1510   AND    object_type = 'PA_TASKS'
1511   AND    display_sequence =
1512     (SELECT max(pev.display_sequence)
1513      FROM   PA_PROJ_ELEMENT_VERSIONS pev, PA_OBJECT_RELATIONSHIPS rel
1514      WHERE  rel.object_type_from = 'PA_TASKS'
1515      AND    rel.object_id_from1 = c_parent_task_id
1516      AND    rel.relationship_type = 'S'
1517      AND    rel.object_type_to =  'PA_TASKS'
1518      AND    rel.object_id_to1 = pev.element_version_id
1519      AND    pev.parent_structure_version_id = c_parent_structure_ver_id
1520      AND    pev.display_sequence < c_display_seq);
1521 
1522   -- bug 13895419 fetch data from PA_PROJ_ELEM_RELATIONSHIP_T table
1523   CURSOR GET_PREV_PEER_TASK_CSR1(c_parent_structure_ver_id NUMBER, c_parent_task_id NUMBER, c_display_seq NUMBER)
1524   IS
1525   SELECT t2.child_ver_id task_id
1526   FROM (SELECT parent_ver_id, MAX (display_sequence) max_ds
1527             FROM PA_PROJ_ELEM_RELATIONSHIP_T
1528         where parent_ver_id = c_parent_task_id
1529         and display_sequence < c_display_seq
1530         GROUP BY parent_ver_id) t1,
1531        PA_PROJ_ELEM_RELATIONSHIP_T t2
1532   WHERE t1.parent_ver_id = t2.parent_ver_id AND t1.max_ds = t2.display_sequence;
1533 
1534   CURSOR GET_PREV_TOP_PEER_TASK_CSR(c_parent_structure_ver_id NUMBER, c_display_seq NUMBER)
1535   IS
1536   SELECT element_version_id task_id
1537   FROM   PA_PROJ_ELEMENT_VERSIONS
1538   WHERE  parent_structure_version_id = c_parent_structure_ver_id
1539   AND    object_type = 'PA_TASKS'
1540   AND    display_sequence =
1541     (SELECT max(pev.display_sequence)
1542      FROM   PA_PROJ_ELEMENT_VERSIONS pev, PA_OBJECT_RELATIONSHIPS rel
1543      WHERE  rel.object_type_from = 'PA_STRUCTURES'
1544      AND    rel.object_id_from1 = c_parent_structure_ver_id
1545      AND    rel.relationship_type = 'S'
1546      AND    rel.object_type_to =  'PA_TASKS'
1547      AND    rel.object_id_to1 = pev.element_version_id
1548      AND    pev.parent_structure_version_id = c_parent_structure_ver_id
1549      AND    display_sequence < c_display_seq);
1550 
1551   l_task_rec        TASK_INFO_CSR%ROWTYPE;
1552   l_prev_task_rec   TASK_INFO_CSR%ROWTYPE;
1553   l_parent_task_rec TASK_INFO_CSR%ROWTYPE;
1554   l_temp            TASK_INFO_CSR%ROWTYPE;
1555   l_update_task_rec UPDATE_TASKS_CSR%ROWTYPE;
1556   l_task_id         NUMBER;
1557 
1558   l_count           NUMBER;
1559   l_wbs_number      VARCHAR2(1000);
1560   l_mask            VARCHAR2(1000);
1561   l_branch_mask     VARCHAR2(1000);
1562   l_mask2           VARCHAR2(1000);
1563   l_prev_disp_seq   NUMBER;
1564   l_prev_task_id    NUMBER;
1565   l_increment       VARCHAR2(255);
1566   l_str1            VARCHAR2(1000);
1567   l_str2            VARCHAR2(1000);
1568   l_loop_wbs_number VARCHAR2(1000);
1569   l_flag            BOOLEAN;
1570 
1571   API_ERROR         EXCEPTION;
1572   l_number          NUMBER; -- Bug 2786662
1573   --Bug 13895419 start
1574   l_parent_task_id  PA_OBJECT_RELATIONSHIPS.object_id_from1%TYPE;
1575   l_ref_parent_task_id  PA_OBJECT_RELATIONSHIPS.object_id_from1%TYPE;
1576   --Bug 13895419 end
1577 BEGIN
1578   if p_commit = 'Y' then
1579     savepoint update_wbs_numbers;
1580   end if;
1581 
1582   if(p_action <> 'DELETE') then
1583     OPEN TASK_INFO_CSR(p_task_id);
1584     FETCH TASK_INFO_CSR INTO l_task_rec;
1585     if(TASK_INFO_CSR%NOTFOUND) then
1586       CLOSE TASK_INFO_CSR;
1587       x_return_status := 'E';
1588       raise API_ERROR;
1589     end if;
1590     CLOSE TASK_INFO_CSR;
1591   end if;
1592 
1593   -- INSERT or COPY
1594   if((p_action = 'INSERT') OR (p_action = 'COPY')) then
1595     if(l_task_rec.parent_task_id = p_parent_structure_ver_id) then
1596       -- Inserted task is a top task
1597       -- Added the leading hint below for bug 3416314
1598       -- Smukka Merging branch 40 as of now with main branch
1599       SELECT /*+ LEADING (rel) */ count(pev.element_version_id)
1600       INTO   l_count
1601       FROM   PA_PROJ_ELEMENT_VERSIONS pev, PA_OBJECT_RELATIONSHIPS rel
1602       WHERE  pev.parent_structure_version_id = p_parent_structure_ver_id
1603       AND    pev.object_type = 'PA_TASKS'
1604       AND    abs(pev.display_sequence) <= abs(p_display_seq)
1605       AND    rel.object_id_to1 = pev.element_version_id
1606       AND    rel.relationship_type = 'S'
1607       AND    rel.object_type_from = 'PA_STRUCTURES'
1608       AND    rel.object_id_from1 = p_parent_structure_ver_id
1609       AND    rel.object_type_to = 'PA_TASKS'; --Added for Bug 6430953
1610 
1611       l_wbs_number := l_count;
1612       l_mask := 'NONE';
1613     else
1614       -- Inserted task is a child task
1615       l_prev_disp_seq := abs(p_display_seq) - 1;
1616       OPEN GET_TASK_CSR(p_parent_structure_ver_id, l_prev_disp_seq);
1617       FETCH GET_TASK_CSR INTO l_prev_task_id;
1618       if(GET_TASK_CSR%NOTFOUND) then
1619         CLOSE GET_TASK_CSR;
1620         OPEN GET_TASK_CSR(p_parent_structure_ver_id, l_prev_disp_seq * -1);
1621         FETCH GET_TASK_CSR INTO l_prev_task_id;
1622         if(GET_TASK_CSR%NOTFOUND) then
1623           CLOSE GET_TASK_CSR;
1624           x_return_status := 'E';
1625           raise API_ERROR;
1626         end if;
1627       end if;
1628 
1629       CLOSE GET_TASK_CSR;
1630 
1631 
1632       if(l_prev_task_id = l_task_rec.parent_task_id) then
1633         -- Previous task is a parent
1634         OPEN TASK_INFO_CSR(l_prev_task_id);
1635         FETCH TASK_INFO_CSR INTO l_prev_task_rec;
1636         CLOSE TASK_INFO_CSR;
1637 
1638         l_wbs_number := l_prev_task_rec.wbs_number || '.1';
1639         l_mask := l_prev_task_rec.wbs_number;
1640       else
1641         -- Previous task is a peer task
1642         OPEN TASK_INFO_CSR(l_task_rec.parent_task_id);
1643         FETCH TASK_INFO_CSR INTO l_parent_task_rec;
1644         CLOSE TASK_INFO_CSR;
1645 	    --Bug 13895419 start
1646         IF p_peer_or_sub = 'xxx' then
1647         OPEN GET_PREV_PEER_TASK_CSR(p_parent_structure_ver_id, l_task_rec.parent_task_id, p_display_seq);
1648         FETCH GET_PREV_PEER_TASK_CSR INTO l_prev_task_id;
1649         CLOSE GET_PREV_PEER_TASK_CSR;
1650 	    ELSE --If p_peer_or_sub is not default value, then open GET_PREV_PEER_TASK_CSR1 cursor.
1651 	    OPEN GET_PREV_PEER_TASK_CSR1(p_parent_structure_ver_id, l_task_rec.parent_task_id, p_display_seq);
1652         FETCH GET_PREV_PEER_TASK_CSR1 INTO l_prev_task_id;
1653         CLOSE GET_PREV_PEER_TASK_CSR1;
1654 	    END if;
1655         --Bug 13895419 end
1656         OPEN TASK_INFO_CSR(l_prev_task_id);
1657         FETCH TASK_INFO_CSR INTO l_prev_task_rec;
1658         CLOSE TASK_INFO_CSR;
1659 
1660         l_increment := to_char(to_number(substr(l_prev_task_rec.wbs_number, length(l_parent_task_rec.wbs_number) + 2)) + 1);
1661         l_wbs_number := substr(l_prev_task_rec.wbs_number, 1, length(l_parent_task_rec.wbs_number)) || '.' || l_increment;
1662         l_mask := l_parent_task_rec.wbs_number;
1663       end if;
1664     end if; -- ig(l_task_rec.parent_task_id = p_parent_structure_ver_id) then
1665 
1666     -- Update the WBS number for the inserted task
1667     UPDATE PA_PROJ_ELEMENT_VERSIONS
1668     SET    wbs_number = l_wbs_number
1669     WHERE  element_version_id = p_task_id;
1670 
1671     -- Loop through tasks that have a greater display seq than the current
1672     -- and begins with the same mask (in the same branch)
1673     if(l_mask = 'NONE') then
1674       OPEN UPDATE_TASKS_CSR(p_parent_structure_ver_id, p_display_seq);
1675     else
1676       OPEN UPDATE_MASKED_TASKS_CSR(p_parent_structure_ver_id, p_display_seq, l_mask);
1677     end if;
1678     --Bug 13895419 start
1679     --Fetch parent_task_id and ref_parent_task_id for source task and target task respectively from db.
1680     begin
1681         SELECT rel.object_id_from1 INTO l_parent_task_id
1682 	    FROM   PA_PROJ_ELEMENT_VERSIONS pev, PA_OBJECT_RELATIONSHIPS rel
1683 	    WHERE  pev.element_version_id = p_task_version_id
1684 	    AND    pev.object_type = 'PA_TASKS'
1685 	    AND    rel.object_id_to1 = pev.element_version_id
1686 	    AND    rel.relationship_type = 'S'
1687 	    AND    rel.object_type_from in ('PA_TASKS', 'PA_STRUCTURES');
1688 
1689         SELECT rel.object_id_from1 INTO l_ref_parent_task_id
1690 	    FROM   PA_PROJ_ELEMENT_VERSIONS pev, PA_OBJECT_RELATIONSHIPS rel
1691 	    WHERE  pev.element_version_id = p_ref_task_version_id
1692 	    AND    pev.object_type = 'PA_TASKS'
1693 	    AND    rel.object_id_to1 = pev.element_version_id
1694 	    AND    rel.relationship_type = 'S'
1695 	    AND    rel.object_type_from in ('PA_TASKS', 'PA_STRUCTURES');
1696     EXCEPTION
1697         WHEN OTHERS then
1698 	      l_parent_task_id := null;
1699           l_ref_parent_task_id := null;
1700     end;
1701     -- Excecute below loop only if p_peer_or_sub is Sub or default value or parent task is not same for source and destination task.
1702     IF p_peer_or_sub = 'SUB' OR p_peer_or_sub = 'xxx' or (p_peer_or_sub = 'PEER' and l_parent_task_id <> l_ref_parent_task_id)
1703     then
1704     --Bug 13895419 end
1705     LOOP
1706       if(l_mask = 'NONE') then
1707         FETCH UPDATE_TASKS_CSR INTO l_update_task_rec;
1708         EXIT WHEN UPDATE_TASKS_CSR%NOTFOUND;
1709 
1710         if(instr(l_update_task_rec.wbs_number, '.') <> 0) then
1711           l_str1 := substr(l_update_task_rec.wbs_number, 1, instr(l_update_task_rec.wbs_number, '.') - 1);
1712           l_str2 := substr(l_update_task_rec.wbs_number, instr(l_update_task_rec.wbs_number, '.'));
1713           l_str1 := to_char(to_number(l_str1 + 1));
1714 
1715           l_wbs_number := l_str1 || l_str2;
1716         else
1717           l_wbs_number := to_char(to_number(l_update_task_rec.wbs_number) + 1);
1718         end if;
1719       else
1720         FETCH UPDATE_MASKED_TASKS_CSR INTO l_update_task_rec;
1721         EXIT WHEN UPDATE_MASKED_TASKS_CSR%NOTFOUND;
1722 
1723         l_str1 := substr(l_update_task_rec.wbs_number, length(l_mask) + 2);
1724         if(instr(l_str1, '.') <> 0) then
1725           l_str2 := substr(l_str1, instr(l_str1, '.'));
1726           l_str1 := substr(l_str1, 1, instr(l_str1, '.') - 1);
1727           l_str1 := to_char(to_number(l_str1) + 1);
1728 
1729           l_wbs_number := l_mask || '.' || l_str1 || l_str2;
1730         else
1731           l_str1 := to_char(to_number(l_str1) + 1);
1732           l_wbs_number := l_mask || '.' || l_str1;
1733         end if;
1734 
1735       end if;
1736 
1737       -- Update the WBS number
1738       UPDATE PA_PROJ_ELEMENT_VERSIONS
1739       SET    wbs_number = l_wbs_number
1740       WHERE  element_version_id = l_update_task_rec.task_id;
1741     END LOOP;
1742     END if;
1743     --skkoppul bug 13895419 end
1744     if(l_mask = 'NONE') then
1745       CLOSE UPDATE_TASKS_CSR;
1746     else
1747       CLOSE UPDATE_MASKED_TASKS_CSR;
1748     end if;
1749 
1750   elsif(p_action = 'INDENT') then
1751     -- Get the last previous peer task
1752     OPEN GET_PREV_PEER_TASK_CSR(p_parent_structure_ver_id, l_task_rec.parent_task_id, p_display_seq);
1753     FETCH GET_PREV_PEER_TASK_CSR INTO l_prev_task_id;
1754 
1755     -- Increment the last digit of the peer task wbs number to
1756     -- get the indented task's wbs number
1757     OPEN TASK_INFO_CSR(l_task_rec.parent_task_id);
1758     FETCH TASK_INFO_CSR INTO l_parent_task_rec;
1759     CLOSE TASK_INFO_CSR;
1760 
1761     if(GET_PREV_PEER_TASK_CSR%NOTFOUND) then
1762       -- No previous peer tasks; first peer task under the parent
1763       OPEN TASK_INFO_CSR(l_task_rec.parent_task_id);
1764       FETCH TASK_INFO_CSR INTO l_prev_task_rec;
1765       CLOSE TASK_INFO_CSR;
1766 
1767       l_wbs_number := l_prev_task_rec.wbs_number || '.1';
1768     else
1769       OPEN TASK_INFO_CSR(l_prev_task_id);
1770       FETCH TASK_INFO_CSR INTO l_prev_task_rec;
1771       CLOSE TASK_INFO_CSR;
1772 
1773       l_str1 := substr(l_prev_task_rec.wbs_number, 1, length(l_parent_task_rec.wbs_number));
1774       l_str2 := substr(l_prev_task_rec.wbs_number, length(l_parent_task_rec.wbs_number) + 2);
1775       l_str2 := to_char(to_number(l_str2 + 1));
1776 
1777       l_wbs_number := l_str1 || '.' || l_str2;
1778     end if;
1779 
1780     CLOSE GET_PREV_PEER_TASK_CSR;
1781 
1782     l_branch_mask := l_task_rec.wbs_number;
1783     --dbms_output.put_line('L_BRANCH_MASK: ' || l_branch_mask);
1784 
1785     --dbms_output.put_line('L_WBS_NUMBER: ' || l_wbs_number);
1786 
1787     -- Update the WBS number for the indented task
1788     UPDATE PA_PROJ_ELEMENT_VERSIONS
1789     SET    wbs_number = l_wbs_number
1790     WHERE  element_version_id = p_task_id;
1791 
1792     -- Find l_mask
1793     OPEN TASK_INFO_CSR(l_task_rec.parent_task_id);
1794     FETCH TASK_INFO_CSR INTO l_temp;
1795     CLOSE TASK_INFO_CSR;
1796 
1797     if(l_temp.parent_task_id = p_parent_structure_ver_id) then
1798       -- This indented task used to be a top task
1799       l_mask := 'NONE';
1800     else
1801       OPEN TASK_INFO_CSR(l_parent_task_rec.parent_task_id);
1802       FETCH TASK_INFO_CSR INTO l_parent_task_rec;
1803       CLOSE TASK_INFO_CSR;
1804 
1805       l_mask := l_parent_task_rec.wbs_number;
1806     end if;
1807 
1808     --dbms_output.put_line('L_MASK: ' || l_mask);
1809 
1810     if(l_mask = 'NONE') then
1811       OPEN UPDATE_TASKS_CSR(p_parent_structure_ver_id, p_display_seq);
1812     else
1813       OPEN UPDATE_MASKED_TASKS_CSR(p_parent_structure_ver_id, p_display_seq, l_mask);
1814     end if;
1815 
1816     LOOP
1817       if(l_mask = 'NONE') then
1818         FETCH UPDATE_TASKS_CSR INTO l_update_task_rec;
1819         EXIT WHEN UPDATE_TASKS_CSR%NOTFOUND;
1820 
1821         if(substr(l_update_task_rec.wbs_number, 1, length(l_branch_mask)) = l_branch_mask) then
1822           -- Task is under the indented branch
1823           -- Bug 2786662  Commented the replace and used substr to get the l_loop_wbs_number
1824           --l_loop_wbs_number := replace(l_update_task_rec.wbs_number, l_branch_mask, l_wbs_number);
1825           l_number := instr(l_update_task_rec.wbs_number, l_branch_mask, 1, 1);
1826           l_str1 := substr(l_update_task_rec.wbs_number, 1, l_number -1);
1827           l_str2 := substr(l_update_task_rec.wbs_number, length(l_branch_mask)+l_number);
1828           l_loop_wbs_number := l_str1 || l_wbs_number || l_str2;
1829 
1830         else
1831 
1832           if(instr(l_update_task_rec.wbs_number, '.') <> 0) then
1833             l_str1 := substr(l_update_task_rec.wbs_number, 1, instr(l_update_task_rec.wbs_number, '.') - 1);
1834             l_str2 := substr(l_update_task_rec.wbs_number, instr(l_update_task_rec.wbs_number, '.'));
1835             l_str1 := to_char(to_number(l_str1) - 1);
1836 
1837             l_loop_wbs_number := l_str1 || l_str2;
1838           else
1839             l_loop_wbs_number := to_char(to_number(l_update_task_rec.wbs_number) - 1);
1840           end if;
1841         end if;
1842 
1843       else
1844         FETCH UPDATE_MASKED_TASKS_CSR INTO l_update_task_rec;
1845         EXIT WHEN UPDATE_MASKED_TASKS_CSR%NOTFOUND;
1846 
1847         if(substr(l_update_task_rec.wbs_number, 1, length(l_branch_mask)) = l_branch_mask) then
1848           -- Task is under the indented branch
1849           -- Bug 2786662  Commented the replace and used substr to get the l_loop_wbs_number
1850           --l_loop_wbs_number := replace(l_update_task_rec.wbs_number, l_branch_mask, l_wbs_number);
1851           l_number := instr(l_update_task_rec.wbs_number, l_branch_mask, 1, 1);
1852           l_str1 := substr(l_update_task_rec.wbs_number, 1, l_number -1);
1853           l_str2 := substr(l_update_task_rec.wbs_number, length(l_branch_mask)+l_number);
1854           l_loop_wbs_number := l_str1 || l_wbs_number || l_str2;
1855 
1856         else
1857 
1858           l_str1 := substr(l_update_task_rec.wbs_number, length(l_mask) + 2);
1859           if(instr(l_str1, '.') <> 0) then
1860             l_str2 := substr(l_str1, instr(l_str1, '.'));
1861             l_str1 := substr(l_str1, 1, instr(l_str1, '.') - 1);
1862             l_str1 := to_char(to_number(l_str1) - 1);
1863 
1864             l_loop_wbs_number := l_mask || '.' || l_str1 || l_str2;
1865           else
1866             l_str1:= to_char(to_number(l_str1) - 1);
1867             l_loop_wbs_number := l_mask || '.' || l_str1;
1868           end if;
1869         end if;
1870 
1871       end if;
1872 
1873       -- Update the WBS number
1874       UPDATE PA_PROJ_ELEMENT_VERSIONS
1875       SET    wbs_number = l_loop_wbs_number
1876       WHERE  element_version_id = l_update_task_rec.task_id;
1877     END LOOP;
1878 
1879     if(l_mask = 'NONE') then
1880       CLOSE UPDATE_TASKS_CSR;
1881     else
1882       CLOSE UPDATE_MASKED_TASKS_CSR;
1883     end if;
1884 
1885   elsif(p_action = 'OUTDENT') then
1886     if(l_task_rec.parent_task_id = p_parent_structure_ver_id) then
1887       -- At top level; no parent task
1888       OPEN GET_PREV_TOP_PEER_TASK_CSR(p_parent_structure_ver_id, p_display_seq);
1889       FETCH GET_PREV_TOP_PEER_TASK_CSR INTO l_prev_task_id;
1890 
1891       if(GET_PREV_TOP_PEER_TASK_CSR%NOTFOUND) then
1892         x_return_status := 'E';
1893         raise API_ERROR;
1894       end if;
1895       CLOSE GET_PREV_TOP_PEER_TASK_CSR;
1896     else
1897       -- Get the last previous peer task
1898       OPEN GET_PREV_PEER_TASK_CSR(p_parent_structure_ver_id, l_task_rec.parent_task_id, p_display_seq);
1899       FETCH GET_PREV_PEER_TASK_CSR INTO l_prev_task_id;
1900 
1901       if(GET_PREV_PEER_TASK_CSR%NOTFOUND) then
1902         x_return_status := 'E';
1903         raise API_ERROR;
1904       end if;
1905       CLOSE GET_PREV_PEER_TASK_CSR;
1906     end if;
1907 
1908     OPEN TASK_INFO_CSR(l_prev_task_id);
1909     FETCH TASK_INFO_CSR INTO l_prev_task_rec;
1910     CLOSE TASK_INFO_CSR;
1911 
1912     --dbms_output.put_line('Previous peer task: ' || l_prev_task_rec.wbs_number);
1913 
1914     -- Increment the last digit of the peer task wbs number to
1915     -- get the outdented task's wbs number
1916     OPEN TASK_INFO_CSR(l_task_rec.parent_task_id);
1917     FETCH TASK_INFO_CSR INTO l_parent_task_rec;
1918     if(TASK_INFO_CSR%NOTFOUND) then
1919       -- Outdented task is now a top task
1920       l_wbs_number := l_prev_task_rec.wbs_number + 1;
1921     else
1922       l_str1 := substr(l_prev_task_rec.wbs_number, 1, length(l_parent_task_rec.wbs_number));
1923       l_str2 := substr(l_prev_task_rec.wbs_number, length(l_parent_task_rec.wbs_number) + 2);
1924       l_str2 := to_char(to_number(l_str2 + 1));
1925 
1926       l_wbs_number := l_str1 || '.' || l_str2;
1927     end if;
1928 
1929     CLOSE TASK_INFO_CSR;
1930 
1931 
1932     -- l_branch_mask contains the old wbs_number (before the task was outdented)
1933     l_branch_mask := l_task_rec.wbs_number;
1934     --dbms_output.put_line('L_BRANCH_MASK: ' || l_branch_mask);
1935 
1936     -- l_mask2 contains the wbs number of the previous peer task
1937     -- This mask is used to find subsequent peer/child tasks of the outdented task (before it was
1938     -- outdented)
1939     l_mask2 := l_prev_task_rec.wbs_number;
1940     --dbms_output.put_line('L_MASK2: ' || l_mask2);
1941 
1942     -- Update the WBS number for the outdented task
1943     UPDATE PA_PROJ_ELEMENT_VERSIONS
1944     SET    wbs_number = l_wbs_number
1945     WHERE  element_version_id = p_task_id;
1946 
1947     --dbms_output.put_line('L_WBS_NUMBER: ' || l_wbs_number);
1948 
1949     -- Find l_mask
1950     if(l_task_rec.parent_task_id = p_parent_structure_ver_id) then
1951       -- This outdented task has become a top task
1952       l_mask := 'NONE';
1953     else
1954       l_mask := l_parent_task_rec.wbs_number;
1955     end if;
1956 
1957     --dbms_output.put_line('L_MASK: ' || l_mask);
1958 
1959     if(l_mask = 'NONE') then
1960       OPEN UPDATE_TASKS_CSR(p_parent_structure_ver_id, p_display_seq);
1961     else
1962       OPEN UPDATE_MASKED_TASKS_CSR(p_parent_structure_ver_id, p_display_seq, l_mask);
1963     end if;
1964 
1965     LOOP
1966       if(l_mask = 'NONE') then
1967         FETCH UPDATE_TASKS_CSR INTO l_update_task_rec;
1968         EXIT WHEN UPDATE_TASKS_CSR%NOTFOUND;
1969 
1970         if(substr(l_update_task_rec.wbs_number, 1, length(l_branch_mask)) = l_branch_mask) then
1971           -- Task is under the outdented branch
1972           -- Bug 2786662  Commented the replace and used substr to get the l_loop_wbs_number
1973           --l_loop_wbs_number := replace(l_update_task_rec.wbs_number, l_branch_mask, l_wbs_number);
1974           l_number := instr(l_update_task_rec.wbs_number, l_branch_mask, 1, 1);
1975           l_str1 := substr(l_update_task_rec.wbs_number, 1, l_number -1);
1976           l_str2 := substr(l_update_task_rec.wbs_number, length(l_branch_mask)+l_number);
1977           l_loop_wbs_number := l_str1 || l_wbs_number || l_str2;
1978 
1979         elsif(substr(l_update_task_rec.wbs_number, 1, length(l_mask2)) = l_mask2) then
1980           -- Task used to be a peer of the outdented task
1981           OPEN GET_PREV_PEER_TASK_CSR(p_parent_structure_ver_id, p_task_id, l_update_task_rec.display_sequence);
1982           FETCH GET_PREV_PEER_TASK_CSR INTO l_prev_task_id;
1983           if(GET_PREV_PEER_TASK_CSR%NOTFOUND) then
1984             l_loop_wbs_number := l_wbs_number || '.1';
1985           else
1986             OPEN TASK_INFO_CSR(l_prev_task_id);
1987             FETCH TASK_INFO_CSR INTO l_prev_task_rec;
1988             CLOSE TASK_INFO_CSR;
1989             l_str1 := substr(l_prev_task_rec.wbs_number, length(l_wbs_number) + 2);
1990             l_str1 := to_char(to_number(l_str1 + 1));
1991             l_loop_wbs_number := l_wbs_number || '.' || l_str1;
1992           end if;
1993           CLOSE GET_PREV_PEER_TASK_CSR;
1994 
1995         else
1996           if(instr(l_update_task_rec.wbs_number, '.') <> 0) then
1997             l_str1 := substr(l_update_task_rec.wbs_number, 1, instr(l_update_task_rec.wbs_number, '.') - 1);
1998             l_str2 := substr(l_update_task_rec.wbs_number, instr(l_update_task_rec.wbs_number, '.'));
1999             l_str1 := to_char(to_number(l_str1) + 1);
2000 
2001             l_loop_wbs_number := l_str1 || l_str2;
2002           else
2003             l_loop_wbs_number := to_char(to_number(l_update_task_rec.wbs_number) + 1);
2004           end if;
2005         end if;
2006 
2007       else
2008         FETCH UPDATE_MASKED_TASKS_CSR INTO l_update_task_rec;
2009         EXIT WHEN UPDATE_MASKED_TASKS_CSR%NOTFOUND;
2010 
2011         if(substr(l_update_task_rec.wbs_number, 1, length(l_branch_mask)) = l_branch_mask) then
2012           -- Task is under the indented branch
2013           -- Bug 2786662  Commented the replace and used substr to get the l_loop_wbs_number
2014           --l_loop_wbs_number := replace(l_update_task_rec.wbs_number, l_branch_mask, l_wbs_number);
2015           l_number := instr(l_update_task_rec.wbs_number, l_branch_mask, 1, 1);
2016           l_str1 := substr(l_update_task_rec.wbs_number, 1, l_number -1);
2017           l_str2 := substr(l_update_task_rec.wbs_number, length(l_branch_mask)+l_number);
2018           l_loop_wbs_number := l_str1 || l_wbs_number || l_str2;
2019 
2020         elsif(substr(l_update_task_rec.wbs_number, 1, length(l_mask2)) = l_mask2) then
2021           -- Task used to be a peer of the outdented task
2022           OPEN GET_PREV_PEER_TASK_CSR(p_parent_structure_ver_id, p_task_id, l_update_task_rec.display_sequence);
2023           FETCH GET_PREV_PEER_TASK_CSR INTO l_prev_task_id;
2024           if(GET_PREV_PEER_TASK_CSR%NOTFOUND) then
2025             --dbms_output.put_line('HELLO2');
2026             l_loop_wbs_number := l_wbs_number || '.1';
2027           else
2028             OPEN TASK_INFO_CSR(l_prev_task_id);
2029             FETCH TASK_INFO_CSR INTO l_prev_task_rec;
2030             CLOSE TASK_INFO_CSR;
2031             --dbms_output.put_line('HELLO: ' || l_prev_task_rec.wbs_number);
2032             l_str1 := substr(l_prev_task_rec.wbs_number, length(l_wbs_number) + 2);
2033             l_str1 := to_char(to_number(l_str1 + 1));
2034             l_loop_wbs_number := l_wbs_number || '.' || l_str1;
2035           end if;
2036           CLOSE GET_PREV_PEER_TASK_CSR;
2037 
2038         else
2039 
2040           l_str1 := substr(l_update_task_rec.wbs_number, length(l_mask) + 2);
2041           if(instr(l_str1, '.') <> 0) then
2042             l_str2 := substr(l_str1, instr(l_str1, '.'));
2043             l_str1 := substr(l_str1, 1, instr(l_str1, '.') - 1);
2044             l_str1 := to_char(to_number(l_str1) + 1);
2045 
2046             l_loop_wbs_number := l_mask || '.' || l_str1 || l_str2;
2047           else
2048             l_str1 := to_char(to_number(l_str1) + 1);
2049             l_loop_wbs_number := l_mask || '.' || l_str1;
2050           end if;
2051         end if;
2052 
2053       end if;
2054 
2055       -- Update the WBS number
2056       UPDATE PA_PROJ_ELEMENT_VERSIONS
2057       SET    wbs_number = l_loop_wbs_number
2058       WHERE  element_version_id = l_update_task_rec.task_id;
2059     END LOOP;
2060 
2061     if(l_mask = 'NONE') then
2062       CLOSE UPDATE_TASKS_CSR;
2063     else
2064       CLOSE UPDATE_MASKED_TASKS_CSR;
2065     end if;
2066 
2067   elsif(p_action = 'DELETE') then
2068     if(p_parent_task_id = p_parent_structure_ver_id ) then
2069       -- Deleted task is a top task
2070       --dbms_output.put_line('Is parent task');
2071       l_mask := 'NONE';
2072     else
2073       -- Deleted task is not a top task
2074       OPEN TASK_INFO_CSR(p_parent_task_id);
2075       FETCH TASK_INFO_CSR INTO l_parent_task_rec;
2076       CLOSE TASK_INFO_CSR;
2077 
2078       l_mask := l_parent_task_rec.wbs_number;
2079     end if;
2080 
2081     -- Loop through tasks that have a greater display seq than the current
2082     -- and begins with the same mask (in the same branch)
2083     if(l_mask = 'NONE') then
2084       OPEN UPDATE_TASKS_CSR(p_parent_structure_ver_id, p_display_seq);
2085     else
2086       OPEN UPDATE_MASKED_TASKS_CSR(p_parent_structure_ver_id, p_display_seq, l_mask);
2087     end if;
2088 
2089     --dbms_output.put_line('L_MASK: '||l_mask);
2090     LOOP
2091       if(l_mask = 'NONE') then
2092         --dbms_output.put_line('IN LOOP');
2093         FETCH UPDATE_TASKS_CSR INTO l_update_task_rec;
2094         EXIT WHEN UPDATE_TASKS_CSR%NOTFOUND;
2095 
2096         ----dbms_output.put_line('L_UPDATE_TASK_REC.WBS_NUMBER: '|| l_update_task_rec.wbs_number);
2097 
2098         if(instr(l_update_task_rec.wbs_number, '.') <> 0) then
2099           l_str1 := substr(l_update_task_rec.wbs_number, 1, instr(l_update_task_rec.wbs_number, '.') - 1);
2100           l_str2 := substr(l_update_task_rec.wbs_number, instr(l_update_task_rec.wbs_number, '.'));
2101           l_str1 := to_char(to_number(l_str1) - 1);
2102 
2103           l_wbs_number := l_str1 || l_str2;
2104         else
2105           l_wbs_number := to_char(to_number(l_update_task_rec.wbs_number) - 1);
2106         end if;
2107       else
2108         FETCH UPDATE_MASKED_TASKS_CSR INTO l_update_task_rec;
2109         EXIT WHEN UPDATE_MASKED_TASKS_CSR%NOTFOUND;
2110 
2111         l_str1 := substr(l_update_task_rec.wbs_number, length(l_mask) + 2);
2112         if(instr(l_str1, '.') <> 0) then
2113           l_str2 := substr(l_str1, instr(l_str1, '.'));
2114           l_str1 := substr(l_str1, 1, instr(l_str1, '.') - 1);
2115           l_str1 := to_char(to_number(l_str1) - 1);
2116 
2117           l_wbs_number := l_mask || '.' || l_str1 || l_str2;
2118         else
2119           l_str1 := to_char(to_number(l_str1) - 1);
2120           l_wbs_number := l_mask || '.' || l_str1;
2121         end if;
2122       end if;
2123 
2124       -- Update the WBS number
2125       UPDATE PA_PROJ_ELEMENT_VERSIONS
2126       SET    wbs_number = l_wbs_number
2127       WHERE  element_version_id = l_update_task_rec.task_id;
2128     END LOOP;
2129 
2130     if(l_mask = 'NONE') then
2131       CLOSE UPDATE_TASKS_CSR;
2132     else
2133       CLOSE UPDATE_MASKED_TASKS_CSR;
2134     end if;
2135   end if;
2136 
2137   x_return_status := 'S';
2138 
2139   if(p_commit = 'Y') then
2140     commit;
2141   end if;
2142 EXCEPTION
2143   when API_ERROR then
2144     if p_commit = 'Y' then
2145       rollback to update_wbs_numbers;
2146     end if;
2147 
2148      x_return_status := 'E'; -- 4537865
2149  WHEN OTHERS THEN
2150     if p_commit = 'Y' then
2151       rollback to update_wbs_numbers;
2152     end if;
2153 
2154     fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_TASK_PUB1',
2155                             p_procedure_name => 'UPDATE_WBS_NUMBERS',
2156                             p_error_text     => SUBSTRB(SQLERRM,1,240));
2157     x_return_status := 'E';
2158 END UPDATE_WBS_NUMBERS;
2159 
2160 
2161 FUNCTION task_exists_in_struc_ver(
2162   p_structure_version_id NUMBER,
2163   p_task_version_id      NUMBER ) RETURN VARCHAR2 IS
2164 
2165   CURSOR cur_ppev
2166   IS
2167     SELECT 'x'
2168       FROM pa_proj_element_versions
2169      WHERE element_version_id = p_task_version_id
2170        AND parent_structure_version_id = p_structure_version_id;
2171   l_dummy_char VARCHAR2(1);
2172 BEGIN
2173     OPEN cur_ppev;
2174     FETCH cur_ppev INTO l_dummy_char;
2175     IF cur_ppev%FOUND
2176     THEN
2177        CLOSE cur_ppev;
2178        RETURN 'Y';
2179     ELSE
2180        CLOSE cur_ppev;
2181        RETURN 'N';
2182     END IF;
2183 
2184 END task_exists_in_struc_ver;
2185 
2186 FUNCTION GET_LINKED_TASK_VERSION_ID(
2187     p_cur_element_id                     NUMBER ,
2188     p_cur_element_version_id             NUMBER
2189 ) RETURN NUMBER IS
2190 
2191   CURSOR cur_obj_rel
2192   IS
2193     SELECT object_id_to1
2194       FROM pa_object_relationships
2195      WHERE object_id_from1 = p_cur_element_version_id
2196        AND relationship_type = 'L';
2197   l_linked_task_ver_id NUMBER;
2198 BEGIN
2199     --A linking task can only link one task.
2200 
2201    IF LINK_FLAG( p_cur_element_id ) = 'Y'
2202    THEN
2203        OPEN cur_obj_rel;
2204        FETCH cur_obj_rel INTO l_linked_task_ver_id;
2205        CLOSE cur_obj_rel;
2206        RETURN l_linked_task_ver_id;
2207    ELSE
2208        RETURN p_cur_element_version_id;
2209    END IF;
2210 
2211 END GET_LINKED_TASK_VERSION_ID;
2212 
2213 FUNCTION LINK_FLAG( p_element_id NUMBER ) RETURN VARCHAR2 IS
2214     CURSOR cur_proj_elements
2215     IS
2216       SELECT link_task_flag
2217         FROM pa_proj_elements
2218        WHERE proj_element_id = p_element_id;
2219 
2220     l_link_task_flag VARCHAR2(1) :='N';    --bug 4180390
2221 BEGIN
2222 
2223 /* comenting the code for bug 4180390
2224     OPEN cur_proj_elements;
2225     FETCH cur_proj_elements INTO l_link_task_flag;
2226     CLOSE cur_proj_elements;
2227 */
2228 
2229     RETURN l_link_task_flag;
2230 
2231 END LINK_FLAG;
2232 
2233 
2234 -- API name                      : CHECK_TASK_IN_STRUCTURE
2235 -- Type                          : Utils API
2236 -- Pre-reqs                      : None
2237 -- Return Value                  : Y if task is in structure; N for task in
2238 --                                 different struture.
2239 --
2240 -- Parameters
2241 --    p_structure_version_id    IN  NUMBER
2242 --    p_task_version_id         IN  NUMBER
2243 --
2244 --  History
2245 --
2246 --  09-JAN-02   HSIU             -Created
2247 --
2248 FUNCTION CHECK_TASK_IN_STRUCTURE(p_structure_version_id NUMBER,
2249                                  p_task_version_id NUMBER)
2250 RETURN VARCHAR2 IS
2251   CURSOR c1 IS
2252     select '1'
2253       from pa_proj_element_versions
2254      where p_task_version_id = element_version_id
2255        and p_structure_version_id = parent_structure_version_id;
2256 
2257   l_dummy VARCHAR2(1);
2258 BEGIN
2259   OPEN c1;
2260   FETCH c1 INTO l_dummy;
2261   IF (c1%NOTFOUND) THEN
2262     CLOSE c1;
2263     return 'N';
2264   END IF;
2265   CLOSE c1;
2266   return 'Y';
2267 END CHECK_TASK_IN_STRUCTURE;
2268 
2269 
2270 FUNCTION GET_DISPLAY_PARENT_VERSION_ID(p_element_version_id NUMBER,
2271                                        p_parent_element_version_id NUMBER,
2272                                        p_relationship_type VARCHAR2,
2273                                        p_link_task_flag VARCHAR2)
2274 RETURN NUMBER IS
2275   cursor get_display_parent_id IS
2276     select object_id_from1
2277       from pa_object_relationships
2278      where relationship_type = 'S'
2279        and object_id_to1 = p_parent_element_version_id;
2280   l_display_parent_version_id NUMBER;
2281 BEGIN
2282   IF (p_relationship_type = 'L') THEN
2283     --return parent of the parent element version
2284     OPEN get_display_parent_id;
2285     FETCH get_display_parent_id into l_display_parent_version_id;
2286     CLOSE get_display_parent_id;
2287     return l_display_parent_version_id;
2288   ELSIF (p_link_task_flag = 'Y') THEN
2289     return to_number(NULL);
2290   END IF;
2291   --a normal task. Return its current parent
2292   return p_parent_element_version_id;
2293 
2294 END GET_DISPLAY_PARENT_VERSION_ID;
2295 
2296 
2297 FUNCTION IS_ACTIVE_TASK(p_element_version_id NUMBER,
2298                         p_object_type VARCHAR2)
2299 RETURN VARCHAR2
2300 IS
2301 
2302 --  CURSOR c1 IS
2303 --    select 1
2304 --    from pa_percent_completes ppc,
2305 --      pa_proj_element_versions pev
2306 --    where pev.element_version_id = p_element_version_id
2307 --    and pev.project_id = ppc.project_id
2308 --    and pev.proj_element_id = ppc.task_id
2309 --    and ppc.submitted_flag = 'Y'
2310 --    and ppc.current_flag = 'Y'
2311 --    and ppc.actual_start_date IS NOT NULL
2312 --    and ppc.actual_finish_date IS NULL;
2313 --  l_dummy NUMBER;
2314 BEGIN
2315 --  OPEN c1;
2316 --  FETCH c1 into l_dummy;
2317 --  IF c1%FOUND THEN
2318 --    CLOSE c1;
2319 --    return 'Y';
2320 --  END IF;
2321 --  CLOSE c1;
2322 --  return 'N';
2323   return 'Y';
2324 END IS_ACTIVE_TASK;
2325 
2326 FUNCTION Get_DAYS_TO_START(p_element_version_id NUMBER,
2327                            p_object_type VARCHAR2)
2328 RETURN NUMBER
2329 IS
2330   CURSOR c1 IS
2331     select scheduled_start_date
2332       from pa_proj_elem_ver_schedule sch,
2333            pa_proj_element_versions ev
2334      where p_element_version_id = ev.element_version_id
2335        and ev.element_version_id = sch.element_version_id
2336        and ev.project_id = sch.project_id;
2337   l_date DATE;
2338 BEGIN
2339   IF (p_object_type = 'PA_STRUCTURES') THEN
2340     RETURN to_number(NULL);
2341   END IF;
2342   OPEN c1;
2343   FETCH c1 into l_date;
2344   IF c1%NOTFOUND THEN
2345     CLOSE c1;
2346     return to_number(NULL);
2347   END IF;
2348   CLOSE c1;
2349   return TRUNC(l_date) - TRUNC(SYSDATE);
2350 END Get_DAYS_TO_START;
2351 
2352 FUNCTION Get_DAYS_TO_FINISH(p_element_version_id NUMBER,
2353                             p_object_type VARCHAR2)
2354 RETURN NUMBER
2355 IS
2356   CURSOR c1 IS
2357     select scheduled_finish_date
2358       from pa_proj_elem_ver_schedule sch,
2359            pa_proj_element_versions ev
2360      where p_element_version_id = ev.element_version_id
2361        and ev.element_version_id = sch.element_version_id
2362        and ev.project_id = sch.project_id;
2363   l_date DATE;
2364 BEGIN
2365   IF (p_object_type = 'PA_STRUCTURES') THEN
2366     RETURN to_number(NULL);
2367   END IF;
2368   OPEN c1;
2369   FETCH c1 into l_date;
2370   IF c1%NOTFOUND THEN
2371     CLOSE c1;
2372     return to_number(NULL);
2373   END IF;
2374   CLOSE c1;
2375   return TRUNC(l_date) - TRUNC(sysdate);
2376 END Get_DAYS_TO_FINISH;
2377 
2378 FUNCTION GET_PREV_SCH_START_DATE(p_element_version_id NUMBER,
2379                                  p_parent_structure_version_id NUMBER)
2380 RETURN DATE
2381 IS
2382   CURSOR c1(c_project_id NUMBER, c_structure_version_id NUMBER) IS
2383     select sch.scheduled_start_date
2384       from pa_proj_elem_ver_schedule sch,
2385            pa_proj_element_versions pev,
2386            pa_proj_element_versions pev2
2387      where pev.project_id = c_project_id
2388        and pev.parent_structure_version_id = c_structure_version_id
2389        and pev.element_version_id = sch.element_version_id
2390        and pev.project_id = sch.project_id
2391        and pev.proj_element_id = pev2.proj_element_id
2392        and pev.project_id = pev2.project_id
2393        and pev2.element_version_id = p_element_version_id;
2394 
2395   CURSOR c2 IS
2396     select str.project_id, str.element_version_id
2397       from pa_proj_elem_ver_structure str,
2398            pa_proj_element_versions pev
2399      where pev.element_version_id = p_parent_structure_version_id
2400        and pev.project_id = str.project_id
2401        and pev.proj_element_id = str.proj_element_id
2402        and str.LATEST_EFF_PUBLISHED_FLAG = 'Y';
2403   l_project_id NUMBER;
2404   l_structure_version_id NUMBER;
2405   l_date DATE;
2406 BEGIN
2407   OPEN c2;
2408   FETCH c2 into l_project_id, l_structure_version_id;
2409   IF c2%NOTFOUND THEN
2410 --no published version
2411     CLOSE c2;
2412     return to_date(NULL);
2413   END IF;
2414   CLOSE c2;
2415 
2416   OPEN c1(l_project_id, l_structure_version_id);
2417   FETCH c1 into l_date;
2418   CLOSE c1;
2419 
2420   return l_date;
2421 
2422 END GET_PREV_SCH_START_DATE;
2423 
2424 FUNCTION GET_PREV_SCH_FINISH_DATE(p_element_version_id NUMBER,
2425                                   p_parent_structure_version_id NUMBER)
2426 RETURN DATE
2427 IS
2428   CURSOR c1(c_project_id NUMBER, c_structure_version_id NUMBER) IS
2429     select sch.scheduled_finish_date
2430       from pa_proj_elem_ver_schedule sch,
2431            pa_proj_element_versions pev,
2432            pa_proj_element_versions pev2
2433      where pev.project_id = c_project_id
2434        and pev.parent_structure_version_id = c_structure_version_id
2435        and pev.element_version_id = sch.element_version_id
2436        and pev.project_id = sch.project_id
2437        and pev.proj_element_id = pev2.proj_element_id
2438        and pev.project_id = pev2.project_id
2439        and pev2.element_version_id = p_element_version_id;
2440 
2441   CURSOR c2 IS
2442     select str.project_id, str.element_version_id
2443       from pa_proj_elem_ver_structure str,
2444            pa_proj_element_versions pev
2445      where pev.element_version_id = p_parent_structure_version_id
2446        and pev.project_id = str.project_id
2447        and pev.proj_element_id = str.proj_element_id
2448        and str.LATEST_EFF_PUBLISHED_FLAG = 'Y';
2449   l_project_id NUMBER;
2450   l_structure_version_id NUMBER;
2451   l_date DATE;
2452 BEGIN
2453   OPEN c2;
2454   FETCH c2 into l_project_id, l_structure_version_id;
2455   IF c2%NOTFOUND THEN
2456 --no published version
2457     CLOSE c2;
2458     return to_date(NULL);
2459   END IF;
2460   CLOSE c2;
2461 
2462   OPEN c1(l_project_id, l_structure_version_id);
2463   FETCH c1 into l_date;
2464   CLOSE c1;
2465 
2466   return l_date;
2467 
2468 END GET_PREV_SCH_FINISH_DATE;
2469 
2470 FUNCTION CHECK_IS_FINANCIAL_TASK(p_proj_element_id NUMBER)
2471 RETURN VARCHAR2
2472 IS
2473   cursor c1 IS
2474     SELECT 1
2475       FROM PA_TASKS
2476      WHERE task_id = p_proj_element_id;
2477   l_dummy  NUMBER;
2478 BEGIN
2479   OPEN c1;
2480   FETCH c1 into l_dummy;
2481   IF c1%NOTFOUND THEN
2482     CLOSE c1;
2483     return 'N';
2484   ELSE
2485     CLOSE c1;
2486     return 'Y';
2487   END IF;
2488 END CHECK_IS_FINANCIAL_TASK;
2489 
2490 FUNCTION CONVERT_HR_TO_DAYS(p_hour NUMBER)
2491 RETURN NUMBER
2492 IS
2493 
2494     l_fte_day NUMBER := 0;
2495 
2496     cursor get_fte_days_csr
2497     IS
2498     SELECT fte_day
2499     FROM   pa_implementations;
2500 
2501 BEGIN
2502 
2503 --commented out for bug 3612309
2504 --    OPEN get_fte_days_csr;
2505 --    FETCH get_fte_days_csr INTO l_fte_day;
2506 --    IF  get_fte_days_csr%NOTFOUND then
2507 --        return 0;
2508 --    end if;
2509 --   CLOSE get_fte_days_csr;
2510 
2511 --    if l_fte_day is null or l_fte_day = 0 then
2512 --        l_fte_day := 8;
2513 --    end if;
2514 
2515 --dbms_output.put_line('fte_days  = '||l_fte_day);
2516 
2517 --    return round(p_hour/l_fte_day,2);
2518   return p_hour;
2519 
2520 END CONVERT_HR_TO_DAYS;
2521 
2522 
2523 FUNCTION GET_FND_LOOKUP_MEANING(p_lookup_type VARCHAR2,
2524                                 p_lookup_code VARCHAR2)
2525 RETURN VARCHAR2
2526 IS
2527 /*
2528   cursor c1 is
2529     select meaning
2530       from fnd_lookups
2531      where lookup_type = p_lookup_type
2532        and lookup_code = p_lookup_code;
2533   l_dummy varchar2(80);
2534 BEGIN
2535 -- Bug Fix 5611871
2536 IF p_lookup_code IS NULL THEN
2537   l_dummy := NULL;
2538   RETURN l_dummy;
2539 END IF;
2540 -- End of Bug Fix 5611871
2541 
2542   open c1;
2543   FETCH c1 into l_dummy;
2544   If c1%NOTFOUND THEN
2545     l_dummy := NULL;
2546   END IF;
2547   close c1;
2548   return l_dummy;
2549   */
2550 
2551 -- Bug 6156686
2552     cursor c1 is
2553     select meaning
2554       from fnd_lookups
2555      where lookup_type = p_lookup_type
2556        and lookup_code = p_lookup_code;
2557   l_dummy varchar2(80);
2558   l_index varchar2(100);
2559 BEGIN
2560   l_index := p_lookup_type || '*'||p_lookup_code;
2561   IF l_fndlkp_cache_tbl.EXISTS(l_index) THEN
2562         l_dummy :=   l_fndlkp_cache_tbl(l_index);
2563   ELSE
2564       open c1;
2565       FETCH c1 into l_dummy;
2566       If c1%NOTFOUND THEN
2567         l_dummy := NULL;
2568       END IF;
2569       close c1;
2570       l_fndlkp_cache_tbl(l_index) := l_dummy;
2571 
2572   END IF;
2573   return l_dummy;
2574 
2575 END GET_FND_LOOKUP_MEANING;
2576 
2577 
2578 FUNCTION GET_PA_LOOKUP_MEANING(p_lookup_type VARCHAR2,
2579                                p_lookup_code VARCHAR2)
2580 RETURN VARCHAR2
2581 IS
2582   cursor c1 is
2583     select meaning
2584       from pa_lookups
2585      where lookup_type = p_lookup_type
2586        and lookup_code = p_lookup_code;
2587   l_dummy varchar2(80);
2588   l_index varchar2(100);		-- Bug 6156686
2589 BEGIN
2590 -- Bug 6156686
2591   l_index := p_lookup_type || '*'||p_lookup_code;
2592   IF l_lookup_cache_tbl.EXISTS(l_index) THEN
2593         l_dummy :=   l_lookup_cache_tbl(l_index);
2594   ELSE
2595   open c1;
2596   FETCH c1 into l_dummy;
2597   If c1%NOTFOUND THEN
2598     l_dummy := NULL;
2599   END IF;
2600   close c1;
2601         l_lookup_cache_tbl(l_index) := l_dummy;
2602 
2603   END IF;
2604 
2605   return l_dummy;
2606 END GET_PA_LOOKUP_MEANING;
2607 
2608 -- API name                      : GET_DEFAULT_TASK_TYPE_ID
2609 -- Type                          : Utils API
2610 -- Pre-reqs                      : None
2611 -- Return Value                  : Default task type_id
2612 --
2613 -- Parameters
2614 --
2615 --  History
2616 --
2617 --  26-JUL-02   HSIU             -Created
2618 --
2619   FUNCTION GET_DEFAULT_TASK_TYPE_ID
2620     return NUMBER
2621   IS
2622   BEGIN
2623     return 1;
2624   END GET_DEFAULT_TASK_TYPE_ID;
2625 
2626   FUNCTION IS_TASK_TYPE_USED(p_task_type_id IN NUMBER)
2627     return VARCHAR2
2628   IS
2629 
2630 /* Bug2680486 -- Performance changes -- Commented the following cursor query and restructured it. */
2631 /*    cursor c1 IS
2632     select 'Y'
2633       from PA_PROJ_ELEMENTS
2634      where type_id = p_task_type_id;
2635 */
2636 
2637     cursor c1 IS
2638     select 'Y'
2639     from dual
2640     where exists (
2641       select 'xyz'
2642       from PA_PROJ_ELEMENTS
2643       where type_id = p_task_type_id
2644       AND project_id > -1
2645       AND object_type = 'PA_TASKS'
2646       );
2647 
2648     l_ret_val VARCHAR2(1);
2649   BEGIN
2650     OPEN c1;
2651     FETCH c1 into l_ret_val;
2652     IF c1%NOTFOUND THEN
2653       l_ret_val := 'N';
2654     END IF;
2655     CLOSE c1;
2656     return l_ret_val;
2657   END IS_TASK_TYPE_USED;
2658 
2659 -- API name                      : GET_LATEST_FIN_PUB_TASK_VER_ID
2660 -- Type                          : Utils API
2661 -- Pre-reqs                      : None
2662 -- Return Value                  : Task version id of the latest financial
2663 --                                 published task
2664 --
2665 -- Parameters
2666 --   p_project_id                IN NUMBER
2667 --   p_task_id                   IN NUMBER
2668 --
2669 --  History
2670 --
2671 --  26-JUL-02   HSIU             -Created
2672 --
2673   FUNCTION GET_LATEST_FIN_PUB_TASK_VER_ID(
2674     p_project_id    IN NUMBER
2675    ,p_task_id       IN NUMBER
2676   ) return NUMBER
2677   IS
2678     CURSOR c1(c_structure_version_id NUMBER) IS
2679       select ppev.element_version_id
2680         from pa_proj_element_versions ppev
2681        where parent_structure_version_id = c_structure_version_id
2682          and project_id = p_project_id
2683          and proj_element_id = p_task_id;
2684     l_structure_version_id NUMBER;
2685     l_task_version_id   NUMBER;
2686   BEGIN
2687     l_structure_version_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_FIN_STRUC_VER_ID(p_project_id);
2688 
2689     OPEN c1(l_structure_version_id);
2690     FETCH c1 into l_task_version_id;
2691     CLOSE c1;
2692     return l_task_version_id;
2693   END GET_LATEST_FIN_PUB_TASK_VER_ID;
2694 
2695 
2696 -- API name                      : CHECK_MODIFY_OK_FOR_STATUS
2697 -- Type                          : Utils API
2698 -- Pre-reqs                      : None
2699 -- Return Value                  : Check if this task can be modified with its
2700 --                                 current status. Y can be modified, N cannot.
2701 --
2702 -- Parameters
2703 --   p_project_id                IN NUMBER
2704 --   p_task_id                   IN NUMBER
2705 --
2706 --  History
2707 --
2708 --  26-JUL-02   HSIU             -Created
2709 --
2710   FUNCTION CHECK_MODIFY_OK_FOR_STATUS(
2711     p_project_id    IN NUMBER
2712    ,p_task_id       IN NUMBER
2713   ) return VARCHAR2
2714   IS
2715 --bug 2863836: modified cursor to refer to system status
2716     cursor c1 is
2717     select b.project_system_status_code
2718       from pa_proj_elements a, pa_project_statuses b
2719      where a.proj_element_id = p_task_id
2720        and a.status_code = b.project_status_code
2721        and b.status_type = 'TASK';
2722     l_dummy  pa_proj_elements.status_code%TYPE;
2723     l_retval VARCHAR2(1);
2724   BEGIN
2725     open c1;
2726     FETCH c1 into l_dummy;
2727     CLOSE c1;
2728     IF (l_dummy = 'ON_HOLD' OR l_dummy = 'CANCELLED') THEN
2729       return 'N';
2730     END IF;
2731     return 'Y';
2732   END CHECK_MODIFY_OK_FOR_STATUS;
2733 
2734 
2735 -- API name                      : GET_DISPLAY_SEQUENCE
2736 -- Type                          : FUNCTION
2737 -- Pre-reqs                      : N/A
2738 -- Return Value                  : The display sequence for a given task.
2739 --
2740 -- Parameters
2741 --   p_task_id                   IN NUMBER
2742 --
2743 --  History
2744 --
2745 --  16-OCT-02   XXLU             -Created
2746 --
2747 FUNCTION GET_DISPLAY_SEQUENCE (
2748    p_task_id       IN  NUMBER
2749 ) RETURN NUMBER
2750 IS
2751 
2752   l_element_version_id  pa_proj_element_versions.element_version_id%TYPE;
2753 
2754   CURSOR c1(p_task_id IN NUMBER) IS
2755     SELECT project_id
2756     FROM pa_tasks
2757     WHERE task_id = p_task_id;
2758 
2759   v_c1 c1%ROWTYPE;
2760 
2761   CURSOR c2 (p_proj_element_id IN NUMBER) IS
2762     SELECT element_version_id
2763     FROM pa_proj_element_versions
2764     WHERE proj_element_id = p_proj_element_id;
2765 
2766   v_c2 c2%ROWTYPE;
2767 
2768   CURSOR c3 (p_element_version_id IN NUMBER) IS
2769     SELECT display_sequence
2770     FROM pa_proj_element_versions
2771     WHERE element_version_id = p_element_version_id;
2772 
2773   v_c3 c3%ROWTYPE;
2774 
2775 
2776 BEGIN
2777 
2778   OPEN c1 (p_task_id);
2779   FETCH c1 INTO v_c1;
2780   CLOSE c1;
2781 
2782   l_element_version_id := PA_PROJ_ELEMENTS_UTILS.GET_LATEST_FIN_PUB_TASK_VER_ID
2783                           (p_project_id => v_c1.project_id,
2784                            p_task_id => p_task_id);
2785 
2786   IF l_element_version_id IS NULL THEN
2787     OPEN c2 (p_task_id);
2788     FETCH c2 INTO v_c2;
2789     CLOSE c2;
2790 
2791     l_element_version_id := v_c2.element_version_id;
2792 
2793   END IF;
2794 
2795   OPEN c3(l_element_version_id);
2796   FETCH c3 INTO v_c3;
2797   CLOSE c3;
2798 
2799   RETURN(v_c3.display_sequence);
2800 
2801 END GET_DISPLAY_SEQUENCE;
2802 
2803   procedure Check_Del_all_task_Ver_Ok
2804   (
2805     p_project_id                        IN  NUMBER
2806    ,p_task_version_id                   IN  NUMBER
2807    ,p_parent_structure_ver_id           IN  NUMBER
2808    ,x_return_status                     OUT NOCOPY VARCHAR2 -- 4537865
2809    ,x_error_message_code                OUT NOCOPY VARCHAR2 -- 4537865
2810   )
2811   IS
2812     CURSOR c1 IS
2813       select object_Id_to1
2814         from pa_object_relationships
2815        where object_type_to = 'PA_TASKS'
2816          and relationship_type = 'S'
2817   start with object_id_from1 = p_task_version_id
2818          and object_type_from = 'PA_TASKS'
2819          and relationship_type = 'S'
2820   connect by prior object_id_to1 = object_id_from1
2821          and prior object_type_to = object_type_from
2822          and relationship_type = prior relationship_type;    --Bug 3792616
2823     l_task_ver_id    NUMBER;
2824 
2825     l_task_ver_id_tbl SYSTEM.PA_NUM_TBL_TYPE := SYSTEM.PA_NUM_TBL_TYPE() ; -- 4201927 for performance issue
2826   BEGIN
2827 
2828     PA_PROJ_ELEMENTS_UTILS.CHECK_DELETE_TASK_VER_OK(
2829                                p_project_id => p_project_id
2830                               ,p_task_version_id => p_task_version_id
2831                               ,p_parent_structure_ver_id => p_parent_structure_ver_id
2832                               ,x_return_status => x_return_status
2833                               ,x_error_message_code => x_error_message_code
2834                              );
2835     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2836       raise FND_API.G_EXC_ERROR;
2837     END IF;
2838 
2839 
2840     -- 4201927 commented below code for performance issue
2841     /*
2842     OPEN c1;
2843     LOOP
2844       FETCH c1 into l_task_ver_id;
2845       EXIT WHEN c1%NOTFOUND;
2846       PA_PROJ_ELEMENTS_UTILS.Check_delete_task_ver_ok(
2847                                p_project_id => p_project_id
2848                               ,p_task_version_id => l_task_ver_id
2849                               ,p_parent_structure_ver_id => p_parent_structure_ver_id
2850                               ,x_return_status => x_return_status
2851                               ,x_error_message_code => x_error_message_code
2852                              );
2853       IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2854         raise FND_API.G_EXC_ERROR;
2855       END IF;
2856     END LOOP;
2857     CLOSE c1;
2858     */
2859 
2860     -- using bulk collect approach and then iterating through table
2861 
2862     OPEN  c1 ;
2863     FETCH c1 BULK COLLECT INTO l_task_ver_id_tbl;
2864     CLOSE  c1 ;
2865 
2866     IF  nvl(l_task_ver_id_tbl.LAST,0) > 0 THEN
2867         FOR i in reverse l_task_ver_id_tbl.FIRST..l_task_ver_id_tbl.LAST LOOP
2868 
2869           PA_PROJ_ELEMENTS_UTILS.Check_delete_task_ver_ok(
2870                                    p_project_id => p_project_id
2871                                   ,p_task_version_id => l_task_ver_id_tbl(i)
2872                                   ,p_parent_structure_ver_id => p_parent_structure_ver_id
2873                                   ,x_return_status => x_return_status
2874                                   ,x_error_message_code => x_error_message_code
2875                                  );
2876           IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2877             raise FND_API.G_EXC_ERROR;
2878           END IF;
2879 
2880         END LOOP;
2881     END IF;
2882 
2883     -- 4201927 end
2884 
2885     x_return_status := FND_API.G_RET_STS_SUCCESS;
2886 
2887   EXCEPTION
2888     WHEN FND_API.G_EXC_ERROR THEN
2889       x_return_status := FND_API.G_RET_STS_ERROR;
2890       -- 4537865 NOT RESETTING x_error_message_code AS IT WILL reach this point only after x_error_message_code is set
2891     WHEN OTHERS THEN
2892       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2893       -- 4537865
2894       x_error_message_code := SQLCODE ;
2895       fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJ_ELEMENTS_UTILS',
2896                               p_procedure_name => 'Check_Del_all_task_Ver_Ok
2897 ');
2898       RAISE;
2899   END Check_Del_all_task_Ver_Ok;
2900 
2901   procedure Check_create_subtask_ok
2902   ( p_parent_task_ver_id                IN  NUMBER
2903    ,x_return_status                     OUT NOCOPY VARCHAR2 -- 4537865
2904    ,x_error_message_code                OUT NOCOPY VARCHAR2 -- 4537865
2905   )
2906   IS
2907     CURSOR get_status IS
2908       select ppe.project_id, ppe.proj_element_id
2909         from pa_project_statuses pps,
2910              pa_proj_elements ppe,
2911              pa_proj_element_versions ppev
2912        where ppev.element_version_id = p_parent_task_ver_id
2913          and ppe.project_id = ppev.project_id
2914          and ppe.proj_element_id = ppev.proj_element_id
2915          and ppe.status_code = pps.project_status_code
2916          and pps.project_system_status_code IN ('ON_HOLD', 'CANCELLED')
2917          and pps.status_type = 'TASK';
2918     l_project_id       NUMBER;
2919     l_proj_element_id  NUMBER;
2920 
2921     CURSOR get_task_info IS
2922       select ppev.project_id, ppev.proj_element_id
2923         from pa_proj_element_versions ppev
2924        where ppev.element_version_id = p_parent_task_ver_id;
2925 
2926     CURSOR get_schedule_info IS
2927       select 1
2928         from pa_proj_elem_ver_schedule ppvsch,
2929              pa_proj_element_versions ppev
2930        where ppev.element_version_id = p_parent_task_ver_id
2931          and ppev.project_id = ppvsch.project_id
2932          and ppev.proj_element_id = ppvsch.proj_element_id
2933          and ppev.element_version_id = ppvsch.element_version_id
2934          and ( ppvsch.wq_planned_quantity IS NOT NULL AND ppvsch.wq_planned_quantity <> 0 );
2935     l_dummy            NUMBER;
2936 
2937     l_err_code         NUMBER:= 0;
2938     l_err_stack        VARCHAR2(630);
2939     l_err_stage        VARCHAR2(80);
2940 
2941     l_return_status    VARCHAR2(1);
2942     l_msg_data         VARCHAR2(2000);
2943     l_msg_count        NUMBER;
2944   BEGIN
2945     OPEN get_status;
2946     FETCH get_status into l_project_id, l_proj_element_id;
2947     IF get_status%NOTFOUND THEN
2948       x_return_status := 'Y';
2949     ELSE
2950       x_return_status := 'N';
2951       x_error_message_code := 'PA_PS_ONHOLD_CANCEL_TK_ERR';
2952       CLOSE get_status;
2953       return;
2954     END IF;
2955     CLOSE get_status;
2956 
2957     OPEN get_task_info;
2958     FETCH get_task_info into l_project_id, l_proj_element_id;
2959     CLOSE get_task_info;
2960 
2961     --hsiu: bug 2674107
2962     --if workplan, check if ok to create subtask.
2963     OPEN get_schedule_info;
2964     FETCH get_schedule_info into l_dummy;
2965     IF (get_schedule_info%FOUND) THEN
2966         x_return_status := 'N';
2967         x_error_message_code := 'PA_PS_PARENT_TK_PWQ_ERR';
2968         return;
2969     END IF;
2970     CLOSE get_schedule_info;
2971 
2972     -- Begin fix for Bug # 4266540.
2973 
2974     l_return_status := pa_relationship_utils.check_task_has_sub_proj(l_project_id
2975 							          , l_proj_element_id
2976 								  , p_parent_task_ver_id);
2977 
2978     if (l_return_status = 'Y') then
2979 
2980     	x_return_status := 'N';
2981        	x_error_message_code := 'PA_PS_TASK_HAS_SUB_PROJ';
2982        	return;
2983 
2984     end if;
2985 
2986     l_return_status := null;
2987 
2988     -- End fix for Bug # 4266540.
2989 
2990     --if financial, check if ok to create subtask.
2991     --Bug 5988335 Adding condition for partial share project to skip financial validation
2992     --when a new subtask is  getting created in workplan.
2993     If (PA_PROJ_ELEMENTS_UTILS.CHECK_IS_FINANCIAL_TASK(l_proj_element_id) = 'Y') AND
2994        (PA_PROJ_TASK_STRUC_PUB.GET_SHARE_TYPE(l_project_id) <> 'SHARE_PARTIAL') --Bug 5988335
2995     THEN
2996       PA_TASK_UTILS.CHECK_CREATE_SUBTASK_OK(x_task_id => l_proj_element_id,
2997           x_err_code => l_err_code,
2998           x_err_stack => l_err_stack,
2999           x_err_stage => l_err_stage
3000           );
3001       IF (l_err_code <> 0) THEN
3002         x_return_status := 'N';
3003         x_error_message_code := substrb(l_err_stage,1,30); -- 4537865 changed substr to substrb
3004         return;
3005       ELSE
3006         x_return_status := 'Y';
3007         return;
3008       END IF;
3009     ELSE
3010         --bug 3055708 (for financial or shared str it will be taken
3011         --care in PA_TASK_UTILS.CHECK_CREATE_SUBTASK_OK)
3012         PA_TASK_PUB1.Check_Task_Has_Association(
3013                    p_task_id                => l_proj_element_id
3014                   ,x_return_status          => l_return_status
3015                   ,x_msg_count              => l_msg_count
3016                   ,x_msg_data               => l_msg_data
3017 
3018                );
3019 
3020          IF (l_return_status <> 'S') Then
3021              x_return_status := 'N';
3022              x_error_message_code := l_msg_data;
3023              return;
3024          END IF;
3025         --end bug 3055708
3026 
3027         --bug 3305199: cannot create subtask if dep exists in parent when
3028         --option for no dep in summary task is Y
3029         IF (PA_PROJECT_STRUCTURE_UTILS.check_dep_on_summary_tk_ok(l_project_id) = 'N') THEN
3030           IF ('Y' = PA_RELATIONSHIP_UTILS.CHECK_DEP_EXISTS(p_parent_task_ver_id)) THEN
3031            x_return_status := 'N';
3032            x_error_message_code := 'PA_DEP_ON_SUMM_TSK';
3033             return;
3034           END IF;
3035         END IF;
3036     END IF;
3037     --bug 3947726
3038     --do not allow sub-tasks creation if the lowest level task has progress.
3039     --This is also applicable for shared case if the task has only ETC but not actual. If actual is there then it means it will be stopped in expenditure items validation.
3040     IF pa_proj_task_struc_pub.wp_str_exists(l_project_id) = 'Y'
3041        AND pa_task_assignment_utils.get_task_level_record( l_project_id, p_parent_task_ver_id ) IS NOT NULL
3042        AND PA_PROGRESS_UTILS.check_object_has_prog(
3043                 p_project_id                           => l_project_id
3044                ,p_proj_element_id                      => l_proj_element_id
3045                ,p_object_id                            => l_proj_element_id
3046                ,p_object_type                          => 'PA_TASKS'
3047                ,p_structure_type                       => 'WORKPLAN'
3048               )       = 'Y'
3049 	AND PA_PROGRESS_UTILS.check_ta_has_prog(
3050 		p_project_id                           => l_project_id
3051 	       ,p_proj_element_id                      => l_proj_element_id
3052 	       ,p_element_ver_id                       => p_parent_task_ver_id
3053 	      )       = 'Y'  --Added for 7015986
3054     THEN
3055            x_return_status := 'N';
3056            x_error_message_code := 'PA_PS_TASK_HAS_PROG_ADD';
3057             return;
3058     END IF;
3059     --end bug 3947726
3060   -- 4537865
3061   EXCEPTION
3062 	WHEN OTHERS THEN
3063 		x_return_status := 'N';
3064 		x_error_message_code := SQLCODE ;
3065 		fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJ_ELEMENTS_UTILS',
3066                               p_procedure_name => 'Check_create_subtask_ok',
3067                               p_error_text => SUBSTRB(SQLERRM,1,240));
3068 		RAISE ;
3069   END Check_create_subtask_ok;
3070 
3071 
3072   FUNCTION Check_task_stus_action_allowed
3073                           (p_task_status_code IN VARCHAR2,
3074                            p_action_code      IN VARCHAR2 ) return
3075   VARCHAR2
3076   IS
3077     CURSOR l_taskstus_csr IS
3078     SELECT enabled_flag, project_system_status_code
3079     FROM pa_project_status_controls
3080     WHERE project_status_code = p_task_status_code
3081     AND   action_code         = p_action_code;
3082 
3083     l_action_allowed  VARCHAR2(1) := 'N';
3084 
3085     l_proj_sys_status_code  VARCHAR2(30);
3086   BEGIN
3087     OPEN l_taskstus_csr;
3088     FETCH l_taskstus_csr INTO l_action_allowed, l_proj_sys_status_code;
3089     IF l_taskstus_csr%NOTFOUND THEN
3090       CLOSE l_taskstus_csr;
3091       RETURN 'N';
3092     END IF;
3093     CLOSE l_taskstus_csr;
3094 
3095     RETURN (NVL(l_action_allowed,'N'));
3096 
3097   EXCEPTION
3098     WHEN OTHERS THEN
3099       RETURN 'N';
3100   END Check_task_stus_action_allowed;
3101 
3102 -- hyau new apis for lifecycle changes
3103 
3104 -- API name                      : CHECK_ELEMENT_HAS_PHASE
3105 -- Type                          : FUNCTION
3106 -- Pre-reqs                      : N/A
3107 -- Return Value                  : 'Y' if the element has a phase associated with it, else returns 'N'.
3108 --
3109 -- Parameters
3110 --   p_proj_element_id            IN NUMBER
3111 --
3112 --  History
3113 --
3114 --  30-OCT-02   hyau             -Created
3115 --
3116 FUNCTION CHECK_ELEMENT_HAS_PHASE (
3117    p_proj_element_id       IN  NUMBER) RETURN
3118 
3119   VARCHAR2
3120   IS
3121     CURSOR l_element_has_phase_csr IS
3122     SELECT 'Y'
3123     FROM   pa_proj_elements
3124     WHERE  proj_element_id = p_proj_element_id
3125     AND    phase_version_id is not null;
3126 
3127     l_has_phase  VARCHAR2(1) := 'N';
3128 
3129   BEGIN
3130     OPEN l_element_has_phase_csr;
3131     FETCH l_element_has_phase_csr INTO l_has_phase;
3132     IF l_element_has_phase_csr%NOTFOUND THEN
3133       CLOSE l_element_has_phase_csr;
3134       RETURN 'N';
3135     END IF;
3136     CLOSE l_element_has_phase_csr;
3137 
3138     RETURN (NVL(l_has_phase,'N'));
3139 
3140   EXCEPTION
3141     WHEN OTHERS THEN
3142       RETURN 'N';
3143   END CHECK_ELEMENT_HAS_PHASE;
3144 
3145 
3146 -- API name                      : IS_TOP_TASK_ACROSS_ALL_VER
3147 -- Type                          : FUNCTION
3148 -- Pre-reqs                      : N/A
3149 -- Return Value                  : 'Y' if the task is a top task across all versions, else returns 'N'.
3150 --
3151 -- Parameters
3152 --   p_proj_element_id            IN NUMBER
3153 --
3154 --  History
3155 --
3156 --  30-OCT-02   hyau             -Created
3157 --
3158 FUNCTION IS_TOP_TASK_ACROSS_ALL_VER(
3159    p_proj_element_id       IN  NUMBER) RETURN
3160 
3161   VARCHAR2
3162   IS
3163     CURSOR l_exist_non_top_task_csr IS
3164     select 'N'
3165     from   pa_proj_elements ppe,
3166            pa_proj_element_versions ppev
3167     where  ppe.proj_element_id = p_proj_element_id
3168     and    ppe.proj_element_id = ppev.proj_element_id
3169     and    nvl(ppev.wbs_level, 0) <> 1;
3170 
3171     l_is_top_task  VARCHAR2(1) := 'N';
3172 
3173   BEGIN
3174     OPEN l_exist_non_top_task_csr;
3175     FETCH l_exist_non_top_task_csr INTO l_is_top_task;
3176     IF l_exist_non_top_task_csr%NOTFOUND THEN
3177       CLOSE l_exist_non_top_task_csr;
3178       RETURN 'Y';
3179     END IF;
3180     CLOSE l_exist_non_top_task_csr;
3181 
3182     RETURN (NVL(l_is_top_task,'N'));
3183 
3184   EXCEPTION
3185     WHEN OTHERS THEN
3186       RETURN 'N';
3187   END IS_TOP_TASK_ACROSS_ALL_VER;
3188 
3189 -- API name                      : CHECK_PHASE_IN_USE
3190 -- Type                          : FUNCTION
3191 -- Pre-reqs                      : N/A
3192 -- Return Value                  : 'Y' if the phase is already used by another task in the structure, else returns 'N'.
3193 --
3194 -- Parameters
3195 --   p_task_id           NUMBER
3196 --   phase_version_id    NUMBER
3197 --
3198 --  History
3199 --
3200 --  30-OCT-02   hyau             -Created
3201 --
3202 FUNCTION CHECK_PHASE_IN_USE(
3203    p_task_id       IN  NUMBER
3204   ,p_phase_version_id  IN NUMBER) RETURN
3205 
3206   VARCHAR2
3207   IS
3208 
3209   /* Bug 2680486 -- Performance changes -- Added join of project_id in the following cursor*/
3210     CURSOR l_phase_in_use_csr IS
3211     select 'Y'
3212     from   pa_proj_elements ppe,
3213            pa_proj_elements ppe2
3214     where  ppe.proj_element_id = p_task_id
3215     and    ppe.parent_structure_id = ppe2.parent_structure_id
3216     and    ppe2.phase_version_id = p_phase_version_id
3217     and    ppe2.proj_element_id <> p_task_id
3218     and    ppe2.project_id = ppe.project_id;
3219 
3220     l_phase_in_use  VARCHAR2(1) := 'Y';
3221 
3222   BEGIN
3223     OPEN l_phase_in_use_csr;
3224     FETCH l_phase_in_use_csr INTO l_phase_in_use;
3225     IF l_phase_in_use_csr%NOTFOUND THEN
3226       CLOSE l_phase_in_use_csr;
3227       RETURN 'N';
3228     END IF;
3229     CLOSE l_phase_in_use_csr;
3230 
3231     RETURN (NVL(l_phase_in_use,'Y'));
3232 
3233   EXCEPTION
3234     WHEN OTHERS THEN
3235       RETURN 'N';
3236   END CHECK_PHASE_IN_USE;
3237 
3238 
3239 -- end hyau new apis for lifecycle changes
3240 
3241   PROCEDURE Check_Fin_Task_Published(p_project_id IN NUMBER,
3242                                      p_task_id IN NUMBER,
3243                                      x_return_status OUT NOCOPY VARCHAR2, -- 4537865
3244                                      x_error_message_code OUT NOCOPY VARCHAR2) -- 4537865
3245   IS
3246     CURSOR c1 is
3247     select 1 from
3248       pa_proj_elements a,
3249       pa_proj_element_versions b,
3250       pa_proj_elem_ver_structure c
3251     where a.proj_element_id = p_task_id
3252       and a.project_id = p_project_id
3253       and a.project_id = b.project_id
3254       and a.proj_element_id = b.proj_element_id
3255       and b.project_Id = c.project_id
3256       and b.parent_structure_version_id = c.element_version_id
3257       and c.status_code = 'STRUCTURE_PUBLISHED';
3258 
3259     CURSOR c2 IS
3260     select 1 from
3261       pa_tasks a
3262     where a.task_id = p_task_id;
3263 
3264     l_dummy NUMBER;
3265 
3266   BEGIN
3267     OPEN c1;
3268     FETCH c1 into l_dummy;
3269     IF c1%NOTFOUND THEN
3270       --check if task has financial component
3271       OPEN c2;
3272       FETCH c2 into l_dummy;
3273       IF c2%NOTFOUND THEN
3274         x_return_status := 'N';
3275         x_error_message_code := 'PA_PS_TSK_NOT_PUB_ERR';
3276       ELSE
3277         x_return_status := 'Y';
3278       END IF;
3279       CLOSE c2;
3280     ELSE
3281       x_return_status := 'Y';
3282     END IF;
3283     CLOSE c1;
3284 
3285   -- 4537865
3286   EXCEPTION
3287 	WHEN OTHERS THEN
3288 		x_return_status := 'N' ;
3289 		x_error_message_code := SQLCODE ;
3290 
3291 		-- not included add_exc_msg call because caller of this API doesnt expect it.
3292 		RAISE ;
3293   END Check_Fin_Task_Published;
3294 
3295   PROCEDURE check_move_task_ok
3296   (
3297     p_task_ver_id         IN  NUMBER
3298    ,x_return_status       OUT NOCOPY VARCHAR2   -- 4537865
3299    ,x_error_message_code  OUT NOCOPY VARCHAR2   -- 4537865
3300   )
3301   IS
3302     CURSOR get_status IS
3303       select '1'
3304         from pa_project_statuses pps,
3305              pa_proj_elements ppe,
3306              pa_proj_element_versions ppev
3307        where ppev.element_version_id = p_task_ver_id
3308          and ppe.project_id = ppev.project_id
3309          and ppe.proj_element_id = ppev.proj_element_id
3310          and ppe.status_code = pps.project_status_code
3311          and pps.project_system_status_code IN ('ON_HOLD', 'CANCELLED', 'COMPLETED')
3312          and pps.status_type = 'TASK';
3313     l_dummy varchar2(1);
3314   BEGIN
3315     OPEN get_status;
3316     FETCH get_status into l_dummy;
3317     IF get_status%NOTFOUND THEN
3318       x_return_status := 'Y';
3319     ELSE
3320       x_return_status := 'N';
3321       x_error_message_code := 'PA_PS_MOVE_TK_STAT_ERR';
3322     END IF;
3323     CLOSE get_status;
3324   -- 4537865
3325   EXCEPTION
3326         WHEN OTHERS THEN
3327                 x_return_status := 'N' ;
3328                 x_error_message_code := SQLCODE ;
3329 		fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_PROJ_ELEMENTS_UTILS',
3330                               p_procedure_name => 'check_move_task_ok',
3331                               p_error_text     => SUBSTRB(SQLERRM,1,240));
3332                 RAISE ;
3333   END check_move_task_ok;
3334 
3335 
3336 -- API name                      :
3337 -- Type                          : PROCEDURE
3338 -- Pre-reqs                      : N/A
3339 -- Return Value                  : Sucess, Error, or Unexpected error
3340 --
3341 -- Parameters
3342 --   p_task_id            IN   NUMBER
3343 --   p_task_version_id    IN   NUMBER
3344 --   p_new_task_status    IN   VARCHAR2
3345 --   x_return_status      OUT  VARCHAR2
3346 --   x_error_message_code OUT  VARCHAR2
3347 --
3348 --  History
3349 --
3350 --  30-OCT-02   hyau             -Created
3351 --
3352   PROCEDURE Check_chg_stat_cancel_ok
3353   (
3354     p_task_id             IN  NUMBER
3355    ,p_task_version_id     IN  NUMBER
3356    ,p_new_task_status     IN  VARCHAR2
3357    ,x_return_status       OUT NOCOPY VARCHAR2   -- 4537865
3358    ,x_error_message_code  OUT NOCOPY VARCHAR2   -- 4537865
3359   )
3360   IS
3361     CURSOR c1 IS
3362       select b.project_id, b.proj_element_id
3363       from pa_proj_element_versions a,
3364            pa_proj_elem_ver_structure b
3365       where a.element_version_id = p_task_version_id
3366         and a.parent_structure_version_id = b.element_version_id
3367         and a.project_id = b.project_id;
3368     l_project_id          NUMBER;
3369     l_structure_id        NUMBER;
3370     l_xtra_task_id        NUMBER;
3371     l_versioned           VARCHAR2(1);
3372 
3373     CURSOR c2(c_project_id NUMBER, c_structure_id NUMBER) IS
3374       select distinct ppe.proj_element_id
3375         from pa_proj_element_versions ppe
3376        where ppe.element_version_id IN (
3377                select object_id_to1
3378                  from pa_object_relationships
3379                 where relationship_type = 'S'
3380            start with object_id_from1 IN (
3381                          select a.element_version_id
3382                            from pa_proj_element_versions a,
3383                                 pa_proj_elem_ver_structure b
3384                           where b.project_id = c_project_id
3385                             and b.proj_element_id = c_structure_id
3386                             and b.status_code <> 'STRUCTURE_PUBLISHED'
3387                             and b.element_version_id = a.parent_structure_version_id
3388                             and a.proj_element_id = p_task_id)
3389                   and relationship_type = 'S'
3390            connect by object_id_from1 = prior object_id_to1
3391                   and object_type_from = prior object_type_to
3392                   and relationship_type = prior relationship_type)
3393       minus
3394       select ppe.proj_element_id
3395         from pa_proj_element_versions ppe
3396        where ppe.element_version_id IN (
3397                select object_id_to1
3398                  from pa_object_relationships
3399                 where relationship_type = 'S'
3400            start with object_id_from1 = p_task_version_id
3401                   and object_type_from = 'PA_TASKS'
3402                   and relationship_type = 'S'
3403            connect by object_id_from1 = prior object_id_to1
3404                   and object_type_from = prior object_type_to
3405                   and relationship_type = prior relationship_type);
3406 
3407     CURSOR c3(c_project_id NUMBER, c_structure_id NUMBER, c_xtra_task_id NUMBER) IS
3408       select ppev.element_version_id, ppev.TASK_UNPUB_VER_STATUS_CODE
3409         from pa_proj_element_Versions ppev,
3410              pa_proj_elem_ver_structure ppevs
3411        where ppev.proj_element_id = c_xtra_task_id
3412          and ppev.project_id = c_project_id
3413          and ppev.parent_structure_version_id = ppevs.element_version_id
3414          and ppevs.project_id = c_project_id
3415          and ppevs.proj_element_id = c_structure_id
3416          and ppevs.status_code <> 'STRUCTURE_PUBLISHED';
3417     l_xtra_task_ver_id    NUMBER;
3418     l_task_ver_status     VARCHAR2(30);
3419 
3420   BEGIN
3421     OPEN c1;
3422     FETCH c1 into l_project_id, l_structure_id;
3423     CLOSE c1;
3424 
3425     --Check if versioning is enabled
3426     l_versioned := PA_WORKPLAN_ATTR_UTILS.CHECK_WP_VERSIONING_ENABLED(
3427                                                   l_project_id);
3428 
3429     IF (l_versioned = 'Y') THEN
3430       OPEN c2(l_project_id, l_structure_id);
3431       LOOP
3432         --get the task id of all tasks that are in the working version but not in
3433         -- the latest published version.
3434         FETCH c2 into l_xtra_task_id;
3435         EXIT WHEN c2%NOTFOUND;
3436         OPEN c3(l_project_id, l_structure_id, l_xtra_task_id);
3437         LOOP
3438           --get all the task version status of unpublished tasks
3439           FETCH c3 INTO l_xtra_task_ver_id, l_task_ver_status;
3440           EXIT WHEN c3%NOTFOUND;
3441           IF (l_task_ver_status = 'PUBLISHED') THEN
3442             x_error_message_code:= 'PA_PS_TK_STAT_CNL_ERR';
3443             raise FND_API.G_EXC_ERROR;
3444           END IF;
3445         END LOOP;
3446         CLOSE c3;
3447       END LOOP;
3448       CLOSE c2;
3449     END IF;
3450 
3451     x_return_status := FND_API.G_RET_STS_SUCCESS;
3452   EXCEPTION
3453     WHEN FND_API.G_EXC_ERROR THEN
3454       x_return_status := FND_API.G_RET_STS_ERROR;
3455       -- 4537865
3456       -- Not resetting x_error_message_code as at this point it would have been already populated.
3457     WHEN OTHERS THEN
3458       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3459       fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJ_ELEMENTS_UTILS',
3460                               p_procedure_name => 'Check_chg_stat_cancel_ok');
3461 
3462       -- 4537865
3463       x_error_message_code := SQLCODE ;
3464       RAISE ;
3465   END Check_chg_stat_cancel_ok;
3466 
3467 FUNCTION get_element_name(p_proj_element_id IN NUMBER) RETURN VARCHAR2
3468 IS
3469   l_ret VARCHAR2(240);
3470 BEGIN
3471   IF p_proj_element_id IS NULL OR p_proj_element_id<0 THEN
3472     RETURN NULL;
3473   END IF;
3474 
3475   SELECT name
3476   INTO l_ret
3477   FROM pa_proj_elements
3478   WHERE proj_element_id = p_proj_element_id;
3479 
3480   RETURN l_ret;
3481 EXCEPTION
3482   WHEN OTHERS THEN
3483     fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJ_ELEMENTS_UTILS',
3484                             p_procedure_name => 'get_element_name');
3485     RAISE;
3486 END get_element_name;
3487 
3488 FUNCTION get_element_number(p_proj_element_id IN NUMBER) RETURN VARCHAR2
3489 IS
3490   l_ret VARCHAR2(100);
3491 BEGIN
3492   IF p_proj_element_id IS NULL OR p_proj_element_id<0 THEN
3493     RETURN NULL;
3494   END IF;
3495 
3496   SELECT element_number
3497   INTO l_ret
3498   FROM pa_proj_elements
3499   WHERE proj_element_id = p_proj_element_id;
3500 
3501   RETURN l_ret;
3502 EXCEPTION
3503   WHEN OTHERS THEN
3504     fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJ_ELEMENTS_UTILS',
3505                             p_procedure_name => 'get_element_number');
3506     RAISE;
3507 END get_element_number;
3508 
3509 FUNCTION get_element_name_number(p_proj_element_id IN NUMBER) RETURN VARCHAR2
3510 IS
3511   l_ret VARCHAR2(1000);
3512 BEGIN
3513   IF p_proj_element_id IS NULL OR p_proj_element_id<0 THEN
3514     RETURN NULL;
3515   END IF;
3516 
3517   SELECT name||'('||element_number||')'
3518   INTO l_ret
3519   FROM pa_proj_elements
3520   WHERE proj_element_id = p_proj_element_id;
3521 
3522   RETURN l_ret;
3523 EXCEPTION
3524   WHEN OTHERS THEN
3525     fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJ_ELEMENTS_UTILS',
3526                             p_procedure_name => 'get_element_name_number');
3527     RAISE;
3528 END get_element_name_number;
3529 
3530 function check_child_element_exist(p_element_version_id NUMBER) RETURN VARCHAR2
3531 IS
3532   l_dummy number;
3533 
3534 -- Bug 6156686
3535   cursor child_exist IS
3536   select null
3537   from dual where exists
3538   (select null from pa_object_relationships
3539   where object_id_from1 = p_element_version_id
3540     and relationship_type = 'S');
3541 BEGIN
3542 
3543   OPEN child_exist;
3544   FETCH child_exist into l_dummy;
3545   IF child_exist%NOTFOUND then
3546     --Cannot find child. It is lowest task
3547     CLOSE child_exist;
3548     return 'N';
3549   ELSE
3550     --Child found. Not lowest task
3551     CLOSE child_exist;
3552     return 'Y';
3553   END IF;
3554 EXCEPTION
3555   WHEN OTHERS THEN
3556     return (SQLCODE);
3557 END check_child_element_exist;
3558 
3559 
3560 FUNCTION get_task_status_sys_code(p_task_status_code VARCHAR2) RETURN VARCHAR2
3561 IS
3562   l_task_stat_sys_code VARCHAR2(30);
3563 BEGIN
3564   select project_system_status_code into l_task_stat_sys_code
3565   from pa_project_statuses
3566   where p_task_status_code = project_status_code
3567   and status_type = 'TASK';
3568 
3569   return l_task_stat_sys_code;
3570 EXCEPTION
3571   WHEN OTHERS THEN
3572     return NULL;
3573 END get_task_status_sys_code;
3574 
3575 -- Returns the element_version_id of the next/previous task, given the project id, parent structure
3576 -- version id, and the display sequence of the current task. Pass value "NEXT" and "PREVIOUS" for
3577 -- p_previous_or_next parameter to indicate whether to get the next or the previous task. Returns
3578 -- -1 if there are no next/previous task.
3579 FUNCTION get_next_prev_task_id(
3580     p_project_id                IN  NUMBER
3581    ,p_structure_version_id      IN  NUMBER
3582    ,p_display_seq_id            IN  NUMBER
3583    ,p_previous_or_next          IN VARCHAR2) RETURN NUMBER
3584 IS
3585   l_element_version_Id NUMBER;
3586 
3587   cursor c_previous_task_id( c_project_id NUMBER, c_struct_version_id NUMBER, c_display_seq NUMBER) IS
3588     select element_version_id
3589     from pa_proj_element_versions
3590     where project_id = c_project_id
3591     and parent_structure_version_id = c_struct_version_id
3592     and display_sequence = (
3593       select max(display_sequence)
3594       from pa_proj_element_versions
3595       where project_id = c_project_id
3596       and parent_structure_version_id = c_struct_version_id
3597       and display_sequence < c_display_seq
3598     );
3599 
3600   cursor c_next_task_id( c_project_id NUMBER, c_struct_version_id NUMBER, c_display_seq NUMBER) IS
3601     select element_version_id
3602     from pa_proj_element_versions
3603     where project_id = c_project_id
3604     and parent_structure_version_id = c_struct_version_id
3605     and display_sequence = (
3606       select min(display_sequence)
3607       from pa_proj_element_versions
3608       where project_id = c_project_id
3609       and parent_structure_version_id = c_struct_version_id
3610       and display_sequence > c_display_seq
3611     );
3612 
3613 BEGIN
3614 
3615   IF p_previous_or_next IS NOT NULL and p_previous_or_next = 'PREVIOUS' then
3616     OPEN c_previous_task_id(p_project_id, p_structure_version_id, p_display_seq_id);
3617     FETCH c_previous_task_id into l_element_version_Id;
3618     IF c_previous_task_id%NOTFOUND then
3619       CLOSE c_previous_task_id;
3620       return -1;
3621     ELSE
3622       CLOSE c_previous_task_id;
3623       return l_element_version_Id;
3624     END IF;
3625   ELSIF  p_previous_or_next IS NOT NULL and p_previous_or_next = 'NEXT' then
3626     OPEN c_next_task_id(p_project_id, p_structure_version_id, p_display_seq_id);
3627     FETCH c_next_task_id into l_element_version_Id;
3628     IF c_next_task_id%NOTFOUND then
3629       CLOSE c_next_task_id;
3630       return -1;
3631     ELSE
3632       CLOSE c_next_task_id;
3633       return l_element_version_Id;
3634     END IF;
3635   END IF;
3636 
3637 EXCEPTION
3638   WHEN OTHERS THEN
3639     return -1;
3640 END get_next_prev_task_id;
3641 
3642 /*==================================================================
3643    This api obtains the structure version id to which task versions
3644    should be created and added to. This API is to be called only from
3645    the AMG context. Included the api for Post FP K one off. Bug 2931183.
3646    This api also returns the task unpublished version status code.
3647    This value is used when we create a task version.
3648  ==================================================================*/
3649 
3650 PROCEDURE GET_STRUCTURE_INFO
3651    (  p_project_id                IN   pa_projects_all.project_id%TYPE
3652      ,p_structure_type            IN   pa_structure_types.structure_type_class_code%TYPE
3653      ,p_structure_id              IN   pa_proj_elements.proj_element_id%TYPE
3654      ,p_is_wp_separate_from_fn    IN   VARCHAR2
3655      ,p_is_wp_versioning_enabled  IN   VARCHAR2
3656      ,x_structure_version_id      OUT NOCOPY pa_proj_element_versions.element_version_id%TYPE -- 4537865
3657      ,x_task_unpub_ver_status_code OUT NOCOPY  pa_proj_element_versions.task_unpub_ver_status_code%TYPE -- 4537865
3658      ,x_return_status             OUT  NOCOPY VARCHAR2 -- 4537865
3659      ,x_msg_count                 OUT  NOCOPY NUMBER -- 4537865
3660      ,x_msg_data                  OUT  NOCOPY VARCHAR2) -- 4537865
3661 AS
3662 
3663 
3664 -- Cursors used in this API.
3665    CURSOR cur_struc_ver_wp(c_project_id number,c_structure_type varchar2,c_status_code varchar2)
3666    IS
3667      SELECT c.element_version_id
3668        FROM pa_proj_element_versions c,
3669                     pa_structure_types a,
3670                     pa_proj_structure_types b
3671                    ,pa_proj_elem_ver_structure d
3672       WHERE c.project_id = c_project_id
3673         AND a.structure_type_id = b.structure_type_id
3674         AND b.proj_element_id = c.proj_element_id
3675         AND a.structure_type = c_structure_type
3676            AND d.project_id = c.project_id
3677         AND d.element_version_id = c.element_version_id
3678         AND d.status_code = c_status_code;
3679 
3680    CURSOR cur_struc_ver_fin(c_project_id number,c_structure_type varchar2)
3681    IS
3682      SELECT c.element_version_id
3683        FROM pa_proj_element_versions c,
3684                     pa_structure_types a,
3685                     pa_proj_structure_types b,
3686                     pa_proj_elem_ver_structure d
3687       WHERE c.project_id = c_project_id
3688         AND a.structure_type_id = b.structure_type_id
3689         AND b.proj_element_id = c.proj_element_id
3690         AND a.structure_type = c_structure_type
3691            AND d.project_id = c.project_id
3692         AND d.element_version_id = c.element_version_id
3693         AND d.status_code = 'STRUCTURE_PUBLISHED'
3694         AND d.latest_eff_published_flag = 'Y';
3695 -- End cursors used in this API.
3696 
3697 l_msg_count                     NUMBER := 0;
3698 l_data                          VARCHAR2(2000);
3699 l_msg_data                      VARCHAR2(2000);
3700 l_msg_index_out                 NUMBER;
3701 l_debug_mode                           VARCHAR2(1);
3702 
3703 l_debug_level2                   CONSTANT NUMBER := 2;
3704 l_debug_level3                   CONSTANT NUMBER := 3;
3705 l_debug_level4                   CONSTANT NUMBER := 4;
3706 l_debug_level5                   CONSTANT NUMBER := 5;
3707 
3708 BEGIN
3709      IF l_debug_mode = 'Y' THEN
3710           pa_debug.g_err_stage:= 'Entering GET_STRUCTURE_INFO';
3711           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3712                                    l_debug_level2);
3713      END IF;
3714 
3715      x_msg_count := 0;
3716      x_return_status := FND_API.G_RET_STS_SUCCESS;
3717      l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
3718 
3719      IF l_debug_mode = 'Y' THEN --For bug 4252182
3720 
3721            pa_debug.set_curr_function( p_function   => 'GET_STRUCTURE_INFO',
3722                                  p_debug_mode => l_debug_mode );
3723      END IF;
3724 
3725      -- Check for business rules violations
3726 
3727      IF l_debug_mode = 'Y' THEN
3728 
3729           pa_debug.g_err_stage:= 'Input parameter List :';
3730           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3731                                      l_debug_level3);
3732 
3733           pa_debug.g_err_stage:= 'p_project_id : ' || p_project_id;
3734           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3735                                      l_debug_level3);
3736 
3737 
3738           pa_debug.g_err_stage:= 'p_structure_type : ' || p_structure_type;
3739           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3740                                      l_debug_level3);
3741 
3742           pa_debug.g_err_stage:= 'p_structure_id : ' || p_structure_id;
3743           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3744                                      l_debug_level3);
3745 
3746           pa_debug.g_err_stage:= 'p_is_wp_separate_from_fn :' || p_is_wp_separate_from_fn;
3747           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3748                                      l_debug_level3);
3749 
3750           pa_debug.g_err_stage:= 'p_is_wp_versioning_enabled :' || p_is_wp_versioning_enabled;
3751           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3752                                      l_debug_level3);
3753      END IF;
3754 
3755 
3756      IF  (p_project_id IS NULL) OR
3757          (p_structure_type IS NULL) OR
3758          (p_structure_id IS NULL) OR
3759          (p_is_wp_separate_from_fn IS NULL) OR
3760          (p_is_wp_versioning_enabled IS NULL)
3761      THEN
3762           PA_UTILS.ADD_MESSAGE
3763                 (p_app_short_name => 'PA',
3764                   p_msg_name     => 'PA_INV_PARAM_PASSED');     -- Bug 2955589. Changed the message name to
3765           RAISE Invalid_Arg_Exc_WP;                             -- have a generic message.
3766 
3767      END IF;
3768 
3769      /*
3770           If workplan context, if versioning is enabled get the working version. else
3771           get the published version. In financial context get working version. If
3772           working version could not be found, get the published version.
3773      */
3774      IF p_structure_type = 'WORKPLAN' THEN
3775           IF p_is_wp_separate_from_fn = 'Y' AND p_is_wp_versioning_enabled = 'Y' THEN
3776                x_structure_version_id :=
3777                     PA_PROJECT_STRUCTURE_UTILS.get_last_updated_working_ver(p_structure_id);
3778                x_task_unpub_ver_status_code := 'WORKING';
3779           END IF;
3780 
3781           IF x_structure_version_id is null THEN
3782                open  cur_struc_ver_wp(p_project_id,'WORKPLAN','STRUCTURE_PUBLISHED');
3783                fetch cur_struc_ver_wp into x_structure_version_id;
3784                close cur_struc_ver_wp;
3785                x_task_unpub_ver_status_code := 'PUBLISHED';
3786           END IF;
3787      ELSE -- structure type is financial
3788           open  cur_struc_ver_wp(p_project_id,'FINANCIAL','STRUCTURE_WORKING');
3789           fetch cur_struc_ver_wp into x_structure_version_id;
3790           close cur_struc_ver_wp;
3791           x_task_unpub_ver_status_code := 'WORKING';
3792 
3793           IF x_structure_version_id is null THEN
3794                open  cur_struc_ver_fin(p_project_id,'FINANCIAL');
3795                fetch cur_struc_ver_fin into x_structure_version_id;
3796                close cur_struc_ver_fin;
3797                x_task_unpub_ver_status_code := 'PUBLISHED';
3798           END IF;
3799      END IF;
3800 
3801      IF l_debug_mode = 'Y' THEN
3802           pa_debug.g_err_stage:= 'Obtained structure version id : '||x_structure_version_id;
3803           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3804                                    l_debug_level3);
3805           pa_debug.g_err_stage:= 'Task Unpublished version status code : '||x_task_unpub_ver_status_code;
3806           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3807                                    l_debug_level3);
3808           pa_debug.g_err_stage:= 'Exiting GET_STRUCTURE_INFO';
3809           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3810                                    l_debug_level2);
3811      END IF;
3812 
3813      IF l_debug_mode = 'Y' THEN --For bug 4252182
3814           pa_debug.reset_curr_function;
3815      End IF;
3816 EXCEPTION
3817 
3818 WHEN Invalid_Arg_Exc_WP THEN
3819 
3820      x_return_status := FND_API.G_RET_STS_ERROR;
3821      l_msg_count := FND_MSG_PUB.count_msg;
3822 
3823      IF cur_struc_ver_wp%ISOPEN THEN
3824           CLOSE cur_struc_ver_wp;
3825      END IF;
3826 
3827 -- 4537865 : Start
3828      x_task_unpub_ver_status_code := NULL ;
3829      x_structure_version_id := NULL ;
3830 -- 4537865 : End
3831 
3832      IF cur_struc_ver_fin%ISOPEN THEN
3833           CLOSE cur_struc_ver_fin;
3834      END IF;
3835 
3836      IF l_msg_count = 1 and x_msg_data IS NULL THEN
3837           PA_INTERFACE_UTILS_PUB.get_messages
3838               (p_encoded        => FND_API.G_TRUE
3839               ,p_msg_index      => 1
3840               ,p_msg_count      => l_msg_count
3841               ,p_msg_data       => l_msg_data
3842               ,p_data           => l_data
3843               ,p_msg_index_out  => l_msg_index_out);
3844           x_msg_data := l_data;
3845           x_msg_count := l_msg_count;
3846      ELSE
3847           x_msg_count := l_msg_count;
3848      END IF;
3849 
3850      IF l_debug_mode = 'Y' THEN --For bug 4252182
3851           pa_debug.reset_curr_function;
3852      End IF;
3853      RETURN;
3854 
3855 WHEN others THEN
3856 
3857      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3858      x_msg_count     := 1;
3859      x_msg_data      := SQLERRM;
3860 
3861      IF cur_struc_ver_wp%ISOPEN THEN
3862           CLOSE cur_struc_ver_wp;
3863      END IF;
3864 
3865      IF cur_struc_ver_fin%ISOPEN THEN
3866           CLOSE cur_struc_ver_fin;
3867      END IF;
3868 
3869 -- 4537865 : Start
3870      x_task_unpub_ver_status_code := NULL ;
3871      x_structure_version_id := NULL;
3872 -- 4537865 : End
3873 
3874      FND_MSG_PUB.add_exc_msg
3875                    ( p_pkg_name        => 'PA_PROJ_ELEMENTS_UTILS'
3876                     ,p_procedure_name  => 'GET_STRUCTURE_INFO'
3877                     ,p_error_text      => x_msg_data);
3878 
3879      IF l_debug_mode = 'Y' THEN
3880           pa_debug.g_err_stage:= 'Unexpected Error'||x_msg_data;
3881           pa_debug.write(g_module_name,pa_debug.g_err_stage,
3882                               l_debug_level5);
3883           pa_debug.reset_curr_function;
3884      END IF;
3885      RAISE;
3886 END GET_STRUCTURE_INFO;
3887 
3888 --Begin add rtarway FP.M Develepment
3889 -- Procedure            : CHECK_TASK_HAS_TRANSACTION
3890 -- Type                 : Public Procedure
3891 -- Purpose              : This procedure will check whether the task has transaction or not.This API will be
3892 --                      : called from Set_Financial_task_API.
3893 -- Note                 : Check whether it is a financial task or workplan task.
3894 --                      : Fetch the parent_structure_version_id for the passed proj_element_Id from
3895 --                      : PA_PROJ_ELEMENT_VERSIONS and pass to API PA_PROJ_ELEMENTS_UTILS.structure_type
3896 
3897 -- Assumptions          : Only called for Financial task
3898 
3899 -- Parameters                   Type     Required        Description and Purpose
3900 -- ---------------------------  ------   --------        --------------------------------------------------------
3901 -- p_task_id                    NUMBER   Yes             This indicates the task ID for which the transaction needs to be checked.
3902 
3903 
3904 PROCEDURE CHECK_TASK_HAS_TRANSACTION
3905    (
3906        p_api_version           IN   NUMBER    := 1.0
3907      , p_calling_module        IN   VARCHAR2  := 'SELF_SERVICE'
3908      , p_debug_mode            IN   VARCHAR2  := 'N'
3909      , p_task_id               IN   NUMBER
3910      , p_project_id            IN   NUMBER  -- Added for Performance fix 4903460
3911      , x_return_status         OUT NOCOPY  VARCHAR2 -- 4537865
3912      , x_msg_count             OUT NOCOPY NUMBER -- 4537865
3913      , x_msg_data              OUT NOCOPY VARCHAR2 -- 4537865
3914      , x_error_msg_code        OUT NOCOPY VARCHAR2 -- 4537865
3915      , x_error_code            OUT NOCOPY NUMBER -- 4537865
3916    )
3917 IS
3918 
3919 l_msg_count                     NUMBER := 0;
3920 l_data                          VARCHAR2(2000);
3921 l_msg_data                      VARCHAR2(2000);
3922 l_msg_index_out                 NUMBER;
3923 l_debug_mode                    VARCHAR2(1);
3924 
3925 l_prnt_str_ver_id               NUMBER;
3926 l_return_val                    VARCHAR2(1);
3927 l_used_in_OTL                   BOOLEAN;
3928 l_status_code                   NUMBER;
3929 l_return_status                 VARCHAR2(1);
3930 Is_IEX_Installed                BOOLEAN;
3931 
3932 l_debug_level2                   CONSTANT NUMBER := 2;
3933 l_debug_level3                   CONSTANT NUMBER := 3;
3934 l_debug_level4                   CONSTANT NUMBER := 4;
3935 l_debug_level5                   CONSTANT NUMBER := 5;
3936 
3937  --This cursor will select the parent structure version id for the passed proj_elem_id, here it is used for task
3938  --CURSOR c_get_parent_str_ver_id (task_id NUMBER)
3939  --IS
3940  --SELECT PARENT_STRUCTURE_VERSION_ID
3941  --FROM PA_PROJ_ELEMENT_VERSIONS
3942  --WHERE PROJ_ELEMENT_ID = task_id;
3943 
3944 --Bug 3735089
3945 l_user_id               NUMBER;
3946 l_login_id              NUMBER;
3947 
3948 BEGIN
3949         x_msg_count     := 0;
3950         x_return_status := FND_API.G_RET_STS_SUCCESS;
3951         --Bug 3735089 - instead of fnd_profile.value use fnd_profile.value_specific
3952         --l_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
3953         l_user_id := fnd_global.user_id;
3954         l_login_id := fnd_global.login_id;
3955         l_debug_mode  := NVL(FND_PROFILE.value_specific('PA_DEBUG_MODE',l_user_id, l_login_id,275,null,null),'N');
3956 
3957         IF l_debug_mode = 'Y' THEN
3958         PA_DEBUG.set_curr_function( p_function   =>'CHECK_TASK_HAS_TRANSACTION' , p_debug_mode => l_debug_mode );
3959         END IF;
3960 
3961         IF l_debug_mode = 'Y' THEN
3962           Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : Printing Input parameters';
3963           Pa_Debug.WRITE(g_module_name , Pa_Debug.g_err_stage , l_debug_level3);
3964           Pa_Debug.WRITE(g_module_name , 'p_task_id'||':'||p_task_id , l_debug_level3);
3965         END IF;
3966 
3967 
3968         IF l_debug_mode = 'Y' THEN
3969           Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : Validating Input Paramater';
3970           Pa_Debug.WRITE(g_module_name , Pa_Debug.g_err_stage , l_debug_level3);
3971         END IF;
3972 
3973         -- Validating for Input parameter
3974         IF ( p_task_id IS NOT NULL ) THEN
3975 
3976              --Commented to be reviewed once more with set financial task
3977              --IF l_debug_mode = 'Y' THEN
3978              --   Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : Checking for financial type';
3979              --   Pa_Debug.WRITE ( g_module_name , Pa_Debug.g_err_stage , l_debug_level3 );
3980              --END IF;
3981 
3982              --Select the parent structure version id for the passed task id
3983              --OPEN  c_get_parent_str_ver_id ( p_task_id );
3984              --FETCH c_get_parent_str_ver_id INTO l_prnt_str_ver_id;
3985              --CLOSE c_get_parent_str_ver_id;
3986 
3987              --check if the structure type is financial
3988              --IF (
3989              --     PA_PROJ_ELEMENTS_UTILS.structure_type
3990              --     (     p_structure_version_id => l_prnt_str_ver_id
3991              --         , p_task_version_id => null
3992              --         , p_structure_type  => 'FINANCIAL'
3993              --     )  = 'Y'
3994              --   )THEN
3995              --put the tests of check_delete_task_ok here.
3996 
3997              -- Commenting code for 4903460 and replacing this wth new code
3998              --Check if task has expenditure item
3999              /* IF l_debug_mode = 'Y' THEN
4000                    Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check expenditure item for '|| p_task_id;
4001                    Pa_Debug.WRITE(g_module_name , Pa_Debug.g_err_stage , l_debug_level3);
4002              END IF;
4003              l_status_code :=
4004              pa_proj_tsk_utils.check_exp_item_exists(null, p_task_id);
4005              IF ( l_status_code = 1 ) THEN
4006                x_error_code := 50;
4007                x_error_msg_code := 'PA_TSK_EXP_ITEM_EXIST';
4008                return;
4009              ELSIF ( l_status_code < 0 ) THEN
4010                x_error_code  := l_status_code;
4011                return;
4012              END IF;
4013 
4014              --Check if task has purchase order distribution
4015              IF l_debug_mode = 'Y' THEN
4016                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check purchase order for '|| p_task_id;
4017                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4018                                             l_debug_level3);
4019              END IF;
4020              l_status_code :=
4021                      pa_proj_tsk_utils.check_po_dist_exists(NULL, p_task_id);
4022              IF ( l_status_code = 1 ) THEN
4023                  x_error_code := 60;
4024                  x_error_msg_code := 'PA_TSK_PO_DIST_EXIST';
4025                  return;
4026              ELSIF ( l_status_code < 0 ) THEN
4027                  x_error_code := l_status_code;
4028                  return;
4029              END IF;
4030 
4031              -- Check if task has purchase order requisition
4032              IF l_debug_mode = 'Y' THEN
4033                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check purchase order requisition for '|| p_task_id;
4034                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4035                                             l_debug_level3);
4036              END IF;
4037 
4038              l_status_code :=
4039                   pa_proj_tsk_utils.check_po_req_dist_exists(NULL, p_task_id);
4040              IF ( l_status_code = 1 ) THEN
4041                  x_error_code := 70;
4042                  x_error_msg_code := 'PA_TSK_PO_REQ_DIST_EXIST';
4043                  return;
4044              ELSIF ( l_status_code < 0 ) THEN
4045                  x_error_code := l_status_code;
4046                  return;
4047              END IF;
4048 
4049              -- Check if task has supplier invoices
4050              IF l_debug_mode = 'Y' THEN
4051                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check supplier invoice for '|| p_task_id;
4052                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4053                                           l_debug_level3);
4054              END IF;
4055 
4056              l_status_code :=
4057                   pa_proj_tsk_utils.check_ap_invoice_exists(NULL, p_task_id);
4058              IF ( l_status_code = 1 ) THEN
4059                  x_error_code := 80;
4060                  x_error_msg_code := 'PA_TSK_AP_INV_EXIST';
4061                  return;
4062              ELSIF ( l_status_code < 0 ) THEN
4063                  x_error_code := l_status_code;
4064                  return;
4065              END IF;
4066 
4067              -- Check if task has supplier invoice distribution
4068              IF l_debug_mode = 'Y' THEN
4069                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check supplier inv distribution for '|| p_task_id;
4070                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4071                                           l_debug_level3);
4072              END IF;
4073 
4074              l_status_code :=
4075                   pa_proj_tsk_utils.check_ap_inv_dist_exists(NULL, p_task_id);
4076              IF ( l_status_code = 1 ) THEN
4077                  x_error_code := 90;
4078                  x_error_msg_code := 'PA_TSK_AP_INV_DIST_EXIST';
4079                  return;
4080              ELSIF ( l_status_code < 0 ) THEN
4081                  x_error_code := l_status_code;
4082                  return;
4083              END IF;
4084 
4085              -- Check if task has commitment transaction
4086              IF l_debug_mode = 'Y' THEN
4087                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check commitment transaction for '|| p_task_id;
4088                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4089                                           l_debug_level3);
4090              END IF;
4091              l_status_code :=
4092                   pa_proj_tsk_utils.check_commitment_txn_exists(null, p_task_id);
4093              IF ( l_status_code = 1 ) THEN
4094                  x_error_code := 110;
4095                  x_error_msg_code := 'PA_TSK_CMT_TXN_EXIST';
4096                  return;
4097              ELSIF ( l_status_code < 0 ) THEN
4098                  x_error_code := l_status_code;
4099                  return;
4100              END IF;
4101 
4102              -- Check if task has compensation rule set
4103              IF l_debug_mode = 'Y' THEN
4104                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check compensation rule set for '|| p_task_id;
4105                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4106                                           l_debug_level3);
4107              END IF;
4108 
4109              l_status_code :=
4110                   pa_proj_tsk_utils.check_comp_rule_set_exists(NULL, p_task_id);
4111              IF ( l_status_code = 1 ) THEN
4112                  x_error_code := 120;
4113                  x_error_msg_code := 'PA_TSK_COMP_RULE_SET_EXIST';
4114                  return;
4115              ELSIF ( l_status_code < 0 ) THEN
4116                  x_error_code := l_status_code;
4117                  return;
4118              END IF; */
4119              -- End of Commenting for 4903460
4120              -- Check if task is in use in an external system
4121              IF l_debug_mode = 'Y' THEN
4122                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check for task used in external system for'|| p_task_id;
4123                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4124                                           l_debug_level3);
4125              END IF;
4126 
4127              l_status_code :=
4128                   pjm_projtask_deletion.CheckUse_ProjectTask(null, p_task_id);
4129              IF ( l_status_code = 1 ) THEN
4130                  x_error_code := 130;
4131          /* Commented the existing error message and modified it to 'PA_PROJ_TASK_IN_USE_MFG' as below for bug 3600806
4132                  x_error_msg_code := 'PA_TASK_IN_USE_EXTERNAL';*/
4133                  x_error_msg_code := 'PA_PROJ_TASK_IN_USE_MFG';
4134                  return;
4135              ELSIF ( l_status_code = 2 ) THEN         -- Added elseif condition for bug 3600806.
4136                  x_error_code := 130;
4137              x_error_msg_code := 'PA_PROJ_TASK_IN_USE_AUTO';
4138              return;
4139          ELSIF ( l_status_code < 0 ) THEN
4140                  x_error_code := l_status_code;
4141                  return;
4142              ELSIF ( l_status_code <> 0) then     -- Added else condition for bug 3600806 to display a generic error message.
4143                  x_error_code := 130;
4144                  x_error_msg_code := 'PA_PROJ_TASK_IN_USE_EXTERNAL';
4145                  return;
4146          END IF;
4147 
4148              -- Check if task is used in allocations
4149              IF l_debug_mode = 'Y' THEN
4150                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check if project allocations uses task '|| p_task_id;
4151                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4152                                           l_debug_level3);
4153              END IF;
4154 
4155              l_return_val :=
4156                   pa_alloc_utils.Is_Task_In_Allocations(p_task_id);
4157              IF ( l_return_val = 'Y' ) THEN
4158                  x_error_code := 140;
4159                  x_error_msg_code := 'PA_TASK_IN_ALLOC';
4160                  return;
4161              END IF;
4162 
4163              -- Commenting for Performance fix 4903460
4164              /*
4165              -- Check if task has draft invoices
4166               IF l_debug_mode = 'Y' THEN
4167                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check draft invoice for '|| p_task_id;
4168                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4169                                           l_debug_level3);
4170              END IF;
4171 
4172              l_status_code :=
4173                   pa_proj_tsk_utils.check_draft_inv_details_exists(p_task_id);
4174              IF ( l_status_code = 1 ) THEN
4175                  x_error_code := 160;
4176                  x_error_msg_code := 'PA_TSK_CC_DINV_EXIST';
4177                  return;
4178              ELSIF ( l_status_code < 0 ) THEN
4179                  x_error_code := l_status_code;
4180                  return;
4181              END IF;
4182 
4183              -- Check if task has Project_customers
4184               IF l_debug_mode = 'Y' THEN
4185                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check Project Customers for '|| p_task_id;
4186                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4187                                           l_debug_level3);
4188              END IF;
4189 
4190 
4191              l_status_code :=
4192                   pa_proj_tsk_utils.check_project_customer_exists(p_task_id);
4193              IF ( l_status_code = 1 ) THEN
4194                  x_error_code := 170;
4195                  x_error_msg_code := 'PA_TSK_CC_CUST_EXIST';
4196                  return;
4197              ELSIF ( l_status_code < 0 ) THEN
4198                  x_error_code := l_status_code;
4199                  return;
4200              END IF; */
4201 	     --End of Commenting for Performance fix 4903460
4202 
4203              -- Start of new code for Performance fix 4903460
4204              PA_PROJ_ELEMENTS_UTILS.perform_task_validations
4205 	     (
4206 	      p_project_id => p_project_id
4207 	     ,p_task_id    => p_task_id
4208 	     ,x_error_code => x_error_code
4209 	     ,x_error_msg_code => x_error_msg_code
4210 	     );
4211 
4212 	     IF x_error_code <> 0 THEN
4213 	         return;
4214              END IF;
4215 	     -- End of new code for Performance fix 4903460
4216 
4217              -- Check if project contract is installed
4218              IF (pa_install.is_product_installed('OKE')) THEN
4219                 IF l_debug_mode = 'Y' THEN
4220                              Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : Check contract association for task '|| p_task_id;
4221                              Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4222                                           l_debug_level3);
4223                 END IF;
4224 
4225                 IF (PA_PROJ_STRUCTURE_PUB.CHECK_TASK_CONTRACT_ASSO(p_task_id) <>
4226                    FND_API.G_RET_STS_SUCCESS) THEN
4227                  x_error_code := 190;
4228                  x_error_msg_code := 'PA_STRUCT_TK_HAS_CONTRACT';
4229                  return;
4230                END IF;
4231              END IF;
4232              -- Finished checking if project contract is installed.
4233 
4234              --Check to see if the task has been used in OTL
4235                PA_OTC_API.ProjectTaskUsed( p_search_attribute => 'TASK',
4236                                            p_search_value     => p_task_id,
4237                                            x_used             => l_used_in_OTL );
4238                --If exists in OTL
4239                IF l_used_in_OTL
4240                THEN
4241                  x_error_code := 200;
4242                  x_error_msg_code := 'PA_TSK_EXP_ITEM_EXIST';
4243                  return;
4244                END IF;
4245 
4246              --end of OTL check.
4247                Is_IEX_Installed := pa_install.is_product_installed('IEX');
4248                If Is_IEX_Installed then
4249                      IF l_debug_mode = 'Y' THEN
4250                                   Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : check if task '|| p_task_id || ' is charged in iexpense';
4251                                   Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4252                                                l_debug_level3);
4253                      END IF;
4254 
4255                     l_status_code := pa_proj_tsk_utils.check_iex_task_charged(p_task_id);
4256                     IF ( l_status_code = 1 ) THEN
4257                         x_error_code := 210;
4258                         x_error_msg_code := 'PA_TSK_EXP_ITEM_EXIST';
4259                         return;
4260                     ELSIF ( l_status_code < 0 ) THEN
4261                         x_error_code := l_status_code;
4262                         return;
4263                     END IF;
4264                END IF;
4265                --BEGIN
4266                IF l_debug_mode = 'Y' THEN
4267                    Pa_Debug.g_err_stage:= 'PA_PROJ_ELEMENTS_UTILS : CHECK_TASK_HAS_TRANSACTION : PA_FIN_PLAN_UTILS.CHECK_DELETE_TASK_OK'|| p_task_id;
4268                     Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4269                                                l_debug_level3);
4270                 END IF;
4271 
4272                 PA_FIN_PLAN_UTILS.CHECK_DELETE_TASK_OK(
4273                   p_task_id                => p_task_id
4274                  ,p_validation_mode        => 'U'
4275                  ,x_return_status          => l_return_status
4276                  ,x_msg_count              => l_msg_count
4277                  ,x_msg_data               => l_msg_data
4278                 );
4279                    IF (l_return_status <> 'S') Then
4280                       x_error_code := 220;
4281                       x_error_msg_code   := pa_project_core1.get_message_from_stack( l_msg_data );
4282                       return;
4283                    END IF;
4284                        --EXCEPTION  WHEN OTHERS THEN
4285                   --    IF l_debug_mode = 'Y' THEN
4286                   --                Pa_Debug.g_err_stage:= 'API PA_FIN_PLAN_UTILS.CHECK_DELETE_TASK_OK FAILED';
4287                   --                Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4288                   --                             l_debug_level3);
4289                   --    END IF;
4290                   --END;
4291 
4292        --To be reviewed with set financial task
4293        --END IF;--If Financial task condition
4294       END IF;-- If task ID is not null condition
4295 
4296      -- Bug 3735089 : using reset_curr_function too, just using set_curr_function may overflow it after several recursive calls
4297      -- and it gives ORA 06512 numeric or value error
4298       IF l_debug_mode = 'Y' THEN
4299     Pa_Debug.reset_curr_function;
4300       END IF;
4301 
4302 
4303 EXCEPTION
4304 
4305 WHEN OTHERS THEN
4306 
4307      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4308      x_msg_count     := 1;
4309      x_msg_data      := substrb(SQLERRM,1,120);-- Bug 3735089 Added substr --  4537865 Changed substr to substrb
4310 
4311      --  4537865
4312      x_error_code := SQLCODE;
4313      x_error_msg_code := SQLCODE ;
4314 
4315      Fnd_Msg_Pub.add_exc_msg
4316                    ( p_pkg_name        => 'PA_PROJ_ELEMENT_UTILS'
4317                     ,p_procedure_name  => 'CHECK_TASK_HAS_TRANSACTION'
4318                     ,p_error_text      => x_msg_data);
4319 
4320      IF l_debug_mode = 'Y' THEN
4321           Pa_Debug.g_err_stage:= 'Unexpected Error'||x_msg_data;
4322           Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
4323                               l_debug_level5);
4324 
4325           Pa_Debug.reset_curr_function;
4326      END IF;
4327      RAISE;
4328 
4329 END CHECK_TASK_HAS_TRANSACTION;
4330 --Begin add rtarway FP.M Develepment
4331 
4332 function GET_TOP_TASK_VER_ID(p_element_version_id IN number) return number
4333 is
4334    --bug 4043647 , start
4335    /*cursor C1 is
4336    select object_id_from1
4337    from pa_object_relationships
4338    where relationship_type='S'
4339    and object_type_from='PA_TASKS'
4340    connect by prior object_id_from1 = object_id_to1
4341           and prior relationship_type = relationship_type
4342    start with object_id_to1 = p_element_version_id
4343           and relationship_type = 'S'
4344    union
4345     select p_element_version_id from dual ;  --bug 3429648*/
4346 
4347    cursor C1 is
4348    select object_id_to1
4349    from pa_object_relationships
4350    where relationship_type='S'
4351    and object_type_from='PA_STRUCTURES'
4352    and object_type_to='PA_TASKS'
4353    connect by prior object_id_from1 = object_id_to1
4354    start with object_id_to1 = p_element_version_id
4355           and relationship_type = 'S';
4356 
4357    --bug 4043647 , end
4358 
4359 /*
4360       intersect
4361    select a.object_id_to1
4362    from pa_object_relationships a, pa_proj_element_versions b
4363    where b.element_version_id = p_element_version_id
4364    and b.parent_structure_version_id = a.object_id_from1
4365    and a.relationship_type = 'S';
4366 */
4367 
4368    l_top_task_ver_id NUMBER := p_element_version_id;
4369 
4370 begin
4371    OPEN c1;
4372    FETCH c1 INTO l_top_task_ver_id;
4373    CLOSE c1;
4374    return l_top_task_ver_id;
4375 exception
4376    when others then
4377      return(SQLCODE);
4378 end GET_TOP_TASK_VER_ID;
4379 
4380 function GET_TOP_TASK_ID(p_element_version_id IN number) return number
4381 is
4382    cursor C1 (evid number) is
4383    select proj_element_id from pa_proj_element_versions
4384    where element_version_id IN (
4385    /*select object_id_from1   --bug 4043647
4386    from pa_object_relationships
4387    where relationship_type='S'
4388    and object_type_from='PA_TASKS'
4389    connect by prior object_id_from1 = object_id_to1
4390           and prior relationship_type = relationship_type
4391    start with object_id_to1 = p_element_version_id
4392           and relationship_type = 'S'
4393    union
4394     select p_element_version_id from dual );  --bug 3429648*/
4395    select object_id_to1
4396    from pa_object_relationships
4397    where relationship_type='S'
4398    and object_type_from='PA_STRUCTURES'
4399    and object_type_to='PA_TASKS'
4400    connect by prior object_id_from1 = object_id_to1
4401    start with object_id_to1 = p_element_version_id
4402           and relationship_type = 'S');
4403 
4404 
4405 /*
4406       intersect
4407    select a.object_id_to1
4408    from pa_object_relationships a, pa_proj_element_versions b
4409    where b.element_version_id = p_element_version_id
4410    and b.parent_structure_version_id = a.object_id_from1
4411    and a.relationship_type = 'S');
4412 */
4413 
4414    l_top_task_ver_id NUMBER := p_element_version_id;
4415    l_top_task_id NUMBER;
4416 
4417 begin
4418    OPEN c1(p_element_version_id);
4419    FETCH c1 INTO l_top_task_id;
4420    CLOSE c1;
4421 
4422    return l_top_task_id;
4423 exception
4424    when others then
4425      return(SQLCODE);
4426 end GET_TOP_TASK_ID;
4427 
4428 /* 4156732 : This API returns Task Level for Workplan Tasks
4429  */
4430 function GET_TASK_LEVEL(p_element_version_id IN number) return varchar2
4431 is
4432    cursor C1 (evid number) is
4433    select 1
4434    from pa_object_relationships
4435    where object_id_to1 = evid
4436    and relationship_type='S'
4437    and object_type_from='PA_STRUCTURES';
4438 
4439    cursor C2 (evid number) is
4440    select 1
4441    from pa_object_relationships
4442    where object_id_from1 = evid
4443    and relationship_type='S';
4444 
4445    c1rec C1%ROWTYPE;
4446    c2rec C2%ROWTYPE;
4447 
4448    l_tasks_above NUMBER :=0;
4449    l_tasks_below NUMBER :=0;
4450 
4451    l_task_level VARCHAR2(1) :='L';
4452 
4453    l_dummy NUMBER;
4454 
4455    CURSOR c3(evid NUMBER) IS
4456    select 1 from pa_proj_element_versions
4457    where element_version_id = evid
4458    and object_type = 'PA_STRUCTURES';
4459 
4460 begin
4461    OPEN c3(p_element_version_id);
4462    FETCH c3 into l_dummy;
4463    IF C3%FOUND THEN --it is a structure, return T or L
4464      OPEN c2(p_element_version_id);
4465      FETCH c2 into l_dummy;
4466      IF C2%FOUND THEN
4467        --it has child
4468        l_task_level := 'T';
4469      END IF;
4470      CLOSE c2;
4471      CLOSE c3;
4472      return l_task_level;
4473    END IF;
4474    CLOSE c3;
4475 
4476    OPEN C1(p_element_version_id);
4477    FETCH c1 into l_dummy;
4478    IF c1%found THEN
4479       l_task_level := 'T';
4480       CLOSE c1;
4481       OPEN c2(p_element_version_id);
4482       FETCH c2 into l_dummy;
4483       IF c2%NOTFOUND THEN
4484         l_task_level := 'L';
4485       END IF;
4486       CLOSE c2;
4487       return l_task_level;
4488    END IF;
4489    CLOSE c1;
4490 
4491    OPEN C2(p_element_version_id);
4492    FETCH c2 into l_dummy;
4493    IF c2%found THEN
4494       l_task_level := 'M';
4495       CLOSE c2;
4496       return l_task_level;
4497    END IF;
4498    CLOSE c2;
4499 
4500    return l_task_level;
4501 exception
4502    when others then
4503      return(SQLERRM);
4504 end GET_TASK_LEVEL;
4505 
4506 /* Created by avaithia for Bug 4156732
4507    This API (over-ridden GET_TASK_LEVEL API) which takes the following two parameters
4508    gives the Task Level of Financial Tasks.
4509 
4510    API Name      : GET_TASK_LEVEL
4511 
4512    Parameters             Description       Type Of Parameter
4513    ==========             ===============   ===================
4514    p_project_id           The Project ID    PA_PROJECTS_ALL.PROJECT_ID%TYPE
4515    p_proj_element_id      The ProjElementID PA_PROJ_ELEMENT_VERSIONS.PROJ_ELEMENT_ID%TYPE
4516 
4517    Return Value of this function :
4518    ===============================
4519    'T' -> Top Task , 'M' -> Middle Task , 'L' -> Lowest Task , 'X' -> Not Financial Task
4520 
4521     Note that it is very much possible that (say) the case of Partially Shared Structures,
4522     Some of the tasks may be both workplan and financial tasks,whereas some tasks are only workplan tasks.
4523 
4524     In this case,There will not be any entry for those 'pure' workplan tasks in PA_TASKS table.
4525     Hence,for such passed Proj_element_id's this API will return 'X'
4526 */
4527 FUNCTION GET_TASK_LEVEL(p_project_id   PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4528                         p_proj_element_id PA_PROJ_ELEMENT_VERSIONS.PROJ_ELEMENT_ID%TYPE) RETURN VARCHAR2
4529 IS
4530    l_task_level VARCHAR2(1) :='L';
4531 
4532    l_dummy NUMBER;
4533    l_parent_task NUMBER;
4534    l_mid_task NUMBER;
4535 
4536    CURSOR c_task_exists
4537    IS
4538    select 1
4539    from pa_tasks
4540    where task_id = p_proj_element_id
4541      and project_id = p_project_id
4542    ;
4543 
4544    CURSOR c_is_parent_task
4545    IS
4546    select 1
4547    from dual
4548    where exists
4549    (select 1
4550       from pa_tasks
4551      where nvl(parent_task_id,-9999) = p_proj_element_id
4552        and project_id = p_project_id
4553     ) ;
4554 
4555    CURSOR c_is_mid_task
4556    IS
4557    select 1 from pa_tasks
4558     where parent_task_id is not null
4559       and task_id = p_proj_element_id ;
4560 
4561 BEGIN
4562 
4563 OPEN c_task_exists;
4564 FETCH c_task_exists INTO l_dummy ;
4565 CLOSE c_task_exists;
4566 
4567 IF nvl(l_dummy,0) = 0
4568 THEN
4569 return 'X' ; -- as the task doesnt exist in PA_TASKS table
4570 END IF;
4571 
4572 --At this point the task exists
4573 
4574 OPEN c_is_parent_task ;
4575 FETCH c_is_parent_task INTO l_parent_task;
4576 CLOSE c_is_parent_task;
4577 
4578 IF nvl(l_parent_task,0) = 0
4579 THEN
4580 return 'L' ; -- as the task is not parent of any other task,(i.e) No Children ,Hence it is the lowest task
4581 END IF;
4582 
4583 -- At this point ,The Task exists and it has children ,So it can be a top task or a mid task
4584 
4585 OPEN c_is_mid_task ;
4586 FETCH c_is_mid_task INTO l_mid_task;
4587 CLOSE c_is_mid_task ;
4588 
4589 IF nvl(l_mid_task,0) = 0
4590 THEN
4591 return 'T' ; -- as the task exists and its parent_task_id is null => It has no parent,hence the top most task
4592 END IF;
4593 
4594 -- At this point ,The Task exists and it has children as well as a parent task ,So this is a mid-task
4595 return 'M';
4596 
4597 exception
4598    when others then
4599    return (SQLERRM);
4600 
4601 END GET_TASK_LEVEL ;
4602 
4603 --Begin Add sabansal
4604 --Function to check whether the given task is a workplan task or not
4605 FUNCTION CHECK_IS_WORKPLAN_TASK(p_project_id NUMBER,
4606                                 p_proj_element_id NUMBER) RETURN VARCHAR2
4607 IS
4608 str_sharing_code VARCHAR2(30):= null;
4609 return_flag      VARCHAR2(1) := null;
4610 
4611 BEGIN
4612 
4613 SELECT structure_sharing_code INTO str_sharing_code
4614 FROM pa_projects_all
4615 WHERE project_id = p_project_id;
4616 
4617 --If sharing is enabled, then financial and workplan tasks would be common
4618 IF str_sharing_code = 'SHARE_FULL' OR
4619    str_sharing_code = 'SHARE_PARTIAL' THEN
4620    return_flag := 'Y';
4621 ELSIF PA_PROJ_ELEMENTS_UTILS.CHECK_IS_FINANCIAL_TASK(p_proj_element_id) = 'N' THEN
4622    return_flag := 'Y';
4623  ELSE
4624    return_flag := 'N';
4625 END IF;
4626 
4627 return return_flag;
4628 EXCEPTION
4629   WHEN OTHERS THEN
4630     return null;
4631 END CHECK_IS_WORKPLAN_TASK;
4632 --End Add sabansal
4633 
4634 function GET_PARENT_TASK_ID(p_element_version_id IN number) return number
4635 is
4636    CURSOR c1 IS
4637    SELECT proj_element_id
4638    FROM pa_object_relationships, pa_proj_element_versions
4639    WHERE object_id_to1  = p_element_version_id
4640    AND object_type_from='PA_TASKS'
4641    AND object_id_from1 = element_version_id
4642    AND relationship_type = 'S'; -- added for bug 16170622 to eliminate 'D' dependency records
4643 
4644    l_parent_task_id NUMBER := NULL;
4645 begin
4646    OPEN c1;
4647    FETCH c1 into l_parent_task_id;
4648    CLOSE c1;
4649 
4650    return l_parent_task_id;
4651 exception
4652    when others then
4653      return(SQLCODE);
4654 end GET_PARENT_TASK_ID;
4655 
4656 function GET_PARENT_TASK_VERSION_ID(p_element_version_id IN number) return number
4657 is
4658    l_parent_task_id NUMBER := NULL;
4659    l_parent_task_version_id NUMBER := NULL;
4660 
4661 
4662    CURSOR c1 IS
4663    SELECT object_id_from1
4664    FROM pa_object_relationships
4665    WHERE object_id_to1  = p_element_version_id
4666    AND object_type_from='PA_TASKS'
4667    AND relationship_type = 'S';
4668 
4669 begin
4670    OPEN c1;
4671    FETCH c1 into l_parent_task_version_id;
4672    CLOSE c1;
4673    return l_parent_task_version_id;
4674 exception
4675    when others then
4676      return(SQLCODE);
4677 end GET_PARENT_TASK_VERSION_ID;
4678 
4679 function GET_TASK_VERSION_ID(
4680     p_structure_version_id  IN NUMBER
4681     ,p_task_id          IN NUMBER) return NUMBER
4682 is
4683    l_task_version_id NUMBER;
4684 begin
4685   select b.element_version_id into l_task_version_id from pa_proj_elements a, pa_proj_element_versions b
4686   where  a.proj_element_id = b.proj_element_id
4687   and    a.proj_element_id = p_task_id
4688   and    b.parent_structure_version_id = p_structure_version_id;
4689 
4690   return l_task_version_id;
4691 exception
4692    when others then
4693 --     return(SQLCODE);
4694      return to_number(NULL);   --Bug 3646375
4695 end GET_TASK_VERSION_ID;
4696 
4697 function GET_RELATIONSHIP_ID(
4698     p_object_id_from1  IN NUMBER
4699     ,p_object_id_to1   IN NUMBER) return NUMBER
4700 is
4701    l_relationship_id NUMBER;
4702 begin
4703    select object_relationship_id into l_relationship_id from pa_object_relationships
4704    where object_id_from1 = p_object_id_from1
4705    and   object_id_to1 = p_object_id_to1
4706    and   relationship_type = 'D';
4707 
4708    return l_relationship_id;
4709 exception
4710    when others then
4711 --     return(SQLCODE);
4712      return to_number(NULL);   --Bug 3646375
4713 end GET_RELATIONSHIP_ID;
4714 
4715 FUNCTION check_task_parents_deliv(p_element_version_id IN number)
4716 RETURN VARCHAR2
4717 IS
4718 --
4719    CURSOR cur_check_deliv (cp_task_version_id number) IS
4720    SELECT ppe.proj_element_id,ppe.base_percent_comp_deriv_code
4721      FROM pa_proj_element_versions ppev,
4722           pa_proj_elements ppe
4723     WHERE ppe.project_id = ppev.project_id
4724       AND ppe.proj_element_id = ppev.proj_element_id
4725       AND ppev.object_type = 'PA_TASKS'
4726       AND ppe.object_type = 'PA_TASKS'
4727       AND ppev.element_version_id IN (
4728                      SELECT object_id_to1
4729                        FROM pa_object_relationships
4730                       WHERE relationship_type = 'S'
4731                  START WITH object_id_to1 = cp_task_version_id --24628
4732                         AND object_type_to = 'PA_TASKS'
4733                         and relationship_type = 'S'
4734            CONNECT BY PRIOR object_id_from1 = object_id_to1
4735                   AND PRIOR object_type_from = object_type_to
4736                   AND PRIOR relationship_type = relationship_type);
4737 --
4738    cur_check_deliv_rec cur_check_deliv%ROWTYPE;
4739 --
4740 --   l_err_msg VARCHAR2(80) :=NULL;
4741    l_err_msg VARCHAR2(1) :='N';  --Bug 3475920
4742 --
4743 BEGIN
4744     OPEN cur_check_deliv(p_element_version_id);
4745     LOOP
4746        FETCH cur_check_deliv INTO cur_check_deliv_rec;
4747        EXIT WHEN cur_check_deliv%NOTFOUND;
4748        IF cur_check_deliv_rec.base_percent_comp_deriv_code LIKE 'DELIVERABLE' THEN
4749           l_err_msg := 'Y';
4750       EXIT;
4751        END IF;
4752     END LOOP;
4753     RETURN l_err_msg;
4754 EXCEPTION
4755     WHEN OTHERS THEN
4756        RETURN(SQLERRM);
4757 END check_task_parents_deliv;
4758 
4759 --Can be used for update, indent, Move task
4760 FUNCTION check_deliv_in_hierarchy(p_element_version_id IN number,
4761                                 p_target_element_version_id IN number)
4762 RETURN VARCHAR2
4763 IS
4764    CURSOR cur_check_deliv_bt (cp_target_task_version_id number) IS
4765    SELECT ppe.proj_element_id,ppe.base_percent_comp_deriv_code, ppev.element_version_id
4766      FROM pa_proj_element_versions ppev,
4767           pa_proj_elements ppe
4768     WHERE ppe.project_id = ppev.project_id
4769       AND ppe.proj_element_id = ppev.proj_element_id
4770       AND ppev.object_type = 'PA_TASKS'
4771       AND ppe.object_type = 'PA_TASKS'
4772       AND ppev.element_version_id IN (
4773                      SELECT object_id_to1
4774                        FROM pa_object_relationships
4775                       WHERE relationship_type = 'S'
4776                  START WITH object_id_to1 = cp_target_task_version_id
4777                         AND object_type_to = 'PA_TASKS'
4778                         and relationship_type = 'S'
4779            CONNECT BY PRIOR object_id_from1 = object_id_to1
4780                   AND PRIOR object_type_from = object_type_to
4781                   AND PRIOR RELATIONSHIP_TYPE = RELATIONSHIP_TYPE);
4782 
4783    CURSOR cur_check_deliv_tb (cp_task_version_id number) IS
4784    SELECT ppe.proj_element_id,ppe.base_percent_comp_deriv_code, ppev.element_version_id
4785      FROM pa_proj_element_versions ppev,
4786           pa_proj_elements ppe
4787     WHERE ppe.project_id = ppev.project_id
4788       AND ppe.proj_element_id = ppev.proj_element_id
4789       AND ppev.object_type = 'PA_TASKS'
4790       AND ppe.object_type = 'PA_TASKS'
4791       AND ppev.element_version_id IN (
4792                      SELECT object_id_to1
4793                        FROM pa_object_relationships
4794                       WHERE relationship_type = 'S'
4795                  START WITH object_id_to1 = cp_task_version_id
4796                         AND object_type_to = 'PA_TASKS'
4797                         and relationship_type = 'S'
4798                  CONNECT BY object_id_from1 = prior object_id_to1
4799                         AND object_type_from = prior object_type_to
4800                         AND PRIOR RELATIONSHIP_TYPE = RELATIONSHIP_TYPE);
4801 
4802    cur_check_deliv_bt_rec cur_check_deliv_bt%ROWTYPE;
4803    cur_check_deliv_tb_rec cur_check_deliv_tb%ROWTYPE;
4804 --   l_err_msg VARCHAR2(80) :=NULL;
4805    l_err_msg VARCHAR2(1) :='N';  --Bug 3475920
4806    l_cnt_no_del_in_branch NUMBER:=0;
4807 BEGIN
4808     FOR cur_check_deliv_bt_rec in cur_check_deliv_bt(p_target_element_version_id)
4809     LOOP
4810        IF cur_check_deliv_bt_rec.base_percent_comp_deriv_code LIKE 'DELIVERABLE' THEN
4811           l_cnt_no_del_in_branch := l_cnt_no_del_in_branch + 1;
4812           EXIT;
4813        END IF;
4814     END LOOP;
4815 --
4816     FOR cur_check_deliv_tb_rec in cur_check_deliv_tb(p_element_version_id)
4817     LOOP
4818         IF cur_check_deliv_tb_rec.base_percent_comp_deriv_code LIKE 'DELIVERABLE' THEN
4819            l_cnt_no_del_in_branch := l_cnt_no_del_in_branch + 1;
4820        EXIT;
4821         END IF;
4822     END LOOP;
4823 --
4824 --    IF l_cnt_no_del_in_branch > 2 AND (p_element_version_id = p_target_element_version_id) THEN
4825     IF l_cnt_no_del_in_branch >= 2 AND (p_element_version_id = p_target_element_version_id) THEN
4826           l_err_msg:= 'Y';
4827     ELSIF l_cnt_no_del_in_branch > 1 AND (p_element_version_id <> p_target_element_version_id) THEN
4828        l_err_msg:= 'Y';
4829     END IF;
4830     RETURN l_err_msg;
4831 EXCEPTION
4832    WHEN OTHERS THEN
4833      RETURN(SQLERRM);
4834 END check_deliv_in_hierarchy;
4835 --
4836 FUNCTION check_sharedstruct_deliv(p_element_version_id IN number)
4837 RETURN VARCHAR2
4838 IS
4839     /* This cursor get all the leaf nodes for a given structure*/
4840     CURSOR get_leaf_node_cur(cp_structure_elem_id NUMBER) IS
4841     SELECT object_id_to1
4842       FROM pa_proj_element_versions ppev,
4843            pa_object_relationships rel1
4844      WHERE ppev.parent_structure_version_id = cp_structure_elem_id --19671
4845        AND rel1.relationship_type = 'S'
4846        AND ppev.element_version_id = rel1.object_id_to1
4847        AND NOT EXISTS (SELECT 'XYZ'
4848                          FROM pa_object_relationships rel2
4849                         WHERE rel2.object_id_from1 = rel1.object_id_to1);
4850     get_leaf_node_rec get_leaf_node_cur%ROWTYPE;
4851 
4852     /* This cursor goes from leaf node to top of the branch*/
4853     CURSOR check_for_deliv_cur (cp_task_version_id number) IS
4854     SELECT ppe.proj_element_id,ppe.base_percent_comp_deriv_code
4855       FROM pa_proj_element_versions ppev,
4856            pa_proj_elements ppe
4857      WHERE ppe.project_id = ppev.project_id
4858        AND ppe.proj_element_id = ppev.proj_element_id
4859        AND ppev.object_type = 'PA_TASKS'
4860        AND ppe.object_type = 'PA_TASKS'
4861        AND ppev.element_version_id IN (
4862                       SELECT object_id_to1
4863                         FROM pa_object_relationships
4864                        WHERE relationship_type = 'S'
4865                   START WITH object_id_to1 = cp_task_version_id --24628
4866                          AND object_type_to = 'PA_TASKS'
4867                          and relationship_type = 'S'
4868             CONNECT BY PRIOR object_id_from1 = object_id_to1
4869                    AND PRIOR object_type_from = object_type_to
4870                    AND PRIOR RELATIONSHIP_TYPE = RELATIONSHIP_TYPE);
4871     check_for_deliv_rec check_for_deliv_cur%ROWTYPE;
4872     branch_deliv_count NUMBER:=0;
4873     l_err_msg VARCHAR2(1) :='N';
4874 BEGIN
4875 --    OPEN get_leaf_node_cur(p_structure_elem_id);
4876     OPEN get_leaf_node_cur(p_element_version_id);
4877     LOOP
4878         FETCH get_leaf_node_cur INTO get_leaf_node_rec;
4879         EXIT WHEN get_leaf_node_cur%NOTFOUND;
4880 --
4881         IF branch_deliv_count = 2 THEN
4882            EXIT;
4883         END IF;
4884 --
4885         OPEN check_for_deliv_cur(get_leaf_node_rec.object_id_to1);
4886         LOOP
4887             FETCH check_for_deliv_cur INTO check_for_deliv_rec;
4888         IF check_for_deliv_cur%NOTFOUND THEN
4889                IF branch_deliv_count < 2 THEN
4890                   branch_deliv_count:=0;
4891                END IF;
4892                EXIT;
4893             END IF;
4894 --
4895             IF check_for_deliv_rec.base_percent_comp_deriv_code LIKE 'DELIVERABLE' THEN
4896                branch_deliv_count := branch_deliv_count + 1;
4897             END IF;
4898             IF branch_deliv_count = 2 THEN
4899                l_err_msg := 'Y';
4900                EXIT;
4901             END IF;
4902 --
4903         END LOOP; --End loop for check_for_deliv_cur cursor
4904         CLOSE check_for_deliv_cur;
4905 --
4906     END LOOP; --End loop for get_leaf_node_cur cursor
4907     CLOSE get_leaf_node_cur;
4908 --
4909     RETURN l_err_msg;
4910 --
4911 EXCEPTION
4912    WHEN OTHERS THEN
4913      RETURN(SQLERRM);
4914 END check_sharedstruct_deliv;
4915 
4916 FUNCTION IS_WF_PROCESS_RUNNING(p_proj_element_id IN number)
4917 RETURN VARCHAR2
4918 IS
4919 CURSOR C
4920 IS
4921      SELECT 'Y'
4922        FROM pa_wf_processes pwp, pa_proj_elements ppe       -- Bug #3967939
4923       WHERE pwp.ENTITY_KEY2 = to_char(p_proj_element_id)    -- Bug#3619754 : Added to_char
4924       AND ppe.PROJ_ELEMENT_ID = p_proj_element_id       -- Bug #3967939
4925       AND pwp.ITEM_TYPE = ppe.WF_ITEM_TYPE;         -- Bug #3967939
4926 
4927 l_dummy VARCHAR2(1) := 'N' ;
4928 BEGIN
4929      OPEN C;
4930      FETCH C INTO l_dummy ;
4931      IF C%NOTFOUND THEN
4932       l_dummy := 'N' ;
4933      END IF;
4934      CLOSE C;
4935      return l_dummy ;
4936 EXCEPTION
4937 WHEN OTHERS THEN
4938    return 'N' ;
4939 END IS_WF_PROCESS_RUNNING ;
4940 
4941 FUNCTION GET_ELEMENT_WF_ITEMKEY(p_proj_element_id IN number,
4942  p_project_id IN number, p_wf_type_code IN VARCHAR2 := 'TASK_EXECUTION')
4943 RETURN VARCHAR2
4944 
4945 IS
4946 CURSOR C
4947 IS
4948       select max(item_key)
4949         from   pa_wf_processes wp
4950         ,      pa_proj_elements pe
4951         where  wp.item_type = pe.wf_item_type
4952         and  wp.wf_type_code = p_wf_type_code
4953         and  to_char(pe.proj_element_id) = wp.entity_key2 --Bug 3619754 Added By avaithia
4954         and  to_char(pe.project_id) = wp.entity_key1 --Bug 3619754 Added By avaithia
4955         and  pe.project_id = p_project_id and pe.proj_element_id =p_proj_element_id;
4956 
4957 l_item_key VARCHAR2(240) := '' ;
4958 BEGIN
4959      OPEN C;
4960      FETCH C INTO l_item_key ;
4961      CLOSE C;
4962      return l_item_key ;
4963 EXCEPTION
4964 WHEN OTHERS THEN
4965    return '' ;
4966 END GET_ELEMENT_WF_ITEMKEY;
4967 
4968 FUNCTION GET_ELEMENT_WF_STATUS(p_proj_element_id IN number,
4969  p_project_id IN number, p_wf_type_code IN VARCHAR2 := 'TASK_EXECUTION')
4970 RETURN VARCHAR2
4971 
4972 IS
4973 CURSOR c_item_type
4974 IS
4975       select wf_item_type
4976         from pa_proj_elements pe
4977         where
4978         pe.project_id = p_project_id and pe.proj_element_id =p_proj_element_id;
4979 
4980 l_status VARCHAR2(240)     := '';
4981 l_item_key VARCHAR2(240)   := '';
4982 l_wf_status VARCHAR2(240)  := '';
4983 l_item_type VARCHAR2(240)  := '';
4984 l_result VARCHAR2(240)     := '';
4985 
4986 BEGIN
4987 
4988   open c_item_type;
4989   FETCH c_item_type INTO l_item_type;
4990   CLOSE c_item_type;
4991 
4992   if ( l_item_type is not null) then -- Commented this for Bug 4249993 and l_item_type <> '') then
4993       l_item_key :=  GET_ELEMENT_WF_ITEMKEY(p_proj_element_id,
4994             p_project_id, p_wf_type_code);
4995 
4996       if (l_item_key is not null) then -- Commented this for Bug 4249993 and l_item_key <> '') then
4997             WF_ENGINE.ItemStatus
4998                   (l_item_type,
4999                    l_item_key,
5000                    l_status ,
5001                    l_result );
5002       end if;
5003   end if;
5004   return l_status;
5005 
5006 EXCEPTION
5007 WHEN OTHERS THEN
5008    return '' ;
5009 END GET_ELEMENT_WF_STATUS;
5010 
5011 -- Function             : check_fin_or_wp_structure
5012 -- Purpose              : Checks whether the passed proj_element_id record is a WP or FIN structure record
5013 -- Parameters                    Type      Required  Description and Purpose
5014 -- ---------------------------  ------     --------  --------------------------------------------------------
5015 -- p_proj_element_id             NUMBER        Y      The proj_element_id to be checked
5016 FUNCTION check_fin_or_wp_structure( p_proj_element_id IN NUMBER ) RETURN VARCHAR2 IS
5017     CURSOR cur_chk_fin_or_wp_structure IS
5018     SELECT 'Y'
5019     FROM   pa_proj_elements ppe
5020           ,pa_proj_structure_types ppst
5021           ,pa_structure_types pst
5022     WHERE  ppe.proj_element_id = p_proj_element_id
5023     AND    ppe.object_type = 'PA_STRUCTURES'
5024     AND    ppe.proj_element_id = ppst.proj_element_id
5025     AND    ppst.structure_type_id = pst.structure_type_id
5026     AND    pst.structure_type IN ('WORKPLAN','FINANCIAL') ;
5027 
5028     l_return_flag   VARCHAR2(1);
5029 BEGIN
5030     OPEN  cur_chk_fin_or_wp_structure;
5031     FETCH cur_chk_fin_or_wp_structure INTO l_return_flag;
5032     CLOSE cur_chk_fin_or_wp_structure;
5033 
5034     RETURN nvl(l_return_flag,'N');
5035 EXCEPTION
5036     WHEN OTHERS THEN
5037         RETURN '';
5038 END;
5039 
5040 FUNCTION CHECK_USER_VIEW_TASK_PRIVILEGE
5041 (
5042     p_project_id IN NUMBER
5043 )   RETURN VARCHAR2
5044 IS
5045 l_ret_code VARCHAR2(1) ;
5046 BEGIN
5047 l_ret_code := PA_SECURITY_PVT.check_user_privilege
5048                  ( p_privilege    => 'PA_PAXPREPR_OPT_WORKPLAN_STR_V'
5049                   ,p_object_name  => 'PA_PROJECTS'
5050                   ,p_object_key   => p_project_id
5051                   ) ;
5052 RETURN l_ret_code ;
5053 END CHECK_USER_VIEW_TASK_PRIVILEGE;
5054 --
5055 --
5056 function GET_SUB_TASK_VERSION_ID(p_task_version_id IN number) return number
5057 is
5058    l_sub_task_id NUMBER := NULL;
5059    l_sub_task_version_id NUMBER := NULL;
5060 --
5061 --
5062    CURSOR c1 IS
5063    SELECT object_id_to1
5064    FROM pa_object_relationships
5065    WHERE object_id_from1  = p_task_version_id
5066    AND object_type_to='PA_TASKS'
5067    AND relationship_type = 'S';
5068 --
5069 begin
5070    OPEN c1;
5071    FETCH c1 into l_sub_task_version_id;
5072    CLOSE c1;
5073    return l_sub_task_version_id;
5074 exception
5075    when others then
5076      return(SQLCODE);
5077 end GET_SUB_TASK_VERSION_ID;
5078 --
5079 --
5080 FUNCTION check_deliv_in_hie_upd(p_task_version_id IN number)
5081 RETURN NUMBER
5082 IS
5083    CURSOR cur_check_deliv_bt (cp_target_task_version_id number) IS
5084    SELECT ppe.proj_element_id,ppe.base_percent_comp_deriv_code, ppev.element_version_id
5085      FROM pa_proj_element_versions ppev,
5086           pa_proj_elements ppe
5087     WHERE ppe.project_id = ppev.project_id
5088       AND ppe.proj_element_id = ppev.proj_element_id
5089       AND ppev.object_type = 'PA_TASKS'
5090       AND ppe.object_type = 'PA_TASKS'
5091       AND ppev.element_version_id IN (
5092                      SELECT object_id_to1
5093                        FROM pa_object_relationships
5094                       WHERE relationship_type = 'S'
5095                  START WITH object_id_to1 = cp_target_task_version_id
5096                         AND object_type_to = 'PA_TASKS'
5097                         and relationship_type = 'S'
5098            CONNECT BY PRIOR object_id_from1 = object_id_to1
5099                   AND PRIOR object_type_from = object_type_to
5100                   AND PRIOR relationship_type = RELATIONSHIP_TYPE);
5101 
5102    CURSOR cur_check_deliv_tb (cp_task_version_id number) IS
5103    SELECT ppe.proj_element_id,ppe.base_percent_comp_deriv_code, ppev.element_version_id
5104      FROM pa_proj_element_versions ppev,
5105           pa_proj_elements ppe
5106     WHERE ppe.project_id = ppev.project_id
5107       AND ppe.proj_element_id = ppev.proj_element_id
5108       AND ppev.object_type = 'PA_TASKS'
5109       AND ppe.object_type = 'PA_TASKS'
5110       AND ppev.element_version_id IN (
5111                      SELECT object_id_to1
5112                        FROM pa_object_relationships
5113                       WHERE relationship_type = 'S'
5114                  START WITH object_id_to1 = cp_task_version_id
5115                         AND object_type_to = 'PA_TASKS'
5116                         and relationship_type = 'S'
5117                  CONNECT BY object_id_from1 = prior object_id_to1
5118                         AND object_type_from = prior object_type_to
5119                         AND PRIOR relationship_type = RELATIONSHIP_TYPE);
5120 
5121    cur_check_deliv_bt_rec cur_check_deliv_bt%ROWTYPE;
5122    cur_check_deliv_tb_rec cur_check_deliv_tb%ROWTYPE;
5123 --   l_err_msg VARCHAR2(80) :=NULL;
5124    l_err_msg VARCHAR2(1) :='N';  --Bug 3475920
5125    l_cnt_no_del_in_branch NUMBER:=0;
5126    l_parent_task_ver_id  NUMBER:=NULL;
5127    l_sub_task_ver_id  NUMBER:=NULL;
5128 BEGIN
5129 --
5130     l_parent_task_ver_id:=GET_PARENT_TASK_VERSION_ID(p_task_version_id);
5131     l_sub_task_ver_id:=GET_SUB_TASK_VERSION_ID(p_task_version_id);
5132 --
5133     IF l_parent_task_ver_id IS NOT NULL THEN
5134        FOR cur_check_deliv_bt_rec in cur_check_deliv_bt(l_parent_task_ver_id)
5135        LOOP
5136            IF cur_check_deliv_bt_rec.base_percent_comp_deriv_code LIKE 'DELIVERABLE' THEN
5137               l_cnt_no_del_in_branch := l_cnt_no_del_in_branch + 1;
5138               EXIT;
5139            END IF;
5140        END LOOP;
5141     END IF;
5142 --
5143     IF l_sub_task_ver_id IS NOT NULL THEN
5144        FOR cur_check_deliv_tb_rec in cur_check_deliv_tb(l_sub_task_ver_id)
5145        LOOP
5146            IF cur_check_deliv_tb_rec.base_percent_comp_deriv_code LIKE 'DELIVERABLE' THEN
5147               l_cnt_no_del_in_branch := l_cnt_no_del_in_branch + 1;
5148               EXIT;
5149            END IF;
5150        END LOOP;
5151     END IF;
5152 --
5153     RETURN l_cnt_no_del_in_branch;
5154 EXCEPTION
5155    WHEN OTHERS THEN
5156      RETURN(SQLERRM);
5157 END check_deliv_in_hie_upd;
5158 --
5159 --
5160 --  FUNCTION           check_pa_lookup_exists
5161 --  PURPOSE            Checks whether the passed lookup_code and value are valid
5162 --  RETURN VALUE       VARCHAR2 - 'Y' if the valid
5163 --                                'N' otherwise.
5164 --
5165 Function check_pa_lookup_exists(p_lookup_type VARCHAR2,
5166                                 p_lookup_code VARCHAR2)
5167 RETURN VARCHAR2
5168 IS
5169    CURSOR chk_lkp(cp_lookup_type VARCHAR2, cp_lookup_code VARCHAR2)
5170    IS
5171    SELECT 'Y'
5172      FROM pa_lookups
5173     WHERE lookup_type = cp_lookup_type
5174       AND lookup_code = cp_lookup_code;
5175    l_dummy varchar2(1):='Y';
5176 BEGIN
5177 --
5178     OPEN chk_lkp(p_lookup_type,p_lookup_code);
5179     FETCH chk_lkp INTO l_dummy;
5180 --
5181     IF chk_lkp%NOTFOUND THEN
5182        l_dummy:= 'N';
5183     END IF;
5184 --
5185     CLOSE chk_lkp;
5186 --
5187     RETURN l_dummy;
5188 --
5189 END check_pa_lookup_exists;
5190 --
5191 --
5192 
5193 function GET_TASK_ID(
5194     p_project_id  IN NUMBER
5195     ,p_structure_version_id  IN NUMBER
5196     ,p_task_version_id          IN NUMBER) return NUMBER
5197 IS
5198    l_task_id NUMBER;
5199 begin
5200   select b.proj_element_id into l_task_id
5201     from pa_proj_element_versions b
5202   where  b.element_version_id = p_task_version_id
5203   and    b.project_id = p_project_id
5204   and    b.parent_structure_version_id = p_structure_version_id;
5205 
5206   return l_task_id;
5207 exception
5208    when others then
5209      return to_number(NULL);
5210 end GET_TASK_ID;
5211 
5212 -- Begin fix for Bug # 4237838.
5213 
5214 function is_lowest_level_fin_task(p_project_id NUMBER
5215 				  , p_task_version_id NUMBER
5216 				  , p_include_sub_proj_flag VARCHAR2 := 'Y') -- Fix for Bug # 4290042.
5217 return VARCHAR2
5218 is
5219 
5220 	cursor cur_fin_task(c_project_id NUMBER
5221 			    , c_task_version_id NUMBER)
5222 	is
5223 	select ppev.financial_task_flag
5224 	from pa_proj_element_versions ppev
5225 	where ppev.project_id = c_project_id
5226 	and ppev.element_version_id = c_task_version_id;
5227 
5228 	l_financial_task_flag	VARCHAR2(1) := null;
5229 
5230 	cursor cur_lowest_level_fin_task (c_project_id NUMBER
5231 					  , c_task_version_id NUMBER
5232 					  , c_include_sub_proj_flag VARCHAR2) -- Fix for Bug # 4290042.
5233 	is
5234 	-- This query checks if the task version has a financial sub-task.
5235         select 'N'
5236         from pa_object_relationships por1, pa_proj_element_versions ppev1
5237         where por1.object_id_to1 = ppev1.element_version_id
5238         and por1.relationship_type = 'S'
5239 	and ppev1.project_id = c_project_id
5240         and por1.object_id_from1 = c_task_version_id
5241 	and ppev1.financial_task_flag = 'Y'
5242 	union all
5243 	-- This query checks if the task version has a linking sub-task that has a financial link to
5244 	-- a sub-project if the input p_include_sub_proj_flag = 'Y'.
5245         select 'N'
5246         from pa_object_relationships por2, pa_proj_element_versions ppev2
5247         where por2.object_id_to1 = ppev2.element_version_id
5248         and por2.relationship_type = 'S'
5249         and ppev2.project_id = c_project_id
5250         and por2.object_id_from1 = c_task_version_id
5251         and exists (select 'Y'
5252 		    from pa_object_relationships por3
5253 		    where por3.object_id_from1 = ppev2.element_version_id
5254 		    and por3.object_id_from2 = ppev2.project_id
5255 		    and por3.relationship_type = 'LF')
5256 	and c_include_sub_proj_flag = 'Y'; -- Fix for Bug # 4290042.
5257 
5258 
5259 	l_lowest_level_fin_task VARCHAR2(1) := null;
5260 
5261 	l_return		VARCHAR2(1) := null;
5262 
5263 begin
5264 
5265 	l_return := 'Y';
5266 
5267 	-- Check if the Task is a Financial Task.
5268 
5269 	open cur_fin_task(p_project_id, p_task_version_id);
5270 
5271 	fetch cur_fin_task into l_financial_task_flag;
5272 
5273 	close cur_fin_task;
5274 
5275 	if l_financial_task_flag = 'N' then
5276 
5277 		l_return := 'N';
5278 
5279 	else
5280 
5281 
5282 		-- Check if the Financial Task is a Lowest Level Financial Task.
5283 
5284 
5285 		open cur_lowest_level_fin_task (p_project_id, p_task_version_id, p_include_sub_proj_flag);
5286 										-- Fix for Bug # 4290042.
5287 
5288 		fetch cur_lowest_level_fin_task into l_lowest_level_fin_task;
5289 
5290 		if cur_lowest_level_fin_task%FOUND then
5291 
5292 			l_return := 'N';
5293 
5294 		end if;
5295 
5296 		close cur_lowest_level_fin_task;
5297 
5298 	end if;
5299 
5300 	return(l_return);
5301 
5302 end is_lowest_level_fin_task;
5303 
5304 -- End fix for Bug # 4237838.
5305 
5306 -- Bug 4667361: Added this Function
5307 FUNCTION WP_STR_EXISTS_FOR_UPG
5308 (
5309   p_project_id                       IN NUMBER
5310  ) RETURN VARCHAR2 IS
5311    l_return_value  VARCHAR2(1) := 'N';
5312    l_dummy_char  VARCHAR2(1) := 'N';
5313 
5314   CURSOR cur_pa_proj
5315   IS
5316 
5317     SELECT 'x'
5318       FROM pa_proj_elements ppe, pa_proj_structure_types ppst
5319      WHERE ppe.project_id = p_project_id
5320        AND ppe.object_type = 'PA_STRUCTURES'
5321        AND ppe.proj_element_id = ppst.proj_element_id
5322        AND ppst.structure_type_id = 1;  --'WORKPLAN'
5323 
5324 BEGIN
5325 
5326     open cur_pa_proj;
5327     fetch cur_pa_proj INTO l_dummy_char;
5328     IF cur_pa_proj%FOUND
5329     THEN
5330         l_return_value  := 'Y';
5331     ELSE
5332         l_return_value  := 'N';
5333     END IF;
5334     CLOSE cur_pa_proj;
5335 
5336     RETURN ( NVL( l_return_value, 'N' ) );
5337 
5338 END WP_STR_EXISTS_FOR_UPG;
5339 
5340 -- Bug 4667361: Added this Function
5341 FUNCTION CHECK_SHARING_ENABLED_FOR_UPG
5342   (  p_project_id IN NUMBER
5343   ) return VARCHAR2
5344   IS
5345     CURSOR c1 IS
5346     SELECT 'Y'
5347     FROM pa_proj_elements a,
5348          pa_proj_structure_types b,
5349          pa_structure_types c,
5350          pa_proj_structure_types d,
5351          pa_structure_types e
5352     WHERE c.structure_type_class_code = 'WORKPLAN'
5353     AND   e.structure_type_class_code = 'FINANCIAL'
5354     AND   c.structure_type_id = b.structure_type_id
5355     AND   e.structure_type_id = d.structure_type_id
5356     AND   b.proj_element_id = a.proj_element_id
5357     AND   d.proj_element_id = a.proj_element_id
5358     AND   a.project_id = p_project_id;
5359 
5360     l_dummy VARCHAR2(1);
5361   BEGIN
5362     OPEN c1;
5363     FETCH c1 into l_dummy;
5364     IF c1%NOTFOUND THEN
5365       l_dummy := 'N';
5366     END IF;
5367     CLOSE c1;
5368     return l_dummy;
5369 
5370 END CHECK_SHARING_ENABLED_FOR_UPG;
5371 
5372 
5373 -- Procedure included for perf fix  4903460
5374 ---------------------------------------------
5375 -- Does the following validations :
5376 ---------------------------------------------
5377 -- Check if task has expenditure item
5378 -- Check if task has purchase order distribution
5379 -- Check if task has purchase order requisition
5380 -- Check if task has supplier invoices
5381 -- check if task has supplier invoice distribution
5382 -- Check if task has commitment transaction
5383 -- Check if task has compensation rule set
5384 -- Check if task has draft invoices
5385 -- Check if task has Project_customers
5386 
5387 PROCEDURE perform_task_validations
5388 (
5389  p_project_id     IN  NUMBER,
5390  p_task_id        IN  NUMBER,
5391  x_error_code     OUT NOCOPY NUMBER,
5392  x_error_msg_code OUT NOCOPY VARCHAR2
5393  )
5394 IS
5395 l_user_id               NUMBER;
5396 l_login_id              NUMBER;
5397 l_debug_mode            VARCHAR2(1);
5398 
5399 l_debug_level3          CONSTANT NUMBER := 3;
5400 l_debug_level5          CONSTANT NUMBER := 5;
5401 
5402 
5403 /*CURSOR c_tasks_in_hierarchy IS	--Commented the following cursor as this is not needed after perf bug fix Bug#4964992
5404 SELECT TASK_ID
5405 FROM   PA_TASKS
5406 CONNECT BY PRIOR TASK_ID = PARENT_TASK_ID
5407            AND PROJECT_ID = p_project_id
5408 START WITH TASK_ID = p_TASK_ID
5409            AND PROJECT_ID = p_project_id; */
5410 
5411 /*l_task_id_tbl SYSTEM.PA_NUM_TBL_TYPE := SYSTEM.PA_NUM_TBL_TYPE(); */	-- Commented this as this is no more needed after Bug#4964992  fix.
5412 l_dummy number:=0;
5413 l_task_tbl sub_task; --Added this for Bug#4964992.
5414 
5415 l_alt_task_Ids	  SYSTEM.pa_num_tbl_type := SYSTEM.PA_NUM_TBL_TYPE(); --bug#16461684
5416 l_valid_status_tbl     SYSTEM.PA_VARCHAR2_1_TBL_TYPE := SYSTEM.PA_VARCHAR2_1_TBL_TYPE(); --bug#16461684
5417 l_Cbs_Enabled	  VARCHAR2(1) := 'N';  -- bug#16461684
5418 l_alt_task_tbl sub_task; --bug#16461684
5419 l_tmp_task_tbl sub_task; --bug#16461684
5420 
5421 cursor alt_task_cur ( l_task_tbl sub_task ) is
5422                  select alt_task_id from pa_alternate_tasks,table(cast(l_task_tbl as sub_task)) st
5423 				 where proj_element_id =  st.task_id  ;
5424 
5425  BEGIN
5426          x_error_code := 0;
5427 	 x_error_msg_code := NULL ;
5428 
5429         l_user_id := fnd_global.user_id;
5430         l_login_id := fnd_global.login_id;
5431         l_debug_mode  := NVL(FND_PROFILE.value_specific('PA_DEBUG_MODE',l_user_id, l_login_id,275,null,null),'N');
5432 
5433         IF l_debug_mode = 'Y' THEN
5434         PA_DEBUG.set_curr_function( p_function   =>'PERFORM_TASK_VALIDATIONS' , p_debug_mode => l_debug_mode );
5435         END IF;
5436 
5437         IF l_debug_mode = 'Y' THEN
5438           Pa_Debug.g_err_stage:= 'TASK_VALIDATIONS : Printing Input parameters';
5439           Pa_Debug.WRITE('pa_proj_tsk_utils', Pa_Debug.g_err_stage ,l_debug_level3 );
5440           Pa_Debug.WRITE('pa_proj_tsk_utils', 'p_task_id'||':'||p_task_id , l_debug_level3);
5441         END IF;
5442 
5443 		l_Cbs_Enabled := PA_ALTERNATE_TASK_PVT.Is_Cbs_Enabled(p_Project_Id => p_project_id); -- bug#16461684
5444 
5445 	     /*OPEN  c_tasks_in_hierarchy;					-- Commented this for Bug#4964992
5446 	     FETCH c_tasks_in_hierarchy BULK COLLECT INTO   l_task_id_tbl;
5447 	     CLOSE c_tasks_in_hierarchy;*/
5448 
5449 	     l_task_tbl := get_task_hierarchy(p_project_id,p_task_id);   -- Added this call for Bug#4964992
5450 
5451 		 /* CBS enhancement bug#16461684*/
5452 		 l_tmp_task_tbl := l_task_tbl;
5453 
5454 		 IF l_Cbs_Enabled = 'Y' THEN
5455 			l_alt_task_tbl := get_Alt_task_List(p_project_id,p_task_id);
5456 		 END IF;
5457 
5458 	     IF nvl(l_task_tbl.COUNT,0)>0 THEN
5459 		  /*FOR i IN  l_task_id_tbl.FIRST..l_task_id_tbl.LAST	--Commented by Sunkalya for perf fix Bug#4964992
5460 		  LOOP */
5461 
5462 		  /* CBS enhancement bug#16461684*/
5463 		  IF l_Cbs_Enabled = 'Y' THEN
5464 			  open alt_task_cur ( l_task_tbl );
5465 					  fetch alt_task_cur
5466 					   bulk collect
5467 					   into l_alt_task_Ids;
5468 			  close alt_task_cur;
5469 			  IF (l_alt_task_Ids.COUNT > 0) THEN
5470 				  PA_ALTERNATE_TASK_PVT.Validate_Del_Alt_Tasks(
5471 					p_Alt_Task_Id  => l_alt_task_Ids,
5472 					p_context 	   => 'TASK',
5473 					X_Valid_Status	   => l_valid_status_tbl
5474 					);
5475 				  FOR i IN l_alt_task_Ids.FIRST .. l_alt_task_Ids.LAST LOOP
5476 					IF l_valid_status_tbl(i) <> 'V' THEN  -- Delete records which are in-valid
5477 					 x_error_code :=49;
5478 					 x_error_msg_code := 'PA_CBS_ALT_TSK_USED';
5479 					 return;
5480 
5481 					END IF;
5482 
5483 				  END LOOP;
5484 			  END IF;
5485 		  END IF;
5486 
5487 
5488 			--Check if task has expenditure item
5489 			BEGIN
5490 
5491 				l_dummy := 0;
5492 				/*   commented for 16844815
5493 				IF l_Cbs_Enabled = 'Y' THEN -- CBS enhancement bug#16461684
5494 					SELECT
5495 					  1 into l_dummy
5496 					FROM
5497 					  sys.dual
5498 					WHERE
5499 					  exists (SELECT NULL
5500 								FROM   PA_EXPENDITURE_ITEMS_all  pei,table(cast(l_alt_task_tbl as sub_task)) st   --Changed the query for Bug#4964992
5501 							   WHERE  pei.TASK_ID = st.task_id)
5502 					   or exists (SELECT NULL
5503 									  FROM    PA_EI_DENORM ped, table(cast(l_task_tbl as sub_task)) st
5504 									  WHERE   ped.TASK_ID = st.task_id);
5505 				ELSE */
5506 					SELECT
5507 					  1 into l_dummy
5508 					FROM
5509 					  sys.dual
5510 					WHERE
5511 					  exists (SELECT NULL
5512 								FROM   PA_EXPENDITURE_ITEMS_all  pei,table(cast(l_task_tbl as sub_task)) st   --Changed the query for Bug#4964992
5513 							   WHERE  pei.TASK_ID = st.task_id)
5514 					   or exists (SELECT NULL
5515 									  FROM    PA_EI_DENORM ped, table(cast(l_task_tbl as sub_task)) st
5516 									  WHERE   ped.TASK_ID = st.task_id);
5517 				--END IF; commented for 16844815
5518 				IF l_dummy = 1 THEN
5519 					x_error_code :=50;
5520 					x_error_msg_code := 'PA_TSK_EXP_ITEM_EXIST';
5521 					return;
5522 				END IF;
5523 
5524 				EXCEPTION
5525 				  WHEN NO_DATA_FOUND THEN
5526 				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS : No Expenditure Items exist in the entire task hierarchy';
5527 					IF l_debug_mode = 'Y' THEN
5528 						Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5529 					END IF;
5530 				  WHEN OTHERS THEN
5531 				  x_error_code := SQLCODE;
5532 				  x_error_msg_code := substrb(SQLERRM,1,120);
5533   				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking Expenditure Items';
5534 
5535 				  IF l_debug_mode = 'Y' THEN
5536 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5537 				  END IF;
5538 				  return;
5539                         END;
5540 
5541 			-- Check if task has purchase order distribution
5542 			BEGIN
5543 				l_dummy := 0;
5544 
5545 				/* CBS enhancement bug#16461684*/
5546 				l_task_tbl := l_tmp_task_tbl;
5547 				IF l_Cbs_Enabled = 'Y' THEN
5548 					l_task_tbl := l_alt_task_tbl;
5549 				END IF;
5550                                 SELECT
5551                                   1 into l_dummy
5552                                 FROM
5553                                   sys.dual
5554                                 WHERE
5555                                   exists (SELECT NULL
5556                                             FROM   po_distributions_all poa, table(cast(l_task_tbl as sub_task)) st  	  --Changed the query for Bug#4964992
5557 					    where  poa.project_id = p_project_id
5558                                               AND  poa.TASK_ID = st.task_id);
5559 
5560                                 IF l_dummy = 1 THEN
5561                                         x_error_code :=60;
5562                                         x_error_msg_code := 'PA_TSK_PO_DIST_EXIST';
5563                                         return;
5564                                 END IF;
5565 
5566                                 EXCEPTION
5567                                   WHEN NO_DATA_FOUND THEN
5568                                         Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No purchase order distribution exist in the entire task hierarchy';
5569 					IF l_debug_mode = 'Y' THEN
5570                                                 Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5571                                         END IF;
5572                                   WHEN OTHERS THEN
5573                                   x_error_code := SQLCODE;
5574 				  x_error_msg_code := substrb(SQLERRM,1,120);
5575     				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking purchase order distribution';
5576 
5577 				  IF l_debug_mode = 'Y' THEN
5578 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5579 				  END IF;
5580 
5581 				  return;
5582                         END;
5583 
5584 			-- Check if task has purchase order requisition
5585 			BEGIN
5586 				l_dummy := 0;
5587 				/* CBS enhancement bug#16461684*/
5588 				l_task_tbl := l_tmp_task_tbl;
5589 				IF l_Cbs_Enabled = 'Y' THEN
5590 					l_task_tbl := l_alt_task_tbl;
5591 				END IF;
5592                                 SELECT
5593                                   1 into l_dummy
5594                                 FROM
5595                                   sys.dual
5596                                 WHERE
5597                                   exists (SELECT NULL
5598                                             FROM   po_req_distributions_all prd, table(cast(l_task_tbl as sub_task)) st		--Changed the query for Bug#4964992
5599                                             where  prd.project_id = p_project_id
5600                                               AND  prd.TASK_ID = st.task_id);
5601 
5602                                 IF l_dummy = 1 THEN
5603                                         x_error_code :=70;
5604                                         x_error_msg_code :='PA_TSK_PO_REQ_DIST_EXIST';
5605                                         return;
5606                                 END IF;
5607 
5608                                 EXCEPTION
5609                                   WHEN NO_DATA_FOUND THEN
5610 				  Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No purchase order requisition exist in the entire task hierarchy';
5611 					IF l_debug_mode = 'Y' THEN
5612                                                 Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5613                                         END IF;
5614                                   WHEN OTHERS THEN
5615                                   x_error_code := SQLCODE;
5616 				  x_error_msg_code := substrb(SQLERRM,1,120);
5617     				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking purchase order requisition';
5618 
5619 				  IF l_debug_mode = 'Y' THEN
5620 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5621 				  END IF;
5622 
5623 				  return;
5624                         END;
5625 
5626 			-- Check if task has supplier invoices
5627 			BEGIN
5628                                 l_dummy := 0;
5629 								/* CBS enhancement bug#16461684*/
5630 								l_task_tbl := l_tmp_task_tbl;
5631 								IF l_Cbs_Enabled = 'Y' THEN
5632 									l_task_tbl := l_alt_task_tbl;
5633 								END IF;
5634                                 SELECT
5635                                   1 into l_dummy
5636                                 FROM
5637                                   sys.dual
5638                                 WHERE
5639                                   exists (SELECT NULL
5640                                             FROM   ap_invoices_all aia, table(cast(l_task_tbl as sub_task)) st			--Changed the query for Bug#4964992
5641                                             where  aia.project_id = p_project_id
5642                                               AND  aia.TASK_ID = st.task_id);
5643 
5644                                 IF l_dummy = 1 THEN
5645                                         x_error_code :=80;
5646                                         x_error_msg_code :='PA_TSK_AP_INV_EXIST';
5647                                         return;
5648                                 END IF;
5649 
5650                                 EXCEPTION
5651                                   WHEN NO_DATA_FOUND THEN
5652 				  Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No supplier invoices exist in the entire task hierarchy' ;
5653 					IF l_debug_mode = 'Y' THEN
5654                                                 Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5655                                         END IF;
5656                                   WHEN OTHERS THEN
5657                                   x_error_code := SQLCODE;
5658 				  x_error_msg_code := substrb(SQLERRM,1,120);
5659     				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking supplier invoices';
5660 
5661 				  IF l_debug_mode = 'Y' THEN
5662 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5663 				  END IF;
5664                                   return;
5665                         END;
5666 
5667 			-- check if task has supplier invoice distribution
5668                         BEGIN
5669                                 l_dummy := 0;
5670 								/* CBS enhancement bug#16461684*/
5671 								l_task_tbl := l_tmp_task_tbl;
5672 								IF l_Cbs_Enabled = 'Y' THEN
5673 									l_task_tbl := l_alt_task_tbl;
5674 								END IF;
5675                                 SELECT
5676                                   1 into l_dummy
5677                                 FROM
5678                                   sys.dual
5679                                 WHERE
5680                                   exists (SELECT NULL
5681                                             FROM   ap_invoice_distributions_all aid, table(cast(l_task_tbl as sub_task)) st	--Changed the query for Bug#4964992
5682                                             where  aid.project_id = p_project_id
5683                                               AND  aid.TASK_ID = st.task_id);
5684 
5685                                 IF l_dummy = 1 THEN
5686                                         x_error_code :=90;
5687                                         x_error_msg_code :='PA_TSK_AP_INV_DIST_EXIST';
5688                                         return;
5689                                 END IF;
5690 
5691                                 EXCEPTION
5692                                   WHEN NO_DATA_FOUND THEN
5693 					Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No supplier invoice distribution exist';
5694 					IF l_debug_mode = 'Y' THEN
5695                                                 Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5696                                         END IF;
5697                                   WHEN OTHERS THEN
5698                                   x_error_code := SQLCODE;
5699 				  x_error_msg_code := substrb(SQLERRM,1,120);
5700     				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking supplier invoice distribution' ;
5701 
5702 				  IF l_debug_mode = 'Y' THEN
5703 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5704 				  END IF;
5705                                   return;
5706                         END;
5707 
5708 			-- Check if task has commitment transaction
5709                         BEGIN
5710                                 l_dummy := 0;
5711 								/* CBS enhancement bug#16461684*/
5712 								l_task_tbl := l_tmp_task_tbl;
5713                                 SELECT
5714                                   1 into l_dummy
5715                                 FROM
5716                                   sys.dual
5717                                 WHERE
5718                                   exists (SELECT NULL
5719                                             FROM   pa_commitment_txns pct, table(cast(l_task_tbl as sub_task)) st		--Changed the query for Bug#4964992
5720                                             where  pct.project_id = p_project_id
5721                                               AND  pct.TASK_ID = st.task_id);
5722 
5723                                 IF l_dummy = 1 THEN
5724                                         x_error_code :=110;
5725                                         x_error_msg_code :='PA_TSK_CMT_TXN_EXIST';
5726                                         return;
5727                                 END IF;
5728 
5729                                 EXCEPTION
5730                                   WHEN NO_DATA_FOUND THEN
5731 				  Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No commitment transaction exist';
5732 					IF l_debug_mode = 'Y' THEN
5733                                                 Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5734                                         END IF;
5735                                   WHEN OTHERS THEN
5736                                   x_error_code := SQLCODE;
5737 				  x_error_msg_code := substrb(SQLERRM,1,120);
5738     				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking commitment transaction';
5739 
5740 				  IF l_debug_mode = 'Y' THEN
5741 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5742 				  END IF;
5743                                   return;
5744                         END;
5745 
5746 			-- Check if task has compensation rule set
5747                         BEGIN
5748                                 l_dummy := 0;
5749 								/* CBS enhancement bug#16461684*/
5750 								l_task_tbl := l_tmp_task_tbl;
5751                                 SELECT
5752                                   1 into l_dummy
5753                                 FROM
5754                                   sys.dual
5755                                 WHERE
5756                                   exists (SELECT NULL
5757                                             FROM   pa_comp_rule_ot_defaults_all pcr, table(cast(l_task_tbl as sub_task)) st	--Changed the query for Bug#4964992
5758                                             where  pcr.project_id = p_project_id
5759                                               AND  pcr.TASK_ID = st.task_id)
5760 				 or exists (SELECT NULL
5761                                             FROM   pa_org_labor_sch_rule pol, table(cast(l_task_tbl as sub_task)) st
5762                                             where  overtime_project_id = p_project_id
5763                                               AND  pol.overtime_TASK_ID = st.task_id);
5764 
5765                                 IF l_dummy = 1 THEN
5766                                         x_error_code :=120;
5767                                         x_error_msg_code :='PA_TSK_COMP_RULE_SET_EXIST';
5768                                         return;
5769                                 END IF;
5770 
5771                                 EXCEPTION
5772                                   WHEN NO_DATA_FOUND THEN
5773 				  Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No compensation rule set exist';
5774                                         IF l_debug_mode = 'Y' THEN
5775                                                 Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5776                                         END IF;
5777                                   WHEN OTHERS THEN
5778                                   x_error_code := SQLCODE;
5779 				  x_error_msg_code := substrb(SQLERRM,1,120);
5780     				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking compensation rule set';
5781 
5782 				  IF l_debug_mode = 'Y' THEN
5783 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5784 				  END IF;
5785                                   return;
5786                         END;
5787 
5788 			-- Check if task has draft invoices
5789                         BEGIN
5790                                 l_dummy := 0;
5791 								/* CBS enhancement bug#16461684*/
5792 								l_task_tbl := l_tmp_task_tbl;
5793 								IF l_Cbs_Enabled = 'Y' THEN
5794 									l_task_tbl := l_alt_task_tbl;
5795 								END IF;
5796                                 SELECT
5797                                   1 into l_dummy
5798                                 FROM
5799                                   sys.dual
5800                                 WHERE
5801                                   exists (SELECT NULL
5802                                             FROM  pa_draft_invoice_details_all pdi, table(cast(l_task_tbl as sub_task)) st	--Changed the query for Bug#4964992
5803                                             where pdi.CC_TAX_TASK_ID =st.task_id
5804                                             and   pdi.project_id = p_project_id); -- Added for bug 8530541
5805 
5806                                 IF l_dummy = 1 THEN
5807                                         x_error_code :=160;
5808 					x_error_msg_code := 'PA_TSK_CC_DINV_EXIST';
5809                                         return;
5810                                 END IF;
5811 
5812                                 EXCEPTION
5813                                   WHEN NO_DATA_FOUND THEN
5814 					Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No draft invoice exist';
5815 					IF l_debug_mode = 'Y' THEN
5816                                               Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5817                                         END IF;
5818                                   WHEN OTHERS THEN
5819                                   x_error_code := SQLCODE;
5820 				  x_error_msg_code := substrb(SQLERRM,1,120);
5821 				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking draft invoices';
5822 
5823 				  IF l_debug_mode = 'Y' THEN
5824 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5825 				  END IF;
5826                                   return;
5827                         END;
5828 
5829 			-- Check if task has Project_customers
5830                         BEGIN
5831                                 l_dummy := 0;
5832 								/* CBS enhancement bug#16461684*/
5833 								l_task_tbl := l_tmp_task_tbl;
5834                                 SELECT
5835                                   1 into l_dummy
5836                                 FROM
5837                                   sys.dual
5838                                 WHERE
5839                                   exists (SELECT NULL
5840                                             FROM pa_project_customers pc, table(cast(l_task_tbl as sub_task)) st 		--Changed the query for Bug#4964992
5841                                             where /*pc.project_id = p_project_id and */ -- commented for bug 8485835 */
5842 					      pc.receiver_task_id =st.task_id);
5843 
5844                                 IF l_dummy = 1 THEN
5845                                         x_error_code :=170;
5846                                         x_error_msg_code := 'PA_TSK_CC_CUST_EXIST';
5847                                         return;
5848                                 END IF;
5849 
5850                                 EXCEPTION
5851                                   WHEN NO_DATA_FOUND THEN
5852 					Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No Project_customers exist';
5853 					IF l_debug_mode = 'Y' THEN
5854                                                 Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5855                                         END IF;
5856                                   WHEN OTHERS THEN
5857                                   x_error_code := SQLCODE;
5858 				  x_error_msg_code := substrb(SQLERRM,1,120);
5859 				  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking project customers';
5860 
5861 				  IF l_debug_mode = 'Y' THEN
5862 					Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5863 				  END IF;
5864                                   return;
5865                         END;
5866 
5867                          /*  added these checks as a part of bug fix 6079887 */
5868 			                        -- Check if task has iExpense records
5869 							BEGIN
5870 								l_dummy := 0;
5871 								/* CBS enhancement bug#16461684*/
5872 								l_task_tbl := l_tmp_task_tbl;
5873 								IF l_Cbs_Enabled = 'Y' THEN
5874 									l_task_tbl := l_alt_task_tbl;
5875 								END IF;
5876 					                        SELECT
5877 					                          1 into l_dummy
5878 					                        FROM
5879 					                          sys.dual
5880 					                        WHERE
5881 					                          exists (SELECT NULL
5882 					                                    FROM   ap_exp_report_dists_all er, table(cast(l_task_tbl as sub_task)) st  	  --Changed the query for Bug#4964992
5883 									    where  er.project_id = p_project_id
5884 					                                      AND  er.TASK_ID = st.task_id);
5885 
5886 					                        IF l_dummy = 1 THEN
5887 					                                x_error_code :=180;
5888 					                                x_error_msg_code := 'PA_TSK_IEXP_EXIST';
5889 					                                return;
5890 					                        END IF;
5891 
5892 					                        EXCEPTION
5893 					                          WHEN NO_DATA_FOUND THEN
5894 					                                Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No IExpenses exist in the entire task hierarchy';
5895 									IF l_debug_mode = 'Y' THEN
5896 					                                        Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5897 					                                END IF;
5898 					                          WHEN OTHERS THEN
5899 					                          x_error_code := SQLCODE;
5900 								  x_error_msg_code := substrb(SQLERRM,1,120);
5901 								  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking IExpense Records';
5902 
5903 								  IF l_debug_mode = 'Y' THEN
5904 									Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5905 								  END IF;
5906 
5907 								  return;
5908 			                              END;
5909 
5910 			                        -- Check if task has Inventory Transaction records
5911 						BEGIN
5912 							l_dummy := 0;
5913 							/* CBS enhancement bug#16461684*/
5914 							l_task_tbl := l_tmp_task_tbl;
5915 							IF l_Cbs_Enabled = 'Y' THEN
5916 								l_task_tbl := l_alt_task_tbl;
5917 							END IF;
5918 						        SELECT
5919 						          1 into l_dummy
5920 						        FROM
5921 						          sys.dual
5922 						        WHERE
5923 						          exists (SELECT NULL
5924 						                    FROM   mtl_material_transactions mtl, table(cast(l_task_tbl as sub_task)) st  	  --Changed the query for Bug#4964992
5925 								    where  mtl.project_id = p_project_id
5926 						                      AND  mtl.TASK_ID = st.task_id);
5927 
5928 						        IF l_dummy = 1 THEN
5929 						                x_error_code :=190;
5930 						                x_error_msg_code := 'PA_TSK_INV_TRANS_EXIST';
5931 						                return;
5932 						        END IF;
5933 
5934 						        EXCEPTION
5935 						          WHEN NO_DATA_FOUND THEN
5936 						                Pa_Debug.g_err_stage:= 'API : TASK_VALIDATIONS : No Inventory transactions exist in the entire task hierarchy';
5937 								IF l_debug_mode = 'Y' THEN
5938 						                        Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5939 						                END IF;
5940 						          WHEN OTHERS THEN
5941 						          x_error_code := SQLCODE;
5942 							  x_error_msg_code := substrb(SQLERRM,1,120);
5943 							  Pa_Debug.g_err_stage:= ' TASK_VALIDATIONS :Unexpected Error occured while checking Inventory Records';
5944 
5945 							  IF l_debug_mode = 'Y' THEN
5946 								Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
5947 							  END IF;
5948 
5949 							  return;
5950 			                        END;
5951 			/*  added these checks as a part of bug fix 6079887 */
5952 
5953                  /* END LOOP; */   --Commented By  sunkalya for perf fix Bug#4964992
5954 	     END IF;
5955 IF l_debug_mode = 'Y' THEN
5956     Pa_Debug.reset_curr_function;
5957 END IF;
5958 
5959 EXCEPTION
5960 WHEN OTHERS THEN
5961 x_error_code := SQLCODE;
5962 x_error_msg_code := substrb(SQLERRM,1,120);
5963 
5964 Pa_Debug.g_err_stage:= 'Unexpected Error'||x_error_msg_code;
5965 
5966 Fnd_Msg_Pub.add_exc_msg
5967 ( p_pkg_name        => 'pa_proj_tsk_utils'
5968 ,p_procedure_name  => 'TASK_VALIDATIONS'
5969 ,p_error_text      => x_error_msg_code);
5970 
5971      IF l_debug_mode = 'Y' THEN
5972           Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,
5973                               l_debug_level5);
5974 
5975           Pa_Debug.reset_curr_function;
5976      END IF;
5977 -- Important : Dont Raise : It will be taken care by Caller API
5978 
5979 end PERFORM_TASK_VALIDATIONS;
5980 
5981 
5982 
5983 
5984 -- API name                      : get_task_hierarchy
5985 -- Type                          : Function
5986 -- Pre-reqs                      : None
5987 -- Return Value                  : Type sub_task (Table)
5988 
5989 -- Prameters			 :
5990 -- p_project_id		IN		NUMBER
5991 -- p_task_id		IN		NUMBER
5992 
5993 -- Created By			 : Sunkalya
5994 -- Created Date			 : 28-Feb-2006
5995 
5996 -- Purpose:
5997 -- This Function has been included for perf fix  4964992
5998 ----------------------------------------------------------------------------------------------------------
5999 -- This function returns the entire hierarchy for the
6000 -- passed task_id.
6001 
6002 -- Note that START WITH - CONNECT BY CLAUSE cant be avoided as we want the task passed and all its children
6003 -- in the hierarchy
6004 -- This is known to cause FTS on pa_tasks . But,this cant be avoided.
6005 
6006 -- (ie) if the hierarchy is :
6007 --  1
6008 --    11
6009 --      111
6010 --         1111
6011 
6012 -- then ,if 1's task id is passed ,then we need the entire branch as above in
6013 -- hierarchy.
6014 -------------------------------------------------------------------------------------------------------------
6015 
6016 -- History
6017 
6018 -- 28-Feb-2006		Sunkalya	Created. Bug#4964992
6019 
6020 FUNCTION get_task_hierarchy(
6021 				p_project_id		IN		NUMBER,
6022 				p_task_id		IN		NUMBER
6023 			   )
6024 RETURN sub_task
6025 IS
6026 
6027 l_task_tbl			sub_task;
6028 l_debug_level3			CONSTANT NUMBER := 3;
6029 l_user_id			NUMBER;
6030 l_login_id			NUMBER;
6031 l_debug_mode			VARCHAR2(1);
6032 
6033 CURSOR task_hierarchy IS
6034 SELECT
6035 		task_rec(task_name,task_id)
6036 	FROM
6037 		pa_tasks
6038 	CONNECT BY PRIOR
6039 		task_id		=	parent_task_id	AND
6040 		project_id	=	p_project_id
6041 	START WITH
6042 		task_id		=	p_task_id	AND
6043 		project_id	=	p_project_id;
6044 
6045 BEGIN
6046 	l_user_id	:=	fnd_global.user_id;
6047 	l_login_id	:=	fnd_global.login_id;
6048 
6049 	l_debug_mode  := NVL(FND_PROFILE.value_specific('PA_DEBUG_MODE',l_user_id, l_login_id,275,null,null),'N');
6050 
6051         IF l_debug_mode = 'Y' THEN
6052 		PA_DEBUG.set_curr_function( p_function   =>'get_task_hierarchy' , p_debug_mode => l_debug_mode );
6053         END IF;
6054 
6055 	OPEN  task_hierarchy;
6056 	FETCH task_hierarchy BULK COLLECT INTO l_task_tbl;
6057 	CLOSE task_hierarchy;
6058 
6059     IF l_debug_mode = 'Y' THEN       --Bug 8525293 Start
6060        pa_debug.reset_curr_function;
6061     END IF ;                         --Bug 8525293 End
6062 
6063 	RETURN l_task_tbl;
6064 
6065 EXCEPTION
6066 	WHEN OTHERS THEN
6067 		Pa_Debug.g_err_stage:= ' API:get_task_hierarchy :Unexpected Error occured while retrieving task strucutre for '|| p_task_id;
6068 			IF l_debug_mode = 'Y' THEN
6069 				Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
6070 				pa_debug.reset_curr_function; --Bug 8525293
6071 			END IF;
6072                 RAISE;
6073 END get_task_hierarchy;
6074 
6075 --bug#16461684 Cbs Enhancement
6076 FUNCTION get_Alt_task_List(
6077 				p_project_id		IN		NUMBER,
6078 				p_task_id		IN		NUMBER
6079 			   )
6080 RETURN sub_task
6081 IS
6082 
6083 l_alt_task_tbl			sub_task;
6084 l_debug_level3			CONSTANT NUMBER := 3;
6085 l_user_id			NUMBER;
6086 l_login_id			NUMBER;
6087 l_debug_mode			VARCHAR2(1);
6088 
6089 CURSOR task_hierarchy IS
6090 SELECT
6091 		task_rec(null,alt_task_id)
6092 	FROM
6093 	pa_alternate_tasks where
6094 	proj_element_id in (select task_id from
6095 		pa_tasks
6096 	CONNECT BY PRIOR
6097 		task_id		=	parent_task_id	AND
6098 		project_id	=	p_project_id
6099 	START WITH
6100 		task_id		=	p_task_id	AND
6101 		project_id	=	p_project_id)
6102 		;
6103 
6104 BEGIN
6105 	l_user_id	:=	fnd_global.user_id;
6106 	l_login_id	:=	fnd_global.login_id;
6107 
6108 	l_debug_mode  := NVL(FND_PROFILE.value_specific('PA_DEBUG_MODE',l_user_id, l_login_id,275,null,null),'N');
6109 
6110         IF l_debug_mode = 'Y' THEN
6111 		PA_DEBUG.set_curr_function( p_function   =>'get_Alt_task_List' , p_debug_mode => l_debug_mode );
6112         END IF;
6113 
6114 	OPEN  task_hierarchy;
6115 	FETCH task_hierarchy BULK COLLECT INTO l_alt_task_tbl;
6116 	CLOSE task_hierarchy;
6117 
6118     IF l_debug_mode = 'Y' THEN
6119        pa_debug.reset_curr_function;
6120     END IF ;
6121 
6122 	RETURN l_alt_task_tbl;
6123 
6124 EXCEPTION
6125 	WHEN OTHERS THEN
6126 		Pa_Debug.g_err_stage:= ' API:get_Alt_task_List :Unexpected Error occured while retrieving task strucutre for '|| p_task_id;
6127 			IF l_debug_mode = 'Y' THEN
6128 				Pa_Debug.WRITE('pa_proj_tsk_utils',Pa_Debug.g_err_stage,l_debug_level3);
6129 				pa_debug.reset_curr_function;
6130 			END IF;
6131                 RAISE;
6132 END get_Alt_task_List;
6133 
6134 function IS_LOWEST_PROJ_TASK(
6135 				p_task_version_id NUMBER,
6136 				p_project_id  NUMBER) RETURN VARCHAR2
6137 is
6138  l_dummy number;
6139  cursor child_exist IS
6140  select 1 from dual where exists(
6141   select 1
6142    from pa_object_relationships por, pa_proj_element_versions ppev, pa_proj_elements ppe
6143     where por.object_type_from = 'PA_TASKS'
6144     and por.object_id_from1 = p_task_version_id
6145     and por.relationship_type = 'S'
6146     and por.object_id_to1 = ppev.element_version_id
6147     and ppe.PROJ_ELEMENT_ID = ppev.PROJ_ELEMENT_ID
6148     and nvl(ppe.LINK_TASK_FLAG,'N') <> 'Y');
6149 
6150 BEGIN
6151 
6152   OPEN child_exist;
6153   FETCH child_exist into l_dummy;
6154   IF child_exist%NOTFOUND then
6155     --Cannot find child. It is lowest task
6156     CLOSE child_exist;
6157     return 'Y';
6158   ELSE
6159     --Child found. Not lowest task
6160     CLOSE child_exist;
6161     return 'N';
6162   END IF;
6163 EXCEPTION
6164   WHEN OTHERS THEN
6165     raise;
6166 END IS_LOWEST_PROJ_TASK;
6167 
6168 
6169 END PA_PROJ_ELEMENTS_UTILS;