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