DBA Data[Home] [Help]

PACKAGE BODY: APPS.PO_PARTIAL_FUNDING_PKG

Source


1 PACKAGE BODY po_partial_funding_pkg AS
2 /* $Header: PO_PARTIAL_FUNDING_PKG.plb 120.12.12020000.3 2013/04/08 09:13:46 dtoshniw ship $ */
3   d_pkg_name  CONSTANT VARCHAR2(50) := po_log.Get_package_base('PO_PARTIAL_FUNDING_PKG');
4 
5   /*=======================================================================+
6 | FILENAME
7 |   PO_PARTIAL_FUNDING_PKG.plB
8 |
9 | DESCRIPTION
10 |   PL/SQL body for package:  PO_PARTIAL_FUNDING_PKG
11 |
12 | NOTES
13 | MODIFIED
14 *=====================================================================*/
15   FUNCTION Is_clm_document
16        (p_doc_type      IN VARCHAR2,
17         p_doc_level_id  IN NUMBER)
18   RETURN VARCHAR2
19   IS
20     d_api_name      CONSTANT VARCHAR2(30) := 'Is_CLM_Document';
21     d_module        CONSTANT VARCHAR2(100) := d_pkg_name
22                                               ||d_api_name;
23     d_progress      NUMBER;
24     l_clm_document  VARCHAR2(1) := 'N';  -- Y if its a CLM Document and N if its a Non-CLM Document
25 
26   BEGIN
27     d_progress := 10;
28 
29     IF (po_log.d_proc) THEN
30       po_log.Proc_begin(d_module);
31 
32       po_log.Proc_begin(d_module,'p_Doc_type',p_doc_type);
33 
34       po_log.Proc_begin(d_module,'p_Doc_Level_Id',p_doc_level_id);
35     END IF;
36 
37     d_progress := 20;
38 
39     IF p_doc_type = 'REQ' THEN
40       SELECT 'Y'
41       INTO   l_clm_document
42       FROM   po_requisition_headers_all
43       WHERE  requisition_header_id = p_doc_level_id
44              AND Nvl(federal_flag,'N') = 'Y';
45     ELSE
46       SELECT 'Y'
47       INTO   l_clm_document
48       FROM   po_headers_all h,
49              po_doc_style_headers pdsh
50       WHERE  h.po_header_id = p_doc_level_id
51              AND h.style_id = pdsh.style_id
52              AND Nvl(pdsh.clm_flag,'N') = 'Y';
53     END IF;
54 
55     d_progress := 30;
56 
57     IF po_log.d_stmt THEN
58       po_log.Stmt(d_module,d_progress,'l_Clm_Document: '
59                                       ||l_clm_document);
60     END IF;
61 
62     RETURN l_clm_document;
63   EXCEPTION
64     WHEN no_data_found THEN
65       l_clm_document := 'N';
66 
67       RETURN l_clm_document;
68     WHEN OTHERS THEN
69       IF po_log.d_stmt THEN
70         po_log.Stmt(d_module,d_progress,'Error is : ',sqlerrm);
71       END IF;
72   END;
73 
74   FUNCTION Is_clm_enabled
75   RETURN VARCHAR2
76   IS
77     d_api_name     CONSTANT VARCHAR2(30) := 'is_CLM_Enabled';
78     d_module       CONSTANT VARCHAR2(100) := d_pkg_name
79                                              ||d_api_name;
80     d_progress     NUMBER;
81     l_clm_enabled  VARCHAR2(1) := 'N';  -- Y if its a CLM Installed and N if its a Non-CLM installed
82 
83   BEGIN
84 
85     l_clm_enabled := NVL(FND_PROFILE.VALUE('PO_CLM_INSTALLED'),'N');
86 
87     RETURN l_clm_enabled;
88   EXCEPTION
89     WHEN OTHERS THEN
90       IF po_log.d_stmt THEN
91         po_log.Stmt(d_module,d_progress,'Error is : ',sqlerrm);
92       END IF;
93 
94       RETURN l_clm_enabled;
95   END;
96 
97 -- <<ACRN proj start>>
98   -- Added p_org_id as part of CLM Controls Project changes
99   FUNCTION Is_ACRN_enabled
100   (
101    p_org_id NUMBER
102   )
103   RETURN VARCHAR2
104   IS
105     d_api_name     CONSTANT VARCHAR2(30) := 'is_ACRN_enabled';
106     d_module       CONSTANT VARCHAR2(100) := d_pkg_name
107                                              ||d_api_name;
108     d_progress     NUMBER;
109 	l_CLM      VARCHAR2(1) := 'N';
110 	l_ACRN     VARCHAR2(1) := 'N';
111     l_ACRN_enabled  VARCHAR2(1) := 'N';  -- Y if its a ACRN enabled
112   BEGIN
113   --ACRN Refactoring Changes Begin
114    l_CLM := Is_clm_enabled;
115    --CLM Controls Project changes
116    l_ACRN := PO_CORE_S.retrieveOptionValue(p_org_id => p_org_id,
117                                            p_option_column => PO_CORE_S.g_ACRN_COL);
118    --NVL(FND_PROFILE.VALUE('PO_CLM_ENABLE_ACRN'),'N');
119    IF l_CLM <> 'N' AND l_ACRN <> 'N' THEN
120 		l_ACRN_enabled := 'Y';
121    END IF;
122    --ACRN Refactoring Changes end.
123    RETURN l_ACRN_enabled;
124 
125   EXCEPTION
126     WHEN OTHERS THEN
127       IF po_log.d_stmt THEN
128         po_log.Stmt(d_module,d_progress,'Error is : ',sqlerrm);
129       END IF;
130 
131   END;
132 
133   -- <<ACRN proj end>>
134 
135 
136 /*
137 This Procedure should be able to recalculate the Partial Funding attributes.
138 */
139   PROCEDURE recalculate_pf_attributes
140        (p_doc_header_id  IN NUMBER)
141   IS
142     d_api_name          CONSTANT VARCHAR2(30) := 'recalculate_pf_attributes';
143     d_module            CONSTANT VARCHAR2(100) := d_pkg_name
144                                            ||d_api_name;
145     d_progress          NUMBER;
146     l_return_status     VARCHAR2(30);
147     l_is_clm_enabled VARCHAR2(1);
148     l_style_id          NUMBER;
149     l_po_enc_flag FINANCIALS_SYSTEM_PARAMS_ALL.purch_encumbrance_flag%TYPE;
150   BEGIN
151 
152     d_progress := 10;
153 
154     IF (po_log.d_proc) THEN
155       po_log.Proc_begin(d_module);
156       po_log.Proc_begin(d_module,'p_doc_header_id',p_doc_header_id);
157     END IF;
158 
159     SELECT NVL(style_id,-1)
160     INTO   l_style_id
161     FROM   po_headers_all
162     WHERE  po_header_id = p_doc_header_id;
163 
164     l_is_clm_enabled := po_doc_style_helper.get_clm_flag(p_style_id => l_style_id);
165 
166     SELECT NVL(purch_encumbrance_flag,'N')
167     INTO l_po_enc_flag
168     FROM financials_system_params_all fsp,
169          po_headers_all poh
170     WHERE poh.po_header_id = p_doc_header_id
171           AND fsp.org_id = poh.org_id;
172 
173     IF (l_po_enc_flag = 'Y' AND l_is_clm_enabled = 'Y') THEN
174 
175       Updt_funding_info(p_document_type => 'STANDARD',
176                         p_doc_header_id => p_doc_header_id,
177                         x_return_status => l_return_status);
178 
179     END IF;
180 
181     IF (po_log.d_proc) THEN
182       po_log.Proc_end(d_module,'p_doc_header_id',p_doc_header_id);
183     END IF;
184 
185   EXCEPTION
186     WHEN OTHERS THEN
187       IF (po_log.d_exc) THEN
188         po_log.Exc(d_module,d_progress,SQLCODE
189                                        ||sqlerrm);
190       END IF;
191   END recalculate_pf_attributes;
192 
193 
194 
195   /* <> */
196   /*
197 This function should be able to calculate and update Qty Funded and amt funded to
198 */
199   PROCEDURE Updt_funding_info
200        (x_return_status  OUT NOCOPY VARCHAR2,
201         p_document_type  IN VARCHAR2,
202         p_doc_header_id  IN NUMBER,
203         p_draft_id       IN NUMBER DEFAULT -1)
204   IS
205     d_api_name          CONSTANT VARCHAR2(30) := 'Updt_Funding_Info';
206     d_module            CONSTANT VARCHAR2(100) := d_pkg_name
207                                                   ||d_api_name;
208     d_progress          NUMBER;
209     l_dist_id_tbl       PO_TBL_NUMBER;
210     l_price_tbl         PO_TBL_NUMBER;
211     l_match_basis_tbl   PO_TBL_VARCHAR20;
212     l_qty_ordered_tbl   PO_TBL_NUMBER;
213     l_amt_ordered_tbl   PO_TBL_NUMBER;
214     l_partial_flag_tbl  PO_TBL_VARCHAR1;
215     l_fund_value_tbl    PO_TBL_NUMBER;
216     l_nr_tax_tbl        PO_TBL_NUMBER;
217     l_rate_tbl          PO_TBL_NUMBER;
218     l_qty_funded_tbl    PO_TBL_NUMBER;
219     l_amt_funded_tbl    PO_TBL_NUMBER;
220     -- Bug 16475592: Changing data type of l_func_currency_tbl from table of number
221     -- to table of varchar as the data is inserted from GL_SETS_OF_BOOKS, currency
222     -- code column which has varchar2 data type.
223     l_func_currency_tbl  PO_TBL_VARCHAR20;
224 
225     x_precision          NUMBER  := NULL;
226     x_ext_precision      NUMBER  := NULL;
227     x_min_acct_unit      NUMBER  := NULL;
228 
229   BEGIN
230     d_progress := 10;
231     IF Is_clm_document(p_document_type,p_doc_header_id) <> 'Y' THEN
232       RETURN;
233     END IF;
234 
235     --13943396 Added currency_code to extract the precision value
236     IF p_document_type = 'REQUISITION' THEN
237     d_progress := 20;
238       SELECT d.distribution_id,
239              Nvl(l.unit_price,0),
240              Nvl(l.matching_basis,'QUANTITY'),
241              d.req_line_quantity,
242              d.req_line_amount,
243              Nvl(d.partial_funded_flag,'N'),
244              Nvl(d.funded_value,0),
245              Nvl(d.nonrecoverable_tax,0),
246              1,
247              d.quantity_funded,
248              d.amount_funded,
249              GLSOB.CURRENCY_CODE
250       BULK COLLECT INTO l_dist_id_tbl,l_price_tbl,l_match_basis_tbl,l_qty_ordered_tbl,
251              l_amt_ordered_tbl,l_partial_flag_tbl,l_fund_value_tbl,l_nr_tax_tbl,
252              l_rate_tbl,l_qty_funded_tbl,l_amt_funded_tbl,l_func_currency_tbl
253       FROM   po_req_distributions_all d,
254              po_requisition_lines_all l,
255              GL_SETS_OF_BOOKS GLSOB
256       WHERE  l.requisition_header_id = p_doc_header_id
257              AND l.requisition_line_id = d.requisition_line_id
258              AND Nvl(l.cancel_flag,'N') <> 'Y'
259              AND Nvl(l.closed_code,'OPEN') <> 'FINALLY CLOSED'
260              AND d.prevent_encumbrance_flag <> 'Y'
261              AND d.SET_OF_BOOKS_ID = GLSOB.SET_OF_BOOKS_ID;
262     ELSE
263     d_progress := 30;
264       SELECT d.po_distribution_id,
265              Nvl(s.price_override,0),
266              Nvl(s.matching_basis,'QUANTITY'),
267              d.quantity_ordered,
268              d.amount_ordered,
269              Nvl(d.partial_funded_flag,'N'),
270              Nvl(d.funded_value,0),
271              Nvl(d.nonrecoverable_tax,0),
272              Nvl(d.rate,1),
273              d.quantity_funded,
274              d.amount_funded,
275              GLSOB.CURRENCY_CODE
276       BULK COLLECT INTO l_dist_id_tbl,l_price_tbl,l_match_basis_tbl,l_qty_ordered_tbl,
277              l_amt_ordered_tbl,l_partial_flag_tbl,l_fund_value_tbl,l_nr_tax_tbl,
278              l_rate_tbl,l_qty_funded_tbl,l_amt_funded_tbl,l_func_currency_tbl
279       FROM   po_distributions_merge_v d,
280              po_line_locations_merge_v s,
281              GL_SETS_OF_BOOKS GLSOB
282       WHERE  d.po_header_id = p_doc_header_id
283              AND d.draft_id = p_draft_id
284              AND s.draft_id = p_draft_id
285              AND s.line_location_id = d.line_location_id
286              AND Nvl(s.cancel_flag,'N') <> 'Y'
287              AND Nvl(s.closed_code,'OPEN') <> 'FINALLY CLOSED'
288              AND d.prevent_encumbrance_flag <> 'Y'
289              AND d.SET_OF_BOOKS_ID = GLSOB.SET_OF_BOOKS_ID;
290     END IF;
291     d_progress := 40;
292     IF l_dist_id_tbl.COUNT = 0 THEN
293       RETURN;
294     END IF;
295 
296     d_progress := 50;
297     FOR i IN 1.. l_dist_id_tbl.COUNT LOOP
298       --13943396 Extract the precision value to round the Funded value
299       IF x_precision IS NULL THEN
300 
301            fnd_currency.get_info(l_func_currency_tbl(i),
302 					  x_precision,
303 					  x_ext_precision,
304 					  x_min_acct_unit );
305 
306       END IF;
307       IF L_partial_flag_tbl(i) = 'Y' THEN
308         IF L_match_basis_tbl(i) = 'AMOUNT' THEN
309           /* CLM Partial Funding Changes -- <<Bug#9898165>> */
310           IF (L_amt_funded_tbl(i) IS NOT NULL AND L_amt_funded_tbl(i) > L_amt_ordered_tbl(i)) THEN
311              L_fund_value_tbl(i) := Round(((L_amt_ordered_tbl(i) + L_nr_tax_tbl(i))*(L_rate_tbl(i))),x_precision);
312           END IF;
313           L_amt_funded_tbl(i) := Round((L_fund_value_tbl(i) * L_amt_ordered_tbl(i) / (L_rate_tbl(i) * (L_amt_ordered_tbl(i) + L_nr_tax_tbl(i)))),x_precision);
314         ELSE
315           /* CLM Partial Funding Changes -- <<Bug#9898165>> */
316           IF (L_qty_funded_tbl(i) IS NOT NULL AND L_qty_funded_tbl(i) > L_qty_ordered_tbl(i)) THEN
317              L_fund_value_tbl(i) := Round((((L_qty_ordered_tbl(i)*L_price_tbl(i)) + L_nr_tax_tbl(i))*(L_rate_tbl(i))),x_precision);
318           END IF;
319           L_qty_funded_tbl(i) := Round(((L_fund_value_tbl(i) * L_qty_ordered_tbl(i)) / (L_rate_tbl(i) * (L_price_tbl(i) * L_qty_ordered_tbl(i) + L_nr_tax_tbl(i)))),Nvl(FND_PROFILE.VALUE('PO_QUANTITY_PRECISION'),5));
320         END IF;
321       ELSE
322         L_qty_funded_tbl(i) := L_qty_ordered_tbl(i);
323         L_amt_funded_tbl(i) := L_amt_ordered_tbl(i);
324         IF L_match_basis_tbl(i) = 'AMOUNT' THEN
325         	L_fund_value_tbl(i) :=  Round(((L_amt_ordered_tbl(i) + L_nr_tax_tbl(i))*(L_rate_tbl(i))),x_precision);
326         ELSE
327         	L_fund_value_tbl(i) :=  Round((((L_qty_ordered_tbl(i)*L_price_tbl(i)) + L_nr_tax_tbl(i))*(L_rate_tbl(i))),x_precision);
328         END IF;
329       END IF;
330     END LOOP;
331 
332     IF p_document_type = 'REQUISITION' THEN
333     d_progress := 70;
334       FORALL i IN 1..l_dist_id_tbl.COUNT
335         UPDATE po_req_distributions_all d
336         SET    d.funded_value = L_fund_value_tbl(i),
337                d.quantity_funded = L_qty_funded_tbl(i),
338                d.amount_funded = L_amt_funded_tbl(i)
339         WHERE  d.distribution_id = L_dist_id_tbl(i);
340     ELSE
341       IF p_draft_id <> -1 THEN
342     d_progress := 70;
343         FORALL i IN 1..l_dist_id_tbl.COUNT
344           UPDATE po_distributions_draft_all d
345           SET    d.funded_value = L_fund_value_tbl(i),
346           	 d.quantity_funded = L_qty_funded_tbl(i),
347                  d.amount_funded = L_amt_funded_tbl(i)
348           WHERE  d.po_distribution_id = L_dist_id_tbl(i)
349                  AND d.draft_id = p_draft_id;
350       ELSE
351     d_progress := 80;
352         FORALL i IN 1..l_dist_id_tbl.COUNT
353           UPDATE po_distributions_all d
354           SET    d.funded_value = L_fund_value_tbl(i),
355           	 d.quantity_funded = L_qty_funded_tbl(i),
356                  d.amount_funded = L_amt_funded_tbl(i),
357                  d.change_in_funded_value = L_fund_value_tbl(i) -- <<Bug#9862575>>
358           WHERE  d.po_distribution_id = L_dist_id_tbl(i)
359 	         AND Nvl(d.encumbered_flag,'N') <> 'Y'; -- <<Bug#10206681>>
360           /* Bug#10206681: The change_in_funded_value of the Award is getting updated
361                            as part of recalculation of PF attributes of Modification,
362                            immediately after tax calculation. This need to be prevented,
363                            using the constraint Nvl(d.encumbered_flag,'N') <> 'Y'. */
364       END IF;
365     END IF;
366     d_progress := 90;
367     -- By default return status is SUCCESS if no exception occurs
368     x_return_status := fnd_api.g_ret_sts_success;
369   EXCEPTION
370     WHEN OTHERS THEN
371       x_return_status := fnd_api.g_ret_sts_unexp_error;
372 
373       IF (po_log.d_exc) THEN
374         po_log.Exc(d_module,d_progress,SQLCODE
375                                        ||sqlerrm);
376 
377         po_log.Proc_end(d_module,'x_return_status',x_return_status);
378       END IF;
379   END updt_funding_info;
380 
381   /*
382 This package should be called after any change in the Funded Value on the Distribution, per distribution
383 */
384   PROCEDURE Get_change_in_funds
385        (x_return_status         OUT NOCOPY VARCHAR2,
386         p_document_type         IN VARCHAR2,
387         p_distribution_id       IN NUMBER,
388         p_draft_id              IN NUMBER DEFAULT -1,
389         p_conf_dist_id          IN NUMBER DEFAULT NULL,
390         p_funded_value          IN NUMBER,
391         x_chng_in_funded_value  OUT NOCOPY NUMBER)
392   IS
393     d_api_name  CONSTANT VARCHAR2(30) := 'Get_change_in_funds';
394     d_module    CONSTANT VARCHAR2(100) := d_pkg_name
395                                           ||d_api_name;
396     d_progress  NUMBER;
397   BEGIN
398     d_progress := 10;
399     IF p_document_type = 'REQUISITION'
400        AND p_conf_dist_id IS NOT NULL THEN
401     d_progress := 20;
402       SELECT Nvl(d.funded_value,0) - p_funded_value
403       INTO   x_chng_in_funded_value
404       FROM   po_req_distributions_all d
405       WHERE  d.distribution_id = p_conf_dist_id;
406     ELSIF p_document_type = 'PO'
407           AND p_draft_id <> -1 THEN
408     d_progress := 30;
409       SELECT Nvl(d.funded_value,0) - p_funded_value
410       INTO   x_chng_in_funded_value
411       FROM   po_distributions_all d
412       WHERE  d.po_distribution_id = p_distribution_id;
413     ELSE
414     d_progress := 40;
415       x_chng_in_funded_value := p_funded_value;
416     END IF;
417     d_progress := 50;
418     -- By default return status is SUCCESS if no exception occurs
419     x_return_status := fnd_api.g_ret_sts_success;
420   EXCEPTION
421     WHEN OTHERS THEN
422       x_return_status := fnd_api.g_ret_sts_unexp_error;
423 
424       IF (po_log.d_exc) THEN
425         po_log.Exc(d_module,d_progress,SQLCODE
426                                        ||sqlerrm);
427 
428         po_log.Proc_end(d_module,'x_return_status',x_return_status);
429       END IF;
430   END get_change_in_funds;
431 
432   PROCEDURE Get_qty_amt_funded
433        (x_return_status  OUT NOCOPY VARCHAR2,
434         p_document_type  IN VARCHAR2,
435         p_partial_flag   IN VARCHAR2,
436         p_fund_value     IN NUMBER,
437         p_qty_ordered    IN NUMBER,
438         p_amt_ordered    IN NUMBER,
439         p_matchin_basis  IN VARCHAR2,
440         p_price          IN NUMBER DEFAULT 0,
441         p_rate           IN NUMBER DEFAULT 1,
442         p_nr_tax         IN NUMBER DEFAULT 0,
443         x_qty_funded     OUT NOCOPY NUMBER,
444         x_amt_funded     OUT NOCOPY NUMBER)
445   IS
446     d_api_name  CONSTANT VARCHAR2(30) := 'Get_Qty_Amt_Funded';
447     d_module    CONSTANT VARCHAR2(100) := d_pkg_name
448                                           ||d_api_name;
449     d_progress  NUMBER;
450   BEGIN
451     d_progress := 10;
452     IF p_partial_flag = 'Y' THEN
453       IF p_matchin_basis = 'AMOUNT' THEN
454     d_progress := 20;
455         x_amt_funded := Round((p_fund_value * p_amt_ordered / p_rate * (p_amt_ordered + p_nr_tax)),15);
456       ELSE
457     d_progress := 30;
458         x_qty_funded := Round(((p_fund_value * p_qty_ordered) / p_rate * (p_price * p_qty_ordered + p_nr_tax)),15);
459       END IF;
460     ELSE
461     d_progress := 40;
462       x_qty_funded := p_qty_ordered;
463       x_amt_funded := p_amt_ordered;
464     END IF;
465     d_progress := 50;
466     -- By default return status is SUCCESS if no exception occurs
467     x_return_status := fnd_api.g_ret_sts_success;
468   EXCEPTION
469     WHEN OTHERS THEN
470       x_return_status := fnd_api.g_ret_sts_unexp_error;
471 
472       IF (po_log.d_exc) THEN
473         po_log.Exc(d_module,d_progress,SQLCODE
474                                        ||sqlerrm);
475 
476         po_log.Proc_end(d_module,'x_return_status',x_return_status);
477       END IF;
478   END get_qty_amt_funded;
479 
480 PROCEDURE Updt_Funds_Split(x_return_status  OUT NOCOPY VARCHAR2, p_new_Req_line_id in number)
481  IS
482  cursor Parent_Req_Info(p_distribution_id in number)
483 			is
484 			select
485 			funded_value,
486 			Req_Line_Quantity
487 			from po_Req_Distributions_all
488 			Where Distribution_Id = p_Distribution_Id;
489 
490 
491 cursor New_Req_line_Info is
492 SELECT
493 distribution_id,
494 partial_funded_flag,
495 req_line_quantity,
496 prl.Unit_Price,
497 Nvl(prd.nonrecoverable_tax,0),
498 source_req_distribution_id
499   FROM   po_requisition_lines_all prl, po_req_distributions_all prd
500   WHERE  prl.Requisition_Line_Id =p_new_Req_line_id
501   and prd.Requisition_Line_Id = prl.Requisition_Line_Id;
502 
503 
504 
505     d_api_name  CONSTANT VARCHAR2(30) := 'Updt_Funds_Split';
506     d_module    CONSTANT VARCHAR2(100) := d_pkg_name
507                                           ||d_api_name;
508     d_progress  NUMBER;
509     l_price NUMBER;
510 
511     l_Distribution_id_tbl PO_TBL_NUMBER;
512     l_partial_flag_tbl PO_TBL_VARCHAR1;
513     l_req_Line_qty_tbl PO_TBL_NUMBER;
514     l_price_tbl PO_TBL_NUMBER;
515     l_nr_tax_tbl PO_TBL_NUMBER;
516 
517     l_qty_funded_tbl PO_TBL_NUMBER;
518     l_old_fund_value number;
519     l_Old_Req_Line_Qty NUMBER;
520     l_funded_Value_tbl PO_TBL_NUMBER;
521     l_Chg_Fund_Value_Tbl PO_TBL_NUMBER;
522 	l_parent_Dist_Id_tbl PO_Tbl_Number;
523 
524   BEGIN
525     D_PROGRESS := 10;
526     --Clm_Split
527     l_qty_funded_tbl := PO_TBL_NUMBER();
528     L_FUNDED_VALUE_TBL := PO_TBL_NUMBER();
529     L_CHG_FUND_VALUE_TBL := PO_TBL_NUMBER();
530     --End
531 	open New_Req_line_Info;
532 	Fetch New_Req_line_Info
533 	  BULK COLLECT INTO
534 l_Distribution_id_tbl,
535 l_partial_flag_tbl,
536 l_req_Line_qty_tbl,
537   l_price_tbl,
538   l_nr_tax_tbl,
539   l_parent_Dist_Id_tbl;
540 
541               For i in 1..l_Distribution_id_tbl.count
542 			 LOOP
543        --Clm_Split
544         L_QTY_FUNDED_TBL.EXTEND;
545         L_FUNDED_VALUE_TBL.EXTEND;
546         L_CHG_FUND_VALUE_TBL.EXTEND;
547        --End
548 				If l_partial_flag_tbl(i) = 'N' Then
549 					l_funded_Value_tbl(i) := l_req_Line_qty_tbl(i) * l_price_tbl(i) + l_nr_tax_tbl(i);
550 					l_Qty_Funded_Tbl(i) := l_req_Line_qty_tbl(i);
551 				Else
552 					Open Parent_Req_Info(l_parent_Dist_Id_tbl(i));
553 Fetch Parent_Req_Info into l_Old_Fund_Value, l_Old_Req_Line_Qty;
554 close Parent_Req_Info;
555 						l_funded_Value_tbl(i) := l_Old_Fund_Value * l_req_Line_qty_tbl(i)/l_Old_Req_Line_Qty;
556 						l_Qty_Funded_Tbl(i) := (l_funded_Value_tbl(i) *  l_req_Line_qty_tbl(i)) / (l_price_tbl(i) * l_req_Line_qty_tbl(i) +l_nr_tax_tbl(i));
557 
558 				End If;
559 				l_Chg_Fund_Value_Tbl(i) := l_funded_Value_tbl(i);
560 			 End Loop;
561 			 forall i in 1..l_Distribution_id_tbl.count
562 			 Update po_Req_Distributions_all
563 			 Set funded_value = l_funded_Value_tbl(i),
564 				Quantity_Funded = l_Qty_Funded_Tbl(i),
565 				Change_In_Funded_Value = l_Chg_Fund_Value_Tbl(i)
566 			 Where Distribution_Id = l_Distribution_id_tbl(i);
567 
568 END Updt_Funds_Split;
569 
570 /*
571 Returns Total Funded Value for a given entity level id
572 + This function should be called only for clm document styles
573 + It returns the Funded Value for the lowest entity id passed to this function
574 + This returns the Funded Value in functional currency.
575 */
576 FUNCTION Get_funded_value
577      (l_doc_type           IN VARCHAR2,
578       l_header_id        IN NUMBER DEFAULT NULL,
579       l_line_id          IN NUMBER DEFAULT NULL,
580       l_shipment_id      IN NUMBER DEFAULT NULL,
581       l_distribution_id  IN NUMBER DEFAULT NULL)
582 RETURN NUMBER
583 IS
584   l_funded_value  NUMBER := 0;
585   d_api_name      CONSTANT VARCHAR2(30) := 'get_funded_value';
586   d_module        CONSTANT VARCHAR2(100) := d_pkg_name
587                                             ||d_api_name;
588   d_progress      NUMBER;
589 BEGIN
590   d_progress := 10;
591 
592   IF l_doc_type = 'REQ' THEN
593     d_progress := 15;
594 
595     IF po_log.d_stmt THEN
596       po_log.Stmt(d_module,d_progress,'Document Type : '
597                                       ||l_doc_type);
598     END IF;
599 
600     IF l_distribution_id IS NOT NULL THEN
601       d_progress := 20;
602 
603       IF po_log.d_stmt THEN
604         po_log.Stmt(d_module,d_progress,'Distribution id is not null : '
605                                         ||l_distribution_id);
606       END IF;
607 
608       SELECT Nvl(funded_value,0)
609       INTO   l_funded_value
610       FROM   po_req_distributions_all
611       WHERE  distribution_id = l_distribution_id;
612     ELSIF l_line_id IS NOT NULL THEN
613       d_progress := 25;
614 
615       IF po_log.d_stmt THEN
616         po_log.Stmt(d_module,d_progress,'Line id is not null : '
617                                         ||l_line_id);
618       END IF;
619 
620       SELECT Sum(Nvl(funded_value,0))
621       INTO   l_funded_value
622       FROM   po_req_distributions_all d,
623              po_requisition_lines_all l
624       WHERE  d.requisition_line_id = l.requisition_line_id
625              AND l.requisition_line_id = l_line_id;
626     ELSIF l_header_id IS NOT NULL THEN
627       d_progress := 30;
628 
629       IF po_log.d_stmt THEN
630         po_log.Stmt(d_module,d_progress,'Header id is not null : '
631                                         ||l_header_id);
632       END IF;
633 
634       SELECT Sum(Nvl(funded_value,0))
635       INTO   l_funded_value
636       FROM   po_req_distributions_all d,
637              po_requisition_lines_all l
638       WHERE  d.requisition_line_id = l.requisition_line_id
639              AND l.requisition_header_id = l_header_id;
640     END IF;
641   ELSIF l_doc_type = 'PO' THEN
642     d_progress := 35;
643 
644     IF po_log.d_stmt THEN
645       po_log.Stmt(d_module,d_progress,'Document Type is : '
646                                       ||l_doc_type);
647     END IF;
648 
649     IF l_distribution_id IS NOT NULL THEN
650       d_progress := 40;
651 
652       IF po_log.d_stmt THEN
653         po_log.Stmt(d_module,d_progress,'Distribution id is not null : '
654                                         ||l_distribution_id);
655       END IF;
656 
657       SELECT Nvl(funded_value,0)
658       INTO   l_funded_value
659       FROM   po_distributions_all
660       WHERE  po_distribution_id = l_distribution_id;
661     ELSIF l_shipment_id IS NOT NULL THEN
662       d_progress := 45;
663 
664       IF po_log.d_stmt THEN
665         po_log.Stmt(d_module,d_progress,'Shipment id is not null : '
666                                         ||l_shipment_id);
667       END IF;
668 
669       SELECT Sum(Nvl(funded_value,0))
670       INTO   l_funded_value
671       FROM   po_distributions_all d
672       WHERE  d.line_location_id = l_shipment_id;
673     ELSIF l_line_id IS NOT NULL THEN
674       d_progress := 50;
675 
676       IF po_log.d_stmt THEN
677         po_log.Stmt(d_module,d_progress,'Line id is not null : '
678                                         ||l_line_id);
679       END IF;
680 
681       SELECT Sum(Nvl(funded_value,0))
682       INTO   l_funded_value
683       FROM   po_distributions_all d
684       WHERE  d.po_line_id = l_line_id;
685     ELSIF l_header_id IS NOT NULL THEN
686       d_progress := 55;
687 
688       IF po_log.d_stmt THEN
689         po_log.Stmt(d_module,d_progress,'Header id is not null : '
690                                         ||l_header_id);
691       END IF;
692 
693       SELECT Sum(Nvl(funded_value,0))
694       INTO   l_funded_value
695       FROM   po_distributions_all d
696       WHERE  d.po_header_id = l_header_id;
697     END IF;
698   END IF;
699 
700   d_progress := 60;
701 
702   IF po_log.d_stmt THEN
703     po_log.Stmt(d_module,d_progress,'Funded Value is  : '
704                                     ||l_funded_value);
705   END IF;
706 
707   RETURN l_funded_value;
708 EXCEPTION
709   WHEN OTHERS THEN
710     RETURN l_funded_value;
711 
712     IF (po_log.d_exc) THEN
713       po_log.Exc(d_module,d_progress,SQLCODE
714                                      ||sqlerrm);
715     END IF;
716 END get_funded_value;
717 
718 END po_partial_funding_pkg;