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