DBA Data[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;