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