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