[Home] [Help]
PACKAGE BODY: APPS.OKS_BILL_SCH
Source
1 Package Body OKS_BILL_SCH AS
2 /* $Header: OKSBLSHB.pls 120.46.12020000.8 2013/05/10 13:58:30 spingali ship $ */
3
4
5 l_strm_lvl_tbl_in oks_sll_pvt.sllv_tbl_type;
6 l_strm_lvl_tbl_out oks_sll_pvt.sllv_tbl_type;
7 l_lvl_ele_tbl_in oks_bill_level_elements_pvt.letv_tbl_type;
8 l_lvl_ele_tbl_out oks_bill_level_elements_pvt.letv_tbl_type;
9 l_fnd_lvl_in_rec oks_bill_util_pub.bill_det_inp_rec;
10 l_fnd_lvl_out_rec oks_bill_util_pub.bill_sch_rec;
11 l_api_version number := 1.0;
12
13 --Bug Fix 5185658
14 pkg_cascade_billing_hdr varchar2(1) := 'N';
15
16
17 TYPE Top_Line_BS_Type IS RECORD
18 (
19 id NUMBER,
20 Start_dt NUMBER,
21 End_dt DATE,
22 tot_Amount NUMBER);
23
24
25 Type Top_Line_BS_tbl is TABLE of Top_Line_BS_type index by binary_integer;
26
27 TYPE Contract_Rec_Type IS RECORD
28 (
29 ID NUMBER,
30 Start_dt DATE,
31 End_dt DATE);
32
33
34 TYPE StrmLvl_Out_Type Is Record
35 (
36 Id Number,
37 cle_id NUMBER,
38 chr_id number,
39 dnz_chr_id number,
40 Seq_no NUMBER,
41 Dt_start DATE,
42 end_date DATE,
43 Level_Period NUMBER,
44 uom_Per_Period NUMBER,
45 uom Varchar2 (3),
46 Amount NUMBER,
47 invoice_offset_days NUMBER,
48 Interface_offset_days NUMBER
49
50 );
51
52 Type StrmLvl_Out_tbl is TABLE of StrmLvl_Out_Type index by binary_integer;
53
54 Type sll_prorated_rec_type IS RECORD
55 ( sll_seq_num Number,
56 sll_start_date DATE,
57 sll_end_date DATE,
58 sll_tuom VARCHAR2(40),
59 sll_period Number,
60 sll_uom_per_period Number,
61 sll_amount Number
62 );
63
64 Type sll_prorated_tab_type is Table of sll_prorated_rec_type index by binary_integer;
65
66
67 TYPE Line_Det_Type IS RECORD
68 ( chr_id Number,
69 dnz_chr_id Number,
70 id Number,
71 cle_id NUMBER,
72 lse_id Number,
73 price_uom VARCHAR2(10),
74 line_start_dt Date,
75 line_end_dt Date,
76 line_amt Number
77 );
78 ------------------------------------------------------------------------
79 -- Begin partial period computation logic
80 -- Developer Mani Choudhary
81 -- Date 17-MAY-2005
82 -- Added cp_price_uom and cp_lse_id
83 -------------------------------------------------------------------------
84
85 TYPE Prod_Det_Type IS RECORD
86 ( cp_id Number,
87 cp_start_dt Date,
88 cp_end_dt Date,
89 cp_lse_id Number,
90 cp_price_uom VARCHAR2(10),
91 cp_amt Number,
92 dnz_chr_id number
93 );
94
95 -------------------------------------------------------------------------
96 -- Begin partial period computation logic
97 -- Developer Mani Choudhary
98 -- Date 31-MAY-2005
99 -- Added two new parameters P_period_start,P_period_type
100 -------------------------------------------------------------------------
101
102 PROCEDURE Calculate_sll_amount( p_api_version IN NUMBER,
103 p_total_amount IN NUMBER,
104 p_currency_code IN VARCHAR2,
105 p_period_start IN VARCHAR2,
106 p_period_type IN VARCHAR2,
107 p_sll_prorated_tab IN OUT NOCOPY sll_prorated_tab_type,
108 x_return_status OUT NOCOPY VARCHAR2
109 );
110
111
112 Procedure Create_Stream_Level
113 ( p_billing_type IN VARCHAR2
114 , p_strm_lvl_tbl IN StreamLvl_tbl
115 , p_dnz_chr_id IN NUMBER
116 , p_subline_call IN VARCHAR2
117 , p_line_amt IN NUMBER
118 , p_subline_amt IN NUMBER
119 , p_sll_start_dt IN DATE
120 , p_end_dt IN DATE
121 , p_period_start IN VARCHAR2
122 , p_period_type IN VARCHAR2
123 , x_sll_out_tbl OUT NOCOPY StrmLvl_Out_tbl
124 , x_return_status OUT NOCOPY Varchar2
125 );
126
127 -------------------------------------------------------------------------
128 -- End partial period computation logic
129 -- Date 09-MAY-2005
130 -------------------------------------------------------------------------
131
132 FUNCTION chk_Sll_Exists(p_id IN NUMBER) return number ;
133
134
135
136 PROCEDURE Check_Existing_Lvlelement
137 (
138 p_sll_id IN Number,
139 p_sll_dt_start IN Date,
140 p_uom IN VARCHAR2,
141 p_uom_per_period IN NUMBER,
142 p_cp_end_dt IN DATE,
143 x_next_cycle_dt OUT NOCOPY DATE,
144 x_last_cycle_dt out NOCOPY Date,
145 x_period_counter out NOCOPY Number,
146 x_sch_amt IN OUT NOCOPY NUMBER,
147 x_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
148 x_return_status out NOCOPY Varchar2
149 );
150
151
152 FUNCTION Cal_Hdr_Amount
153 (
154 p_contract_id IN Number
155 ) Return NUMBER;
156
157 FUNCTION Find_Adjusted_Amount
158 (
159 p_line_id IN Number,
160 p_total_amt IN Number,
161 p_cycle_amt IN Number
162 ) RETURN Number;
163
164 --------------------------------------------------------------------------
165 -- Begin partial period computation logic
166 -- Developer Mani Choudhary
167 -- Date 09-MAY-2005
168 -- Added two new parameters P_period_start,P_period_type in procedural call
169 ---------------------------------------------------------------------------
170 PROCEDURE Create_Level_elements
171 ( p_billing_type IN VARCHAR2,
172 p_sll_tbl IN StrmLvl_Out_tbl,
173 p_line_rec IN Line_Det_Type,
174 p_invoice_ruleid IN Number,
175 p_term_dt IN DATE,
176 p_period_start IN VARCHAR2,
177 p_period_type IN VARCHAR2,
178 x_return_status OUT NOCOPY Varchar2
179 );
180
181 FUNCTION get_unit_price_per_uom(
182 P_cle_id IN NUMBER,
183 P_billing_uom IN VARCHAR2,
184 P_period_start IN VARCHAR2,
185 P_period_type IN VARCHAR2,
186 P_duration IN NUMBER,
187 p_end_date IN DATE,
188 p_term_date IN DATE
189 )RETURN NUMBER;
190
191
192 -------------------------------------------------------------------------
193 -- Begin partial period computation logic
194 -- Developer Mani Choudhary
195 -- Date 09-MAY-2005
196 -------------------------------------------------------------------------
197 PROCEDURE Create_cp_lvl_elements
198 ( p_billing_type IN VARCHAR2,
199 p_cp_sll_tbl IN StrmLvl_Out_tbl,
200 p_Line_Rec IN Line_Det_Type,
201 p_SubLine_rec IN Prod_Det_Type,
202 p_invoice_rulid IN Number,
203 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
204 p_term_dt IN DATE,
205 p_period_start IN VARCHAR2,
206 p_period_type IN VARCHAR2,
207 x_return_status OUT NOCOPY Varchar2
208 );
209
210 --------------------------------------------------------------------------
211 -- Begin partial period computation logic
212 -- Developer Mani Choudhary
213 -- Date 09-MAY-2005
214 -- Added two new parameters P_period_start,P_period_type in procedural call
215 ---------------------------------------------------------------------------
216 PROCEDURE Bill_Sch_Cp
217 ( p_billing_type IN VARCHAR2,
218 p_bsll_tbl IN StreamLvl_tbl,
219 p_Line_Rec IN Line_Det_Type,
220 p_SubLine_rec IN Prod_Det_Type,
221 p_invoice_rulid IN Number,
222 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
223 p_term_dt IN DATE,
224 p_period_start IN VARCHAR2,
225 p_period_type IN VARCHAR2,
226 x_return_status OUT NOCOPY Varchar2
227 );
228
229 FUNCTION Find_Currency_Code
230 ( p_cle_id NUMBER,
231 p_chr_id NUMBER
232 ) RETURN VARCHAR2;
233
234
235 FUNCTION Find_Sll_Count(
236 p_subline_id NUMBER)
237 RETURN NUMBER;
238
239 -------------------------------------------------------------------------
240 -- Begin partial period computation logic
241 -- Developer Mani Choudhary
242 -- Date 09-MAY-2005
243 -- Added two new parameters p_period_start and p_period_type
244 -------------------------------------------------------------------------
245 PROCEDURE Create_Hdr_Level_elements(p_billing_type IN VARCHAR2,
246 p_sll_tbl IN StrmLvl_Out_tbl,
247 p_hdr_rec IN Contract_Rec_Type,
248 p_invoice_ruleid IN Number,
249 p_called_from IN NUMBER, --(1 - form, 2- copy,renew)
250 p_period_start IN VARCHAR2,
251 p_period_type IN VARCHAR2,
252 x_return_status OUT NOCOPY Varchar2);
253
254
255 PROCEDURE Delete_lvl_element(p_cle_id IN NUMBER,
256 x_return_status OUT NOCOPY VARCHAR2);
257
258
259 PROCEDURE Del_hdr_lvl_element(p_hdr_id IN NUMBER,
260 x_return_status OUT NOCOPY VARCHAR2);
261
262 PROCEDURE Get_Constant_sll_Amount(p_line_start_date IN DATE,
263 p_line_end_date IN DATE,
264 p_cycle_start_date IN DATE,
265 p_remaining_amount IN NUMBER,
266 P_uom_quantity IN NUMBER,
267 P_tce_code IN VARCHAR2,
268 x_constant_sll_amt OUT NOCOPY NUMBER,
269 x_return_status OUT NOCOPY VARCHAR2);
270
271
272 PROCEDURE Get_Period_Frequency(p_line_start_date IN DATE,
273 p_line_end_date IN DATE,
274 p_cycle_start_date IN DATE,
275 p_next_billing_date IN DATE,
276 P_uom_quantity IN NUMBER,
277 P_tce_code IN VARCHAR2,
278 p_uom_per_period IN NUMBER,
279 x_period_freq OUT NOCOPY NUMBER,
280 x_return_status OUT NOCOPY VARCHAR2);
281
282
283
284 PROCEDURE Adjust_top_BS_Amt(
285 p_Line_Rec IN Line_Det_Type,
286 p_SubLine_rec IN Prod_Det_Type,
287 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
288 x_return_status OUT NOCOPY VARCHAR2);
289
290 PROCEDURE Del_sll_lvlelement(p_top_line_id IN NUMBER,
291 x_return_status OUT NOCOPY VARCHAR2,
292 x_msg_count OUT NOCOPY NUMBER,
293 x_msg_data OUT NOCOPY VARCHAR2);
294
295
296 Procedure Adjust_interface_date(p_line_id IN NUMBER,
297 p_invoice_rule_id IN Number,
298 p_line_end_date IN DATE,
299 p_lse_id IN NUMBER,
300 x_bs_tbl OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
301 x_return_status OUT NOCOPY VARCHAR2,
302 x_msg_count OUT NOCOPY NUMBER,
303 x_msg_data OUT NOCOPY VARCHAR2);
304
305
306 -------------------------------------------------------------------------
307 -- Begin partial period computation logic
308 -- Developer Mani Choudhary
309 -- Date 09-MAY-2005
310 -------------------------------------------------------------------------
311 PROCEDURE Create_Subcription_LvlEle
312 (p_billing_type IN VARCHAR2,
313 p_sll_tbl IN StrmLvl_Out_tbl,
314 p_line_rec IN Line_Det_Type,
315 p_term_dt IN DATE,
316 p_invoice_ruleid IN Number,
317 p_period_start IN VARCHAR2,
318 p_period_type IN VARCHAR2,
319 x_return_status OUT NOCOPY Varchar2);
320 -------------------------------------------------------------------------
321 -- End partial period computation logic
322 -- Date 09-MAY-2005
323 -------------------------------------------------------------------------
324
325 FUNCTION Find_term_amt(p_cycle_st_dt IN DATE,
326 p_term_dt IN DATE,
327 p_cycle_end_dt IN DATE,
328 p_amount IN NUMBER) RETURN NUMBER;
329
330 PROCEDURE Get_SLL_info(p_top_line_id IN NUMBER,
331 p_line_id IN NUMBER,
332 x_sll_tbl OUT NOCOPY StrmLvl_Out_tbl,
333 x_sll_db_tbl OUT NOCOPY OKS_BILL_SCH.StreamLvl_tbl,
334 x_return_status OUT NOCOPY VARCHAR2);
335
336 PROCEDURE Del_line_sll_lvl(p_line_id IN NUMBER,
337 x_return_status OUT NOCOPY VARCHAR2,
338 x_msg_count OUT NOCOPY NUMBER,
339 x_msg_data OUT NOCOPY VARCHAR2);
340
341
342
343 Procedure Populate_end_date(p_line_id IN NUMBER,
344 p_end_date IN DATE,
345 p_term_date IN DATE,
346 p_lse_id IN NUMBER,
347 x_return_status OUT NOCOPY VARCHAR2);
348
349 PROCEDURE Rollup_lvl_amt(
350 p_Line_Rec IN Line_Det_Type,
351 p_SubLine_rec IN Prod_Det_Type,
352 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
353 x_return_status OUT NOCOPY VARCHAR2);
354
355 PROCEDURE Adjust_cp_trx_inv_dt(
356 p_top_bs_tbl IN oks_bill_level_elements_pvt.letv_tbl_type,
357 p_SubLine_id IN NUMBER,
358 x_cp_line_bs OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
359 x_return_status OUT NOCOPY VARCHAR2);
360
361 PROCEDURE Adjust_billed_lvl_element(p_new_cp_id IN NUMBER,
362 P_old_cp_bs_tbl IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
363 x_new_cp_bs_tbl OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
364 x_return_status OUT NOCOPY VARCHAR2);
365
366 Procedure Prorate_sll_amt(
367 p_old_cp_amt IN NUMBER,
368 p_new_cp_amt IN NUMBER,
369 p_total_amt IN NUMBER,
370 p_new_sll_tbl IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
371 p_old_sll_tbl IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
372 x_return_status OUT NOCOPY VARCHAR2);
373
374
375 l_currency_code Varchar2(15);
376 l_header_billing NUMBER;
377 ---------------end of local package declaration---------------
378
379 -------------------------------------------------------------------------
380 -- Begin partial period computation logic
381 -- Developer Mani Choudhary
382 -- Date 09-MAY-2005
383 -- This Function will calculate the converted unit price from price_uom
384 -- to Billing_uom for covered product and covered item. For covered levels
385 -- other than covered product and covered item, it will calculate the unit
386 -- price per Billing uom using Time Measure APIs.
387 -------------------------------------------------------------------------
388 FUNCTION Get_Unit_Price_Per_Uom (
389 P_cle_id IN NUMBER,
390 P_billing_uom IN VARCHAR2,
391 P_period_start IN VARCHAR2,
392 P_period_type IN VARCHAR2,
393 P_duration IN NUMBER,
394 p_end_date IN DATE,
395 p_term_date IN DATE
396 )
397 RETURN NUMBER
398 AS
399 --Declare variables or cursors
400 Cursor line_dtl_csr(p_cle_id in NUMBER) IS
401 SELECT lin.start_date,
402 Lin.end_date,
403 Lin.price_negotiated,
404 lin.price_unit*itm.number_of_items unit_price,
405 Lin.lse_id,
406 --lin.price_unit*itm.number_of_items*kln.toplvl_price_qty total_amount, --bug#5359695 commented
407 nvl(Lin.price_negotiated,0) total_amount, --bug#5359695
408 kln.price_uom,
409 kln.toplvl_uom_code,
410 nvl(kln.ubt_amount,0) ubt_amount --bug#5359695
411 FROM okc_k_lines_b lin,
412 Oks_k_lines_b kln,
413 Okc_k_items itm
414 WHERE kln.cle_id = lin.id and
415 itm.cle_id = lin.id and
416 lin.id = p_cle_id;
417
418 --Total already billed amount in case of partially billed case
419 Cursor total_billed_csr (p_cle_id IN NUMBER) IS
420 SELECT nvl(sum(bsl.amount),0) amount,
421 max(bsl.date_billed_From) date_billed_From,
422 max(bsl.date_billed_to) date_billed_to
423 FROM oks_bill_sub_lines bsl
424 WHERE bsl.cle_id = p_cle_id;
425
426
427 Cursor check_sub_instance IS
428 SELECT 'Y'
429 FROM okc_k_items itm,
430 oks_subscr_header_b sub
431 WHERE itm.cle_id = P_cle_id
432 AND sub.instance_id = itm.object1_id1;
433
434 CURSOR om_period_csr IS
435 select oel.service_period
436 from okc_k_rel_objs rel,
437 oe_order_lines_all oel
438 where rel.cle_id = P_cle_id
439 and oel.line_id = rel.object1_id1;
440
441
442 l_sub_instance_check VARCHAR2(1);
443 l_duration NUMBER;
444 l_uom VARCHAR2(30);
445 l_start_date DATE;
446 l_unit_price NUMBER;
447 l_quantity NUMBER;
448 l_target_quantity NUMBER;
449 l_source_quantity NUMBER;
450 l_conversion_factor NUMBER;
451 x_return_status VARCHAR2(1);
452 l_price_negotiated NUMBER;
453 lin_det_rec line_dtl_csr%rowtype;
454 total_billed_rec total_billed_csr%rowtype;
455 l_amount NUMBER;
456 l_source_unit_price NUMBER;
457
458 BEGIN
459 --Fetch the line details.
460 Open line_dtl_csr(p_cle_id);
461 Fetch line_dtl_csr into lin_det_rec;
462 Close line_dtl_csr;
463
464 --Fix for bug#5623498 unit price will be recalculated based on
465 --duration based uom if pricelist is not present
466 okc_time_util_pub.get_duration(lin_det_rec.start_date,p_end_date,l_duration,l_uom,x_return_status);
467 --errorout_ad(' l_uom '||l_uom);
468 --errorout_ad(' l_duration '||l_duration);
469 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
470 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.product_pricing.price_uom_is_null',
471 'after calling okc_time_util_pub.get_duration '
472 ||' result l_duration = ' || l_duration||',l_uom = '||l_uom);
473 END IF;
474
475
476 l_source_unit_price := lin_det_rec.unit_price;
477
478 -- get total billed amount
479 Open total_billed_csr(p_cle_id);
480 Fetch total_billed_csr into total_billed_rec;
481 Close total_billed_csr;
482
483 --changed for bug#5359695
484 l_price_negotiated := lin_det_rec.total_amount;
485
486
487
488
489 IF p_term_date IS NOT NULL THEN
490 IF lin_det_rec.total_amount <= total_billed_rec.amount THEN
491 l_price_negotiated := total_billed_rec.amount + lin_det_rec.ubt_amount;
492 ELSE
493 l_price_negotiated := lin_det_rec.total_amount + lin_det_rec.ubt_amount;
494 END IF;
495 END IF;
496
497 --end changes for bug#5359695
498
499 -- recalculate the unit price
500 IF lin_det_rec.lse_id in (7,9,25) THEN
501 l_duration := OKS_TIME_MEASURES_PUB.get_quantity (
502 p_start_date => lin_det_rec.start_date,
503 p_end_date => lin_det_rec.end_date,
504 p_source_uom => nvl(lin_det_rec.toplvl_uom_code,l_uom),
505 p_period_type => p_period_type,
506 p_period_start => p_period_start
507 );
508 l_source_unit_price := l_price_negotiated/l_duration;
509 END IF;
510
511 l_sub_instance_check := NULL;
512 --subscription instance can only be attached as service product/Exntended warranty product
513 IF lin_det_rec.lse_id in (9,25) THEN
514 Open check_sub_instance;
515 Fetch check_sub_instance into l_sub_instance_check;
516 Close check_sub_instance;
517 END IF;
518
519 --For the following lse_ids, QP is invoked for pricing.
520 --lse_id 7 is item
521 --lse_id 9 is product
522 --lse_id 25 is product for extended warranty
523 IF lin_det_rec.lse_id in (7,9,25) AND (nvl(l_sub_instance_check,'X') <> 'Y') THEN
524
525 --errorout_ad(' max date '||to_char(total_billed_rec.date_billed_to));
526 --mchoudha fix for bug#5158185
527 --added the condition p_term_date is null so that the following logic doesn't get called
528 --in case of termination
529 IF (total_billed_rec.date_billed_to is not null)
530 AND p_term_date is null THEN
531 IF (total_billed_rec.date_billed_to < p_end_date)
532 THEN -- partially Billed cases
533 l_amount := lin_det_rec.price_negotiated - total_billed_rec.amount;
534 l_duration := OKS_TIME_MEASURES_PUB.get_quantity (
535 p_start_date => total_billed_rec.date_billed_to+1,
536 p_end_date => p_end_date,
537 p_source_uom => P_billing_uom,--nvl(lin_det_rec.price_uom,l_uom), --target uom
538 p_period_type => p_period_type,
539 p_period_start => p_period_start
540 );
541 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
542 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.product_pricing.partially_billed_cases',
543 'after calling OKS_TIME_MEASURES_PUB.get_quantity with parameters p_period_type '||p_period_type||' p_period_start '||p_period_start
544 ||' result l_duration = ' || l_duration);
545 END IF;
546
547 IF nvl(l_duration,0) = 0 THEN
548 RAISE G_EXCEPTION_HALT_VALIDATION;
549 END IF;
550 l_unit_price := l_amount/l_duration; -- recalculaing unit price
551 l_start_date := total_billed_rec.date_billed_to+1;
552 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
553 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.product_pricing.partially_billed_cases',
554 ' recalculated unit price l_unit_price = ' || l_unit_price);
555 END IF;
556
557 ELSE -- billed to => l end date, 100% billed cases
558 RETURN(0);
559 END IF;
560 ELSE --billed to is null = never billed cases
561 IF nvl(lin_det_rec.toplvl_uom_code,l_uom) <> P_billing_uom THEN
562 l_unit_price := OKS_BILL_SCH.Get_Converted_price(
563 p_price_uom =>P_billing_uom,
564 p_pl_uom =>nvl(lin_det_rec.toplvl_uom_code,l_uom),
565 p_period_start =>p_period_start,
566 p_period_type =>p_period_type,
567 p_price_negotiated =>l_price_negotiated,
568 p_unit_price =>l_source_unit_price,
569 p_start_date =>lin_det_rec.start_date,
570 p_end_date =>lin_det_rec.end_date
571 );
572 IF l_unit_price is NULL THEN
573 RAISE G_EXCEPTION_HALT_VALIDATION;
574 END IF;
575 ELSE
576 l_unit_price := l_source_unit_price;
577 END IF;
578 l_start_date := lin_det_rec.start_date;
579 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
580 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.product_pricing.unbilled_case',
581 ' l_unit_price = ' || l_unit_price);
582 END IF;
583
584 END IF;
585 --
586
587
588 Return nvl(l_unit_price*p_duration,0);
589
590
591 ELSE -- Manual pricing for other covered levels for subline and for negotiated price Usage)
592 IF(total_billed_rec.date_billed_to is not null)
593 THEN -- partial billed cases
594 IF (total_billed_rec.date_billed_to < p_end_date)
595 THEN
596 l_amount := lin_det_rec.price_negotiated - total_billed_rec.amount;
597 l_duration :=OKS_TIME_MEASURES_PUB.get_quantity(
598 p_start_date => total_billed_rec.date_billed_to+1,
599 p_end_date => p_end_date,
600 p_source_uom => p_billing_uom,
601 p_period_type => p_period_type,
602 p_period_start => p_period_start
603 );
604 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
605 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.manual_pricing.partially_billed_cases',
606 'after calling OKS_TIME_MEASURES_PUB.get_quantity with parameters p_period_type '||p_period_type||' p_period_start '||p_period_start
607 ||' result l_duration = ' || l_duration);
608 END IF;
609 IF nvl(l_duration,0) = 0 THEN
610 RAISE G_EXCEPTION_HALT_VALIDATION;
611 END IF;
612 --changed from l_quantity to l_duration
613 l_unit_price := l_amount/l_duration;
614 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
615 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.manual_pricing.partailly_billed_cases',
616 ' returned unit price = ' || l_unit_price);
617 END IF;
618 Return nvl(l_unit_price*p_duration,0);
619 ELSE -- billed to >= l end date, 100% billed cases
620 RETURN(0);
621 END IF;
622
623 ELSE -- unbilled cases
624 l_amount := lin_det_rec.price_negotiated;
625 l_start_date := lin_det_rec.start_date;
626
627 l_quantity := OKS_TIME_MEASURES_PUB.get_quantity
628 (p_start_date => l_start_date,
629 p_end_date => p_end_date,
630 p_source_uom => p_billing_uom,
631 p_period_type => p_period_type,
632 p_period_start => p_period_start);
633
634 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
635 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.manual_pricing.unbilled_cases',
636 'after calling OKS_TIME_MEASURES_PUB.get_quantity with parameters p_period_type '||p_period_type||' p_period_start '||p_period_start
637 ||' result l_quantity = ' || l_quantity);
638 END IF;
639
640 IF nvl(l_quantity,0) = 0 THEN
641 RAISE G_EXCEPTION_HALT_VALIDATION;
642 END IF;
643 --errorout_ad(' l_quantity '||l_quantity);
644 --errorout_ad(' l_amount '||l_amount);
645 l_unit_price := l_amount/l_quantity;
646 --errorout_ad(' l_unit_price '||l_unit_price);
647 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
648 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.manual_pricing.unbilled_cases',
649 ' returned unit price = ' || l_unit_price);
650 END IF;
651
652 Return nvl(l_unit_price*p_duration,0);
653 END IF;
654 END IF;
655
656 EXCEPTION
657 WHEN G_EXCEPTION_HALT_VALIDATION THEN
658 RETURN NULL;
659 WHEN OTHERS THEN
660 --set the error message and return with NULL to notify the
661 --caller of error
662 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
663 p_msg_name => G_UNEXPECTED_ERROR,
664 p_token1 => G_SQLCODE_TOKEN,
665 p_token1_value => sqlcode,
666 p_token2 => G_SQLERRM_TOKEN,
667 p_token2_value => sqlerrm);
668
669 RETURN NULL;
670
671 END get_unit_price_per_uom;
672
673 -------------------------------------------------------------------------
674 -- Begin partial period computation logic
675 -- Developer Mani Choudhary
676 -- Date 18-SEP-2005
677 -- This Function will calculate the converted price from price_list_uom
678 -- to price_uom for covered product and covered item.
679 -------------------------------------------------------------------------
680 FUNCTION Get_Converted_price (
681 p_price_uom IN VARCHAR2,
682 p_pl_uom IN VARCHAR2,
683 p_period_start IN VARCHAR2,
684 p_period_type IN VARCHAR2,
685 p_price_negotiated IN NUMBER,
686 p_unit_price IN NUMBER,
687 p_start_date IN DATE,
688 p_end_date IN DATE
689
690 )
691 RETURN NUMBER
692 AS
693 --Declare variables or cursors
694 l_quantity NUMBER;
695 l_return_status VARCHAR2(1);
696 l_source_uom_quantity NUMBER;
697 l_source_tce_code VARCHAR2(30);
698 l_target_uom_quantity NUMBER;
699 l_target_tce_code VARCHAR2(30);
700 l_target_qty NUMBER;
701
702 BEGIN
703 OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
704 (p_timeunit => p_price_uom,
705 x_return_status => l_return_status,
706 x_quantity => l_target_uom_quantity ,
707 x_timeunit => l_target_tce_code);
708
709 IF l_return_status <> 'S' THEN
710 RAISE G_EXCEPTION_HALT_VALIDATION;
711 END IF;
712
713 OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
714 (p_timeunit => p_pl_uom,
715 x_return_status => l_return_status,
716 x_quantity => l_source_uom_quantity ,
717 x_timeunit => l_source_tce_code);
718
719 IF l_return_status <> 'S' THEN
720 RAISE G_EXCEPTION_HALT_VALIDATION;
721 END IF;
722
723 IF p_period_type = 'FIXED' THEN
724
725 --When source uom is seeded in terms of DAY
726 IF l_source_tce_code ='DAY' THEN
727 IF l_target_tce_code ='YEAR' THEN
728 l_target_qty:= p_unit_price*((360*l_target_uom_quantity)/l_source_uom_quantity);
729 ELSIF l_target_tce_code ='MONTH' THEN
730 l_target_qty:= p_unit_price*((30*l_target_uom_quantity)/l_source_uom_quantity);
731 ELSIF l_target_tce_code ='DAY' THEN
732 l_target_qty:= p_unit_price*(l_target_uom_quantity/l_source_uom_quantity);
733 END IF;
734 --When source uom is seeded in terms of MONTH
735 ELSIF l_source_tce_code ='MONTH' THEN
736 IF l_target_tce_code ='YEAR' THEN
737 l_target_qty:= p_unit_price*((12*l_target_uom_quantity)/l_source_uom_quantity);
738 ELSIF l_target_tce_code ='MONTH' THEN
739 l_target_qty:= p_unit_price*(l_target_uom_quantity/l_source_uom_quantity);
740 ELSIF l_target_tce_code ='DAY' THEN
741 l_target_qty:= p_unit_price*(l_target_uom_quantity/(l_source_uom_quantity*30));
742 END IF;
743 --When source uom is seeded in terms of YEAR
744 ELSIF l_source_tce_code ='YEAR' THEN
745 IF l_target_tce_code ='YEAR' THEN
746 l_target_qty:= p_unit_price*(l_target_uom_quantity/l_source_uom_quantity);
747 ELSIF l_target_tce_code ='MONTH' THEN
748 l_target_qty:= p_unit_price*(l_target_uom_quantity/(l_source_uom_quantity*12));
749 ELSIF l_target_tce_code ='DAY' THEN
750 l_target_qty:= p_unit_price*(l_target_uom_quantity/(l_source_uom_quantity*360));
751 END IF;
752
753 END IF;
754 return (l_target_qty);
755 END IF;
756
757 l_quantity := OKS_TIME_MEASURES_PUB.get_quantity
758 (p_start_date => p_start_date,
759 p_end_date => p_end_date,
760 p_source_uom => p_price_uom,
761 p_period_type => p_period_type,
762 p_period_start => p_period_start);
763
764 RETURN p_price_negotiated/l_quantity;
765
766 EXCEPTION
767 WHEN G_EXCEPTION_HALT_VALIDATION THEN
768 RETURN NULL;
769 WHEN OTHERS THEN
770 --set the error message and return with NULL to notify the
771 --caller of error
772 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
773 p_msg_name => G_UNEXPECTED_ERROR,
774 p_token1 => G_SQLCODE_TOKEN,
775 p_token1_value => sqlcode,
776 p_token2 => G_SQLERRM_TOKEN,
777 p_token2_value => sqlerrm);
778
779 RETURN NULL;
780
781 END Get_Converted_price;
782
783
784 Procedure Create_Header_Bill_Sch
785 (
786 p_billing_type IN Varchar2
787 , p_sll_tbl IN StreamLvl_tbl
788 , p_invoice_rule_id IN Number
789 , x_bil_sch_out_tbl OUT NOCOPY ItemBillSch_tbl
790 , x_return_status OUT NOCOPY Varchar2
791 )
792 IS
793
794 Cursor l_contract_Csr(l_contract_id number) Is
795 SELECT id, TRUNC(start_date) start_dt,
796 nvl(trunc(date_terminated - 1) ,TRUNC(end_date)) end_dt
797 FROM okc_k_headers_b
798 WHERE Id = l_contract_id ;
799
800 Cursor l_top_line_Csr(l_contract_id number, l_hdr_date date) Is
801 SELECT line.id id, line.inv_rule_id inv_rule_id, line.lse_id lse_id,
802 det.usage_type usage_type
803 FROM OKC_K_LINES_b line, oks_k_lines_b det
804 WHERE line.dnz_chr_id = l_contract_id
805 AND line.lse_id IN (1, 12, 14, 19, 46)
806 AND line.id = det.cle_id;
807
808
809
810
811
812 l_Top_Line_Rec l_Top_Line_Csr%Rowtype;
813 l_Contract_Rec l_contract_Csr%Rowtype;
814 l_sll_out_tbl StrmLvl_Out_tbl;
815 l_sll_count NUMBER;
816 l_bil_sch_out_tbl ItemBillSch_tbl;
817 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
818 l_line_inv_id NUMBER;
819 --
820
821 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
822 l_return_status VARCHAR2(10);
823 l_msg_count NUMBER;
824 l_msg_data VARCHAR2(2000);
825 l_msg_index_out NUMBER;
826 l_msg_index NUMBER;
827 --
828
829 -------------------------------------------------------------------------
830 -- Begin partial period computation logic
831 -- Developer Mani Choudhary
832 -- Date 04-MAY-2005
833 -------------------------------------------------------------------------
834 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
835 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
836 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
837 -------------------------------------------------------------------------
838 /* Start Addition for bug fix 5945006 (FP Bug for 5926840) */
839 CURSOR c_khr_csr(c_chr_id IN NUMBER) IS
840 SELECT khr.acct_rule_id acct_rule_id
841 FROM oks_k_headers_b khr
842 WHERE khr.chr_id = c_chr_id;
843
844 l_acct_rule_id NUMBER;
845
846 CURSOR c_subline_csr(c_topline_id IN NUMBER) IS
847 SELECT cle.id
848 FROM okc_k_lines_b cle
849 WHERE cle.cle_id = c_topline_id
850 AND cle.lse_id IN(7,8,9,10,11,13,25,35);
851 /* End Addition for bug fix 5945006 (FP Bug for 5926840) */
852
853
854 Begin
855 x_return_status := 'S';
856
857 IF p_sll_tbl.count = 0 THEN
858 x_return_status := 'S';
859 l_header_billing := null;
860 RETURN;
861 END IF;
862
863 l_header_billing := p_sll_tbl(p_sll_tbl.FIRST).chr_id;
864 -------------------------------------------------------------------------
865 -- Begin partial period computation logic
866 -- Developer Mani Choudhary
867 -- Date 09-MAY-2005
868 -------------------------------------------------------------------------
869 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
870 (
871 p_hdr_id => l_header_billing,
872 p_org_id => NULL,
873 x_period_start => l_period_start,
874 x_period_type => l_period_type,
875 x_price_uom => l_price_uom,
876 x_return_status => x_return_status);
877
878 IF x_return_status <> 'S' THEN
879 RAISE G_EXCEPTION_HALT_VALIDATION;
880 END IF;
881
882
883 -------------------------------------------------------------------------
884 -- End partial period computation logic
885 -- Date 09-MAY-2005
886 -------------------------------------------------------------------------
887
888
889 IF p_billing_type IS NULL THEN
890 OKC_API.set_message(G_PKG_NAME,'BILLING SCHEDULE TYPE');
891 x_return_status := 'E';
892 RAISE G_EXCEPTION_HALT_VALIDATION;
893 END IF;
894
895
896
897 IF p_invoice_rule_id IS NULL THEN
898 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'INVOICE ID NULL.');
899 x_return_status := 'E';
900 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
901 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
902 'p_invoice_rule_id null');
903 END IF;
904 RAISE G_EXCEPTION_HALT_VALIDATION;
905 END IF;
906
907
908 ------------find out the line details
909
910 Open l_contract_Csr(p_sll_tbl(p_sll_tbl.FIRST).chr_id);
911 Fetch l_contract_Csr Into l_contract_Rec;
912
913 If l_contract_Csr%Notfound then
914 Close l_contract_Csr;
915 x_return_status := 'E';
916 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
917 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
918 'contract dtls not found. = ' || p_sll_tbl(p_sll_tbl.FIRST).chr_id);
919 END IF;
920 RAISE G_EXCEPTION_HALT_VALIDATION;
921 End If;
922 Close l_contract_Csr;
923
924 /* Start Addition for bug fix 5945006 (FP Bug for 5926840) */
925 OPEN c_khr_csr(p_sll_tbl(p_sll_tbl.FIRST).chr_id);
926 FETCH c_khr_csr INTO l_acct_rule_id;
927 IF c_khr_csr%NOTFOUND
928 THEN
929 CLOSE c_khr_csr;
930 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level
931 THEN
932 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
933 'Accounting rule id not found for header id = ' || p_sll_tbl(p_sll_tbl.FIRST).chr_id);
934 END IF;
935 RAISE G_EXCEPTION_HALT_VALIDATION;
936 END IF;
937 CLOSE c_khr_csr;
938 /* End Addition for bug fix 5945006 (FP Bug for 5926840) */
939
940
941 l_currency_code := Find_Currency_Code(
942 p_cle_id => NULL,
943 p_chr_id => p_sll_tbl(p_sll_tbl.FIRST).chr_id);
944 IF l_currency_code IS NULL THEN
945 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
946 x_return_status := 'E';
947 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
948 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
949 'currency code not found.');
950 END IF;
951 RETURN;
952 END IF;
953
954 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
955
956 fnd_log.STRING (fnd_log.level_statement,
957 G_MODULE_CURRENT || '.create_header_bill_sch.dtls',
958 'currency_code = ' || l_currency_code
959 || ', p_invoice_rule_id = ' || p_invoice_rule_id
960 || ', p_billing_type = ' || p_billing_type
961 );
962 END IF;
963
964 /*UPDATE OKS_K_HEADERS_B SET billing_schedule_type = p_billing_type
965 WHERE chr_id = l_Contract_Rec.id;*/
966
967 -----create 'SLL' REC
968 -------------------------------------------------------------------------
969 -- Begin partial period computation logic
970 -- Developer Mani Choudhary
971 -- Date 09-MAY-2005
972 -- Added two new parameters P_period_start,P_period_type in procedural call
973 -------------------------------------------------------------------------
974 --Bug Fix 5185658
975 pkg_cascade_billing_hdr := 'Y';
976
977 Create_Stream_Level (p_billing_type => p_billing_type,
978 p_strm_lvl_tbl => p_sll_tbl,
979 p_dnz_chr_id => l_Contract_Rec.id,
980 p_subline_call => 'H',
981 p_line_amt => NULL,
982 p_subline_amt => NULL,
983 p_sll_start_dt => l_contract_rec.start_dt,
984 p_end_dt => l_contract_rec.end_dt,
985 p_period_start => l_period_start,
986 p_period_type => l_period_type,
987 x_sll_out_tbl => l_sll_out_tbl,
988 x_return_status => x_return_status);
989 -------------------------------------------------------------------------
990 -- End partial period computation logic
991 -- Date 09-MAY-2005
992 -------------------------------------------------------------------------
993
994 -----errorout_ad('Create_Stream_Level status = ' || x_return_status);
995 -----errorout_ad('TOTAL SLL COUNT for line'|| TO_CHAR(l_sll_out_tbl.COUNT));
996
997 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
998 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_header_bill_sch.create_hdr_sll',
999 'Create_Stream_Level(x_return_status = '||x_return_status
1000 ||', sll tbl out count = '||l_sll_out_tbl.count||')');
1001 END IF;
1002
1003 IF x_return_status <> 'S' THEN
1004 RAISE G_EXCEPTION_HALT_VALIDATION;
1005 END IF;
1006
1007 ----if l_sll_out_tbl.count > 0 then insert lines into oks_level_elements
1008 IF l_sll_out_tbl.count > 0 then
1009 -------------------------------------------------------------------------
1010 -- Begin partial period computation logic
1011 -- Developer Mani Choudhary
1012 -- Date 09-MAY-2005
1013 -- Added two new parameters p_period_start and p_period_type
1014 -------------------------------------------------------------------------
1015 Create_Hdr_Level_elements(
1016 p_billing_type => p_billing_type,
1017 p_sll_tbl => l_sll_out_tbl,
1018 p_hdr_rec => l_contract_rec,
1019 p_invoice_ruleid => p_invoice_rule_id,
1020 p_called_from => 1,
1021 p_period_start => l_period_start,
1022 p_period_type => l_period_type,
1023 x_return_status => x_return_status);
1024
1025 -----errorout_ad('Create_Hdr_Level_elements status = ' || x_return_status);
1026
1027 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1028 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_header_bill_sch.create_hdr_lvl',
1029 'Create_Hdr_Level_elements(x_return_status = '||x_return_status
1030 ||', sll tbl out count passed = '||l_sll_out_tbl.count||')');
1031 END IF;
1032
1033 IF x_return_status <> 'S' THEN
1034 RAISE G_EXCEPTION_HALT_VALIDATION;
1035 END IF;
1036 ELSE
1037 -----errorout_ad('sll count = ' || to_char(0));
1038 x_return_status := 'E';
1039 RAISE G_EXCEPTION_HALT_VALIDATION;
1040 END IF ;
1041
1042 ----create schedule for all lines.
1043
1044 FOR l_top_line_rec IN l_top_line_csr(l_contract_rec.id, l_contract_rec.start_dt)
1045 LOOP
1046
1047 IF l_top_line_rec.lse_id = 12 AND l_top_line_rec.usage_type in ('VRT', 'QTY')
1048 AND p_invoice_rule_id = -2 THEN
1049
1050 l_line_inv_id := -3;
1051 ELSE
1052 l_line_inv_id := NULL;
1053
1054 END IF;
1055
1056
1057 IF (nvl(l_top_line_rec.inv_rule_id , 0 ) <> p_invoice_rule_id ) OR l_line_inv_id IS NOT NULL THEN
1058
1059 UPDATE okc_k_lines_b SET inv_rule_id = nvl(l_line_inv_id,p_invoice_rule_id)
1060 WHERE id = l_top_line_rec.id;
1061
1062
1063 END IF;
1064 /* Start Addition for bug fix 5945006 (FP Bug for 5926840) */
1065 UPDATE oks_k_lines_b
1066 SET acct_rule_id = l_acct_rule_id
1067 WHERE cle_id = l_top_line_rec.id;
1068 /* End Addition for bug fix 5945006 (FP Bug for 5926840) */
1069
1070
1071
1072 l_sll_tbl := p_sll_tbl;
1073
1074 ---chnage the sll tbl to call for line
1075
1076 FOR l_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
1077 LOOP
1078
1079 l_sll_tbl(l_index).id := NULL;
1080 l_sll_tbl(l_index).cle_id := l_top_line_rec.id;
1081 l_sll_tbl(l_index).chr_id := NULL;
1082 l_sll_tbl(l_index).dnz_chr_id := l_contract_rec.id;
1083 --Start 25-APR-2005 mchoudha Fix for bug#4306152
1084 IF nvl(l_line_inv_id,p_invoice_rule_id) = -3 THEN
1085 l_sll_tbl(l_index).invoice_offset_days := NULL;
1086 END IF;
1087 --End 25-APR-2005 mchoudha Fix for bug#4306152
1088 END LOOP;
1089
1090
1091 Create_Bill_Sch_Rules(
1092 p_billing_type => p_billing_type,
1093 p_sll_tbl => l_sll_tbl,
1094 p_invoice_rule_id => nvl(l_line_inv_id,p_invoice_rule_id),
1095 x_bil_sch_out_tbl => l_bil_sch_out_tbl,
1096 x_return_status => x_return_status);
1097
1098 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1099 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_header_bill_sch.create_line_bs',
1100 'Create_Bill_Sch_Rules(x_return_status = '||x_return_status
1101 ||', line id = '||l_sll_tbl(l_sll_tbl.first).cle_id||')');
1102 END IF;
1103
1104 -----errorout_ad('Create_Bill_Sch_Rules status = ' || x_return_status);
1105 IF x_return_status <> 'S' THEN
1106 RAISE G_EXCEPTION_HALT_VALIDATION;
1107 END IF;
1108 /* Start Addition for bug fix 5945006 (FP Bug for 5926840) */
1109 FOR c_subline_rec IN c_subline_csr(l_top_line_rec.id)
1110 LOOP
1111 UPDATE oks_k_lines_b
1112 SET acct_rule_id = l_acct_rule_id
1113 WHERE cle_id = c_subline_rec.id;
1114 END LOOP;
1115 /* End Addition for bug fix 5945006 (FP Bug for 5926840) */
1116
1117 END LOOP;
1118
1119 Copy_Bill_Sch(
1120 p_chr_id => l_contract_rec.id,
1121 p_cle_id => NULL,
1122 x_copy_bill_sch => x_bil_sch_out_tbl,
1123 x_return_status => x_return_status);
1124
1125 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1126 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_header_bill_sch.hdr_bs_return',
1127 'Copy_Bill_Sch(x_return_status = '||x_return_status
1128 ||', level element count = '|| x_bil_sch_out_tbl.count ||')');
1129 END IF;
1130
1131 -----errorout_ad('Copy_Bill_Sch = ' || x_return_status);
1132
1133 EXCEPTION
1134 WHEN G_EXCEPTION_HALT_VALIDATION THEN
1135 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
1136 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
1137 'G_EXCEPTION_HALT_VALIDATION');
1138 END IF;
1139
1140 l_currency_code := NULL;
1141 l_header_billing := NULL;
1142
1143 WHEN OTHERS THEN
1144
1145 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
1146 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_header_bill_sch.UNEXPECTED',
1147 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
1148 END IF;
1149 l_currency_code := NULL;
1150 l_header_billing := NULL;
1151 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
1152 p_msg_name => G_UNEXPECTED_ERROR,
1153 p_token1 => G_SQLCODE_TOKEN,
1154 p_token1_value => sqlcode,
1155 p_token2 => G_SQLERRM_TOKEN,
1156 p_token2_value => sqlerrm);
1157
1158 x_return_status := G_RET_STS_UNEXP_ERROR;
1159
1160 END Create_Header_Bill_Sch;
1161
1162
1163
1164
1165 Procedure Create_Bill_Sch_Rules
1166 ( p_billing_type IN VARCHAR2
1167 , p_sll_tbl IN StreamLvl_tbl
1168 , p_invoice_rule_id IN Number
1169 , x_bil_sch_out_tbl OUT NOCOPY ItemBillSch_tbl
1170 , x_return_status OUT NOCOPY Varchar2
1171 )
1172
1173 IS
1174 ------------------------------------------------------------------------
1175 -- Begin partial period computation logic
1176 -- Developer Mani Choudhary
1177 -- Date 17-MAY-2005
1178 -- Added price_uom and lse_id in the select clause
1179 -------------------------------------------------------------------------
1180 Cursor l_subLine_Csr(l_line_id number, l_style_id number) Is
1181 SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
1182 TRUNC(line.end_date) cp_end_dt, line.dnz_chr_id dnz_chr_id,
1183 TRUNC(line.date_terminated) cp_term_dt,
1184 price_UOM,lse_id cp_lse_id,
1185 dtl.billing_schedule_type billing_schedule_type,
1186 dtl.full_credit full_credit,
1187 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
1188 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) subline_amt
1189 FROM okc_k_lines_b line, oks_k_lines_b dtl
1190 WHERE line.cle_id = l_line_id
1191 AND line.date_cancelled is NULL
1192 AND line.id = dtl.cle_id
1193 AND ((l_style_id = 1 and line.lse_id in (35,7,8,9,10,11))
1194 OR (l_style_id = 12 and line.lse_id = 13)
1195 OR (l_style_id = 14 and line.lse_id = 18)
1196 OR (l_style_id = 19 and line.lse_id = 25));
1197 ------------------------------------------------------------------------
1198 -- Begin partial period computation logic
1199 -- Developer Mani Choudhary
1200 -- Date 17-MAY-2005
1201 -- Added price_uom in the select clause
1202 -------------------------------------------------------------------------
1203 Cursor l_Line_Csr(l_line_id number) Is
1204 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
1205 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
1206 line.cle_id cle_id,TRUNC(date_terminated) line_term_dt,
1207 dtl.full_credit full_credit,
1208 price_uom,
1209 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
1210 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
1211 FROM okc_k_lines_b line, oks_k_lines_b dtl
1212 WHERE line.id = dtl.cle_id AND line.Id = l_line_id
1213 AND line.date_cancelled is NULL;
1214
1215 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
1216
1217 SELECT id,trunc(date_start) date_start,
1218 amount,trunc(date_end) date_end,object_version_number,
1219 date_to_interface, date_transaction
1220 FROM oks_level_elements
1221 WHERE cle_id = p_line_id
1222 ORDER BY date_start;
1223
1224
1225 Cursor l_line_amt_csr (p_id in number) IS
1226 Select line.price_negotiated
1227 from okc_k_lines_b line
1228 where line.id = p_id;
1229
1230
1231
1232 l_Line_Csr_Rec l_Line_Csr%Rowtype;
1233 l_SubLine_Csr_Rec l_subLine_Csr%Rowtype;
1234 l_sll_out_tbl StrmLvl_Out_tbl;
1235 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
1236 l_line_BS_rec l_line_BS_csr%rowtype;
1237 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
1238
1239
1240 l_dnz_chr_id Number;
1241 l_sll_count NUMBER;
1242 l_index NUMBER;
1243 l_line_rec Line_Det_Type;
1244 l_cp_rec Prod_Det_Type;
1245 l_sll_start_dT DATE;
1246 l_cp_term_dt DATE;
1247 l_line_term_dt DATE;
1248 --
1249 l_api_version CONSTANT NUMBER := 1.0;
1250 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
1251 l_msg_count NUMBER;
1252 l_msg_data VARCHAR2(2000);
1253 l_msg_index_out NUMBER;
1254 l_msg_index NUMBER;
1255 -------------------------------------------------------------------------
1256 -- Begin partial period computation logic
1257 -- Developer Mani Choudhary
1258 -- Date 04-MAY-2005
1259 -------------------------------------------------------------------------
1260 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
1261 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
1262 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
1263 l_return_status VARCHAR2(30);
1264 l_tangible BOOLEAN;
1265 l_pricing_method VARCHAR2(30);
1266 -------------------------------------------------------------------------
1267 -- End partial period computation logic
1268 -- Date 04-MAY-2005
1269 -------------------------------------------------------------------------
1270 --
1271 Begin
1272
1273 x_return_status := 'S';
1274
1275 l_sll_tbl.delete;
1276
1277
1278 IF p_sll_tbl.count = 0 THEN
1279 x_return_status := 'S';
1280 RETURN;
1281 END IF;
1282
1283 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1284
1285 fnd_log.STRING (fnd_log.level_statement,
1286 G_MODULE_CURRENT || '.create_bill_sch_rules.passed_val',
1287 'p_sll_tbl count = ' || p_sll_tbl.count
1288 || ', p_invoice_rule_id = ' || p_invoice_rule_id
1289 || ', p_billing_type = ' || p_billing_type
1290 );
1291 END IF;
1292
1293 IF p_invoice_rule_id IS NULL THEN
1294 -- nechatur 23-DEC-2005 for bug#4684706
1295 -- OKC_API.set_message(G_PKG_NAME,'OKS_INVD_COV_RULE','RULE_NAME','IRE');
1296 OKC_API.set_message(G_PKG_NAME,'OKS_INVOICING_RULE');
1297 -- end bug#4684706
1298 x_return_status := 'E';
1299 RAISE G_EXCEPTION_HALT_VALIDATION;
1300 END IF;
1301
1302 IF p_billing_type IS NULL THEN
1303 OKC_API.set_message(G_PKG_NAME,'BILLING SCHEDULE TYPE');
1304 x_return_status := 'E';
1305 RAISE G_EXCEPTION_HALT_VALIDATION;
1306 END IF;
1307
1308 /* Line and subline details are fetched in different cursor as some of the top line (46)don't have subline
1309 and same API is called for subline BS in case of P
1310 otherwise the sql will have outer join*/
1311
1312 ------------find out the line details
1313
1314 Open l_Line_Csr(p_sll_tbl(p_sll_tbl.first).cle_id);
1315 Fetch l_Line_Csr Into l_Line_Csr_Rec;
1316
1317 If l_Line_Csr%Notfound then
1318 Close l_Line_Csr;
1319 x_return_status := 'E';
1320 RAISE G_EXCEPTION_HALT_VALIDATION;
1321 End If;
1322 l_dnz_chr_id := l_Line_Csr_Rec.dnz_chr_id;
1323 Close l_Line_Csr;
1324
1325 l_line_rec.chr_id := l_Line_Csr_Rec.chr_id;
1326 l_line_rec.dnz_chr_id := l_Line_Csr_Rec.dnz_chr_id;
1327 l_line_rec.id := l_Line_Csr_Rec.id ;
1328 l_line_rec.cle_id := l_Line_Csr_Rec.cle_id ;
1329 l_line_rec.lse_id := l_Line_Csr_Rec.lse_id;
1330 l_line_rec.line_start_dt := l_Line_Csr_Rec.line_start_dt;
1331 l_line_rec.line_end_dt := l_Line_Csr_Rec.line_end_dt;
1332 l_line_rec.line_amt := l_Line_Csr_Rec.line_amt ;
1333 l_line_rec.price_uom := l_Line_Csr_Rec.price_uom;
1334
1335 -------------------------------------------------------------------------
1336 -- Begin partial period computation logic
1337 -- Developer Mani Choudhary
1338 -- Date 09-MAY-2005
1339 -------------------------------------------------------------------------
1340
1341 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
1342 (
1343 p_hdr_id => l_Line_Csr_Rec.dnz_chr_id,
1344 p_org_id => NULL,
1345 x_period_start => l_period_start,
1346 x_period_type => l_period_type,
1347 x_price_uom => l_price_uom,
1348 x_return_status => x_return_status);
1349
1350 IF x_return_status <> 'S' THEN
1351 RAISE G_EXCEPTION_HALT_VALIDATION;
1352 END IF;
1353 --Description in detail for the business rules for deriving the period start
1354 --1)For usage , period start will always be 'SERVICE'
1355 --2)For Subscriptions, period start and period type will be NULL
1356 -- for tangible subscriptions as per CR1.For intangible subscriptions,
1357 -- if the profile OKS: Intangible Subscription Pricing Method
1358 -- is set to 'Subscription Based',then period start and period type will be NULL
1359 -- otherwise it will be 'SERVICE'
1360 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
1361
1362 IF l_period_start IS NOT NULL AND
1363 l_period_type IS NOT NULL
1364 THEN
1365 IF l_line_rec.lse_id =12 THEN
1366 l_period_start := 'SERVICE';
1367 END IF;
1368 IF l_line_rec.lse_id = 46 THEN
1369 --mchoudha fix for bug#5183011
1370 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (l_line_rec.id);
1371 IF l_tangible THEN
1372 l_period_start := NULL;
1373 l_period_type := NULL;
1374 ELSE
1375 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
1376 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
1377 l_period_start := NULL;
1378 l_period_type := NULL;
1379 ELSE
1380 l_period_start := 'SERVICE';
1381 END IF; -- l_pricing_method <> 'EFFECTIVITY'
1382 END IF; -- IF l_tangible THEN
1383 END IF; -- IF l_Line_Csr_Rec.lse_id = 46
1384 END IF; -- period start and period type are not NULL
1385 -------------------------------------------------------------------------
1386 -- End partial period computation logic
1387 -- Date 09-MAY-2005
1388 -------------------------------------------------------------------------
1389
1390 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1391
1392 fnd_log.STRING (fnd_log.level_statement,
1393 G_MODULE_CURRENT || '.create_bill_sch_rules.line_dtls',
1394 'dnz_chr_id = ' || l_line_rec.dnz_chr_id
1395 || ', id = ' || l_line_rec.id
1396 || ', lse_id = ' || l_line_rec.lse_id
1397 || ', start dt = ' || l_line_rec.line_start_dt
1398 || ', end dt = ' || l_line_rec.line_end_dt
1399 || ', amt = ' || l_line_rec.line_amt
1400 || ', full_credit flag = ' || l_Line_Csr_Rec.full_credit
1401 );
1402 END IF;
1403
1404
1405 IF l_header_billing IS NULL THEN
1406 l_currency_code := Find_Currency_Code(
1407 p_cle_id => p_sll_tbl(p_sll_tbl.first).cle_id,
1408 p_chr_id => NULL);
1409
1410 IF l_currency_code IS NULL THEN
1411 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
1412 x_return_status := 'E';
1413 RAISE G_EXCEPTION_HALT_VALIDATION;
1414 END IF;
1415 END IF;
1416
1417 ---FIND sll start date
1418 l_sll_start_dt := l_line_csr_rec.line_start_dt;
1419
1420
1421 -----create 'SLL'
1422
1423 UPDATE oks_k_lines_b set billing_schedule_type = p_billing_type
1424 WHERE cle_id = l_line_csr_rec.id;
1425
1426 -------------------------------------------------------------------------
1427 -- Begin partial period computation logic
1428 -- Developer Mani Choudhary
1429 -- Date 09-MAY-2005
1430 -- Added two new parameters P_period_start,P_period_type in procedural call
1431 -------------------------------------------------------------------------
1432 Create_Stream_Level
1433 (p_billing_type => p_billing_type,
1434 p_strm_lvl_tbl => p_sll_tbl,
1435 p_dnz_chr_id => l_line_csr_rec.dnz_chr_id,
1436 p_subline_call => 'N',
1437 p_line_amt => l_Line_Csr_Rec.line_amt,
1438 p_subline_amt => null,
1439 p_sll_start_dt => l_sll_start_dt,
1440 p_end_dt => l_line_rec.line_end_dt,
1441 p_period_start => l_period_start,
1442 p_period_type => l_period_type,
1443 x_sll_out_tbl => l_sll_out_tbl,
1444 x_return_status => x_return_status);
1445
1446 -----errorout_ad('TOTAL SLL COUNT for line'|| TO_CHAR(l_sll_out_tbl.COUNT));
1447 -----errorout_ad('Create_Stream_Level = ' || x_return_status);
1448
1449 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1450 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.line_sll',
1451 'Create_Stream_Level(x_return_status = '||x_return_status
1452 ||', l_sll_out_tbl count = '||l_sll_out_tbl.count||')');
1453 END IF;
1454
1455 IF x_return_status <> 'S' THEN
1456 RAISE G_EXCEPTION_HALT_VALIDATION;
1457 END IF;
1458
1459 ----if l_sll_out_tbl.count > 0 then insert lines into oks_level_elements
1460 IF l_sll_out_tbl.count <= 0 THEN
1461 -----errorout_ad('sll count = ' || to_char(0));
1462 x_return_status := 'E';
1463 RAISE G_EXCEPTION_HALT_VALIDATION;
1464 END IF;
1465
1466 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1467
1468 fnd_log.STRING (fnd_log.level_statement,
1469 G_MODULE_CURRENT || '.create_bill_sch_rules.copy_flag',
1470 'sll amt to be adjusted flag = ' || p_sll_tbl(p_sll_tbl.FIRST).comments
1471 );
1472 END IF;
1473
1474 ---Called from copy with flag to change lvl_amt of SLL for E and P billing type.
1475 IF p_sll_tbl(p_sll_tbl.FIRST).comments IS NOT NULL AND p_sll_tbl(p_sll_tbl.FIRST).comments = '99'
1476 AND p_billing_type IN ('E', 'P') THEN
1477
1478 l_sll_tbl := p_sll_tbl;
1479
1480 for i IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
1481 LOOP
1482 l_sll_tbl(i).level_amount := l_sll_out_tbl(i).amount;
1483 l_sll_tbl(i).comments := '' ;
1484 END LOOP;
1485 ELSE
1486 l_sll_tbl := p_sll_tbl;
1487 END IF; ---chk for flag passed from copy.
1488
1489 IF l_period_type is not null AND l_period_start is not NULL THEN
1490 OPEN l_line_amt_csr(l_Line_Csr_Rec.id);
1491 FETCH l_line_amt_csr INTO l_line_rec.line_amt;
1492 CLOSE l_line_amt_csr;
1493 END IF;
1494
1495 --FOR subcripTion line which is terminated
1496
1497 IF l_Line_Csr_Rec.lse_id = 46 AND l_Line_Csr_Rec.line_term_dt is not null THEN
1498
1499 --if full credit flag is 'Y' just delete the unbilled lvl elements
1500
1501 IF nvl(l_Line_Csr_Rec.full_credit, 'N') = 'Y' Then
1502 DELETE FROM OKS_LEVEL_ELEMENTS
1503 WHERE date_completed IS NULL
1504 AND cle_id = l_Line_Csr_Rec.id;
1505
1506
1507 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1508
1509 fnd_log.STRING (fnd_log.level_statement,
1510 G_MODULE_CURRENT || '.create_bill_sch_rules.del_lvl_ele',
1511 'unbilled lvl element deleted = ' || sql%rowcount
1512 );
1513 END IF;
1514
1515 ELSE
1516 -------------------------------------------------------------------------
1517 -- Begin partial period computation logic
1518 -- Developer Mani Choudhary
1519 -- Date 09-MAY-2005
1520 -------------------------------------------------------------------------
1521 Create_Subcription_LvlEle
1522 (p_billing_type => p_billing_type,
1523 p_sll_tbl => l_sll_out_tbl,
1524 p_line_rec => l_Line_rec,
1525 p_term_dt => l_Line_Csr_Rec.line_term_dt,
1526 p_invoice_ruleid => p_invoice_rule_id,
1527 p_period_start => l_period_start,
1528 p_period_type => l_period_type,
1529 x_return_status => x_return_status);
1530 -------------------------------------------------------------------------
1531 -- End partial period computation logic
1532 -- Date 09-MAY-2005
1533 -------------------------------------------------------------------------
1534
1535 -----errorout_ad('Create_Subcription_LvlEle status = ' || x_return_status);
1536
1537 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1538 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.lvl_ele',
1539 'Create_Subcription_LvlEle(x_return_status = '||x_return_status
1540 ||', l_sll_out_tbl passed = '||l_sll_out_tbl.count||')');
1541 END IF;
1542
1543 IF x_return_status <> 'S' THEN
1544 RAISE G_EXCEPTION_HALT_VALIDATION;
1545 END IF;
1546 END IF; ---chk for full credit
1547 RETURN;
1548
1549 END IF; ---chk for terminated subscription line
1550
1551 --for billing type 'P' , terminated sub line with full credit 'Y' change the term dt to
1552 --its start dt.(as this API is also called for subline from form in case of 'P')
1553
1554 IF p_billing_type = 'P' and l_Line_Csr_Rec.lse_id NOT IN (1, 12, 14, 19)
1555 AND l_line_csr_rec.line_term_dt IS NOT NULL AND nvl(l_line_csr_rec.full_credit, 'N') = 'Y' THEN
1556
1557 l_line_term_dt := l_line_csr_rec.line_start_dt;
1558 ELSE
1559 l_line_term_dt := l_line_csr_rec.line_term_dt;
1560 END IF; --chk for subline,billing type 'P' with full credit flag 'Y'
1561
1562 ---for all other cases and also lse_id = 46 and not terminated.
1563 -------------------------------------------------------------------------
1564 -- Begin partial period computation logic
1565 -- Developer Mani Choudhary
1566 -- Date 09-MAY-2005
1567 -- Added two new parameters p_period_start and p_period_type
1568 -------------------------------------------------------------------------
1569 Create_Level_elements
1570 (p_billing_type => p_billing_type,
1571 p_sll_tbl => l_sll_out_tbl,
1572 p_line_rec => l_Line_rec,
1573 p_invoice_ruleid => p_invoice_rule_id,
1574 p_term_dt => l_line_term_dt,
1575 p_period_start => l_period_start,
1576 p_period_type => l_period_type,
1577 x_return_status => x_return_status);
1578
1579 -----errorout_ad('Create_Level_elements status = ' || x_return_status);
1580
1581 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1582 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.lvl_ele',
1583 'Create_Level_elements(x_return_status = '||x_return_status
1584 ||', term dt passed = ' || l_line_term_dt
1585 ||', l_sll_out_tbl passed = '||l_sll_out_tbl.count||')');
1586 END IF;
1587
1588 IF x_return_status <> 'S' THEN
1589 RAISE G_EXCEPTION_HALT_VALIDATION;
1590 END IF;
1591
1592 l_top_bs_tbl.DELETE;
1593 l_index := 0;
1594 IF p_billing_type IN ('T','E') and l_Line_Csr_Rec.lse_id IN (1, 12, 14, 19) then ---only for top line
1595 l_index := l_index +1;
1596
1597 ---fecthing from db because if line is partially billed then billed lvl ele
1598 --don't get inserted again. for rollup amt all the lvl ele required.
1599
1600 FOR l_line_BS_rec IN l_line_BS_csr(l_line_csr_rec.id)
1601 loop
1602 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
1603 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
1604 l_top_bs_tbl(l_index).date_end := l_line_BS_rec.date_end;
1605 l_top_bs_tbl(l_index).Amount := 0;
1606 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
1607 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
1608 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
1609
1610
1611 l_index := l_index + 1;
1612 -------errorout_ad('l_top_bs_tbl count = ' || l_top_bs_tbl.count);
1613 END LOOP;
1614
1615 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1616
1617 fnd_log.STRING (fnd_log.level_statement,
1618 G_MODULE_CURRENT || '.create_bill_sch_rules.top_bs_count',
1619 'l_top_bs_tblcount = ' || l_top_bs_tbl.count
1620 );
1621 END IF;
1622 END IF; --end of top line with billing 'E','T'
1623
1624 --if schedule is for top level line then find sub line and repeat THE process.
1625 IF l_Line_Rec.chr_id is not null AND l_Line_Rec.lse_id IN (1, 12, 14, 19) then
1626
1627 FOR l_SubLine_csr_rec IN l_SubLine_Csr(l_Line_Rec.id,l_Line_Rec.lse_id)
1628 LOOP
1629
1630 l_cp_rec.cp_id := l_SubLine_Csr_rec.subline_id ;
1631 l_cp_rec.cp_start_dt := l_SubLine_Csr_rec.cp_start_dt;
1632 l_cp_rec.cp_end_dt := l_SubLine_Csr_rec.cp_end_dt ;
1633 l_cp_rec.cp_amt := l_SubLine_Csr_rec.subline_amt ;
1634 l_cp_rec.dnz_chr_id := l_subline_csr_rec.dnz_chr_id;
1635 l_cp_rec.cp_price_uom := l_subline_csr_rec.price_uom;
1636 l_cp_rec.cp_lse_id := l_subline_csr_rec.cp_lse_id;
1637
1638
1639 IF l_period_type is not null AND l_period_start is not NULL THEN
1640 OPEN l_line_amt_csr(l_SubLine_Csr_rec.subline_id);
1641 FETCH l_line_amt_csr INTO l_cp_rec.cp_amt;
1642 CLOSE l_line_amt_csr;
1643 END IF;
1644 -----errorout_ad('_cp_rec.cp_id = ' || l_cp_rec.cp_id);
1645
1646 ---if subline is terminated with full credit then pass
1647 ---term date to bill_sch_cp as cp start date so that
1648 --level element doesn't get created.
1649
1650 IF l_subline_csr_rec.cp_term_dt IS NOT NULL AND
1651 nvl(l_subline_csr_rec.full_credit,'N') = 'Y' THEN
1652
1653 l_cp_term_dt := l_subline_csr_rec.cp_start_dt;
1654 else
1655 l_cp_term_dt := l_subline_csr_rec.cp_term_dt;
1656 END IF; ---end of full credit chk
1657
1658 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1659
1660 fnd_log.STRING (fnd_log.level_statement,
1661 G_MODULE_CURRENT || '.create_bill_sch_rules.cp_dtls',
1662 'l_cp_term_dt = ' || l_cp_term_dt
1663 || ', id = ' || l_cp_rec.cp_id
1664 || ', lse_id = ' || l_line_rec.lse_id
1665 || ', start dt = ' || l_cp_rec.cp_start_dt
1666 || ', end dt = ' || l_cp_rec.cp_end_dt
1667 || ', amt = ' || l_cp_rec.cp_amt
1668 || ', full_credit flag = ' || l_subline_csr_rec.full_credit
1669 || ', cp bill type = ' || l_subline_csr_rec.billing_schedule_type
1670 );
1671 END IF;
1672
1673 ----if schedule type is P then create sub lines only if effectivity is same
1674 ---- and sll count for the subline is 0.
1675
1676
1677 if p_billing_type = 'P' then
1678
1679 l_sll_count := Find_Sll_Count(l_subline_csr_rec.subline_id);
1680
1681
1682 ---Chk same effectivity
1683
1684 IF TRUNC(l_line_rec.line_start_dt) = TRUNC(l_subline_csr_rec.cp_start_dt) AND
1685 TRUNC(l_line_rec.line_end_dt) = TRUNC(l_subline_csr_rec.cp_end_dt) THEN
1686
1687 IF l_sll_count > 0 then
1688
1689 /* check the bill type if other then 'P' then delete schedule and sLL*/
1690
1691 ---get bill type details
1692
1693
1694 IF nvl(l_subline_csr_rec.billing_schedule_type,'T') <> 'P' THEN
1695 ----if line has sll with billtype <> 'P', delete sll and level elements
1696 --- and updates l_sll_count value as in case of 'P' Bs will be cascaded to
1697 ---only subline with same effectivity.
1698
1699 Del_line_sll_lvl(p_line_id => l_subline_csr_rec.subline_id,
1700 x_return_status => x_return_status,
1701 x_msg_count => l_msg_count,
1702 x_msg_data => l_msg_data);
1703
1704 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1705 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.del_bs',
1706 'Del_line_sll_lvl(x_return_status = '||x_return_status
1707 ||', cp id passed = '||l_subline_csr_rec.subline_id ||')');
1708 END IF;
1709
1710
1711 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1712 RAISE G_EXCEPTION_HALT_VALIDATION;
1713 END IF;
1714 l_sll_count := 0;
1715 END IF; ---existing bill type <> 'P'
1716 END IF; --sll count > 0
1717
1718 IF l_sll_count = 0 THEN
1719
1720 -----errorout_ad('CREATING FOR SUBLINES');
1721 --------------------------------------------------------------------------
1722 -- Begin partial period computation logic
1723 -- Developer Mani Choudhary
1724 -- Date 09-MAY-2005
1725 -- Added two new parameters P_period_start,P_period_type in procedural call
1726 ---------------------------------------------------------------------------
1727 Bill_Sch_Cp(p_billing_type => p_billing_type,
1728 p_bsll_tbl => l_sll_tbl,
1729 p_Line_Rec => l_Line_Rec,
1730 p_SubLine_rec => l_cp_rec,
1731 p_invoice_rulid => p_invoice_rule_id,
1732 p_top_line_bs => l_top_bs_tbl,
1733 p_term_dt => l_cp_term_dt,
1734 p_period_start => l_period_start,
1735 p_period_type => l_period_type,
1736 x_return_status => x_return_status );
1737
1738 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1739 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.cp_bs',
1740 'Bill_Sch_Cp(x_return_status = '||x_return_status
1741 ||', cp id passed = '||l_subline_csr_rec.subline_id ||')');
1742 END IF;
1743
1744 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1745 RAISE G_EXCEPTION_HALT_VALIDATION;
1746 END IF;
1747
1748 END IF; --sll count=0
1749
1750 ELSIF ( trunc(l_line_rec.line_start_dt) <> TRUNC(l_subline_csr_rec.cp_start_dt) OR
1751 TRUNC(l_line_rec.line_end_dt) <> TRUNC(l_subline_csr_rec.cp_end_dt) ) THEN --unequal effectivity
1752
1753 IF l_sll_count > 0 then ---unequal effectivity, with sll count > 0
1754 /* check the bill type if other then 'P' then delete schedule and sLL*/
1755
1756 ---get bill type details
1757
1758
1759 IF nvl(l_subline_csr_rec.billing_schedule_type,'T') <> 'P' THEN
1760 ----if line has sll with billtype <> 'P', delete sll and level elements
1761
1762 Del_line_sll_lvl(p_line_id => l_subline_csr_rec.subline_id,
1763 x_return_status => x_return_status,
1764 x_msg_count => l_msg_count,
1765 x_msg_data => l_msg_data);
1766
1767 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1768 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.del_bs',
1769 'Del_line_sll_lvl(x_return_status = '||x_return_status
1770 ||'sll count >0 and not same effectivity'
1771 ||', cp id passed = '||l_subline_csr_rec.subline_id ||')');
1772 END IF;
1773
1774
1775 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1776 RAISE G_EXCEPTION_HALT_VALIDATION;
1777 END IF;
1778
1779 END IF; --- existing bill type <> P
1780
1781 ELSE ---unequal effectivity, with sll count = 0
1782
1783 ----update billing type to 'P'
1784
1785 UPDATE oks_k_lines_b
1786 SET billing_schedule_type = 'P'
1787 WHERE cle_id = l_subline_csr_rec.subline_id;
1788
1789 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1790 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.update_billtype',
1791 'sll count >0 and not same effectivity'
1792 || 'updated sub line billing type to P = ' || sql%rowcount
1793 );
1794 END IF;
1795
1796 END IF; -------unequal effectivity sll count
1797
1798 end if; ---CHK FOR EQUAL EFFECTIVITY
1799
1800 ELSE ---for 'E','T'
1801
1802 IF nvl(l_subline_csr_rec.billing_schedule_type,p_billing_type) <> p_billing_type THEN
1803 ---Delete all the sll and lvl element for the sub line as billing type from
1804 ---the form can only be changed if no records are billed.
1805
1806 DELETE FROM oks_level_elements WHERE cle_id = l_subline_csr_rec.subline_id;
1807
1808 DELETE FROM oks_stream_levels_b WHERE cle_id = l_subline_csr_rec.subline_id;
1809 END IF; --if sub line billing type <> p_billing_type
1810
1811 --------------------------------------------------------------------------
1812 -- Begin partial period computation logic
1813 -- Developer Mani Choudhary
1814 -- Date 09-MAY-2005
1815 -- Added two new parameters P_period_start,P_period_type in procedural call
1816 ---------------------------------------------------------------------------
1817 Bill_Sch_Cp(p_billing_type => p_billing_type,
1818 p_bsll_tbl => l_sll_tbl,
1819 p_Line_Rec => l_Line_Rec,
1820 p_SubLine_rec => l_cp_rec,
1821 p_invoice_rulid => p_invoice_rule_id,
1822 p_top_line_bs => l_top_bs_tbl,
1823 p_term_dt => l_cp_term_dt,
1824 p_period_start => l_period_start,
1825 p_period_type => l_period_type,
1826 x_return_status => x_return_status );
1827
1828 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1829 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.cp_bs',
1830 'Bill_Sch_Cp(x_return_status = '||x_return_status
1831 ||', cp id passed = '||l_subline_csr_rec.subline_id ||')');
1832 END IF;
1833
1834 IF x_return_status <> 'S' THEN
1835 RAISE G_EXCEPTION_HALT_VALIDATION;
1836 END IF;
1837
1838
1839 end if; ---chk for bill type
1840 -----errorout_ad('Bill_Sch_Cp status = ' || x_return_status);
1841
1842
1843
1844 END LOOP; ---subline loop end
1845
1846 END IF; ---just for top line
1847
1848
1849
1850 IF l_top_bs_tbl.COUNT >0 THEN ---only for type 'T' and 'E' l_top_bs_tbl will be having records
1851 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
1852 p_api_version => l_api_version,
1853 p_init_msg_list => l_init_msg_list,
1854 x_return_status => x_return_status,
1855 x_msg_count => l_msg_count,
1856 x_msg_data => l_msg_data,
1857 p_letv_tbl => l_top_bs_tbl,
1858 x_letv_tbl => l_lvl_ele_tbl_out);
1859
1860 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1861 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.update_top_bs',
1862 'OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(x_return_status = '||x_return_status
1863 ||', tbl count = '||l_lvl_ele_tbl_out.count ||')');
1864 END IF;
1865
1866 IF x_return_status <> 'S' THEN
1867 RAISE G_EXCEPTION_HALT_VALIDATION;
1868 END IF;
1869 END IF; ---l_top_bs_tbl count chk
1870
1871
1872
1873 EXCEPTION
1874 WHEN G_EXCEPTION_HALT_VALIDATION THEN
1875
1876 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
1877 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_bill_sch_rules.EXCEPTION',
1878 'G_EXCEPTION_HALT_VALIDATION');
1879 END IF;
1880
1881 l_currency_code := NULL;
1882 l_header_billing := NULL;
1883
1884 WHEN OTHERS THEN
1885
1886 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
1887 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_bill_sch_rules.UNEXPECTED',
1888 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
1889 END IF;
1890 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
1891 p_msg_name => G_UNEXPECTED_ERROR,
1892 p_token1 => G_SQLCODE_TOKEN,
1893 p_token1_value => sqlcode,
1894 p_token2 => G_SQLERRM_TOKEN,
1895 p_token2_value => sqlerrm);
1896
1897 x_return_status := G_RET_STS_UNEXP_ERROR;
1898
1899
1900 END Create_Bill_Sch_Rules;
1901
1902
1903 --------------------------------------------------------------------------
1904 -- Begin partial period computation logic
1905 -- Developer Mani Choudhary
1906 -- Date 09-MAY-2005
1907 -- Added two new parameters P_period_start,P_period_type in procedural call
1908 ---------------------------------------------------------------------------
1909 Procedure Create_Stream_Level
1910 ( p_billing_type IN VARCHAR2
1911 , p_strm_lvl_tbl IN StreamLvl_tbl
1912 , p_dnz_chr_id IN NUMBER
1913 , p_subline_call IN VARCHAR2
1914 , p_line_amt IN NUMBER
1915 , p_subline_amt IN NUMBER
1916 , p_sll_start_dt IN DATE
1917 , p_end_dt IN DATE
1918 , p_period_start IN VARCHAR2
1919 , p_period_type IN VARCHAR2
1920 , x_sll_out_tbl OUT NOCOPY StrmLvl_Out_tbl
1921 , x_return_status OUT NOCOPY Varchar2
1922 )
1923 Is
1924
1925 CURSOR l_subline_sll_csr(p_seq_no NUMBER, p_line_id NUMBER) IS
1926 SELECT id , object_version_number FROM oks_stream_levels_b
1927 WHERE sequence_no = p_seq_no
1928 AND cle_id = p_line_id;
1929
1930 l_subline_sll_rec l_subline_sll_csr%ROWTYPE;
1931 l_sll_prorate_tbl sll_prorated_tab_type;
1932
1933 l_tbl_count NUMBER;
1934 l_sll_id NUMBER;
1935 l_start_date DATE;
1936 l_end_date DATE;
1937 l_subline_sll NUMBER;
1938 l_rul_status VARCHAR2(100);
1939 l_msg_count NUMBER;
1940 l_msg_data VARCHAR2(2000);
1941 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
1942 l_sll_amount VARCHAR2(450);
1943 l_amount NUMBER;
1944 l_tot_amt NUMBER;
1945 l_prior_index NUMBER;
1946 l_line_amt NUMBER;
1947 l_obj_version NUMBER;
1948 l_uom_quantity NUMBER;
1949 l_tce_code VARCHAR2(30);
1950
1951 --Bug Fix 5185658
1952
1953 Cursor get_lse_id_csr(p_cle_id number ) IS
1954 select lse_id
1955 from okc_k_lines_b
1956 where id = p_cle_id;
1957
1958 l_lse_id number;
1959
1960 --End Bug Fix 5185658
1961
1962 BEGIN
1963
1964 /* In sll creation amount will be prorated for 'E' and 'P' type for subline
1965 and top lines in case of hdr billing*/
1966
1967 ------count the table of records and in for loop create records 'SLL'
1968 --p_subline call can have 3 values Y for sub line, N - top line, H - header
1969
1970 -----errorout_ad('p_subline_call = ' || p_subline_call);
1971
1972 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1973
1974 fnd_log.STRING (fnd_log.level_statement,
1975 G_MODULE_CURRENT || '.create_stream_level.called',
1976 ' p_subline_call = ' || p_subline_call );
1977 END IF;
1978
1979 x_return_status := 'S';
1980
1981 If p_strm_lvl_tbl.count <= 0 THEN
1982 RAISE G_EXCEPTION_HALT_VALIDATION;
1983 END IF;
1984
1985
1986 IF p_billing_type <> 'T' THEN
1987
1988 IF l_header_billing IS NOT NULL and p_subline_call = 'Y' THEN ---sub line and hdr billing
1989 l_tot_amt := Cal_hdr_Amount(l_header_billing);
1990
1991 ELSIF l_header_billing IS NULL and p_subline_call = 'Y' THEN --sub line and not hdr billing
1992
1993 l_tot_amt := P_Line_Amt; ---USED IN CAL AMT FOR E and P
1994
1995 ELSIF l_header_billing IS NOT NULL AND p_subline_call = 'N' THEN ---top line
1996
1997 l_tot_amt := Cal_hdr_Amount(l_header_billing);
1998 l_line_amt := p_line_amt;
1999 END IF; --chk for hdr billing and if called fro line/subline
2000
2001 END IF; --end of p_billing_type <> 'T'
2002
2003 --Bug Fix 5185658
2004
2005 -- Bug fix for 5325152
2006 --changed the idnex from 1 to p_strm_lvl_tbl.FIRST
2007 open get_lse_id_csr (p_strm_lvl_tbl(p_strm_lvl_tbl.FIRST).cle_id);
2008 Fetch get_lse_id_csr into l_lse_id;
2009 Close get_lse_id_csr;
2010
2011 --End Bug Fix 5185658
2012
2013
2014 FOR l_tbl_count IN p_strm_lvl_tbl.First .. p_strm_lvl_tbl.LAST
2015 LOOP
2016
2017 l_strm_lvl_tbl_in.DELETE;
2018 l_obj_version := NULL;
2019
2020 IF p_subline_call IN ('N','H') THEN ---if it is for top line/hdr
2021 IF p_billing_type = 'T' THEN
2022 l_sll_amount := NULL;
2023 ELSIF l_header_billing IS NOT NULL AND p_subline_call = 'N' THEN --Top line in case of hdr billing
2024
2025 IF l_tot_amt = 0 or l_tot_amt IS NULL THEN
2026 l_amount := (l_Line_amt * p_strm_lvl_tbl(l_tbl_count).level_amount)/1;
2027 ELSE
2028 l_amount := (l_line_amt * p_strm_lvl_tbl(l_tbl_count).level_amount)/l_tot_amt;
2029 END IF;
2030
2031 l_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_amount, l_currency_code);
2032
2033 ELSE ---caled for header or top ine in case of not hdr billing.
2034 l_sll_amount := p_strm_lvl_tbl(l_tbl_count).level_amount;
2035 END IF;
2036
2037
2038 IF l_header_billing IS NOT NULL AND p_subline_call <> 'H' THEN
2039 -----errorout_ad('p_subline_call <> H');
2040 l_sll_id := NULL;
2041 ELSE
2042
2043 IF p_strm_lvl_tbl(l_tbl_count).Id IS NULL THEN ---------FOR INSERT
2044 -----errorout_ad('null sll id');
2045 l_sll_id := NULL;
2046 ELSE --------FOR UPDATE
2047 -----errorout_ad('sll_id = ' || p_strm_lvl_tbl(l_tbl_count).Id);
2048 l_obj_version := chk_Sll_Exists(p_strm_lvl_tbl(l_tbl_count).Id);
2049 IF l_obj_version IS NOT NULL THEN
2050 l_sll_id := p_strm_lvl_tbl(l_tbl_count).Id;
2051 ELSE
2052 l_sll_id := null;
2053 END IF;
2054 END IF;
2055 END IF;
2056
2057 ELSE --CALLED FROM SUB LINE PROCEDURE
2058 IF p_billing_type = 'T' THEN
2059 l_sll_amount := NULL;
2060 ELSE
2061 ------FOR E and P
2062 IF l_tot_amt = 0 or l_tot_amt IS NULL THEN
2063 l_amount := (p_SubLine_amt * p_strm_lvl_tbl(l_tbl_count).level_amount)/1;
2064 ELSE
2065 l_amount := (p_SubLine_amt * p_strm_lvl_tbl(l_tbl_count).level_amount)/l_tot_amt;
2066 END IF;
2067
2068 l_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_amount, l_currency_code);
2069 END IF;
2070
2071 IF l_header_billing IS NOT NULL AND p_subline_call <> 'H' THEN
2072 l_sll_id := NULL;
2073 ELSE
2074
2075 IF p_strm_lvl_tbl(l_tbl_count).Id IS NULL THEN -------FOR INSERT
2076 l_sll_id := NULL;
2077
2078 ELSE ----FOR UPDATE
2079 -------FIND OUT SUBLINE sll ID FOR UPDATE MATCH THEM WITH SEQUENCE NUMBER
2080 OPEN l_subline_sll_csr(p_strm_lvl_tbl(l_tbl_count).sequence_no,p_strm_lvl_tbl(l_tbl_count).cle_id);
2081 FETCH l_subline_sll_csr INTO l_subline_sll_rec;
2082 IF l_subline_sll_csr%NOTFOUND THEN
2083 CLOSE l_subline_sll_csr;
2084 l_sll_id := NULL;
2085
2086 ELSE
2087 CLOSE l_subline_sll_csr;
2088 l_sll_id := l_subline_sll_rec.id;
2089 l_obj_version := l_subline_sll_rec.object_version_number;
2090 END IF;
2091 END IF; ---------INSERT/UPDATE IF
2092
2093 END IF; -----l_header_billing IS NOT NULL AND p_subline_call <> 'H'
2094
2095
2096 END IF; ------------LINE/SUBLINE IF
2097
2098 -----errorout_ad('l_sll_id = ' || l_sll_id);
2099 -----errorout_ad('l_tbl_count = ' || l_tbl_count || 'and first sll index = ' || p_strm_lvl_tbl.First);
2100
2101 IF l_tbl_count = p_strm_lvl_tbl.First THEN
2102 l_start_date := p_sll_start_dt;
2103
2104 ELSE
2105
2106 l_start_date := x_sll_out_tbl(l_tbl_count - 1).end_date + 1;
2107
2108 END IF;
2109 -----errorout_ad('for SLL LINE : ' || TO_CHAR(l_tbl_count) || ' --DATE_START = ' || TO_DATE(l_next_date));
2110
2111 -------------------------------------------------------------------------
2112 -- Begin partial period computation logic
2113 -- Developer Mani Choudhary
2114 -- Date 09-MAY-2005
2115 -- In case of calendar start , call the new funtion to derive the SLL end date
2116 -------------------------------------------------------------------------
2117 OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
2118 (p_timeunit => p_strm_lvl_tbl(l_tbl_count).uom_code,
2119 x_return_status => x_return_status,
2120 x_quantity => l_uom_quantity ,
2121 x_timeunit => l_tce_code);
2122 IF x_return_status <> 'S' THEN
2123 RAISE G_EXCEPTION_HALT_VALIDATION;
2124 END IF;
2125
2126
2127 IF p_period_start is not null AND
2128 p_period_type is not null AND
2129 p_period_start = 'CALENDAR' AND
2130 l_tce_code not in ('DAY','HOUR','MINUTE')
2131 THEN
2132 l_end_date := OKS_BILL_UTIL_PUB.get_enddate_cal
2133 (l_start_date,
2134 p_strm_lvl_tbl(l_tbl_count).uom_code,
2135 p_strm_lvl_tbl(l_tbl_count).uom_per_period,
2136 p_strm_lvl_tbl(l_tbl_count).level_periods);
2137
2138 ELSE
2139 --Existing Logic for calculating SLL end date
2140
2141 l_end_date := OKC_TIME_UTIL_PUB.get_enddate(
2142 l_start_date,
2143 p_strm_lvl_tbl(l_tbl_count).uom_code,
2144 (p_strm_lvl_tbl(l_tbl_count).level_periods * p_strm_lvl_tbl(l_tbl_count).uom_per_period));
2145
2146 /* Added for bug 13799709*/
2147 IF (l_end_date > p_end_dt AND p_period_start is null AND p_period_type is null) THEN
2148
2149 l_end_date := p_end_dt;
2150
2151 END IF;
2152 /* Added for bug 13799709*/
2153
2154 END IF;
2155 --If the sll end date and line end date falls in the same month and
2156 --sll end date > line end date , then assign line end date to sll emd date
2157 IF (l_end_date > p_end_dt AND p_period_start is not null
2158 AND p_period_type is not null) THEN
2159
2160 l_end_date := p_end_dt;
2161
2162 END IF;
2163
2164 -------------------------------------------------------------------------
2165 -- End partial period computation logic
2166 -- Date 09-MAY-2005
2167 -------------------------------------------------------------------------
2168 l_strm_lvl_tbl_in(1).chr_id := p_strm_lvl_tbl(l_tbl_count).chr_id;
2169 l_strm_lvl_tbl_in(1).cle_id := p_strm_lvl_tbl(l_tbl_count).cle_id;
2170 l_strm_lvl_tbl_in(1).dnz_chr_id := p_dnz_chr_id;
2171 l_strm_lvl_tbl_in(1).sequence_no := p_strm_lvl_tbl(l_tbl_count).sequence_no ;
2172
2173 l_strm_lvl_tbl_in(1).start_date := l_start_date;
2174 l_strm_lvl_tbl_in(1).end_date := l_end_date;
2175
2176 l_strm_lvl_tbl_in(1).level_amount := l_sll_amount;
2177 l_strm_lvl_tbl_in(1).invoice_offset_days := p_strm_lvl_tbl(l_tbl_count).invoice_offset_days;
2178 l_strm_lvl_tbl_in(1).interface_offset_days := p_strm_lvl_tbl(l_tbl_count).interface_offset_days;
2179
2180
2181 l_strm_lvl_tbl_in(1).object_version_number := OKC_API.G_MISS_NUM;
2182 l_strm_lvl_tbl_in(1).created_by := OKC_API.G_MISS_NUM;
2183 l_strm_lvl_tbl_in(1).creation_date := SYSDATE;
2184 l_strm_lvl_tbl_in(1).last_updated_by := OKC_API.G_MISS_NUM;
2185 l_strm_lvl_tbl_in(1).last_update_date := SYSDATE;
2186
2187
2188
2189 l_strm_lvl_tbl_in(1).level_periods := p_strm_lvl_tbl(l_tbl_count).level_periods;
2190 l_strm_lvl_tbl_in(1).uom_per_period := p_strm_lvl_tbl(l_tbl_count).uom_per_period;
2191 l_strm_lvl_tbl_in(1).uom_code := p_strm_lvl_tbl(l_tbl_count).uom_code;
2192
2193
2194 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2195
2196 fnd_log.STRING (fnd_log.level_statement,
2197 G_MODULE_CURRENT || '.create_stream_level.sll_dtls',
2198 ' line id = ' || l_strm_lvl_tbl_in(1).cle_id
2199 || ', chr_id = ' || l_strm_lvl_tbl_in(1).chr_id
2200 || ', start date = ' || l_strm_lvl_tbl_in(1).start_date
2201 || ', end date = ' || l_strm_lvl_tbl_in(1).end_date
2202 || ', amount = ' || l_strm_lvl_tbl_in(1).level_amount
2203 || ', period = ' || l_strm_lvl_tbl_in(1).level_periods
2204 || ', uom_per_period = ' || l_strm_lvl_tbl_in(1).uom_per_period
2205 || ', uom = ' || l_strm_lvl_tbl_in(1).uom_code
2206 || ', sequence = ' || l_strm_lvl_tbl_in(1).sequence_no
2207 || ', inv-interface offset = ' || l_strm_lvl_tbl_in(1).invoice_offset_days
2208 || ', ' || l_strm_lvl_tbl_in(1).interface_offset_days
2209 );
2210 END IF;
2211
2212 IF (l_sll_id IS NULL) THEN
2213
2214 OKS_SLL_PVT.insert_row(
2215 p_api_version => l_api_version,
2216 p_init_msg_list => l_init_msg_list,
2217 x_return_status => x_return_status,
2218 x_msg_count => l_msg_count,
2219 x_msg_data => l_msg_data,
2220 p_sllv_tbl => l_strm_lvl_tbl_in,
2221 x_sllv_tbl => l_strm_lvl_tbl_out);
2222
2223 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2224 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.insert',
2225 'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
2226 ||', sll id created = '||l_strm_lvl_tbl_out(1).id ||')');
2227 END IF;
2228
2229 -----errorout_ad('SllCREATED : '|| x_return_status);
2230 -----errorout_ad('sll id = ' || l_strm_lvl_tbl_in(1));
2231
2232
2233 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2234 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2235 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2236 RAISE OKC_API.G_EXCEPTION_ERROR;
2237 END IF;
2238
2239 ELSE --sll id not null
2240 l_strm_lvl_tbl_in(1).id := l_sll_id;
2241 l_strm_lvl_tbl_in(1).object_version_number := l_obj_version;
2242
2243 OKS_SLL_PVT.update_row(
2244 p_api_version => l_api_version,
2245 p_init_msg_list => l_init_msg_list,
2246 x_return_status => x_return_status,
2247 x_msg_count => l_msg_count,
2248 x_msg_data => l_msg_data,
2249 p_sllv_tbl => l_strm_lvl_tbl_in,
2250 x_sllv_tbl => l_strm_lvl_tbl_out);
2251
2252 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2253 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.update',
2254 'OKS_SLL_PVT.update_row(x_return_status = '||x_return_status
2255 ||', sll id updated = '||l_strm_lvl_tbl_out(1).id ||')');
2256 END IF;
2257
2258 -----errorout_ad('STREAM LEVEL RULE updated : '|| x_return_status);
2259
2260
2261 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2262 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2263 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2264 RAISE OKC_API.G_EXCEPTION_ERROR;
2265 END IF;
2266
2267 END IF;
2268
2269 x_sll_out_tbl(l_tbl_count).chr_Id := l_strm_lvl_tbl_out(1).chr_id;
2270 x_sll_out_tbl(l_tbl_count).cle_Id := l_strm_lvl_tbl_out(1).cle_id;
2271 x_sll_out_tbl(l_tbl_count).dnz_chr_Id := l_strm_lvl_tbl_out(1).dnz_chr_id;
2272 x_sll_out_tbl(l_tbl_count).Id := l_strm_lvl_tbl_out(1).id;
2273 x_sll_out_tbl(l_tbl_count).Seq_no := l_strm_lvl_tbl_out(1).sequence_no;
2274 x_sll_out_tbl(l_tbl_count).Dt_start := l_strm_lvl_tbl_out(1).start_date;
2275 x_sll_out_tbl(l_tbl_count).end_date := l_strm_lvl_tbl_out(1).end_date;
2276 x_sll_out_tbl(l_tbl_count).Level_Period := l_strm_lvl_tbl_out(1).level_periods;
2277 x_sll_out_tbl(l_tbl_count).uom_Per_Period := l_strm_lvl_tbl_out(1).uom_per_period;
2278 x_sll_out_tbl(l_tbl_count).uom := l_strm_lvl_tbl_out(1).uom_code;
2279 x_sll_out_tbl(l_tbl_count).Amount := l_strm_lvl_tbl_out(1).level_amount;
2280 x_sll_out_tbl(l_tbl_count).invoice_offset_days := l_strm_lvl_tbl_out(1).invoice_offset_days;
2281 x_sll_out_tbl(l_tbl_count).Interface_offset_days := l_strm_lvl_tbl_out(1).interface_offset_days;
2282
2283 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2284
2285 fnd_log.STRING (fnd_log.level_statement,
2286 G_MODULE_CURRENT || '.create_stream_level.top_sll_dtls',
2287 ' sll id = ' || x_sll_out_tbl(l_tbl_count).Id
2288 || ', start date = ' || x_sll_out_tbl(l_tbl_count).Dt_start
2289 );
2290 END IF;
2291
2292 End Loop;
2293
2294 --Bug Fix 5185658
2295
2296 --IF p_billing_type IN ('P','E') AND p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments IS NOT NULL AND
2297 -- p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments = '99' AND p_subline_call = 'N' THEN
2298
2299 IF (
2300 p_billing_type IN ('P','E') AND p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments IS NOT NULL AND
2301 p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments = '99' AND p_subline_call = 'N'
2302 )
2303 OR
2304 (
2305 l_lse_id = 46 AND p_period_start = 'SERVICE' AND p_billing_type = 'E' AND nvl(pkg_cascade_billing_hdr, 'N') = 'Y'
2306 )
2307 THEN
2308
2309 --End Bug Fix 5185658
2310
2311 l_sll_prorate_tbl.DELETE;
2312
2313 FOR l_index IN x_sll_out_tbl.FIRST .. x_sll_out_tbl.LAST
2314 LOOP
2315 l_sll_prorate_tbl(l_index).sll_seq_num := l_index;
2316 l_sll_prorate_tbl(l_index).sll_start_date := x_sll_out_tbl(l_index).Dt_start;
2317 l_sll_prorate_tbl(l_index).sll_end_date := x_sll_out_tbl(l_index).end_Date;
2318 l_sll_prorate_tbl(l_index).sll_tuom := x_sll_out_tbl(l_index).uom;
2319 l_sll_prorate_tbl(l_index).sll_period := x_sll_out_tbl(l_index).level_period;
2320 --03-NOV-2005-mchoudha-Fix for bug#4691026
2321 l_sll_prorate_tbl(l_index).sll_uom_per_period := x_sll_out_tbl(l_index).uom_per_period;
2322 END LOOP;
2323
2324
2325 Calculate_sll_amount(
2326 p_api_version => l_api_version,
2327 p_total_amount => p_line_amt,
2328 p_currency_code => l_currency_code,
2329 p_period_start => p_period_start,
2330 p_period_type => p_period_type,
2331 p_sll_prorated_tab => l_sll_prorate_tbl,
2332 x_return_status => x_return_status);
2333
2334 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2335 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.prorate',
2336 'Calculate_sll_amount(x_return_status = '||x_return_status
2337 ||', l_sll_prorate_tbl count = '|| l_sll_prorate_tbl.count ||')');
2338 END IF;
2339
2340
2341 -----errorout_ad ('Get_sll_amount STATUS = ' || x_return_status);
2342
2343
2344 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2345 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2346 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2347 RAISE OKC_API.G_EXCEPTION_ERROR;
2348 END IF;
2349
2350 FOR l_index IN l_sll_prorate_tbl.FIRST .. l_sll_prorate_tbl.LAST
2351 LOOP
2352 UPDATE oks_stream_levels_b
2353 Set level_amount = l_sll_prorate_tbl(l_index).sll_amount
2354 WHERE id = x_sll_out_tbl(l_index).id;
2355
2356 x_sll_out_tbl(l_index).amount := l_sll_prorate_tbl(l_index).sll_amount;
2357 END LOOP; ---END OF UPDATE LOOP
2358
2359
2360 END IF; ----end for chk if proration required for copied.
2361
2362
2363 EXCEPTION
2364 WHEN G_EXCEPTION_HALT_VALIDATION THEN
2365 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
2366 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_stream_level.EXCEPTION',
2367 'G_EXCEPTION_HALT_VALIDATION');
2368 END IF;
2369 x_return_status := 'E';
2370
2371 WHEN OTHERS THEN
2372 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2373 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Create_Stream_Level.UNEXPECTED',
2374 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2375 END IF;
2376
2377 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
2378 p_msg_name => G_UNEXPECTED_ERROR,
2379 p_token1 => G_SQLCODE_TOKEN,
2380 p_token1_value => sqlcode,
2381 p_token2 => G_SQLERRM_TOKEN,
2382 p_token2_value => sqlerrm);
2383
2384 x_return_status := G_RET_STS_UNEXP_ERROR;
2385
2386 End Create_Stream_Level;
2387
2388
2389
2390 FUNCTION chk_Sll_Exists(p_id IN NUMBER) return number IS
2391
2392 CURSOR l_sll_csr(p_sll_id NUMBER) IS
2393 SELECT id ,object_version_number
2394 FROM oks_stream_levels_b
2395 WHERE ID = p_sll_id;
2396
2397 l_sll_rec l_sll_csr%ROWTYPE;
2398 BEGIN
2399
2400 IF p_id is null THEN
2401 return(null);
2402 ELSE
2403 OPEN l_sll_csr(p_id);
2404 FETCH l_sll_csr INTO l_sll_rec;
2405
2406 IF l_sll_csr%NOTFOUND THEN
2407 CLOSE l_sll_csr;
2408 return(null);
2409 ELSE
2410 CLOSE l_sll_csr;
2411 return(l_sll_rec.object_version_number);
2412 END IF;
2413 END IF;
2414
2415
2416 EXCEPTION
2417 WHEN OTHERS then
2418 RETURN(null);
2419
2420 END chk_Sll_Exists;
2421
2422
2423
2424 --------------------------------------------------------------------------
2425 -- Begin partial period computation logic
2426 -- Developer Mani Choudhary
2427 -- Date 09-MAY-2005
2428 -- Added two new parameters P_period_start,P_period_type in procedural call
2429 ---------------------------------------------------------------------------
2430 PROCEDURE Bill_Sch_Cp
2431 ( p_billing_type IN VARCHAR2,
2432 p_bsll_tbl IN StreamLvl_tbl,
2433 p_Line_Rec IN Line_Det_Type,
2434 p_SubLine_rec IN Prod_Det_Type,
2435 p_invoice_rulid IN Number,
2436 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
2437 p_term_dt IN DATE,
2438 p_period_start IN VARCHAR2,
2439 p_period_type IN VARCHAR2,
2440 x_return_status OUT NOCOPY Varchar2
2441 )
2442 IS
2443
2444 Cursor l_Line_Amt_Csr(p_line_id IN NUMBER) Is
2445 SELECT (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
2446 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
2447 FROM okc_k_lines_b line, oks_k_lines_b dtl
2448 WHERE line.id = p_line_id
2449 AND line.id = dtl.cle_id;
2450
2451 l_cp_sll_out_tbl StrmLvl_Out_tbl;
2452 l_cp_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
2453 l_line_amt NUMBER;
2454 l_subline_amt NUMBER;
2455
2456 BEGIN
2457
2458 ---the procedure creates sll and level elements for subline.
2459 -----errorout_ad('in bill_sch_cp');
2460 x_return_status := 'S';
2461
2462 l_cp_sll_tbl := p_bsll_tbl;
2463
2464 FOR l_index IN l_cp_sll_tbl.FIRST .. l_cp_sll_tbl.LAST
2465 LOOP
2466 l_cp_sll_tbl(l_index).cle_id := p_subline_rec.cp_id;
2467 END LOOP;
2468
2469 UPDATE OKS_K_LINES_B SET billing_schedule_type = p_billing_type
2470 WHERE cle_id = p_subline_rec.cp_id;
2471
2472 -----create 'SLL'RECORDS
2473
2474 --------------------------------------------------------------------------
2475 -- Begin partial period computation logic
2476 -- Developer Mani Choudhary
2477 -- Date 09-MAY-2005
2478 -- Added two new parameters P_period_start,P_period_type in procedural call
2479 ---------------------------------------------------------------------------
2480
2481 IF p_period_type is not null AND p_period_start is not NULL THEN
2482 OPEN l_Line_Amt_Csr(p_Line_Rec.id);
2483 FETCH l_Line_Amt_Csr INTO l_line_amt;
2484 CLOSE l_Line_Amt_Csr;
2485 OPEN l_Line_Amt_Csr(p_SubLine_rec.cp_id);
2486 FETCH l_Line_Amt_Csr INTO l_subline_amt;
2487 CLOSE l_Line_Amt_Csr;
2488 ELSE
2489 l_line_amt := p_line_Rec.line_amt;
2490 l_subline_amt := p_subline_rec.cp_amt;
2491 END IF;
2492
2493
2494 Create_Stream_Level
2495 (p_billing_type => p_billing_type,
2496 p_strm_lvl_tbl => l_cp_sll_tbl,
2497 p_subline_call => 'Y',
2498 p_dnz_chr_id => p_line_rec.dnz_chr_id,
2499 p_line_amt => l_line_amt,
2500 p_subline_amt => l_subline_amt,
2501 p_sll_start_dt => p_line_rec.line_start_dt,
2502 p_end_dt => p_line_rec.line_end_dt,
2503 p_period_start => p_period_start,
2504 p_period_type => p_period_type,
2505 x_sll_out_tbl => l_cp_sll_out_tbl,
2506 x_return_status => x_return_status);
2507
2508 -------------------------------------------------------------------------
2509 -- End partial period computation logic
2510 -- Date 09-MAY-2005
2511 -------------------------------------------------------------------------
2512
2513 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2514 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.bill_sch_cp.sll',
2515 'Create_Stream_Level(x_return_status = '||x_return_status
2516 ||', l_cp_sll_out_tbl count = '|| l_cp_sll_out_tbl.count ||')');
2517 END IF;
2518
2519 -------------errorout_ad('SLL Record FOR SUBLINE = ' || TO_CHAR(l_cp_sll_out_tbl.count));
2520 ----if l_cp_sll_out_tbl.count > 0 then insert lines into oks_level_elements_v
2521 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
2522 RAISE G_EXCEPTION_HALT_VALIDATION;
2523 END IF;
2524
2525
2526
2527 -------------------------------------------------------------------------
2528 -- Begin partial period computation logic
2529 -- Developer Mani Choudhary
2530 -- Date 09-MAY-2005
2531 -- Added two new parameters p_period_start and p_period_type
2532 -------------------------------------------------------------------------
2533 Create_cp_lvl_elements(
2534 p_billing_type => p_billing_type,
2535 p_cp_sll_tbl => l_cp_sll_out_tbl,
2536 p_Line_Rec => p_Line_Rec,
2537 p_SubLine_rec => p_SubLine_rec,
2538 p_invoice_rulid => p_invoice_rulid,
2539 p_top_line_bs => p_top_line_bs,
2540 p_term_dt => p_term_dt,
2541 p_period_start => p_period_start,
2542 p_period_type => p_period_type,
2543 x_return_status => x_return_status);
2544
2545 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2546 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.bill_sch_cp.lvl_ele',
2547 'Create_cp_lvl_elements(x_return_status = '||x_return_status
2548 ||', p_term_dt passed = '|| p_term_dt ||')');
2549 END IF;
2550
2551 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
2552 RAISE G_EXCEPTION_HALT_VALIDATION;
2553 END IF;
2554
2555 EXCEPTION
2556 WHEN G_EXCEPTION_HALT_VALIDATION THEN
2557 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
2558 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.bill_sch_cp.EXCEPTION',
2559 'G_EXCEPTION_HALT_VALIDATION');
2560 END IF;
2561
2562 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2563 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2564 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2565 RAISE OKC_API.G_EXCEPTION_ERROR;
2566 END IF;
2567 WHEN OTHERS THEN
2568
2569 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2570 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.bill_sch_Cp.UNEXPECTED',
2571 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2572 END IF;
2573
2574 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
2575 p_msg_name => G_UNEXPECTED_ERROR,
2576 p_token1 => G_SQLCODE_TOKEN,
2577 p_token1_value => sqlcode,
2578 p_token2 => G_SQLERRM_TOKEN,
2579 p_token2_value => sqlerrm);
2580
2581 x_return_status := G_RET_STS_UNEXP_ERROR;
2582 END Bill_Sch_Cp;
2583
2584
2585
2586 PROCEDURE Copy_Bill_Sch
2587 (
2588 p_chr_id IN Number,
2589 p_cle_id IN Number,
2590 x_copy_bill_sch OUT NOCOPY ItemBillSch_tbl,
2591 x_return_status OUT NOCOPY Varchar2
2592 )
2593 IS
2594 Cursor l_LineSch_Csr is
2595 SELECT sll.sequence_no,element.cle_id,
2596 element.sequence_number, element.date_transaction,
2597 element.date_start, element.date_to_interface,
2598 element.date_completed, element.amount,element.date_end,
2599 element.rul_id
2600 FROM oks_level_elements element, oks_stream_levels_b sll
2601 WHERE sll.id = element.rul_id
2602 AND sll.cle_id = p_cle_id
2603 ORDER BY sll.sequence_no,to_number(element.sequence_number);
2604
2605 Cursor l_ContractSch_Csr Is
2606 SELECT sll.sequence_no,sll.chr_id,
2607 element.sequence_number, element.date_transaction,
2608 element.date_start, element.date_to_interface,
2609 element.date_completed, element.amount, element.date_end,
2610 element.rul_id
2611 FROM oks_level_elements element, oks_stream_levels_b sll
2612 WHERE sll.id = element.rul_id
2613 AND sll.chr_id = p_chr_id
2614 ORDER BY sll.sequence_no,to_number(element.sequence_number);
2615
2616
2617 l_LineSch_rec l_LineSch_Csr%ROWTYPE;
2618 l_ContractSch_rec l_ContractSch_Csr%ROWTYPE;
2619 i number;
2620
2621 BEGIN
2622 /* query the records from db for a line or contract and pass then in tbl format to form*/
2623
2624 -----errorout_ad('Copy_Bill_Sch START');
2625 x_return_status := 'S';
2626
2627 IF p_chr_id IS NULL and p_cle_id IS NOT NULL THEN --for line
2628 i := 1;
2629
2630 FOR l_LineSch_rec IN l_LineSch_csr
2631 LOOP
2632 x_copy_bill_sch(i).Chr_Id := NULL;
2633 x_copy_bill_sch(i).Cle_Id := l_LineSch_rec.Cle_Id;
2634 x_copy_bill_sch(i).Strm_Lvl_Seq_Num := l_LineSch_rec.sequence_no;
2635 x_copy_bill_sch(i).Lvl_Element_Seq_Num := l_LineSch_rec.sequence_number;
2636 x_copy_bill_sch(i).Tx_Date := l_LineSch_rec.date_transaction;
2637 x_copy_bill_sch(i).Bill_From_Date := l_LineSch_rec.date_start;
2638 x_copy_bill_sch(i).Bill_to_Date := l_LineSch_rec.date_end;
2639 x_copy_bill_sch(i).Interface_Date := l_LineSch_rec.date_to_interface;
2640 x_copy_bill_sch(i).Date_Completed := l_LineSch_rec.date_completed;
2641 x_copy_bill_sch(i).Amount := l_LineSch_rec.amount;
2642 x_copy_bill_sch(i).Rule_Id := l_LineSch_rec.rul_id;
2643
2644
2645 i := i + 1;
2646 END LOOP;
2647
2648
2649
2650 ELSE ---for contract
2651 i := 1;
2652 FOR l_ContractSch_rec IN l_ContractSch_Csr
2653 LOOP
2654
2655 x_copy_bill_sch(i).Chr_Id := l_ContractSch_rec.Chr_Id;
2656 x_copy_bill_sch(i).Strm_Lvl_Seq_Num := l_ContractSch_rec.sequence_no;
2657 x_copy_bill_sch(i).Lvl_Element_Seq_Num := l_ContractSch_rec.sequence_number;
2658 x_copy_bill_sch(i).Tx_Date := l_ContractSch_rec.date_transaction;
2659 x_copy_bill_sch(i).Bill_From_Date := l_ContractSch_rec.date_start;
2660 x_copy_bill_sch(i).Bill_to_Date := l_contractsch_rec.date_end;
2661 x_copy_bill_sch(i).Interface_Date := l_ContractSch_rec.date_to_interface;
2662 x_copy_bill_sch(i).Date_Completed := l_ContractSch_rec.date_completed;
2663 x_copy_bill_sch(i).Amount := l_ContractSch_rec.amount;
2664 x_copy_bill_sch(i).Rule_Id := l_ContractSch_rec.rul_id;
2665
2666
2667 i := i + 1;
2668 END LOOP;
2669
2670 END IF; ---chk for line/subline
2671
2672 l_currency_code := NULL;
2673 l_header_billing := NULL;
2674
2675 EXCEPTION
2676 WHEN OTHERS THEN
2677 x_return_status := G_RET_STS_UNEXP_ERROR;
2678 END Copy_Bill_Sch;
2679
2680
2681
2682
2683 PROCEDURE Check_Existing_Lvlelement
2684 (
2685 p_sll_id IN Number,
2686 p_sll_dt_start IN Date,
2687 p_uom IN VARCHAR2,
2688 p_uom_per_period IN NUMBER,
2689 p_cp_end_dt IN DATE,
2690 x_next_cycle_dt OUT NOCOPY DATE,
2691 x_last_cycle_dt out NOCOPY Date,
2692 x_period_counter out NOCOPY Number,
2693 x_sch_amt IN OUT NOCOPY NUMBER,
2694 x_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
2695 x_return_status out NOCOPY Varchar2
2696 )
2697
2698 IS
2699
2700
2701 CURSOR l_element_csr(p_sllid Number) IS
2702 SELECT id ,date_start,amount,date_end
2703 FROM oks_level_elements where rul_id = p_sllid
2704 ORDER BY to_number(sequence_number);
2705
2706
2707 ----- Bug 5047257 Start
2708 Cursor l_element_count(p_sll_id in number, last_start_date in Date) is
2709 select count(a.id) periods from oks_level_elements a, oks_k_lines_b line
2710 where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2711 and a.date_start <= last_start_date
2712 and Line.cle_id = a.cle_id
2713 and Line.billing_schedule_type in ('T','E');
2714 ----- Bug 5047257 End
2715
2716 Cursor l_element_count1(p_sll_id in number, last_start_date in Date) is
2717 select count(a.id) periods from oks_level_elements a, oks_k_lines_b line,
2718 oks_stream_levels_b sll1,
2719 oks_stream_levels_b sll2
2720 where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2721 and a.date_start <= last_start_date
2722 and a.rul_id = sll1.id
2723 and sll1.sequence_no = sll2.sequence_no
2724 and sll2.id = p_sll_id
2725 and Line.cle_id = a.cle_id
2726 and Line.billing_schedule_type in ('T','E');
2727
2728 Cursor l_element_count2(p_sll_id in number, last_start_date in Date) is
2729 select count(a.id) periods from oks_level_elements a, oks_k_lines_b line
2730 where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2731 and a.date_start <= last_start_date
2732 and Line.cle_id = a.cle_id
2733 and Line.billing_schedule_type in ('T','E');
2734 ----- Bug 5047257 End
2735
2736
2737 Cursor date_check_csr(p_sub_cle_id in number) is
2738 select count(id) from okc_k_lines_b lin
2739 where lin.id = p_sub_cle_id
2740 and lin.cle_id in (select top.id from okc_k_lines_b top
2741 where lin.start_date > top.start_date);
2742
2743 Cursor sll_csr(p_top_cle_id in number) is
2744 select count(id) from oks_stream_levels_b strm
2745 where strm.cle_id = p_top_cle_id;
2746
2747
2748 l_bill_end_date date;
2749 l_billed_count Number;
2750 l_element_rec l_element_csr%rowtype;
2751 l_tbs_ind NUMBER;
2752 l_next_cycle_dt DATE;
2753 l_element_end_dt DATE;
2754 l_date_start DATE;
2755 l_end_dt DATE;
2756 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
2757 l_index number;
2758 l_top_line_id number;
2759 l_sub_line_id number;
2760 l_line_ctr number;
2761 l_sll_ctr number;
2762
2763 BEGIN
2764
2765 --chk if any billed lvl elemnts exist if yes find the total amt and period counter to start with
2766
2767 l_billed_count := 0;
2768 x_return_status := 'S';
2769
2770 x_period_counter := 1;
2771 x_return_status := 'S';
2772 x_last_cycle_dt := NULL;
2773 x_next_cycle_dt := p_sll_dt_start;
2774 l_index := 0;
2775
2776 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2777
2778 fnd_log.STRING (fnd_log.level_statement,
2779 G_MODULE_CURRENT || '.Check_Existing_Lvlelement.dtls',
2780 'sll id = ' || p_sll_id
2781 ||', sll st dt = ' || p_sll_dt_start
2782 );
2783 END IF;
2784 -----errorout_ad('p_sll_dt_start = ' || p_sll_dt_start);
2785 FOR l_element_rec IN l_element_csr(p_sll_id) ---billed lvl element for sll
2786 LOOP
2787
2788 l_billed_count := l_billed_count + 1;
2789 x_last_cycle_dt := l_element_rec.date_start;
2790 x_sch_amt := nvl(x_sch_amt,0) + nvl(l_element_rec.amount,0);
2791 x_next_cycle_dt := l_element_rec.date_end + 1;
2792
2793
2794 IF x_top_line_bs.COUNT > 0 THEN --tbl will have rec for 'E' and 'T'
2795 l_index := l_index + 1;
2796
2797 l_cp_bs_tbl(l_index).id := l_element_rec.id;
2798 l_cp_bs_tbl(l_index).date_start := l_element_rec.date_start;
2799 l_cp_bs_tbl(l_index).date_end := l_element_rec.date_end;
2800 l_cp_bs_tbl(l_index).Amount := l_element_rec.amount;
2801 END IF;
2802
2803 END LOOP;
2804 x_period_counter := l_billed_count + 1; ---LINE WILL BE INSERTED FROM THIS COUNTER.
2805
2806 l_line_ctr := 0;
2807 l_sll_ctr := 0;
2808
2809 open date_check_csr(l_sub_line_id);
2810 fetch date_check_csr into l_line_ctr;
2811 close date_check_csr;
2812
2813 ---- The count cursor will be invoked only if sub line effectivity is different from Top line
2814 if l_line_ctr = 1 Then
2815
2816 open sll_csr(l_top_line_id);
2817 fetch sll_csr into l_sll_ctr;
2818 close sll_csr;
2819
2820 ------for 2 or more streams
2821 if l_sll_ctr > 1 Then
2822 for l_element_rec in l_element_count1(p_sll_id, x_last_cycle_dt ) loop
2823 IF (l_element_rec.periods=0) THEN
2824 exit;
2825 END IF;
2826 x_period_counter := l_element_rec.periods+1;
2827 exit;
2828 end loop;
2829 Else
2830 ------for single stream only call for the sub line
2831 If l_sub_line_id <> l_top_line_id then
2832 for l_element_rec in l_element_count2(p_sll_id, x_last_cycle_dt ) loop
2833 IF (l_element_rec.periods=0) THEN
2834 exit;
2835 END IF;
2836 x_period_counter := l_element_rec.periods+1;
2837 exit;
2838 end loop;
2839 end if;
2840 END if; --- sll count
2841
2842 End if; ----l_line_count = 1 Then
2843
2844 -----errorout_ad('l_cp_bs_tbl.COUNT = '|| l_cp_bs_tbl.COUNT);
2845
2846
2847 --if called from sub line routine then rollup the amount to top line BS tbl
2848 ---after matching period.
2849
2850 IF x_top_line_bs.COUNT > 0 AND l_cp_bs_tbl.COUNT > 0 THEN
2851 l_index := l_cp_bs_tbl.FIRST;
2852
2853
2854 l_tbs_ind := x_top_line_bs.FIRST;
2855 l_date_start := l_cp_bs_tbl(l_index ).DATE_START;
2856
2857
2858 -----errorout_ad('date start = ' || l_date_start);
2859
2860 WHILE TRUNC(l_date_start) > trunc(x_top_line_bs(l_tbs_ind).DATE_START)
2861 AND l_tbs_ind < x_top_line_bs.LAST
2862 LOOP
2863 -----errorout_ad('TOP LINE BS DATE CHK = ' || x_top_line_bs(l_tbs_ind).DATE_START);
2864 l_tbs_ind := x_top_line_bs.NEXT(l_tbs_ind);
2865 END LOOP;
2866
2867 -----errorout_ad('after while LOOP l_tbs_ind = ' || l_tbs_ind);
2868
2869
2870 ---chk l_next_cycle_dt if between previous and present record
2871 IF l_tbs_ind = x_top_line_bs.first THEN
2872 NULL;
2873
2874 ELSIF l_tbs_ind <= x_top_line_bs.LAST THEN
2875
2876 -----errorout_ad('COMING IN');
2877 l_tbs_ind := l_tbs_ind - 1;
2878
2879 IF x_top_line_bs(l_tbs_ind ).DATE_end IS NOT NULL THEN
2880 l_element_end_dt := x_top_line_bs(l_tbs_ind ).DATE_end;
2881
2882 ELSE
2883
2884 l_element_end_dt := OKC_TIME_UTIL_PUB.get_enddate
2885 (x_top_line_bs(l_tbs_ind ).DATE_START,
2886 p_uom,
2887 p_uom_Per_Period);
2888 END IF;
2889
2890
2891 IF TRUNC(l_date_start) >= TRUNC(x_top_line_bs(l_tbs_ind ).DATE_START)
2892 AND TRUNC(l_date_start) <= TRUNC(l_element_end_dt) THEN
2893
2894 NULL;
2895 ELSE
2896 l_tbs_ind := l_tbs_ind + 1;
2897 END IF;
2898
2899 elsif TRUNC(l_date_start) = TRUNC(x_top_line_bs(l_tbs_ind ).DATE_START) THEN
2900 l_tbs_ind := x_top_line_bs.first;
2901 END IF;
2902
2903
2904 -----errorout_ad('AFTER LOOP = ' || l_tbs_ind);
2905
2906 for l_index IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
2907 LOOP
2908
2909 IF l_tbs_ind <= x_top_line_bs.LAST THEN
2910
2911 IF l_tbs_ind = x_top_line_bs.LAST THEN
2912 l_bill_end_date := p_cp_end_dt;
2913 ELSE
2914
2915 IF x_top_line_bs(l_tbs_ind ).date_end IS NOT NULL THEN
2916 l_bill_end_date := x_top_line_bs(l_tbs_ind ).date_end;
2917 ELSE
2918 l_bill_end_date := x_top_line_bs(l_tbs_ind + 1).date_start - 1;
2919 END IF;
2920 END IF;
2921
2922 IF x_top_line_bs(l_tbs_ind).date_start <= l_cp_bs_tbl(l_index).date_start
2923 AND (l_bill_end_date) >= l_cp_bs_tbl(l_index).date_start THEN
2924
2925 x_top_line_bs(l_tbs_ind).amount := nvl(x_top_line_bs(l_tbs_ind).amount,0) +
2926 nvl(l_cp_bs_tbl(l_index).amount,0);
2927
2928 l_tbs_ind := l_tbs_ind + 1;
2929
2930 -----errorout_ad('amount = ' || x_top_line_bs(l_tbs_ind - 1).amount);
2931 -----errorout_ad('l_tbs_ind = ' || l_tbs_ind);
2932 -----errorout_ad('l_index = ' || l_index);
2933 ELSE
2934
2935 NULL;
2936 END IF;
2937 END IF; ---End of l_tbs_ind <= x_top_line_bs.LAST condition added for bug#2655416
2938
2939 END LOOP;
2940 END IF; ----end of both tbl count chk.
2941
2942 IF l_cp_bs_tbl.COUNT > 0 THEN
2943 x_next_cycle_dt := l_cp_bs_tbl(l_cp_bs_tbl.LAST ).date_end + 1;
2944 -----errorout_ad('NEXT DATE = ' || x_next_cycle_dt);
2945 END IF;
2946
2947 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2948
2949 fnd_log.STRING (fnd_log.level_statement,
2950 G_MODULE_CURRENT || '.Check_Existing_Lvlelement.out',
2951 'x_next_cycle_dt = ' || x_next_cycle_dt);
2952 END IF;
2953
2954 Exception
2955
2956 WHEN OTHERS then
2957 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2958 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Check_Existing_Lvlelement.UNEXPECTED',
2959 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2960 END IF;
2961 x_return_status := 'E';
2962
2963 END Check_Existing_Lvlelement;
2964
2965
2966
2967 FUNCTION Cal_Hdr_Amount
2968 (
2969 p_contract_id IN Number
2970 ) Return NUMBER
2971 Is
2972
2973 CURSOR l_total_amt_csr IS
2974 select SUM(nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
2975 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) tot_amt
2976 from oks_k_lines_b dtl, okc_k_lines_b line
2977 where line.id = dtl.cle_id
2978 AND line.dnz_chr_id = p_contract_id
2979 AND lse_id IN(1,12,14,19,46);
2980
2981
2982 l_total_amt_rec l_total_amt_csr%ROWTYPE;
2983
2984 BEGIN
2985
2986 --it will give the amount for hdr
2987
2988 OPEN l_total_amt_csr;
2989 FETCH l_total_amt_csr INTO l_total_amt_rec;
2990 IF l_total_amt_csr%NOTFOUND THEN
2991 CLOSE l_total_amt_csr;
2992 RETURN NULL;
2993 ELSE
2994 CLOSE l_total_amt_csr;
2995 RETURN l_total_amt_rec.tot_amt;
2996 end if;
2997
2998
2999 EXCEPTION
3000 WHEN OTHERS then
3001 RETURN NULL;
3002
3003 END Cal_Hdr_Amount;
3004
3005
3006 FUNCTION Find_Adjusted_Amount
3007 (
3008 p_line_id IN Number,
3009 p_total_amt IN Number,
3010 p_cycle_amt IN Number
3011 ) RETURN Number
3012
3013 IS
3014
3015 CURSOR l_tot_amt_csr IS
3016 SELECT nvl(SUM(amount),0) tot_amt
3017 FROM oks_level_elements
3018 WHERE cle_id = p_line_id;
3019
3020 l_adjusted_amount number;
3021 l_round_level_amt number;
3022 l_round_cycle_amt number;
3023 l_lvlelement_amt number;
3024 BEGIN
3025
3026 l_lvlelement_amt := 0;
3027
3028 Open l_tot_amt_csr;
3029 Fetch l_tot_amt_csr Into l_lvlelement_amt;
3030
3031 If l_tot_amt_csr%Notfound then
3032 l_lvlelement_amt := 0;
3033 End If;
3034
3035 Close l_tot_amt_csr;
3036
3037
3038
3039 l_round_level_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_lvlelement_amt, l_currency_code );
3040 l_round_cycle_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(p_cycle_amt, l_currency_code );
3041
3042 IF p_total_amt <> l_round_level_amt + l_round_cycle_amt THEN
3043 l_adjusted_amount := p_total_amt - l_round_level_amt;
3044 ELSE
3045 l_adjusted_amount := l_round_cycle_amt;
3046 END IF;
3047
3048 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3049
3050 fnd_log.STRING (fnd_log.level_statement,
3051 G_MODULE_CURRENT || '.Find_Adjusted_Amount.info',
3052 'l_adjusted_amount = ' || l_adjusted_amount
3053 ||', line id = ' || p_line_id
3054 );
3055 END IF;
3056
3057 RETURN l_adjusted_amount;
3058
3059 END Find_Adjusted_Amount;
3060
3061
3062 -------------------------------------------------------------------------
3063 -- Begin partial period computation logic
3064 -- Developer Mani Choudhary
3065 -- Date 09-MAY-2005
3066 -- Added two new parameters p_period_start and p_period_type
3067 -------------------------------------------------------------------------
3068 PROCEDURE Create_Level_elements(p_billing_type IN VARCHAR2,
3069 p_sll_tbl IN StrmLvl_Out_tbl,
3070 p_line_rec IN Line_Det_Type,
3071 p_invoice_ruleid IN Number,
3072 p_term_dt IN date,
3073 p_period_start IN VARCHAR2,
3074 p_period_type IN VARCHAR2,
3075 x_return_status OUT NOCOPY Varchar2
3076 )
3077 IS
3078
3079 l_line_sll_counter Number;
3080 l_period_counter Number;
3081 l_next_cycle_dt Date;
3082 l_bill_type Varchar2(10);
3083 l_line_end_date date;
3084 l_line_amt NUMBER;
3085 l_chk_round_adjustment NUMBER;
3086 l_adjusted_amount NUMBER;
3087 l_lvl_loop_counter NUMBER;
3088 l_last_cycle_dt Date;
3089 l_bill_sch_amt NUMBER := 0;
3090 l_tbl_seq NUMBER;
3091 l_term_amt NUMBER;
3092 l_uom_quantity NUMBER;
3093 l_tce_code VARCHAR2(100);
3094 l_constant_sll_amt NUMBER;
3095 l_remaining_amt NUMBER;
3096 l_dummy_top_line_bs oks_bill_level_elements_pvt.letv_tbl_type;
3097 l_billed_at_source OKC_K_HEADERS_ALL_B.BILLED_AT_SOURCE%TYPE;
3098 ------------------------------------------------------------------------
3099 -- Begin partial period computation logic
3100 -- Developer Mani Choudhary
3101 -- Date 17-MAY-2005
3102 -- local variables
3103 -------------------------------------------------------------------------
3104 l_full_period_end_date DATE;
3105 l_quantity NUMBER;
3106 l_total_quantity NUMBER;
3107
3108 l_last_cmp_date DATE;
3109 --------------------------------------------------------------------------
3110 --
3111 l_api_version CONSTANT NUMBER := 1.0;
3112 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
3113 l_return_status VARCHAR2(10);
3114 l_msg_count NUMBER;
3115 l_msg_data VARCHAR2(2000);
3116 l_msg_index_out NUMBER;
3117 l_msg_index NUMBER;
3118
3119 -- Start - Added by PMALLARA - Bug #3992530
3120 Lvl_Element_cnt Number := 0;
3121 Strm_Start_Date Date;
3122 -- End - Added by PMALLARA - Bug #3992530
3123
3124 BEGIN
3125
3126 x_return_status := 'S';
3127
3128 IF p_sll_tbl.COUNT <= 0 THEN
3129 RETURN;
3130 END IF;
3131
3132 l_bill_type := p_billing_type;
3133 l_lvl_ele_tbl_in.delete;
3134 l_tbl_seq := 1;
3135 l_bill_sch_amt := 0;
3136
3137 l_line_sll_counter := p_sll_tbl.FIRST;
3138
3139 ----for T and E, top line amt in lvl_element is always null,amt will be rolled up from sub line lvl elements
3140 --in cp case or subscription line amount is at line lvl only.
3141
3142
3143
3144 IF l_bill_type IN ('T','E') AND p_line_rec.chr_id IS NOT NULL
3145 AND p_line_rec.lse_id IN (1, 12, 14, 19) THEN
3146
3147 l_line_amt := NULL;
3148
3149 ELSIF p_line_rec.chr_id IS NOT NULL AND p_line_rec.lse_id IN (1, 12, 14, 19) THEN
3150 l_line_amt := p_line_rec.line_amt;
3151
3152 ELSE ----for cp and subscription line (lse_id =46)
3153 l_line_amt := p_line_rec.line_amt;
3154 END IF; --chk for line type
3155
3156
3157 l_chk_round_adjustment := p_sll_tbl.LAST;
3158
3159 IF TRUNC(nvl((p_term_dt - 1), p_line_rec.line_end_dt)) > p_line_rec.line_end_dt THEN
3160 l_line_end_date := p_line_rec.line_end_dt;
3161 ELSE
3162 l_line_end_date := TRUNC(nvl((p_term_dt - 1), p_line_rec.line_end_dt));
3163 END IF;
3164
3165 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3166
3167 fnd_log.STRING (fnd_log.level_statement,
3168 G_MODULE_CURRENT || '.Create_Level_elements.info',
3169 'l_chk_round_adjustment = ' || l_chk_round_adjustment
3170 ||', l_line_end_date (up to lvl ele) = ' || l_line_end_date
3171 ||', l_bill_type = ' || l_bill_type
3172 ||', l_header_billing = ' || l_header_billing
3173 );
3174 END IF;
3175
3176 IF l_header_billing IS NULL THEN
3177 ---delete all unbilled elements for a line
3178
3179 Delete_lvl_element(p_cle_id => p_line_rec.id,
3180 x_return_status => x_return_status);
3181
3182 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3183 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.del_ele',
3184 'Delete_lvl_element(x_return_status = '||x_return_status
3185 ||', line id passed = '|| p_line_rec.id ||')');
3186 END IF;
3187
3188 -----errorout_ad('Delete_lvl_element status = ' || x_return_status);
3189
3190 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3191 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3192 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3193 RAISE OKC_API.G_EXCEPTION_ERROR;
3194 END IF;
3195 END IF;
3196
3197 ---if (line terminated - 1) < line_start_dt
3198 IF TRUNC(p_line_rec.line_start_dt) > TRUNC(l_line_end_date) or
3199 TRUNC( p_line_rec.line_start_dt) > trunc(nvl((p_term_dt - 1),p_line_rec.line_end_dt)) THEN
3200
3201 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3202
3203 fnd_log.STRING (fnd_log.level_statement,
3204 G_MODULE_CURRENT || '.Create_Level_elements.chk',
3205 'BS not created as line start dt > line en dt');
3206 END IF;
3207
3208 x_return_status := 'S';
3209 RETURN;
3210 END IF;
3211
3212 LOOP ---sll rule loop
3213 -----errorout_ad('sll start date : '||to_char(p_line_rec.line_start_dt));
3214
3215 IF l_header_billing IS NOT NULL THEN ----hdr lvl billing no old sll and lvl elements
3216 l_next_cycle_dt := TRUNC(p_sll_tbl(l_line_sll_counter).dt_start);
3217 l_lvl_loop_counter := 1;
3218 l_period_counter := 1;
3219
3220 ELSE
3221 ---to get the counter
3222
3223 Check_Existing_Lvlelement(
3224 p_sll_id =>p_sll_tbl(l_line_sll_counter).id,
3225 p_sll_dt_start =>TRUNC(p_sll_tbl(l_line_sll_counter).dt_start),
3226 p_uom => null,
3227 p_uom_per_period => null,
3228 p_cp_end_dt => null,
3229 x_next_cycle_dt => l_next_cycle_dt,
3230 x_last_cycle_dt => l_last_cycle_dt,
3231 x_period_counter => l_period_counter,
3232 x_sch_amt => l_bill_sch_amt,
3233 x_top_line_bs => l_dummy_top_line_bs,
3234 x_return_status => x_return_status);
3235
3236 -----errorout_ad('LEVEL ELEMENT COUNTER = ' || TO_CHAR(l_period_counter));
3237 -----errorout_ad('LEVEL ELEMENT START DATE = ' || to_char(l_next_cycle_dt));
3238
3239 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3240 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3241 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3242 RAISE OKC_API.G_EXCEPTION_ERROR;
3243 END IF;
3244 l_lvl_loop_counter := l_period_counter;
3245 END IF;
3246
3247 IF l_period_counter > to_number(p_sll_tbl(l_line_sll_counter).level_period) THEN
3248
3249 IF l_line_sll_counter + 1 <= p_sll_tbl.LAST THEN
3250 l_next_cycle_dt := TRUNC(p_sll_tbl(l_line_sll_counter + 1).dt_start);
3251 ELSE
3252
3253 l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
3254 (TRUNC(p_sll_tbl(l_line_sll_counter).dt_start),
3255 p_sll_tbl(l_line_sll_counter).uom,
3256 (p_sll_tbl(l_line_sll_counter).uom_Per_Period *
3257 p_sll_tbl(l_line_sll_counter).level_period ));
3258
3259 l_next_cycle_dt := l_next_cycle_dt + 1;
3260 END IF; --if sll counter <= last
3261
3262 ELSE --period counter <= lvl period
3263
3264 -----errorout_ad('last date = ' || TO_CHAR(l_last_cycle_dt));
3265 -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom);
3266 -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom_Per_Period);
3267 IF L_next_cycle_dt IS null THEN
3268
3269
3270 L_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
3271 (l_last_cycle_dt,
3272 p_sll_tbl(l_line_sll_counter).uom,
3273 p_sll_tbl(l_line_sll_counter).uom_Per_Period);
3274
3275 -----errorout_ad('next_cycle_date = ' || to_char(l_next_cycle_dt));
3276
3277 l_next_cycle_dt := l_next_cycle_dt + 1;
3278 END IF; --next cycle dt is null
3279
3280 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3281
3282 fnd_log.STRING (fnd_log.level_statement,
3283 G_MODULE_CURRENT || '.Create_Level_elements.loop_info',
3284 'L_next_cycle_dt = ' || L_next_cycle_dt
3285 ||', last date = ' || l_last_cycle_dt
3286 ||', uom = ' || p_sll_tbl(l_line_sll_counter).uom
3287 );
3288 END IF;
3289
3290 IF TRUNC(l_next_cycle_dt) > l_line_end_date THEN
3291 x_return_status := 'S';
3292 RETURN;
3293 END IF;
3294
3295 IF l_bill_type = 'T' AND p_line_rec.lse_id = 46 THEN
3296 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
3297 p_timeunit => p_sll_tbl(l_line_sll_counter).uom,
3298 x_return_status => x_return_status,
3299 x_quantity => l_uom_quantity ,
3300 x_timeunit => l_tce_code);
3301
3302 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3303 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.seed_time',
3304 'OKS_BILL_UTIL_PUB.get_seeded_timeunit(x_return_status = '||x_return_status
3305 ||', x_timeunit = ' || l_tce_code
3306 ||', x_quantity = '|| l_uom_quantity ||')');
3307 END IF;
3308
3309 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
3310 RAISE G_EXCEPTION_HALT_VALIDATION;
3311 END IF;
3312
3313 l_remaining_amt := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3314
3315 Get_Constant_sll_Amount(p_line_start_date => p_line_rec.line_start_dt,
3316 p_line_end_date => p_line_rec.line_end_dt,
3317 p_cycle_start_date => l_next_cycle_dt,
3318 p_remaining_amount => l_remaining_amt,
3319 P_uom_quantity => l_uom_quantity,
3320 P_tce_code => l_tce_code,
3321 x_constant_sll_amt => l_constant_sll_amt,
3322 x_return_status => x_return_status);
3323
3324 --errorout_ad('shd not enter Get_Constant_sll_Amount = ' || x_return_status);
3325
3326
3327 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3328 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.sll_amt',
3329 'Get_Constant_sll_Amount(x_return_status = '||x_return_status
3330 ||', sll amt = ' || l_constant_sll_amt
3331 ||', l_remaining_amt passed = '|| l_remaining_amt ||')');
3332 END IF;
3333
3334 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
3335 RAISE G_EXCEPTION_HALT_VALIDATION;
3336 END IF;
3337 END IF; ---end of lse_id = 46
3338
3339 OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
3340 (p_timeunit => p_sll_tbl(l_line_sll_counter).uom,
3341 x_return_status => x_return_status,
3342 x_quantity => l_uom_quantity ,
3343 x_timeunit => l_tce_code);
3344 IF x_return_status <> 'S' THEN
3345 RAISE G_EXCEPTION_HALT_VALIDATION;
3346 END IF;
3347
3348
3349 -- Start - Added by PMALLARA - Bug #3992530
3350 Lvl_Element_cnt := l_period_counter - 1;
3351 Strm_Start_Date := p_sll_tbl(l_line_sll_counter).dt_start;
3352 LOOP -------------for level elements of one rule
3353 Lvl_Element_cnt := Lvl_Element_cnt + 1;
3354 -- End - Added by PMALLARA - Bug #3992530
3355
3356 l_fnd_lvl_in_rec.line_start_date := p_line_rec.line_start_dt;
3357 l_fnd_lvl_in_rec.line_end_date := nvl((p_term_dt-1),p_line_rec.line_end_dt);
3358 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
3359 -- Start - Modified by PMALLARA - Bug #3992530
3360 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * p_sll_tbl(l_line_sll_counter).uom_Per_Period;
3361 -- End - Modified by PMALLARA - Bug #3992530
3362 l_fnd_lvl_in_rec.tuom := p_sll_tbl(l_line_sll_counter).uom;
3363 l_fnd_lvl_in_rec.total_amount := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3364 l_fnd_lvl_in_rec.invoice_offset_days := p_sll_tbl(l_line_sll_counter).invoice_offset_days;
3365 l_fnd_lvl_in_rec.interface_offset_days := p_sll_tbl(l_line_sll_counter).Interface_offset_days;
3366 l_fnd_lvl_in_rec.bill_type := l_bill_type;
3367 --mchoudha added this parameter
3368 l_fnd_lvl_in_rec.uom_per_period := p_sll_tbl(l_line_sll_counter).uom_Per_Period;
3369 -----errorout_ad(' p_Line_rec.line_start_dt :' || to_char(p_line_rec.line_start_dt));
3370 -----errorout_ad(' p_Line_rec.line_end_dt :' || to_char(p_line_rec.line_end_dt));
3371 -----errorout_ad(' l_line_amt :' || l_line_amt);
3372 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch for line passed period :' || to_char(l_fnd_lvl_in_rec.uom_per_period));
3373 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch for line passed uom :' || l_fnd_lvl_in_rec.uom);
3374 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch for line passed cycle_start_date:' || to_char(l_fnd_lvl_in_rec.cycle_start_date));
3375
3376 -------------------------------------------------------------------------
3377 -- Begin partial period computation logic
3378 -- Developer Mani Choudhary
3379 -- Date 09-MAY-2005
3380 -- Added two new parameters p_period_start and p_period_type
3381 -- Start - Modified by PMALLARA - Bug #3992530
3382 IF fnd_log.level_procedure >= fnd_log.g_current_runtime_level THEN
3383 fnd_log.string(fnd_log.level_procedure,G_MODULE_CURRENT||'.Create_Level_elements.lvl_loop',
3384 'Calling oks_bill_util_pub.Get_next_bill_sch with parameters '
3385 ||'period start = ' || p_period_start
3386 ||', period type = ' || p_period_type);
3387 END IF;
3388
3389 OKS_BILL_UTIL_PUB.Get_next_bill_sch
3390 (p_api_version => l_api_version,
3391 x_return_status => x_return_status,
3392 x_msg_count => l_msg_count,
3393 x_msg_data => l_msg_data,
3394 p_invoicing_rule_id => p_invoice_ruleid,
3395 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
3396 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
3397 p_period_start => p_period_start,
3398 p_period_type => p_period_type,
3399 Strm_Start_Date => Strm_Start_Date);
3400 -- End - Modified by PMALLARA - Bug #3992530
3401
3402
3403 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3404 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.lvl_loop',
3405 'oks_bill_util_pub.Get_next_bill_sch(x_return_status = '||x_return_status
3406 ||', next date = ' || l_fnd_lvl_out_rec.next_cycle_date
3407 ||', tuom per period = ' || l_fnd_lvl_in_rec.tuom_per_period
3408 ||', cycle_start_date = '|| l_next_cycle_dt ||')');
3409 END IF;
3410
3411
3412 -----errorout_ad('LEVEL ELEMENT NEXT CYCLE DATE passed from Get_next_bill_sch = ' || TO_CHAR(l_fnd_lvl_out_rec.next_cycle_date));
3413
3414 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3415 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
3416 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3417 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3418 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
3419 RAISE OKC_API.G_EXCEPTION_ERROR;
3420 END IF;
3421
3422
3423 IF p_period_start is not null AND
3424 p_period_type is not null THEN
3425 l_last_cmp_date := l_line_end_date;
3426 ELSE
3427 l_last_cmp_date := p_line_rec.line_end_dt;
3428 END IF;
3429
3430 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt then
3431 null; ---donot insert record in level element
3432 ELSE
3433
3434 IF l_bill_type IN ('T','E') AND p_line_rec.lse_id <> 46 THEN
3435 l_adjusted_amount := NULL;
3436 --errorout_ad('l_bill_type IN T,E AND p_line_rec.lse_id <> 46 ');
3437 ELSIF l_bill_type = 'T' AND p_line_rec.lse_id = 46 THEN
3438 --errorout_ad('l_bill_type = T AND p_line_rec.lse_id = 46 ');
3439 IF (l_line_sll_counter = l_chk_round_adjustment AND
3440 l_lvl_loop_counter = p_sll_tbl(l_chk_round_adjustment).level_period) OR
3441 --Mani PPC changing p_line_rec.line_end_dt to l_last_cmp_date
3442 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
3443
3444 l_adjusted_amount := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3445
3446 ELSE --not adjustment round
3447 l_adjusted_amount := l_constant_sll_amt;
3448 END IF;
3449
3450 ELSIF (l_bill_type = 'E' AND p_line_rec.lse_id = 46)
3451 OR l_bill_type = 'P' THEN
3452 --errorout_ad('(l_bill_type = E AND p_line_rec.lse_id = 46 OR l_bill_type = P');
3453 IF (l_line_sll_counter = l_chk_round_adjustment AND
3454 l_lvl_loop_counter = p_sll_tbl(l_chk_round_adjustment).level_period) OR
3455 --Mani PPC changing p_line_rec.line_end_dt to l_last_cmp_date
3456 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
3457
3458 l_adjusted_amount := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3459
3460 ELSE --not adjustment round
3461 ------------------------------------------------------------------------
3462 -- Begin partial period computation logic
3463 -- Developer Mani Choudhary
3464 -- Date 17-MAY-2005
3465 -- For Covered level and subscription calculate the billing schedule amount
3466 -- for the first partial period.
3467 -------------------------------------------------------------------------
3468
3469 IF p_period_start = 'CALENDAR' AND
3470 p_period_start IS NOT NULL AND
3471 p_period_type IS NOT NULL AND
3472 TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
3473 THEN
3474 --New parameters in Bold
3475 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
3476 l_quantity := OKS_TIME_MEASURES_PUB.get_quantity
3477 (p_start_date => l_next_cycle_dt,
3478 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
3479 p_source_uom => l_fnd_lvl_in_rec.tuom ,
3480 p_period_type => p_period_type,
3481 p_period_start => p_period_start);
3482
3483 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3484 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_Level_elements.Calendar',
3485 'after calling OKS_TIME_MEASURES_PUB.get_quantity with p_period_type '||p_period_type||' ,p_period_start '||p_period_start
3486 ||' result l_quantity = ' || l_quantity);
3487 END IF;
3488
3489 IF nvl(l_quantity,0) = 0 THEN
3490 RAISE G_EXCEPTION_HALT_VALIDATION;
3491 END IF;
3492
3493
3494 l_adjusted_amount :=p_sll_tbl(l_line_sll_counter).amount*l_quantity/l_fnd_lvl_in_rec.uom_per_period; --bugfix 5485442
3495
3496 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3497 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_Level_elements.Calendar',
3498 'after calling OKS_TIME_MEASURES_PUB.get_quantity '
3499 ||' result l_adjusted_amount = ' || l_adjusted_amount);
3500 END IF;
3501 --mchoudha fix for bug#5200003
3502 ELSE
3503 l_adjusted_amount := nvl( p_sll_tbl(l_line_sll_counter).amount*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(l_next_cycle_dt))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
3504
3505 END IF;
3506 ELSE
3507 l_adjusted_amount := p_sll_tbl(l_line_sll_counter).amount;
3508 END IF; --period start and period type not null
3509 END IF; --l_line_sll_counter = l_chk_round_adjustment
3510 END IF; --IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt
3511
3512 --insert in lvl element tbl
3513
3514
3515 l_lvl_ele_tbl_in(l_tbl_seq).sequence_number := to_char(l_period_counter);
3516 l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id := p_line_rec.dnz_chr_id;
3517 l_lvl_ele_tbl_in(l_tbl_seq).cle_id := p_line_rec.id;
3518
3519 IF p_line_rec.lse_id IN (1,12,14,19,46) THEN
3520 l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id := p_line_rec.id;
3521 ELSE ---subline
3522 l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id := p_line_rec.cle_id;
3523 END IF;
3524
3525
3526 IF l_next_cycle_dt < p_Line_rec.line_start_dt THEN
3527 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(p_Line_rec.line_start_dt);
3528 ELSE
3529 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(l_next_cycle_dt);
3530 END IF;
3531 l_lvl_ele_tbl_in(l_tbl_seq).date_end := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
3532
3533
3534 IF l_bill_type IN ('T','E') AND p_Line_rec.lse_id <> 46 THEN
3535 ----FOR T,E AND TOP LINE amt should be null to shoW rollup amt
3536
3537 IF p_Line_rec.chr_id IS NOT NULL THEN --top line
3538 l_lvl_ele_tbl_in(l_tbl_seq).amount := NULL;
3539 ELSE ----cp level
3540 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_adjusted_amount,l_currency_code );
3541 END IF;
3542
3543 ELSE ----for billing type = p and lse_id = 46
3544
3545 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_adjusted_amount,l_currency_code );
3546 END IF;
3547
3548
3549 l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl := l_fnd_lvl_out_rec.date_recievable_gl;
3550 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := TRUNC(l_fnd_lvl_out_rec.date_transaction);
3551 l_lvl_ele_tbl_in(l_tbl_seq).date_due := l_fnd_lvl_out_rec.date_due;
3552 l_lvl_ele_tbl_in(l_tbl_seq).date_print := l_fnd_lvl_out_rec.date_print;
3553 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
3554
3555 SELECT nvl(BILLED_AT_SOURCE , 'N')
3556 INTO l_billed_at_source
3557 FROM OKC_K_HEADERS_ALL_B
3558 WHERE id = p_line_rec.dnz_chr_id;
3559
3560 if l_billed_at_source = 'Y' Then
3561 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := sysdate;
3562 else
3563 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
3564 end if;
3565
3566 l_lvl_ele_tbl_in(l_tbl_seq).rul_id := p_sll_tbl(l_line_sll_counter).id;
3567
3568 l_lvl_ele_tbl_in(l_tbl_seq).object_version_number := OKC_API.G_MISS_NUM;
3569 l_lvl_ele_tbl_in(l_tbl_seq).created_by := OKC_API.G_MISS_NUM;
3570 l_lvl_ele_tbl_in(l_tbl_seq).creation_date := SYSDATE;
3571 l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by := OKC_API.G_MISS_NUM;
3572 l_lvl_ele_tbl_in(l_tbl_seq).last_update_date := SYSDATE;
3573
3574
3575 -----errorout_ad ('Amount for line lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
3576 IF p_period_start is null OR
3577 p_period_type is null THEN
3578
3579 IF p_term_dt IS NOT NULL AND TRUNC(l_lvl_ele_tbl_in(l_tbl_seq).date_start) < TRUNC(p_term_dt) AND
3580 TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > TRUNC(p_term_dt) AND
3581 p_term_dt <= p_Line_rec.line_end_dt THEN
3582
3583 l_lvl_ele_tbl_in(l_tbl_seq).date_end := (p_term_dt - 1);
3584
3585 IF l_bill_type = 'P' OR p_Line_rec.lse_id = 46 THEN
3586
3587 -----errorout_ad('going to calculate l_term_amt');
3588 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) > p_Line_rec.line_end_dt THEN
3589
3590 l_term_amt := Find_term_amt(p_cycle_st_dt => l_lvl_ele_tbl_in(l_tbl_seq).date_start,
3591 p_term_dt => p_term_dt,
3592 p_cycle_end_dt => p_Line_rec.line_end_dt,
3593 p_amount => nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
3594
3595
3596 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3597 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.term_period',
3598 'find_term_amt(x_return_status = '||x_return_status
3599 ||', l_term_amt = ' || l_term_amt
3600 ||', p_cycle_st_dt = ' || l_lvl_ele_tbl_in(l_tbl_seq).date_start
3601 ||', p_term_dt = ' || p_Line_rec.line_end_dt
3602 ||', lvl amt = ' || nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0)
3603 ||', p_cycle_end_dt = '|| l_next_cycle_dt ||')');
3604 END IF;
3605
3606 ELSE
3607 l_term_amt := Find_term_amt(p_cycle_st_dt => l_lvl_ele_tbl_in(l_tbl_seq).date_start,
3608 p_term_dt => p_term_dt,
3609 p_cycle_end_dt => l_fnd_lvl_out_rec.next_cycle_date - 1,
3610 p_amount => nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
3611
3612 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3613 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.term_period',
3614 'find_term_amt(x_return_status = '||x_return_status
3615 ||', l_term_amt = ' || l_term_amt
3616 ||', p_cycle_st_dt = ' || l_lvl_ele_tbl_in(l_tbl_seq).date_start
3617 ||', p_term_dt = ' || p_Line_rec.line_end_dt
3618 ||', lvl amt = ' || nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0)
3619 ||', p_cycle_end_dt = '|| l_fnd_lvl_out_rec.next_cycle_date - 1 ||')');
3620 END IF; -- fnd_log.level_event >= fnd_log.g_current_runtime_level
3621 END IF; -- TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) > p_Line_rec.line_end_dt
3622
3623
3624 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_term_amt;
3625 END IF; -----end of cal of term amt.
3626 END IF; ----end of lvlelement end date assign
3627 END IF; --period start null or period type null
3628
3629 l_period_counter := l_period_counter + 1;
3630 l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
3631 l_tbl_seq := l_tbl_seq + 1;
3632 END IF; -----end if for level element creation
3633
3634 l_next_cycle_dt := l_fnd_lvl_out_rec.next_cycle_date;
3635
3636 EXIT WHEN (l_lvl_loop_counter = to_number(p_sll_tbl(l_line_sll_counter).level_period)) OR
3637 (TRUNC(l_next_cycle_dt) > l_line_end_date);
3638
3639 l_lvl_loop_counter := l_lvl_loop_counter + 1;
3640
3641 END LOOP; ---loop for sll period counter
3642
3643 END IF; ----Period counter checking before entering in loop for lvlelement
3644
3645 -----errorout_ad('l_next_cycle_dt = ' || TO_CHAR(l_next_cycle_dt));
3646 -----errorout_ad('LINE END DATE = ' || TO_CHAR(p_Line_rec.line_end_dt));
3647
3648
3649 EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
3650 (TRUNC(l_next_cycle_dt) > l_line_end_date);
3651
3652 l_line_sll_counter := p_sll_tbl.NEXT(l_line_sll_counter);
3653
3654 END LOOP; -----loop for sll lines
3655
3656 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
3657 IF l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end > p_line_rec.line_end_dt THEN
3658 l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end := p_line_rec.line_end_dt;
3659 END IF;
3660
3661 OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
3662 p_api_version => l_api_version,
3663 p_init_msg_list => l_init_msg_list,
3664 x_return_status => x_return_status,
3665 x_msg_count => l_msg_count,
3666 x_msg_data => l_msg_data,
3667 p_letv_tbl => l_lvl_ele_tbl_in,
3668 x_letv_tbl => l_lvl_ele_tbl_out);
3669
3670 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3671 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.insert',
3672 'oks_bill_level_elements_pvt.insert_row(x_return_status = '||x_return_status
3673 ||', l_lvl_ele_tbl_out = '|| l_lvl_ele_tbl_out.count ||')');
3674 END IF;
3675
3676 -----errorout_ad('LEVEL ELEMENT INSERT STATUS line = ' || x_return_status);
3677
3678
3679 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3680 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for line = ' || l_msg_data);
3681 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3682 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3683 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for line = ' || l_msg_data);
3684 RAISE OKC_API.G_EXCEPTION_ERROR;
3685 END IF;
3686 END IF;
3687
3688
3689 EXCEPTION
3690 WHEN G_EXCEPTION_HALT_VALIDATION THEN
3691 x_return_status := G_RET_STS_ERROR;
3692 WHEN OTHERS THEN
3693
3694 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
3695 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Create_Level_elements.UNEXPECTED',
3696 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
3697 END IF;
3698 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
3699 p_msg_name => G_UNEXPECTED_ERROR,
3700 p_token1 => G_SQLCODE_TOKEN,
3701 p_token1_value => sqlcode,
3702 p_token2 => G_SQLERRM_TOKEN,
3703 p_token2_value => sqlerrm);
3704
3705 x_return_status := G_RET_STS_UNEXP_ERROR;
3706 END Create_Level_elements;
3707
3708
3709 -------------------------------------------------------------------------
3710 -- Begin partial period computation logic
3711 -- Developer Mani Choudhary
3712 -- Date 09-MAY-2005
3713 -- Added two new parameters p_period_start and p_period_type
3714 -------------------------------------------------------------------------
3715 PROCEDURE Create_Hdr_Level_elements(
3716 p_billing_type IN VARCHAR2,
3717 p_sll_tbl IN StrmLvl_Out_tbl,
3718 p_hdr_rec IN Contract_Rec_Type,
3719 p_invoice_ruleid IN Number,
3720 p_called_from IN NUMBER,
3721 p_period_start IN VARCHAR2,
3722 p_period_type IN VARCHAR2,
3723 x_return_status OUT NOCOPY Varchar2
3724 )
3725 IS
3726
3727 l_sll_counter Number;
3728 l_tbl_seq Number;
3729 l_next_cycle_dt Date;
3730 l_lvl_loop_counter NUMBER;
3731 l_cycle_amt number;
3732 l_bill_type VARCHAR2(10);
3733
3734 --
3735 l_api_version CONSTANT NUMBER := 1.0;
3736 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
3737 l_return_status VARCHAR2(10);
3738 l_msg_count NUMBER;
3739 l_msg_data VARCHAR2(2000);
3740 l_msg_index_out NUMBER;
3741 l_msg_index NUMBER;
3742 i number;
3743
3744 -- Start - Added by PMALLARA - Bug #3992530
3745 Lvl_Element_cnt Number := 0;
3746 Strm_Start_Date Date;
3747 -- End - Added by PMALLARA - Bug #3992530
3748
3749 BEGIN
3750
3751 --l_hdr_end_date := p_hdr_rec.end_dt;
3752 x_return_status := 'S';
3753
3754 l_lvl_ele_tbl_in.delete;
3755 l_tbl_seq := 1;
3756 l_sll_counter := p_sll_tbl.FIRST;
3757 l_bill_type := p_billing_type;
3758
3759
3760 IF p_called_from = 1 THEN
3761 --delete lvl lements for hdr and all (sll and lvl elemnts) of top lines and cp.
3762
3763 Del_hdr_lvl_element(p_hdr_id => p_hdr_rec.id,
3764 x_return_status => x_return_status);
3765
3766
3767 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3768 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Hdr_Level_elements.del_ele',
3769 'Del_hdr_lvl_element(x_return_status = '||x_return_status
3770 ||', p_hdr_id passed = '||p_hdr_rec.id ||')');
3771 END IF;
3772
3773 -----errorout_ad('Del_hdr_lvl_element status = ' || x_return_status);
3774 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3775 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3776 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3777 RAISE OKC_API.G_EXCEPTION_ERROR;
3778 END IF;
3779 END IF;
3780
3781
3782 LOOP ---sll rule loop
3783 -----errorout_ad('sll rule start date : '||to_char(p_line_rec.line_start_dt));
3784
3785 l_next_cycle_dt := p_sll_tbl(l_sll_counter).dt_start;
3786 l_lvl_loop_counter := 1;
3787
3788
3789 -- Start - Added by PMALLARA - Bug #3992530
3790 Lvl_Element_cnt := 0;
3791 LOOP -------------for level elements of one rule
3792 Lvl_Element_cnt := Lvl_Element_cnt + 1;
3793 if Lvl_Element_cnt = 1 then
3794 Strm_Start_Date := l_next_cycle_dt;
3795 end if;
3796 -- End - Added by PMALLARA - Bug #3992530
3797
3798 l_fnd_lvl_in_rec.line_start_date := p_hdr_rec.start_dt;
3799 l_fnd_lvl_in_rec.line_end_date := p_hdr_rec.end_dt;
3800 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
3801 -- Start - Modified by PMALLARA - Bug #3992530
3802 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * p_sll_tbl(l_sll_counter).uom_Per_Period;
3803 -- End - Modified by PMALLARA - Bug #3992530
3804 l_fnd_lvl_in_rec.tuom := p_sll_tbl(l_sll_counter).uom;
3805 l_fnd_lvl_in_rec.total_amount := 0;
3806 l_fnd_lvl_in_rec.invoice_offset_days := p_sll_tbl(l_sll_counter).invoice_offset_days;
3807 l_fnd_lvl_in_rec.interface_offset_days := p_sll_tbl(l_sll_counter).Interface_offset_days;
3808 l_fnd_lvl_in_rec.bill_type := l_bill_type;
3809 --mchoudha added this parameter
3810 l_fnd_lvl_in_rec.uom_per_period := p_sll_tbl(l_sll_counter).uom_Per_Period;
3811
3812 -------------------------------------------------------------------------
3813 -- Begin partial period computation logic
3814 -- Developer Mani Choudhary
3815 -- Date 09-MAY-2005
3816 -- Added two new parameters p_period_start and p_period_type
3817 -- Start - Modified by PMALLARA - Bug #3992530
3818 OKS_BILL_UTIL_PUB.Get_next_bill_sch
3819 (p_api_version => l_api_version,
3820 x_return_status => x_return_status,
3821 x_msg_count => l_msg_count,
3822 x_msg_data => l_msg_data,
3823 p_invoicing_rule_id => p_invoice_ruleid,
3824 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
3825 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
3826 p_period_start => p_period_start,
3827 p_period_type => p_period_type,
3828 Strm_Start_Date => Strm_Start_Date);
3829 -- End - Modified by PMALLARA - Bug #3992530
3830
3831 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3832 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_hdr_level_elements.lvl_loop',
3833 'oks_bill_util_pub.Get_next_bill_sch(x_return_status = '||x_return_status
3834 ||', next date = ' || l_fnd_lvl_out_rec.next_cycle_date
3835 ||', tuom per period = ' || l_fnd_lvl_in_rec.tuom_per_period
3836 ||', cycle_start_date = '|| l_next_cycle_dt ||')');
3837 END IF;
3838
3839 -----errorout_ad('hdr Get_next_bill_sch status = ' || x_return_status);
3840
3841 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3842 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_fnd_msg_data);
3843 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3844 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3845 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_fnd_msg_data);
3846 RAISE OKC_API.G_EXCEPTION_ERROR;
3847 END IF;
3848
3849
3850
3851 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_hdr_rec.start_dt then
3852 NULL; ---donot insert record in level element
3853 ELSE
3854
3855 -----errorout_ad('l_lvl_loop_counter = ' || l_lvl_loop_counter);
3856 -----errorout_ad('l_tbl_seq = ' || l_tbl_seq);
3857
3858 l_lvl_ele_tbl_in(l_tbl_seq).sequence_number := to_char(l_lvl_loop_counter);
3859 l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id := p_hdr_rec.id;
3860 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(l_next_cycle_dt);
3861 l_lvl_ele_tbl_in(l_tbl_seq).date_end := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
3862
3863 IF l_bill_type = 'T' then
3864 ----FOR T amt should be null
3865 l_lvl_ele_tbl_in(l_tbl_seq).amount := NULL;
3866
3867 ELSE ----for E
3868
3869 l_cycle_amt := TO_NUMBER(p_sll_tbl(l_sll_counter).amount);
3870 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_cycle_amt,l_currency_code );
3871 END IF;
3872
3873
3874 l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl := l_fnd_lvl_out_rec.date_recievable_gl;
3875 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := TRUNC(l_fnd_lvl_out_rec.date_transaction);
3876 l_lvl_ele_tbl_in(l_tbl_seq).date_due := l_fnd_lvl_out_rec.date_due;
3877 l_lvl_ele_tbl_in(l_tbl_seq).date_print := l_fnd_lvl_out_rec.date_print;
3878 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
3879 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
3880 l_lvl_ele_tbl_in(l_tbl_seq).rul_id := p_sll_tbl(l_sll_counter).id;
3881
3882 l_lvl_ele_tbl_in(l_tbl_seq).object_version_number := OKC_API.G_MISS_NUM;
3883 l_lvl_ele_tbl_in(l_tbl_seq).created_by := OKC_API.G_MISS_NUM;
3884 l_lvl_ele_tbl_in(l_tbl_seq).creation_date := SYSDATE;
3885 l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by := OKC_API.G_MISS_NUM;
3886 l_lvl_ele_tbl_in(l_tbl_seq).last_update_date := SYSDATE;
3887
3888 l_tbl_seq := l_tbl_seq + 1;
3889
3890 END IF; -----end if for level element creation
3891
3892 l_next_cycle_dt := l_fnd_lvl_out_rec.next_cycle_date;
3893
3894 EXIT WHEN (l_lvl_loop_counter = to_number(p_sll_tbl(l_sll_counter).level_period)) OR
3895 (TRUNC(l_next_cycle_dt) > p_hdr_rec.end_dt);
3896
3897 l_lvl_loop_counter := l_lvl_loop_counter + 1;
3898
3899 END LOOP; ---loop for sll period counter
3900
3901
3902 EXIT WHEN (l_sll_counter = p_sll_tbl.LAST) OR
3903 (TRUNC(l_next_cycle_dt) > p_hdr_rec.end_dt);
3904
3905 l_sll_counter := p_sll_tbl.NEXT(l_sll_counter);
3906
3907 END LOOP; -----loop for sll lines
3908
3909 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
3910
3911 OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
3912 p_api_version => l_api_version,
3913 p_init_msg_list => l_init_msg_list,
3914 x_return_status => x_return_status,
3915 x_msg_count => l_msg_count,
3916 x_msg_data => l_msg_data,
3917 p_letv_tbl => l_lvl_ele_tbl_in,
3918 x_letv_tbl => l_lvl_ele_tbl_out);
3919
3920 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3921 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_hdr_level_elements.insert',
3922 'oks_bill_level_elements_pvt.insert_row(x_return_status = '||x_return_status
3923 ||', l_lvl_ele_tbl_out = '|| l_lvl_ele_tbl_out.count ||')');
3924 END IF;
3925
3926
3927 -----errorout_ad('LEVEL ELEMENT INSERT STATUS = ' || x_return_status);
3928
3929
3930 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3931 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row = ' || l__msg_data);
3932 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3933 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3934 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row = ' || l_msg_data);
3935 RAISE OKC_API.G_EXCEPTION_ERROR;
3936 END IF;
3937 END IF;
3938
3939
3940
3941 EXCEPTION
3942 WHEN OTHERS THEN
3943 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
3944 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_hdr_level_elements.UNEXPECTED',
3945 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
3946 END IF;
3947 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
3948 p_msg_name => G_UNEXPECTED_ERROR,
3949 p_token1 => G_SQLCODE_TOKEN,
3950 p_token1_value => sqlcode,
3951 p_token2 => G_SQLERRM_TOKEN,
3952 p_token2_value => sqlerrm);
3953
3954 x_return_status := G_RET_STS_UNEXP_ERROR;
3955 END Create_Hdr_Level_elements;
3956
3957 FUNCTION Find_Currency_Code
3958 ( p_cle_id NUMBER,
3959 p_chr_id NUMBER
3960 )
3961 RETURN VARCHAR2
3962 IS
3963
3964 CURSOR l_line_cur IS
3965 SELECT contract.currency_code
3966 FROM okc_k_headers_b contract, okc_k_lines_b line
3967 WHERE contract.id = line.dnz_chr_id and line.id = p_cle_id;
3968
3969 CURSOR l_hdr_cur IS
3970 SELECT contract.currency_code
3971 FROM okc_k_headers_b contract
3972 WHERE contract.id = p_chr_id;
3973
3974
3975 l_Currency VARCHAR2(15);
3976
3977 BEGIN
3978
3979 IF p_chr_id IS NULL THEN ---called for line
3980 OPEN l_line_cur;
3981 FETCH l_line_cur INTO l_currency;
3982
3983 IF l_line_cur%NOTFOUND THEN
3984 l_Currency := NULL;
3985 END IF;
3986
3987 Close l_line_cur;
3988
3989 ELSE ---FOR HEADER
3990
3991 OPEN l_hdr_cur;
3992 FETCH l_hdr_cur INTO l_currency;
3993
3994 IF l_hdr_cur%NOTFOUND THEN
3995 l_Currency := NULL;
3996 END IF;
3997
3998 Close l_hdr_cur;
3999
4000 END IF;
4001
4002 RETURN l_Currency;
4003
4004 EXCEPTION
4005 WHEN NO_DATA_FOUND THEN
4006 RETURN NULL;
4007 WHEN OTHERS THEN
4008 RETURN NULL;
4009
4010 END Find_Currency_Code;
4011
4012
4013 Procedure Update_Sll_Amount
4014 (
4015 p_line_id IN NUMBER,
4016 x_return_status OUT NOCOPY Varchar2
4017 )
4018 IS
4019
4020 Cursor l_Line_Csr Is
4021 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.lse_id lse_id,
4022 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
4023 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
4024 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
4025 FROM okc_k_lines_b line, oks_k_lines_b dtl
4026 WHERE line.id = dtl.cle_id AND line.Id = p_line_id ;
4027
4028 CURSOR l_Line_Sll_Csr IS
4029 SELECT sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
4030 sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
4031 sll.interface_offset_days, sll.cle_id, sll.chr_id,
4032 sll.dnz_chr_id, sll.end_date,sll.object_version_number
4033 FROM oks_stream_levels_b sll
4034 WHERE sll.cle_id = p_line_id
4035 ORDER BY sll.sequence_no;
4036
4037 l_Line_Csr_Rec l_Line_Csr%Rowtype;
4038 l_Line_Sll_Csr_Rec l_Line_Sll_Csr%Rowtype;
4039 l_Line_Amount NUMBER;
4040 l_Sll_Counter NUMBER;
4041 l_remaining_amt NUMBER;
4042 l_used_amt NUMBER;
4043 l_total_period NUMBER;
4044 l_prorate_counter NUMBER;
4045 l_amt_counter NUMBER;
4046 l_sll_index NUMBER;
4047 l_sll_amt NUMBER;
4048 l_period_sll_amount NUMBER(20,2);
4049
4050 l_return_status VARCHAR2(10);
4051 l_msg_count NUMBER;
4052 l_msg_data VARCHAR2(2000);
4053 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
4054
4055 l_sll_prorate_tbl sll_prorated_tab_type;
4056 -------------------------------------------------------------------------
4057 -- Begin partial period computation logic
4058 -- Developer Mani Choudhary
4059 -- Date 04-MAY-2005
4060 -------------------------------------------------------------------------
4061 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
4062 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
4063 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
4064 l_tangible BOOLEAN;
4065 l_pricing_method Varchar2(30);
4066 -------------------------------------------------------------------------
4067 -- End partial period computation logic
4068 -- Date 04-MAY-2005
4069 -------------------------------------------------------------------------
4070 ----The procedure finds the amount for line . Then find the amount for sll rule from the given periods and
4071 ----line amount and update the sll rule.
4072 BEGIN
4073
4074 x_return_status := 'S';
4075
4076 l_strm_lvl_tbl_in.DELETE;
4077
4078 OPEN l_Line_Csr;
4079 FETCH l_Line_Csr INTO l_Line_Csr_Rec;
4080
4081 IF l_Line_Csr%NOTFOUND THEN
4082 Close l_Line_Csr;
4083 x_return_status := 'E';
4084 RETURN;
4085 ELSE
4086 Close l_Line_Csr;
4087 END IF;
4088
4089 -------------------------------------------------------------------------
4090 -- Begin partial period computation logic
4091 -- Developer Mani Choudhary
4092 -- Date 09-MAY-2005
4093 -------------------------------------------------------------------------
4094
4095 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
4096 (
4097 p_hdr_id =>l_Line_Csr_Rec.dnz_chr_id,
4098 p_org_id => NULL,
4099 x_period_start => l_period_start,
4100 x_period_type => l_period_type,
4101 x_price_uom => l_price_uom,
4102 x_return_status => x_return_status);
4103
4104 IF x_return_status <> 'S' THEN
4105 RAISE G_EXCEPTION_HALT_VALIDATION;
4106 END IF;
4107 --Description in detail for the business rules for deriving the period start
4108 --1)For usage , period start will always be 'SERVICE'
4109 --2)For Subscriptions, period start and period type will be NULL
4110 -- for tangible subscriptions as per CR1.For intangible subscriptions,
4111 -- if the profile OKS: Intangible Subscription Pricing Method
4112 -- is set to 'Subscription Based',then period start and period type will be NULL
4113 -- otherwise it will be 'SERVICE'
4114 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
4115
4116 --mchoudha fix for bug#5183011
4117 IF l_period_start IS NOT NULL AND
4118 l_period_type IS NOT NULL
4119 THEN
4120 IF l_Line_Csr_Rec.lse_id = 12 THEN
4121 l_period_start := 'SERVICE';
4122 END IF;
4123 IF l_Line_Csr_Rec.lse_id = 46 THEN
4124 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_line_id);
4125 IF l_tangible THEN
4126 l_period_start := NULL;
4127 l_period_type := NULL;
4128 ELSE
4129 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
4130 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
4131 l_period_start := NULL;
4132 l_period_type := NULL;
4133 ELSE
4134 l_period_start := 'SERVICE';
4135 END IF; -- l_pricing_method <> 'EFFECTIVITY'
4136 END IF; -- IF l_tangible
4137 END IF; -- l_Line_Csr_Rec.lse_id = 46
4138 END IF; -- period start and period type are not null
4139 -------------------------------------------------------------------------
4140 -- End partial period computation logic
4141 -- Date 09-MAY-2005
4142 -------------------------------------------------------------------------
4143
4144
4145 IF l_currency_code IS NULL THEN
4146 l_currency_code := Find_Currency_Code(
4147 p_cle_id => p_line_id,
4148 p_chr_id => NULL);
4149 IF l_currency_code IS NULL THEN
4150 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
4151 x_return_status := 'E';
4152 RETURN;
4153 END IF;
4154 END IF; ---currency code null
4155
4156 l_Line_Amount := l_Line_Csr_Rec.line_amt;
4157
4158 l_Sll_Counter := 1;
4159 l_used_amt := 0;
4160 l_prorate_counter := 0;
4161
4162 FOR l_Line_Sll_Csr_REC IN l_Line_Sll_Csr
4163 LOOP
4164
4165 IF l_Line_Sll_Csr_Rec.level_amount IS NOT NULL THEN ---------calculate total sll amount
4166
4167 l_sll_amt := (l_Line_Sll_Csr_Rec.level_amount * l_Line_Sll_Csr_Rec.level_periods);
4168 l_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt, l_currency_code);
4169 l_used_amt := l_used_amt + l_sll_amt;
4170
4171 -----errorout_ad('sll amount = ' || to_char(l_sll_amt));
4172 -----errorout_ad('total used amount = ' || to_char(l_used_amt));
4173
4174 ELSE
4175
4176 l_prorate_counter := l_prorate_counter + 1;
4177 -----errorout_ad('prorate counter = ' || to_char(l_prorate_counter));
4178
4179 l_sll_prorate_tbl(l_prorate_counter).sll_seq_num := l_sll_counter; ---index of sll table
4180 l_sll_prorate_tbl(l_prorate_counter).sll_start_date := l_line_sll_csr_rec.Start_Date;
4181 l_sll_prorate_tbl(l_prorate_counter).sll_end_date := l_line_sll_csr_rec.end_Date;
4182 l_sll_prorate_tbl(l_prorate_counter).sll_tuom := l_Line_Sll_Csr_Rec.uom_code;
4183 l_sll_prorate_tbl(l_prorate_counter).sll_period := l_Line_Sll_Csr_Rec.level_periods;
4184 l_sll_prorate_tbl(l_prorate_counter).sll_uom_per_period := l_Line_Sll_Csr_Rec.uom_per_period;
4185 END IF;
4186
4187
4188 l_strm_lvl_tbl_in(l_Sll_Counter).id := l_Line_Sll_Csr_Rec.id;
4189 l_strm_lvl_tbl_in(l_Sll_Counter).cle_id := l_Line_Sll_Csr_Rec.cle_id;
4190 l_strm_lvl_tbl_in(l_Sll_Counter).chr_id := l_Line_Sll_Csr_Rec.chr_id;
4191 l_strm_lvl_tbl_in(l_Sll_Counter).dnz_chr_id := l_Line_Sll_Csr_Rec.dnz_chr_id;
4192 l_strm_lvl_tbl_in(l_Sll_Counter).uom_code := l_Line_Sll_Csr_Rec.uom_code;
4193 l_strm_lvl_tbl_in(l_Sll_Counter).sequence_no := l_Line_Sll_Csr_Rec.sequence_no;
4194 l_strm_lvl_tbl_in(l_Sll_Counter).start_date := l_line_sll_csr_rec.Start_Date;
4195 l_strm_lvl_tbl_in(l_Sll_Counter).end_date := l_line_sll_csr_rec.end_Date;
4196 l_strm_lvl_tbl_in(l_Sll_Counter).level_periods := l_Line_Sll_Csr_Rec.level_periods;
4197 l_strm_lvl_tbl_in(l_Sll_Counter).uom_per_period := l_Line_Sll_Csr_Rec.uom_per_period;
4198 l_strm_lvl_tbl_in(l_Sll_Counter).level_amount := l_Line_Sll_Csr_Rec.level_amount;
4199 l_strm_lvl_tbl_in(l_Sll_Counter).invoice_offset_days := l_Line_Sll_Csr_Rec.invoice_offset_days;
4200 l_strm_lvl_tbl_in(l_Sll_Counter).interface_offset_days := l_Line_Sll_Csr_Rec.interface_offset_days;
4201 l_strm_lvl_tbl_in(l_Sll_Counter).object_version_number := l_Line_Sll_Csr_Rec.object_version_number;
4202
4203 l_strm_lvl_tbl_in(l_Sll_Counter).created_by := OKC_API.G_MISS_NUM;
4204 l_strm_lvl_tbl_in(l_Sll_Counter).creation_date := SYSDATE;
4205 l_strm_lvl_tbl_in(l_Sll_Counter).last_updated_by := OKC_API.G_MISS_NUM;
4206 l_strm_lvl_tbl_in(l_Sll_Counter).last_update_date := SYSDATE;
4207
4208
4209 l_Sll_Counter := l_Sll_Counter + 1;
4210
4211
4212 END LOOP; --sll loop
4213
4214
4215 -----errorout_ad('OUTSIDE LOOP');
4216 -----errorout_ad('l_sll_prorate_tbl.COUNT = '|| TO_CHAR(l_sll_prorate_tbl.COUNT));
4217
4218 IF l_sll_prorate_tbl.COUNT >= 1 THEN ----get sll amount only if atleast 1 sll is without amount.
4219
4220 l_remaining_amt := l_Line_Amount - l_used_amt;
4221 -----errorout_ad('l_remaining_amt = ' || to_char(l_remaining_amt));
4222 -----errorout_ad('l_currency_code = ' || l_currency_code);
4223
4224 Calculate_sll_amount(
4225 p_api_version => l_api_version,
4226 p_total_amount => l_remaining_amt,
4227 p_currency_code => l_currency_code,
4228 p_sll_prorated_tab => l_sll_prorate_tbl,
4229 p_period_start => l_period_start,
4230 p_period_type => l_period_type,
4231 x_return_status => x_return_status);
4232
4233
4234 -----errorout_ad ('Get_sll_amount STATUS = ' || x_return_status);
4235
4236
4237 IF (l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
4238 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
4239 ELSIF (l_return_status = OKC_API.G_RET_STS_ERROR) THEN
4240 RAISE OKC_API.G_EXCEPTION_ERROR;
4241 END IF;
4242
4243 ---- the output table has index number of sll table to be updated in sll_seq_num field,
4244 ----so just change the amount for the l_rulv_index .
4245
4246
4247 IF l_sll_prorate_tbl.COUNT > 0 THEN
4248 l_amt_counter := l_sll_prorate_tbl.FIRST;
4249 LOOP
4250 l_sll_index := l_sll_prorate_tbl(l_amt_counter).sll_seq_num;
4251
4252 -----errorout_ad('sll index = '|| to_char(l_sll_index));
4253 -----errorout_ad('sll amount returned = '|| to_char(l_sll_prorate_tbl(l_amt_counter).sll_amount));
4254
4255 l_period_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
4256 l_sll_prorate_tbl(l_amt_counter).sll_amount, l_currency_code);
4257
4258 l_strm_lvl_tbl_in(l_sll_index).level_amount := l_period_sll_amount;
4259
4260 EXIT WHEN l_amt_counter = l_sll_prorate_tbl.LAST;
4261
4262 l_amt_counter := l_sll_prorate_tbl.NEXT(l_amt_counter);
4263
4264 END LOOP;
4265 END IF; --prorate tbl count chk
4266
4267 END IF; ----end of getting sll amount
4268
4269
4270 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
4271 FOR i IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
4272 LOOP
4273
4274 UPDATE oks_stream_levels_b
4275 set level_amount = l_strm_lvl_tbl_in(i).level_amount
4276 WHERE id = l_strm_lvl_tbl_in(i).id;
4277
4278 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4279
4280 fnd_log.STRING (fnd_log.level_statement,
4281 G_MODULE_CURRENT || '.update_sll_amount.update',
4282 'update sll id = ' || l_strm_lvl_tbl_in(i).id
4283 ||', amt = ' || l_strm_lvl_tbl_in(i).level_amount
4284 );
4285 END IF;
4286 END LOOP; --tbl for loop
4287 END IF; ---sll tbl count chk
4288
4289 EXCEPTION
4290 WHEN OTHERS THEN
4291 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
4292 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.update_sll_amount.UNEXPECTED',
4293 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
4294 END IF;
4295 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4296 p_msg_name => G_UNEXPECTED_ERROR,
4297 p_token1 => G_SQLCODE_TOKEN,
4298 p_token1_value => sqlcode,
4299 p_token2 => G_SQLERRM_TOKEN,
4300 p_token2_value => sqlerrm);
4301
4302 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4303
4304 END Update_Sll_Amount;
4305
4306 PROCEDURE Calculate_sll_amount( p_api_version IN NUMBER,
4307 p_total_amount IN NUMBER,
4308 p_currency_code IN VARCHAR2,
4309 p_period_start IN VARCHAR2,
4310 p_period_type IN VARCHAR2,
4311 p_sll_prorated_tab IN OUT NOCOPY sll_prorated_tab_type,
4312 x_return_status OUT NOCOPY VARCHAR2
4313
4314 )
4315 IS
4316 l_sll_num NUMBER;
4317 i NUMBER;
4318 j NUMBER;
4319 l_sll_remain_amount NUMBER(20,2);
4320 l_currency_code VARCHAR2(15);
4321 l_period_sll_amt NUMBER(20,2);
4322
4323 l_uom_code VARCHAR2(40);
4324 l_tce_code VARCHAR2(10);
4325 l_uom_quantity NUMBER;
4326 l_curr_sll_start_date DATE;
4327 l_curr_sll_end_date DATE;
4328
4329 l_next_sll_start_date DATE;
4330 l_next_sll_end_date DATE;
4331 l_tot_sll_amount NUMBER(20,2);
4332
4333 l_curr_frequency NUMBER;
4334 l_next_frequency NUMBER;
4335 l_tot_frequency NUMBER;
4336 l_sll_period NUMBER;
4337 l_return_status VARCHAR2(1);
4338 l_uom_per_period NUMBER;
4339 l_temp NUMBER;
4340
4341 BEGIN
4342 x_return_status := 'S';
4343 l_sll_num := p_sll_prorated_tab.count;
4344 l_sll_remain_amount := p_total_amount;
4345 -------------------------------------------------------------------------
4346 -- Begin partial period computation logic
4347 -- Developer Mani Choudhary
4348 -- Date 31-MAY-2005
4349 -- Proration to consider period start and period type
4350 -------------------------------------------------------------------------
4351 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4352 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4353 'input parameters period start '||p_period_start
4354 ||' p_period_type = ' || p_period_type);
4355 END IF;
4356
4357 IF p_period_start is NOT NULL AND
4358 p_period_type is NOT NULL
4359 THEN
4360 FOR i in 1 .. l_sll_num LOOP
4361 l_uom_code := p_sll_prorated_tab(i).sll_tuom ;
4362 l_uom_per_period := p_sll_prorated_tab(i).sll_uom_per_period ;
4363 --errorout_ad('l_uom_code '||l_uom_code);
4364 l_next_sll_end_date := NULL;
4365 l_curr_sll_start_date := p_sll_prorated_tab(i).sll_start_date;
4366 l_curr_sll_end_date := p_sll_prorated_tab(i).sll_end_date;
4367
4368 For j in i+1 .. l_sll_num Loop
4369 l_next_sll_start_date := p_sll_prorated_tab(j).sll_start_date;
4370 l_next_sll_end_date := p_sll_prorated_tab(j).sll_end_date;
4371 /* l_temp:=NULL;
4372 l_temp:= OKS_TIME_MEASURES_PUB.get_quantity (
4373 p_start_date => l_next_sll_start_date,
4374 p_end_date => l_next_sll_end_date,
4375 p_source_uom => l_uom_code,
4376 p_period_type => p_period_type,
4377 p_period_start => p_period_start
4378 );
4379 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4380 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4381 'afer calling OKS_TIME_MEASURES_PUB.get_quantity input parameters period start '||p_period_start||' p_period_type = ' || p_period_type
4382 ||' result l_temp '||l_temp);
4383 END IF;
4384
4385 IF nvl(l_temp,0) = 0 THEN
4386 RAISE G_EXCEPTION_HALT_VALIDATION;
4387 END IF;
4388
4389 l_next_frequency :=l_next_frequency + l_temp;
4390
4391 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4392 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4393 'afer calling OKS_TIME_MEASURES_PUB.get_quantity input parameters period start '||p_period_start||' p_period_type = ' || p_period_type
4394 ||' result l_next_frequency '||l_next_frequency);
4395 END IF;
4396
4397 */
4398
4399 END LOOP;
4400
4401 l_curr_frequency := OKS_TIME_MEASURES_PUB.get_quantity (
4402 p_start_date => l_curr_sll_start_date,
4403 p_end_date => l_curr_sll_end_date,
4404 p_source_uom => l_uom_code,
4405 p_period_type => p_period_type,
4406 p_period_start => p_period_start
4407 );
4408 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4409 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4410 'afer calling OKS_TIME_MEASURES_PUB.get_quantity input parameters period start '||p_period_start||' p_period_type = ' || p_period_type
4411 ||' result l_curr_frequency '||l_curr_frequency);
4412 END IF;
4413
4414 IF nvl(l_curr_frequency,0) = 0 THEN
4415 RAISE G_EXCEPTION_HALT_VALIDATION;
4416 END IF;
4417 l_tot_frequency := 0;
4418
4419 l_tot_frequency := OKS_TIME_MEASURES_PUB.get_quantity (
4420 p_start_date => l_curr_sll_start_date,
4421 p_end_date => nvl(l_next_sll_end_date,l_curr_sll_end_date),
4422 p_source_uom => l_uom_code,
4423 p_period_type => p_period_type,
4424 p_period_start => p_period_start
4425 );
4426
4427 IF nvl(l_tot_frequency,0) = 0 THEN
4428 RAISE G_EXCEPTION_HALT_VALIDATION;
4429 END IF;
4430 --errorout_ad('l_curr_frequency '||l_curr_frequency);
4431
4432 -- l_next_frequency := 0;
4433
4434
4435 -- l_tot_frequency := l_tot_frequency + l_curr_frequency + l_next_frequency;
4436
4437 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4438 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4439 ' result l_tot_frequency '||l_tot_frequency);
4440 END IF;
4441
4442 --errorout_ad('l_tot_frequency '||l_tot_frequency);
4443 -- l_sll_period := p_sll_prorated_tab(i).sll_period;
4444 l_sll_period := l_curr_frequency/l_uom_per_period;
4445
4446 l_period_sll_amt := ( l_sll_remain_amount /( nvl(l_tot_frequency,1) * nvl(l_sll_period,1))) * nvl(l_curr_frequency,0) ;
4447
4448 l_period_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_period_sll_amt, l_currency_code);
4449
4450 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4451 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4452 ' result l_period_sll_amt '||l_period_sll_amt);
4453 END IF;
4454
4455
4456 l_sll_remain_amount := l_sll_remain_amount - (l_period_sll_amt * nvl(l_sll_period,1)) ;
4457
4458 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4459 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4460 ' result l_sll_remain_amount '||l_sll_remain_amount);
4461 END IF;
4462
4463 --errorout_ad('l_period_sll_amt '||l_period_sll_amt);
4464 --errorout_ad('l_sll_remain_amount '||l_sll_remain_amount);
4465 p_sll_prorated_tab(i).sll_amount := l_period_sll_amt;
4466 l_curr_frequency := 0;
4467 END LOOP;
4468 -------------------------------------------------------------------------
4469 -- End partial period computation logic
4470 -------------------------------------------------------------------------
4471 ELSE
4472 For i in 1 .. l_sll_num Loop
4473 l_uom_code := p_sll_prorated_tab(i).sll_tuom ;
4474 oks_bill_util_pub.get_seeded_timeunit(
4475 p_timeunit => l_uom_code ,
4476 x_return_status => l_return_status,
4477 x_quantity => l_uom_quantity,
4478 x_timeunit => l_tce_code);
4479
4480 l_curr_sll_start_date := p_sll_prorated_tab(i).sll_start_date;
4481 l_curr_sll_end_date := p_sll_prorated_tab(i).sll_end_date;
4482
4483 IF l_tce_code = 'DAY' Then
4484 l_curr_frequency := l_curr_sll_end_date - l_curr_sll_start_date + 1;
4485 ELSIF l_tce_code = 'MONTH' Then
4486 l_curr_frequency := months_between(l_curr_sll_end_date + 1, l_curr_sll_start_date) ;
4487 ELSIF l_tce_code = 'YEAR' Then
4488 l_curr_frequency := months_between(l_curr_sll_end_date + 1, l_curr_sll_start_date) / 12 ;
4489 END IF;
4490
4491 If NVL(l_uom_quantity,0) > 0 Then
4492 l_curr_frequency := l_curr_frequency / NVL(l_uom_quantity,1);
4493 END IF;
4494 --errorout_ad('l_curr_frequency '||l_curr_frequency);
4495 l_tot_frequency := 0;
4496 l_next_frequency := 0;
4497
4498 For j in i+1 .. l_sll_num Loop
4499 l_next_sll_start_date := p_sll_prorated_tab(j).sll_start_date;
4500 l_next_sll_end_date := p_sll_prorated_tab(j).sll_end_date;
4501 IF l_tce_code = 'DAY' Then
4502 l_next_frequency := l_next_frequency + (l_next_sll_end_date - l_next_sll_start_date + 1);
4503 ELSIF l_tce_code = 'MONTH' Then
4504 l_next_frequency := l_next_frequency + (months_between(l_next_sll_end_date + 1, l_next_sll_start_date)) ;
4505 ELSIF l_tce_code = 'YEAR' Then
4506 l_next_frequency := l_next_frequency + (months_between(l_next_sll_end_date + 1, l_next_sll_start_date) / 12) ;
4507 END IF;
4508
4509
4510 END LOOP;
4511
4512 If NVL(l_uom_quantity,0) > 0 Then
4513 l_next_frequency := l_next_frequency / NVL(l_uom_quantity,1);
4514 END IF;
4515
4516 l_tot_frequency := l_tot_frequency + l_curr_frequency + l_next_frequency;
4517 --errorout_ad('l_tot_frequency '||l_tot_frequency);
4518 l_sll_period := p_sll_prorated_tab(i).sll_period;
4519
4520
4521 l_period_sll_amt := ( l_sll_remain_amount /( nvl(l_tot_frequency,1) * nvl(l_sll_period,1))) * nvl(l_curr_frequency,0) ;
4522
4523 l_period_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_period_sll_amt, l_currency_code);
4524
4525 l_sll_remain_amount := l_sll_remain_amount - (l_period_sll_amt * nvl(l_sll_period,1)) ;
4526 --errorout_ad('l_period_sll_amt '||l_period_sll_amt);
4527 --errorout_ad('l_sll_remain_amount '||l_sll_remain_amount);
4528 p_sll_prorated_tab(i).sll_amount := l_period_sll_amt;
4529 l_curr_frequency := 0;
4530 END LOOP;
4531 END IF;
4532
4533 EXCEPTION
4534 WHEN G_EXCEPTION_HALT_VALIDATION THEN
4535 x_return_status := G_RET_STS_ERROR;
4536 END Calculate_sll_amount;
4537
4538
4539 FUNCTION Find_Sll_Count(
4540 p_subline_id NUMBER)
4541 RETURN NUMBER
4542
4543 IS
4544
4545 l_sll_rule_count NUMBER;
4546
4547 BEGIN
4548
4549 SELECT COUNT(id) INTO l_sll_rule_count
4550 FROM oks_stream_levels_b
4551 WHERE cle_id = p_subline_id ;
4552
4553 RETURN l_sll_rule_count;
4554
4555 EXCEPTION
4556 WHEN OTHERS THEN
4557 RETURN NULL;
4558
4559 END Find_Sll_Count;
4560
4561
4562 PROCEDURE Delete_lvl_element(p_cle_id IN NUMBER,
4563 x_return_status OUT NOCOPY VARCHAR2)
4564
4565 IS
4566
4567 BEGIN
4568
4569 ---it deletes the level elementwhich are not billed for the given line id.
4570
4571 x_return_status := 'S';
4572
4573 DELETE FROM OKS_LEVEL_ELEMENTS
4574 WHERE date_Completed is NULL
4575 AND cle_id = p_cle_id;
4576
4577
4578 EXCEPTION
4579 WHEN OTHERS THEN
4580 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4581 p_msg_name => G_UNEXPECTED_ERROR,
4582 p_token1 => G_SQLCODE_TOKEN,
4583 p_token1_value => sqlcode,
4584 p_token2 => G_SQLERRM_TOKEN,
4585 p_token2_value => sqlerrm);
4586
4587 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4588
4589 END Delete_lvl_element;
4590
4591
4592
4593 PROCEDURE Del_hdr_lvl_element(p_hdr_id IN NUMBER,
4594 x_return_status OUT NOCOPY VARCHAR2
4595 )
4596 IS
4597
4598
4599 BEGIN
4600
4601 x_return_status := 'S';
4602 ---delete hdr , top line, cp lvl elements together
4603
4604 DELETE FROM OKS_LEVEL_ELEMENTS
4605 WHERE rul_id IN
4606 (SELECT sll.id
4607 FROM OKS_STREAM_LEVELS_B sll
4608 WHERE sll.dnz_chr_id = p_hdr_id);
4609
4610
4611
4612 ---delete sll for line and cp.
4613
4614 DELETE FROM OKS_STREAM_LEVELS_B
4615 WHERE dnz_chr_id = p_hdr_id
4616 AND chr_id IS NULL;
4617
4618 EXCEPTION
4619 WHEN OTHERS THEN
4620 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4621 p_msg_name => G_UNEXPECTED_ERROR,
4622 p_token1 => G_SQLCODE_TOKEN,
4623 p_token1_value => sqlcode,
4624 p_token2 => G_SQLERRM_TOKEN,
4625 p_token2_value => sqlerrm);
4626
4627 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4628
4629 END Del_hdr_lvl_element;
4630
4631
4632 Procedure Cal_hdr_Sll_Amount
4633 (
4634 p_hdr_id IN NUMBER,
4635 x_return_status OUT NOCOPY Varchar2
4636 )
4637 IS
4638
4639 Cursor l_hdr_Csr Is
4640 SELECT id, TRUNC(start_date) start_dt, TRUNC(end_date) end_dt
4641 FROM OKC_K_HEADERS_b
4642 WHERE id = p_hdr_id ;
4643
4644
4645 CURSOR l_Sll_Csr IS
4646 SELECT sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
4647 sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
4648 sll.interface_offset_days, sll.cle_id, sll.chr_id,
4649 sll.dnz_chr_id, sll.end_date, sll.object_version_number
4650 FROM oks_stream_levels_b sll
4651 WHERE sll.chr_id = p_hdr_id
4652 ORDER BY sll.sequence_no;
4653
4654 l_hdr_Csr_Rec l_hdr_Csr%Rowtype;
4655 l_Sll_Csr_Rec l_Sll_Csr%Rowtype;
4656 l_hdr_Amount NUMBER;
4657 l_Sll_Counter NUMBER;
4658 l_Cycle_Start_Date DATE;
4659 l_Cycle_End_Date DATE;
4660 l_remaining_amt NUMBER;
4661 l_used_amt NUMBER;
4662 l_total_period NUMBER;
4663 l_prorate_counter NUMBER;
4664 l_amt_counter NUMBER;
4665 l_sll_index NUMBER;
4666 l_sll_amt NUMBER;
4667 l_period_sll_amount NUMBER(20,2);
4668
4669 l_return_status VARCHAR2(10);
4670 l_msg_count NUMBER;
4671 l_msg_data VARCHAR2(2000);
4672 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
4673
4674 l_sll_prorate_tbl sll_prorated_tab_type;
4675 -------------------------------------------------------------------------
4676 -- Begin partial period computation logic
4677 -- Developer Mani Choudhary
4678 -- Date 04-MAY-2005
4679 -------------------------------------------------------------------------
4680 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
4681 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
4682 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
4683 -------------------------------------------------------------------------
4684 -- End partial period computation logic
4685 -- Date 04-MAY-2005
4686 -------------------------------------------------------------------------
4687
4688 ----The procedure finds the amount for hdr . Then find the amount for sll rule from the given periods and
4689 ----hdr amount and update the sll rule.
4690 BEGIN
4691 x_return_status := 'S';
4692 l_strm_lvl_tbl_in.DELETE;
4693
4694 OPEN l_hdr_Csr;
4695 FETCH l_hdr_Csr INTO l_hdr_Csr_Rec;
4696
4697 IF l_hdr_Csr%NOTFOUND THEN
4698 Close l_hdr_Csr;
4699 x_return_status := 'E';
4700 RETURN;
4701 ELSE
4702 Close l_hdr_Csr;
4703 END IF;
4704 -------------------------------------------------------------------------
4705 -- Begin partial period computation logic
4706 -- Developer Mani Choudhary
4707 -- Date 09-MAY-2005
4708 -------------------------------------------------------------------------
4709
4710 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
4711 (
4712 p_hdr_id => p_hdr_id,
4713 p_org_id => NULL,
4714 x_period_start => l_period_start,
4715 x_period_type => l_period_type,
4716 x_price_uom => l_price_uom,
4717 x_return_status => x_return_status);
4718
4719 IF x_return_status <> 'S' THEN
4720 RAISE G_EXCEPTION_HALT_VALIDATION;
4721 END IF;
4722 -------------------------------------------------------------------------
4723 -- End partial period computation logic
4724 -- Date 09-MAY-2005
4725 -------------------------------------------------------------------------
4726 IF l_currency_code IS NULL THEN
4727 l_currency_code := Find_Currency_Code(
4728 p_cle_id => NULL,
4729 p_chr_id => p_hdr_id);
4730
4731 IF l_currency_code IS NULL THEN
4732 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
4733 x_return_status := 'E';
4734 RETURN;
4735 END IF;
4736 END IF;
4737
4738
4739 l_hdr_Amount := Cal_Hdr_Amount(p_contract_id => p_hdr_id);
4740
4741
4742 l_Sll_Counter := 1;
4743 l_used_amt := 0;
4744 l_prorate_counter := 0;
4745
4746 FOR l_Sll_Csr_rec IN l_Sll_Csr
4747 LOOP
4748
4749
4750 IF l_Sll_Csr_Rec.level_amount IS NOT NULL THEN ---------calculate total all amount
4751
4752 l_sll_amt := to_number(l_Sll_Csr_Rec.level_amount) * to_number(l_Sll_Csr_Rec.level_periods);
4753 l_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt, l_currency_code);
4754 l_used_amt := l_used_amt + l_sll_amt;
4755
4756 -----errorout_ad('sll amount = ' || to_char(l_sll_amt));
4757 -----errorout_ad('total used amount = ' || to_char(l_used_amt));
4758
4759 ELSE
4760
4761 l_prorate_counter := l_prorate_counter + 1;
4762 -----errorout_ad('prorate counter = ' || to_char(l_prorate_counter));
4763
4764 l_sll_prorate_tbl(l_prorate_counter).sll_seq_num := l_sll_counter; ---index of rulv table
4765 l_sll_prorate_tbl(l_prorate_counter).sll_start_date := l_sll_csr_rec.Start_Date;
4766 l_sll_prorate_tbl(l_prorate_counter).sll_end_date := l_sll_csr_rec.end_Date;
4767 l_sll_prorate_tbl(l_prorate_counter).sll_tuom := l_Sll_Csr_Rec.uom_code;
4768 l_sll_prorate_tbl(l_prorate_counter).sll_period := TO_NUMBER(l_Sll_Csr_Rec.level_periods);
4769 l_sll_prorate_tbl(l_prorate_counter).sll_uom_per_period := l_Sll_Csr_Rec.uom_per_period;
4770
4771 -----errorout_ad('sll_seq_num = ' || TO_CHAR(l_sll_counter));
4772 -----errorout_ad('sll_start_date = ' || TO_CHAR(l_Cycle_Start_Date));
4773 -----errorout_ad('sll_start_date = ' || TO_CHAR(l_Cycle_End_Date));
4774 -----errorout_ad('sll_uom = ' || l_Sll_Csr_Rec.object1_id1);
4775 END IF;
4776
4777 l_strm_lvl_tbl_in(l_Sll_Counter).id := l_Sll_Csr_Rec.id;
4778 l_strm_lvl_tbl_in(l_Sll_Counter).cle_id := l_Sll_Csr_Rec.cle_id;
4779 l_strm_lvl_tbl_in(l_Sll_Counter).chr_id := l_Sll_Csr_Rec.chr_id;
4780 l_strm_lvl_tbl_in(l_Sll_Counter).dnz_chr_id := l_Sll_Csr_Rec.dnz_chr_id;
4781 l_strm_lvl_tbl_in(l_Sll_Counter).uom_code := l_Sll_Csr_Rec.uom_code;
4782 l_strm_lvl_tbl_in(l_Sll_Counter).sequence_no := l_Sll_Csr_Rec.sequence_no;
4783 l_strm_lvl_tbl_in(l_Sll_Counter).start_date := l_sll_csr_rec.Start_Date;
4784 l_strm_lvl_tbl_in(l_Sll_Counter).end_date := l_sll_csr_rec.end_Date;
4785 l_strm_lvl_tbl_in(l_Sll_Counter).level_periods := l_Sll_Csr_Rec.level_periods;
4786 l_strm_lvl_tbl_in(l_Sll_Counter).uom_per_period := l_Sll_Csr_Rec.uom_per_period;
4787 l_strm_lvl_tbl_in(l_Sll_Counter).level_amount := l_Sll_Csr_Rec.level_amount;
4788 l_strm_lvl_tbl_in(l_Sll_Counter).invoice_offset_days := l_Sll_Csr_Rec.invoice_offset_days;
4789 l_strm_lvl_tbl_in(l_Sll_Counter).interface_offset_days := l_Sll_Csr_Rec.interface_offset_days;
4790 l_strm_lvl_tbl_in(l_Sll_Counter).object_version_number := l_Sll_Csr_Rec.object_version_number;
4791
4792 l_strm_lvl_tbl_in(l_Sll_Counter).created_by := OKC_API.G_MISS_NUM;
4793 l_strm_lvl_tbl_in(l_Sll_Counter).creation_date := SYSDATE;
4794 l_strm_lvl_tbl_in(l_Sll_Counter).last_updated_by := OKC_API.G_MISS_NUM;
4795 l_strm_lvl_tbl_in(l_Sll_Counter).last_update_date := SYSDATE;
4796
4797 l_Sll_Counter := l_Sll_Counter + 1;
4798
4799
4800 END LOOP;
4801
4802
4803 -----errorout_ad('OUTSIDE LOOP');
4804 -----errorout_ad('l_sll_prorate_tbl.COUNT = '|| TO_CHAR(l_sll_prorate_tbl.COUNT));
4805
4806 IF l_sll_prorate_tbl.COUNT >= 1 THEN ----get sll amount only if atleast 1 sll is without amount.
4807
4808 l_remaining_amt := l_hdr_amount - l_used_amt;
4809 -----errorout_ad('l_remaining_amt = ' || to_char(l_remaining_amt));
4810 -----errorout_ad('l_currency_code = ' || l_currency_code);
4811
4812 Calculate_sll_amount(
4813 p_api_version => l_api_version,
4814 p_total_amount => l_remaining_amt,
4815 p_currency_code => l_currency_code,
4816 p_period_start => l_period_start,
4817 p_period_type => l_period_type,
4818 p_sll_prorated_tab => l_sll_prorate_tbl,
4819 x_return_status => x_return_status);
4820
4821
4822 -----errorout_ad ('Get_sll_amount STATUS = ' || x_return_status);
4823
4824
4825 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
4826 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
4827 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
4828 RAISE OKC_API.G_EXCEPTION_ERROR;
4829 END IF;
4830
4831 ---- the output table has index number of sll rule table to be updated in sll_seq_num field,
4832 ----so just change the amount for the l_rulv_index .
4833
4834
4835 IF l_sll_prorate_tbl.COUNT > 0 THEN
4836 l_amt_counter := l_sll_prorate_tbl.FIRST;
4837 LOOP
4838 l_sll_index := l_sll_prorate_tbl(l_amt_counter).sll_seq_num;
4839
4840 -----errorout_ad('sll index = '|| to_char(l_sll_index));
4841 -----errorout_ad('sll amount returned = '|| to_char(l_sll_prorate_tbl(l_amt_counter).sll_amount));
4842
4843 l_period_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
4844 l_sll_prorate_tbl(l_amt_counter).sll_amount, l_currency_code);
4845
4846 l_strm_lvl_tbl_in(l_sll_index).level_amount := TO_CHAR(l_period_sll_amount);
4847
4848 EXIT WHEN l_amt_counter = l_sll_prorate_tbl.LAST;
4849
4850 l_amt_counter := l_sll_prorate_tbl.NEXT(l_amt_counter);
4851
4852 END LOOP;
4853 END IF;
4854
4855 END IF; ----end of getting sll amount
4856
4857 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
4858 FOR i IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
4859 LOOP
4860
4861 UPDATE oks_stream_levels_b
4862 set level_amount = l_strm_lvl_tbl_in(i).level_amount
4863 WHERE id = l_strm_lvl_tbl_in(i).id;
4864 END LOOP; --tbl for loop
4865 END IF; ---sll tbl count chk
4866
4867
4868 EXCEPTION
4869 WHEN OTHERS THEN
4870 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4871 p_msg_name => G_UNEXPECTED_ERROR,
4872 p_token1 => G_SQLCODE_TOKEN,
4873 p_token1_value => sqlcode,
4874 p_token2 => G_SQLERRM_TOKEN,
4875 p_token2_value => sqlerrm);
4876
4877 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4878
4879 END Cal_hdr_Sll_Amount;
4880
4881 PROCEDURE Get_Constant_sll_Amount(p_line_start_date IN DATE,
4882 p_line_end_date IN DATE,
4883 p_cycle_start_date IN DATE,
4884 p_remaining_amount IN NUMBER,
4885 P_uom_quantity IN NUMBER,
4886 P_tce_code IN VARCHAR2,
4887 x_constant_sll_amt OUT NOCOPY NUMBER,
4888 x_return_status OUT NOCOPY VARCHAR2)
4889 IS
4890
4891 l_frequency NUMBER;
4892
4893 BEGIN
4894 x_return_status := OKC_API.G_RET_STS_SUCCESS;
4895 -----errorout_ad('p_tce_code = ' || p_tce_code);
4896 -----errorout_ad('p_uom_quantity = ' || p_uom_quantity);
4897
4898 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4899
4900 fnd_log.STRING (fnd_log.level_statement,
4901 G_MODULE_CURRENT || '.get_constant_sll_amount.info',
4902 'p_tce_code = ' || p_tce_code
4903 ||', p_uom_quantity = ' || p_uom_quantity
4904 ||', p_remaining_amount = ' || p_remaining_amount
4905 ||', st-end dt = ' || p_line_start_date || '-' || p_line_end_date );
4906 END IF;
4907
4908 If p_line_start_date > p_cycle_start_date then ---and l_start_date < l_next_billing_date Then
4909 l_frequency := OKS_BILL_UTIL_PUB.get_frequency
4910 (p_tce_code => p_tce_code,
4911 p_fr_end_date => p_line_end_date ,
4912 p_fr_start_date => p_line_start_date, --this LINE st dt
4913 p_uom_quantity => p_uom_quantity,
4914 x_return_status => X_return_status);
4915
4916
4917 ELSE
4918 l_frequency := OKS_BILL_UTIL_PUB.get_frequency
4919 (p_tce_code => p_tce_code,
4920 p_fr_end_date => p_line_end_date ,
4921 p_fr_start_date => p_cycle_start_date, --this cycle st dt to find remaining period
4922 p_uom_quantity => p_uom_quantity,
4923 x_return_status => x_return_status);
4924
4925 END IF;
4926
4927 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
4928 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.get_constant_sll_amount.freq',
4929 'oks_bill_util_pub.get_frequency(x_return_status = '||x_return_status
4930 ||', l_frequency = '|| l_frequency ||')');
4931 END IF;
4932
4933 If x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
4934 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'GET_FREQUENCY FAILED.');
4935 x_return_status := OKC_API.G_RET_STS_ERROR;
4936 RETURN;
4937 End if;
4938
4939 -----errorout_ad('p_remaining_amount = ' || p_remaining_amount);
4940 -----errorout_ad('l_frequency = ' || l_frequency);
4941
4942 x_constant_sll_amt := (nvl(p_remaining_amount,0)/nvl(l_frequency,1)) ;
4943
4944 -----errorout_ad('x_constant_sll_amt = ' || x_constant_sll_amt);
4945 EXCEPTION
4946 WHEN OTHERS THEN
4947
4948 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
4949 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.get_constant_sll_amount.UNEXPECTED',
4950 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
4951 END IF;
4952 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4953 p_msg_name => G_UNEXPECTED_ERROR,
4954 p_token1 => G_SQLCODE_TOKEN,
4955 p_token1_value => sqlcode,
4956 p_token2 => G_SQLERRM_TOKEN,
4957 p_token2_value => sqlerrm);
4958
4959 x_return_status := G_RET_STS_UNEXP_ERROR;
4960
4961 END Get_Constant_sll_Amount;
4962
4963 PROCEDURE Get_Period_Frequency(p_line_start_date IN DATE,
4964 p_line_end_date IN DATE,
4965 p_cycle_start_date IN DATE,
4966 p_next_billing_date IN DATE,
4967 P_uom_quantity IN NUMBER,
4968 P_tce_code IN VARCHAR2,
4969 p_uom_per_period IN NUMBER,
4970 x_period_freq OUT NOCOPY NUMBER,
4971 x_return_status OUT NOCOPY VARCHAR2)
4972 IS
4973
4974 BEGIN
4975 x_return_status := OKC_API.G_RET_STS_SUCCESS;
4976 If p_line_start_date > p_cycle_start_date and p_line_start_date < P_next_billing_date Then
4977 x_period_freq := OKS_BILL_UTIL_PUB.get_frequency
4978 (p_tce_code => p_tce_code,
4979 p_fr_start_date => p_line_start_date,
4980 p_fr_end_date => p_next_billing_date - 1,
4981 p_uom_quantity => p_uom_quantity,
4982 x_return_status => x_return_status);
4983
4984 ElsiF( p_next_billing_date > p_line_end_date + 1) THEN
4985 x_period_freq:= OKS_BILL_UTIL_PUB.get_frequency
4986 (p_tce_code => p_tce_code,
4987 p_fr_end_date => p_line_end_date,
4988 p_fr_start_date => p_cycle_start_date,
4989 p_uom_quantity => p_uom_quantity,
4990 x_return_status => x_return_status);
4991
4992 ELSE ----if everything is ok
4993
4994 x_period_freq := p_uom_per_period;
4995
4996 End If;
4997
4998
4999 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5000 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.get_period_frequency.freq',
5001 'oks_bill_util_pub.get_frequency(x_return_status = '||x_return_status
5002 ||', x_period_freq = '|| x_period_freq ||')');
5003 END IF;
5004
5005 If x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
5006 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'GET_FREQUENCY FAILED.');
5007 x_return_status := OKC_API.G_RET_STS_ERROR;
5008 RETURN;
5009 End if;
5010
5011 EXCEPTION
5012 WHEN OTHERS THEN
5013
5014 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
5015 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.get_period_frequency.UNEXPECTED',
5016 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
5017 END IF;
5018 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
5019 p_msg_name => G_UNEXPECTED_ERROR,
5020 p_token1 => G_SQLCODE_TOKEN,
5021 p_token1_value => sqlcode,
5022 p_token2 => G_SQLERRM_TOKEN,
5023 p_token2_value => sqlerrm);
5024
5025 x_return_status := G_RET_STS_UNEXP_ERROR;
5026
5027 end Get_Period_Frequency;
5028
5029
5030
5031
5032 Function Cal_Sllid_amount
5033 (
5034 p_Sll_id IN NUMBER,
5035 x_return_status OUT NOCOPY Varchar2,
5036 x_msg_count OUT NOCOPY NUMBER,
5037 x_msg_data OUT NOCOPY VARCHAR2
5038 )RETURN NUMBER
5039 IS
5040
5041 l_sll_amt NUMBER := 0;
5042
5043 BEGIN
5044
5045 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5046
5047 SELECT NVL(SUM(AMOUNT),0) INTO l_sll_amt
5048 FROM OKS_LEVEL_ELEMENTS
5049 WHERE rul_id = p_Sll_id;
5050
5051 RETURN l_sll_amt;
5052
5053 EXCEPTION
5054 WHEN OTHERS THEN
5055 x_return_status := G_RET_STS_UNEXP_ERROR;
5056 RETURN NULL;
5057
5058 END Cal_Sllid_amount;
5059
5060 Procedure Create_Bill_Sch_CP
5061 (
5062 p_top_line_id IN NUMBER,
5063 p_cp_line_id IN NUMBER,
5064 p_cp_new IN Varchar2,
5065 x_return_status OUT NOCOPY Varchar2,
5066 x_msg_count OUT NOCOPY NUMBER,
5067 x_msg_data OUT NOCOPY VARCHAR2)
5068
5069 IS
5070
5071 Cursor l_subLine_Csr Is
5072 SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
5073 TRUNC(line.end_date) cp_end_dt, TRUNC(line.date_terminated) cp_term_dt,
5074 dtl.full_credit full_credit,price_uom,lse_id cp_lse_id,
5075 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
5076 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) subline_amt
5077 FROM okc_k_lines_b line, oks_k_lines_b dtl
5078 WHERE line.id = p_cp_line_id
5079 AND line.date_cancelled is NULL
5080 AND line.id = dtl.cle_id;
5081
5082
5083 Cursor l_Line_Csr Is
5084 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
5085 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
5086 line.inv_rule_id inv_id,
5087 nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
5088 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
5089 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
5090 FROM okc_k_lines_b line, oks_k_lines_b dtl
5091 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id
5092 AND line.date_cancelled is NULL;
5093
5094 CURSOR l_line_sll_csr IS
5095 SELECT sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
5096 sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
5097 sll.interface_offset_days, sll.cle_id, sll.chr_id,
5098 sll.dnz_chr_id,sll.end_date
5099 FROM oks_stream_levels_b sll
5100 WHERE sll.cle_id = p_top_line_id
5101 ORDER BY sll.sequence_no;
5102
5103 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
5104 SELECT id, trunc(date_start) date_start,
5105 amount,trunc(date_end) date_end,object_version_number,
5106 date_to_interface, date_transaction
5107 FROM oks_level_elements
5108 WHERE cle_id = p_line_id
5109 ORDER BY date_start;
5110
5111
5112 Cursor l_line_amt_csr (p_id in number) IS
5113 Select line.price_negotiated
5114 from okc_k_lines_b line
5115 where line.id = p_id;
5116
5117
5118 l_index NUMBER;
5119 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
5120
5121 l_Line_Sll_rec l_Line_Sll_Csr%ROWTYPE;
5122 l_line_BS_rec l_line_BS_csr%ROWTYPE;
5123 l_Line_Csr_Rec l_Line_Csr%Rowtype;
5124 l_SubLine_Rec l_subLine_Csr%Rowtype;
5125 l_cp_rec Prod_Det_Type;
5126 l_line_rec Line_Det_Type;
5127
5128
5129 L_bil_sch_out_tbl OKS_BILL_SCH.ItemBillSch_tbl;
5130 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
5131 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
5132 l_update_required VARCHAR2(1);
5133 l_cp_term_dt DATE;
5134 l_amount NUMBER;
5135
5136 -------------------------------------------------------------------------
5137 -- Begin partial period computation logic
5138 -- Developer Mani Choudhary
5139 -- Date 04-MAY-2005
5140 -------------------------------------------------------------------------
5141 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
5142 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
5143 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
5144 l_return_status VARCHAR2(30);
5145 l_tangible BOOLEAN;
5146 l_pricing_method VARCHAR2(30);
5147 -------------------------------------------------------------------------
5148 -- End partial period computation logic
5149 -- Date 04-MAY-2005
5150 -------------------------------------------------------------------------
5151
5152 BEGIN
5153
5154 ---this is called for the new cp or existing cp which is updated and only for 'T'.
5155 --p_cp_new is 'Y' for new subline, 'N' for updating schedule for existing subline
5156
5157 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5158 l_update_required := 'N';
5159
5160 ---get line details
5161 Open l_Line_Csr;
5162 Fetch l_Line_Csr Into l_Line_Csr_Rec;
5163
5164 If l_Line_Csr%Notfound then
5165 Close l_Line_Csr;
5166 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
5167 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_bill_sch_cp.EXCEPTION',
5168 'top line not found = ' || p_top_line_id );
5169 END IF;
5170 x_return_status := 'E';
5171 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
5172 RAISE G_EXCEPTION_HALT_VALIDATION;
5173 End If;
5174 Close l_Line_Csr;
5175
5176 l_line_rec.chr_id := l_Line_Csr_Rec.chr_id;
5177 l_line_rec.dnz_chr_id := l_Line_Csr_Rec.dnz_chr_id;
5178 l_line_rec.id := l_Line_Csr_Rec.id ;
5179 l_line_rec.lse_id := l_Line_Csr_Rec.lse_id;
5180 l_line_rec.line_start_dt := l_Line_Csr_Rec.line_start_dt;
5181 l_line_rec.line_end_dt := l_Line_Csr_Rec.line_end_dt;
5182 l_line_rec.line_amt := l_Line_Csr_Rec.line_amt ;
5183 -----errorout_ad('line found');
5184 -------------------------------------------------------------------------
5185 -- Begin partial period computation logic
5186 -- Developer Mani Choudhary
5187 -- Date 09-MAY-2005
5188 -------------------------------------------------------------------------
5189
5190 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
5191 (
5192 p_hdr_id => l_Line_Csr_Rec.dnz_chr_id,
5193 p_org_id => NULL,
5194 x_period_start => l_period_start,
5195 x_period_type => l_period_type,
5196 x_price_uom => l_price_uom,
5197 x_return_status => x_return_status);
5198
5199 IF x_return_status <> 'S' THEN
5200 RAISE G_EXCEPTION_HALT_VALIDATION;
5201 END IF;
5202 --Description in detail for the business rules for deriving the period start
5203 --1)For usage , period start will always be 'SERVICE'
5204 --2)For Subscriptions, period start and period type will be NULL
5205 -- for tangible subscriptions as per CR1.For intangible subscriptions,
5206 -- if the profile OKS: Intangible Subscription Pricing Method
5207 -- is set to 'Subscription Based',then period start and period type will be NULL
5208 -- otherwise it will be 'SERVICE'
5209 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
5210 --mchoudha fix for bug#5183011
5211 IF l_period_start IS NOT NULL AND
5212 l_period_type IS NOT NULL
5213 THEN
5214 IF l_line_rec.lse_id = 12 THEN
5215 l_period_start := 'SERVICE';
5216 END IF;
5217 IF l_line_rec.lse_id = 46 THEN
5218 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (l_line_rec.id);
5219 IF l_tangible THEN
5220 l_period_start := NULL;
5221 l_period_type := NULL;
5222 ELSE
5223 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
5224 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
5225 l_period_start := NULL;
5226 l_period_type := NULL;
5227 ELSE
5228 l_period_start := 'SERVICE';
5229 END IF; -- l_pricing_method <> 'EFFECTIVITY'
5230 END IF; -- IF l_tangible
5231 END IF; -- l_line_rec.lse_id = 46
5232 END IF; -- period start and period type are not null
5233 -------------------------------------------------------------------------
5234 -- End partial period computation logic
5235 -- Date 09-MAY-2005
5236 -------------------------------------------------------------------------
5237 IF l_period_type is not null AND l_period_start is not NULL THEN
5238 OPEN l_line_amt_csr(l_Line_Csr_Rec.id);
5239 FETCH l_line_amt_csr INTO l_line_rec.line_amt;
5240 CLOSE l_line_amt_csr;
5241 END IF;
5242
5243 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5244
5245 fnd_log.STRING (fnd_log.level_statement,
5246 G_MODULE_CURRENT || '.create_bill_sch_cp.line_dtls',
5247 'dnz_chr_id = ' || l_line_rec.dnz_chr_id
5248 || ', id = ' || l_line_rec.id
5249 || ', lse_id = ' || l_line_rec.lse_id
5250 || ', start dt = ' || l_line_rec.line_start_dt
5251 || ', end dt = ' || l_line_rec.line_end_dt
5252 || ', amt = ' || l_line_rec.line_amt
5253 || ', bill_type = ' || l_Line_Csr_Rec.billing_schedule_type
5254 );
5255 END IF;
5256
5257
5258 IF l_Line_Csr_Rec.billing_schedule_type <> 'T' THEN
5259 RETURN;
5260 END IF;
5261
5262
5263
5264 l_index := 1;
5265 ----make sll tbl
5266 l_sll_tbl.DELETE;
5267
5268 ---make sll tbl
5269
5270 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
5271 LOOP
5272 l_sll_tbl(l_index).id := l_Line_SlL_rec.id;
5273 l_sll_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
5274
5275 l_sll_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
5276 l_sll_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
5277 l_sll_tbl(l_index).uom_code := l_Line_SlL_rec.uom_code;
5278 l_sll_tbl(l_index).sequence_no := l_Line_SlL_rec.sequence_no;
5279 l_sll_tbl(l_index).Start_Date := l_Line_SlL_rec.Start_Date;
5280 IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
5281 l_sll_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
5282 ELSE
5283 l_update_required := 'Y';
5284
5285 l_sll_tbl(l_index).end_Date := OKC_TIME_UTIL_PUB.get_enddate(
5286 l_Line_SlL_rec.Start_Date,
5287 l_Line_SlL_rec.uom_code,
5288 (l_Line_SlL_rec.level_periods *
5289 l_Line_SlL_rec.uom_per_period));
5290 END IF;
5291
5292 l_sll_tbl(l_index).level_periods := l_Line_SlL_rec.level_periods;
5293 l_sll_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
5294 l_sll_tbl(l_index).level_amount := l_Line_SlL_rec.level_amount;
5295 l_sll_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
5296 l_sll_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
5297
5298 l_index := l_index + 1;
5299 END LOOP;
5300
5301 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5302
5303 fnd_log.STRING (fnd_log.level_statement,
5304 G_MODULE_CURRENT || '.create_bill_sch_cp.sll_tbl',
5305 'top line sll tbl count = ' || l_sll_tbl.count
5306 );
5307 END IF;
5308
5309 IF l_sll_tbl.COUNT = 0 THEN
5310 RETURN;
5311 END IF;
5312
5313 -----errorout_ad('SLL found');
5314 ---for migrated contracts without end date
5315 IF l_update_required = 'Y' THEN
5316 OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id => p_top_line_id,
5317 p_chr_id => NULL,
5318 x_return_status => x_return_status);
5319
5320 IF x_return_status <> 'S' then
5321 RETURN;
5322 END IF;
5323 END IF;
5324
5325
5326
5327
5328 --get currency
5329 l_currency_code := Find_Currency_Code(
5330 p_cle_id => p_top_line_id,
5331 p_chr_id => NULL);
5332
5333 IF l_currency_code IS NULL THEN
5334 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
5335 x_return_status := 'E';
5336 RAISE G_EXCEPTION_HALT_VALIDATION;
5337 END IF;
5338
5339 ----get subline
5340 Open l_SubLine_Csr;
5341 FETCH l_SubLine_Csr Into l_SubLine_Rec;
5342 If l_SubLine_Csr%Notfound then
5343 Close l_SubLine_Csr;
5344 x_return_status := 'E';
5345 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'SUB LINE NOT FOUND');
5346 RAISE G_EXCEPTION_HALT_VALIDATION;
5347 End If;
5348 Close l_SubLine_Csr;
5349
5350 l_cp_rec.cp_id := l_SubLine_rec.subline_id ;
5351 l_cp_rec.cp_start_dt := l_SubLine_rec.cp_start_dt;
5352 l_cp_rec.cp_end_dt := l_SubLine_rec.cp_end_dt ;
5353 l_cp_rec.cp_amt := l_SubLine_rec.subline_amt ;
5354 l_cp_rec.cp_price_uom := l_subline_rec.price_uom;
5355 l_cp_rec.cp_lse_id := l_subline_rec.cp_lse_id;
5356
5357
5358 IF l_period_type is not null AND l_period_start is not NULL THEN
5359 OPEN l_line_amt_csr(l_SubLine_rec.subline_id);
5360 FETCH l_line_amt_csr INTO l_cp_rec.cp_amt;
5361 CLOSE l_line_amt_csr;
5362 END IF;
5363 -----if the subline is update then chk if max_bill_dt = end date and update the price.
5364 IF nvl(p_cp_new,'Y') = 'N' AND l_cp_rec.cp_amt > 0 THEN
5365
5366 OKS_BILL_UTIL_PUB.Adjust_line_price(
5367 p_top_line_id => p_top_line_id,
5368 p_sub_line_id => p_cp_line_id ,
5369 p_end_date => l_cp_rec.cp_end_dt,
5370 p_amount => l_cp_rec.cp_amt,
5371 p_dnz_chr_id => l_line_csr_rec.dnz_chr_id,
5372 x_amount => l_amount,
5373 x_return_status => x_return_status);
5374
5375 l_cp_rec.cp_amt := l_amount;
5376 END IF;
5377
5378 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5379
5380 fnd_log.STRING (fnd_log.level_statement,
5381 G_MODULE_CURRENT || '.create_bill_sch_cp.cp_dtls',
5382 'p_cp_new = ' || p_cp_new
5383 || ', id = ' || l_cp_rec.cp_id
5384 || ', start dt = ' || l_cp_rec.cp_start_dt
5385 || ', end dt = ' || l_cp_rec.cp_end_dt
5386 || ', amt = ' || l_cp_rec.cp_amt
5387 || ', full credit flag = ' || l_subline_rec.full_credit
5388 );
5389 END IF;
5390
5391
5392 -----errorout_ad('sub line found');
5393 IF nvl(l_SubLine_rec.cp_term_dt,l_SubLine_rec.cp_start_dt) > l_SubLine_rec.cp_end_dt then
5394 RETURN;
5395 END IF;
5396
5397 ---if full credit flag 'Y',term date to bill_sch_cp as cp start date so that
5398 --level element doesn't get created.
5399
5400 IF l_subline_rec.cp_term_dt IS NOT NULL AND
5401 nvl(l_subline_rec.full_credit,'N') = 'Y' THEN
5402
5403 l_cp_term_dt := l_subline_rec.cp_start_dt;
5404 else
5405 l_cp_term_dt := l_subline_rec.cp_term_dt;
5406 END IF; ---end of full credit chk
5407
5408
5409 l_top_bs_tbl.DELETE;
5410 l_index := 1;
5411
5412 FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
5413 LOOP
5414 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
5415 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
5416 l_top_bs_tbl(l_index).date_end := l_line_BS_rec.date_end;
5417 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
5418 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
5419 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
5420 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
5421
5422 l_index := l_index + 1;
5423 END LOOP; --top line lvl element
5424
5425 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5426
5427 fnd_log.STRING (fnd_log.level_statement,
5428 G_MODULE_CURRENT || '.create_bill_sch_cp.bs_tbl',
5429 'top line bs tbl count = ' || l_top_bs_tbl.count
5430 );
5431 END IF;
5432
5433 -----errorout_ad('line bs found');
5434
5435 IF l_top_bs_tbl.COUNT = 0 THEN ---BS NOT CREATED FOR TOP LINE
5436 OKS_BILL_SCH.Create_Bill_Sch_Rules
5437 (
5438 p_billing_type => l_Line_Csr_Rec.billing_schedule_type,
5439 p_sll_tbl => l_sll_tbl,
5440 p_invoice_rule_id => l_line_csr_rec.inv_id,
5441 x_bil_sch_out_tbl => l_bil_sch_out_tbl,
5442 x_return_status => x_return_status);
5443
5444 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5445 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.call_bs',
5446 'Create_Bill_Sch_Rules(x_return_status = '||x_return_status ||')');
5447 END IF;
5448
5449 IF x_return_status <> 'S' THEN
5450 RAISE G_EXCEPTION_HALT_VALIDATION;
5451 END IF;
5452
5453 else ----call for cp only
5454
5455 IF nvl(p_cp_new,'Y') = 'N' THEN
5456 --if cp already has bs then before calling Bill_Sch_Cp, adjust the amt of
5457 ---top line levl elements.
5458
5459 Adjust_top_BS_Amt( p_Line_Rec => l_Line_Rec,
5460 p_SubLine_rec => l_cp_Rec,
5461 p_top_line_bs => l_top_bs_tbl,
5462 x_return_status => x_return_status);
5463
5464 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5465 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.adjust',
5466 'adjust_top_bs_amt(x_return_status = '||x_return_status ||')');
5467 END IF;
5468
5469
5470 IF x_return_status <> 'S' THEN
5471 RAISE G_EXCEPTION_HALT_VALIDATION;
5472 END IF;
5473
5474 END IF;
5475
5476 ----------errorout_ad('calling Bill_Sch_Cp');
5477 --------------------------------------------------------------------------
5478 -- Begin partial period computation logic
5479 -- Developer Mani Choudhary
5480 -- Date 09-MAY-2005
5481 -- Added two new parameters P_period_start,P_period_type in procedural call
5482 ---------------------------------------------------------------------------
5483 Bill_Sch_Cp
5484 ( p_billing_type => l_Line_Csr_Rec.billing_schedule_type,
5485 p_bsll_tbl => l_sll_tbl,
5486 p_Line_Rec => l_Line_Rec,
5487 p_SubLine_rec => l_cp_Rec,
5488 p_invoice_rulid => l_line_csr_rec.inv_id,
5489 p_top_line_bs => l_top_bs_tbl,
5490 p_term_dt => l_cp_term_dt,
5491 p_period_start => l_period_start,
5492 p_period_type => l_period_type,
5493 x_return_status => x_return_status);
5494
5495 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5496 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.cp_bs',
5497 'Bill_Sch_Cp(x_return_status = '||x_return_status ||')');
5498 END IF;
5499
5500
5501
5502
5503 IF x_return_status = 'S' then
5504 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
5505 p_api_version => l_api_version,
5506 p_init_msg_list => l_init_msg_list,
5507 x_return_status => x_return_status,
5508 x_msg_count => x_msg_count,
5509 x_msg_data => x_msg_data,
5510 p_letv_tbl => l_top_bs_tbl,
5511 x_letv_tbl => l_lvl_ele_tbl_out);
5512
5513 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5514 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.update_top_bs',
5515 'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status ||')');
5516 END IF;
5517 else
5518
5519 RAISE G_EXCEPTION_HALT_VALIDATION;
5520 END IF;
5521
5522 END IF;
5523
5524 EXCEPTION
5525 WHEN G_EXCEPTION_HALT_VALIDATION THEN
5526 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
5527 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_bill_sch_cp.EXCEPTION',
5528 'G_EXCEPTION_HALT_VALIDATION');
5529 END IF;
5530
5531 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
5532 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
5533 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
5534 RAISE OKC_API.G_EXCEPTION_ERROR;
5535 END IF;
5536 WHEN OTHERS THEN
5537 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
5538 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_bill_sch_cp.UNEXPECTED',
5539 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
5540 END IF;
5541 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
5542 p_msg_name => G_UNEXPECTED_ERROR,
5543 p_token1 => G_SQLCODE_TOKEN,
5544 p_token1_value => sqlcode,
5545 p_token2 => G_SQLERRM_TOKEN,
5546 p_token2_value => sqlerrm);
5547
5548 x_return_status := G_RET_STS_UNEXP_ERROR;
5549
5550 END Create_Bill_Sch_CP;
5551
5552 Procedure Cascade_Dates_SLL
5553 (
5554 p_top_line_id IN NUMBER,
5555 x_return_status OUT NOCOPY Varchar2,
5556 x_msg_count OUT NOCOPY NUMBER,
5557 x_msg_data OUT NOCOPY VARCHAR2)
5558 IS
5559
5560 CURSOR l_line_sll_csr IS
5561 SELECT sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
5562 sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
5563 sll.interface_offset_days, sll.cle_id, sll.chr_id,
5564 sll.dnz_chr_id, sll.end_date
5565 FROM oks_stream_levels_b sll
5566 WHERE sll.cle_id = p_top_line_id
5567 ORDER BY sll.sequence_no;
5568
5569
5570 Cursor l_Line_Csr Is
5571 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
5572 TRUNC(line.start_date) start_dt, TRUNC(line.end_date) end_dt,
5573 line.inv_rule_id inv_id,
5574 nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
5575 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
5576 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
5577 FROM okc_k_lines_b line, oks_k_lines_b dtl
5578 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id ;
5579
5580 -------------------------------------------------------------------------
5581 -- Begin partial period computation logic
5582 -- Developer Mani Choudhary
5583 -- Date 07-JUN-2005
5584 -- For usage , usage UOM drives the pricing/billing,
5585 -- so adding the usage period in the cursor
5586 --------------------------------------------------------------------------
5587 CURSOR l_usage_type_csr IS
5588 SELECT usage_type,usage_period
5589 FROM oks_k_lines_b
5590 WHERE cle_id = p_top_line_id;
5591
5592 -------------------------------------------------------------------------
5593 -- Begin partial period computation logic
5594 -- Developer Mani Choudhary
5595 -- Date 07-JUN-2005
5596 -- defining a new cursor to fetch the price uom stored for the
5597 -- top line . This is used as the default billing period for the service lines.
5598 --------------------------------------------------------------------------
5599 CURSOR Get_price_uom IS
5600 SELECT price_uom
5601 FROM OKS_K_LINES_B
5602 WHERE cle_id = p_top_line_id;
5603
5604
5605
5606 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
5607 L_BIL_SCH_OUT_TBL OKS_BILL_SCH.ItemBillSch_tbl;
5608
5609
5610 l_Line_Sll_rec l_Line_Sll_Csr%ROWTYPE;
5611 l_Line_csr_Rec l_Line_Csr%Rowtype;
5612 l_line_rec Line_Det_Type;
5613
5614 l_period_freq NUMBER;
5615 l_actual_freq NUMBER;
5616 l_uom_qty NUMBER;
5617 l_index NUMBER;
5618 l_sll_tbl_index NUMBER;
5619 l_sll_start_date DATE;
5620 l_sll_end_date DATE;
5621 l_sequence NUMBER;
5622 l_factor NUMBER;
5623 l_next_date DATE;
5624 l_sll_ind NUMBER;
5625 l_timeunit VARCHAR2(20);
5626 l_duration NUMBER;
5627 l_difference NUMBER;
5628 l_msg_list VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
5629 L_UOM_QUANTITY number;
5630 l_tce_code VARCHAR2(100);
5631 l_update_end_date VARCHAR2(1);
5632 l_usage_type VARCHAR2(40);
5633 l_amount NUMBER;
5634 -------------------------------------------------------------------------
5635 -- Begin partial period computation logic
5636 -- Developer Mani Choudhary
5637 -- Date 04-MAY-2005
5638 -- Local variables and cursors defined here required for cascade
5639 ---------------------------------------------------------------------------
5640 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
5641 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
5642 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
5643 l_level_periods NUMBER;
5644 ---------------------------------------------------------------------------
5645 l_end_date DATE; /*Added for ceredian bug 13799709*/
5646
5647 BEGIN
5648
5649 --it adjusts the sll and lvl element according to new line start and end date.
5650
5651 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5652
5653 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5654
5655 fnd_log.STRING (fnd_log.level_statement,
5656 G_MODULE_CURRENT || '.cascade_dates_sll.line_passed',
5657 'top line id passed = ' || p_top_line_id );
5658 END IF;
5659
5660
5661 l_update_end_date := 'N';
5662 --find billing type of line
5663
5664 ---get line details
5665 Open l_Line_Csr;
5666 Fetch l_Line_Csr Into l_Line_csr_Rec;
5667
5668 If l_Line_Csr%Notfound then
5669 Close l_Line_Csr;
5670 x_return_status := 'E';
5671 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
5672 RAISE G_EXCEPTION_HALT_VALIDATION;
5673 End If;
5674 Close l_Line_Csr;
5675
5676
5677 l_line_rec.chr_id := l_Line_Csr_Rec.chr_id;
5678 l_line_rec.dnz_chr_id := l_Line_Csr_Rec.dnz_chr_id;
5679 l_line_rec.id := l_Line_Csr_Rec.id ;
5680 l_line_rec.lse_id := l_Line_Csr_Rec.lse_id;
5681 l_line_rec.line_start_dt := l_Line_Csr_Rec.start_dt;
5682 l_line_rec.line_end_dt := l_Line_Csr_Rec.end_dt;
5683 l_line_rec.line_amt := l_Line_Csr_Rec.line_amt ;
5684
5685 ------------------------------------------------------------------------
5686 -- Begin partial period computation logic
5687 -- Developer Mani Choudhary
5688 -- Date 04-MAY-2005
5689 -- Fetching the period start and the period type
5690 -------------------------------------------------------------------------
5691 --Fetch the period start and period type stored at the header
5692 IF l_Line_Csr_Rec.dnz_chr_id is NOT NULL THEN
5693 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
5694 (
5695 p_hdr_id => l_Line_Csr_Rec.dnz_chr_id,
5696 p_org_id => NULL,
5697 x_period_start => l_period_start,
5698 x_period_type => l_period_type,
5699 x_price_uom => l_price_uom,
5700 x_return_status => x_return_status);
5701 IF x_return_status <> 'S' THEN
5702 RAISE G_EXCEPTION_HALT_VALIDATION;
5703 END IF;
5704 END IF;
5705
5706 IF l_period_start IS NOT NULL AND
5707 l_period_type IS NOT NULL
5708 THEN
5709 OPEN Get_price_uom;
5710 FETCH Get_price_uom into l_price_uom;
5711 CLOSE Get_price_uom;
5712 END IF;
5713
5714 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5715
5716 fnd_log.STRING (fnd_log.level_statement,
5717 G_MODULE_CURRENT || '.cascade_dates_sll.line_dtls',
5718 'dnz_chr_id = ' || l_line_rec.dnz_chr_id
5719 || ', id = ' || l_line_rec.id
5720 || ', lse_id = ' || l_line_rec.lse_id
5721 || ', start dt = ' || l_line_rec.line_start_dt
5722 || ', end dt = ' || l_line_rec.line_end_dt
5723 || ', amt = ' || l_line_rec.line_amt
5724 || ', bill_type = ' || l_Line_Csr_Rec.billing_schedule_type
5725 );
5726 END IF;
5727
5728
5729
5730 IF nvl(l_Line_Csr_Rec.billing_schedule_type,'E') <> 'T' then
5731 RETURN;
5732 END IF;
5733
5734
5735 ---Code is added to adjust price of sub line if line is shrinked.
5736 --and max billed to = end date then price becomes billed amount
5737
5738 IF l_Line_Rec.lse_id = 12 THEN
5739 Open l_usage_type_csr;
5740 -------------------------------------------------------------------------
5741 -- Begin partial period computation logic
5742 -- Developer Mani Choudhary
5743 -- Date 07-JUN-2005
5744 -- For usage , usage UOM drives the pricing/billing, so using that
5745 -- period start for usage will be 'SERVICE'
5746 --------------------------------------------------------------------------
5747 Fetch l_usage_type_csr INTO l_usage_type,l_price_uom;
5748 l_period_start := 'SERVICE';
5749 --------------------------------------------------------------------------
5750
5751 IF l_usage_type_csr%FOUND THEN
5752
5753
5754
5755 IF l_usage_type = 'NPR' THEN
5756 OKS_BILL_UTIL_PUB.Adjust_line_price(
5757 p_top_line_id => p_top_line_id,
5758 p_sub_line_id => NULL,
5759 p_end_date => NULL,
5760 p_amount => NULL,
5761 p_dnz_chr_id => l_Line_Rec.dnz_chr_id,
5762 x_amount => l_amount,
5763 x_return_status => x_return_status);
5764
5765 End If; ------usage type NPR chk
5766
5767 END IF; ---- l_usage_type_csr data found chk
5768 Close l_usage_type_csr;
5769
5770 ELSE --- LINE lse_id <> 12
5771 OKS_BILL_UTIL_PUB.Adjust_line_price(
5772 p_top_line_id => p_top_line_id,
5773 p_sub_line_id => NULL,
5774 p_end_date => NULL,
5775 p_amount => NULL,
5776 p_dnz_chr_id => l_Line_Rec.dnz_chr_id,
5777 x_amount => l_amount,
5778 x_return_status => x_return_status);
5779 END IF;
5780
5781 ----make sll tbl
5782
5783 l_index := 1;
5784 l_sll_tbl.DELETE;
5785
5786 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
5787 LOOP
5788 l_sll_tbl(l_index).id := l_Line_SlL_rec.id;
5789 l_sll_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
5790 l_sll_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
5791 l_sll_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
5792 l_sll_tbl(l_index).uom_code := l_Line_SlL_rec.uom_code;
5793 l_sll_tbl(l_index).sequence_no := l_Line_SlL_rec.sequence_no;
5794 l_sll_tbl(l_index).Start_Date := l_Line_SlL_rec.Start_Date;
5795
5796 IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
5797 l_sll_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
5798 ELSE
5799 l_update_end_date := 'Y';
5800 l_sll_tbl(l_index).end_Date := OKC_TIME_UTIL_PUB.get_enddate(
5801 l_Line_SlL_rec.Start_Date,
5802 l_Line_SlL_rec.uom_code,
5803 l_Line_SlL_rec.level_periods * l_Line_SlL_rec.uom_per_period);
5804 END IF;
5805
5806
5807
5808 l_sll_tbl(l_index).level_periods := l_Line_SlL_rec.level_periods;
5809 l_sll_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
5810 l_sll_tbl(l_index).level_amount := l_Line_SlL_rec.level_amount;
5811 l_sll_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
5812 l_sll_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
5813
5814 l_index := l_index + 1;
5815 END LOOP; --sll csr end loop
5816
5817 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5818
5819 fnd_log.STRING (fnd_log.level_statement,
5820 G_MODULE_CURRENT || '.cascade_dates_sll.sll_tbl',
5821 'top line sll tbl count = ' || l_sll_tbl.count
5822 );
5823 END IF;
5824
5825 IF l_sll_tbl.COUNT = 0 THEN
5826 RETURN;
5827 END IF;
5828
5829 IF l_update_end_date = 'Y' THEN ---Migrated
5830 OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id => p_top_line_id,
5831 p_chr_id => NULL,
5832 x_return_status => x_return_status);
5833
5834 IF x_return_status <> 'S' THEN
5835 RETURN;
5836 END IF;
5837 END IF; ---chk for migrated
5838
5839
5840 -----errorout_ad('SLL found');
5841
5842
5843
5844 l_sll_tbl_index := l_sll_tbl.FIRST;
5845
5846 l_sll_start_date := TRUNC(l_sll_tbl(l_sll_tbl_index).Start_date);
5847
5848 IF TRUNC(l_sll_start_date) <> l_line_rec.line_start_dt THEN
5849
5850 ---delete lvl element at one shot as line is not billed if start dt is changing.
5851 Del_sll_lvlelement(
5852 p_top_line_id => p_top_line_id,
5853 x_return_status => x_return_status,
5854 x_msg_count => x_msg_count,
5855 x_msg_data => x_msg_data);
5856
5857 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5858 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_lvl_ele',
5859 'Del_sll_lvlelement(x_return_status = '||x_return_status
5860 ||', line passed = '|| p_top_line_id ||')');
5861 END IF;
5862
5863
5864 IF x_return_status <> 'S' THEN
5865 RAISE G_EXCEPTION_HALT_VALIDATION;
5866 END IF;
5867 END IF; ---sll start dt not same as line start dt
5868
5869 IF TRUNC(l_sll_start_date) > l_line_rec.line_start_dt THEN
5870 ---add one sll in the starting with uom code got from timeutil pub
5871
5872 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5873
5874 fnd_log.STRING (fnd_log.level_statement,
5875 G_MODULE_CURRENT || '.cascade_dates_sll.if_stat',
5876 'sll st dt > line st dt'
5877 || ', sll st dt = ' || l_sll_start_date
5878 );
5879 END IF;
5880
5881 IF l_period_start IS NOT NULL AND
5882 l_period_type IS NOT NULL AND
5883 l_period_start = 'CALENDAR'
5884 THEN
5885 -- IF(TRUNC(l_sll_start_date,'MM') = TRUNC(l_sll_start_date)) THEN
5886 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
5887 p_end_date => TRUNC(l_sll_tbl(l_sll_tbl_index).End_date),
5888 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
5889 p_period_start => l_period_start);
5890
5891 l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no;
5892 l_sll_tbl(l_sll_tbl_index).cle_id := p_top_line_id;
5893 l_sll_tbl(l_sll_tbl_index).chr_id := NULL;
5894 l_sll_tbl(l_sll_tbl_index).dnz_chr_id := l_line_rec.dnz_chr_id;
5895 l_sll_tbl(l_sll_tbl_index).sequence_no := l_sequence;
5896 l_sll_tbl(l_sll_tbl_index).start_date := l_line_rec.line_start_dt;
5897 l_sll_tbl(l_sll_tbl_index).end_date := TRUNC(l_sll_tbl(l_sll_tbl_index).End_date);
5898 l_sll_tbl(l_sll_tbl_index).level_periods := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
5899 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
5900 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
5901 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
5902 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
5903 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
5904 IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
5905 l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods + 1;
5906 END IF;
5907 l_sll_tbl(l_sll_tbl_index).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
5908 l_sll_tbl(l_sll_tbl_index).uom_code := l_sll_tbl(l_sll_tbl_index).uom_code;
5909 l_sll_tbl(l_sll_tbl_index).level_amount :=
5910 l_sll_tbl(l_sll_tbl_index).level_amount;
5911 l_sll_tbl(l_sll_tbl_index).invoice_offset_days :=
5912 l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
5913 l_sll_tbl(l_sll_tbl_index).interface_offset_days :=
5914 l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
5915
5916 -- ELSE --sll start date not first day of calendar month
5917
5918 ELSE --period start and period type are null
5919 --existing logic
5920 ----Commented the above code for bug 13799709
5921 /* OKC_TIME_UTIL_PUB.get_duration(
5922 p_start_date => l_line_rec.line_start_dt,
5923 p_end_date => l_sll_start_date - 1,
5924 x_duration => l_duration,
5925 x_timeunit => l_timeunit,
5926 x_return_status => x_return_status);
5927
5928 --mchoudha bug#5076095 added to_char for the dates in the following
5929 --fnd_log statement
5930 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5931 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.sll_duration',
5932 'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
5933 ||', end date in MM/DD/YYYY HH24:MI:SS = ' || to_char(l_sll_start_date - 1,'MM/DD/YYYY HH24:MI:SS')
5934 ||', st date MM/DD/YYYY HH24:MI:SS ='|| to_char(l_line_rec.line_start_dt,'MM/DD/YYYY HH24:MI:SS')
5935 ||', returned timeunit and duration = ' ||l_duration || '-' || l_timeunit ||')');
5936 END IF;
5937
5938
5939
5940 IF x_return_status <> 'S' THEN
5941 RAISE G_EXCEPTION_HALT_VALIDATION;
5942 END IF;
5943
5944 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
5945 p_timeunit => l_timeunit,
5946 x_return_status => x_return_status,
5947 x_quantity => l_uom_quantity ,
5948 x_timeunit => l_tce_code);
5949
5950 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5951 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.seeded',
5952 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
5953 ||', returned timeunit and qty = ' ||l_tce_code || '-' || l_uom_quantity ||')');
5954 END IF;
5955
5956 l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no - 1;
5957
5958 l_sll_tbl(0).cle_id := p_top_line_id;
5959 l_sll_tbl(0).chr_id := NULL;
5960 l_sll_tbl(0).dnz_chr_id := l_line_rec.dnz_chr_id;
5961 l_sll_tbl(0).sequence_no := l_sequence;
5962 l_sll_tbl(0).start_date := l_line_rec.line_start_dt;
5963 l_sll_tbl(0).end_date := TRUNC(l_sll_start_date) - 1;
5964
5965 IF l_tce_code = 'DAY' AND l_uom_quantity = 1 THEN
5966 l_sll_tbl(0).level_periods := 1;
5967 l_sll_tbl(0).uom_per_period := l_duration;
5968 ELSE
5969 l_sll_tbl(0).level_periods := l_duration;
5970 l_sll_tbl(0).uom_per_period := 1;
5971 END IF;
5972
5973 l_sll_tbl(0).uom_code := l_timeunit; */
5974 ----Commented the above code for bug 13799709
5975 /*Added for bug 14047785--enhaced bug for 13799709*/
5976 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
5977 p_timeunit => l_sll_tbl(l_sll_tbl_index).uom_code,
5978 x_return_status => x_return_status,
5979 x_quantity => l_uom_quantity ,
5980 x_timeunit => l_tce_code);
5981
5982 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5983 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.seeded',
5984 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
5985 ||', returned timeunit and qty = ' ||l_tce_code || '-' || l_uom_quantity ||')');
5986 END IF;
5987
5988 l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no - 1;
5989
5990 l_sll_tbl(0).cle_id := p_top_line_id;
5991 l_sll_tbl(0).chr_id := NULL;
5992 l_sll_tbl(0).dnz_chr_id := l_line_rec.dnz_chr_id;
5993 l_sll_tbl(0).sequence_no := l_sequence;
5994 l_sll_tbl(0).start_date := l_line_rec.line_start_dt;
5995
5996
5997 l_uom_qty := nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1) * nvl(l_uom_quantity,1);
5998
5999 l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6000 (p_tce_code => l_tce_code,
6001 p_fr_start_date => l_line_rec.line_start_dt,
6002 p_fr_end_date => TRUNC(l_sll_start_date) - 1,
6003 p_uom_quantity => l_uom_qty,
6004 x_return_status => x_return_status);
6005
6006 IF x_return_status <> 'S' THEN
6007 RAISE G_EXCEPTION_HALT_VALIDATION;
6008 END IF;
6009
6010 l_period_freq := ceil(l_period_freq);
6011
6012
6013 l_end_date := OKC_TIME_UTIL_PUB.get_enddate(
6014 l_line_rec.line_start_dt,
6015 l_sll_tbl(l_sll_tbl_index).uom_code,
6016 (l_sll_tbl(l_sll_tbl_index).uom_per_period * l_period_freq ));
6017
6018 l_sll_tbl(0).level_periods := l_period_freq;
6019 l_sll_tbl(0).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6020 l_sll_tbl(0).uom_code := l_sll_tbl(l_sll_tbl_index).uom_code;
6021 l_sll_tbl(0).end_date := l_end_date ;
6022
6023 If l_end_date <> TRUNC(l_sll_start_date) - 1 then
6024
6025 l_sll_tbl(0).end_date := TRUNC(l_sll_start_date) - 1;
6026
6027 OKC_TIME_UTIL_PUB.get_duration(
6028 p_start_date => l_line_rec.line_start_dt,
6029 p_end_date => l_sll_start_date - 1,
6030 x_duration => l_duration,
6031 x_timeunit => l_timeunit,
6032 x_return_status => x_return_status);
6033
6034 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
6035 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6036 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
6037 RAISE OKC_API.G_EXCEPTION_ERROR;
6038 END IF;
6039
6040 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6041 p_timeunit => l_timeunit,
6042 x_return_status => x_return_status,
6043 x_quantity => l_uom_quantity ,
6044 x_timeunit => l_tce_code);
6045
6046 l_uom_qty := nvl(l_duration,1) * nvl(l_uom_quantity,1);
6047
6048 l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6049 (p_tce_code => l_tce_code,
6050 p_fr_start_date => l_line_rec.line_start_dt,
6051 p_fr_end_date => l_sll_start_date - 1,
6052 p_uom_quantity => l_uom_qty,
6053 x_return_status => x_return_status);
6054
6055 IF x_return_status <> 'S' THEN
6056 RAISE G_EXCEPTION_HALT_VALIDATION;
6057 END IF;
6058
6059 l_period_freq := ceil(l_period_freq);
6060
6061 l_sll_tbl(0).level_periods := l_period_freq;
6062 l_sll_tbl(0).uom_per_period := l_duration;
6063 l_sll_tbl(0).uom_code := l_timeunit;
6064
6065 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6066
6067 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.create_dates_sll.st_end_seed',
6068 'After okc_time_util_pub.get_frequency(x_return_status = '||x_return_status
6069 ||', l_period_freq = '|| l_period_freq
6070 ||', l_duration = ' || l_duration ||',l_timeunit = '||l_timeunit ||')');
6071
6072 END IF;
6073
6074 END IF;
6075 /*Added for ceredian bug 13799709*/
6076
6077 l_sll_tbl(0).level_amount := l_sll_tbl(l_sll_tbl_index).level_amount;
6078 l_sll_tbl(0).invoice_offset_days := l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
6079 l_sll_tbl(0).interface_offset_days := l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
6080
6081
6082 END IF; --period start and period type ar not null
6083
6084 IF l_sequence < 1 then
6085
6086 l_factor := -(l_sequence - 1);
6087 l_sequence := l_sequence + l_factor;
6088
6089 FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
6090 LOOP
6091 l_sll_tbl(l_sll_tbl_index).sequence_no := l_sequence;
6092 l_sequence := l_sequence + 1;
6093 END LOOP;
6094 END IF;
6095
6096 l_next_date := l_line_rec.line_start_dt;
6097
6098 -----errorout_ad('l_sll_tbl.FIRST = ' || l_sll_tbl.FIRST);
6099
6100 FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
6101 LOOP
6102 l_sll_tbl(l_sll_tbl_index).start_date := TRUNC(l_next_date);
6103
6104 -------------------------------------------------------------------------
6105 -- Begin partial period computation logic
6106 -- Developer Mani Choudhary
6107 -- Date 08-JUN-2005
6108 -- Derive the next billing date by calling the get_enddate_cal
6109 -------------------------------------------------------------------------
6110 IF l_period_start IS NOT NULL AND
6111 l_period_type IS NOT NULL AND
6112 l_period_start = 'CALENDAR'
6113 THEN
6114 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6115 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6116 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6117 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6118 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6119
6120 ELSE
6121 --existing logic
6122 l_next_date := OKC_TIME_UTIL_PUB.get_enddate(
6123 l_sll_tbl(l_sll_tbl_index).start_date,
6124 l_sll_tbl(l_sll_tbl_index).uom_code,
6125 (l_sll_tbl(l_sll_tbl_index).level_periods * l_sll_tbl(l_sll_tbl_index).uom_per_period));
6126 END IF;
6127 --------------------------------------------------------------------------------
6128 l_sll_tbl(l_sll_tbl_index).end_date := TRUNC(l_next_date);
6129
6130 l_next_date := l_next_date + 1;
6131 END LOOP;
6132
6133
6134 ELSIF TRUNC(l_sll_start_date) < l_line_rec.line_start_dt THEN ---LINE START DATE is pushed forward
6135
6136 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6137
6138 fnd_log.STRING (fnd_log.level_statement,
6139 G_MODULE_CURRENT || '.cascade_dates_sll.chk_sll_dt',
6140 'sll st dt < line st dt - line start date is pushed forward'
6141 || ', sll st dt = ' || l_sll_start_date
6142 );
6143 END IF;
6144
6145 l_strm_lvl_tbl_in.delete;
6146 l_sll_ind := 1;
6147 l_sll_tbl_index := l_sll_tbl.FIRST ;
6148
6149 -----errorout_ad('l_sll_start_date = '|| l_sll_start_date);
6150
6151 ----delete first sll till sll start dt >= line start dt
6152
6153 WHILE TRUNC(l_sll_start_date) < l_line_rec.line_start_dt AND l_sll_tbl.count > 0
6154 LOOP
6155
6156 ----GET END DATE FOR THE sll
6157 l_sll_tbl_index := l_sll_tbl.FIRST ;
6158
6159 l_sll_start_date := TRUNC(l_sll_tbl(l_sll_tbl_index).end_date) + 1;
6160
6161 IF TRUNC(l_sll_tbl(l_sll_tbl_index).end_date) < l_line_rec.line_start_dt THEN
6162 ---put the sll in the table for deletion
6163 -----errorout_ad('added in delete sll tbl');
6164
6165 l_strm_lvl_tbl_in(l_sll_ind).id := l_sll_tbl(l_sll_tbl_index).id;
6166 l_sll_ind := l_sll_ind + 1;
6167
6168 l_sll_tbl.DELETE(l_sll_tbl_index);
6169
6170 END IF;
6171 END LOOP; --while end loop
6172
6173 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6174
6175 fnd_log.STRING (fnd_log.level_statement,
6176 G_MODULE_CURRENT || '.cascade_dates_sll.sll_after_delete',
6177 'sll count after deleting sll where sll end date < line start date'
6178 || ', sll count = ' || l_sll_tbl.count
6179 );
6180 END IF;
6181
6182 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
6183
6184
6185 OKS_SLL_PVT.delete_row(
6186 p_api_version => l_api_version,
6187 p_init_msg_list => l_msg_list,
6188 x_return_status => x_return_status,
6189 x_msg_count => x_msg_count,
6190 x_msg_data => x_msg_data,
6191 p_sllv_tbl => l_strm_lvl_tbl_in);
6192
6193 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6194 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_sll',
6195 'oks_sll_pvt.delete_row(x_return_status = '||x_return_status
6196 ||', sll passed for delete = '|| l_strm_lvl_tbl_in.count ||')');
6197 END IF;
6198
6199
6200 IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
6201 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6202 ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
6203 RAISE OKC_API.G_EXCEPTION_ERROR;
6204 END IF;
6205 END IF;
6206
6207 IF l_sll_tbl.count > 0 then
6208
6209
6210 l_sll_tbl_index := l_sll_tbl.FIRST;
6211
6212 l_sll_start_date := l_sll_tbl(l_sll_tbl_index).start_date;
6213 -----errorout_ad('l_sll_start_date after deleting = ' || l_sll_start_date);
6214 -----errorout_ad('first sll st dt = ' || l_sll_start_date || ' and line st dt = ' || l_line_rec.line_start_dt);
6215
6216 IF l_line_rec.line_start_dt > TRUNC(l_sll_start_date) THEN
6217
6218 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6219
6220 fnd_log.STRING (fnd_log.level_statement,
6221 G_MODULE_CURRENT || '.cascade_dates_sll.after_sll_del',
6222 'after sll delete line start date > sll start date'
6223 || ', sll dt = ' || l_sll_start_date
6224 );
6225 END IF;
6226
6227
6228 l_sll_tbl_index := l_sll_tbl.FIRST ;
6229
6230 l_sll_end_date := l_sll_tbl(l_sll_tbl_index).end_date ;
6231
6232 -------------------------------------------------------------------------
6233 -- Begin partial period computation logic
6234 -- Developer Mani Choudhary
6235 -- Date 08-JUN-2005
6236 -- Modify the current SLL to have SLL start date as line start date and
6237 -- SLL end date as current end date of SLL
6238 -------------------------------------------------------------------------
6239 IF l_period_start IS NOT NULL AND
6240 l_period_type IS NOT NULL AND
6241 l_period_start = 'CALENDAR'
6242 THEN
6243 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6244 p_end_date => l_sll_end_date,
6245 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6246 p_period_start => l_period_start);
6247
6248 l_sll_tbl(l_sll_tbl_index).start_date := l_line_rec.line_start_dt;
6249 l_sll_tbl(l_sll_tbl_index).end_date := l_sll_end_date;
6250 l_sll_tbl(l_sll_tbl_index).level_periods := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
6251 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6252 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6253 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6254 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6255 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6256 IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
6257 l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods + 1;
6258 END IF;
6259
6260 ELSE --existing logic in this else block
6261 ----in migration not migrating sll end date so chk for old data
6262 IF l_sll_end_date IS NULL THEN
6263 IF l_sll_tbl_index < l_sll_tbl.LAST THEN
6264 l_sll_end_date := l_sll_tbl(l_sll_tbl_index + 1).start_date + 1;
6265
6266 ELSE
6267 l_sll_end_date := OKC_TIME_UTIL_PUB.get_enddate(
6268 l_sll_tbl(l_sll_tbl_index).start_date,
6269 l_sll_tbl(l_sll_tbl_index).uom_code,
6270 (l_sll_tbl(l_sll_tbl_index).level_periods * l_sll_tbl(l_sll_tbl_index).uom_per_period));
6271 END IF; --- chk for last sll
6272
6273 END IF; ---end of sll end date null
6274
6275 -----errorout_ad('l_sll_end_date = ' || l_sll_end_date);
6276
6277 ----find out the periods between line start date and SLL end date
6278
6279 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6280 p_timeunit => l_sll_tbl(l_sll_tbl_index).uom_code,
6281 x_return_status => x_return_status,
6282 x_quantity => l_uom_quantity ,
6283 x_timeunit => l_tce_code);
6284
6285 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6286 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.seed',
6287 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6288 ||', returned timeunit and qty = ' ||l_tce_code || '-' || l_uom_quantity ||')');
6289 END IF;
6290
6291 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
6292 RAISE G_EXCEPTION_HALT_VALIDATION;
6293 END IF;
6294 --mchoudha for bug#4860210
6295 -- IF l_tce_code = 'DAY' THEN
6296
6297 -- l_period_freq := (l_sll_end_date - l_line_rec.line_start_dt) + 1;
6298
6299 -- IF nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1) = 1 THEN
6300 -- l_sll_tbl(l_sll_tbl_index).uom_per_period := l_period_freq;
6301 -- ELSE
6302 -- l_actual_freq := nvl(l_period_freq,0)/nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1);
6303
6304 -- l_actual_freq := ceil(l_actual_freq);
6305
6306 -- l_sll_tbl(l_sll_tbl_index).level_periods := l_actual_freq;
6307
6308 -- END IF;
6309
6310 -- ELSE ----not day
6311
6312 l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6313 (p_tce_code => l_tce_code,
6314 p_fr_start_date => l_line_rec.line_start_dt,
6315 p_fr_end_date => l_sll_end_date,
6316 p_uom_quantity => l_uom_quantity,
6317 x_return_status => x_return_status);
6318
6319 IF x_return_status <> 'S' THEN
6320 RAISE G_EXCEPTION_HALT_VALIDATION;
6321 END IF;
6322 -----errorout_ad('l_period_freq = ' || l_period_freq);
6323 l_actual_freq := nvl(l_period_freq,0)/nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1);
6324
6325 -- l_actual_freq := ceil(l_period_freq);
6326 l_actual_freq := ceil(l_actual_freq);
6327 -----errorout_ad('l_actual_freq = ' || l_actual_freq);
6328 -----errorout_ad('l_sll_tbl_index of sll rec changing = ' || l_sll_tbl_index);
6329 l_sll_tbl(l_sll_tbl_index).level_periods := l_actual_freq;
6330
6331
6332 -- END IF; -------not day
6333
6334 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6335
6336 fnd_log.STRING (fnd_log.level_statement,
6337 G_MODULE_CURRENT || '.cascade_dates_sll.sll_add',
6338 'sll added after deleting sll where sll_end_dt < line_start_dt');
6339 END IF;
6340
6341 END IF; --period type and period start are not null
6342 END IF; --l_line_rec.line_start_dt > TRUNC(l_sll_start_date)
6343
6344 l_next_date := l_line_rec.line_start_dt;
6345
6346 FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
6347 LOOP
6348 l_sll_tbl(l_sll_tbl_index).start_date := TRUNC(l_next_date);
6349 -------------------------------------------------------------------------
6350 -- Begin partial period computation logic
6351 -- Developer Mani Choudhary
6352 -- Date 08-JUN-2005
6353 -- Derive the next billing date by calling the get_enddate_cal
6354 -------------------------------------------------------------------------
6355 IF l_period_start IS NOT NULL AND
6356 l_period_type IS NOT NULL AND
6357 l_period_start = 'CALENDAR'
6358 THEN
6359 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6360 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6361 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6362 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6363 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6364
6365 /*added for bug 13799709 by spingali */
6366
6367 l_sll_tbl(l_sll_tbl_index).end_date := TRUNC(l_next_date);
6368
6369 /*added for bug 13799709 by spingali */
6370
6371
6372 ELSE
6373 --Existing logic
6374 l_next_date := OKC_TIME_UTIL_PUB.get_enddate(
6375 l_sll_tbl(l_sll_tbl_index).start_date,
6376 l_sll_tbl(l_sll_tbl_index).uom_code,
6377 (l_sll_tbl(l_sll_tbl_index).uom_per_period * l_sll_tbl(l_sll_tbl_index).level_periods));
6378
6379 /*added for bug 13799709 by spingali */
6380
6381 l_sll_tbl(l_sll_tbl_index).end_date := TRUNC(l_next_date);
6382
6383 IF l_sll_tbl(l_sll_tbl_index).end_date > l_line_rec.line_END_dt and (l_period_start IS NULL AND l_period_type IS NULL) THEN
6384
6385 l_sll_tbl(l_sll_tbl_index).end_date :=l_line_rec.line_END_dt;
6386
6387 END IF; /*(If l_sll_tbl(l_sll_tbl_index).end_date > l_line_rec.line_END_dt ) Check Endif*/
6388
6389 /*added for bug 13799709 by spingali*/
6390
6391 END IF;
6392 ---------------------------------------------------------------------------------
6393 l_next_date := l_next_date + 1;
6394
6395 END LOOP;
6396
6397
6398
6399 ELSE ---sll tbl count = 0 after deletion
6400
6401 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6402
6403 fnd_log.STRING (fnd_log.level_statement,
6404 G_MODULE_CURRENT || '.cascade_dates_sll.sll_cnt',
6405 'sll count zero after deleting sll where sll_end_dt < line_start_dt');
6406 END IF;
6407
6408
6409
6410 OKC_TIME_UTIL_PUB.get_duration(
6411 p_start_date => l_line_rec.line_start_dt,
6412 p_end_date => l_line_rec.line_end_dt,
6413 x_duration => l_duration,
6414 x_timeunit => l_timeunit,
6415 x_return_status => x_return_status);
6416
6417 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6418 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.duration',
6419 'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
6420 ||', l_duration = '|| l_duration
6421 ||', l_timeunit = ' || l_timeunit ||')');
6422 END IF;
6423
6424 IF x_return_status <> 'S' THEN
6425 RAISE G_EXCEPTION_HALT_VALIDATION;
6426 END IF;
6427
6428 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6429 p_timeunit => l_timeunit,
6430 x_return_status => x_return_status,
6431 x_quantity => l_uom_quantity ,
6432 x_timeunit => l_tce_code);
6433
6434 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6435 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.call_seed',
6436 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6437 ||', l_uom_quantity = '|| l_uom_quantity
6438 ||', l_tce_code = ' || l_tce_code ||')');
6439 END IF;
6440
6441 -------------------------------------------------------------------------
6442 -- Begin partial period computation logic
6443 -- Developer Mani Choudhary
6444 -- Date 08-JUN-2005
6445 -- Create one SLL line start date to line end date
6446 -------------------------------------------------------------------------
6447 IF l_period_start IS NOT NULL AND
6448 l_period_type IS NOT NULL AND
6449 l_period_start = 'CALENDAR'
6450 THEN
6451 IF l_price_uom IS NULL THEN
6452 l_price_uom := l_timeunit;
6453 END IF;
6454 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6455 p_end_date => l_line_rec.line_end_dt,
6456 p_uom_code => l_price_uom,
6457 p_period_start => l_period_start);
6458
6459 l_sll_tbl(1).cle_id := p_top_line_id;
6460 l_sll_tbl(1).chr_id := NULL;
6461 l_sll_tbl(1).dnz_chr_id := l_line_rec.dnz_chr_id;
6462 l_sll_tbl(1).sequence_no := 1;
6463 l_sll_tbl(1).start_date := l_line_rec.line_start_dt;
6464 l_sll_tbl(1).end_date := l_line_rec.line_end_dt;
6465 l_sll_tbl(1).level_periods := l_level_periods;
6466 l_sll_tbl(1).uom_per_period := 1;
6467 l_sll_tbl(1).uom_code := l_price_uom;
6468 l_sll_tbl(1).level_amount := NULL;
6469 l_sll_tbl(1).invoice_offset_days := NULL;
6470 l_sll_tbl(1).interface_offset_days := NULL;
6471
6472 ELSE --existing logic in this else block
6473
6474 l_sll_tbl(1).cle_id := p_top_line_id;
6475 l_sll_tbl(1).chr_id := NULL;
6476 l_sll_tbl(1).dnz_chr_id := l_line_rec.dnz_chr_id;
6477 l_sll_tbl(1).sequence_no := 1;
6478 l_sll_tbl(1).start_date := l_line_rec.line_start_dt;
6479 l_sll_tbl(1).end_date := l_line_rec.line_end_dt;
6480
6481 IF l_tce_code = 'DAY' AND l_uom_quantity = 1 THEN
6482 l_sll_tbl(1).level_periods := 1;
6483 l_sll_tbl(1).uom_per_period := l_duration;
6484 ELSE
6485 l_sll_tbl(1).level_periods := l_duration;
6486 l_sll_tbl(1).uom_per_period := 1;
6487 END IF;
6488
6489 l_sll_tbl(1).uom_code := l_timeunit;
6490 l_sll_tbl(1).level_amount := NULL;
6491 l_sll_tbl(1).invoice_offset_days := NULL ;
6492 l_sll_tbl(1).interface_offset_days := NULL ;
6493
6494 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6495
6496 fnd_log.STRING (fnd_log.level_statement,
6497 G_MODULE_CURRENT || '.cascade_dates_sll.sll_one',
6498 'sll added count one');
6499 END IF;
6500 END IF; --period start and period type not null
6501 END IF; --sll count = 0
6502
6503 END IF;
6504
6505
6506
6507 ----find end date of last SLL
6508
6509 IF l_sll_tbl.COUNT > 0 THEN
6510
6511 l_sll_tbl_index := l_sll_tbl.LAST;
6512
6513 l_sll_start_date := l_sll_tbl(l_sll_tbl_index).start_date;
6514 l_sll_END_date := l_sll_tbl(l_sll_tbl_index).end_date;
6515 l_sll_start_date := l_sll_END_date + 1;
6516 ELSE
6517 RETURN;
6518
6519 end if;
6520
6521
6522
6523 IF TRUNC(l_sll_END_date) < l_line_rec.line_END_dt THEN ---LINE date extended
6524
6525 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6526
6527 fnd_log.STRING (fnd_log.level_statement,
6528 G_MODULE_CURRENT || '.cascade_dates_sll.chk_end_dt',
6529 'sll end dt < line_end_dt'
6530 || ', sl end dt = ' || l_sll_END_date);
6531 END IF;
6532
6533 IF l_sll_tbl.COUNT > 0 THEN
6534
6535 -------------------------------------------------------------------------
6536 -- Begin partial period computation logic
6537 -- Developer Mani Choudhary
6538 -- Date 08-JUN-2005
6539 -- Modify the current SLL to have SLL start date as line start date and
6540 -- SLL end date as current end date of SLL
6541 -------------------------------------------------------------------------
6542 IF l_period_start IS NOT NULL AND
6543 l_period_type IS NOT NULL AND
6544 l_period_start = 'CALENDAR'
6545 THEN
6546 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6547 p_end_date => l_line_rec.line_END_dt,
6548 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6549 p_period_start => l_period_start);
6550
6551 l_sll_tbl(l_sll_tbl_index).cle_id := p_top_line_id;
6552 l_sll_tbl(l_sll_tbl_index).chr_id := NULL;
6553 l_sll_tbl(l_sll_tbl_index).dnz_chr_id := l_line_rec.dnz_chr_id;
6554 l_sll_tbl(l_sll_tbl_index).sequence_no := l_sll_tbl(l_sll_tbl_index).sequence_no;
6555 l_sll_tbl(l_sll_tbl_index).start_date := l_sll_tbl(l_sll_tbl_index).start_date;
6556 l_sll_tbl(l_sll_tbl_index).end_date := l_line_rec.line_END_dt;
6557 l_sll_tbl(l_sll_tbl_index).level_periods := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
6558 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6559 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6560 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6561 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6562 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6563 IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
6564 l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods + 1;
6565 END IF;
6566 -- l_sll_tbl(l_sll_tbl_index).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6567 -- l_sll_tbl(l_sll_tbl_index).uom_code := l_price_uom;
6568 l_sll_tbl(l_sll_tbl_index).level_amount :=
6569 l_sll_tbl(l_sll_tbl_index).level_amount;
6570 l_sll_tbl(l_sll_tbl_index).invoice_offset_days :=
6571 l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
6572 l_sll_tbl(l_sll_tbl_index).interface_offset_days :=
6573 l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
6574
6575 ELSE --existing logic in this else block
6576
6577
6578 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6579 p_timeunit => l_sll_tbl(l_sll_tbl_index).uom_code,
6580 x_return_status => x_return_status,
6581 x_quantity => l_uom_quantity ,
6582 x_timeunit => l_tce_code);
6583
6584 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6585 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.st_end_seed',
6586 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6587 ||', l_uom_quantity = '|| l_uom_quantity
6588 ||', l_tce_code = ' || l_tce_code ||')');
6589 END IF;
6590
6591
6592
6593 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
6594 RAISE G_EXCEPTION_HALT_VALIDATION;
6595 END IF;
6596 --mchoudha for bug#4860210
6597 -- IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6598
6599 -- l_period_freq := (l_line_rec.line_END_dt - l_sll_start_date) + 1;
6600 -- ELSE
6601 -----errorout_ad('l_sll_start_date of new sll to be inserted = '|| l_sll_start_date);
6602
6603 l_uom_qty := nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1) * nvl(l_uom_quantity,1);
6604
6605 l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6606 (p_tce_code => l_tce_code,
6607 p_fr_start_date => l_sll_start_date,
6608 p_fr_end_date => l_line_rec.line_END_dt,
6609 p_uom_quantity => l_uom_qty,
6610 x_return_status => x_return_status);
6611
6612 IF x_return_status <> 'S' THEN
6613 RAISE G_EXCEPTION_HALT_VALIDATION;
6614 END IF;
6615
6616 l_period_freq := ceil(l_period_freq);
6617
6618
6619 -- END IF;
6620
6621 l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no + 1;
6622
6623 -----errorout_ad('l_sequence of sll inserted = ' || l_sequence);
6624 -----errorout_ad('l_sll_tbl_index at time of inserting record = ' || l_sll_tbl_index );
6625
6626 l_sll_tbl(l_sll_tbl_index + 1).sequence_no := l_sequence;
6627 l_sll_tbl(l_sll_tbl_index + 1).start_date := TRUNC(l_sll_start_date);
6628
6629
6630
6631 -- IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6632 -- l_sll_tbl(l_sll_tbl_index + 1).level_periods := '1';
6633 -- l_sll_tbl(l_sll_tbl_index + 1).uom_per_period := l_period_freq;
6634 -- l_sll_tbl(l_sll_tbl_index + 1).end_date := l_line_rec.line_end_dt;
6635 -- ELSE
6636 l_sll_tbl(l_sll_tbl_index + 1).level_periods := l_period_freq;
6637 l_sll_tbl(l_sll_tbl_index + 1).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6638 l_sll_tbl(l_sll_tbl_index + 1).uom_code := l_sll_tbl(l_sll_tbl_index).uom_code;
6639
6640
6641 l_sll_tbl(l_sll_tbl_index + 1).end_date := OKC_TIME_UTIL_PUB.get_enddate(
6642 l_sll_start_date,
6643 l_sll_tbl(l_sll_tbl_index).uom_code,
6644 l_period_freq * l_sll_tbl(l_sll_tbl_index).uom_per_period);
6645
6646 /*added for bug 13799709 by spingali */
6647 IF l_sll_tbl(l_sll_tbl_index + 1).end_date > l_line_rec.line_END_dt THEN
6648
6649 l_sll_tbl(l_sll_tbl_index + 1).end_date :=l_line_rec.line_END_dt;
6650
6651
6652
6653 OKC_TIME_UTIL_PUB.get_duration(
6654 p_start_date => l_sll_tbl(l_sll_tbl_index + 1).start_date,
6655 p_end_date => l_sll_tbl(l_sll_tbl_index + 1).end_date,
6656 x_duration => l_duration,
6657 x_timeunit => l_timeunit,
6658 x_return_status => x_return_status);
6659
6660 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
6661 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6662 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
6663 RAISE OKC_API.G_EXCEPTION_ERROR;
6664 END IF;
6665
6666 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6667 p_timeunit => l_timeunit,
6668 x_return_status => x_return_status,
6669 x_quantity => l_uom_quantity ,
6670 x_timeunit => l_tce_code);
6671
6672 l_uom_qty := nvl(l_duration,1) * nvl(l_uom_quantity,1);
6673
6674 l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6675 (p_tce_code => l_tce_code,
6676 p_fr_start_date => l_sll_start_date,
6677 p_fr_end_date => l_line_rec.line_END_dt,
6678 p_uom_quantity => l_uom_qty,
6679 x_return_status => x_return_status);
6680
6681 IF x_return_status <> 'S' THEN
6682 RAISE G_EXCEPTION_HALT_VALIDATION;
6683 END IF;
6684
6685 l_period_freq := ceil(l_period_freq);
6686
6687 l_sll_tbl(l_sll_tbl_index + 1).level_periods := l_period_freq;
6688 l_sll_tbl(l_sll_tbl_index + 1).uom_per_period := l_duration;
6689 l_sll_tbl(l_sll_tbl_index + 1).uom_code := l_timeunit;
6690
6691 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6692
6693 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.create_dates_sll.st_end_seed',
6694 'After okc_time_util_pub.get_frequency(x_return_status = '||x_return_status
6695 ||', l_period_freq = '|| l_period_freq
6696 ||', l_duration = ' || l_duration ||',l_timeunit = '||l_timeunit ||')');
6697
6698 END IF;
6699
6700 END IF;
6701
6702 /*added for bug 13799709 by spingali*/
6703
6704 -- END IF;
6705
6706 l_sll_tbl(l_sll_tbl_index + 1).invoice_offset_days := l_sll_tbl(l_sll_tbl_index).invoice_offset_days;
6707 l_sll_tbl(l_sll_tbl_index + 1).interface_offset_days := l_sll_tbl(l_sll_tbl_index).interface_offset_days;
6708 l_sll_tbl(l_sll_tbl_index + 1).level_amount := l_sll_tbl(l_sll_tbl_index).level_amount;
6709 l_sll_tbl(l_sll_tbl_index + 1).cle_id := l_sll_tbl(l_sll_tbl_index ).cle_id ;
6710 l_sll_tbl(l_sll_tbl_index + 1).chr_id := l_sll_tbl(l_sll_tbl_index ).chr_id ;
6711 l_sll_tbl(l_sll_tbl_index + 1).dnz_chr_id := l_sll_tbl(l_sll_tbl_index ).dnz_chr_id;
6712
6713 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6714
6715 fnd_log.STRING (fnd_log.level_statement,
6716 G_MODULE_CURRENT || '.cascade_dates_sll.all_sll_end',
6717 'added sll when sll end dt < line_end_dt');
6718 END IF;
6719
6720 END IF; --period start and period type are not null
6721 ELSE ---sll tbl count = 0
6722
6723
6724 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6725
6726 fnd_log.STRING (fnd_log.level_statement,
6727 G_MODULE_CURRENT || '.cascade_dates_sll.sll_zero',
6728 'sll count zero');
6729 END IF;
6730
6731
6732 OKC_TIME_UTIL_PUB.get_duration(
6733 p_start_date => l_line_rec.line_start_dt,
6734 p_end_date => l_line_rec.line_end_dt,
6735 x_duration => l_duration,
6736 x_timeunit => l_timeunit,
6737 x_return_status => x_return_status);
6738
6739 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6740 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.sll_duration',
6741 'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
6742 ||', l_duration = '|| l_duration
6743 ||', l_timeunit = ' || l_timeunit ||')');
6744 END IF;
6745
6746
6747 IF x_return_status <> 'S' THEN
6748 RAISE G_EXCEPTION_HALT_VALIDATION;
6749 END IF;
6750
6751 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6752 p_timeunit => l_timeunit,
6753 x_return_status => x_return_status,
6754 x_quantity => l_uom_quantity ,
6755 x_timeunit => l_tce_code);
6756
6757 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6758 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.end_seed',
6759 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6760 ||', l_uom_quantity = '|| l_uom_quantity
6761 ||', l_tce_code = ' || l_tce_code ||')');
6762 END IF;
6763
6764 -------------------------------------------------------------------------
6765 -- Begin partial period computation logic
6766 -- Developer Mani Choudhary
6767 -- Date 08-JUN-2005
6768 -- Create one SLL line start date to line end date
6769 -------------------------------------------------------------------------
6770 IF l_period_start IS NOT NULL AND
6771 l_period_type IS NOT NULL AND
6772 l_period_start = 'CALENDAR'
6773 THEN
6774 IF l_price_uom IS NULL THEN
6775 l_price_uom := l_timeunit;
6776 END IF;
6777 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6778 p_end_date => l_line_rec.line_end_dt,
6779 p_uom_code => l_price_uom,
6780 p_period_start => l_period_start);
6781
6782 l_sll_tbl(1).cle_id := p_top_line_id;
6783 l_sll_tbl(1).chr_id := NULL;
6784 l_sll_tbl(1).dnz_chr_id := l_line_rec.dnz_chr_id;
6785 l_sll_tbl(1).sequence_no := 1;
6786 l_sll_tbl(1).start_date := l_line_rec.line_start_dt;
6787 l_sll_tbl(1).end_date := l_line_rec.line_end_dt;
6788 l_sll_tbl(1).level_periods := l_level_periods;
6789 l_sll_tbl(1).uom_per_period := 1;
6790 l_sll_tbl(1).uom_code := l_price_uom;
6791 l_sll_tbl(1).level_amount := NULL;
6792 l_sll_tbl(1).invoice_offset_days := NULL;
6793 l_sll_tbl(1).interface_offset_days := NULL;
6794
6795 ELSE --existing logic in this else block
6796
6797
6798 l_sequence := 1;
6799 l_sll_tbl_index := 0;
6800
6801
6802 l_sll_tbl(l_sll_tbl_index).sequence_no := l_sequence;
6803 l_sll_tbl(l_sll_tbl_index).start_date := l_line_rec.line_start_dt;
6804 l_sll_tbl(l_sll_tbl_index).end_date := l_line_rec.line_end_dt;
6805
6806
6807
6808 IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6809 l_sll_tbl(l_sll_tbl_index ).level_periods := '1';
6810 l_sll_tbl(l_sll_tbl_index ).uom_per_period := l_period_freq;
6811
6812 ELSE
6813 l_sll_tbl(l_sll_tbl_index ).level_periods := l_period_freq;
6814 l_sll_tbl(l_sll_tbl_index ).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6815
6816
6817 END IF;
6818
6819 l_sll_tbl(l_sll_tbl_index).uom_code := l_timeunit;
6820 l_sll_tbl(l_sll_tbl_index).cle_id := l_line_rec.id ;
6821 l_sll_tbl(l_sll_tbl_index).chr_id := null;
6822 l_sll_tbl(l_sll_tbl_index).dnz_chr_id := l_line_rec.dnz_chr_id;
6823
6824 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6825
6826 fnd_log.STRING (fnd_log.level_statement,
6827 G_MODULE_CURRENT || '.cascade_dates_sll.sll_one_end',
6828 'sll added count one');
6829 END IF;
6830
6831 END IF; --period start and period type are not null
6832 END IF; -----sll tbl count
6833
6834
6835 --no changes for partial period calendar in this case
6836 ELSIF TRUNC(l_sll_END_date) > l_line_rec.line_END_dt THEN ---LINE END DATE SHRINKED.
6837
6838 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6839
6840 fnd_log.STRING (fnd_log.level_statement,
6841 G_MODULE_CURRENT || '.cascade_dates_sll.chk_end_dt',
6842 'sll end dt > line end dt'
6843 ||', sll end dt = ' || l_sll_END_date );
6844 END IF;
6845
6846 IF l_sll_tbl.count = 0 then
6847 RETURN;
6848 END IF;
6849
6850 l_sll_tbl_index := l_sll_tbl.LAST;
6851 l_sll_start_date := l_sll_tbl(l_sll_tbl_index ).start_date;
6852
6853 l_strm_lvl_tbl_in.DELETE;
6854 l_sll_ind := 1;
6855
6856 WHILE l_line_rec.line_END_dt < TRUNC(l_sll_start_date) AND l_sll_tbl.COUNT > 0
6857 LOOP
6858
6859 l_strm_lvl_tbl_in(l_sll_ind).id := l_sll_tbl(l_sll_tbl_index).id;
6860 l_sll_ind := l_sll_ind + 1;
6861
6862 l_sll_tbl.DELETE(l_sll_tbl_index);
6863
6864 l_sll_tbl_index := l_sll_tbl.LAST;
6865 l_sll_start_date := l_sll_tbl(l_sll_tbl_index ).start_date;
6866 END LOOP;
6867
6868 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
6869 FOR l_sll_ind IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
6870 LOOP
6871
6872 OKS_BILL_UTIL_PUB.delete_level_elements (
6873 p_api_version => l_api_version,
6874 p_rule_id => l_strm_lvl_tbl_in(l_sll_ind).id,
6875 p_init_msg_list => l_msg_list,
6876 x_msg_count => x_msg_count,
6877 x_msg_data => x_msg_data,
6878 x_return_status => x_return_status );
6879
6880 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6881 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_last_sll',
6882 'oks_bill_util_pub.delete_level_elements(x_return_status = '||x_return_status
6883 ||', sll id passed = '|| l_strm_lvl_tbl_in(l_sll_ind).id ||')');
6884 END IF;
6885
6886
6887
6888 END LOOP;
6889 IF x_return_status <> 'S' THEN
6890 RAISE G_EXCEPTION_HALT_VALIDATION;
6891 END IF;
6892
6893 END IF;
6894
6895 /*added for bug 13799709 by spingali */
6896
6897 IF l_sll_start_date < l_line_rec.line_END_dt AND (l_period_start is null and l_period_type is null) THEN
6898
6899 l_sll_tbl(l_sll_tbl_index).end_date := l_line_rec.line_END_dt;
6900
6901 END IF;
6902
6903 /*added for bug 13799709 by spingali */
6904
6905 END IF;
6906
6907 IF l_sll_tbl.COUNT > 0 THEN
6908
6909 OKS_BILL_SCH.Create_Bill_Sch_Rules
6910 (p_billing_type => l_line_csr_rec.billing_schedule_type,
6911 p_sll_tbl => l_sll_tbl,
6912 p_invoice_rule_id => l_line_csr_rec.inv_id,
6913 x_bil_sch_out_tbl => l_bil_sch_out_tbl,
6914 x_return_status => x_return_status);
6915
6916 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6917 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.call_bs',
6918 'oks_bill_sch.Create_Bill_Sch_Rules(x_return_status = '||x_return_status ||')');
6919 END IF;
6920
6921 IF x_return_status <> 'S' THEN
6922 RAISE G_EXCEPTION_HALT_VALIDATION;
6923 END IF;
6924 END IF;
6925
6926
6927
6928 EXCEPTION
6929 WHEN G_EXCEPTION_HALT_VALIDATION THEN
6930
6931 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
6932 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_dates_sll.EXCEPTION',
6933 'G_EXCEPTION_HALT_VALIDATION');
6934 END IF;
6935
6936 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
6937 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6938 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
6939 RAISE OKC_API.G_EXCEPTION_ERROR;
6940 END IF;
6941 WHEN OTHERS THEN
6942
6943 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
6944 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_dates_sll.UNEXPECTED',
6945 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
6946 END IF;
6947
6948 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
6949 p_msg_name => G_UNEXPECTED_ERROR,
6950 p_token1 => G_SQLCODE_TOKEN,
6951 p_token1_value => sqlcode,
6952 p_token2 => G_SQLERRM_TOKEN,
6953 p_token2_value => sqlerrm);
6954
6955 x_return_status := G_RET_STS_UNEXP_ERROR;
6956
6957 END Cascade_Dates_SLL;
6958
6959
6960
6961
6962 PROCEDURE Del_sll_lvlelement(p_top_line_id IN NUMBER,
6963 x_return_status OUT NOCOPY VARCHAR2,
6964 x_msg_count OUT NOCOPY NUMBER,
6965 x_msg_data OUT NOCOPY VARCHAR2)
6966
6967 IS
6968 ----will delete all lvlelements for top and cp
6969 ---and delete sll of all cp.
6970
6971
6972 BEGIN
6973 x_return_status := 'S';
6974
6975
6976 ----delete lvl elements for cp
6977 DELETE FROM OKS_LEVEL_ELEMENTS
6978 WHERE cle_id IN (SELECT id
6979 FROM OKC_K_LINES_B cp
6980 WHERE cp.cle_id = p_top_line_id
6981 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
6982
6983
6984
6985 --------delete lvl elemets for top line
6986 DELETE FROM OKS_LEVEL_ELEMENTS
6987 WHERE cle_id = p_top_line_id;
6988
6989
6990 ---delete sll of all cp
6991
6992 DELETE FROM OKS_STREAM_LEVELS_B
6993 WHERE cle_id IN ( select id
6994 FROM okc_k_lines_b cp
6995 WHERE cp.cle_id = p_top_line_id
6996 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
6997
6998
6999
7000 EXCEPTION
7001 WHEN OTHERS THEN
7002
7003 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7004 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.del_sll_lvlelement.UNEXPECTED',
7005 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7006 END IF;
7007 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7008 p_msg_name => G_UNEXPECTED_ERROR,
7009 p_token1 => G_SQLCODE_TOKEN,
7010 p_token1_value => sqlcode,
7011 p_token2 => G_SQLERRM_TOKEN,
7012 p_token2_value => sqlerrm);
7013
7014 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7015
7016 END Del_sll_lvlelement;
7017
7018
7019 PROCEDURE Adjust_top_BS_Amt(
7020 p_Line_Rec IN Line_Det_Type,
7021 p_SubLine_rec IN Prod_Det_Type,
7022 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
7023 x_return_status OUT NOCOPY VARCHAR2)
7024 IS
7025
7026 CURSOR l_cp_BS_csr(p_cp_id NUMBER) IS
7027 SELECT id, trunc(date_start) date_start,
7028 amount, trunc(date_end) date_end
7029 FROM oks_level_elements element
7030 WHERE cle_id = p_cp_id
7031 ORDER by date_start;
7032
7033 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
7034 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7035 l_index number;
7036 l_top_bs_ind number;
7037 l_cp_bs_ind number;
7038
7039
7040 BEGIN
7041 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7042
7043 l_cp_bs_tbl.DELETE;
7044 l_index := 1;
7045
7046 FOR l_cp_BS_rec IN l_cp_BS_csr(p_SubLine_rec.cp_id)
7047 LOOP
7048 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
7049 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
7050 l_cp_bs_tbl(l_index).date_end := l_cp_BS_rec.date_end;
7051 l_cp_bs_tbl(l_index).Amount := l_cp_BS_rec.amount;
7052
7053 l_index := l_index + 1;
7054 END LOOP;
7055
7056 IF l_cp_bs_tbl.COUNT <= 0 THEN
7057 RETURN;
7058 END IF;
7059
7060 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
7061 l_top_bs_ind := p_top_line_bs.FIRST;
7062 -----errorout_ad('top line bs first = ' || l_top_bs_ind);
7063
7064 WHILE TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) > TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) AND
7065 l_top_bs_ind < p_top_line_bs.LAST
7066 LOOP
7067 l_top_bs_ind := p_top_line_bs.NEXT(l_top_bs_ind);
7068 END LOOP;
7069
7070 -----errorout_ad('after while loop in adj = ' || l_top_bs_ind);
7071 ---chk first cp bs.st_dt if between previous and present record
7072
7073
7074 IF l_top_bs_ind = p_top_line_bs.first THEN
7075 NULL;
7076
7077 ELSIF l_top_bs_ind <= p_top_line_bs.LAST THEN
7078
7079 l_top_bs_ind := l_top_bs_ind - 1;
7080 IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= p_top_line_bs(l_top_bs_ind ).DATE_START
7081 AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= p_top_line_bs(l_top_bs_ind ).DATE_end THEN
7082
7083 NULL;
7084 ELSE
7085 l_top_bs_ind := l_top_bs_ind + 1;
7086 END IF;
7087
7088 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) THEN
7089 NULL;
7090
7091 end if;
7092
7093
7094 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
7095 LOOP
7096
7097 IF l_top_bs_ind <= p_top_line_bs.LAST THEN
7098
7099 p_top_line_bs(l_top_bs_ind).amount := nvl(p_top_line_bs(l_top_bs_ind).amount,0) - nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
7100 l_top_bs_ind := l_top_bs_ind + 1;
7101
7102 END IF;
7103 END LOOP;
7104
7105
7106 EXCEPTION
7107 WHEN G_EXCEPTION_HALT_VALIDATION THEN
7108 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
7109 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_top_bs_amt.EXCEPTION',
7110 'G_EXCEPTION_HALT_VALIDATION');
7111 END IF;
7112
7113 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
7114 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7115 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
7116 RAISE OKC_API.G_EXCEPTION_ERROR;
7117 END IF;
7118 WHEN OTHERS THEN
7119
7120 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7121 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_top_bs_amt.UNEXPECTED',
7122 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7123 END IF;
7124
7125 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7126 p_msg_name => G_UNEXPECTED_ERROR,
7127 p_token1 => G_SQLCODE_TOKEN,
7128 p_token1_value => sqlcode,
7129 p_token2 => G_SQLERRM_TOKEN,
7130 p_token2_value => sqlerrm);
7131
7132 x_return_status := G_RET_STS_UNEXP_ERROR;
7133
7134 end Adjust_top_BS_Amt;
7135
7136
7137
7138 Procedure Update_OM_SLL_Date
7139 (
7140 p_top_line_id IN NUMBER,
7141 x_return_status OUT NOCOPY Varchar2,
7142 x_msg_count OUT NOCOPY NUMBER,
7143 x_msg_data OUT NOCOPY VARCHAR2)
7144 IS
7145
7146 CURSOR l_line_sll_csr IS
7147 SELECT id, cle_id, chr_id, dnz_chr_id , uom_code,
7148 sequence_no, Start_Date, end_Date, level_periods,
7149 uom_per_period, level_amount, invoice_offset_days, interface_offset_days
7150 FROM OKs_stream_levels_b
7151 WHERE cle_id = p_top_line_id
7152 ORDER BY sequence_no;
7153
7154
7155 Cursor l_Line_Csr Is
7156 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
7157 TRUNC(line.start_date) start_dt,line.inv_rule_id inv_rule_id,
7158 nvl(trunc(line.date_terminated - 1),TRUNC(line.end_date)) end_dt,
7159 nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
7160 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
7161 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
7162 FROM okc_k_lines_b line, oks_k_lines_b dtl
7163 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id ;
7164
7165
7166
7167
7168 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
7169 L_BIL_SCH_OUT_TBL OKS_BILL_SCH.ItemBillSch_tbl;
7170 l_inv_id number;
7171
7172 l_Line_Sll_rec l_Line_Sll_Csr%ROWTYPE;
7173 l_Line_Rec l_Line_Csr%Rowtype;
7174
7175
7176 l_index NUMBER;
7177 l_sll_tbl_index NUMBER;
7178 l_timeunit VARCHAR2(20);
7179 l_duration NUMBER;
7180 L_UOM_QUANTITY number;
7181 l_tce_code VARCHAR2(100);
7182
7183 l_msg_list VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
7184
7185
7186
7187 BEGIN
7188
7189 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7190
7191 ---get line details
7192 Open l_Line_Csr;
7193 Fetch l_Line_Csr Into l_Line_Rec;
7194
7195 If l_Line_Csr%Notfound then
7196 Close l_Line_Csr;
7197 x_return_status := 'E';
7198 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
7199 RAISE G_EXCEPTION_HALT_VALIDATION;
7200 End If;
7201 Close l_Line_Csr;
7202
7203
7204 IF l_line_rec.billing_schedule_type <> 'T' then
7205 RETURN;
7206 END IF;
7207
7208 ----make sll tbl
7209
7210 l_index := 1;
7211 l_sll_tbl.DELETE;
7212
7213 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
7214 LOOP
7215 l_sll_tbl(l_index).id := l_Line_SlL_rec.id;
7216 l_sll_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
7217 l_sll_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
7218 l_sll_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
7219 l_sll_tbl(l_index).uom_code := l_Line_SlL_rec.uom_code;
7220 l_sll_tbl(l_index).sequence_no := l_Line_SlL_rec.sequence_no;
7221 l_sll_tbl(l_index).Start_Date := l_Line_SlL_rec.Start_Date;
7222 l_sll_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
7223 l_sll_tbl(l_index).level_periods := l_Line_SlL_rec.level_periods;
7224 l_sll_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
7225 l_sll_tbl(l_index).level_amount := l_Line_SlL_rec.level_amount;
7226 l_sll_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
7227 l_sll_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
7228
7229 l_index := l_index + 1;
7230 END LOOP;
7231
7232
7233 IF l_sll_tbl.COUNT = 0 THEN
7234 x_return_status := 'E';
7235 OKC_API.SET_MESSAGE (
7236 p_app_name => G_PKG_NAME,
7237 p_msg_name => 'OKS_SLL_NOT_EXISTS');
7238
7239 RAISE G_EXCEPTION_HALT_VALIDATION;
7240 END IF;
7241
7242
7243 -----errorout_ad('SLL found');
7244
7245
7246
7247
7248 l_sll_tbl_index := l_sll_tbl.FIRST;
7249
7250 Del_sll_lvlelement(
7251 p_top_line_id => p_top_line_id,
7252 x_return_status => x_return_status,
7253 x_msg_count => x_msg_count,
7254 x_msg_data => x_msg_data);
7255
7256 IF x_return_status <> 'S' THEN
7257 RAISE G_EXCEPTION_HALT_VALIDATION;
7258 END IF;
7259
7260 OKC_TIME_UTIL_PUB.get_duration(
7261 p_start_date => l_line_rec.start_dt,
7262 p_end_date => l_line_rec.end_dt,
7263 x_duration => l_duration,
7264 x_timeunit => l_timeunit,
7265 x_return_status => x_return_status);
7266
7267
7268 IF x_return_status <> 'S' THEN
7269 RAISE G_EXCEPTION_HALT_VALIDATION;
7270 END IF;
7271
7272 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
7273 p_timeunit => l_timeunit,
7274 x_return_status => x_return_status,
7275 x_quantity => l_uom_quantity ,
7276 x_timeunit => l_tce_code);
7277
7278 l_sll_tbl(l_sll_tbl_index).start_date := l_line_rec.start_dt;
7279 l_sll_tbl(l_sll_tbl_index).end_date := l_line_rec.end_dt;
7280 l_sll_tbl(l_sll_tbl_index).level_periods := '1';
7281 l_sll_tbl(l_sll_tbl_index).uom_per_period := l_duration;
7282 l_sll_tbl(l_sll_tbl_index).uom_code := l_timeunit;
7283
7284
7285
7286
7287 IF l_sll_tbl.COUNT > 0 THEN
7288
7289 OKS_BILL_SCH.Create_Bill_Sch_Rules
7290 (p_billing_type => l_line_rec.billing_schedule_type,
7291 p_sll_tbl => l_sll_tbl,
7292 p_invoice_rule_id => l_line_rec.inv_rule_id,
7293 x_bil_sch_out_tbl => l_bil_sch_out_tbl,
7294 x_return_status => x_return_status);
7295
7296 IF x_return_status <> 'S' THEN
7297 RAISE G_EXCEPTION_HALT_VALIDATION;
7298 END IF;
7299 END IF;
7300
7301
7302
7303 EXCEPTION
7304 WHEN G_EXCEPTION_HALT_VALIDATION THEN
7305 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
7306 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.update_om_sll_date.EXCEPTION',
7307 'G_EXCEPTION_HALT_VALIDATION');
7308 END IF;
7309
7310 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
7311 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7312 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
7313 RAISE OKC_API.G_EXCEPTION_ERROR;
7314 END IF;
7315 WHEN OTHERS THEN
7316 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7317 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.update_om_sll_date.UNEXPECTED',
7318 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7319 END IF;
7320
7321 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7322 p_msg_name => G_UNEXPECTED_ERROR,
7323 p_token1 => G_SQLCODE_TOKEN,
7324 p_token1_value => sqlcode,
7325 p_token2 => G_SQLERRM_TOKEN,
7326 p_token2_value => sqlerrm);
7327
7328 x_return_status := G_RET_STS_UNEXP_ERROR;
7329
7330 END Update_OM_SLL_Date;
7331
7332 PROCEDURE Del_rul_elements(p_top_line_id IN NUMBER,
7333 x_return_status OUT NOCOPY VARCHAR2,
7334 x_msg_count OUT NOCOPY NUMBER,
7335 x_msg_data OUT NOCOPY VARCHAR2)
7336
7337 IS
7338
7339
7340 ----will delete all lvlelements for top and cp
7341 ---and delete sll of top line and all cp.
7342 ---make billing schedule type null for all cp.
7343
7344
7345
7346 BEGIN
7347 x_return_status := 'S';
7348
7349
7350 ----delete lvl elements for cp
7351 DELETE FROM OKS_LEVEL_ELEMENTS
7352 WHERE cle_id IN (SELECT cp.id
7353 FROM OKC_k_LINES_B cp
7354 WHERE cp.cle_id = p_top_line_id
7355 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7356
7357
7358 --------delete lvl elemets for top line
7359 DELETE FROM OKS_LEVEL_ELEMENTS
7360 WHERE cle_id = p_top_line_id;
7361
7362
7363 ---delete sll of cp
7364
7365 delete FROM OKS_STREAM_LEVELS_B
7366 WHERE cle_id IN (SELECT id
7367 FROM OKC_k_LINES_B cp
7368 WHERE cp.cle_id = p_top_line_id
7369 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7370
7371 --DELETE sll of top line
7372
7373 delete FROM OKS_STREAM_LEVELS_B
7374 WHERE cle_id = p_top_line_id;
7375
7376 --update billing type to null for cp
7377 UPDATE oks_k_lines_b
7378 set billing_schedule_type = NULL
7379 WHERE cle_id IN (SELECT id
7380 FROM OKC_k_LINES_B cp
7381 WHERE cp.cle_id = p_top_line_id
7382 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7383
7384
7385
7386 EXCEPTION
7387 WHEN OTHERS THEN
7388 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7389 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.del_rul_elements.UNEXPECTED',
7390 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7391 END IF;
7392
7393 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7394 p_msg_name => G_UNEXPECTED_ERROR,
7395 p_token1 => G_SQLCODE_TOKEN,
7396 p_token1_value => sqlcode,
7397 p_token2 => G_SQLERRM_TOKEN,
7398 p_token2_value => sqlerrm);
7399
7400 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7401
7402
7403 END Del_rul_elements;
7404
7405
7406 ---delete sll of subline and refresh the lvl amt of top line for 'Top Level' billing
7407 PROCEDURE Del_subline_lvl_rule(p_top_line_id IN NUMBER,
7408 p_sub_line_id IN NUMBER,
7409 x_return_status OUT NOCOPY VARCHAR2,
7410 x_msg_count OUT NOCOPY NUMBER,
7411 x_msg_data OUT NOCOPY VARCHAR2)
7412 IS
7413 ----will delete all lvlelements for cp
7414 ---and delete sll of cp.
7415 --update amount of lvl element of top line
7416 --UPDATE billing type of subline to null.
7417
7418 CURSOR l_line_BS_csr IS
7419 SELECT id, trunc(date_start) date_start,
7420 amount, TRUNC(DATE_end) date_end, object_version_number
7421 FROM oks_level_elements
7422 WHERE cle_id = p_top_line_id
7423 ORDER BY date_start;
7424
7425 CURSOR l_cp_BS_csr IS
7426 SELECT id, trunc(date_start) date_start,
7427 amount
7428 FROM oks_level_elements
7429 WHERE cle_id = p_sub_line_id
7430 ORDER BY date_start;
7431
7432
7433
7434
7435 CURSOR l_bill_type_csr IS
7436 SELECT nvl(billing_schedule_type,'T') billing_schedule_type
7437 FROM oks_k_lines_b
7438 WHERE cle_id = p_sub_line_id;
7439
7440
7441
7442
7443 l_line_BS_rec l_line_BS_csr%ROWTYPE;
7444 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
7445 l_bill_type_rec l_bill_type_csr%ROWTYPE;
7446
7447
7448
7449 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7450 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7451 x_letv_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7452
7453
7454 i NUMBER := 0;
7455 l_index NUMBER := 0;
7456 l_cp_bs_ind NUMBER;
7457 l_top_bs_ind NUMBER;
7458
7459 l_api_Version Number := 1;
7460 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
7461 l_msg_list VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
7462 l_msg_count Number;
7463 l_msg_data Varchar2(2000) := NULL;
7464
7465 BEGIN
7466 x_return_status := 'S';
7467
7468 ---get bill type details
7469 Open l_bill_type_Csr;
7470 Fetch l_bill_type_Csr Into l_bill_type_Rec;
7471
7472 If l_bill_type_csr%Notfound then
7473 Close l_bill_type_Csr;
7474 x_return_status := 'E';
7475 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'BILLING SCHEDULE TYPE NOT FOUND.');
7476 RAISE G_EXCEPTION_HALT_VALIDATION;
7477 End If;
7478 Close l_bill_type_Csr;
7479
7480 IF l_bill_type_rec.billing_schedule_type = 'T' then
7481
7482 l_index := 0;
7483 l_top_bs_tbl.DELETE;
7484 FOR l_line_BS_rec IN l_line_BS_csr
7485 LOOP
7486 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
7487 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
7488 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
7489 l_top_bs_tbl(l_index).date_end := l_line_BS_rec.date_end;
7490 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
7491
7492 l_index := l_index + 1;
7493 END LOOP;
7494
7495 l_index := 0;
7496 l_cp_bs_tbl.DELETE;
7497 FOR l_cp_BS_rec IN l_cp_BS_csr
7498 LOOP
7499 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
7500 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
7501 l_cp_bs_tbl(l_index).Amount := l_cp_BS_rec.amount;
7502
7503 l_index := l_index + 1;
7504 END LOOP;
7505
7506 IF l_cp_bs_tbl.COUNT > 0 THEN
7507
7508
7509 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
7510 l_top_bs_ind := l_top_bs_tbl.FIRST;
7511
7512 WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > l_top_bs_tbl(l_top_bs_ind).DATE_START
7513 AND l_top_bs_ind < l_top_bs_tbl.LAST
7514 LOOP
7515 l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
7516 END LOOP;
7517
7518
7519
7520
7521 IF l_top_bs_ind = l_top_bs_tbl.first THEN
7522 NULL;
7523
7524 ELSIF l_top_bs_ind <= l_top_bs_tbl.LAST THEN
7525
7526 l_top_bs_ind := l_top_bs_ind - 1;
7527
7528 IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= l_top_bs_tbl(l_top_bs_ind ).DATE_START
7529 AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= l_top_bs_tbl(l_top_bs_ind ).DATE_end THEN
7530
7531 NULL;
7532 ELSE
7533 l_top_bs_ind := l_top_bs_ind + 1;
7534 END IF;
7535
7536 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(l_top_bs_tbl(l_top_bs_ind).DATE_START) THEN
7537 NULL;
7538
7539 end if;
7540
7541
7542
7543
7544 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
7545 LOOP
7546
7547 l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) - nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
7548 exit when (l_top_bs_ind = l_top_bs_tbl.LAST);/*fix for bug 12395037*/
7549 l_top_bs_ind := l_top_bs_ind + 1;
7550 END LOOP;
7551
7552 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
7553 p_api_version => l_api_version,
7554 p_init_msg_list => l_init_msg_list,
7555 x_return_status => x_return_status,
7556 x_msg_count => l_msg_count,
7557 x_msg_data => l_msg_data,
7558 p_letv_tbl => l_top_bs_tbl,
7559 x_letv_tbl => l_lvl_ele_tbl_out);
7560
7561 IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
7562 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7563 ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
7564 RAISE OKC_API.G_EXCEPTION_ERROR;
7565 END IF;
7566
7567 END IF; ---l_cp_bs_tbl.COUNT > 0
7568
7569
7570 END IF; ---l_bill_type = 'T'
7571
7572
7573 ----delete lvl elements for cp
7574 DELETE FROM OKS_LEVEL_ELEMENTS
7575 WHERE cle_id = p_sub_line_id;
7576
7577
7578 ----Delete sll of cp
7579
7580 Delete oks_stream_levels_b
7581 where cle_id = p_sub_line_id;
7582
7583
7584
7585
7586
7587 EXCEPTION
7588 WHEN OTHERS THEN
7589 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7590 p_msg_name => G_UNEXPECTED_ERROR,
7591 p_token1 => G_SQLCODE_TOKEN,
7592 p_token1_value => sqlcode,
7593 p_token2 => G_SQLERRM_TOKEN,
7594 p_token2_value => sqlerrm);
7595
7596 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7597 END Del_subline_lvl_rule;
7598
7599
7600
7601
7602 PROCEDURE update_bs_interface_date(p_top_line_id IN NUMBER,
7603 p_invoice_rule_id IN Number,
7604 x_return_status OUT NOCOPY VARCHAR2,
7605 x_msg_count OUT NOCOPY NUMBER,
7606 x_msg_data OUT NOCOPY VARCHAR2)
7607
7608 IS
7609
7610 CURSOR l_line_csr IS
7611 SELECT ln.id id, ln.lse_id lse_id, nvl(TRUNC(ln.date_terminated -1),ln.end_date) line_end_date,
7612 dtl.usage_type usage_type, dtl.billing_schedule_type billing_schedule_type
7613 FROM okc_k_lines_b ln, oks_k_lines_b dtl
7614 WHERE ln.id = p_top_line_id
7615 AND dtl.cle_id = ln.id;
7616
7617
7618 Cursor l_subLine_Csr Is
7619 SELECT id ,nvl(TRUNC(date_terminated -1),end_date) cp_end_date, lse_id
7620 FROM okc_k_lines_b
7621 WHERE cle_id = p_top_line_id and lse_id in (35,7,8,9,10,11,13,18,25);
7622
7623 CURSOR l_Line_BS_csr IS
7624 SELECT id, trunc(date_start) date_start,
7625 date_to_interface, date_transaction, date_end
7626 FROM oks_level_elements
7627 WHERE cle_id = p_top_line_id
7628 AND date_completed IS NOT NULL
7629 ORDER BY date_start;
7630
7631
7632
7633 l_subLine_rec l_subLine_Csr%ROWTYPE;
7634 l_index NUMBER := 0;
7635 l_update_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7636 l_lvl_index NUMBER := 0;
7637 l_line_rec l_line_csr%ROWTYPE;
7638
7639 l_cp_line_bs oks_bill_level_elements_pvt.letv_tbl_type;
7640 l_line_tbl_in oks_bill_level_elements_pvt.letv_tbl_type;
7641 l_top_index NUMBER := 0;
7642
7643
7644 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
7645
7646 BEGIN
7647
7648 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7649
7650 IF p_invoice_rule_id IS NULL THEN
7651 -- nechatur 23-DEC-2005 for bug#4684706
7652 -- OKC_API.set_message(G_PKG_NAME,'OKS_INVD_COV_RULE','RULE_NAME','IRE');
7653 OKC_API.set_message(G_PKG_NAME,'OKS_INVOICING_RULE');
7654 -- end bug#4684706
7655 x_return_status := 'E';
7656 RAISE G_EXCEPTION_HALT_VALIDATION;
7657 END IF;
7658
7659 OPEN l_line_csr;
7660 FETCH l_line_csr Into l_line_rec;
7661
7662 If l_line_csr%NOTFOUND THEN
7663 CLOSE l_line_csr;
7664 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
7665 x_return_status := G_RET_STS_UNEXP_ERROR;
7666 RETURN;
7667 ELSE
7668 Close l_line_csr;
7669 END IF;
7670
7671 IF l_line_rec.lse_id = 12 AND NVL(l_line_rec.usage_type,1) IN ('VRT','QTY') THEN ---A/P OR A/Q
7672 RETURN;
7673 END IF;
7674
7675 l_lvl_ele_tbl_in.DELETE;
7676
7677 Adjust_interface_date(p_line_id => p_top_line_id,
7678 p_invoice_rule_id => p_invoice_rule_id,
7679 p_line_end_date => l_line_rec.line_end_date,
7680 p_lse_id => l_line_rec.lse_id,
7681 x_bs_tbl => l_update_bs_tbl,
7682 x_return_status => x_return_status,
7683 x_msg_count => x_msg_count,
7684 x_msg_data => x_msg_data);
7685
7686 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7687 RAISE G_EXCEPTION_HALT_VALIDATION;
7688 END IF;
7689
7690 IF l_update_bs_tbl.COUNT <= 0 THEN
7691 RETURN;
7692 END IF;
7693
7694 FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7695 LOOP
7696
7697 l_lvl_ele_tbl_in(l_lvl_index).id := l_update_bs_tbl(l_index).id;
7698 l_lvl_ele_tbl_in(l_lvl_index).date_start := l_update_bs_tbl(l_index).date_start;
7699 l_lvl_ele_tbl_in(l_lvl_index).date_to_interface := l_update_bs_tbl(l_index).date_to_interface;
7700 l_lvl_ele_tbl_in(l_lvl_index).object_version_number := l_update_bs_tbl(l_index).object_version_number;
7701 l_lvl_ele_tbl_in(l_lvl_index).date_to_interface := l_update_bs_tbl(l_index).date_to_interface;
7702 l_lvl_ele_tbl_in(l_lvl_index).date_transaction := l_update_bs_tbl(l_index).date_transaction;
7703
7704
7705 l_lvl_index := l_lvl_index + 1;
7706 END LOOP;
7707
7708 IF l_line_rec.billing_schedule_type = 'P' THEN
7709 ----Find subline and update interface date of sublines level elements
7710
7711 For l_subLine_rec IN l_subLine_csr
7712 LOOP
7713
7714 Adjust_interface_date(
7715 p_line_id => l_subLine_rec.id,
7716 p_invoice_rule_id => p_invoice_rule_id,
7717 p_line_end_date => l_subline_rec.cp_end_date,
7718 p_lse_id => l_subline_rec.lse_id,
7719 x_bs_tbl => l_update_bs_tbl,
7720 x_return_status => x_return_status,
7721 x_msg_count => x_msg_count,
7722 x_msg_data => x_msg_data);
7723
7724 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7725 RAISE G_EXCEPTION_HALT_VALIDATION;
7726 END IF;
7727
7728 IF l_update_bs_tbl.COUNT > 0 THEN
7729
7730 FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7731 LOOP
7732
7733 l_lvl_ele_tbl_in(l_lvl_index).id := l_update_bs_tbl(l_index).id;
7734 l_lvl_ele_tbl_in(l_lvl_index).date_start := l_update_bs_tbl(l_index).date_start;
7735 l_lvl_ele_tbl_in(l_lvl_index).date_to_interface := l_update_bs_tbl(l_index).date_to_interface;
7736 l_lvl_ele_tbl_in(l_lvl_index).object_version_number := l_update_bs_tbl(l_index).object_version_number;
7737
7738 l_lvl_index := l_lvl_index + 1;
7739 END LOOP;
7740
7741 END IF; ---- l_update_bs_tbl.COUNT > 0
7742
7743 END LOOP; ----subline csr
7744
7745 ELSE ----billing type E and T
7746
7747 ---interface/trx dt should be same for cp and top line. build tbl for billed lvl_element for top line
7748 ---and merge tbl with not billed. as some of the cp may be added later which are not billed yet.
7749
7750 l_top_index := 1;
7751 l_line_tbl_in.DELETE;
7752
7753 ---billed top line lvl element
7754
7755 FOR l_Line_BS_rec IN l_Line_BS_csr
7756 LOOP
7757
7758 l_line_tbl_in(l_top_index).id := l_Line_BS_rec.id;
7759 l_line_tbl_in(l_top_index).date_start := l_Line_BS_rec.date_start;
7760 l_line_tbl_in(l_top_index).date_to_interface := l_Line_BS_rec.date_to_interface;
7761 l_line_tbl_in(l_top_index).date_transaction := l_Line_BS_rec.date_transaction;
7762
7763 l_top_index := l_top_index + 1;
7764 END LOOP;
7765
7766 ----unbilled lvl element for top line added to l_line_tbl_in
7767 FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7768 LOOP
7769
7770 l_line_tbl_in(l_top_index).id := l_update_bs_tbl(l_index).id;
7771 l_line_tbl_in(l_top_index).date_start := l_update_bs_tbl(l_index).date_start;
7772 l_line_tbl_in(l_top_index).date_to_interface := l_update_bs_tbl(l_index).date_to_interface;
7773 l_line_tbl_in(l_top_index).date_transaction := l_update_bs_tbl(l_index).date_transaction;
7774
7775 l_top_index := l_top_index + 1;
7776 END LOOP;
7777
7778
7779 For l_subLine_rec IN l_subLine_csr
7780 LOOP
7781
7782 Adjust_cp_trx_inv_dt(
7783 p_top_bs_tbl => l_line_tbl_in,
7784 p_SubLine_id => l_subLine_rec.id,
7785 x_cp_line_bs => l_cp_line_bs,
7786 x_return_status => x_return_status);
7787
7788 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7789 RAISE G_EXCEPTION_HALT_VALIDATION;
7790 END IF;
7791
7792 IF l_cp_line_bs.COUNT > 0 THEN
7793
7794 FOR L_index IN l_cp_line_bs.FIRST .. l_cp_line_bs.LAST
7795 LOOP
7796
7797 l_lvl_ele_tbl_in(l_lvl_index).id := l_cp_line_bs(l_index).id;
7798 l_lvl_ele_tbl_in(l_lvl_index).date_start := l_cp_line_bs(l_index).date_start;
7799 l_lvl_ele_tbl_in(l_lvl_index).date_to_interface := l_cp_line_bs(l_index).date_to_interface;
7800 l_lvl_ele_tbl_in(l_lvl_index).date_transaction := l_cp_line_bs(l_index).date_transaction;
7801 l_lvl_ele_tbl_in(l_lvl_index).object_version_number := l_cp_line_bs(l_index).object_version_number;
7802
7803 l_lvl_index := l_lvl_index + 1;
7804 END LOOP;
7805
7806 END IF; ---- l_cp_line_bs.COUNT > 0
7807
7808 END LOOP; ----subline csr
7809
7810 END IF; ---chk billing schedule type
7811
7812
7813
7814 -----errorout_ad('l_lvl_ele_tbl_in.COUNT = ' || l_lvl_ele_tbl_in.COUNT );
7815
7816 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
7817 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
7818 p_api_version => l_api_version,
7819 p_init_msg_list => l_init_msg_list,
7820 x_return_status => x_return_status,
7821 x_msg_count => x_msg_count,
7822 x_msg_data => x_msg_data,
7823 p_letv_tbl => l_lvl_ele_tbl_in,
7824 x_letv_tbl => l_lvl_ele_tbl_out);
7825
7826 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7827 RAISE G_EXCEPTION_HALT_VALIDATION;
7828 END IF;
7829 END IF;
7830
7831
7832 EXCEPTION
7833 WHEN G_EXCEPTION_HALT_VALIDATION THEN
7834 NULL;
7835
7836 WHEN OTHERS THEN
7837 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7838 p_msg_name => G_UNEXPECTED_ERROR,
7839 p_token1 => G_SQLCODE_TOKEN,
7840 p_token1_value => sqlcode,
7841 p_token2 => G_SQLERRM_TOKEN,
7842 p_token2_value => sqlerrm);
7843
7844 x_return_status := G_RET_STS_UNEXP_ERROR;
7845
7846
7847 END update_bs_interface_date;
7848
7849
7850 Procedure Adjust_interface_date(p_line_id IN NUMBER,
7851 p_invoice_rule_id IN Number,
7852 p_line_end_date IN DATE,
7853 p_lse_id IN NUMBER,
7854 x_bs_tbl OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
7855 x_return_status OUT NOCOPY VARCHAR2,
7856 x_msg_count OUT NOCOPY NUMBER,
7857 x_msg_data OUT NOCOPY VARCHAR2)
7858 IS
7859
7860
7861
7862
7863 Cursor l_Line_SLL_CSR(l_line_id NUMBER) is
7864 SELECT id, cle_id, chr_id, dnz_chr_id , uom_code,
7865 sequence_no, Start_Date, end_Date, level_periods,
7866 uom_per_period, level_amount, invoice_offset_days, interface_offset_days
7867 FROM OKS_STREAM_LEVELS_B
7868 WHERE cle_id = l_line_id
7869 ORDER BY sequence_no;
7870
7871 CURSOR l_lvl_element_csr(l_sll_id NUMBER) IS
7872 SELECT id,date_start, date_end, date_to_interface,
7873 date_transaction , object_version_number
7874 FROM oks_level_elements
7875 WHERE rul_id = l_sll_id AND date_completed IS NULL
7876 ORDER BY date_start;
7877
7878
7879
7880 l_Line_SLL_rec l_Line_SLL_csr%ROWTYPE;
7881 l_lvl_element_rec l_lvl_element_csr%ROWTYPE;
7882
7883
7884 l_index NUMBER := 0;
7885 l_bs_index NUMBER := 0;
7886 l_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7887 l_sll_end_date DATE;
7888 l_interface_offset NUMBER;
7889 l_date_to_interface DATE;
7890 l_out_index NUMBER := 0;
7891
7892 l_action_offset NUMBER;
7893 l_date_transaction DATE;
7894
7895 BEGIN
7896
7897 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7898
7899
7900 For l_Line_SLL_rec IN l_Line_SLL_csr(p_line_id)
7901 LOOP
7902
7903 l_bs_index := 0;
7904 l_bs_tbl.delete;
7905
7906 IF l_line_SLL_rec.end_date IS NOT NULL THEN
7907
7908 l_sll_end_date := l_line_SLL_rec.end_date;
7909 ELSE
7910 l_sll_end_date := OKC_TIME_UTIL_PUB.get_enddate(
7911 l_Line_SlL_rec.Start_Date,
7912 l_Line_SlL_rec.UOM_CODE,
7913 l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
7914 END IF;
7915
7916
7917
7918
7919 FOR l_lvl_element_rec IN l_lvl_element_csr(l_Line_SLL_rec.id)
7920 LOOP
7921 l_bs_tbl(l_bs_index).id := l_lvl_element_rec.id;
7922 l_bs_tbl(l_bs_index).date_start := l_lvl_element_rec.date_start;
7923 l_bs_tbl(l_bs_index).date_end := l_lvl_element_rec.date_end;
7924 l_bs_tbl(l_bs_index).date_to_interface := l_lvl_element_rec.date_to_interface;
7925 l_bs_tbl(l_bs_index).date_transaction := l_lvl_element_rec.date_transaction;
7926 l_bs_tbl(l_bs_index).object_version_number := l_lvl_element_rec.object_version_number;
7927
7928 -----errorout_ad('before date_to_interface = ' || l_bs_tbl(l_bs_index).date_to_interface);
7929
7930 l_bs_index := l_bs_index + 1;
7931
7932 END LOOP;
7933
7934 IF l_bs_tbl.COUNT > 0 THEN
7935
7936
7937 l_interface_offset := NVL(TO_NUMBER(l_Line_SLL_rec.interface_offset_days),0);
7938 l_action_offset := NVL(TO_NUMBER(l_Line_SLL_rec.invoice_offset_days),0);
7939
7940 FOR l_index IN l_bs_tbl.FIRST .. l_bs_tbl.LAST
7941 LOOP
7942
7943 ---calculate trx date
7944
7945 If nvl(p_invoice_rule_id,-2) = -2 Then
7946
7947 l_date_transaction := l_bs_tbl(l_index).date_start + l_action_offset;
7948
7949 If l_date_transaction < SYSDATE Then
7950 l_date_transaction := SYSDATE;
7951 End if;
7952
7953 Elsif nvl(p_invoice_rule_id,-2) = -3 Then
7954
7955 IF l_bs_tbl(l_index ).date_end IS NOT NULL THEN
7956
7957 l_date_transaction := l_bs_tbl(l_index ).date_end + l_action_offset;
7958
7959 ELSE ---end dt null for migrated contracts
7960
7961 IF l_index < l_bs_tbl.LAST THEN
7962 l_date_transaction := (l_bs_tbl(l_index + 1).date_start - 1 ) + l_action_offset;
7963 ELSE ---not last
7964 IF p_lse_id <> 46 THEN
7965 l_date_transaction := LEAST(l_sll_end_date, p_line_end_date ) + l_action_offset;
7966 ELSE
7967 l_date_transaction := okc_time_util_pub.get_enddate
7968 (l_bs_tbl(l_index).date_start,
7969 l_Line_SLL_rec.uom_code,
7970 l_Line_SLL_rec.uom_per_period) + l_action_offset;
7971 END IF; ---chk for 46
7972 END IF; ---chk for last
7973
7974 END IF; ---end date null chk
7975
7976 ----l_date_transaction SHOULD not be less then bill from date and sysdate.
7977 IF l_date_transaction < l_bs_tbl(l_index).date_start THEN
7978 l_date_transaction := l_bs_tbl(l_index).date_start ;
7979 END IF;
7980
7981 If l_date_transaction < SYSDATE Then
7982 l_date_transaction := SYSDATE;
7983 End if;
7984
7985 End if; --chk for advance for trx date
7986
7987
7988
7989 ---calculate inv date
7990
7991 If nvl(p_invoice_rule_id,-2) = -2 Then /*** advance ***/
7992
7993 l_date_to_interface := l_bs_tbl(l_index).date_start + NVL(l_interface_offset,0);
7994
7995 IF l_date_to_interface > LEAST(l_date_transaction, l_bs_tbl(l_index).date_start) Then
7996
7997 l_date_to_interface := LEAST(l_date_transaction, l_bs_tbl(l_index).date_start);
7998 End if;
7999
8000 ELSIF nvl(p_invoice_rule_id,-2) = -3 Then
8001
8002 IF l_index <> l_bs_tbl.LAST THEN
8003
8004 IF l_bs_tbl(l_index ).date_end IS NULL THEN
8005 l_date_to_interface := l_bs_tbl(l_index + 1).date_start + NVL(l_interface_offset,0); /** Bill to date + 1 ***/
8006 ELSE
8007
8008 l_date_to_interface := l_bs_tbl(l_index ).date_end + 1 + NVL(l_interface_offset,0); /** Bill to date + 1 ***/
8009 END IF;
8010
8011 ELSE
8012
8013 IF l_sll_end_date > p_line_end_date THEN
8014 l_date_to_interface := p_line_end_date + 1 + NVL(l_interface_offset,0);
8015 ELSE
8016 l_date_to_interface := l_sll_end_date + 1 + NVL(l_interface_offset,0);
8017 END IF;
8018 END IF;
8019 END IF; ---end of advance/arrears for inv
8020
8021 ------Assign interface date in tbl
8022 IF l_date_to_interface IS NOT NULL THEN
8023 l_bs_tbl(l_index).date_to_interface := l_date_to_interface;
8024 END IF;
8025
8026 IF l_date_to_interface IS NOT NULL THEN
8027 l_bs_tbl(l_index).date_transaction := l_date_transaction;
8028 END IF;
8029
8030 x_bs_tbl(l_out_index).id := l_bs_tbl(l_index).id ;
8031 x_bs_tbl(l_out_index).date_start := l_bs_tbl(l_index).date_start ;
8032 x_bs_tbl(l_out_index).date_end := l_bs_tbl(l_index).date_end ;
8033 x_bs_tbl(l_out_index).date_to_interface := TRUNC(l_bs_tbl(l_index).date_to_interface);
8034 x_bs_tbl(l_out_index).object_version_number := l_bs_tbl(l_index).object_version_number;
8035 x_bs_tbl(l_out_index).date_transaction := TRUNC(l_bs_tbl(l_index).date_transaction);
8036
8037 l_out_index := l_out_index + 1;
8038 END LOOP;
8039
8040
8041 END IF; ---end of l_bs_tbl.COUNT > 0
8042 END LOOP; ----SLL CSR
8043
8044
8045 EXCEPTION
8046
8047 WHEN OTHERS THEN
8048 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
8049 p_msg_name => G_UNEXPECTED_ERROR,
8050 p_token1 => G_SQLCODE_TOKEN,
8051 p_token1_value => sqlcode,
8052 p_token2 => G_SQLERRM_TOKEN,
8053 p_token2_value => sqlerrm);
8054
8055 x_return_status := G_RET_STS_UNEXP_ERROR;
8056 END Adjust_interface_date;
8057
8058
8059 Procedure Cascade_Dt_lines_SLL
8060 (
8061 p_contract_id IN NUMBER,
8062 p_line_id IN NUMBER,
8063 x_return_status OUT NOCOPY Varchar2)
8064
8065 IS
8066
8067 CURSOR l_top_line_Csr Is
8068 SELECT id
8069 FROM OKC_K_LINES_b
8070 WHERE chr_id = p_contract_id
8071 AND lse_id IN (1, 12, 14, 19, 46);
8072
8073 l_top_line_rec l_top_line_Csr%ROWTYPE;
8074 l_msg_count NUMBER;
8075 l_msg_data VARCHAR2(2000);
8076
8077 BEGIN
8078
8079 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8080
8081
8082 IF p_line_id IS NOT NULL THEN
8083 oks_bill_sch.Cascade_Dates_SLL
8084 (
8085 p_top_line_id => p_line_id,
8086 x_return_status => x_return_status,
8087 x_msg_count => l_msg_count,
8088 x_msg_data => l_msg_data);
8089
8090 ELSIF p_contract_id IS NOT NULL THEN
8091
8092 FOR l_top_line_rec IN l_top_line_Csr
8093 LOOP
8094
8095 oks_bill_sch.Cascade_Dates_SLL
8096 (
8097 p_top_line_id => l_top_line_rec.id,
8098 x_return_status => x_return_status,
8099 x_msg_count => l_msg_count,
8100 x_msg_data => l_msg_data);
8101 END LOOP;
8102 END IF;
8103
8104 EXCEPTION
8105 WHEN G_EXCEPTION_HALT_VALIDATION THEN
8106 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8107 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8108 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8109 RAISE OKC_API.G_EXCEPTION_ERROR;
8110 END IF;
8111 WHEN OTHERS THEN
8112 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
8113 p_msg_name => G_UNEXPECTED_ERROR,
8114 p_token1 => G_SQLCODE_TOKEN,
8115 p_token1_value => sqlcode,
8116 p_token2 => G_SQLERRM_TOKEN,
8117 p_token2_value => sqlerrm);
8118
8119 x_return_status := G_RET_STS_UNEXP_ERROR;
8120 END Cascade_Dt_lines_SLL;
8121
8122 -------------------------------------------------------------------------
8123 -- Partial period computation logic
8124 -- Developer Mani Choudhary
8125 -- Date 09-MAY-2005
8126 -------------------------------------------------------------------------
8127 PROCEDURE Create_Subcription_LvlEle
8128 (p_billing_type IN VARCHAR2,
8129 p_sll_tbl IN StrmLvl_Out_tbl,
8130 p_line_rec IN Line_Det_Type,
8131 p_term_dt IN DATE,
8132 p_invoice_ruleid IN Number,
8133 p_period_start IN VARCHAR2,
8134 p_period_type IN VARCHAR2,
8135 x_return_status OUT NOCOPY Varchar2)
8136
8137 IS
8138
8139 CURSOR l_subcription_amt_csr(p_line_id NUMBER, p_term_dt DATE) IS
8140 SELECT nvl(SUM(amount) ,0) sub_amt
8141 FROM OKS_SUBSCR_ELEMENTS
8142 WHERE dnz_cle_id = p_line_id;
8143
8144 ----commented for bug#3222008.terminate program first call recreate fulfillemt schedule so
8145 ----take amt from rest of fulfillemt sch.
8146 --- AND TRUNC(start_date) < TRUNC(p_term_dt);
8147
8148
8149 l_subcription_amt_rec l_subcription_amt_csr%ROWTYPE;
8150
8151
8152
8153
8154 l_tangible BOOLEAN;
8155 l_line_sll_counter Number;
8156 l_period_counter Number;
8157 l_next_cycle_dt Date;
8158
8159 l_line_end_date date;
8160 l_line_amt NUMBER;
8161
8162 l_adjusted_amt NUMBER;
8163 l_lvl_loop_counter NUMBER;
8164 l_last_cycle_dt Date;
8165 l_bill_sch_amt NUMBER := 0;
8166 l_tbl_seq NUMBER;
8167 l_uom_quantity NUMBER;
8168 l_tce_code VARCHAR2(100);
8169 L_CONSTANT_SLL_AMT NUMBER;
8170 l_remaining_amt NUMBER;
8171 L_SLL_AMT NUMBER;
8172 l_dummy_top_line_bs oks_bill_level_elements_pvt.letv_tbl_type;
8173 l_bill_type VARCHAR2(10);
8174
8175 --
8176 l_api_version CONSTANT NUMBER := 1.0;
8177 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
8178 l_return_status VARCHAR2(10);
8179 l_msg_count NUMBER;
8180 l_msg_data VARCHAR2(2000);
8181 l_msg_index_out NUMBER;
8182 l_msg_index NUMBER;
8183 -- Start - Added by PMALLARA - Bug #3992530
8184 Lvl_Element_cnt Number := 0;
8185 Strm_Start_Date Date;
8186 -- End - Added by PMALLARA - Bug #3992530
8187 -------------------------------------------------------------------------
8188 -- Partial period computation logic
8189 -- Developer Mani Choudhary
8190 -- Date 09-MAY-2005
8191 -------------------------------------------------------------------------
8192 l_pricing_method Varchar2(30);
8193 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
8194 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
8195 BEGIN
8196
8197 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8198
8199 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_line_rec.id);
8200
8201
8202
8203 l_lvl_ele_tbl_in.delete;
8204 l_tbl_seq := 1;
8205 l_line_end_date := p_line_rec.line_end_dt; ---termination dt
8206 l_line_sll_counter := p_sll_tbl.FIRST;
8207
8208 IF p_term_dt IS NULL THEN
8209 l_line_end_date := p_line_rec.line_end_dt;
8210 ELSE
8211 l_line_end_date := p_term_dt;
8212 END IF;
8213
8214
8215 IF l_tangible THEN ----item is tangible (have fulfillment schedule)
8216
8217 -----errorout_ad('l_tangible = true');
8218
8219 OPEN l_subcription_amt_csr(p_line_rec.id,l_line_end_date) ;
8220 FETCH l_subcription_amt_csr INTO l_subcription_amt_rec;
8221
8222 If l_subcription_amt_csr%NOTFOUND THEN
8223 l_line_amt := 0;
8224 CLOSE l_subcription_amt_csr;
8225 ELSE
8226 l_line_amt := l_subcription_amt_rec.sub_amt;
8227 Close l_subcription_amt_csr;
8228 END IF;
8229 ---l_line_amt := 400;
8230
8231 -------------------------------------------------------------------------
8232 -- Partial period computation logic
8233 -- Developer Mani Choudhary
8234 -- Date 09-MAY-2005
8235 -- For tangible only service start will be honored
8236 -------------------------------------------------------------------------
8237 l_period_start := NULL;
8238 l_period_type := NULL;
8239
8240 ELSE ----false
8241
8242 -----errorout_ad('l_tangible = false');
8243 l_line_amt := OKS_SUBSCRIPTION_PUB.subs_termn_amount
8244 ( p_cle_id => p_line_rec.id,
8245 p_termn_date => l_line_end_date ) ;
8246
8247 IF l_line_amt IS NULL THEN
8248 l_line_amt := 0;
8249 END IF;
8250
8251 -------------------------------------------------------------------------
8252 -- Partial period computation logic
8253 -- Developer Mani Choudhary
8254 -- Date 09-MAY-2005
8255 -- If intangible and if the profile option OKS_SUBS_PRICING_METHO is subscription based
8256 -- then period start should be NULL and period type should also be NULL
8257 -- otherwise period start should be 'SERVICE' and period type will be whatever is set at GCD
8258 -------------------------------------------------------------------------
8259 --mchoudha fix for bug#5183011
8260 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
8261 if nvl(l_pricing_method,'SUBSCRIPTION') = 'EFFECTIVITY' then
8262 l_period_start := 'SERVICE';
8263 else
8264 l_period_start := NULL;
8265 l_period_type := NULL;
8266 -- l_line_amt := p_line_rec.line_amt - l_line_amt;
8267 END IF;
8268
8269 END IF;
8270 -----errorout_ad('LINE AMT = ' || l_line_amt);
8271
8272
8273 IF l_header_billing IS NULL THEN
8274
8275 Delete_lvl_element(p_cle_id => p_line_rec.id,
8276 x_return_status => x_return_status);
8277
8278 -----errorout_ad('Delete_lvl_element status = ' || x_return_status);
8279
8280 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8281 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8282 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8283 RAISE OKC_API.G_EXCEPTION_ERROR;
8284 END IF;
8285 END IF;
8286
8287 IF p_line_rec.line_start_dt >= nvl(p_term_dt,l_line_end_date) AND l_line_amt = 0 THEN ---if line terminated on the same dt.
8288 x_return_status := 'S';
8289 RETURN;
8290 END IF;
8291
8292 l_bill_type := p_billing_type;
8293
8294
8295
8296 LOOP ---sll rule loop
8297 -----errorout_ad('sll rule start date : '||to_char(p_line_rec.line_start_dt));
8298
8299 IF l_header_billing IS NOT NULL THEN ----hdr lvl billing no old sll and lvl elements
8300 l_next_cycle_dt := p_sll_tbl(l_line_sll_counter).dt_start;
8301 l_lvl_loop_counter := 1;
8302 l_period_counter := 1;
8303
8304 ELSE
8305
8306 Check_Existing_Lvlelement(
8307 p_sll_id =>p_sll_tbl(l_line_sll_counter).id,
8308 p_sll_dt_start =>p_sll_tbl(l_line_sll_counter).dt_start,
8309 p_uom => null,
8310 p_uom_per_period => null,
8311 p_cp_end_dt => null,
8312 x_next_cycle_dt => l_next_cycle_dt,
8313 x_last_cycle_dt => l_last_cycle_dt,
8314 x_period_counter => l_period_counter,
8315 x_sch_amt => l_bill_sch_amt,
8316 x_top_line_bs => l_dummy_top_line_bs,
8317 x_return_status => x_return_status);
8318
8319 -----errorout_ad('LEVEL ELEMENT COUNTER = ' || TO_CHAR(l_period_counter));
8320 -----errorout_ad('LEVEL ELEMENT START DATE = ' || to_char(l_next_cycle_dt));
8321
8322 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8323 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8324 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8325 RAISE OKC_API.G_EXCEPTION_ERROR;
8326 END IF;
8327 l_lvl_loop_counter := l_period_counter;
8328 END IF;
8329
8330 IF l_period_counter > to_number(p_sll_tbl(l_line_sll_counter).level_period) THEN
8331 ---It will not insert record in lvl ele for recent sll
8332
8333 IF l_line_sll_counter + 1 <= p_sll_tbl.LAST THEN
8334 l_next_cycle_dt := p_sll_tbl(l_line_sll_counter + 1).dt_start;
8335 ELSE
8336
8337 l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
8338 (p_sll_tbl(l_line_sll_counter).dt_start,
8339 p_sll_tbl(l_line_sll_counter).uom,
8340 (p_sll_tbl(l_line_sll_counter).uom_Per_Period *
8341 p_sll_tbl(l_line_sll_counter).level_period));
8342
8343 l_next_cycle_dt := l_next_cycle_dt + 1;
8344 END IF;
8345
8346 ELSE
8347
8348 -----errorout_ad('last date = ' || TO_CHAR(l_last_cycle_dt));
8349 -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom);
8350 -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom_Per_Period);
8351 IF L_next_cycle_dt IS null THEN
8352
8353
8354 L_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
8355 (l_last_cycle_dt,
8356 p_sll_tbl(l_line_sll_counter).uom,
8357 p_sll_tbl(l_line_sll_counter).uom_Per_Period);
8358
8359 -----errorout_ad('next_cycle_date = ' || to_char(l_next_cycle_dt));
8360
8361 l_next_cycle_dt := l_next_cycle_dt + 1;
8362 END IF;
8363
8364
8365 IF l_bill_type = 'T' THEN
8366 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
8367 p_timeunit => p_sll_tbl(l_line_sll_counter).uom,
8368 x_return_status => x_return_status,
8369 x_quantity => l_uom_quantity ,
8370 x_timeunit => l_tce_code);
8371
8372 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
8373 RAISE G_EXCEPTION_HALT_VALIDATION;
8374 END IF;
8375
8376 l_remaining_amt := l_line_amt - nvl(l_bill_sch_amt,0);
8377
8378 Get_Constant_sll_Amount(p_line_start_date => p_line_rec.line_start_dt,
8379 p_line_end_date => l_line_end_date,
8380 p_cycle_start_date => l_next_cycle_dt,
8381 p_remaining_amount => l_remaining_amt,
8382 P_uom_quantity => l_uom_quantity,
8383 P_tce_code => l_tce_code,
8384 x_constant_sll_amt => l_constant_sll_amt,
8385 x_return_status => x_return_status);
8386
8387 -----errorout_ad('Get_Constant_sll_Amount = ' || x_return_status);
8388
8389 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
8390 RAISE G_EXCEPTION_HALT_VALIDATION;
8391 END IF;
8392 END IF; ----end of bill type = 'T'
8393
8394 IF l_line_amt <= nvl(l_bill_sch_amt,0) AND l_bill_type = 'E' THEN
8395 NULL;
8396 ELSE
8397
8398
8399 -- Start - Added by PMALLARA - Bug #3992530
8400 Lvl_Element_cnt := l_period_counter - 1;
8401 Strm_Start_Date := p_sll_tbl(l_line_sll_counter).dt_start;
8402 LOOP -------------for level elements of one rule
8403 Lvl_Element_cnt := Lvl_Element_cnt + 1;
8404 -- End - Added by PMALLARA - Bug #3992530
8405
8406 l_fnd_lvl_in_rec.line_start_date := p_line_rec.line_start_dt;
8407 l_fnd_lvl_in_rec.line_end_date := l_line_end_date;
8408 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
8409 -- Start - Modified by PMALLARA - Bug #3992530
8410 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * p_sll_tbl(l_line_sll_counter).uom_Per_Period;
8411 -- End - Modified by PMALLARA - Bug #3992530
8412 l_fnd_lvl_in_rec.tuom := p_sll_tbl(l_line_sll_counter).uom;
8413 l_fnd_lvl_in_rec.total_amount := 0;
8414 l_fnd_lvl_in_rec.invoice_offset_days := p_sll_tbl(l_line_sll_counter).invoice_offset_days;
8415 l_fnd_lvl_in_rec.interface_offset_days := p_sll_tbl(l_line_sll_counter).Interface_offset_days;
8416 l_fnd_lvl_in_rec.bill_type := 'S'; ---passed 'S' for subcription terminated line.
8417 --mchoudha added this parameter
8418 l_fnd_lvl_in_rec.uom_per_period := p_sll_tbl(l_line_sll_counter).uom_Per_Period;
8419
8420 -------------------------------------------------------------------------
8421 -- Begin partial period computation logic
8422 -- Developer Mani Choudhary
8423 -- Date 09-MAY-2005
8424 -- Added two new parameters p_period_start and p_period_type
8425 -------------------------------------------------------------------------
8426 -- Start - Modified by PMALLARA - Bug #3992530
8427 OKS_BILL_UTIL_PUB.Get_next_bill_sch
8428 (p_api_version => l_api_version,
8429 x_return_status => x_return_status,
8430 x_msg_count => l_msg_count,
8431 x_msg_data => l_msg_data,
8432 p_invoicing_rule_id => p_invoice_ruleid,
8433 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
8434 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
8435 p_period_start => l_period_start,
8436 p_period_type => p_period_type,
8437 Strm_Start_Date => Strm_Start_Date);
8438 -- End - Modified by PMALLARA - Bug #3992530
8439
8440 -----errorout_ad('LEVEL ELEMENT NEXT CYCLE DATE passed from Get_next_bill_sch = ' || TO_CHAR(l_fnd_lvl_out_rec.next_cycle_date));
8441
8442 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8443 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
8444 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8445 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8446 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
8447 RAISE OKC_API.G_EXCEPTION_ERROR;
8448 END IF;
8449
8450
8451
8452 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt then
8453 null; ---donot insert record in level element
8454 ELSE
8455 l_lvl_ele_tbl_in(l_tbl_seq).sequence_number := to_char(l_period_counter);
8456 l_lvl_ele_tbl_in(l_tbl_seq).cle_id := p_line_rec.id;
8457 l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id := p_line_rec.id;
8458 l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id := p_line_rec.dnz_chr_id;
8459
8460 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(l_next_cycle_dt);
8461 l_lvl_ele_tbl_in(l_tbl_seq).date_end := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
8462
8463
8464 IF l_bill_type = 'T' then
8465 --calculated sll amount
8466 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_constant_sll_amt,l_currency_code );
8467
8468 ELSE ----for E and P
8469 ---sll amt entered by user
8470
8471 l_sll_amt := TO_NUMBER(p_sll_tbl(l_line_sll_counter).amount);
8472 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt,l_currency_code );
8473 END IF;
8474
8475
8476 l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl := l_fnd_lvl_out_rec.date_recievable_gl;
8477 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := TRUNC(l_fnd_lvl_out_rec.date_transaction);
8478 l_lvl_ele_tbl_in(l_tbl_seq).date_due := l_fnd_lvl_out_rec.date_due;
8479 l_lvl_ele_tbl_in(l_tbl_seq).date_print := l_fnd_lvl_out_rec.date_print;
8480 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
8481 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
8482 l_lvl_ele_tbl_in(l_tbl_seq).rul_id := p_sll_tbl(l_line_sll_counter).id;
8483
8484 l_lvl_ele_tbl_in(l_tbl_seq).object_version_number := OKC_API.G_MISS_NUM;
8485 l_lvl_ele_tbl_in(l_tbl_seq).created_by := OKC_API.G_MISS_NUM;
8486 l_lvl_ele_tbl_in(l_tbl_seq).creation_date := SYSDATE;
8487 l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by := OKC_API.G_MISS_NUM;
8488 l_lvl_ele_tbl_in(l_tbl_seq).last_update_date := SYSDATE;
8489
8490
8491 -----errorout_ad ('Amount for line lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
8492
8493 l_period_counter := l_period_counter + 1;
8494 l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
8495 l_tbl_seq := l_tbl_seq + 1;
8496 END IF; -----end if for level element creation
8497
8498 l_next_cycle_dt := l_fnd_lvl_out_rec.next_cycle_date;
8499
8500 IF l_bill_type = 'T' then
8501
8502 EXIT WHEN (l_lvl_loop_counter = p_sll_tbl(l_line_sll_counter).level_period) OR
8503 (TRUNC(l_next_cycle_dt) > l_line_end_date);
8504 ELSE ---'E'
8505 EXIT WHEN (l_line_amt <= l_bill_sch_amt) OR
8506 (l_lvl_loop_counter = p_sll_tbl(l_line_sll_counter).level_period) ;
8507 END IF;
8508
8509 l_lvl_loop_counter := l_lvl_loop_counter + 1;
8510
8511 END LOOP; ---loop for sll period counter
8512 END IF; ----l_line_amt <= nvl(l_bill_sch_amt,0) AND l_bill_type = 'E'
8513
8514 END IF; ----Period counter checking before entering in loop for lvlelement
8515
8516
8517
8518 IF l_bill_type = 'T' then
8519 EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
8520 (TRUNC(l_next_cycle_dt) > l_line_end_date);
8521 ELSE ---'E'
8522 EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
8523 (l_line_amt <= l_bill_sch_amt);
8524
8525 END IF; ---End of 'T'
8526 l_line_sll_counter := p_sll_tbl.NEXT(l_line_sll_counter);
8527
8528 END LOOP; -----loop for sll lines
8529
8530 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
8531
8532 IF l_line_amt < l_bill_sch_amt THEN
8533 --adjust the last lvl elemnt amt
8534
8535 l_adjusted_amt := (l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount) - (l_bill_sch_amt - l_line_amt);
8536 l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount := l_adjusted_amt;
8537
8538 ELSIF l_line_amt > l_bill_sch_amt THEN
8539 --adjust the last lvl elemnt amt
8540
8541 l_adjusted_amt := (l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount) + (l_line_amt - l_bill_sch_amt);
8542 l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount := l_adjusted_amt;
8543 END IF;
8544
8545 OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
8546 p_api_version => l_api_version,
8547 p_init_msg_list => l_init_msg_list,
8548 x_return_status => x_return_status,
8549 x_msg_count => l_msg_count,
8550 x_msg_data => l_msg_data,
8551 p_letv_tbl => l_lvl_ele_tbl_in,
8552 x_letv_tbl => l_lvl_ele_tbl_out);
8553
8554 -----errorout_ad('LEVEL ELEMENT INSERT STATUS FOR SUBLINE = ' || x_return_status);
8555
8556
8557 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8558 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for sub line = ' || l_msg_data);
8559 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8560 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8561 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for sub line = ' || l_msg_data);
8562 RAISE OKC_API.G_EXCEPTION_ERROR;
8563 END IF;
8564 END IF;
8565
8566
8567 EXCEPTION
8568 WHEN OTHERS THEN
8569 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
8570 p_msg_name => G_UNEXPECTED_ERROR,
8571 p_token1 => G_SQLCODE_TOKEN,
8572 p_token1_value => sqlcode,
8573 p_token2 => G_SQLERRM_TOKEN,
8574 p_token2_value => sqlerrm);
8575
8576 x_return_status := G_RET_STS_UNEXP_ERROR;
8577 END Create_Subcription_LvlEle;
8578
8579 Procedure Create_Subcription_bs
8580 (
8581 p_top_line_id IN NUMBER,
8582 p_full_credit IN VARCHAR2,
8583 x_return_status OUT NOCOPY Varchar2,
8584 x_msg_count OUT NOCOPY NUMBER,
8585 x_msg_data OUT NOCOPY VARCHAR2)
8586
8587 IS
8588
8589 CURSOR l_line_sll_csr IS
8590 SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
8591 uom_per_period, uom_code, TRUNC(end_date) end_date,
8592 interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
8593 chr_id, level_amount
8594 FROM OKS_STREAM_LEVELS_B
8595 WHERE cle_id = p_top_line_id
8596 ORDER BY sequence_no;
8597
8598
8599
8600 Cursor l_Line_Csr Is
8601 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
8602 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
8603 TRUNC(line.date_terminated) line_term_dt, line.inv_rule_id inv_rule_id,
8604 nvl(dtl.billing_schedule_type,'E') billing_schedule_type,
8605 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
8606 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
8607 FROM okc_k_lines_b line, oks_k_lines_b dtl
8608 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id ;
8609
8610
8611
8612
8613
8614
8615
8616 l_index NUMBER;
8617 l_sll_in_tbl StrmLvl_Out_tbl;
8618
8619 l_Line_Sll_rec l_Line_Sll_Csr%ROWTYPE;
8620 l_Line_Rec l_Line_Csr%Rowtype;
8621
8622 L_BIL_SCH_OUT_TBL OKS_BILL_SCH.ItemBillSch_tbl;
8623 l_top_line_rec Line_Det_Type;
8624 l_update_end_date VARCHAR2(1);
8625
8626
8627 -------------------------------------------------------------------------
8628 -- Begin partial period computation logic
8629 -- Developer Mani Choudhary
8630 -- Date 04-MAY-2005
8631 -------------------------------------------------------------------------
8632 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
8633 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
8634 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
8635 l_return_status VARCHAR2(30);
8636 -------------------------------------------------------------------------
8637 -- End partial period computation logic
8638 -- Date 04-MAY-2005
8639 -------------------------------------------------------------------------
8640
8641 BEGIN
8642
8643 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8644 l_update_end_date := 'N';
8645
8646 IF nvl(p_full_credit, 'N') = 'Y' Then
8647 DELETE FROM OKS_LEVEL_ELEMENTS
8648 WHERE date_completed IS NULL
8649 AND cle_id = p_top_line_id;
8650
8651 RETURN;
8652 END IF;
8653
8654 ---get line details
8655 Open l_Line_Csr;
8656 Fetch l_Line_Csr Into l_Line_Rec;
8657
8658 If l_Line_Csr%Notfound then
8659 Close l_Line_Csr;
8660 x_return_status := 'E';
8661 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
8662 RAISE G_EXCEPTION_HALT_VALIDATION;
8663 End If;
8664 Close l_Line_Csr;
8665
8666 l_top_line_rec.chr_id := l_Line_Rec.chr_id;
8667 l_top_line_rec.dnz_chr_id := l_Line_Rec.dnz_chr_id;
8668 l_top_line_rec.id := l_Line_Rec.id ;
8669 l_top_line_rec.lse_id := l_Line_Rec.lse_id;
8670 l_top_line_rec.line_start_dt := l_Line_Rec.line_start_dt;
8671 l_top_line_rec.line_end_dt := l_Line_Rec.line_end_dt;
8672 l_top_line_rec.line_amt := l_Line_Rec.line_amt ;
8673
8674
8675 -------------------------------------------------------------------------
8676 -- Begin partial period computation logic
8677 -- Developer Mani Choudhary
8678 -- Date 09-MAY-2005
8679 -------------------------------------------------------------------------
8680
8681 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
8682 (
8683 p_hdr_id => l_Line_Rec.dnz_chr_id,
8684 p_org_id => NULL,
8685 x_period_start => l_period_start,
8686 x_period_type => l_period_type,
8687 x_price_uom => l_price_uom,
8688 x_return_status => x_return_status);
8689
8690 IF x_return_status <> 'S' THEN
8691 RAISE G_EXCEPTION_HALT_VALIDATION;
8692 END IF;
8693
8694 -------------------------------------------------------------------------
8695 -- End partial period computation logic
8696 -- Date 09-MAY-2005
8697 -------------------------------------------------------------------------
8698
8699 IF l_line_rec.billing_schedule_type IS NULL then
8700 RETURN;
8701 END IF;
8702 ----make sll tbl
8703
8704 l_index := 1;
8705 l_sll_in_tbl.DELETE;
8706
8707 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
8708 LOOP
8709 l_sll_in_tbl(l_index).id := l_Line_SlL_rec.id;
8710 l_sll_in_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
8711
8712 l_sll_in_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
8713 l_sll_in_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
8714 l_sll_in_tbl(l_index).uom := l_Line_SlL_rec.uom_code;
8715 l_sll_in_tbl(l_index).seq_no := l_Line_SlL_rec.sequence_no;
8716 l_sll_in_tbl(l_index).Dt_start := l_Line_SlL_rec.Start_Date;
8717 IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
8718
8719 l_sll_in_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
8720 ELSE
8721 l_update_end_date := 'Y';
8722 l_sll_in_tbl(l_index).end_Date := OKC_TIME_UTIL_PUB.get_enddate(
8723 l_Line_SlL_rec.Start_Date,
8724 l_Line_SlL_rec.UOM_CODE,
8725 l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
8726 END IF;
8727
8728
8729 l_sll_in_tbl(l_index).level_period := l_Line_SlL_rec.level_periods;
8730 l_sll_in_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
8731 l_sll_in_tbl(l_index).amount := l_Line_SlL_rec.level_amount;
8732 l_sll_in_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
8733 l_sll_in_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
8734
8735 l_index := l_index + 1;
8736 END LOOP;
8737
8738 IF l_sll_in_tbl.COUNT = 0 THEN
8739 RETURN;
8740 END IF;
8741
8742 IF l_update_end_date = 'Y' THEN ---Migrated
8743 OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id => p_top_line_id,
8744 p_chr_id => NULL,
8745 x_return_status => x_return_status);
8746
8747 IF x_return_status <> 'S' THEN
8748 RETURN;
8749 END IF;
8750 END IF;
8751
8752 -----errorout_ad('SLL found');
8753
8754
8755
8756 -------------------------------------------------------------------------
8757 -- Begin partial period computation logic
8758 -- Developer Mani Choudhary
8759 -- Date 09-MAY-2005
8760 -------------------------------------------------------------------------
8761 Create_Subcription_LvlEle
8762 (p_billing_type => l_line_rec.billing_schedule_type,
8763 p_sll_tbl => l_sll_in_tbl,
8764 p_line_rec => l_top_line_rec,
8765 p_term_dt => l_line_rec.line_term_dt,
8766 p_invoice_ruleid => l_line_rec.inv_rule_id,
8767 p_period_start => l_period_start,
8768 p_period_type => l_period_type,
8769 x_return_status => x_return_status);
8770
8771 IF x_return_status <> 'S' THEN
8772 RAISE G_EXCEPTION_HALT_VALIDATION;
8773 END IF;
8774
8775
8776
8777 EXCEPTION
8778 WHEN G_EXCEPTION_HALT_VALIDATION THEN
8779 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8780 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8781 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8782 RAISE OKC_API.G_EXCEPTION_ERROR;
8783 END IF;
8784 WHEN OTHERS THEN
8785 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
8786 p_msg_name => G_UNEXPECTED_ERROR,
8787 p_token1 => G_SQLCODE_TOKEN,
8788 p_token1_value => sqlcode,
8789 p_token2 => G_SQLERRM_TOKEN,
8790 p_token2_value => sqlerrm);
8791
8792 x_return_status := G_RET_STS_UNEXP_ERROR;
8793
8794 END Create_Subcription_bs;
8795
8796
8797 FUNCTION Find_term_amt(p_cycle_st_dt IN DATE,
8798 p_term_dt IN DATE,
8799 p_cycle_end_dt IN DATE,
8800 p_amount IN NUMBER) RETURN NUMBER
8801
8802
8803 IS
8804 l_cal_amt NUMBER;
8805 l_term_days NUMBER;
8806 l_cycle_days NUMBER;
8807
8808
8809 BEGIN
8810
8811 l_cal_amt := 0;
8812
8813 l_term_days := trunc(p_term_dt) - TRUNC(p_cycle_st_dt);
8814 l_cycle_days := trunc(p_cycle_end_dt) - TRUNC(p_cycle_st_dt) + 1;
8815
8816 -----errorout_ad('l_term_days = ' || l_term_days);
8817
8818 l_cal_amt := (NVL(p_amount,0) * l_term_days)/ NVL(l_cycle_days,1) ;
8819
8820 -----errorout_ad('l_cal_amt = ' || l_cal_amt);
8821
8822 RETURN OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_cal_amt, l_currency_code);
8823
8824 EXCEPTION
8825 WHEN NO_DATA_FOUND THEN
8826 RETURN NULL;
8827 WHEN OTHERS THEN
8828 RETURN NULL;
8829
8830 END Find_term_amt;
8831
8832 PROCEDURE Get_SLL_info(p_top_line_id IN NUMBER,
8833 p_line_id IN NUMBER,
8834 x_sll_tbl OUT NOCOPY StrmLvl_Out_tbl,
8835 x_sll_db_tbl OUT NOCOPY OKS_BILL_SCH.StreamLvl_tbl,
8836 x_return_status OUT NOCOPY VARCHAR2)
8837
8838 IS
8839
8840
8841 CURSOR l_line_sll_csr IS
8842 SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
8843 uom_per_period, uom_code, TRUNC(end_date) end_date,
8844 interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
8845 chr_id, level_amount
8846 FROM OKS_STREAM_LEVELS_B
8847 WHERE cle_id = p_line_id
8848 ORDER BY sequence_no;
8849
8850 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
8851 l_index NUMBER;
8852 l_Line_Sll_rec l_Line_Sll_csr%ROWTYPE;
8853 l_update_end_date VARCHAR2(1) := 'N';
8854
8855
8856 BEGIN
8857 l_update_end_date := 'N';
8858 l_sll_tbl.DELETE;
8859 l_index := 1;
8860 x_return_status := 'S';
8861 ----make sll tbl
8862
8863 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
8864 LOOP
8865 l_sll_tbl(l_index).id := l_Line_SlL_rec.id;
8866 l_sll_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
8867
8868 l_sll_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
8869 l_sll_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
8870 l_sll_tbl(l_index).uom_code := l_Line_SlL_rec.uom_code;
8871 l_sll_tbl(l_index).sequence_no := l_Line_SlL_rec.sequence_no;
8872 l_sll_tbl(l_index).Start_Date := l_Line_SlL_rec.Start_Date;
8873
8874 IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
8875
8876 l_sll_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
8877 ELSE
8878 l_update_end_date := 'Y';
8879 l_sll_tbl(l_index).end_Date := OKC_TIME_UTIL_PUB.get_enddate(
8880 l_Line_SlL_rec.Start_Date,
8881 l_Line_SlL_rec.UOM_CODE,
8882 l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
8883 END IF;
8884
8885 l_sll_tbl(l_index).level_periods := l_Line_SlL_rec.level_periods;
8886 l_sll_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
8887 l_sll_tbl(l_index).level_amount := l_Line_SlL_rec.level_amount;
8888 l_sll_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
8889 l_sll_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
8890
8891 l_index := l_index + 1;
8892 END LOOP;
8893
8894 IF l_sll_tbl.COUNT = 0 THEN
8895 RETURN;
8896 END IF;
8897
8898 IF l_update_end_date = 'Y' THEN ---Migrated
8899 OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id => p_top_line_id,
8900 p_chr_id => NULL,
8901 x_return_status => x_return_status);
8902
8903 IF x_return_status <> 'S' THEN
8904 RETURN;
8905 END IF;
8906 END IF;
8907
8908
8909 x_sll_db_tbl := l_sll_tbl;
8910
8911 l_index := 0;
8912 x_sll_tbl.delete ;
8913
8914
8915 l_index := 0;
8916
8917
8918 FOR l_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
8919 LOOP
8920
8921 x_sll_tbl(l_index).id := l_sll_tbl(l_index).id ;
8922 x_sll_tbl(l_index).cle_id := l_sll_tbl(l_index).cle_id;
8923 x_sll_tbl(l_index).chr_id := l_sll_tbl(l_index).chr_id ;
8924 x_sll_tbl(l_index).dnz_chr_id := l_sll_tbl(l_index).dnz_chr_id;
8925 x_sll_tbl(l_index).uom := l_sll_tbl(l_index).uom_code ;
8926 x_sll_tbl(l_index).seq_no := l_sll_tbl(l_index).sequence_no;
8927 x_sll_tbl(l_index).Dt_start := l_sll_tbl(l_index).Start_Date ;
8928 x_sll_tbl(l_index).end_Date := l_sll_tbl(l_index).end_Date ;
8929 x_sll_tbl(l_index).level_period := l_sll_tbl(l_index).level_periods ;
8930 x_sll_tbl(l_index).uom_per_period := l_sll_tbl(l_index).uom_per_period ;
8931 x_sll_tbl(l_index).amount := l_sll_tbl(l_index).level_amount;
8932 x_sll_tbl(l_index).invoice_offset_days := l_sll_tbl(l_index).invoice_offset_days;
8933 x_sll_tbl(l_index).interface_offset_days := l_sll_tbl(l_index).interface_offset_days ;
8934 END LOOP;
8935
8936
8937
8938 END Get_SLL_info;
8939
8940
8941
8942 Procedure Terminate_bill_sch
8943 (
8944 p_top_line_id IN NUMBER,
8945 p_sub_line_id IN NUMBER,
8946 p_term_dt IN DATE,
8947 x_return_status OUT NOCOPY Varchar2,
8948 x_msg_count OUT NOCOPY NUMBER,
8949 x_msg_data OUT NOCOPY VARCHAR2)
8950 IS
8951
8952 Cursor l_Line_Csr Is
8953 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
8954 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
8955 line.inv_rule_id inv_rule_id, line.cle_id cle_id,
8956 dtl.billing_schedule_type billing_schedule_type,
8957 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
8958 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
8959 FROM okc_k_lines_b line, oks_k_lines_b dtl
8960 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id
8961 AND line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
8962 -- Ignore cancelled topline
8963
8964
8965
8966
8967 Cursor l_all_subLine_Csr(l_line_id number, l_style_id number) Is
8968 SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
8969 TRUNC(line.end_date) cp_end_dt, TRUNC(line.date_terminated) cp_prev_term_dt,
8970 dtl.billing_schedule_type billing_schedule_type,
8971 dtl.full_credit full_credit,lse_id cp_lse_id,dtl.price_uom,
8972 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
8973 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) subline_amt
8974 FROM okc_k_lines_b line, oks_k_lines_b dtl
8975 WHERE line.cle_id = l_line_id
8976 AND line.id = dtl.cle_id
8977 AND ((l_style_id = 1 and line.lse_id in (35,7,8,9,10,11))
8978 OR (l_style_id = 12 and line.lse_id = 13)
8979 OR (l_style_id = 14 and line.lse_id = 18)
8980 OR (l_style_id = 19 and line.lse_id = 25))
8981 AND line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
8982 -- Ignore cancelled subline
8983
8984
8985 Cursor l_subline_amt_csr (p_id in number) IS
8986 Select line.price_negotiated
8987 from okc_k_lines_b line
8988 where line.id = p_id;
8989
8990 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
8991 SELECT id, trunc(element.date_start) date_start,
8992 amount,trunc(date_end) date_end,
8993 object_version_number,date_transaction,date_to_interface
8994 FROM oks_level_elements element
8995 WHERE cle_id = p_line_id
8996 ORDER BY date_start;
8997
8998
8999
9000 Cursor l_SubLine_Csr Is
9001 SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
9002 TRUNC(line.end_date) cp_end_dt, dtl.billing_schedule_type billing_schedule_type,dtl.price_uom,
9003 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
9004 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) subline_amt
9005 FROM okc_k_lines_b line, oks_k_lines_b dtl
9006 WHERE line.id = p_sub_line_id
9007 AND line.id = dtl.cle_id
9008 AND line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
9009 -- Ignore cancelled subline
9010
9011
9012 l_Line_rec l_Line_Csr%ROWTYPE;
9013 l_all_subLine_rec l_all_subLine_Csr%ROWTYPE;
9014 l_subLine_rec l_subLine_csr%ROWTYPE;
9015 l_line_BS_rec l_line_BS_csr%ROWTYPE;
9016
9017
9018
9019 l_index NUMBER;
9020 l_top_line_rec Line_Det_Type;
9021 l_cp_rec Prod_Det_Type;
9022 l_inv_id number;
9023 l_prev_term_dt date;
9024
9025 l_sll_in_tbl StrmLvl_Out_tbl;
9026 l_sll_db_tbl oks_bill_sch.StreamLvl_tbl;
9027 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
9028
9029 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
9030
9031 -------------------------------------------------------------------------
9032 -- Begin partial period computation logic
9033 -- Developer Mani Choudhary
9034 -- Date 04-MAY-2005
9035 -------------------------------------------------------------------------
9036 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
9037 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
9038 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
9039 l_return_status VARCHAR2(30);
9040 l_tangible BOOLEAN;
9041 l_pricing_method VARCHAR2(30);
9042 -------------------------------------------------------------------------
9043 -- End partial period computation logic
9044 -- Date 04-MAY-2005
9045 -------------------------------------------------------------------------
9046
9047
9048 BEGIN
9049
9050
9051 --if called for top line p_sub_line_id is null or -100
9052 --if p_sub_line_id = -100 that means full credit, create top line bs upto term date
9053 --and subline which are not already terminated, consider term dt as start dt of subline.
9054 --so that subline will have only billed lvl elements.
9055
9056 --if called for subline termination,if full credit termination program will pass
9057 --p_term_dt as start date otherwise actual term dt.
9058
9059
9060 x_return_status := 'S';
9061
9062 IF p_term_dt IS NULL THEN
9063 RETURN;
9064 END IF;
9065
9066 ---get line details
9067 Open l_Line_Csr;
9068 Fetch l_Line_Csr Into l_Line_Rec;
9069
9070 If l_Line_Csr%Notfound then
9071 Close l_Line_Csr;
9072 x_return_status := 'E';
9073 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
9074 RAISE G_EXCEPTION_HALT_VALIDATION;
9075 End If;
9076 Close l_Line_Csr;
9077
9078 l_top_line_rec.chr_id := l_Line_Rec.chr_id;
9079 l_top_line_rec.dnz_chr_id := l_Line_Rec.dnz_chr_id;
9080 l_top_line_rec.id := l_Line_Rec.id ;
9081 l_top_line_rec.cle_id := l_Line_Rec.cle_id ;
9082 l_top_line_rec.lse_id := l_Line_Rec.lse_id;
9083 l_top_line_rec.line_start_dt := l_Line_Rec.line_start_dt;
9084 l_top_line_rec.line_end_dt := l_Line_Rec.line_end_dt;
9085 l_top_line_rec.line_amt := l_Line_Rec.line_amt ;
9086 -------------------------------------------------------------------------
9087 -- Begin partial period computation logic
9088 -- Developer Mani Choudhary
9089 -- Date 09-MAY-2005
9090 -------------------------------------------------------------------------
9091
9092
9093 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
9094 (
9095 p_hdr_id => l_Line_Rec.dnz_chr_id,
9096 p_org_id => NULL,
9097 x_period_start => l_period_start,
9098 x_period_type => l_period_type,
9099 x_price_uom => l_price_uom,
9100 x_return_status => x_return_status);
9101
9102 IF x_return_status <> 'S' THEN
9103 RAISE G_EXCEPTION_HALT_VALIDATION;
9104 END IF;
9105
9106 --Description in detail for the business rules for deriving the period start
9107 --1)For usage , period start will always be 'SERVICE'
9108 --2)For Subscriptions, period start and period type will be NULL
9109 -- for tangible subscriptions as per CR1.For intangible subscriptions,
9110 -- if the profile OKS: Intangible Subscription Pricing Method
9111 -- is set to 'Subscription Based',then period start and period type will be NULL
9112 -- otherwise it will be 'SERVICE'
9113 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
9114 --mchoudha fix for bug#5183011
9115 IF l_period_start IS NOT NULL AND
9116 l_period_type IS NOT NULL
9117 THEN
9118 IF l_top_line_rec.lse_id = 12 THEN
9119 l_period_start := 'SERVICE';
9120 END IF;
9121 IF l_top_line_rec.lse_id = 46 THEN
9122 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_top_line_id);
9123 IF l_tangible THEN
9124 l_period_start := NULL;
9125 l_period_type := NULL;
9126 ELSE
9127 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
9128 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
9129 l_period_start := NULL;
9130 l_period_type := NULL;
9131 ELSE
9132 l_period_start := 'SERVICE';
9133 END IF; --l_pricing_method <> 'EFFECTIVITY'
9134 END IF; --IF l_tangible
9135 END IF; --IF l_top_line_rec.lse_id = 46
9136 END IF; --IF l_period_start IS NOT NULL
9137 -------------------------------------------------------------------------
9138 -- End partial period computation logic
9139 -- Date 09-MAY-2005
9140 -------------------------------------------------------------------------
9141 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9142
9143 fnd_log.STRING (fnd_log.level_statement,
9144 G_MODULE_CURRENT || '.terminate_bill_sch.line_dtls',
9145 'dnz_chr_id = ' || l_line_rec.dnz_chr_id
9146 || ', id = ' || l_line_rec.id
9147 || ', lse_id = ' || l_line_rec.lse_id
9148 || ', start dt = ' || l_line_rec.line_start_dt
9149 || ', end dt = ' || l_line_rec.line_end_dt
9150 || ', amt = ' || l_line_rec.line_amt
9151 || ', p_sub_line_id = ' || p_sub_line_id
9152 || ', p_term_dt = ' || p_term_dt
9153 || ', bill type = '|| l_Line_Rec.billing_schedule_type
9154 || ', inv rule = '|| l_line_rec.inv_rule_id
9155 );
9156 END IF;
9157
9158
9159 --get currency
9160 l_currency_code := Find_Currency_Code(
9161 p_cle_id => p_top_line_id,
9162 p_chr_id => NULL);
9163
9164 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9165
9166 fnd_log.STRING (fnd_log.level_statement,
9167 G_MODULE_CURRENT || '.terminate_bill_sch.line_dtls',
9168 'l_currency_code = ' || l_currency_code);
9169 END IF;
9170
9171 IF l_currency_code IS NULL THEN
9172 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
9173 x_return_status := 'E';
9174 RAISE G_EXCEPTION_HALT_VALIDATION;
9175 END IF;
9176
9177
9178
9179
9180 --for top line first call create_lvl_ele only for top line
9181 ---and then in loop call for all subline.
9182
9183 IF p_sub_line_id IS NULL OR p_sub_line_id = -100 THEN
9184 l_sll_in_tbl.DELETE;
9185 l_index := 1;
9186
9187 IF TRUNC(p_term_dt) > l_top_line_rec.line_end_dt THEN
9188 RETURN;
9189 END IF;
9190
9191 Get_SLL_info(p_top_line_id => p_top_line_id,
9192 p_line_id => p_top_line_id,
9193 x_sll_tbl => l_sll_in_tbl,
9194 x_sll_db_tbl => l_sll_db_tbl,
9195 x_return_status => x_return_status );
9196
9197 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9198 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.line_sll',
9199 'Get_SLL_info(x_return_status = '||x_return_status
9200 ||', sll tbl count = '||l_sll_in_tbl.count||')');
9201 END IF;
9202
9203
9204 IF x_return_status <> 'S' THEN
9205 RAISE G_EXCEPTION_HALT_VALIDATION;
9206 END IF;
9207 -----errorout_ad('l_sll_in_tbl count for top line = ' || l_sll_in_tbl.count);
9208
9209 IF l_sll_in_tbl.count= 0 OR l_line_rec.billing_schedule_type IS NULL THEN
9210 RETURN;
9211 END IF;
9212
9213 -------------------------------------------------------------------------
9214 -- Begin partial period computation logic
9215 -- Developer Mani Choudhary
9216 -- Date 09-MAY-2005
9217 -- Added two new parameters p_period_start and p_period_type
9218 -------------------------------------------------------------------------
9219 Create_Level_elements(p_billing_type => NVL(l_line_rec.billing_schedule_type,'T'),
9220 p_sll_tbl => l_sll_in_tbl,
9221 p_line_rec => l_top_line_rec,
9222 p_invoice_ruleid => l_line_rec.inv_rule_id,
9223 p_term_dt => p_term_dt,
9224 p_period_start => l_period_start,
9225 p_period_type => l_period_type,
9226 x_return_status => x_return_status );
9227
9228 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9229 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.top_lvl_ele',
9230 'Create_Level_elements(x_return_status = '||x_return_status
9231 ||')');
9232 END IF;
9233
9234 IF x_return_status <> 'S' THEN
9235 RAISE G_EXCEPTION_HALT_VALIDATION;
9236 END IF;
9237
9238 IF l_line_rec.billing_schedule_type IN ('T','E') THEN
9239 l_top_bs_tbl.DELETE;
9240 l_index := 1;
9241
9242 FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
9243 LOOP
9244 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
9245 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
9246 l_top_bs_tbl(l_index).date_end := l_line_bs_rec.date_end;
9247 l_top_bs_tbl(l_index).Amount := 0;
9248 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
9249 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
9250 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
9251
9252 l_index := l_index + 1;
9253 END LOOP;
9254 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9255
9256 fnd_log.STRING (fnd_log.level_statement,
9257 G_MODULE_CURRENT || '.terminate_bill_sch.top_bs',
9258 'top bs tbl count = ' || l_top_bs_tbl.count);
9259 END IF;
9260 END IF; -----end of 'T'
9261
9262
9263 --if schedule is for top level line then find sub line and repeat THE process.
9264 IF l_Line_Rec.chr_id is not null AND l_Line_Rec.lse_id IN (1, 12, 14, 19) then
9265
9266 FOR l_all_SubLine_rec IN l_all_SubLine_Csr(l_Line_Rec.id,l_Line_Rec.lse_id)
9267 LOOP
9268
9269 l_cp_rec.cp_id := l_all_SubLine_rec.subline_id ;
9270 l_cp_rec.cp_start_dt := l_all_SubLine_rec.cp_start_dt;
9271 l_cp_rec.cp_end_dt := l_all_SubLine_rec.cp_end_dt ;
9272 l_cp_rec.cp_amt := l_all_SubLine_rec.subline_amt ;
9273 l_cp_rec.cp_price_uom := l_all_SubLine_rec.price_uom;
9274 l_cp_rec.cp_lse_id := l_all_SubLine_rec.cp_lse_id;
9275 l_cp_rec.cp_price_uom := l_all_SubLine_rec.price_uom;
9276
9277 IF l_period_type is not null AND l_period_start is not NULL THEN
9278 OPEN l_subline_amt_csr(l_all_SubLine_rec.subline_id);
9279 FETCH l_subline_amt_csr INTO l_cp_rec.cp_amt;
9280 CLOSE l_subline_amt_csr;
9281 END IF;
9282 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9283
9284 fnd_log.STRING (fnd_log.level_statement,
9285 G_MODULE_CURRENT || '.terminate_bill_sch.loop_cp_dtl',
9286 'id = ' || l_all_SubLine_rec.subline_id
9287 || ', start dt = ' || l_all_SubLine_rec.cp_start_dt
9288 || ', end dt = ' || l_all_SubLine_rec.cp_end_dt
9289 || ', amt = ' || l_all_SubLine_rec.subline_amt
9290 || ', previous cp_term_dt = ' || l_all_subline_rec.cp_prev_term_dt
9291 );
9292 END IF;
9293
9294
9295
9296 IF TRUNC(p_term_dt) > l_cp_rec.cp_end_dt THEN
9297 IF l_line_rec.billing_schedule_type IN ('T', 'E') and l_top_bs_tbl.count > 0 THEN
9298
9299 Rollup_lvl_amt(
9300 p_Line_Rec =>l_top_line_rec,
9301 p_SubLine_rec => l_cp_rec,
9302 p_top_line_bs => l_top_bs_tbl,
9303 x_return_status => x_return_status);
9304
9305 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9306 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.adj_lvl_amt',
9307 'Rollup_lvl_amt(x_return_status = '||x_return_status
9308 ||')');
9309 END IF;
9310
9311 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9312 RAISE G_EXCEPTION_HALT_VALIDATION;
9313 END IF;
9314 END IF;
9315
9316 ELSE --term_dt < end date
9317
9318 l_sll_in_tbl.DELETE;
9319 l_prev_term_dt := NULL; ---for bug#3254423
9320
9321 Get_SLL_info(p_top_line_id => p_top_line_id,
9322 p_line_id => l_cp_rec.cp_id,
9323 x_sll_tbl => l_sll_in_tbl,
9324 x_sll_db_tbl => l_sll_db_tbl,
9325 x_return_status => x_return_status );
9326
9327 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9328 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_sll',
9329 'Get_SLL_info(x_return_status = '||x_return_status
9330 ||', sll tbl count = '||l_sll_in_tbl.count||')');
9331 END IF;
9332
9333 IF x_return_status <> 'S' THEN
9334 RAISE G_EXCEPTION_HALT_VALIDATION;
9335 END IF;
9336
9337 IF l_sll_in_tbl.count= 0 THEN
9338 RETURN;
9339 END IF;
9340
9341 ---if sub line is already terminated
9342 IF l_all_subline_rec.cp_prev_term_dt IS NOT NULL THEN
9343 IF nvl(l_all_SubLine_rec.full_credit, 'N') = 'Y' THEN
9344 --with full credit change the term dt as subline start dt
9345 l_prev_term_dt := l_cp_rec.cp_start_dt;
9346 ELSE
9347 l_prev_term_dt := l_all_subline_rec.cp_prev_term_dt;
9348 END IF;
9349 ELSE --sub line not terminated already
9350
9351 IF nvl(p_sub_line_id, 100) = -100 THEN --full credit flag
9352 l_prev_term_dt := l_cp_rec.cp_start_dt;
9353 END IF;
9354
9355 END IF; ---chk subline already terminated
9356
9357 -------------------------------------------------------------------------
9358 -- Begin partial period computation logic
9359 -- Developer Mani Choudhary
9360 -- Date 09-MAY-2005
9361 -- Added two new parameters p_period_start and p_period_type
9362 -------------------------------------------------------------------------
9363 Create_cp_lvl_elements
9364 ( p_billing_type => NVL(l_line_rec.billing_schedule_type,'T'),
9365 p_cp_sll_tbl => l_sll_in_tbl,
9366 p_Line_Rec => l_top_line_rec,
9367 p_SubLine_rec => l_cp_Rec,
9368 p_invoice_rulid => l_line_rec.inv_rule_id,
9369 p_top_line_bs => l_top_bs_tbl,
9370 p_term_dt => nvl(l_prev_term_dt,p_term_dt),
9371 p_period_start => l_period_start,
9372 p_period_type => l_period_type,
9373 x_return_status => x_return_status);
9374
9375 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9376 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_lvl_ele',
9377 'Create_cp_lvl_elements(x_return_status = '||x_return_status
9378 ||', l_prev_term_dt = '||l_prev_term_dt
9379 ||', p_term_dt = ' || p_term_dt ||' , l_period_start '||l_period_start||', l_period_type '||l_period_type||')');
9380 END IF;
9381
9382
9383 IF x_return_status <> 'S' THEN
9384 RAISE G_EXCEPTION_HALT_VALIDATION;
9385 END IF;
9386 END IF; ----end of term_dt > end date
9387 END LOOP;
9388 END IF; ---END OF SUBLINE LOOP
9389
9390
9391 IF l_top_bs_tbl.COUNT >0 THEN ---only for type 'T' l_top_bs_tbl will be having records
9392 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
9393 p_api_version => l_api_version,
9394 p_init_msg_list => l_init_msg_list,
9395 x_return_status => x_return_status,
9396 x_msg_count => x_msg_count,
9397 x_msg_data => x_msg_data,
9398 p_letv_tbl => l_top_bs_tbl,
9399 x_letv_tbl => l_lvl_ele_tbl_out);
9400
9401 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9402 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.update_bs',
9403 'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status
9404 ||', top bs count = '||l_lvl_ele_tbl_out.count ||')');
9405 END IF;
9406
9407 IF x_return_status <> 'S' THEN
9408 RAISE G_EXCEPTION_HALT_VALIDATION;
9409 END IF;
9410 END IF; ----end of l_top_bs_tbl.COUNT >0
9411
9412 ELSE ---if only one subline is terminated
9413
9414 ----get subline
9415 Open l_SubLine_Csr;
9416 FETCH l_SubLine_Csr Into l_SubLine_Rec;
9417 If l_SubLine_Csr%Notfound then
9418 Close l_SubLine_Csr;
9419 x_return_status := 'E';
9420 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'SUB LINE NOT FOUND');
9421 RAISE G_EXCEPTION_HALT_VALIDATION;
9422 End If;
9423 Close l_SubLine_Csr;
9424
9425 l_cp_rec.cp_id := l_SubLine_rec.subline_id ;
9426 l_cp_rec.cp_start_dt := l_SubLine_rec.cp_start_dt;
9427 l_cp_rec.cp_end_dt := l_SubLine_rec.cp_end_dt ;
9428 l_cp_rec.cp_amt := l_SubLine_rec.subline_amt ;
9429 l_cp_rec.cp_price_uom := l_SubLine_rec.price_uom;
9430 IF l_period_type is not null AND l_period_start is not NULL THEN
9431 OPEN l_subline_amt_csr(l_SubLine_rec.subline_id);
9432 FETCH l_subline_amt_csr INTO l_cp_rec.cp_amt;
9433 CLOSE l_subline_amt_csr;
9434 END IF;
9435 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9436
9437 fnd_log.STRING (fnd_log.level_statement,
9438 G_MODULE_CURRENT || '.terminate_bill_sch.cp_dtl',
9439 'id = ' || l_all_SubLine_rec.subline_id
9440 || ', start dt = ' || l_SubLine_rec.cp_start_dt
9441 || ', end dt = ' || l_SubLine_rec.cp_end_dt
9442 || ', amt = ' || l_SubLine_rec.subline_amt
9443 );
9444 END IF;
9445
9446
9447 IF TRUNC(p_term_dt) > l_cp_rec.cp_end_dt THEN
9448 RETURN;
9449 END IF;
9450
9451
9452 l_sll_in_tbl.DELETE;
9453
9454 Get_SLL_info(p_top_line_id => p_top_line_id,
9455 p_line_id => p_sub_line_id,
9456 x_sll_tbl => l_sll_in_tbl,
9457 x_sll_db_tbl => l_sll_db_tbl,
9458 x_return_status => x_return_status );
9459
9460 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9461 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_sll',
9462 'Get_SLL_info(x_return_status = '||x_return_status
9463 ||', sll tbl count = '||l_sll_in_tbl.count||')');
9464 END IF;
9465
9466 IF x_return_status <> 'S' THEN
9467 RAISE G_EXCEPTION_HALT_VALIDATION;
9468 END IF;
9469
9470 IF l_sll_in_tbl.count= 0 OR l_subline_rec.billing_schedule_type IS NULL THEN
9471 RETURN;
9472 END IF;
9473
9474 IF l_subline_rec.billing_schedule_type IN ('T','E') THEN
9475 l_top_bs_tbl.DELETE;
9476 l_index := 1;
9477
9478 FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
9479 LOOP
9480 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
9481 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
9482 l_top_bs_tbl(l_index).date_end := l_line_bs_rec.date_end;
9483 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
9484 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
9485 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
9486 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
9487
9488
9489 l_index := l_index + 1;
9490 END LOOP;
9491
9492 IF l_top_bs_tbl.COUNT > 0 THEN
9493
9494 Adjust_top_BS_Amt( p_Line_Rec => l_top_Line_Rec,
9495 p_SubLine_rec => l_cp_Rec,
9496 p_top_line_bs => l_top_bs_tbl,
9497 x_return_status => x_return_status);
9498
9499 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9500 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.adjust_cp_amt',
9501 'Adjust_top_BS_Amt(x_return_status = '||x_return_status ||')');
9502 END IF;
9503
9504 IF x_return_status <> 'S' THEN
9505 RAISE G_EXCEPTION_HALT_VALIDATION;
9506 END IF;
9507 END IF;
9508
9509 END IF; ---end of T
9510
9511 -------------------------------------------------------------------------
9512 -- Begin partial period computation logic
9513 -- Developer Mani Choudhary
9514 -- Date 09-MAY-2005
9515 -- Added two new parameters p_period_start and p_period_type
9516 -------------------------------------------------------------------------
9517 Create_cp_lvl_elements
9518 ( p_billing_type => NVL(l_subline_rec.billing_schedule_type,'T'),
9519 p_cp_sll_tbl => l_sll_in_tbl,
9520 p_Line_Rec => l_top_line_rec,
9521 p_SubLine_rec => l_cp_Rec,
9522 p_invoice_rulid => l_line_rec.inv_rule_id,
9523 p_top_line_bs => l_top_bs_tbl,
9524 p_term_dt => p_term_dt,
9525 p_period_start => l_period_start,
9526 p_period_type => l_period_type,
9527 x_return_status => x_return_status);
9528
9529 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9530 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_bs',
9531 'Create_cp_lvl_elements(x_return_status = '||x_return_status ||')');
9532 END IF;
9533
9534 IF x_return_status <> 'S' THEN
9535 RAISE G_EXCEPTION_HALT_VALIDATION;
9536 END IF;
9537
9538 IF l_subline_rec.billing_schedule_type IN ('E','T') AND l_top_bs_tbl.COUNT > 0 then
9539 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
9540 p_api_version => l_api_version,
9541 p_init_msg_list => l_init_msg_list,
9542 x_return_status => x_return_status,
9543 x_msg_count => x_msg_count,
9544 x_msg_data => x_msg_data,
9545 p_letv_tbl => l_top_bs_tbl,
9546 x_letv_tbl => l_lvl_ele_tbl_out);
9547
9548 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9549 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.update_bs',
9550 'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status
9551 ||', top bs count = '||l_lvl_ele_tbl_out.count ||')');
9552 END IF;
9553
9554 IF x_return_status <> 'S' THEN
9555 RAISE G_EXCEPTION_HALT_VALIDATION;
9556 END IF;
9557 END IF; ---END OF update of top line sch
9558
9559 end if; ---end of p_sub_line_id null
9560
9561
9562
9563 EXCEPTION
9564 WHEN G_EXCEPTION_HALT_VALIDATION THEN
9565 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
9566 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
9567 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
9568 RAISE OKC_API.G_EXCEPTION_ERROR;
9569 END IF;
9570 WHEN OTHERS THEN
9571 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
9572 p_msg_name => G_UNEXPECTED_ERROR,
9573 p_token1 => G_SQLCODE_TOKEN,
9574 p_token1_value => sqlcode,
9575 p_token2 => G_SQLERRM_TOKEN,
9576 p_token2_value => sqlerrm);
9577
9578 x_return_status := G_RET_STS_UNEXP_ERROR;
9579
9580 END Terminate_bill_sch;
9581
9582
9583 -------------------------------------------------------------------------
9584 -- Begin partial period computation logic
9585 -- Developer Mani Choudhary
9586 -- Date 09-MAY-2005
9587 -------------------------------------------------------------------------
9588 PROCEDURE Create_cp_lvl_elements
9589 ( p_billing_type IN VARCHAR2,
9590 p_cp_sll_tbl IN StrmLvl_Out_tbl,
9591 p_Line_Rec IN Line_Det_Type,
9592 p_SubLine_rec IN Prod_Det_Type,
9593 p_invoice_rulid IN Number,
9594 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
9595 p_term_dt IN DATE,
9596 p_period_start IN VARCHAR2,
9597 p_period_type IN VARCHAR2,
9598 x_return_status OUT NOCOPY Varchar2
9599 )
9600 IS
9601
9602 l_cp_sll_countER Number;
9603 l_period_counter Number;
9604 l_next_cycle_dt Date;
9605 l_tot_amt Number;
9606 l_cp_sll_last Number;
9607 l_lvl_amt Number;
9608 l_adjusted_amt Number;
9609 l_lvl_loop_counter Number;
9610 l_last_cycle_dt Date;
9611 l_bill_sch_amt NUMBER :=0;
9612 l_uom_quantity NUMBER;
9613 l_tce_code VARCHAR2(100) ;
9614 l_period_freq NUMBER;
9615 l_constant_sll_amt NUMBER;
9616 l_tbl_seq number;
9617 l_remaining_amt number;
9618 l_tbs_ind NUMBER;
9619 l_bill_end_date DATE;
9620 l_element_end_dt DATE;
9621 l_term_amt NUMBER;
9622 l_compare_dt DATE;
9623 i number;
9624 l_end_date DATE;
9625 l_billed_at_source OKC_K_HEADERS_ALL_B.BILLED_AT_SOURCE%TYPE;
9626 --
9627 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
9628 l_return_status VARCHAR2(1);
9629 l_msg_count NUMBER;
9630 l_msg_data VARCHAR2(2000);
9631 l_msg_index_out NUMBER;
9632 l_msg_index NUMBER;
9633
9634 -- Start - Added by PMALLARA - Bug #3992530
9635 Lvl_Element_cnt Number := 0;
9636 Strm_Start_Date Date;
9637 -- End - Added by PMALLARA - Bug #3992530
9638 ------------------------------------------------------------------------
9639 -- Begin partial period computation logic
9640 -- Developer Mani Choudhary
9641 -- Date 17-MAY-2005
9642 -------------------------------------------------------------------------
9643 l_quantity NUMBER;
9644 l_total_quantity NUMBER;
9645 l_duration NUMBER;
9646 l_uom VARCHAR2(30);
9647 l_full_period_end_date DATE;
9648 l_last_cmp_date DATE;
9649 --
9650 --22-MAR-2006 mchoudha Changes for Partial periods CR3
9651 l_running_total NUMBER;
9652 /*bug8609599*/
9653 l_subline_total NUMBER;
9654
9655 BEGIN
9656 -----errorout_ad('in bill_sch_cp');
9657 x_return_status := 'S';
9658 l_bill_sch_amt := 0;
9659 l_lvl_ele_tbl_in.delete;
9660 l_tbl_seq := 1;
9661 --22-MAR-2006 mchoudha Changes for Partial periods CR3
9662 l_running_total := p_SubLine_rec.cp_amt;
9663 /*bug8609599*/
9664 l_subline_total := p_SubLine_rec.cp_amt;
9665 ------------------------------------------------------------------------
9666 -- Begin partial period computation logic
9667 -- Developer Mani Choudhary
9668 -- Date 17-MAY-2005
9669 -- If price UOM is NULL , then derive the UOM based on the effective dates
9670 -- of the subline.
9671 -------------------------------------------------------------------------
9672 IF (p_SubLine_rec.cp_price_uom is null) THEN
9673 OKC_TIME_UTIL_PUB.Get_Duration(p_SubLine_rec.cp_start_dt,p_SubLine_rec.cp_end_dt,l_duration,l_uom,x_return_status);
9674 END IF;
9675 ------------------------------------------------------------------------
9676 -- End partial period computation logic
9677 -------------------------------------------------------------------------
9678
9679 IF TRUNC(nvl((p_term_dt-1),p_SubLine_rec.cp_end_dt)) > p_SubLine_rec.cp_end_dt THEN
9680 l_end_date := p_SubLine_rec.cp_end_dt;
9681 ELSE
9682 l_end_date := TRUNC(nvl((p_term_dt-1),p_SubLine_rec.cp_end_dt)) ;
9683 END IF;
9684
9685
9686 IF l_header_billing IS NULL THEN
9687 Delete_lvl_element(p_cle_id => p_SubLine_rec.cp_id,
9688 x_return_status => x_return_status);
9689
9690 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9691 RAISE G_EXCEPTION_HALT_VALIDATION;
9692 END IF;
9693 END IF;
9694
9695 ----(terminate dt - 1) < st dt then do not create lvl element.
9696
9697 IF TRUNC(p_SubLine_rec.cp_start_dt) > l_end_date THEN
9698 -----errorout_ad('p_top_line_bs COUNT = '|| p_top_line_bs.COUNT);
9699 IF p_cp_sll_tbl.count > 0 AND p_top_line_bs.COUNT > 0THEN
9700
9701
9702 FOR l_cp_sll_counter IN p_cp_sll_tbl.first .. p_cp_sll_tbl.LAST
9703 LOOP
9704
9705 Check_Existing_Lvlelement(
9706 p_sll_id => p_cp_sll_tbl(l_cp_sll_counter).id,
9707 p_sll_dt_start => p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9708 p_uom => p_cp_sll_tbl(l_cp_sll_counter).uom,
9709 p_uom_per_period => p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9710 p_cp_end_dt => p_SubLine_rec.cp_end_dt,
9711 x_next_cycle_dt => l_next_cycle_dt,
9712 x_last_cycle_dt => l_last_cycle_dt,
9713 x_period_counter => l_period_counter,
9714 x_sch_amt => l_bill_sch_amt,
9715 x_top_line_bs => p_top_line_bs,
9716 x_return_status => x_return_status);
9717
9718 -----errorout_ad('Check_Existing_Lvlelement 1 = '|| x_return_status);
9719 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9720 RAISE G_EXCEPTION_HALT_VALIDATION;
9721 END IF;
9722 END LOOP;
9723 END IF; ---END OF p_cp_sll_tbl.count
9724
9725 x_return_status := 'S';
9726 RETURN;
9727 END IF;
9728
9729 IF p_cp_sll_tbl.count > 0 then
9730
9731 l_cp_sll_counter := p_cp_sll_tbl.FIRST;
9732 L_cp_sll_last := p_cp_sll_tbl.LAST;
9733
9734
9735 LOOP ------LOOP for sll item
9736 -----errorout_ad('SUB LINE START DATE PASSED TO CHECK LEVELEMENT : '||to_char(p_SubLine_rec.cp_start_dt));
9737 -----errorout_ad('passed l_bill_sch_amt = ' || l_bill_sch_amt);
9738
9739 IF l_header_billing IS NOT NULL THEN ----hdr lvl billing no old sll and lvl elements
9740 l_next_cycle_dT := p_cp_sll_tbl(l_cp_sll_counter).dt_start;
9741 l_lvl_loop_counter := 1;
9742 l_period_counter := 1;
9743 ELSE
9744 Check_Existing_Lvlelement(
9745 p_sll_id => p_cp_sll_tbl(l_cp_sll_counter).id,
9746 p_sll_dt_start => p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9747 p_uom => p_cp_sll_tbl(l_cp_sll_counter).uom,
9748 p_uom_per_period => p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9749 p_cp_end_dt => p_SubLine_rec.cp_end_dt,
9750 x_next_cycle_dt => l_next_cycle_dt,
9751 x_last_cycle_dt => l_last_cycle_dt,
9752 x_period_counter => l_period_counter,
9753 x_sch_amt => l_bill_sch_amt,
9754 x_top_line_bs => p_top_line_bs,
9755 x_return_status => x_return_status);
9756
9757 -----errorout_ad('Check_Existing_Lvlelement 2= '|| x_return_status);
9758
9759 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9760 RAISE G_EXCEPTION_HALT_VALIDATION;
9761 END IF;
9762
9763 l_lvl_loop_counter := l_period_counter;
9764
9765
9766 -----errorout_ad('l_period_counter = '|| l_period_counter);
9767 -----errorout_ad('l_last_cycle_dt = ' || l_last_cycle_dt);
9768 -----errorout_ad('l_bill_sch_amt = ' || l_bill_sch_amt);
9769 END IF ;
9770
9771 IF l_period_counter > to_number(p_cp_sll_tbl(l_cp_sll_counter).level_period) THEN
9772
9773 IF l_cp_sll_counter + 1 <= p_cp_sll_tbl.LAST THEN
9774 l_next_cycle_dt := p_cp_sll_tbl(l_cp_sll_counter + 1).dt_start;
9775 ELSE
9776 l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
9777 (p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9778 p_cp_sll_tbl(l_cp_sll_counter).uom,
9779 (p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period *
9780 p_cp_sll_tbl(l_cp_sll_counter).level_period));
9781
9782 l_next_cycle_dt := l_next_cycle_dt + 1;
9783 END IF;
9784
9785 ELSE
9786
9787 -----------errorout_ad('going in');
9788 -----------errorout_ad('l_last_cycle_dt = ' || l_last_cycle_dt);
9789 IF l_next_cycle_dt IS NULL THEN
9790 l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
9791 (l_last_cycle_dt,
9792 p_cp_sll_tbl(l_cp_sll_counter).uom,
9793 p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period);
9794
9795 l_next_cycle_dt := l_next_cycle_dt + 1;
9796
9797 END IF;
9798
9799 ---if cycle start dt is greater then cp end date then exit the procedure.
9800
9801 -----errorout_ad('AFTER CHECK l_next_cycle_dt = '|| l_next_cycle_dt);
9802
9803 IF TRUNC(l_next_cycle_dt) > l_end_date THEN
9804
9805 IF l_cp_sll_counter < p_cp_sll_tbl.LAST AND p_top_line_bs.COUNT > 0 THEN
9806
9807 l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
9808
9809
9810 FOR i IN l_cp_sll_counter .. p_cp_sll_tbl.LAST
9811 LOOP
9812
9813 Check_Existing_Lvlelement(
9814 p_sll_id => p_cp_sll_tbl(i).id,
9815 p_sll_dt_start => p_cp_sll_tbl(i).dt_start,
9816 p_uom => p_cp_sll_tbl(i).uom,
9817 p_uom_per_period => p_cp_sll_tbl(i).uom_per_period,
9818 p_cp_end_dt => p_SubLine_rec.cp_end_dt,
9819 x_next_cycle_dt => l_next_cycle_dt,
9820 x_last_cycle_dt => l_last_cycle_dt,
9821 x_period_counter => l_period_counter,
9822 x_sch_amt => l_bill_sch_amt,
9823 x_top_line_bs => p_top_line_bs,
9824 x_return_status => x_return_status);
9825
9826 -----errorout_ad('Check_Existing_Lvlelement 3= '|| x_return_status);
9827
9828 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9829 RAISE G_EXCEPTION_HALT_VALIDATION;
9830 END IF;
9831 END LOOP;
9832 END IF; ----END OF l_cp_sll_counter < p_cp_sll_tbl.LAST
9833
9834 x_return_status := 'S';
9835 RETURN;
9836
9837 END IF;
9838 IF l_cp_sll_counter < p_cp_sll_tbl.LAST THEN
9839
9840 l_compare_dt := TRUNC(p_cp_sll_tbl(l_cp_sll_counter + 1).dt_start);
9841 ELSE
9842
9843 l_compare_dt := TRUNC( p_SubLine_rec.cp_end_dt) + 1;
9844 END IF;
9845
9846 IF TRUNC(l_next_cycle_dt) >= l_compare_dt THEN
9847
9848 NULL;
9849 -----------errorout_ad('COMING IN');
9850 ELSE
9851
9852 IF p_billing_type = 'T' THEN
9853 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
9854 p_timeunit => p_cp_sll_tbl(l_cp_sll_counter).uom,
9855 x_return_status => x_return_status,
9856 x_quantity => l_uom_quantity ,
9857 x_timeunit => l_tce_code);
9858
9859 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9860 RAISE G_EXCEPTION_HALT_VALIDATION;
9861 END IF;
9862
9863
9864 l_remaining_amt := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0);
9865
9866 -------------------------------------------------------------------------
9867 -- Begin partial period computation logic
9868 -- Developer Mani Choudhary
9869 -- Date 17-MAY-2005
9870 -- get the converted unit price per SLL UOM derived from the unit price stored at the
9871 -- subline.
9872 -------------------------------------------------------------------------
9873
9874
9875 IF p_period_start is not null AND
9876 p_period_type is not null
9877 THEN
9878 --new procedure for CALENDAR START and service start
9879 --30-DEC-2005 mchoudha fixed bug#4895586
9880 --Added an extra parameter termination date to this API
9881 l_constant_sll_amt := OKS_BILL_SCH.Get_Unit_Price_Per_Uom
9882 (p_SubLine_rec.cp_id,
9883 p_cp_sll_tbl(l_cp_sll_counter).uom,
9884 p_period_start,
9885 p_period_type,
9886 p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9887 l_end_date,
9888 p_term_dt);
9889
9890 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9891 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements',
9892 'after calling OKS_BILL_SCH.Get_Unit_Price_Per_Uom '
9893 ||' result l_constant_sll_amt = ' || l_constant_sll_amt);
9894 END IF;
9895 IF l_constant_sll_amt IS NULL THEN
9896 x_return_status := G_RET_STS_ERROR;
9897 RAISE G_EXCEPTION_HALT_VALIDATION;
9898 END IF;
9899 --errorout_ad(' l_constant_sll_amt '||l_constant_sll_amt);
9900 ELSE
9901
9902
9903
9904 Get_Constant_sll_Amount(p_line_start_date => p_SubLine_rec.cp_start_dt,
9905 p_line_end_date => p_SubLine_rec.cp_end_dt,
9906 p_cycle_start_date => l_next_cycle_dt,
9907 p_remaining_amount => l_remaining_amt,
9908 P_uom_quantity => l_uom_quantity,
9909 P_tce_code => l_tce_code,
9910 x_constant_sll_amt => l_constant_sll_amt,
9911 x_return_status => x_return_status);
9912 END IF;
9913 -----errorout_ad('Get_Constant_sll_Amount = ' || l_constant_sll_amt);
9914
9915 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9916 RAISE G_EXCEPTION_HALT_VALIDATION;
9917 END IF;
9918 END IF;
9919
9920
9921 IF p_top_line_bs.COUNT > 0 THEN
9922 -----errorout_ad('IN SLL l_next_cycle_dt = ' || l_next_cycle_dt);
9923 l_tbs_ind := p_top_line_bs.FIRST;
9924 WHILE TRUNC(l_next_cycle_dt) > p_top_line_bs(l_tbs_ind).DATE_START AND l_tbs_ind < p_top_line_bs.LAST
9925 LOOP
9926 l_tbs_ind := p_top_line_bs.NEXT(l_tbs_ind);
9927 END LOOP;
9928
9929 -----errorout_ad('after while LOOP l_tbs_ind = ' || l_tbs_ind);
9930 -------errorout_ad('last = '|| p_top_line_bs.LAST);
9931
9932 ---chk l_next_cycle_dt if between previous and present record
9933 IF l_tbs_ind = p_top_line_bs.first THEN
9934 NULL;
9935
9936 ELSIF l_tbs_ind <= p_top_line_bs.LAST THEN
9937 -----errorout_ad('COMING IN');
9938
9939 l_element_end_dt := TRUNC(p_top_line_bs(l_tbs_ind ).DATE_END);
9940
9941
9942 IF TRUNC(l_next_cycle_dt) >= p_top_line_bs(l_tbs_ind ).DATE_START
9943 AND TRUNC(l_next_cycle_dt) <= l_element_end_dt THEN
9944
9945 NULL;
9946 ELSE
9947 l_tbs_ind := l_tbs_ind + 1;
9948 END IF;
9949 -----errorout_ad('FINAL l_tbs_ind = '|| l_tbs_ind);
9950
9951
9952
9953 elsif TRUNC(p_SubLine_rec.cp_start_dt) = p_top_line_bs(l_tbs_ind ).DATE_START THEN
9954 l_tbs_ind := p_top_line_bs.first;
9955 END IF;
9956 -----errorout_ad('IN sll LOOP l_tbs_ind = ' || l_tbs_ind);
9957 END IF;
9958
9959 ------------------------------------------------------------------------
9960 -- Begin partial period computation logic
9961 -- Developer Mani Choudhary
9962 -- Date 17-MAY-2005
9963 -- For manual covered levels, should take the billing uom as honoured in Get_Unit_Price_Per_Uom
9964 -------------------------------------------------------------------------
9965 IF p_subline_rec.cp_lse_id in (8,10,11,35) THEN
9966 l_uom := p_cp_sll_tbl(l_cp_sll_counter).uom;
9967
9968 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9969 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements',
9970 ' result l_uom = ' || l_uom);
9971 END IF;
9972
9973 END IF;
9974 OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
9975 (p_timeunit => p_cp_sll_tbl(l_cp_sll_counter).uom,
9976 x_return_status => x_return_status,
9977 x_quantity => l_uom_quantity ,
9978 x_timeunit => l_tce_code);
9979 IF x_return_status <> 'S' THEN
9980 RAISE G_EXCEPTION_HALT_VALIDATION;
9981 END IF;
9982 ------------------------------------------------------------------------
9983 -- End partial period computation logic
9984 ------------------------------------------------------------------------
9985
9986 -- Start - Added by PMALLARA - Bug #3992530
9987 Lvl_Element_cnt := l_period_counter - 1;
9988 Strm_Start_Date := p_cp_sll_tbl(l_cp_sll_counter).dt_start;
9989 LOOP -------------for level elements of one rule
9990 Lvl_Element_cnt := Lvl_Element_cnt + 1;
9991 -- End - Added by PMALLARA - Bug #3992530
9992 -----errorout_ad ('INSIDE LVL ELEMENT l_next_cycle_dt = ' || TO_CHAR(l_next_cycle_dt));
9993 -----errorout_ad('INSIDE LVL ELEMENT l_tbs_ind = ' || l_tbs_ind);
9994
9995 l_fnd_lvl_in_rec.line_start_date := p_SubLine_rec.cp_start_dt;
9996 l_fnd_lvl_in_rec.line_end_date := nvl((p_term_dt - 1),p_SubLine_rec.cp_end_dt);
9997 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
9998 -- Start - Modified by PMALLARA - Bug #3992530
9999 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period;
10000 -- End - Modified by PMALLARA - Bug #3992530
10001 l_fnd_lvl_in_rec.tuom := p_cp_sll_tbl(l_cp_sll_counter).uom;
10002 l_fnd_lvl_in_rec.bill_type := p_billing_type;
10003
10004 IF p_billing_type = 'T' THEN
10005
10006 l_fnd_lvl_in_rec.total_amount := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0) ;
10007
10008 -----errorout_ad('subline amount :' || l_fnd_lvl_in_rec.total_amount ));
10009
10010 ELSE --(for E and P just pass 0 as for lvlelement l_lvl_amt will be passed)
10011
10012 l_fnd_lvl_in_rec.total_amount := 0;
10013 END IF;
10014
10015 l_fnd_lvl_in_rec.invoice_offset_days := p_cp_sll_tbl(l_cp_sll_counter).invoice_offset_days;
10016 l_fnd_lvl_in_rec.interface_offset_days := p_cp_sll_tbl(l_cp_sll_counter).Interface_offset_days;
10017 --mchoudha added this parameter
10018 l_fnd_lvl_in_rec.uom_per_period := p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period;
10019
10020 -----errorout_ad(' l_fnd_lvl_in_rec.line_start_date = ' || l_fnd_lvl_in_rec.line_start_date);
10021 -----errorout_ad(' l_fnd_lvl_in_rec.line_end_date = ' || l_fnd_lvl_in_rec.line_end_date);
10022 -----errorout_ad(' l_fnd_lvl_in_rec.cycle_start_date = ' || to_char(l_fnd_lvl_in_rec.cycle_start_date));
10023 -----errorout_ad(' l_fnd_lvl_in_rec.uom_per_period = ' || l_fnd_lvl_in_rec.uom_per_period);
10024 -----errorout_ad(' l_fnd_lvl_in_rec.uom = ' || l_fnd_lvl_in_rec.uom);
10025 -------------------------------------------------------------------------
10026 -- Begin partial period computation logic
10027 -- Developer Mani Choudhary
10028 -- Date 09-MAY-2005
10029 -- Added two new parameters p_period_start and p_period_type
10030 -------------------------------------------------------------------------
10031
10032 -- Start - Modified by PMALLARA - Bug #3992530
10033 IF fnd_log.level_procedure >= fnd_log.g_current_runtime_level THEN
10034 fnd_log.string(fnd_log.level_procedure,G_MODULE_CURRENT||'.Create_cp_Lvl_elements.lvl_loop',
10035 'Calling oks_bill_util_pub.Get_next_bill_sch with parameters '
10036 ||'period start = ' || p_period_start
10037 ||', period type = ' || p_period_type);
10038 END IF;
10039 OKS_BILL_UTIL_PUB.Get_next_bill_sch
10040 (p_api_version => l_api_version,
10041 x_return_status => x_return_status,
10042 x_msg_count => l_msg_count,
10043 x_msg_data => l_msg_data,
10044 p_invoicing_rule_id => p_invoice_rulid,
10045 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
10046 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
10047 p_period_start => p_period_start,
10048 p_period_type => p_period_type,
10049 Strm_Start_Date => Strm_Start_Date);
10050 -- End - Modified by PMALLARA - Bug #3992530
10051
10052
10053 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch l_fnd_next_cycle = ' || x_return_status);
10054 -----errorout_ad('l_fnd_lvl_out_rec.next_cycle_date = ' || l_fnd_lvl_out_rec.next_cycle_date );
10055
10056
10057 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
10058 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
10059 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
10060 RAISE OKC_API.G_EXCEPTION_ERROR;
10061 END IF;
10062
10063
10064 -------Next cycle date given by Get_next_bill_sch is <= cp start date then do not create
10065 ------level element AND fro daily billing only chk Get_next_bill_sch is < cp start date.
10066
10067 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) <= p_SubLine_rec.cp_start_dt THEN
10068 -----errorout_ad('going in null');
10069 l_adjusted_amt := 0;
10070 l_tbs_ind := l_tbs_ind + 1;
10071 ELSE
10072 -----errorout_ad('going not in null');
10073 -----level element amount rounding and adjustment for last line
10074
10075
10076 IF p_billing_type = 'T' THEN ----FOR TYPE 'T'
10077
10078 ------------------------------------------------------------------------
10079 -- Begin partial period computation logic
10080 -- Developer Mani Choudhary
10081 -- Date 17-MAY-2005
10082 -- Added two new parameters p_period_start and p_period_type
10083 -------------------------------------------------------------------------
10084
10085 IF p_period_start is not null AND
10086 p_period_type is not null
10087 THEN
10088
10089 --to check if first partial period
10090 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) >
10091 p_SubLine_rec.cp_start_dt AND
10092 TRUNC(l_next_cycle_dt)<
10093 p_SubLine_rec.cp_start_dt
10094 THEN
10095 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
10096 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
10097 (p_start_date => p_SubLine_rec.cp_start_dt,
10098 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
10099 p_source_uom => l_fnd_lvl_in_rec.tuom,--nvl(p_SubLine_rec.cp_price_uom,l_uom), --line price uom
10100 p_period_type => p_period_type ,
10101 p_period_start => p_period_start);
10102
10103 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10104 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Service',
10105 'after calling OKS_TIME_MEASURES_PUB.get_quantity with period start '||p_period_start||' ,p_period_type '||p_period_type
10106 ||' result l_quantity = ' || l_quantity);
10107 END IF;
10108
10109 IF nvl(l_quantity,0) = 0 THEN
10110 x_return_status := G_RET_STS_ERROR;
10111 RAISE G_EXCEPTION_HALT_VALIDATION;
10112 END IF;
10113
10114 l_lvl_amt := nvl(l_constant_sll_amt*l_quantity/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
10115
10116 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10117 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Service',
10118 ' result l_lvl_amt = ' || l_lvl_amt);
10119 END IF;
10120 --mchoudha added else logic for WEEK kind of uoms
10121 ELSE
10122 l_lvl_amt := nvl(l_constant_sll_amt*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(p_SubLine_rec.cp_start_dt))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
10123
10124 END IF;
10125
10126 --errorout_ad(' l_quantity '||l_quantity);
10127 --errorout_ad(' l_total_quantity '||l_total_quantity);
10128 --errorout_ad(' l_lvl_amt '||l_lvl_amt);
10129 ELSE
10130
10131 IF p_period_start = 'CALENDAR' AND
10132 p_period_start is not null AND
10133 p_period_type is not null AND
10134 TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
10135 THEN
10136
10137 --errorout_ad(' uom '||nvl(p_SubLine_rec.cp_price_uom,l_uom));
10138 --errorout_ad(' start date '||to_char(l_next_cycle_dt));
10139 --errorout_ad(' start date '||to_char(TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1));
10140 --errorout_ad('p_period_start '||p_period_start);
10141 --errorout_ad('p_period_type '||p_period_type);
10142 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
10143 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
10144 (p_start_date => l_next_cycle_dt,
10145 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
10146 p_source_uom => l_fnd_lvl_in_rec.tuom,--nvl(p_SubLine_rec.cp_price_uom,l_uom), --line price uom
10147 p_period_type => p_period_type,
10148 p_period_start => p_period_start);
10149
10150 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10151 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Calendar',
10152 'after calling OKS_TIME_MEASURES_PUB.get_quantity with period start '||p_period_start||' ,p_period_type '||p_period_type
10153 ||' result l_quantity = ' || l_quantity);
10154 END IF;
10155
10156 --errorout_ad(' l_quantity '||l_quantity);
10157 --errorout_ad(' b4 calling quantity2');
10158 IF nvl(l_quantity,0) = 0 THEN
10159 x_return_status := G_RET_STS_ERROR;
10160 RAISE G_EXCEPTION_HALT_VALIDATION;
10161 END IF;
10162
10163
10164 l_lvl_amt := nvl(l_constant_sll_amt*l_quantity/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
10165
10166 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10167 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Calendar',
10168 ' result l_lvl_amt = ' || l_lvl_amt);
10169 END IF;
10170
10171 --mchoudha added else logic for WEEK kind of uoms
10172 ELSE
10173 l_lvl_amt := nvl(l_constant_sll_amt*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(l_next_cycle_dt))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
10174
10175 END IF;
10176 --errorout_ad(' l_lvl_amt '||l_lvl_amt);
10177
10178 ELSE
10179 l_lvl_amt := nvl(l_constant_sll_amt,0);
10180 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10181 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.full-period',
10182 ' l_lvl_amt = ' || l_lvl_amt);
10183 END IF;
10184
10185 --errorout_ad(' l_lvl_amt in else '||l_lvl_amt);
10186 END IF;
10187 END IF;
10188 ELSE --period start and period type are not null
10189
10190 l_adjusted_amt := 0;
10191 Get_Period_Frequency(p_line_start_date => p_SubLine_rec.cp_start_dt,
10192 p_line_end_date => p_SubLine_rec.cp_end_dt,
10193 p_cycle_start_date => l_next_cycle_dt,
10194 p_next_billing_date => trunc(l_fnd_lvl_out_rec.next_cycle_date),
10195 P_uom_quantity => l_uom_quantity,
10196 P_tce_code => l_tce_code,
10197 p_uom_per_period => p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period,
10198 x_period_freq => l_period_freq,
10199 x_return_status => x_return_status);
10200
10201
10202 -----errorout_ad('Get_Period_Frequency = ' || x_return_status);
10203 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
10204 RAISE G_EXCEPTION_HALT_VALIDATION;
10205 END IF;
10206
10207 l_lvl_amt := (NVL(l_period_freq,0) * NVL(l_constant_sll_amt,0) );
10208
10209 --l_lvl_amt := l_fnd_lvl_out_rec.cycle_amount;
10210
10211 END IF; --period start and period type are not null
10212 ELSE ------FOR E
10213 IF p_period_start = 'CALENDAR' AND
10214 p_period_start is not null AND
10215 p_period_type is not null AND
10216 TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
10217 THEN
10218 --errorout_ad(' Equal uom '||l_fnd_lvl_in_rec.tuom);
10219 --errorout_ad(' start date '||to_char(l_next_cycle_dt));
10220 --errorout_ad(' end date '||to_char(TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1));
10221 --errorout_ad('p_period_start '||p_period_start);
10222 --errorout_ad('p_period_type '||p_period_type);
10223 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
10224 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
10225 (p_start_date => l_next_cycle_dt,
10226 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
10227 p_source_uom => l_fnd_lvl_in_rec.tuom, --line price uom
10228 p_period_type => p_period_type,
10229 p_period_start => p_period_start);
10230
10231 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10232 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.Equal_amount.Calendar',
10233 'after calling OKS_TIME_MEASURES_PUB.get_quantity with period start '||p_period_start||' ,p_period_type '||p_period_type
10234 ||' result l_quantity = ' || l_quantity);
10235 END IF;
10236
10237 --errorout_ad(' l_quantity '||l_quantity);
10238
10239 IF nvl(l_quantity,0) = 0 THEN
10240 x_return_status := G_RET_STS_ERROR;
10241 RAISE G_EXCEPTION_HALT_VALIDATION;
10242 END IF;
10243 --determine full period end date
10244
10245 l_lvl_amt := TO_NUMBER(p_cp_sll_tbl(l_cp_sll_counter).amount)*l_quantity/l_fnd_lvl_in_rec.uom_per_period; --bugfix 5485442
10246
10247
10248 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10249 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.Equal_amount.Calendar',
10250 ' result l_lvl_amt = ' || l_lvl_amt);
10251 END IF;
10252 --mchoudha added else logic for WEEK kind of uoms
10253 ELSE
10254 l_lvl_amt := nvl(TO_NUMBER(p_cp_sll_tbl(l_cp_sll_counter).amount)*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(l_next_cycle_dt))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
10255
10256 END IF;
10257
10258 ELSE
10259
10260 l_lvl_amt := TO_NUMBER(p_cp_sll_tbl(l_cp_sll_counter).amount);
10261 END IF; --period start and period type are not null
10262 END IF; -- IF p_billing_type = 'T'
10263 -----if last level element to be inserted then find out the aDjusted amount
10264
10265 IF p_period_start is not null AND
10266 p_period_type is not null THEN
10267 l_last_cmp_date := l_end_date;
10268 ELSE
10269 l_last_cmp_date := p_SubLine_rec.cp_end_dt;
10270 END IF;
10271
10272 ---start inserting in level element
10273
10274 l_lvl_ele_tbl_in(l_tbl_seq).sequence_number := to_char(l_period_counter);
10275 l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id := p_line_rec.dnz_chr_id;
10276 l_lvl_ele_tbl_in(l_tbl_seq).cle_id := p_subline_rec.cp_id;
10277 l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id := p_line_rec.id;
10278
10279 IF l_next_cycle_dt < p_SubLine_rec.cp_start_dt AND l_period_counter = 1 THEN
10280 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC( p_SubLine_rec.cp_start_dt);
10281 ELSE
10282 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(l_next_cycle_dt);
10283 END IF;
10284 --errorout_ad('date start'||TRUNC(l_next_cycle_dt));
10285 --errorout_ad('date end'||TRUNC(TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1));
10286
10287 l_lvl_ele_tbl_in(l_tbl_seq).date_END := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
10288 --30-DEC-2005 mchoudha fixed bug#4895586
10289 IF (l_cp_sll_counter = l_cp_sll_last AND
10290 l_lvl_loop_counter = p_cp_sll_tbl(l_cp_sll_last).level_period) OR
10291 --Mani PPC changed p_SubLine_rec.cp_end_dt to l_last_cmp_date
10292 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
10293
10294 l_adjusted_amt := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0);
10295 ---errorout_bill('p_SubLine_rec.cp_amt = ' || p_SubLine_rec.cp_amt);
10296 l_lvl_ele_tbl_in(l_tbl_seq).date_END := l_last_cmp_date;
10297
10298 ELSE
10299 l_adjusted_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_lvl_amt, l_currency_code );
10300 END IF;
10301
10302 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10303
10304 /*commented and modified below for bug8609599
10305 --22-MAR-2006 mchoudha Changes for Partial periods CR3
10306 IF l_running_total < 0 THEN
10307 l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10308 ELSIF l_running_total < l_adjusted_amt THEN
10309 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_running_total;
10310 ELSE
10311 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10312 END IF;
10313 IF l_adjusted_amt < 0 THEN
10314 l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10315 END IF;
10316 */--bug8609599
10317 IF l_subline_total >= 0 THEN
10318 IF l_running_total < 0 THEN
10319 l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10320 ELSIF l_running_total < l_adjusted_amt THEN
10321 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_running_total;
10322 ELSE
10323 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10324 END IF;
10325 IF l_adjusted_amt < 0 THEN
10326 l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10327 END IF;
10328 ELSE
10329 IF l_running_total > 0 THEN
10330 l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10331 ELSIF l_running_total > l_adjusted_amt THEN
10332 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_running_total;
10333 ELSE
10334 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10335 END IF;
10336 IF l_adjusted_amt > 0 THEN
10337 l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10338 END IF;
10339 END IF;
10340 /*end of modification for bug8609599*/
10341 --
10342 l_running_total := l_running_total - l_lvl_ele_tbl_in(l_tbl_seq).amount;
10343
10344 l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl := l_fnd_lvl_out_rec.date_recievable_gl;
10345 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := TRUNC(l_fnd_lvl_out_rec.date_transaction);
10346 l_lvl_ele_tbl_in(l_tbl_seq).date_due := l_fnd_lvl_out_rec.date_due;
10347 l_lvl_ele_tbl_in(l_tbl_seq).date_print := l_fnd_lvl_out_rec.date_print;
10348 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
10349
10350 SELECT nvl(BILLED_AT_SOURCE , 'N')
10351 INTO l_billed_at_source
10352 FROM OKC_K_HEADERS_ALL_B
10353 WHERE id = p_Line_rec.dnz_chr_id;
10354
10355 if l_billed_at_source = 'Y' Then
10356 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := sysdate;
10357 else
10358 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
10359 end if;
10360
10361 l_lvl_ele_tbl_in(l_tbl_seq).rul_id := p_cp_sll_tbl(l_cp_sll_counter).id;
10362 l_lvl_ele_tbl_in(l_tbl_seq).object_version_number := OKC_API.G_MISS_NUM;
10363 l_lvl_ele_tbl_in(l_tbl_seq).created_by := OKC_API.G_MISS_NUM;
10364 l_lvl_ele_tbl_in(l_tbl_seq).creation_date := SYSDATE;
10365 l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by := OKC_API.G_MISS_NUM;
10366 l_lvl_ele_tbl_in(l_tbl_seq).last_update_date := SYSDATE;
10367
10368 -----errorout_ad ('Amount for subline lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
10369
10370 IF p_period_start is null OR
10371 p_period_type is null THEN
10372
10373 IF p_term_dt IS NOT NULL AND TRUNC(l_lvl_ele_tbl_in(l_tbl_seq).date_start) < TRUNC(p_term_dt) AND
10374 TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > TRUNC(p_term_dt) AND
10375 p_term_dt <= p_SubLine_rec.cp_end_dt THEN
10376
10377 -----errorout_ad('COMING IN');
10378
10379 l_lvl_ele_tbl_in(l_tbl_seq).date_END := (p_term_dt - 1);
10380
10381 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) > p_SubLine_rec.cp_end_dt THEN
10382
10383 l_term_amt := Find_term_amt(p_cycle_st_dt => l_lvl_ele_tbl_in(l_tbl_seq).date_start,
10384 p_term_dt => p_term_dt,
10385 p_cycle_end_dt => p_SubLine_rec.cp_end_dt,
10386 p_amount => nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
10387
10388 ELSE
10389
10390 l_term_amt := Find_term_amt(p_cycle_st_dt => l_lvl_ele_tbl_in(l_tbl_seq).date_start,
10391 p_term_dt => p_term_dt,
10392 p_cycle_end_dt => l_fnd_lvl_out_rec.next_cycle_date - 1,
10393 p_amount => nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
10394
10395 END IF; ---END OF NEXT CYCLE DT CHK
10396
10397
10398 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_term_amt, l_currency_code );
10399 END IF;
10400 END IF;
10401
10402 IF p_top_line_bs.COUNT > 0 THEN
10403
10404 IF l_tbs_ind <= p_top_line_bs.LAST THEN
10405
10406 IF l_tbs_ind = p_top_line_bs.LAST THEN
10407 l_bill_end_date := p_SubLine_rec.cp_end_dt;
10408 ELSE
10409 l_bill_end_date := p_top_line_bs(l_tbs_ind).date_end;
10410 END IF;
10411
10412 IF p_top_line_bs(l_tbs_ind).date_start <= l_lvl_ele_tbl_in(l_tbl_seq).date_start
10413 AND (l_bill_end_date) >= l_lvl_ele_tbl_in(l_tbl_seq).date_start THEN
10414
10415 p_top_line_bs(l_tbs_ind).amount := nvl(p_top_line_bs(l_tbs_ind).amount,0) +
10416 nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
10417
10418 --added so that top line and subline interface/invoice dates are same
10419
10420 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := p_top_line_bs(l_tbs_ind).date_to_interface;
10421 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := p_top_line_bs(l_tbs_ind).date_transaction;
10422
10423 l_tbs_ind := l_tbs_ind + 1;
10424 ELSE
10425
10426 NULL;
10427 END IF;
10428 END IF; ---End of l_tbs_ind <= p_top_line_bs.LAST condition added for bug#2655416
10429 END IF;
10430
10431 ---incremented here because if billing is DONE for last 6 months then
10432 ---sequence no. was starting from 7.
10433
10434 l_period_counter := l_period_counter + 1;
10435
10436
10437 END IF; ----end of check of next cycle dt <= line st_dt
10438
10439 l_next_cycle_dt := trunc(l_fnd_lvl_out_rec.next_cycle_date);
10440 l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_adjusted_amt,0);
10441 l_tbl_seq := l_tbl_seq + 1;
10442
10443 -----errorout_ad('l_bill_sch_amt = ' || l_bill_sch_amt);
10444 -----errorout_ad('compared with ' || p_cp_sll_tbl(l_cp_sll_counter).level_period);
10445
10446 EXIT WHEN (l_lvl_loop_counter = p_cp_sll_tbl(l_cp_sll_counter).level_period) OR
10447 (TRUNC(l_next_cycle_dt) > l_end_date) OR
10448 (TRUNC(l_next_cycle_dt) >= TRUNC(l_compare_dt));
10449
10450 l_lvl_loop_counter := l_lvl_loop_counter + 1;
10451
10452 END LOOP; ----end of level element loop
10453
10454 END IF;
10455 END IF ; ------TRUNC(l_next_cycle_dt) >= l_compare_dt
10456 ----if start of period counter < sll line period then only enter in lvl elemet loop
10457 EXIT WHEN (l_cp_sll_counter = p_cp_sll_tbl.LAST) OR
10458 (TRUNC(l_next_cycle_dt) > l_end_date);
10459
10460
10461 l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
10462 END LOOP; ---- sll loop
10463 END IF ;
10464
10465 IF l_cp_sll_counter < p_cp_sll_tbl.LAST AND p_top_line_bs.COUNT > 0 THEN
10466
10467 l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
10468
10469 FOR i IN l_cp_sll_counter .. p_cp_sll_tbl.LAST
10470 LOOP
10471
10472 Check_Existing_Lvlelement(
10473 p_sll_id => p_cp_sll_tbl(i).id,
10474 p_sll_dt_start => p_cp_sll_tbl(i).dt_start,
10475 p_uom => p_cp_sll_tbl(i).uom,
10476 p_uom_per_period => p_cp_sll_tbl(i).uom_per_period,
10477 p_cp_end_dt => p_SubLine_rec.cp_end_dt,
10478 x_next_cycle_dt => l_next_cycle_dt,
10479 x_last_cycle_dt => l_last_cycle_dt,
10480 x_period_counter => l_period_counter,
10481 x_sch_amt => l_bill_sch_amt,
10482 x_top_line_bs => p_top_line_bs,
10483 x_return_status => x_return_status);
10484 END LOOP;
10485
10486 -----errorout_ad('Check_Existing_Lvlelement5 = '|| x_return_status);
10487 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
10488 RAISE G_EXCEPTION_HALT_VALIDATION;
10489 END IF;
10490 END IF; ---END OF l_cp_sll_counter < p_cp_sll_tbl.LAST
10491
10492
10493
10494 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
10495
10496 IF l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end > p_subline_rec.cp_end_dt THEN
10497 l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end := p_subline_rec.cp_end_dt;
10498 END IF;
10499
10500 OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
10501 p_api_version => l_api_version,
10502 p_init_msg_list => l_init_msg_list,
10503 x_return_status => x_return_status,
10504 x_msg_count => l_msg_count,
10505 x_msg_data => l_msg_data,
10506 p_letv_tbl => l_lvl_ele_tbl_in,
10507 x_letv_tbl => l_lvl_ele_tbl_out);
10508
10509 -----errorout_ad('LEVEL ELEMENT INSERT STATUS FOR SUBLINE = ' || x_return_status);
10510
10511
10512 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
10513 RAISE G_EXCEPTION_HALT_VALIDATION;
10514 END IF;
10515 END IF;
10516
10517
10518 EXCEPTION
10519 WHEN G_EXCEPTION_HALT_VALIDATION THEN
10520 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
10521 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
10522 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
10523 RAISE OKC_API.G_EXCEPTION_ERROR;
10524 END IF;
10525 WHEN OTHERS THEN
10526 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10527 p_msg_name => G_UNEXPECTED_ERROR,
10528 p_token1 => G_SQLCODE_TOKEN,
10529 p_token1_value => sqlcode,
10530 p_token2 => G_SQLERRM_TOKEN,
10531 p_token2_value => sqlerrm);
10532
10533 x_return_status := G_RET_STS_UNEXP_ERROR;
10534 END Create_cp_lvl_elements;
10535
10536 Procedure Create_hdr_schedule
10537 (
10538 p_contract_id IN NUMBER,
10539 x_return_status OUT NOCOPY VARCHAR2,
10540 x_msg_count OUT NOCOPY NUMBER,
10541 x_msg_data OUT NOCOPY VARCHAR2)
10542 IS
10543
10544 Cursor l_contract_Csr Is
10545 SELECT hdr.id, TRUNC(hdr.start_date) start_dt,
10546 nvl(trunc(hdr.date_terminated - 1) ,TRUNC(hdr.end_date)) end_dt,
10547 hdr.inv_rule_id inv_rule_id, dtl.billing_schedule_type billing_schedule_type
10548 FROM okc_k_headers_b hdr, oks_k_headers_b dtl
10549 WHERE hdr.id = dtl.chr_id
10550 AND hdr.Id = p_contract_id ;
10551
10552
10553
10554 CURSOR l_hdr_sll_csr IS
10555 SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
10556 uom_per_period, uom_code, TRUNC(end_date) end_date,
10557 interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
10558 chr_id, level_amount
10559 FROM OKS_STREAM_LEVELS_B
10560 WHERE chr_id = p_contract_id
10561 ORDER BY sequence_no;
10562
10563
10564
10565 l_hdr_sll_rec l_hdr_sll_csr%ROWTYPE;
10566 l_Contract_Rec l_contract_Csr%Rowtype;
10567 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
10568 l_hdr_rec contract_rec_type;
10569
10570
10571 L_SLL_OUT_TBl StrmLvl_Out_tbl;
10572 l_sll_count NUMBER;
10573 l_index NUMBER;
10574
10575
10576 --
10577 l_api_version CONSTANT NUMBER := 1.0;
10578 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
10579 --
10580 -------------------------------------------------------------------------
10581 -- Begin partial period computation logic
10582 -- Developer Mani Choudhary
10583 -- Date 04-MAY-2005
10584 -------------------------------------------------------------------------
10585 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
10586 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
10587 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
10588 l_return_status VARCHAR2(30);
10589 -------------------------------------------------------------------------
10590 -- End partial period computation logic
10591 -- Date 04-MAY-2005
10592 -------------------------------------------------------------------------
10593
10594 Begin
10595 x_return_status := 'S';
10596 l_header_billing := p_contract_id;
10597
10598 ------------find out the hdr details
10599
10600 Open l_contract_Csr;
10601 Fetch l_contract_Csr Into l_contract_Rec;
10602
10603 If l_contract_Csr%Notfound then
10604 Close l_contract_Csr;
10605 x_return_status := 'E';
10606 RAISE G_EXCEPTION_HALT_VALIDATION;
10607 End If;
10608 Close l_contract_Csr;
10609
10610 l_hdr_rec.id := l_contract_rec.id;
10611 l_hdr_rec.start_dt := l_contract_rec.start_dt;
10612 l_hdr_rec.end_dt := l_contract_rec.end_dt;
10613
10614
10615 -------------------------------------------------------------------------
10616 -- Begin partial period computation logic
10617 -- Developer Mani Choudhary
10618 -- Date 09-MAY-2005
10619 -------------------------------------------------------------------------
10620
10621
10622 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
10623 (
10624 p_hdr_id => l_contract_rec.id,
10625 p_org_id => NULL,
10626 x_period_start => l_period_start,
10627 x_period_type => l_period_type,
10628 x_price_uom => l_price_uom,
10629 x_return_status => x_return_status);
10630
10631 IF x_return_status <> 'S' THEN
10632 RAISE G_EXCEPTION_HALT_VALIDATION;
10633 END IF;
10634
10635 -------------------------------------------------------------------------
10636 -- End partial period computation logic
10637 -- Date 09-MAY-2005
10638 -------------------------------------------------------------------------
10639 l_sll_tbl.DELETE;
10640 l_index := 1;
10641 ----make sll tbl
10642
10643 FOR l_hdr_SlL_rec IN l_hdr_sll_Csr
10644 LOOP
10645
10646
10647 l_sll_tbl(l_index).id := l_hdr_SlL_rec.id;
10648 l_sll_tbl(l_index).cle_id := NULL;
10649 l_sll_tbl(l_index).chr_id := p_contract_id;
10650 l_sll_tbl(l_index).dnz_chr_id := p_contract_id;
10651 l_sll_tbl(l_index).uom_code := l_hdr_SlL_rec.uom_code;
10652 l_sll_tbl(l_index).sequence_no := l_hdr_SlL_rec.sequence_no;
10653 l_sll_tbl(l_index).Start_Date := l_hdr_SlL_rec.Start_Date;
10654 l_sll_tbl(l_index).end_Date := l_hdr_SlL_rec.end_Date;
10655 l_sll_tbl(l_index).level_periods := l_hdr_SlL_rec.level_periods;
10656 l_sll_tbl(l_index).uom_per_period := l_hdr_SlL_rec.uom_per_period;
10657 l_sll_tbl(l_index).level_amount := l_hdr_SlL_rec.level_amount;
10658 l_sll_tbl(l_index).invoice_offset_days := l_hdr_SlL_rec.invoice_offset_days;
10659 l_sll_tbl(l_index).interface_offset_days := l_hdr_SlL_rec.interface_offset_days;
10660
10661 l_index := l_index + 1;
10662 END LOOP;
10663
10664
10665 IF l_sll_tbl.COUNT = 0 THEN
10666 RETURN;
10667 END IF;
10668
10669
10670
10671 -----create rules with category 'SLL'
10672 --------------------------------------------------------------------------
10673 -- Begin partial period computation logic
10674 -- Developer Mani Choudhary
10675 -- Date 09-MAY-2005
10676 -- Added two new parameters P_period_start,P_period_type in procedural call
10677 ---------------------------------------------------------------------------
10678 Create_Stream_Level ( p_billing_type => nvl(l_contract_rec.billing_schedule_type, 'T'),
10679 p_strm_lvl_tbl => l_sll_tbl,
10680 p_dnz_chr_id => l_Contract_Rec.id,
10681 p_subline_call => 'H',
10682 p_line_amt => NULL,
10683 p_subline_amt => NULL,
10684 p_sll_start_dt => l_contract_rec.start_dt,
10685 p_end_dt => l_contract_rec.end_dt,
10686 p_period_start => l_period_start,
10687 p_period_type => l_period_type,
10688 x_sll_out_tbl => l_sll_out_tbl,
10689 x_return_status => x_return_status);
10690 -------------------------------------------------------------------------
10691 -- End partial period computation logic
10692 -- Date 09-MAY-2005
10693 -------------------------------------------------------------------------
10694 -----errorout_ad('Create_Stream_Level status = ' || x_return_status);
10695 -----errorout_ad('TOTAL SLL COUNT for line'|| TO_CHAR(l_sll_out_tbl.COUNT));
10696
10697 IF x_return_status <> 'S' THEN
10698 RAISE G_EXCEPTION_HALT_VALIDATION;
10699 END IF;
10700
10701 ----if l_sll_out_tbl.count > 0 then insert lines into oks_level_elements
10702 IF l_sll_out_tbl.count > 0 then
10703
10704 l_currency_code := Find_Currency_Code(
10705 p_cle_id => NULL,
10706 p_chr_id => p_contract_id);
10707 IF l_currency_code IS NULL THEN
10708 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
10709 x_return_status := 'E';
10710 RETURN;
10711 END IF;
10712
10713
10714 Create_Hdr_Level_elements(
10715 p_billing_type => nvl(l_contract_rec.billing_schedule_type, 'T'),
10716 p_sll_tbl => l_sll_out_tbl,
10717 p_hdr_rec => l_hdr_rec,
10718 p_invoice_ruleid => l_contract_rec.inv_rule_id,
10719 p_called_from => 2,
10720 p_period_start => l_period_start,
10721 p_period_type => l_period_type,
10722 x_return_status => x_return_status);
10723
10724 -----errorout_ad('Create_Hdr_Level_elements status = ' || x_return_status);
10725
10726 IF x_return_status <> 'S' THEN
10727 RAISE G_EXCEPTION_HALT_VALIDATION;
10728 END IF;
10729 ELSE
10730 -----errorout_ad('sll rule count = ' || to_char(0));
10731 x_return_status := 'E';
10732 RAISE G_EXCEPTION_HALT_VALIDATION;
10733 END IF ;
10734
10735 l_header_billing := NULL;
10736
10737 EXCEPTION
10738 WHEN G_EXCEPTION_HALT_VALIDATION THEN
10739 l_currency_code := NULL;
10740 l_header_billing := NULL;
10741
10742 WHEN OTHERS THEN
10743 l_currency_code := NULL;
10744 l_header_billing := NULL;
10745 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10746 p_msg_name => G_UNEXPECTED_ERROR,
10747 p_token1 => G_SQLCODE_TOKEN,
10748 p_token1_value => sqlcode,
10749 p_token2 => G_SQLERRM_TOKEN,
10750 p_token2_value => sqlerrm);
10751
10752 x_return_status := G_RET_STS_UNEXP_ERROR;
10753
10754
10755 END Create_hdr_schedule;
10756
10757
10758 PROCEDURE Del_line_sll_lvl(p_line_id IN NUMBER,
10759 x_return_status OUT NOCOPY VARCHAR2,
10760 x_msg_count OUT NOCOPY NUMBER,
10761 x_msg_data OUT NOCOPY VARCHAR2)
10762
10763 IS
10764 ----will delete all lvlelements , sll for line if billing all sll billing type <> 'P'
10765 ---it will be called from create_bill_sch_rules.
10766
10767
10768
10769 BEGIN
10770 x_return_status := 'S';
10771
10772
10773 --------delete lvl elemets for line
10774 DELETE FROM OKS_LEVEL_ELEMENTS
10775 WHERE rul_id IN (SELECT sll.id
10776 FROM OKS_STREAM_LEVELS_B sll
10777 WHERE sll.cle_id = p_line_id);
10778
10779 ---delete sll info
10780 DELETE FROM OKS_STREAM_LEVELS_B
10781 WHERE cle_id = p_line_id;
10782
10783 ----update billing type to 'P'
10784
10785 UPDATE oks_k_lines_b
10786 SET billing_schedule_type = 'P'
10787 WHERE cle_id = p_line_id;
10788
10789
10790
10791 EXCEPTION
10792 WHEN OTHERS THEN
10793 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10794 p_msg_name => G_UNEXPECTED_ERROR,
10795 p_token1 => G_SQLCODE_TOKEN,
10796 p_token1_value => sqlcode,
10797 p_token2 => G_SQLERRM_TOKEN,
10798 p_token2_value => sqlerrm);
10799
10800 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
10801
10802 END Del_line_sll_lvl;
10803
10804
10805 Procedure Delete_contract_bs_sll
10806 (
10807 p_contract_id IN NUMBER,
10808 x_return_status OUT NOCOPY VARCHAR2,
10809 x_msg_count OUT NOCOPY NUMBER,
10810 x_msg_data OUT NOCOPY VARCHAR2)
10811 IS
10812 BEGIN
10813 x_return_status := 'S';
10814
10815
10816 --------delete lvl elemets for the whole contract
10817 DELETE FROM OKS_LEVEL_ELEMENTS
10818 WHERE dnz_chr_id = p_contract_id;
10819
10820
10821 ---delete sll info for contract (header,line and subline)
10822 DELETE FROM OKS_STREAM_LEVELS_B
10823 WHERE dnz_chr_id = p_contract_id;
10824
10825
10826
10827 EXCEPTION
10828 WHEN OTHERS THEN
10829 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10830 p_msg_name => G_UNEXPECTED_ERROR,
10831 p_token1 => G_SQLCODE_TOKEN,
10832 p_token1_value => sqlcode,
10833 p_token2 => G_SQLERRM_TOKEN,
10834 p_token2_value => sqlerrm);
10835
10836 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
10837
10838 END Delete_contract_bs_sll;
10839
10840 Procedure Populate_end_date(p_line_id IN NUMBER,
10841 p_end_date IN DATE,
10842 p_term_date IN DATE,
10843 p_lse_id IN NUMBER,
10844 x_return_status OUT NOCOPY VARCHAR2)
10845
10846 IS
10847
10848 Cursor l_LineSch_Csr is
10849 SELECT sll.start_date,sll.uom_code, sll.uom_per_period,
10850 element.id,element.sequence_number,element.date_start,
10851 element.date_end,element.date_completed
10852 FROM oks_level_elements element, oks_stream_levels_b sll
10853 WHERE sll.id = element.rul_id
10854 AND sll.cle_id = p_line_id
10855 ORDER BY element.date_start;
10856
10857 CURSOR l_line_sll_csr IS
10858 SELECT id, start_date, OKC_TIME_UTIL_PUB.get_enddate(
10859 start_date,
10860 uom_code,
10861 uom_per_period * level_periods) sll_end_date
10862 FROM oks_stream_levels_b
10863 WHERE cle_id = p_line_id;
10864
10865 CURSOR l_bcl_csr(p_line_id number, p_start_date date) IS
10866 SELECT date_billed_to
10867 FROM oks_bill_cont_lines
10868 WHERE cle_id = p_line_id
10869 AND TRUNC(date_billed_from) = TRUNC(p_start_date)
10870 AND bill_action = 'RI';
10871
10872 CURSOR l_bsl_csr(p_line_id number, p_start_date date) IS
10873 SELECT bsl.date_billed_to
10874 FROM oks_bill_sub_lines bsl, oks_bill_cont_lines bcl
10875 WHERE bsl.cle_id = p_line_id
10876 AND TRUNC(bsl.date_billed_from) = TRUNC(p_start_date)
10877 AND bsl.bcl_id = bcl.id
10878 AND bcl.bill_action = 'RI';
10879
10880
10881
10882 l_LineSch_rec l_LineSch_Csr%ROWTYPE;
10883 l_line_sll_rec l_line_sll_csr%ROWTYPE;
10884 i number;
10885 l_end_dt Date;
10886 l_line_end_dt date;
10887 l_uom_code varchar2(3);
10888 l_uom_per_period number;
10889 l_period_end_dt date;
10890
10891 BEGIN
10892
10893 --The procedure update the sll end date and level elements end date for a line and subline.
10894 ---this is written as end date in oks_stream_levels_b and oks_level_elements didn't get migrated .
10895
10896 x_return_status := 'S';
10897 l_period_end_dt := null;
10898
10899 l_lvl_ele_tbl_in.DELETE;
10900
10901 FOR l_line_sll_rec IN l_line_sll_csr
10902 LOOP
10903 update oks_stream_levels_b set end_date = l_line_sll_rec.sll_end_date
10904 WHERE id = l_line_sll_rec.id;
10905 END LOOP;
10906
10907
10908 i := 1;
10909
10910 FOR l_LineSch_rec IN l_LineSch_csr
10911 LOOP
10912
10913 if i > 1 then
10914 l_lvl_ele_tbl_in(i - 1).Date_end := l_LineSch_rec.date_start - 1;
10915 END IF;
10916
10917 l_lvl_ele_tbl_in(i).Id := l_LineSch_rec.id;
10918 l_lvl_ele_tbl_in(i).date_start := l_LineSch_rec.date_start;
10919 l_lvl_ele_tbl_in(i).date_completed := l_LineSch_rec.date_completed;
10920
10921 l_uom_code := l_LineSch_rec.uom_code;
10922 l_uom_per_period := l_LineSch_rec.uom_per_period;
10923
10924 i := i + 1;
10925 END LOOP;
10926
10927 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
10928
10929 l_end_dt := OKC_TIME_UTIL_PUB.get_enddate(
10930 l_lvl_ele_tbl_in(i - 1).Date_start,
10931 l_uom_code,
10932 l_uom_per_period);
10933
10934 -----errorout_ad('calculated date = '|| l_end_dt || ' start = '|| l_lvl_ele_tbl_in(i - 1).Date_start);
10935
10936 ---IF CALCULATED end date > line end date then take line end date
10937
10938 IF p_term_date IS NOT NULL THEN
10939
10940 IF l_lvl_ele_tbl_in(i-1).date_completed IS NOT NULL THEN --- for billed
10941
10942 IF p_lse_id IN (1, 12, 14, 19, 46) THEN ---top line
10943 ---get period end date bill_cont_lines
10944 OPEN l_bcl_Csr(p_line_id, l_lvl_ele_tbl_in(i-1).date_start );
10945 FETCH l_bcl_Csr INTO l_period_end_dt;
10946 IF l_bcl_Csr%NOTFOUND THEN
10947 l_period_end_dt := null;
10948 END IF;
10949 CLOSE l_bcl_Csr;
10950 ELSE ---sub line
10951 ---get period end date bill_sub _lines
10952 OPEN l_bsl_Csr(p_line_id, l_lvl_ele_tbl_in(i-1).date_start);
10953 FETCH l_bsl_Csr INTO l_period_end_dt;
10954 IF l_bsl_Csr%NOTFOUND THEN
10955 l_period_end_dt := null;
10956 END IF;
10957 CLOSE l_bsl_Csr;
10958 END IF; ---end of top line chk
10959
10960 END IF; ---end of bill chk
10961
10962 IF l_period_end_dt IS NOT NULL THEN ---rec in bill tbl
10963 l_lvl_ele_tbl_in(i-1).date_end := l_period_end_dt;
10964 ELSE
10965
10966 IF l_end_dt > (p_term_date - 1) AND l_lvl_ele_tbl_in(i-1).date_end < p_term_date THEN
10967
10968 l_lvl_ele_tbl_in(i-1).date_end := (p_term_date - 1);
10969 ELSE
10970 l_lvl_ele_tbl_in(i-1).date_end := l_end_dt;
10971 END IF;
10972 END IF; ----end of l_period_end_dt null chk
10973
10974 ELSE ---not terminated
10975
10976 IF P_END_DATE IS NOT NULL AND l_end_dt > p_END_DATE THEN
10977 l_lvl_ele_tbl_in(i-1).date_end := p_END_DATE;
10978 -----errorout_ad('p_end_date = '|| p_end_date);
10979 ELSE
10980 l_lvl_ele_tbl_in(i-1).date_end := l_end_dt;
10981 -----errorout_ad('l_end_dt = '|| l_end_dt);
10982 END IF;
10983 end if;
10984
10985 IF l_lvl_ele_tbl_in(i-1).date_end > p_END_DATE THEN
10986 l_lvl_ele_tbl_in(i-1).date_end := p_END_DATE;
10987 END IF;
10988
10989 FOR i IN l_lvl_ele_tbl_in.FIRST .. l_lvl_ele_tbl_in.LAST
10990 LOOP
10991
10992 UPDATE oks_level_elements SET date_end = TRUNC(l_lvl_ele_tbl_in(i).date_end)
10993 WHERE id = l_lvl_ele_tbl_in(i).id;
10994 END LOOP;
10995 END IF; ---tbl count chk.
10996
10997
10998
10999
11000 EXCEPTION
11001 WHEN OTHERS THEN
11002 x_return_status := G_RET_STS_UNEXP_ERROR;
11003
11004 END populate_end_date;
11005
11006
11007
11008 Procedure UPDATE_BS_ENDDATE(p_line_id IN NUMBER,
11009 p_chr_id IN NUMBER,
11010 x_return_status OUT NOCOPY VARCHAR2)
11011
11012 IS
11013
11014
11015 Cursor l_hdrSch_Csr Is
11016 SELECT sll.uom_code, sll.uom_per_period,
11017 element.id,element.date_start
11018 FROM oks_level_elements element, oks_stream_levels_b sll
11019 WHERE sll.id = element.rul_id
11020 AND sll.chr_id = p_chr_id
11021 ORDER BY element.date_start;
11022
11023 CURSOR l_hdr_sll_csr IS
11024 SELECT id, start_date, OKC_TIME_UTIL_PUB.get_enddate(
11025 start_DATE,
11026 uom_code,
11027 uom_per_period * level_periods) sll_end_date
11028 FROM oks_stream_levels_b
11029 WHERE chr_id = p_chr_id;
11030
11031 CURSOR l_line_csr IS
11032 SELECT TRUNC(end_date) end_date, trunc(date_terminated) date_terminated, lse_id
11033 FROM okc_k_lines_b
11034 WHERE id = p_line_id;
11035
11036 CURSOR l_subline_csr IS
11037 SELECT ID,TRUNC(end_date) end_date, trunc(date_terminated) date_terminated
11038 FROM okc_k_lines_b
11039 WHERE cle_id = p_line_id
11040 AND lse_id in(35,7,8,9,10,11,13,18,25);
11041
11042 i NUMBER;
11043 l_end_dt date;
11044 l_line_rec l_line_csr%ROWTYPE;
11045 l_Subline_rec l_subline_csr%ROWTYPE;
11046 l_hdr_sll_rec l_hdr_sll_csr%rowtype;
11047 l_hdrSch_rec l_hdrSch_Csr%rowtype;
11048
11049 l_uom_code varchar2(3);
11050 l_uom_per_period number;
11051
11052
11053
11054 BEGIN
11055
11056 --The procedure update the sll end date and level elements end date for a hdr schedule.
11057 ---this is written as end date in oks_stream_levels_b and oks_level_elements didn't get migrated .
11058
11059
11060
11061 x_return_status := 'S';
11062 l_lvl_ele_tbl_in.DELETE;
11063
11064 IF p_chr_id IS NOT NULL THEN
11065 FOR l_hdr_sll_rec IN l_hdr_sll_csr
11066 LOOP
11067 update oks_stream_levels_b set end_date = l_hdr_sll_rec.sll_end_date
11068 WHERE id = l_hdr_sll_rec.id;
11069 END LOOP;
11070
11071
11072 i := 1;
11073
11074 FOR l_hdrSch_rec IN l_hdrsch_csr
11075 LOOP
11076
11077 if i > 1 then
11078 l_lvl_ele_tbl_in(i - 1).Date_end := l_hdrSch_rec.date_start - 1;
11079 END IF;
11080
11081 l_lvl_ele_tbl_in(i).Id := l_hdrSch_rec.id;
11082 l_lvl_ele_tbl_in(i).date_start := l_hdrSch_rec.date_start;
11083
11084 l_uom_code := l_hdrSch_rec.uom_code;
11085 l_uom_per_period := l_hdrSch_rec.uom_per_period;
11086
11087
11088 i := i + 1;
11089 END LOOP;
11090
11091 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
11092 l_end_dt := OKC_TIME_UTIL_PUB.get_enddate(
11093 l_lvl_ele_tbl_in(i - 1).Date_start,
11094 l_uom_code,
11095 l_uom_per_period);
11096
11097 l_lvl_ele_tbl_in(i-1).date_end := l_end_dt;
11098
11099
11100 FOR i IN l_lvl_ele_tbl_in.FIRST .. l_lvl_ele_tbl_in.LAST
11101 LOOP
11102
11103 UPDATE oks_level_elements SET date_end = TRUNC(l_lvl_ele_tbl_in(i).date_end)
11104 WHERE id = l_lvl_ele_tbl_in(i).id;
11105 END LOOP;
11106 END IF;
11107
11108
11109 ELSIF p_line_id IS NOT null THEN
11110
11111 OPEN l_Line_Csr;
11112 FETCH l_Line_Csr INTO l_Line_rec;
11113 IF l_Line_Csr%NOTFOUND THEN
11114 CLOSE l_Line_Csr;
11115 RETURN;
11116 END IF;
11117 CLOSE l_Line_Csr;
11118
11119 Populate_end_date(p_line_id => p_line_id,
11120 p_end_date => l_line_rec.end_date,
11121 p_term_date => l_line_rec.date_terminated,
11122 p_lse_id => l_line_rec.lse_id,
11123 x_return_status => x_return_status);
11124
11125 IF x_return_status <> 'S' THEN
11126 RAISE G_EXCEPTION_HALT_VALIDATION;
11127 END IF;
11128
11129
11130 IF l_line_rec.lse_id IN (1,12,14,19) THEN ---if line is top line
11131
11132 FOR l_subline_rec IN l_subline_csr
11133 LOOP
11134
11135 Populate_end_date(p_line_id => l_subline_rec.id,
11136 p_end_date => l_subline_rec.end_date,
11137 p_term_date => l_subline_rec.date_terminated,
11138 p_lse_id => 0,
11139 x_return_status => x_return_status);
11140
11141
11142
11143 IF x_return_status <> 'S' THEN
11144 RAISE G_EXCEPTION_HALT_VALIDATION;
11145 END IF;
11146 END LOOP;
11147
11148 END IF;
11149
11150 END IF; ---for line/hdr
11151
11152 COMMIT;
11153 EXCEPTION
11154 WHEN G_EXCEPTION_HALT_VALIDATION THEN
11155 ROLLBACK;
11156 x_return_status := 'E';
11157
11158 WHEN OTHERS THEN
11159 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11160 p_msg_name => G_UNEXPECTED_ERROR,
11161 p_token1 => G_SQLCODE_TOKEN,
11162 p_token1_value => sqlcode,
11163 p_token2 => G_SQLERRM_TOKEN,
11164 p_token2_value => sqlerrm);
11165
11166 x_return_status := G_RET_STS_UNEXP_ERROR;
11167
11168
11169 END update_bs_enddate;
11170
11171
11172
11173 PROCEDURE Rollup_lvl_amt(
11174 p_Line_Rec IN Line_Det_Type,
11175 p_SubLine_rec IN Prod_Det_Type,
11176 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
11177 x_return_status OUT NOCOPY VARCHAR2)
11178 IS
11179
11180 CURSOR l_cp_BS_csr(p_cp_id NUMBER) IS
11181 SELECT id, trunc(date_start) date_start,
11182 amount, trunc(date_end) date_end
11183 FROM oks_level_elements element
11184 WHERE cle_id = p_cp_id
11185 ORDER by date_start;
11186
11187 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
11188 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11189 l_index number;
11190 l_top_bs_ind number;
11191 l_cp_bs_ind number;
11192
11193
11194 BEGIN
11195 x_return_status := OKC_API.G_RET_STS_SUCCESS;
11196
11197 l_cp_bs_tbl.DELETE;
11198 l_index := 1;
11199
11200 FOR l_cp_BS_rec IN l_cp_BS_csr(p_SubLine_rec.cp_id)
11201 LOOP
11202 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
11203 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
11204 l_cp_bs_tbl(l_index).date_end := l_cp_BS_rec.date_end;
11205 l_cp_bs_tbl(l_index).Amount := l_cp_BS_rec.amount;
11206
11207 l_index := l_index + 1;
11208 END LOOP;
11209
11210 IF l_cp_bs_tbl.COUNT <= 0 THEN
11211 RETURN;
11212 END IF;
11213
11214 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
11215 l_top_bs_ind := p_top_line_bs.FIRST;
11216 -----errorout_ad('top line bs first = ' || l_top_bs_ind);
11217
11218 WHILE TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) > TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) AND
11219 l_top_bs_ind < p_top_line_bs.LAST
11220 LOOP
11221 l_top_bs_ind := p_top_line_bs.NEXT(l_top_bs_ind);
11222 END LOOP;
11223
11224 -----errorout_ad('after while loop in adj = ' || l_top_bs_ind);
11225 ---chk first cp bs.st_dt if between previous and present record
11226
11227
11228 IF l_top_bs_ind = p_top_line_bs.first THEN
11229 NULL;
11230
11231 ELSIF l_top_bs_ind <= p_top_line_bs.LAST THEN
11232
11233 l_top_bs_ind := l_top_bs_ind - 1;
11234 IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= p_top_line_bs(l_top_bs_ind ).DATE_START
11235 AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= p_top_line_bs(l_top_bs_ind ).DATE_end THEN
11236
11237 NULL;
11238 ELSE
11239 l_top_bs_ind := l_top_bs_ind + 1;
11240 END IF;
11241
11242 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) THEN
11243 NULL;
11244
11245 end if;
11246
11247
11248 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
11249 LOOP
11250
11251 IF l_top_bs_ind <= p_top_line_bs.LAST THEN
11252
11253 p_top_line_bs(l_top_bs_ind).amount := nvl(p_top_line_bs(l_top_bs_ind).amount,0) + nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
11254 l_top_bs_ind := l_top_bs_ind + 1;
11255
11256 END IF;
11257 END LOOP;
11258
11259
11260 EXCEPTION
11261 WHEN G_EXCEPTION_HALT_VALIDATION THEN
11262 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11263 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11264 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11265 RAISE OKC_API.G_EXCEPTION_ERROR;
11266 END IF;
11267 WHEN OTHERS THEN
11268 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11269 p_msg_name => G_UNEXPECTED_ERROR,
11270 p_token1 => G_SQLCODE_TOKEN,
11271 p_token1_value => sqlcode,
11272 p_token2 => G_SQLERRM_TOKEN,
11273 p_token2_value => sqlerrm);
11274
11275 x_return_status := G_RET_STS_UNEXP_ERROR;
11276
11277 end Rollup_lvl_amt;
11278
11279
11280 /* Overloaded procedure for OKL bug# 3307323*/
11281 Procedure Create_Bill_Sch_Rules
11282 (
11283 p_slh_rec IN StreamHdr_Type
11284 , p_sll_tbl IN StreamLvl_tbl
11285 , p_invoice_rule_id IN Number
11286 , x_bil_sch_out_tbl OUT NOCOPY ItemBillSch_tbl
11287 , x_return_status OUT NOCOPY Varchar2
11288 )
11289
11290 IS
11291
11292 BEGIN
11293
11294 x_return_status := 'S';
11295
11296 END Create_Bill_Sch_Rules;
11297
11298
11299 PROCEDURE Adjust_cp_trx_inv_dt(
11300 p_top_bs_tbl IN oks_bill_level_elements_pvt.letv_tbl_type,
11301 p_SubLine_id IN NUMBER,
11302 x_cp_line_bs OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
11303 x_return_status OUT NOCOPY VARCHAR2)
11304 IS
11305
11306 CURSOR l_cp_BS_csr IS
11307 SELECT id, trunc(date_start) date_start,
11308 date_to_interface, date_transaction, object_version_number
11309 FROM oks_level_elements
11310 WHERE cle_id = p_SubLine_id
11311 AND date_completed IS NULL
11312 ORDER BY date_start;
11313
11314 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
11315 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11316 l_index number;
11317 l_top_bs_ind number;
11318 l_cp_bs_ind number;
11319
11320
11321 BEGIN
11322 x_return_status := OKC_API.G_RET_STS_SUCCESS;
11323
11324 l_cp_bs_tbl.DELETE;
11325 l_index := 1;
11326
11327 FOR l_cp_BS_rec IN l_cp_BS_csr
11328 LOOP
11329 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
11330 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
11331 l_cp_bs_tbl(l_index).date_transaction := l_cp_BS_rec.date_transaction;
11332 l_cp_bs_tbl(l_index).date_to_interface := l_cp_BS_rec.date_to_interface;
11333 l_cp_bs_tbl(l_index).object_version_number := l_cp_BS_rec.object_version_number;
11334
11335
11336 l_index := l_index + 1;
11337 END LOOP;
11338
11339 IF l_cp_bs_tbl.COUNT <= 0 THEN
11340 RETURN;
11341 END IF;
11342
11343 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
11344 l_top_bs_ind := p_top_bs_tbl.FIRST;
11345
11346
11347 WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > p_top_bs_tbl(l_top_bs_ind).DATE_START AND
11348 l_top_bs_ind < p_top_bs_tbl.LAST
11349 LOOP
11350 l_top_bs_ind := p_top_bs_tbl.NEXT(l_top_bs_ind);
11351 END LOOP;
11352
11353 ---chk first cp bs.st_dt if between previous and present record
11354
11355 IF l_top_bs_ind = p_top_bs_tbl.first THEN
11356 NULL;
11357
11358 ELSIF l_cp_bs_tbl(l_cp_bs_ind).date_start >= p_top_bs_tbl(l_top_bs_ind - 1).DATE_START
11359 AND l_cp_bs_tbl(l_cp_bs_ind).date_start < p_top_bs_tbl(l_top_bs_ind ).DATE_START THEN
11360
11361 l_top_bs_ind := l_top_bs_ind - 1;
11362
11363 elsif l_cp_bs_tbl(l_cp_bs_ind).date_start = p_top_bs_tbl(l_top_bs_ind).DATE_START THEN
11364 null;
11365 END IF;
11366
11367 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
11368 LOOP
11369
11370 IF l_top_bs_ind <= p_top_bs_tbl.LAST THEN
11371
11372 x_cp_line_bs(l_cp_bs_ind).id := l_cp_bs_tbl(l_cp_bs_ind).id;
11373 x_cp_line_bs(l_cp_bs_ind).date_start := l_cp_bs_tbl(l_cp_bs_ind).date_start;
11374 x_cp_line_bs(l_cp_bs_ind).date_transaction := p_top_bs_tbl(l_top_bs_ind).date_transaction;
11375 x_cp_line_bs(l_cp_bs_ind).date_to_interface := p_top_bs_tbl(l_top_bs_ind).date_to_interface;
11376 x_cp_line_bs(l_cp_bs_ind).object_version_number := l_cp_bs_tbl(l_cp_bs_ind).object_version_number;
11377
11378 l_top_bs_ind := l_top_bs_ind + 1;
11379
11380 END IF;
11381 END LOOP;
11382
11383
11384 EXCEPTION
11385 WHEN G_EXCEPTION_HALT_VALIDATION THEN
11386 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11387 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11388 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11389 RAISE OKC_API.G_EXCEPTION_ERROR;
11390 END IF;
11391 WHEN OTHERS THEN
11392 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11393 p_msg_name => G_UNEXPECTED_ERROR,
11394 p_token1 => G_SQLCODE_TOKEN,
11395 p_token1_value => sqlcode,
11396 p_token2 => G_SQLERRM_TOKEN,
11397 p_token2_value => sqlerrm);
11398
11399 x_return_status := G_RET_STS_UNEXP_ERROR;
11400
11401 end Adjust_cp_trx_inv_dt;
11402
11403
11404
11405 Procedure Preview_Subscription_Bs(p_sll_tbl IN StreamLvl_tbl,
11406 p_invoice_rule_id IN Number,
11407 p_line_detail IN LINE_TYPE,
11408 x_bil_sch_out_tbl OUT NOCOPY ItemBillSch_tbl,
11409 x_return_status OUT NOCOPY Varchar2)
11410
11411
11412 IS
11413 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
11414 l_index NUMBER;
11415 l_sll_prorate_tbl sll_prorated_tab_type;
11416 l_bill_sch_amt NUMBER;
11417 l_next_cycle_dt DATE;
11418 l_tbl_seq NUMBER;
11419 l_lvl_seq NUMBER;
11420 l_adjusted_amount NUMBER;
11421
11422
11423
11424 l_api_version CONSTANT NUMBER := 1.0;
11425 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
11426 l_msg_count NUMBER;
11427 l_msg_data VARCHAR2(2000);
11428
11429 -- Start - Added by PMALLARA - Bug #3992530
11430 Lvl_Element_cnt Number := 0;
11431 Strm_Start_Date Date;
11432 -- End - Added by PMALLARA - Bug #3992530
11433
11434 l_period_start VARCHAR2(30);
11435 l_period_type VARCHAR2(10);
11436
11437
11438 BEGIN
11439
11440 x_return_status := 'S';
11441
11442 IF p_sll_tbl.count <= 0 THEN
11443 RETURN;
11444 END IF;
11445
11446 l_sll_tbl := p_sll_tbl;
11447 l_sll_prorate_tbl.DELETE;
11448
11449 FOR l_index IN p_sll_tbl.FIRST .. p_sll_tbl.LAST
11450 LOOP
11451 l_sll_prorate_tbl(l_index).sll_seq_num := p_sll_tbl(l_index).Sequence_no;
11452 IF L_index = p_sll_tbl.FIRST THEN
11453
11454 l_sll_prorate_tbl(l_index).sll_start_date := p_line_detail.start_dt;
11455 ELSE
11456 l_sll_prorate_tbl(l_index).sll_start_date := l_sll_prorate_tbl(l_sll_prorate_tbl.PRIOR(l_index)).sll_end_date + 1;
11457 END IF;
11458
11459 l_sll_prorate_tbl(l_index).sll_end_date := OKC_TIME_UTIL_PUB.get_enddate(
11460 l_sll_prorate_tbl(l_index).sll_start_date,
11461 p_sll_tbl(l_index).uom_code,
11462 (p_sll_tbl(l_index).level_periods * p_sll_tbl(l_index).uom_per_period));
11463
11464 l_sll_prorate_tbl(l_index).sll_tuom := p_sll_tbl(l_index).uom_code;
11465 l_sll_prorate_tbl(l_index).sll_period := p_sll_tbl(l_index).level_periods;
11466
11467 END LOOP;
11468
11469
11470 Calculate_sll_amount(
11471 p_api_version => l_api_version,
11472 p_total_amount => p_line_detail.amount,
11473 p_currency_code => nvl(p_line_detail.currency_code,'USD'),
11474 p_period_start => l_period_start,
11475 p_period_type => l_period_type,
11476 p_sll_prorated_tab => l_sll_prorate_tbl,
11477 x_return_status => x_return_status);
11478
11479
11480 -----errorout_ad ('Calculate_sll_amount STATUS = ' || x_return_status);
11481
11482
11483 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11484 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11485 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11486 RAISE OKC_API.G_EXCEPTION_ERROR;
11487 END IF;
11488
11489 FOR l_index IN l_sll_prorate_tbl.FIRST .. l_sll_prorate_tbl.LAST
11490 LOOP
11491 l_sll_tbl(l_index).level_amount := l_sll_prorate_tbl(l_index).sll_amount;
11492 l_sll_tbl(l_index).end_date := l_sll_prorate_tbl(l_index).sll_end_date;
11493 l_sll_tbl(l_index).start_date := l_sll_prorate_tbl(l_index).sll_start_date;
11494
11495 END LOOP; ---END OF sll tbl UPDATE LOOP
11496
11497
11498 l_index := l_sll_tbl.FIRST;
11499 l_bill_sch_amt := 0;
11500 l_tbl_seq := 1;
11501
11502 LOOP ---sll tbl loop
11503 l_next_cycle_dt := l_sll_tbl(l_index).start_date;
11504 l_lvl_seq := 1;
11505
11506 -- Start - Added by PMALLARA - Bug #3992530
11507 Lvl_Element_cnt := 0;
11508 LOOP -------------for level elements of one rule
11509 Lvl_Element_cnt := Lvl_Element_cnt + 1;
11510 if Lvl_Element_cnt = 1 then
11511 Strm_Start_Date := l_next_cycle_dt;
11512 end if;
11513 -- End - Added by PMALLARA - Bug #3992530
11514 l_fnd_lvl_in_rec.line_start_date := p_line_detail.start_dt;
11515 l_fnd_lvl_in_rec.line_end_date := p_line_detail.end_dt;
11516 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
11517 -- Start - Modified by PMALLARA - Bug #3992530
11518 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * l_sll_tbl(l_index).uom_Per_Period;
11519 -- End - Modified by PMALLARA - Bug #3992530
11520 l_fnd_lvl_in_rec.tuom := l_sll_tbl(l_index).uom_code;
11521 l_fnd_lvl_in_rec.total_amount := nvl(p_line_detail.amount,0) - nvl(l_bill_sch_amt,0);
11522 l_fnd_lvl_in_rec.invoice_offset_days := l_sll_tbl(l_index).invoice_offset_days;
11523 l_fnd_lvl_in_rec.interface_offset_days := l_sll_tbl(l_index).Interface_offset_days;
11524 l_fnd_lvl_in_rec.bill_type := 'E';
11525 -------------------------------------------------------------------------
11526 -- Begin partial period computation logic
11527 -- Developer Mani Choudhary
11528 -- Date 09-MAY-2005
11529 -- Added two new parameters p_period_start and p_period_type
11530 -------------------------------------------------------------------------
11531 -- Start - Modified by PMALLARA - Bug #3992530
11532 OKS_BILL_UTIL_PUB.Get_next_bill_sch
11533 (p_api_version => l_api_version,
11534 x_return_status => x_return_status,
11535 x_msg_count => l_msg_count,
11536 x_msg_data => l_msg_data,
11537 p_invoicing_rule_id => NVL(p_invoice_rule_id,-2),
11538 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
11539 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
11540 p_period_start => NULL,
11541 p_period_type => NULL,
11542 Strm_Start_Date => Strm_Start_Date);
11543 -- End - Modified by PMALLARA - Bug #3992530
11544
11545
11546 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11547 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11548 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11549 RAISE OKC_API.G_EXCEPTION_ERROR;
11550 END IF;
11551
11552
11553
11554 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_detail.start_dt then
11555 null; ---donot insert record in level element
11556 ELSE
11557
11558 IF (l_index = l_sll_tbl.last AND
11559 l_lvl_seq = l_sll_tbl(l_sll_tbl.last).level_periods) OR
11560 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > p_Line_detail.end_dt) THEN
11561
11562 l_adjusted_amount := nvl(p_Line_detail.amount,0) - nvl(l_bill_sch_amt,0);
11563
11564 ELSE --not adjustment round
11565 l_adjusted_amount := l_sll_tbl(l_index).level_amount;
11566 END IF;
11567
11568
11569
11570 --insert in lvl element preview tbl
11571
11572 x_bil_sch_out_tbl(l_tbl_seq).Strm_Lvl_Seq_Num := l_sll_tbl(l_index).sequence_no;
11573 x_bil_sch_out_tbl(l_tbl_seq).Lvl_Element_Seq_Num := to_char(l_lvl_seq);
11574 IF l_next_cycle_dt < p_Line_detail.start_dt THEN
11575 x_bil_sch_out_tbl(l_tbl_seq).bill_from_date := TRUNC(p_Line_detail.start_dt);
11576 ELSE
11577 x_bil_sch_out_tbl(l_tbl_seq).bill_from_date := TRUNC(l_next_cycle_dt);
11578 END IF;
11579
11580 x_bil_sch_out_tbl(l_tbl_seq).bill_to_date := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
11581
11582 x_bil_sch_out_tbl(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
11583 l_adjusted_amount,NVL(p_line_detail.currency_code,'USD'));
11584
11585
11586 x_bil_sch_out_tbl(l_tbl_seq).tx_date := TRUNC(l_fnd_lvl_out_rec.date_transaction);
11587 x_bil_sch_out_tbl(l_tbl_seq).interface_date := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
11588
11589 l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(x_bil_sch_out_tbl(l_tbl_seq).amount,0);
11590
11591 l_tbl_seq := l_tbl_seq + 1;
11592 END IF; -----end if for level element creation
11593
11594 l_next_cycle_dt := l_fnd_lvl_out_rec.next_cycle_date;
11595
11596 EXIT WHEN (l_lvl_seq = l_sll_tbl(l_index).level_periods) OR
11597 (TRUNC(l_next_cycle_dt) > p_line_detail.end_dt) OR
11598 (TRUNC(l_next_cycle_dt) > l_sll_tbl(l_index).end_date)
11599 ;
11600
11601 l_lvl_seq := l_lvl_seq + 1;
11602
11603 END LOOP; ---loop for sll period counter
11604
11605 EXIT WHEN (l_index = l_sll_tbl.LAST) OR
11606 (TRUNC(l_next_cycle_dt) > p_line_detail.end_dt);
11607
11608 l_index := l_sll_tbl.NEXT(l_index);
11609
11610 END LOOP; -----loop for sll tbl
11611
11612 EXCEPTION
11613
11614 WHEN OTHERS THEN
11615 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11616 p_msg_name => G_UNEXPECTED_ERROR,
11617 p_token1 => G_SQLCODE_TOKEN,
11618 p_token1_value => sqlcode,
11619 p_token2 => G_SQLERRM_TOKEN,
11620 p_token2_value => sqlerrm);
11621
11622 x_return_status := G_RET_STS_UNEXP_ERROR;
11623
11624
11625 END Preview_Subscription_Bs;
11626
11627
11628 PROCEDURE ADJUST_REPLACE_PRODUCT_BS(p_old_cp_id IN NUMBER,
11629 p_new_cp_id IN NUMBER,
11630 x_return_status OUT NOCOPY VARCHAR2,
11631 x_msg_count OUT NOCOPY NUMBER,
11632 x_msg_data OUT NOCOPY VARCHAR2)
11633
11634 IS
11635
11636 CURSOR l_old_sll_csr IS
11637 SELECT id , cle_id, dnz_chr_id ,
11638 sequence_no, uom_code, start_date,
11639 end_date, uom_per_period,advance_periods,level_periods,
11640 level_amount, invoice_offset_days,interface_offset_days,
11641 comments, due_arr_yn,amount,
11642 lines_detailed_yn, security_group_id
11643 FROM OKS_STREAM_LEVELS_B
11644 WHERE cle_id = p_old_cp_id
11645 ORDER BY START_DATE;
11646
11647 CURSOR l_old_bill_type_csr IS
11648 SELECT billing_schedule_type
11649 FROM OKS_K_LINES_B
11650 WHERE cle_id = p_old_cp_id;
11651
11652 CURSOR l_new_cp_csr IS
11653 SELECT id,end_date
11654 FROM okc_k_lines_b
11655 WHERE id = p_new_cp_id;
11656
11657
11658
11659 l_old_sll_rec l_old_sll_csr%ROWTYPE;
11660 l_new_cp_rec l_new_cp_csr%ROWTYPE;
11661
11662 l_old_bill_type OKS_K_LINES_B.billing_schedule_type%TYPE;
11663 l_sll_index NUMBER;
11664 l_index NUMBER;
11665 l_sll_end_date DATE;
11666
11667 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
11668
11669 BEGIN
11670 x_return_status := 'S';
11671
11672
11673
11674 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11675
11676 fnd_log.STRING (fnd_log.level_statement,
11677 G_MODULE_CURRENT || '.adjust_replace_product_bs.line_details',
11678 'old sub line id passed = ' || p_old_cp_id
11679 || ', new sub line id passed = ' || p_new_cp_id
11680 );
11681 END IF;
11682
11683
11684 OPEN l_old_bill_type_csr;
11685 FETCH l_old_bill_type_csr INTO l_old_bill_type;
11686 IF l_old_bill_type_csr%NOTFOUND THEN
11687 l_old_bill_type := 'T';
11688 END IF;
11689 CLOSE l_old_bill_type_csr;
11690
11691 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11692
11693 fnd_log.STRING (fnd_log.level_statement,
11694 G_MODULE_CURRENT || '.adjust_replace_product_bs.billing_sch_type',
11695 'old line billing scheduel type = ' || l_old_bill_type
11696 );
11697 END IF;
11698
11699 l_sll_index := 0;
11700 l_strm_lvl_tbl_in.DELETE;
11701
11702 FOR l_old_sll_rec IN l_old_sll_csr
11703 LOOP
11704
11705 l_sll_index := l_sll_index + 1;
11706
11707 l_strm_lvl_tbl_in(l_sll_index).chr_id := NULL;
11708 l_strm_lvl_tbl_in(l_sll_index).cle_id := p_new_cp_id;
11709 l_strm_lvl_tbl_in(l_sll_index).dnz_chr_id := l_old_sll_rec.dnz_chr_id;
11710 l_strm_lvl_tbl_in(l_sll_index).sequence_no := l_old_sll_rec.sequence_no;
11711 l_strm_lvl_tbl_in(l_sll_index).uom_code := l_old_sll_rec.uom_code;
11712 l_strm_lvl_tbl_in(l_sll_index).start_date := l_old_sll_rec.start_date;
11713
11714 l_strm_lvl_tbl_in(l_sll_index).end_date := nvl(l_old_sll_rec.end_date,
11715 OKC_TIME_UTIL_PUB.get_enddate(
11716 l_old_sll_rec.start_date,
11717 l_old_sll_rec.uom_code,
11718 (l_old_sll_rec.level_periods *
11719 l_old_sll_rec.uom_per_period)) );
11720
11721
11722 l_strm_lvl_tbl_in(l_sll_index).level_periods := l_old_sll_rec.level_periods;
11723 l_strm_lvl_tbl_in(l_sll_index).uom_per_period := l_old_sll_rec.uom_per_period;
11724 l_strm_lvl_tbl_in(l_sll_index).level_amount := l_old_sll_rec.level_amount;
11725 l_strm_lvl_tbl_in(l_sll_index).invoice_offset_days := l_old_sll_rec.invoice_offset_days;
11726 l_strm_lvl_tbl_in(l_sll_index).interface_offset_days := l_old_sll_rec.interface_offset_days;
11727
11728
11729 l_strm_lvl_tbl_in(l_sll_index).object_version_number := OKC_API.G_MISS_NUM;
11730 l_strm_lvl_tbl_in(l_sll_index).created_by := OKC_API.G_MISS_NUM;
11731 l_strm_lvl_tbl_in(l_sll_index).creation_date := SYSDATE;
11732 l_strm_lvl_tbl_in(l_sll_index).last_updated_by := OKC_API.G_MISS_NUM;
11733 l_strm_lvl_tbl_in(l_sll_index).last_update_date := SYSDATE;
11734
11735 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11736
11737 fnd_log.STRING (fnd_log.level_statement,
11738 G_MODULE_CURRENT || '.adjust_replace_product_bs.new_sll_tbl_dtls',
11739 'sll num = ' || l_sll_index
11740 || ', sll start date = ' || l_strm_lvl_tbl_in(l_sll_index).start_date
11741 || ', sll end date = ' || l_strm_lvl_tbl_in(l_sll_index).end_date
11742 || ', sll uom_code = ' || l_strm_lvl_tbl_in(l_sll_index).uom_code
11743 || ', sll uom_per_period = ' || l_strm_lvl_tbl_in(l_sll_index).uom_per_period
11744 || ', sll sequence_no = ' || l_strm_lvl_tbl_in(l_sll_index).sequence_no
11745 || ', sll cle id = ' || l_strm_lvl_tbl_in(l_sll_index).cle_id
11746 );
11747 END IF;
11748
11749
11750 END LOOP;
11751
11752 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
11753
11754 OKS_SLL_PVT.insert_row(
11755 p_api_version => l_api_version,
11756 p_init_msg_list => l_init_msg_list,
11757 x_return_status => x_return_status,
11758 x_msg_count => x_msg_count,
11759 x_msg_data => x_msg_data,
11760 p_sllv_tbl => l_strm_lvl_tbl_in,
11761 x_sllv_tbl => l_strm_lvl_tbl_out);
11762
11763 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11764 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.insert_sll',
11765 'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
11766 ||', sll tbl out count = '||l_strm_lvl_tbl_out.count||')');
11767 END IF;
11768
11769 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
11770 RAISE G_EXCEPTION_HALT_VALIDATION;
11771 END IF;
11772
11773 OPEN l_new_cp_csr;
11774 FETCH l_new_cp_csr INTO l_new_cp_rec;
11775 IF l_new_cp_csr%NOTFOUND THEN
11776 CLOSE l_new_cp_csr;
11777 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11778 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_replace_product_bs.EXCEPTION',
11779 'new cp not found = ' || p_new_cp_id);
11780 END IF;
11781 RAISE G_EXCEPTION_HALT_VALIDATION;
11782
11783 END IF;
11784 CLOSE l_new_cp_csr;
11785
11786
11787
11788 ----update the level elements of old line to new line.
11789
11790 FOR l_sll_index IN l_strm_lvl_tbl_out.FIRST .. l_strm_lvl_tbl_out.LAST
11791 LOOP
11792
11793 IF l_sll_index = l_strm_lvl_tbl_out.LAST THEN
11794 l_sll_end_date := l_new_cp_rec.end_date;
11795 ELSE
11796 l_sll_end_date := l_strm_lvl_tbl_out(l_sll_index).end_date;
11797 END IF;
11798
11799 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11800 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_lvl_elements',
11801 'sll rule id = ' || l_strm_lvl_tbl_out(l_sll_index).id
11802 ||', sll end date = '|| l_sll_end_date);
11803 END IF;
11804
11805 UPDATE oks_level_elements
11806 SET rul_id = l_strm_lvl_tbl_out(l_sll_index).id,
11807 cle_id = p_new_cp_id
11808 WHERE TRUNC(date_start) <= TRUNC(l_sll_end_date)
11809 AND TRUNC(date_start) >= TRUNC(l_strm_lvl_tbl_out(l_sll_index).start_date)
11810 AND cle_id = p_old_cp_id;
11811
11812 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11813 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_lvl_amt',
11814 'updated level elements = ' || sql%rowcount);
11815 END IF;
11816
11817
11818 END LOOP; ---for loop for sll out tbl
11819
11820 --update bill type of new line
11821
11822 UPDATE oks_k_lines_b
11823 SET billing_schedule_type = l_old_bill_type
11824 WHERE cle_id = p_new_cp_id;
11825
11826 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11827 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_bill_type',
11828 'update bill schedule type of new line to = ' || l_old_bill_type);
11829 END IF;
11830
11831
11832
11833 IF l_old_bill_type IN ('E', 'P') THEN
11834 ---update lvl amount to 0 of old line sll
11835
11836 UPDATE oks_stream_levels_b
11837 SET level_amount = 0
11838 WHERE cle_id = p_old_cp_id;
11839
11840 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11841 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_oldsll_amt',
11842 'update lvl amt of old line to zero = ' || sql%rowcount );
11843 END IF;
11844
11845 END IF; ----chk for bill type E and P
11846
11847
11848 ------update oks_bill_sub_lines with new cle_id
11849
11850 UPDATE oks_bill_sub_lines
11851 SET cle_id = p_new_cp_id
11852 WHERE cle_id = p_old_cp_id;
11853
11854
11855 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11856 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_bcl',
11857 'updated bcl count = ' || sql%rowcount );
11858 END IF;
11859
11860 END IF; ----chk for sll count for old line
11861
11862
11863
11864 EXCEPTION
11865 WHEN G_EXCEPTION_HALT_VALIDATION THEN
11866 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11867 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_replace_product_bs.EXCEPTION',
11868 'G_EXCEPTION_HALT_VALIDATION');
11869 END IF;
11870
11871 WHEN OTHERS THEN
11872 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
11873 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_replace_product_bs.UNEXPECTED',
11874 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
11875 END IF;
11876
11877 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11878 p_msg_name => G_UNEXPECTED_ERROR,
11879 p_token1 => G_SQLCODE_TOKEN,
11880 p_token1_value => sqlcode,
11881 p_token2 => G_SQLERRM_TOKEN,
11882 p_token2_value => sqlerrm);
11883
11884 x_return_status := G_RET_STS_UNEXP_ERROR;
11885
11886 END ADJUST_REPLACE_PRODUCT_BS;
11887
11888 Procedure ADJUST_SPLIT_BILL_SCH(p_old_cp_id IN NUMBER,
11889 p_new_cp_tbl IN OKS_BILL_SCH.SUBLINE_ID_TBL,
11890 x_return_status OUT NOCOPY VARCHAR2,
11891 x_msg_count OUT NOCOPY NUMBER,
11892 x_msg_data OUT NOCOPY VARCHAR2)
11893
11894 IS
11895
11896 CURSOR l_line_csr(p_line_id NUMBER) IS
11897 SELECT line.id line_id, TRUNC(line.start_date) start_dt,
11898 TRUNC(line.end_date) end_dt, line.dnz_chr_id dnz_chr_id, line.lse_id,
11899 line.cle_id parent_id,line.inv_rule_id inv_rule_id,
11900 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
11901 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt,
11902 dtl.billing_schedule_type billing_schedule_type
11903 FROM okc_k_lines_b line, oks_k_lines_b dtl
11904 WHERE line.id= p_line_id
11905 AND line.id = dtl.cle_id;
11906
11907 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
11908
11909 SELECT id,trunc(date_start) date_start,
11910 amount,trunc(date_end) date_end,object_version_number,
11911 date_to_interface, date_transaction,date_completed
11912 FROM oks_level_elements
11913 WHERE cle_id = p_line_id
11914 ORDER BY date_start;
11915
11916
11917 CURSOR chk_subline_bs_csr(p_line_id NUMBER) IS
11918 SELECT id
11919 FROM oks_level_elements
11920 WHERE cle_id = p_line_id;
11921
11922 CURSOR l_amt_csr(p_line_id NUMBER) IS
11923
11924 SELECT SUM(NVL(amount,0)) tot_amt
11925 FROM oks_level_elements
11926 WHERE cle_id = p_line_id;
11927
11928 Cursor l_line_amt_csr (p_id in number) IS
11929 Select line.price_negotiated
11930 from okc_k_lines_b line
11931 where line.id = p_id;
11932
11933 l_old_cp_rec Prod_Det_Type;
11934 l_new_cp_rec Prod_Det_Type;
11935 l_line_rec l_line_csr%ROWTYPE;
11936 l_line_BS_rec l_line_BS_csr%ROWTYPE;
11937 l_sll_in_tbl StrmLvl_Out_tbl;
11938 l_cp_sll_out_tbl StrmLvl_Out_tbl;
11939 l_sll_db_tbl oks_bill_sch.StreamLvl_tbl;
11940 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11941 l_new_sll_tbl oks_bill_sch.StreamLvl_tbl;
11942 l_cp_new_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11943 l_cp_old_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11944
11945
11946 l_top_line_rec Line_Det_Type;
11947 l_cp_rec Prod_Det_Type;
11948 -------------------------------------------------------------------------
11949 -- Begin partial period computation logic
11950 -- Developer Mani Choudhary
11951 -- Date 04-MAY-2005
11952 -------------------------------------------------------------------------
11953 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
11954 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
11955 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
11956 l_return_status VARCHAR2(30);
11957 l_tangible BOOLEAN;
11958 l_pricing_method VARCHAR2(30);
11959 -------------------------------------------------------------------------
11960 -- End partial period computation logic
11961 -- Date 04-MAY-2005
11962 -------------------------------------------------------------------------
11963
11964 l_billing_type oks_k_lines_b.billing_schedule_type%type;
11965 l_inv_rule_id number;
11966 l_top_line_id NUMBER;
11967 l_bs_id NUMBER;
11968 l_index NUMBER;
11969 l_cp_bs_ind NUMBER;
11970 l_top_bs_ind NUMBER;
11971 l_total_amt NUMBER;
11972 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
11973 L_EXCEPTION_END Exception;
11974
11975
11976 BEGIN
11977
11978 x_return_status := 'S';
11979
11980
11981 ---- return with success if billing schedule doesnt exists for the lines which gets split in IB
11982 Open chk_subline_bs_csr(p_old_cp_id);
11983 Fetch chk_subline_bs_csr Into l_bs_id;
11984 If chk_subline_bs_csr%Notfound then
11985 Close chk_subline_bs_csr;
11986 x_return_status := 'S';
11987 Raise L_EXCEPTION_END;
11988 END IF;
11989
11990 Close chk_subline_bs_csr;
11991
11992 ------------find out the old subline details
11993
11994 Open l_Line_Csr(p_old_cp_id);
11995 Fetch l_Line_Csr Into l_Line_Rec;
11996
11997 If l_Line_Csr%Notfound then
11998 Close l_Line_Csr;
11999 x_return_status := 'E';
12000 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12001 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12002 'old sub line not found = ' || p_old_cp_id );
12003 END IF;
12004
12005 End If;
12006 Close l_Line_Csr;
12007
12008 -------------------------------------------------------------------------
12009 -- Begin partial period computation logic
12010 -- Developer Mani Choudhary
12011 -- Date 09-MAY-2005
12012 -------------------------------------------------------------------------
12013
12014 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
12015 (
12016 p_hdr_id => l_Line_Rec.dnz_chr_id,
12017 p_org_id => NULL,
12018 x_period_start => l_period_start,
12019 x_period_type => l_period_type,
12020 x_price_uom => l_price_uom,
12021 x_return_status => x_return_status);
12022
12023 IF x_return_status <> 'S' THEN
12024 RAISE G_EXCEPTION_HALT_VALIDATION;
12025 END IF;
12026 --Description in detail for the business rules for deriving the period start
12027 --1)For usage , period start will always be 'SERVICE'
12028 --2)For Subscriptions, period start and period type will be NULL
12029 -- for tangible subscriptions as per CR1.For intangible subscriptions,
12030 -- if the profile OKS: Intangible Subscription Pricing Method
12031 -- is set to 'Subscription Based',then period start and period type will be NULL
12032 -- otherwise it will be 'SERVICE'
12033 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
12034 --mchoudha fix for bug#5183011
12035 IF l_period_start IS NOT NULL AND
12036 l_period_type IS NOT NULL
12037 THEN
12038 IF l_line_rec.lse_id =12 THEN
12039 l_period_start := 'SERVICE';
12040 END IF;
12041 IF l_line_rec.lse_id = 46 THEN
12042 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (l_line_rec.line_id);
12043 IF l_tangible THEN
12044 l_period_start := NULL;
12045 l_period_type := NULL;
12046 ELSE
12047 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
12048 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
12049 l_period_start := NULL;
12050 l_period_type := NULL;
12051 ELSE
12052 l_period_start := 'SERVICE';
12053 END IF; -- l_pricing_method <> 'EFFECTIVITY'
12054 END IF; -- IF l_tangible THEN
12055 END IF; -- IF l_Line_Csr_Rec.lse_id = 46
12056 END IF; -- period start and period type are not NULL
12057 -------------------------------------------------------------------------
12058 -- End partial period computation logic
12059 -- Date 09-MAY-2005
12060 -------------------------------------------------------------------------
12061
12062 l_old_cp_rec.cp_id := l_line_rec.line_id ;
12063 l_old_cp_rec.cp_start_dt := l_line_rec.start_dt;
12064 l_old_cp_rec.cp_end_dt := l_line_rec.end_dt ;
12065 l_old_cp_rec.cp_amt := l_line_rec.line_amt ;
12066
12067 IF l_period_type is not null AND l_period_start is not NULL THEN
12068 OPEN l_line_amt_csr(p_old_cp_id);
12069 FETCH l_line_amt_csr INTO l_old_cp_rec.cp_amt ;
12070 CLOSE l_line_amt_csr;
12071 END IF;
12072 l_top_line_id := l_line_rec.parent_id;
12073
12074
12075 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12076
12077 fnd_log.STRING (fnd_log.level_statement,
12078 G_MODULE_CURRENT || '.adjust_split_bill_sch.old_cp_dtls',
12079 'old subline id = ' || l_old_cp_rec.cp_id
12080 || ', start date = ' || l_old_cp_rec.cp_start_dt
12081 || ', end date = ' || l_old_cp_rec.cp_end_dt
12082 || ', amount = ' || l_old_cp_rec.cp_amt
12083 || ', top line id = ' || l_top_line_id );
12084 END IF;
12085
12086
12087 ------------find out the top line details
12088
12089 Open l_Line_Csr(l_top_line_id);
12090 Fetch l_Line_Csr Into l_Line_Rec;
12091
12092 If l_Line_Csr%Notfound then
12093 Close l_Line_Csr;
12094 x_return_status := 'E';
12095 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12096 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12097 'top line not found = ' || l_top_line_id );
12098 END IF;
12099
12100 End If;
12101 Close l_Line_Csr;
12102
12103 l_top_line_rec.chr_id := l_line_rec.dnz_chr_id ;
12104 l_top_line_rec.dnz_chr_id := l_line_rec.dnz_chr_id;
12105 l_top_line_rec.id := l_line_rec.line_id ;
12106 l_top_line_rec.lse_id := l_line_rec.lse_id;
12107 l_top_line_rec.line_start_dt := l_line_rec.start_dt;
12108 l_top_line_rec.line_end_dt := l_line_rec.end_dt ;
12109 l_top_line_rec.line_amt := l_line_rec.line_amt ;
12110
12111 IF l_period_type is not null AND l_period_start is not NULL THEN
12112 OPEN l_line_amt_csr(l_top_line_id);
12113 FETCH l_line_amt_csr INTO l_top_line_rec.line_amt;
12114 CLOSE l_line_amt_csr;
12115 END IF;
12116
12117 l_inv_rule_id := l_line_rec.inv_rule_id;
12118 l_billing_type := l_line_rec.billing_schedule_type;
12119
12120
12121 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12122
12123 fnd_log.STRING (fnd_log.level_statement,
12124 G_MODULE_CURRENT || '.adjust_split_bill_sch.top_line_dtls',
12125 'top line id = ' || l_top_line_rec.id
12126 || ', start date = ' || l_top_line_rec.line_start_dt
12127 || ', end date = ' || l_top_line_rec.line_start_dt
12128 || ', amount = ' || l_top_line_rec.line_amt
12129 || ', billing type = ' || l_billing_type
12130 || ', inv rule = ' || l_inv_rule_id);
12131 END IF;
12132
12133
12134 ----get currency
12135 l_currency_code := Find_Currency_Code(
12136 p_cle_id => null,
12137 p_chr_id => l_top_line_rec.dnz_chr_id);
12138
12139 IF l_currency_code IS NULL THEN
12140 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
12141 x_return_status := 'E';
12142 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12143 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12144 'currency not found for contract id = ' || l_top_line_rec.dnz_chr_id );
12145 END IF;
12146 RETURN;
12147 END IF;
12148
12149
12150 IF l_billing_type IN ('T','E') THEN
12151 l_top_bs_tbl.DELETE;
12152 l_index := 1;
12153
12154 FOR l_line_BS_rec IN l_line_BS_csr(l_top_line_id)
12155 LOOP
12156 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
12157 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
12158 l_top_bs_tbl(l_index).date_end := l_line_bs_rec.date_end;
12159 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
12160 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
12161 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
12162 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
12163
12164 l_total_amt := NVL(l_total_amt,0) + NVL(l_line_BS_rec.amount,0);
12165
12166 l_index := l_index + 1;
12167 END LOOP;
12168
12169
12170 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12171
12172 fnd_log.STRING (fnd_log.level_statement,
12173 G_MODULE_CURRENT || '.adjust_split_bill_sch.top_bs_tbl',
12174 'top line lvl elements count = ' || l_top_bs_tbl.count
12175 );
12176 END IF;
12177
12178 ------old cp schedule
12179
12180 l_cp_old_bs_tbl.DELETE;
12181 l_index := 1;
12182 l_total_amt := 0;
12183
12184 FOR l_line_BS_rec IN l_line_BS_csr(p_old_cp_id )
12185 LOOP
12186 l_cp_old_bs_tbl(l_index).id := l_line_BS_rec.id;
12187 l_cp_old_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
12188 l_cp_old_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
12189 l_cp_old_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
12190 l_cp_old_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
12191 l_cp_old_bs_tbl(l_index).date_completed := l_line_BS_rec.date_completed;
12192
12193 l_total_amt := NVL(l_total_amt,0) + NVL(l_line_BS_rec.amount, 0);
12194
12195 l_index := l_index + 1;
12196 END LOOP;
12197
12198
12199 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12200
12201 fnd_log.STRING (fnd_log.level_statement,
12202 G_MODULE_CURRENT || '.adjust_split_bill_sch.old_cp_bs_tbl',
12203 'old cp lvl elements count = ' || l_cp_old_bs_tbl.count
12204 );
12205 END IF;
12206
12207 --------adjust top line bs amount as (top line bs amt - old cp bs amt)
12208 l_cp_bs_ind := l_cp_old_bs_tbl.FIRST;
12209 l_top_bs_ind := l_top_bs_tbl.FIRST;
12210
12211 WHILE TRUNC(l_cp_old_bs_tbl(l_cp_bs_ind).date_start) > TRUNC(l_top_bs_tbl(l_top_bs_ind).DATE_START) AND
12212 l_top_bs_ind < l_top_bs_tbl.LAST
12213 LOOP
12214 l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
12215 END LOOP;
12216
12217 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12218
12219 fnd_log.STRING (fnd_log.level_statement,
12220 G_MODULE_CURRENT || '.Adjust_split_bill_sch.while_top_bs',
12221 'after while loop in top bs index = ' || l_top_bs_ind
12222 || ' , date start = ' || l_top_bs_tbl(l_top_bs_ind ).DATE_START
12223 );
12224 END IF;
12225
12226 ---chk first cp bs.st_dt if between previous and present record
12227
12228 IF l_top_bs_ind = l_top_bs_tbl.first THEN
12229 NULL;
12230
12231 ELSIF TRUNC(l_cp_old_bs_tbl(l_cp_bs_ind).date_start) >= TRUNC(l_top_bs_tbl(l_top_bs_ind - 1).DATE_START)
12232 AND TRUNC(l_cp_old_bs_tbl(l_cp_bs_ind).date_start) <= TRUNC(l_top_bs_tbl(l_top_bs_ind ).DATE_START) THEN
12233
12234 l_top_bs_ind := l_top_bs_ind - 1;
12235
12236 ELSIF l_cp_old_bs_tbl(l_cp_bs_ind).date_start = l_top_bs_tbl(l_top_bs_ind).DATE_START THEN
12237 null;
12238 END IF;
12239
12240
12241
12242 FOR l_cp_bs_ind IN l_cp_old_bs_tbl.FIRST .. l_cp_old_bs_tbl.LAST
12243 LOOP
12244
12245 IF l_top_bs_ind <= l_top_bs_tbl.LAST THEN
12246
12247 l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) -
12248 nvl(l_cp_old_bs_tbl(l_cp_bs_ind).amount,0);
12249 l_top_bs_ind := l_top_bs_ind + 1;
12250
12251 END IF;
12252 END LOOP;
12253
12254 ELSE -----bill type = P
12255
12256 /*mchandak Fix for Bug#16513761 */
12257 l_cp_old_bs_tbl.DELETE;
12258 l_index := 1;
12259
12260 FOR l_line_BS_rec IN l_line_BS_csr(p_old_cp_id )
12261 LOOP
12262 l_cp_old_bs_tbl(l_index).id := l_line_BS_rec.id;
12263 l_cp_old_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
12264 l_cp_old_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
12265 l_cp_old_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
12266 l_cp_old_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
12267 l_cp_old_bs_tbl(l_index).date_completed := l_line_BS_rec.date_completed;
12268 l_index := l_index + 1;
12269 END LOOP;
12270
12271 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12272 fnd_log.STRING (fnd_log.level_statement,
12273 G_MODULE_CURRENT || '.adjust_split_bill_sch.old_cp_bs_tbl',
12274 'old cp lvl elements count = ' || l_cp_old_bs_tbl.count
12275 );
12276 END IF;
12277 /* End of codefix for Bug#16513761 */
12278
12279 OPEN l_amt_csr(p_old_cp_id);
12280 FETCH l_amt_csr INTO l_total_amt;
12281 CLOSE l_amt_csr;
12282
12283 END IF; -----end of 'T' and E
12284
12285 ------get sll for old sub line, so that sll amt can be prorated for new subline sll.
12286
12287 Get_SLL_info(p_top_line_id => l_top_line_id,
12288 p_line_id => l_old_cp_rec.cp_id ,
12289 x_sll_tbl => l_sll_in_tbl,
12290 x_sll_db_tbl => l_sll_db_tbl,
12291 x_return_status => x_return_status );
12292
12293 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12294 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.get_old_cp_sll',
12295 'Get_SLL_info(x_return_status = '||x_return_status
12296 ||', sll tbl out count = '||l_sll_db_tbl.count||')');
12297 END IF;
12298
12299 IF x_return_status <> 'S' THEN
12300 RAISE G_EXCEPTION_HALT_VALIDATION;
12301 END IF;
12302
12303
12304 IF l_sll_db_tbl.COUNT = 0 THEN
12305 RETURN;
12306 END IF;
12307
12308 FOR i IN p_new_cp_tbl.FIRST .. p_new_cp_tbl.LAST
12309 LOOP
12310 l_new_sll_tbl.DELETE;
12311
12312 l_new_sll_tbl := l_sll_db_tbl;
12313
12314
12315 FOR l_index IN l_sll_db_tbl.FIRST .. l_sll_db_tbl.LAST
12316 LOOP
12317
12318 l_new_sll_tbl(l_index).cle_id := p_new_cp_tbl(i).id;
12319 l_new_sll_tbl(l_index).id := NULL;
12320 END LOOP;
12321
12322
12323 ------------find out the new subline details
12324
12325 Open l_Line_Csr(p_new_cp_tbl(i).id);
12326 Fetch l_Line_Csr Into l_Line_Rec;
12327
12328 If l_Line_Csr%Notfound then
12329 Close l_Line_Csr;
12330 x_return_status := 'E';
12331 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12332 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12333 'new sub line not found = ' || p_new_cp_tbl(i).id );
12334 END IF;
12335
12336 End If;
12337 Close l_Line_Csr;
12338
12339
12340 l_new_cp_rec.cp_id := l_line_rec.line_id ;
12341 l_new_cp_rec.cp_start_dt := l_line_rec.start_dt;
12342 l_new_cp_rec.cp_end_dt := l_line_rec.end_dt ;
12343 l_new_cp_rec.cp_amt := l_line_rec.line_amt ;
12344
12345 IF l_period_type is not null AND l_period_start is not NULL THEN
12346 OPEN l_line_amt_csr(p_new_cp_tbl(i).id);
12347 FETCH l_line_amt_csr INTO l_new_cp_rec.cp_amt;
12348 CLOSE l_line_amt_csr;
12349 END IF;
12350
12351 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12352
12353 fnd_log.STRING (fnd_log.level_statement,
12354 G_MODULE_CURRENT || '.adjust_split_bill_sch.new_cp_dtls',
12355 'new subline id = ' || l_new_cp_rec.cp_id
12356 || ', start date = ' || l_new_cp_rec.cp_start_dt
12357 || ', end date = ' || l_new_cp_rec.cp_end_dt
12358 || ', amount = ' || l_new_cp_rec.cp_amt
12359 || ', top line id = ' || l_top_line_id
12360 );
12361 END IF;
12362
12363
12364 IF l_line_rec.billing_schedule_type IS NULL OR
12365 l_line_rec.billing_schedule_type <> l_billing_type THEN
12366
12367 UPDATE OKS_K_LINES_B SET billing_schedule_type = l_billing_type
12368 WHERE cle_id = l_new_cp_rec.cp_id;
12369
12370
12371 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12372 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.update_bill_type',
12373 'updated new sub line billing type = ' || sql%rowcount);
12374
12375 END IF;
12376 END IF;
12377
12378 IF l_billing_type IN ('E', 'P') THEN
12379 Prorate_sll_amt(
12380 p_old_cp_amt => l_old_cp_rec.cp_amt,
12381 p_new_cp_amt => l_new_cp_rec.cp_amt,
12382 p_total_Amt => l_total_amt,
12383 p_new_sll_tbl => l_new_sll_tbl,
12384 p_old_sll_tbl => l_sll_db_tbl,
12385 x_return_status => x_return_status);
12386
12387 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12388 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.prorate_sll_amt',
12389 'Prorate_sll_amt status = ' || x_return_status
12390 );
12391
12392 END IF;
12393
12394 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12395 RAISE G_EXCEPTION_HALT_VALIDATION;
12396 END IF;
12397 END IF;
12398
12399 l_strm_lvl_tbl_in.DELETE;
12400 l_index := 0;
12401
12402 FOR l_index IN l_new_sll_tbl.FIRST .. l_new_sll_tbl.LAST
12403 LOOP
12404
12405 l_strm_lvl_tbl_in(l_index).chr_id := l_new_sll_tbl(l_index).chr_id;
12406 l_strm_lvl_tbl_in(l_index).dnz_chr_id := l_new_sll_tbl(l_index).dnz_chr_id;
12407 l_strm_lvl_tbl_in(l_index).sequence_no := l_new_sll_tbl(l_index).sequence_no ;
12408 l_strm_lvl_tbl_in(l_index).uom_code := l_new_sll_tbl(l_index).uom_code;
12409 l_strm_lvl_tbl_in(l_index).start_date := l_new_sll_tbl(l_index).start_date;
12410 l_strm_lvl_tbl_in(l_index).end_date := l_new_sll_tbl(l_index).end_date;
12411 l_strm_lvl_tbl_in(l_index).level_periods := l_new_sll_tbl(l_index).level_periods;
12412 l_strm_lvl_tbl_in(l_index).uom_per_period := l_new_sll_tbl(l_index).uom_per_period;
12413 l_strm_lvl_tbl_in(l_index).level_amount := l_new_sll_tbl(l_index).level_amount;
12414 l_strm_lvl_tbl_in(l_index).invoice_offset_days := l_new_sll_tbl(l_index).invoice_offset_days;
12415 l_strm_lvl_tbl_in(l_index).interface_offset_days := l_new_sll_tbl(l_index).interface_offset_days;
12416
12417 l_strm_lvl_tbl_in(l_index).id := NULL;
12418 l_strm_lvl_tbl_in(l_index).cle_id := p_new_cp_tbl(i).id;
12419
12420
12421 l_strm_lvl_tbl_in(l_index).object_version_number := OKC_API.G_MISS_NUM;
12422 l_strm_lvl_tbl_in(l_index).created_by := OKC_API.G_MISS_NUM;
12423 l_strm_lvl_tbl_in(l_index).creation_date := SYSDATE;
12424 l_strm_lvl_tbl_in(l_index).last_updated_by := OKC_API.G_MISS_NUM;
12425 l_strm_lvl_tbl_in(l_index).last_update_date := SYSDATE;
12426
12427
12428 END LOOP;
12429
12430
12431 OKS_SLL_PVT.insert_row(
12432 p_api_version => l_api_version,
12433 p_init_msg_list => l_init_msg_list,
12434 x_return_status => x_return_status,
12435 x_msg_count => x_msg_count,
12436 x_msg_data => x_msg_data,
12437 p_sllv_tbl => l_strm_lvl_tbl_in,
12438 x_sllv_tbl => l_strm_lvl_tbl_out);
12439
12440 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12441 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.insert_sll',
12442 'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
12443 ||', sll tbl out count = '||l_strm_lvl_tbl_out.count||')');
12444 END IF;
12445
12446 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12447 RAISE G_EXCEPTION_HALT_VALIDATION;
12448 END IF;
12449
12450 l_cp_sll_out_tbl.DELETE;
12451
12452 FOR l_tbl_index IN l_strm_lvl_tbl_out.FIRST .. l_strm_lvl_tbl_out.LAST
12453 LOOP
12454
12455 l_cp_sll_out_tbl(l_tbl_index).chr_Id := l_strm_lvl_tbl_out(l_tbl_index).chr_id;
12456 l_cp_sll_out_tbl(l_tbl_index).cle_Id := l_strm_lvl_tbl_out(l_tbl_index).cle_id;
12457 l_cp_sll_out_tbl(l_tbl_index).dnz_chr_Id := l_strm_lvl_tbl_out(l_tbl_index).dnz_chr_id;
12458 l_cp_sll_out_tbl(l_tbl_index).Id := l_strm_lvl_tbl_out(l_tbl_index).id;
12459 l_cp_sll_out_tbl(l_tbl_index).Seq_no := l_strm_lvl_tbl_out(l_tbl_index).sequence_no;
12460 l_cp_sll_out_tbl(l_tbl_index).Dt_start := l_strm_lvl_tbl_out(l_tbl_index).start_date;
12461 l_cp_sll_out_tbl(l_tbl_index).end_date := l_strm_lvl_tbl_out(l_tbl_index).end_date;
12462 l_cp_sll_out_tbl(l_tbl_index).Level_Period := l_strm_lvl_tbl_out(l_tbl_index).level_periods;
12463 l_cp_sll_out_tbl(l_tbl_index).uom_Per_Period := l_strm_lvl_tbl_out(l_tbl_index).uom_per_period;
12464 l_cp_sll_out_tbl(l_tbl_index).uom := l_strm_lvl_tbl_out(l_tbl_index).uom_code;
12465 l_cp_sll_out_tbl(l_tbl_index).Amount := l_strm_lvl_tbl_out(l_tbl_index).level_amount;
12466 l_cp_sll_out_tbl(l_tbl_index).invoice_offset_days := l_strm_lvl_tbl_out(l_tbl_index).invoice_offset_days;
12467 l_cp_sll_out_tbl(l_tbl_index).Interface_offset_days := l_strm_lvl_tbl_out(l_tbl_index).interface_offset_days;
12468
12469 END LOOP;
12470
12471 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12472
12473 fnd_log.STRING (fnd_log.level_statement,
12474 G_MODULE_CURRENT || '.adjust_split_bill_sch.before_new_lvl_ele',
12475 'sll count passed to Create_cp_lvl_elements = ' || l_cp_sll_out_tbl.count);
12476 END IF;
12477
12478 ------create lvl elements for new cp level ele
12479 -------------------------------------------------------------------------
12480 -- Begin partial period computation logic
12481 -- Developer Mani Choudhary
12482 -- Date 09-MAY-2005
12483 -- Added two new parameters p_period_start and p_period_type
12484 -------------------------------------------------------------------------
12485 Create_cp_lvl_elements(
12486 p_billing_type => l_billing_type,
12487 p_cp_sll_tbl => l_cp_sll_out_tbl,
12488 p_Line_Rec => l_top_Line_Rec,
12489 p_SubLine_rec => l_new_cp_rec,
12490 p_invoice_rulid => l_inv_rule_id,
12491 p_top_line_bs => l_top_bs_tbl,
12492 p_term_dt => null,
12493 p_period_start => l_period_start,
12494 p_period_type => l_period_type,
12495 x_return_status => x_return_status);
12496
12497
12498 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12499 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.Create_cp_lvl_elements',
12500 'Create_cp_lvl_elements(x_return_status = '||x_return_status
12501 ||', l_top_bs_tbl count = '||l_top_bs_tbl.count||')');
12502 END IF;
12503
12504 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12505 RAISE G_EXCEPTION_HALT_VALIDATION;
12506 END IF;
12507
12508 ----adjust lvl element amt for old cp and top bs
12509
12510 Adjust_billed_lvl_element(p_new_cp_id => l_new_cp_rec.cp_id,
12511 p_old_cp_bs_tbl => l_cp_old_bs_tbl,
12512 x_new_cp_bs_tbl => l_cp_new_bs_tbl,
12513 x_return_status => x_return_status);
12514
12515
12516 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12517 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.Adjust_billed_lvl_element',
12518 'Adjust_billed_lvl_element(x_return_status = '||x_return_status
12519 ||', l_cp_old_bs_tbl count = '||l_cp_old_bs_tbl.count||')');
12520 END IF;
12521
12522 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12523 RAISE G_EXCEPTION_HALT_VALIDATION;
12524 END IF;
12525
12526
12527 ---add new bill records in billing tables
12528
12529 OKS_BILL_UTIL_PUB.ADJUST_SPLIT_BILL_REC(p_old_cp_id => l_old_cp_rec.cp_id,
12530 p_new_cp_id => l_new_cp_rec.cp_id,
12531 p_currency_code => l_currency_code,
12532 p_rgp_id => NULL,
12533 p_old_cp_lvl_tbl => l_cp_old_bs_tbl,
12534 p_new_cp_lvl_tbl => l_cp_new_bs_tbl,
12535 x_return_status => x_return_status,
12536 x_msg_count => x_msg_count,
12537 x_msg_data => x_msg_data);
12538
12539
12540 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12541 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.bill_rec',
12542 'oks_bill_util_pub.adjust_split_bill_rec(x_return_status = '||x_return_status
12543 ||'old line id = ' || l_old_cp_rec.cp_id || ')');
12544 END IF;
12545
12546 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12547 ----errorout_aD('ADJUST_SPLIT_BILL_REC ststaus = ' || x_return_status);
12548 RAISE G_EXCEPTION_HALT_VALIDATION;
12549 END IF;
12550
12551 l_total_amt := NVL(l_total_amt,0) - NVL(l_new_cp_rec.cp_amt,0);
12552
12553 END LOOP; ---loop for new sub line
12554
12555
12556 ---update old sll amount if billtype in E and P
12557
12558 l_cp_sll_out_tbl.DELETE;
12559
12560 FOR l_index in l_sll_db_tbl.FIRST .. l_sll_db_tbl.LAST
12561 LOOP
12562
12563 IF l_billing_type IN ('E', 'P') THEN
12564
12565 UPDATE oks_stream_levels_b
12566 SET level_amount = l_sll_db_tbl(l_index).level_amount
12567 WHERE id = l_sll_db_tbl(l_index).id;
12568
12569
12570 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12571 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.old_sll_amt_update',
12572 'old sll amount update = '|| l_sll_db_tbl(l_index).level_amount
12573 ||', sll id = '|| l_sll_db_tbl(l_index).id );
12574 END IF;
12575 END IF;
12576
12577
12578 l_cp_sll_out_tbl(l_index).Id := l_sll_db_tbl(l_index).id;
12579 l_cp_sll_out_tbl(l_index).chr_Id := NULL;
12580 l_cp_sll_out_tbl(l_index).cle_Id := l_sll_db_tbl(l_index).cle_id;
12581 l_cp_sll_out_tbl(l_index).dnz_chr_Id := l_sll_db_tbl(l_index).dnz_chr_Id;
12582 l_cp_sll_out_tbl(l_index).Seq_no := l_sll_db_tbl(l_index).sequence_no;
12583 l_cp_sll_out_tbl(l_index).Dt_start := l_sll_db_tbl(l_index).Start_Date;
12584 l_cp_sll_out_tbl(l_index).end_date := l_sll_db_tbl(l_index).end_Date;
12585 l_cp_sll_out_tbl(l_index).Level_Period := l_sll_db_tbl(l_index).level_periods;
12586 l_cp_sll_out_tbl(l_index).uom_Per_Period := l_sll_db_tbl(l_index).uom_per_period;
12587 l_cp_sll_out_tbl(l_index).uom := l_sll_db_tbl(l_index).uom_code;
12588 l_cp_sll_out_tbl(l_index).Amount := l_sll_db_tbl(l_index).level_amount;
12589 l_cp_sll_out_tbl(l_index).invoice_offset_days := l_sll_db_tbl(l_index).invoice_offset_days;
12590 l_cp_sll_out_tbl(l_index).Interface_offset_days := l_sll_db_tbl(l_index).interface_offset_days;
12591
12592 END LOOP;
12593
12594
12595 ----refresh billing sch for old cp.
12596 -------------------------------------------------------------------------
12597 -- Begin partial period computation logic
12598 -- Developer Mani Choudhary
12599 -- Date 09-MAY-2005
12600 -- Added two new parameters p_period_start and p_period_type
12601 -------------------------------------------------------------------------
12602 Create_cp_lvl_elements(
12603 p_billing_type => l_billing_type,
12604 p_cp_sll_tbl => l_cp_sll_out_tbl,
12605 p_Line_Rec => l_top_Line_Rec,
12606 p_SubLine_rec => l_old_cp_rec,
12607 p_invoice_rulid => l_inv_rule_id,
12608 p_top_line_bs => l_top_bs_tbl,
12609 p_term_dt => NULL,
12610 p_period_start => l_period_start, --mchoudha fix for bug#4998167 added l_period_start
12611 p_period_type => l_period_type, --mchoudha fix for bug#4998167 added l_period_type
12612 x_return_status => x_return_status);
12613
12614 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12615 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.refresh_old_cp_lvl',
12616 'Create_cp_lvl_elements(x_return_status = '||x_return_status
12617 ||', l_top_bs_tbl count = '||l_top_bs_tbl.count||')');
12618 END IF;
12619
12620 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12621 RAISE G_EXCEPTION_HALT_VALIDATION;
12622 END IF;
12623
12624
12625 IF l_top_bs_tbl.COUNT > 0 THEN
12626
12627 FOR l_index IN l_top_bs_tbl.FIRST .. l_top_bs_tbl.LAST
12628 LOOP
12629
12630 UPDATE OKS_LEVEL_ELEMENTS
12631 SET amount = l_top_bs_tbl(l_index).amount
12632 WHERE id = l_top_bs_tbl(l_index).id;
12633
12634 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12635 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Adjust_split_bill_sch.update_top_lvl_amt',
12636 'updated level elemnets of top line= ' || sql%rowcount
12637 || ' , id = ' || l_top_bs_tbl(l_index).id
12638 || ' , amt = ' || l_top_bs_tbl(l_index).amount );
12639 END IF;
12640 END LOOP;
12641 END IF;
12642
12643
12644 EXCEPTION
12645 WHEN L_EXCEPTION_END THEN
12646 x_return_status := 'S';
12647 WHEN G_EXCEPTION_HALT_VALIDATION THEN
12648 x_return_status := 'E';
12649 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12650 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12651 'G_EXCEPTION_HALT_VALIDATION');
12652 END IF;
12653
12654 WHEN OTHERS THEN
12655 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12656 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_split_bill_sch.UNEXPECTED',
12657 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12658 END IF;
12659
12660 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
12661 p_msg_name => G_UNEXPECTED_ERROR,
12662 p_token1 => G_SQLCODE_TOKEN,
12663 p_token1_value => sqlcode,
12664 p_token2 => G_SQLERRM_TOKEN,
12665 p_token2_value => sqlerrm);
12666
12667 x_return_status := G_RET_STS_UNEXP_ERROR;
12668 END adjust_split_bill_sch;
12669
12670
12671
12672 Procedure Prorate_sll_amt(
12673 p_old_cp_amt IN NUMBER,
12674 p_new_cp_amt IN NUMBER,
12675 p_total_amt IN NUMBER,
12676 p_new_sll_tbl IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
12677 p_old_sll_tbl IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
12678 x_return_status OUT NOCOPY VARCHAR2)
12679
12680 IS
12681 l_tot_amt NUMBER;
12682 l_amt NUMBER;
12683
12684 BEGIN
12685
12686 x_return_status := OKC_API.G_RET_STS_SUCCESS;
12687
12688 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12689
12690 fnd_log.STRING (fnd_log.level_statement,
12691 G_MODULE_CURRENT || '.Prorate_sll_amt.passed_val',
12692 'p_total_amt = ' || p_total_amt
12693 ||', p_new_cp_amt = ' || p_new_cp_amt);
12694 END IF;
12695
12696 l_tot_amt := nvl(p_total_amt,0);
12697
12698 FOR l_index IN p_old_sll_tbl.FIRST .. p_old_sll_tbl.LAST
12699 LOOP
12700
12701 IF l_tot_amt = 0 THEN
12702 l_amt := 0;
12703 ELSE
12704
12705 l_Amt := (NVL(p_old_sll_tbl(l_index).level_amount,0)/l_tot_amt) * nvl(p_new_cp_amt,0);
12706 END IF;
12707
12708 p_new_sll_tbl(l_index).level_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt
12709 (l_Amt, l_currency_code);
12710
12711
12712 p_old_sll_tbl(l_index).level_amount := nvl(p_old_sll_tbl(l_index).level_amount,0) -
12713 p_new_sll_tbl(l_index).level_amount;
12714
12715 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12716 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Prorate_sll_amt.lvl_amt',
12717 'sll seq = ' || p_old_sll_tbl(l_index).sequence_no
12718 ||', old sll amt = '|| p_old_sll_tbl(l_index).level_amount
12719 ||', new sll amt = '|| p_new_sll_tbl(l_index).level_amount
12720 ||', total amt = '|| l_tot_amt
12721 );
12722 END IF;
12723
12724 END LOOP;
12725
12726 EXCEPTION
12727
12728 WHEN OTHERS THEN
12729 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12730 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Prorate_sll_amt.UNEXPECTED',
12731 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12732 END IF;
12733
12734 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
12735 p_msg_name => G_UNEXPECTED_ERROR,
12736 p_token1 => G_SQLCODE_TOKEN,
12737 p_token1_value => sqlcode,
12738 p_token2 => G_SQLERRM_TOKEN,
12739 p_token2_value => sqlerrm);
12740
12741 x_return_status := G_RET_STS_UNEXP_ERROR;
12742
12743 END Prorate_sll_amt;
12744
12745
12746 PROCEDURE Adjust_billed_lvl_element(p_new_cp_id IN NUMBER,
12747 p_old_cp_bs_tbl IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
12748 x_new_cp_bs_tbl OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
12749 x_return_status OUT NOCOPY VARCHAR2)
12750 IS
12751
12752
12753 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
12754
12755 SELECT id,trunc(date_start) date_start,
12756 amount,trunc(date_end) date_end,date_completed
12757 FROM oks_level_elements
12758 WHERE cle_id = p_line_id
12759 ORDER BY date_start;
12760
12761 l_line_BS_rec l_line_BS_csr%ROWTYPE;
12762 l_index NUMBER;
12763
12764 BEGIN
12765
12766 x_return_status := OKC_API.G_RET_STS_SUCCESS;
12767
12768 l_index := 1;
12769 x_new_cp_bs_tbl.DELETE;
12770
12771 FOR l_line_BS_rec IN l_line_BS_csr(p_new_cp_id)
12772 LOOP
12773 x_new_cp_bs_tbl(l_index).id := l_line_BS_rec.id;
12774 x_new_cp_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
12775 x_new_cp_bs_tbl(l_index).date_end := l_line_bs_rec.date_end;
12776 x_new_cp_bs_tbl(l_index).Amount := l_line_bs_rec.amount;
12777 x_new_cp_bs_tbl(l_index).date_completed := l_line_BS_rec.date_completed;
12778
12779 l_index := l_index + 1;
12780 END LOOP;
12781
12782
12783 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12784
12785 fnd_log.STRING (fnd_log.level_statement,
12786 G_MODULE_CURRENT || '.Adjust_billed_lvl_element.new_bs_tbl',
12787 'new sub line lvl elements count = ' || x_new_cp_bs_tbl.count);
12788 END IF;
12789
12790
12791 -------adjust the old cp lvl element amt for billed records
12792 -----as old cp lvl amount = old amt - new cp lvl amt.
12793
12794
12795 FOR l_index IN p_old_cp_bs_tbl.FIRST .. p_old_cp_bs_tbl.LAST
12796 LOOP
12797
12798 IF TRUNC(p_old_cp_bs_tbl(l_index).date_start) = TRUNC(x_new_cp_bs_tbl(l_index).date_start) AND
12799 p_old_cp_bs_tbl(l_index).date_completed IS NOT NULL THEN
12800
12801 p_old_cp_bs_tbl(l_index).amount := p_old_cp_bs_tbl(l_index).amount - x_new_cp_bs_tbl(l_index).amount;
12802 x_new_cp_bs_tbl(l_index).date_completed := sysdate;
12803
12804 UPDATE OKS_LEVEL_ELEMENTS
12805 SET amount = p_old_cp_bs_tbl(l_index).amount
12806 WHERE id = p_old_cp_bs_tbl(l_index).id;
12807
12808 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12809 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Adjust_billed_lvl_element.update_old_lvl_amt',
12810 'updated level elemnets = ' || sql%rowcount
12811 || ' , id = ' || p_old_cp_bs_tbl(l_index).id
12812 || ' , amt = ' || p_old_cp_bs_tbl(l_index).amount );
12813
12814 END IF;
12815
12816 END IF;
12817 END LOOP;
12818
12819 EXCEPTION
12820
12821 WHEN OTHERS THEN
12822 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12823 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Adjust_billed_lvl_element.UNEXPECTED',
12824 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12825 END IF;
12826
12827 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
12828 p_msg_name => G_UNEXPECTED_ERROR,
12829 p_token1 => G_SQLCODE_TOKEN,
12830 p_token1_value => sqlcode,
12831 p_token2 => G_SQLERRM_TOKEN,
12832 p_token2_value => sqlerrm);
12833
12834 x_return_status := G_RET_STS_UNEXP_ERROR;
12835
12836 END Adjust_billed_lvl_element;
12837
12838
12839 --[llc] Sts_change_subline_lvl_rule
12840
12841 /* This procedure updates the amount on the top line when the status of sub-line is
12842 changed from 'Entered' to 'Cancelled' or 'Cancelled' to 'Entered'.
12843 */
12844
12845 PROCEDURE Sts_change_subline_lvl_rule(
12846 p_cle_id IN NUMBER,
12847 p_from_ste_code IN VARCHAR2,
12848 p_to_ste_code IN VARCHAR2,
12849 x_return_status OUT NOCOPY VARCHAR2,
12850 x_msg_count OUT NOCOPY NUMBER,
12851 x_msg_data OUT NOCOPY VARCHAR2)
12852 IS
12853
12854 -- to get the top line details
12855
12856 CURSOR l_line_BS_csr(l_top_line_id Number) IS
12857 SELECT id, trunc(date_start) date_start,
12858 amount, TRUNC(DATE_end) date_end, object_version_number
12859 FROM oks_level_elements
12860 WHERE cle_id = l_top_line_id
12861 ORDER BY date_start;
12862
12863 -- to get the sub-line details.
12864 CURSOR l_cp_BS_csr IS
12865 SELECT id, trunc(date_start) date_start,
12866 amount
12867 FROM oks_level_elements
12868 WHERE cle_id = p_cle_id
12869 ORDER BY date_start;
12870
12871 -- to get the billing schedule of the sub-line on which the status changes action is taken.
12872
12873 CURSOR l_bill_type_csr IS
12874 SELECT nvl(billing_schedule_type,'T') billing_schedule_type
12875 FROM oks_k_lines_b
12876 WHERE cle_id = p_cle_id;
12877
12878
12879 CURSOR is_top_line_csr (p_cle_id number) IS
12880 select cle_id
12881 from okc_k_lines_b
12882 where id=p_cle_id;
12883
12884
12885 -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
12886 -- CURSOR to check if price_negotiated of topline equals to total SLL amount for this topline
12887 -- on billing form (table- oks_level_elements, column- amount)
12888
12889 CURSOR csr_CheckBillSllAmount_PN (p_top_line_id number) IS
12890 SELECT 1
12891 FROM okc_k_lines_b
12892 WHERE id = p_top_line_id
12893 AND price_negotiated = (select sum(amount) from oks_level_elements ole1
12894 where ole1.parent_cle_id = p_top_line_id
12895 and ole1.object_version_number = ( select max(object_version_number)
12896 from oks_level_elements ole2
12897 where ole2.parent_cle_id = p_top_line_id
12898 )
12899 );
12900
12901
12902 l_line_BS_rec l_line_BS_csr%ROWTYPE;
12903 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
12904 l_bill_type_rec l_bill_type_csr%ROWTYPE;
12905
12906
12907 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
12908 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
12909 x_letv_tbl oks_bill_level_elements_pvt.letv_tbl_type;
12910
12911
12912 i NUMBER := 0;
12913 l_index NUMBER := 0;
12914 l_cp_bs_ind NUMBER;
12915 l_top_bs_ind NUMBER;
12916
12917 l_api_Version Number := 1;
12918 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
12919 l_msg_list VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
12920 l_msg_count Number;
12921 l_msg_data Varchar2(2000) := NULL;
12922
12923 l_top_line_id Number;
12924
12925 l_dummy NUMBER;
12926
12927
12928 BEGIN
12929
12930 x_return_status := 'S';
12931
12932 ---get bill type details
12933
12934 Open is_top_line_csr(p_cle_id);
12935 Fetch is_top_line_csr Into l_top_line_id;
12936 Close is_top_line_csr;
12937
12938 -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
12939
12940 IF (l_top_line_id is null) THEN
12941
12942 IF ((p_from_ste_code = 'CANCELLED' ) AND (p_to_ste_code = 'ENTERED')) then
12943
12944 Open csr_CheckBillSllAmount_PN(p_cle_id);
12945 Fetch csr_CheckBillSllAmount_PN into l_dummy;
12946 Close csr_CheckBillSllAmount_PN;
12947
12948 -- If status of service line is changed from CANCELED TO ENTERED status, then
12949 -- refresh the billing schedule. This will ensure that billing schedule
12950 -- amount matches with that of the price_negotiated amount of the service line
12951
12952 IF (nvl(l_dummy, 2) <> 1 ) THEN
12953
12954 OKS_BILL_SCH.Cascade_Dates_SLL
12955 (
12956 p_top_line_id => p_cle_id,
12957 x_return_status => x_return_status,
12958 x_msg_count => l_msg_count,
12959 x_msg_data => l_msg_data );
12960
12961 END IF;
12962
12963 END IF; -- p_from_ste_code = 'CANCELLED'
12964
12965 return;
12966
12967 END IF; -- l_top_line_id is null
12968
12969
12970 Open l_bill_type_Csr;
12971 Fetch l_bill_type_Csr Into l_bill_type_Rec;
12972
12973 If l_bill_type_csr%Notfound then
12974 Close l_bill_type_Csr;
12975 x_return_status := 'E';
12976 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'BILLING SCHEDULE TYPE NOT FOUND.');
12977 RAISE G_EXCEPTION_HALT_VALIDATION;
12978 End If;
12979
12980 Close l_bill_type_Csr;
12981
12982 IF l_bill_type_rec.billing_schedule_type = 'T' then
12983
12984 l_index := 0;
12985 l_top_bs_tbl.DELETE;
12986
12987 FOR l_line_BS_rec IN l_line_BS_csr(l_top_line_id)
12988 LOOP
12989 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
12990 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
12991 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
12992 l_top_bs_tbl(l_index).date_end := l_line_BS_rec.date_end;
12993 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
12994
12995 l_index := l_index + 1;
12996 END LOOP;
12997
12998 -- check there is any billing schedule exists for this sub-line
12999 If l_index = 0 then
13000 Return;
13001 End if;
13002
13003 l_index := 0;
13004 l_cp_bs_tbl.DELETE;
13005
13006 FOR l_cp_BS_rec IN l_cp_BS_csr
13007 LOOP
13008 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
13009 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
13010 l_cp_bs_tbl(l_index).Amount := l_cp_BS_rec.amount;
13011
13012 l_index := l_index + 1;
13013 END LOOP;
13014
13015 IF l_cp_bs_tbl.COUNT > 0 THEN
13016
13017
13018 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
13019 l_top_bs_ind := l_top_bs_tbl.FIRST;
13020
13021 WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > l_top_bs_tbl(l_top_bs_ind).DATE_START
13022 AND l_top_bs_ind < l_top_bs_tbl.LAST
13023 LOOP
13024 l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
13025 END LOOP;
13026
13027
13028 IF l_top_bs_ind = l_top_bs_tbl.first THEN
13029 NULL;
13030
13031 ELSIF l_top_bs_ind <= l_top_bs_tbl.LAST THEN
13032
13033 l_top_bs_ind := l_top_bs_ind - 1;
13034
13035 IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= l_top_bs_tbl(l_top_bs_ind ).DATE_START
13036 AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= l_top_bs_tbl(l_top_bs_ind ).DATE_end THEN
13037
13038 NULL;
13039 ELSE
13040 l_top_bs_ind := l_top_bs_ind + 1;
13041 END IF;
13042
13043 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(l_top_bs_tbl(l_top_bs_ind).DATE_START) THEN
13044 NULL;
13045
13046 end if;
13047
13048
13049 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
13050 LOOP
13051 IF ((p_from_ste_code = 'ENTERED' ) AND (p_to_ste_code = 'CANCELLED')) then
13052 l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) - nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
13053 ElsIf ((p_from_ste_code = 'CANCELLED' ) AND (p_to_ste_code = 'ENTERED')) then
13054 l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) + nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
13055 End if;
13056 l_top_bs_ind := l_top_bs_ind + 1;
13057 END LOOP;
13058
13059 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
13060 p_api_version => l_api_version,
13061 p_init_msg_list => l_init_msg_list,
13062 x_return_status => x_return_status,
13063 x_msg_count => l_msg_count,
13064 x_msg_data => l_msg_data,
13065 p_letv_tbl => l_top_bs_tbl,
13066 x_letv_tbl => l_lvl_ele_tbl_out);
13067
13068 IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
13069 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
13070 ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
13071 RAISE OKC_API.G_EXCEPTION_ERROR;
13072 END IF;
13073
13074 END IF; ---l_cp_bs_tbl.COUNT > 0
13075
13076
13077 END IF; ---l_bill_type = 'T'
13078
13079 END Sts_change_subline_lvl_rule;
13080
13081 /*Added for ER 16039680*/
13082 FUNCTION round_quantity(f_target_qty IN NUMBER )
13083 RETURN NUMBER
13084 IS
13085 l_round_quantity NUMBER;
13086 BEGIN
13087 SELECT (f_target_qty - f_target_qty) INTO l_round_quantity FROM DUAL ;
13088 RETURN l_round_quantity;
13089 END round_quantity;
13090
13091 PROCEDURE Get_Billed_Amount(p_start_date IN Date,
13092 p_end_date IN Date,
13093 p_total_amount IN NUMBER,
13094 p_item_type IN VARCHAR2,
13095 p_org_id IN NUMBER,
13096 p_billingprofile_id IN NUMBER,
13097 p_currency_code IN VARCHAR2,
13098 p_substemplate_id IN NUMBER DEFAULT NULL,
13099 x_bill_amount OUT NOCOPY NUMBER,
13100 x_bill_enddate OUT NOCOPY DATE
13101 )
13102
13103 IS
13104
13105 l_constant_sll_amt number;
13106 l_return_status varchar2(10);
13107 l_tce_code VARCHAR2(100);
13108 l_uom_quantity NUMBER;
13109 l_remaining_amt NUMBER;
13110 l_fnd_lvl_in_rec oks_bill_util_pub.bill_det_inp_rec;
13111 l_fnd_lvl_out_rec oks_bill_util_pub.bill_sch_rec;
13112 Strm_Start_Date DATE;
13113 l_quantity NUMBER;
13114 l_lvl_amt NUMBER;
13115 --l_adjusted_amt NUMBER;
13116 l_msg_count NUMBER;
13117 l_msg_data VARCHAR2(2000);
13118 l_period_type VARCHAR2(100) :=NULL;
13119 l_period_start VARCHAR2(100) :=NULL;
13120 l_price_uom VARCHAR2(100) :=NULL;
13121 l_period_freq NUMBER;
13122 --p_item_type varchar2(100);
13123 l_timeunit varchar2(100);
13124 l_level_periods NUMBER;
13125 l_target_qty NUMBER;
13126 r_target_qty NUMBER;
13127 l_unit_price NUMBER;
13128 l_source_unit_price NUMBER;
13129 l_uom varchar2(100);
13130 l_dur number;
13131
13132 CURSOR l_billing_profile_csr(l_billing_profile_id NUMBER) IS
13133 SELECT BILLING_LEVEL,
13134 BILLING_TYPE,
13135 INTERVAL,
13136 INTERFACE_OFFSET,
13137 INVOICE_OFFSET,
13138 INVOICE_OBJECT1_ID1,
13139 ACCOUNT_OBJECT1_ID1
13140 FROM OKS_BILLING_PROFILES_V
13141 WHERE ID = l_billing_profile_Id;
13142 --l_return_status VARCHAR2(200);
13143 l_billing_profile_Csr_Rec l_billing_profile_csr%Rowtype;
13144 l_start_date Date;
13145 l_end_date Date;
13146 l_billing_profile_id NUMBER;
13147 l_duration NUMBER := 0;
13148 --l_timeunit VARCHAR2(10);
13149 l_source_uom VARCHAR2(100) := NULL;
13150 p_billing_type varchar2(100);
13151 l_org_id NUMBER;
13152 l_tangible Boolean := FALSE;
13153 l_pricing_method varchar2(100);
13154 /*Added for bug 16293821 */
13155 Function is_tangible
13156 ( p_id IN NUMBER
13157 ) Return BOOLEAN IS
13158 Cursor subs_hdr Is
13159 Select item_type From oks_subscr_header_b Where id = p_id;
13160 l_type Varchar2(240);
13161 l_tangible Boolean := FALSE;
13162 Begin
13163 Open subs_hdr;
13164 Fetch subs_hdr into l_type;
13165 IF l_type like '%T' THEN
13166 l_tangible := TRUE;
13167 END IF;
13168 Close subs_hdr;
13169 Return l_tangible;
13170 Exception
13171 When others then
13172 Return l_tangible;
13173 End is_tangible;
13174 /*Added for bug 16293821 */
13175 BEGIN
13176
13177 l_start_date :=p_start_date;
13178 l_end_date :=p_end_date;
13179 l_org_id :=p_org_id; /*Added for bug 16293821 */
13180
13181 /*Added for bug 16293821 */
13182 If p_start_date is null or p_end_date is null or p_total_amount is null then
13183 RAISE G_EXCEPTION_HALT_VALIDATION;
13184 End if;
13185
13186 oks_renew_util_pub.get_period_defaults
13187 (p_hdr_id => NULL,
13188 p_org_id => l_org_id,
13189 x_period_type => l_period_type,
13190 x_period_start => l_period_start,
13191 x_price_uom => l_price_uom,
13192 x_return_status => l_return_status
13193 );
13194
13195 IF l_period_start IS NOT NULL AND
13196 l_period_type IS NOT NULL
13197 THEN
13198 IF p_item_type = 'SUBSCRIPTION' THEN
13199 --mchoudha fix for bug#5183011
13200 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_substemplate_id);
13201 IF l_tangible THEN
13202 l_period_start := NULL;
13203 l_period_type := NULL;
13204 ELSE
13205 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
13206 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
13207 l_period_start := NULL;
13208 l_period_type := NULL;
13209 ELSE
13210 l_period_start := 'SERVICE';
13211 END IF; -- l_pricing_method <> 'EFFECTIVITY'
13212 END IF; -- IF l_tangible THEN
13213 ELSE
13214 l_period_start := 'SERVICE';
13215 END IF; -- IF p_item_type = 'SUBSCRIPTION'
13216 END IF;
13217
13218 /*Added for bug 16293821 */
13219
13220 /* Commented for bug 16293821
13221 If p_item_type <> 'TANGIBLE' then
13222 p_period_type :=NULL ;
13223 p_period_start :='SERVICE';
13224 End If;
13225 */
13226
13227 If p_item_type ='SERVICE' then
13228 p_billing_type :='T';
13229 else
13230 p_billing_type :='E';
13231 end if;
13232
13233
13234 --dbms_output.put_line('l_billing_profile_Csr_Rec.BILLING_TYPE - '||p_billingprofile_id);
13235
13236 If p_billingprofile_id is not null then
13237
13238 OPEN l_billing_profile_csr(p_billingprofile_id);
13239 FETCH l_billing_profile_csr INTO l_billing_profile_Csr_Rec;
13240 CLOSE l_billing_profile_csr;
13241
13242 --dbms_output.put_line('l_billing_profile_Csr_Rec.BILLING_TYPE - '||l_billing_profile_Csr_Rec.BILLING_TYPE);
13243 IF l_billing_profile_Csr_Rec.BILLING_TYPE = 'ONETIME' THEN
13244
13245 l_level_periods := 1;
13246 OKC_TIME_UTIL_PUB.get_duration(
13247 p_start_date => l_start_date
13248 , p_end_date => l_end_date
13249 , x_duration => l_duration
13250 , x_timeunit => l_timeunit
13251 , x_return_status => l_return_status);
13252 ELSE
13253 IF l_billing_profile_Csr_Rec.BILLING_TYPE = 'RECURRING' THEN
13254
13255 --dbms_output.put_line('l_billing_profile_Csr_Rec.interval - '||l_billing_profile_Csr_Rec.interval);
13256
13257 l_target_qty := OKS_TIME_MEASURES_PUB.get_quantity(
13258 l_start_date
13259 , l_end_date
13260 , l_billing_profile_Csr_Rec.interval);
13261
13262 --dbms_output.put_line('l_target_qty - '||l_target_qty);
13263
13264 r_target_qty := round_quantity( f_target_qty => l_target_qty);
13265 IF r_target_qty = 0 THEN -- i.e get_quantity returns a whole number
13266 -- added function ceil to the variable l_target_qty for bug 3497141
13267 l_level_periods := ceil(l_target_qty);
13268 l_duration := 1; --UOM/PERIOD
13269 l_timeunit := l_billing_profile_Csr_Rec.interval; -- UOM
13270
13271 ELSE
13272 l_level_periods := 1;
13273 OKC_TIME_UTIL_PUB.get_duration(
13274 p_start_date => l_start_date
13275 , p_end_date => l_end_date
13276 , x_duration => l_duration
13277 , x_timeunit => l_timeunit
13278 , x_return_status => l_return_status);
13279 END IF;
13280 END IF;
13281 END IF;
13282 END IF;
13283
13284
13285 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
13286 p_timeunit => l_timeunit,
13287 x_return_status => l_return_status,
13288 x_quantity => l_uom_quantity ,
13289 x_timeunit => l_tce_code);
13290
13291 IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
13292 RAISE G_EXCEPTION_HALT_VALIDATION;
13293 END IF;
13294
13295
13296 l_remaining_amt := p_total_amount;
13297
13298 -------------------------------------------------------------------------
13299 -- Begin partial period computation logic
13300 -- Developer Mani Choudhary
13301 -- Date 17-MAY-2005
13302 -- get the converted unit price per SLL UOM derived from the unit price stored at the
13303 -- subline.
13304 -------------------------------------------------------------------------
13305
13306
13307 IF l_period_start is not null AND l_period_type is not null THEN
13308
13309 /* Commented for bug 16293821
13310
13311 l_constant_sll_amt := OKS_BILL_SCH.Get_Unit_Price_Per_Uom
13312 (Null,
13313 l_timeunit,
13314 p_period_start,
13315 p_period_type,
13316 l_duration,
13317 l_end_date,
13318 NULL); */
13319
13320 /*Added for bug 16293821 */
13321
13322 okc_time_util_pub.get_duration(p_start_date,p_end_date,l_dur,l_uom,l_return_status);
13323
13324 l_dur := OKS_TIME_MEASURES_PUB.get_quantity (
13325 p_start_date => p_start_date,
13326 p_end_date => p_end_date,
13327 p_source_uom => l_uom,
13328 p_period_type => l_period_type,
13329 p_period_start => l_period_start
13330 );
13331 l_source_unit_price := p_total_amount /l_dur;
13332
13333 IF l_uom <> l_timeunit THEN
13334 l_unit_price := OKS_BILL_SCH.Get_Converted_price(
13335 p_price_uom => l_timeunit,
13336 p_pl_uom =>l_uom,
13337 p_period_start =>l_period_start,
13338 p_period_type =>l_period_type,
13339 p_price_negotiated =>p_total_amount,
13340 p_unit_price =>l_source_unit_price,
13341 p_start_date =>p_start_date,
13342 p_end_date =>p_end_date
13343 );
13344 IF l_unit_price is NULL THEN
13345 RAISE G_EXCEPTION_HALT_VALIDATION;
13346 END IF;
13347 ELSE
13348 l_unit_price := l_source_unit_price;
13349 END IF;
13350
13351 l_constant_sll_amt :=nvl(l_unit_price*l_duration,0);
13352
13353 /*Added for bug 16293821 */
13354
13355 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13356 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13357 'after calling OKS_BILL_SCH.Get_Unit_Price_Per_Uom '
13358 ||' result l_constant_sll_amt = ' || l_constant_sll_amt);
13359 END IF;
13360 IF l_constant_sll_amt IS NULL THEN
13361 l_return_status := G_RET_STS_ERROR;
13362 RAISE G_EXCEPTION_HALT_VALIDATION;
13363 END IF;
13364
13365 ELSE
13366 /*Added for bug 16685173 */
13367 IF p_item_type = 'SUBSCRIPTION' then
13368 l_constant_sll_amt := ( p_total_amount /nvl(l_level_periods,1));
13369 l_constant_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_constant_sll_amt, p_currency_code);
13370
13371 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13372 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Constant_sll_Amount',
13373 ' Get_Constant_sll_Amount for subscription '
13374 ||' l_constant_sll_amt = ' || l_constant_sll_amt);
13375 END IF;
13376
13377 ELSE
13378 /*Added for bug 16685173 */
13379 Get_Constant_sll_Amount(
13380 p_line_start_date =>trunc(to_date(p_start_date)),
13381 p_line_end_date => trunc(to_date(p_end_date)),
13382 p_cycle_start_date => trunc(to_date(p_start_date)),
13383 p_remaining_amount => p_total_amount,
13384 P_uom_quantity => l_uom_quantity,
13385 P_tce_code => l_tce_code,
13386 x_constant_sll_amt => l_constant_sll_amt,
13387 x_return_status => l_return_status);
13388 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13389 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Constant_sll_Amount',
13390 ' Get_Constant_sll_Amount '
13391 ||' l_constant_sll_amt = ' || l_constant_sll_amt);
13392 END IF;
13393 END IF; /*Added for bug 16685173 */
13394 END IF;
13395
13396 l_fnd_lvl_in_rec.line_start_date := trunc(to_date(p_start_date));
13397 l_fnd_lvl_in_rec.line_end_date := trunc(to_date(p_end_date));
13398 l_fnd_lvl_in_rec.cycle_start_date := trunc(to_date(p_start_date));
13399 l_fnd_lvl_in_rec.tuom_per_period :=l_duration;
13400 l_fnd_lvl_in_rec.tuom := l_timeunit;
13401 l_fnd_lvl_in_rec.bill_type := p_billing_type;
13402 l_fnd_lvl_in_rec.total_amount := p_total_amount ;
13403 l_fnd_lvl_in_rec.invoice_offset_days := l_billing_profile_Csr_Rec.invoice_offset;
13404 l_fnd_lvl_in_rec.interface_offset_days := l_billing_profile_Csr_Rec.Interface_offset;
13405 l_fnd_lvl_in_rec.uom_per_period := l_level_periods;
13406
13407 IF fnd_log.level_procedure >= fnd_log.g_current_runtime_level THEN
13408 fnd_log.string(fnd_log.level_procedure,G_MODULE_CURRENT||'.Get_Billed_Amount',
13409 'Calling oks_bill_util_pub.Get_next_bill_sch with parameters '
13410 ||'period start = ' || l_period_start
13411 ||', period type = ' || l_period_type);
13412 END IF;
13413
13414 --Dbms_Output.put_line('l_fnd_lvl_in_rec.line_start_date - '||l_fnd_lvl_in_rec.line_start_date);
13415
13416 OKS_BILL_UTIL_PUB.Get_next_bill_sch
13417 (p_api_version => l_api_version,
13418 x_return_status => l_return_status,
13419 x_msg_count => l_msg_count,
13420 x_msg_data => l_msg_data,
13421 p_invoicing_rule_id => l_billing_profile_Csr_Rec.INVOICE_OBJECT1_ID1,
13422 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
13423 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
13424 p_period_start => l_period_start,
13425 p_period_type => l_period_type,
13426 Strm_Start_Date => trunc(to_date(p_start_date)));
13427
13428 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13429 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13430 'after calling OKS_TIME_MEASURES_PUB.get_quantity with period start '||l_period_start||' ,l_period_type '||l_period_type
13431 ||' l_fnd_lvl_out_rec.next_cycle_date = ' || l_fnd_lvl_out_rec.next_cycle_date);
13432 END IF;
13433
13434
13435 IF p_billing_type = 'T' then
13436 IF l_period_start is not null AND l_period_type is not null THEN
13437 /* Commented for bug 16293821 as contracts created from OM will always have period_start as SERVICE and no partial period at beginning of schedule
13438
13439 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > trunc(to_date(p_start_date)) THEN
13440 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
13441 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
13442 (p_start_date => trunc(to_date(p_start_date)),
13443 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
13444 p_source_uom => l_fnd_lvl_in_rec.tuom,--nvl(p_SubLine_rec.cp_price_uom,l_uom), --line price uom
13445 p_period_type => l_period_type ,
13446 p_period_start => l_period_start);
13447
13448 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13449 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13450 'after calling OKS_TIME_MEASURES_PUB.get_quantity with period start '||l_period_start||' ,l_period_type '||l_period_type
13451 ||' result l_quantity = ' || l_quantity);
13452 END IF;
13453
13454 IF nvl(l_quantity,0) = 0 THEN
13455 l_return_status := G_RET_STS_ERROR;
13456 RAISE G_EXCEPTION_HALT_VALIDATION;
13457 END IF;
13458 l_lvl_amt := nvl(l_constant_sll_amt*l_quantity/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
13459 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13460 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13461 ' result l_lvl_amt = ' || l_lvl_amt);
13462 END IF; --mchoudha added else logic for WEEK kind of uoms
13463 ELSE
13464 l_lvl_amt := nvl(l_constant_sll_amt*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(trunc(to_date(p_start_date))))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
13465 END IF;
13466 ELSE
13467 */
13468 l_lvl_amt := nvl(l_constant_sll_amt,0);
13469 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13470 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13471 ' l_lvl_amt = ' || l_lvl_amt);
13472 END IF;
13473 ELSE
13474
13475 Get_Period_Frequency(p_line_start_date => trunc(to_date(p_start_date)),
13476 p_line_end_date => trunc(to_date(p_end_date)),
13477 p_cycle_start_date => trunc(to_date(p_start_date)),
13478 p_next_billing_date => trunc(l_fnd_lvl_out_rec.next_cycle_date),
13479 P_uom_quantity => l_uom_quantity,
13480 P_tce_code => l_tce_code,
13481 p_uom_per_period => l_duration,
13482 x_period_freq => l_period_freq,
13483 x_return_status => l_return_status);
13484
13485
13486 -----errorout_ad('Get_Period_Frequency = ' || l_return_status);
13487 IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
13488 RAISE G_EXCEPTION_HALT_VALIDATION;
13489 END IF;
13490
13491 l_lvl_amt := (NVL(l_period_freq,0) * NVL(l_constant_sll_amt,0) );
13492 END IF;
13493 ELSE
13494 l_lvl_amt := Nvl(l_constant_sll_amt,0);
13495 END IF;
13496
13497 --dbms_output.put_line('l_constant_sll_amt - '||l_lvl_amt);
13498
13499 x_bill_amount :=OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_lvl_amt,p_currency_code);
13500 x_bill_enddate :=TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
13501
13502 /*Added for bug 16685173 */
13503 if (x_bill_enddate > p_end_date) then
13504 x_bill_enddate := p_end_date;
13505 end if;
13506 /*Added for bug 16685173 */
13507
13508 --dbms_output.put_line('l_constant_sll_amt - '||l_lvl_amt);
13509 --dbms_output.put_line('x_bill_enddate - '||x_bill_enddate);
13510 EXCEPTION
13511
13512 WHEN G_EXCEPTION_HALT_VALIDATION THEN
13513
13514 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
13515 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.Get_Billed_Amount.EXCEPTION',
13516 'G_EXCEPTION_HALT_VALIDATION');
13517 END IF;
13518
13519 x_bill_amount := NULL;
13520 x_bill_enddate := NULL;
13521
13522 WHEN OTHERS THEN
13523
13524 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
13525 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Get_Billed_Amount.UNEXPECTED',
13526 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
13527 END IF;
13528 x_bill_amount := NULL;
13529 x_bill_enddate := NULL;
13530 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
13531 p_msg_name => G_UNEXPECTED_ERROR,
13532 p_token1 => G_SQLCODE_TOKEN,
13533 p_token1_value => sqlcode,
13534 p_token2 => G_SQLERRM_TOKEN,
13535 p_token2_value => sqlerrm);
13536
13537 end;
13538
13539 /*Added for ER 16039680*/
13540
13541
13542
13543
13544 END OKS_BILL_SCH;