DBA Data[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;