DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_PROJECT_DATES_UTILS

Source


1 PACKAGE BODY pa_project_dates_utils AS
2 /* $Header: PARMPDUB.pls 120.24 2011/10/28 10:50:39 djambhek ship $ */
3 
4 
5 -- Global constant
6 G_PKG_NAME              CONSTANT VARCHAR2(30) := 'PA_PROJECT_DATES_UTILS';
7 
8 
9 -- API name		: Get_Project_Start_Date
10 -- Type			: Utility
11 -- Pre-reqs		: None.
12 -- Parameters           :
13 -- p_project_id                    IN NUMBER
14 
15 FUNCTION GET_PROJECT_START_DATE
16 (  p_project_id                    IN NUMBER
17 ) RETURN DATE
18 IS
19    l_target_start_date   DATE;
20    l_scheduled_start_date DATE;
21    l_actual_start_date    DATE;
22    l_start_date		  DATE; -- Fix for Bug # 4506308.
23 
24    -- Begin fix for Bug # 12940745.
25    l_auto_trans_flag 	varchar2(10);
26    l_enable_ver_flag 	varchar2(10);
27    l_struct_code 		varchar2(50);
28    -- Begin fix for Bug # 12940745.
29 
30    CURSOR get_dates_csr
31    IS
32    SELECT target_start_date, scheduled_start_date, actual_start_date, start_date -- Fix for Bug # 4506308.
33    FROM PA_PROJECTS_ALL
34    WHERE project_id = p_project_id;
35 
36    -- Begin fix for Bug # 12940745.
37    CURSOR c_auto_flag_enabled
38    IS
39 		  select ppwa.AUTO_SYNC_TXN_DATE_FLAG, ppwa.wp_enable_version_flag
40           from pa_proj_workplan_attr ppwa, pa_proj_elements ppe, pa_proj_structure_types ppst, pa_structure_types pst
41           WHERE ppe.project_id = p_project_id
42           AND ppe.project_id = ppwa.project_id
43           AND ppe.proj_element_id = ppwa.proj_element_id
44           AND ppe.proj_element_id = ppst.proj_element_id
45           AND ppst.structure_type_id = pst.structure_type_id
46           AND pst.structure_type_class_code = 'WORKPLAN';
47 
48 	CURSOR c_struct_code
49 	IS
50 		select STRUCTURE_SHARING_CODE
51 		from PA_PROJECTS_ALL
52 		where project_id = p_project_id;
53 	 -- End fix for Bug # 12940745.
54 BEGIN
55 
56    OPEN get_dates_csr;
57    FETCH get_dates_csr INTO l_target_start_date, l_scheduled_start_date, l_actual_start_date, l_start_date;
58 										 -- Fix for Bug # 4506308.
59    CLOSE get_dates_csr;
60 
61     -- Begin fix for Bug # 12940745.
62    OPEN c_auto_flag_enabled;
63       FETCH c_auto_flag_enabled INTO l_auto_trans_flag, l_enable_ver_flag;
64    CLOSE c_auto_flag_enabled;
65 
66    OPEN c_struct_code;
67       FETCH c_struct_code INTO l_struct_code;
68    CLOSE c_struct_code;
69     -- End fix for Bug # 12940745.
70 
71 
72    IF l_actual_start_date IS NULL THEN
73    -- Begin fix for Bug # 12940745.
74    IF((l_struct_code='SHARE_FULL' OR l_struct_code='SHARE_PARTIAL') AND (l_auto_trans_flag='Y' and l_enable_ver_flag='Y')) THEN
75 		return l_start_date;
76 	END IF;
77 	 -- End fix for Bug # 12940745.
78       IF l_scheduled_start_date IS NULL THEN
79 
80 	 -- Begin fix for Bug # 4506308.
81 
82 	 -- return l_target_start_date;
83 
84          if l_target_start_date is null then
85 	 	return l_start_date;
86 	 else
87 		return l_target_start_date;
88 	 end if;
89 
90 	 -- End fix for Bug # 4506308.
91 
92       ELSE
93          return l_scheduled_start_date;
94       END IF;
95    ELSE
96       return l_actual_start_date;
97    END IF;
98 
99 EXCEPTION
100    when OTHERS then
101      return NULL;
102 END GET_PROJECT_START_DATE;
103 
104 
105 
106 -- API name		: Get_Project_Finish_Date
107 -- Type			: Utility
108 -- Pre-reqs		: None.
109 -- Parameters           :
110 -- p_project_id                    IN NUMBER
111 
112 FUNCTION GET_PROJECT_FINISH_DATE
113 (  p_project_id                    IN NUMBER
114 ) RETURN DATE
115 IS
116    l_target_finish_date   DATE;
117    l_scheduled_finish_date DATE;
118    l_actual_finish_date    DATE;
119    l_completion_date	   DATE; -- Fix for Bug # 4506308.
120 
121    CURSOR get_dates_csr
122    IS
123    SELECT target_finish_date, scheduled_finish_date, actual_finish_date, completion_date
124 										-- Fix for Bug # 4506308.
128 BEGIN
125    FROM PA_PROJECTS_ALL
126    WHERE project_id = p_project_id;
127 
129 
130    OPEN get_dates_csr;
131    FETCH get_dates_csr INTO l_target_finish_date, l_scheduled_finish_date, l_actual_finish_date
132 			    , l_completion_date; -- Fix for Bug # 4506308.
133    CLOSE get_dates_csr;
134 
135    IF l_actual_finish_date IS NULL THEN
136       IF l_scheduled_finish_date IS NULL THEN
137 
138 	 -- Begin fix for Bug # 4506308.
139 
140          -- return l_target_finish_date;
141 
142 	 if l_target_finish_date is null then
143 	 	return l_completion_date;
144 	 else
145 		return l_target_finish_date;
146 	 end if;
147 
148 	 -- End fix for Bug # 4506308.
149 
150       ELSE
151          return l_scheduled_finish_date;
152       END IF;
153    ELSE
154       return l_actual_finish_date;
155    END IF;
156 
157 EXCEPTION
158    when OTHERS then
159      return NULL;
160 END GET_PROJECT_FINISH_DATE;
161 
162 
163 
164 -- API name		: Check_Financial_Task_Exists
165 -- Type			: Utility
166 -- Pre-reqs		: None.
167 -- Parameters           :
168 -- p_proj_element_id                    IN NUMBER
169 
170 FUNCTION CHECK_FINANCIAL_TASK_EXISTS
171 (  p_proj_element_id                    IN NUMBER
172 ) RETURN VARCHAR2
173 IS
174    l_dummy         VARCHAR2(1);
175 
176    CURSOR C1
177    IS
178    SELECT 'Y'
179    FROM PA_TASKS
180    WHERE task_id = p_proj_element_id;
181 
182 BEGIN
183    OPEN C1;
184    FETCH C1 INTO l_dummy;
185 
186    if C1%NOTFOUND then
187       CLOSE C1;
188       return 'N';
189    else
190       CLOSE C1;
191       return 'Y';
192    end if;
193 
194 EXCEPTION
195    when OTHERS then
196       return 'N';
197 END CHECK_FINANCIAL_TASK_EXISTS;
198 
199 
200 -- API name		: Get_Task_Start_Date
201 -- Type			: Utility
202 -- Pre-reqs		: None.
203 -- Parameters           :
204 -- p_project_id                    IN NUMBER
205 -- p_proj_element_id               IN NUMBER
206 -- p_parent_structure_version_id   IN NUMBER
207 -- x_task_start_date               OUT DATE
208 -- x_start_as_of_date              OUT DATE
209 PROCEDURE GET_TASK_START_DATE
210 (  p_project_id                    IN NUMBER
211   ,p_proj_element_id               IN NUMBER
212   ,p_parent_structure_version_id   IN NUMBER
213   ,x_task_start_date               OUT NOCOPY DATE --File.Sql.39 bug 4440895
214   ,x_start_as_of_date              OUT NOCOPY DATE --File.Sql.39 bug 4440895
215 )
216 IS
217   CURSOR get_task_sch_dates_csr
218   IS
219   SELECT a.scheduled_start_date, a.last_update_date
220   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
221        PA_PROJ_ELEMENT_VERSIONS b
222   WHERE b.parent_structure_version_id = p_parent_structure_version_id
223   AND   b.project_id = p_project_id
224   AND   b.proj_element_id = p_proj_element_id
225   AND   b.element_version_id = a.element_version_id
226   AND   b.project_id = a.project_id;
227 
228   CURSOR get_task_act_dates_csr
229   IS
230   SELECT a.actual_start_date, a.last_update_date
231   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
232        PA_PROJ_ELEMENT_VERSIONS b
233   WHERE b.parent_structure_version_id = p_parent_structure_version_id
234   AND   b.project_id = p_project_id
235   AND   b.proj_element_id = p_proj_element_id
236   AND   b.element_version_id = a.element_version_id
237   AND   b.project_id = a.project_id;
238 
239   l_scheduled_start_date     DATE;
240   l_actual_start_date        DATE;
241   l_scheduled_update_date    DATE;
242   l_actual_update_date       DATE;
243 BEGIN
244 
245   x_task_start_date := NULL;
246   x_start_as_of_date := NULL;
247 
248   OPEN get_task_sch_dates_csr;
249   FETCH get_task_sch_dates_csr INTO l_scheduled_start_date, l_scheduled_update_date;
250   CLOSE get_task_sch_dates_csr;
251 
252   OPEN get_task_act_dates_csr;
253   FETCH get_task_act_dates_csr INTO l_actual_start_date, l_actual_update_date;
254   CLOSE get_task_act_dates_csr;
255 
256   if l_actual_start_date IS NULL then
257     if l_scheduled_start_date IS NULL then
258       NULL;
259     else
260       x_task_start_date := l_scheduled_start_date;
261       x_start_as_of_date := l_scheduled_update_date;
262     end if;
263   else
264     x_task_start_date := l_actual_start_date;
265     x_start_as_of_date := l_actual_update_date;
266   end if;
267 
268 EXCEPTION
269    when OTHERS then
270      x_task_start_date := NULL;
271      x_start_as_of_date := NULL;
272 END GET_TASK_START_DATE;
273 
274 
275 
276 -- API name		: Get_Task_Finish_Date
277 -- Type			: Utility
278 -- Pre-reqs		: None.
279 -- Parameters           :
280 -- p_project_id                    IN NUMBER
281 -- p_proj_element_id               IN NUMBER
282 -- p_parent_structure_version_id   IN NUMBER
283 -- x_task_finish_date              OUT DATE
284 -- x_finish_as_of_date             OUT DATE
285 PROCEDURE GET_TASK_FINISH_DATE
286 (  p_project_id                    IN NUMBER
287   ,p_proj_element_id               IN NUMBER
288   ,p_parent_structure_version_id   IN NUMBER
289   ,x_task_finish_date              OUT NOCOPY DATE --File.Sql.39 bug 4440895
290   ,x_finish_as_of_date             OUT NOCOPY DATE --File.Sql.39 bug 4440895
291 )
292 IS
293   CURSOR get_task_sch_dates_csr
294   IS
295   SELECT a.scheduled_finish_date, a.last_update_date
299   AND   b.project_id = p_project_id
296   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
297        PA_PROJ_ELEMENT_VERSIONS b
298   WHERE b.parent_structure_version_id = p_parent_structure_version_id
300   AND   b.proj_element_id = p_proj_element_id
301   AND   b.element_version_id = a.element_version_id
302   AND   b.project_id = a.project_id;
303 
304   CURSOR get_task_act_dates_csr
305   IS
306   SELECT a.actual_finish_date, a.last_update_date
307   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
308        PA_PROJ_ELEMENT_VERSIONS b
309   WHERE b.parent_structure_version_id = p_parent_structure_version_id
310   AND   b.project_id = p_project_id
311   AND   b.proj_element_id = p_proj_element_id
312   AND   b.element_version_id = a.element_version_id
313   AND   b.project_id = a.project_id;
314 
315   l_scheduled_finish_date     DATE;
316   l_actual_finish_date        DATE;
317   l_scheduled_update_date     DATE;
318   l_actual_update_date        DATE;
319   l_finish_update_date        DATE;
320 BEGIN
321 
322   x_task_finish_date := NULL;
323   x_finish_as_of_date := NULL;
324 
325   OPEN get_task_sch_dates_csr;
326   FETCH get_task_sch_dates_csr INTO l_scheduled_finish_date, l_scheduled_update_date;
327   CLOSE get_task_sch_dates_csr;
328 
329   OPEN get_task_act_dates_csr;
330   FETCH get_task_act_dates_csr INTO l_actual_finish_date, l_actual_update_date;
331   CLOSE get_task_act_dates_csr;
332 
333   if l_actual_finish_date IS NULL then
334     if l_scheduled_finish_date IS NULL then
335       NULL;
336     else
337       x_task_finish_date := l_scheduled_finish_date;
338       x_finish_as_of_date := l_scheduled_update_date;
339     end if;
340   else
341     x_task_finish_date := l_actual_finish_date;
342     x_finish_as_of_date := l_actual_update_date;
343   end if;
344 
345 EXCEPTION
346    when OTHERS then
347      x_task_finish_date := NULL;
348      x_finish_as_of_date := NULL;
349 END GET_TASK_FINISH_DATE;
350 
351 
352 -- API name		: Get_Task_Derived_Dates
353 -- Type			: Utility
354 -- Pre-reqs		: None.
355 -- Parameters           :
356 -- p_project_id                    IN NUMBER
357 -- p_proj_element_id               IN NUMBER
358 -- p_parent_structure_version_id   IN NUMBER
359 -- x_task_start_date               OUT DATE
360 -- x_task_finish_date              OUT DATE
361 -- x_task_as_of_date               OUT DATE
362 PROCEDURE GET_TASK_DERIVED_DATES
363 (  p_project_id                    IN NUMBER
364   ,p_proj_element_id               IN NUMBER
365   ,p_parent_structure_version_id   IN NUMBER
366   ,x_task_start_date               OUT NOCOPY DATE --File.Sql.39 bug 4440895
367   ,x_task_finish_date              OUT NOCOPY DATE --File.Sql.39 bug 4440895
368   ,x_task_as_of_date               OUT NOCOPY DATE --File.Sql.39 bug 4440895
369 )
370 IS
371   l_task_start_date      DATE;
372   l_task_finish_date     DATE;
373   l_task_as_of_date      DATE;
374 
375   l_start_as_of_date     DATE;
376   l_finish_as_of_date    DATE;
377 BEGIN
378   PA_PROJECT_DATES_UTILS.GET_TASK_START_DATE (
379    p_project_id                  => p_project_id
380   ,p_proj_element_id             => p_proj_element_id
381   ,p_parent_structure_version_id => p_parent_structure_version_id
382   ,x_task_start_date             => l_task_start_date
383   ,x_start_as_of_date            => l_start_as_of_date );
384 
385   PA_PROJECT_DATES_UTILS.GET_TASK_FINISH_DATE (
386    p_project_id                  => p_project_id
387   ,p_proj_element_id             => p_proj_element_id
388   ,p_parent_structure_version_id => p_parent_structure_version_id
389   ,x_task_finish_date            => l_task_finish_date
390   ,x_finish_as_of_date           => l_finish_as_of_date );
391 
392   x_task_start_date := l_task_start_date;
393   x_task_finish_date := l_task_finish_date;
394   -- Commented out for bug 2635769
395   --if l_start_as_of_date > l_finish_as_of_date then
396   --  x_task_as_of_date := l_start_as_of_date;
397   --else
398   --  x_task_as_of_date := l_finish_as_of_date;
399   --end if;
400    x_task_as_of_date := NULL;
401 
402 EXCEPTION
403    when OTHERS then
404      x_task_start_date := NULL;
405      x_task_finish_date := NULL;
406      x_task_as_of_date := NULL;
407 END GET_TASK_DERIVED_DATES;
408 
409 
410 -- API name		: Get_Task_Copy_Dates
411 -- Type			: Utility
412 -- Pre-reqs		: None.
413 -- Parameters           :
414 -- p_project_id                    IN NUMBER
415 -- p_proj_element_id               IN NUMBER
416 -- p_parent_structure_version_id   IN NUMBER
417 -- x_task_start_date               OUT DATE
418 -- x_task_finish_date              OUT DATE
419 PROCEDURE GET_TASK_COPY_DATES
420 (  p_project_id                    IN NUMBER
421   ,p_proj_element_id               IN NUMBER
422   ,p_parent_structure_version_id   IN NUMBER
423   ,x_task_start_date               OUT NOCOPY DATE --File.Sql.39 bug 4440895
424   ,x_task_finish_date              OUT NOCOPY DATE --File.Sql.39 bug 4440895
425   ,p_act_fin_date_flag             IN VARCHAR2   DEFAULT 'Y'  --bug 4229865
426 )
427 IS
428   /* Commented for bug 5258713
429   CURSOR get_task_sch_dates_csr
430   IS
431   SELECT a.scheduled_start_date, a.scheduled_finish_date
432   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
433        PA_PROJ_ELEMENT_VERSIONS b
434   WHERE b.parent_structure_version_id = p_parent_structure_version_id
435   AND   b.project_id = p_project_id
436   AND   b.proj_element_id = p_proj_element_id
437   AND   b.element_version_id = a.element_version_id;
438 
439   CURSOR get_task_act_dates_csr
440   IS
444   WHERE b.parent_structure_version_id = p_parent_structure_version_id
441   SELECT a.actual_start_date, a.actual_finish_date
442   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
443        PA_PROJ_ELEMENT_VERSIONS b
445   AND   b.project_id = p_project_id
446   AND   b.proj_element_id = p_proj_element_id
447   AND   b.element_version_id = a.element_version_id;
448   */
449 
450   /*Added for bug 5258713 - Merged the two cursors*/
451  	   CURSOR get_task_dates_csr
452  	   IS
453  	   SELECT a.actual_start_date, a.actual_finish_date,a.scheduled_start_date, a.scheduled_finish_date
454  	   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
455  	        PA_PROJ_ELEMENT_VERSIONS b
456  	   WHERE b.parent_structure_version_id = p_parent_structure_version_id
457  	   AND   b.project_id = p_project_id
458  	   AND   b.proj_element_id = p_proj_element_id
459  	   AND   b.element_version_id = a.element_version_id
460  	   AND   A.PROJECT_ID = B.PROJECT_ID; -- Also added a new condition for 5258713
461  /* End Added for bug 5258713 */
462 
463   l_scheduled_start_date      DATE;
464   l_scheduled_finish_date     DATE;
465   l_actual_start_date         DATE;
466   l_actual_finish_date        DATE;
467 BEGIN
468    /*Commented for bug 5258713
469   OPEN get_task_sch_dates_csr;
470   FETCH get_task_sch_dates_csr INTO l_scheduled_start_date, l_scheduled_finish_date;
471   CLOSE get_task_sch_dates_csr;
472 
473   OPEN get_task_act_dates_csr;
474   FETCH get_task_act_dates_csr INTO l_actual_start_date, l_actual_finish_date;
475   CLOSE get_task_act_dates_csr;
476    */
477 
478    /*Added for bug 5258713 */
479  OPEN get_task_dates_csr;
480  FETCH get_task_dates_csr INTO l_actual_start_date, l_actual_finish_date, l_scheduled_start_date, l_scheduled_finish_date;
481  CLOSE get_task_dates_csr;
482    /* End Added for bug 5258713 */
483 
484 --Added condition OR (l_actual_finish_date IS NULL) for bug 5338208
485   if (l_actual_start_date IS NULL) OR (l_actual_finish_date IS NULL) then
486     x_task_start_date := l_scheduled_start_date;
487     x_task_finish_date := l_scheduled_finish_date;
488   else
489     x_task_start_date := l_actual_start_date;
490     x_task_finish_date := l_actual_finish_date;
491   end if;
492 
493 -- bug 4229865
494 /*  Commented for bug 5338208
495   IF  p_act_fin_date_flag = 'N'
496   THEN
497      x_task_finish_date := NULL;
498   END IF;*/
499 -- end bug 4229865
500 
501 
502 EXCEPTION
503    when OTHERS then
504      x_task_start_date := NULL;
505      x_task_finish_date := NULL;
506 END GET_TASK_COPY_DATES;
507 
508 
509 -- API name		: Get_Default_Proj_Start_Date
510 -- Type			: Utility
511 -- Pre-reqs		: None.
512 -- Parameters           :
513 -- p_project_id                    IN NUMBER
514 
515 FUNCTION GET_DEFAULT_PROJ_START_DATE
516 (  p_project_id                    IN NUMBER
517 ) RETURN DATE
518 IS
519    l_target_start_date   DATE;
520    l_scheduled_start_date DATE;
521    l_actual_start_date    DATE;
522 
523    CURSOR get_dates_csr
524    IS
525    SELECT target_start_date, scheduled_start_date, actual_start_date
526    FROM PA_PROJECTS_ALL
527    WHERE project_id = p_project_id;
528 
529 BEGIN
530 
531    OPEN get_dates_csr;
532    FETCH get_dates_csr INTO l_target_start_date, l_scheduled_start_date, l_actual_start_date;
533    CLOSE get_dates_csr;
534 
535    IF l_actual_start_date IS NULL THEN
536       IF l_scheduled_start_date IS NULL THEN
537          IF l_target_start_date IS NULL THEN
538             return SYSDATE;
539          ELSE
540             return l_target_start_date;
541          END IF;
542       ELSE
543          return l_scheduled_start_date;
544       END IF;
545    ELSE
546       return l_actual_start_date;
547    END IF;
548 
549 EXCEPTION
550    when OTHERS then
551      return SYSDATE;
552 END GET_DEFAULT_PROJ_START_DATE;
553 
554 
555 
556 -- Bug 6335446: Start
557 
558 -- API name             : Get_Default_Assign_Start_Date
559 -- Type                 : Utility
560 -- Pre-reqs             : None.
561 -- Parameters           :
562 -- p_project_id                    IN NUMBER
563 
564 FUNCTION GET_DEFAULT_ASSIGN_START_DATE
565 (  p_project_id                    IN NUMBER
566 ) RETURN DATE
567 IS
568    l_target_start_date    DATE;
569    l_scheduled_start_date DATE;
570    l_actual_start_date    DATE;
571    l_return_date          DATE;
572    l_util_start_date      DATE;
573    l_transaction_date     DATE;
574 
575    CURSOR get_dates_csr
576    IS
577    SELECT target_start_date, scheduled_start_date, actual_start_date,start_date
578    FROM PA_PROJECTS_ALL
579    WHERE project_id = p_project_id;
580 
581 BEGIN
582 
583    OPEN get_dates_csr;
584    FETCH get_dates_csr INTO l_target_start_date, l_scheduled_start_date, l_actual_start_date, l_transaction_date;
585    CLOSE get_dates_csr;
586 
587    IF l_transaction_date IS NULL THEN -- 6853114
588     IF l_actual_start_date IS NULL THEN
589       IF l_scheduled_start_date IS NULL THEN
590          IF l_target_start_date IS NULL THEN
591             l_return_date := SYSDATE;
592          ELSE
593             l_return_date := l_target_start_date;
594          END IF;
595        ELSE
596           l_return_date :=  l_scheduled_start_date;
597        END IF;
598      ELSE
599       l_return_date := l_actual_start_date;
600      END IF;
601    ELSE
605    l_util_start_date :=  to_date(fnd_profile.value('PA_UTL_START_DATE'), 'DD/MM/YYYY', 'NLS_DATE_LANGUAGE=AMERICAN'); /*Adding For Bug 7304151 */
602      l_return_date := l_transaction_date;
603    END IF;
604    -- l_util_start_date :=  to_date(fnd_profile.value('PA_UTL_START_DATE'), 'DD/MM/YYYY'); /* commenting for For Bug 7304151 */
606    IF(  l_util_start_date IS NOT NULL ) THEN
607      IF ( l_util_start_date >= l_return_date ) THEN
608         l_return_date := l_util_start_date ;
609      END IF;
610    END IF;
611    return  l_return_date ;
612 EXCEPTION
613    when OTHERS then
614    return SYSDATE;
615 END GET_DEFAULT_ASSIGN_START_DATE;
616 
617 
618 -- API name             : Is_Valid_Assign_Start_Date
619 -- Type                 : Utility
620 -- Pre-reqs             : None.
621 -- Parameters           :
622 -- p_project_id           IN NUMBER
623 -- p_assign_start_date    IN DATE
624 
625 FUNCTION IS_VALID_ASSIGN_START_DATE
626 (  p_project_id                    IN NUMBER,
627    p_assign_start_date             IN DATE
628 ) RETURN VARCHAR2
629 IS
630    l_result_date          DATE;
631    l_util_start_date      DATE;
632 
633 BEGIN
634 
635    -- l_util_start_date :=  to_date(fnd_profile.value('PA_UTL_START_DATE'), 'DD/MM/YYYY'); /* commenting for For Bug 7304151 */
636    l_util_start_date :=  to_date(fnd_profile.value('PA_UTL_START_DATE'), 'DD/MM/YYYY', 'NLS_DATE_LANGUAGE=AMERICAN'); /*Adding For Bug 7304151 */
637    IF(  l_util_start_date IS NOT NULL ) THEN
638      l_result_date := l_util_start_date ;
639    END IF;
640    IF ( l_util_start_date IS NOT NULL ) THEN
641      IF (  p_assign_start_date < l_result_date ) THEN
642        RETURN 'N';
643      ELSE
644        RETURN 'Y';
645      END IF;
646    ELSE
647       RETURN 'Y';
648    END IF;
649  EXCEPTION
650    WHEN OTHERS THEN
651    RETURN 'N' ;
652 END IS_VALID_ASSIGN_START_DATE;
653 
654 -- Bug 6335446: End
655 
656 
657 
658 -- API name		: Get_Struct_Schedule_Dates
659 -- Type			: Utility
660 -- Pre-reqs		: None.
661 -- Parameters           :
662 -- p_structure_version_id   IN NUMBER
663 -- x_schedule_start_date               OUT DATE
664 -- x_schedule_finish_date              OUT DATE
665 -- x_schedule_as_of_date               OUT DATE
666 -- x_schedule_duration                 OUT NUMBER
667 PROCEDURE GET_STRUCT_SCHEDULE_DATES
668 (  p_structure_version_id	    IN NUMBER
669   ,x_schedule_start_date           OUT NOCOPY DATE --File.Sql.39 bug 4440895
670   ,x_schedule_finish_date          OUT NOCOPY DATE --File.Sql.39 bug 4440895
671   ,x_schedule_as_of_date           OUT NOCOPY DATE --File.Sql.39 bug 4440895
672   ,x_schedule_duration             OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
673 )
674 IS
675   CURSOR get_sch_dates_csr
676   IS
677   SELECT scheduled_start_date,
678          scheduled_finish_date,
679          last_update_date,
680          pa_proj_elements_utils.convert_hr_to_days(duration)
681   FROM PA_PROJ_ELEM_VER_SCHEDULE
682   WHERE element_version_id = p_structure_version_id;
683 
684   l_scheduled_start_date      DATE;
685   l_scheduled_finish_date     DATE;
686   l_schedule_as_of_date       DATE;
687   l_schedule_duration         NUMBER;
688 
689 BEGIN
690   OPEN get_sch_dates_csr;
691   FETCH get_sch_dates_csr
692   INTO l_scheduled_start_date,
693        l_scheduled_finish_date,
694        l_schedule_as_of_date,
695        l_schedule_duration;
696   IF get_sch_dates_csr%NOTFOUND then
697     CLOSE get_sch_dates_csr;
698      x_schedule_start_date := NULL;
699      x_schedule_finish_date := NULL;
700      x_schedule_as_of_date := NULL;
701      x_schedule_duration := NULL;
702     return;
703   ELSE
704     CLOSE get_sch_dates_csr;
705      x_schedule_start_date := l_scheduled_start_date;
706      x_schedule_finish_date := l_scheduled_finish_date;
707      x_schedule_as_of_date := l_schedule_as_of_date;
708      x_schedule_duration := l_schedule_duration;
709   END IF;
710 
711 EXCEPTION
712    when OTHERS then
713      x_schedule_start_date := NULL;
714      x_schedule_finish_date := NULL;
715      x_schedule_as_of_date := NULL;
716      x_schedule_duration := NULL;
717 END GET_STRUCT_SCHEDULE_DATES;
718 
719 -- API name		: Get_Project_Start_Date_Src
720 -- Type			: Utility
721 -- Pre-reqs		: None.
722 -- Parameters           :
723 -- p_project_id                    IN NUMBER
724 
725 FUNCTION GET_PROJECT_START_DATE_SRC
726 (  p_project_id                    IN NUMBER
727 ) RETURN VARCHAR2
728 IS
729    l_target_start_date   DATE;
730    l_scheduled_start_date DATE;
731    l_actual_start_date    DATE;
732 
733    CURSOR get_dates_csr
734    IS
735    SELECT target_start_date, scheduled_start_date, actual_start_date
736    FROM PA_PROJECTS_ALL
737    WHERE project_id = p_project_id;
738 
739 BEGIN
740 
741    OPEN get_dates_csr;
742    FETCH get_dates_csr INTO l_target_start_date, l_scheduled_start_date, l_actual_start_date;
743    CLOSE get_dates_csr;
744 
745    IF l_actual_start_date IS NULL THEN
746       IF l_scheduled_start_date IS NULL THEN
747          return 'T';
748       ELSE
749          return 'S';
750       END IF;
751    ELSE
752       return 'A';
753    END IF;
754 
755 EXCEPTION
759 
756    when OTHERS then
757      return NULL;
758 END GET_PROJECT_START_DATE_SRC;
760 
761 
762 -- API name		: Get_Project_Finish_Date_Src
763 -- Type			: Utility
764 -- Pre-reqs		: None.
765 -- Parameters           :
766 -- p_project_id                    IN NUMBER
767 
768 FUNCTION GET_PROJECT_FINISH_DATE_SRC
769 (  p_project_id                    IN NUMBER
770 ) RETURN VARCHAR2
771 IS
772    l_target_finish_date   DATE;
773    l_scheduled_finish_date DATE;
774    l_actual_finish_date    DATE;
775 
776    CURSOR get_dates_csr
777    IS
778    SELECT target_finish_date, scheduled_finish_date, actual_finish_date
779    FROM PA_PROJECTS_ALL
780    WHERE project_id = p_project_id;
781 
782 BEGIN
783 
784    OPEN get_dates_csr;
785    FETCH get_dates_csr INTO l_target_finish_date, l_scheduled_finish_date, l_actual_finish_date;
786    CLOSE get_dates_csr;
787 
788    IF l_actual_finish_date IS NULL THEN
789       IF l_scheduled_finish_date IS NULL THEN
790          return 'T';
791       ELSE
792          return 'S';
793       END IF;
794    ELSE
795       return 'A';
796    END IF;
797 
798 EXCEPTION
799    when OTHERS then
800      return NULL;
801 END GET_PROJECT_FINISH_DATE_SRC;
802 
803 -- API name             : chek_all_tsk_have_act_fin_dt
804 -- Type                 : Utility
805 -- Pre-reqs             : None.
806 -- Parameters           :
807 -- p_project_id           IN NUMBER
808 -- Description          : This API returns 'N' if any of the tasks in the structure version does not have actual finish date.
809 
810 FUNCTION chek_all_tsk_have_act_fin_dt
811 (  p_project_id                           IN NUMBER,
812    p_parent_structure_version_id          IN NUMBER
813 ) RETURN VARCHAR2 AS
814 
815  CURSOR cur_chk_act_fin_dt
816  IS
817   SELECT 'x'
818   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
819        PA_PROJ_ELEMENT_VERSIONS b
820   WHERE b.parent_structure_version_id = p_parent_structure_version_id
821   AND   b.project_id = p_project_id
822   AND   b.proj_element_id = a.proj_element_id
823   AND   b.element_version_id = a.element_version_id
824   AND a.actual_finish_date IS NULL
825   ;
826   l_dummy  VARCHAR2(1);
827 BEGIN
828     OPEN cur_chk_act_fin_dt;
829     FETCH cur_chk_act_fin_dt INTO l_dummy;
830     IF cur_chk_act_fin_dt%FOUND
831     THEN
832        return 'N';
833     ELSE
834        return 'Y';
835     END IF;
836 
837 EXCEPTION
838    when OTHERS then
839      return NULL;
840 end chek_all_tsk_have_act_fin_dt;
841 
842 -- API name             : chek_one_task_has_act_st_date
843 -- Type                 : Utility
844 -- Pre-reqs             : None.
845 -- Parameters           :
846 -- p_project_id           IN NUMBER
847 -- Description          : This API checks and returns 'Y' if any of the task has actual start date.
848 
849 FUNCTION chek_one_task_has_act_st_date
850 (  p_project_id                           IN NUMBER,
851    p_parent_structure_version_id          IN NUMBER
852 ) RETURN VARCHAR2 AS
853 
854 CURSOR cur_chk_act_fin_dt
855  IS
856   SELECT 'x'
857   FROM PA_PROJ_ELEM_VER_SCHEDULE a,
858        PA_PROJ_ELEMENT_VERSIONS b
859   WHERE b.parent_structure_version_id = p_parent_structure_version_id
860   AND   b.project_id = p_project_id
861   AND   b.proj_element_id = a.proj_element_id
862   AND   b.element_version_id = a.element_version_id
863   AND a.actual_start_date IS NOT NULL
864   ;
865   l_dummy  VARCHAR2(1);
866 BEGIN
867     OPEN cur_chk_act_fin_dt;
868     FETCH cur_chk_act_fin_dt INTO l_dummy;
869     IF cur_chk_act_fin_dt%FOUND
870     THEN
871        return 'Y';
872     ELSE
873        return 'N';
874     END IF;
875 
876 EXCEPTION
877    when OTHERS then
878      return NULL;
879 end chek_one_task_has_act_st_date;
880 
881 /*============Bug 6511907:PJR DATE VALIDATION ENHANCEMENT=======START=======*/
882 
883 /* ===============================================
884    Validates the Project Transaction start and end dates against
885    Resource Assignment/Requirement Least and Most dates.
886    x_start_date_status/x_end_date_status: V-->Valid, I-->Invalid.
887    x_validate: W/Y/N --> Warning/Yes/No.
888    ================================================ */
889 
890 PROCEDURE Validate_Project_Dates(p_project_id IN NUMBER,
891                                  p_start_date IN DATE,
892 				 p_end_date IN DATE,
893 				 x_validate OUT NOCOPY VARCHAR2,
894 				 x_start_date_status OUT NOCOPY VARCHAR2,
895 				 x_end_date_status   OUT NOCOPY VARCHAR2)
896 
897 IS
898 	l_res_min_date          DATE;
899 	l_res_max_date          DATE;
900 	l_tsk_min_date          DATE; -- Added for bug6866666
901 	l_tsk_max_date          DATE; -- Added for bug6866666
902 	l_validate              DATE;
903 
904 	CURSOR l_res_dt_minmax_csr (l_proj_id NUMBER)
905 	IS
906 	SELECT min(start_date), max(end_date)
907 	FROM   pa_project_assignments
908 	WHERE  project_id = l_proj_id
909 	AND    assignment_type IN ('OPEN_ASSIGNMENT', 'STAFFED_ASSIGNMENT');
910 
911     CURSOR l_tsk_dt_minmax_csr (l_proj_id NUMBER) -- Added for bug6866666
912 	IS
913 	SELECT min(start_date), max(completion_date)
914 	FROM   pa_tasks
918 
915 	WHERE  project_id = l_proj_id;
916 
917 BEGIN
919    OPEN  l_res_dt_minmax_csr(p_project_id);
920    FETCH l_res_dt_minmax_csr INTO l_res_min_date, l_res_max_date;
921    CLOSE l_res_dt_minmax_csr;
922 
923    x_validate := FND_PROFILE.value('PA_VALIDATE_ASSIGN_DATES');
924    x_start_date_status := 'V';
925    x_end_date_status   := 'V';
926 
927    IF NVL(x_validate,'N') in ('Y','W') THEN
928       IF p_start_date IS NOT NULL THEN
929           IF p_start_date > l_res_min_date THEN
930             x_start_date_status  := 'I';
931           END IF;
932       END IF;
933 
934       IF p_end_date IS NOT NULL THEN
935           IF p_end_date < l_res_max_date THEN
936             x_end_date_status    := 'I';
937           END IF;
938        END IF;
939    END IF;
940 
941    -- Added for bug6866666 Start
942    OPEN  l_tsk_dt_minmax_csr(p_project_id);
943    FETCH l_tsk_dt_minmax_csr INTO l_tsk_min_date, l_tsk_max_date;
944    CLOSE l_tsk_dt_minmax_csr;
945 
946    IF p_start_date IS NOT NULL THEN
947        IF p_start_date > l_tsk_min_date THEN
948           x_start_date_status  := 'J';
949        END IF;
950    END IF;
951 
952    IF p_end_date IS NOT NULL THEN
953        IF p_end_date < l_tsk_max_date THEN
954           x_end_date_status    := 'J';
955        END IF;
956    END IF;
957    -- Added for bug6866666 End
958 
959 EXCEPTION
960 
961    when OTHERS then
962      return;
963 
964 END Validate_Project_Dates;
965 
966 /* ===============================================
967    Bug 6860603: For work plan publish flow:
968    Validates the Project Transaction start and end dates against
969    Resource Assignment/Requirement Least and Most dates.
970    x_start_date_status/x_end_date_status: V-->Valid, I-->Invalid.
971    x_validate: W/Y/N --> Warning/Yes/No.
972    ================================================ */
973 
974 PROCEDURE WPP_Validate_Project_Dates
975    (p_project_id IN NUMBER,
976     p_start_date IN DATE,
977 	p_end_date IN DATE,
978 	p_alwd_start_date OUT NOCOPY DATE,
979 	p_alwd_end_date OUT NOCOPY DATE,
980 	p_res_min_date OUT NOCOPY DATE,
981 	p_res_max_date OUT NOCOPY DATE,
982 	x_validate OUT NOCOPY VARCHAR2,
983 	x_start_date_status OUT NOCOPY VARCHAR2,
984 	x_end_date_status   OUT NOCOPY VARCHAR2)
985 
986 IS
987 	l_res_min_date          DATE;
988 	l_res_max_date          DATE;
989 	l_tsk_min_date          DATE; -- Added for bug6866666
990 	l_tsk_max_date          DATE; -- Added for bug6866666
991 	l_validate              DATE;
992 	l_structure_id          NUMBER;
993     l_structure_ver_id      NUMBER;
994     l_buffer                NUMBER;
995 
996 
997 	CURSOR l_res_dt_minmax_csr (l_proj_id NUMBER)
998 	IS
999 	SELECT min(start_date), max(end_date)
1000 	FROM   pa_project_assignments
1001 	WHERE  project_id = l_proj_id
1002 	AND    assignment_type IN ('OPEN_ASSIGNMENT', 'STAFFED_ASSIGNMENT');
1003 
1004    CURSOR get_structure
1005    IS
1006    SELECT a.proj_element_id
1007    FROM pa_proj_elements a,
1008         pa_proj_structure_types b,
1009         pa_structure_types c
1010    WHERE a.proj_element_id = b.proj_element_id
1011    AND a.object_type = 'PA_STRUCTURES'
1012    AND a.project_id = p_project_id
1013    AND b.structure_type_id = c.structure_type_id
1014    AND c.structure_type = 'WORKPLAN';
1015 
1016    CURSOR get_latest_struct_ver(c_structure_id NUMBER)
1017    IS
1018    select element_version_id
1019    from pa_proj_elem_ver_structure
1020    where project_id = p_project_id
1021    and proj_element_id = c_structure_id
1022    and status_code = 'STRUCTURE_PUBLISHED'
1023    and latest_eff_published_flag = 'Y';
1024 
1025    CURSOR get_work_struct_ver(c_structure_id NUMBER)
1026    IS
1027    SELECT element_version_id
1028    from pa_proj_elem_ver_structure
1029    where project_id = p_project_id
1030    and proj_element_id = c_structure_id
1031    and status_code <> 'STRUCTURE_PUBLISHED';
1032 
1033    CURSOR get_buffer(c_structure_id NUMBER) IS
1034      SELECT NVL(TXN_DATE_SYNC_BUF_DAYS,0)
1035      FROM PA_PROJ_WORKPLAN_ATTR
1036      WHERE PROJ_ELEMENT_ID = c_structure_id;
1037 
1038 BEGIN
1039 
1040 /* Getting the Buffer Period*/
1041 
1042   OPEN get_structure;
1043    FETCH get_structure into l_structure_id;
1044    CLOSE get_structure;
1045 
1046    IF ('Y' = PA_PROJECT_STRUCTURE_UTILS.CHECK_PUBLISHED_VER_EXISTS(
1047                               p_project_id, l_structure_id)) THEN
1048      --Get latest published version id
1049      OPEN get_latest_struct_ver(l_structure_id);
1050      FETCH get_latest_struct_ver into l_structure_ver_id;
1051      CLOSE get_latest_struct_ver;
1052    ELSE
1053      --Get working version id
1054      --this should only return 1 row because this is only called when
1055      --  when structure is of both workplan and financial type
1056      OPEN get_work_struct_ver(l_structure_id);
1057      FETCH get_work_struct_ver into l_structure_ver_id;
1058      CLOSE get_work_struct_ver;
1059    END IF;
1060 
1061    --Get buffer from workplan table
1062    OPEN get_buffer(l_structure_id);
1063    FETCH get_buffer into l_buffer;
1064    CLOSE get_buffer;
1065 
1066 
1067 
1068 
1069 /* Validation of resource assignment dates against project transaction dates*/
1070 
1071    OPEN  l_res_dt_minmax_csr(p_project_id);
1072    FETCH l_res_dt_minmax_csr INTO l_res_min_date, l_res_max_date;
1073    CLOSE l_res_dt_minmax_csr;
1074 
1078    p_res_max_date:=l_res_max_date;
1075    p_alwd_start_date := l_res_min_date+l_buffer;
1076    p_alwd_end_date := l_res_max_date-l_buffer;
1077    p_res_min_date:=l_res_min_date;
1079 
1080 
1081 
1082    x_validate := FND_PROFILE.value('PA_VALIDATE_ASSIGN_DATES');
1083    x_start_date_status := 'V';
1084    x_end_date_status   := 'V';
1085 
1086    IF NVL(x_validate,'N') in ('Y','W') THEN
1087       IF p_start_date IS NOT NULL THEN
1088           IF p_start_date > l_res_min_date THEN
1089             x_start_date_status  := 'I';
1090           END IF;
1091       END IF;
1092 
1093       IF p_end_date IS NOT NULL THEN
1094           IF p_end_date < l_res_max_date THEN
1095             x_end_date_status    := 'I';
1096           END IF;
1097        END IF;
1098    END IF;
1099 
1100 
1101 
1102 EXCEPTION
1103 
1104    when OTHERS then
1105      return;
1106 
1107 END WPP_Validate_Project_Dates;
1108 
1109 
1110  /* =============================================
1111     Validates the Resource Req/Assign start and end dates
1112     against Project Transaction Start and End dates.
1113     x_start_date_status/ x_end_date_status:V-->Valid, I-->Invalid.
1114     x_validate: W/Y/N --> Warning/Yes/No.
1115     ============================================= */
1116 
1117 PROCEDURE Validate_Resource_Dates(p_project_id IN NUMBER,
1118                                   p_start_date IN OUT NOCOPY DATE,
1119 				                  p_end_date IN OUT NOCOPY DATE,
1120 				                  x_validate OUT NOCOPY VARCHAR2,
1121 				                  x_start_date_status OUT NOCOPY VARCHAR2,
1122 				                  x_end_date_status   OUT NOCOPY VARCHAR2)
1123 
1124 IS
1125 	l_prj_min_date          DATE;
1126 	l_prj_max_date          DATE;
1127 	l_validate              DATE;
1128 
1129 	CURSOR l_prj_dt_minmax_csr (l_proj_id NUMBER)
1130 	IS
1131 	SELECT start_date, completion_date
1132 	FROM   pa_projects_all
1133 	WHERE  project_id = l_proj_id ;
1134 
1135 BEGIN
1136 
1137 
1138 
1139    OPEN  l_prj_dt_minmax_csr(p_project_id);
1140    FETCH l_prj_dt_minmax_csr INTO l_prj_min_date, l_prj_max_date;
1141    CLOSE l_prj_dt_minmax_csr;
1142 
1143    x_validate := FND_PROFILE.value('PA_VALIDATE_ASSIGN_DATES');
1144    x_start_date_status := 'V';
1145    x_end_date_status   := 'V';
1146 
1147     IF NVL(x_validate,'N') in ('Y','W') THEN
1148 
1149         IF p_start_date IS NOT NULL THEN
1150           IF p_start_date < l_prj_min_date THEN
1151             x_start_date_status  := 'I';
1152           END IF;
1153         END IF;
1154 
1155         IF p_end_date IS NOT NULL THEN
1156           IF p_end_date > l_prj_max_date THEN
1157             x_end_date_status    := 'I';
1158           END IF;
1159         END IF;
1160 
1161     END IF;
1162 
1163 EXCEPTION
1164 
1165    when OTHERS then
1166      return;
1167 
1168 END;
1169 
1170 
1171 /**
1172 @author NISINHA
1173 Procedure VALIDATE_ASSIGNMENT_DATES_BULK
1174 Description : This procedure is used to validate the dates of Assignments when updated from the Updatable Scheduled People Page
1175 */
1176 
1177 PROCEDURE VALIDATE_ASSIGNMENT_DATES_BULK
1178                                  (p_project_id_tbl        IN                   SYSTEM.PA_NUM_TBL_TYPE,
1179                                   p_start_date_tbl        IN OUT NOCOPY        SYSTEM.PA_DATE_TBL_TYPE,
1180 				  p_end_date_tbl          IN OUT NOCOPY        SYSTEM.PA_DATE_TBL_TYPE,
1181 				  x_validate_tbl          IN OUT NOCOPY        SYSTEM.PA_VARCHAR2_2000_TBL_TYPE,
1182 				  x_start_date_status_tbl OUT NOCOPY           SYSTEM.PA_VARCHAR2_2000_TBL_TYPE,
1183 				  x_end_date_status_tbl   OUT NOCOPY           SYSTEM.PA_VARCHAR2_2000_TBL_TYPE,
1184 				  x_msg_data_tbl          OUT NOCOPY           SYSTEM.PA_VARCHAR2_2000_TBL_TYPE)
1185 
1186 IS
1187          	l_prj_min_date          DATE;
1188         	l_prj_max_date          DATE;
1189         	l_start_date            Date;
1190         	l_completion_date       Date;
1191 
1192         	CURSOR l_prj_dt_minmax_csr (l_proj_id NUMBER)
1193         	IS
1194 	        SELECT start_date, completion_date
1195 	        FROM   pa_projects_all
1196 	        WHERE  project_id = l_proj_id ;
1197 
1198         l_validate VARCHAR2 (2000);
1199         l_validate_tbl            SYSTEM.PA_VARCHAR2_2000_TBL_TYPE := x_validate_tbl;
1200         l_start_date_status_tbl   SYSTEM.PA_VARCHAR2_2000_TBL_TYPE := x_validate_tbl;
1201         l_end_date_status_tbl     SYSTEM.PA_VARCHAR2_2000_TBL_TYPE := x_validate_tbl;
1202         l_msg_data_tbl            SYSTEM.PA_VARCHAR2_2000_TBL_TYPE := x_validate_tbl;
1203 
1204         l_valid_assign_start_flag  VARCHAR2(1) := 'Y';
1205 
1206 BEGIN
1207 
1208 
1209      fnd_msg_pub.initialize;
1210      l_validate := FND_PROFILE.Value('PA_VALIDATE_ASSIGN_DATES');   -- This profile option is for only validating the assignment dates against project dates
1211 
1212      FOR  i IN  p_project_id_tbl.first .. p_project_id_tbl.last LOOP
1213 
1214           l_validate_tbl(i)          := NULL ;
1215           l_start_date_status_tbl(i) := NULL ;
1216           l_end_date_status_tbl(i)   := NULL ;
1217           l_msg_data_tbl(i)          := NULL ;
1218 
1219 
1220 
1221           IF  p_project_id_tbl(i) IS  NOT  NULL  THEN
1222 
1223                 OPEN  l_prj_dt_minmax_csr(p_project_id_tbl(i));
1224                 FETCH l_prj_dt_minmax_csr INTO l_prj_min_date, l_prj_max_date;
1225                 CLOSE l_prj_dt_minmax_csr;
1226 
1227 
1228                 l_validate_tbl(i) := l_validate;
1232                                    -- This new condition sets the status as G indicating that Start date is greater than End date.
1229                 l_start_date_status_tbl(i) := 'V';
1230                 l_end_date_status_tbl(i)   := 'V';
1231 
1233                    IF p_start_date_tbl(i) IS NOT NULL AND p_end_date_tbl(i) IS NOT NULL THEN
1234                        IF p_start_date_tbl(i) > p_end_date_tbl(i) THEN
1235 
1236                                   l_start_date_status_tbl(i)  := 'G';
1237                                   l_msg_data_tbl(i) := 'PA_INVALID_START_DATE';
1238                                   PA_UTILS.Add_Message( p_app_short_name => 'PA',
1239 			                            p_msg_name       => 'PA_INVALID_START_DATE');
1240 
1241 
1242                        END IF;
1243                    END IF;
1244 
1245                IF NVL(l_validate_tbl(i),'N') in ('Y','W') THEN
1246                    IF p_start_date_tbl(i) IS NOT NULL THEN
1247                        IF p_start_date_tbl(i) < l_prj_min_date THEN
1248                                   l_start_date_status_tbl(i)  := 'I';
1249 
1250 
1251                        END IF;
1252                    END IF;
1253 
1254                    IF p_end_date_tbl(i) IS NOT NULL THEN
1255                        IF p_end_date_tbl(i) > l_prj_max_date THEN
1256                                   l_end_date_status_tbl(i)    := 'I';
1257 
1258 
1259                        END IF;
1260                    END IF;
1261 
1262 
1263 
1264                    l_valid_assign_start_flag := PA_PROJECT_DATES_UTILS.IS_VALID_ASSIGN_START_DATE
1265                                                            ( p_project_id        => p_project_id_tbl(i),
1266                                                              p_assign_start_date => p_start_date_tbl(i) ) ;
1267                    IF ( l_valid_assign_start_flag <> 'Y' ) THEN
1268                                   l_start_date_status_tbl(i)  := 'I';
1269                    END IF;
1270 
1271                END IF;
1272 
1273 	             IF  l_validate_tbl(i) = 'Y' THEN
1274 	                 SELECT  start_date, completion_date
1275 	                 INTO  l_start_date, l_completion_date
1276 	                 FROM   pa_projects_prm_v proj
1277 	                 WHERE  project_id = p_project_id_tbl(i);
1278 
1279 	                 IF  (l_start_date_status_tbl(i) = 'I' AND  l_start_date IS  NOT  NULL ) THEN
1280 	                      l_msg_data_tbl(i) := 'PA_PJR_DATE_START_ERROR';
1281 		      	            PA_UTILS.Add_Message( p_app_short_name => 'PA',
1282 			                            p_msg_name       => 'PA_PJR_DATE_START_ERROR',
1283                                   p_token1         => 'PROJ_TXN_START_DATE',
1284 			                            p_value1         => ' ');
1285 
1286 		               END  IF ;
1287 
1288    	               IF  (l_end_date_status_tbl(i) = 'I' AND  l_completion_date IS  NOT  NULL ) THEN
1289 	                      l_msg_data_tbl(i) := 'PA_PJR_DATE_FINISH_ERROR';
1290 		     	              PA_UTILS.Add_Message( p_app_short_name => 'PA',
1291 			                            p_msg_name       => 'PA_PJR_DATE_FINISH_ERROR',
1292                                   p_token1         => 'PROJ_TXN_END_DATE',
1293 		                            	p_value1         => ' ');
1294 
1295 	                 END  IF ;
1296 
1297 
1298                ELSIF  l_validate_tbl(i) = 'W' THEN
1299 	                IF  (l_start_date_status_tbl(i) = 'I') THEN
1300 	                      l_msg_data_tbl(i) := 'StartDateWarning';
1301                   END  IF ;
1302 
1303 	                IF  (l_end_date_status_tbl(i) = 'I') THEN
1304 	                      l_msg_data_tbl(i) := 'EndDateWarning';
1305 	                END  IF ;
1306 	             END  IF ;
1307 
1308           END  IF ;  -- p_project_id_tbl(i) is not null
1309 
1310      END  LOOP ;
1311 
1312      x_validate_tbl          := l_validate_tbl;
1313      x_start_date_status_tbl := l_start_date_status_tbl;
1314      x_end_date_status_tbl   := l_end_date_status_tbl;
1315      x_msg_data_tbl          := l_msg_data_tbl;
1316 
1317 
1318 EXCEPTION
1319 
1320      WHEN  OTHERS THEN
1321 
1322         RAISE ;
1323 
1324 END VALIDATE_ASSIGNMENT_DATES_BULK;
1325 
1326 
1327 /* END OF PROCEDURE VALIDATE_ASSIGNMENT_DATES_BULK */
1328 
1329 /*   Bug 7693634 start */
1330 
1331 PROCEDURE Validate_Resource_Dates_Bulk
1332                                  (p_project_id_tbl        IN                   SYSTEM.PA_NUM_TBL_TYPE,
1333                                   p_start_date_tbl        IN OUT NOCOPY        SYSTEM.PA_DATE_TBL_TYPE,
1334 				  p_end_date_tbl          IN OUT NOCOPY        SYSTEM.PA_DATE_TBL_TYPE,
1335 				  x_validate_tbl          IN OUT NOCOPY        SYSTEM.PA_VARCHAR2_2000_TBL_TYPE,
1336 				  x_start_date_status_tbl OUT NOCOPY           SYSTEM.PA_VARCHAR2_2000_TBL_TYPE,
1337 				  x_end_date_status_tbl   OUT NOCOPY           SYSTEM.PA_VARCHAR2_2000_TBL_TYPE,
1338 				  x_msg_data_tbl          OUT NOCOPY           SYSTEM.PA_VARCHAR2_2000_TBL_TYPE)
1339 
1340 IS
1341 	l_prj_min_date          DATE;
1342 	l_prj_max_date          DATE;
1343 	l_start_date            Date;
1344 	l_completion_date       Date;
1345 
1346 	CURSOR l_prj_dt_minmax_csr (l_proj_id NUMBER)
1347 	IS
1348 	SELECT start_date, completion_date
1349 	FROM   pa_projects_all
1350 	WHERE  project_id = l_proj_id ;
1351 
1352 l_validate varchar2(2000);
1353 l_validate_tbl            SYSTEM.PA_VARCHAR2_2000_TBL_TYPE := x_validate_tbl;
1354 l_start_date_status_tbl   SYSTEM.PA_VARCHAR2_2000_TBL_TYPE := x_validate_tbl;
1355 l_end_date_status_tbl     SYSTEM.PA_VARCHAR2_2000_TBL_TYPE := x_validate_tbl;
1356 l_msg_data_tbl            SYSTEM.PA_VARCHAR2_2000_TBL_TYPE := x_validate_tbl;
1357 
1361 
1358 l_valid_assign_start_flag  VARCHAR2(1) := 'Y';
1359 
1360 BEGIN
1362 
1363 fnd_msg_pub.initialize;  --  bug 8233045
1364 l_validate := FND_PROFILE.value('PA_VALIDATE_ASSIGN_DATES');
1365 
1366 for i in p_project_id_tbl.first .. p_project_id_tbl.last loop
1367 l_validate_tbl(i)          := null;
1368 l_start_date_status_tbl(i) := null;
1369 l_end_date_status_tbl(i)   := null;
1370 l_msg_data_tbl(i)          := null;
1371 
1372 
1373 
1374  if p_project_id_tbl(i) is not null THEN
1375 
1376    OPEN  l_prj_dt_minmax_csr(p_project_id_tbl(i));
1377    FETCH l_prj_dt_minmax_csr INTO l_prj_min_date, l_prj_max_date;
1378    CLOSE l_prj_dt_minmax_csr;
1379 
1380 
1381    l_validate_tbl(i) := l_validate;
1382    l_start_date_status_tbl(i) := 'V';
1383    l_end_date_status_tbl(i)   := 'V';
1384 
1385     IF NVL(l_validate_tbl(i),'N') in ('Y','W') THEN
1386 
1387         IF p_start_date_tbl(i) IS NOT NULL THEN
1388           IF p_start_date_tbl(i) < l_prj_min_date THEN
1389             l_start_date_status_tbl(i)  := 'I';
1390           END IF;
1391         END IF;
1392 
1393         IF p_end_date_tbl(i) IS NOT NULL THEN
1394           IF p_end_date_tbl(i) > l_prj_max_date THEN
1395             l_end_date_status_tbl(i)    := 'I';
1396           END IF;
1397         END IF;
1398 
1399        l_valid_assign_start_flag := PA_PROJECT_DATES_UTILS.IS_VALID_ASSIGN_START_DATE
1400                                  ( p_project_id        => p_project_id_tbl(i),
1401                                        p_assign_start_date => p_start_date_tbl(i) ) ;
1402 
1403        IF ( l_valid_assign_start_flag <> 'Y' ) THEN
1404           l_start_date_status_tbl(i)  := 'I';
1405        END IF;
1406 
1407     END IF;
1408 
1409 	if l_validate_tbl(i) = 'Y' then
1410 
1411 
1412 	     select start_date, completion_date
1413 	     into l_start_date, l_completion_date
1414 	     from pa_projects_prm_v proj
1415 	     where project_id = p_project_id_tbl(i);
1416 
1417 	     if (l_start_date_status_tbl(i) = 'I' and l_start_date is not null) then
1418 	        l_msg_data_tbl(i) := 'PA_PJR_DATE_START_ERROR';
1419 
1420 			PA_UTILS.Add_Message( p_app_short_name => 'PA',
1421 			p_msg_name       => 'PA_PJR_DATE_START_ERROR',
1422                         p_token1         => 'PROJ_TXN_START_DATE',
1423 			p_value1         => ' ');
1424 		end if;
1425 
1426    	     if (l_end_date_status_tbl(i) = 'I' and l_completion_date is not null) then
1427 	        l_msg_data_tbl(i) := 'PA_PJR_DATE_FINISH_ERROR';
1428 
1429 			PA_UTILS.Add_Message( p_app_short_name => 'PA',
1430 			p_msg_name       => 'PA_PJR_DATE_FINISH_ERROR',
1431                         p_token1         => 'PROJ_TXN_END_DATE',
1432 			p_value1         => ' ');
1433 	     end if;
1434 
1435     elsif l_validate_tbl(i) = 'W' then
1436 
1437 
1438 	     if (l_start_date_status_tbl(i) = 'I') then
1439 	        l_msg_data_tbl(i) := 'StartDateWarning';
1440 
1441 
1442 	     end if;
1443 
1444 	     if (l_end_date_status_tbl(i) = 'I') then
1445 	        l_msg_data_tbl(i) := 'EndDateWarning';
1446 
1447 	     end if;
1448 
1449 
1450 	end if;
1451 
1452  end if;  -- p_project_id_tbl(i) is not null
1453 
1454 end loop;
1455 
1456 x_validate_tbl          := l_validate_tbl;
1457 x_start_date_status_tbl := l_start_date_status_tbl;
1458 x_end_date_status_tbl   := l_end_date_status_tbl;
1459 x_msg_data_tbl          := l_msg_data_tbl;
1460 
1461 
1462 EXCEPTION
1463 
1464    when OTHERS THEN
1465 
1466      raise;
1467 
1468 END;
1469 
1470 /*  Bug 7693634 end */
1471 
1472 
1473  /* =============================================
1474     Validates the Template Teams start and end dates
1475     against Project Transaction Start and End dates.
1476     x_start_date_status/ x_end_date_status:V-->Valid, I-->Invalid.
1477     x_validate: W/Y/N --> Warning/Yes/No.
1478     ============================================= */
1479 
1480 
1481 PROCEDURE Validate_Template_Team_Dates
1482                 (p_project_id IN NUMBER,
1483                  p_template_id IN NUMBER,
1484 				 x_validate OUT NOCOPY VARCHAR2,
1485 				 x_start_date_status OUT NOCOPY VARCHAR2,
1486 				 x_end_date_status   OUT NOCOPY VARCHAR2)
1487 
1488 IS
1489 	l_template_min_date        DATE;
1490 	l_template_max_date        DATE;
1491 	l_validate                 Varchar2(10);
1492 
1493    	l_prj_min_date             DATE;
1494 	l_prj_max_date             DATE;
1495 
1496 	/*Fix for Bug 6856082 starts*/
1497 	l_team_start_date          DATE;
1498 	l_number_of_days           NUMBER;
1499 	/*Fix for Bug 6856082 ends*/
1500 
1501 	CURSOR l_prj_dt_minmax_csr (l_proj_id NUMBER)
1502 	IS
1503 	SELECT start_date, completion_date
1504 	FROM   pa_projects_all
1505 	WHERE  project_id = l_proj_id ;
1506 
1507 
1508     CURSOR l_templ_dt_minmax_csr (l_template_id NUMBER)
1509     IS
1510 	SELECT min(start_date), max(end_date)
1511 	FROM   pa_project_assignments
1512 	WHERE  assignment_template_id = l_template_id
1513         AND project_id IS NULL ; -- added this for bug 7638712
1514 
1515 	/*Fix for Bug 6856082 starts*/
1516 	CURSOR get_team_start_date(l_template_id  NUMBER) IS
1517 	SELECT team_start_date
1518 	FROM pa_team_templates
1519 	WHERE team_template_id = l_template_id;
1520 	/*Fix for Bug 6856082 ends*/
1521 BEGIN
1522 
1523    OPEN  l_prj_dt_minmax_csr(p_project_id);
1524    FETCH l_prj_dt_minmax_csr INTO l_prj_min_date, l_prj_max_date;
1525    CLOSE l_prj_dt_minmax_csr;
1529    CLOSE l_templ_dt_minmax_csr;
1526 
1527    OPEN  l_templ_dt_minmax_csr(p_template_id);
1528    FETCH l_templ_dt_minmax_csr INTO l_template_min_date, l_template_max_date;
1530 
1531    /*Fix for Bug 6856082 starts*/
1532    OPEN get_team_start_date(p_template_id);
1533    FETCH get_team_start_date INTO l_team_start_date;
1534    CLOSE get_team_start_date ;
1535 	/*Fix for Bug 6856082 ends*/
1536 
1537    l_validate := FND_PROFILE.value('PA_VALIDATE_ASSIGN_DATES');
1538    --l_validate := 'Y';
1539    x_validate := l_validate;
1540    x_start_date_status := 'V';
1541    x_end_date_status   := 'V';
1542 
1543    /*Fix for Bug 6856082 starts*/
1544    /* Recalc the start and end dates on the template */
1545 	l_number_of_days := l_prj_min_date - l_team_start_date;
1546 
1547            --determine the requirement's start and end dates by adding l_number_of_days to
1548            --the template requirement's start and end dates.
1549 	l_template_min_date := l_template_min_date + l_number_of_days ;
1550 	l_template_max_date := l_template_max_date + l_number_of_days ;
1551 
1552 	/*Fix for Bug 6856082 ends*/
1553 
1554     IF NVL(l_validate,'N') in ('Y','W') THEN
1555 
1556          IF l_template_min_date IS NOT NULL THEN
1557           IF l_template_min_date < l_prj_min_date THEN
1558             x_start_date_status  := 'I';
1559           END IF;
1560          END IF;
1561 
1562          IF l_template_max_date IS NOT NULL THEN
1563           IF l_template_max_date > l_prj_max_date THEN
1564             x_end_date_status    := 'I';
1565           END IF;
1566          END IF;
1567 
1568 
1569 
1570      END IF;
1571 
1572 EXCEPTION
1573 
1574    when OTHERS then
1575      return;
1576 
1577 END;
1578 
1579 /*============Bug 6511907:PJR DATE VALIDATION ENHANCEMENT=======END=======*/
1580 END PA_PROJECT_DATES_UTILS;