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