1 PACKAGE BODY OKS_RENEW_UTIL_PVT AS
2 /* $Header: OKSRRUTB.pls 120.17 2008/03/03 05:31:35 cgopinee ship $*/
3
4 FUNCTION CHECK_TEMPLATE_SET_VALIDITY (p_template_set_id IN NUMBER)
5 RETURN VARCHAR2 IS
6
7 CURSOR l_template_set_cur (p_template_set_id IN NUMBER, p_profile IN VARCHAR2) IS
8 SELECT 'Y'
9 FROM OKS_TEMPLATE_SET
10 WHERE id = p_template_set_id
11 AND template_source = p_profile;
12
13 l_profile VARCHAR2(10);
14 l_return VARCHAR2(1) := 'N';
15
16 BEGIN
17 l_profile := NVL(FND_PROFILE.VALUE('OKS_LAYOUT_TEMPLATE_SOURCE'), 'OKC');
18
19 OPEN l_template_set_cur(p_template_set_id, l_profile);
20 FETCH l_template_set_cur INTO l_return;
21
22 IF l_template_set_cur%NOTFOUND THEN
23 l_return := 'N';
24 END IF;
25
26 CLOSE l_template_set_cur;
27
28 RETURN l_return;
29 EXCEPTION
30 WHEN OTHERS THEN
31 OKC_API.SET_MESSAGE(p_app_name => g_app_name,
32 p_msg_name => g_unexpected_error,
33 p_token1 => g_sqlcode_token,
34 p_token1_value => SQLCODE,
35 p_token2 => g_sqlerrm_token,
36 p_token2_value => SQLERRM);
37 END;
38
39
40 --======================================================================
41
42 PROCEDURE UPDATE_RENEWAL_STATUS (
43 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
44 P_CHR_ID IN NUMBER,
45 P_RENEW_STATUS IN VARCHAR2,
46 P_CHR_STATUS IN VARCHAR2
47 ) IS
48
49 l_api_version CONSTANT NUMBER := 1.0;
50 l_init_msg_list CONSTANT VARCHAR2(1) := 'T';
51 l_return_status VARCHAR2(1);
52 l_msg_count NUMBER;
53 l_msg_data VARCHAR2(2000) := NULL;
54
55 l_khdr_rec_in OKS_CONTRACT_HDR_PUB.khrv_rec_type;
56 l_khdr_rec_out OKS_CONTRACT_HDR_PUB.khrv_rec_type;
57
58 l_okc_hdr_rec_in OKC_CONTRACT_PUB.chrv_rec_type;
59 l_okc_hdr_rec_out OKC_CONTRACT_PUB.chrv_rec_type;
60
61 e_error EXCEPTION;
62
63 BEGIN
64
65 l_return_status := OKC_API.G_RET_STS_SUCCESS;
66
67 l_khdr_rec_in.chr_id := p_chr_id;
68 l_khdr_rec_in.renewal_status := p_renew_status;
69
70 oks_contract_hdr_pub.update_header(
71 p_api_version => l_api_version,
72 p_init_msg_list => l_init_msg_list,
73 x_return_status => l_return_status,
74 x_msg_count => l_msg_count,
75 x_msg_data => l_msg_data,
76 p_khrv_rec => l_khdr_rec_in,
77 x_khrv_rec => l_khdr_rec_out,
78 p_validate_yn => 'N'
79 );
80
81 IF NOT l_return_status = OKC_API.G_RET_STS_SUCCESS THEN
82 RAISE e_Error;
83 END IF;
84
85 l_okc_hdr_rec_in.id := p_chr_id;
86 l_okc_hdr_rec_in.sts_code := p_chr_status;
87
88 okc_contract_pub.update_contract_header(
89 p_api_version => l_api_version,
90 p_init_msg_list => l_init_msg_list,
91 x_return_status => l_return_status,
92 x_msg_count => l_msg_count,
93 x_msg_data => l_msg_data,
94 p_restricted_update => 'F',
95 p_chrv_rec => l_okc_hdr_rec_in,
96 x_chrv_rec => l_okc_hdr_rec_out
97 );
98
99 IF NOT l_return_status = OKC_API.G_RET_STS_SUCCESS THEN
100 RAISE e_Error;
101 END IF;
102
103 EXCEPTION
104 WHEN E_Error THEN
105 x_Return_status := l_Return_status;
106 WHEN OTHERS THEN
107 -- store SQL error message on message stack for caller
108 OKC_API.SET_MESSAGE(
109 p_app_name => g_app_name,
110 p_msg_name => g_unexpected_error,
111 p_token1 => g_sqlcode_token,
112 p_token1_value => SQLCODE,
113 p_token2 => g_sqlerrm_token,
114 p_token2_value => SQLERRM
115 );
116
117 -- notify caller of an UNEXPECTED error
118 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
119 END;
120
121 PROCEDURE get_payment_terms (
122 p_chr_id IN NUMBER,
123 p_party_id IN NUMBER,
124 p_org_id IN NUMBER,
125 p_effective_date IN DATE,
126 x_pay_term_id1 OUT NOCOPY VARCHAR2,
127 x_pay_term_id2 OUT NOCOPY VARCHAR2,
128 x_msg_count OUT NOCOPY NUMBER,
129 x_msg_data OUT NOCOPY VARCHAR2,
130 x_return_status OUT NOCOPY VARCHAR2) IS
131
132 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
133 l_payment_terms_id1 VARCHAR2(40);
134 l_payment_terms_id2 VARCHAR2(40);
135 l_payment_term_flag VARCHAR2(1) := 'N';
136 l_msg_count NUMBER;
137 l_msg_data VARCHAR2(2000);
138 l_procedure_name VARCHAR2(80);
139 l_party NUMBER;
140 l_org NUMBER;
141
142 CURSOR l_party_cur IS
143 SELECT object1_id1 FROM OKC_K_PARTY_ROLES_V
144 WHERE dnz_chr_id = p_chr_id
145 AND cle_id IS NULL
146 AND jtot_object1_code = 'OKX_PARTY'
147 AND rle_code = 'CUSTOMER';
148
149 CURSOR l_org_cur IS
150 SELECT authoring_org_id
151 FROM OKC_K_HEADERS_V
152 WHERE id = p_chr_id;
153
154 -- Cursor to fetch values defined at Party/Org level in Global Defaults.
155 CURSOR l_party_org_level_cur(p_id1 IN VARCHAR2,
156 p_id2 IN VARCHAR2,
157 p_object_code IN VARCHAR2,
158 p_date IN DATE
159 ) IS
160 SELECT payment_terms_id1, payment_terms_id2
161 FROM OKS_K_DEFAULTS_V
162 WHERE SEGMENT_ID1 = p_id1
163 AND SEGMENT_ID2 = p_id2
164 AND JTOT_OBJECT_CODE = p_object_code
165 AND CDT_TYPE = 'SDT'
166 AND nvl(p_date, SYSDATE) BETWEEN
167 nvl(START_DATE, SYSDATE) AND nvl(END_DATE, SYSDATE);
168
169 -- Cursor to fetch renewal rules defined at Global level in Global Defaults.
170 CURSOR l_global_level_cur IS
171 SELECT payment_terms_id1, payment_terms_id2
172 FROM OKS_K_DEFAULTS_V
173 WHERE cdt_type = 'MDT'
174 AND segment_id1 IS NULL
175 AND segment_id2 IS NULL
176 AND jtot_object_code IS NULL;
177
178 BEGIN
179
180 IF (p_chr_id IS NULL OR p_chr_id = FND_API.G_MISS_NUM ) AND
181 (
182 (p_party_id IS NULL OR p_party_id = FND_API.G_MISS_NUM ) OR
183 (p_org_id IS NULL OR p_org_id = FND_API.G_MISS_NUM)
184 ) THEN
185
186 IF p_chr_id IS NULL OR p_chr_id = FND_API.G_MISS_NUM THEN
187 OKC_API.SET_MESSAGE(G_APP_NAME, G_REQUIRED_PARAM,
188 'TOKEN1', 'CHR_ID',
189 'TOKEN2', 'GET_PAYMENT_TERMS');
190 END IF;
191
192 IF p_party_id IS NULL OR p_party_id = FND_API.G_MISS_NUM THEN
193 OKC_API.SET_MESSAGE(G_APP_NAME, G_REQUIRED_PARAM,
194 'TOKEN1', 'PARTY_ID',
195 'TOKEN2', 'GET_PAYMENT_TERMS');
196 END IF;
197
198 IF p_org_id IS NULL OR p_org_id = FND_API.G_MISS_NUM THEN
199 OKC_API.SET_MESSAGE(G_APP_NAME, G_REQUIRED_PARAM,
200 'TOKEN1', 'ORG_ID',
201 'TOKEN2', 'GET_PAYMENT_TERMS');
202 END IF;
203
204 l_Return_Status := OKC_API.G_RET_STS_ERROR;
205 RAISE G_EXCEPTION_HALT_VALIDATION;
206
207 END IF;
208
209 -- Check for party_id, if not present get party_id
210 IF p_party_id IS NULL OR p_party_id = FND_API.G_MISS_NUM THEN
211 OPEN l_party_cur;
212 FETCH l_party_cur INTO l_party;
213 CLOSE l_party_cur;
214 ELSE
215 l_party := p_party_id;
216 END IF;
217
218 -- Fetch renewal rules for this party as there are set in
219 -- Global Defaults
220 IF l_party IS NOT NULL THEN
221 OPEN l_party_org_level_cur(to_char(l_party), '#', 'OKX_PARTY', p_effective_date);
222 FETCH l_party_org_level_cur INTO l_payment_terms_id1, l_payment_terms_id2;
223 CLOSE l_party_org_level_cur;
224
225 IF l_payment_terms_id1 IS NOT NULL AND l_payment_terms_id2 IS NOT NULL THEN
226 l_payment_term_flag := 'Y';
227 END IF;
228 END IF;
229
230 IF l_payment_term_flag = 'N' THEN
231
232 -- Check for org_id, if not present get Org_id
233 IF p_org_id IS NULL OR p_org_id = FND_API.G_MISS_NUM THEN
234 OPEN l_org_cur;
235 FETCH l_org_cur INTO l_org;
236 CLOSE l_org_cur;
237 ELSE
238 l_org := p_org_id;
239 END IF;
240
241 -- Fetch payment terms for this org as set in Global Defaults
242 IF l_org IS NOT NULL THEN
243 OPEN l_party_org_level_cur(to_char(l_org), '#', 'OKX_OPERUNIT', p_effective_date);
244 FETCH l_party_org_level_cur INTO l_payment_terms_id1, l_payment_terms_id2;
245 CLOSE l_party_org_level_cur;
246
247 IF l_payment_terms_id1 IS NOT NULL AND l_payment_terms_id2 IS NOT NULL THEN
248 l_payment_term_flag := 'Y';
249 END IF;
250 END IF;
251 END IF;
252
253 IF l_payment_term_flag = 'N' THEN
254
255 -- Fetch payment terms as set at global level in Global Defaults
256 OPEN l_global_level_cur;
257 FETCH l_global_level_cur INTO l_payment_terms_id1, l_payment_terms_id2;
258
259 -- As there should be always values under globals in
260 -- global defaults setup, if nothing is found, raise error
261 IF l_global_level_cur%NOTFOUND THEN
262 CLOSE l_global_level_cur;
263 OKC_API.set_message(G_APP_NAME, 'OKS_GLOBAL_DEFAULTS_NOT_FOUND');
264 l_return_status := OKC_API.G_RET_STS_ERROR;
265 RAISE G_EXCEPTION_HALT_VALIDATION;
266 END IF;
267 CLOSE l_global_level_cur;
268 END IF;
269
270 -- Populate the out parameters with the renewal fields
271 x_pay_term_id1 := l_payment_terms_id1;
272 x_pay_term_id2 := l_payment_terms_id2;
273 x_return_status := l_return_status;
274
275 EXCEPTION
276 WHEN G_EXCEPTION_HALT_VALIDATION THEN
277 x_return_status := l_return_status;
278 WHEN OTHERS THEN
279 -- store SQL error message on message stack for caller
280 OKC_API.SET_MESSAGE(p_app_name => g_app_name,
281 p_msg_name => g_unexpected_error,
282 p_token1 => g_sqlcode_token,
283 p_token1_value => SQLCODE,
284 p_token2 => g_sqlerrm_token,
285 p_token2_value => SQLERRM);
286
287 -- notify caller of an UNEXPECTED error
288 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
289 END get_payment_terms;
290
291 PROCEDURE Can_Update_Contract(
292 p_chr_id IN NUMBER,
293 x_can_update_yn OUT NOCOPY VARCHAR2,
294 x_can_submit_yn OUT NOCOPY VARCHAR2,
295 x_msg_count OUT NOCOPY NUMBER,
296 x_msg_data OUT NOCOPY VARCHAR2,
297 x_return_status OUT NOCOPY VARCHAR2
298 ) IS
299
300 BEGIN
301 x_return_status := OKC_API.G_RET_STS_SUCCESS;
302 x_can_update_yn := 'Y';
303 x_can_submit_yn := 'Y';
304 END Can_Update_Contract;
305
306 -------------------------------------------------------------------------------
307 /* This procedure gets the values of period_type,period_start and price_uom from GCD
308 if contract header id is null else gets the values from contract header record.
309 */
310 PROCEDURE get_period_defaults(p_hdr_id IN NUMBER DEFAULT NULL,
311 p_org_id IN VARCHAR2 DEFAULT NULL,
312 x_period_type OUT NOCOPY VARCHAR2,
313 x_period_start OUT NOCOPY VARCHAR2,
314 x_price_uom OUT NOCOPY VARCHAR2,
315 x_return_status OUT NOCOPY VARCHAR2)
316 IS
317
318 CURSOR get_hdr_period_val(p_hdr_id IN NUMBER)
319 IS
320 SELECT period_type, period_start, price_uom
321 FROM oks_k_headers_b
322 WHERE chr_id = p_hdr_id;
323
324 CURSOR get_gcd_org_period_val (p_org_id IN VARCHAR2)
325 IS
326 SELECT period_type, period_start, price_uom
327 FROM oks_k_defaults
328 WHERE cdt_type = 'SDT'
329 AND segment_id1 = p_org_id;
330
331 CURSOR get_gcd_glob_period_val
332 IS
333 SELECT period_type, period_start, price_uom
334 FROM oks_k_defaults
335 WHERE cdt_type = 'MDT'
336 AND segment_id1 IS NULL;
337
338 l_period_type oks_k_defaults.period_type%TYPE;
339 l_period_start oks_k_defaults.period_start%TYPE;
340 l_price_uom oks_k_defaults.price_uom%TYPE;
341
342 BEGIN
343 x_return_status := OKC_API.G_RET_STS_SUCCESS;
344 IF p_hdr_id IS NOT NULL
345 THEN
346 OPEN get_hdr_period_val(p_hdr_id);
347 FETCH get_hdr_period_val INTO l_period_type, l_period_start, l_price_uom;
348 CLOSE get_hdr_period_val;
349 ELSE
350 -- If hdr_id is null, then values are taken from GCD
351 IF p_org_id IS NOT NULL
352 THEN
353 OPEN get_gcd_org_period_val(p_org_id);
354 FETCH get_gcd_org_period_val INTO l_period_type, l_period_start, l_price_uom;
355 CLOSE get_gcd_org_period_val;
356
357 --anjkumar PP CR002, both period type and period start should be defined
358 --at any level for it to be considered
359
360 --IF (l_period_type IS NULL) AND (l_period_start IS NULL)
361 IF (l_period_type IS NULL) OR (l_period_start IS NULL)
362 THEN
363 OPEN get_gcd_glob_period_val;
364 FETCH get_gcd_glob_period_val INTO l_period_type, l_period_start, l_price_uom;
365 CLOSE get_gcd_glob_period_val;
366 END IF;
367 ELSE
368 OPEN get_gcd_glob_period_val;
369 FETCH get_gcd_glob_period_val INTO l_period_type, l_period_start, l_price_uom;
370 CLOSE get_gcd_glob_period_val;
371 END IF;
372 END IF;
373
374 --if both period type and period start have to be not null to consider it
375 IF (l_period_type IS NULL) OR (l_period_start IS NULL) THEN
376 x_period_type := NULL;
377 x_period_start := NULL;
378 x_price_uom := NULL;
379 ELSE
380 x_period_type := l_period_type;
381 x_period_start := l_period_start;
382 x_price_uom := l_price_uom;
383 END IF;
384
385 EXCEPTION
386 WHEN OTHERS THEN
387 x_return_status := OKC_API.G_RET_STS_ERROR;
388
389 END get_period_defaults;
390
391 /*
392 -------------------------------------------------------------------------
393 rewritten R12 traversal api that fetches all the rules from gcd
394 following the hierarchy - input->contract->party->org->global
395
396 it recoginzes the new attributes introduced forRr12, groups
397 interdependent attributes from the same level and improves
398 performance and logging.
399 -------------------------------------------------------------------------
400 */
401 PROCEDURE get_renew_rules(x_return_status OUT NOCOPY VARCHAR2,
402 p_api_version IN NUMBER DEFAULT 1,
403 p_init_msg_list IN VARCHAR2 DEFAULT FND_API.g_false,
404 p_chr_id IN NUMBER,
405 p_party_id IN NUMBER,
406 p_org_id IN NUMBER,
407 p_date IN DATE DEFAULT SYSDATE,
408 p_rnrl_rec IN rnrl_rec_type,
409 x_rnrl_rec OUT NOCOPY rnrl_rec_type,
410 x_msg_count OUT NOCOPY NUMBER,
411 x_msg_data OUT NOCOPY VARCHAR2)
412 IS
413
414 TYPE rnrl_rec_tbl_type IS TABLE OF rnrl_rec_type INDEX BY BINARY_INTEGER;
415
416 l_api_name CONSTANT VARCHAR2(30) := 'GET_RENEW_RULES';
417 l_api_version CONSTANT NUMBER := 1;
418 l_mod_name VARCHAR2(256) := lower(G_OKS_APP_NAME) || '.plsql.' || g_pkg_name || '.' || l_api_name;
419
420 l_party_id NUMBER;
421 l_org_id NUMBER;
422 l_k_org_id NUMBER; --to store the contract org id, if p_org_id not passed
423
424 lk_rnrl_rec rnrl_rec_type;
425 l_rules_tbl_tmp rnrl_rec_tbl_type; -- temp table to store output of bulk collect
426 l_rules_tbl rnrl_rec_tbl_type; -- table to store all the rules in the correct order -> input, contract, party, org, global
427
428 l_effective_base_currency VARCHAR2(30);
429 l_error_text VARCHAR2(512);
430
431 CURSOR c_k_party(cp_chr_id IN NUMBER) IS
432 SELECT object1_id1 FROM okc_k_party_roles_b
433 WHERE dnz_chr_id = cp_chr_id
434 AND cle_id IS NULL
435 AND jtot_object1_code = 'OKX_PARTY'
436 AND rle_code IN ('CUSTOMER', 'SUBSCRIBER');
437
438 CURSOR c_k_rules(cp_chr_id IN NUMBER) IS
439 SELECT a.renewal_type_code,
440 b.renewal_pricing_type, b.renewal_markup_percent, b.renewal_price_list,
441 b.renewal_po_required,
442 b.renewal_est_rev_percent, b.renewal_est_rev_duration, b.renewal_est_rev_period,
443 b.billing_profile_id, b.renewal_grace_duration, b.renewal_grace_period,
444 a.currency_code, a.approval_type, nvl(a.org_id, a.authoring_org_id)
445 FROM okc_k_headers_all_b a, oks_k_headers_b b
446 WHERE a.id = cp_chr_id AND a.id = b.chr_id;
447
448 --cp_org_id the org for which the rules need to be obtained, can be null
449 --cp_party_id the party for which the rules need to be obtained, can be null
450 --cp_date the date on which the rule should be effective, should not be null
451 --cursor will always return 1 record and at max return 3 records
452 CURSOR c_cgd_rules(cp_org_id IN NUMBER, cp_party_id IN NUMBER, cp_date IN DATE) IS
453 SELECT
454 cdt_type,
455 jtot_object_code,
456 renewal_type,
457 renewal_pricing_type,
458 markup_percent,
459 price_list_id1,
460 price_list_id2,
461 pdf_id,
462 qcl_id,
463 cgp_new_id,
464 cgp_renew_id,
465 po_required_yn,
466 credit_amount,
467 rle_code,
468 revenue_estimated_percent,
469 revenue_estimated_duration,
470 revenue_estimated_period,
471 NULL, --function_name,
472 NULL, -- salesrep_name
473 template_set_id,
474 base_currency, --threshold_currency, col obsolete
475 threshold_amount,
476 email_address,
477 billing_profile_id,
478 user_id,
479 threshold_enabled_yn,
480 grace_period,
481 grace_duration,
482 payment_terms_id1,
483 payment_terms_id2,
484 base_currency, --evergreen_threshold_curr, col obsolete
485 evergreen_threshold_amt,
486 payment_method,
487 base_currency, --payment_threshold_curr, col obsolete
488 payment_threshold_amt,
489 interface_price_break,
490 base_currency,
491 approval_type,
492 evergreen_approval_type,
493 online_approval_type,
494 purchase_order_flag,
495 credit_card_flag,
496 wire_flag,
497 commitment_number_flag,
498 check_flag,
499 period_type,
500 period_start,
501 price_uom,
502 template_language
503 FROM oks_k_defaults
504 WHERE
505 (cdt_type = 'MDT' AND jtot_object_code IS NULL AND segment_id1 IS NULL AND segment_id2 IS NULL)
506 OR
507 (cdt_type = 'SDT' AND jtot_object_code = 'OKX_OPERUNIT' AND segment_id1 = to_char(cp_org_id) AND segment_id2 = '#'
508 AND trunc(cp_date) BETWEEN start_date AND nvl(end_date, greatest(start_date, trunc(cp_date))))
509 OR
510 (cdt_type = 'SDT' AND jtot_object_code = 'OKX_PARTY' AND segment_id1 = to_char(cp_party_id) AND segment_id2 = '#'
511 AND trunc(cp_date) BETWEEN start_date AND nvl(end_date, greatest(start_date, trunc(cp_date))));
512
513
514 --this procedure sets the interdependent and dependent attributes.
515 --using the hierarchy - input->contract->party->org->global. for
516 --interdependent attributes all rules are fetched from the same level
517 --for e.g., if grace period is set at party level
518 --we should get the grace duration from the same level and not the org level
519 --even if party level grace duration is null
520 PROCEDURE set_attributes
521 IS
522 BEGIN
523 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
524 IF (FND_LOG.test(FND_LOG.level_procedure, l_mod_name)) THEN
525 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.set_attributes.begin', 'begin');
526 END IF;
527 END IF;
528
529 -- assume that l_rules_tbl(0) has input rules, l_rules_tbl(1) has contract rules, l_rules_tbl(2) has party rules etc
530 FOR i IN l_rules_tbl.first..l_rules_tbl.last LOOP
531
532 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
533 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
534 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.set_attributes.for_loop', 'i=' || i);
535 END IF;
536 END IF;
537
538 --first set the interdependent attributes
539 --renewal type and approval type
540 IF (x_rnrl_rec.renewal_type IS NULL) THEN
541 x_rnrl_rec.renewal_type := l_rules_tbl(i).renewal_type;
542 IF (x_rnrl_rec.renewal_type IS NOT NULL) THEN
543 x_rnrl_rec.approval_type := l_rules_tbl(i).approval_type;
544 END IF;
545 END IF;
546
547 --renewal pricing_type, markup percent, price list
548 IF (x_rnrl_rec.renewal_pricing_type IS NULL) THEN
549 x_rnrl_rec.renewal_pricing_type := l_rules_tbl(i).renewal_pricing_type;
550 IF (x_rnrl_rec.renewal_pricing_type IS NOT NULL) THEN
551 x_rnrl_rec.markup_percent := l_rules_tbl(i).markup_percent;
552 x_rnrl_rec.price_list_id1 := l_rules_tbl(i).price_list_id1;
553 x_rnrl_rec.price_list_id2 := l_rules_tbl(i).price_list_id2;
554 END IF;
555 END IF;
556
557 --revenue estimated percent, duration and period
558 IF (x_rnrl_rec.revenue_estimated_percent IS NULL) THEN
559 x_rnrl_rec.revenue_estimated_percent := l_rules_tbl(i).revenue_estimated_percent;
560 IF (x_rnrl_rec.revenue_estimated_percent IS NOT NULL) THEN
561 x_rnrl_rec.revenue_estimated_duration := l_rules_tbl(i).revenue_estimated_duration;
562 x_rnrl_rec.revenue_estimated_period := l_rules_tbl(i).revenue_estimated_period;
563 END IF;
564 END IF;
565
566 --grace period and duration
567 IF (x_rnrl_rec.grace_period IS NULL) THEN
568 x_rnrl_rec.grace_period := l_rules_tbl(i).grace_period;
569 IF (x_rnrl_rec.grace_period IS NOT NULL) THEN
570 x_rnrl_rec.grace_duration := l_rules_tbl(i).grace_duration;
571 END IF;
572 END IF;
573
574 --partial period type, start and uom
575 IF (x_rnrl_rec.period_type IS NULL) THEN
576 x_rnrl_rec.period_type := l_rules_tbl(i).period_type;
577 IF (x_rnrl_rec.period_type IS NOT NULL) THEN
578 x_rnrl_rec.period_start := l_rules_tbl(i).period_start;
579 x_rnrl_rec.price_uom := l_rules_tbl(i).price_uom;
580
581 --anjkumar both period type and period start have to be not null, otherwise we should ignore
582 --the values at this level, Partial Period Change request CR 002
583 IF (x_rnrl_rec.period_start IS NULL) THEN
584 x_rnrl_rec.period_type := NULL;
585 x_rnrl_rec.period_start := NULL;
586 x_rnrl_rec.price_uom := NULL;
587 END IF;
588
589 END IF;
590 END IF;
591
592 --payment terms id1 and id2
593 IF (x_rnrl_rec.payment_terms_id1 IS NULL) THEN
594 x_rnrl_rec.payment_terms_id1 := l_rules_tbl(i).payment_terms_id1;
595 IF (x_rnrl_rec.payment_terms_id1 IS NOT NULL) THEN
596 x_rnrl_rec.payment_terms_id2 := l_rules_tbl(i).payment_terms_id2;
597 END IF;
598 END IF;
599
600 --helpdesk user id and email
601 IF (x_rnrl_rec.user_id IS NULL) THEN
602 x_rnrl_rec.user_id := l_rules_tbl(i).user_id;
603 IF (x_rnrl_rec.user_id IS NOT NULL) THEN
604 x_rnrl_rec.email_address := l_rules_tbl(i).email_address;
605 END IF;
606 END IF;
607
608 --get the base currency level
609 IF (x_rnrl_rec.base_currency IS NULL) THEN
610 x_rnrl_rec.base_currency := l_rules_tbl(i).base_currency;
611 IF (x_rnrl_rec.base_currency IS NOT NULL) THEN
612 l_effective_base_currency := x_rnrl_rec.base_currency;
613 END IF;
614 END IF;
615
616 --set the currency dependent attributes
617 --special handling for curremcy dependent attributes
618 --for e.g., if contract currency is usd, and party level currency is eur and org level currency
619 --is usd, we should get the threshold amounts from org level and not party level
620
621 --evergreen threshold amt, evergreen threshold curr, evergreen approval type
622 IF (x_rnrl_rec.evergreen_threshold_amt IS NULL) THEN
623
624 IF(l_rules_tbl(i).evergreen_threshold_amt IS NOT NULL AND
625 nvl(l_rules_tbl(i).base_currency, 'X') = l_effective_base_currency) THEN
626 x_rnrl_rec.evergreen_threshold_amt := l_rules_tbl(i).evergreen_threshold_amt;
627 x_rnrl_rec.evergreen_threshold_curr := l_rules_tbl(i).base_currency;
628 x_rnrl_rec.evergreen_approval_type := l_rules_tbl(i).evergreen_approval_type;
629 END IF;
630
631 END IF;
632
633 --online threshold amt, online threshold curr, online approval type
634 IF (x_rnrl_rec.threshold_amount IS NULL) THEN
635
636 IF(l_rules_tbl(i).threshold_amount IS NOT NULL AND
637 nvl(l_rules_tbl(i).base_currency, 'X') = l_effective_base_currency) THEN
638 x_rnrl_rec.threshold_amount := l_rules_tbl(i).threshold_amount;
639 x_rnrl_rec.threshold_currency := l_rules_tbl(i).base_currency;
640 x_rnrl_rec.online_approval_type := l_rules_tbl(i).online_approval_type;
641 END IF;
642
643 END IF;
644
645 --payment threshold amt, paymnet threshold curr
646 IF (x_rnrl_rec.payment_threshold_amt IS NULL) THEN
647
648 IF(l_rules_tbl(i).payment_threshold_amt IS NOT NULL AND
649 nvl(l_rules_tbl(i).base_currency, 'X') = l_effective_base_currency) THEN
650 x_rnrl_rec.payment_threshold_amt := l_rules_tbl(i).payment_threshold_amt;
651 x_rnrl_rec.payment_threshold_curr := l_rules_tbl(i).base_currency;
652 END IF;
653
654 END IF;
655
656 --set the remaining independent attributes
657 IF (x_rnrl_rec.pdf_id IS NULL) THEN
658 x_rnrl_rec.pdf_id := l_rules_tbl(i).pdf_id;
659 END IF;
660
661 IF (x_rnrl_rec.qcl_id IS NULL) THEN
662 x_rnrl_rec.qcl_id := l_rules_tbl(i).qcl_id;
663 END IF;
664
665 IF (x_rnrl_rec.cgp_new_id IS NULL) THEN
666 x_rnrl_rec.cgp_new_id := l_rules_tbl(i).cgp_new_id;
667 END IF;
668
669 IF (x_rnrl_rec.cgp_renew_id IS NULL) THEN
670 x_rnrl_rec.cgp_renew_id := l_rules_tbl(i).cgp_renew_id;
671 END IF;
672
673 IF (x_rnrl_rec.po_required_yn IS NULL) THEN
674 x_rnrl_rec.po_required_yn := l_rules_tbl(i).po_required_yn;
675 END IF;
676
677 IF (x_rnrl_rec.credit_amount IS NULL) THEN
678 x_rnrl_rec.credit_amount := l_rules_tbl(i).credit_amount;
679 END IF;
680
681 IF (x_rnrl_rec.rle_code IS NULL) THEN
682 x_rnrl_rec.rle_code := l_rules_tbl(i).rle_code;
683 END IF;
684
685 IF (x_rnrl_rec.template_set_id IS NULL) THEN
686 x_rnrl_rec.template_set_id := l_rules_tbl(i).template_set_id;
687 END IF;
688
689 IF (x_rnrl_rec.billing_profile_id IS NULL) THEN
690 x_rnrl_rec.billing_profile_id := l_rules_tbl(i).billing_profile_id;
691 END IF;
692
693 IF (x_rnrl_rec.threshold_enabled_yn IS NULL) THEN
694 x_rnrl_rec.threshold_enabled_yn := l_rules_tbl(i).threshold_enabled_yn;
695 END IF;
696
697 IF (x_rnrl_rec.payment_method IS NULL) THEN
698 x_rnrl_rec.payment_method := l_rules_tbl(i).payment_method;
699 END IF;
700
701 IF (x_rnrl_rec.interface_price_break IS NULL) THEN
702 x_rnrl_rec.interface_price_break := l_rules_tbl(i).interface_price_break;
703 END IF;
704
705 IF (x_rnrl_rec.template_language IS NULL) THEN
706 x_rnrl_rec.template_language := l_rules_tbl(i).template_language;
707 END IF;
708
709 IF (x_rnrl_rec.purchase_order_flag IS NULL) THEN
710 x_rnrl_rec.purchase_order_flag := l_rules_tbl(i).purchase_order_flag;
711 END IF;
712
713 IF (x_rnrl_rec.credit_card_flag IS NULL) THEN
714 x_rnrl_rec.credit_card_flag := l_rules_tbl(i).credit_card_flag;
715 END IF;
716
717 IF (x_rnrl_rec.wire_flag IS NULL) THEN
718 x_rnrl_rec.wire_flag := l_rules_tbl(i).wire_flag;
719 END IF;
720
721 IF (x_rnrl_rec.wire_flag IS NULL) THEN
722 x_rnrl_rec.wire_flag := l_rules_tbl(i).wire_flag;
723 END IF;
724
725 IF (x_rnrl_rec.commitment_number_flag IS NULL) THEN
726 x_rnrl_rec.commitment_number_flag := l_rules_tbl(i).commitment_number_flag;
727 END IF;
728
729 IF (x_rnrl_rec.check_flag IS NULL) THEN
730 x_rnrl_rec.check_flag := l_rules_tbl(i).check_flag;
731 END IF;
732
733 IF (x_rnrl_rec.function_name IS NULL) THEN
734 x_rnrl_rec.function_name := l_rules_tbl(i).function_name;
735 END IF;
736
737 IF (x_rnrl_rec.salesrep_name IS NULL) THEN
738 x_rnrl_rec.salesrep_name := l_rules_tbl(i).salesrep_name;
739 END IF;
740
741 END LOOP;
742
743 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
744 IF (FND_LOG.test(FND_LOG.level_procedure, l_mod_name)) THEN
745 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.set_attributes.end', 'end');
746 END IF;
747 END IF;
748
749 END set_attributes;
750
751 BEGIN
752 --main procedure begins here
753
754 --log key input parameters
755 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
756 IF (FND_LOG.test(FND_LOG.level_procedure, l_mod_name)) THEN
757 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.begin', 'p_chr_id=' || p_chr_id ||' ,p_party_id='|| p_party_id ||' ,p_org_id='|| p_org_id || ',p_date=' || p_date);
758 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.input_rules', 'see following log');
759 log_rules(l_mod_name || '.input_rules', p_rnrl_rec);
760 END IF;
761 END IF;
762
763 --standard api initilization and checks
764 IF NOT FND_API.compatible_api_call (l_api_version, p_api_version, l_api_name, G_PKG_NAME)THEN
765 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
766 END IF;
767 IF FND_API.to_boolean(p_init_msg_list ) THEN
768 FND_MSG_PUB.initialize;
769 END IF;
770 x_return_status := FND_API.G_RET_STS_SUCCESS;
771
772 --basic parameter validation
773 IF ((p_chr_id IS NULL OR p_chr_id = FND_API.G_MISS_NUM) AND
774 (p_party_id IS NULL OR p_party_id = FND_API.G_MISS_NUM) AND
775 (p_org_id IS NULL OR p_org_id = FND_API.G_MISS_NUM)) THEN
776
777 FND_MESSAGE.set_name(G_OKS_APP_NAME, 'OKS_REN_RUL_INV_ARG');
778 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
779 FND_LOG.message(FND_LOG.level_error, l_mod_name || '.basic_validation', FALSE);
780 END IF;
781 FND_MSG_PUB.ADD;
782
783 RAISE FND_API.g_exc_error;
784 END IF;
785
786 --initialize the rules table
787 l_rules_tbl(G_INPUT_LEVEL) := p_rnrl_rec;
788 l_rules_tbl(G_CONTRACT_LEVEL) := NULL;
789 l_rules_tbl(G_PARTY_LEVEL) := NULL;
790 l_rules_tbl(G_ORG_LEVEL) := NULL;
791 l_rules_tbl(G_GLOBAL_LEVEL) := NULL;
792
793 --get the party id and org id from the input or from the contract
794 l_party_id := p_party_id;
795 l_org_id := p_org_id;
796
797
798 --get the contract party, org and the contract level rules if p_chr_id is passed
799 IF(p_chr_id IS NOT NULL) THEN
800
801 -- if contract party id is not passed get it from okc_k_party_roles_b
802 IF (l_party_id IS NULL) THEN
803 OPEN c_k_party(p_chr_id);
804 FETCH c_k_party INTO l_party_id;
805 CLOSE c_k_party;
806
807 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
808 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
809 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.get_party', 'l_party_id=' || l_party_id);
810 END IF;
811 END IF;
812
813 END IF;
814
815 --get the contract attributes from okc_k_headers_all_b and oks_k_headers_b
816 --also get the contract org id, use this if p_org_id is not passed
817 OPEN c_k_rules(p_chr_id);
818 FETCH c_k_rules INTO lk_rnrl_rec.renewal_type,
819 lk_rnrl_rec.renewal_pricing_type, lk_rnrl_rec.markup_percent, lk_rnrl_rec.price_list_id1,
820 lk_rnrl_rec.po_required_yn,
821 lk_rnrl_rec.revenue_estimated_percent, lk_rnrl_rec.revenue_estimated_duration, lk_rnrl_rec.revenue_estimated_period,
822 lk_rnrl_rec.billing_profile_id, lk_rnrl_rec.grace_duration, lk_rnrl_rec.grace_period,
823 lk_rnrl_rec.base_currency, lk_rnrl_rec.approval_type, l_k_org_id;
824
825 IF (c_k_rules%notfound) THEN
826 FND_MESSAGE.set_name(G_OKS_APP_NAME, 'OKS_INV_CONTRACT');
827 FND_MESSAGE.set_token('CONTRACT_ID', p_chr_id);
828 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
829 FND_LOG.message(FND_LOG.level_error, l_mod_name || '.get_k_rules', FALSE);
830 END IF;
831 FND_MSG_PUB.ADD;
832 CLOSE c_k_rules;
833 RAISE FND_API.g_exc_error;
834 END IF;
835 CLOSE c_k_rules;
836
837 --if p_org_id is not passed use the contract org id
838 IF (l_org_id IS NULL) THEN
839 l_org_id := l_k_org_id;
840 END IF;
841
842 IF (lk_rnrl_rec.price_list_id1 IS NOT NULL) THEN
843 lk_rnrl_rec.price_list_id2 := '#';
844 END IF;
845 l_rules_tbl(G_CONTRACT_LEVEL) := lk_rnrl_rec;
846
847 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
848 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
849 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.get_org', 'l_org_id=' || l_org_id);
850 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.contract_level_rules', 'see following log');
851 log_rules(l_mod_name || '.contract_level_rules', l_rules_tbl(G_CONTRACT_LEVEL));
852 END IF;
853 END IF;
854
855 END IF; -- of if(p_chr_id is not null) then
856
857 --get the party, org and global level rules
858 --this cursor will fetch at max 3 records
859 OPEN c_cgd_rules(l_org_id, l_party_id, nvl(p_date, SYSDATE));
860 FETCH c_cgd_rules BULK COLLECT INTO l_rules_tbl_tmp;
861 CLOSE c_cgd_rules;
862
863 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
864 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
865 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.get_gcd_rules', 'gcd_record_count=' || l_rules_tbl_tmp.COUNT);
866 END IF;
867 END IF;
868
869 --assign the rules table
870 FOR i IN l_rules_tbl_tmp.first..l_rules_tbl_tmp.last LOOP
871 IF (l_rules_tbl_tmp(i).cdt_type = 'MDT') THEN
872 l_rules_tbl(G_GLOBAL_LEVEL) := l_rules_tbl_tmp(i);
873 ELSIF (l_rules_tbl_tmp(i).cdt_type = 'SDT' AND l_rules_tbl_tmp(i).jtot_object_code = 'OKX_OPERUNIT') THEN
874 l_rules_tbl(G_ORG_LEVEL) := l_rules_tbl_tmp(i);
875 ELSIF (l_rules_tbl_tmp(i).cdt_type = 'SDT' AND l_rules_tbl_tmp(i).jtot_object_code = 'OKX_PARTY') THEN
876 l_rules_tbl(G_PARTY_LEVEL) := l_rules_tbl_tmp(i);
877 END IF;
878 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
879 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
880 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.gcd_loop', 'cdt_type=' || l_rules_tbl_tmp(i).cdt_type ||' , jtot_object_code'|| l_rules_tbl_tmp(i).jtot_object_code);
881 END IF;
882 END IF;
883 END LOOP;
884 l_rules_tbl_tmp.DELETE;
885
886 --log all the rules fetched if debug logging enabled
887 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
888 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
889 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.party_level_rules', 'see following log');
890 log_rules(l_mod_name || '.party_level_rules', l_rules_tbl(G_PARTY_LEVEL));
891 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.org_level_rules', 'see following log');
892 log_rules(l_mod_name || '.org_level_rules', l_rules_tbl(G_ORG_LEVEL));
893 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.global_level_rules', 'see following log');
894 log_rules(l_mod_name || '.global_level_rules', l_rules_tbl(G_GLOBAL_LEVEL));
895 END IF;
896 END IF;
897
898 --set the attributes
899 set_attributes;
900
901 l_rules_tbl.DELETE;
902
903
904 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
905 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
906 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.effective_rules', 'see following log');
907 log_rules(l_mod_name || '.effective_rules', x_rnrl_rec);
908 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.end', 'x_return_status=' || x_return_status);
909 END IF;
910 END IF;
911 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
912
913 EXCEPTION
914 WHEN FND_API.g_exc_error THEN
915 x_return_status := FND_API.g_ret_sts_error ;
916
917 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
918 FND_LOG.string(FND_LOG.level_error, l_mod_name || '.end_error', 'x_return_status=' || x_return_status);
919 END IF;
920 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
921
922 IF (c_k_party%isopen) THEN
923 CLOSE c_k_party;
924 END IF;
925 IF (c_k_rules%isopen) THEN
926 CLOSE c_k_rules;
927 END IF;
928 IF (c_cgd_rules%isopen) THEN
929 CLOSE c_cgd_rules;
930 END IF;
931
932 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
933 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
934
935 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
936 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_unexpected_error', 'x_return_status=' || x_return_status);
937 END IF;
938 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
939
940 IF (c_k_party%isopen) THEN
941 CLOSE c_k_party;
942 END IF;
943 IF (c_k_rules%isopen) THEN
944 CLOSE c_k_rules;
945 END IF;
946 IF (c_cgd_rules%isopen) THEN
947 CLOSE c_cgd_rules;
948 END IF;
949
950 WHEN OTHERS THEN
951 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
952
953 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
954 --first log the sqlerrm
955 l_error_text := substr (SQLERRM, 1, 240);
956 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_other_error', l_error_text );
957 --then add it to the message api list
958 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name, l_error_text);
959 END IF;
960 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
961
962 IF (c_k_party%isopen) THEN
963 CLOSE c_k_party;
964 END IF;
965 IF (c_k_rules%isopen) THEN
966 CLOSE c_k_rules;
967 END IF;
968 IF (c_cgd_rules%isopen) THEN
969 CLOSE c_cgd_rules;
970 END IF;
971
972 END get_renew_rules;
973
974 -- this procedures logs all the rule attributes in the FND_LOG_messages table
975 -- use only after checking the log level
976 PROCEDURE log_rules(p_module IN VARCHAR2,
977 p_rnrl_rec IN rnrl_rec_type)
978 IS
979 l_api_name VARCHAR2(30) := 'LOG_RULES';
980 l_mod_name VARCHAR2(256) := nvl(p_module, lower(G_OKS_APP_NAME) || '.plsql.' || g_pkg_name || '.' || l_api_name);
981 BEGIN
982 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
983 FND_LOG.string(FND_LOG.level_statement, l_mod_name, 'renewal_type=' || p_rnrl_rec.renewal_type ||' ,approval_type='|| p_rnrl_rec.approval_type);
984 FND_LOG.string(FND_LOG.level_statement, l_mod_name, 'period_type='|| p_rnrl_rec.period_type ||' ,period_start='|| p_rnrl_rec.period_start ||' ,price_uom='|| p_rnrl_rec.price_uom);
985 FND_LOG.string(FND_LOG.level_statement, l_mod_name, 'base_currency=' || p_rnrl_rec.base_currency ||' ,evergreen_threshold_amt='|| p_rnrl_rec.evergreen_threshold_amt ||' ,evergreen_approval_type='|| p_rnrl_rec.evergreen_approval_type);
986 FND_LOG.string(FND_LOG.level_statement, l_mod_name,'threshold(online)_amount='|| p_rnrl_rec.threshold_amount ||' ,online_approval_type='|| p_rnrl_rec.online_approval_type ||' ,payment_threshold_amt='|| p_rnrl_rec.payment_threshold_amt);
987 FND_LOG.string(FND_LOG.level_statement,l_mod_name,'evn_threshold_curr='|| p_rnrl_rec.evergreen_threshold_curr||' ,online_curr='|| p_rnrl_rec.threshold_currency ||' ,payment_threshold_curr='|| p_rnrl_rec.payment_threshold_curr||
988 ' ,threshold(online)_enabled_yn='||p_rnrl_rec.threshold_enabled_yn);
989 FND_LOG.string(FND_LOG.level_statement, l_mod_name, 'ren_pricing_type=' || p_rnrl_rec.renewal_pricing_type ||' , markup_pct='|| p_rnrl_rec.markup_percent ||' ,pl_id1='|| p_rnrl_rec.price_list_id1 ||' ,pl_id2='|| p_rnrl_rec.price_list_id2);
990 FND_LOG.string(FND_LOG.level_statement, l_mod_name, 'rev_est_pct=' || p_rnrl_rec.revenue_estimated_percent ||' ,rev_est_duration='|| p_rnrl_rec.revenue_estimated_duration ||' ,rev_est_period='|| p_rnrl_rec.revenue_estimated_period);
991 FND_LOG.string(FND_LOG.level_statement, l_mod_name,'grace_period='|| p_rnrl_rec.grace_period ||' ,grace_duration='|| p_rnrl_rec.grace_duration);
992 FND_LOG.string(FND_LOG.level_statement, l_mod_name, 'pdf_id=' || p_rnrl_rec.pdf_id ||' ,qcl_id='|| p_rnrl_rec.qcl_id ||' ,cgp_new_id='|| p_rnrl_rec.cgp_new_id ||' ,cgp_renew_id='|| p_rnrl_rec.cgp_renew_id);
993 FND_LOG.string(FND_LOG.level_statement, l_mod_name,'credit_amt='|| p_rnrl_rec.credit_amount ||' ,rle_code='|| p_rnrl_rec.rle_code ||' template_set_id='|| p_rnrl_rec.template_set_id ||' ,template_language='|| p_rnrl_rec.template_language);
994 FND_LOG.string(FND_LOG.level_statement, l_mod_name, 'user_id=' || p_rnrl_rec.user_id ||' ,email_address='|| p_rnrl_rec.email_address);
995 FND_LOG.string(FND_LOG.level_statement, l_mod_name,'billing_profile_id='|| p_rnrl_rec.billing_profile_id ||' ,interface_price_break='|| p_rnrl_rec.interface_price_break);
996 FND_LOG.string(FND_LOG.level_statement, l_mod_name, 'po_required_yn=' || p_rnrl_rec.po_required_yn||' ,payment_terms_id1='|| p_rnrl_rec.payment_terms_id1 ||' ,payment_terms_id2='|| p_rnrl_rec.payment_terms_id2);
997 FND_LOG.string(FND_LOG.level_statement, l_mod_name,'po_flag='|| p_rnrl_rec.purchase_order_flag ||' ,cc_flag='|| p_rnrl_rec.credit_card_flag);
998 FND_LOG.string(FND_LOG.level_statement, l_mod_name,'wire_flag='|| p_rnrl_rec.wire_flag ||' ,com_flag='|| p_rnrl_rec.commitment_number_flag ||' ,check_flag='|| p_rnrl_rec.check_flag);
999 END IF;
1000 END log_rules;
1001
1002
1003 /* stripped down version of get_renew_rules, only gets the template set id and template lang */
1004 PROCEDURE get_template_set(p_api_version IN NUMBER DEFAULT 1,
1005 p_init_msg_list IN VARCHAR2 DEFAULT FND_API.g_false,
1006 p_chr_id IN NUMBER,
1007 x_template_set_id OUT NOCOPY NUMBER,
1008 x_template_lang OUT NOCOPY VARCHAR2,
1009 x_return_status OUT NOCOPY VARCHAR2,
1010 x_msg_count OUT NOCOPY NUMBER,
1011 x_msg_data OUT NOCOPY VARCHAR2)
1012 IS
1013
1014 TYPE l_tset_rec IS RECORD(
1015 cdt_type oks_k_defaults.cdt_type%TYPE,
1016 jtot_object_code oks_k_defaults.jtot_object_code%TYPE,
1017 template_set_id oks_k_defaults.template_set_id%TYPE,
1018 template_language oks_k_defaults.template_language%TYPE);
1019
1020 TYPE l_tset_tbl_type IS TABLE OF l_tset_rec INDEX BY BINARY_INTEGER;
1021
1022 l_api_name CONSTANT VARCHAR2(30) := 'GET_TEMPLATE_SET';
1023 l_api_version CONSTANT NUMBER := 1;
1024 l_mod_name VARCHAR2(256) := lower(G_OKS_APP_NAME) || '.plsql.' || g_pkg_name || '.' || l_api_name;
1025
1026 l_party_id NUMBER;
1027 l_org_id NUMBER;
1028 l_tset_tbl_tmp l_tset_tbl_type;
1029 l_tset_tbl l_tset_tbl_type;
1030
1031 l_error_text VARCHAR2(512);
1032
1033 --should be outer join with party roles, so that
1034 --if we don't get a party we atleast get an org
1035 CURSOR c_k_party_org(cp_chr_id IN NUMBER) IS
1036 SELECT b.object1_id1, a.authoring_org_id
1037 FROM okc_k_headers_all_b a LEFT OUTER JOIN okc_k_party_roles_b b
1038 ON a.id = b.dnz_chr_id AND b.cle_id IS NULL AND b.jtot_object1_code = 'OKX_PARTY'
1039 AND b.rle_code IN ('CUSTOMER', 'SUBSCRIBER')
1040 WHERE a.id = cp_chr_id;
1041
1042
1043 --cp_org_id the org for which the rules need to be obtained, can be null
1044 --cp_party_id the party for which the rules need to be obtained, can be null
1045 --cp_date the date on which the rule should be effective, should not be null
1046 -- cursor will always return 1 record and at max return 3 records
1047 CURSOR c_cgd_template_set(cp_org_id IN NUMBER, cp_party_id IN NUMBER, cp_date IN DATE) IS
1048 SELECT
1049 cdt_type, jtot_object_code, template_set_id, template_language
1050 FROM oks_k_defaults
1051 WHERE
1052 (cdt_type = 'MDT' AND jtot_object_code IS NULL AND segment_id1 IS NULL AND segment_id2 IS NULL)
1053 OR
1054 (cdt_type = 'SDT' AND jtot_object_code = 'OKX_OPERUNIT' AND segment_id1 = to_char(cp_org_id) AND segment_id2 = '#'
1055 AND trunc(cp_date) BETWEEN start_date AND nvl(end_date, greatest(start_date, trunc(cp_date))))
1056 OR
1057 (cdt_type = 'SDT' AND jtot_object_code = 'OKX_PARTY' AND segment_id1 = to_char(cp_party_id) AND segment_id2 = '#'
1058 AND trunc(cp_date) BETWEEN start_date AND nvl(end_date, greatest(start_date, trunc(cp_date))));
1059
1060
1061 BEGIN
1062 --log key input parameters
1063 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
1064 IF (FND_LOG.test(FND_LOG.level_procedure, l_mod_name)) THEN
1065 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.begin', 'p_chr_id=' || p_chr_id);
1066 END IF;
1067 END IF;
1068
1069 --standard api initilization and checks
1070 IF NOT FND_API.compatible_api_call (l_api_version, p_api_version, l_api_name, G_PKG_NAME)THEN
1071 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1072 END IF;
1073 IF FND_API.to_boolean(p_init_msg_list ) THEN
1074 FND_MSG_PUB.initialize;
1075 END IF;
1076 x_return_status := FND_API.G_RET_STS_SUCCESS;
1077 x_template_set_id := NULL;
1078 x_template_lang := NULL;
1079
1080 OPEN c_k_party_org(p_chr_id);
1081 FETCH c_k_party_org INTO l_party_id, l_org_id;
1082 IF (c_k_party_org%notfound) THEN
1083 FND_MESSAGE.set_name(G_OKS_APP_NAME, 'OKS_INV_CONTRACT');
1084 FND_MESSAGE.set_token('CONTRACT_ID', p_chr_id);
1085 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
1086 FND_LOG.message(FND_LOG.level_error, l_mod_name || '.get_k_org', FALSE);
1087 END IF;
1088 FND_MSG_PUB.ADD;
1089 CLOSE c_k_party_org;
1090 RAISE FND_API.g_exc_error;
1091 END IF;
1092 CLOSE c_k_party_org;
1093
1094 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
1095 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
1096 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.party_org', 'l_party_id=' || l_party_id ||' , l_org_id'|| l_org_id);
1097 END IF;
1098 END IF;
1099
1100 --get the party, org and global level rules
1101 --this cursor will fetch at max 3 records
1102 OPEN c_cgd_template_set(l_org_id, l_party_id, SYSDATE);
1103 FETCH c_cgd_template_set BULK COLLECT INTO l_tset_tbl_tmp;
1104 CLOSE c_cgd_template_set;
1105
1106 --assign the rules table
1107 FOR i IN l_tset_tbl_tmp.first..l_tset_tbl_tmp.last LOOP
1108 IF (l_tset_tbl_tmp(i).cdt_type = 'MDT') THEN
1109 l_tset_tbl(G_GLOBAL_LEVEL) := l_tset_tbl_tmp(i);
1110 ELSIF (l_tset_tbl_tmp(i).cdt_type = 'SDT' AND l_tset_tbl_tmp(i).jtot_object_code = 'OKX_OPERUNIT') THEN
1111 l_tset_tbl(G_ORG_LEVEL) := l_tset_tbl_tmp(i);
1112 ELSIF (l_tset_tbl_tmp(i).cdt_type = 'SDT' AND l_tset_tbl_tmp(i).jtot_object_code = 'OKX_PARTY') THEN
1113 l_tset_tbl(G_PARTY_LEVEL) := l_tset_tbl_tmp(i);
1114 END IF;
1115
1116 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
1117 IF (FND_LOG.test(FND_LOG.level_statement, l_mod_name)) THEN
1118 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.gcd_loop', 'cdt_type=' || l_tset_tbl_tmp(i).cdt_type ||' , jtot_object_code'|| l_tset_tbl_tmp(i).jtot_object_code);
1119 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.gcd_loop','template_set_id='|| l_tset_tbl_tmp(i).template_set_id ||' ,template_language='|| l_tset_tbl_tmp(i).template_language);
1120 END IF;
1121 END IF;
1122 END LOOP;
1123 l_tset_tbl_tmp.DELETE;
1124
1125 FOR i IN l_tset_tbl.first..l_tset_tbl.last LOOP
1126
1127 IF(x_template_set_id IS NULL) THEN
1128 x_template_set_id := l_tset_tbl(i).template_set_id;
1129 END IF;
1130
1131 IF(x_template_lang IS NULL) THEN
1132 x_template_lang := l_tset_tbl(i).template_language;
1133 END IF;
1134
1135 END LOOP;
1136 l_tset_tbl.DELETE;
1137
1138 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
1139 IF (FND_LOG.test(FND_LOG.level_procedure, l_mod_name)) THEN
1140 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.end','x_template_set_id ='|| x_template_set_id ||', x_return_status='|| x_return_status);
1141 END IF;
1142 END IF;
1143 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
1144
1145 EXCEPTION
1146
1147 WHEN FND_API.g_exc_error THEN
1148 x_return_status := FND_API.g_ret_sts_error ;
1149
1150 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
1151 FND_LOG.string(FND_LOG.level_error, l_mod_name || '.end_error', 'x_return_status=' || x_return_status);
1152 END IF;
1153 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
1154
1155 IF (c_k_party_org%isopen) THEN
1156 CLOSE c_k_party_org;
1157 END IF;
1158 IF (c_cgd_template_set%isopen) THEN
1159 CLOSE c_cgd_template_set;
1160 END IF;
1161
1162 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1163 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1164
1165 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
1166 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_unexpected_error', 'x_return_status=' || x_return_status);
1167 END IF;
1168 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
1169
1170 IF (c_k_party_org%isopen) THEN
1171 CLOSE c_k_party_org;
1172 END IF;
1173 IF (c_cgd_template_set%isopen) THEN
1174 CLOSE c_cgd_template_set;
1175 END IF;
1176
1177 WHEN OTHERS THEN
1178 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1179
1180 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
1181 --first log the sqlerrm
1182 l_error_text := substr (SQLERRM, 1, 240);
1183 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_other_error', l_error_text);
1184 --then add it to the message api list
1185 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name, l_error_text);
1186 END IF;
1187 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
1188
1189 IF (c_k_party_org%isopen) THEN
1190 CLOSE c_k_party_org;
1191 END IF;
1192 IF (c_cgd_template_set%isopen) THEN
1193 CLOSE c_cgd_template_set;
1194 END IF;
1195
1196 END get_template_set;
1197
1198
1199 /* utility function to get template set id */
1200 FUNCTION get_template_set_id(p_chr_id IN NUMBER
1201 ) RETURN NUMBER
1202 IS
1203
1204 l_template_set_id NUMBER := NULL;
1205 l_template_lang VARCHAR2(5) := NULL;
1206 l_return_status VARCHAR2(1);
1207 l_msg_count NUMBER;
1208 l_msg_data VARCHAR2(4000);
1209
1210 BEGIN
1211 get_template_set(p_api_version => 1,
1212 p_init_msg_list => FND_API.G_FALSE,
1213 p_chr_id => p_chr_id,
1214 x_template_set_id => l_template_set_id,
1215 x_template_lang => l_template_lang,
1216 x_return_status => l_return_status,
1217 x_msg_count => l_msg_count,
1218 x_msg_data => l_msg_data);
1219 IF l_return_status = FND_API.g_ret_sts_unexp_error THEN
1220 RAISE FND_API.g_exc_unexpected_error;
1221 ELSIF l_return_status = FND_API.g_ret_sts_error THEN
1222 RAISE FND_API.g_exc_error;
1223 END IF;
1224
1225 RETURN l_template_set_id;
1226
1227 END get_template_set_id;
1228
1229 /* utility function to get template set lang */
1230 FUNCTION get_template_lang(p_chr_id IN NUMBER
1231 ) RETURN VARCHAR2
1232 IS
1233
1234 l_template_set_id NUMBER := NULL;
1235 l_template_lang VARCHAR2(5) := NULL;
1236 l_return_status VARCHAR2(1);
1237 l_msg_count NUMBER;
1238 l_msg_data VARCHAR2(4000);
1239
1240 BEGIN
1241 get_template_set(p_api_version => 1,
1242 p_init_msg_list => FND_API.G_FALSE,
1243 p_chr_id => p_chr_id,
1244 x_template_set_id => l_template_set_id,
1245 x_template_lang => l_template_lang,
1246 x_return_status => l_return_status,
1247 x_msg_count => l_msg_count,
1248 x_msg_data => l_msg_data);
1249
1250 IF l_return_status = FND_API.g_ret_sts_unexp_error THEN
1251 RAISE FND_API.g_exc_unexpected_error;
1252 ELSIF l_return_status = FND_API.g_ret_sts_error THEN
1253 RAISE FND_API.g_exc_error;
1254 END IF;
1255
1256 RETURN l_template_lang;
1257
1258 END get_template_lang;
1259
1260 /*
1261 Procedure evaluates the renewal rules setup in Contract or GCD to determine
1262 the effective renewal type for a contract.
1263
1264 Parameters
1265 p_chr_id : id of the contract whose renewal type needs to be determined, mandatory
1266 p_amount : contract amount, optional, if not passed derived from p_chr_id
1267 p_currency_code : contract currency, optional, if not passed derived from p_chr_id
1268 p_rnrl_rec : record containing the effective renewal rules for the contract,
1269 optional, if not populated, derived from p_chr_id
1270 x_renewal_type : renewal type as determined
1271 x_approval_type : approval type associated with the renewal type
1272 x_threshold_used : Y|N flag indicating, if GCD thresholds were used to determine the renewal type
1273 */
1274 PROCEDURE GET_RENEWAL_TYPE
1275 (
1276 p_api_version IN NUMBER,
1277 p_init_msg_list IN VARCHAR2 DEFAULT FND_API.G_FALSE,
1278 x_return_status OUT NOCOPY VARCHAR2,
1279 x_msg_count OUT NOCOPY NUMBER,
1280 x_msg_data OUT NOCOPY VARCHAR2,
1281 p_chr_id IN NUMBER,
1282 p_amount IN NUMBER DEFAULT NULL,
1283 p_currency_code IN VARCHAR2 DEFAULT NULL,
1284 p_rnrl_rec IN rnrl_rec_type DEFAULT NULL,
1285 x_renewal_type OUT NOCOPY VARCHAR2,
1286 x_approval_type OUT NOCOPY VARCHAR2,
1287 x_threshold_used OUT NOCOPY VARCHAR2
1288 )
1289 IS
1290
1291 l_api_name CONSTANT VARCHAR2(30) := 'GET_RENEWAL_TYPE';
1292 l_api_version CONSTANT NUMBER := 1;
1293 l_mod_name VARCHAR2(256) := lower(G_OKS_APP_NAME) || '.plsql.' || G_PKG_NAME || '.' || l_api_name;
1294 l_error_text VARCHAR2(512);
1295
1296 CURSOR c_k_hdr(cp_chr_id IN NUMBER) IS
1297 SELECT estimated_amount, currency_code, start_date
1298 FROM okc_k_headers_all_b
1299 WHERE id = cp_chr_id;
1300
1301 l_amount NUMBER;
1302 l_currency_code VARCHAR2(15);
1303 l_start_date DATE;
1304 l_rnrl_rec OKS_RENEW_UTIL_PVT.rnrl_rec_type;
1305
1306 BEGIN
1307 --log key input parameters
1308 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
1309 IF (FND_LOG.test(FND_LOG.level_procedure, l_mod_name)) THEN
1310 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.begin', 'p_api_version=' || p_api_version ||' ,p_chr_id='|| p_chr_id||' ,p_amount='||p_amount||
1311 ' ,p_currency_code='||p_currency_code||' ,p_rnrl_rec.base_currency='||p_rnrl_rec.base_currency);
1312 END IF;
1313 END IF;
1314
1315 --standard api initilization and checks
1316 IF NOT FND_API.compatible_api_call (l_api_version, p_api_version, l_api_name, G_PKG_NAME)THEN
1317 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1318 END IF;
1319 IF FND_API.to_boolean(p_init_msg_list ) THEN
1320 FND_MSG_PUB.initialize;
1321 END IF;
1322 x_return_status := FND_API.G_RET_STS_SUCCESS;
1323
1324 --basic input validation
1325 IF(p_chr_id IS NULL) THEN
1326 FND_MESSAGE.set_name(G_OKS_APP_NAME, 'OKS_MANDATORY_ARG');
1327 FND_MESSAGE.set_token('ARG_NAME', 'p_chr_id');
1328 FND_MESSAGE.set_token('PROG_NAME', G_PKG_NAME || '.' || l_api_name);
1329 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
1330 FND_LOG.message(FND_LOG.level_error, l_mod_name || '.input_validation', FALSE);
1331 END IF;
1332 FND_MSG_PUB.ADD;
1333 RAISE FND_API.g_exc_error;
1334 END IF;
1335
1336 --get contract details if they are not passed
1337 IF ((p_amount IS NULL) OR (p_currency_code IS NULL) OR (p_rnrl_rec.base_currency IS NULL)) THEN
1338
1339 OPEN c_k_hdr(p_chr_id);
1340 FETCH c_k_hdr INTO l_amount, l_currency_code, l_start_date;
1341 CLOSE c_k_hdr;
1342
1343 --if invalid contract
1344 IF (l_start_date IS NULL) THEN
1345 FND_MESSAGE.set_name(G_OKS_APP_NAME, 'OKS_INV_CONTRACT');
1346 FND_MESSAGE.set_token('CONTRACT_ID', p_chr_id);
1347 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
1348 FND_LOG.message(FND_LOG.level_error, l_mod_name || '.get_k_details', FALSE);
1349 END IF;
1350 FND_MSG_PUB.ADD;
1351 RAISE FND_API.g_exc_error;
1352 END IF;
1353
1354 --means the renewal rules are not passed, get them
1355 IF (p_rnrl_rec.base_currency IS NULL) THEN
1356
1357 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
1358 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.calling_get_renew_rules', 'p_chr_id=' || p_chr_id ||', p_date='|| l_start_date);
1359 END IF;
1360
1361 OKS_RENEW_UTIL_PVT.get_renew_rules(
1362 x_return_status => x_return_status,
1363 p_api_version => 1.0,
1364 p_init_msg_list => FND_API.G_FALSE,
1365 p_chr_id => p_chr_id,
1366 p_party_id => NULL,
1367 p_org_id => NULL,
1368 p_date => l_start_date,
1369 p_rnrl_rec => p_rnrl_rec,
1370 x_rnrl_rec => l_rnrl_rec,
1371 x_msg_count => x_msg_count,
1372 x_msg_data => x_msg_data);
1373
1374 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
1375 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.after_get_renew_rules', 'x_return_status=' || x_return_status);
1376 END IF;
1377 IF x_return_status = FND_API.g_ret_sts_unexp_error THEN
1378 RAISE FND_API.g_exc_unexpected_error;
1379 ELSIF x_return_status = FND_API.g_ret_sts_error THEN
1380 RAISE FND_API.g_exc_error;
1381 END IF;
1382
1383 END IF; --of IF (p_rnrl_rec.base_currency IS NULL) THEN
1384
1385 END IF; --of IF ((p_amount IS NULL) OR (p_currency_code IS NULL) OR (p_rnrl_rec.base_currency IS NULL)) THEN
1386
1387 l_amount := nvl(p_amount, l_amount);
1388 l_currency_code := nvl(p_currency_code, l_currency_code);
1389 IF(p_rnrl_rec.base_currency IS NULL) THEN
1390 NULL;
1391 ELSE
1392 l_rnrl_rec := p_rnrl_rec;
1393 END IF;
1394
1395 --now determine the effective renewal type
1396 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
1397 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.renewal_rules', 'l_rnrl_rec.renewal_type='||l_rnrl_rec.renewal_type||' ,l_rnrl_rec.approval_type='||l_rnrl_rec.approval_type||
1398 ' ,l_rnrl_rec.base_currency='||l_rnrl_rec.base_currency||' ,l_rnrl_rec.evergreen_threshold_amt='||l_rnrl_rec.evergreen_threshold_amt||' ,l_rnrl_rec.evergreen_approval_type='||l_rnrl_rec.evergreen_approval_type||
1399 ' ,l_rnrl_rec.threshold_amount='||l_rnrl_rec.threshold_amount||' ,l_rnrl_rec.online_approval_type='||l_rnrl_rec.online_approval_type||' ,l_amount='||l_amount||' ,l_currency_code='||l_currency_code);
1400 END IF;
1401
1402 --initialize to default value, if GCD not setup
1403 l_rnrl_rec.renewal_type := nvl(l_rnrl_rec.renewal_type, 'NSR');
1404
1405 --first check if renewal_type = 'DNR';
1406 IF(l_rnrl_rec.renewal_type = 'DNR') THEN
1407 x_renewal_type := 'DNR';
1408 x_approval_type := NULL;
1409 x_threshold_used := NULL;
1410 ELSE
1411
1412 --first priority given to EVN : evergreen, then ERN : online, then NSR: manual
1413 --first check if renewal type is EVN
1414 -- Bug 5859046, don't change renewal type to EVN if evergreen_threshold_amt IS NULL
1415 IF(l_rnrl_rec.renewal_type = 'EVN') THEN
1416 x_renewal_type := 'EVN';
1417 x_approval_type := nvl(l_rnrl_rec.approval_type, 'Y'); --Required
1418 x_threshold_used := 'N';
1419 ELSE
1420
1421 --then check if amount < evergreen threshold
1422 IF ( (l_currency_code = l_rnrl_rec.base_currency) AND
1423 (l_amount <= l_rnrl_rec.evergreen_threshold_amt) ) THEN -- Bug 5859046
1424 x_renewal_type := 'EVN';
1425 x_approval_type := nvl(l_rnrl_rec.evergreen_approval_type, 'Y'); --Required
1426 x_threshold_used := 'Y';
1427 ELSE
1428
1429 --if EVN fails, check if renewal type is ERN
1430 -- Bug 5859046, don't change renewal type to ERN if threshold_amount IS NULL
1431 IF(l_rnrl_rec.renewal_type = 'ERN') THEN
1432 x_renewal_type := 'ERN';
1433 x_approval_type := nvl(l_rnrl_rec.approval_type, 'M'); --Manual
1434 x_threshold_used := 'N';
1435 ELSE
1436 --if online renewal threhold is enabled and amount < online threshold
1437 IF ((nvl(l_rnrl_rec.threshold_enabled_yn, 'N') = 'Y') AND
1438 (l_currency_code = l_rnrl_rec.base_currency) AND
1439 (l_amount <= l_rnrl_rec.threshold_amount) ) THEN -- Bug 5859046
1440 x_renewal_type := 'ERN';
1441 x_approval_type := nvl(l_rnrl_rec.online_approval_type, 'M'); --Manual
1442 x_threshold_used := 'Y';
1443 ELSE
1444 --if both EVN and ERN fail
1445 x_renewal_type := 'NSR';
1446 x_approval_type := nvl(l_rnrl_rec.approval_type, 'Y'); --Required
1447 x_threshold_used := 'N';
1448 END IF;
1449 END IF;
1450 END IF;
1451 END IF; --IF(l_rnrl_rec.renewal_type = 'EVN') THEN
1452 END IF; --of IF(l_rnrl_rec.renewal_type = 'DNR') THEN
1453
1454 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
1455 IF (FND_LOG.test(FND_LOG.level_procedure, l_mod_name)) THEN
1456 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.end', ' x_return_status='|| x_return_status||', x_renewal_type='||x_renewal_type||' ,x_approval_type='||x_approval_type||' ,x_threshold_used='||x_threshold_used);
1457 END IF;
1458 END IF;
1459 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
1460
1461 EXCEPTION
1462 WHEN FND_API.g_exc_error THEN
1463 x_return_status := FND_API.g_ret_sts_error ;
1464
1465 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
1466 FND_LOG.string(FND_LOG.level_error, l_mod_name || '.end_error', 'x_return_status=' || x_return_status);
1467 END IF;
1468 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
1469
1470 IF (c_k_hdr%isopen) THEN
1471 CLOSE c_k_hdr;
1472 END IF;
1473
1474 WHEN FND_API.g_exc_unexpected_error THEN
1475 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1476
1477 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
1478 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_unexpected_error', 'x_return_status=' || x_return_status);
1479 END IF;
1480 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
1481
1482 IF (c_k_hdr%isopen) THEN
1483 CLOSE c_k_hdr;
1484 END IF;
1485
1486 WHEN OTHERS THEN
1487 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1488
1489 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
1490 --first log the sqlerrm
1491 l_error_text := substr (SQLERRM, 1, 240);
1492 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_other_error', l_error_text);
1493 --then add it to the message api list
1494 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name, l_error_text);
1495 END IF;
1496 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
1497
1498 IF (c_k_hdr%isopen) THEN
1499 CLOSE c_k_hdr;
1500 END IF;
1501
1502 END GET_RENEWAL_TYPE;
1503
1504 -- This API checks if function is accessible under current responsibility.
1505 -- by calling fnd_function.test. This is a wrapper on fnd_function.test
1506 -- parameters
1507 -- function_name - function to test
1508 -- RETURNS
1509 -- Y if function is accessible else N
1510
1511 FUNCTION get_function_access (p_function_name VARCHAR2)
1512 return VARCHAR2
1513 IS
1514 l_return_val VARCHAR2(1);
1515
1516 BEGIN
1517 IF fnd_function.test(p_function_name, 'Y') THEN
1518 l_return_val := 'Y';
1519 ELSE
1520 l_return_val := 'N';
1521 END IF;
1522 return(l_return_val);
1523 EXCEPTION
1524 WHEN others THEN
1525 l_return_val := 'N';
1526 return(l_return_val);
1527 END get_function_access;
1528
1529 /*=========================================================================
1530 API name : get_language_info
1531 Type : Private.
1532 Function : This procedure derives the language and territory that
1533 will be used to generate message or documents to be sent
1534 to customer.
1535 Pre-reqs : None.
1536 Parameters :
1537 IN : p_api_version IN NUMBER Required
1538 Api version
1539 : p_init_msg_list IN VARCHAR2 Required
1540 Initialize message stack parameter
1541 : p_contract_id IN NUMBER Required
1542 Contract header Id
1543 : p_document_type IN VARCHAR2 Required
1544 Type of the layout template like Quote, Activation etc
1545 : p_template_id IN NUMBER Required
1546 Message layout template id can be passed if available
1547 so that external api call is avoided.
1548 : p_template_language IN VARCHAR2 Required
1549 Language defined in GCD if availble to avoid api call
1550 OUT : x_fnd_language OUT VARCHAR2
1551 Returns fnd_languages's language code.
1552 : x_fnd_iso_language OUT VARCHAR2
1553 Returns fnd_language's iso_language
1554 : x_fnd_iso_territory OUT VARCHAR2
1555 Returns fnd_language's iso_territory
1556 : x_gcd_template_lang OUT NOCOPY VARCHAR2
1557 Returns language defined in GCD
1558 : x_return_status OUT VARCHAR2
1559 Api return status
1560 : x_msg_count OUT NUMBER
1561 Count of message on error stack
1562 : x_msg_data OUT VARCHAR2
1563 Actual error messages on error stack
1564 Note :
1565 =========================================================================*/
1566 PROCEDURE get_language_info
1567 (
1568 p_api_version IN NUMBER,
1569 p_init_msg_list IN VARCHAR2,
1570 p_contract_id IN NUMBER,
1571 p_document_type IN VARCHAR2 DEFAULT 'QUOTE',
1572 p_template_id IN NUMBER DEFAULT NULL,
1573 p_template_language IN VARCHAR2 DEFAULT NULL,
1574 x_fnd_language OUT NOCOPY VARCHAR2,
1575 x_fnd_iso_language OUT NOCOPY VARCHAR2,
1576 x_fnd_iso_territory OUT NOCOPY VARCHAR2,
1577 x_gcd_template_lang OUT NOCOPY VARCHAR2,
1578 x_return_status OUT NOCOPY VARCHAR2,
1579 x_msg_count OUT NOCOPY NUMBER,
1580 x_msg_data OUT NOCOPY VARCHAR2
1581 ) IS
1582
1583 l_api_version CONSTANT NUMBER := 1.0;
1584 l_api_name CONSTANT VARCHAR2(50) := 'get_language_info';
1585
1586 CURSOR l_fnd_lang_terr_csr (p_lang VARCHAR2) IS
1587 SELECT lower(iso_language), iso_territory
1588 FROM fnd_languages
1589 WHERE language_code = p_lang;
1590
1591 --cgopinee bugfix for 6802038
1592 CURSOR l_template_def_lang_csr (p_template_id NUMBER) IS
1593 SELECT CASE WHEN a.installed_flag = 'D' THEN 'US' ELSE a.language_code END language_code,
1594 CASE WHEN a.installed_flag = 'D' THEN 'en' ELSE b.default_language END default_language,
1595 CASE WHEN a.installed_flag = 'D' THEN '00' ELSE b.default_territory END default_territory
1596 FROM fnd_languages a, xdo_templates_b b
1597 WHERE a.iso_language = upper(b.default_language)
1598 AND b.template_id = p_template_id
1599 AND (a.iso_territory = b.default_territory
1600 OR (b.default_territory = '00' and a.installed_flag IN ('B','I','D')))
1601 ORDER BY a.installed_flag ASC;
1602
1603 l_message_template_id NUMBER;
1604 l_attachment_template_id NUMBER;
1605 l_attachment_name VARCHAR2(150);
1606 l_k_status VARCHAR2(30);
1607
1608 BEGIN
1609
1610 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1611 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1612 'Entered '||G_PKG_NAME ||'.'||l_api_name||
1613 '(p_contract_id=>'||p_contract_id||
1614 ',p_document_type=>'||p_document_type||
1615 ',p_template_id=>'||p_template_id||
1616 ',p_template_language=>'||p_template_language||');');
1617 END IF;
1618
1619 -- Standard call to check for call compatibility.
1620 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
1621 x_return_status := FND_API.G_RET_STS_ERROR;
1622 RAISE FND_API.G_EXC_ERROR;
1623 END IF;
1624
1625 -- Initialize message list if p_init_msg_list is set to TRUE.
1626 IF FND_API.to_Boolean( p_init_msg_list ) THEN
1627 FND_MSG_PUB.initialize;
1628 END IF;
1629
1630 -- Initialize API return status to success
1631 x_return_status := FND_API.G_RET_STS_SUCCESS;
1632
1633 IF p_contract_id IS NULL THEN
1634 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
1635 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
1636 FND_MSG_PUB.add;
1637 RAISE FND_API.G_EXC_ERROR;
1638 END IF;
1639
1640 -- If language is known already, use it to get iso_language and territory
1641 IF p_template_language IS NOT NULL THEN
1642 x_fnd_language := p_template_language;
1643 ELSE
1644 x_fnd_language := OKS_RENEW_UTIL_PVT.get_template_lang(p_chr_id => p_contract_id);
1645 END IF;
1646
1647 -- This is used to get character set in which an email has to be delivered
1648 x_gcd_template_lang := x_fnd_language;
1649
1650 -- If you got the language from GCD get iso_language and territory
1651 IF x_fnd_language IS NOT NULL THEN
1652 OPEN l_fnd_lang_terr_csr(x_fnd_language);
1653 FETCH l_fnd_lang_terr_csr INTO x_fnd_iso_language, x_fnd_iso_territory;
1654 CLOSE l_fnd_lang_terr_csr;
1655 -- If language is not found in GCD, get layout template to get default language, territory
1656 ELSE
1657 IF p_template_id IS NOT NULL THEN
1658 l_message_template_id := p_template_id;
1659 ELSE
1660 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1661 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
1662 'OKS_TEMPLATE_SET_PUB.get_template_set_dtls(p_contract_id= '
1663 ||p_contract_id||' p_document_type ='||p_document_type||')');
1664 END IF;
1665 OKS_TEMPLATE_SET_PUB.get_template_set_dtls
1666 (
1667 p_api_version => p_api_version,
1668 p_init_msg_list => p_init_msg_list,
1669 p_contract_id => p_contract_id,
1670 p_document_type => p_document_type,
1671 x_template_language => x_fnd_language,
1672 x_message_template_id => l_message_template_id,
1673 x_attachment_template_id => l_attachment_template_id,
1674 x_attachment_name => l_attachment_name,
1675 x_contract_update_status => l_k_status,
1676 x_return_status => x_return_status,
1677 x_msg_data => x_msg_data,
1678 x_msg_count => x_msg_count
1679 );
1680 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1681 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
1682 'OKS_TEMPLATE_SET_PUB.get_template_set_dtls(x_return_status= '||x_return_status||
1683 ' x_msg_count ='||x_msg_count||')');
1684 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
1685 ' x_template_language ='||x_fnd_language||
1686 ' x_message_template_id ='||l_message_template_id||
1687 ' x_attachment_template_id ='||l_attachment_template_id||
1688 ' x_attachment_name ='||l_attachment_name||
1689 ' x_contract_update_status ='||l_k_status);
1690 END IF;
1691 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1692 RAISE FND_API.G_EXC_ERROR;
1693 END IF;
1694 END IF;
1695 -- Get layout template's default language to get installed /
1696 -- base language's iso language and territory
1697 IF l_message_template_id IS NOT NULL THEN
1698 OPEN l_template_def_lang_csr(l_message_template_id);
1699 FETCH l_template_def_lang_csr INTO x_fnd_language,x_fnd_iso_language,x_fnd_iso_territory;
1700 CLOSE l_template_def_lang_csr;
1701 ELSE
1702 x_fnd_language := NULL;
1703 x_fnd_iso_language := NULL;
1704 x_fnd_iso_territory := NULL;
1705 -- skip raising an error instead return null values
1706 -- FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NOLAYOUT_TEMPLATE');
1707 -- FND_MSG_PUB.add;
1708 -- RAISE FND_API.G_EXC_ERROR;
1709 END IF;
1710 END IF;
1711
1712 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1713 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1714 'x_fnd_language '||x_fnd_language||
1715 ' x_fnd_iso_language '||x_fnd_iso_language||
1716 ' x_fnd_iso_territory ' ||x_fnd_iso_territory);
1717 END IF;
1718 -- Standard call to get message count and if count is 1, get message info.
1719 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
1720
1721 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1722 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
1723 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
1724 END IF;
1725
1726 EXCEPTION
1727 WHEN FND_API.G_EXC_ERROR THEN
1728 x_return_status := FND_API.G_RET_STS_ERROR;
1729 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1730 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1731 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
1732 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
1733 END IF;
1734 WHEN OTHERS THEN
1735 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1736 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1737 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
1738 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
1739 ||SQLCODE||', sqlerrm = '||SQLERRM);
1740 END IF;
1741 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1742 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1743 END get_language_info;
1744
1745 END OKS_RENEW_UTIL_PVT;