[Home] [Help]
PACKAGE BODY: APPS.PA_FORECAST_GRC_PVT
Source
1 PACKAGE BODY PA_FORECAST_GRC_PVT AS
2 /* $Header: PARFGRCB.pls 120.2 2005/08/24 04:13:25 avaithia noship $ */
3 --------------------------------------------------------------------------------------
4 -- Description This procedure will calculate the total possible
5 -- working hours of a person between the input start
6 -- date and end date.
7 -- Procedure Name Get_Resource_Capacity
8 -- Used Subprograms PA_SCHEDULE_PVT.get_resource_schedule
9 -- Input parameters Type Required Description
10 -- p_org_id NUMBER Yes Orgnization ID, to derive the
11 -- HR start date and end date
12 -- p_person_id NUMBER Yes Person ID, to derive the HR start
13 -- date and end date
14 -- p_start_date DATE Yes Start date of the person
15 -- p_end_date DATE Yew End date of the person
16 --
17 -- Output parameters Type Description
18 -- x_resource_capacity NUMBER The total hours a person could work between
19 -- p_start_date and p_end_date.
20 -- x_return_status VARCHAR2 The return status of this procedure
21 -------------------------------------------------------------------------------------------------------
22 PROCEDURE Get_Resource_Capacity (p_org_id IN NUMBER,
23 p_person_id IN NUMBER,
24 p_start_date IN DATE,
25 p_end_date IN DATE,
26 x_resource_capacity OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
27 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
28 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
29 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
30 )
31 IS
32
33 l_start_date DATE; --input start date
34 l_end_date DATE; --input end date
35
36 l_hr_start_date DATE; --HR start date
37 l_hr_end_date DATE; --HR end date
38
39 l_real_start_date DATE; --actual start date passed to get_resource_schedule
40 --API
41 l_real_end_date DATE; --actual end date passed to get_resource_schedule API
42
43 l_date DATE; --date variable
44 l_no_of_days NUMBER; --number of days between the l_real_start_date and
45 --l_real_end_date
46 i NUMBER; --loop variable
47 j NUMBER; --loop variable
48
49 l_resource_id NUMBER; --resource id
50 l_resource_type VARCHAR2(30); --resource type
51
52 l_no_of_hours NUMBER;
53 l_total_no_of_hours NUMBER;
54
55 l_x_return_status VARCHAR2(2);
56 l_msg_count number;
57 l_msg_data varchar2(80);
58
59
60 l_monday_hours NUMBER;
61 l_tuesday_hours NUMBER;
62 l_wednesday_hours NUMBER;
63 l_thursday_hours NUMBER;
64 l_friday_hours NUMBER;
65 l_saturday_hours NUMBER;
66 l_sunday_hours NUMBER;
67 l_sch_record_tab PA_SCHEDULE_GLOB.ScheduleTabTyp;
68
69 --Delcare a cursor to store the HR assignment start and end dates for the
70 --person
71
72 CURSOR c_assignment_dates IS
73 /* SELECT EFFECTIVE_START_DATE,EFFECTIVE_END_DATE
74 FROM per_assignments_f
75 WHERE person_id = p_person_id
76 AND organization_id = p_org_id
77 AND (((EFFECTIVE_END_DATE BETWEEN p_start_date AND p_end_date) OR
78 (EFFECTIVE_START_DATE BETWEEN p_start_date AND p_end_date))
79 OR ((p_start_date BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE)OR
80 (p_end_date BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE)));
81 */
82
83 SELECT RESOURCE_EFFECTIVE_START_DATE, RESOURCE_EFFECTIVE_END_DATE
84 FROM pa_resources_denorm
85 WHERE person_id = p_person_id
86 AND resource_organization_id = p_org_id
87 AND (((RESOURCE_EFFECTIVE_END_DATE BETWEEN p_start_date AND p_end_date) OR
88 (RESOURCE_EFFECTIVE_START_DATE BETWEEN p_start_date AND p_end_date))
89 OR ((p_start_date BETWEEN RESOURCE_EFFECTIVE_START_DATE AND RESOURCE_EFFECTIVE_END_DATE)OR
90 (p_end_date BETWEEN RESOURCE_EFFECTIVE_START_DATE AND RESOURCE_EFFECTIVE_END_DATE)));
91
92
93
94 BEGIN
95
96 --initialize
97 l_x_return_status := FND_API.G_RET_STS_SUCCESS;
98 l_no_of_hours := 0;
99 l_total_no_of_hours := 0;
100
101 --First derive the resource_id from person_id
102 SELECT resource_id
103 INTO l_resource_id
104 FROM pa_resource_txn_attributes
105 WHERE person_id = p_person_id;
106
107 --Set the resource_type
108 l_resource_type := 'PA_RESOURCE_ID';
109
110 --Open the cursor
111 OPEN c_assignment_dates;
112
113 --Do a fetch loop here to retrive the HR assignment start and end dates for a
114 --person
115 LOOP
116 FETCH c_assignment_dates
117 INTO l_hr_start_date, l_hr_end_date;
118
119 EXIT WHEN c_assignment_dates%NOTFOUND;
120
121 --Process the dates here
122 --Compare the p_start_date and p_end_date with l_hr_start_date and l_hr_end_date
123 IF (NOT (p_start_date >= l_hr_end_date OR
124 p_end_date <= l_hr_start_date)) THEN
125
126 --Condition 1
127 IF ( p_start_date >= l_hr_start_date AND p_end_date <= l_hr_end_date)
128 THEN
129 l_real_start_date := p_start_date;
130 l_real_end_date := p_end_date;
131
132 --Condition 2
133 ELSIF (p_start_date <= l_hr_start_date AND p_end_date >= l_hr_end_date)
134 THEN
135 l_real_start_date := l_hr_start_date;
136 l_real_end_date := l_hr_end_date;
137
138 --Condition 3
139 ELSIF ((p_start_date <= l_hr_start_date) AND (p_end_date <= l_hr_end_date
140 AND p_end_date >= l_hr_start_date)) THEN
141 l_real_start_date := l_hr_start_date;
142 l_real_end_date := p_end_date;
143
144 --Condition 4
145 ELSIF (p_start_date >= l_hr_start_date AND p_start_date <= l_hr_end_date)
146 AND p_end_date >= l_hr_end_date THEN
147 l_real_start_date := p_start_date;
148 l_real_end_date := l_hr_end_date;
149
150 END IF;
151
152 --CALL the get_resource_schedule API here
153 IF (l_x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
154 PA_SCHEDULE_PVT.get_resource_schedule(
155 p_source_id => l_resource_id,
156 p_source_type => l_resource_type,
157 p_start_date => l_real_start_date,
158 p_end_date => l_real_end_date,
159 x_sch_record_tab => l_sch_record_tab,
160 x_return_status => l_x_return_status,
161 x_msg_count => l_msg_count,
162 x_msg_data => l_msg_data);
163 l_date := l_real_start_date;
164 l_no_of_days := l_real_end_date - l_real_start_date + 1 ;
165 FOR i IN 1..l_no_of_days LOOP
166
167 FOR j IN l_sch_record_tab.first..l_sch_record_tab.last LOOP
168 IF (trunc(l_date) BETWEEN
169 trunc(l_sch_record_tab(j).start_date) AND
170 trunc(l_sch_record_tab(j).end_date)) THEN
171
172 IF TO_CHAR(l_date,'DY','NLS_DATE_LANGUAGE=AMERICAN')= 'MON' THEN
173 l_no_of_hours := l_no_of_hours + nvl(l_sch_record_tab(j).monday_hours,0);
174
175 ELSIF TO_CHAR(l_date, 'DY','NLS_DATE_LANGUAGE=AMERICAN') = 'TUE' THEN
176 l_no_of_hours := l_no_of_hours + nvl(l_sch_record_tab(j).tuesday_hours,0);
177
178 ELSIF TO_CHAR(l_date, 'DY','NLS_DATE_LANGUAGE=AMERICAN') = 'WED' THEN
179 l_no_of_hours := l_no_of_hours + nvl(l_sch_record_tab(j).wednesday_hours,0);
180
181 ELSIF TO_CHAR(l_date, 'DY','NLS_DATE_LANGUAGE=AMERICAN') = 'THU' THEN
182 l_no_of_hours := l_no_of_hours + nvl(l_sch_record_tab(j).thursday_hours,0);
183
184 ELSIF TO_CHAR(l_date, 'DY','NLS_DATE_LANGUAGE=AMERICAN') = 'FRI' THEN
185 l_no_of_hours := l_no_of_hours + nvl(l_sch_record_tab(j).friday_hours,0);
186
187 ELSIF TO_CHAR(l_date, 'DY','NLS_DATE_LANGUAGE=AMERICAN') = 'SAT' THEN
188 l_no_of_hours := l_no_of_hours + nvl(l_sch_record_tab(j).saturday_hours,0);
189
190 ELSIF TO_CHAR(l_date, 'DY','NLS_DATE_LANGUAGE=AMERICAN') = 'SUN' THEN
191 l_no_of_hours := l_no_of_hours + nvl(l_sch_record_tab(j).sunday_hours,0);
192
193 END IF;
194 END IF;
195 END LOOP;
196 l_date := l_date + 1 ;
197
198 --end for loop
199 END LOOP;
200
201 END IF;
202
203 --calculate the total hours
204 l_total_no_of_hours := l_total_no_of_hours + l_no_of_hours;
205
206 --end IF loop
207 END IF;
208 --end fetch loop
209 END LOOP;
210
211 CLOSE c_assignment_dates;
212
213 x_resource_capacity := l_total_no_of_hours;
214 x_return_status := l_x_return_status;
215
216 EXCEPTION
217 WHEN OTHERS THEN
218 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
219 x_msg_count := 1;
220 x_msg_data := SQLERRM;
221 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PA_FORECAST_GRC_PVT',
222 p_procedure_name => 'get_resource_capacity');
223 x_resource_capacity := NULL ; -- RESET the other OUT param also 4537865
224 END Get_Resource_Capacity;
225
226
227
228 ----------------------------------------------------------------------------------------
229 PROCEDURE Get_Capacity_Vector(p_OU_id IN NUMBER,
230 p_exp_org_id_tab IN PA_PLSQL_DATATYPES.IdTabTyp,
231 p_person_id_tab IN PA_PLSQL_DATATYPES.IdTabTyp,
232 p_resource_id_tab IN PA_PLSQL_DATATYPES.IdTabTyp,
233 p_in_res_eff_s_date_tab IN PA_PLSQL_DATATYPES.DateTabTyp,
234 p_in_res_eff_e_date_tab IN PA_PLSQL_DATATYPES.DateTabTyp,
235 p_balance_type_code IN VARCHAR2,
236 p_run_start_date IN DATE,
237 p_run_end_date IN DATE,
238 x_resource_capacity_tab OUT NOCOPY PA_PLSQL_DATATYPES.NumTabTyp, --File.Sql.39 bug 4440895
239 x_exp_orgz_id_tab OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp, --File.Sql.39 bug 4440895
240 x_person_id_tab OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp, --File.Sql.39 bug 4440895
241 x_period_type_tab OUT NOCOPY PA_PLSQL_DATATYPES.Char30TabTyp, --File.Sql.39 bug 4440895
242 x_period_name_tab OUT NOCOPY PA_PLSQL_DATATYPES.Char30TabTyp, --File.Sql.39 bug 4440895
243 x_global_exp_date_tab OUT NOCOPY PA_PLSQL_DATATYPES.DateTabTyp, --File.Sql.39 bug 4440895
244 x_period_year_tab OUT NOCOPY PA_PLSQL_DATATYPES.NumTabTyp, --File.Sql.39 bug 4440895
245 x_qm_number_tab OUT NOCOPY PA_PLSQL_DATATYPES.NumTabTyp, --File.Sql.39 bug 4440895
246 x_period_num_tab OUT NOCOPY PA_PLSQL_DATATYPES.NumTabTyp, --File.Sql.39 bug 4440895
247 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
248 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
249 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
250 )IS
251
252
253 l_OU_id NUMBER;
254 l_exp_orgz_id NUMBER;
255 l_person_id NUMBER;
256 l_balance_type_code VARCHAR2(30);
257 l_period_type VARCHAR2(30);
258 -- l_period_set_name VARCHAR2(30):=PA_REP_UTIL_GLOB.G_implementation_details.G_period_set_name;
259 l_gl_period_set_name VARCHAR2(30):=PA_REP_UTIL_GLOB.G_implementation_details.G_gl_period_set_name; -- bug 3434019
260 l_pa_period_set_name VARCHAR2(30):=PA_REP_UTIL_GLOB.G_implementation_details.G_pa_period_set_name; -- bug 3434019
261 l_period_name VARCHAR2(30);
262 l_GE_end_date DATE;
263 l_resource_capacity NUMBER;
264 l_period_balance NUMBER;
265 l_return_status VARCHAR2(2);
266 l_msg_count NUMBER;
267 l_msg_data VARCHAR2(80);
268 i NUMBER;
269
270 l_pa_period_flag pa_utilization_options.pa_period_flag%TYPE := pa_rep_util_glob.G_util_option_details.G_pa_period_flag;
271 l_gl_period_flag pa_utilization_options.gl_period_flag%TYPE := pa_rep_util_glob.G_util_option_details.G_gl_period_flag;
272 l_ge_period_flag pa_utilization_options.global_exp_period_flag%TYPE := pa_rep_util_glob.G_util_option_details.G_ge_period_flag;
273 l_pa_period_type pa_implementations.pa_period_type%TYPE := pa_rep_util_glob.G_implementation_details.G_pa_period_type;
274 l_gl_period_type gl_sets_of_books.accounted_period_type%TYPE := pa_rep_util_glob.G_implementation_details.G_gl_period_type;
275
276 -- l_global_week_start_day PLS_INTEGER := pa_rep_util_glob.G_global_week_start_day;
277
278 j NUMBER := 0;
279 jj NUMBER := 0;
280
281 -- Cursor to find the periods within PA
282 CURSOR PA_PERIODS_CUR is
283 SELECT
284 pglp.period_name AS PERIOD_NAME
285 ,pglp.start_date AS PERIOD_START_DATE
286 ,pglp.end_date AS PERIOD_END_DATE
287 ,pglp.period_year AS PERIOD_YEAR
288 ,pglp.quarter_num AS PERIOD_QUARTER
289 ,(pglp.period_year*10000) + pglp.period_num AS PERIOD_NUM
290 FROM gl_periods pglp
291 WHERE exists
292 (select null
293 from gl_date_period_map p
294 where pglp.period_set_name = p.period_set_name
295 -- and p.period_set_name = l_period_set_name
296 and p.period_set_name = l_pa_period_set_name -- bug 3434019
297 and p.period_type = l_pa_period_type
298 and pglp.period_name = p.period_name)
299 AND p_run_end_date >= pglp.start_date
300 AND p_run_start_date <= pglp.end_date
301 ;
302
303 -- Cursor to find the periods within GL
304 CURSOR GL_PERIODS_CUR is
305 SELECT
306 gglp.period_name AS PERIOD_NAME
307 ,gglp.start_date AS PERIOD_START_DATE
308 ,gglp.end_date AS PERIOD_END_DATE
309 ,gglp.period_year AS PERIOD_YEAR
310 ,gglp.quarter_num AS PERIOD_QUARTER
311 ,(gglp.period_year*10000) + gglp.period_num AS PERIOD_NUM
312 FROM gl_periods gglp
313 WHERE exists
314 (select null
315 from gl_date_period_map g
316 where gglp.period_set_name = g.period_set_name
317 -- and g.period_set_name = l_period_set_name
318 and g.period_set_name = l_gl_period_set_name -- bug 3434019
319 and g.period_type = l_gl_period_type
320 and gglp.period_name = g.period_name)
321 AND p_run_start_date <= gglp.end_date
322 AND p_run_end_date >= gglp.start_date
323 ;
324
325 CURSOR GE_PERIODS_CUR is
326 SELECT
327 period_year AS PERIOD_YEAR
328 ,mon_or_qtr AS PERIOD_MONTH
329 ,ge_week_dt AS GE_DATE
330 ,period_start_date AS PERIOD_START_DATE
331 FROM pa_rep_periods_v
332 WHERE period_type = 'GE'
333 AND p_run_start_date <= ge_week_dt
334 AND p_run_end_date >= period_start_date
335 AND to_number(to_char(ge_week_dt,'YYYY')) = period_year
336 ;
337
338 pa_periods_cur_rec PA_PERIODS_CUR%ROWTYPE;
339 gl_periods_cur_rec GL_PERIODS_CUR%ROWTYPE;
340 ge_periods_cur_rec GE_PERIODS_CUR%ROWTYPE;
341
342 start_date_to_be_used DATE;
343 end_date_to_be_used DATE;
344
345 BEGIN
346
347 -- 4537865 : Initialize return_status to Success
348 x_return_status := FND_API.G_RET_STS_SUCCESS;
349 l_return_status := FND_API.G_RET_STS_SUCCESS;
350 -- 4537865 : End
351
352 l_balance_type_code := p_balance_type_code;
353 l_OU_id := p_OU_id;
354
355 /*
356 * Clear all PL/SQL table.
357 */
358 PA_DEBUG.g_err_stage := 'Clearing all output PL/SQL Table';
359 PA_DEBUG.log_message(PA_DEBUG.g_err_stage);
360 x_resource_capacity_tab.delete;
361 x_exp_orgz_id_tab.delete;
362 x_person_id_tab.delete;
363 x_period_type_tab.delete;
364 x_period_name_tab.delete;
365 x_global_exp_date_tab.delete;
366 x_period_year_tab.delete;
367 x_qm_number_tab.delete;
368 x_period_num_tab.delete;
369
370
371 FOR i IN p_exp_org_id_tab.FIRST .. p_exp_org_id_tab.LAST LOOP
372 l_exp_orgz_id := p_exp_org_id_tab(i);
373 l_person_id := p_person_id_tab(i);
374
375
376
377 -- first loop through the PA periods available
378 IF l_pa_period_flag = 'Y' then
379 FOR pa_periods_cur_rec in PA_PERIODS_CUR LOOP
380 l_return_status := FND_API.G_RET_STS_SUCCESS;
381 IF (
382 ( p_in_res_eff_s_date_tab(i) >= pa_periods_cur_rec.PERIOD_START_DATE
383 and p_in_res_eff_s_date_tab(i) <= pa_periods_cur_rec.PERIOD_END_DATE )
384 OR
385 ( p_in_res_eff_e_date_tab(i) >= pa_periods_cur_rec.PERIOD_START_DATE
386 and p_in_res_eff_e_date_tab(i) <= pa_periods_cur_rec.PERIOD_END_DATE )
387 OR
388 ( pa_periods_cur_rec.PERIOD_START_DATE >= p_in_res_eff_s_date_tab(i)
389 and pa_periods_cur_rec.PERIOD_START_DATE <= p_in_res_eff_e_date_tab(i) )
390 ) THEN
391
392 /*
393 * Bug: 1781913
394 * The start and end dates to be used as inputs for get_resource_capacity
395 * should be such that :
396 * The start_date_to_be_used should be the latest of the following 3 dates:
397 * PERIOD_START_DATE
398 * p_in_res_eff_s_date_tab(i)
399 * p_run_start_date
400 * While the end_date_to_be_used should be the earliest of the following 3 dates:
401 * PERIOD_END_DATE
402 * p_in_res_eff_e_date_tab(i)
403 * p_run_end_date
404 */
405
406 start_date_to_be_used := GREATEST(pa_periods_cur_rec.PERIOD_START_DATE
407 , p_in_res_eff_s_date_tab(i)
408 , p_run_start_date);
409 end_date_to_be_used := LEAST(pa_periods_cur_rec.PERIOD_END_DATE
410 , p_in_res_eff_e_date_tab(i)
411 , p_run_end_date);
412
413 --get the resource capacity
414 --get the resource capacity
415 PA_FORECAST_GRC_PVT.get_resource_capacity(
416 p_org_id => l_exp_orgz_id,
417 p_person_id => l_person_id,
418 p_start_date => start_date_to_be_used,
419 p_end_date => end_date_to_be_used,
420 x_resource_capacity => l_resource_capacity,
421 x_return_status => l_return_status,
422 x_msg_count => l_msg_count,
423 x_msg_data => l_msg_data);
424
425 IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
426
427 --get the period_balance
428 begin
429 select bal.period_balance
430 into l_period_balance
431 from pa_objects obj,
432 pa_summ_balances bal
433 where obj.object_id = bal.object_id
434 and bal.version_id = -1
435 and bal.object_type_code = PA_REP_UTIL_GLOB.G_OBJ_TYPE_C.G_RES_C
436 and bal.period_type = l_pa_period_type
437 -- and bal.period_set_name = l_period_set_name
438 and bal.period_set_name = l_pa_period_set_name -- bug 3434019
439 and bal.period_name = pa_periods_cur_rec.PERIOD_NAME
440 and bal.global_exp_period_end_date = PA_REP_UTIL_GLOB.G_DUMMY_DATE_C
441 and bal.amount_type_id = PA_REP_UTIL_GLOB.G_amt_type_details.G_res_cap_id
442 and obj.object_type_code = PA_REP_UTIL_GLOB.G_OBJ_TYPE_C.G_RES_C
443 and obj.balance_type_code = l_balance_type_code
444 and obj.project_org_id = -1
445 and obj.project_organization_id = -1
446 and obj.project_id = -1
447 and obj.task_id = -1
448 and obj.expenditure_org_id = l_OU_id
449 and obj.expenditure_organization_id = l_exp_orgz_id
450 and obj.person_id = l_person_id
451 and obj.assignment_id = -1
452 and obj.work_type_id = -1
453 and obj.org_util_category_id = -1
454 and obj.res_util_category_id = -1
455 for update of bal.object_id;
456 exception
457 when no_data_found
458 then
459 l_period_balance := 0;
460 end;
461
462
463 x_resource_capacity_tab(j) := l_resource_capacity - l_period_balance;
464 x_exp_orgz_id_tab(j) := l_exp_orgz_id;
465 x_person_id_tab(j) := l_person_id;
466 x_period_type_tab(j) := PA_REP_UTIL_GLOB.G_PERIOD_TYPE_C.G_PA_C;
467 x_period_name_tab(j) := pa_periods_cur_rec.PERIOD_NAME;
468 x_global_exp_date_tab(j) := PA_REP_UTIL_GLOB.GetDummyDate;
469 x_period_year_tab(j) := pa_periods_cur_rec.PERIOD_YEAR;
470 x_qm_number_tab(j) := pa_periods_cur_rec.PERIOD_QUARTER;
471 x_period_num_tab(j) := pa_periods_cur_rec.PERIOD_NUM;
472
473 j := j+1;
474 jj := j;
475
476 END IF; -- PA_FORECAST_GRC_PVT.get_resource_capacity returns success
477
478 END IF; -- PA_FORECAST_GRC_PVT.checking date effectivity
479
480 END LOOP; -- PA_PERIODS_CUR loop
481
482 END IF; -- l_pa_period_flag = 'Y'
483
484 j := jj;
485
486 -- IF and loop for GL
487 IF l_gl_period_flag = 'Y' then
488 FOR gl_periods_cur_rec in GL_PERIODS_CUR LOOP
489 l_return_status := FND_API.G_RET_STS_SUCCESS;
490 IF (
491 ( p_in_res_eff_s_date_tab(i) >= gl_periods_cur_rec.PERIOD_START_DATE
492 and p_in_res_eff_s_date_tab(i) <= gl_periods_cur_rec.PERIOD_END_DATE )
493 OR
494 ( p_in_res_eff_e_date_tab(i) >= gl_periods_cur_rec.PERIOD_START_DATE
495 and p_in_res_eff_e_date_tab(i) <= gl_periods_cur_rec.PERIOD_END_DATE )
496 OR
497 ( gl_periods_cur_rec.PERIOD_START_DATE >= p_in_res_eff_s_date_tab(i)
498 and gl_periods_cur_rec.PERIOD_START_DATE <= p_in_res_eff_e_date_tab(i) )
499 ) THEN
500
501
502 start_date_to_be_used := GREATEST(gl_periods_cur_rec.PERIOD_START_DATE
503 , p_in_res_eff_s_date_tab(i)
504 , p_run_start_date);
505 end_date_to_be_used := LEAST(gl_periods_cur_rec.PERIOD_END_DATE
506 , p_in_res_eff_e_date_tab(i)
507 , p_run_end_date);
508
509 PA_FORECAST_GRC_PVT.get_resource_capacity(
510 p_org_id => l_exp_orgz_id,
511 p_person_id => l_person_id,
512 p_start_date => start_date_to_be_used,
513 p_end_date => end_date_to_be_used,
514 x_resource_capacity => l_resource_capacity,
515 x_return_status => l_return_status,
516 x_msg_count => l_msg_count,
517 x_msg_data => l_msg_data);
518
519 IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
520
521 --get the period_balance
522 begin
523 select bal.period_balance
524 into l_period_balance
525 from pa_objects obj,
526 pa_summ_balances bal
527 where obj.object_id = bal.object_id
528 and bal.version_id = -1
529 and bal.object_type_code = PA_REP_UTIL_GLOB.G_OBJ_TYPE_C.G_RES_C
530 and bal.period_type = l_gl_period_type
531 -- and bal.period_set_name = l_period_set_name
532 and bal.period_set_name = l_gl_period_set_name -- bug 3434019
533 and bal.period_name = gl_periods_cur_rec.PERIOD_NAME
534 and bal.global_exp_period_end_date = PA_REP_UTIL_GLOB.G_DUMMY_DATE_C
535 and bal.amount_type_id = PA_REP_UTIL_GLOB.G_amt_type_details.G_res_cap_id
536 and obj.object_type_code = PA_REP_UTIL_GLOB.G_OBJ_TYPE_C.G_RES_C
537 and obj.balance_type_code = l_balance_type_code
538 and obj.project_org_id = -1
539 and obj.project_organization_id = -1
540 and obj.project_id = -1
541 and obj.task_id = -1
542 and obj.expenditure_org_id = l_OU_id
543 and obj.expenditure_organization_id = l_exp_orgz_id
544 and obj.person_id = l_person_id
545 and obj.assignment_id = -1
546 and obj.work_type_id = -1
547 and obj.org_util_category_id = -1
548 and obj.res_util_category_id = -1
549 for update of bal.object_id;
550 exception
551 when no_data_found
552 then
553 l_period_balance := 0;
554 end;
555
556
557 x_resource_capacity_tab(j) := l_resource_capacity - l_period_balance;
558 x_exp_orgz_id_tab(j) := l_exp_orgz_id;
559 x_person_id_tab(j) := l_person_id;
560 x_period_type_tab(j) := PA_REP_UTIL_GLOB.G_PERIOD_TYPE_C.G_GL_C;
561 x_period_name_tab(j) := gl_periods_cur_rec.PERIOD_NAME;
562 x_global_exp_date_tab(j) := PA_REP_UTIL_GLOB.GetDummyDate;
563 x_period_year_tab(j) := gl_periods_cur_rec.PERIOD_YEAR;
564 x_qm_number_tab(j) := gl_periods_cur_rec.PERIOD_QUARTER;
565 x_period_num_tab(j) := gl_periods_cur_rec.PERIOD_NUM;
566
567 j := j+1;
568 jj := j;
569
570 END IF; -- PA_FORECAST_GRC_PVT.get_resource_capacity returns success
571
572 END IF; -- PA_FORECAST_GRC_PVT.checking date effectivity
573
574 END LOOP; -- GL_PERIODS_CUR loop
575
576 END IF; -- l_gl_period_flag = 'Y
577
578 j := jj;
579
580
581 -- IF and loop for GE
582 IF l_ge_period_flag = 'Y' then
583 FOR ge_periods_cur_rec in GE_PERIODS_CUR LOOP
584 l_return_status := FND_API.G_RET_STS_SUCCESS;
585 IF (
586 ( p_in_res_eff_s_date_tab(i) >= ge_periods_cur_rec.PERIOD_START_DATE
587 and p_in_res_eff_s_date_tab(i) <= ge_periods_cur_rec.GE_DATE )
588 OR
589 ( p_in_res_eff_e_date_tab(i) >= ge_periods_cur_rec.PERIOD_START_DATE
590 and p_in_res_eff_e_date_tab(i) <= ge_periods_cur_rec.GE_DATE )
591 OR
592 ( ge_periods_cur_rec.PERIOD_START_DATE >= p_in_res_eff_s_date_tab(i)
593 and ge_periods_cur_rec.PERIOD_START_DATE <= p_in_res_eff_e_date_tab(i) )
594 ) THEN
595
596
597 start_date_to_be_used := GREATEST(ge_periods_cur_rec.PERIOD_START_DATE
598 , p_in_res_eff_s_date_tab(i)
599 , p_run_start_date);
600 end_date_to_be_used := LEAST(ge_periods_cur_rec.GE_DATE
601 , p_in_res_eff_e_date_tab(i)
602 , p_run_end_date);
603
604 PA_FORECAST_GRC_PVT.get_resource_capacity(
605 p_org_id => l_exp_orgz_id,
606 p_person_id => l_person_id,
607 p_start_date => start_date_to_be_used,
608 p_end_date => end_date_to_be_used,
609 x_resource_capacity => l_resource_capacity,
610 x_return_status => l_return_status,
611 x_msg_count => l_msg_count,
612 x_msg_data => l_msg_data);
613
614 IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
615
616 --get the period_balance
617 begin
618 select bal.period_balance
619 into l_period_balance
620 from pa_objects obj,
621 pa_summ_balances bal
622 where obj.object_id = bal.object_id
623 and bal.version_id = -1
624 and bal.object_type_code = PA_REP_UTIL_GLOB.G_OBJ_TYPE_C.G_RES_C
625 and bal.period_type = 'GE'
626 -- and bal.period_set_name = l_period_set_name
627 and bal.period_set_name = PA_REP_UTIL_GLOB.G_DUMMY_C --bug 3434019
628 and bal.period_name = PA_REP_UTIL_GLOB.G_DUMMY_C
629 and bal.global_exp_period_end_date = PA_REP_UTIL_GLOB.G_DUMMY_DATE_C
630 and bal.amount_type_id = PA_REP_UTIL_GLOB.G_amt_type_details.G_res_cap_id
631 and obj.object_type_code = PA_REP_UTIL_GLOB.G_OBJ_TYPE_C.G_RES_C
632 and obj.balance_type_code = l_balance_type_code
633 and obj.project_org_id = -1
634 and obj.project_organization_id = -1
635 and obj.project_id = -1
636 and obj.task_id = -1
637 and obj.expenditure_org_id = l_OU_id
638 and obj.expenditure_organization_id = l_exp_orgz_id
639 and obj.person_id = l_person_id
640 and obj.assignment_id = -1
641 and obj.work_type_id = -1
642 and obj.org_util_category_id = -1
643 and obj.res_util_category_id = -1
644 for update of bal.object_id;
645 exception
646 when no_data_found
647 then
648 l_period_balance := 0;
649 end;
650
651
652 x_resource_capacity_tab(j) := l_resource_capacity - l_period_balance;
653 x_exp_orgz_id_tab(j) := l_exp_orgz_id;
654 x_person_id_tab(j) := l_person_id;
655 x_period_type_tab(j) := PA_REP_UTIL_GLOB.G_PERIOD_TYPE_C.G_GE_C;
656 x_period_name_tab(j) := PA_REP_UTIL_GLOB.G_DUMMY_C;
657 x_global_exp_date_tab(j) := ge_periods_cur_rec.GE_DATE;
658 x_period_year_tab(j) := ge_periods_cur_rec.PERIOD_YEAR;
659 x_qm_number_tab(j) := ge_periods_cur_rec.PERIOD_MONTH;
660 x_period_num_tab(j) := -1;
661
662 j := j+1;
663 jj := j;
664
665 END IF; -- PA_FORECAST_GRC_PVT.get_resource_capacity returns success
666
667 END IF; -- PA_FORECAST_GRC_PVT.checking date effectivity
668
669 END LOOP; -- GE_PERIODS_CUR loop
670
671 END IF; -- l_ge_period_flag = 'Y'
672
673 j := jj;
674
675 END LOOP; -- looping through the PL/SQL tables p_exp_org_id_tab and p_person_id_tab
676
677 x_return_status := l_return_status;
678
679 EXCEPTION
680 WHEN NO_DATA_FOUND THEN
681 Null;
682 WHEN OTHERS THEN
683 -- 4537865 : RESET other OUT params value also
684 x_resource_capacity_tab.delete;
685 x_exp_orgz_id_tab.delete;
686 x_person_id_tab.delete;
687 x_period_type_tab.delete;
688 x_period_name_tab.delete;
689 x_global_exp_date_tab.delete;
690 x_period_year_tab.delete;
691 x_qm_number_tab.delete;
692 x_period_num_tab.delete;
693 -- 4537865 : End
694
695 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
696 x_msg_count := 1;
697 x_msg_data := SQLERRM;
698 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PA_FORECAST_GRC_PVT',
699 p_procedure_name => 'Get_Capacity_Vector');
700 RAISE ; -- 4537865 : Based on usage included RAISE
701 END Get_Capacity_Vector;
702
703 END PA_FORECAST_GRC_PVT;