[Home] [Help]
PACKAGE BODY: APPS.OKS_BILL_SCH
Source
1 Package Body OKS_BILL_SCH AS
2 /* $Header: OKSBLSHB.pls 120.45 2007/12/24 11:51:51 harlaksh noship $ */
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 IF p_period_start is not null AND
2127 p_period_type is not null AND
2128 p_period_start = 'CALENDAR' AND
2129 l_tce_code not in ('DAY','HOUR','MINUTE')
2130 THEN
2131 l_end_date := OKS_BILL_UTIL_PUB.get_enddate_cal
2132 (l_start_date,
2133 p_strm_lvl_tbl(l_tbl_count).uom_code,
2134 p_strm_lvl_tbl(l_tbl_count).uom_per_period,
2135 p_strm_lvl_tbl(l_tbl_count).level_periods);
2136
2137 ELSE
2138 --Existing Logic for calculating SLL end date
2139
2140 l_end_date := OKC_TIME_UTIL_PUB.get_enddate(
2141 l_start_date,
2142 p_strm_lvl_tbl(l_tbl_count).uom_code,
2143 (p_strm_lvl_tbl(l_tbl_count).level_periods * p_strm_lvl_tbl(l_tbl_count).uom_per_period));
2144
2145 END IF;
2146 --If the sll end date and line end date falls in the same month and
2147 --sll end date > line end date , then assign line end date to sll emd date
2148 IF (l_end_date > p_end_dt AND p_period_start is not null
2149 AND p_period_type is not null) THEN
2150 l_end_date := p_end_dt;
2151 END IF;
2152
2153 -------------------------------------------------------------------------
2154 -- End partial period computation logic
2155 -- Date 09-MAY-2005
2156 -------------------------------------------------------------------------
2157 l_strm_lvl_tbl_in(1).chr_id := p_strm_lvl_tbl(l_tbl_count).chr_id;
2158 l_strm_lvl_tbl_in(1).cle_id := p_strm_lvl_tbl(l_tbl_count).cle_id;
2159 l_strm_lvl_tbl_in(1).dnz_chr_id := p_dnz_chr_id;
2160 l_strm_lvl_tbl_in(1).sequence_no := p_strm_lvl_tbl(l_tbl_count).sequence_no ;
2161 l_strm_lvl_tbl_in(1).uom_code := p_strm_lvl_tbl(l_tbl_count).uom_code;
2162 l_strm_lvl_tbl_in(1).start_date := l_start_date;
2163 l_strm_lvl_tbl_in(1).end_date := l_end_date;
2164 l_strm_lvl_tbl_in(1).level_periods := p_strm_lvl_tbl(l_tbl_count).level_periods;
2165 l_strm_lvl_tbl_in(1).uom_per_period := p_strm_lvl_tbl(l_tbl_count).uom_per_period;
2166 l_strm_lvl_tbl_in(1).level_amount := l_sll_amount;
2167 l_strm_lvl_tbl_in(1).invoice_offset_days := p_strm_lvl_tbl(l_tbl_count).invoice_offset_days;
2168 l_strm_lvl_tbl_in(1).interface_offset_days := p_strm_lvl_tbl(l_tbl_count).interface_offset_days;
2169
2170
2171 l_strm_lvl_tbl_in(1).object_version_number := OKC_API.G_MISS_NUM;
2172 l_strm_lvl_tbl_in(1).created_by := OKC_API.G_MISS_NUM;
2173 l_strm_lvl_tbl_in(1).creation_date := SYSDATE;
2174 l_strm_lvl_tbl_in(1).last_updated_by := OKC_API.G_MISS_NUM;
2175 l_strm_lvl_tbl_in(1).last_update_date := SYSDATE;
2176
2177 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2178
2179 fnd_log.STRING (fnd_log.level_statement,
2180 G_MODULE_CURRENT || '.create_stream_level.sll_dtls',
2181 ' line id = ' || l_strm_lvl_tbl_in(1).cle_id
2182 || ', chr_id = ' || l_strm_lvl_tbl_in(1).chr_id
2183 || ', start date = ' || l_strm_lvl_tbl_in(1).start_date
2184 || ', end date = ' || l_strm_lvl_tbl_in(1).end_date
2185 || ', amount = ' || l_strm_lvl_tbl_in(1).level_amount
2186 || ', period = ' || l_strm_lvl_tbl_in(1).level_periods
2187 || ', uom_per_period = ' || l_strm_lvl_tbl_in(1).uom_per_period
2188 || ', uom = ' || l_strm_lvl_tbl_in(1).uom_code
2189 || ', sequence = ' || l_strm_lvl_tbl_in(1).sequence_no
2190 || ', inv-interface offset = ' || l_strm_lvl_tbl_in(1).invoice_offset_days
2191 || ', ' || l_strm_lvl_tbl_in(1).interface_offset_days
2192 );
2193 END IF;
2194
2195 IF (l_sll_id IS NULL) THEN
2196
2197 OKS_SLL_PVT.insert_row(
2198 p_api_version => l_api_version,
2199 p_init_msg_list => l_init_msg_list,
2200 x_return_status => x_return_status,
2201 x_msg_count => l_msg_count,
2202 x_msg_data => l_msg_data,
2203 p_sllv_tbl => l_strm_lvl_tbl_in,
2204 x_sllv_tbl => l_strm_lvl_tbl_out);
2205
2206 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2207 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.insert',
2208 'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
2209 ||', sll id created = '||l_strm_lvl_tbl_out(1).id ||')');
2210 END IF;
2211
2212 -----errorout_ad('SllCREATED : '|| x_return_status);
2213 -----errorout_ad('sll id = ' || l_strm_lvl_tbl_in(1));
2214
2215
2216 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2217 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2218 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2219 RAISE OKC_API.G_EXCEPTION_ERROR;
2220 END IF;
2221
2222 ELSE --sll id not null
2223 l_strm_lvl_tbl_in(1).id := l_sll_id;
2224 l_strm_lvl_tbl_in(1).object_version_number := l_obj_version;
2225
2226 OKS_SLL_PVT.update_row(
2227 p_api_version => l_api_version,
2228 p_init_msg_list => l_init_msg_list,
2229 x_return_status => x_return_status,
2230 x_msg_count => l_msg_count,
2231 x_msg_data => l_msg_data,
2232 p_sllv_tbl => l_strm_lvl_tbl_in,
2233 x_sllv_tbl => l_strm_lvl_tbl_out);
2234
2235 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2236 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.update',
2237 'OKS_SLL_PVT.update_row(x_return_status = '||x_return_status
2238 ||', sll id updated = '||l_strm_lvl_tbl_out(1).id ||')');
2239 END IF;
2240
2241 -----errorout_ad('STREAM LEVEL RULE updated : '|| x_return_status);
2242
2243
2244 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2245 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2246 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2247 RAISE OKC_API.G_EXCEPTION_ERROR;
2248 END IF;
2249
2250 END IF;
2251
2252 x_sll_out_tbl(l_tbl_count).chr_Id := l_strm_lvl_tbl_out(1).chr_id;
2253 x_sll_out_tbl(l_tbl_count).cle_Id := l_strm_lvl_tbl_out(1).cle_id;
2254 x_sll_out_tbl(l_tbl_count).dnz_chr_Id := l_strm_lvl_tbl_out(1).dnz_chr_id;
2255 x_sll_out_tbl(l_tbl_count).Id := l_strm_lvl_tbl_out(1).id;
2256 x_sll_out_tbl(l_tbl_count).Seq_no := l_strm_lvl_tbl_out(1).sequence_no;
2257 x_sll_out_tbl(l_tbl_count).Dt_start := l_strm_lvl_tbl_out(1).start_date;
2258 x_sll_out_tbl(l_tbl_count).end_date := l_strm_lvl_tbl_out(1).end_date;
2259 x_sll_out_tbl(l_tbl_count).Level_Period := l_strm_lvl_tbl_out(1).level_periods;
2260 x_sll_out_tbl(l_tbl_count).uom_Per_Period := l_strm_lvl_tbl_out(1).uom_per_period;
2261 x_sll_out_tbl(l_tbl_count).uom := l_strm_lvl_tbl_out(1).uom_code;
2262 x_sll_out_tbl(l_tbl_count).Amount := l_strm_lvl_tbl_out(1).level_amount;
2263 x_sll_out_tbl(l_tbl_count).invoice_offset_days := l_strm_lvl_tbl_out(1).invoice_offset_days;
2264 x_sll_out_tbl(l_tbl_count).Interface_offset_days := l_strm_lvl_tbl_out(1).interface_offset_days;
2265
2266 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2267
2268 fnd_log.STRING (fnd_log.level_statement,
2269 G_MODULE_CURRENT || '.create_stream_level.top_sll_dtls',
2270 ' sll id = ' || x_sll_out_tbl(l_tbl_count).Id
2271 || ', start date = ' || x_sll_out_tbl(l_tbl_count).Dt_start
2272 );
2273 END IF;
2274
2275 End Loop;
2276
2277 --Bug Fix 5185658
2278
2279 --IF p_billing_type IN ('P','E') AND p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments IS NOT NULL AND
2280 -- p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments = '99' AND p_subline_call = 'N' THEN
2281
2282 IF (
2283 p_billing_type IN ('P','E') AND p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments IS NOT NULL AND
2284 p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments = '99' AND p_subline_call = 'N'
2285 )
2286 OR
2287 (
2288 l_lse_id = 46 AND p_period_start = 'SERVICE' AND p_billing_type = 'E' AND nvl(pkg_cascade_billing_hdr, 'N') = 'Y'
2289 )
2290 THEN
2291
2292 --End Bug Fix 5185658
2293
2294 l_sll_prorate_tbl.DELETE;
2295
2296 FOR l_index IN x_sll_out_tbl.FIRST .. x_sll_out_tbl.LAST
2297 LOOP
2298 l_sll_prorate_tbl(l_index).sll_seq_num := l_index;
2299 l_sll_prorate_tbl(l_index).sll_start_date := x_sll_out_tbl(l_index).Dt_start;
2300 l_sll_prorate_tbl(l_index).sll_end_date := x_sll_out_tbl(l_index).end_Date;
2301 l_sll_prorate_tbl(l_index).sll_tuom := x_sll_out_tbl(l_index).uom;
2302 l_sll_prorate_tbl(l_index).sll_period := x_sll_out_tbl(l_index).level_period;
2303 --03-NOV-2005-mchoudha-Fix for bug#4691026
2304 l_sll_prorate_tbl(l_index).sll_uom_per_period := x_sll_out_tbl(l_index).uom_per_period;
2305 END LOOP;
2306
2307
2308 Calculate_sll_amount(
2309 p_api_version => l_api_version,
2310 p_total_amount => p_line_amt,
2311 p_currency_code => l_currency_code,
2312 p_period_start => p_period_start,
2313 p_period_type => p_period_type,
2314 p_sll_prorated_tab => l_sll_prorate_tbl,
2315 x_return_status => x_return_status);
2316
2317 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2318 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.prorate',
2319 'Calculate_sll_amount(x_return_status = '||x_return_status
2320 ||', l_sll_prorate_tbl count = '|| l_sll_prorate_tbl.count ||')');
2321 END IF;
2322
2323
2324 -----errorout_ad ('Get_sll_amount STATUS = ' || x_return_status);
2325
2326
2327 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2328 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2329 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2330 RAISE OKC_API.G_EXCEPTION_ERROR;
2331 END IF;
2332
2333 FOR l_index IN l_sll_prorate_tbl.FIRST .. l_sll_prorate_tbl.LAST
2334 LOOP
2335 UPDATE oks_stream_levels_b
2336 Set level_amount = l_sll_prorate_tbl(l_index).sll_amount
2337 WHERE id = x_sll_out_tbl(l_index).id;
2338
2339 x_sll_out_tbl(l_index).amount := l_sll_prorate_tbl(l_index).sll_amount;
2340 END LOOP; ---END OF UPDATE LOOP
2341
2342
2343 END IF; ----end for chk if proration required for copied.
2344
2345
2346 EXCEPTION
2347 WHEN G_EXCEPTION_HALT_VALIDATION THEN
2348 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
2349 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_stream_level.EXCEPTION',
2350 'G_EXCEPTION_HALT_VALIDATION');
2351 END IF;
2352 x_return_status := 'E';
2353
2354 WHEN OTHERS THEN
2355 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2356 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Create_Stream_Level.UNEXPECTED',
2357 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2358 END IF;
2359
2360 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
2361 p_msg_name => G_UNEXPECTED_ERROR,
2362 p_token1 => G_SQLCODE_TOKEN,
2363 p_token1_value => sqlcode,
2364 p_token2 => G_SQLERRM_TOKEN,
2365 p_token2_value => sqlerrm);
2366
2367 x_return_status := G_RET_STS_UNEXP_ERROR;
2368
2369 End Create_Stream_Level;
2370
2371
2372
2373 FUNCTION chk_Sll_Exists(p_id IN NUMBER) return number IS
2374
2375 CURSOR l_sll_csr(p_sll_id NUMBER) IS
2376 SELECT id ,object_version_number
2377 FROM oks_stream_levels_b
2378 WHERE ID = p_sll_id;
2379
2380 l_sll_rec l_sll_csr%ROWTYPE;
2381 BEGIN
2382
2383 IF p_id is null THEN
2384 return(null);
2385 ELSE
2386 OPEN l_sll_csr(p_id);
2387 FETCH l_sll_csr INTO l_sll_rec;
2388
2389 IF l_sll_csr%NOTFOUND THEN
2390 CLOSE l_sll_csr;
2391 return(null);
2392 ELSE
2393 CLOSE l_sll_csr;
2394 return(l_sll_rec.object_version_number);
2395 END IF;
2396 END IF;
2397
2398
2399 EXCEPTION
2400 WHEN OTHERS then
2401 RETURN(null);
2402
2403 END chk_Sll_Exists;
2404
2405
2406
2407 --------------------------------------------------------------------------
2408 -- Begin partial period computation logic
2409 -- Developer Mani Choudhary
2410 -- Date 09-MAY-2005
2411 -- Added two new parameters P_period_start,P_period_type in procedural call
2412 ---------------------------------------------------------------------------
2413 PROCEDURE Bill_Sch_Cp
2414 ( p_billing_type IN VARCHAR2,
2415 p_bsll_tbl IN StreamLvl_tbl,
2416 p_Line_Rec IN Line_Det_Type,
2417 p_SubLine_rec IN Prod_Det_Type,
2418 p_invoice_rulid IN Number,
2419 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
2420 p_term_dt IN DATE,
2421 p_period_start IN VARCHAR2,
2422 p_period_type IN VARCHAR2,
2423 x_return_status OUT NOCOPY Varchar2
2424 )
2425 IS
2426
2427 Cursor l_Line_Amt_Csr(p_line_id IN NUMBER) Is
2428 SELECT (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
2429 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
2430 FROM okc_k_lines_b line, oks_k_lines_b dtl
2431 WHERE line.id = p_line_id
2432 AND line.id = dtl.cle_id;
2433
2434 l_cp_sll_out_tbl StrmLvl_Out_tbl;
2435 l_cp_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
2436 l_line_amt NUMBER;
2437 l_subline_amt NUMBER;
2438
2439 BEGIN
2440
2441 ---the procedure creates sll and level elements for subline.
2442 -----errorout_ad('in bill_sch_cp');
2443 x_return_status := 'S';
2444
2445 l_cp_sll_tbl := p_bsll_tbl;
2446
2447 FOR l_index IN l_cp_sll_tbl.FIRST .. l_cp_sll_tbl.LAST
2448 LOOP
2449 l_cp_sll_tbl(l_index).cle_id := p_subline_rec.cp_id;
2450 END LOOP;
2451
2452 UPDATE OKS_K_LINES_B SET billing_schedule_type = p_billing_type
2453 WHERE cle_id = p_subline_rec.cp_id;
2454
2455 -----create 'SLL'RECORDS
2456
2457 --------------------------------------------------------------------------
2458 -- Begin partial period computation logic
2459 -- Developer Mani Choudhary
2460 -- Date 09-MAY-2005
2461 -- Added two new parameters P_period_start,P_period_type in procedural call
2462 ---------------------------------------------------------------------------
2463
2464 IF p_period_type is not null AND p_period_start is not NULL THEN
2465 OPEN l_Line_Amt_Csr(p_Line_Rec.id);
2466 FETCH l_Line_Amt_Csr INTO l_line_amt;
2467 CLOSE l_Line_Amt_Csr;
2468 OPEN l_Line_Amt_Csr(p_SubLine_rec.cp_id);
2469 FETCH l_Line_Amt_Csr INTO l_subline_amt;
2470 CLOSE l_Line_Amt_Csr;
2471 ELSE
2472 l_line_amt := p_line_Rec.line_amt;
2473 l_subline_amt := p_subline_rec.cp_amt;
2474 END IF;
2475
2476
2477 Create_Stream_Level
2478 (p_billing_type => p_billing_type,
2479 p_strm_lvl_tbl => l_cp_sll_tbl,
2480 p_subline_call => 'Y',
2481 p_dnz_chr_id => p_line_rec.dnz_chr_id,
2482 p_line_amt => l_line_amt,
2483 p_subline_amt => l_subline_amt,
2484 p_sll_start_dt => p_line_rec.line_start_dt,
2485 p_end_dt => p_line_rec.line_end_dt,
2486 p_period_start => p_period_start,
2487 p_period_type => p_period_type,
2488 x_sll_out_tbl => l_cp_sll_out_tbl,
2489 x_return_status => x_return_status);
2490
2491 -------------------------------------------------------------------------
2492 -- End partial period computation logic
2493 -- Date 09-MAY-2005
2494 -------------------------------------------------------------------------
2495
2496 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2497 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.bill_sch_cp.sll',
2498 'Create_Stream_Level(x_return_status = '||x_return_status
2499 ||', l_cp_sll_out_tbl count = '|| l_cp_sll_out_tbl.count ||')');
2500 END IF;
2501
2502 -------------errorout_ad('SLL Record FOR SUBLINE = ' || TO_CHAR(l_cp_sll_out_tbl.count));
2503 ----if l_cp_sll_out_tbl.count > 0 then insert lines into oks_level_elements_v
2504 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
2505 RAISE G_EXCEPTION_HALT_VALIDATION;
2506 END IF;
2507
2508
2509
2510 -------------------------------------------------------------------------
2511 -- Begin partial period computation logic
2512 -- Developer Mani Choudhary
2513 -- Date 09-MAY-2005
2514 -- Added two new parameters p_period_start and p_period_type
2515 -------------------------------------------------------------------------
2516 Create_cp_lvl_elements(
2517 p_billing_type => p_billing_type,
2518 p_cp_sll_tbl => l_cp_sll_out_tbl,
2519 p_Line_Rec => p_Line_Rec,
2520 p_SubLine_rec => p_SubLine_rec,
2521 p_invoice_rulid => p_invoice_rulid,
2522 p_top_line_bs => p_top_line_bs,
2523 p_term_dt => p_term_dt,
2524 p_period_start => p_period_start,
2525 p_period_type => p_period_type,
2526 x_return_status => x_return_status);
2527
2528 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2529 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.bill_sch_cp.lvl_ele',
2530 'Create_cp_lvl_elements(x_return_status = '||x_return_status
2531 ||', p_term_dt passed = '|| p_term_dt ||')');
2532 END IF;
2533
2534 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
2535 RAISE G_EXCEPTION_HALT_VALIDATION;
2536 END IF;
2537
2538 EXCEPTION
2539 WHEN G_EXCEPTION_HALT_VALIDATION THEN
2540 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
2541 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.bill_sch_cp.EXCEPTION',
2542 'G_EXCEPTION_HALT_VALIDATION');
2543 END IF;
2544
2545 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2546 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2547 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2548 RAISE OKC_API.G_EXCEPTION_ERROR;
2549 END IF;
2550 WHEN OTHERS THEN
2551
2552 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2553 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.bill_sch_Cp.UNEXPECTED',
2554 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2555 END IF;
2556
2557 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
2558 p_msg_name => G_UNEXPECTED_ERROR,
2559 p_token1 => G_SQLCODE_TOKEN,
2560 p_token1_value => sqlcode,
2561 p_token2 => G_SQLERRM_TOKEN,
2562 p_token2_value => sqlerrm);
2563
2564 x_return_status := G_RET_STS_UNEXP_ERROR;
2565 END Bill_Sch_Cp;
2566
2567
2568
2569 PROCEDURE Copy_Bill_Sch
2570 (
2571 p_chr_id IN Number,
2572 p_cle_id IN Number,
2573 x_copy_bill_sch OUT NOCOPY ItemBillSch_tbl,
2574 x_return_status OUT NOCOPY Varchar2
2575 )
2576 IS
2577 Cursor l_LineSch_Csr is
2578 SELECT sll.sequence_no,element.cle_id,
2579 element.sequence_number, element.date_transaction,
2580 element.date_start, element.date_to_interface,
2581 element.date_completed, element.amount,element.date_end,
2582 element.rul_id
2583 FROM oks_level_elements element, oks_stream_levels_b sll
2584 WHERE sll.id = element.rul_id
2585 AND sll.cle_id = p_cle_id
2586 ORDER BY sll.sequence_no,to_number(element.sequence_number);
2587
2588 Cursor l_ContractSch_Csr Is
2589 SELECT sll.sequence_no,sll.chr_id,
2590 element.sequence_number, element.date_transaction,
2591 element.date_start, element.date_to_interface,
2592 element.date_completed, element.amount, element.date_end,
2593 element.rul_id
2594 FROM oks_level_elements element, oks_stream_levels_b sll
2595 WHERE sll.id = element.rul_id
2596 AND sll.chr_id = p_chr_id
2597 ORDER BY sll.sequence_no,to_number(element.sequence_number);
2598
2599
2600 l_LineSch_rec l_LineSch_Csr%ROWTYPE;
2601 l_ContractSch_rec l_ContractSch_Csr%ROWTYPE;
2602 i number;
2603
2604 BEGIN
2605 /* query the records from db for a line or contract and pass then in tbl format to form*/
2606
2607 -----errorout_ad('Copy_Bill_Sch START');
2608 x_return_status := 'S';
2609
2610 IF p_chr_id IS NULL and p_cle_id IS NOT NULL THEN --for line
2611 i := 1;
2612
2613 FOR l_LineSch_rec IN l_LineSch_csr
2614 LOOP
2615 x_copy_bill_sch(i).Chr_Id := NULL;
2616 x_copy_bill_sch(i).Cle_Id := l_LineSch_rec.Cle_Id;
2617 x_copy_bill_sch(i).Strm_Lvl_Seq_Num := l_LineSch_rec.sequence_no;
2618 x_copy_bill_sch(i).Lvl_Element_Seq_Num := l_LineSch_rec.sequence_number;
2619 x_copy_bill_sch(i).Tx_Date := l_LineSch_rec.date_transaction;
2620 x_copy_bill_sch(i).Bill_From_Date := l_LineSch_rec.date_start;
2621 x_copy_bill_sch(i).Bill_to_Date := l_LineSch_rec.date_end;
2622 x_copy_bill_sch(i).Interface_Date := l_LineSch_rec.date_to_interface;
2623 x_copy_bill_sch(i).Date_Completed := l_LineSch_rec.date_completed;
2624 x_copy_bill_sch(i).Amount := l_LineSch_rec.amount;
2625 x_copy_bill_sch(i).Rule_Id := l_LineSch_rec.rul_id;
2626
2627
2628 i := i + 1;
2629 END LOOP;
2630
2631
2632
2633 ELSE ---for contract
2634 i := 1;
2635 FOR l_ContractSch_rec IN l_ContractSch_Csr
2636 LOOP
2637
2638 x_copy_bill_sch(i).Chr_Id := l_ContractSch_rec.Chr_Id;
2639 x_copy_bill_sch(i).Strm_Lvl_Seq_Num := l_ContractSch_rec.sequence_no;
2640 x_copy_bill_sch(i).Lvl_Element_Seq_Num := l_ContractSch_rec.sequence_number;
2641 x_copy_bill_sch(i).Tx_Date := l_ContractSch_rec.date_transaction;
2642 x_copy_bill_sch(i).Bill_From_Date := l_ContractSch_rec.date_start;
2643 x_copy_bill_sch(i).Bill_to_Date := l_contractsch_rec.date_end;
2644 x_copy_bill_sch(i).Interface_Date := l_ContractSch_rec.date_to_interface;
2645 x_copy_bill_sch(i).Date_Completed := l_ContractSch_rec.date_completed;
2646 x_copy_bill_sch(i).Amount := l_ContractSch_rec.amount;
2647 x_copy_bill_sch(i).Rule_Id := l_ContractSch_rec.rul_id;
2648
2649
2650 i := i + 1;
2651 END LOOP;
2652
2653 END IF; ---chk for line/subline
2654
2655 l_currency_code := NULL;
2656 l_header_billing := NULL;
2657
2658 EXCEPTION
2659 WHEN OTHERS THEN
2660 x_return_status := G_RET_STS_UNEXP_ERROR;
2661 END Copy_Bill_Sch;
2662
2663
2664
2665
2666 PROCEDURE Check_Existing_Lvlelement
2667 (
2668 p_sll_id IN Number,
2669 p_sll_dt_start IN Date,
2670 p_uom IN VARCHAR2,
2671 p_uom_per_period IN NUMBER,
2672 p_cp_end_dt IN DATE,
2673 x_next_cycle_dt OUT NOCOPY DATE,
2674 x_last_cycle_dt out NOCOPY Date,
2675 x_period_counter out NOCOPY Number,
2676 x_sch_amt IN OUT NOCOPY NUMBER,
2677 x_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
2678 x_return_status out NOCOPY Varchar2
2679 )
2680
2681 IS
2682
2683
2684 CURSOR l_element_csr(p_sllid Number) IS
2685 SELECT id ,date_start,amount,date_end
2686 FROM oks_level_elements where rul_id = p_sllid
2687 ORDER BY to_number(sequence_number);
2688
2689
2690 ----- Bug 5047257 Start
2691 Cursor l_element_count(p_sll_id in number, last_start_date in Date) is
2692 select count(a.id) periods from oks_level_elements a, oks_k_lines_b line
2693 where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2694 and a.date_start <= last_start_date
2695 and Line.cle_id = a.cle_id
2696 and Line.billing_schedule_type in ('T','E');
2697 ----- Bug 5047257 End
2698
2699 Cursor l_element_count1(p_sll_id in number, last_start_date in Date) is
2700 select count(a.id) periods from oks_level_elements a, oks_k_lines_b line,
2701 oks_stream_levels_b sll1,
2702 oks_stream_levels_b sll2
2703 where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2704 and a.date_start <= last_start_date
2705 and a.rul_id = sll1.id
2706 and sll1.sequence_no = sll2.sequence_no
2707 and sll2.id = p_sll_id
2708 and Line.cle_id = a.cle_id
2709 and Line.billing_schedule_type in ('T','E');
2710
2711 Cursor l_element_count2(p_sll_id in number, last_start_date in Date) is
2712 select count(a.id) periods from oks_level_elements a, oks_k_lines_b line
2713 where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2714 and a.date_start <= last_start_date
2715 and Line.cle_id = a.cle_id
2716 and Line.billing_schedule_type in ('T','E');
2717 ----- Bug 5047257 End
2718
2719
2720 Cursor date_check_csr(p_sub_cle_id in number) is
2721 select count(id) from okc_k_lines_b lin
2722 where lin.id = p_sub_cle_id
2723 and lin.cle_id in (select top.id from okc_k_lines_b top
2724 where lin.start_date > top.start_date);
2725
2726 Cursor sll_csr(p_top_cle_id in number) is
2727 select count(id) from oks_stream_levels_b strm
2728 where strm.cle_id = p_top_cle_id;
2729
2730
2731 l_bill_end_date date;
2732 l_billed_count Number;
2733 l_element_rec l_element_csr%rowtype;
2734 l_tbs_ind NUMBER;
2735 l_next_cycle_dt DATE;
2736 l_element_end_dt DATE;
2737 l_date_start DATE;
2738 l_end_dt DATE;
2739 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
2740 l_index number;
2741 l_top_line_id number;
2742 l_sub_line_id number;
2743 l_line_ctr number;
2744 l_sll_ctr number;
2745
2746 BEGIN
2747
2748 --chk if any billed lvl elemnts exist if yes find the total amt and period counter to start with
2749
2750 l_billed_count := 0;
2751 x_return_status := 'S';
2752
2753 x_period_counter := 1;
2754 x_return_status := 'S';
2755 x_last_cycle_dt := NULL;
2756 x_next_cycle_dt := p_sll_dt_start;
2757 l_index := 0;
2758
2759 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2760
2761 fnd_log.STRING (fnd_log.level_statement,
2762 G_MODULE_CURRENT || '.Check_Existing_Lvlelement.dtls',
2763 'sll id = ' || p_sll_id
2764 ||', sll st dt = ' || p_sll_dt_start
2765 );
2766 END IF;
2767 -----errorout_ad('p_sll_dt_start = ' || p_sll_dt_start);
2768 FOR l_element_rec IN l_element_csr(p_sll_id) ---billed lvl element for sll
2769 LOOP
2770
2771 l_billed_count := l_billed_count + 1;
2772 x_last_cycle_dt := l_element_rec.date_start;
2773 x_sch_amt := nvl(x_sch_amt,0) + nvl(l_element_rec.amount,0);
2774 x_next_cycle_dt := l_element_rec.date_end + 1;
2775
2776
2777 IF x_top_line_bs.COUNT > 0 THEN --tbl will have rec for 'E' and 'T'
2778 l_index := l_index + 1;
2779
2780 l_cp_bs_tbl(l_index).id := l_element_rec.id;
2781 l_cp_bs_tbl(l_index).date_start := l_element_rec.date_start;
2782 l_cp_bs_tbl(l_index).date_end := l_element_rec.date_end;
2783 l_cp_bs_tbl(l_index).Amount := l_element_rec.amount;
2784 END IF;
2785
2786 END LOOP;
2787 x_period_counter := l_billed_count + 1; ---LINE WILL BE INSERTED FROM THIS COUNTER.
2788
2789 l_line_ctr := 0;
2790 l_sll_ctr := 0;
2791
2792 open date_check_csr(l_sub_line_id);
2793 fetch date_check_csr into l_line_ctr;
2794 close date_check_csr;
2795
2796 ---- The count cursor will be invoked only if sub line effectivity is different from Top line
2797 if l_line_ctr = 1 Then
2798
2799 open sll_csr(l_top_line_id);
2800 fetch sll_csr into l_sll_ctr;
2801 close sll_csr;
2802
2803 ------for 2 or more streams
2804 if l_sll_ctr > 1 Then
2805 for l_element_rec in l_element_count1(p_sll_id, x_last_cycle_dt ) loop
2806 IF (l_element_rec.periods=0) THEN
2807 exit;
2808 END IF;
2809 x_period_counter := l_element_rec.periods+1;
2810 exit;
2811 end loop;
2812 Else
2813 ------for single stream only call for the sub line
2814 If l_sub_line_id <> l_top_line_id then
2815 for l_element_rec in l_element_count2(p_sll_id, x_last_cycle_dt ) loop
2816 IF (l_element_rec.periods=0) THEN
2817 exit;
2818 END IF;
2819 x_period_counter := l_element_rec.periods+1;
2820 exit;
2821 end loop;
2822 end if;
2823 END if; --- sll count
2824
2825 End if; ----l_line_count = 1 Then
2826
2827 -----errorout_ad('l_cp_bs_tbl.COUNT = '|| l_cp_bs_tbl.COUNT);
2828
2829
2830 --if called from sub line routine then rollup the amount to top line BS tbl
2831 ---after matching period.
2832
2833 IF x_top_line_bs.COUNT > 0 AND l_cp_bs_tbl.COUNT > 0 THEN
2834 l_index := l_cp_bs_tbl.FIRST;
2835
2836
2837 l_tbs_ind := x_top_line_bs.FIRST;
2838 l_date_start := l_cp_bs_tbl(l_index ).DATE_START;
2839
2840
2841 -----errorout_ad('date start = ' || l_date_start);
2842
2843 WHILE TRUNC(l_date_start) > trunc(x_top_line_bs(l_tbs_ind).DATE_START)
2844 AND l_tbs_ind < x_top_line_bs.LAST
2845 LOOP
2846 -----errorout_ad('TOP LINE BS DATE CHK = ' || x_top_line_bs(l_tbs_ind).DATE_START);
2847 l_tbs_ind := x_top_line_bs.NEXT(l_tbs_ind);
2848 END LOOP;
2849
2850 -----errorout_ad('after while LOOP l_tbs_ind = ' || l_tbs_ind);
2851
2852
2853 ---chk l_next_cycle_dt if between previous and present record
2854 IF l_tbs_ind = x_top_line_bs.first THEN
2855 NULL;
2856
2857 ELSIF l_tbs_ind <= x_top_line_bs.LAST THEN
2858
2859 -----errorout_ad('COMING IN');
2860 l_tbs_ind := l_tbs_ind - 1;
2861
2862 IF x_top_line_bs(l_tbs_ind ).DATE_end IS NOT NULL THEN
2863 l_element_end_dt := x_top_line_bs(l_tbs_ind ).DATE_end;
2864
2865 ELSE
2866
2867 l_element_end_dt := OKC_TIME_UTIL_PUB.get_enddate
2868 (x_top_line_bs(l_tbs_ind ).DATE_START,
2869 p_uom,
2870 p_uom_Per_Period);
2871 END IF;
2872
2873
2874 IF TRUNC(l_date_start) >= TRUNC(x_top_line_bs(l_tbs_ind ).DATE_START)
2875 AND TRUNC(l_date_start) <= TRUNC(l_element_end_dt) THEN
2876
2877 NULL;
2878 ELSE
2879 l_tbs_ind := l_tbs_ind + 1;
2880 END IF;
2881
2882 elsif TRUNC(l_date_start) = TRUNC(x_top_line_bs(l_tbs_ind ).DATE_START) THEN
2883 l_tbs_ind := x_top_line_bs.first;
2884 END IF;
2885
2886
2887 -----errorout_ad('AFTER LOOP = ' || l_tbs_ind);
2888
2889 for l_index IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
2890 LOOP
2891
2892 IF l_tbs_ind <= x_top_line_bs.LAST THEN
2893
2894 IF l_tbs_ind = x_top_line_bs.LAST THEN
2895 l_bill_end_date := p_cp_end_dt;
2896 ELSE
2897
2898 IF x_top_line_bs(l_tbs_ind ).date_end IS NOT NULL THEN
2899 l_bill_end_date := x_top_line_bs(l_tbs_ind ).date_end;
2900 ELSE
2901 l_bill_end_date := x_top_line_bs(l_tbs_ind + 1).date_start - 1;
2902 END IF;
2903 END IF;
2904
2905 IF x_top_line_bs(l_tbs_ind).date_start <= l_cp_bs_tbl(l_index).date_start
2906 AND (l_bill_end_date) >= l_cp_bs_tbl(l_index).date_start THEN
2907
2908 x_top_line_bs(l_tbs_ind).amount := nvl(x_top_line_bs(l_tbs_ind).amount,0) +
2909 nvl(l_cp_bs_tbl(l_index).amount,0);
2910
2911 l_tbs_ind := l_tbs_ind + 1;
2912
2913 -----errorout_ad('amount = ' || x_top_line_bs(l_tbs_ind - 1).amount);
2914 -----errorout_ad('l_tbs_ind = ' || l_tbs_ind);
2915 -----errorout_ad('l_index = ' || l_index);
2916 ELSE
2917
2918 NULL;
2919 END IF;
2920 END IF; ---End of l_tbs_ind <= x_top_line_bs.LAST condition added for bug#2655416
2921
2922 END LOOP;
2923 END IF; ----end of both tbl count chk.
2924
2925 IF l_cp_bs_tbl.COUNT > 0 THEN
2926 x_next_cycle_dt := l_cp_bs_tbl(l_cp_bs_tbl.LAST ).date_end + 1;
2927 -----errorout_ad('NEXT DATE = ' || x_next_cycle_dt);
2928 END IF;
2929
2930 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2931
2932 fnd_log.STRING (fnd_log.level_statement,
2933 G_MODULE_CURRENT || '.Check_Existing_Lvlelement.out',
2934 'x_next_cycle_dt = ' || x_next_cycle_dt);
2935 END IF;
2936
2937 Exception
2938
2939 WHEN OTHERS then
2940 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2941 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Check_Existing_Lvlelement.UNEXPECTED',
2942 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2943 END IF;
2944 x_return_status := 'E';
2945
2946 END Check_Existing_Lvlelement;
2947
2948
2949
2950 FUNCTION Cal_Hdr_Amount
2951 (
2952 p_contract_id IN Number
2953 ) Return NUMBER
2954 Is
2955
2956 CURSOR l_total_amt_csr IS
2957 select SUM(nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
2958 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) tot_amt
2959 from oks_k_lines_b dtl, okc_k_lines_b line
2960 where line.id = dtl.cle_id
2961 AND line.dnz_chr_id = p_contract_id
2962 AND lse_id IN(1,12,14,19,46);
2963
2964
2965 l_total_amt_rec l_total_amt_csr%ROWTYPE;
2966
2967 BEGIN
2968
2969 --it will give the amount for hdr
2970
2971 OPEN l_total_amt_csr;
2972 FETCH l_total_amt_csr INTO l_total_amt_rec;
2973 IF l_total_amt_csr%NOTFOUND THEN
2974 CLOSE l_total_amt_csr;
2975 RETURN NULL;
2976 ELSE
2977 CLOSE l_total_amt_csr;
2978 RETURN l_total_amt_rec.tot_amt;
2979 end if;
2980
2981
2982 EXCEPTION
2983 WHEN OTHERS then
2984 RETURN NULL;
2985
2986 END Cal_Hdr_Amount;
2987
2988
2989 FUNCTION Find_Adjusted_Amount
2990 (
2991 p_line_id IN Number,
2992 p_total_amt IN Number,
2993 p_cycle_amt IN Number
2994 ) RETURN Number
2995
2996 IS
2997
2998 CURSOR l_tot_amt_csr IS
2999 SELECT nvl(SUM(amount),0) tot_amt
3000 FROM oks_level_elements
3001 WHERE cle_id = p_line_id;
3002
3003 l_adjusted_amount number;
3004 l_round_level_amt number;
3005 l_round_cycle_amt number;
3006 l_lvlelement_amt number;
3007 BEGIN
3008
3009 l_lvlelement_amt := 0;
3010
3011 Open l_tot_amt_csr;
3012 Fetch l_tot_amt_csr Into l_lvlelement_amt;
3013
3014 If l_tot_amt_csr%Notfound then
3015 l_lvlelement_amt := 0;
3016 End If;
3017
3018 Close l_tot_amt_csr;
3019
3020
3021
3022 l_round_level_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_lvlelement_amt, l_currency_code );
3023 l_round_cycle_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(p_cycle_amt, l_currency_code );
3024
3025 IF p_total_amt <> l_round_level_amt + l_round_cycle_amt THEN
3026 l_adjusted_amount := p_total_amt - l_round_level_amt;
3027 ELSE
3028 l_adjusted_amount := l_round_cycle_amt;
3029 END IF;
3030
3031 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3032
3033 fnd_log.STRING (fnd_log.level_statement,
3034 G_MODULE_CURRENT || '.Find_Adjusted_Amount.info',
3035 'l_adjusted_amount = ' || l_adjusted_amount
3036 ||', line id = ' || p_line_id
3037 );
3038 END IF;
3039
3040 RETURN l_adjusted_amount;
3041
3042 END Find_Adjusted_Amount;
3043
3044
3045 -------------------------------------------------------------------------
3046 -- Begin partial period computation logic
3047 -- Developer Mani Choudhary
3048 -- Date 09-MAY-2005
3049 -- Added two new parameters p_period_start and p_period_type
3050 -------------------------------------------------------------------------
3051 PROCEDURE Create_Level_elements(p_billing_type IN VARCHAR2,
3052 p_sll_tbl IN StrmLvl_Out_tbl,
3053 p_line_rec IN Line_Det_Type,
3054 p_invoice_ruleid IN Number,
3055 p_term_dt IN date,
3056 p_period_start IN VARCHAR2,
3057 p_period_type IN VARCHAR2,
3058 x_return_status OUT NOCOPY Varchar2
3059 )
3060 IS
3061
3062 l_line_sll_counter Number;
3063 l_period_counter Number;
3064 l_next_cycle_dt Date;
3065 l_bill_type Varchar2(10);
3066 l_line_end_date date;
3067 l_line_amt NUMBER;
3068 l_chk_round_adjustment NUMBER;
3069 l_adjusted_amount NUMBER;
3070 l_lvl_loop_counter NUMBER;
3071 l_last_cycle_dt Date;
3072 l_bill_sch_amt NUMBER := 0;
3073 l_tbl_seq NUMBER;
3074 l_term_amt NUMBER;
3075 l_uom_quantity NUMBER;
3076 l_tce_code VARCHAR2(100);
3077 l_constant_sll_amt NUMBER;
3078 l_remaining_amt NUMBER;
3079 l_dummy_top_line_bs oks_bill_level_elements_pvt.letv_tbl_type;
3080 l_billed_at_source OKC_K_HEADERS_ALL_B.BILLED_AT_SOURCE%TYPE;
3081 ------------------------------------------------------------------------
3082 -- Begin partial period computation logic
3083 -- Developer Mani Choudhary
3084 -- Date 17-MAY-2005
3085 -- local variables
3086 -------------------------------------------------------------------------
3087 l_full_period_end_date DATE;
3088 l_quantity NUMBER;
3089 l_total_quantity NUMBER;
3090
3091 l_last_cmp_date DATE;
3092 --------------------------------------------------------------------------
3093 --
3094 l_api_version CONSTANT NUMBER := 1.0;
3095 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
3096 l_return_status VARCHAR2(10);
3097 l_msg_count NUMBER;
3098 l_msg_data VARCHAR2(2000);
3099 l_msg_index_out NUMBER;
3100 l_msg_index NUMBER;
3101
3102 -- Start - Added by PMALLARA - Bug #3992530
3103 Lvl_Element_cnt Number := 0;
3104 Strm_Start_Date Date;
3105 -- End - Added by PMALLARA - Bug #3992530
3106
3107 BEGIN
3108
3109 x_return_status := 'S';
3110
3111 IF p_sll_tbl.COUNT <= 0 THEN
3112 RETURN;
3113 END IF;
3114
3115 l_bill_type := p_billing_type;
3116 l_lvl_ele_tbl_in.delete;
3117 l_tbl_seq := 1;
3118 l_bill_sch_amt := 0;
3119
3120 l_line_sll_counter := p_sll_tbl.FIRST;
3121
3122 ----for T and E, top line amt in lvl_element is always null,amt will be rolled up from sub line lvl elements
3123 --in cp case or subscription line amount is at line lvl only.
3124
3125
3126
3127 IF l_bill_type IN ('T','E') AND p_line_rec.chr_id IS NOT NULL
3128 AND p_line_rec.lse_id IN (1, 12, 14, 19) THEN
3129
3130 l_line_amt := NULL;
3131
3132 ELSIF p_line_rec.chr_id IS NOT NULL AND p_line_rec.lse_id IN (1, 12, 14, 19) THEN
3133 l_line_amt := p_line_rec.line_amt;
3134
3135 ELSE ----for cp and subscription line (lse_id =46)
3136 l_line_amt := p_line_rec.line_amt;
3137 END IF; --chk for line type
3138
3139
3140 l_chk_round_adjustment := p_sll_tbl.LAST;
3141
3142 IF TRUNC(nvl((p_term_dt - 1), p_line_rec.line_end_dt)) > p_line_rec.line_end_dt THEN
3143 l_line_end_date := p_line_rec.line_end_dt;
3144 ELSE
3145 l_line_end_date := TRUNC(nvl((p_term_dt - 1), p_line_rec.line_end_dt));
3146 END IF;
3147
3148 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3149
3150 fnd_log.STRING (fnd_log.level_statement,
3151 G_MODULE_CURRENT || '.Create_Level_elements.info',
3152 'l_chk_round_adjustment = ' || l_chk_round_adjustment
3153 ||', l_line_end_date (up to lvl ele) = ' || l_line_end_date
3154 ||', l_bill_type = ' || l_bill_type
3155 ||', l_header_billing = ' || l_header_billing
3156 );
3157 END IF;
3158
3159 IF l_header_billing IS NULL THEN
3160 ---delete all unbilled elements for a line
3161
3162 Delete_lvl_element(p_cle_id => p_line_rec.id,
3163 x_return_status => x_return_status);
3164
3165 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3166 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.del_ele',
3167 'Delete_lvl_element(x_return_status = '||x_return_status
3168 ||', line id passed = '|| p_line_rec.id ||')');
3169 END IF;
3170
3171 -----errorout_ad('Delete_lvl_element status = ' || x_return_status);
3172
3173 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3174 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3175 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3176 RAISE OKC_API.G_EXCEPTION_ERROR;
3177 END IF;
3178 END IF;
3179
3180 ---if (line terminated - 1) < line_start_dt
3181 IF TRUNC(p_line_rec.line_start_dt) > TRUNC(l_line_end_date) or
3182 TRUNC( p_line_rec.line_start_dt) > trunc(nvl((p_term_dt - 1),p_line_rec.line_end_dt)) THEN
3183
3184 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3185
3186 fnd_log.STRING (fnd_log.level_statement,
3187 G_MODULE_CURRENT || '.Create_Level_elements.chk',
3188 'BS not created as line start dt > line en dt');
3189 END IF;
3190
3191 x_return_status := 'S';
3192 RETURN;
3193 END IF;
3194
3195 LOOP ---sll rule loop
3196 -----errorout_ad('sll start date : '||to_char(p_line_rec.line_start_dt));
3197
3198 IF l_header_billing IS NOT NULL THEN ----hdr lvl billing no old sll and lvl elements
3199 l_next_cycle_dt := TRUNC(p_sll_tbl(l_line_sll_counter).dt_start);
3200 l_lvl_loop_counter := 1;
3201 l_period_counter := 1;
3202
3203 ELSE
3204 ---to get the counter
3205
3206 Check_Existing_Lvlelement(
3207 p_sll_id =>p_sll_tbl(l_line_sll_counter).id,
3208 p_sll_dt_start =>TRUNC(p_sll_tbl(l_line_sll_counter).dt_start),
3209 p_uom => null,
3210 p_uom_per_period => null,
3211 p_cp_end_dt => null,
3212 x_next_cycle_dt => l_next_cycle_dt,
3213 x_last_cycle_dt => l_last_cycle_dt,
3214 x_period_counter => l_period_counter,
3215 x_sch_amt => l_bill_sch_amt,
3216 x_top_line_bs => l_dummy_top_line_bs,
3217 x_return_status => x_return_status);
3218
3219 -----errorout_ad('LEVEL ELEMENT COUNTER = ' || TO_CHAR(l_period_counter));
3220 -----errorout_ad('LEVEL ELEMENT START DATE = ' || to_char(l_next_cycle_dt));
3221
3222 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3223 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3224 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3225 RAISE OKC_API.G_EXCEPTION_ERROR;
3226 END IF;
3227 l_lvl_loop_counter := l_period_counter;
3228 END IF;
3229
3230 IF l_period_counter > to_number(p_sll_tbl(l_line_sll_counter).level_period) THEN
3231
3232 IF l_line_sll_counter + 1 <= p_sll_tbl.LAST THEN
3233 l_next_cycle_dt := TRUNC(p_sll_tbl(l_line_sll_counter + 1).dt_start);
3234 ELSE
3235
3236 l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
3237 (TRUNC(p_sll_tbl(l_line_sll_counter).dt_start),
3238 p_sll_tbl(l_line_sll_counter).uom,
3239 (p_sll_tbl(l_line_sll_counter).uom_Per_Period *
3240 p_sll_tbl(l_line_sll_counter).level_period ));
3241
3242 l_next_cycle_dt := l_next_cycle_dt + 1;
3243 END IF; --if sll counter <= last
3244
3245 ELSE --period counter <= lvl period
3246
3247 -----errorout_ad('last date = ' || TO_CHAR(l_last_cycle_dt));
3248 -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom);
3249 -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom_Per_Period);
3250 IF L_next_cycle_dt IS null THEN
3251
3252
3253 L_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
3254 (l_last_cycle_dt,
3255 p_sll_tbl(l_line_sll_counter).uom,
3256 p_sll_tbl(l_line_sll_counter).uom_Per_Period);
3257
3258 -----errorout_ad('next_cycle_date = ' || to_char(l_next_cycle_dt));
3259
3260 l_next_cycle_dt := l_next_cycle_dt + 1;
3261 END IF; --next cycle dt is null
3262
3263 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3264
3265 fnd_log.STRING (fnd_log.level_statement,
3266 G_MODULE_CURRENT || '.Create_Level_elements.loop_info',
3267 'L_next_cycle_dt = ' || L_next_cycle_dt
3268 ||', last date = ' || l_last_cycle_dt
3269 ||', uom = ' || p_sll_tbl(l_line_sll_counter).uom
3270 );
3271 END IF;
3272
3273 IF TRUNC(l_next_cycle_dt) > l_line_end_date THEN
3274 x_return_status := 'S';
3275 RETURN;
3276 END IF;
3277
3278 IF l_bill_type = 'T' AND p_line_rec.lse_id = 46 THEN
3279 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
3280 p_timeunit => p_sll_tbl(l_line_sll_counter).uom,
3281 x_return_status => x_return_status,
3282 x_quantity => l_uom_quantity ,
3283 x_timeunit => l_tce_code);
3284
3285 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3286 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.seed_time',
3287 'OKS_BILL_UTIL_PUB.get_seeded_timeunit(x_return_status = '||x_return_status
3288 ||', x_timeunit = ' || l_tce_code
3289 ||', x_quantity = '|| l_uom_quantity ||')');
3290 END IF;
3291
3292 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
3293 RAISE G_EXCEPTION_HALT_VALIDATION;
3294 END IF;
3295
3296 l_remaining_amt := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3297
3298 Get_Constant_sll_Amount(p_line_start_date => p_line_rec.line_start_dt,
3299 p_line_end_date => p_line_rec.line_end_dt,
3300 p_cycle_start_date => l_next_cycle_dt,
3301 p_remaining_amount => l_remaining_amt,
3302 P_uom_quantity => l_uom_quantity,
3303 P_tce_code => l_tce_code,
3304 x_constant_sll_amt => l_constant_sll_amt,
3305 x_return_status => x_return_status);
3306
3307 --errorout_ad('shd not enter Get_Constant_sll_Amount = ' || x_return_status);
3308
3309
3310 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3311 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.sll_amt',
3312 'Get_Constant_sll_Amount(x_return_status = '||x_return_status
3313 ||', sll amt = ' || l_constant_sll_amt
3314 ||', l_remaining_amt passed = '|| l_remaining_amt ||')');
3315 END IF;
3316
3317 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
3318 RAISE G_EXCEPTION_HALT_VALIDATION;
3319 END IF;
3320 END IF; ---end of lse_id = 46
3321
3322 OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
3323 (p_timeunit => p_sll_tbl(l_line_sll_counter).uom,
3324 x_return_status => x_return_status,
3325 x_quantity => l_uom_quantity ,
3326 x_timeunit => l_tce_code);
3327 IF x_return_status <> 'S' THEN
3328 RAISE G_EXCEPTION_HALT_VALIDATION;
3329 END IF;
3330
3331
3332 -- Start - Added by PMALLARA - Bug #3992530
3333 Lvl_Element_cnt := l_period_counter - 1;
3334 Strm_Start_Date := p_sll_tbl(l_line_sll_counter).dt_start;
3335 LOOP -------------for level elements of one rule
3336 Lvl_Element_cnt := Lvl_Element_cnt + 1;
3337 -- End - Added by PMALLARA - Bug #3992530
3338
3339 l_fnd_lvl_in_rec.line_start_date := p_line_rec.line_start_dt;
3340 l_fnd_lvl_in_rec.line_end_date := nvl((p_term_dt-1),p_line_rec.line_end_dt);
3341 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
3342 -- Start - Modified by PMALLARA - Bug #3992530
3343 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * p_sll_tbl(l_line_sll_counter).uom_Per_Period;
3344 -- End - Modified by PMALLARA - Bug #3992530
3345 l_fnd_lvl_in_rec.tuom := p_sll_tbl(l_line_sll_counter).uom;
3346 l_fnd_lvl_in_rec.total_amount := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3347 l_fnd_lvl_in_rec.invoice_offset_days := p_sll_tbl(l_line_sll_counter).invoice_offset_days;
3348 l_fnd_lvl_in_rec.interface_offset_days := p_sll_tbl(l_line_sll_counter).Interface_offset_days;
3349 l_fnd_lvl_in_rec.bill_type := l_bill_type;
3350 --mchoudha added this parameter
3351 l_fnd_lvl_in_rec.uom_per_period := p_sll_tbl(l_line_sll_counter).uom_Per_Period;
3352 -----errorout_ad(' p_Line_rec.line_start_dt :' || to_char(p_line_rec.line_start_dt));
3353 -----errorout_ad(' p_Line_rec.line_end_dt :' || to_char(p_line_rec.line_end_dt));
3354 -----errorout_ad(' l_line_amt :' || l_line_amt);
3355 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch for line passed period :' || to_char(l_fnd_lvl_in_rec.uom_per_period));
3356 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch for line passed uom :' || l_fnd_lvl_in_rec.uom);
3357 -----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));
3358
3359 -------------------------------------------------------------------------
3360 -- Begin partial period computation logic
3361 -- Developer Mani Choudhary
3362 -- Date 09-MAY-2005
3363 -- Added two new parameters p_period_start and p_period_type
3364 -- Start - Modified by PMALLARA - Bug #3992530
3365 IF fnd_log.level_procedure >= fnd_log.g_current_runtime_level THEN
3366 fnd_log.string(fnd_log.level_procedure,G_MODULE_CURRENT||'.Create_Level_elements.lvl_loop',
3367 'Calling oks_bill_util_pub.Get_next_bill_sch with parameters '
3368 ||'period start = ' || p_period_start
3369 ||', period type = ' || p_period_type);
3370 END IF;
3371
3372 OKS_BILL_UTIL_PUB.Get_next_bill_sch
3373 (p_api_version => l_api_version,
3374 x_return_status => x_return_status,
3375 x_msg_count => l_msg_count,
3376 x_msg_data => l_msg_data,
3377 p_invoicing_rule_id => p_invoice_ruleid,
3378 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
3379 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
3380 p_period_start => p_period_start,
3381 p_period_type => p_period_type,
3382 Strm_Start_Date => Strm_Start_Date);
3383 -- End - Modified by PMALLARA - Bug #3992530
3384
3385
3386 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3387 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.lvl_loop',
3388 'oks_bill_util_pub.Get_next_bill_sch(x_return_status = '||x_return_status
3389 ||', next date = ' || l_fnd_lvl_out_rec.next_cycle_date
3390 ||', tuom per period = ' || l_fnd_lvl_in_rec.tuom_per_period
3391 ||', cycle_start_date = '|| l_next_cycle_dt ||')');
3392 END IF;
3393
3394
3395 -----errorout_ad('LEVEL ELEMENT NEXT CYCLE DATE passed from Get_next_bill_sch = ' || TO_CHAR(l_fnd_lvl_out_rec.next_cycle_date));
3396
3397 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3398 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
3399 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3400 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3401 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
3402 RAISE OKC_API.G_EXCEPTION_ERROR;
3403 END IF;
3404
3405
3406 IF p_period_start is not null AND
3407 p_period_type is not null THEN
3408 l_last_cmp_date := l_line_end_date;
3409 ELSE
3410 l_last_cmp_date := p_line_rec.line_end_dt;
3411 END IF;
3412
3413 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt then
3414 null; ---donot insert record in level element
3415 ELSE
3416
3417 IF l_bill_type IN ('T','E') AND p_line_rec.lse_id <> 46 THEN
3418 l_adjusted_amount := NULL;
3419 --errorout_ad('l_bill_type IN T,E AND p_line_rec.lse_id <> 46 ');
3420 ELSIF l_bill_type = 'T' AND p_line_rec.lse_id = 46 THEN
3421 --errorout_ad('l_bill_type = T AND p_line_rec.lse_id = 46 ');
3422 IF (l_line_sll_counter = l_chk_round_adjustment AND
3423 l_lvl_loop_counter = p_sll_tbl(l_chk_round_adjustment).level_period) OR
3424 --Mani PPC changing p_line_rec.line_end_dt to l_last_cmp_date
3425 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
3426
3427 l_adjusted_amount := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3428
3429 ELSE --not adjustment round
3430 l_adjusted_amount := l_constant_sll_amt;
3431 END IF;
3432
3433 ELSIF (l_bill_type = 'E' AND p_line_rec.lse_id = 46)
3434 OR l_bill_type = 'P' THEN
3435 --errorout_ad('(l_bill_type = E AND p_line_rec.lse_id = 46 OR l_bill_type = P');
3436 IF (l_line_sll_counter = l_chk_round_adjustment AND
3437 l_lvl_loop_counter = p_sll_tbl(l_chk_round_adjustment).level_period) OR
3438 --Mani PPC changing p_line_rec.line_end_dt to l_last_cmp_date
3439 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
3440
3441 l_adjusted_amount := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3442
3443 ELSE --not adjustment round
3444 ------------------------------------------------------------------------
3445 -- Begin partial period computation logic
3446 -- Developer Mani Choudhary
3447 -- Date 17-MAY-2005
3448 -- For Covered level and subscription calculate the billing schedule amount
3449 -- for the first partial period.
3450 -------------------------------------------------------------------------
3451
3452 IF p_period_start = 'CALENDAR' AND
3453 p_period_start IS NOT NULL AND
3454 p_period_type IS NOT NULL AND
3455 TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
3456 THEN
3457 --New parameters in Bold
3458 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
3459 l_quantity := OKS_TIME_MEASURES_PUB.get_quantity
3460 (p_start_date => l_next_cycle_dt,
3461 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
3462 p_source_uom => l_fnd_lvl_in_rec.tuom ,
3463 p_period_type => p_period_type,
3464 p_period_start => p_period_start);
3465
3466 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3467 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_Level_elements.Calendar',
3468 'after calling OKS_TIME_MEASURES_PUB.get_quantity with p_period_type '||p_period_type||' ,p_period_start '||p_period_start
3469 ||' result l_quantity = ' || l_quantity);
3470 END IF;
3471
3472 IF nvl(l_quantity,0) = 0 THEN
3473 RAISE G_EXCEPTION_HALT_VALIDATION;
3474 END IF;
3475
3476
3477 l_adjusted_amount :=p_sll_tbl(l_line_sll_counter).amount*l_quantity/l_fnd_lvl_in_rec.uom_per_period; --bugfix 5485442
3478
3479 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3480 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_Level_elements.Calendar',
3481 'after calling OKS_TIME_MEASURES_PUB.get_quantity '
3482 ||' result l_adjusted_amount = ' || l_adjusted_amount);
3483 END IF;
3484 --mchoudha fix for bug#5200003
3485 ELSE
3486 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
3487
3488 END IF;
3489 ELSE
3490 l_adjusted_amount := p_sll_tbl(l_line_sll_counter).amount;
3491 END IF; --period start and period type not null
3492 END IF; --l_line_sll_counter = l_chk_round_adjustment
3493 END IF; --IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt
3494
3495 --insert in lvl element tbl
3496
3497
3498 l_lvl_ele_tbl_in(l_tbl_seq).sequence_number := to_char(l_period_counter);
3499 l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id := p_line_rec.dnz_chr_id;
3500 l_lvl_ele_tbl_in(l_tbl_seq).cle_id := p_line_rec.id;
3501
3502 IF p_line_rec.lse_id IN (1,12,14,19,46) THEN
3503 l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id := p_line_rec.id;
3504 ELSE ---subline
3505 l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id := p_line_rec.cle_id;
3506 END IF;
3507
3508
3509 IF l_next_cycle_dt < p_Line_rec.line_start_dt THEN
3510 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(p_Line_rec.line_start_dt);
3511 ELSE
3512 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(l_next_cycle_dt);
3513 END IF;
3514 l_lvl_ele_tbl_in(l_tbl_seq).date_end := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
3515
3516
3517 IF l_bill_type IN ('T','E') AND p_Line_rec.lse_id <> 46 THEN
3518 ----FOR T,E AND TOP LINE amt should be null to shoW rollup amt
3519
3520 IF p_Line_rec.chr_id IS NOT NULL THEN --top line
3521 l_lvl_ele_tbl_in(l_tbl_seq).amount := NULL;
3522 ELSE ----cp level
3523 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_adjusted_amount,l_currency_code );
3524 END IF;
3525
3526 ELSE ----for billing type = p and lse_id = 46
3527
3528 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_adjusted_amount,l_currency_code );
3529 END IF;
3530
3531
3532 l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl := l_fnd_lvl_out_rec.date_recievable_gl;
3533 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := TRUNC(l_fnd_lvl_out_rec.date_transaction);
3534 l_lvl_ele_tbl_in(l_tbl_seq).date_due := l_fnd_lvl_out_rec.date_due;
3535 l_lvl_ele_tbl_in(l_tbl_seq).date_print := l_fnd_lvl_out_rec.date_print;
3536 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
3537
3538 SELECT nvl(BILLED_AT_SOURCE , 'N')
3539 INTO l_billed_at_source
3540 FROM OKC_K_HEADERS_ALL_B
3541 WHERE id = p_line_rec.dnz_chr_id;
3542
3543 if l_billed_at_source = 'Y' Then
3544 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := sysdate;
3545 else
3546 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
3547 end if;
3548
3549 l_lvl_ele_tbl_in(l_tbl_seq).rul_id := p_sll_tbl(l_line_sll_counter).id;
3550
3551 l_lvl_ele_tbl_in(l_tbl_seq).object_version_number := OKC_API.G_MISS_NUM;
3552 l_lvl_ele_tbl_in(l_tbl_seq).created_by := OKC_API.G_MISS_NUM;
3553 l_lvl_ele_tbl_in(l_tbl_seq).creation_date := SYSDATE;
3554 l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by := OKC_API.G_MISS_NUM;
3555 l_lvl_ele_tbl_in(l_tbl_seq).last_update_date := SYSDATE;
3556
3557
3558 -----errorout_ad ('Amount for line lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
3559 IF p_period_start is null OR
3560 p_period_type is null THEN
3561
3562 IF p_term_dt IS NOT NULL AND TRUNC(l_lvl_ele_tbl_in(l_tbl_seq).date_start) < TRUNC(p_term_dt) AND
3563 TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > TRUNC(p_term_dt) AND
3564 p_term_dt <= p_Line_rec.line_end_dt THEN
3565
3566 l_lvl_ele_tbl_in(l_tbl_seq).date_end := (p_term_dt - 1);
3567
3568 IF l_bill_type = 'P' OR p_Line_rec.lse_id = 46 THEN
3569
3570 -----errorout_ad('going to calculate l_term_amt');
3571 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) > p_Line_rec.line_end_dt THEN
3572
3573 l_term_amt := Find_term_amt(p_cycle_st_dt => l_lvl_ele_tbl_in(l_tbl_seq).date_start,
3574 p_term_dt => p_term_dt,
3575 p_cycle_end_dt => p_Line_rec.line_end_dt,
3576 p_amount => nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
3577
3578
3579 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3580 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.term_period',
3581 'find_term_amt(x_return_status = '||x_return_status
3582 ||', l_term_amt = ' || l_term_amt
3583 ||', p_cycle_st_dt = ' || l_lvl_ele_tbl_in(l_tbl_seq).date_start
3584 ||', p_term_dt = ' || p_Line_rec.line_end_dt
3585 ||', lvl amt = ' || nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0)
3586 ||', p_cycle_end_dt = '|| l_next_cycle_dt ||')');
3587 END IF;
3588
3589 ELSE
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 => l_fnd_lvl_out_rec.next_cycle_date - 1,
3593 p_amount => nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
3594
3595 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3596 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.term_period',
3597 'find_term_amt(x_return_status = '||x_return_status
3598 ||', l_term_amt = ' || l_term_amt
3599 ||', p_cycle_st_dt = ' || l_lvl_ele_tbl_in(l_tbl_seq).date_start
3600 ||', p_term_dt = ' || p_Line_rec.line_end_dt
3601 ||', lvl amt = ' || nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0)
3602 ||', p_cycle_end_dt = '|| l_fnd_lvl_out_rec.next_cycle_date - 1 ||')');
3603 END IF; -- fnd_log.level_event >= fnd_log.g_current_runtime_level
3604 END IF; -- TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) > p_Line_rec.line_end_dt
3605
3606
3607 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_term_amt;
3608 END IF; -----end of cal of term amt.
3609 END IF; ----end of lvlelement end date assign
3610 END IF; --period start null or period type null
3611
3612 l_period_counter := l_period_counter + 1;
3613 l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
3614 l_tbl_seq := l_tbl_seq + 1;
3615 END IF; -----end if for level element creation
3616
3617 l_next_cycle_dt := l_fnd_lvl_out_rec.next_cycle_date;
3618
3619 EXIT WHEN (l_lvl_loop_counter = to_number(p_sll_tbl(l_line_sll_counter).level_period)) OR
3620 (TRUNC(l_next_cycle_dt) > l_line_end_date);
3621
3622 l_lvl_loop_counter := l_lvl_loop_counter + 1;
3623
3624 END LOOP; ---loop for sll period counter
3625
3626 END IF; ----Period counter checking before entering in loop for lvlelement
3627
3628 -----errorout_ad('l_next_cycle_dt = ' || TO_CHAR(l_next_cycle_dt));
3629 -----errorout_ad('LINE END DATE = ' || TO_CHAR(p_Line_rec.line_end_dt));
3630
3631
3632 EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
3633 (TRUNC(l_next_cycle_dt) > l_line_end_date);
3634
3635 l_line_sll_counter := p_sll_tbl.NEXT(l_line_sll_counter);
3636
3637 END LOOP; -----loop for sll lines
3638
3639 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
3640 IF l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end > p_line_rec.line_end_dt THEN
3641 l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end := p_line_rec.line_end_dt;
3642 END IF;
3643
3644 OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
3645 p_api_version => l_api_version,
3646 p_init_msg_list => l_init_msg_list,
3647 x_return_status => x_return_status,
3648 x_msg_count => l_msg_count,
3649 x_msg_data => l_msg_data,
3650 p_letv_tbl => l_lvl_ele_tbl_in,
3651 x_letv_tbl => l_lvl_ele_tbl_out);
3652
3653 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3654 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.insert',
3655 'oks_bill_level_elements_pvt.insert_row(x_return_status = '||x_return_status
3656 ||', l_lvl_ele_tbl_out = '|| l_lvl_ele_tbl_out.count ||')');
3657 END IF;
3658
3659 -----errorout_ad('LEVEL ELEMENT INSERT STATUS line = ' || x_return_status);
3660
3661
3662 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3663 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for line = ' || l_msg_data);
3664 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3665 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3666 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for line = ' || l_msg_data);
3667 RAISE OKC_API.G_EXCEPTION_ERROR;
3668 END IF;
3669 END IF;
3670
3671
3672 EXCEPTION
3673 WHEN G_EXCEPTION_HALT_VALIDATION THEN
3674 x_return_status := G_RET_STS_ERROR;
3675 WHEN OTHERS THEN
3676
3677 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
3678 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Create_Level_elements.UNEXPECTED',
3679 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
3680 END IF;
3681 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
3682 p_msg_name => G_UNEXPECTED_ERROR,
3683 p_token1 => G_SQLCODE_TOKEN,
3684 p_token1_value => sqlcode,
3685 p_token2 => G_SQLERRM_TOKEN,
3686 p_token2_value => sqlerrm);
3687
3688 x_return_status := G_RET_STS_UNEXP_ERROR;
3689 END Create_Level_elements;
3690
3691
3692 -------------------------------------------------------------------------
3693 -- Begin partial period computation logic
3694 -- Developer Mani Choudhary
3695 -- Date 09-MAY-2005
3696 -- Added two new parameters p_period_start and p_period_type
3697 -------------------------------------------------------------------------
3698 PROCEDURE Create_Hdr_Level_elements(
3699 p_billing_type IN VARCHAR2,
3700 p_sll_tbl IN StrmLvl_Out_tbl,
3701 p_hdr_rec IN Contract_Rec_Type,
3702 p_invoice_ruleid IN Number,
3703 p_called_from IN NUMBER,
3704 p_period_start IN VARCHAR2,
3705 p_period_type IN VARCHAR2,
3706 x_return_status OUT NOCOPY Varchar2
3707 )
3708 IS
3709
3710 l_sll_counter Number;
3711 l_tbl_seq Number;
3712 l_next_cycle_dt Date;
3713 l_lvl_loop_counter NUMBER;
3714 l_cycle_amt number;
3715 l_bill_type VARCHAR2(10);
3716
3717 --
3718 l_api_version CONSTANT NUMBER := 1.0;
3719 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
3720 l_return_status VARCHAR2(10);
3721 l_msg_count NUMBER;
3722 l_msg_data VARCHAR2(2000);
3723 l_msg_index_out NUMBER;
3724 l_msg_index NUMBER;
3725 i number;
3726
3727 -- Start - Added by PMALLARA - Bug #3992530
3728 Lvl_Element_cnt Number := 0;
3729 Strm_Start_Date Date;
3730 -- End - Added by PMALLARA - Bug #3992530
3731
3732 BEGIN
3733
3734 --l_hdr_end_date := p_hdr_rec.end_dt;
3735 x_return_status := 'S';
3736
3737 l_lvl_ele_tbl_in.delete;
3738 l_tbl_seq := 1;
3739 l_sll_counter := p_sll_tbl.FIRST;
3740 l_bill_type := p_billing_type;
3741
3742
3743 IF p_called_from = 1 THEN
3744 --delete lvl lements for hdr and all (sll and lvl elemnts) of top lines and cp.
3745
3746 Del_hdr_lvl_element(p_hdr_id => p_hdr_rec.id,
3747 x_return_status => x_return_status);
3748
3749
3750 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3751 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Hdr_Level_elements.del_ele',
3752 'Del_hdr_lvl_element(x_return_status = '||x_return_status
3753 ||', p_hdr_id passed = '||p_hdr_rec.id ||')');
3754 END IF;
3755
3756 -----errorout_ad('Del_hdr_lvl_element status = ' || x_return_status);
3757 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3758 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3759 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3760 RAISE OKC_API.G_EXCEPTION_ERROR;
3761 END IF;
3762 END IF;
3763
3764
3765 LOOP ---sll rule loop
3766 -----errorout_ad('sll rule start date : '||to_char(p_line_rec.line_start_dt));
3767
3768 l_next_cycle_dt := p_sll_tbl(l_sll_counter).dt_start;
3769 l_lvl_loop_counter := 1;
3770
3771
3772 -- Start - Added by PMALLARA - Bug #3992530
3773 Lvl_Element_cnt := 0;
3774 LOOP -------------for level elements of one rule
3775 Lvl_Element_cnt := Lvl_Element_cnt + 1;
3776 if Lvl_Element_cnt = 1 then
3777 Strm_Start_Date := l_next_cycle_dt;
3778 end if;
3779 -- End - Added by PMALLARA - Bug #3992530
3780
3781 l_fnd_lvl_in_rec.line_start_date := p_hdr_rec.start_dt;
3782 l_fnd_lvl_in_rec.line_end_date := p_hdr_rec.end_dt;
3783 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
3784 -- Start - Modified by PMALLARA - Bug #3992530
3785 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * p_sll_tbl(l_sll_counter).uom_Per_Period;
3786 -- End - Modified by PMALLARA - Bug #3992530
3787 l_fnd_lvl_in_rec.tuom := p_sll_tbl(l_sll_counter).uom;
3788 l_fnd_lvl_in_rec.total_amount := 0;
3789 l_fnd_lvl_in_rec.invoice_offset_days := p_sll_tbl(l_sll_counter).invoice_offset_days;
3790 l_fnd_lvl_in_rec.interface_offset_days := p_sll_tbl(l_sll_counter).Interface_offset_days;
3791 l_fnd_lvl_in_rec.bill_type := l_bill_type;
3792 --mchoudha added this parameter
3793 l_fnd_lvl_in_rec.uom_per_period := p_sll_tbl(l_sll_counter).uom_Per_Period;
3794
3795 -------------------------------------------------------------------------
3796 -- Begin partial period computation logic
3797 -- Developer Mani Choudhary
3798 -- Date 09-MAY-2005
3799 -- Added two new parameters p_period_start and p_period_type
3800 -- Start - Modified by PMALLARA - Bug #3992530
3801 OKS_BILL_UTIL_PUB.Get_next_bill_sch
3802 (p_api_version => l_api_version,
3803 x_return_status => x_return_status,
3804 x_msg_count => l_msg_count,
3805 x_msg_data => l_msg_data,
3806 p_invoicing_rule_id => p_invoice_ruleid,
3807 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
3808 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
3809 p_period_start => p_period_start,
3810 p_period_type => p_period_type,
3811 Strm_Start_Date => Strm_Start_Date);
3812 -- End - Modified by PMALLARA - Bug #3992530
3813
3814 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3815 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_hdr_level_elements.lvl_loop',
3816 'oks_bill_util_pub.Get_next_bill_sch(x_return_status = '||x_return_status
3817 ||', next date = ' || l_fnd_lvl_out_rec.next_cycle_date
3818 ||', tuom per period = ' || l_fnd_lvl_in_rec.tuom_per_period
3819 ||', cycle_start_date = '|| l_next_cycle_dt ||')');
3820 END IF;
3821
3822 -----errorout_ad('hdr Get_next_bill_sch status = ' || x_return_status);
3823
3824 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3825 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_fnd_msg_data);
3826 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3827 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3828 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_fnd_msg_data);
3829 RAISE OKC_API.G_EXCEPTION_ERROR;
3830 END IF;
3831
3832
3833
3834 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_hdr_rec.start_dt then
3835 NULL; ---donot insert record in level element
3836 ELSE
3837
3838 -----errorout_ad('l_lvl_loop_counter = ' || l_lvl_loop_counter);
3839 -----errorout_ad('l_tbl_seq = ' || l_tbl_seq);
3840
3841 l_lvl_ele_tbl_in(l_tbl_seq).sequence_number := to_char(l_lvl_loop_counter);
3842 l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id := p_hdr_rec.id;
3843 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(l_next_cycle_dt);
3844 l_lvl_ele_tbl_in(l_tbl_seq).date_end := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
3845
3846 IF l_bill_type = 'T' then
3847 ----FOR T amt should be null
3848 l_lvl_ele_tbl_in(l_tbl_seq).amount := NULL;
3849
3850 ELSE ----for E
3851
3852 l_cycle_amt := TO_NUMBER(p_sll_tbl(l_sll_counter).amount);
3853 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_cycle_amt,l_currency_code );
3854 END IF;
3855
3856
3857 l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl := l_fnd_lvl_out_rec.date_recievable_gl;
3858 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := TRUNC(l_fnd_lvl_out_rec.date_transaction);
3859 l_lvl_ele_tbl_in(l_tbl_seq).date_due := l_fnd_lvl_out_rec.date_due;
3860 l_lvl_ele_tbl_in(l_tbl_seq).date_print := l_fnd_lvl_out_rec.date_print;
3861 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
3862 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
3863 l_lvl_ele_tbl_in(l_tbl_seq).rul_id := p_sll_tbl(l_sll_counter).id;
3864
3865 l_lvl_ele_tbl_in(l_tbl_seq).object_version_number := OKC_API.G_MISS_NUM;
3866 l_lvl_ele_tbl_in(l_tbl_seq).created_by := OKC_API.G_MISS_NUM;
3867 l_lvl_ele_tbl_in(l_tbl_seq).creation_date := SYSDATE;
3868 l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by := OKC_API.G_MISS_NUM;
3869 l_lvl_ele_tbl_in(l_tbl_seq).last_update_date := SYSDATE;
3870
3871 l_tbl_seq := l_tbl_seq + 1;
3872
3873 END IF; -----end if for level element creation
3874
3875 l_next_cycle_dt := l_fnd_lvl_out_rec.next_cycle_date;
3876
3877 EXIT WHEN (l_lvl_loop_counter = to_number(p_sll_tbl(l_sll_counter).level_period)) OR
3878 (TRUNC(l_next_cycle_dt) > p_hdr_rec.end_dt);
3879
3880 l_lvl_loop_counter := l_lvl_loop_counter + 1;
3881
3882 END LOOP; ---loop for sll period counter
3883
3884
3885 EXIT WHEN (l_sll_counter = p_sll_tbl.LAST) OR
3886 (TRUNC(l_next_cycle_dt) > p_hdr_rec.end_dt);
3887
3888 l_sll_counter := p_sll_tbl.NEXT(l_sll_counter);
3889
3890 END LOOP; -----loop for sll lines
3891
3892 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
3893
3894 OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
3895 p_api_version => l_api_version,
3896 p_init_msg_list => l_init_msg_list,
3897 x_return_status => x_return_status,
3898 x_msg_count => l_msg_count,
3899 x_msg_data => l_msg_data,
3900 p_letv_tbl => l_lvl_ele_tbl_in,
3901 x_letv_tbl => l_lvl_ele_tbl_out);
3902
3903 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3904 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_hdr_level_elements.insert',
3905 'oks_bill_level_elements_pvt.insert_row(x_return_status = '||x_return_status
3906 ||', l_lvl_ele_tbl_out = '|| l_lvl_ele_tbl_out.count ||')');
3907 END IF;
3908
3909
3910 -----errorout_ad('LEVEL ELEMENT INSERT STATUS = ' || x_return_status);
3911
3912
3913 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3914 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row = ' || l__msg_data);
3915 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3916 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3917 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row = ' || l_msg_data);
3918 RAISE OKC_API.G_EXCEPTION_ERROR;
3919 END IF;
3920 END IF;
3921
3922
3923
3924 EXCEPTION
3925 WHEN OTHERS THEN
3926 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
3927 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_hdr_level_elements.UNEXPECTED',
3928 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
3929 END IF;
3930 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
3931 p_msg_name => G_UNEXPECTED_ERROR,
3932 p_token1 => G_SQLCODE_TOKEN,
3933 p_token1_value => sqlcode,
3934 p_token2 => G_SQLERRM_TOKEN,
3935 p_token2_value => sqlerrm);
3936
3937 x_return_status := G_RET_STS_UNEXP_ERROR;
3938 END Create_Hdr_Level_elements;
3939
3940 FUNCTION Find_Currency_Code
3941 ( p_cle_id NUMBER,
3942 p_chr_id NUMBER
3943 )
3944 RETURN VARCHAR2
3945 IS
3946
3947 CURSOR l_line_cur IS
3948 SELECT contract.currency_code
3949 FROM okc_k_headers_b contract, okc_k_lines_b line
3950 WHERE contract.id = line.dnz_chr_id and line.id = p_cle_id;
3951
3952 CURSOR l_hdr_cur IS
3953 SELECT contract.currency_code
3954 FROM okc_k_headers_b contract
3955 WHERE contract.id = p_chr_id;
3956
3957
3958 l_Currency VARCHAR2(15);
3959
3960 BEGIN
3961
3962 IF p_chr_id IS NULL THEN ---called for line
3963 OPEN l_line_cur;
3964 FETCH l_line_cur INTO l_currency;
3965
3966 IF l_line_cur%NOTFOUND THEN
3967 l_Currency := NULL;
3968 END IF;
3969
3970 Close l_line_cur;
3971
3972 ELSE ---FOR HEADER
3973
3974 OPEN l_hdr_cur;
3975 FETCH l_hdr_cur INTO l_currency;
3976
3977 IF l_hdr_cur%NOTFOUND THEN
3978 l_Currency := NULL;
3979 END IF;
3980
3981 Close l_hdr_cur;
3982
3983 END IF;
3984
3985 RETURN l_Currency;
3986
3987 EXCEPTION
3988 WHEN NO_DATA_FOUND THEN
3989 RETURN NULL;
3990 WHEN OTHERS THEN
3991 RETURN NULL;
3992
3993 END Find_Currency_Code;
3994
3995
3996 Procedure Update_Sll_Amount
3997 (
3998 p_line_id IN NUMBER,
3999 x_return_status OUT NOCOPY Varchar2
4000 )
4001 IS
4002
4003 Cursor l_Line_Csr Is
4004 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.lse_id lse_id,
4005 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
4006 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
4007 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
4008 FROM okc_k_lines_b line, oks_k_lines_b dtl
4009 WHERE line.id = dtl.cle_id AND line.Id = p_line_id ;
4010
4011 CURSOR l_Line_Sll_Csr IS
4012 SELECT sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
4013 sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
4014 sll.interface_offset_days, sll.cle_id, sll.chr_id,
4015 sll.dnz_chr_id, sll.end_date,sll.object_version_number
4016 FROM oks_stream_levels_b sll
4017 WHERE sll.cle_id = p_line_id
4018 ORDER BY sll.sequence_no;
4019
4020 l_Line_Csr_Rec l_Line_Csr%Rowtype;
4021 l_Line_Sll_Csr_Rec l_Line_Sll_Csr%Rowtype;
4022 l_Line_Amount NUMBER;
4023 l_Sll_Counter NUMBER;
4024 l_remaining_amt NUMBER;
4025 l_used_amt NUMBER;
4026 l_total_period NUMBER;
4027 l_prorate_counter NUMBER;
4028 l_amt_counter NUMBER;
4029 l_sll_index NUMBER;
4030 l_sll_amt NUMBER;
4031 l_period_sll_amount NUMBER(20,2);
4032
4033 l_return_status VARCHAR2(10);
4034 l_msg_count NUMBER;
4035 l_msg_data VARCHAR2(2000);
4036 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
4037
4038 l_sll_prorate_tbl sll_prorated_tab_type;
4039 -------------------------------------------------------------------------
4040 -- Begin partial period computation logic
4041 -- Developer Mani Choudhary
4042 -- Date 04-MAY-2005
4043 -------------------------------------------------------------------------
4044 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
4045 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
4046 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
4047 l_tangible BOOLEAN;
4048 l_pricing_method Varchar2(30);
4049 -------------------------------------------------------------------------
4050 -- End partial period computation logic
4051 -- Date 04-MAY-2005
4052 -------------------------------------------------------------------------
4053 ----The procedure finds the amount for line . Then find the amount for sll rule from the given periods and
4054 ----line amount and update the sll rule.
4055 BEGIN
4056
4057 x_return_status := 'S';
4058
4059 l_strm_lvl_tbl_in.DELETE;
4060
4061 OPEN l_Line_Csr;
4062 FETCH l_Line_Csr INTO l_Line_Csr_Rec;
4063
4064 IF l_Line_Csr%NOTFOUND THEN
4065 Close l_Line_Csr;
4066 x_return_status := 'E';
4067 RETURN;
4068 ELSE
4069 Close l_Line_Csr;
4070 END IF;
4071
4072 -------------------------------------------------------------------------
4073 -- Begin partial period computation logic
4074 -- Developer Mani Choudhary
4075 -- Date 09-MAY-2005
4076 -------------------------------------------------------------------------
4077
4078 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
4079 (
4080 p_hdr_id =>l_Line_Csr_Rec.dnz_chr_id,
4081 p_org_id => NULL,
4082 x_period_start => l_period_start,
4083 x_period_type => l_period_type,
4084 x_price_uom => l_price_uom,
4085 x_return_status => x_return_status);
4086
4087 IF x_return_status <> 'S' THEN
4088 RAISE G_EXCEPTION_HALT_VALIDATION;
4089 END IF;
4090 --Description in detail for the business rules for deriving the period start
4091 --1)For usage , period start will always be 'SERVICE'
4092 --2)For Subscriptions, period start and period type will be NULL
4093 -- for tangible subscriptions as per CR1.For intangible subscriptions,
4094 -- if the profile OKS: Intangible Subscription Pricing Method
4095 -- is set to 'Subscription Based',then period start and period type will be NULL
4096 -- otherwise it will be 'SERVICE'
4097 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
4098
4099 --mchoudha fix for bug#5183011
4100 IF l_period_start IS NOT NULL AND
4101 l_period_type IS NOT NULL
4102 THEN
4103 IF l_Line_Csr_Rec.lse_id = 12 THEN
4104 l_period_start := 'SERVICE';
4105 END IF;
4106 IF l_Line_Csr_Rec.lse_id = 46 THEN
4107 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_line_id);
4108 IF l_tangible THEN
4109 l_period_start := NULL;
4110 l_period_type := NULL;
4111 ELSE
4112 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
4113 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
4114 l_period_start := NULL;
4115 l_period_type := NULL;
4116 ELSE
4117 l_period_start := 'SERVICE';
4118 END IF; -- l_pricing_method <> 'EFFECTIVITY'
4119 END IF; -- IF l_tangible
4120 END IF; -- l_Line_Csr_Rec.lse_id = 46
4121 END IF; -- period start and period type are not null
4122 -------------------------------------------------------------------------
4123 -- End partial period computation logic
4124 -- Date 09-MAY-2005
4125 -------------------------------------------------------------------------
4126
4127
4128 IF l_currency_code IS NULL THEN
4129 l_currency_code := Find_Currency_Code(
4130 p_cle_id => p_line_id,
4131 p_chr_id => NULL);
4132 IF l_currency_code IS NULL THEN
4133 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
4134 x_return_status := 'E';
4135 RETURN;
4136 END IF;
4137 END IF; ---currency code null
4138
4139 l_Line_Amount := l_Line_Csr_Rec.line_amt;
4140
4141 l_Sll_Counter := 1;
4142 l_used_amt := 0;
4143 l_prorate_counter := 0;
4144
4145 FOR l_Line_Sll_Csr_REC IN l_Line_Sll_Csr
4146 LOOP
4147
4148 IF l_Line_Sll_Csr_Rec.level_amount IS NOT NULL THEN ---------calculate total sll amount
4149
4150 l_sll_amt := (l_Line_Sll_Csr_Rec.level_amount * l_Line_Sll_Csr_Rec.level_periods);
4151 l_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt, l_currency_code);
4152 l_used_amt := l_used_amt + l_sll_amt;
4153
4154 -----errorout_ad('sll amount = ' || to_char(l_sll_amt));
4155 -----errorout_ad('total used amount = ' || to_char(l_used_amt));
4156
4157 ELSE
4158
4159 l_prorate_counter := l_prorate_counter + 1;
4160 -----errorout_ad('prorate counter = ' || to_char(l_prorate_counter));
4161
4162 l_sll_prorate_tbl(l_prorate_counter).sll_seq_num := l_sll_counter; ---index of sll table
4163 l_sll_prorate_tbl(l_prorate_counter).sll_start_date := l_line_sll_csr_rec.Start_Date;
4164 l_sll_prorate_tbl(l_prorate_counter).sll_end_date := l_line_sll_csr_rec.end_Date;
4165 l_sll_prorate_tbl(l_prorate_counter).sll_tuom := l_Line_Sll_Csr_Rec.uom_code;
4166 l_sll_prorate_tbl(l_prorate_counter).sll_period := l_Line_Sll_Csr_Rec.level_periods;
4167 l_sll_prorate_tbl(l_prorate_counter).sll_uom_per_period := l_Line_Sll_Csr_Rec.uom_per_period;
4168 END IF;
4169
4170
4171 l_strm_lvl_tbl_in(l_Sll_Counter).id := l_Line_Sll_Csr_Rec.id;
4172 l_strm_lvl_tbl_in(l_Sll_Counter).cle_id := l_Line_Sll_Csr_Rec.cle_id;
4173 l_strm_lvl_tbl_in(l_Sll_Counter).chr_id := l_Line_Sll_Csr_Rec.chr_id;
4174 l_strm_lvl_tbl_in(l_Sll_Counter).dnz_chr_id := l_Line_Sll_Csr_Rec.dnz_chr_id;
4175 l_strm_lvl_tbl_in(l_Sll_Counter).uom_code := l_Line_Sll_Csr_Rec.uom_code;
4176 l_strm_lvl_tbl_in(l_Sll_Counter).sequence_no := l_Line_Sll_Csr_Rec.sequence_no;
4177 l_strm_lvl_tbl_in(l_Sll_Counter).start_date := l_line_sll_csr_rec.Start_Date;
4178 l_strm_lvl_tbl_in(l_Sll_Counter).end_date := l_line_sll_csr_rec.end_Date;
4179 l_strm_lvl_tbl_in(l_Sll_Counter).level_periods := l_Line_Sll_Csr_Rec.level_periods;
4180 l_strm_lvl_tbl_in(l_Sll_Counter).uom_per_period := l_Line_Sll_Csr_Rec.uom_per_period;
4181 l_strm_lvl_tbl_in(l_Sll_Counter).level_amount := l_Line_Sll_Csr_Rec.level_amount;
4182 l_strm_lvl_tbl_in(l_Sll_Counter).invoice_offset_days := l_Line_Sll_Csr_Rec.invoice_offset_days;
4183 l_strm_lvl_tbl_in(l_Sll_Counter).interface_offset_days := l_Line_Sll_Csr_Rec.interface_offset_days;
4184 l_strm_lvl_tbl_in(l_Sll_Counter).object_version_number := l_Line_Sll_Csr_Rec.object_version_number;
4185
4186 l_strm_lvl_tbl_in(l_Sll_Counter).created_by := OKC_API.G_MISS_NUM;
4187 l_strm_lvl_tbl_in(l_Sll_Counter).creation_date := SYSDATE;
4188 l_strm_lvl_tbl_in(l_Sll_Counter).last_updated_by := OKC_API.G_MISS_NUM;
4189 l_strm_lvl_tbl_in(l_Sll_Counter).last_update_date := SYSDATE;
4190
4191
4192 l_Sll_Counter := l_Sll_Counter + 1;
4193
4194
4195 END LOOP; --sll loop
4196
4197
4198 -----errorout_ad('OUTSIDE LOOP');
4199 -----errorout_ad('l_sll_prorate_tbl.COUNT = '|| TO_CHAR(l_sll_prorate_tbl.COUNT));
4200
4201 IF l_sll_prorate_tbl.COUNT >= 1 THEN ----get sll amount only if atleast 1 sll is without amount.
4202
4203 l_remaining_amt := l_Line_Amount - l_used_amt;
4204 -----errorout_ad('l_remaining_amt = ' || to_char(l_remaining_amt));
4205 -----errorout_ad('l_currency_code = ' || l_currency_code);
4206
4207 Calculate_sll_amount(
4208 p_api_version => l_api_version,
4209 p_total_amount => l_remaining_amt,
4210 p_currency_code => l_currency_code,
4211 p_sll_prorated_tab => l_sll_prorate_tbl,
4212 p_period_start => l_period_start,
4213 p_period_type => l_period_type,
4214 x_return_status => x_return_status);
4215
4216
4217 -----errorout_ad ('Get_sll_amount STATUS = ' || x_return_status);
4218
4219
4220 IF (l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
4221 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
4222 ELSIF (l_return_status = OKC_API.G_RET_STS_ERROR) THEN
4223 RAISE OKC_API.G_EXCEPTION_ERROR;
4224 END IF;
4225
4226 ---- the output table has index number of sll table to be updated in sll_seq_num field,
4227 ----so just change the amount for the l_rulv_index .
4228
4229
4230 IF l_sll_prorate_tbl.COUNT > 0 THEN
4231 l_amt_counter := l_sll_prorate_tbl.FIRST;
4232 LOOP
4233 l_sll_index := l_sll_prorate_tbl(l_amt_counter).sll_seq_num;
4234
4235 -----errorout_ad('sll index = '|| to_char(l_sll_index));
4236 -----errorout_ad('sll amount returned = '|| to_char(l_sll_prorate_tbl(l_amt_counter).sll_amount));
4237
4238 l_period_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
4239 l_sll_prorate_tbl(l_amt_counter).sll_amount, l_currency_code);
4240
4241 l_strm_lvl_tbl_in(l_sll_index).level_amount := l_period_sll_amount;
4242
4243 EXIT WHEN l_amt_counter = l_sll_prorate_tbl.LAST;
4244
4245 l_amt_counter := l_sll_prorate_tbl.NEXT(l_amt_counter);
4246
4247 END LOOP;
4248 END IF; --prorate tbl count chk
4249
4250 END IF; ----end of getting sll amount
4251
4252
4253 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
4254 FOR i IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
4255 LOOP
4256
4257 UPDATE oks_stream_levels_b
4258 set level_amount = l_strm_lvl_tbl_in(i).level_amount
4259 WHERE id = l_strm_lvl_tbl_in(i).id;
4260
4261 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4262
4263 fnd_log.STRING (fnd_log.level_statement,
4264 G_MODULE_CURRENT || '.update_sll_amount.update',
4265 'update sll id = ' || l_strm_lvl_tbl_in(i).id
4266 ||', amt = ' || l_strm_lvl_tbl_in(i).level_amount
4267 );
4268 END IF;
4269 END LOOP; --tbl for loop
4270 END IF; ---sll tbl count chk
4271
4272 EXCEPTION
4273 WHEN OTHERS THEN
4274 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
4275 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.update_sll_amount.UNEXPECTED',
4276 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
4277 END IF;
4278 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4279 p_msg_name => G_UNEXPECTED_ERROR,
4280 p_token1 => G_SQLCODE_TOKEN,
4281 p_token1_value => sqlcode,
4282 p_token2 => G_SQLERRM_TOKEN,
4283 p_token2_value => sqlerrm);
4284
4285 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4286
4287 END Update_Sll_Amount;
4288
4289 PROCEDURE Calculate_sll_amount( p_api_version IN NUMBER,
4290 p_total_amount IN NUMBER,
4291 p_currency_code IN VARCHAR2,
4292 p_period_start IN VARCHAR2,
4293 p_period_type IN VARCHAR2,
4294 p_sll_prorated_tab IN OUT NOCOPY sll_prorated_tab_type,
4295 x_return_status OUT NOCOPY VARCHAR2
4296
4297 )
4298 IS
4299 l_sll_num NUMBER;
4300 i NUMBER;
4301 j NUMBER;
4302 l_sll_remain_amount NUMBER(20,2);
4303 l_currency_code VARCHAR2(15);
4304 l_period_sll_amt NUMBER(20,2);
4305
4306 l_uom_code VARCHAR2(40);
4307 l_tce_code VARCHAR2(10);
4308 l_uom_quantity NUMBER;
4309 l_curr_sll_start_date DATE;
4310 l_curr_sll_end_date DATE;
4311
4312 l_next_sll_start_date DATE;
4313 l_next_sll_end_date DATE;
4314 l_tot_sll_amount NUMBER(20,2);
4315
4316 l_curr_frequency NUMBER;
4317 l_next_frequency NUMBER;
4318 l_tot_frequency NUMBER;
4319 l_sll_period NUMBER;
4320 l_return_status VARCHAR2(1);
4321 l_uom_per_period NUMBER;
4322 l_temp NUMBER;
4323
4324 BEGIN
4325 x_return_status := 'S';
4326 l_sll_num := p_sll_prorated_tab.count;
4327 l_sll_remain_amount := p_total_amount;
4328 -------------------------------------------------------------------------
4329 -- Begin partial period computation logic
4330 -- Developer Mani Choudhary
4331 -- Date 31-MAY-2005
4332 -- Proration to consider period start and period type
4333 -------------------------------------------------------------------------
4334 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4335 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4336 'input parameters period start '||p_period_start
4337 ||' p_period_type = ' || p_period_type);
4338 END IF;
4339
4340 IF p_period_start is NOT NULL AND
4341 p_period_type is NOT NULL
4342 THEN
4343 FOR i in 1 .. l_sll_num LOOP
4344 l_uom_code := p_sll_prorated_tab(i).sll_tuom ;
4345 l_uom_per_period := p_sll_prorated_tab(i).sll_uom_per_period ;
4346 --errorout_ad('l_uom_code '||l_uom_code);
4347 l_next_sll_end_date := NULL;
4348 l_curr_sll_start_date := p_sll_prorated_tab(i).sll_start_date;
4349 l_curr_sll_end_date := p_sll_prorated_tab(i).sll_end_date;
4350
4351 For j in i+1 .. l_sll_num Loop
4352 l_next_sll_start_date := p_sll_prorated_tab(j).sll_start_date;
4353 l_next_sll_end_date := p_sll_prorated_tab(j).sll_end_date;
4354 /* l_temp:=NULL;
4355 l_temp:= OKS_TIME_MEASURES_PUB.get_quantity (
4356 p_start_date => l_next_sll_start_date,
4357 p_end_date => l_next_sll_end_date,
4358 p_source_uom => l_uom_code,
4359 p_period_type => p_period_type,
4360 p_period_start => p_period_start
4361 );
4362 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4363 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4364 'afer calling OKS_TIME_MEASURES_PUB.get_quantity input parameters period start '||p_period_start||' p_period_type = ' || p_period_type
4365 ||' result l_temp '||l_temp);
4366 END IF;
4367
4368 IF nvl(l_temp,0) = 0 THEN
4369 RAISE G_EXCEPTION_HALT_VALIDATION;
4370 END IF;
4371
4372 l_next_frequency :=l_next_frequency + l_temp;
4373
4374 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4375 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4376 'afer calling OKS_TIME_MEASURES_PUB.get_quantity input parameters period start '||p_period_start||' p_period_type = ' || p_period_type
4377 ||' result l_next_frequency '||l_next_frequency);
4378 END IF;
4379
4380 */
4381
4382 END LOOP;
4383
4384 l_curr_frequency := OKS_TIME_MEASURES_PUB.get_quantity (
4385 p_start_date => l_curr_sll_start_date,
4386 p_end_date => l_curr_sll_end_date,
4387 p_source_uom => l_uom_code,
4388 p_period_type => p_period_type,
4389 p_period_start => p_period_start
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_curr_frequency '||l_curr_frequency);
4395 END IF;
4396
4397 IF nvl(l_curr_frequency,0) = 0 THEN
4398 RAISE G_EXCEPTION_HALT_VALIDATION;
4399 END IF;
4400 l_tot_frequency := 0;
4401
4402 l_tot_frequency := OKS_TIME_MEASURES_PUB.get_quantity (
4403 p_start_date => l_curr_sll_start_date,
4404 p_end_date => nvl(l_next_sll_end_date,l_curr_sll_end_date),
4405 p_source_uom => l_uom_code,
4406 p_period_type => p_period_type,
4407 p_period_start => p_period_start
4408 );
4409
4410 IF nvl(l_tot_frequency,0) = 0 THEN
4411 RAISE G_EXCEPTION_HALT_VALIDATION;
4412 END IF;
4413 --errorout_ad('l_curr_frequency '||l_curr_frequency);
4414
4415 -- l_next_frequency := 0;
4416
4417
4418 -- l_tot_frequency := l_tot_frequency + l_curr_frequency + l_next_frequency;
4419
4420 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4421 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4422 ' result l_tot_frequency '||l_tot_frequency);
4423 END IF;
4424
4425 --errorout_ad('l_tot_frequency '||l_tot_frequency);
4426 -- l_sll_period := p_sll_prorated_tab(i).sll_period;
4427 l_sll_period := l_curr_frequency/l_uom_per_period;
4428
4429 l_period_sll_amt := ( l_sll_remain_amount /( nvl(l_tot_frequency,1) * nvl(l_sll_period,1))) * nvl(l_curr_frequency,0) ;
4430
4431 l_period_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_period_sll_amt, l_currency_code);
4432
4433 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4434 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4435 ' result l_period_sll_amt '||l_period_sll_amt);
4436 END IF;
4437
4438
4439 l_sll_remain_amount := l_sll_remain_amount - (l_period_sll_amt * nvl(l_sll_period,1)) ;
4440
4441 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4442 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4443 ' result l_sll_remain_amount '||l_sll_remain_amount);
4444 END IF;
4445
4446 --errorout_ad('l_period_sll_amt '||l_period_sll_amt);
4447 --errorout_ad('l_sll_remain_amount '||l_sll_remain_amount);
4448 p_sll_prorated_tab(i).sll_amount := l_period_sll_amt;
4449 l_curr_frequency := 0;
4450 END LOOP;
4451 -------------------------------------------------------------------------
4452 -- End partial period computation logic
4453 -------------------------------------------------------------------------
4454 ELSE
4455 For i in 1 .. l_sll_num Loop
4456 l_uom_code := p_sll_prorated_tab(i).sll_tuom ;
4457 oks_bill_util_pub.get_seeded_timeunit(
4458 p_timeunit => l_uom_code ,
4459 x_return_status => l_return_status,
4460 x_quantity => l_uom_quantity,
4461 x_timeunit => l_tce_code);
4462
4463 l_curr_sll_start_date := p_sll_prorated_tab(i).sll_start_date;
4464 l_curr_sll_end_date := p_sll_prorated_tab(i).sll_end_date;
4465
4466 IF l_tce_code = 'DAY' Then
4467 l_curr_frequency := l_curr_sll_end_date - l_curr_sll_start_date + 1;
4468 ELSIF l_tce_code = 'MONTH' Then
4469 l_curr_frequency := months_between(l_curr_sll_end_date + 1, l_curr_sll_start_date) ;
4470 ELSIF l_tce_code = 'YEAR' Then
4471 l_curr_frequency := months_between(l_curr_sll_end_date + 1, l_curr_sll_start_date) / 12 ;
4472 END IF;
4473
4474 If NVL(l_uom_quantity,0) > 0 Then
4475 l_curr_frequency := l_curr_frequency / NVL(l_uom_quantity,1);
4476 END IF;
4477 --errorout_ad('l_curr_frequency '||l_curr_frequency);
4478 l_tot_frequency := 0;
4479 l_next_frequency := 0;
4480
4481 For j in i+1 .. l_sll_num Loop
4482 l_next_sll_start_date := p_sll_prorated_tab(j).sll_start_date;
4483 l_next_sll_end_date := p_sll_prorated_tab(j).sll_end_date;
4484 IF l_tce_code = 'DAY' Then
4485 l_next_frequency := l_next_frequency + (l_next_sll_end_date - l_next_sll_start_date + 1);
4486 ELSIF l_tce_code = 'MONTH' Then
4487 l_next_frequency := l_next_frequency + (months_between(l_next_sll_end_date + 1, l_next_sll_start_date)) ;
4488 ELSIF l_tce_code = 'YEAR' Then
4489 l_next_frequency := l_next_frequency + (months_between(l_next_sll_end_date + 1, l_next_sll_start_date) / 12) ;
4490 END IF;
4491
4492
4493 END LOOP;
4494
4495 If NVL(l_uom_quantity,0) > 0 Then
4496 l_next_frequency := l_next_frequency / NVL(l_uom_quantity,1);
4497 END IF;
4498
4499 l_tot_frequency := l_tot_frequency + l_curr_frequency + l_next_frequency;
4500 --errorout_ad('l_tot_frequency '||l_tot_frequency);
4501 l_sll_period := p_sll_prorated_tab(i).sll_period;
4502
4503
4504 l_period_sll_amt := ( l_sll_remain_amount /( nvl(l_tot_frequency,1) * nvl(l_sll_period,1))) * nvl(l_curr_frequency,0) ;
4505
4506 l_period_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_period_sll_amt, l_currency_code);
4507
4508 l_sll_remain_amount := l_sll_remain_amount - (l_period_sll_amt * nvl(l_sll_period,1)) ;
4509 --errorout_ad('l_period_sll_amt '||l_period_sll_amt);
4510 --errorout_ad('l_sll_remain_amount '||l_sll_remain_amount);
4511 p_sll_prorated_tab(i).sll_amount := l_period_sll_amt;
4512 l_curr_frequency := 0;
4513 END LOOP;
4514 END IF;
4515
4516 EXCEPTION
4517 WHEN G_EXCEPTION_HALT_VALIDATION THEN
4518 x_return_status := G_RET_STS_ERROR;
4519 END Calculate_sll_amount;
4520
4521
4522 FUNCTION Find_Sll_Count(
4523 p_subline_id NUMBER)
4524 RETURN NUMBER
4525
4526 IS
4527
4528 l_sll_rule_count NUMBER;
4529
4530 BEGIN
4531
4532 SELECT COUNT(id) INTO l_sll_rule_count
4533 FROM oks_stream_levels_b
4534 WHERE cle_id = p_subline_id ;
4535
4536 RETURN l_sll_rule_count;
4537
4538 EXCEPTION
4539 WHEN OTHERS THEN
4540 RETURN NULL;
4541
4542 END Find_Sll_Count;
4543
4544
4545 PROCEDURE Delete_lvl_element(p_cle_id IN NUMBER,
4546 x_return_status OUT NOCOPY VARCHAR2)
4547
4548 IS
4549
4550 BEGIN
4551
4552 ---it deletes the level elementwhich are not billed for the given line id.
4553
4554 x_return_status := 'S';
4555
4556 DELETE FROM OKS_LEVEL_ELEMENTS
4557 WHERE date_Completed is NULL
4558 AND cle_id = p_cle_id;
4559
4560
4561 EXCEPTION
4562 WHEN OTHERS THEN
4563 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4564 p_msg_name => G_UNEXPECTED_ERROR,
4565 p_token1 => G_SQLCODE_TOKEN,
4566 p_token1_value => sqlcode,
4567 p_token2 => G_SQLERRM_TOKEN,
4568 p_token2_value => sqlerrm);
4569
4570 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4571
4572 END Delete_lvl_element;
4573
4574
4575
4576 PROCEDURE Del_hdr_lvl_element(p_hdr_id IN NUMBER,
4577 x_return_status OUT NOCOPY VARCHAR2
4578 )
4579 IS
4580
4581
4582 BEGIN
4583
4584 x_return_status := 'S';
4585 ---delete hdr , top line, cp lvl elements together
4586
4587 DELETE FROM OKS_LEVEL_ELEMENTS
4588 WHERE rul_id IN
4589 (SELECT sll.id
4590 FROM OKS_STREAM_LEVELS_B sll
4591 WHERE sll.dnz_chr_id = p_hdr_id);
4592
4593
4594
4595 ---delete sll for line and cp.
4596
4597 DELETE FROM OKS_STREAM_LEVELS_B
4598 WHERE dnz_chr_id = p_hdr_id
4599 AND chr_id IS NULL;
4600
4601 EXCEPTION
4602 WHEN OTHERS THEN
4603 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4604 p_msg_name => G_UNEXPECTED_ERROR,
4605 p_token1 => G_SQLCODE_TOKEN,
4606 p_token1_value => sqlcode,
4607 p_token2 => G_SQLERRM_TOKEN,
4608 p_token2_value => sqlerrm);
4609
4610 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4611
4612 END Del_hdr_lvl_element;
4613
4614
4615 Procedure Cal_hdr_Sll_Amount
4616 (
4617 p_hdr_id IN NUMBER,
4618 x_return_status OUT NOCOPY Varchar2
4619 )
4620 IS
4621
4622 Cursor l_hdr_Csr Is
4623 SELECT id, TRUNC(start_date) start_dt, TRUNC(end_date) end_dt
4624 FROM OKC_K_HEADERS_b
4625 WHERE id = p_hdr_id ;
4626
4627
4628 CURSOR l_Sll_Csr IS
4629 SELECT sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
4630 sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
4631 sll.interface_offset_days, sll.cle_id, sll.chr_id,
4632 sll.dnz_chr_id, sll.end_date, sll.object_version_number
4633 FROM oks_stream_levels_b sll
4634 WHERE sll.chr_id = p_hdr_id
4635 ORDER BY sll.sequence_no;
4636
4637 l_hdr_Csr_Rec l_hdr_Csr%Rowtype;
4638 l_Sll_Csr_Rec l_Sll_Csr%Rowtype;
4639 l_hdr_Amount NUMBER;
4640 l_Sll_Counter NUMBER;
4641 l_Cycle_Start_Date DATE;
4642 l_Cycle_End_Date DATE;
4643 l_remaining_amt NUMBER;
4644 l_used_amt NUMBER;
4645 l_total_period NUMBER;
4646 l_prorate_counter NUMBER;
4647 l_amt_counter NUMBER;
4648 l_sll_index NUMBER;
4649 l_sll_amt NUMBER;
4650 l_period_sll_amount NUMBER(20,2);
4651
4652 l_return_status VARCHAR2(10);
4653 l_msg_count NUMBER;
4654 l_msg_data VARCHAR2(2000);
4655 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
4656
4657 l_sll_prorate_tbl sll_prorated_tab_type;
4658 -------------------------------------------------------------------------
4659 -- Begin partial period computation logic
4660 -- Developer Mani Choudhary
4661 -- Date 04-MAY-2005
4662 -------------------------------------------------------------------------
4663 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
4664 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
4665 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
4666 -------------------------------------------------------------------------
4667 -- End partial period computation logic
4668 -- Date 04-MAY-2005
4669 -------------------------------------------------------------------------
4670
4671 ----The procedure finds the amount for hdr . Then find the amount for sll rule from the given periods and
4672 ----hdr amount and update the sll rule.
4673 BEGIN
4674 x_return_status := 'S';
4675 l_strm_lvl_tbl_in.DELETE;
4676
4677 OPEN l_hdr_Csr;
4678 FETCH l_hdr_Csr INTO l_hdr_Csr_Rec;
4679
4680 IF l_hdr_Csr%NOTFOUND THEN
4681 Close l_hdr_Csr;
4682 x_return_status := 'E';
4683 RETURN;
4684 ELSE
4685 Close l_hdr_Csr;
4686 END IF;
4687 -------------------------------------------------------------------------
4688 -- Begin partial period computation logic
4689 -- Developer Mani Choudhary
4690 -- Date 09-MAY-2005
4691 -------------------------------------------------------------------------
4692
4693 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
4694 (
4695 p_hdr_id => p_hdr_id,
4696 p_org_id => NULL,
4697 x_period_start => l_period_start,
4698 x_period_type => l_period_type,
4699 x_price_uom => l_price_uom,
4700 x_return_status => x_return_status);
4701
4702 IF x_return_status <> 'S' THEN
4703 RAISE G_EXCEPTION_HALT_VALIDATION;
4704 END IF;
4705 -------------------------------------------------------------------------
4706 -- End partial period computation logic
4707 -- Date 09-MAY-2005
4708 -------------------------------------------------------------------------
4709 IF l_currency_code IS NULL THEN
4710 l_currency_code := Find_Currency_Code(
4711 p_cle_id => NULL,
4712 p_chr_id => p_hdr_id);
4713
4714 IF l_currency_code IS NULL THEN
4715 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
4716 x_return_status := 'E';
4717 RETURN;
4718 END IF;
4719 END IF;
4720
4721
4722 l_hdr_Amount := Cal_Hdr_Amount(p_contract_id => p_hdr_id);
4723
4724
4725 l_Sll_Counter := 1;
4726 l_used_amt := 0;
4727 l_prorate_counter := 0;
4728
4729 FOR l_Sll_Csr_rec IN l_Sll_Csr
4730 LOOP
4731
4732
4733 IF l_Sll_Csr_Rec.level_amount IS NOT NULL THEN ---------calculate total all amount
4734
4735 l_sll_amt := to_number(l_Sll_Csr_Rec.level_amount) * to_number(l_Sll_Csr_Rec.level_periods);
4736 l_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt, l_currency_code);
4737 l_used_amt := l_used_amt + l_sll_amt;
4738
4739 -----errorout_ad('sll amount = ' || to_char(l_sll_amt));
4740 -----errorout_ad('total used amount = ' || to_char(l_used_amt));
4741
4742 ELSE
4743
4744 l_prorate_counter := l_prorate_counter + 1;
4745 -----errorout_ad('prorate counter = ' || to_char(l_prorate_counter));
4746
4747 l_sll_prorate_tbl(l_prorate_counter).sll_seq_num := l_sll_counter; ---index of rulv table
4748 l_sll_prorate_tbl(l_prorate_counter).sll_start_date := l_sll_csr_rec.Start_Date;
4749 l_sll_prorate_tbl(l_prorate_counter).sll_end_date := l_sll_csr_rec.end_Date;
4750 l_sll_prorate_tbl(l_prorate_counter).sll_tuom := l_Sll_Csr_Rec.uom_code;
4751 l_sll_prorate_tbl(l_prorate_counter).sll_period := TO_NUMBER(l_Sll_Csr_Rec.level_periods);
4752 l_sll_prorate_tbl(l_prorate_counter).sll_uom_per_period := l_Sll_Csr_Rec.uom_per_period;
4753
4754 -----errorout_ad('sll_seq_num = ' || TO_CHAR(l_sll_counter));
4755 -----errorout_ad('sll_start_date = ' || TO_CHAR(l_Cycle_Start_Date));
4756 -----errorout_ad('sll_start_date = ' || TO_CHAR(l_Cycle_End_Date));
4757 -----errorout_ad('sll_uom = ' || l_Sll_Csr_Rec.object1_id1);
4758 END IF;
4759
4760 l_strm_lvl_tbl_in(l_Sll_Counter).id := l_Sll_Csr_Rec.id;
4761 l_strm_lvl_tbl_in(l_Sll_Counter).cle_id := l_Sll_Csr_Rec.cle_id;
4762 l_strm_lvl_tbl_in(l_Sll_Counter).chr_id := l_Sll_Csr_Rec.chr_id;
4763 l_strm_lvl_tbl_in(l_Sll_Counter).dnz_chr_id := l_Sll_Csr_Rec.dnz_chr_id;
4764 l_strm_lvl_tbl_in(l_Sll_Counter).uom_code := l_Sll_Csr_Rec.uom_code;
4765 l_strm_lvl_tbl_in(l_Sll_Counter).sequence_no := l_Sll_Csr_Rec.sequence_no;
4766 l_strm_lvl_tbl_in(l_Sll_Counter).start_date := l_sll_csr_rec.Start_Date;
4767 l_strm_lvl_tbl_in(l_Sll_Counter).end_date := l_sll_csr_rec.end_Date;
4768 l_strm_lvl_tbl_in(l_Sll_Counter).level_periods := l_Sll_Csr_Rec.level_periods;
4769 l_strm_lvl_tbl_in(l_Sll_Counter).uom_per_period := l_Sll_Csr_Rec.uom_per_period;
4770 l_strm_lvl_tbl_in(l_Sll_Counter).level_amount := l_Sll_Csr_Rec.level_amount;
4771 l_strm_lvl_tbl_in(l_Sll_Counter).invoice_offset_days := l_Sll_Csr_Rec.invoice_offset_days;
4772 l_strm_lvl_tbl_in(l_Sll_Counter).interface_offset_days := l_Sll_Csr_Rec.interface_offset_days;
4773 l_strm_lvl_tbl_in(l_Sll_Counter).object_version_number := l_Sll_Csr_Rec.object_version_number;
4774
4775 l_strm_lvl_tbl_in(l_Sll_Counter).created_by := OKC_API.G_MISS_NUM;
4776 l_strm_lvl_tbl_in(l_Sll_Counter).creation_date := SYSDATE;
4777 l_strm_lvl_tbl_in(l_Sll_Counter).last_updated_by := OKC_API.G_MISS_NUM;
4778 l_strm_lvl_tbl_in(l_Sll_Counter).last_update_date := SYSDATE;
4779
4780 l_Sll_Counter := l_Sll_Counter + 1;
4781
4782
4783 END LOOP;
4784
4785
4786 -----errorout_ad('OUTSIDE LOOP');
4787 -----errorout_ad('l_sll_prorate_tbl.COUNT = '|| TO_CHAR(l_sll_prorate_tbl.COUNT));
4788
4789 IF l_sll_prorate_tbl.COUNT >= 1 THEN ----get sll amount only if atleast 1 sll is without amount.
4790
4791 l_remaining_amt := l_hdr_amount - l_used_amt;
4792 -----errorout_ad('l_remaining_amt = ' || to_char(l_remaining_amt));
4793 -----errorout_ad('l_currency_code = ' || l_currency_code);
4794
4795 Calculate_sll_amount(
4796 p_api_version => l_api_version,
4797 p_total_amount => l_remaining_amt,
4798 p_currency_code => l_currency_code,
4799 p_period_start => l_period_start,
4800 p_period_type => l_period_type,
4801 p_sll_prorated_tab => l_sll_prorate_tbl,
4802 x_return_status => x_return_status);
4803
4804
4805 -----errorout_ad ('Get_sll_amount STATUS = ' || x_return_status);
4806
4807
4808 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
4809 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
4810 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
4811 RAISE OKC_API.G_EXCEPTION_ERROR;
4812 END IF;
4813
4814 ---- the output table has index number of sll rule table to be updated in sll_seq_num field,
4815 ----so just change the amount for the l_rulv_index .
4816
4817
4818 IF l_sll_prorate_tbl.COUNT > 0 THEN
4819 l_amt_counter := l_sll_prorate_tbl.FIRST;
4820 LOOP
4821 l_sll_index := l_sll_prorate_tbl(l_amt_counter).sll_seq_num;
4822
4823 -----errorout_ad('sll index = '|| to_char(l_sll_index));
4824 -----errorout_ad('sll amount returned = '|| to_char(l_sll_prorate_tbl(l_amt_counter).sll_amount));
4825
4826 l_period_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
4827 l_sll_prorate_tbl(l_amt_counter).sll_amount, l_currency_code);
4828
4829 l_strm_lvl_tbl_in(l_sll_index).level_amount := TO_CHAR(l_period_sll_amount);
4830
4831 EXIT WHEN l_amt_counter = l_sll_prorate_tbl.LAST;
4832
4833 l_amt_counter := l_sll_prorate_tbl.NEXT(l_amt_counter);
4834
4835 END LOOP;
4836 END IF;
4837
4838 END IF; ----end of getting sll amount
4839
4840 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
4841 FOR i IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
4842 LOOP
4843
4844 UPDATE oks_stream_levels_b
4845 set level_amount = l_strm_lvl_tbl_in(i).level_amount
4846 WHERE id = l_strm_lvl_tbl_in(i).id;
4847 END LOOP; --tbl for loop
4848 END IF; ---sll tbl count chk
4849
4850
4851 EXCEPTION
4852 WHEN OTHERS THEN
4853 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4854 p_msg_name => G_UNEXPECTED_ERROR,
4855 p_token1 => G_SQLCODE_TOKEN,
4856 p_token1_value => sqlcode,
4857 p_token2 => G_SQLERRM_TOKEN,
4858 p_token2_value => sqlerrm);
4859
4860 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4861
4862 END Cal_hdr_Sll_Amount;
4863
4864 PROCEDURE Get_Constant_sll_Amount(p_line_start_date IN DATE,
4865 p_line_end_date IN DATE,
4866 p_cycle_start_date IN DATE,
4867 p_remaining_amount IN NUMBER,
4868 P_uom_quantity IN NUMBER,
4869 P_tce_code IN VARCHAR2,
4870 x_constant_sll_amt OUT NOCOPY NUMBER,
4871 x_return_status OUT NOCOPY VARCHAR2)
4872 IS
4873
4874 l_frequency NUMBER;
4875
4876 BEGIN
4877 x_return_status := OKC_API.G_RET_STS_SUCCESS;
4878 -----errorout_ad('p_tce_code = ' || p_tce_code);
4879 -----errorout_ad('p_uom_quantity = ' || p_uom_quantity);
4880
4881 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4882
4883 fnd_log.STRING (fnd_log.level_statement,
4884 G_MODULE_CURRENT || '.get_constant_sll_amount.info',
4885 'p_tce_code = ' || p_tce_code
4886 ||', p_uom_quantity = ' || p_uom_quantity
4887 ||', p_remaining_amount = ' || p_remaining_amount
4888 ||', st-end dt = ' || p_line_start_date || '-' || p_line_end_date );
4889 END IF;
4890
4891 If p_line_start_date > p_cycle_start_date then ---and l_start_date < l_next_billing_date Then
4892 l_frequency := OKS_BILL_UTIL_PUB.get_frequency
4893 (p_tce_code => p_tce_code,
4894 p_fr_end_date => p_line_end_date ,
4895 p_fr_start_date => p_line_start_date, --this LINE st dt
4896 p_uom_quantity => p_uom_quantity,
4897 x_return_status => X_return_status);
4898
4899
4900 ELSE
4901 l_frequency := OKS_BILL_UTIL_PUB.get_frequency
4902 (p_tce_code => p_tce_code,
4903 p_fr_end_date => p_line_end_date ,
4904 p_fr_start_date => p_cycle_start_date, --this cycle st dt to find remaining period
4905 p_uom_quantity => p_uom_quantity,
4906 x_return_status => x_return_status);
4907
4908 END IF;
4909
4910 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
4911 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.get_constant_sll_amount.freq',
4912 'oks_bill_util_pub.get_frequency(x_return_status = '||x_return_status
4913 ||', l_frequency = '|| l_frequency ||')');
4914 END IF;
4915
4916 If x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
4917 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'GET_FREQUENCY FAILED.');
4918 x_return_status := OKC_API.G_RET_STS_ERROR;
4919 RETURN;
4920 End if;
4921
4922 -----errorout_ad('p_remaining_amount = ' || p_remaining_amount);
4923 -----errorout_ad('l_frequency = ' || l_frequency);
4924
4925 x_constant_sll_amt := (nvl(p_remaining_amount,0)/nvl(l_frequency,1)) ;
4926
4927 -----errorout_ad('x_constant_sll_amt = ' || x_constant_sll_amt);
4928 EXCEPTION
4929 WHEN OTHERS THEN
4930
4931 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
4932 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.get_constant_sll_amount.UNEXPECTED',
4933 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
4934 END IF;
4935 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
4936 p_msg_name => G_UNEXPECTED_ERROR,
4937 p_token1 => G_SQLCODE_TOKEN,
4938 p_token1_value => sqlcode,
4939 p_token2 => G_SQLERRM_TOKEN,
4940 p_token2_value => sqlerrm);
4941
4942 x_return_status := G_RET_STS_UNEXP_ERROR;
4943
4944 END Get_Constant_sll_Amount;
4945
4946 PROCEDURE Get_Period_Frequency(p_line_start_date IN DATE,
4947 p_line_end_date IN DATE,
4948 p_cycle_start_date IN DATE,
4949 p_next_billing_date IN DATE,
4950 P_uom_quantity IN NUMBER,
4951 P_tce_code IN VARCHAR2,
4952 p_uom_per_period IN NUMBER,
4953 x_period_freq OUT NOCOPY NUMBER,
4954 x_return_status OUT NOCOPY VARCHAR2)
4955 IS
4956
4957 BEGIN
4958 x_return_status := OKC_API.G_RET_STS_SUCCESS;
4959 If p_line_start_date > p_cycle_start_date and p_line_start_date < P_next_billing_date Then
4960 x_period_freq := OKS_BILL_UTIL_PUB.get_frequency
4961 (p_tce_code => p_tce_code,
4962 p_fr_start_date => p_line_start_date,
4963 p_fr_end_date => p_next_billing_date - 1,
4964 p_uom_quantity => p_uom_quantity,
4965 x_return_status => x_return_status);
4966
4967 ElsiF( p_next_billing_date > p_line_end_date + 1) THEN
4968 x_period_freq:= OKS_BILL_UTIL_PUB.get_frequency
4969 (p_tce_code => p_tce_code,
4970 p_fr_end_date => p_line_end_date,
4971 p_fr_start_date => p_cycle_start_date,
4972 p_uom_quantity => p_uom_quantity,
4973 x_return_status => x_return_status);
4974
4975 ELSE ----if everything is ok
4976
4977 x_period_freq := p_uom_per_period;
4978
4979 End If;
4980
4981
4982 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
4983 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.get_period_frequency.freq',
4984 'oks_bill_util_pub.get_frequency(x_return_status = '||x_return_status
4985 ||', x_period_freq = '|| x_period_freq ||')');
4986 END IF;
4987
4988 If x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
4989 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'GET_FREQUENCY FAILED.');
4990 x_return_status := OKC_API.G_RET_STS_ERROR;
4991 RETURN;
4992 End if;
4993
4994 EXCEPTION
4995 WHEN OTHERS THEN
4996
4997 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
4998 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.get_period_frequency.UNEXPECTED',
4999 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
5000 END IF;
5001 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
5002 p_msg_name => G_UNEXPECTED_ERROR,
5003 p_token1 => G_SQLCODE_TOKEN,
5004 p_token1_value => sqlcode,
5005 p_token2 => G_SQLERRM_TOKEN,
5006 p_token2_value => sqlerrm);
5007
5008 x_return_status := G_RET_STS_UNEXP_ERROR;
5009
5010 end Get_Period_Frequency;
5011
5012
5013
5014
5015 Function Cal_Sllid_amount
5016 (
5017 p_Sll_id IN NUMBER,
5018 x_return_status OUT NOCOPY Varchar2,
5019 x_msg_count OUT NOCOPY NUMBER,
5020 x_msg_data OUT NOCOPY VARCHAR2
5021 )RETURN NUMBER
5022 IS
5023
5024 l_sll_amt NUMBER := 0;
5025
5026 BEGIN
5027
5028 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5029
5030 SELECT NVL(SUM(AMOUNT),0) INTO l_sll_amt
5031 FROM OKS_LEVEL_ELEMENTS
5032 WHERE rul_id = p_Sll_id;
5033
5034 RETURN l_sll_amt;
5035
5036 EXCEPTION
5037 WHEN OTHERS THEN
5038 x_return_status := G_RET_STS_UNEXP_ERROR;
5039 RETURN NULL;
5040
5041 END Cal_Sllid_amount;
5042
5043 Procedure Create_Bill_Sch_CP
5044 (
5045 p_top_line_id IN NUMBER,
5046 p_cp_line_id IN NUMBER,
5047 p_cp_new IN Varchar2,
5048 x_return_status OUT NOCOPY Varchar2,
5049 x_msg_count OUT NOCOPY NUMBER,
5050 x_msg_data OUT NOCOPY VARCHAR2)
5051
5052 IS
5053
5054 Cursor l_subLine_Csr Is
5055 SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
5056 TRUNC(line.end_date) cp_end_dt, TRUNC(line.date_terminated) cp_term_dt,
5057 dtl.full_credit full_credit,price_uom,lse_id cp_lse_id,
5058 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
5059 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) subline_amt
5060 FROM okc_k_lines_b line, oks_k_lines_b dtl
5061 WHERE line.id = p_cp_line_id
5062 AND line.date_cancelled is NULL
5063 AND line.id = dtl.cle_id;
5064
5065
5066 Cursor l_Line_Csr Is
5067 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
5068 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
5069 line.inv_rule_id inv_id,
5070 nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
5071 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
5072 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
5073 FROM okc_k_lines_b line, oks_k_lines_b dtl
5074 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id
5075 AND line.date_cancelled is NULL;
5076
5077 CURSOR l_line_sll_csr IS
5078 SELECT sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
5079 sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
5080 sll.interface_offset_days, sll.cle_id, sll.chr_id,
5081 sll.dnz_chr_id,sll.end_date
5082 FROM oks_stream_levels_b sll
5083 WHERE sll.cle_id = p_top_line_id
5084 ORDER BY sll.sequence_no;
5085
5086 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
5087 SELECT id, trunc(date_start) date_start,
5088 amount,trunc(date_end) date_end,object_version_number,
5089 date_to_interface, date_transaction
5090 FROM oks_level_elements
5091 WHERE cle_id = p_line_id
5092 ORDER BY date_start;
5093
5094
5095 Cursor l_line_amt_csr (p_id in number) IS
5096 Select line.price_negotiated
5097 from okc_k_lines_b line
5098 where line.id = p_id;
5099
5100
5101 l_index NUMBER;
5102 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
5103
5104 l_Line_Sll_rec l_Line_Sll_Csr%ROWTYPE;
5105 l_line_BS_rec l_line_BS_csr%ROWTYPE;
5106 l_Line_Csr_Rec l_Line_Csr%Rowtype;
5107 l_SubLine_Rec l_subLine_Csr%Rowtype;
5108 l_cp_rec Prod_Det_Type;
5109 l_line_rec Line_Det_Type;
5110
5111
5112 L_bil_sch_out_tbl OKS_BILL_SCH.ItemBillSch_tbl;
5113 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
5114 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
5115 l_update_required VARCHAR2(1);
5116 l_cp_term_dt DATE;
5117 l_amount NUMBER;
5118
5119 -------------------------------------------------------------------------
5120 -- Begin partial period computation logic
5121 -- Developer Mani Choudhary
5122 -- Date 04-MAY-2005
5123 -------------------------------------------------------------------------
5124 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
5125 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
5126 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
5127 l_return_status VARCHAR2(30);
5128 l_tangible BOOLEAN;
5129 l_pricing_method VARCHAR2(30);
5130 -------------------------------------------------------------------------
5131 -- End partial period computation logic
5132 -- Date 04-MAY-2005
5133 -------------------------------------------------------------------------
5134
5135 BEGIN
5136
5137 ---this is called for the new cp or existing cp which is updated and only for 'T'.
5138 --p_cp_new is 'Y' for new subline, 'N' for updating schedule for existing subline
5139
5140 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5141 l_update_required := 'N';
5142
5143 ---get line details
5144 Open l_Line_Csr;
5145 Fetch l_Line_Csr Into l_Line_Csr_Rec;
5146
5147 If l_Line_Csr%Notfound then
5148 Close l_Line_Csr;
5149 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
5150 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_bill_sch_cp.EXCEPTION',
5151 'top line not found = ' || p_top_line_id );
5152 END IF;
5153 x_return_status := 'E';
5154 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
5155 RAISE G_EXCEPTION_HALT_VALIDATION;
5156 End If;
5157 Close l_Line_Csr;
5158
5159 l_line_rec.chr_id := l_Line_Csr_Rec.chr_id;
5160 l_line_rec.dnz_chr_id := l_Line_Csr_Rec.dnz_chr_id;
5161 l_line_rec.id := l_Line_Csr_Rec.id ;
5162 l_line_rec.lse_id := l_Line_Csr_Rec.lse_id;
5163 l_line_rec.line_start_dt := l_Line_Csr_Rec.line_start_dt;
5164 l_line_rec.line_end_dt := l_Line_Csr_Rec.line_end_dt;
5165 l_line_rec.line_amt := l_Line_Csr_Rec.line_amt ;
5166 -----errorout_ad('line found');
5167 -------------------------------------------------------------------------
5168 -- Begin partial period computation logic
5169 -- Developer Mani Choudhary
5170 -- Date 09-MAY-2005
5171 -------------------------------------------------------------------------
5172
5173 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
5174 (
5175 p_hdr_id => l_Line_Csr_Rec.dnz_chr_id,
5176 p_org_id => NULL,
5177 x_period_start => l_period_start,
5178 x_period_type => l_period_type,
5179 x_price_uom => l_price_uom,
5180 x_return_status => x_return_status);
5181
5182 IF x_return_status <> 'S' THEN
5183 RAISE G_EXCEPTION_HALT_VALIDATION;
5184 END IF;
5185 --Description in detail for the business rules for deriving the period start
5186 --1)For usage , period start will always be 'SERVICE'
5187 --2)For Subscriptions, period start and period type will be NULL
5188 -- for tangible subscriptions as per CR1.For intangible subscriptions,
5189 -- if the profile OKS: Intangible Subscription Pricing Method
5190 -- is set to 'Subscription Based',then period start and period type will be NULL
5191 -- otherwise it will be 'SERVICE'
5192 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
5193 --mchoudha fix for bug#5183011
5194 IF l_period_start IS NOT NULL AND
5195 l_period_type IS NOT NULL
5196 THEN
5197 IF l_line_rec.lse_id = 12 THEN
5198 l_period_start := 'SERVICE';
5199 END IF;
5200 IF l_line_rec.lse_id = 46 THEN
5201 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (l_line_rec.id);
5202 IF l_tangible THEN
5203 l_period_start := NULL;
5204 l_period_type := NULL;
5205 ELSE
5206 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
5207 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
5208 l_period_start := NULL;
5209 l_period_type := NULL;
5210 ELSE
5211 l_period_start := 'SERVICE';
5212 END IF; -- l_pricing_method <> 'EFFECTIVITY'
5213 END IF; -- IF l_tangible
5214 END IF; -- l_line_rec.lse_id = 46
5215 END IF; -- period start and period type are not null
5216 -------------------------------------------------------------------------
5217 -- End partial period computation logic
5218 -- Date 09-MAY-2005
5219 -------------------------------------------------------------------------
5220 IF l_period_type is not null AND l_period_start is not NULL THEN
5221 OPEN l_line_amt_csr(l_Line_Csr_Rec.id);
5222 FETCH l_line_amt_csr INTO l_line_rec.line_amt;
5223 CLOSE l_line_amt_csr;
5224 END IF;
5225
5226 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5227
5228 fnd_log.STRING (fnd_log.level_statement,
5229 G_MODULE_CURRENT || '.create_bill_sch_cp.line_dtls',
5230 'dnz_chr_id = ' || l_line_rec.dnz_chr_id
5231 || ', id = ' || l_line_rec.id
5232 || ', lse_id = ' || l_line_rec.lse_id
5233 || ', start dt = ' || l_line_rec.line_start_dt
5234 || ', end dt = ' || l_line_rec.line_end_dt
5235 || ', amt = ' || l_line_rec.line_amt
5236 || ', bill_type = ' || l_Line_Csr_Rec.billing_schedule_type
5237 );
5238 END IF;
5239
5240
5241 IF l_Line_Csr_Rec.billing_schedule_type <> 'T' THEN
5242 RETURN;
5243 END IF;
5244
5245
5246
5247 l_index := 1;
5248 ----make sll tbl
5249 l_sll_tbl.DELETE;
5250
5251 ---make sll tbl
5252
5253 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
5254 LOOP
5255 l_sll_tbl(l_index).id := l_Line_SlL_rec.id;
5256 l_sll_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
5257
5258 l_sll_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
5259 l_sll_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
5260 l_sll_tbl(l_index).uom_code := l_Line_SlL_rec.uom_code;
5261 l_sll_tbl(l_index).sequence_no := l_Line_SlL_rec.sequence_no;
5262 l_sll_tbl(l_index).Start_Date := l_Line_SlL_rec.Start_Date;
5263 IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
5264 l_sll_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
5265 ELSE
5266 l_update_required := 'Y';
5267
5268 l_sll_tbl(l_index).end_Date := OKC_TIME_UTIL_PUB.get_enddate(
5269 l_Line_SlL_rec.Start_Date,
5270 l_Line_SlL_rec.uom_code,
5271 (l_Line_SlL_rec.level_periods *
5272 l_Line_SlL_rec.uom_per_period));
5273 END IF;
5274
5275 l_sll_tbl(l_index).level_periods := l_Line_SlL_rec.level_periods;
5276 l_sll_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
5277 l_sll_tbl(l_index).level_amount := l_Line_SlL_rec.level_amount;
5278 l_sll_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
5279 l_sll_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
5280
5281 l_index := l_index + 1;
5282 END LOOP;
5283
5284 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5285
5286 fnd_log.STRING (fnd_log.level_statement,
5287 G_MODULE_CURRENT || '.create_bill_sch_cp.sll_tbl',
5288 'top line sll tbl count = ' || l_sll_tbl.count
5289 );
5290 END IF;
5291
5292 IF l_sll_tbl.COUNT = 0 THEN
5293 RETURN;
5294 END IF;
5295
5296 -----errorout_ad('SLL found');
5297 ---for migrated contracts without end date
5298 IF l_update_required = 'Y' THEN
5299 OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id => p_top_line_id,
5300 p_chr_id => NULL,
5301 x_return_status => x_return_status);
5302
5303 IF x_return_status <> 'S' then
5304 RETURN;
5305 END IF;
5306 END IF;
5307
5308
5309
5310
5311 --get currency
5312 l_currency_code := Find_Currency_Code(
5313 p_cle_id => p_top_line_id,
5314 p_chr_id => NULL);
5315
5316 IF l_currency_code IS NULL THEN
5317 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
5318 x_return_status := 'E';
5319 RAISE G_EXCEPTION_HALT_VALIDATION;
5320 END IF;
5321
5322 ----get subline
5323 Open l_SubLine_Csr;
5324 FETCH l_SubLine_Csr Into l_SubLine_Rec;
5325 If l_SubLine_Csr%Notfound then
5326 Close l_SubLine_Csr;
5327 x_return_status := 'E';
5328 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'SUB LINE NOT FOUND');
5329 RAISE G_EXCEPTION_HALT_VALIDATION;
5330 End If;
5331 Close l_SubLine_Csr;
5332
5333 l_cp_rec.cp_id := l_SubLine_rec.subline_id ;
5334 l_cp_rec.cp_start_dt := l_SubLine_rec.cp_start_dt;
5335 l_cp_rec.cp_end_dt := l_SubLine_rec.cp_end_dt ;
5336 l_cp_rec.cp_amt := l_SubLine_rec.subline_amt ;
5337 l_cp_rec.cp_price_uom := l_subline_rec.price_uom;
5338 l_cp_rec.cp_lse_id := l_subline_rec.cp_lse_id;
5339
5340
5341 IF l_period_type is not null AND l_period_start is not NULL THEN
5342 OPEN l_line_amt_csr(l_SubLine_rec.subline_id);
5343 FETCH l_line_amt_csr INTO l_cp_rec.cp_amt;
5344 CLOSE l_line_amt_csr;
5345 END IF;
5346 -----if the subline is update then chk if max_bill_dt = end date and update the price.
5347 IF nvl(p_cp_new,'Y') = 'N' AND l_cp_rec.cp_amt > 0 THEN
5348
5349 OKS_BILL_UTIL_PUB.Adjust_line_price(
5350 p_top_line_id => p_top_line_id,
5351 p_sub_line_id => p_cp_line_id ,
5352 p_end_date => l_cp_rec.cp_end_dt,
5353 p_amount => l_cp_rec.cp_amt,
5354 p_dnz_chr_id => l_line_csr_rec.dnz_chr_id,
5355 x_amount => l_amount,
5356 x_return_status => x_return_status);
5357
5358 l_cp_rec.cp_amt := l_amount;
5359 END IF;
5360
5361 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5362
5363 fnd_log.STRING (fnd_log.level_statement,
5364 G_MODULE_CURRENT || '.create_bill_sch_cp.cp_dtls',
5365 'p_cp_new = ' || p_cp_new
5366 || ', id = ' || l_cp_rec.cp_id
5367 || ', start dt = ' || l_cp_rec.cp_start_dt
5368 || ', end dt = ' || l_cp_rec.cp_end_dt
5369 || ', amt = ' || l_cp_rec.cp_amt
5370 || ', full credit flag = ' || l_subline_rec.full_credit
5371 );
5372 END IF;
5373
5374
5375 -----errorout_ad('sub line found');
5376 IF nvl(l_SubLine_rec.cp_term_dt,l_SubLine_rec.cp_start_dt) > l_SubLine_rec.cp_end_dt then
5377 RETURN;
5378 END IF;
5379
5380 ---if full credit flag 'Y',term date to bill_sch_cp as cp start date so that
5381 --level element doesn't get created.
5382
5383 IF l_subline_rec.cp_term_dt IS NOT NULL AND
5384 nvl(l_subline_rec.full_credit,'N') = 'Y' THEN
5385
5386 l_cp_term_dt := l_subline_rec.cp_start_dt;
5387 else
5388 l_cp_term_dt := l_subline_rec.cp_term_dt;
5389 END IF; ---end of full credit chk
5390
5391
5392 l_top_bs_tbl.DELETE;
5393 l_index := 1;
5394
5395 FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
5396 LOOP
5397 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
5398 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
5399 l_top_bs_tbl(l_index).date_end := l_line_BS_rec.date_end;
5400 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
5401 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
5402 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
5403 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
5404
5405 l_index := l_index + 1;
5406 END LOOP; --top line lvl element
5407
5408 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5409
5410 fnd_log.STRING (fnd_log.level_statement,
5411 G_MODULE_CURRENT || '.create_bill_sch_cp.bs_tbl',
5412 'top line bs tbl count = ' || l_top_bs_tbl.count
5413 );
5414 END IF;
5415
5416 -----errorout_ad('line bs found');
5417
5418 IF l_top_bs_tbl.COUNT = 0 THEN ---BS NOT CREATED FOR TOP LINE
5419 OKS_BILL_SCH.Create_Bill_Sch_Rules
5420 (
5421 p_billing_type => l_Line_Csr_Rec.billing_schedule_type,
5422 p_sll_tbl => l_sll_tbl,
5423 p_invoice_rule_id => l_line_csr_rec.inv_id,
5424 x_bil_sch_out_tbl => l_bil_sch_out_tbl,
5425 x_return_status => x_return_status);
5426
5427 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5428 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.call_bs',
5429 'Create_Bill_Sch_Rules(x_return_status = '||x_return_status ||')');
5430 END IF;
5431
5432 IF x_return_status <> 'S' THEN
5433 RAISE G_EXCEPTION_HALT_VALIDATION;
5434 END IF;
5435
5436 else ----call for cp only
5437
5438 IF nvl(p_cp_new,'Y') = 'N' THEN
5439 --if cp already has bs then before calling Bill_Sch_Cp, adjust the amt of
5440 ---top line levl elements.
5441
5442 Adjust_top_BS_Amt( p_Line_Rec => l_Line_Rec,
5443 p_SubLine_rec => l_cp_Rec,
5444 p_top_line_bs => l_top_bs_tbl,
5445 x_return_status => x_return_status);
5446
5447 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5448 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.adjust',
5449 'adjust_top_bs_amt(x_return_status = '||x_return_status ||')');
5450 END IF;
5451
5452
5453 IF x_return_status <> 'S' THEN
5454 RAISE G_EXCEPTION_HALT_VALIDATION;
5455 END IF;
5456
5457 END IF;
5458
5459 ----------errorout_ad('calling Bill_Sch_Cp');
5460 --------------------------------------------------------------------------
5461 -- Begin partial period computation logic
5462 -- Developer Mani Choudhary
5463 -- Date 09-MAY-2005
5464 -- Added two new parameters P_period_start,P_period_type in procedural call
5465 ---------------------------------------------------------------------------
5466 Bill_Sch_Cp
5467 ( p_billing_type => l_Line_Csr_Rec.billing_schedule_type,
5468 p_bsll_tbl => l_sll_tbl,
5469 p_Line_Rec => l_Line_Rec,
5470 p_SubLine_rec => l_cp_Rec,
5471 p_invoice_rulid => l_line_csr_rec.inv_id,
5472 p_top_line_bs => l_top_bs_tbl,
5473 p_term_dt => l_cp_term_dt,
5474 p_period_start => l_period_start,
5475 p_period_type => l_period_type,
5476 x_return_status => x_return_status);
5477
5478 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5479 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.cp_bs',
5480 'Bill_Sch_Cp(x_return_status = '||x_return_status ||')');
5481 END IF;
5482
5483
5484
5485
5486 IF x_return_status = 'S' then
5487 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
5488 p_api_version => l_api_version,
5489 p_init_msg_list => l_init_msg_list,
5490 x_return_status => x_return_status,
5491 x_msg_count => x_msg_count,
5492 x_msg_data => x_msg_data,
5493 p_letv_tbl => l_top_bs_tbl,
5494 x_letv_tbl => l_lvl_ele_tbl_out);
5495
5496 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5497 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.update_top_bs',
5498 'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status ||')');
5499 END IF;
5500 else
5501
5502 RAISE G_EXCEPTION_HALT_VALIDATION;
5503 END IF;
5504
5505 END IF;
5506
5507 EXCEPTION
5508 WHEN G_EXCEPTION_HALT_VALIDATION THEN
5509 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
5510 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_bill_sch_cp.EXCEPTION',
5511 'G_EXCEPTION_HALT_VALIDATION');
5512 END IF;
5513
5514 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
5515 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
5516 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
5517 RAISE OKC_API.G_EXCEPTION_ERROR;
5518 END IF;
5519 WHEN OTHERS THEN
5520 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
5521 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_bill_sch_cp.UNEXPECTED',
5522 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
5523 END IF;
5524 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
5525 p_msg_name => G_UNEXPECTED_ERROR,
5526 p_token1 => G_SQLCODE_TOKEN,
5527 p_token1_value => sqlcode,
5528 p_token2 => G_SQLERRM_TOKEN,
5529 p_token2_value => sqlerrm);
5530
5531 x_return_status := G_RET_STS_UNEXP_ERROR;
5532
5533 END Create_Bill_Sch_CP;
5534
5535 Procedure Cascade_Dates_SLL
5536 (
5537 p_top_line_id IN NUMBER,
5538 x_return_status OUT NOCOPY Varchar2,
5539 x_msg_count OUT NOCOPY NUMBER,
5540 x_msg_data OUT NOCOPY VARCHAR2)
5541 IS
5542
5543 CURSOR l_line_sll_csr IS
5544 SELECT sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
5545 sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
5546 sll.interface_offset_days, sll.cle_id, sll.chr_id,
5547 sll.dnz_chr_id, sll.end_date
5548 FROM oks_stream_levels_b sll
5549 WHERE sll.cle_id = p_top_line_id
5550 ORDER BY sll.sequence_no;
5551
5552
5553 Cursor l_Line_Csr Is
5554 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
5555 TRUNC(line.start_date) start_dt, TRUNC(line.end_date) end_dt,
5556 line.inv_rule_id inv_id,
5557 nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
5558 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
5559 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
5560 FROM okc_k_lines_b line, oks_k_lines_b dtl
5561 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id ;
5562
5563 -------------------------------------------------------------------------
5564 -- Begin partial period computation logic
5565 -- Developer Mani Choudhary
5566 -- Date 07-JUN-2005
5567 -- For usage , usage UOM drives the pricing/billing,
5568 -- so adding the usage period in the cursor
5569 --------------------------------------------------------------------------
5570 CURSOR l_usage_type_csr IS
5571 SELECT usage_type,usage_period
5572 FROM oks_k_lines_b
5573 WHERE cle_id = p_top_line_id;
5574
5575 -------------------------------------------------------------------------
5576 -- Begin partial period computation logic
5577 -- Developer Mani Choudhary
5578 -- Date 07-JUN-2005
5579 -- defining a new cursor to fetch the price uom stored for the
5580 -- top line . This is used as the default billing period for the service lines.
5581 --------------------------------------------------------------------------
5582 CURSOR Get_price_uom IS
5583 SELECT price_uom
5584 FROM OKS_K_LINES_B
5585 WHERE cle_id = p_top_line_id;
5586
5587
5588
5589 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
5590 L_BIL_SCH_OUT_TBL OKS_BILL_SCH.ItemBillSch_tbl;
5591
5592
5593 l_Line_Sll_rec l_Line_Sll_Csr%ROWTYPE;
5594 l_Line_csr_Rec l_Line_Csr%Rowtype;
5595 l_line_rec Line_Det_Type;
5596
5597 l_period_freq NUMBER;
5598 l_actual_freq NUMBER;
5599 l_uom_qty NUMBER;
5600 l_index NUMBER;
5601 l_sll_tbl_index NUMBER;
5602 l_sll_start_date DATE;
5603 l_sll_end_date DATE;
5604 l_sequence NUMBER;
5605 l_factor NUMBER;
5606 l_next_date DATE;
5607 l_sll_ind NUMBER;
5608 l_timeunit VARCHAR2(20);
5609 l_duration NUMBER;
5610 l_difference NUMBER;
5611 l_msg_list VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
5612 L_UOM_QUANTITY number;
5613 l_tce_code VARCHAR2(100);
5614 l_update_end_date VARCHAR2(1);
5615 l_usage_type VARCHAR2(40);
5616 l_amount NUMBER;
5617 -------------------------------------------------------------------------
5618 -- Begin partial period computation logic
5619 -- Developer Mani Choudhary
5620 -- Date 04-MAY-2005
5621 -- Local variables and cursors defined here required for cascade
5622 ---------------------------------------------------------------------------
5623 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
5624 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
5625 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
5626 l_level_periods NUMBER;
5627 ---------------------------------------------------------------------------
5628 BEGIN
5629
5630 --it adjusts the sll and lvl element according to new line start and end date.
5631
5632 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5633
5634 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5635
5636 fnd_log.STRING (fnd_log.level_statement,
5637 G_MODULE_CURRENT || '.cascade_dates_sll.line_passed',
5638 'top line id passed = ' || p_top_line_id );
5639 END IF;
5640
5641
5642 l_update_end_date := 'N';
5643 --find billing type of line
5644
5645 ---get line details
5646 Open l_Line_Csr;
5647 Fetch l_Line_Csr Into l_Line_csr_Rec;
5648
5649 If l_Line_Csr%Notfound then
5650 Close l_Line_Csr;
5651 x_return_status := 'E';
5652 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
5653 RAISE G_EXCEPTION_HALT_VALIDATION;
5654 End If;
5655 Close l_Line_Csr;
5656
5657
5658 l_line_rec.chr_id := l_Line_Csr_Rec.chr_id;
5659 l_line_rec.dnz_chr_id := l_Line_Csr_Rec.dnz_chr_id;
5660 l_line_rec.id := l_Line_Csr_Rec.id ;
5661 l_line_rec.lse_id := l_Line_Csr_Rec.lse_id;
5662 l_line_rec.line_start_dt := l_Line_Csr_Rec.start_dt;
5663 l_line_rec.line_end_dt := l_Line_Csr_Rec.end_dt;
5664 l_line_rec.line_amt := l_Line_Csr_Rec.line_amt ;
5665
5666 ------------------------------------------------------------------------
5667 -- Begin partial period computation logic
5668 -- Developer Mani Choudhary
5669 -- Date 04-MAY-2005
5670 -- Fetching the period start and the period type
5671 -------------------------------------------------------------------------
5672 --Fetch the period start and period type stored at the header
5673 IF l_Line_Csr_Rec.dnz_chr_id is NOT NULL THEN
5674 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
5675 (
5676 p_hdr_id => l_Line_Csr_Rec.dnz_chr_id,
5677 p_org_id => NULL,
5678 x_period_start => l_period_start,
5679 x_period_type => l_period_type,
5680 x_price_uom => l_price_uom,
5681 x_return_status => x_return_status);
5682 IF x_return_status <> 'S' THEN
5683 RAISE G_EXCEPTION_HALT_VALIDATION;
5684 END IF;
5685 END IF;
5686
5687 IF l_period_start IS NOT NULL AND
5688 l_period_type IS NOT NULL
5689 THEN
5690 OPEN Get_price_uom;
5691 FETCH Get_price_uom into l_price_uom;
5692 CLOSE Get_price_uom;
5693 END IF;
5694
5695 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5696
5697 fnd_log.STRING (fnd_log.level_statement,
5698 G_MODULE_CURRENT || '.cascade_dates_sll.line_dtls',
5699 'dnz_chr_id = ' || l_line_rec.dnz_chr_id
5700 || ', id = ' || l_line_rec.id
5701 || ', lse_id = ' || l_line_rec.lse_id
5702 || ', start dt = ' || l_line_rec.line_start_dt
5703 || ', end dt = ' || l_line_rec.line_end_dt
5704 || ', amt = ' || l_line_rec.line_amt
5705 || ', bill_type = ' || l_Line_Csr_Rec.billing_schedule_type
5706 );
5707 END IF;
5708
5709
5710
5711 IF nvl(l_Line_Csr_Rec.billing_schedule_type,'E') <> 'T' then
5712 RETURN;
5713 END IF;
5714
5715
5716 ---Code is added to adjust price of sub line if line is shrinked.
5717 --and max billed to = end date then price becomes billed amount
5718
5719 IF l_Line_Rec.lse_id = 12 THEN
5720 Open l_usage_type_csr;
5721 -------------------------------------------------------------------------
5722 -- Begin partial period computation logic
5723 -- Developer Mani Choudhary
5724 -- Date 07-JUN-2005
5725 -- For usage , usage UOM drives the pricing/billing, so using that
5726 -- period start for usage will be 'SERVICE'
5727 --------------------------------------------------------------------------
5728 Fetch l_usage_type_csr INTO l_usage_type,l_price_uom;
5729 l_period_start := 'SERVICE';
5730 --------------------------------------------------------------------------
5731
5732 IF l_usage_type_csr%FOUND THEN
5733
5734
5735
5736 IF l_usage_type = 'NPR' THEN
5737 OKS_BILL_UTIL_PUB.Adjust_line_price(
5738 p_top_line_id => p_top_line_id,
5739 p_sub_line_id => NULL,
5740 p_end_date => NULL,
5741 p_amount => NULL,
5742 p_dnz_chr_id => l_Line_Rec.dnz_chr_id,
5743 x_amount => l_amount,
5744 x_return_status => x_return_status);
5745
5746 End If; ------usage type NPR chk
5747
5748 END IF; ---- l_usage_type_csr data found chk
5749 Close l_usage_type_csr;
5750
5751 ELSE --- LINE lse_id <> 12
5752 OKS_BILL_UTIL_PUB.Adjust_line_price(
5753 p_top_line_id => p_top_line_id,
5754 p_sub_line_id => NULL,
5755 p_end_date => NULL,
5756 p_amount => NULL,
5757 p_dnz_chr_id => l_Line_Rec.dnz_chr_id,
5758 x_amount => l_amount,
5759 x_return_status => x_return_status);
5760 END IF;
5761
5762 ----make sll tbl
5763
5764 l_index := 1;
5765 l_sll_tbl.DELETE;
5766
5767 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
5768 LOOP
5769 l_sll_tbl(l_index).id := l_Line_SlL_rec.id;
5770 l_sll_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
5771 l_sll_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
5772 l_sll_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
5773 l_sll_tbl(l_index).uom_code := l_Line_SlL_rec.uom_code;
5774 l_sll_tbl(l_index).sequence_no := l_Line_SlL_rec.sequence_no;
5775 l_sll_tbl(l_index).Start_Date := l_Line_SlL_rec.Start_Date;
5776
5777 IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
5778 l_sll_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
5779 ELSE
5780 l_update_end_date := 'Y';
5781 l_sll_tbl(l_index).end_Date := OKC_TIME_UTIL_PUB.get_enddate(
5782 l_Line_SlL_rec.Start_Date,
5783 l_Line_SlL_rec.uom_code,
5784 l_Line_SlL_rec.level_periods * l_Line_SlL_rec.uom_per_period);
5785 END IF;
5786
5787
5788
5789 l_sll_tbl(l_index).level_periods := l_Line_SlL_rec.level_periods;
5790 l_sll_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
5791 l_sll_tbl(l_index).level_amount := l_Line_SlL_rec.level_amount;
5792 l_sll_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
5793 l_sll_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
5794
5795 l_index := l_index + 1;
5796 END LOOP; --sll csr end loop
5797
5798 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5799
5800 fnd_log.STRING (fnd_log.level_statement,
5801 G_MODULE_CURRENT || '.cascade_dates_sll.sll_tbl',
5802 'top line sll tbl count = ' || l_sll_tbl.count
5803 );
5804 END IF;
5805
5806 IF l_sll_tbl.COUNT = 0 THEN
5807 RETURN;
5808 END IF;
5809
5810 IF l_update_end_date = 'Y' THEN ---Migrated
5811 OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id => p_top_line_id,
5812 p_chr_id => NULL,
5813 x_return_status => x_return_status);
5814
5815 IF x_return_status <> 'S' THEN
5816 RETURN;
5817 END IF;
5818 END IF; ---chk for migrated
5819
5820
5821 -----errorout_ad('SLL found');
5822
5823
5824
5825 l_sll_tbl_index := l_sll_tbl.FIRST;
5826
5827 l_sll_start_date := TRUNC(l_sll_tbl(l_sll_tbl_index).Start_date);
5828
5829 IF TRUNC(l_sll_start_date) <> l_line_rec.line_start_dt THEN
5830
5831 ---delete lvl element at one shot as line is not billed if start dt is changing.
5832 Del_sll_lvlelement(
5833 p_top_line_id => p_top_line_id,
5834 x_return_status => x_return_status,
5835 x_msg_count => x_msg_count,
5836 x_msg_data => x_msg_data);
5837
5838 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5839 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_lvl_ele',
5840 'Del_sll_lvlelement(x_return_status = '||x_return_status
5841 ||', line passed = '|| p_top_line_id ||')');
5842 END IF;
5843
5844
5845 IF x_return_status <> 'S' THEN
5846 RAISE G_EXCEPTION_HALT_VALIDATION;
5847 END IF;
5848 END IF; ---sll start dt not same as line start dt
5849
5850 IF TRUNC(l_sll_start_date) > l_line_rec.line_start_dt THEN
5851 ---add one sll in the starting with uom code got from timeutil pub
5852
5853 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5854
5855 fnd_log.STRING (fnd_log.level_statement,
5856 G_MODULE_CURRENT || '.cascade_dates_sll.if_stat',
5857 'sll st dt > line st dt'
5858 || ', sll st dt = ' || l_sll_start_date
5859 );
5860 END IF;
5861
5862 IF l_period_start IS NOT NULL AND
5863 l_period_type IS NOT NULL AND
5864 l_period_start = 'CALENDAR'
5865 THEN
5866 -- IF(TRUNC(l_sll_start_date,'MM') = TRUNC(l_sll_start_date)) THEN
5867 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
5868 p_end_date => TRUNC(l_sll_tbl(l_sll_tbl_index).End_date),
5869 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
5870 p_period_start => l_period_start);
5871
5872 l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no;
5873 l_sll_tbl(l_sll_tbl_index).cle_id := p_top_line_id;
5874 l_sll_tbl(l_sll_tbl_index).chr_id := NULL;
5875 l_sll_tbl(l_sll_tbl_index).dnz_chr_id := l_line_rec.dnz_chr_id;
5876 l_sll_tbl(l_sll_tbl_index).sequence_no := l_sequence;
5877 l_sll_tbl(l_sll_tbl_index).start_date := l_line_rec.line_start_dt;
5878 l_sll_tbl(l_sll_tbl_index).end_date := TRUNC(l_sll_tbl(l_sll_tbl_index).End_date);
5879 l_sll_tbl(l_sll_tbl_index).level_periods := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
5880 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
5881 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
5882 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
5883 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
5884 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
5885 IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
5886 l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods + 1;
5887 END IF;
5888 l_sll_tbl(l_sll_tbl_index).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
5889 l_sll_tbl(l_sll_tbl_index).uom_code := l_sll_tbl(l_sll_tbl_index).uom_code;
5890 l_sll_tbl(l_sll_tbl_index).level_amount :=
5891 l_sll_tbl(l_sll_tbl_index).level_amount;
5892 l_sll_tbl(l_sll_tbl_index).invoice_offset_days :=
5893 l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
5894 l_sll_tbl(l_sll_tbl_index).interface_offset_days :=
5895 l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
5896
5897 -- ELSE --sll start date not first day of calendar month
5898
5899 ELSE --period start and period type are null
5900 --existing logic
5901 OKC_TIME_UTIL_PUB.get_duration(
5902 p_start_date => l_line_rec.line_start_dt,
5903 p_end_date => l_sll_start_date - 1,
5904 x_duration => l_duration,
5905 x_timeunit => l_timeunit,
5906 x_return_status => x_return_status);
5907
5908 --mchoudha bug#5076095 added to_char for the dates in the following
5909 --fnd_log statement
5910 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5911 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.sll_duration',
5912 'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
5913 ||', end date in MM/DD/YYYY HH24:MI:SS = ' || to_char(l_sll_start_date - 1,'MM/DD/YYYY HH24:MI:SS')
5914 ||', st date MM/DD/YYYY HH24:MI:SS ='|| to_char(l_line_rec.line_start_dt,'MM/DD/YYYY HH24:MI:SS')
5915 ||', returned timeunit and duration = ' ||l_duration || '-' || l_timeunit ||')');
5916 END IF;
5917
5918
5919
5920 IF x_return_status <> 'S' THEN
5921 RAISE G_EXCEPTION_HALT_VALIDATION;
5922 END IF;
5923
5924 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
5925 p_timeunit => l_timeunit,
5926 x_return_status => x_return_status,
5927 x_quantity => l_uom_quantity ,
5928 x_timeunit => l_tce_code);
5929
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.seeded',
5932 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
5933 ||', returned timeunit and qty = ' ||l_tce_code || '-' || l_uom_quantity ||')');
5934 END IF;
5935
5936 l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no - 1;
5937
5938 l_sll_tbl(0).cle_id := p_top_line_id;
5939 l_sll_tbl(0).chr_id := NULL;
5940 l_sll_tbl(0).dnz_chr_id := l_line_rec.dnz_chr_id;
5941 l_sll_tbl(0).sequence_no := l_sequence;
5942 l_sll_tbl(0).start_date := l_line_rec.line_start_dt;
5943 l_sll_tbl(0).end_date := TRUNC(l_sll_start_date) - 1;
5944
5945 IF l_tce_code = 'DAY' AND l_uom_quantity = 1 THEN
5946 l_sll_tbl(0).level_periods := 1;
5947 l_sll_tbl(0).uom_per_period := l_duration;
5948 ELSE
5949 l_sll_tbl(0).level_periods := l_duration;
5950 l_sll_tbl(0).uom_per_period := 1;
5951 END IF;
5952
5953 l_sll_tbl(0).uom_code := l_timeunit;
5954 l_sll_tbl(0).level_amount := l_sll_tbl(l_sll_tbl_index).level_amount;
5955 l_sll_tbl(0).invoice_offset_days := l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
5956 l_sll_tbl(0).interface_offset_days := l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
5957
5958
5959 END IF; --period start and period type ar not null
5960
5961 IF l_sequence < 1 then
5962
5963 l_factor := -(l_sequence - 1);
5964 l_sequence := l_sequence + l_factor;
5965
5966 FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
5967 LOOP
5968 l_sll_tbl(l_sll_tbl_index).sequence_no := l_sequence;
5969 l_sequence := l_sequence + 1;
5970 END LOOP;
5971 END IF;
5972
5973 l_next_date := l_line_rec.line_start_dt;
5974
5975 -----errorout_ad('l_sll_tbl.FIRST = ' || l_sll_tbl.FIRST);
5976
5977 FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
5978 LOOP
5979 l_sll_tbl(l_sll_tbl_index).start_date := TRUNC(l_next_date);
5980
5981 -------------------------------------------------------------------------
5982 -- Begin partial period computation logic
5983 -- Developer Mani Choudhary
5984 -- Date 08-JUN-2005
5985 -- Derive the next billing date by calling the get_enddate_cal
5986 -------------------------------------------------------------------------
5987 IF l_period_start IS NOT NULL AND
5988 l_period_type IS NOT NULL AND
5989 l_period_start = 'CALENDAR'
5990 THEN
5991 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
5992 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
5993 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
5994 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
5995 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
5996
5997 ELSE
5998 --existing logic
5999 l_next_date := OKC_TIME_UTIL_PUB.get_enddate(
6000 l_sll_tbl(l_sll_tbl_index).start_date,
6001 l_sll_tbl(l_sll_tbl_index).uom_code,
6002 (l_sll_tbl(l_sll_tbl_index).level_periods * l_sll_tbl(l_sll_tbl_index).uom_per_period));
6003 END IF;
6004 --------------------------------------------------------------------------------
6005 l_sll_tbl(l_sll_tbl_index).end_date := TRUNC(l_next_date);
6006
6007 l_next_date := l_next_date + 1;
6008 END LOOP;
6009
6010
6011 ELSIF TRUNC(l_sll_start_date) < l_line_rec.line_start_dt THEN ---LINE START DATE is pushed forward
6012
6013 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6014
6015 fnd_log.STRING (fnd_log.level_statement,
6016 G_MODULE_CURRENT || '.cascade_dates_sll.chk_sll_dt',
6017 'sll st dt < line st dt - line start date is pushed forward'
6018 || ', sll st dt = ' || l_sll_start_date
6019 );
6020 END IF;
6021
6022 l_strm_lvl_tbl_in.delete;
6023 l_sll_ind := 1;
6024 l_sll_tbl_index := l_sll_tbl.FIRST ;
6025
6026 -----errorout_ad('l_sll_start_date = '|| l_sll_start_date);
6027
6028 ----delete first sll till sll start dt >= line start dt
6029
6030 WHILE TRUNC(l_sll_start_date) < l_line_rec.line_start_dt AND l_sll_tbl.count > 0
6031 LOOP
6032
6033 ----GET END DATE FOR THE sll
6034 l_sll_tbl_index := l_sll_tbl.FIRST ;
6035
6036 l_sll_start_date := TRUNC(l_sll_tbl(l_sll_tbl_index).end_date) + 1;
6037
6038 IF TRUNC(l_sll_tbl(l_sll_tbl_index).end_date) < l_line_rec.line_start_dt THEN
6039 ---put the sll in the table for deletion
6040 -----errorout_ad('added in delete sll tbl');
6041
6042 l_strm_lvl_tbl_in(l_sll_ind).id := l_sll_tbl(l_sll_tbl_index).id;
6043 l_sll_ind := l_sll_ind + 1;
6044
6045 l_sll_tbl.DELETE(l_sll_tbl_index);
6046
6047 END IF;
6048 END LOOP; --while end loop
6049
6050 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6051
6052 fnd_log.STRING (fnd_log.level_statement,
6053 G_MODULE_CURRENT || '.cascade_dates_sll.sll_after_delete',
6054 'sll count after deleting sll where sll end date < line start date'
6055 || ', sll count = ' || l_sll_tbl.count
6056 );
6057 END IF;
6058
6059 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
6060
6061
6062 OKS_SLL_PVT.delete_row(
6063 p_api_version => l_api_version,
6064 p_init_msg_list => l_msg_list,
6065 x_return_status => x_return_status,
6066 x_msg_count => x_msg_count,
6067 x_msg_data => x_msg_data,
6068 p_sllv_tbl => l_strm_lvl_tbl_in);
6069
6070 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6071 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_sll',
6072 'oks_sll_pvt.delete_row(x_return_status = '||x_return_status
6073 ||', sll passed for delete = '|| l_strm_lvl_tbl_in.count ||')');
6074 END IF;
6075
6076
6077 IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
6078 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6079 ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
6080 RAISE OKC_API.G_EXCEPTION_ERROR;
6081 END IF;
6082 END IF;
6083
6084 IF l_sll_tbl.count > 0 then
6085
6086
6087 l_sll_tbl_index := l_sll_tbl.FIRST;
6088
6089 l_sll_start_date := l_sll_tbl(l_sll_tbl_index).start_date;
6090 -----errorout_ad('l_sll_start_date after deleting = ' || l_sll_start_date);
6091 -----errorout_ad('first sll st dt = ' || l_sll_start_date || ' and line st dt = ' || l_line_rec.line_start_dt);
6092
6093 IF l_line_rec.line_start_dt > TRUNC(l_sll_start_date) THEN
6094
6095 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6096
6097 fnd_log.STRING (fnd_log.level_statement,
6098 G_MODULE_CURRENT || '.cascade_dates_sll.after_sll_del',
6099 'after sll delete line start date > sll start date'
6100 || ', sll dt = ' || l_sll_start_date
6101 );
6102 END IF;
6103
6104
6105 l_sll_tbl_index := l_sll_tbl.FIRST ;
6106
6107 l_sll_end_date := l_sll_tbl(l_sll_tbl_index).end_date ;
6108
6109 -------------------------------------------------------------------------
6110 -- Begin partial period computation logic
6111 -- Developer Mani Choudhary
6112 -- Date 08-JUN-2005
6113 -- Modify the current SLL to have SLL start date as line start date and
6114 -- SLL end date as current end date of SLL
6115 -------------------------------------------------------------------------
6116 IF l_period_start IS NOT NULL AND
6117 l_period_type IS NOT NULL AND
6118 l_period_start = 'CALENDAR'
6119 THEN
6120 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6121 p_end_date => l_sll_end_date,
6122 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6123 p_period_start => l_period_start);
6124
6125 l_sll_tbl(l_sll_tbl_index).start_date := l_line_rec.line_start_dt;
6126 l_sll_tbl(l_sll_tbl_index).end_date := l_sll_end_date;
6127 l_sll_tbl(l_sll_tbl_index).level_periods := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
6128 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6129 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6130 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6131 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6132 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6133 IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
6134 l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods + 1;
6135 END IF;
6136
6137 ELSE --existing logic in this else block
6138 ----in migration not migrating sll end date so chk for old data
6139 IF l_sll_end_date IS NULL THEN
6140 IF l_sll_tbl_index < l_sll_tbl.LAST THEN
6141 l_sll_end_date := l_sll_tbl(l_sll_tbl_index + 1).start_date + 1;
6142
6143 ELSE
6144 l_sll_end_date := OKC_TIME_UTIL_PUB.get_enddate(
6145 l_sll_tbl(l_sll_tbl_index).start_date,
6146 l_sll_tbl(l_sll_tbl_index).uom_code,
6147 (l_sll_tbl(l_sll_tbl_index).level_periods * l_sll_tbl(l_sll_tbl_index).uom_per_period));
6148 END IF; --- chk for last sll
6149
6150 END IF; ---end of sll end date null
6151
6152 -----errorout_ad('l_sll_end_date = ' || l_sll_end_date);
6153
6154 ----find out the periods between line start date and SLL end date
6155
6156 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6157 p_timeunit => l_sll_tbl(l_sll_tbl_index).uom_code,
6158 x_return_status => x_return_status,
6159 x_quantity => l_uom_quantity ,
6160 x_timeunit => l_tce_code);
6161
6162 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6163 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.seed',
6164 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6165 ||', returned timeunit and qty = ' ||l_tce_code || '-' || l_uom_quantity ||')');
6166 END IF;
6167
6168 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
6169 RAISE G_EXCEPTION_HALT_VALIDATION;
6170 END IF;
6171 --mchoudha for bug#4860210
6172 -- IF l_tce_code = 'DAY' THEN
6173
6174 -- l_period_freq := (l_sll_end_date - l_line_rec.line_start_dt) + 1;
6175
6176 -- IF nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1) = 1 THEN
6177 -- l_sll_tbl(l_sll_tbl_index).uom_per_period := l_period_freq;
6178 -- ELSE
6179 -- l_actual_freq := nvl(l_period_freq,0)/nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1);
6180
6181 -- l_actual_freq := ceil(l_actual_freq);
6182
6183 -- l_sll_tbl(l_sll_tbl_index).level_periods := l_actual_freq;
6184
6185 -- END IF;
6186
6187 -- ELSE ----not day
6188
6189 l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6190 (p_tce_code => l_tce_code,
6191 p_fr_start_date => l_line_rec.line_start_dt,
6192 p_fr_end_date => l_sll_end_date,
6193 p_uom_quantity => l_uom_quantity,
6194 x_return_status => x_return_status);
6195
6196 IF x_return_status <> 'S' THEN
6197 RAISE G_EXCEPTION_HALT_VALIDATION;
6198 END IF;
6199 -----errorout_ad('l_period_freq = ' || l_period_freq);
6200 l_actual_freq := nvl(l_period_freq,0)/nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1);
6201
6202 -- l_actual_freq := ceil(l_period_freq);
6203 l_actual_freq := ceil(l_actual_freq);
6204 -----errorout_ad('l_actual_freq = ' || l_actual_freq);
6205 -----errorout_ad('l_sll_tbl_index of sll rec changing = ' || l_sll_tbl_index);
6206 l_sll_tbl(l_sll_tbl_index).level_periods := l_actual_freq;
6207
6208
6209 -- END IF; -------not day
6210
6211 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6212
6213 fnd_log.STRING (fnd_log.level_statement,
6214 G_MODULE_CURRENT || '.cascade_dates_sll.sll_add',
6215 'sll added after deleting sll where sll_end_dt < line_start_dt');
6216 END IF;
6217
6218 END IF; --period type and period start are not null
6219 END IF; --l_line_rec.line_start_dt > TRUNC(l_sll_start_date)
6220
6221 l_next_date := l_line_rec.line_start_dt;
6222
6223 FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
6224 LOOP
6225 l_sll_tbl(l_sll_tbl_index).start_date := TRUNC(l_next_date);
6226 -------------------------------------------------------------------------
6227 -- Begin partial period computation logic
6228 -- Developer Mani Choudhary
6229 -- Date 08-JUN-2005
6230 -- Derive the next billing date by calling the get_enddate_cal
6231 -------------------------------------------------------------------------
6232 IF l_period_start IS NOT NULL AND
6233 l_period_type IS NOT NULL AND
6234 l_period_start = 'CALENDAR'
6235 THEN
6236 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6237 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6238 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6239 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6240 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6241
6242 ELSE
6243 --Existing logic
6244 l_next_date := OKC_TIME_UTIL_PUB.get_enddate(
6245 l_sll_tbl(l_sll_tbl_index).start_date,
6246 l_sll_tbl(l_sll_tbl_index).uom_code,
6247 (l_sll_tbl(l_sll_tbl_index).uom_per_period * l_sll_tbl(l_sll_tbl_index).level_periods));
6248
6249 END IF;
6250 ---------------------------------------------------------------------------------
6251 l_sll_tbl(l_sll_tbl_index).end_date := TRUNC(l_next_date);
6252 l_next_date := l_next_date + 1;
6253 END LOOP;
6254
6255
6256
6257 ELSE ---sll tbl count = 0 after deletion
6258
6259 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6260
6261 fnd_log.STRING (fnd_log.level_statement,
6262 G_MODULE_CURRENT || '.cascade_dates_sll.sll_cnt',
6263 'sll count zero after deleting sll where sll_end_dt < line_start_dt');
6264 END IF;
6265
6266
6267
6268 OKC_TIME_UTIL_PUB.get_duration(
6269 p_start_date => l_line_rec.line_start_dt,
6270 p_end_date => l_line_rec.line_end_dt,
6271 x_duration => l_duration,
6272 x_timeunit => l_timeunit,
6273 x_return_status => x_return_status);
6274
6275 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6276 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.duration',
6277 'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
6278 ||', l_duration = '|| l_duration
6279 ||', l_timeunit = ' || l_timeunit ||')');
6280 END IF;
6281
6282 IF x_return_status <> 'S' THEN
6283 RAISE G_EXCEPTION_HALT_VALIDATION;
6284 END IF;
6285
6286 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6287 p_timeunit => l_timeunit,
6288 x_return_status => x_return_status,
6289 x_quantity => l_uom_quantity ,
6290 x_timeunit => l_tce_code);
6291
6292 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6293 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.call_seed',
6294 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6295 ||', l_uom_quantity = '|| l_uom_quantity
6296 ||', l_tce_code = ' || l_tce_code ||')');
6297 END IF;
6298
6299 -------------------------------------------------------------------------
6300 -- Begin partial period computation logic
6301 -- Developer Mani Choudhary
6302 -- Date 08-JUN-2005
6303 -- Create one SLL line start date to line end date
6304 -------------------------------------------------------------------------
6305 IF l_period_start IS NOT NULL AND
6306 l_period_type IS NOT NULL AND
6307 l_period_start = 'CALENDAR'
6308 THEN
6309 IF l_price_uom IS NULL THEN
6310 l_price_uom := l_timeunit;
6311 END IF;
6312 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6313 p_end_date => l_line_rec.line_end_dt,
6314 p_uom_code => l_price_uom,
6315 p_period_start => l_period_start);
6316
6317 l_sll_tbl(1).cle_id := p_top_line_id;
6318 l_sll_tbl(1).chr_id := NULL;
6319 l_sll_tbl(1).dnz_chr_id := l_line_rec.dnz_chr_id;
6320 l_sll_tbl(1).sequence_no := 1;
6321 l_sll_tbl(1).start_date := l_line_rec.line_start_dt;
6322 l_sll_tbl(1).end_date := l_line_rec.line_end_dt;
6323 l_sll_tbl(1).level_periods := l_level_periods;
6324 l_sll_tbl(1).uom_per_period := 1;
6325 l_sll_tbl(1).uom_code := l_price_uom;
6326 l_sll_tbl(1).level_amount := NULL;
6327 l_sll_tbl(1).invoice_offset_days := NULL;
6328 l_sll_tbl(1).interface_offset_days := NULL;
6329
6330 ELSE --existing logic in this else block
6331
6332 l_sll_tbl(1).cle_id := p_top_line_id;
6333 l_sll_tbl(1).chr_id := NULL;
6334 l_sll_tbl(1).dnz_chr_id := l_line_rec.dnz_chr_id;
6335 l_sll_tbl(1).sequence_no := 1;
6336 l_sll_tbl(1).start_date := l_line_rec.line_start_dt;
6337 l_sll_tbl(1).end_date := l_line_rec.line_end_dt;
6338
6339 IF l_tce_code = 'DAY' AND l_uom_quantity = 1 THEN
6340 l_sll_tbl(1).level_periods := 1;
6341 l_sll_tbl(1).uom_per_period := l_duration;
6342 ELSE
6343 l_sll_tbl(1).level_periods := l_duration;
6344 l_sll_tbl(1).uom_per_period := 1;
6345 END IF;
6346
6347 l_sll_tbl(1).uom_code := l_timeunit;
6348 l_sll_tbl(1).level_amount := NULL;
6349 l_sll_tbl(1).invoice_offset_days := NULL ;
6350 l_sll_tbl(1).interface_offset_days := NULL ;
6351
6352 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6353
6354 fnd_log.STRING (fnd_log.level_statement,
6355 G_MODULE_CURRENT || '.cascade_dates_sll.sll_one',
6356 'sll added count one');
6357 END IF;
6358 END IF; --period start and period type not null
6359 END IF; --sll count = 0
6360
6361 END IF;
6362
6363
6364
6365 ----find end date of last SLL
6366
6367 IF l_sll_tbl.COUNT > 0 THEN
6368
6369 l_sll_tbl_index := l_sll_tbl.LAST;
6370
6371 l_sll_start_date := l_sll_tbl(l_sll_tbl_index).start_date;
6372 l_sll_END_date := l_sll_tbl(l_sll_tbl_index).end_date;
6373 l_sll_start_date := l_sll_END_date + 1;
6374 ELSE
6375 RETURN;
6376
6377 end if;
6378
6379
6380
6381 IF TRUNC(l_sll_END_date) < l_line_rec.line_END_dt THEN ---LINE date extended
6382
6383 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6384
6385 fnd_log.STRING (fnd_log.level_statement,
6386 G_MODULE_CURRENT || '.cascade_dates_sll.chk_end_dt',
6387 'sll end dt < line_end_dt'
6388 || ', sl end dt = ' || l_sll_END_date);
6389 END IF;
6390
6391 IF l_sll_tbl.COUNT > 0 THEN
6392
6393 -------------------------------------------------------------------------
6394 -- Begin partial period computation logic
6395 -- Developer Mani Choudhary
6396 -- Date 08-JUN-2005
6397 -- Modify the current SLL to have SLL start date as line start date and
6398 -- SLL end date as current end date of SLL
6399 -------------------------------------------------------------------------
6400 IF l_period_start IS NOT NULL AND
6401 l_period_type IS NOT NULL AND
6402 l_period_start = 'CALENDAR'
6403 THEN
6404 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6405 p_end_date => l_line_rec.line_END_dt,
6406 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6407 p_period_start => l_period_start);
6408
6409 l_sll_tbl(l_sll_tbl_index).cle_id := p_top_line_id;
6410 l_sll_tbl(l_sll_tbl_index).chr_id := NULL;
6411 l_sll_tbl(l_sll_tbl_index).dnz_chr_id := l_line_rec.dnz_chr_id;
6412 l_sll_tbl(l_sll_tbl_index).sequence_no := l_sll_tbl(l_sll_tbl_index).sequence_no;
6413 l_sll_tbl(l_sll_tbl_index).start_date := l_sll_tbl(l_sll_tbl_index).start_date;
6414 l_sll_tbl(l_sll_tbl_index).end_date := l_line_rec.line_END_dt;
6415 l_sll_tbl(l_sll_tbl_index).level_periods := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
6416 l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6417 p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6418 p_uom_code => l_sll_tbl(l_sll_tbl_index).uom_code,
6419 p_duration => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6420 p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6421 IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
6422 l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods + 1;
6423 END IF;
6424 -- l_sll_tbl(l_sll_tbl_index).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6425 -- l_sll_tbl(l_sll_tbl_index).uom_code := l_price_uom;
6426 l_sll_tbl(l_sll_tbl_index).level_amount :=
6427 l_sll_tbl(l_sll_tbl_index).level_amount;
6428 l_sll_tbl(l_sll_tbl_index).invoice_offset_days :=
6429 l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
6430 l_sll_tbl(l_sll_tbl_index).interface_offset_days :=
6431 l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
6432
6433 ELSE --existing logic in this else block
6434
6435
6436 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6437 p_timeunit => l_sll_tbl(l_sll_tbl_index).uom_code,
6438 x_return_status => x_return_status,
6439 x_quantity => l_uom_quantity ,
6440 x_timeunit => l_tce_code);
6441
6442 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6443 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.st_end_seed',
6444 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6445 ||', l_uom_quantity = '|| l_uom_quantity
6446 ||', l_tce_code = ' || l_tce_code ||')');
6447 END IF;
6448
6449
6450
6451 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
6452 RAISE G_EXCEPTION_HALT_VALIDATION;
6453 END IF;
6454 --mchoudha for bug#4860210
6455 -- IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6456
6457 -- l_period_freq := (l_line_rec.line_END_dt - l_sll_start_date) + 1;
6458 -- ELSE
6459 -----errorout_ad('l_sll_start_date of new sll to be inserted = '|| l_sll_start_date);
6460
6461 l_uom_qty := nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1) * nvl(l_uom_quantity,1);
6462
6463 l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6464 (p_tce_code => l_tce_code,
6465 p_fr_start_date => l_sll_start_date,
6466 p_fr_end_date => l_line_rec.line_END_dt,
6467 p_uom_quantity => l_uom_qty,
6468 x_return_status => x_return_status);
6469
6470 IF x_return_status <> 'S' THEN
6471 RAISE G_EXCEPTION_HALT_VALIDATION;
6472 END IF;
6473
6474 l_period_freq := ceil(l_period_freq);
6475
6476
6477 -- END IF;
6478
6479 l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no + 1;
6480
6481 -----errorout_ad('l_sequence of sll inserted = ' || l_sequence);
6482 -----errorout_ad('l_sll_tbl_index at time of inserting record = ' || l_sll_tbl_index );
6483
6484 l_sll_tbl(l_sll_tbl_index + 1).sequence_no := l_sequence;
6485 l_sll_tbl(l_sll_tbl_index + 1).start_date := TRUNC(l_sll_start_date);
6486
6487
6488
6489 -- IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6490 -- l_sll_tbl(l_sll_tbl_index + 1).level_periods := '1';
6491 -- l_sll_tbl(l_sll_tbl_index + 1).uom_per_period := l_period_freq;
6492 -- l_sll_tbl(l_sll_tbl_index + 1).end_date := l_line_rec.line_end_dt;
6493 -- ELSE
6494 l_sll_tbl(l_sll_tbl_index + 1).level_periods := l_period_freq;
6495 l_sll_tbl(l_sll_tbl_index + 1).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6496
6497 l_sll_tbl(l_sll_tbl_index + 1).end_date := OKC_TIME_UTIL_PUB.get_enddate(
6498 l_sll_start_date,
6499 l_sll_tbl(l_sll_tbl_index).uom_code,
6500 l_period_freq * l_sll_tbl(l_sll_tbl_index).uom_per_period);
6501
6502 -- END IF;
6503
6504 l_sll_tbl(l_sll_tbl_index + 1).uom_code := l_sll_tbl(l_sll_tbl_index).uom_code;
6505 l_sll_tbl(l_sll_tbl_index + 1).invoice_offset_days := l_sll_tbl(l_sll_tbl_index).invoice_offset_days;
6506 l_sll_tbl(l_sll_tbl_index + 1).interface_offset_days := l_sll_tbl(l_sll_tbl_index).interface_offset_days;
6507 l_sll_tbl(l_sll_tbl_index + 1).level_amount := l_sll_tbl(l_sll_tbl_index).level_amount;
6508 l_sll_tbl(l_sll_tbl_index + 1).cle_id := l_sll_tbl(l_sll_tbl_index ).cle_id ;
6509 l_sll_tbl(l_sll_tbl_index + 1).chr_id := l_sll_tbl(l_sll_tbl_index ).chr_id ;
6510 l_sll_tbl(l_sll_tbl_index + 1).dnz_chr_id := l_sll_tbl(l_sll_tbl_index ).dnz_chr_id;
6511
6512 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6513
6514 fnd_log.STRING (fnd_log.level_statement,
6515 G_MODULE_CURRENT || '.cascade_dates_sll.all_sll_end',
6516 'added sll when sll end dt < line_end_dt');
6517 END IF;
6518
6519 END IF; --period start and period type are not null
6520 ELSE ---sll tbl count = 0
6521
6522
6523 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6524
6525 fnd_log.STRING (fnd_log.level_statement,
6526 G_MODULE_CURRENT || '.cascade_dates_sll.sll_zero',
6527 'sll count zero');
6528 END IF;
6529
6530
6531 OKC_TIME_UTIL_PUB.get_duration(
6532 p_start_date => l_line_rec.line_start_dt,
6533 p_end_date => l_line_rec.line_end_dt,
6534 x_duration => l_duration,
6535 x_timeunit => l_timeunit,
6536 x_return_status => x_return_status);
6537
6538 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6539 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.sll_duration',
6540 'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
6541 ||', l_duration = '|| l_duration
6542 ||', l_timeunit = ' || l_timeunit ||')');
6543 END IF;
6544
6545
6546 IF x_return_status <> 'S' THEN
6547 RAISE G_EXCEPTION_HALT_VALIDATION;
6548 END IF;
6549
6550 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6551 p_timeunit => l_timeunit,
6552 x_return_status => x_return_status,
6553 x_quantity => l_uom_quantity ,
6554 x_timeunit => l_tce_code);
6555
6556 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6557 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.end_seed',
6558 'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6559 ||', l_uom_quantity = '|| l_uom_quantity
6560 ||', l_tce_code = ' || l_tce_code ||')');
6561 END IF;
6562
6563 -------------------------------------------------------------------------
6564 -- Begin partial period computation logic
6565 -- Developer Mani Choudhary
6566 -- Date 08-JUN-2005
6567 -- Create one SLL line start date to line end date
6568 -------------------------------------------------------------------------
6569 IF l_period_start IS NOT NULL AND
6570 l_period_type IS NOT NULL AND
6571 l_period_start = 'CALENDAR'
6572 THEN
6573 IF l_price_uom IS NULL THEN
6574 l_price_uom := l_timeunit;
6575 END IF;
6576 l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6577 p_end_date => l_line_rec.line_end_dt,
6578 p_uom_code => l_price_uom,
6579 p_period_start => l_period_start);
6580
6581 l_sll_tbl(1).cle_id := p_top_line_id;
6582 l_sll_tbl(1).chr_id := NULL;
6583 l_sll_tbl(1).dnz_chr_id := l_line_rec.dnz_chr_id;
6584 l_sll_tbl(1).sequence_no := 1;
6585 l_sll_tbl(1).start_date := l_line_rec.line_start_dt;
6586 l_sll_tbl(1).end_date := l_line_rec.line_end_dt;
6587 l_sll_tbl(1).level_periods := l_level_periods;
6588 l_sll_tbl(1).uom_per_period := 1;
6589 l_sll_tbl(1).uom_code := l_price_uom;
6590 l_sll_tbl(1).level_amount := NULL;
6591 l_sll_tbl(1).invoice_offset_days := NULL;
6592 l_sll_tbl(1).interface_offset_days := NULL;
6593
6594 ELSE --existing logic in this else block
6595
6596
6597 l_sequence := 1;
6598 l_sll_tbl_index := 0;
6599
6600
6601 l_sll_tbl(l_sll_tbl_index).sequence_no := l_sequence;
6602 l_sll_tbl(l_sll_tbl_index).start_date := l_line_rec.line_start_dt;
6603 l_sll_tbl(l_sll_tbl_index).end_date := l_line_rec.line_end_dt;
6604
6605
6606
6607 IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6608 l_sll_tbl(l_sll_tbl_index ).level_periods := '1';
6609 l_sll_tbl(l_sll_tbl_index ).uom_per_period := l_period_freq;
6610
6611 ELSE
6612 l_sll_tbl(l_sll_tbl_index ).level_periods := l_period_freq;
6613 l_sll_tbl(l_sll_tbl_index ).uom_per_period := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6614
6615
6616 END IF;
6617
6618 l_sll_tbl(l_sll_tbl_index).uom_code := l_timeunit;
6619 l_sll_tbl(l_sll_tbl_index).cle_id := l_line_rec.id ;
6620 l_sll_tbl(l_sll_tbl_index).chr_id := null;
6621 l_sll_tbl(l_sll_tbl_index).dnz_chr_id := l_line_rec.dnz_chr_id;
6622
6623 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6624
6625 fnd_log.STRING (fnd_log.level_statement,
6626 G_MODULE_CURRENT || '.cascade_dates_sll.sll_one_end',
6627 'sll added count one');
6628 END IF;
6629
6630 END IF; --period start and period type are not null
6631 END IF; -----sll tbl count
6632
6633
6634 --no changes for partial period calendar in this case
6635 ELSIF TRUNC(l_sll_END_date) > l_line_rec.line_END_dt THEN ---LINE END DATE SHRINKED.
6636
6637 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6638
6639 fnd_log.STRING (fnd_log.level_statement,
6640 G_MODULE_CURRENT || '.cascade_dates_sll.chk_end_dt',
6641 'sll end dt > line end dt'
6642 ||', sll end dt = ' || l_sll_END_date );
6643 END IF;
6644
6645 IF l_sll_tbl.count = 0 then
6646 RETURN;
6647 END IF;
6648
6649 l_sll_tbl_index := l_sll_tbl.LAST;
6650 l_sll_start_date := l_sll_tbl(l_sll_tbl_index ).start_date;
6651
6652 l_strm_lvl_tbl_in.DELETE;
6653 l_sll_ind := 1;
6654
6655 WHILE l_line_rec.line_END_dt < TRUNC(l_sll_start_date) AND l_sll_tbl.COUNT > 0
6656 LOOP
6657
6658 l_strm_lvl_tbl_in(l_sll_ind).id := l_sll_tbl(l_sll_tbl_index).id;
6659 l_sll_ind := l_sll_ind + 1;
6660
6661 l_sll_tbl.DELETE(l_sll_tbl_index);
6662
6663 l_sll_tbl_index := l_sll_tbl.LAST;
6664 l_sll_start_date := l_sll_tbl(l_sll_tbl_index ).start_date;
6665 END LOOP;
6666
6667 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
6668 FOR l_sll_ind IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
6669 LOOP
6670
6671 OKS_BILL_UTIL_PUB.delete_level_elements (
6672 p_api_version => l_api_version,
6673 p_rule_id => l_strm_lvl_tbl_in(l_sll_ind).id,
6674 p_init_msg_list => l_msg_list,
6675 x_msg_count => x_msg_count,
6676 x_msg_data => x_msg_data,
6677 x_return_status => x_return_status );
6678
6679 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6680 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_last_sll',
6681 'oks_bill_util_pub.delete_level_elements(x_return_status = '||x_return_status
6682 ||', sll id passed = '|| l_strm_lvl_tbl_in(l_sll_ind).id ||')');
6683 END IF;
6684
6685
6686
6687 END LOOP;
6688 IF x_return_status <> 'S' THEN
6689 RAISE G_EXCEPTION_HALT_VALIDATION;
6690 END IF;
6691
6692 END IF;
6693 END IF;
6694
6695 IF l_sll_tbl.COUNT > 0 THEN
6696
6697 OKS_BILL_SCH.Create_Bill_Sch_Rules
6698 (p_billing_type => l_line_csr_rec.billing_schedule_type,
6699 p_sll_tbl => l_sll_tbl,
6700 p_invoice_rule_id => l_line_csr_rec.inv_id,
6701 x_bil_sch_out_tbl => l_bil_sch_out_tbl,
6702 x_return_status => x_return_status);
6703
6704 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6705 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.call_bs',
6706 'oks_bill_sch.Create_Bill_Sch_Rules(x_return_status = '||x_return_status ||')');
6707 END IF;
6708
6709 IF x_return_status <> 'S' THEN
6710 RAISE G_EXCEPTION_HALT_VALIDATION;
6711 END IF;
6712 END IF;
6713
6714
6715
6716 EXCEPTION
6717 WHEN G_EXCEPTION_HALT_VALIDATION THEN
6718
6719 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
6720 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_dates_sll.EXCEPTION',
6721 'G_EXCEPTION_HALT_VALIDATION');
6722 END IF;
6723
6724 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
6725 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6726 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
6727 RAISE OKC_API.G_EXCEPTION_ERROR;
6728 END IF;
6729 WHEN OTHERS THEN
6730
6731 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
6732 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_dates_sll.UNEXPECTED',
6733 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
6734 END IF;
6735
6736 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
6737 p_msg_name => G_UNEXPECTED_ERROR,
6738 p_token1 => G_SQLCODE_TOKEN,
6739 p_token1_value => sqlcode,
6740 p_token2 => G_SQLERRM_TOKEN,
6741 p_token2_value => sqlerrm);
6742
6743 x_return_status := G_RET_STS_UNEXP_ERROR;
6744
6745 END Cascade_Dates_SLL;
6746
6747
6748
6749
6750 PROCEDURE Del_sll_lvlelement(p_top_line_id IN NUMBER,
6751 x_return_status OUT NOCOPY VARCHAR2,
6752 x_msg_count OUT NOCOPY NUMBER,
6753 x_msg_data OUT NOCOPY VARCHAR2)
6754
6755 IS
6756 ----will delete all lvlelements for top and cp
6757 ---and delete sll of all cp.
6758
6759
6760 BEGIN
6761 x_return_status := 'S';
6762
6763
6764 ----delete lvl elements for cp
6765 DELETE FROM OKS_LEVEL_ELEMENTS
6766 WHERE cle_id IN (SELECT id
6767 FROM OKC_K_LINES_B cp
6768 WHERE cp.cle_id = p_top_line_id
6769 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
6770
6771
6772
6773 --------delete lvl elemets for top line
6774 DELETE FROM OKS_LEVEL_ELEMENTS
6775 WHERE cle_id = p_top_line_id;
6776
6777
6778 ---delete sll of all cp
6779
6780 DELETE FROM OKS_STREAM_LEVELS_B
6781 WHERE cle_id IN ( select id
6782 FROM okc_k_lines_b cp
6783 WHERE cp.cle_id = p_top_line_id
6784 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
6785
6786
6787
6788 EXCEPTION
6789 WHEN OTHERS THEN
6790
6791 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
6792 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.del_sll_lvlelement.UNEXPECTED',
6793 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
6794 END IF;
6795 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
6796 p_msg_name => G_UNEXPECTED_ERROR,
6797 p_token1 => G_SQLCODE_TOKEN,
6798 p_token1_value => sqlcode,
6799 p_token2 => G_SQLERRM_TOKEN,
6800 p_token2_value => sqlerrm);
6801
6802 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
6803
6804 END Del_sll_lvlelement;
6805
6806
6807 PROCEDURE Adjust_top_BS_Amt(
6808 p_Line_Rec IN Line_Det_Type,
6809 p_SubLine_rec IN Prod_Det_Type,
6810 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
6811 x_return_status OUT NOCOPY VARCHAR2)
6812 IS
6813
6814 CURSOR l_cp_BS_csr(p_cp_id NUMBER) IS
6815 SELECT id, trunc(date_start) date_start,
6816 amount, trunc(date_end) date_end
6817 FROM oks_level_elements element
6818 WHERE cle_id = p_cp_id
6819 ORDER by date_start;
6820
6821 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
6822 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
6823 l_index number;
6824 l_top_bs_ind number;
6825 l_cp_bs_ind number;
6826
6827
6828 BEGIN
6829 x_return_status := OKC_API.G_RET_STS_SUCCESS;
6830
6831 l_cp_bs_tbl.DELETE;
6832 l_index := 1;
6833
6834 FOR l_cp_BS_rec IN l_cp_BS_csr(p_SubLine_rec.cp_id)
6835 LOOP
6836 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
6837 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
6838 l_cp_bs_tbl(l_index).date_end := l_cp_BS_rec.date_end;
6839 l_cp_bs_tbl(l_index).Amount := l_cp_BS_rec.amount;
6840
6841 l_index := l_index + 1;
6842 END LOOP;
6843
6844 IF l_cp_bs_tbl.COUNT <= 0 THEN
6845 RETURN;
6846 END IF;
6847
6848 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
6849 l_top_bs_ind := p_top_line_bs.FIRST;
6850 -----errorout_ad('top line bs first = ' || l_top_bs_ind);
6851
6852 WHILE TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) > TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) AND
6853 l_top_bs_ind < p_top_line_bs.LAST
6854 LOOP
6855 l_top_bs_ind := p_top_line_bs.NEXT(l_top_bs_ind);
6856 END LOOP;
6857
6858 -----errorout_ad('after while loop in adj = ' || l_top_bs_ind);
6859 ---chk first cp bs.st_dt if between previous and present record
6860
6861
6862 IF l_top_bs_ind = p_top_line_bs.first THEN
6863 NULL;
6864
6865 ELSIF l_top_bs_ind <= p_top_line_bs.LAST THEN
6866
6867 l_top_bs_ind := l_top_bs_ind - 1;
6868 IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= p_top_line_bs(l_top_bs_ind ).DATE_START
6869 AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= p_top_line_bs(l_top_bs_ind ).DATE_end THEN
6870
6871 NULL;
6872 ELSE
6873 l_top_bs_ind := l_top_bs_ind + 1;
6874 END IF;
6875
6876 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) THEN
6877 NULL;
6878
6879 end if;
6880
6881
6882 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
6883 LOOP
6884
6885 IF l_top_bs_ind <= p_top_line_bs.LAST THEN
6886
6887 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);
6888 l_top_bs_ind := l_top_bs_ind + 1;
6889
6890 END IF;
6891 END LOOP;
6892
6893
6894 EXCEPTION
6895 WHEN G_EXCEPTION_HALT_VALIDATION THEN
6896 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
6897 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_top_bs_amt.EXCEPTION',
6898 'G_EXCEPTION_HALT_VALIDATION');
6899 END IF;
6900
6901 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
6902 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6903 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
6904 RAISE OKC_API.G_EXCEPTION_ERROR;
6905 END IF;
6906 WHEN OTHERS THEN
6907
6908 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
6909 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_top_bs_amt.UNEXPECTED',
6910 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
6911 END IF;
6912
6913 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
6914 p_msg_name => G_UNEXPECTED_ERROR,
6915 p_token1 => G_SQLCODE_TOKEN,
6916 p_token1_value => sqlcode,
6917 p_token2 => G_SQLERRM_TOKEN,
6918 p_token2_value => sqlerrm);
6919
6920 x_return_status := G_RET_STS_UNEXP_ERROR;
6921
6922 end Adjust_top_BS_Amt;
6923
6924
6925
6926 Procedure Update_OM_SLL_Date
6927 (
6928 p_top_line_id IN NUMBER,
6929 x_return_status OUT NOCOPY Varchar2,
6930 x_msg_count OUT NOCOPY NUMBER,
6931 x_msg_data OUT NOCOPY VARCHAR2)
6932 IS
6933
6934 CURSOR l_line_sll_csr IS
6935 SELECT id, cle_id, chr_id, dnz_chr_id , uom_code,
6936 sequence_no, Start_Date, end_Date, level_periods,
6937 uom_per_period, level_amount, invoice_offset_days, interface_offset_days
6938 FROM OKs_stream_levels_b
6939 WHERE cle_id = p_top_line_id
6940 ORDER BY sequence_no;
6941
6942
6943 Cursor l_Line_Csr Is
6944 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
6945 TRUNC(line.start_date) start_dt,line.inv_rule_id inv_rule_id,
6946 nvl(trunc(line.date_terminated - 1),TRUNC(line.end_date)) end_dt,
6947 nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
6948 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
6949 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
6950 FROM okc_k_lines_b line, oks_k_lines_b dtl
6951 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id ;
6952
6953
6954
6955
6956 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
6957 L_BIL_SCH_OUT_TBL OKS_BILL_SCH.ItemBillSch_tbl;
6958 l_inv_id number;
6959
6960 l_Line_Sll_rec l_Line_Sll_Csr%ROWTYPE;
6961 l_Line_Rec l_Line_Csr%Rowtype;
6962
6963
6964 l_index NUMBER;
6965 l_sll_tbl_index NUMBER;
6966 l_timeunit VARCHAR2(20);
6967 l_duration NUMBER;
6968 L_UOM_QUANTITY number;
6969 l_tce_code VARCHAR2(100);
6970
6971 l_msg_list VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
6972
6973
6974
6975 BEGIN
6976
6977 x_return_status := OKC_API.G_RET_STS_SUCCESS;
6978
6979 ---get line details
6980 Open l_Line_Csr;
6981 Fetch l_Line_Csr Into l_Line_Rec;
6982
6983 If l_Line_Csr%Notfound then
6984 Close l_Line_Csr;
6985 x_return_status := 'E';
6986 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
6987 RAISE G_EXCEPTION_HALT_VALIDATION;
6988 End If;
6989 Close l_Line_Csr;
6990
6991
6992 IF l_line_rec.billing_schedule_type <> 'T' then
6993 RETURN;
6994 END IF;
6995
6996 ----make sll tbl
6997
6998 l_index := 1;
6999 l_sll_tbl.DELETE;
7000
7001 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
7002 LOOP
7003 l_sll_tbl(l_index).id := l_Line_SlL_rec.id;
7004 l_sll_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
7005 l_sll_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
7006 l_sll_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
7007 l_sll_tbl(l_index).uom_code := l_Line_SlL_rec.uom_code;
7008 l_sll_tbl(l_index).sequence_no := l_Line_SlL_rec.sequence_no;
7009 l_sll_tbl(l_index).Start_Date := l_Line_SlL_rec.Start_Date;
7010 l_sll_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
7011 l_sll_tbl(l_index).level_periods := l_Line_SlL_rec.level_periods;
7012 l_sll_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
7013 l_sll_tbl(l_index).level_amount := l_Line_SlL_rec.level_amount;
7014 l_sll_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
7015 l_sll_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
7016
7017 l_index := l_index + 1;
7018 END LOOP;
7019
7020
7021 IF l_sll_tbl.COUNT = 0 THEN
7022 x_return_status := 'E';
7023 OKC_API.SET_MESSAGE (
7024 p_app_name => G_PKG_NAME,
7025 p_msg_name => 'OKS_SLL_NOT_EXISTS');
7026
7027 RAISE G_EXCEPTION_HALT_VALIDATION;
7028 END IF;
7029
7030
7031 -----errorout_ad('SLL found');
7032
7033
7034
7035
7036 l_sll_tbl_index := l_sll_tbl.FIRST;
7037
7038 Del_sll_lvlelement(
7039 p_top_line_id => p_top_line_id,
7040 x_return_status => x_return_status,
7041 x_msg_count => x_msg_count,
7042 x_msg_data => x_msg_data);
7043
7044 IF x_return_status <> 'S' THEN
7045 RAISE G_EXCEPTION_HALT_VALIDATION;
7046 END IF;
7047
7048 OKC_TIME_UTIL_PUB.get_duration(
7049 p_start_date => l_line_rec.start_dt,
7050 p_end_date => l_line_rec.end_dt,
7051 x_duration => l_duration,
7052 x_timeunit => l_timeunit,
7053 x_return_status => x_return_status);
7054
7055
7056 IF x_return_status <> 'S' THEN
7057 RAISE G_EXCEPTION_HALT_VALIDATION;
7058 END IF;
7059
7060 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
7061 p_timeunit => l_timeunit,
7062 x_return_status => x_return_status,
7063 x_quantity => l_uom_quantity ,
7064 x_timeunit => l_tce_code);
7065
7066 l_sll_tbl(l_sll_tbl_index).start_date := l_line_rec.start_dt;
7067 l_sll_tbl(l_sll_tbl_index).end_date := l_line_rec.end_dt;
7068 l_sll_tbl(l_sll_tbl_index).level_periods := '1';
7069 l_sll_tbl(l_sll_tbl_index).uom_per_period := l_duration;
7070 l_sll_tbl(l_sll_tbl_index).uom_code := l_timeunit;
7071
7072
7073
7074
7075 IF l_sll_tbl.COUNT > 0 THEN
7076
7077 OKS_BILL_SCH.Create_Bill_Sch_Rules
7078 (p_billing_type => l_line_rec.billing_schedule_type,
7079 p_sll_tbl => l_sll_tbl,
7080 p_invoice_rule_id => l_line_rec.inv_rule_id,
7081 x_bil_sch_out_tbl => l_bil_sch_out_tbl,
7082 x_return_status => x_return_status);
7083
7084 IF x_return_status <> 'S' THEN
7085 RAISE G_EXCEPTION_HALT_VALIDATION;
7086 END IF;
7087 END IF;
7088
7089
7090
7091 EXCEPTION
7092 WHEN G_EXCEPTION_HALT_VALIDATION THEN
7093 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
7094 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.update_om_sll_date.EXCEPTION',
7095 'G_EXCEPTION_HALT_VALIDATION');
7096 END IF;
7097
7098 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
7099 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7100 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
7101 RAISE OKC_API.G_EXCEPTION_ERROR;
7102 END IF;
7103 WHEN OTHERS THEN
7104 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7105 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.update_om_sll_date.UNEXPECTED',
7106 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7107 END IF;
7108
7109 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7110 p_msg_name => G_UNEXPECTED_ERROR,
7111 p_token1 => G_SQLCODE_TOKEN,
7112 p_token1_value => sqlcode,
7113 p_token2 => G_SQLERRM_TOKEN,
7114 p_token2_value => sqlerrm);
7115
7116 x_return_status := G_RET_STS_UNEXP_ERROR;
7117
7118 END Update_OM_SLL_Date;
7119
7120 PROCEDURE Del_rul_elements(p_top_line_id IN NUMBER,
7121 x_return_status OUT NOCOPY VARCHAR2,
7122 x_msg_count OUT NOCOPY NUMBER,
7123 x_msg_data OUT NOCOPY VARCHAR2)
7124
7125 IS
7126
7127
7128 ----will delete all lvlelements for top and cp
7129 ---and delete sll of top line and all cp.
7130 ---make billing schedule type null for all cp.
7131
7132
7133
7134 BEGIN
7135 x_return_status := 'S';
7136
7137
7138 ----delete lvl elements for cp
7139 DELETE FROM OKS_LEVEL_ELEMENTS
7140 WHERE cle_id IN (SELECT cp.id
7141 FROM OKC_k_LINES_B cp
7142 WHERE cp.cle_id = p_top_line_id
7143 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7144
7145
7146 --------delete lvl elemets for top line
7147 DELETE FROM OKS_LEVEL_ELEMENTS
7148 WHERE cle_id = p_top_line_id;
7149
7150
7151 ---delete sll of cp
7152
7153 delete FROM OKS_STREAM_LEVELS_B
7154 WHERE cle_id IN (SELECT id
7155 FROM OKC_k_LINES_B cp
7156 WHERE cp.cle_id = p_top_line_id
7157 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7158
7159 --DELETE sll of top line
7160
7161 delete FROM OKS_STREAM_LEVELS_B
7162 WHERE cle_id = p_top_line_id;
7163
7164 --update billing type to null for cp
7165 UPDATE oks_k_lines_b
7166 set billing_schedule_type = NULL
7167 WHERE cle_id IN (SELECT id
7168 FROM OKC_k_LINES_B cp
7169 WHERE cp.cle_id = p_top_line_id
7170 and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7171
7172
7173
7174 EXCEPTION
7175 WHEN OTHERS THEN
7176 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7177 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.del_rul_elements.UNEXPECTED',
7178 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7179 END IF;
7180
7181 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7182 p_msg_name => G_UNEXPECTED_ERROR,
7183 p_token1 => G_SQLCODE_TOKEN,
7184 p_token1_value => sqlcode,
7185 p_token2 => G_SQLERRM_TOKEN,
7186 p_token2_value => sqlerrm);
7187
7188 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7189
7190
7191 END Del_rul_elements;
7192
7193
7194 ---delete sll of subline and refresh the lvl amt of top line for 'Top Level' billing
7195 PROCEDURE Del_subline_lvl_rule(p_top_line_id IN NUMBER,
7196 p_sub_line_id IN NUMBER,
7197 x_return_status OUT NOCOPY VARCHAR2,
7198 x_msg_count OUT NOCOPY NUMBER,
7199 x_msg_data OUT NOCOPY VARCHAR2)
7200 IS
7201 ----will delete all lvlelements for cp
7202 ---and delete sll of cp.
7203 --update amount of lvl element of top line
7204 --UPDATE billing type of subline to null.
7205
7206 CURSOR l_line_BS_csr IS
7207 SELECT id, trunc(date_start) date_start,
7208 amount, TRUNC(DATE_end) date_end, object_version_number
7209 FROM oks_level_elements
7210 WHERE cle_id = p_top_line_id
7211 ORDER BY date_start;
7212
7213 CURSOR l_cp_BS_csr IS
7214 SELECT id, trunc(date_start) date_start,
7215 amount
7216 FROM oks_level_elements
7217 WHERE cle_id = p_sub_line_id
7218 ORDER BY date_start;
7219
7220
7221
7222
7223 CURSOR l_bill_type_csr IS
7224 SELECT nvl(billing_schedule_type,'T') billing_schedule_type
7225 FROM oks_k_lines_b
7226 WHERE cle_id = p_sub_line_id;
7227
7228
7229
7230
7231 l_line_BS_rec l_line_BS_csr%ROWTYPE;
7232 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
7233 l_bill_type_rec l_bill_type_csr%ROWTYPE;
7234
7235
7236
7237 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7238 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7239 x_letv_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7240
7241
7242 i NUMBER := 0;
7243 l_index NUMBER := 0;
7244 l_cp_bs_ind NUMBER;
7245 l_top_bs_ind NUMBER;
7246
7247 l_api_Version Number := 1;
7248 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
7249 l_msg_list VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
7250 l_msg_count Number;
7251 l_msg_data Varchar2(2000) := NULL;
7252
7253 BEGIN
7254 x_return_status := 'S';
7255
7256 ---get bill type details
7257 Open l_bill_type_Csr;
7258 Fetch l_bill_type_Csr Into l_bill_type_Rec;
7259
7260 If l_bill_type_csr%Notfound then
7261 Close l_bill_type_Csr;
7262 x_return_status := 'E';
7263 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'BILLING SCHEDULE TYPE NOT FOUND.');
7264 RAISE G_EXCEPTION_HALT_VALIDATION;
7265 End If;
7266 Close l_bill_type_Csr;
7267
7268 IF l_bill_type_rec.billing_schedule_type = 'T' then
7269
7270 l_index := 0;
7271 l_top_bs_tbl.DELETE;
7272 FOR l_line_BS_rec IN l_line_BS_csr
7273 LOOP
7274 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
7275 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
7276 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
7277 l_top_bs_tbl(l_index).date_end := l_line_BS_rec.date_end;
7278 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
7279
7280 l_index := l_index + 1;
7281 END LOOP;
7282
7283 l_index := 0;
7284 l_cp_bs_tbl.DELETE;
7285 FOR l_cp_BS_rec IN l_cp_BS_csr
7286 LOOP
7287 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
7288 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
7289 l_cp_bs_tbl(l_index).Amount := l_cp_BS_rec.amount;
7290
7291 l_index := l_index + 1;
7292 END LOOP;
7293
7294 IF l_cp_bs_tbl.COUNT > 0 THEN
7295
7296
7297 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
7298 l_top_bs_ind := l_top_bs_tbl.FIRST;
7299
7300 WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > l_top_bs_tbl(l_top_bs_ind).DATE_START
7301 AND l_top_bs_ind < l_top_bs_tbl.LAST
7302 LOOP
7303 l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
7304 END LOOP;
7305
7306
7307
7308
7309 IF l_top_bs_ind = l_top_bs_tbl.first THEN
7310 NULL;
7311
7312 ELSIF l_top_bs_ind <= l_top_bs_tbl.LAST THEN
7313
7314 l_top_bs_ind := l_top_bs_ind - 1;
7315
7316 IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= l_top_bs_tbl(l_top_bs_ind ).DATE_START
7317 AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= l_top_bs_tbl(l_top_bs_ind ).DATE_end THEN
7318
7319 NULL;
7320 ELSE
7321 l_top_bs_ind := l_top_bs_ind + 1;
7322 END IF;
7323
7324 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(l_top_bs_tbl(l_top_bs_ind).DATE_START) THEN
7325 NULL;
7326
7327 end if;
7328
7329
7330
7331
7332 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
7333 LOOP
7334
7335 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);
7336 l_top_bs_ind := l_top_bs_ind + 1;
7337 END LOOP;
7338
7339 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
7340 p_api_version => l_api_version,
7341 p_init_msg_list => l_init_msg_list,
7342 x_return_status => x_return_status,
7343 x_msg_count => l_msg_count,
7344 x_msg_data => l_msg_data,
7345 p_letv_tbl => l_top_bs_tbl,
7346 x_letv_tbl => l_lvl_ele_tbl_out);
7347
7348 IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
7349 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7350 ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
7351 RAISE OKC_API.G_EXCEPTION_ERROR;
7352 END IF;
7353
7354 END IF; ---l_cp_bs_tbl.COUNT > 0
7355
7356
7357 END IF; ---l_bill_type = 'T'
7358
7359
7360 ----delete lvl elements for cp
7361 DELETE FROM OKS_LEVEL_ELEMENTS
7362 WHERE cle_id = p_sub_line_id;
7363
7364
7365 ----Delete sll of cp
7366
7367 Delete oks_stream_levels_b
7368 where cle_id = p_sub_line_id;
7369
7370
7371
7372
7373
7374 EXCEPTION
7375 WHEN OTHERS THEN
7376 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7377 p_msg_name => G_UNEXPECTED_ERROR,
7378 p_token1 => G_SQLCODE_TOKEN,
7379 p_token1_value => sqlcode,
7380 p_token2 => G_SQLERRM_TOKEN,
7381 p_token2_value => sqlerrm);
7382
7383 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7384 END Del_subline_lvl_rule;
7385
7386
7387
7388
7389 PROCEDURE update_bs_interface_date(p_top_line_id IN NUMBER,
7390 p_invoice_rule_id IN Number,
7391 x_return_status OUT NOCOPY VARCHAR2,
7392 x_msg_count OUT NOCOPY NUMBER,
7393 x_msg_data OUT NOCOPY VARCHAR2)
7394
7395 IS
7396
7397 CURSOR l_line_csr IS
7398 SELECT ln.id id, ln.lse_id lse_id, nvl(TRUNC(ln.date_terminated -1),ln.end_date) line_end_date,
7399 dtl.usage_type usage_type, dtl.billing_schedule_type billing_schedule_type
7400 FROM okc_k_lines_b ln, oks_k_lines_b dtl
7401 WHERE ln.id = p_top_line_id
7402 AND dtl.cle_id = ln.id;
7403
7404
7405 Cursor l_subLine_Csr Is
7406 SELECT id ,nvl(TRUNC(date_terminated -1),end_date) cp_end_date, lse_id
7407 FROM okc_k_lines_b
7408 WHERE cle_id = p_top_line_id and lse_id in (35,7,8,9,10,11,13,18,25);
7409
7410 CURSOR l_Line_BS_csr IS
7411 SELECT id, trunc(date_start) date_start,
7412 date_to_interface, date_transaction, date_end
7413 FROM oks_level_elements
7414 WHERE cle_id = p_top_line_id
7415 AND date_completed IS NOT NULL
7416 ORDER BY date_start;
7417
7418
7419
7420 l_subLine_rec l_subLine_Csr%ROWTYPE;
7421 l_index NUMBER := 0;
7422 l_update_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7423 l_lvl_index NUMBER := 0;
7424 l_line_rec l_line_csr%ROWTYPE;
7425
7426 l_cp_line_bs oks_bill_level_elements_pvt.letv_tbl_type;
7427 l_line_tbl_in oks_bill_level_elements_pvt.letv_tbl_type;
7428 l_top_index NUMBER := 0;
7429
7430
7431 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
7432
7433 BEGIN
7434
7435 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7436
7437 IF p_invoice_rule_id IS NULL THEN
7438 -- nechatur 23-DEC-2005 for bug#4684706
7439 -- OKC_API.set_message(G_PKG_NAME,'OKS_INVD_COV_RULE','RULE_NAME','IRE');
7440 OKC_API.set_message(G_PKG_NAME,'OKS_INVOICING_RULE');
7441 -- end bug#4684706
7442 x_return_status := 'E';
7443 RAISE G_EXCEPTION_HALT_VALIDATION;
7444 END IF;
7445
7446 OPEN l_line_csr;
7447 FETCH l_line_csr Into l_line_rec;
7448
7449 If l_line_csr%NOTFOUND THEN
7450 CLOSE l_line_csr;
7451 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
7452 x_return_status := G_RET_STS_UNEXP_ERROR;
7453 RETURN;
7454 ELSE
7455 Close l_line_csr;
7456 END IF;
7457
7458 IF l_line_rec.lse_id = 12 AND NVL(l_line_rec.usage_type,1) IN ('VRT','QTY') THEN ---A/P OR A/Q
7459 RETURN;
7460 END IF;
7461
7462 l_lvl_ele_tbl_in.DELETE;
7463
7464 Adjust_interface_date(p_line_id => p_top_line_id,
7465 p_invoice_rule_id => p_invoice_rule_id,
7466 p_line_end_date => l_line_rec.line_end_date,
7467 p_lse_id => l_line_rec.lse_id,
7468 x_bs_tbl => l_update_bs_tbl,
7469 x_return_status => x_return_status,
7470 x_msg_count => x_msg_count,
7471 x_msg_data => x_msg_data);
7472
7473 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7474 RAISE G_EXCEPTION_HALT_VALIDATION;
7475 END IF;
7476
7477 IF l_update_bs_tbl.COUNT <= 0 THEN
7478 RETURN;
7479 END IF;
7480
7481 FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7482 LOOP
7483
7484 l_lvl_ele_tbl_in(l_lvl_index).id := l_update_bs_tbl(l_index).id;
7485 l_lvl_ele_tbl_in(l_lvl_index).date_start := l_update_bs_tbl(l_index).date_start;
7486 l_lvl_ele_tbl_in(l_lvl_index).date_to_interface := l_update_bs_tbl(l_index).date_to_interface;
7487 l_lvl_ele_tbl_in(l_lvl_index).object_version_number := l_update_bs_tbl(l_index).object_version_number;
7488 l_lvl_ele_tbl_in(l_lvl_index).date_to_interface := l_update_bs_tbl(l_index).date_to_interface;
7489 l_lvl_ele_tbl_in(l_lvl_index).date_transaction := l_update_bs_tbl(l_index).date_transaction;
7490
7491
7492 l_lvl_index := l_lvl_index + 1;
7493 END LOOP;
7494
7495 IF l_line_rec.billing_schedule_type = 'P' THEN
7496 ----Find subline and update interface date of sublines level elements
7497
7498 For l_subLine_rec IN l_subLine_csr
7499 LOOP
7500
7501 Adjust_interface_date(
7502 p_line_id => l_subLine_rec.id,
7503 p_invoice_rule_id => p_invoice_rule_id,
7504 p_line_end_date => l_subline_rec.cp_end_date,
7505 p_lse_id => l_subline_rec.lse_id,
7506 x_bs_tbl => l_update_bs_tbl,
7507 x_return_status => x_return_status,
7508 x_msg_count => x_msg_count,
7509 x_msg_data => x_msg_data);
7510
7511 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7512 RAISE G_EXCEPTION_HALT_VALIDATION;
7513 END IF;
7514
7515 IF l_update_bs_tbl.COUNT > 0 THEN
7516
7517 FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7518 LOOP
7519
7520 l_lvl_ele_tbl_in(l_lvl_index).id := l_update_bs_tbl(l_index).id;
7521 l_lvl_ele_tbl_in(l_lvl_index).date_start := l_update_bs_tbl(l_index).date_start;
7522 l_lvl_ele_tbl_in(l_lvl_index).date_to_interface := l_update_bs_tbl(l_index).date_to_interface;
7523 l_lvl_ele_tbl_in(l_lvl_index).object_version_number := l_update_bs_tbl(l_index).object_version_number;
7524
7525 l_lvl_index := l_lvl_index + 1;
7526 END LOOP;
7527
7528 END IF; ---- l_update_bs_tbl.COUNT > 0
7529
7530 END LOOP; ----subline csr
7531
7532 ELSE ----billing type E and T
7533
7534 ---interface/trx dt should be same for cp and top line. build tbl for billed lvl_element for top line
7535 ---and merge tbl with not billed. as some of the cp may be added later which are not billed yet.
7536
7537 l_top_index := 1;
7538 l_line_tbl_in.DELETE;
7539
7540 ---billed top line lvl element
7541
7542 FOR l_Line_BS_rec IN l_Line_BS_csr
7543 LOOP
7544
7545 l_line_tbl_in(l_top_index).id := l_Line_BS_rec.id;
7546 l_line_tbl_in(l_top_index).date_start := l_Line_BS_rec.date_start;
7547 l_line_tbl_in(l_top_index).date_to_interface := l_Line_BS_rec.date_to_interface;
7548 l_line_tbl_in(l_top_index).date_transaction := l_Line_BS_rec.date_transaction;
7549
7550 l_top_index := l_top_index + 1;
7551 END LOOP;
7552
7553 ----unbilled lvl element for top line added to l_line_tbl_in
7554 FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7555 LOOP
7556
7557 l_line_tbl_in(l_top_index).id := l_update_bs_tbl(l_index).id;
7558 l_line_tbl_in(l_top_index).date_start := l_update_bs_tbl(l_index).date_start;
7559 l_line_tbl_in(l_top_index).date_to_interface := l_update_bs_tbl(l_index).date_to_interface;
7560 l_line_tbl_in(l_top_index).date_transaction := l_update_bs_tbl(l_index).date_transaction;
7561
7562 l_top_index := l_top_index + 1;
7563 END LOOP;
7564
7565
7566 For l_subLine_rec IN l_subLine_csr
7567 LOOP
7568
7569 Adjust_cp_trx_inv_dt(
7570 p_top_bs_tbl => l_line_tbl_in,
7571 p_SubLine_id => l_subLine_rec.id,
7572 x_cp_line_bs => l_cp_line_bs,
7573 x_return_status => x_return_status);
7574
7575 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7576 RAISE G_EXCEPTION_HALT_VALIDATION;
7577 END IF;
7578
7579 IF l_cp_line_bs.COUNT > 0 THEN
7580
7581 FOR L_index IN l_cp_line_bs.FIRST .. l_cp_line_bs.LAST
7582 LOOP
7583
7584 l_lvl_ele_tbl_in(l_lvl_index).id := l_cp_line_bs(l_index).id;
7585 l_lvl_ele_tbl_in(l_lvl_index).date_start := l_cp_line_bs(l_index).date_start;
7586 l_lvl_ele_tbl_in(l_lvl_index).date_to_interface := l_cp_line_bs(l_index).date_to_interface;
7587 l_lvl_ele_tbl_in(l_lvl_index).date_transaction := l_cp_line_bs(l_index).date_transaction;
7588 l_lvl_ele_tbl_in(l_lvl_index).object_version_number := l_cp_line_bs(l_index).object_version_number;
7589
7590 l_lvl_index := l_lvl_index + 1;
7591 END LOOP;
7592
7593 END IF; ---- l_cp_line_bs.COUNT > 0
7594
7595 END LOOP; ----subline csr
7596
7597 END IF; ---chk billing schedule type
7598
7599
7600
7601 -----errorout_ad('l_lvl_ele_tbl_in.COUNT = ' || l_lvl_ele_tbl_in.COUNT );
7602
7603 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
7604 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
7605 p_api_version => l_api_version,
7606 p_init_msg_list => l_init_msg_list,
7607 x_return_status => x_return_status,
7608 x_msg_count => x_msg_count,
7609 x_msg_data => x_msg_data,
7610 p_letv_tbl => l_lvl_ele_tbl_in,
7611 x_letv_tbl => l_lvl_ele_tbl_out);
7612
7613 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7614 RAISE G_EXCEPTION_HALT_VALIDATION;
7615 END IF;
7616 END IF;
7617
7618
7619 EXCEPTION
7620 WHEN G_EXCEPTION_HALT_VALIDATION THEN
7621 NULL;
7622
7623 WHEN OTHERS THEN
7624 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7625 p_msg_name => G_UNEXPECTED_ERROR,
7626 p_token1 => G_SQLCODE_TOKEN,
7627 p_token1_value => sqlcode,
7628 p_token2 => G_SQLERRM_TOKEN,
7629 p_token2_value => sqlerrm);
7630
7631 x_return_status := G_RET_STS_UNEXP_ERROR;
7632
7633
7634 END update_bs_interface_date;
7635
7636
7637 Procedure Adjust_interface_date(p_line_id IN NUMBER,
7638 p_invoice_rule_id IN Number,
7639 p_line_end_date IN DATE,
7640 p_lse_id IN NUMBER,
7641 x_bs_tbl OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
7642 x_return_status OUT NOCOPY VARCHAR2,
7643 x_msg_count OUT NOCOPY NUMBER,
7644 x_msg_data OUT NOCOPY VARCHAR2)
7645 IS
7646
7647
7648
7649
7650 Cursor l_Line_SLL_CSR(l_line_id NUMBER) is
7651 SELECT id, cle_id, chr_id, dnz_chr_id , uom_code,
7652 sequence_no, Start_Date, end_Date, level_periods,
7653 uom_per_period, level_amount, invoice_offset_days, interface_offset_days
7654 FROM OKS_STREAM_LEVELS_B
7655 WHERE cle_id = l_line_id
7656 ORDER BY sequence_no;
7657
7658 CURSOR l_lvl_element_csr(l_sll_id NUMBER) IS
7659 SELECT id,date_start, date_end, date_to_interface,
7660 date_transaction , object_version_number
7661 FROM oks_level_elements
7662 WHERE rul_id = l_sll_id AND date_completed IS NULL
7663 ORDER BY date_start;
7664
7665
7666
7667 l_Line_SLL_rec l_Line_SLL_csr%ROWTYPE;
7668 l_lvl_element_rec l_lvl_element_csr%ROWTYPE;
7669
7670
7671 l_index NUMBER := 0;
7672 l_bs_index NUMBER := 0;
7673 l_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
7674 l_sll_end_date DATE;
7675 l_interface_offset NUMBER;
7676 l_date_to_interface DATE;
7677 l_out_index NUMBER := 0;
7678
7679 l_action_offset NUMBER;
7680 l_date_transaction DATE;
7681
7682 BEGIN
7683
7684 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7685
7686
7687 For l_Line_SLL_rec IN l_Line_SLL_csr(p_line_id)
7688 LOOP
7689
7690 l_bs_index := 0;
7691 l_bs_tbl.delete;
7692
7693 IF l_line_SLL_rec.end_date IS NOT NULL THEN
7694
7695 l_sll_end_date := l_line_SLL_rec.end_date;
7696 ELSE
7697 l_sll_end_date := OKC_TIME_UTIL_PUB.get_enddate(
7698 l_Line_SlL_rec.Start_Date,
7699 l_Line_SlL_rec.UOM_CODE,
7700 l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
7701 END IF;
7702
7703
7704
7705
7706 FOR l_lvl_element_rec IN l_lvl_element_csr(l_Line_SLL_rec.id)
7707 LOOP
7708 l_bs_tbl(l_bs_index).id := l_lvl_element_rec.id;
7709 l_bs_tbl(l_bs_index).date_start := l_lvl_element_rec.date_start;
7710 l_bs_tbl(l_bs_index).date_end := l_lvl_element_rec.date_end;
7711 l_bs_tbl(l_bs_index).date_to_interface := l_lvl_element_rec.date_to_interface;
7712 l_bs_tbl(l_bs_index).date_transaction := l_lvl_element_rec.date_transaction;
7713 l_bs_tbl(l_bs_index).object_version_number := l_lvl_element_rec.object_version_number;
7714
7715 -----errorout_ad('before date_to_interface = ' || l_bs_tbl(l_bs_index).date_to_interface);
7716
7717 l_bs_index := l_bs_index + 1;
7718
7719 END LOOP;
7720
7721 IF l_bs_tbl.COUNT > 0 THEN
7722
7723
7724 l_interface_offset := NVL(TO_NUMBER(l_Line_SLL_rec.interface_offset_days),0);
7725 l_action_offset := NVL(TO_NUMBER(l_Line_SLL_rec.invoice_offset_days),0);
7726
7727 FOR l_index IN l_bs_tbl.FIRST .. l_bs_tbl.LAST
7728 LOOP
7729
7730 ---calculate trx date
7731
7732 If nvl(p_invoice_rule_id,-2) = -2 Then
7733
7734 l_date_transaction := l_bs_tbl(l_index).date_start + l_action_offset;
7735
7736 If l_date_transaction < SYSDATE Then
7737 l_date_transaction := SYSDATE;
7738 End if;
7739
7740 Elsif nvl(p_invoice_rule_id,-2) = -3 Then
7741
7742 IF l_bs_tbl(l_index ).date_end IS NOT NULL THEN
7743
7744 l_date_transaction := l_bs_tbl(l_index ).date_end + l_action_offset;
7745
7746 ELSE ---end dt null for migrated contracts
7747
7748 IF l_index < l_bs_tbl.LAST THEN
7749 l_date_transaction := (l_bs_tbl(l_index + 1).date_start - 1 ) + l_action_offset;
7750 ELSE ---not last
7751 IF p_lse_id <> 46 THEN
7752 l_date_transaction := LEAST(l_sll_end_date, p_line_end_date ) + l_action_offset;
7753 ELSE
7754 l_date_transaction := okc_time_util_pub.get_enddate
7755 (l_bs_tbl(l_index).date_start,
7756 l_Line_SLL_rec.uom_code,
7757 l_Line_SLL_rec.uom_per_period) + l_action_offset;
7758 END IF; ---chk for 46
7759 END IF; ---chk for last
7760
7761 END IF; ---end date null chk
7762
7763 ----l_date_transaction SHOULD not be less then bill from date and sysdate.
7764 IF l_date_transaction < l_bs_tbl(l_index).date_start THEN
7765 l_date_transaction := l_bs_tbl(l_index).date_start ;
7766 END IF;
7767
7768 If l_date_transaction < SYSDATE Then
7769 l_date_transaction := SYSDATE;
7770 End if;
7771
7772 End if; --chk for advance for trx date
7773
7774
7775
7776 ---calculate inv date
7777
7778 If nvl(p_invoice_rule_id,-2) = -2 Then /*** advance ***/
7779
7780 l_date_to_interface := l_bs_tbl(l_index).date_start + NVL(l_interface_offset,0);
7781
7782 IF l_date_to_interface > LEAST(l_date_transaction, l_bs_tbl(l_index).date_start) Then
7783
7784 l_date_to_interface := LEAST(l_date_transaction, l_bs_tbl(l_index).date_start);
7785 End if;
7786
7787 ELSIF nvl(p_invoice_rule_id,-2) = -3 Then
7788
7789 IF l_index <> l_bs_tbl.LAST THEN
7790
7791 IF l_bs_tbl(l_index ).date_end IS NULL THEN
7792 l_date_to_interface := l_bs_tbl(l_index + 1).date_start + NVL(l_interface_offset,0); /** Bill to date + 1 ***/
7793 ELSE
7794
7795 l_date_to_interface := l_bs_tbl(l_index ).date_end + 1 + NVL(l_interface_offset,0); /** Bill to date + 1 ***/
7796 END IF;
7797
7798 ELSE
7799
7800 IF l_sll_end_date > p_line_end_date THEN
7801 l_date_to_interface := p_line_end_date + 1 + NVL(l_interface_offset,0);
7802 ELSE
7803 l_date_to_interface := l_sll_end_date + 1 + NVL(l_interface_offset,0);
7804 END IF;
7805 END IF;
7806 END IF; ---end of advance/arrears for inv
7807
7808 ------Assign interface date in tbl
7809 IF l_date_to_interface IS NOT NULL THEN
7810 l_bs_tbl(l_index).date_to_interface := l_date_to_interface;
7811 END IF;
7812
7813 IF l_date_to_interface IS NOT NULL THEN
7814 l_bs_tbl(l_index).date_transaction := l_date_transaction;
7815 END IF;
7816
7817 x_bs_tbl(l_out_index).id := l_bs_tbl(l_index).id ;
7818 x_bs_tbl(l_out_index).date_start := l_bs_tbl(l_index).date_start ;
7819 x_bs_tbl(l_out_index).date_end := l_bs_tbl(l_index).date_end ;
7820 x_bs_tbl(l_out_index).date_to_interface := TRUNC(l_bs_tbl(l_index).date_to_interface);
7821 x_bs_tbl(l_out_index).object_version_number := l_bs_tbl(l_index).object_version_number;
7822 x_bs_tbl(l_out_index).date_transaction := TRUNC(l_bs_tbl(l_index).date_transaction);
7823
7824 l_out_index := l_out_index + 1;
7825 END LOOP;
7826
7827
7828 END IF; ---end of l_bs_tbl.COUNT > 0
7829 END LOOP; ----SLL CSR
7830
7831
7832 EXCEPTION
7833
7834 WHEN OTHERS THEN
7835 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7836 p_msg_name => G_UNEXPECTED_ERROR,
7837 p_token1 => G_SQLCODE_TOKEN,
7838 p_token1_value => sqlcode,
7839 p_token2 => G_SQLERRM_TOKEN,
7840 p_token2_value => sqlerrm);
7841
7842 x_return_status := G_RET_STS_UNEXP_ERROR;
7843 END Adjust_interface_date;
7844
7845
7846 Procedure Cascade_Dt_lines_SLL
7847 (
7848 p_contract_id IN NUMBER,
7849 p_line_id IN NUMBER,
7850 x_return_status OUT NOCOPY Varchar2)
7851
7852 IS
7853
7854 CURSOR l_top_line_Csr Is
7855 SELECT id
7856 FROM OKC_K_LINES_b
7857 WHERE chr_id = p_contract_id
7858 AND lse_id IN (1, 12, 14, 19, 46);
7859
7860 l_top_line_rec l_top_line_Csr%ROWTYPE;
7861 l_msg_count NUMBER;
7862 l_msg_data VARCHAR2(2000);
7863
7864 BEGIN
7865
7866 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7867
7868
7869 IF p_line_id IS NOT NULL THEN
7870 oks_bill_sch.Cascade_Dates_SLL
7871 (
7872 p_top_line_id => p_line_id,
7873 x_return_status => x_return_status,
7874 x_msg_count => l_msg_count,
7875 x_msg_data => l_msg_data);
7876
7877 ELSIF p_contract_id IS NOT NULL THEN
7878
7879 FOR l_top_line_rec IN l_top_line_Csr
7880 LOOP
7881
7882 oks_bill_sch.Cascade_Dates_SLL
7883 (
7884 p_top_line_id => l_top_line_rec.id,
7885 x_return_status => x_return_status,
7886 x_msg_count => l_msg_count,
7887 x_msg_data => l_msg_data);
7888 END LOOP;
7889 END IF;
7890
7891 EXCEPTION
7892 WHEN G_EXCEPTION_HALT_VALIDATION THEN
7893 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
7894 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7895 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
7896 RAISE OKC_API.G_EXCEPTION_ERROR;
7897 END IF;
7898 WHEN OTHERS THEN
7899 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
7900 p_msg_name => G_UNEXPECTED_ERROR,
7901 p_token1 => G_SQLCODE_TOKEN,
7902 p_token1_value => sqlcode,
7903 p_token2 => G_SQLERRM_TOKEN,
7904 p_token2_value => sqlerrm);
7905
7906 x_return_status := G_RET_STS_UNEXP_ERROR;
7907 END Cascade_Dt_lines_SLL;
7908
7909 -------------------------------------------------------------------------
7910 -- Partial period computation logic
7911 -- Developer Mani Choudhary
7912 -- Date 09-MAY-2005
7913 -------------------------------------------------------------------------
7914 PROCEDURE Create_Subcription_LvlEle
7915 (p_billing_type IN VARCHAR2,
7916 p_sll_tbl IN StrmLvl_Out_tbl,
7917 p_line_rec IN Line_Det_Type,
7918 p_term_dt IN DATE,
7919 p_invoice_ruleid IN Number,
7920 p_period_start IN VARCHAR2,
7921 p_period_type IN VARCHAR2,
7922 x_return_status OUT NOCOPY Varchar2)
7923
7924 IS
7925
7926 CURSOR l_subcription_amt_csr(p_line_id NUMBER, p_term_dt DATE) IS
7927 SELECT nvl(SUM(amount) ,0) sub_amt
7928 FROM OKS_SUBSCR_ELEMENTS
7929 WHERE dnz_cle_id = p_line_id;
7930
7931 ----commented for bug#3222008.terminate program first call recreate fulfillemt schedule so
7932 ----take amt from rest of fulfillemt sch.
7933 --- AND TRUNC(start_date) < TRUNC(p_term_dt);
7934
7935
7936 l_subcription_amt_rec l_subcription_amt_csr%ROWTYPE;
7937
7938
7939
7940
7941 l_tangible BOOLEAN;
7942 l_line_sll_counter Number;
7943 l_period_counter Number;
7944 l_next_cycle_dt Date;
7945
7946 l_line_end_date date;
7947 l_line_amt NUMBER;
7948
7949 l_adjusted_amt NUMBER;
7950 l_lvl_loop_counter NUMBER;
7951 l_last_cycle_dt Date;
7952 l_bill_sch_amt NUMBER := 0;
7953 l_tbl_seq NUMBER;
7954 l_uom_quantity NUMBER;
7955 l_tce_code VARCHAR2(100);
7956 L_CONSTANT_SLL_AMT NUMBER;
7957 l_remaining_amt NUMBER;
7958 L_SLL_AMT NUMBER;
7959 l_dummy_top_line_bs oks_bill_level_elements_pvt.letv_tbl_type;
7960 l_bill_type VARCHAR2(10);
7961
7962 --
7963 l_api_version CONSTANT NUMBER := 1.0;
7964 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
7965 l_return_status VARCHAR2(10);
7966 l_msg_count NUMBER;
7967 l_msg_data VARCHAR2(2000);
7968 l_msg_index_out NUMBER;
7969 l_msg_index NUMBER;
7970 -- Start - Added by PMALLARA - Bug #3992530
7971 Lvl_Element_cnt Number := 0;
7972 Strm_Start_Date Date;
7973 -- End - Added by PMALLARA - Bug #3992530
7974 -------------------------------------------------------------------------
7975 -- Partial period computation logic
7976 -- Developer Mani Choudhary
7977 -- Date 09-MAY-2005
7978 -------------------------------------------------------------------------
7979 l_pricing_method Varchar2(30);
7980 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
7981 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
7982 BEGIN
7983
7984 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7985
7986 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_line_rec.id);
7987
7988
7989
7990 l_lvl_ele_tbl_in.delete;
7991 l_tbl_seq := 1;
7992 l_line_end_date := p_line_rec.line_end_dt; ---termination dt
7993 l_line_sll_counter := p_sll_tbl.FIRST;
7994
7995 IF p_term_dt IS NULL THEN
7996 l_line_end_date := p_line_rec.line_end_dt;
7997 ELSE
7998 l_line_end_date := p_term_dt;
7999 END IF;
8000
8001
8002 IF l_tangible THEN ----item is tangible (have fulfillment schedule)
8003
8004 -----errorout_ad('l_tangible = true');
8005
8006 OPEN l_subcription_amt_csr(p_line_rec.id,l_line_end_date) ;
8007 FETCH l_subcription_amt_csr INTO l_subcription_amt_rec;
8008
8009 If l_subcription_amt_csr%NOTFOUND THEN
8010 l_line_amt := 0;
8011 CLOSE l_subcription_amt_csr;
8012 ELSE
8013 l_line_amt := l_subcription_amt_rec.sub_amt;
8014 Close l_subcription_amt_csr;
8015 END IF;
8016 ---l_line_amt := 400;
8017
8018 -------------------------------------------------------------------------
8019 -- Partial period computation logic
8020 -- Developer Mani Choudhary
8021 -- Date 09-MAY-2005
8022 -- For tangible only service start will be honored
8023 -------------------------------------------------------------------------
8024 l_period_start := NULL;
8025 l_period_type := NULL;
8026
8027 ELSE ----false
8028
8029 -----errorout_ad('l_tangible = false');
8030 l_line_amt := OKS_SUBSCRIPTION_PUB.subs_termn_amount
8031 ( p_cle_id => p_line_rec.id,
8032 p_termn_date => l_line_end_date ) ;
8033
8034 IF l_line_amt IS NULL THEN
8035 l_line_amt := 0;
8036 END IF;
8037
8038 -------------------------------------------------------------------------
8039 -- Partial period computation logic
8040 -- Developer Mani Choudhary
8041 -- Date 09-MAY-2005
8042 -- If intangible and if the profile option OKS_SUBS_PRICING_METHO is subscription based
8043 -- then period start should be NULL and period type should also be NULL
8044 -- otherwise period start should be 'SERVICE' and period type will be whatever is set at GCD
8045 -------------------------------------------------------------------------
8046 --mchoudha fix for bug#5183011
8047 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
8048 if nvl(l_pricing_method,'SUBSCRIPTION') = 'EFFECTIVITY' then
8049 l_period_start := 'SERVICE';
8050 else
8051 l_period_start := NULL;
8052 l_period_type := NULL;
8053 -- l_line_amt := p_line_rec.line_amt - l_line_amt;
8054 END IF;
8055
8056 END IF;
8057 -----errorout_ad('LINE AMT = ' || l_line_amt);
8058
8059
8060 IF l_header_billing IS NULL THEN
8061
8062 Delete_lvl_element(p_cle_id => p_line_rec.id,
8063 x_return_status => x_return_status);
8064
8065 -----errorout_ad('Delete_lvl_element status = ' || x_return_status);
8066
8067 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8068 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8069 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8070 RAISE OKC_API.G_EXCEPTION_ERROR;
8071 END IF;
8072 END IF;
8073
8074 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.
8075 x_return_status := 'S';
8076 RETURN;
8077 END IF;
8078
8079 l_bill_type := p_billing_type;
8080
8081
8082
8083 LOOP ---sll rule loop
8084 -----errorout_ad('sll rule start date : '||to_char(p_line_rec.line_start_dt));
8085
8086 IF l_header_billing IS NOT NULL THEN ----hdr lvl billing no old sll and lvl elements
8087 l_next_cycle_dt := p_sll_tbl(l_line_sll_counter).dt_start;
8088 l_lvl_loop_counter := 1;
8089 l_period_counter := 1;
8090
8091 ELSE
8092
8093 Check_Existing_Lvlelement(
8094 p_sll_id =>p_sll_tbl(l_line_sll_counter).id,
8095 p_sll_dt_start =>p_sll_tbl(l_line_sll_counter).dt_start,
8096 p_uom => null,
8097 p_uom_per_period => null,
8098 p_cp_end_dt => null,
8099 x_next_cycle_dt => l_next_cycle_dt,
8100 x_last_cycle_dt => l_last_cycle_dt,
8101 x_period_counter => l_period_counter,
8102 x_sch_amt => l_bill_sch_amt,
8103 x_top_line_bs => l_dummy_top_line_bs,
8104 x_return_status => x_return_status);
8105
8106 -----errorout_ad('LEVEL ELEMENT COUNTER = ' || TO_CHAR(l_period_counter));
8107 -----errorout_ad('LEVEL ELEMENT START DATE = ' || to_char(l_next_cycle_dt));
8108
8109 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8110 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8111 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8112 RAISE OKC_API.G_EXCEPTION_ERROR;
8113 END IF;
8114 l_lvl_loop_counter := l_period_counter;
8115 END IF;
8116
8117 IF l_period_counter > to_number(p_sll_tbl(l_line_sll_counter).level_period) THEN
8118 ---It will not insert record in lvl ele for recent sll
8119
8120 IF l_line_sll_counter + 1 <= p_sll_tbl.LAST THEN
8121 l_next_cycle_dt := p_sll_tbl(l_line_sll_counter + 1).dt_start;
8122 ELSE
8123
8124 l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
8125 (p_sll_tbl(l_line_sll_counter).dt_start,
8126 p_sll_tbl(l_line_sll_counter).uom,
8127 (p_sll_tbl(l_line_sll_counter).uom_Per_Period *
8128 p_sll_tbl(l_line_sll_counter).level_period));
8129
8130 l_next_cycle_dt := l_next_cycle_dt + 1;
8131 END IF;
8132
8133 ELSE
8134
8135 -----errorout_ad('last date = ' || TO_CHAR(l_last_cycle_dt));
8136 -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom);
8137 -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom_Per_Period);
8138 IF L_next_cycle_dt IS null THEN
8139
8140
8141 L_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
8142 (l_last_cycle_dt,
8143 p_sll_tbl(l_line_sll_counter).uom,
8144 p_sll_tbl(l_line_sll_counter).uom_Per_Period);
8145
8146 -----errorout_ad('next_cycle_date = ' || to_char(l_next_cycle_dt));
8147
8148 l_next_cycle_dt := l_next_cycle_dt + 1;
8149 END IF;
8150
8151
8152 IF l_bill_type = 'T' THEN
8153 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
8154 p_timeunit => p_sll_tbl(l_line_sll_counter).uom,
8155 x_return_status => x_return_status,
8156 x_quantity => l_uom_quantity ,
8157 x_timeunit => l_tce_code);
8158
8159 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
8160 RAISE G_EXCEPTION_HALT_VALIDATION;
8161 END IF;
8162
8163 l_remaining_amt := l_line_amt - nvl(l_bill_sch_amt,0);
8164
8165 Get_Constant_sll_Amount(p_line_start_date => p_line_rec.line_start_dt,
8166 p_line_end_date => l_line_end_date,
8167 p_cycle_start_date => l_next_cycle_dt,
8168 p_remaining_amount => l_remaining_amt,
8169 P_uom_quantity => l_uom_quantity,
8170 P_tce_code => l_tce_code,
8171 x_constant_sll_amt => l_constant_sll_amt,
8172 x_return_status => x_return_status);
8173
8174 -----errorout_ad('Get_Constant_sll_Amount = ' || x_return_status);
8175
8176 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
8177 RAISE G_EXCEPTION_HALT_VALIDATION;
8178 END IF;
8179 END IF; ----end of bill type = 'T'
8180
8181 IF l_line_amt <= nvl(l_bill_sch_amt,0) AND l_bill_type = 'E' THEN
8182 NULL;
8183 ELSE
8184
8185
8186 -- Start - Added by PMALLARA - Bug #3992530
8187 Lvl_Element_cnt := l_period_counter - 1;
8188 Strm_Start_Date := p_sll_tbl(l_line_sll_counter).dt_start;
8189 LOOP -------------for level elements of one rule
8190 Lvl_Element_cnt := Lvl_Element_cnt + 1;
8191 -- End - Added by PMALLARA - Bug #3992530
8192
8193 l_fnd_lvl_in_rec.line_start_date := p_line_rec.line_start_dt;
8194 l_fnd_lvl_in_rec.line_end_date := l_line_end_date;
8195 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
8196 -- Start - Modified by PMALLARA - Bug #3992530
8197 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * p_sll_tbl(l_line_sll_counter).uom_Per_Period;
8198 -- End - Modified by PMALLARA - Bug #3992530
8199 l_fnd_lvl_in_rec.tuom := p_sll_tbl(l_line_sll_counter).uom;
8200 l_fnd_lvl_in_rec.total_amount := 0;
8201 l_fnd_lvl_in_rec.invoice_offset_days := p_sll_tbl(l_line_sll_counter).invoice_offset_days;
8202 l_fnd_lvl_in_rec.interface_offset_days := p_sll_tbl(l_line_sll_counter).Interface_offset_days;
8203 l_fnd_lvl_in_rec.bill_type := 'S'; ---passed 'S' for subcription terminated line.
8204 --mchoudha added this parameter
8205 l_fnd_lvl_in_rec.uom_per_period := p_sll_tbl(l_line_sll_counter).uom_Per_Period;
8206
8207 -------------------------------------------------------------------------
8208 -- Begin partial period computation logic
8209 -- Developer Mani Choudhary
8210 -- Date 09-MAY-2005
8211 -- Added two new parameters p_period_start and p_period_type
8212 -------------------------------------------------------------------------
8213 -- Start - Modified by PMALLARA - Bug #3992530
8214 OKS_BILL_UTIL_PUB.Get_next_bill_sch
8215 (p_api_version => l_api_version,
8216 x_return_status => x_return_status,
8217 x_msg_count => l_msg_count,
8218 x_msg_data => l_msg_data,
8219 p_invoicing_rule_id => p_invoice_ruleid,
8220 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
8221 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
8222 p_period_start => l_period_start,
8223 p_period_type => p_period_type,
8224 Strm_Start_Date => Strm_Start_Date);
8225 -- End - Modified by PMALLARA - Bug #3992530
8226
8227 -----errorout_ad('LEVEL ELEMENT NEXT CYCLE DATE passed from Get_next_bill_sch = ' || TO_CHAR(l_fnd_lvl_out_rec.next_cycle_date));
8228
8229 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8230 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
8231 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8232 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8233 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
8234 RAISE OKC_API.G_EXCEPTION_ERROR;
8235 END IF;
8236
8237
8238
8239 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt then
8240 null; ---donot insert record in level element
8241 ELSE
8242 l_lvl_ele_tbl_in(l_tbl_seq).sequence_number := to_char(l_period_counter);
8243 l_lvl_ele_tbl_in(l_tbl_seq).cle_id := p_line_rec.id;
8244 l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id := p_line_rec.id;
8245 l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id := p_line_rec.dnz_chr_id;
8246
8247 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(l_next_cycle_dt);
8248 l_lvl_ele_tbl_in(l_tbl_seq).date_end := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
8249
8250
8251 IF l_bill_type = 'T' then
8252 --calculated sll amount
8253 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_constant_sll_amt,l_currency_code );
8254
8255 ELSE ----for E and P
8256 ---sll amt entered by user
8257
8258 l_sll_amt := TO_NUMBER(p_sll_tbl(l_line_sll_counter).amount);
8259 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt,l_currency_code );
8260 END IF;
8261
8262
8263 l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl := l_fnd_lvl_out_rec.date_recievable_gl;
8264 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := TRUNC(l_fnd_lvl_out_rec.date_transaction);
8265 l_lvl_ele_tbl_in(l_tbl_seq).date_due := l_fnd_lvl_out_rec.date_due;
8266 l_lvl_ele_tbl_in(l_tbl_seq).date_print := l_fnd_lvl_out_rec.date_print;
8267 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
8268 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
8269 l_lvl_ele_tbl_in(l_tbl_seq).rul_id := p_sll_tbl(l_line_sll_counter).id;
8270
8271 l_lvl_ele_tbl_in(l_tbl_seq).object_version_number := OKC_API.G_MISS_NUM;
8272 l_lvl_ele_tbl_in(l_tbl_seq).created_by := OKC_API.G_MISS_NUM;
8273 l_lvl_ele_tbl_in(l_tbl_seq).creation_date := SYSDATE;
8274 l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by := OKC_API.G_MISS_NUM;
8275 l_lvl_ele_tbl_in(l_tbl_seq).last_update_date := SYSDATE;
8276
8277
8278 -----errorout_ad ('Amount for line lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
8279
8280 l_period_counter := l_period_counter + 1;
8281 l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
8282 l_tbl_seq := l_tbl_seq + 1;
8283 END IF; -----end if for level element creation
8284
8285 l_next_cycle_dt := l_fnd_lvl_out_rec.next_cycle_date;
8286
8287 IF l_bill_type = 'T' then
8288
8289 EXIT WHEN (l_lvl_loop_counter = p_sll_tbl(l_line_sll_counter).level_period) OR
8290 (TRUNC(l_next_cycle_dt) > l_line_end_date);
8291 ELSE ---'E'
8292 EXIT WHEN (l_line_amt <= l_bill_sch_amt) OR
8293 (l_lvl_loop_counter = p_sll_tbl(l_line_sll_counter).level_period) ;
8294 END IF;
8295
8296 l_lvl_loop_counter := l_lvl_loop_counter + 1;
8297
8298 END LOOP; ---loop for sll period counter
8299 END IF; ----l_line_amt <= nvl(l_bill_sch_amt,0) AND l_bill_type = 'E'
8300
8301 END IF; ----Period counter checking before entering in loop for lvlelement
8302
8303
8304
8305 IF l_bill_type = 'T' then
8306 EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
8307 (TRUNC(l_next_cycle_dt) > l_line_end_date);
8308 ELSE ---'E'
8309 EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
8310 (l_line_amt <= l_bill_sch_amt);
8311
8312 END IF; ---End of 'T'
8313 l_line_sll_counter := p_sll_tbl.NEXT(l_line_sll_counter);
8314
8315 END LOOP; -----loop for sll lines
8316
8317 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
8318
8319 IF l_line_amt < l_bill_sch_amt THEN
8320 --adjust the last lvl elemnt amt
8321
8322 l_adjusted_amt := (l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount) - (l_bill_sch_amt - l_line_amt);
8323 l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount := l_adjusted_amt;
8324
8325 ELSIF l_line_amt > l_bill_sch_amt THEN
8326 --adjust the last lvl elemnt amt
8327
8328 l_adjusted_amt := (l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount) + (l_line_amt - l_bill_sch_amt);
8329 l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount := l_adjusted_amt;
8330 END IF;
8331
8332 OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
8333 p_api_version => l_api_version,
8334 p_init_msg_list => l_init_msg_list,
8335 x_return_status => x_return_status,
8336 x_msg_count => l_msg_count,
8337 x_msg_data => l_msg_data,
8338 p_letv_tbl => l_lvl_ele_tbl_in,
8339 x_letv_tbl => l_lvl_ele_tbl_out);
8340
8341 -----errorout_ad('LEVEL ELEMENT INSERT STATUS FOR SUBLINE = ' || x_return_status);
8342
8343
8344 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8345 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for sub line = ' || l_msg_data);
8346 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8347 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8348 -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for sub line = ' || l_msg_data);
8349 RAISE OKC_API.G_EXCEPTION_ERROR;
8350 END IF;
8351 END IF;
8352
8353
8354 EXCEPTION
8355 WHEN OTHERS THEN
8356 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
8357 p_msg_name => G_UNEXPECTED_ERROR,
8358 p_token1 => G_SQLCODE_TOKEN,
8359 p_token1_value => sqlcode,
8360 p_token2 => G_SQLERRM_TOKEN,
8361 p_token2_value => sqlerrm);
8362
8363 x_return_status := G_RET_STS_UNEXP_ERROR;
8364 END Create_Subcription_LvlEle;
8365
8366 Procedure Create_Subcription_bs
8367 (
8368 p_top_line_id IN NUMBER,
8369 p_full_credit IN VARCHAR2,
8370 x_return_status OUT NOCOPY Varchar2,
8371 x_msg_count OUT NOCOPY NUMBER,
8372 x_msg_data OUT NOCOPY VARCHAR2)
8373
8374 IS
8375
8376 CURSOR l_line_sll_csr IS
8377 SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
8378 uom_per_period, uom_code, TRUNC(end_date) end_date,
8379 interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
8380 chr_id, level_amount
8381 FROM OKS_STREAM_LEVELS_B
8382 WHERE cle_id = p_top_line_id
8383 ORDER BY sequence_no;
8384
8385
8386
8387 Cursor l_Line_Csr Is
8388 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
8389 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
8390 TRUNC(line.date_terminated) line_term_dt, line.inv_rule_id inv_rule_id,
8391 nvl(dtl.billing_schedule_type,'E') billing_schedule_type,
8392 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
8393 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
8394 FROM okc_k_lines_b line, oks_k_lines_b dtl
8395 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id ;
8396
8397
8398
8399
8400
8401
8402
8403 l_index NUMBER;
8404 l_sll_in_tbl StrmLvl_Out_tbl;
8405
8406 l_Line_Sll_rec l_Line_Sll_Csr%ROWTYPE;
8407 l_Line_Rec l_Line_Csr%Rowtype;
8408
8409 L_BIL_SCH_OUT_TBL OKS_BILL_SCH.ItemBillSch_tbl;
8410 l_top_line_rec Line_Det_Type;
8411 l_update_end_date VARCHAR2(1);
8412
8413
8414 -------------------------------------------------------------------------
8415 -- Begin partial period computation logic
8416 -- Developer Mani Choudhary
8417 -- Date 04-MAY-2005
8418 -------------------------------------------------------------------------
8419 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
8420 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
8421 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
8422 l_return_status VARCHAR2(30);
8423 -------------------------------------------------------------------------
8424 -- End partial period computation logic
8425 -- Date 04-MAY-2005
8426 -------------------------------------------------------------------------
8427
8428 BEGIN
8429
8430 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8431 l_update_end_date := 'N';
8432
8433 IF nvl(p_full_credit, 'N') = 'Y' Then
8434 DELETE FROM OKS_LEVEL_ELEMENTS
8435 WHERE date_completed IS NULL
8436 AND cle_id = p_top_line_id;
8437
8438 RETURN;
8439 END IF;
8440
8441 ---get line details
8442 Open l_Line_Csr;
8443 Fetch l_Line_Csr Into l_Line_Rec;
8444
8445 If l_Line_Csr%Notfound then
8446 Close l_Line_Csr;
8447 x_return_status := 'E';
8448 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
8449 RAISE G_EXCEPTION_HALT_VALIDATION;
8450 End If;
8451 Close l_Line_Csr;
8452
8453 l_top_line_rec.chr_id := l_Line_Rec.chr_id;
8454 l_top_line_rec.dnz_chr_id := l_Line_Rec.dnz_chr_id;
8455 l_top_line_rec.id := l_Line_Rec.id ;
8456 l_top_line_rec.lse_id := l_Line_Rec.lse_id;
8457 l_top_line_rec.line_start_dt := l_Line_Rec.line_start_dt;
8458 l_top_line_rec.line_end_dt := l_Line_Rec.line_end_dt;
8459 l_top_line_rec.line_amt := l_Line_Rec.line_amt ;
8460
8461
8462 -------------------------------------------------------------------------
8463 -- Begin partial period computation logic
8464 -- Developer Mani Choudhary
8465 -- Date 09-MAY-2005
8466 -------------------------------------------------------------------------
8467
8468 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
8469 (
8470 p_hdr_id => l_Line_Rec.dnz_chr_id,
8471 p_org_id => NULL,
8472 x_period_start => l_period_start,
8473 x_period_type => l_period_type,
8474 x_price_uom => l_price_uom,
8475 x_return_status => x_return_status);
8476
8477 IF x_return_status <> 'S' THEN
8478 RAISE G_EXCEPTION_HALT_VALIDATION;
8479 END IF;
8480
8481 -------------------------------------------------------------------------
8482 -- End partial period computation logic
8483 -- Date 09-MAY-2005
8484 -------------------------------------------------------------------------
8485
8486 IF l_line_rec.billing_schedule_type IS NULL then
8487 RETURN;
8488 END IF;
8489 ----make sll tbl
8490
8491 l_index := 1;
8492 l_sll_in_tbl.DELETE;
8493
8494 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
8495 LOOP
8496 l_sll_in_tbl(l_index).id := l_Line_SlL_rec.id;
8497 l_sll_in_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
8498
8499 l_sll_in_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
8500 l_sll_in_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
8501 l_sll_in_tbl(l_index).uom := l_Line_SlL_rec.uom_code;
8502 l_sll_in_tbl(l_index).seq_no := l_Line_SlL_rec.sequence_no;
8503 l_sll_in_tbl(l_index).Dt_start := l_Line_SlL_rec.Start_Date;
8504 IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
8505
8506 l_sll_in_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
8507 ELSE
8508 l_update_end_date := 'Y';
8509 l_sll_in_tbl(l_index).end_Date := OKC_TIME_UTIL_PUB.get_enddate(
8510 l_Line_SlL_rec.Start_Date,
8511 l_Line_SlL_rec.UOM_CODE,
8512 l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
8513 END IF;
8514
8515
8516 l_sll_in_tbl(l_index).level_period := l_Line_SlL_rec.level_periods;
8517 l_sll_in_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
8518 l_sll_in_tbl(l_index).amount := l_Line_SlL_rec.level_amount;
8519 l_sll_in_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
8520 l_sll_in_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
8521
8522 l_index := l_index + 1;
8523 END LOOP;
8524
8525 IF l_sll_in_tbl.COUNT = 0 THEN
8526 RETURN;
8527 END IF;
8528
8529 IF l_update_end_date = 'Y' THEN ---Migrated
8530 OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id => p_top_line_id,
8531 p_chr_id => NULL,
8532 x_return_status => x_return_status);
8533
8534 IF x_return_status <> 'S' THEN
8535 RETURN;
8536 END IF;
8537 END IF;
8538
8539 -----errorout_ad('SLL found');
8540
8541
8542
8543 -------------------------------------------------------------------------
8544 -- Begin partial period computation logic
8545 -- Developer Mani Choudhary
8546 -- Date 09-MAY-2005
8547 -------------------------------------------------------------------------
8548 Create_Subcription_LvlEle
8549 (p_billing_type => l_line_rec.billing_schedule_type,
8550 p_sll_tbl => l_sll_in_tbl,
8551 p_line_rec => l_top_line_rec,
8552 p_term_dt => l_line_rec.line_term_dt,
8553 p_invoice_ruleid => l_line_rec.inv_rule_id,
8554 p_period_start => l_period_start,
8555 p_period_type => l_period_type,
8556 x_return_status => x_return_status);
8557
8558 IF x_return_status <> 'S' THEN
8559 RAISE G_EXCEPTION_HALT_VALIDATION;
8560 END IF;
8561
8562
8563
8564 EXCEPTION
8565 WHEN G_EXCEPTION_HALT_VALIDATION THEN
8566 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8567 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8568 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8569 RAISE OKC_API.G_EXCEPTION_ERROR;
8570 END IF;
8571 WHEN OTHERS THEN
8572 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
8573 p_msg_name => G_UNEXPECTED_ERROR,
8574 p_token1 => G_SQLCODE_TOKEN,
8575 p_token1_value => sqlcode,
8576 p_token2 => G_SQLERRM_TOKEN,
8577 p_token2_value => sqlerrm);
8578
8579 x_return_status := G_RET_STS_UNEXP_ERROR;
8580
8581 END Create_Subcription_bs;
8582
8583
8584 FUNCTION Find_term_amt(p_cycle_st_dt IN DATE,
8585 p_term_dt IN DATE,
8586 p_cycle_end_dt IN DATE,
8587 p_amount IN NUMBER) RETURN NUMBER
8588
8589
8590 IS
8591 l_cal_amt NUMBER;
8592 l_term_days NUMBER;
8593 l_cycle_days NUMBER;
8594
8595
8596 BEGIN
8597
8598 l_cal_amt := 0;
8599
8600 l_term_days := trunc(p_term_dt) - TRUNC(p_cycle_st_dt);
8601 l_cycle_days := trunc(p_cycle_end_dt) - TRUNC(p_cycle_st_dt) + 1;
8602
8603 -----errorout_ad('l_term_days = ' || l_term_days);
8604
8605 l_cal_amt := (NVL(p_amount,0) * l_term_days)/ NVL(l_cycle_days,1) ;
8606
8607 -----errorout_ad('l_cal_amt = ' || l_cal_amt);
8608
8609 RETURN OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_cal_amt, l_currency_code);
8610
8611 EXCEPTION
8612 WHEN NO_DATA_FOUND THEN
8613 RETURN NULL;
8614 WHEN OTHERS THEN
8615 RETURN NULL;
8616
8617 END Find_term_amt;
8618
8619 PROCEDURE Get_SLL_info(p_top_line_id IN NUMBER,
8620 p_line_id IN NUMBER,
8621 x_sll_tbl OUT NOCOPY StrmLvl_Out_tbl,
8622 x_sll_db_tbl OUT NOCOPY OKS_BILL_SCH.StreamLvl_tbl,
8623 x_return_status OUT NOCOPY VARCHAR2)
8624
8625 IS
8626
8627
8628 CURSOR l_line_sll_csr IS
8629 SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
8630 uom_per_period, uom_code, TRUNC(end_date) end_date,
8631 interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
8632 chr_id, level_amount
8633 FROM OKS_STREAM_LEVELS_B
8634 WHERE cle_id = p_line_id
8635 ORDER BY sequence_no;
8636
8637 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
8638 l_index NUMBER;
8639 l_Line_Sll_rec l_Line_Sll_csr%ROWTYPE;
8640 l_update_end_date VARCHAR2(1) := 'N';
8641
8642
8643 BEGIN
8644 l_update_end_date := 'N';
8645 l_sll_tbl.DELETE;
8646 l_index := 1;
8647 x_return_status := 'S';
8648 ----make sll tbl
8649
8650 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
8651 LOOP
8652 l_sll_tbl(l_index).id := l_Line_SlL_rec.id;
8653 l_sll_tbl(l_index).cle_id := l_Line_SlL_rec.cle_id;
8654
8655 l_sll_tbl(l_index).chr_id := l_Line_SlL_rec.chr_id;
8656 l_sll_tbl(l_index).dnz_chr_id := l_Line_SlL_rec.dnz_chr_id;
8657 l_sll_tbl(l_index).uom_code := l_Line_SlL_rec.uom_code;
8658 l_sll_tbl(l_index).sequence_no := l_Line_SlL_rec.sequence_no;
8659 l_sll_tbl(l_index).Start_Date := l_Line_SlL_rec.Start_Date;
8660
8661 IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
8662
8663 l_sll_tbl(l_index).end_Date := l_Line_SlL_rec.end_Date;
8664 ELSE
8665 l_update_end_date := 'Y';
8666 l_sll_tbl(l_index).end_Date := OKC_TIME_UTIL_PUB.get_enddate(
8667 l_Line_SlL_rec.Start_Date,
8668 l_Line_SlL_rec.UOM_CODE,
8669 l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
8670 END IF;
8671
8672 l_sll_tbl(l_index).level_periods := l_Line_SlL_rec.level_periods;
8673 l_sll_tbl(l_index).uom_per_period := l_Line_SlL_rec.uom_per_period;
8674 l_sll_tbl(l_index).level_amount := l_Line_SlL_rec.level_amount;
8675 l_sll_tbl(l_index).invoice_offset_days := l_Line_SlL_rec.invoice_offset_days;
8676 l_sll_tbl(l_index).interface_offset_days := l_Line_SlL_rec.interface_offset_days;
8677
8678 l_index := l_index + 1;
8679 END LOOP;
8680
8681 IF l_sll_tbl.COUNT = 0 THEN
8682 RETURN;
8683 END IF;
8684
8685 IF l_update_end_date = 'Y' THEN ---Migrated
8686 OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id => p_top_line_id,
8687 p_chr_id => NULL,
8688 x_return_status => x_return_status);
8689
8690 IF x_return_status <> 'S' THEN
8691 RETURN;
8692 END IF;
8693 END IF;
8694
8695
8696 x_sll_db_tbl := l_sll_tbl;
8697
8698 l_index := 0;
8699 x_sll_tbl.delete ;
8700
8701
8702 l_index := 0;
8703
8704
8705 FOR l_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
8706 LOOP
8707
8708 x_sll_tbl(l_index).id := l_sll_tbl(l_index).id ;
8709 x_sll_tbl(l_index).cle_id := l_sll_tbl(l_index).cle_id;
8710 x_sll_tbl(l_index).chr_id := l_sll_tbl(l_index).chr_id ;
8711 x_sll_tbl(l_index).dnz_chr_id := l_sll_tbl(l_index).dnz_chr_id;
8712 x_sll_tbl(l_index).uom := l_sll_tbl(l_index).uom_code ;
8713 x_sll_tbl(l_index).seq_no := l_sll_tbl(l_index).sequence_no;
8714 x_sll_tbl(l_index).Dt_start := l_sll_tbl(l_index).Start_Date ;
8715 x_sll_tbl(l_index).end_Date := l_sll_tbl(l_index).end_Date ;
8716 x_sll_tbl(l_index).level_period := l_sll_tbl(l_index).level_periods ;
8717 x_sll_tbl(l_index).uom_per_period := l_sll_tbl(l_index).uom_per_period ;
8718 x_sll_tbl(l_index).amount := l_sll_tbl(l_index).level_amount;
8719 x_sll_tbl(l_index).invoice_offset_days := l_sll_tbl(l_index).invoice_offset_days;
8720 x_sll_tbl(l_index).interface_offset_days := l_sll_tbl(l_index).interface_offset_days ;
8721 END LOOP;
8722
8723
8724
8725 END Get_SLL_info;
8726
8727
8728
8729 Procedure Terminate_bill_sch
8730 (
8731 p_top_line_id IN NUMBER,
8732 p_sub_line_id IN NUMBER,
8733 p_term_dt IN DATE,
8734 x_return_status OUT NOCOPY Varchar2,
8735 x_msg_count OUT NOCOPY NUMBER,
8736 x_msg_data OUT NOCOPY VARCHAR2)
8737 IS
8738
8739 Cursor l_Line_Csr Is
8740 SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
8741 TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
8742 line.inv_rule_id inv_rule_id, line.cle_id cle_id,
8743 dtl.billing_schedule_type billing_schedule_type,
8744 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
8745 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt
8746 FROM okc_k_lines_b line, oks_k_lines_b dtl
8747 WHERE line.id = dtl.cle_id AND line.Id = p_top_line_id
8748 AND line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
8749 -- Ignore cancelled topline
8750
8751
8752
8753
8754 Cursor l_all_subLine_Csr(l_line_id number, l_style_id number) Is
8755 SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
8756 TRUNC(line.end_date) cp_end_dt, TRUNC(line.date_terminated) cp_prev_term_dt,
8757 dtl.billing_schedule_type billing_schedule_type,
8758 dtl.full_credit full_credit,lse_id cp_lse_id,dtl.price_uom,
8759 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
8760 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) subline_amt
8761 FROM okc_k_lines_b line, oks_k_lines_b dtl
8762 WHERE line.cle_id = l_line_id
8763 AND line.id = dtl.cle_id
8764 AND ((l_style_id = 1 and line.lse_id in (35,7,8,9,10,11))
8765 OR (l_style_id = 12 and line.lse_id = 13)
8766 OR (l_style_id = 14 and line.lse_id = 18)
8767 OR (l_style_id = 19 and line.lse_id = 25))
8768 AND line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
8769 -- Ignore cancelled subline
8770
8771
8772 Cursor l_subline_amt_csr (p_id in number) IS
8773 Select line.price_negotiated
8774 from okc_k_lines_b line
8775 where line.id = p_id;
8776
8777 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
8778 SELECT id, trunc(element.date_start) date_start,
8779 amount,trunc(date_end) date_end,
8780 object_version_number,date_transaction,date_to_interface
8781 FROM oks_level_elements element
8782 WHERE cle_id = p_line_id
8783 ORDER BY date_start;
8784
8785
8786
8787 Cursor l_SubLine_Csr Is
8788 SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
8789 TRUNC(line.end_date) cp_end_dt, dtl.billing_schedule_type billing_schedule_type,dtl.price_uom,
8790 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
8791 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) subline_amt
8792 FROM okc_k_lines_b line, oks_k_lines_b dtl
8793 WHERE line.id = p_sub_line_id
8794 AND line.id = dtl.cle_id
8795 AND line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
8796 -- Ignore cancelled subline
8797
8798
8799 l_Line_rec l_Line_Csr%ROWTYPE;
8800 l_all_subLine_rec l_all_subLine_Csr%ROWTYPE;
8801 l_subLine_rec l_subLine_csr%ROWTYPE;
8802 l_line_BS_rec l_line_BS_csr%ROWTYPE;
8803
8804
8805
8806 l_index NUMBER;
8807 l_top_line_rec Line_Det_Type;
8808 l_cp_rec Prod_Det_Type;
8809 l_inv_id number;
8810 l_prev_term_dt date;
8811
8812 l_sll_in_tbl StrmLvl_Out_tbl;
8813 l_sll_db_tbl oks_bill_sch.StreamLvl_tbl;
8814 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
8815
8816 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
8817
8818 -------------------------------------------------------------------------
8819 -- Begin partial period computation logic
8820 -- Developer Mani Choudhary
8821 -- Date 04-MAY-2005
8822 -------------------------------------------------------------------------
8823 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
8824 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
8825 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
8826 l_return_status VARCHAR2(30);
8827 l_tangible BOOLEAN;
8828 l_pricing_method VARCHAR2(30);
8829 -------------------------------------------------------------------------
8830 -- End partial period computation logic
8831 -- Date 04-MAY-2005
8832 -------------------------------------------------------------------------
8833
8834
8835 BEGIN
8836
8837
8838 --if called for top line p_sub_line_id is null or -100
8839 --if p_sub_line_id = -100 that means full credit, create top line bs upto term date
8840 --and subline which are not already terminated, consider term dt as start dt of subline.
8841 --so that subline will have only billed lvl elements.
8842
8843 --if called for subline termination,if full credit termination program will pass
8844 --p_term_dt as start date otherwise actual term dt.
8845
8846
8847 x_return_status := 'S';
8848
8849 IF p_term_dt IS NULL THEN
8850 RETURN;
8851 END IF;
8852
8853 ---get line details
8854 Open l_Line_Csr;
8855 Fetch l_Line_Csr Into l_Line_Rec;
8856
8857 If l_Line_Csr%Notfound then
8858 Close l_Line_Csr;
8859 x_return_status := 'E';
8860 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
8861 RAISE G_EXCEPTION_HALT_VALIDATION;
8862 End If;
8863 Close l_Line_Csr;
8864
8865 l_top_line_rec.chr_id := l_Line_Rec.chr_id;
8866 l_top_line_rec.dnz_chr_id := l_Line_Rec.dnz_chr_id;
8867 l_top_line_rec.id := l_Line_Rec.id ;
8868 l_top_line_rec.cle_id := l_Line_Rec.cle_id ;
8869 l_top_line_rec.lse_id := l_Line_Rec.lse_id;
8870 l_top_line_rec.line_start_dt := l_Line_Rec.line_start_dt;
8871 l_top_line_rec.line_end_dt := l_Line_Rec.line_end_dt;
8872 l_top_line_rec.line_amt := l_Line_Rec.line_amt ;
8873 -------------------------------------------------------------------------
8874 -- Begin partial period computation logic
8875 -- Developer Mani Choudhary
8876 -- Date 09-MAY-2005
8877 -------------------------------------------------------------------------
8878
8879
8880 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
8881 (
8882 p_hdr_id => l_Line_Rec.dnz_chr_id,
8883 p_org_id => NULL,
8884 x_period_start => l_period_start,
8885 x_period_type => l_period_type,
8886 x_price_uom => l_price_uom,
8887 x_return_status => x_return_status);
8888
8889 IF x_return_status <> 'S' THEN
8890 RAISE G_EXCEPTION_HALT_VALIDATION;
8891 END IF;
8892
8893 --Description in detail for the business rules for deriving the period start
8894 --1)For usage , period start will always be 'SERVICE'
8895 --2)For Subscriptions, period start and period type will be NULL
8896 -- for tangible subscriptions as per CR1.For intangible subscriptions,
8897 -- if the profile OKS: Intangible Subscription Pricing Method
8898 -- is set to 'Subscription Based',then period start and period type will be NULL
8899 -- otherwise it will be 'SERVICE'
8900 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
8901 --mchoudha fix for bug#5183011
8902 IF l_period_start IS NOT NULL AND
8903 l_period_type IS NOT NULL
8904 THEN
8905 IF l_top_line_rec.lse_id = 12 THEN
8906 l_period_start := 'SERVICE';
8907 END IF;
8908 IF l_top_line_rec.lse_id = 46 THEN
8909 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_top_line_id);
8910 IF l_tangible THEN
8911 l_period_start := NULL;
8912 l_period_type := NULL;
8913 ELSE
8914 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
8915 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
8916 l_period_start := NULL;
8917 l_period_type := NULL;
8918 ELSE
8919 l_period_start := 'SERVICE';
8920 END IF; --l_pricing_method <> 'EFFECTIVITY'
8921 END IF; --IF l_tangible
8922 END IF; --IF l_top_line_rec.lse_id = 46
8923 END IF; --IF l_period_start IS NOT NULL
8924 -------------------------------------------------------------------------
8925 -- End partial period computation logic
8926 -- Date 09-MAY-2005
8927 -------------------------------------------------------------------------
8928 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8929
8930 fnd_log.STRING (fnd_log.level_statement,
8931 G_MODULE_CURRENT || '.terminate_bill_sch.line_dtls',
8932 'dnz_chr_id = ' || l_line_rec.dnz_chr_id
8933 || ', id = ' || l_line_rec.id
8934 || ', lse_id = ' || l_line_rec.lse_id
8935 || ', start dt = ' || l_line_rec.line_start_dt
8936 || ', end dt = ' || l_line_rec.line_end_dt
8937 || ', amt = ' || l_line_rec.line_amt
8938 || ', p_sub_line_id = ' || p_sub_line_id
8939 || ', p_term_dt = ' || p_term_dt
8940 || ', bill type = '|| l_Line_Rec.billing_schedule_type
8941 || ', inv rule = '|| l_line_rec.inv_rule_id
8942 );
8943 END IF;
8944
8945
8946 --get currency
8947 l_currency_code := Find_Currency_Code(
8948 p_cle_id => p_top_line_id,
8949 p_chr_id => NULL);
8950
8951 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8952
8953 fnd_log.STRING (fnd_log.level_statement,
8954 G_MODULE_CURRENT || '.terminate_bill_sch.line_dtls',
8955 'l_currency_code = ' || l_currency_code);
8956 END IF;
8957
8958 IF l_currency_code IS NULL THEN
8959 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
8960 x_return_status := 'E';
8961 RAISE G_EXCEPTION_HALT_VALIDATION;
8962 END IF;
8963
8964
8965
8966
8967 --for top line first call create_lvl_ele only for top line
8968 ---and then in loop call for all subline.
8969
8970 IF p_sub_line_id IS NULL OR p_sub_line_id = -100 THEN
8971 l_sll_in_tbl.DELETE;
8972 l_index := 1;
8973
8974 IF TRUNC(p_term_dt) > l_top_line_rec.line_end_dt THEN
8975 RETURN;
8976 END IF;
8977
8978 Get_SLL_info(p_top_line_id => p_top_line_id,
8979 p_line_id => p_top_line_id,
8980 x_sll_tbl => l_sll_in_tbl,
8981 x_sll_db_tbl => l_sll_db_tbl,
8982 x_return_status => x_return_status );
8983
8984 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
8985 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.line_sll',
8986 'Get_SLL_info(x_return_status = '||x_return_status
8987 ||', sll tbl count = '||l_sll_in_tbl.count||')');
8988 END IF;
8989
8990
8991 IF x_return_status <> 'S' THEN
8992 RAISE G_EXCEPTION_HALT_VALIDATION;
8993 END IF;
8994 -----errorout_ad('l_sll_in_tbl count for top line = ' || l_sll_in_tbl.count);
8995
8996 IF l_sll_in_tbl.count= 0 OR l_line_rec.billing_schedule_type IS NULL THEN
8997 RETURN;
8998 END IF;
8999
9000 -------------------------------------------------------------------------
9001 -- Begin partial period computation logic
9002 -- Developer Mani Choudhary
9003 -- Date 09-MAY-2005
9004 -- Added two new parameters p_period_start and p_period_type
9005 -------------------------------------------------------------------------
9006 Create_Level_elements(p_billing_type => NVL(l_line_rec.billing_schedule_type,'T'),
9007 p_sll_tbl => l_sll_in_tbl,
9008 p_line_rec => l_top_line_rec,
9009 p_invoice_ruleid => l_line_rec.inv_rule_id,
9010 p_term_dt => p_term_dt,
9011 p_period_start => l_period_start,
9012 p_period_type => l_period_type,
9013 x_return_status => x_return_status );
9014
9015 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9016 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.top_lvl_ele',
9017 'Create_Level_elements(x_return_status = '||x_return_status
9018 ||')');
9019 END IF;
9020
9021 IF x_return_status <> 'S' THEN
9022 RAISE G_EXCEPTION_HALT_VALIDATION;
9023 END IF;
9024
9025 IF l_line_rec.billing_schedule_type IN ('T','E') THEN
9026 l_top_bs_tbl.DELETE;
9027 l_index := 1;
9028
9029 FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
9030 LOOP
9031 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
9032 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
9033 l_top_bs_tbl(l_index).date_end := l_line_bs_rec.date_end;
9034 l_top_bs_tbl(l_index).Amount := 0;
9035 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
9036 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
9037 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
9038
9039 l_index := l_index + 1;
9040 END LOOP;
9041 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9042
9043 fnd_log.STRING (fnd_log.level_statement,
9044 G_MODULE_CURRENT || '.terminate_bill_sch.top_bs',
9045 'top bs tbl count = ' || l_top_bs_tbl.count);
9046 END IF;
9047 END IF; -----end of 'T'
9048
9049
9050 --if schedule is for top level line then find sub line and repeat THE process.
9051 IF l_Line_Rec.chr_id is not null AND l_Line_Rec.lse_id IN (1, 12, 14, 19) then
9052
9053 FOR l_all_SubLine_rec IN l_all_SubLine_Csr(l_Line_Rec.id,l_Line_Rec.lse_id)
9054 LOOP
9055
9056 l_cp_rec.cp_id := l_all_SubLine_rec.subline_id ;
9057 l_cp_rec.cp_start_dt := l_all_SubLine_rec.cp_start_dt;
9058 l_cp_rec.cp_end_dt := l_all_SubLine_rec.cp_end_dt ;
9059 l_cp_rec.cp_amt := l_all_SubLine_rec.subline_amt ;
9060 l_cp_rec.cp_price_uom := l_all_SubLine_rec.price_uom;
9061 l_cp_rec.cp_lse_id := l_all_SubLine_rec.cp_lse_id;
9062 l_cp_rec.cp_price_uom := l_all_SubLine_rec.price_uom;
9063
9064 IF l_period_type is not null AND l_period_start is not NULL THEN
9065 OPEN l_subline_amt_csr(l_all_SubLine_rec.subline_id);
9066 FETCH l_subline_amt_csr INTO l_cp_rec.cp_amt;
9067 CLOSE l_subline_amt_csr;
9068 END IF;
9069 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9070
9071 fnd_log.STRING (fnd_log.level_statement,
9072 G_MODULE_CURRENT || '.terminate_bill_sch.loop_cp_dtl',
9073 'id = ' || l_all_SubLine_rec.subline_id
9074 || ', start dt = ' || l_all_SubLine_rec.cp_start_dt
9075 || ', end dt = ' || l_all_SubLine_rec.cp_end_dt
9076 || ', amt = ' || l_all_SubLine_rec.subline_amt
9077 || ', previous cp_term_dt = ' || l_all_subline_rec.cp_prev_term_dt
9078 );
9079 END IF;
9080
9081
9082
9083 IF TRUNC(p_term_dt) > l_cp_rec.cp_end_dt THEN
9084 IF l_line_rec.billing_schedule_type IN ('T', 'E') and l_top_bs_tbl.count > 0 THEN
9085
9086 Rollup_lvl_amt(
9087 p_Line_Rec =>l_top_line_rec,
9088 p_SubLine_rec => l_cp_rec,
9089 p_top_line_bs => l_top_bs_tbl,
9090 x_return_status => x_return_status);
9091
9092 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9093 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.adj_lvl_amt',
9094 'Rollup_lvl_amt(x_return_status = '||x_return_status
9095 ||')');
9096 END IF;
9097
9098 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9099 RAISE G_EXCEPTION_HALT_VALIDATION;
9100 END IF;
9101 END IF;
9102
9103 ELSE --term_dt < end date
9104
9105 l_sll_in_tbl.DELETE;
9106 l_prev_term_dt := NULL; ---for bug#3254423
9107
9108 Get_SLL_info(p_top_line_id => p_top_line_id,
9109 p_line_id => l_cp_rec.cp_id,
9110 x_sll_tbl => l_sll_in_tbl,
9111 x_sll_db_tbl => l_sll_db_tbl,
9112 x_return_status => x_return_status );
9113
9114 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9115 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_sll',
9116 'Get_SLL_info(x_return_status = '||x_return_status
9117 ||', sll tbl count = '||l_sll_in_tbl.count||')');
9118 END IF;
9119
9120 IF x_return_status <> 'S' THEN
9121 RAISE G_EXCEPTION_HALT_VALIDATION;
9122 END IF;
9123
9124 IF l_sll_in_tbl.count= 0 THEN
9125 RETURN;
9126 END IF;
9127
9128 ---if sub line is already terminated
9129 IF l_all_subline_rec.cp_prev_term_dt IS NOT NULL THEN
9130 IF nvl(l_all_SubLine_rec.full_credit, 'N') = 'Y' THEN
9131 --with full credit change the term dt as subline start dt
9132 l_prev_term_dt := l_cp_rec.cp_start_dt;
9133 ELSE
9134 l_prev_term_dt := l_all_subline_rec.cp_prev_term_dt;
9135 END IF;
9136 ELSE --sub line not terminated already
9137
9138 IF nvl(p_sub_line_id, 100) = -100 THEN --full credit flag
9139 l_prev_term_dt := l_cp_rec.cp_start_dt;
9140 END IF;
9141
9142 END IF; ---chk subline already terminated
9143
9144 -------------------------------------------------------------------------
9145 -- Begin partial period computation logic
9146 -- Developer Mani Choudhary
9147 -- Date 09-MAY-2005
9148 -- Added two new parameters p_period_start and p_period_type
9149 -------------------------------------------------------------------------
9150 Create_cp_lvl_elements
9151 ( p_billing_type => NVL(l_line_rec.billing_schedule_type,'T'),
9152 p_cp_sll_tbl => l_sll_in_tbl,
9153 p_Line_Rec => l_top_line_rec,
9154 p_SubLine_rec => l_cp_Rec,
9155 p_invoice_rulid => l_line_rec.inv_rule_id,
9156 p_top_line_bs => l_top_bs_tbl,
9157 p_term_dt => nvl(l_prev_term_dt,p_term_dt),
9158 p_period_start => l_period_start,
9159 p_period_type => l_period_type,
9160 x_return_status => x_return_status);
9161
9162 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9163 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_lvl_ele',
9164 'Create_cp_lvl_elements(x_return_status = '||x_return_status
9165 ||', l_prev_term_dt = '||l_prev_term_dt
9166 ||', p_term_dt = ' || p_term_dt ||' , l_period_start '||l_period_start||', l_period_type '||l_period_type||')');
9167 END IF;
9168
9169
9170 IF x_return_status <> 'S' THEN
9171 RAISE G_EXCEPTION_HALT_VALIDATION;
9172 END IF;
9173 END IF; ----end of term_dt > end date
9174 END LOOP;
9175 END IF; ---END OF SUBLINE LOOP
9176
9177
9178 IF l_top_bs_tbl.COUNT >0 THEN ---only for type 'T' l_top_bs_tbl will be having records
9179 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
9180 p_api_version => l_api_version,
9181 p_init_msg_list => l_init_msg_list,
9182 x_return_status => x_return_status,
9183 x_msg_count => x_msg_count,
9184 x_msg_data => x_msg_data,
9185 p_letv_tbl => l_top_bs_tbl,
9186 x_letv_tbl => l_lvl_ele_tbl_out);
9187
9188 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9189 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.update_bs',
9190 'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status
9191 ||', top bs count = '||l_lvl_ele_tbl_out.count ||')');
9192 END IF;
9193
9194 IF x_return_status <> 'S' THEN
9195 RAISE G_EXCEPTION_HALT_VALIDATION;
9196 END IF;
9197 END IF; ----end of l_top_bs_tbl.COUNT >0
9198
9199 ELSE ---if only one subline is terminated
9200
9201 ----get subline
9202 Open l_SubLine_Csr;
9203 FETCH l_SubLine_Csr Into l_SubLine_Rec;
9204 If l_SubLine_Csr%Notfound then
9205 Close l_SubLine_Csr;
9206 x_return_status := 'E';
9207 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'SUB LINE NOT FOUND');
9208 RAISE G_EXCEPTION_HALT_VALIDATION;
9209 End If;
9210 Close l_SubLine_Csr;
9211
9212 l_cp_rec.cp_id := l_SubLine_rec.subline_id ;
9213 l_cp_rec.cp_start_dt := l_SubLine_rec.cp_start_dt;
9214 l_cp_rec.cp_end_dt := l_SubLine_rec.cp_end_dt ;
9215 l_cp_rec.cp_amt := l_SubLine_rec.subline_amt ;
9216 l_cp_rec.cp_price_uom := l_SubLine_rec.price_uom;
9217 IF l_period_type is not null AND l_period_start is not NULL THEN
9218 OPEN l_subline_amt_csr(l_SubLine_rec.subline_id);
9219 FETCH l_subline_amt_csr INTO l_cp_rec.cp_amt;
9220 CLOSE l_subline_amt_csr;
9221 END IF;
9222 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9223
9224 fnd_log.STRING (fnd_log.level_statement,
9225 G_MODULE_CURRENT || '.terminate_bill_sch.cp_dtl',
9226 'id = ' || l_all_SubLine_rec.subline_id
9227 || ', start dt = ' || l_SubLine_rec.cp_start_dt
9228 || ', end dt = ' || l_SubLine_rec.cp_end_dt
9229 || ', amt = ' || l_SubLine_rec.subline_amt
9230 );
9231 END IF;
9232
9233
9234 IF TRUNC(p_term_dt) > l_cp_rec.cp_end_dt THEN
9235 RETURN;
9236 END IF;
9237
9238
9239 l_sll_in_tbl.DELETE;
9240
9241 Get_SLL_info(p_top_line_id => p_top_line_id,
9242 p_line_id => p_sub_line_id,
9243 x_sll_tbl => l_sll_in_tbl,
9244 x_sll_db_tbl => l_sll_db_tbl,
9245 x_return_status => x_return_status );
9246
9247 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9248 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_sll',
9249 'Get_SLL_info(x_return_status = '||x_return_status
9250 ||', sll tbl count = '||l_sll_in_tbl.count||')');
9251 END IF;
9252
9253 IF x_return_status <> 'S' THEN
9254 RAISE G_EXCEPTION_HALT_VALIDATION;
9255 END IF;
9256
9257 IF l_sll_in_tbl.count= 0 OR l_subline_rec.billing_schedule_type IS NULL THEN
9258 RETURN;
9259 END IF;
9260
9261 IF l_subline_rec.billing_schedule_type IN ('T','E') THEN
9262 l_top_bs_tbl.DELETE;
9263 l_index := 1;
9264
9265 FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
9266 LOOP
9267 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
9268 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
9269 l_top_bs_tbl(l_index).date_end := l_line_bs_rec.date_end;
9270 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
9271 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
9272 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
9273 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
9274
9275
9276 l_index := l_index + 1;
9277 END LOOP;
9278
9279 IF l_top_bs_tbl.COUNT > 0 THEN
9280
9281 Adjust_top_BS_Amt( p_Line_Rec => l_top_Line_Rec,
9282 p_SubLine_rec => l_cp_Rec,
9283 p_top_line_bs => l_top_bs_tbl,
9284 x_return_status => x_return_status);
9285
9286 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9287 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.adjust_cp_amt',
9288 'Adjust_top_BS_Amt(x_return_status = '||x_return_status ||')');
9289 END IF;
9290
9291 IF x_return_status <> 'S' THEN
9292 RAISE G_EXCEPTION_HALT_VALIDATION;
9293 END IF;
9294 END IF;
9295
9296 END IF; ---end of T
9297
9298 -------------------------------------------------------------------------
9299 -- Begin partial period computation logic
9300 -- Developer Mani Choudhary
9301 -- Date 09-MAY-2005
9302 -- Added two new parameters p_period_start and p_period_type
9303 -------------------------------------------------------------------------
9304 Create_cp_lvl_elements
9305 ( p_billing_type => NVL(l_subline_rec.billing_schedule_type,'T'),
9306 p_cp_sll_tbl => l_sll_in_tbl,
9307 p_Line_Rec => l_top_line_rec,
9308 p_SubLine_rec => l_cp_Rec,
9309 p_invoice_rulid => l_line_rec.inv_rule_id,
9310 p_top_line_bs => l_top_bs_tbl,
9311 p_term_dt => p_term_dt,
9312 p_period_start => l_period_start,
9313 p_period_type => l_period_type,
9314 x_return_status => x_return_status);
9315
9316 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9317 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_bs',
9318 'Create_cp_lvl_elements(x_return_status = '||x_return_status ||')');
9319 END IF;
9320
9321 IF x_return_status <> 'S' THEN
9322 RAISE G_EXCEPTION_HALT_VALIDATION;
9323 END IF;
9324
9325 IF l_subline_rec.billing_schedule_type IN ('E','T') AND l_top_bs_tbl.COUNT > 0 then
9326 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
9327 p_api_version => l_api_version,
9328 p_init_msg_list => l_init_msg_list,
9329 x_return_status => x_return_status,
9330 x_msg_count => x_msg_count,
9331 x_msg_data => x_msg_data,
9332 p_letv_tbl => l_top_bs_tbl,
9333 x_letv_tbl => l_lvl_ele_tbl_out);
9334
9335 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9336 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.update_bs',
9337 'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status
9338 ||', top bs count = '||l_lvl_ele_tbl_out.count ||')');
9339 END IF;
9340
9341 IF x_return_status <> 'S' THEN
9342 RAISE G_EXCEPTION_HALT_VALIDATION;
9343 END IF;
9344 END IF; ---END OF update of top line sch
9345
9346 end if; ---end of p_sub_line_id null
9347
9348
9349
9350 EXCEPTION
9351 WHEN G_EXCEPTION_HALT_VALIDATION THEN
9352 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
9353 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
9354 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
9355 RAISE OKC_API.G_EXCEPTION_ERROR;
9356 END IF;
9357 WHEN OTHERS THEN
9358 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
9359 p_msg_name => G_UNEXPECTED_ERROR,
9360 p_token1 => G_SQLCODE_TOKEN,
9361 p_token1_value => sqlcode,
9362 p_token2 => G_SQLERRM_TOKEN,
9363 p_token2_value => sqlerrm);
9364
9365 x_return_status := G_RET_STS_UNEXP_ERROR;
9366
9367 END Terminate_bill_sch;
9368
9369
9370 -------------------------------------------------------------------------
9371 -- Begin partial period computation logic
9372 -- Developer Mani Choudhary
9373 -- Date 09-MAY-2005
9374 -------------------------------------------------------------------------
9375 PROCEDURE Create_cp_lvl_elements
9376 ( p_billing_type IN VARCHAR2,
9377 p_cp_sll_tbl IN StrmLvl_Out_tbl,
9378 p_Line_Rec IN Line_Det_Type,
9379 p_SubLine_rec IN Prod_Det_Type,
9380 p_invoice_rulid IN Number,
9381 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
9382 p_term_dt IN DATE,
9383 p_period_start IN VARCHAR2,
9384 p_period_type IN VARCHAR2,
9385 x_return_status OUT NOCOPY Varchar2
9386 )
9387 IS
9388
9389 l_cp_sll_countER Number;
9390 l_period_counter Number;
9391 l_next_cycle_dt Date;
9392 l_tot_amt Number;
9393 l_cp_sll_last Number;
9394 l_lvl_amt Number;
9395 l_adjusted_amt Number;
9396 l_lvl_loop_counter Number;
9397 l_last_cycle_dt Date;
9398 l_bill_sch_amt NUMBER :=0;
9399 l_uom_quantity NUMBER;
9400 l_tce_code VARCHAR2(100) ;
9401 l_period_freq NUMBER;
9402 l_constant_sll_amt NUMBER;
9403 l_tbl_seq number;
9404 l_remaining_amt number;
9405 l_tbs_ind NUMBER;
9406 l_bill_end_date DATE;
9407 l_element_end_dt DATE;
9408 l_term_amt NUMBER;
9409 l_compare_dt DATE;
9410 i number;
9411 l_end_date DATE;
9412 l_billed_at_source OKC_K_HEADERS_ALL_B.BILLED_AT_SOURCE%TYPE;
9413 --
9414 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
9415 l_return_status VARCHAR2(1);
9416 l_msg_count NUMBER;
9417 l_msg_data VARCHAR2(2000);
9418 l_msg_index_out NUMBER;
9419 l_msg_index NUMBER;
9420
9421 -- Start - Added by PMALLARA - Bug #3992530
9422 Lvl_Element_cnt Number := 0;
9423 Strm_Start_Date Date;
9424 -- End - Added by PMALLARA - Bug #3992530
9425 ------------------------------------------------------------------------
9426 -- Begin partial period computation logic
9427 -- Developer Mani Choudhary
9428 -- Date 17-MAY-2005
9429 -------------------------------------------------------------------------
9430 l_quantity NUMBER;
9431 l_total_quantity NUMBER;
9432 l_duration NUMBER;
9433 l_uom VARCHAR2(30);
9434 l_full_period_end_date DATE;
9435 l_last_cmp_date DATE;
9436 --
9437 --22-MAR-2006 mchoudha Changes for Partial periods CR3
9438 l_running_total NUMBER;
9439
9440 BEGIN
9441 -----errorout_ad('in bill_sch_cp');
9442 x_return_status := 'S';
9443 l_bill_sch_amt := 0;
9444 l_lvl_ele_tbl_in.delete;
9445 l_tbl_seq := 1;
9446 --22-MAR-2006 mchoudha Changes for Partial periods CR3
9447 l_running_total := p_SubLine_rec.cp_amt;
9448 ------------------------------------------------------------------------
9449 -- Begin partial period computation logic
9450 -- Developer Mani Choudhary
9451 -- Date 17-MAY-2005
9452 -- If price UOM is NULL , then derive the UOM based on the effective dates
9453 -- of the subline.
9454 -------------------------------------------------------------------------
9455 IF (p_SubLine_rec.cp_price_uom is null) THEN
9456 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);
9457 END IF;
9458 ------------------------------------------------------------------------
9459 -- End partial period computation logic
9460 -------------------------------------------------------------------------
9461
9462 IF TRUNC(nvl((p_term_dt-1),p_SubLine_rec.cp_end_dt)) > p_SubLine_rec.cp_end_dt THEN
9463 l_end_date := p_SubLine_rec.cp_end_dt;
9464 ELSE
9465 l_end_date := TRUNC(nvl((p_term_dt-1),p_SubLine_rec.cp_end_dt)) ;
9466 END IF;
9467
9468
9469 IF l_header_billing IS NULL THEN
9470 Delete_lvl_element(p_cle_id => p_SubLine_rec.cp_id,
9471 x_return_status => x_return_status);
9472
9473 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9474 RAISE G_EXCEPTION_HALT_VALIDATION;
9475 END IF;
9476 END IF;
9477
9478 ----(terminate dt - 1) < st dt then do not create lvl element.
9479
9480 IF TRUNC(p_SubLine_rec.cp_start_dt) > l_end_date THEN
9481 -----errorout_ad('p_top_line_bs COUNT = '|| p_top_line_bs.COUNT);
9482 IF p_cp_sll_tbl.count > 0 AND p_top_line_bs.COUNT > 0THEN
9483
9484
9485 FOR l_cp_sll_counter IN p_cp_sll_tbl.first .. p_cp_sll_tbl.LAST
9486 LOOP
9487
9488 Check_Existing_Lvlelement(
9489 p_sll_id => p_cp_sll_tbl(l_cp_sll_counter).id,
9490 p_sll_dt_start => p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9491 p_uom => p_cp_sll_tbl(l_cp_sll_counter).uom,
9492 p_uom_per_period => p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9493 p_cp_end_dt => p_SubLine_rec.cp_end_dt,
9494 x_next_cycle_dt => l_next_cycle_dt,
9495 x_last_cycle_dt => l_last_cycle_dt,
9496 x_period_counter => l_period_counter,
9497 x_sch_amt => l_bill_sch_amt,
9498 x_top_line_bs => p_top_line_bs,
9499 x_return_status => x_return_status);
9500
9501 -----errorout_ad('Check_Existing_Lvlelement 1 = '|| x_return_status);
9502 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9503 RAISE G_EXCEPTION_HALT_VALIDATION;
9504 END IF;
9505 END LOOP;
9506 END IF; ---END OF p_cp_sll_tbl.count
9507
9508 x_return_status := 'S';
9509 RETURN;
9510 END IF;
9511
9512 IF p_cp_sll_tbl.count > 0 then
9513
9514 l_cp_sll_counter := p_cp_sll_tbl.FIRST;
9515 L_cp_sll_last := p_cp_sll_tbl.LAST;
9516
9517
9518 LOOP ------LOOP for sll item
9519 -----errorout_ad('SUB LINE START DATE PASSED TO CHECK LEVELEMENT : '||to_char(p_SubLine_rec.cp_start_dt));
9520 -----errorout_ad('passed l_bill_sch_amt = ' || l_bill_sch_amt);
9521
9522 IF l_header_billing IS NOT NULL THEN ----hdr lvl billing no old sll and lvl elements
9523 l_next_cycle_dT := p_cp_sll_tbl(l_cp_sll_counter).dt_start;
9524 l_lvl_loop_counter := 1;
9525 l_period_counter := 1;
9526 ELSE
9527 Check_Existing_Lvlelement(
9528 p_sll_id => p_cp_sll_tbl(l_cp_sll_counter).id,
9529 p_sll_dt_start => p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9530 p_uom => p_cp_sll_tbl(l_cp_sll_counter).uom,
9531 p_uom_per_period => p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9532 p_cp_end_dt => p_SubLine_rec.cp_end_dt,
9533 x_next_cycle_dt => l_next_cycle_dt,
9534 x_last_cycle_dt => l_last_cycle_dt,
9535 x_period_counter => l_period_counter,
9536 x_sch_amt => l_bill_sch_amt,
9537 x_top_line_bs => p_top_line_bs,
9538 x_return_status => x_return_status);
9539
9540 -----errorout_ad('Check_Existing_Lvlelement 2= '|| x_return_status);
9541
9542 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9543 RAISE G_EXCEPTION_HALT_VALIDATION;
9544 END IF;
9545
9546 l_lvl_loop_counter := l_period_counter;
9547
9548
9549 -----errorout_ad('l_period_counter = '|| l_period_counter);
9550 -----errorout_ad('l_last_cycle_dt = ' || l_last_cycle_dt);
9551 -----errorout_ad('l_bill_sch_amt = ' || l_bill_sch_amt);
9552 END IF ;
9553
9554 IF l_period_counter > to_number(p_cp_sll_tbl(l_cp_sll_counter).level_period) THEN
9555
9556 IF l_cp_sll_counter + 1 <= p_cp_sll_tbl.LAST THEN
9557 l_next_cycle_dt := p_cp_sll_tbl(l_cp_sll_counter + 1).dt_start;
9558 ELSE
9559 l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
9560 (p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9561 p_cp_sll_tbl(l_cp_sll_counter).uom,
9562 (p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period *
9563 p_cp_sll_tbl(l_cp_sll_counter).level_period));
9564
9565 l_next_cycle_dt := l_next_cycle_dt + 1;
9566 END IF;
9567
9568 ELSE
9569
9570 -----------errorout_ad('going in');
9571 -----------errorout_ad('l_last_cycle_dt = ' || l_last_cycle_dt);
9572 IF l_next_cycle_dt IS NULL THEN
9573 l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
9574 (l_last_cycle_dt,
9575 p_cp_sll_tbl(l_cp_sll_counter).uom,
9576 p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period);
9577
9578 l_next_cycle_dt := l_next_cycle_dt + 1;
9579
9580 END IF;
9581
9582 ---if cycle start dt is greater then cp end date then exit the procedure.
9583
9584 -----errorout_ad('AFTER CHECK l_next_cycle_dt = '|| l_next_cycle_dt);
9585
9586 IF TRUNC(l_next_cycle_dt) > l_end_date THEN
9587
9588 IF l_cp_sll_counter < p_cp_sll_tbl.LAST AND p_top_line_bs.COUNT > 0 THEN
9589
9590 l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
9591
9592
9593 FOR i IN l_cp_sll_counter .. p_cp_sll_tbl.LAST
9594 LOOP
9595
9596 Check_Existing_Lvlelement(
9597 p_sll_id => p_cp_sll_tbl(i).id,
9598 p_sll_dt_start => p_cp_sll_tbl(i).dt_start,
9599 p_uom => p_cp_sll_tbl(i).uom,
9600 p_uom_per_period => p_cp_sll_tbl(i).uom_per_period,
9601 p_cp_end_dt => p_SubLine_rec.cp_end_dt,
9602 x_next_cycle_dt => l_next_cycle_dt,
9603 x_last_cycle_dt => l_last_cycle_dt,
9604 x_period_counter => l_period_counter,
9605 x_sch_amt => l_bill_sch_amt,
9606 x_top_line_bs => p_top_line_bs,
9607 x_return_status => x_return_status);
9608
9609 -----errorout_ad('Check_Existing_Lvlelement 3= '|| x_return_status);
9610
9611 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9612 RAISE G_EXCEPTION_HALT_VALIDATION;
9613 END IF;
9614 END LOOP;
9615 END IF; ----END OF l_cp_sll_counter < p_cp_sll_tbl.LAST
9616
9617 x_return_status := 'S';
9618 RETURN;
9619
9620 END IF;
9621 IF l_cp_sll_counter < p_cp_sll_tbl.LAST THEN
9622
9623 l_compare_dt := TRUNC(p_cp_sll_tbl(l_cp_sll_counter + 1).dt_start);
9624 ELSE
9625
9626 l_compare_dt := TRUNC( p_SubLine_rec.cp_end_dt) + 1;
9627 END IF;
9628
9629 IF TRUNC(l_next_cycle_dt) >= l_compare_dt THEN
9630
9631 NULL;
9632 -----------errorout_ad('COMING IN');
9633 ELSE
9634
9635 IF p_billing_type = 'T' THEN
9636 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
9637 p_timeunit => p_cp_sll_tbl(l_cp_sll_counter).uom,
9638 x_return_status => x_return_status,
9639 x_quantity => l_uom_quantity ,
9640 x_timeunit => l_tce_code);
9641
9642 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9643 RAISE G_EXCEPTION_HALT_VALIDATION;
9644 END IF;
9645
9646
9647 l_remaining_amt := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0);
9648
9649 -------------------------------------------------------------------------
9650 -- Begin partial period computation logic
9651 -- Developer Mani Choudhary
9652 -- Date 17-MAY-2005
9653 -- get the converted unit price per SLL UOM derived from the unit price stored at the
9654 -- subline.
9655 -------------------------------------------------------------------------
9656
9657
9658 IF p_period_start is not null AND
9659 p_period_type is not null
9660 THEN
9661 --new procedure for CALENDAR START and service start
9662 --30-DEC-2005 mchoudha fixed bug#4895586
9663 --Added an extra parameter termination date to this API
9664 l_constant_sll_amt := OKS_BILL_SCH.Get_Unit_Price_Per_Uom
9665 (p_SubLine_rec.cp_id,
9666 p_cp_sll_tbl(l_cp_sll_counter).uom,
9667 p_period_start,
9668 p_period_type,
9669 p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9670 l_end_date,
9671 p_term_dt);
9672
9673 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9674 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements',
9675 'after calling OKS_BILL_SCH.Get_Unit_Price_Per_Uom '
9676 ||' result l_constant_sll_amt = ' || l_constant_sll_amt);
9677 END IF;
9678 IF l_constant_sll_amt IS NULL THEN
9679 x_return_status := G_RET_STS_ERROR;
9680 RAISE G_EXCEPTION_HALT_VALIDATION;
9681 END IF;
9682 --errorout_ad(' l_constant_sll_amt '||l_constant_sll_amt);
9683 ELSE
9684
9685
9686
9687 Get_Constant_sll_Amount(p_line_start_date => p_SubLine_rec.cp_start_dt,
9688 p_line_end_date => p_SubLine_rec.cp_end_dt,
9689 p_cycle_start_date => l_next_cycle_dt,
9690 p_remaining_amount => l_remaining_amt,
9691 P_uom_quantity => l_uom_quantity,
9692 P_tce_code => l_tce_code,
9693 x_constant_sll_amt => l_constant_sll_amt,
9694 x_return_status => x_return_status);
9695 END IF;
9696 -----errorout_ad('Get_Constant_sll_Amount = ' || l_constant_sll_amt);
9697
9698 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9699 RAISE G_EXCEPTION_HALT_VALIDATION;
9700 END IF;
9701 END IF;
9702
9703
9704 IF p_top_line_bs.COUNT > 0 THEN
9705 -----errorout_ad('IN SLL l_next_cycle_dt = ' || l_next_cycle_dt);
9706 l_tbs_ind := p_top_line_bs.FIRST;
9707 WHILE TRUNC(l_next_cycle_dt) > p_top_line_bs(l_tbs_ind).DATE_START AND l_tbs_ind < p_top_line_bs.LAST
9708 LOOP
9709 l_tbs_ind := p_top_line_bs.NEXT(l_tbs_ind);
9710 END LOOP;
9711
9712 -----errorout_ad('after while LOOP l_tbs_ind = ' || l_tbs_ind);
9713 -------errorout_ad('last = '|| p_top_line_bs.LAST);
9714
9715 ---chk l_next_cycle_dt if between previous and present record
9716 IF l_tbs_ind = p_top_line_bs.first THEN
9717 NULL;
9718
9719 ELSIF l_tbs_ind <= p_top_line_bs.LAST THEN
9720 -----errorout_ad('COMING IN');
9721
9722 l_element_end_dt := TRUNC(p_top_line_bs(l_tbs_ind ).DATE_END);
9723
9724
9725 IF TRUNC(l_next_cycle_dt) >= p_top_line_bs(l_tbs_ind ).DATE_START
9726 AND TRUNC(l_next_cycle_dt) <= l_element_end_dt THEN
9727
9728 NULL;
9729 ELSE
9730 l_tbs_ind := l_tbs_ind + 1;
9731 END IF;
9732 -----errorout_ad('FINAL l_tbs_ind = '|| l_tbs_ind);
9733
9734
9735
9736 elsif TRUNC(p_SubLine_rec.cp_start_dt) = p_top_line_bs(l_tbs_ind ).DATE_START THEN
9737 l_tbs_ind := p_top_line_bs.first;
9738 END IF;
9739 -----errorout_ad('IN sll LOOP l_tbs_ind = ' || l_tbs_ind);
9740 END IF;
9741
9742 ------------------------------------------------------------------------
9743 -- Begin partial period computation logic
9744 -- Developer Mani Choudhary
9745 -- Date 17-MAY-2005
9746 -- For manual covered levels, should take the billing uom as honoured in Get_Unit_Price_Per_Uom
9747 -------------------------------------------------------------------------
9748 IF p_subline_rec.cp_lse_id in (8,10,11,35) THEN
9749 l_uom := p_cp_sll_tbl(l_cp_sll_counter).uom;
9750
9751 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9752 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements',
9753 ' result l_uom = ' || l_uom);
9754 END IF;
9755
9756 END IF;
9757 OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
9758 (p_timeunit => p_cp_sll_tbl(l_cp_sll_counter).uom,
9759 x_return_status => x_return_status,
9760 x_quantity => l_uom_quantity ,
9761 x_timeunit => l_tce_code);
9762 IF x_return_status <> 'S' THEN
9763 RAISE G_EXCEPTION_HALT_VALIDATION;
9764 END IF;
9765 ------------------------------------------------------------------------
9766 -- End partial period computation logic
9767 ------------------------------------------------------------------------
9768
9769 -- Start - Added by PMALLARA - Bug #3992530
9770 Lvl_Element_cnt := l_period_counter - 1;
9771 Strm_Start_Date := p_cp_sll_tbl(l_cp_sll_counter).dt_start;
9772 LOOP -------------for level elements of one rule
9773 Lvl_Element_cnt := Lvl_Element_cnt + 1;
9774 -- End - Added by PMALLARA - Bug #3992530
9775 -----errorout_ad ('INSIDE LVL ELEMENT l_next_cycle_dt = ' || TO_CHAR(l_next_cycle_dt));
9776 -----errorout_ad('INSIDE LVL ELEMENT l_tbs_ind = ' || l_tbs_ind);
9777
9778 l_fnd_lvl_in_rec.line_start_date := p_SubLine_rec.cp_start_dt;
9779 l_fnd_lvl_in_rec.line_end_date := nvl((p_term_dt - 1),p_SubLine_rec.cp_end_dt);
9780 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
9781 -- Start - Modified by PMALLARA - Bug #3992530
9782 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period;
9783 -- End - Modified by PMALLARA - Bug #3992530
9784 l_fnd_lvl_in_rec.tuom := p_cp_sll_tbl(l_cp_sll_counter).uom;
9785 l_fnd_lvl_in_rec.bill_type := p_billing_type;
9786
9787 IF p_billing_type = 'T' THEN
9788
9789 l_fnd_lvl_in_rec.total_amount := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0) ;
9790
9791 -----errorout_ad('subline amount :' || l_fnd_lvl_in_rec.total_amount ));
9792
9793 ELSE --(for E and P just pass 0 as for lvlelement l_lvl_amt will be passed)
9794
9795 l_fnd_lvl_in_rec.total_amount := 0;
9796 END IF;
9797
9798 l_fnd_lvl_in_rec.invoice_offset_days := p_cp_sll_tbl(l_cp_sll_counter).invoice_offset_days;
9799 l_fnd_lvl_in_rec.interface_offset_days := p_cp_sll_tbl(l_cp_sll_counter).Interface_offset_days;
9800 --mchoudha added this parameter
9801 l_fnd_lvl_in_rec.uom_per_period := p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period;
9802
9803 -----errorout_ad(' l_fnd_lvl_in_rec.line_start_date = ' || l_fnd_lvl_in_rec.line_start_date);
9804 -----errorout_ad(' l_fnd_lvl_in_rec.line_end_date = ' || l_fnd_lvl_in_rec.line_end_date);
9805 -----errorout_ad(' l_fnd_lvl_in_rec.cycle_start_date = ' || to_char(l_fnd_lvl_in_rec.cycle_start_date));
9806 -----errorout_ad(' l_fnd_lvl_in_rec.uom_per_period = ' || l_fnd_lvl_in_rec.uom_per_period);
9807 -----errorout_ad(' l_fnd_lvl_in_rec.uom = ' || l_fnd_lvl_in_rec.uom);
9808 -------------------------------------------------------------------------
9809 -- Begin partial period computation logic
9810 -- Developer Mani Choudhary
9811 -- Date 09-MAY-2005
9812 -- Added two new parameters p_period_start and p_period_type
9813 -------------------------------------------------------------------------
9814
9815 -- Start - Modified by PMALLARA - Bug #3992530
9816 IF fnd_log.level_procedure >= fnd_log.g_current_runtime_level THEN
9817 fnd_log.string(fnd_log.level_procedure,G_MODULE_CURRENT||'.Create_cp_Lvl_elements.lvl_loop',
9818 'Calling oks_bill_util_pub.Get_next_bill_sch with parameters '
9819 ||'period start = ' || p_period_start
9820 ||', period type = ' || p_period_type);
9821 END IF;
9822 OKS_BILL_UTIL_PUB.Get_next_bill_sch
9823 (p_api_version => l_api_version,
9824 x_return_status => x_return_status,
9825 x_msg_count => l_msg_count,
9826 x_msg_data => l_msg_data,
9827 p_invoicing_rule_id => p_invoice_rulid,
9828 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
9829 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
9830 p_period_start => p_period_start,
9831 p_period_type => p_period_type,
9832 Strm_Start_Date => Strm_Start_Date);
9833 -- End - Modified by PMALLARA - Bug #3992530
9834
9835
9836 -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch l_fnd_next_cycle = ' || x_return_status);
9837 -----errorout_ad('l_fnd_lvl_out_rec.next_cycle_date = ' || l_fnd_lvl_out_rec.next_cycle_date );
9838
9839
9840 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
9841 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
9842 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
9843 RAISE OKC_API.G_EXCEPTION_ERROR;
9844 END IF;
9845
9846
9847 -------Next cycle date given by Get_next_bill_sch is <= cp start date then do not create
9848 ------level element AND fro daily billing only chk Get_next_bill_sch is < cp start date.
9849
9850 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) <= p_SubLine_rec.cp_start_dt THEN
9851 -----errorout_ad('going in null');
9852 l_adjusted_amt := 0;
9853 l_tbs_ind := l_tbs_ind + 1;
9854 ELSE
9855 -----errorout_ad('going not in null');
9856 -----level element amount rounding and adjustment for last line
9857
9858
9859 IF p_billing_type = 'T' THEN ----FOR TYPE 'T'
9860
9861 ------------------------------------------------------------------------
9862 -- Begin partial period computation logic
9863 -- Developer Mani Choudhary
9864 -- Date 17-MAY-2005
9865 -- Added two new parameters p_period_start and p_period_type
9866 -------------------------------------------------------------------------
9867
9868 IF p_period_start is not null AND
9869 p_period_type is not null
9870 THEN
9871
9872 --to check if first partial period
9873 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) >
9874 p_SubLine_rec.cp_start_dt AND
9875 TRUNC(l_next_cycle_dt)<
9876 p_SubLine_rec.cp_start_dt
9877 THEN
9878 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
9879 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
9880 (p_start_date => p_SubLine_rec.cp_start_dt,
9881 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
9882 p_source_uom => l_fnd_lvl_in_rec.tuom,--nvl(p_SubLine_rec.cp_price_uom,l_uom), --line price uom
9883 p_period_type => p_period_type ,
9884 p_period_start => p_period_start);
9885
9886 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9887 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Service',
9888 'after calling OKS_TIME_MEASURES_PUB.get_quantity with period start '||p_period_start||' ,p_period_type '||p_period_type
9889 ||' result l_quantity = ' || l_quantity);
9890 END IF;
9891
9892 IF nvl(l_quantity,0) = 0 THEN
9893 x_return_status := G_RET_STS_ERROR;
9894 RAISE G_EXCEPTION_HALT_VALIDATION;
9895 END IF;
9896
9897 l_lvl_amt := nvl(l_constant_sll_amt*l_quantity/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
9898
9899 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9900 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Service',
9901 ' result l_lvl_amt = ' || l_lvl_amt);
9902 END IF;
9903 --mchoudha added else logic for WEEK kind of uoms
9904 ELSE
9905 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
9906
9907 END IF;
9908
9909 --errorout_ad(' l_quantity '||l_quantity);
9910 --errorout_ad(' l_total_quantity '||l_total_quantity);
9911 --errorout_ad(' l_lvl_amt '||l_lvl_amt);
9912 ELSE
9913
9914 IF p_period_start = 'CALENDAR' AND
9915 p_period_start is not null AND
9916 p_period_type is not null AND
9917 TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
9918 THEN
9919
9920 --errorout_ad(' uom '||nvl(p_SubLine_rec.cp_price_uom,l_uom));
9921 --errorout_ad(' start date '||to_char(l_next_cycle_dt));
9922 --errorout_ad(' start date '||to_char(TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1));
9923 --errorout_ad('p_period_start '||p_period_start);
9924 --errorout_ad('p_period_type '||p_period_type);
9925 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
9926 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
9927 (p_start_date => l_next_cycle_dt,
9928 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
9929 p_source_uom => l_fnd_lvl_in_rec.tuom,--nvl(p_SubLine_rec.cp_price_uom,l_uom), --line price uom
9930 p_period_type => p_period_type,
9931 p_period_start => p_period_start);
9932
9933 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9934 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Calendar',
9935 'after calling OKS_TIME_MEASURES_PUB.get_quantity with period start '||p_period_start||' ,p_period_type '||p_period_type
9936 ||' result l_quantity = ' || l_quantity);
9937 END IF;
9938
9939 --errorout_ad(' l_quantity '||l_quantity);
9940 --errorout_ad(' b4 calling quantity2');
9941 IF nvl(l_quantity,0) = 0 THEN
9942 x_return_status := G_RET_STS_ERROR;
9943 RAISE G_EXCEPTION_HALT_VALIDATION;
9944 END IF;
9945
9946
9947 l_lvl_amt := nvl(l_constant_sll_amt*l_quantity/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
9948
9949 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9950 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Calendar',
9951 ' result l_lvl_amt = ' || l_lvl_amt);
9952 END IF;
9953
9954 --mchoudha added else logic for WEEK kind of uoms
9955 ELSE
9956 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
9957
9958 END IF;
9959 --errorout_ad(' l_lvl_amt '||l_lvl_amt);
9960
9961 ELSE
9962 l_lvl_amt := nvl(l_constant_sll_amt,0);
9963 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9964 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.full-period',
9965 ' l_lvl_amt = ' || l_lvl_amt);
9966 END IF;
9967
9968 --errorout_ad(' l_lvl_amt in else '||l_lvl_amt);
9969 END IF;
9970 END IF;
9971 ELSE --period start and period type are not null
9972
9973 l_adjusted_amt := 0;
9974 Get_Period_Frequency(p_line_start_date => p_SubLine_rec.cp_start_dt,
9975 p_line_end_date => p_SubLine_rec.cp_end_dt,
9976 p_cycle_start_date => l_next_cycle_dt,
9977 p_next_billing_date => trunc(l_fnd_lvl_out_rec.next_cycle_date),
9978 P_uom_quantity => l_uom_quantity,
9979 P_tce_code => l_tce_code,
9980 p_uom_per_period => p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period,
9981 x_period_freq => l_period_freq,
9982 x_return_status => x_return_status);
9983
9984
9985 -----errorout_ad('Get_Period_Frequency = ' || x_return_status);
9986 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9987 RAISE G_EXCEPTION_HALT_VALIDATION;
9988 END IF;
9989
9990 l_lvl_amt := (NVL(l_period_freq,0) * NVL(l_constant_sll_amt,0) );
9991
9992 --l_lvl_amt := l_fnd_lvl_out_rec.cycle_amount;
9993
9994 END IF; --period start and period type are not null
9995 ELSE ------FOR E
9996 IF p_period_start = 'CALENDAR' AND
9997 p_period_start is not null AND
9998 p_period_type is not null AND
9999 TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
10000 THEN
10001 --errorout_ad(' Equal uom '||l_fnd_lvl_in_rec.tuom);
10002 --errorout_ad(' start date '||to_char(l_next_cycle_dt));
10003 --errorout_ad(' end date '||to_char(TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1));
10004 --errorout_ad('p_period_start '||p_period_start);
10005 --errorout_ad('p_period_type '||p_period_type);
10006 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
10007 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
10008 (p_start_date => l_next_cycle_dt,
10009 p_end_date => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
10010 p_source_uom => l_fnd_lvl_in_rec.tuom, --line price uom
10011 p_period_type => p_period_type,
10012 p_period_start => p_period_start);
10013
10014 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10015 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.Equal_amount.Calendar',
10016 'after calling OKS_TIME_MEASURES_PUB.get_quantity with period start '||p_period_start||' ,p_period_type '||p_period_type
10017 ||' result l_quantity = ' || l_quantity);
10018 END IF;
10019
10020 --errorout_ad(' l_quantity '||l_quantity);
10021
10022 IF nvl(l_quantity,0) = 0 THEN
10023 x_return_status := G_RET_STS_ERROR;
10024 RAISE G_EXCEPTION_HALT_VALIDATION;
10025 END IF;
10026 --determine full period end date
10027
10028 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
10029
10030
10031 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10032 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.Equal_amount.Calendar',
10033 ' result l_lvl_amt = ' || l_lvl_amt);
10034 END IF;
10035 --mchoudha added else logic for WEEK kind of uoms
10036 ELSE
10037 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
10038
10039 END IF;
10040
10041 ELSE
10042
10043 l_lvl_amt := TO_NUMBER(p_cp_sll_tbl(l_cp_sll_counter).amount);
10044 END IF; --period start and period type are not null
10045 END IF; -- IF p_billing_type = 'T'
10046 -----if last level element to be inserted then find out the aDjusted amount
10047
10048 IF p_period_start is not null AND
10049 p_period_type is not null THEN
10050 l_last_cmp_date := l_end_date;
10051 ELSE
10052 l_last_cmp_date := p_SubLine_rec.cp_end_dt;
10053 END IF;
10054
10055 ---start inserting in level element
10056
10057 l_lvl_ele_tbl_in(l_tbl_seq).sequence_number := to_char(l_period_counter);
10058 l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id := p_line_rec.dnz_chr_id;
10059 l_lvl_ele_tbl_in(l_tbl_seq).cle_id := p_subline_rec.cp_id;
10060 l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id := p_line_rec.id;
10061
10062 IF l_next_cycle_dt < p_SubLine_rec.cp_start_dt AND l_period_counter = 1 THEN
10063 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC( p_SubLine_rec.cp_start_dt);
10064 ELSE
10065 l_lvl_ele_tbl_in(l_tbl_seq).date_start := TRUNC(l_next_cycle_dt);
10066 END IF;
10067 --errorout_ad('date start'||TRUNC(l_next_cycle_dt));
10068 --errorout_ad('date end'||TRUNC(TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1));
10069
10070 l_lvl_ele_tbl_in(l_tbl_seq).date_END := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
10071 --30-DEC-2005 mchoudha fixed bug#4895586
10072 IF (l_cp_sll_counter = l_cp_sll_last AND
10073 l_lvl_loop_counter = p_cp_sll_tbl(l_cp_sll_last).level_period) OR
10074 --Mani PPC changed p_SubLine_rec.cp_end_dt to l_last_cmp_date
10075 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
10076
10077 l_adjusted_amt := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0);
10078 ---errorout_bill('p_SubLine_rec.cp_amt = ' || p_SubLine_rec.cp_amt);
10079 l_lvl_ele_tbl_in(l_tbl_seq).date_END := l_last_cmp_date;
10080
10081 ELSE
10082 l_adjusted_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_lvl_amt, l_currency_code );
10083 END IF;
10084
10085 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10086
10087 --22-MAR-2006 mchoudha Changes for Partial periods CR3
10088 IF l_running_total < 0 THEN
10089 l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10090 ELSIF l_running_total < l_adjusted_amt THEN
10091 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_running_total;
10092 ELSE
10093 l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10094 END IF;
10095 IF l_adjusted_amt < 0 THEN
10096 l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10097 END IF;
10098 --
10099 l_running_total := l_running_total - l_lvl_ele_tbl_in(l_tbl_seq).amount;
10100
10101 l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl := l_fnd_lvl_out_rec.date_recievable_gl;
10102 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := TRUNC(l_fnd_lvl_out_rec.date_transaction);
10103 l_lvl_ele_tbl_in(l_tbl_seq).date_due := l_fnd_lvl_out_rec.date_due;
10104 l_lvl_ele_tbl_in(l_tbl_seq).date_print := l_fnd_lvl_out_rec.date_print;
10105 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
10106
10107 SELECT nvl(BILLED_AT_SOURCE , 'N')
10108 INTO l_billed_at_source
10109 FROM OKC_K_HEADERS_ALL_B
10110 WHERE id = p_Line_rec.dnz_chr_id;
10111
10112 if l_billed_at_source = 'Y' Then
10113 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := sysdate;
10114 else
10115 l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
10116 end if;
10117
10118 l_lvl_ele_tbl_in(l_tbl_seq).rul_id := p_cp_sll_tbl(l_cp_sll_counter).id;
10119 l_lvl_ele_tbl_in(l_tbl_seq).object_version_number := OKC_API.G_MISS_NUM;
10120 l_lvl_ele_tbl_in(l_tbl_seq).created_by := OKC_API.G_MISS_NUM;
10121 l_lvl_ele_tbl_in(l_tbl_seq).creation_date := SYSDATE;
10122 l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by := OKC_API.G_MISS_NUM;
10123 l_lvl_ele_tbl_in(l_tbl_seq).last_update_date := SYSDATE;
10124
10125 -----errorout_ad ('Amount for subline lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
10126
10127 IF p_period_start is null OR
10128 p_period_type is null THEN
10129
10130 IF p_term_dt IS NOT NULL AND TRUNC(l_lvl_ele_tbl_in(l_tbl_seq).date_start) < TRUNC(p_term_dt) AND
10131 TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > TRUNC(p_term_dt) AND
10132 p_term_dt <= p_SubLine_rec.cp_end_dt THEN
10133
10134 -----errorout_ad('COMING IN');
10135
10136 l_lvl_ele_tbl_in(l_tbl_seq).date_END := (p_term_dt - 1);
10137
10138 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) > p_SubLine_rec.cp_end_dt THEN
10139
10140 l_term_amt := Find_term_amt(p_cycle_st_dt => l_lvl_ele_tbl_in(l_tbl_seq).date_start,
10141 p_term_dt => p_term_dt,
10142 p_cycle_end_dt => p_SubLine_rec.cp_end_dt,
10143 p_amount => nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
10144
10145 ELSE
10146
10147 l_term_amt := Find_term_amt(p_cycle_st_dt => l_lvl_ele_tbl_in(l_tbl_seq).date_start,
10148 p_term_dt => p_term_dt,
10149 p_cycle_end_dt => l_fnd_lvl_out_rec.next_cycle_date - 1,
10150 p_amount => nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
10151
10152 END IF; ---END OF NEXT CYCLE DT CHK
10153
10154
10155 l_lvl_ele_tbl_in(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_term_amt, l_currency_code );
10156 END IF;
10157 END IF;
10158
10159 IF p_top_line_bs.COUNT > 0 THEN
10160
10161 IF l_tbs_ind <= p_top_line_bs.LAST THEN
10162
10163 IF l_tbs_ind = p_top_line_bs.LAST THEN
10164 l_bill_end_date := p_SubLine_rec.cp_end_dt;
10165 ELSE
10166 l_bill_end_date := p_top_line_bs(l_tbs_ind).date_end;
10167 END IF;
10168
10169 IF p_top_line_bs(l_tbs_ind).date_start <= l_lvl_ele_tbl_in(l_tbl_seq).date_start
10170 AND (l_bill_end_date) >= l_lvl_ele_tbl_in(l_tbl_seq).date_start THEN
10171
10172 p_top_line_bs(l_tbs_ind).amount := nvl(p_top_line_bs(l_tbs_ind).amount,0) +
10173 nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
10174
10175 --added so that top line and subline interface/invoice dates are same
10176
10177 l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := p_top_line_bs(l_tbs_ind).date_to_interface;
10178 l_lvl_ele_tbl_in(l_tbl_seq).date_transaction := p_top_line_bs(l_tbs_ind).date_transaction;
10179
10180 l_tbs_ind := l_tbs_ind + 1;
10181 ELSE
10182
10183 NULL;
10184 END IF;
10185 END IF; ---End of l_tbs_ind <= p_top_line_bs.LAST condition added for bug#2655416
10186 END IF;
10187
10188 ---incremented here because if billing is DONE for last 6 months then
10189 ---sequence no. was starting from 7.
10190
10191 l_period_counter := l_period_counter + 1;
10192
10193
10194 END IF; ----end of check of next cycle dt <= line st_dt
10195
10196 l_next_cycle_dt := trunc(l_fnd_lvl_out_rec.next_cycle_date);
10197 l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_adjusted_amt,0);
10198 l_tbl_seq := l_tbl_seq + 1;
10199
10200 -----errorout_ad('l_bill_sch_amt = ' || l_bill_sch_amt);
10201 -----errorout_ad('compared with ' || p_cp_sll_tbl(l_cp_sll_counter).level_period);
10202
10203 EXIT WHEN (l_lvl_loop_counter = p_cp_sll_tbl(l_cp_sll_counter).level_period) OR
10204 (TRUNC(l_next_cycle_dt) > l_end_date) OR
10205 (TRUNC(l_next_cycle_dt) >= TRUNC(l_compare_dt));
10206
10207 l_lvl_loop_counter := l_lvl_loop_counter + 1;
10208
10209 END LOOP; ----end of level element loop
10210
10211 END IF;
10212 END IF ; ------TRUNC(l_next_cycle_dt) >= l_compare_dt
10213 ----if start of period counter < sll line period then only enter in lvl elemet loop
10214 EXIT WHEN (l_cp_sll_counter = p_cp_sll_tbl.LAST) OR
10215 (TRUNC(l_next_cycle_dt) > l_end_date);
10216
10217
10218 l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
10219 END LOOP; ---- sll loop
10220 END IF ;
10221
10222 IF l_cp_sll_counter < p_cp_sll_tbl.LAST AND p_top_line_bs.COUNT > 0 THEN
10223
10224 l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
10225
10226 FOR i IN l_cp_sll_counter .. p_cp_sll_tbl.LAST
10227 LOOP
10228
10229 Check_Existing_Lvlelement(
10230 p_sll_id => p_cp_sll_tbl(i).id,
10231 p_sll_dt_start => p_cp_sll_tbl(i).dt_start,
10232 p_uom => p_cp_sll_tbl(i).uom,
10233 p_uom_per_period => p_cp_sll_tbl(i).uom_per_period,
10234 p_cp_end_dt => p_SubLine_rec.cp_end_dt,
10235 x_next_cycle_dt => l_next_cycle_dt,
10236 x_last_cycle_dt => l_last_cycle_dt,
10237 x_period_counter => l_period_counter,
10238 x_sch_amt => l_bill_sch_amt,
10239 x_top_line_bs => p_top_line_bs,
10240 x_return_status => x_return_status);
10241 END LOOP;
10242
10243 -----errorout_ad('Check_Existing_Lvlelement5 = '|| x_return_status);
10244 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
10245 RAISE G_EXCEPTION_HALT_VALIDATION;
10246 END IF;
10247 END IF; ---END OF l_cp_sll_counter < p_cp_sll_tbl.LAST
10248
10249
10250
10251 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
10252
10253 IF l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end > p_subline_rec.cp_end_dt THEN
10254 l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end := p_subline_rec.cp_end_dt;
10255 END IF;
10256
10257 OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
10258 p_api_version => l_api_version,
10259 p_init_msg_list => l_init_msg_list,
10260 x_return_status => x_return_status,
10261 x_msg_count => l_msg_count,
10262 x_msg_data => l_msg_data,
10263 p_letv_tbl => l_lvl_ele_tbl_in,
10264 x_letv_tbl => l_lvl_ele_tbl_out);
10265
10266 -----errorout_ad('LEVEL ELEMENT INSERT STATUS FOR SUBLINE = ' || x_return_status);
10267
10268
10269 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
10270 RAISE G_EXCEPTION_HALT_VALIDATION;
10271 END IF;
10272 END IF;
10273
10274
10275 EXCEPTION
10276 WHEN G_EXCEPTION_HALT_VALIDATION THEN
10277 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
10278 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
10279 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
10280 RAISE OKC_API.G_EXCEPTION_ERROR;
10281 END IF;
10282 WHEN OTHERS THEN
10283 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10284 p_msg_name => G_UNEXPECTED_ERROR,
10285 p_token1 => G_SQLCODE_TOKEN,
10286 p_token1_value => sqlcode,
10287 p_token2 => G_SQLERRM_TOKEN,
10288 p_token2_value => sqlerrm);
10289
10290 x_return_status := G_RET_STS_UNEXP_ERROR;
10291 END Create_cp_lvl_elements;
10292
10293 Procedure Create_hdr_schedule
10294 (
10295 p_contract_id IN NUMBER,
10296 x_return_status OUT NOCOPY VARCHAR2,
10297 x_msg_count OUT NOCOPY NUMBER,
10298 x_msg_data OUT NOCOPY VARCHAR2)
10299 IS
10300
10301 Cursor l_contract_Csr Is
10302 SELECT hdr.id, TRUNC(hdr.start_date) start_dt,
10303 nvl(trunc(hdr.date_terminated - 1) ,TRUNC(hdr.end_date)) end_dt,
10304 hdr.inv_rule_id inv_rule_id, dtl.billing_schedule_type billing_schedule_type
10305 FROM okc_k_headers_b hdr, oks_k_headers_b dtl
10306 WHERE hdr.id = dtl.chr_id
10307 AND hdr.Id = p_contract_id ;
10308
10309
10310
10311 CURSOR l_hdr_sll_csr IS
10312 SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
10313 uom_per_period, uom_code, TRUNC(end_date) end_date,
10314 interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
10315 chr_id, level_amount
10316 FROM OKS_STREAM_LEVELS_B
10317 WHERE chr_id = p_contract_id
10318 ORDER BY sequence_no;
10319
10320
10321
10322 l_hdr_sll_rec l_hdr_sll_csr%ROWTYPE;
10323 l_Contract_Rec l_contract_Csr%Rowtype;
10324 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
10325 l_hdr_rec contract_rec_type;
10326
10327
10328 L_SLL_OUT_TBl StrmLvl_Out_tbl;
10329 l_sll_count NUMBER;
10330 l_index NUMBER;
10331
10332
10333 --
10334 l_api_version CONSTANT NUMBER := 1.0;
10335 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
10336 --
10337 -------------------------------------------------------------------------
10338 -- Begin partial period computation logic
10339 -- Developer Mani Choudhary
10340 -- Date 04-MAY-2005
10341 -------------------------------------------------------------------------
10342 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
10343 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
10344 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
10345 l_return_status VARCHAR2(30);
10346 -------------------------------------------------------------------------
10347 -- End partial period computation logic
10348 -- Date 04-MAY-2005
10349 -------------------------------------------------------------------------
10350
10351 Begin
10352 x_return_status := 'S';
10353 l_header_billing := p_contract_id;
10354
10355 ------------find out the hdr details
10356
10357 Open l_contract_Csr;
10358 Fetch l_contract_Csr Into l_contract_Rec;
10359
10360 If l_contract_Csr%Notfound then
10361 Close l_contract_Csr;
10362 x_return_status := 'E';
10363 RAISE G_EXCEPTION_HALT_VALIDATION;
10364 End If;
10365 Close l_contract_Csr;
10366
10367 l_hdr_rec.id := l_contract_rec.id;
10368 l_hdr_rec.start_dt := l_contract_rec.start_dt;
10369 l_hdr_rec.end_dt := l_contract_rec.end_dt;
10370
10371
10372 -------------------------------------------------------------------------
10373 -- Begin partial period computation logic
10374 -- Developer Mani Choudhary
10375 -- Date 09-MAY-2005
10376 -------------------------------------------------------------------------
10377
10378
10379 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
10380 (
10381 p_hdr_id => l_contract_rec.id,
10382 p_org_id => NULL,
10383 x_period_start => l_period_start,
10384 x_period_type => l_period_type,
10385 x_price_uom => l_price_uom,
10386 x_return_status => x_return_status);
10387
10388 IF x_return_status <> 'S' THEN
10389 RAISE G_EXCEPTION_HALT_VALIDATION;
10390 END IF;
10391
10392 -------------------------------------------------------------------------
10393 -- End partial period computation logic
10394 -- Date 09-MAY-2005
10395 -------------------------------------------------------------------------
10396 l_sll_tbl.DELETE;
10397 l_index := 1;
10398 ----make sll tbl
10399
10400 FOR l_hdr_SlL_rec IN l_hdr_sll_Csr
10401 LOOP
10402
10403
10404 l_sll_tbl(l_index).id := l_hdr_SlL_rec.id;
10405 l_sll_tbl(l_index).cle_id := NULL;
10406 l_sll_tbl(l_index).chr_id := p_contract_id;
10407 l_sll_tbl(l_index).dnz_chr_id := p_contract_id;
10408 l_sll_tbl(l_index).uom_code := l_hdr_SlL_rec.uom_code;
10409 l_sll_tbl(l_index).sequence_no := l_hdr_SlL_rec.sequence_no;
10410 l_sll_tbl(l_index).Start_Date := l_hdr_SlL_rec.Start_Date;
10411 l_sll_tbl(l_index).end_Date := l_hdr_SlL_rec.end_Date;
10412 l_sll_tbl(l_index).level_periods := l_hdr_SlL_rec.level_periods;
10413 l_sll_tbl(l_index).uom_per_period := l_hdr_SlL_rec.uom_per_period;
10414 l_sll_tbl(l_index).level_amount := l_hdr_SlL_rec.level_amount;
10415 l_sll_tbl(l_index).invoice_offset_days := l_hdr_SlL_rec.invoice_offset_days;
10416 l_sll_tbl(l_index).interface_offset_days := l_hdr_SlL_rec.interface_offset_days;
10417
10418 l_index := l_index + 1;
10419 END LOOP;
10420
10421
10422 IF l_sll_tbl.COUNT = 0 THEN
10423 RETURN;
10424 END IF;
10425
10426
10427
10428 -----create rules with category 'SLL'
10429 --------------------------------------------------------------------------
10430 -- Begin partial period computation logic
10431 -- Developer Mani Choudhary
10432 -- Date 09-MAY-2005
10433 -- Added two new parameters P_period_start,P_period_type in procedural call
10434 ---------------------------------------------------------------------------
10435 Create_Stream_Level ( p_billing_type => nvl(l_contract_rec.billing_schedule_type, 'T'),
10436 p_strm_lvl_tbl => l_sll_tbl,
10437 p_dnz_chr_id => l_Contract_Rec.id,
10438 p_subline_call => 'H',
10439 p_line_amt => NULL,
10440 p_subline_amt => NULL,
10441 p_sll_start_dt => l_contract_rec.start_dt,
10442 p_end_dt => l_contract_rec.end_dt,
10443 p_period_start => l_period_start,
10444 p_period_type => l_period_type,
10445 x_sll_out_tbl => l_sll_out_tbl,
10446 x_return_status => x_return_status);
10447 -------------------------------------------------------------------------
10448 -- End partial period computation logic
10449 -- Date 09-MAY-2005
10450 -------------------------------------------------------------------------
10451 -----errorout_ad('Create_Stream_Level status = ' || x_return_status);
10452 -----errorout_ad('TOTAL SLL COUNT for line'|| TO_CHAR(l_sll_out_tbl.COUNT));
10453
10454 IF x_return_status <> 'S' THEN
10455 RAISE G_EXCEPTION_HALT_VALIDATION;
10456 END IF;
10457
10458 ----if l_sll_out_tbl.count > 0 then insert lines into oks_level_elements
10459 IF l_sll_out_tbl.count > 0 then
10460
10461 l_currency_code := Find_Currency_Code(
10462 p_cle_id => NULL,
10463 p_chr_id => p_contract_id);
10464 IF l_currency_code IS NULL THEN
10465 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
10466 x_return_status := 'E';
10467 RETURN;
10468 END IF;
10469
10470
10471 Create_Hdr_Level_elements(
10472 p_billing_type => nvl(l_contract_rec.billing_schedule_type, 'T'),
10473 p_sll_tbl => l_sll_out_tbl,
10474 p_hdr_rec => l_hdr_rec,
10475 p_invoice_ruleid => l_contract_rec.inv_rule_id,
10476 p_called_from => 2,
10477 p_period_start => l_period_start,
10478 p_period_type => l_period_type,
10479 x_return_status => x_return_status);
10480
10481 -----errorout_ad('Create_Hdr_Level_elements status = ' || x_return_status);
10482
10483 IF x_return_status <> 'S' THEN
10484 RAISE G_EXCEPTION_HALT_VALIDATION;
10485 END IF;
10486 ELSE
10487 -----errorout_ad('sll rule count = ' || to_char(0));
10488 x_return_status := 'E';
10489 RAISE G_EXCEPTION_HALT_VALIDATION;
10490 END IF ;
10491
10492 l_header_billing := NULL;
10493
10494 EXCEPTION
10495 WHEN G_EXCEPTION_HALT_VALIDATION THEN
10496 l_currency_code := NULL;
10497 l_header_billing := NULL;
10498
10499 WHEN OTHERS THEN
10500 l_currency_code := NULL;
10501 l_header_billing := NULL;
10502 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10503 p_msg_name => G_UNEXPECTED_ERROR,
10504 p_token1 => G_SQLCODE_TOKEN,
10505 p_token1_value => sqlcode,
10506 p_token2 => G_SQLERRM_TOKEN,
10507 p_token2_value => sqlerrm);
10508
10509 x_return_status := G_RET_STS_UNEXP_ERROR;
10510
10511
10512 END Create_hdr_schedule;
10513
10514
10515 PROCEDURE Del_line_sll_lvl(p_line_id IN NUMBER,
10516 x_return_status OUT NOCOPY VARCHAR2,
10517 x_msg_count OUT NOCOPY NUMBER,
10518 x_msg_data OUT NOCOPY VARCHAR2)
10519
10520 IS
10521 ----will delete all lvlelements , sll for line if billing all sll billing type <> 'P'
10522 ---it will be called from create_bill_sch_rules.
10523
10524
10525
10526 BEGIN
10527 x_return_status := 'S';
10528
10529
10530 --------delete lvl elemets for line
10531 DELETE FROM OKS_LEVEL_ELEMENTS
10532 WHERE rul_id IN (SELECT sll.id
10533 FROM OKS_STREAM_LEVELS_B sll
10534 WHERE sll.cle_id = p_line_id);
10535
10536 ---delete sll info
10537 DELETE FROM OKS_STREAM_LEVELS_B
10538 WHERE cle_id = p_line_id;
10539
10540 ----update billing type to 'P'
10541
10542 UPDATE oks_k_lines_b
10543 SET billing_schedule_type = 'P'
10544 WHERE cle_id = p_line_id;
10545
10546
10547
10548 EXCEPTION
10549 WHEN OTHERS THEN
10550 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10551 p_msg_name => G_UNEXPECTED_ERROR,
10552 p_token1 => G_SQLCODE_TOKEN,
10553 p_token1_value => sqlcode,
10554 p_token2 => G_SQLERRM_TOKEN,
10555 p_token2_value => sqlerrm);
10556
10557 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
10558
10559 END Del_line_sll_lvl;
10560
10561
10562 Procedure Delete_contract_bs_sll
10563 (
10564 p_contract_id IN NUMBER,
10565 x_return_status OUT NOCOPY VARCHAR2,
10566 x_msg_count OUT NOCOPY NUMBER,
10567 x_msg_data OUT NOCOPY VARCHAR2)
10568 IS
10569 BEGIN
10570 x_return_status := 'S';
10571
10572
10573 --------delete lvl elemets for the whole contract
10574 DELETE FROM OKS_LEVEL_ELEMENTS
10575 WHERE dnz_chr_id = p_contract_id;
10576
10577
10578 ---delete sll info for contract (header,line and subline)
10579 DELETE FROM OKS_STREAM_LEVELS_B
10580 WHERE dnz_chr_id = p_contract_id;
10581
10582
10583
10584 EXCEPTION
10585 WHEN OTHERS THEN
10586 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10587 p_msg_name => G_UNEXPECTED_ERROR,
10588 p_token1 => G_SQLCODE_TOKEN,
10589 p_token1_value => sqlcode,
10590 p_token2 => G_SQLERRM_TOKEN,
10591 p_token2_value => sqlerrm);
10592
10593 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
10594
10595 END Delete_contract_bs_sll;
10596
10597 Procedure Populate_end_date(p_line_id IN NUMBER,
10598 p_end_date IN DATE,
10599 p_term_date IN DATE,
10600 p_lse_id IN NUMBER,
10601 x_return_status OUT NOCOPY VARCHAR2)
10602
10603 IS
10604
10605 Cursor l_LineSch_Csr is
10606 SELECT sll.start_date,sll.uom_code, sll.uom_per_period,
10607 element.id,element.sequence_number,element.date_start,
10608 element.date_end,element.date_completed
10609 FROM oks_level_elements element, oks_stream_levels_b sll
10610 WHERE sll.id = element.rul_id
10611 AND sll.cle_id = p_line_id
10612 ORDER BY element.date_start;
10613
10614 CURSOR l_line_sll_csr IS
10615 SELECT id, start_date, OKC_TIME_UTIL_PUB.get_enddate(
10616 start_date,
10617 uom_code,
10618 uom_per_period * level_periods) sll_end_date
10619 FROM oks_stream_levels_b
10620 WHERE cle_id = p_line_id;
10621
10622 CURSOR l_bcl_csr(p_line_id number, p_start_date date) IS
10623 SELECT date_billed_to
10624 FROM oks_bill_cont_lines
10625 WHERE cle_id = p_line_id
10626 AND TRUNC(date_billed_from) = TRUNC(p_start_date)
10627 AND bill_action = 'RI';
10628
10629 CURSOR l_bsl_csr(p_line_id number, p_start_date date) IS
10630 SELECT bsl.date_billed_to
10631 FROM oks_bill_sub_lines bsl, oks_bill_cont_lines bcl
10632 WHERE bsl.cle_id = p_line_id
10633 AND TRUNC(bsl.date_billed_from) = TRUNC(p_start_date)
10634 AND bsl.bcl_id = bcl.id
10635 AND bcl.bill_action = 'RI';
10636
10637
10638
10639 l_LineSch_rec l_LineSch_Csr%ROWTYPE;
10640 l_line_sll_rec l_line_sll_csr%ROWTYPE;
10641 i number;
10642 l_end_dt Date;
10643 l_line_end_dt date;
10644 l_uom_code varchar2(3);
10645 l_uom_per_period number;
10646 l_period_end_dt date;
10647
10648 BEGIN
10649
10650 --The procedure update the sll end date and level elements end date for a line and subline.
10651 ---this is written as end date in oks_stream_levels_b and oks_level_elements didn't get migrated .
10652
10653 x_return_status := 'S';
10654 l_period_end_dt := null;
10655
10656 l_lvl_ele_tbl_in.DELETE;
10657
10658 FOR l_line_sll_rec IN l_line_sll_csr
10659 LOOP
10660 update oks_stream_levels_b set end_date = l_line_sll_rec.sll_end_date
10661 WHERE id = l_line_sll_rec.id;
10662 END LOOP;
10663
10664
10665 i := 1;
10666
10667 FOR l_LineSch_rec IN l_LineSch_csr
10668 LOOP
10669
10670 if i > 1 then
10671 l_lvl_ele_tbl_in(i - 1).Date_end := l_LineSch_rec.date_start - 1;
10672 END IF;
10673
10674 l_lvl_ele_tbl_in(i).Id := l_LineSch_rec.id;
10675 l_lvl_ele_tbl_in(i).date_start := l_LineSch_rec.date_start;
10676 l_lvl_ele_tbl_in(i).date_completed := l_LineSch_rec.date_completed;
10677
10678 l_uom_code := l_LineSch_rec.uom_code;
10679 l_uom_per_period := l_LineSch_rec.uom_per_period;
10680
10681 i := i + 1;
10682 END LOOP;
10683
10684 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
10685
10686 l_end_dt := OKC_TIME_UTIL_PUB.get_enddate(
10687 l_lvl_ele_tbl_in(i - 1).Date_start,
10688 l_uom_code,
10689 l_uom_per_period);
10690
10691 -----errorout_ad('calculated date = '|| l_end_dt || ' start = '|| l_lvl_ele_tbl_in(i - 1).Date_start);
10692
10693 ---IF CALCULATED end date > line end date then take line end date
10694
10695 IF p_term_date IS NOT NULL THEN
10696
10697 IF l_lvl_ele_tbl_in(i-1).date_completed IS NOT NULL THEN --- for billed
10698
10699 IF p_lse_id IN (1, 12, 14, 19, 46) THEN ---top line
10700 ---get period end date bill_cont_lines
10701 OPEN l_bcl_Csr(p_line_id, l_lvl_ele_tbl_in(i-1).date_start );
10702 FETCH l_bcl_Csr INTO l_period_end_dt;
10703 IF l_bcl_Csr%NOTFOUND THEN
10704 l_period_end_dt := null;
10705 END IF;
10706 CLOSE l_bcl_Csr;
10707 ELSE ---sub line
10708 ---get period end date bill_sub _lines
10709 OPEN l_bsl_Csr(p_line_id, l_lvl_ele_tbl_in(i-1).date_start);
10710 FETCH l_bsl_Csr INTO l_period_end_dt;
10711 IF l_bsl_Csr%NOTFOUND THEN
10712 l_period_end_dt := null;
10713 END IF;
10714 CLOSE l_bsl_Csr;
10715 END IF; ---end of top line chk
10716
10717 END IF; ---end of bill chk
10718
10719 IF l_period_end_dt IS NOT NULL THEN ---rec in bill tbl
10720 l_lvl_ele_tbl_in(i-1).date_end := l_period_end_dt;
10721 ELSE
10722
10723 IF l_end_dt > (p_term_date - 1) AND l_lvl_ele_tbl_in(i-1).date_end < p_term_date THEN
10724
10725 l_lvl_ele_tbl_in(i-1).date_end := (p_term_date - 1);
10726 ELSE
10727 l_lvl_ele_tbl_in(i-1).date_end := l_end_dt;
10728 END IF;
10729 END IF; ----end of l_period_end_dt null chk
10730
10731 ELSE ---not terminated
10732
10733 IF P_END_DATE IS NOT NULL AND l_end_dt > p_END_DATE THEN
10734 l_lvl_ele_tbl_in(i-1).date_end := p_END_DATE;
10735 -----errorout_ad('p_end_date = '|| p_end_date);
10736 ELSE
10737 l_lvl_ele_tbl_in(i-1).date_end := l_end_dt;
10738 -----errorout_ad('l_end_dt = '|| l_end_dt);
10739 END IF;
10740 end if;
10741
10742 IF l_lvl_ele_tbl_in(i-1).date_end > p_END_DATE THEN
10743 l_lvl_ele_tbl_in(i-1).date_end := p_END_DATE;
10744 END IF;
10745
10746 FOR i IN l_lvl_ele_tbl_in.FIRST .. l_lvl_ele_tbl_in.LAST
10747 LOOP
10748
10749 UPDATE oks_level_elements SET date_end = TRUNC(l_lvl_ele_tbl_in(i).date_end)
10750 WHERE id = l_lvl_ele_tbl_in(i).id;
10751 END LOOP;
10752 END IF; ---tbl count chk.
10753
10754
10755
10756
10757 EXCEPTION
10758 WHEN OTHERS THEN
10759 x_return_status := G_RET_STS_UNEXP_ERROR;
10760
10761 END populate_end_date;
10762
10763
10764
10765 Procedure UPDATE_BS_ENDDATE(p_line_id IN NUMBER,
10766 p_chr_id IN NUMBER,
10767 x_return_status OUT NOCOPY VARCHAR2)
10768
10769 IS
10770
10771
10772 Cursor l_hdrSch_Csr Is
10773 SELECT sll.uom_code, sll.uom_per_period,
10774 element.id,element.date_start
10775 FROM oks_level_elements element, oks_stream_levels_b sll
10776 WHERE sll.id = element.rul_id
10777 AND sll.chr_id = p_chr_id
10778 ORDER BY element.date_start;
10779
10780 CURSOR l_hdr_sll_csr IS
10781 SELECT id, start_date, OKC_TIME_UTIL_PUB.get_enddate(
10782 start_DATE,
10783 uom_code,
10784 uom_per_period * level_periods) sll_end_date
10785 FROM oks_stream_levels_b
10786 WHERE chr_id = p_chr_id;
10787
10788 CURSOR l_line_csr IS
10789 SELECT TRUNC(end_date) end_date, trunc(date_terminated) date_terminated, lse_id
10790 FROM okc_k_lines_b
10791 WHERE id = p_line_id;
10792
10793 CURSOR l_subline_csr IS
10794 SELECT ID,TRUNC(end_date) end_date, trunc(date_terminated) date_terminated
10795 FROM okc_k_lines_b
10796 WHERE cle_id = p_line_id
10797 AND lse_id in(35,7,8,9,10,11,13,18,25);
10798
10799 i NUMBER;
10800 l_end_dt date;
10801 l_line_rec l_line_csr%ROWTYPE;
10802 l_Subline_rec l_subline_csr%ROWTYPE;
10803 l_hdr_sll_rec l_hdr_sll_csr%rowtype;
10804 l_hdrSch_rec l_hdrSch_Csr%rowtype;
10805
10806 l_uom_code varchar2(3);
10807 l_uom_per_period number;
10808
10809
10810
10811 BEGIN
10812
10813 --The procedure update the sll end date and level elements end date for a hdr schedule.
10814 ---this is written as end date in oks_stream_levels_b and oks_level_elements didn't get migrated .
10815
10816
10817
10818 x_return_status := 'S';
10819 l_lvl_ele_tbl_in.DELETE;
10820
10821 IF p_chr_id IS NOT NULL THEN
10822 FOR l_hdr_sll_rec IN l_hdr_sll_csr
10823 LOOP
10824 update oks_stream_levels_b set end_date = l_hdr_sll_rec.sll_end_date
10825 WHERE id = l_hdr_sll_rec.id;
10826 END LOOP;
10827
10828
10829 i := 1;
10830
10831 FOR l_hdrSch_rec IN l_hdrsch_csr
10832 LOOP
10833
10834 if i > 1 then
10835 l_lvl_ele_tbl_in(i - 1).Date_end := l_hdrSch_rec.date_start - 1;
10836 END IF;
10837
10838 l_lvl_ele_tbl_in(i).Id := l_hdrSch_rec.id;
10839 l_lvl_ele_tbl_in(i).date_start := l_hdrSch_rec.date_start;
10840
10841 l_uom_code := l_hdrSch_rec.uom_code;
10842 l_uom_per_period := l_hdrSch_rec.uom_per_period;
10843
10844
10845 i := i + 1;
10846 END LOOP;
10847
10848 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
10849 l_end_dt := OKC_TIME_UTIL_PUB.get_enddate(
10850 l_lvl_ele_tbl_in(i - 1).Date_start,
10851 l_uom_code,
10852 l_uom_per_period);
10853
10854 l_lvl_ele_tbl_in(i-1).date_end := l_end_dt;
10855
10856
10857 FOR i IN l_lvl_ele_tbl_in.FIRST .. l_lvl_ele_tbl_in.LAST
10858 LOOP
10859
10860 UPDATE oks_level_elements SET date_end = TRUNC(l_lvl_ele_tbl_in(i).date_end)
10861 WHERE id = l_lvl_ele_tbl_in(i).id;
10862 END LOOP;
10863 END IF;
10864
10865
10866 ELSIF p_line_id IS NOT null THEN
10867
10868 OPEN l_Line_Csr;
10869 FETCH l_Line_Csr INTO l_Line_rec;
10870 IF l_Line_Csr%NOTFOUND THEN
10871 CLOSE l_Line_Csr;
10872 RETURN;
10873 END IF;
10874 CLOSE l_Line_Csr;
10875
10876 Populate_end_date(p_line_id => p_line_id,
10877 p_end_date => l_line_rec.end_date,
10878 p_term_date => l_line_rec.date_terminated,
10879 p_lse_id => l_line_rec.lse_id,
10880 x_return_status => x_return_status);
10881
10882 IF x_return_status <> 'S' THEN
10883 RAISE G_EXCEPTION_HALT_VALIDATION;
10884 END IF;
10885
10886
10887 IF l_line_rec.lse_id IN (1,12,14,19) THEN ---if line is top line
10888
10889 FOR l_subline_rec IN l_subline_csr
10890 LOOP
10891
10892 Populate_end_date(p_line_id => l_subline_rec.id,
10893 p_end_date => l_subline_rec.end_date,
10894 p_term_date => l_subline_rec.date_terminated,
10895 p_lse_id => 0,
10896 x_return_status => x_return_status);
10897
10898
10899
10900 IF x_return_status <> 'S' THEN
10901 RAISE G_EXCEPTION_HALT_VALIDATION;
10902 END IF;
10903 END LOOP;
10904
10905 END IF;
10906
10907 END IF; ---for line/hdr
10908
10909 COMMIT;
10910 EXCEPTION
10911 WHEN G_EXCEPTION_HALT_VALIDATION THEN
10912 ROLLBACK;
10913 x_return_status := 'E';
10914
10915 WHEN OTHERS THEN
10916 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
10917 p_msg_name => G_UNEXPECTED_ERROR,
10918 p_token1 => G_SQLCODE_TOKEN,
10919 p_token1_value => sqlcode,
10920 p_token2 => G_SQLERRM_TOKEN,
10921 p_token2_value => sqlerrm);
10922
10923 x_return_status := G_RET_STS_UNEXP_ERROR;
10924
10925
10926 END update_bs_enddate;
10927
10928
10929
10930 PROCEDURE Rollup_lvl_amt(
10931 p_Line_Rec IN Line_Det_Type,
10932 p_SubLine_rec IN Prod_Det_Type,
10933 p_top_line_bs IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
10934 x_return_status OUT NOCOPY VARCHAR2)
10935 IS
10936
10937 CURSOR l_cp_BS_csr(p_cp_id NUMBER) IS
10938 SELECT id, trunc(date_start) date_start,
10939 amount, trunc(date_end) date_end
10940 FROM oks_level_elements element
10941 WHERE cle_id = p_cp_id
10942 ORDER by date_start;
10943
10944 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
10945 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
10946 l_index number;
10947 l_top_bs_ind number;
10948 l_cp_bs_ind number;
10949
10950
10951 BEGIN
10952 x_return_status := OKC_API.G_RET_STS_SUCCESS;
10953
10954 l_cp_bs_tbl.DELETE;
10955 l_index := 1;
10956
10957 FOR l_cp_BS_rec IN l_cp_BS_csr(p_SubLine_rec.cp_id)
10958 LOOP
10959 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
10960 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
10961 l_cp_bs_tbl(l_index).date_end := l_cp_BS_rec.date_end;
10962 l_cp_bs_tbl(l_index).Amount := l_cp_BS_rec.amount;
10963
10964 l_index := l_index + 1;
10965 END LOOP;
10966
10967 IF l_cp_bs_tbl.COUNT <= 0 THEN
10968 RETURN;
10969 END IF;
10970
10971 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
10972 l_top_bs_ind := p_top_line_bs.FIRST;
10973 -----errorout_ad('top line bs first = ' || l_top_bs_ind);
10974
10975 WHILE TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) > TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) AND
10976 l_top_bs_ind < p_top_line_bs.LAST
10977 LOOP
10978 l_top_bs_ind := p_top_line_bs.NEXT(l_top_bs_ind);
10979 END LOOP;
10980
10981 -----errorout_ad('after while loop in adj = ' || l_top_bs_ind);
10982 ---chk first cp bs.st_dt if between previous and present record
10983
10984
10985 IF l_top_bs_ind = p_top_line_bs.first THEN
10986 NULL;
10987
10988 ELSIF l_top_bs_ind <= p_top_line_bs.LAST THEN
10989
10990 l_top_bs_ind := l_top_bs_ind - 1;
10991 IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= p_top_line_bs(l_top_bs_ind ).DATE_START
10992 AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= p_top_line_bs(l_top_bs_ind ).DATE_end THEN
10993
10994 NULL;
10995 ELSE
10996 l_top_bs_ind := l_top_bs_ind + 1;
10997 END IF;
10998
10999 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) THEN
11000 NULL;
11001
11002 end if;
11003
11004
11005 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
11006 LOOP
11007
11008 IF l_top_bs_ind <= p_top_line_bs.LAST THEN
11009
11010 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);
11011 l_top_bs_ind := l_top_bs_ind + 1;
11012
11013 END IF;
11014 END LOOP;
11015
11016
11017 EXCEPTION
11018 WHEN G_EXCEPTION_HALT_VALIDATION THEN
11019 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11020 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11021 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11022 RAISE OKC_API.G_EXCEPTION_ERROR;
11023 END IF;
11024 WHEN OTHERS THEN
11025 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11026 p_msg_name => G_UNEXPECTED_ERROR,
11027 p_token1 => G_SQLCODE_TOKEN,
11028 p_token1_value => sqlcode,
11029 p_token2 => G_SQLERRM_TOKEN,
11030 p_token2_value => sqlerrm);
11031
11032 x_return_status := G_RET_STS_UNEXP_ERROR;
11033
11034 end Rollup_lvl_amt;
11035
11036
11037 /* Overloaded procedure for OKL bug# 3307323*/
11038 Procedure Create_Bill_Sch_Rules
11039 (
11040 p_slh_rec IN StreamHdr_Type
11041 , p_sll_tbl IN StreamLvl_tbl
11042 , p_invoice_rule_id IN Number
11043 , x_bil_sch_out_tbl OUT NOCOPY ItemBillSch_tbl
11044 , x_return_status OUT NOCOPY Varchar2
11045 )
11046
11047 IS
11048
11049 BEGIN
11050
11051 x_return_status := 'S';
11052
11053 END Create_Bill_Sch_Rules;
11054
11055
11056 PROCEDURE Adjust_cp_trx_inv_dt(
11057 p_top_bs_tbl IN oks_bill_level_elements_pvt.letv_tbl_type,
11058 p_SubLine_id IN NUMBER,
11059 x_cp_line_bs OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
11060 x_return_status OUT NOCOPY VARCHAR2)
11061 IS
11062
11063 CURSOR l_cp_BS_csr IS
11064 SELECT id, trunc(date_start) date_start,
11065 date_to_interface, date_transaction, object_version_number
11066 FROM oks_level_elements
11067 WHERE cle_id = p_SubLine_id
11068 AND date_completed IS NULL
11069 ORDER BY date_start;
11070
11071 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
11072 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11073 l_index number;
11074 l_top_bs_ind number;
11075 l_cp_bs_ind number;
11076
11077
11078 BEGIN
11079 x_return_status := OKC_API.G_RET_STS_SUCCESS;
11080
11081 l_cp_bs_tbl.DELETE;
11082 l_index := 1;
11083
11084 FOR l_cp_BS_rec IN l_cp_BS_csr
11085 LOOP
11086 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
11087 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
11088 l_cp_bs_tbl(l_index).date_transaction := l_cp_BS_rec.date_transaction;
11089 l_cp_bs_tbl(l_index).date_to_interface := l_cp_BS_rec.date_to_interface;
11090 l_cp_bs_tbl(l_index).object_version_number := l_cp_BS_rec.object_version_number;
11091
11092
11093 l_index := l_index + 1;
11094 END LOOP;
11095
11096 IF l_cp_bs_tbl.COUNT <= 0 THEN
11097 RETURN;
11098 END IF;
11099
11100 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
11101 l_top_bs_ind := p_top_bs_tbl.FIRST;
11102
11103
11104 WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > p_top_bs_tbl(l_top_bs_ind).DATE_START AND
11105 l_top_bs_ind < p_top_bs_tbl.LAST
11106 LOOP
11107 l_top_bs_ind := p_top_bs_tbl.NEXT(l_top_bs_ind);
11108 END LOOP;
11109
11110 ---chk first cp bs.st_dt if between previous and present record
11111
11112 IF l_top_bs_ind = p_top_bs_tbl.first THEN
11113 NULL;
11114
11115 ELSIF l_cp_bs_tbl(l_cp_bs_ind).date_start >= p_top_bs_tbl(l_top_bs_ind - 1).DATE_START
11116 AND l_cp_bs_tbl(l_cp_bs_ind).date_start < p_top_bs_tbl(l_top_bs_ind ).DATE_START THEN
11117
11118 l_top_bs_ind := l_top_bs_ind - 1;
11119
11120 elsif l_cp_bs_tbl(l_cp_bs_ind).date_start = p_top_bs_tbl(l_top_bs_ind).DATE_START THEN
11121 null;
11122 END IF;
11123
11124 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
11125 LOOP
11126
11127 IF l_top_bs_ind <= p_top_bs_tbl.LAST THEN
11128
11129 x_cp_line_bs(l_cp_bs_ind).id := l_cp_bs_tbl(l_cp_bs_ind).id;
11130 x_cp_line_bs(l_cp_bs_ind).date_start := l_cp_bs_tbl(l_cp_bs_ind).date_start;
11131 x_cp_line_bs(l_cp_bs_ind).date_transaction := p_top_bs_tbl(l_top_bs_ind).date_transaction;
11132 x_cp_line_bs(l_cp_bs_ind).date_to_interface := p_top_bs_tbl(l_top_bs_ind).date_to_interface;
11133 x_cp_line_bs(l_cp_bs_ind).object_version_number := l_cp_bs_tbl(l_cp_bs_ind).object_version_number;
11134
11135 l_top_bs_ind := l_top_bs_ind + 1;
11136
11137 END IF;
11138 END LOOP;
11139
11140
11141 EXCEPTION
11142 WHEN G_EXCEPTION_HALT_VALIDATION THEN
11143 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11144 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11145 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11146 RAISE OKC_API.G_EXCEPTION_ERROR;
11147 END IF;
11148 WHEN OTHERS THEN
11149 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11150 p_msg_name => G_UNEXPECTED_ERROR,
11151 p_token1 => G_SQLCODE_TOKEN,
11152 p_token1_value => sqlcode,
11153 p_token2 => G_SQLERRM_TOKEN,
11154 p_token2_value => sqlerrm);
11155
11156 x_return_status := G_RET_STS_UNEXP_ERROR;
11157
11158 end Adjust_cp_trx_inv_dt;
11159
11160
11161
11162 Procedure Preview_Subscription_Bs(p_sll_tbl IN StreamLvl_tbl,
11163 p_invoice_rule_id IN Number,
11164 p_line_detail IN LINE_TYPE,
11165 x_bil_sch_out_tbl OUT NOCOPY ItemBillSch_tbl,
11166 x_return_status OUT NOCOPY Varchar2)
11167
11168
11169 IS
11170 l_sll_tbl OKS_BILL_SCH.StreamLvl_tbl;
11171 l_index NUMBER;
11172 l_sll_prorate_tbl sll_prorated_tab_type;
11173 l_bill_sch_amt NUMBER;
11174 l_next_cycle_dt DATE;
11175 l_tbl_seq NUMBER;
11176 l_lvl_seq NUMBER;
11177 l_adjusted_amount NUMBER;
11178
11179
11180
11181 l_api_version CONSTANT NUMBER := 1.0;
11182 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
11183 l_msg_count NUMBER;
11184 l_msg_data VARCHAR2(2000);
11185
11186 -- Start - Added by PMALLARA - Bug #3992530
11187 Lvl_Element_cnt Number := 0;
11188 Strm_Start_Date Date;
11189 -- End - Added by PMALLARA - Bug #3992530
11190
11191 l_period_start VARCHAR2(30);
11192 l_period_type VARCHAR2(10);
11193
11194
11195 BEGIN
11196
11197 x_return_status := 'S';
11198
11199 IF p_sll_tbl.count <= 0 THEN
11200 RETURN;
11201 END IF;
11202
11203 l_sll_tbl := p_sll_tbl;
11204 l_sll_prorate_tbl.DELETE;
11205
11206 FOR l_index IN p_sll_tbl.FIRST .. p_sll_tbl.LAST
11207 LOOP
11208 l_sll_prorate_tbl(l_index).sll_seq_num := p_sll_tbl(l_index).Sequence_no;
11209 IF L_index = p_sll_tbl.FIRST THEN
11210
11211 l_sll_prorate_tbl(l_index).sll_start_date := p_line_detail.start_dt;
11212 ELSE
11213 l_sll_prorate_tbl(l_index).sll_start_date := l_sll_prorate_tbl(l_sll_prorate_tbl.PRIOR(l_index)).sll_end_date + 1;
11214 END IF;
11215
11216 l_sll_prorate_tbl(l_index).sll_end_date := OKC_TIME_UTIL_PUB.get_enddate(
11217 l_sll_prorate_tbl(l_index).sll_start_date,
11218 p_sll_tbl(l_index).uom_code,
11219 (p_sll_tbl(l_index).level_periods * p_sll_tbl(l_index).uom_per_period));
11220
11221 l_sll_prorate_tbl(l_index).sll_tuom := p_sll_tbl(l_index).uom_code;
11222 l_sll_prorate_tbl(l_index).sll_period := p_sll_tbl(l_index).level_periods;
11223
11224 END LOOP;
11225
11226
11227 Calculate_sll_amount(
11228 p_api_version => l_api_version,
11229 p_total_amount => p_line_detail.amount,
11230 p_currency_code => nvl(p_line_detail.currency_code,'USD'),
11231 p_period_start => l_period_start,
11232 p_period_type => l_period_type,
11233 p_sll_prorated_tab => l_sll_prorate_tbl,
11234 x_return_status => x_return_status);
11235
11236
11237 -----errorout_ad ('Calculate_sll_amount STATUS = ' || x_return_status);
11238
11239
11240 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11241 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11242 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11243 RAISE OKC_API.G_EXCEPTION_ERROR;
11244 END IF;
11245
11246 FOR l_index IN l_sll_prorate_tbl.FIRST .. l_sll_prorate_tbl.LAST
11247 LOOP
11248 l_sll_tbl(l_index).level_amount := l_sll_prorate_tbl(l_index).sll_amount;
11249 l_sll_tbl(l_index).end_date := l_sll_prorate_tbl(l_index).sll_end_date;
11250 l_sll_tbl(l_index).start_date := l_sll_prorate_tbl(l_index).sll_start_date;
11251
11252 END LOOP; ---END OF sll tbl UPDATE LOOP
11253
11254
11255 l_index := l_sll_tbl.FIRST;
11256 l_bill_sch_amt := 0;
11257 l_tbl_seq := 1;
11258
11259 LOOP ---sll tbl loop
11260 l_next_cycle_dt := l_sll_tbl(l_index).start_date;
11261 l_lvl_seq := 1;
11262
11263 -- Start - Added by PMALLARA - Bug #3992530
11264 Lvl_Element_cnt := 0;
11265 LOOP -------------for level elements of one rule
11266 Lvl_Element_cnt := Lvl_Element_cnt + 1;
11267 if Lvl_Element_cnt = 1 then
11268 Strm_Start_Date := l_next_cycle_dt;
11269 end if;
11270 -- End - Added by PMALLARA - Bug #3992530
11271 l_fnd_lvl_in_rec.line_start_date := p_line_detail.start_dt;
11272 l_fnd_lvl_in_rec.line_end_date := p_line_detail.end_dt;
11273 l_fnd_lvl_in_rec.cycle_start_date := l_next_cycle_dt;
11274 -- Start - Modified by PMALLARA - Bug #3992530
11275 l_fnd_lvl_in_rec.tuom_per_period := Lvl_Element_cnt * l_sll_tbl(l_index).uom_Per_Period;
11276 -- End - Modified by PMALLARA - Bug #3992530
11277 l_fnd_lvl_in_rec.tuom := l_sll_tbl(l_index).uom_code;
11278 l_fnd_lvl_in_rec.total_amount := nvl(p_line_detail.amount,0) - nvl(l_bill_sch_amt,0);
11279 l_fnd_lvl_in_rec.invoice_offset_days := l_sll_tbl(l_index).invoice_offset_days;
11280 l_fnd_lvl_in_rec.interface_offset_days := l_sll_tbl(l_index).Interface_offset_days;
11281 l_fnd_lvl_in_rec.bill_type := 'E';
11282 -------------------------------------------------------------------------
11283 -- Begin partial period computation logic
11284 -- Developer Mani Choudhary
11285 -- Date 09-MAY-2005
11286 -- Added two new parameters p_period_start and p_period_type
11287 -------------------------------------------------------------------------
11288 -- Start - Modified by PMALLARA - Bug #3992530
11289 OKS_BILL_UTIL_PUB.Get_next_bill_sch
11290 (p_api_version => l_api_version,
11291 x_return_status => x_return_status,
11292 x_msg_count => l_msg_count,
11293 x_msg_data => l_msg_data,
11294 p_invoicing_rule_id => NVL(p_invoice_rule_id,-2),
11295 p_bill_sch_detail_rec => l_fnd_lvl_in_rec,
11296 x_bill_sch_detail_rec => l_fnd_lvl_out_rec,
11297 p_period_start => NULL,
11298 p_period_type => NULL,
11299 Strm_Start_Date => Strm_Start_Date);
11300 -- End - Modified by PMALLARA - Bug #3992530
11301
11302
11303 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11304 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11305 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11306 RAISE OKC_API.G_EXCEPTION_ERROR;
11307 END IF;
11308
11309
11310
11311 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_detail.start_dt then
11312 null; ---donot insert record in level element
11313 ELSE
11314
11315 IF (l_index = l_sll_tbl.last AND
11316 l_lvl_seq = l_sll_tbl(l_sll_tbl.last).level_periods) OR
11317 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > p_Line_detail.end_dt) THEN
11318
11319 l_adjusted_amount := nvl(p_Line_detail.amount,0) - nvl(l_bill_sch_amt,0);
11320
11321 ELSE --not adjustment round
11322 l_adjusted_amount := l_sll_tbl(l_index).level_amount;
11323 END IF;
11324
11325
11326
11327 --insert in lvl element preview tbl
11328
11329 x_bil_sch_out_tbl(l_tbl_seq).Strm_Lvl_Seq_Num := l_sll_tbl(l_index).sequence_no;
11330 x_bil_sch_out_tbl(l_tbl_seq).Lvl_Element_Seq_Num := to_char(l_lvl_seq);
11331 IF l_next_cycle_dt < p_Line_detail.start_dt THEN
11332 x_bil_sch_out_tbl(l_tbl_seq).bill_from_date := TRUNC(p_Line_detail.start_dt);
11333 ELSE
11334 x_bil_sch_out_tbl(l_tbl_seq).bill_from_date := TRUNC(l_next_cycle_dt);
11335 END IF;
11336
11337 x_bil_sch_out_tbl(l_tbl_seq).bill_to_date := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
11338
11339 x_bil_sch_out_tbl(l_tbl_seq).amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
11340 l_adjusted_amount,NVL(p_line_detail.currency_code,'USD'));
11341
11342
11343 x_bil_sch_out_tbl(l_tbl_seq).tx_date := TRUNC(l_fnd_lvl_out_rec.date_transaction);
11344 x_bil_sch_out_tbl(l_tbl_seq).interface_date := TRUNC(l_fnd_lvl_out_rec.date_to_interface);
11345
11346 l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(x_bil_sch_out_tbl(l_tbl_seq).amount,0);
11347
11348 l_tbl_seq := l_tbl_seq + 1;
11349 END IF; -----end if for level element creation
11350
11351 l_next_cycle_dt := l_fnd_lvl_out_rec.next_cycle_date;
11352
11353 EXIT WHEN (l_lvl_seq = l_sll_tbl(l_index).level_periods) OR
11354 (TRUNC(l_next_cycle_dt) > p_line_detail.end_dt) OR
11355 (TRUNC(l_next_cycle_dt) > l_sll_tbl(l_index).end_date)
11356 ;
11357
11358 l_lvl_seq := l_lvl_seq + 1;
11359
11360 END LOOP; ---loop for sll period counter
11361
11362 EXIT WHEN (l_index = l_sll_tbl.LAST) OR
11363 (TRUNC(l_next_cycle_dt) > p_line_detail.end_dt);
11364
11365 l_index := l_sll_tbl.NEXT(l_index);
11366
11367 END LOOP; -----loop for sll tbl
11368
11369 EXCEPTION
11370
11371 WHEN OTHERS THEN
11372 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11373 p_msg_name => G_UNEXPECTED_ERROR,
11374 p_token1 => G_SQLCODE_TOKEN,
11375 p_token1_value => sqlcode,
11376 p_token2 => G_SQLERRM_TOKEN,
11377 p_token2_value => sqlerrm);
11378
11379 x_return_status := G_RET_STS_UNEXP_ERROR;
11380
11381
11382 END Preview_Subscription_Bs;
11383
11384
11385 PROCEDURE ADJUST_REPLACE_PRODUCT_BS(p_old_cp_id IN NUMBER,
11386 p_new_cp_id IN NUMBER,
11387 x_return_status OUT NOCOPY VARCHAR2,
11388 x_msg_count OUT NOCOPY NUMBER,
11389 x_msg_data OUT NOCOPY VARCHAR2)
11390
11391 IS
11392
11393 CURSOR l_old_sll_csr IS
11394 SELECT id , cle_id, dnz_chr_id ,
11395 sequence_no, uom_code, start_date,
11396 end_date, uom_per_period,advance_periods,level_periods,
11397 level_amount, invoice_offset_days,interface_offset_days,
11398 comments, due_arr_yn,amount,
11399 lines_detailed_yn, security_group_id
11400 FROM OKS_STREAM_LEVELS_B
11401 WHERE cle_id = p_old_cp_id
11402 ORDER BY START_DATE;
11403
11404 CURSOR l_old_bill_type_csr IS
11405 SELECT billing_schedule_type
11406 FROM OKS_K_LINES_B
11407 WHERE cle_id = p_old_cp_id;
11408
11409 CURSOR l_new_cp_csr IS
11410 SELECT id,end_date
11411 FROM okc_k_lines_b
11412 WHERE id = p_new_cp_id;
11413
11414
11415
11416 l_old_sll_rec l_old_sll_csr%ROWTYPE;
11417 l_new_cp_rec l_new_cp_csr%ROWTYPE;
11418
11419 l_old_bill_type OKS_K_LINES_B.billing_schedule_type%TYPE;
11420 l_sll_index NUMBER;
11421 l_index NUMBER;
11422 l_sll_end_date DATE;
11423
11424 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
11425
11426 BEGIN
11427 x_return_status := 'S';
11428
11429
11430
11431 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11432
11433 fnd_log.STRING (fnd_log.level_statement,
11434 G_MODULE_CURRENT || '.adjust_replace_product_bs.line_details',
11435 'old sub line id passed = ' || p_old_cp_id
11436 || ', new sub line id passed = ' || p_new_cp_id
11437 );
11438 END IF;
11439
11440
11441 OPEN l_old_bill_type_csr;
11442 FETCH l_old_bill_type_csr INTO l_old_bill_type;
11443 IF l_old_bill_type_csr%NOTFOUND THEN
11444 l_old_bill_type := 'T';
11445 END IF;
11446 CLOSE l_old_bill_type_csr;
11447
11448 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11449
11450 fnd_log.STRING (fnd_log.level_statement,
11451 G_MODULE_CURRENT || '.adjust_replace_product_bs.billing_sch_type',
11452 'old line billing scheduel type = ' || l_old_bill_type
11453 );
11454 END IF;
11455
11456 l_sll_index := 0;
11457 l_strm_lvl_tbl_in.DELETE;
11458
11459 FOR l_old_sll_rec IN l_old_sll_csr
11460 LOOP
11461
11462 l_sll_index := l_sll_index + 1;
11463
11464 l_strm_lvl_tbl_in(l_sll_index).chr_id := NULL;
11465 l_strm_lvl_tbl_in(l_sll_index).cle_id := p_new_cp_id;
11466 l_strm_lvl_tbl_in(l_sll_index).dnz_chr_id := l_old_sll_rec.dnz_chr_id;
11467 l_strm_lvl_tbl_in(l_sll_index).sequence_no := l_old_sll_rec.sequence_no;
11468 l_strm_lvl_tbl_in(l_sll_index).uom_code := l_old_sll_rec.uom_code;
11469 l_strm_lvl_tbl_in(l_sll_index).start_date := l_old_sll_rec.start_date;
11470
11471 l_strm_lvl_tbl_in(l_sll_index).end_date := nvl(l_old_sll_rec.end_date,
11472 OKC_TIME_UTIL_PUB.get_enddate(
11473 l_old_sll_rec.start_date,
11474 l_old_sll_rec.uom_code,
11475 (l_old_sll_rec.level_periods *
11476 l_old_sll_rec.uom_per_period)) );
11477
11478
11479 l_strm_lvl_tbl_in(l_sll_index).level_periods := l_old_sll_rec.level_periods;
11480 l_strm_lvl_tbl_in(l_sll_index).uom_per_period := l_old_sll_rec.uom_per_period;
11481 l_strm_lvl_tbl_in(l_sll_index).level_amount := l_old_sll_rec.level_amount;
11482 l_strm_lvl_tbl_in(l_sll_index).invoice_offset_days := l_old_sll_rec.invoice_offset_days;
11483 l_strm_lvl_tbl_in(l_sll_index).interface_offset_days := l_old_sll_rec.interface_offset_days;
11484
11485
11486 l_strm_lvl_tbl_in(l_sll_index).object_version_number := OKC_API.G_MISS_NUM;
11487 l_strm_lvl_tbl_in(l_sll_index).created_by := OKC_API.G_MISS_NUM;
11488 l_strm_lvl_tbl_in(l_sll_index).creation_date := SYSDATE;
11489 l_strm_lvl_tbl_in(l_sll_index).last_updated_by := OKC_API.G_MISS_NUM;
11490 l_strm_lvl_tbl_in(l_sll_index).last_update_date := SYSDATE;
11491
11492 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11493
11494 fnd_log.STRING (fnd_log.level_statement,
11495 G_MODULE_CURRENT || '.adjust_replace_product_bs.new_sll_tbl_dtls',
11496 'sll num = ' || l_sll_index
11497 || ', sll start date = ' || l_strm_lvl_tbl_in(l_sll_index).start_date
11498 || ', sll end date = ' || l_strm_lvl_tbl_in(l_sll_index).end_date
11499 || ', sll uom_code = ' || l_strm_lvl_tbl_in(l_sll_index).uom_code
11500 || ', sll uom_per_period = ' || l_strm_lvl_tbl_in(l_sll_index).uom_per_period
11501 || ', sll sequence_no = ' || l_strm_lvl_tbl_in(l_sll_index).sequence_no
11502 || ', sll cle id = ' || l_strm_lvl_tbl_in(l_sll_index).cle_id
11503 );
11504 END IF;
11505
11506
11507 END LOOP;
11508
11509 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
11510
11511 OKS_SLL_PVT.insert_row(
11512 p_api_version => l_api_version,
11513 p_init_msg_list => l_init_msg_list,
11514 x_return_status => x_return_status,
11515 x_msg_count => x_msg_count,
11516 x_msg_data => x_msg_data,
11517 p_sllv_tbl => l_strm_lvl_tbl_in,
11518 x_sllv_tbl => l_strm_lvl_tbl_out);
11519
11520 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11521 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.insert_sll',
11522 'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
11523 ||', sll tbl out count = '||l_strm_lvl_tbl_out.count||')');
11524 END IF;
11525
11526 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
11527 RAISE G_EXCEPTION_HALT_VALIDATION;
11528 END IF;
11529
11530 OPEN l_new_cp_csr;
11531 FETCH l_new_cp_csr INTO l_new_cp_rec;
11532 IF l_new_cp_csr%NOTFOUND THEN
11533 CLOSE l_new_cp_csr;
11534 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11535 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_replace_product_bs.EXCEPTION',
11536 'new cp not found = ' || p_new_cp_id);
11537 END IF;
11538 RAISE G_EXCEPTION_HALT_VALIDATION;
11539
11540 END IF;
11541 CLOSE l_new_cp_csr;
11542
11543
11544
11545 ----update the level elements of old line to new line.
11546
11547 FOR l_sll_index IN l_strm_lvl_tbl_out.FIRST .. l_strm_lvl_tbl_out.LAST
11548 LOOP
11549
11550 IF l_sll_index = l_strm_lvl_tbl_out.LAST THEN
11551 l_sll_end_date := l_new_cp_rec.end_date;
11552 ELSE
11553 l_sll_end_date := l_strm_lvl_tbl_out(l_sll_index).end_date;
11554 END IF;
11555
11556 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11557 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_lvl_elements',
11558 'sll rule id = ' || l_strm_lvl_tbl_out(l_sll_index).id
11559 ||', sll end date = '|| l_sll_end_date);
11560 END IF;
11561
11562 UPDATE oks_level_elements
11563 SET rul_id = l_strm_lvl_tbl_out(l_sll_index).id,
11564 cle_id = p_new_cp_id
11565 WHERE TRUNC(date_start) <= TRUNC(l_sll_end_date)
11566 AND TRUNC(date_start) >= TRUNC(l_strm_lvl_tbl_out(l_sll_index).start_date)
11567 AND cle_id = p_old_cp_id;
11568
11569 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11570 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_lvl_amt',
11571 'updated level elements = ' || sql%rowcount);
11572 END IF;
11573
11574
11575 END LOOP; ---for loop for sll out tbl
11576
11577 --update bill type of new line
11578
11579 UPDATE oks_k_lines_b
11580 SET billing_schedule_type = l_old_bill_type
11581 WHERE cle_id = p_new_cp_id;
11582
11583 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11584 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_bill_type',
11585 'update bill schedule type of new line to = ' || l_old_bill_type);
11586 END IF;
11587
11588
11589
11590 IF l_old_bill_type IN ('E', 'P') THEN
11591 ---update lvl amount to 0 of old line sll
11592
11593 UPDATE oks_stream_levels_b
11594 SET level_amount = 0
11595 WHERE cle_id = p_old_cp_id;
11596
11597 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11598 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_oldsll_amt',
11599 'update lvl amt of old line to zero = ' || sql%rowcount );
11600 END IF;
11601
11602 END IF; ----chk for bill type E and P
11603
11604
11605 ------update oks_bill_sub_lines with new cle_id
11606
11607 UPDATE oks_bill_sub_lines
11608 SET cle_id = p_new_cp_id
11609 WHERE cle_id = p_old_cp_id;
11610
11611
11612 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11613 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_bcl',
11614 'updated bcl count = ' || sql%rowcount );
11615 END IF;
11616
11617 END IF; ----chk for sll count for old line
11618
11619
11620
11621 EXCEPTION
11622 WHEN G_EXCEPTION_HALT_VALIDATION THEN
11623 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11624 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_replace_product_bs.EXCEPTION',
11625 'G_EXCEPTION_HALT_VALIDATION');
11626 END IF;
11627
11628 WHEN OTHERS THEN
11629 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
11630 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_replace_product_bs.UNEXPECTED',
11631 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
11632 END IF;
11633
11634 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
11635 p_msg_name => G_UNEXPECTED_ERROR,
11636 p_token1 => G_SQLCODE_TOKEN,
11637 p_token1_value => sqlcode,
11638 p_token2 => G_SQLERRM_TOKEN,
11639 p_token2_value => sqlerrm);
11640
11641 x_return_status := G_RET_STS_UNEXP_ERROR;
11642
11643 END ADJUST_REPLACE_PRODUCT_BS;
11644
11645 Procedure ADJUST_SPLIT_BILL_SCH(p_old_cp_id IN NUMBER,
11646 p_new_cp_tbl IN OKS_BILL_SCH.SUBLINE_ID_TBL,
11647 x_return_status OUT NOCOPY VARCHAR2,
11648 x_msg_count OUT NOCOPY NUMBER,
11649 x_msg_data OUT NOCOPY VARCHAR2)
11650
11651 IS
11652
11653 CURSOR l_line_csr(p_line_id NUMBER) IS
11654 SELECT line.id line_id, TRUNC(line.start_date) start_dt,
11655 TRUNC(line.end_date) end_dt, line.dnz_chr_id dnz_chr_id, line.lse_id,
11656 line.cle_id parent_id,line.inv_rule_id inv_rule_id,
11657 (nvl(line.price_negotiated,0) + nvl(dtl.ubt_amount,0) +
11658 nvl(dtl.credit_amount,0) + nvl(dtl.suppressed_credit,0) ) line_amt,
11659 dtl.billing_schedule_type billing_schedule_type
11660 FROM okc_k_lines_b line, oks_k_lines_b dtl
11661 WHERE line.id= p_line_id
11662 AND line.id = dtl.cle_id;
11663
11664 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
11665
11666 SELECT id,trunc(date_start) date_start,
11667 amount,trunc(date_end) date_end,object_version_number,
11668 date_to_interface, date_transaction,date_completed
11669 FROM oks_level_elements
11670 WHERE cle_id = p_line_id
11671 ORDER BY date_start;
11672
11673
11674 CURSOR chk_subline_bs_csr(p_line_id NUMBER) IS
11675 SELECT id
11676 FROM oks_level_elements
11677 WHERE cle_id = p_line_id;
11678
11679 CURSOR l_amt_csr(p_line_id NUMBER) IS
11680
11681 SELECT SUM(NVL(amount,0)) tot_amt
11682 FROM oks_level_elements
11683 WHERE cle_id = p_line_id;
11684
11685 Cursor l_line_amt_csr (p_id in number) IS
11686 Select line.price_negotiated
11687 from okc_k_lines_b line
11688 where line.id = p_id;
11689
11690 l_old_cp_rec Prod_Det_Type;
11691 l_new_cp_rec Prod_Det_Type;
11692 l_line_rec l_line_csr%ROWTYPE;
11693 l_line_BS_rec l_line_BS_csr%ROWTYPE;
11694 l_sll_in_tbl StrmLvl_Out_tbl;
11695 l_cp_sll_out_tbl StrmLvl_Out_tbl;
11696 l_sll_db_tbl oks_bill_sch.StreamLvl_tbl;
11697 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11698 l_new_sll_tbl oks_bill_sch.StreamLvl_tbl;
11699 l_cp_new_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11700 l_cp_old_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
11701
11702
11703 l_top_line_rec Line_Det_Type;
11704 l_cp_rec Prod_Det_Type;
11705 -------------------------------------------------------------------------
11706 -- Begin partial period computation logic
11707 -- Developer Mani Choudhary
11708 -- Date 04-MAY-2005
11709 -------------------------------------------------------------------------
11710 l_price_uom OKS_K_HEADERS_B.PRICE_UOM%TYPE;
11711 l_period_start OKS_K_HEADERS_B.PERIOD_START%TYPE;
11712 l_period_type OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
11713 l_return_status VARCHAR2(30);
11714 l_tangible BOOLEAN;
11715 l_pricing_method VARCHAR2(30);
11716 -------------------------------------------------------------------------
11717 -- End partial period computation logic
11718 -- Date 04-MAY-2005
11719 -------------------------------------------------------------------------
11720
11721 l_billing_type oks_k_lines_b.billing_schedule_type%type;
11722 l_inv_rule_id number;
11723 l_top_line_id NUMBER;
11724 l_bs_id NUMBER;
11725 l_index NUMBER;
11726 l_cp_bs_ind NUMBER;
11727 l_top_bs_ind NUMBER;
11728 l_total_amt NUMBER;
11729 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
11730 L_EXCEPTION_END Exception;
11731
11732
11733 BEGIN
11734
11735 x_return_status := 'S';
11736
11737
11738 ---- return with success if billing schedule doesnt exists for the lines which gets split in IB
11739 Open chk_subline_bs_csr(p_old_cp_id);
11740 Fetch chk_subline_bs_csr Into l_bs_id;
11741 If chk_subline_bs_csr%Notfound then
11742 Close chk_subline_bs_csr;
11743 x_return_status := 'S';
11744 Raise L_EXCEPTION_END;
11745 END IF;
11746
11747 Close chk_subline_bs_csr;
11748
11749 ------------find out the old subline details
11750
11751 Open l_Line_Csr(p_old_cp_id);
11752 Fetch l_Line_Csr Into l_Line_Rec;
11753
11754 If l_Line_Csr%Notfound then
11755 Close l_Line_Csr;
11756 x_return_status := 'E';
11757 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11758 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
11759 'old sub line not found = ' || p_old_cp_id );
11760 END IF;
11761
11762 End If;
11763 Close l_Line_Csr;
11764
11765 -------------------------------------------------------------------------
11766 -- Begin partial period computation logic
11767 -- Developer Mani Choudhary
11768 -- Date 09-MAY-2005
11769 -------------------------------------------------------------------------
11770
11771 OKS_RENEW_UTIL_PUB.Get_Period_Defaults
11772 (
11773 p_hdr_id => l_Line_Rec.dnz_chr_id,
11774 p_org_id => NULL,
11775 x_period_start => l_period_start,
11776 x_period_type => l_period_type,
11777 x_price_uom => l_price_uom,
11778 x_return_status => x_return_status);
11779
11780 IF x_return_status <> 'S' THEN
11781 RAISE G_EXCEPTION_HALT_VALIDATION;
11782 END IF;
11783 --Description in detail for the business rules for deriving the period start
11784 --1)For usage , period start will always be 'SERVICE'
11785 --2)For Subscriptions, period start and period type will be NULL
11786 -- for tangible subscriptions as per CR1.For intangible subscriptions,
11787 -- if the profile OKS: Intangible Subscription Pricing Method
11788 -- is set to 'Subscription Based',then period start and period type will be NULL
11789 -- otherwise it will be 'SERVICE'
11790 --3) For Extended Warranty from OM, period start will always be 'SERVICE'
11791 --mchoudha fix for bug#5183011
11792 IF l_period_start IS NOT NULL AND
11793 l_period_type IS NOT NULL
11794 THEN
11795 IF l_line_rec.lse_id =12 THEN
11796 l_period_start := 'SERVICE';
11797 END IF;
11798 IF l_line_rec.lse_id = 46 THEN
11799 l_tangible := OKS_SUBSCRIPTION_PUB.is_subs_tangible (l_line_rec.line_id);
11800 IF l_tangible THEN
11801 l_period_start := NULL;
11802 l_period_type := NULL;
11803 ELSE
11804 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
11805 IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
11806 l_period_start := NULL;
11807 l_period_type := NULL;
11808 ELSE
11809 l_period_start := 'SERVICE';
11810 END IF; -- l_pricing_method <> 'EFFECTIVITY'
11811 END IF; -- IF l_tangible THEN
11812 END IF; -- IF l_Line_Csr_Rec.lse_id = 46
11813 END IF; -- period start and period type are not NULL
11814 -------------------------------------------------------------------------
11815 -- End partial period computation logic
11816 -- Date 09-MAY-2005
11817 -------------------------------------------------------------------------
11818
11819 l_old_cp_rec.cp_id := l_line_rec.line_id ;
11820 l_old_cp_rec.cp_start_dt := l_line_rec.start_dt;
11821 l_old_cp_rec.cp_end_dt := l_line_rec.end_dt ;
11822 l_old_cp_rec.cp_amt := l_line_rec.line_amt ;
11823
11824 IF l_period_type is not null AND l_period_start is not NULL THEN
11825 OPEN l_line_amt_csr(p_old_cp_id);
11826 FETCH l_line_amt_csr INTO l_old_cp_rec.cp_amt ;
11827 CLOSE l_line_amt_csr;
11828 END IF;
11829 l_top_line_id := l_line_rec.parent_id;
11830
11831
11832 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11833
11834 fnd_log.STRING (fnd_log.level_statement,
11835 G_MODULE_CURRENT || '.adjust_split_bill_sch.old_cp_dtls',
11836 'old subline id = ' || l_old_cp_rec.cp_id
11837 || ', start date = ' || l_old_cp_rec.cp_start_dt
11838 || ', end date = ' || l_old_cp_rec.cp_end_dt
11839 || ', amount = ' || l_old_cp_rec.cp_amt
11840 || ', top line id = ' || l_top_line_id );
11841 END IF;
11842
11843
11844 ------------find out the top line details
11845
11846 Open l_Line_Csr(l_top_line_id);
11847 Fetch l_Line_Csr Into l_Line_Rec;
11848
11849 If l_Line_Csr%Notfound then
11850 Close l_Line_Csr;
11851 x_return_status := 'E';
11852 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11853 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
11854 'top line not found = ' || l_top_line_id );
11855 END IF;
11856
11857 End If;
11858 Close l_Line_Csr;
11859
11860 l_top_line_rec.chr_id := l_line_rec.dnz_chr_id ;
11861 l_top_line_rec.dnz_chr_id := l_line_rec.dnz_chr_id;
11862 l_top_line_rec.id := l_line_rec.line_id ;
11863 l_top_line_rec.lse_id := l_line_rec.lse_id;
11864 l_top_line_rec.line_start_dt := l_line_rec.start_dt;
11865 l_top_line_rec.line_end_dt := l_line_rec.end_dt ;
11866 l_top_line_rec.line_amt := l_line_rec.line_amt ;
11867
11868 IF l_period_type is not null AND l_period_start is not NULL THEN
11869 OPEN l_line_amt_csr(l_top_line_id);
11870 FETCH l_line_amt_csr INTO l_top_line_rec.line_amt;
11871 CLOSE l_line_amt_csr;
11872 END IF;
11873
11874 l_inv_rule_id := l_line_rec.inv_rule_id;
11875 l_billing_type := l_line_rec.billing_schedule_type;
11876
11877
11878 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11879
11880 fnd_log.STRING (fnd_log.level_statement,
11881 G_MODULE_CURRENT || '.adjust_split_bill_sch.top_line_dtls',
11882 'top line id = ' || l_top_line_rec.id
11883 || ', start date = ' || l_top_line_rec.line_start_dt
11884 || ', end date = ' || l_top_line_rec.line_start_dt
11885 || ', amount = ' || l_top_line_rec.line_amt
11886 || ', billing type = ' || l_billing_type
11887 || ', inv rule = ' || l_inv_rule_id);
11888 END IF;
11889
11890
11891 ----get currency
11892 l_currency_code := Find_Currency_Code(
11893 p_cle_id => null,
11894 p_chr_id => l_top_line_rec.dnz_chr_id);
11895
11896 IF l_currency_code IS NULL THEN
11897 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
11898 x_return_status := 'E';
11899 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11900 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
11901 'currency not found for contract id = ' || l_top_line_rec.dnz_chr_id );
11902 END IF;
11903 RETURN;
11904 END IF;
11905
11906
11907 IF l_billing_type IN ('T','E') THEN
11908 l_top_bs_tbl.DELETE;
11909 l_index := 1;
11910
11911 FOR l_line_BS_rec IN l_line_BS_csr(l_top_line_id)
11912 LOOP
11913 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
11914 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
11915 l_top_bs_tbl(l_index).date_end := l_line_bs_rec.date_end;
11916 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
11917 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
11918 l_top_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
11919 l_top_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
11920
11921 l_total_amt := NVL(l_total_amt,0) + NVL(l_line_BS_rec.amount,0);
11922
11923 l_index := l_index + 1;
11924 END LOOP;
11925
11926
11927 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11928
11929 fnd_log.STRING (fnd_log.level_statement,
11930 G_MODULE_CURRENT || '.adjust_split_bill_sch.top_bs_tbl',
11931 'top line lvl elements count = ' || l_top_bs_tbl.count
11932 );
11933 END IF;
11934
11935 ------old cp schedule
11936
11937 l_cp_old_bs_tbl.DELETE;
11938 l_index := 1;
11939 l_total_amt := 0;
11940
11941 FOR l_line_BS_rec IN l_line_BS_csr(p_old_cp_id )
11942 LOOP
11943 l_cp_old_bs_tbl(l_index).id := l_line_BS_rec.id;
11944 l_cp_old_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
11945 l_cp_old_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
11946 l_cp_old_bs_tbl(l_index).date_transaction := l_line_BS_rec.date_transaction;
11947 l_cp_old_bs_tbl(l_index).date_to_interface := l_line_BS_rec.date_to_interface;
11948 l_cp_old_bs_tbl(l_index).date_completed := l_line_BS_rec.date_completed;
11949
11950 l_total_amt := NVL(l_total_amt,0) + NVL(l_line_BS_rec.amount, 0);
11951
11952 l_index := l_index + 1;
11953 END LOOP;
11954
11955
11956 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11957
11958 fnd_log.STRING (fnd_log.level_statement,
11959 G_MODULE_CURRENT || '.adjust_split_bill_sch.old_cp_bs_tbl',
11960 'old cp lvl elements count = ' || l_cp_old_bs_tbl.count
11961 );
11962 END IF;
11963
11964 --------adjust top line bs amount as (top line bs amt - old cp bs amt)
11965 l_cp_bs_ind := l_cp_old_bs_tbl.FIRST;
11966 l_top_bs_ind := l_top_bs_tbl.FIRST;
11967
11968 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
11969 l_top_bs_ind < l_top_bs_tbl.LAST
11970 LOOP
11971 l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
11972 END LOOP;
11973
11974 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11975
11976 fnd_log.STRING (fnd_log.level_statement,
11977 G_MODULE_CURRENT || '.Adjust_split_bill_sch.while_top_bs',
11978 'after while loop in top bs index = ' || l_top_bs_ind
11979 || ' , date start = ' || l_top_bs_tbl(l_top_bs_ind ).DATE_START
11980 );
11981 END IF;
11982
11983 ---chk first cp bs.st_dt if between previous and present record
11984
11985 IF l_top_bs_ind = l_top_bs_tbl.first THEN
11986 NULL;
11987
11988 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)
11989 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
11990
11991 l_top_bs_ind := l_top_bs_ind - 1;
11992
11993 ELSIF l_cp_old_bs_tbl(l_cp_bs_ind).date_start = l_top_bs_tbl(l_top_bs_ind).DATE_START THEN
11994 null;
11995 END IF;
11996
11997
11998
11999 FOR l_cp_bs_ind IN l_cp_old_bs_tbl.FIRST .. l_cp_old_bs_tbl.LAST
12000 LOOP
12001
12002 IF l_top_bs_ind <= l_top_bs_tbl.LAST THEN
12003
12004 l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) -
12005 nvl(l_cp_old_bs_tbl(l_cp_bs_ind).amount,0);
12006 l_top_bs_ind := l_top_bs_ind + 1;
12007
12008 END IF;
12009 END LOOP;
12010
12011 ELSE -----bill type = P
12012
12013 OPEN l_amt_csr(p_old_cp_id);
12014 FETCH l_amt_csr INTO l_total_amt;
12015 CLOSE l_amt_csr;
12016
12017 END IF; -----end of 'T' and E
12018
12019 ------get sll for old sub line, so that sll amt can be prorated for new subline sll.
12020
12021 Get_SLL_info(p_top_line_id => l_top_line_id,
12022 p_line_id => l_old_cp_rec.cp_id ,
12023 x_sll_tbl => l_sll_in_tbl,
12024 x_sll_db_tbl => l_sll_db_tbl,
12025 x_return_status => x_return_status );
12026
12027 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12028 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.get_old_cp_sll',
12029 'Get_SLL_info(x_return_status = '||x_return_status
12030 ||', sll tbl out count = '||l_sll_db_tbl.count||')');
12031 END IF;
12032
12033 IF x_return_status <> 'S' THEN
12034 RAISE G_EXCEPTION_HALT_VALIDATION;
12035 END IF;
12036
12037
12038 IF l_sll_db_tbl.COUNT = 0 THEN
12039 RETURN;
12040 END IF;
12041
12042 FOR i IN p_new_cp_tbl.FIRST .. p_new_cp_tbl.LAST
12043 LOOP
12044 l_new_sll_tbl.DELETE;
12045
12046 l_new_sll_tbl := l_sll_db_tbl;
12047
12048
12049 FOR l_index IN l_sll_db_tbl.FIRST .. l_sll_db_tbl.LAST
12050 LOOP
12051
12052 l_new_sll_tbl(l_index).cle_id := p_new_cp_tbl(i).id;
12053 l_new_sll_tbl(l_index).id := NULL;
12054 END LOOP;
12055
12056
12057 ------------find out the new subline details
12058
12059 Open l_Line_Csr(p_new_cp_tbl(i).id);
12060 Fetch l_Line_Csr Into l_Line_Rec;
12061
12062 If l_Line_Csr%Notfound then
12063 Close l_Line_Csr;
12064 x_return_status := 'E';
12065 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12066 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12067 'new sub line not found = ' || p_new_cp_tbl(i).id );
12068 END IF;
12069
12070 End If;
12071 Close l_Line_Csr;
12072
12073
12074 l_new_cp_rec.cp_id := l_line_rec.line_id ;
12075 l_new_cp_rec.cp_start_dt := l_line_rec.start_dt;
12076 l_new_cp_rec.cp_end_dt := l_line_rec.end_dt ;
12077 l_new_cp_rec.cp_amt := l_line_rec.line_amt ;
12078
12079 IF l_period_type is not null AND l_period_start is not NULL THEN
12080 OPEN l_line_amt_csr(p_new_cp_tbl(i).id);
12081 FETCH l_line_amt_csr INTO l_new_cp_rec.cp_amt;
12082 CLOSE l_line_amt_csr;
12083 END IF;
12084
12085 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12086
12087 fnd_log.STRING (fnd_log.level_statement,
12088 G_MODULE_CURRENT || '.adjust_split_bill_sch.new_cp_dtls',
12089 'new subline id = ' || l_new_cp_rec.cp_id
12090 || ', start date = ' || l_new_cp_rec.cp_start_dt
12091 || ', end date = ' || l_new_cp_rec.cp_end_dt
12092 || ', amount = ' || l_new_cp_rec.cp_amt
12093 || ', top line id = ' || l_top_line_id
12094 );
12095 END IF;
12096
12097
12098 IF l_line_rec.billing_schedule_type IS NULL OR
12099 l_line_rec.billing_schedule_type <> l_billing_type THEN
12100
12101 UPDATE OKS_K_LINES_B SET billing_schedule_type = l_billing_type
12102 WHERE cle_id = l_new_cp_rec.cp_id;
12103
12104
12105 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12106 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.update_bill_type',
12107 'updated new sub line billing type = ' || sql%rowcount);
12108
12109 END IF;
12110 END IF;
12111
12112 IF l_billing_type IN ('E', 'P') THEN
12113 Prorate_sll_amt(
12114 p_old_cp_amt => l_old_cp_rec.cp_amt,
12115 p_new_cp_amt => l_new_cp_rec.cp_amt,
12116 p_total_Amt => l_total_amt,
12117 p_new_sll_tbl => l_new_sll_tbl,
12118 p_old_sll_tbl => l_sll_db_tbl,
12119 x_return_status => x_return_status);
12120
12121 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12122 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.prorate_sll_amt',
12123 'Prorate_sll_amt status = ' || x_return_status
12124 );
12125
12126 END IF;
12127
12128 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12129 RAISE G_EXCEPTION_HALT_VALIDATION;
12130 END IF;
12131 END IF;
12132
12133 l_strm_lvl_tbl_in.DELETE;
12134 l_index := 0;
12135
12136 FOR l_index IN l_new_sll_tbl.FIRST .. l_new_sll_tbl.LAST
12137 LOOP
12138
12139 l_strm_lvl_tbl_in(l_index).chr_id := l_new_sll_tbl(l_index).chr_id;
12140 l_strm_lvl_tbl_in(l_index).dnz_chr_id := l_new_sll_tbl(l_index).dnz_chr_id;
12141 l_strm_lvl_tbl_in(l_index).sequence_no := l_new_sll_tbl(l_index).sequence_no ;
12142 l_strm_lvl_tbl_in(l_index).uom_code := l_new_sll_tbl(l_index).uom_code;
12143 l_strm_lvl_tbl_in(l_index).start_date := l_new_sll_tbl(l_index).start_date;
12144 l_strm_lvl_tbl_in(l_index).end_date := l_new_sll_tbl(l_index).end_date;
12145 l_strm_lvl_tbl_in(l_index).level_periods := l_new_sll_tbl(l_index).level_periods;
12146 l_strm_lvl_tbl_in(l_index).uom_per_period := l_new_sll_tbl(l_index).uom_per_period;
12147 l_strm_lvl_tbl_in(l_index).level_amount := l_new_sll_tbl(l_index).level_amount;
12148 l_strm_lvl_tbl_in(l_index).invoice_offset_days := l_new_sll_tbl(l_index).invoice_offset_days;
12149 l_strm_lvl_tbl_in(l_index).interface_offset_days := l_new_sll_tbl(l_index).interface_offset_days;
12150
12151 l_strm_lvl_tbl_in(l_index).id := NULL;
12152 l_strm_lvl_tbl_in(l_index).cle_id := p_new_cp_tbl(i).id;
12153
12154
12155 l_strm_lvl_tbl_in(l_index).object_version_number := OKC_API.G_MISS_NUM;
12156 l_strm_lvl_tbl_in(l_index).created_by := OKC_API.G_MISS_NUM;
12157 l_strm_lvl_tbl_in(l_index).creation_date := SYSDATE;
12158 l_strm_lvl_tbl_in(l_index).last_updated_by := OKC_API.G_MISS_NUM;
12159 l_strm_lvl_tbl_in(l_index).last_update_date := SYSDATE;
12160
12161
12162 END LOOP;
12163
12164
12165 OKS_SLL_PVT.insert_row(
12166 p_api_version => l_api_version,
12167 p_init_msg_list => l_init_msg_list,
12168 x_return_status => x_return_status,
12169 x_msg_count => x_msg_count,
12170 x_msg_data => x_msg_data,
12171 p_sllv_tbl => l_strm_lvl_tbl_in,
12172 x_sllv_tbl => l_strm_lvl_tbl_out);
12173
12174 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12175 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.insert_sll',
12176 'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
12177 ||', sll tbl out count = '||l_strm_lvl_tbl_out.count||')');
12178 END IF;
12179
12180 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12181 RAISE G_EXCEPTION_HALT_VALIDATION;
12182 END IF;
12183
12184 l_cp_sll_out_tbl.DELETE;
12185
12186 FOR l_tbl_index IN l_strm_lvl_tbl_out.FIRST .. l_strm_lvl_tbl_out.LAST
12187 LOOP
12188
12189 l_cp_sll_out_tbl(l_tbl_index).chr_Id := l_strm_lvl_tbl_out(l_tbl_index).chr_id;
12190 l_cp_sll_out_tbl(l_tbl_index).cle_Id := l_strm_lvl_tbl_out(l_tbl_index).cle_id;
12191 l_cp_sll_out_tbl(l_tbl_index).dnz_chr_Id := l_strm_lvl_tbl_out(l_tbl_index).dnz_chr_id;
12192 l_cp_sll_out_tbl(l_tbl_index).Id := l_strm_lvl_tbl_out(l_tbl_index).id;
12193 l_cp_sll_out_tbl(l_tbl_index).Seq_no := l_strm_lvl_tbl_out(l_tbl_index).sequence_no;
12194 l_cp_sll_out_tbl(l_tbl_index).Dt_start := l_strm_lvl_tbl_out(l_tbl_index).start_date;
12195 l_cp_sll_out_tbl(l_tbl_index).end_date := l_strm_lvl_tbl_out(l_tbl_index).end_date;
12196 l_cp_sll_out_tbl(l_tbl_index).Level_Period := l_strm_lvl_tbl_out(l_tbl_index).level_periods;
12197 l_cp_sll_out_tbl(l_tbl_index).uom_Per_Period := l_strm_lvl_tbl_out(l_tbl_index).uom_per_period;
12198 l_cp_sll_out_tbl(l_tbl_index).uom := l_strm_lvl_tbl_out(l_tbl_index).uom_code;
12199 l_cp_sll_out_tbl(l_tbl_index).Amount := l_strm_lvl_tbl_out(l_tbl_index).level_amount;
12200 l_cp_sll_out_tbl(l_tbl_index).invoice_offset_days := l_strm_lvl_tbl_out(l_tbl_index).invoice_offset_days;
12201 l_cp_sll_out_tbl(l_tbl_index).Interface_offset_days := l_strm_lvl_tbl_out(l_tbl_index).interface_offset_days;
12202
12203 END LOOP;
12204
12205 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12206
12207 fnd_log.STRING (fnd_log.level_statement,
12208 G_MODULE_CURRENT || '.adjust_split_bill_sch.before_new_lvl_ele',
12209 'sll count passed to Create_cp_lvl_elements = ' || l_cp_sll_out_tbl.count);
12210 END IF;
12211
12212 ------create lvl elements for new cp level ele
12213 -------------------------------------------------------------------------
12214 -- Begin partial period computation logic
12215 -- Developer Mani Choudhary
12216 -- Date 09-MAY-2005
12217 -- Added two new parameters p_period_start and p_period_type
12218 -------------------------------------------------------------------------
12219 Create_cp_lvl_elements(
12220 p_billing_type => l_billing_type,
12221 p_cp_sll_tbl => l_cp_sll_out_tbl,
12222 p_Line_Rec => l_top_Line_Rec,
12223 p_SubLine_rec => l_new_cp_rec,
12224 p_invoice_rulid => l_inv_rule_id,
12225 p_top_line_bs => l_top_bs_tbl,
12226 p_term_dt => null,
12227 p_period_start => l_period_start,
12228 p_period_type => l_period_type,
12229 x_return_status => x_return_status);
12230
12231
12232 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12233 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.Create_cp_lvl_elements',
12234 'Create_cp_lvl_elements(x_return_status = '||x_return_status
12235 ||', l_top_bs_tbl count = '||l_top_bs_tbl.count||')');
12236 END IF;
12237
12238 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12239 RAISE G_EXCEPTION_HALT_VALIDATION;
12240 END IF;
12241
12242 ----adjust lvl element amt for old cp and top bs
12243
12244 Adjust_billed_lvl_element(p_new_cp_id => l_new_cp_rec.cp_id,
12245 p_old_cp_bs_tbl => l_cp_old_bs_tbl,
12246 x_new_cp_bs_tbl => l_cp_new_bs_tbl,
12247 x_return_status => x_return_status);
12248
12249
12250 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12251 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.Adjust_billed_lvl_element',
12252 'Adjust_billed_lvl_element(x_return_status = '||x_return_status
12253 ||', l_cp_old_bs_tbl count = '||l_cp_old_bs_tbl.count||')');
12254 END IF;
12255
12256 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12257 RAISE G_EXCEPTION_HALT_VALIDATION;
12258 END IF;
12259
12260
12261 ---add new bill records in billing tables
12262
12263 OKS_BILL_UTIL_PUB.ADJUST_SPLIT_BILL_REC(p_old_cp_id => l_old_cp_rec.cp_id,
12264 p_new_cp_id => l_new_cp_rec.cp_id,
12265 p_currency_code => l_currency_code,
12266 p_rgp_id => NULL,
12267 p_old_cp_lvl_tbl => l_cp_old_bs_tbl,
12268 p_new_cp_lvl_tbl => l_cp_new_bs_tbl,
12269 x_return_status => x_return_status,
12270 x_msg_count => x_msg_count,
12271 x_msg_data => x_msg_data);
12272
12273
12274 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12275 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.bill_rec',
12276 'oks_bill_util_pub.adjust_split_bill_rec(x_return_status = '||x_return_status
12277 ||'old line id = ' || l_old_cp_rec.cp_id || ')');
12278 END IF;
12279
12280 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12281 ----errorout_aD('ADJUST_SPLIT_BILL_REC ststaus = ' || x_return_status);
12282 RAISE G_EXCEPTION_HALT_VALIDATION;
12283 END IF;
12284
12285 l_total_amt := NVL(l_total_amt,0) - NVL(l_new_cp_rec.cp_amt,0);
12286
12287 END LOOP; ---loop for new sub line
12288
12289
12290 ---update old sll amount if billtype in E and P
12291
12292 l_cp_sll_out_tbl.DELETE;
12293
12294 FOR l_index in l_sll_db_tbl.FIRST .. l_sll_db_tbl.LAST
12295 LOOP
12296
12297 IF l_billing_type IN ('E', 'P') THEN
12298
12299 UPDATE oks_stream_levels_b
12300 SET level_amount = l_sll_db_tbl(l_index).level_amount
12301 WHERE id = l_sll_db_tbl(l_index).id;
12302
12303
12304 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12305 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.old_sll_amt_update',
12306 'old sll amount update = '|| l_sll_db_tbl(l_index).level_amount
12307 ||', sll id = '|| l_sll_db_tbl(l_index).id );
12308 END IF;
12309 END IF;
12310
12311
12312 l_cp_sll_out_tbl(l_index).Id := l_sll_db_tbl(l_index).id;
12313 l_cp_sll_out_tbl(l_index).chr_Id := NULL;
12314 l_cp_sll_out_tbl(l_index).cle_Id := l_sll_db_tbl(l_index).cle_id;
12315 l_cp_sll_out_tbl(l_index).dnz_chr_Id := l_sll_db_tbl(l_index).dnz_chr_Id;
12316 l_cp_sll_out_tbl(l_index).Seq_no := l_sll_db_tbl(l_index).sequence_no;
12317 l_cp_sll_out_tbl(l_index).Dt_start := l_sll_db_tbl(l_index).Start_Date;
12318 l_cp_sll_out_tbl(l_index).end_date := l_sll_db_tbl(l_index).end_Date;
12319 l_cp_sll_out_tbl(l_index).Level_Period := l_sll_db_tbl(l_index).level_periods;
12320 l_cp_sll_out_tbl(l_index).uom_Per_Period := l_sll_db_tbl(l_index).uom_per_period;
12321 l_cp_sll_out_tbl(l_index).uom := l_sll_db_tbl(l_index).uom_code;
12322 l_cp_sll_out_tbl(l_index).Amount := l_sll_db_tbl(l_index).level_amount;
12323 l_cp_sll_out_tbl(l_index).invoice_offset_days := l_sll_db_tbl(l_index).invoice_offset_days;
12324 l_cp_sll_out_tbl(l_index).Interface_offset_days := l_sll_db_tbl(l_index).interface_offset_days;
12325
12326 END LOOP;
12327
12328
12329 ----refresh billing sch for old cp.
12330 -------------------------------------------------------------------------
12331 -- Begin partial period computation logic
12332 -- Developer Mani Choudhary
12333 -- Date 09-MAY-2005
12334 -- Added two new parameters p_period_start and p_period_type
12335 -------------------------------------------------------------------------
12336 Create_cp_lvl_elements(
12337 p_billing_type => l_billing_type,
12338 p_cp_sll_tbl => l_cp_sll_out_tbl,
12339 p_Line_Rec => l_top_Line_Rec,
12340 p_SubLine_rec => l_old_cp_rec,
12341 p_invoice_rulid => l_inv_rule_id,
12342 p_top_line_bs => l_top_bs_tbl,
12343 p_term_dt => NULL,
12344 p_period_start => l_period_start, --mchoudha fix for bug#4998167 added l_period_start
12345 p_period_type => l_period_type, --mchoudha fix for bug#4998167 added l_period_type
12346 x_return_status => x_return_status);
12347
12348 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12349 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.refresh_old_cp_lvl',
12350 'Create_cp_lvl_elements(x_return_status = '||x_return_status
12351 ||', l_top_bs_tbl count = '||l_top_bs_tbl.count||')');
12352 END IF;
12353
12354 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12355 RAISE G_EXCEPTION_HALT_VALIDATION;
12356 END IF;
12357
12358
12359 IF l_top_bs_tbl.COUNT > 0 THEN
12360
12361 FOR l_index IN l_top_bs_tbl.FIRST .. l_top_bs_tbl.LAST
12362 LOOP
12363
12364 UPDATE OKS_LEVEL_ELEMENTS
12365 SET amount = l_top_bs_tbl(l_index).amount
12366 WHERE id = l_top_bs_tbl(l_index).id;
12367
12368 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12369 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Adjust_split_bill_sch.update_top_lvl_amt',
12370 'updated level elemnets of top line= ' || sql%rowcount
12371 || ' , id = ' || l_top_bs_tbl(l_index).id
12372 || ' , amt = ' || l_top_bs_tbl(l_index).amount );
12373 END IF;
12374 END LOOP;
12375 END IF;
12376
12377
12378 EXCEPTION
12379 WHEN L_EXCEPTION_END THEN
12380 x_return_status := 'S';
12381 WHEN G_EXCEPTION_HALT_VALIDATION THEN
12382 x_return_status := 'E';
12383 IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12384 fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12385 'G_EXCEPTION_HALT_VALIDATION');
12386 END IF;
12387
12388 WHEN OTHERS THEN
12389 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12390 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_split_bill_sch.UNEXPECTED',
12391 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12392 END IF;
12393
12394 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
12395 p_msg_name => G_UNEXPECTED_ERROR,
12396 p_token1 => G_SQLCODE_TOKEN,
12397 p_token1_value => sqlcode,
12398 p_token2 => G_SQLERRM_TOKEN,
12399 p_token2_value => sqlerrm);
12400
12401 x_return_status := G_RET_STS_UNEXP_ERROR;
12402 END adjust_split_bill_sch;
12403
12404
12405
12406 Procedure Prorate_sll_amt(
12407 p_old_cp_amt IN NUMBER,
12408 p_new_cp_amt IN NUMBER,
12409 p_total_amt IN NUMBER,
12410 p_new_sll_tbl IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
12411 p_old_sll_tbl IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
12412 x_return_status OUT NOCOPY VARCHAR2)
12413
12414 IS
12415 l_tot_amt NUMBER;
12416 l_amt NUMBER;
12417
12418 BEGIN
12419
12420 x_return_status := OKC_API.G_RET_STS_SUCCESS;
12421
12422 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12423
12424 fnd_log.STRING (fnd_log.level_statement,
12425 G_MODULE_CURRENT || '.Prorate_sll_amt.passed_val',
12426 'p_total_amt = ' || p_total_amt
12427 ||', p_new_cp_amt = ' || p_new_cp_amt);
12428 END IF;
12429
12430 l_tot_amt := nvl(p_total_amt,0);
12431
12432 FOR l_index IN p_old_sll_tbl.FIRST .. p_old_sll_tbl.LAST
12433 LOOP
12434
12435 IF l_tot_amt = 0 THEN
12436 l_amt := 0;
12437 ELSE
12438
12439 l_Amt := (NVL(p_old_sll_tbl(l_index).level_amount,0)/l_tot_amt) * nvl(p_new_cp_amt,0);
12440 END IF;
12441
12442 p_new_sll_tbl(l_index).level_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt
12443 (l_Amt, l_currency_code);
12444
12445
12446 p_old_sll_tbl(l_index).level_amount := nvl(p_old_sll_tbl(l_index).level_amount,0) -
12447 p_new_sll_tbl(l_index).level_amount;
12448
12449 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12450 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Prorate_sll_amt.lvl_amt',
12451 'sll seq = ' || p_old_sll_tbl(l_index).sequence_no
12452 ||', old sll amt = '|| p_old_sll_tbl(l_index).level_amount
12453 ||', new sll amt = '|| p_new_sll_tbl(l_index).level_amount
12454 ||', total amt = '|| l_tot_amt
12455 );
12456 END IF;
12457
12458 END LOOP;
12459
12460 EXCEPTION
12461
12462 WHEN OTHERS THEN
12463 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12464 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Prorate_sll_amt.UNEXPECTED',
12465 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12466 END IF;
12467
12468 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
12469 p_msg_name => G_UNEXPECTED_ERROR,
12470 p_token1 => G_SQLCODE_TOKEN,
12471 p_token1_value => sqlcode,
12472 p_token2 => G_SQLERRM_TOKEN,
12473 p_token2_value => sqlerrm);
12474
12475 x_return_status := G_RET_STS_UNEXP_ERROR;
12476
12477 END Prorate_sll_amt;
12478
12479
12480 PROCEDURE Adjust_billed_lvl_element(p_new_cp_id IN NUMBER,
12481 p_old_cp_bs_tbl IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
12482 x_new_cp_bs_tbl OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
12483 x_return_status OUT NOCOPY VARCHAR2)
12484 IS
12485
12486
12487 CURSOR l_line_BS_csr(p_line_id NUMBER) IS
12488
12489 SELECT id,trunc(date_start) date_start,
12490 amount,trunc(date_end) date_end,date_completed
12491 FROM oks_level_elements
12492 WHERE cle_id = p_line_id
12493 ORDER BY date_start;
12494
12495 l_line_BS_rec l_line_BS_csr%ROWTYPE;
12496 l_index NUMBER;
12497
12498 BEGIN
12499
12500 x_return_status := OKC_API.G_RET_STS_SUCCESS;
12501
12502 l_index := 1;
12503 x_new_cp_bs_tbl.DELETE;
12504
12505 FOR l_line_BS_rec IN l_line_BS_csr(p_new_cp_id)
12506 LOOP
12507 x_new_cp_bs_tbl(l_index).id := l_line_BS_rec.id;
12508 x_new_cp_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
12509 x_new_cp_bs_tbl(l_index).date_end := l_line_bs_rec.date_end;
12510 x_new_cp_bs_tbl(l_index).Amount := l_line_bs_rec.amount;
12511 x_new_cp_bs_tbl(l_index).date_completed := l_line_BS_rec.date_completed;
12512
12513 l_index := l_index + 1;
12514 END LOOP;
12515
12516
12517 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12518
12519 fnd_log.STRING (fnd_log.level_statement,
12520 G_MODULE_CURRENT || '.Adjust_billed_lvl_element.new_bs_tbl',
12521 'new sub line lvl elements count = ' || x_new_cp_bs_tbl.count);
12522 END IF;
12523
12524
12525 -------adjust the old cp lvl element amt for billed records
12526 -----as old cp lvl amount = old amt - new cp lvl amt.
12527
12528
12529 FOR l_index IN p_old_cp_bs_tbl.FIRST .. p_old_cp_bs_tbl.LAST
12530 LOOP
12531
12532 IF TRUNC(p_old_cp_bs_tbl(l_index).date_start) = TRUNC(x_new_cp_bs_tbl(l_index).date_start) AND
12533 p_old_cp_bs_tbl(l_index).date_completed IS NOT NULL THEN
12534
12535 p_old_cp_bs_tbl(l_index).amount := p_old_cp_bs_tbl(l_index).amount - x_new_cp_bs_tbl(l_index).amount;
12536 x_new_cp_bs_tbl(l_index).date_completed := sysdate;
12537
12538 UPDATE OKS_LEVEL_ELEMENTS
12539 SET amount = p_old_cp_bs_tbl(l_index).amount
12540 WHERE id = p_old_cp_bs_tbl(l_index).id;
12541
12542 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12543 fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Adjust_billed_lvl_element.update_old_lvl_amt',
12544 'updated level elemnets = ' || sql%rowcount
12545 || ' , id = ' || p_old_cp_bs_tbl(l_index).id
12546 || ' , amt = ' || p_old_cp_bs_tbl(l_index).amount );
12547
12548 END IF;
12549
12550 END IF;
12551 END LOOP;
12552
12553 EXCEPTION
12554
12555 WHEN OTHERS THEN
12556 IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12557 fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Adjust_billed_lvl_element.UNEXPECTED',
12558 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12559 END IF;
12560
12561 OKC_API.SET_MESSAGE(p_app_name => G_APP_NAME_OKC,
12562 p_msg_name => G_UNEXPECTED_ERROR,
12563 p_token1 => G_SQLCODE_TOKEN,
12564 p_token1_value => sqlcode,
12565 p_token2 => G_SQLERRM_TOKEN,
12566 p_token2_value => sqlerrm);
12567
12568 x_return_status := G_RET_STS_UNEXP_ERROR;
12569
12570 END Adjust_billed_lvl_element;
12571
12572
12573 --[llc] Sts_change_subline_lvl_rule
12574
12575 /* This procedure updates the amount on the top line when the status of sub-line is
12576 changed from 'Entered' to 'Cancelled' or 'Cancelled' to 'Entered'.
12577 */
12578
12579 PROCEDURE Sts_change_subline_lvl_rule(
12580 p_cle_id IN NUMBER,
12581 p_from_ste_code IN VARCHAR2,
12582 p_to_ste_code IN VARCHAR2,
12583 x_return_status OUT NOCOPY VARCHAR2,
12584 x_msg_count OUT NOCOPY NUMBER,
12585 x_msg_data OUT NOCOPY VARCHAR2)
12586 IS
12587
12588 -- to get the top line details
12589
12590 CURSOR l_line_BS_csr(l_top_line_id Number) IS
12591 SELECT id, trunc(date_start) date_start,
12592 amount, TRUNC(DATE_end) date_end, object_version_number
12593 FROM oks_level_elements
12594 WHERE cle_id = l_top_line_id
12595 ORDER BY date_start;
12596
12597 -- to get the sub-line details.
12598 CURSOR l_cp_BS_csr IS
12599 SELECT id, trunc(date_start) date_start,
12600 amount
12601 FROM oks_level_elements
12602 WHERE cle_id = p_cle_id
12603 ORDER BY date_start;
12604
12605 -- to get the billing schedule of the sub-line on which the status changes action is taken.
12606
12607 CURSOR l_bill_type_csr IS
12608 SELECT nvl(billing_schedule_type,'T') billing_schedule_type
12609 FROM oks_k_lines_b
12610 WHERE cle_id = p_cle_id;
12611
12612
12613 CURSOR is_top_line_csr (p_cle_id number) IS
12614 select cle_id
12615 from okc_k_lines_b
12616 where id=p_cle_id;
12617
12618
12619 -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
12620 -- CURSOR to check if price_negotiated of topline equals to total SLL amount for this topline
12621 -- on billing form (table- oks_level_elements, column- amount)
12622
12623 CURSOR csr_CheckBillSllAmount_PN (p_top_line_id number) IS
12624 SELECT 1
12625 FROM okc_k_lines_b
12626 WHERE id = p_top_line_id
12627 AND price_negotiated = (select sum(amount) from oks_level_elements ole1
12628 where ole1.parent_cle_id = p_top_line_id
12629 and ole1.object_version_number = ( select max(object_version_number)
12630 from oks_level_elements ole2
12631 where ole2.parent_cle_id = p_top_line_id
12632 )
12633 );
12634
12635
12636 l_line_BS_rec l_line_BS_csr%ROWTYPE;
12637 l_cp_BS_rec l_cp_BS_csr%ROWTYPE;
12638 l_bill_type_rec l_bill_type_csr%ROWTYPE;
12639
12640
12641 l_top_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
12642 l_cp_bs_tbl oks_bill_level_elements_pvt.letv_tbl_type;
12643 x_letv_tbl oks_bill_level_elements_pvt.letv_tbl_type;
12644
12645
12646 i NUMBER := 0;
12647 l_index NUMBER := 0;
12648 l_cp_bs_ind NUMBER;
12649 l_top_bs_ind NUMBER;
12650
12651 l_api_Version Number := 1;
12652 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
12653 l_msg_list VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
12654 l_msg_count Number;
12655 l_msg_data Varchar2(2000) := NULL;
12656
12657 l_top_line_id Number;
12658
12659 l_dummy NUMBER;
12660
12661
12662 BEGIN
12663
12664 x_return_status := 'S';
12665
12666 ---get bill type details
12667
12668 Open is_top_line_csr(p_cle_id);
12669 Fetch is_top_line_csr Into l_top_line_id;
12670 Close is_top_line_csr;
12671
12672 -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
12673
12674 IF (l_top_line_id is null) THEN
12675
12676 IF ((p_from_ste_code = 'CANCELLED' ) AND (p_to_ste_code = 'ENTERED')) then
12677
12678 Open csr_CheckBillSllAmount_PN(p_cle_id);
12679 Fetch csr_CheckBillSllAmount_PN into l_dummy;
12680 Close csr_CheckBillSllAmount_PN;
12681
12682 -- If status of service line is changed from CANCELED TO ENTERED status, then
12683 -- refresh the billing schedule. This will ensure that billing schedule
12684 -- amount matches with that of the price_negotiated amount of the service line
12685
12686 IF (nvl(l_dummy, 2) <> 1 ) THEN
12687
12688 OKS_BILL_SCH.Cascade_Dates_SLL
12689 (
12690 p_top_line_id => p_cle_id,
12691 x_return_status => x_return_status,
12692 x_msg_count => l_msg_count,
12693 x_msg_data => l_msg_data );
12694
12695 END IF;
12696
12697 END IF; -- p_from_ste_code = 'CANCELLED'
12698
12699 return;
12700
12701 END IF; -- l_top_line_id is null
12702
12703
12704 Open l_bill_type_Csr;
12705 Fetch l_bill_type_Csr Into l_bill_type_Rec;
12706
12707 If l_bill_type_csr%Notfound then
12708 Close l_bill_type_Csr;
12709 x_return_status := 'E';
12710 OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'BILLING SCHEDULE TYPE NOT FOUND.');
12711 RAISE G_EXCEPTION_HALT_VALIDATION;
12712 End If;
12713
12714 Close l_bill_type_Csr;
12715
12716 IF l_bill_type_rec.billing_schedule_type = 'T' then
12717
12718 l_index := 0;
12719 l_top_bs_tbl.DELETE;
12720
12721 FOR l_line_BS_rec IN l_line_BS_csr(l_top_line_id)
12722 LOOP
12723 l_top_bs_tbl(l_index).id := l_line_BS_rec.id;
12724 l_top_bs_tbl(l_index).date_start := l_line_BS_rec.date_start;
12725 l_top_bs_tbl(l_index).Amount := l_line_BS_rec.amount;
12726 l_top_bs_tbl(l_index).date_end := l_line_BS_rec.date_end;
12727 l_top_bs_tbl(l_index).object_version_number := l_line_BS_rec.object_version_number;
12728
12729 l_index := l_index + 1;
12730 END LOOP;
12731
12732 -- check there is any billing schedule exists for this sub-line
12733 If l_index = 0 then
12734 Return;
12735 End if;
12736
12737 l_index := 0;
12738 l_cp_bs_tbl.DELETE;
12739
12740 FOR l_cp_BS_rec IN l_cp_BS_csr
12741 LOOP
12742 l_cp_bs_tbl(l_index).id := l_cp_BS_rec.id;
12743 l_cp_bs_tbl(l_index).date_start := l_cp_BS_rec.date_start;
12744 l_cp_bs_tbl(l_index).Amount := l_cp_BS_rec.amount;
12745
12746 l_index := l_index + 1;
12747 END LOOP;
12748
12749 IF l_cp_bs_tbl.COUNT > 0 THEN
12750
12751
12752 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
12753 l_top_bs_ind := l_top_bs_tbl.FIRST;
12754
12755 WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > l_top_bs_tbl(l_top_bs_ind).DATE_START
12756 AND l_top_bs_ind < l_top_bs_tbl.LAST
12757 LOOP
12758 l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
12759 END LOOP;
12760
12761
12762 IF l_top_bs_ind = l_top_bs_tbl.first THEN
12763 NULL;
12764
12765 ELSIF l_top_bs_ind <= l_top_bs_tbl.LAST THEN
12766
12767 l_top_bs_ind := l_top_bs_ind - 1;
12768
12769 IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= l_top_bs_tbl(l_top_bs_ind ).DATE_START
12770 AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= l_top_bs_tbl(l_top_bs_ind ).DATE_end THEN
12771
12772 NULL;
12773 ELSE
12774 l_top_bs_ind := l_top_bs_ind + 1;
12775 END IF;
12776
12777 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(l_top_bs_tbl(l_top_bs_ind).DATE_START) THEN
12778 NULL;
12779
12780 end if;
12781
12782
12783 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
12784 LOOP
12785 IF ((p_from_ste_code = 'ENTERED' ) AND (p_to_ste_code = 'CANCELLED')) then
12786 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);
12787 ElsIf ((p_from_ste_code = 'CANCELLED' ) AND (p_to_ste_code = 'ENTERED')) then
12788 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);
12789 End if;
12790 l_top_bs_ind := l_top_bs_ind + 1;
12791 END LOOP;
12792
12793 OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
12794 p_api_version => l_api_version,
12795 p_init_msg_list => l_init_msg_list,
12796 x_return_status => x_return_status,
12797 x_msg_count => l_msg_count,
12798 x_msg_data => l_msg_data,
12799 p_letv_tbl => l_top_bs_tbl,
12800 x_letv_tbl => l_lvl_ele_tbl_out);
12801
12802 IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
12803 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
12804 ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
12805 RAISE OKC_API.G_EXCEPTION_ERROR;
12806 END IF;
12807
12808 END IF; ---l_cp_bs_tbl.COUNT > 0
12809
12810
12811 END IF; ---l_bill_type = 'T'
12812
12813 END Sts_change_subline_lvl_rule;
12814
12815
12816
12817
12818 END OKS_BILL_SCH;