[Home] [Help]
PACKAGE BODY: APPS.PA_FUND_REVAL_PVT
Source
1 PACKAGE BODY PA_FUND_REVAL_PVT AS
2 --$Header: PAXFRPPB.pls 120.3.12010000.2 2008/10/07 09:04:15 dbudhwar ship $
3
4 /*----------------------------------------------------------------------------------------+
5 | Procedure : revaluate_funding |
6 | Purpose : To revaluate funding for a given/range or projects |
7 | Parameters : |
8 | ================================================================================== |
9 | Name Mode Description |
10 | ================================================================================== |
11 | p_project_id IN Project ID |
12 | If run mode is 'SINGLE' this parameter should have |
13 | valid project id. Otherwise NULL/0 |
14 | p_project_type_id IN Project Type ID |
15 | p_from_proj_number IN Start Project Number |
16 | If run mode is 'RANGE' this parameter will have |
17 | project number/ NULL |
18 | p_to_proj_number IN End Project Number |
19 | If run mode is 'RANGE' this parameter will have |
20 | project number/ NULL |
21 | p_thru_date IN Revaluation Process Date |
22 | p_rate_type IN Revaluation Rate type |
23 | p_rate_date IN Revaluation Rate date |
24 | p_baseline_flag IN Baseline flag indicating if the adjustment |
25 | line is to be baselined or not |
26 | p_debug_mode IN Debug Mode |
27 | p_run_mode IN Run mode |
28 | Values are 'SINGLE', 'RANGE', 'DELETE' |
29 | x_return_status OUT Return status of this procedure |
30 | x_msg_count OUT Error message count |
31 | x_msg_data OUT Error message |
32 | ================================================================================== |
33 +----------------------------------------------------------------------------------------*/
34
35
36 PROCEDURE Revaluate_funding(
37 p_project_id IN NUMBER,
38 p_project_type_id IN NUMBER,
39 p_from_proj_number IN VARCHAR2,
40 p_to_proj_number IN VARCHAR2,
41 p_thru_date IN DATE,
42 p_rate_type IN VARCHAR2 ,
43 p_rate_date IN DATE,
44 p_baseline_flag IN VARCHAR2,
45 p_debug_mode IN VARCHAR2,
46 p_run_mode IN VARCHAR2,
47 x_return_status OUT NOCOPY VARCHAR2,
48 x_msg_count OUT NOCOPY NUMBER,
49 x_msg_data OUT NOCOPY VARCHAR2) IS
50
51 l_FromProjNum VARCHAR2(25);
52 l_ToProjNum VARCHAR2(25);
53 l_ProjTypeId NUMBER;
54
55 l_return_status VARCHAR2(30) := NULL;
56 l_msg_count NUMBER := NULL;
57 l_msg_data VARCHAR2(250) := NULL;
58 l_LogMsg VARCHAR2(250);
59
60 BEGIN
61 x_return_status := FND_API.G_RET_STS_SUCCESS;
62 x_msg_count := 0;
63
64 Initialize;
65
66
67 IF G_DEBUG_MODE = 'Y' THEN
68
69 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.revaluate_funding-----------' ;
70 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
71
72 l_LogMsg := 'Parameters : Project Id:' || p_project_id ||
73 ' Project Type Id:' || p_project_type_id ||
74 ' Start Proj No:' || p_from_proj_number ||
75 ' End Proj No:' || p_to_proj_number;
76 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
77
78 l_LogMsg := 'Thru Date:' || to_char(p_thru_date, 'DD-MON-YYYY') ||
79 ' Rate Type:' || p_rate_type ||
80 ' Rate Date:' || p_rate_date ||
81 ' Run Mode:' || p_run_mode ||
82 ' Baseline Flag:' || p_baseline_flag;
83
84 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
85
86 END IF;
87
88
89 /* Date till which transactions are to be picked */
90 G_THRU_DATE := NVL(p_thru_date, SYSDATE);
91
92 /* Exchange rate date for currency conversion */
93 G_RATE_DATE := NVL(p_rate_date, G_THRU_DATE);
94
95 /* Exchange rate type for currency conversion */
96 G_RATE_TYPE := p_rate_type;
97
98 /* Flag indicating if net adjustment lines are to be baselined */
99 G_BASELINE_FLAG := p_baseline_flag;
100
101 /* Flag indicating if revaluation process is being executed. Required for MC triggers
102 to determine if conversion is to be done or to be read from PL/SQL tables (populated by
103 Revaluation process */
104 G_REVAL_FLAG := 'Y';
105
106
107 l_FromProjNum := p_from_proj_number;
108 l_ToProjNum := p_to_proj_number;
109 l_ProjTypeId := p_project_type_id;
110
111 get_start_end_proj_num (
112 p_project_id => p_project_id,
113 p_run_mode => p_run_mode,
114 x_from_proj_number => l_FromProjNum,
115 x_to_proj_number => l_ToProjNum,
116 x_Project_type_id => l_ProjTypeId,
117 x_return_status => l_return_status,
118 x_msg_count => l_msg_count,
119 x_msg_data => l_msg_data) ;
120
121 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
122
123 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
124
125 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
126
127 RAISE FND_API.G_EXC_ERROR;
128
129 END IF;
130
131 IF p_run_mode = 'DELETE' THEN
132
133 get_delete_projects(
134 p_project_type_id => l_ProjTypeId,
135 p_from_proj_number => l_FromProjNum,
136 p_to_proj_number => l_ToProjNum,
137 p_run_mode => p_run_mode,
138 x_return_status => l_return_status,
139 x_msg_count => l_msg_count,
140 x_msg_data => l_msg_data);
141
142 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
143
144 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
145
146 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
147
148 RAISE FND_API.G_EXC_ERROR;
149
150 END IF;
151
152
153 ELSE
154
155 get_rsob_ids(
156 x_return_status => l_return_status,
157 x_msg_count => l_msg_count,
158 x_msg_data => l_msg_data);
159
160 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
161
162 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
163
164 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
165
166 RAISE FND_API.G_EXC_ERROR;
167
168 END IF;
169
170 get_reval_projects(
171 p_project_id => p_project_id,
172 p_project_type_id => l_ProjTypeId,
173 p_from_proj_number => l_FromProjNum,
174 p_to_proj_number => l_ToProjNum,
175 p_run_mode => p_run_mode,
176 x_return_status => l_return_status,
177 x_msg_count => l_msg_count,
178 x_msg_data => l_msg_data);
179
180 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
181
182 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
183
184 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
185
186 RAISE FND_API.G_EXC_ERROR;
187
188 END IF;
189
190 END IF; /* p_run_mode = DELETE */
191
192 G_REVAL_FLAG := 'N';
193
194 IF G_DEBUG_MODE = 'Y' THEN
195
196 pa_debug.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.revaluate_funding-----------' ;
197 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
198
199 END IF;
200
201
202 EXCEPTION
203 WHEN FND_API.G_EXC_ERROR THEN
204 ROLLBACK;
205
206 IF G_DEBUG_MODE = 'Y' THEN
207
208 PA_DEBUG.g_err_stage := 'Expected: ' || l_msg_data ;
209 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
210
211 END IF;
212
213 x_return_status := l_return_status;
214 x_msg_count := l_msg_count;
215 x_msg_data := l_msg_data;
216
217 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
218 ROLLBACK;
219 G_REVAL_FLAG := 'N';
220
221 IF G_DEBUG_MODE = 'Y' THEN
222
223 PA_DEBUG.g_err_stage := 'Unexpected :' ||l_msg_data ;
224 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
225
226 END IF;
227
228 x_return_status := l_return_status;
229 x_msg_count := l_msg_count;
230 x_msg_data := l_msg_data;
231
232 WHEN OTHERS THEN
233 ROLLBACK;
234 G_REVAL_FLAG := 'N';
235 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
236 x_msg_count := l_msg_count;
237 x_msg_data := SUBSTR(SQLERRM,1,100);
238
239 IF G_DEBUG_MODE = 'Y' THEN
240
241 PA_DEBUG.g_err_stage := 'Revaluate_funding:' || x_msg_data ;
242 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
243
244 END IF;
245
246
247 END Revaluate_funding;
248
249 /*----------------------------------------------------------------------------------------+
250 | Procedure : validate_project_eligibility |
251 | Purpose : To validate eligibility criteria for a given project |
252 | Parameters : |
253 | ================================================================================== |
254 | Name Mode Description |
255 | ================================================================================== |
256 | p_project_id IN Project ID |
257 | p_run_mode IN Run Mode |
258 | x_eligible_flag OUT Indicates if the project meets eligibility criteria |
259 | for revaluation |
260 | x_return_status OUT Return status of this procedure |
261 | x_msg_count OUT Error message count |
262 | x_msg_data OUT Error message |
263 | ================================================================================== |
264 +----------------------------------------------------------------------------------------*/
265 PROCEDURE validate_project_eligibility(
266 p_project_id IN NUMBER,
267 p_run_mode IN VARCHAR2,
268 x_eligible_flag OUT NOCOPY VARCHAR2,
269 x_return_status OUT NOCOPY VARCHAR2,
270 x_msg_count OUT NOCOPY NUMBER,
271 x_msg_data OUT NOCOPY VARCHAR2) IS
272
273 l_ReasonCode VARCHAR2(30);
274 l_ReportId NUMBER;
275 l_ErrorFlag VARCHAR2(1) := NULL;
276
277 UNREL_INV_REV_EXIST EXCEPTION;
278 UNBASELINED_REVAL_FUNDS_EXIST EXCEPTION;
279
280 l_return_status VARCHAR2(30) := NULL;
281 l_msg_count NUMBER := NULL;
282 l_msg_data VARCHAR2(250) := NULL;
283 l_LogMsg VARCHAR2(250);
284
285 BEGIN
286
287 x_return_status := FND_API.G_RET_STS_SUCCESS;
288 x_msg_count := 0;
289 x_eligible_flag := 'T';
290
291
292 IF G_DEBUG_MODE = 'Y' THEN
293
294 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.validate_project_eligibility-----------' ;
295 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
296
297 END IF;
298
299
300 /* check for any unreleased invoices/revenue */
301
302 Check_Unrel_invoice_revenue(
303 p_project_id => p_project_id,
304 x_exist_flag => l_ErrorFlag,
305 x_reason_code => l_ReasonCode,
306 x_return_status => l_return_status,
307 x_msg_count => l_msg_count,
308 x_msg_data => l_msg_data) ;
309
310 IF G_DEBUG_MODE = 'Y' THEN
311
312 l_LogMsg := 'Unrel invoice/revenue exists flag : ' || l_ErrorFlag ;
313 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
314
315 END IF;
316
317 IF l_ErrorFlag = 'T' THEN
318
319 IF G_DEBUG_MODE = 'Y' THEN
320
321 l_LogMsg := 'Unrel invoice/revenue exists flag : ' || l_ReasonCode;
322 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
323
324 END IF;
325
326 Insert_distribution_warnings(p_project_id => p_project_id,
327 p_reason_code => l_ReasonCode,
328 x_return_status => l_return_status,
329 x_msg_count => l_msg_count,
330 x_msg_data => l_msg_data) ;
331
332
333 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
334
335 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
336
337 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
338
339 RAISE FND_API.G_EXC_ERROR;
340
341 ELSE
342
343 RAISE UNREL_INV_REV_EXIST;
344
345 END IF;
346
347 END IF;
348
349 /* check for any unbaselined revaluation adjustment funding lines */
350
351 l_ErrorFlag := Check_reval_unbaselined_funds(p_project_id => p_project_id);
352
353 IF G_DEBUG_MODE = 'Y' THEN
354
355 l_LogMsg := 'Unbaselined reval adj lines exists flag : ' || l_ErrorFlag;
356 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
357
358 END IF;
359
360 IF l_ErrorFlag = 'T' THEN
361
362 IF p_run_mode = 'SINGLE' THEN
363
364 Delete_unbaselined_adjmts(p_project_id => p_project_id,
365 p_run_mode => p_run_mode,
366 x_return_status => l_return_status,
367 x_msg_count => l_msg_count,
368 x_msg_data => l_msg_data) ;
369
370 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
371
372 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
373
374 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
375
376 RAISE FND_API.G_EXC_ERROR;
377
378 END IF;
379
380 ELSE
381
382 l_ReasonCode := 'PA_FR_UNBASELINED_FUNDS_EXIST';
383
384 Insert_distribution_warnings(p_project_id => p_project_id,
385 p_reason_code => l_ReasonCode,
386 x_return_status => l_return_status,
387 x_msg_count => l_msg_count,
388 x_msg_data => l_msg_data) ;
389
390 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
391
392 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
393
394 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
395
396 RAISE FND_API.G_EXC_ERROR;
397
398 ELSE
399
400 RAISE UNBASELINED_REVAL_FUNDS_EXIST;
401
402 END IF;
403
404 END IF;
405
406 END IF;
407
408 IF G_DEBUG_MODE = 'Y' THEN
409
410 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.validate_project_eligibility-----------' ;
411 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
412
413 END IF;
414
415 EXCEPTION
416
417 WHEN UNREL_INV_REV_EXIST THEN
418 x_eligible_flag := 'F';
419
420 WHEN UNBASELINED_REVAL_FUNDS_EXIST THEN
421 x_eligible_flag := 'F';
422
423 WHEN FND_API.G_EXC_ERROR THEN
424 x_return_status := l_return_status;
425 x_msg_count := l_msg_count;
426 x_msg_data := l_msg_data;
427
428 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
429 x_return_status := l_return_status;
430 x_msg_count := l_msg_count;
431 x_msg_data := l_msg_data;
432
433 WHEN OTHERS THEN
434 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
435 x_msg_count := l_msg_count;
436 x_msg_data := SUBSTR(SQLERRM,1,100);
437
438 IF G_DEBUG_MODE = 'Y' THEN
439
440 PA_DEBUG.g_err_stage := 'Validate_project_eligibility:' || x_msg_data ;
441 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
442
443 END IF;
444
445 END validate_project_eligibility;
446
447 /*----------------------------------------------------------------------------------------+
448 | Procedure : get_rsob_ids |
449 | Purpose : To get reporting set of book ids for the primary set of book id |
450 | Also sets global flags to indicate if MC is to be processed in AR/PA |
451 | Parameters : |
452 | ================================================================================== |
453 | Name Mode Description |
454 | ================================================================================== |
455 | x_return_status OUT Return status of this procedure |
456 | x_msg_count OUT Error message count |
457 | x_msg_data OUT Error message |
458 | ================================================================================== |
459 +----------------------------------------------------------------------------------------*/
460 PROCEDURE get_rsob_ids(
461 x_return_status OUT NOCOPY VARCHAR2,
462 x_msg_count OUT NOCOPY NUMBER,
463 x_msg_data OUT NOCOPY VARCHAR2) IS
464
465
466 /* This CURSOR selects all reporting set of books enabled for the primary set of book id
467 in PA */
468
469 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will obsoleted, replace with
470 new table gl_alc_ledger_rships_v and corresponding columns */
471
472 /* CURSOR rsob is SELECT rep.reporting_set_of_books_id reporting_set_of_books_id ,
473 rep.reporting_currency_code, rep.conversion_type
474 FROM gl_mc_reporting_options rep, pa_implementations imp
475 WHERE rep.primary_set_of_books_id = imp.set_of_books_id
476 AND enabled_flag = 'Y'
477 AND rep.org_id = imp.org_id
478 AND application_id = 275; */
479
480 CURSOR rsob is SELECT rep.ledger_id reporting_set_of_books_id ,
481 rep.currency_code reporting_currency_code,
482 rep.alc_default_conv_rate_type conversion_type
483 FROM gl_alc_ledger_rships_v rep, pa_implementations imp
484 WHERE rep.source_ledger_id = imp.set_of_books_id
485 AND rep.relationship_enabled_flag = 'Y'
486 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
487 AND rep.application_id = 275;
488
489
490
491
492 /* This CURSOR selects all reporting set of books enabled for the primary set of book id
493 in AR */
494
495 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will obsoleted, replace with
496 new table gl_alc_ledger_rships_v and corresponding columns */
497
498
499 /* CURSOR rsob_ar_mc is SELECT rep.reporting_set_of_books_id reporting_set_of_books_id ,
500 rep.reporting_currency_code, rep.conversion_type
501 FROM gl_mc_reporting_options rep, pa_implementations imp
502 WHERE rep.primary_set_of_books_id = imp.set_of_books_id
503 AND enabled_flag = 'Y'
504 AND rep.org_id = imp.org_id
505 AND application_id = PA_FUND_REVAL_UTIL.get_ar_application_id; */
506
507
508 CURSOR rsob_ar_mc is SELECT rep.ledger_id reporting_set_of_books_id ,
509 rep.currency_code reporting_currency_code,
510 rep.alc_default_conv_rate_type conversion_type
511 FROM gl_alc_ledger_rships_v rep, pa_implementations imp
512 WHERE rep.source_ledger_id = imp.set_of_books_id
513 AND rep.relationship_enabled_flag = 'Y'
514 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
515 AND application_id = PA_FUND_REVAL_UTIL.get_ar_application_id;
516
517
518
519
520 l_return_status VARCHAR2(30) := NULL;
521 l_msg_count NUMBER := NULL;
522 l_msg_data VARCHAR2(250) := NULL;
523
524 l_LogMsg VARCHAR2(250);
525
526 l_EnabledFlag VARCHAR2(1);
527 l_SobIdIdx NUMBER;
528
529 BEGIN
530 x_return_status := FND_API.G_RET_STS_SUCCESS;
531 x_msg_count := 0;
532
533 IF G_DEBUG_MODE = 'Y' THEN
534
535 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_rsob_ids-----------' ;
536 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
537
538 END IF;
539
540 /* Gets primary set of book id and MRC funding enabled flag */
541
542 /*
543 SELECT set_of_books_id, nvl(ENABLE_MRC_FOR_FUND_FLAG , 'N')
544 into G_SET_OF_BOOKS_ID, G_MRC_FUND_ENABLED_FLAG FROM pa_implementations;
545 */
546
547 SELECT set_of_books_id, 'N' -- nvl(REVAL_MRC_FUNDING_FLAG , 'N')
548 into G_SET_OF_BOOKS_ID, G_MRC_FUND_ENABLED_FLAG FROM pa_implementations;
549
550 /* Global Flag indicating if AR module is installed */
551 G_AR_INSTALLED_FLAG := get_ar_installed;
552
553 /* Global Flag indicating if AR should process only for primary set of books id */
554 G_AR_PRIMARY_ONLY := 'N';
555
556 /* Global Flag indicating if PA should process only for primary set of books id */
557 G_PRIMARY_ONLY := 'N';
558
559 /* If MRC for funding is not enabled, then only primary set of book id should be processed
560 in PA and AR, So set both flags to Y */
561
562 IF G_MRC_FUND_ENABLED_FLAG = 'N' THEN
563
564 G_AR_PRIMARY_ONLY := 'Y';
565 G_PRIMARY_ONLY := 'Y';
566
567 /* Populate set of book id list with primary set of book id */
568 G_SobListTab(G_set_of_books_id).EnabledFlag := G_AR_INSTALLED_FLAG;
569
570
571 IF G_SobListTab.COUNT = 0 THEN
572
573 /* No reporting currency is enabled for this OU .
574 Only primary set of books id is to be processed in both ar and PA */
575 G_AR_PRIMARY_ONLY := 'Y';
576 G_PRIMARY_ONLY := 'Y';
577 G_SobListTab(G_set_of_books_id).EnabledFlag := G_AR_INSTALLED_FLAG;
578
579 /* ELSE */
580
581 /* This flag will indicated if AR has atleast one reporting currency enabled for
582 primary set of book id */
583
584 /* Check if the reporting set of book list is enabled in AR also */
585
586 IF l_EnabledFlag = 'N' THEN
587
588 G_AR_PRIMARY_ONLY := 'Y';
589 -- G_PRIMARY_ONLY := 'N';
590
591 ELSE
592
593 G_AR_PRIMARY_ONLY := 'N';
594 -- G_PRIMARY_ONLY := 'N';
595
596 END IF;
597
598 G_SobListTab(G_set_of_books_id).EnabledFlag := G_AR_INSTALLED_FLAG;
599 END IF;
600
601 END IF;
602
603 IF G_DEBUG_MODE = 'Y' THEN
604
605 l_LogMsg := 'AR installed : ' || G_AR_INSTALLED_FLAG || ' AR primary only :' ||
606 G_AR_PRIMARY_ONLY || ' MRC fund enabled:' || G_MRC_FUND_ENABLED_FLAG ||
607 ' Primary set of book id :' || G_SET_OF_BOOKS_ID;
608
609 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
610
611 END IF;
612
613 l_SobIdIdx := G_SobListTab.FIRST;
614
615 LOOP
616
617 EXIT WHEN l_SobIdIdx IS NULL;
618
619 IF G_DEBUG_MODE = 'Y' THEN
620
621 l_LogMsg := 'SOB Id:' || l_SobIdIdx || ' enabled flag:' || G_SobListTab(l_SobIdIdx).EnabledFlag ;
622 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
623
624 END IF;
625
626 l_SobIdIdx := G_SobListTab.NEXT(l_SobIdIdx);
627 END LOOP;
628
629 IF G_DEBUG_MODE = 'Y' THEN
630
631 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_rsob_ids-----------' ;
632 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
633
634 END IF;
635
636 EXCEPTION
637
638 WHEN FND_API.G_EXC_ERROR THEN
639 x_return_status := l_return_status;
640 x_msg_count := l_msg_count;
641 x_msg_data := l_msg_data;
642
643 WHEN OTHERS THEN
644 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
645 x_msg_count := l_msg_count;
646 x_msg_data := SUBSTR(SQLERRM,1,100);
647
648 IF G_DEBUG_MODE = 'Y' THEN
649
650 PA_DEBUG.g_err_stage := 'get_rsob_ids:' || x_msg_data ;
651 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
652
653 END IF;
654
655 END get_rsob_ids;
656
657 /*----------------------------------------------------------------------------------------+
658 | Procedure : get_ar_installed |
659 | Purpose : To chekc if ar is installed for primary set of books |
660 | Parameters : |
661 | ================================================================================== |
662 | Name Mode Description |
663 | ================================================================================== |
664 +----------------------------------------------------------------------------------------*/
665 FUNCTION get_ar_installed RETURN VARCHAR2 IS
666
667 l_ar_installed VARCHAR2(1);
668
669 BEGIN
670
671 l_ar_installed := PA_FUND_REVAL_UTIL.is_ar_installed;
672
673 RETURN l_ar_installed;
674
675 END get_ar_installed;
676
677
678 /*----------------------------------------------------------------------------------------+
679 | Procedure : Get_start_end_proj_num |
680 | Purpose : If project id is given (SINGLE) |
681 | start/end project number will be the same |
682 | If it is RANGE and either start/end project number is given, then |
683 | min(segment1) or max(segment1) will be assigned respectively |
684 | Parameters : |
685 | ================================================================================== |
686 | Name Mode Description |
687 | ================================================================================== |
688 | p_project_id IN Project ID |
689 | p_run_mode IN Process Mode - SINGLE/RANGE |
690 | x_from_proj_number IN OUT Start project number |
691 | x_to_proj_number IN OUT End project number |
692 | x_project_type_id IN OUT Project Type ID |
693 | x_return_status OUT Return status of this procedure |
694 | x_msg_count OUT Error message count |
695 | x_msg_data OUT Error message |
696 | ================================================================================== |
697 +----------------------------------------------------------------------------------------*/
698 PROCEDURE get_start_end_proj_num(
699 p_project_id IN NUMBER,
700 p_run_mode IN VARCHAR2,
701 x_from_proj_number IN OUT NOCOPY VARCHAR2,
702 x_to_proj_number IN OUT NOCOPY VARCHAR2,
703 x_project_type_id IN OUT NOCOPY NUMBER,
704 x_return_status OUT NOCOPY VARCHAR2,
705 x_msg_count OUT NOCOPY NUMBER,
706 x_msg_data OUT NOCOPY VARCHAR2) IS
707
708
709 l_FromProjNum VARCHAR2(25);
710 l_ToProjNum VARCHAR2(25);
711 l_ProjTypeId NUMBER;
712
713 l_return_status VARCHAR2(30) := NULL;
714 l_msg_count NUMBER := NULL;
715 l_msg_data VARCHAR2(250) := NULL;
716 l_LogMsg VARCHAR2(250);
717
718
719 BEGIN
720 x_return_status := FND_API.G_RET_STS_SUCCESS;
721 x_msg_count := 0;
722
723 IF G_DEBUG_MODE = 'Y' THEN
724
725 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_start_end_proj_num-----------' ;
726 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
727
728 END IF;
729
730 IF p_run_mode = 'SINGLE' THEN
731
732 SELECT p.segment1, pt.project_type_id
733 INTO l_FromProjNum, l_ProjTypeId
734 FROM pa_projects p, pa_project_types pt
735 WHERE p.project_id = p_project_id
736 AND pt.project_type = p.project_type;
737
738 l_ToProjNum := l_FromProjNum;
739
740 ELSE
741 l_ProjTypeId := x_project_type_id;
742
743 IF nvl(x_from_proj_number, 'NULL') = 'NULL' THEN
744
745 /*
746 SELECT MIN(P.segment1)
747 INTO l_FromProjNum
748 FROM PA_PROJECTS P , PA_PROJECT_TYPES T
749 WHERE T.project_type_id (+) = l_ProjTypeId
750 AND P.Project_type = T.Project_type
751 AND T.Project_type_class_code = 'CONTRACT';
752 */
753
754 /* Commented for performance
755 SELECT proj.seg1
756 INTO l_FromProjNum
757 FROM (
758 SELECT t.project_type_class_code, MIN(P.segment1) seg1
759 FROM PA_PROJECTS P , PA_PROJECT_TYPES T
760 WHERE T.project_type_id = NVL(l_ProjTypeId,0)
761 AND P.Project_type = T.Project_type
762 AND T.Project_type_class_code = 'CONTRACT'
763 AND NVL(l_ProjTypeId,0) <> 0
764 GROUP BY t.project_type_class_code
765 UNION
766 SELECT t.project_type_class_code, MIN(P.segment1) seg1
767 FROM PA_PROJECTS P , PA_PROJECT_TYPES T
768 WHERE P.Project_type = T.Project_type
769 AND T.Project_type_class_code = 'CONTRACT'
770 AND nvl(l_ProjTypeId,0) = 0
771 group by t.project_type_class_code
772 ) proj;
773 */
774
775 l_FromProjNum := '0';
776
777 ELSE
778
779 l_FromProjNum := x_from_proj_number ;
780
781 END IF;
782
783 IF nvl(x_to_proj_number, 'NULL') = 'NULL' THEN
784
785 /*
786 SELECT MAX(P.segment1)
787 INTO l_ToProjNum
788 FROM PA_PROJECTS P , PA_PROJECT_TYPES T
789 WHERE T.project_type_id (+) = l_ProjTypeId
790 AND P.Project_type = T.Project_type
791 AND T.Project_type_class_code = 'CONTRACT';
792 */
793
794 /* Commented for performance
795 SELECT proj.seg1
796 INTO l_ToProjNum
797 FROM (
798 SELECT t.project_type_class_code, MAX(P.segment1) seg1
799 FROM PA_PROJECTS P , PA_PROJECT_TYPES T
800 WHERE T.project_type_id = NVL(l_ProjTypeId,0)
801 AND P.Project_type = T.Project_type
802 AND T.Project_type_class_code = 'CONTRACT'
803 AND NVL(l_ProjTypeId,0) <> 0
804 GROUP BY t.project_type_class_code
805 UNION
806 SELECT t.project_type_class_code, MAX(P.segment1) seg1
807 FROM PA_PROJECTS P , PA_PROJECT_TYPES T
808 WHERE P.Project_type = T.Project_type
809 AND T.Project_type_class_code = 'CONTRACT'
810 AND nvl(l_ProjTypeId,0) = 0
811 group by t.project_type_class_code
812 ) proj;
813 */
814
815 l_ToProjNum := 'zzzzzzzzzzzzzzzzzzz';
816 ELSE
817
818 l_ToProjNum := x_to_proj_number ;
819
820 END IF;
821
822 END IF ;
823
824 x_from_proj_number := l_FromProjNum;
825 x_to_proj_number := l_ToProjNum;
826 x_project_type_id := l_ProjTypeId;
827
828 IF G_DEBUG_MODE = 'Y' THEN
829
830 l_LogMsg := 'Start Proj No: ' || x_from_proj_number ||
831 ' End Proj No:' || x_to_proj_number ||
832 ' Proj Type Id:' || x_Project_type_id;
833 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
834
835 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_start_end_proj_num-----------' ;
836 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
837
838 END IF;
839
840 EXCEPTION
841
842 WHEN FND_API.G_EXC_ERROR THEN
843 x_return_status := l_return_status;
844 x_msg_count := l_msg_count;
845 x_msg_data := l_msg_data;
846
847 WHEN OTHERS THEN
848 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
849 x_msg_count := l_msg_count;
850 x_msg_data := SUBSTR(SQLERRM,1,100);
851
852 IF G_DEBUG_MODE = 'Y' THEN
853
854 PA_DEBUG.g_err_stage := 'get_start_end_proj_num:' || x_msg_data ;
855 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
856
857 END IF;
858
859 END get_start_end_proj_num;
860
861 /*----------------------------------------------------------------------------------------+
862 | Procedure : Check_Unrel_invoice_revenue
863 | Purpose : To check if the given project_id (SINGLE MODE) has any |
864 | unreleased invoice/revenue transactions |
865 | Parameters : |
866 | ================================================================================== |
867 | Name Mode Description |
868 | ================================================================================== |
869 | p_project_id IN Project ID |
870 | x_exist_flag OUT Flag indicating if unreleased invoice/revenue exists |
871 | 'T' or 'F' |
872 | x_reason_code OUT If revenue exists - PA_FR_UNREL_REV_EXIST |
873 | If invoice exists - PA_FR_UNREL_INV_EXIST |
874 | If none exists - null |
875 | This procedure will first check for revenue then |
876 | invoice |
877 | x_return_status OUT Return status of this procedure |
878 | x_msg_count OUT Error message count |
879 | x_msg_data OUT Error message |
880 | ================================================================================== |
881 +----------------------------------------------------------------------------------------*/
882
883 PROCEDURE Check_Unrel_invoice_revenue (
884 p_project_id IN NUMBER,
885 x_exist_flag OUT NOCOPY VARCHAR2,
886 x_reason_code OUT NOCOPY VARCHAR2,
887 x_return_status OUT NOCOPY VARCHAR2,
888 x_msg_count OUT NOCOPY NUMBER,
889 x_msg_data OUT NOCOPY VARCHAR2) IS
890
891 l_ExistFlag VARCHAR2(1);
892 l_return_status VARCHAR2(30) := NULL;
893 l_msg_count NUMBER := NULL;
894 l_msg_data VARCHAR2(250) := NULL;
895 l_LogMsg VARCHAR2(250);
896
897
898 BEGIN
899
900 x_return_status := FND_API.G_RET_STS_SUCCESS;
901 x_msg_count := 0;
902 x_reason_code := NULL;
903
904 IF G_DEBUG_MODE = 'Y' THEN
905
906 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.Check_Unrel_invoice_revenue-----------' ;
907 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
908
909 END IF;
910
911 /* Check for any unapproved or unreleased invoices */
912
913 BEGIN
914
915 IF G_DEBUG_MODE = 'Y' THEN
916
917 l_LogMsg := 'Checking for Unrel Draft Revenues';
918 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
919
920 END IF;
921
922 SELECT 'T' INTO x_exist_flag
923 FROM DUAL
924 WHERE EXISTS ( SELECT NULL
925 FROM pa_draft_revenues r
926 WHERE r.project_id = p_project_id
927 AND r.released_date IS NULL);
928
929 x_reason_code := 'PA_FR_UNREL_REV_EXIST';
930
931 EXCEPTION
932
933 WHEN OTHERS THEN
934
935 x_exist_flag := 'F';
936 END;
937
938 IF x_exist_flag = 'F' THEN
939
940 BEGIN
941
942 IF G_DEBUG_MODE = 'Y' THEN
943
944 l_LogMsg := 'Checking for Unrel Draft Invoice';
945 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
946
947 END IF;
948
949 SELECT 'T' INTO x_exist_flag
950 FROM DUAL
951 WHERE EXISTS ( SELECT NULL
952 FROM pa_draft_invoices i
953 WHERE i.project_id = p_project_id
954 and i.released_by_person_id IS NULL);
955
956 x_exist_flag := 'T';
957 x_reason_code := 'PA_FR_UNREL_INV_EXIST';
958
959 EXCEPTION
960
961 WHEN OTHERS THEN
962
963 x_exist_flag := 'F';
964 END;
965
966 END IF;
967
968 IF G_DEBUG_MODE = 'Y' THEN
969
970 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.Check_Unrel_invoice_revenue-----------' ;
971 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
972
973 END IF;
974
975 EXCEPTION
976
977 WHEN OTHERS THEN
978 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
979 x_msg_count := l_msg_count;
980 x_msg_data := SUBSTR(SQLERRM,1,100);
981
982 IF G_DEBUG_MODE = 'Y' THEN
983
984 PA_DEBUG.g_err_stage := 'Check_Unrel_invoice_revenue:' || x_msg_data ;
985 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
986
987 END IF;
988
989 END Check_Unrel_invoice_revenue;
990
991
992 /*----------------------------------------------------------------------------------------+
993 | FUNCTION : Check_reval_unbaselined_funds |
994 | Purpose : To check (if any) unbaselined revaluation adjustment lines exist |
995 | Parameters : |
996 | ================================================================================== |
997 | Name Mode Description |
998 | ================================================================================== |
999 | p_project_id IN Project ID |
1000 | ================================================================================== |
1001 +----------------------------------------------------------------------------------------*/
1002
1003 FUNCTION Check_reval_unbaselined_funds (
1004 p_project_id IN NUMBER) RETURN VARCHAR2 IS
1005
1006
1007 l_ExistFlag VARCHAR2(1);
1008
1009 BEGIN
1010
1011 IF G_DEBUG_MODE = 'Y' THEN
1012
1013 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.Check_reval_unbaseline_funds-----------' ;
1014 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1015
1016 END IF;
1017
1018 SELECT 'T' INTO l_ExistFlag
1019 FROM DUAL
1020 WHERE EXISTS (SELECT NULL
1021 FROM pa_project_fundings
1022 WHERE project_id = p_project_id
1023 AND funding_category = 'REVALUATION'
1024 AND budget_type_code = 'DRAFT');
1025
1026 IF G_DEBUG_MODE = 'Y' THEN
1027
1028 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.Check_reval_unbaseline_funds-----------' ;
1029 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1030
1031 END IF;
1032
1033 RETURN l_ExistFlag;
1034
1035 EXCEPTION
1036
1037 WHEN NO_DATA_FOUND THEN
1038 RETURN 'F';
1039
1040 END Check_reval_unbaselined_funds;
1041
1042 /*----------------------------------------------------------------------------------------+
1043 | Procedure : Delete_unbaselined_adjmts |
1044 | Purpose : To delete (if any) unbaselined revaluation adjutment lines |
1045 | Parameters : |
1046 | ================================================================================== |
1047 | Name Mode Description |
1048 | ================================================================================== |
1049 | p_project_id IN Project ID |
1050 | p_run_mode IN Run Mode - SINGLE,RANGE, DELETE |
1051 | x_return_status OUT Return status of this procedure |
1052 | x_msg_count OUT Error message count |
1053 | x_msg_data OUT Error message |
1054 | ================================================================================== |
1055 +----------------------------------------------------------------------------------------*/
1056
1057 PROCEDURE Delete_Unbaselined_Adjmts (
1058 p_project_id IN NUMBER,
1059 p_run_mode IN VARCHAR2,
1060 x_return_status OUT NOCOPY VARCHAR2,
1061 x_msg_count OUT NOCOPY NUMBER,
1062 x_msg_data OUT NOCOPY VARCHAR2) IS
1063
1064 CURSOR fund_recs is
1065 SELECT project_funding_id, agreement_id, project_id, task_id, projfunc_allocated_amount,
1066 projfunc_realized_gains_amt, projfunc_realized_losses_amt, invproc_allocated_amount,
1067 revproc_allocated_amount
1068 FROM pa_project_fundings
1069 WHERE project_id = p_project_id
1070 AND funding_category = 'REVALUATION'
1071 AND budget_type_code = 'DRAFT';
1072
1073 l_FundingIdTab PA_PLSQL_DATATYPES.IdTabTyp;
1074 l_AgreementIdTab PA_PLSQL_DATATYPES.IdTabTyp;
1075 l_ProjectIdTab PA_PLSQL_DATATYPES.IdTabTyp;
1076 l_TaskIdTab PA_PLSQL_DATATYPES.IdTabTyp;
1077 l_ProjfuncAllocTab PA_PLSQL_DATATYPES.NumTabTyp;
1078 l_ProjfuncGainsTab PA_PLSQL_DATATYPES.NumTabTyp;
1079 l_ProjfuncLossTab PA_PLSQL_DATATYPES.NumTabTyp;
1080 l_InvprocAllocTab PA_PLSQL_DATATYPES.NumTabTyp;
1081 l_RevprocAllocTab PA_PLSQL_DATATYPES.NumTabTyp;
1082
1083 l_ReasonCode VARCHAR2(30);
1084
1085 l_TotalFetch NUMBER := 0;
1086 l_ThisFetch NUMBER := 0;
1087 l_FetchSize NUMBER := 50;
1088
1089 l_return_status VARCHAR2(30) := NULL;
1090 l_msg_count NUMBER := NULL;
1091 l_msg_data VARCHAR2(250) := NULL;
1092 l_LogMsg VARCHAR2(250);
1093
1094 BEGIN
1095 x_return_status := FND_API.G_RET_STS_SUCCESS;
1096 x_msg_count := 0;
1097
1098 IF G_DEBUG_MODE = 'Y' THEN
1099
1100 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.Delete_Unbaselined_Adjmts-----------' ;
1101 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1102
1103 END IF;
1104
1105 OPEN fund_recs;
1106 LOOP
1107 FETCH fund_recs BULK COLLECT INTO l_FundingIdTab,
1108 l_AgreementIdTab,
1109 l_ProjectIdTab,
1110 l_TaskIdTab,
1111 l_ProjfuncAllocTab,
1112 l_ProjfuncGainsTab,
1113 l_ProjfuncLossTab,
1114 l_InvprocAllocTab,
1115 l_RevprocAllocTab
1116 LIMIT l_FetchSize;
1117
1118 l_ThisFetch := fund_recs%ROWCOUNT - l_TotalFetch;
1119 l_TotalFetch := fund_recs%ROWCOUNT ;
1120
1121 IF l_ThisFetch > 0 THEN
1122
1123 FORALL i IN l_FundingIdTab.FIRST..l_FundingIdTab.LAST
1124 DELETE FROM pa_events
1125 WHERE project_funding_id = l_FundingIdTab(i)
1126 AND Project_ID = l_ProjectIdTab(i);
1127
1128 FORALL i IN l_FundingIdTab.FIRST..l_FundingIdTab.LAST
1129 DELETE FROM pa_project_fundings
1130 WHERE project_funding_id = l_FundingIdTab(i);
1131
1132 FORALL i IN l_ProjfuncAllocTab.FIRST..l_ProjfuncAllocTab.LAST
1133 UPDATE pa_summary_project_fundings
1134 SET projfunc_unbaselined_amount =
1135 nvl(projfunc_unbaselined_amount,0) - nvl(l_ProjfuncAllocTab(i),0),
1136 invproc_unbaselined_amount =
1137 nvl(invproc_unbaselined_amount,0) - nvl(l_InvprocAllocTab(i),0),
1138 revproc_unbaselined_amount =
1139 nvl(revproc_unbaselined_amount,0) - nvl(l_RevprocAllocTab(i),0),
1140 projfunc_realized_gains_amt =
1141 nvl(projfunc_realized_gains_amt,0) - nvl(l_ProjfuncGainsTab(i),0),
1142 projfunc_realized_losses_amt =
1143 nvl(projfunc_realized_losses_amt,0) - nvl(l_ProjfuncLossTab(i),0)
1144 WHERE agreement_id = l_AgreementIdTab(i)
1145 AND project_id = l_ProjectIdTab(i)
1146 AND nvl(task_id,-99) = nvl(l_TaskIdTab(i),-99);
1147
1148 /* Insert the details of project funding line deleted as delete process requires output */
1149
1150 IF p_run_mode = 'DELETE' THEN
1151
1152 l_ReasonCode := NULL;
1153
1154 FOR j IN l_AgreementIdTab.FIRST..l_AgreementIdTab.LAST LOOP
1155
1156 Insert_distribution_warnings(
1157 p_project_id => p_project_id,
1158 p_task_id => l_TaskIdTab(j),
1159 p_agreement_id => l_AgreementIdTab(j),
1160 p_reason_code => l_ReasonCode,
1161 x_return_status => l_return_status,
1162 x_msg_count => l_msg_count,
1163 x_msg_data => l_msg_data) ;
1164
1165
1166 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1167
1168 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1169
1170 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1171
1172 RAISE FND_API.G_EXC_ERROR;
1173
1174 END IF;
1175
1176 END LOOP;
1177
1178 END IF; /*p_run_mode = 'DELETE' */
1179
1180 END IF; /* l_ThisFetch > 0 */
1181
1182 /* Initialize for next fetch */
1183 l_FundingIdTab.DELETE;
1184 l_AgreementIdTab.DELETE;
1185 l_ProjectIdTab.DELETE;
1186 l_TaskIdTab.DELETE;
1187 l_ProjfuncAllocTab.DELETE;
1188 l_ProjfuncGainsTab.DELETE;
1189 l_ProjfuncLossTab.DELETE;
1190 l_InvprocAllocTab.DELETE;
1191 l_RevprocAllocTab.DELETE;
1192
1193 IF l_ThisFetch < l_FetchSize THEN
1194 EXIT;
1195 END IF;
1196
1197 END LOOP;
1198 CLOSE fund_recs;
1199
1200 IF G_DEBUG_MODE = 'Y' THEN
1201
1202 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.Delete_Unbaselined_Adjmts-----------' ;
1203 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1204
1205 END IF;
1206
1207 EXCEPTION
1208
1209 WHEN FND_API.G_EXC_ERROR THEN
1210 x_return_status := l_return_status;
1211 x_msg_count := l_msg_count;
1212 x_msg_data := l_msg_data;
1213
1214 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1215 x_return_status := l_return_status;
1216 x_msg_count := l_msg_count;
1217 x_msg_data := l_msg_data;
1218
1219 WHEN OTHERS THEN
1220 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1221 x_msg_count := l_msg_count;
1222 x_msg_data := SUBSTR(SQLERRM,1,100);
1223
1224 IF G_DEBUG_MODE = 'Y' THEN
1225
1226 PA_DEBUG.g_err_stage := 'Delete_Unbaselined_Adjmts:' || x_msg_data ;
1227 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1228
1229 END IF;
1230
1231 END Delete_Unbaselined_Adjmts;
1232
1233
1234 /*----------------------------------------------------------------------------------------+
1235 | Procedure : Insert_distribution_warnings |
1236 | Purpose : To insert rejection reasons in distribution table |
1237 | Parameters : |
1238 | ================================================================================== |
1239 | Name Mode Description |
1240 | ================================================================================== |
1241 | p_project_id IN Project ID |
1242 | p_agreement_id IN Agreement ID |
1243 | p_task_id IN Task id of summary project funding |
1244 | p_reason_code IN Rejection Reason |
1245 | x_return_status OUT Return status of this procedure |
1246 | x_msg_count OUT Error message count |
1247 | x_msg_data OUT Error message |
1248 | ================================================================================== |
1249 +----------------------------------------------------------------------------------------*/
1250
1251 PROCEDURE Insert_distribution_warnings(
1252 p_project_id IN NUMBER,
1253 p_agreement_id IN NUMBER DEFAULT NULL,
1254 p_task_id IN NUMBER DEFAULT NULL,
1255 p_reason_code IN VARCHAR2,
1256 x_return_status OUT NOCOPY VARCHAR2,
1257 x_msg_count OUT NOCOPY NUMBER,
1258 x_msg_data OUT NOCOPY VARCHAR2) IS
1259
1260
1261 l_return_status VARCHAR2(30) := NULL;
1262 l_msg_count NUMBER := NULL;
1263 l_msg_data VARCHAR2(250) := NULL;
1264
1265 l_LogMsg VARCHAR2(250);
1266 l_Reason VARCHAR2(250);
1267
1268 CURSOR rej_reason IS SELECT meaning FROM PA_LOOKUPS
1269 WHERE lookup_type = 'FUNDING REVAL REJECTION'
1270 AND lookup_code = p_reason_code;
1271
1272 BEGIN
1273 x_return_status := FND_API.G_RET_STS_SUCCESS;
1274 x_msg_count := 0;
1275
1276 IF G_DEBUG_MODE = 'Y' THEN
1277
1278 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.Insert_distribution_warnings-----------' ;
1279 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1280
1281 l_LogMsg := 'Reason :' || p_reason_code;
1282 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
1283
1284 END IF;
1285
1286 IF p_reason_code IS NOT NULL THEN
1287
1288 OPEN rej_reason;
1289 FETCH rej_reason INTO l_reason;
1290 CLOSE rej_reason;
1291
1292 END IF;
1293
1294 INSERT INTO PA_DISTRIBUTION_WARNINGS
1295 (
1296 PROJECT_ID, AGREEMENT_ID, TASK_ID, LAST_UPDATE_DATE, LAST_UPDATED_BY,
1297 CREATION_DATE, CREATED_BY, REQUEST_ID, PROGRAM_APPLICATION_ID,
1298 PROGRAM_ID, PROGRAM_UPDATE_DATE, WARNING_MESSAGE_CODE, WARNING_MESSAGE
1299 )
1300 VALUES
1301 (
1302 p_project_id, p_agreement_id, p_task_id, SYSDATE, G_LAST_UPDATED_BY,
1303 SYSDATE, G_LAST_UPDATED_BY, G_REQUEST_ID, G_PROGRAM_APPLICATION_ID,
1304 G_PROGRAM_ID, SYSDATE, p_reason_code, l_reason
1305 );
1306
1307 IF G_DEBUG_MODE = 'Y' THEN
1308
1309 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.Insert_distribution_warnings-----------' ;
1310 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1311
1312 END IF;
1313
1314 EXCEPTION
1315
1316 WHEN FND_API.G_EXC_ERROR THEN
1317 x_return_status := l_return_status;
1318 x_msg_count := l_msg_count;
1319 x_msg_data := l_msg_data;
1320
1321 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1322 x_return_status := l_return_status;
1323 x_msg_count := l_msg_count;
1324 x_msg_data := l_msg_data;
1325
1326 WHEN OTHERS THEN
1327 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1328 x_msg_count := l_msg_count;
1329 x_msg_data := SUBSTR(SQLERRM,1,100);
1330
1331 IF G_DEBUG_MODE = 'Y' THEN
1332
1333 PA_DEBUG.g_err_stage := 'Insert_distribution_warnings:' || x_msg_data ;
1334 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1335
1336 END IF;
1337
1338 END Insert_distribution_warnings;
1339
1340 /*----------------------------------------------------------------------------------------+
1341 | Procedure : initialize |
1342 | Purpose : To initialize all required params/debug requirements |
1343 +----------------------------------------------------------------------------------------*/
1344
1345
1346 PROCEDURE Initialize IS
1347
1348 l_debug_mode VARCHAR2(10);
1349
1350 BEGIN
1351
1352 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
1353 l_debug_mode := NVL(l_debug_mode, 'N');
1354 G_DEBUG_MODE := l_debug_mode;
1355
1356 IF G_DEBUG_MODE = 'Y' THEN
1357
1358 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_UTIL.initialize-----------';
1359 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1360
1361 END IF;
1362
1363 G_LAST_UPDATE_LOGIN := fnd_global.login_id;
1364 G_REQUEST_ID := fnd_global.conc_request_id;
1365 G_PROGRAM_APPLICATION_ID := fnd_global.prog_appl_id;
1366 G_PROGRAM_ID := fnd_global.conc_program_id;
1367 G_LAST_UPDATED_BY := fnd_global.user_id;
1368 G_CREATED_BY := fnd_global.user_id;
1369
1370 IF G_DEBUG_MODE = 'Y' THEN
1371
1372 PA_DEBUG.Set_Curr_Function( p_function => 'Funding Revaluation',
1373 p_debug_mode => l_debug_mode );
1374
1375 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_UTIL.initialize-----------';
1376 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1377
1378 END IF;
1379
1380 END initialize;
1381
1382
1383 /*----------------------------------------------------------------------------------------+
1384 | Procedure : get_reval_projects |
1385 | Purpose : To open all projects eligible for funding revaluation based on |
1386 | given project numbers |
1387 | Parameters : |
1388 | ================================================================================== |
1389 | Name Mode Description |
1390 | ================================================================================== |
1391 | p_project_id IN Project ID |
1392 | p_project_type_id IN Project Type ID |
1393 | p_from_proj_number IN Start project number |
1394 | p_to_proj_number IN End project number |
1395 | p_run_mode IN Run mode |
1396 | Values are 'SINGLE', 'RANGE' |
1397 | x_return_status OUT Return status of this procedure |
1398 | x_msg_count OUT Error message count |
1399 | x_msg_data OUT Error message |
1400 | ================================================================================== |
1401 +----------------------------------------------------------------------------------------*/
1402 PROCEDURE get_reval_projects(
1403 p_project_id IN NUMBER,
1404 p_project_type_id IN NUMBER,
1405 p_from_proj_number IN VARCHAR2,
1406 p_to_proj_number IN VARCHAR2,
1407 p_run_mode IN VARCHAR2,
1408 x_return_status OUT NOCOPY VARCHAR2,
1409 x_msg_count OUT NOCOPY NUMBER,
1410 x_msg_data OUT NOCOPY VARCHAR2) IS
1411
1412
1413 /* This CURSOR selects all projects with the following criteria
1414 a) should be contract projects
1415 b) revaluate_funding_flag is enabled
1416 c) Falls within the given range start/end project numbers */
1417
1418 CURSOR open_projects IS
1419 SELECT P.project_id, P.baseline_funding_flag,
1420 P.include_gains_losses_flag include_gains_losses_flag,
1421 P.carrying_out_organization_id,
1422 P.projfunc_bil_rate_type projfunc_bil_rate_type,
1423 P.projfunc_bil_exchange_rate projfunc_bil_exchange_rate,
1424 DECODE(P.invproc_currency_type,
1425 'PROJECT_CURRENCY', P.project_bil_rate_type,
1426 'PROJFUNC_CURRENCY', P.projfunc_bil_rate_type,
1427 'FUNDING_CURRENCY', P.funding_rate_type) invproc_rate_type,
1428 DECODE(P.invproc_currency_type,
1429 'PROJECT_CURRENCY', P.project_bil_exchange_rate,
1430 'PROJFUNC_CURRENCY', P.projfunc_bil_exchange_rate,
1431 'FUNDING_CURRENCY', P.funding_exchange_rate) invproc_exchange_rate,
1432 T.RLZD_GAINS_EVENT_TYPE_ID,
1433 T.RLZD_LOSSES_EVENT_TYPE_ID
1434 FROM pa_projects P, pa_project_types T
1435 WHERE P.segment1 BETWEEN p_from_proj_number
1436 AND p_to_proj_number
1437 AND P.PROJECT_TYPE = T.PROJECT_TYPE
1438 AND T.DIRECT_FLAG = 'Y'
1439 AND T.PROJECT_TYPE_ID = NVL(P_PROJECT_TYPE_ID ,T.project_type_id)
1440 AND NVL(P.revaluate_funding_flag, 'N') = 'Y'
1441 AND NVL(P.template_flag, 'N') = 'N'
1442 ORDER BY segment1 ;
1443
1444 /* Removed the +join and added NVL to handle it */
1445
1446 CURSOR get_event_type(l_EventTypeId NUMBER) IS
1447 SELECT event_type, description from pa_event_types
1448 WHERE event_type_id = l_EventTypeId;
1449
1450 l_EligibleFlag VARCHAR2(1);
1451 l_ReasonCode VARCHAR2(30);
1452 l_GainEventTypeId NUMBER;
1453 l_LossEventTypeId NUMBER;
1454
1455 l_return_status VARCHAR2(30) := NULL;
1456 l_msg_count NUMBER := NULL;
1457 l_msg_data VARCHAR2(250) := NULL;
1458 l_ErrCode NUMBER := NULL;
1459 l_LogMsg VARCHAR2(250);
1460
1461 BEGIN
1462 x_return_status := FND_API.G_RET_STS_SUCCESS;
1463 x_msg_count := 0;
1464
1465 IF G_DEBUG_MODE = 'Y' THEN
1466
1467 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_reval_projects-----------' ;
1468 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1469
1470 l_LogMsg := 'From prj:' || p_from_proj_number ||
1471 ' To prj:' || p_to_proj_number ||
1472 ' Proj type:' || p_project_type_id ;
1473 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
1474
1475 END IF;
1476
1477
1478 FOR proj_rec in open_projects LOOP
1479
1480 /* Checks if project passes eligibility criterion */
1481
1482 IF G_DEBUG_MODE = 'Y' THEN
1483
1484 l_LogMsg := 'Project ID :' || proj_rec.project_id ;
1485 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
1486
1487 END IF;
1488
1489 validate_project_eligibility (
1490 p_project_id => proj_rec.project_id,
1491 p_run_mode => p_run_mode,
1492 x_eligible_flag => l_EligibleFlag,
1493 x_return_status => l_return_status,
1494 x_msg_count => l_msg_count,
1495 x_msg_data => l_msg_data);
1496
1497 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1498
1499 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1500
1501 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1502
1503 RAISE FND_API.G_EXC_ERROR;
1504
1505 END IF;
1506
1507 IF G_DEBUG_MODE = 'Y' THEN
1508
1509 l_LogMsg := 'Reval Eligible :' || l_EligibleFlag ;
1510 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
1511
1512 END IF;
1513
1514 IF l_EligibleFlag = 'T' THEN /* Project is qualified for revaluation */
1515
1516 /* Initialize all global objects maintained across project/agreement */
1517
1518 G_InvCompTab.DELETE;
1519 G_RetnApplAmtTab.DELETE;
1520 G_RevalCompTab.DELETE;
1521
1522 PA_MULTI_CURRENCY_BILLING.init_cache(p_project_id => proj_rec.project_id);
1523
1524 G_ProjLvlGlobRec.project_id := proj_rec.project_id;
1525 G_ProjLvlGlobRec.carrying_out_organization_id := proj_rec.carrying_out_organization_id;
1526 G_ProjLvlGlobRec.baseline_funding_flag := proj_rec.baseline_funding_flag;
1527 G_ProjLvlGlobRec.include_gains_losses_flag := proj_rec.include_gains_losses_flag;
1528 G_ProjLvlGlobRec.projfunc_bil_rate_type := proj_rec.projfunc_bil_rate_type;
1529 G_ProjLvlGlobRec.projfunc_bil_exchange_rate := proj_rec.projfunc_bil_exchange_rate;
1530 G_ProjLvlGlobRec.invproc_rate_type := proj_rec.invproc_rate_type;
1531 G_ProjLvlGlobRec.invproc_exchange_rate := proj_rec.invproc_exchange_rate;
1532 G_ProjLvlGlobRec.Zero_dollar_reval_flag := 'Y';
1533 l_GainEventTypeId := proj_rec.rlzd_gains_event_type_id;
1534 l_LossEventTypeId := proj_rec.rlzd_losses_event_type_id;
1535
1536 OPEN get_event_type (l_GainEventTypeId);
1537 FETCH get_event_type INTO G_ProjLvlGlobRec.gain_event_type, G_ProjLvlGlobRec.gain_event_desc;
1538 CLOSE get_event_type;
1539
1540 OPEN get_event_type (l_LossEventTypeId);
1541 FETCH get_event_type INTO G_ProjLvlGlobRec.loss_event_type, G_ProjLvlGlobRec.loss_event_desc;
1542 CLOSE get_event_type;
1543
1544 IF G_DEBUG_MODE = 'Y' THEN
1545
1546 l_LogMsg := 'Loss Event type:' || G_ProjLvlGlobRec.loss_event_type ||
1547 ' Gain Event type:' || G_ProjLvlGlobRec.gain_event_type;
1548 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
1549
1550 l_LogMsg := 'Proj Lvl Baseline Flag :' || G_ProjLvlGlobRec.baseline_funding_flag ||
1551 ' Proj Lvl include gains/losses flag :' || G_ProjLvlGlobRec.include_gains_losses_flag;
1552 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
1553
1554 l_LogMsg := 'Proj Lvl PFC Rate Type :' || G_ProjLvlGlobRec.projfunc_bil_rate_type ||
1555 ' Proj Lvl PFC Exch Rate :' || G_ProjLvlGlobRec.projfunc_bil_exchange_rate;
1556 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
1557
1558 l_LogMsg := 'Proj Lvl IPC Rate Type :' || G_ProjLvlGlobRec.invproc_rate_type ||
1559 ' Proj Lvl IPC Exch Rate :' || G_ProjLvlGlobRec.invproc_exchange_rate;
1560 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
1561
1562 END IF;
1563
1564 get_spf_lines (x_return_status => l_return_status,
1565 x_msg_count => l_msg_count,
1566 x_msg_data => l_msg_data);
1567
1568 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1569
1570 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1571
1572 ELSIF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
1573
1574 IF G_ProjLvlGlobRec.Zero_dollar_reval_flag = 'Y' THEN
1575
1576 l_ReasonCode := 'PA_FR_NO_REVALUATION';
1577
1578 Insert_distribution_warnings(
1579 p_project_id => G_ProjLvlGlobRec.project_id,
1580 p_reason_code => l_ReasonCode,
1581 x_return_status => l_return_status,
1582 x_msg_count => l_msg_count,
1583 x_msg_data => l_msg_data) ;
1584
1585 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1586
1587 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1588
1589 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1590
1591 RAISE FND_API.G_EXC_ERROR;
1592
1593 END IF;
1594
1595 ELSE
1596
1597 IF nvl(G_BASELINE_FLAG,'N') = 'Y' AND
1598 nvl(G_ProjLvlGlobRec.baseline_funding_flag,'N') = 'Y' THEN
1599
1600 IF G_DEBUG_MODE = 'Y' THEN
1601
1602 l_LogMsg := 'Calling Baselining';
1603 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
1604
1605 END IF;
1606
1607 l_ErrCode := 0;
1608
1609
1610 PA_BASELINE_FUNDING_PKG.create_budget_baseline (
1611 p_project_id => G_ProjLvlGlobRec.project_id,
1612 x_err_code => l_ErrCode,
1613 x_status => l_msg_data );
1614
1615 IF l_ErrCode <> 0 THEN
1616
1617 /* Baselining error is handled here b'cos there are no expected
1618 error code /messages defined specifically for it. Also dependent
1619 on budget model */
1620 /*Bug 3986205 : Replaced p_project_id with G_ProjLvlGlobRec.project_id in the following INSERT statement */
1621
1622 INSERT INTO PA_DISTRIBUTION_WARNINGS
1623 (
1624 PROJECT_ID, LAST_UPDATE_DATE, LAST_UPDATED_BY,
1625 CREATION_DATE, CREATED_BY, REQUEST_ID, PROGRAM_APPLICATION_ID,
1626 PROGRAM_ID, PROGRAM_UPDATE_DATE, WARNING_MESSAGE_CODE, WARNING_MESSAGE
1627 )
1628 VALUES
1629 (
1630 G_ProjLvlGlobRec.project_id, SYSDATE, G_LAST_UPDATED_BY,
1631 SYSDATE, G_LAST_UPDATED_BY, G_REQUEST_ID, G_PROGRAM_APPLICATION_ID,
1632 G_PROGRAM_ID, SYSDATE, 'BASELINE ERROR', l_msg_data
1633 );
1634
1635 END IF; /* l_ErrCode <> 0 */
1636
1637 END IF; /* nvl(G_BASELINE_FLAG,'N') = 'Y' */
1638
1639 END IF; /* Zero dollar reval flag */
1640
1641 END IF; /* l_return_status */
1642
1643 COMMIT; /* Commit all processing for the current project */
1644
1645 END IF; /* Eligible flag */
1646
1647 END LOOP ; /* Open_projects*/
1648
1649 IF G_DEBUG_MODE = 'Y' THEN
1650
1651 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_reval_projects-----------' ;
1652 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1653
1654 END IF;
1655
1656
1657 EXCEPTION
1658
1659 WHEN FND_API.G_EXC_ERROR THEN
1660 x_return_status := l_return_status;
1661 x_msg_count := l_msg_count;
1662 x_msg_data := l_msg_data;
1663
1664 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1665 x_return_status := l_return_status;
1666 x_msg_count := l_msg_count;
1667 x_msg_data := l_msg_data;
1668
1669 WHEN OTHERS THEN
1670 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1671 x_msg_count := l_msg_count;
1672 x_msg_data := SUBSTR(SQLERRM,1,100);
1673
1674 IF G_DEBUG_MODE = 'Y' THEN
1675
1676 PA_DEBUG.g_err_stage := 'get_reval_projects:' || x_msg_data ;
1677 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1678
1679 END IF;
1680
1681 END get_reval_projects;
1682
1683 /*----------------------------------------------------------------------------------------+
1684 | Procedure : get_spf_lines |
1685 | Purpose : To get summary project funding lines for a project initialized in |
1686 | G_ProjLvlGlobRec structure |
1687 | Parameters : |
1688 | ================================================================================== |
1689 | Name Mode Description |
1690 | ================================================================================== |
1691 | x_return_status OUT Return status of this procedure |
1692 | x_msg_count OUT Error message count |
1693 | x_msg_data OUT Error message |
1694 | ================================================================================== |
1695 +----------------------------------------------------------------------------------------*/
1696
1697 PROCEDURE get_spf_lines(
1698 x_return_status OUT NOCOPY VARCHAR2,
1699 x_msg_count OUT NOCOPY NUMBER,
1700 x_msg_data OUT NOCOPY VARCHAR2) IS
1701
1702 /* This CURSOR selects the summary project funding lines with non-zero baselined amount
1703 for the given project in primary set of book id only*/
1704
1705 CURSOR get_spf_lines (l_ProjectId NUMBER) is
1706 SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
1707 SPF.agreement_id agreement_id,
1708 SPF.task_id task_id,
1709 SPF.funding_currency_code funding_currency_code,
1710 SPF.project_currency_code project_currency_code,
1711 SPF.projfunc_currency_code projfunc_currency_code,
1712 SPF.invproc_currency_code invproc_currency_code,
1713 SPF.total_baselined_amount total_baselined_amount,
1714 SPF.projfunc_baselined_amount projfunc_baselined_amount,
1715 SPF.invproc_baselined_amount invproc_baselined_amount,
1716 SPF.projfunc_realized_gains_amt projfunc_realized_gains_amt,
1717 SPF.projfunc_realized_losses_amt projfunc_realized_losses_amt,
1718 SPF.projfunc_accrued_amount projfunc_accrued_amount,
1719 SPF.invproc_billed_amount invproc_billed_amount,
1720 PC.retention_level_code retention_level_code,
1721 PC.customer_id customer_id
1722 FROM pa_summary_project_fundings SPF, pa_agreements_all A, pa_project_customers PC
1723 WHERE SPF.project_id = l_ProjectId
1724 AND A.agreement_id = SPF.agreement_id
1725 AND PC.customer_id = A.customer_id
1726 AND PC.project_id = SPF.project_id
1727 AND (NVL(SPF.total_baselined_amount,0) <> 0)
1728 ORDER BY PC.customer_id, SPF.agreement_id, SPF.task_id , set_of_books_id;
1729
1730 /* This CURSOR selects the summary project funding lines with non-zero baselined amount
1731 for the given project in primary and reporting set of book ids */
1732
1733
1734 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will obsoleted, replace with
1735 new table gl_alc_ledger_rships_v and corresponding columns */
1736
1737 /* mrc migration to SLA bug 4571438
1738 CURSOR get_all_spf_lines (l_ProjectId NUMBER) is
1739 (SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
1740 SPF.agreement_id agrmt_id,
1741 SPF.task_id task_id,
1742 SPF.funding_currency_code funding_currency_code,
1743 SPF.project_currency_code project_currency_code,
1744 SPF.projfunc_currency_code projfunc_currency_code,
1745 SPF.invproc_currency_code invproc_currency_code,
1746 SPF.total_baselined_amount total_baselined_amount,
1747 SPF.projfunc_baselined_amount projfunc_baselined_amount,
1748 SPF.invproc_baselined_amount invproc_baselined_amount,
1749 SPF.projfunc_realized_gains_amt projfunc_realized_gains_amt,
1750 SPF.projfunc_realized_losses_amt projfunc_realized_losses_amt,
1751 SPF.projfunc_accrued_amount projfunc_accrued_amount,
1752 SPF.invproc_billed_amount invproc_billed_amount,
1753 PC.retention_level_code retention_level_code,
1754 PC.customer_id cust_id
1755 FROM pa_summary_project_fundings SPF, pa_agreements_all A, pa_project_customers PC
1756 WHERE SPF.project_id = l_ProjectId
1757 AND A.agreement_id = SPF.agreement_id
1758 AND PC.customer_id = A.customer_id
1759 AND PC.project_id = SPF.project_id
1760 AND (NVL(SPF.total_baselined_amount,0) <> 0)
1761 UNION
1762 SELECT SPF_mc.set_of_books_id,
1763 SPF.agreement_id agrmt_id,
1764 SPF.task_id task_id,
1765 SPF.funding_currency_code funding_currency_code,
1766 'NA' project_currency_code,
1767 SPF_mc.currency_code projfunc_currency_code,
1768 SPF.invproc_currency_code invproc_currency_code,
1769 SPF.total_baselined_amount total_baselined_amount,
1770 SPF_mc.total_baselined_amount projfunc_baselined_amount,
1771 SPF.invproc_baselined_amount invproc_baselined_amount,
1772 SPF_mc.realized_gains_amt projfunc_realized_gains_amt,
1773 SPF_mc.realized_losses_amt projfunc_realized_losses_amt,
1774 SPF_mc.total_accrued_amount projfunc_accrued_amount,
1775 SPF.invproc_billed_amount invproc_billed_amount,
1776 PC.retention_level_code retention_level_code,
1777 PC.customer_id cust_id
1778 FROM pa_mc_sum_proj_fundings SPF_mc, pa_summary_project_fundings SPF,
1779 pa_agreements_all A, pa_project_customers PC,
1780 gl_alc_ledger_rships_v rep, pa_implementations imp
1781 WHERE SPF.project_id = l_ProjectId
1782 AND A.agreement_id = SPF.agreement_id
1783 AND PC.customer_id = A.customer_id
1784 AND PC.project_id = SPF.project_id
1785 AND (NVL(SPF.total_baselined_amount,0) <> 0)
1786 AND rep.source_ledger_id = imp.set_of_books_id
1787 AND rep.relationship_enabled_flag = 'Y'
1788 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
1789 AND rep.application_id = 275
1790 AND spf_mc.set_of_books_id =rep.ledger_id
1791 AND spf_mc.project_id = spf.project_id
1792 AND spf_mc.agreement_id = spf.agreement_id
1793 AND nvl(spf_mc.task_id,0) = nvl(spf.task_id,0)
1794 )
1795 ORDER BY cust_id, agrmt_id, task_id , set_of_books_id; */
1796
1797 l_SetOfBookIdTab PA_PLSQL_DATATYPES.IDTabTyp;
1798 l_AgreementIdTab PA_PLSQL_DATATYPES.IDTabTyp;
1799 l_TaskIdTab PA_PLSQL_DATATYPES.IDTabTyp;
1800 l_FCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
1801 l_PCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
1802 l_PFCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
1803 l_IPCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
1804 l_FCBaseAmtTab PA_PLSQL_DATATYPES.NumTabTyp;
1805 l_PFCBaseAmtTab PA_PLSQL_DATATYPES.NumTabTyp;
1806 l_IPCBaseAmtTab PA_PLSQL_DATATYPES.NumTabTyp;
1807 l_PFCGainAmtTab PA_PLSQL_DATATYPES.NumTabTyp;
1808 l_PFCLossAmtTab PA_PLSQL_DATATYPES.NumTabTyp;
1809 l_PFCAccruedAmtTab PA_PLSQL_DATATYPES.NumTabTyp;
1810 l_IPCBilledAmtTab PA_PLSQL_DATATYPES.NumTabTyp;
1811 l_RetnLevelTab PA_PLSQL_DATATYPES.Char30TabTyp;
1812 l_CustomerIdTab PA_PLSQL_DATATYPES.IDTabTyp;
1813
1814 l_SPFLineTab SPFTabTyp;
1815
1816 l_PrvAgrId NUMBER := 0;
1817 l_PrvTaskId NUMBER := 0;
1818 l_RetnLevelCode VARCHAR2(30);
1819
1820 l_TotalFetch NUMBER := 0;
1821 l_ThisFetch NUMBER := 0;
1822 l_FetchSize NUMBER := 50;
1823
1824 l_ReasonCode VARCHAR2(30);
1825 l_return_status VARCHAR2(30) := NULL;
1826 l_msg_count NUMBER := NULL;
1827 l_msg_data VARCHAR2(250) := NULL;
1828 l_LogMsg VARCHAR2(250);
1829 BEGIN
1830 x_return_status := FND_API.G_RET_STS_SUCCESS;
1831 x_msg_count := 0;
1832
1833 IF G_DEBUG_MODE = 'Y' THEN
1834
1835 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_spf_lines-----------' ;
1836 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
1837
1838 END IF;
1839
1840 /* When only primary set of book id is processed each SPF is unique and processing
1841 should be invoked for every record
1842 All the required values are passed into a global table G_RevalCompTab (indexed by set_of_books_id
1843 which will be used across routines to get revaluated amounts
1844 Table is used b'cos there will be multiple records for single spf when RC is being included
1845
1846 When both primary and reporting set of books id are processed, for every set of book id
1847 there will be an SPF record. Since primary and reporting are processed together (AR amounts would be
1848 for all sob 's of each invoice), the processing is called once for all sobs/agreement/task
1849 So the global table will have all required components for all SOB's of an agreement/task combination
1850
1851 */
1852 G_RevalCompTab.DELETE; /* Intialize for each project */
1853
1854 IF G_PRIMARY_ONLY = 'Y' THEN
1855
1856 IF G_DEBUG_MODE = 'Y' THEN
1857
1858 l_LogMsg := 'Cursor get_spf_lines ' ;
1859 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
1860
1861 END IF;
1862
1863 OPEN get_spf_lines (G_ProjLvlGlobRec.project_id);
1864 LOOP
1865 FETCH get_spf_lines BULK COLLECT INTO l_SetOfBookIdTab, l_AgreementIdTab, l_TaskIdTab,
1866 l_FCCurrTab, l_PCCurrTab, l_PFCCurrTab, l_IPCCurrTab,
1867 l_FCBaseAmtTab, l_PFCBaseAmtTab, l_IPCBaseAmtTab,
1868 l_PFCGainAmtTab, l_PFCLossAmtTab,
1869 l_PFCAccruedAmtTab, l_IPCBilledAmtTab,
1870 l_RetnLevelTab, l_CustomerIdTab
1871 LIMIT l_FetchSize;
1872
1873 l_ThisFetch := get_spf_lines%ROWCOUNT - l_TotalFetch;
1874 l_TotalFetch := get_spf_lines%ROWCOUNT ;
1875
1876 IF l_ThisFetch > 0 THEN
1877
1878
1879 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
1880
1881 l_RetnLevelCode := l_RetnLevelTab(i);
1882 G_RevalCompTab(l_SetOfBookIdTab(i)).project_id := G_ProjLvlGlobRec.project_id;
1883 G_RevalCompTab(l_SetOfBookIdTab(i)).agreement_id := l_AgreementIdTab(i);
1884 G_RevalCompTab(l_SetOfBookIdTab(i)).task_id := l_TaskIdTab(i);
1885 G_RevalCompTab(l_SetOfBookIdTab(i)).set_of_books_id := l_SetOfBookIdTab(i);
1886 G_RevalCompTab(l_SetOfBookIdTab(i)).enabled_flag := G_SobListTab(l_SetOfBookIdTab(i)).EnabledFlag;
1887 G_RevalCompTab(l_SetOfBookIdTab(i)).funding_currency_code := l_FCCurrTab(i);
1888 G_RevalCompTab(l_SetOfBookIdTab(i)).project_currency_code := l_PCCurrTab(i);
1889 G_RevalCompTab(l_SetOfBookIdTab(i)).projfunc_currency_code := l_PFCCurrTab(i);
1890 G_RevalCompTab(l_SetOfBookIdTab(i)).invproc_currency_code := l_IPCCurrTab(i);
1891 G_RevalCompTab(l_SetOfBookIdTab(i)).total_baselined_amount := nvl(l_FCBaseAmtTab(i),0);
1892 G_RevalCompTab(l_SetOfBookIdTab(i)).projfunc_baselined_amount := nvl(l_PFCBaseAmtTab(i),0);
1893 G_RevalCompTab(l_SetOfBookIdTab(i)).invproc_baselined_amount := nvl(l_IPCBaseAmtTab(i),0);
1894 G_RevalCompTab(l_SetOfBookIdTab(i)).realized_gains_amount := nvl(l_PFCGainAmtTab(i),0);
1895 G_RevalCompTab(l_SetOfBookIdTab(i)).realized_losses_amount := nvl(l_PFCLossAmtTab(i),0);
1896 G_RevalCompTab(l_SetOfBookIdTab(i)).projfunc_accrued_amount := nvl(l_PFCAccruedAmtTab(i),0);
1897 G_RevalCompTab(l_SetOfBookIdTab(i)).invproc_billed_amount := nvl(l_IPCBilledAmtTab(i),0);
1898
1899 /* Call processing routine for every SPF as no reporting set of books are processed */
1900 process_spf_lines (
1901 p_agreement_id => l_AgreementIdTab(i),
1902 p_task_id => l_TaskIdTab(i),
1903 p_retention_level_code => l_RetnLevelCode,
1904 x_return_status => l_return_status,
1905 x_msg_count => l_msg_count,
1906 x_msg_data => l_msg_data);
1907
1908 G_RevalCompTab.DELETE; /* Initialize for next SPF record */
1909
1910 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1911
1912 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1913
1914 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1915
1916 RAISE FND_API.G_EXC_ERROR;
1917
1918 END IF;
1919
1920 END LOOP; /* l_SetOfBookIdTab */
1921
1922 END IF; /* l_ThisFetch > 0 */
1923
1924 /* Initialize for next fetch */
1925 l_SetOfBookIdTab.DELETE;
1926 l_AgreementIdTab.DELETE;
1927 l_TaskIdTab.DELETE;
1928 l_FCCurrTab.DELETE;
1929 l_PCCurrTab.DELETE;
1930 l_PFCCurrTab.DELETE;
1931 l_IPCCurrTab.DELETE;
1932 l_FCBaseAmtTab.DELETE;
1933 l_PFCBaseAmtTab.DELETE;
1934 l_IPCBaseAmtTab.DELETE;
1935 l_PFCGainAmtTab.DELETE;
1936 l_PFCLossAmtTab.DELETE;
1937 l_PFCAccruedAmtTab.DELETE;
1938 l_IPCBilledAmtTab.DELETE;
1939 l_RetnLevelTab.DELETE;
1940 l_CustomerIdTab.DELETE;
1941
1942 IF l_ThisFetch < l_FetchSize THEN
1943
1944 Exit;
1945
1946 END IF;
1947
1948 END LOOP; /* get_spf_lines */
1949 CLOSE get_spf_lines ;
1950
1951 /* mrc migration to SLA bug 4571438 ELSE
1952 ( IF G_DEBUG_MODE = 'Y' THEN
1953
1954 l_LogMsg := 'Cursor get_all_spf_lines ' ;
1955 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
1956
1957 END IF;
1958
1959 OPEN get_all_spf_lines (G_ProjLvlGlobRec.project_id);
1960 LOOP
1961
1962 FETCH get_all_spf_lines BULK COLLECT INTO l_SetOfBookIdTab, l_AgreementIdTab, l_TaskIdTab,
1963 l_FCCurrTab, l_PCCurrTab, l_PFCCurrTab, l_IPCCurrTab,
1964 l_FCBaseAmtTab, l_PFCBaseAmtTab, l_IPCBaseAmtTab,
1965 l_PFCGainAmtTab, l_PFCLossAmtTab,
1966 l_PFCAccruedAmtTab, l_IPCBilledAmtTab,
1967 l_RetnLevelTab, l_CustomerIdTab
1968 LIMIT l_FetchSize;
1969
1970 l_ThisFetch := get_all_spf_lines%ROWCOUNT - l_TotalFetch;
1971 l_TotalFetch := get_all_spf_lines%ROWCOUNT ;
1972
1973 IF l_ThisFetch > 0 THEN
1974
1975 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
1976
1977 -- Call processing routine for every SPF only group all reporting set of books together
1978 -- Call processing only when agreement/task changes
1979
1980 IF l_PrvAgrId = 0 THEN
1981 l_PrvAgrId := l_AgreementIdTab(i);
1982 l_PrvTaskId := nvl(l_TaskIdTab(i),0);
1983 END IF;
1984
1985 IF ((l_PrvAgrId <> l_AgreementIdTab(i)) OR
1986 (l_PrvTaskId <> nvl(l_TaskIdTab(i),0))) THEN
1987
1988 process_spf_lines (
1989 p_agreement_id => l_PrvAgrId,
1990 p_task_id => l_PrvTaskId,
1991 p_retention_level_code => l_RetnLevelCode,
1992 x_return_status => l_return_status,
1993 x_msg_count => l_msg_count,
1994 x_msg_data => l_msg_data);
1995
1996 G_RevalCompTab.DELETE;
1997
1998 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1999
2000 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2001
2002 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2003
2004 RAISE FND_API.G_EXC_ERROR;
2005
2006 END IF;
2007
2008 l_PrvAgrId := l_AgreementIdTab(i);
2009 l_PrvTaskId := l_TaskIdTab(i);
2010
2011 END IF;
2012 l_RetnLevelCode := l_RetnLevelTab(i);
2013 G_RevalCompTab(l_SetOfBookIdTab(i)).project_id := G_ProjLvlGlobRec.project_id;
2014 G_RevalCompTab(l_SetOfBookIdTab(i)).agreement_id := l_AgreementIdTab(i);
2015 G_RevalCompTab(l_SetOfBookIdTab(i)).task_id := l_TaskIdTab(i);
2016 G_RevalCompTab(l_SetOfBookIdTab(i)).set_of_books_id := l_SetOfBookIdTab(i);
2017 G_RevalCompTab(l_SetOfBookIdTab(i)).enabled_flag := G_SobListTab(l_SetOfBookIdTab(i)).EnabledFlag;
2018 G_RevalCompTab(l_SetOfBookIdTab(i)).funding_currency_code := l_FCCurrTab(i);
2019 G_RevalCompTab(l_SetOfBookIdTab(i)).project_currency_code := l_PCCurrTab(i);
2020 G_RevalCompTab(l_SetOfBookIdTab(i)).projfunc_currency_code := l_PFCCurrTab(i);
2021 G_RevalCompTab(l_SetOfBookIdTab(i)).invproc_currency_code := l_IPCCurrTab(i);
2022 G_RevalCompTab(l_SetOfBookIdTab(i)).total_baselined_amount := nvl(l_FCBaseAmtTab(i),0);
2023 G_RevalCompTab(l_SetOfBookIdTab(i)).projfunc_baselined_amount := nvl(l_PFCBaseAmtTab(i),0);
2024 G_RevalCompTab(l_SetOfBookIdTab(i)).invproc_baselined_amount := nvl(l_IPCBaseAmtTab(i),0);
2025 G_RevalCompTab(l_SetOfBookIdTab(i)).realized_gains_amount := nvl(l_PFCGainAmtTab(i),0);
2026 G_RevalCompTab(l_SetOfBookIdTab(i)).realized_losses_amount := nvl(l_PFCLossAmtTab(i),0);
2027 G_RevalCompTab(l_SetOfBookIdTab(i)).projfunc_accrued_amount := nvl(l_PFCAccruedAmtTab(i),0);
2028 G_RevalCompTab(l_SetOfBookIdTab(i)).invproc_billed_amount := nvl(l_IPCBilledAmtTab(i),0);
2029 END LOOP;
2030
2031 END IF; -- l_ThisFetch > 0
2032
2033 IF l_ThisFetch < l_FetchSize THEN
2034
2035 IF l_ThisFetch > 0 THEN
2036
2037 -- Process for last set of records
2038
2039 process_spf_lines (
2040 p_agreement_id => l_PrvAgrId,
2041 p_task_id => l_PrvTaskId,
2042 p_retention_level_code => l_RetnLevelCode,
2043 x_return_status => l_return_status,
2044 x_msg_count => l_msg_count,
2045 x_msg_data => l_msg_data);
2046
2047 G_RevalCompTab.DELETE;
2048
2049 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2050
2051 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2052
2053 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2054
2055 RAISE FND_API.G_EXC_ERROR;
2056
2057 END IF;
2058
2059 END IF; -- l_ThisFetch > 0
2060
2061 EXIT;
2062
2063 END IF; -- l_ThisFetch < l_Fetchsize
2064
2065 -- Initialize for next fetch
2066 l_SetOfBookIdTab.DELETE;
2067 l_AgreementIdTab.DELETE;
2068 l_TaskIdTab.DELETE;
2069 l_FCCurrTab.DELETE;
2070 l_PCCurrTab.DELETE;
2071 l_PFCCurrTab.DELETE;
2072 l_IPCCurrTab.DELETE;
2073 l_FCBaseAmtTab.DELETE;
2074 l_PFCBaseAmtTab.DELETE;
2075 l_IPCBaseAmtTab.DELETE;
2076 l_PFCGainAmtTab.DELETE;
2077 l_PFCLossAmtTab.DELETE;
2078 l_PFCAccruedAmtTab.DELETE;
2079 l_IPCBilledAmtTab.DELETE;
2080 l_RetnLevelTab.DELETE;
2081 l_CustomerIdTab.DELETE;
2082
2083 END LOOP; -- get_all_spf_lines
2084 CLOSE get_all_spf_lines ;
2085 */
2086 END IF;
2087
2088 /* This code is added for bug 2569816. The project may not have any funding at all but
2089 other eligibility criteria may have satisfied*/
2090
2091 IF l_TotalFetch = 0 THEN
2092
2093 IF G_DEBUG_MODE = 'Y' THEN
2094
2095 l_LogMsg := 'No funding for revaluation ' ;
2096 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
2097
2098 END IF;
2099 /*
2100 The following 2 global values are reinitialized
2101 1) To avoid printing that no adjustment found in calling routine as by default it is set to Y
2102 and modified to N only when there are adjustments done. In this case there will not be any
2103 adjustment as there is no funding . So explicitly setting it to N
2104
2105 2) This is actually read from project table. In the parent routine there is a check for zero
2106 dollar flag => if N baseline routine will be called if baseline_funding_flag = 'Y'. So
2107 re setting this will not call baseline routine there
2108 */
2109
2110 G_ProjLvlGlobRec.Zero_dollar_reval_flag := 'N';
2111 G_ProjLvlGlobRec.baseline_funding_flag := 'N';
2112
2113 l_ReasonCode := 'PA_FR_NO_FUNDING';
2114
2115 Insert_distribution_warnings(
2116 p_project_id => G_ProjLvlGlobRec.project_id,
2117 p_reason_code => l_ReasonCode,
2118 x_return_status => l_return_status,
2119 x_msg_count => l_msg_count,
2120 x_msg_data => l_msg_data) ;
2121
2122 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2123
2124 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2125
2126 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2127
2128 RAISE FND_API.G_EXC_ERROR;
2129
2130 END IF;
2131
2132 END IF;
2133
2134 IF G_DEBUG_MODE = 'Y' THEN
2135
2136 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_spf_lines-----------' ;
2137 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2138
2139 END IF;
2140
2141 EXCEPTION
2142
2143 WHEN FND_API.G_EXC_ERROR THEN
2144 x_return_status := l_return_status;
2145 x_msg_count := l_msg_count;
2146 x_msg_data := l_msg_data;
2147
2148 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2149 x_return_status := l_return_status;
2150 x_msg_count := l_msg_count;
2151 x_msg_data := l_msg_data;
2152
2153 WHEN OTHERS THEN
2154 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2155 x_msg_count := l_msg_count;
2156 x_msg_data := SUBSTR(SQLERRM,1,100);
2157
2158 IF G_DEBUG_MODE = 'Y' THEN
2159
2160 PA_DEBUG.g_err_stage := 'get_spf_lines:' || x_msg_data ;
2161 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2162
2163 END IF;
2164
2165 END get_spf_lines;
2166
2167 /*----------------------------------------------------------------------------------------+
2168 | Procedure : process_spf_lines |
2169 | Purpose : To process spf lines based on project/task level funding |
2170 | project/task level retention |
2171 | Parameters : |
2172 | ================================================================================== |
2173 | Name Mode Description |
2174 | ================================================================================== |
2175 | p_agreement_id IN Agreement ID |
2176 | p_task_id IN Task ID of summary project funding |
2177 | p_retention_level_code IN Retention level code |
2178 | x_return_status OUT Return status of this procedure |
2179 | x_msg_count OUT Error message count |
2180 | x_msg_data OUT Error message |
2181 | ================================================================================== |
2182 +----------------------------------------------------------------------------------------*/
2183 PROCEDURE process_spf_lines(
2184 p_agreement_id IN NUMBER,
2185 p_task_id IN NUMBER,
2186 p_retention_level_code IN VARCHAR2,
2187 x_return_status OUT NOCOPY VARCHAR2,
2188 x_msg_count OUT NOCOPY NUMBER,
2189 x_msg_data OUT NOCOPY VARCHAR2) IS
2190
2191
2192
2193 l_TskFundPrjRetnFlag VARCHAR2(1);
2194 l_InvPrcdFlag VARCHAR2(1);
2195
2196 l_return_status VARCHAR2(30) := NULL;
2197 l_msg_count NUMBER := NULL;
2198 l_msg_data VARCHAR2(250) := NULL;
2199 l_LogMsg VARCHAR2(250);
2200 BEGIN
2201 x_return_status := FND_API.G_RET_STS_SUCCESS;
2202 x_msg_count := 0;
2203
2204 IF G_DEBUG_MODE = 'Y' THEN
2205
2206 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.process_spf_lines-----------' ;
2207 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2208
2209 l_LogMsg := 'Agreement Id:' || p_agreement_id ||
2210 ' Task Id:' || p_task_id ||
2211 ' Retention Level:' || p_retention_level_code;
2212
2213 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
2214
2215 END IF;
2216
2217 /* When the project is funded by top task level the spf will be for every agreement/
2218 top task. But the invoices will be by agreement which will have multiple top task.
2219
2220 When the agreement is read for the first time (that is for the first task being funded)
2221 all the invoices for that agreement are read and the line amounts are cached against the task in
2222 global table G_InvCompTab. This table will have for an agreement, the summary amounts of invoice
2223 components (including AR amounts) for all the tasks(for all sob's) that are being funded by this agreement.
2224
2225 During subsequent runs of the same agreement (for other tasks being funded by this agreement),
2226 this global table is checked for data. If exists then invoice reading routine is bypassed. The prorated
2227 amounts for the task of this SPF is read from this table and used for further
2228 processing. In order to bypass invoice reading routine the flag l_InvPrcdFlag will be
2229 set to indicate that invoices for this agreement/task are already in the cache
2230
2231 This cache will be initialized at project level and at SPF level when agreement changes
2232
2233 In the case of project level funding, this table will have for an agreement, the summary amounts of invoice
2234 components for all sob's
2235 */
2236
2237 /* When there is task level funding and project level retention all paid retention
2238 amounts will have to be split across task level funding.
2239 First all retention paid amounts for the agreement/project is computed and cached in G_RetnApplAmtTab.
2240 While reading regular invoices, if task level funding/project level retention agreemnt , the retained amount
2241 for each task of the invoice is read from RDL/ERDL/DII. On a FirstCome basis, this
2242 retained amount is adjusted against available paid retention amount (from G_RetnApplAmtTab).
2243 */
2244
2245 /*Initilize flag that no mismatch in funding and retention level */
2246 l_TskFundPrjRetnFlag := 'N';
2247
2248 /*Initilize flag that invoices are not already processed */
2249 l_InvPrcdFlag := 'N';
2250
2251
2252 IF G_InvCompTab.COUNT <> 0 THEN /* some invoice amounts are cached */
2253
2254 IF G_InvCompTab(G_InvCompTab.FIRST).agreement_id <> p_agreement_id THEN /* If not for current areement */
2255
2256 /* Initialize retention applied amount and invoice amounts cache */
2257 G_InvCompTab.DELETE;
2258 G_RetnApplAmtTab.DELETE;
2259
2260 END IF; /*Current agreement */
2261
2262 END IF; /* Invoice components */
2263
2264 IF nvl(p_task_id,0) <> 0 THEN /* Task level funding */
2265
2266 IF G_InvCompTab.COUNT <> 0 THEN /* invoice amounts are cached for the same agreement*/
2267
2268 l_InvPrcdFlag := 'Y'; /* Invoices are already read and cached */
2269
2270 END IF;
2271
2272 IF p_retention_level_code = 'PROJECT' THEN
2273
2274 l_TskFundPrjRetnFlag := 'Y'; /* Task level funding project level retention */
2275
2276 IF G_DEBUG_MODE = 'Y' THEN
2277
2278 l_LogMsg := 'Task Level Funding Project level Retention';
2279 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
2280
2281 END IF;
2282
2283 /* paid amounts are to be computed only if include gains/loss flag is set*/
2284
2285 IF ((G_RetnApplAmtTab.COUNT = 0) AND (G_ProjLvlGlobRec.include_gains_losses_flag = 'Y')) THEN
2286
2287 get_retn_appl_amount(
2288 p_project_id => G_ProjLvlGlobRec.project_id,
2289 p_agreement_id => p_agreement_id,
2290 x_return_status => l_return_status,
2291 x_msg_count => l_msg_count,
2292 x_msg_data => l_msg_data);
2293
2294 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2295
2296 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2297
2298 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2299
2300 RAISE FND_API.G_EXC_ERROR;
2301
2302 END IF;
2303
2304 END IF; /* G_RentApplAmtTab.COUNT */
2305
2306 END IF; /* p_retention_level_code */
2307
2308 END IF; /* task level funding */
2309
2310 /* This procedure opens all invoice lines for a given project/agreement/task */
2311
2312 IF l_InvPrcdFlag = 'N' THEN
2313
2314 /* For a given project/agreement this routine computes the following amounts
2315
2316 If the agreement is task level funding this routine will populate revaluation invoice
2317 component amounts for each agreement/top_task in a global table G_InvCompTab
2318 If the agreement is project level funding this routine will populate revaluation invoice
2319 component amounts for each agreement in a global table G_InvCompTab
2320
2321 Depending on primary only or both primary and reporting set of books, this table will have
2322 one record per SPF record /per SOB
2323
2324 The computed amounts will be
2325
2326 a) billed amount (FC/PFC(MC)/IPC)
2327 b) applied amount (FC/PFC(MC)/IPC)
2328 c) due amount (FC/PFC(MC)/IPC)
2329 d) gain amount (PFC(MC))
2330 e) loss amount (PFC(MC))
2331
2332 These amounts will be populated in G_InvCompTab
2333
2334 */
2335
2336 IF G_DEBUG_MODE = 'Y' THEN
2337
2338 l_LogMsg := 'Calling Invoice processing for this project/agreement - First time';
2339 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
2340
2341 END IF;
2342
2343 /* Only if include_gains_losses_flag is set, invoice is to be read sequentially
2344 else it can be summed up in one shot as only backlog will be revaluated */
2345
2346 IF (G_ProjLvlGlobRec.include_gains_losses_flag = 'Y') THEN
2347
2348 get_invoice_components(
2349 p_project_id => G_ProjLvlGlobRec.project_id,
2350 p_agreement_id => p_agreement_id,
2351 p_task_id => p_task_id,
2352 p_TaskFund_ProjRetn_Flag => l_TskFundPrjRetnFlag,
2353 x_return_status => l_return_status,
2354 x_msg_count => l_msg_count,
2355 x_msg_data => l_msg_data);
2356
2357 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2358
2359 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2360
2361 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2362
2363 RAISE FND_API.G_EXC_ERROR;
2364
2365 END IF;
2366
2367 ELSE
2368
2369 get_sum_invoice_components(
2370 p_project_id => G_ProjLvlGlobRec.project_id,
2371 p_agreement_id => p_agreement_id,
2372 p_task_id => p_task_id,
2373 x_return_status => l_return_status,
2374 x_msg_count => l_msg_count,
2375 x_msg_data => l_msg_data);
2376
2377 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2378
2379 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2380
2381 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2382
2383 RAISE FND_API.G_EXC_ERROR;
2384
2385 END IF;
2386
2387 END IF; /* IF (G_ProjLvlGlobRec.include_gains_losses_flag = 'Y') */
2388
2389 END IF;
2390
2391 /* This procedure will compute the final revaluation amounts from two global tables
2392 G_RevalCompTab and G_InvCompTab */
2393
2394 compute_adjustment_amounts(
2395 p_agreement_id => p_agreement_id,
2396 p_task_id => p_task_id,
2397 x_return_status => l_return_status,
2398 x_msg_count => l_msg_count,
2399 x_msg_data => l_msg_data);
2400
2401 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2402
2403 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2404
2405 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2406
2407 RAISE FND_API.G_EXC_ERROR;
2408
2409 END IF;
2410
2411 create_adjustment_line (
2412 x_return_status => l_return_status,
2413 x_msg_count => l_msg_count,
2414 x_msg_data => l_msg_data);
2415
2416 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2417
2418 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2419
2420 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2421
2422 RAISE FND_API.G_EXC_ERROR;
2423
2424 END IF;
2425
2426 IF G_DEBUG_MODE = 'Y' THEN
2427
2428 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.process_spf_lines-----------' ;
2429 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2430
2431 END IF;
2432
2433 EXCEPTION
2434
2435 WHEN FND_API.G_EXC_ERROR THEN
2436 x_return_status := l_return_status;
2437 x_msg_count := l_msg_count;
2438 x_msg_data := l_msg_data;
2439
2440 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2441 x_return_status := l_return_status;
2442 x_msg_count := l_msg_count;
2443 x_msg_data := l_msg_data;
2444
2445 WHEN OTHERS THEN
2446 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2447 x_msg_count := l_msg_count;
2448 x_msg_data := SUBSTR(SQLERRM,1,100);
2449
2450 IF G_DEBUG_MODE = 'Y' THEN
2451
2452 PA_DEBUG.g_err_stage := 'process_spf_lines:' || x_msg_data ;
2453 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2454
2455 END IF;
2456
2457 END process_spf_lines;
2458
2459 /*----------------------------------------------------------------------------------------+
2460 | Procedure : get_retn_appl_amount |
2461 | Purpose : To get applied/FXGL amounts for retention invoices |
2462 | This will be only executed for task level funding with project level |
2463 | retention invoices |
2464 | Parameters : |
2465 | ================================================================================== |
2466 | Name Mode Description |
2467 | ================================================================================== |
2468 | p_project_id IN Project ID |
2469 | p_agreement_id IN Agreement ID |
2470 | x_return_status OUT Return status of this procedure |
2471 | x_msg_count OUT Error message count |
2472 | x_msg_data OUT Error message |
2473 | ================================================================================== |
2474 | Description : This routine processes all retention invoices for a given project/agreement|
2475 | It computes the total applied amount and FXGL amounts for primary as well |
2476 | as reporting set of books id. |
2477 | The global table G_RetnApplAmtTab has the structure |
2478 | sob_id - primary/ reporting set of book id |
2479 | ar_applied_amt_fc - applied amount in funding currency |
2480 | projfunc_applied_amount - applied amount in projfunc currency for primary sob |
2481 | applied amount in reporting currency for reporting sob |
2482 | projfunc_gain_amount - FXGL gain amount in projfunc currency for primary sob |
2483 | FXGL gain amount in reporting currency for reporting sob |
2484 | projfunc_loss_amount - FXGL loss amount in projfunc currency for primary sob |
2485 | FXGL loss amount in reporting currency for reporting sob |
2486 | ar_adj_app_amt_fc - total adjusted amount in funding currency |
2487 | ar_adj_app_amt_pfc - total adjusted amount in projfunc/reporting currency |
2488 | ar_adj_gain_amt_pfc - total adjusted FXGL gain amount in projfunc/reporting currency|
2489 | ar_adj_loss_amt_pfc - total adjusted FXGL loss amount in projfunc/reporting currency|
2490 +-------------------------------------------------------------------------------------------*/
2491 PROCEDURE get_retn_appl_amount(
2492 p_project_id IN NUMBER,
2493 p_agreement_id IN NUMBER,
2494 x_return_status OUT NOCOPY VARCHAR2,
2495 x_msg_count OUT NOCOPY NUMBER,
2496 x_msg_data OUT NOCOPY VARCHAR2) IS
2497
2498
2499 /* This CURSOR fetches all retention invoice amount for a given project/agreement_id in
2500 primary sob */
2501
2502 CURSOR get_retn_invoices IS
2503 SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
2504 di.draft_invoice_num,
2505 dii.projfunc_currency_code,
2506 dii.funding_currency_code,
2507 di.inv_currency_code,
2508 di.system_reference,
2509 di.transfer_status_code,
2510 nvl(di.canceled_flag, 'N') canceled_flag,
2511 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
2512 nvl(di.write_off_flag, 'N') write_off_flag,
2513 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
2514 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
2515 sum(dii.funding_bill_amount) funding_bill_amount,
2516 sum(dii.inv_amount) inv_amount
2517 FROM pa_draft_invoice_items dii,
2518 pa_draft_invoices di
2519 WHERE di.project_id = p_project_id
2520 AND di.agreement_id = p_agreement_id
2521 AND di.transfer_status_code = 'A'
2522 AND dii.project_id = di.project_id
2523 AND dii.draft_invoice_num = di.draft_invoice_num
2524 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
2525 AND di.invoice_date <= G_THRU_DATE
2526 GROUP BY di.draft_invoice_num, dii.projfunc_currency_code,
2527 dii.funding_currency_code, di.inv_currency_code,
2528 di.system_reference,di.transfer_status_code,
2529 canceled_flag, cancel_credit_memo_flag, write_off_flag,
2530 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y');
2531
2532 /* This CURSOR fetches all retention invoice amount for a given project/agreement_id in
2533 primary and reporint sob
2534 */
2535
2536 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
2537 new table gl_alc_ledger_rships_v and corresponding columns */
2538 /* mrc migration to SLA bug 4571438
2539 CURSOR get_all_retn_invoices IS
2540 (SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
2541 di.draft_invoice_num drft_inv_num,
2542 dii.projfunc_currency_code,
2543 dii.funding_currency_code,
2544 di.inv_currency_code,
2545 di.system_reference,
2546 di.transfer_status_code,
2547 nvl(di.canceled_flag, 'N') canceled_flag,
2548 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
2549 nvl(di.write_off_flag, 'N') write_off_flag,
2550 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
2551 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
2552 sum(dii.funding_bill_amount) funding_bill_amount,
2553 sum(dii.inv_amount) inv_amount
2554 FROM pa_draft_invoice_items dii,
2555 pa_draft_invoices di
2556 WHERE di.project_id = p_project_id
2557 AND di.agreement_id = p_agreement_id
2558 AND di.transfer_status_code = 'A'
2559 AND dii.project_id = di.project_id
2560 AND dii.draft_invoice_num = di.draft_invoice_num
2561 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
2562 AND di.invoice_date <= G_THRU_DATE
2563 GROUP BY di.draft_invoice_num, dii.projfunc_currency_code,
2564 dii.funding_currency_code, di.inv_currency_code,
2565 di.system_reference,di.transfer_status_code,
2566 canceled_flag, cancel_credit_memo_flag, write_off_flag,
2567 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
2568 UNION
2569 SELECT dii_mc.set_of_books_id,
2570 di.draft_invoice_num drft_inv_num,
2571 dii_mc.currency_code projfunc_currency_code,
2572 dii.funding_currency_code,
2573 di.inv_currency_code,
2574 di.system_reference,
2575 di.transfer_status_code,
2576 nvl(di.canceled_flag, 'N') canceled_flag,
2577 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
2578 nvl(di.write_off_flag, 'N') write_off_flag,
2579 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
2580 sum(dii_mc.amount) projfunc_bill_amount,
2581 sum(dii.funding_bill_amount) funding_bill_amount,
2582 sum(dii.inv_amount) inv_amount
2583 FROM pa_draft_invoice_items dii, pa_mc_draft_inv_items dii_mc, pa_draft_invoices di,
2584 gl_alc_ledger_rships_v rep, pa_implementations imp
2585 WHERE di.project_id = p_project_id
2586 AND di.agreement_id = p_agreement_id
2587 AND di.transfer_status_code = 'A'
2588 AND dii.project_id = di.project_id
2589 AND dii.draft_invoice_num = di.draft_invoice_num
2590 AND rep.source_ledger_id = imp.set_of_books_id
2591 AND rep.relationship_enabled_flag = 'Y'
2592 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
2593 AND rep.application_id = 275
2594 AND dii_mc.set_of_books_id =rep.ledger_id
2595 AND dii_mc.project_id = dii.project_id
2596 AND dii_mc.draft_invoice_num = dii.draft_invoice_num
2597 AND dii_mc.line_num = dii.line_num
2598 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
2599 AND di.invoice_date <= G_THRU_DATE
2600 GROUP BY di.draft_invoice_num, dii_mc.set_of_books_id, dii_mc.currency_code,
2601 dii.funding_currency_code, di.inv_currency_code, di.system_reference,di.transfer_status_code,
2602 canceled_flag, cancel_credit_memo_flag, write_off_flag,
2603 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
2604 )
2605 ORDER BY drft_inv_num, set_of_books_id; */
2606
2607
2608 l_SetOfBookIdTab PA_PLSQL_DATATYPES.IdTabTyp;
2609 l_DraftInvNumTab PA_PLSQL_DATATYPES.NumTabTyp;
2610 l_PFCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
2611 l_FCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
2612 l_ITCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
2613 l_SysRefTab PA_PLSQL_DATATYPES.NumTabTyp;
2614 l_StatusCodeTab PA_PLSQL_DATATYPES.Char30TabTyp;
2615 l_CancelFlgTab PA_PLSQL_DATATYPES.Char1TabTyp;
2616 l_ClCrMemoFlgTab PA_PLSQL_DATATYPES.Char1TabTyp;
2617 l_WrOffFlgTab PA_PLSQL_DATATYPES.Char1TabTyp;
2618 l_CrMemoFlgTab PA_PLSQL_DATATYPES.Char1TabTyp;
2619 l_BillAmtPFCTab PA_PLSQL_DATATYPES.NumTabTyp;
2620 l_BillAmtFCTab PA_PLSQL_DATATYPES.NumTabTyp;
2621 l_BillAmtITCTab PA_PLSQL_DATATYPES.NumTabTyp;
2622
2623 l_PrvInvNum NUMBER := 0;
2624 l_SystemRef NUMBER ;
2625 l_StatusCode VARCHAR2(1);
2626 l_AdjInvFlag VARCHAR2(1);
2627
2628 l_RetnInvTab RetnInvTabTyp;
2629
2630 l_TotalFetch NUMBER := 0;
2631 l_ThisFetch NUMBER := 0;
2632 l_FetchSize NUMBER := 50;
2633
2634 l_return_status VARCHAR2(30) := NULL;
2635 l_msg_count NUMBER := NULL;
2636 l_msg_data VARCHAR2(250) := NULL;
2637 l_LogMsg VARCHAR2(250);
2638 l_InvoiceStatus VARCHAR2(30);
2639
2640 BEGIN
2641 x_return_status := FND_API.G_RET_STS_SUCCESS;
2642 x_msg_count := 0;
2643
2644 IF G_DEBUG_MODE = 'Y' THEN
2645
2646 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_retn_appl_amount-----------' ;
2647 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2648
2649 END IF;
2650
2651 /* When only primary set of book id is processed each invoice is unique and processing
2652 should be invoked for every record
2653 All the required values are passed into a table structure l_RetnInvTab (indexed by set_of_books_id)
2654 Table is used b'cos there will be multiple records for single invoice when RC is being included
2655
2656 When both primary and reporting set of books id are processed, for every set of book id
2657 there will be an invoice record. Since primary and reporting are processed together (AR amounts would be
2658 for all sob 's of each invoice), the processing is called once for all sobs/invoice
2659 So the global table G_RetnInvApplAmtTab will have all required components for all SOB's of an invoice .
2660 */
2661
2662
2663 IF G_PRIMARY_ONLY = 'Y' THEN -- (
2664
2665 IF G_DEBUG_MODE = 'Y' THEN
2666
2667 l_LogMsg := 'Cursor get_retn_invoices ' ;
2668 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
2669
2670 END IF;
2671
2672 OPEN get_retn_invoices;
2673
2674 LOOP
2675 FETCH get_retn_invoices BULK COLLECT INTO l_SetOfBookIdTab, l_DraftInvNumTab,
2676 l_PFCCurrTab, l_FCCurrTab,
2677 l_ITCCurrTab, l_SysRefTab, l_StatusCodeTab,
2678 l_CancelFlgTab, l_ClCrMemoFlgTab, l_WrOffFlgTab, l_CrMemoFlgTab,
2679 l_BillAmtPFCTab, l_BillAmtFCTab,
2680 l_BillAmtITCTab
2681 LIMIT l_FetchSize;
2682
2683 l_ThisFetch := get_retn_invoices%ROWCOUNT - l_TotalFetch;
2684 l_TotalFetch := get_retn_invoices%ROWCOUNT ;
2685
2686 IF l_ThisFetch > 0 THEN
2687
2688 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
2689
2690 l_RetnInvTab(l_SetOfBookIdTab(i)).set_of_books_id := l_SetOfBookIdTab(i);
2691 l_RetnInvTab(l_SetOfBookIdTab(i)).draft_invoice_num := l_DraftInvNumTab(i);
2692 l_RetnInvTab(l_SetOfBookIdTab(i)).projfunc_currency_code := l_PFCCurrTab(i);
2693 l_RetnInvTab(l_SetOfBookIdTab(i)).funding_currency_code := l_FCCurrTab(i);
2694 l_RetnInvTab(l_SetOfBookIdTab(i)).inv_currency_code := l_ITCCurrTab(i);
2695 l_RetnInvTab(l_SetOfBookIdTab(i)).system_reference := l_SysRefTab(i);
2696 l_RetnInvTab(l_SetOfBookIdTab(i)).projfunc_bill_amount := l_BillAmtPFCTab(i);
2697 l_RetnInvTab(l_SetOfBookIdTab(i)).funding_bill_amount := l_BillAmtFCTab(i);
2698 l_RetnInvTab(l_SetOfBookIdTab(i)).inv_amount := l_BillAmtITCTab(i);
2699 l_SystemRef := l_SysRefTab(i);
2700 l_StatusCode := l_StatusCodeTab(i);
2701 l_AdjInvFlag := 'N';
2702
2703 IF ((l_CancelFlgTab(i) = 'Y') OR (l_ClCrMemoFlgTab(i) = 'Y') OR (l_WrOffFlgTab(i) = 'Y')
2704 OR (l_CrMemoFlgTab(i) = 'Y')) THEN
2705
2706 l_AdjInvFlag := 'Y';
2707
2708 END IF;
2709
2710
2711 /* Call processing routine for every invoice as no reporting set of books are processed */
2712
2713 process_retention_invoices (
2714 p_system_reference => l_SystemRef,
2715 p_invoice_status => l_StatusCode,
2716 p_adjust_flag => l_AdjInvFlag,
2717 p_RetnInvTab => l_RetnInvTab,
2718 x_return_status => l_return_status,
2719 x_msg_count => l_msg_count,
2720 x_msg_data => l_msg_data);
2721
2722 l_RetnInvTab.DELETE;
2723
2724 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2725
2726 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2727
2728 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2729
2730 RAISE FND_API.G_EXC_ERROR;
2731
2732 END IF;
2733
2734 END LOOP; /*SetOfBookIdTab */
2735
2736 END IF; /* l_ThisFetch > 0 */
2737
2738
2739 /* Initialize for next fetch */
2740 l_SetOfBookIdTab.DELETE;
2741 l_DraftInvNumTab.DELETE;
2742 l_PFCCurrTab.DELETE;
2743 l_FCCurrTab.DELETE;
2744 l_ITCCurrTab.DELETE;
2745 l_SysRefTab.DELETE;
2746 l_CancelFlgTab.DELETE;
2747 l_CrMemoFlgTab.DELETE;
2748 l_WrOffFlgTab.DELETE;
2749 l_ClCrMemoFlgTab.DELETE;
2750 l_BillAmtPFCTab.DELETE;
2751 l_BillAmtFCTab.DELETE;
2752 l_BillAmtITCTab.DELETE;
2753
2754 IF l_ThisFetch < l_FetchSize THEN
2755 Exit;
2756 END IF;
2757
2758 END LOOP; /* get_retn_invoices ) */
2759
2760 CLOSE get_retn_invoices ;
2761
2762 /* mrc migration to SLA bug 4571438 ELSE -- (
2763
2764 IF G_DEBUG_MODE = 'Y' THEN
2765
2766 l_LogMsg := 'Cursor get_all_retn_invoices ' ;
2767 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
2768
2769 END IF;
2770
2771 OPEN get_all_retn_invoices;
2772
2773 LOOP
2774 FETCH get_all_retn_invoices BULK COLLECT INTO l_SetOfBookIdTab, l_DraftInvNumTab,
2775 l_PFCCurrTab, l_FCCurrTab,
2776 l_ITCCurrTab, l_SysRefTab, l_StatusCodeTab,
2777 l_CancelFlgTab, l_ClCrMemoFlgTab, l_WrOffFlgTab, l_CrMemoFlgTab,
2778 l_BillAmtPFCTab, l_BillAmtFCTab,
2779 l_BillAmtITCTab
2780 LIMIT l_FetchSize;
2781
2782 l_ThisFetch := get_all_retn_invoices%ROWCOUNT - l_TotalFetch;
2783 l_TotalFetch := get_all_retn_invoices%ROWCOUNT ;
2784
2785 IF l_ThisFetch > 0 THEN
2786
2787 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
2788
2789 -- Call processing routine for every invoice only group all reporting set of books together
2790 -- Call processing only when invoice changes
2791
2792 IF l_PrvInvNum = 0 THEN
2793 l_PrvInvNum := l_DraftInvNumTab(i);
2794 END IF;
2795
2796 IF ((l_PrvInvNum <> l_DraftInvNumTab(i))) THEN
2797
2798 process_retention_invoices (
2799 p_system_reference => l_SystemRef,
2800 p_invoice_status => l_StatusCode,
2801 p_adjust_flag => l_AdjInvFlag,
2802 p_RetnInvTab => l_RetnInvTab,
2803 x_return_status => l_return_status,
2804 x_msg_count => l_msg_count,
2805 x_msg_data => l_msg_data);
2806
2807 l_RetnInvTab.DELETE;
2808
2809 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2810
2811 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2812
2813 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2814
2815 RAISE FND_API.G_EXC_ERROR;
2816
2817 END IF;
2818
2819 l_PrvInvNum := l_DraftInvNumTab(i);
2820
2821 END IF;
2822 l_RetnInvTab(l_SetOfBookIdTab(i)).set_of_books_id := l_SetOfBookIdTab(i);
2823 l_RetnInvTab(l_SetOfBookIdTab(i)).draft_invoice_num := l_DraftInvNumTab(i);
2824 l_RetnInvTab(l_SetOfBookIdTab(i)).projfunc_currency_code := l_PFCCurrTab(i);
2825 l_RetnInvTab(l_SetOfBookIdTab(i)).funding_currency_code := l_FCCurrTab(i);
2826 l_RetnInvTab(l_SetOfBookIdTab(i)).inv_currency_code := l_ITCCurrTab(i);
2827 l_RetnInvTab(l_SetOfBookIdTab(i)).system_reference := l_SysRefTab(i);
2828 l_RetnInvTab(l_SetOfBookIdTab(i)).projfunc_bill_amount := l_BillAmtPFCTab(i);
2829 l_RetnInvTab(l_SetOfBookIdTab(i)).funding_bill_amount := l_BillAmtFCTab(i);
2830 l_RetnInvTab(l_SetOfBookIdTab(i)).inv_amount := l_BillAmtITCTab(i);
2831 l_SystemRef := l_SysRefTab(i);
2832 l_StatusCode := l_StatusCodeTab(i);
2833
2834 l_AdjInvFlag := 'N';
2835
2836 IF ((l_CancelFlgTab(i) = 'Y') OR (l_ClCrMemoFlgTab(i) = 'Y') OR (l_WrOffFlgTab(i) = 'Y')
2837 OR (l_CrMemoFlgTab(i) = 'Y')) THEN
2838
2839 l_AdjInvFlag := 'Y';
2840
2841 END IF;
2842
2843 END LOOP; -- l_SetOfBookIdTab
2844
2845 END IF; -- l_ThisFetch > 0
2846
2847 IF l_ThisFetch < l_FetchSize THEN
2848
2849 -- Process for last set of records
2850
2851 IF (l_ThisFetch > 0 ) THEN
2852
2853 process_retention_invoices (
2854 p_system_reference => l_SystemRef,
2855 p_invoice_status => l_StatusCode,
2856 p_adjust_flag => l_AdjInvFlag,
2857 p_RetnInvTab => l_RetnInvTab,
2858 x_return_status => l_return_status,
2859 x_msg_count => l_msg_count,
2860 x_msg_data => l_msg_data);
2861
2862 l_RetnInvTab.DELETE;
2863
2864 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2865
2866 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2867
2868 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2869
2870 RAISE FND_API.G_EXC_ERROR;
2871
2872 END IF;
2873
2874 END IF; -- l_ThisFetch > 0
2875
2876 EXIT;
2877
2878 END IF; -- l_ThisFetch < l_Fetchsize
2879
2880 -- Initialize for next fetch
2881 l_SetOfBookIdTab.DELETE;
2882 l_DraftInvNumTab.DELETE;
2883 l_PFCCurrTab.DELETE;
2884 l_FCCurrTab.DELETE;
2885 l_ITCCurrTab.DELETE;
2886 l_SysRefTab.DELETE;
2887 l_CancelFlgTab.DELETE;
2888 l_ClCrMemoFlgTab.DELETE;
2889 l_WrOffFlgTab.DELETE;
2890 l_CrMemoFlgTab.DELETE;
2891 l_BillAmtPFCTab.DELETE;
2892 l_BillAmtFCTab.DELETE;
2893 l_BillAmtITCTab.DELETE;
2894
2895 END LOOP; -- get_all_retn_invoices
2896
2897 CLOSE get_all_retn_invoices ; -- ) */
2898
2899 END IF;
2900
2901 IF G_DEBUG_MODE = 'Y' THEN
2902
2903 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_retn_appl_amount-----------' ;
2904 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2905
2906 END IF;
2907
2908 EXCEPTION
2909
2910 WHEN FND_API.G_EXC_ERROR THEN
2911 x_return_status := l_return_status;
2912 x_msg_count := l_msg_count;
2913 x_msg_data := l_msg_data;
2914
2915 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2916 x_return_status := l_return_status;
2917 x_msg_count := l_msg_count;
2918 x_msg_data := l_msg_data;
2919
2920 WHEN OTHERS THEN
2921 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2922 x_msg_count := l_msg_count;
2923 x_msg_data := SUBSTR(SQLERRM,1,100);
2924
2925 IF G_DEBUG_MODE = 'Y' THEN
2926
2927 PA_DEBUG.g_err_stage := 'get_retn_appl_amount:' || x_msg_data ;
2928 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2929
2930 END IF;
2931
2932 END get_retn_appl_amount;
2933
2934 /*----------------------------------------------------------------------------------------+
2935 | Procedure : process_retn_invoices |
2936 | Purpose : To get retention paid amount for an invoice |
2937 | This procedure gets paid amount for one invoice in all set of book ids |
2938 | This is executed only when there is task level funding /project level |
2939 | retention |
2940 | Parameters : |
2941 | ================================================================================== |
2942 | Name Mode Description |
2943 | ================================================================================== |
2944 | p_SystemReference IN System Refrence |
2945 | p_Invoice_Status IN Indicates if the input invoice status is accepted |
2946 | in AR or Not |
2947 | p_Adjust_Flag IN 'Y' Indicates if the invoice is a write-off/cancel/
2948 | credit memo
2949 | p_RetnInvTab IN Retention Invoice of all set of books for which |
2950 | paid amounts and FXGL are to be computed |
2951 | x_return_status OUT Return status of this procedure |
2952 | x_msg_count OUT Error message count |
2953 | x_msg_data OUT Error message |
2954 | ================================================================================== |
2955 +----------------------------------------------------------------------------------------*/
2956 PROCEDURE process_retention_invoices (
2957 p_system_reference IN NUMBER,
2958 p_Invoice_Status IN VARCHAR2,
2959 p_adjust_flag IN VARCHAR2,
2960 p_RetnInvTab IN RetnInvTabTyp,
2961 x_return_status OUT NOCOPY VARCHAR2,
2962 x_msg_count OUT NOCOPY NUMBER,
2963 x_msg_data OUT NOCOPY VARCHAR2) IS
2964
2965 l_ArApplAmtPFC NUMBER := 0;
2966 l_ArApplAmtFC NUMBER := 0;
2967 l_ArGainAmtPFC NUMBER := 0;
2968 l_ArLossAmtPFC NUMBER := 0;
2969
2970 l_BillAmtITC NUMBER := 0;
2971 l_BillAmtFC NUMBER := 0;
2972 l_ErrorStatus VARCHAR2(30) := NULL;
2973
2974 l_ArAmtsTab ArAmtsTabTyp;
2975
2976 l_SobId NUMBER;
2977 l_return_status VARCHAR2(30) := NULL;
2978 l_msg_count NUMBER := NULL;
2979 l_msg_data VARCHAR2(250) := NULL;
2980 l_LogMsg VARCHAR2(250);
2981
2982 l_SobIdIdx NUMBER;
2983 BEGIN
2984
2985 x_return_status := FND_API.G_RET_STS_SUCCESS;
2986 x_msg_count := 0;
2987
2988 IF G_DEBUG_MODE = 'Y' THEN
2989
2990 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.process_retention_invoice-----------' ;
2991 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
2992
2993 END IF;
2994
2995 /* For the given retention invoice (System Reference )this procedure will return
2996 applied and FXGL amounts in PFC/ITC in case of primary set of book id.
2997 applied and FXGL amounts in reporting currency for reporting set of book id
2998
2999 ArAmtsTab is index by set of book id. This will have one row for each reporting
3000 set of book id and one for primary set of book id
3001
3002 Since this routine does at each invoice level the total is summed up against
3003 each agreement/sob id and stored in global table G_RetnApplAmtTab
3004 */
3005
3006 l_ArAmtsTab.DELETE;
3007
3008 /* p_adjust_flag indicates if the invoice is an adjustment invoice (credit memo/write-off/cancel)
3009 If so and transferred to AR, the invoiced amount should be returned as paid amount. This is b'cos
3010 AR returns the adjustment amount + paid amount for the original invoice and returns zero for
3011 the adjustment invoice. This would result in write-off amount being treated as billed and fully paid
3012 for Funding revaluation, but invoice model will have this write-off as available funding. Funding
3013 Revaluation needs to have this as backlog amount to be in sync with invoice model. In order to achieve
3014 this , the following code else part of if p_adjust_flag is written. AR amounts are forced to return
3015 the adjustment amount, which will offset the billed and paid amount making it to be in sync with
3016 invoice model */
3017
3018
3019 IF p_adjust_flag = 'N' THEN
3020
3021 get_ar_amounts (
3022 p_customer_trx_id => p_System_Reference,
3023 p_invoice_status => p_invoice_status,
3024 x_ArAmtsTab => l_ArAmtsTab,
3025 x_return_status => l_return_status,
3026 x_msg_count => l_msg_count,
3027 x_msg_data => l_msg_data);
3028
3029 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3030
3031 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3032
3033 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
3034
3035 RAISE FND_API.G_EXC_ERROR;
3036
3037 END IF;
3038
3039 ELSE
3040 IF G_DEBUG_MODE = 'Y' THEN
3041
3042 l_LogMsg:= ' Retention Adjustment Invoice ' ;
3043 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
3044
3045 END IF;
3046
3047 IF ((G_ProjLvlGlobRec.include_gains_losses_flag = 'Y') AND
3048 (p_invoice_status = 'A') AND (G_AR_INSTALLED_FLAG = 'Y')) THEN
3049
3050 l_SobId := p_RetnInvTab.FIRST;
3051
3052 LOOP
3053
3054 EXIT WHEN l_SobId IS NULL;
3055
3056 l_ArAmtsTab(l_SobId).set_of_books_id := p_RetnInvTab(l_SobId).set_of_books_id;
3057 l_ArAmtsTab(l_SobId).inv_applied_amount := p_RetnInvTab(l_SobId).inv_amount;
3058 l_ArAmtsTab(l_SobId).projfunc_applied_amount := p_RetnInvTab(l_SobId).projfunc_bill_amount;
3059 l_ArAmtsTab(l_SobId).projfunc_gain_amount := 0;
3060 l_ArAmtsTab(l_SobId).projfunc_loss_amount := 0;
3061
3062 l_SobId := p_RetnInvTab.NEXT(l_SobId);
3063
3064 END LOOP;
3065
3066 END IF;
3067
3068 END IF;
3069
3070 /* G_SobListTab has all set of books id including primary and reproting set of books id
3071 Also the element enabled_flag indicates if AR also has the set of book id enabled.
3072 If this flag is 'N', it indicates thatn
3073 set of book id is enabled in 'PA' but not in AR
3074 In this case the paid amounts will be prorated (AR will return zero
3075
3076 */
3077
3078 l_SobIdIdx := G_SobListTab.FIRST;
3079
3080 LOOP
3081
3082 EXIT WHEN l_SobIdIdx IS NULL;
3083
3084 l_ArApplAmtFC := 0;
3085 l_ArApplAmtPFC := 0;
3086 l_ArGainAmtPFC := 0;
3087 l_ArLossAmtPFC := 0;
3088 l_ErrorStatus := '';
3089 l_BillAmtITC := 0;
3090 l_BillAmtFC := 0;
3091 l_SobId := l_SobIdIdx;
3092
3093 IF G_DEBUG_MODE = 'Y' THEN
3094
3095 l_LogMsg := ' ' ;
3096 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
3097
3098 l_LogMsg := 'Sob Id:' || l_SobIdIdx ;
3099 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
3100
3101 l_LogMsg := '==================';
3102 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
3103
3104 END IF;
3105
3106
3107 IF ((l_ArAmtsTab.EXISTS(l_SobIdIdx)) AND (p_RetnInvTab.EXISTS(l_SobIdIdx))) THEN
3108
3109
3110 /* If funding currency and invoice currency are different
3111 prorate the AR amounts for funding curency*/
3112
3113 IF p_RetnInvTab(l_SobIdIdx).inv_currency_code <> p_RetnInvTab(l_SobIdIdx).funding_currency_code THEN
3114
3115 IF p_RetnInvTab(l_SobIdIdx).funding_currency_code =
3116 p_RetnInvTab(l_SobIdIdx).projfunc_currency_code THEN
3117
3118 IF G_DEBUG_MODE = 'Y' THEN
3119
3120 l_LogMsg := 'Retention - FC and ITC are different, but = PFC - assigning';
3121 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
3122
3123 END IF;
3124
3125 l_ArApplAmtFC := l_ArAmtsTab(l_SobIdIdx).projfunc_applied_amount;
3126
3127 ELSE
3128
3129 l_BillAmtITC := p_RetnInvTab(l_SobIdIdx).inv_amount;
3130 l_BillAmtFC := p_RetnInvTab(l_SobIdIdx).funding_bill_amount;
3131
3132
3133 IF l_BillAmtITC <> 0 THEN /* Added for bug 3547687 */
3134
3135 l_ArApplAmtFC := (l_ArAmtsTab(l_SobIdIdx).inv_applied_amount / l_BillAmtITC) * l_BillAmtFc;
3136 ELSE
3137 l_ArApplAmtFC := 0;
3138 END IF;
3139
3140 IF G_DEBUG_MODE = 'Y' THEN
3141
3142 l_LogMsg := 'Retention - FC and ITC are different - Prorating' ||
3143 ' Retn appl amt ITC :' || l_ArAmtsTab(l_SobIdIdx).inv_applied_amount ||
3144 ' Retn amt ITC :' || l_BillAmtITC ||
3145 ' Retn amt FC :' || l_BillAmtFC;
3146
3147 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
3148
3149 END IF;
3150
3151 END IF;
3152
3153 ELSE
3154
3155 l_ArApplAmtFC := l_ArAmtsTab(l_SobIdIdx).inv_applied_amount;
3156
3157 END IF;
3158
3159 l_ArApplAmtPFC := l_ArAmtsTab(l_SobIdIdx).projfunc_applied_amount;
3160 l_ArGainAmtPFC := l_ArAmtsTab(l_SobIdIdx).projfunc_gain_amount;
3161 l_ArLossAmtPFC := l_ArAmtsTab(l_SobIdIdx).projfunc_loss_amount;
3162
3163
3164 END IF; /*((l_ArAmtsTab.EXISTS(l_SobIdIdx)) AND (p_RetnInvTab.EXISTS(l_SobIdIdx))) */
3165
3166 IF G_RetnApplAmtTab.EXISTS(l_SobIdIdx) THEN
3167
3168 G_RetnApplAmtTab(l_SobIdIdx).funding_applied_amount :=
3169 nvl(G_RetnApplAmtTab(l_SobIdIdx).funding_applied_amount,0) + l_ArApplAmtFC;
3170 G_RetnApplAmtTab(l_SobIdIdx).projfunc_applied_amount :=
3171 nvl(G_RetnApplAmtTab(l_SobIdIdx).projfunc_applied_amount,0) + l_ArApplAmtPFC;
3172 G_RetnApplAmtTab(l_SobIdIdx).projfunc_gain_amount :=
3173 nvl(G_RetnApplAmtTab(l_SobIdIdx).projfunc_gain_amount,0) + l_ArGainAmtPFC;
3174 G_RetnApplAmtTab(l_SobIdIdx).projfunc_loss_amount :=
3175 nvl(G_RetnApplAmtTab(l_SobIdIdx).projfunc_loss_amount,0) + l_ArLossAmtPFC;
3176 G_RetnApplAmtTab(l_SobIdIdx).funding_adj_appl_amount := 0;
3177 G_RetnApplAmtTab(l_SobIdIdx).projfunc_adj_appl_amount := 0;
3178 G_RetnApplAmtTab(l_SobIdIdx).projfunc_adj_gain_amount := 0;
3179 G_RetnApplAmtTab(l_SobIdIdx).projfunc_adj_loss_amount := 0;
3180 G_RetnApplAmtTab(l_SobIdIdx).error_status := l_ErrorStatus;
3181
3182 ELSE
3183
3184 G_RetnApplAmtTab(l_SobIdIdx).set_of_books_id := l_SobIdIdx;
3185 G_RetnApplAmtTab(l_SobIdIdx).funding_applied_amount := l_ArApplAmtFC;
3186 G_RetnApplAmtTab(l_SobIdIdx).projfunc_applied_amount := l_ArApplAmtPFC;
3187 G_RetnApplAmtTab(l_SobIdIdx).projfunc_gain_amount := l_ArGainAmtPFC;
3188 G_RetnApplAmtTab(l_SobIdIdx).projfunc_loss_amount := l_ArLossAmtPFC;
3189 G_RetnApplAmtTab(l_SobIdIdx).error_status := l_ErrorStatus;
3190
3191 END IF;
3192
3193 IF G_DEBUG_MODE = 'Y' THEN
3194
3195 l_LogMsg := 'Appl Amt FC:' || round(l_ArApplAmtFC,5) ||
3196 ' Appl Amt PFC:' || round(l_ArApplAmtPFC,5) ||
3197 ' Gain Amt PFC:' || round(l_ArGainAmtPFC,5) ||
3198 ' Loss Amt PFC:' || round(l_ArLossAmtPFC,5);
3199
3200 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
3201
3202 END IF;
3203
3204 l_SobIdIdx := G_SobListTab.NEXT(l_SobIdIdx);
3205
3206 END LOOP;
3207
3208 IF G_DEBUG_MODE = 'Y' THEN
3209
3210 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.process_retention_invoices-----------' ;
3211 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
3212
3213 END IF;
3214
3215 EXCEPTION
3216
3217 WHEN FND_API.G_EXC_ERROR THEN
3218 x_return_status := l_return_status;
3219 x_msg_count := l_msg_count;
3220 x_msg_data := l_msg_data;
3221
3222 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3223 x_return_status := l_return_status;
3224 x_msg_count := l_msg_count;
3225 x_msg_data := l_msg_data;
3226
3227 WHEN OTHERS THEN
3228 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3229 x_msg_count := l_msg_count;
3230 x_msg_data := SUBSTR(SQLERRM,1,100);
3231 G_RetnApplAmtTab(l_SobId).error_status := x_msg_data;
3232
3233 IF G_DEBUG_MODE = 'Y' THEN
3234
3235 PA_DEBUG.g_err_stage := 'process_retention_invoices:' || x_msg_data ;
3236 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
3237
3238 END IF;
3239
3240 END process_retention_invoices ;
3241
3242 /*----------------------------------------------------------------------------------------+
3243 | Procedure : get_invoice_components |
3244 | Purpose : To fetch and compute invoice related components for funding revaluation|
3245 | Parameters : |
3246 | ================================================================================== |
3247 | Name Mode Description |
3248 | ================================================================================== |
3249 | p_project_id IN Project ID |
3250 | p_agreement_id IN Agreement_id |
3251 | p_task_id IN Task Id of summary project funding |
3252 | p_TaskFund_ProjRetn_Flag IN Indicates if the agreement is task levl funding |
3253 | and retention setup for project is project level |
3254 | x_return_status OUT Return status of this procedure |
3255 | x_msg_count OUT Error message count |
3256 | x_msg_data OUT Error message |
3257 | ================================================================================== |
3258 +----------------------------------------------------------------------------------------*/
3259
3260 PROCEDURE get_invoice_components(
3261 p_project_id IN NUMBER,
3262 p_agreement_id IN NUMBER,
3263 p_task_id IN NUMBER,
3264 p_TaskFund_ProjRetn_Flag IN VARCHAR2,
3265 x_return_status OUT NOCOPY VARCHAR2,
3266 x_msg_count OUT NOCOPY NUMBER,
3267 x_msg_data OUT NOCOPY VARCHAR2) IS
3268
3269
3270
3271 /* The following CURSOR will select all invoices for given project/agreement for
3272 primary set of book id and will get executed for
3273 a) project level funding/project level retention - p_task_id will be zero
3274 b) project level funding/task level retention -p_task_id will be zero
3275 All task level retention amounts will be summarized to project level funding amounts
3276 */
3277
3278 CURSOR get_proj_invoices IS
3279 (SELECT 'REGULAR-PROJ' invoice_type,
3280 PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
3281 0 task_id,
3282 di.draft_invoice_num drft_inv_num,
3283 dii.invproc_currency_code, dii.projfunc_currency_code, dii.funding_currency_code,
3284 di.inv_currency_code, di.system_reference, di.transfer_status_code,
3285 nvl(di.canceled_flag, 'N') canceled_flag,
3286 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3287 nvl(di.write_off_flag, 'N') write_off_flag,
3288 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3289 sum(dii.amount) amount,
3290 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
3291 sum(dii.funding_bill_amount) funding_bill_amount,
3292 sum(dii.inv_amount) inv_amount,
3293 0 retn_amount,
3294 0 projfunc_retn_amount,
3295 0 funding_retn_amount,
3296 0 inv_retn_amount
3297 FROM pa_draft_invoice_items dii,
3298 pa_draft_invoices di
3299 WHERE di.project_id = p_project_id
3300 AND di.agreement_id = p_agreement_id
3301 AND dii.project_id = di.project_id
3302 AND dii.draft_invoice_num = di.draft_invoice_num
3303 AND dii.invoice_line_type <> 'RETENTION'
3304 AND nvl(di.retention_invoice_flag, 'N') = 'N'
3305 AND di.invoice_date <= G_THRU_DATE
3306 GROUP BY di.draft_invoice_num,
3307 dii.invproc_currency_code,dii.projfunc_currency_code,
3308 dii.funding_currency_code, di.inv_currency_code, di.system_reference, di.transfer_status_code,
3309 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3310 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3311 UNION
3312 SELECT 'RETENTION-PROJ' invoice_type,
3313 PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
3314 0 task_id,
3315 di.draft_invoice_num drft_inv_num,
3316 dii.invproc_currency_code, dii.projfunc_currency_code, dii.funding_currency_code,
3317 di.inv_currency_code, di.system_reference, di.transfer_status_code,
3318 nvl(di.canceled_flag, 'N') canceled_flag,
3319 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3320 nvl(di.write_off_flag, 'N') write_off_flag,
3321 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3322 sum(dii.amount) amount,
3323 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
3324 sum(dii.funding_bill_amount) funding_bill_amount,
3325 sum(dii.inv_amount) inv_amount,
3326 0 retn_amount,
3327 0 projfunc_retn_amount,
3328 0 funding_retn_amount,
3329 0 inv_retn_amount
3330 FROM pa_draft_invoice_items dii,
3331 pa_draft_invoices di
3332 WHERE di.project_id = p_project_id
3333 AND di.agreement_id = p_agreement_id
3334 AND dii.project_id = di.project_id
3335 AND dii.draft_invoice_num = di.draft_invoice_num
3336 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
3337 AND di.invoice_date <= G_THRU_DATE
3338 GROUP BY di.draft_invoice_num,
3339 dii.invproc_currency_code,dii.projfunc_currency_code,
3340 dii.funding_currency_code, di.inv_currency_code, di.system_reference, di.transfer_status_code,
3341 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3342 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y'))
3343 ORDER BY drft_inv_num;
3344
3345 /* The following CURSOR will select all invoices for given project/agreement for
3346 primary and reporting set of book ids */
3347
3348
3349 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
3350 new table gl_alc_ledger_rships_v and corresponding columns */
3351
3352 /* mrc migration to SLA bug 4571438
3353 CURSOR get_all_proj_invoices IS
3354 (SELECT 'REGULAR-PROJ' invoice_type,
3355 PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
3356 0 task_id,
3357 di.draft_invoice_num drft_inv_num,
3358 dii.invproc_currency_code, dii.projfunc_currency_code, dii.funding_currency_code,
3359 di.inv_currency_code, di.system_reference, di.transfer_status_code,
3360 nvl(di.canceled_flag, 'N') canceled_flag,
3361 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3362 nvl(di.write_off_flag, 'N') write_off_flag,
3363 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3364 sum(dii.amount) amount,
3365 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
3366 sum(dii.funding_bill_amount) funding_bill_amount,
3367 sum(dii.inv_amount) inv_amount,
3368 0 retn_amount,
3369 0 projfunc_retn_amount,
3370 0 funding_retn_amount,
3371 0 inv_retn_amount
3372 FROM pa_draft_invoice_items dii,
3373 pa_draft_invoices di
3374 WHERE di.project_id = p_project_id
3375 AND di.agreement_id = p_agreement_id
3376 AND dii.project_id = di.project_id
3377 AND dii.draft_invoice_num = di.draft_invoice_num
3378 AND dii.invoice_line_type <> 'RETENTION'
3379 AND nvl(di.retention_invoice_flag, 'N') = 'N'
3380 AND di.invoice_date <= G_THRU_DATE
3381 GROUP BY di.draft_invoice_num,
3382 dii.invproc_currency_code,dii.projfunc_currency_code,
3383 dii.funding_currency_code, di.inv_currency_code, di.system_reference , di.transfer_status_code,
3384 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3385 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3386 UNION
3387 SELECT 'RETENTION-PROJ' invoice_type,
3388 PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
3389 0 task_id,
3390 di.draft_invoice_num drft_inv_num,
3391 dii.invproc_currency_code,
3392 dii.projfunc_currency_code,
3393 dii.funding_currency_code,
3394 di.inv_currency_code,
3395 di.system_reference,
3396 di.transfer_status_code,
3397 nvl(di.canceled_flag, 'N') canceled_flag,
3398 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3399 nvl(di.write_off_flag, 'N') write_off_flag,
3400 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3401 sum(dii.amount) amount,
3402 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
3403 sum(dii.funding_bill_amount) funding_bill_amount,
3404 sum(dii.inv_amount) inv_amount,
3405 0 retn_amount,
3406 0 projfunc_retn_amount,
3407 0 funding_retn_amount,
3408 0 inv_retn_amount
3409 FROM pa_draft_invoice_items dii,
3410 pa_draft_invoices di
3411 WHERE di.project_id = p_project_id
3412 AND di.agreement_id = p_agreement_id
3413 AND dii.project_id = di.project_id
3414 AND dii.draft_invoice_num = di.draft_invoice_num
3415 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
3416 AND di.invoice_date <= G_THRU_DATE
3417 GROUP BY di.draft_invoice_num,
3418 dii.invproc_currency_code,dii.projfunc_currency_code,
3419 dii.funding_currency_code, di.inv_currency_code, di.system_reference , di.transfer_status_code,
3420 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3421 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3422 UNION
3423 SELECT 'REGULAR-PROJ' invoice_type,
3424 dii_mc.set_of_books_id,
3425 0 task_id,
3426 di.draft_invoice_num drft_inv_num,
3427 dii.invproc_currency_code,
3428 dii_mc.currency_code projfunc_currency_code,
3429 dii.funding_currency_code,
3430 di.inv_currency_code,
3431 di.system_reference,
3432 di.transfer_status_code,
3433 nvl(di.canceled_flag, 'N') canceled_flag,
3434 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3435 nvl(di.write_off_flag, 'N') write_off_flag,
3436 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3437 sum(dii.amount) amount,
3438 sum(dii_mc.amount) projfunc_bill_amount,
3439 sum(dii.funding_bill_amount) funding_bill_amount,
3440 sum(dii.inv_amount) inv_amount,
3441 0 retn_amount,
3442 0 projfunc_retn_amount,
3443 0 funding_retn_amount,
3444 0 inv_retn_amount
3445 FROM pa_mc_draft_inv_items dii_mc, pa_draft_invoice_items dii, pa_draft_invoices di,
3446 gl_alc_ledger_rships_v rep, pa_implementations imp
3447 WHERE di.project_id = p_project_id
3448 AND di.agreement_id = p_agreement_id
3449 AND dii.project_id = di.project_id
3450 AND dii.draft_invoice_num = di.draft_invoice_num
3451 AND dii.invoice_line_type <> 'RETENTION'
3452 AND rep.source_ledger_id = imp.set_of_books_id
3453 AND rep.relationship_enabled_flag = 'Y'
3454 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
3455 AND rep.application_id = 275
3456 AND dii_mc.set_of_books_id =rep.ledger_id
3457 AND dii_mc.project_id = dii.project_id
3458 AND dii_mc.draft_invoice_num = dii.draft_invoice_num
3459 AND dii_mc.line_num = dii.line_num
3460 AND nvl(di.retention_invoice_flag, 'N') = 'N'
3461 AND di.invoice_date <= G_THRU_DATE
3462 GROUP BY di.draft_invoice_num,dii_mc.set_of_books_id,
3463 dii.invproc_currency_code, dii_mc.currency_code,
3464 dii.funding_currency_code, di.inv_currency_code, di.system_reference , di.transfer_status_code,
3465 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3466 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3467 UNION
3468 SELECT 'RETENTION-PROJ' invoice_type,
3469 dii_mc.set_of_books_id,
3470 0 task_id,
3471 di.draft_invoice_num drft_inv_num,
3472 dii.invproc_currency_code,
3473 dii_mc.currency_code projfunc_currency_code,
3474 dii.funding_currency_code,
3475 di.inv_currency_code,
3476 di.system_reference,
3477 di.transfer_status_code,
3478 nvl(di.canceled_flag, 'N') canceled_flag,
3479 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3480 nvl(di.write_off_flag, 'N') write_off_flag,
3481 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3482 sum(dii.amount) amount,
3483 sum(dii_mc.amount) projfunc_bill_amount,
3484 sum(dii.funding_bill_amount) funding_bill_amount,
3485 sum(dii.inv_amount) inv_amount,
3486 0 retn_amount,
3487 0 projfunc_retn_amount,
3488 0 funding_retn_amount,
3489 0 inv_retn_amount
3490 FROM pa_mc_draft_inv_items dii_mc, pa_draft_invoice_items dii, pa_draft_invoices di,
3491 gl_alc_ledger_rships_v rep, pa_implementations imp
3492 WHERE di.project_id = p_project_id
3493 AND di.agreement_id = p_agreement_id
3494 AND dii.project_id = di.project_id
3495 AND dii.draft_invoice_num = di.draft_invoice_num
3496 AND rep.source_ledger_id = imp.set_of_books_id
3497 AND rep.relationship_enabled_flag = 'Y'
3498 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
3499 AND rep.application_id = 275
3500 AND dii_mc.set_of_books_id =rep.ledger_id
3501 AND dii_mc.project_id = dii.project_id
3502 AND dii_mc.draft_invoice_num = di.draft_invoice_num
3503 AND dii_mc.line_num = dii.line_num
3504 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
3505 AND di.invoice_date <= G_THRU_DATE
3506 GROUP BY di.draft_invoice_num,dii_mc.set_of_books_id,
3507 dii.invproc_currency_code, dii_mc.currency_code,
3508 dii.funding_currency_code, di.inv_currency_code, di.system_reference, di.transfer_status_code,
3509 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3510 DECOde(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3511 )
3512 ORDER BY drft_inv_num, set_of_books_id; */
3513
3514 /* The following CURSOR will select all invoices for given project/agreement for
3515 primary set of book id and will get executed for
3516 a) task level funding/task level retention
3517 In the case of task level funding /project level retention, only the regular invoices will get selected
3518 Also the retained amount for the task is obtained separately from RDL.DII.ERDL. To eliminate project
3519 level retention lines from regular invoice, nvl(dii.task_id) <> 0 is added
3520 Project level Retention invoices are not required as the retained amount will be calculated for each invoice
3521 from RDL ERDL DII. These are eliminated by the check nvl(dii.task_id,0) <> 0
3522 */
3523 CURSOR get_task_invoices IS
3524 (SELECT 'REGULAR-TASK' invoice_type,
3525 PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
3526 dii.task_id,
3527 di.draft_invoice_num drft_inv_num,
3528 dii.invproc_currency_code, dii.projfunc_currency_code, dii.funding_currency_code,
3529 di.inv_currency_code, di.system_reference, di.transfer_status_code,
3530 nvl(di.canceled_flag, 'N') canceled_flag,
3531 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3532 nvl(di.write_off_flag, 'N') write_off_flag,
3533 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3534
3535 /*
3536 The following is commented and changed as below.
3537
3538 sum(dii.amount) amount,
3539 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
3540 sum(dii.funding_bill_amount) funding_bill_amount,
3541 sum(dii.inv_amount) inv_amount
3542
3543 Standard line amount is required to get the billed amount in PA
3544
3545 Retention line amount is required to get the Net line amount (standard - retention)
3546
3547 Net line amount is required as AR amounts (invoice level) are for net invoice amount
3548
3549 In order to get the task level (line level) AR amounts, invoice level AR amounts will be
3550 prorated.
3551 (invoice level AR amount / invoice level net amount) * task level net amount
3552 */
3553 /* Commented for bug 2794334
3554 sum(decode(dii.invoice_line_type,'STANDARD',
3555 dii.amount,0)) amount,
3556 sum(decode(dii.invoice_line_type,'STANDARD',
3557 dii.projfunc_bill_amount,0)) projfunc_bill_amount,
3558 sum(decode(dii.invoice_line_type,'STANDARD',
3559 dii.funding_bill_amount,0)) funding_bill_amount,
3560 sum(decode(dii.invoice_line_type,'STANDARD',
3561 dii.inv_amount,0)) inv_amount,
3562 */
3563 sum(decode(dii.invoice_line_type,'RETENTION',
3564 0, dii.amount)) amount,
3565 sum(decode(dii.invoice_line_type,'RETENTION',
3566 0, dii.projfunc_bill_amount)) projfunc_bill_amount,
3567 sum(decode(dii.invoice_line_type,'RETENTION',
3568 0, dii.funding_bill_amount)) funding_bill_amount,
3569 sum(decode(dii.invoice_line_type,'RETENTION',
3570 0, dii.inv_amount)) inv_amount,
3571 sum(decode(dii.invoice_line_type,'RETENTION',
3572 dii.amount,0)) retn_amount,
3573 sum(decode(dii.invoice_line_type,'RETENTION',
3574 dii.projfunc_bill_amount,0)) projfunc_retn_amount,
3575 sum(decode(dii.invoice_line_type,'RETENTION',
3576 dii.funding_bill_amount,0)) funding_retn_amount,
3577 sum(decode(dii.invoice_line_type,'RETENTION',
3578 dii.inv_amount,0)) inv_retn_amount
3579 FROM pa_draft_invoice_items dii,
3580 pa_draft_invoices di
3581 WHERE di.project_id = p_project_id
3582 AND di.agreement_id = p_agreement_id
3583 AND dii.project_id = di.project_id
3584 AND dii.draft_invoice_num = di.draft_invoice_num
3585 AND nvl(dii.task_id,0) <> 0
3586 -- AND dii.invoice_line_type <> 'RETENTION'
3587 AND nvl(di.retention_invoice_flag, 'N') = 'N'
3588 AND di.invoice_date <= G_THRU_DATE
3589 GROUP BY di.draft_invoice_num, dii.task_id,
3590 dii.invproc_currency_code,dii.projfunc_currency_code,
3591 dii.funding_currency_code, di.inv_currency_code, di.system_reference , di.transfer_status_code,
3592 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3593 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3594 UNION
3595 SELECT 'RETENTION-TASK' invoice_type,
3596 PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
3597 dii.task_id,
3598 di.draft_invoice_num drft_inv_num,
3599 dii.invproc_currency_code, dii.projfunc_currency_code, dii.funding_currency_code,
3600 di.inv_currency_code, di.system_reference, di.transfer_status_code,
3601 nvl(di.canceled_flag, 'N') canceled_flag,
3602 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3603 nvl(di.write_off_flag, 'N') write_off_flag,
3604 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3605 sum(dii.amount) amount,
3606 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
3607 sum(dii.funding_bill_amount) funding_bill_amount,
3608 sum(dii.inv_amount) inv_amount,
3609 0 retn_amount,
3610 0 projfunc_retn_amount,
3611 0 funding_retn_amount,
3612 0 inv_retn_amount
3613 FROM pa_draft_invoice_items dii,
3614 pa_draft_invoices di
3615 WHERE di.project_id = p_project_id
3616 AND di.agreement_id = p_agreement_id
3617 AND dii.project_id = di.project_id
3618 AND NVL(dii.task_id,0) <> 0
3619 AND dii.draft_invoice_num = di.draft_invoice_num
3620 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
3621 AND di.invoice_date <= G_THRU_DATE
3622 GROUP BY di.draft_invoice_num, dii.task_id,
3623 dii.invproc_currency_code,dii.projfunc_currency_code,
3624 dii.funding_currency_code, di.inv_currency_code, di.system_reference, di.transfer_status_code,
3625 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3626 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y'))
3627 ORDER BY drft_inv_num, task_id;
3628
3629
3630 /* This CURSOR is same as previous CURSOR except that ti will select for both primary and reporting set of
3631 books isd */
3632
3633 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
3634 new table gl_alc_ledger_rships_v and corresponding columns */
3635
3636 /* mrc migration to SLA bug 4571438 CURSOR get_all_task_invoices IS
3637 (SELECT 'REGULAR-TASK' invoice_type,
3638 PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
3639 dii.task_id,
3640 di.draft_invoice_num drft_inv_num,
3641 dii.invproc_currency_code, dii.projfunc_currency_code, dii.funding_currency_code,
3642 di.inv_currency_code, di.system_reference, di.transfer_status_code,
3643 nvl(di.canceled_flag, 'N') canceled_flag,
3644 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3645 nvl(di.write_off_flag, 'N') write_off_flag,
3646 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3647 sum(decode(dii.invoice_line_type,'RETENTION',
3648 0, dii.amount)) amount,
3649 sum(decode(dii.invoice_line_type,'RETENTION',
3650 0, dii.projfunc_bill_amount)) projfunc_bill_amount,
3651 sum(decode(dii.invoice_line_type,'RETENTION',
3652 0, dii.funding_bill_amount)) funding_bill_amount,
3653 sum(decode(dii.invoice_line_type,'RETENTION',
3654 0, dii.inv_amount)) inv_amount,
3655 sum(decode(dii.invoice_line_type,'RETENTION',
3656 dii.amount,0)) retn_amount,
3657 sum(decode(dii.invoice_line_type,'RETENTION',
3658 dii.projfunc_bill_amount,0)) projfunc_retn_amount,
3659 sum(decode(dii.invoice_line_type,'RETENTION',
3660 dii.funding_bill_amount,0)) funding_retn_amount,
3661 sum(decode(dii.invoice_line_type,'RETENTION',
3662 dii.inv_amount,0)) inv_retn_amount
3663 FROM pa_draft_invoice_items dii,
3664 pa_draft_invoices di
3665 WHERE di.project_id = p_project_id
3666 AND di.agreement_id = p_agreement_id
3667 AND dii.project_id = di.project_id
3668 AND dii.draft_invoice_num = di.draft_invoice_num
3669 AND nvl(dii.task_id,0) <> 0
3670 -- AND dii.invoice_line_type <> 'RETENTION'
3671 AND nvl(di.retention_invoice_flag, 'N') = 'N'
3672 AND di.invoice_date <= G_THRU_DATE
3673 GROUP BY di.draft_invoice_num, dii.task_id,
3674 dii.invproc_currency_code,dii.projfunc_currency_code,
3675 dii.funding_currency_code, di.inv_currency_code, di.system_reference , di.transfer_status_code,
3676 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3677 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3678 UNION
3679 SELECT 'RETENTION-TASK' invoice_type,
3680 PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
3681 dii.task_id,
3682 di.draft_invoice_num drft_inv_num,
3683 dii.invproc_currency_code, dii.projfunc_currency_code, dii.funding_currency_code,
3684 di.inv_currency_code, di.system_reference, di.transfer_status_code,
3685 nvl(di.canceled_flag, 'N') canceled_flag,
3686 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3687 nvl(di.write_off_flag, 'N') write_off_flag,
3688 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3689 sum(dii.amount) amount,
3690 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
3691 sum(dii.funding_bill_amount) funding_bill_amount,
3692 sum(dii.inv_amount) inv_amount,
3693 0 retn_amount,
3694 0 projfunc_retn_amount,
3695 0 funding_retn_amount,
3696 0 inv_retn_amount
3697 FROM pa_draft_invoice_items dii,
3698 pa_draft_invoices di
3699 WHERE di.project_id = p_project_id
3700 AND di.agreement_id = p_agreement_id
3701 AND dii.project_id = di.project_id
3702 AND NVL(dii.task_id,0) <> 0
3703 AND dii.draft_invoice_num = di.draft_invoice_num
3704 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
3705 AND di.invoice_date <= G_THRU_DATE
3706 GROUP BY di.draft_invoice_num, dii.task_id,
3707 dii.invproc_currency_code,dii.projfunc_currency_code,
3708 dii.funding_currency_code, di.inv_currency_code, di.system_reference , di.transfer_status_code,
3709 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3710 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3711 UNION
3712 SELECT 'REGULAR-TASK' invoice_type,
3713 dii_mc.set_of_books_id,
3714 dii.task_id,
3715 di.draft_invoice_num drft_inv_num,
3716 dii.invproc_currency_code,
3717 dii_mc.currency_code projfunc_currency_code,
3718 dii.funding_currency_code,
3719 di.inv_currency_code,
3720 di.system_reference, di.transfer_status_code,
3721 nvl(di.canceled_flag, 'N') canceled_flag,
3722 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3723 nvl(di.write_off_flag, 'N') write_off_flag,
3724 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3725 sum(decode(dii.invoice_line_type,'RETENTION',
3726 0, dii.amount)) amount,
3727 sum(decode(dii.invoice_line_type,'RETENTION',
3728 0, dii_mc.amount)) projfunc_bill_amount, -- changed dii.projfunc_bill_amount to dii_mc.amount bug2827328
3729 sum(decode(dii.invoice_line_type,'RETENTION',
3730 0, dii.funding_bill_amount)) funding_bill_amount,
3731 sum(decode(dii.invoice_line_type,'RETENTION',
3732 0, dii.inv_amount)) inv_amount,
3733 sum(decode(dii.invoice_line_type,'RETENTION',
3734 dii.amount,0)) retn_amount,
3735 sum(decode(dii.invoice_line_type,'RETENTION',
3736 dii_mc.amount,0)) projfunc_retn_amount,
3737 sum(decode(dii.invoice_line_type,'RETENTION',
3738 dii.funding_bill_amount,0)) funding_retn_amount,
3739 sum(decode(dii.invoice_line_type,'RETENTION',
3740 dii.inv_amount,0)) inv_retn_amount
3741 FROM pa_mc_draft_inv_items dii_mc, pa_draft_invoice_items dii, pa_draft_invoices di,
3742 gl_alc_ledger_rships_v rep, pa_implementations imp
3743 WHERE di.project_id = p_project_id
3744 AND di.agreement_id = p_agreement_id
3745 AND dii.project_id = di.project_id
3746 AND dii.draft_invoice_num = di.draft_invoice_num
3747 AND nvl(dii.task_id,0) <> 0
3748 -- AND dii.invoice_line_type <> 'RETENTION'
3749 AND rep.source_ledger_id = imp.set_of_books_id
3750 AND rep.relationship_enabled_flag = 'Y'
3751 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
3752 AND rep.application_id = 275
3753 AND dii_mc.set_of_books_id =rep.ledger_id
3754 AND dii_mc.project_id = dii.project_id
3755 AND dii_mc.draft_invoice_num = dii.draft_invoice_num
3756 AND dii_mc.line_num = dii.line_num
3757 AND nvl(di.retention_invoice_flag, 'N') = 'N'
3758 AND di.invoice_date <= G_THRU_DATE
3759 GROUP BY di.draft_invoice_num,dii.task_id, dii_mc.set_of_books_id,
3760 dii.invproc_currency_code, dii_mc.currency_code,
3761 dii.funding_currency_code, di.inv_currency_code, di.system_reference , di.transfer_status_code,
3762 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3763 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3764 UNION
3765 SELECT 'RETENTION-TASK' invoice_type,
3766 dii_mc.set_of_books_id,
3767 dii.task_id,
3768 di.draft_invoice_num drft_inv_num,
3769 dii.invproc_currency_code,
3770 dii_mc.currency_code projfunc_currency_code,
3771 dii.funding_currency_code,
3772 di.inv_currency_code,
3773 di.system_reference, di.transfer_status_code,
3774 nvl(di.canceled_flag, 'N') canceled_flag,
3775 nvl(di.cancel_credit_memo_flag, 'N') cancel_credit_memo_flag,
3776 nvl(di.write_off_flag, 'N') write_off_flag,
3777 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y') credit_memo_flag,
3778 sum(dii.amount) amount,
3779 sum(dii_mc.amount) projfunc_bill_amount,
3780 sum(dii.funding_bill_amount) funding_bill_amount,
3781 sum(dii.inv_amount) inv_amount,
3782 0 retn_amount,
3783 0 projfunc_retn_amount,
3784 0 funding_retn_amount,
3785 0 inv_retn_amount
3786 FROM pa_mc_draft_inv_items dii_mc, pa_draft_invoice_items dii, pa_draft_invoices di,
3787 gl_alc_ledger_rships_v rep, pa_implementations imp
3788 WHERE di.project_id = p_project_id
3789 AND di.agreement_id = p_agreement_id
3790 AND dii.project_id = di.project_id
3791 AND dii.draft_invoice_num = di.draft_invoice_num
3792 AND NVL(dii.task_id,0) <> 0
3793 AND rep.source_ledger_id = imp.set_of_books_id
3794 AND rep.relationship_enabled_flag = 'Y'
3795 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
3796 AND rep.application_id = 275
3797 AND dii_mc.set_of_books_id =rep.ledger_id
3798 AND dii_mc.project_id = dii.project_id
3799 AND dii_mc.draft_invoice_num = dii.draft_invoice_num
3800 AND dii_mc.line_num = dii.line_num
3801 AND nvl(di.retention_invoice_flag, 'N') = 'Y'
3802 AND di.invoice_date <= G_THRU_DATE
3803 GROUP BY di.draft_invoice_num,dii.task_id, dii_mc.set_of_books_id,
3804 dii.invproc_currency_code, dii_mc.currency_code,
3805 dii.funding_currency_code, di.inv_currency_code, di.system_reference, di.transfer_status_code,
3806 canceled_flag, cancel_credit_memo_flag, write_off_flag,
3807 decode(di.draft_invoice_num_credited, NULL, 'N', 'Y')
3808 )
3809 ORDER BY drft_inv_num, task_id,set_of_books_id; */
3810
3811
3812 l_InvTypeTab PA_PLSQL_DATATYPES.Char30TabTyp;
3813 l_SetOfBookIdTab PA_PLSQL_DATATYPES.IdTabTyp;
3814 l_TaskIdTab PA_PLSQL_DATATYPES.IdTabTyp;
3815 l_DraftInvNumTab PA_PLSQL_DATATYPES.NumTabTyp;
3816 l_IPCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
3817 l_PFCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
3818 l_FCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
3819 l_ITCCurrTab PA_PLSQL_DATATYPES.Char30TabTyp;
3820 l_SysRefTab PA_PLSQL_DATATYPES.NumTabTyp;
3821 l_StatusCodeTab PA_PLSQL_DATATYPES.Char30TabTyp;
3822 l_BillAmtIPCTab PA_PLSQL_DATATYPES.NumTabTyp;
3823 l_BillAmtPFCTab PA_PLSQL_DATATYPES.NumTabTyp;
3824 l_BillAmtFCTab PA_PLSQL_DATATYPES.NumTabTyp;
3825 l_BillAmtITCTab PA_PLSQL_DATATYPES.NumTabTyp;
3826 l_RetnAmtIPCTab PA_PLSQL_DATATYPES.NumTabTyp;
3827 l_RetnAmtPFCTab PA_PLSQL_DATATYPES.NumTabTyp;
3828 l_RetnAmtFCTab PA_PLSQL_DATATYPES.NumTabTyp;
3829 l_RetnAmtITCTab PA_PLSQL_DATATYPES.NumTabTyp;
3830 l_CancelFlgTab PA_PLSQL_DATATYPES.Char1TabTyp;
3831 l_ClCrMemoFlgTab PA_PLSQL_DATATYPES.Char1TabTyp;
3832 l_WrOffFlgTab PA_PLSQL_DATATYPES.Char1TabTyp;
3833 l_CrMemoFlgTab PA_PLSQL_DATATYPES.Char1TabTyp;
3834
3835
3836
3837 l_InvTab InvTabTyp;
3838 l_InvIdx NUMBER := 0;
3839 l_InvoiceType VARCHAR2(30);
3840 l_SystemRef VARCHAR2(30);
3841 l_StatusCode VARCHAR2(30);
3842 l_AdjInvFlag VARCHAR2(1);
3843 l_DraftInvNum NUMBER;
3844 l_PrvInvNum NUMBER := 0;
3845
3846
3847 l_TotalFetch NUMBER := 0;
3848 l_ThisFetch NUMBER := 0;
3849 l_FetchSize NUMBER := 50;
3850
3851 l_return_status VARCHAR2(30) := NULL;
3852 l_msg_count NUMBER := NULL;
3853 l_msg_data VARCHAR2(250) := NULL;
3854 l_LogMsg VARCHAR2(250);
3855 BEGIN
3856 x_return_status := FND_API.G_RET_STS_SUCCESS;
3857 x_msg_count := 0;
3858
3859 IF G_DEBUG_MODE = 'Y' THEN
3860
3861 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_invoice_components-----------' ;
3862 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
3863
3864 END IF;
3865
3866 /* This procedure get invoice lines for the given project/agreement id.
3867
3868 If the project is funded at project level then there will be one line per invoice/
3869 set of book id
3870 If the project is funded at task level then there will be one line per task/invoice/
3871 set of book id
3872
3873 When only primary set of book id is processed and funding level is project, an invoice will
3874 have only one record fetched and subsequent processing should be invoked for every record
3875
3876 When primary with task level funding is processed, an invoice will have as many records as the
3877 number of tasks it comprises and subsequent processing should be invoked only once per set of
3878 invoice records (i.e for each draft invoice number ) The same is the case when reporting set of
3879 books are involved for both project and task level funding
3880
3881 Single/ Multiple record for an invoice (per draft_invoice_num) are passed into a table struture
3882 l_InvTab
3883
3884 */
3885
3886 /* l_AdjInvFlag = 'Y' indicates that the invoice is an adjusting invoice due to Cancel/credit-memo/write-off
3887 This is required b'cos AR will not return any paid amounts pertaining to these invoice. But this
3888 amount will be added with the original invoice and returned.
3889
3890 Total funding amount = 1000
3891
3892 Inv num billed amount paid amount
3893 Eg inv 1 500 400
3894 inv 2 -100 0 (Crediting invoice for 1)
3895
3896 In the above case when both invoices are accpted in AR , for original invoice the paid amount will
3897 be returned as 500. No amount will be returned for write-off invoice. So the funding backlog will be 500.
3898
3899 But currently our invoice model will have this write off amount as available funding. In order to sync
3900 Funding revaluation also with the invoice model, when this flag is set to 'Y'and accepted in AR, we will
3901 force get_ar_amounts to return paid amount also as -100.
3902 */
3903
3904 IF G_PRIMARY_ONLY = 'Y' THEN -- (
3905
3906 IF NVL(p_task_id,0) = 0 THEN /* Project level funding */
3907
3908 IF G_DEBUG_MODE = 'Y' THEN
3909
3910 l_LogMsg := 'Cursor get_proj_invoices ' ;
3911 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
3912
3913 END IF;
3914
3915 OPEN get_proj_invoices;
3916
3917 LOOP
3918
3919 FETCH get_proj_invoices BULK COLLECT INTO l_InvTypeTab, l_SetOfBookIdTab, l_TaskIdTab,
3920 l_DraftInvNumTab, l_IPCCurrTab, l_PFCCurrTab,
3921 l_FCCurrTab, l_ITCCurrTab, l_SysRefTab, l_StatusCodeTab,
3922 l_CancelFlgTab, l_ClCrMemoFlgTab, l_WrOffFlgTab, l_CrMemoFlgTab,
3923 l_BillAmtIPCTab, l_BillAmtPFCTab, l_BillAmtFCTab,
3924 l_BillAmtITCTab, l_RetnAmtIPCTab,
3925 l_RetnAmtPFCTab, l_RetnAmtFCTab, l_RetnAmtITCTab
3926 LIMIT l_FetchSize;
3927
3928 l_ThisFetch := get_proj_invoices%ROWCOUNT - l_TotalFetch;
3929 l_TotalFetch := get_proj_invoices%ROWCOUNT ;
3930
3931 IF l_ThisFetch > 0 THEN
3932
3933 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
3934
3935 l_InvTab(l_SetOfBookIdTab(i)).set_of_books_id := l_SetOfBookIdTab(i);
3936 l_InvTab(l_SetOfBookIdTab(i)).task_id := l_TaskIdTab(i);
3937 l_InvTab(l_SetOfBookIdTab(i)).projfunc_currency_code := l_PFCCurrTab(i);
3938 l_InvTab(l_SetOfBookIdTab(i)).funding_currency_code := l_FCCurrTab(i);
3939 l_InvTab(l_SetOfBookIdTab(i)).invproc_currency_code := l_IPCCurrTab(i);
3940 l_InvTab(l_SetOfBookIdTab(i)).inv_currency_code := l_ITCCurrTab(i);
3941 l_InvTab(l_SetOfBookIdTab(i)).amount := l_BillAmtIPCTab(i);
3942 l_InvTab(l_SetOfBookIdTab(i)).projfunc_bill_amount := l_BillAmtPFCTab(i);
3943 l_InvTab(l_SetOfBookIdTab(i)).funding_bill_amount := l_BillAmtFCTab(i);
3944 l_InvTab(l_SetOfBookIdTab(i)).inv_amount := l_BillAmtITCTab(i);
3945 l_InvTab(l_SetOfBookIdTab(i)).retn_amount := l_RetnAmtIPCTab(i);
3946 l_InvTab(l_SetOfBookIdTab(i)).projfunc_retn_amount := l_RetnAmtPFCTab(i);
3947 l_InvTab(l_SetOfBookIdTab(i)).funding_retn_amount := l_RetnAmtFCTab(i);
3948 l_InvTab(l_SetOfBookIdTab(i)).inv_retn_amount := l_RetnAmtITCTab(i);
3949 l_SystemRef := l_SysRefTab(i);
3950 l_StatusCode := l_StatusCodeTab(i);
3951 l_DraftInvNum := l_DraftInvNumTab(i);
3952 l_InvoiceType := l_InvTypeTab(i);
3953 l_AdjInvFlag := 'N';
3954
3955 IF ((l_CancelFlgTab(i) = 'Y') OR (l_ClCrMemoFlgTab(i) = 'Y') OR (l_WrOffFlgTab(i) = 'Y')
3956 OR (l_CrMemoFlgTab(i) = 'Y')) THEN
3957
3958 l_AdjInvFlag := 'Y';
3959
3960 END IF;
3961
3962 /* Call processing routine for every invoice as no reporting set of books are processed */
3963
3964 derive_reval_components (
3965 p_project_id => p_project_id,
3966 p_task_id => p_task_id,
3967 p_agreement_id => p_agreement_id,
3968 p_draft_inv_num => l_DraftInvNum,
3969 p_system_reference => l_SystemRef,
3970 p_invoice_status => l_StatusCode,
3971 p_adjust_flag => l_AdjInvFlag,
3972 p_TaskFund_ProjRetn_Flag => p_TaskFund_ProjRetn_Flag,
3973 p_invoice_type => l_InvoiceType,
3974 p_InvTab => l_InvTab,
3975 x_return_status => l_return_status,
3976 x_msg_count => l_msg_count,
3977 x_msg_data => l_msg_data);
3978
3979 l_InvTab.DELETE;
3980
3981 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3982
3983 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3984
3985 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
3986
3987 RAISE FND_API.G_EXC_ERROR;
3988
3989 END IF;
3990
3991 END LOOP; /*SetOfBookIdTab LOO */
3992
3993 END IF; /* l_ThisFetch */
3994
3995 /* Initialize for next fetch */
3996 l_SetOfBookIdTab.DELETE;
3997 l_InvTypeTab.DELETE;
3998 l_DraftInvNumTab.DELETE;
3999 l_TaskIdTab.DELETE;
4000 l_IPCCurrTab.DELETE;
4001 l_PFCCurrTab.DELETE;
4002 l_FCCurrTab.DELETE;
4003 l_ITCCurrTab.DELETE;
4004 l_SysRefTab.DELETE;
4005 l_StatusCodeTab.DELETE;
4006 l_CancelFlgTab.DELETE;
4007 l_ClCrMemoFlgTab.DELETE;
4008 l_WrOffFlgTab.DELETE;
4009 l_CrMemoFlgTab.DELETE;
4010 l_BillAmtPFCTab.DELETE;
4011 l_BillAmtFCTab.DELETE;
4012 l_BillAmtITCTab.DELETE;
4013 l_BillAmtIPCTab.DELETE;
4014 l_RetnAmtIPCTab.DELETE;
4015 l_RetnAmtPFCTab.DELETE;
4016 l_RetnAmtFCTab.DELETE;
4017 l_RetnAmtITCTab.DELETE;
4018
4019 IF l_ThisFetch < l_FetchSize THEN
4020 Exit;
4021 END IF;
4022
4023 END LOOP; /*get_proj_invoices*/
4024
4025 CLOSE get_proj_invoices;
4026
4027 ELSE /* Task Level funding */
4028
4029 IF G_DEBUG_MODE = 'Y' THEN
4030
4031 l_LogMsg := 'Cursor get_task_invoices ' ;
4032 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
4033
4034 END IF;
4035
4036 l_InvIdx := 0;
4037 OPEN get_task_invoices;
4038
4039 LOOP
4040
4041 FETCH get_task_invoices BULK COLLECT INTO l_InvTypeTab, l_SetOfBookIdTab, l_TaskIdTab,
4042 l_DraftInvNumTab, l_IPCCurrTab, l_PFCCurrTab,
4043 l_FCCurrTab, l_ITCCurrTab, l_SysRefTab, l_StatusCodeTab,
4044 l_CancelFlgTab, l_ClCrMemoFlgTab, l_WrOffFlgTab, l_CrMemoFlgTab,
4045 l_BillAmtIPCTab, l_BillAmtPFCTab, l_BillAmtFCTab,
4046 l_BillAmtITCTab, l_RetnAmtIPCTab,
4047 l_RetnAmtPFCTab, l_RetnAmtFCTab, l_RetnAmtITCTab
4048 LIMIT l_FetchSize;
4049
4050 l_ThisFetch := get_task_invoices%ROWCOUNT - l_TotalFetch;
4051 l_TotalFetch := get_task_invoices%ROWCOUNT ;
4052
4053 IF l_ThisFetch > 0 THEN
4054
4055 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
4056 /* Call processing routine only if draft invoice number changes */
4057
4058 IF l_PrvInvNum = 0 THEN
4059 l_PrvInvNum := l_DraftInvNumTab(i);
4060 END IF;
4061
4062 IF (l_PrvInvNum <> l_DraftInvNumTab(i)) THEN
4063
4064 derive_reval_components (
4065 p_project_id => p_project_id,
4066 p_task_id => p_task_id,
4067 p_agreement_id => p_agreement_id,
4068 p_draft_inv_num => l_PrvInvNum,
4069 p_system_reference => l_SystemRef,
4070 p_invoice_status => l_StatusCode,
4071 p_adjust_flag => l_AdjInvFlag,
4072 p_TaskFund_ProjRetn_Flag => p_TaskFund_ProjRetn_Flag,
4073 p_invoice_type => l_InvoiceType,
4074 p_InvTab => l_InvTab,
4075 x_return_status => l_return_status,
4076 x_msg_count => l_msg_count,
4077 x_msg_data => l_msg_data);
4078
4079 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4080
4081 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4082
4083 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4084
4085 RAISE FND_API.G_EXC_ERROR;
4086
4087 END IF;
4088
4089 l_InvTab.DELETE;
4090 l_PrvInvNum := l_DraftInvNumTab(i);
4091 l_InvIdx := 0;
4092
4093 END IF; /*(l_PrvInvNum <> l_DraftInvNumTab(i)) */
4094
4095 l_InvIdx := l_InvIdx + 1;
4096 l_InvTab(l_InvIdx).set_of_books_id := l_SetOfBookIdTab(i);
4097 l_InvTab(l_InvIdx).task_id := l_TaskIdTab(i);
4098 l_InvTab(l_InvIdx).projfunc_currency_code := l_PFCCurrTab(i);
4099 l_InvTab(l_InvIdx).funding_currency_code := l_FCCurrTab(i);
4100 l_InvTab(l_InvIdx).invproc_currency_code := l_IPCCurrTab(i);
4101 l_InvTab(l_InvIdx).inv_currency_code := l_ITCCurrTab(i);
4102 l_InvTab(l_InvIdx).amount := l_BillAmtIPCTab(i);
4103 l_InvTab(l_InvIdx).projfunc_bill_amount := l_BillAmtPFCTab(i);
4104 l_InvTab(l_InvIdx).funding_bill_amount := l_BillAmtFCTab(i);
4105 l_InvTab(l_InvIdx).inv_amount := l_BillAmtITCTab(i);
4106 l_InvTab(l_InvIdx).retn_amount := l_RetnAmtIPCTab(i);
4107 l_InvTab(l_InvIdx).projfunc_retn_amount := l_RetnAmtPFCTab(i);
4108 l_InvTab(l_InvIdx).funding_retn_amount := l_RetnAmtFCTab(i);
4109 l_InvTab(l_InvIdx).inv_retn_amount := l_RetnAmtITCTab(i);
4110 l_SystemRef := l_SysRefTab(i);
4111 l_StatusCode := l_StatusCodeTab(i);
4112 l_InvoiceType := l_InvTypeTab(i);
4113 l_AdjInvFlag := 'N';
4114
4115 IF ((l_CancelFlgTab(i) = 'Y') OR (l_ClCrMemoFlgTab(i) = 'Y') OR (l_WrOffFlgTab(i) = 'Y')
4116 OR (l_CrMemoFlgTab(i) = 'Y')) THEN
4117
4118 l_AdjInvFlag := 'Y';
4119
4120 END IF;
4121
4122
4123 END LOOP ;/* l_SetOfBookIdTab*/
4124
4125 END IF; /* l_ThisFetch > 0 */
4126
4127
4128 /* Process for last set of records */
4129 IF (l_ThisFetch < l_FetchSize) THEN
4130
4131 /* Bug 2548142 : added check that atleast a record has been fetched
4132 IF (l_ThisFetch > 0 ) THEN - Changing this for bug 4099886 */
4133 IF (l_PrvInvNum <> 0 ) THEN
4134
4135 derive_reval_components (
4136 p_project_id => p_project_id,
4137 p_task_id => p_task_id,
4138 p_agreement_id => p_agreement_id,
4139 p_draft_inv_num => l_PrvInvNum,
4140 p_system_reference => l_SystemRef,
4141 p_invoice_status => l_StatusCode,
4142 p_adjust_flag => l_AdjInvFlag,
4143 p_TaskFund_ProjRetn_Flag => p_TaskFund_ProjRetn_Flag,
4144 p_invoice_type => l_InvoiceType,
4145 p_InvTab => l_InvTab,
4146 x_return_status => l_return_status,
4147 x_msg_count => l_msg_count,
4148 x_msg_data => l_msg_data);
4149
4150 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4151
4152 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4153
4154 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4155
4156 RAISE FND_API.G_EXC_ERROR;
4157
4158 END IF;
4159
4160 l_InvTab.DELETE;
4161 l_InvIdx := 0;
4162
4163 END IF; /* l_ThisFetch > 0 */
4164
4165 EXIT;
4166
4167 END IF; /* l_ThisFetch < l_FetchSize */
4168 /* Initialize for next fetch */
4169 l_SetOfBookIdTab.DELETE;
4170 l_InvTypeTab.DELETE;
4171 l_DraftInvNumTab.DELETE;
4172 l_TaskIdTab.DELETE;
4173 l_IPCCurrTab.DELETE;
4174 l_PFCCurrTab.DELETE;
4175 l_FCCurrTab.DELETE;
4176 l_ITCCurrTab.DELETE;
4177 l_SysRefTab.DELETE;
4178 l_StatusCodeTab.DELETE;
4179 l_CancelFlgTab.DELETE;
4180 l_ClCrMemoFlgTab.DELETE;
4181 l_WrOffFlgTab.DELETE;
4182 l_CrMemoFlgTab.DELETE;
4183 l_BillAmtPFCTab.DELETE;
4184 l_BillAmtFCTab.DELETE;
4185 l_BillAmtITCTab.DELETE;
4186 l_BillAmtIPCTab.DELETE;
4187 l_RetnAmtIPCTab.DELETE;
4188 l_RetnAmtPFCTab.DELETE;
4189 l_RetnAmtFCTab.DELETE;
4190 l_RetnAmtITCTab.DELETE;
4191
4192 END LOOP; /*get_task_invoices*/
4193
4194 CLOSE get_task_invoices;
4195
4196 END IF; /* p_task_id = 0 */
4197
4198 -- mrc migration to SLA bug 4571438 ELSE /* G_PRIMARY_ONLY = 'N' ) */
4199
4200 /* mrc migration to SLA bug 4571438 ( IF NVL(p_task_id,0) = 0 THEN -- Project level funding
4201
4202 IF G_DEBUG_MODE = 'Y' THEN
4203
4204 l_LogMsg := 'Cursor get_all_proj_invoices ' ;
4205 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
4206
4207 END IF;
4208
4209 OPEN get_all_proj_invoices;
4210
4211 LOOP
4212
4213 FETCH get_all_proj_invoices BULK COLLECT INTO l_InvTypeTab, l_SetOfBookIdTab, l_TaskIdTab,
4214 l_DraftInvNumTab, l_IPCCurrTab, l_PFCCurrTab,
4215 l_FCCurrTab, l_ITCCurrTab, l_SysRefTab, l_StatusCodeTab,
4216 l_CancelFlgTab, l_ClCrMemoFlgTab, l_WrOffFlgTab, l_CrMemoFlgTab,
4217 l_BillAmtIPCTab, l_BillAmtPFCTab, l_BillAmtFCTab,
4218 l_BillAmtITCTab, l_RetnAmtIPCTab,
4219 l_RetnAmtPFCTab, l_RetnAmtFCTab, l_RetnAmtITCTab
4220 LIMIT l_FetchSize;
4221
4222 l_ThisFetch := get_all_proj_invoices%ROWCOUNT - l_TotalFetch;
4223 l_TotalFetch := get_all_proj_invoices%ROWCOUNT ;
4224
4225 IF l_ThisFetch > 0 THEN
4226
4227 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
4228 -- Call processing routine for every invoice only and not for each task
4229
4230 IF l_PrvInvNum = 0 THEN
4231 l_PrvInvNum := l_DraftInvNumTab(i);
4232 END IF;
4233
4234 IF (l_PrvInvNum <> l_DraftInvNumTab(i)) THEN
4235
4236 derive_reval_components (
4237 p_project_id => p_project_id,
4238 p_task_id => p_task_id,
4239 p_agreement_id => p_agreement_id,
4240 p_draft_inv_num => l_PrvInvNum,
4241 p_system_reference => l_SystemRef,
4242 p_invoice_status => l_StatusCode,
4243 p_adjust_flag => l_AdjInvFlag,
4244 p_TaskFund_ProjRetn_Flag => p_TaskFund_ProjRetn_Flag,
4245 p_invoice_type => l_InvoiceType,
4246 p_InvTab => l_InvTab,
4247 x_return_status => l_return_status,
4248 x_msg_count => l_msg_count,
4249 x_msg_data => l_msg_data);
4250
4251 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4252
4253 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4254
4255 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4256
4257 RAISE FND_API.G_EXC_ERROR;
4258
4259 END IF;
4260
4261 l_InvTab.DELETE;
4262 l_PrvInvNum := l_DraftInvNumTab(i);
4263
4264 END IF; -- (l_PrvInvNum <> l_DraftInvNumTab(i))
4265
4266 l_InvTab(l_SetOfBookIdTab(i)).set_of_books_id := l_SetOfBookIdTab(i);
4267 l_InvTab(l_SetOfBookIdTab(i)).task_id := l_TaskIdTab(i);
4268 l_InvTab(l_SetOfBookIdTab(i)).projfunc_currency_code := l_PFCCurrTab(i);
4269 l_InvTab(l_SetOfBookIdTab(i)).funding_currency_code := l_FCCurrTab(i);
4270 l_InvTab(l_SetOfBookIdTab(i)).invproc_currency_code := l_IPCCurrTab(i);
4271 l_InvTab(l_SetOfBookIdTab(i)).inv_currency_code := l_ITCCurrTab(i);
4272 l_InvTab(l_SetOfBookIdTab(i)).amount := l_BillAmtIPCTab(i);
4273 l_InvTab(l_SetOfBookIdTab(i)).projfunc_bill_amount := l_BillAmtPFCTab(i);
4274 l_InvTab(l_SetOfBookIdTab(i)).funding_bill_amount := l_BillAmtFCTab(i);
4275 l_InvTab(l_SetOfBookIdTab(i)).inv_amount := l_BillAmtITCTab(i);
4276 l_InvTab(l_SetOfBookIdTab(i)).retn_amount := l_RetnAmtIPCTab(i);
4277 l_InvTab(l_SetOfBookIdTab(i)).projfunc_retn_amount := l_RetnAmtPFCTab(i);
4278 l_InvTab(l_SetOfBookIdTab(i)).funding_retn_amount := l_RetnAmtFCTab(i);
4279 l_InvTab(l_SetOfBookIdTab(i)).inv_retn_amount := l_RetnAmtITCTab(i);
4280 l_SystemRef := l_SysRefTab(i);
4281 l_StatusCode := l_StatusCodeTab(i);
4282 l_InvoiceType := l_InvTypeTab(i);
4283 l_AdjInvFlag := 'N';
4284
4285 IF ((l_CancelFlgTab(i) = 'Y') OR (l_ClCrMemoFlgTab(i) = 'Y') OR (l_WrOffFlgTab(i) = 'Y')
4286 OR (l_CrMemoFlgTab(i) = 'Y')) THEN
4287
4288 l_AdjInvFlag := 'Y';
4289
4290 END IF;
4291
4292
4293 END LOOP; -- l_SetOfBookIdTab
4294
4295 END IF; -- l_ThisFetch > 0
4296
4297 -- Process for last set of records
4298 IF (l_ThisFetch < l_FetchSize) THEN
4299
4300 -- Bug 2548142 : added check that atleast a record has been fetched
4301 -- IF (l_ThisFetch > 0 ) THEN - Changing this for bug 4099886
4302 IF (l_PrvInvNum <> 0 ) THEN
4303
4304 derive_reval_components (
4305 p_project_id => p_project_id,
4306 p_task_id => p_task_id,
4307 p_agreement_id => p_agreement_id,
4308 p_draft_inv_num => l_PrvInvNum,
4309 p_system_reference => l_SystemRef,
4310 p_invoice_status => l_StatusCode,
4311 p_adjust_flag => l_AdjInvFlag,
4312 p_TaskFund_ProjRetn_Flag => p_TaskFund_ProjRetn_Flag,
4313 p_invoice_type => l_InvoiceType,
4314 p_InvTab => l_InvTab,
4315 x_return_status => l_return_status,
4316 x_msg_count => l_msg_count,
4317 x_msg_data => l_msg_data);
4318
4319 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4320
4321 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4322
4323 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4324
4325 RAISE FND_API.G_EXC_ERROR;
4326
4327 END IF;
4328
4329 l_InvTab.DELETE;
4330
4331 END IF; -- l_ThisFetch > 0
4332
4333 EXIT;
4334
4335 END IF; -- l_ThisFetch < l_FetchSize
4336
4337 -- Initialize for next fetch
4338 l_SetOfBookIdTab.DELETE;
4339 l_InvTypeTab.DELETE;
4340 l_DraftInvNumTab.DELETE;
4341 l_TaskIdTab.DELETE;
4342 l_IPCCurrTab.DELETE;
4343 l_PFCCurrTab.DELETE;
4344 l_FCCurrTab.DELETE;
4345 l_ITCCurrTab.DELETE;
4346 l_SysRefTab.DELETE;
4347 l_StatusCodeTab.DELETE;
4348 l_CancelFlgTab.DELETE;
4349 l_ClCrMemoFlgTab.DELETE;
4350 l_WrOffFlgTab.DELETE;
4351 l_CrMemoFlgTab.DELETE;
4352 l_BillAmtPFCTab.DELETE;
4353 l_BillAmtFCTab.DELETE;
4354 l_BillAmtITCTab.DELETE;
4355 l_BillAmtIPCTab.DELETE;
4356 l_RetnAmtIPCTab.DELETE;
4357 l_RetnAmtPFCTab.DELETE;
4358 l_RetnAmtFCTab.DELETE;
4359 l_RetnAmtITCTab.DELETE;
4360
4361 END LOOP ; -- get_all_proj_invoices
4362
4363 CLOSE get_all_proj_invoices;
4364
4365 ELSE -- Task Level funding
4366
4367 l_InvIdx := 0;
4368
4369 IF G_DEBUG_MODE = 'Y' THEN
4370
4371 l_LogMsg := 'Cursor get_all_task_invoices ' ;
4372 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
4373
4374 END IF;
4375
4376 OPEN get_all_task_invoices;
4377
4378 LOOP
4379
4380 FETCH get_all_task_invoices BULK COLLECT INTO l_InvTypeTab, l_SetOfBookIdTab, l_TaskIdTab,
4381 l_DraftInvNumTab, l_IPCCurrTab, l_PFCCurrTab,
4382 l_FCCurrTab, l_ITCCurrTab, l_SysRefTab, l_StatusCodeTab,
4383 l_CancelFlgTab, l_ClCrMemoFlgTab, l_WrOffFlgTab, l_CrMemoFlgTab,
4384 l_BillAmtIPCTab, l_BillAmtPFCTab, l_BillAmtFCTab,
4385 l_BillAmtITCTab, l_RetnAmtIPCTab,
4386 l_RetnAmtPFCTab, l_RetnAmtFCTab, l_RetnAmtITCTab
4387 LIMIT l_FetchSize;
4388
4389 l_ThisFetch := get_all_task_invoices%ROWCOUNT - l_TotalFetch;
4390 l_TotalFetch := get_all_task_invoices%ROWCOUNT ;
4391
4392 IF l_ThisFetch > 0 THEN
4393
4394
4395 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
4396 -- Call processing routine for every invoice only and not for each task
4397
4398 IF l_PrvInvNum = 0 THEN
4399 l_PrvInvNum := l_DraftInvNumTab(i);
4400 END IF;
4401
4402 IF (l_PrvInvNum <> l_DraftInvNumTab(i)) THEN
4403
4404 derive_reval_components (
4405 p_project_id => p_project_id,
4406 p_task_id => p_task_id,
4407 p_agreement_id => p_agreement_id,
4408 p_draft_inv_num => l_PrvInvNum,
4409 p_system_reference => l_SystemRef,
4410 p_invoice_status => l_StatusCode,
4411 p_adjust_flag => l_AdjInvFlag,
4412 p_TaskFund_ProjRetn_Flag => p_TaskFund_ProjRetn_Flag,
4413 p_invoice_type => l_InvoiceType,
4414 p_InvTab => l_InvTab,
4415 x_return_status => l_return_status,
4416 x_msg_count => l_msg_count,
4417 x_msg_data => l_msg_data);
4418
4419 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4420
4421 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4422
4423 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4424
4425 RAISE FND_API.G_EXC_ERROR;
4426
4427 END IF;
4428
4429 l_InvTab.DELETE;
4430 l_InvIdx := 0;
4431 l_PrvInvNum := l_DraftInvNumTab(i);
4432
4433 END IF; -- (l_PrvInvNum <> l_DraftInvNumTab(i))
4434 l_InvIdx := l_InvIdx + 1;
4435 l_InvTab(l_InvIdx).set_of_books_id := l_SetOfBookIdTab(i);
4436 l_InvTab(l_InvIdx).task_id := l_TaskIdTab(i);
4437 l_InvTab(l_InvIdx).projfunc_currency_code := l_PFCCurrTab(i);
4438 l_InvTab(l_InvIdx).funding_currency_code := l_FCCurrTab(i);
4439 l_InvTab(l_InvIdx).invproc_currency_code := l_IPCCurrTab(i);
4440 l_InvTab(l_InvIdx).inv_currency_code := l_ITCCurrTab(i);
4441 l_InvTab(l_InvIdx).amount := l_BillAmtIPCTab(i);
4442 l_InvTab(l_InvIdx).projfunc_bill_amount := l_BillAmtPFCTab(i);
4443 l_InvTab(l_InvIdx).funding_bill_amount := l_BillAmtFCTab(i);
4444 l_InvTab(l_InvIdx).inv_amount := l_BillAmtITCTab(i);
4445 l_InvTab(l_InvIdx).retn_amount := l_RetnAmtIPCTab(i);
4446 l_InvTab(l_InvIdx).projfunc_retn_amount := l_RetnAmtPFCTab(i);
4447 l_InvTab(l_InvIdx).funding_retn_amount := l_RetnAmtFCTab(i);
4448 l_InvTab(l_InvIdx).inv_retn_amount := l_RetnAmtITCTab(i);
4449 l_SystemRef := l_SysRefTab(i);
4450 l_StatusCode := l_StatusCodeTab(i);
4451 l_InvoiceType := l_InvTypeTab(i);
4452 l_AdjInvFlag := 'N';
4453
4454 IF ((l_CancelFlgTab(i) = 'Y') OR (l_ClCrMemoFlgTab(i) = 'Y') OR (l_WrOffFlgTab(i) = 'Y')
4455 OR (l_CrMemoFlgTab(i) = 'Y')) THEN
4456
4457 l_AdjInvFlag := 'Y';
4458
4459 END IF;
4460
4461
4462 END LOOP ; -- l_SetOfBookIdTab
4463
4464 END IF; -- l_ThisFetch > 0
4465
4466 -- Process for last set of records
4467 IF (l_ThisFetch < l_FetchSize) THEN
4468
4469 -- Bug 2548142 : added check that atleast a record has been fetched
4470 -- IF (l_ThisFetch > 0 ) THEN - Changed this for bug 4099886
4471 IF (l_PrvInvNum <> 0 ) THEN
4472
4473 derive_reval_components (
4474 p_project_id => p_project_id,
4475 p_task_id => p_task_id,
4476 p_agreement_id => p_agreement_id,
4477 p_draft_inv_num => l_PrvInvNum,
4478 p_system_reference => l_SystemRef,
4479 p_invoice_status => l_StatusCode,
4480 p_adjust_flag => l_AdjInvFlag,
4481 p_TaskFund_ProjRetn_Flag => p_TaskFund_ProjRetn_Flag,
4482 p_invoice_type => l_InvoiceType,
4483 p_InvTab => l_InvTab,
4484 x_return_status => l_return_status,
4485 x_msg_count => l_msg_count,
4486 x_msg_data => l_msg_data);
4487
4488 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4489
4490 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4491
4492 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4493
4494 RAISE FND_API.G_EXC_ERROR;
4495
4496 END IF;
4497
4498 l_InvTab.DELETE;
4499 l_InvIdx := 0;
4500
4501 END IF; -- l_ThisFetch > 0
4502
4503 EXIT;
4504
4505 END IF; -- l_ThisFetch < l_FetchSize
4506 -- Initialize for next fetch
4507 l_SetOfBookIdTab.DELETE;
4508 l_InvTypeTab.DELETE;
4509 l_DraftInvNumTab.DELETE;
4510 l_TaskIdTab.DELETE;
4511 l_IPCCurrTab.DELETE;
4512 l_PFCCurrTab.DELETE;
4513 l_FCCurrTab.DELETE;
4514 l_ITCCurrTab.DELETE;
4515 l_SysRefTab.DELETE;
4516 l_StatusCodeTab.DELETE;
4517 l_CancelFlgTab.DELETE;
4518 l_ClCrMemoFlgTab.DELETE;
4519 l_WrOffFlgTab.DELETE;
4520 l_CrMemoFlgTab.DELETE;
4521 l_BillAmtPFCTab.DELETE;
4522 l_BillAmtFCTab.DELETE;
4523 l_BillAmtITCTab.DELETE;
4524 l_BillAmtIPCTab.DELETE;
4525 l_RetnAmtIPCTab.DELETE;
4526 l_RetnAmtPFCTab.DELETE;
4527 l_RetnAmtFCTab.DELETE;
4528 l_RetnAmtITCTab.DELETE;
4529
4530 END LOOP ; -- get_all_task_invoices
4531
4532 CLOSE get_all_task_invoices;
4533
4534 END IF ; -- )p_task_id = 0 */
4535
4536 END IF ;/* G_PRIMARY_ONLY */
4537
4538 IF G_DEBUG_MODE = 'Y' THEN
4539
4540 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_invoice_components-----------' ;
4541 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
4542
4543 END IF;
4544
4545 EXCEPTION
4546
4547 WHEN FND_API.G_EXC_ERROR THEN
4548 x_return_status := l_return_status;
4549 x_msg_count := l_msg_count;
4550 x_msg_data := l_msg_data;
4551
4552 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4553 x_return_status := l_return_status;
4554 x_msg_count := l_msg_count;
4555 x_msg_data := l_msg_data;
4556
4557 WHEN OTHERS THEN
4558 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4559 x_msg_count := l_msg_count;
4560 x_msg_data := SUBSTR(SQLERRM,1,100);
4561
4562 IF G_DEBUG_MODE = 'Y' THEN
4563
4564 PA_DEBUG.g_err_stage := 'get_invoice_components:' || x_msg_data ;
4565 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
4566
4567 END IF;
4568
4569 END get_invoice_components;
4570
4571 /*----------------------------------------------------------------------------------------+
4572 | Procedure : derive_reval_components |
4573 | Purpose : To derive revaluation components from input invoice record |
4574 | Parameters : |
4575 | ================================================================================== |
4576 | Name Mode Description |
4577 | ================================================================================== |
4578 | p_project_id IN Project ID |
4579 | p_task_id IN Task Id of summary project funding |
4580 | p_agreement_id IN Agreement_id |
4581 | p_draft_inv_num IN Draft invoice number that is being processed |
4582 | p_system_reference IN System Reference trx_id for AR |
4583 | p_Invoice_Status IN Indicates if the input invoice status is accepted |
4584 | in AR or Not |
4585 | p_Adjust_Flag IN 'Y' Indicates if the invoice is a write-off/cancel/
4586 | credit memo
4587 | p_TaskFund_ProjRetn_Flag IN Indicates if the agreement is task levl funding |
4588 | and retention setup for project is project level |
4589 | p_Invoice_Type IN Indicates if the invoice type is |
4590 | REGULAR-PROJ, RETENTION-PROJ, |
4591 | REGULAR-TASK, RETENTION-TASK |
4592 | p_InvTab IN Invoice of all set of books for which |
4593 | paid amounts and FXGL are to be computed |
4594 | x_return_status OUT Return status of this procedure |
4595 | x_msg_count OUT Error message count |
4596 | x_msg_data OUT Error message |
4597 | ================================================================================== |
4598 +----------------------------------------------------------------------------------------*/
4599
4600 PROCEDURE derive_reval_components(
4601 p_project_id IN NUMBER,
4602 p_task_id IN NUMBER,
4603 p_agreement_id IN NUMBER,
4604 p_draft_inv_num IN NUMBER,
4605 p_system_reference IN NUMBER,
4606 p_invoice_status IN VARCHAR2,
4607 p_adjust_flag IN VARCHAR2,
4608 p_TaskFund_ProjRetn_Flag IN VARCHAR2,
4609 p_Invoice_Type IN VARCHAR2,
4610 p_InvTab IN InvTabTyp,
4611 x_return_status OUT NOCOPY VARCHAR2,
4612 x_msg_count OUT NOCOPY NUMBER,
4613 x_msg_data OUT NOCOPY VARCHAR2) IS
4614
4615 /* Bug 3221279 Starts */
4616 i_from_currency_tab PA_PLSQL_DATATYPES.Char30TabTyp;
4617 i_to_currency_tab PA_PLSQL_DATATYPES.Char30TabTyp;
4618 i_conversion_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
4619 i_conversion_type_tab PA_PLSQL_DATATYPES.Char30TabTyp;
4620 i_amount_tab PA_PLSQL_DATATYPES.NumTabTyp;
4621 i_user_validate_flag_tab PA_PLSQL_DATATYPES.Char30TabTyp;
4622 i_converted_amount_tab PA_PLSQL_DATATYPES.NumTabTyp;
4623 i_denominator_tab PA_PLSQL_DATATYPES.NumTabTyp;
4624 i_numerator_tab PA_PLSQL_DATATYPES.NumTabTyp;
4625 i_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
4626 i_conversion_between VARCHAR2(6);
4627 i_cache_flag VARCHAR2(1);
4628 i_status_tab PA_PLSQL_DATATYPES.Char30TabTyp;
4629 i_error_flag VARCHAR2(1) := 'N';
4630 l_ITC_due_amount NUMBER := 0;
4631 l_revald_pf_inv_due_amount NUMBER := 0;
4632 i_ProjfuncRateType Varchar2(30);
4633 /* Bug 3221279 Ends */
4634
4635 l_BillAmtITC NUMBER := 0;
4636 l_BillAmtFC NUMBER := 0;
4637
4638 l_BillAmtIPC NUMBER := 0;
4639 l_BillAmtPFC NUMBER := 0;
4640 l_ApplAmtFC NUMBER := 0;
4641 l_ApplAmtPFC NUMBER := 0;
4642 l_DueAmtFC NUMBER := 0;
4643 l_DueAmtPFC NUMBER := 0;
4644 l_GainAmtPFC NUMBER := 0;
4645 l_LossAmtPFC NUMBER := 0;
4646
4647 l_ErrorStatus VARCHAR2(30);
4648 l_SobId NUMBER;
4649
4650 l_ArApplAmtPFC NUMBER := 0;
4651 l_ArApplAmtFC NUMBER := 0;
4652 l_ArGainAmtPFC NUMBER := 0;
4653 l_ArLossAmtPFC NUMBER := 0;
4654 /* Added for bug 7237486 */
4655 l_ArAdjAmtPFC NUMBER := 0;
4656 l_ArAdjAmtFC NUMBER := 0;
4657 l_ProArAdjAmtPFC NUMBER := 0;
4658 l_ProArAdjAmtFC NUMBER := 0;
4659 /* Added for bug 7237486 */
4660
4661 l_ProApplAmtFC NUMBER := 0;
4662 l_ProApplAmtPFC NUMBER := 0;
4663 l_ProGainAmtPFC NUMBER := 0;
4664 l_ProLossAmtPFC NUMBER := 0;
4665
4666 l_NetAmtPFC NUMBER := 0;
4667 l_NetAmtFC NUMBER := 0;
4668
4669 l_RetainedAmtPFC NUMBER := 0;
4670 l_RetainedAmtFC NUMBER := 0;
4671
4672 l_RetnApplAmtPFC NUMBER := 0;
4673 l_RetnApplAmtFC NUMBER := 0;
4674 l_RetnGainAmtPFC NUMBER := 0;
4675 l_RetnLossAmtPFC NUMBER := 0;
4676
4677 l_PrvInvTskId NUMBER := 0;
4678 l_FoundFlag VARCHAR2(1);
4679 l_index NUMBER;
4680
4681 l_InvTotTab InvTotTabTyp;
4682 l_AdjTotTab InvTotTabTyp;
4683 l_ArAmtsTab ArAmtsTabTyp;
4684 l_RetainedAmtTab RetainedAmtTabTyp ;
4685
4686 l_TotalFetch NUMBER := 0;
4687 l_ThisFetch NUMBER := 0;
4688 l_FetchSize NUMBER := 50;
4689
4690 l_return_status VARCHAR2(30) := NULL;
4691 l_msg_count NUMBER := NULL;
4692 l_msg_data VARCHAR2(250) := NULL;
4693 l_LogMsg VARCHAR2(250);
4694 l_SobIdIdx NUMBER;
4695 BEGIN
4696 x_return_status := FND_API.G_RET_STS_SUCCESS;
4697 x_msg_count := 0;
4698
4699
4700 IF G_DEBUG_MODE = 'Y' THEN
4701
4702 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.derive_reval_components-----------' ;
4703 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
4704
4705 END IF;
4706
4707 i_ProjfuncRateType := nvl(G_RATE_TYPE, G_ProjLvlGlobRec.projfunc_bil_rate_type); /* Added for Bug 3221279 */
4708
4709 /* This procedure gets line details of a single invoice (primary set of books only) /
4710 line details of a single invoice for each set of book id (primary and reproting ).
4711
4712 Based on the invoice status (if accepted in AR) the AR api will be called
4713 (this check is done inside get_ar_amounts along with other checks
4714 - AR Installed/not
4715 - if Include realized gains/loss is enabled )
4716 which will return applied amounts and FXGL amounts for the invoice in primary/both primary and reporting .
4717
4718 If reporting set of book id is not enabled AR api will return 0 for all the amounts of that
4719 sob id.
4720
4721 ArAmtsTab is indexed by set of book id. This will have one row for each reporting
4722 set of book id and one for primary set of book id
4723
4724 Since this routine does at each invoice level the total is summed up against
4725 each agreement/sob id and stored in global table G_InvCompTab
4726 */
4727
4728 IF G_DEBUG_MODE = 'Y' THEN
4729
4730 l_LogMsg:= 'Draft Inv Num:' || p_draft_inv_num ||
4731 ' Agr Task Id :'|| p_task_id ||
4732 ' Sysref :' || p_system_reference ||
4733 ' inv stat:' || p_invoice_status ||
4734 ' inv type:' || p_Invoice_Type;
4735 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
4736
4737 END IF;
4738
4739 l_ArAmtsTab.DELETE;
4740
4741 /* p_adjust_flag indicates if the invoice is an adjustment invoice (credit memo/write-off/cancel)
4742 If so and transferred to AR, the invoiced amount should be returned as paid amount. This is b'cos
4743 AR returns the adjustment amount + paid amount for the original invoice and returns zero for
4744 the adjustment invoice. This would result in write-off amount being treated as billed and fully paid
4745 for Funding revaluation, but invoice model will have this write-off as available funding. Funding
4746 Revaluation needs to have this as backlog amount to be in sync with invoice model. In order to achieve
4747 this , the else part of if p_adjust_flag is written. The total for the invoice is returned by the
4748 get_invoice_total procedure which is then copied to ARamtstab, so that the processing will continue
4749 normally from thereon
4750 AR amounts are forced to return
4751 the adjustment amount, which will offset the billed and paid amount making it to be in sync with
4752 invoice model */
4753
4754
4755 IF p_adjust_flag = 'N' THEN
4756
4757 get_ar_amounts (
4758 p_customer_trx_id => p_System_Reference,
4759 p_invoice_status => p_invoice_status,
4760 x_ArAmtsTab => l_ArAmtsTab,
4761 x_return_status => l_return_status,
4762 x_msg_count => l_msg_count,
4763 x_msg_data => l_msg_data);
4764
4765 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4766
4767 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4768
4769 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4770
4771 RAISE FND_API.G_EXC_ERROR;
4772
4773 END IF;
4774
4775 ELSE
4776
4777 IF G_DEBUG_MODE = 'Y' THEN
4778
4779 l_LogMsg:= ' Adjustment Invoice ' ;
4780 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
4781
4782 END IF;
4783
4784 IF ((G_ProjLvlGlobRec.include_gains_losses_flag = 'Y') AND
4785 (p_invoice_status = 'A') AND (G_AR_INSTALLED_FLAG = 'Y')) THEN
4786
4787 l_AdjTotTab.DELETE;
4788
4789 get_invoice_total (
4790 p_project_id => p_project_id,
4791 p_agreement_id => p_agreement_id,
4792 p_draft_inv_num => p_draft_inv_num,
4793 x_InvTotTab => l_AdjTotTab,
4794 x_return_status => l_return_status,
4795 x_msg_count => l_msg_count,
4796 x_msg_data => l_msg_data);
4797
4798 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4799
4800 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4801
4802 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4803
4804 RAISE FND_API.G_EXC_ERROR;
4805
4806 END IF;
4807
4808 l_SobId := l_AdjTotTab.FIRST;
4809
4810 LOOP
4811
4812 EXIT WHEN l_SobId IS NULL;
4813
4814 l_ArAmtsTab(l_SobId).set_of_books_id := l_AdjTotTab(l_SobId).set_of_books_id;
4815 l_ArAmtsTab(l_SobId).inv_applied_amount := l_AdjTotTab(l_SobId).inv_amount;
4816 l_ArAmtsTab(l_SobId).projfunc_applied_amount := l_AdjTotTab(l_SobId).projfunc_bill_amount;
4817 l_ArAmtsTab(l_SobId).projfunc_gain_amount := 0;
4818 l_ArAmtsTab(l_SobId).projfunc_loss_amount := 0;
4819
4820 l_SobId := l_AdjTotTab.NEXT(l_SobId);
4821
4822 END LOOP;
4823
4824 END IF;
4825
4826 END IF;
4827
4828 /* If the agreement of the invoice is funding for top task then the invoice total is required
4829 to prorate the AR amounts (applied and FXGL - which will also be returned for the invoice and not
4830 at line level ) for each task.
4831
4832 The procedure get_invoice_total will return for the invoice (for all set of book id's)
4833 invoice amount in IPC (0 in case of MC), PFC, FC (0 in case of MC). The result tab l_InvTotTab is
4834 indexed by set_of_books_id */
4835
4836
4837 IF nvl(p_task_id,0) <> 0 THEN /* Task level funding */
4838
4839 IF G_DEBUG_MODE = 'Y' THEN
4840
4841 l_LogMsg:= 'Task level funding ' ;
4842 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
4843
4844 END IF;
4845
4846 l_InvTotTab.DELETE;
4847
4848 get_invoice_total (
4849 p_project_id => p_project_id,
4850 p_agreement_id => p_agreement_id,
4851 p_draft_inv_num => p_draft_inv_num,
4852 x_InvTotTab => l_InvTotTab,
4853 x_return_status => l_return_status,
4854 x_msg_count => l_msg_count,
4855 x_msg_data => l_msg_data);
4856
4857 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4858
4859 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4860
4861 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
4862
4863 RAISE FND_API.G_EXC_ERROR;
4864
4865 END IF;
4866
4867 FOR i in p_InvTab.first..p_InvTab.last loop
4868
4869 l_BillAmtITC := 0;
4870 l_BillAmtFC := 0;
4871
4872 l_BillAmtIPC := 0;
4873 l_BillAmtPFC := 0;
4874 l_ApplAmtFC := 0;
4875 l_ApplAmtPFC := 0;
4876 l_DueAmtFC := 0;
4877 l_DueAmtPFC := 0;
4878 l_GainAmtPFC := 0;
4879 l_LossAmtPFC := 0;
4880
4881 l_ARApplAmtFC := 0;
4882 l_ARApplAmtPFC := 0;
4883 l_ARGainAmtPFC := 0;
4884 l_ARLossAmtPFC := 0;
4885 /* Added for bug 7237486 */
4886 l_ArAdjAmtPFC := 0;
4887 l_ArAdjAmtFC := 0;
4888 l_ProArAdjAmtPFC := 0;
4889 l_ProArAdjAmtFC := 0;
4890 /* Added for bug 7237486 */
4891 l_ProApplAmtFC := 0;
4892 l_ProApplAmtPFC := 0;
4893 l_ProGainAmtPFC := 0;
4894 l_ProLossAmtPFC := 0;
4895 l_NetAmtPFC := 0;
4896 l_NetAmtFC := 0;
4897
4898 l_RetainedAmtPFC := 0;
4899 l_RetainedAmtFC := 0;
4900
4901 l_ErrorStatus := '';
4902 l_SobId := p_InvTab(i).set_of_books_id;
4903
4904 IF G_DEBUG_MODE = 'Y' THEN
4905
4906 l_LogMsg := ' ' ;
4907 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
4908
4909 l_LogMsg := 'Sob Id:' || l_SobId || ' Task ID:' || p_InvTab(i).task_id;
4910 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
4911
4912 l_LogMsg := '=================';
4913 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
4914
4915 END IF;
4916
4917 IF l_ARAmtsTab.EXISTS(l_SobId) THEN
4918 /* If funding currency and invoice currency are different
4919 prorate the AR amounts for funding currency */
4920 IF p_InvTab(i).inv_currency_code <> p_InvTab(i).funding_currency_code THEN
4921 IF p_InvTab(i).funding_currency_code = p_InvTab(i).projfunc_currency_code THEN
4922 IF G_DEBUG_MODE = 'Y' THEN
4923
4924 l_LogMsg := 'FC and ITC are different, but = PFC - assigning';
4925 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
4926
4927 END IF;
4928
4929 l_ARApplAmtFC := l_ArAmtsTab(l_SobId).projfunc_applied_amount;
4930 l_ArAdjAmtFC := l_ArAmtsTab(l_SobId).projfunc_adjusted_amount; /* Added for bug 7237486 */
4931 ELSE
4932 /*
4933 l_BillAmtITC := p_InvTab(i).inv_amount;
4934 l_BillAmtFC := p_InvTab(i).funding_bill_amount;
4935 This amount should be net amount and not just standard line amount as AR is on net amount
4936 */
4937 l_BillAmtITC := l_InvTotTab(l_SobId).inv_amount;
4938 l_BillAmtFC := l_InvTotTab(l_SobId).funding_bill_amount;
4939
4940 IF l_BillAmtITC <> 0 THEN /* Added for bug 3547687 */
4941 l_ARApplAmtFC := (l_ARAmtsTab(l_SobId).inv_applied_amount / l_BillAmtITC) *
4942 l_BillAmtFC;
4943 l_ArAdjAmtFC := (l_ARAmtsTab(l_SobId).inv_adjusted_amount/ l_BillAmtITC) *
4944 l_BillAmtFC; /* Added for bug 7237486 */
4945 ELSE
4946 l_ARApplAmtFC :=0;
4947 l_ArAdjAmtFC :=0; /* Added for bug 7237486 */
4948 END IF;
4949
4950 IF G_DEBUG_MODE = 'Y' THEN
4951
4952 l_LogMsg := 'FC and ITC are different - Prorating';
4953 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
4954
4955 l_LogMsg := 'Appl amt ITC:' || l_ARAmtsTab(l_SobId).inv_applied_amount ||
4956 ' Tot Bill amt ITC:' || l_BillAmtITC ||
4957 ' Tot Bill amt FC:' || l_BillAmtFC ||
4958 ' Appl amt FC:' || round(l_ArApplAmtFc,5) ||
4959 ' Adj amount FC ' || round(l_ArAdjAmtFC,5); /* Added for bug 7237486 */
4960
4961 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
4962
4963 END IF;
4964
4965 END IF;
4966
4967 ELSE
4968
4969 l_ARApplAmtFC := l_ArAmtsTab(l_SobId).inv_applied_amount;
4970 l_ArAdjAmtFC := l_ArAmtsTab(l_SobId).inv_adjusted_amount; /* Added for bug 7237486 */
4971 END IF;
4972
4973 /* Applied amount of the entire invoice */
4974
4975 l_ARApplAmtPFC := l_ArAmtsTab(l_SobId).projfunc_applied_amount;
4976 l_ARGainAmtPFC := l_ArAmtsTab(l_SobId).projfunc_gain_amount;
4977 l_ARLossAmtPFC := l_ArAmtsTab(l_SobId).projfunc_loss_amount;
4978 l_ArAdjAmtPFC := l_ArAmtsTab(l_SobId).projfunc_adjusted_amount; /* Added for bug 7237486 */
4979
4980 IF G_DEBUG_MODE = 'Y' THEN /* Added for bug 7237486*/
4981 l_LogMsg := 'AR Adjustment Amount in PFC = '||l_ArAdjAmtPFC;
4982 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
4983 END IF;
4984
4985 END IF; /*l_ArAmtsTab.EXISTS(l_SobId) */
4986 /* AR might not have received any payment. Avoid division by zero error */
4987 IF l_ARApplAmtPFC <> 0 THEN
4988 /* Prorate the applied amount of the invoice to the task in porcessing
4989 Net amount of the task should be used for proration */
4990
4991 /* If task level funding and project level retention, the retention amount for each task
4992 will be derived separately */
4993
4994 IF p_TaskFund_ProjRetn_Flag = 'Y' THEN
4995 /* The procedure get_retained_amount gets retained amount of a single task/invoice for
4996 primary or primary and reporting set of books id. Since p_InvTab is indexed by
4997 invoice_num, task, set_of_book_id, this procedure needs to be called only once for
4998 each task
4999
5000 l_RetainedAmtTab is index by set of books id*/
5001
5002 /* Get retained amount for the invoice/current task for primary /primay and reporting */
5003 IF l_PrvInvTskId <> p_InvTab(i).task_id THEN
5004
5005 l_PrvInvTskId := p_InvTab(i).task_id;
5006
5007 l_RetainedAmtTab.DELETE;
5008 get_retained_amount(
5009 p_project_id => p_project_id,
5010 p_task_id => l_PrvInvTskId,
5011 p_draft_inv_num => p_draft_inv_num,
5012 x_RetainedAmtTab => l_RetainedAmtTab,
5013 x_return_status => l_return_status,
5014 x_msg_count => l_msg_count,
5015 x_msg_data => l_msg_data);
5016 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5017
5018 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5019
5020 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
5021
5022 RAISE FND_API.G_EXC_ERROR;
5023
5024 END IF;
5025
5026 END IF; /* l_PrvInvTskId <> p_InvTab(i).task_id */
5027 IF l_RetainedAmtTab.EXISTS(l_SobId) THEN
5028 l_RetainedAmtPFC := nvl(l_RetainedAmtTab(l_SobID).projfunc_retained_amount,0);
5029 l_RetainedAmtFC := nvl(l_RetainedAmtTab(l_SobID).funding_retained_amount,0);
5030
5031 END IF;
5032
5033 /* In order to get net amount retained amount should be subtracted from standard
5034 amount. In ERDL/DII/RDL it is stored as positive amount */
5035
5036 l_NetAmtPFC := p_InvTab(i).projfunc_bill_amount - l_RetainedAmtPFC;
5037 l_NetAmtFC := p_InvTab(i).funding_bill_amount - l_RetainedAmtFC;
5038
5039 ELSE /* p_TaskFund_ProjRetn_Flag = 'N' */
5040
5041 /* In order to get net amount retained amount should be subtracted from standard
5042 amount. As this is a retention line in draft invoice items, it is stored as
5043 negative amount. Hence adding here */
5044
5045 l_NetAmtPFC := p_InvTab(i).projfunc_bill_amount + p_InvTab(i).projfunc_retn_amount;
5046 l_NetAmtFC := p_InvTab(i).funding_bill_amount + p_InvTab(i).funding_retn_amount;
5047
5048 END IF ; /* IF p_TaskFund_ProjRetn_Flag = 'Y' */
5049
5050 IF G_DEBUG_MODE = 'Y' THEN
5051
5052 l_LogMsg := 'Net Amt PFC:' || round(l_NetAmtPFC,5) ||
5053 ' Net Amt FC:' || round(l_NetAmtFC,5);
5054
5055 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5056
5057 END IF;
5058
5059 /*
5060 l_ProApplAmtFc := (l_ARApplAmtFC/l_InvTotTab(l_SobId).funding_bill_amount )*
5061 p_InvTab(i).funding_bill_amount;
5062 l_ProApplAmtPFC := (l_ARApplAmtPFC/l_InvTotTab(l_SobId).projfunc_bill_amount )*
5063 p_InvTab(i).projfunc_bill_amount;
5064 */
5065 l_ProApplAmtFC := (l_ARApplAmtFC/l_InvTotTab(l_SobId).funding_bill_amount )* l_NetAmtFC;
5066 l_ProApplAmtPFC := (l_ARApplAmtPFC/l_InvTotTab(l_SobId).projfunc_bill_amount )* l_NetAmtPFC;
5067 l_ProArAdjAmtFC := (l_ArAdjAmtFC/l_InvTotTab(l_SobId).funding_bill_amount )* l_NetAmtFC; /* Added for bug 7237486 */
5068 l_ProArAdjAmtPFC := (l_ArAdjAmtPFC/l_InvTotTab(l_SobId).projfunc_bill_amount )* l_NetAmtPFC; /* Added for bug 7237486 */
5069 l_ProGainAmtPFC := (l_ARGainAmtPFC/l_ARApplAmtPFC)* l_ProApplAmtPFC;
5070 l_ProLossAmtPFC := (l_ARLossAmtPFC/l_ARApplAmtPFC)* l_ProApplAmtPFC;
5071
5072 END IF; /* IF l_ARApplAmtPFC <> 0 */
5073
5074 IF p_Invoice_Type = 'REGULAR-TASK' THEN /* Task level Normal invoice */
5075
5076 /* Billed amounts in different currencies */
5077 l_BillAmtIPC := p_InvTab(i).amount;
5078 l_BillAmtPFC := p_InvTab(i).projfunc_bill_amount;
5079 l_BillAmtFC := p_InvTab(i).funding_bill_amount;
5080
5081 /* Due amount is difference in billed amount and paid amount (prorated in case of task level funding) */
5082
5083 l_DueAmtFC := l_BillAmtFC - l_ProApplAmtFC + l_ProArAdjAmtFC; /* Added for bug 7237486 */
5084 l_ApplAmtFC := l_ProApplAmtFC;
5085
5086 l_DueAmtPFC := l_BillAmtPFC - l_ProApplAmtPFC + l_ProArAdjAmtPFC; /* Added for bug 7237486 */
5087 l_ApplAmtPFC := l_ProApplAmtPFC;
5088
5089 l_GainAmtPFC := l_ProGainAmtPFC;
5090 l_LossAmtPFC := l_ProLossAmtPFC;
5091
5092 /* If task level funding and project level retention, appllied amounts for retention invoices
5093 are already cached in G_RetnApplAmtTab. This will also be adjusted againt each invoice if
5094 it has retention amounts. The retained amount will be adjusted only if the invoice status
5095 is accepted in AR */
5096
5097 IF p_TaskFund_ProjRetn_Flag = 'Y' AND p_invoice_status = 'A' THEN
5098
5099
5100 IF l_RetainedAmtTab.EXISTS(l_SobId) THEN
5101
5102 l_RetainedAmtPFC := nvl(l_RetainedAmtTab(l_SobID).projfunc_retained_amount,0);
5103 l_RetainedAmtFC := nvl(l_RetainedAmtTab(l_SobID).funding_retained_amount,0);
5104
5105 IF l_RetainedAmtPFC <> 0 THEN /* only if the invoice/task has any retained amount */
5106
5107 adjust_appl_amount (
5108 p_project_id => p_project_id,
5109 p_agreement_id => p_agreement_id,
5110 p_SobId => l_SobId,
5111 p_retained_amount_pfc => l_RetainedAmtPFC,
5112 p_retained_amount_fc => l_RetainedAmtFC,
5113 x_retn_appl_amt_pfc => l_RetnApplAmtPFC ,
5114 x_retn_appl_amt_fc => l_RetnApplAmtFC,
5115 x_retn_Gain_amt_pfc => l_RetnGainAmtPFC ,
5116 x_retn_Loss_amt_Pfc => l_RetnLossAmtPFC,
5117 x_return_status => l_return_status,
5118 x_msg_count => l_msg_count,
5119 x_msg_data => l_msg_data);
5120
5121 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5122
5123 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5124
5125 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
5126
5127 RAISE FND_API.G_EXC_ERROR;
5128
5129 END IF;
5130
5131 /* Since due amount also has retention amount, when retention amount is paid
5132 deduct from due amount and add it to applied amount */
5133
5134 l_DueAmtFC := l_DueAmtFC - l_RetnApplAmtFC;
5135 l_ApplAmtFC := l_ApplAmtFC + l_RetnApplAmtFC;
5136
5137 l_DueAmtPFC := l_DueAmtPFC - l_RetnApplAmtPFC;
5138 l_ApplAmtPFC := l_ApplAmtPFC + l_RetnApplAmtPFC;
5139
5140 l_GainAmtPFC := l_GainAmtPFC + l_RetnGainAmtPFC;
5141 l_LossAmtPFC := l_LossAmtPFC + l_RetnLossAmtPFC;
5142
5143 END IF; /* l_RetainedAmtPFC <> 0 */
5144
5145 END IF; /*l_RetainedAmtTab.EXISTS(l_SobId) */
5146
5147 END IF; /* p_TaskFund_ProjRetn_Flag = 'Y'*/
5148
5149 ELSIF p_Invoice_Type = 'RETENTION-TASK' THEN
5150
5151 /* This will get executed only for task level funding with task level retention
5152 Since the billed amounts are already accounted when the regular invoice
5153 holding the retention is processed, here it is 0*/
5154
5155 l_BillAmtIPC := 0;
5156 l_BillAmtPFC := 0;
5157 l_BillAmtFC := 0;
5158
5159 l_DueAmtFC := 0 - l_ProApplAmtFC;
5160 l_ApplAmtFC := l_ProApplAmtFC;
5161
5162 l_DueAmtPFC := 0 - l_ProApplAmtPFC;
5163 l_ApplAmtPFC := l_ProApplAmtPFC;
5164
5165 l_GainAmtPFC := l_ProGainAmtPFC;
5166 l_LossAmtPFC := l_ProLossAmtPFC;
5167
5168 END IF ;/* p_Invoice_Type = 'REGULAR-TASK' */
5169
5170 /* Bug 3221279 - Start */
5171
5172
5173 /* Commented for bug 3569699
5174 /* Changed the Index for l_ArAmtsTab,G_SobListTab and p_InvTab for bug 3555798
5175 IF l_ArAmtsTab.EXISTS(l_SobId) THEN
5176 l_ITC_due_amount := (p_InvTab(i).inv_amount-l_ARAmtsTab(l_SobId).inv_applied_amount);
5177 ELSE
5178 l_ITC_due_amount := p_InvTab(i).inv_amount;
5179 END IF; /*l_ArAmtsTab.EXISTS(l_SobIdIdx)
5180 */
5181
5182 /* IF condition added for Bug 3569699 */
5183 IF p_InvTab(i).funding_bill_amount <> 0 THEN
5184 l_ITC_due_amount := pa_currency.round_trans_currency_amt(
5185 (l_DueAmtFC * (p_InvTab(i).inv_amount / p_InvTab(i).funding_bill_amount)),p_InvTab(i).inv_currency_code);
5186 ELSE
5187 l_ITC_due_amount:= 0;
5188 END IF;
5189
5190 IF G_DEBUG_MODE = 'Y' THEN
5191 l_LogMsg := 'original inv due amount : p_InvTab(i).inv_amount ' || p_InvTab(i).inv_amount;
5192 IF l_ArAmtsTab.EXISTS(l_SobId) THEN
5193 l_LogMsg:=l_LogMsg||'original inv due amount : l_ARAmtsTab(l_SobId).inv_applied_amount: ' ||l_ARAmtsTab(l_SobId).inv_applied_amount;
5194 ELSE
5195 l_LogMsg:=l_LogMsg||'original inv due amount : l_ARAmtsTab(l_SobId).inv_applied_amount: 0';
5196 END IF;
5197 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5198 l_LogMsg := 'New inv due amount : p_InvTab(i).inv_amount ' || p_InvTab(i).inv_amount;
5199 l_LogMsg := l_LogMsg || 'New inv due amount : p_InvTab(i).funding_bill_amount ' || p_InvTab(i).funding_bill_amount;
5200 l_LogMsg := l_LogMsg || 'New inv due amount : l_DueAmtFC ' || l_DueAmtFC;
5201 l_LogMsg := l_LogMsg || 'New inv due amount : ' || l_ITC_due_amount ;
5202 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5203 l_LogMsg := ' '; /* Bug 4346765 */
5204 END IF;
5205
5206 i_conversion_type_tab.DELETE;
5207 i_to_currency_tab.DELETE;
5208 i_from_currency_tab.DELETE;
5209 i_amount_tab.DELETE;
5210 i_user_validate_flag_tab.DELETE;
5211 i_converted_amount_tab.DELETE;
5212 i_denominator_tab.DELETE;
5213 i_numerator_tab.DELETE;
5214 i_rate_tab.DELETE;
5215 i_status_tab.DELETE;
5216
5217
5218 /* Populating to get rate for conversion from funding to projfunc currency
5219 The amount is passed as 1 because only the rate is required to pass it to client extension */
5220 IF p_InvTab(i).inv_currency_code <> nvl(G_SobListTab(l_SobId).ReportingCurrencyCode,
5221 p_InvTab(i).projfunc_currency_code) then
5222 i_from_currency_tab(1) := p_InvTab(i).inv_currency_code;
5223 i_to_currency_tab(1) := nvl(G_SobListTab(l_SobId).ReportingCurrencyCode, p_InvTab(i).projfunc_currency_code);
5224 i_conversion_date_tab(1) := G_RATE_DATE;
5225 i_conversion_type_tab(1) := nvl(G_SobListTab(l_SobId).ConversionType,i_ProjfuncRateType);
5226 i_amount_tab(1) := 1;
5227 i_user_validate_flag_tab(1) := 'Y';
5228 i_converted_amount_tab(1) := 0;
5229 i_denominator_tab(1) := 0;
5230 i_numerator_tab(1) := 0;
5231 i_rate_tab(1) := 0;
5232 i_conversion_between:= 'IC_PFC';
5233
5234
5235 PA_MULTI_CURRENCY_BILLING.convert_amount_bulk (
5236 p_from_currency_tab => i_from_currency_tab,
5237 p_to_currency_tab => i_to_currency_tab,
5238 p_conversion_date_tab => i_conversion_date_tab,
5239 p_conversion_type_tab => i_conversion_type_tab,
5240 p_amount_tab => i_amount_tab,
5241 p_user_validate_flag_tab => i_user_validate_flag_tab,
5242 p_converted_amount_tab => i_converted_amount_tab,
5243 p_denominator_tab => i_denominator_tab,
5244 p_numerator_tab => i_numerator_tab,
5245 p_rate_tab => i_rate_tab,
5246 x_status_tab => i_status_tab,
5247 p_conversion_between => i_conversion_between,
5248 p_cache_flag => 'Y');
5249
5250 IF (i_status_tab(1) <> 'N') THEN
5251
5252 ROLLBACK;
5253
5254 --l_msg_data := l_status_tab(1);
5255 l_return_status := FND_API.G_RET_STS_ERROR;
5256
5257 /* Stamp rejection reason in PA_SPF */
5258 insert_rejection_reason_spf (
5259 p_project_id => G_ProjLvlGlobRec.project_id,
5260 p_agreement_id => p_agreement_id,
5261 p_task_id => p_task_id,
5262 p_reason_code => i_status_tab(1),
5263 x_return_status => l_return_status,
5264 x_msg_count => l_msg_count,
5265 x_msg_data => l_msg_data) ;
5266
5267 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5268
5269 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5270
5271 ELSE /* l_return_status = FND_API.G_RET_STS_UNEXP_ERROR */
5272
5273 l_msg_data := i_status_tab(1);
5274 l_return_status := FND_API.G_RET_STS_ERROR;
5275
5276 RAISE FND_API.G_EXC_ERROR;
5277
5278 END IF; /* l_return_status = FND_API.G_RET_STS_UNEXP_ERROR */
5279 END IF; /* i_status_tab(1) <> 'N' */
5280 l_revald_pf_inv_due_amount := l_ITC_due_amount*i_rate_tab(1);
5281
5282 l_LogMsg := 'Inv currency code :' || p_InvTab(i).inv_currency_code;
5283 l_LogMsg := l_LogMsg || ' to currency : ' || p_InvTab(i).projfunc_currency_code ;
5284 l_LogMsg := l_LogMsg || 'l_ITC_due_amount :' || l_ITC_due_amount || 'projfunc_rate_type :' || i_ProjfuncRateType;
5285 l_LogMsg := l_LogMsg || 'projfunc_inv_rate after calling amount_bulk :' || i_rate_tab(1);
5286 l_LogMsg := l_LogMsg || 'projfunc_inv_duie amount after assigning :' || l_revald_pf_inv_due_amount ;
5287 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5288 l_LogMsg := ' '; /* Bug 4346765 */
5289
5290 ELSE
5291 l_revald_pf_inv_due_amount := l_ITC_due_amount;
5292
5293 l_LogMsg := l_LogMsg || 'l_ITC_due_amount :' || l_ITC_due_amount || 'projfunc_rate_type :' || i_ProjfuncRateType;
5294 l_LogMsg := l_LogMsg || 'projfunc_inv_due amount after assigning :' || l_revald_pf_inv_due_amount ;
5295 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5296 l_LogMsg := ' '; /* Bug 4346765 */
5297 END IF; /* if IC<>PFC */
5298 /* Bug 3221279 - End */
5299
5300
5301 /* Put in g_InvCompTab
5302 Since invoices are processed only once for an agreement (even though agreement funds multiple tasks)
5303 this table will have summary amounts of each agreement-task funding record for primary and reproting
5304 set of books. So it is not indexed by sob_id as like other tables
5305 */
5306 l_FoundFlag := 'N';
5307 IF G_InvCompTab.count > 0 THEN
5308 FOR j in G_InvCompTab.first..G_InvCompTab.LAST LOOP
5309
5310 IF G_InvCompTab(j).set_of_books_id = l_SobID and
5311 G_InvCompTab(j).task_id = p_InvTab(i).task_id THEN
5312
5313
5314 G_InvCompTab(j).invproc_billed_amount :=
5315 nvl(G_InvCompTab(j).invproc_billed_amount,0) + l_BillAmtIPC;
5316 G_InvCompTab(j).funding_billed_amount :=
5317 nvl(G_InvCompTab(j).funding_billed_amount,0) + l_BillAmtFC;
5318 G_InvCompTab(j).projfunc_billed_amount :=
5319 nvl(G_InvCompTab(j).projfunc_billed_amount,0) + l_BillAmtPFC;
5320 G_InvCompTab(j).funding_applied_amount :=
5321 nvl(G_InvCompTab(j).funding_applied_amount,0) + l_ApplAmtFC;
5322 G_InvCompTab(j).projfunc_applied_amount :=
5323 nvl(G_InvCompTab(j).projfunc_applied_amount,0) + l_ApplAmtPFC;
5324 G_InvCompTab(j).projfunc_gain_amount :=
5325 nvl(G_InvCompTab(j).projfunc_gain_amount,0) + l_GainAmtPFC;
5326 G_InvCompTab(j).projfunc_loss_amount :=
5327 nvl(G_InvCompTab(j).projfunc_loss_amount,0) + l_LossAmtPFC;
5328 G_InvCompTab(j).revald_pf_inv_due_amount :=
5329 nvl(G_InvCompTab(j).revald_pf_inv_due_amount,0) + l_revald_pf_inv_due_amount; /* Bug 3221279 */
5330 G_InvCompTab(j).funding_adjusted_amount :=
5331 nvl(G_InvCompTab(j).funding_adjusted_amount,0) + l_ArAdjAmtFC; /* Added for bug 7237486 */
5332 G_InvCompTab(j).projfunc_adjusted_amount :=
5333 nvl(G_InvCompTab(j).projfunc_adjusted_amount,0) + l_ArAdjAmtPFC; /* Added for bug 7237486 */
5334 l_FoundFlag := 'Y';
5335
5336 EXIT;
5337 END IF;
5338
5339 END LOOP;
5340
5341 END IF;
5342
5343 IF l_foundFlag = 'N' THEN
5344
5345 l_index := G_InvCompTab.Count + 1;
5346
5347 G_InvCompTab(l_index).project_id := p_project_id;
5348 G_InvCompTab(l_index).agreement_id := p_agreement_id;
5349 G_InvCompTab(l_index).task_id := p_InvTab(i).task_id;
5350 G_InvCompTab(l_index).set_of_books_id := l_SobId;
5351 G_InvCompTab(l_index).invproc_billed_amount := l_BillAmtIPC;
5352 G_InvCompTab(l_index).funding_billed_amount := l_BillAmtFC;
5353 G_InvCompTab(l_index).projfunc_billed_amount := l_BillAmtPFC;
5354 G_InvCompTab(l_index).funding_applied_amount := l_ApplAmtFC;
5355 G_InvCompTab(l_index).projfunc_applied_amount := l_ApplAmtPFC;
5356 G_InvCompTab(l_index).projfunc_gain_amount := l_GainAmtPFC;
5357 G_InvCompTab(l_index).projfunc_loss_amount := l_LossAmtPFC;
5358 G_InvCompTab(l_index).revald_pf_inv_due_amount:= l_revald_pf_inv_due_amount; /* Bug 3221279 */
5359 G_InvCompTab(l_index).funding_adjusted_amount := l_ArAdjAmtFC; /* Added for bug 7237486*/
5360 G_InvCompTab(l_index).projfunc_adjusted_amount := l_ArAdjAmtPFC; /* Added for bug 7237486 */
5361 END IF;
5362
5363 IF G_DEBUG_MODE = 'Y' THEN
5364
5365 l_LogMsg := 'Billed Amt PFC:' || l_BillAmtPFC ||
5366 ' Billed Amt FC:' || l_BillAmtFC ||
5367 ' Billed Amt IPC:' || l_BillAmtIPC ;
5368 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5369
5370 l_LogMsg := 'Appl Amt FC:' || round(l_ApplAmtFC,5) ||
5371 ' Appl Amt PFC:' || round(l_ApplAmtPFC,5) ||
5372 ' Gain Amt PFC:' || round(l_GainAmtPFC,5) ||
5373 ' Loss Amt PFC:' || round(l_LossAmtPFC,5) ;
5374 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5375
5376 END IF;
5377
5378 END LOOP;
5379
5380 ELSE /* project level funding */
5381
5382 IF G_DEBUG_MODE = 'Y' THEN
5383
5384 l_LogMsg:= 'Project level funding ' ;
5385 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5386
5387 END IF;
5388
5389 l_SobIdIdx := G_SobListTab.FIRST;
5390
5391 LOOP
5392
5393 EXIT WHEN l_SobIdIdx IS NULL;
5394
5395 l_BillAmtITC := 0;
5396 l_BillAmtFC := 0;
5397
5398 l_BillAmtIPC := 0;
5399 l_BillAmtPFC := 0;
5400 l_ApplAmtFC := 0;
5401 l_ApplAmtPFC := 0;
5402 l_DueAmtFC := 0;
5403 l_DueAmtPFC := 0;
5404 l_GainAmtPFC := 0;
5405 l_LossAmtPFC := 0;
5406
5407 l_ARApplAmtFC := 0;
5408 l_ARApplAmtPFC := 0;
5409 l_ARGainAmtPFC := 0;
5410 l_ARLossAmtPFC := 0;
5411 /* Added for bug 7237486 */
5412 l_ArAdjAmtPFC := 0;
5413 l_ArAdjAmtFC := 0;
5414 /* Added for bug 7237486 */
5415 l_ErrorStatus := '';
5416
5417 IF G_DEBUG_MODE = 'Y' THEN
5418
5419 l_LogMsg := ' ' ;
5420 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
5421
5422 l_LogMsg := 'Sob Id:' || l_SobIdIdx ;
5423 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
5424
5425 l_LogMsg := '==================';
5426 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
5427
5428 END IF;
5429
5430 IF l_ArAmtsTab.EXISTS(l_SobIdIdx) THEN
5431
5432 /* If funding currency and invoice currency are different
5433 prorate the AR amounts for funding currency */
5434
5435 IF p_InvTab(l_SobIdIdx).inv_currency_code <> p_InvTab(l_SobIdIdx).funding_currency_code THEN
5436
5437 IF p_InvTab(l_SobIdIdx).funding_currency_code =
5438 p_InvTab(l_SobIdIdx).projfunc_currency_code THEN
5439
5440 IF G_DEBUG_MODE = 'Y' THEN
5441
5442 l_LogMsg := ' FC and ITC are different, but = PFC - assigning';
5443 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
5444
5445 END IF;
5446
5447 l_ARApplAmtFC := l_ArAmtsTab(l_SobIdIdx).projfunc_applied_amount;
5448 l_ArAdjAmtFC := l_ArAmtsTab(l_SobIdIdx).projfunc_adjusted_amount; /* Added for bug 7237486 */
5449
5450 IF G_DEBUG_MODE = 'Y' THEN
5451
5452 l_LogMsg := ' AR Adjusted amount in FC = '||l_ArAdjAmtFC; /* Added for bug 7237486 */
5453 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
5454
5455 END IF;/* Added for bug 7237486 */
5456
5457 ELSE
5458
5459 l_BillAmtITC := p_InvTab(l_SobIdIdx).inv_amount;
5460 l_BillAmtFC := p_InvTab(l_SobIdIdx).funding_bill_amount;
5461
5462 IF l_BillAmtITC <> 0 THEN /* Added for Debug checkin 3547687 */
5463 l_ARApplAmtFC := (l_ARAmtsTab(l_SobIdIdx).inv_applied_amount / l_BillAmtITC) *
5464 l_BillAmtFC;
5465 l_ArAdjAmtFC := (l_ARAmtsTab(l_SobIdIdx).inv_adjusted_amount / l_BillAmtITC) *
5466 l_BillAmtFC; /* Added for bug 7237486 */
5467 ELSE
5468 l_ARApplAmtFC := 0;
5469 l_ArAdjAmtFC := 0; /* Added for bug 7237486 */
5470 END IF;
5471
5472 IF G_DEBUG_MODE = 'Y' THEN
5473
5474 l_LogMsg := 'FC and ITC are different - Prorating' ||
5475 'Appl amt ITC:' || l_ARAmtsTab(l_SobIdIdx).inv_applied_amount ||
5476 'Bill amt ITC:' || l_BillAmtITC ||
5477 'Bill amt FC:' || l_BillAmtFC;
5478
5479 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5480
5481 END IF;
5482
5483 END IF;
5484 ELSE
5485
5486 l_ARApplAmtFC := l_ArAmtsTab(l_SobIdIdx).inv_applied_amount;
5487 l_ArAdjAmtFC := l_ArAmtsTab(l_SobIdIdx).inv_adjusted_amount; /* Added for bug 7237486 */
5488
5489 END IF;
5490
5491 l_ARApplAmtPFC := l_ArAmtsTab(l_SobIdIdx).projfunc_applied_amount;
5492 l_ARGainAmtPFC := l_ArAmtsTab(l_SobIdIdx).projfunc_gain_amount;
5493 l_ARLossAmtPFC := l_ArAmtsTab(l_SobIdIdx).projfunc_loss_amount;
5494 l_ArAdjAmtPFC := l_ArAmtsTab(l_SobIdIdx).projfunc_adjusted_amount; /* Added for bug 7237486 */
5495
5496 IF G_DEBUG_MODE = 'Y' THEN
5497
5498 l_LogMsg := ' AR Adjusted amount in PFC = '||l_ArAdjAmtPFC; /* Added for bug 7237486 */
5499 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
5500
5501 END IF;
5502
5503 END IF; /*l_ArAmtsTab.EXISTS(l_SobIdIdx) */
5504
5505 IF p_Invoice_Type = 'REGULAR-PROJ' THEN
5506
5507 l_BillAmtIPC := p_InvTab(l_SobIdIdx).amount;
5508
5509 l_BillAmtPFC := p_InvTab(l_SobIdIdx).projfunc_bill_amount;
5510 l_BillAmtFC := p_InvTab(l_SobIdIdx).funding_bill_amount;
5511
5512 l_DueAmtFC := l_BillAmtFC - l_ARApplAmtFC + l_ArAdjAmtFC; /* Added for bug 7237486 */
5513 l_ApplAmtFC := l_ARApplAmtFC;
5514
5515 l_DueAmtPFC := l_BillAmtPFC - l_ARApplAmtPFC + l_ArAdjAmtPFC; /* Added for bug 7237486 */
5516 l_ApplAmtPFC := l_ARApplAmtPFC;
5517
5518 l_GainAmtPFC := l_ARGainAmtPFC;
5519 l_LossAmtPFC := l_ARLossAmtPFC;
5520
5521 ELSIF p_Invoice_Type = 'RETENTION-PROJ' THEN
5522
5523 l_BillAmtIPC := 0;
5524 l_BillAmtPFC := 0;
5525 l_BillAmtFC := 0;
5526
5527 l_DueAmtFC := - l_ARApplAmtFC;
5528 l_ApplAmtFC := l_ARApplAmtFC;
5529
5530 l_DueAmtPFC := - l_ARApplAmtPFC;
5531 l_ApplAmtPFC := l_ARApplAmtPFC;
5532
5533 l_GainAmtPFC := l_ARGainAmtPFC;
5534 l_LossAmtPFC := l_ARLossAmtPFC;
5535
5536 END IF; /* InvoiceType */
5537
5538 /* Put in g_InvCompTab */
5539
5540 /* Commented for bug 2731637 as this tab should be indexed by seq no and not sob id and rewritten below
5541
5542 IF G_InvCompTab.EXISTS(l_SobIdIdx) THEN
5543
5544 IF G_DEBUG_MODE = 'Y' THEN
5545
5546 l_LogMsg := ' Proje level ' || l_SobIdIdx || ' already exists adding';
5547 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5548
5549 END IF;
5550
5551 G_InvCompTab(l_SobIdIdx).invproc_billed_amount :=
5552 nvl(G_InvCompTab(l_SobIdIdx).invproc_billed_amount,0) + l_BillAmtIPC;
5553
5554 G_InvCompTab(l_SobIdIdx).funding_billed_amount :=
5555 nvl(G_InvCompTab(l_SobIdIdx).funding_billed_amount,0) + l_BillAmtFC;
5556 G_InvCompTab(l_SobIdIdx).projfunc_billed_amount :=
5557 nvl(G_InvCompTab(l_SobIdIdx).projfunc_billed_amount,0) + l_BillAmtPFC;
5558 G_InvCompTab(l_SobIdIdx).funding_applied_amount :=
5559 nvl(G_InvCompTab(l_SobIdIdx).funding_applied_amount,0) + l_ApplAmtFC;
5560 G_InvCompTab(l_SobIdIdx).projfunc_applied_amount :=
5561 nvl(G_InvCompTab(l_SobIdIdx).projfunc_applied_amount,0) + l_ApplAmtPFC;
5562 G_InvCompTab(l_SobIdIdx).projfunc_gain_amount :=
5563 nvl(G_InvCompTab(l_SobIdIdx).projfunc_gain_amount,0) + l_GainAmtPFC;
5564 G_InvCompTab(l_SobIdIdx).projfunc_loss_amount :=
5565 nvl(G_InvCompTab(l_SobIdIdx).projfunc_loss_amount,0) + l_LossAmtPFC;
5566
5567 ELSE
5568
5569 IF G_DEBUG_MODE = 'Y' THEN
5570
5571 l_LogMsg := ' Proje level ' || l_SobIdIdx || ' does not exists assigning';
5572 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5573
5574 END IF;
5575 G_InvCompTab(l_SobIdIdx).project_id := p_project_id;
5576 G_InvCompTab(l_SobIdIdx).agreement_id := p_agreement_id;
5577 G_InvCompTab(l_SobIdIdx).task_id := p_task_id;
5578 G_InvCompTab(l_SobIdIdx).set_of_books_id := l_SobIdIdx;
5579 G_InvCompTab(l_SobIdIdx).invproc_billed_amount := l_BillAmtIPC;
5580 G_InvCompTab(l_SobIdIdx).funding_billed_amount := l_BillAmtFC;
5581 G_InvCompTab(l_SobIdIdx).projfunc_billed_amount := l_BillAmtPFC;
5582 G_InvCompTab(l_SobIdIdx).funding_applied_amount := l_ApplAmtFC;
5583 G_InvCompTab(l_SobIdIdx).projfunc_applied_amount := l_ApplAmtPFC;
5584 G_InvCompTab(l_SobIdIdx).projfunc_gain_amount := l_GainAmtPFC;
5585 G_InvCompTab(l_SobIdIdx).projfunc_loss_amount := l_LossAmtPFC;
5586 END IF;
5587 */
5588
5589 /*Bug 3221279 - Start */
5590
5591 /* Commented for Bug 3569699
5592 IF l_ArAmtsTab.EXISTS(l_SobIdIdx) THEN
5593 l_ITC_due_amount := (p_InvTab(l_SobIdIdx).inv_amount-l_ARAmtsTab(l_SobIdIdx).inv_applied_amount);
5594 ELSE
5595 l_ITC_due_amount := p_InvTab(l_SobIdIdx).inv_amount;
5596 END IF; /*l_ArAmtsTab.EXISTS(l_SobIdIdx)
5597 */
5598
5599 /* IF condition added for Bug 3569699 */
5600
5601 IF p_InvTab(l_SobIdIdx).funding_bill_amount <> 0 THEN
5602 l_ITC_due_amount := pa_currency.round_trans_currency_amt(
5603 (l_DueAmtFC * (p_InvTab(l_SobIdIdx).inv_amount / p_InvTab(l_SobIdIdx).funding_bill_amount)),
5604 p_InvTab(l_SobIdIdx).inv_currency_code);
5605 ELSE
5606 l_ITC_due_amount:= 0;
5607 END IF;
5608
5609
5610 IF G_DEBUG_MODE = 'Y' THEN
5611 l_LogMsg := 'original inv due amount : p_InvTab(l_SobIdIdx).inv_amount ' || p_InvTab(l_SobIdIdx).inv_amount;
5612 IF l_ArAmtsTab.EXISTS(l_SobIdIdx) THEN
5613 l_LogMsg:=l_LogMsg||'original inv due amount : l_ARAmtsTab(l_SobIdIdx).inv_applied_amount: ' ||l_ARAmtsTab(l_SobIdIdx).inv_applied_amount;
5614 ELSE
5615 l_LogMsg:=l_LogMsg||'original inv due amount : l_ARAmtsTab(l_SobId).inv_applied_amount: 0';
5616 END IF;
5617 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5618 l_LogMsg := 'New inv due amount : p_InvTab(l_SobIdIdx).inv_amount ' || p_InvTab(l_SobIdIdx).inv_amount;
5619 l_LogMsg := l_LogMsg || 'New inv due amount : p_InvTab(l_SobIdIdx).funding_bill_amount ' || p_InvTab(l_SobIdIdx).funding_bill_amount;
5620 l_LogMsg := l_LogMsg || 'New inv due amount : l_DueAmtFC ' || l_DueAmtFC;
5621 l_LogMsg := l_LogMsg || 'New inv due amount : ' || l_ITC_due_amount ;
5622 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5623 l_LogMsg := ' '; /* Bug 4346765 */
5624 END IF;
5625
5626 i_conversion_type_tab.DELETE;
5627 i_to_currency_tab.DELETE;
5628 i_from_currency_tab.DELETE;
5629 i_amount_tab.DELETE;
5630 i_user_validate_flag_tab.DELETE;
5631 i_converted_amount_tab.DELETE;
5632 i_denominator_tab.DELETE;
5633 i_numerator_tab.DELETE;
5634 i_rate_tab.DELETE;
5635 i_status_tab.DELETE;
5636
5637 /* Populating to get rate for conversion from funding to projfunc currency
5638 The amount is passed as 1 because only the rate is required to pass it to client extension */
5639 if p_InvTab(l_SobIdIdx).inv_currency_code <> nvl(G_SobListTab(l_SobIdIdx).ReportingCurrencyCode,
5640 p_InvTab(l_SobIdIdx).projfunc_currency_code) then
5641
5642 i_from_currency_tab(1) := p_InvTab(l_SobIdIdx).inv_currency_code;
5643 i_to_currency_tab(1) := nvl(G_SobListTab(l_SobIdIdx).ReportingCurrencyCode, p_InvTab(l_SobIdIdx).projfunc_currency_code);
5644 i_conversion_date_tab(1) := G_RATE_DATE;
5645 i_conversion_type_tab(1) := nvl(G_SobListTab(l_SobIdIdx).ConversionType,i_ProjfuncRateType);
5646 i_amount_tab(1) := 1;
5647 i_user_validate_flag_tab(1) := 'Y';
5648 i_converted_amount_tab(1) := 0;
5649 i_denominator_tab(1) := 0;
5650 i_numerator_tab(1) := 0;
5651 i_rate_tab(1) := 0;
5652 i_conversion_between:= 'IC_PFC';
5653
5654 PA_MULTI_CURRENCY_BILLING.convert_amount_bulk (
5655 p_from_currency_tab => i_from_currency_tab,
5656 p_to_currency_tab => i_to_currency_tab,
5657 p_conversion_date_tab => i_conversion_date_tab,
5658 p_conversion_type_tab => i_conversion_type_tab,
5659 p_amount_tab => i_amount_tab,
5660 p_user_validate_flag_tab => i_user_validate_flag_tab,
5661 p_converted_amount_tab => i_converted_amount_tab,
5662 p_denominator_tab => i_denominator_tab,
5663 p_numerator_tab => i_numerator_tab,
5664 p_rate_tab => i_rate_tab,
5665 x_status_tab => i_status_tab,
5666 p_conversion_between => i_conversion_between,
5667 p_cache_flag => 'Y');
5668
5669 IF (i_status_tab(1) <> 'N') THEN
5670
5671 ROLLBACK;
5672
5673 --l_msg_data := l_status_tab(1);
5674 l_return_status := FND_API.G_RET_STS_ERROR;
5675
5676 /* Stamp rejection reason in PA_SPF */
5677 insert_rejection_reason_spf (
5678 p_project_id => G_ProjLvlGlobRec.project_id,
5679 p_agreement_id => p_agreement_id,
5680 p_task_id => p_task_id,
5681 p_reason_code => i_status_tab(1),
5682 x_return_status => l_return_status,
5683 x_msg_count => l_msg_count,
5684 x_msg_data => l_msg_data) ;
5685
5686 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5687
5688 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5689
5690 ELSE /* l_return_status = FND_API.G_RET_STS_UNEXP_ERROR */
5691
5692 l_msg_data := i_status_tab(1);
5693 l_return_status := FND_API.G_RET_STS_ERROR;
5694
5695 RAISE FND_API.G_EXC_ERROR;
5696
5697 END IF; /* l_return_status = FND_API.G_RET_STS_UNEXP_ERROR */
5698 END IF; /* i_status_tab(1) <> 'N' */
5699
5700 l_revald_pf_inv_due_amount := l_ITC_due_amount*i_rate_tab(1);
5701
5702 l_LogMsg := 'Inv currency code :' || p_InvTab(l_SobIdIdx).inv_currency_code ;
5703 l_LogMsg := l_LogMsg || ' to currency : ' || p_InvTab(l_SobIdIdx).projfunc_currency_code ;
5704 l_LogMsg := l_LogMsg || 'l_ITC_due_amount :' || l_ITC_due_amount || 'projfunc_rate_type :' || i_ProjfuncRateType;
5705 l_LogMsg := l_LogMsg || 'projfunc_inv_rate after calling amount_bulk :' || i_rate_tab(1);
5706 l_LogMsg := l_LogMsg || 'projfunc_inv_due amount after assigning :' || l_revald_pf_inv_due_amount ;
5707 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5708 l_LogMsg := ' '; /* Bug 4346765 */
5709 ELSE
5710 l_revald_pf_inv_due_amount := l_ITC_due_amount;
5711
5712 l_LogMsg := 'Inv currency code :' || p_InvTab(l_SobIdIdx).inv_currency_code ;
5713 l_LogMsg := l_LogMsg || ' to currency : ' || p_InvTab(l_SobIdIdx).projfunc_currency_code ;
5714 l_LogMsg := l_LogMsg || 'l_ITC_due_amount :' || l_ITC_due_amount || 'projfunc_rate_type :' || i_ProjfuncRateType;
5715 l_LogMsg := l_LogMsg || 'projfunc_inv_due amount after assigning :' || l_revald_pf_inv_due_amount ;
5716 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5717 l_LogMsg := ' '; /* Bug 4346765 */
5718 END IF; /* if IC<>PFC */
5719
5720
5721 /* Bug 3221279 ends */
5722
5723
5724 l_FoundFlag := 'N';
5725 IF G_InvCompTab.count > 0 THEN
5726 FOR j in G_InvCompTab.first..G_InvCompTab.LAST LOOP
5727
5728 IF G_InvCompTab(j).set_of_books_id = l_SobIDIdx THEN
5729
5730 G_InvCompTab(j).invproc_billed_amount :=
5731 nvl(G_InvCompTab(j).invproc_billed_amount,0) + l_BillAmtIPC;
5732
5733 G_InvCompTab(j).funding_billed_amount :=
5734 nvl(G_InvCompTab(j).funding_billed_amount,0) + l_BillAmtFC;
5735
5736 G_InvCompTab(j).projfunc_billed_amount :=
5737 nvl(G_InvCompTab(j).projfunc_billed_amount,0) + l_BillAmtPFC;
5738
5739 G_InvCompTab(j).funding_applied_amount :=
5740 nvl(G_InvCompTab(j).funding_applied_amount,0) + l_ApplAmtFC;
5741
5742 G_InvCompTab(j).projfunc_applied_amount :=
5743 nvl(G_InvCompTab(j).projfunc_applied_amount,0) + l_ApplAmtPFC;
5744
5745 G_InvCompTab(j).projfunc_gain_amount :=
5746 nvl(G_InvCompTab(j).projfunc_gain_amount,0) + l_GainAmtPFC;
5747
5748 G_InvCompTab(j).projfunc_loss_amount :=
5749 nvl(G_InvCompTab(j).projfunc_loss_amount,0) + l_LossAmtPFC;
5750
5751 G_InvCompTab(j).revald_pf_inv_due_amount :=
5752 nvl(G_InvCompTab(j).revald_pf_inv_due_amount ,0) + l_revald_pf_inv_due_amount ; /* Bug 3221279 */
5753 G_InvCompTab(j).funding_adjusted_amount :=
5754 nvl(G_InvCompTab(j).funding_adjusted_amount,0) + l_ArAdjAmtFC; /* Added for bug 7237486 */
5755
5756 G_InvCompTab(j).projfunc_adjusted_amount :=
5757 nvl(G_InvCompTab(j).projfunc_adjusted_amount,0) + l_ArAdjAmtPFC; /* Added for bug 7237486 */
5758 l_FoundFlag := 'Y';
5759
5760 EXIT;
5761 END IF;
5762
5763 END LOOP;
5764
5765 END IF;
5766
5767 IF l_foundFlag = 'N' THEN
5768
5769 l_index := G_InvCompTab.Count + 1;
5770
5771 G_InvCompTab(l_index).project_id := p_project_id;
5772 G_InvCompTab(l_index).agreement_id := p_agreement_id;
5773 G_InvCompTab(l_index).task_id := p_task_id;
5774 G_InvCompTab(l_index).set_of_books_id := l_SobIdIdx;
5775 G_InvCompTab(l_index).invproc_billed_amount := l_BillAmtIPC;
5776 G_InvCompTab(l_index).funding_billed_amount := l_BillAmtFC;
5777 G_InvCompTab(l_index).projfunc_billed_amount := l_BillAmtPFC;
5778 G_InvCompTab(l_index).funding_applied_amount := l_ApplAmtFC;
5779 G_InvCompTab(l_index).projfunc_applied_amount := l_ApplAmtPFC;
5780 G_InvCompTab(l_index).projfunc_gain_amount := l_GainAmtPFC;
5781 G_InvCompTab(l_index).projfunc_loss_amount := l_LossAmtPFC;
5782 G_InvCompTab(l_index).revald_pf_inv_due_amount := l_revald_pf_inv_due_amount; /* 3221279 */
5783 G_InvCompTab(l_index).funding_adjusted_amount := l_ArAdjAmtFC; /* Added for bug 7237486 */
5784 G_InvCompTab(l_index).projfunc_adjusted_amount := l_ArAdjAmtPFC; /* Added for bug 7237486 */
5785 END IF;
5786 IF G_DEBUG_MODE = 'Y' THEN
5787
5788 l_LogMsg := 'Billed Amt PFC:' || l_BillAmtPFC ||
5789 ' Billed Amt FC:' || l_BillAmtFC ||
5790 ' Billed Amt IPC:' || l_BillAmtIPC ;
5791 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5792
5793 l_LogMsg := 'Appl Amt FC:' || round(l_ApplAmtFC,5) ||
5794 ' Appl Amt PFC:' || round(l_ApplAmtPFC,5) ||
5795 ' Gain Amt PFC:' || round(l_GainAmtPFC,5) ||
5796 ' Loss Amt PFC:' || round(l_LossAmtPFC,5) ;
5797 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5798
5799 END IF;
5800
5801 l_SobIdIdx := G_SobListTab.NEXT(l_SobIdIdx);
5802
5803
5804 END LOOP; /* l_SobIdIdx loop */
5805
5806 END IF; /* project level funding */
5807
5808 IF G_DEBUG_MODE = 'Y' THEN
5809
5810 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.derive_reval_components-----------' ;
5811 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
5812
5813 END IF;
5814
5815 EXCEPTION
5816
5817 WHEN FND_API.G_EXC_ERROR THEN
5818 x_return_status := l_return_status;
5819 x_msg_count := l_msg_count;
5820 x_msg_data := l_msg_data;
5821
5822 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5823 x_return_status := l_return_status;
5824 x_msg_count := l_msg_count;
5825 x_msg_data := l_msg_data;
5826
5827 WHEN OTHERS THEN
5828 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5829 x_msg_count := l_msg_count;
5830 x_msg_data := SUBSTR(SQLERRM,1,100);
5831
5832 IF G_DEBUG_MODE = 'Y' THEN
5833
5834 PA_DEBUG.g_err_stage := 'derive_reval_components:' || x_msg_data ;
5835 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
5836
5837 END IF;
5838
5839 END derive_reval_components;
5840
5841
5842 /*----------------------------------------------------------------------------------------+
5843 | Procedure : get_invoice_total |
5844 | Purpose : To get all amounts total for a given project/agreement/invoice |
5845 | Parameters : |
5846 | ================================================================================== |
5847 | Name Mode Description |
5848 | ================================================================================== |
5849 | p_project_id IN Project ID |
5850 | p_agreement_id IN Agreement_id |
5851 | p_draft_inv_num IN Draft invoice number that is being processed |
5852 | x_InvTotTab OUT Invoice total for the invoice of set_of_books |
5853 | x_return_status OUT Return status of this procedure |
5854 | x_msg_count OUT Error message count |
5855 | x_msg_data OUT Error message |
5856 | ================================================================================== |
5857 +----------------------------------------------------------------------------------------*/
5858
5859 PROCEDURE get_invoice_total(
5860 p_project_id IN NUMBER,
5861 p_agreement_id IN NUMBER,
5862 p_draft_inv_num IN NUMBER,
5863 x_InvTotTab OUT NOCOPY InvTotTabTyp,
5864 x_return_status OUT NOCOPY VARCHAR2,
5865 x_msg_count OUT NOCOPY NUMBER,
5866 x_msg_data OUT NOCOPY VARCHAR2) IS
5867
5868
5869 l_return_status VARCHAR2(30) := NULL;
5870 l_msg_count NUMBER := NULL;
5871 l_msg_data VARCHAR2(250) := NULL;
5872
5873 l_LogMsg VARCHAR2(250);
5874
5875 CURSOR get_inv_total IS
5876 SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
5877 sum(dii.amount) amount,
5878 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
5879 sum(dii.funding_bill_amount) funding_bill_amount,
5880 sum(dii.inv_amount) inv_amount
5881 FROM pa_draft_invoice_items dii
5882 WHERE dii.project_id = p_project_id
5883 AND dii.draft_invoice_num = p_draft_inv_num;
5884 --AND dii.invoice_line_type <> 'RETENTION';
5885
5886
5887 /* The following CURSOR is same as above but fetches for both primary and reporting set of books */
5888
5889 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
5890 new table gl_alc_ledger_rships_v and corresponding columns */
5891
5892 /* mrc migration to SLA bug 4571438
5893 CURSOR get_all_inv_total IS
5894 (SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
5895 sum(dii.amount) amount,
5896 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
5897 sum(dii.funding_bill_amount) funding_bill_amount,
5898 sum(dii.inv_amount) inv_amount
5899 FROM pa_draft_invoice_items dii
5900 WHERE dii.project_id = p_project_id
5901 AND dii.draft_invoice_num = p_draft_inv_num
5902 --AND dii.invoice_line_type <> 'RETENTION'
5903 UNION
5904 SELECT dii_mc.set_of_books_id set_of_books_id,
5905 sum(dii.amount) amount,
5906 sum(dii_mc.amount) projfunc_bill_amount,
5907 sum(dii.funding_bill_amount) funding_bill_amount,
5908 sum(dii.inv_amount) inv_amount
5909 FROM pa_mc_draft_inv_items dii_mc, pa_draft_invoice_items dii,
5910 gl_alc_ledger_rships_v rep, pa_implementations imp
5911 WHERE dii.project_id = p_project_id
5912 AND dii.draft_invoice_num = p_draft_inv_num
5913 -- AND dii.invoice_line_type <> 'RETENTION'
5914 AND rep.source_ledger_id = imp.set_of_books_id
5915 AND rep.relationship_enabled_flag = 'Y'
5916 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
5917 AND rep.application_id = 275
5918 AND dii_mc.set_of_books_id =rep.ledger_id
5919 AND dii_mc.project_id = dii.project_id
5920 AND dii_mc.draft_invoice_num = dii.draft_invoice_num
5921 AND dii_mc.line_num = dii.line_num
5922 GROUP BY dii_mc.set_of_books_id
5923 )
5924 ORDER by set_of_books_id; */
5925
5926 l_SetOfBookIdTab PA_PLSQL_DATATYPES.NumTabTyp;
5927 l_BillAmtIPCTab PA_PLSQL_DATATYPES.NumTabTyp;
5928 l_BillAmtPFCTab PA_PLSQL_DATATYPES.NumTabTyp;
5929 l_BillAmtFCTab PA_PLSQL_DATATYPES.NumTabTyp;
5930 l_BillAmtITCTab PA_PLSQL_DATATYPES.NumTabTyp;
5931 l_TotalFetch NUMBER := 0;
5932 l_ThisFetch NUMBER := 0;
5933 l_FetchSize NUMBER := 50;
5934
5935
5936 BEGIN
5937 x_return_status := FND_API.G_RET_STS_SUCCESS;
5938 x_msg_count := 0;
5939
5940 IF G_DEBUG_MODE = 'Y' THEN
5941
5942 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_invoice_total-----------' ;
5943 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
5944
5945 END IF;
5946
5947 IF G_PRIMARY_ONLY = 'Y' THEN
5948
5949 IF G_DEBUG_MODE = 'Y' THEN
5950
5951 l_LogMsg := 'Cursor get_inv_total ' ;
5952 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5953
5954 END IF;
5955
5956 OPEN get_inv_total;
5957 LOOP
5958
5959 FETCH get_inv_total BULK COLLECT INTO l_SetOfBookIdTab, l_BillAmtIPCTab,
5960 l_BillAmtPFCTab, l_BillAmtFCTab, l_BillAmtITCTab
5961 LIMIT l_FetchSize;
5962
5963 l_ThisFetch := get_inv_total%ROWCOUNT - l_TotalFetch;
5964 l_TotalFetch := get_inv_total%ROWCOUNT ;
5965
5966 IF l_ThisFetch > 0 THEN
5967
5968 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
5969 x_InvTotTab(l_SetOfBookIDTab(i)).set_of_books_id := l_SetOfBookIdTab(i);
5970 x_InvTotTab(l_SetOfBookIDTab(i)).amount := l_BillAmtIPCTab(i);
5971 x_InvTotTab(l_SetOfBookIDTab(i)).projfunc_bill_amount := l_BillAmtPFCTab(i);
5972 x_InvTotTab(l_SetOfBookIDTab(i)).funding_bill_amount := l_BillAmtFCTab(i);
5973 x_InvTotTab(l_SetOfBookIDTab(i)).inv_amount := l_BillAmtITCTab(i);
5974
5975 IF G_DEBUG_MODE = 'Y' THEN
5976
5977 l_LogMsg := 'Sob Id:' || l_SetOfBookIdTab(i) ||
5978 ' IPC Amt:' || l_BillAmtIPCTab(i) ||
5979 ' PFC Amt:' || l_BillAmtPFCTab(i) ||
5980 ' FC Amt:' || l_BillAmtFCTab(i) ||
5981 ' ITC Amt:' || l_BillAmtITCTab(i);
5982 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
5983
5984 END IF;
5985
5986 END LOOP;
5987
5988 END IF;
5989 /* Initialize for next fetch */
5990 l_SetOfBookIdTab.DELETE;
5991 l_BillAmtIPCTab.DELETE;
5992 l_BillAmtPFCTab.DELETE;
5993 l_BillAmtFCTab.DELETE;
5994 l_BillAmtITCTab.DELETE;
5995
5996 IF l_ThisFetch < l_FetchSize THEN
5997
5998 Exit;
5999
6000 END IF;
6001 END LOOP;
6002 CLOSE get_inv_total;
6003
6004 /* mrc migration to SLA bug 4571438 ( ELSE
6005
6006 IF G_DEBUG_MODE = 'Y' THEN
6007
6008 l_LogMsg := 'Cursor get_all_inv_total ' ;
6009 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6010
6011 END IF;
6012
6013 OPEN get_all_inv_total;
6014
6015 LOOP
6016
6017 FETCH get_all_inv_total BULK COLLECT INTO l_SetOfBookIdTab, l_BillAmtIPCTab,
6018 l_BillAmtPFCTab, l_BillAmtFCTab, l_BillAmtITCTab
6019 LIMIT l_FetchSize;
6020
6021 l_ThisFetch := get_all_inv_total%ROWCOUNT - l_TotalFetch;
6022 l_TotalFetch := get_all_inv_total%ROWCOUNT ;
6023
6024 IF l_ThisFetch > 0 THEN
6025 FOR i in l_SetOfBookIdTab.FIRST..l_SetOfBookIdTab.LAST LOOP
6026 x_InvTotTab(l_SetOfBookIDTab(i)).set_of_books_id := l_SetOfBookIdTab(i);
6027 x_InvTotTab(l_SetOfBookIDTab(i)).amount := l_BillAmtIPCTab(i);
6028 x_InvTotTab(l_SetOfBookIDTab(i)).projfunc_bill_amount := l_BillAmtPFCTab(i);
6029 x_InvTotTab(l_SetOfBookIDTab(i)).funding_bill_amount := l_BillAmtFCTab(i);
6030 x_InvTotTab(l_SetOfBookIDTab(i)).inv_amount := l_BillAmtITCTab(i);
6031
6032 IF G_DEBUG_MODE = 'Y' THEN
6033
6034 l_LogMsg := 'Sob Id:' || l_SetOfBookIdTab(i) ||
6035 ' IPC Amt:' || l_BillAmtIPCTab(i) ||
6036 ' PFC Amt:' || l_BillAmtPFCTab(i) ||
6037 ' FC Amt:' || l_BillAmtFCTab(i) ||
6038 ' ITC Amt:' || l_BillAmtITCTab(i);
6039 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6040
6041 END IF;
6042
6043 END LOOP;
6044
6045 END IF;
6046 -- Initialize for next fetch
6047 l_SetOfBookIdTab.DELETE;
6048 l_BillAmtIPCTab.DELETE;
6049 l_BillAmtPFCTab.DELETE;
6050 l_BillAmtFCTab.DELETE;
6051 l_BillAmtITCTab.DELETE;
6052
6053 IF l_ThisFetch < l_FetchSize THEN
6054
6055 Exit;
6056
6057 END IF;
6058 END LOOP;
6059 CLOSE get_all_inv_total; )*/
6060 END IF;
6061
6062 IF G_DEBUG_MODE = 'Y' THEN
6063
6064 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_invoice_total-----------' ;
6065 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6066
6067 END IF;
6068
6069 EXCEPTION
6070
6071 WHEN FND_API.G_EXC_ERROR THEN
6072 x_return_status := l_return_status;
6073 x_msg_count := l_msg_count;
6074 x_msg_data := l_msg_data;
6075
6076 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6077 x_return_status := l_return_status;
6078 x_msg_count := l_msg_count;
6079 x_msg_data := l_msg_data;
6080
6081 WHEN OTHERS THEN
6082 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6083 x_msg_count := l_msg_count;
6084 x_msg_data := SUBSTR(SQLERRM,1,100);
6085
6086 IF G_DEBUG_MODE = 'Y' THEN
6087
6088 PA_DEBUG.g_err_stage := 'get_invoice_total:' || x_msg_data ;
6089 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6090
6091 END IF;
6092
6093 END get_invoice_total;
6094
6095
6096 /*----------------------------------------------------------------------------------------+
6097 | Procedure : get_retained_amount |
6098 | Purpose : To get retained amount for task of a draft invoice line when the |
6099 | retention level is at project level and funding is at task level |
6100 | This will be only executed for task level funding project level |
6101 | retention invoices |
6102 | Parameters : |
6103 | ================================================================================== |
6104 | Name Mode Description |
6105 | ================================================================================== |
6106 | p_project_id IN Project ID |
6107 | p_task_id IN Task ID (of the invoice line item that is |
6108 | being processesd) |
6109 | p_draft_inv_num IN Draft Invoice num |
6110 | x_RetainedAmtTab OUT Retained amount for the task in all set_of_books |
6111 | x_return_status OUT Return status of this procedure |
6112 | x_msg_count OUT Error message count |
6113 | x_msg_data OUT Error message |
6114 | ================================================================================== |
6115 +----------------------------------------------------------------------------------------*/
6116
6117
6118 PROCEDURE get_retained_amount(
6119 p_project_id IN NUMBER,
6120 p_task_id IN VARCHAR2,
6121 p_draft_inv_num IN NUMBER,
6122 x_RetainedAmtTab OUT NOCOPY RetainedAmtTabTyp,
6123 x_return_status OUT NOCOPY VARCHAR2,
6124 x_msg_count OUT NOCOPY NUMBER,
6125 x_msg_data OUT NOCOPY VARCHAR2) IS
6126
6127
6128 /* The following cursors gets the retained amount from RDL /ERDL /DII
6129 for the given project/draft_invoice/task
6130 The task id is the task of the draft invoice line that is being processed
6131 Since retained amount is stored only in invoice processing currency, it is prorated to get in
6132 project functional and funding currency */
6133
6134 CURSOR rdl_amount IS
6135 SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
6136 SUM((rdl.retained_amount/rdl.bill_amount) * rdl.projfunc_bill_amount) retained_amt_pfc,
6137 SUM((rdl.retained_amount/rdl.bill_amount) * rdl.funding_bill_amount) retained_amt_fc
6138 FROM pa_cust_rev_dist_lines RDL, pa_draft_invoice_items DII
6139 WHERE DII.project_id = p_project_id
6140 AND DII.draft_invoice_num = p_draft_inv_num
6141 AND NVL(DII.task_id,0) = p_task_id
6142 AND RDL.project_id = DII.project_id
6143 AND RDL.draft_invoice_num = DII.draft_invoice_num
6144 AND RDL.draft_invoice_item_line_num = DII.line_num;
6145
6146 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
6147 new table gl_alc_ledger_rships_v and corresponding columns */
6148
6149 /* mrc migration to SLA bug 4571438 CURSOR rdl_amount_all IS
6150 (SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
6151 SUM((rdl.retained_amount/rdl.bill_amount) * rdl.projfunc_bill_amount) retained_amt_pfc,
6152 SUM((rdl.retained_amount/rdl.bill_amount) * rdl.funding_bill_amount) retained_amt_fc
6153 FROM pa_cust_rev_dist_lines RDL, pa_draft_invoice_items DII
6154 WHERE DII.project_id = p_project_id
6155 AND DII.draft_invoice_num = p_draft_inv_num
6156 AND NVL(DII.task_id,0) = p_task_id
6157 AND RDL.project_id = DII.project_id
6158 AND RDL.draft_invoice_num = DII.draft_invoice_num
6159 AND RDL.draft_invoice_item_line_num = DII.line_num
6160 UNION
6161 SELECT RDL_MC.set_of_books_id,
6162 SUM((rdl.retained_amount/rdl.bill_amount) * rdl_mc.amount) retained_amt_pfc,
6163 SUM((rdl.retained_amount/rdl.bill_amount) * rdl.funding_bill_amount) retained_amt_fc
6164 FROM pa_cust_rev_dist_lines RDL, pa_draft_invoice_items DII, pa_mc_cust_rdl_all RDL_MC,
6165 gl_alc_ledger_rships_v rep, pa_implementations imp
6166 WHERE DII.project_id = p_project_id
6167 AND DII.draft_invoice_num = p_draft_inv_num
6168 AND NVL(DII.task_id,0) = p_task_id
6169 AND RDL.project_id = DII.project_id
6170 AND RDL.draft_invoice_num = DII.draft_invoice_num
6171 AND RDL.draft_invoice_item_line_num = DII.line_num
6172 AND rep.source_ledger_id = imp.set_of_books_id
6173 AND rep.relationship_enabled_flag = 'Y'
6174 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
6175 AND rep.application_id = 275
6176 AND RDL_MC.set_of_books_id =rep.ledger_id
6177 AND RDL_MC.expenditure_item_id = RDL.expenditure_item_id
6178 AND RDL_MC.line_num = RDL.line_num
6179 GROUP by RDL_MC.set_of_books_id
6180 )
6181 ORDER by set_of_books_id; */
6182
6183 CURSOR erdl_amount IS
6184 SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
6185 SUM((erdl.retained_amount/erdl.amount) * erdl.projfunc_bill_amount) retained_amt_pfc,
6186 SUM((erdl.retained_amount/erdl.amount) * erdl.funding_bill_amount) retained_amt_fc
6187 FROM pa_cust_event_rdl_all ERDL, pa_draft_invoice_items DII
6188 WHERE DII.project_id = p_project_id
6189 AND DII.draft_invoice_num = p_draft_inv_num
6190 AND NVL(DII.task_id,0) = p_task_id
6191 AND ERDL.project_id = DII.project_id
6192 AND ERDL.draft_invoice_num = DII.draft_invoice_num
6193 AND ERDL.draft_invoice_item_line_num = DII.line_num;
6194
6195
6196 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
6197 new table gl_alc_ledger_rships_v and corresponding columns */
6198
6199 /* mrc migration to SLA bug 4571438 CURSOR erdl_amount_all IS
6200 (SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
6201 SUM((erdl.retained_amount/erdl.amount) * erdl.projfunc_bill_amount) retained_amt_pfc,
6202 SUM((erdl.retained_amount/erdl.amount) * erdl.funding_bill_amount) retained_amt_fc
6203 FROM pa_cust_event_rdl_all ERDL, pa_draft_invoice_items DII
6204 WHERE DII.project_id = p_project_id
6205 AND DII.draft_invoice_num = p_draft_inv_num
6206 AND NVL(DII.task_id,0) = p_task_id
6207 AND ERDL.project_id = DII.project_id
6208 AND ERDL.draft_invoice_num = DII.draft_invoice_num
6209 AND ERDL.draft_invoice_item_line_num = DII.line_num
6210 UNION
6211 SELECT ERDL_MC.set_of_books_id,
6212 SUM((erdl.retained_amount/erdl.amount) * ERDL_MC.amount) retained_amt_pfc,
6213 SUM((erdl.retained_amount/erdl.amount) * erdl.funding_bill_amount) retained_amt_fc
6214 FROM pa_cust_event_rdl_all ERDL, pa_draft_invoice_items DII,
6215 pa_mc_cust_event_rdl_all ERDL_MC,
6216 gl_alc_ledger_rships_v rep, pa_implementations imp
6217 WHERE DII.project_id = p_project_id
6218 AND DII.draft_invoice_num = p_draft_inv_num
6219 AND NVL(DII.task_id,0) = p_task_id
6220 AND ERDL.project_id = DII.project_id
6221 AND ERDL.draft_invoice_num = DII.draft_invoice_num
6222 AND ERDL.draft_invoice_item_line_num = DII.line_num
6223 AND rep.source_ledger_id = imp.set_of_books_id
6224 AND rep.relationship_enabled_flag = 'Y'
6225 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
6226 AND rep.application_id = 275
6227 AND ERDL_MC.set_of_books_id =rep.ledger_id
6228 AND ERDL_MC.project_id = ERDL.project_id
6229 AND ERDL_MC.event_num = ERDL.event_num
6230 AND NVL(ERDL_MC.task_id,0) = NVL(ERDL.task_id,0)
6231 AND ERDL_MC.line_num = ERDL.line_num
6232 GROUP by ERDL_MC.set_of_books_id
6233 )
6234 ORDER by set_of_books_id; */
6235
6236 CURSOR dii_amount IS
6237 SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
6238 SUM((DII.retained_amount/DII.amount) * DII.projfunc_bill_amount) retained_amt_pfc,
6239 SUM((DII.retained_amount/DII.amount) * DII.funding_bill_amount) retained_amt_fc
6240 FROM pa_draft_invoice_items DII
6241 WHERE DII.project_id = p_project_id
6242 AND DII.draft_invoice_num = p_draft_inv_num
6243 AND DII.task_id = p_task_id
6244 AND DII.event_num is not null;
6245
6246 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
6247 new table gl_alc_ledger_rships_v and corresponding columns */
6248
6249 /* mrc migration to SLA bug 4571438 CURSOR dii_amount_all IS
6250 (SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
6251 SUM((DII.retained_amount/DII.amount) * DII.projfunc_bill_amount) retained_amt_pfc,
6252 SUM((DII.retained_amount/DII.amount) * DII.funding_bill_amount) retained_amt_fc
6253 FROM pa_draft_invoice_items DII
6254 WHERE DII.project_id = p_project_id
6255 AND DII.draft_invoice_num = p_draft_inv_num
6256 AND DII.event_num is not null
6257 AND DII.task_id = p_task_id
6258 UNION
6259 SELECT DII_MC.set_of_books_id,
6260 SUM((DII.retained_amount/DII.amount) * DII_MC.amount) retained_amt_pfc,
6261 SUM((DII.retained_amount/DII.amount) * DII.funding_bill_amount) retained_amt_fc
6262 FROM pa_draft_invoice_items DII, pa_mc_draft_inv_items DII_MC,
6263 gl_alc_ledger_rships_v rep, pa_implementations imp
6264 WHERE DII.project_id = p_project_id
6265 AND DII.draft_invoice_num = p_draft_inv_num
6266 AND DII.task_id = p_task_id
6267 AND rep.source_ledger_id = imp.set_of_books_id
6268 AND rep.relationship_enabled_flag = 'Y'
6269 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
6270 AND rep.application_id = 275
6271 AND DII_MC.set_of_books_id =rep.ledger_id
6272 AND DII_MC.project_id = DII.project_id
6273 AND DII_MC.draft_invoice_num = DII.draft_invoice_num
6274 AND DII_MC.line_num = DII.line_num
6275 AND DII.event_num is not null
6276 GROUP by DII_MC.set_of_books_id
6277 )
6278 ORDER by set_of_books_id; */
6279
6280
6281
6282
6283 l_RetnExistFlag VARCHAR2(1);
6284
6285 l_SetOfBookIdTab PA_PLSQL_DATATYPES.IdTabTyp;
6286 l_RetainedAmtPFCTab PA_PLSQL_DATATYPES.NumTabTyp;
6287 l_RetainedAmtFCTab PA_PLSQL_DATATYPES.NumTabTyp;
6288
6289
6290 l_RetainedAmtTab RetainedAmtTabTyp;
6291 l_TotalFetch NUMBER := 0;
6292 l_ThisFetch NUMBER := 0;
6293 l_FetchSize NUMBER := 50;
6294
6295 l_return_status VARCHAR2(30) := NULL;
6296 l_msg_count NUMBER := NULL;
6297 l_msg_data VARCHAR2(250) := NULL;
6298 l_LogMsg VARCHAR2(250);
6299
6300
6301 BEGIN
6302 x_return_status := FND_API.G_RET_STS_SUCCESS;
6303 x_msg_count := 0;
6304
6305 IF G_DEBUG_MODE = 'Y' THEN
6306
6307 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_retained_amount-----------' ;
6308 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6309
6310 l_LogMsg := 'Project Id:' || p_project_id ||
6311 ' Task Id:' || p_task_id ||
6312 ' Draft Inv Num:' || p_draft_inv_num ;
6313 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6314
6315 END IF;
6316
6317 /* This procedure will get retained amount for an invoice/task (of draft invoice items) in
6318 primary/primary and reporting set of books id
6319
6320 The result tab x_RetainedAmtTab will have one record (for the task) in case of primary only
6321 or one record for each of the primary and reporting set of books id */
6322
6323 /* Check if the invoice has any retention lines. Only if it exists subsequent code will get processed */
6324
6325 SELECT 'T' INTO l_RetnExistFlag
6326 FROM DUAL
6327 WHERE EXISTS (SELECT NULL
6328 FROM pa_draft_invoice_items dii
6329 WHERE dii.project_id = p_project_id
6330 AND dii.draft_invoice_num = p_draft_inv_num
6331 AND dii.invoice_line_type = 'RETENTION');
6332
6333
6334 IF G_PRIMARY_ONLY = 'Y' THEN /* For primary only ( */
6335
6336 IF G_DEBUG_MODE = 'Y' THEN
6337
6338 l_LogMsg := 'Cursor rdl_amount ' ;
6339 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6340
6341 END IF;
6342
6343 l_TotalFetch := 0;
6344 OPEN rdl_amount;
6345 LOOP
6346 FETCH rdl_amount BULK COLLECT INTO l_SetOfBookIdTab, l_RetainedAmtPFCTab, l_RetainedAmtFCTab
6347 LIMIT l_FetchSize;
6348
6349 l_ThisFetch := rdl_amount%ROWCOUNT - l_TotalFetch;
6350 l_TotalFetch := rdl_amount%ROWCOUNT ;
6351
6352 IF l_ThisFetch > 0 THEN
6353
6354
6355 /* This procedure sums up the amount from the amount tab and adds it to the output tab
6356 In order to avoid repetitive coding for each of the tables RDL/ERDL/DII for primary as well as
6357 primary and reporting set of books, this procedure is being used
6358 */
6359
6360 sum_retained_amount(
6361 p_task_id => p_task_id,
6362 p_SetOfBookIdTab => l_SetOfBookIdTab,
6363 p_RetainedAmtPFCTab => l_RetainedAmtPFcTab,
6364 p_RetainedAmtFCTab => l_RetainedAmtFCTab,
6365 x_RetainedAmtTab => l_RetainedAmtTab,
6366 x_return_status => l_return_status,
6367 x_msg_count => l_msg_count,
6368 x_msg_data => l_msg_data);
6369
6370 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6371
6372 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6373
6374 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6375
6376 RAISE FND_API.G_EXC_ERROR;
6377
6378 END IF;
6379
6380 END IF; /* l_ThisFetch > 0 */
6381
6382 /* Initialize for next fetch */
6383 l_SetOfBookIdTab.DELETE;
6384 l_RetainedAmtPFCTab.DELETE;
6385 l_RetainedAmtFCTab.DELETE;
6386
6387 IF l_ThisFetch < l_FetchSize THEN
6388 Exit;
6389 END IF;
6390
6391 END LOOP; /* open rdl_amount */
6392
6393 CLOSE rdl_amount ;
6394
6395 IF G_DEBUG_MODE = 'Y' THEN
6396
6397 l_LogMsg := 'Cursor erdl_amount ' ;
6398 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6399
6400 END IF;
6401
6402 l_TotalFetch := 0;
6403 OPEN erdl_amount;
6404 LOOP
6405 FETCH erdl_amount BULK COLLECT INTO l_SetOfBookIdTab, l_RetainedAmtPFCTab, l_RetainedAmtFCTab
6406 LIMIT l_FetchSize;
6407
6408 l_ThisFetch := erdl_amount%ROWCOUNT - l_TotalFetch;
6409 l_TotalFetch := erdl_amount%ROWCOUNT ;
6410
6411 IF l_ThisFetch > 0 THEN
6412
6413 sum_retained_amount(
6414 p_task_id => p_task_id,
6415 p_SetOfBookIdTab => l_SetOfBookIdTab,
6416 p_RetainedAmtPFCTab => l_RetainedAmtPFcTab,
6417 p_RetainedAmtFCTab => l_RetainedAmtFCTab,
6418 x_RetainedAmtTab => l_RetainedAmtTab,
6419 x_return_status => l_return_status,
6420 x_msg_count => l_msg_count,
6421 x_msg_data => l_msg_data);
6422
6423 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6424
6425 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6426
6427 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6428
6429 RAISE FND_API.G_EXC_ERROR;
6430
6431 END IF;
6432
6433 END IF; /* l_ThisFetch > 0 */
6434
6435 /* Initialize for next fetch */
6436 l_SetOfBookIdTab.DELETE;
6437 l_RetainedAmtPFCTab.DELETE;
6438 l_RetainedAmtFCTab.DELETE;
6439
6440 IF l_ThisFetch < l_FetchSize THEN
6441 Exit;
6442 END IF;
6443
6444 END LOOP; /* open erdl_amount */
6445
6446 CLOSE erdl_amount ;
6447
6448 IF G_DEBUG_MODE = 'Y' THEN
6449
6450 l_LogMsg := 'Cursor dii_amount ' ;
6451 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6452
6453 END IF;
6454
6455 l_TotalFetch := 0;
6456 OPEN dii_amount;
6457 LOOP
6458 FETCH dii_amount BULK COLLECT INTO l_SetOfBookIdTab, l_RetainedAmtPFCTab, l_RetainedAmtFCTab
6459 LIMIT l_FetchSize;
6460
6461 l_ThisFetch := dii_amount%ROWCOUNT - l_TotalFetch;
6462 l_TotalFetch := dii_amount%ROWCOUNT ;
6463
6464 IF l_ThisFetch > 0 THEN
6465
6466 sum_retained_amount(
6467 p_task_id => p_task_id,
6468 p_SetOfBookIdTab => l_SetOfBookIdTab,
6469 p_RetainedAmtPFCTab => l_RetainedAmtPFcTab,
6470 p_RetainedAmtFCTab => l_RetainedAmtFCTab,
6471 x_RetainedAmtTab => l_RetainedAmtTab,
6472 x_return_status => l_return_status,
6473 x_msg_count => l_msg_count,
6474 x_msg_data => l_msg_data);
6475
6476 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6477
6478 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6479
6480 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6481
6482 RAISE FND_API.G_EXC_ERROR;
6483
6484 END IF;
6485
6486 END IF; /* l_ThisFetch > 0 */
6487
6488 /* Initialize for next fetch */
6489 l_SetOfBookIdTab.DELETE;
6490 l_RetainedAmtPFCTab.DELETE;
6491 l_RetainedAmtFCTab.DELETE;
6492
6493 IF l_ThisFetch < l_FetchSize THEN
6494 Exit;
6495 END IF;
6496
6497 END LOOP; /* open dii_amount */
6498
6499 CLOSE dii_amount ; -- )
6500
6501 /* mrc migration to SLA bug 4571438 ELSE -- G_PRIMARY_ONLY = 'N' primary and reporting (
6502
6503 IF G_DEBUG_MODE = 'Y' THEN
6504
6505 l_LogMsg := 'Cursor rdl_amount_all ' ;
6506 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6507
6508 END IF;
6509
6510 l_TotalFetch := 0;
6511 OPEN rdl_amount_all;
6512 LOOP
6513 FETCH rdl_amount_all BULK COLLECT INTO l_SetOfBookIdTab, l_RetainedAmtPFCTab, l_RetainedAmtFCTab
6514 LIMIT l_FetchSize;
6515
6516 l_ThisFetch := rdl_amount_all%ROWCOUNT - l_TotalFetch;
6517 l_TotalFetch := rdl_amount_all%ROWCOUNT ;
6518
6519 IF l_ThisFetch > 0 THEN
6520
6521 sum_retained_amount(
6522 p_task_id => p_task_id,
6523 p_SetOfBookIdTab => l_SetOfBookIdTab,
6524 p_RetainedAmtPFCTab => l_RetainedAmtPFcTab,
6525 p_RetainedAmtFCTab => l_RetainedAmtFCTab,
6526 x_RetainedAmtTab => l_RetainedAmtTab,
6527 x_return_status => l_return_status,
6528 x_msg_count => l_msg_count,
6529 x_msg_data => l_msg_data);
6530
6531 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6532
6533 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6534
6535 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6536
6537 RAISE FND_API.G_EXC_ERROR;
6538
6539 END IF;
6540
6541 END IF; -- l_ThisFetch > 0
6542
6543 -- Initialize for next fetch
6544 l_SetOfBookIdTab.DELETE;
6545 l_RetainedAmtPFCTab.DELETE;
6546 l_RetainedAmtFCTab.DELETE;
6547
6548 IF l_ThisFetch < l_FetchSize THEN
6549 Exit;
6550 END IF;
6551
6552 END LOOP; -- open rdl_amount_all
6553
6554 CLOSE rdl_amount_all ;
6555
6556 IF G_DEBUG_MODE = 'Y' THEN
6557
6558 l_LogMsg := 'Cursor erdl_amount_all ' ;
6559 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6560
6561 END IF;
6562
6563 l_TotalFetch := 0;
6564 OPEN erdl_amount_all;
6565 LOOP
6566 FETCH erdl_amount_all BULK COLLECT INTO l_SetOfBookIdTab, l_RetainedAmtPFCTab, l_RetainedAmtFCTab
6567 LIMIT l_FetchSize;
6568
6569 l_ThisFetch := erdl_amount_all%ROWCOUNT - l_TotalFetch;
6570 l_TotalFetch := erdl_amount_all%ROWCOUNT ;
6571
6572 IF l_ThisFetch > 0 THEN
6573
6574 sum_retained_amount(
6575 p_task_id => p_task_id,
6576 p_SetOfBookIdTab => l_SetOfBookIdTab,
6577 p_RetainedAmtPFCTab => l_RetainedAmtPFcTab,
6578 p_RetainedAmtFCTab => l_RetainedAmtFCTab,
6579 x_RetainedAmtTab => l_RetainedAmtTab,
6580 x_return_status => l_return_status,
6581 x_msg_count => l_msg_count,
6582 x_msg_data => l_msg_data);
6583
6584 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6585
6586 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6587
6588 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6589
6590 RAISE FND_API.G_EXC_ERROR;
6591
6592 END IF;
6593
6594 END IF; -- l_ThisFetch > 0
6595
6596 -- Initialize for next fetch
6597 l_SetOfBookIdTab.DELETE;
6598 l_RetainedAmtPFCTab.DELETE;
6599 l_RetainedAmtFCTab.DELETE;
6600
6601 IF l_ThisFetch < l_FetchSize THEN
6602 Exit;
6603 END IF;
6604
6605 END LOOP; -- open erdl_amount_all
6606
6607 CLOSE erdl_amount_all ;
6608
6609 IF G_DEBUG_MODE = 'Y' THEN
6610
6611 l_LogMsg := 'Cursor dii_amount_all ' ;
6612 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6613
6614 END IF;
6615
6616 l_TotalFetch := 0;
6617 OPEN dii_amount_all;
6618 LOOP
6619 FETCH dii_amount_all BULK COLLECT INTO l_SetOfBookIdTab, l_RetainedAmtPFCTab, l_RetainedAmtFCTab
6620 LIMIT l_FetchSize;
6621
6622 l_ThisFetch := dii_amount_all%ROWCOUNT - l_TotalFetch;
6623 l_TotalFetch := dii_amount_all%ROWCOUNT ;
6624
6625 IF l_ThisFetch > 0 THEN
6626
6627 sum_retained_amount(
6628 p_task_id => p_task_id,
6629 p_SetOfBookIdTab => l_SetOfBookIdTab,
6630 p_RetainedAmtPFCTab => l_RetainedAmtPFcTab,
6631 p_RetainedAmtFCTab => l_RetainedAmtFCTab,
6632 x_RetainedAmtTab => l_RetainedAmtTab,
6633 x_return_status => l_return_status,
6634 x_msg_count => l_msg_count,
6635 x_msg_data => l_msg_data);
6636
6637 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6638
6639 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6640
6641 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6642
6643 RAISE FND_API.G_EXC_ERROR;
6644
6645 END IF;
6646
6647 END IF; -- l_ThisFetch > 0
6648
6649 -- Initialize for next fetch
6650 l_SetOfBookIdTab.DELETE;
6651 l_RetainedAmtPFCTab.DELETE;
6652 l_RetainedAmtFCTab.DELETE;
6653
6654 IF l_ThisFetch < l_FetchSize THEN
6655 Exit;
6656 END IF;
6657
6658 END LOOP; -- open dii_amount_all
6659
6660 CLOSE dii_amount_all ; ) */
6661
6662 END IF; /* G_PRIMARY_ONLY = 'N' */
6663
6664 x_RetainedAmtTab := l_RetainedAmtTab;
6665
6666 IF G_DEBUG_MODE = 'Y' THEN
6667
6668 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_retained_amount-----------' ;
6669 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6670
6671 END IF;
6672
6673 EXCEPTION
6674 WHEN NO_DATA_FOUND THEN
6675 x_RetainedAmtTab := l_RetainedAmtTab;
6676 NULL;
6677
6678 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6679 x_return_status := l_return_status;
6680 x_msg_count := l_msg_count;
6681 x_msg_data := l_msg_data;
6682
6683 WHEN FND_API.G_EXC_ERROR THEN
6684 x_return_status := l_return_status;
6685 x_msg_count := l_msg_count;
6686 x_msg_data := l_msg_data;
6687
6688 WHEN OTHERS THEN
6689 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6690 x_msg_count := l_msg_count;
6691 x_msg_data := SUBSTR(SQLERRM,1,100);
6692
6693 IF G_DEBUG_MODE = 'Y' THEN
6694
6695 PA_DEBUG.g_err_stage := 'get_retained_amount:' || x_msg_data ;
6696 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6697
6698 END IF;
6699
6700 END get_retained_amount;
6701
6702
6703 /*----------------------------------------------------------------------------------------+
6704 | Procedure : sum_retained_amount |
6705 | Purpose : This procedure loops thru all the input records and sum up the amount |
6706 | to respective amounts in the IN OUT parameter |
6707 | This is basically written to avoid this sum up code being repeated in |
6708 | many places in procedure get_retained_amount |
6709 | Parameters : |
6710 | ================================================================================== |
6711 | Name Mode Description |
6712 | ================================================================================== |
6713 | p_task_id IN Task ID (of the invoice line item that is |
6714 | being processesd) |
6715 | p_SetOfBookIdTab IN Set of book ids for which the tasks are being |
6716 | processed |
6717 | p_RetainedAmtPFCTab IN Retained Amoount in PFC |
6718 | p_RetainedAmtFCTab IN Retained Amount in Fc |
6719 | x_RetainedAmtTab IN OUT Summed up amounts, |
6720 | x_return_status OUT Return status of this procedure |
6721 | x_msg_count OUT Error message count |
6722 | x_msg_data OUT Error message |
6723 | ================================================================================== |
6724 +----------------------------------------------------------------------------------------*/
6725 PROCEDURE sum_retained_amount(
6726 p_task_id IN NUMBER,
6727 p_SetOfBookIdTab IN PA_PLSQL_DATATYPES.IdTabTyp,
6728 p_RetainedAmtPFCTab IN PA_PLSQL_DATATYPES.NumTabTyp,
6729 p_RetainedAmtFCTab IN PA_PLSQL_DATATYPES.NumTabTyp,
6730 x_RetainedAmtTab IN OUT NOCOPY RetainedAmtTabTyp,
6731 x_return_status OUT NOCOPY VARCHAR2,
6732 x_msg_count OUT NOCOPY NUMBER,
6733 x_msg_data OUT NOCOPY VARCHAR2) IS
6734
6735
6736 l_SobId NUMBER;
6737
6738 l_return_status VARCHAR2(30) := NULL;
6739 l_msg_count NUMBER := NULL;
6740 l_msg_data VARCHAR2(250) := NULL;
6741 l_LogMsg VARCHAR2(250);
6742
6743 BEGIN
6744 x_return_status := FND_API.G_RET_STS_SUCCESS;
6745 x_msg_count := 0;
6746
6747 IF G_DEBUG_MODE = 'Y' THEN
6748
6749 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.sum_retained_amount-----------' ;
6750 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6751
6752 END IF;
6753
6754 FOR i in p_SetOfBookIdTab.first .. p_SetOfBookIdTab.Last LOOP
6755
6756 l_SobId := p_SetOfBookIdTab(i);
6757
6758 IF x_RetainedAmtTab.Exists (l_SobId) THEN
6759
6760 x_RetainedAmtTab(l_SobId).projfunc_retained_amount :=
6761 nvl(x_RetainedAmtTab(l_SobId).projfunc_retained_amount,0) + nvl(p_RetainedAmtPFCTab(i),0);
6762 x_RetainedAmtTab(l_SobId).funding_retained_amount :=
6763 nvl(x_RetainedAmtTab(l_SobId).funding_retained_amount,0) + nvl(p_RetainedAmtFCTab(i),0);
6764
6765 ELSE
6766 x_RetainedAmtTab(l_SobId).task_id := p_task_id;
6767 x_RetainedAmtTab(l_SobId).set_of_books_id := l_SobId;
6768 x_RetainedAmtTab(l_SobId).projfunc_retained_amount := nvl(p_RetainedAmtPFCTab(i),0);
6769 x_RetainedAmtTab(l_SobId).funding_retained_amount := nvl(p_RetainedAmtFCTab(i),0);
6770
6771 END IF;
6772
6773 IF G_DEBUG_MODE = 'Y' THEN
6774
6775 l_LogMsg := 'Sob Id:' || l_SobId ||
6776 ' PFC Retained Amt:' || round(x_RetainedAmtTab(l_SobId).projfunc_retained_amount,4) ||
6777 ' FC Retained Amt:' || round(x_RetainedAmtTab(l_SobId).funding_retained_amount,4);
6778 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
6779
6780 END IF;
6781
6782
6783 END LOOP;
6784
6785 IF G_DEBUG_MODE = 'Y' THEN
6786
6787 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.sum_retained_amount-----------' ;
6788 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6789
6790 END IF;
6791
6792 EXCEPTION
6793
6794 WHEN FND_API.G_EXC_ERROR THEN
6795 x_return_status := l_return_status;
6796 x_msg_count := l_msg_count;
6797 x_msg_data := l_msg_data;
6798
6799 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6800 x_return_status := l_return_status;
6801 x_msg_count := l_msg_count;
6802 x_msg_data := l_msg_data;
6803
6804 WHEN OTHERS THEN
6805 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6806 x_msg_count := l_msg_count;
6807 x_msg_data := SUBSTR(SQLERRM,1,100);
6808
6809 IF G_DEBUG_MODE = 'Y' THEN
6810
6811 PA_DEBUG.g_err_stage := 'sum_retained_amount:' || x_msg_data ;
6812 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6813
6814 END IF;
6815
6816 END sum_retained_amount;
6817
6818 /*----------------------------------------------------------------------------------------+
6819 | Procedure : adjust_appl_amount |
6820 | Purpose : To adjust applied amount of project level retention invoices against |
6821 | retained amount derived for task |
6822 | This will be only executed for task level funding with project level |
6823 | retention invoices |
6824 | Parameters : |
6825 | ================================================================================== |
6826 | Name Mode Description |
6827 | ================================================================================== |
6828 | p_project_id IN Project ID |
6829 | p_agreement_id IN Agreement_id |
6830 | p_SobId IN Set of book id for which the amount is to be |
6831 | adjusted |
6832 | p_Retained_amt_pfc IN Retained Amount in PFC |
6833 | p_Retained_amt_fc IN Retained Amount in FC |
6834 | x_retn_appl_amt_pfc IN Applied amount adjusted in PFC |
6835 | x_retn_appl_amt_fc IN Applied amount adjusted in FC |
6836 | x_retn_gain_amt_pfc IN Realized Gain amount adjusted in PFC |
6837 | x_retn_loss_amt_pfc IN Realized Loss amount adjusted in PFC |
6838 | x_return_status OUT Return status of this procedure |
6839 | x_msg_count OUT Error message count |
6840 | x_msg_data OUT Error message |
6841 | ================================================================================== |
6842 +----------------------------------------------------------------------------------------*/
6843
6844
6845 PROCEDURE adjust_appl_amount(
6846 p_project_id IN NUMBER,
6847 p_agreement_id IN NUMBER,
6848 p_SobId IN NUMBER,
6849 p_retained_amount_pfc IN NUMBER,
6850 p_retained_amount_fc IN NUMBER,
6851 x_retn_appl_amt_pfc OUT NOCOPY NUMBER,
6852 x_retn_appl_amt_fc OUT NOCOPY NUMBER,
6853 x_retn_gain_amt_pfc OUT NOCOPY NUMBER,
6854 x_retn_loss_amt_pfc OUT NOCOPY NUMBER,
6855 x_return_status OUT NOCOPY VARCHAR2,
6856 x_msg_count OUT NOCOPY NUMBER,
6857 x_msg_data OUT NOCOPY VARCHAR2) IS
6858
6859
6860 l_return_status VARCHAR2(30) := NULL;
6861 l_msg_count NUMBER := NULL;
6862 l_msg_data VARCHAR2(250) := NULL;
6863
6864 l_LogMsg VARCHAR2(250);
6865
6866 l_BalApplAmtPFC NUMBER := 0;
6867 l_BalApplAmtFC NUMBER := 0;
6868 l_BalGainAmtPFC NUMBER := 0;
6869 l_BalLossAmtPFC NUMBER := 0;
6870
6871 l_RetnApplAmtPFC NUMBER := 0;
6872 l_RetnApplAmtFC NUMBER := 0;
6873 l_RetnGainAmtPFC NUMBER := 0;
6874 l_RetnLossAmtPFC NUMBER := 0;
6875
6876 BEGIN
6877 x_return_status := FND_API.G_RET_STS_SUCCESS;
6878 x_msg_count := 0;
6879
6880 /* This procedure adjusts the retained amount for the given project/task/sobID of an agreement
6881 against the applied amount maintained for the project agreement in global table
6882 G_RetnApplAmtTab
6883 From the available balance (difference between total applied and already adjusted amounts)
6884 the current retained amount is adjusted */
6885
6886 IF G_DEBUG_MODE = 'Y' THEN
6887
6888 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.adjust_appl_amount-----------' ;
6889 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6890
6891 l_LogMsg := 'Sob Id:' || p_SobId ;
6892 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
6893
6894 l_LogMsg := '==================';
6895 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
6896
6897 END IF;
6898
6899 x_retn_appl_amt_pfc := 0;
6900 x_retn_appl_amt_fc := 0;
6901 x_retn_gain_amt_pfc := 0;
6902 x_retn_loss_amt_pfc := 0;
6903
6904
6905 IF G_RetnApplAmtTab.EXISTS(p_SobId) THEN
6906
6907 l_BalApplAmtPFC := nvl(G_RetnApplAmtTab(p_SobId).projfunc_applied_amount,0) -
6908 nvl(G_RetnApplAmtTab(p_SobId).projfunc_adj_appl_amount,0);
6909
6910 l_BalApplAmtFC := nvl(G_RetnApplAmtTab(p_SobId).funding_applied_amount,0) -
6911 nvl(G_RetnApplAmtTab(p_SobId).funding_adj_appl_amount,0);
6912
6913 l_BalGainAmtPFC := nvl(G_RetnApplAmtTab(p_SobId).projfunc_gain_amount,0) -
6914 nvl(G_RetnApplAmtTab(p_SobId).projfunc_adj_gain_amount,0);
6915
6916 l_BalLossAmtPFC := nvl(G_RetnApplAmtTab(p_SobId).projfunc_loss_amount,0) -
6917 nvl(G_RetnApplAmtTab(p_SobId).projfunc_adj_loss_amount,0);
6918
6919 IF l_BalApplAmtPFC <> 0 THEN
6920
6921 IF p_retained_amount_pfc >= l_BalApplAmtPFC THEN
6922
6923 l_RetnApplAmtPFC := l_BalApplAmtPFC;
6924 l_RetnApplAmtFC := l_BalApplAmtFC;
6925
6926 ELSIF p_retained_amount_pfc < l_BalApplAmtPFC THEN
6927
6928 l_RetnApplAmtPFC := p_retained_amount_pfc;
6929 l_RetnApplAmtFC := p_retained_amount_fc;
6930
6931 END IF;
6932
6933 l_RetnGainAmtPFC := (l_BalGainAmtPFC/l_BalApplAmtPFC) * l_RetnApplAmtPFC ;
6934 l_RetnLossAmtPFC := (l_BalLossAmtPFC/l_BalApplAmtPFC) * l_RetnApplAmtPFC ;
6935
6936 G_RetnApplAmtTab(p_SobId).projfunc_adj_appl_amount :=
6937 nvl(G_RetnApplAmtTab(p_SobId).projfunc_adj_appl_amount,0) + l_BalApplAmtPFC;
6938 G_RetnApplAmtTab(p_SobId).funding_adj_appl_amount :=
6939 nvl(G_RetnApplAmtTab(p_SobId).funding_adj_appl_amount ,0)+ l_BalApplAmtFC;
6940 G_RetnApplAmtTab(p_SobId).projfunc_adj_gain_amount :=
6941 nvl(G_RetnApplAmtTab(p_SobId).projfunc_adj_gain_amount ,0)+ l_RetnGainAmtPFC;
6942 G_RetnApplAmtTab(p_SobId).projfunc_adj_loss_amount :=
6943 nvl(G_RetnApplAmtTab(p_SobId).projfunc_adj_loss_amount ,0)+ l_RetnlossAmtPFC;
6944
6945 END IF;
6946
6947 END IF ;/*G_RetnApplAmtTab.EXISTS(p_SobId) */
6948
6949 x_retn_appl_amt_pfc := l_RetnApplAmtPFC;
6950 x_retn_appl_amt_fc := l_RetnApplAmtFC;
6951 x_retn_gain_amt_pfc := l_RetnGainAmtPFC;
6952 x_retn_loss_amt_pfc := l_RetnLossAmtPFC;
6953
6954 IF G_DEBUG_MODE = 'Y' THEN
6955
6956 l_LogMsg := 'PFC Retn Appl Amt:' || round(x_retn_appl_amt_pfc,4) ||
6957 ' FC Retn Appl Amt:' || round(x_retn_appl_amt_fc,4) ||
6958 ' PFC Retn gain Amt:' || round(x_retn_gain_amt_pfc,4) ||
6959 ' PFC Retn loss Amt:' || round(x_retn_loss_amt_pfc,4) ;
6960
6961 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
6962
6963 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.adjust_appl_amount-----------' ;
6964 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6965
6966 END IF;
6967
6968 EXCEPTION
6969
6970 WHEN FND_API.G_EXC_ERROR THEN
6971 x_return_status := l_return_status;
6972 x_msg_count := l_msg_count;
6973 x_msg_data := l_msg_data;
6974
6975 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6976 x_return_status := l_return_status;
6977 x_msg_count := l_msg_count;
6978 x_msg_data := l_msg_data;
6979
6980 WHEN OTHERS THEN
6981 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6982 x_msg_count := l_msg_count;
6983 x_msg_data := SUBSTR(SQLERRM,1,100);
6984
6985 IF G_DEBUG_MODE = 'Y' THEN
6986
6987 PA_DEBUG.g_err_stage := 'adjust_appl_amount:' || x_msg_data ;
6988 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
6989
6990 END IF;
6991
6992 END adjust_appl_amount;
6993
6994 /*----------------------------------------------------------------------------------------+
6995 | Procedure : get_sum_invoice_components |
6996 | Purpose : To fetch and compute invoice related components for a project/agreement|
6997 | This will get executed only if project level realized gain/loss flag |
6998 | is 'Y'. Since AR is not called, invoices for an agreement/project/task |
6999 | set of books id can be summed up in single SQL. This routine does this|
7000 | Parameters : |
7001 | ================================================================================== |
7002 | Name Mode Description |
7003 | ================================================================================== |
7004 | p_project_id IN Project ID |
7005 | p_agreement_id IN Agreement_id |
7006 | p_task_id IN Task Id of summary project funding |
7007 | x_return_status OUT Return status of this procedure |
7008 | x_msg_count OUT Error message count |
7009 | x_msg_data OUT Error message |
7010 | ================================================================================== |
7011 +----------------------------------------------------------------------------------------*/
7012
7013 PROCEDURE get_sum_invoice_components(
7014 p_project_id IN NUMBER,
7015 p_agreement_id IN NUMBER,
7016 p_task_id IN NUMBER,
7017 x_return_status OUT NOCOPY VARCHAR2,
7018 x_msg_count OUT NOCOPY NUMBER,
7019 x_msg_data OUT NOCOPY VARCHAR2) IS
7020
7021
7022
7023 /* The following CURSOR will select all invoices for given project/agreement for
7024 primary set of book id and will get executed for
7025 a) project level funding
7026 */
7027
7028 CURSOR get_proj_invoices IS
7029 SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
7030 0 task_id,
7031 sum(dii.amount) amount,
7032 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
7033 sum(dii.funding_bill_amount) funding_bill_amount
7034 FROM pa_draft_invoice_items dii,
7035 pa_draft_invoices di
7036 WHERE di.project_id = p_project_id
7037 AND di.agreement_id = p_agreement_id
7038 AND dii.project_id = di.project_id
7039 AND dii.draft_invoice_num = di.draft_invoice_num
7040 AND dii.invoice_line_type <> 'RETENTION'
7041 AND nvl(di.retention_invoice_flag, 'N') = 'N'
7042 AND di.invoice_date <= G_THRU_DATE;
7043
7044 /* The following CURSOR will select all invoices for given project/agreement for
7045 primary and reporting set of book ids */
7046
7047 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
7048 new table gl_alc_ledger_rships_v and corresponding columns */
7049
7050 /* mrc migration to SLA bug 4571438 CURSOR get_all_proj_invoices IS
7051 (SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
7052 0 task_id,
7053 sum(dii.amount) amount,
7054 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
7055 sum(dii.funding_bill_amount) funding_bill_amount
7056 FROM pa_draft_invoice_items dii,
7057 pa_draft_invoices di
7058 WHERE di.project_id = p_project_id
7059 AND di.agreement_id = p_agreement_id
7060 AND dii.project_id = di.project_id
7061 AND dii.draft_invoice_num = di.draft_invoice_num
7062 AND dii.invoice_line_type <> 'RETENTION'
7063 AND nvl(di.retention_invoice_flag, 'N') = 'N'
7064 AND di.invoice_date <= G_THRU_DATE
7065 UNION
7066 SELECT dii_mc.set_of_books_id,
7067 0 task_id,
7068 sum(dii.amount) amount,
7069 sum(dii_mc.amount) projfunc_bill_amount,
7070 sum(dii.funding_bill_amount) funding_bill_amount
7071 FROM pa_mc_draft_inv_items dii_mc, pa_draft_invoice_items dii,
7072 pa_draft_invoices di,
7073 gl_alc_ledger_rships_v rep, pa_implementations imp
7074 WHERE di.project_id = p_project_id
7075 AND di.agreement_id = p_agreement_id
7076 AND dii.project_id = di.project_id
7077 AND dii.draft_invoice_num = di.draft_invoice_num
7078 AND dii.invoice_line_type <> 'RETENTION'
7079 AND rep.source_ledger_id = imp.set_of_books_id
7080 AND rep.relationship_enabled_flag = 'Y'
7081 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
7082 AND rep.application_id = 275
7083 AND dii_mc.set_of_books_id =rep.ledger_id
7084 AND dii_mc.project_id = dii.project_id
7085 AND dii_mc.draft_invoice_num = dii.draft_invoice_num
7086 AND dii_mc.line_num = dii.line_num
7087 AND nvl(di.retention_invoice_flag, 'N') = 'N'
7088 AND di.invoice_date <= G_THRU_DATE
7089 GROUP BY dii_mc.set_of_books_id
7090 )
7091 ORDER BY set_of_books_id; */
7092
7093 /* The following CURSOR will select all invoices for given project/agreement for
7094 primary set of book id and will get executed for
7095 a) task level funding
7096 */
7097
7098 CURSOR get_task_invoices IS
7099 SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
7100 dii.task_id,
7101 sum(dii.amount) amount,
7102 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
7103 sum(dii.funding_bill_amount) funding_bill_amount
7104 FROM pa_draft_invoice_items dii,
7105 pa_draft_invoices di
7106 WHERE di.project_id = p_project_id
7107 AND di.agreement_id = p_agreement_id
7108 AND dii.project_id = di.project_id
7109 AND dii.draft_invoice_num = di.draft_invoice_num
7110 AND dii.invoice_line_type <> 'RETENTION'
7111 AND nvl(di.retention_invoice_flag, 'N') = 'N'
7112 AND di.invoice_date <= G_THRU_DATE
7113 GROUP BY dii.task_id
7114 ORDER BY task_id;
7115
7116 /* R12 : Ledger Architecture Changes : The table gl_mc_reporting_options will be obsolete, replace with
7117 new table gl_alc_ledger_rships_v and corresponding columns */
7118
7119 /* This CURSOR is same as previous CURSOR except that ti will select for both primary and reporting set of
7120 books isd */
7121 /* mrc migration to SLA bug 4571438 CURSOR get_all_task_invoices IS
7122 (SELECT PA_FUND_REVAL_PVT.G_SET_OF_BOOKS_ID set_of_books_id,
7123 dii.task_id,
7124 sum(dii.amount) amount,
7125 sum(dii.projfunc_bill_amount) projfunc_bill_amount,
7126 sum(dii.funding_bill_amount) funding_bill_amount
7127 FROM pa_draft_invoice_items dii,
7128 pa_draft_invoices di
7129 WHERE di.project_id = p_project_id
7130 AND di.agreement_id = p_agreement_id
7131 AND dii.project_id = di.project_id
7132 AND dii.draft_invoice_num = di.draft_invoice_num
7133 AND dii.invoice_line_type <> 'RETENTION'
7134 AND nvl(di.retention_invoice_flag, 'N') = 'N'
7135 AND di.invoice_date <= G_THRU_DATE
7136 GROUP BY dii.task_id
7137 UNION
7138 SELECT dii_mc.set_of_books_id,
7139 dii.task_id,
7140 sum(dii.amount) amount,
7141 sum(dii_mc.amount) projfunc_bill_amount,
7142 sum(dii.funding_bill_amount) funding_bill_amount
7143 FROM pa_mc_draft_inv_items dii_mc, pa_draft_invoice_items dii, pa_draft_invoices di,
7144 gl_alc_ledger_rships_v rep, pa_implementations imp
7145 WHERE di.project_id = p_project_id
7146 AND di.agreement_id = p_agreement_id
7147 AND dii.project_id = di.project_id
7148 AND dii.draft_invoice_num = di.draft_invoice_num
7149 AND dii.invoice_line_type <> 'RETENTION'
7150 AND rep.source_ledger_id = imp.set_of_books_id
7151 AND rep.relationship_enabled_flag = 'Y'
7152 AND (rep.org_id = -99 OR rep.org_id = imp.org_id)
7153 AND rep.application_id = 275
7154 AND dii_mc.set_of_books_id =rep.ledger_id
7155 AND dii_mc.project_id = dii.project_id
7156 AND dii_mc.draft_invoice_num = dii.draft_invoice_num
7157 AND dii_mc.line_num = dii.line_num
7158 AND nvl(di.retention_invoice_flag, 'N') = 'N'
7159 AND di.invoice_date <= G_THRU_DATE
7160 GROUP BY dii.task_id, dii_mc.set_of_books_id
7161 )
7162 ORDER BY task_id,set_of_books_id; */
7163
7164
7165 l_SetOfBookIdTab PA_PLSQL_DATATYPES.IdTabTyp;
7166 l_TaskIdTab PA_PLSQL_DATATYPES.IdTabTyp;
7167 l_BillAmtIPCTab PA_PLSQL_DATATYPES.NumTabTyp;
7168 l_BillAmtPFCTab PA_PLSQL_DATATYPES.NumTabTyp;
7169 l_BillAmtFCTab PA_PLSQL_DATATYPES.NumTabTyp;
7170
7171 l_SobIdIdx NUMBER := 0;
7172
7173 l_TotalFetch NUMBER := 0;
7174 l_ThisFetch NUMBER := 0;
7175 l_FetchSize NUMBER := 50;
7176
7177 l_return_status VARCHAR2(30) := NULL;
7178 l_msg_count NUMBER := NULL;
7179 l_msg_data VARCHAR2(250) := NULL;
7180 l_LogMsg VARCHAR2(250);
7181 BEGIN
7182 x_return_status := FND_API.G_RET_STS_SUCCESS;
7183 x_msg_count := 0;
7184
7185 IF G_DEBUG_MODE = 'Y' THEN
7186
7187 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_sum_invoice_components-----------' ;
7188 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
7189
7190 END IF;
7191
7192 /* This procedure gets sum of invoice lines for the given project/agreement id.
7193
7194 If the project is funded at project level then there will be one line per agreement/
7195 set of book id
7196 If the project is funded at task level then there will be one line per agreement/ task/ set of book id
7197
7198 */
7199
7200
7201 IF G_PRIMARY_ONLY = 'Y' THEN
7202
7203 IF NVL(p_task_id,0) = 0 THEN /* Project level funding */
7204
7205 IF G_DEBUG_MODE = 'Y' THEN
7206
7207 l_LogMsg := 'Cursor get_sum_proj_invoices ' ;
7208 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
7209
7210 END IF;
7211
7212 OPEN get_proj_invoices;
7213
7214 LOOP
7215
7216 FETCH get_proj_invoices BULK COLLECT INTO l_SetOfBookIdTab, l_TaskIdTab,
7217 l_BillAmtIPCTab, l_BillAmtPFCTab, l_BillAmtFCTab
7218 LIMIT l_FetchSize;
7219
7220 l_ThisFetch := get_proj_invoices%ROWCOUNT - l_TotalFetch;
7221 l_TotalFetch := get_proj_invoices%ROWCOUNT ;
7222
7223 IF l_ThisFetch > 0 THEN
7224
7225 populate_invoice_amount(
7226 p_project_id => p_project_id,
7227 p_agreement_id => p_agreement_id,
7228 p_task_id => p_task_id,
7229 p_SetOfBookIdTab => l_SetOfBookIdTab,
7230 p_TaskIdTab => l_TaskIdTab,
7231 p_BillAmtIPCTab => l_BillAmtIPCTab,
7232 p_BillAmtFCTab => l_BillAmtFCTab,
7233 p_BillAmtPFCTab => l_BillAmtPFCTab,
7234 x_return_status => l_return_status,
7235 x_msg_count => l_msg_count,
7236 x_msg_data => l_msg_data);
7237
7238 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7239
7240 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7241
7242 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
7243
7244 RAISE FND_API.G_EXC_ERROR;
7245
7246 END IF;
7247
7248 END IF; /* l_ThisFetch */
7249
7250 /* Initialize for next fetch */
7251 l_SetOfBookIdTab.DELETE;
7252 l_TaskIdTab.DELETE;
7253 l_BillAmtPFCTab.DELETE;
7254 l_BillAmtFCTab.DELETE;
7255 l_BillAmtIPCTab.DELETE;
7256
7257 IF l_ThisFetch < l_FetchSize THEN
7258 Exit;
7259 END IF;
7260
7261 END LOOP; /*get_proj_invoices*/
7262
7263 CLOSE get_proj_invoices;
7264
7265 ELSE /* Task Level funding */
7266
7267 IF G_DEBUG_MODE = 'Y' THEN
7268
7269 l_LogMsg := 'Cursor get_sum_task_invoices ' ;
7270 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
7271
7272 END IF;
7273
7274 OPEN get_task_invoices;
7275
7276 LOOP
7277
7278 FETCH get_task_invoices BULK COLLECT INTO l_SetOfBookIdTab, l_TaskIdTab,
7279 l_BillAmtIPCTab, l_BillAmtPFCTab, l_BillAmtFCTab
7280 LIMIT l_FetchSize;
7281
7282 l_ThisFetch := get_task_invoices%ROWCOUNT - l_TotalFetch;
7283 l_TotalFetch := get_task_invoices%ROWCOUNT ;
7284
7285 IF l_ThisFetch > 0 THEN
7286
7287 populate_invoice_amount(
7288 p_project_id => p_project_id,
7289 p_agreement_id => p_agreement_id,
7290 p_task_id => p_task_id,
7291 p_SetOfBookIdTab => l_SetOfBookIdTab,
7292 p_TaskIdTab => l_TaskIdTab,
7293 p_BillAmtIPCTab => l_BillAmtIPCTab,
7294 p_BillAmtFCTab => l_BillAmtFCTab,
7295 p_BillAmtPFCTab => l_BillAmtPFCTab,
7296 x_return_status => l_return_status,
7297 x_msg_count => l_msg_count,
7298 x_msg_data => l_msg_data);
7299
7300 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7301
7302 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7303
7304 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
7305
7306 RAISE FND_API.G_EXC_ERROR;
7307
7308 END IF;
7309
7310 END IF; /* l_ThisFetch > 0 */
7311
7312
7313 /* Initialize for next fetch */
7314 l_SetOfBookIdTab.DELETE;
7315 l_TaskIdTab.DELETE;
7316 l_BillAmtPFCTab.DELETE;
7317 l_BillAmtFCTab.DELETE;
7318 l_BillAmtIPCTab.DELETE;
7319
7320 IF l_ThisFetch < l_FetchSize THEN
7321 Exit;
7322 END IF;
7323
7324 END LOOP; /*get_task_invoices*/
7325
7326 CLOSE get_task_invoices;
7327
7328 END IF; /* p_task_id = 0 */
7329
7330 /* mrc migration to SLA bug 4571438 ( ELSE -- G_PRIMARY_ONLY = 'N'
7331
7332 IF NVL(p_task_id,0) = 0 THEN -- Project level funding
7333
7334 IF G_DEBUG_MODE = 'Y' THEN
7335
7336 l_LogMsg := 'Cursor get_sum_all_proj_invoices ' ;
7337 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
7338
7339 END IF;
7340
7341 OPEN get_all_proj_invoices;
7342
7343 LOOP
7344
7345 FETCH get_all_proj_invoices BULK COLLECT INTO l_SetOfBookIdTab, l_TaskIdTab,
7346 l_BillAmtIPCTab, l_BillAmtPFCTab, l_BillAmtFCTab
7347 LIMIT l_FetchSize;
7348
7349 l_ThisFetch := get_all_proj_invoices%ROWCOUNT - l_TotalFetch;
7350 l_TotalFetch := get_all_proj_invoices%ROWCOUNT ;
7351
7352 IF l_ThisFetch > 0 THEN
7353
7354 populate_invoice_amount(
7355 p_project_id => p_project_id,
7356 p_agreement_id => p_agreement_id,
7357 p_task_id => p_task_id,
7358 p_SetOfBookIdTab => l_SetOfBookIdTab,
7359 p_TaskIdTab => l_TaskIdTab,
7360 p_BillAmtIPCTab => l_BillAmtIPCTab,
7361 p_BillAmtFCTab => l_BillAmtFCTab,
7362 p_BillAmtPFCTab => l_BillAmtPFCTab,
7363 x_return_status => l_return_status,
7364 x_msg_count => l_msg_count,
7365 x_msg_data => l_msg_data);
7366
7367 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7368
7369 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7370
7371 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
7372
7373 RAISE FND_API.G_EXC_ERROR;
7374
7375 END IF;
7376
7377 END IF; -- l_ThisFetch > 0
7378
7379 -- Initialize for next fetch
7380 l_SetOfBookIdTab.DELETE;
7381 l_TaskIdTab.DELETE;
7382 l_BillAmtPFCTab.DELETE;
7383 l_BillAmtFCTab.DELETE;
7384 l_BillAmtIPCTab.DELETE;
7385
7386 IF l_ThisFetch < l_FetchSize THEN
7387 Exit;
7388 END IF;
7389
7390 END LOOP ; -- get_all_proj_invoices
7391
7392 CLOSE get_all_proj_invoices;
7393
7394 ELSE -- Task Level funding
7395
7396 IF G_DEBUG_MODE = 'Y' THEN
7397
7398 l_LogMsg := 'Cursor get_sum_all_task_invoices ' ;
7399 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
7400
7401 END IF;
7402
7403 OPEN get_all_task_invoices;
7404
7405 LOOP
7406
7407 FETCH get_all_task_invoices BULK COLLECT INTO l_SetOfBookIdTab, l_TaskIdTab,
7408 l_BillAmtIPCTab, l_BillAmtPFCTab, l_BillAmtFCTab
7409 LIMIT l_FetchSize;
7410
7411 l_ThisFetch := get_all_task_invoices%ROWCOUNT - l_TotalFetch;
7412 l_TotalFetch := get_all_task_invoices%ROWCOUNT ;
7413
7414 IF l_ThisFetch > 0 THEN
7415
7416 populate_invoice_amount(
7417 p_project_id => p_project_id,
7418 p_agreement_id => p_agreement_id,
7419 p_task_id => p_task_id,
7420 p_SetOfBookIdTab => l_SetOfBookIdTab,
7421 p_TaskIdTab => l_TaskIdTab,
7422 p_BillAmtIPCTab => l_BillAmtIPCTab,
7423 p_BillAmtFCTab => l_BillAmtFCTab,
7424 p_BillAmtPFCTab => l_BillAmtPFCTab,
7425 x_return_status => l_return_status,
7426 x_msg_count => l_msg_count,
7427 x_msg_data => l_msg_data);
7428
7429 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7430
7431 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7432
7433 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
7434
7435 RAISE FND_API.G_EXC_ERROR;
7436
7437 END IF;
7438
7439 END IF; -- l_ThisFetch > 0
7440
7441 -- Initialize for next fetch
7442 l_SetOfBookIdTab.DELETE;
7443 l_TaskIdTab.DELETE;
7444 l_BillAmtPFCTab.DELETE;
7445 l_BillAmtFCTab.DELETE;
7446 l_BillAmtIPCTab.DELETE;
7447
7448 IF l_ThisFetch < l_FetchSize THEN
7449
7450 Exit;
7451
7452 END IF;
7453
7454 END LOOP ; -- get_all_task_invoices
7455
7456 CLOSE get_all_task_invoices;
7457
7458 END IF ; -- p_task_id = 0 ) */
7459
7460 END IF ;/* G_PRIMARY_ONLY */
7461
7462 IF G_DEBUG_MODE = 'Y' THEN
7463
7464 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_sum_invoice_components-----------' ;
7465 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
7466
7467 END IF;
7468
7469 EXCEPTION
7470
7471 WHEN FND_API.G_EXC_ERROR THEN
7472 x_return_status := l_return_status;
7473 x_msg_count := l_msg_count;
7474 x_msg_data := l_msg_data;
7475
7476 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7477 x_return_status := l_return_status;
7478 x_msg_count := l_msg_count;
7479 x_msg_data := l_msg_data;
7480
7481 WHEN OTHERS THEN
7482 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7483 x_msg_count := l_msg_count;
7484 x_msg_data := SUBSTR(SQLERRM,1,100);
7485
7486 IF G_DEBUG_MODE = 'Y' THEN
7487
7488 PA_DEBUG.g_err_stage := 'get_sum_invoice_components:' || x_msg_data ;
7489 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
7490
7491 END IF;
7492
7493 END get_sum_invoice_components;
7494
7495
7496 /*----------------------------------------------------------------------------------------+
7497 | Procedure : populate_invoice_amount |
7498 | Purpose : This procedure loops thru all the input records and sum up the amount |
7499 | to respective amounts in the G_InvCompTab |
7500 | This is basically written to avoid this sum up code being repeated in |
7501 | many places in procedure get_sum_invoice_components |
7502 | Parameters : |
7503 | ================================================================================== |
7504 | Name Mode Description |
7505 | ================================================================================== |
7506 | p_project_id IN Project ID |
7507 | p_agreement_id IN Agreement_id |
7508 | p_task_id IN Task Id of summary project funding |
7509 | p_SetOfBookIdTab IN Set of book ids |
7510 | p_TaskIdTab IN Task Id of the invoice |
7511 | p_BillAmtIPCTab IN Billed amount in IPC |
7512 | p_BillAmtPFCTab IN Billed Amount in PFC |
7513 | p_BillAmtFCTab IN Billed Amount in FC |
7514 | x_return_status OUT Return status of this procedure |
7515 | x_msg_count OUT Error message count |
7516 | x_msg_data OUT Error message |
7517 | ================================================================================== |
7518 +----------------------------------------------------------------------------------------*/
7519
7520 PROCEDURE populate_invoice_amount(
7521 p_project_id IN NUMBER,
7522 p_agreement_id IN NUMBER,
7523 p_task_id IN NUMBER,
7524 p_SetOfBookIdTab IN PA_PLSQL_DATATYPES.IdTabTyp,
7525 p_TaskIdTab IN PA_PLSQL_DATATYPES.IdTabTyp,
7526 p_BillAmtIPCTab IN PA_PLSQL_DATATYPES.NumTabTyp,
7527 p_BillAmtFCTab IN PA_PLSQL_DATATYPES.NumTabTyp,
7528 p_BillAmtPFCTab IN PA_PLSQL_DATATYPES.NumTabTyp,
7529 x_return_status OUT NOCOPY VARCHAR2,
7530 x_msg_count OUT NOCOPY NUMBER,
7531 x_msg_data OUT NOCOPY VARCHAR2) IS
7532
7533
7534 l_SobIdIdx NUMBER;
7535 l_FoundFlag VARCHAR2(1);
7536 l_index NUMBER;
7537
7538 l_return_status VARCHAR2(30) := NULL;
7539 l_msg_count NUMBER := NULL;
7540 l_msg_data VARCHAR2(250) := NULL;
7541 l_LogMsg VARCHAR2(250);
7542
7543 BEGIN
7544 x_return_status := FND_API.G_RET_STS_SUCCESS;
7545 x_msg_count := 0;
7546
7547 IF G_DEBUG_MODE = 'Y' THEN
7548
7549 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.populate_invoice_amount-----------' ;
7550 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
7551
7552 END IF;
7553
7554 /* If project level funding G_InvCompTab will have only one record for a set of book id
7555 If task level funding G_InvComptab table will have summary amounts of each agreement-task
7556 funding record for primary and reproting set of books. So it is not indexed by sob_id as like other tables
7557
7558 */
7559
7560 IF nvl(p_task_id,0) = 0 THEN /* project level funding */
7561
7562 FOR i in p_SetOfBookIdTab.FIRST..p_SetOfBookIdTab.LAST LOOP
7563
7564 l_SobIdIdx := p_SetOfBookIdTab(i);
7565
7566 IF G_DEBUG_MODE = 'Y' THEN
7567
7568 l_LogMsg := ' ' ;
7569 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
7570
7571 l_LogMsg := 'Sob Id:' || l_SobIdIdx ;
7572 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
7573
7574 l_LogMsg := '==================';
7575 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
7576
7577 END IF;
7578
7579 /* Put in g_InvCompTab */
7580
7581 /* Commented for bug 2731637 as this tab should be indexed by seq no and not sob id and rewritten below
7582
7583 IF G_InvCompTab.EXISTS(l_SobIdIdx) THEN
7584 -- Data already exists for this set of book just add to it
7585
7586 G_InvCompTab(l_SobIdIdx).invproc_billed_amount :=
7587 nvl(G_InvCompTab(l_SobIdIdx).invproc_billed_amount,0) + p_BillAmtIPCTab(i);
7588 G_InvCompTab(l_SobIdIdx).funding_billed_amount :=
7589 nvl(G_InvCompTab(l_SobIdIdx).funding_billed_amount,0) + p_BillAmtFCTab(i);
7590 G_InvCompTab(l_SobIdIdx).projfunc_billed_amount :=
7591 nvl(G_InvCompTab(l_SobIdIdx).projfunc_billed_amount,0) + p_BillAmtPFCTab(i);
7592
7593 ELSE
7594
7595 -- Data does not exist . First time creation for this set of book just assign it
7596
7597 G_InvCompTab(l_SobIdIdx).project_id := p_project_id;
7598 G_InvCompTab(l_SobIdIdx).agreement_id := p_agreement_id;
7599 G_InvCompTab(l_SobIdIdx).task_id := p_TaskIdTab(i);
7600 G_InvCompTab(l_SobIdIdx).set_of_books_id := l_SobIdIdx;
7601 G_InvCompTab(l_SobIdIdx).invproc_billed_amount := p_BillAmtIPCTab(i);
7602 G_InvCompTab(l_SobIdIdx).funding_billed_amount := p_BillAmtFCTab(i);
7603 G_InvCompTab(l_SobIdIdx).projfunc_billed_amount := p_BillAmtPFCTab(i);
7604
7605 END IF;
7606 */
7607
7608 l_FoundFlag := 'N';
7609
7610 IF G_InvCompTab.count > 0 THEN
7611
7612 FOR j in G_InvCompTab.first..G_InvCompTab.LAST LOOP
7613
7614 IF G_InvCompTab(j).set_of_books_id = l_SobIDIdx THEN
7615
7616 G_InvCompTab(j).invproc_billed_amount :=
7617 nvl(G_InvCompTab(j).invproc_billed_amount,0) + p_BillAmtIPCTab(i);
7618 G_InvCompTab(j).funding_billed_amount :=
7619 nvl(G_InvCompTab(j).funding_billed_amount,0) + p_BillAmtFCTab(i);
7620 G_InvCompTab(j).projfunc_billed_amount :=
7621 nvl(G_InvCompTab(j).projfunc_billed_amount,0) + p_BillAmtPFCTab(i);
7622
7623 l_FoundFlag := 'Y';
7624
7625 EXIT;
7626
7627 END IF;
7628
7629 END LOOP;
7630
7631 END IF;
7632
7633 IF l_foundFlag = 'N' THEN
7634
7635 l_index := G_InvCompTab.Count + 1;
7636
7637 G_InvCompTab(l_index).project_id := p_project_id;
7638 G_InvCompTab(l_index).agreement_id := p_agreement_id;
7639 G_InvCompTab(l_index).task_id := p_TaskIdTab(i);
7640 G_InvCompTab(l_index).set_of_books_id := l_SobIdIdx;
7641 G_InvCompTab(l_index).invproc_billed_amount := p_BillAmtIPCTab(i);
7642 G_InvCompTab(l_index).funding_billed_amount := p_BillAmtFCTab(i);
7643 G_InvCompTab(l_index).projfunc_billed_amount := p_BillAmtPFCTab(i);
7644
7645 END IF;
7646
7647 IF G_DEBUG_MODE = 'Y' THEN
7648
7649 l_LogMsg := 'Billed Amt PFC:' || p_BillAmtPFCTab(i) ||
7650 ' Billed Amt FC:' || p_BillAmtFCTab(i) ||
7651 ' Billed Amt IPC:' || p_BillAmtIPCTab(i) ;
7652 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
7653
7654 END IF;
7655
7656 END LOOP; /*SetOfBookIdTab LOO */
7657
7658 ELSE /* task level funding */
7659
7660 FOR i in p_SetOfBookIdTab.FIRST..p_SetOfBookIdTab.LAST LOOP
7661
7662 l_SobIdIdx := p_SetOfBookIdTab(i);
7663
7664 IF G_DEBUG_MODE = 'Y' THEN
7665
7666 l_LogMsg := ' ' ;
7667 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
7668
7669 l_LogMsg := 'Sob Id:' || l_SobIdIdx ;
7670 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
7671
7672 l_LogMsg := '==================';
7673 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
7674
7675 END IF;
7676
7677 l_FoundFlag := 'N';
7678
7679 IF G_InvCompTab.count > 0 THEN
7680
7681 FOR j in G_InvCompTab.first..G_InvCompTab.LAST LOOP
7682
7683 IF G_InvCompTab(j).set_of_books_id = l_SobIDIdx and
7684 G_InvCompTab(j).task_id = p_TaskIdTab(i) THEN
7685
7686 G_InvCompTab(j).invproc_billed_amount :=
7687 nvl(G_InvCompTab(j).invproc_billed_amount,0) + p_BillAmtIPCTab(i);
7688 G_InvCompTab(j).funding_billed_amount :=
7689 nvl(G_InvCompTab(j).funding_billed_amount,0) + p_BillAmtFCTab(i);
7690 G_InvCompTab(j).projfunc_billed_amount :=
7691 nvl(G_InvCompTab(j).projfunc_billed_amount,0) + p_BillAmtPFCTab(i);
7692
7693 l_FoundFlag := 'Y';
7694
7695 EXIT;
7696
7697 END IF;
7698
7699 END LOOP;
7700
7701 END IF;
7702
7703 IF l_foundFlag = 'N' THEN
7704
7705 l_index := G_InvCompTab.Count + 1;
7706
7707 G_InvCompTab(l_index).project_id := p_project_id;
7708 G_InvCompTab(l_index).agreement_id := p_agreement_id;
7709 G_InvCompTab(l_index).task_id := p_TaskIdTab(i);
7710 G_InvCompTab(l_index).set_of_books_id := l_SobIdIdx;
7711 G_InvCompTab(l_index).invproc_billed_amount := p_BillAmtIPCTab(i);
7712 G_InvCompTab(l_index).funding_billed_amount := p_BillAmtFCTab(i);
7713 G_InvCompTab(l_index).projfunc_billed_amount := p_BillAmtPFCTab(i);
7714
7715 END IF;
7716
7717 IF G_DEBUG_MODE = 'Y' THEN
7718
7719 l_LogMsg := 'Billed Amt PFC:' || p_BillAmtPFCTab(i) ||
7720 ' Billed Amt FC:' || p_BillAmtFCTab(i) ||
7721 ' Billed Amt IPC:' || p_BillAmtIPCTab(i) ;
7722 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
7723
7724 END IF;
7725
7726 END LOOP;
7727
7728 END IF;
7729
7730 IF G_DEBUG_MODE = 'Y' THEN
7731
7732 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.populate_invoice_amount-----------' ;
7733 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
7734
7735 END IF;
7736
7737 EXCEPTION
7738
7739 WHEN FND_API.G_EXC_ERROR THEN
7740 x_return_status := l_return_status;
7741 x_msg_count := l_msg_count;
7742 x_msg_data := l_msg_data;
7743
7744 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7745 x_return_status := l_return_status;
7746 x_msg_count := l_msg_count;
7747 x_msg_data := l_msg_data;
7748
7749 WHEN OTHERS THEN
7750 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7751 x_msg_count := l_msg_count;
7752 x_msg_data := SUBSTR(SQLERRM,1,100);
7753
7754 IF G_DEBUG_MODE = 'Y' THEN
7755
7756 PA_DEBUG.g_err_stage := 'populate_invoice_amount:' || x_msg_data ;
7757 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
7758
7759 END IF;
7760
7761 END populate_invoice_amount;
7762
7763
7764 /*----------------------------------------------------------------------------------------+
7765 | Procedure : compute_adjustment_amounts |
7766 | Purpose : To revaluate all computed amounts from funding currency to |
7767 | projfunctional/invproc currency |
7768 | Parameters : |
7769 | ================================================================================== |
7770 | Name Mode Description |
7771 | ================================================================================== |
7772 | p_project_id IN Project ID |
7773 | p_task_id IN Task Id of summary project funding |
7774 | x_return_status OUT Return status of this procedure |
7775 | x_msg_count OUT Error message count |
7776 | x_msg_data OUT Error message |
7777 | ================================================================================== |
7778 +----------------------------------------------------------------------------------------*/
7779
7780 PROCEDURE compute_adjustment_amounts(
7781 p_agreement_id IN NUMBER,
7782 p_task_id IN NUMBER,
7783 x_return_status OUT NOCOPY VARCHAR2,
7784 x_msg_count OUT NOCOPY NUMBER,
7785 x_msg_data OUT NOCOPY VARCHAR2) IS
7786
7787
7788
7789 l_from_currency_tab PA_PLSQL_DATATYPES.Char30TabTyp;
7790 l_to_currency_tab PA_PLSQL_DATATYPES.Char30TabTyp;
7791 l_conversion_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
7792 l_conversion_type_tab PA_PLSQL_DATATYPES.Char30TabTyp;
7793 l_amount_tab PA_PLSQL_DATATYPES.NumTabTyp;
7794 l_user_validate_flag_tab PA_PLSQL_DATATYPES.Char30TabTyp;
7795 l_converted_amount_tab PA_PLSQL_DATATYPES.NumTabTyp;
7796 l_denominator_tab PA_PLSQL_DATATYPES.NumTabTyp;
7797 l_numerator_tab PA_PLSQL_DATATYPES.NumTabTyp;
7798 l_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
7799 l_conversion_between VARCHAR2(6);
7800 l_cache_flag VARCHAR2(1);
7801 l_status_tab PA_PLSQL_DATATYPES.Char30TabTyp;
7802 l_error_flag VARCHAR2(1) := 'N';
7803
7804 l_FundingCurrencyCode VARCHAR2(30);
7805 l_ProjfuncCurrencyCode VARCHAR2(30);
7806 l_InvprocCurrencyCode VARCHAR2(30);
7807
7808 l_FundingBacklogAmount NUMBER := 0;
7809 l_FundingPaidAmount NUMBER := 0;
7810 l_FundingUnpaidAmount NUMBER := 0;
7811
7812 l_ProjfuncBacklogAmount NUMBER := 0;
7813 l_ProjfuncPaidAmount NUMBER := 0;
7814 l_ProjfuncUnpaidAmount NUMBER := 0;
7815 l_ProjfuncBilledAmount NUMBER := 0;
7816
7817 l_InvprocBacklogAmount NUMBER := 0;
7818
7819 l_RevalBacklogAmtFC NUMBER := 0;
7820 l_RvldBacklogAmtFC NUMBER := 0;
7821 l_DueAmtFC NUMBER := 0;
7822
7823 l_RvldBacklogAmtPFC NUMBER := 0;
7824 l_RvldDueAmtPFC NUMBER := 0;
7825
7826 l_RvldBacklogAmtIPC NUMBER := 0;
7827
7828 l_ProjFuncRate NUMBER;
7829 l_InvProcRate NUMBER;
7830
7831 l_ProjfuncRateType VARCHAR2(30);
7832 l_InvprocRateType VARCHAR2(30);
7833
7834 l_ProjfuncRevalRate NUMBER;
7835 l_ProjfuncRevalType VARCHAR2(30);
7836
7837 l_InvprocRevalRate NUMBER;
7838 l_InvprocRevalType VARCHAR2(30);
7839
7840 l_RevaluationIndex NUMBER;
7841
7842 l_return_status VARCHAR2(30) := NULL;
7843 l_msg_count NUMBER := NULL;
7844 l_msg_data VARCHAR2(250) := NULL;
7845 l_LogMsg VARCHAR2(250);
7846
7847 l_status NUMBER;
7848
7849 l_SobIdIdx NUMBER;
7850
7851 l_OrgId NUMBER;
7852 l_ResultCode VARCHAR2(100);
7853 l_NumeratorRate NUMBER;
7854 l_DenominatorRate NUMBER;
7855 l_RcInvDueAmount NUMBER;
7856 l_RcBacklogAmount NUMBER;
7857
7858 /* The following 2 variables introduced for bug 2636048 */
7859 l_PFCDueBefReval NUMBER;
7860 l_InvOvrFndFlag VARCHAR2(1) := 'N';
7861
7862 l_McErrorFlag VARCHAR2(1);
7863 BEGIN
7864 x_return_status := FND_API.G_RET_STS_SUCCESS;
7865 x_msg_count := 0;
7866
7867 IF G_DEBUG_MODE = 'Y' THEN
7868
7869 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.compute_adjustment_amounts-----------' ;
7870 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
7871
7872 END IF;
7873
7874 SELECT NVL(org_id,-99) INTO l_OrgId FROM PA_IMPLEMENTATIONS;
7875
7876 l_FundingCurrencyCode := G_RevalCompTab(G_SET_OF_BOOKS_ID).funding_currency_code;
7877 l_ProjFuncCurrencyCode := G_RevalCompTab(G_SET_OF_BOOKS_ID).projfunc_currency_code;
7878 l_InvprocCurrencyCode := G_RevalCompTab(G_SET_OF_BOOKS_ID).Invproc_currency_code;
7879
7880 l_ProjFuncRate := G_ProjLvlGlobRec.projfunc_bil_exchange_rate;
7881 l_InvProcRate := G_ProjLvlGlobRec.InvProc_exchange_rate;
7882
7883 IF G_DEBUG_MODE = 'Y' THEN
7884
7885 l_LogMsg := 'Currency:' ||
7886 ' FC Currency :' || l_FundingCurrencyCode ||
7887 ' PFC Currency :' || l_ProjFuncCurrencyCode ||
7888 ' IPC Currency :' || l_InvprocCurrencyCode;
7889
7890 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
7891
7892 END IF;
7893
7894 /* In case run-time param rate type is null assign from projec level */
7895
7896 l_ProjfuncRateType := nvl(G_RATE_TYPE, G_ProjLvlGlobRec.projfunc_bil_rate_type);
7897 l_InvprocRateType := nvl(G_RATE_TYPE, G_ProjLvlGlobRec.invproc_rate_type);
7898
7899 IF G_DEBUG_MODE = 'Y' THEN
7900
7901 l_LogMsg := 'Conversion attributes assigned:' ||
7902 ' PFC Rate type:' || l_ProjfuncRateType ||
7903 ' IPC Rate type:' || l_InvprocRateType;
7904
7905 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
7906
7907 END IF;
7908
7909
7910 l_from_currency_tab.DELETE;
7911 l_to_currency_tab.DELETE;
7912 l_conversion_date_tab.DELETE;
7913 l_conversion_type_tab.DELETE;
7914 l_amount_tab.DELETE;
7915 l_user_validate_flag_tab.DELETE;
7916 l_converted_amount_tab.DELETE;
7917 l_denominator_tab.DELETE;
7918 l_numerator_tab.DELETE;
7919 l_rate_tab.DELETE;
7920 l_status_tab.DELETE;
7921
7922 /* Populating to get rate for conversion from funding to projfunc currency
7923 The amount is passed as 1 because only the rate is required to pass it to client extension */
7924
7925 l_from_currency_tab(1) := l_FundingCurrencyCode;
7926 l_to_currency_tab(1) := l_ProjFuncCurrencyCode;
7927 l_conversion_date_tab(1) := G_RATE_DATE;
7928 l_conversion_type_tab(1) := l_ProjFuncRateType;
7929 l_amount_tab(1) := 1;
7930 l_user_validate_flag_tab(1) := 'Y';
7931 l_converted_amount_tab(1) := 0;
7932 l_denominator_tab(1) := 0;
7933 l_numerator_tab(1) := 0;
7934 l_rate_tab(1) := l_ProjFuncRate;
7935 l_conversion_between:= 'FC_PFC';
7936
7937 PA_MULTI_CURRENCY_BILLING.convert_amount_bulk (
7938 p_from_currency_tab => l_from_currency_tab,
7939 p_to_currency_tab => l_to_currency_tab,
7940 p_conversion_date_tab => l_conversion_date_tab,
7941 p_conversion_type_tab => l_conversion_type_tab,
7942 p_amount_tab => l_amount_tab,
7943 p_user_validate_flag_tab => l_user_validate_flag_tab,
7944 p_converted_amount_tab => l_converted_amount_tab,
7945 p_denominator_tab => l_denominator_tab,
7946 p_numerator_tab => l_numerator_tab,
7947 p_rate_tab => l_rate_tab,
7948 x_status_tab => l_status_tab,
7949 p_conversion_between => l_conversion_between,
7950 p_cache_flag => 'Y');
7951
7952 IF (l_status_tab(1) <> 'N') THEN
7953
7954 ROLLBACK;
7955
7956 --l_msg_data := l_status_tab(1);
7957 l_return_status := FND_API.G_RET_STS_ERROR;
7958
7959 /* Stamp rejection reason in PA_SPF */
7960 insert_rejection_reason_spf (
7961 p_project_id => G_ProjLvlGlobRec.project_id,
7962 p_agreement_id => p_agreement_id,
7963 p_task_id => p_task_id,
7964 p_reason_code => l_status_tab(1),
7965 x_return_status => l_return_status,
7966 x_msg_count => l_msg_count,
7967 x_msg_data => l_msg_data) ;
7968
7969 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7970
7971 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7972
7973 ELSE
7974
7975 l_msg_data := l_status_tab(1);
7976 l_return_status := FND_API.G_RET_STS_ERROR;
7977
7978 RAISE FND_API.G_EXC_ERROR;
7979
7980 END IF;
7981
7982 ELSE
7983 /* Store the actual projfunc rate and rate type for later use that will be used by conversion api */
7984
7985 l_ProjfuncRevalRate := l_rate_tab(1);
7986 l_ProjfuncRevalType := l_conversion_type_tab(1);
7987
7988
7989 l_from_currency_tab.DELETE;
7990 l_to_currency_tab.DELETE;
7991 l_conversion_date_tab.DELETE;
7992 l_conversion_type_tab.DELETE;
7993 l_amount_tab.DELETE;
7994 l_user_validate_flag_tab.DELETE;
7995 l_converted_amount_tab.DELETE;
7996 l_denominator_tab.DELETE;
7997 l_numerator_tab.DELETE;
7998 l_rate_tab.DELETE;
7999 l_status_tab.DELETE;
8000
8001 /* Populating to get rate for conversion from funding to invproc currency
8002 The amount is passed as 1 because only the rate is required to pass it to client extension */
8003
8004 l_from_currency_tab(1) := l_FundingCurrencyCode;
8005 l_to_currency_tab(1) := l_InvprocCurrencyCode;
8006 l_conversion_date_tab(1) := G_RATE_DATE;
8007 l_conversion_type_tab(1) := l_InvprocRateType;
8008 l_amount_tab(1) := 1;
8009 l_user_validate_flag_tab(1) := 'Y';
8010 l_converted_amount_tab(1) := 0;
8011 l_denominator_tab(1) := 0;
8012 l_numerator_tab(1) := 0;
8013 l_rate_tab(1) := l_InvprocRate;
8014 l_conversion_between:= 'FC_IPC';
8015
8016 PA_MULTI_CURRENCY_BILLING.convert_amount_bulk (
8017 p_from_currency_tab => l_from_currency_tab,
8018 p_to_currency_tab => l_to_currency_tab,
8019 p_conversion_date_tab => l_conversion_date_tab,
8020 p_conversion_type_tab => l_conversion_type_tab,
8021 p_amount_tab => l_amount_tab,
8022 p_user_validate_flag_tab => l_user_validate_flag_tab,
8023 p_converted_amount_tab => l_converted_amount_tab,
8024 p_denominator_tab => l_denominator_tab,
8025 p_numerator_tab => l_numerator_tab,
8026 p_rate_tab => l_rate_tab,
8027 x_status_tab => l_status_tab,
8028 p_conversion_between => l_conversion_between,
8029 p_cache_flag => 'Y');
8030
8031 IF (l_status_tab(1) <> 'N') THEN
8032
8033 ROLLBACK;
8034 --l_msg_data := l_status_tab(1);
8035 l_return_status := FND_API.G_RET_STS_ERROR;
8036
8037 /* Stamp rejection reason in PA_SPF */
8038 insert_rejection_reason_spf (
8039 p_project_id => G_ProjLvlGlobRec.project_id,
8040 p_agreement_id => p_agreement_id,
8041 p_task_id => p_task_id,
8042 p_reason_code => l_status_tab(1),
8043 x_return_status => l_return_status,
8044 x_msg_count => l_msg_count,
8045 x_msg_data => l_msg_data) ;
8046
8047 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8048
8049 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8050
8051 ELSE
8052
8053 l_msg_data := l_status_tab(1);
8054 l_return_status := FND_API.G_RET_STS_ERROR;
8055
8056 RAISE FND_API.G_EXC_ERROR;
8057
8058 END IF;
8059
8060 ELSE
8061
8062 /* Store the actual invproc rate and rate type for later use that will be used by conversion api */
8063 l_InvprocRevalRate := l_rate_tab(1);
8064 l_InvprocRevalType := l_conversion_type_tab(1);
8065
8066 END IF;
8067
8068 END IF;
8069
8070 IF G_DEBUG_MODE = 'Y' THEN
8071
8072 l_LogMsg := 'Conv attr before client extension ' ;
8073 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8074
8075 l_LogMsg := 'PFC rate type:' || l_ProjfuncRevalType ||
8076 ' PFC Rate:' || l_ProjfuncRevalRate ||
8077 ' IPC rate type:' || l_InvprocRevalType ||
8078 ' IPC Rate:' || l_InvprocRevalRate;
8079
8080 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8081
8082 END IF;
8083
8084 /* No invoices have been generated.*/
8085
8086 /* Invoices may have been generated , But for this agreement/task combination there may not by
8087 any invoice. So initialize assuming there are no invoices */
8088
8089 l_FundingBacklogAmount := G_RevalCompTab(G_SET_OF_BOOKS_ID).total_baselined_amount ;
8090 l_FundingPaidAmount := 0;
8091 l_FundingUnpaidAmount := 0;
8092 l_ProjfuncBacklogAmount := G_RevalCompTab(G_SET_OF_BOOKS_ID).projfunc_baselined_amount;
8093 l_ProjfuncPaidAmount := 0;
8094 l_ProjfuncUnpaidAmount := 0;
8095 l_ProjfuncBilledAmount := 0;
8096 l_InvprocBacklogAmount := G_RevalCompTab(G_SET_OF_BOOKS_ID).invproc_baselined_amount;
8097
8098 IF G_InvCompTab.COUNT <> 0 THEN
8099
8100 /* G_InvCompTab has invoice summary for an agreemnt /all task (task level funding/all set of books
8101 Loop thru this to get for current agreement/task/primary set of book as client extension is to
8102 be called only for primary set of book */
8103
8104 FOR i in G_InvCompTab.first..G_InvCompTab.LAST LOOP
8105
8106
8107 IF ((G_InvCompTab(i).set_of_books_id = G_SET_OF_BOOKS_ID) AND
8108 (G_InvCompTab(i).agreement_id = G_RevalCompTab(G_SET_OF_BOOKS_ID).agreement_id) AND
8109 (nvl(G_InvCompTab(i).task_id,0) = nvl(G_RevalCompTab(G_SET_OF_BOOKS_ID).task_id,0))) THEN
8110
8111 /* Commented and rewritten for bug 2636048 Uncommented for bug 3532963 */
8112
8113 l_FundingBacklogAmount :=
8114 G_RevalCompTab(G_SET_OF_BOOKS_ID).total_baselined_amount - G_InvCompTab(i).funding_billed_amount;
8115
8116 l_ProjfuncBacklogAmount :=
8117 G_RevalCompTab(G_SET_OF_BOOKS_ID).projfunc_baselined_amount - G_InvCompTab(i).projfunc_billed_amount;
8118
8119 l_InvprocBacklogAmount :=
8120 G_RevalCompTab(G_SET_OF_BOOKS_ID).invproc_baselined_amount - G_InvCompTab(i).invproc_billed_amount;
8121
8122 l_FundingPaidAmount := nvl(G_InvCompTab(i).funding_applied_amount,0);
8123 l_ProjfuncPaidAmount := nvl(G_InvCompTab(i).projfunc_applied_amount,0);
8124
8125 /* Check if invoiced amount > total funding (baselined amount) */
8126
8127 IF nvl(G_RevalCompTab(G_SET_OF_BOOKS_ID).total_baselined_amount,0) >=
8128 nvl(G_InvCompTab(i).funding_billed_amount,0) THEN
8129
8130 /*l_FundingBacklogAmount :=
8131 nvl(G_RevalCompTab(G_SET_OF_BOOKS_ID).total_baselined_amount,0) -
8132 nvl(G_InvCompTab(i).funding_billed_amount,0); */
8133
8134 l_InvOvrFndFlag := 'N'; /* Invoiced amount has not exceeded funding amount*/
8135
8136 ELSE
8137
8138 /* Invoiced amount has exceeded the funding ammount. There is no backlog */
8139
8140 --l_FundingBacklogAmount := 0;
8141
8142 l_InvOvrFndFlag := 'Y'; /* Invoiced amount has exceeded funding amount */
8143
8144 END IF;
8145
8146 /* Following code commented for bug 3532963
8147
8148 IF nvl(G_RevalCompTab(G_SET_OF_BOOKS_ID).projfunc_baselined_amount,0) >=
8149 nvl(G_InvCompTab(i).projfunc_billed_amount,0) THEN
8150
8151 l_ProjfuncBacklogAmount :=
8152 nvl(G_RevalCompTab(G_SET_OF_BOOKS_ID).Projfunc_baselined_amount,0) -
8153 nvl(G_InvCompTab(i).Projfunc_billed_amount,0);
8154
8155 ELSE
8156
8157 Invoiced amount has exceeded the funding ammount. There is no backlog
8158
8159 l_ProjfuncBacklogAmount := 0;
8160
8161 END IF;
8162
8163
8164 IF nvl(G_RevalCompTab(G_SET_OF_BOOKS_ID).invproc_baselined_amount,0) >=
8165 nvl(G_InvCompTab(i).invproc_billed_amount,0) THEN
8166
8167 l_InvprocBacklogAmount :=
8168 nvl(G_RevalCompTab(G_SET_OF_BOOKS_ID).invproc_baselined_amount,0) -
8169 nvl(G_InvCompTab(i).invproc_billed_amount,0);
8170
8171 ELSE
8172
8173 Invoiced amount has exceeded the funding ammount. There is no backlog
8174
8175 l_InvprocBacklogAmount := 0;
8176
8177 END IF;
8178 End 3532963 */
8179
8180 l_FundingUnpaidAmount := 0;
8181 l_ProjfuncUnpaidAmount := 0;
8182 l_ProjfuncBilledAmount := 0;
8183
8184 /* Only if this flag is set, unpaid amount will be revaluated Bug 2548136*/
8185 IF (G_ProjLvlGlobRec.include_gains_losses_flag = 'Y') THEN
8186
8187 l_FundingUnpaidAmount := G_InvCompTab(i).funding_billed_amount - G_InvCompTab(i).funding_applied_amount
8188 + G_InvCompTab(i).funding_adjusted_amount; /* Added for bug 7237486*/
8189 l_ProjfuncUnpaidAmount := G_InvCompTab(i).projfunc_billed_amount - G_InvCompTab(i).projfunc_applied_amount
8190 + G_InvCompTab(i).projfunc_adjusted_amount; /* Added for bug 7237486 */
8191 END IF;
8192
8193 EXIT;
8194
8195 END IF; /* current agreement of primary set of book */
8196
8197 END LOOP; /* Invoice tab */
8198
8199 END IF; /* IF G_InvCompTab.COUNT = 0 THEN */
8200
8201 PA_Client_Extn_Funding_Reval.Funding_Revaluation_factor (
8202 P_Project_ID => G_ProjLvlGlobRec.project_id,
8203 P_Top_Task_ID => G_RevalCompTab(G_SET_OF_BOOKS_ID).task_id,
8204 P_Agreement_ID => G_RevalCompTab(G_SET_OF_BOOKS_ID).agreement_id,
8205 P_Funding_Currency => G_RevalCompTab(G_SET_OF_BOOKS_ID).funding_currency_code,
8206 P_Projfunc_Currency => G_RevalCompTab(G_SET_OF_BOOKS_ID).projfunc_currency_code,
8207 P_InvProc_Currency => G_RevalCompTab(G_SET_OF_BOOKS_ID).invproc_currency_code,
8208 P_reval_through_date => G_THRU_DATE,
8209 P_reval_rate_date => G_RATE_DATE,
8210 P_projfunc_rate_type => l_ProjfuncRevalType,
8211 P_reval_projfunc_rate => l_ProjfuncRevalRate,
8212 P_Invproc_rate_type => l_InvprocRevalType,
8213 P_reval_Invproc_rate => l_InvprocRevalRate,
8214 P_Funding_Backlog_Amount => l_FundingBacklogAmount,
8215 P_Funding_paid_Amount => l_FundingPaidAmount,
8216 P_Funding_Unpaid_Amount => l_FundingUnpaidAmount,
8217 P_Projfunc_Backlog_Amount => l_ProjfuncBacklogAmount,
8218 P_Projfunc_paid_Amount => l_ProjfuncPaidAmount,
8219 P_Projfunc_Unpaid_Amount => l_ProjfuncUnpaidAmount,
8220 P_Invproc_Backlog_amount => l_InvprocBacklogAmount,
8221 X_funding_reval_factor => l_RevaluationIndex,
8222 X_Status => l_status);
8223
8224 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8225
8226 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8227
8228 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
8229
8230 RAISE FND_API.G_EXC_ERROR;
8231
8232 END IF;
8233
8234 IF G_DEBUG_MODE = 'Y' THEN
8235
8236 l_LogMsg := 'Revaluation Index ' || l_RevaluationIndex ;
8237 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8238
8239 END IF;
8240
8241 /* Do conversion for revaluation using the attributes derived at the beginning of the call */
8242
8243 l_SobIdIdx := G_RevalCompTab.FIRST;
8244
8245 LOOP
8246
8247 EXIT WHEN l_SobIdIdx IS NULL;
8248
8249 IF G_DEBUG_MODE = 'Y' THEN
8250
8251 l_LogMsg := ' ' ;
8252 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
8253
8254 l_LogMsg := 'Sob Id:' || l_SobIdIdx ;
8255 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
8256
8257 l_LogMsg := '==================';
8258 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
8259
8260 END IF;
8261
8262 /* Initialize assuming there are no invoices */
8263 G_RevalCompTab(l_SobIdIdx).funding_inv_applied_amount := 0;
8264 G_RevalCompTab(l_SobIdIdx).funding_inv_due_amount := 0;
8265 G_RevalCompTab(l_SobIdIdx).funding_backlog_amount := G_RevalCompTab(l_SobIdIdx).total_baselined_amount;
8266 G_RevalCompTab(l_SobIdIdx).projfunc_realized_gains_amt := 0;
8267 G_RevalCompTab(l_SobIdIdx).projfunc_realized_losses_amt := 0;
8268 G_RevalCompTab(l_SobIdIdx).projfunc_inv_applied_amount := 0;
8269 l_InvprocBacklogAmount := nvl(G_RevalCompTab(l_SobIdIdx).invproc_baselined_amount,0);
8270 l_ProjfuncBilledAmount := 0;
8271
8272 l_InvOvrFndFlag := 'N';
8273 IF G_InvCompTab.count <> 0 THEN /* invoices have been generated */
8274
8275 IF G_DEBUG_MODE = 'Y' THEN
8276
8277 l_LogMsg := 'Invoices have been generated';
8278 PA_FUND_REVAL_UTIL.Log_Message(p_message =>l_LogMsg);
8279
8280 END IF;
8281
8282 FOR i in G_InvCompTab.first..G_InvCompTab.LAST LOOP
8283
8284 /* Do only for current agreement/all set of book ids */
8285
8286 IF G_DEBUG_MODE = 'Y' THEN
8287
8288 l_LogMsg := 'Inv tab: sobid:' || G_InvCompTab(i).set_of_books_id ||
8289 ' agr id:' || G_InvCompTab(i).agreement_id ||
8290 ' tsk id:' || G_InvCompTab(i).task_id;
8291
8292 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8293
8294 l_LogMsg := 'Reval tab: sobid:' || l_SobIdIdx ||
8295 ' agr id:' || G_RevalCompTab(l_SobIdIdx).agreement_id ||
8296 ' tsk id:' || G_RevalCompTab(l_SobIdIdx).task_id;
8297
8298 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8299
8300 END IF;
8301
8302 IF ((G_InvCompTab(i).set_of_books_id = l_SobIdIdx) AND
8303 (G_InvCompTab(i).agreement_id = G_RevalCompTab(l_SobIdIdx).agreement_id) AND
8304 (nvl(G_InvCompTab(i).task_id,0) = nvl(G_RevalCompTab(l_SobIdIdx).task_id,0))) THEN
8305
8306 G_RevalCompTab(l_SobIdIdx).funding_backlog_amount :=
8307 pa_currency.round_trans_currency_amt(
8308 (G_RevalCompTab(l_SobIdIdx).total_baselined_amount -
8309 nvl(G_InvCompTab(i).funding_billed_amount,0)),
8310 G_RevalCompTab(l_SobIdIdx).Funding_Currency_Code);
8311
8312 /* Billed amount over funding amount . May be soft limit agreement Bug 2636048 */
8313
8314 IF nvl(G_RevalCompTab(l_SobIdIdx).funding_backlog_amount,0) < 0 THEN
8315
8316 --G_RevalCompTab(l_SobIdIdx).funding_backlog_amount := 0; /* Commented for bug 3532963 */
8317 l_InvOvrFndFlag := 'Y';
8318
8319 ELSE
8320 l_InvOvrFndFlag := 'N';
8321
8322 END IF;
8323
8324
8325 /* Invproc backlog amount before revaluation is required as adjustment amount will be the difference
8326 in backlog amount before and after revaluation. For IPC only backlog amount will be revaluated */
8327
8328 /* Billed amount over funding amount . May be soft limit agreement Bug 2636048 */
8329
8330 /* Commented for bug 3532963 IF l_InvOvrFndFlag = 'Y' THEN
8331
8332 l_InvprocBacklogAmount := 0;
8333
8334 ELSE */
8335 l_InvprocBacklogAmount :=
8336 pa_currency.round_trans_currency_amt(
8337 (G_RevalCompTab(l_SobIdIdx).invproc_baselined_amount -
8338 nvl(G_InvCompTab(i).invproc_billed_amount,0)),
8339 G_RevalCompTab(l_SobIdIdx).invproc_Currency_Code);
8340
8341 --END IF;
8342
8343 G_RevalCompTab(l_SobIdIdx).funding_inv_applied_amount :=
8344 pa_currency.round_trans_currency_amt( nvl(G_InvCompTab(i).funding_applied_amount,0),
8345 G_RevalCompTab(l_SobIdIdx).Funding_Currency_Code);
8346
8347 G_RevalCompTab(l_SobIdIdx).funding_inv_due_amount := 0;
8348
8349 /* If include_gains_losses_flag is not set, then the projfunc billed amount should be added to
8350 total revalued amount, as otherwise this component will come in adjustment amount. Only backlog
8351 amount will be revaluated and the billed amount will be added as is to total_revalued_amount of PFC
8352 */
8353 l_ProjfuncBilledAmount := 0;
8354
8355 /* Only if this flag is set, unpaid amount will be revaluated Bug 2548136*/
8356
8357 IF (G_ProjLvlGlobRec.include_gains_losses_flag = 'Y') THEN
8358
8359 IF G_DEBUG_MODE = 'Y' THEN
8360
8361 l_LogMsg := ' FC billed amount:' || G_InvCompTab(i).funding_billed_amount ||
8362 ' FC Appl amount: ' || round(G_InvCompTab(i).funding_applied_amount,5) ||
8363 ' nvl(G_InvCompTab(i).revald_pf_inv_due_amount,0) : ' || nvl(G_InvCompTab(i).revald_pf_inv_due_amount,0);
8364 PA_FUND_REVAL_UTIL.log_message(l_LogMsg);
8365
8366 END IF;
8367
8368 G_RevalCompTab(l_SobIdIdx).funding_inv_due_amount :=
8369 pa_currency.round_trans_currency_amt(
8370 (nvl(G_InvCompTab(i).funding_billed_amount,0) -
8371 nvl(G_InvCompTab(i).funding_applied_amount,0) +
8372 nvl(G_InvCompTab(i).funding_adjusted_amount,0)), /* Added for bug 7237486 */
8373 G_RevalCompTab(l_SobIdIdx).Funding_Currency_Code);
8374
8375 G_RevalCompTab(l_SobIdIdx).projfunc_inv_due_amount := /* Added for bug 3221279 */
8376 pa_currency.round_trans_currency_amt(
8377 nvl(G_InvCompTab(i).revald_pf_inv_due_amount,0),
8378 G_RevalCompTab(l_SobIdIdx).projfunc_Currency_Code);
8379
8380 /* This is required for Bug 2548136. The adjustment amount requires the difference in due amount
8381 before and after revaluation */
8382
8383 l_PFCDueBefReval :=
8384 pa_currency.round_trans_currency_amt(
8385 (nvl(G_InvCompTab(i).projfunc_billed_amount,0) -
8386 nvl(G_InvCompTab(i).projfunc_applied_amount,0)),
8387 G_RevalCompTab(l_SobIdIdx).projfunc_Currency_Code);
8388
8389 G_RevalCompTab(l_SobIdIdx).projfunc_realized_gains_amt :=
8390 pa_currency.round_trans_currency_amt(
8391 nvl(G_InvCompTab(i).projfunc_gain_amount,0),
8392 G_RevalCompTab(l_SobIdIdx).projfunc_Currency_Code) -
8393 G_RevalCompTab(l_SobIdIdx).realized_gains_amount;
8394
8395 G_RevalCompTab(l_SobIdIdx).projfunc_realized_losses_amt :=
8396 pa_currency.round_trans_currency_amt(
8397 nvl(G_InvCompTab(i).projfunc_loss_amount,0) ,
8398 G_RevalCompTab(l_SobIdIdx).projfunc_Currency_Code) -
8399 G_RevalCompTab(l_SobIdIdx).realized_losses_amount;
8400 ELSE
8401
8402 l_PFCDueBefReval := 0;
8403
8404 l_ProjfuncBilledAmount :=
8405 pa_currency.round_trans_currency_amt(
8406 nvl(G_InvCompTab(i).projfunc_billed_amount,0),
8407 G_RevalCompTab(l_SobIdIdx).projfunc_Currency_Code);
8408
8409 G_RevalCompTab(l_SobIdIdx).projfunc_realized_gains_amt := 0;
8410 G_RevalCompTab(l_SobIdIdx).projfunc_realized_losses_amt := 0;
8411
8412 IF G_DEBUG_MODE = 'Y' THEN
8413
8414 l_LogMsg := 'PFC billed amount (only when include gains losses is N):' || l_ProjfuncBilledAmount;
8415 PA_FUND_REVAL_UTIL.log_message(l_LogMsg);
8416
8417 END IF;
8418
8419 END IF;
8420
8421 /*
8422
8423 Moved above within if and end if
8424 G_RevalCompTab(l_SobIdIdx).projfunc_realized_gains_amt :=
8425 pa_currency.round_trans_currency_amt(
8426 nvl(G_InvCompTab(i).projfunc_gain_amount,0),
8427 G_RevalCompTab(l_SobIdIdx).projfunc_Currency_Code) -
8428 G_RevalCompTab(l_SobIdIdx).realized_gains_amount;
8429
8430 G_RevalCompTab(l_SobIdIdx).projfunc_realized_losses_amt :=
8431 pa_currency.round_trans_currency_amt(
8432 nvl(G_InvCompTab(i).projfunc_loss_amount,0) ,
8433 G_RevalCompTab(l_SobIdIdx).projfunc_Currency_Code) -
8434 G_RevalCompTab(l_SobIdIdx).realized_losses_amount;
8435 */
8436
8437 G_RevalCompTab(l_SobIdIdx).projfunc_inv_applied_amount :=
8438 pa_currency.round_trans_currency_amt( nvl(G_InvCompTab(i).projfunc_applied_amount,0),
8439 G_RevalCompTab(l_SobIdIdx).projfunc_Currency_Code);
8440
8441 Exit;
8442
8443 END IF;
8444
8445 END LOOP; /*G_InvCompTab loop */
8446
8447 END IF; /* IF G_InvCompTab.count <. 0 */
8448
8449 G_RevalCompTab(l_SobIdIdx).funding_reval_amount := G_RevalCompTab(l_SobIdIdx).total_baselined_amount;
8450 G_RevalCompTab(l_SobIdIdx).projfunc_reval_amount := G_RevalCompTab(l_SobIdIdx).projfunc_baselined_amount;
8451 G_RevalCompTab(l_SobIdIdx).invproc_reval_amount := G_RevalCompTab(l_SobIdIdx).invproc_baselined_amount;
8452 G_RevalCompTab(l_SobIdIdx).funding_revaluation_factor := l_RevaluationIndex;
8453
8454 --l_RevalBacklogAmtFC := G_RevalCompTab(l_SobIdIdx).funding_backlog_amount * l_RevaluationIndex;
8455 l_DueAmtFC := G_RevalCompTab(l_SobIdIdx).funding_inv_due_amount ;
8456
8457 l_FundingCurrencyCode := G_RevalCompTab(l_SobIdIdx).funding_currency_code;
8458 l_ProjFuncCurrencyCode := G_RevalCompTab(l_SobIdIdx).projfunc_currency_code;
8459 l_InvprocCurrencyCode := G_RevalCompTab(l_SobIdIdx).Invproc_currency_code;
8460
8461
8462
8463 /* 1234 Begin - 3532963 */
8464 IF (G_RevalCompTab(l_SobIdIdx).funding_backlog_amount < 0) THEN
8465 IF ((l_RevaluationIndex IS NULL) OR (l_RevaluationIndex <> 1)) THEN
8466 l_RevalBacklogAmtFC :=
8467 pa_currency.round_trans_currency_amt((G_RevalCompTab(l_SobIdIdx).funding_backlog_amount * nvl(l_RevaluationIndex,0)),
8468 G_RevalCompTab(l_SobIdIdx).funding_currency_code);
8469 ELSE
8470 l_RevalBacklogAmtFC := 0;
8471 G_RevalCompTab(l_SobIdIdx).funding_backlog_amount := 0;
8472 END IF;
8473 ELSE
8474 l_RevalBacklogAmtFC :=
8475 pa_currency.round_trans_currency_amt((G_RevalCompTab(l_SobIdIdx).funding_backlog_amount * nvl(l_RevaluationIndex,0)),
8476 G_RevalCompTab(l_SobIdIdx).funding_currency_code);
8477 END IF;
8478 /* End- 3532963 */
8479
8480 IF G_DEBUG_MODE = 'Y' THEN
8481
8482 l_LogMsg := 'FC Backlog: ' || l_RevalBacklogAmtFC ||
8483 ' FC Due:' || round(l_DueAmtFC,5) ||
8484 ' FC :' || l_FundingCurrencyCode ||
8485 ' PFC: ' || l_ProjfuncCurrencyCode ;
8486
8487 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8488
8489 END IF;
8490
8491 IF l_SobIdIdx = G_SET_OF_BOOKS_ID THEN
8492
8493 /* This was derived just before this loop as required by client extension
8494 So assigning the same. If the currencies are same previous call to converion might have
8495 nulled out the rate type /rate .So check for null and reassign the original*/
8496
8497 IF G_DEBUG_MODE = 'Y' THEN
8498
8499 l_LogMsg := 'Primary Processing attributes';
8500 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8501
8502 END IF;
8503
8504 l_ProjfuncRateType := nvl(l_ProjfuncRevalType, l_ProjfuncRateType);
8505 l_InvprocRateType := nvl(l_InvprocRevalType,l_InvprocRateType);
8506 l_ProjfuncRate := nvl(l_ProjfuncRevalRate,l_ProjfuncRate);
8507 l_InvprocRate := nvl(l_InvprocRevalRate,l_InvprocRate);
8508
8509 IF G_DEBUG_MODE = 'Y' THEN
8510
8511 l_LogMsg := 'PFC Rate Type:' || l_ProjfuncRateType ||
8512 ' IPC Rate Type:' || l_InvprocRateType ||
8513 ' PFC Rate: ' || l_ProjFuncRate ||
8514 ' IPC Rate: ' || l_InvprocRate ;
8515
8516 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8517
8518 END IF;
8519
8520 l_from_currency_tab.DELETE;
8521 l_to_currency_tab.DELETE;
8522 l_conversion_date_tab.DELETE;
8523 l_conversion_type_tab.DELETE;
8524 l_amount_tab.DELETE;
8525 l_user_validate_flag_tab.DELETE;
8526 l_converted_amount_tab.DELETE;
8527 l_denominator_tab.DELETE;
8528 l_numerator_tab.DELETE;
8529 l_rate_tab.DELETE;
8530 l_status_tab.DELETE;
8531
8532 /* Populating for projfunc backlog amount revaluation */
8533
8534 l_from_currency_tab(1) := l_FundingCurrencyCode;
8535 l_to_currency_tab(1) := l_ProjfuncCurrencyCode;
8536 l_conversion_date_tab(1) := G_RATE_DATE;
8537 l_conversion_type_tab(1) := l_ProjfuncRateType;
8538 l_amount_tab(1) := l_RevalBacklogAmtFC;
8539 l_user_validate_flag_tab(1) := 'Y';
8540 l_converted_amount_tab(1) := 0;
8541 l_denominator_tab(1) := 0;
8542 l_numerator_tab(1) := 0;
8543 l_rate_tab(1) := l_ProjFuncRate;
8544 l_conversion_between:= 'FC_PFC';
8545 l_cache_flag:= 'Y';
8546 l_status_tab(1) := 'N';
8547
8548 /* Populating for projfunc due amount revaluation */
8549
8550 l_from_currency_tab(2) := l_FundingCurrencyCode;
8551 l_to_currency_tab(2) := l_ProjfuncCurrencyCode;
8552 l_conversion_date_tab(2) := G_RATE_DATE;
8553 l_conversion_type_tab(2) := l_ProjfuncRateType;
8554 l_amount_tab(2) := l_DueAmtFC;
8555 l_user_validate_flag_tab(2) := 'Y';
8556 l_converted_amount_tab(2) := 0;
8557 l_denominator_tab(2) := 0;
8558 l_numerator_tab(2) := 0;
8559 l_rate_tab(2) := l_ProjFuncRate;
8560 l_conversion_between:= 'FC_PFC';
8561 l_cache_flag:= 'Y';
8562 l_status_tab(2) := 'N';
8563
8564 IF G_DEBUG_MODE = 'Y' THEN
8565
8566 l_LogMsg := 'Calling conversion for PFC ';
8567 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8568
8569 END IF;
8570
8571 PA_MULTI_CURRENCY_BILLING.convert_amount_bulk (
8572 p_from_currency_tab => l_from_currency_tab,
8573 p_to_currency_tab => l_to_currency_tab,
8574 p_conversion_date_tab => l_conversion_date_tab,
8575 p_conversion_type_tab => l_conversion_type_tab,
8576 p_amount_tab => l_amount_tab,
8577 p_user_validate_flag_tab => l_user_validate_flag_tab,
8578 p_converted_amount_tab => l_converted_amount_tab,
8579 p_denominator_tab => l_denominator_tab,
8580 p_numerator_tab => l_numerator_tab,
8581 p_rate_tab => l_rate_tab,
8582 x_status_tab => l_status_tab,
8583 p_conversion_between => l_conversion_between,
8584 p_cache_flag => 'Y');
8585
8586 IF ((l_status_tab(1) <> 'N') OR (l_status_tab(2) <> 'N' ))THEN
8587
8588 ROLLBACK;
8589
8590 --l_msg_data := l_status_tab(1);
8591 l_return_status := FND_API.G_RET_STS_ERROR;
8592
8593 /* Stamp rejection reason in PA_SPF */
8594 insert_rejection_reason_spf (
8595 p_project_id => G_ProjLvlGlobRec.project_id,
8596 p_agreement_id => p_agreement_id,
8597 p_task_id => p_task_id,
8598 p_reason_code => l_status_tab(1),
8599 x_return_status => l_return_status,
8600 x_msg_count => l_msg_count,
8601 x_msg_data => l_msg_data) ;
8602
8603 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8604
8605 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8606
8607 ELSE
8608
8609 l_msg_data := l_status_tab(1);
8610 l_return_status := FND_API.G_RET_STS_ERROR;
8611
8612 RAISE FND_API.G_EXC_ERROR;
8613
8614 END IF;
8615
8616 ELSE
8617
8618 /* Assign the conversion result to the raval comp table */
8619
8620 G_RevalCompTab(l_SobIdIdx).reval_projfunc_rate_type := l_ProjfuncRateType; /* l_conversion_type_tab(1); Bug 3561113 */
8621 G_RevalCompTab(l_SobIdIdx).reval_projfunc_rate := l_rate_tab(1);
8622 /* G_RevalCompTab(l_SobIdIdx).projfunc_inv_due_amount := l_converted_amount_tab(2); commented for Bug 3221279 */
8623 G_RevalCompTab(l_SobIdIdx).projfunc_backlog_amount := l_converted_amount_tab(1);
8624
8625 IF G_DEBUG_MODE = 'Y' THEN
8626
8627 l_LogMsg := 'After Conversion' ||
8628 ' PFC Rate type:' || l_conversion_type_tab(1) ||
8629 ' l_ProjfuncRateType: ' || l_ProjfuncRateType ||
8630 ' PFC Rate :' || l_rate_tab(1);
8631
8632 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8633
8634 l_LogMsg := 'PFC Revald Due amt :' || l_converted_amount_tab(2) ||
8635 ' PFC Revald backlog amt :' || l_converted_amount_tab(1);
8636
8637 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8638
8639 END IF;
8640
8641 END IF;
8642
8643 l_from_currency_tab.DELETE;
8644 l_to_currency_tab.DELETE;
8645 l_conversion_date_tab.DELETE;
8646 l_conversion_type_tab.DELETE;
8647 l_amount_tab.DELETE;
8648 l_user_validate_flag_tab.DELETE;
8649 l_converted_amount_tab.DELETE;
8650 l_denominator_tab.DELETE;
8651 l_numerator_tab.DELETE;
8652 l_rate_tab.DELETE;
8653 l_status_tab.DELETE;
8654
8655 /* Populating for invproc backlog amount revaluation */
8656
8657 l_from_currency_tab(1) := l_FundingCurrencyCode;
8658 l_to_currency_tab(1) := l_InvprocCurrencyCode;
8659 l_conversion_date_tab(1) := G_RATE_DATE;
8660 l_conversion_type_tab(1) := l_InvprocRateType;
8661 l_amount_tab(1) := l_RevalBacklogAmtFC;
8662 l_user_validate_flag_tab(1) := 'Y';
8663 l_converted_amount_tab(1) := 0;
8664 l_denominator_tab(1) := 0;
8665 l_numerator_tab(1) := 0;
8666 l_rate_tab(1) := l_InvProcRate;
8667 l_conversion_between:= 'FC_IPC';
8668 l_cache_flag:= 'Y';
8669 l_status_tab(1) := 'N';
8670
8671 IF G_DEBUG_MODE = 'Y' THEN
8672
8673 l_LogMsg := 'Calling conversion for IPC ';
8674 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8675
8676 END IF;
8677
8678 PA_MULTI_CURRENCY_BILLING.convert_amount_bulk (
8679 p_from_currency_tab => l_from_currency_tab,
8680 p_to_currency_tab => l_to_currency_tab,
8681 p_conversion_date_tab => l_conversion_date_tab,
8682 p_conversion_type_tab => l_conversion_type_tab,
8683 p_amount_tab => l_amount_tab,
8684 p_user_validate_flag_tab => l_user_validate_flag_tab,
8685 p_converted_amount_tab => l_converted_amount_tab,
8686 p_denominator_tab => l_denominator_tab,
8687 p_numerator_tab => l_numerator_tab,
8688 p_rate_tab => l_rate_tab,
8689 x_status_tab => l_status_tab,
8690 p_conversion_between => l_conversion_between,
8691 p_cache_flag => 'Y');
8692
8693 IF (l_status_tab(1) <> 'N') THEN
8694
8695 ROLLBACK;
8696 --l_msg_data := l_status_tab(1);
8697 l_return_status := FND_API.G_RET_STS_ERROR;
8698
8699 /* Stamp rejection reason in PA_SPF */
8700 insert_rejection_reason_spf (
8701 p_project_id => G_ProjLvlGlobRec.project_id,
8702 p_agreement_id => p_agreement_id,
8703 p_task_id => p_task_id,
8704 p_reason_code => l_status_tab(1),
8705 x_return_status => l_return_status,
8706 x_msg_count => l_msg_count,
8707 x_msg_data => l_msg_data) ;
8708
8709 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8710
8711 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8712
8713 ELSE
8714
8715 l_msg_data := l_status_tab(1);
8716 l_return_status := FND_API.G_RET_STS_ERROR;
8717
8718 RAISE FND_API.G_EXC_ERROR;
8719
8720 END IF;
8721
8722
8723 ELSE
8724
8725 /* In invoice proc currency only backlog amount will be revaluated . So revalued amount
8726 and backlog amount will be same */
8727
8728 G_RevalCompTab(l_SobIdIdx).reval_invproc_rate_type := l_conversion_type_tab(1);
8729 G_RevalCompTab(l_SobIdIdx).reval_invproc_rate := l_rate_tab(1);
8730 G_RevalCompTab(l_SobIdIdx).invproc_backlog_amount := l_converted_amount_tab(1);
8731 G_RevalCompTab(l_SobIdIdx).invproc_revalued_amount := l_converted_amount_tab(1);
8732
8733 IF G_DEBUG_MODE = 'Y' THEN
8734
8735 l_LogMsg := 'IPC Rate type:' || l_conversion_type_tab(1) ||
8736 ' IPC Rate :' || l_rate_tab(1);
8737
8738 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8739
8740 l_LogMsg := 'IPC Revald backlog amt :' || l_converted_amount_tab(1) ||
8741 ' IPC backlog amt :' || l_InvprocBacklogAmount;
8742
8743 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8744
8745 END IF;
8746
8747 END IF;
8748
8749 ELSE
8750
8751 IF G_DEBUG_MODE = 'Y' THEN
8752
8753 l_LogMsg := 'Reporting Processing Attributes';
8754 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8755
8756 END IF;
8757
8758 l_InvProcBacklogAmount := 0;
8759
8760 /* For reporting set of books, the rule is to use the conversion attributes
8761 that was used to convert betweent funding and PFC in primary set of books
8762 This is available upfront (calculated at the beginning of the procedure)
8763 This will be null if FC = PFC. In this case the rate type from
8764 gl_mc_reporting options (stored in GSobListTab will be used */
8765
8766 l_ProjfuncRateType := nvl(G_RATE_TYPE,
8767 nvl(l_ProjfuncRevalType,G_SobListTab(l_SobIdIdx).ConversionType));
8768 l_ProjfuncRate := nvl(l_ProjfuncRevalRate,l_ProjfuncRate);
8769
8770 IF G_DEBUG_MODE = 'Y' THEN
8771
8772 l_LogMsg := 'PFC Rate type:' || l_ProjfuncRateType ||
8773 ' PFC Rate :' || l_ProjfuncRate ;
8774
8775 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8776
8777 END IF;
8778
8779 /* mrc migration to SLA bug 4571438
8780 gl_mc_currency_pkg.get_rate(p_primary_set_of_books_id => G_SET_OF_BOOKS_ID,
8781 p_reporting_set_of_books_id => l_SobIdIdx,
8782 p_trans_date => G_RATE_DATE,
8783 p_trans_currency_code => l_FundingCurrencyCode,
8784 p_trans_conversion_type => l_ProjfuncRateType,
8785 p_trans_conversion_date => G_RATE_DATE,
8786 p_trans_conversion_rate => l_ProjfuncRate,
8787 p_application_id => 275,
8788 p_org_id => l_OrgId,
8789 p_fa_book_type_code => NULL,
8790 p_je_source_name => NULL,
8791 p_je_category_name => NULL,
8792 p_result_code => l_ResultCode,
8793 p_denominator_rate => l_DenominatorRate,
8794 p_numerator_rate => l_NumeratorRate);
8795
8796 l_RcBacklogAmount := pa_mc_currency_pkg.CurrRound(((l_RevalBacklogAmtFC/l_DenominatorRate)*
8797 l_NumeratorRate), l_ProjFuncCurrencyCode);
8798
8799 l_RcInvDueAmount := pa_mc_currency_pkg.CurrRound(((l_DueAmtFC/l_DenominatorRate)*
8800 l_NumeratorRate), l_ProjFuncCurrencyCode);
8801
8802 */
8803
8804 IF G_DEBUG_MODE = 'Y' THEN
8805
8806 l_LogMsg := 'After Conversion' ||
8807 ' PFC Rate type:' || l_ProjfuncRateType ||
8808 ' PFC Rate :' || l_ProjfuncRate ||
8809 ' Numerator :' || l_NumeratorRate ||
8810 ' Denominator :' || l_DenominatorRate ;
8811 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8812
8813
8814 l_LogMsg := 'PFC RVLD due amt:' || l_RcInvDueAmount ||
8815 ' PFC RVLD backlog amt:' || l_RcBacklogAmount;
8816
8817 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8818
8819 END IF;
8820
8821
8822 /* Assign the conversion result to the raval comp table */
8823
8824 G_RevalCompTab(l_SobIdIdx).reval_projfunc_rate_type := l_ProjfuncRateType;
8825 G_RevalCompTab(l_SobIdIdx).reval_projfunc_rate := l_ProjfuncRate;
8826 /* G_RevalCompTab(l_SobIdIdx).projfunc_inv_due_amount := l_RcInvDueAmount; Commented for bug 3221279 */
8827 G_RevalCompTab(l_SobIdIdx).projfunc_backlog_amount := l_RcBacklogAmount;
8828
8829 /*For reporting set of books there is no concept of IPC Assign null*/
8830
8831
8832 G_RevalCompTab(l_SobIdIdx).reval_invproc_rate_type := NULL;
8833 G_RevalCompTab(l_SobIdIdx).reval_invproc_rate := NULL;
8834 G_RevalCompTab(l_SobIdIdx).invproc_backlog_amount := NULL;
8835 G_RevalCompTab(l_SobIdIdx).invproc_revalued_amount := NULL;
8836
8837 END IF; /* IF l_SobIdIdx = G_SET_OF_BOOKS_ID */
8838
8839
8840
8841 /* Commenting and changing as projfunc_realized_gains_amt already has incremental gain/loss amount */
8842 /* Uncommented for bug 3532963 */
8843
8844 G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount :=
8845 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_realized_gains_amt,0) -
8846 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_realized_losses_amt,0) +
8847 nvl(G_RevalCompTab(l_SobIdIdx).realized_gains_amount,0) -
8848 nvl(G_RevalCompTab(l_SobIdIdx).realized_losses_amount,0) +
8849 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_inv_applied_amount,0) +
8850 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_inv_due_amount,0) +
8851 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_backlog_amount,0) +
8852 l_ProjfuncBilledAmount;
8853
8854 /* Commented for bug 3532963
8855 IF (l_InvOvrFndFlag = 'Y') THEN /* Bug 2636048
8856
8857 /* If billed amount exceeds funding amount and include rlzd gain/loss is Y then
8858 total revalued amount is incr rlzd gain/loss + difference between
8859 unpaid amount after reval and unpaid amount before reval
8860
8861 IF (G_ProjLvlGlobRec.include_gains_losses_flag = 'Y') THEN
8862
8863 G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount :=
8864 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_realized_gains_amt,0) -
8865 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_realized_losses_amt,0) +
8866 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_inv_due_amount,0) - l_PFCDueBefReval;
8867
8868 /* + G_RevalCompTab(l_SobIdIdx).projfunc_baselined_amount ;
8869
8870 ELSE
8871
8872 G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount := 0;
8873
8874 END IF;
8875
8876 G_RevalCompTab(l_SobIdIdx).projfunc_allocated_amount := nvl(G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount,0);
8877
8878 G_RevalCompTab(l_SobIdIdx).invproc_allocated_amount := 0;
8879 G_RevalCompTab(l_SobIdIdx).invproc_revalued_amount := 0;
8880
8881 IF G_DEBUG_MODE = 'Y' THEN
8882
8883 l_LogMsg := 'Billed amt over funding amt ' ||
8884 ' PFC revald amount:' || round(G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount,5) ||
8885 ' IPC revald amount:' || round(G_RevalCompTab(l_SobIdIdx).invproc_revalued_amount,5);
8886
8887 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8888
8889 END IF;
8890
8891 ELSE */
8892
8893 /* l_ProjfuncBilledAmount will have billed invoice amount only when include realized gains/losses is N
8894 as in this case applied/due/gain/loss amounts will be 0. Billed amount should not be available in
8895 adjustment/allocated amount */
8896
8897 IF G_DEBUG_MODE = 'Y' THEN
8898 l_LogMsg := ' PFC_invapplamt :'|| G_RevalCompTab(l_SobIdIdx).projfunc_inv_applied_amount || 'PF_invoice_due_amount: ' ;
8899 l_LogMsg := l_LogMsg || G_RevalCompTab(l_SobIdIdx).projfunc_inv_due_amount || 'PFbacklog: ';
8900 l_LogMsg := l_LogMsg || G_RevalCompTab(l_SobIdIdx).projfunc_backlog_amount ||'PF billed amount: '|| l_ProjfuncBilledAmount ;
8901 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8902 l_LogMsg := ' '; /* Bug 4346765 */
8903 END IF;
8904
8905 G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount :=
8906 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_realized_gains_amt,0) -
8907 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_realized_losses_amt,0) +
8908 nvl(G_RevalCompTab(l_SobIdIdx).realized_gains_amount,0) -
8909 nvl(G_RevalCompTab(l_SobIdIdx).realized_losses_amount,0) +
8910 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_inv_applied_amount,0) +
8911 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_inv_due_amount,0) +
8912 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_backlog_amount,0) +
8913 l_ProjfuncBilledAmount;
8914
8915 G_RevalCompTab(l_SobIdIdx).projfunc_allocated_amount :=
8916 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount,0) -
8917 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_reval_amount,0) ;
8918
8919 G_RevalCompTab(l_SobIdIdx).invproc_allocated_amount :=
8920 nvl(G_RevalCompTab(l_SobIdIdx).invproc_revalued_amount,0) - l_InvprocBacklogAmount;
8921
8922 --END IF;
8923 /*
8924
8925 G_RevalCompTab(l_SobIdIdx).projfunc_allocated_amount :=
8926 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount,0) -
8927 nvl(G_RevalCompTab(l_SobIdIdx).projfunc_reval_amount,0) ;
8928 */
8929
8930
8931 IF G_DEBUG_MODE = 'Y' THEN
8932
8933 l_LogMsg := 'After Revaluation' ||
8934 ' PFC revald amount:' || round(G_RevalCompTab(l_SobIdIdx).projfunc_revalued_amount,5) ||
8935 ' PFC reval amount:' || round(G_RevalCompTab(l_SobIdIdx).projfunc_reval_amount,5) ||
8936 ' PFC adj amount:' || round(G_RevalCompTab(l_SobIdIdx).projfunc_allocated_amount,5);
8937
8938 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8939
8940 l_LogMsg := 'After Revaluation' ||
8941 ' IPC revald amount:' || round(G_RevalCompTab(l_SobIdIdx).invproc_revalued_amount,5) ||
8942 ' IPC reval amount:' || round(G_RevalCompTab(l_SobIdIdx).invproc_reval_amount,5) ||
8943 ' IPC adj amount:' || round(G_RevalCompTab(l_SobIdIdx).invproc_allocated_amount,5);
8944
8945 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
8946
8947 END IF;
8948
8949 /* Change Request: When the invoiced amount in funding currency exceeds the funded amount in funding currency,
8950 process should not do any revaluation
8951 Fix : When the invoiced amount in funding currency exceeds the funded amount in funding currency,
8952 insert the warning into distributions and
8953 update the summary project funding with rejectionr reason as INVOICED_EXCEEDS_FUNDED
8954 */
8955
8956 /* Changes Start ------------------------------------ Commented for bug 3532963
8957
8958 IF (NVL(l_InvOvrFndFlag,'N') ='Y') AND (nvl(l_RevaluationIndex,1)=1) THEN /* Added AND condition for bug 3532963
8959
8960 ROLLBACK;
8961
8962 l_return_status := FND_API.G_RET_STS_ERROR;
8963
8964 /* Stamp rejection reason in PA_SPF
8965
8966 insert_rejection_reason_spf (
8967 p_project_id => G_ProjLvlGlobRec.project_id,
8968 p_agreement_id => p_agreement_id,
8969 p_task_id => p_task_id,
8970 p_reason_code => 'PA_FR_INVOICED_EXCEEDS_FUNDED',
8971 x_return_status => l_return_status,
8972 x_msg_count => l_msg_count,
8973 x_msg_data => l_msg_data) ;
8974
8975 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8976
8977 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8978
8979 ELSE
8980
8981 l_msg_data := 'Invoiced amount exceeds the funded amount';
8982 l_return_status := FND_API.G_RET_STS_ERROR;
8983
8984 RAISE FND_API.G_EXC_ERROR;
8985
8986 END IF;
8987
8988 END IF;
8989
8990 Changes End ------------------------------------ */
8991
8992 l_SobIdIdx := G_RevalCompTab.NEXT(l_SobIdIdx);
8993
8994 END LOOP; /* l_SobIdIdx loop */
8995
8996 IF G_DEBUG_MODE = 'Y' THEN
8997
8998 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.compute_adjustment_amounts-----------' ;
8999 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9000
9001 END IF;
9002
9003 EXCEPTION
9004 WHEN FND_API.G_EXC_ERROR THEN
9005 x_return_status := l_return_status;
9006 x_msg_count := l_msg_count;
9007 x_msg_data := l_msg_data;
9008
9009 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9010 x_return_status := l_return_status;
9011 x_msg_count := l_msg_count;
9012 x_msg_data := l_msg_data;
9013
9014 WHEN OTHERS THEN
9015 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9016 x_msg_count := l_msg_count;
9017 x_msg_data := SUBSTR(SQLERRM,1,100);
9018
9019 IF G_DEBUG_MODE = 'Y' THEN
9020
9021 PA_DEBUG.g_err_stage := 'compute_adjustment_amounts:' || x_msg_data ;
9022 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9023
9024 END IF;
9025
9026 END compute_adjustment_amounts;
9027
9028 /*----------------------------------------------------------------------------------------+
9029 | Procedure : insert_rejection_reason_spf |
9030 | Purpose : To insert rejection reason in SPF |
9031 | Parameters : |
9032 | ================================================================================== |
9033 | Name Mode Description |
9034 | ================================================================================== |
9035 | p_project_id IN Project ID |
9036 | p_agreement_id IN Agreement_id |
9037 | p_task_id IN Task Id of summary project funding |
9038 | p_reason_code IN Rejection reason code |
9039 | x_return_status OUT Return status of this procedure |
9040 | x_msg_count OUT Error message count |
9041 | x_msg_data OUT Error message |
9042 | ================================================================================== |
9043 +----------------------------------------------------------------------------------------*/
9044 PROCEDURE insert_rejection_reason_spf(
9045 p_project_id IN NUMBER,
9046 p_agreement_id IN VARCHAR2,
9047 p_task_id IN VARCHAR2,
9048 p_reason_code IN VARCHAR2,
9049 x_return_status OUT NOCOPY VARCHAR2,
9050 x_msg_count OUT NOCOPY NUMBER,
9051 x_msg_data OUT NOCOPY VARCHAR2) IS
9052
9053
9054 l_return_status VARCHAR2(30) := NULL;
9055 l_msg_count NUMBER := NULL;
9056 l_msg_data VARCHAR2(250) := NULL;
9057
9058 l_ErrMsg VARCHAR2(250);
9059
9060 BEGIN
9061 x_return_status := FND_API.G_RET_STS_SUCCESS;
9062 x_msg_count := 0;
9063
9064 IF G_DEBUG_MODE = 'Y' THEN
9065
9066 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.insert_rejection_reason_spf-----------' ;
9067 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9068
9069 END IF;
9070
9071 UPDATE pa_summary_project_fundings
9072 SET reval_rejection_code = p_reason_code,
9073 last_update_date = sysdate,
9074 last_updated_by = G_LAST_UPDATED_BY,
9075 last_update_login = G_LAST_UPDATE_LOGIN,
9076 program_application_id = G_PROGRAM_APPLICATION_ID ,
9077 program_id = G_PROGRAM_ID,
9078 program_update_date= SYSDATE,
9079 request_id= G_REQUEST_ID
9080 WHERE project_id = p_project_id
9081 AND agreement_id = p_agreement_id
9082 AND nvl(task_id,0) = nvl(p_task_id,0);
9083
9084 Insert_distribution_warnings(
9085 p_project_id => p_project_id,
9086 p_task_id => p_task_id,
9087 p_agreement_id => p_agreement_id,
9088 p_reason_code => p_Reason_Code,
9089 x_return_status => l_return_status,
9090 x_msg_count => l_msg_count,
9091 x_msg_data => l_msg_data) ;
9092
9093
9094 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9095
9096 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9097
9098 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
9099
9100 RAISE FND_API.G_EXC_ERROR;
9101
9102 END IF;
9103
9104 IF G_DEBUG_MODE = 'Y' THEN
9105
9106 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.insert_rejection_reason_spf-----------' ;
9107 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9108
9109 END IF;
9110
9111 EXCEPTION
9112
9113 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9114 x_return_status := l_return_status;
9115 x_msg_count := l_msg_count;
9116 x_msg_data := l_msg_data;
9117
9118 WHEN OTHERS THEN
9119 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9120 x_msg_count := l_msg_count;
9121 x_msg_data := SUBSTR(SQLERRM,1,100);
9122
9123 IF G_DEBUG_MODE = 'Y' THEN
9124
9125 PA_DEBUG.g_err_stage := 'insert_rejection_reason_spf:' || x_msg_data ;
9126 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9127
9128 END IF;
9129
9130 END insert_rejection_reason_spf;
9131
9132 /*----------------------------------------------------------------------------------------+
9133 | Procedure : create_adjustment_line |
9134 | Purpose : To create adjustment line for revaluated funding amounts |
9135 | Parameters : |
9136 | ================================================================================== |
9137 | Name Mode Description |
9138 | ================================================================================== |
9139 | x_return_status OUT Return status of this procedure |
9140 | x_msg_count OUT Error message count |
9141 | x_msg_data OUT Error message |
9142 | ================================================================================== |
9143 +----------------------------------------------------------------------------------------*/
9144 PROCEDURE create_adjustment_line(
9145 x_return_status OUT NOCOPY VARCHAR2,
9146 x_msg_count OUT NOCOPY NUMBER,
9147 x_msg_data OUT NOCOPY VARCHAR2) IS
9148
9149 l_ProjectFundingId NUMBER;
9150 l_Rowid VARCHAR2(20);
9151 l_NonZeroExists VARCHAR2(1);
9152 l_SobId NUMBER;
9153
9154 l_return_status VARCHAR2(30) := NULL;
9155 l_msg_count NUMBER := NULL;
9156 l_msg_data VARCHAR2(250) := NULL;
9157 l_LogMsg VARCHAR2(250);
9158
9159 CURSOR check_all_non_zero_amt(l_project_funding_id NUMBER) IS
9160 SELECT 'Y' non_zero_amt
9161 FROM DUAL
9162 WHERE EXISTS ( SELECT NULL
9163 FROM pa_project_fundings
9164 WHERE project_funding_id = l_project_funding_id
9165 AND ( projfunc_allocated_amount <> 0
9166 OR projfunc_realized_gains_amt <> 0
9167 OR projfunc_realized_losses_amt <> 0
9168 OR invproc_allocated_amount <> 0)
9169 /* mrc migration to SLA bug 4571438 UNION
9170 SELECT NULL
9171 FROM pa_mc_project_fundings
9172 WHERE project_funding_id = l_project_funding_id
9173 AND ( allocated_amount <> 0
9174 OR realized_gains_amt <> 0
9175 OR realized_losses_amt <> 0) */ );
9176
9177 l_SobIdIdx NUMBER;
9178
9179 l_TotalPFCAmount NUMBER;
9180 l_TotalIPCAmount NUMBER;
9181
9182 BEGIN
9183 x_return_status := FND_API.G_RET_STS_SUCCESS;
9184 x_msg_count := 0;
9185
9186 IF G_DEBUG_MODE = 'Y' THEN
9187
9188 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.create_adustment_line-----------' ;
9189 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9190
9191 END IF;
9192
9193 /* Insert into table pa_project_fundings */
9194 l_SobId := G_SET_OF_BOOKS_ID;
9195
9196 IF G_DEBUG_MODE = 'Y' THEN
9197
9198 l_LogMsg := 'Set of books:' || l_SobId ||
9199 ' Rate type:' || G_RevalCompTab(l_SobId).reval_projfunc_rate_type ;
9200 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
9201
9202 END IF;
9203
9204 l_LogMsg := ' Bug 3532963 : G_RevalCompTab(l_SobId).agreement_id :' || G_RevalCompTab(l_SobId).agreement_id ||
9205 ' invproc_allocated_amount :' || G_RevalCompTab(l_SobId).invproc_allocated_amount ||
9206 ' projfunc_allocated_amount : ' || G_RevalCompTab(l_SobId).projfunc_allocated_amount;
9207
9208 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
9209
9210 IF ((G_PRIMARY_ONLY = 'N') OR ( G_RevalCompTab(l_SobId).projfunc_allocated_amount <> 0)
9211 OR (G_RevalCompTab(l_SobId).invproc_allocated_amount <> 0)
9212 OR (G_RevalCompTab(l_SobId).projfunc_realized_gains_amt <> 0)
9213 OR (G_RevalCompTab(l_SobId).projfunc_realized_losses_amt <> 0)) THEN
9214
9215 PA_PROJECT_FUNDINGS_PKG. Insert_Row (
9216 X_Rowid => l_RowId ,
9217 X_Project_Funding_Id => l_ProjectFundingId ,
9218 X_Last_Update_Date => SYSDATE,
9219 X_Last_Updated_By => G_LAST_UPDATED_BY ,
9220 X_Creation_Date => SYSDATE ,
9221 X_Created_By => G_LAST_UPDATED_BY ,
9222 X_Last_Update_Login => G_LAST_UPDATE_LOGIN ,
9223 X_Agreement_Id => G_RevalCompTab(l_SobId).agreement_id ,
9224 X_Project_Id => G_RevalCompTab(l_SobId).project_id ,
9225 X_Task_Id => G_RevalCompTab(l_SobId).task_id ,
9226 X_Budget_Type_Code => 'DRAFT' ,
9227 X_Allocated_Amount => 0 ,
9228 X_Date_Allocated => G_RATE_DATE,
9229 X_Attribute_Category => NULL ,
9230 X_Attribute1 => NULL ,
9231 X_Attribute2 => NULL ,
9232 X_Attribute3 => NULL ,
9233 X_Attribute4 => NULL ,
9234 X_Attribute5 => NULL ,
9235 X_Attribute6 => NULL ,
9236 X_Attribute7 => NULL ,
9237 X_Attribute8 => NULL ,
9238 X_Attribute9 => NULL ,
9239 X_Attribute10 => NULL ,
9240 X_pm_funding_reference => NULL ,
9241 X_pm_product_code => NULL ,
9242 x_funding_currency_code => G_RevalCompTab(l_SobId).funding_currency_code ,
9243 x_project_currency_code => G_RevalCompTab(l_SobId).project_currency_code ,
9244 x_project_rate_type => NULL,
9245 x_project_rate_date => NULL,
9246 x_project_exchange_rate => NULL,
9247 x_project_allocated_amount => NULL,
9248 x_projfunc_currency_code => G_RevalCompTab(l_SobId).projfunc_currency_code ,
9249 x_projfunc_rate_type => NULL,
9250 x_projfunc_rate_date => NULL,
9251 x_projfunc_exchange_rate => NULL,
9252 x_projfunc_allocated_amount => G_RevalCompTab(l_SobId).projfunc_allocated_amount ,
9253 x_invproc_currency_code => G_RevalCompTab(l_SobId).invproc_currency_code ,
9254 x_invproc_rate_type => NULL,
9255 x_invproc_rate_date => NULL,
9256 x_invproc_exchange_rate => NULL,
9257 x_invproc_allocated_amount => G_RevalCompTab(l_SobId).invproc_allocated_amount ,
9258 x_revproc_currency_code => G_RevalCompTab(l_SobId).projfunc_currency_code ,
9259 x_revproc_rate_type => G_RevalCompTab(l_SobId).reval_projfunc_rate_type ,
9260 x_revproc_rate_date => NULL,
9261 x_revproc_exchange_rate => NULL,
9262 x_revproc_allocated_amount => G_RevalCompTab(l_SobId).projfunc_allocated_amount ,
9263 x_funding_category => 'REVALUATION' ,
9264 x_revaluation_through_date => G_THRU_DATE ,
9265 x_revaluation_rate_date => G_RATE_DATE ,
9266 x_reval_projfunc_rate_type => G_RevalCompTab(l_SobId).reval_projfunc_rate_type ,
9267 x_revaluation_projfunc_rate => G_RevalCompTab(l_SobId).reval_projfunc_rate ,
9268 x_reval_invproc_rate_type => G_RevalCompTab(l_SobId).reval_invproc_rate_type ,
9269 x_revaluation_invproc_rate => G_RevalCompTab(l_SobId).reval_invproc_rate ,
9270 x_funding_inv_applied_amount => G_RevalCompTab(l_SobId).funding_inv_applied_amount,
9271 x_funding_inv_due_amount => G_RevalCompTab(l_SobId).funding_inv_due_amount,
9272 x_funding_backlog_amount => G_RevalCompTab(l_SobId).funding_backlog_amount,
9273 x_projfunc_realized_gains_amt => G_RevalCompTab(l_SobId).projfunc_realized_gains_amt,
9274 x_projfunc_realized_losses_amt => G_RevalCompTab(l_SobId).projfunc_realized_losses_amt,
9275 x_projfunc_inv_applied_amount => G_RevalCompTab(l_SobId).projfunc_inv_applied_amount,
9276 x_projfunc_inv_due_amount => G_RevalCompTab(l_SobId).projfunc_inv_due_amount,
9277 x_projfunc_backlog_amount => G_RevalCompTab(l_SobId).projfunc_backlog_amount,
9278 x_non_updateable_flag => 'Y',
9279 x_invproc_backlog_amount => G_RevalCompTab(l_SobId).invproc_backlog_amount,
9280 x_funding_reval_amount => G_RevalCompTab(l_SobId).funding_reval_amount,
9281 x_projfunc_reval_amount => G_RevalCompTab(l_SobId).projfunc_reval_amount,
9282 x_projfunc_revalued_amount => G_RevalCompTab(l_SobId).projfunc_revalued_amount,
9283 x_invproc_reval_amount => G_RevalCompTab(l_SobId).invproc_reval_amount,
9284 x_invproc_revalued_amount => G_RevalCompTab(l_SobId).invproc_revalued_amount,
9285 x_funding_revaluation_factor => G_RevalCompTab(l_SobId).funding_revaluation_factor,
9286 x_request_id => G_REQUEST_ID,
9287 x_program_application_id => G_PROGRAM_APPLICATION_ID,
9288 x_program_id => G_PROGRAM_ID,
9289 x_program_update_date => SYSDATE);
9290
9291 IF G_DEBUG_MODE = 'Y' THEN
9292
9293 l_LogMsg := 'After Insert Project Funding Id:' || l_ProjectFundingId;
9294 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
9295
9296 END IF;
9297
9298 l_NonZeroExists := 'N';
9299
9300 IF G_PRIMARY_ONLY = 'N' THEN
9301
9302 OPEN check_all_non_zero_amt (l_ProjectFundingId);
9303 FETCH check_all_non_zero_amt INTO l_NonZeroExists;
9304 CLOSE check_all_non_zero_amt;
9305
9306 ELSE
9307
9308 l_NonZeroExists := 'Y';
9309
9310 END IF;
9311
9312 IF l_NonZeroExists = 'Y' THEN
9313
9314 IF G_DEBUG_MODE = 'Y' THEN
9315
9316 l_LogMsg := 'Non zero elements exist';
9317 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
9318
9319 END IF;
9320
9321 UPDATE pa_summary_project_fundings
9322 SET projfunc_unbaselined_amount =
9323 nvl(projfunc_unbaselined_amount,0) + G_RevalCompTab(l_SobId).projfunc_allocated_amount,
9324 revproc_unbaselined_amount =
9325 nvl(revproc_unbaselined_amount,0) + G_RevalCompTab(l_SobId).projfunc_allocated_amount,
9326 invproc_unbaselined_amount =
9327 nvl(invproc_unbaselined_amount,0) + G_RevalCompTab(l_SobId).invproc_allocated_amount,
9328 projfunc_realized_gains_amt =
9329 nvl(projfunc_realized_gains_amt,0) + G_RevalCompTab(l_SobId).projfunc_realized_gains_amt,
9330 projfunc_realized_losses_amt =
9331 nvl(projfunc_realized_losses_amt,0) + G_RevalCompTab(l_SobId).projfunc_realized_losses_amt,
9332 reval_rejection_code = NULL
9333 WHERE project_id = G_RevalCompTab(l_SobId).project_id
9334 AND agreement_id = G_RevalCompTab(l_SobId).agreement_id
9335 AND nvl(task_id,0) = nvl(G_RevalCompTab(l_SobId).task_id,0);
9336
9337 G_ProjLvlGlobRec.Zero_dollar_reval_flag := 'N';
9338
9339 /* Generate warning message if
9340 sum of pfc baselined amount and pfc adjustment amount goes below pfc accrued amount
9341 sum of ipc baselined amount and ipc adjustment amount goes below ipc billed amount
9342 */
9343 check_accrued_billed_level (
9344 x_return_status => l_return_status,
9345 x_msg_count => l_msg_count,
9346 x_msg_data => l_msg_data);
9347
9348 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9349
9350 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9351
9352 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
9353
9354 RAISE FND_API.G_EXC_ERROR;
9355
9356 END IF;
9357
9358
9359 IF G_ProjLvlGlobRec.include_gains_losses_flag = 'Y' THEN
9360
9361 /* Move projfunc_realized_gains_amt of G_RevalCompTab to
9362 event_amount of the same as required by event trigger */
9363
9364 l_SobIdIdx := G_SobListTab.FIRST;
9365
9366 LOOP
9367
9368 EXIT WHEN l_SobIdIdx IS NULL;
9369 G_RevalCompTab(l_SobIdIdx).event_amount := G_RevalCompTab(l_SobIdIdx).projfunc_realized_gains_amt;
9370 l_SobIdIdx := G_SobListTab.NEXT(l_SobIdIdx);
9371
9372 END LOOP;
9373
9374 /* Gain event. Added agreement_id parameter for federal */
9375 insert_event_record (
9376 p_project_id => G_RevalCompTab(l_SobId).project_id,
9377 p_task_id => G_RevalCompTab(l_SobId).task_id,
9378 p_event_type => G_ProjLvlGlobRec.gain_event_type,
9379 p_event_desc => G_ProjLvlGlobRec.gain_event_type,
9380 p_Bill_trans_rev_amount => G_RevalCompTab(l_SobId).projfunc_realized_gains_amt ,
9381 p_project_funding_id => l_ProjectFundingId,
9382 p_agreement_id => G_RevalCompTab(l_SobId).agreement_id,
9383 x_return_status => l_return_status,
9384 x_msg_count => l_msg_count,
9385 x_msg_data => l_msg_data) ;
9386
9387
9388 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9389
9390 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9391
9392 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
9393
9394 RAISE FND_API.G_EXC_ERROR;
9395
9396 END IF;
9397
9398 /* Move projfunc_realized_loss_amt of G_RevalCompTab to
9399 event_amount of the same as required by event trigger */
9400
9401 l_SobIdIdx := G_SobListTab.FIRST;
9402
9403 LOOP
9404
9405 EXIT WHEN l_SobIdIdx IS NULL;
9406 G_RevalCompTab(l_SobIdIdx).event_amount := G_RevalCompTab(l_SobIdIdx).projfunc_realized_losses_amt;
9407 l_SobIdIdx := G_SobListTab.NEXT(l_SobIdIdx);
9408
9409 END LOOP;
9410
9411
9412 /* Loss event. Added agreement_id parameter for federal */
9413 insert_event_record (
9414 p_project_id => G_RevalCompTab(l_SobId).project_id,
9415 p_task_id => G_RevalCompTab(l_SobId).task_id,
9416 p_event_type => G_ProjLvlGlobRec.loss_event_type,
9417 p_event_desc => G_ProjLvlGlobRec.loss_event_type,
9418 p_Bill_trans_rev_amount => G_RevalCompTab(l_SobId).projfunc_realized_losses_amt ,
9419 p_project_funding_id => l_ProjectFundingId,
9420 p_agreement_id => G_RevalCompTab(l_SobId).agreement_id,
9421 x_return_status => l_return_status,
9422 x_msg_count => l_msg_count,
9423 x_msg_data => l_msg_data) ;
9424
9425
9426 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9427
9428 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9429
9430 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
9431
9432 RAISE FND_API.G_EXC_ERROR;
9433
9434 END IF;
9435
9436 END IF; /* G_ProjLvlGlobRec.include_gains_losses_flag = 'Y' */
9437
9438 ELSE
9439
9440 IF G_DEBUG_MODE = 'Y' THEN
9441
9442 l_LogMsg := 'Non zero elements does notexist';
9443 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
9444
9445 END IF;
9446
9447 DELETE FROM pa_project_fundings
9448 WHERE project_funding_id = l_ProjectFundingId;
9449
9450 END IF; /* l_NonZeroExists = 'Y' */
9451
9452 END IF; /* ((G_PRIMARY_ONLY = 'N') OR ( G_RevalCompTab(l_SobId).projfunc_allocated_amount <> 0) */
9453
9454 IF G_DEBUG_MODE = 'Y' THEN
9455
9456 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.create_adustment_line-----------' ;
9457 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9458
9459 END IF;
9460
9461 EXCEPTION
9462
9463 WHEN FND_API.G_EXC_ERROR THEN
9464 x_return_status := l_return_status;
9465 x_msg_count := l_msg_count;
9466 x_msg_data := l_msg_data;
9467
9468 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9469 x_return_status := l_return_status;
9470 x_msg_count := l_msg_count;
9471 x_msg_data := l_msg_data;
9472
9473 WHEN OTHERS THEN
9474 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9475 x_msg_count := l_msg_count;
9476 x_msg_data := SUBSTR(SQLERRM,1,100);
9477
9478 IF G_DEBUG_MODE = 'Y' THEN
9479
9480 PA_DEBUG.g_err_stage := 'create_adjustment_line:' || x_msg_data ;
9481 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9482
9483 END IF;
9484
9485 END create_adjustment_line;
9486
9487
9488 /*----------------------------------------------------------------------------------------+
9489 | Procedure : insert_event_record |
9490 | Purpose : To insert event record for gains/losses amount |
9491 | Parameters : |
9492 | ================================================================================== |
9493 | Name Mode Description |
9494 | ================================================================================== |
9495 | p_project_id IN Project ID |
9496 | p_task_id IN Task Id of summary project funding |
9497 | p_event_type IN Event type (gain/loss event type ) |
9498 | p_event_desc IN Event description (gain/loss event description ) |
9499 | p_bill_trans_rev_amount IN Amount (Realized gain/loss amount) |
9500 | p_project_funding_id IN Funding line Id for which this event is created |
9501 | x_return_status OUT Return status of this procedure |
9502 | x_msg_count OUT Error message count |
9503 | x_msg_data OUT Error message |
9504 | ================================================================================== |
9505 +----------------------------------------------------------------------------------------*/
9506 PROCEDURE insert_event_record(
9507 p_project_id IN NUMBER,
9508 p_task_id IN NUMBER,
9509 p_event_type IN VARCHAR2,
9510 p_event_desc IN VARCHAR2,
9511 p_Bill_trans_rev_amount IN NUMBER,
9512 p_project_funding_id IN NUMBER,
9513 p_agreement_id IN NUMBER,
9514 x_return_status OUT NOCOPY VARCHAR2,
9515 x_msg_count OUT NOCOPY NUMBER,
9516 x_msg_data OUT NOCOPY VARCHAR2) IS
9517
9518 l_RowId VARCHAR2(30);
9519 l_EventId NUMBER;
9520 l_EventNum NUMBER;
9521 l_SobId NUMBER;
9522 l_ZeroRevAmtFlag VARCHAR2(1);
9523
9524 l_return_status VARCHAR2(30) := NULL;
9525 l_msg_count NUMBER := NULL;
9526 l_msg_data VARCHAR2(250) := NULL;
9527
9528 l_LogMsg VARCHAR2(250);
9529 l_NonZeroExists VARCHAR2(1);
9530
9531 CURSOR check_all_non_zero_amt(l_EventId NUMBER) IS
9532 SELECT 'Y' non_zero_amt
9533 FROM DUAL
9534 WHERE EXISTS ( SELECT NULL
9535 FROM pa_events
9536 WHERE event_id = l_EventId
9537 AND bill_trans_rev_amount <> 0
9538 /* mrc migration to SLA bug 4571438 UNION
9539 SELECT NULL
9540 FROM pa_mc_events
9541 WHERE event_id = l_EventId
9542 AND revenue_amount <> 0 */ );
9543
9544
9545 BEGIN
9546 x_return_status := FND_API.G_RET_STS_SUCCESS;
9547 x_msg_count := 0;
9548
9549 IF G_DEBUG_MODE = 'Y' THEN
9550
9551 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.insert_event_record-----------' ;
9552 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9553
9554 END IF;
9555
9556 l_SobId := G_SET_OF_BOOKS_ID;
9557
9558 IF p_bill_trans_rev_amount = 0 THEN
9559
9560 l_ZeroRevAmtFlag := 'Y';
9561
9562 ELSE
9563
9564 l_ZeroRevAmtFlag := 'N';
9565
9566 END IF;
9567
9568 /* If processing is only for primary, and if realized gain/loss amount is zero event should
9569 not be created. If RC is also involved, then the event should be created and checked for
9570 zero dollar events in all reporting set of books. If zero, the record(s) will be deleted */
9571
9572 IF ((p_bill_trans_rev_amount <> 0) OR (G_PRIMARY_ONLY = 'N')) THEN
9573
9574 SELECT nvl(max(event_num),0) into l_EventNum
9575 FROM pa_events
9576 WHERE project_id = G_RevalCompTab(l_SobId).project_id
9577 AND nvl(task_id,0) = nvl(G_RevalCompTab(l_SobId).task_id,0);
9578
9579 l_EventNum := l_EventNum + 1;
9580
9581 IF G_DEBUG_MODE = 'Y' THEN
9582
9583 l_LogMsg := 'Event Num:' || l_EventNum;
9584 PA_FUND_REVAL_UTIL.Log_Message(p_message=>l_LogMsg);
9585
9586 END IF;
9587
9588 pa_events_pkg.insert_row (
9589 X_Rowid => l_RowId ,
9590 X_Event_Id => l_EventId ,
9591 X_Task_Id => p_task_id ,
9592 X_Event_Num => l_EventNum ,
9593 X_Last_Update_Date => SYSDATE ,
9594 X_Last_Updated_By => G_LAST_UPDATED_BY ,
9595 X_Creation_Date => SYSDATE ,
9596 X_Created_By => G_LAST_UPDATED_BY ,
9597 X_Last_Update_Login => G_LAST_UPDATE_LOGIN ,
9598 X_Event_Type => p_event_type ,
9599 X_Description => p_event_desc ,
9600 X_Bill_Amount => 0 ,
9601 X_Revenue_Amount => 0 ,
9602 X_Revenue_Distributed_Flag => 'N' ,
9603 X_Zero_Revenue_Amount_Flag => l_ZeroRevAmtFlag,
9604 X_Bill_Hold_Flag => 'N' ,
9605 X_Completion_Date => G_RATE_DATE ,
9606 X_Rev_Dist_Rejection_Code => NULL ,
9607 X_Attribute_Category => NULL ,
9608 X_Attribute1 => NULL ,
9609 X_Attribute2 => NULL ,
9610 X_Attribute3 => NULL ,
9611 X_Attribute4 => NULL ,
9612 X_Attribute5 => NULL ,
9613 X_Attribute6 => NULL ,
9614 X_Attribute7 => NULL ,
9615 X_Attribute8 => NULL ,
9616 X_Attribute9 => NULL ,
9617 X_Attribute10 => NULL ,
9618 X_Project_Id => p_project_id ,
9619 X_Organization_Id => G_ProjLvlGlobRec.carrying_out_organization_id ,
9620 X_Billing_Assignment_Id => NULL ,
9621 X_Event_Num_Reversed => NULL ,
9622 X_Calling_Place => NULL ,
9623 X_Calling_Process => NULL ,
9624 X_Bill_Trans_Currency_Code => G_RevalCompTab(l_SobId).projfunc_currency_code ,
9625 X_Bill_Trans_Bill_Amount => 0 , -- Changed from NULL for bug2829565
9626 X_Bill_Trans_rev_Amount => p_bill_trans_rev_amount ,
9627 X_Project_Currency_Code => G_RevalCompTab(l_SobId).project_currency_code ,
9628 X_Project_Rate_Type => NULL ,
9629 X_Project_Rate_Date => NULL ,
9630 X_Project_Exchange_Rate => NULL ,
9631 X_Project_Inv_Rate_Date => NULL ,
9632 X_Project_Inv_Exchange_Rate => NULL ,
9633 X_Project_Bill_Amount => NULL ,
9634 X_Project_Rev_Rate_Date => NULL ,
9635 X_Project_Rev_Exchange_Rate => NULL ,
9636 X_Project_Revenue_Amount => NULL ,
9637 X_ProjFunc_Currency_Code => G_RevalCompTab(l_SobId).projfunc_currency_code ,
9638 X_ProjFunc_Rate_Type => NULL ,
9639 X_ProjFunc_Rate_Date => NULL ,
9640 X_ProjFunc_Exchange_Rate => NULL ,
9641 X_ProjFunc_Inv_Rate_Date => NULL ,
9642 X_ProjFunc_Inv_Exchange_Rate => NULL ,
9643 X_ProjFunc_Bill_Amount => NULL ,
9644 X_ProjFunc_Rev_Rate_Date => NULL ,
9645 X_Projfunc_Rev_Exchange_Rate => NULL ,
9646 X_ProjFunc_Revenue_Amount => NULL ,
9647 X_Funding_Rate_Type => NULL ,
9648 X_Funding_Rate_Date => NULL ,
9649 X_Funding_Exchange_Rate => NULL ,
9650 X_Invproc_Currency_Code => G_RevalCompTab(l_SobId).invproc_currency_code ,
9651 X_Invproc_Rate_Type => NULL ,
9652 X_Invproc_Rate_Date => NULL ,
9653 X_Invproc_Exchange_Rate => NULL ,
9654 X_Revproc_Currency_Code => G_RevalCompTab(l_SobId).projfunc_currency_code ,
9655 X_Revproc_Rate_Type => NULL ,
9656 X_Revproc_Rate_Date => NULL ,
9657 X_Revproc_Exchange_Rate => NULL ,
9658 X_Inv_Gen_Rejection_Code => NULL ,
9659 X_Adjusting_Revenue_Flag => NULL ,
9660 X_non_updateable_flag => 'Y' ,
9661 X_revenue_hold_flag => 'Y' ,
9662 X_project_funding_id => p_project_funding_id,
9663 X_agreement_id => p_agreement_id);
9664
9665 l_NonZeroExists := 'N';
9666
9667 IF G_PRIMARY_ONLY = 'N' THEN /* Check for non zero amounts in all set of books */
9668
9669 OPEN check_all_non_zero_amt (l_EventId);
9670 FETCH check_all_non_zero_amt INTO l_NonZeroExists;
9671 CLOSE check_all_non_zero_amt;
9672
9673 ELSE
9674
9675 l_NonZeroExists := 'Y';
9676
9677 END IF;
9678
9679 IF NVL(l_NonZeroExists, 'N') = 'N' THEN
9680
9681 DELETE FROM pa_events
9682 WHERE event_id = l_EventId;
9683
9684 END IF;
9685
9686 END IF; /* ((p_bill_trans_rev_amount <> 0) OR (G_PRIMARY_ONLY = 'N')) */
9687
9688 IF G_DEBUG_MODE = 'Y' THEN
9689
9690 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.insert_event_record-----------' ;
9691 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9692
9693 END IF;
9694
9695 EXCEPTION
9696 WHEN FND_API.G_EXC_ERROR THEN
9697 x_return_status := l_return_status;
9698 x_msg_count := l_msg_count;
9699 x_msg_data := l_msg_data;
9700
9701 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9702 x_return_status := l_return_status;
9703 x_msg_count := l_msg_count;
9704 x_msg_data := l_msg_data;
9705
9706 WHEN OTHERS THEN
9707 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9708 x_msg_count := l_msg_count;
9709 x_msg_data := SUBSTR(SQLERRM,1,100);
9710
9711 IF G_DEBUG_MODE = 'Y' THEN
9712
9713 PA_DEBUG.g_err_stage := 'insert_event_record:' || x_msg_data ;
9714 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9715
9716 END IF;
9717
9718 END insert_event_record;
9719
9720 /*----------------------------------------------------------------------------------------+
9721 | Procedure : get_ar_amounts |
9722 | Purpose : To get applied/fxgl amounts from AR |
9723 | Parameters : |
9724 | ================================================================================== |
9725 | Name Mode Description |
9726 | ================================================================================== |
9727 | p_customer_trx_id IN System Reference of Invoice Record |
9728 | p_Invoice_Status IN Indicates if the input invoice status is accepted |
9729 | in AR or Not |
9730 | x_ArAmtsTab OUT Appled/FXGL amounts for the given invoice record |
9731 | in all set of books id |
9732 | x_return_status OUT Return status of this procedure |
9733 | x_msg_count OUT Error message count |
9734 | x_msg_data OUT Error message |
9735 | ================================================================================== |
9736 +----------------------------------------------------------------------------------------*/
9737
9738 PROCEDURE get_ar_amounts(
9739 p_customer_trx_id IN NUMBER,
9740 p_invoice_status IN VARCHAR2,
9741 x_ArAmtsTab OUT NOCOPY ArAmtsTabTyp,
9742 x_return_status OUT NOCOPY VARCHAR2,
9743 x_msg_count OUT NOCOPY NUMBER,
9744 x_msg_data OUT NOCOPY VARCHAR2) IS
9745
9746
9747 l_return_status VARCHAR2(30) := NULL;
9748 l_msg_count NUMBER := NULL;
9749 l_msg_data VARCHAR2(250) := NULL;
9750
9751 l_LogMsg VARCHAR2(250);
9752 l_ArAmtsTab ArAmtsTabTyp;
9753
9754 l_ApplicationId NUMBER := 275;
9755 l_ProcessRsob VARCHAR2(1);
9756 l_AppliedAmtList ARP_PA_UTILS.r_appl_amt_list;
9757 l_SobIdIdx NUMBER;
9758
9759 BEGIN
9760 x_return_status := FND_API.G_RET_STS_SUCCESS;
9761 x_msg_count := 0;
9762
9763 IF G_DEBUG_MODE = 'Y' THEN
9764
9765 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_ar_amounts-----------' ;
9766 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9767
9768 END IF;
9769
9770 x_ArAmtsTab := l_ArAmtsTab;
9771
9772 IF ((G_ProjLvlGlobRec.include_gains_losses_flag = 'Y') AND
9773 (p_invoice_status = 'A') AND (G_AR_INSTALLED_FLAG = 'Y')) THEN
9774
9775
9776 IF G_AR_PRIMARY_ONLY = 'Y' THEN /* Do not process for reporting set of books */
9777
9778 l_ProcessRsob := 'N';
9779
9780 ELSE
9781
9782 l_ProcessRsob := 'Y'; /* Process for reporting set of books */
9783 END IF;
9784
9785
9786 ARP_PA_UTILS. get_line_applied(
9787 p_application_id => l_ApplicationId,
9788 p_customer_trx_id => p_customer_trx_id,
9789 p_as_of_date => G_THRU_DATE,
9790 p_process_rsob => l_ProcessRsob,
9791 x_applied_amt_list => l_AppliedAmtList,
9792 x_return_status => l_return_status,
9793 x_msg_count => l_msg_count,
9794 x_msg_data => l_msg_data);
9795
9796
9797 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9798
9799 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9800
9801 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
9802
9803 RAISE FND_API.G_EXC_ERROR;
9804
9805 END IF;
9806
9807 /* AR uses acctd amount for projfunc amount and amount for transaction amount
9808 Moving the data to suit PA terminology as it is widely used in the code */
9809
9810 IF l_AppliedAmtList.COUNT <> 0 THEN
9811
9812 /*
9813 l_SobIdIdx := l_AppliedAmtList.FIRST;
9814 */
9815
9816 l_SobIdIdx := G_SobListTab.FIRST;
9817
9818 LOOP
9819
9820 EXIT WHEN l_SobIdIdx IS NULL;
9821
9822 IF (l_AppliedAmtList.EXISTS(l_SobIdIdx)) THEN
9823
9824 l_ArAmtsTab(l_SobIdIdx).set_of_books_id := l_AppliedAmtList(l_SobIdIdx).sob_id ;
9825 l_ArAmtsTab(l_SobIdIdx).inv_applied_amount := l_AppliedAmtList(l_SobIdIdx).amount_applied ;
9826 l_ArAmtsTab(l_SobIdIdx).projfunc_applied_amount := l_AppliedAmtList(l_SobIdIdx).acctd_amount_applied ;
9827 l_ArAmtsTab(l_SobIdIdx).projfunc_gain_amount := l_AppliedAmtList(l_SobIdIdx).exchange_gain;
9828 l_ArAmtsTab(l_SobIdIdx).projfunc_loss_amount := l_AppliedAmtList(l_SobIdIdx).exchange_loss;
9829 l_ArAmtsTab(l_SobIdIdx).inv_adjusted_amount := nvl(l_AppliedAmtList(l_SobIdIdx).line_adjusted,0); /* Added for bug 7237486 */
9830 l_ArAmtsTab(l_SobIdIdx).projfunc_adjusted_amount := nvl(l_AppliedAmtList(l_SobIdIdx).acctd_line_adjusted,0); /* Added for bug 7237486 */
9831 IF G_DEBUG_MODE = 'Y' THEN
9832
9833 l_LogMsg := 'Sob:' || l_SobIdIdx ||
9834 ' ITC Appl amt:' || l_ArAmtsTab(l_SobIdIdx).inv_applied_amount ||
9835 ' PFC Appl amt:' || l_ArAmtsTab(l_SobIdIdx).projfunc_applied_amount ||
9836 ' PFC gain amt:' || l_ArAmtsTab(l_SobIdIdx).projfunc_gain_amount ||
9837 ' PFC loss amt:' || l_ArAmtsTab(l_SobIdIdx).projfunc_loss_amount ||
9838 ' AR Adj amt in IC :' || l_ArAmtsTab(l_SobIdIdx).inv_adjusted_amount ||
9839 ' AR Adj amt in PFCC :' || l_ArAmtsTab(l_SobIdIdx).projfunc_adjusted_amount; /* Added for bug 7237486*/
9840 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
9841
9842 END IF;
9843
9844 ELSE
9845
9846 l_ArAmtsTab(l_SobIdIdx).set_of_books_id := l_SobIdIdx ;
9847 l_ArAmtsTab(l_SobIdIdx).inv_applied_amount := 0;
9848 l_ArAmtsTab(l_SobIdIdx).projfunc_applied_amount := 0 ;
9849 l_ArAmtsTab(l_SobIdIdx).projfunc_gain_amount := 0;
9850 l_ArAmtsTab(l_SobIdIdx).projfunc_loss_amount := 0 ;
9851 l_ArAmtsTab(l_SobIdIdx).inv_adjusted_amount := 0; /* Added for bug 7237486 */
9852 l_ArAmtsTab(l_SobIdIdx).projfunc_adjusted_amount := 0; /* Added for bug 7237486 */
9853
9854 END IF;
9855
9856 l_SobIdIdx := G_SobListTab.NEXT(l_SobIdIdx);
9857 /*
9858 l_SobIdIdx := l_AppliedAmtList.NEXT(l_SobIdIdx);
9859 */
9860
9861 END LOOP;
9862
9863 END IF; /* l_AppliedAmtList.COUNT <> 0 */
9864
9865 END IF;
9866 x_ArAmtsTab := l_ArAmtsTab;
9867
9868 IF G_DEBUG_MODE = 'Y' THEN
9869
9870 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_ar_amounts-----------' ;
9871 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9872
9873 END IF;
9874
9875 EXCEPTION
9876 WHEN FND_API.G_EXC_ERROR THEN
9877 x_return_status := l_return_status;
9878 x_msg_count := l_msg_count;
9879 x_msg_data := l_msg_data;
9880
9881 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9882 x_return_status := l_return_status;
9883 x_msg_count := l_msg_count;
9884 x_msg_data := l_msg_data;
9885
9886 WHEN OTHERS THEN
9887 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9888 x_msg_count := l_msg_count;
9889 x_msg_data := SUBSTR(SQLERRM,1,100);
9890
9891 IF G_DEBUG_MODE = 'Y' THEN
9892
9893 PA_DEBUG.g_err_stage := 'get_ar_amounts:' || x_msg_data ;
9894 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9895
9896 END IF;
9897
9898 END get_ar_amounts;
9899
9900 /*----------------------------------------------------------------------------------------+
9901 | Procedure : Clear_distribution_warnings |
9902 | Purpose : To delete any rejection reason that is logged by revaluation process |
9903 | for the request id |
9904 | Parameters : |
9905 | ================================================================================== |
9906 | Name Mode Description |
9907 | ================================================================================== |
9908 | p_request_id IN Request ID |
9909 | x_return_status OUT Return status of this procedure |
9910 | x_msg_count OUT Error message count |
9911 | x_msg_data OUT Error message |
9912 | ================================================================================== |
9913 +----------------------------------------------------------------------------------------*/
9914 PROCEDURE clear_distribution_warnings(
9915 p_request_id IN NUMBER,
9916 x_return_status OUT NOCOPY VARCHAR2,
9917 x_msg_count OUT NOCOPY NUMBER,
9918 x_msg_data OUT NOCOPY VARCHAR2) IS
9919
9920
9921 l_return_status VARCHAR2(30) := NULL;
9922 l_msg_count NUMBER := NULL;
9923 l_msg_data VARCHAR2(250) := NULL;
9924
9925 l_LogMsg VARCHAR2(250);
9926
9927 BEGIN
9928 x_return_status := FND_API.G_RET_STS_SUCCESS;
9929 x_msg_count := 0;
9930
9931 IF G_DEBUG_MODE = 'Y' THEN
9932
9933 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.clear_distribution_warnings-----------' ;
9934 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9935
9936 END IF;
9937
9938 DELETE from pa_distribution_warnings
9939 WHERE request_id = p_request_id;
9940
9941 COMMIT;
9942
9943 IF G_DEBUG_MODE = 'Y' THEN
9944
9945 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.clear_distribution_warnings-----------' ;
9946 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9947
9948 END IF;
9949
9950 EXCEPTION
9951
9952 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9953 x_return_status := l_return_status;
9954 x_msg_count := l_msg_count;
9955 x_msg_data := l_msg_data;
9956
9957 WHEN OTHERS THEN
9958 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9959 x_msg_count := l_msg_count;
9960 x_msg_data := SUBSTR(SQLERRM,1,100);
9961
9962 IF G_DEBUG_MODE = 'Y' THEN
9963
9964 PA_DEBUG.g_err_stage := 'clear_distribution_warnings:' || x_msg_data ;
9965 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
9966
9967 END IF;
9968
9969 END clear_distribution_warnings;
9970
9971 /*----------------------------------------------------------------------------------------+
9972 | Procedure : check_accrued_billed_level |
9973 | Purpose : Generate warning message if sum of |
9974 | pfc baselined amount and pfc adjustment amount goes below |
9975 | pfc accrued amount |
9976 | ipc baselined amount and ipc adjustment amount goes below |
9977 | ipc billed amount |
9978 | Parameters : |
9979 | ================================================================================== |
9980 | Name Mode Description |
9981 | ================================================================================== |
9982 | x_return_status OUT Return status of this procedure |
9983 | x_msg_count OUT Error message count |
9984 | x_msg_data OUT Error message |
9985 | ================================================================================== |
9986 +----------------------------------------------------------------------------------------*/
9987
9988 PROCEDURE check_accrued_billed_level(
9989 x_return_status OUT NOCOPY VARCHAR2,
9990 x_msg_count OUT NOCOPY NUMBER,
9991 x_msg_data OUT NOCOPY VARCHAR2) IS
9992
9993 l_SobId NUMBER;
9994 l_TotalPFCAmount NUMBER;
9995 l_TotalIPCAmount NUMBER;
9996
9997 l_ReasonCode VARCHAR2(30);
9998
9999
10000 l_return_status VARCHAR2(30) := NULL;
10001 l_msg_count NUMBER := NULL;
10002 l_msg_data VARCHAR2(250) := NULL;
10003 l_LogMsg VARCHAR2(250);
10004
10005
10006
10007 BEGIN
10008 x_return_status := FND_API.G_RET_STS_SUCCESS;
10009 x_msg_count := 0;
10010
10011 IF G_DEBUG_MODE = 'Y' THEN
10012
10013 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.check_accrued_billed_level-----------' ;
10014 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
10015
10016 END IF;
10017
10018 l_SobId := G_SET_OF_BOOKS_ID;
10019
10020 l_TotalPFCAmount := G_RevalCompTab(l_SobId).projfunc_baselined_amount + G_RevalCompTab(l_SobId).projfunc_allocated_amount;
10021 l_TotalIPCAmount := G_RevalCompTab(l_SobId).invproc_baselined_amount + G_RevalCompTab(l_SobId).invproc_allocated_amount;
10022
10023 IF l_TotalPFCAmount < nvl(G_RevalCompTab(l_SobId).projfunc_accrued_amount,0) THEN
10024
10025 l_ReasonCode := 'PA_FR_ACCRUED_LT_BASELINED_AMT';
10026
10027 IF G_DEBUG_MODE = 'Y' THEN
10028
10029 l_LogMsg := l_ReasonCode;
10030 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
10031
10032 END IF;
10033
10034 Insert_distribution_warnings(
10035 p_project_id => G_RevalCompTab(l_SobId).project_id,
10036 p_agreement_id => G_RevalCompTab(l_SobId).agreement_id,
10037 p_task_id => G_RevalCompTab(l_SobId).task_id,
10038 p_reason_code => l_ReasonCode,
10039 x_return_status => l_return_status,
10040 x_msg_count => l_msg_count,
10041 x_msg_data => l_msg_data) ;
10042
10043
10044 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10045
10046 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10047
10048 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
10049
10050 RAISE FND_API.G_EXC_ERROR;
10051
10052 END IF;
10053
10054
10055 END IF;
10056
10057 IF l_TotalIPCAmount < nvl(G_RevalCompTab(l_SobId).invproc_billed_amount,0) THEN
10058
10059 l_ReasonCode := 'PA_FR_BILLED_LT_BASELINED_AMT';
10060
10061 IF G_DEBUG_MODE = 'Y' THEN
10062
10063 l_LogMsg := l_ReasonCode;
10064 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
10065
10066 END IF;
10067
10068 Insert_distribution_warnings(
10069 p_project_id => G_RevalCompTab(l_SobId).project_id,
10070 p_agreement_id => G_RevalCompTab(l_SobId).agreement_id,
10071 p_task_id => G_RevalCompTab(l_SobId).task_id,
10072 p_reason_code => l_ReasonCode,
10073 x_return_status => l_return_status,
10074 x_msg_count => l_msg_count,
10075 x_msg_data => l_msg_data) ;
10076
10077
10078 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10079
10080 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10081
10082 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
10083
10084 RAISE FND_API.G_EXC_ERROR;
10085
10086 END IF;
10087
10088 END IF;
10089
10090 IF G_DEBUG_MODE = 'Y' THEN
10091
10092 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.check_accrued_billed_level-----------' ;
10093 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
10094
10095 END IF;
10096
10097 EXCEPTION
10098
10099 WHEN FND_API.G_EXC_ERROR THEN
10100 x_return_status := l_return_status;
10101 x_msg_count := l_msg_count;
10102 x_msg_data := l_msg_data;
10103
10104 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10105 x_return_status := l_return_status;
10106 x_msg_count := l_msg_count;
10107 x_msg_data := l_msg_data;
10108
10109 WHEN OTHERS THEN
10110 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10111 x_msg_count := l_msg_count;
10112 x_msg_data := SUBSTR(SQLERRM,1,100);
10113
10114 IF G_DEBUG_MODE = 'Y' THEN
10115
10116 PA_DEBUG.g_err_stage := 'check_accrued_billed_level:' || x_msg_data ;
10117 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
10118
10119 END IF;
10120
10121 END check_accrued_billed_level;
10122
10123 /*----------------------------------------------------------------------------------------+
10124 | Procedure : Get_Delete_Projects |
10125 | Purpose : To open all projects eligible for funding revaluation and has |
10126 | unbaselined adjustment lines |
10127 | given project numbers |
10128 | Parameters : |
10129 | ================================================================================== |
10130 | Name Mode Description |
10131 | ================================================================================== |
10132 | p_project_id IN Project ID |
10133 | p_project_type_id IN Project Type ID |
10134 | p_from_proj_number IN Start project number |
10135 | p_to_proj_number IN End project number |
10136 | p_run_mode IN Run mode |
10137 | Values are 'SINGLE', 'RANGE' |
10138 | x_return_status OUT Return status of this procedure |
10139 | x_msg_count OUT Error message count |
10140 | x_msg_data OUT Error message |
10141 | ================================================================================== |
10142 +----------------------------------------------------------------------------------------*/
10143 PROCEDURE get_delete_projects(
10144 p_project_type_id IN NUMBER,
10145 p_from_proj_number IN VARCHAR2,
10146 p_to_proj_number IN VARCHAR2,
10147 p_run_mode IN VARCHAR2,
10148 x_return_status OUT NOCOPY VARCHAR2,
10149 x_msg_count OUT NOCOPY NUMBER,
10150 x_msg_data OUT NOCOPY VARCHAR2) IS
10151
10152
10153 /* This CURSOR selects all projects with the following criteria
10154 a) should be contract projects
10155 b) revaluate_funding_flag is enabled
10156 c) has unbaselined adjustments */
10157
10158 CURSOR open_projects IS
10159 SELECT P.segment1, P.project_id, P.baseline_funding_flag,
10160 P.include_gains_losses_flag include_gains_losses_flag
10161 FROM pa_projects P, pa_project_types T
10162 WHERE P.segment1 BETWEEN p_from_proj_number
10163 AND p_to_proj_number
10164 AND P.PROJECT_TYPE = T.PROJECT_TYPE
10165 AND T.DIRECT_FLAG = 'Y'
10166 AND T.PROJECT_TYPE_ID = NVL(P_PROJECT_TYPE_ID ,T.project_type_id)
10167 AND NVL(P.revaluate_funding_flag, 'N') = 'Y'
10168 AND NVL(P.template_flag, 'N') = 'N'
10169 AND exists ( SELECT NULL
10170 FROM pa_project_fundings
10171 WHERE project_id = P.project_id
10172 AND funding_category = 'REVALUATION'
10173 AND budget_type_code = 'DRAFT')
10174 ORDER BY segment1 ;
10175
10176 l_return_status VARCHAR2(30) := NULL;
10177 l_msg_count NUMBER := NULL;
10178 l_msg_data VARCHAR2(250) := NULL;
10179 l_ErrCode NUMBER := NULL;
10180 l_LogMsg VARCHAR2(250);
10181
10182 BEGIN
10183 x_return_status := FND_API.G_RET_STS_SUCCESS;
10184 x_msg_count := 0;
10185
10186 IF G_DEBUG_MODE = 'Y' THEN
10187
10188 PA_DEBUG.g_err_stage := '-----------Entering PA_FUND_REVAL_PVT.get_delete_projects-----------' ;
10189 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
10190
10191 l_LogMsg := 'From prj:' || p_from_proj_number ||
10192 ' To prj:' || p_to_proj_number ||
10193 ' Proj type:' || p_project_type_id ;
10194 PA_FUND_REVAL_UTIL.Log_Message(l_LogMsg);
10195
10196 END IF;
10197
10198
10199 FOR proj_rec in open_projects LOOP
10200
10201 IF G_DEBUG_MODE = 'Y' THEN
10202
10203 l_LogMsg := 'Project ID :' || proj_rec.project_id ;
10204 PA_FUND_REVAL_UTIL.Log_Message(p_message => l_LogMsg);
10205
10206 END IF;
10207
10208
10209 Delete_unbaselined_adjmts(
10210 p_project_id => proj_rec.project_id,
10211 p_run_mode => p_run_mode,
10212 x_return_status => l_return_status,
10213 x_msg_count => l_msg_count,
10214 x_msg_data => l_msg_data) ;
10215
10216 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10217
10218 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10219
10220 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
10221
10222 RAISE FND_API.G_EXC_ERROR;
10223
10224 END IF;
10225
10226 COMMIT; /* Commit delete for the current project */
10227
10228 END LOOP;
10229
10230 IF G_DEBUG_MODE = 'Y' THEN
10231
10232 PA_DEBUG.g_err_stage := '-----------Exiting PA_FUND_REVAL_PVT.get_delete_projects-----------' ;
10233 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
10234
10235 END IF;
10236
10237 EXCEPTION
10238
10239 WHEN FND_API.G_EXC_ERROR THEN
10240 x_return_status := l_return_status;
10241 x_msg_count := l_msg_count;
10242 x_msg_data := l_msg_data;
10243
10244 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10245 x_return_status := l_return_status;
10246 x_msg_count := l_msg_count;
10247 x_msg_data := l_msg_data;
10248
10249 WHEN OTHERS THEN
10250 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10251 x_msg_count := l_msg_count;
10252 x_msg_data := SUBSTR(SQLERRM,1,100);
10253
10254 IF G_DEBUG_MODE = 'Y' THEN
10255
10256 PA_DEBUG.g_err_stage := 'get_reval_projects:' || x_msg_data ;
10257 PA_FUND_REVAL_UTIL.Log_Message(p_message => PA_DEBUG.g_err_stage);
10258
10259 END IF;
10260
10261 END get_delete_projects;
10262
10263 END PA_FUND_REVAL_PVT;