DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKL_AM_CALCULATE_QUOTE_PVT

Source


1 PACKAGE BODY OKL_AM_CALCULATE_QUOTE_PVT AS
2 /* $Header: OKLRCQUB.pls 120.49.12020000.3 2013/02/25 10:00:56 jjuneja ship $ */
3 
4 -- GLOBAL VARIABLES
5   G_LEVEL_PROCEDURE             CONSTANT NUMBER        := FND_LOG.LEVEL_PROCEDURE;
6   G_LEVEL_STATEMENT             CONSTANT NUMBER        := FND_LOG.LEVEL_STATEMENT;
7   G_LEVEL_EXCEPTION             CONSTANT NUMBER        := FND_LOG.LEVEL_EXCEPTION;
8   G_MODULE_NAME                 CONSTANT VARCHAR2(500) := 'okl.am.plsql.okl_am_calculate_quote_pvt.';
9 
10     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
11 
12     -- declare g_add_params as global variable, so that it can be passed to all formulae
13     g_add_params                okl_execute_formula_pub.ctxt_val_tbl_type;
14 
15     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
16 
17      -- bug 5380712 rbruno start
18         g_compute_qte_fee   BOOLEAN;
19     -- bug 5380712 rbruno end
20 
21 -- Forward Declaration
22 
23 
24 PROCEDURE process_top_formula (
25                 p_head_rgd_code IN VARCHAR2,
26                 p_line_rgd_code IN VARCHAR2,
27                 p_qtev_rec      IN qtev_rec_type,
28                 p_cle_id        IN NUMBER,
29                 p_asset_tbl     IN asset_tbl_type,
30                 p_formula_name  IN VARCHAR2,
31                 p_operand       IN VARCHAR2,
32                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
33                 x_formula_total OUT NOCOPY NUMBER,
34                 x_return_status OUT NOCOPY VARCHAR2);
35 
36 
37 -- Start of comments
38 --
39 -- Procedure Name       : append_quote_line
40 -- Description          : Add a record to array of quote lines
41 -- Business Rules       :
42 -- Parameters           : array of quote lines, data for new record
43 -- Version                  : 1.0
44 -- History          : SECHAWLA 20-NOV-02 - Bug 2680542 : Added 2 optional paramaters : p_asset_qty, p_quote_qty
45 --                    SECHAWLA 14-FEB-03 - Bug 2749690 : Added code to store net investment, unbilled rec and residual value on quote lines
46 --                    SECHAWLA 20-FEB-03 - Bug 2757368 : Added logic to prorate the quote line amounts based upon the selected quote quantity
47 --                    SECHAWLA 24-FEB-03 - Bug 2817025 : Added code to convert the repurchase quote line amount to functional currency
48 --                    SECHAWLA 21-APR-03 - Bug 2925120 Modified code to fix the unit proration problem for unbiled rec, Service and Fee Lines
49 --                    RMUNJULU 2757312 Added p_split_asset_number to store asset_number entered by user
50 --                    PAGARG   29-SEP-04 - Bug 3921591 : Added AMRFEE also as part
51 --                    of if construct to prorate rollover quote line amount also.
52 --                  : rmunjulu 02/09/05 Bug 4161133 Added code to insert billing adjustment due date into quote amounts
53 --                  : rmunjulu 02/16/05 Bug 4161133 Added code to insert billing adjustment due date into quote amounts
54 -- End of comments
55 
56 
57  PROCEDURE append_quote_line (
58                 p_qtev_rec                 IN qtev_rec_type,
59                 p_qlt_code                 IN VARCHAR2,
60                 p_amount                   IN NUMBER,
61                 p_kle_id                   IN NUMBER,
62         p_asset_qty            IN NUMBER DEFAULT NULL,
63         p_quote_qty            IN NUMBER DEFAULT NULL,
64         p_net_investment       IN NUMBER DEFAULT NULL, -- SECHAWLA 14-FEB-03 2749690 :Added another parameter
65         p_unbilled_rec         IN NUMBER DEFAULT NULL, -- SECHAWLA 14-FEB-03 2749690 :Added another parameter
66         p_residual_value       IN NUMBER DEFAULT NULL, -- SECHAWLA 14-FEB-03 2749690 :Added another parameter
67         p_split_asset_number   IN VARCHAR2 DEFAULT NULL, -- RMUNJULU 2757312 Added
68         p_rule_information4    IN OKC_RULES_V.RULE_INFORMATION4%TYPE DEFAULT NULL, --SECHAWLA 20-FEB-03 2757368 : Added anothe parameter
69                 p_success_yn           IN VARCHAR2,
70                 p_sty_id                   IN NUMBER,
71                 p_formula_name         IN VARCHAR2,
72                 p_sub_tqlv_tbl         IN tqlv_tbl_type,
73                 p_defaulted_yn         IN VARCHAR2,
74                 p_due_date             IN DATE DEFAULT NULL, -- rmunjulu Bug 4161133 Added 4161133 Modified
75                 px_tqlv_tbl            IN OUT NOCOPY tqlv_tbl_type,
76                 px_tbl_total           IN OUT NOCOPY NUMBER) IS
77 
78     SUBTYPE tqlv_rec_type       IS okl_txl_quote_lines_pub.tqlv_rec_type;
79 
80         l_tqlv_rec                             tqlv_rec_type;
81         l_seq                                  NUMBER;
82         l_amount                               NUMBER;
83         l_qlt_exists_yn                    VARCHAR2(1);
84         l_qlt_code                             VARCHAR2(30);
85         l_append_yn                        BOOLEAN := TRUE;
86         l_tbl_ind                              NUMBER;
87         l_defaulted_yn                     VARCHAR2(1) := p_defaulted_yn;
88 
89     ----SECHAWLA 24-FEB-03 Bug # 2817025 : new declarations
90     l_func_curr_code               GL_LEDGERS_PUBLIC_V.CURRENCY_CODE%TYPE;
91     l_contract_curr_code           okc_k_headers_b.currency_code%TYPE;
92     lx_contract_currency           okl_k_headers_full_v.currency_code%TYPE;
93     lx_currency_conversion_type    okl_k_headers_full_v.currency_conversion_type%TYPE;
94     lx_currency_conversion_rate    okl_k_headers_full_v.currency_conversion_rate%TYPE;
95     lx_currency_conversion_date    okl_k_headers_full_v.currency_conversion_date%TYPE;
96     lx_converted_amount            NUMBER;
97     l_return_status                VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
98 
99     -- rmunjulu Sales_Tax_Enhancement
100     CURSOR get_try_id_csr (p_trx_name IN VARCHAR2) IS
101     SELECT try.id
102     FROM   okl_trx_types_tl try  --okl_trx_types_v try --sechawla 6-may-09 8491816
103     WHERE  try.name = p_trx_name;
104 
105     l_try_id NUMBER;
106     l_trx_name okl_trx_types_v.name%TYPE;
107     L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'append_quote_line';
108     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
109     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
110     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
111 BEGIN
112 
113    IF (is_debug_procedure_on) THEN
114        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
115    END IF;
116 
117    --Print Input Variables
118    IF (is_debug_statement_on) THEN
119        --OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
120        --       'p_qtev_rec :'||p_qtev_rec);
121        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
122               'p_qlt_code :'||p_qlt_code);
123        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
124               'p_amount :'||p_amount);
125        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
126               'p_kle_id :'||p_kle_id);
127        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
128               'p_asset_qty :'||p_asset_qty);
129        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
130               'p_quote_qty :'||p_quote_qty);
131        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
132               'p_net_investment :'||p_net_investment);
133        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
134               'p_unbilled_rec :'||p_unbilled_rec);
135        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
136               'p_residual_value :'||p_residual_value);
137        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
138               'p_split_asset_number :'||p_split_asset_number);
139        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
140               'p_rule_information4 :'||p_rule_information4);
141        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
142               'p_success_yn :'||p_success_yn);
143        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
144               'p_formula_name :'||p_formula_name);
145        --OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
146        --       'p_sub_tqlv_tbl :'||p_sub_tqlv_tbl);
147        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
148               'p_defaulted_yn :'||p_defaulted_yn);
149        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
150               'p_due_date :'||p_due_date);
151    END IF;
152 
153         -- ********************************************************
154         -- Save lines for operands which are treated as top formula
155         -- ********************************************************
156 
157         IF p_sub_tqlv_tbl.COUNT > 0 THEN
158 
159    IF (is_debug_statement_on) THEN
160         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
161         'before OKL_AM_CALCULATE_QUOTE_PVT.append_quote_line calls append_quote_line'||l_return_status);
162 
163    END IF;
164 
165                 l_tbl_ind := p_sub_tqlv_tbl.FIRST;
166         -- append quote lines
167                 LOOP
168 
169                     append_quote_line (
170                         p_qtev_rec      => p_qtev_rec,
171                         p_qlt_code      => p_sub_tqlv_tbl(l_tbl_ind).qlt_code,
172                         p_amount        => p_sub_tqlv_tbl(l_tbl_ind).amount,
173                         p_kle_id        => p_sub_tqlv_tbl(l_tbl_ind).kle_id,
174             p_success_yn        => OKL_API.G_RET_STS_SUCCESS,
175                         p_sty_id        => p_sub_tqlv_tbl(l_tbl_ind).sty_id,
176                         p_formula_name  => p_formula_name,
177                         p_sub_tqlv_tbl  => G_EMPTY_TQLV_TBL,
178                         p_defaulted_yn  => p_defaulted_yn,
179                         px_tqlv_tbl     => px_tqlv_tbl,
180                         px_tbl_total    => px_tbl_total, -- Added below 3 parameters for bug 5871029
181                         p_asset_qty => p_asset_qty,
182                         p_quote_qty =>  p_quote_qty,
183                         p_rule_information4 => p_rule_information4);
184 
185 
186                     EXIT WHEN (l_tbl_ind = p_sub_tqlv_tbl.LAST);
187                     l_tbl_ind := p_sub_tqlv_tbl.NEXT (l_tbl_ind);
188 
189                 END LOOP;
190 
191    IF (is_debug_statement_on) THEN
192         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
193         'After OKL_AM_CALCULATE_QUOTE_PVT.append_quote_line calls append_quote_line'||l_return_status);
194    END IF;
195 
196 
197         END IF;
198 
199         -- ***********************************
200         -- Check success of operand evaluation
201         -- ***********************************
202 
203         IF p_success_yn <> OKL_API.G_RET_STS_SUCCESS THEN
204 
205                 -- Unable to complete process due to missing
206                 -- information (OPERAND operand in FORMULA formula)
207                 okl_am_util_pvt.set_message (
208                          p_app_name     => G_APP_NAME
209                         ,p_msg_name     => 'OKL_AM_NO_OPERAND_DATA'
210                         ,p_token1       => 'FORMULA'
211                         ,p_token1_value => p_formula_name
212                         ,p_token2       => 'OPERAND'
213                         ,p_token2_value => p_qlt_code);
214 
215                 l_amount        := 0;
216                 l_defaulted_yn  := 'Y';
217 
218         ELSE
219 
220                 IF p_amount IS NULL THEN
221                         l_append_yn     := FALSE;
222                 ELSE
223                         l_amount        := p_amount;
224                 END IF;
225 
226         END IF;
227 
228         -- *******************************
229         -- Check if quote line type exists
230         -- *******************************
231 
232         l_qlt_exists_yn := okl_util.check_lookup_code
233                 (G_QUOTE_LINE_LOOKUP, p_qlt_code);
234 
235         IF l_qlt_exists_yn <> OKL_API.G_RET_STS_SUCCESS THEN
236 
237                 -- Quote line type does not exist for
238                 -- OPERAND operand in FORMULA formula
239                 okl_am_util_pvt.set_message (
240                          p_app_name     => G_APP_NAME
241                         ,p_msg_name     => 'OKL_AM_INVALID_QUOTE_LINE_TYPE'
242                         ,p_token1       => 'FORMULA'
243                         ,p_token1_value => p_formula_name
244                         ,p_token2       => 'OPERAND'
245                         ,p_token2_value => p_qlt_code);
246 
247                 IF p_success_yn <> OKL_API.G_RET_STS_SUCCESS THEN
248                         l_append_yn     := FALSE;
249                 ELSE
250                         l_qlt_code      := G_MISC_QLT;
251                         l_defaulted_yn  := 'Y';
252                 END IF;
253 
254         ELSE
255                         l_qlt_code      := p_qlt_code;
256         END IF;
257 
258         -- *********************************
259         -- Some quote lines must be negative
260         -- *********************************
261 
262         IF  l_qlt_code IN ('AMCQDR','AMCSDD','AMCRIN','AMCTCD')
263         AND l_amount > 0 THEN
264 
265                 -- Amount for QLT_CODE quote line is switched to negative
266                 okl_am_util_pvt.set_message (
267                          p_app_name     => G_APP_NAME
268                         ,p_msg_name     => 'OKL_AM_NEGATIVE_QUOTE_LINE'
269                         ,p_msg_level    => OKL_AM_UTIL_PVT.G_DEBUG_LEVEL
270                         ,p_token1       => 'QLT_CODE'
271                         ,p_token1_value => l_qlt_code);
272 
273                 l_amount := - ABS (l_amount);
274 
275         END IF;
276 
277         -- ************
278         -- Save results
279         -- ************
280 
281         IF l_append_yn THEN
282 
283                 l_seq   := NVL (px_tqlv_tbl.LAST, 0)  + 1;
284 
285                 l_tqlv_rec.qte_id       := p_qtev_rec.id;
286                 l_tqlv_rec.line_number  := l_seq;
287                 l_tqlv_rec.qlt_code     := l_qlt_code;
288         l_tqlv_rec.split_kle_name := p_split_asset_number; -- RMUNJULU 2757312  Added to store split asset number entered by user
289 
290         --SECHAWLA 20-FEB-03 2757368 : prorate by unit if prorate option is LINE_CALCULATION or PRORATE
291 
292         -- SECHAWLA 21-APR-03 - Bug 2925120 : Unbilled Receivables amounts not getting Unit Prorated.
293         -- Added the 2nd condition to the following IF, to do unit proration for Unbilled rec, Service and Fee Lines.
294         -- Currently, a null value is passed in p_rule_information4, to this procedure, for these 3 operands.
295         --Bug #3921591: pagarg +++ Rollover +++
296         -- Added AMRFEE operand also in the condition as need
297         -- to prorate quote line amount in case of rollover quote line also.
298         --akrangan Bug 5495474 start
299         -- Added 'AMYOUB' in the flow IF condition to prorate "Outstanding Balance" line
300         IF (p_rule_information4 IN ('LINE_CALCULATION','PRORATE')) OR (p_qlt_code IN ('AMCTUR','AMYSAM','AMYFEE','AMRFEE', 'AMYOUB')) THEN
301         --akrangan Bug 5495474 end
302            --SECHAWLA 24-FEB-03 Bug # 2817025 : added a check to prorate the amounts only if the asset and quote quantity is not null
303 
304            -- SECHAWLA 21-APR-03 Bug 2925120 : Added G_MISS_NUM check in the following IF statement
305            IF (p_asset_qty IS NOT NULL AND p_asset_qty <> G_MISS_NUM ) AND (p_quote_qty IS NOT NULL AND p_quote_qty <> G_MISS_NUM) THEN
306               l_amount := (l_amount / p_asset_qty) * p_quote_qty;
307               -- bug 5480622 -- start
308               l_contract_curr_code := okl_am_util_pvt.get_chr_currency( p_chr_id => p_qtev_rec.khr_id);
309               l_amount := okl_accounting_util.round_amount(p_amount => l_amount,
310                                                            p_currency_code => l_contract_curr_code);
311               -- bug 5480622 --end
312            END IF;
313         END IF;
314         --SECHAWLA 20-FEB-03 2757368 : end new code
315 
316         --SECHAWLA 24-FEB-03 Bug # 2817025 : Convert the repurchase quote amount to functional currency
317         IF p_qtev_rec.qtp_code = 'REP_STANDARD' THEN
318            -- get the functional currency
319            l_func_curr_code := okl_am_util_pvt.get_functional_currency;
320            -- get the contract currency
321            l_contract_curr_code := okl_am_util_pvt.get_chr_currency( p_chr_id => p_qtev_rec.khr_id);
322 
323            IF l_contract_curr_code <> l_func_curr_code  THEN
324                 -- convert amount to functional currency
325 
326       IF (is_debug_statement_on) THEN
327          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
328         'before OKL_AM_CALCULATE_QUOTE_PVT.append_quote_line calls okl_accounting_util.convert_to_functional_currency'||l_return_status);
329        END IF;
330 
331 
332                      okl_accounting_util.convert_to_functional_currency(
333                          p_khr_id                               => p_qtev_rec.khr_id,
334                          p_to_currency                      => l_func_curr_code,
335                          p_transaction_date         => G_SYSDATE,
336                          p_amount                               => l_amount,
337                      x_return_status                => l_return_status,
338                          x_contract_currency        => lx_contract_currency,
339                              x_currency_conversion_type => lx_currency_conversion_type,
340                              x_currency_conversion_rate => lx_currency_conversion_rate,
341                              x_currency_conversion_date => lx_currency_conversion_date,
342                              x_converted_amount             => lx_converted_amount );
343 
344        IF (is_debug_statement_on) THEN
345          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
346         'After OKL_AM_CALCULATE_QUOTE_PVT.append_quote_line calls okl_accounting_util.convert_to_functional_currency'||l_return_status);
347        END IF;
348 
349 
350                 IF (l_return_status = OKL_API.G_RET_STS_SUCCESS) THEN
351                    l_tqlv_rec.amount := lx_converted_amount ;
352                 ELSE
353                    l_tqlv_rec.amount := l_amount;
354                 END IF;
355 
356            ELSE
357                 l_tqlv_rec.amount := l_amount;
358            END IF;
359 
360         ELSE
361 
362 	--Added by jjuneja for Bug# 16361053
363            -- get the functional currency
364            l_func_curr_code := okl_am_util_pvt.get_functional_currency;
365            -- get the contract currency
366            l_contract_curr_code := okl_am_util_pvt.get_chr_currency( p_chr_id => p_qtev_rec.khr_id);
367 
368           IF l_contract_curr_code <> l_func_curr_code  THEN
369                 -- convert amount to functional currency
370 
371 	  IF (is_debug_statement_on) THEN
372 		OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
373 		'before OKL_AM_CALCULATE_QUOTE_PVT.append_quote_line calls okl_accounting_util.convert_to_functional_currency'||l_return_status);
374 	  END IF;
375 
376                 okl_accounting_util.convert_to_functional_currency(
377                          p_khr_id                               => p_qtev_rec.khr_id,
378                          p_to_currency                      => l_func_curr_code,
379                          p_transaction_date         => G_SYSDATE,
380                          p_amount                               => l_amount,
381                          x_return_status                => l_return_status,
382                          x_contract_currency        => lx_contract_currency,
383                          x_currency_conversion_type => lx_currency_conversion_type,
384                          x_currency_conversion_rate => lx_currency_conversion_rate,
385                          x_currency_conversion_date => lx_currency_conversion_date,
386                          x_converted_amount             => lx_converted_amount );
387 
388 	IF (is_debug_statement_on) THEN
389          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
390         'After OKL_AM_CALCULATE_QUOTE_PVT.append_quote_line calls okl_accounting_util.convert_to_functional_currency'||l_return_status);
391        END IF;
392 
393                 IF (l_return_status = OKL_API.G_RET_STS_SUCCESS) THEN
394 			l_tqlv_rec.currency_code := l_contract_curr_code ;
395 			l_tqlv_rec.currency_conversion_type := lx_currency_conversion_type ;
396 			l_tqlv_rec.currency_conversion_rate := lx_currency_conversion_rate ;
397 			l_tqlv_rec.currency_conversion_date := lx_currency_conversion_date ;
398                 END IF;
399            END IF;
400         --End of addition by jjuneja for Bug# 16361053
401 
402            l_tqlv_rec.amount    := l_amount;
403         END IF;
404         --SECHAWLA 24-FEB-03 Bug # 2817025 : end currency conversion changes
405 
406 
407         --      l_tqlv_rec.amount       := l_amount;
408                 l_tqlv_rec.kle_id       := p_kle_id;
409   -- SECHAWLA - Bug 2680542 : Added the following code to store asset qty and quote qty on quote lines.
410         l_tqlv_rec.asset_quantity := p_asset_qty; -- added
411         l_tqlv_rec.quote_quantity := p_quote_qty; --added
412   -- end new code
413 
414   -- SECHAWLA 14-FEB-03 Bug 2749690 : Added the following code to store net investment, unbileld rec and residual value on quote lines
415         l_tqlv_rec.asset_value := p_net_investment;
416         l_tqlv_rec.unbilled_receivables := p_unbilled_rec;
417         l_tqlv_rec.residual_value := p_residual_value;
418   -- end new code
419                 l_tqlv_rec.sty_id       := p_sty_id;
420                 l_tqlv_rec.defaulted_yn := l_defaulted_yn;
421                 l_tqlv_rec.modified_yn  := 'N';
422                 l_tqlv_rec.taxed_yn     := 'N';
423 
424          -- rmunjulu Sales_Tax_Enhancement
425         IF nvl(l_tqlv_rec.amount,0) >= 0 THEN
426 
427           -- Added by rravikir (eBTax enhancement) Bug 5866207
428           l_trx_name := 'Estimated Billing' ;
429 
430                   --get and set try_id with try_id of billing transaction
431                   OPEN  get_try_id_csr (l_trx_name );
432                   FETCH get_try_id_csr INTO l_try_id;
433                   CLOSE get_try_id_csr;
434 
435                 ELSE -- amount < 0
436 
437          -- Added by rravikir (eBTax enhancement) Bug 5866207
438          IF p_qtev_rec.qtp_code IN ('TER_MAN_PURCHASE', 'TER_MAN_WO_PURCHASE',
439                                      'TER_PURCHASE', 'TER_RECOURSE', 'TER_RECOURSE_WO_PURCHASE',
440                                      'TER_RELEASE_WO_PURCHASE', 'TER_ROLL_PURCHASE',
441                                      'TER_ROLL_WO_PURCHASE', 'TER_WO_PURCHASE') THEN
442                     l_trx_name := 'Estimated Billing' ;
443          ELSE
444          -- End rravikir (eBTax enhancement)
445                     l_trx_name := 'Credit Memo';
446          END IF;
447 
448              --get and set try_id with try_id of billing transaction
449                  OPEN  get_try_id_csr (l_trx_name );
450                  FETCH get_try_id_csr INTO l_try_id;
451                  CLOSE get_try_id_csr;
452 
453                 END IF;
454 
455         -- rmunjulu Sales_Tax_Enhancement
456         l_tqlv_rec.try_id := l_try_id;
457 
458                 -- rmunjulu 4161133 Added to store date -- 4161133 modified to store due_date
459         IF p_due_date IS NOT NULL THEN
460           l_tqlv_rec.due_date := p_due_date;
461         END IF;
462 
463                 px_tqlv_tbl(l_seq)      := l_tqlv_rec;
464                 px_tbl_total            := NVL (px_tbl_total, 0)
465                                          + NVL (l_amount, 0);
466 
467         END IF;
468 
469    IF (is_debug_statement_on) THEN
470                 --OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
471                 --      'px_tqlv_tbl..'||px_tqlv_tbl);
472                 OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
473                       'px_tbl_total..'||px_tbl_total);
474                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
475                       'ret status at the end.. '||l_return_status);
476    END IF;
477 
478    IF (is_debug_procedure_on) THEN
479        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
480    END IF;
481 
482 EXCEPTION
483 
484 WHEN OTHERS THEN
485         IF (is_debug_exception_on) THEN
486                 OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
487                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
488         END IF;
489 
490                 -- store SQL error message on message stack for caller
491                 OKL_API.SET_MESSAGE (
492                          p_app_name     => G_APP_NAME
493                         ,p_msg_name     => G_UNEXPECTED_ERROR
494                         ,p_token1       => G_SQLCODE_TOKEN
495                         ,p_token1_value => sqlcode
496                         ,p_token2       => G_SQLERRM_TOKEN
497                         ,p_token2_value => sqlerrm);
498 
499 END append_quote_line;
500 
501 
502 -- Start of comments
503 --
504 -- Procedure Name       : contract_lines - CURRENTLY NOT USED
505 -- Description          : Adds every asset as a zero-amount quote line to improve performance of AM screens.
506 -- Business Rules       :
507 -- Parameters           : quote record, contract line, rule group, rule code
508 -- Version                  : 1.0
509 -- History          : SECHAWLA - 20-NOV-02 - Bug 2468222
510 --                       Added p_asset_qty and p_quote_qty parameters in call to append_quote_lines procedure.
511 --                       Changed reference p_asset_tbl(l_asset_tbl_index) to p_asset_tbl(l_asset_tbl_index).p_asset_id
512 --                    SECHAWLA - 14-FEB-03 - Bug 2749690
513 --                       Added logic to calculate Net Investment, Unbileld Receivables and Residual Value for all quote lines
514 --                    SECHAWLA - 21-APR-03 Bug 2925120
515 --                       Modified code to get the Unbilled Rec using calc quote strm API, instead of using LINE_UNBILLED_STREAMS formula
516 --                   RMUNJULU 2757312 Added to store p_split_asset_number
517 --                   SECHAWLA 09-AUG-05 4304230 Modified to return 0 residual value if asset status is Evergreen
518 --                   PRASJAIN Bug 6030917 Modified the signature of
519 --                   okl_am_util_pvt.get_net_investment() and Removed the proration
520 --                   after the call
521 -- End of comments
522 
523 
524 PROCEDURE contract_lines (
525                 p_qtev_rec      IN qtev_rec_type,
526                 p_asset_tbl     IN asset_tbl_type,
527                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
528                 x_return_status OUT NOCOPY VARCHAR2) IS
529 
530         l_quote_line_type       CONSTANT VARCHAR2(30) := 'AMCFIA';
531         l_overall_status        VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
532         l_return_status         VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
533         l_line_value            NUMBER          := 0;
534         l_line_total            NUMBER;
535         l_asset_tbl_index       NUMBER;
536 
537     --SECHAWLA 14-FEB-03  2749690 : New declarations
538     l_net_investment    NUMBER;
539     --l_unbilled_rec      NUMBER; --SECHAWLA 21-APR-03 Bug 2925120
540     l_residual_value    NUMBER;
541     l_asset_value           ak_attributes_vl.attribute_label_long%TYPE;
542 
543     -- SECHAWLA 09-AUG-05 4304230 : Modified to get line status
544     -- This cursor is used to get the residual value for an asset
545     CURSOR l_okllines_csr(p_kle_id IN NUMBER) IS
546     SELECT nvl(kle.residual_value,0), cle.sts_code
547     FROM   okl_k_lines kle, okc_k_lines_b cle
548     WHERE  kle.id = p_kle_id
549     AND    kle.id = cle.id;
550 
551     l_asset_status        VARCHAR2(30); -- SECHAWLA 09-AUG-05 4304230
552 
553     --SECHAWLA 14-FEB-03  2749690 : end new declarations
554 
555     --SECHAWLA 21-APR-03 Bug 2925120: New declarations
556     l_tqlv_tbl                      tqlv_tbl_type;
557     l_total_line_unbilled_rec   NUMBER;
558 
559     -- Start : Bug 6030917 : prasjain
560     l_proration_factor          NUMBER;
561     -- End : Bug 6030917 : prasjain
562   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'contract_lines';
563     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
564     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
565     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
566 BEGIN
567 
568    IF (is_debug_procedure_on) THEN
569        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
570    END IF;
571 
572 
573         -- *************************************************
574         -- Set Quote Line - Contract Line FK for performance
575         -- *************************************************
576 
577         IF p_asset_tbl.COUNT > 0 THEN
578 
579                 l_asset_tbl_index := p_asset_tbl.FIRST;
580 
581                 LOOP
582 
583             --SECHAWLA 14-FEB-03 2749690 : Calculate Asset Value, Unbilled Receivables and Residual Value for each
584             --quote line
585 
586              -- Start : Bug 6030917 : prasjain
587              l_proration_factor := p_asset_tbl(l_asset_tbl_index).p_quote_qty/p_asset_tbl(l_asset_tbl_index).p_asset_qty;
588              -- End : Bug 6030917 : prasjain
589 
590        IF (is_debug_statement_on) THEN
591          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
592         'Before OKL_AM_CALCULATE_QUOTE_PVT.contract_lines calls okl_am_util_pvt.get_net_investment'||l_return_status);
593        END IF;
594 
595 
596             -- Calculate Net Investment
597             l_net_investment := okl_am_util_pvt.get_net_investment(
598                                                p_khr_id         => p_qtev_rec.khr_id,
599                                                p_kle_id         => p_asset_tbl(l_asset_tbl_index).p_asset_id,
600                                                p_quote_id       => p_qtev_rec.id, -- rmunjulu LOANS_ENHANCEMENT -- pass quote id as it is required to derive eff from date in formula
601                                                p_message_yn     => TRUE,
602                                                p_proration_factor => l_proration_factor,
603                                                x_return_status  => l_return_status);
604 
605        IF (is_debug_statement_on) THEN
606          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
607         'After OKL_AM_CALCULATE_QUOTE_PVT.contract_lines calls okl_am_util_pvt.get_net_investment'||l_return_status);
608        END IF;
609 
610              -- Start : Bug 6030917 : prasjain
611              --NIV prorated okl_am_util_pvt.inside get_net_investment().
612              /**
613 
614             -- prorate net investment
615             IF l_net_investment <> 0 THEN
616                 l_net_investment := (l_net_investment/p_asset_tbl(l_asset_tbl_index).p_asset_qty)*(p_asset_tbl(l_asset_tbl_index).p_quote_qty);
617             END IF;
618 
619             */
620             -- End : Bug 6030917 : prasjain
621 
622             --SECHAWLA 21-APR-03 Bug 2925120: Get the Unbilled Rec value for the financial assets using calc quote stream API
623             -- instead of using  LINE_UNBILLED_STREAMS formula
624 
625          /*   -- Calculate Unbilled Receivables
626             okl_am_util_pvt.get_formula_value(
627                   p_formula_name        => 'LINE_UNBILLED_STREAMS',
628                   p_chr_id              => p_qtev_rec.khr_id,
629                   p_cle_id              => p_asset_tbl(l_asset_tbl_index).p_asset_id,
630                           x_formula_value       => l_unbilled_rec,
631                           x_return_status       => l_return_status);
632         */
633 
634        IF (is_debug_statement_on) THEN
635          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
636         'Before OKL_AM_CALCULATE_QUOTE_PVT.contract_lines calls okl_am_calc_quote_stream_pvt.calc_stream_type_operand'||l_return_status);
637        END IF;
638 
639 
640 
641          okl_am_calc_quote_stream_pvt.calc_stream_type_operand (
642                         p_operand             => 'AMCTUR',
643                         p_qtev_rec            => p_qtev_rec,
644                         p_cle_id              => p_asset_tbl(l_asset_tbl_index).p_asset_id,
645                         --p_formula_name        => l_formula_name, -- formula name is used only for AMYSAM
646                         px_tqlv_tbl       => l_tqlv_tbl,
647                         x_operand_total   => l_total_line_unbilled_rec,
648                         x_return_status   => l_return_status);
649 
650        IF (is_debug_statement_on) THEN
651          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
652         'After OKL_AM_CALCULATE_QUOTE_PVT.contract_lines calls okl_am_calc_quote_stream_pvt.calc_stream_type_operand'||l_return_status);
653        END IF;
654 
655             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
656                 l_asset_value := okl_am_util_pvt.get_ak_attribute(p_code => 'OKL_UNBILLED_RECIVABLES');
657                 -- Unable to calculate ASSET_VALUE
658                 OKL_API.set_message(  p_app_name      => 'OKL',
659                               p_msg_name      => 'OKL_AM_FORMULA_ERROR',
660                               p_token1        => 'ASSET_VALUE',
661                               p_token1_value  => l_asset_value);
662                 l_total_line_unbilled_rec := 0;  -- SECHAWLA 21-APR-03 Bug 2925120: Changed the variable name
663             END IF;
664 
665             -- SECHAWLA 21-APR-03 Bug 2925120: Changed the variable name l_unbilled_rec to l_total_line_unbilled_rec
666             IF l_total_line_unbilled_rec IS NULL THEN
667                l_total_line_unbilled_rec := 0;
668             END IF;
669 
670             --Prorate Unbilled Receivables
671             IF l_total_line_unbilled_rec <> 0 THEN
672                l_total_line_unbilled_rec := (l_total_line_unbilled_rec/p_asset_tbl(l_asset_tbl_index).p_asset_qty)*(p_asset_tbl(l_asset_tbl_index).p_quote_qty);
673             END IF;
674 
675             --Get the Residual value
676             OPEN   l_okllines_csr( p_asset_tbl(l_asset_tbl_index).p_asset_id);
677             FETCH  l_okllines_csr INTO l_residual_value, l_asset_status; -- SECHAWLA 09-AUG-05 4304230 : added asset status
678             IF l_okllines_csr%NOTFOUND THEN
679                OKC_API.set_message( p_app_name      => 'OKC',
680                            p_msg_name      => G_INVALID_VALUE,
681                            p_token1        => G_COL_NAME_TOKEN,
682                            p_token1_value  => 'KLE_ID');
683                l_residual_value := 0;
684             END IF;
685             CLOSE l_okllines_csr;
686 
687             --Prorate Residual Value
688             IF l_residual_value <> 0 THEN
689                IF l_asset_status <> 'EVERGREEN' THEN -- SECHAWLA 09-AUG-05 4304230 : added this condition
690                   l_residual_value := (l_residual_value/p_asset_tbl(l_asset_tbl_index).p_asset_qty)*(p_asset_tbl(l_asset_tbl_index).p_quote_qty);
691                ELSE
692                   l_residual_value := 0; -- SECHAWLA 09-AUG-05 4304230 : added
693                            END IF;
694             END IF;
695            --SECHAWLA 14-FEB-03 2749690 : End new code
696 
697 
698 
699   -- SECHAWLA - Bug 2680542 : Added p_asset_qty and p_quote_qty parameters in call to append_quote_line procedure.
700   --                          Changed reference p_asset_tbl(l_asset_tbl_index) to p_asset_tbl(l_asset_tbl_index).p_asset_id
701            IF (is_debug_statement_on) THEN
702          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
703         'Before OKL_AM_CALCULATE_QUOTE_PVT.contract_lines calls append_quote_line'||l_return_status);
704        END IF;
705 
706 
707             append_quote_line (
708                         p_qtev_rec                 => p_qtev_rec,
709                         p_qlt_code                 => l_quote_line_type,
710                         p_amount                   => l_line_value,
711                         p_kle_id                   => p_asset_tbl(l_asset_tbl_index).p_asset_id, -- changed,
712             p_asset_qty            => p_asset_tbl(l_asset_tbl_index).p_asset_qty, -- added
713             p_quote_qty            => p_asset_tbl(l_asset_tbl_index).p_quote_qty, -- added
714             p_net_investment       => l_net_investment, -- SECHAWLA 14-FEB-03 2749690 :Added another parameter
715             p_split_asset_number   => p_asset_tbl(l_asset_tbl_index).p_split_asset_number, -- RMUNJULU 2757312 Added to store p_split_asset_number
716             p_unbilled_rec         => l_total_line_unbilled_rec, -- SECHAWLA 14-FEB-03 2749690 :Added another parameter
717             p_residual_value       => l_residual_value, -- SECHAWLA 14-FEB-03 2749690 :Added another parameter
718                         p_success_yn           => OKL_API.G_RET_STS_SUCCESS,
719                         p_sty_id                   => NULL,
720                         p_formula_name         => NULL,
721                         p_sub_tqlv_tbl         => G_EMPTY_TQLV_TBL,
722                         p_defaulted_yn         => 'N',
723                         px_tqlv_tbl            => px_tqlv_tbl,
724                         px_tbl_total           => l_line_total);
725 
726                     EXIT WHEN (l_asset_tbl_index = p_asset_tbl.LAST);
727                     l_asset_tbl_index   :=
728                                 p_asset_tbl.NEXT (l_asset_tbl_index);
729                 END LOOP;
730 
731            IF (is_debug_statement_on) THEN
732          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
733         'After OKL_AM_CALCULATE_QUOTE_PVT.contract_lines calls append_quote_line'||l_return_status);
734        END IF;
735 
736         END IF;
737 
738   x_return_status       := l_overall_status;
739 
740  IF (is_debug_statement_on) THEN
741        --OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
742        --       'px_tqlv_tbl     :'||px_tqlv_tbl);
743        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
744              'ret status at the end.. '||l_return_status);
745    END IF;
746 
747    IF (is_debug_procedure_on) THEN
748        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
749    END IF;
750 
751 EXCEPTION
752 
753         WHEN OTHERS THEN
754 
755         IF (is_debug_exception_on) THEN
756             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
757                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
758         END IF;
759         --SECHAWLA 14-FEB-03  2749690 : Close the new cursor
760         IF l_okllines_csr%ISOPEN THEN
761            CLOSE l_okllines_csr;
762         END IF;
763 
764                 -- store SQL error message on message stack for caller
765                 OKL_API.SET_MESSAGE (
766                          p_app_name     => G_APP_NAME
767                         ,p_msg_name     => G_UNEXPECTED_ERROR
768                         ,p_token1       => G_SQLCODE_TOKEN
769                         ,p_token1_value => sqlcode
770                         ,p_token2       => G_SQLERRM_TOKEN
771                         ,p_token2_value => sqlerrm);
772 
773                 -- notify caller of an UNEXPECTED error
774                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
775 
776 END contract_lines;
777 
778 
779 -- Start of comments
780 --
781 -- Procedure Name       : estimate_tax
782 -- Description          : Estimate tax on all quote elements
783 -- Business Rules       :
784 -- Parameters           : array of quote elements
785 -- Version                  : 1.0
786 -- History          : SECHAWLA 20-NOV-02 - Bug 2468222
787 --                  : Changed reference  p_asset_tbl(l_seq) to  p_asset_tbl(l_seq).p_asset_id
788 --                    Changed reference  l_tax_cle_id(l_seq) to  l_tax_cle_id(l_seq).p_asset_id
789 --                  : rmunjulu 3797384 added code to send quote_effective_from_date and quote_id
790 --                  : rmunjulu Sales_Tax_Enhancement Call the OKL Tax engine
791 --                    to formula engine
792 -- End of comments
793 
794 PROCEDURE estimate_tax (
795                 p_qtev_rec      IN qtev_rec_type,
796                 p_asset_tbl     IN asset_tbl_type,
797                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
798                 x_return_status OUT NOCOPY VARCHAR2) IS
799 
800         TYPE amount_tbl_type IS TABLE OF NUMBER
801                 INDEX BY BINARY_INTEGER;
802 
803         l_overall_status        VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
804         l_return_status         VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
805         l_tax_amount            NUMBER;
806         l_asset_tbl_index       NUMBER;
807         l_dummy_total           NUMBER;
808 
809         l_tax_cle_id            asset_tbl_type;
810         e_tax_cle_id            asset_tbl_type;
811         l_taxable_amt           amount_tbl_type;
812         l_chr_taxable_amt       NUMBER          := 0;
813         l_total_taxable_amt     NUMBER          := 0;
814         l_seq                   NUMBER          := 0;
815         l_params                okl_execute_formula_pub.ctxt_val_tbl_type;
816 
817         l_curr_amt              NUMBER;
818         l_curr_cle              NUMBER;
819         l_match_found           BOOLEAN;
820         l_asset_found           BOOLEAN;
821 
822         -- rmunjulu Sales_Tax_Enhancement
823         l_api_version NUMBER := 1;
824     l_msg_count NUMBER;
825     l_msg_data VARCHAR2(3000);
826   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'estimate_tax';
827     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
828     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
829     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
830 BEGIN
831 
832 
833 /* -- rmunjulu Sales_Tax_Enhancement
834         IF px_tqlv_tbl.COUNT > 0 THEN
835 
836             -- ****************************************
837             -- Add up tax for every line and a contract
838             -- ****************************************
839 
840             l_asset_tbl_index := px_tqlv_tbl.FIRST;
841 
842             LOOP
843 
844                 IF NVL (px_tqlv_tbl(l_asset_tbl_index).qlt_code, G_MISC_QLT)
845                         NOT IN ('AMYOUB', 'AMPRTX', G_TAX_QLT)
846                 THEN
847 
848                     -- Local variables to impove readibility
849                     l_curr_amt := NVL(px_tqlv_tbl(l_asset_tbl_index).amount,0);
850                     l_curr_cle := px_tqlv_tbl(l_asset_tbl_index).kle_id;
851                     -- Taxable quote total
852                     l_total_taxable_amt := l_total_taxable_amt + l_curr_amt;
853                     -- Element is taxable
854                     px_tqlv_tbl(l_asset_tbl_index).taxed_yn := 'Y';
855 
856                     -- Element on contract level
857                     IF l_curr_cle IS NULL THEN
858                         l_chr_taxable_amt := l_chr_taxable_amt + l_curr_amt;
859 
860                     -- Non-zero element on line level
861                     ELSIF l_curr_amt <> 0 THEN
862 
863                         -- Flag to show if curr_cle is found in p_asset_tbl
864                         l_asset_found   := FALSE;
865 
866                         IF p_asset_tbl.COUNT > 0 THEN
867 
868                             l_seq       := p_asset_tbl.FIRST;
869 
870                             LOOP
871 
872                                 -- Element is found in p_asset_tbl
873     -- SECHAWLA - Bug 2680542 : Changed reference  p_asset_tbl(l_seq) to  p_asset_tbl(l_seq).p_asset_id
874                                 IF p_asset_tbl(l_seq).p_asset_id = l_curr_cle THEN
875                                     l_asset_found := TRUE;
876                                 END IF;
877 
878                                 EXIT WHEN (l_seq = p_asset_tbl.LAST
879                                         OR l_asset_found);
880                                 l_seq := p_asset_tbl.NEXT(l_seq);
881 
882                             END LOOP;
883 
884                         END IF;
885 
886                         IF NOT l_asset_found THEN
887 
888                             -- Non-asset lines found for full termination
889                             l_chr_taxable_amt   := l_chr_taxable_amt + l_curr_amt;
890                             l_match_found       := TRUE;
891 
892                         ELSE
893 
894                             -- Flag to show if curr_cle is found in l_tax_cle_id
895                             l_match_found       := FALSE;
896 
897                         END IF;
898 
899                         -- Find if curr_cle is already in l_tax_cle_id
900                         IF (NOT l_match_found) AND (l_tax_cle_id.COUNT > 0) THEN
901 
902                             l_seq := l_tax_cle_id.FIRST;
903 
904                             LOOP
905 
906                                 -- Element is already in l_tax_cle_id
907     -- SECHAWLA - Bug 2680542 : Changed reference  l_tax_cle_id(l_seq) to  l_tax_cle_id(l_seq).p_asset_id
908                                 IF l_tax_cle_id(l_seq).p_asset_id = l_curr_cle THEN
909                                     l_taxable_amt(l_seq) :=
910                                         l_taxable_amt(l_seq) + l_curr_amt;
911                                     l_match_found := TRUE;
912                                 END IF;
913 
914                                 EXIT  WHEN (l_seq = l_tax_cle_id.LAST)
915                                         OR (l_match_found);
916                                 l_seq := l_tax_cle_id.NEXT (l_seq);
917 
918                             END LOOP;
919 
920                         END IF;
921 
922                         -- Element is not in l_tax_cle_id yet
923                         IF NOT l_match_found THEN
924                             l_seq := NVL (l_tax_cle_id.LAST, 0) + 1;
925         -- SECHAWLA - Bug 2680542 : Changed reference  l_tax_cle_id(l_seq) to  l_tax_cle_id(l_seq).p_asset_id
926                             l_tax_cle_id(l_seq).p_asset_id       := l_curr_cle;
927                             l_taxable_amt(l_seq) := l_curr_amt;
928                         END IF;
929 
930                     END IF;
931 
932                 END IF;
933 
934                 EXIT WHEN (l_asset_tbl_index = px_tqlv_tbl.LAST);
935                 l_asset_tbl_index :=
936                         px_tqlv_tbl.NEXT (l_asset_tbl_index);
937 
938             END LOOP;
939 
940             -- ********************************
941             -- Check total and contract amounts
942             -- ********************************
943 
944             IF NVL (l_total_taxable_amt, 0) = 0 THEN
945                 -- Only one tax line need to be created
946                 l_tax_cle_id            := e_tax_cle_id;
947                 l_seq := NVL (l_tax_cle_id.LAST, 0) + 1;
948    -- SECHAWLA - Bug 2680542 : Changed reference  l_tax_cle_id(l_seq) to  l_tax_cle_id(l_seq).p_asset_id
949                 l_tax_cle_id(l_seq).p_asset_id  := NULL;
950                 l_taxable_amt(l_seq)    := 0;
951             ELSIF NVL (l_chr_taxable_amt, 0) <> 0 THEN
952                 -- Tax for elements on contract level
953                 l_seq := NVL (l_tax_cle_id.LAST, 0) + 1;
954    -- SECHAWLA - Bug 2680542 : Changed reference  l_tax_cle_id(l_seq) to  l_tax_cle_id(l_seq).p_asset_id
955                 l_tax_cle_id(l_seq).p_asset_id  := NULL;
956                 l_taxable_amt(l_seq)    := l_chr_taxable_amt;
957             END IF;
958 
959             -- *******************************************
960             -- Calculate tax and create TAX quote elements
961             -- *******************************************
962 
963             IF l_tax_cle_id.COUNT > 0 THEN
964 
965                 l_seq := l_tax_cle_id.FIRST;
966 
967                 LOOP
968 
969                     l_tax_amount := 0;
970                     l_return_status := OKL_API.G_RET_STS_SUCCESS;
971 
972                     IF NVL (l_taxable_amt(l_seq), 0) <> 0 THEN
973 
974                         l_params(1).name  := G_TAX_AMT_PARAM;
975                         l_params(1).value := l_taxable_amt(l_seq);
976 
977     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
978     -- send quote_effective_from_date and quote_id
979                         l_params(2).name  := g_add_params(1).name;
980                         l_params(2).value := g_add_params(1).value;
981 
982                         l_params(3).name  := g_add_params(2).name;
983                         l_params(3).value := g_add_params(2).value;
984 
985     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
986 
987                         IF SYS_CONTEXT('USERENV','CLIENT_INFO') IS NOT NULL THEN
988                             okl_am_util_pvt.get_formula_value (
989                                 p_formula_name  => G_TAX_FORMULA,
990                                 p_chr_id        => p_qtev_rec.khr_id,
991      -- SECHAWLA - Bug 2680542 : Changed reference  l_tax_cle_id(l_seq) to  l_tax_cle_id(l_seq).p_asset_id
992                                 p_cle_id        => l_tax_cle_id(l_seq).p_asset_id,
993                                 p_additional_parameters => l_params,
994                                 x_formula_value => l_tax_amount,
995                                 x_return_status => l_return_status);
996                         ELSE
997                             IF G_ORG_ID_MISSING_MSG THEN
998                                 -- ORG_ID is not defined
999                                 OKL_API.SET_MESSAGE (
1000                                      p_app_name => 'FND'
1001                                     ,p_msg_name => 'FND-ORG_ID PROFILE CANNOT READ'
1002                                     ,p_token1   => 'OPTION'
1003                                     ,p_token1_value => 'ORG_ID');
1004                                 G_ORG_ID_MISSING_MSG := FALSE;
1005                             END IF;
1006                             l_return_status := OKL_API.G_RET_STS_ERROR;
1007                         END IF;
1008 
1009                     END IF;
1010 
1011                     append_quote_line (
1012                         p_qtev_rec      => p_qtev_rec,
1013                         p_qlt_code      => G_TAX_QLT,
1014                         p_amount        => l_tax_amount,
1015     -- SECHAWLA - Bug 2680542 : Changed reference  l_tax_cle_id(l_seq) to  l_tax_cle_id(l_seq).p_asset_id
1016                         p_kle_id        => l_tax_cle_id(l_seq).p_asset_id,
1017             p_success_yn        => l_return_status,
1018                         p_sty_id        => NULL,
1019                         p_formula_name  => G_TAX_FORMULA,
1020                         p_sub_tqlv_tbl  => G_EMPTY_TQLV_TBL,
1021                         p_defaulted_yn  => 'N',
1022                         px_tqlv_tbl     => px_tqlv_tbl,
1023                         px_tbl_total    => l_dummy_total);
1024 
1025                     EXIT WHEN (l_seq = l_tax_cle_id.LAST);
1026                     l_seq := l_tax_cle_id.NEXT (l_seq);
1027 
1028                 END LOOP;
1029 
1030             END IF;
1031 
1032         END IF;
1033 */
1034    IF (is_debug_procedure_on) THEN
1035        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
1036    END IF;
1037     -- rmunjulu Sales_Tax_Enhancement
1038     -- Call the new OKL Tax engine to calculate tax
1039     -- TAX API SHOULD CALCULATE TAX FOR ALL QUOTE LINES EXCEPT (AMCFIA, AMYOUB, AMCTAX)
1040         -- QUESTION :: WHAT ABT BILL_ADJST AND AMPRTX QUOTE LINES
1041         -- TAX API WILL CALCULATE TAX AND INSERT INTO TAX ENTITY THE TAX LINES
1042         OKL_PROCESS_SALES_TAX_PUB.calculate_sales_tax(
1043         p_api_version          => l_api_version,
1044         p_init_msg_list        => OKL_API.G_FALSE,
1045         x_return_status        => l_return_status,
1046         x_msg_count            => l_msg_count,
1047         x_msg_data             => l_msg_data,
1048         p_source_trx_id            => p_qtev_rec.id, -- TRX_ID is QUOTE_ID
1049         p_source_trx_name      => 'Estimated Billing',  -- TRX_NAME IS NULL
1050         p_source_table         => 'OKL_TRX_QUOTES_B');  -- SOURCE_TABLE IS OKL_TRX_QUOTES_B
1051 
1052 IF (is_debug_statement_on) THEN
1053        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
1054               'After OKL_AM_CALCULATE_QUOTE_PVT.estimate_tax calls OKL_PROCESS_SALES_TAX_PUB.calculate_sales_tax :'||l_return_status);
1055 END IF;
1056         x_return_status := l_return_status; -- rmunjulu Sales_Tax_Enhancement
1057 
1058 EXCEPTION
1059 
1060         WHEN OTHERS THEN
1061         IF (is_debug_exception_on) THEN
1062             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
1063                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
1064         END IF;
1065                 -- store SQL error message on message stack for caller
1066                 OKL_API.SET_MESSAGE (
1067                          p_app_name     => G_APP_NAME
1068                         ,p_msg_name     => G_UNEXPECTED_ERROR
1069                         ,p_token1       => G_SQLCODE_TOKEN
1070                         ,p_token1_value => sqlcode
1071                         ,p_token2       => G_SQLERRM_TOKEN
1072                         ,p_token2_value => sqlerrm);
1073 
1074                 -- notify caller of an UNEXPECTED error
1075                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
1076 
1077 END estimate_tax;
1078 
1079 PROCEDURE adjust_prorated_amounts (
1080 		p_qtev_rec	IN qtev_rec_type,
1081 		p_asset_tbl	IN asset_tbl_type,
1082 		px_tqlv_tbl	IN OUT NOCOPY tqlv_tbl_type,
1083 		x_return_status	OUT NOCOPY VARCHAR2) IS
1084 
1085 
1086 	l_tqlv_tbl		tqlv_tbl_type;
1087     l_AMBCOC  NUMBER :=0;
1088     l_AMCQFE number :=0;
1089     l_AMCRFE number :=0;
1090     l_AMCQDR NUMBER :=0;
1091     l_AMCRIN NUMBER :=0;
1092     l_AMCSDD NUMBER :=0;
1093     l_AMCTPE NUMBER :=0;
1094     l_AMPRTX NUMBER :=0;
1095     l_AMBPOC NUMBER :=0;
1096 
1097     l_operand_value		NUMBER;
1098     ambcoc_high_index  number :=-1;
1099     ambcoc_low_index  number  :=-1;
1100     amcqfe_high_index  number :=-1;
1101     amcqfe_low_index  number  :=-1;
1102     amcrfe_high_index  number :=-1;
1103     amcrfe_low_index  number  :=-1;
1104 
1105     amcqdr_high_index  number :=-1;
1106     amcqdr_low_index  number  :=-1;
1107     amcrin_high_index  number :=-1;
1108     amcrin_low_index  number  :=-1;
1109     amcsdd_high_index  number :=-1;
1110     amcsdd_low_index  number  :=-1;
1111     amctpe_high_index  number :=-1;
1112     amctpe_low_index  number  :=-1;
1113     amprtx_high_index  number :=-1;
1114     amprtx_low_index  number  :=-1;
1115 
1116     ambpoc_high_index  number :=-1;
1117     ambpoc_low_index  number  :=-1;
1118 
1119     l_ambcoc_diff NUMBER :=0;
1120     l_amcqfe_diff NUMBER :=0;
1121     l_amcrfe_diff NUMBER :=0;
1122     l_amcqdr_diff NUMBER :=0;
1123     l_amcrin_diff NUMBER :=0;
1124     l_amcsdd_diff NUMBER :=0;
1125     l_amctpe_diff NUMBER :=0;
1126     l_amprtx_diff NUMBER :=0;
1127     l_ambpoc_diff NUMBER :=0;
1128 
1129     li number := G_MISS_NUM;
1130     l_ael_apply_diff OKL_SYSTEM_PARAMS.PART_TRMNT_APPLY_ROUND_DIFF%type;
1131    	l_return_status		VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
1132 	l_overall_status	VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
1133 
1134 BEGIN
1135 
1136     l_tqlv_tbl := px_tqlv_tbl;
1137 
1138     select PART_TRMNT_APPLY_ROUND_DIFF into l_ael_apply_diff
1139     from OKL_SYSTEM_PARAMS;
1140 
1141 	IF  l_tqlv_tbl.COUNT > 0 THEN
1142 	 li := l_tqlv_tbl.FIRST;
1143         -- append quote lines
1144 		LOOP
1145 		   if l_tqlv_tbl(li).qlt_code = 'AMBCOC' THEN
1146 		        if ambcoc_high_index = -1 then
1147 		            ambcoc_high_index := li;
1148                 end if;
1149 
1150 		        ambcoc_low_index := li;
1151 
1152 		        l_AMBCOC := l_AMBCOC +  l_tqlv_tbl(li).amount;
1153 
1154            elsif l_tqlv_tbl(li).qlt_code = 'AMCRFE' THEN
1155                  if amcrfe_high_index = -1 then
1156 		            amcrfe_high_index := li;
1157                  end if;
1158 
1159 		         amcrfe_low_index := li;
1160 	            l_AMCRFE := l_AMCRFE +  l_tqlv_tbl(li).amount;
1161 
1162            elsif l_tqlv_tbl(li).qlt_code = 'AMCQFE' THEN
1163                 if amcqfe_high_index = -1 then
1164 		            amcqfe_high_index := li;
1165                  end if;
1166 
1167 		         amcqfe_low_index := li;
1168 	            l_AMCQFE := l_AMCQFE +  l_tqlv_tbl(li).amount;
1169 
1170 
1171            elsif l_tqlv_tbl(li).qlt_code = 'AMCQDR' THEN
1172                 if amcqdr_high_index = -1 then
1173 		            amcqdr_high_index := li;
1174                  end if;
1175 
1176 		         amcqdr_low_index := li;
1177 	            l_AMCQDR := l_AMCQDR +  l_tqlv_tbl(li).amount;
1178 
1179            elsif l_tqlv_tbl(li).qlt_code = 'AMCRIN' THEN
1180                 if amcrin_high_index = -1 then
1181 		            amcrin_high_index := li;
1182                  end if;
1183 
1184 		         amcrin_low_index := li;
1185 	            l_AMCRIN := l_AMCRIN +  l_tqlv_tbl(li).amount;
1186 
1187            elsif l_tqlv_tbl(li).qlt_code = 'AMCSDD' THEN
1188                 if amcsdd_high_index = -1 then
1189 		            amcsdd_high_index := li;
1190                  end if;
1191 
1192 		         amcsdd_low_index := li;
1193 	            l_AMCSDD := l_AMCSDD +  l_tqlv_tbl(li).amount;
1194 
1195            elsif l_tqlv_tbl(li).qlt_code = 'AMCTPE' THEN
1196                 if amctpe_high_index = -1 then
1197 		            amctpe_high_index := li;
1198                  end if;
1199 
1200 		         amctpe_low_index := li;
1201 	            l_AMCTPE := l_AMCTPE +  l_tqlv_tbl(li).amount;
1202 
1203            elsif l_tqlv_tbl(li).qlt_code = 'AMPRTX' THEN
1204                 if amprtx_high_index = -1 then
1205 		            amprtx_high_index := li;
1206                  end if;
1207 
1208 		         amprtx_low_index := li;
1209 	            l_AMPRTX := l_AMPRTX +  l_tqlv_tbl(li).amount;
1210 
1211            elsif l_tqlv_tbl(li).qlt_code = 'AMBPOC' THEN
1212                 if ambpoc_high_index = -1 then
1213 		            ambpoc_high_index := li;
1214                  end if;
1215 
1216 		         ambpoc_low_index := li;
1217 	            l_AMBPOC := l_AMBPOC +  l_tqlv_tbl(li).amount;
1218            end if;
1219 
1220 
1221 	      EXIT WHEN (li = l_tqlv_tbl.LAST);
1222 		    li	:= l_tqlv_tbl.NEXT (li);
1223 		END LOOP;
1224 	END IF;
1225 
1226           l_ambcoc_diff := abs(G_AMBCOC-l_AMBCOC);
1227           l_amcqfe_diff := abs(G_AMCQFE-l_AMCQFE);
1228           l_amcrfe_diff := abs(G_AMCRFE-l_AMCRFE);
1229           l_amcqdr_diff := abs(G_AMCQDR-l_AMCQDR);
1230           l_amcrin_diff := abs(G_AMCRIN-l_AMCRIN);
1231           l_amcsdd_diff := abs(G_AMCSDD-l_AMCSDD);
1232           l_amctpe_diff := abs(G_AMCTPE-l_AMCTPE);
1233           l_amprtx_diff := abs(G_AMPRTX-l_AMPRTX);
1234           l_ambpoc_diff := abs(G_AMBPOC-l_AMBPOC);
1235 
1236     if l_ambcoc_diff <> 0 or l_amcqfe_diff <> 0 or
1237        l_amcrfe_diff <> 0 or l_amcqdr_diff <> 0 or
1238        l_amcrin_diff <> 0 or l_amcsdd_diff <> 0 or
1239        l_amctpe_diff <> 0 or l_amprtx_diff <> 0 or l_ambpoc_diff <> 0 then
1240 
1241      IF (l_ael_apply_diff = 'ADD_TO_HIGH') or (l_ael_apply_diff = 'ADD_NEW_LINE') THEN
1242          IF (G_AMBCOC_OPTION = 'PRORATE') THEN
1243             if l_ambcoc_diff <> 0 then
1244               l_tqlv_tbl(ambcoc_high_index).AMOUNT := l_tqlv_tbl(ambcoc_high_index).AMOUNT
1245                                                + l_ambcoc_diff;
1246              end if;
1247          END IF;
1248          IF (G_AMCQFE_OPTION = 'PRORATE') THEN
1249              if l_amcqfe_diff <> 0 then
1250                 l_tqlv_tbl(amcqfe_high_index).AMOUNT := l_tqlv_tbl(amcqfe_high_index).AMOUNT
1251                                                    + l_amcqfe_diff;
1252               end if;
1253          END IF;
1254          IF (G_AMCRFE_OPTION = 'PRORATE') THEN
1255             if l_amcrfe_diff <> 0 then
1256               l_tqlv_tbl(amcrfe_high_index).AMOUNT := l_tqlv_tbl(amcrfe_high_index).AMOUNT
1257                                                    + l_amcrfe_diff;
1258             end if;
1259          END IF;
1260          IF (G_AMCQDR_OPTION = 'PRORATE') THEN
1261            if l_amcqdr_diff <> 0 then
1262               l_tqlv_tbl(amcqdr_high_index).AMOUNT := l_tqlv_tbl(amcqdr_high_index).AMOUNT
1263                                                    + l_amcqdr_diff;
1264             end if;
1265           END IF;
1266           IF (G_AMCRIN_OPTION = 'PRORATE') THEN
1267             if l_amcrin_diff <> 0 then
1268               l_tqlv_tbl(amcrin_high_index).AMOUNT := l_tqlv_tbl(amcrin_high_index).AMOUNT
1269                                                     + l_amcrin_diff;
1270             end if;
1271           END IF;
1272           IF (G_AMCSDD_OPTION = 'PRORATE') THEN
1273             if l_amcsdd_diff <> 0 then
1274               l_tqlv_tbl(amcsdd_high_index).AMOUNT := l_tqlv_tbl(amcsdd_high_index).AMOUNT
1275                                                    + l_amcsdd_diff;
1276             end if;
1277           END IF;
1278           IF (G_AMCTPE_OPTION = 'PRORATE') THEN
1279             if l_amctpe_diff <> 0 then
1280               l_tqlv_tbl(amctpe_high_index).AMOUNT := l_tqlv_tbl(amctpe_high_index).AMOUNT
1281                                                    + l_amctpe_diff;
1282             end if;
1283           END IF;
1284           IF (G_AMPRTX_OPTION = 'PRORATE') THEN
1285             if l_amprtx_diff <> 0 then
1286               l_tqlv_tbl(amprtx_high_index).AMOUNT := l_tqlv_tbl(amprtx_high_index).AMOUNT
1287                                                    + l_amprtx_diff;
1288             end if;
1289           END IF;
1290 
1291            IF (G_AMBPOC_OPTION = 'PRORATE') THEN
1292             if l_ambpoc_diff <> 0 then
1293                  l_tqlv_tbl(ambpoc_high_index).AMOUNT := l_tqlv_tbl(ambpoc_high_index).AMOUNT
1294                                                    + l_ambpoc_diff;
1295             end if;
1296           END IF;
1297 
1298        ELSIF (l_ael_apply_diff = 'ADD_TO_LOW') THEN
1299           IF (G_AMBCOC_OPTION = 'PRORATE') THEN
1300             if l_ambcoc_diff <> 0 then
1301                l_tqlv_tbl(ambcoc_low_index).AMOUNT        := l_tqlv_tbl(ambcoc_low_index).AMOUNT
1302                                                             + l_ambcoc_diff;
1303             end if;
1304           END IF;
1305           IF (G_AMCQFE_OPTION = 'PRORATE') THEN
1306             if l_amcqfe_diff <> 0 then
1307               l_tqlv_tbl(amcqfe_low_index).AMOUNT := l_tqlv_tbl(amcqfe_low_index).AMOUNT
1308                                                    + l_amcqfe_diff;
1309             end if;
1310           END IF;
1311           IF (G_AMCRFE_OPTION = 'PRORATE') THEN
1312             if l_amcrfe_diff <> 0 then
1313               l_tqlv_tbl(amcrfe_low_index).AMOUNT := l_tqlv_tbl(amcrfe_low_index).AMOUNT
1314                                                    + l_amcrfe_diff;
1315             end if;
1316           END IF;
1317           IF (G_AMCQDR_OPTION = 'PRORATE') THEN
1318             if l_amcqdr_diff <> 0 then
1319               l_tqlv_tbl(amcqdr_low_index).AMOUNT := l_tqlv_tbl(amcqdr_low_index).AMOUNT
1320                                                    + l_amcqdr_diff;
1321             end if;
1322           END IF;
1323           IF (G_AMCRIN_OPTION = 'PRORATE') THEN
1324             if l_amcrin_diff <> 0 then
1325               l_tqlv_tbl(amcrin_low_index).AMOUNT := l_tqlv_tbl(amcrin_low_index).AMOUNT
1326                                                    + l_amcrin_diff;
1327             end if;
1328           END IF;
1329           IF (G_AMCSDD_OPTION = 'PRORATE') THEN
1330             if l_amcsdd_diff <> 0 then
1331               l_tqlv_tbl(amcsdd_low_index).AMOUNT := l_tqlv_tbl(amcsdd_low_index).AMOUNT
1332                                                    + l_amcsdd_diff;
1333             end if;
1334           END IF;
1335           IF (G_AMCTPE_OPTION = 'PRORATE') THEN
1336             if l_amctpe_diff <> 0 then
1337               l_tqlv_tbl(amctpe_low_index).AMOUNT := l_tqlv_tbl(amctpe_low_index).AMOUNT
1338                                                    + l_amctpe_diff;
1339             end if;
1340           END IF;
1341           IF (G_AMPRTX_OPTION = 'PRORATE') THEN
1342             if l_amprtx_diff <> 0 then
1343               l_tqlv_tbl(amprtx_low_index).AMOUNT := l_tqlv_tbl(amprtx_low_index).AMOUNT
1344                                                    + l_amprtx_diff;
1345             end if;
1346           END IF;
1347           IF (G_AMBPOC_OPTION = 'PRORATE') THEN
1348              if l_ambpoc_diff <> 0 then
1349               l_tqlv_tbl(ambpoc_low_index).AMOUNT := l_tqlv_tbl(ambpoc_low_index).AMOUNT
1350                                                    + l_ambpoc_diff;
1351             end if;
1352           END IF;
1353 
1354       end if;
1355     end if;
1356     px_tqlv_tbl := l_tqlv_tbl;
1357     G_AMBCOC  :=0;
1358     G_AMCQDR  :=0;
1359     G_AMCQFE  :=0;
1360     G_AMCRFE  :=0;
1361     G_AMCRIN  :=0;
1362     G_AMCSDD  :=0;
1363     G_AMCTPE  :=0;
1364     G_AMPRTX  :=0;
1365     G_AMBPOC  :=0;
1366     G_AMBCOC_OPTION  :='LINE_CALCULATION';
1367     G_AMCQDR_OPTION  :='LINE_CALCULATION';
1368     G_AMCQFE_OPTION  :='LINE_CALCULATION';
1369     G_AMCRFE_OPTION  :='LINE_CALCULATION';
1370     G_AMCRIN_OPTION  :='LINE_CALCULATION';
1371     G_AMCSDD_OPTION  :='LINE_CALCULATION';
1372     G_AMCTPE_OPTION  :='LINE_CALCULATION';
1373     G_AMPRTX_OPTION  :='LINE_CALCULATION';
1374     G_AMBPOC_OPTION  :='LINE_CALCULATION';
1375 	x_return_status	:= l_overall_status;
1376 
1377 EXCEPTION
1378 
1379 	WHEN OTHERS THEN
1380 		-- store SQL error message on message stack for caller
1381 		OKL_API.SET_MESSAGE (
1382 			 p_app_name	=> G_APP_NAME
1383 			,p_msg_name	=> G_UNEXPECTED_ERROR
1384 			,p_token1	=> G_SQLCODE_TOKEN
1385 			,p_token1_value	=> sqlcode
1386 			,p_token2	=> G_SQLERRM_TOKEN
1387 			,p_token2_value	=> sqlerrm);
1388 
1389 		-- notify caller of an UNEXPECTED error
1390 		x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
1391 
1392 END adjust_prorated_amounts;
1393 
1394 -- Start of comments
1395 --
1396 -- Procedure Name       : prorate_operand
1397 -- Description          : Calculate amount to be allocated to an asset
1398 -- Business Rules       :
1399 -- Parameters           : contract, contract line, total amount
1400 -- Version                  : 1.0
1401 -- History          : SECHAWLA 20-FEB-03 2757368
1402 --                      Modified the general proration logic to use CONTRACT_OEC formula instead of QUOTE_GENERIC_LINE_PRORATION
1403 --                      formula.
1404 --                    SECHAWLA 21-APR-03 Bug 2925120
1405 --                      Modified procedure to fix the infinite loop problem
1406 --                  : rmunjulu 3797384 added code to send quote_effective_from_date and quote_id
1407 --                    to formula engine
1408 -- End of comments
1409 
1410 PROCEDURE prorate_operand (
1411                 p_operand               IN VARCHAR2,
1412                 p_chr_id                IN NUMBER,
1413                 p_cle_id                IN NUMBER,
1414                 p_chr_amt               IN NUMBER,
1415                 p_formula_name          IN VARCHAR2,
1416                 p_head_sub_tqlv_tbl     IN tqlv_tbl_type,
1417                 px_line_sub_tqlv_tbl    IN OUT NOCOPY tqlv_tbl_type,
1418                 x_cle_amt               OUT NOCOPY NUMBER,
1419                 x_return_status         OUT NOCOPY VARCHAR2) IS
1420 
1421         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
1422         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
1423         l_formula_name          okl_formulae_v.name%TYPE;
1424         l_formula_string        okl_formulae_v.formula_string%TYPE := NULL;
1425         l_proration_fraction    NUMBER  := 0;
1426         l_tbl_ind               NUMBER;
1427         l_cle_amt               NUMBER;
1428 
1429  --SECHAWLA 20-FEB-03 Bug # 2757368 : new declarations
1430     l_line_oec      NUMBER;
1431     l_contract_oec  NUMBER;
1432 
1433   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'prorate_operand';
1434     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
1435     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
1436     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
1437 BEGIN
1438    IF (is_debug_procedure_on) THEN
1439        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
1440    END IF;
1441         -- ********************************************************
1442         -- Prorate operands which are treated as top formula
1443         -- ********************************************************
1444 IF (is_debug_statement_on) THEN
1445        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
1446               'Inside prorate_operand :: p_head_sub_tqlv_tbl.COUNT :'||p_head_sub_tqlv_tbl.COUNT);
1447 END IF;
1448         IF p_head_sub_tqlv_tbl.COUNT > 0 THEN
1449 
1450             l_tbl_ind := p_head_sub_tqlv_tbl.FIRST;
1451 
1452             LOOP
1453 
1454                 IF NVL (p_head_sub_tqlv_tbl(l_tbl_ind).kle_id, G_MISS_NUM) =
1455                         G_MISS_NUM THEN
1456 
1457                     prorate_operand (
1458                         p_operand       => p_head_sub_tqlv_tbl(l_tbl_ind).qlt_code,
1459                         p_chr_id        => p_chr_id,
1460                         p_cle_id        => p_cle_id,
1461                         p_chr_amt       => p_head_sub_tqlv_tbl(l_tbl_ind).amount,
1462                         p_formula_name  => p_formula_name,
1463                         p_head_sub_tqlv_tbl     => G_EMPTY_TQLV_TBL,
1464                         px_line_sub_tqlv_tbl    => G_EMPTY_TQLV_TBL,
1465                         x_cle_amt       => l_cle_amt,
1466                         x_return_status => l_return_status);
1467 
1468                    IF (is_debug_statement_on) THEN
1469                        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
1470                        'after call to prorate_operand:'||l_return_status);
1471                    END IF;
1472                     px_line_sub_tqlv_tbl(l_tbl_ind) := p_head_sub_tqlv_tbl(l_tbl_ind);
1473                     px_line_sub_tqlv_tbl(l_tbl_ind).amount      := l_cle_amt;
1474                     px_line_sub_tqlv_tbl(l_tbl_ind).kle_id      := p_cle_id;
1475 
1476                  --   EXIT WHEN (l_tbl_ind = p_head_sub_tqlv_tbl.LAST);
1477                  --   l_tbl_ind := p_head_sub_tqlv_tbl.NEXT (l_tbl_ind);
1478 
1479                 END IF;
1480           -- SECHAWLA 21-APR-03 Bug 2925120 : Moved the following loop control statements outside the IF to prevent infinite loop
1481           EXIT WHEN (l_tbl_ind = p_head_sub_tqlv_tbl.LAST);
1482           l_tbl_ind := p_head_sub_tqlv_tbl.NEXT (l_tbl_ind);
1483 
1484             END LOOP;
1485 
1486         END IF;
1487 
1488         -- ***************
1489         -- Prorate operand
1490         -- ***************
1491 
1492         IF NVL (p_chr_amt, 0) <> 0 THEN
1493 
1494             l_formula_name      := p_operand || G_PRORATE_SUFFIX;
1495             l_formula_string    := okl_am_util_pvt.get_formula_string
1496                                         (l_formula_name);
1497 
1498             IF l_formula_string IS NULL THEN
1499                 l_formula_name  := G_GENERIC_PRORATE;
1500             END IF;
1501 
1502         --SECHAWLA 20-FEB-03 Bug # 2757368 : Execute the CONTRACT_OEC formula first at the line level, to get the
1503         --line amount, then execute the formula at header level to get the contract amount. Calculate proration fraction
1504         --manually by dividing the line amount with contract amount.
1505 
1506         -- get the line oec
1507             okl_am_util_pvt.get_formula_value (
1508                 p_formula_name   => l_formula_name,
1509                 p_chr_id             => p_chr_id,
1510                 p_cle_id             => p_cle_id,
1511                 --x_formula_value       => l_proration_fraction,
1512     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
1513     -- pass additional parameters quote_effective_from_date and quote_id
1514         p_additional_parameters => g_add_params,
1515     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- End ++++++++++++++++
1516         x_formula_value  => l_line_oec,
1517                 x_return_status  => l_return_status);
1518 
1519    IF (is_debug_statement_on) THEN
1520        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
1521        'after call to okl_am_util_pvt.get_formula_value :'||l_return_status);
1522    END IF;
1523 
1524             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
1525                   IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
1526                         l_overall_status := l_return_status;
1527                   END IF;
1528             END IF;
1529 
1530         -- get the contract oec
1531             okl_am_util_pvt.get_formula_value (
1532                 p_formula_name   => l_formula_name,
1533                 p_chr_id             => p_chr_id,
1534                 p_cle_id             => NULL,
1535     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
1536     -- pass additional parameters quote_effective_from_date and quote_id
1537         p_additional_parameters => g_add_params,
1538     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- End ++++++++++++++++
1539                 x_formula_value  => l_contract_oec,
1540                 x_return_status  => l_return_status);
1541 
1542           IF (is_debug_statement_on) THEN
1543                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
1544                'after call to okl_am_util_pvt.get_formula_value  :'||l_return_status);
1545            END IF;
1546 
1547             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
1548                   IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
1549                         l_overall_status := l_return_status;
1550                   END IF;
1551             END IF;
1552 
1553         l_proration_fraction := l_line_oec/l_contract_oec;
1554 
1555         --SECHAWLA 20-FEB-03 Bug # 2757368 :  end modifications
1556         END IF;
1557 
1558         IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS
1559         AND l_proration_fraction BETWEEN 0 AND 1 THEN
1560                 x_cle_amt       := p_chr_amt * l_proration_fraction;
1561         ELSE
1562 
1563                 -- Unable to prorate quote element
1564                 -- OPERAND in FORMULA formula
1565                 okl_am_util_pvt.set_message (
1566                          p_app_name     => G_APP_NAME
1567                         ,p_msg_name     => 'OKL_AM_INVALID_PRORATION'
1568                         ,p_token1       => 'FORMULA'
1569                         ,p_token1_value => p_formula_name
1570                         ,p_token2       => 'OPERAND'
1571                         ,p_token2_value => p_operand);
1572 
1573                 x_cle_amt       := 0;
1574 
1575         END IF;
1576 	-- bug 5480622 -- start
1577 	-- set global variable
1578 	IF NVL (p_chr_amt, 0) <> 0 THEN
1579 	    IF (p_operand = 'AMBCOC') AND (G_AMBCOC = 0 )then
1580 	       G_AMBCOC := p_chr_amt;
1581         END IF;
1582         IF (p_operand = 'AMCQFE') AND (G_AMCQFE = 0 )then
1583 	       G_AMCQFE := p_chr_amt;
1584         END IF;
1585         IF (p_operand = 'AMCRFE') AND (G_AMCRFE = 0 )then
1586 	       G_AMCRFE := p_chr_amt;
1587         END IF;
1588         IF (p_operand = 'AMCRIN') AND (G_AMCRIN = 0 )then
1589 	       G_AMCRIN := p_chr_amt;
1590         END IF;
1591         IF (p_operand = 'AMCSDD') AND (G_AMCSDD = 0 )then
1592 	       G_AMCSDD := - abs(p_chr_amt); --Bug# 12811901 Security Depositi always negative
1593         END IF;
1594         IF (p_operand = 'AMCTPE') AND (G_AMCTPE = 0 )then
1595 	       G_AMCTPE := p_chr_amt;
1596         END IF;
1597         IF (p_operand = 'AMPRTX') AND (G_AMPRTX = 0 )then
1598 	       G_AMPRTX := p_chr_amt;
1599         END IF;
1600         --Added by jjuneja for bug 14069557
1601         IF (p_operand = 'AMBPOC') AND (G_AMBPOC = 0 )then
1602 	       G_AMBPOC := p_chr_amt;
1603         END IF;
1604         --End of changes by jjuneja for bug 14069557
1605      END IF;
1606      -- bug 5480622 -- end
1607         x_return_status := l_overall_status;
1608 
1609    IF (is_debug_procedure_on) THEN
1610        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
1611    END IF;
1612 
1613 
1614 EXCEPTION
1615 
1616         WHEN OTHERS THEN
1617 
1618         IF (is_debug_exception_on) THEN
1619             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
1620                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
1621         END IF;
1622 
1623                 -- store SQL error message on message stack for caller
1624                 OKL_API.SET_MESSAGE (
1625                          p_app_name     => G_APP_NAME
1626                         ,p_msg_name     => G_UNEXPECTED_ERROR
1627                         ,p_token1       => G_SQLCODE_TOKEN
1628                         ,p_token1_value => sqlcode
1629                         ,p_token2       => G_SQLERRM_TOKEN
1630                         ,p_token2_value => sqlerrm);
1631 
1632                 -- notify caller of an UNEXPECTED error
1633                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
1634 
1635 END prorate_operand;
1636 
1637 
1638 -- Start of comments
1639 --
1640 -- Procedure Name       : create_default_quote_lines
1641 -- Description          : Create quote lines with zero amount for every record in the table of default line types
1642 -- Business Rules       :
1643 -- Parameters           : contract line or table of contract lines, quote header record, table of quote line records,
1644 --                                 table of default line types
1645 -- Version                  : 1.0
1646 -- History          : SECHAWLA 20-NOV-02 - Bug 2680542 :
1647 --                    Changed reference  p_asset_tbl(l_asset_cnt) to  p_asset_tbl(l_asset_cnt).p_asset_id
1648 -- End of comments
1649 
1650 PROCEDURE create_default_quote_lines (
1651                 p_qtev_rec      IN qtev_rec_type,
1652                 p_cle_id        IN NUMBER,
1653                 p_asset_tbl     IN asset_tbl_type,
1654                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
1655                 p_default_tql   IN qlt_tbl_type,
1656                 x_return_status OUT NOCOPY VARCHAR2) IS
1657 
1658         l_return_status         VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
1659         l_overall_status        VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
1660         l_lines_created         NUMBER          := 0;
1661         l_default_amount        NUMBER          := 0;
1662         l_asset_cnt             NUMBER;
1663         l_default_cnt           NUMBER;
1664         l_default_total         NUMBER;
1665 
1666   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'create_default_quote_lines';
1667     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
1668     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
1669     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
1670 BEGIN
1671   IF (is_debug_procedure_on) THEN
1672        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
1673    END IF;
1674 
1675         IF    p_default_tql.COUNT > 0 THEN
1676 
1677             IF p_cle_id IS NOT NULL
1678             OR p_asset_tbl.COUNT > 0    -- only one set of defaults for a contract
1679                                         -- comment out this condition to use ELSIF
1680             THEN
1681 
1682                 -- **********************************************
1683                 -- Create default quote lines for a contract line
1684                 -- **********************************************
1685 
1686                 l_default_cnt := p_default_tql.FIRST;
1687 
1688                 LOOP
1689 
1690                         append_quote_line (
1691                                 p_qtev_rec      => p_qtev_rec,
1692                                 p_qlt_code      => p_default_tql (l_default_cnt),
1693                                 p_amount        => l_default_amount,
1694                                 p_kle_id        => p_cle_id,
1695                                 p_success_yn    => OKL_API.G_RET_STS_SUCCESS,
1696                                 p_sty_id        => NULL,
1697                                 p_formula_name  => NULL,
1698                                 p_sub_tqlv_tbl  => G_EMPTY_TQLV_TBL,
1699                                 p_defaulted_yn  => 'Y',
1700                                 px_tqlv_tbl     => px_tqlv_tbl,
1701                                 px_tbl_total    => l_default_total);
1702 
1703 
1704                         l_lines_created         := l_lines_created + 1;
1705 
1706                         EXIT WHEN (l_default_cnt = p_default_tql.LAST);
1707                         l_default_cnt := p_default_tql.NEXT(l_default_cnt);
1708 
1709                 END LOOP;
1710 
1711             ELSIF p_asset_tbl.COUNT > 0 THEN    -- set of defaults for every line
1712 
1713                 -- *******************************************************
1714                 -- Recursively create default lines for all contract lines
1715                 -- *******************************************************
1716 
1717                 l_asset_cnt := p_asset_tbl.FIRST;
1718 
1719                 LOOP
1720 
1721                         create_default_quote_lines (
1722                                 p_qtev_rec      => p_qtev_rec,
1723      -- SECHAWLA - Bug 2680542 : Changed reference  p_asset_tbl(l_asset_cnt) to  p_asset_tbl(l_asset_cnt).p_asset_id
1724                                 p_cle_id        => p_asset_tbl(l_asset_cnt).p_asset_id,
1725                                 p_asset_tbl     => p_asset_tbl,
1726                                 px_tqlv_tbl     => px_tqlv_tbl,
1727                                 p_default_tql   => p_default_tql,
1728                                 x_return_status => l_return_status);
1729 
1730                    IF (is_debug_statement_on) THEN
1731                        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
1732                        'after call to create_default_quote_lines :'||l_return_status);
1733                    END IF;
1734 
1735                         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
1736                                 IF l_overall_status <>
1737                                     OKL_API.G_RET_STS_UNEXP_ERROR THEN
1738                                         l_overall_status := l_return_status;
1739                                 END IF;
1740                         END IF;
1741 
1742                         EXIT WHEN (l_asset_cnt = p_asset_tbl.LAST);
1743                         l_asset_cnt := p_asset_tbl.NEXT(l_asset_cnt);
1744 
1745                 END LOOP;
1746 
1747             END IF;
1748 
1749         END IF;
1750 
1751         x_return_status := l_overall_status;
1752 
1753    IF (is_debug_procedure_on) THEN
1754        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
1755    END IF;
1756 
1757 EXCEPTION
1758 
1759         WHEN OTHERS THEN
1760         IF (is_debug_exception_on) THEN
1761             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
1762                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
1763         END IF;
1764                 -- store SQL error message on message stack for caller
1765                 OKL_API.SET_MESSAGE (
1766                          p_app_name     => G_APP_NAME
1767                         ,p_msg_name     => G_UNEXPECTED_ERROR
1768                         ,p_token1       => G_SQLCODE_TOKEN
1769                         ,p_token1_value => sqlcode
1770                         ,p_token2       => G_SQLERRM_TOKEN
1771                         ,p_token2_value => sqlerrm);
1772 
1773                 -- notify caller of an UNEXPECTED error
1774                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
1775 
1776 END create_default_quote_lines;
1777 
1778 
1779 -- Start of comments
1780 --
1781 -- Procedure Name       : validate_qlt_conditions
1782 -- Description          : Validate conditions specific for quote line types
1783 -- Business Rules       :
1784 -- Parameters           : quote header records, quote line type
1785 -- Version              : 1.0
1786 -- End of comments
1787 
1788 PROCEDURE validate_qlt_conditions (
1789                 p_qtev_rec      IN qtev_rec_type,
1790                 p_qlt_code      IN VARCHAR2,
1791                 x_return_status OUT NOCOPY VARCHAR2) IS
1792 
1793         l_overall_status        VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
1794         l_return_status         VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
1795 
1796         L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'validate_qlt_conditions';
1797     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
1798     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
1799     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
1800 BEGIN
1801 
1802    IF (is_debug_procedure_on) THEN
1803        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
1804    END IF;
1805         -- ************************************************
1806         -- If an operand contradicts quote type, dismiss it
1807         -- ************************************************
1808         IF (    p_qlt_code = 'AMCRFE'
1809             AND p_qtev_rec.qtp_code NOT IN (
1810                         'TER_WO_PURCHASE',
1811                         'TER_ROLL_WO_PURCHASE',
1812 			'TER_RECOURSE_WO_PURCHASE'))  -- vsgandhi fixed for Bug 13893046
1813         OR (    p_qlt_code = 'AMCRIN'
1814             AND p_qtev_rec.qtp_code NOT IN (
1815                         'TER_ROLL_PURCHASE',
1816                         'TER_ROLL_WO_PURCHASE'))
1817         THEN
1818 
1819                 -- QLT_CODE quote line is not
1820                 -- allowed for QTP_CODE quote type
1821                 okl_am_util_pvt.set_message (
1822                          p_app_name     => G_APP_NAME
1823                         ,p_msg_name     => 'OKL_AM_ILLEGAL_OPERAND'
1824                         ,p_msg_level    => OKL_AM_UTIL_PVT.G_DEBUG_LEVEL
1825                         ,p_token1       => 'QTP_CODE'
1826                         ,p_token1_value => p_qtev_rec.qtp_code
1827                         ,p_token2       => 'QLT_CODE'
1828                         ,p_token2_value => p_qlt_code);
1829 
1830                 l_return_status := OKL_API.G_RET_STS_ERROR;
1831 
1832         END IF;
1833 
1834         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
1835             IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
1836                 l_overall_status := l_return_status;
1837             END IF;
1838         END IF;
1839 
1840         IF p_qlt_code IN (G_TAX_QLT, 'AMBPOC') THEN
1841                 -- No message needed
1842                 l_return_status := OKL_API.G_RET_STS_ERROR;
1843         END IF;
1844 
1845         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
1846             IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
1847                 l_overall_status := l_return_status;
1848             END IF;
1849         END IF;
1850 
1851         x_return_status := l_overall_status;
1852 
1853    IF (is_debug_procedure_on) THEN
1854        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
1855    END IF;
1856 
1857 EXCEPTION
1858 
1859         WHEN OTHERS THEN
1860 
1861         IF (is_debug_exception_on) THEN
1862             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
1863                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
1864         END IF;
1865 
1866                 -- store SQL error message on message stack for caller
1867                 OKL_API.SET_MESSAGE (
1868                          p_app_name     => G_APP_NAME
1869                         ,p_msg_name     => G_UNEXPECTED_ERROR
1870                         ,p_token1       => G_SQLCODE_TOKEN
1871                         ,p_token1_value => sqlcode
1872                         ,p_token2       => G_SQLERRM_TOKEN
1873                         ,p_token2_value => sqlerrm);
1874 
1875 
1876                 -- notify caller of an UNEXPECTED error
1877                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
1878 
1879 END validate_qlt_conditions;
1880 
1881 
1882 -- Start of comments
1883 --
1884 -- Procedure Name       : validate_rule_level
1885 -- Description          : Validate if rule specified on the correct level
1886 -- Business Rules       :
1887 -- Parameters           : operand, quote header record, rule group, contract line or table of contract lines,
1888 -- Version                  : 1.0
1889 -- History          : SECHAWLA 20-NOV-02 - Bug 2680542 :
1890 --                    Changed reference  p_asset_tbl(l_asset_cnt) to  p_asset_tbl(l_asset_cnt).p_asset_id
1891 -- End of comments
1892 
1893 PROCEDURE validate_rule_level (
1894                 p_rgd_code      IN VARCHAR2,
1895                 p_operand       IN VARCHAR2,
1896                 p_qtev_rec      IN qtev_rec_type,
1897                 p_cle_id        IN NUMBER,
1898                 p_asset_tbl     IN asset_tbl_type,
1899                 x_return_status OUT NOCOPY VARCHAR2) IS
1900 
1901 
1902 
1903         l_rulv_rec                  rulv_rec_type;
1904         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
1905         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
1906         l_line_level_yn         BOOLEAN := FALSE;
1907         l_asset_cnt             NUMBER;
1908         l_rule_chr_id           NUMBER;
1909         L_MODULE_NAME           VARCHAR2(500) := G_MODULE_NAME||'validate_rule_level';
1910     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
1911     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
1912     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
1913 BEGIN
1914 
1915    IF (is_debug_procedure_on) THEN
1916        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
1917    END IF;
1918 
1919         l_rule_chr_id   := okl_am_util_pvt.get_rule_chr_id (p_qtev_rec);
1920 
1921         IF p_operand IN ('AMYSAM', 'AMYFEE', 'AMYOUB') THEN
1922 
1923             l_asset_cnt := p_asset_tbl.FIRST;
1924 
1925             LOOP
1926 
1927                 okl_am_util_pvt.get_rule_record (
1928                         p_rgd_code      => p_rgd_code,
1929                         p_rdf_code      => p_operand,
1930                         p_chr_id        => l_rule_chr_id,
1931    -- SECHAWLA - Bug 2680542 : Changed reference  p_asset_tbl(l_asset_cnt) to  p_asset_tbl(l_asset_cnt).p_asset_id
1932                         p_cle_id        => p_asset_tbl(l_asset_cnt).p_asset_id,
1933                         x_rulv_rec      => l_rulv_rec,
1934                         x_return_status => l_return_status,
1935                         p_message_yn    => FALSE);
1936 
1937                    IF (is_debug_statement_on) THEN
1938                        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
1939                        'after call to okl_am_util_pvt.get_rule_record :'||l_return_status);
1940                    END IF;
1941 
1942                 IF l_return_status = OKL_API.G_RET_STS_SUCCESS THEN
1943                         l_line_level_yn := TRUE;
1944                 END IF;
1945 
1946                 EXIT WHEN (l_asset_cnt = p_asset_tbl.LAST
1947                         OR l_line_level_yn);
1948                 l_asset_cnt := p_asset_tbl.NEXT(l_asset_cnt);
1949 
1950             END LOOP;
1951 
1952             IF l_line_level_yn THEN
1953 
1954                 -- Rule for RULE quote element
1955                 -- must be specified on contract level
1956                 okl_am_util_pvt.set_message (
1957                          p_app_name     => G_APP_NAME
1958                         ,p_msg_name     => 'OKL_AM_WRONG_OPERAND_LEVEL'
1959                         ,p_token1       => 'RULE'
1960                         ,p_token1_value => p_operand);
1961 
1962                 l_return_status := OKL_API.G_RET_STS_ERROR;
1963 
1964             ELSE
1965                 l_return_status := OKL_API.G_RET_STS_SUCCESS;
1966             END IF;
1967 
1968         END IF;
1969 
1970         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
1971             IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
1972                 l_overall_status := l_return_status;
1973             END IF;
1974         END IF;
1975 
1976         x_return_status := l_overall_status;
1977 
1978    IF (is_debug_procedure_on) THEN
1979        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
1980    END IF;
1981 
1982 EXCEPTION
1983 
1984         WHEN OTHERS THEN
1985 
1986         IF (is_debug_exception_on) THEN
1987             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
1988                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
1989         END IF;
1990 
1991                 -- store SQL error message on message stack for caller
1992                 OKL_API.SET_MESSAGE (
1993                          p_app_name     => G_APP_NAME
1994                         ,p_msg_name     => G_UNEXPECTED_ERROR
1995                         ,p_token1       => G_SQLCODE_TOKEN
1996                         ,p_token1_value => sqlcode
1997                         ,p_token2       => G_SQLERRM_TOKEN
1998                         ,p_token2_value => sqlerrm);
1999 
2000 
2001                 -- notify caller of an UNEXPECTED error
2002                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
2003 
2004 END validate_rule_level;
2005 
2006 
2007 -- Start of comments
2008 --
2009 -- Procedure Name       : get_rule_value
2010 -- Description          : Evaluate rule record. It can be  not_applicable, constant or formula
2011 -- Business Rules       :
2012 -- Parameters           : contract, line, rule group, rule name, calculation option,  optional fixed amount or formula name
2013 -- Version                  : 1.0
2014 -- History          : SECHAWLA 26-FEB-03 Bug # 2819559 : Added code to convert the fixed amount to contract currency
2015 --                    in case of Recourse type of quoets
2016 --                  : 20-OCT-03 MDOKAL Bug # 3061765 : Financed Fees modifications
2017 --                  : rmunjulu 3797384 added code to send quote_effective_from_date and quote_id
2018 --                    to formula engine
2019 --                  : 29-SEP-04 PAGARG Bug #3921591: Added AMRFEE (rollover) operand processing.
2020 -- End of comments
2021 
2022 PROCEDURE get_rule_value (
2023                 p_calc_option   IN VARCHAR2,
2024                 p_fixed_value   IN VARCHAR2,
2025                 p_formula_name  IN VARCHAR2,
2026                 p_rgd_code      IN VARCHAR2,
2027                 p_operand       IN VARCHAR2,
2028                 p_qtev_rec      IN qtev_rec_type,
2029                 p_cle_id        IN NUMBER,
2030                 p_sub_check_yn  IN BOOLEAN,
2031                 p_head_rgd_code IN VARCHAR2,
2032                 p_line_rgd_code IN VARCHAR2,
2033                 p_asset_tbl     IN asset_tbl_type,
2034                 px_sub_tqlv_tbl IN OUT NOCOPY tqlv_tbl_type,
2035                 x_rule_value    OUT NOCOPY NUMBER,
2036                 x_return_status OUT NOCOPY VARCHAR2) IS
2037 
2038         l_overall_status                   VARCHAR2(1)  := OKL_API.G_RET_STS_SUCCESS;
2039         l_return_status                VARCHAR2(1)      := OKL_API.G_RET_STS_SUCCESS;
2040         l_rule_value                       NUMBER;
2041 
2042     --SECHAWLA 26-FEB-03 Bug # 2819559 : New declarations
2043     l_rule_chr_id                          NUMBER;
2044     l_vendor_program_curr_code     GL_LEDGERS_PUBLIC_V.CURRENCY_CODE%TYPE;
2045     l_lease_contract_curr_code     okc_k_headers_b.currency_code%TYPE;
2046     lx_contract_currency           okl_k_headers_full_v.currency_code%TYPE;
2047     lx_currency_conversion_type    okl_k_headers_full_v.currency_conversion_type%TYPE;
2048     lx_currency_conversion_rate    okl_k_headers_full_v.currency_conversion_rate%TYPE;
2049     lx_currency_conversion_date    okl_k_headers_full_v.currency_conversion_date%TYPE;
2050     lx_converted_amount            NUMBER;
2051 
2052     -- Bug # 3061765 MDOKAL
2053     -- Finanaced Fees - passing additonal parameter for calling generic formula
2054     l_add_params                okl_execute_formula_pub.ctxt_val_tbl_type;
2055     L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'get_rule_value';
2056     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
2057     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
2058     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
2059 BEGIN
2060 
2061   IF (is_debug_procedure_on) THEN
2062        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
2063    END IF;
2064 
2065 
2066         IF    p_calc_option = 'NOT_APPLICABLE' THEN
2067 
2068                 l_rule_value    := NULL;
2069 
2070         ELSIF p_calc_option = 'USE_FIXED_AMOUNT'
2071         AND   NVL (p_fixed_value, G_MISS_CHAR) <> G_MISS_CHAR THEN
2072 
2073                 l_rule_value := To_Number (p_fixed_value);
2074 
2075         --SECHAWLA 26-FEB-03 Bug # 2819559 : Convert the fixed amount to contract curency in case of Recourse type of quotes
2076         IF p_qtev_rec.qtp_code LIKE 'TER_RECOURSE%' THEN
2077            -- get the functional currency
2078           -- l_vendor_program_curr_code := okl_am_util_pvt.get_functional_currency;
2079           l_rule_chr_id := okl_am_util_pvt.get_rule_chr_id (p_qtev_rec);
2080           l_vendor_program_curr_code := okl_am_util_pvt.get_chr_currency( p_chr_id => l_rule_chr_id);
2081 
2082            -- get the contract currency
2083            l_lease_contract_curr_code := okl_am_util_pvt.get_chr_currency( p_chr_id => p_qtev_rec.khr_id);
2084            IF l_vendor_program_curr_code <> l_lease_contract_curr_code THEN
2085                 okl_accounting_util.convert_to_contract_currency
2086                     (
2087                         p_khr_id                        => p_qtev_rec.khr_id,
2088                         p_from_currency                         => l_vendor_program_curr_code,
2089                         p_transaction_date                      => G_SYSDATE,
2090                         p_amount                                    => l_rule_value,
2091                         x_return_status                     => l_return_status,
2092                         x_contract_currency                     => lx_contract_currency,
2093                         x_currency_conversion_type          => lx_currency_conversion_type,
2094                         x_currency_conversion_rate          => lx_currency_conversion_rate,
2095                         x_currency_conversion_date          => lx_currency_conversion_date,
2096                         x_converted_amount                      => lx_converted_amount
2097                     );
2098 
2099                    IF (is_debug_statement_on) THEN
2100                        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2101                        'after call to okl_accounting_util.convert_to_contract_currency:'||l_return_status);
2102                    END IF;
2103 
2104                 IF (l_return_status = OKL_API.G_RET_STS_SUCCESS) THEN
2105                    l_rule_value := lx_converted_amount ;
2106                 END IF;
2107             END IF;
2108         END IF;
2109         -- SECHAWLA 26-FEB-03 Bug # 2819559 : end modifications
2110 
2111         ELSIF p_calc_option = 'USE_FORMULA'
2112         AND   NVL (p_formula_name, G_MISS_CHAR) <> G_MISS_CHAR THEN
2113 
2114                 IF  p_sub_check_yn
2115                 AND p_operand IN ('AMBCOC') THEN
2116 
2117                     process_top_formula (
2118                         p_head_rgd_code => p_head_rgd_code,
2119                         p_line_rgd_code => p_line_rgd_code,
2120                         p_qtev_rec      => p_qtev_rec,
2121                         p_cle_id        => p_cle_id,
2122                         p_asset_tbl     => p_asset_tbl,
2123                         p_formula_name  => p_formula_name,
2124                         p_operand       => p_operand,
2125                         px_tqlv_tbl     => px_sub_tqlv_tbl,
2126                         x_formula_total => l_rule_value,
2127                         x_return_status => l_return_status);
2128 
2129                    IF (is_debug_statement_on) THEN
2130                        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2131                        'after call to process_top_formula :'||l_return_status);
2132                    END IF;
2133                     l_rule_value := NULL;
2134 
2135                 ELSE
2136 
2137                     okl_am_util_pvt.get_formula_value (
2138                         p_formula_name  => p_formula_name,
2139                         p_chr_id        => p_qtev_rec.khr_id,
2140                         p_cle_id        => p_cle_id,
2141     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
2142     -- pass additional parameters quote_effective_from_date and quote_id
2143         p_additional_parameters => g_add_params,
2144     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- End ++++++++++++++++
2145                         x_formula_value => l_rule_value,
2146                         x_return_status => l_return_status);
2147 
2148                    IF (is_debug_statement_on) THEN
2149                        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2150                        'after call to okl_am_util_pvt.get_formula_value :'||l_return_status);
2151                    END IF;
2152 
2153                 END IF;
2154 
2155                 IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
2156                         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR
2157                         THEN
2158                                 l_overall_status := l_return_status;
2159                         END IF;
2160                 END IF;
2161 
2162     -- Bug # 3061765 MDOKAL
2163     -- Finanaced Fees - processing for operands pertaining to financed fee's
2164     --Bug #3921591: pagarg +++ Rollover +++
2165     -- Included Rollover Fee opernad also.
2166     ELSIF p_operand IN ('AMFFEE','AMAFEE','AMIFEE','AMPFEE','AMEFEE','AMMFEE','AMGFEE','AMRFEE')
2167     THEN
2168         IF p_formula_name IS NOT NULL THEN -- User has selected a formula
2169           G_FORMULA_VALUE_FOUND := TRUE;
2170 
2171           -- If the defautl formula (CONTRACT_FEE_AMOUNT) is used then the
2172           -- operand is passed as an additional parameter
2173           l_add_params(1).name  := 'p_operand';
2174               l_add_params(1).value     := p_operand;
2175 
2176     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
2177     -- set the quote_effective_from_date and quote_id
2178           l_add_params(2).name  := g_add_params(1).name;
2179               l_add_params(2).value     := g_add_params(1).value;
2180 
2181           l_add_params(3).name  := g_add_params(2).name;
2182               l_add_params(3).value     := g_add_params(2).value;
2183     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- End ++++++++++++++++
2184 
2185           --Bug #3921591: pagarg +++ Rollover +++
2186           -- if cle_id is passed then need to calculate for that asset only. This
2187           -- will be in case of partial termination and formula will be calculated
2188           -- for asset level streams for the fee. instead of passing null pass p_cle_id,
2189           -- value of which will be either nul or asset id
2190           okl_am_util_pvt.get_formula_value (
2191                         p_formula_name  => p_formula_name,
2192                         p_chr_id            => p_qtev_rec.khr_id,
2193                         p_cle_id            => p_cle_id,
2194                         p_additional_parameters => l_add_params,
2195                         x_formula_value => l_rule_value,
2196                         x_return_status => l_return_status);
2197 
2198            IF (is_debug_statement_on) THEN
2199                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2200                'after call to okl_am_util_pvt.get_formula_value :'||l_return_status);
2201            END IF;
2202 
2203         ELSE
2204           G_FORMULA_VALUE_FOUND := FALSE;
2205         END IF;
2206         ELSE
2207 
2208                 -- Invalid combination of values
2209                 -- for RULE rule in GROUP group
2210                 okl_am_util_pvt.set_message(
2211                          p_app_name     => G_APP_NAME
2212                         ,p_msg_name     => 'OKL_AM_INVALID_RULE_FORMULA'
2213                         ,p_msg_level    => OKL_AM_UTIL_PVT.G_DEBUG_LEVEL
2214                         ,p_token1       => 'GROUP'
2215                         ,p_token1_value => p_rgd_code
2216                         ,p_token2       => 'RULE'
2217                         ,p_token2_value => p_operand);
2218 
2219                 l_overall_status        := OKL_API.G_RET_STS_ERROR;
2220 
2221         END IF;
2222 
2223         x_rule_value    := l_rule_value;
2224         x_return_status := l_overall_status;
2225 
2226    IF (is_debug_procedure_on) THEN
2227        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
2228    END IF;
2229 
2230 EXCEPTION
2231 
2232         WHEN OTHERS THEN
2233 
2234                 IF (is_debug_exception_on) THEN
2235                     OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
2236                            || sqlcode || ' , SQLERRM : ' || sqlerrm);
2237                 END IF;
2238                 -- store SQL error message on message stack for caller
2239                 OKL_API.SET_MESSAGE (
2240                          p_app_name     => G_APP_NAME
2241                         ,p_msg_name     => G_UNEXPECTED_ERROR
2242                         ,p_token1       => G_SQLCODE_TOKEN
2243                         ,p_token1_value => sqlcode
2244                         ,p_token2       => G_SQLERRM_TOKEN
2245                         ,p_token2_value => sqlerrm);
2246 
2247                 -- notify caller of an UNEXPECTED error
2248                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
2249 
2250 END get_rule_value;
2251 
2252 
2253 -- Start of comments
2254 --
2255 -- Procedure Name       : get_min_max_rule_value
2256 -- Description          : Calculate value of rules with min or max
2257 -- Business Rules       :
2258 -- Parameters           : contract, line, rule group, rule name,
2259 --                        calculation option,
2260 --                        optional fixed amount or formula name
2261 -- History          : PAGARG Bug 4102565 Added 2 new out nocopy parameters
2262 -- Version                  : 1.0
2263 -- End of comments
2264 
2265 PROCEDURE get_min_max_rule_value (
2266                 p_rulv_rec      IN rulv_rec_type,
2267                 p_rgd_code      IN VARCHAR2,
2268                 p_operand       IN VARCHAR2,
2269                 p_qtev_rec      IN qtev_rec_type,
2270                 p_cle_id        IN NUMBER,
2271                 px_rule_value   IN OUT NOCOPY NUMBER,
2272                 x_return_status OUT NOCOPY VARCHAR2,
2273                 x_min_value             OUT NOCOPY NUMBER, -- PAGARG 4102565 Added
2274                 x_max_value             OUT NOCOPY NUMBER) IS -- PAGARG 4102565 Added
2275 
2276         l_dummy_tqlv_tbl        tqlv_tbl_type   := G_EMPTY_TQLV_TBL;
2277         l_overall_status        VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
2278         l_return_status         VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
2279         l_max_status            VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
2280         l_min_status            VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
2281         l_max_value             NUMBER;
2282         l_min_value             NUMBER;
2283         L_MODULE_NAME           VARCHAR2(500)   := G_MODULE_NAME||'get_min_max_rule_value';
2284     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
2285     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
2286     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
2287 BEGIN
2288    IF (is_debug_procedure_on) THEN
2289        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
2290    END IF;
2291 
2292         IF  p_operand = 'AMCTPE' THEN
2293 
2294                 get_rule_value (
2295                         p_calc_option   => p_rulv_rec.RULE_INFORMATION5,
2296                         p_fixed_value   => p_rulv_rec.RULE_INFORMATION6,
2297                         p_formula_name  => p_rulv_rec.RULE_INFORMATION7,
2298                         p_rgd_code      => p_rgd_code,
2299                         p_operand       => p_operand,
2300                         p_qtev_rec      => p_qtev_rec,
2301                         p_cle_id        => p_cle_id,
2302                         p_sub_check_yn  => FALSE,
2303                         p_head_rgd_code => NULL,
2304                         p_line_rgd_code => NULL,
2305                         p_asset_tbl     => G_EMPTY_ASSET_TBL,
2306                         px_sub_tqlv_tbl => l_dummy_tqlv_tbl,
2307                         x_rule_value    => l_max_value,
2308                         x_return_status => l_max_status);
2309 
2310         IF (is_debug_statement_on) THEN
2311                 OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2312                'after call to get_rule_value :'||l_max_status);
2313         END IF;
2314 
2315                 IF l_max_status <> OKL_API.G_RET_STS_SUCCESS THEN
2316                         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR
2317                         THEN
2318                                 l_overall_status := l_max_status;
2319                         END IF;
2320                 END IF;
2321 
2322                 IF  l_max_status = OKL_API.G_RET_STS_SUCCESS
2323                 AND l_max_value IS NOT NULL THEN
2324                         px_rule_value := least (px_rule_value, l_max_value);
2325                 END IF;
2326 
2327         ELSIF  p_operand = 'AMBPOC' THEN
2328 
2329                 get_rule_value (
2330                         p_calc_option   => p_rulv_rec.RULE_INFORMATION5,
2331                         p_fixed_value   => p_rulv_rec.RULE_INFORMATION6,
2332                         p_formula_name  => p_rulv_rec.RULE_INFORMATION7,
2333                         p_rgd_code      => p_rgd_code,
2334                         p_operand       => p_operand,
2335                         p_qtev_rec      => p_qtev_rec,
2336                         p_cle_id        => p_cle_id,
2337                         p_sub_check_yn  => FALSE,
2338                         p_head_rgd_code => NULL,
2339                         p_line_rgd_code => NULL,
2340                         p_asset_tbl     => G_EMPTY_ASSET_TBL,
2341                         px_sub_tqlv_tbl => l_dummy_tqlv_tbl,
2342                         x_rule_value    => l_max_value,
2343                         x_return_status => l_max_status);
2344 
2345                 IF (is_debug_statement_on) THEN
2346                         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2347                        'after call to get_rule_value :'||l_max_status);
2348                 END IF;
2349 
2350                 IF l_max_status <> OKL_API.G_RET_STS_SUCCESS THEN
2351                         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR
2352                         THEN
2353                                 l_overall_status := l_max_status;
2354                         END IF;
2355                 END IF;
2356 
2357                 get_rule_value (
2358                         p_calc_option   => p_rulv_rec.RULE_INFORMATION8,
2359                         p_fixed_value   => p_rulv_rec.RULE_INFORMATION9,
2360                         p_formula_name  => p_rulv_rec.RULE_INFORMATION10,
2361                         p_rgd_code      => p_rgd_code,
2362                         p_operand       => p_operand,
2363                         p_qtev_rec      => p_qtev_rec,
2364                         p_cle_id        => p_cle_id,
2365                         p_sub_check_yn  => FALSE,
2366                         p_head_rgd_code => NULL,
2367                         p_line_rgd_code => NULL,
2368                         p_asset_tbl     => G_EMPTY_ASSET_TBL,
2369                         px_sub_tqlv_tbl => l_dummy_tqlv_tbl,
2370                         x_rule_value    => l_min_value,
2371                         x_return_status => l_min_status);
2372 
2373                 IF (is_debug_statement_on) THEN
2374                         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2375                        'after call to get_rule_value :'||l_min_status);
2376                 END IF;
2377 
2378                 IF l_min_status <> OKL_API.G_RET_STS_SUCCESS THEN
2379                         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR
2380                         THEN
2381                                 l_overall_status := l_min_status;
2382                         END IF;
2383                 END IF;
2384 
2385                 IF  l_max_status = OKL_API.G_RET_STS_SUCCESS
2386                 AND l_max_value IS NOT NULL
2387                 AND l_min_status = OKL_API.G_RET_STS_SUCCESS
2388                 AND l_min_value IS NOT NULL
2389                 AND l_max_value < l_min_value THEN
2390 
2391                     -- Invalid combination of values
2392                     -- for RULE rule in GROUP group
2393                     okl_am_util_pvt.set_message(
2394                          p_app_name     => G_APP_NAME
2395                         ,p_msg_name     => 'OKL_AM_MAX_MIN_MISMATCH'
2396                         ,p_token1       => 'MAX'
2397                         ,p_token1_value => l_max_value
2398                         ,p_token2       => 'MIN'
2399                         ,p_token2_value => l_min_value
2400                         ,p_token3       => 'GROUP'
2401                         ,p_token3_value => p_rgd_code
2402                         ,p_token4       => 'RULE'
2403                         ,p_token4_value => p_operand);
2404 
2405                     l_overall_status    := OKL_API.G_RET_STS_ERROR;
2406 
2407                 END IF;
2408 
2409                 IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS
2410                 AND l_max_status = OKL_API.G_RET_STS_SUCCESS
2411                 AND l_max_value IS NOT NULL THEN
2412                         px_rule_value := least (px_rule_value, l_max_value);
2413                 END IF;
2414 
2415                 IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS
2416                 AND l_min_status = OKL_API.G_RET_STS_SUCCESS
2417                 AND l_min_value IS NOT NULL THEN
2418                         px_rule_value := greatest (px_rule_value, l_min_value);
2419                 END IF;
2420 
2421         END IF;
2422 
2423             x_min_value := l_min_value; -- PAGARG 4102565 Added
2424             x_max_value := l_max_value; -- PAGARG 4102565 Added
2425 
2426         x_return_status := l_overall_status;
2427 
2428    IF (is_debug_procedure_on) THEN
2429        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
2430    END IF;
2431 
2432 
2433 EXCEPTION
2434 
2435         WHEN OTHERS THEN
2436                 IF (is_debug_exception_on) THEN
2437                         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
2438                         || sqlcode || ' , SQLERRM : ' || sqlerrm);
2439                 END IF;
2440                 -- store SQL error message on message stack for caller
2441                 OKL_API.SET_MESSAGE (
2442                          p_app_name     => G_APP_NAME
2443                         ,p_msg_name     => G_UNEXPECTED_ERROR
2444                         ,p_token1       => G_SQLCODE_TOKEN
2445                         ,p_token1_value => sqlcode
2446                         ,p_token2       => G_SQLERRM_TOKEN
2447                         ,p_token2_value => sqlerrm);
2448 
2449                 -- notify caller of an UNEXPECTED error
2450                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
2451 
2452 END get_min_max_rule_value;
2453 
2454 
2455 -- Start of comments
2456 --
2457 -- Procedure Name       : get_operand_value
2458 -- Description          : Calculate value of an operand as
2459 --                        an operand-rule combo or an executable operand
2460 -- Business Rules       :
2461 -- Parameters           : contract, contract line, rule group, rule code
2462 -- History          : PAGARG Bug 4102565 Added 2 new out nocopy parameters
2463 -- Version                  : 1.0
2464 -- End of comments
2465 
2466 PROCEDURE get_operand_value (
2467                 p_rgd_code      IN VARCHAR2,
2468                 p_operand       IN VARCHAR2,
2469                 p_qtev_rec      IN qtev_rec_type,
2470                 p_rule_cle_id   IN NUMBER,
2471                 p_formul_cle_id IN NUMBER,
2472                 p_head_rgd_code IN VARCHAR2,
2473                 p_line_rgd_code IN VARCHAR2,
2474                 p_asset_tbl     IN asset_tbl_type,
2475                 px_sub_tqlv_tbl IN OUT NOCOPY tqlv_tbl_type,
2476                 x_operand_value OUT NOCOPY NUMBER,
2477                 x_return_status OUT NOCOPY VARCHAR2,
2478                 x_min_value             OUT NOCOPY NUMBER, -- PAGARG 4102565 Added
2479                 x_max_value             OUT NOCOPY NUMBER) IS -- PAGARG 4102565 Added
2480 
2481         l_rulv_rec              rulv_rec_type;
2482         l_overall_status        VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
2483         l_return_status         VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
2484         l_operand_value         NUMBER;
2485         l_rule_chr_id           NUMBER;
2486           L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'get_operand_value';
2487     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
2488     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
2489     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
2490 BEGIN
2491 
2492    IF (is_debug_procedure_on) THEN
2493        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
2494    END IF;
2495 
2496    --Print Input Variables
2497    IF (is_debug_statement_on) THEN
2498        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2499               'p_rgd_code :'||p_rgd_code);
2500        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2501               'p_operand :'||p_operand);
2502        --OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2503        --       'p_qtev_rec :'||p_qtev_rec);
2504        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2505               'p_rule_cle_id :'||p_rule_cle_id);
2506        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2507               'p_formul_cle_id :'||p_formul_cle_id);
2508        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2509               'p_head_rgd_code :'||p_head_rgd_code);
2510        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2511               'p_line_rgd_code :'||p_line_rgd_code);
2512        --OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2513        --       'p_asset_tbl :'||p_asset_tbl);
2514    END IF;
2515 
2516 
2517 
2518         -- ****************************************************************
2519         -- Operand Name = Rule Code or Executable Operand = Quote Line Type
2520         -- ****************************************************************
2521 
2522         -- **********************************************
2523         -- Try to process operand as a operand-rule combo
2524         -- **********************************************
2525 
2526         l_rule_chr_id   := okl_am_util_pvt.get_rule_chr_id (p_qtev_rec);
2527 
2528      IF (is_debug_statement_on) THEN
2529                       OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2530                       'before call to okl_am_util_pvt.get_rule_record'||l_return_status);
2531    END IF;
2532 
2533         okl_am_util_pvt.get_rule_record (
2534                         p_rgd_code      => p_rgd_code,
2535                         p_rdf_code      => p_operand,
2536                         p_chr_id        => l_rule_chr_id,
2537                         p_cle_id        => p_rule_cle_id,
2538                         x_rulv_rec      => l_rulv_rec,
2539                         x_return_status => l_return_status,
2540                         p_message_yn    => FALSE);
2541 
2542    IF (is_debug_statement_on) THEN
2543          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2544          'after call to okl_am_util_pvt.get_rule_record'||l_return_status);
2545    END IF;
2546 
2547         IF l_return_status = OKL_API.G_RET_STS_SUCCESS THEN
2548 
2549                 -- ********************************************************
2550                 -- Evalute rule record: not_applicable, constant or formula
2551                 -- The field INFO1 indicated if the rule is either
2552                 -- not applicable (evaluated to null), equals to a
2553                 -- constant value, or equals to a value of a formula.
2554                 -- The field INFO2 allows to specify the value of a
2555                 -- the constant. The field INFO3 allows to specify a
2556                 -- formula to use for calculations.
2557                 -- ********************************************************
2558 
2559      IF (is_debug_statement_on) THEN
2560                       OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2561                       'before call to get_rule_value'||l_return_status);
2562    END IF;
2563 
2564                 get_rule_value (
2565                         p_calc_option   => l_rulv_rec.RULE_INFORMATION1,
2566                         p_fixed_value   => l_rulv_rec.RULE_INFORMATION2,
2567                         p_formula_name  => l_rulv_rec.RULE_INFORMATION3,
2568                         p_rgd_code      => p_rgd_code,
2569                         p_operand       => p_operand,
2570                         p_qtev_rec      => p_qtev_rec,
2571                         p_cle_id        => p_formul_cle_id,
2572                         p_sub_check_yn  => TRUE,
2573                         p_head_rgd_code => p_head_rgd_code,
2574                         p_line_rgd_code => p_line_rgd_code,
2575                         p_asset_tbl     => p_asset_tbl,
2576                         px_sub_tqlv_tbl => px_sub_tqlv_tbl,
2577                         x_rule_value    => l_operand_value,
2578                         x_return_status => l_return_status);
2579 
2580      IF (is_debug_statement_on) THEN
2581             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2582             'after call to get_rule_value'||l_return_status);
2583      END IF;
2584 
2585                 IF  l_return_status = OKL_API.G_RET_STS_SUCCESS
2586                 AND p_operand IN ('AMCTPE','AMBPOC')
2587                 AND l_operand_value IS NOT NULL THEN
2588 
2589         IF (is_debug_statement_on) THEN
2590                       OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2591                       'before call to get_min_max_rule_value'||l_return_status);
2592         END IF;
2593 
2594                         get_min_max_rule_value (
2595                                 p_rulv_rec      => l_rulv_rec,
2596                                 p_rgd_code      => p_rgd_code,
2597                                 p_operand       => p_operand,
2598                                 p_qtev_rec      => p_qtev_rec,
2599                                 p_cle_id        => p_formul_cle_id,
2600                                 px_rule_value   => l_operand_value,
2601                                 x_return_status => l_return_status,
2602                                 x_min_value => x_min_value, -- rmunjulu 4102565 Added
2603                                 x_max_value => x_max_value); -- rmunjulu 4102565 Added
2604 
2605           IF (is_debug_statement_on) THEN
2606               OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2607               'after call to get_min_max_rule_value'||l_return_status);
2608           END IF;
2609 
2610                 END IF;
2611 
2612         END IF;
2613 
2614         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
2615                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
2616                         l_overall_status := l_return_status;
2617                 END IF;
2618         END IF;
2619 
2620         x_operand_value := l_operand_value;
2621         x_return_status := l_overall_status;
2622 
2623    IF (is_debug_statement_on) THEN
2624                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2625                       'x_operand_value..'||x_operand_value);
2626                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2627                       'ret status at the end.. '||l_return_status);
2628 
2629    END IF;
2630 
2631    IF (is_debug_procedure_on) THEN
2632        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
2633    END IF;
2634 
2635 
2636 EXCEPTION
2637 
2638         WHEN OTHERS THEN
2639 
2640                 IF (is_debug_exception_on) THEN
2641                          OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
2642                          || sqlcode || ' , SQLERRM : ' || sqlerrm);
2643                 END IF;
2644                 -- store SQL error message on message stack for caller
2645                 OKL_API.SET_MESSAGE (
2646                          p_app_name     => G_APP_NAME
2647                         ,p_msg_name     => G_UNEXPECTED_ERROR
2648                         ,p_token1       => G_SQLCODE_TOKEN
2649                         ,p_token1_value => sqlcode
2650                         ,p_token2       => G_SQLERRM_TOKEN
2651                         ,p_token2_value => sqlerrm);
2652 
2653                 -- notify caller of an UNEXPECTED error
2654                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
2655 
2656 END get_operand_value;
2657 
2658 
2659 -- Start of comments
2660 --
2661 -- Procedure Name       : get_non_rule_operand_value
2662 -- Description          : Look for executable operands and constants
2663 -- Business Rules       :
2664 -- Parameters           : contract, contract line, operand
2665 -- HISTORY          : rmunjulu 3797384 added code to send quote_effective_from_date and quote_id
2666 --                    to formula engine
2667 -- Version              : 1.0
2668 -- End of comments
2669 
2670 PROCEDURE get_non_rule_operand_value (
2671                 p_chr_id        IN NUMBER,
2672                 p_cle_id        IN NUMBER,
2673                 px_operand      IN OUT NOCOPY VARCHAR2,
2674                 x_operand_value OUT NOCOPY NUMBER,
2675                 x_return_status OUT NOCOPY VARCHAR2) IS
2676 
2677         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
2678         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
2679         l_formula_string        okl_formulae_v.formula_string%TYPE      := NULL;
2680         l_operand_value         NUMBER;
2681     L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'get_non_rule_operand_value';
2682     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
2683     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
2684     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
2685 BEGIN
2686 
2687            IF (is_debug_procedure_on) THEN
2688                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
2689            END IF;
2690         -- *********************************
2691         -- Try to process executable operand
2692         -- *********************************
2693 
2694         l_formula_string        := okl_am_util_pvt.get_formula_string
2695                                         (px_operand);
2696 
2697         IF l_formula_string IS NOT NULL THEN
2698 
2699             okl_am_util_pvt.get_formula_value (
2700                 p_formula_name  => px_operand,
2701                 p_chr_id        => p_chr_id,
2702                 p_cle_id        => p_cle_id,
2703     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
2704     -- pass additional parameters quote_effective_from_date and quote_id
2705         p_additional_parameters => g_add_params,
2706     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- End ++++++++++++++++
2707                 x_formula_value => l_operand_value,
2708                 x_return_status => l_return_status);
2709 
2710    IF (is_debug_statement_on) THEN
2711        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2712        'after call to okl_am_util_pvt.get_formula_value :'||l_return_status);
2713    END IF;
2714 
2715             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
2716                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
2717                         l_overall_status := l_return_status;
2718                 END IF;
2719             END IF;
2720 
2721         -- ***************************
2722         -- Try to process fixed number
2723         -- ***************************
2724 
2725         ELSE
2726 
2727             BEGIN
2728                 l_operand_value  := to_number (px_operand);
2729                 px_operand       := G_MISC_QLT;
2730             EXCEPTION
2731                 WHEN OTHERS THEN
2732                     l_overall_status := OKL_API.G_RET_STS_ERROR;
2733             END;
2734 
2735         END IF;
2736 
2737         x_operand_value := l_operand_value;
2738         x_return_status := l_overall_status;
2739 
2740         IF (is_debug_exception_on) THEN
2741             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
2742                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
2743         END IF;
2744 
2745 EXCEPTION
2746         WHEN OTHERS THEN
2747 
2748         IF (is_debug_exception_on) THEN
2749             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
2750                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
2751         END IF;
2752 
2753                 -- store SQL error message on message stack for caller
2754                 OKL_API.SET_MESSAGE (
2755                          p_app_name     => G_APP_NAME
2756                         ,p_msg_name     => G_UNEXPECTED_ERROR
2757                         ,p_token1       => G_SQLCODE_TOKEN
2758                         ,p_token1_value => sqlcode
2759                         ,p_token2       => G_SQLERRM_TOKEN
2760                         ,p_token2_value => sqlerrm);
2761 
2762                 -- notify caller of an UNEXPECTED error
2763                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
2764 
2765 END get_non_rule_operand_value;
2766 
2767 
2768 -- Start of comments
2769 --
2770 -- Procedure Name       : process_stream_type_operand
2771 -- Description          : Calculate an operand based on stream type
2772 -- Business Rules       :
2773 -- Parameters           : operand, quote header record, contract line or table of contract lines,
2774 --                                table of quote line records, header and line rule groups
2775 -- Version                  : 1.0
2776 -- History          : SECHAWLA 20-NOV-02 - Bug 2680542 :
2777 --                      Changed reference  p_asset_tbl(l_tbl_ind) to  p_asset_tbl(l_tbl_ind).p_asset_id
2778 --                    SECHAWLA 21-APR-03 Bug 2925120
2779 --                      Modified procedure to fix the Unit proration problem for Unbilled rec, Service and Fee lines.
2780 --                  : 20-OCT-03 MDOKAL Bug # 3061765 : Financed Fees modifications
2781 --                  : 12-Apr-05 PAGARG Bug 4300443 Comment the call to validate_rule_level
2782 --                    as user can't specify the T and C at asset level so this
2783 --                    validation is not needed
2784 -- End of comments
2785 
2786 PROCEDURE process_stream_type_operand (
2787                 p_head_rgd_code IN VARCHAR2,
2788                 p_line_rgd_code IN VARCHAR2,
2789                 p_operand       IN VARCHAR2,
2790                 p_qtev_rec      IN qtev_rec_type,
2791                 p_cle_id        IN NUMBER,
2792                 p_asset_tbl     IN asset_tbl_type,
2793                 p_formula_name  IN VARCHAR2,
2794                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
2795                 x_operand_total OUT NOCOPY NUMBER,
2796                 x_return_status OUT NOCOPY VARCHAR2) IS
2797 
2798         l_rulv_rec              rulv_rec_type;
2799         l_tqlv_tbl              tqlv_tbl_type;
2800         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
2801         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
2802         l_operand_total         NUMBER;
2803         l_line_total            NUMBER;
2804         l_rgd_code              VARCHAR2(30);
2805         l_calculate_yn          BOOLEAN;
2806         l_tbl_ind               NUMBER;
2807         l_formula_name          VARCHAR2(150)   := NULL;
2808         l_rule_chr_id           NUMBER;
2809 
2810     -- SECHAWLA 21-APR-03 - Bug 2925120: Unbilled Receivebles amounts not getting Unit Prorated.
2811     -- New declaraions
2812     l_asset_ind         NUMBER;
2813     --akrangan Bug 5495474 start
2814     l_orig_kle_id NUMBER;
2815      --cursor to check if financial asset appears as linked asset
2816         CURSOR l_lnk_ast_csr (p_link_line_id  OKC_K_LINES_B.ID%TYPE) IS
2817          SELECT cim.object1_id1 kle_id -- original asset id
2818          FROM   okc_k_lines_b lnk,
2819                 okc_line_styles_b lnk_lse,
2820                 okc_statuses_b sts,
2821                 okc_k_items    cim
2822          WHERE  lnk.id = cim.cle_id
2823          AND    lnk.dnz_chr_id = cim.dnz_chr_id
2824          AND    lnk.lse_id = lnk_lse.id
2825          AND    lnk_lse.lty_code in ('LINK_FEE_ASSET','LINK_SERV_ASSET')
2826          AND    sts.code = lnk.sts_code
2827          AND    sts.ste_code not in ('EXPIRED','TERMINATED','CANCELLED')
2828          AND    cim.jtot_object1_code = 'OKX_COVASST'
2829          AND    cim.cle_id = to_char(p_link_line_id)
2830          AND    cim.object1_id2 = '#';
2831     --akrangan Bug 5495474 end
2832     L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'process_stream_type_operand';
2833     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
2834     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
2835     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
2836 BEGIN
2837 
2838    IF (is_debug_procedure_on) THEN
2839        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
2840    END IF;
2841         -- **************
2842         -- Validate lines
2843         -- **************
2844         IF p_cle_id IS NOT NULL THEN
2845 
2846                 l_rgd_code      := p_line_rgd_code;
2847 
2848         ELSIF p_asset_tbl.COUNT > 0
2849         AND p_qtev_rec.qtp_code NOT LIKE 'TER_MAN%' THEN
2850         -- PAGARG Bug 4300443 Comment the call to validate_rule_level as this
2851                 -- validation is redundant
2852                 /*
2853                 validate_rule_level (
2854                         p_rgd_code      => p_line_rgd_code,
2855                         p_operand       => p_operand,
2856                         p_qtev_rec      => p_qtev_rec,
2857                         p_cle_id        => p_cle_id,
2858                         p_asset_tbl     => p_asset_tbl,
2859                         x_return_status => l_return_status);
2860                 */
2861 
2862                 l_rgd_code      := p_head_rgd_code;
2863 
2864         END IF;
2865 
2866         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
2867                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
2868                         l_overall_status := l_return_status;
2869                 END IF;
2870         END IF;
2871 
2872         -- ***********************************************
2873         -- Decide if element should be included into quote
2874         -- ***********************************************
2875 
2876         IF p_qtev_rec.qtp_code LIKE 'TER_MAN%' THEN
2877                 l_calculate_yn  := TRUE;
2878 
2879         ELSIF p_operand IN ('AMYOUB', 'AMYSAM', 'AMYFEE')
2880         AND   l_overall_status = OKL_API.G_RET_STS_SUCCESS THEN
2881 
2882             l_rule_chr_id       := okl_am_util_pvt.get_rule_chr_id (p_qtev_rec);
2883 
2884             okl_am_util_pvt.get_rule_record (
2885                 p_rgd_code      => l_rgd_code,
2886                 p_rdf_code      => p_operand,
2887                 p_chr_id        => l_rule_chr_id,
2888                 p_cle_id        => p_cle_id,
2889                 x_rulv_rec      => l_rulv_rec,
2890                 x_return_status => l_return_status,
2891                 p_message_yn    => FALSE);
2892 
2893            IF (is_debug_statement_on) THEN
2894                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2895                'after call to okl_am_util_pvt.get_rule_record :'||l_return_status);
2896            END IF;
2897 
2898             IF (        l_return_status <> OKL_API.G_RET_STS_SUCCESS)
2899             OR (        l_return_status = OKL_API.G_RET_STS_SUCCESS
2900                     AND l_rulv_rec.RULE_INFORMATION1 = 'Y')
2901             THEN
2902 /*
2903                 IF  p_qtev_rec.partial_yn = 'Y' THEN
2904 
2905                     -- OPERAND quote element in FORMULA formula can
2906                     -- not be fully calculated for partial quote
2907                     okl_am_util_pvt.set_message (
2908                          p_app_name     => G_APP_NAME
2909                         ,p_msg_name     => 'OKL_AM_INVALID_FOR_PARTIAL'
2910                         ,p_token1       => 'FORMULA'
2911                         ,p_token1_value => p_formula_name
2912                         ,p_token2       => 'OPERAND'
2913                         ,p_token2_value => p_operand);
2914 
2915                 END IF;
2916 */
2917 
2918                 l_calculate_yn  := TRUE;
2919 
2920         -- Bug # 3061765 MDOKAL
2921         -- Financed Fees, global set to indicate that the contractual fee will
2922         -- be calculated and therefore do not calculate financed fee types
2923         -- in process_operand
2924         IF p_operand = 'AMYFEE' THEN
2925             G_CONT_FEE_CALC_DONE := TRUE;
2926         END IF;
2927 
2928                 -- Service and Maintenance can have user-defined formula
2929                 -- By default, unbilled streams are calculated
2930                 IF  p_operand = 'AMYSAM'
2931                 AND l_rulv_rec.RULE_INFORMATION2 IS NOT NULL
2932                 AND l_rulv_rec.RULE_INFORMATION2 <> G_MISS_CHAR THEN
2933                         l_formula_name  := l_rulv_rec.RULE_INFORMATION2;
2934                 END IF;
2935 
2936             ELSE
2937                 l_calculate_yn  := FALSE;
2938 
2939             END IF;
2940 
2941         ELSIF p_operand IN ('AMCTUR') THEN
2942                 l_calculate_yn  := TRUE;
2943 
2944         ELSE
2945                 l_calculate_yn  := FALSE;
2946 
2947         END IF;
2948 
2949         IF l_calculate_yn THEN
2950 
2951             -- *****************************************
2952             -- Calculate elements for all contract lines
2953             -- *****************************************
2954 
2955             IF  NVL (p_qtev_rec.partial_yn, 'N') <> 'Y'
2956             AND p_cle_id IS NULL THEN
2957 
2958                 okl_am_calc_quote_stream_pvt.calc_stream_type_operand (
2959                         p_operand       => p_operand,
2960                         p_qtev_rec      => p_qtev_rec,
2961                         p_cle_id        => NULL,
2962                         p_formula_name  => l_formula_name,
2963                         px_tqlv_tbl     => l_tqlv_tbl,
2964                         x_operand_total => l_line_total,
2965                         x_return_status => l_return_status);
2966 
2967            IF (is_debug_statement_on) THEN
2968                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2969                'after call to okl_am_calc_quote_stream_pvt.calc_stream_type_operand :'||l_return_status);
2970            END IF;
2971 
2972                 IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
2973                     IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
2974                         l_overall_status := l_return_status;
2975                     END IF;
2976                 END IF;
2977 
2978             -- **************************************
2979             -- Calculate elements for a contract line
2980             -- **************************************
2981 
2982             ELSIF p_cle_id IS NOT NULL THEN
2983 
2984                 okl_am_calc_quote_stream_pvt.calc_stream_type_operand (
2985                         p_operand       => p_operand,
2986                         p_qtev_rec      => p_qtev_rec,
2987                         p_cle_id        => p_cle_id,
2988                         p_formula_name  => l_formula_name,
2989                         px_tqlv_tbl     => l_tqlv_tbl,
2990                         x_operand_total => l_line_total,
2991                         x_return_status => l_return_status);
2992 
2993 
2994                    IF (is_debug_statement_on) THEN
2995                        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
2996                        'after call to okl_am_calc_quote_stream_pvt.calc_stream_type_operand :'||l_return_status);
2997                    END IF;
2998 
2999 
3000                 IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3001                     IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
3002                         l_overall_status := l_return_status;
3003                     END IF;
3004                 END IF;
3005 
3006             -- **********************************************
3007             -- Calculate elements for selected contract lines
3008             -- **********************************************
3009 
3010             ELSIF p_asset_tbl.COUNT > 0 THEN
3011 
3012                 l_tbl_ind := p_asset_tbl.FIRST;
3013 
3014                 LOOP
3015 
3016                     okl_am_calc_quote_stream_pvt.calc_stream_type_operand (
3017                         p_operand       => p_operand,
3018                         p_qtev_rec      => p_qtev_rec,
3019    -- SECHAWLA - Bug 2680542 : Changed reference  p_asset_tbl(l_tbl_ind) to  p_asset_tbl(l_tbl_ind).p_asset_id
3020                         p_cle_id        => p_asset_tbl(l_tbl_ind).p_asset_id,
3021                         p_formula_name  => l_formula_name,
3022                         px_tqlv_tbl     => l_tqlv_tbl,
3023                         x_operand_total => l_line_total,
3024                         x_return_status => l_return_status);
3025 
3026 
3027                    IF (is_debug_statement_on) THEN
3028                        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3029                        'after call to okl_am_calc_quote_stream_pvt.calc_stream_type_operand :'||l_return_status);
3030                    END IF;
3031 
3032                     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3033                         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR
3034                         THEN
3035                                 l_overall_status := l_return_status;
3036                         END IF;
3037                     END IF;
3038 
3039                     EXIT WHEN (l_tbl_ind = p_asset_tbl.LAST);
3040                     l_tbl_ind := p_asset_tbl.NEXT(l_tbl_ind);
3041 
3042                 END LOOP;
3043 
3044             END IF;
3045 
3046             -- ************
3047             -- Save results
3048             -- ************
3049 
3050             IF l_return_status = OKL_API.G_RET_STS_SUCCESS THEN
3051 
3052 
3053                 IF l_tqlv_tbl.COUNT > 0 THEN
3054 
3055                     l_tbl_ind := l_tqlv_tbl.FIRST;
3056 
3057                     LOOP
3058 
3059              --SECHAWLA 21-APR-03 - Bug 2925120: Unbilled Receivebles amounts not getting Unit Prorated.
3060              -- Added the following piece of code to update quantities in l_tqlv_tbl using G_ASSET_TBL
3061              IF l_tqlv_tbl(l_tbl_ind).kle_id IS NOT NULL THEN
3062                 --akrangan Bug 5495474 start
3063                 FOR l_lnk_ast IN l_lnk_ast_csr(l_tqlv_tbl(l_tbl_ind).kle_id) LOOP
3064                         l_orig_kle_id := l_lnk_ast.kle_id;
3065                 END LOOP;
3066                 --akrangan Bug 5495474 end
3067                 IF G_ASSET_TBL.COUNT > 0 THEN
3068                    l_asset_ind := G_ASSET_TBL.FIRST;
3069                    LOOP
3070                        IF G_ASSET_TBL(l_asset_ind).p_asset_id = l_tqlv_tbl(l_tbl_ind).kle_id
3071                        OR (G_ASSET_TBL(l_asset_ind).p_asset_id = l_orig_kle_id) THEN  --added OR condition--akrangan Bug 5495474
3072                            l_tqlv_tbl(l_tbl_ind).asset_quantity := G_ASSET_TBL(l_asset_ind).p_asset_qty;
3073                            l_tqlv_tbl(l_tbl_ind).quote_quantity := G_ASSET_TBL(l_asset_ind).p_quote_qty;
3074                        END IF;
3075 
3076                        EXIT WHEN (l_asset_ind = G_ASSET_TBL.LAST);
3077                                    l_asset_ind := G_ASSET_TBL.NEXT (l_asset_ind);
3078                    END LOOP;
3079                 END IF;
3080              END IF;
3081              --SECHAWLA 21-APR-03 Bug 2925120: end new code
3082 
3083                         append_quote_line (
3084                             p_qtev_rec          => p_qtev_rec,
3085                             p_qlt_code          => p_operand,
3086                             p_amount            => l_tqlv_tbl(l_tbl_ind).amount,
3087                             p_kle_id            => l_tqlv_tbl(l_tbl_ind).kle_id,
3088                 p_asset_qty     => l_tqlv_tbl(l_tbl_ind).asset_quantity,
3089                 p_quote_qty     => l_tqlv_tbl(l_tbl_ind).quote_quantity,
3090                             p_sty_id            => l_tqlv_tbl(l_tbl_ind).sty_id,
3091                             p_formula_name      => p_formula_name,
3092                             p_success_yn        => l_return_status,
3093                             p_sub_tqlv_tbl      => G_EMPTY_TQLV_TBL,
3094                             p_defaulted_yn      => 'N',
3095                             px_tqlv_tbl         => px_tqlv_tbl,
3096                             px_tbl_total        => l_operand_total);
3097 
3098                         EXIT WHEN (l_tbl_ind = l_tqlv_tbl.LAST);
3099                         l_tbl_ind := l_tqlv_tbl.NEXT (l_tbl_ind);
3100 
3101                     END LOOP;
3102 
3103                 ELSE
3104 
3105                     -- No values found for OPERAND operand
3106                     -- in FORMULA formula
3107                     okl_am_util_pvt.set_message (
3108                          p_app_name     => G_APP_NAME
3109                         ,p_msg_name     => 'OKL_AM_NO_OPERAND_VALUES'
3110                         ,p_token1       => 'FORMULA'
3111                         ,p_token1_value => p_formula_name
3112                         ,p_token2       => 'OPERAND'
3113                         ,p_token2_value => p_operand);
3114 
3115                 END IF;
3116 
3117             ELSE
3118 
3119                 append_quote_line (
3120                             p_qtev_rec          => p_qtev_rec,
3121                             p_qlt_code          => p_operand,
3122                             p_amount            => G_MISS_NUM,
3123                             p_kle_id            => NULL,
3124                             p_formula_name      => p_formula_name,
3125                             p_success_yn        => l_return_status,
3126                             p_sty_id            => NULL,
3127                             p_sub_tqlv_tbl      => G_EMPTY_TQLV_TBL,
3128                             p_defaulted_yn      => 'N',
3129                             px_tqlv_tbl         => px_tqlv_tbl,
3130                             px_tbl_total        => l_operand_total);
3131 
3132             END IF;
3133 
3134         END IF;
3135 
3136         x_operand_total := l_operand_total;
3137         x_return_status := l_overall_status;
3138 
3139            IF (is_debug_procedure_on) THEN
3140        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
3141    END IF;
3142 
3143 EXCEPTION
3144 
3145         WHEN OTHERS THEN
3146 
3147                 IF (is_debug_exception_on) THEN
3148                    OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
3149                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
3150                 END IF;
3151                 -- store SQL error message on message stack for caller
3152                 OKL_API.SET_MESSAGE (
3153                          p_app_name     => G_APP_NAME
3154                         ,p_msg_name     => G_UNEXPECTED_ERROR
3155                         ,p_token1       => G_SQLCODE_TOKEN
3156                         ,p_token1_value => sqlcode
3157                         ,p_token2       => G_SQLERRM_TOKEN
3158                         ,p_token2_value => sqlerrm);
3159 
3160                 -- notify caller of an UNEXPECTED error
3161                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
3162 
3163 END  process_stream_type_operand;
3164 
3165 
3166 -- Start of comments
3167 -- Procedure Name       : process_operand
3168 -- Description          : Calculate quote line(s) for an operand
3169 -- Business Rules       :
3170 -- Parameters           : rule group, operand (= rule code),
3171 --                                quote header record,
3172 --                                contract line or table of contract lines,
3173 --                                table of quote line records,
3174 -- Version                 : 1.0
3175 -- History         : SECHAWLA 20-NOV-02 - Bug 2680542 :
3176 --                     Changed reference  p_asset_tbl(l_asset_cnt) to  p_asset_tbl(l_asset_cnt).p_asset_id
3177 --                     Changed reference l_reject_asset_tbl (l_asset_cnt) to l_reject_asset_tbl (l_asset_cnt).p_asset_id
3178 --                   SECHAWLA 20-FEB-03 Bug # 2757368 :
3179 --                     Added 3 extra parameters asset qty, quote qty and rule_information4 to those calls to
3180 --                     append_quote_lines procedure, which are relevant for proration calculations.
3181 --                   SECHAWLA 24-FEB-03 - Bug 2817025 :
3182 --                     Modified code to by pass proration logic in case of Repurchase quotes
3183 --                  : 20-OCT-03 MDOKAL Bug # 3061765 : Financed Fees modifications
3184 --                 : 29-SEP-2004 PAGARG   Bug #3921591: Added the logic to process rollover fee
3185 --                   operand (AMRFEE) also.
3186 --                 : 21-Dec-2004 PAGARG Bug# 4080063 Remove the Bill Tax parameter
3187 --                   check while calculating estimated property tax quote line.
3188 --                   Check for Property Tax applicable only.
3189 --                 : PAGARG Bug 4102565 Updated the call to get_operand_value
3190 --                   Two additional parameters are passed
3191 --                 : RBRUNO Bug 5380712 - Added check to be introduced  for all quote
3192 --                   line amounts setup as option type of 'No Prorate'.
3193 --                   Added check in the IF condition for 'No Prorate' instead.
3194 -- End of comments
3195 
3196 PROCEDURE process_operand (
3197                 p_head_rgd_code IN VARCHAR2,
3198                 p_line_rgd_code IN VARCHAR2,
3199                 p_operand       IN VARCHAR2,
3200                 p_qtev_rec      IN qtev_rec_type,
3201                 p_cle_id        IN NUMBER,
3202                 p_asset_tbl     IN asset_tbl_type,
3203                 p_formula_name  IN VARCHAR2,
3204                 p_check_qlt_yn  IN BOOLEAN,
3205                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
3206                 x_operand_total OUT NOCOPY NUMBER,
3207                 x_return_status OUT NOCOPY VARCHAR2) IS
3208 
3209         l_head_rulv_rec         rulv_rec_type;  -- Header rule record
3210         l_reject_asset_tbl      asset_tbl_type; -- Lines without rules
3211 
3212         -- Some operands are treated as top formula, that is
3213         -- their operands are stored separately in this variables
3214         l_sub_line_tqlv_tbl     tqlv_tbl_type := G_EMPTY_TQLV_TBL;
3215         l_sub_head_tqlv_tbl     tqlv_tbl_type := G_EMPTY_TQLV_TBL;
3216         l_sub_head2_tqlv_tbl    tqlv_tbl_type := G_EMPTY_TQLV_TBL;
3217 
3218         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3219         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3220         l_header_status         VARCHAR2(1);
3221         l_operand               VARCHAR2(30);
3222         l_operand_total         NUMBER;
3223         l_operand_value         NUMBER;
3224         l_header_value          NUMBER;
3225         l_asset_cnt             NUMBER;
3226         l_chr_id                NUMBER;
3227         l_invalid_operand       EXCEPTION;
3228         l_tbl_ind               NUMBER;
3229         l_rule_chr_id           NUMBER;
3230 
3231      --Bug # 3061765 MDOKAL - New declarations
3232     l_head_rgd_code     VARCHAR2(50);
3233     l_rulv_rec          rulv_rec_type;
3234 
3235     --Bug #3921591: pagarg +++ Rollover +++++++ Start ++++++++++
3236     -- To find out whether given asset is associated to given fee line ot not.
3237     CURSOR l_asset_partof_fee_csr(cp_chr_id IN NUMBER,
3238                                   cp_asset_id IN NUMBER,
3239                                   cp_fee_type IN VARCHAR2)
3240     IS
3241     SELECT '1'
3242     FROM okc_k_lines_b cle,
3243          okc_line_styles_b lse,
3244          okc_k_items cim,
3245          okc_k_lines_v clep,
3246          okc_line_styles_b lsep,
3247          OKL_K_LINES kle
3248     WHERE cle.lse_id = lse.id
3249       AND lse.lty_code = 'LINK_FEE_ASSET'
3250       AND cim.cle_id = cle.id
3251       AND cle.cle_id = clep.id
3252       AND clep.lse_id = lsep.id
3253       AND lsep.lty_code = 'FEE'
3254       AND clep.id = kle.id
3255       AND clep.chr_id = cp_chr_id
3256       AND cim.object1_id1 = cp_asset_id
3257       AND kle.fee_type = cp_fee_type;
3258 
3259     l_partof varchar2(1);
3260 
3261     -- Constants storing different fee type codes that are used to map
3262     -- operand to fee types
3263     l_fee_type                 VARCHAR2(50);
3264     l_amafee          CONSTANT VARCHAR2(30)   := 'ABSORBED';
3265     l_amefee          CONSTANT VARCHAR2(30)   := 'EXPENSE';
3266     l_amffee          CONSTANT VARCHAR2(30)   := 'FINANCED';
3267     l_amgfee          CONSTANT VARCHAR2(30)   := 'GENERAL';
3268     l_amifee          CONSTANT VARCHAR2(30)   := 'INCOME';
3269     l_ammfee          CONSTANT VARCHAR2(30)   := 'MISCELLANEOUS';
3270     l_ampfee          CONSTANT VARCHAR2(30)   := 'PASSTHROUGH';
3271     l_amsfee          CONSTANT VARCHAR2(30)   := 'SECDEPOSIT';
3272     l_amrfee          CONSTANT VARCHAR2(30)   := 'ROLLOVER';
3273     --Bug #3921591: pagarg +++ Rollover +++++++ End ++++++++++
3274 
3275     --Bug# 3925492: pagarg +++ Estd. Prop Tax ++++
3276     eptx_rulv_rec       rulv_rec_type;
3277     --Bug 4102565: pagarg
3278     l_min_value         NUMBER;
3279     l_max_value         NUMBER;
3280   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'process_operand';
3281     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
3282     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
3283     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
3284     --added by akrangan for bug 7043654 begin
3285     l_qlt_indx          NUMBER;
3286     --added by akrangan for bug 7043654 end
3287 
3288 BEGIN
3289    IF (is_debug_procedure_on) THEN
3290        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
3291    END IF;
3292         l_chr_id        := p_qtev_rec.khr_id;
3293         l_rule_chr_id   := okl_am_util_pvt.get_rule_chr_id (p_qtev_rec);
3294 
3295         -- ***********************************
3296         -- Validate operand against quote type
3297         -- ***********************************
3298 
3299         IF p_check_qlt_yn THEN
3300 
3301             validate_qlt_conditions (
3302                 p_qtev_rec      => p_qtev_rec,
3303                 p_qlt_code      => p_operand,
3304                 x_return_status => l_return_status);
3305 IF (is_debug_statement_on) THEN
3306        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3307               'After validate_qlt_conditions call Value of l_return_status'|| l_return_status);
3308 END IF;
3309             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3310                 RAISE l_invalid_operand;
3311             END IF;
3312 
3313         END IF;
3314 
3315         -- Bug # 3061765 MDOKAL  **************** Start *******************
3316 
3317     -- As there is no dedicated rule group for manual quotes, variable l_head_rgd_code
3318     -- is used to store the relevant rule group that exists for auto quotes.
3319     IF p_head_rgd_code = 'MANUAL' AND nvl(p_qtev_rec.early_termination_yn, 'N') = 'N' THEN
3320         l_head_rgd_code  := 'AMTFWC'; -- Rule Group for EOT
3321     ELSIF p_head_rgd_code = 'MANUAL' AND nvl(p_qtev_rec.early_termination_yn, 'N') = 'Y' THEN
3322         l_head_rgd_code  := 'AMTEWC'; -- Rule Group for Early Termination
3323     ELSE
3324         l_head_rgd_code :=  p_head_rgd_code;
3325     END IF;
3326 
3327     -- If quote is manual and the current operand is for contract fee's,
3328     -- determine if the corresponding auto quote rule have the contractual fee
3329     -- option checked or unchecked.
3330     IF p_head_rgd_code = 'MANUAL' AND p_operand = 'AMYFEE' THEN
3331         --determine the contractual fee rule value
3332         okl_am_util_pvt.get_rule_record (
3333                         p_rgd_code          => l_head_rgd_code, -- use modified rule group
3334                         p_rdf_code          => p_operand,
3335                         p_chr_id            => l_rule_chr_id,
3336                         p_cle_id            => NULL,
3337                         x_rulv_rec          => l_rulv_rec,
3338                         x_return_status => l_return_status,
3339                         p_message_yn    => FALSE);
3340 
3341            IF (is_debug_statement_on) THEN
3342                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3343                'after call to okl_am_util_pvt.get_rule_record :'||l_return_status);
3344            END IF;
3345 
3346         -- If the corresponding rule is not checked (<> 'Y') then set the global
3347         -- variable (G_PERFORM_CONT_FEE_CALC) to False which will ensure that
3348         -- processing downstream will calculate financed fee's
3349         IF l_return_status = OKL_API.G_RET_STS_SUCCESS
3350             AND l_rulv_rec.RULE_INFORMATION1 <> 'Y'
3351         THEN
3352             G_PERFORM_CONT_FEE_CALC := FALSE;
3353         END IF;
3354     END IF;
3355 
3356         -- Bug # 3061765 MDOKAL  **************** End *******************
3357 
3358         -- ***************************************
3359         -- Calculate elements split by stream type
3360         -- ***************************************
3361 
3362         IF p_operand IN ('AMYOUB', 'AMYSAM', 'AMYFEE', 'AMCTUR') THEN
3363 
3364         -- Bug # 3061765 MDOKAL
3365         -- The following condition determines if the global variable
3366         -- 'G_PERFORM_CONT_FEE_CALC' is TRUE. It will be TRUE by default
3367         -- unless the quote is manual and the current operand is AMYFEE
3368         -- (contractual fee) where the corresponding auto quote rule and rule
3369         -- group indicate that contratual fee should not be calculated.
3370         -- To verify logic used, search for G_PERFORM_CONT_FEE_CALC
3371 
3372         IF G_PERFORM_CONT_FEE_CALC <> FALSE THEN
3373 
3374             process_stream_type_operand (
3375                         p_head_rgd_code => p_head_rgd_code,
3376                         p_line_rgd_code => p_line_rgd_code,
3377                         p_operand       => p_operand,
3378                         p_qtev_rec      => p_qtev_rec,
3379                         p_cle_id        => p_cle_id,
3380                         p_asset_tbl     => p_asset_tbl,
3381                         p_formula_name  => p_formula_name,
3382                         px_tqlv_tbl     => px_tqlv_tbl,
3383                         x_operand_total => l_operand_total,
3384                         x_return_status => l_return_status);
3385 
3386            IF (is_debug_statement_on) THEN
3387                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3388                'after call to process_stream_type_operand :'||l_return_status);
3389            END IF;
3390 
3391         END IF;
3392         -- *************************
3393     -- Bug # 3061765 MDOKAL
3394         -- Processing fee lines
3395         -- *************************
3396     ELSIF p_operand LIKE 'AM%FEE' THEN
3397 
3398         --Bug #3921591: pagarg +++ Rollover +++++++ Start ++++++++++
3399         -- Store fee type using constant into l_fee_type based on p_operand value
3400         IF p_operand = 'AMAFEE' THEN
3401             l_fee_type := l_amafee;
3402         ELSIF p_operand = 'AMEFEE' THEN
3403             l_fee_type := l_amefee;
3404         ELSIF p_operand = 'AMFFEE' THEN
3405             l_fee_type := l_amffee;
3406         ELSIF p_operand = 'AMGFEE' THEN
3407             l_fee_type := l_amgfee;
3408         ELSIF p_operand = 'AMIFEE' THEN
3409             l_fee_type := l_amifee;
3410         ELSIF p_operand = 'AMMFEE' THEN
3411             l_fee_type := l_ammfee;
3412         ELSIF p_operand = 'AMPFEE' THEN
3413             l_fee_type := l_ampfee;
3414         ELSIF p_operand = 'AMSFEE' THEN
3415             l_fee_type := l_amsfee;
3416         ELSIF p_operand = 'AMRFEE' THEN
3417             l_fee_type := l_amrfee;
3418         END IF;
3419         --Bug #3921591: pagarg +++ Rollover +++++++ End ++++++++++
3420 
3421         -- The following condition ensures that the termination is full and
3422         -- checks that contractual fee lines have not already been appended
3423         -- Auto quotes and Manual quotes have separate globals and conditions to
3424         -- check due the fact the auto quotes are supported by specific rules groups
3425         -- whereas with manual quotes the corresponding auto quote rule group
3426         -- has to be applied.
3427         IF nvl(p_qtev_rec.partial_yn, 'N') = 'N'
3428             AND (p_head_rgd_code <> 'MANUAL' AND G_CONT_FEE_CALC_DONE = FALSE)
3429             OR (p_head_rgd_code = 'MANUAL' AND G_PERFORM_CONT_FEE_CALC = FALSE)
3430         THEN
3431             --sechawla 30-apr-09 7575939 : begin
3432             IF ((G_FIN_FEE_CALC_DONE <> TRUE) OR
3433 	                   (G_ABS_FEE_CALC_DONE <> TRUE) OR
3434 	                    (G_EXP_FEE_CALC_DONE <> TRUE) OR
3435 	                    (G_GEN_FEE_CALC_DONE <> TRUE) OR
3436 	                     (G_IN_FEE_CALC_DONE <> TRUE) OR
3437 	                     (G_MISC_FEE_CALC_DONE <> TRUE) OR
3438 	                     (G_PASS_FEE_CALC_DONE <> TRUE) OR
3439                    (G_ROLL_FEE_CALC_DONE <> TRUE)) THEN
3440                    --sechawla 30-apr-09 7575939 : end
3441 
3442 
3443                 l_operand       := p_operand;
3444 
3445                 get_operand_value (
3446                         p_rgd_code      => l_head_rgd_code,
3447                         p_operand       => l_operand,
3448                         p_qtev_rec      => p_qtev_rec,
3449                         p_rule_cle_id   => NULL,
3450                         p_formul_cle_id => NULL,
3451                         p_head_rgd_code => p_head_rgd_code,
3452                         p_line_rgd_code => NULL,
3453                         p_asset_tbl     => G_EMPTY_ASSET_TBL,
3454                         px_sub_tqlv_tbl => l_sub_line_tqlv_tbl,
3455                         x_operand_value => l_operand_value,
3456                         x_return_status => l_return_status,
3457                         x_min_value             => l_min_value,  -- PAGARG 4102565 Added
3458                         x_max_value             => l_max_value); -- PAGARG 4102565 Added
3459 IF (is_debug_statement_on) THEN
3460        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3461               'After get_operand_value call Value of l_return_status'|| l_return_status);
3462 END IF;
3463             IF G_FORMULA_VALUE_FOUND THEN
3464               G_FORMULA_VALUE_FOUND := FALSE;  -- cklee added Bug: 6816439
3465 
3466                   append_quote_line (
3467                         p_qtev_rec      => p_qtev_rec,
3468                         p_qlt_code      => l_operand,
3469                         p_amount        => l_operand_value,
3470                         p_kle_id        => NULL,
3471                         p_formula_name  => p_formula_name,
3472                         p_success_yn    => l_return_status,
3473                         p_sub_tqlv_tbl  => l_sub_line_tqlv_tbl,
3474                         p_sty_id        => NULL,
3475                         p_defaulted_yn  => 'N',
3476                         px_tqlv_tbl     => px_tqlv_tbl,
3477                         px_tbl_total    => l_operand_total);
3478 IF (is_debug_statement_on) THEN
3479        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3480               'After append_quote_line call Value of l_return_status'|| l_return_status);
3481 END IF;
3482             END IF;
3483 
3484             --sechawla 30-apr-09 7575939 : begin
3485             IF  l_operand = 'AMAFEE' THEN
3486 	                G_ABS_FEE_CALC_DONE := TRUE;
3487 	            ELSIF l_operand = 'AMEFEE' THEN
3488 	                G_EXP_FEE_CALC_DONE := TRUE;
3489 	            ELSIF l_operand = 'AMFFEE' THEN
3490 	                G_FIN_FEE_CALC_DONE := TRUE;
3491 	            ELSIF l_operand = 'AMGFEE' THEN
3492 	                G_GEN_FEE_CALC_DONE := TRUE;
3493 	            ELSIF l_operand = 'AMIFEE' THEN
3494 	                G_IN_FEE_CALC_DONE := TRUE;
3495 	            ELSIF l_operand = 'AMMFEE' THEN
3496 	                G_MISC_FEE_CALC_DONE := TRUE;
3497 	            ELSIF l_operand = 'AMPFEE' THEN
3498 	                G_PASS_FEE_CALC_DONE := TRUE;
3499 	            ELSIF l_operand = 'AMRFEE' THEN
3500 	                G_ROLL_FEE_CALC_DONE := TRUE;
3501             END IF;
3502           END IF;  --sechawla 30-apr-09 7575939 : end
3503 
3504         --Bug #3921591: pagarg +++ Rollover +++++++ Start ++++++++++
3505         -- If quote is a partial termination quote then get the fee operand value
3506         -- based on the fee asset level streams.
3507         ELSIF p_asset_tbl.COUNT > 0
3508         THEN
3509            l_asset_cnt := p_asset_tbl.FIRST;
3510            LOOP
3511               -- Check whether given asset is associated to fee or not. If yes then
3512               -- pass asset id also to get_operand_value
3513               OPEN l_asset_partof_fee_csr (p_qtev_rec.khr_id,
3514                                                p_asset_tbl(l_asset_cnt).p_asset_id,
3515                                                l_fee_type);
3516               FETCH l_asset_partof_fee_csr INTO l_partof;
3517                  IF l_asset_partof_fee_csr%FOUND
3518                  THEN
3519                     get_operand_value (
3520                          p_rgd_code      => l_head_rgd_code,
3521                          p_operand       => p_operand,
3522                          p_qtev_rec      => p_qtev_rec,
3523                          p_rule_cle_id   => null,
3524                          p_formul_cle_id => p_asset_tbl(l_asset_cnt).p_asset_id,
3525                          p_head_rgd_code => p_head_rgd_code,
3526                          p_line_rgd_code => p_line_rgd_code,
3527                          p_asset_tbl     => G_EMPTY_ASSET_TBL,
3528                          px_sub_tqlv_tbl => l_sub_line_tqlv_tbl,
3529                          x_operand_value => l_operand_value,
3530                          x_return_status => l_return_status,
3531                          x_min_value     => l_min_value,  -- PAGARG 4102565 Added
3532                          x_max_value     => l_max_value); -- PAGARG 4102565 Added
3533 IF (is_debug_statement_on) THEN
3534        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3535               'After get_operand_value call 2 Value of l_return_status'|| l_return_status);
3536 END IF;
3537                     IF l_return_status = OKL_API.G_RET_STS_SUCCESS
3538                     THEN
3539                        append_quote_line (
3540                               p_qtev_rec     => p_qtev_rec,
3541                               p_qlt_code     => p_operand,
3542                               p_amount       => l_operand_value,
3543                               p_kle_id       => p_asset_tbl(l_asset_cnt).p_asset_id,
3544                               p_asset_qty    => p_asset_tbl(l_asset_cnt).p_asset_qty,
3545                               p_quote_qty    => p_asset_tbl(l_asset_cnt).p_quote_qty,
3546                               p_formula_name => p_formula_name,
3547                               p_success_yn   => l_return_status,
3548                               p_sub_tqlv_tbl => l_sub_line_tqlv_tbl,
3549                               p_sty_id       => NULL,
3550                               p_defaulted_yn => 'N',
3551                               px_tqlv_tbl    => px_tqlv_tbl,
3552                               px_tbl_total   => l_operand_total);
3553 IF (is_debug_statement_on) THEN
3554        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3555               'After append_quote_line call 2 Value of l_return_status'|| l_return_status);
3556 END IF;
3557                     END IF;
3558                  END IF;
3559               CLOSE l_asset_partof_fee_csr;
3560                   -- Clear variable for the next loop cycle
3561                   l_sub_line_tqlv_tbl := G_EMPTY_TQLV_TBL;
3562            EXIT WHEN (l_asset_cnt = p_asset_tbl.LAST);
3563               l_asset_cnt := p_asset_tbl.NEXT(l_asset_cnt);
3564            END LOOP;
3565         --Bug #3921591: pagarg +++ Rollover +++++++ End ++++++++++
3566         END IF;
3567 
3568     --Bug# 3925492: pagarg +++ Estd. Prop Tax +++++++ Start ++++++++++
3569         -- *************************
3570         -- Processing Estimated Property Tax Operand
3571         -- *************************
3572     ELSIF p_operand = 'AMPRTX' THEN
3573        l_rule_chr_id := okl_am_util_pvt.get_rule_chr_id (p_qtev_rec);
3574 
3575        IF p_asset_tbl.COUNT > 0
3576        THEN
3577           l_asset_cnt := p_asset_tbl.FIRST;
3578           LOOP
3579              okl_am_util_pvt.get_rule_record (
3580                 p_rgd_code      => p_head_rgd_code,
3581                 p_rdf_code      => p_operand,
3582                 p_chr_id        => l_rule_chr_id,
3583                 p_cle_id        => NULL,
3584                 x_rulv_rec      => l_rulv_rec,
3585                 x_return_status => l_return_status,
3586                 p_message_yn    => FALSE);
3587 
3588              --Check for rule_information4 to be LINE_CLCULATION or PRORATE
3589              IF l_return_status = OKL_API.G_RET_STS_SUCCESS
3590              AND l_rulv_rec.RULE_INFORMATION4 IN ('LINE_CALCULATION', 'PRORATE')
3591              THEN
3592                 --Obtain the line level rule information for applicability of Property Tax and Bill Tax
3593                 okl_am_util_pvt.get_rule_record(
3594                        p_rgd_code      => 'LAASTX',
3595                        p_rdf_code      => 'LAPRTX',
3596                        p_chr_id        => l_rule_chr_id,
3597                        p_cle_id        => p_asset_tbl(l_asset_cnt).p_asset_id,
3598                        x_rulv_rec      => eptx_rulv_rec,
3599                        x_return_status => l_return_status,
3600                        p_message_yn    => FALSE);
3601 
3602                 IF l_return_status = OKL_API.G_RET_STS_SUCCESS
3603                 AND eptx_rulv_rec.RULE_INFORMATION1 = 'Y' -- Property Tax Applicable
3604                 THEN
3605                    -- Obtain the operand value
3606 
3607                    -- ********************************************************
3608                    -- Evalute rule record: not_applicable, constant or formula
3609                    -- The field INFO1 indicated if the rule is either
3610                    -- not applicable (evaluated to null), equals to a
3611                    -- constant value, or equals to a value of a formula.
3612                    -- The field INFO2 allows to specify the value of a
3613                    -- the constant. The field INFO3 allows to specify a
3614                    -- formula to use for calculations.
3615                    -- ********************************************************
3616                    get_rule_value (
3617                          p_calc_option   => l_rulv_rec.RULE_INFORMATION1,
3618                          p_fixed_value   => l_rulv_rec.RULE_INFORMATION2,
3619                          p_formula_name  => l_rulv_rec.RULE_INFORMATION3,
3620                          p_rgd_code      => p_head_rgd_code,
3621                          p_operand       => p_operand,
3622                          p_qtev_rec      => p_qtev_rec,
3623                          p_cle_id        => p_asset_tbl(l_asset_cnt).p_asset_id,
3624                          p_sub_check_yn  => TRUE,
3625                          p_head_rgd_code => p_head_rgd_code,
3626                          p_line_rgd_code => p_line_rgd_code,
3627                          p_asset_tbl     => G_EMPTY_ASSET_TBL,
3628                          px_sub_tqlv_tbl => l_sub_line_tqlv_tbl,
3629                          x_rule_value    => l_operand_value,
3630                          x_return_status => l_return_status);
3631 IF (is_debug_statement_on) THEN
3632        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3633               'After get_rule_value call 3 Value of l_return_status'|| l_return_status);
3634 END IF;
3635                    IF l_return_status = OKL_API.G_RET_STS_SUCCESS
3636                    THEN
3637                       append_quote_line (
3638                             p_qtev_rec          => p_qtev_rec,
3639                             p_qlt_code          => p_operand,
3640                             p_amount            => l_operand_value,
3641                             p_kle_id            => p_asset_tbl(l_asset_cnt).p_asset_id,
3642                             p_asset_qty         => p_asset_tbl(l_asset_cnt).p_asset_qty,
3643                             p_quote_qty         => p_asset_tbl(l_asset_cnt).p_quote_qty,
3644                             p_formula_name      => p_formula_name,
3645                             p_success_yn        => l_return_status,
3646                             p_sub_tqlv_tbl      => l_sub_line_tqlv_tbl,
3647                             p_sty_id            => NULL,
3648                             p_defaulted_yn      => 'N',
3649                             px_tqlv_tbl         => px_tqlv_tbl,
3650                             px_tbl_total        => l_operand_total,
3651                             p_rule_information4 => l_rulv_rec.rule_information4);
3652 IF (is_debug_statement_on) THEN
3653        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3654               'After append_quote_line call 3 Value of l_return_status'|| l_return_status);
3655 END IF;
3656                    END IF;
3657                 END IF;
3658              END IF;
3659              -- Clear variable for the next loop cycle
3660                  l_sub_line_tqlv_tbl := G_EMPTY_TQLV_TBL;
3661            EXIT WHEN (l_asset_cnt = p_asset_tbl.LAST);
3662               l_asset_cnt := p_asset_tbl.NEXT(l_asset_cnt);
3663            END LOOP;
3664         END IF;
3665     --Bug# 3925492: pagarg +++ Estd. Prop Tax +++++++ End ++++++++++
3666 
3667         -- *************************
3668         -- Processing a single asset
3669         -- *************************
3670 
3671         ELSIF p_cle_id IS NOT NULL THEN
3672 
3673                 l_operand       := p_operand;
3674 
3675                 get_operand_value (
3676                         p_rgd_code      => p_line_rgd_code,
3677                         p_operand       => l_operand,
3678                         p_qtev_rec      => p_qtev_rec,
3679                         p_rule_cle_id   => p_cle_id,
3680                         p_formul_cle_id => p_cle_id,
3681                         p_head_rgd_code => p_head_rgd_code,
3682                         p_line_rgd_code => p_line_rgd_code,
3683                         p_asset_tbl     => G_EMPTY_ASSET_TBL,
3684                         px_sub_tqlv_tbl => l_sub_line_tqlv_tbl,
3685                         x_operand_value => l_operand_value,
3686                         x_return_status => l_return_status,
3687                         x_min_value             => l_min_value,  -- PAGARG 4102565 Added
3688                         x_max_value             => l_max_value); -- PAGARG 4102565 Added
3689 IF (is_debug_statement_on) THEN
3690        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3691               'After get_operand_value call 4 Value of l_return_status'|| l_return_status);
3692 END IF;
3693                 IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3694 
3695                     get_non_rule_operand_value (
3696                         p_chr_id        => l_chr_id,
3697                         p_cle_id        => p_cle_id,
3698                         px_operand      => l_operand,
3699                         x_operand_value => l_operand_value,
3700                         x_return_status => l_return_status);
3701 IF (is_debug_statement_on) THEN
3702        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3703               'After get_non_rule_operand_value call 4 Value of l_return_status'|| l_return_status);
3704 END IF;
3705                 END IF;
3706 
3707                 append_quote_line (
3708                         p_qtev_rec      => p_qtev_rec,
3709                         p_qlt_code      => l_operand,
3710                         p_amount        => l_operand_value,
3711                         p_kle_id        => p_cle_id,
3712                         p_formula_name  => p_formula_name,
3713                         p_success_yn    => l_return_status,
3714                         p_sub_tqlv_tbl  => l_sub_line_tqlv_tbl,
3715                         p_sty_id        => NULL,
3716                         p_defaulted_yn  => 'N',
3717                         px_tqlv_tbl     => px_tqlv_tbl,
3718                         px_tbl_total    => l_operand_total);
3719 IF (is_debug_statement_on) THEN
3720        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3721               'After append_quote_line call 5 Value of l_return_status'|| l_return_status);
3722 END IF;
3723 
3724         -- ********************************************************************
3725         -- Processing array of assets
3726         -- The following sequence is used to determine value of every operand:
3727         -- 1. For every asset passed, try to resolve operand-rule combo in the
3728         --    line rule group for the selected quote type. Unless specified
3729         --    otherwise, Contract Line IDs (kle_id) of Financial Asset Lines
3730         --    are used in calls to the Formula Engine.
3731         -- 2. For all lines which are not resolved in step 1, try to resolve
3732         --    operand-rule combo in the contract rule group for the selected
3733         --    quote type. If an operand is found in both rule groups, the line
3734         --    group take precedence. If an operand-rule combo is only found in
3735         --    the contract rule group, check Prorate Option to make a decision:
3736         --     - If some lines were resolved in step 1 and contract rule is
3737         --       not found, generate warning message and save all unresolved
3738         --       lines with zero amount.
3739         --     - If Prorate Option = Line Calculation then calculate operand
3740         --       on line level which means it is used as a default for all
3741         --       lines where operand-rule combo is not specified.
3742         --       There is no proration for line-level operands.
3743         --     - If Prorate Option = Prorate then calculate operand
3744         --       on contract level and then prorate it.
3745         --     - If Prorate Option = No Prorate then calculate operand on
3746         --       contract level and do not prorate it. If an operand-rule
3747         --       combo is found for any line is step 1, generate warning
3748         --       message and save all unresolved lines with zero amount.
3749         -- 3. If an operand is not resolved in step 1 for all lines and in
3750         --    step 2 for a contract, the API performs the following steps
3751         --    in the exact order:
3752         --     - to treat it as an executable operand
3753         --     - to treat it as a fixed number
3754         --     - to save it with zero amount and a warning message
3755         -- ********************************************************************
3756 
3757         ELSIF p_asset_tbl.COUNT > 0 THEN
3758 
3759             -- ***************************
3760             -- First find line-level rules
3761             -- ***************************
3762 
3763             l_asset_cnt := p_asset_tbl.FIRST;
3764 
3765             LOOP
3766 
3767                 get_operand_value (
3768                         p_rgd_code      => p_line_rgd_code,
3769                         p_operand       => p_operand,
3770                         p_qtev_rec      => p_qtev_rec,
3771     -- SECHAWLA - Bug 2680542 : Changed reference  p_asset_tbl(l_asset_cnt) to  p_asset_tbl(l_asset_cnt).p_asset_id
3772                         p_rule_cle_id   => p_asset_tbl(l_asset_cnt).p_asset_id,
3773                         p_formul_cle_id => p_asset_tbl(l_asset_cnt).p_asset_id,
3774                         p_head_rgd_code => p_head_rgd_code,
3775                         p_line_rgd_code => p_line_rgd_code,
3776                         p_asset_tbl     => G_EMPTY_ASSET_TBL,
3777                         px_sub_tqlv_tbl => l_sub_line_tqlv_tbl,
3778                         x_operand_value => l_operand_value,
3779                         x_return_status => l_return_status,
3780                         x_min_value             => l_min_value,  -- PAGARG 4102565 Added
3781                         x_max_value             => l_max_value); -- PAGARG 4102565 Added
3782 IF (is_debug_statement_on) THEN
3783        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3784               'After get_operand_value call 6 Value of l_return_status'|| l_return_status);
3785 END IF;
3786                 IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3787 -- SECHAWLA - Bug 2680542 : Changed reference l_reject_asset_tbl (l_asset_cnt) to l_reject_asset_tbl (l_asset_cnt).p_asset_id
3788 --                          Changed reference p_asset_tbl (l_asset_cnt) to p_asset_tbl (l_asset_cnt).p_asset_id
3789                     l_reject_asset_tbl (l_asset_cnt).p_asset_id :=  p_asset_tbl (l_asset_cnt).p_asset_id;
3790       --SECHAWLA 20-FEB-03 Bug # 2757368 : added code to populate asset qty and quote qty in l_reject_asset_tbl
3791              l_reject_asset_tbl (l_asset_cnt).p_asset_qty :=  p_asset_tbl (l_asset_cnt).p_asset_qty;
3792              l_reject_asset_tbl (l_asset_cnt).p_quote_qty :=  p_asset_tbl (l_asset_cnt).p_quote_qty;
3793 
3794 
3795                 ELSE
3796 
3797                     append_quote_line (
3798                         p_qtev_rec            => p_qtev_rec,
3799                         p_qlt_code            => p_operand,
3800                         p_amount              => l_operand_value,
3801    --SECHAWLA - Bug 2680542 : Changed reference p_asset_tbl (l_asset_cnt) to p_asset_tbl (l_asset_cnt).p_asset_id
3802                         p_kle_id              => p_asset_tbl(l_asset_cnt).p_asset_id,
3803             p_formula_name        => p_formula_name,
3804                         p_success_yn      => l_return_status,
3805                         p_sub_tqlv_tbl    => l_sub_line_tqlv_tbl,
3806                         p_sty_id              => NULL,
3807                         p_defaulted_yn    => 'N',
3808                         px_tqlv_tbl       => px_tqlv_tbl,
3809                         px_tbl_total      => l_operand_total);
3810 IF (is_debug_statement_on) THEN
3811        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3812               'After append_quote_line call 6 Value of l_return_status'|| l_return_status);
3813 END IF;
3814                 END IF;
3815 
3816                 -- Clear variable for the next loop cycle
3817                 l_sub_line_tqlv_tbl     := G_EMPTY_TQLV_TBL;
3818 
3819                 EXIT WHEN (l_asset_cnt = p_asset_tbl.LAST);
3820                 l_asset_cnt := p_asset_tbl.NEXT(l_asset_cnt);
3821 
3822             END LOOP;
3823 
3824             -- ***************************************************
3825             -- If any line-level operands failed, try header level
3826             -- ***************************************************
3827 
3828             IF l_reject_asset_tbl.COUNT > 0 THEN
3829 
3830                 l_asset_cnt := l_reject_asset_tbl.FIRST;
3831 
3832                 okl_am_util_pvt.get_rule_record (
3833                         p_rgd_code      => p_head_rgd_code,
3834                         p_rdf_code      => p_operand,
3835                         p_chr_id        => l_rule_chr_id,
3836                         p_cle_id        => NULL,
3837                         x_rulv_rec      => l_head_rulv_rec,
3838                         x_return_status => l_return_status,
3839                         p_message_yn    => FALSE);
3840 
3841                 IF  l_return_status = OKL_API.G_RET_STS_SUCCESS
3842                 AND l_head_rulv_rec.RULE_INFORMATION4 IN
3843                         ('LINE_CALCULATION','PRORATE','NO_PRORATE') THEN
3844 
3845                     IF l_head_rulv_rec.RULE_INFORMATION4 <>
3846                          'LINE_CALCULATION' THEN
3847 
3848                         get_operand_value (
3849                                 p_rgd_code      => p_head_rgd_code,
3850                                 p_operand       => p_operand,
3851                                 p_qtev_rec      => p_qtev_rec,
3852                                 p_rule_cle_id   => NULL,
3853                                 p_formul_cle_id => NULL,
3854                                 p_head_rgd_code => p_head_rgd_code,
3855                                 p_line_rgd_code => p_line_rgd_code,
3856                                 p_asset_tbl     => p_asset_tbl,
3857                                 px_sub_tqlv_tbl => l_sub_head_tqlv_tbl,
3858                                 x_operand_value => l_header_value,
3859                                 x_return_status => l_header_status,
3860                         x_min_value             => l_min_value,  -- PAGARG 4102565 Added
3861                         x_max_value             => l_max_value); -- PAGARG 4102565 Added
3862 IF (is_debug_statement_on) THEN
3863        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3864               'After get_operand_value call 7 Value of l_return_status'|| l_return_status);
3865 END IF;
3866                     END IF;
3867 
3868                 END IF;
3869 
3870                 -- **********************************
3871                 -- Contract-level rule does not exist
3872                 -- **********************************
3873 
3874                 IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3875 
3876                     -- *********************************************
3877                     -- No line-level or header-level rules are found
3878                     -- Try to find executable operand or constant
3879                     -- *********************************************
3880 
3881                     IF l_reject_asset_tbl.COUNT = p_asset_tbl.COUNT THEN
3882 
3883                         l_operand       := p_operand;
3884 
3885                         get_non_rule_operand_value (
3886                                 p_chr_id        => l_chr_id,
3887                                 p_cle_id        => NULL,
3888                                 px_operand      => l_operand,
3889                                 x_operand_value => l_operand_value,
3890                                 x_return_status => l_return_status);
3891 IF (is_debug_statement_on) THEN
3892        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3893               'After get_non_rule_operand_value call 8 Value of l_return_status'|| l_return_status);
3894 END IF;
3895                         append_quote_line (
3896                                 p_qtev_rec      => p_qtev_rec,
3897                                 p_qlt_code      => l_operand,
3898                                 p_amount        => l_operand_value,
3899                                 p_kle_id        => NULL,
3900                                 p_formula_name  => p_formula_name,
3901                                 p_success_yn    => l_return_status,
3902                                 p_sty_id        => NULL,
3903                                 p_sub_tqlv_tbl  => G_EMPTY_TQLV_TBL,
3904                                 p_defaulted_yn  => 'N',
3905                                 px_tqlv_tbl     => px_tqlv_tbl,
3906                                 px_tbl_total    => l_operand_total);
3907 IF (is_debug_statement_on) THEN
3908        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3909               'After append_quote_line call 8 Value of l_return_status'|| l_return_status);
3910 END IF;
3911                     -- ************************************************
3912                     -- Operand-rule exist for some lines but not others
3913                     -- ************************************************
3914 
3915                     ELSE
3916 
3917                         LOOP
3918 
3919                             append_quote_line (
3920                                 p_qtev_rec               => p_qtev_rec,
3921                                 p_qlt_code               => p_operand,
3922                                 p_amount                 => G_MISS_NUM,
3923     --SECHAWLA - Bug 2680542 : Changed reference  l_reject_asset_tbl(l_asset_cnt) to  l_reject_asset_tbl(l_asset_cnt).p_asset_id
3924                                 p_kle_id                 => l_reject_asset_tbl(l_asset_cnt).p_asset_id,
3925     --SECHAWLA 20-FEB-03 Bug # 2757368 : pass 3 extra parameters - asset qty, quote qty and rule_information 4 to append_quote_lines
3926                 p_asset_qty          => l_reject_asset_tbl(l_asset_cnt).p_asset_qty,
3927                 p_quote_qty          => l_reject_asset_tbl(l_asset_cnt).p_quote_qty,
3928                 p_rule_information4  => l_head_rulv_rec.RULE_INFORMATION4,
3929                 p_formula_name       => p_formula_name,
3930                                 p_success_yn         => OKL_API.G_RET_STS_ERROR,
3931                                 px_tqlv_tbl          => px_tqlv_tbl,
3932                                 p_sty_id                 => NULL,
3933                                 p_sub_tqlv_tbl       => G_EMPTY_TQLV_TBL,
3934                                 p_defaulted_yn       => 'N',
3935                                 px_tbl_total         => l_operand_total);
3936 IF (is_debug_statement_on) THEN
3937        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3938               'After append_quote_line call 9 Value of l_return_status'|| l_return_status);
3939 END IF;
3940                             EXIT WHEN (l_asset_cnt = l_reject_asset_tbl.LAST);
3941                             l_asset_cnt :=l_reject_asset_tbl.NEXT(l_asset_cnt);
3942 
3943                         END LOOP;
3944 
3945                     END IF;
3946 
3947                 -- ***********************************************************
3948                 -- Contract-level rule is used as default for line calculation
3949                 -- ***********************************************************
3950 
3951                 ELSIF l_return_status = OKL_API.G_RET_STS_SUCCESS
3952                 AND   l_head_rulv_rec.RULE_INFORMATION4 =
3953                          'LINE_CALCULATION' THEN
3954 
3955                     LOOP
3956 
3957                         -- look for header-level rule but use cle_id in formula
3958                         get_operand_value (
3959                             p_rgd_code          => p_head_rgd_code,
3960                             p_operand           => p_operand,
3961                             p_qtev_rec          => p_qtev_rec,
3962                             p_rule_cle_id       => NULL,
3963        -- SECHAWLA - Bug 2680542 : Changed reference  l_reject_asset_tbl(l_asset_cnt) to  l_reject_asset_tbl(l_asset_cnt).p_asset_id
3964                             p_formul_cle_id => l_reject_asset_tbl(l_asset_cnt).p_asset_id,
3965                             p_head_rgd_code     => p_head_rgd_code,
3966                             p_line_rgd_code => p_line_rgd_code,
3967                             p_asset_tbl         => G_EMPTY_ASSET_TBL,
3968                             px_sub_tqlv_tbl     => l_sub_line_tqlv_tbl,
3969                             x_operand_value     => l_operand_value,
3970                             x_return_status     => l_return_status,
3971                         x_min_value             => l_min_value,  -- PAGARG 4102565 Added
3972                         x_max_value             => l_max_value); -- PAGARG 4102565 Added
3973 IF (is_debug_statement_on) THEN
3974        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3975               'After get_operand_value call 10 Value of l_return_status'|| l_return_status);
3976 END IF;
3977                         append_quote_line (
3978                             p_qtev_rec          => p_qtev_rec,
3979                             p_qlt_code          => p_operand,
3980                             p_amount            => l_operand_value,
3981            --SECHAWLA - Bug 2680542 : Changed reference  l_reject_asset_tbl(l_asset_cnt) to  l_reject_asset_tbl(l_asset_cnt).p_asset_id
3982                             p_kle_id            => l_reject_asset_tbl(l_asset_cnt).p_asset_id,
3983         --SECHAWLA 20-FEB-03 Bug # 2757368 : pass 3 extra parameters - asset qty, quote qty and rule_information 4 to append_quote_lines
3984                 p_asset_qty          => l_reject_asset_tbl(l_asset_cnt).p_asset_qty,
3985                 p_quote_qty          => l_reject_asset_tbl(l_asset_cnt).p_quote_qty,
3986                 p_rule_information4  => l_head_rulv_rec.RULE_INFORMATION4,
3987                 p_formula_name  => p_formula_name,
3988                             p_success_yn        => l_return_status,
3989                             p_sub_tqlv_tbl      => l_sub_line_tqlv_tbl,
3990                             p_sty_id            => NULL,
3991                             p_defaulted_yn      => 'N',
3992                             px_tqlv_tbl         => px_tqlv_tbl,
3993                             px_tbl_total        => l_operand_total);
3994 IF (is_debug_statement_on) THEN
3995        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
3996               'After append_quote_line call 10 Value of l_return_status'|| l_return_status);
3997 END IF;
3998                         -- Clear variable for the next loop cycle
3999                         l_sub_line_tqlv_tbl     := G_EMPTY_TQLV_TBL;
4000 
4001                         EXIT WHEN (l_asset_cnt = l_reject_asset_tbl.LAST);
4002                         l_asset_cnt := l_reject_asset_tbl.NEXT(l_asset_cnt);
4003 
4004                     END LOOP;
4005 
4006                 -- *****************************************
4007                 -- Contract-level rule is used for proration
4008                 -- *****************************************
4009 
4010                 ELSIF l_return_status = OKL_API.G_RET_STS_SUCCESS
4011                 AND   l_head_rulv_rec.RULE_INFORMATION4 = 'PRORATE' THEN
4012 
4013                     LOOP
4014 
4015               IF  l_header_status = OKL_API.G_RET_STS_SUCCESS THEN
4016                 -- SECHAWLA 24-FEB-03 - Bug 2817025 : Do not prorate the amount in case of Repurchase quote
4017                 IF p_qtev_rec.qtp_code <> 'REP_STANDARD' THEN
4018                                 -- Use prorated header value
4019                                 prorate_operand (
4020                                     p_operand           => p_operand,
4021                                     p_chr_id            => l_chr_id,
4022                     --SECHAWLA - Bug 2680542 : Changed reference  l_reject_asset_tbl(l_asset_cnt) to  l_reject_asset_tbl(l_asset_cnt).p_asset_id
4023                                     p_cle_id    => l_reject_asset_tbl(l_asset_cnt).p_asset_id,
4024                                     p_chr_amt           => l_header_value,
4025                                     p_formula_name              => p_formula_name,
4026                                     p_head_sub_tqlv_tbl => l_sub_head_tqlv_tbl,
4027                                     px_line_sub_tqlv_tbl        => l_sub_line_tqlv_tbl,
4028                                     x_cle_amt           => l_operand_value,
4029                                     x_return_status     => l_return_status);
4030                          IF (is_debug_statement_on) THEN
4031                                     OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4032                                  'After prorate_operand call 10 Value of l_return_status'|| l_return_status);
4033                          END IF;
4034                 ELSE
4035                     l_operand_value := l_header_value;
4036                 END IF;
4037              ELSE
4038                             l_return_status     := l_header_status;
4039              END IF;
4040 	    IF (p_operand = 'AMBCOC') THEN
4041 	        G_AMBCOC_OPTION := 'PRORATE';
4042 	    END IF;
4043             IF (p_operand = 'AMCQFE') then
4044 	            G_AMCQFE_OPTION := 'PRORATE';
4045             END IF;
4046             IF (p_operand = 'AMCRFE') then
4047 	           G_AMCRFE_OPTION := 'PRORATE';
4048             END IF;
4049             IF (p_operand = 'AMCRIN') then
4050 	            G_AMCRIN_OPTION := 'PRORATE';
4051             END IF;
4052             IF (p_operand = 'AMCSDD')  then
4053 	            G_AMCSDD_OPTION := 'PRORATE';
4054             END IF;
4055             IF (p_operand = 'AMCTPE') then
4056 	           G_AMCTPE_OPTION := 'PRORATE';
4057             END IF;
4058             IF (p_operand = 'AMPRTX') then
4059 	           G_AMPRTX_OPTION := 'PRORATE';
4060             END IF;
4061             IF (p_operand = 'AMBPOC') then
4062 	           G_AMBPOC_OPTION := 'PRORATE';
4063             END IF;
4064 
4065                         append_quote_line (
4066                                 p_qtev_rec      => p_qtev_rec,
4067                                 p_qlt_code      => p_operand,
4068                                 p_amount        => l_operand_value,
4069         --SECHAWLA - Bug 2680542 : Changed reference  l_reject_asset_tbl(l_asset_cnt) to  l_reject_asset_tbl(l_asset_cnt).p_asset_id
4070                                 p_kle_id        => l_reject_asset_tbl(l_asset_cnt).p_asset_id,
4071      --SECHAWLA 20-FEB-03 Bug # 2757368 : pass 3 extra parameters - asset qty, quote qty and rule_information 4 to append_quote_lines
4072                 p_asset_qty          => l_reject_asset_tbl(l_asset_cnt).p_asset_qty,
4073                 p_quote_qty          => l_reject_asset_tbl(l_asset_cnt).p_quote_qty,
4074                 p_rule_information4  => l_head_rulv_rec.RULE_INFORMATION4,
4075                 p_formula_name  => p_formula_name,
4076                                 p_success_yn    => l_return_status,
4077                                 p_sub_tqlv_tbl  => l_sub_line_tqlv_tbl,
4078                                 p_sty_id        => NULL,
4079                                 p_defaulted_yn  => 'N',
4080                                 px_tqlv_tbl     => px_tqlv_tbl,
4081                                 px_tbl_total    => l_operand_total);
4082 
4083                         -- Clear variable for the next loop cycle
4084                         l_sub_line_tqlv_tbl     := G_EMPTY_TQLV_TBL;
4085             IF (is_debug_statement_on) THEN
4086        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4087               'After append_quote_line call 11 Value of l_return_status'|| l_return_status);
4088 END IF;
4089                         EXIT WHEN (l_asset_cnt = l_reject_asset_tbl.LAST);
4090                         l_asset_cnt := l_reject_asset_tbl.NEXT(l_asset_cnt);
4091 
4092                     END LOOP;
4093 
4094                     -- *****************************************************
4095                     -- Save results of disected operand calculated for lines
4096                     -- *****************************************************
4097 
4098                     IF l_sub_head_tqlv_tbl.COUNT > 0 THEN
4099 
4100                         l_tbl_ind := l_sub_head_tqlv_tbl.FIRST;
4101 
4102                         LOOP
4103 
4104                             IF NVL (l_sub_head_tqlv_tbl(l_tbl_ind).kle_id,
4105                                         G_MISS_NUM) <> G_MISS_NUM THEN
4106                                 l_sub_head2_tqlv_tbl(l_tbl_ind) :=
4107                                     l_sub_head_tqlv_tbl(l_tbl_ind);
4108                             END IF;
4109 
4110                             EXIT WHEN (l_tbl_ind = l_sub_head_tqlv_tbl.LAST);
4111                             l_tbl_ind := l_sub_head_tqlv_tbl.NEXT (l_tbl_ind);
4112 
4113                         END LOOP;
4114 
4115                     END IF;
4116 
4117                     IF l_sub_head2_tqlv_tbl.COUNT > 0 THEN
4118 
4119                         append_quote_line (
4120                                 p_qtev_rec      => p_qtev_rec,
4121                                 p_qlt_code      => p_operand,
4122                                 p_amount        => NULL,
4123                                 p_kle_id        => NULL,
4124                                 p_formula_name  => p_formula_name,
4125                                 p_success_yn    => OKL_API.G_RET_STS_SUCCESS,
4126                                 p_sub_tqlv_tbl  => l_sub_head2_tqlv_tbl,
4127                                 p_sty_id        => NULL,
4128                                 p_defaulted_yn  => 'N',
4129                                 px_tqlv_tbl     => px_tqlv_tbl,
4130                                 px_tbl_total    => l_operand_total);
4131             IF (is_debug_statement_on) THEN
4132        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4133               'After append_quote_line call 12 Value of l_return_status'|| l_return_status);
4134 END IF;
4135                     END IF;
4136 
4137                 -- *********************************************
4138                 -- Contract-level rule is used without proration
4139                 -- *********************************************
4140 
4141                 ELSIF l_return_status = OKL_API.G_RET_STS_SUCCESS
4142                 AND   l_head_rulv_rec.RULE_INFORMATION4 = 'NO_PRORATE' THEN
4143 
4144 
4145 
4146                     -- ********************************************
4147                     -- Save one non-prorate header-level quote line
4148                     -- ********************************************
4149 
4150              -- bug 5380712 rbruno start
4151              -- Check if the current operand is existing in the operands
4152              -- appended to the array of quote lines
4153              -- This indicates the operand (quote line) is already processed for one asset
4154              -- (the first) for this contract
4155 
4156              --modified by akrangan for bug 7043654 begin
4157              --changed for i in loop structure to normal loop structure
4158              --to avoide plsql numeric/value error
4159 
4160                IF px_tqlv_tbl.COUNT > 0
4161                THEN
4162                   l_qlt_indx := px_tqlv_tbl.FIRST;
4163 
4164                   LOOP
4165                      IF p_operand = px_tqlv_tbl (l_qlt_indx).qlt_code
4166                      THEN
4167                         -- The current operand is already present in the table
4168                         -- set the boolean flag off
4169                         g_compute_qte_fee := FALSE;
4170                         EXIT;
4171                      ELSE
4172                         -- Set the boolean to true
4173                         -- This executes when the boolean is set to false in the processing
4174                         -- of the prior operand (quote line) in the loop
4175                         g_compute_qte_fee := TRUE;
4176                      END IF;
4177 
4178                      EXIT WHEN (l_qlt_indx = px_tqlv_tbl.LAST);
4179                      l_qlt_indx := px_tqlv_tbl.NEXT (l_qlt_indx);
4180                   END LOOP;
4181                END IF;
4182 
4183              --modified by akrangan for bug 7043654 end
4184              -- call append quote line only once for a contract and for
4185              -- a particular quote fee, with the Rule having Fee Prorate
4186              -- set to 'No Prorate' (i.e. should be computed only once
4187              -- for a contract, and for a particular fee not per asset)
4188 
4189           IF g_compute_qte_fee = TRUE THEN
4190 
4191             -- bug 5380712 rbruno end
4192 
4193                     IF l_reject_asset_tbl.COUNT = p_asset_tbl.COUNT THEN
4194 
4195                         append_quote_line (
4196                                 p_qtev_rec      => p_qtev_rec,
4197                                 p_qlt_code      => p_operand,
4198                                 p_amount        => l_header_value,
4199                                 p_kle_id        => NULL,
4200                                 p_formula_name  => p_formula_name,
4201                                 p_success_yn    => l_header_status,
4202                                 p_sub_tqlv_tbl  => l_sub_head_tqlv_tbl,
4203                                 p_sty_id        => NULL,
4204                                 p_defaulted_yn  => 'N',
4205                                 px_tqlv_tbl     => px_tqlv_tbl,
4206                                 px_tbl_total    => l_operand_total);
4207             IF (is_debug_statement_on) THEN
4208        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4209               'After append_quote_line call 13 Value of l_return_status'|| l_return_status);
4210 END IF;
4211                     -- *********************************************
4212                     -- Header rule NO_PRORATE contradicts line rules
4213                     -- *********************************************
4214 
4215                     ELSE
4216 
4217                         LOOP
4218 
4219                             append_quote_line (
4220                                 p_qtev_rec      => p_qtev_rec,
4221                                 p_qlt_code      => p_operand,
4222                                 p_amount        => G_MISS_NUM,
4223         --SECHAWLA - Bug 2680542 : Changed reference  l_reject_asset_tbl(l_asset_cnt) to  l_reject_asset_tbl(l_asset_cnt).p_asset_id
4224                                 p_kle_id    => l_reject_asset_tbl(l_asset_cnt).p_asset_id,
4225      --SECHAWLA 20-FEB-03 Bug # 2757368 : pass 3 extra parameters - asset qty, quote qty and rule_information 4 to append_quote_lines
4226                 p_asset_qty          => l_reject_asset_tbl(l_asset_cnt).p_asset_qty,
4227                 p_quote_qty          => l_reject_asset_tbl(l_asset_cnt).p_quote_qty,
4228                 p_rule_information4  => l_head_rulv_rec.RULE_INFORMATION4,
4229                 p_formula_name  => p_formula_name,
4230                                 p_success_yn    => OKL_API.G_RET_STS_ERROR,
4231                                 p_sty_id        => NULL,
4232                                 p_sub_tqlv_tbl  => G_EMPTY_TQLV_TBL,
4233                                 p_defaulted_yn  => 'N',
4234                                 px_tqlv_tbl     => px_tqlv_tbl,
4235                                 px_tbl_total    => l_operand_total);
4236 
4237             IF (is_debug_statement_on) THEN
4238        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4239               'After append_quote_line call 13 Value of l_return_status'|| l_return_status);
4240 END IF;
4241                             EXIT WHEN (l_asset_cnt = l_reject_asset_tbl.LAST);
4242                             l_asset_cnt :=l_reject_asset_tbl.NEXT(l_asset_cnt);
4243 
4244                         END LOOP;
4245 
4246                     END IF;
4247 
4248                 END IF;
4249 
4250               END IF;
4251 
4252             END IF;
4253 
4254         END IF;
4255 
4256 IF (is_debug_statement_on) THEN
4257      OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4258               'Value of l_operand_total'|| l_operand_total);
4259      OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4260               'Value of l_overall_status'|| l_overall_status);
4261 END IF;
4262         x_operand_total := l_operand_total;
4263         x_return_status := l_overall_status;
4264 
4265    IF (is_debug_procedure_on) THEN
4266        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
4267    END IF;
4268 
4269 
4270 EXCEPTION
4271 
4272         WHEN l_invalid_operand THEN
4273                 x_return_status := l_overall_status;
4274 
4275         WHEN OTHERS THEN
4276 
4277         IF (is_debug_exception_on) THEN
4278             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
4279                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
4280         END IF;
4281 
4282                 -- store SQL error message on message stack for caller
4283                 OKL_API.SET_MESSAGE (
4284                          p_app_name     => G_APP_NAME
4285                         ,p_msg_name     => G_UNEXPECTED_ERROR
4286                         ,p_token1       => G_SQLCODE_TOKEN
4287                         ,p_token1_value => sqlcode
4288                         ,p_token2       => G_SQLERRM_TOKEN
4289                         ,p_token2_value => sqlerrm);
4290 
4291                 -- notify caller of an UNEXPECTED error
4292                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
4293 
4294 END  process_operand;
4295 
4296 
4297 -- Start of comments
4298 --
4299 -- Procedure Name       : process_top_formula
4300 -- Description          :       Disect formula string, calculate each operand
4301 --                                              and their total
4302 -- Business Rules       :
4303 -- Parameters           :       rule group, formula string, quote record,
4304 --                                              contract line or table of contract lines,
4305 --                                              table of quote line records,
4306 -- HISTORY          : rmunjulu 3797384 added code to send quote_effective_from_date and quote_id
4307 --                    to formula engine
4308 -- Version              : 1.0
4309 -- End of comments
4310 
4311 PROCEDURE process_top_formula (
4312                 p_head_rgd_code IN VARCHAR2,
4313                 p_line_rgd_code IN VARCHAR2,
4314                 p_qtev_rec      IN qtev_rec_type,
4315                 p_cle_id        IN NUMBER,
4316                 p_asset_tbl     IN asset_tbl_type,
4317                 p_formula_name  IN VARCHAR2,
4318                 p_operand       IN VARCHAR2,
4319                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
4320                 x_formula_total OUT NOCOPY NUMBER,
4321                 x_return_status OUT NOCOPY VARCHAR2) IS
4322 
4323         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4324         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4325         l_operand_total         NUMBER;
4326         l_formula_total         NUMBER := 0;
4327         l_curr_char             VARCHAR2(1);
4328         l_formula_id            okl_formulae_v.id%TYPE := NULL;
4329         l_formula_string        okl_formulae_v.formula_string%TYPE := NULL;
4330         l_temp_string           okl_formulae_v.formula_string%TYPE := NULL;
4331         l_operand_name          okl_operands_v.name%TYPE;
4332         l_dummy_value           NUMBER;
4333 
4334         -- Extract evaluation string for a formula
4335         CURSOR l_formula_csr
4336                 (cp_formula_name IN okl_formulae_v.name%TYPE) IS
4337                 SELECT  f.id, f.formula_string
4338                 FROM    okl_formulae_v f
4339                 WHERE   f.name = cp_formula_name
4340                 AND     f.start_date <= SYSDATE
4341                 AND     NVL (f.end_date, sysdate) >= SYSDATE;
4342 
4343         -- Extract operand name
4344         CURSOR l_operand_csr (
4345                 cp_formula_id    IN okl_formulae_v.id%TYPE,
4346                 cp_operand_label IN okl_fmla_oprnds_v.label%TYPE) IS
4347                 SELECT  o.name
4348                 FROM    okl_formulae_v  f,
4349                         okl_fmla_oprnds_v l,
4350                         okl_operands_v  o
4351                 WHERE   f.id            = cp_formula_id
4352                 AND     l.fma_id        = f.id
4353                 AND     l.label         = cp_operand_label
4354                 AND     o.id            = l.opd_id;
4355   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'process_top_formula';
4356     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
4357     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
4358     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
4359 BEGIN
4360 
4361    IF (is_debug_procedure_on) THEN
4362        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
4363    END IF;
4364 
4365 
4366         -- *************************************************
4367         -- Validate formula and get formula string to disect
4368         -- *************************************************
4369 
4370         -- Make sure Formula Engine can validate the formula
4371         okl_am_util_pvt.get_formula_value (
4372                 p_formula_name  => p_formula_name,
4373                 p_chr_id        => p_qtev_rec.khr_id,
4374                 p_cle_id        => p_cle_id,
4375     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
4376     -- pass additional parameters quote_effective_from_date and quote_id
4377         p_additional_parameters => g_add_params,
4378     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- End ++++++++++++++++
4379                 x_formula_value => l_dummy_value,
4380                 x_return_status => l_return_status);
4381 
4382    IF (is_debug_statement_on) THEN
4383        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4384        'before call to okl_am_util_pvt.get_formula_value :'||l_return_status);
4385    END IF;
4386 
4387 
4388         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4389                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4390                         l_overall_status := l_return_status;
4391                 END IF;
4392         END IF;
4393 
4394         OPEN    l_formula_csr (p_formula_name);
4395         FETCH   l_formula_csr INTO l_formula_id, l_formula_string;
4396         CLOSE   l_formula_csr;
4397 
4398 /*    Gkadarka removed below check for bug  4333243 -- Start
4399         IF NVL (l_formula_string, G_MISS_CHAR) = G_MISS_CHAR
4400         OR (    p_operand IS NOT NULL
4401             AND l_formula_string LIKE '%' || p_operand || '%')
4402         THEN
4403                 -- First condition ensures non-empty string
4404                 -- Second condition ensures absence of recursive references
4405                 l_return_status := OKL_API.G_RET_STS_ERROR;
4406         END IF;
4407 
4408         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4409                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4410                         l_overall_status := l_return_status;
4411                 END IF;
4412         END IF;
4413 bug  4333243 -- End*/
4414         -- *******************************************************************
4415         -- The top formula consists of a number of operands separated by PLUS
4416         -- signs only. Each operand of the formula has a label which directly
4417         -- corresponds to either
4418         -- (a) a rule found in rule groups for the selected quote type
4419         --     (operand-rule combo) or
4420         -- (b) another formula in the formula engine (executable operand).
4421         -- *******************************************************************
4422 
4423         IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS THEN
4424 
4425             -- make sure last operand is processed
4426             l_formula_string := l_formula_string || '+';
4427 
4428             -- check every character
4429             FOR i IN 1 .. LENGTH (l_formula_string) LOOP
4430 
4431                 l_curr_char := SUBSTR (l_formula_string, i, 1);
4432 
4433                 IF l_curr_char IN ('(','+','-','*','/',')') THEN
4434 
4435                     IF l_curr_char <> '+' THEN
4436 
4437                         -- Only PLUS signs are allowed in the top quote
4438                         -- formula. Other signs are treated as "+"
4439                         okl_am_util_pvt.set_message (
4440                              p_app_name  => G_APP_NAME
4441                             ,p_msg_name  => 'OKL_AM_INVALID_FORMULA_SIGN'
4442                             ,p_msg_level => OKL_AM_UTIL_PVT.G_DEBUG_LEVEL);
4443 
4444                     END IF;
4445 
4446                     IF l_temp_string IS NOT NULL THEN
4447 
4448                         l_operand_name := NULL;
4449                         OPEN    l_operand_csr (l_formula_id, l_temp_string);
4450                         FETCH   l_operand_csr INTO l_operand_name;
4451                         CLOSE   l_operand_csr;
4452 
4453                         -- ************************
4454                         -- Get value for an operand
4455                         -- ************************
4456 
4457                         IF l_operand_name IS NOT NULL THEN
4458 
4459                             process_operand (
4460                                 p_head_rgd_code => p_head_rgd_code,
4461                                 p_line_rgd_code => p_line_rgd_code,
4462                                 p_operand       => l_operand_name,
4463                                 p_qtev_rec      => p_qtev_rec,
4464                                 p_cle_id        => p_cle_id,
4465                                 p_asset_tbl     => p_asset_tbl,
4466                                 p_formula_name  => p_formula_name,
4467                                 p_check_qlt_yn  => TRUE,
4468                                 px_tqlv_tbl     => px_tqlv_tbl,
4469                                 x_operand_total => l_operand_total,
4470                                 x_return_status => l_return_status);
4471 
4472                            IF (is_debug_statement_on) THEN
4473                                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4474                                'before call to oprocess_operand :'||l_return_status);
4475                            END IF;
4476 
4477                         ELSE
4478                             -- Should never happen because
4479                             -- Formula Engine validation above would fail
4480                             l_return_status := OKL_API.G_RET_STS_ERROR;
4481        -- invalid id Formula Label Id
4482                             OKC_API.SET_MESSAGE (
4483                                 p_app_name      => G_OKC_APP_NAME,
4484                                 p_msg_name      => G_INVALID_VALUE,
4485                                 p_token1        => G_COL_NAME_TOKEN,
4486                                 p_token1_value  => 'Formula Label Id');
4487                         END IF;
4488 
4489                         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4490                             IF l_overall_status <>
4491                                 OKL_API.G_RET_STS_UNEXP_ERROR THEN
4492                                     l_overall_status := l_return_status;
4493                             END IF;
4494                         END IF;
4495 
4496                         l_formula_total := l_formula_total +
4497                                            NVL (l_operand_total, 0);
4498                         l_temp_string   := NULL;
4499 
4500                     END IF;
4501 
4502                 ELSE
4503                     l_temp_string := l_temp_string || l_curr_char;
4504                 END IF;
4505 
4506             END LOOP;
4507 
4508         ELSE
4509 
4510             l_return_status := OKL_API.G_RET_STS_ERROR;
4511             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4512                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4513                         l_overall_status := l_return_status;
4514                 END IF;
4515             END IF;
4516 
4517         END IF;
4518 
4519         x_formula_total := l_formula_total;
4520         x_return_status := l_overall_status;
4521 
4522    IF (is_debug_procedure_on) THEN
4523        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
4524    END IF;
4525 
4526 
4527 EXCEPTION
4528 
4529         WHEN OTHERS THEN
4530 
4531                 IF (l_formula_csr%ISOPEN) THEN
4532                         CLOSE l_formula_csr;
4533                 END IF;
4534 
4535                 IF (l_operand_csr%ISOPEN) THEN
4536                         CLOSE l_operand_csr;
4537                 END IF;
4538 
4539         IF (is_debug_exception_on) THEN
4540             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
4541                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
4542         END IF;
4543                 -- store SQL error message on message stack for caller
4544                 OKL_API.SET_MESSAGE (
4545                          p_app_name     => G_APP_NAME
4546                         ,p_msg_name     => G_UNEXPECTED_ERROR
4547                         ,p_token1       => G_SQLCODE_TOKEN
4548                         ,p_token1_value => sqlcode
4549                         ,p_token2       => G_SQLERRM_TOKEN
4550                         ,p_token2_value => sqlerrm);
4551 
4552                 -- notify caller of an UNEXPECTED error
4553                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
4554 
4555 END process_top_formula;
4556 
4557 -- Start of comments
4558 --
4559 -- Procedure Name       : process_top_formula_new
4560 -- Description          : Disect formula string, calculate each operand
4561 --                                and their total
4562 -- Business Rules       :
4563 -- Parameters           : rule group, formula string, quote record,
4564 --                                contract line or table of contract lines,
4565 --                                table of quote line records,
4566 -- History          : rmunjulu 4300443 Created, This new procedure is more
4567 --                    performant and will be called from main procedure
4568 --                    process_top_rule. The existing procedure process_top_formula
4569 --                    will only be called from get_rule_value.
4570 --                  : rbruno 07-sep-2007 Bug 5380712. Initialized global variable g_compute_qte_fee to True
4571 -- Version                  : 1.0
4572 -- End of comments
4573 
4574 PROCEDURE process_top_formula_new (
4575                 p_head_rgd_code IN VARCHAR2,
4576                 p_line_rgd_code IN VARCHAR2,
4577                 p_qtev_rec      IN qtev_rec_type,
4578                 p_cle_id        IN NUMBER,
4579                 p_asset_tbl     IN asset_tbl_type,
4580                 p_formula_name  IN VARCHAR2,
4581                 p_operand       IN VARCHAR2,
4582                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
4583                 x_formula_total OUT NOCOPY NUMBER,
4584                 x_return_status OUT NOCOPY VARCHAR2) IS
4585 
4586         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4587         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4588         l_operand_total         NUMBER;
4589         l_formula_total         NUMBER := 0;
4590         l_curr_char             VARCHAR2(1);
4591         l_formula_id            okl_formulae_v.id%TYPE := NULL;
4592         l_formula_string        okl_formulae_v.formula_string%TYPE := NULL;
4593         l_temp_string           okl_formulae_v.formula_string%TYPE := NULL;
4594         l_operand_name          okl_operands_v.name%TYPE;
4595         l_dummy_value           NUMBER;
4596 
4597         -- Extract evaluation string for a formula
4598         CURSOR l_formula_csr
4599                 (cp_formula_name IN okl_formulae_v.name%TYPE) IS
4600                 SELECT  f.id, f.formula_string
4601                 FROM    okl_formulae_v f
4602                 WHERE   f.name = cp_formula_name
4603                 AND     f.start_date <= SYSDATE
4604                 AND     NVL (f.end_date, sysdate) >= SYSDATE;
4605 
4606         -- Extract operand name
4607         CURSOR l_operand_csr (
4608                 cp_formula_id    IN okl_formulae_v.id%TYPE,
4609                 cp_operand_label IN okl_fmla_oprnds_v.label%TYPE) IS
4610                 SELECT  o.name
4611                 FROM    okl_formulae_v  f,
4612                         okl_fmla_oprnds_v l,
4613                         okl_operands_v  o
4614                 WHERE   f.id            = cp_formula_id
4615                 AND     l.fma_id        = f.id
4616                 AND     l.label         = cp_operand_label
4617                 AND     o.id            = l.opd_id;
4618 
4619     -- Bug#12811901 - Added Cursor to get partial termination flag
4620 	CURSOR get_qte_dtls_csr (p_qte_id OKL_TRX_QUOTES_B.ID%TYPE) IS
4621 	  SELECT upper(nvl(qte.partial_yn,'N')) partial_yn
4622 	    FROM OKL_TRX_QUOTES_B QTE
4623 	   WHERE QTE.ID = p_qte_id;
4624 
4625    l_partial_yn VARCHAR2(3);
4626 
4627 
4628    j NUMBER; --rmunjulu 4300443
4629    l_asset_tbl asset_tbl_type; --rmunjulu 4300443
4630   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'process_top_formula_new';
4631     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
4632     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
4633     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
4634 BEGIN
4635 
4636    IF (is_debug_procedure_on) THEN
4637        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
4638    END IF;
4639     -- bug 5380712 rbruno start
4640     g_compute_qte_fee := TRUE;
4641     -- bug 5380712 rbruno end
4642 
4643    -- Bug#12811901 - Check partial termination - Start
4644    OPEN  get_qte_dtls_csr (p_qtev_rec.id);
4645      FETCH get_qte_dtls_csr INTO l_partial_yn;
4646    CLOSE get_qte_dtls_csr;
4647 
4648     IF nvl(l_partial_yn,'N') = 'Y' THEN
4649       -- need to check if no more assets
4650       l_partial_yn := OKL_AM_LEASE_LOAN_TRMNT_PVT.check_true_partial_quote(
4651                                 p_quote_id     => p_qtev_rec.id,
4652                                 p_contract_id  => p_qtev_rec.khr_id);
4653     END IF;
4654    -- Bug#12811901 - Check partial termination - End
4655 
4656 
4657         -- *************************************************
4658         -- Validate formula and get formula string to disect
4659         -- *************************************************
4660 IF (is_debug_statement_on) THEN
4661        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4662               'value of p_formula_name'|| p_formula_name);
4663        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4664               'value of p_qtev_rec.khr_id'|| p_qtev_rec.khr_id);
4665        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4666               'value of p_cle_id'|| p_cle_id);
4667 END IF;
4668         -- Make sure Formula Engine can validate the formula
4669         okl_am_util_pvt.get_formula_value (
4670                 p_formula_name  => p_formula_name,
4671                 p_chr_id        => p_qtev_rec.khr_id,
4672                 p_cle_id        => p_cle_id,
4673     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
4674     -- pass additional parameters quote_effective_from_date and quote_id
4675         p_additional_parameters => g_add_params,
4676     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- End ++++++++++++++++
4677                 x_formula_value => l_dummy_value,
4678                 x_return_status => l_return_status);
4679 IF (is_debug_statement_on) THEN
4680        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4681               'after call to okl_am_util_pvt.get_formula_value :: value of l_return_status'|| l_return_status);
4682 END IF;
4683         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4684                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4685                         l_overall_status := l_return_status;
4686                 END IF;
4687         END IF;
4688 
4689         OPEN    l_formula_csr (p_formula_name);
4690         FETCH   l_formula_csr INTO l_formula_id, l_formula_string;
4691         CLOSE   l_formula_csr;
4692 
4693 /* -- Similar changes as done by GKADRAKA for bug 4333243
4694         IF NVL (l_formula_string, G_MISS_CHAR) = G_MISS_CHAR
4695         OR (    p_operand IS NOT NULL
4696             AND l_formula_string LIKE '%' || p_operand || '%')
4697         THEN
4698                 -- First condition ensures non-empty string
4699                 -- Second condition ensures absence of recursive references
4700                 l_return_status := OKL_API.G_RET_STS_ERROR;
4701         END IF;
4702 
4703         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4704                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4705                         l_overall_status := l_return_status;
4706                 END IF;
4707         END IF;
4708 */
4709         -- *******************************************************************
4710         -- The top formula consists of a number of operands separated by PLUS
4711         -- signs only. Each operand of the formula has a label which directly
4712         -- corresponds to either
4713         -- (a) a rule found in rule groups for the selected quote type
4714         --     (operand-rule combo) or
4715         -- (b) another formula in the formula engine (executable operand).
4716         -- *******************************************************************
4717 IF (is_debug_statement_on) THEN
4718        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4719               'value of l_overall_status'|| l_overall_status);
4720 END IF;
4721         IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS THEN
4722 
4723             -- make sure last operand is processed
4724             l_formula_string := l_formula_string || '+';
4725 
4726         -- rmunjulu 4300443 Loop thru the asset table only once
4727         FOR j IN p_asset_tbl.FIRST..p_asset_tbl.LAST LOOP -- rmunjulu 4300443
4728 
4729         l_asset_tbl.DELETE; -- rmunjulu 4300443
4730 
4731         l_asset_tbl(j) := p_asset_tbl(j); -- rmunjulu 4300443
4732 
4733             -- check every character
4734             FOR i IN 1 .. LENGTH (l_formula_string) LOOP
4735 
4736                 l_curr_char := SUBSTR (l_formula_string, i, 1);
4737 
4738                 IF l_curr_char IN ('(','+','-','*','/',')') THEN
4739 
4740                     IF l_curr_char <> '+' THEN
4741 
4742                         -- Only PLUS signs are allowed in the top quote
4743                         -- formula. Other signs are treated as "+"
4744                         okl_am_util_pvt.set_message (
4745                              p_app_name  => G_APP_NAME
4746                             ,p_msg_name  => 'OKL_AM_INVALID_FORMULA_SIGN'
4747                             ,p_msg_level => OKL_AM_UTIL_PVT.G_DEBUG_LEVEL);
4748 
4749                     END IF;
4750 
4751                     IF l_temp_string IS NOT NULL THEN
4752 
4753                         l_operand_name := NULL;
4754                         OPEN    l_operand_csr (l_formula_id, l_temp_string);
4755                         FETCH   l_operand_csr INTO l_operand_name;
4756                         CLOSE   l_operand_csr;
4757 
4758                         -- ************************
4759                         -- Get value for an operand
4760                         -- ************************
4761 
4762                         IF l_operand_name IS NOT NULL THEN
4763 			  -- Bug#12811901 - Add condition to exclude Security Deposit line - AMCSDD
4764 			  -- for a partial termination quote as security deposit is always at
4765 			  -- contract level and partial termination quote should not have this line
4766 			  IF NOT (nvl(l_partial_yn,'N') = 'Y' AND l_operand_name = 'AMCSDD') THEN
4767 
4768                             process_operand (
4769                                 p_head_rgd_code => p_head_rgd_code,
4770                                 p_line_rgd_code => p_line_rgd_code,
4771                                 p_operand       => l_operand_name,
4772                                 p_qtev_rec      => p_qtev_rec,
4773                                 p_cle_id        => p_cle_id,
4774                                 p_asset_tbl     => l_asset_tbl, -- rmunjulu 4300443
4775                                 p_formula_name  => p_formula_name,
4776                                 p_check_qlt_yn  => TRUE,
4777                                 px_tqlv_tbl     => px_tqlv_tbl,
4778                                 x_operand_total => l_operand_total,
4779                                 x_return_status => l_return_status);
4780 
4781 
4782 IF (is_debug_statement_on) THEN
4783        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4784               'after process_operand value of l_return_status'|| l_return_status);
4785 END IF;
4786      end if;
4787                         ELSE
4788                             -- Should never happen because
4789                             -- Formula Engine validation above would fail
4790                             l_return_status := OKL_API.G_RET_STS_ERROR;
4791        -- invalid id Formula Label Id
4792                             OKC_API.SET_MESSAGE (
4793                                 p_app_name      => G_OKC_APP_NAME,
4794                                 p_msg_name      => G_INVALID_VALUE,
4795                                 p_token1        => G_COL_NAME_TOKEN,
4796                                 p_token1_value  => 'Formula Label Id');
4797                         END IF;
4798 
4799                         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4800                             IF l_overall_status <>
4801                                 OKL_API.G_RET_STS_UNEXP_ERROR THEN
4802                                     l_overall_status := l_return_status;
4803                             END IF;
4804                         END IF;
4805 
4806                         l_formula_total := l_formula_total +
4807                                            NVL (l_operand_total, 0);
4808                         l_temp_string   := NULL;
4809 
4810                     END IF;
4811 
4812                 ELSE
4813                     l_temp_string := l_temp_string || l_curr_char;
4814                 END IF;
4815 
4816             END LOOP;
4817 
4818         END LOOP; -- rmunjulu 4300443
4819 
4820         -- rmunjulu 4996136 reset this global variable so that
4821         --outstanding balance is calculated properly.
4822         OKL_AM_CALC_QUOTE_STREAM_PVT.G_OUTSTANDING_BAL_DONE :='N';
4823         OKL_AM_CALC_QUOTE_STREAM_PVT.G_SERVICE_BAL_DONE :='N'; -- rmunjulu  5066471
4824         --akrangan Bug 5495474 start
4825         OKL_AM_CALC_QUOTE_STREAM_PVT.G_CONTRACTUAL_FEE_DONE :='N';
4826         OKL_AM_CALC_QUOTE_STREAM_PVT.G_UNBILLED_RECEIVABLES_DONE :='N';
4827         --akrangan Bug 5495474 end
4828         G_PERFORM_CONT_FEE_CALC := TRUE; -- ansethur fix for bug 5579808 - resetting this global variable.
4829 
4830             --sechawla 30-apr-09 7575939 : begin
4831             G_FIN_FEE_CALC_DONE := FALSE;
4832 	        G_ABS_FEE_CALC_DONE := FALSE;
4833 	        G_EXP_FEE_CALC_DONE := FALSE;
4834 	        G_GEN_FEE_CALC_DONE := FALSE;
4835 	        G_IN_FEE_CALC_DONE  := FALSE;
4836 	        G_MISC_FEE_CALC_DONE := FALSE;
4837 	        G_PASS_FEE_CALC_DONE := FALSE;
4838             G_ROLL_FEE_CALC_DONE := FALSE;
4839             --sechawla 30-apr-09 7575939 : end
4840         ELSE
4841 
4842             l_return_status := OKL_API.G_RET_STS_ERROR;
4843             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4844         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4845          l_overall_status := l_return_status;
4846         END IF;
4847             END IF;
4848 
4849         END IF;
4850 IF (is_debug_statement_on) THEN
4851        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4852               'value of l_formula_total'|| l_formula_total);
4853 END IF;
4854 IF (is_debug_statement_on) THEN
4855        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4856               'value of l_overall_status'|| l_overall_status);
4857 END IF;
4858         x_formula_total := l_formula_total;
4859         x_return_status := l_overall_status;
4860 
4861    IF (is_debug_procedure_on) THEN
4862        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
4863    END IF;
4864 
4865 EXCEPTION
4866 
4867         WHEN OTHERS THEN
4868 
4869                 IF (l_formula_csr%ISOPEN) THEN
4870                         CLOSE l_formula_csr;
4871                 END IF;
4872 
4873                 IF (l_operand_csr%ISOPEN) THEN
4874                         CLOSE l_operand_csr;
4875                 END IF;
4876 
4877         IF (is_debug_exception_on) THEN
4878             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
4879                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
4880         END IF;
4881                 -- store SQL error message on message stack for caller
4882                 OKL_API.SET_MESSAGE (
4883                          p_app_name     => G_APP_NAME
4884                         ,p_msg_name     => G_UNEXPECTED_ERROR
4885                         ,p_token1       => G_SQLCODE_TOKEN
4886                         ,p_token1_value => sqlcode
4887                         ,p_token2       => G_SQLERRM_TOKEN
4888                         ,p_token2_value => sqlerrm);
4889 
4890                 -- notify caller of an UNEXPECTED error
4891                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
4892 
4893 END process_top_formula_new;
4894 
4895 
4896 -- Start of comments
4897 --
4898 -- Procedure Name       : process_top_rule
4899 -- Description          : Process top rule which drives quote calculation
4900 -- Business Rules       :
4901 -- Parameters           : rule group, rule code, quote record,
4902 --                        contract line or table of contract lines,
4903 --                        table of quote line records,
4904 --                        table of default line types
4905 -- Version                  : 1.0
4906 -- History          : rmunjulu 3954846 Added code to not create default quote lines for with purchase
4907 --                    as purchase option still needs to be evaluated, will create default quote lines
4908 --                    finally if even purchase option is not found.
4909 --                  : rmunjulu 4300443 Changed to call the new performant process_top_formula_new
4910 -- End of comments
4911 
4912 PROCEDURE process_top_rule (
4913                 p_head_rgd_code IN VARCHAR2,
4914                 p_line_rgd_code IN VARCHAR2,
4915                 p_rdf_code      IN VARCHAR2,
4916                 p_qtev_rec      IN qtev_rec_type,
4917                 p_cle_id        IN NUMBER,
4918                 p_asset_tbl     IN asset_tbl_type,
4919                 px_tqlv_tbl     IN OUT NOCOPY tqlv_tbl_type,
4920                 p_default_tql   IN qlt_tbl_type,
4921                 x_formula_total OUT NOCOPY NUMBER,
4922                 x_return_status OUT NOCOPY VARCHAR2) IS
4923 
4924         l_rulv_rec              rulv_rec_type;
4925         l_return_status         VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
4926         l_overall_status        VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
4927         l_rgd_code              VARCHAR2(30)    := NULL;
4928         l_quote_subtotal        NUMBER;
4929         l_rule_chr_id           NUMBER;
4930 
4931          L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'process_top_rule';
4932     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
4933     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
4934     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
4935 BEGIN
4936 
4937         -- ******************************************************************
4938         -- The API derives the top formula from the top rule for a rule group
4939         -- ******************************************************************
4940    IF (is_debug_procedure_on) THEN
4941        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
4942    END IF;
4943 
4944 
4945         IF p_head_rgd_code IS NULL AND p_line_rgd_code IS NOT NULL THEN
4946                 l_rgd_code      := p_line_rgd_code;
4947         ELSIF p_head_rgd_code IS NOT NULL THEN
4948                 l_rgd_code      := p_head_rgd_code;
4949         END IF;
4950 
4951 
4952         IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS
4953         AND p_qtev_rec.qtp_code NOT LIKE 'TER_MAN%'
4954         AND l_rgd_code IS NOT NULL
4955         AND p_rdf_code IS NOT NULL THEN
4956 
4957                 l_rule_chr_id := okl_am_util_pvt.get_rule_chr_id (p_qtev_rec);
4958 
4959 IF (is_debug_statement_on) THEN
4960    OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4961           'Value of l_rgd_code'|| l_rgd_code);
4962    OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4963           'Value of p_rdf_code'|| p_rdf_code);
4964    OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4965           'Value of l_rule_chr_id'|| l_rule_chr_id);
4966    OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4967           'Value of p_cle_id'|| p_cle_id);
4968 END IF;
4969                 okl_am_util_pvt.get_rule_record (
4970                         p_rgd_code      => l_rgd_code,
4971                         p_rdf_code      => p_rdf_code,
4972                         p_chr_id        => l_rule_chr_id,
4973                         p_cle_id        => p_cle_id,
4974                         x_rulv_rec      => l_rulv_rec,
4975                         x_return_status => l_return_status,
4976                         p_message_yn    => TRUE); --FALSE); -- rmunjulu 4741168
4977 
4978 IF (is_debug_statement_on) THEN
4979     OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
4980           'after call to okl_am_util_pvt.get_rule_record from process_top_rule Value of l_return_status'|| l_return_status);
4981 END IF;
4982         ELSIF l_overall_status = OKL_API.G_RET_STS_SUCCESS
4983         AND p_qtev_rec.qtp_code LIKE 'TER_MAN%' THEN
4984 
4985                 l_rulv_rec.RULE_INFORMATION2 := 'QUOTE_TERMINATION_MANUAL';
4986                 l_return_status := OKL_API.G_RET_STS_SUCCESS;
4987 
4988         ELSE
4989                 l_return_status := OKL_API.G_RET_STS_ERROR;
4990         END IF;
4991 
4992         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4993                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4994                         l_overall_status := l_return_status;
4995                 END IF;
4996         END IF;
4997 
4998         -- Uncomment if you want always create default lines
4999         -- l_overall_status     := OKL_API.G_RET_STS_ERROR;
5000 
5001         -- **************************************
5002         -- Disect top formula string,
5003         -- calculate each operand and their total
5004         -- **************************************
5005 
5006         IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS
5007         -- AND l_rulv_rec.RULE_INFORMATION1 = 'Y' -- Field is disabled
5008         AND NVL (l_rulv_rec.RULE_INFORMATION2, G_MISS_CHAR) <> G_MISS_CHAR THEN
5009 
5010                 process_top_formula_new ( -- rmunjulu 4300443 Call this new performant procedure
5011                         p_head_rgd_code => p_head_rgd_code,
5012                         p_line_rgd_code => p_line_rgd_code,
5013                         p_qtev_rec      => p_qtev_rec,
5014                         p_cle_id        => p_cle_id,
5015                         p_asset_tbl     => p_asset_tbl,
5016                         p_formula_name  => l_rulv_rec.RULE_INFORMATION2,
5017                         p_operand       => NULL,
5018                         px_tqlv_tbl     => px_tqlv_tbl,
5019                         x_formula_total => l_quote_subtotal,
5020                         x_return_status => l_return_status);
5021 IF (is_debug_statement_on) THEN
5022     OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5023           'after call to process_top_formula_new from process_top_rule Value of l_return_status'|| l_return_status);
5024 END IF;
5025                 IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5026                         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR
5027                         THEN
5028                                 l_overall_status := l_return_status;
5029                         END IF;
5030                 END IF;
5031 
5032         ELSE
5033                 l_return_status := OKL_API.G_RET_STS_ERROR;
5034         END IF;
5035 
5036         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5037                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5038                         l_overall_status := l_return_status;
5039                 END IF;
5040         END IF;
5041 
5042         -- **************************************
5043         -- Create default lines if no top formula
5044         -- **************************************
5045 
5046         IF (   l_overall_status <> OKL_API.G_RET_STS_SUCCESS
5047             OR px_tqlv_tbl.COUNT = 0)
5048         AND p_qtev_rec.qtp_code NOT LIKE 'TER_MAN%'
5049     AND p_qtev_rec.qtp_code NOT IN                  -- rmunjulu Added this AND for bug 3954846
5050                 (
5051                  'TER_PURCHASE',       -- Termination - With Purchase
5052                  'TER_ROLL_PURCHASE',  -- Termination - Rollover To New Contract With Purchase
5053                  'TER_RECOURSE'        -- Termination - Recourse With Purchase
5054                 )THEN
5055 
5056                 -- Unable to find Quote Formula. LINES default
5057                 -- quote lines are created to be populated manually
5058                 -- +1 is added to count tax line created later
5059                 okl_am_util_pvt.set_message(
5060                          p_app_name     => G_APP_NAME
5061                         ,p_msg_name     => 'OKL_AM_DEFAULT_QUOTE_LINES');
5062 
5063                 create_default_quote_lines (
5064                         p_qtev_rec      => p_qtev_rec,
5065                         p_cle_id        => p_cle_id,
5066                         p_asset_tbl     => p_asset_tbl,
5067                         px_tqlv_tbl     => px_tqlv_tbl,
5068                         p_default_tql   => p_default_tql,
5069                         x_return_status => l_return_status);
5070 
5071                 IF (is_debug_statement_on) THEN
5072                     OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5073                           'after call to create_default_quote_lines from process_top_rule Value of l_return_status'|| l_return_status);
5074                 END IF;
5075                 -- Overwrite previous errors
5076                 l_overall_status := l_return_status;
5077                 l_quote_subtotal := 0;
5078 
5079         END IF;
5080 
5081         x_formula_total := l_quote_subtotal;
5082         x_return_status := l_overall_status;
5083 
5084            IF (is_debug_procedure_on) THEN
5085                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
5086            END IF;
5087 
5088 
5089 EXCEPTION
5090 
5091         WHEN OTHERS THEN
5092 
5093         IF (is_debug_exception_on) THEN
5094             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
5095                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
5096         END IF;
5097                 -- store SQL error message on message stack for caller
5098                 OKL_API.SET_MESSAGE (
5099                          p_app_name     => G_APP_NAME
5100                         ,p_msg_name     => G_UNEXPECTED_ERROR
5101                         ,p_token1       => G_SQLCODE_TOKEN
5102                         ,p_token1_value => sqlcode
5103                         ,p_token2       => G_SQLERRM_TOKEN
5104                         ,p_token2_value => sqlerrm);
5105 
5106                 -- notify caller of an UNEXPECTED error
5107                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5108 
5109 END process_top_rule;
5110 
5111 -- Start of comments
5112 --
5113 -- Procedure Name       : calc_bill_adjust
5114 -- Description          : Calculate Billing Adjustments and store as billing adjustment quote lines
5115 -- Business Rules       :
5116 -- Parameters           :
5117 -- History          : rmunjulu EDAT Created
5118 --                  : rmunjulu 02/09/05 Bug 4161133 Added code to insert billing adjustment date into quote amounts
5119 -- Version                  : 1.0
5120 -- End of comments
5121 
5122 PROCEDURE calc_bill_adjust (
5123                      p_qtev_rec         IN qtev_rec_type,
5124                      p_asset_tbl        IN asset_tbl_type,
5125                      px_tqlv_tbl            IN OUT NOCOPY tqlv_tbl_type,
5126                      x_return_status    OUT NOCOPY VARCHAR2) IS
5127 
5128     l_return_status             VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
5129     l_sub_line_tqlv_tbl tqlv_tbl_type := G_EMPTY_TQLV_TBL;
5130     l_bill_adjust_value  NUMBER;
5131     l_kle_id NUMBER;
5132     l_sty_id NUMBER;
5133     l_operand_total NUMBER;
5134     l_prorate_ratio NUMBER;
5135 
5136     l_overall_status            VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
5137 
5138     l_api_version        CONSTANT NUMBER := 1;
5139     l_msg_count NUMBER := OKL_API.G_MISS_NUM;
5140     l_msg_data  VARCHAR2(2000);
5141 
5142     l_input_tbl OKL_BPD_TERMINATION_ADJ_PVT.input_tbl_type;
5143     lx_baj_tbl  OKL_BPD_TERMINATION_ADJ_PVT.baj_tbl_type;
5144 
5145     l_due_date DATE; -- rmunjulu Bug 4161133 Added
5146     l_loan_refund_amount NUMBER; -- rmunjulu LOANS_ENHACEMENTS
5147      --akrangan  Bug 5655680 start --
5148              l_orig_kle_id NUMBER;
5149 
5150              --cursor to check if financial asset appears as linked asset
5151                CURSOR l_lnk_ast_csr (p_link_line_id  OKC_K_LINES_B.ID%TYPE) IS
5152                  Select    cim.object1_id1 kle_id -- original asset id
5153                  From   okc_k_lines_b lnk,
5154                     okc_line_styles_b lnk_lse,
5155                     okc_statuses_b sts,
5156                     okc_k_items    cim
5157                  Where  lnk.id = cim.cle_id
5158                  and    lnk.dnz_chr_id = cim.dnz_chr_id
5159                  and    lnk.lse_id = lnk_lse.id
5160                  and    lnk_lse.lty_code in ('LINK_FEE_ASSET','LINK_SERV_ASSET')
5161                  and    sts.code = lnk.sts_code
5162                  and    sts.ste_code not in ('EXPIRED','TERMINATED','CANCELLED')
5163                  and    cim.jtot_object1_code = 'OKX_COVASST'
5164                  and    cim.cle_id = to_char(p_link_line_id)
5165                  and    cim.object1_id2 = '#';
5166      --akrangan  Bug 5655680 end --
5167   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'calc_bill_adjust';
5168   is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
5169   is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
5170   is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
5171 BEGIN
5172    IF (is_debug_procedure_on) THEN
5173        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
5174    END IF;
5175    -- set the input rec for BPD API
5176    -- If partial termination
5177    IF nvl(p_qtev_rec.partial_yn, 'N') = 'Y' THEN
5178 
5179       FOR i IN p_asset_tbl.FIRST..p_asset_tbl.LAST LOOP
5180 
5181          l_input_tbl(i).khr_id := p_qtev_rec.khr_id;
5182          l_input_tbl(i).term_date_from := p_qtev_rec.date_effective_from;
5183          l_input_tbl(i).kle_id  := p_asset_tbl(i).p_asset_id;
5184 
5185       END LOOP;
5186    ELSE -- Full termination
5187 
5188       l_input_tbl(1).khr_id := p_qtev_rec.khr_id;
5189       l_input_tbl(1).term_date_from := p_qtev_rec.date_effective_from;
5190 
5191    END IF;
5192 
5193    -- Call BPD API to get billing from quote_effective_from_date onwards
5194    OKL_BPD_TERMINATION_ADJ_PVT.get_billing_adjust(
5195                         p_api_version     => l_api_version,
5196                         p_init_msg_list   => OKL_API.G_FALSE,
5197                         p_input_tbl       => l_input_tbl,
5198                         x_baj_tbl         => lx_baj_tbl,
5199                         x_return_status   => l_return_status,
5200                         x_msg_count       => l_msg_count,
5201                         x_msg_data        => l_msg_data);
5202 
5203 
5204    IF (is_debug_statement_on) THEN
5205        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5206        'After call to okl_am_util_pvt.get_formula_value :'||l_return_status);
5207    END IF;
5208 
5209    IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5210 
5211           -- Error getting the billing adjustments for the contract.
5212       OKL_API.set_message(
5213            p_app_name      => 'OKL',
5214            p_msg_name      => 'OKL_AM_ERROR_BILL_ADJST');
5215 
5216    END IF;
5217 
5218    IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5219       IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5220              l_overall_status := l_return_status;
5221           END IF;
5222    END IF;
5223 
5224    -- For each record returned by BPD, call the append_quote_line to insert the
5225    -- amount as BILL_ADJST quote line in quote lines table
5226    IF lx_baj_tbl.COUNT > 0 THEN
5227       FOR i IN lx_baj_tbl.FIRST..lx_baj_tbl.LAST LOOP
5228 
5229          l_prorate_ratio := 0;
5230 
5231          l_kle_id := lx_baj_tbl(i).kle_id;
5232          l_sty_id := lx_baj_tbl(i).sty_id;
5233          l_bill_adjust_value := lx_baj_tbl(i).amount; -- rmunjulu EDAT Added to set amount
5234 
5235                  -- rmunjulu Bug 4161133 Added to get due date for billing adjustment
5236                  l_due_date := lx_baj_tbl(i).stream_element_date;
5237                  --akrangan  Bug 5655680 start --
5238                           FOR l_lnk_ast IN l_lnk_ast_csr(l_kle_id) LOOP
5239                             l_orig_kle_id := l_lnk_ast.kle_id;
5240                   END LOOP;
5241                 --akrangan  Bug 5655680 end --
5242              -- Loop thru the asset tbl to get asset values for current asset
5243              -- to determine the prorate ratio
5244 
5245              IF  p_asset_tbl.COUNT > 0 THEN
5246                 FOR j IN p_asset_tbl.FIRST..p_asset_tbl.LAST LOOP
5247              --akrangan  Bug 5655680 start --
5248                     IF (p_asset_tbl(j).p_asset_id = l_kle_id)  OR (p_asset_tbl(j).p_asset_id = l_orig_kle_id) THEN --akrangan  Bug 5655680
5249                     --Added or Condition
5250              --akrangan  Bug 5655680 end --
5251                   -- determine the prorate ratio
5252                   l_prorate_ratio := (p_asset_tbl(j).p_quote_qty)/(p_asset_tbl(j).p_asset_qty);
5253 
5254                END IF;
5255                     END LOOP;
5256                  END IF;
5257 
5258          -- default the prorate ratio if was not evaluated properly
5259          IF l_prorate_ratio <= 0
5260                  OR l_prorate_ratio IS NULL THEN
5261             l_prorate_ratio := 1;
5262          END IF;
5263 
5264          -- set into -ve amount and prorate the adjustment amount
5265          l_bill_adjust_value := 0 - (l_bill_adjust_value * l_prorate_ratio);
5266 
5267          -- Add as BILL_ADJST quote line
5268          append_quote_line (
5269                         p_qtev_rec          => p_qtev_rec,
5270                         p_qlt_code          => 'BILL_ADJST',
5271                                 p_amount            => l_bill_adjust_value,
5272                                 p_kle_id            => l_kle_id,
5273                         p_formula_name  => NULL,
5274                         p_success_yn    => l_return_status,
5275                                 p_sub_tqlv_tbl  => l_sub_line_tqlv_tbl,
5276                                 p_sty_id            => l_sty_id,
5277                         p_defaulted_yn  => 'N',
5278                         p_due_date      => l_due_date, -- rmunjulu Bug 4161133 Added -- 4161133 Modified
5279                         px_tqlv_tbl     => px_tqlv_tbl,
5280                                 px_tbl_total    => l_operand_total);
5281 
5282          IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5283             IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5284                    l_overall_status := l_return_status;
5285                 END IF;
5286          END IF;
5287 
5288       END LOOP;
5289    END IF;
5290 
5291    -- rmunjulu LOANS_ENHANCEMENT -- create billing adjustment lines for loans refund
5292    IF nvl(p_qtev_rec.partial_yn, 'N') = 'N' THEN
5293 
5294      l_loan_refund_amount := OKL_AM_UTIL_PVT.get_excess_loan_payment(
5295                                      x_return_status    => l_return_status,
5296                                      p_khr_id           => p_qtev_rec.khr_id);
5297 
5298      IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5299        IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5300          l_overall_status := l_return_status;
5301        END IF;
5302      END IF;
5303 
5304          IF  l_loan_refund_amount <> 0 THEN
5305 
5306         -- get stream type ID
5307         --Bug 6266134 veramach start
5308         okl_streams_util.get_dependent_stream_type(
5309           p_khr_id                     => p_qtev_rec.khr_id,
5310           p_primary_sty_purpose        => 'RENT',
5311           p_dependent_sty_purpose      => 'EXCESS_LOAN_PAYMENT_PAID',
5312           x_return_status              => l_return_status,
5313           x_dependent_sty_id           => l_sty_id
5314         );
5315 
5316 
5317    IF (is_debug_statement_on) THEN
5318        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5319        'After call to okl_streams_util.get_dependent_stream_type :'||l_return_status);
5320    END IF;
5321 
5322         --Bug 6266134 veramach end
5323         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5324           IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5325             l_overall_status := l_return_status;
5326           END IF;
5327         END IF;
5328 
5329         l_loan_refund_amount := l_loan_refund_amount *-1; -- negate the amount
5330 
5331         -- Add as BILL_ADJST quote line
5332         append_quote_line (
5333                         p_qtev_rec          => p_qtev_rec,
5334                         p_qlt_code          => 'BILL_ADJST',
5335                                 p_amount            => l_loan_refund_amount,
5336                                 p_kle_id            => NULL,
5337                         p_formula_name  => NULL,
5338                         p_success_yn    => l_return_status,
5339                                 p_sub_tqlv_tbl  => l_sub_line_tqlv_tbl,
5340                                 p_sty_id            => l_sty_id,
5341                         p_defaulted_yn  => 'N',
5342                         p_due_date      => NULL,
5343                         px_tqlv_tbl     => px_tqlv_tbl,
5344                                 px_tbl_total    => l_operand_total);
5345 
5346          IF (is_debug_statement_on) THEN
5347                  OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5348                 'After call to append_quote_line :'||l_return_status);
5349          END IF;
5350 
5351         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5352           IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5353             l_overall_status := l_return_status;
5354           END IF;
5355         END IF;
5356      END IF;
5357    END IF;
5358 
5359    x_return_status := l_overall_status;
5360 
5361    IF (is_debug_procedure_on) THEN
5362        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
5363    END IF;
5364 
5365 EXCEPTION
5366 
5367         WHEN OTHERS THEN
5368         IF (is_debug_exception_on) THEN
5369             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
5370                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
5371         END IF;
5372                 -- store SQL error message on message stack for caller
5373                 OKL_API.SET_MESSAGE (
5374                          p_app_name     => G_APP_NAME
5375                         ,p_msg_name     => G_UNEXPECTED_ERROR
5376                         ,p_token1           => G_SQLCODE_TOKEN
5377                         ,p_token1_value => sqlcode
5378                         ,p_token2           => G_SQLERRM_TOKEN
5379                         ,p_token2_value => sqlerrm);
5380 
5381                 -- notify caller of an UNEXPECTED error
5382                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5383 
5384 END  calc_bill_adjust;
5385 
5386 
5387 -- Start of comments
5388 --
5389 -- Procedure Name       : calc_anticipated_bill
5390 -- Description          : Calculate Anticipated Billing for future dated quotes
5391 -- Business Rules       :
5392 -- Parameters           :
5393 -- History          : rmunjulu EDAT Created
5394 --                    rmunjulu EDAT Added sel_date
5395 -- Version                  : 1.0
5396 -- End of comments
5397 
5398 PROCEDURE calc_anticipated_bill (
5399                      p_qtev_rec         IN qtev_rec_type,
5400                      x_return_status    OUT NOCOPY VARCHAR2) IS
5401 
5402         l_return_status  VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
5403     l_kle_id         NUMBER;
5404     l_sty_id         NUMBER;
5405     l_api_version        CONSTANT NUMBER := 1;
5406     l_msg_count          NUMBER := OKL_API.G_MISS_NUM;
5407     l_msg_data           VARCHAR2(2000);
5408 
5409         l_overall_status                VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
5410 
5411     l_functional_currency_code VARCHAR2(15);
5412     l_contract_currency_code VARCHAR2(15);
5413     l_currency_conversion_type VARCHAR2(30);
5414     l_currency_conversion_rate NUMBER;
5415     l_currency_conversion_date DATE;
5416     l_org_id  NUMBER;
5417     l_converted_amount NUMBER;
5418 
5419     -- Since we do not use the amount or converted amount in TRX_Quotes table
5420     -- set a hardcoded value for the amount (and pass to to
5421     -- OKL_ACCOUNTING_UTIL.convert_to_functional_currency and get back
5422     -- conversion values )
5423     l_hard_coded_amount NUMBER := 100;
5424 
5425     lp_qabv_tbl OKL_TXD_QTE_ANTCPT_BILL_PUB.qabv_tbl_type;
5426     lx_qabv_tbl OKL_TXD_QTE_ANTCPT_BILL_PUB.qabv_tbl_type;
5427 
5428     l_input_tbl OKL_BPD_TERMINATION_ADJ_PVT.input_tbl_type;
5429     lx_baj_tbl  OKL_BPD_TERMINATION_ADJ_PVT.baj_tbl_type;
5430 
5431   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'calc_anticipated_bill';
5432     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
5433     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
5434     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
5435 BEGIN
5436    IF (is_debug_procedure_on) THEN
5437        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
5438    END IF;
5439 
5440    -- if future dated quote
5441    IF trunc(p_qtev_rec.date_requested) < trunc(p_qtev_rec.date_effective_from) THEN
5442 
5443       -- Call BPD API get all the anticipated billing needed for the contract
5444       -- set the input rec for BPD API
5445       l_input_tbl(1).khr_id := p_qtev_rec.khr_id;
5446       l_input_tbl(1).term_date_from := p_qtev_rec.date_requested;
5447       l_input_tbl(1).term_date_to := p_qtev_rec.date_effective_from;
5448 
5449       -- Call BPD API to get unbilled amount from quote creation date till quote effective from date
5450       OKL_BPD_TERMINATION_ADJ_PVT.get_unbilled_recvbl(
5451                         p_api_version     => l_api_version,
5452                         p_init_msg_list   => OKL_API.G_FALSE,
5453                         p_input_tbl       => l_input_tbl,
5454                         x_baj_tbl         => lx_baj_tbl,
5455                         x_return_status   => l_return_status,
5456                         x_msg_count       => l_msg_count,
5457                         x_msg_data        => l_msg_data);
5458 
5459      IF (is_debug_statement_on) THEN
5460        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5461        'after call to OKL_BPD_TERMINATION_ADJ_PVT.get_unbilled_recvbl :'||l_return_status);
5462       END IF;
5463 
5464       IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5465 
5466          -- Error getting the billing adjustments for the contract.
5467          OKL_API.set_message(
5468             p_app_name      => 'OKL',
5469             p_msg_name      => 'OKL_AM_ERROR_BILL_ADJST');
5470 
5471       END IF;
5472 
5473       IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5474          IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5475                 l_overall_status := l_return_status;
5476          END IF;
5477       END IF;
5478 
5479       -- For each record returned by BPD, call the QAB TAPI to insert the
5480       -- amount as new record in OKL_TXD_QTE_ANTCPT_BILL table
5481       -- Call the TAPI to insert into new table OKL_TXD_QTE_ANTCPT_BILL
5482       IF lx_baj_tbl.COUNT > 0 THEN
5483          FOR i IN lx_baj_tbl.FIRST..lx_baj_tbl.LAST LOOP
5484 
5485             -- set the TAPI tbl type
5486             lp_qabv_tbl(i).qte_id := p_qtev_rec.id;
5487             lp_qabv_tbl(i).khr_id := p_qtev_rec.khr_id;
5488             lp_qabv_tbl(i).kle_id := lx_baj_tbl(i).kle_id;
5489             lp_qabv_tbl(i).sty_id := lx_baj_tbl(i).sty_id;
5490             lp_qabv_tbl(i).amount := lx_baj_tbl(i).amount;
5491 
5492                         -- rmunjulu EDAT Added sel_date
5493             lp_qabv_tbl(i).sel_date := lx_baj_tbl(i).stream_element_date;
5494 
5495             -- Get the functional currency from AM_Util
5496             OKL_AM_UTIL_PVT.get_func_currency_org(
5497                                  x_org_id        => l_org_id,
5498                                  x_currency_code => l_functional_currency_code);
5499 
5500             -- Get the currency conversion details from ACCOUNTING_Util
5501             OKL_ACCOUNTING_UTIL.convert_to_functional_currency(
5502                      p_khr_id                           => p_qtev_rec.khr_id,
5503                      p_to_currency                  => l_functional_currency_code,
5504                      p_transaction_date                 => p_qtev_rec.date_effective_from,
5505                      p_amount                           => l_hard_coded_amount,
5506                      x_return_status            => l_return_status,
5507                      x_contract_currency            => l_contract_currency_code,
5508                      x_currency_conversion_type => l_currency_conversion_type,
5509                      x_currency_conversion_rate => l_currency_conversion_rate,
5510                      x_currency_conversion_date => l_currency_conversion_date,
5511                      x_converted_amount         => l_converted_amount);
5512 
5513         IF (is_debug_statement_on) THEN
5514                 OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5515                'after call to OKL_ACCOUNTING_UTIL.convert_to_functional_currency :'||l_return_status);
5516            END IF;
5517 
5518             -- raise exception if error
5519             IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5520                RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5521             ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
5522                RAISE OKL_API.G_EXCEPTION_ERROR;
5523             END IF;
5524 
5525             lp_qabv_tbl(i).currency_code := l_contract_currency_code;
5526             lp_qabv_tbl(i).currency_conversion_code := l_functional_currency_code;
5527 
5528             -- If the functional currency is different from contract currency then set
5529             -- currency conversion columns
5530             IF l_functional_currency_code <> l_contract_currency_code THEN
5531 
5532                -- Set the currency conversion columns
5533                lp_qabv_tbl(i).currency_conversion_type := l_currency_conversion_type;
5534                lp_qabv_tbl(i).currency_conversion_rate := l_currency_conversion_rate;
5535                lp_qabv_tbl(i).currency_conversion_date := l_currency_conversion_date;
5536 
5537             END IF;
5538 
5539          END LOOP;
5540 
5541       END IF;
5542 
5543       -- call TAPI to insert records
5544       OKL_TXD_QTE_ANTCPT_BILL_PUB.create_txd_qte_ant_bill(
5545                    p_api_version    => l_api_version,
5546                    p_init_msg_list  => OKL_API.G_FALSE,
5547                    x_return_status  => l_return_status,
5548                    x_msg_count      => l_msg_count,
5549                    x_msg_data       => l_msg_data,
5550                    p_qabv_tbl       => lp_qabv_tbl,
5551                    x_qabv_tbl       => lx_qabv_tbl);
5552 
5553         IF (is_debug_statement_on) THEN
5554                 OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5555                'after call to OKL_TXD_QTE_ANTCPT_BILL_PUB.create_txd_qte_ant_bill:'||l_return_status);
5556            END IF;
5557 
5558       IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5559          IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5560                 l_overall_status := l_return_status;
5561          END IF;
5562       END IF;
5563 
5564    END IF;
5565 
5566    x_return_status := l_overall_status;
5567 
5568    IF (is_debug_procedure_on) THEN
5569        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
5570    END IF;
5571 
5572 EXCEPTION
5573 
5574     WHEN OKL_API.G_EXCEPTION_ERROR THEN
5575         x_return_status := OKL_API.G_RET_STS_ERROR;
5576 
5577     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
5578         x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5579 
5580         WHEN OTHERS THEN
5581 
5582          IF (is_debug_exception_on) THEN
5583             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
5584                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
5585         END IF;
5586                 -- store SQL error message on message stack for caller
5587                 OKL_API.SET_MESSAGE (
5588                          p_app_name     => G_APP_NAME
5589                         ,p_msg_name     => G_UNEXPECTED_ERROR
5590                         ,p_token1       => G_SQLCODE_TOKEN
5591                         ,p_token1_value => sqlcode
5592                         ,p_token2       => G_SQLERRM_TOKEN
5593                         ,p_token2_value => sqlerrm);
5594 
5595                 -- notify caller of an UNEXPECTED error
5596                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5597 
5598 END  calc_anticipated_bill;
5599 
5600 
5601 -- Start of comments
5602 --
5603 -- Procedure Name       : repurchase
5604 -- Description          : Calculate repurchase quote
5605 -- Business Rules       :
5606 -- Parameters           : quote header record, list of assets
5607 -- Version                  : 1.0
5608 -- History          : SECHAWLA 20-NOV-02 - Bug 2680542 :
5609 --                    Changed reference p_asset_tbl(l_asset_cnt) to   p_asset_tbl(l_asset_cnt).p_asset_id
5610 -- End of comments
5611 
5612 PROCEDURE repurchase (
5613                 p_qtev_rec      IN qtev_rec_type,
5614                 p_asset_tbl     IN asset_tbl_type,
5615                 x_tqlv_tbl      OUT NOCOPY tqlv_tbl_type,
5616                 x_return_status OUT NOCOPY VARCHAR2) IS
5617 
5618         -- Table to store temp results to be copied to x_tqlv_tbl
5619         l_tqlv_tbl              tqlv_tbl_type;
5620 
5621         -- Rule groups to store repurchase-related rules
5622         l_repurchase_rule_group  CONSTANT VARCHAR2(30) := 'AMREPQ';
5623 
5624         -- Top rule "Calculate Repurchase Quote"
5625         l_repurchase_rule_code   CONSTANT VARCHAR2(30) := 'AMARQC';
5626 
5627         -- Default lines to be created if top rule is not found
5628         l_repurchase_default_tql qlt_tbl_type
5629                 := qlt_tbl_type ('AMBSPR','AMCQFE','AMCQDR');
5630 
5631         l_quote_subtotal        NUMBER := 0;    -- Sum of all quote lines
5632         l_floor_price           NUMBER := 0;    -- Asset floor price
5633         l_asset_cnt             NUMBER;         -- Asset counter
5634 
5635         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
5636         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
5637 
5638     -- get the floor price
5639         CURSOR l_floor_csr (cp_art_id NUMBER, cp_cle_id NUMBER) IS
5640                 SELECT  SUM (NVL (a.floor_price, 0))    floor_price
5641                 FROM    okl_asset_returns_b             a
5642                 WHERE   a.id                            = cp_art_id
5643                 AND     a.kle_id                        = cp_cle_id;
5644 
5645   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'repurchase';
5646       is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
5647     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
5648     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
5649 BEGIN
5650    IF (is_debug_procedure_on) THEN
5651        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
5652    END IF;
5653 
5654     l_asset_cnt := p_asset_tbl.FIRST;
5655     LOOP  -- All repurchase rules are stored on line level
5656 
5657         -- *******************************************
5658         -- Calculate values of all quote line elements
5659         -- *******************************************
5660 
5661         process_top_rule (
5662                 p_head_rgd_code => NULL,
5663                 p_line_rgd_code => l_repurchase_rule_group,
5664                 p_rdf_code      => l_repurchase_rule_code,
5665                 p_qtev_rec      => p_qtev_rec,
5666       --SECHAWLA - Bug 2680542 : Changed reference p_asset_tbl(l_asset_cnt) to   p_asset_tbl(l_asset_cnt).p_asset_id
5667                 p_cle_id        => p_asset_tbl(l_asset_cnt).p_asset_id,
5668                 p_asset_tbl     => G_EMPTY_ASSET_TBL,
5669                 px_tqlv_tbl     => l_tqlv_tbl,
5670                 p_default_tql   => l_repurchase_default_tql,
5671                 x_formula_total => l_quote_subtotal,
5672                 x_return_status => l_return_status);
5673 
5674            IF (is_debug_statement_on) THEN
5675                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5676                'after call to process_top_rule :'||l_return_status);
5677            END IF;
5678 
5679         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5680                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5681                         l_overall_status := l_return_status;
5682                 END IF;
5683         END IF;
5684 
5685         -- ***************************************
5686         -- Check Floor Price againt quote subtotal
5687         -- ***************************************
5688 --SECHAWLA 24-FEB-03 Bug # 2817025 : Do not need to set this message
5689 /*
5690         l_floor_price := 0;
5691  -- SECHAWLA - Bug 2680542 : Changed reference p_asset_tbl(l_asset_cnt) to p_asset_tbl(l_asset_cnt).p_asset_id
5692         OPEN    l_floor_csr (p_qtev_rec.art_id, p_asset_tbl(l_asset_cnt).p_asset_id);
5693         FETCH   l_floor_csr INTO l_floor_price;
5694         CLOSE   l_floor_csr;
5695 
5696         IF l_floor_price > l_quote_subtotal THEN
5697 
5698                 -- Repurchase Quote amount QUOTE_AMOUNT
5699                 -- is lower than Floor Price FLOOR_PRICE
5700                 okl_am_util_pvt.set_message (
5701                          p_app_name     => G_APP_NAME
5702                         ,p_msg_name     => 'OKL_AM_LOW_REP_QUOTE_AMOUNT'
5703                         ,p_token1       => 'QUOTE_AMOUNT'
5704                         ,p_token1_value => l_quote_subtotal
5705                         ,p_token2       => 'FLOOR_PRICE'
5706                         ,p_token2_value => l_floor_price);
5707 
5708         END IF;
5709 */
5710 
5711 
5712         EXIT WHEN (l_asset_cnt = p_asset_tbl.LAST);
5713         l_asset_cnt := p_asset_tbl.NEXT(l_asset_cnt);
5714 
5715     END LOOP; -- Every record in Asset table
5716 
5717     x_tqlv_tbl          := l_tqlv_tbl;
5718     x_return_status     := l_overall_status;
5719 
5720    IF (is_debug_procedure_on) THEN
5721        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
5722    END IF;
5723 
5724 EXCEPTION
5725 
5726         WHEN OTHERS THEN
5727 
5728                 -- close open cursors
5729                 IF l_floor_csr%ISOPEN THEN
5730                         CLOSE l_floor_csr;
5731                 END IF;
5732 
5733 
5734         IF (is_debug_exception_on) THEN
5735             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
5736                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
5737         END IF;
5738                 -- store SQL error message on message stack for caller
5739                 OKL_API.SET_MESSAGE (
5740                          p_app_name     => G_APP_NAME
5741                         ,p_msg_name     => G_UNEXPECTED_ERROR
5742                         ,p_token1       => G_SQLCODE_TOKEN
5743                         ,p_token1_value => sqlcode
5744                         ,p_token2       => G_SQLERRM_TOKEN
5745                         ,p_token2_value => sqlerrm);
5746 
5747                 -- notify caller of an UNEXPECTED error
5748                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5749 
5750 END repurchase;
5751 
5752 
5753 -- Start of comments
5754 --
5755 -- Procedure Name       : repurchase_temp
5756 -- Description          : Calculate repurchase quote on header level
5757 -- Business Rules       :
5758 -- Parameters           : quote header record, list of assets
5759 -- Version              : 1.0
5760 -- End of comments
5761 
5762 PROCEDURE repurchase_temp (
5763                 p_qtev_rec      IN qtev_rec_type,
5764                 p_asset_tbl     IN asset_tbl_type,
5765                 x_tqlv_tbl      OUT NOCOPY tqlv_tbl_type,
5766                 x_return_status OUT NOCOPY VARCHAR2) IS
5767 
5768         -- Table to store temp results to be copied to x_tqlv_tbl
5769         l_tqlv_tbl              tqlv_tbl_type;
5770 
5771         -- Rule groups to store repurchase-related rules
5772         l_repurchase_rule_group  CONSTANT VARCHAR2(30) := 'AMREPQ';
5773 
5774         -- Top rule "Calculate Repurchase Quote"
5775         l_repurchase_rule_code   CONSTANT VARCHAR2(30) := 'AMARQC';
5776 
5777         -- Default lines to be created if top rule is not found
5778         l_repurchase_default_tql qlt_tbl_type
5779                 := qlt_tbl_type ('AMBSPR','AMCQFE','AMCQDR');
5780 
5781         l_quote_subtotal        NUMBER := 0;    -- Sum of all quote lines
5782         l_floor_price           NUMBER := 0;    -- Asset floor price
5783         l_asset_cnt             NUMBER;         -- Asset counter
5784 
5785         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
5786         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
5787 
5788     -- get the floor price
5789         CURSOR l_floor_csr (cp_art_id NUMBER) IS
5790                 SELECT  SUM (NVL (a.floor_price, 0))    floor_price
5791                 FROM    okl_asset_returns_b             a
5792                 WHERE   a.id                            = cp_art_id;
5793 
5794   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'repurchase_temp';
5795     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
5796     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
5797     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
5798 BEGIN
5799 
5800    IF (is_debug_procedure_on) THEN
5801        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
5802    END IF;
5803 
5804         -- *******************************************
5805         -- Calculate values of all quote line elements
5806         -- *******************************************
5807 
5808         process_top_rule (
5809                 p_head_rgd_code => l_repurchase_rule_group,
5810                 p_line_rgd_code => l_repurchase_rule_group,
5811                 p_rdf_code      => l_repurchase_rule_code,
5812                 p_qtev_rec      => p_qtev_rec,
5813                 p_cle_id        => NULL,
5814                 p_asset_tbl     => p_asset_tbl,
5815                 px_tqlv_tbl     => l_tqlv_tbl,
5816                 p_default_tql   => l_repurchase_default_tql,
5817                 x_formula_total => l_quote_subtotal,
5818                 x_return_status => l_return_status);
5819 
5820            IF (is_debug_statement_on) THEN
5821                OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
5822                'after call to process_top_rule :'||l_return_status);
5823            END IF;
5824 
5825         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
5826                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
5827                         l_overall_status := l_return_status;
5828                 END IF;
5829         END IF;
5830 
5831         -- ***************************************
5832         -- Check Floor Price againt quote subtotal
5833         -- ***************************************
5834 
5835  --SECHAWLA 24-FEB-03 Bug # 2817025 : Do not need to set this message
5836 /*
5837         l_floor_price := 0;
5838         OPEN    l_floor_csr (p_qtev_rec.art_id);
5839         FETCH   l_floor_csr INTO l_floor_price;
5840         CLOSE   l_floor_csr;
5841 
5842         IF l_floor_price > l_quote_subtotal THEN
5843 
5844                 -- Repurchase Quote amount QUOTE_AMOUNT
5845                 -- is lower than Floor Price FLOOR_PRICE
5846                 okl_am_util_pvt.set_message (
5847                          p_app_name     => G_APP_NAME
5848                         ,p_msg_name     => 'OKL_AM_LOW_REP_QUOTE_AMOUNT'
5849                         ,p_token1       => 'QUOTE_AMOUNT'
5850                         ,p_token1_value => l_quote_subtotal
5851                         ,p_token2       => 'FLOOR_PRICE'
5852                         ,p_token2_value => l_floor_price);
5853 
5854         END IF;
5855 */
5856 
5857         x_tqlv_tbl      := l_tqlv_tbl;
5858         x_return_status := l_overall_status;
5859 
5860    IF (is_debug_procedure_on) THEN
5861        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
5862    END IF;
5863 
5864 EXCEPTION
5865 
5866         WHEN OTHERS THEN
5867 
5868                 -- close open cursors
5869                 IF l_floor_csr%ISOPEN THEN
5870                         CLOSE l_floor_csr;
5871                 END IF;
5872 
5873                 IF (is_debug_exception_on) THEN
5874                         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
5875                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
5876                 END IF;
5877 
5878                 -- store SQL error message on message stack for caller
5879                 OKL_API.SET_MESSAGE (
5880                          p_app_name     => G_APP_NAME
5881                         ,p_msg_name     => G_UNEXPECTED_ERROR
5882                         ,p_token1       => G_SQLCODE_TOKEN
5883                         ,p_token1_value => sqlcode
5884                         ,p_token2       => G_SQLERRM_TOKEN
5885                         ,p_token2_value => sqlerrm);
5886 
5887                 -- notify caller of an UNEXPECTED error
5888                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5889 
5890 END repurchase_temp;
5891 
5892 
5893 -- Start of comments
5894 --
5895 -- Procedure Name       : termination
5896 -- Description          : Calculate termination quote
5897 -- Business Rules       :
5898 -- Parameters           : quote header record, list of assets
5899 -- History          : rmunjulu EDAT Added code to calculate billing adjustments
5900 --                    and anticipated billing
5901 --                  : rmunjulu 3954846 Added code to calculate default quote lines
5902 --                    if no quote line found
5903 -- Version              : 1.0
5904 -- End of comments
5905 
5906 PROCEDURE termination (
5907                 p_qtev_rec      IN qtev_rec_type,
5908                 p_asset_tbl     IN asset_tbl_type,
5909                 x_tqlv_tbl      OUT NOCOPY tqlv_tbl_type,
5910                 x_return_status OUT NOCOPY VARCHAR2) IS
5911 
5912         -- Table to store temp results to be copied to x_tqlv_tbl
5913         l_tqlv_tbl              tqlv_tbl_type;
5914 
5915         -- Rule groups to store termination-related rules
5916         l_head_termin_rule_group        VARCHAR2(30);
5917         l_line_termin_rule_group        VARCHAR2(30);
5918         l_head_pur_opt_rule_group       VARCHAR2(30);
5919         l_line_pur_opt_rule_group       VARCHAR2(30);
5920 
5921         -- Top rule "Calculate Termination Quote"
5922         l_termination_rule_code         VARCHAR2(30);
5923 
5924         -- Default lines to be created if top rule is not found
5925         l_termination_default_tql qlt_tbl_type
5926                 := qlt_tbl_type ('AMBCOC','AMCQDR','AMCMIS');
5927 
5928         -- Sum of all quote lines
5929         l_quote_subtotal        NUMBER := 0;
5930         l_pur_opt_total         NUMBER := 0;
5931 
5932         l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
5933         l_overall_status        VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
5934   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'termination';
5935     is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
5936     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
5937     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
5938 BEGIN
5939    IF (is_debug_procedure_on) THEN
5940        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
5941    END IF;
5942         -- ********************************************************************
5943         -- Termination quote calculation is split
5944         -- by three different classifications:
5945         --  - Early termination or end of term termination (contract maturity).
5946         --    The Early_Termination_YN in quote header determines the value.
5947         --  - Termination Quote could be requested from the program (vendor) or
5948         --    the lease contract (lessee). A quote type indicates where the
5949         --    request is originated. For vendor quotes, a formula from the
5950         --    program linked to lease contract is used.
5951         --  - Termination with purchase or termination without purchase.
5952         --    A quote type indicates if the quote includes purchase.
5953         --    If purchase is included, a separate rule group is used to
5954         --    calculuta purchase option. The program always include purchase.
5955         --  - Calculate on contract header level (contract) or
5956         --    calculate on contract line level (asset).
5957         -- Since conditional rules are not available at this release, these
5958         -- categories are implemented via 16 rule groups. The API chooses
5959         -- two of the following generic rule groups (one for contract, one
5960         -- for asset) and two groups for purchase option (with purchase).
5961         -- ********************************************************************
5962 
5963         IF p_qtev_rec.qtp_code LIKE 'TER_MAN%' THEN
5964                 l_head_termin_rule_group  := 'MANUAL';
5965                 l_line_termin_rule_group  := 'MANUAL';
5966         ELSIF p_qtev_rec.qtp_code LIKE 'TER_RECOURSE%' THEN
5967             IF    p_qtev_rec.early_termination_yn = 'Y' THEN
5968                 l_head_termin_rule_group  := 'AVTEWC';
5969                 l_line_termin_rule_group  := 'AVTEWA';
5970                 l_head_pur_opt_rule_group := 'AVTEOC';
5971                 l_line_pur_opt_rule_group := 'AVTEOA';
5972             ELSE
5973                 l_head_termin_rule_group  := 'AVTFWC';
5974                 l_line_termin_rule_group  := 'AVTFWA';
5975                 l_head_pur_opt_rule_group := 'AVTFOC';
5976                 l_line_pur_opt_rule_group := 'AVTFOA';
5977             END IF;
5978         ELSE
5979             IF    p_qtev_rec.early_termination_yn = 'Y' THEN
5980                 l_head_termin_rule_group  := 'AMTEWC';
5981                 l_line_termin_rule_group  := 'AMTEWA';
5982                 l_head_pur_opt_rule_group := 'AMTEOC';
5983                 l_line_pur_opt_rule_group := 'AMTEOA';
5984             ELSE
5985                 l_head_termin_rule_group  := 'AMTFWC';
5986                 l_line_termin_rule_group  := 'AMTFWA';
5987                 l_head_pur_opt_rule_group := 'AMTFOC';
5988                 l_line_pur_opt_rule_group := 'AMTFOA';
5989             END IF;
5990         END IF;
5991 
5992         -- **************************************************
5993         -- The API derives the Termination Quote Formula
5994         -- from the rule Calculate Termination Quote (AMATQC)
5995         -- for a selected contract rule group.
5996         -- **************************************************
5997 
5998         l_termination_rule_code := 'AMATQC';
5999 
6000 
6001 IF (is_debug_statement_on) THEN
6002        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6003               'Value of l_head_termin_rule_group '|| l_head_termin_rule_group);
6004        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6005               'Value of l_line_termin_rule_group'|| l_line_termin_rule_group);
6006        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6007               'Value of l_head_pur_opt_rule_group'|| l_head_pur_opt_rule_group);
6008        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6009               'Value of l_line_pur_opt_rule_group'|| l_line_pur_opt_rule_group);
6010        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6011               'Value of l_termination_rule_code'|| l_termination_rule_code);
6012 
6013       OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6014               'Value of p_asset_tbl.count'|| p_asset_tbl.count);
6015 
6016      OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6017               'Value of l_tqlv_tbl.count'|| l_tqlv_tbl.count);
6018 
6019 
6020 END IF;
6021         -- *******************************************
6022         -- Calculate values of all quote line elements
6023         -- *******************************************
6024 
6025         process_top_rule (
6026                 p_head_rgd_code => l_head_termin_rule_group,
6027                 p_line_rgd_code => l_line_termin_rule_group,
6028                 p_rdf_code      => l_termination_rule_code,
6029                 p_qtev_rec      => p_qtev_rec,
6030                 p_cle_id        => NULL,
6031                 p_asset_tbl     => p_asset_tbl,
6032                 px_tqlv_tbl     => l_tqlv_tbl,
6033                 p_default_tql   => l_termination_default_tql,
6034                 x_formula_total => l_quote_subtotal,
6035                 x_return_status => l_return_status);
6036 
6037 IF (is_debug_statement_on) THEN
6038        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6039               'after process_top_rule call from trmn Value of l_quote_subtotal '|| l_quote_subtotal);
6040        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6041               'after process_top_rule call from trmn Value of l_return_status'|| l_return_status);
6042        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6043               'after process_top_rule call from trmn Value of l_tqlv_tbl.count'|| l_tqlv_tbl.count);
6044 
6045 END IF;
6046         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6047                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6048                         l_overall_status := l_return_status;
6049                 END IF;
6050         END IF;
6051 
6052         -- *****************************************
6053         -- Calculate values for purchase option only
6054         -- *****************************************
6055 
6056         IF p_qtev_rec.qtp_code IN ('TER_PURCHASE', 'TER_ROLL_PURCHASE')
6057         OR p_qtev_rec.qtp_code = 'TER_RECOURSE' THEN
6058 
6059 
6060             process_operand (
6061                 p_head_rgd_code => l_head_pur_opt_rule_group,
6062                 p_line_rgd_code => l_line_pur_opt_rule_group,
6063                 p_operand       => 'AMBPOC',
6064                 p_qtev_rec      => p_qtev_rec,
6065                 p_cle_id        => NULL,
6066                 p_asset_tbl     => p_asset_tbl,
6067                 p_formula_name  => 'Purchase Option',
6068                 p_check_qlt_yn  => FALSE,
6069                 px_tqlv_tbl     => l_tqlv_tbl,
6070                 x_operand_total => l_pur_opt_total,
6071                 x_return_status => l_return_status);
6072 
6073   IF (is_debug_statement_on) THEN
6074        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6075               'after process_operand call from trmn Value of l_pur_opt_total '|| l_quote_subtotal);
6076        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6077               'after process_operand call from trmn Value of l_return_status'|| l_return_status);
6078        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6079               'after process_operand call from trmn Value of l_tqlv_tbl.count'|| l_tqlv_tbl.count);
6080 
6081 END IF;
6082             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6083                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6084                         l_overall_status := l_return_status;
6085                 END IF;
6086             ELSE
6087 		         l_overall_status := l_return_status; -- sechawla 13-aug-08 bug 7233781
6088 	        END IF;
6089 
6090         END IF;
6091 
6092 
6093     -- rmunjulu EDAT Added call to calculate and store billing adjustment quote lines
6094     calc_bill_adjust (
6095                      p_qtev_rec         =>  p_qtev_rec,
6096              p_asset_tbl        =>  p_asset_tbl,
6097                      px_tqlv_tbl            =>  l_tqlv_tbl,
6098                      x_return_status    =>  l_return_status);
6099 
6100     IF (is_debug_statement_on) THEN
6101         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6102               'after calc_bill_adjust call from trmn Value of l_return_status'|| l_return_status);
6103     END IF;
6104     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6105         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6106                         l_overall_status := l_return_status;
6107                 END IF;
6108     END IF;
6109 
6110     -- rmunjulu EDAT Added call to calculate and store anticipated billing
6111     calc_anticipated_bill (
6112                      p_qtev_rec         =>  p_qtev_rec,
6113                      x_return_status    =>  l_return_status);
6114     IF (is_debug_statement_on) THEN
6115         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6116               'after calc_anticipated_bill call from trmn Value of l_return_status'|| l_return_status);
6117     END IF;
6118     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6119         IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6120                         l_overall_status := l_return_status;
6121                 END IF;
6122     END IF;
6123 
6124     IF (is_debug_statement_on) THEN
6125         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6126               'Value of l_tqlv_tbl.count'|| l_tqlv_tbl.count);
6127     END IF;
6128     -- rmunjulu Added for bug 3954846
6129     -- if no quote lines calculated then create the default quote lines for each asset
6130     IF l_tqlv_tbl.count = 0 THEN
6131 
6132                 -- quote lines are created to be populated manually
6133                 -- +1 is added to count tax line created later
6134                 okl_am_util_pvt.set_message(
6135                          p_app_name     => G_APP_NAME
6136                         ,p_msg_name     => 'OKL_AM_DEFAULT_QUOTE_LINES');
6137 
6138                 create_default_quote_lines (
6139                         p_qtev_rec      => p_qtev_rec,
6140                         p_cle_id        => NULL,
6141                         p_asset_tbl     => p_asset_tbl,
6142                         px_tqlv_tbl     => l_tqlv_tbl,
6143                         p_default_tql   => l_termination_default_tql,
6144                         x_return_status => l_return_status);
6145 
6146     IF (is_debug_statement_on) THEN
6147         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6148               'After call to create_default_quote_lines from termination Value of l_return_status'|| l_return_status);
6149     END IF;
6150             IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6151                 --IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN -- rmunjulu 4741168 removed
6152                         l_overall_status := l_return_status;
6153                 --END IF;
6154                 ELSE -- rmunjulu 4741168 added so that the default lines get calculated without error on screen
6155                      l_overall_status := l_return_status;
6156             END IF;
6157 
6158     END IF;
6159 
6160         x_tqlv_tbl      := l_tqlv_tbl;
6161         x_return_status := l_overall_status;
6162 
6163    IF (is_debug_procedure_on) THEN
6164        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'End(-)');
6165    END IF;
6166 
6167 EXCEPTION
6168 
6169         WHEN OTHERS THEN
6170 
6171          IF (is_debug_exception_on) THEN
6172             OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_EXCEPTION,L_MODULE_NAME, 'EXCEPTION :'||'OTHERS, SQLCODE: '
6173                    || sqlcode || ' , SQLERRM : ' || sqlerrm);
6174         END IF;
6175                 -- store SQL error message on message stack for caller
6176                 OKL_API.SET_MESSAGE (
6177                          p_app_name     => G_APP_NAME
6178                         ,p_msg_name     => G_UNEXPECTED_ERROR
6179                         ,p_token1       => G_SQLCODE_TOKEN
6180                         ,p_token1_value => sqlcode
6181                         ,p_token2       => G_SQLERRM_TOKEN
6182                         ,p_token2_value => sqlerrm);
6183 
6184                 -- notify caller of an UNEXPECTED error
6185                 x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
6186 
6187 END termination;
6188 
6189 
6190 -- Start of comments
6191 --
6192 -- Procedure Name       : generate
6193 -- Description          : The main body of the package that controls the flow.
6194 -- Business Rules       :
6195 -- Parameters           : quote header record, list of assets
6196 -- Version                  : 1.0
6197 -- History          : SECHAWLA 24-FEB-03 Bug # 2817025
6198 --                      Added code to get the system date
6199 --                    SECHAWLA 21-APR-03 Bug 2925120
6200 --                      Stored the asset table in a global variable. This is used later by process_stream_type_operand
6201 --                      procedure to get the asset and quote quantities in order to facilitate unit proration for Unbilled
6202 --                      rec, service and Fee lines.
6203 --                  : rmunjulu 3797384 Added code for passing quote_eff_from date
6204 --                    and quote_id to formula engine
6205 --                  : PAGARG Bug# 3925453: Include new quote type in the call to
6206 --                    termination() procedure
6207 --                  : rmunjulu EDAT 29-Dec-04 did to_char to convert to right format
6208 --                  : PAGARG 12-Apr-05 Bug 4300443 Call bulk insert to insert quote lines
6209 -- End of comments
6210 
6211 PROCEDURE generate (
6212                 p_api_version   IN  NUMBER,
6213                 p_init_msg_list IN  VARCHAR2, -- DEFAULT OKC_API.G_FALSE in specs
6214                 x_msg_count     OUT NOCOPY NUMBER,
6215                 x_msg_data      OUT NOCOPY VARCHAR2,
6216                 x_return_status OUT NOCOPY VARCHAR2,
6217                 p_qtev_rec      IN  qtev_rec_type,
6218                 p_asset_tbl     IN  asset_tbl_type,
6219                 x_tqlv_tbl      OUT NOCOPY tqlv_tbl_type) IS
6220 
6221         l_qtev_rec              qtev_rec_type   := p_qtev_rec;
6222         l_asset_tbl             asset_tbl_type  := p_asset_tbl;
6223         l_tqlv_tbl              tqlv_tbl_type;
6224         lx_tqlv_tbl             tqlv_tbl_type;
6225 
6226         -- cursor to make sure all passed lines exist
6227         -- and have the correct line style
6228         CURSOR  l_line_csr (cp_line_id NUMBER) IS
6229                 SELECT  'Y'
6230                 FROM    okc_k_lines_b           l,
6231                         okc_line_styles_b       s
6232                 WHERE   l.id            = cp_line_id
6233                 AND     s.id            = l.lse_id
6234                 AND     s.lty_code      = G_FIN_ASSET_STYLE;
6235 
6236         l_return_status         VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
6237         l_overall_status        VARCHAR2(1)     := OKL_API.G_RET_STS_SUCCESS;
6238 
6239         l_asset_cnt             NUMBER;
6240         l_invalid_line_yn       BOOLEAN;
6241         l_temp_result           VARCHAR2(1);
6242         l_rule_chr_id           NUMBER;
6243 
6244         l_api_name              CONSTANT VARCHAR2(30)   := 'generate';
6245         l_api_version           CONSTANT NUMBER := G_API_VERSION;
6246         l_msg_count             NUMBER          := G_MISS_NUM;
6247         l_msg_data              VARCHAR2(2000);
6248   L_MODULE_NAME VARCHAR2(500) := G_MODULE_NAME||'generate';
6249       is_debug_exception_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_EXCEPTION);
6250     is_debug_procedure_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_PROCEDURE);
6251     is_debug_statement_on boolean := OKL_DEBUG_PUB.Check_Log_On (l_module_name, G_LEVEL_STATEMENT);
6252 BEGIN
6253 
6254    IF (is_debug_procedure_on) THEN
6255        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,L_MODULE_NAME,'Begin(+)');
6256    END IF;
6257    --Print Input Variables
6258 
6259 
6260    IF (is_debug_statement_on) THEN
6261        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6262               'p_api_version :'||p_api_version);
6263        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6264               'p_init_msg_list :'||p_init_msg_list);
6265        --OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6266        --       'p_qtev_rec :'||p_qtev_rec);
6267        --OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6268        --     'p_asset_tbl :'||p_asset_tbl);
6269    END IF;
6270 
6271 
6272 
6273         -- ***************************************************************
6274         -- Check API version, initialize message list and create savepoint
6275         -- ***************************************************************
6276 
6277 IF (is_debug_statement_on) THEN
6278        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6279               'Before OKL_AM_CALCULATE_QUOTE_PVT.generate calls OKL_API.START_ACTIVITY :'||l_return_status);
6280 END IF;
6281 
6282         l_return_status := OKL_API.START_ACTIVITY (
6283                 l_api_name,
6284                 G_PKG_NAME,
6285                 p_init_msg_list,
6286                 l_api_version,
6287                 p_api_version,
6288                 '_PVT',
6289                 x_return_status);
6290 
6291 IF (is_debug_statement_on) THEN
6292        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6293               'After OKL_AM_CALCULATE_QUOTE_PVT.generate calls OKL_API.START_ACTIVITY :'||l_return_status);
6294 END IF;
6295 
6296         IF l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6297                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6298         ELSIF l_return_status = OKL_API.G_RET_STS_ERROR THEN
6299                 RAISE OKL_API.G_EXCEPTION_ERROR;
6300         END IF;
6301 
6302     -- SECHAWLA 24-FEB-03 Bug # 2817025 : Get sysdate
6303     SELECT sysdate INTO G_SYSDATE from dual;
6304 
6305     --SECHAWLA 21-APR-03 Bug 2925120 : Store the asset table in a global variable
6306     G_ASSET_TBL := p_asset_tbl;
6307 
6308         -- ****************************************************************
6309         -- Make sure all required data is passed
6310         -- 1. Array of assets is passed to the API in both partial and full
6311         --    termination cases, which means all contract assets need to be
6312         --    passed for full termination. It the array is empty, the API
6313         --    will not generate any quote lines and return an error.
6314         -- 2. Quote ID is required to store quote elements
6315         -- 3. Contract ID is required to find contract calculation rules
6316         -- 4. All array elements must store Financial Asset Line ID to get
6317         --    line rules and streams.
6318         -- ****************************************************************
6319 
6320         l_asset_cnt     := l_asset_tbl.FIRST;
6321         l_invalid_line_yn       := FALSE;
6322 
6323         IF l_asset_tbl.COUNT > 0 THEN
6324 
6325             LOOP
6326 
6327                 -- Find invalid lines
6328                 l_temp_result   := 'N';
6329 
6330                 OPEN    l_line_csr (l_asset_tbl(l_asset_cnt).p_asset_id);
6331                 FETCH   l_line_csr INTO l_temp_result;
6332                 CLOSE   l_line_csr;
6333 
6334                 IF l_temp_result = 'N' THEN
6335                         l_invalid_line_yn := TRUE;
6336                 END IF;
6337 
6338                 EXIT WHEN (l_asset_cnt = l_asset_tbl.LAST
6339                         OR l_invalid_line_yn);
6340                 l_asset_cnt := l_asset_tbl.NEXT(l_asset_cnt);
6341 
6342             END LOOP;
6343 
6344         END IF;
6345 
6346         l_rule_chr_id := okl_am_util_pvt.get_rule_chr_id (l_qtev_rec);
6347 
6348         IF l_asset_tbl.COUNT = 0
6349         OR NVL (l_qtev_rec.id,     G_MISS_NUM) = G_MISS_NUM
6350         OR NVL (l_qtev_rec.khr_id, G_MISS_NUM) = G_MISS_NUM
6351         OR NVL (l_rule_chr_id,     G_MISS_NUM) = G_MISS_NUM
6352         OR l_invalid_line_yn THEN
6353 
6354                 -- Please supply required information
6355                 -- in order to calculate a quote
6356                 okl_am_util_pvt.set_message (
6357                         p_app_name      => G_APP_NAME,
6358                         p_msg_name      => 'OKL_AM_NO_PARAMETERS');
6359 
6360                 RAISE OKL_API.G_EXCEPTION_ERROR;
6361 
6362         END IF;
6363 
6364     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- Start ++++++++++++++++
6365 
6366     -- set the operands for formula engine with quote_effective_from date
6367     g_add_params(1).name := 'quote_effective_from_date';
6368     g_add_params(1).value := to_char(p_qtev_rec.date_effective_from,'MM/DD/YYYY');  -- rmunjulu EDAT 29-Dec-04 did to_char to convert to right format
6369 
6370     -- set the operands for formula engine with quote_id
6371     g_add_params(2).name := 'quote_id';
6372     g_add_params(2).value := to_char(p_qtev_rec.id);
6373 
6374     --+++++++++ rmunjulu 3797384 Future Dated Term Qte -- End   ++++++++++++++++
6375 
6376         -- *******************************************
6377         -- Call various procedures based on quote_type
6378         -- *******************************************
6379 
6380         IF l_qtev_rec.qtp_code IN
6381                 ('TER_PURCHASE', 'TER_ROLL_PURCHASE',
6382                  'TER_WO_PURCHASE', 'TER_ROLL_WO_PURCHASE',
6383         --Bug# 3925453: pagarg +++ T and A ++++
6384         --Include new Quote Type to call termination()
6385                  'TER_RELEASE_WO_PURCHASE')
6386         OR l_qtev_rec.qtp_code LIKE 'TER_RECOURSE%'
6387         OR l_qtev_rec.qtp_code LIKE 'TER_MAN%'
6388         THEN
6389 
6390 IF (is_debug_statement_on) THEN
6391        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6392               'Before OKL_AM_CALCULATE_QUOTE_PVT.generate calls termination :'||l_return_status);
6393 END IF;
6394 
6395                 termination (
6396                         p_qtev_rec      => l_qtev_rec,
6397                         p_asset_tbl     => l_asset_tbl,
6398                         x_tqlv_tbl      => l_tqlv_tbl,
6399                         x_return_status => l_return_status);
6400 
6401 IF (is_debug_statement_on) THEN
6402        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6403               'After OKL_AM_CALCULATE_QUOTE_PVT.generate calls termination :'||l_return_status);
6404 END IF;
6405 
6406                 l_overall_status := l_return_status;
6407 
6408         ELSIF l_qtev_rec.qtp_code = 'REP_STANDARD' THEN
6409 
6410 IF (is_debug_statement_on) THEN
6411        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6412               'Before OKL_AM_CALCULATE_QUOTE_PVT.generate calls repurchase_temp :'||l_return_status);
6413 END IF;
6414 
6415                 repurchase_temp (
6416                         p_qtev_rec      => l_qtev_rec,
6417                         p_asset_tbl     => l_asset_tbl,
6418                         x_tqlv_tbl      => l_tqlv_tbl,
6419                         x_return_status => l_return_status);
6420 
6421 IF (is_debug_statement_on) THEN
6422        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6423        'After OKL_AM_CALCULATE_QUOTE_PVT.generate calls repurchase_temp :'||l_return_status);
6424 END IF;
6425 
6426                 l_overall_status := l_return_status;
6427 
6428         ELSE
6429 
6430                 -- Please select a valid Quote Type
6431                 okl_am_util_pvt.set_message (
6432                         p_app_name      => G_APP_NAME,
6433                         p_msg_name      => 'OKL_AM_UNSUPPORTED_QUOTE_TYPE');
6434 
6435                 RAISE OKL_API.G_EXCEPTION_ERROR;
6436 
6437         END IF;
6438 
6439         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6440                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6441                         l_overall_status := l_return_status;
6442                 END IF;
6443         END IF;
6444 	-- bug 5480622--start
6445    	-- ************
6446 	-- Adjust prorated amounts
6447 	-- ************
6448    IF nvl(p_qtev_rec.partial_yn, 'N') = 'N' then	-- only for full termination
6449       IF l_tqlv_tbl.COUNT > 0 THEN
6450 
6451 		adjust_prorated_amounts (
6452 			p_qtev_rec	=> l_qtev_rec,
6453 			p_asset_tbl	=> l_asset_tbl,
6454 			px_tqlv_tbl	=> l_tqlv_tbl,
6455 			x_return_status	=> l_return_status);
6456 
6457       END IF;
6458 
6459 	IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6460 		IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6461 			l_overall_status := l_return_status;
6462 		END IF;
6463 	END IF;
6464    End if;
6465 
6466    -- bug 5480622 -- end
6467 /* rmunjulu SALES_TAX_ENHANCEMENTS move to end after the other quote lines are created
6468         -- ************
6469         -- Estimate tax
6470         -- ************
6471 
6472         IF l_tqlv_tbl.COUNT > 0 THEN
6473 
6474                 estimate_tax (
6475                         p_qtev_rec      => l_qtev_rec,
6476                         p_asset_tbl     => l_asset_tbl,
6477                         px_tqlv_tbl     => l_tqlv_tbl,
6478                         x_return_status => l_return_status);
6479 
6480         END IF;
6481 
6482         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6483                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6484                         l_overall_status := l_return_status;
6485                 END IF;
6486         END IF;
6487 
6488 */
6489         -- *********************************************
6490         -- Create a line for every asset for performance
6491         -- *********************************************
6492 
6493 IF (is_debug_statement_on) THEN
6494        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6495        'Before OKL_AM_CALCULATE_QUOTE_PVT.generate calls contract_lines :'||l_return_status);
6496 END IF;
6497 
6498         contract_lines (
6499                         p_qtev_rec      => l_qtev_rec,
6500                         p_asset_tbl     => l_asset_tbl,
6501                         px_tqlv_tbl     => l_tqlv_tbl,
6502                         x_return_status => l_return_status);
6503 
6504 IF (is_debug_statement_on) THEN
6505        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6506        'After OKL_AM_CALCULATE_QUOTE_PVT.generate calls contract_lines :'||l_return_status);
6507 END IF;
6508 
6509         IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6510                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6511                         l_overall_status := l_return_status;
6512                 END IF;
6513         END IF;
6514 
6515         -- **********************************
6516         -- Save quote lines into the database
6517         -- **********************************
6518     -- rmunjulu Sales_Tax_Enhancements -- Modified to call bulk insert for
6519     -- termination quotes only.
6520         IF l_qtev_rec.qtp_code LIKE 'TER_%' THEN
6521         IF  l_tqlv_tbl.COUNT > 0 THEN
6522 
6523 IF (is_debug_statement_on) THEN
6524        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6525        'Before OKL_AM_CALCULATE_QUOTE_PVT.generate calls OKL_TQL_PVT.insert_row_bulk :'||l_return_status);
6526 END IF;
6527 
6528         -- PAGARG Bug 4300443 Call bulk insert instead of usual insert
6529                 OKL_TQL_PVT.insert_row_bulk(
6530                         p_api_version   => l_api_version,
6531                         p_init_msg_list => OKL_API.G_FALSE,
6532                         x_return_status => l_return_status,
6533                         x_msg_count     => l_msg_count,
6534                         x_msg_data      => l_msg_data,
6535                         p_tqlv_tbl      => l_tqlv_tbl,
6536                         x_tqlv_tbl      => lx_tqlv_tbl);
6537 
6538 IF (is_debug_statement_on) THEN
6539      OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6540      'After OKL_AM_CALCULATE_QUOTE_PVT.generate calls OKL_TQL_PVT.insert_row_bulk :'||l_return_status);
6541 END IF;
6542 
6543                 IF l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6544                         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6545                 ELSIF l_return_status = OKL_API.G_RET_STS_ERROR THEN
6546                         RAISE OKL_API.G_EXCEPTION_ERROR;
6547                 END IF;
6548 
6549         END IF;
6550     ELSE -- Non termination quotes use normal insert
6551         IF  l_tqlv_tbl.COUNT > 0 THEN
6552 
6553 
6554     IF (is_debug_statement_on) THEN
6555         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6556         'Before OKL_AM_CALCULATE_QUOTE_PVT.generate calls OKL_TXL_QUOTE_LINES_PUB.insert_txl_quote_lines :'||l_return_status);
6557     END IF;
6558 
6559                 OKL_TXL_QUOTE_LINES_PUB.insert_txl_quote_lines (
6560                         p_api_version   => l_api_version,
6561                         p_init_msg_list => OKL_API.G_FALSE,
6562                         x_return_status => l_return_status,
6563                         x_msg_count     => l_msg_count,
6564                         x_msg_data      => l_msg_data,
6565                         p_tqlv_tbl      => l_tqlv_tbl,
6566                         x_tqlv_tbl      => lx_tqlv_tbl);
6567 
6568         IF (is_debug_statement_on) THEN
6569         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6570         'After OKL_AM_CALCULATE_QUOTE_PVT.generate calls OKL_TXL_QUOTE_LINES_PUB.insert_txl_quote_lines :'||l_return_status);
6571     END IF;
6572 
6573                 IF l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6574                         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6575                 ELSIF l_return_status = OKL_API.G_RET_STS_ERROR THEN
6576                         RAISE OKL_API.G_EXCEPTION_ERROR;
6577                 END IF;
6578 
6579         END IF;
6580         END IF;
6581 
6582 -- rmunjulu SALES_TAX_ENHANCEMENTS moved call to tax calculation to here
6583 -- Tax calculation is not a hard error so proceed with quote creation even if return status is error
6584         -- ************
6585         -- Estimate tax
6586         -- ************
6587 
6588         IF l_tqlv_tbl.COUNT > 0 THEN
6589 
6590     IF (is_debug_statement_on) THEN
6591         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6592         'Before OKL_AM_CALCULATE_QUOTE_PVT.generate calls estimate_tax:'||l_return_status);
6593     END IF;
6594 
6595                 estimate_tax (
6596                         p_qtev_rec      => l_qtev_rec,
6597                         p_asset_tbl     => l_asset_tbl,
6598                         px_tqlv_tbl     => l_tqlv_tbl,
6599                         x_return_status => l_return_status);
6600 
6601     IF (is_debug_statement_on) THEN
6602         OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,L_MODULE_NAME,
6603         'After OKL_AM_CALCULATE_QUOTE_PVT.generate calls estimate_tax:'||l_return_status);
6604     END IF;
6605 
6606       IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
6607                 IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
6608                         l_overall_status := l_return_status;
6609                 END IF;
6610           END IF;
6611 
6612         END IF;
6613 
6614     -- Tax calculation is not a hard error so proceed with quote creation even if return status is error
6615     -- So do not set overall status with above l_return_status
6616 
6617         -- **************
6618         -- Return results
6619         -- **************
6620 
6621         x_tqlv_tbl      := lx_tqlv_tbl;
6622         x_return_status := l_overall_status;
6623 
6624         OKL_API.END_ACTIVITY (x_msg_count, x_msg_data);
6625 
6626 
6627   IF (is_debug_statement_on) THEN
6628               OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_STATEMENT,'OKL_AM_REMARKET_ASSET_PVT.generate.',
6629                       'ret status at the end.. '||l_return_status);
6630 
6631    END IF;
6632 
6633    IF (is_debug_procedure_on) THEN
6634        OKL_DEBUG_PUB.LOG_DEBUG(G_LEVEL_PROCEDURE,'OKL_AM_REMARKET_ASSET_PVT.generate ','End(-)');
6635    END IF;
6636 
6637 
6638 
6639 
6640 EXCEPTION
6641 
6642         WHEN OKL_API.G_EXCEPTION_ERROR THEN
6643                 x_return_status := OKL_API.HANDLE_EXCEPTIONS
6644                         (
6645                         l_api_name,
6646                         G_PKG_NAME,
6647                         'OKL_API.G_RET_STS_ERROR',
6648                         x_msg_count,
6649                         x_msg_data,
6650                         '_PVT'
6651                         );
6652 
6653         WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
6654                 x_return_status :=OKL_API.HANDLE_EXCEPTIONS
6655                         (
6656                         l_api_name,
6657                         G_PKG_NAME,
6658                         'OKL_API.G_RET_STS_UNEXP_ERROR',
6659                         x_msg_count,
6660                         x_msg_data,
6661                         '_PVT'
6662                         );
6663 
6664         WHEN OTHERS THEN
6665 
6666                 IF l_line_csr%ISOPEN THEN
6667                         CLOSE l_line_csr;
6668                 END IF;
6669 
6670                 x_return_status :=OKL_API.HANDLE_EXCEPTIONS
6671                         (
6672                         l_api_name,
6673                         G_PKG_NAME,
6674                         'OTHERS',
6675                         x_msg_count,
6676                         x_msg_data,
6677                         '_PVT'
6678                         );
6679 
6680 END generate;
6681 
6682 
6683 END OKL_AM_CALCULATE_QUOTE_PVT;