DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKS_BILL_SCH

Source


1 Package Body OKS_BILL_SCH AS
2 /*  $Header: OKSBLSHB.pls 120.46.12020000.8 2013/05/10 13:58:30 spingali ship $ */
3 
4 
5 l_strm_lvl_tbl_in         oks_sll_pvt.sllv_tbl_type;
6 l_strm_lvl_tbl_out        oks_sll_pvt.sllv_tbl_type;
7 l_lvl_ele_tbl_in          oks_bill_level_elements_pvt.letv_tbl_type;
8 l_lvl_ele_tbl_out         oks_bill_level_elements_pvt.letv_tbl_type;
9 l_fnd_lvl_in_rec          oks_bill_util_pub.bill_det_inp_rec;
10 l_fnd_lvl_out_rec         oks_bill_util_pub.bill_sch_rec;
11 l_api_version             number := 1.0;
12 
13 --Bug Fix 5185658
14 pkg_cascade_billing_hdr   varchar2(1) := 'N';
15 
16 
17 TYPE Top_Line_BS_Type  IS RECORD
18 (
19   id            NUMBER,
20   Start_dt      NUMBER,
21   End_dt        DATE,
22   tot_Amount    NUMBER);
23 
24 
25 Type Top_Line_BS_tbl is TABLE of Top_Line_BS_type index by binary_integer;
26 
27 TYPE Contract_Rec_Type IS RECORD
28 (
29      ID                   NUMBER,
30      Start_dt             DATE,
31      End_dt               DATE);
32 
33 
34 TYPE StrmLvl_Out_Type Is Record
35 (
36      Id                         Number,
37      cle_id                     NUMBER,
38      chr_id                     number,
39      dnz_chr_id                 number,
40      Seq_no                     NUMBER,
41      Dt_start                   DATE,
42      end_date                   DATE,
43      Level_Period               NUMBER,
44      uom_Per_Period             NUMBER,
45      uom                        Varchar2 (3),
46      Amount                     NUMBER,
47      invoice_offset_days         NUMBER,
48      Interface_offset_days      NUMBER
49 
50 );
51 
52 Type StrmLvl_Out_tbl is TABLE of StrmLvl_Out_Type index by binary_integer;
53 
54 Type sll_prorated_rec_type IS RECORD
55 ( sll_seq_num           Number,
56   sll_start_date        DATE,
57   sll_end_date          DATE,
58   sll_tuom              VARCHAR2(40),
59   sll_period            Number,
60   sll_uom_per_period    Number,
61   sll_amount            Number
62 );
63 
64 Type sll_prorated_tab_type is Table of sll_prorated_rec_type index by binary_integer;
65 
66 
67 TYPE Line_Det_Type IS RECORD
68 (   chr_id               Number,
69     dnz_chr_id           Number,
70     id                   Number,
71     cle_id               NUMBER,
72     lse_id               Number,
73     price_uom            VARCHAR2(10),
74     line_start_dt        Date,
75     line_end_dt          Date,
76     line_amt             Number
77 );
78 ------------------------------------------------------------------------
79  -- Begin partial period computation logic
80  -- Developer Mani Choudhary
81  -- Date 17-MAY-2005
82  -- Added cp_price_uom and cp_lse_id
83  -------------------------------------------------------------------------
84 
85 TYPE Prod_Det_Type IS RECORD
86 (   cp_id             Number,
87     cp_start_dt       Date,
88     cp_end_dt         Date,
89     cp_lse_id         Number,
90     cp_price_uom      VARCHAR2(10),
91     cp_amt            Number,
92     dnz_chr_id        number
93 );
94 
95  -------------------------------------------------------------------------
96  -- Begin partial period computation logic
97  -- Developer Mani Choudhary
98  -- Date 31-MAY-2005
99  -- Added two new parameters P_period_start,P_period_type
100  -------------------------------------------------------------------------
101 
102 PROCEDURE Calculate_sll_amount( p_api_version       IN      NUMBER,
103                                 p_total_amount      IN      NUMBER,
104                                 p_currency_code     IN      VARCHAR2,
105                                 p_period_start      IN      VARCHAR2,
106                                 p_period_type       IN      VARCHAR2,
107                                 p_sll_prorated_tab  IN  OUT NOCOPY sll_prorated_tab_type,
108                                 x_return_status     OUT     NOCOPY VARCHAR2
109 );
110 
111 
112 Procedure Create_Stream_Level
113 (     p_billing_type              IN    VARCHAR2
114 ,     p_strm_lvl_tbl              IN    StreamLvl_tbl
115 ,     p_dnz_chr_id                IN    NUMBER
116 ,     p_subline_call              IN    VARCHAR2
117 ,     p_line_amt                  IN    NUMBER
118 ,     p_subline_amt               IN    NUMBER
119 ,     p_sll_start_dt              IN    DATE
120 ,     p_end_dt                    IN    DATE
121 ,     p_period_start              IN    VARCHAR2
122 ,     p_period_type               IN    VARCHAR2
123 ,     x_sll_out_tbl               OUT   NOCOPY StrmLvl_Out_tbl
124 ,     x_return_status             OUT   NOCOPY Varchar2
125 );
126 
127  -------------------------------------------------------------------------
128  -- End partial period computation logic
129  -- Date 09-MAY-2005
130  -------------------------------------------------------------------------
131 
132 FUNCTION chk_Sll_Exists(p_id IN NUMBER) return number ;
133 
134 
135 
136 PROCEDURE Check_Existing_Lvlelement
137 (
138               p_sll_id          IN  Number,
139               p_sll_dt_start    IN  Date,
140               p_uom            IN  VARCHAR2,
141               p_uom_per_period IN  NUMBER,
142               p_cp_end_dt       IN  DATE,
143               x_next_cycle_dt   OUT NOCOPY DATE,
144               x_last_cycle_dt   out NOCOPY Date,
145               x_period_counter  out NOCOPY Number,
146               x_sch_amt         IN OUT NOCOPY NUMBER,
147               x_top_line_bs     IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
148               x_return_status   out NOCOPY Varchar2
149 );
150 
151 
152 FUNCTION Cal_Hdr_Amount
153 (
154               p_contract_id  IN Number
155 )             Return NUMBER;
156 
157 FUNCTION Find_Adjusted_Amount
158 (
159        p_line_id    IN Number,
160        p_total_amt  IN Number,
161        p_cycle_amt  IN Number
162 ) RETURN Number;
163 
164  --------------------------------------------------------------------------
165  -- Begin partial period computation logic
166  -- Developer Mani Choudhary
167  -- Date 09-MAY-2005
168  -- Added two new parameters P_period_start,P_period_type in procedural call
169  ---------------------------------------------------------------------------
170 PROCEDURE Create_Level_elements
171 (         p_billing_type     IN    VARCHAR2,
172           p_sll_tbl          IN    StrmLvl_Out_tbl,
173           p_line_rec         IN    Line_Det_Type,
174           p_invoice_ruleid   IN    Number,
175           p_term_dt          IN    DATE,
176           p_period_start      IN   VARCHAR2,
177           p_period_type       IN   VARCHAR2,
178           x_return_status    OUT   NOCOPY Varchar2
179 );
180 
181 FUNCTION get_unit_price_per_uom(
182 P_cle_id IN NUMBER,
183 P_billing_uom IN VARCHAR2,
184 P_period_start IN VARCHAR2,
185 P_period_type IN VARCHAR2,
186 P_duration    IN NUMBER,
187 p_end_date   IN DATE,
188 p_term_date  IN DATE
189 )RETURN NUMBER;
190 
191 
192  -------------------------------------------------------------------------
193  -- Begin partial period computation logic
194  -- Developer Mani Choudhary
195  -- Date 09-MAY-2005
196  -------------------------------------------------------------------------
197 PROCEDURE Create_cp_lvl_elements
198 (           p_billing_type      IN    VARCHAR2,
199             p_cp_sll_tbl        IN   StrmLvl_Out_tbl,
200             p_Line_Rec          IN   Line_Det_Type,
201             p_SubLine_rec       IN   Prod_Det_Type,
202             p_invoice_rulid     IN   Number,
203             p_top_line_bs       IN   OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
204             p_term_dt           IN   DATE,
205             p_period_start      IN   VARCHAR2,
206             p_period_type       IN   VARCHAR2,
207             x_return_status     OUT  NOCOPY Varchar2
208 );
209 
210  --------------------------------------------------------------------------
211  -- Begin partial period computation logic
212  -- Developer Mani Choudhary
213  -- Date 09-MAY-2005
214  -- Added two new parameters P_period_start,P_period_type in procedural call
215  ---------------------------------------------------------------------------
216 PROCEDURE Bill_Sch_Cp
217 (           p_billing_type      IN    VARCHAR2,
218             p_bsll_tbl          IN   StreamLvl_tbl,
219             p_Line_Rec          IN   Line_Det_Type,
220             p_SubLine_rec       IN   Prod_Det_Type,
221             p_invoice_rulid     IN   Number,
222             p_top_line_bs       IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
223             p_term_dt           IN   DATE,
224             p_period_start      IN   VARCHAR2,
225             p_period_type       IN   VARCHAR2,
226             x_return_status     OUT  NOCOPY Varchar2
227 );
228 
229 FUNCTION Find_Currency_Code
230 (        p_cle_id  NUMBER,
231          p_chr_id  NUMBER
232 ) RETURN VARCHAR2;
233 
234 
235 FUNCTION Find_Sll_Count(
236                        p_subline_id   NUMBER)
237 RETURN NUMBER;
238 
239  -------------------------------------------------------------------------
240  -- Begin partial period computation logic
241  -- Developer Mani Choudhary
242  -- Date 09-MAY-2005
243  -- Added two new parameters p_period_start and p_period_type
244  -------------------------------------------------------------------------
245 PROCEDURE Create_Hdr_Level_elements(p_billing_type IN    VARCHAR2,
246                                 p_sll_tbl          IN    StrmLvl_Out_tbl,
247                                 p_hdr_rec          IN    Contract_Rec_Type,
248                                 p_invoice_ruleid   IN    Number,
249                                 p_called_from      IN    NUMBER,            --(1 - form, 2- copy,renew)
250                                 p_period_start     IN   VARCHAR2,
251                                 p_period_type      IN   VARCHAR2,
252                                 x_return_status    OUT   NOCOPY Varchar2);
253 
254 
255 PROCEDURE Delete_lvl_element(p_cle_id          IN  NUMBER,
256                              x_return_status   OUT NOCOPY VARCHAR2);
257 
258 
259 PROCEDURE Del_hdr_lvl_element(p_hdr_id         IN  NUMBER,
260                              x_return_status  OUT NOCOPY VARCHAR2);
261 
262 PROCEDURE Get_Constant_sll_Amount(p_line_start_date       IN DATE,
263                                  p_line_end_date         IN DATE,
264                                  p_cycle_start_date      IN DATE,
265                                  p_remaining_amount      IN NUMBER,
266                                  P_uom_quantity          IN NUMBER,
267                                  P_tce_code              IN VARCHAR2,
268                                  x_constant_sll_amt      OUT NOCOPY NUMBER,
269                                  x_return_status         OUT NOCOPY VARCHAR2);
270 
271 
272 PROCEDURE Get_Period_Frequency(p_line_start_date      IN  DATE,
273                               p_line_end_date         IN  DATE,
274                               p_cycle_start_date      IN  DATE,
275                               p_next_billing_date     IN  DATE,
276                               P_uom_quantity          IN  NUMBER,
277                               P_tce_code              IN  VARCHAR2,
278                               p_uom_per_period       IN  NUMBER,
279                               x_period_freq           OUT NOCOPY NUMBER,
280                               x_return_status         OUT NOCOPY VARCHAR2);
281 
282 
283 
284 PROCEDURE Adjust_top_BS_Amt(
285                         p_Line_Rec          IN     Line_Det_Type,
286                         p_SubLine_rec       IN     Prod_Det_Type,
287                         p_top_line_bs       IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
288                         x_return_status     OUT    NOCOPY VARCHAR2);
289 
290 PROCEDURE Del_sll_lvlelement(p_top_line_id          IN  NUMBER,
291                              x_return_status        OUT NOCOPY VARCHAR2,
292                              x_msg_count            OUT NOCOPY  NUMBER,
293                              x_msg_data             OUT NOCOPY VARCHAR2);
294 
295 
296 Procedure Adjust_interface_date(p_line_id           IN  NUMBER,
297                                 p_invoice_rule_id   IN  Number,
298                                 p_line_end_date     IN  DATE,
299                                 p_lse_id            IN  NUMBER,
300                                 x_bs_tbl            OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
301                                 x_return_status     OUT NOCOPY VARCHAR2,
302                                 x_msg_count         OUT NOCOPY NUMBER,
303                                 x_msg_data          OUT NOCOPY VARCHAR2);
304 
305 
306  -------------------------------------------------------------------------
307  -- Begin partial period computation logic
308  -- Developer Mani Choudhary
309  -- Date 09-MAY-2005
310  -------------------------------------------------------------------------
311 PROCEDURE  Create_Subcription_LvlEle
312          (p_billing_type     IN    VARCHAR2,
313           p_sll_tbl          IN    StrmLvl_Out_tbl,
314           p_line_rec         IN    Line_Det_Type,
315           p_term_dt          IN    DATE,
316           p_invoice_ruleid   IN    Number,
317           p_period_start     IN    VARCHAR2,
318           p_period_type      IN    VARCHAR2,
319           x_return_status    OUT  NOCOPY Varchar2);
320  -------------------------------------------------------------------------
321  -- End partial period computation logic
322  -- Date 09-MAY-2005
323  -------------------------------------------------------------------------
324 
325 FUNCTION Find_term_amt(p_cycle_st_dt  IN  DATE,
326               p_term_dt      IN  DATE,
327               p_cycle_end_dt IN  DATE,
328               p_amount       IN  NUMBER) RETURN NUMBER;
329 
330 PROCEDURE Get_SLL_info(p_top_line_id      IN  NUMBER,
331                        p_line_id          IN  NUMBER,
332                        x_sll_tbl          OUT NOCOPY StrmLvl_Out_tbl,
333                        x_sll_db_tbl       OUT NOCOPY OKS_BILL_SCH.StreamLvl_tbl,
334                        x_return_status    OUT NOCOPY VARCHAR2);
335 
336 PROCEDURE Del_line_sll_lvl(p_line_id          IN  NUMBER,
337                            x_return_status    OUT NOCOPY VARCHAR2,
338                            x_msg_count        OUT NOCOPY NUMBER,
339                            x_msg_data         OUT NOCOPY VARCHAR2);
340 
341 
342 
343 Procedure Populate_end_date(p_line_id             IN NUMBER,
344                             p_end_date            IN DATE,
345                             p_term_date           IN DATE,
346                             p_lse_id              IN NUMBER,
347                             x_return_status       OUT NOCOPY VARCHAR2);
348 
349 PROCEDURE Rollup_lvl_amt(
350                    p_Line_Rec          IN     Line_Det_Type,
351                    p_SubLine_rec       IN     Prod_Det_Type,
352                    p_top_line_bs       IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
353                    x_return_status     OUT    NOCOPY VARCHAR2);
354 
355 PROCEDURE Adjust_cp_trx_inv_dt(
356                         p_top_bs_tbl        IN     oks_bill_level_elements_pvt.letv_tbl_type,
357                         p_SubLine_id        IN     NUMBER,
358                         x_cp_line_bs        OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
359                         x_return_status     OUT    NOCOPY VARCHAR2);
360 
361 PROCEDURE Adjust_billed_lvl_element(p_new_cp_id     IN NUMBER,
362                                     P_old_cp_bs_tbl IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
363                                     x_new_cp_bs_tbl OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
364                                     x_return_status OUT NOCOPY VARCHAR2);
365 
366 Procedure Prorate_sll_amt(
367                   p_old_cp_amt     IN NUMBER,
368                   p_new_cp_amt     IN NUMBER,
369                   p_total_amt      IN NUMBER,
370                   p_new_sll_tbl    IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
371                   p_old_sll_tbl    IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
372                   x_return_status  OUT NOCOPY  VARCHAR2);
373 
374 
375 l_currency_code    Varchar2(15);
376 l_header_billing   NUMBER;
377 ---------------end of local package declaration---------------
378 
379  -------------------------------------------------------------------------
380  -- Begin partial period computation logic
381  -- Developer Mani Choudhary
382  -- Date 09-MAY-2005
383  -- This Function will calculate the converted unit price from price_uom
384  -- to Billing_uom for covered product and covered item. For covered levels
385  -- other than covered product and covered item, it will calculate the unit
386  -- price per Billing uom using Time Measure APIs.
387  -------------------------------------------------------------------------
388 FUNCTION Get_Unit_Price_Per_Uom (
389                                   P_cle_id       IN NUMBER,
390                                   P_billing_uom  IN VARCHAR2,
391                                   P_period_start IN VARCHAR2,
392                                   P_period_type  IN VARCHAR2,
393                                   P_duration     IN NUMBER,
394                                   p_end_date     IN DATE,
395                                   p_term_date    IN DATE
396 )
397 RETURN NUMBER
398 AS
399 --Declare variables or cursors
400 Cursor line_dtl_csr(p_cle_id in NUMBER) IS
401 SELECT lin.start_date,
402        Lin.end_date,
403        Lin.price_negotiated,
404        lin.price_unit*itm.number_of_items unit_price,
405        Lin.lse_id,
406        --lin.price_unit*itm.number_of_items*kln.toplvl_price_qty total_amount,  --bug#5359695 commented
407        nvl(Lin.price_negotiated,0) total_amount,   --bug#5359695
408        kln.price_uom,
409        kln.toplvl_uom_code,
410        nvl(kln.ubt_amount,0)  ubt_amount --bug#5359695
411 FROM   okc_k_lines_b lin,
412        Oks_k_lines_b kln,
413        Okc_k_items itm
414 WHERE  kln.cle_id = lin.id and
415        itm.cle_id = lin.id and
416        lin.id = p_cle_id;
417 
418 --Total already billed amount in case of partially billed case
419 Cursor total_billed_csr (p_cle_id   IN NUMBER) IS
420 SELECT nvl(sum(bsl.amount),0) amount,
421        max(bsl.date_billed_From) date_billed_From,
422        max(bsl.date_billed_to) date_billed_to
423 FROM  oks_bill_sub_lines bsl
424 WHERE bsl.cle_id = p_cle_id;
425 
426 
427 Cursor check_sub_instance IS
428 SELECT 'Y'
429 FROM   okc_k_items itm,
430        oks_subscr_header_b sub
431 WHERE  itm.cle_id = P_cle_id
432 AND    sub.instance_id = itm.object1_id1;
433 
434 CURSOR om_period_csr IS
435 select oel.service_period
436 from   okc_k_rel_objs rel,
437        oe_order_lines_all oel
438 where  rel.cle_id = P_cle_id
439 and    oel.line_id  = rel.object1_id1;
440 
441 
442 l_sub_instance_check                    VARCHAR2(1);
443 l_duration NUMBER;
444 l_uom VARCHAR2(30);
445 l_start_date DATE;
446 l_unit_price NUMBER;
447 l_quantity NUMBER;
448 l_target_quantity NUMBER;
449 l_source_quantity NUMBER;
450 l_conversion_factor NUMBER;
451 x_return_status VARCHAR2(1);
452 l_price_negotiated NUMBER;
453 lin_det_rec line_dtl_csr%rowtype;
454 total_billed_rec total_billed_csr%rowtype;
455 l_amount  NUMBER;
456 l_source_unit_price NUMBER;
457 
458 BEGIN
459 --Fetch the line details.
460   Open line_dtl_csr(p_cle_id);
461   Fetch line_dtl_csr into lin_det_rec;
462   Close line_dtl_csr;
463 
464   --Fix for bug#5623498 unit price will be recalculated based on
465   --duration based uom if pricelist is not present
466   okc_time_util_pub.get_duration(lin_det_rec.start_date,p_end_date,l_duration,l_uom,x_return_status);
467   --errorout_ad(' l_uom '||l_uom);
468   --errorout_ad(' l_duration '||l_duration);
469   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
470      fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.product_pricing.price_uom_is_null',
471     'after calling okc_time_util_pub.get_duration  '
472     ||' result l_duration = ' || l_duration||',l_uom = '||l_uom);
473   END IF;
474 
475 
476   l_source_unit_price := lin_det_rec.unit_price;
477 
478 -- get total billed amount
479   Open total_billed_csr(p_cle_id);
480   Fetch total_billed_csr into total_billed_rec;
481   Close total_billed_csr;
482 
483   --changed for bug#5359695
484   l_price_negotiated := lin_det_rec.total_amount;
485 
486 
487 
488 
489   IF p_term_date IS NOT NULL THEN
490      IF  lin_det_rec.total_amount <= total_billed_rec.amount THEN
491        l_price_negotiated := total_billed_rec.amount + lin_det_rec.ubt_amount;
492      ELSE
493        l_price_negotiated := lin_det_rec.total_amount + lin_det_rec.ubt_amount;
494      END IF;
495   END IF;
496 
497   --end changes for bug#5359695
498 
499    -- recalculate the unit price
500   IF lin_det_rec.lse_id in (7,9,25) THEN
501         l_duration := OKS_TIME_MEASURES_PUB.get_quantity (
502                                                         p_start_date   => lin_det_rec.start_date,
503                                                         p_end_date     => lin_det_rec.end_date,
504                                                         p_source_uom   => nvl(lin_det_rec.toplvl_uom_code,l_uom),
505                                                         p_period_type  => p_period_type,
506                                                         p_period_start => p_period_start
507                                                         );
508         l_source_unit_price := l_price_negotiated/l_duration;
509   END IF;
510 
511    l_sub_instance_check := NULL;
512    --subscription instance can only be attached as service product/Exntended warranty product
513    IF lin_det_rec.lse_id in (9,25) THEN
514     Open check_sub_instance;
515     Fetch check_sub_instance into l_sub_instance_check;
516     Close check_sub_instance;
517    END IF;
518 
519   --For the following lse_ids, QP is invoked for pricing.
520   --lse_id 7 is item
521   --lse_id 9 is product
522   --lse_id 25 is product for extended warranty
523   IF lin_det_rec.lse_id in (7,9,25) AND (nvl(l_sub_instance_check,'X') <> 'Y') THEN
524 
525    --errorout_ad(' max date '||to_char(total_billed_rec.date_billed_to));
526     --mchoudha fix for bug#5158185
527     --added the condition p_term_date is null so that the following logic doesn't get called
528     --in case of termination
529     IF (total_billed_rec.date_billed_to is not null)
530        AND p_term_date is null THEN
531       IF (total_billed_rec.date_billed_to < p_end_date)
532       THEN --  partially Billed cases
533         l_amount := lin_det_rec.price_negotiated - total_billed_rec.amount;
534         l_duration := OKS_TIME_MEASURES_PUB.get_quantity (
535                                                         p_start_date   => total_billed_rec.date_billed_to+1,
536                                                         p_end_date     => p_end_date,
537                                                         p_source_uom   => P_billing_uom,--nvl(lin_det_rec.price_uom,l_uom), --target uom
538                                                         p_period_type  => p_period_type,
539                                                         p_period_start => p_period_start
540                                                         );
541        IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
542           fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.product_pricing.partially_billed_cases',
543          'after calling OKS_TIME_MEASURES_PUB.get_quantity with parameters p_period_type '||p_period_type||' p_period_start '||p_period_start
544         ||' result l_duration = ' || l_duration);
545        END IF;
546 
547         IF nvl(l_duration,0) = 0 THEN
548           RAISE G_EXCEPTION_HALT_VALIDATION;
549         END IF;
550         l_unit_price := l_amount/l_duration; -- recalculaing unit price
551         l_start_date := total_billed_rec.date_billed_to+1;
552        IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
553           fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.product_pricing.partially_billed_cases',
554          ' recalculated unit price  l_unit_price = ' || l_unit_price);
555        END IF;
556 
557       ELSE      -- billed to => l end date, 100% billed cases
558         RETURN(0);
559       END IF;
560     ELSE        --billed to is null = never billed cases
561       IF nvl(lin_det_rec.toplvl_uom_code,l_uom) <> P_billing_uom THEN
562         l_unit_price := OKS_BILL_SCH.Get_Converted_price(
563                                             p_price_uom        =>P_billing_uom,
564                                             p_pl_uom           =>nvl(lin_det_rec.toplvl_uom_code,l_uom),
565                                             p_period_start     =>p_period_start,
566                                             p_period_type      =>p_period_type,
567                                             p_price_negotiated =>l_price_negotiated,
568                                             p_unit_price       =>l_source_unit_price,
569                                             p_start_date       =>lin_det_rec.start_date,
570                                             p_end_date         =>lin_det_rec.end_date
571                                             );
572         IF l_unit_price is NULL THEN
573           RAISE G_EXCEPTION_HALT_VALIDATION;
574         END IF;
575       ELSE
576         l_unit_price := l_source_unit_price;
577       END IF;
578       l_start_date := lin_det_rec.start_date;
579       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
580           fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.product_pricing.unbilled_case',
581          ' l_unit_price = ' || l_unit_price);
582       END IF;
583 
584     END IF;
585 --
586 
587 
588         Return nvl(l_unit_price*p_duration,0);
589 
590 
591   ELSE -- Manual pricing for other covered levels for subline and for negotiated price Usage)
592     IF(total_billed_rec.date_billed_to is not null)
593     THEN        -- partial billed cases
594       IF (total_billed_rec.date_billed_to < p_end_date)
595       THEN
596         l_amount := lin_det_rec.price_negotiated - total_billed_rec.amount;
597         l_duration :=OKS_TIME_MEASURES_PUB.get_quantity(
598                                p_start_date   => total_billed_rec.date_billed_to+1,
599                                p_end_date     => p_end_date,
600                                p_source_uom   => p_billing_uom,
601                                p_period_type  => p_period_type,
602                                p_period_start => p_period_start
603                                );
604         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
605           fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.manual_pricing.partially_billed_cases',
606           'after calling OKS_TIME_MEASURES_PUB.get_quantity with parameters p_period_type '||p_period_type||' p_period_start '||p_period_start
607           ||' result l_duration = ' || l_duration);
608         END IF;
609         IF nvl(l_duration,0) = 0 THEN
610           RAISE G_EXCEPTION_HALT_VALIDATION;
611         END IF;
612         --changed from l_quantity to l_duration
613         l_unit_price := l_amount/l_duration;
614         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
615            fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.manual_pricing.partailly_billed_cases',
616            ' returned unit price =  ' || l_unit_price);
617         END IF;
618         Return nvl(l_unit_price*p_duration,0);
619       ELSE      -- billed to >= l end date, 100% billed cases
620         RETURN(0);
621       END IF;
622 
623     ELSE -- unbilled cases
624       l_amount := lin_det_rec.price_negotiated;
625       l_start_date := lin_det_rec.start_date;
626 
627       l_quantity := OKS_TIME_MEASURES_PUB.get_quantity
628                        (p_start_date   => l_start_date,
629                         p_end_date     => p_end_date,
630                         p_source_uom   => p_billing_uom,
631                         p_period_type  => p_period_type,
632                         p_period_start => p_period_start);
633 
634       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
635           fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.manual_pricing.unbilled_cases',
636           'after calling OKS_TIME_MEASURES_PUB.get_quantity with parameters p_period_type '||p_period_type||' p_period_start '||p_period_start
637           ||' result l_quantity = ' || l_quantity);
638       END IF;
639 
640       IF nvl(l_quantity,0) = 0 THEN
641         RAISE G_EXCEPTION_HALT_VALIDATION;
642       END IF;
643         --errorout_ad(' l_quantity '||l_quantity);
644         --errorout_ad(' l_amount '||l_amount);
645       l_unit_price := l_amount/l_quantity;
646          --errorout_ad(' l_unit_price '||l_unit_price);
647       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
648          fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Unit_Price_Per_Uom.manual_pricing.unbilled_cases',
649          ' returned unit price =  ' || l_unit_price);
650       END IF;
651 
652         Return nvl(l_unit_price*p_duration,0);
653    END IF;
654 END IF;
655 
656 EXCEPTION
657 WHEN G_EXCEPTION_HALT_VALIDATION THEN
658        RETURN NULL;
659 WHEN OTHERS THEN
660         --set the error message and return with NULL to notify the
661         --caller of error
662         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
663                             p_msg_name     => G_UNEXPECTED_ERROR,
664                             p_token1       => G_SQLCODE_TOKEN,
665                             p_token1_value => sqlcode,
666                             p_token2       => G_SQLERRM_TOKEN,
667                             p_token2_value => sqlerrm);
668 
669        RETURN NULL;
670 
671 END get_unit_price_per_uom;
672 
673  -------------------------------------------------------------------------
674  -- Begin partial period computation logic
675  -- Developer Mani Choudhary
676  -- Date 18-SEP-2005
677  -- This Function will calculate the converted  price from price_list_uom
678  -- to price_uom for covered product and covered item.
679  -------------------------------------------------------------------------
680 FUNCTION Get_Converted_price (
681                               p_price_uom        IN VARCHAR2,
682                               p_pl_uom           IN VARCHAR2,
683                               p_period_start     IN VARCHAR2,
684                               p_period_type      IN VARCHAR2,
685                               p_price_negotiated IN NUMBER,
686                               p_unit_price       IN NUMBER,
687                               p_start_date       IN DATE,
688                               p_end_date         IN DATE
689 
690 )
691 RETURN NUMBER
692 AS
693 --Declare variables or cursors
694 l_quantity          NUMBER;
695 l_return_status     VARCHAR2(1);
696 l_source_uom_quantity      NUMBER;
697 l_source_tce_code          VARCHAR2(30);
698 l_target_uom_quantity      NUMBER;
699 l_target_tce_code          VARCHAR2(30);
700 l_target_qty               NUMBER;
701 
702 BEGIN
703    OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
704                     (p_timeunit      => p_price_uom,
705                      x_return_status => l_return_status,
706                      x_quantity      => l_target_uom_quantity ,
707                      x_timeunit      => l_target_tce_code);
708 
709     IF l_return_status <> 'S' THEN
710       RAISE G_EXCEPTION_HALT_VALIDATION;
711     END IF;
712 
713    OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
714                     (p_timeunit      => p_pl_uom,
715                      x_return_status => l_return_status,
716                      x_quantity      => l_source_uom_quantity ,
717                      x_timeunit      => l_source_tce_code);
718 
719     IF l_return_status <> 'S' THEN
720       RAISE G_EXCEPTION_HALT_VALIDATION;
721     END IF;
722 
723 IF p_period_type = 'FIXED' THEN
724 
725     --When source uom is seeded in terms of DAY
726     IF l_source_tce_code ='DAY' THEN
727       IF l_target_tce_code ='YEAR' THEN
728         l_target_qty:= p_unit_price*((360*l_target_uom_quantity)/l_source_uom_quantity);
729       ELSIF l_target_tce_code ='MONTH' THEN
730         l_target_qty:= p_unit_price*((30*l_target_uom_quantity)/l_source_uom_quantity);
731       ELSIF l_target_tce_code ='DAY' THEN
732         l_target_qty:= p_unit_price*(l_target_uom_quantity/l_source_uom_quantity);
733       END IF;
734     --When source uom is seeded in terms of MONTH
735     ELSIF l_source_tce_code ='MONTH' THEN
736       IF l_target_tce_code ='YEAR' THEN
737         l_target_qty:= p_unit_price*((12*l_target_uom_quantity)/l_source_uom_quantity);
738       ELSIF l_target_tce_code ='MONTH' THEN
739         l_target_qty:= p_unit_price*(l_target_uom_quantity/l_source_uom_quantity);
740       ELSIF l_target_tce_code ='DAY' THEN
741         l_target_qty:= p_unit_price*(l_target_uom_quantity/(l_source_uom_quantity*30));
742       END IF;
743     --When source uom is seeded in terms of YEAR
744     ELSIF l_source_tce_code ='YEAR' THEN
745       IF l_target_tce_code ='YEAR' THEN
746         l_target_qty:= p_unit_price*(l_target_uom_quantity/l_source_uom_quantity);
747       ELSIF l_target_tce_code ='MONTH' THEN
748         l_target_qty:= p_unit_price*(l_target_uom_quantity/(l_source_uom_quantity*12));
749       ELSIF l_target_tce_code ='DAY' THEN
750         l_target_qty:= p_unit_price*(l_target_uom_quantity/(l_source_uom_quantity*360));
751       END IF;
752 
753     END IF;
754 return (l_target_qty);
755 END IF;
756 
757 l_quantity := OKS_TIME_MEASURES_PUB.get_quantity
758                        (p_start_date   => p_start_date,
759                         p_end_date     => p_end_date,
760                         p_source_uom   => p_price_uom,
761                         p_period_type  => p_period_type,
762                         p_period_start => p_period_start);
763 
764 RETURN p_price_negotiated/l_quantity;
765 
766 EXCEPTION
767 WHEN G_EXCEPTION_HALT_VALIDATION THEN
768        RETURN NULL;
769 WHEN OTHERS THEN
770         --set the error message and return with NULL to notify the
771         --caller of error
772         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
773                             p_msg_name     => G_UNEXPECTED_ERROR,
774                             p_token1       => G_SQLCODE_TOKEN,
775                             p_token1_value => sqlcode,
776                             p_token2       => G_SQLERRM_TOKEN,
777                             p_token2_value => sqlerrm);
778 
779        RETURN NULL;
780 
781 END Get_Converted_price;
782 
783 
784 Procedure Create_Header_Bill_Sch
785 (
786       p_billing_type         IN    Varchar2
787 ,     p_sll_tbl              IN    StreamLvl_tbl
788 ,     p_invoice_rule_id      IN    Number
789 ,     x_bil_sch_out_tbl      OUT   NOCOPY ItemBillSch_tbl
790 ,     x_return_status        OUT   NOCOPY Varchar2
791 )
792 IS
793 
794   Cursor l_contract_Csr(l_contract_id number) Is
795           SELECT id, TRUNC(start_date) start_dt,
796           nvl(trunc(date_terminated - 1) ,TRUNC(end_date)) end_dt
797           FROM   okc_k_headers_b
798           WHERE  Id =  l_contract_id ;
799 
800   Cursor l_top_line_Csr(l_contract_id number, l_hdr_date date) Is
801           SELECT line.id id, line.inv_rule_id inv_rule_id, line.lse_id lse_id,
802            det.usage_type usage_type
803           FROM   OKC_K_LINES_b line, oks_k_lines_b det
804           WHERE  line.dnz_chr_id =  l_contract_id
805           AND line.lse_id IN (1, 12, 14, 19, 46)
806           AND line.id = det.cle_id;
807 
808 
809 
810 
811 
812   l_Top_Line_Rec           l_Top_Line_Csr%Rowtype;
813   l_Contract_Rec           l_contract_Csr%Rowtype;
814   l_sll_out_tbl            StrmLvl_Out_tbl;
815   l_sll_count              NUMBER;
816   l_bil_sch_out_tbl        ItemBillSch_tbl;
817   l_sll_tbl                OKS_BILL_SCH.StreamLvl_tbl;
818   l_line_inv_id            NUMBER;
819   --
820 
821    l_init_msg_list      VARCHAR2(2000) := OKC_API.G_FALSE;
822    l_return_status      VARCHAR2(10);
823    l_msg_count          NUMBER;
824    l_msg_data           VARCHAR2(2000);
825    l_msg_index_out      NUMBER;
826    l_msg_index  NUMBER;
827 --
828 
829 -------------------------------------------------------------------------
830 -- Begin partial period computation logic
831 -- Developer Mani Choudhary
832 -- Date 04-MAY-2005
833 -------------------------------------------------------------------------
834 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
835 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
836 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
837 -------------------------------------------------------------------------
838  /* Start Addition for bug fix 5945006 (FP Bug for 5926840) */
839  	   CURSOR c_khr_csr(c_chr_id IN NUMBER) IS
840  	           SELECT khr.acct_rule_id acct_rule_id
841  	           FROM   oks_k_headers_b khr
842  	           WHERE  khr.chr_id = c_chr_id;
843 
844  	   l_acct_rule_id    NUMBER;
845 
846  	   CURSOR c_subline_csr(c_topline_id IN NUMBER) IS
847  	           SELECT cle.id
848  	           FROM   okc_k_lines_b cle
849  	           WHERE  cle.cle_id = c_topline_id
850  	           AND    cle.lse_id IN(7,8,9,10,11,13,25,35);
851  	   /* End Addition for bug fix 5945006 (FP Bug for 5926840) */
852 
853 
854 Begin
855   x_return_status := 'S';
856 
857   IF p_sll_tbl.count = 0  THEN
858     x_return_status := 'S';
859     l_header_billing := null;
860     RETURN;
861   END IF;
862 
863   l_header_billing := p_sll_tbl(p_sll_tbl.FIRST).chr_id;
864 -------------------------------------------------------------------------
865  -- Begin partial period computation logic
866  -- Developer Mani Choudhary
867  -- Date 09-MAY-2005
868  -------------------------------------------------------------------------
869    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
870                 (
871                  p_hdr_id        => l_header_billing,
872                  p_org_id        => NULL,
873                  x_period_start  => l_period_start,
874                  x_period_type   => l_period_type,
875                  x_price_uom     => l_price_uom,
876                  x_return_status => x_return_status);
877 
878    IF x_return_status <> 'S' THEN
879       RAISE G_EXCEPTION_HALT_VALIDATION;
880    END IF;
881 
882 
883  -------------------------------------------------------------------------
884  -- End partial period computation logic
885  -- Date 09-MAY-2005
886  -------------------------------------------------------------------------
887 
888 
889  IF p_billing_type IS NULL THEN
890      OKC_API.set_message(G_PKG_NAME,'BILLING SCHEDULE TYPE');
891      x_return_status := 'E';
892      RAISE G_EXCEPTION_HALT_VALIDATION;
893   END IF;
894 
895 
896 
897   IF p_invoice_rule_id IS NULL THEN
898      OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'INVOICE ID NULL.');
899      x_return_status := 'E';
900      IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
901           fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
902              'p_invoice_rule_id null');
903      END IF;
904      RAISE G_EXCEPTION_HALT_VALIDATION;
905    END IF;
906 
907 
908   ------------find out the line details
909 
910   Open l_contract_Csr(p_sll_tbl(p_sll_tbl.FIRST).chr_id);
911   Fetch l_contract_Csr Into l_contract_Rec;
912 
913   If l_contract_Csr%Notfound then
914     Close l_contract_Csr;
915     x_return_status := 'E';
916     IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
917           fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
918              'contract dtls not found. = ' || p_sll_tbl(p_sll_tbl.FIRST).chr_id);
919     END IF;
920     RAISE G_EXCEPTION_HALT_VALIDATION;
921   End If;
922   Close l_contract_Csr;
923 
924 /* Start Addition for bug fix 5945006 (FP Bug for 5926840) */
925  	   OPEN c_khr_csr(p_sll_tbl(p_sll_tbl.FIRST).chr_id);
926  	   FETCH c_khr_csr INTO l_acct_rule_id;
927  	   IF c_khr_csr%NOTFOUND
928  	   THEN
929  	     CLOSE c_khr_csr;
930  	     IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level
931  	     THEN
932  	       fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
933  	              'Accounting rule id not found for header id = ' || p_sll_tbl(p_sll_tbl.FIRST).chr_id);
934  	     END IF;
935  	     RAISE G_EXCEPTION_HALT_VALIDATION;
936  	   END IF;
937  	   CLOSE c_khr_csr;
938  	   /* End Addition for bug fix 5945006 (FP Bug for 5926840) */
939 
940 
941   l_currency_code := Find_Currency_Code(
942                                     p_cle_id  => NULL,
943                                     p_chr_id  => p_sll_tbl(p_sll_tbl.FIRST).chr_id);
944   IF l_currency_code IS NULL THEN
945         OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
946         x_return_status := 'E';
947         IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
948           fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
949              'currency code not found.');
950         END IF;
951         RETURN;
952   END IF;
953 
954   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
955 
956    fnd_log.STRING (fnd_log.level_statement,
957                    G_MODULE_CURRENT || '.create_header_bill_sch.dtls',
958                       'currency_code = ' || l_currency_code
959                    || ', p_invoice_rule_id = ' || p_invoice_rule_id
960                    || ', p_billing_type = ' || p_billing_type
961                   );
962   END IF;
963 
964   /*UPDATE OKS_K_HEADERS_B SET billing_schedule_type = p_billing_type
965   WHERE chr_id = l_Contract_Rec.id;*/
966 
967   -----create  'SLL' REC
968    -------------------------------------------------------------------------
969  -- Begin partial period computation logic
970  -- Developer Mani Choudhary
971  -- Date 09-MAY-2005
972  -- Added two new parameters P_period_start,P_period_type in procedural call
973  -------------------------------------------------------------------------
974  --Bug Fix 5185658
975   pkg_cascade_billing_hdr := 'Y';
976 
977   Create_Stream_Level (p_billing_type          => p_billing_type,
978                          p_strm_lvl_tbl          => p_sll_tbl,
979                          p_dnz_chr_id            => l_Contract_Rec.id,
980                          p_subline_call          => 'H',
981                          p_line_amt              => NULL,
982                          p_subline_amt           => NULL,
983                          p_sll_start_dt          => l_contract_rec.start_dt,
984                          p_end_dt                => l_contract_rec.end_dt,
985                          p_period_start          => l_period_start,
986                          p_period_type           => l_period_type,
987                          x_sll_out_tbl           => l_sll_out_tbl,
988                          x_return_status         => x_return_status);
989  -------------------------------------------------------------------------
990  -- End partial period computation logic
991  -- Date 09-MAY-2005
992  -------------------------------------------------------------------------
993 
994   -----errorout_ad('Create_Stream_Level status = ' || x_return_status);
995   -----errorout_ad('TOTAL SLL COUNT for line'|| TO_CHAR(l_sll_out_tbl.COUNT));
996 
997   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
998     fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_header_bill_sch.create_hdr_sll',
999                       'Create_Stream_Level(x_return_status = '||x_return_status
1000                       ||', sll tbl out count = '||l_sll_out_tbl.count||')');
1001   END IF;
1002 
1003   IF x_return_status <> 'S' THEN
1004     RAISE G_EXCEPTION_HALT_VALIDATION;
1005   END IF;
1006 
1007   ----if l_sll_out_tbl.count > 0 then insert lines into oks_level_elements
1008   IF l_sll_out_tbl.count > 0 then
1009  -------------------------------------------------------------------------
1010  -- Begin partial period computation logic
1011  -- Developer Mani Choudhary
1012  -- Date 09-MAY-2005
1013  -- Added two new parameters p_period_start and p_period_type
1014  -------------------------------------------------------------------------
1015      Create_Hdr_Level_elements(
1016                       p_billing_type     => p_billing_type,
1017                       p_sll_tbl          => l_sll_out_tbl,
1018                       p_hdr_rec          => l_contract_rec,
1019                       p_invoice_ruleid   => p_invoice_rule_id,
1020                       p_called_from      => 1,
1021                       p_period_start     =>  l_period_start,
1022                       p_period_type      =>  l_period_type,
1023                       x_return_status    => x_return_status);
1024 
1025      -----errorout_ad('Create_Hdr_Level_elements status = ' || x_return_status);
1026 
1027      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1028          fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_header_bill_sch.create_hdr_lvl',
1029                       'Create_Hdr_Level_elements(x_return_status = '||x_return_status
1030                       ||', sll tbl out count passed = '||l_sll_out_tbl.count||')');
1031      END IF;
1032 
1033      IF x_return_status <> 'S' THEN
1034        RAISE G_EXCEPTION_HALT_VALIDATION;
1035      END IF;
1036   ELSE
1037      -----errorout_ad('sll count = ' || to_char(0));
1038      x_return_status := 'E';
1039      RAISE G_EXCEPTION_HALT_VALIDATION;
1040   END IF ;
1041 
1042 ----create schedule for all lines.
1043 
1044 FOR l_top_line_rec IN l_top_line_csr(l_contract_rec.id, l_contract_rec.start_dt)
1045 LOOP
1046 
1047    IF l_top_line_rec.lse_id = 12 AND l_top_line_rec.usage_type in ('VRT', 'QTY')
1048       AND p_invoice_rule_id = -2 THEN
1049 
1050       l_line_inv_id := -3;
1051    ELSE
1052       l_line_inv_id := NULL;
1053 
1054    END IF;
1055 
1056 
1057    IF (nvl(l_top_line_rec.inv_rule_id , 0 ) <> p_invoice_rule_id ) OR l_line_inv_id IS NOT NULL THEN
1058 
1059         UPDATE okc_k_lines_b SET inv_rule_id = nvl(l_line_inv_id,p_invoice_rule_id)
1060         WHERE id = l_top_line_rec.id;
1061 
1062 
1063     END IF;
1064  /* Start Addition for bug fix 5945006 (FP Bug for 5926840) */
1065  	     UPDATE oks_k_lines_b
1066  	     SET    acct_rule_id = l_acct_rule_id
1067  	     WHERE  cle_id = l_top_line_rec.id;
1068  	     /* End Addition for bug fix 5945006 (FP Bug for 5926840) */
1069 
1070 
1071 
1072      l_sll_tbl := p_sll_tbl;
1073 
1074      ---chnage the sll tbl to call for line
1075 
1076      FOR l_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
1077      LOOP
1078 
1079        l_sll_tbl(l_index).id           := NULL;
1080        l_sll_tbl(l_index).cle_id       := l_top_line_rec.id;
1081        l_sll_tbl(l_index).chr_id       := NULL;
1082        l_sll_tbl(l_index).dnz_chr_id   := l_contract_rec.id;
1083        --Start 25-APR-2005 mchoudha Fix for bug#4306152
1084        IF nvl(l_line_inv_id,p_invoice_rule_id) = -3 THEN
1085          l_sll_tbl(l_index).invoice_offset_days := NULL;
1086        END IF;
1087        --End 25-APR-2005 mchoudha Fix for bug#4306152
1088      END LOOP;
1089 
1090 
1091      Create_Bill_Sch_Rules(
1092         p_billing_type     => p_billing_type,
1093         p_sll_tbl          => l_sll_tbl,
1094         p_invoice_rule_id  => nvl(l_line_inv_id,p_invoice_rule_id),
1095         x_bil_sch_out_tbl  => l_bil_sch_out_tbl,
1096         x_return_status    => x_return_status);
1097 
1098     IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1099          fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_header_bill_sch.create_line_bs',
1100                       'Create_Bill_Sch_Rules(x_return_status = '||x_return_status
1101                       ||', line id = '||l_sll_tbl(l_sll_tbl.first).cle_id||')');
1102     END IF;
1103 
1104     -----errorout_ad('Create_Bill_Sch_Rules status = ' || x_return_status);
1105     IF x_return_status <> 'S' THEN
1106        RAISE G_EXCEPTION_HALT_VALIDATION;
1107     END IF;
1108 /* Start Addition for bug fix 5945006 (FP Bug for 5926840) */
1109  	     FOR c_subline_rec IN c_subline_csr(l_top_line_rec.id)
1110  	     LOOP
1111  	       UPDATE oks_k_lines_b
1112  	       SET acct_rule_id = l_acct_rule_id
1113  	       WHERE cle_id = c_subline_rec.id;
1114  	     END LOOP;
1115  	    /* End Addition for bug fix 5945006 (FP Bug for 5926840) */
1116 
1117 END LOOP;
1118 
1119 Copy_Bill_Sch(
1120            p_chr_id        => l_contract_rec.id,
1121            p_cle_id        => NULL,
1122            x_copy_bill_sch => x_bil_sch_out_tbl,
1123            x_return_status => x_return_status);
1124 
1125 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1126    fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_header_bill_sch.hdr_bs_return',
1127                       'Copy_Bill_Sch(x_return_status = '||x_return_status
1128                       ||', level element count = '|| x_bil_sch_out_tbl.count ||')');
1129 END IF;
1130 
1131 -----errorout_ad('Copy_Bill_Sch = ' || x_return_status);
1132 
1133 EXCEPTION
1134  WHEN G_EXCEPTION_HALT_VALIDATION THEN
1135   IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
1136         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_header_bill_sch.EXCEPTION',
1137                     'G_EXCEPTION_HALT_VALIDATION');
1138   END IF;
1139 
1140   l_currency_code := NULL;
1141   l_header_billing := NULL;
1142 
1143  WHEN OTHERS THEN
1144 
1145    IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
1146         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_header_bill_sch.UNEXPECTED',
1147                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
1148    END IF;
1149    l_currency_code := NULL;
1150    l_header_billing := NULL;
1151    OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
1152                        p_msg_name     => G_UNEXPECTED_ERROR,
1153                        p_token1       => G_SQLCODE_TOKEN,
1154                        p_token1_value => sqlcode,
1155                        p_token2       => G_SQLERRM_TOKEN,
1156                        p_token2_value => sqlerrm);
1157 
1158    x_return_status := G_RET_STS_UNEXP_ERROR;
1159 
1160 END Create_Header_Bill_Sch;
1161 
1162 
1163 
1164 
1165 Procedure Create_Bill_Sch_Rules
1166 (     p_billing_type         IN    VARCHAR2
1167 ,     p_sll_tbl              IN    StreamLvl_tbl
1168 ,     p_invoice_rule_id      IN    Number
1169 ,     x_bil_sch_out_tbl      OUT   NOCOPY ItemBillSch_tbl
1170 ,     x_return_status        OUT   NOCOPY Varchar2
1171 )
1172 
1173 IS
1174 ------------------------------------------------------------------------
1175  -- Begin partial period computation logic
1176  -- Developer Mani Choudhary
1177  -- Date 17-MAY-2005
1178  -- Added price_uom and lse_id in the select clause
1179  -------------------------------------------------------------------------
1180     Cursor l_subLine_Csr(l_line_id number, l_style_id number) Is
1181                SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
1182                       TRUNC(line.end_date) cp_end_dt, line.dnz_chr_id dnz_chr_id,
1183                       TRUNC(line.date_terminated) cp_term_dt,
1184                       price_UOM,lse_id cp_lse_id,
1185                       dtl.billing_schedule_type billing_schedule_type,
1186                       dtl.full_credit full_credit,
1187                       (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
1188                        nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) subline_amt
1189                FROM okc_k_lines_b line, oks_k_lines_b dtl
1190                WHERE line.cle_id = l_line_id
1191                AND line.date_cancelled is NULL
1192                AND line.id = dtl.cle_id
1193                AND ((l_style_id = 1 and line.lse_id in (35,7,8,9,10,11))
1194                 OR (l_style_id = 12 and line.lse_id = 13)
1195                 OR (l_style_id = 14 and line.lse_id = 18)
1196                 OR (l_style_id = 19 and line.lse_id = 25));
1197 ------------------------------------------------------------------------
1198  -- Begin partial period computation logic
1199  -- Developer Mani Choudhary
1200  -- Date 17-MAY-2005
1201  -- Added price_uom in the select clause
1202  -------------------------------------------------------------------------
1203   Cursor l_Line_Csr(l_line_id number) Is
1204                SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
1205                       TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
1206                       line.cle_id cle_id,TRUNC(date_terminated) line_term_dt,
1207                       dtl.full_credit full_credit,
1208                       price_uom,
1209                       (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
1210                        nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt
1211                FROM okc_k_lines_b line, oks_k_lines_b dtl
1212                WHERE  line.id = dtl.cle_id AND line.Id =  l_line_id
1213                AND   line.date_cancelled is NULL;
1214 
1215   CURSOR l_line_BS_csr(p_line_id  NUMBER) IS
1216 
1217          SELECT id,trunc(date_start) date_start,
1218          amount,trunc(date_end) date_end,object_version_number,
1219          date_to_interface, date_transaction
1220          FROM oks_level_elements
1221          WHERE cle_id = p_line_id
1222          ORDER BY date_start;
1223 
1224 
1225 Cursor  l_line_amt_csr (p_id in number) IS
1226 Select  line.price_negotiated
1227 from    okc_k_lines_b line
1228 where   line.id = p_id;
1229 
1230 
1231 
1232   l_Line_Csr_Rec           l_Line_Csr%Rowtype;
1233   l_SubLine_Csr_Rec        l_subLine_Csr%Rowtype;
1234   l_sll_out_tbl            StrmLvl_Out_tbl;
1235   l_top_bs_tbl             oks_bill_level_elements_pvt.letv_tbl_type;
1236   l_line_BS_rec            l_line_BS_csr%rowtype;
1237   l_sll_tbl                OKS_BILL_SCH.StreamLvl_tbl;
1238 
1239 
1240   l_dnz_chr_id            Number;
1241   l_sll_count            NUMBER;
1242   l_index                NUMBER;
1243   l_line_rec             Line_Det_Type;
1244   l_cp_rec               Prod_Det_Type;
1245   l_sll_start_dT         DATE;
1246   l_cp_term_dt           DATE;
1247   l_line_term_dt           DATE;
1248   --
1249   l_api_version         CONSTANT        NUMBER  := 1.0;
1250   l_init_msg_list       VARCHAR2(2000) := OKC_API.G_FALSE;
1251   l_msg_count           NUMBER;
1252    l_msg_data           VARCHAR2(2000);
1253    l_msg_index_out      NUMBER;
1254    l_msg_index  NUMBER;
1255 -------------------------------------------------------------------------
1256 -- Begin partial period computation logic
1257 -- Developer Mani Choudhary
1258 -- Date 04-MAY-2005
1259 -------------------------------------------------------------------------
1260 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
1261 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
1262 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
1263 l_return_status     VARCHAR2(30);
1264 l_tangible          BOOLEAN;
1265 l_pricing_method    VARCHAR2(30);
1266 -------------------------------------------------------------------------
1267 -- End partial period computation logic
1268 -- Date 04-MAY-2005
1269 -------------------------------------------------------------------------
1270 --
1271 Begin
1272 
1273   x_return_status := 'S';
1274 
1275   l_sll_tbl.delete;
1276 
1277 
1278   IF p_sll_tbl.count = 0  THEN
1279     x_return_status := 'S';
1280     RETURN;
1281   END IF;
1282 
1283   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1284 
1285    fnd_log.STRING (fnd_log.level_statement,
1286                    G_MODULE_CURRENT || '.create_bill_sch_rules.passed_val',
1287                       'p_sll_tbl count = ' || p_sll_tbl.count
1288                    || ', p_invoice_rule_id = ' || p_invoice_rule_id
1289                    || ', p_billing_type = ' || p_billing_type
1290                   );
1291   END IF;
1292 
1293   IF p_invoice_rule_id IS NULL THEN
1294 -- nechatur 23-DEC-2005 for bug#4684706
1295 -- OKC_API.set_message(G_PKG_NAME,'OKS_INVD_COV_RULE','RULE_NAME','IRE');
1296    OKC_API.set_message(G_PKG_NAME,'OKS_INVOICING_RULE');
1297 -- end bug#4684706
1298      x_return_status := 'E';
1299      RAISE G_EXCEPTION_HALT_VALIDATION;
1300   END IF;
1301 
1302   IF p_billing_type IS NULL THEN
1303      OKC_API.set_message(G_PKG_NAME,'BILLING SCHEDULE TYPE');
1304      x_return_status := 'E';
1305      RAISE G_EXCEPTION_HALT_VALIDATION;
1306   END IF;
1307 
1308 /* Line and subline details are fetched in different cursor as some of the top line (46)don't have subline
1309    and same API is called for subline BS in case of P
1310   otherwise the sql will have outer join*/
1311 
1312   ------------find out the line details
1313 
1314   Open l_Line_Csr(p_sll_tbl(p_sll_tbl.first).cle_id);
1315   Fetch l_Line_Csr Into l_Line_Csr_Rec;
1316 
1317   If l_Line_Csr%Notfound then
1318     Close l_Line_Csr;
1319     x_return_status := 'E';
1320     RAISE G_EXCEPTION_HALT_VALIDATION;
1321   End If;
1322   l_dnz_chr_id := l_Line_Csr_Rec.dnz_chr_id;
1323   Close l_Line_Csr;
1324 
1325   l_line_rec.chr_id          :=  l_Line_Csr_Rec.chr_id;
1326   l_line_rec.dnz_chr_id      :=  l_Line_Csr_Rec.dnz_chr_id;
1327   l_line_rec.id              :=  l_Line_Csr_Rec.id ;
1328   l_line_rec.cle_id          :=  l_Line_Csr_Rec.cle_id ;
1329   l_line_rec.lse_id          :=  l_Line_Csr_Rec.lse_id;
1330   l_line_rec.line_start_dt   :=  l_Line_Csr_Rec.line_start_dt;
1331   l_line_rec.line_end_dt     :=  l_Line_Csr_Rec.line_end_dt;
1332   l_line_rec.line_amt        :=  l_Line_Csr_Rec.line_amt ;
1333   l_line_rec.price_uom       :=  l_Line_Csr_Rec.price_uom;
1334 
1335  -------------------------------------------------------------------------
1336  -- Begin partial period computation logic
1337  -- Developer Mani Choudhary
1338  -- Date 09-MAY-2005
1339  -------------------------------------------------------------------------
1340 
1341    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
1342                 (
1343                  p_hdr_id          => l_Line_Csr_Rec.dnz_chr_id,
1344                  p_org_id          => NULL,
1345                  x_period_start    => l_period_start,
1346                  x_period_type     => l_period_type,
1347                  x_price_uom       => l_price_uom,
1348                  x_return_status   => x_return_status);
1349 
1350    IF x_return_status <> 'S' THEN
1351       RAISE G_EXCEPTION_HALT_VALIDATION;
1352    END IF;
1353   --Description in detail for the business rules for deriving the period start
1354   --1)For usage , period start  will always be 'SERVICE'
1355   --2)For Subscriptions, period start and period type will be NULL
1356   --  for tangible subscriptions as per CR1.For intangible subscriptions,
1357   --  if the profile OKS: Intangible Subscription Pricing Method
1358   --  is set to 'Subscription Based',then period start and period type will be NULL
1359   --  otherwise it will be 'SERVICE'
1360   --3) For Extended Warranty from OM, period start will always be 'SERVICE'
1361 
1362    IF l_period_start IS NOT NULL AND
1363       l_period_type IS NOT NULL
1364    THEN
1365      IF l_line_rec.lse_id =12 THEN
1366         l_period_start := 'SERVICE';
1367      END IF;
1368      IF l_line_rec.lse_id = 46 THEN
1369        --mchoudha fix for bug#5183011
1370        l_tangible  := OKS_SUBSCRIPTION_PUB.is_subs_tangible (l_line_rec.id);
1371        IF l_tangible THEN
1372          l_period_start := NULL;
1373          l_period_type := NULL;
1374        ELSE
1375          l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
1376          IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
1377            l_period_start := NULL;
1378            l_period_type := NULL;
1379          ELSE
1380            l_period_start := 'SERVICE';
1381          END IF;   -- l_pricing_method <> 'EFFECTIVITY'
1382        END IF;     -- IF l_tangible THEN
1383      END IF;       -- IF l_Line_Csr_Rec.lse_id = 46
1384    END IF;         -- period start and period type are not NULL
1385  -------------------------------------------------------------------------
1386  -- End partial period computation logic
1387  -- Date 09-MAY-2005
1388  -------------------------------------------------------------------------
1389 
1390   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1391 
1392    fnd_log.STRING (fnd_log.level_statement,
1393                    G_MODULE_CURRENT || '.create_bill_sch_rules.line_dtls',
1394                       'dnz_chr_id = ' || l_line_rec.dnz_chr_id
1395                    || ', id = ' || l_line_rec.id
1396                    || ', lse_id = ' || l_line_rec.lse_id
1397                    || ', start dt = ' || l_line_rec.line_start_dt
1398                    || ', end dt = ' || l_line_rec.line_end_dt
1399                    || ', amt = ' || l_line_rec.line_amt
1400                    || ', full_credit flag = ' || l_Line_Csr_Rec.full_credit
1401                   );
1402   END IF;
1403 
1404 
1405   IF l_header_billing IS NULL THEN
1406      l_currency_code := Find_Currency_Code(
1407                                     p_cle_id  => p_sll_tbl(p_sll_tbl.first).cle_id,
1408                                     p_chr_id  => NULL);
1409 
1410      IF l_currency_code IS NULL THEN
1411         OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
1412         x_return_status := 'E';
1413         RAISE G_EXCEPTION_HALT_VALIDATION;
1414      END IF;
1415   END IF;
1416 
1417   ---FIND sll start date
1418   l_sll_start_dt := l_line_csr_rec.line_start_dt;
1419 
1420 
1421   -----create  'SLL'
1422 
1423   UPDATE oks_k_lines_b set billing_schedule_type = p_billing_type
1424   WHERE cle_id = l_line_csr_rec.id;
1425 
1426    -------------------------------------------------------------------------
1427  -- Begin partial period computation logic
1428  -- Developer Mani Choudhary
1429  -- Date 09-MAY-2005
1430  -- Added two new parameters P_period_start,P_period_type in procedural call
1431  -------------------------------------------------------------------------
1432   Create_Stream_Level
1433      (p_billing_type              =>  p_billing_type,
1434       p_strm_lvl_tbl              =>  p_sll_tbl,
1435       p_dnz_chr_id                =>  l_line_csr_rec.dnz_chr_id,
1436       p_subline_call              =>  'N',
1437       p_line_amt                  =>  l_Line_Csr_Rec.line_amt,
1438       p_subline_amt               =>  null,
1439       p_sll_start_dt              =>  l_sll_start_dt,
1440       p_end_dt                    =>  l_line_rec.line_end_dt,
1441       p_period_start              =>  l_period_start,
1442       p_period_type               =>  l_period_type,
1443       x_sll_out_tbl               =>  l_sll_out_tbl,
1444       x_return_status             =>  x_return_status);
1445 
1446    -----errorout_ad('TOTAL SLL COUNT for line'|| TO_CHAR(l_sll_out_tbl.COUNT));
1447   -----errorout_ad('Create_Stream_Level = ' || x_return_status);
1448 
1449  IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1450    fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.line_sll',
1451                        'Create_Stream_Level(x_return_status = '||x_return_status
1452                        ||', l_sll_out_tbl count = '||l_sll_out_tbl.count||')');
1453  END IF;
1454 
1455  IF x_return_status <> 'S' THEN
1456     RAISE G_EXCEPTION_HALT_VALIDATION;
1457   END IF;
1458 
1459   ----if l_sll_out_tbl.count > 0 then insert lines into oks_level_elements
1460   IF l_sll_out_tbl.count <= 0 THEN
1461      -----errorout_ad('sll  count = ' || to_char(0));
1462      x_return_status := 'E';
1463      RAISE G_EXCEPTION_HALT_VALIDATION;
1464   END IF;
1465 
1466   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1467 
1468    fnd_log.STRING (fnd_log.level_statement,
1469                    G_MODULE_CURRENT || '.create_bill_sch_rules.copy_flag',
1470                       'sll amt to be adjusted flag = ' || p_sll_tbl(p_sll_tbl.FIRST).comments
1471                   );
1472   END IF;
1473 
1474   ---Called from copy with flag to change lvl_amt of SLL for E and P billing type.
1475   IF p_sll_tbl(p_sll_tbl.FIRST).comments IS NOT NULL AND p_sll_tbl(p_sll_tbl.FIRST).comments = '99'
1476     AND p_billing_type IN ('E', 'P') THEN
1477 
1478     l_sll_tbl  := p_sll_tbl;
1479 
1480     for i IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
1481     LOOP
1482       l_sll_tbl(i).level_amount  := l_sll_out_tbl(i).amount;
1483       l_sll_tbl(i).comments       := '' ;
1484     END LOOP;
1485   ELSE
1486      l_sll_tbl  := p_sll_tbl;
1487   END IF;        ---chk for flag passed from copy.
1488 
1489   IF l_period_type is not null AND l_period_start is not NULL THEN
1490     OPEN l_line_amt_csr(l_Line_Csr_Rec.id);
1491     FETCH l_line_amt_csr INTO l_line_rec.line_amt;
1492     CLOSE l_line_amt_csr;
1493   END IF;
1494 
1495   --FOR subcripTion line which is terminated
1496 
1497   IF l_Line_Csr_Rec.lse_id = 46 AND l_Line_Csr_Rec.line_term_dt is not null THEN
1498 
1499      --if full credit flag is 'Y' just delete the unbilled lvl elements
1500 
1501      IF  nvl(l_Line_Csr_Rec.full_credit, 'N') = 'Y' Then
1502        DELETE FROM OKS_LEVEL_ELEMENTS
1503        WHERE date_completed IS NULL
1504        AND cle_id = l_Line_Csr_Rec.id;
1505 
1506 
1507        IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1508 
1509         fnd_log.STRING (fnd_log.level_statement,
1510                    G_MODULE_CURRENT || '.create_bill_sch_rules.del_lvl_ele',
1511                       'unbilled lvl element deleted = ' || sql%rowcount
1512                   );
1513        END IF;
1514 
1515      ELSE
1516        -------------------------------------------------------------------------
1517        -- Begin partial period computation logic
1518        -- Developer Mani Choudhary
1519        -- Date 09-MAY-2005
1520        -------------------------------------------------------------------------
1521        Create_Subcription_LvlEle
1522             (p_billing_type    =>  p_billing_type,
1523              p_sll_tbl          => l_sll_out_tbl,
1524              p_line_rec         => l_Line_rec,
1525              p_term_dt          => l_Line_Csr_Rec.line_term_dt,
1526              p_invoice_ruleid   => p_invoice_rule_id,
1527              p_period_start     =>  l_period_start,
1528              p_period_type      =>  l_period_type,
1529              x_return_status    => x_return_status);
1530        -------------------------------------------------------------------------
1531        -- End partial period computation logic
1532        -- Date 09-MAY-2005
1533        -------------------------------------------------------------------------
1534 
1535        -----errorout_ad('Create_Subcription_LvlEle status = ' || x_return_status);
1536 
1537        IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1538            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.lvl_ele',
1539                        'Create_Subcription_LvlEle(x_return_status = '||x_return_status
1540                        ||', l_sll_out_tbl passed = '||l_sll_out_tbl.count||')');
1541        END IF;
1542 
1543        IF x_return_status <> 'S' THEN
1544           RAISE G_EXCEPTION_HALT_VALIDATION;
1545        END IF;
1546      END IF;     ---chk for full credit
1547      RETURN;
1548 
1549   END IF;      ---chk for terminated subscription line
1550 
1551   --for billing type 'P' , terminated sub line with full credit 'Y' change the term dt to
1552   --its start dt.(as this API is also called for subline from form in case of 'P')
1553 
1554   IF p_billing_type = 'P' and l_Line_Csr_Rec.lse_id NOT IN (1, 12, 14, 19)
1555      AND l_line_csr_rec.line_term_dt IS NOT NULL AND nvl(l_line_csr_rec.full_credit, 'N') = 'Y' THEN
1556 
1557      l_line_term_dt :=  l_line_csr_rec.line_start_dt;
1558   ELSE
1559      l_line_term_dt := l_line_csr_rec.line_term_dt;
1560   END IF;         --chk for subline,billing type 'P' with full credit flag 'Y'
1561 
1562   ---for all other cases and also lse_id = 46 and not terminated.
1563  -------------------------------------------------------------------------
1564  -- Begin partial period computation logic
1565  -- Developer Mani Choudhary
1566  -- Date 09-MAY-2005
1567  -- Added two new parameters p_period_start and p_period_type
1568  -------------------------------------------------------------------------
1569   Create_Level_elements
1570        (p_billing_type     => p_billing_type,
1571         p_sll_tbl          => l_sll_out_tbl,
1572         p_line_rec         => l_Line_rec,
1573         p_invoice_ruleid   => p_invoice_rule_id,
1574         p_term_dt          => l_line_term_dt,
1575         p_period_start     =>  l_period_start,
1576         p_period_type      =>  l_period_type,
1577         x_return_status    => x_return_status);
1578 
1579    -----errorout_ad('Create_Level_elements status = ' || x_return_status);
1580 
1581    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1582            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.lvl_ele',
1583                        'Create_Level_elements(x_return_status = '||x_return_status
1584                        ||', term dt passed = ' || l_line_term_dt
1585                        ||', l_sll_out_tbl passed = '||l_sll_out_tbl.count||')');
1586    END IF;
1587 
1588    IF x_return_status <> 'S' THEN
1589      RAISE G_EXCEPTION_HALT_VALIDATION;
1590    END IF;
1591 
1592     l_top_bs_tbl.DELETE;
1593     l_index := 0;
1594     IF p_billing_type IN ('T','E') and l_Line_Csr_Rec.lse_id IN (1, 12, 14, 19) then       ---only for top line
1595        l_index := l_index +1;
1596 
1597        ---fecthing from db because if line is partially billed then billed lvl ele
1598        --don't get inserted again. for rollup amt all the lvl ele required.
1599 
1600        FOR l_line_BS_rec IN l_line_BS_csr(l_line_csr_rec.id)
1601        loop
1602           l_top_bs_tbl(l_index).id                     := l_line_BS_rec.id;
1603           l_top_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
1604           l_top_bs_tbl(l_index).date_end               := l_line_BS_rec.date_end;
1605           l_top_bs_tbl(l_index).Amount                 := 0;
1606           l_top_bs_tbl(l_index).object_version_number  := l_line_BS_rec.object_version_number;
1607           l_top_bs_tbl(l_index).date_transaction       := l_line_BS_rec.date_transaction;
1608           l_top_bs_tbl(l_index).date_to_interface      := l_line_BS_rec.date_to_interface;
1609 
1610 
1611           l_index := l_index + 1;
1612           -------errorout_ad('l_top_bs_tbl count = ' || l_top_bs_tbl.count);
1613       END LOOP;
1614 
1615       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1616 
1617         fnd_log.STRING (fnd_log.level_statement,
1618                    G_MODULE_CURRENT || '.create_bill_sch_rules.top_bs_count',
1619                       'l_top_bs_tblcount = ' || l_top_bs_tbl.count
1620                   );
1621        END IF;
1622     END IF;        --end of top line with billing 'E','T'
1623 
1624   --if schedule is for top level line then find sub line and repeat THE process.
1625   IF l_Line_Rec.chr_id is not null AND l_Line_Rec.lse_id IN (1, 12, 14, 19) then
1626 
1627      FOR l_SubLine_csr_rec IN l_SubLine_Csr(l_Line_Rec.id,l_Line_Rec.lse_id)
1628      LOOP
1629 
1630          l_cp_rec.cp_id          :=  l_SubLine_Csr_rec.subline_id ;
1631          l_cp_rec.cp_start_dt    :=  l_SubLine_Csr_rec.cp_start_dt;
1632          l_cp_rec.cp_end_dt      :=  l_SubLine_Csr_rec.cp_end_dt ;
1633          l_cp_rec.cp_amt         :=  l_SubLine_Csr_rec.subline_amt ;
1634          l_cp_rec.dnz_chr_id     :=  l_subline_csr_rec.dnz_chr_id;
1635          l_cp_rec.cp_price_uom   :=  l_subline_csr_rec.price_uom;
1636          l_cp_rec.cp_lse_id      :=  l_subline_csr_rec.cp_lse_id;
1637 
1638 
1639         IF l_period_type is not null AND l_period_start is not NULL THEN
1640           OPEN l_line_amt_csr(l_SubLine_Csr_rec.subline_id);
1641           FETCH l_line_amt_csr INTO l_cp_rec.cp_amt;
1642           CLOSE l_line_amt_csr;
1643         END IF;
1644          -----errorout_ad('_cp_rec.cp_id = ' || l_cp_rec.cp_id);
1645 
1646          ---if subline is terminated with full credit then pass
1647          ---term date to bill_sch_cp as cp start date so that
1648          --level element doesn't get created.
1649 
1650          IF l_subline_csr_rec.cp_term_dt IS NOT NULL AND
1651             nvl(l_subline_csr_rec.full_credit,'N') = 'Y' THEN
1652 
1653             l_cp_term_dt := l_subline_csr_rec.cp_start_dt;
1654          else
1655             l_cp_term_dt := l_subline_csr_rec.cp_term_dt;
1656          END IF;         ---end of full credit chk
1657 
1658          IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1659 
1660                 fnd_log.STRING (fnd_log.level_statement,
1661                    G_MODULE_CURRENT || '.create_bill_sch_rules.cp_dtls',
1662                       'l_cp_term_dt = ' || l_cp_term_dt
1663                    || ', id = ' || l_cp_rec.cp_id
1664                    || ', lse_id = ' || l_line_rec.lse_id
1665                    || ', start dt = ' || l_cp_rec.cp_start_dt
1666                    || ', end dt = ' || l_cp_rec.cp_end_dt
1667                    || ', amt = ' || l_cp_rec.cp_amt
1668                    || ', full_credit flag = ' || l_subline_csr_rec.full_credit
1669                    || ', cp bill type = ' || l_subline_csr_rec.billing_schedule_type
1670                   );
1671         END IF;
1672 
1673         ----if schedule type is P then create sub lines  only if effectivity is same
1674         ---- and sll count for the subline is 0.
1675 
1676 
1677         if p_billing_type = 'P' then
1678 
1679           l_sll_count := Find_Sll_Count(l_subline_csr_rec.subline_id);
1680 
1681 
1682           ---Chk same effectivity
1683 
1684           IF TRUNC(l_line_rec.line_start_dt) = TRUNC(l_subline_csr_rec.cp_start_dt) AND
1685              TRUNC(l_line_rec.line_end_dt) = TRUNC(l_subline_csr_rec.cp_end_dt) THEN
1686 
1687              IF l_sll_count > 0 then
1688 
1689               /* check the bill type if other then 'P' then delete schedule and sLL*/
1690 
1691                ---get bill type details
1692 
1693 
1694               IF nvl(l_subline_csr_rec.billing_schedule_type,'T') <> 'P' THEN
1695                  ----if line has sll with billtype <> 'P', delete sll and level elements
1696                  --- and updates l_sll_count value as in case of 'P' Bs will be cascaded to
1697                  ---only subline with same effectivity.
1698 
1699                  Del_line_sll_lvl(p_line_id       => l_subline_csr_rec.subline_id,
1700                                  x_return_status    => x_return_status,
1701                                  x_msg_count     => l_msg_count,
1702                                  x_msg_data      => l_msg_data);
1703 
1704                 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1705                     fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.del_bs',
1706                        'Del_line_sll_lvl(x_return_status = '||x_return_status
1707                        ||', cp id passed = '||l_subline_csr_rec.subline_id ||')');
1708                 END IF;
1709 
1710 
1711                 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1712                     RAISE G_EXCEPTION_HALT_VALIDATION;
1713                 END IF;
1714                 l_sll_count := 0;
1715                END IF;       ---existing bill type <> 'P'
1716              END IF;       --sll count > 0
1717 
1718              IF l_sll_count = 0 THEN
1719 
1720                   -----errorout_ad('CREATING FOR SUBLINES');
1721                   --------------------------------------------------------------------------
1722                   -- Begin partial period computation logic
1723                   -- Developer Mani Choudhary
1724                   -- Date 09-MAY-2005
1725                   -- Added two new parameters P_period_start,P_period_type in procedural call
1726                   ---------------------------------------------------------------------------
1727                   Bill_Sch_Cp(p_billing_type => p_billing_type,
1728                              p_bsll_tbl      => l_sll_tbl,
1729                              p_Line_Rec      => l_Line_Rec,
1730                              p_SubLine_rec   => l_cp_rec,
1731                              p_invoice_rulid => p_invoice_rule_id,
1732                              p_top_line_bs   => l_top_bs_tbl,
1733                              p_term_dt       => l_cp_term_dt,
1734                              p_period_start  => l_period_start,
1735                              p_period_type   => l_period_type,
1736                              x_return_status => x_return_status );
1737 
1738                   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1739                     fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.cp_bs',
1740                        'Bill_Sch_Cp(x_return_status = '||x_return_status
1741                        ||', cp id passed = '||l_subline_csr_rec.subline_id ||')');
1742                   END IF;
1743 
1744                   IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1745                     RAISE G_EXCEPTION_HALT_VALIDATION;
1746                   END IF;
1747 
1748              END IF;     --sll count=0
1749 
1750           ELSIF ( trunc(l_line_rec.line_start_dt) <> TRUNC(l_subline_csr_rec.cp_start_dt) OR
1751              TRUNC(l_line_rec.line_end_dt) <> TRUNC(l_subline_csr_rec.cp_end_dt) ) THEN  --unequal effectivity
1752 
1753              IF l_sll_count > 0 then               ---unequal effectivity, with sll count > 0
1754                /* check the bill type if other then 'P' then delete schedule and sLL*/
1755 
1756                ---get bill type details
1757 
1758 
1759                IF nvl(l_subline_csr_rec.billing_schedule_type,'T') <> 'P' THEN
1760                   ----if line has sll with billtype <> 'P', delete sll and level elements
1761 
1762                   Del_line_sll_lvl(p_line_id       => l_subline_csr_rec.subline_id,
1763                                  x_return_status    => x_return_status,
1764                                  x_msg_count     => l_msg_count,
1765                                  x_msg_data      => l_msg_data);
1766 
1767                   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1768                     fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.del_bs',
1769                        'Del_line_sll_lvl(x_return_status = '||x_return_status
1770                        ||'sll count >0 and not same effectivity'
1771                        ||', cp id passed = '||l_subline_csr_rec.subline_id ||')');
1772                   END IF;
1773 
1774 
1775                   IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1776                      RAISE G_EXCEPTION_HALT_VALIDATION;
1777                   END IF;
1778 
1779                END IF;        --- existing bill type <> P
1780 
1781              ELSE             ---unequal effectivity, with sll count = 0
1782 
1783                ----update billing type to 'P'
1784 
1785                UPDATE oks_k_lines_b
1786                SET billing_schedule_type = 'P'
1787                WHERE cle_id = l_subline_csr_rec.subline_id;
1788 
1789                IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1790                     fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.update_billtype',
1791                        'sll count >0 and not same effectivity'
1792                        || 'updated sub line billing type to P = ' || sql%rowcount
1793                      );
1794                END IF;
1795 
1796              END IF;        -------unequal effectivity sll count
1797 
1798          end if;         ---CHK FOR EQUAL EFFECTIVITY
1799 
1800        ELSE                  ---for 'E','T'
1801 
1802           IF nvl(l_subline_csr_rec.billing_schedule_type,p_billing_type) <> p_billing_type THEN
1803              ---Delete all the sll and lvl element for the sub line as billing type from
1804              ---the form can only be changed if no records are billed.
1805 
1806              DELETE FROM oks_level_elements WHERE cle_id = l_subline_csr_rec.subline_id;
1807 
1808              DELETE FROM oks_stream_levels_b WHERE cle_id = l_subline_csr_rec.subline_id;
1809           END IF;          --if sub line billing type <> p_billing_type
1810 
1811           --------------------------------------------------------------------------
1812           -- Begin partial period computation logic
1813           -- Developer Mani Choudhary
1814           -- Date 09-MAY-2005
1815           -- Added two new parameters P_period_start,P_period_type in procedural call
1816           ---------------------------------------------------------------------------
1817           Bill_Sch_Cp(p_billing_type  => p_billing_type,
1818                       p_bsll_tbl      => l_sll_tbl,
1819                       p_Line_Rec      => l_Line_Rec,
1820                       p_SubLine_rec   => l_cp_rec,
1821                       p_invoice_rulid => p_invoice_rule_id,
1822                       p_top_line_bs   => l_top_bs_tbl,
1823                       p_term_dt       => l_cp_term_dt,
1824                       p_period_start  => l_period_start,
1825                       p_period_type   => l_period_type,
1826                       x_return_status => x_return_status );
1827 
1828           IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1829                     fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.cp_bs',
1830                        'Bill_Sch_Cp(x_return_status = '||x_return_status
1831                        ||', cp id passed = '||l_subline_csr_rec.subline_id ||')');
1832           END IF;
1833 
1834            IF x_return_status <> 'S' THEN
1835              RAISE G_EXCEPTION_HALT_VALIDATION;
1836            END IF;
1837 
1838 
1839        end if;     ---chk for bill type
1840        -----errorout_ad('Bill_Sch_Cp status = ' || x_return_status);
1841 
1842 
1843 
1844    END LOOP;  ---subline loop end
1845 
1846   END IF;               ---just for top line
1847 
1848 
1849 
1850   IF l_top_bs_tbl.COUNT >0 THEN            ---only for type 'T' and  'E' l_top_bs_tbl will be having records
1851     OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
1852                p_api_version                  => l_api_version,
1853                p_init_msg_list                => l_init_msg_list,
1854                x_return_status                => x_return_status,
1855                x_msg_count                    => l_msg_count,
1856                x_msg_data                     => l_msg_data,
1857                p_letv_tbl                     => l_top_bs_tbl,
1858                x_letv_tbl                     => l_lvl_ele_tbl_out);
1859 
1860    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
1861                     fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_rules.update_top_bs',
1862                        'OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(x_return_status = '||x_return_status
1863                        ||', tbl count = '||l_lvl_ele_tbl_out.count ||')');
1864    END IF;
1865 
1866     IF  x_return_status <> 'S' THEN
1867       RAISE G_EXCEPTION_HALT_VALIDATION;
1868     END IF;
1869   END IF;        ---l_top_bs_tbl count chk
1870 
1871 
1872 
1873 EXCEPTION
1874  WHEN G_EXCEPTION_HALT_VALIDATION THEN
1875 
1876   IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
1877         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_bill_sch_rules.EXCEPTION',
1878                     'G_EXCEPTION_HALT_VALIDATION');
1879   END IF;
1880 
1881   l_currency_code := NULL;
1882   l_header_billing := NULL;
1883 
1884  WHEN OTHERS THEN
1885 
1886    IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
1887         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_bill_sch_rules.UNEXPECTED',
1888                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
1889    END IF;
1890    OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
1891                        p_msg_name     => G_UNEXPECTED_ERROR,
1892                        p_token1       => G_SQLCODE_TOKEN,
1893                        p_token1_value => sqlcode,
1894                        p_token2       => G_SQLERRM_TOKEN,
1895                        p_token2_value => sqlerrm);
1896 
1897    x_return_status := G_RET_STS_UNEXP_ERROR;
1898 
1899 
1900 END Create_Bill_Sch_Rules;
1901 
1902 
1903  --------------------------------------------------------------------------
1904  -- Begin partial period computation logic
1905  -- Developer Mani Choudhary
1906  -- Date 09-MAY-2005
1907  -- Added two new parameters P_period_start,P_period_type in procedural call
1908  ---------------------------------------------------------------------------
1909 Procedure Create_Stream_Level
1910 (     p_billing_type              IN    VARCHAR2
1911 ,     p_strm_lvl_tbl              IN    StreamLvl_tbl
1912 ,     p_dnz_chr_id                IN    NUMBER
1913 ,     p_subline_call              IN    VARCHAR2
1914 ,     p_line_amt                  IN    NUMBER
1915 ,     p_subline_amt               IN    NUMBER
1916 ,     p_sll_start_dt              IN    DATE
1917 ,     p_end_dt                    IN    DATE
1918 ,     p_period_start              IN    VARCHAR2
1919 ,     p_period_type               IN    VARCHAR2
1920 ,     x_sll_out_tbl               OUT   NOCOPY StrmLvl_Out_tbl
1921 ,     x_return_status             OUT   NOCOPY Varchar2
1922 )
1923 Is
1924 
1925 CURSOR l_subline_sll_csr(p_seq_no NUMBER, p_line_id NUMBER) IS
1926        SELECT id , object_version_number FROM oks_stream_levels_b
1927        WHERE sequence_no = p_seq_no
1928        AND cle_id = p_line_id;
1929 
1930 l_subline_sll_rec   l_subline_sll_csr%ROWTYPE;
1931 l_sll_prorate_tbl        sll_prorated_tab_type;
1932 
1933 l_tbl_count         NUMBER;
1934 l_sll_id           NUMBER;
1935 l_start_date         DATE;
1936 l_end_date          DATE;
1937 l_subline_sll       NUMBER;
1938 l_rul_status        VARCHAR2(100);
1939 l_msg_count         NUMBER;
1940 l_msg_data          VARCHAR2(2000);
1941 l_init_msg_list     VARCHAR2(2000) := OKC_API.G_FALSE;
1942 l_sll_amount        VARCHAR2(450);
1943 l_amount            NUMBER;
1944 l_tot_amt           NUMBER;
1945 l_prior_index       NUMBER;
1946 l_line_amt          NUMBER;
1947 l_obj_version       NUMBER;
1948 l_uom_quantity      NUMBER;
1949 l_tce_code          VARCHAR2(30);
1950 
1951 --Bug Fix 5185658
1952 
1953     Cursor get_lse_id_csr(p_cle_id number ) IS
1954     select lse_id
1955     from okc_k_lines_b
1956     where id = p_cle_id;
1957 
1958     l_lse_id number;
1959 
1960 --End Bug Fix 5185658
1961 
1962 BEGIN
1963 
1964 /* In sll creation amount will be prorated for 'E' and 'P' type for subline
1965 and top lines in case of hdr billing*/
1966 
1967 ------count the table of records and in for loop create records 'SLL'
1968 --p_subline call can have 3 values Y for sub line, N - top line, H - header
1969 
1970 -----errorout_ad('p_subline_call = ' || p_subline_call);
1971 
1972 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1973 
1974         fnd_log.STRING (fnd_log.level_statement,
1975                    G_MODULE_CURRENT || '.create_stream_level.called',
1976                       ' p_subline_call = ' || p_subline_call );
1977 END IF;
1978 
1979 x_return_status := 'S';
1980 
1981 If p_strm_lvl_tbl.count <= 0 THEN
1982    RAISE G_EXCEPTION_HALT_VALIDATION;
1983 END IF;
1984 
1985 
1986 IF p_billing_type <> 'T' THEN
1987 
1988     IF l_header_billing IS NOT NULL and p_subline_call = 'Y' THEN             ---sub line and hdr billing
1989        l_tot_amt  := Cal_hdr_Amount(l_header_billing);
1990 
1991     ELSIF l_header_billing IS NULL and p_subline_call = 'Y' THEN          --sub line and not hdr billing
1992 
1993        l_tot_amt := P_Line_Amt;                 ---USED IN CAL AMT FOR E and P
1994 
1995     ELSIF l_header_billing IS NOT NULL AND p_subline_call = 'N' THEN     ---top line
1996 
1997        l_tot_amt  := Cal_hdr_Amount(l_header_billing);
1998        l_line_amt := p_line_amt;
1999     END IF;   --chk for hdr billing and if called fro line/subline
2000 
2001 END IF;   --end of p_billing_type <> 'T'
2002 
2003 --Bug Fix 5185658
2004 
2005 -- Bug fix for 5325152
2006 --changed the idnex from 1 to p_strm_lvl_tbl.FIRST
2007 open get_lse_id_csr (p_strm_lvl_tbl(p_strm_lvl_tbl.FIRST).cle_id);
2008 Fetch get_lse_id_csr into l_lse_id;
2009 Close get_lse_id_csr;
2010 
2011 --End Bug Fix 5185658
2012 
2013 
2014 FOR l_tbl_count IN p_strm_lvl_tbl.First .. p_strm_lvl_tbl.LAST
2015 LOOP
2016 
2017    l_strm_lvl_tbl_in.DELETE;
2018    l_obj_version := NULL;
2019 
2020    IF p_subline_call IN ('N','H') THEN           ---if it is for top line/hdr
2021       IF p_billing_type = 'T' THEN
2022          l_sll_amount := NULL;
2023       ELSIF l_header_billing IS NOT NULL AND p_subline_call = 'N' THEN     --Top line in case of hdr billing
2024 
2025         IF  l_tot_amt = 0 or l_tot_amt IS NULL THEN
2026            l_amount := (l_Line_amt * p_strm_lvl_tbl(l_tbl_count).level_amount)/1;
2027         ELSE
2028            l_amount := (l_line_amt * p_strm_lvl_tbl(l_tbl_count).level_amount)/l_tot_amt;
2029         END IF;
2030 
2031         l_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_amount, l_currency_code);
2032 
2033       ELSE      ---caled for header or top ine in case of not hdr billing.
2034         l_sll_amount := p_strm_lvl_tbl(l_tbl_count).level_amount;
2035       END IF;
2036 
2037 
2038       IF l_header_billing IS NOT NULL AND p_subline_call <> 'H' THEN
2039         -----errorout_ad('p_subline_call <> H');
2040         l_sll_id := NULL;
2041       ELSE
2042 
2043         IF p_strm_lvl_tbl(l_tbl_count).Id IS NULL THEN                ---------FOR INSERT
2044           -----errorout_ad('null sll id');
2045           l_sll_id := NULL;
2046         ELSE                      --------FOR UPDATE
2047           -----errorout_ad('sll_id = ' || p_strm_lvl_tbl(l_tbl_count).Id);
2048           l_obj_version := chk_Sll_Exists(p_strm_lvl_tbl(l_tbl_count).Id);
2049           IF l_obj_version IS NOT NULL THEN
2050              l_sll_id := p_strm_lvl_tbl(l_tbl_count).Id;
2051           ELSE
2052              l_sll_id := null;
2053           END IF;
2054         END IF;
2055       END IF;
2056 
2057     ELSE          --CALLED FROM SUB LINE PROCEDURE
2058       IF p_billing_type = 'T' THEN
2059         l_sll_amount := NULL;
2060       ELSE
2061                                      ------FOR E and P
2062         IF  l_tot_amt = 0 or l_tot_amt IS NULL THEN
2063            l_amount := (p_SubLine_amt * p_strm_lvl_tbl(l_tbl_count).level_amount)/1;
2064         ELSE
2065            l_amount := (p_SubLine_amt * p_strm_lvl_tbl(l_tbl_count).level_amount)/l_tot_amt;
2066         END IF;
2067 
2068         l_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_amount, l_currency_code);
2069       END IF;
2070 
2071       IF l_header_billing IS NOT NULL AND p_subline_call <> 'H' THEN
2072          l_sll_id := NULL;
2073       ELSE
2074 
2075         IF p_strm_lvl_tbl(l_tbl_count).Id IS NULL THEN        -------FOR INSERT
2076           l_sll_id := NULL;
2077 
2078         ELSE                          ----FOR UPDATE
2079           -------FIND OUT SUBLINE sll ID FOR UPDATE MATCH THEM WITH SEQUENCE NUMBER
2080           OPEN l_subline_sll_csr(p_strm_lvl_tbl(l_tbl_count).sequence_no,p_strm_lvl_tbl(l_tbl_count).cle_id);
2081           FETCH l_subline_sll_csr INTO l_subline_sll_rec;
2082           IF l_subline_sll_csr%NOTFOUND THEN
2083             CLOSE l_subline_sll_csr;
2084             l_sll_id := NULL;
2085 
2086           ELSE
2087             CLOSE l_subline_sll_csr;
2088             l_sll_id := l_subline_sll_rec.id;
2089             l_obj_version := l_subline_sll_rec.object_version_number;
2090           END IF;
2091         END IF;                 ---------INSERT/UPDATE IF
2092 
2093       END IF;                -----l_header_billing IS NOT NULL AND p_subline_call <> 'H'
2094 
2095 
2096     END IF;           ------------LINE/SUBLINE IF
2097 
2098     -----errorout_ad('l_sll_id = ' || l_sll_id);
2099     -----errorout_ad('l_tbl_count = ' || l_tbl_count || 'and first sll index = ' ||  p_strm_lvl_tbl.First);
2100 
2101     IF l_tbl_count = p_strm_lvl_tbl.First THEN
2102        l_start_date := p_sll_start_dt;
2103 
2104     ELSE
2105 
2106        l_start_date :=  x_sll_out_tbl(l_tbl_count - 1).end_date + 1;
2107 
2108     END IF;
2109     -----errorout_ad('for SLL LINE : ' || TO_CHAR(l_tbl_count) || ' --DATE_START = ' || TO_DATE(l_next_date));
2110 
2111     -------------------------------------------------------------------------
2112     -- Begin partial period computation logic
2113     -- Developer Mani Choudhary
2114     -- Date 09-MAY-2005
2115     -- In case of calendar start , call the new funtion to derive the SLL end date
2116     -------------------------------------------------------------------------
2117     OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
2118                     (p_timeunit      => p_strm_lvl_tbl(l_tbl_count).uom_code,
2119                      x_return_status => x_return_status,
2120                      x_quantity      => l_uom_quantity ,
2121                      x_timeunit      => l_tce_code);
2122     IF x_return_status <> 'S' THEN
2123       RAISE G_EXCEPTION_HALT_VALIDATION;
2124     END IF;
2125 
2126 
2127     IF p_period_start is not null        AND
2128        p_period_type is not null         AND
2129        p_period_start = 'CALENDAR'       AND
2130        l_tce_code not in ('DAY','HOUR','MINUTE')
2131     THEN
2132        l_end_date := OKS_BILL_UTIL_PUB.get_enddate_cal
2133                             (l_start_date,
2134                              p_strm_lvl_tbl(l_tbl_count).uom_code,
2135                              p_strm_lvl_tbl(l_tbl_count).uom_per_period,
2136                              p_strm_lvl_tbl(l_tbl_count).level_periods);
2137 
2138     ELSE
2139         --Existing Logic for calculating SLL end date
2140 
2141        l_end_date := OKC_TIME_UTIL_PUB.get_enddate(
2142                       l_start_date,
2143                       p_strm_lvl_tbl(l_tbl_count).uom_code,
2144                      (p_strm_lvl_tbl(l_tbl_count).level_periods * p_strm_lvl_tbl(l_tbl_count).uom_per_period));
2145 
2146     /* Added for bug 13799709*/
2147       IF (l_end_date > p_end_dt AND p_period_start is null  AND  p_period_type is null) THEN
2148 
2149         l_end_date := p_end_dt;
2150 
2151     END IF;
2152     /* Added for bug 13799709*/
2153 
2154     END IF;
2155        --If the sll end date and line end date  falls in the same month and
2156        --sll end date >  line end date , then assign line end date to sll emd date
2157     IF (l_end_date > p_end_dt AND p_period_start is not null
2158         AND  p_period_type is not null) THEN
2159 
2160         l_end_date := p_end_dt;
2161 
2162     END IF;
2163 
2164     -------------------------------------------------------------------------
2165     -- End partial period computation logic
2166     -- Date 09-MAY-2005
2167     -------------------------------------------------------------------------
2168     l_strm_lvl_tbl_in(1).chr_id                   :=  p_strm_lvl_tbl(l_tbl_count).chr_id;
2169     l_strm_lvl_tbl_in(1).cle_id                   :=  p_strm_lvl_tbl(l_tbl_count).cle_id;
2170     l_strm_lvl_tbl_in(1).dnz_chr_id               :=  p_dnz_chr_id;
2171     l_strm_lvl_tbl_in(1).sequence_no              :=  p_strm_lvl_tbl(l_tbl_count).sequence_no ;
2172 
2173     l_strm_lvl_tbl_in(1).start_date               :=  l_start_date;
2174     l_strm_lvl_tbl_in(1).end_date                 :=  l_end_date;
2175 
2176     l_strm_lvl_tbl_in(1).level_amount             :=  l_sll_amount;
2177     l_strm_lvl_tbl_in(1).invoice_offset_days      :=  p_strm_lvl_tbl(l_tbl_count).invoice_offset_days;
2178     l_strm_lvl_tbl_in(1).interface_offset_days    :=  p_strm_lvl_tbl(l_tbl_count).interface_offset_days;
2179 
2180 
2181     l_strm_lvl_tbl_in(1).object_version_number     := OKC_API.G_MISS_NUM;
2182     l_strm_lvl_tbl_in(1).created_by                := OKC_API.G_MISS_NUM;
2183     l_strm_lvl_tbl_in(1).creation_date             := SYSDATE;
2184     l_strm_lvl_tbl_in(1).last_updated_by           := OKC_API.G_MISS_NUM;
2185     l_strm_lvl_tbl_in(1).last_update_date           := SYSDATE;
2186 
2187 
2188 
2189       l_strm_lvl_tbl_in(1).level_periods            :=  p_strm_lvl_tbl(l_tbl_count).level_periods;
2190       l_strm_lvl_tbl_in(1).uom_per_period           :=  p_strm_lvl_tbl(l_tbl_count).uom_per_period;
2191       l_strm_lvl_tbl_in(1).uom_code                 :=  p_strm_lvl_tbl(l_tbl_count).uom_code;
2192 
2193 
2194     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2195 
2196      fnd_log.STRING (fnd_log.level_statement,
2197                    G_MODULE_CURRENT || '.create_stream_level.sll_dtls',
2198                       ' line id = ' || l_strm_lvl_tbl_in(1).cle_id
2199                    || ', chr_id = ' || l_strm_lvl_tbl_in(1).chr_id
2200                    || ', start date = ' || l_strm_lvl_tbl_in(1).start_date
2201                    || ', end date = ' || l_strm_lvl_tbl_in(1).end_date
2202                    || ', amount = ' || l_strm_lvl_tbl_in(1).level_amount
2203                    || ', period = ' || l_strm_lvl_tbl_in(1).level_periods
2204                    || ', uom_per_period = ' || l_strm_lvl_tbl_in(1).uom_per_period
2205                    || ', uom = ' || l_strm_lvl_tbl_in(1).uom_code
2206                    || ', sequence = ' || l_strm_lvl_tbl_in(1).sequence_no
2207                    || ', inv-interface offset = ' || l_strm_lvl_tbl_in(1).invoice_offset_days
2208                    || ', ' || l_strm_lvl_tbl_in(1).interface_offset_days
2209                   );
2210     END IF;
2211 
2212     IF (l_sll_id IS NULL) THEN
2213 
2214        OKS_SLL_PVT.insert_row(
2215                p_api_version        => l_api_version,
2216                p_init_msg_list      => l_init_msg_list,
2217                x_return_status      => x_return_status,
2218                x_msg_count          => l_msg_count,
2219                x_msg_data           => l_msg_data,
2220                p_sllv_tbl           => l_strm_lvl_tbl_in,
2221                x_sllv_tbl           => l_strm_lvl_tbl_out);
2222 
2223        IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2224          fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.insert',
2225                       'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
2226                       ||', sll id created = '||l_strm_lvl_tbl_out(1).id ||')');
2227        END IF;
2228 
2229       -----errorout_ad('SllCREATED : '|| x_return_status);
2230       -----errorout_ad('sll id = ' || l_strm_lvl_tbl_in(1));
2231 
2232 
2233       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2234                 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2235       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2236                 RAISE OKC_API.G_EXCEPTION_ERROR;
2237       END IF;
2238 
2239     ELSE            --sll id not null
2240       l_strm_lvl_tbl_in(1).id                           := l_sll_id;
2241       l_strm_lvl_tbl_in(1).object_version_number        := l_obj_version;
2242 
2243       OKS_SLL_PVT.update_row(
2244                p_api_version        => l_api_version,
2245                p_init_msg_list      => l_init_msg_list,
2246                x_return_status      => x_return_status,
2247                x_msg_count          => l_msg_count,
2248                x_msg_data           => l_msg_data,
2249                p_sllv_tbl           => l_strm_lvl_tbl_in,
2250                x_sllv_tbl           => l_strm_lvl_tbl_out);
2251 
2252        IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2253          fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.update',
2254                       'OKS_SLL_PVT.update_row(x_return_status = '||x_return_status
2255                       ||', sll id updated = '||l_strm_lvl_tbl_out(1).id ||')');
2256        END IF;
2257 
2258       -----errorout_ad('STREAM LEVEL RULE updated : '|| x_return_status);
2259 
2260 
2261       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2262         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2263       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2264         RAISE OKC_API.G_EXCEPTION_ERROR;
2265       END IF;
2266 
2267     END IF;
2268 
2269     x_sll_out_tbl(l_tbl_count).chr_Id                := l_strm_lvl_tbl_out(1).chr_id;
2270     x_sll_out_tbl(l_tbl_count).cle_Id                := l_strm_lvl_tbl_out(1).cle_id;
2271     x_sll_out_tbl(l_tbl_count).dnz_chr_Id            := l_strm_lvl_tbl_out(1).dnz_chr_id;
2272     x_sll_out_tbl(l_tbl_count).Id                    := l_strm_lvl_tbl_out(1).id;
2273     x_sll_out_tbl(l_tbl_count).Seq_no                := l_strm_lvl_tbl_out(1).sequence_no;
2274     x_sll_out_tbl(l_tbl_count).Dt_start              := l_strm_lvl_tbl_out(1).start_date;
2275     x_sll_out_tbl(l_tbl_count).end_date              := l_strm_lvl_tbl_out(1).end_date;
2276     x_sll_out_tbl(l_tbl_count).Level_Period          := l_strm_lvl_tbl_out(1).level_periods;
2277     x_sll_out_tbl(l_tbl_count).uom_Per_Period        := l_strm_lvl_tbl_out(1).uom_per_period;
2278     x_sll_out_tbl(l_tbl_count).uom                   := l_strm_lvl_tbl_out(1).uom_code;
2279     x_sll_out_tbl(l_tbl_count).Amount                := l_strm_lvl_tbl_out(1).level_amount;
2280     x_sll_out_tbl(l_tbl_count).invoice_offset_days    := l_strm_lvl_tbl_out(1).invoice_offset_days;
2281     x_sll_out_tbl(l_tbl_count).Interface_offset_days := l_strm_lvl_tbl_out(1).interface_offset_days;
2282 
2283     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2284 
2285      fnd_log.STRING (fnd_log.level_statement,
2286                    G_MODULE_CURRENT || '.create_stream_level.top_sll_dtls',
2287                       ' sll id = ' || x_sll_out_tbl(l_tbl_count).Id
2288                    || ', start date = ' || x_sll_out_tbl(l_tbl_count).Dt_start
2289                   );
2290     END IF;
2291 
2292 End Loop;
2293 
2294 --Bug Fix 5185658
2295 
2296 --IF p_billing_type IN ('P','E') AND p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments IS NOT NULL AND
2297 --     p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments = '99' AND p_subline_call = 'N' THEN
2298 
2299      IF (
2300           p_billing_type IN ('P','E') AND p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments IS NOT NULL AND
2301           p_strm_lvl_tbl(p_strm_lvl_tbl.first).comments = '99' AND p_subline_call = 'N'
2302         )
2303         OR
2304         (
2305           l_lse_id = 46 AND p_period_start = 'SERVICE' AND p_billing_type = 'E' AND nvl(pkg_cascade_billing_hdr, 'N') = 'Y'
2306         )
2307     THEN
2308 
2309 --End Bug Fix 5185658
2310 
2311      l_sll_prorate_tbl.DELETE;
2312 
2313      FOR l_index IN x_sll_out_tbl.FIRST .. x_sll_out_tbl.LAST
2314      LOOP
2315        l_sll_prorate_tbl(l_index).sll_seq_num := l_index;
2316        l_sll_prorate_tbl(l_index).sll_start_date := x_sll_out_tbl(l_index).Dt_start;
2317        l_sll_prorate_tbl(l_index).sll_end_date   := x_sll_out_tbl(l_index).end_Date;
2318        l_sll_prorate_tbl(l_index).sll_tuom       := x_sll_out_tbl(l_index).uom;
2319        l_sll_prorate_tbl(l_index).sll_period     := x_sll_out_tbl(l_index).level_period;
2320        --03-NOV-2005-mchoudha-Fix for bug#4691026
2321        l_sll_prorate_tbl(l_index).sll_uom_per_period  := x_sll_out_tbl(l_index).uom_per_period;
2322      END LOOP;
2323 
2324 
2325      Calculate_sll_amount(
2326                       p_api_version      => l_api_version,
2327                       p_total_amount     => p_line_amt,
2328                       p_currency_code    => l_currency_code,
2329                       p_period_start     => p_period_start,
2330                       p_period_type      => p_period_type,
2331                       p_sll_prorated_tab => l_sll_prorate_tbl,
2332                       x_return_status    => x_return_status);
2333 
2334     IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2335          fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_stream_level.prorate',
2336                       'Calculate_sll_amount(x_return_status = '||x_return_status
2337                       ||', l_sll_prorate_tbl count = '|| l_sll_prorate_tbl.count ||')');
2338     END IF;
2339 
2340 
2341     -----errorout_ad  ('Get_sll_amount STATUS = ' ||  x_return_status);
2342 
2343 
2344     IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2345        RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2346     ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2347        RAISE OKC_API.G_EXCEPTION_ERROR;
2348     END IF;
2349 
2350     FOR l_index IN l_sll_prorate_tbl.FIRST .. l_sll_prorate_tbl.LAST
2351     LOOP
2352       UPDATE oks_stream_levels_b
2353       Set level_amount = l_sll_prorate_tbl(l_index).sll_amount
2354       WHERE id = x_sll_out_tbl(l_index).id;
2355 
2356       x_sll_out_tbl(l_index).amount  := l_sll_prorate_tbl(l_index).sll_amount;
2357     END LOOP;                  ---END OF UPDATE LOOP
2358 
2359 
2360 END IF;                ----end for chk if proration required for copied.
2361 
2362 
2363 EXCEPTION
2364  WHEN G_EXCEPTION_HALT_VALIDATION THEN
2365       IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
2366         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_stream_level.EXCEPTION',
2367                     'G_EXCEPTION_HALT_VALIDATION');
2368        END IF;
2369         x_return_status := 'E';
2370 
2371  WHEN OTHERS THEN
2372         IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2373           fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Create_Stream_Level.UNEXPECTED',
2374                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2375         END IF;
2376 
2377         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
2378                             p_msg_name     => G_UNEXPECTED_ERROR,
2379                             p_token1       => G_SQLCODE_TOKEN,
2380                             p_token1_value => sqlcode,
2381                             p_token2       => G_SQLERRM_TOKEN,
2382                             p_token2_value => sqlerrm);
2383 
2384         x_return_status := G_RET_STS_UNEXP_ERROR;
2385 
2386 End Create_Stream_Level;
2387 
2388 
2389 
2390 FUNCTION chk_Sll_Exists(p_id IN NUMBER) return number IS
2391 
2392 CURSOR l_sll_csr(p_sll_id NUMBER) IS
2393      SELECT id ,object_version_number
2394      FROM oks_stream_levels_b
2395      WHERE ID = p_sll_id;
2396 
2397 l_sll_rec    l_sll_csr%ROWTYPE;
2398 BEGIN
2399 
2400   IF p_id is null THEN
2401     return(null);
2402   ELSE
2403     OPEN l_sll_csr(p_id);
2404     FETCH l_sll_csr INTO l_sll_rec;
2405 
2406     IF l_sll_csr%NOTFOUND THEN
2407       CLOSE l_sll_csr;
2408       return(null);
2409     ELSE
2410       CLOSE l_sll_csr;
2411       return(l_sll_rec.object_version_number);
2412     END IF;
2413   END IF;
2414 
2415 
2416 EXCEPTION
2417     WHEN OTHERS then
2418       RETURN(null);
2419 
2420 END chk_Sll_Exists;
2421 
2422 
2423 
2424  --------------------------------------------------------------------------
2425  -- Begin partial period computation logic
2426  -- Developer Mani Choudhary
2427  -- Date 09-MAY-2005
2428  -- Added two new parameters P_period_start,P_period_type in procedural call
2429  ---------------------------------------------------------------------------
2430 PROCEDURE Bill_Sch_Cp
2431 (           p_billing_type      IN   VARCHAR2,
2432             p_bsll_tbl          IN   StreamLvl_tbl,
2433             p_Line_Rec          IN   Line_Det_Type,
2434             p_SubLine_rec       IN   Prod_Det_Type,
2435             p_invoice_rulid     IN   Number,
2436             p_top_line_bs       IN   OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
2437             p_term_dt           IN   DATE,
2438             p_period_start      IN   VARCHAR2,
2439             p_period_type       IN   VARCHAR2,
2440             x_return_status     OUT  NOCOPY Varchar2
2441 )
2442 IS
2443 
2444 Cursor l_Line_Amt_Csr(p_line_id IN NUMBER) Is
2445  SELECT (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
2446          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt
2447  FROM okc_k_lines_b line, oks_k_lines_b dtl
2448  WHERE line.id = p_line_id
2449  AND line.id = dtl.cle_id;
2450 
2451 l_cp_sll_out_tbl          StrmLvl_Out_tbl;
2452 l_cp_sll_tbl              OKS_BILL_SCH.StreamLvl_tbl;
2453 l_line_amt                NUMBER;
2454 l_subline_amt             NUMBER;
2455 
2456 BEGIN
2457 
2458 ---the procedure creates sll and level elements for subline.
2459   -----errorout_ad('in  bill_sch_cp');
2460 x_return_status := 'S';
2461 
2462 l_cp_sll_tbl := p_bsll_tbl;
2463 
2464 FOR l_index IN l_cp_sll_tbl.FIRST .. l_cp_sll_tbl.LAST
2465 LOOP
2466   l_cp_sll_tbl(l_index).cle_id := p_subline_rec.cp_id;
2467 END LOOP;
2468 
2469 UPDATE OKS_K_LINES_B SET billing_schedule_type = p_billing_type
2470 WHERE cle_id = p_subline_rec.cp_id;
2471 
2472 -----create  'SLL'RECORDS
2473 
2474  --------------------------------------------------------------------------
2475  -- Begin partial period computation logic
2476  -- Developer Mani Choudhary
2477  -- Date 09-MAY-2005
2478  -- Added two new parameters P_period_start,P_period_type in procedural call
2479  ---------------------------------------------------------------------------
2480 
2481 IF p_period_type is not null AND p_period_start is not NULL THEN
2482   OPEN l_Line_Amt_Csr(p_Line_Rec.id);
2483   FETCH l_Line_Amt_Csr INTO l_line_amt;
2484   CLOSE l_Line_Amt_Csr;
2485   OPEN l_Line_Amt_Csr(p_SubLine_rec.cp_id);
2486   FETCH l_Line_Amt_Csr INTO l_subline_amt;
2487   CLOSE l_Line_Amt_Csr;
2488 ELSE
2489   l_line_amt := p_line_Rec.line_amt;
2490   l_subline_amt := p_subline_rec.cp_amt;
2491 END IF;
2492 
2493 
2494 Create_Stream_Level
2495      (p_billing_type              =>  p_billing_type,
2496       p_strm_lvl_tbl              =>  l_cp_sll_tbl,
2497       p_subline_call              =>  'Y',
2498       p_dnz_chr_id                =>  p_line_rec.dnz_chr_id,
2499       p_line_amt                  =>  l_line_amt,
2500       p_subline_amt               =>  l_subline_amt,
2501       p_sll_start_dt              =>  p_line_rec.line_start_dt,
2502       p_end_dt                    =>  p_line_rec.line_end_dt,
2503       p_period_start              =>  p_period_start,
2504       p_period_type               =>  p_period_type,
2505       x_sll_out_tbl               =>  l_cp_sll_out_tbl,
2506       x_return_status             =>  x_return_status);
2507 
2508  -------------------------------------------------------------------------
2509  -- End partial period computation logic
2510  -- Date 09-MAY-2005
2511  -------------------------------------------------------------------------
2512 
2513 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2514            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.bill_sch_cp.sll',
2515                        'Create_Stream_Level(x_return_status = '||x_return_status
2516                        ||', l_cp_sll_out_tbl count = '|| l_cp_sll_out_tbl.count ||')');
2517 END IF;
2518 
2519 -------------errorout_ad('SLL Record FOR SUBLINE = ' || TO_CHAR(l_cp_sll_out_tbl.count));
2520 ----if l_cp_sll_out_tbl.count > 0 then insert lines into oks_level_elements_v
2521 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
2522     RAISE G_EXCEPTION_HALT_VALIDATION;
2523 END IF;
2524 
2525 
2526 
2527  -------------------------------------------------------------------------
2528  -- Begin partial period computation logic
2529  -- Developer Mani Choudhary
2530  -- Date 09-MAY-2005
2531  -- Added two new parameters p_period_start and p_period_type
2532  -------------------------------------------------------------------------
2533 Create_cp_lvl_elements(
2534             p_billing_type      =>   p_billing_type,
2535             p_cp_sll_tbl        =>   l_cp_sll_out_tbl,
2536             p_Line_Rec          =>   p_Line_Rec,
2537             p_SubLine_rec       =>   p_SubLine_rec,
2538             p_invoice_rulid     =>   p_invoice_rulid,
2539             p_top_line_bs       =>   p_top_line_bs,
2540             p_term_dt           =>   p_term_dt,
2541             p_period_start      =>   p_period_start,
2542             p_period_type       =>   p_period_type,
2543             x_return_status     =>   x_return_status);
2544 
2545 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
2546            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.bill_sch_cp.lvl_ele',
2547                        'Create_cp_lvl_elements(x_return_status = '||x_return_status
2548                        ||', p_term_dt passed = '|| p_term_dt ||')');
2549 END IF;
2550 
2551  IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
2552     RAISE G_EXCEPTION_HALT_VALIDATION;
2553  END IF;
2554 
2555 EXCEPTION
2556  WHEN G_EXCEPTION_HALT_VALIDATION THEN
2557       IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
2558         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.bill_sch_cp.EXCEPTION',
2559                     'G_EXCEPTION_HALT_VALIDATION');
2560        END IF;
2561 
2562       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
2563         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
2564       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
2565         RAISE OKC_API.G_EXCEPTION_ERROR;
2566       END IF;
2567  WHEN OTHERS THEN
2568 
2569      IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2570         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.bill_sch_Cp.UNEXPECTED',
2571                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2572       END IF;
2573 
2574       OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
2575                             p_msg_name     => G_UNEXPECTED_ERROR,
2576                             p_token1       => G_SQLCODE_TOKEN,
2577                             p_token1_value => sqlcode,
2578                             p_token2       => G_SQLERRM_TOKEN,
2579                             p_token2_value => sqlerrm);
2580 
2581         x_return_status := G_RET_STS_UNEXP_ERROR;
2582 END Bill_Sch_Cp;
2583 
2584 
2585 
2586 PROCEDURE Copy_Bill_Sch
2587 (
2588            p_chr_id         IN    Number,
2589            p_cle_id         IN    Number,
2590            x_copy_bill_sch  OUT   NOCOPY ItemBillSch_tbl,
2591            x_return_status  OUT   NOCOPY Varchar2
2592 )
2593 IS
2594   Cursor l_LineSch_Csr is
2595                      SELECT sll.sequence_no,element.cle_id,
2596                             element.sequence_number, element.date_transaction,
2597                             element.date_start, element.date_to_interface,
2598                             element.date_completed, element.amount,element.date_end,
2599                             element.rul_id
2600                             FROM oks_level_elements element, oks_stream_levels_b sll
2601                             WHERE sll.id  = element.rul_id
2602                             AND sll.cle_id = p_cle_id
2603                             ORDER BY sll.sequence_no,to_number(element.sequence_number);
2604 
2605   Cursor l_ContractSch_Csr Is
2606                      SELECT sll.sequence_no,sll.chr_id,
2607                             element.sequence_number, element.date_transaction,
2608                             element.date_start, element.date_to_interface,
2609                             element.date_completed, element.amount, element.date_end,
2610                             element.rul_id
2611                             FROM oks_level_elements element, oks_stream_levels_b sll
2612                             WHERE sll.id  = element.rul_id
2613                             AND sll.chr_id = p_chr_id
2614                             ORDER BY sll.sequence_no,to_number(element.sequence_number);
2615 
2616 
2617   l_LineSch_rec           l_LineSch_Csr%ROWTYPE;
2618   l_ContractSch_rec       l_ContractSch_Csr%ROWTYPE;
2619   i                       number;
2620 
2621 BEGIN
2622 /* query the records from db for a line or contract and pass then in tbl format to form*/
2623 
2624      -----errorout_ad('Copy_Bill_Sch START');
2625 x_return_status := 'S';
2626 
2627    IF p_chr_id IS NULL and p_cle_id IS NOT NULL THEN         --for line
2628      i := 1;
2629 
2630      FOR l_LineSch_rec IN l_LineSch_csr
2631      LOOP
2632        x_copy_bill_sch(i).Chr_Id                :=  NULL;
2633        x_copy_bill_sch(i).Cle_Id                :=  l_LineSch_rec.Cle_Id;
2634        x_copy_bill_sch(i).Strm_Lvl_Seq_Num      :=  l_LineSch_rec.sequence_no;
2635        x_copy_bill_sch(i).Lvl_Element_Seq_Num   :=  l_LineSch_rec.sequence_number;
2636        x_copy_bill_sch(i).Tx_Date               :=  l_LineSch_rec.date_transaction;
2637        x_copy_bill_sch(i).Bill_From_Date        :=  l_LineSch_rec.date_start;
2638        x_copy_bill_sch(i).Bill_to_Date          :=  l_LineSch_rec.date_end;
2639        x_copy_bill_sch(i).Interface_Date        :=  l_LineSch_rec.date_to_interface;
2640        x_copy_bill_sch(i).Date_Completed        :=  l_LineSch_rec.date_completed;
2641        x_copy_bill_sch(i).Amount                :=  l_LineSch_rec.amount;
2642        x_copy_bill_sch(i).Rule_Id               :=  l_LineSch_rec.rul_id;
2643 
2644 
2645        i := i + 1;
2646      END LOOP;
2647 
2648 
2649 
2650    ELSE             ---for contract
2651      i := 1;
2652      FOR l_ContractSch_rec IN l_ContractSch_Csr
2653      LOOP
2654 
2655        x_copy_bill_sch(i).Chr_Id                :=  l_ContractSch_rec.Chr_Id;
2656        x_copy_bill_sch(i).Strm_Lvl_Seq_Num      :=  l_ContractSch_rec.sequence_no;
2657        x_copy_bill_sch(i).Lvl_Element_Seq_Num   :=  l_ContractSch_rec.sequence_number;
2658        x_copy_bill_sch(i).Tx_Date               :=  l_ContractSch_rec.date_transaction;
2659        x_copy_bill_sch(i).Bill_From_Date        :=  l_ContractSch_rec.date_start;
2660        x_copy_bill_sch(i).Bill_to_Date          :=  l_contractsch_rec.date_end;
2661        x_copy_bill_sch(i).Interface_Date        :=  l_ContractSch_rec.date_to_interface;
2662        x_copy_bill_sch(i).Date_Completed        :=  l_ContractSch_rec.date_completed;
2663        x_copy_bill_sch(i).Amount                :=  l_ContractSch_rec.amount;
2664        x_copy_bill_sch(i).Rule_Id               :=  l_ContractSch_rec.rul_id;
2665 
2666 
2667        i := i + 1;
2668      END LOOP;
2669 
2670   END IF;            ---chk for line/subline
2671 
2672   l_currency_code := NULL;
2673   l_header_billing := NULL;
2674 
2675 EXCEPTION
2676  WHEN OTHERS THEN
2677        x_return_status := G_RET_STS_UNEXP_ERROR;
2678 END Copy_Bill_Sch;
2679 
2680 
2681 
2682 
2683 PROCEDURE Check_Existing_Lvlelement
2684 (
2685               p_sll_id          IN  Number,
2686               p_sll_dt_start    IN  Date,
2687               p_uom            IN  VARCHAR2,
2688               p_uom_per_period IN  NUMBER,
2689               p_cp_end_dt       IN  DATE,
2690               x_next_cycle_dt   OUT NOCOPY DATE,
2691               x_last_cycle_dt   out NOCOPY Date,
2692               x_period_counter  out NOCOPY Number,
2693               x_sch_amt         IN OUT NOCOPY NUMBER,
2694               x_top_line_bs     IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
2695               x_return_status   out NOCOPY Varchar2
2696 )
2697 
2698 IS
2699 
2700 
2701 CURSOR l_element_csr(p_sllid Number) IS
2702                     SELECT id ,date_start,amount,date_end
2703                     FROM oks_level_elements where rul_id = p_sllid
2704                     ORDER BY to_number(sequence_number);
2705 
2706 
2707 ----- Bug 5047257 Start
2708 Cursor l_element_count(p_sll_id in number, last_start_date in Date) is
2709                     select count(a.id) periods from oks_level_elements a, oks_k_lines_b line
2710                     where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2711                     and a.date_start <= last_start_date
2712                     and Line.cle_id = a.cle_id
2713                     and Line.billing_schedule_type in ('T','E');
2714 ----- Bug 5047257 End
2715 
2716 Cursor l_element_count1(p_sll_id in number, last_start_date in Date) is
2717                     select count(a.id) periods from oks_level_elements a, oks_k_lines_b line,
2718 		    oks_stream_levels_b sll1,
2719                     oks_stream_levels_b sll2
2720                     where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2721                     and a.date_start <= last_start_date
2722                     and a.rul_id = sll1.id
2723                     and sll1.sequence_no = sll2.sequence_no
2724                     and sll2.id = p_sll_id
2725                     and Line.cle_id = a.cle_id
2726                     and Line.billing_schedule_type in ('T','E');
2727 
2728 Cursor l_element_count2(p_sll_id in number, last_start_date in Date) is
2729                     select count(a.id) periods from oks_level_elements a, oks_k_lines_b line
2730                     where a.cle_id = ( select max(parent_cle_id) from oks_level_elements b where rul_id = p_sll_id )
2731                     and a.date_start <= last_start_date
2732                     and Line.cle_id = a.cle_id
2733                     and Line.billing_schedule_type in ('T','E');
2734 ----- Bug 5047257 End
2735 
2736 
2737 Cursor date_check_csr(p_sub_cle_id in number) is
2738                     select count(id) from okc_k_lines_b lin
2739                     where lin.id = p_sub_cle_id
2740                     and lin.cle_id in (select top.id from okc_k_lines_b top
2741                                        where lin.start_date > top.start_date);
2742 
2743 Cursor sll_csr(p_top_cle_id in number) is
2744                     select count(id) from oks_stream_levels_b strm
2745                     where strm.cle_id = p_top_cle_id;
2746 
2747 
2748 l_bill_end_date           date;
2749 l_billed_count            Number;
2750 l_element_rec             l_element_csr%rowtype;
2751 l_tbs_ind                 NUMBER;
2752 l_next_cycle_dt           DATE;
2753 l_element_end_dt          DATE;
2754 l_date_start              DATE;
2755 l_end_dt                  DATE;
2756 l_cp_bs_tbl               oks_bill_level_elements_pvt.letv_tbl_type;
2757 l_index                   number;
2758 l_top_line_id             number;
2759 l_sub_line_id             number;
2760 l_line_ctr                number;
2761 l_sll_ctr                 number;
2762 
2763 BEGIN
2764 
2765 --chk if any billed lvl elemnts exist if yes find the total amt and period counter to start with
2766 
2767 l_billed_count := 0;
2768 x_return_status := 'S';
2769 
2770 x_period_counter  := 1;
2771 x_return_status   := 'S';
2772 x_last_cycle_dt  := NULL;
2773 x_next_cycle_dt   := p_sll_dt_start;
2774 l_index := 0;
2775 
2776 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2777 
2778    fnd_log.STRING (fnd_log.level_statement,
2779                    G_MODULE_CURRENT || '.Check_Existing_Lvlelement.dtls',
2780                       'sll id = ' || p_sll_id
2781                     ||', sll st dt = ' || p_sll_dt_start
2782                   );
2783 END IF;
2784 -----errorout_ad('p_sll_dt_start = ' || p_sll_dt_start);
2785 FOR l_element_rec IN l_element_csr(p_sll_id)                   ---billed lvl element for sll
2786 LOOP
2787 
2788    l_billed_count  := l_billed_count + 1;
2789    x_last_cycle_dt := l_element_rec.date_start;
2790    x_sch_amt       := nvl(x_sch_amt,0) + nvl(l_element_rec.amount,0);
2791    x_next_cycle_dt := l_element_rec.date_end + 1;
2792 
2793 
2794    IF x_top_line_bs.COUNT > 0 THEN           --tbl will have rec for 'E' and 'T'
2795      l_index := l_index + 1;
2796 
2797      l_cp_bs_tbl(l_index).id              := l_element_rec.id;
2798      l_cp_bs_tbl(l_index).date_start      := l_element_rec.date_start;
2799      l_cp_bs_tbl(l_index).date_end        := l_element_rec.date_end;
2800      l_cp_bs_tbl(l_index).Amount          := l_element_rec.amount;
2801    END IF;
2802 
2803 END LOOP;
2804 x_period_counter  := l_billed_count + 1;        ---LINE WILL BE INSERTED FROM THIS COUNTER.
2805 
2806    l_line_ctr := 0;
2807    l_sll_ctr := 0;
2808 
2809    open date_check_csr(l_sub_line_id);
2810    fetch date_check_csr into l_line_ctr;
2811    close date_check_csr;
2812 
2813    ---- The count cursor will be invoked only if sub line effectivity is different from Top line
2814    if l_line_ctr = 1 Then
2815 
2816       open sll_csr(l_top_line_id);
2817       fetch sll_csr into l_sll_ctr;
2818       close sll_csr;
2819 
2820 	 ------for 2 or more streams
2821       if l_sll_ctr > 1 Then
2822          for l_element_rec in l_element_count1(p_sll_id, x_last_cycle_dt ) loop
2823                IF (l_element_rec.periods=0) THEN
2824                  exit;
2825                END IF;
2826                x_period_counter := l_element_rec.periods+1;
2827                exit;
2828           end loop;
2829       Else
2830 	    ------for single stream only call for the sub line
2831 	    If l_sub_line_id <> l_top_line_id then
2832             for l_element_rec in l_element_count2(p_sll_id, x_last_cycle_dt ) loop
2833                IF (l_element_rec.periods=0) THEN
2834                  exit;
2835                END IF;
2836                x_period_counter := l_element_rec.periods+1;
2837                exit;
2838             end loop;
2839 		end if;
2840        END if; --- sll count
2841 
2842     End if;  ----l_line_count = 1 Then
2843 
2844 -----errorout_ad('l_cp_bs_tbl.COUNT = '|| l_cp_bs_tbl.COUNT);
2845 
2846 
2847 --if called from sub line routine then rollup the amount to top line BS tbl
2848 ---after matching period.
2849 
2850 IF x_top_line_bs.COUNT > 0 AND l_cp_bs_tbl.COUNT > 0 THEN
2851    l_index := l_cp_bs_tbl.FIRST;
2852 
2853 
2854     l_tbs_ind := x_top_line_bs.FIRST;
2855     l_date_start := l_cp_bs_tbl(l_index ).DATE_START;
2856 
2857 
2858     -----errorout_ad('date start = ' || l_date_start);
2859 
2860     WHILE TRUNC(l_date_start) > trunc(x_top_line_bs(l_tbs_ind).DATE_START)
2861              AND l_tbs_ind < x_top_line_bs.LAST
2862     LOOP
2863        -----errorout_ad('TOP LINE BS DATE CHK = ' || x_top_line_bs(l_tbs_ind).DATE_START);
2864        l_tbs_ind := x_top_line_bs.NEXT(l_tbs_ind);
2865     END LOOP;
2866 
2867    -----errorout_ad('after while LOOP l_tbs_ind = ' || l_tbs_ind);
2868 
2869 
2870     ---chk l_next_cycle_dt if between previous and present record
2871     IF l_tbs_ind = x_top_line_bs.first THEN
2872        NULL;
2873 
2874     ELSIF  l_tbs_ind <= x_top_line_bs.LAST  THEN
2875 
2876        -----errorout_ad('COMING IN');
2877       l_tbs_ind := l_tbs_ind - 1;
2878 
2879       IF  x_top_line_bs(l_tbs_ind ).DATE_end IS NOT NULL THEN
2880         l_element_end_dt := x_top_line_bs(l_tbs_ind ).DATE_end;
2881 
2882       ELSE
2883 
2884        l_element_end_dt := OKC_TIME_UTIL_PUB.get_enddate
2885                                     (x_top_line_bs(l_tbs_ind ).DATE_START,
2886                                      p_uom,
2887                                      p_uom_Per_Period);
2888       END IF;
2889 
2890 
2891       IF TRUNC(l_date_start) >= TRUNC(x_top_line_bs(l_tbs_ind ).DATE_START)
2892            AND TRUNC(l_date_start) <= TRUNC(l_element_end_dt) THEN
2893 
2894           NULL;
2895        ELSE
2896            l_tbs_ind := l_tbs_ind + 1;
2897        END IF;
2898 
2899    elsif TRUNC(l_date_start) = TRUNC(x_top_line_bs(l_tbs_ind ).DATE_START) THEN
2900        l_tbs_ind := x_top_line_bs.first;
2901    END IF;
2902 
2903 
2904    -----errorout_ad('AFTER LOOP  = ' || l_tbs_ind);
2905 
2906    for l_index IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
2907    LOOP
2908 
2909       IF l_tbs_ind  <= x_top_line_bs.LAST THEN
2910 
2911        IF l_tbs_ind  = x_top_line_bs.LAST THEN
2912           l_bill_end_date := p_cp_end_dt;
2913        ELSE
2914 
2915           IF x_top_line_bs(l_tbs_ind ).date_end IS NOT NULL THEN
2916             l_bill_end_date := x_top_line_bs(l_tbs_ind ).date_end;
2917           ELSE
2918             l_bill_end_date := x_top_line_bs(l_tbs_ind + 1).date_start - 1;
2919           END IF;
2920        END IF;
2921 
2922        IF x_top_line_bs(l_tbs_ind).date_start <= l_cp_bs_tbl(l_index).date_start
2923           AND (l_bill_end_date) >= l_cp_bs_tbl(l_index).date_start THEN
2924 
2925           x_top_line_bs(l_tbs_ind).amount := nvl(x_top_line_bs(l_tbs_ind).amount,0) +
2926                                              nvl(l_cp_bs_tbl(l_index).amount,0);
2927 
2928           l_tbs_ind := l_tbs_ind + 1;
2929 
2930           -----errorout_ad('amount = ' || x_top_line_bs(l_tbs_ind - 1).amount);
2931           -----errorout_ad('l_tbs_ind = ' || l_tbs_ind);
2932           -----errorout_ad('l_index = ' || l_index);
2933        ELSE
2934 
2935           NULL;
2936        END IF;
2937      END IF;   ---End of l_tbs_ind  <= x_top_line_bs.LAST condition  added for bug#2655416
2938 
2939  END LOOP;
2940 END IF;                          ----end of both tbl count chk.
2941 
2942 IF l_cp_bs_tbl.COUNT > 0 THEN
2943    x_next_cycle_dt := l_cp_bs_tbl(l_cp_bs_tbl.LAST ).date_end + 1;
2944    -----errorout_ad('NEXT DATE = ' || x_next_cycle_dt);
2945 END IF;
2946 
2947 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2948 
2949    fnd_log.STRING (fnd_log.level_statement,
2950                    G_MODULE_CURRENT || '.Check_Existing_Lvlelement.out',
2951                       'x_next_cycle_dt = ' || x_next_cycle_dt);
2952 END IF;
2953 
2954 Exception
2955 
2956 WHEN OTHERS then
2957   IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
2958         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Check_Existing_Lvlelement.UNEXPECTED',
2959                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
2960   END IF;
2961   x_return_status := 'E';
2962 
2963 END Check_Existing_Lvlelement;
2964 
2965 
2966 
2967 FUNCTION Cal_Hdr_Amount
2968 (
2969               p_contract_id  IN Number
2970 )             Return NUMBER
2971 Is
2972 
2973 CURSOR l_total_amt_csr IS
2974      select SUM(nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
2975              nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) tot_amt
2976      from oks_k_lines_b dtl, okc_k_lines_b line
2977      where line.id = dtl.cle_id
2978      AND line.dnz_chr_id = p_contract_id
2979      AND lse_id IN(1,12,14,19,46);
2980 
2981 
2982 l_total_amt_rec        l_total_amt_csr%ROWTYPE;
2983 
2984 BEGIN
2985 
2986 --it will give the amount for hdr
2987 
2988 OPEN l_total_amt_csr;
2989 FETCH l_total_amt_csr INTO l_total_amt_rec;
2990 IF l_total_amt_csr%NOTFOUND THEN
2991   CLOSE l_total_amt_csr;
2992   RETURN NULL;
2993 ELSE
2994   CLOSE l_total_amt_csr;
2995   RETURN l_total_amt_rec.tot_amt;
2996 end if;
2997 
2998 
2999 EXCEPTION
3000  WHEN OTHERS then
3001    RETURN NULL;
3002 
3003 END Cal_Hdr_Amount;
3004 
3005 
3006 FUNCTION Find_Adjusted_Amount
3007 (
3008        p_line_id    IN Number,
3009        p_total_amt  IN Number,
3010        p_cycle_amt  IN Number
3011 ) RETURN Number
3012 
3013 IS
3014 
3015 CURSOR l_tot_amt_csr IS
3016        SELECT nvl(SUM(amount),0) tot_amt
3017        FROM oks_level_elements
3018        WHERE cle_id = p_line_id;
3019 
3020 l_adjusted_amount      number;
3021 l_round_level_amt      number;
3022 l_round_cycle_amt      number;
3023 l_lvlelement_amt       number;
3024 BEGIN
3025 
3026 l_lvlelement_amt := 0;
3027 
3028 Open l_tot_amt_csr;
3029 Fetch l_tot_amt_csr Into l_lvlelement_amt;
3030 
3031 If l_tot_amt_csr%Notfound then
3032    l_lvlelement_amt := 0;
3033 End If;
3034 
3035 Close l_tot_amt_csr;
3036 
3037 
3038 
3039   l_round_level_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_lvlelement_amt, l_currency_code );
3040   l_round_cycle_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(p_cycle_amt, l_currency_code );
3041 
3042   IF p_total_amt <> l_round_level_amt + l_round_cycle_amt THEN
3043      l_adjusted_amount := p_total_amt - l_round_level_amt;
3044   ELSE
3045      l_adjusted_amount := l_round_cycle_amt;
3046   END IF;
3047 
3048   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3049 
3050         fnd_log.STRING (fnd_log.level_statement,
3051                    G_MODULE_CURRENT || '.Find_Adjusted_Amount.info',
3052                       'l_adjusted_amount = ' || l_adjusted_amount
3053                     ||', line id = ' || p_line_id
3054                   );
3055   END IF;
3056 
3057   RETURN l_adjusted_amount;
3058 
3059 END Find_Adjusted_Amount;
3060 
3061 
3062  -------------------------------------------------------------------------
3063  -- Begin partial period computation logic
3064  -- Developer Mani Choudhary
3065  -- Date 09-MAY-2005
3066  -- Added two new parameters p_period_start and p_period_type
3067  -------------------------------------------------------------------------
3068 PROCEDURE Create_Level_elements(p_billing_type     IN    VARCHAR2,
3069                                 p_sll_tbl          IN    StrmLvl_Out_tbl,
3070                                 p_line_rec         IN    Line_Det_Type,
3071                                 p_invoice_ruleid   IN    Number,
3072                                 p_term_dt          IN    date,
3073                                 p_period_start     IN    VARCHAR2,
3074                                 p_period_type      IN    VARCHAR2,
3075                                 x_return_status    OUT   NOCOPY Varchar2
3076 )
3077 IS
3078 
3079 l_line_sll_counter       Number;
3080 l_period_counter         Number;
3081 l_next_cycle_dt          Date;
3082 l_bill_type              Varchar2(10);
3083 l_line_end_date          date;
3084 l_line_amt               NUMBER;
3085 l_chk_round_adjustment   NUMBER;
3086 l_adjusted_amount        NUMBER;
3087 l_lvl_loop_counter       NUMBER;
3088 l_last_cycle_dt          Date;
3089 l_bill_sch_amt           NUMBER := 0;
3090 l_tbl_seq                NUMBER;
3091 l_term_amt               NUMBER;
3092 l_uom_quantity           NUMBER;
3093 l_tce_code               VARCHAR2(100);
3094 l_constant_sll_amt       NUMBER;
3095 l_remaining_amt          NUMBER;
3096 l_dummy_top_line_bs      oks_bill_level_elements_pvt.letv_tbl_type;
3097 l_billed_at_source       OKC_K_HEADERS_ALL_B.BILLED_AT_SOURCE%TYPE;
3098 ------------------------------------------------------------------------
3099  -- Begin partial period computation logic
3100  -- Developer Mani Choudhary
3101  -- Date 17-MAY-2005
3102  -- local variables
3103 -------------------------------------------------------------------------
3104 l_full_period_end_date   DATE;
3105 l_quantity               NUMBER;
3106 l_total_quantity         NUMBER;
3107 
3108 l_last_cmp_date          DATE;
3109 --------------------------------------------------------------------------
3110   --
3111 l_api_version           CONSTANT        NUMBER  := 1.0;
3112 l_init_msg_list         VARCHAR2(2000) := OKC_API.G_FALSE;
3113 l_return_status         VARCHAR2(10);
3114 l_msg_count             NUMBER;
3115 l_msg_data              VARCHAR2(2000);
3116 l_msg_index_out         NUMBER;
3117 l_msg_index             NUMBER;
3118 
3119 -- Start - Added by PMALLARA - Bug #3992530
3120 Lvl_Element_cnt Number := 0;
3121 Strm_Start_Date  Date;
3122 -- End - Added by PMALLARA - Bug #3992530
3123 
3124 BEGIN
3125 
3126   x_return_status := 'S';
3127 
3128   IF p_sll_tbl.COUNT <= 0 THEN
3129     RETURN;
3130   END IF;
3131 
3132   l_bill_type :=  p_billing_type;
3133   l_lvl_ele_tbl_in.delete;
3134   l_tbl_seq := 1;
3135   l_bill_sch_amt   := 0;
3136 
3137   l_line_sll_counter := p_sll_tbl.FIRST;
3138 
3139 ----for T and E, top line amt in lvl_element is always null,amt will be rolled up from sub line lvl elements
3140 --in cp case or subscription line amount is at line lvl only.
3141 
3142 
3143 
3144   IF  l_bill_type IN ('T','E') AND p_line_rec.chr_id IS  NOT NULL
3145       AND p_line_rec.lse_id IN (1, 12, 14, 19) THEN
3146 
3147     l_line_amt := NULL;
3148 
3149   ELSIF p_line_rec.chr_id IS  NOT NULL AND p_line_rec.lse_id IN (1, 12, 14, 19) THEN
3150      l_line_amt :=  p_line_rec.line_amt;
3151 
3152   ELSE                       ----for cp and subscription line (lse_id =46)
3153      l_line_amt := p_line_rec.line_amt;
3154   END IF;             --chk for line type
3155 
3156 
3157   l_chk_round_adjustment := p_sll_tbl.LAST;
3158 
3159   IF TRUNC(nvl((p_term_dt - 1), p_line_rec.line_end_dt)) > p_line_rec.line_end_dt THEN
3160     l_line_end_date := p_line_rec.line_end_dt;
3161   ELSE
3162     l_line_end_date := TRUNC(nvl((p_term_dt - 1), p_line_rec.line_end_dt));
3163   END IF;
3164 
3165   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3166 
3167         fnd_log.STRING (fnd_log.level_statement,
3168                    G_MODULE_CURRENT || '.Create_Level_elements.info',
3169                       'l_chk_round_adjustment = ' || l_chk_round_adjustment
3170                     ||', l_line_end_date (up to lvl ele)  = ' || l_line_end_date
3171                     ||', l_bill_type = ' || l_bill_type
3172                     ||', l_header_billing = ' || l_header_billing
3173                   );
3174   END IF;
3175 
3176   IF l_header_billing IS NULL THEN
3177     ---delete all unbilled elements for a line
3178 
3179     Delete_lvl_element(p_cle_id        => p_line_rec.id,
3180                      x_return_status => x_return_status);
3181 
3182     IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3183            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.del_ele',
3184                        'Delete_lvl_element(x_return_status = '||x_return_status
3185                        ||', line id passed = '|| p_line_rec.id ||')');
3186     END IF;
3187 
3188     -----errorout_ad('Delete_lvl_element status = ' || x_return_status);
3189 
3190     IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3191        RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3192     ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3193        RAISE OKC_API.G_EXCEPTION_ERROR;
3194     END IF;
3195   END IF;
3196 
3197  ---if (line terminated - 1) < line_start_dt
3198  IF TRUNC(p_line_rec.line_start_dt) > TRUNC(l_line_end_date) or
3199       TRUNC( p_line_rec.line_start_dt) > trunc(nvl((p_term_dt - 1),p_line_rec.line_end_dt))  THEN
3200 
3201      IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3202 
3203         fnd_log.STRING (fnd_log.level_statement,
3204                    G_MODULE_CURRENT || '.Create_Level_elements.chk',
3205                       'BS not created as line start dt > line en dt');
3206      END IF;
3207 
3208      x_return_status := 'S';
3209      RETURN;
3210  END IF;
3211 
3212   LOOP                           ---sll rule loop
3213       -----errorout_ad('sll  start date : '||to_char(p_line_rec.line_start_dt));
3214 
3215     IF l_header_billing IS NOT NULL THEN           ----hdr lvl billing no old sll and lvl elements
3216        l_next_cycle_dt := TRUNC(p_sll_tbl(l_line_sll_counter).dt_start);
3217        l_lvl_loop_counter := 1;
3218        l_period_counter := 1;
3219 
3220     ELSE
3221        ---to get the counter
3222 
3223        Check_Existing_Lvlelement(
3224            p_sll_id              =>p_sll_tbl(l_line_sll_counter).id,
3225            p_sll_dt_start        =>TRUNC(p_sll_tbl(l_line_sll_counter).dt_start),
3226            p_uom                => null,
3227            p_uom_per_period     => null,
3228            p_cp_end_dt           => null,
3229            x_next_cycle_dt       => l_next_cycle_dt,
3230            x_last_cycle_dt       => l_last_cycle_dt,
3231            x_period_counter      => l_period_counter,
3232            x_sch_amt             => l_bill_sch_amt,
3233            x_top_line_bs         => l_dummy_top_line_bs,
3234            x_return_status       => x_return_status);
3235 
3236       -----errorout_ad('LEVEL ELEMENT COUNTER = ' || TO_CHAR(l_period_counter));
3237       -----errorout_ad('LEVEL ELEMENT START DATE = ' || to_char(l_next_cycle_dt));
3238 
3239       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3240          RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3241       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3242          RAISE OKC_API.G_EXCEPTION_ERROR;
3243       END IF;
3244       l_lvl_loop_counter := l_period_counter;
3245    END IF;
3246 
3247     IF l_period_counter > to_number(p_sll_tbl(l_line_sll_counter).level_period) THEN
3248 
3249       IF l_line_sll_counter + 1 <= p_sll_tbl.LAST THEN
3250           l_next_cycle_dt := TRUNC(p_sll_tbl(l_line_sll_counter + 1).dt_start);
3251       ELSE
3252 
3253           l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
3254                                           (TRUNC(p_sll_tbl(l_line_sll_counter).dt_start),
3255                                            p_sll_tbl(l_line_sll_counter).uom,
3256                                            (p_sll_tbl(l_line_sll_counter).uom_Per_Period *
3257                                             p_sll_tbl(l_line_sll_counter).level_period ));
3258 
3259            l_next_cycle_dt := l_next_cycle_dt + 1;
3260        END IF;        --if sll counter <= last
3261 
3262     ELSE                 --period counter <= lvl period
3263 
3264         -----errorout_ad('last date = ' || TO_CHAR(l_last_cycle_dt));
3265         -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom);
3266         -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom_Per_Period);
3267        IF L_next_cycle_dt IS null THEN
3268 
3269 
3270           L_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
3271                                            (l_last_cycle_dt,
3272                                             p_sll_tbl(l_line_sll_counter).uom,
3273                                             p_sll_tbl(l_line_sll_counter).uom_Per_Period);
3274 
3275         -----errorout_ad('next_cycle_date = ' || to_char(l_next_cycle_dt));
3276 
3277         l_next_cycle_dt := l_next_cycle_dt + 1;
3278        END IF;      --next cycle dt is null
3279 
3280       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3281 
3282         fnd_log.STRING (fnd_log.level_statement,
3283                    G_MODULE_CURRENT || '.Create_Level_elements.loop_info',
3284                       'L_next_cycle_dt = ' || L_next_cycle_dt
3285                     ||', last date = ' || l_last_cycle_dt
3286                     ||', uom = ' || p_sll_tbl(l_line_sll_counter).uom
3287                 );
3288      END IF;
3289 
3290       IF TRUNC(l_next_cycle_dt) > l_line_end_date THEN
3291          x_return_status := 'S';
3292          RETURN;
3293       END IF;
3294 
3295        IF  l_bill_type = 'T' AND p_line_rec.lse_id = 46 THEN
3296           OKS_BILL_UTIL_PUB.get_seeded_timeunit(
3297                 p_timeunit      => p_sll_tbl(l_line_sll_counter).uom,
3298                 x_return_status => x_return_status,
3299                 x_quantity      => l_uom_quantity ,
3300                 x_timeunit      => l_tce_code);
3301 
3302           IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3303              fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.seed_time',
3304                        'OKS_BILL_UTIL_PUB.get_seeded_timeunit(x_return_status = '||x_return_status
3305                        ||', x_timeunit = ' || l_tce_code
3306                        ||', x_quantity = '|| l_uom_quantity ||')');
3307           END IF;
3308 
3309           IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
3310               RAISE G_EXCEPTION_HALT_VALIDATION;
3311           END IF;
3312 
3313              l_remaining_amt := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3314 
3315              Get_Constant_sll_Amount(p_line_start_date      => p_line_rec.line_start_dt,
3316                                  p_line_end_date         => p_line_rec.line_end_dt,
3317                                  p_cycle_start_date      => l_next_cycle_dt,
3318                                  p_remaining_amount      => l_remaining_amt,
3319                                  P_uom_quantity          => l_uom_quantity,
3320                                  P_tce_code              => l_tce_code,
3321                                  x_constant_sll_amt      => l_constant_sll_amt,
3322                                  x_return_status         => x_return_status);
3323 
3324           --errorout_ad('shd not enter Get_Constant_sll_Amount = ' || x_return_status);
3325 
3326 
3327           IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3328              fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.sll_amt',
3329                        'Get_Constant_sll_Amount(x_return_status = '||x_return_status
3330                        ||', sll amt = ' || l_constant_sll_amt
3331                        ||', l_remaining_amt passed  = '|| l_remaining_amt ||')');
3332           END IF;
3333 
3334           IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
3335               RAISE G_EXCEPTION_HALT_VALIDATION;
3336           END IF;
3337       END IF;              ---end of lse_id = 46
3338 
3339       OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
3340                     (p_timeunit      => p_sll_tbl(l_line_sll_counter).uom,
3341                      x_return_status => x_return_status,
3342                      x_quantity      => l_uom_quantity ,
3343                      x_timeunit      => l_tce_code);
3344      IF x_return_status <> 'S' THEN
3345        RAISE G_EXCEPTION_HALT_VALIDATION;
3346      END IF;
3347 
3348 
3349 -- Start - Added by PMALLARA - Bug #3992530
3350     Lvl_Element_cnt  :=   l_period_counter - 1;
3351     Strm_Start_Date  :=   p_sll_tbl(l_line_sll_counter).dt_start;
3352       LOOP                          -------------for level elements of one rule
3353     Lvl_Element_cnt  :=     Lvl_Element_cnt + 1;
3354 -- End - Added by PMALLARA - Bug #3992530
3355 
3356         l_fnd_lvl_in_rec.line_start_date           := p_line_rec.line_start_dt;
3357         l_fnd_lvl_in_rec.line_end_date             := nvl((p_term_dt-1),p_line_rec.line_end_dt);
3358         l_fnd_lvl_in_rec.cycle_start_date          := l_next_cycle_dt;
3359 -- Start - Modified by PMALLARA - Bug #3992530
3360         l_fnd_lvl_in_rec.tuom_per_period           := Lvl_Element_cnt * p_sll_tbl(l_line_sll_counter).uom_Per_Period;
3361 -- End - Modified by PMALLARA - Bug #3992530
3362         l_fnd_lvl_in_rec.tuom                      := p_sll_tbl(l_line_sll_counter).uom;
3363         l_fnd_lvl_in_rec.total_amount              := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3364         l_fnd_lvl_in_rec.invoice_offset_days        := p_sll_tbl(l_line_sll_counter).invoice_offset_days;
3365         l_fnd_lvl_in_rec.interface_offset_days     := p_sll_tbl(l_line_sll_counter).Interface_offset_days;
3366         l_fnd_lvl_in_rec.bill_type                 := l_bill_type;
3367         --mchoudha added this parameter
3368         l_fnd_lvl_in_rec.uom_per_period            := p_sll_tbl(l_line_sll_counter).uom_Per_Period;
3369         -----errorout_ad(' p_Line_rec.line_start_dt :' || to_char(p_line_rec.line_start_dt));
3370         -----errorout_ad(' p_Line_rec.line_end_dt :' || to_char(p_line_rec.line_end_dt));
3371         -----errorout_ad(' l_line_amt :' || l_line_amt);
3372         -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch for line passed period :' || to_char(l_fnd_lvl_in_rec.uom_per_period));
3373         -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch for line passed uom :' || l_fnd_lvl_in_rec.uom);
3374         -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch for line passed cycle_start_date:' || to_char(l_fnd_lvl_in_rec.cycle_start_date));
3375 
3376  -------------------------------------------------------------------------
3377  -- Begin partial period computation logic
3378  -- Developer Mani Choudhary
3379  -- Date 09-MAY-2005
3380  -- Added two new parameters p_period_start and p_period_type
3381         -- Start - Modified by PMALLARA - Bug #3992530
3382         IF fnd_log.level_procedure >= fnd_log.g_current_runtime_level THEN
3383              fnd_log.string(fnd_log.level_procedure,G_MODULE_CURRENT||'.Create_Level_elements.lvl_loop',
3384                        'Calling oks_bill_util_pub.Get_next_bill_sch with parameters '
3385                        ||'period start = ' || p_period_start
3386                        ||', period type = ' || p_period_type);
3387         END IF;
3388 
3389         OKS_BILL_UTIL_PUB.Get_next_bill_sch
3390           (p_api_version             => l_api_version,
3391            x_return_status           => x_return_status,
3392            x_msg_count               => l_msg_count,
3393            x_msg_data                => l_msg_data,
3394            p_invoicing_rule_id       => p_invoice_ruleid,
3395            p_bill_sch_detail_rec     => l_fnd_lvl_in_rec,
3396            x_bill_sch_detail_rec     => l_fnd_lvl_out_rec,
3397            p_period_start            => p_period_start,
3398            p_period_type             => p_period_type,
3399            Strm_Start_Date           => Strm_Start_Date);
3400         -- End - Modified by PMALLARA - Bug #3992530
3401 
3402 
3403         IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3404              fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.lvl_loop',
3405                        'oks_bill_util_pub.Get_next_bill_sch(x_return_status = '||x_return_status
3406                        ||', next date = ' || l_fnd_lvl_out_rec.next_cycle_date
3407                        ||', tuom per period = ' || l_fnd_lvl_in_rec.tuom_per_period
3408                        ||', cycle_start_date  = '|| l_next_cycle_dt ||')');
3409         END IF;
3410 
3411 
3412         -----errorout_ad('LEVEL ELEMENT NEXT CYCLE DATE passed from Get_next_bill_sch = ' || TO_CHAR(l_fnd_lvl_out_rec.next_cycle_date));
3413 
3414         IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3415           -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
3416           RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3417         ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3418           -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
3419           RAISE OKC_API.G_EXCEPTION_ERROR;
3420         END IF;
3421 
3422 
3423         IF p_period_start is not null AND
3424            p_period_type is not null  THEN
3425            l_last_cmp_date := l_line_end_date;
3426         ELSE
3427            l_last_cmp_date := p_line_rec.line_end_dt;
3428         END IF;
3429 
3430         IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt then
3431           null;                       ---donot insert record in level element
3432         ELSE
3433 
3434           IF  l_bill_type IN ('T','E') AND p_line_rec.lse_id <> 46 THEN
3435              l_adjusted_amount := NULL;
3436           --errorout_ad('l_bill_type IN T,E AND p_line_rec.lse_id <> 46 ');
3437           ELSIF l_bill_type = 'T' AND p_line_rec.lse_id = 46 THEN
3438                    --errorout_ad('l_bill_type = T AND p_line_rec.lse_id = 46 ');
3439              IF (l_line_sll_counter = l_chk_round_adjustment AND
3440                 l_lvl_loop_counter = p_sll_tbl(l_chk_round_adjustment).level_period) OR
3441                 --Mani PPC changing p_line_rec.line_end_dt to l_last_cmp_date
3442                 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
3443 
3444                l_adjusted_amount  := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3445 
3446              ELSE        --not adjustment round
3447                l_adjusted_amount  := l_constant_sll_amt;
3448              END IF;
3449 
3450           ELSIF (l_bill_type = 'E' AND p_line_rec.lse_id = 46)
3451                OR l_bill_type = 'P' THEN
3452              --errorout_ad('(l_bill_type = E AND p_line_rec.lse_id = 46          OR l_bill_type = P');
3453              IF (l_line_sll_counter = l_chk_round_adjustment AND
3454                 l_lvl_loop_counter = p_sll_tbl(l_chk_round_adjustment).level_period) OR
3455                 --Mani PPC changing p_line_rec.line_end_dt to l_last_cmp_date
3456                 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
3457 
3458                l_adjusted_amount  := nvl(l_line_amt,0) - nvl(l_bill_sch_amt,0);
3459 
3460              ELSE            --not adjustment round
3461                ------------------------------------------------------------------------
3462                -- Begin partial period computation logic
3463                -- Developer Mani Choudhary
3464                -- Date 17-MAY-2005
3465                -- For Covered level and subscription calculate the billing schedule amount
3466                -- for the first partial period.
3467                -------------------------------------------------------------------------
3468 
3469                IF  p_period_start = 'CALENDAR'                              AND
3470                    p_period_start IS NOT NULL                               AND
3471                    p_period_type IS NOT NULL                                AND
3472                    TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
3473                THEN
3474                    --New parameters in Bold
3475                   IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
3476                     l_quantity := OKS_TIME_MEASURES_PUB.get_quantity
3477                                               (p_start_date   => l_next_cycle_dt,
3478                                                p_end_date     => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
3479                                                p_source_uom   => l_fnd_lvl_in_rec.tuom  ,
3480                                                p_period_type  => p_period_type,
3481                                                p_period_start => p_period_start);
3482 
3483                     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3484                        fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_Level_elements.Calendar',
3485                        'after calling OKS_TIME_MEASURES_PUB.get_quantity with p_period_type '||p_period_type||' ,p_period_start '||p_period_start
3486                        ||' result l_quantity = ' || l_quantity);
3487                     END IF;
3488 
3489                      IF nvl(l_quantity,0) = 0 THEN
3490                        RAISE G_EXCEPTION_HALT_VALIDATION;
3491                      END IF;
3492 
3493 
3494                     l_adjusted_amount :=p_sll_tbl(l_line_sll_counter).amount*l_quantity/l_fnd_lvl_in_rec.uom_per_period; --bugfix 5485442
3495 
3496                     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3497                        fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_Level_elements.Calendar',
3498                        'after calling OKS_TIME_MEASURES_PUB.get_quantity  '
3499                        ||' result l_adjusted_amount = ' || l_adjusted_amount);
3500                     END IF;
3501                    --mchoudha fix for bug#5200003
3502                    ELSE
3503                       l_adjusted_amount := nvl( p_sll_tbl(l_line_sll_counter).amount*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(l_next_cycle_dt))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
3504 
3505                    END IF;
3506                  ELSE
3507                     l_adjusted_amount  := p_sll_tbl(l_line_sll_counter).amount;
3508                  END IF; --period start and period type not null
3509              END IF;     --l_line_sll_counter = l_chk_round_adjustment
3510           END IF;        --IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt
3511 
3512            --insert in lvl element tbl
3513 
3514 
3515           l_lvl_ele_tbl_in(l_tbl_seq).sequence_number        :=  to_char(l_period_counter);
3516           l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id             :=  p_line_rec.dnz_chr_id;
3517           l_lvl_ele_tbl_in(l_tbl_seq).cle_id                 :=  p_line_rec.id;
3518 
3519           IF p_line_rec.lse_id IN (1,12,14,19,46) THEN
3520              l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id       :=  p_line_rec.id;
3521           ELSE             ---subline
3522              l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id       :=  p_line_rec.cle_id;
3523           END IF;
3524 
3525 
3526           IF l_next_cycle_dt < p_Line_rec.line_start_dt THEN
3527              l_lvl_ele_tbl_in(l_tbl_seq).date_start           :=   TRUNC(p_Line_rec.line_start_dt);
3528           ELSE
3529              l_lvl_ele_tbl_in(l_tbl_seq).date_start           :=   TRUNC(l_next_cycle_dt);
3530           END IF;
3531           l_lvl_ele_tbl_in(l_tbl_seq).date_end                := TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
3532 
3533 
3534           IF l_bill_type IN ('T','E') AND p_Line_rec.lse_id <> 46 THEN
3535             ----FOR T,E AND TOP LINE amt should be null to shoW rollup amt
3536 
3537             IF p_Line_rec.chr_id IS  NOT NULL THEN    --top line
3538               l_lvl_ele_tbl_in(l_tbl_seq).amount             :=   NULL;
3539             ELSE                      ----cp level
3540               l_lvl_ele_tbl_in(l_tbl_seq).amount             :=  OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_adjusted_amount,l_currency_code );
3541             END IF;
3542 
3543           ELSE                     ----for billing type = p and lse_id = 46
3544 
3545             l_lvl_ele_tbl_in(l_tbl_seq).amount               := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_adjusted_amount,l_currency_code );
3546           END IF;
3547 
3548 
3549           l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl     :=   l_fnd_lvl_out_rec.date_recievable_gl;
3550           l_lvl_ele_tbl_in(l_tbl_seq).date_transaction       :=   TRUNC(l_fnd_lvl_out_rec.date_transaction);
3551           l_lvl_ele_tbl_in(l_tbl_seq).date_due               :=   l_fnd_lvl_out_rec.date_due;
3552           l_lvl_ele_tbl_in(l_tbl_seq).date_print             :=   l_fnd_lvl_out_rec.date_print;
3553           l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface      :=   TRUNC(l_fnd_lvl_out_rec.date_to_interface);
3554 
3555           SELECT nvl(BILLED_AT_SOURCE , 'N')
3556 	    INTO l_billed_at_source
3557 	    FROM OKC_K_HEADERS_ALL_B
3558 	   WHERE id = p_line_rec.dnz_chr_id;
3559 
3560 	   if l_billed_at_source = 'Y' Then
3561               l_lvl_ele_tbl_in(l_tbl_seq).date_completed  := sysdate;
3562            else
3563               l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
3564            end if;
3565 
3566           l_lvl_ele_tbl_in(l_tbl_seq).rul_id                 :=   p_sll_tbl(l_line_sll_counter).id;
3567 
3568           l_lvl_ele_tbl_in(l_tbl_seq).object_version_number  := OKC_API.G_MISS_NUM;
3569           l_lvl_ele_tbl_in(l_tbl_seq).created_by             := OKC_API.G_MISS_NUM;
3570           l_lvl_ele_tbl_in(l_tbl_seq).creation_date          := SYSDATE;
3571           l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by        := OKC_API.G_MISS_NUM;
3572           l_lvl_ele_tbl_in(l_tbl_seq).last_update_date       := SYSDATE;
3573 
3574 
3575           -----errorout_ad ('Amount for line lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
3576       IF p_period_start is  null OR
3577          p_period_type is  null THEN
3578 
3579           IF p_term_dt IS NOT NULL AND TRUNC(l_lvl_ele_tbl_in(l_tbl_seq).date_start) < TRUNC(p_term_dt) AND
3580             TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > TRUNC(p_term_dt) AND
3581             p_term_dt <=  p_Line_rec.line_end_dt  THEN
3582 
3583             l_lvl_ele_tbl_in(l_tbl_seq).date_end              := (p_term_dt - 1);
3584 
3585             IF l_bill_type = 'P' OR  p_Line_rec.lse_id = 46 THEN
3586 
3587               -----errorout_ad('going to calculate l_term_amt');
3588               IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) >  p_Line_rec.line_end_dt THEN
3589 
3590                       l_term_amt := Find_term_amt(p_cycle_st_dt  =>  l_lvl_ele_tbl_in(l_tbl_seq).date_start,
3591                                        p_term_dt      =>  p_term_dt,
3592                                        p_cycle_end_dt =>  p_Line_rec.line_end_dt,
3593                                        p_amount       =>  nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
3594 
3595 
3596                       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3597                         fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.term_period',
3598                         'find_term_amt(x_return_status = '||x_return_status
3599                          ||', l_term_amt = ' || l_term_amt
3600                          ||', p_cycle_st_dt = ' || l_lvl_ele_tbl_in(l_tbl_seq).date_start
3601                          ||', p_term_dt = ' || p_Line_rec.line_end_dt
3602                          ||', lvl amt = ' || nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0)
3603                          ||', p_cycle_end_dt  = '|| l_next_cycle_dt ||')');
3604                       END IF;
3605 
3606               ELSE
3607                        l_term_amt := Find_term_amt(p_cycle_st_dt  =>  l_lvl_ele_tbl_in(l_tbl_seq).date_start,
3608                                                    p_term_dt      =>  p_term_dt,
3609                                                    p_cycle_end_dt =>  l_fnd_lvl_out_rec.next_cycle_date - 1,
3610                                                    p_amount       =>  nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
3611 
3612                        IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3613                           fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.term_period',
3614                            'find_term_amt(x_return_status = '||x_return_status
3615                            ||', l_term_amt = ' || l_term_amt
3616                            ||', p_cycle_st_dt = ' || l_lvl_ele_tbl_in(l_tbl_seq).date_start
3617                            ||', p_term_dt = ' || p_Line_rec.line_end_dt
3618                            ||', lvl amt = ' || nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0)
3619                            ||', p_cycle_end_dt  = '|| l_fnd_lvl_out_rec.next_cycle_date - 1 ||')');
3620                        END IF;  -- fnd_log.level_event >= fnd_log.g_current_runtime_level
3621               END IF;           -- TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) >  p_Line_rec.line_end_dt
3622 
3623 
3624               l_lvl_ele_tbl_in(l_tbl_seq).amount  := l_term_amt;
3625             END IF;       -----end of cal of term amt.
3626           END IF;             ----end of lvlelement end date assign
3627         END IF; --period start null or period type null
3628 
3629           l_period_counter := l_period_counter + 1;
3630           l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
3631           l_tbl_seq      := l_tbl_seq + 1;
3632         END IF;          -----end if for level element creation
3633 
3634         l_next_cycle_dt  := l_fnd_lvl_out_rec.next_cycle_date;
3635 
3636         EXIT WHEN (l_lvl_loop_counter = to_number(p_sll_tbl(l_line_sll_counter).level_period)) OR
3637                   (TRUNC(l_next_cycle_dt) > l_line_end_date);
3638 
3639         l_lvl_loop_counter := l_lvl_loop_counter + 1;
3640 
3641        END LOOP;                   ---loop for sll period counter
3642 
3643       END IF;                      ----Period counter checking before entering in loop for lvlelement
3644 
3645     -----errorout_ad('l_next_cycle_dt = ' || TO_CHAR(l_next_cycle_dt));
3646     -----errorout_ad('LINE END DATE = ' || TO_CHAR(p_Line_rec.line_end_dt));
3647 
3648 
3649     EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
3650               (TRUNC(l_next_cycle_dt) > l_line_end_date);
3651 
3652     l_line_sll_counter := p_sll_tbl.NEXT(l_line_sll_counter);
3653 
3654   END LOOP;                    -----loop for sll lines
3655 
3656   IF l_lvl_ele_tbl_in.COUNT > 0 THEN
3657      IF l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end > p_line_rec.line_end_dt THEN
3658        l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end := p_line_rec.line_end_dt;
3659      END IF;
3660 
3661      OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
3662                p_api_version                  => l_api_version,
3663                p_init_msg_list                => l_init_msg_list,
3664                x_return_status                => x_return_status,
3665                x_msg_count                    => l_msg_count,
3666                x_msg_data                     => l_msg_data,
3667                p_letv_tbl                     => l_lvl_ele_tbl_in,
3668                x_letv_tbl                     => l_lvl_ele_tbl_out);
3669 
3670      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3671                   fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Level_elements.insert',
3672                        'oks_bill_level_elements_pvt.insert_row(x_return_status = '||x_return_status
3673                        ||', l_lvl_ele_tbl_out  = '|| l_lvl_ele_tbl_out.count ||')');
3674      END IF;
3675 
3676     -----errorout_ad('LEVEL ELEMENT INSERT STATUS line = ' || x_return_status);
3677 
3678 
3679       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3680          -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for line = ' || l_msg_data);
3681          RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3682       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3683          -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for line = ' || l_msg_data);
3684          RAISE OKC_API.G_EXCEPTION_ERROR;
3685       END IF;
3686    END IF;
3687 
3688 
3689 EXCEPTION
3690  WHEN G_EXCEPTION_HALT_VALIDATION THEN
3691         x_return_status := G_RET_STS_ERROR;
3692  WHEN OTHERS THEN
3693 
3694      IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
3695         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Create_Level_elements.UNEXPECTED',
3696                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
3697       END IF;
3698         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
3699                             p_msg_name     => G_UNEXPECTED_ERROR,
3700                             p_token1       => G_SQLCODE_TOKEN,
3701                             p_token1_value => sqlcode,
3702                             p_token2       => G_SQLERRM_TOKEN,
3703                             p_token2_value => sqlerrm);
3704 
3705         x_return_status := G_RET_STS_UNEXP_ERROR;
3706 END Create_Level_elements;
3707 
3708 
3709  -------------------------------------------------------------------------
3710  -- Begin partial period computation logic
3711  -- Developer Mani Choudhary
3712  -- Date 09-MAY-2005
3713  -- Added two new parameters p_period_start and p_period_type
3714  -------------------------------------------------------------------------
3715 PROCEDURE Create_Hdr_Level_elements(
3716                                 p_billing_type     IN    VARCHAR2,
3717                                 p_sll_tbl          IN    StrmLvl_Out_tbl,
3718                                 p_hdr_rec          IN    Contract_Rec_Type,
3719                                 p_invoice_ruleid   IN    Number,
3720                                 p_called_from      IN    NUMBER,
3721                                 p_period_start     IN   VARCHAR2,
3722                                 p_period_type      IN   VARCHAR2,
3723                                 x_return_status    OUT   NOCOPY Varchar2
3724 )
3725 IS
3726 
3727 l_sll_counter            Number;
3728 l_tbl_seq                Number;
3729 l_next_cycle_dt          Date;
3730 l_lvl_loop_counter       NUMBER;
3731 l_cycle_amt              number;
3732 l_bill_type              VARCHAR2(10);
3733 
3734   --
3735 l_api_version           CONSTANT        NUMBER  := 1.0;
3736 l_init_msg_list         VARCHAR2(2000) := OKC_API.G_FALSE;
3737 l_return_status         VARCHAR2(10);
3738 l_msg_count             NUMBER;
3739 l_msg_data              VARCHAR2(2000);
3740 l_msg_index_out         NUMBER;
3741 l_msg_index             NUMBER;
3742 i                       number;
3743 
3744 -- Start - Added by PMALLARA - Bug #3992530
3745 Lvl_Element_cnt Number := 0;
3746 Strm_Start_Date  Date;
3747 -- End - Added by PMALLARA - Bug #3992530
3748 
3749 BEGIN
3750 
3751   --l_hdr_end_date := p_hdr_rec.end_dt;
3752 x_return_status := 'S';
3753 
3754   l_lvl_ele_tbl_in.delete;
3755   l_tbl_seq := 1;
3756   l_sll_counter := p_sll_tbl.FIRST;
3757   l_bill_type := p_billing_type;
3758 
3759 
3760 IF p_called_from = 1 THEN
3761   --delete lvl lements for hdr and all (sll and lvl elemnts) of top lines and cp.
3762 
3763   Del_hdr_lvl_element(p_hdr_id        => p_hdr_rec.id,
3764                       x_return_status => x_return_status);
3765 
3766 
3767   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3768            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Create_Hdr_Level_elements.del_ele',
3769                        'Del_hdr_lvl_element(x_return_status = '||x_return_status
3770                        ||', p_hdr_id passed = '||p_hdr_rec.id ||')');
3771   END IF;
3772 
3773   -----errorout_ad('Del_hdr_lvl_element status = ' || x_return_status);
3774   IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3775      RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3776   ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3777      RAISE OKC_API.G_EXCEPTION_ERROR;
3778   END IF;
3779 END IF;
3780 
3781 
3782 LOOP                           ---sll rule loop
3783       -----errorout_ad('sll rule start date : '||to_char(p_line_rec.line_start_dt));
3784 
3785     l_next_cycle_dt := p_sll_tbl(l_sll_counter).dt_start;
3786     l_lvl_loop_counter := 1;
3787 
3788 
3789 -- Start - Added by PMALLARA - Bug #3992530
3790     Lvl_Element_cnt  := 0;
3791       LOOP                          -------------for level elements of one rule
3792     Lvl_Element_cnt  :=     Lvl_Element_cnt + 1;
3793     if Lvl_Element_cnt = 1 then
3794         Strm_Start_Date :=   l_next_cycle_dt;
3795     end if;
3796 -- End - Added by PMALLARA - Bug #3992530
3797 
3798         l_fnd_lvl_in_rec.line_start_date           := p_hdr_rec.start_dt;
3799         l_fnd_lvl_in_rec.line_end_date             := p_hdr_rec.end_dt;
3800         l_fnd_lvl_in_rec.cycle_start_date          := l_next_cycle_dt;
3801 -- Start - Modified by PMALLARA - Bug #3992530
3802         l_fnd_lvl_in_rec.tuom_per_period           := Lvl_Element_cnt * p_sll_tbl(l_sll_counter).uom_Per_Period;
3803 -- End - Modified by PMALLARA - Bug #3992530
3804         l_fnd_lvl_in_rec.tuom                      := p_sll_tbl(l_sll_counter).uom;
3805         l_fnd_lvl_in_rec.total_amount              := 0;
3806         l_fnd_lvl_in_rec.invoice_offset_days        := p_sll_tbl(l_sll_counter).invoice_offset_days;
3807         l_fnd_lvl_in_rec.interface_offset_days     := p_sll_tbl(l_sll_counter).Interface_offset_days;
3808         l_fnd_lvl_in_rec.bill_type                 := l_bill_type;
3809         --mchoudha added this parameter
3810         l_fnd_lvl_in_rec.uom_per_period            := p_sll_tbl(l_sll_counter).uom_Per_Period;
3811 
3812  -------------------------------------------------------------------------
3813  -- Begin partial period computation logic
3814  -- Developer Mani Choudhary
3815  -- Date 09-MAY-2005
3816  -- Added two new parameters p_period_start and p_period_type
3817         -- Start - Modified by PMALLARA - Bug #3992530
3818         OKS_BILL_UTIL_PUB.Get_next_bill_sch
3819           (p_api_version             => l_api_version,
3820            x_return_status           => x_return_status,
3821            x_msg_count               => l_msg_count,
3822            x_msg_data                => l_msg_data,
3823            p_invoicing_rule_id       => p_invoice_ruleid,
3824            p_bill_sch_detail_rec     => l_fnd_lvl_in_rec,
3825            x_bill_sch_detail_rec     => l_fnd_lvl_out_rec,
3826            p_period_start            =>  p_period_start,
3827            p_period_type             =>  p_period_type,
3828            Strm_Start_Date           => Strm_Start_Date);
3829         -- End - Modified by PMALLARA - Bug #3992530
3830 
3831        IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3832              fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_hdr_level_elements.lvl_loop',
3833                        'oks_bill_util_pub.Get_next_bill_sch(x_return_status = '||x_return_status
3834                        ||', next date = ' || l_fnd_lvl_out_rec.next_cycle_date
3835                        ||', tuom per period = ' || l_fnd_lvl_in_rec.tuom_per_period
3836                        ||', cycle_start_date  = '|| l_next_cycle_dt ||')');
3837         END IF;
3838 
3839         -----errorout_ad('hdr Get_next_bill_sch status = ' || x_return_status);
3840 
3841         IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3842           -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_fnd_msg_data);
3843           RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3844         ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3845           -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_fnd_msg_data);
3846           RAISE OKC_API.G_EXCEPTION_ERROR;
3847         END IF;
3848 
3849 
3850 
3851         IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_hdr_rec.start_dt then
3852           NULL;                       ---donot insert record in level element
3853         ELSE
3854 
3855           -----errorout_ad('l_lvl_loop_counter = ' || l_lvl_loop_counter);
3856           -----errorout_ad('l_tbl_seq = ' || l_tbl_seq);
3857 
3858           l_lvl_ele_tbl_in(l_tbl_seq).sequence_number        :=   to_char(l_lvl_loop_counter);
3859           l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id             :=   p_hdr_rec.id;
3860           l_lvl_ele_tbl_in(l_tbl_seq).date_start             :=   TRUNC(l_next_cycle_dt);
3861           l_lvl_ele_tbl_in(l_tbl_seq).date_end               :=   TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
3862 
3863           IF l_bill_type = 'T' then
3864             ----FOR T amt should be null
3865             l_lvl_ele_tbl_in(l_tbl_seq).amount               :=   NULL;
3866 
3867           ELSE                     ----for E
3868 
3869             l_cycle_amt  := TO_NUMBER(p_sll_tbl(l_sll_counter).amount);
3870             l_lvl_ele_tbl_in(l_tbl_seq).amount               :=   OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_cycle_amt,l_currency_code );
3871           END IF;
3872 
3873 
3874           l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl     :=   l_fnd_lvl_out_rec.date_recievable_gl;
3875           l_lvl_ele_tbl_in(l_tbl_seq).date_transaction       :=   TRUNC(l_fnd_lvl_out_rec.date_transaction);
3876           l_lvl_ele_tbl_in(l_tbl_seq).date_due               :=   l_fnd_lvl_out_rec.date_due;
3877           l_lvl_ele_tbl_in(l_tbl_seq).date_print             :=   l_fnd_lvl_out_rec.date_print;
3878           l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface      :=   TRUNC(l_fnd_lvl_out_rec.date_to_interface);
3879           l_lvl_ele_tbl_in(l_tbl_seq).date_completed         :=   l_fnd_lvl_out_rec.date_completed;
3880           l_lvl_ele_tbl_in(l_tbl_seq).rul_id                 :=   p_sll_tbl(l_sll_counter).id;
3881 
3882           l_lvl_ele_tbl_in(l_tbl_seq).object_version_number  := OKC_API.G_MISS_NUM;
3883           l_lvl_ele_tbl_in(l_tbl_seq).created_by             := OKC_API.G_MISS_NUM;
3884           l_lvl_ele_tbl_in(l_tbl_seq).creation_date          := SYSDATE;
3885           l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by        := OKC_API.G_MISS_NUM;
3886           l_lvl_ele_tbl_in(l_tbl_seq).last_update_date       := SYSDATE;
3887 
3888           l_tbl_seq := l_tbl_seq + 1;
3889 
3890         END IF;          -----end if for level element creation
3891 
3892         l_next_cycle_dt  := l_fnd_lvl_out_rec.next_cycle_date;
3893 
3894         EXIT WHEN (l_lvl_loop_counter = to_number(p_sll_tbl(l_sll_counter).level_period)) OR
3895                   (TRUNC(l_next_cycle_dt) > p_hdr_rec.end_dt);
3896 
3897         l_lvl_loop_counter := l_lvl_loop_counter + 1;
3898 
3899        END LOOP;                   ---loop for sll period counter
3900 
3901 
3902     EXIT WHEN (l_sll_counter = p_sll_tbl.LAST) OR
3903               (TRUNC(l_next_cycle_dt) > p_hdr_rec.end_dt);
3904 
3905     l_sll_counter := p_sll_tbl.NEXT(l_sll_counter);
3906 
3907   END LOOP;                    -----loop for sll lines
3908 
3909   IF l_lvl_ele_tbl_in.COUNT > 0 THEN
3910 
3911     OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
3912                p_api_version                  => l_api_version,
3913                p_init_msg_list                => l_init_msg_list,
3914                x_return_status                => x_return_status,
3915                x_msg_count                    => l_msg_count,
3916                x_msg_data                     => l_msg_data,
3917                p_letv_tbl                     => l_lvl_ele_tbl_in,
3918                x_letv_tbl                     => l_lvl_ele_tbl_out);
3919 
3920     IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
3921                   fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_hdr_level_elements.insert',
3922                        'oks_bill_level_elements_pvt.insert_row(x_return_status = '||x_return_status
3923                      ||', l_lvl_ele_tbl_out  = '|| l_lvl_ele_tbl_out.count ||')');
3924      END IF;
3925 
3926 
3927     -----errorout_ad('LEVEL ELEMENT INSERT STATUS = ' || x_return_status);
3928 
3929 
3930     IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
3931       -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row = ' || l__msg_data);
3932       RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
3933     ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
3934       -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row = ' || l_msg_data);
3935       RAISE OKC_API.G_EXCEPTION_ERROR;
3936     END IF;
3937   END IF;
3938 
3939 
3940 
3941 EXCEPTION
3942  WHEN OTHERS THEN
3943      IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
3944         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_hdr_level_elements.UNEXPECTED',
3945                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
3946       END IF;
3947         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
3948                             p_msg_name     => G_UNEXPECTED_ERROR,
3949                             p_token1       => G_SQLCODE_TOKEN,
3950                             p_token1_value => sqlcode,
3951                             p_token2       => G_SQLERRM_TOKEN,
3952                             p_token2_value => sqlerrm);
3953 
3954         x_return_status := G_RET_STS_UNEXP_ERROR;
3955 END Create_Hdr_Level_elements;
3956 
3957 FUNCTION Find_Currency_Code
3958 (        p_cle_id  NUMBER,
3959          p_chr_id  NUMBER
3960 )
3961 RETURN VARCHAR2
3962 IS
3963 
3964 CURSOR l_line_cur IS
3965        SELECT contract.currency_code
3966        FROM okc_k_headers_b contract, okc_k_lines_b line
3967        WHERE contract.id = line.dnz_chr_id and line.id = p_cle_id;
3968 
3969 CURSOR l_hdr_cur IS
3970        SELECT contract.currency_code
3971        FROM okc_k_headers_b contract
3972        WHERE contract.id = p_chr_id;
3973 
3974 
3975 l_Currency  VARCHAR2(15);
3976 
3977 BEGIN
3978 
3979 IF p_chr_id IS NULL THEN       ---called for line
3980    OPEN l_line_cur;
3981    FETCH l_line_cur INTO l_currency;
3982 
3983    IF l_line_cur%NOTFOUND THEN
3984      l_Currency := NULL;
3985    END IF;
3986 
3987    Close l_line_cur;
3988 
3989 ELSE                   ---FOR HEADER
3990 
3991    OPEN l_hdr_cur;
3992    FETCH l_hdr_cur INTO l_currency;
3993 
3994    IF l_hdr_cur%NOTFOUND THEN
3995      l_Currency := NULL;
3996    END IF;
3997 
3998    Close l_hdr_cur;
3999 
4000 END IF;
4001 
4002 RETURN l_Currency;
4003 
4004 EXCEPTION
4005     WHEN NO_DATA_FOUND THEN
4006       RETURN NULL;
4007     WHEN OTHERS THEN
4008       RETURN NULL;
4009 
4010 END Find_Currency_Code;
4011 
4012 
4013 Procedure Update_Sll_Amount
4014 (
4015           p_line_id         IN    NUMBER,
4016           x_return_status   OUT   NOCOPY Varchar2
4017 )
4018 IS
4019 
4020 Cursor l_Line_Csr Is
4021   SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id,  line.lse_id lse_id,
4022         TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
4023         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
4024          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt
4025   FROM okc_k_lines_b line, oks_k_lines_b dtl
4026   WHERE  line.id = dtl.cle_id AND line.Id =  p_line_id ;
4027 
4028 CURSOR l_Line_Sll_Csr IS
4029    SELECT  sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
4030            sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
4031            sll.interface_offset_days,  sll.cle_id, sll.chr_id,
4032            sll.dnz_chr_id, sll.end_date,sll.object_version_number
4033    FROM oks_stream_levels_b sll
4034    WHERE sll.cle_id = p_line_id
4035    ORDER BY sll.sequence_no;
4036 
4037    l_Line_Csr_Rec           l_Line_Csr%Rowtype;
4038    l_Line_Sll_Csr_Rec       l_Line_Sll_Csr%Rowtype;
4039    l_Line_Amount            NUMBER;
4040    l_Sll_Counter            NUMBER;
4041    l_remaining_amt          NUMBER;
4042    l_used_amt               NUMBER;
4043    l_total_period           NUMBER;
4044    l_prorate_counter        NUMBER;
4045    l_amt_counter            NUMBER;
4046    l_sll_index             NUMBER;
4047    l_sll_amt                NUMBER;
4048    l_period_sll_amount      NUMBER(20,2);
4049 
4050    l_return_status          VARCHAR2(10);
4051    l_msg_count              NUMBER;
4052    l_msg_data               VARCHAR2(2000);
4053    l_init_msg_list          VARCHAR2(2000) := OKC_API.G_FALSE;
4054 
4055    l_sll_prorate_tbl        sll_prorated_tab_type;
4056 -------------------------------------------------------------------------
4057 -- Begin partial period computation logic
4058 -- Developer Mani Choudhary
4059 -- Date 04-MAY-2005
4060 -------------------------------------------------------------------------
4061 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
4062 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
4063 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
4064 l_tangible        BOOLEAN;
4065 l_pricing_method Varchar2(30);
4066 -------------------------------------------------------------------------
4067 -- End partial period computation logic
4068 -- Date 04-MAY-2005
4069 -------------------------------------------------------------------------
4070 ----The procedure finds the amount for line . Then find the amount for sll rule from the given periods and
4071 ----line amount and update the sll rule.
4072 BEGIN
4073 
4074     x_return_status := 'S';
4075 
4076    l_strm_lvl_tbl_in.DELETE;
4077 
4078    OPEN l_Line_Csr;
4079    FETCH l_Line_Csr INTO l_Line_Csr_Rec;
4080 
4081    IF l_Line_Csr%NOTFOUND THEN
4082       Close l_Line_Csr;
4083       x_return_status := 'E';
4084       RETURN;
4085    ELSE
4086       Close l_Line_Csr;
4087    END IF;
4088 
4089    -------------------------------------------------------------------------
4090  -- Begin partial period computation logic
4091  -- Developer Mani Choudhary
4092  -- Date 09-MAY-2005
4093  -------------------------------------------------------------------------
4094 
4095    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
4096                 (
4097                  p_hdr_id        =>l_Line_Csr_Rec.dnz_chr_id,
4098                  p_org_id        => NULL,
4099                  x_period_start  => l_period_start,
4100                  x_period_type   => l_period_type,
4101                  x_price_uom     => l_price_uom,
4102                  x_return_status => x_return_status);
4103 
4104    IF x_return_status <> 'S' THEN
4105       RAISE G_EXCEPTION_HALT_VALIDATION;
4106    END IF;
4107   --Description in detail for the business rules for deriving the period start
4108   --1)For usage , period start  will always be 'SERVICE'
4109   --2)For Subscriptions, period start and period type will be NULL
4110   --  for tangible subscriptions as per CR1.For intangible subscriptions,
4111   --  if the profile OKS: Intangible Subscription Pricing Method
4112   --  is set to 'Subscription Based',then period start and period type will be NULL
4113   --  otherwise it will be 'SERVICE'
4114   --3) For Extended Warranty from OM, period start will always be 'SERVICE'
4115 
4116  --mchoudha fix for bug#5183011
4117  IF l_period_start IS NOT NULL AND
4118     l_period_type IS NOT NULL
4119  THEN
4120    IF l_Line_Csr_Rec.lse_id = 12 THEN
4121      l_period_start := 'SERVICE';
4122    END IF;
4123    IF l_Line_Csr_Rec.lse_id = 46 THEN
4124      l_tangible  := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_line_id);
4125      IF l_tangible THEN
4126        l_period_start := NULL;
4127        l_period_type := NULL;
4128      ELSE
4129        l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
4130        IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
4131          l_period_start := NULL;
4132          l_period_type := NULL;
4133        ELSE
4134          l_period_start := 'SERVICE';
4135        END IF;  -- l_pricing_method <> 'EFFECTIVITY'
4136      END IF;    -- IF l_tangible
4137    END IF;      -- l_Line_Csr_Rec.lse_id = 46
4138  END IF;        -- period start and period type are not null
4139  -------------------------------------------------------------------------
4140  -- End partial period computation logic
4141  -- Date 09-MAY-2005
4142  -------------------------------------------------------------------------
4143 
4144 
4145    IF l_currency_code IS NULL THEN
4146      l_currency_code := Find_Currency_Code(
4147                                     p_cle_id  => p_line_id,
4148                                     p_chr_id  => NULL);
4149      IF l_currency_code IS NULL THEN
4150         OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
4151         x_return_status := 'E';
4152         RETURN;
4153      END IF;
4154    END IF;  ---currency code null
4155 
4156    l_Line_Amount := l_Line_Csr_Rec.line_amt;
4157 
4158    l_Sll_Counter := 1;
4159    l_used_amt := 0;
4160    l_prorate_counter := 0;
4161 
4162    FOR l_Line_Sll_Csr_REC IN l_Line_Sll_Csr
4163    LOOP
4164 
4165      IF l_Line_Sll_Csr_Rec.level_amount IS NOT NULL THEN           ---------calculate total sll amount
4166 
4167        l_sll_amt := (l_Line_Sll_Csr_Rec.level_amount * l_Line_Sll_Csr_Rec.level_periods);
4168        l_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt, l_currency_code);
4169        l_used_amt := l_used_amt + l_sll_amt;
4170 
4171        -----errorout_ad('sll amount = ' || to_char(l_sll_amt));
4172        -----errorout_ad('total used  amount = ' || to_char(l_used_amt));
4173 
4174      ELSE
4175 
4176        l_prorate_counter :=  l_prorate_counter + 1;
4177        -----errorout_ad('prorate counter = ' || to_char(l_prorate_counter));
4178 
4179        l_sll_prorate_tbl(l_prorate_counter).sll_seq_num    := l_sll_counter;          ---index of sll table
4180        l_sll_prorate_tbl(l_prorate_counter).sll_start_date := l_line_sll_csr_rec.Start_Date;
4181        l_sll_prorate_tbl(l_prorate_counter).sll_end_date   := l_line_sll_csr_rec.end_Date;
4182        l_sll_prorate_tbl(l_prorate_counter).sll_tuom       := l_Line_Sll_Csr_Rec.uom_code;
4183        l_sll_prorate_tbl(l_prorate_counter).sll_period     := l_Line_Sll_Csr_Rec.level_periods;
4184        l_sll_prorate_tbl(l_prorate_counter).sll_uom_per_period := l_Line_Sll_Csr_Rec.uom_per_period;
4185      END IF;
4186 
4187 
4188      l_strm_lvl_tbl_in(l_Sll_Counter).id                        := l_Line_Sll_Csr_Rec.id;
4189      l_strm_lvl_tbl_in(l_Sll_Counter).cle_id                    := l_Line_Sll_Csr_Rec.cle_id;
4190      l_strm_lvl_tbl_in(l_Sll_Counter).chr_id                    := l_Line_Sll_Csr_Rec.chr_id;
4191      l_strm_lvl_tbl_in(l_Sll_Counter).dnz_chr_id                := l_Line_Sll_Csr_Rec.dnz_chr_id;
4192      l_strm_lvl_tbl_in(l_Sll_Counter).uom_code                  := l_Line_Sll_Csr_Rec.uom_code;
4193      l_strm_lvl_tbl_in(l_Sll_Counter).sequence_no               := l_Line_Sll_Csr_Rec.sequence_no;
4194      l_strm_lvl_tbl_in(l_Sll_Counter).start_date                := l_line_sll_csr_rec.Start_Date;
4195      l_strm_lvl_tbl_in(l_Sll_Counter).end_date                  := l_line_sll_csr_rec.end_Date;
4196      l_strm_lvl_tbl_in(l_Sll_Counter).level_periods             := l_Line_Sll_Csr_Rec.level_periods;
4197      l_strm_lvl_tbl_in(l_Sll_Counter).uom_per_period            := l_Line_Sll_Csr_Rec.uom_per_period;
4198      l_strm_lvl_tbl_in(l_Sll_Counter).level_amount              := l_Line_Sll_Csr_Rec.level_amount;
4199      l_strm_lvl_tbl_in(l_Sll_Counter).invoice_offset_days       := l_Line_Sll_Csr_Rec.invoice_offset_days;
4200      l_strm_lvl_tbl_in(l_Sll_Counter).interface_offset_days     := l_Line_Sll_Csr_Rec.interface_offset_days;
4201      l_strm_lvl_tbl_in(l_Sll_Counter).object_version_number     := l_Line_Sll_Csr_Rec.object_version_number;
4202 
4203      l_strm_lvl_tbl_in(l_Sll_Counter).created_by                := OKC_API.G_MISS_NUM;
4204      l_strm_lvl_tbl_in(l_Sll_Counter).creation_date             := SYSDATE;
4205      l_strm_lvl_tbl_in(l_Sll_Counter).last_updated_by           := OKC_API.G_MISS_NUM;
4206      l_strm_lvl_tbl_in(l_Sll_Counter).last_update_date          := SYSDATE;
4207 
4208 
4209      l_Sll_Counter := l_Sll_Counter + 1;
4210 
4211 
4212    END LOOP;       --sll loop
4213 
4214 
4215    -----errorout_ad('OUTSIDE LOOP');
4216    -----errorout_ad('l_sll_prorate_tbl.COUNT = '|| TO_CHAR(l_sll_prorate_tbl.COUNT));
4217 
4218    IF l_sll_prorate_tbl.COUNT >= 1 THEN             ----get sll amount only if atleast 1 sll is without amount.
4219 
4220      l_remaining_amt := l_Line_Amount - l_used_amt;
4221      -----errorout_ad('l_remaining_amt = ' || to_char(l_remaining_amt));
4222      -----errorout_ad('l_currency_code = ' || l_currency_code);
4223 
4224      Calculate_sll_amount(
4225                       p_api_version      => l_api_version,
4226                       p_total_amount     => l_remaining_amt,
4227                       p_currency_code    => l_currency_code,
4228                       p_sll_prorated_tab => l_sll_prorate_tbl,
4229                       p_period_start     => l_period_start,
4230                       p_period_type      => l_period_type,
4231                       x_return_status    => x_return_status);
4232 
4233 
4234     -----errorout_ad  ('Get_sll_amount STATUS = ' ||  x_return_status);
4235 
4236 
4237     IF (l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
4238        RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
4239     ELSIF (l_return_status = OKC_API.G_RET_STS_ERROR) THEN
4240        RAISE OKC_API.G_EXCEPTION_ERROR;
4241     END IF;
4242 
4243     ---- the output table has index number of sll table to be updated in sll_seq_num field,
4244     ----so just change the amount for the l_rulv_index .
4245 
4246 
4247     IF l_sll_prorate_tbl.COUNT > 0 THEN
4248       l_amt_counter := l_sll_prorate_tbl.FIRST;
4249       LOOP
4250         l_sll_index := l_sll_prorate_tbl(l_amt_counter).sll_seq_num;
4251 
4252         -----errorout_ad('sll index = '|| to_char(l_sll_index));
4253         -----errorout_ad('sll amount returned = '|| to_char(l_sll_prorate_tbl(l_amt_counter).sll_amount));
4254 
4255         l_period_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
4256                                          l_sll_prorate_tbl(l_amt_counter).sll_amount, l_currency_code);
4257 
4258         l_strm_lvl_tbl_in(l_sll_index).level_amount  := l_period_sll_amount;
4259 
4260         EXIT WHEN l_amt_counter = l_sll_prorate_tbl.LAST;
4261 
4262         l_amt_counter := l_sll_prorate_tbl.NEXT(l_amt_counter);
4263 
4264       END LOOP;
4265     END IF;       --prorate tbl count chk
4266 
4267   END IF;                ----end of getting sll amount
4268 
4269 
4270 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
4271   FOR i IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
4272   LOOP
4273 
4274     UPDATE oks_stream_levels_b
4275     set level_amount = l_strm_lvl_tbl_in(i).level_amount
4276     WHERE id = l_strm_lvl_tbl_in(i).id;
4277 
4278     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4279 
4280         fnd_log.STRING (fnd_log.level_statement,
4281                    G_MODULE_CURRENT || '.update_sll_amount.update',
4282                       'update sll id = ' || l_strm_lvl_tbl_in(i).id
4283                     ||', amt = ' || l_strm_lvl_tbl_in(i).level_amount
4284                   );
4285      END IF;
4286   END LOOP;         --tbl for loop
4287 END IF;           ---sll tbl count chk
4288 
4289 EXCEPTION
4290  WHEN OTHERS THEN
4291         IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
4292            fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.update_sll_amount.UNEXPECTED',
4293                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
4294         END IF;
4295         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
4296                             p_msg_name     => G_UNEXPECTED_ERROR,
4297                             p_token1       => G_SQLCODE_TOKEN,
4298                             p_token1_value => sqlcode,
4299                             p_token2       => G_SQLERRM_TOKEN,
4300                             p_token2_value => sqlerrm);
4301 
4302         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4303 
4304 END Update_Sll_Amount;
4305 
4306 PROCEDURE Calculate_sll_amount( p_api_version       IN      NUMBER,
4307                                 p_total_amount      IN      NUMBER,
4308                                 p_currency_code     IN      VARCHAR2,
4309                                 p_period_start      IN      VARCHAR2,
4310                                 p_period_type       IN      VARCHAR2,
4311                                 p_sll_prorated_tab  IN  OUT NOCOPY sll_prorated_tab_type,
4312                                 x_return_status     OUT     NOCOPY VARCHAR2
4313 
4314 )
4315 IS
4316 l_sll_num               NUMBER;
4317 i                       NUMBER;
4318 j                       NUMBER;
4319 l_sll_remain_amount  NUMBER(20,2);
4320 l_currency_code   VARCHAR2(15);
4321 l_period_sll_amt        NUMBER(20,2);
4322 
4323 l_uom_code     VARCHAR2(40);
4324 l_tce_code      VARCHAR2(10);
4325 l_uom_quantity         NUMBER;
4326 l_curr_sll_start_date  DATE;
4327 l_curr_sll_end_date    DATE;
4328 
4329 l_next_sll_start_date  DATE;
4330 l_next_sll_end_date    DATE;
4331 l_tot_sll_amount       NUMBER(20,2);
4332 
4333 l_curr_frequency        NUMBER;
4334 l_next_frequency        NUMBER;
4335 l_tot_frequency         NUMBER;
4336 l_sll_period        NUMBER;
4337 l_return_status         VARCHAR2(1);
4338 l_uom_per_period         NUMBER;
4339 l_temp                   NUMBER;
4340 
4341 BEGIN
4342 x_return_status := 'S';
4343 l_sll_num := p_sll_prorated_tab.count;
4344 l_sll_remain_amount := p_total_amount;
4345  -------------------------------------------------------------------------
4346  -- Begin partial period computation logic
4347  -- Developer Mani Choudhary
4348  -- Date 31-MAY-2005
4349  -- Proration to consider period start and period type
4350  -------------------------------------------------------------------------
4351 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4352    fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4353   'input parameters period start  '||p_period_start
4354   ||' p_period_type = ' || p_period_type);
4355 END IF;
4356 
4357 IF p_period_start is NOT NULL AND
4358    p_period_type  is NOT NULL
4359 THEN
4360   FOR i in 1 .. l_sll_num LOOP
4361     l_uom_code := p_sll_prorated_tab(i).sll_tuom ;
4362     l_uom_per_period := p_sll_prorated_tab(i).sll_uom_per_period ;
4363      --errorout_ad('l_uom_code '||l_uom_code);
4364     l_next_sll_end_date := NULL;
4365     l_curr_sll_start_date := p_sll_prorated_tab(i).sll_start_date;
4366     l_curr_sll_end_date   := p_sll_prorated_tab(i).sll_end_date;
4367 
4368     For j in i+1 .. l_sll_num Loop
4369           l_next_sll_start_date := p_sll_prorated_tab(j).sll_start_date;
4370           l_next_sll_end_date   := p_sll_prorated_tab(j).sll_end_date;
4371 /*          l_temp:=NULL;
4372           l_temp:= OKS_TIME_MEASURES_PUB.get_quantity (
4373                                                         p_start_date   => l_next_sll_start_date,
4374                                                         p_end_date     => l_next_sll_end_date,
4375                                                         p_source_uom   => l_uom_code,
4376                                                         p_period_type  => p_period_type,
4377                                                         p_period_start => p_period_start
4378                                                         );
4379           IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4380              fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4381             'afer calling OKS_TIME_MEASURES_PUB.get_quantity input parameters period start  '||p_period_start||' p_period_type = ' || p_period_type
4382             ||' result l_temp '||l_temp);
4383           END IF;
4384 
4385           IF nvl(l_temp,0) = 0 THEN
4386              RAISE G_EXCEPTION_HALT_VALIDATION;
4387           END IF;
4388 
4389           l_next_frequency :=l_next_frequency + l_temp;
4390 
4391           IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4392              fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4393             'afer calling OKS_TIME_MEASURES_PUB.get_quantity input parameters period start  '||p_period_start||' p_period_type = ' || p_period_type
4394             ||' result l_next_frequency '||l_next_frequency);
4395           END IF;
4396 
4397 */
4398 
4399      END LOOP;
4400 
4401     l_curr_frequency := OKS_TIME_MEASURES_PUB.get_quantity (
4402                                                         p_start_date   => l_curr_sll_start_date,
4403                                                         p_end_date     => l_curr_sll_end_date,
4404                                                         p_source_uom   => l_uom_code,
4405                                                         p_period_type  => p_period_type,
4406                                                         p_period_start => p_period_start
4407                                                         );
4408     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4409        fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4410        'afer calling OKS_TIME_MEASURES_PUB.get_quantity input parameters period start  '||p_period_start||' p_period_type = ' || p_period_type
4411        ||' result l_curr_frequency '||l_curr_frequency);
4412     END IF;
4413 
4414     IF nvl(l_curr_frequency,0) = 0 THEN
4415       RAISE G_EXCEPTION_HALT_VALIDATION;
4416     END IF;
4417     l_tot_frequency := 0;
4418 
4419     l_tot_frequency := OKS_TIME_MEASURES_PUB.get_quantity (
4420                                                         p_start_date   => l_curr_sll_start_date,
4421                                                         p_end_date     => nvl(l_next_sll_end_date,l_curr_sll_end_date),
4422                                                         p_source_uom   => l_uom_code,
4423                                                         p_period_type  => p_period_type,
4424                                                         p_period_start => p_period_start
4425                                                         );
4426 
4427     IF nvl(l_tot_frequency,0) = 0 THEN
4428       RAISE G_EXCEPTION_HALT_VALIDATION;
4429     END IF;
4430         --errorout_ad('l_curr_frequency '||l_curr_frequency);
4431 
4432   --        l_next_frequency := 0;
4433 
4434 
4435   --      l_tot_frequency := l_tot_frequency + l_curr_frequency + l_next_frequency;
4436 
4437         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4438            fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4439            ' result l_tot_frequency '||l_tot_frequency);
4440         END IF;
4441 
4442         --errorout_ad('l_tot_frequency '||l_tot_frequency);
4443        -- l_sll_period := p_sll_prorated_tab(i).sll_period;
4444         l_sll_period := l_curr_frequency/l_uom_per_period;
4445 
4446         l_period_sll_amt := ( l_sll_remain_amount /( nvl(l_tot_frequency,1) * nvl(l_sll_period,1))) * nvl(l_curr_frequency,0) ;
4447 
4448         l_period_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_period_sll_amt, l_currency_code);
4449 
4450         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4451            fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4452            ' result l_period_sll_amt '||l_period_sll_amt);
4453         END IF;
4454 
4455 
4456         l_sll_remain_amount := l_sll_remain_amount - (l_period_sll_amt * nvl(l_sll_period,1)) ;
4457 
4458         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4459            fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Calculate_sll_amount.ppc',
4460            ' result l_sll_remain_amount '||l_sll_remain_amount);
4461         END IF;
4462 
4463         --errorout_ad('l_period_sll_amt '||l_period_sll_amt);
4464         --errorout_ad('l_sll_remain_amount '||l_sll_remain_amount);
4465         p_sll_prorated_tab(i).sll_amount := l_period_sll_amt;
4466         l_curr_frequency := 0;
4467   END LOOP;
4468  -------------------------------------------------------------------------
4469  -- End partial period computation logic
4470  -------------------------------------------------------------------------
4471 ELSE
4472   For i in 1 .. l_sll_num Loop
4473     l_uom_code := p_sll_prorated_tab(i).sll_tuom ;
4474     oks_bill_util_pub.get_seeded_timeunit(
4475                              p_timeunit     => l_uom_code ,
4476                              x_return_status => l_return_status,
4477                              x_quantity      => l_uom_quantity,
4478                              x_timeunit      => l_tce_code);
4479 
4480     l_curr_sll_start_date := p_sll_prorated_tab(i).sll_start_date;
4481     l_curr_sll_end_date   := p_sll_prorated_tab(i).sll_end_date;
4482 
4483     IF l_tce_code = 'DAY' Then
4484         l_curr_frequency :=  l_curr_sll_end_date - l_curr_sll_start_date + 1;
4485     ELSIF l_tce_code = 'MONTH' Then
4486         l_curr_frequency :=  months_between(l_curr_sll_end_date + 1, l_curr_sll_start_date) ;
4487     ELSIF l_tce_code = 'YEAR' Then
4488         l_curr_frequency :=  months_between(l_curr_sll_end_date + 1, l_curr_sll_start_date) / 12 ;
4489     END IF;
4490 
4491     If NVL(l_uom_quantity,0) > 0 Then
4492         l_curr_frequency := l_curr_frequency / NVL(l_uom_quantity,1);
4493     END IF;
4494         --errorout_ad('l_curr_frequency '||l_curr_frequency);
4495         l_tot_frequency := 0;
4496         l_next_frequency := 0;
4497 
4498         For j in i+1 .. l_sll_num Loop
4499           l_next_sll_start_date := p_sll_prorated_tab(j).sll_start_date;
4500           l_next_sll_end_date   := p_sll_prorated_tab(j).sll_end_date;
4501           IF l_tce_code = 'DAY' Then
4502             l_next_frequency :=  l_next_frequency + (l_next_sll_end_date - l_next_sll_start_date + 1);
4503           ELSIF l_tce_code = 'MONTH' Then
4504             l_next_frequency :=  l_next_frequency + (months_between(l_next_sll_end_date + 1, l_next_sll_start_date)) ;
4505           ELSIF l_tce_code = 'YEAR' Then
4506             l_next_frequency :=  l_next_frequency + (months_between(l_next_sll_end_date + 1, l_next_sll_start_date) / 12) ;
4507          END IF;
4508 
4509 
4510         END LOOP;
4511 
4512         If NVL(l_uom_quantity,0) > 0 Then
4513            l_next_frequency := l_next_frequency / NVL(l_uom_quantity,1);
4514          END IF;
4515 
4516         l_tot_frequency := l_tot_frequency + l_curr_frequency + l_next_frequency;
4517         --errorout_ad('l_tot_frequency '||l_tot_frequency);
4518         l_sll_period := p_sll_prorated_tab(i).sll_period;
4519 
4520 
4521         l_period_sll_amt := ( l_sll_remain_amount /( nvl(l_tot_frequency,1) * nvl(l_sll_period,1))) * nvl(l_curr_frequency,0) ;
4522 
4523         l_period_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_period_sll_amt, l_currency_code);
4524 
4525         l_sll_remain_amount := l_sll_remain_amount - (l_period_sll_amt * nvl(l_sll_period,1)) ;
4526             --errorout_ad('l_period_sll_amt '||l_period_sll_amt);
4527                 --errorout_ad('l_sll_remain_amount '||l_sll_remain_amount);
4528         p_sll_prorated_tab(i).sll_amount := l_period_sll_amt;
4529         l_curr_frequency := 0;
4530   END LOOP;
4531 END IF;
4532 
4533 EXCEPTION
4534 WHEN G_EXCEPTION_HALT_VALIDATION THEN
4535    x_return_status := G_RET_STS_ERROR;
4536 END Calculate_sll_amount;
4537 
4538 
4539 FUNCTION Find_Sll_Count(
4540                        p_subline_id   NUMBER)
4541 RETURN NUMBER
4542 
4543 IS
4544 
4545 l_sll_rule_count          NUMBER;
4546 
4547 BEGIN
4548 
4549 SELECT COUNT(id) INTO l_sll_rule_count
4550 FROM oks_stream_levels_b
4551 WHERE cle_id = p_subline_id ;
4552 
4553 RETURN l_sll_rule_count;
4554 
4555 EXCEPTION
4556   WHEN OTHERS THEN
4557     RETURN NULL;
4558 
4559 END Find_Sll_Count;
4560 
4561 
4562 PROCEDURE Delete_lvl_element(p_cle_id          IN  NUMBER,
4563                              x_return_status   OUT NOCOPY VARCHAR2)
4564 
4565 IS
4566 
4567 BEGIN
4568 
4569 ---it deletes the level elementwhich are not billed for the given line id.
4570 
4571 x_return_status := 'S';
4572 
4573 DELETE  FROM   OKS_LEVEL_ELEMENTS
4574 WHERE  date_Completed is NULL
4575 AND cle_id = p_cle_id;
4576 
4577 
4578 EXCEPTION
4579   WHEN OTHERS THEN
4580     OKC_API.SET_MESSAGE(p_app_name         => G_APP_NAME_OKC,
4581                             p_msg_name     => G_UNEXPECTED_ERROR,
4582                             p_token1       => G_SQLCODE_TOKEN,
4583                             p_token1_value => sqlcode,
4584                             p_token2       => G_SQLERRM_TOKEN,
4585                             p_token2_value => sqlerrm);
4586 
4587     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4588 
4589 END Delete_lvl_element;
4590 
4591 
4592 
4593 PROCEDURE Del_hdr_lvl_element(p_hdr_id         IN  NUMBER,
4594                              x_return_status  OUT NOCOPY VARCHAR2
4595 )
4596 IS
4597 
4598 
4599 BEGIN
4600 
4601 x_return_status := 'S';
4602 ---delete hdr , top line, cp lvl elements together
4603 
4604 DELETE FROM OKS_LEVEL_ELEMENTS
4605 WHERE rul_id IN
4606        (SELECT sll.id
4607        FROM OKS_STREAM_LEVELS_B sll
4608        WHERE sll.dnz_chr_id = p_hdr_id);
4609 
4610 
4611 
4612 ---delete sll  for line and cp.
4613 
4614 DELETE FROM OKS_STREAM_LEVELS_B
4615 WHERE dnz_chr_id = p_hdr_id
4616 AND chr_id IS NULL;
4617 
4618 EXCEPTION
4619   WHEN OTHERS THEN
4620     OKC_API.SET_MESSAGE(p_app_name         => G_APP_NAME_OKC,
4621                             p_msg_name     => G_UNEXPECTED_ERROR,
4622                             p_token1       => G_SQLCODE_TOKEN,
4623                             p_token1_value => sqlcode,
4624                             p_token2       => G_SQLERRM_TOKEN,
4625                             p_token2_value => sqlerrm);
4626 
4627     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4628 
4629 END Del_hdr_lvl_element;
4630 
4631 
4632 Procedure Cal_hdr_Sll_Amount
4633 (
4634           p_hdr_id          IN    NUMBER,
4635           x_return_status   OUT   NOCOPY Varchar2
4636 )
4637 IS
4638 
4639   Cursor l_hdr_Csr Is
4640          SELECT id, TRUNC(start_date) start_dt, TRUNC(end_date) end_dt
4641          FROM   OKC_K_HEADERS_b
4642          WHERE  id =  p_hdr_id ;
4643 
4644 
4645   CURSOR l_Sll_Csr IS
4646          SELECT  sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
4647          sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
4648          sll.interface_offset_days,  sll.cle_id, sll.chr_id,
4649          sll.dnz_chr_id, sll.end_date, sll.object_version_number
4650          FROM oks_stream_levels_b sll
4651          WHERE sll.chr_id = p_hdr_id
4652          ORDER BY sll.sequence_no;
4653 
4654    l_hdr_Csr_Rec            l_hdr_Csr%Rowtype;
4655    l_Sll_Csr_Rec            l_Sll_Csr%Rowtype;
4656    l_hdr_Amount             NUMBER;
4657    l_Sll_Counter            NUMBER;
4658    l_Cycle_Start_Date       DATE;
4659    l_Cycle_End_Date         DATE;
4660    l_remaining_amt          NUMBER;
4661    l_used_amt               NUMBER;
4662    l_total_period           NUMBER;
4663    l_prorate_counter        NUMBER;
4664    l_amt_counter            NUMBER;
4665    l_sll_index              NUMBER;
4666    l_sll_amt                NUMBER;
4667    l_period_sll_amount      NUMBER(20,2);
4668 
4669    l_return_status          VARCHAR2(10);
4670    l_msg_count              NUMBER;
4671    l_msg_data               VARCHAR2(2000);
4672    l_init_msg_list          VARCHAR2(2000) := OKC_API.G_FALSE;
4673 
4674    l_sll_prorate_tbl        sll_prorated_tab_type;
4675 -------------------------------------------------------------------------
4676 -- Begin partial period computation logic
4677 -- Developer Mani Choudhary
4678 -- Date 04-MAY-2005
4679 -------------------------------------------------------------------------
4680 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
4681 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
4682 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
4683 -------------------------------------------------------------------------
4684 -- End partial period computation logic
4685 -- Date 04-MAY-2005
4686 -------------------------------------------------------------------------
4687 
4688 ----The procedure finds the amount for hdr . Then find the amount for sll rule from the given periods and
4689 ----hdr amount and update the sll rule.
4690 BEGIN
4691 x_return_status := 'S';
4692    l_strm_lvl_tbl_in.DELETE;
4693 
4694    OPEN l_hdr_Csr;
4695    FETCH l_hdr_Csr INTO l_hdr_Csr_Rec;
4696 
4697    IF l_hdr_Csr%NOTFOUND THEN
4698       Close l_hdr_Csr;
4699       x_return_status := 'E';
4700       RETURN;
4701    ELSE
4702       Close l_hdr_Csr;
4703    END IF;
4704   -------------------------------------------------------------------------
4705  -- Begin partial period computation logic
4706  -- Developer Mani Choudhary
4707  -- Date 09-MAY-2005
4708  -------------------------------------------------------------------------
4709 
4710    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
4711                 (
4712                  p_hdr_id        => p_hdr_id,
4713                  p_org_id        => NULL,
4714                  x_period_start  => l_period_start,
4715                  x_period_type   => l_period_type,
4716                  x_price_uom     => l_price_uom,
4717                  x_return_status => x_return_status);
4718 
4719    IF x_return_status <> 'S' THEN
4720       RAISE G_EXCEPTION_HALT_VALIDATION;
4721    END IF;
4722  -------------------------------------------------------------------------
4723  -- End partial period computation logic
4724  -- Date 09-MAY-2005
4725  -------------------------------------------------------------------------
4726    IF l_currency_code IS NULL THEN
4727      l_currency_code := Find_Currency_Code(
4728                                     p_cle_id  => NULL,
4729                                     p_chr_id  => p_hdr_id);
4730 
4731      IF l_currency_code IS NULL THEN
4732         OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
4733         x_return_status := 'E';
4734         RETURN;
4735      END IF;
4736    END IF;
4737 
4738 
4739    l_hdr_Amount := Cal_Hdr_Amount(p_contract_id  => p_hdr_id);
4740 
4741 
4742    l_Sll_Counter := 1;
4743    l_used_amt := 0;
4744    l_prorate_counter := 0;
4745 
4746    FOR l_Sll_Csr_rec IN l_Sll_Csr
4747    LOOP
4748 
4749 
4750      IF l_Sll_Csr_Rec.level_amount IS NOT NULL THEN           ---------calculate total all amount
4751 
4752        l_sll_amt := to_number(l_Sll_Csr_Rec.level_amount) * to_number(l_Sll_Csr_Rec.level_periods);
4753        l_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt, l_currency_code);
4754        l_used_amt := l_used_amt + l_sll_amt;
4755 
4756        -----errorout_ad('sll amount = ' || to_char(l_sll_amt));
4757        -----errorout_ad('total used  amount = ' || to_char(l_used_amt));
4758 
4759      ELSE
4760 
4761        l_prorate_counter :=  l_prorate_counter + 1;
4762        -----errorout_ad('prorate counter = ' || to_char(l_prorate_counter));
4763 
4764        l_sll_prorate_tbl(l_prorate_counter).sll_seq_num    := l_sll_counter;          ---index of rulv table
4765        l_sll_prorate_tbl(l_prorate_counter).sll_start_date := l_sll_csr_rec.Start_Date;
4766        l_sll_prorate_tbl(l_prorate_counter).sll_end_date   := l_sll_csr_rec.end_Date;
4767        l_sll_prorate_tbl(l_prorate_counter).sll_tuom        := l_Sll_Csr_Rec.uom_code;
4768        l_sll_prorate_tbl(l_prorate_counter).sll_period     := TO_NUMBER(l_Sll_Csr_Rec.level_periods);
4769        l_sll_prorate_tbl(l_prorate_counter).sll_uom_per_period := l_Sll_Csr_Rec.uom_per_period;
4770 
4771        -----errorout_ad('sll_seq_num = ' || TO_CHAR(l_sll_counter));
4772        -----errorout_ad('sll_start_date = ' || TO_CHAR(l_Cycle_Start_Date));
4773        -----errorout_ad('sll_start_date = ' || TO_CHAR(l_Cycle_End_Date));
4774        -----errorout_ad('sll_uom = ' || l_Sll_Csr_Rec.object1_id1);
4775      END IF;
4776 
4777      l_strm_lvl_tbl_in(l_Sll_Counter).id                        := l_Sll_Csr_Rec.id;
4778      l_strm_lvl_tbl_in(l_Sll_Counter).cle_id                    := l_Sll_Csr_Rec.cle_id;
4779      l_strm_lvl_tbl_in(l_Sll_Counter).chr_id                    := l_Sll_Csr_Rec.chr_id;
4780      l_strm_lvl_tbl_in(l_Sll_Counter).dnz_chr_id                := l_Sll_Csr_Rec.dnz_chr_id;
4781      l_strm_lvl_tbl_in(l_Sll_Counter).uom_code                  := l_Sll_Csr_Rec.uom_code;
4782      l_strm_lvl_tbl_in(l_Sll_Counter).sequence_no               := l_Sll_Csr_Rec.sequence_no;
4783      l_strm_lvl_tbl_in(l_Sll_Counter).start_date                := l_sll_csr_rec.Start_Date;
4784      l_strm_lvl_tbl_in(l_Sll_Counter).end_date                  := l_sll_csr_rec.end_Date;
4785      l_strm_lvl_tbl_in(l_Sll_Counter).level_periods             := l_Sll_Csr_Rec.level_periods;
4786      l_strm_lvl_tbl_in(l_Sll_Counter).uom_per_period            := l_Sll_Csr_Rec.uom_per_period;
4787      l_strm_lvl_tbl_in(l_Sll_Counter).level_amount              := l_Sll_Csr_Rec.level_amount;
4788      l_strm_lvl_tbl_in(l_Sll_Counter).invoice_offset_days       := l_Sll_Csr_Rec.invoice_offset_days;
4789      l_strm_lvl_tbl_in(l_Sll_Counter).interface_offset_days     := l_Sll_Csr_Rec.interface_offset_days;
4790      l_strm_lvl_tbl_in(l_Sll_Counter).object_version_number     := l_Sll_Csr_Rec.object_version_number;
4791 
4792      l_strm_lvl_tbl_in(l_Sll_Counter).created_by                := OKC_API.G_MISS_NUM;
4793      l_strm_lvl_tbl_in(l_Sll_Counter).creation_date             := SYSDATE;
4794      l_strm_lvl_tbl_in(l_Sll_Counter).last_updated_by           := OKC_API.G_MISS_NUM;
4795      l_strm_lvl_tbl_in(l_Sll_Counter).last_update_date          := SYSDATE;
4796 
4797      l_Sll_Counter := l_Sll_Counter + 1;
4798 
4799 
4800    END LOOP;
4801 
4802 
4803    -----errorout_ad('OUTSIDE LOOP');
4804    -----errorout_ad('l_sll_prorate_tbl.COUNT = '|| TO_CHAR(l_sll_prorate_tbl.COUNT));
4805 
4806    IF l_sll_prorate_tbl.COUNT >= 1 THEN             ----get sll amount only if atleast 1 sll is without amount.
4807 
4808      l_remaining_amt := l_hdr_amount - l_used_amt;
4809      -----errorout_ad('l_remaining_amt = ' || to_char(l_remaining_amt));
4810      -----errorout_ad('l_currency_code = ' || l_currency_code);
4811 
4812      Calculate_sll_amount(
4813                       p_api_version      => l_api_version,
4814                       p_total_amount     => l_remaining_amt,
4815                       p_currency_code    => l_currency_code,
4816                       p_period_start     => l_period_start,
4817                       p_period_type      => l_period_type,
4818                       p_sll_prorated_tab => l_sll_prorate_tbl,
4819                       x_return_status    => x_return_status);
4820 
4821 
4822     -----errorout_ad  ('Get_sll_amount STATUS = ' ||  x_return_status);
4823 
4824 
4825     IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
4826        RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
4827     ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
4828        RAISE OKC_API.G_EXCEPTION_ERROR;
4829     END IF;
4830 
4831     ---- the output table has index number of sll rule table to be updated in sll_seq_num field,
4832     ----so just change the amount for the l_rulv_index .
4833 
4834 
4835     IF l_sll_prorate_tbl.COUNT > 0 THEN
4836       l_amt_counter := l_sll_prorate_tbl.FIRST;
4837       LOOP
4838         l_sll_index := l_sll_prorate_tbl(l_amt_counter).sll_seq_num;
4839 
4840         -----errorout_ad('sll index = '|| to_char(l_sll_index));
4841         -----errorout_ad('sll amount returned = '|| to_char(l_sll_prorate_tbl(l_amt_counter).sll_amount));
4842 
4843         l_period_sll_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
4844                                            l_sll_prorate_tbl(l_amt_counter).sll_amount, l_currency_code);
4845 
4846         l_strm_lvl_tbl_in(l_sll_index).level_amount  := TO_CHAR(l_period_sll_amount);
4847 
4848         EXIT WHEN l_amt_counter = l_sll_prorate_tbl.LAST;
4849 
4850         l_amt_counter := l_sll_prorate_tbl.NEXT(l_amt_counter);
4851 
4852       END LOOP;
4853     END IF;
4854 
4855   END IF;                ----end of getting sll amount
4856 
4857 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
4858   FOR i IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
4859   LOOP
4860 
4861     UPDATE oks_stream_levels_b
4862     set level_amount = l_strm_lvl_tbl_in(i).level_amount
4863     WHERE id = l_strm_lvl_tbl_in(i).id;
4864   END LOOP;         --tbl for loop
4865 END IF;           ---sll tbl count chk
4866 
4867 
4868 EXCEPTION
4869  WHEN OTHERS THEN
4870         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
4871                             p_msg_name     => G_UNEXPECTED_ERROR,
4872                             p_token1       => G_SQLCODE_TOKEN,
4873                             p_token1_value => sqlcode,
4874                             p_token2       => G_SQLERRM_TOKEN,
4875                             p_token2_value => sqlerrm);
4876 
4877         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4878 
4879 END Cal_hdr_Sll_Amount;
4880 
4881 PROCEDURE Get_Constant_sll_Amount(p_line_start_date       IN DATE,
4882                                  p_line_end_date         IN DATE,
4883                                  p_cycle_start_date      IN DATE,
4884                                  p_remaining_amount      IN NUMBER,
4885                                  P_uom_quantity          IN NUMBER,
4886                                  P_tce_code              IN VARCHAR2,
4887                                  x_constant_sll_amt      OUT NOCOPY NUMBER,
4888                                  x_return_status         OUT NOCOPY VARCHAR2)
4889 IS
4890 
4891 l_frequency          NUMBER;
4892 
4893 BEGIN
4894 x_return_status := OKC_API.G_RET_STS_SUCCESS;
4895 -----errorout_ad('p_tce_code = ' || p_tce_code);
4896 -----errorout_ad('p_uom_quantity = ' || p_uom_quantity);
4897 
4898 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4899 
4900   fnd_log.STRING (fnd_log.level_statement,
4901             G_MODULE_CURRENT || '.get_constant_sll_amount.info',
4902                'p_tce_code = ' || p_tce_code
4903              ||', p_uom_quantity = ' || p_uom_quantity
4904              ||', p_remaining_amount = ' || p_remaining_amount
4905              ||', st-end dt = ' || p_line_start_date || '-' || p_line_end_date );
4906 END IF;
4907 
4908 If p_line_start_date > p_cycle_start_date then   ---and l_start_date < l_next_billing_date Then
4909     l_frequency  := OKS_BILL_UTIL_PUB.get_frequency
4910                 (p_tce_code      => p_tce_code,
4911                  p_fr_end_date   => p_line_end_date ,
4912                  p_fr_start_date => p_line_start_date,       --this LINE st dt
4913                  p_uom_quantity  => p_uom_quantity,
4914                  x_return_status => X_return_status);
4915 
4916 
4917 ELSE
4918    l_frequency  := OKS_BILL_UTIL_PUB.get_frequency
4919                 (p_tce_code      => p_tce_code,
4920                  p_fr_end_date   => p_line_end_date ,
4921                  p_fr_start_date => p_cycle_start_date,       --this cycle st dt to find remaining period
4922                  p_uom_quantity  => p_uom_quantity,
4923                  x_return_status => x_return_status);
4924 
4925 END IF;
4926 
4927 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
4928            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.get_constant_sll_amount.freq',
4929                        'oks_bill_util_pub.get_frequency(x_return_status = '||x_return_status
4930                        ||', l_frequency = '|| l_frequency ||')');
4931 END IF;
4932 
4933 If x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
4934   OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'GET_FREQUENCY FAILED.');
4935   x_return_status := OKC_API.G_RET_STS_ERROR;
4936   RETURN;
4937 End if;
4938 
4939 -----errorout_ad('p_remaining_amount = ' || p_remaining_amount);
4940 -----errorout_ad('l_frequency = ' || l_frequency);
4941 
4942 x_constant_sll_amt :=  (nvl(p_remaining_amount,0)/nvl(l_frequency,1)) ;
4943 
4944 -----errorout_ad('x_constant_sll_amt  = ' || x_constant_sll_amt);
4945 EXCEPTION
4946  WHEN OTHERS THEN
4947 
4948        IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
4949         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.get_constant_sll_amount.UNEXPECTED',
4950                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
4951        END IF;
4952         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
4953                             p_msg_name     => G_UNEXPECTED_ERROR,
4954                             p_token1       => G_SQLCODE_TOKEN,
4955                             p_token1_value => sqlcode,
4956                             p_token2       => G_SQLERRM_TOKEN,
4957                             p_token2_value => sqlerrm);
4958 
4959         x_return_status := G_RET_STS_UNEXP_ERROR;
4960 
4961 END Get_Constant_sll_Amount;
4962 
4963 PROCEDURE Get_Period_Frequency(p_line_start_date      IN  DATE,
4964                               p_line_end_date         IN  DATE,
4965                               p_cycle_start_date      IN  DATE,
4966                               p_next_billing_date     IN  DATE,
4967                               P_uom_quantity          IN  NUMBER,
4968                               P_tce_code              IN  VARCHAR2,
4969                               p_uom_per_period       IN  NUMBER,
4970                               x_period_freq           OUT NOCOPY NUMBER,
4971                               x_return_status         OUT NOCOPY VARCHAR2)
4972 IS
4973 
4974 BEGIN
4975 x_return_status         := OKC_API.G_RET_STS_SUCCESS;
4976    If p_line_start_date > p_cycle_start_date and p_line_start_date < P_next_billing_date Then
4977            x_period_freq := OKS_BILL_UTIL_PUB.get_frequency
4978                                (p_tce_code      => p_tce_code,
4979                                 p_fr_start_date => p_line_start_date,
4980                                 p_fr_end_date   => p_next_billing_date - 1,
4981                                 p_uom_quantity  => p_uom_quantity,
4982                                 x_return_status => x_return_status);
4983 
4984    ElsiF( p_next_billing_date > p_line_end_date + 1) THEN
4985              x_period_freq:= OKS_BILL_UTIL_PUB.get_frequency
4986                               (p_tce_code      => p_tce_code,
4987                                 p_fr_end_date   => p_line_end_date,
4988                                 p_fr_start_date => p_cycle_start_date,
4989                                 p_uom_quantity  => p_uom_quantity,
4990                                 x_return_status => x_return_status);
4991 
4992      ELSE                          ----if everything is ok
4993 
4994              x_period_freq := p_uom_per_period;
4995 
4996      End If;
4997 
4998 
4999 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5000            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.get_period_frequency.freq',
5001                        'oks_bill_util_pub.get_frequency(x_return_status = '||x_return_status
5002                        ||', x_period_freq = '|| x_period_freq ||')');
5003 END IF;
5004 
5005 If x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
5006    OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'GET_FREQUENCY FAILED.');
5007    x_return_status := OKC_API.G_RET_STS_ERROR;
5008    RETURN;
5009 End if;
5010 
5011 EXCEPTION
5012  WHEN OTHERS THEN
5013 
5014         IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
5015           fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.get_period_frequency.UNEXPECTED',
5016                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
5017         END IF;
5018         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
5019                             p_msg_name     => G_UNEXPECTED_ERROR,
5020                             p_token1       => G_SQLCODE_TOKEN,
5021                             p_token1_value => sqlcode,
5022                             p_token2       => G_SQLERRM_TOKEN,
5023                             p_token2_value => sqlerrm);
5024 
5025         x_return_status := G_RET_STS_UNEXP_ERROR;
5026 
5027 end Get_Period_Frequency;
5028 
5029 
5030 
5031 
5032 Function Cal_Sllid_amount
5033 (
5034           p_Sll_id              IN    NUMBER,
5035           x_return_status       OUT   NOCOPY Varchar2,
5036           x_msg_count           OUT   NOCOPY NUMBER,
5037           x_msg_data            OUT   NOCOPY VARCHAR2
5038 )RETURN NUMBER
5039 IS
5040 
5041 l_sll_amt         NUMBER := 0;
5042 
5043 BEGIN
5044 
5045 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5046 
5047 SELECT NVL(SUM(AMOUNT),0) INTO l_sll_amt
5048 FROM OKS_LEVEL_ELEMENTS
5049 WHERE rul_id = p_Sll_id;
5050 
5051 RETURN l_sll_amt;
5052 
5053 EXCEPTION
5054   WHEN OTHERS THEN
5055     x_return_status := G_RET_STS_UNEXP_ERROR;
5056     RETURN NULL;
5057 
5058 END Cal_Sllid_amount;
5059 
5060 Procedure Create_Bill_Sch_CP
5061 (
5062           p_top_line_id         IN    NUMBER,
5063           p_cp_line_id          IN    NUMBER,
5064           p_cp_new              IN    Varchar2,
5065           x_return_status       OUT   NOCOPY Varchar2,
5066           x_msg_count           OUT   NOCOPY NUMBER,
5067           x_msg_data             OUT  NOCOPY VARCHAR2)
5068 
5069 IS
5070 
5071 Cursor l_subLine_Csr Is
5072  SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
5073         TRUNC(line.end_date) cp_end_dt, TRUNC(line.date_terminated) cp_term_dt,
5074         dtl.full_credit full_credit,price_uom,lse_id cp_lse_id,
5075         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
5076          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) subline_amt
5077  FROM okc_k_lines_b line, oks_k_lines_b dtl
5078  WHERE line.id = p_cp_line_id
5079    AND line.date_cancelled is NULL
5080  AND line.id = dtl.cle_id;
5081 
5082 
5083  Cursor l_Line_Csr Is
5084  SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
5085         TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
5086         line.inv_rule_id inv_id,
5087         nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
5088         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
5089          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt
5090  FROM okc_k_lines_b line, oks_k_lines_b dtl
5091  WHERE  line.id = dtl.cle_id AND line.Id =  p_top_line_id
5092            AND line.date_cancelled is NULL;
5093 
5094 CURSOR l_line_sll_csr IS
5095          SELECT  sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
5096          sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
5097          sll.interface_offset_days, sll.cle_id, sll.chr_id,
5098          sll.dnz_chr_id,sll.end_date
5099          FROM oks_stream_levels_b sll
5100          WHERE sll.cle_id = p_top_line_id
5101          ORDER BY sll.sequence_no;
5102 
5103 CURSOR l_line_BS_csr(p_line_id  NUMBER) IS
5104          SELECT id, trunc(date_start) date_start,
5105          amount,trunc(date_end) date_end,object_version_number,
5106          date_to_interface, date_transaction
5107          FROM oks_level_elements
5108          WHERE cle_id = p_line_id
5109          ORDER BY date_start;
5110 
5111 
5112 Cursor  l_line_amt_csr (p_id in number) IS
5113 Select  line.price_negotiated
5114 from    okc_k_lines_b line
5115 where   line.id = p_id;
5116 
5117 
5118 l_index                   NUMBER;
5119 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
5120 
5121 l_Line_Sll_rec            l_Line_Sll_Csr%ROWTYPE;
5122 l_line_BS_rec             l_line_BS_csr%ROWTYPE;
5123 l_Line_Csr_Rec            l_Line_Csr%Rowtype;
5124 l_SubLine_Rec             l_subLine_Csr%Rowtype;
5125 l_cp_rec                  Prod_Det_Type;
5126 l_line_rec                Line_Det_Type;
5127 
5128 
5129 L_bil_sch_out_tbl         OKS_BILL_SCH.ItemBillSch_tbl;
5130 l_top_bs_tbl              oks_bill_level_elements_pvt.letv_tbl_type;
5131 l_sll_tbl                 OKS_BILL_SCH.StreamLvl_tbl;
5132 l_update_required         VARCHAR2(1);
5133 l_cp_term_dt              DATE;
5134 l_amount                  NUMBER;
5135 
5136 -------------------------------------------------------------------------
5137 -- Begin partial period computation logic
5138 -- Developer Mani Choudhary
5139 -- Date 04-MAY-2005
5140 -------------------------------------------------------------------------
5141 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
5142 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
5143 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
5144 l_return_status     VARCHAR2(30);
5145 l_tangible          BOOLEAN;
5146 l_pricing_method    VARCHAR2(30);
5147 -------------------------------------------------------------------------
5148 -- End partial period computation logic
5149 -- Date 04-MAY-2005
5150 -------------------------------------------------------------------------
5151 
5152 BEGIN
5153 
5154 ---this is called for the new cp or existing cp which is updated and only for 'T'.
5155 --p_cp_new is 'Y' for new subline, 'N' for updating schedule for existing subline
5156 
5157 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5158 l_update_required := 'N';
5159 
5160 ---get line details
5161 Open l_Line_Csr;
5162 Fetch l_Line_Csr Into l_Line_Csr_Rec;
5163 
5164 If l_Line_Csr%Notfound then
5165     Close l_Line_Csr;
5166     IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
5167         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_bill_sch_cp.EXCEPTION',
5168         'top line not found = ' || p_top_line_id );
5169     END IF;
5170     x_return_status := 'E';
5171      OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
5172     RAISE G_EXCEPTION_HALT_VALIDATION;
5173 End If;
5174 Close l_Line_Csr;
5175 
5176 l_line_rec.chr_id          :=  l_Line_Csr_Rec.chr_id;
5177 l_line_rec.dnz_chr_id      :=  l_Line_Csr_Rec.dnz_chr_id;
5178 l_line_rec.id              :=  l_Line_Csr_Rec.id ;
5179 l_line_rec.lse_id          :=  l_Line_Csr_Rec.lse_id;
5180 l_line_rec.line_start_dt   :=  l_Line_Csr_Rec.line_start_dt;
5181 l_line_rec.line_end_dt     :=  l_Line_Csr_Rec.line_end_dt;
5182 l_line_rec.line_amt        :=  l_Line_Csr_Rec.line_amt ;
5183 -----errorout_ad('line found');
5184  -------------------------------------------------------------------------
5185  -- Begin partial period computation logic
5186  -- Developer Mani Choudhary
5187  -- Date 09-MAY-2005
5188  -------------------------------------------------------------------------
5189 
5190    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
5191                 (
5192                  p_hdr_id        => l_Line_Csr_Rec.dnz_chr_id,
5193                  p_org_id        => NULL,
5194                  x_period_start  => l_period_start,
5195                  x_period_type   => l_period_type,
5196                  x_price_uom     => l_price_uom,
5197                  x_return_status => x_return_status);
5198 
5199    IF x_return_status <> 'S' THEN
5200       RAISE G_EXCEPTION_HALT_VALIDATION;
5201    END IF;
5202   --Description in detail for the business rules for deriving the period start
5203   --1)For usage , period start  will always be 'SERVICE'
5204   --2)For Subscriptions, period start and period type will be NULL
5205   --  for tangible subscriptions as per CR1.For intangible subscriptions,
5206   --  if the profile OKS: Intangible Subscription Pricing Method
5207   --  is set to 'Subscription Based',then period start and period type will be NULL
5208   --  otherwise it will be 'SERVICE'
5209   --3) For Extended Warranty from OM, period start will always be 'SERVICE'
5210 --mchoudha fix for bug#5183011
5211  IF l_period_start IS NOT NULL AND
5212     l_period_type IS NOT NULL
5213  THEN
5214    IF l_line_rec.lse_id = 12 THEN
5215      l_period_start := 'SERVICE';
5216    END IF;
5217    IF l_line_rec.lse_id = 46 THEN
5218      l_tangible  := OKS_SUBSCRIPTION_PUB.is_subs_tangible (l_line_rec.id);
5219      IF l_tangible THEN
5220          l_period_start := NULL;
5221          l_period_type := NULL;
5222      ELSE
5223        l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
5224        IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
5225          l_period_start := NULL;
5226          l_period_type := NULL;
5227        ELSE
5228          l_period_start := 'SERVICE';
5229        END IF;   -- l_pricing_method <> 'EFFECTIVITY'
5230      END IF;     -- IF l_tangible
5231    END IF;       -- l_line_rec.lse_id = 46
5232  END IF;         -- period start and period type are not null
5233  -------------------------------------------------------------------------
5234  -- End partial period computation logic
5235  -- Date 09-MAY-2005
5236  -------------------------------------------------------------------------
5237   IF l_period_type is not null AND l_period_start is not NULL THEN
5238     OPEN l_line_amt_csr(l_Line_Csr_Rec.id);
5239     FETCH l_line_amt_csr INTO l_line_rec.line_amt;
5240     CLOSE l_line_amt_csr;
5241   END IF;
5242 
5243 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5244 
5245    fnd_log.STRING (fnd_log.level_statement,
5246                    G_MODULE_CURRENT || '.create_bill_sch_cp.line_dtls',
5247                       'dnz_chr_id = ' || l_line_rec.dnz_chr_id
5248                    || ', id = ' || l_line_rec.id
5249                    || ', lse_id = ' || l_line_rec.lse_id
5250                    || ', start dt = ' || l_line_rec.line_start_dt
5251                    || ', end dt = ' || l_line_rec.line_end_dt
5252                    || ', amt = ' || l_line_rec.line_amt
5253                    || ', bill_type = ' || l_Line_Csr_Rec.billing_schedule_type
5254                   );
5255 END IF;
5256 
5257 
5258 IF l_Line_Csr_Rec.billing_schedule_type <> 'T' THEN
5259    RETURN;
5260 END IF;
5261 
5262 
5263 
5264 l_index := 1;
5265 ----make sll tbl
5266 l_sll_tbl.DELETE;
5267 
5268 ---make sll tbl
5269 
5270 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
5271 LOOP
5272   l_sll_tbl(l_index).id                             := l_Line_SlL_rec.id;
5273   l_sll_tbl(l_index).cle_id                         := l_Line_SlL_rec.cle_id;
5274 
5275   l_sll_tbl(l_index).chr_id                         := l_Line_SlL_rec.chr_id;
5276   l_sll_tbl(l_index).dnz_chr_id                     := l_Line_SlL_rec.dnz_chr_id;
5277   l_sll_tbl(l_index).uom_code                       := l_Line_SlL_rec.uom_code;
5278   l_sll_tbl(l_index).sequence_no                    := l_Line_SlL_rec.sequence_no;
5279   l_sll_tbl(l_index).Start_Date                     := l_Line_SlL_rec.Start_Date;
5280   IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
5281     l_sll_tbl(l_index).end_Date                     := l_Line_SlL_rec.end_Date;
5282   ELSE
5283     l_update_required := 'Y';
5284 
5285     l_sll_tbl(l_index).end_Date                     := OKC_TIME_UTIL_PUB.get_enddate(
5286                                                           l_Line_SlL_rec.Start_Date,
5287                                                           l_Line_SlL_rec.uom_code,
5288                                                           (l_Line_SlL_rec.level_periods *
5289                                                                    l_Line_SlL_rec.uom_per_period));
5290   END IF;
5291 
5292   l_sll_tbl(l_index).level_periods                  := l_Line_SlL_rec.level_periods;
5293   l_sll_tbl(l_index).uom_per_period                 := l_Line_SlL_rec.uom_per_period;
5294   l_sll_tbl(l_index).level_amount                   := l_Line_SlL_rec.level_amount;
5295   l_sll_tbl(l_index).invoice_offset_days            := l_Line_SlL_rec.invoice_offset_days;
5296   l_sll_tbl(l_index).interface_offset_days          := l_Line_SlL_rec.interface_offset_days;
5297 
5298   l_index := l_index + 1;
5299 END LOOP;
5300 
5301 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5302 
5303         fnd_log.STRING (fnd_log.level_statement,
5304                    G_MODULE_CURRENT || '.create_bill_sch_cp.sll_tbl',
5305                       'top line sll tbl count = ' || l_sll_tbl.count
5306                   );
5307 END IF;
5308 
5309 IF l_sll_tbl.COUNT = 0 THEN
5310    RETURN;
5311 END IF;
5312 
5313 -----errorout_ad('SLL found');
5314 ---for migrated contracts without end date
5315 IF l_update_required = 'Y' THEN
5316    OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id      => p_top_line_id,
5317                                  p_chr_id        => NULL,
5318                                  x_return_status => x_return_status);
5319 
5320    IF x_return_status <> 'S' then
5321      RETURN;
5322    END IF;
5323 END IF;
5324 
5325 
5326 
5327 
5328 --get currency
5329 l_currency_code := Find_Currency_Code(
5330                                     p_cle_id  => p_top_line_id,
5331                                     p_chr_id  => NULL);
5332 
5333 IF l_currency_code IS NULL THEN
5334         OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
5335         x_return_status := 'E';
5336         RAISE G_EXCEPTION_HALT_VALIDATION;
5337 END IF;
5338 
5339 ----get subline
5340 Open l_SubLine_Csr;
5341 FETCH l_SubLine_Csr Into l_SubLine_Rec;
5342 If l_SubLine_Csr%Notfound then
5343     Close l_SubLine_Csr;
5344     x_return_status := 'E';
5345     OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'SUB LINE NOT FOUND');
5346     RAISE G_EXCEPTION_HALT_VALIDATION;
5347 End If;
5348 Close l_SubLine_Csr;
5349 
5350 l_cp_rec.cp_id          :=  l_SubLine_rec.subline_id ;
5351 l_cp_rec.cp_start_dt    :=  l_SubLine_rec.cp_start_dt;
5352 l_cp_rec.cp_end_dt      :=  l_SubLine_rec.cp_end_dt ;
5353 l_cp_rec.cp_amt         :=  l_SubLine_rec.subline_amt ;
5354 l_cp_rec.cp_price_uom   :=  l_subline_rec.price_uom;
5355 l_cp_rec.cp_lse_id      :=  l_subline_rec.cp_lse_id;
5356 
5357 
5358 IF l_period_type is not null AND l_period_start is not NULL THEN
5359     OPEN l_line_amt_csr(l_SubLine_rec.subline_id);
5360     FETCH l_line_amt_csr INTO l_cp_rec.cp_amt;
5361     CLOSE l_line_amt_csr;
5362 END IF;
5363 -----if the subline is update then chk if max_bill_dt = end date and update the price.
5364 IF nvl(p_cp_new,'Y') = 'N' AND l_cp_rec.cp_amt > 0 THEN
5365 
5366    OKS_BILL_UTIL_PUB.Adjust_line_price(
5367                                p_top_line_id   => p_top_line_id,
5368                                p_sub_line_id   => p_cp_line_id ,
5369                                p_end_date      => l_cp_rec.cp_end_dt,
5370                                p_amount        => l_cp_rec.cp_amt,
5371                                p_dnz_chr_id    => l_line_csr_rec.dnz_chr_id,
5372                                x_amount        => l_amount,
5373                                x_return_status => x_return_status);
5374 
5375    l_cp_rec.cp_amt  := l_amount;
5376 END IF;
5377 
5378 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5379 
5380    fnd_log.STRING (fnd_log.level_statement,
5381                    G_MODULE_CURRENT || '.create_bill_sch_cp.cp_dtls',
5382                       'p_cp_new = ' || p_cp_new
5383                    || ', id = ' || l_cp_rec.cp_id
5384                    || ', start dt = ' || l_cp_rec.cp_start_dt
5385                    || ', end dt = ' || l_cp_rec.cp_end_dt
5386                    || ', amt = ' || l_cp_rec.cp_amt
5387                    || ', full credit flag = ' || l_subline_rec.full_credit
5388                   );
5389 END IF;
5390 
5391 
5392 -----errorout_ad('sub line found');
5393 IF nvl(l_SubLine_rec.cp_term_dt,l_SubLine_rec.cp_start_dt) > l_SubLine_rec.cp_end_dt then
5394   RETURN;
5395 END IF;
5396 
5397 ---if full credit flag 'Y',term date to bill_sch_cp as cp start date so that
5398 --level element doesn't get created.
5399 
5400 IF l_subline_rec.cp_term_dt IS NOT NULL AND
5401    nvl(l_subline_rec.full_credit,'N') = 'Y' THEN
5402 
5403    l_cp_term_dt := l_subline_rec.cp_start_dt;
5404 else
5405    l_cp_term_dt := l_subline_rec.cp_term_dt;
5406 END IF;         ---end of full credit chk
5407 
5408 
5409 l_top_bs_tbl.DELETE;
5410 l_index  := 1;
5411 
5412 FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
5413 LOOP
5414   l_top_bs_tbl(l_index).id                     := l_line_BS_rec.id;
5415   l_top_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
5416   l_top_bs_tbl(l_index).date_end               := l_line_BS_rec.date_end;
5417   l_top_bs_tbl(l_index).Amount                 := l_line_BS_rec.amount;
5418   l_top_bs_tbl(l_index).object_version_number  := l_line_BS_rec.object_version_number;
5419   l_top_bs_tbl(l_index).date_transaction   := l_line_BS_rec.date_transaction;
5420   l_top_bs_tbl(l_index).date_to_interface  := l_line_BS_rec.date_to_interface;
5421 
5422   l_index := l_index + 1;
5423 END LOOP;             --top line lvl element
5424 
5425 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5426 
5427         fnd_log.STRING (fnd_log.level_statement,
5428                    G_MODULE_CURRENT || '.create_bill_sch_cp.bs_tbl',
5429                       'top line bs tbl count = ' || l_top_bs_tbl.count
5430                   );
5431 END IF;
5432 
5433 -----errorout_ad('line bs found');
5434 
5435 IF l_top_bs_tbl.COUNT = 0 THEN           ---BS NOT CREATED FOR TOP LINE
5436   OKS_BILL_SCH.Create_Bill_Sch_Rules
5437      (
5438       p_billing_type         => l_Line_Csr_Rec.billing_schedule_type,
5439       p_sll_tbl              => l_sll_tbl,
5440       p_invoice_rule_id      => l_line_csr_rec.inv_id,
5441       x_bil_sch_out_tbl      => l_bil_sch_out_tbl,
5442       x_return_status        => x_return_status);
5443 
5444   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5445            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.call_bs',
5446                        'Create_Bill_Sch_Rules(x_return_status = '||x_return_status ||')');
5447   END IF;
5448 
5449   IF x_return_status <> 'S' THEN
5450      RAISE G_EXCEPTION_HALT_VALIDATION;
5451   END IF;
5452 
5453 else       ----call for cp only
5454 
5455   IF nvl(p_cp_new,'Y') = 'N' THEN
5456      --if cp already has bs then before calling Bill_Sch_Cp, adjust the amt of
5457     ---top line levl elements.
5458 
5459      Adjust_top_BS_Amt( p_Line_Rec          => l_Line_Rec,
5460                         p_SubLine_rec       => l_cp_Rec,
5461                         p_top_line_bs       => l_top_bs_tbl,
5462                         x_return_status     => x_return_status);
5463 
5464     IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5465            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.adjust',
5466                        'adjust_top_bs_amt(x_return_status = '||x_return_status ||')');
5467     END IF;
5468 
5469 
5470      IF x_return_status <> 'S' THEN
5471          RAISE G_EXCEPTION_HALT_VALIDATION;
5472      END IF;
5473 
5474   END IF;
5475 
5476   ----------errorout_ad('calling Bill_Sch_Cp');
5477  --------------------------------------------------------------------------
5478  -- Begin partial period computation logic
5479  -- Developer Mani Choudhary
5480  -- Date 09-MAY-2005
5481  -- Added two new parameters P_period_start,P_period_type in procedural call
5482  ---------------------------------------------------------------------------
5483   Bill_Sch_Cp
5484       (     p_billing_type      => l_Line_Csr_Rec.billing_schedule_type,
5485             p_bsll_tbl          => l_sll_tbl,
5486             p_Line_Rec          => l_Line_Rec,
5487             p_SubLine_rec       => l_cp_Rec,
5488             p_invoice_rulid     => l_line_csr_rec.inv_id,
5489             p_top_line_bs       => l_top_bs_tbl,
5490             p_term_dt           => l_cp_term_dt,
5491             p_period_start      =>  l_period_start,
5492             p_period_type       =>  l_period_type,
5493             x_return_status     => x_return_status);
5494 
5495   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5496            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.cp_bs',
5497                        'Bill_Sch_Cp(x_return_status = '||x_return_status ||')');
5498   END IF;
5499 
5500 
5501 
5502 
5503   IF x_return_status = 'S' then
5504      OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
5505                p_api_version                  => l_api_version,
5506                p_init_msg_list                => l_init_msg_list,
5507                x_return_status                => x_return_status,
5508                x_msg_count                    => x_msg_count,
5509                x_msg_data                     => x_msg_data,
5510                p_letv_tbl                     => l_top_bs_tbl,
5511                x_letv_tbl                     => l_lvl_ele_tbl_out);
5512 
5513      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5514            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_bill_sch_cp.update_top_bs',
5515                        'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status ||')');
5516      END IF;
5517   else
5518 
5519     RAISE G_EXCEPTION_HALT_VALIDATION;
5520   END IF;
5521 
5522 END IF;
5523 
5524 EXCEPTION
5525  WHEN G_EXCEPTION_HALT_VALIDATION THEN
5526       IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
5527         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_bill_sch_cp.EXCEPTION',
5528         'G_EXCEPTION_HALT_VALIDATION');
5529       END IF;
5530 
5531       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
5532         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
5533       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
5534         RAISE OKC_API.G_EXCEPTION_ERROR;
5535       END IF;
5536  WHEN OTHERS THEN
5537       IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
5538         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_bill_sch_cp.UNEXPECTED',
5539                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
5540       END IF;
5541         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
5542                             p_msg_name     => G_UNEXPECTED_ERROR,
5543                             p_token1       => G_SQLCODE_TOKEN,
5544                             p_token1_value => sqlcode,
5545                             p_token2       => G_SQLERRM_TOKEN,
5546                             p_token2_value => sqlerrm);
5547 
5548         x_return_status := G_RET_STS_UNEXP_ERROR;
5549 
5550 END Create_Bill_Sch_CP;
5551 
5552 Procedure Cascade_Dates_SLL
5553 (
5554           p_top_line_id         IN    NUMBER,
5555           x_return_status       OUT   NOCOPY Varchar2,
5556           x_msg_count           OUT   NOCOPY NUMBER,
5557           x_msg_data            OUT   NOCOPY VARCHAR2)
5558 IS
5559 
5560 CURSOR l_line_sll_csr IS
5561        SELECT  sll.Id , sll.sequence_no , sll.start_date, sll.level_periods,
5562        sll.uom_per_period, sll.uom_code, sll.level_amount, sll.invoice_offset_days,
5563        sll.interface_offset_days, sll.cle_id, sll.chr_id,
5564        sll.dnz_chr_id, sll.end_date
5565        FROM oks_stream_levels_b sll
5566        WHERE sll.cle_id = p_top_line_id
5567        ORDER BY sll.sequence_no;
5568 
5569 
5570 Cursor l_Line_Csr Is
5571  SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
5572         TRUNC(line.start_date) start_dt, TRUNC(line.end_date) end_dt,
5573         line.inv_rule_id inv_id,
5574          nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
5575         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
5576          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt
5577  FROM okc_k_lines_b line, oks_k_lines_b dtl
5578  WHERE  line.id = dtl.cle_id AND line.Id =  p_top_line_id ;
5579 
5580 -------------------------------------------------------------------------
5581 -- Begin partial period computation logic
5582 -- Developer Mani Choudhary
5583 -- Date 07-JUN-2005
5584 -- For usage , usage UOM drives the pricing/billing,
5585 -- so adding the usage period in the cursor
5586 --------------------------------------------------------------------------
5587 CURSOR l_usage_type_csr IS
5588        SELECT usage_type,usage_period
5589        FROM  oks_k_lines_b
5590        WHERE  cle_id = p_top_line_id;
5591 
5592 -------------------------------------------------------------------------
5593 -- Begin partial period computation logic
5594 -- Developer Mani Choudhary
5595 -- Date 07-JUN-2005
5596 -- defining a new cursor to fetch the price uom stored for the
5597 -- top line . This is used as the default billing period for the service lines.
5598 --------------------------------------------------------------------------
5599 CURSOR Get_price_uom IS
5600 SELECT price_uom
5601 FROM   OKS_K_LINES_B
5602 WHERE  cle_id = p_top_line_id;
5603 
5604 
5605 
5606 l_sll_tbl                 OKS_BILL_SCH.StreamLvl_tbl;
5607 L_BIL_SCH_OUT_TBL         OKS_BILL_SCH.ItemBillSch_tbl;
5608 
5609 
5610 l_Line_Sll_rec            l_Line_Sll_Csr%ROWTYPE;
5611 l_Line_csr_Rec                l_Line_Csr%Rowtype;
5612 l_line_rec                Line_Det_Type;
5613 
5614 l_period_freq             NUMBER;
5615 l_actual_freq             NUMBER;
5616 l_uom_qty                 NUMBER;
5617 l_index                   NUMBER;
5618 l_sll_tbl_index           NUMBER;
5619 l_sll_start_date          DATE;
5620 l_sll_end_date            DATE;
5621 l_sequence                NUMBER;
5622 l_factor                  NUMBER;
5623 l_next_date               DATE;
5624 l_sll_ind                NUMBER;
5625 l_timeunit                VARCHAR2(20);
5626 l_duration                NUMBER;
5627 l_difference              NUMBER;
5628 l_msg_list                VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
5629 L_UOM_QUANTITY            number;
5630 l_tce_code                VARCHAR2(100);
5631 l_update_end_date         VARCHAR2(1);
5632 l_usage_type              VARCHAR2(40);
5633 l_amount                  NUMBER;
5634  -------------------------------------------------------------------------
5635 -- Begin partial period computation logic
5636 -- Developer Mani Choudhary
5637 -- Date 04-MAY-2005
5638 -- Local variables and cursors defined here required for cascade
5639 ---------------------------------------------------------------------------
5640 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
5641 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
5642 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
5643 l_level_periods     NUMBER;
5644 ---------------------------------------------------------------------------
5645 l_end_date    DATE;  /*Added for ceredian bug 13799709*/
5646 
5647 BEGIN
5648 
5649 --it adjusts the sll and lvl element according to new line start and end date.
5650 
5651 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5652 
5653 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5654 
5655    fnd_log.STRING (fnd_log.level_statement,
5656                    G_MODULE_CURRENT || '.cascade_dates_sll.line_passed',
5657                       'top line id passed = ' || p_top_line_id );
5658 END IF;
5659 
5660 
5661 l_update_end_date   := 'N';
5662 --find billing type of line
5663 
5664 ---get line details
5665 Open l_Line_Csr;
5666 Fetch l_Line_Csr Into l_Line_csr_Rec;
5667 
5668 If l_Line_Csr%Notfound then
5669     Close l_Line_Csr;
5670     x_return_status := 'E';
5671     OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
5672     RAISE G_EXCEPTION_HALT_VALIDATION;
5673 End If;
5674 Close l_Line_Csr;
5675 
5676 
5677 l_line_rec.chr_id          :=  l_Line_Csr_Rec.chr_id;
5678 l_line_rec.dnz_chr_id      :=  l_Line_Csr_Rec.dnz_chr_id;
5679 l_line_rec.id              :=  l_Line_Csr_Rec.id ;
5680 l_line_rec.lse_id          :=  l_Line_Csr_Rec.lse_id;
5681 l_line_rec.line_start_dt   :=  l_Line_Csr_Rec.start_dt;
5682 l_line_rec.line_end_dt     :=  l_Line_Csr_Rec.end_dt;
5683 l_line_rec.line_amt        :=  l_Line_Csr_Rec.line_amt ;
5684 
5685 ------------------------------------------------------------------------
5686 -- Begin partial period computation logic
5687 -- Developer Mani Choudhary
5688 -- Date 04-MAY-2005
5689 -- Fetching the period start and the period type
5690 -------------------------------------------------------------------------
5691 --Fetch the period start and period type stored at the header
5692 IF  l_Line_Csr_Rec.dnz_chr_id is NOT NULL THEN
5693       OKS_RENEW_UTIL_PUB.Get_Period_Defaults
5694                  (
5695                  p_hdr_id        => l_Line_Csr_Rec.dnz_chr_id,
5696                  p_org_id        => NULL,
5697                  x_period_start  => l_period_start,
5698                  x_period_type   => l_period_type,
5699                  x_price_uom     => l_price_uom,
5700                  x_return_status => x_return_status);
5701       IF x_return_status <> 'S' THEN
5702         RAISE G_EXCEPTION_HALT_VALIDATION;
5703       END IF;
5704 END IF;
5705 
5706 IF l_period_start IS NOT NULL AND
5707    l_period_type IS NOT NULL
5708 THEN
5709   OPEN Get_price_uom;
5710   FETCH Get_price_uom into l_price_uom;
5711   CLOSE Get_price_uom;
5712 END IF;
5713 
5714 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5715 
5716    fnd_log.STRING (fnd_log.level_statement,
5717                    G_MODULE_CURRENT || '.cascade_dates_sll.line_dtls',
5718                       'dnz_chr_id = ' || l_line_rec.dnz_chr_id
5719                    || ', id = ' || l_line_rec.id
5720                    || ', lse_id = ' || l_line_rec.lse_id
5721                    || ', start dt = ' || l_line_rec.line_start_dt
5722                    || ', end dt = ' || l_line_rec.line_end_dt
5723                    || ', amt = ' || l_line_rec.line_amt
5724                    || ', bill_type = ' || l_Line_Csr_Rec.billing_schedule_type
5725                   );
5726 END IF;
5727 
5728 
5729 
5730 IF nvl(l_Line_Csr_Rec.billing_schedule_type,'E') <> 'T' then
5731    RETURN;
5732 END IF;
5733 
5734 
5735 ---Code is added to adjust price of sub line if line is shrinked.
5736 --and max billed to = end date then price becomes billed amount
5737 
5738 IF l_Line_Rec.lse_id = 12 THEN
5739    Open l_usage_type_csr;
5740    -------------------------------------------------------------------------
5741    -- Begin partial period computation logic
5742    -- Developer Mani Choudhary
5743    -- Date 07-JUN-2005
5744    -- For usage , usage UOM drives the pricing/billing, so using that
5745    -- period start for usage will be 'SERVICE'
5746    --------------------------------------------------------------------------
5747    Fetch l_usage_type_csr INTO l_usage_type,l_price_uom;
5748    l_period_start := 'SERVICE';
5749    --------------------------------------------------------------------------
5750 
5751    IF l_usage_type_csr%FOUND THEN
5752 
5753 
5754 
5755      IF l_usage_type = 'NPR' THEN
5756         OKS_BILL_UTIL_PUB.Adjust_line_price(
5757                             p_top_line_id      =>  p_top_line_id,
5758                             p_sub_line_id      =>  NULL,
5759                             p_end_date         =>  NULL,
5760                             p_amount           =>  NULL,
5761                             p_dnz_chr_id       =>  l_Line_Rec.dnz_chr_id,
5762                             x_amount           =>  l_amount,
5763                             x_return_status    =>  x_return_status);
5764 
5765      End If;     ------usage type NPR chk
5766 
5767    END IF;             ----  l_usage_type_csr data found chk
5768    Close l_usage_type_csr;
5769 
5770 ELSE          --- LINE lse_id <> 12
5771    OKS_BILL_UTIL_PUB.Adjust_line_price(
5772                             p_top_line_id      =>  p_top_line_id,
5773                             p_sub_line_id      =>  NULL,
5774                             p_end_date         =>  NULL,
5775                             p_amount           =>  NULL,
5776                             p_dnz_chr_id       =>  l_Line_Rec.dnz_chr_id,
5777                             x_amount           =>  l_amount,
5778                             x_return_status    =>  x_return_status);
5779 END IF;
5780 
5781 ----make sll tbl
5782 
5783 l_index := 1;
5784 l_sll_tbl.DELETE;
5785 
5786 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
5787 LOOP
5788   l_sll_tbl(l_index).id                             := l_Line_SlL_rec.id;
5789   l_sll_tbl(l_index).cle_id                         := l_Line_SlL_rec.cle_id;
5790   l_sll_tbl(l_index).chr_id                         := l_Line_SlL_rec.chr_id;
5791   l_sll_tbl(l_index).dnz_chr_id                     := l_Line_SlL_rec.dnz_chr_id;
5792   l_sll_tbl(l_index).uom_code                       := l_Line_SlL_rec.uom_code;
5793   l_sll_tbl(l_index).sequence_no                    := l_Line_SlL_rec.sequence_no;
5794   l_sll_tbl(l_index).Start_Date                     := l_Line_SlL_rec.Start_Date;
5795 
5796   IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
5797      l_sll_tbl(l_index).end_Date                    := l_Line_SlL_rec.end_Date;
5798   ELSE
5799      l_update_end_date   := 'Y';
5800      l_sll_tbl(l_index).end_Date                    := OKC_TIME_UTIL_PUB.get_enddate(
5801                                                           l_Line_SlL_rec.Start_Date,
5802                                                   l_Line_SlL_rec.uom_code,
5803                                                l_Line_SlL_rec.level_periods *  l_Line_SlL_rec.uom_per_period);
5804   END IF;
5805 
5806 
5807 
5808   l_sll_tbl(l_index).level_periods                  := l_Line_SlL_rec.level_periods;
5809   l_sll_tbl(l_index).uom_per_period                 := l_Line_SlL_rec.uom_per_period;
5810   l_sll_tbl(l_index).level_amount                   := l_Line_SlL_rec.level_amount;
5811   l_sll_tbl(l_index).invoice_offset_days             := l_Line_SlL_rec.invoice_offset_days;
5812   l_sll_tbl(l_index).interface_offset_days          := l_Line_SlL_rec.interface_offset_days;
5813 
5814   l_index := l_index + 1;
5815 END LOOP;                   --sll csr end loop
5816 
5817 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5818 
5819         fnd_log.STRING (fnd_log.level_statement,
5820                    G_MODULE_CURRENT || '.cascade_dates_sll.sll_tbl',
5821                       'top line sll tbl count = ' || l_sll_tbl.count
5822                   );
5823 END IF;
5824 
5825 IF l_sll_tbl.COUNT = 0 THEN
5826    RETURN;
5827 END IF;
5828 
5829 IF l_update_end_date = 'Y' THEN          ---Migrated
5830    OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id         => p_top_line_id,
5831                                   p_chr_id          => NULL,
5832                                   x_return_status   => x_return_status);
5833 
5834    IF x_return_status <> 'S' THEN
5835       RETURN;
5836    END IF;
5837 END IF;            ---chk for migrated
5838 
5839 
5840 -----errorout_ad('SLL found');
5841 
5842 
5843 
5844 l_sll_tbl_index := l_sll_tbl.FIRST;
5845 
5846 l_sll_start_date := TRUNC(l_sll_tbl(l_sll_tbl_index).Start_date);
5847 
5848 IF TRUNC(l_sll_start_date) <> l_line_rec.line_start_dt THEN
5849 
5850    ---delete lvl element at one shot as line is not billed if start dt is changing.
5851    Del_sll_lvlelement(
5852                       p_top_line_id          => p_top_line_id,
5853                       x_return_status        => x_return_status,
5854                       x_msg_count            => x_msg_count,
5855                       x_msg_data             => x_msg_data);
5856 
5857     IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5858            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_lvl_ele',
5859                        'Del_sll_lvlelement(x_return_status = '||x_return_status
5860                        ||', line passed = '|| p_top_line_id ||')');
5861     END IF;
5862 
5863 
5864    IF x_return_status <> 'S' THEN
5865      RAISE G_EXCEPTION_HALT_VALIDATION;
5866    END IF;
5867 END IF;           ---sll start dt not same as line start dt
5868 
5869 IF TRUNC(l_sll_start_date) > l_line_rec.line_start_dt THEN
5870   ---add one sll in the starting with uom code got from timeutil pub
5871 
5872    IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5873 
5874         fnd_log.STRING (fnd_log.level_statement,
5875                    G_MODULE_CURRENT || '.cascade_dates_sll.if_stat',
5876                       'sll st dt > line st dt'
5877                       || ', sll st dt = ' || l_sll_start_date
5878                    );
5879    END IF;
5880 
5881    IF l_period_start IS NOT NULL AND
5882       l_period_type IS NOT NULL  AND
5883       l_period_start = 'CALENDAR'
5884    THEN
5885      -- IF(TRUNC(l_sll_start_date,'MM') = TRUNC(l_sll_start_date)) THEN
5886         l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date   => l_line_rec.line_start_dt,
5887                                                        p_end_date     => TRUNC(l_sll_tbl(l_sll_tbl_index).End_date),
5888                                                        p_uom_code     => l_sll_tbl(l_sll_tbl_index).uom_code,
5889                                                        p_period_start => l_period_start);
5890 
5891         l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no;
5892         l_sll_tbl(l_sll_tbl_index).cle_id           := p_top_line_id;
5893         l_sll_tbl(l_sll_tbl_index).chr_id           := NULL;
5894         l_sll_tbl(l_sll_tbl_index).dnz_chr_id       := l_line_rec.dnz_chr_id;
5895         l_sll_tbl(l_sll_tbl_index).sequence_no      := l_sequence;
5896         l_sll_tbl(l_sll_tbl_index).start_date       := l_line_rec.line_start_dt;
5897         l_sll_tbl(l_sll_tbl_index).end_date         := TRUNC(l_sll_tbl(l_sll_tbl_index).End_date);
5898         l_sll_tbl(l_sll_tbl_index).level_periods     := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
5899         l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
5900                          p_start_date    => l_sll_tbl(l_sll_tbl_index).start_date,
5901                          p_uom_code      => l_sll_tbl(l_sll_tbl_index).uom_code,
5902                          p_duration      => l_sll_tbl(l_sll_tbl_index).uom_per_period,
5903                          p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
5904         IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
5905            l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods  + 1;
5906         END IF;
5907         l_sll_tbl(l_sll_tbl_index).uom_per_period   := l_sll_tbl(l_sll_tbl_index).uom_per_period;
5908         l_sll_tbl(l_sll_tbl_index).uom_code         := l_sll_tbl(l_sll_tbl_index).uom_code;
5909         l_sll_tbl(l_sll_tbl_index).level_amount     :=
5910                                  l_sll_tbl(l_sll_tbl_index).level_amount;
5911         l_sll_tbl(l_sll_tbl_index).invoice_offset_days :=
5912                           l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
5913         l_sll_tbl(l_sll_tbl_index).interface_offset_days         :=
5914                        l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
5915 
5916      -- ELSE --sll start date not first day of calendar month
5917 
5918    ELSE --period start and period type are null
5919       --existing logic
5920       ----Commented the above code for bug 13799709
5921      /* OKC_TIME_UTIL_PUB.get_duration(
5922             p_start_date    => l_line_rec.line_start_dt,
5923             p_end_date      => l_sll_start_date - 1,
5924             x_duration      => l_duration,
5925             x_timeunit      => l_timeunit,
5926             x_return_status => x_return_status);
5927 
5928     --mchoudha bug#5076095 added to_char for the dates in the following
5929     --fnd_log statement
5930       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5931          fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.sll_duration',
5932                        'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
5933                        ||', end date in MM/DD/YYYY HH24:MI:SS = ' || to_char(l_sll_start_date - 1,'MM/DD/YYYY HH24:MI:SS')
5934                       ||', st date MM/DD/YYYY HH24:MI:SS ='|| to_char(l_line_rec.line_start_dt,'MM/DD/YYYY HH24:MI:SS')
5935                        ||', returned timeunit and duration = ' ||l_duration || '-' || l_timeunit ||')');
5936       END IF;
5937 
5938 
5939 
5940       IF x_return_status <> 'S' THEN
5941         RAISE G_EXCEPTION_HALT_VALIDATION;
5942       END IF;
5943 
5944       OKS_BILL_UTIL_PUB.get_seeded_timeunit(
5945              p_timeunit      => l_timeunit,
5946              x_return_status => x_return_status,
5947              x_quantity      => l_uom_quantity ,
5948              x_timeunit      => l_tce_code);
5949 
5950       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5951          fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.seeded',
5952                        'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
5953                        ||', returned timeunit and qty = ' ||l_tce_code || '-' || l_uom_quantity ||')');
5954       END IF;
5955 
5956       l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no - 1;
5957 
5958       l_sll_tbl(0).cle_id                        := p_top_line_id;
5959       l_sll_tbl(0).chr_id                        := NULL;
5960       l_sll_tbl(0).dnz_chr_id                    := l_line_rec.dnz_chr_id;
5961       l_sll_tbl(0).sequence_no                   := l_sequence;
5962       l_sll_tbl(0).start_date                    := l_line_rec.line_start_dt;
5963       l_sll_tbl(0).end_date                      := TRUNC(l_sll_start_date) - 1;
5964 
5965       IF l_tce_code = 'DAY' AND l_uom_quantity = 1 THEN
5966          l_sll_tbl(0).level_periods                 := 1;
5967          l_sll_tbl(0).uom_per_period                := l_duration;
5968       ELSE
5969          l_sll_tbl(0).level_periods                 := l_duration;
5970          l_sll_tbl(0).uom_per_period                := 1;
5971       END IF;
5972 
5973       l_sll_tbl(0).uom_code                      := l_timeunit;   */
5974 ----Commented the above code for bug 13799709
5975   /*Added for bug 14047785--enhaced bug for 13799709*/
5976   OKS_BILL_UTIL_PUB.get_seeded_timeunit(
5977              p_timeunit      => l_sll_tbl(l_sll_tbl_index).uom_code,
5978              x_return_status => x_return_status,
5979              x_quantity      => l_uom_quantity ,
5980              x_timeunit      => l_tce_code);
5981 
5982       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
5983          fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.seeded',
5984                        'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
5985                        ||', returned timeunit and qty = ' ||l_tce_code || '-' || l_uom_quantity ||')');
5986       END IF;
5987 
5988       l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no - 1;
5989 
5990       l_sll_tbl(0).cle_id                        := p_top_line_id;
5991       l_sll_tbl(0).chr_id                        := NULL;
5992       l_sll_tbl(0).dnz_chr_id                    := l_line_rec.dnz_chr_id;
5993       l_sll_tbl(0).sequence_no                   := l_sequence;
5994       l_sll_tbl(0).start_date                    := l_line_rec.line_start_dt;
5995 
5996 
5997             l_uom_qty := nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1) * nvl(l_uom_quantity,1);
5998 
5999             l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6000                                (p_tce_code      => l_tce_code,
6001                                 p_fr_start_date => l_line_rec.line_start_dt,
6002                                 p_fr_end_date   => TRUNC(l_sll_start_date) - 1,
6003                                 p_uom_quantity  => l_uom_qty,
6004                                 x_return_status => x_return_status);
6005 
6006             IF x_return_status <> 'S' THEN
6007               RAISE G_EXCEPTION_HALT_VALIDATION;
6008             END IF;
6009 
6010             l_period_freq := ceil(l_period_freq);
6011 
6012 
6013          l_end_date := OKC_TIME_UTIL_PUB.get_enddate(
6014                 l_line_rec.line_start_dt,
6015                 l_sll_tbl(l_sll_tbl_index).uom_code,
6016                 (l_sll_tbl(l_sll_tbl_index).uom_per_period  * l_period_freq ));
6017 
6018           l_sll_tbl(0).level_periods                 := l_period_freq;
6019           l_sll_tbl(0).uom_per_period             := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6020           l_sll_tbl(0).uom_code                      := l_sll_tbl(l_sll_tbl_index).uom_code;
6021           l_sll_tbl(0).end_date                        := l_end_date ;
6022 
6023      If l_end_date <> TRUNC(l_sll_start_date) - 1 then
6024 
6025          l_sll_tbl(0).end_date                      := TRUNC(l_sll_start_date) - 1;
6026 
6027          OKC_TIME_UTIL_PUB.get_duration(
6028             p_start_date    => l_line_rec.line_start_dt,
6029             p_end_date      => l_sll_start_date - 1,
6030             x_duration      => l_duration,
6031             x_timeunit      => l_timeunit,
6032             x_return_status => x_return_status);
6033 
6034              IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
6035                 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6036               ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
6037                 RAISE OKC_API.G_EXCEPTION_ERROR;
6038               END IF;
6039 
6040               OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6041                 p_timeunit      => l_timeunit,
6042                 x_return_status => x_return_status,
6043                 x_quantity      => l_uom_quantity ,
6044                 x_timeunit      => l_tce_code);
6045 
6046               l_uom_qty := nvl(l_duration,1) * nvl(l_uom_quantity,1);
6047 
6048               l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6049                                (p_tce_code      => l_tce_code,
6050                                 p_fr_start_date => l_line_rec.line_start_dt,
6051                                 p_fr_end_date   => l_sll_start_date - 1,
6052                                 p_uom_quantity  => l_uom_qty,
6053                                 x_return_status => x_return_status);
6054 
6055             IF x_return_status <> 'S' THEN
6056               RAISE G_EXCEPTION_HALT_VALIDATION;
6057             END IF;
6058 
6059             l_period_freq := ceil(l_period_freq);
6060 
6061             l_sll_tbl(0).level_periods      := l_period_freq;
6062             l_sll_tbl(0).uom_per_period     := l_duration;
6063             l_sll_tbl(0).uom_code           := l_timeunit;
6064 
6065                IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6066 
6067              fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.create_dates_sll.st_end_seed',
6068                        'After okc_time_util_pub.get_frequency(x_return_status = '||x_return_status
6069                        ||', l_period_freq = '|| l_period_freq
6070                        ||', l_duration = ' || l_duration ||',l_timeunit = '||l_timeunit ||')');
6071 
6072                END IF;
6073 
6074         END IF;
6075       /*Added for ceredian bug 13799709*/
6076 
6077       l_sll_tbl(0).level_amount                  := l_sll_tbl(l_sll_tbl_index).level_amount;
6078       l_sll_tbl(0).invoice_offset_days            := l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
6079       l_sll_tbl(0).interface_offset_days         := l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
6080 
6081 
6082    END IF; --period start and period type ar not null
6083 
6084    IF l_sequence < 1 then
6085 
6086       l_factor :=  -(l_sequence - 1);
6087       l_sequence := l_sequence + l_factor;
6088 
6089       FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
6090       LOOP
6091          l_sll_tbl(l_sll_tbl_index).sequence_no   := l_sequence;
6092          l_sequence := l_sequence + 1;
6093       END LOOP;
6094    END IF;
6095 
6096    l_next_date := l_line_rec.line_start_dt;
6097 
6098    -----errorout_ad('l_sll_tbl.FIRST = ' || l_sll_tbl.FIRST);
6099 
6100    FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
6101    LOOP
6102       l_sll_tbl(l_sll_tbl_index).start_date     := TRUNC(l_next_date);
6103 
6104      -------------------------------------------------------------------------
6105      -- Begin partial period computation logic
6106      -- Developer Mani Choudhary
6107      -- Date 08-JUN-2005
6108      -- Derive the next billing date by calling the get_enddate_cal
6109      -------------------------------------------------------------------------
6110      IF l_period_start IS NOT NULL   AND
6111         l_period_type  IS NOT NULL   AND
6112         l_period_start = 'CALENDAR'
6113      THEN
6114        l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6115                          p_start_date    => l_sll_tbl(l_sll_tbl_index).start_date,
6116                          p_uom_code      => l_sll_tbl(l_sll_tbl_index).uom_code,
6117                          p_duration      => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6118                          p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6119 
6120      ELSE
6121        --existing logic
6122        l_next_date := OKC_TIME_UTIL_PUB.get_enddate(
6123                l_sll_tbl(l_sll_tbl_index).start_date,
6124                     l_sll_tbl(l_sll_tbl_index).uom_code,
6125                   (l_sll_tbl(l_sll_tbl_index).level_periods * l_sll_tbl(l_sll_tbl_index).uom_per_period));
6126      END IF;
6127      --------------------------------------------------------------------------------
6128       l_sll_tbl(l_sll_tbl_index).end_date     := TRUNC(l_next_date);
6129 
6130       l_next_date := l_next_date + 1;
6131    END LOOP;
6132 
6133 
6134 ELSIF TRUNC(l_sll_start_date) < l_line_rec.line_start_dt THEN        ---LINE START DATE is pushed forward
6135 
6136    IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6137 
6138         fnd_log.STRING (fnd_log.level_statement,
6139                    G_MODULE_CURRENT || '.cascade_dates_sll.chk_sll_dt',
6140                       'sll st dt < line st dt - line start date is pushed forward'
6141                       || ', sll st dt = ' || l_sll_start_date
6142                    );
6143    END IF;
6144 
6145    l_strm_lvl_tbl_in.delete;
6146    l_sll_ind := 1;
6147    l_sll_tbl_index := l_sll_tbl.FIRST ;
6148 
6149    -----errorout_ad('l_sll_start_date = '|| l_sll_start_date);
6150 
6151    ----delete first sll till sll start dt >= line start dt
6152 
6153    WHILE TRUNC(l_sll_start_date) < l_line_rec.line_start_dt AND l_sll_tbl.count > 0
6154    LOOP
6155 
6156       ----GET END DATE FOR THE sll
6157       l_sll_tbl_index := l_sll_tbl.FIRST ;
6158 
6159       l_sll_start_date := TRUNC(l_sll_tbl(l_sll_tbl_index).end_date) + 1;
6160 
6161       IF TRUNC(l_sll_tbl(l_sll_tbl_index).end_date) < l_line_rec.line_start_dt THEN
6162          ---put the sll in the table for deletion
6163          -----errorout_ad('added in delete sll tbl');
6164 
6165          l_strm_lvl_tbl_in(l_sll_ind).id := l_sll_tbl(l_sll_tbl_index).id;
6166          l_sll_ind := l_sll_ind + 1;
6167 
6168          l_sll_tbl.DELETE(l_sll_tbl_index);
6169 
6170       END IF;
6171    END LOOP;       --while end loop
6172 
6173    IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6174 
6175         fnd_log.STRING (fnd_log.level_statement,
6176                    G_MODULE_CURRENT || '.cascade_dates_sll.sll_after_delete',
6177                       'sll count after deleting sll where sll end date < line start date'
6178                       || ', sll count = ' || l_sll_tbl.count
6179                    );
6180    END IF;
6181 
6182    IF l_strm_lvl_tbl_in.COUNT > 0 THEN
6183 
6184 
6185      OKS_SLL_PVT.delete_row(
6186             p_api_version        => l_api_version,
6187             p_init_msg_list      => l_msg_list,
6188             x_return_status      => x_return_status,
6189             x_msg_count          => x_msg_count,
6190             x_msg_data           => x_msg_data,
6191             p_sllv_tbl           => l_strm_lvl_tbl_in);
6192 
6193      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6194            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_sll',
6195                        'oks_sll_pvt.delete_row(x_return_status = '||x_return_status
6196                        ||', sll passed for delete = '|| l_strm_lvl_tbl_in.count ||')');
6197      END IF;
6198 
6199 
6200      IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
6201        RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6202      ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
6203        RAISE OKC_API.G_EXCEPTION_ERROR;
6204      END IF;
6205    END IF;
6206 
6207    IF l_sll_tbl.count > 0 then
6208 
6209 
6210      l_sll_tbl_index := l_sll_tbl.FIRST;
6211 
6212      l_sll_start_date := l_sll_tbl(l_sll_tbl_index).start_date;
6213      -----errorout_ad('l_sll_start_date after deleting = ' || l_sll_start_date);
6214      -----errorout_ad('first sll st dt = ' || l_sll_start_date || ' and line st dt = ' || l_line_rec.line_start_dt);
6215 
6216      IF l_line_rec.line_start_dt > TRUNC(l_sll_start_date) THEN
6217 
6218         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6219 
6220            fnd_log.STRING (fnd_log.level_statement,
6221                    G_MODULE_CURRENT || '.cascade_dates_sll.after_sll_del',
6222                       'after sll  delete line start date > sll start date'
6223                       || ', sll dt = ' || l_sll_start_date
6224                    );
6225         END IF;
6226 
6227 
6228         l_sll_tbl_index := l_sll_tbl.FIRST ;
6229 
6230         l_sll_end_date := l_sll_tbl(l_sll_tbl_index).end_date ;
6231 
6232         -------------------------------------------------------------------------
6233         -- Begin partial period computation logic
6234         -- Developer Mani Choudhary
6235         -- Date 08-JUN-2005
6236         -- Modify the current SLL to have SLL start date as line start date and
6237         -- SLL end date as current end date of SLL
6238         -------------------------------------------------------------------------
6239         IF l_period_start IS NOT NULL   AND
6240            l_period_type  IS NOT NULL    AND
6241            l_period_start = 'CALENDAR'
6242         THEN
6243           l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6244                                                        p_end_date     => l_sll_end_date,
6245                                                        p_uom_code     => l_sll_tbl(l_sll_tbl_index).uom_code,
6246                                                        p_period_start => l_period_start);
6247 
6248           l_sll_tbl(l_sll_tbl_index).start_date       := l_line_rec.line_start_dt;
6249           l_sll_tbl(l_sll_tbl_index).end_date         := l_sll_end_date;
6250           l_sll_tbl(l_sll_tbl_index).level_periods     := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
6251           l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6252                          p_start_date    => l_sll_tbl(l_sll_tbl_index).start_date,
6253                          p_uom_code      => l_sll_tbl(l_sll_tbl_index).uom_code,
6254                          p_duration      => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6255                          p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6256           IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
6257              l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods  + 1;
6258           END IF;
6259 
6260         ELSE --existing logic in this else block
6261           ----in migration not migrating sll end date so chk for old data
6262           IF l_sll_end_date IS NULL THEN
6263              IF l_sll_tbl_index < l_sll_tbl.LAST THEN
6264                 l_sll_end_date  := l_sll_tbl(l_sll_tbl_index + 1).start_date + 1;
6265 
6266              ELSE
6267                l_sll_end_date := OKC_TIME_UTIL_PUB.get_enddate(
6268                               l_sll_tbl(l_sll_tbl_index).start_date,
6269                               l_sll_tbl(l_sll_tbl_index).uom_code,
6270                               (l_sll_tbl(l_sll_tbl_index).level_periods * l_sll_tbl(l_sll_tbl_index).uom_per_period));
6271              END IF;      --- chk for last sll
6272 
6273           END IF;            ---end of sll end date null
6274 
6275            -----errorout_ad('l_sll_end_date = ' || l_sll_end_date);
6276 
6277            ----find out the periods between line start date and SLL end date
6278 
6279           OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6280              p_timeunit      => l_sll_tbl(l_sll_tbl_index).uom_code,
6281              x_return_status => x_return_status,
6282              x_quantity      => l_uom_quantity ,
6283              x_timeunit      => l_tce_code);
6284 
6285           IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6286            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.cascade_dates_sll.seed',
6287                        'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6288                        ||', returned timeunit and qty = ' ||l_tce_code || '-' || l_uom_quantity ||')');
6289           END IF;
6290 
6291           IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
6292              RAISE G_EXCEPTION_HALT_VALIDATION;
6293           END IF;
6294           --mchoudha for bug#4860210
6295           --  IF l_tce_code = 'DAY' THEN
6296 
6297           --   l_period_freq := (l_sll_end_date - l_line_rec.line_start_dt) + 1;
6298 
6299           --  IF nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1) = 1 THEN
6300           --    l_sll_tbl(l_sll_tbl_index).uom_per_period   := l_period_freq;
6301           --  ELSE
6302           --    l_actual_freq := nvl(l_period_freq,0)/nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1);
6303 
6304            --   l_actual_freq := ceil(l_actual_freq);
6305 
6306             --  l_sll_tbl(l_sll_tbl_index).level_periods  := l_actual_freq;
6307 
6308            -- END IF;
6309 
6310          -- ELSE         ----not day
6311 
6312             l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6313                             (p_tce_code      => l_tce_code,
6314                              p_fr_start_date => l_line_rec.line_start_dt,
6315                              p_fr_end_date   => l_sll_end_date,
6316                              p_uom_quantity  => l_uom_quantity,
6317                              x_return_status => x_return_status);
6318 
6319             IF x_return_status <> 'S' THEN
6320                RAISE G_EXCEPTION_HALT_VALIDATION;
6321             END IF;
6322             -----errorout_ad('l_period_freq = ' || l_period_freq);
6323             l_actual_freq := nvl(l_period_freq,0)/nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1);
6324 
6325            -- l_actual_freq := ceil(l_period_freq);
6326             l_actual_freq := ceil(l_actual_freq);
6327             -----errorout_ad('l_actual_freq = ' || l_actual_freq);
6328             -----errorout_ad('l_sll_tbl_index  of sll rec changing = ' || l_sll_tbl_index);
6329             l_sll_tbl(l_sll_tbl_index).level_periods  := l_actual_freq;
6330 
6331 
6332          -- END IF;         -------not day
6333 
6334           IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6335 
6336            fnd_log.STRING (fnd_log.level_statement,
6337                    G_MODULE_CURRENT || '.cascade_dates_sll.sll_add',
6338                       'sll added after deleting sll where sll_end_dt < line_start_dt');
6339           END IF;
6340 
6341         END IF; --period type and period start are not null
6342      END IF; --l_line_rec.line_start_dt > TRUNC(l_sll_start_date)
6343 
6344      l_next_date := l_line_rec.line_start_dt;
6345 
6346      FOR l_sll_tbl_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
6347      LOOP
6348         l_sll_tbl(l_sll_tbl_index).start_date     := TRUNC(l_next_date);
6349      -------------------------------------------------------------------------
6350      -- Begin partial period computation logic
6351      -- Developer Mani Choudhary
6352      -- Date 08-JUN-2005
6353      -- Derive the next billing date by calling the get_enddate_cal
6354      -------------------------------------------------------------------------
6355      IF l_period_start IS NOT NULL   AND
6356         l_period_type  IS NOT NULL   AND
6357         l_period_start = 'CALENDAR'
6358      THEN
6359        l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6360                          p_start_date    => l_sll_tbl(l_sll_tbl_index).start_date,
6361                          p_uom_code      => l_sll_tbl(l_sll_tbl_index).uom_code,
6362                          p_duration      => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6363                          p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6364 
6365       /*added for bug 13799709 by spingali */
6366 
6367         l_sll_tbl(l_sll_tbl_index).end_date     := TRUNC(l_next_date);
6368 
6369       /*added for bug 13799709 by spingali */
6370 
6371 
6372      ELSE
6373         --Existing logic
6374         l_next_date := OKC_TIME_UTIL_PUB.get_enddate(
6375                 l_sll_tbl(l_sll_tbl_index).start_date,
6376                 l_sll_tbl(l_sll_tbl_index).uom_code,
6377                 (l_sll_tbl(l_sll_tbl_index).uom_per_period * l_sll_tbl(l_sll_tbl_index).level_periods));
6378 
6379        /*added for bug 13799709 by spingali */
6380 
6381         l_sll_tbl(l_sll_tbl_index).end_date     := TRUNC(l_next_date);
6382 
6383         IF l_sll_tbl(l_sll_tbl_index).end_date > l_line_rec.line_END_dt  and  (l_period_start IS  NULL  AND  l_period_type  IS NULL) THEN
6384 
6385           l_sll_tbl(l_sll_tbl_index).end_date :=l_line_rec.line_END_dt;
6386 
6387         END IF;     /*(If  l_sll_tbl(l_sll_tbl_index).end_date > l_line_rec.line_END_dt ) Check Endif*/
6388 
6389         /*added for bug 13799709 by spingali*/
6390 
6391      END IF;
6392      ---------------------------------------------------------------------------------
6393          l_next_date := l_next_date + 1;
6394 
6395      END LOOP;
6396 
6397 
6398 
6399   ELSE                    ---sll tbl count = 0 after deletion
6400 
6401     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6402 
6403            fnd_log.STRING (fnd_log.level_statement,
6404                    G_MODULE_CURRENT || '.cascade_dates_sll.sll_cnt',
6405                       'sll count zero after deleting sll where sll_end_dt < line_start_dt');
6406     END IF;
6407 
6408 
6409 
6410       OKC_TIME_UTIL_PUB.get_duration(
6411              p_start_date    => l_line_rec.line_start_dt,
6412              p_end_date      => l_line_rec.line_end_dt,
6413              x_duration      => l_duration,
6414              x_timeunit      => l_timeunit,
6415              x_return_status => x_return_status);
6416 
6417       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6418            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.duration',
6419                        'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
6420                        ||', l_duration = '|| l_duration
6421                        ||', l_timeunit = ' || l_timeunit ||')');
6422       END IF;
6423 
6424       IF x_return_status <> 'S' THEN
6425          RAISE G_EXCEPTION_HALT_VALIDATION;
6426       END IF;
6427 
6428       OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6429                 p_timeunit      => l_timeunit,
6430                 x_return_status => x_return_status,
6431                 x_quantity      => l_uom_quantity ,
6432                 x_timeunit      => l_tce_code);
6433 
6434       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6435            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.call_seed',
6436                        'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6437                        ||', l_uom_quantity = '|| l_uom_quantity
6438                        ||', l_tce_code = ' || l_tce_code ||')');
6439       END IF;
6440 
6441     -------------------------------------------------------------------------
6442     -- Begin partial period computation logic
6443     -- Developer Mani Choudhary
6444     -- Date 08-JUN-2005
6445     -- Create one SLL line start date to line end date
6446     -------------------------------------------------------------------------
6447     IF l_period_start IS NOT NULL   AND
6448        l_period_type  IS NOT NULL    AND
6449        l_period_start = 'CALENDAR'
6450     THEN
6451        IF l_price_uom IS NULL THEN
6452           l_price_uom := l_timeunit;
6453        END IF;
6454        l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6455                                                       p_end_date     => l_line_rec.line_end_dt,
6456                                                       p_uom_code     => l_price_uom,
6457                                                       p_period_start => l_period_start);
6458 
6459        l_sll_tbl(1).cle_id           := p_top_line_id;
6460        l_sll_tbl(1).chr_id           := NULL;
6461        l_sll_tbl(1).dnz_chr_id       := l_line_rec.dnz_chr_id;
6462        l_sll_tbl(1).sequence_no      := 1;
6463        l_sll_tbl(1).start_date       := l_line_rec.line_start_dt;
6464        l_sll_tbl(1).end_date         := l_line_rec.line_end_dt;
6465        l_sll_tbl(1).level_periods     := l_level_periods;
6466        l_sll_tbl(1).uom_per_period   := 1;
6467        l_sll_tbl(1).uom_code         := l_price_uom;
6468        l_sll_tbl(1).level_amount     := NULL;
6469        l_sll_tbl(1).invoice_offset_days := NULL;
6470        l_sll_tbl(1).interface_offset_days := NULL;
6471 
6472     ELSE --existing logic in this else block
6473 
6474       l_sll_tbl(1).cle_id                        := p_top_line_id;
6475       l_sll_tbl(1).chr_id                        := NULL;
6476       l_sll_tbl(1).dnz_chr_id                    := l_line_rec.dnz_chr_id;
6477       l_sll_tbl(1).sequence_no                   := 1;
6478       l_sll_tbl(1).start_date                    := l_line_rec.line_start_dt;
6479       l_sll_tbl(1).end_date                      := l_line_rec.line_end_dt;
6480 
6481       IF l_tce_code = 'DAY' AND l_uom_quantity = 1 THEN
6482         l_sll_tbl(1).level_periods                 := 1;
6483         l_sll_tbl(1).uom_per_period                := l_duration;
6484       ELSE
6485         l_sll_tbl(1).level_periods                 := l_duration;
6486         l_sll_tbl(1).uom_per_period                := 1;
6487       END IF;
6488 
6489       l_sll_tbl(1).uom_code                      := l_timeunit;
6490       l_sll_tbl(1).level_amount                  := NULL;
6491       l_sll_tbl(1).invoice_offset_days           := NULL ;
6492       l_sll_tbl(1).interface_offset_days         := NULL ;
6493 
6494       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6495 
6496          fnd_log.STRING (fnd_log.level_statement,
6497                    G_MODULE_CURRENT || '.cascade_dates_sll.sll_one',
6498                       'sll added count one');
6499       END IF;
6500     END IF;  --period start and period type not null
6501   END IF; --sll count = 0
6502 
6503 END IF;
6504 
6505 
6506 
6507 ----find end date of last SLL
6508 
6509 IF l_sll_tbl.COUNT > 0 THEN
6510 
6511   l_sll_tbl_index := l_sll_tbl.LAST;
6512 
6513   l_sll_start_date := l_sll_tbl(l_sll_tbl_index).start_date;
6514   l_sll_END_date := l_sll_tbl(l_sll_tbl_index).end_date;
6515   l_sll_start_date := l_sll_END_date + 1;
6516 ELSE
6517   RETURN;
6518 
6519 end if;
6520 
6521 
6522 
6523   IF TRUNC(l_sll_END_date) < l_line_rec.line_END_dt THEN          ---LINE date extended
6524 
6525     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6526 
6527       fnd_log.STRING (fnd_log.level_statement,
6528                    G_MODULE_CURRENT || '.cascade_dates_sll.chk_end_dt',
6529                       'sll end dt < line_end_dt'
6530                    || ', sl end dt = ' || l_sll_END_date);
6531     END IF;
6532 
6533     IF l_sll_tbl.COUNT > 0 THEN
6534 
6535         -------------------------------------------------------------------------
6536         -- Begin partial period computation logic
6537         -- Developer Mani Choudhary
6538         -- Date 08-JUN-2005
6539         -- Modify the current SLL to have SLL start date as line start date and
6540         -- SLL end date as current end date of SLL
6541         -------------------------------------------------------------------------
6542         IF l_period_start IS NOT NULL   AND
6543            l_period_type  IS NOT NULL    AND
6544            l_period_start = 'CALENDAR'
6545         THEN
6546           l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_sll_tbl(l_sll_tbl_index).start_date,
6547                                                        p_end_date     => l_line_rec.line_END_dt,
6548                                                        p_uom_code     => l_sll_tbl(l_sll_tbl_index).uom_code,
6549                                                        p_period_start => l_period_start);
6550 
6551           l_sll_tbl(l_sll_tbl_index).cle_id           := p_top_line_id;
6552           l_sll_tbl(l_sll_tbl_index).chr_id           := NULL;
6553           l_sll_tbl(l_sll_tbl_index).dnz_chr_id       := l_line_rec.dnz_chr_id;
6554           l_sll_tbl(l_sll_tbl_index).sequence_no      := l_sll_tbl(l_sll_tbl_index).sequence_no;
6555           l_sll_tbl(l_sll_tbl_index).start_date       :=  l_sll_tbl(l_sll_tbl_index).start_date;
6556           l_sll_tbl(l_sll_tbl_index).end_date         := l_line_rec.line_END_dt;
6557           l_sll_tbl(l_sll_tbl_index).level_periods     := ceil(l_level_periods/l_sll_tbl(l_sll_tbl_index).uom_per_period);
6558           l_next_date := OKS_BILL_UTIL_PUB.Get_Enddate_Cal(
6559                          p_start_date    => l_sll_tbl(l_sll_tbl_index).start_date,
6560                          p_uom_code      => l_sll_tbl(l_sll_tbl_index).uom_code,
6561                          p_duration      => l_sll_tbl(l_sll_tbl_index).uom_per_period,
6562                          p_level_periods => l_sll_tbl(l_sll_tbl_index).level_periods);
6563           IF l_next_date < l_sll_tbl(l_sll_tbl_index).end_date THEN
6564              l_sll_tbl(l_sll_tbl_index).level_periods := l_sll_tbl(l_sll_tbl_index).level_periods  + 1;
6565           END IF;
6566         --  l_sll_tbl(l_sll_tbl_index).uom_per_period   := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6567          -- l_sll_tbl(l_sll_tbl_index).uom_code         := l_price_uom;
6568           l_sll_tbl(l_sll_tbl_index).level_amount     :=
6569                                  l_sll_tbl(l_sll_tbl_index).level_amount;
6570           l_sll_tbl(l_sll_tbl_index).invoice_offset_days :=
6571                           l_sll_tbl(l_sll_tbl_index).invoice_offset_days ;
6572           l_sll_tbl(l_sll_tbl_index).interface_offset_days         :=
6573                        l_sll_tbl(l_sll_tbl_index).interface_offset_days ;
6574 
6575         ELSE --existing logic in this else block
6576 
6577 
6578           OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6579                 p_timeunit      => l_sll_tbl(l_sll_tbl_index).uom_code,
6580                 x_return_status => x_return_status,
6581                 x_quantity      => l_uom_quantity ,
6582                 x_timeunit      => l_tce_code);
6583 
6584           IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6585            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.st_end_seed',
6586                        'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6587                        ||', l_uom_quantity = '|| l_uom_quantity
6588                        ||', l_tce_code = ' || l_tce_code ||')');
6589           END IF;
6590 
6591 
6592 
6593           IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
6594             RAISE G_EXCEPTION_HALT_VALIDATION;
6595           END IF;
6596         --mchoudha for bug#4860210
6597         --  IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6598 
6599          --    l_period_freq := (l_line_rec.line_END_dt - l_sll_start_date) + 1;
6600          -- ELSE
6601           -----errorout_ad('l_sll_start_date of new sll to be inserted = '|| l_sll_start_date);
6602 
6603             l_uom_qty := nvl(l_sll_tbl(l_sll_tbl_index).uom_per_period,1) * nvl(l_uom_quantity,1);
6604 
6605             l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6606                                (p_tce_code      => l_tce_code,
6607                                 p_fr_start_date => l_sll_start_date,
6608                                 p_fr_end_date   => l_line_rec.line_END_dt,
6609                                 p_uom_quantity  => l_uom_qty,
6610                                 x_return_status => x_return_status);
6611 
6612             IF x_return_status <> 'S' THEN
6613               RAISE G_EXCEPTION_HALT_VALIDATION;
6614             END IF;
6615 
6616             l_period_freq := ceil(l_period_freq);
6617 
6618 
6619          -- END IF;
6620 
6621           l_sequence := l_sll_tbl(l_sll_tbl_index).sequence_no + 1;
6622 
6623           -----errorout_ad('l_sequence of sll inserted = ' || l_sequence);
6624           -----errorout_ad('l_sll_tbl_index at time of inserting record = ' || l_sll_tbl_index );
6625 
6626           l_sll_tbl(l_sll_tbl_index + 1).sequence_no         := l_sequence;
6627           l_sll_tbl(l_sll_tbl_index + 1).start_date          := TRUNC(l_sll_start_date);
6628 
6629 
6630 
6631          -- IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6632          --   l_sll_tbl(l_sll_tbl_index + 1).level_periods      := '1';
6633          --   l_sll_tbl(l_sll_tbl_index + 1).uom_per_period     := l_period_freq;
6634          --   l_sll_tbl(l_sll_tbl_index + 1).end_date           := l_line_rec.line_end_dt;
6635          -- ELSE
6636             l_sll_tbl(l_sll_tbl_index + 1).level_periods      := l_period_freq;
6637             l_sll_tbl(l_sll_tbl_index + 1).uom_per_period     := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6638             l_sll_tbl(l_sll_tbl_index + 1).uom_code               := l_sll_tbl(l_sll_tbl_index).uom_code;
6639 
6640 
6641             l_sll_tbl(l_sll_tbl_index + 1).end_date := OKC_TIME_UTIL_PUB.get_enddate(
6642                                                    l_sll_start_date,
6643                                                    l_sll_tbl(l_sll_tbl_index).uom_code,
6644                                                    l_period_freq * l_sll_tbl(l_sll_tbl_index).uom_per_period);
6645 
6646              /*added for bug 13799709 by spingali */
6647        IF l_sll_tbl(l_sll_tbl_index + 1).end_date > l_line_rec.line_END_dt THEN
6648 
6649           l_sll_tbl(l_sll_tbl_index + 1).end_date :=l_line_rec.line_END_dt;
6650 
6651 
6652 
6653           OKC_TIME_UTIL_PUB.get_duration(
6654             p_start_date    => l_sll_tbl(l_sll_tbl_index + 1).start_date,
6655             p_end_date      => l_sll_tbl(l_sll_tbl_index + 1).end_date,
6656             x_duration      => l_duration,
6657             x_timeunit      => l_timeunit,
6658             x_return_status => x_return_status);
6659 
6660               IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
6661                 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6662               ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
6663                 RAISE OKC_API.G_EXCEPTION_ERROR;
6664               END IF;
6665 
6666               OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6667                 p_timeunit      => l_timeunit,
6668                 x_return_status => x_return_status,
6669                 x_quantity      => l_uom_quantity ,
6670                 x_timeunit      => l_tce_code);
6671 
6672               l_uom_qty := nvl(l_duration,1) * nvl(l_uom_quantity,1);
6673 
6674               l_period_freq := OKS_BILL_UTIL_PUB.get_frequency
6675                                (p_tce_code      => l_tce_code,
6676                                 p_fr_start_date => l_sll_start_date,
6677                                 p_fr_end_date   => l_line_rec.line_END_dt,
6678                                 p_uom_quantity  => l_uom_qty,
6679                                 x_return_status => x_return_status);
6680 
6681             IF x_return_status <> 'S' THEN
6682               RAISE G_EXCEPTION_HALT_VALIDATION;
6683             END IF;
6684 
6685             l_period_freq := ceil(l_period_freq);
6686 
6687             l_sll_tbl(l_sll_tbl_index + 1).level_periods      := l_period_freq;
6688             l_sll_tbl(l_sll_tbl_index + 1).uom_per_period     := l_duration;
6689             l_sll_tbl(l_sll_tbl_index + 1).uom_code           := l_timeunit;
6690 
6691                IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6692 
6693              fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.create_dates_sll.st_end_seed',
6694                        'After okc_time_util_pub.get_frequency(x_return_status = '||x_return_status
6695                        ||', l_period_freq = '|| l_period_freq
6696                        ||', l_duration = ' || l_duration ||',l_timeunit = '||l_timeunit ||')');
6697 
6698                END IF;
6699 
6700           END IF;
6701 
6702             /*added for bug 13799709 by spingali*/
6703 
6704          -- END IF;
6705 
6706           l_sll_tbl(l_sll_tbl_index + 1).invoice_offset_days     := l_sll_tbl(l_sll_tbl_index).invoice_offset_days;
6707           l_sll_tbl(l_sll_tbl_index + 1).interface_offset_days  := l_sll_tbl(l_sll_tbl_index).interface_offset_days;
6708           l_sll_tbl(l_sll_tbl_index + 1).level_amount           := l_sll_tbl(l_sll_tbl_index).level_amount;
6709           l_sll_tbl(l_sll_tbl_index + 1).cle_id                 := l_sll_tbl(l_sll_tbl_index ).cle_id ;
6710           l_sll_tbl(l_sll_tbl_index + 1).chr_id                 := l_sll_tbl(l_sll_tbl_index ).chr_id  ;
6711           l_sll_tbl(l_sll_tbl_index + 1).dnz_chr_id             := l_sll_tbl(l_sll_tbl_index ).dnz_chr_id;
6712 
6713           IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6714 
6715            fnd_log.STRING (fnd_log.level_statement,
6716                    G_MODULE_CURRENT || '.cascade_dates_sll.all_sll_end',
6717                       'added sll when sll end dt < line_end_dt');
6718           END IF;
6719 
6720         END IF;    --period start and period type are not null
6721    ELSE            ---sll tbl count = 0
6722 
6723 
6724       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6725 
6726         fnd_log.STRING (fnd_log.level_statement,
6727                    G_MODULE_CURRENT || '.cascade_dates_sll.sll_zero',
6728                       'sll count zero');
6729       END IF;
6730 
6731 
6732       OKC_TIME_UTIL_PUB.get_duration(
6733              p_start_date    => l_line_rec.line_start_dt,
6734              p_end_date      => l_line_rec.line_end_dt,
6735              x_duration      => l_duration,
6736              x_timeunit      => l_timeunit,
6737              x_return_status => x_return_status);
6738 
6739       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6740            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.sll_duration',
6741                        'okc_time_util_pub.get_duration(x_return_status = '||x_return_status
6742                        ||', l_duration = '|| l_duration
6743                        ||', l_timeunit = ' || l_timeunit ||')');
6744       END IF;
6745 
6746 
6747       IF x_return_status <> 'S' THEN
6748          RAISE G_EXCEPTION_HALT_VALIDATION;
6749       END IF;
6750 
6751       OKS_BILL_UTIL_PUB.get_seeded_timeunit(
6752                 p_timeunit      => l_timeunit,
6753                 x_return_status => x_return_status,
6754                 x_quantity      => l_uom_quantity ,
6755                 x_timeunit      => l_tce_code);
6756 
6757       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6758            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.end_seed',
6759                        'okc_time_util_pub.get_seeded_timeunit(x_return_status = '||x_return_status
6760                        ||', l_uom_quantity = '|| l_uom_quantity
6761                        ||', l_tce_code = ' || l_tce_code ||')');
6762        END IF;
6763 
6764     -------------------------------------------------------------------------
6765     -- Begin partial period computation logic
6766     -- Developer Mani Choudhary
6767     -- Date 08-JUN-2005
6768     -- Create one SLL line start date to line end date
6769     -------------------------------------------------------------------------
6770     IF l_period_start IS NOT NULL   AND
6771        l_period_type  IS NOT NULL    AND
6772        l_period_start = 'CALENDAR'
6773     THEN
6774        IF l_price_uom IS NULL THEN
6775           l_price_uom := l_timeunit;
6776        END IF;
6777        l_level_periods:=OKS_BILL_UTIL_PUB.Get_Periods(p_start_date => l_line_rec.line_start_dt,
6778                                                       p_end_date     => l_line_rec.line_end_dt,
6779                                                       p_uom_code     => l_price_uom,
6780                                                       p_period_start => l_period_start);
6781 
6782        l_sll_tbl(1).cle_id           := p_top_line_id;
6783        l_sll_tbl(1).chr_id           := NULL;
6784        l_sll_tbl(1).dnz_chr_id       := l_line_rec.dnz_chr_id;
6785        l_sll_tbl(1).sequence_no      := 1;
6786        l_sll_tbl(1).start_date       := l_line_rec.line_start_dt;
6787        l_sll_tbl(1).end_date         := l_line_rec.line_end_dt;
6788        l_sll_tbl(1).level_periods     := l_level_periods;
6789        l_sll_tbl(1).uom_per_period   := 1;
6790        l_sll_tbl(1).uom_code         := l_price_uom;
6791        l_sll_tbl(1).level_amount     := NULL;
6792        l_sll_tbl(1).invoice_offset_days := NULL;
6793        l_sll_tbl(1).interface_offset_days := NULL;
6794 
6795     ELSE --existing logic in this else block
6796 
6797 
6798       l_sequence := 1;
6799       l_sll_tbl_index := 0;
6800 
6801 
6802       l_sll_tbl(l_sll_tbl_index).sequence_no         := l_sequence;
6803       l_sll_tbl(l_sll_tbl_index).start_date          := l_line_rec.line_start_dt;
6804       l_sll_tbl(l_sll_tbl_index).end_date           := l_line_rec.line_end_dt;
6805 
6806 
6807 
6808       IF l_tce_code = 'DAY' AND nvl(l_uom_quantity,1) = 1 THEN
6809         l_sll_tbl(l_sll_tbl_index ).level_periods      := '1';
6810         l_sll_tbl(l_sll_tbl_index ).uom_per_period     := l_period_freq;
6811 
6812       ELSE
6813         l_sll_tbl(l_sll_tbl_index ).level_periods      := l_period_freq;
6814         l_sll_tbl(l_sll_tbl_index ).uom_per_period     := l_sll_tbl(l_sll_tbl_index).uom_per_period;
6815 
6816 
6817       END IF;
6818 
6819       l_sll_tbl(l_sll_tbl_index).uom_code               := l_timeunit;
6820       l_sll_tbl(l_sll_tbl_index).cle_id                 := l_line_rec.id ;
6821       l_sll_tbl(l_sll_tbl_index).chr_id                 := null;
6822       l_sll_tbl(l_sll_tbl_index).dnz_chr_id             := l_line_rec.dnz_chr_id;
6823 
6824       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6825 
6826          fnd_log.STRING (fnd_log.level_statement,
6827                    G_MODULE_CURRENT || '.cascade_dates_sll.sll_one_end',
6828                       'sll added count one');
6829       END IF;
6830 
6831     END IF;         --period start and period type are not null
6832   END IF;           -----sll tbl count
6833 
6834 
6835 --no changes for partial period calendar in this case
6836 ELSIF TRUNC(l_sll_END_date) > l_line_rec.line_END_dt THEN          ---LINE END DATE SHRINKED.
6837 
6838    IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6839 
6840          fnd_log.STRING (fnd_log.level_statement,
6841                    G_MODULE_CURRENT || '.cascade_dates_sll.chk_end_dt',
6842                       'sll end dt > line end dt'
6843                      ||', sll end dt = ' || l_sll_END_date );
6844    END IF;
6845 
6846    IF l_sll_tbl.count = 0 then
6847      RETURN;
6848    END IF;
6849 
6850    l_sll_tbl_index := l_sll_tbl.LAST;
6851    l_sll_start_date := l_sll_tbl(l_sll_tbl_index ).start_date;
6852 
6853    l_strm_lvl_tbl_in.DELETE;
6854    l_sll_ind := 1;
6855 
6856    WHILE l_line_rec.line_END_dt < TRUNC(l_sll_start_date) AND l_sll_tbl.COUNT > 0
6857    LOOP
6858 
6859       l_strm_lvl_tbl_in(l_sll_ind).id := l_sll_tbl(l_sll_tbl_index).id;
6860       l_sll_ind := l_sll_ind + 1;
6861 
6862       l_sll_tbl.DELETE(l_sll_tbl_index);
6863 
6864       l_sll_tbl_index := l_sll_tbl.LAST;
6865       l_sll_start_date := l_sll_tbl(l_sll_tbl_index ).start_date;
6866    END LOOP;
6867 
6868    IF l_strm_lvl_tbl_in.COUNT > 0 THEN
6869       FOR l_sll_ind IN l_strm_lvl_tbl_in.FIRST .. l_strm_lvl_tbl_in.LAST
6870       LOOP
6871 
6872          OKS_BILL_UTIL_PUB.delete_level_elements (
6873                                  p_api_version     => l_api_version,
6874                                  p_rule_id         => l_strm_lvl_tbl_in(l_sll_ind).id,
6875                                  p_init_msg_list   => l_msg_list,
6876                                  x_msg_count       => x_msg_count,
6877                                  x_msg_data        => x_msg_data,
6878                                  x_return_status   => x_return_status );
6879 
6880          IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6881            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.del_last_sll',
6882                        'oks_bill_util_pub.delete_level_elements(x_return_status = '||x_return_status
6883                        ||', sll id passed = '|| l_strm_lvl_tbl_in(l_sll_ind).id ||')');
6884          END IF;
6885 
6886 
6887 
6888       END LOOP;
6889       IF x_return_status <> 'S' THEN
6890          RAISE G_EXCEPTION_HALT_VALIDATION;
6891       END IF;
6892 
6893    END IF;
6894 
6895 /*added for bug 13799709 by spingali */
6896 
6897    IF l_sll_start_date < l_line_rec.line_END_dt AND (l_period_start is null and l_period_type is null) THEN
6898 
6899       l_sll_tbl(l_sll_tbl_index).end_date     := l_line_rec.line_END_dt;
6900 
6901    END IF;
6902 
6903   /*added for bug 13799709 by spingali */
6904 
6905 END IF;
6906 
6907 IF l_sll_tbl.COUNT > 0 THEN
6908 
6909   OKS_BILL_SCH.Create_Bill_Sch_Rules
6910      (p_billing_type         => l_line_csr_rec.billing_schedule_type,
6911       p_sll_tbl              => l_sll_tbl,
6912       p_invoice_rule_id      => l_line_csr_rec.inv_id,
6913       x_bil_sch_out_tbl      => l_bil_sch_out_tbl,
6914       x_return_status        => x_return_status);
6915 
6916   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
6917            fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.create_dates_sll.call_bs',
6918                        'oks_bill_sch.Create_Bill_Sch_Rules(x_return_status = '||x_return_status ||')');
6919   END IF;
6920 
6921   IF x_return_status <> 'S' THEN
6922      RAISE G_EXCEPTION_HALT_VALIDATION;
6923   END IF;
6924 END IF;
6925 
6926 
6927 
6928 EXCEPTION
6929  WHEN G_EXCEPTION_HALT_VALIDATION THEN
6930 
6931        IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
6932         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.create_dates_sll.EXCEPTION',
6933                     'G_EXCEPTION_HALT_VALIDATION');
6934        END IF;
6935 
6936       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
6937         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
6938       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
6939         RAISE OKC_API.G_EXCEPTION_ERROR;
6940       END IF;
6941  WHEN OTHERS THEN
6942 
6943        IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
6944         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.create_dates_sll.UNEXPECTED',
6945                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
6946        END IF;
6947 
6948         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
6949                             p_msg_name     => G_UNEXPECTED_ERROR,
6950                             p_token1       => G_SQLCODE_TOKEN,
6951                             p_token1_value => sqlcode,
6952                             p_token2       => G_SQLERRM_TOKEN,
6953                             p_token2_value => sqlerrm);
6954 
6955         x_return_status := G_RET_STS_UNEXP_ERROR;
6956 
6957 END Cascade_Dates_SLL;
6958 
6959 
6960 
6961 
6962 PROCEDURE Del_sll_lvlelement(p_top_line_id          IN  NUMBER,
6963                              x_return_status        OUT NOCOPY VARCHAR2,
6964                              x_msg_count            OUT NOCOPY NUMBER,
6965                              x_msg_data             OUT NOCOPY VARCHAR2)
6966 
6967 IS
6968 ----will delete all lvlelements for top and cp
6969 ---and delete sll of all cp.
6970 
6971 
6972 BEGIN
6973 x_return_status := 'S';
6974 
6975 
6976 ----delete lvl elements for cp
6977 DELETE FROM   OKS_LEVEL_ELEMENTS
6978 WHERE cle_id IN (SELECT id
6979        FROM  OKC_K_LINES_B cp
6980        WHERE cp.cle_id = p_top_line_id
6981        and cp.lse_id in (35,7,8,9,10,11,13,18,25));
6982 
6983 
6984 
6985 --------delete lvl elemets for top line
6986 DELETE FROM OKS_LEVEL_ELEMENTS
6987 WHERE  cle_id  = p_top_line_id;
6988 
6989 
6990 ---delete sll of all cp
6991 
6992 DELETE FROM OKS_STREAM_LEVELS_B
6993 WHERE cle_id IN ( select id
6994                   FROM okc_k_lines_b cp
6995                   WHERE cp.cle_id = p_top_line_id
6996                   and cp.lse_id in (35,7,8,9,10,11,13,18,25));
6997 
6998 
6999 
7000 EXCEPTION
7001   WHEN OTHERS THEN
7002 
7003     IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7004         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.del_sll_lvlelement.UNEXPECTED',
7005                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7006     END IF;
7007     OKC_API.SET_MESSAGE(p_app_name         => G_APP_NAME_OKC,
7008                             p_msg_name     => G_UNEXPECTED_ERROR,
7009                             p_token1       => G_SQLCODE_TOKEN,
7010                             p_token1_value => sqlcode,
7011                             p_token2       => G_SQLERRM_TOKEN,
7012                             p_token2_value => sqlerrm);
7013 
7014     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7015 
7016 END Del_sll_lvlelement;
7017 
7018 
7019 PROCEDURE Adjust_top_BS_Amt(
7020                         p_Line_Rec          IN     Line_Det_Type,
7021                         p_SubLine_rec       IN     Prod_Det_Type,
7022                         p_top_line_bs       IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
7023                         x_return_status     OUT    NOCOPY VARCHAR2)
7024 IS
7025 
7026 CURSOR l_cp_BS_csr(p_cp_id  NUMBER) IS
7027          SELECT id, trunc(date_start) date_start,
7028          amount, trunc(date_end) date_end
7029          FROM oks_level_elements element
7030          WHERE cle_id = p_cp_id
7031          ORDER by date_start;
7032 
7033 l_cp_BS_rec          l_cp_BS_csr%ROWTYPE;
7034 l_cp_bs_tbl          oks_bill_level_elements_pvt.letv_tbl_type;
7035 l_index              number;
7036 l_top_bs_ind         number;
7037 l_cp_bs_ind          number;
7038 
7039 
7040 BEGIN
7041 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7042 
7043 l_cp_bs_tbl.DELETE;
7044 l_index  := 1;
7045 
7046 FOR l_cp_BS_rec IN l_cp_BS_csr(p_SubLine_rec.cp_id)
7047 LOOP
7048   l_cp_bs_tbl(l_index).id              := l_cp_BS_rec.id;
7049   l_cp_bs_tbl(l_index).date_start      := l_cp_BS_rec.date_start;
7050   l_cp_bs_tbl(l_index).date_end        := l_cp_BS_rec.date_end;
7051   l_cp_bs_tbl(l_index).Amount          := l_cp_BS_rec.amount;
7052 
7053   l_index := l_index + 1;
7054 END LOOP;
7055 
7056 IF l_cp_bs_tbl.COUNT <= 0 THEN
7057    RETURN;
7058 END IF;
7059 
7060 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
7061 l_top_bs_ind := p_top_line_bs.FIRST;
7062 -----errorout_ad('top line bs first = ' || l_top_bs_ind);
7063 
7064 WHILE TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) > TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) AND
7065              l_top_bs_ind < p_top_line_bs.LAST
7066 LOOP
7067     l_top_bs_ind := p_top_line_bs.NEXT(l_top_bs_ind);
7068 END LOOP;
7069 
7070 -----errorout_ad('after while loop in adj = ' || l_top_bs_ind);
7071 ---chk first cp bs.st_dt if between previous and present record
7072 
7073 
7074 IF l_top_bs_ind = p_top_line_bs.first THEN
7075    NULL;
7076 
7077 ELSIF  l_top_bs_ind <= p_top_line_bs.LAST THEN
7078 
7079   l_top_bs_ind := l_top_bs_ind - 1;
7080   IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= p_top_line_bs(l_top_bs_ind  ).DATE_START
7081       AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= p_top_line_bs(l_top_bs_ind ).DATE_end THEN
7082 
7083                     NULL;
7084   ELSE
7085       l_top_bs_ind := l_top_bs_ind + 1;
7086   END IF;
7087 
7088 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) THEN
7089        NULL;
7090 
7091 end if;
7092 
7093 
7094 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
7095 LOOP
7096 
7097  IF l_top_bs_ind  <= p_top_line_bs.LAST THEN
7098 
7099     p_top_line_bs(l_top_bs_ind).amount := nvl(p_top_line_bs(l_top_bs_ind).amount,0) - nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
7100     l_top_bs_ind  := l_top_bs_ind + 1;
7101 
7102  END IF;
7103 END LOOP;
7104 
7105 
7106 EXCEPTION
7107  WHEN G_EXCEPTION_HALT_VALIDATION THEN
7108       IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
7109         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_top_bs_amt.EXCEPTION',
7110                     'G_EXCEPTION_HALT_VALIDATION');
7111        END IF;
7112 
7113       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
7114         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7115       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
7116         RAISE OKC_API.G_EXCEPTION_ERROR;
7117       END IF;
7118  WHEN OTHERS THEN
7119 
7120        IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7121         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_top_bs_amt.UNEXPECTED',
7122                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7123        END IF;
7124 
7125         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
7126                             p_msg_name     => G_UNEXPECTED_ERROR,
7127                             p_token1       => G_SQLCODE_TOKEN,
7128                             p_token1_value => sqlcode,
7129                             p_token2       => G_SQLERRM_TOKEN,
7130                             p_token2_value => sqlerrm);
7131 
7132         x_return_status := G_RET_STS_UNEXP_ERROR;
7133 
7134 end Adjust_top_BS_Amt;
7135 
7136 
7137 
7138 Procedure Update_OM_SLL_Date
7139 (
7140           p_top_line_id         IN    NUMBER,
7141           x_return_status       OUT   NOCOPY Varchar2,
7142           x_msg_count           OUT   NOCOPY NUMBER,
7143           x_msg_data            OUT   NOCOPY VARCHAR2)
7144 IS
7145 
7146 CURSOR l_line_sll_csr IS
7147        SELECT id, cle_id, chr_id, dnz_chr_id , uom_code,
7148               sequence_no, Start_Date, end_Date, level_periods,
7149               uom_per_period, level_amount, invoice_offset_days, interface_offset_days
7150        FROM OKs_stream_levels_b
7151        WHERE cle_id = p_top_line_id
7152        ORDER BY sequence_no;
7153 
7154 
7155 Cursor l_Line_Csr Is
7156  SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
7157         TRUNC(line.start_date) start_dt,line.inv_rule_id inv_rule_id,
7158         nvl(trunc(line.date_terminated - 1),TRUNC(line.end_date)) end_dt,
7159         nvl(dtl.billing_schedule_type,'T') billing_schedule_type,
7160         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
7161          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt
7162  FROM okc_k_lines_b line, oks_k_lines_b dtl
7163  WHERE  line.id = dtl.cle_id AND line.Id =  p_top_line_id ;
7164 
7165 
7166 
7167 
7168 l_sll_tbl                 OKS_BILL_SCH.StreamLvl_tbl;
7169 L_BIL_SCH_OUT_TBL         OKS_BILL_SCH.ItemBillSch_tbl;
7170 l_inv_id                  number;
7171 
7172 l_Line_Sll_rec            l_Line_Sll_Csr%ROWTYPE;
7173 l_Line_Rec                l_Line_Csr%Rowtype;
7174 
7175 
7176 l_index                   NUMBER;
7177 l_sll_tbl_index           NUMBER;
7178 l_timeunit                VARCHAR2(20);
7179 l_duration                NUMBER;
7180 L_UOM_QUANTITY            number;
7181 l_tce_code                VARCHAR2(100);
7182 
7183 l_msg_list                VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
7184 
7185 
7186 
7187 BEGIN
7188 
7189 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7190 
7191 ---get line details
7192 Open l_Line_Csr;
7193 Fetch l_Line_Csr Into l_Line_Rec;
7194 
7195 If l_Line_Csr%Notfound then
7196     Close l_Line_Csr;
7197     x_return_status := 'E';
7198     OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
7199     RAISE G_EXCEPTION_HALT_VALIDATION;
7200 End If;
7201 Close l_Line_Csr;
7202 
7203 
7204 IF l_line_rec.billing_schedule_type <> 'T' then
7205    RETURN;
7206 END IF;
7207 
7208 ----make sll tbl
7209 
7210 l_index := 1;
7211 l_sll_tbl.DELETE;
7212 
7213 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
7214 LOOP
7215   l_sll_tbl(l_index).id                             := l_Line_SlL_rec.id;
7216   l_sll_tbl(l_index).cle_id                         := l_Line_SlL_rec.cle_id;
7217   l_sll_tbl(l_index).chr_id                         := l_Line_SlL_rec.chr_id;
7218   l_sll_tbl(l_index).dnz_chr_id                     := l_Line_SlL_rec.dnz_chr_id;
7219   l_sll_tbl(l_index).uom_code                       := l_Line_SlL_rec.uom_code;
7220   l_sll_tbl(l_index).sequence_no                    := l_Line_SlL_rec.sequence_no;
7221   l_sll_tbl(l_index).Start_Date                     := l_Line_SlL_rec.Start_Date;
7222   l_sll_tbl(l_index).end_Date                       := l_Line_SlL_rec.end_Date;
7223   l_sll_tbl(l_index).level_periods                  := l_Line_SlL_rec.level_periods;
7224   l_sll_tbl(l_index).uom_per_period                 := l_Line_SlL_rec.uom_per_period;
7225   l_sll_tbl(l_index).level_amount                   := l_Line_SlL_rec.level_amount;
7226   l_sll_tbl(l_index).invoice_offset_days            := l_Line_SlL_rec.invoice_offset_days;
7227   l_sll_tbl(l_index).interface_offset_days          := l_Line_SlL_rec.interface_offset_days;
7228 
7229   l_index := l_index + 1;
7230 END LOOP;
7231 
7232 
7233 IF l_sll_tbl.COUNT = 0 THEN
7234    x_return_status := 'E';
7235     OKC_API.SET_MESSAGE (
7236              p_app_name        => G_PKG_NAME,
7237              p_msg_name        => 'OKS_SLL_NOT_EXISTS');
7238 
7239    RAISE G_EXCEPTION_HALT_VALIDATION;
7240 END IF;
7241 
7242 
7243 -----errorout_ad('SLL found');
7244 
7245 
7246 
7247 
7248 l_sll_tbl_index := l_sll_tbl.FIRST;
7249 
7250 Del_sll_lvlelement(
7251                    p_top_line_id          => p_top_line_id,
7252                    x_return_status        => x_return_status,
7253                    x_msg_count            => x_msg_count,
7254                    x_msg_data             => x_msg_data);
7255 
7256 IF x_return_status <> 'S' THEN
7257    RAISE G_EXCEPTION_HALT_VALIDATION;
7258 END IF;
7259 
7260 OKC_TIME_UTIL_PUB.get_duration(
7261            p_start_date    => l_line_rec.start_dt,
7262            p_end_date      => l_line_rec.end_dt,
7263            x_duration      => l_duration,
7264            x_timeunit      => l_timeunit,
7265            x_return_status => x_return_status);
7266 
7267 
7268 IF x_return_status <> 'S' THEN
7269    RAISE G_EXCEPTION_HALT_VALIDATION;
7270 END IF;
7271 
7272 OKS_BILL_UTIL_PUB.get_seeded_timeunit(
7273               p_timeunit      => l_timeunit,
7274               x_return_status => x_return_status,
7275               x_quantity      => l_uom_quantity ,
7276               x_timeunit      => l_tce_code);
7277 
7278 l_sll_tbl(l_sll_tbl_index).start_date           := l_line_rec.start_dt;
7279 l_sll_tbl(l_sll_tbl_index).end_date             := l_line_rec.end_dt;
7280 l_sll_tbl(l_sll_tbl_index).level_periods        := '1';
7281 l_sll_tbl(l_sll_tbl_index).uom_per_period       := l_duration;
7282 l_sll_tbl(l_sll_tbl_index).uom_code             := l_timeunit;
7283 
7284 
7285 
7286 
7287 IF l_sll_tbl.COUNT > 0 THEN
7288 
7289   OKS_BILL_SCH.Create_Bill_Sch_Rules
7290      (p_billing_type         => l_line_rec.billing_schedule_type,
7291       p_sll_tbl              => l_sll_tbl,
7292       p_invoice_rule_id      => l_line_rec.inv_rule_id,
7293       x_bil_sch_out_tbl      => l_bil_sch_out_tbl,
7294       x_return_status        => x_return_status);
7295 
7296   IF x_return_status <> 'S' THEN
7297      RAISE G_EXCEPTION_HALT_VALIDATION;
7298   END IF;
7299 END IF;
7300 
7301 
7302 
7303 EXCEPTION
7304  WHEN G_EXCEPTION_HALT_VALIDATION THEN
7305       IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
7306         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.update_om_sll_date.EXCEPTION',
7307                     'G_EXCEPTION_HALT_VALIDATION');
7308       END IF;
7309 
7310       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
7311         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7312       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
7313         RAISE OKC_API.G_EXCEPTION_ERROR;
7314       END IF;
7315  WHEN OTHERS THEN
7316       IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7317         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.update_om_sll_date.UNEXPECTED',
7318                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7319        END IF;
7320 
7321         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
7322                             p_msg_name     => G_UNEXPECTED_ERROR,
7323                             p_token1       => G_SQLCODE_TOKEN,
7324                             p_token1_value => sqlcode,
7325                             p_token2       => G_SQLERRM_TOKEN,
7326                             p_token2_value => sqlerrm);
7327 
7328         x_return_status := G_RET_STS_UNEXP_ERROR;
7329 
7330 END Update_OM_SLL_Date;
7331 
7332 PROCEDURE Del_rul_elements(p_top_line_id          IN  NUMBER,
7333                              x_return_status      OUT NOCOPY VARCHAR2,
7334                              x_msg_count          OUT NOCOPY  NUMBER,
7335                              x_msg_data           OUT NOCOPY VARCHAR2)
7336 
7337 IS
7338 
7339 
7340 ----will delete all lvlelements for top and cp
7341 ---and delete sll of top line and all cp.
7342 ---make billing schedule type null for all cp.
7343 
7344 
7345 
7346 BEGIN
7347 x_return_status := 'S';
7348 
7349 
7350 ----delete lvl elements for cp
7351 DELETE FROM   OKS_LEVEL_ELEMENTS
7352 WHERE  cle_id IN (SELECT cp.id
7353        FROM OKC_k_LINES_B cp
7354        WHERE cp.cle_id = p_top_line_id
7355        and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7356 
7357 
7358 --------delete lvl elemets for top line
7359 DELETE FROM OKS_LEVEL_ELEMENTS
7360 WHERE  cle_id = p_top_line_id;
7361 
7362 
7363 ---delete sll of cp
7364 
7365 delete FROM OKS_STREAM_LEVELS_B
7366 WHERE cle_id IN (SELECT id
7367        FROM OKC_k_LINES_B cp
7368        WHERE  cp.cle_id = p_top_line_id
7369        and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7370 
7371 --DELETE sll of top line
7372 
7373 delete FROM OKS_STREAM_LEVELS_B
7374 WHERE  cle_id = p_top_line_id;
7375 
7376 --update billing type to null for cp
7377 UPDATE oks_k_lines_b
7378 set billing_schedule_type = NULL
7379 WHERE cle_id IN (SELECT id
7380        FROM OKC_k_LINES_B cp
7381        WHERE  cp.cle_id = p_top_line_id
7382        and cp.lse_id in (35,7,8,9,10,11,13,18,25));
7383 
7384 
7385 
7386 EXCEPTION
7387   WHEN OTHERS THEN
7388      IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
7389         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.del_rul_elements.UNEXPECTED',
7390                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
7391      END IF;
7392 
7393     OKC_API.SET_MESSAGE(p_app_name         => G_APP_NAME_OKC,
7394                             p_msg_name     => G_UNEXPECTED_ERROR,
7395                             p_token1       => G_SQLCODE_TOKEN,
7396                             p_token1_value => sqlcode,
7397                             p_token2       => G_SQLERRM_TOKEN,
7398                             p_token2_value => sqlerrm);
7399 
7400     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7401 
7402 
7403 END Del_rul_elements;
7404 
7405 
7406 ---delete sll of subline and refresh the lvl amt of top line for 'Top Level' billing
7407 PROCEDURE Del_subline_lvl_rule(p_top_line_id        IN  NUMBER,
7408                               p_sub_line_id         IN  NUMBER,
7409                               x_return_status       OUT NOCOPY VARCHAR2,
7410                               x_msg_count           OUT NOCOPY  NUMBER,
7411                               x_msg_data            OUT NOCOPY VARCHAR2)
7412 IS
7413 ----will delete all lvlelements for  cp
7414 ---and delete sll of cp.
7415 --update amount of lvl element of top line
7416 --UPDATE billing type of subline to null.
7417 
7418 CURSOR l_line_BS_csr IS
7419          SELECT id, trunc(date_start) date_start,
7420          amount, TRUNC(DATE_end) date_end, object_version_number
7421          FROM oks_level_elements
7422          WHERE cle_id = p_top_line_id
7423          ORDER BY date_start;
7424 
7425 CURSOR l_cp_BS_csr IS
7426          SELECT id, trunc(date_start) date_start,
7427          amount
7428          FROM oks_level_elements
7429          WHERE cle_id = p_sub_line_id
7430          ORDER BY date_start;
7431 
7432 
7433 
7434 
7435 CURSOR l_bill_type_csr IS
7436        SELECT nvl(billing_schedule_type,'T') billing_schedule_type
7437        FROM oks_k_lines_b
7438        WHERE cle_id = p_sub_line_id;
7439 
7440 
7441 
7442 
7443 l_line_BS_rec        l_line_BS_csr%ROWTYPE;
7444 l_cp_BS_rec          l_cp_BS_csr%ROWTYPE;
7445 l_bill_type_rec      l_bill_type_csr%ROWTYPE;
7446 
7447 
7448 
7449 l_top_bs_tbl         oks_bill_level_elements_pvt.letv_tbl_type;
7450 l_cp_bs_tbl          oks_bill_level_elements_pvt.letv_tbl_type;
7451 x_letv_tbl           oks_bill_level_elements_pvt.letv_tbl_type;
7452 
7453 
7454 i                    NUMBER := 0;
7455 l_index              NUMBER := 0;
7456 l_cp_bs_ind          NUMBER;
7457 l_top_bs_ind         NUMBER;
7458 
7459 l_api_Version              Number      := 1;
7460 l_init_msg_list            VARCHAR2(2000) := OKC_API.G_FALSE;
7461 l_msg_list                 VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
7462 l_msg_count                Number;
7463 l_msg_data                 Varchar2(2000) := NULL;
7464 
7465 BEGIN
7466 x_return_status := 'S';
7467 
7468 ---get bill type details
7469 Open l_bill_type_Csr;
7470 Fetch l_bill_type_Csr Into l_bill_type_Rec;
7471 
7472 If l_bill_type_csr%Notfound then
7473     Close l_bill_type_Csr;
7474     x_return_status := 'E';
7475      OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'BILLING SCHEDULE TYPE NOT FOUND.');
7476     RAISE G_EXCEPTION_HALT_VALIDATION;
7477 End If;
7478 Close l_bill_type_Csr;
7479 
7480 IF l_bill_type_rec.billing_schedule_type = 'T' then
7481 
7482   l_index  := 0;
7483   l_top_bs_tbl.DELETE;
7484   FOR l_line_BS_rec IN l_line_BS_csr
7485   LOOP
7486    l_top_bs_tbl(l_index).id                     := l_line_BS_rec.id;
7487    l_top_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
7488    l_top_bs_tbl(l_index).Amount                 := l_line_BS_rec.amount;
7489    l_top_bs_tbl(l_index).date_end               := l_line_BS_rec.date_end;
7490    l_top_bs_tbl(l_index).object_version_number  := l_line_BS_rec.object_version_number;
7491 
7492    l_index := l_index + 1;
7493   END LOOP;
7494 
7495   l_index  := 0;
7496   l_cp_bs_tbl.DELETE;
7497   FOR l_cp_BS_rec IN l_cp_BS_csr
7498   LOOP
7499     l_cp_bs_tbl(l_index).id              := l_cp_BS_rec.id;
7500     l_cp_bs_tbl(l_index).date_start      := l_cp_BS_rec.date_start;
7501     l_cp_bs_tbl(l_index).Amount          := l_cp_BS_rec.amount;
7502 
7503     l_index := l_index + 1;
7504   END LOOP;
7505 
7506   IF l_cp_bs_tbl.COUNT > 0 THEN
7507 
7508 
7509      l_cp_bs_ind  := l_cp_bs_tbl.FIRST;
7510      l_top_bs_ind := l_top_bs_tbl.FIRST;
7511 
7512      WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > l_top_bs_tbl(l_top_bs_ind).DATE_START
7513              AND l_top_bs_ind < l_top_bs_tbl.LAST
7514      LOOP
7515        l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
7516      END LOOP;
7517 
7518 
7519 
7520 
7521    IF l_top_bs_ind = l_top_bs_tbl.first THEN
7522       NULL;
7523 
7524    ELSIF  l_top_bs_ind <= l_top_bs_tbl.LAST THEN
7525 
7526      l_top_bs_ind := l_top_bs_ind - 1;
7527 
7528      IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= l_top_bs_tbl(l_top_bs_ind  ).DATE_START
7529       AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= l_top_bs_tbl(l_top_bs_ind ).DATE_end THEN
7530 
7531           NULL;
7532      ELSE
7533          l_top_bs_ind := l_top_bs_ind + 1;
7534      END IF;
7535 
7536     elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(l_top_bs_tbl(l_top_bs_ind).DATE_START) THEN
7537        NULL;
7538 
7539    end if;
7540 
7541 
7542 
7543 
7544    FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
7545    LOOP
7546 
7547         l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) - nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
7548 	exit when (l_top_bs_ind = l_top_bs_tbl.LAST);/*fix for bug 12395037*/
7549         l_top_bs_ind  := l_top_bs_ind + 1;
7550    END LOOP;
7551 
7552    OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
7553                p_api_version                  => l_api_version,
7554                p_init_msg_list                => l_init_msg_list,
7555                x_return_status                => x_return_status,
7556                x_msg_count                    => l_msg_count,
7557                x_msg_data                     => l_msg_data,
7558                p_letv_tbl                     => l_top_bs_tbl,
7559                x_letv_tbl                     => l_lvl_ele_tbl_out);
7560 
7561      IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
7562         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
7563      ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
7564         RAISE OKC_API.G_EXCEPTION_ERROR;
7565      END IF;
7566 
7567   END IF;          ---l_cp_bs_tbl.COUNT > 0
7568 
7569 
7570 END IF;      ---l_bill_type = 'T'
7571 
7572 
7573 ----delete lvl elements for cp
7574 DELETE FROM   OKS_LEVEL_ELEMENTS
7575 WHERE  cle_id = p_sub_line_id;
7576 
7577 
7578 ----Delete sll of cp
7579 
7580 Delete oks_stream_levels_b
7581 where cle_id = p_sub_line_id;
7582 
7583 
7584 
7585 
7586 
7587 EXCEPTION
7588   WHEN OTHERS THEN
7589     OKC_API.SET_MESSAGE(p_app_name         => G_APP_NAME_OKC,
7590                             p_msg_name     => G_UNEXPECTED_ERROR,
7591                             p_token1       => G_SQLCODE_TOKEN,
7592                             p_token1_value => sqlcode,
7593                             p_token2       => G_SQLERRM_TOKEN,
7594                             p_token2_value => sqlerrm);
7595 
7596     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7597 END Del_subline_lvl_rule;
7598 
7599 
7600 
7601 
7602 PROCEDURE update_bs_interface_date(p_top_line_id         IN    NUMBER,
7603                                    p_invoice_rule_id     IN    Number,
7604                                    x_return_status       OUT   NOCOPY VARCHAR2,
7605                                    x_msg_count           OUT   NOCOPY NUMBER,
7606                                    x_msg_data            OUT   NOCOPY VARCHAR2)
7607 
7608 IS
7609 
7610 CURSOR l_line_csr IS
7611        SELECT ln.id id, ln.lse_id lse_id, nvl(TRUNC(ln.date_terminated -1),ln.end_date) line_end_date,
7612               dtl.usage_type usage_type, dtl.billing_schedule_type billing_schedule_type
7613        FROM okc_k_lines_b ln, oks_k_lines_b dtl
7614        WHERE ln.id = p_top_line_id
7615        AND dtl.cle_id = ln.id;
7616 
7617 
7618 Cursor l_subLine_Csr Is
7619         SELECT id ,nvl(TRUNC(date_terminated -1),end_date) cp_end_date, lse_id
7620         FROM okc_k_lines_b
7621         WHERE cle_id = p_top_line_id and lse_id in (35,7,8,9,10,11,13,18,25);
7622 
7623 CURSOR l_Line_BS_csr IS
7624          SELECT id, trunc(date_start) date_start,
7625          date_to_interface, date_transaction, date_end
7626          FROM oks_level_elements
7627          WHERE cle_id = p_top_line_id
7628          AND date_completed IS NOT NULL
7629          ORDER BY date_start;
7630 
7631 
7632 
7633 l_subLine_rec        l_subLine_Csr%ROWTYPE;
7634 l_index              NUMBER := 0;
7635 l_update_bs_tbl      oks_bill_level_elements_pvt.letv_tbl_type;
7636 l_lvl_index          NUMBER := 0;
7637 l_line_rec           l_line_csr%ROWTYPE;
7638 
7639 l_cp_line_bs         oks_bill_level_elements_pvt.letv_tbl_type;
7640 l_line_tbl_in        oks_bill_level_elements_pvt.letv_tbl_type;
7641 l_top_index          NUMBER := 0;
7642 
7643 
7644 l_init_msg_list VARCHAR2(2000) := OKC_API.G_FALSE;
7645 
7646 BEGIN
7647 
7648 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7649 
7650 IF p_invoice_rule_id IS NULL THEN
7651 -- nechatur 23-DEC-2005 for bug#4684706
7652 -- OKC_API.set_message(G_PKG_NAME,'OKS_INVD_COV_RULE','RULE_NAME','IRE');
7653    OKC_API.set_message(G_PKG_NAME,'OKS_INVOICING_RULE');
7654 -- end bug#4684706
7655    x_return_status := 'E';
7656    RAISE G_EXCEPTION_HALT_VALIDATION;
7657 END IF;
7658 
7659 OPEN l_line_csr;
7660 FETCH l_line_csr Into l_line_rec;
7661 
7662 If l_line_csr%NOTFOUND THEN
7663     CLOSE l_line_csr;
7664     OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
7665     x_return_status := G_RET_STS_UNEXP_ERROR;
7666     RETURN;
7667 ELSE
7668     Close l_line_csr;
7669 END IF;
7670 
7671 IF l_line_rec.lse_id = 12 AND NVL(l_line_rec.usage_type,1) IN ('VRT','QTY') THEN       ---A/P OR A/Q
7672    RETURN;
7673 END IF;
7674 
7675 l_lvl_ele_tbl_in.DELETE;
7676 
7677 Adjust_interface_date(p_line_id           => p_top_line_id,
7678                       p_invoice_rule_id   => p_invoice_rule_id,
7679                       p_line_end_date     => l_line_rec.line_end_date,
7680                       p_lse_id            => l_line_rec.lse_id,
7681                       x_bs_tbl            => l_update_bs_tbl,
7682                       x_return_status     => x_return_status,
7683                       x_msg_count         => x_msg_count,
7684                       x_msg_data          => x_msg_data);
7685 
7686 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7687       RAISE G_EXCEPTION_HALT_VALIDATION;
7688 END IF;
7689 
7690 IF l_update_bs_tbl.COUNT <= 0 THEN
7691    RETURN;
7692 END IF;
7693 
7694 FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7695 LOOP
7696 
7697   l_lvl_ele_tbl_in(l_lvl_index).id                     := l_update_bs_tbl(l_index).id;
7698   l_lvl_ele_tbl_in(l_lvl_index).date_start             := l_update_bs_tbl(l_index).date_start;
7699   l_lvl_ele_tbl_in(l_lvl_index).date_to_interface      := l_update_bs_tbl(l_index).date_to_interface;
7700   l_lvl_ele_tbl_in(l_lvl_index).object_version_number  := l_update_bs_tbl(l_index).object_version_number;
7701   l_lvl_ele_tbl_in(l_lvl_index).date_to_interface      := l_update_bs_tbl(l_index).date_to_interface;
7702   l_lvl_ele_tbl_in(l_lvl_index).date_transaction       := l_update_bs_tbl(l_index).date_transaction;
7703 
7704 
7705   l_lvl_index  := l_lvl_index + 1;
7706 END LOOP;
7707 
7708 IF l_line_rec.billing_schedule_type = 'P' THEN
7709   ----Find subline and update interface date of sublines level elements
7710 
7711   For l_subLine_rec IN l_subLine_csr
7712   LOOP
7713 
7714     Adjust_interface_date(
7715                       p_line_id           => l_subLine_rec.id,
7716                       p_invoice_rule_id   => p_invoice_rule_id,
7717                       p_line_end_date     => l_subline_rec.cp_end_date,
7718                       p_lse_id            => l_subline_rec.lse_id,
7719                       x_bs_tbl            => l_update_bs_tbl,
7720                       x_return_status     => x_return_status,
7721                       x_msg_count         => x_msg_count,
7722                       x_msg_data          => x_msg_data);
7723 
7724    IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7725       RAISE G_EXCEPTION_HALT_VALIDATION;
7726    END IF;
7727 
7728    IF l_update_bs_tbl.COUNT > 0 THEN
7729 
7730      FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7731      LOOP
7732 
7733        l_lvl_ele_tbl_in(l_lvl_index).id                 := l_update_bs_tbl(l_index).id;
7734        l_lvl_ele_tbl_in(l_lvl_index).date_start         := l_update_bs_tbl(l_index).date_start;
7735        l_lvl_ele_tbl_in(l_lvl_index).date_to_interface  := l_update_bs_tbl(l_index).date_to_interface;
7736        l_lvl_ele_tbl_in(l_lvl_index).object_version_number  := l_update_bs_tbl(l_index).object_version_number;
7737 
7738        l_lvl_index  := l_lvl_index + 1;
7739      END LOOP;
7740 
7741    END IF;       ---- l_update_bs_tbl.COUNT > 0
7742 
7743   END LOOP;            ----subline csr
7744 
7745 ELSE              ----billing type E and T
7746 
7747    ---interface/trx dt should be same for cp and top line. build tbl for billed lvl_element for top line
7748    ---and merge tbl with not billed. as some of the cp may be added later which are not billed yet.
7749 
7750    l_top_index := 1;
7751    l_line_tbl_in.DELETE;
7752 
7753    ---billed top line lvl element
7754 
7755    FOR l_Line_BS_rec IN l_Line_BS_csr
7756    LOOP
7757 
7758      l_line_tbl_in(l_top_index).id                 := l_Line_BS_rec.id;
7759      l_line_tbl_in(l_top_index).date_start         := l_Line_BS_rec.date_start;
7760      l_line_tbl_in(l_top_index).date_to_interface  := l_Line_BS_rec.date_to_interface;
7761      l_line_tbl_in(l_top_index).date_transaction   := l_Line_BS_rec.date_transaction;
7762 
7763      l_top_index  := l_top_index + 1;
7764    END LOOP;
7765 
7766    ----unbilled lvl element for top line added to l_line_tbl_in
7767    FOR L_index IN l_update_bs_tbl.FIRST .. l_update_bs_tbl.LAST
7768    LOOP
7769 
7770      l_line_tbl_in(l_top_index).id                 := l_update_bs_tbl(l_index).id;
7771      l_line_tbl_in(l_top_index).date_start         := l_update_bs_tbl(l_index).date_start;
7772      l_line_tbl_in(l_top_index).date_to_interface  := l_update_bs_tbl(l_index).date_to_interface;
7773      l_line_tbl_in(l_top_index).date_transaction   := l_update_bs_tbl(l_index).date_transaction;
7774 
7775      l_top_index  := l_top_index + 1;
7776    END LOOP;
7777 
7778 
7779   For l_subLine_rec IN l_subLine_csr
7780   LOOP
7781 
7782     Adjust_cp_trx_inv_dt(
7783                      p_top_bs_tbl        => l_line_tbl_in,
7784                      p_SubLine_id        => l_subLine_rec.id,
7785                      x_cp_line_bs        => l_cp_line_bs,
7786                      x_return_status     => x_return_status);
7787 
7788    IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7789       RAISE G_EXCEPTION_HALT_VALIDATION;
7790    END IF;
7791 
7792    IF l_cp_line_bs.COUNT > 0 THEN
7793 
7794      FOR L_index IN l_cp_line_bs.FIRST .. l_cp_line_bs.LAST
7795      LOOP
7796 
7797        l_lvl_ele_tbl_in(l_lvl_index).id                    := l_cp_line_bs(l_index).id;
7798        l_lvl_ele_tbl_in(l_lvl_index).date_start            := l_cp_line_bs(l_index).date_start;
7799        l_lvl_ele_tbl_in(l_lvl_index).date_to_interface     := l_cp_line_bs(l_index).date_to_interface;
7800        l_lvl_ele_tbl_in(l_lvl_index).date_transaction      := l_cp_line_bs(l_index).date_transaction;
7801        l_lvl_ele_tbl_in(l_lvl_index).object_version_number := l_cp_line_bs(l_index).object_version_number;
7802 
7803        l_lvl_index  := l_lvl_index + 1;
7804      END LOOP;
7805 
7806    END IF;       ---- l_cp_line_bs.COUNT > 0
7807 
7808   END LOOP;            ----subline csr
7809 
7810 END IF;             ---chk billing schedule type
7811 
7812 
7813 
7814 -----errorout_ad('l_lvl_ele_tbl_in.COUNT = ' || l_lvl_ele_tbl_in.COUNT );
7815 
7816 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
7817    OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
7818                p_api_version                  => l_api_version,
7819                p_init_msg_list                => l_init_msg_list,
7820                x_return_status                => x_return_status,
7821                x_msg_count                    => x_msg_count,
7822                x_msg_data                     => x_msg_data,
7823                p_letv_tbl                     => l_lvl_ele_tbl_in,
7824                x_letv_tbl                     => l_lvl_ele_tbl_out);
7825 
7826     IF  x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7827       RAISE G_EXCEPTION_HALT_VALIDATION;
7828     END IF;
7829 END IF;
7830 
7831 
7832 EXCEPTION
7833  WHEN G_EXCEPTION_HALT_VALIDATION THEN
7834   NULL;
7835 
7836  WHEN OTHERS THEN
7837         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
7838                             p_msg_name     => G_UNEXPECTED_ERROR,
7839                             p_token1       => G_SQLCODE_TOKEN,
7840                             p_token1_value => sqlcode,
7841                             p_token2       => G_SQLERRM_TOKEN,
7842                             p_token2_value => sqlerrm);
7843 
7844         x_return_status := G_RET_STS_UNEXP_ERROR;
7845 
7846 
7847 END update_bs_interface_date;
7848 
7849 
7850 Procedure Adjust_interface_date(p_line_id           IN  NUMBER,
7851                                 p_invoice_rule_id   IN  Number,
7852                                 p_line_end_date     IN  DATE,
7853                                 p_lse_id            IN  NUMBER,
7854                                 x_bs_tbl            OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
7855                                 x_return_status     OUT NOCOPY VARCHAR2,
7856                                 x_msg_count         OUT NOCOPY NUMBER,
7857                                 x_msg_data          OUT NOCOPY VARCHAR2)
7858 IS
7859 
7860 
7861 
7862 
7863 Cursor l_Line_SLL_CSR(l_line_id NUMBER) is
7864         SELECT id, cle_id, chr_id, dnz_chr_id , uom_code,
7865               sequence_no, Start_Date, end_Date, level_periods,
7866               uom_per_period, level_amount, invoice_offset_days, interface_offset_days
7867         FROM OKS_STREAM_LEVELS_B
7868         WHERE  cle_id = l_line_id
7869         ORDER BY sequence_no;
7870 
7871 CURSOR l_lvl_element_csr(l_sll_id  NUMBER) IS
7872        SELECT id,date_start, date_end, date_to_interface,
7873               date_transaction , object_version_number
7874        FROM oks_level_elements
7875        WHERE rul_id = l_sll_id AND date_completed IS NULL
7876        ORDER BY date_start;
7877 
7878 
7879 
7880 l_Line_SLL_rec       l_Line_SLL_csr%ROWTYPE;
7881 l_lvl_element_rec    l_lvl_element_csr%ROWTYPE;
7882 
7883 
7884 l_index              NUMBER := 0;
7885 l_bs_index           NUMBER := 0;
7886 l_bs_tbl             oks_bill_level_elements_pvt.letv_tbl_type;
7887 l_sll_end_date       DATE;
7888 l_interface_offset   NUMBER;
7889 l_date_to_interface  DATE;
7890 l_out_index          NUMBER  := 0;
7891 
7892 l_action_offset      NUMBER;
7893 l_date_transaction   DATE;
7894 
7895 BEGIN
7896 
7897 x_return_status  := OKC_API.G_RET_STS_SUCCESS;
7898 
7899 
7900 For l_Line_SLL_rec IN l_Line_SLL_csr(p_line_id)
7901 LOOP
7902 
7903     l_bs_index  := 0;
7904     l_bs_tbl.delete;
7905 
7906     IF l_line_SLL_rec.end_date IS NOT NULL THEN
7907 
7908            l_sll_end_date  := l_line_SLL_rec.end_date;
7909     ELSE
7910            l_sll_end_date  := OKC_TIME_UTIL_PUB.get_enddate(
7911                                                         l_Line_SlL_rec.Start_Date,
7912                                                         l_Line_SlL_rec.UOM_CODE,
7913                                   l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
7914     END IF;
7915 
7916 
7917 
7918 
7919     FOR l_lvl_element_rec IN l_lvl_element_csr(l_Line_SLL_rec.id)
7920     LOOP
7921        l_bs_tbl(l_bs_index).id                      := l_lvl_element_rec.id;
7922        l_bs_tbl(l_bs_index).date_start              := l_lvl_element_rec.date_start;
7923        l_bs_tbl(l_bs_index).date_end                := l_lvl_element_rec.date_end;
7924        l_bs_tbl(l_bs_index).date_to_interface       := l_lvl_element_rec.date_to_interface;
7925        l_bs_tbl(l_bs_index).date_transaction        := l_lvl_element_rec.date_transaction;
7926        l_bs_tbl(l_bs_index).object_version_number   := l_lvl_element_rec.object_version_number;
7927 
7928        -----errorout_ad('before date_to_interface = ' || l_bs_tbl(l_bs_index).date_to_interface);
7929 
7930        l_bs_index := l_bs_index + 1;
7931 
7932     END LOOP;
7933 
7934     IF l_bs_tbl.COUNT > 0 THEN
7935 
7936 
7937        l_interface_offset  := NVL(TO_NUMBER(l_Line_SLL_rec.interface_offset_days),0);
7938        l_action_offset     := NVL(TO_NUMBER(l_Line_SLL_rec.invoice_offset_days),0);
7939 
7940        FOR l_index IN l_bs_tbl.FIRST .. l_bs_tbl.LAST
7941        LOOP
7942 
7943          ---calculate trx date
7944 
7945         If nvl(p_invoice_rule_id,-2) = -2 Then
7946 
7947           l_date_transaction := l_bs_tbl(l_index).date_start + l_action_offset;
7948 
7949           If l_date_transaction < SYSDATE Then
7950             l_date_transaction := SYSDATE;
7951           End if;
7952 
7953         Elsif nvl(p_invoice_rule_id,-2) = -3 Then
7954 
7955           IF l_bs_tbl(l_index ).date_end IS NOT NULL THEN
7956 
7957           l_date_transaction :=  l_bs_tbl(l_index ).date_end  + l_action_offset;
7958 
7959           ELSE           ---end dt null for migrated contracts
7960 
7961             IF l_index < l_bs_tbl.LAST THEN
7962               l_date_transaction := (l_bs_tbl(l_index + 1).date_start - 1 ) + l_action_offset;
7963             ELSE              ---not last
7964               IF p_lse_id <> 46  THEN
7965                l_date_transaction := LEAST(l_sll_end_date, p_line_end_date ) + l_action_offset;
7966               ELSE
7967                l_date_transaction := okc_time_util_pub.get_enddate
7968                         (l_bs_tbl(l_index).date_start,
7969                          l_Line_SLL_rec.uom_code,
7970                          l_Line_SLL_rec.uom_per_period) + l_action_offset;
7971               END IF;             ---chk for 46
7972              END IF;            ---chk for last
7973 
7974           END IF;              ---end date null chk
7975 
7976            ----l_date_transaction SHOULD not be less then bill from date and sysdate.
7977           IF l_date_transaction < l_bs_tbl(l_index).date_start  THEN
7978             l_date_transaction := l_bs_tbl(l_index).date_start ;
7979           END IF;
7980 
7981           If l_date_transaction < SYSDATE Then
7982             l_date_transaction := SYSDATE;
7983           End if;
7984 
7985         End if;        --chk for advance for trx date
7986 
7987 
7988 
7989          ---calculate inv date
7990 
7991          If nvl(p_invoice_rule_id,-2) = -2 Then   /*** advance ***/
7992 
7993             l_date_to_interface := l_bs_tbl(l_index).date_start  + NVL(l_interface_offset,0);
7994 
7995             IF l_date_to_interface > LEAST(l_date_transaction, l_bs_tbl(l_index).date_start)  Then
7996 
7997                l_date_to_interface := LEAST(l_date_transaction, l_bs_tbl(l_index).date_start);
7998             End if;
7999 
8000           ELSIF nvl(p_invoice_rule_id,-2) = -3 Then
8001 
8002             IF l_index <> l_bs_tbl.LAST THEN
8003 
8004                IF l_bs_tbl(l_index ).date_end IS NULL THEN
8005                  l_date_to_interface := l_bs_tbl(l_index + 1).date_start + NVL(l_interface_offset,0);  /** Bill to date + 1 ***/
8006                ELSE
8007 
8008                  l_date_to_interface := l_bs_tbl(l_index ).date_end + 1 + NVL(l_interface_offset,0);  /** Bill to date + 1 ***/
8009                END IF;
8010 
8011             ELSE
8012 
8013                IF l_sll_end_date > p_line_end_date THEN
8014                  l_date_to_interface := p_line_end_date + 1 + NVL(l_interface_offset,0);
8015                ELSE
8016                  l_date_to_interface := l_sll_end_date + 1 + NVL(l_interface_offset,0);
8017                END IF;
8018             END IF;
8019          END IF;             ---end of advance/arrears for inv
8020 
8021          ------Assign interface date in tbl
8022          IF l_date_to_interface IS NOT NULL THEN
8023            l_bs_tbl(l_index).date_to_interface  := l_date_to_interface;
8024          END IF;
8025 
8026          IF l_date_to_interface IS NOT NULL THEN
8027            l_bs_tbl(l_index).date_transaction  := l_date_transaction;
8028          END IF;
8029 
8030          x_bs_tbl(l_out_index).id                     :=  l_bs_tbl(l_index).id   ;
8031          x_bs_tbl(l_out_index).date_start             :=  l_bs_tbl(l_index).date_start ;
8032          x_bs_tbl(l_out_index).date_end               :=  l_bs_tbl(l_index).date_end ;
8033          x_bs_tbl(l_out_index).date_to_interface      :=  TRUNC(l_bs_tbl(l_index).date_to_interface);
8034          x_bs_tbl(l_out_index).object_version_number  :=  l_bs_tbl(l_index).object_version_number;
8035          x_bs_tbl(l_out_index).date_transaction       :=  TRUNC(l_bs_tbl(l_index).date_transaction);
8036 
8037          l_out_index  := l_out_index + 1;
8038        END LOOP;
8039 
8040 
8041    END IF;          ---end of l_bs_tbl.COUNT > 0
8042 END LOOP;            ----SLL CSR
8043 
8044 
8045 EXCEPTION
8046 
8047  WHEN OTHERS THEN
8048         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
8049                             p_msg_name     => G_UNEXPECTED_ERROR,
8050                             p_token1       => G_SQLCODE_TOKEN,
8051                             p_token1_value => sqlcode,
8052                             p_token2       => G_SQLERRM_TOKEN,
8053                             p_token2_value => sqlerrm);
8054 
8055         x_return_status := G_RET_STS_UNEXP_ERROR;
8056 END Adjust_interface_date;
8057 
8058 
8059 Procedure Cascade_Dt_lines_SLL
8060 (
8061           p_contract_id         IN    NUMBER,
8062           p_line_id             IN    NUMBER,
8063           x_return_status       OUT   NOCOPY Varchar2)
8064 
8065 IS
8066 
8067 CURSOR l_top_line_Csr Is
8068        SELECT id
8069        FROM   OKC_K_LINES_b
8070        WHERE  chr_id =  p_contract_id
8071        AND lse_id IN (1, 12, 14, 19, 46);
8072 
8073 l_top_line_rec  l_top_line_Csr%ROWTYPE;
8074 l_msg_count     NUMBER;
8075 l_msg_data      VARCHAR2(2000);
8076 
8077 BEGIN
8078 
8079 x_return_status  := OKC_API.G_RET_STS_SUCCESS;
8080 
8081 
8082 IF p_line_id IS NOT NULL THEN
8083    oks_bill_sch.Cascade_Dates_SLL
8084         (
8085           p_top_line_id         => p_line_id,
8086           x_return_status       => x_return_status,
8087           x_msg_count           => l_msg_count,
8088           x_msg_data            => l_msg_data);
8089 
8090 ELSIF p_contract_id IS NOT NULL THEN
8091 
8092   FOR l_top_line_rec IN l_top_line_Csr
8093   LOOP
8094 
8095     oks_bill_sch.Cascade_Dates_SLL
8096         (
8097           p_top_line_id         => l_top_line_rec.id,
8098           x_return_status       => x_return_status,
8099           x_msg_count           => l_msg_count,
8100           x_msg_data            => l_msg_data);
8101   END LOOP;
8102 END IF;
8103 
8104 EXCEPTION
8105  WHEN G_EXCEPTION_HALT_VALIDATION THEN
8106       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8107         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8108       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8109         RAISE OKC_API.G_EXCEPTION_ERROR;
8110       END IF;
8111  WHEN OTHERS THEN
8112         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
8113                             p_msg_name     => G_UNEXPECTED_ERROR,
8114                             p_token1       => G_SQLCODE_TOKEN,
8115                             p_token1_value => sqlcode,
8116                             p_token2       => G_SQLERRM_TOKEN,
8117                             p_token2_value => sqlerrm);
8118 
8119         x_return_status := G_RET_STS_UNEXP_ERROR;
8120 END Cascade_Dt_lines_SLL;
8121 
8122  -------------------------------------------------------------------------
8123  -- Partial period computation logic
8124  -- Developer Mani Choudhary
8125  -- Date 09-MAY-2005
8126  -------------------------------------------------------------------------
8127 PROCEDURE  Create_Subcription_LvlEle
8128          (p_billing_type     IN    VARCHAR2,
8129           p_sll_tbl          IN    StrmLvl_Out_tbl,
8130           p_line_rec         IN    Line_Det_Type,
8131           p_term_dt          IN    DATE,
8132           p_invoice_ruleid   IN    Number,
8133           p_period_start     IN    VARCHAR2,
8134           p_period_type      IN    VARCHAR2,
8135           x_return_status    OUT  NOCOPY Varchar2)
8136 
8137 IS
8138 
8139 CURSOR l_subcription_amt_csr(p_line_id NUMBER, p_term_dt DATE) IS
8140        SELECT nvl(SUM(amount) ,0) sub_amt
8141        FROM OKS_SUBSCR_ELEMENTS
8142        WHERE dnz_cle_id = p_line_id;
8143 
8144 ----commented for bug#3222008.terminate program first call recreate fulfillemt schedule so
8145 ----take amt from rest of fulfillemt sch.
8146       --- AND TRUNC(start_date) < TRUNC(p_term_dt);
8147 
8148 
8149 l_subcription_amt_rec    l_subcription_amt_csr%ROWTYPE;
8150 
8151 
8152 
8153 
8154 l_tangible               BOOLEAN;
8155 l_line_sll_counter       Number;
8156 l_period_counter         Number;
8157 l_next_cycle_dt          Date;
8158 
8159 l_line_end_date          date;
8160 l_line_amt               NUMBER;
8161 
8162 l_adjusted_amt           NUMBER;
8163 l_lvl_loop_counter       NUMBER;
8164 l_last_cycle_dt          Date;
8165 l_bill_sch_amt           NUMBER := 0;
8166 l_tbl_seq                NUMBER;
8167 l_uom_quantity           NUMBER;
8168 l_tce_code               VARCHAR2(100);
8169 L_CONSTANT_SLL_AMT       NUMBER;
8170 l_remaining_amt          NUMBER;
8171 L_SLL_AMT                NUMBER;
8172 l_dummy_top_line_bs      oks_bill_level_elements_pvt.letv_tbl_type;
8173 l_bill_type              VARCHAR2(10);
8174 
8175   --
8176 l_api_version           CONSTANT        NUMBER  := 1.0;
8177 l_init_msg_list         VARCHAR2(2000) := OKC_API.G_FALSE;
8178 l_return_status         VARCHAR2(10);
8179 l_msg_count             NUMBER;
8180 l_msg_data              VARCHAR2(2000);
8181 l_msg_index_out         NUMBER;
8182 l_msg_index             NUMBER;
8183 -- Start - Added by PMALLARA - Bug #3992530
8184 Lvl_Element_cnt Number := 0;
8185 Strm_Start_Date  Date;
8186 -- End - Added by PMALLARA - Bug #3992530
8187  -------------------------------------------------------------------------
8188  -- Partial period computation logic
8189  -- Developer Mani Choudhary
8190  -- Date 09-MAY-2005
8191  -------------------------------------------------------------------------
8192  l_pricing_method Varchar2(30);
8193  l_period_start   OKS_K_HEADERS_B.PERIOD_START%TYPE;
8194  l_period_type    OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
8195 BEGIN
8196 
8197 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8198 
8199 l_tangible  := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_line_rec.id);
8200 
8201 
8202 
8203 l_lvl_ele_tbl_in.delete;
8204 l_tbl_seq := 1;
8205 l_line_end_date := p_line_rec.line_end_dt;            ---termination dt
8206 l_line_sll_counter := p_sll_tbl.FIRST;
8207 
8208 IF p_term_dt IS NULL THEN
8209    l_line_end_date := p_line_rec.line_end_dt;
8210 ELSE
8211    l_line_end_date  := p_term_dt;
8212 END IF;
8213 
8214 
8215 IF l_tangible THEN                    ----item is tangible (have fulfillment schedule)
8216 
8217    -----errorout_ad('l_tangible = true');
8218 
8219    OPEN l_subcription_amt_csr(p_line_rec.id,l_line_end_date) ;
8220    FETCH l_subcription_amt_csr INTO l_subcription_amt_rec;
8221 
8222    If l_subcription_amt_csr%NOTFOUND THEN
8223       l_line_amt  := 0;
8224       CLOSE l_subcription_amt_csr;
8225    ELSE
8226       l_line_amt  := l_subcription_amt_rec.sub_amt;
8227       Close l_subcription_amt_csr;
8228    END IF;
8229    ---l_line_amt := 400;
8230 
8231  -------------------------------------------------------------------------
8232  -- Partial period computation logic
8233  -- Developer Mani Choudhary
8234  -- Date 09-MAY-2005
8235  -- For tangible only service start will be honored
8236  -------------------------------------------------------------------------
8237   l_period_start := NULL;
8238   l_period_type := NULL;
8239 
8240 ELSE             ----false
8241 
8242    -----errorout_ad('l_tangible = false');
8243   l_line_amt := OKS_SUBSCRIPTION_PUB.subs_termn_amount
8244                       ( p_cle_id      => p_line_rec.id,
8245                         p_termn_date  => l_line_end_date ) ;
8246 
8247   IF l_line_amt IS NULL THEN
8248      l_line_amt := 0;
8249   END IF;
8250 
8251  -------------------------------------------------------------------------
8252  -- Partial period computation logic
8253  -- Developer Mani Choudhary
8254  -- Date 09-MAY-2005
8255  -- If intangible and if the profile option OKS_SUBS_PRICING_METHO is subscription based
8256  -- then period start should be NULL and period type should also be NULL
8257  -- otherwise period start should be 'SERVICE' and period type will be whatever is set at GCD
8258  -------------------------------------------------------------------------
8259 --mchoudha fix for bug#5183011
8260 l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
8261  if nvl(l_pricing_method,'SUBSCRIPTION') = 'EFFECTIVITY' then
8262    l_period_start := 'SERVICE';
8263  else
8264    l_period_start := NULL;
8265    l_period_type := NULL;
8266 --     l_line_amt := p_line_rec.line_amt - l_line_amt;
8267  END IF;
8268 
8269 END IF;
8270 -----errorout_ad('LINE AMT = ' || l_line_amt);
8271 
8272 
8273 IF l_header_billing IS NULL THEN
8274 
8275     Delete_lvl_element(p_cle_id        => p_line_rec.id,
8276                      x_return_status => x_return_status);
8277 
8278     -----errorout_ad('Delete_lvl_element status = ' || x_return_status);
8279 
8280     IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8281        RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8282     ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8283        RAISE OKC_API.G_EXCEPTION_ERROR;
8284     END IF;
8285 END IF;
8286 
8287 IF p_line_rec.line_start_dt >= nvl(p_term_dt,l_line_end_date) AND l_line_amt = 0 THEN   ---if line terminated on the same dt.
8288      x_return_status := 'S';
8289      RETURN;
8290 END IF;
8291 
8292 l_bill_type := p_billing_type;
8293 
8294 
8295 
8296 LOOP                           ---sll rule loop
8297       -----errorout_ad('sll rule start date : '||to_char(p_line_rec.line_start_dt));
8298 
8299     IF l_header_billing IS NOT NULL THEN           ----hdr lvl billing no old sll and lvl elements
8300        l_next_cycle_dt := p_sll_tbl(l_line_sll_counter).dt_start;
8301        l_lvl_loop_counter := 1;
8302        l_period_counter := 1;
8303 
8304     ELSE
8305 
8306     Check_Existing_Lvlelement(
8307                    p_sll_id              =>p_sll_tbl(l_line_sll_counter).id,
8308                    p_sll_dt_start        =>p_sll_tbl(l_line_sll_counter).dt_start,
8309                    p_uom                => null,
8310                    p_uom_per_period     => null,
8311                    p_cp_end_dt           => null,
8312                    x_next_cycle_dt       => l_next_cycle_dt,
8313                    x_last_cycle_dt       => l_last_cycle_dt,
8314                    x_period_counter      => l_period_counter,
8315                    x_sch_amt             => l_bill_sch_amt,
8316                    x_top_line_bs         => l_dummy_top_line_bs,
8317                    x_return_status       => x_return_status);
8318 
8319       -----errorout_ad('LEVEL ELEMENT COUNTER = ' || TO_CHAR(l_period_counter));
8320       -----errorout_ad('LEVEL ELEMENT START DATE = ' || to_char(l_next_cycle_dt));
8321 
8322       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8323          RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8324       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8325          RAISE OKC_API.G_EXCEPTION_ERROR;
8326       END IF;
8327       l_lvl_loop_counter := l_period_counter;
8328    END IF;
8329 
8330     IF l_period_counter > to_number(p_sll_tbl(l_line_sll_counter).level_period) THEN
8331       ---It will not insert record in lvl ele for recent sll
8332 
8333       IF l_line_sll_counter + 1 <= p_sll_tbl.LAST THEN
8334           l_next_cycle_dt := p_sll_tbl(l_line_sll_counter + 1).dt_start;
8335       ELSE
8336 
8337           l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
8338                                            (p_sll_tbl(l_line_sll_counter).dt_start,
8339                                             p_sll_tbl(l_line_sll_counter).uom,
8340                                             (p_sll_tbl(l_line_sll_counter).uom_Per_Period *
8341                                              p_sll_tbl(l_line_sll_counter).level_period));
8342 
8343            l_next_cycle_dt := l_next_cycle_dt + 1;
8344        END IF;
8345 
8346     ELSE
8347 
8348         -----errorout_ad('last date = ' || TO_CHAR(l_last_cycle_dt));
8349         -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom);
8350         -----errorout_ad('uom = ' || p_sll_tbl(l_line_sll_counter).uom_Per_Period);
8351        IF L_next_cycle_dt IS null THEN
8352 
8353 
8354           L_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
8355                                            (l_last_cycle_dt,
8356                                             p_sll_tbl(l_line_sll_counter).uom,
8357                                             p_sll_tbl(l_line_sll_counter).uom_Per_Period);
8358 
8359         -----errorout_ad('next_cycle_date = ' || to_char(l_next_cycle_dt));
8360 
8361         l_next_cycle_dt := l_next_cycle_dt + 1;
8362        END IF;
8363 
8364 
8365        IF l_bill_type = 'T' THEN
8366           OKS_BILL_UTIL_PUB.get_seeded_timeunit(
8367                 p_timeunit      => p_sll_tbl(l_line_sll_counter).uom,
8368                 x_return_status => x_return_status,
8369                 x_quantity      => l_uom_quantity ,
8370                 x_timeunit      => l_tce_code);
8371 
8372           IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
8373               RAISE G_EXCEPTION_HALT_VALIDATION;
8374           END IF;
8375 
8376           l_remaining_amt := l_line_amt - nvl(l_bill_sch_amt,0);
8377 
8378           Get_Constant_sll_Amount(p_line_start_date      => p_line_rec.line_start_dt,
8379                                  p_line_end_date         => l_line_end_date,
8380                                  p_cycle_start_date      => l_next_cycle_dt,
8381                                  p_remaining_amount      => l_remaining_amt,
8382                                  P_uom_quantity          => l_uom_quantity,
8383                                  P_tce_code              => l_tce_code,
8384                                  x_constant_sll_amt      => l_constant_sll_amt,
8385                                  x_return_status         => x_return_status);
8386 
8387           -----errorout_ad('Get_Constant_sll_Amount = ' || x_return_status);
8388 
8389            IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
8390               RAISE G_EXCEPTION_HALT_VALIDATION;
8391            END IF;
8392        END IF;        ----end of bill type = 'T'
8393 
8394       IF l_line_amt <= nvl(l_bill_sch_amt,0) AND l_bill_type = 'E' THEN
8395           NULL;
8396       ELSE
8397 
8398 
8399 -- Start - Added by PMALLARA - Bug #3992530
8400     Lvl_Element_cnt  :=   l_period_counter - 1;
8401     Strm_Start_Date  :=   p_sll_tbl(l_line_sll_counter).dt_start;
8402       LOOP                          -------------for level elements of one rule
8403     Lvl_Element_cnt  :=     Lvl_Element_cnt + 1;
8404 -- End - Added by PMALLARA - Bug #3992530
8405 
8406         l_fnd_lvl_in_rec.line_start_date           := p_line_rec.line_start_dt;
8407         l_fnd_lvl_in_rec.line_end_date             := l_line_end_date;
8408         l_fnd_lvl_in_rec.cycle_start_date          := l_next_cycle_dt;
8409 -- Start - Modified by PMALLARA - Bug #3992530
8410         l_fnd_lvl_in_rec.tuom_per_period           := Lvl_Element_cnt * p_sll_tbl(l_line_sll_counter).uom_Per_Period;
8411 -- End - Modified by PMALLARA - Bug #3992530
8412         l_fnd_lvl_in_rec.tuom                      := p_sll_tbl(l_line_sll_counter).uom;
8413         l_fnd_lvl_in_rec.total_amount              := 0;
8414         l_fnd_lvl_in_rec.invoice_offset_days        := p_sll_tbl(l_line_sll_counter).invoice_offset_days;
8415         l_fnd_lvl_in_rec.interface_offset_days     := p_sll_tbl(l_line_sll_counter).Interface_offset_days;
8416         l_fnd_lvl_in_rec.bill_type                 := 'S';            ---passed 'S' for subcription terminated line.
8417         --mchoudha added this parameter
8418         l_fnd_lvl_in_rec.uom_per_period            := p_sll_tbl(l_line_sll_counter).uom_Per_Period;
8419 
8420  -------------------------------------------------------------------------
8421  -- Begin partial period computation logic
8422  -- Developer Mani Choudhary
8423  -- Date 09-MAY-2005
8424  -- Added two new parameters p_period_start and p_period_type
8425  -------------------------------------------------------------------------
8426         -- Start - Modified by PMALLARA - Bug #3992530
8427         OKS_BILL_UTIL_PUB.Get_next_bill_sch
8428           (p_api_version             => l_api_version,
8429            x_return_status           => x_return_status,
8430            x_msg_count               => l_msg_count,
8431            x_msg_data                => l_msg_data,
8432            p_invoicing_rule_id       => p_invoice_ruleid,
8433            p_bill_sch_detail_rec     => l_fnd_lvl_in_rec,
8434            x_bill_sch_detail_rec     => l_fnd_lvl_out_rec,
8435            p_period_start            => l_period_start,
8436            p_period_type             =>  p_period_type,
8437            Strm_Start_Date           => Strm_Start_Date);
8438         -- End - Modified by PMALLARA - Bug #3992530
8439 
8440         -----errorout_ad('LEVEL ELEMENT NEXT CYCLE DATE passed from Get_next_bill_sch = ' || TO_CHAR(l_fnd_lvl_out_rec.next_cycle_date));
8441 
8442         IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8443           -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
8444           RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8445         ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8446           -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch = ' || l_msg_data);
8447           RAISE OKC_API.G_EXCEPTION_ERROR;
8448         END IF;
8449 
8450 
8451 
8452         IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_rec.line_start_dt then
8453           null;                       ---donot insert record in level element
8454         ELSE
8455           l_lvl_ele_tbl_in(l_tbl_seq).sequence_number        :=   to_char(l_period_counter);
8456           l_lvl_ele_tbl_in(l_tbl_seq).cle_id                 :=   p_line_rec.id;
8457           l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id          :=   p_line_rec.id;
8458           l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id             :=   p_line_rec.dnz_chr_id;
8459 
8460           l_lvl_ele_tbl_in(l_tbl_seq).date_start             :=   TRUNC(l_next_cycle_dt);
8461           l_lvl_ele_tbl_in(l_tbl_seq).date_end               :=   TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
8462 
8463 
8464           IF l_bill_type = 'T' then
8465              --calculated sll amount
8466              l_lvl_ele_tbl_in(l_tbl_seq).amount             :=  OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_constant_sll_amt,l_currency_code );
8467 
8468           ELSE                     ----for E and  P
8469             ---sll amt entered by user
8470 
8471             l_sll_amt := TO_NUMBER(p_sll_tbl(l_line_sll_counter).amount);
8472             l_lvl_ele_tbl_in(l_tbl_seq).amount               :=  OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_sll_amt,l_currency_code );
8473           END IF;
8474 
8475 
8476           l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl     :=   l_fnd_lvl_out_rec.date_recievable_gl;
8477           l_lvl_ele_tbl_in(l_tbl_seq).date_transaction       :=   TRUNC(l_fnd_lvl_out_rec.date_transaction);
8478           l_lvl_ele_tbl_in(l_tbl_seq).date_due               :=   l_fnd_lvl_out_rec.date_due;
8479           l_lvl_ele_tbl_in(l_tbl_seq).date_print             :=   l_fnd_lvl_out_rec.date_print;
8480           l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface      :=   TRUNC(l_fnd_lvl_out_rec.date_to_interface);
8481           l_lvl_ele_tbl_in(l_tbl_seq).date_completed         :=   l_fnd_lvl_out_rec.date_completed;
8482           l_lvl_ele_tbl_in(l_tbl_seq).rul_id                 :=   p_sll_tbl(l_line_sll_counter).id;
8483 
8484           l_lvl_ele_tbl_in(l_tbl_seq).object_version_number  := OKC_API.G_MISS_NUM;
8485           l_lvl_ele_tbl_in(l_tbl_seq).created_by             := OKC_API.G_MISS_NUM;
8486           l_lvl_ele_tbl_in(l_tbl_seq).creation_date          := SYSDATE;
8487           l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by        := OKC_API.G_MISS_NUM;
8488           l_lvl_ele_tbl_in(l_tbl_seq).last_update_date       := SYSDATE;
8489 
8490 
8491           -----errorout_ad ('Amount for line lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
8492 
8493           l_period_counter := l_period_counter + 1;
8494           l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
8495           l_tbl_seq      := l_tbl_seq + 1;
8496         END IF;          -----end if for level element creation
8497 
8498         l_next_cycle_dt  := l_fnd_lvl_out_rec.next_cycle_date;
8499 
8500         IF l_bill_type = 'T' then
8501 
8502            EXIT WHEN (l_lvl_loop_counter = p_sll_tbl(l_line_sll_counter).level_period) OR
8503                   (TRUNC(l_next_cycle_dt) > l_line_end_date);
8504         ELSE      ---'E'
8505            EXIT WHEN (l_line_amt <= l_bill_sch_amt) OR
8506                    (l_lvl_loop_counter = p_sll_tbl(l_line_sll_counter).level_period) ;
8507         END IF;
8508 
8509         l_lvl_loop_counter := l_lvl_loop_counter + 1;
8510 
8511        END LOOP;                   ---loop for sll period counter
8512       END IF;     ----l_line_amt <= nvl(l_bill_sch_amt,0) AND l_bill_type = 'E'
8513 
8514       END IF;                      ----Period counter checking before entering in loop for lvlelement
8515 
8516 
8517 
8518     IF l_bill_type = 'T' then
8519        EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
8520                  (TRUNC(l_next_cycle_dt) > l_line_end_date);
8521     ELSE    ---'E'
8522        EXIT WHEN (l_line_sll_counter = p_sll_tbl.LAST) OR
8523                  (l_line_amt <= l_bill_sch_amt);
8524 
8525     END IF;       ---End of 'T'
8526     l_line_sll_counter := p_sll_tbl.NEXT(l_line_sll_counter);
8527 
8528   END LOOP;                    -----loop for sll lines
8529 
8530   IF l_lvl_ele_tbl_in.COUNT > 0 THEN
8531 
8532     IF l_line_amt < l_bill_sch_amt THEN
8533        --adjust the last lvl elemnt amt
8534 
8535        l_adjusted_amt := (l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount) - (l_bill_sch_amt - l_line_amt);
8536        l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount := l_adjusted_amt;
8537 
8538     ELSIF l_line_amt > l_bill_sch_amt THEN
8539       --adjust the last lvl elemnt amt
8540 
8541        l_adjusted_amt := (l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount) + (l_line_amt - l_bill_sch_amt);
8542        l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).amount := l_adjusted_amt;
8543     END IF;
8544 
8545      OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
8546                p_api_version                  => l_api_version,
8547                p_init_msg_list                => l_init_msg_list,
8548                x_return_status                => x_return_status,
8549                x_msg_count                    => l_msg_count,
8550                x_msg_data                     => l_msg_data,
8551                p_letv_tbl                     => l_lvl_ele_tbl_in,
8552                x_letv_tbl                     => l_lvl_ele_tbl_out);
8553 
8554     -----errorout_ad('LEVEL ELEMENT INSERT STATUS FOR SUBLINE = ' || x_return_status);
8555 
8556 
8557       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8558          -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for sub line = ' || l_msg_data);
8559          RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8560       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8561          -----errorout_ad('OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row for sub line = ' || l_msg_data);
8562          RAISE OKC_API.G_EXCEPTION_ERROR;
8563       END IF;
8564    END IF;
8565 
8566 
8567 EXCEPTION
8568  WHEN OTHERS THEN
8569         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
8570                             p_msg_name     => G_UNEXPECTED_ERROR,
8571                             p_token1       => G_SQLCODE_TOKEN,
8572                             p_token1_value => sqlcode,
8573                             p_token2       => G_SQLERRM_TOKEN,
8574                             p_token2_value => sqlerrm);
8575 
8576         x_return_status := G_RET_STS_UNEXP_ERROR;
8577 END Create_Subcription_LvlEle;
8578 
8579 Procedure Create_Subcription_bs
8580 (
8581           p_top_line_id         IN    NUMBER,
8582           p_full_credit         IN    VARCHAR2,
8583           x_return_status       OUT   NOCOPY Varchar2,
8584           x_msg_count           OUT   NOCOPY NUMBER,
8585           x_msg_data            OUT   NOCOPY VARCHAR2)
8586 
8587 IS
8588 
8589 CURSOR l_line_sll_csr IS
8590         SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
8591                uom_per_period, uom_code, TRUNC(end_date) end_date,
8592                interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
8593                chr_id, level_amount
8594         FROM OKS_STREAM_LEVELS_B
8595         WHERE  cle_id = p_top_line_id
8596         ORDER BY sequence_no;
8597 
8598 
8599 
8600 Cursor l_Line_Csr Is
8601  SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
8602         TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
8603         TRUNC(line.date_terminated) line_term_dt, line.inv_rule_id inv_rule_id,
8604         nvl(dtl.billing_schedule_type,'E') billing_schedule_type,
8605         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
8606          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt
8607  FROM okc_k_lines_b line, oks_k_lines_b dtl
8608  WHERE  line.id = dtl.cle_id AND line.Id =  p_top_line_id ;
8609 
8610 
8611 
8612 
8613 
8614 
8615 
8616 l_index                   NUMBER;
8617 l_sll_in_tbl                 StrmLvl_Out_tbl;
8618 
8619 l_Line_Sll_rec            l_Line_Sll_Csr%ROWTYPE;
8620 l_Line_Rec                l_Line_Csr%Rowtype;
8621 
8622 L_BIL_SCH_OUT_TBL         OKS_BILL_SCH.ItemBillSch_tbl;
8623 l_top_line_rec            Line_Det_Type;
8624 l_update_end_date         VARCHAR2(1);
8625 
8626 
8627 -------------------------------------------------------------------------
8628 -- Begin partial period computation logic
8629 -- Developer Mani Choudhary
8630 -- Date 04-MAY-2005
8631 -------------------------------------------------------------------------
8632 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
8633 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
8634 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
8635 l_return_status  VARCHAR2(30);
8636 -------------------------------------------------------------------------
8637 -- End partial period computation logic
8638 -- Date 04-MAY-2005
8639 -------------------------------------------------------------------------
8640 
8641 BEGIN
8642 
8643 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8644 l_update_end_date   := 'N';
8645 
8646 IF nvl(p_full_credit, 'N') = 'Y' Then
8647    DELETE FROM OKS_LEVEL_ELEMENTS
8648    WHERE date_completed IS NULL
8649    AND cle_id = p_top_line_id;
8650 
8651    RETURN;
8652 END IF;
8653 
8654 ---get line details
8655 Open l_Line_Csr;
8656 Fetch l_Line_Csr Into l_Line_Rec;
8657 
8658 If l_Line_Csr%Notfound then
8659     Close l_Line_Csr;
8660     x_return_status := 'E';
8661     OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
8662     RAISE G_EXCEPTION_HALT_VALIDATION;
8663 End If;
8664 Close l_Line_Csr;
8665 
8666 l_top_line_rec.chr_id          :=  l_Line_Rec.chr_id;
8667 l_top_line_rec.dnz_chr_id      :=  l_Line_Rec.dnz_chr_id;
8668 l_top_line_rec.id              :=  l_Line_Rec.id ;
8669 l_top_line_rec.lse_id          :=  l_Line_Rec.lse_id;
8670 l_top_line_rec.line_start_dt   :=  l_Line_Rec.line_start_dt;
8671 l_top_line_rec.line_end_dt     :=  l_Line_Rec.line_end_dt;
8672 l_top_line_rec.line_amt        :=  l_Line_Rec.line_amt ;
8673 
8674 
8675  -------------------------------------------------------------------------
8676  -- Begin partial period computation logic
8677  -- Developer Mani Choudhary
8678  -- Date 09-MAY-2005
8679  -------------------------------------------------------------------------
8680 
8681    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
8682                 (
8683                  p_hdr_id        => l_Line_Rec.dnz_chr_id,
8684                  p_org_id        => NULL,
8685                  x_period_start  => l_period_start,
8686                  x_period_type   => l_period_type,
8687                  x_price_uom     => l_price_uom,
8688                  x_return_status => x_return_status);
8689 
8690    IF x_return_status <> 'S' THEN
8691       RAISE G_EXCEPTION_HALT_VALIDATION;
8692    END IF;
8693 
8694  -------------------------------------------------------------------------
8695  -- End partial period computation logic
8696  -- Date 09-MAY-2005
8697  -------------------------------------------------------------------------
8698 
8699 IF l_line_rec.billing_schedule_type IS NULL then
8700    RETURN;
8701 END IF;
8702 ----make sll tbl
8703 
8704 l_index := 1;
8705 l_sll_in_tbl.DELETE;
8706 
8707 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
8708 LOOP
8709   l_sll_in_tbl(l_index).id                     := l_Line_SlL_rec.id;
8710   l_sll_in_tbl(l_index).cle_id                 := l_Line_SlL_rec.cle_id;
8711 
8712   l_sll_in_tbl(l_index).chr_id                 := l_Line_SlL_rec.chr_id;
8713   l_sll_in_tbl(l_index).dnz_chr_id             := l_Line_SlL_rec.dnz_chr_id;
8714   l_sll_in_tbl(l_index).uom                    := l_Line_SlL_rec.uom_code;
8715   l_sll_in_tbl(l_index).seq_no                 := l_Line_SlL_rec.sequence_no;
8716   l_sll_in_tbl(l_index).Dt_start               := l_Line_SlL_rec.Start_Date;
8717   IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
8718 
8719      l_sll_in_tbl(l_index).end_Date                    := l_Line_SlL_rec.end_Date;
8720   ELSE
8721      l_update_end_date   := 'Y';
8722      l_sll_in_tbl(l_index).end_Date                    := OKC_TIME_UTIL_PUB.get_enddate(
8723                                                         l_Line_SlL_rec.Start_Date,
8724                                                         l_Line_SlL_rec.UOM_CODE,
8725                                   l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
8726   END IF;
8727 
8728 
8729   l_sll_in_tbl(l_index).level_period           := l_Line_SlL_rec.level_periods;
8730   l_sll_in_tbl(l_index).uom_per_period         := l_Line_SlL_rec.uom_per_period;
8731   l_sll_in_tbl(l_index).amount                 := l_Line_SlL_rec.level_amount;
8732   l_sll_in_tbl(l_index).invoice_offset_days     := l_Line_SlL_rec.invoice_offset_days;
8733   l_sll_in_tbl(l_index).interface_offset_days  := l_Line_SlL_rec.interface_offset_days;
8734 
8735   l_index := l_index + 1;
8736 END LOOP;
8737 
8738 IF l_sll_in_tbl.COUNT = 0 THEN
8739    RETURN;
8740 END IF;
8741 
8742 IF l_update_end_date = 'Y' THEN          ---Migrated
8743    OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id         => p_top_line_id,
8744                                   p_chr_id          => NULL,
8745                                   x_return_status   => x_return_status);
8746 
8747    IF x_return_status <> 'S' THEN
8748       RETURN;
8749    END IF;
8750 END IF;
8751 
8752 -----errorout_ad('SLL found');
8753 
8754 
8755 
8756  -------------------------------------------------------------------------
8757  -- Begin partial period computation logic
8758  -- Developer Mani Choudhary
8759  -- Date 09-MAY-2005
8760  -------------------------------------------------------------------------
8761 Create_Subcription_LvlEle
8762          (p_billing_type     =>  l_line_rec.billing_schedule_type,
8763           p_sll_tbl          =>  l_sll_in_tbl,
8764           p_line_rec         =>  l_top_line_rec,
8765           p_term_dt          =>  l_line_rec.line_term_dt,
8766           p_invoice_ruleid   =>  l_line_rec.inv_rule_id,
8767           p_period_start     =>  l_period_start,
8768           p_period_type      =>  l_period_type,
8769           x_return_status    =>  x_return_status);
8770 
8771 IF x_return_status <> 'S' THEN
8772      RAISE G_EXCEPTION_HALT_VALIDATION;
8773 END IF;
8774 
8775 
8776 
8777 EXCEPTION
8778  WHEN G_EXCEPTION_HALT_VALIDATION THEN
8779       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
8780         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
8781       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
8782         RAISE OKC_API.G_EXCEPTION_ERROR;
8783       END IF;
8784  WHEN OTHERS THEN
8785         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
8786                             p_msg_name     => G_UNEXPECTED_ERROR,
8787                             p_token1       => G_SQLCODE_TOKEN,
8788                             p_token1_value => sqlcode,
8789                             p_token2       => G_SQLERRM_TOKEN,
8790                             p_token2_value => sqlerrm);
8791 
8792         x_return_status := G_RET_STS_UNEXP_ERROR;
8793 
8794 END Create_Subcription_bs;
8795 
8796 
8797 FUNCTION Find_term_amt(p_cycle_st_dt  IN  DATE,
8798               p_term_dt      IN  DATE,
8799               p_cycle_end_dt IN  DATE,
8800               p_amount       IN  NUMBER) RETURN NUMBER
8801 
8802 
8803 IS
8804 l_cal_amt     NUMBER;
8805 l_term_days   NUMBER;
8806 l_cycle_days  NUMBER;
8807 
8808 
8809 BEGIN
8810 
8811 l_cal_amt := 0;
8812 
8813 l_term_days     := trunc(p_term_dt) - TRUNC(p_cycle_st_dt);
8814 l_cycle_days    := trunc(p_cycle_end_dt) - TRUNC(p_cycle_st_dt) + 1;
8815 
8816 -----errorout_ad('l_term_days = ' || l_term_days);
8817 
8818 l_cal_amt   := (NVL(p_amount,0) * l_term_days)/ NVL(l_cycle_days,1) ;
8819 
8820 -----errorout_ad('l_cal_amt = ' || l_cal_amt);
8821 
8822 RETURN OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_cal_amt, l_currency_code);
8823 
8824 EXCEPTION
8825     WHEN NO_DATA_FOUND THEN
8826       RETURN NULL;
8827     WHEN OTHERS THEN
8828       RETURN NULL;
8829 
8830 END Find_term_amt;
8831 
8832 PROCEDURE Get_SLL_info(p_top_line_id      IN  NUMBER,
8833                        p_line_id          IN  NUMBER,
8834                        x_sll_tbl          OUT NOCOPY StrmLvl_Out_tbl,
8835                        x_sll_db_tbl       OUT NOCOPY OKS_BILL_SCH.StreamLvl_tbl,
8836                        x_return_status    OUT NOCOPY VARCHAR2)
8837 
8838 IS
8839 
8840 
8841 CURSOR l_line_sll_csr IS
8842        SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
8843                uom_per_period, uom_code, TRUNC(end_date) end_date,
8844                interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
8845                chr_id, level_amount
8846        FROM OKS_STREAM_LEVELS_B
8847        WHERE  cle_id = p_line_id
8848        ORDER BY sequence_no;
8849 
8850 l_sll_tbl                 OKS_BILL_SCH.StreamLvl_tbl;
8851 l_index                   NUMBER;
8852 l_Line_Sll_rec            l_Line_Sll_csr%ROWTYPE;
8853 l_update_end_date         VARCHAR2(1)  := 'N';
8854 
8855 
8856 BEGIN
8857 l_update_end_date   := 'N';
8858 l_sll_tbl.DELETE;
8859 l_index := 1;
8860 x_return_status := 'S';
8861 ----make sll tbl
8862 
8863 FOR l_Line_SlL_rec IN l_Line_SlL_Csr
8864 LOOP
8865   l_sll_tbl(l_index).id                             := l_Line_SlL_rec.id;
8866   l_sll_tbl(l_index).cle_id                         := l_Line_SlL_rec.cle_id;
8867 
8868   l_sll_tbl(l_index).chr_id                         := l_Line_SlL_rec.chr_id;
8869   l_sll_tbl(l_index).dnz_chr_id                     := l_Line_SlL_rec.dnz_chr_id;
8870   l_sll_tbl(l_index).uom_code                       := l_Line_SlL_rec.uom_code;
8871   l_sll_tbl(l_index).sequence_no                    := l_Line_SlL_rec.sequence_no;
8872   l_sll_tbl(l_index).Start_Date                     := l_Line_SlL_rec.Start_Date;
8873 
8874   IF l_Line_SlL_rec.end_Date IS NOT NULL THEN
8875 
8876      l_sll_tbl(l_index).end_Date                    := l_Line_SlL_rec.end_Date;
8877   ELSE
8878      l_update_end_date   := 'Y';
8879      l_sll_tbl(l_index).end_Date                    := OKC_TIME_UTIL_PUB.get_enddate(
8880                                                         l_Line_SlL_rec.Start_Date,
8881                                                         l_Line_SlL_rec.UOM_CODE,
8882                                                         l_Line_SlL_rec.uom_per_period * l_Line_SlL_rec.level_periods);
8883   END IF;
8884 
8885   l_sll_tbl(l_index).level_periods                  := l_Line_SlL_rec.level_periods;
8886   l_sll_tbl(l_index).uom_per_period                 := l_Line_SlL_rec.uom_per_period;
8887   l_sll_tbl(l_index).level_amount                   := l_Line_SlL_rec.level_amount;
8888   l_sll_tbl(l_index).invoice_offset_days             := l_Line_SlL_rec.invoice_offset_days;
8889   l_sll_tbl(l_index).interface_offset_days          := l_Line_SlL_rec.interface_offset_days;
8890 
8891   l_index := l_index + 1;
8892 END LOOP;
8893 
8894 IF l_sll_tbl.COUNT = 0 THEN
8895    RETURN;
8896 END IF;
8897 
8898 IF l_update_end_date = 'Y' THEN          ---Migrated
8899    OKS_BILL_SCH.UPDATE_BS_ENDDATE(p_line_id         => p_top_line_id,
8900                                   p_chr_id          => NULL,
8901                                   x_return_status   => x_return_status);
8902 
8903    IF x_return_status <> 'S' THEN
8904       RETURN;
8905    END IF;
8906 END IF;
8907 
8908 
8909 x_sll_db_tbl := l_sll_tbl;
8910 
8911 l_index  := 0;
8912 x_sll_tbl.delete ;
8913 
8914 
8915 l_index  := 0;
8916 
8917 
8918 FOR l_index IN l_sll_tbl.FIRST .. l_sll_tbl.LAST
8919 LOOP
8920 
8921    x_sll_tbl(l_index).id                     := l_sll_tbl(l_index).id ;
8922    x_sll_tbl(l_index).cle_id                 := l_sll_tbl(l_index).cle_id;
8923    x_sll_tbl(l_index).chr_id                 := l_sll_tbl(l_index).chr_id ;
8924    x_sll_tbl(l_index).dnz_chr_id             := l_sll_tbl(l_index).dnz_chr_id;
8925    x_sll_tbl(l_index).uom                    := l_sll_tbl(l_index).uom_code ;
8926    x_sll_tbl(l_index).seq_no                 := l_sll_tbl(l_index).sequence_no;
8927    x_sll_tbl(l_index).Dt_start               := l_sll_tbl(l_index).Start_Date  ;
8928    x_sll_tbl(l_index).end_Date               := l_sll_tbl(l_index).end_Date  ;
8929    x_sll_tbl(l_index).level_period           := l_sll_tbl(l_index).level_periods ;
8930    x_sll_tbl(l_index).uom_per_period         := l_sll_tbl(l_index).uom_per_period ;
8931    x_sll_tbl(l_index).amount                 := l_sll_tbl(l_index).level_amount;
8932    x_sll_tbl(l_index).invoice_offset_days    := l_sll_tbl(l_index).invoice_offset_days;
8933    x_sll_tbl(l_index).interface_offset_days  := l_sll_tbl(l_index).interface_offset_days ;
8934 END LOOP;
8935 
8936 
8937 
8938 END Get_SLL_info;
8939 
8940 
8941 
8942 Procedure Terminate_bill_sch
8943 (
8944           p_top_line_id         IN    NUMBER,
8945           p_sub_line_id         IN    NUMBER,
8946           p_term_dt             IN    DATE,
8947           x_return_status       OUT   NOCOPY Varchar2,
8948           x_msg_count           OUT   NOCOPY NUMBER,
8949           x_msg_data            OUT   NOCOPY VARCHAR2)
8950 IS
8951 
8952 Cursor l_Line_Csr Is
8953  SELECT line.chr_id chr_id, line.dnz_chr_id dnz_chr_id, line.id id, line.lse_id lse_id,
8954         TRUNC(line.start_date) line_start_dt, TRUNC(line.end_date) line_end_dt,
8955         line.inv_rule_id inv_rule_id, line.cle_id cle_id,
8956         dtl.billing_schedule_type billing_schedule_type,
8957         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
8958          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt
8959  FROM okc_k_lines_b line, oks_k_lines_b dtl
8960  WHERE  line.id = dtl.cle_id AND line.Id =  p_top_line_id
8961  AND    line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
8962                                      -- Ignore cancelled topline
8963 
8964 
8965 
8966 
8967 Cursor l_all_subLine_Csr(l_line_id number, l_style_id number) Is
8968  SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
8969         TRUNC(line.end_date) cp_end_dt, TRUNC(line.date_terminated) cp_prev_term_dt,
8970         dtl.billing_schedule_type billing_schedule_type,
8971         dtl.full_credit full_credit,lse_id cp_lse_id,dtl.price_uom,
8972         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
8973          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) subline_amt
8974         FROM okc_k_lines_b line, oks_k_lines_b dtl
8975         WHERE line.cle_id = l_line_id
8976         AND line.id = dtl.cle_id
8977         AND ((l_style_id = 1 and line.lse_id in (35,7,8,9,10,11))
8978          OR (l_style_id = 12 and line.lse_id = 13)
8979          OR (l_style_id = 14 and line.lse_id = 18)
8980          OR (l_style_id = 19 and line.lse_id = 25))
8981         AND line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
8982                                          -- Ignore cancelled subline
8983 
8984 
8985 Cursor  l_subline_amt_csr (p_id in number) IS
8986 Select  line.price_negotiated
8987 from    okc_k_lines_b line
8988 where   line.id = p_id;
8989 
8990 CURSOR l_line_BS_csr(p_line_id  NUMBER) IS
8991          SELECT id, trunc(element.date_start) date_start,
8992          amount,trunc(date_end) date_end,
8993          object_version_number,date_transaction,date_to_interface
8994          FROM oks_level_elements element
8995          WHERE cle_id = p_line_id
8996          ORDER BY date_start;
8997 
8998 
8999 
9000 Cursor l_SubLine_Csr Is
9001  SELECT line.id subline_id, TRUNC(line.start_date) cp_start_dt,
9002         TRUNC(line.end_date) cp_end_dt, dtl.billing_schedule_type billing_schedule_type,dtl.price_uom,
9003         (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
9004          nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) subline_amt
9005  FROM okc_k_lines_b line, oks_k_lines_b dtl
9006  WHERE line.id = p_sub_line_id
9007  AND line.id = dtl.cle_id
9008  AND line.date_cancelled is null; -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
9009                                   -- Ignore cancelled subline
9010 
9011 
9012 l_Line_rec                l_Line_Csr%ROWTYPE;
9013 l_all_subLine_rec         l_all_subLine_Csr%ROWTYPE;
9014 l_subLine_rec             l_subLine_csr%ROWTYPE;
9015 l_line_BS_rec             l_line_BS_csr%ROWTYPE;
9016 
9017 
9018 
9019 l_index                   NUMBER;
9020 l_top_line_rec            Line_Det_Type;
9021 l_cp_rec                  Prod_Det_Type;
9022 l_inv_id                  number;
9023 l_prev_term_dt            date;
9024 
9025 l_sll_in_tbl              StrmLvl_Out_tbl;
9026 l_sll_db_tbl              oks_bill_sch.StreamLvl_tbl;
9027 l_top_bs_tbl              oks_bill_level_elements_pvt.letv_tbl_type;
9028 
9029 l_init_msg_list           VARCHAR2(2000) := OKC_API.G_FALSE;
9030 
9031 -------------------------------------------------------------------------
9032 -- Begin partial period computation logic
9033 -- Developer Mani Choudhary
9034 -- Date 04-MAY-2005
9035 -------------------------------------------------------------------------
9036 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
9037 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
9038 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
9039 l_return_status     VARCHAR2(30);
9040 l_tangible          BOOLEAN;
9041 l_pricing_method    VARCHAR2(30);
9042 -------------------------------------------------------------------------
9043 -- End partial period computation logic
9044 -- Date 04-MAY-2005
9045 -------------------------------------------------------------------------
9046 
9047 
9048 BEGIN
9049 
9050 
9051 --if called for top line  p_sub_line_id is null or -100
9052 --if  p_sub_line_id = -100 that means full credit, create top line bs upto term date
9053 --and subline which are not already terminated, consider term dt as start dt of subline.
9054 --so that subline will have only billed lvl elements.
9055 
9056 --if called for subline termination,if full credit termination program will pass
9057 --p_term_dt as start date otherwise actual term dt.
9058 
9059 
9060 x_return_status := 'S';
9061 
9062 IF p_term_dt IS NULL THEN
9063   RETURN;
9064 END IF;
9065 
9066    ---get line details
9067 Open l_Line_Csr;
9068 Fetch l_Line_Csr Into l_Line_Rec;
9069 
9070 If l_Line_Csr%Notfound then
9071  Close l_Line_Csr;
9072  x_return_status := 'E';
9073  OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'LINE NOT FOUND');
9074  RAISE G_EXCEPTION_HALT_VALIDATION;
9075 End If;
9076 Close l_Line_Csr;
9077 
9078 l_top_line_rec.chr_id          :=  l_Line_Rec.chr_id;
9079 l_top_line_rec.dnz_chr_id      :=  l_Line_Rec.dnz_chr_id;
9080 l_top_line_rec.id              :=  l_Line_Rec.id ;
9081 l_top_line_rec.cle_id          :=  l_Line_Rec.cle_id ;
9082 l_top_line_rec.lse_id          :=  l_Line_Rec.lse_id;
9083 l_top_line_rec.line_start_dt   :=  l_Line_Rec.line_start_dt;
9084 l_top_line_rec.line_end_dt     :=  l_Line_Rec.line_end_dt;
9085 l_top_line_rec.line_amt        :=  l_Line_Rec.line_amt ;
9086  -------------------------------------------------------------------------
9087  -- Begin partial period computation logic
9088  -- Developer Mani Choudhary
9089  -- Date 09-MAY-2005
9090  -------------------------------------------------------------------------
9091 
9092 
9093    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
9094                 (
9095                  p_hdr_id        => l_Line_Rec.dnz_chr_id,
9096                  p_org_id        => NULL,
9097                  x_period_start  => l_period_start,
9098                  x_period_type   => l_period_type,
9099                  x_price_uom     => l_price_uom,
9100                  x_return_status => x_return_status);
9101 
9102    IF x_return_status <> 'S' THEN
9103       RAISE G_EXCEPTION_HALT_VALIDATION;
9104    END IF;
9105 
9106   --Description in detail for the business rules for deriving the period start
9107   --1)For usage , period start  will always be 'SERVICE'
9108   --2)For Subscriptions, period start and period type will be NULL
9109   --  for tangible subscriptions as per CR1.For intangible subscriptions,
9110   --  if the profile OKS: Intangible Subscription Pricing Method
9111   --  is set to 'Subscription Based',then period start and period type will be NULL
9112   --  otherwise it will be 'SERVICE'
9113   --3) For Extended Warranty from OM, period start will always be 'SERVICE'
9114   --mchoudha fix for bug#5183011
9115  IF l_period_start IS NOT NULL AND
9116     l_period_type IS NOT NULL
9117  THEN
9118    IF l_top_line_rec.lse_id = 12 THEN
9119       l_period_start := 'SERVICE';
9120    END IF;
9121    IF l_top_line_rec.lse_id = 46 THEN
9122      l_tangible  := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_top_line_id);
9123      IF l_tangible THEN
9124        l_period_start := NULL;
9125        l_period_type := NULL;
9126      ELSE
9127        l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
9128        IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
9129          l_period_start := NULL;
9130          l_period_type := NULL;
9131        ELSE
9132          l_period_start := 'SERVICE';
9133        END IF;  --l_pricing_method <> 'EFFECTIVITY'
9134      END IF;    --IF l_tangible
9135    END IF;      --IF l_top_line_rec.lse_id = 46
9136  END IF;        --IF l_period_start IS NOT NULL
9137  -------------------------------------------------------------------------
9138  -- End partial period computation logic
9139  -- Date 09-MAY-2005
9140  -------------------------------------------------------------------------
9141 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9142 
9143    fnd_log.STRING (fnd_log.level_statement,
9144                    G_MODULE_CURRENT || '.terminate_bill_sch.line_dtls',
9145                       'dnz_chr_id = ' || l_line_rec.dnz_chr_id
9146                    || ', id = ' || l_line_rec.id
9147                    || ', lse_id = ' || l_line_rec.lse_id
9148                    || ', start dt = ' || l_line_rec.line_start_dt
9149                    || ', end dt = ' || l_line_rec.line_end_dt
9150                    || ', amt = ' || l_line_rec.line_amt
9151                    || ', p_sub_line_id = ' || p_sub_line_id
9152                    || ', p_term_dt = ' || p_term_dt
9153                    || ', bill type = '|| l_Line_Rec.billing_schedule_type
9154                    || ', inv rule = '|| l_line_rec.inv_rule_id
9155                   );
9156 END IF;
9157 
9158 
9159  --get currency
9160 l_currency_code := Find_Currency_Code(
9161                                     p_cle_id  => p_top_line_id,
9162                                     p_chr_id  => NULL);
9163 
9164 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9165 
9166    fnd_log.STRING (fnd_log.level_statement,
9167                    G_MODULE_CURRENT || '.terminate_bill_sch.line_dtls',
9168                       'l_currency_code = ' || l_currency_code);
9169 END IF;
9170 
9171 IF l_currency_code IS NULL THEN
9172       OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
9173       x_return_status := 'E';
9174       RAISE G_EXCEPTION_HALT_VALIDATION;
9175 END IF;
9176 
9177 
9178 
9179 
9180 --for top line first call create_lvl_ele only for top line
9181 ---and then in loop call for all subline.
9182 
9183 IF p_sub_line_id IS NULL OR p_sub_line_id = -100 THEN
9184    l_sll_in_tbl.DELETE;
9185    l_index := 1;
9186 
9187    IF TRUNC(p_term_dt) > l_top_line_rec.line_end_dt THEN
9188      RETURN;
9189    END IF;
9190 
9191    Get_SLL_info(p_top_line_id      => p_top_line_id,
9192                 p_line_id          => p_top_line_id,
9193                 x_sll_tbl          => l_sll_in_tbl,
9194                 x_sll_db_tbl       => l_sll_db_tbl,
9195                 x_return_status    =>  x_return_status );
9196 
9197    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9198      fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.line_sll',
9199                        'Get_SLL_info(x_return_status = '||x_return_status
9200                        ||', sll tbl count = '||l_sll_in_tbl.count||')');
9201    END IF;
9202 
9203 
9204    IF x_return_status <> 'S' THEN
9205      RAISE G_EXCEPTION_HALT_VALIDATION;
9206    END IF;
9207    -----errorout_ad('l_sll_in_tbl count for top line  = ' || l_sll_in_tbl.count);
9208 
9209   IF l_sll_in_tbl.count= 0 OR l_line_rec.billing_schedule_type IS NULL THEN
9210     RETURN;
9211   END IF;
9212 
9213  -------------------------------------------------------------------------
9214  -- Begin partial period computation logic
9215  -- Developer Mani Choudhary
9216  -- Date 09-MAY-2005
9217  -- Added two new parameters p_period_start and p_period_type
9218  -------------------------------------------------------------------------
9219     Create_Level_elements(p_billing_type     =>  NVL(l_line_rec.billing_schedule_type,'T'),
9220                           p_sll_tbl          =>  l_sll_in_tbl,
9221                           p_line_rec         =>  l_top_line_rec,
9222                           p_invoice_ruleid   =>  l_line_rec.inv_rule_id,
9223                           p_term_dt          =>  p_term_dt,
9224                           p_period_start     =>  l_period_start,
9225                           p_period_type      =>  l_period_type,
9226                           x_return_status    =>  x_return_status );
9227 
9228    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9229      fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.top_lvl_ele',
9230                        'Create_Level_elements(x_return_status = '||x_return_status
9231                        ||')');
9232    END IF;
9233 
9234    IF x_return_status <> 'S' THEN
9235      RAISE G_EXCEPTION_HALT_VALIDATION;
9236    END IF;
9237 
9238    IF l_line_rec.billing_schedule_type IN ('T','E') THEN
9239       l_top_bs_tbl.DELETE;
9240       l_index  := 1;
9241 
9242       FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
9243       LOOP
9244         l_top_bs_tbl(l_index).id                     := l_line_BS_rec.id;
9245         l_top_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
9246         l_top_bs_tbl(l_index).date_end               := l_line_bs_rec.date_end;
9247         l_top_bs_tbl(l_index).Amount                 := 0;
9248         l_top_bs_tbl(l_index).object_version_number  := l_line_BS_rec.object_version_number;
9249         l_top_bs_tbl(l_index).date_transaction   := l_line_BS_rec.date_transaction;
9250         l_top_bs_tbl(l_index).date_to_interface  := l_line_BS_rec.date_to_interface;
9251 
9252         l_index := l_index + 1;
9253       END LOOP;
9254       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9255 
9256           fnd_log.STRING (fnd_log.level_statement,
9257                    G_MODULE_CURRENT || '.terminate_bill_sch.top_bs',
9258                       'top bs tbl count = ' || l_top_bs_tbl.count);
9259       END IF;
9260    END IF;       -----end of  'T'
9261 
9262 
9263    --if schedule is for top level line then find sub line and repeat THE process.
9264    IF l_Line_Rec.chr_id is not null AND l_Line_Rec.lse_id IN (1, 12, 14, 19) then
9265 
9266      FOR l_all_SubLine_rec IN l_all_SubLine_Csr(l_Line_Rec.id,l_Line_Rec.lse_id)
9267      LOOP
9268 
9269        l_cp_rec.cp_id          :=  l_all_SubLine_rec.subline_id ;
9270        l_cp_rec.cp_start_dt    :=  l_all_SubLine_rec.cp_start_dt;
9271        l_cp_rec.cp_end_dt      :=  l_all_SubLine_rec.cp_end_dt ;
9272        l_cp_rec.cp_amt         :=  l_all_SubLine_rec.subline_amt ;
9273        l_cp_rec.cp_price_uom   :=  l_all_SubLine_rec.price_uom;
9274        l_cp_rec.cp_lse_id      :=  l_all_SubLine_rec.cp_lse_id;
9275        l_cp_rec.cp_price_uom   :=  l_all_SubLine_rec.price_uom;
9276 
9277        IF l_period_type is not null AND l_period_start is not NULL THEN
9278           OPEN l_subline_amt_csr(l_all_SubLine_rec.subline_id);
9279           FETCH l_subline_amt_csr INTO l_cp_rec.cp_amt;
9280           CLOSE l_subline_amt_csr;
9281        END IF;
9282        IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9283 
9284            fnd_log.STRING (fnd_log.level_statement,
9285                    G_MODULE_CURRENT || '.terminate_bill_sch.loop_cp_dtl',
9286                       'id = ' || l_all_SubLine_rec.subline_id
9287                    || ', start dt = ' || l_all_SubLine_rec.cp_start_dt
9288                    || ', end dt = ' || l_all_SubLine_rec.cp_end_dt
9289                    || ', amt = ' || l_all_SubLine_rec.subline_amt
9290                    || ', previous cp_term_dt = ' || l_all_subline_rec.cp_prev_term_dt
9291                  );
9292        END IF;
9293 
9294 
9295 
9296       IF TRUNC(p_term_dt) > l_cp_rec.cp_end_dt THEN
9297         IF l_line_rec.billing_schedule_type IN ('T', 'E') and l_top_bs_tbl.count > 0 THEN
9298 
9299            Rollup_lvl_amt(
9300                    p_Line_Rec     =>l_top_line_rec,
9301                    p_SubLine_rec    => l_cp_rec,
9302                    p_top_line_bs    => l_top_bs_tbl,
9303                    x_return_status  => x_return_status);
9304 
9305           IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9306                fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.adj_lvl_amt',
9307                        'Rollup_lvl_amt(x_return_status = '||x_return_status
9308                        ||')');
9309            END IF;
9310 
9311            IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9312             RAISE G_EXCEPTION_HALT_VALIDATION;
9313            END IF;
9314         END IF;
9315 
9316       ELSE    --term_dt < end date
9317 
9318        l_sll_in_tbl.DELETE;
9319        l_prev_term_dt := NULL;    ---for bug#3254423
9320 
9321        Get_SLL_info(p_top_line_id      => p_top_line_id,
9322                        p_line_id          => l_cp_rec.cp_id,
9323                        x_sll_tbl          => l_sll_in_tbl,
9324                        x_sll_db_tbl       => l_sll_db_tbl,
9325                        x_return_status    =>  x_return_status );
9326 
9327        IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9328           fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_sll',
9329                        'Get_SLL_info(x_return_status = '||x_return_status
9330                        ||', sll tbl count = '||l_sll_in_tbl.count||')');
9331        END IF;
9332 
9333        IF x_return_status <> 'S' THEN
9334             RAISE G_EXCEPTION_HALT_VALIDATION;
9335        END IF;
9336 
9337        IF l_sll_in_tbl.count= 0  THEN
9338           RETURN;
9339        END IF;
9340 
9341        ---if sub line is already terminated
9342        IF l_all_subline_rec.cp_prev_term_dt IS NOT NULL THEN
9343          IF nvl(l_all_SubLine_rec.full_credit, 'N') = 'Y' THEN
9344            --with full credit change the term dt as subline start dt
9345            l_prev_term_dt := l_cp_rec.cp_start_dt;
9346          ELSE
9347            l_prev_term_dt := l_all_subline_rec.cp_prev_term_dt;
9348          END IF;
9349        ELSE           --sub line not terminated already
9350 
9351          IF nvl(p_sub_line_id, 100) =  -100 THEN         --full credit flag
9352            l_prev_term_dt := l_cp_rec.cp_start_dt;
9353          END IF;
9354 
9355        END IF;  ---chk subline already terminated
9356 
9357        -------------------------------------------------------------------------
9358        -- Begin partial period computation logic
9359        -- Developer Mani Choudhary
9360        -- Date 09-MAY-2005
9361        -- Added two new parameters p_period_start and p_period_type
9362        -------------------------------------------------------------------------
9363        Create_cp_lvl_elements
9364           ( p_billing_type      =>  NVL(l_line_rec.billing_schedule_type,'T'),
9365             p_cp_sll_tbl        => l_sll_in_tbl,
9366             p_Line_Rec          => l_top_line_rec,
9367             p_SubLine_rec       => l_cp_Rec,
9368             p_invoice_rulid     => l_line_rec.inv_rule_id,
9369             p_top_line_bs       => l_top_bs_tbl,
9370             p_term_dt           => nvl(l_prev_term_dt,p_term_dt),
9371             p_period_start      =>  l_period_start,
9372             p_period_type       =>  l_period_type,
9373             x_return_status     => x_return_status);
9374 
9375         IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9376           fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_lvl_ele',
9377                        'Create_cp_lvl_elements(x_return_status = '||x_return_status
9378                        ||', l_prev_term_dt = '||l_prev_term_dt
9379                        ||', p_term_dt = ' || p_term_dt ||' , l_period_start '||l_period_start||', l_period_type '||l_period_type||')');
9380         END IF;
9381 
9382 
9383        IF x_return_status <> 'S' THEN
9384           RAISE G_EXCEPTION_HALT_VALIDATION;
9385        END IF;
9386       END IF;           ----end of term_dt > end date
9387      END LOOP;
9388    END IF; ---END OF SUBLINE LOOP
9389 
9390 
9391    IF l_top_bs_tbl.COUNT >0 THEN            ---only for type 'T' l_top_bs_tbl will be having records
9392       OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
9393                p_api_version                  => l_api_version,
9394                p_init_msg_list                => l_init_msg_list,
9395                x_return_status                => x_return_status,
9396                x_msg_count                    => x_msg_count,
9397                x_msg_data                     => x_msg_data,
9398                p_letv_tbl                     => l_top_bs_tbl,
9399                x_letv_tbl                     => l_lvl_ele_tbl_out);
9400 
9401       IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9402           fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.update_bs',
9403                        'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status
9404                        ||', top bs count = '||l_lvl_ele_tbl_out.count ||')');
9405       END IF;
9406 
9407       IF  x_return_status <> 'S' THEN
9408         RAISE G_EXCEPTION_HALT_VALIDATION;
9409       END IF;
9410    END IF;        ----end of  l_top_bs_tbl.COUNT >0
9411 
9412 ELSE                 ---if only one subline is terminated
9413 
9414     ----get subline
9415    Open l_SubLine_Csr;
9416    FETCH l_SubLine_Csr Into l_SubLine_Rec;
9417    If l_SubLine_Csr%Notfound then
9418        Close l_SubLine_Csr;
9419        x_return_status := 'E';
9420        OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'SUB LINE NOT FOUND');
9421        RAISE G_EXCEPTION_HALT_VALIDATION;
9422    End If;
9423    Close l_SubLine_Csr;
9424 
9425    l_cp_rec.cp_id          :=  l_SubLine_rec.subline_id ;
9426    l_cp_rec.cp_start_dt    :=  l_SubLine_rec.cp_start_dt;
9427    l_cp_rec.cp_end_dt      :=  l_SubLine_rec.cp_end_dt ;
9428    l_cp_rec.cp_amt         :=  l_SubLine_rec.subline_amt ;
9429    l_cp_rec.cp_price_uom   :=  l_SubLine_rec.price_uom;
9430    IF l_period_type is not null AND l_period_start is not NULL THEN
9431       OPEN l_subline_amt_csr(l_SubLine_rec.subline_id);
9432       FETCH l_subline_amt_csr INTO l_cp_rec.cp_amt;
9433       CLOSE l_subline_amt_csr;
9434    END IF;
9435    IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9436 
9437            fnd_log.STRING (fnd_log.level_statement,
9438                    G_MODULE_CURRENT || '.terminate_bill_sch.cp_dtl',
9439                       'id = ' || l_all_SubLine_rec.subline_id
9440                    || ', start dt = ' || l_SubLine_rec.cp_start_dt
9441                    || ', end dt = ' || l_SubLine_rec.cp_end_dt
9442                    || ', amt = ' || l_SubLine_rec.subline_amt
9443                  );
9444    END IF;
9445 
9446 
9447    IF TRUNC(p_term_dt) > l_cp_rec.cp_end_dt THEN
9448      RETURN;
9449    END IF;
9450 
9451 
9452   l_sll_in_tbl.DELETE;
9453 
9454   Get_SLL_info(p_top_line_id      => p_top_line_id,
9455                p_line_id          => p_sub_line_id,
9456                x_sll_tbl          => l_sll_in_tbl,
9457                x_sll_db_tbl       => l_sll_db_tbl,
9458                x_return_status    =>  x_return_status );
9459 
9460   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9461           fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_sll',
9462                        'Get_SLL_info(x_return_status = '||x_return_status
9463                        ||', sll tbl count = '||l_sll_in_tbl.count||')');
9464   END IF;
9465 
9466   IF x_return_status <> 'S' THEN
9467      RAISE G_EXCEPTION_HALT_VALIDATION;
9468   END IF;
9469 
9470   IF l_sll_in_tbl.count= 0 OR l_subline_rec.billing_schedule_type IS NULL THEN
9471           RETURN;
9472   END IF;
9473 
9474   IF l_subline_rec.billing_schedule_type IN ('T','E') THEN
9475    l_top_bs_tbl.DELETE;
9476    l_index  := 1;
9477 
9478    FOR l_line_BS_rec IN l_line_BS_csr(p_top_line_id)
9479    LOOP
9480      l_top_bs_tbl(l_index).id                     := l_line_BS_rec.id;
9481      l_top_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
9482      l_top_bs_tbl(l_index).date_end               := l_line_bs_rec.date_end;
9483      l_top_bs_tbl(l_index).Amount                 := l_line_BS_rec.amount;
9484      l_top_bs_tbl(l_index).object_version_number  := l_line_BS_rec.object_version_number;
9485      l_top_bs_tbl(l_index).date_transaction       := l_line_BS_rec.date_transaction;
9486      l_top_bs_tbl(l_index).date_to_interface      := l_line_BS_rec.date_to_interface;
9487 
9488 
9489      l_index := l_index + 1;
9490    END LOOP;
9491 
9492    IF l_top_bs_tbl.COUNT > 0 THEN
9493 
9494      Adjust_top_BS_Amt( p_Line_Rec          => l_top_Line_Rec,
9495                         p_SubLine_rec       => l_cp_Rec,
9496                         p_top_line_bs       => l_top_bs_tbl,
9497                         x_return_status     => x_return_status);
9498 
9499      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9500           fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.adjust_cp_amt',
9501                        'Adjust_top_BS_Amt(x_return_status = '||x_return_status ||')');
9502      END IF;
9503 
9504      IF x_return_status <> 'S' THEN
9505        RAISE G_EXCEPTION_HALT_VALIDATION;
9506      END IF;
9507    END IF;
9508 
9509   END IF;      ---end of T
9510 
9511  -------------------------------------------------------------------------
9512  -- Begin partial period computation logic
9513  -- Developer Mani Choudhary
9514  -- Date 09-MAY-2005
9515  -- Added two new parameters p_period_start and p_period_type
9516  -------------------------------------------------------------------------
9517   Create_cp_lvl_elements
9518           ( p_billing_type      => NVL(l_subline_rec.billing_schedule_type,'T'),
9519             p_cp_sll_tbl        => l_sll_in_tbl,
9520             p_Line_Rec          => l_top_line_rec,
9521             p_SubLine_rec       => l_cp_Rec,
9522             p_invoice_rulid     => l_line_rec.inv_rule_id,
9523             p_top_line_bs       => l_top_bs_tbl,
9524             p_term_dt           => p_term_dt,
9525             p_period_start              =>  l_period_start,
9526             p_period_type               =>  l_period_type,
9527             x_return_status     => x_return_status);
9528 
9529   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9530           fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.cp_bs',
9531                        'Create_cp_lvl_elements(x_return_status = '||x_return_status ||')');
9532   END IF;
9533 
9534   IF x_return_status <> 'S' THEN
9535      RAISE G_EXCEPTION_HALT_VALIDATION;
9536   END IF;
9537 
9538   IF l_subline_rec.billing_schedule_type IN ('E','T') AND l_top_bs_tbl.COUNT > 0 then
9539      OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
9540                p_api_version                  => l_api_version,
9541                p_init_msg_list                => l_init_msg_list,
9542                x_return_status                => x_return_status,
9543                x_msg_count                    => x_msg_count,
9544                x_msg_data                     => x_msg_data,
9545                p_letv_tbl                     => l_top_bs_tbl,
9546                x_letv_tbl                     => l_lvl_ele_tbl_out);
9547 
9548      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
9549           fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.terminate_bill_sch.update_bs',
9550                        'oks_bill_level_elements_pvt.update_row(x_return_status = '||x_return_status
9551                        ||', top bs count = '||l_lvl_ele_tbl_out.count ||')');
9552       END IF;
9553 
9554      IF x_return_status <> 'S' THEN
9555         RAISE G_EXCEPTION_HALT_VALIDATION;
9556      END IF;
9557   END IF;         ---END OF update of top line sch
9558 
9559 end if;       ---end of p_sub_line_id null
9560 
9561 
9562 
9563 EXCEPTION
9564  WHEN G_EXCEPTION_HALT_VALIDATION THEN
9565       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
9566         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
9567       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
9568         RAISE OKC_API.G_EXCEPTION_ERROR;
9569       END IF;
9570  WHEN OTHERS THEN
9571         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
9572                             p_msg_name     => G_UNEXPECTED_ERROR,
9573                             p_token1       => G_SQLCODE_TOKEN,
9574                             p_token1_value => sqlcode,
9575                             p_token2       => G_SQLERRM_TOKEN,
9576                             p_token2_value => sqlerrm);
9577 
9578         x_return_status := G_RET_STS_UNEXP_ERROR;
9579 
9580 END Terminate_bill_sch;
9581 
9582 
9583  -------------------------------------------------------------------------
9584  -- Begin partial period computation logic
9585  -- Developer Mani Choudhary
9586  -- Date 09-MAY-2005
9587  -------------------------------------------------------------------------
9588 PROCEDURE Create_cp_lvl_elements
9589 (           p_billing_type      IN   VARCHAR2,
9590             p_cp_sll_tbl        IN   StrmLvl_Out_tbl,
9591             p_Line_Rec          IN   Line_Det_Type,
9592             p_SubLine_rec       IN   Prod_Det_Type,
9593             p_invoice_rulid     IN   Number,
9594             p_top_line_bs       IN   OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
9595             p_term_dt           IN   DATE,
9596             p_period_start      IN   VARCHAR2,
9597             p_period_type       IN   VARCHAR2,
9598             x_return_status     OUT  NOCOPY Varchar2
9599 )
9600 IS
9601 
9602 l_cp_sll_countER          Number;
9603 l_period_counter          Number;
9604 l_next_cycle_dt           Date;
9605 l_tot_amt                 Number;
9606 l_cp_sll_last             Number;
9607 l_lvl_amt                 Number;
9608 l_adjusted_amt            Number;
9609 l_lvl_loop_counter        Number;
9610 l_last_cycle_dt           Date;
9611 l_bill_sch_amt            NUMBER :=0;
9612 l_uom_quantity            NUMBER;
9613 l_tce_code                VARCHAR2(100) ;
9614 l_period_freq             NUMBER;
9615 l_constant_sll_amt        NUMBER;
9616 l_tbl_seq                 number;
9617 l_remaining_amt           number;
9618 l_tbs_ind                 NUMBER;
9619 l_bill_end_date           DATE;
9620 l_element_end_dt          DATE;
9621 l_term_amt                NUMBER;
9622 l_compare_dt              DATE;
9623 i                         number;
9624 l_end_date                DATE;
9625 l_billed_at_source       OKC_K_HEADERS_ALL_B.BILLED_AT_SOURCE%TYPE;
9626 --
9627    l_init_msg_list      VARCHAR2(2000) := OKC_API.G_FALSE;
9628    l_return_status      VARCHAR2(1);
9629    l_msg_count          NUMBER;
9630    l_msg_data           VARCHAR2(2000);
9631    l_msg_index_out      NUMBER;
9632    l_msg_index  NUMBER;
9633 
9634 -- Start - Added by PMALLARA - Bug #3992530
9635 Lvl_Element_cnt Number := 0;
9636 Strm_Start_Date  Date;
9637 -- End - Added by PMALLARA - Bug #3992530
9638  ------------------------------------------------------------------------
9639  -- Begin partial period computation logic
9640  -- Developer Mani Choudhary
9641  -- Date 17-MAY-2005
9642  -------------------------------------------------------------------------
9643  l_quantity NUMBER;
9644  l_total_quantity NUMBER;
9645  l_duration       NUMBER;
9646  l_uom            VARCHAR2(30);
9647  l_full_period_end_date DATE;
9648  l_last_cmp_date       DATE;
9649 --
9650 --22-MAR-2006 mchoudha Changes for Partial periods CR3
9651 l_running_total  NUMBER;
9652 /*bug8609599*/
9653 l_subline_total  NUMBER;
9654 
9655 BEGIN
9656   -----errorout_ad('in  bill_sch_cp');
9657   x_return_status := 'S';
9658   l_bill_sch_amt := 0;
9659   l_lvl_ele_tbl_in.delete;
9660   l_tbl_seq := 1;
9661   --22-MAR-2006 mchoudha Changes for Partial periods CR3
9662   l_running_total := p_SubLine_rec.cp_amt;
9663   /*bug8609599*/
9664   l_subline_total := p_SubLine_rec.cp_amt;
9665    ------------------------------------------------------------------------
9666  -- Begin partial period computation logic
9667  -- Developer Mani Choudhary
9668  -- Date 17-MAY-2005
9669  -- If price UOM is NULL , then derive the  UOM based on the effective dates
9670  -- of the subline.
9671  -------------------------------------------------------------------------
9672   IF (p_SubLine_rec.cp_price_uom is null) THEN
9673     OKC_TIME_UTIL_PUB.Get_Duration(p_SubLine_rec.cp_start_dt,p_SubLine_rec.cp_end_dt,l_duration,l_uom,x_return_status);
9674   END IF;
9675  ------------------------------------------------------------------------
9676  -- End partial period computation logic
9677  -------------------------------------------------------------------------
9678 
9679  IF TRUNC(nvl((p_term_dt-1),p_SubLine_rec.cp_end_dt)) > p_SubLine_rec.cp_end_dt THEN
9680    l_end_date := p_SubLine_rec.cp_end_dt;
9681  ELSE
9682    l_end_date := TRUNC(nvl((p_term_dt-1),p_SubLine_rec.cp_end_dt)) ;
9683  END IF;
9684 
9685 
9686   IF l_header_billing IS NULL THEN
9687      Delete_lvl_element(p_cle_id        => p_SubLine_rec.cp_id,
9688                         x_return_status => x_return_status);
9689 
9690      IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9691         RAISE G_EXCEPTION_HALT_VALIDATION;
9692      END IF;
9693   END IF;
9694 
9695   ----(terminate dt - 1) < st dt then do not create lvl element.
9696 
9697  IF TRUNC(p_SubLine_rec.cp_start_dt)  > l_end_date THEN
9698      -----errorout_ad('p_top_line_bs COUNT = '|| p_top_line_bs.COUNT);
9699      IF  p_cp_sll_tbl.count > 0 AND p_top_line_bs.COUNT > 0THEN
9700 
9701 
9702        FOR l_cp_sll_counter IN p_cp_sll_tbl.first .. p_cp_sll_tbl.LAST
9703        LOOP
9704 
9705        Check_Existing_Lvlelement(
9706            p_sll_id              => p_cp_sll_tbl(l_cp_sll_counter).id,
9707            p_sll_dt_start        => p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9708            p_uom                => p_cp_sll_tbl(l_cp_sll_counter).uom,
9709            p_uom_per_period     => p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9710            p_cp_end_dt           => p_SubLine_rec.cp_end_dt,
9711            x_next_cycle_dt       => l_next_cycle_dt,
9712            x_last_cycle_dt       => l_last_cycle_dt,
9713            x_period_counter      => l_period_counter,
9714            x_sch_amt             => l_bill_sch_amt,
9715            x_top_line_bs         => p_top_line_bs,
9716            x_return_status       => x_return_status);
9717 
9718            -----errorout_ad('Check_Existing_Lvlelement 1 = '|| x_return_status);
9719            IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9720               RAISE G_EXCEPTION_HALT_VALIDATION;
9721            END IF;
9722        END LOOP;
9723      END IF;     ---END OF p_cp_sll_tbl.count
9724 
9725      x_return_status := 'S';
9726      RETURN;
9727  END IF;
9728 
9729  IF p_cp_sll_tbl.count > 0 then
9730 
9731     l_cp_sll_counter := p_cp_sll_tbl.FIRST;
9732     L_cp_sll_last    := p_cp_sll_tbl.LAST;
9733 
9734 
9735     LOOP      ------LOOP for sll item
9736       -----errorout_ad('SUB LINE START DATE PASSED TO CHECK LEVELEMENT : '||to_char(p_SubLine_rec.cp_start_dt));
9737       -----errorout_ad('passed l_bill_sch_amt = ' || l_bill_sch_amt);
9738 
9739       IF l_header_billing IS NOT NULL THEN           ----hdr lvl billing no old sll and lvl elements
9740         l_next_cycle_dT := p_cp_sll_tbl(l_cp_sll_counter).dt_start;
9741         l_lvl_loop_counter := 1;
9742         l_period_counter := 1;
9743       ELSE
9744         Check_Existing_Lvlelement(
9745            p_sll_id              => p_cp_sll_tbl(l_cp_sll_counter).id,
9746            p_sll_dt_start        => p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9747            p_uom                => p_cp_sll_tbl(l_cp_sll_counter).uom,
9748            p_uom_per_period     => p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9749            p_cp_end_dt           => p_SubLine_rec.cp_end_dt,
9750            x_next_cycle_dt       => l_next_cycle_dt,
9751            x_last_cycle_dt       => l_last_cycle_dt,
9752            x_period_counter      => l_period_counter,
9753            x_sch_amt             => l_bill_sch_amt,
9754            x_top_line_bs         => p_top_line_bs,
9755            x_return_status       => x_return_status);
9756 
9757            -----errorout_ad('Check_Existing_Lvlelement 2= '|| x_return_status);
9758 
9759            IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9760                   RAISE G_EXCEPTION_HALT_VALIDATION;
9761            END IF;
9762 
9763         l_lvl_loop_counter := l_period_counter;
9764 
9765 
9766         -----errorout_ad('l_period_counter = '|| l_period_counter);
9767         -----errorout_ad('l_last_cycle_dt = ' || l_last_cycle_dt);
9768         -----errorout_ad('l_bill_sch_amt = ' || l_bill_sch_amt);
9769       END IF ;
9770 
9771       IF l_period_counter > to_number(p_cp_sll_tbl(l_cp_sll_counter).level_period) THEN
9772 
9773         IF l_cp_sll_counter + 1 <= p_cp_sll_tbl.LAST THEN
9774           l_next_cycle_dt := p_cp_sll_tbl(l_cp_sll_counter + 1).dt_start;
9775         ELSE
9776           l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
9777                                    (p_cp_sll_tbl(l_cp_sll_counter).dt_start,
9778                                     p_cp_sll_tbl(l_cp_sll_counter).uom,
9779                                     (p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period *
9780                                             p_cp_sll_tbl(l_cp_sll_counter).level_period));
9781 
9782            l_next_cycle_dt := l_next_cycle_dt + 1;
9783         END IF;
9784 
9785       ELSE
9786 
9787            -----------errorout_ad('going in');
9788            -----------errorout_ad('l_last_cycle_dt = ' || l_last_cycle_dt);
9789         IF l_next_cycle_dt IS NULL THEN
9790            l_next_cycle_dt := OKC_TIME_UTIL_PUB.get_enddate
9791                                            (l_last_cycle_dt,
9792                                             p_cp_sll_tbl(l_cp_sll_counter).uom,
9793                                             p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period);
9794 
9795            l_next_cycle_dt := l_next_cycle_dt + 1;
9796 
9797         END IF;
9798 
9799         ---if cycle start dt is greater then cp end date then exit the procedure.
9800 
9801         -----errorout_ad('AFTER CHECK l_next_cycle_dt = '|| l_next_cycle_dt);
9802 
9803         IF TRUNC(l_next_cycle_dt) > l_end_date THEN
9804 
9805            IF l_cp_sll_counter < p_cp_sll_tbl.LAST AND p_top_line_bs.COUNT > 0 THEN
9806 
9807              l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
9808 
9809 
9810              FOR i IN l_cp_sll_counter .. p_cp_sll_tbl.LAST
9811              LOOP
9812 
9813               Check_Existing_Lvlelement(
9814                p_sll_id              => p_cp_sll_tbl(i).id,
9815                p_sll_dt_start        => p_cp_sll_tbl(i).dt_start,
9816                p_uom                => p_cp_sll_tbl(i).uom,
9817                p_uom_per_period     => p_cp_sll_tbl(i).uom_per_period,
9818                p_cp_end_dt           => p_SubLine_rec.cp_end_dt,
9819                x_next_cycle_dt       => l_next_cycle_dt,
9820                x_last_cycle_dt       => l_last_cycle_dt,
9821                x_period_counter      => l_period_counter,
9822                x_sch_amt             => l_bill_sch_amt,
9823                x_top_line_bs         => p_top_line_bs,
9824                x_return_status       => x_return_status);
9825 
9826                -----errorout_ad('Check_Existing_Lvlelement 3= '|| x_return_status);
9827 
9828                IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9829                   RAISE G_EXCEPTION_HALT_VALIDATION;
9830                END IF;
9831             END LOOP;
9832            END IF;   ----END OF l_cp_sll_counter < p_cp_sll_tbl.LAST
9833 
9834            x_return_status := 'S';
9835            RETURN;
9836 
9837         END IF;
9838         IF l_cp_sll_counter  < p_cp_sll_tbl.LAST THEN
9839 
9840            l_compare_dt :=  TRUNC(p_cp_sll_tbl(l_cp_sll_counter + 1).dt_start);
9841         ELSE
9842 
9843            l_compare_dt := TRUNC( p_SubLine_rec.cp_end_dt) + 1;
9844         END IF;
9845 
9846         IF TRUNC(l_next_cycle_dt) >= l_compare_dt THEN
9847 
9848           NULL;
9849           -----------errorout_ad('COMING IN');
9850         ELSE
9851 
9852          IF p_billing_type = 'T' THEN
9853             OKS_BILL_UTIL_PUB.get_seeded_timeunit(
9854                 p_timeunit      => p_cp_sll_tbl(l_cp_sll_counter).uom,
9855                 x_return_status => x_return_status,
9856                 x_quantity      => l_uom_quantity ,
9857                 x_timeunit      => l_tce_code);
9858 
9859            IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9860               RAISE G_EXCEPTION_HALT_VALIDATION;
9861            END IF;
9862 
9863 
9864           l_remaining_amt := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0);
9865 
9866            -------------------------------------------------------------------------
9867            -- Begin partial period computation logic
9868            -- Developer Mani Choudhary
9869            -- Date 17-MAY-2005
9870            -- get the converted unit price per SLL UOM derived from the unit price stored at the
9871            -- subline.
9872            -------------------------------------------------------------------------
9873 
9874 
9875            IF p_period_start is not null  AND
9876               p_period_type is not null
9877            THEN
9878               --new procedure for CALENDAR START and service start
9879               --30-DEC-2005 mchoudha fixed bug#4895586
9880               --Added an extra parameter termination date to this API
9881               l_constant_sll_amt := OKS_BILL_SCH.Get_Unit_Price_Per_Uom
9882                                                       (p_SubLine_rec.cp_id,
9883                                                        p_cp_sll_tbl(l_cp_sll_counter).uom,
9884                                                        p_period_start,
9885                                                        p_period_type,
9886                                                        p_cp_sll_tbl(l_cp_sll_counter).uom_per_period,
9887                                                        l_end_date,
9888                                                        p_term_dt);
9889 
9890               IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9891                  fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements',
9892                        'after calling OKS_BILL_SCH.Get_Unit_Price_Per_Uom  '
9893                      ||' result l_constant_sll_amt = ' || l_constant_sll_amt);
9894               END IF;
9895               IF l_constant_sll_amt IS NULL THEN
9896                 x_return_status := G_RET_STS_ERROR;
9897                 RAISE G_EXCEPTION_HALT_VALIDATION;
9898               END IF;
9899               --errorout_ad(' l_constant_sll_amt '||l_constant_sll_amt);
9900             ELSE
9901 
9902 
9903 
9904                Get_Constant_sll_Amount(p_line_start_date      => p_SubLine_rec.cp_start_dt,
9905                                  p_line_end_date         => p_SubLine_rec.cp_end_dt,
9906                                  p_cycle_start_date      => l_next_cycle_dt,
9907                                  p_remaining_amount      => l_remaining_amt,
9908                                  P_uom_quantity          => l_uom_quantity,
9909                                  P_tce_code              => l_tce_code,
9910                                  x_constant_sll_amt      => l_constant_sll_amt,
9911                                  x_return_status         => x_return_status);
9912             END IF;
9913           -----errorout_ad('Get_Constant_sll_Amount = ' || l_constant_sll_amt);
9914 
9915            IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
9916               RAISE G_EXCEPTION_HALT_VALIDATION;
9917            END IF;
9918         END IF;
9919 
9920 
9921         IF p_top_line_bs.COUNT > 0 THEN
9922            -----errorout_ad('IN SLL l_next_cycle_dt = ' || l_next_cycle_dt);
9923            l_tbs_ind := p_top_line_bs.FIRST;
9924            WHILE TRUNC(l_next_cycle_dt) > p_top_line_bs(l_tbs_ind).DATE_START AND l_tbs_ind < p_top_line_bs.LAST
9925            LOOP
9926               l_tbs_ind := p_top_line_bs.NEXT(l_tbs_ind);
9927            END LOOP;
9928 
9929            -----errorout_ad('after while LOOP l_tbs_ind = ' || l_tbs_ind);
9930            -------errorout_ad('last = '|| p_top_line_bs.LAST);
9931 
9932            ---chk l_next_cycle_dt if between previous and present record
9933            IF l_tbs_ind = p_top_line_bs.first THEN
9934               NULL;
9935 
9936            ELSIF  l_tbs_ind <= p_top_line_bs.LAST THEN
9937               -----errorout_ad('COMING IN');
9938 
9939               l_element_end_dt := TRUNC(p_top_line_bs(l_tbs_ind ).DATE_END);
9940 
9941 
9942               IF TRUNC(l_next_cycle_dt) >= p_top_line_bs(l_tbs_ind ).DATE_START
9943                      AND TRUNC(l_next_cycle_dt) <= l_element_end_dt THEN
9944 
9945                     NULL;
9946               ELSE
9947                     l_tbs_ind := l_tbs_ind + 1;
9948               END IF;
9949               -----errorout_ad('FINAL l_tbs_ind = '|| l_tbs_ind);
9950 
9951 
9952 
9953           elsif TRUNC(p_SubLine_rec.cp_start_dt) = p_top_line_bs(l_tbs_ind ).DATE_START THEN
9954               l_tbs_ind := p_top_line_bs.first;
9955           END IF;
9956            -----errorout_ad('IN sll LOOP l_tbs_ind = ' || l_tbs_ind);
9957        END IF;
9958 
9959        ------------------------------------------------------------------------
9960        -- Begin partial period computation logic
9961        -- Developer Mani Choudhary
9962        -- Date 17-MAY-2005
9963        -- For manual covered levels, should take the billing uom as honoured in Get_Unit_Price_Per_Uom
9964        -------------------------------------------------------------------------
9965        IF p_subline_rec.cp_lse_id in (8,10,11,35) THEN
9966           l_uom := p_cp_sll_tbl(l_cp_sll_counter).uom;
9967 
9968           IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9969                  fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements',
9970                  ' result l_uom = ' || l_uom);
9971           END IF;
9972 
9973        END IF;
9974        OKS_BILL_UTIL_PUB.Get_Seeded_Timeunit
9975                     (p_timeunit      => p_cp_sll_tbl(l_cp_sll_counter).uom,
9976                      x_return_status => x_return_status,
9977                      x_quantity      => l_uom_quantity ,
9978                      x_timeunit      => l_tce_code);
9979        IF x_return_status <> 'S' THEN
9980          RAISE G_EXCEPTION_HALT_VALIDATION;
9981        END IF;
9982        ------------------------------------------------------------------------
9983        -- End partial period computation logic
9984        ------------------------------------------------------------------------
9985 
9986 -- Start - Added by PMALLARA - Bug #3992530
9987     Lvl_Element_cnt  := l_period_counter - 1;
9988     Strm_Start_Date  :=   p_cp_sll_tbl(l_cp_sll_counter).dt_start;
9989       LOOP                          -------------for level elements of one rule
9990     Lvl_Element_cnt  :=     Lvl_Element_cnt + 1;
9991 -- End - Added by PMALLARA - Bug #3992530
9992           -----errorout_ad ('INSIDE LVL ELEMENT l_next_cycle_dt = ' || TO_CHAR(l_next_cycle_dt));
9993           -----errorout_ad('INSIDE LVL ELEMENT l_tbs_ind = ' || l_tbs_ind);
9994 
9995           l_fnd_lvl_in_rec.line_start_date           := p_SubLine_rec.cp_start_dt;
9996           l_fnd_lvl_in_rec.line_end_date             := nvl((p_term_dt - 1),p_SubLine_rec.cp_end_dt);
9997           l_fnd_lvl_in_rec.cycle_start_date          := l_next_cycle_dt;
9998 -- Start - Modified by PMALLARA - Bug #3992530
9999         l_fnd_lvl_in_rec.tuom_per_period           := Lvl_Element_cnt * p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period;
10000 -- End - Modified by PMALLARA - Bug #3992530
10001           l_fnd_lvl_in_rec.tuom                      := p_cp_sll_tbl(l_cp_sll_counter).uom;
10002           l_fnd_lvl_in_rec.bill_type                 := p_billing_type;
10003 
10004           IF p_billing_type = 'T' THEN
10005 
10006             l_fnd_lvl_in_rec.total_amount            := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0) ;
10007 
10008             -----errorout_ad('subline amount  :' || l_fnd_lvl_in_rec.total_amount ));
10009 
10010           ELSE             --(for E and P just pass 0 as for lvlelement l_lvl_amt will be passed)
10011 
10012             l_fnd_lvl_in_rec.total_amount            := 0;
10013           END IF;
10014 
10015           l_fnd_lvl_in_rec.invoice_offset_days        := p_cp_sll_tbl(l_cp_sll_counter).invoice_offset_days;
10016           l_fnd_lvl_in_rec.interface_offset_days     := p_cp_sll_tbl(l_cp_sll_counter).Interface_offset_days;
10017         --mchoudha added this parameter
10018         l_fnd_lvl_in_rec.uom_per_period            := p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period;
10019 
10020           -----errorout_ad(' l_fnd_lvl_in_rec.line_start_date = ' || l_fnd_lvl_in_rec.line_start_date);
10021           -----errorout_ad(' l_fnd_lvl_in_rec.line_end_date = ' || l_fnd_lvl_in_rec.line_end_date);
10022           -----errorout_ad(' l_fnd_lvl_in_rec.cycle_start_date = ' || to_char(l_fnd_lvl_in_rec.cycle_start_date));
10023           -----errorout_ad(' l_fnd_lvl_in_rec.uom_per_period = ' || l_fnd_lvl_in_rec.uom_per_period);
10024           -----errorout_ad(' l_fnd_lvl_in_rec.uom = ' || l_fnd_lvl_in_rec.uom);
10025  -------------------------------------------------------------------------
10026  -- Begin partial period computation logic
10027  -- Developer Mani Choudhary
10028  -- Date 09-MAY-2005
10029  -- Added two new parameters p_period_start and p_period_type
10030  -------------------------------------------------------------------------
10031 
10032         -- Start - Modified by PMALLARA - Bug #3992530
10033          IF fnd_log.level_procedure >= fnd_log.g_current_runtime_level THEN
10034              fnd_log.string(fnd_log.level_procedure,G_MODULE_CURRENT||'.Create_cp_Lvl_elements.lvl_loop',
10035                        'Calling oks_bill_util_pub.Get_next_bill_sch with parameters '
10036                        ||'period start = ' || p_period_start
10037                        ||', period type = ' || p_period_type);
10038           END IF;
10039           OKS_BILL_UTIL_PUB.Get_next_bill_sch
10040               (p_api_version             => l_api_version,
10041                x_return_status           => x_return_status,
10042                x_msg_count               => l_msg_count,
10043                x_msg_data                => l_msg_data,
10044                p_invoicing_rule_id       => p_invoice_rulid,
10045                p_bill_sch_detail_rec     => l_fnd_lvl_in_rec,
10046                x_bill_sch_detail_rec     => l_fnd_lvl_out_rec,
10047                p_period_start              =>  p_period_start,
10048                p_period_type               =>  p_period_type,
10049                Strm_Start_Date => Strm_Start_Date);
10050         -- End - Modified by PMALLARA - Bug #3992530
10051 
10052 
10053           -----errorout_ad(' OKS_BILL_UTIL_PUB.Get_next_bill_sch l_fnd_next_cycle = ' || x_return_status);
10054           -----errorout_ad('l_fnd_lvl_out_rec.next_cycle_date = ' || l_fnd_lvl_out_rec.next_cycle_date );
10055 
10056 
10057           IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
10058             RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
10059           ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
10060             RAISE OKC_API.G_EXCEPTION_ERROR;
10061           END IF;
10062 
10063 
10064           -------Next cycle date given by Get_next_bill_sch is <= cp start date then do not create
10065           ------level element AND fro daily billing only chk Get_next_bill_sch is < cp start date.
10066 
10067           IF  TRUNC(l_fnd_lvl_out_rec.next_cycle_date) <= p_SubLine_rec.cp_start_dt THEN
10068             -----errorout_ad('going in null');
10069             l_adjusted_amt := 0;
10070             l_tbs_ind := l_tbs_ind + 1;
10071           ELSE
10072              -----errorout_ad('going not in null');
10073             -----level element amount rounding and adjustment for last line
10074 
10075 
10076              IF  p_billing_type = 'T' THEN         ----FOR TYPE 'T'
10077 
10078                  ------------------------------------------------------------------------
10079                  -- Begin partial period computation logic
10080                  -- Developer Mani Choudhary
10081                  -- Date 17-MAY-2005
10082                  -- Added two new parameters p_period_start and p_period_type
10083                  -------------------------------------------------------------------------
10084 
10085                   IF p_period_start is not null   AND
10086                      p_period_type is not null
10087                   THEN
10088 
10089                        --to check if  first partial period
10090                         IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) >
10091                            p_SubLine_rec.cp_start_dt     AND
10092                            TRUNC(l_next_cycle_dt)<
10093                            p_SubLine_rec.cp_start_dt
10094                         THEN
10095                           IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
10096                             l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
10097                                            (p_start_date   => p_SubLine_rec.cp_start_dt,
10098                                             p_end_date     => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
10099                                             p_source_uom   => l_fnd_lvl_in_rec.tuom,--nvl(p_SubLine_rec.cp_price_uom,l_uom), --line price uom
10100                                             p_period_type  => p_period_type ,
10101                                             p_period_start => p_period_start);
10102 
10103                             IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10104                                fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Service',
10105                               'after calling OKS_TIME_MEASURES_PUB.get_quantity  with period start '||p_period_start||' ,p_period_type '||p_period_type
10106                                ||' result l_quantity = ' || l_quantity);
10107                             END IF;
10108 
10109                             IF nvl(l_quantity,0) = 0 THEN
10110                               x_return_status := G_RET_STS_ERROR;
10111                               RAISE G_EXCEPTION_HALT_VALIDATION;
10112                             END IF;
10113 
10114                             l_lvl_amt :=  nvl(l_constant_sll_amt*l_quantity/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
10115 
10116                             IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10117                                fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Service',
10118                                ' result l_lvl_amt = ' || l_lvl_amt);
10119                             END IF;
10120                           --mchoudha added else logic for WEEK kind of uoms
10121                           ELSE
10122                               l_lvl_amt := nvl(l_constant_sll_amt*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(p_SubLine_rec.cp_start_dt))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
10123 
10124                           END IF;
10125 
10126                            --errorout_ad(' l_quantity '||l_quantity);
10127                            --errorout_ad(' l_total_quantity '||l_total_quantity);
10128                            --errorout_ad(' l_lvl_amt '||l_lvl_amt);
10129                           ELSE
10130 
10131                             IF p_period_start = 'CALENDAR'  AND
10132                                p_period_start is not null         AND
10133                                p_period_type is not null          AND
10134                                TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
10135                             THEN
10136 
10137                               --errorout_ad(' uom '||nvl(p_SubLine_rec.cp_price_uom,l_uom));
10138                               --errorout_ad(' start date '||to_char(l_next_cycle_dt));
10139                               --errorout_ad(' start date '||to_char(TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1));
10140                               --errorout_ad('p_period_start '||p_period_start);
10141                               --errorout_ad('p_period_type '||p_period_type);
10142                               IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
10143                               l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
10144                                            (p_start_date   => l_next_cycle_dt,
10145                                             p_end_date     => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
10146                                             p_source_uom   =>  l_fnd_lvl_in_rec.tuom,--nvl(p_SubLine_rec.cp_price_uom,l_uom), --line price uom
10147                                             p_period_type  => p_period_type,
10148                                             p_period_start => p_period_start);
10149 
10150                               IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10151                                  fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Calendar',
10152                                  'after calling OKS_TIME_MEASURES_PUB.get_quantity  with period start '||p_period_start||' ,p_period_type '||p_period_type
10153                                  ||' result l_quantity = ' || l_quantity);
10154                               END IF;
10155 
10156                              --errorout_ad(' l_quantity '||l_quantity);
10157                                                       --errorout_ad(' b4 calling quantity2');
10158                              IF nvl(l_quantity,0) = 0 THEN
10159                                x_return_status := G_RET_STS_ERROR;
10160                                RAISE G_EXCEPTION_HALT_VALIDATION;
10161                              END IF;
10162 
10163 
10164                              l_lvl_amt :=  nvl(l_constant_sll_amt*l_quantity/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
10165 
10166                              IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10167                                 fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.Calendar',
10168                                 ' result l_lvl_amt = ' || l_lvl_amt);
10169                              END IF;
10170 
10171                           --mchoudha added else logic for WEEK kind of uoms
10172                           ELSE
10173                               l_lvl_amt := nvl(l_constant_sll_amt*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(l_next_cycle_dt))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0);   --bugfix 5485442
10174 
10175                           END IF;
10176                              --errorout_ad(' l_lvl_amt '||l_lvl_amt);
10177 
10178                             ELSE
10179                                     l_lvl_amt :=  nvl(l_constant_sll_amt,0);
10180                                     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10181                                        fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.top_level.full-period',
10182                                       '  l_lvl_amt = ' || l_lvl_amt);
10183                                     END IF;
10184 
10185                                     --errorout_ad(' l_lvl_amt in else '||l_lvl_amt);
10186                             END IF;
10187                           END IF;
10188                   ELSE    --period start and period type are not null
10189 
10190                       l_adjusted_amt := 0;
10191                       Get_Period_Frequency(p_line_start_date => p_SubLine_rec.cp_start_dt,
10192                               p_line_end_date         => p_SubLine_rec.cp_end_dt,
10193                               p_cycle_start_date      => l_next_cycle_dt,
10194                               p_next_billing_date     => trunc(l_fnd_lvl_out_rec.next_cycle_date),
10195                               P_uom_quantity          => l_uom_quantity,
10196                               P_tce_code              => l_tce_code,
10197                               p_uom_per_period       => p_cp_sll_tbl(l_cp_sll_counter).uom_Per_Period,
10198                               x_period_freq           => l_period_freq,
10199                               x_return_status         => x_return_status);
10200 
10201 
10202                          -----errorout_ad('Get_Period_Frequency = ' || x_return_status);
10203                       IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
10204                          RAISE G_EXCEPTION_HALT_VALIDATION;
10205                       END IF;
10206 
10207                       l_lvl_amt := (NVL(l_period_freq,0) * NVL(l_constant_sll_amt,0) );
10208 
10209                       --l_lvl_amt := l_fnd_lvl_out_rec.cycle_amount;
10210 
10211                   END IF;   --period start and period type are not null
10212             ELSE                          ------FOR E
10213                             IF p_period_start = 'CALENDAR'  AND
10214                                p_period_start is not null         AND
10215                                p_period_type is not null          AND
10216                                TRUNC(l_next_cycle_dt,'MM') <> TRUNC(l_next_cycle_dt)
10217                             THEN
10218                               --errorout_ad(' Equal uom '||l_fnd_lvl_in_rec.tuom);
10219                                  --errorout_ad(' start date '||to_char(l_next_cycle_dt));
10220                               --errorout_ad(' end date '||to_char(TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1));
10221                               --errorout_ad('p_period_start '||p_period_start);
10222                               --errorout_ad('p_period_type '||p_period_type);
10223                               IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
10224                                 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
10225                                            (p_start_date   => l_next_cycle_dt,
10226                                             p_end_date     => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
10227                                             p_source_uom   => l_fnd_lvl_in_rec.tuom, --line price uom
10228                                             p_period_type  => p_period_type,
10229                                             p_period_start => p_period_start);
10230 
10231                                 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10232                                    fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.Equal_amount.Calendar',
10233                                    'after calling OKS_TIME_MEASURES_PUB.get_quantity  with period start '||p_period_start||' ,p_period_type '||p_period_type
10234                                    ||' result l_quantity = ' || l_quantity);
10235                                 END IF;
10236 
10237                                --errorout_ad(' l_quantity '||l_quantity);
10238 
10239                                IF nvl(l_quantity,0) = 0 THEN
10240                                  x_return_status := G_RET_STS_ERROR;
10241                                  RAISE G_EXCEPTION_HALT_VALIDATION;
10242                                END IF;
10243                                --determine  full period end date
10244 
10245                                l_lvl_amt :=  TO_NUMBER(p_cp_sll_tbl(l_cp_sll_counter).amount)*l_quantity/l_fnd_lvl_in_rec.uom_per_period; --bugfix 5485442
10246 
10247 
10248                                IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10249                                  fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Create_cp_lvl_elements.Equal_amount.Calendar',
10250                                  ' result l_lvl_amt = ' || l_lvl_amt);
10251                                END IF;
10252                           --mchoudha added else logic for WEEK kind of uoms
10253                           ELSE
10254                               l_lvl_amt := nvl(TO_NUMBER(p_cp_sll_tbl(l_cp_sll_counter).amount)*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(l_next_cycle_dt))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0);  --bugfix 5485442
10255 
10256                           END IF;
10257 
10258                         ELSE
10259 
10260                            l_lvl_amt :=  TO_NUMBER(p_cp_sll_tbl(l_cp_sll_counter).amount);
10261                         END IF;  --period start and period type are not null
10262             END IF;  --  IF  p_billing_type = 'T'
10263             -----if last level element to be inserted then find out the aDjusted amount
10264 
10265             IF p_period_start is not null AND
10266                p_period_type is not null  THEN
10267                l_last_cmp_date := l_end_date;
10268             ELSE
10269                l_last_cmp_date := p_SubLine_rec.cp_end_dt;
10270             END IF;
10271 
10272             ---start inserting in level element
10273 
10274             l_lvl_ele_tbl_in(l_tbl_seq).sequence_number        := to_char(l_period_counter);
10275             l_lvl_ele_tbl_in(l_tbl_seq).dnz_chr_id             := p_line_rec.dnz_chr_id;
10276             l_lvl_ele_tbl_in(l_tbl_seq).cle_id                 := p_subline_rec.cp_id;
10277             l_lvl_ele_tbl_in(l_tbl_seq).parent_cle_id          := p_line_rec.id;
10278 
10279             IF l_next_cycle_dt < p_SubLine_rec.cp_start_dt AND l_period_counter = 1 THEN
10280               l_lvl_ele_tbl_in(l_tbl_seq).date_start             :=  TRUNC( p_SubLine_rec.cp_start_dt);
10281             ELSE
10282               l_lvl_ele_tbl_in(l_tbl_seq).date_start             :=   TRUNC(l_next_cycle_dt);
10283             END IF;
10284                         --errorout_ad('date start'||TRUNC(l_next_cycle_dt));
10285             --errorout_ad('date end'||TRUNC(TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1));
10286 
10287             l_lvl_ele_tbl_in(l_tbl_seq).date_END               :=   TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
10288             --30-DEC-2005 mchoudha fixed bug#4895586
10289             IF (l_cp_sll_counter = l_cp_sll_last AND
10290                 l_lvl_loop_counter = p_cp_sll_tbl(l_cp_sll_last).level_period) OR
10291                 --Mani PPC changed p_SubLine_rec.cp_end_dt to l_last_cmp_date
10292                 (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > l_last_cmp_date) THEN
10293 
10294                l_adjusted_amt  := nvl(p_SubLine_rec.cp_amt,0) - nvl(l_bill_sch_amt,0);
10295                ---errorout_bill('p_SubLine_rec.cp_amt = ' || p_SubLine_rec.cp_amt);
10296                l_lvl_ele_tbl_in(l_tbl_seq).date_END := l_last_cmp_date;
10297 
10298             ELSE
10299                l_adjusted_amt :=  OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_lvl_amt, l_currency_code );
10300             END IF;
10301 
10302             l_lvl_ele_tbl_in(l_tbl_seq).amount                 := l_adjusted_amt;
10303 
10304 	    /*commented and modified below for bug8609599
10305             --22-MAR-2006 mchoudha Changes for Partial periods CR3
10306             IF l_running_total < 0 THEN
10307                l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10308             ELSIF l_running_total < l_adjusted_amt THEN
10309                l_lvl_ele_tbl_in(l_tbl_seq).amount := l_running_total;
10310             ELSE
10311                l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10312             END IF;
10313             IF l_adjusted_amt < 0 THEN
10314                l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10315             END IF;
10316            */--bug8609599
10317             IF l_subline_total >= 0 THEN
10318               IF l_running_total < 0 THEN
10319                l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10320               ELSIF l_running_total < l_adjusted_amt THEN
10321                l_lvl_ele_tbl_in(l_tbl_seq).amount := l_running_total;
10322               ELSE
10323                l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10324               END IF;
10325               IF l_adjusted_amt < 0 THEN
10326                l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10327               END IF;
10328 	    ELSE
10329               IF l_running_total > 0 THEN
10330                l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10331               ELSIF l_running_total > l_adjusted_amt THEN
10332                l_lvl_ele_tbl_in(l_tbl_seq).amount := l_running_total;
10333               ELSE
10334                l_lvl_ele_tbl_in(l_tbl_seq).amount := l_adjusted_amt;
10335               END IF;
10336               IF l_adjusted_amt > 0 THEN
10337                l_lvl_ele_tbl_in(l_tbl_seq).amount := 0;
10338               END IF;
10339              END IF;
10340              /*end of modification for bug8609599*/
10341             --
10342             l_running_total := l_running_total - l_lvl_ele_tbl_in(l_tbl_seq).amount;
10343 
10344             l_lvl_ele_tbl_in(l_tbl_seq).date_receivable_gl     :=   l_fnd_lvl_out_rec.date_recievable_gl;
10345             l_lvl_ele_tbl_in(l_tbl_seq).date_transaction       :=   TRUNC(l_fnd_lvl_out_rec.date_transaction);
10346             l_lvl_ele_tbl_in(l_tbl_seq).date_due               :=   l_fnd_lvl_out_rec.date_due;
10347             l_lvl_ele_tbl_in(l_tbl_seq).date_print             :=   l_fnd_lvl_out_rec.date_print;
10348             l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface      :=   TRUNC(l_fnd_lvl_out_rec.date_to_interface);
10349 
10350 	    SELECT nvl(BILLED_AT_SOURCE , 'N')
10351 	      INTO l_billed_at_source
10352 	      FROM OKC_K_HEADERS_ALL_B
10353 	    WHERE id = p_Line_rec.dnz_chr_id;
10354 
10355 	   if l_billed_at_source = 'Y' Then
10356               l_lvl_ele_tbl_in(l_tbl_seq).date_completed  := sysdate;
10357            else
10358               l_lvl_ele_tbl_in(l_tbl_seq).date_completed := l_fnd_lvl_out_rec.date_completed;
10359            end if;
10360 
10361             l_lvl_ele_tbl_in(l_tbl_seq).rul_id                 :=   p_cp_sll_tbl(l_cp_sll_counter).id;
10362             l_lvl_ele_tbl_in(l_tbl_seq).object_version_number  :=   OKC_API.G_MISS_NUM;
10363             l_lvl_ele_tbl_in(l_tbl_seq).created_by             :=   OKC_API.G_MISS_NUM;
10364             l_lvl_ele_tbl_in(l_tbl_seq).creation_date          :=   SYSDATE;
10365             l_lvl_ele_tbl_in(l_tbl_seq).last_updated_by        :=   OKC_API.G_MISS_NUM;
10366             l_lvl_ele_tbl_in(l_tbl_seq).last_update_date       :=   SYSDATE;
10367 
10368             -----errorout_ad ('Amount for subline lvl element = ' || to_char(l_lvl_ele_tbl_in(l_tbl_seq).amount ));
10369 
10370         IF p_period_start is  null OR
10371            p_period_type is  null THEN
10372 
10373            IF p_term_dt IS NOT NULL AND TRUNC(l_lvl_ele_tbl_in(l_tbl_seq).date_start) < TRUNC(p_term_dt) AND
10374                 TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > TRUNC(p_term_dt) AND
10375                 p_term_dt <= p_SubLine_rec.cp_end_dt THEN
10376 
10377                 -----errorout_ad('COMING IN');
10378 
10379                l_lvl_ele_tbl_in(l_tbl_seq).date_END               := (p_term_dt - 1);
10380 
10381                IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date - 1 ) > p_SubLine_rec.cp_end_dt THEN
10382 
10383                     l_term_amt := Find_term_amt(p_cycle_st_dt  =>  l_lvl_ele_tbl_in(l_tbl_seq).date_start,
10384                                        p_term_dt         =>   p_term_dt,
10385                                        p_cycle_end_dt    =>   p_SubLine_rec.cp_end_dt,
10386                                        p_amount          =>  nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
10387 
10388                 ELSE
10389 
10390                     l_term_amt := Find_term_amt(p_cycle_st_dt  =>  l_lvl_ele_tbl_in(l_tbl_seq).date_start,
10391                                        p_term_dt         =>  p_term_dt,
10392                                        p_cycle_end_dt    =>  l_fnd_lvl_out_rec.next_cycle_date - 1,
10393                                        p_amount          =>  nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0));
10394 
10395                 END IF;              ---END OF NEXT CYCLE DT CHK
10396 
10397 
10398               l_lvl_ele_tbl_in(l_tbl_seq).amount  := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_term_amt, l_currency_code );
10399            END IF;
10400          END IF;
10401 
10402             IF p_top_line_bs.COUNT > 0  THEN
10403 
10404               IF l_tbs_ind  <= p_top_line_bs.LAST THEN
10405 
10406                IF l_tbs_ind  = p_top_line_bs.LAST THEN
10407                   l_bill_end_date := p_SubLine_rec.cp_end_dt;
10408                ELSE
10409                   l_bill_end_date := p_top_line_bs(l_tbs_ind).date_end;
10410                END IF;
10411 
10412                IF p_top_line_bs(l_tbs_ind).date_start <= l_lvl_ele_tbl_in(l_tbl_seq).date_start
10413                   AND (l_bill_end_date) >= l_lvl_ele_tbl_in(l_tbl_seq).date_start THEN
10414 
10415                   p_top_line_bs(l_tbs_ind).amount := nvl(p_top_line_bs(l_tbs_ind).amount,0) +
10416                                                      nvl(l_lvl_ele_tbl_in(l_tbl_seq).amount,0);
10417 
10418                   --added so that top line and subline interface/invoice dates are same
10419 
10420                   l_lvl_ele_tbl_in(l_tbl_seq).date_to_interface := p_top_line_bs(l_tbs_ind).date_to_interface;
10421                   l_lvl_ele_tbl_in(l_tbl_seq).date_transaction  := p_top_line_bs(l_tbs_ind).date_transaction;
10422 
10423                   l_tbs_ind := l_tbs_ind + 1;
10424                ELSE
10425 
10426                   NULL;
10427                END IF;
10428              END IF;   ---End of l_tbs_ind  <= p_top_line_bs.LAST condition  added for bug#2655416
10429             END IF;
10430 
10431           ---incremented here because if billing is DONE for last 6 months then
10432           ---sequence no. was starting from 7.
10433 
10434           l_period_counter := l_period_counter + 1;
10435 
10436 
10437           END IF;           ----end of check of next cycle dt <= line st_dt
10438 
10439           l_next_cycle_dt  := trunc(l_fnd_lvl_out_rec.next_cycle_date);
10440           l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(l_adjusted_amt,0);
10441           l_tbl_seq := l_tbl_seq + 1;
10442 
10443           -----errorout_ad('l_bill_sch_amt = ' || l_bill_sch_amt);
10444           -----errorout_ad('compared with ' || p_cp_sll_tbl(l_cp_sll_counter).level_period);
10445 
10446           EXIT WHEN (l_lvl_loop_counter = p_cp_sll_tbl(l_cp_sll_counter).level_period) OR
10447                     (TRUNC(l_next_cycle_dt) > l_end_date) OR
10448                     (TRUNC(l_next_cycle_dt) >= TRUNC(l_compare_dt));
10449 
10450           l_lvl_loop_counter := l_lvl_loop_counter + 1;
10451 
10452         END LOOP;                ----end of level element loop
10453 
10454       END IF;
10455       END IF ;      ------TRUNC(l_next_cycle_dt) >= l_compare_dt
10456                      ----if start of period counter < sll line period then only enter in lvl elemet loop
10457       EXIT WHEN (l_cp_sll_counter = p_cp_sll_tbl.LAST) OR
10458                 (TRUNC(l_next_cycle_dt) > l_end_date);
10459 
10460 
10461       l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
10462     END LOOP;                     ---- sll loop
10463   END IF ;
10464 
10465   IF l_cp_sll_counter < p_cp_sll_tbl.LAST AND p_top_line_bs.COUNT > 0 THEN
10466 
10467      l_cp_sll_counter := p_cp_sll_tbl.NEXT(l_cp_sll_counter);
10468 
10469      FOR i IN l_cp_sll_counter .. p_cp_sll_tbl.LAST
10470      LOOP
10471 
10472        Check_Existing_Lvlelement(
10473            p_sll_id              => p_cp_sll_tbl(i).id,
10474            p_sll_dt_start        => p_cp_sll_tbl(i).dt_start,
10475            p_uom                => p_cp_sll_tbl(i).uom,
10476            p_uom_per_period     => p_cp_sll_tbl(i).uom_per_period,
10477            p_cp_end_dt           => p_SubLine_rec.cp_end_dt,
10478            x_next_cycle_dt       => l_next_cycle_dt,
10479            x_last_cycle_dt       => l_last_cycle_dt,
10480            x_period_counter      => l_period_counter,
10481            x_sch_amt             => l_bill_sch_amt,
10482            x_top_line_bs         => p_top_line_bs,
10483            x_return_status       => x_return_status);
10484      END LOOP;
10485 
10486      -----errorout_ad('Check_Existing_Lvlelement5 = '|| x_return_status);
10487      IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
10488               RAISE G_EXCEPTION_HALT_VALIDATION;
10489      END IF;
10490   END IF;     ---END OF l_cp_sll_counter < p_cp_sll_tbl.LAST
10491 
10492 
10493 
10494   IF l_lvl_ele_tbl_in.COUNT > 0 THEN
10495 
10496      IF l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end > p_subline_rec.cp_end_dt THEN
10497        l_lvl_ele_tbl_in(l_lvl_ele_tbl_in.LAST).date_end := p_subline_rec.cp_end_dt;
10498      END IF;
10499 
10500      OKS_BILL_LEVEL_ELEMENTS_PVT.insert_row(
10501                p_api_version                  => l_api_version,
10502                p_init_msg_list                => l_init_msg_list,
10503                x_return_status                => x_return_status,
10504                x_msg_count                    => l_msg_count,
10505                x_msg_data                     => l_msg_data,
10506                p_letv_tbl                     => l_lvl_ele_tbl_in,
10507                x_letv_tbl                     => l_lvl_ele_tbl_out);
10508 
10509      -----errorout_ad('LEVEL ELEMENT INSERT STATUS FOR SUBLINE = ' || x_return_status);
10510 
10511 
10512       IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
10513          RAISE G_EXCEPTION_HALT_VALIDATION;
10514       END IF;
10515   END IF;
10516 
10517 
10518 EXCEPTION
10519  WHEN G_EXCEPTION_HALT_VALIDATION THEN
10520       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
10521         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
10522       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
10523         RAISE OKC_API.G_EXCEPTION_ERROR;
10524       END IF;
10525  WHEN OTHERS THEN
10526         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
10527                             p_msg_name     => G_UNEXPECTED_ERROR,
10528                             p_token1       => G_SQLCODE_TOKEN,
10529                             p_token1_value => sqlcode,
10530                             p_token2       => G_SQLERRM_TOKEN,
10531                             p_token2_value => sqlerrm);
10532 
10533         x_return_status := G_RET_STS_UNEXP_ERROR;
10534 END Create_cp_lvl_elements;
10535 
10536 Procedure Create_hdr_schedule
10537 (
10538           p_contract_id         IN    NUMBER,
10539           x_return_status       OUT   NOCOPY VARCHAR2,
10540           x_msg_count           OUT   NOCOPY NUMBER,
10541           x_msg_data            OUT   NOCOPY VARCHAR2)
10542 IS
10543 
10544   Cursor l_contract_Csr Is
10545           SELECT hdr.id, TRUNC(hdr.start_date) start_dt,
10546           nvl(trunc(hdr.date_terminated - 1) ,TRUNC(hdr.end_date)) end_dt,
10547           hdr.inv_rule_id inv_rule_id, dtl.billing_schedule_type billing_schedule_type
10548           FROM   okc_k_headers_b hdr, oks_k_headers_b dtl
10549           WHERE  hdr.id = dtl.chr_id
10550           AND hdr.Id =  p_contract_id ;
10551 
10552 
10553 
10554   CURSOR l_hdr_sll_csr IS
10555        SELECT id,sequence_no,TRUNC(start_date) start_date, level_periods,
10556               uom_per_period, uom_code, TRUNC(end_date) end_date,
10557               interface_offset_days, invoice_offset_days, cle_id, dnz_chr_id,
10558               chr_id, level_amount
10559        FROM OKS_STREAM_LEVELS_B
10560        WHERE chr_id = p_contract_id
10561        ORDER BY sequence_no;
10562 
10563 
10564 
10565  l_hdr_sll_rec             l_hdr_sll_csr%ROWTYPE;
10566  l_Contract_Rec            l_contract_Csr%Rowtype;
10567  l_sll_tbl                 OKS_BILL_SCH.StreamLvl_tbl;
10568  l_hdr_rec                 contract_rec_type;
10569 
10570 
10571  L_SLL_OUT_TBl             StrmLvl_Out_tbl;
10572  l_sll_count              NUMBER;
10573  l_index                  NUMBER;
10574 
10575 
10576   --
10577    l_api_version                CONSTANT        NUMBER  := 1.0;
10578    l_init_msg_list      VARCHAR2(2000) := OKC_API.G_FALSE;
10579   --
10580 -------------------------------------------------------------------------
10581 -- Begin partial period computation logic
10582 -- Developer Mani Choudhary
10583 -- Date 04-MAY-2005
10584 -------------------------------------------------------------------------
10585 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
10586 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
10587 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
10588 l_return_status  VARCHAR2(30);
10589 -------------------------------------------------------------------------
10590 -- End partial period computation logic
10591 -- Date 04-MAY-2005
10592 -------------------------------------------------------------------------
10593 
10594 Begin
10595 x_return_status := 'S';
10596   l_header_billing := p_contract_id;
10597 
10598   ------------find out the hdr details
10599 
10600   Open l_contract_Csr;
10601   Fetch l_contract_Csr Into l_contract_Rec;
10602 
10603   If l_contract_Csr%Notfound then
10604     Close l_contract_Csr;
10605     x_return_status := 'E';
10606     RAISE G_EXCEPTION_HALT_VALIDATION;
10607   End If;
10608   Close l_contract_Csr;
10609 
10610   l_hdr_rec.id       := l_contract_rec.id;
10611   l_hdr_rec.start_dt := l_contract_rec.start_dt;
10612   l_hdr_rec.end_dt   := l_contract_rec.end_dt;
10613 
10614 
10615  -------------------------------------------------------------------------
10616  -- Begin partial period computation logic
10617  -- Developer Mani Choudhary
10618  -- Date 09-MAY-2005
10619  -------------------------------------------------------------------------
10620 
10621 
10622    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
10623                 (
10624                  p_hdr_id        => l_contract_rec.id,
10625                  p_org_id        => NULL,
10626                  x_period_start  => l_period_start,
10627                  x_period_type   => l_period_type,
10628                  x_price_uom     => l_price_uom,
10629                  x_return_status => x_return_status);
10630 
10631    IF x_return_status <> 'S' THEN
10632       RAISE G_EXCEPTION_HALT_VALIDATION;
10633    END IF;
10634 
10635  -------------------------------------------------------------------------
10636  -- End partial period computation logic
10637  -- Date 09-MAY-2005
10638  -------------------------------------------------------------------------
10639 l_sll_tbl.DELETE;
10640 l_index := 1;
10641 ----make sll tbl
10642 
10643 FOR l_hdr_SlL_rec IN l_hdr_sll_Csr
10644 LOOP
10645 
10646 
10647   l_sll_tbl(l_index).id                             := l_hdr_SlL_rec.id;
10648   l_sll_tbl(l_index).cle_id                         := NULL;
10649   l_sll_tbl(l_index).chr_id                         := p_contract_id;
10650   l_sll_tbl(l_index).dnz_chr_id                     := p_contract_id;
10651   l_sll_tbl(l_index).uom_code                       := l_hdr_SlL_rec.uom_code;
10652   l_sll_tbl(l_index).sequence_no                    := l_hdr_SlL_rec.sequence_no;
10653   l_sll_tbl(l_index).Start_Date                     := l_hdr_SlL_rec.Start_Date;
10654   l_sll_tbl(l_index).end_Date                       := l_hdr_SlL_rec.end_Date;
10655   l_sll_tbl(l_index).level_periods                  := l_hdr_SlL_rec.level_periods;
10656   l_sll_tbl(l_index).uom_per_period                 := l_hdr_SlL_rec.uom_per_period;
10657   l_sll_tbl(l_index).level_amount                   := l_hdr_SlL_rec.level_amount;
10658   l_sll_tbl(l_index).invoice_offset_days            := l_hdr_SlL_rec.invoice_offset_days;
10659   l_sll_tbl(l_index).interface_offset_days          := l_hdr_SlL_rec.interface_offset_days;
10660 
10661   l_index := l_index + 1;
10662 END LOOP;
10663 
10664 
10665 IF l_sll_tbl.COUNT = 0 THEN
10666    RETURN;
10667 END IF;
10668 
10669 
10670 
10671   -----create rules with category 'SLL'
10672  --------------------------------------------------------------------------
10673  -- Begin partial period computation logic
10674  -- Developer Mani Choudhary
10675  -- Date 09-MAY-2005
10676  -- Added two new parameters P_period_start,P_period_type in procedural call
10677  ---------------------------------------------------------------------------
10678   Create_Stream_Level (  p_billing_type       => nvl(l_contract_rec.billing_schedule_type, 'T'),
10679                          p_strm_lvl_tbl       => l_sll_tbl,
10680                          p_dnz_chr_id         => l_Contract_Rec.id,
10681                          p_subline_call       => 'H',
10682                          p_line_amt           => NULL,
10683                          p_subline_amt        => NULL,
10684                          p_sll_start_dt       => l_contract_rec.start_dt,
10685                          p_end_dt             => l_contract_rec.end_dt,
10686                          p_period_start       =>  l_period_start,
10687                          p_period_type        =>  l_period_type,
10688                          x_sll_out_tbl        => l_sll_out_tbl,
10689                          x_return_status      => x_return_status);
10690  -------------------------------------------------------------------------
10691  -- End partial period computation logic
10692  -- Date 09-MAY-2005
10693  -------------------------------------------------------------------------
10694   -----errorout_ad('Create_Stream_Level status = ' || x_return_status);
10695   -----errorout_ad('TOTAL SLL COUNT for line'|| TO_CHAR(l_sll_out_tbl.COUNT));
10696 
10697   IF x_return_status <> 'S' THEN
10698     RAISE G_EXCEPTION_HALT_VALIDATION;
10699   END IF;
10700 
10701   ----if l_sll_out_tbl.count > 0 then insert lines into oks_level_elements
10702   IF l_sll_out_tbl.count > 0 then
10703 
10704      l_currency_code := Find_Currency_Code(
10705                                     p_cle_id  => NULL,
10706                                     p_chr_id  => p_contract_id);
10707      IF l_currency_code IS NULL THEN
10708         OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
10709         x_return_status := 'E';
10710         RETURN;
10711      END IF;
10712 
10713 
10714      Create_Hdr_Level_elements(
10715                       p_billing_type     => nvl(l_contract_rec.billing_schedule_type, 'T'),
10716                       p_sll_tbl          => l_sll_out_tbl,
10717                       p_hdr_rec          => l_hdr_rec,
10718                       p_invoice_ruleid   => l_contract_rec.inv_rule_id,
10719                       p_called_from      => 2,
10720                       p_period_start       =>  l_period_start,
10721                       p_period_type        =>  l_period_type,
10722                       x_return_status    => x_return_status);
10723 
10724      -----errorout_ad('Create_Hdr_Level_elements status = ' || x_return_status);
10725 
10726      IF x_return_status <> 'S' THEN
10727        RAISE G_EXCEPTION_HALT_VALIDATION;
10728      END IF;
10729   ELSE
10730      -----errorout_ad('sll rule count = ' || to_char(0));
10731      x_return_status := 'E';
10732      RAISE G_EXCEPTION_HALT_VALIDATION;
10733   END IF ;
10734 
10735 l_header_billing := NULL;
10736 
10737 EXCEPTION
10738  WHEN G_EXCEPTION_HALT_VALIDATION THEN
10739   l_currency_code := NULL;
10740   l_header_billing := NULL;
10741 
10742  WHEN OTHERS THEN
10743         l_currency_code := NULL;
10744         l_header_billing := NULL;
10745         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
10746                             p_msg_name     => G_UNEXPECTED_ERROR,
10747                             p_token1       => G_SQLCODE_TOKEN,
10748                             p_token1_value => sqlcode,
10749                             p_token2       => G_SQLERRM_TOKEN,
10750                             p_token2_value => sqlerrm);
10751 
10752         x_return_status := G_RET_STS_UNEXP_ERROR;
10753 
10754 
10755 END Create_hdr_schedule;
10756 
10757 
10758 PROCEDURE Del_line_sll_lvl(p_line_id          IN  NUMBER,
10759                            x_return_status    OUT NOCOPY VARCHAR2,
10760                            x_msg_count        OUT NOCOPY NUMBER,
10761                            x_msg_data         OUT NOCOPY VARCHAR2)
10762 
10763 IS
10764 ----will delete all lvlelements , sll for line if billing all sll billing type <> 'P'
10765 ---it will be called from create_bill_sch_rules.
10766 
10767 
10768 
10769 BEGIN
10770 x_return_status := 'S';
10771 
10772 
10773 --------delete lvl elemets for line
10774 DELETE FROM OKS_LEVEL_ELEMENTS
10775 WHERE  rul_id IN (SELECT sll.id
10776        FROM OKS_STREAM_LEVELS_B sll
10777        WHERE  sll.cle_id = p_line_id);
10778 
10779 ---delete sll info
10780 DELETE FROM OKS_STREAM_LEVELS_B
10781 WHERE  cle_id = p_line_id;
10782 
10783 ----update billing type to 'P'
10784 
10785 UPDATE oks_k_lines_b
10786 SET billing_schedule_type = 'P'
10787 WHERE cle_id = p_line_id;
10788 
10789 
10790 
10791 EXCEPTION
10792   WHEN OTHERS THEN
10793     OKC_API.SET_MESSAGE(p_app_name         => G_APP_NAME_OKC,
10794                             p_msg_name     => G_UNEXPECTED_ERROR,
10795                             p_token1       => G_SQLCODE_TOKEN,
10796                             p_token1_value => sqlcode,
10797                             p_token2       => G_SQLERRM_TOKEN,
10798                             p_token2_value => sqlerrm);
10799 
10800     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
10801 
10802 END Del_line_sll_lvl;
10803 
10804 
10805 Procedure Delete_contract_bs_sll
10806 (
10807           p_contract_id         IN    NUMBER,
10808           x_return_status       OUT   NOCOPY VARCHAR2,
10809           x_msg_count           OUT   NOCOPY NUMBER,
10810           x_msg_data            OUT   NOCOPY VARCHAR2)
10811 IS
10812 BEGIN
10813 x_return_status := 'S';
10814 
10815 
10816 --------delete lvl elemets for the whole contract
10817 DELETE FROM OKS_LEVEL_ELEMENTS
10818 WHERE  dnz_chr_id = p_contract_id;
10819 
10820 
10821 ---delete sll info for contract (header,line and subline)
10822 DELETE FROM OKS_STREAM_LEVELS_B
10823 WHERE  dnz_chr_id = p_contract_id;
10824 
10825 
10826 
10827 EXCEPTION
10828   WHEN OTHERS THEN
10829     OKC_API.SET_MESSAGE(p_app_name         => G_APP_NAME_OKC,
10830                             p_msg_name     => G_UNEXPECTED_ERROR,
10831                             p_token1       => G_SQLCODE_TOKEN,
10832                             p_token1_value => sqlcode,
10833                             p_token2       => G_SQLERRM_TOKEN,
10834                             p_token2_value => sqlerrm);
10835 
10836     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
10837 
10838 END Delete_contract_bs_sll;
10839 
10840 Procedure Populate_end_date(p_line_id             IN NUMBER,
10841                             p_end_date            IN DATE,
10842                             p_term_date           IN DATE,
10843                             p_lse_id              IN NUMBER,
10844                             x_return_status       OUT NOCOPY VARCHAR2)
10845 
10846 IS
10847 
10848  Cursor l_LineSch_Csr is
10849          SELECT sll.start_date,sll.uom_code, sll.uom_per_period,
10850                 element.id,element.sequence_number,element.date_start,
10851                 element.date_end,element.date_completed
10852                 FROM oks_level_elements element, oks_stream_levels_b sll
10853                 WHERE sll.id  = element.rul_id
10854                 AND sll.cle_id = p_line_id
10855                 ORDER BY element.date_start;
10856 
10857  CURSOR l_line_sll_csr IS
10858         SELECT id, start_date, OKC_TIME_UTIL_PUB.get_enddate(
10859                                       start_date,
10860                                   uom_code,
10861                                   uom_per_period * level_periods) sll_end_date
10862         FROM oks_stream_levels_b
10863         WHERE cle_id = p_line_id;
10864 
10865  CURSOR l_bcl_csr(p_line_id number, p_start_date date) IS
10866          SELECT date_billed_to
10867          FROM oks_bill_cont_lines
10868          WHERE cle_id = p_line_id
10869          AND TRUNC(date_billed_from) = TRUNC(p_start_date)
10870          AND bill_action = 'RI';
10871 
10872   CURSOR l_bsl_csr(p_line_id number, p_start_date date) IS
10873          SELECT bsl.date_billed_to
10874          FROM oks_bill_sub_lines bsl, oks_bill_cont_lines bcl
10875          WHERE bsl.cle_id = p_line_id
10876          AND TRUNC(bsl.date_billed_from) = TRUNC(p_start_date)
10877          AND bsl.bcl_id = bcl.id
10878          AND bcl.bill_action = 'RI';
10879 
10880 
10881 
10882  l_LineSch_rec           l_LineSch_Csr%ROWTYPE;
10883  l_line_sll_rec          l_line_sll_csr%ROWTYPE;
10884  i                       number;
10885  l_end_dt                Date;
10886  l_line_end_dt           date;
10887  l_uom_code              varchar2(3);
10888  l_uom_per_period        number;
10889 l_period_end_dt           date;
10890 
10891 BEGIN
10892 
10893 --The procedure update the sll end date and level elements end date for a line and subline.
10894 ---this is written as end date in oks_stream_levels_b and oks_level_elements didn't get migrated .
10895 
10896 x_return_status := 'S';
10897 l_period_end_dt := null;
10898 
10899 l_lvl_ele_tbl_in.DELETE;
10900 
10901 FOR l_line_sll_rec IN l_line_sll_csr
10902 LOOP
10903   update oks_stream_levels_b set end_date = l_line_sll_rec.sll_end_date
10904   WHERE id = l_line_sll_rec.id;
10905 END LOOP;
10906 
10907 
10908 i := 1;
10909 
10910 FOR l_LineSch_rec IN l_LineSch_csr
10911 LOOP
10912 
10913        if i > 1 then
10914           l_lvl_ele_tbl_in(i - 1).Date_end        :=  l_LineSch_rec.date_start - 1;
10915        END IF;
10916 
10917        l_lvl_ele_tbl_in(i).Id                :=  l_LineSch_rec.id;
10918        l_lvl_ele_tbl_in(i).date_start        :=  l_LineSch_rec.date_start;
10919        l_lvl_ele_tbl_in(i).date_completed    :=  l_LineSch_rec.date_completed;
10920 
10921        l_uom_code        := l_LineSch_rec.uom_code;
10922        l_uom_per_period  := l_LineSch_rec.uom_per_period;
10923 
10924        i := i + 1;
10925 END LOOP;
10926 
10927 IF l_lvl_ele_tbl_in.COUNT > 0 THEN
10928 
10929   l_end_dt := OKC_TIME_UTIL_PUB.get_enddate(
10930                    l_lvl_ele_tbl_in(i - 1).Date_start,
10931                    l_uom_code,
10932                    l_uom_per_period);
10933 
10934   -----errorout_ad('calculated date = '|| l_end_dt || ' start = '|| l_lvl_ele_tbl_in(i - 1).Date_start);
10935 
10936   ---IF CALCULATED end date > line end date then take line end date
10937 
10938   IF p_term_date IS NOT NULL THEN
10939 
10940       IF l_lvl_ele_tbl_in(i-1).date_completed IS NOT NULL THEN      --- for billed
10941 
10942          IF p_lse_id IN (1, 12, 14, 19, 46) THEN        ---top line
10943                ---get period end date bill_cont_lines
10944                OPEN l_bcl_Csr(p_line_id, l_lvl_ele_tbl_in(i-1).date_start );
10945                FETCH l_bcl_Csr INTO l_period_end_dt;
10946                IF l_bcl_Csr%NOTFOUND THEN
10947                  l_period_end_dt := null;
10948                END IF;
10949                CLOSE l_bcl_Csr;
10950           ELSE               ---sub line
10951                ---get period end date bill_sub _lines
10952                OPEN l_bsl_Csr(p_line_id, l_lvl_ele_tbl_in(i-1).date_start);
10953                FETCH l_bsl_Csr INTO l_period_end_dt;
10954                IF l_bsl_Csr%NOTFOUND THEN
10955                  l_period_end_dt := null;
10956                END IF;
10957                CLOSE l_bsl_Csr;
10958           END IF;              ---end of top line chk
10959 
10960       END IF;       ---end of bill chk
10961 
10962       IF l_period_end_dt IS NOT NULL THEN  ---rec in bill tbl
10963             l_lvl_ele_tbl_in(i-1).date_end :=  l_period_end_dt;
10964       ELSE
10965 
10966         IF l_end_dt > (p_term_date - 1) AND  l_lvl_ele_tbl_in(i-1).date_end < p_term_date  THEN
10967 
10968           l_lvl_ele_tbl_in(i-1).date_end     :=  (p_term_date - 1);
10969         ELSE
10970           l_lvl_ele_tbl_in(i-1).date_end :=  l_end_dt;
10971         END IF;
10972       END IF;           ----end of l_period_end_dt null chk
10973 
10974   ELSE               ---not terminated
10975 
10976      IF P_END_DATE IS NOT NULL AND l_end_dt > p_END_DATE THEN
10977        l_lvl_ele_tbl_in(i-1).date_end :=  p_END_DATE;
10978        -----errorout_ad('p_end_date = '|| p_end_date);
10979      ELSE
10980        l_lvl_ele_tbl_in(i-1).date_end :=  l_end_dt;
10981        -----errorout_ad('l_end_dt = '|| l_end_dt);
10982      END IF;
10983   end if;
10984 
10985   IF l_lvl_ele_tbl_in(i-1).date_end > p_END_DATE THEN
10986      l_lvl_ele_tbl_in(i-1).date_end := p_END_DATE;
10987   END IF;
10988 
10989   FOR i IN l_lvl_ele_tbl_in.FIRST .. l_lvl_ele_tbl_in.LAST
10990   LOOP
10991 
10992     UPDATE oks_level_elements SET date_end = TRUNC(l_lvl_ele_tbl_in(i).date_end)
10993     WHERE id = l_lvl_ele_tbl_in(i).id;
10994   END LOOP;
10995 END IF;                  ---tbl count chk.
10996 
10997 
10998 
10999 
11000 EXCEPTION
11001  WHEN OTHERS THEN
11002        x_return_status := G_RET_STS_UNEXP_ERROR;
11003 
11004 END populate_end_date;
11005 
11006 
11007 
11008 Procedure UPDATE_BS_ENDDATE(p_line_id         IN   NUMBER,
11009                             p_chr_id          IN   NUMBER,
11010                             x_return_status   OUT NOCOPY VARCHAR2)
11011 
11012 IS
11013 
11014 
11015 Cursor l_hdrSch_Csr Is
11016       SELECT sll.uom_code, sll.uom_per_period,
11017              element.id,element.date_start
11018        FROM oks_level_elements element, oks_stream_levels_b sll
11019        WHERE sll.id  = element.rul_id
11020        AND sll.chr_id = p_chr_id
11021        ORDER BY element.date_start;
11022 
11023 CURSOR l_hdr_sll_csr IS
11024         SELECT id, start_date, OKC_TIME_UTIL_PUB.get_enddate(
11025                                   start_DATE,
11026                                   uom_code,
11027                                   uom_per_period * level_periods) sll_end_date
11028         FROM oks_stream_levels_b
11029         WHERE chr_id = p_chr_id;
11030 
11031 CURSOR l_line_csr IS
11032          SELECT TRUNC(end_date) end_date, trunc(date_terminated) date_terminated, lse_id
11033          FROM okc_k_lines_b
11034          WHERE id = p_line_id;
11035 
11036 CURSOR l_subline_csr IS
11037          SELECT ID,TRUNC(end_date) end_date, trunc(date_terminated) date_terminated
11038          FROM okc_k_lines_b
11039          WHERE cle_id = p_line_id
11040          AND lse_id in(35,7,8,9,10,11,13,18,25);
11041 
11042 i             NUMBER;
11043 l_end_dt         date;
11044 l_line_rec     l_line_csr%ROWTYPE;
11045 l_Subline_rec     l_subline_csr%ROWTYPE;
11046 l_hdr_sll_rec     l_hdr_sll_csr%rowtype;
11047 l_hdrSch_rec      l_hdrSch_Csr%rowtype;
11048 
11049  l_uom_code              varchar2(3);
11050  l_uom_per_period        number;
11051 
11052 
11053 
11054 BEGIN
11055 
11056 --The procedure update the sll end date and level elements end date for a hdr schedule.
11057 ---this is written as end date in oks_stream_levels_b and oks_level_elements didn't get migrated .
11058 
11059 
11060 
11061 x_return_status := 'S';
11062 l_lvl_ele_tbl_in.DELETE;
11063 
11064 IF p_chr_id IS NOT NULL THEN
11065   FOR l_hdr_sll_rec IN l_hdr_sll_csr
11066   LOOP
11067     update oks_stream_levels_b set end_date = l_hdr_sll_rec.sll_end_date
11068      WHERE id = l_hdr_sll_rec.id;
11069   END LOOP;
11070 
11071 
11072   i := 1;
11073 
11074   FOR l_hdrSch_rec IN l_hdrsch_csr
11075   LOOP
11076 
11077        if i > 1 then
11078           l_lvl_ele_tbl_in(i - 1).Date_end        :=  l_hdrSch_rec.date_start - 1;
11079        END IF;
11080 
11081        l_lvl_ele_tbl_in(i).Id                :=  l_hdrSch_rec.id;
11082        l_lvl_ele_tbl_in(i).date_start        :=  l_hdrSch_rec.date_start;
11083 
11084         l_uom_code              := l_hdrSch_rec.uom_code;
11085         l_uom_per_period        := l_hdrSch_rec.uom_per_period;
11086 
11087 
11088        i := i + 1;
11089   END LOOP;
11090 
11091   IF l_lvl_ele_tbl_in.COUNT > 0 THEN
11092     l_end_dt := OKC_TIME_UTIL_PUB.get_enddate(
11093                    l_lvl_ele_tbl_in(i - 1).Date_start,
11094                    l_uom_code,
11095                    l_uom_per_period);
11096 
11097     l_lvl_ele_tbl_in(i-1).date_end :=  l_end_dt;
11098 
11099 
11100     FOR i IN l_lvl_ele_tbl_in.FIRST .. l_lvl_ele_tbl_in.LAST
11101     LOOP
11102 
11103       UPDATE oks_level_elements SET date_end = TRUNC(l_lvl_ele_tbl_in(i).date_end)
11104       WHERE id = l_lvl_ele_tbl_in(i).id;
11105     END LOOP;
11106   END IF;
11107 
11108 
11109 ELSIF p_line_id IS NOT null THEN
11110 
11111     OPEN l_Line_Csr;
11112     FETCH l_Line_Csr INTO l_Line_rec;
11113     IF l_Line_Csr%NOTFOUND THEN
11114        CLOSE l_Line_Csr;
11115        RETURN;
11116     END IF;
11117     CLOSE l_Line_Csr;
11118 
11119     Populate_end_date(p_line_id            => p_line_id,
11120                       p_end_date           => l_line_rec.end_date,
11121                       p_term_date          => l_line_rec.date_terminated,
11122                       p_lse_id             => l_line_rec.lse_id,
11123                       x_return_status      => x_return_status);
11124 
11125     IF x_return_status <> 'S' THEN
11126        RAISE G_EXCEPTION_HALT_VALIDATION;
11127     END IF;
11128 
11129 
11130     IF l_line_rec.lse_id IN (1,12,14,19) THEN             ---if line is top line
11131 
11132        FOR l_subline_rec IN l_subline_csr
11133        LOOP
11134 
11135          Populate_end_date(p_line_id            => l_subline_rec.id,
11136                            p_end_date           => l_subline_rec.end_date,
11137                            p_term_date          => l_subline_rec.date_terminated,
11138                            p_lse_id             => 0,
11139                            x_return_status      => x_return_status);
11140 
11141 
11142 
11143          IF x_return_status <> 'S' THEN
11144             RAISE G_EXCEPTION_HALT_VALIDATION;
11145          END IF;
11146        END LOOP;
11147 
11148      END IF;
11149 
11150 END IF;            ---for line/hdr
11151 
11152 COMMIT;
11153 EXCEPTION
11154  WHEN G_EXCEPTION_HALT_VALIDATION THEN
11155         ROLLBACK;
11156         x_return_status := 'E';
11157 
11158  WHEN OTHERS THEN
11159         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
11160                             p_msg_name     => G_UNEXPECTED_ERROR,
11161                             p_token1       => G_SQLCODE_TOKEN,
11162                             p_token1_value => sqlcode,
11163                             p_token2       => G_SQLERRM_TOKEN,
11164                             p_token2_value => sqlerrm);
11165 
11166         x_return_status := G_RET_STS_UNEXP_ERROR;
11167 
11168 
11169 END update_bs_enddate;
11170 
11171 
11172 
11173 PROCEDURE Rollup_lvl_amt(
11174                    p_Line_Rec          IN     Line_Det_Type,
11175                    p_SubLine_rec       IN     Prod_Det_Type,
11176                    p_top_line_bs       IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
11177                    x_return_status     OUT    NOCOPY VARCHAR2)
11178 IS
11179 
11180 CURSOR l_cp_BS_csr(p_cp_id  NUMBER) IS
11181          SELECT id, trunc(date_start) date_start,
11182          amount, trunc(date_end) date_end
11183          FROM oks_level_elements element
11184          WHERE cle_id = p_cp_id
11185          ORDER by date_start;
11186 
11187 l_cp_BS_rec          l_cp_BS_csr%ROWTYPE;
11188 l_cp_bs_tbl          oks_bill_level_elements_pvt.letv_tbl_type;
11189 l_index              number;
11190 l_top_bs_ind         number;
11191 l_cp_bs_ind          number;
11192 
11193 
11194 BEGIN
11195 x_return_status := OKC_API.G_RET_STS_SUCCESS;
11196 
11197 l_cp_bs_tbl.DELETE;
11198 l_index  := 1;
11199 
11200 FOR l_cp_BS_rec IN l_cp_BS_csr(p_SubLine_rec.cp_id)
11201 LOOP
11202   l_cp_bs_tbl(l_index).id              := l_cp_BS_rec.id;
11203   l_cp_bs_tbl(l_index).date_start      := l_cp_BS_rec.date_start;
11204   l_cp_bs_tbl(l_index).date_end        := l_cp_BS_rec.date_end;
11205   l_cp_bs_tbl(l_index).Amount          := l_cp_BS_rec.amount;
11206 
11207   l_index := l_index + 1;
11208 END LOOP;
11209 
11210 IF l_cp_bs_tbl.COUNT <= 0 THEN
11211    RETURN;
11212 END IF;
11213 
11214 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
11215 l_top_bs_ind := p_top_line_bs.FIRST;
11216 -----errorout_ad('top line bs first = ' || l_top_bs_ind);
11217 
11218 WHILE TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) > TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) AND
11219              l_top_bs_ind < p_top_line_bs.LAST
11220 LOOP
11221     l_top_bs_ind := p_top_line_bs.NEXT(l_top_bs_ind);
11222 END LOOP;
11223 
11224 -----errorout_ad('after while loop in adj = ' || l_top_bs_ind);
11225 ---chk first cp bs.st_dt if between previous and present record
11226 
11227 
11228 IF l_top_bs_ind = p_top_line_bs.first THEN
11229    NULL;
11230 
11231 ELSIF  l_top_bs_ind <= p_top_line_bs.LAST THEN
11232 
11233   l_top_bs_ind := l_top_bs_ind - 1;
11234   IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= p_top_line_bs(l_top_bs_ind  ).DATE_START
11235       AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= p_top_line_bs(l_top_bs_ind ).DATE_end THEN
11236 
11237                     NULL;
11238   ELSE
11239       l_top_bs_ind := l_top_bs_ind + 1;
11240   END IF;
11241 
11242 elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(p_top_line_bs(l_top_bs_ind).DATE_START) THEN
11243        NULL;
11244 
11245 end if;
11246 
11247 
11248 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
11249 LOOP
11250 
11251  IF l_top_bs_ind  <= p_top_line_bs.LAST THEN
11252 
11253     p_top_line_bs(l_top_bs_ind).amount := nvl(p_top_line_bs(l_top_bs_ind).amount,0) + nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
11254     l_top_bs_ind  := l_top_bs_ind + 1;
11255 
11256  END IF;
11257 END LOOP;
11258 
11259 
11260 EXCEPTION
11261  WHEN G_EXCEPTION_HALT_VALIDATION THEN
11262       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11263         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11264       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11265         RAISE OKC_API.G_EXCEPTION_ERROR;
11266       END IF;
11267  WHEN OTHERS THEN
11268         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
11269                             p_msg_name     => G_UNEXPECTED_ERROR,
11270                             p_token1       => G_SQLCODE_TOKEN,
11271                             p_token1_value => sqlcode,
11272                             p_token2       => G_SQLERRM_TOKEN,
11273                             p_token2_value => sqlerrm);
11274 
11275         x_return_status := G_RET_STS_UNEXP_ERROR;
11276 
11277 end Rollup_lvl_amt;
11278 
11279 
11280 /* Overloaded procedure for OKL bug# 3307323*/
11281 Procedure Create_Bill_Sch_Rules
11282 (
11283       p_slh_rec              IN    StreamHdr_Type
11284 ,     p_sll_tbl              IN    StreamLvl_tbl
11285 ,     p_invoice_rule_id      IN    Number
11286 ,     x_bil_sch_out_tbl      OUT   NOCOPY ItemBillSch_tbl
11287 ,     x_return_status        OUT   NOCOPY Varchar2
11288 )
11289 
11290 IS
11291 
11292 BEGIN
11293 
11294 x_return_status := 'S';
11295 
11296 END Create_Bill_Sch_Rules;
11297 
11298 
11299 PROCEDURE Adjust_cp_trx_inv_dt(
11300                         p_top_bs_tbl        IN     oks_bill_level_elements_pvt.letv_tbl_type,
11301                         p_SubLine_id        IN     NUMBER,
11302                         x_cp_line_bs        OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
11303                         x_return_status     OUT    NOCOPY VARCHAR2)
11304 IS
11305 
11306 CURSOR l_cp_BS_csr IS
11307          SELECT id, trunc(date_start) date_start,
11308          date_to_interface, date_transaction, object_version_number
11309          FROM oks_level_elements
11310          WHERE cle_id = p_SubLine_id
11311          AND date_completed IS NULL
11312          ORDER BY date_start;
11313 
11314 l_cp_BS_rec          l_cp_BS_csr%ROWTYPE;
11315 l_cp_bs_tbl          oks_bill_level_elements_pvt.letv_tbl_type;
11316 l_index              number;
11317 l_top_bs_ind         number;
11318 l_cp_bs_ind          number;
11319 
11320 
11321 BEGIN
11322 x_return_status := OKC_API.G_RET_STS_SUCCESS;
11323 
11324 l_cp_bs_tbl.DELETE;
11325 l_index  := 1;
11326 
11327 FOR l_cp_BS_rec IN l_cp_BS_csr
11328 LOOP
11329   l_cp_bs_tbl(l_index).id                    := l_cp_BS_rec.id;
11330   l_cp_bs_tbl(l_index).date_start            := l_cp_BS_rec.date_start;
11331   l_cp_bs_tbl(l_index).date_transaction      := l_cp_BS_rec.date_transaction;
11332   l_cp_bs_tbl(l_index).date_to_interface     := l_cp_BS_rec.date_to_interface;
11333   l_cp_bs_tbl(l_index).object_version_number := l_cp_BS_rec.object_version_number;
11334 
11335 
11336   l_index := l_index + 1;
11337 END LOOP;
11338 
11339 IF l_cp_bs_tbl.COUNT <= 0 THEN
11340    RETURN;
11341 END IF;
11342 
11343 l_cp_bs_ind := l_cp_bs_tbl.FIRST;
11344 l_top_bs_ind := p_top_bs_tbl.FIRST;
11345 
11346 
11347 WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > p_top_bs_tbl(l_top_bs_ind).DATE_START AND
11348       l_top_bs_ind < p_top_bs_tbl.LAST
11349 LOOP
11350     l_top_bs_ind := p_top_bs_tbl.NEXT(l_top_bs_ind);
11351 END LOOP;
11352 
11353 ---chk first cp bs.st_dt if between previous and present record
11354 
11355 IF l_top_bs_ind = p_top_bs_tbl.first THEN
11356    NULL;
11357 
11358 ELSIF l_cp_bs_tbl(l_cp_bs_ind).date_start >= p_top_bs_tbl(l_top_bs_ind - 1).DATE_START
11359      AND l_cp_bs_tbl(l_cp_bs_ind).date_start < p_top_bs_tbl(l_top_bs_ind ).DATE_START THEN
11360 
11361      l_top_bs_ind := l_top_bs_ind - 1;
11362 
11363 elsif l_cp_bs_tbl(l_cp_bs_ind).date_start = p_top_bs_tbl(l_top_bs_ind).DATE_START THEN
11364      null;
11365 END IF;
11366 
11367 FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
11368 LOOP
11369 
11370  IF l_top_bs_ind  <= p_top_bs_tbl.LAST THEN
11371 
11372     x_cp_line_bs(l_cp_bs_ind).id                    := l_cp_bs_tbl(l_cp_bs_ind).id;
11373     x_cp_line_bs(l_cp_bs_ind).date_start            := l_cp_bs_tbl(l_cp_bs_ind).date_start;
11374     x_cp_line_bs(l_cp_bs_ind).date_transaction      := p_top_bs_tbl(l_top_bs_ind).date_transaction;
11375     x_cp_line_bs(l_cp_bs_ind).date_to_interface     := p_top_bs_tbl(l_top_bs_ind).date_to_interface;
11376     x_cp_line_bs(l_cp_bs_ind).object_version_number := l_cp_bs_tbl(l_cp_bs_ind).object_version_number;
11377 
11378     l_top_bs_ind  := l_top_bs_ind + 1;
11379 
11380  END IF;
11381 END LOOP;
11382 
11383 
11384 EXCEPTION
11385  WHEN G_EXCEPTION_HALT_VALIDATION THEN
11386       IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11387         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11388       ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11389         RAISE OKC_API.G_EXCEPTION_ERROR;
11390       END IF;
11391  WHEN OTHERS THEN
11392         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
11393                             p_msg_name     => G_UNEXPECTED_ERROR,
11394                             p_token1       => G_SQLCODE_TOKEN,
11395                             p_token1_value => sqlcode,
11396                             p_token2       => G_SQLERRM_TOKEN,
11397                             p_token2_value => sqlerrm);
11398 
11399         x_return_status := G_RET_STS_UNEXP_ERROR;
11400 
11401 end Adjust_cp_trx_inv_dt;
11402 
11403 
11404 
11405 Procedure Preview_Subscription_Bs(p_sll_tbl              IN    StreamLvl_tbl,
11406                                   p_invoice_rule_id      IN    Number,
11407                                   p_line_detail          IN    LINE_TYPE,
11408                                   x_bil_sch_out_tbl      OUT   NOCOPY ItemBillSch_tbl,
11409                                   x_return_status        OUT   NOCOPY Varchar2)
11410 
11411 
11412 IS
11413 l_sll_tbl           OKS_BILL_SCH.StreamLvl_tbl;
11414 l_index             NUMBER;
11415 l_sll_prorate_tbl   sll_prorated_tab_type;
11416 l_bill_sch_amt      NUMBER;
11417 l_next_cycle_dt     DATE;
11418 l_tbl_seq           NUMBER;
11419 l_lvl_seq           NUMBER;
11420 l_adjusted_amount   NUMBER;
11421 
11422 
11423 
11424 l_api_version           CONSTANT        NUMBER  := 1.0;
11425 l_init_msg_list         VARCHAR2(2000) := OKC_API.G_FALSE;
11426 l_msg_count             NUMBER;
11427 l_msg_data              VARCHAR2(2000);
11428 
11429 -- Start - Added by PMALLARA - Bug #3992530
11430 Lvl_Element_cnt Number := 0;
11431 Strm_Start_Date  Date;
11432 -- End - Added by PMALLARA - Bug #3992530
11433 
11434 l_period_start VARCHAR2(30);
11435 l_period_type VARCHAR2(10);
11436 
11437 
11438 BEGIN
11439 
11440 x_return_status := 'S';
11441 
11442 IF p_sll_tbl.count <= 0 THEN
11443   RETURN;
11444 END IF;
11445 
11446 l_sll_tbl  := p_sll_tbl;
11447 l_sll_prorate_tbl.DELETE;
11448 
11449 FOR l_index IN p_sll_tbl.FIRST .. p_sll_tbl.LAST
11450 LOOP
11451   l_sll_prorate_tbl(l_index).sll_seq_num    := p_sll_tbl(l_index).Sequence_no;
11452   IF L_index = p_sll_tbl.FIRST THEN
11453 
11454     l_sll_prorate_tbl(l_index).sll_start_date := p_line_detail.start_dt;
11455   ELSE
11456     l_sll_prorate_tbl(l_index).sll_start_date := l_sll_prorate_tbl(l_sll_prorate_tbl.PRIOR(l_index)).sll_end_date + 1;
11457   END IF;
11458 
11459   l_sll_prorate_tbl(l_index).sll_end_date   := OKC_TIME_UTIL_PUB.get_enddate(
11460                                                   l_sll_prorate_tbl(l_index).sll_start_date,
11461                                                   p_sll_tbl(l_index).uom_code,
11462                                         (p_sll_tbl(l_index).level_periods * p_sll_tbl(l_index).uom_per_period));
11463 
11464   l_sll_prorate_tbl(l_index).sll_tuom       := p_sll_tbl(l_index).uom_code;
11465   l_sll_prorate_tbl(l_index).sll_period     := p_sll_tbl(l_index).level_periods;
11466 
11467 END LOOP;
11468 
11469 
11470 Calculate_sll_amount(
11471               p_api_version      => l_api_version,
11472               p_total_amount     => p_line_detail.amount,
11473               p_currency_code    => nvl(p_line_detail.currency_code,'USD'),
11474               p_period_start     => l_period_start,
11475               p_period_type      => l_period_type,
11476               p_sll_prorated_tab => l_sll_prorate_tbl,
11477               x_return_status    => x_return_status);
11478 
11479 
11480 -----errorout_ad  ('Calculate_sll_amount STATUS = ' ||  x_return_status);
11481 
11482 
11483 IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11484    RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11485 ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11486    RAISE OKC_API.G_EXCEPTION_ERROR;
11487 END IF;
11488 
11489 FOR l_index IN l_sll_prorate_tbl.FIRST .. l_sll_prorate_tbl.LAST
11490 LOOP
11491   l_sll_tbl(l_index).level_amount  := l_sll_prorate_tbl(l_index).sll_amount;
11492   l_sll_tbl(l_index).end_date      := l_sll_prorate_tbl(l_index).sll_end_date;
11493   l_sll_tbl(l_index).start_date      := l_sll_prorate_tbl(l_index).sll_start_date;
11494 
11495 END LOOP;                  ---END OF sll tbl UPDATE LOOP
11496 
11497 
11498 l_index  := l_sll_tbl.FIRST;
11499 l_bill_sch_amt  := 0;
11500 l_tbl_seq := 1;
11501 
11502 LOOP                           ---sll tbl loop
11503   l_next_cycle_dt  := l_sll_tbl(l_index).start_date;
11504   l_lvl_seq := 1;
11505 
11506 -- Start - Added by PMALLARA - Bug #3992530
11507     Lvl_Element_cnt  := 0;
11508       LOOP                          -------------for level elements of one rule
11509     Lvl_Element_cnt  :=     Lvl_Element_cnt + 1;
11510     if Lvl_Element_cnt = 1 then
11511         Strm_Start_Date :=   l_next_cycle_dt;
11512     end if;
11513 -- End - Added by PMALLARA - Bug #3992530
11514     l_fnd_lvl_in_rec.line_start_date           := p_line_detail.start_dt;
11515     l_fnd_lvl_in_rec.line_end_date             := p_line_detail.end_dt;
11516     l_fnd_lvl_in_rec.cycle_start_date          := l_next_cycle_dt;
11517 -- Start - Modified by PMALLARA - Bug #3992530
11518     l_fnd_lvl_in_rec.tuom_per_period           := Lvl_Element_cnt * l_sll_tbl(l_index).uom_Per_Period;
11519 -- End - Modified by PMALLARA - Bug #3992530
11520     l_fnd_lvl_in_rec.tuom                      := l_sll_tbl(l_index).uom_code;
11521     l_fnd_lvl_in_rec.total_amount              := nvl(p_line_detail.amount,0) - nvl(l_bill_sch_amt,0);
11522     l_fnd_lvl_in_rec.invoice_offset_days       := l_sll_tbl(l_index).invoice_offset_days;
11523     l_fnd_lvl_in_rec.interface_offset_days     := l_sll_tbl(l_index).Interface_offset_days;
11524     l_fnd_lvl_in_rec.bill_type                 := 'E';
11525  -------------------------------------------------------------------------
11526  -- Begin partial period computation logic
11527  -- Developer Mani Choudhary
11528  -- Date 09-MAY-2005
11529  -- Added two new parameters p_period_start and p_period_type
11530  -------------------------------------------------------------------------
11531 -- Start - Modified by PMALLARA - Bug #3992530
11532     OKS_BILL_UTIL_PUB.Get_next_bill_sch
11533           (p_api_version             => l_api_version,
11534            x_return_status           => x_return_status,
11535            x_msg_count               => l_msg_count,
11536            x_msg_data                => l_msg_data,
11537            p_invoicing_rule_id       => NVL(p_invoice_rule_id,-2),
11538            p_bill_sch_detail_rec     => l_fnd_lvl_in_rec,
11539            x_bill_sch_detail_rec     => l_fnd_lvl_out_rec,
11540            p_period_start            =>  NULL,
11541            p_period_type             =>  NULL,
11542            Strm_Start_Date           => Strm_Start_Date);
11543 -- End - Modified by PMALLARA - Bug #3992530
11544 
11545 
11546      IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
11547         RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
11548      ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
11549         RAISE OKC_API.G_EXCEPTION_ERROR;
11550      END IF;
11551 
11552 
11553 
11554      IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) < p_Line_detail.start_dt then
11555           null;                       ---donot insert record in level element
11556      ELSE
11557 
11558          IF (l_index = l_sll_tbl.last AND
11559               l_lvl_seq = l_sll_tbl(l_sll_tbl.last).level_periods) OR
11560             (TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > p_Line_detail.end_dt) THEN
11561 
11562             l_adjusted_amount  := nvl(p_Line_detail.amount,0) - nvl(l_bill_sch_amt,0);
11563 
11564          ELSE            --not adjustment round
11565             l_adjusted_amount  := l_sll_tbl(l_index).level_amount;
11566          END IF;
11567 
11568 
11569 
11570            --insert in lvl element preview tbl
11571 
11572            x_bil_sch_out_tbl(l_tbl_seq).Strm_Lvl_Seq_Num       := l_sll_tbl(l_index).sequence_no;
11573            x_bil_sch_out_tbl(l_tbl_seq).Lvl_Element_Seq_Num    := to_char(l_lvl_seq);
11574            IF l_next_cycle_dt < p_Line_detail.start_dt THEN
11575              x_bil_sch_out_tbl(l_tbl_seq).bill_from_date       :=   TRUNC(p_Line_detail.start_dt);
11576            ELSE
11577              x_bil_sch_out_tbl(l_tbl_seq).bill_from_date       :=   TRUNC(l_next_cycle_dt);
11578            END IF;
11579 
11580            x_bil_sch_out_tbl(l_tbl_seq).bill_to_date           :=   TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
11581 
11582            x_bil_sch_out_tbl(l_tbl_seq).amount                 := OKS_EXTWAR_UTIL_PVT.round_currency_amt(
11583                                                                           l_adjusted_amount,NVL(p_line_detail.currency_code,'USD'));
11584 
11585 
11586            x_bil_sch_out_tbl(l_tbl_seq).tx_date                :=   TRUNC(l_fnd_lvl_out_rec.date_transaction);
11587            x_bil_sch_out_tbl(l_tbl_seq).interface_date         :=   TRUNC(l_fnd_lvl_out_rec.date_to_interface);
11588 
11589            l_bill_sch_amt := nvl(l_bill_sch_amt,0) + nvl(x_bil_sch_out_tbl(l_tbl_seq).amount,0);
11590 
11591            l_tbl_seq := l_tbl_seq + 1;
11592         END IF;          -----end if for level element creation
11593 
11594         l_next_cycle_dt  := l_fnd_lvl_out_rec.next_cycle_date;
11595 
11596         EXIT WHEN (l_lvl_seq = l_sll_tbl(l_index).level_periods) OR
11597                   (TRUNC(l_next_cycle_dt) > p_line_detail.end_dt) OR
11598                   (TRUNC(l_next_cycle_dt) > l_sll_tbl(l_index).end_date)
11599 ;
11600 
11601         l_lvl_seq      := l_lvl_seq + 1;
11602 
11603        END LOOP;                   ---loop for sll period counter
11604 
11605     EXIT WHEN (l_index = l_sll_tbl.LAST) OR
11606               (TRUNC(l_next_cycle_dt) > p_line_detail.end_dt);
11607 
11608     l_index  := l_sll_tbl.NEXT(l_index);
11609 
11610 END LOOP;                    -----loop for sll tbl
11611 
11612 EXCEPTION
11613 
11614  WHEN OTHERS THEN
11615         OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
11616                             p_msg_name     => G_UNEXPECTED_ERROR,
11617                             p_token1       => G_SQLCODE_TOKEN,
11618                             p_token1_value => sqlcode,
11619                             p_token2       => G_SQLERRM_TOKEN,
11620                             p_token2_value => sqlerrm);
11621 
11622         x_return_status := G_RET_STS_UNEXP_ERROR;
11623 
11624 
11625 END Preview_Subscription_Bs;
11626 
11627 
11628 PROCEDURE ADJUST_REPLACE_PRODUCT_BS(p_old_cp_id      IN    NUMBER,
11629                                     p_new_cp_id      IN    NUMBER,
11630                                     x_return_status  OUT   NOCOPY VARCHAR2,
11631                                     x_msg_count      OUT   NOCOPY NUMBER,
11632                                     x_msg_data       OUT   NOCOPY VARCHAR2)
11633 
11634 IS
11635 
11636 CURSOR l_old_sll_csr IS
11637   SELECT id , cle_id, dnz_chr_id ,
11638          sequence_no, uom_code,  start_date,
11639          end_date, uom_per_period,advance_periods,level_periods,
11640          level_amount, invoice_offset_days,interface_offset_days,
11641          comments, due_arr_yn,amount,
11642          lines_detailed_yn,  security_group_id
11643   FROM   OKS_STREAM_LEVELS_B
11644   WHERE  cle_id = p_old_cp_id
11645   ORDER BY START_DATE;
11646 
11647 CURSOR l_old_bill_type_csr IS
11648   SELECT billing_schedule_type
11649   FROM OKS_K_LINES_B
11650   WHERE  cle_id = p_old_cp_id;
11651 
11652 CURSOR l_new_cp_csr IS
11653   SELECT id,end_date
11654   FROM okc_k_lines_b
11655   WHERE id = p_new_cp_id;
11656 
11657 
11658 
11659 l_old_sll_rec     l_old_sll_csr%ROWTYPE;
11660 l_new_cp_rec      l_new_cp_csr%ROWTYPE;
11661 
11662 l_old_bill_type   OKS_K_LINES_B.billing_schedule_type%TYPE;
11663 l_sll_index       NUMBER;
11664 l_index           NUMBER;
11665 l_sll_end_date    DATE;
11666 
11667 l_init_msg_list   VARCHAR2(2000) := OKC_API.G_FALSE;
11668 
11669 BEGIN
11670 x_return_status := 'S';
11671 
11672 
11673 
11674 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11675 
11676    fnd_log.STRING (fnd_log.level_statement,
11677                    G_MODULE_CURRENT || '.adjust_replace_product_bs.line_details',
11678                    'old sub line id passed = ' || p_old_cp_id
11679                    || ', new sub line id passed = ' || p_new_cp_id
11680                    );
11681 END IF;
11682 
11683 
11684 OPEN l_old_bill_type_csr;
11685 FETCH l_old_bill_type_csr INTO l_old_bill_type;
11686 IF l_old_bill_type_csr%NOTFOUND THEN
11687    l_old_bill_type := 'T';
11688 END IF;
11689 CLOSE l_old_bill_type_csr;
11690 
11691 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11692 
11693    fnd_log.STRING (fnd_log.level_statement,
11694                    G_MODULE_CURRENT || '.adjust_replace_product_bs.billing_sch_type',
11695                    'old line billing scheduel type = ' || l_old_bill_type
11696                    );
11697 END IF;
11698 
11699 l_sll_index  := 0;
11700 l_strm_lvl_tbl_in.DELETE;
11701 
11702 FOR l_old_sll_rec IN l_old_sll_csr
11703 LOOP
11704 
11705   l_sll_index := l_sll_index + 1;
11706 
11707   l_strm_lvl_tbl_in(l_sll_index).chr_id                   := NULL;
11708   l_strm_lvl_tbl_in(l_sll_index).cle_id                   := p_new_cp_id;
11709   l_strm_lvl_tbl_in(l_sll_index).dnz_chr_id               := l_old_sll_rec.dnz_chr_id;
11710   l_strm_lvl_tbl_in(l_sll_index).sequence_no              := l_old_sll_rec.sequence_no;
11711   l_strm_lvl_tbl_in(l_sll_index).uom_code                 := l_old_sll_rec.uom_code;
11712   l_strm_lvl_tbl_in(l_sll_index).start_date               := l_old_sll_rec.start_date;
11713 
11714   l_strm_lvl_tbl_in(l_sll_index).end_date                 := nvl(l_old_sll_rec.end_date,
11715                                                                  OKC_TIME_UTIL_PUB.get_enddate(
11716                                                                        l_old_sll_rec.start_date,
11717                                                                        l_old_sll_rec.uom_code,
11718                                                                       (l_old_sll_rec.level_periods *
11719                                                                         l_old_sll_rec.uom_per_period)) );
11720 
11721 
11722   l_strm_lvl_tbl_in(l_sll_index).level_periods            := l_old_sll_rec.level_periods;
11723   l_strm_lvl_tbl_in(l_sll_index).uom_per_period           := l_old_sll_rec.uom_per_period;
11724   l_strm_lvl_tbl_in(l_sll_index).level_amount             := l_old_sll_rec.level_amount;
11725   l_strm_lvl_tbl_in(l_sll_index).invoice_offset_days      := l_old_sll_rec.invoice_offset_days;
11726   l_strm_lvl_tbl_in(l_sll_index).interface_offset_days    := l_old_sll_rec.interface_offset_days;
11727 
11728 
11729   l_strm_lvl_tbl_in(l_sll_index).object_version_number     := OKC_API.G_MISS_NUM;
11730   l_strm_lvl_tbl_in(l_sll_index).created_by                := OKC_API.G_MISS_NUM;
11731   l_strm_lvl_tbl_in(l_sll_index).creation_date             := SYSDATE;
11732   l_strm_lvl_tbl_in(l_sll_index).last_updated_by           := OKC_API.G_MISS_NUM;
11733   l_strm_lvl_tbl_in(l_sll_index).last_update_date          := SYSDATE;
11734 
11735   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11736 
11737    fnd_log.STRING (fnd_log.level_statement,
11738                    G_MODULE_CURRENT || '.adjust_replace_product_bs.new_sll_tbl_dtls',
11739                       'sll num = ' || l_sll_index
11740                    || ', sll start date = ' || l_strm_lvl_tbl_in(l_sll_index).start_date
11741                    || ', sll end date = ' || l_strm_lvl_tbl_in(l_sll_index).end_date
11742                    || ', sll uom_code = ' || l_strm_lvl_tbl_in(l_sll_index).uom_code
11743                    || ', sll uom_per_period = ' || l_strm_lvl_tbl_in(l_sll_index).uom_per_period
11744                    || ', sll sequence_no = ' || l_strm_lvl_tbl_in(l_sll_index).sequence_no
11745                    || ', sll cle id = ' || l_strm_lvl_tbl_in(l_sll_index).cle_id
11746                    );
11747   END IF;
11748 
11749 
11750 END LOOP;
11751 
11752 IF l_strm_lvl_tbl_in.COUNT > 0 THEN
11753 
11754   OKS_SLL_PVT.insert_row(
11755                p_api_version        => l_api_version,
11756                p_init_msg_list      => l_init_msg_list,
11757                x_return_status      => x_return_status,
11758                x_msg_count          => x_msg_count,
11759                x_msg_data           => x_msg_data,
11760                p_sllv_tbl           => l_strm_lvl_tbl_in,
11761                x_sllv_tbl           => l_strm_lvl_tbl_out);
11762 
11763   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11764      fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.insert_sll',
11765                          'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
11766                          ||', sll tbl out count = '||l_strm_lvl_tbl_out.count||')');
11767   END IF;
11768 
11769   IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
11770      RAISE G_EXCEPTION_HALT_VALIDATION;
11771   END IF;
11772 
11773   OPEN l_new_cp_csr;
11774   FETCH l_new_cp_csr INTO l_new_cp_rec;
11775   IF l_new_cp_csr%NOTFOUND THEN
11776     CLOSE l_new_cp_csr;
11777     IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11778         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_replace_product_bs.EXCEPTION',
11779         'new cp not found  = ' || p_new_cp_id);
11780     END IF;
11781     RAISE G_EXCEPTION_HALT_VALIDATION;
11782 
11783   END IF;
11784   CLOSE l_new_cp_csr;
11785 
11786 
11787 
11788   ----update the level elements of old line to new line.
11789 
11790   FOR l_sll_index IN l_strm_lvl_tbl_out.FIRST .. l_strm_lvl_tbl_out.LAST
11791   LOOP
11792 
11793     IF l_sll_index = l_strm_lvl_tbl_out.LAST THEN
11794        l_sll_end_date  := l_new_cp_rec.end_date;
11795     ELSE
11796        l_sll_end_date  := l_strm_lvl_tbl_out(l_sll_index).end_date;
11797     END IF;
11798 
11799     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11800      fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_lvl_elements',
11801                          'sll rule id = ' || l_strm_lvl_tbl_out(l_sll_index).id
11802                          ||', sll end date = '|| l_sll_end_date);
11803     END IF;
11804 
11805     UPDATE oks_level_elements
11806     SET rul_id = l_strm_lvl_tbl_out(l_sll_index).id,
11807         cle_id =  p_new_cp_id
11808     WHERE TRUNC(date_start) <= TRUNC(l_sll_end_date)
11809      AND  TRUNC(date_start) >= TRUNC(l_strm_lvl_tbl_out(l_sll_index).start_date)
11810      AND cle_id = p_old_cp_id;
11811 
11812    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11813      fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_lvl_amt',
11814                          'updated level elements = ' || sql%rowcount);
11815    END IF;
11816 
11817 
11818   END LOOP;            ---for loop for sll out tbl
11819 
11820   --update bill type of new line
11821 
11822   UPDATE oks_k_lines_b
11823   SET billing_schedule_type = l_old_bill_type
11824   WHERE cle_id = p_new_cp_id;
11825 
11826   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11827    fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_bill_type',
11828                          'update bill schedule type of new line to = ' || l_old_bill_type);
11829   END IF;
11830 
11831 
11832 
11833   IF l_old_bill_type IN ('E', 'P') THEN
11834   ---update lvl amount to 0 of old line sll
11835 
11836    UPDATE oks_stream_levels_b
11837    SET level_amount = 0
11838    WHERE cle_id = p_old_cp_id;
11839 
11840    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11841       fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_oldsll_amt',
11842                          'update lvl amt of old line to zero = ' || sql%rowcount );
11843    END IF;
11844 
11845   END IF;               ----chk for bill type E and P
11846 
11847 
11848   ------update oks_bill_sub_lines with new cle_id
11849 
11850   UPDATE oks_bill_sub_lines
11851   SET cle_id = p_new_cp_id
11852   WHERE cle_id = p_old_cp_id;
11853 
11854 
11855   IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
11856      fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_replace_product_bs.update_bcl',
11857                          'updated bcl count = ' || sql%rowcount );
11858   END IF;
11859 
11860 END IF;               ----chk for sll count for old line
11861 
11862 
11863 
11864 EXCEPTION
11865  WHEN G_EXCEPTION_HALT_VALIDATION THEN
11866       IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
11867         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_replace_product_bs.EXCEPTION',
11868         'G_EXCEPTION_HALT_VALIDATION');
11869       END IF;
11870 
11871  WHEN OTHERS THEN
11872       IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
11873         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_replace_product_bs.UNEXPECTED',
11874                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
11875       END IF;
11876 
11877       OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
11878                             p_msg_name     => G_UNEXPECTED_ERROR,
11879                             p_token1       => G_SQLCODE_TOKEN,
11880                             p_token1_value => sqlcode,
11881                             p_token2       => G_SQLERRM_TOKEN,
11882                             p_token2_value => sqlerrm);
11883 
11884         x_return_status := G_RET_STS_UNEXP_ERROR;
11885 
11886 END ADJUST_REPLACE_PRODUCT_BS;
11887 
11888 Procedure ADJUST_SPLIT_BILL_SCH(p_old_cp_id      IN    NUMBER,
11889                                 p_new_cp_tbl     IN    OKS_BILL_SCH.SUBLINE_ID_TBL,
11890                                 x_return_status  OUT   NOCOPY VARCHAR2,
11891                                 x_msg_count      OUT   NOCOPY NUMBER,
11892                                 x_msg_data       OUT   NOCOPY VARCHAR2)
11893 
11894 IS
11895 
11896 CURSOR l_line_csr(p_line_id  NUMBER) IS
11897   SELECT line.id line_id, TRUNC(line.start_date) start_dt,
11898          TRUNC(line.end_date) end_dt, line.dnz_chr_id dnz_chr_id, line.lse_id,
11899          line.cle_id parent_id,line.inv_rule_id inv_rule_id,
11900          (nvl(line.price_negotiated,0) +  nvl(dtl.ubt_amount,0) +
11901           nvl(dtl.credit_amount,0) +  nvl(dtl.suppressed_credit,0) ) line_amt,
11902          dtl.billing_schedule_type billing_schedule_type
11903   FROM okc_k_lines_b line, oks_k_lines_b dtl
11904   WHERE line.id= p_line_id
11905   AND line.id = dtl.cle_id;
11906 
11907 CURSOR l_line_BS_csr(p_line_id  NUMBER) IS
11908 
11909    SELECT id,trunc(date_start) date_start,
11910    amount,trunc(date_end) date_end,object_version_number,
11911    date_to_interface, date_transaction,date_completed
11912    FROM oks_level_elements
11913    WHERE cle_id = p_line_id
11914    ORDER BY date_start;
11915 
11916 
11917 CURSOR chk_subline_bs_csr(p_line_id  NUMBER) IS
11918    SELECT id
11919    FROM oks_level_elements
11920    WHERE cle_id = p_line_id;
11921 
11922 CURSOR l_amt_csr(p_line_id  NUMBER) IS
11923 
11924    SELECT SUM(NVL(amount,0)) tot_amt
11925    FROM oks_level_elements
11926    WHERE cle_id = p_line_id;
11927 
11928 Cursor  l_line_amt_csr (p_id in number) IS
11929 Select  line.price_negotiated
11930 from    okc_k_lines_b line
11931 where   line.id = p_id;
11932 
11933 l_old_cp_rec           Prod_Det_Type;
11934 l_new_cp_rec           Prod_Det_Type;
11935 l_line_rec             l_line_csr%ROWTYPE;
11936 l_line_BS_rec          l_line_BS_csr%ROWTYPE;
11937 l_sll_in_tbl           StrmLvl_Out_tbl;
11938 l_cp_sll_out_tbl       StrmLvl_Out_tbl;
11939 l_sll_db_tbl           oks_bill_sch.StreamLvl_tbl;
11940 l_top_bs_tbl           oks_bill_level_elements_pvt.letv_tbl_type;
11941 l_new_sll_tbl          oks_bill_sch.StreamLvl_tbl;
11942 l_cp_new_bs_tbl        oks_bill_level_elements_pvt.letv_tbl_type;
11943 l_cp_old_bs_tbl        oks_bill_level_elements_pvt.letv_tbl_type;
11944 
11945 
11946 l_top_line_rec         Line_Det_Type;
11947 l_cp_rec               Prod_Det_Type;
11948 -------------------------------------------------------------------------
11949 -- Begin partial period computation logic
11950 -- Developer Mani Choudhary
11951 -- Date 04-MAY-2005
11952 -------------------------------------------------------------------------
11953 l_price_uom         OKS_K_HEADERS_B.PRICE_UOM%TYPE;
11954 l_period_start      OKS_K_HEADERS_B.PERIOD_START%TYPE;
11955 l_period_type       OKS_K_HEADERS_B.PERIOD_TYPE%TYPE;
11956 l_return_status     VARCHAR2(30);
11957 l_tangible          BOOLEAN;
11958 l_pricing_method    VARCHAR2(30);
11959 -------------------------------------------------------------------------
11960 -- End partial period computation logic
11961 -- Date 04-MAY-2005
11962 -------------------------------------------------------------------------
11963 
11964 l_billing_type         oks_k_lines_b.billing_schedule_type%type;
11965 l_inv_rule_id          number;
11966 l_top_line_id          NUMBER;
11967 l_bs_id                NUMBER;
11968 l_index                NUMBER;
11969 l_cp_bs_ind            NUMBER;
11970 l_top_bs_ind           NUMBER;
11971 l_total_amt            NUMBER;
11972 l_init_msg_list        VARCHAR2(2000) := OKC_API.G_FALSE;
11973 L_EXCEPTION_END    Exception;
11974 
11975 
11976 BEGIN
11977 
11978 x_return_status := 'S';
11979 
11980 
11981 ---- return with success if billing schedule doesnt exists for the lines which gets split in IB
11982 Open chk_subline_bs_csr(p_old_cp_id);
11983 Fetch chk_subline_bs_csr Into l_bs_id;
11984    If chk_subline_bs_csr%Notfound then
11985       Close chk_subline_bs_csr;
11986       x_return_status := 'S';
11987       Raise  L_EXCEPTION_END;
11988    END IF;
11989 
11990 Close chk_subline_bs_csr;
11991 
11992 ------------find out the old subline details
11993 
11994 Open l_Line_Csr(p_old_cp_id);
11995 Fetch l_Line_Csr Into l_Line_Rec;
11996 
11997 If l_Line_Csr%Notfound then
11998   Close l_Line_Csr;
11999   x_return_status := 'E';
12000   IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12001         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12002         'old sub line not found = ' || p_old_cp_id );
12003    END IF;
12004 
12005 End If;
12006 Close l_Line_Csr;
12007 
12008  -------------------------------------------------------------------------
12009  -- Begin partial period computation logic
12010  -- Developer Mani Choudhary
12011  -- Date 09-MAY-2005
12012  -------------------------------------------------------------------------
12013 
12014    OKS_RENEW_UTIL_PUB.Get_Period_Defaults
12015                 (
12016                  p_hdr_id          => l_Line_Rec.dnz_chr_id,
12017                  p_org_id          => NULL,
12018                  x_period_start    => l_period_start,
12019                  x_period_type     => l_period_type,
12020                  x_price_uom       => l_price_uom,
12021                  x_return_status   => x_return_status);
12022 
12023    IF x_return_status <> 'S' THEN
12024       RAISE G_EXCEPTION_HALT_VALIDATION;
12025    END IF;
12026   --Description in detail for the business rules for deriving the period start
12027   --1)For usage , period start  will always be 'SERVICE'
12028   --2)For Subscriptions, period start and period type will be NULL
12029   --  for tangible subscriptions as per CR1.For intangible subscriptions,
12030   --  if the profile OKS: Intangible Subscription Pricing Method
12031   --  is set to 'Subscription Based',then period start and period type will be NULL
12032   --  otherwise it will be 'SERVICE'
12033   --3) For Extended Warranty from OM, period start will always be 'SERVICE'
12034   --mchoudha fix for bug#5183011
12035    IF l_period_start IS NOT NULL AND
12036       l_period_type IS NOT NULL
12037    THEN
12038      IF l_line_rec.lse_id =12 THEN
12039         l_period_start := 'SERVICE';
12040      END IF;
12041      IF l_line_rec.lse_id = 46 THEN
12042        l_tangible  := OKS_SUBSCRIPTION_PUB.is_subs_tangible (l_line_rec.line_id);
12043        IF l_tangible THEN
12044          l_period_start := NULL;
12045          l_period_type := NULL;
12046        ELSE
12047          l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
12048          IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
12049            l_period_start := NULL;
12050            l_period_type := NULL;
12051          ELSE
12052            l_period_start := 'SERVICE';
12053          END IF;   -- l_pricing_method <> 'EFFECTIVITY'
12054        END IF;     -- IF l_tangible THEN
12055      END IF;       -- IF l_Line_Csr_Rec.lse_id = 46
12056    END IF;         -- period start and period type are not NULL
12057  -------------------------------------------------------------------------
12058  -- End partial period computation logic
12059  -- Date 09-MAY-2005
12060  -------------------------------------------------------------------------
12061 
12062 l_old_cp_rec.cp_id          :=  l_line_rec.line_id ;
12063 l_old_cp_rec.cp_start_dt    :=  l_line_rec.start_dt;
12064 l_old_cp_rec.cp_end_dt      :=  l_line_rec.end_dt ;
12065 l_old_cp_rec.cp_amt         :=  l_line_rec.line_amt ;
12066 
12067 IF l_period_type is not null AND l_period_start is not NULL THEN
12068   OPEN l_line_amt_csr(p_old_cp_id);
12069   FETCH l_line_amt_csr INTO l_old_cp_rec.cp_amt ;
12070   CLOSE l_line_amt_csr;
12071 END IF;
12072 l_top_line_id  := l_line_rec.parent_id;
12073 
12074 
12075 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12076 
12077    fnd_log.STRING (fnd_log.level_statement,
12078                    G_MODULE_CURRENT || '.adjust_split_bill_sch.old_cp_dtls',
12079                       'old subline id = ' || l_old_cp_rec.cp_id
12080                    || ', start date = ' || l_old_cp_rec.cp_start_dt
12081                    || ', end date = ' || l_old_cp_rec.cp_end_dt
12082                    || ', amount = ' || l_old_cp_rec.cp_amt
12083                    || ', top line id = ' || l_top_line_id  );
12084 END IF;
12085 
12086 
12087 ------------find out the top line details
12088 
12089 Open l_Line_Csr(l_top_line_id);
12090 Fetch l_Line_Csr Into l_Line_Rec;
12091 
12092 If l_Line_Csr%Notfound then
12093   Close l_Line_Csr;
12094   x_return_status := 'E';
12095   IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12096         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12097         'top line not found = ' || l_top_line_id );
12098    END IF;
12099 
12100 End If;
12101 Close l_Line_Csr;
12102 
12103 l_top_line_rec.chr_id          := l_line_rec.dnz_chr_id ;
12104 l_top_line_rec.dnz_chr_id      := l_line_rec.dnz_chr_id;
12105 l_top_line_rec.id              := l_line_rec.line_id ;
12106 l_top_line_rec.lse_id          := l_line_rec.lse_id;
12107 l_top_line_rec.line_start_dt   := l_line_rec.start_dt;
12108 l_top_line_rec.line_end_dt     := l_line_rec.end_dt ;
12109 l_top_line_rec.line_amt        := l_line_rec.line_amt ;
12110 
12111 IF l_period_type is not null AND l_period_start is not NULL THEN
12112   OPEN l_line_amt_csr(l_top_line_id);
12113   FETCH l_line_amt_csr INTO l_top_line_rec.line_amt;
12114   CLOSE l_line_amt_csr;
12115 END IF;
12116 
12117 l_inv_rule_id  := l_line_rec.inv_rule_id;
12118 l_billing_type := l_line_rec.billing_schedule_type;
12119 
12120 
12121 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12122 
12123    fnd_log.STRING (fnd_log.level_statement,
12124                    G_MODULE_CURRENT || '.adjust_split_bill_sch.top_line_dtls',
12125                       'top line id = ' || l_top_line_rec.id
12126                    || ', start date = ' || l_top_line_rec.line_start_dt
12127                    || ', end date = ' || l_top_line_rec.line_start_dt
12128                    || ', amount = ' || l_top_line_rec.line_amt
12129                    || ', billing type = ' || l_billing_type
12130                    || ', inv rule = ' || l_inv_rule_id);
12131 END IF;
12132 
12133 
12134 ----get currency
12135 l_currency_code := Find_Currency_Code(
12136                                     p_cle_id  => null,
12137                                     p_chr_id  => l_top_line_rec.dnz_chr_id);
12138 
12139 IF l_currency_code IS NULL THEN
12140       OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'CURRENCY CODE NOT FOUND.');
12141       x_return_status := 'E';
12142       IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12143         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12144         'currency not found for contract id = ' || l_top_line_rec.dnz_chr_id );
12145       END IF;
12146       RETURN;
12147 END IF;
12148 
12149 
12150 IF l_billing_type IN ('T','E') THEN
12151   l_top_bs_tbl.DELETE;
12152   l_index  := 1;
12153 
12154   FOR l_line_BS_rec IN l_line_BS_csr(l_top_line_id)
12155   LOOP
12156     l_top_bs_tbl(l_index).id                     := l_line_BS_rec.id;
12157     l_top_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
12158     l_top_bs_tbl(l_index).date_end               := l_line_bs_rec.date_end;
12159     l_top_bs_tbl(l_index).Amount                 := l_line_BS_rec.amount;
12160     l_top_bs_tbl(l_index).object_version_number  := l_line_BS_rec.object_version_number;
12161     l_top_bs_tbl(l_index).date_transaction       := l_line_BS_rec.date_transaction;
12162     l_top_bs_tbl(l_index).date_to_interface      := l_line_BS_rec.date_to_interface;
12163 
12164     l_total_amt := NVL(l_total_amt,0) + NVL(l_line_BS_rec.amount,0);
12165 
12166     l_index := l_index + 1;
12167   END LOOP;
12168 
12169 
12170   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12171 
12172     fnd_log.STRING (fnd_log.level_statement,
12173                    G_MODULE_CURRENT || '.adjust_split_bill_sch.top_bs_tbl',
12174                     'top line lvl elements count = ' || l_top_bs_tbl.count
12175                   );
12176    END IF;
12177 
12178   ------old cp schedule
12179 
12180   l_cp_old_bs_tbl.DELETE;
12181   l_index  := 1;
12182   l_total_amt := 0;
12183 
12184   FOR l_line_BS_rec IN l_line_BS_csr(p_old_cp_id )
12185   LOOP
12186     l_cp_old_bs_tbl(l_index).id                     := l_line_BS_rec.id;
12187     l_cp_old_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
12188     l_cp_old_bs_tbl(l_index).Amount                 := l_line_BS_rec.amount;
12189     l_cp_old_bs_tbl(l_index).date_transaction       := l_line_BS_rec.date_transaction;
12190     l_cp_old_bs_tbl(l_index).date_to_interface      := l_line_BS_rec.date_to_interface;
12191     l_cp_old_bs_tbl(l_index).date_completed         := l_line_BS_rec.date_completed;
12192 
12193     l_total_amt := NVL(l_total_amt,0) + NVL(l_line_BS_rec.amount, 0);
12194 
12195     l_index := l_index + 1;
12196   END LOOP;
12197 
12198 
12199   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12200 
12201     fnd_log.STRING (fnd_log.level_statement,
12202                    G_MODULE_CURRENT || '.adjust_split_bill_sch.old_cp_bs_tbl',
12203                     'old cp lvl elements count = ' || l_cp_old_bs_tbl.count
12204                   );
12205   END IF;
12206 
12207   --------adjust top line bs amount as (top line bs amt - old cp bs amt)
12208   l_cp_bs_ind := l_cp_old_bs_tbl.FIRST;
12209   l_top_bs_ind := l_top_bs_tbl.FIRST;
12210 
12211   WHILE TRUNC(l_cp_old_bs_tbl(l_cp_bs_ind).date_start) > TRUNC(l_top_bs_tbl(l_top_bs_ind).DATE_START) AND
12212              l_top_bs_ind < l_top_bs_tbl.LAST
12213   LOOP
12214     l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
12215   END LOOP;
12216 
12217   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12218 
12219     fnd_log.STRING (fnd_log.level_statement,
12220                  G_MODULE_CURRENT || '.Adjust_split_bill_sch.while_top_bs',
12221                   'after while loop in top bs index = ' || l_top_bs_ind
12222                 || ' , date start = ' || l_top_bs_tbl(l_top_bs_ind ).DATE_START
12223                 );
12224   END IF;
12225 
12226   ---chk first cp bs.st_dt if between previous and present record
12227 
12228   IF l_top_bs_ind = l_top_bs_tbl.first THEN
12229     NULL;
12230 
12231   ELSIF TRUNC(l_cp_old_bs_tbl(l_cp_bs_ind).date_start) >= TRUNC(l_top_bs_tbl(l_top_bs_ind - 1).DATE_START)
12232      AND TRUNC(l_cp_old_bs_tbl(l_cp_bs_ind).date_start) <= TRUNC(l_top_bs_tbl(l_top_bs_ind ).DATE_START) THEN
12233 
12234      l_top_bs_ind := l_top_bs_ind - 1;
12235 
12236   ELSIF l_cp_old_bs_tbl(l_cp_bs_ind).date_start = l_top_bs_tbl(l_top_bs_ind).DATE_START THEN
12237      null;
12238   END IF;
12239 
12240 
12241 
12242   FOR l_cp_bs_ind IN l_cp_old_bs_tbl.FIRST .. l_cp_old_bs_tbl.LAST
12243   LOOP
12244 
12245    IF l_top_bs_ind  <= l_top_bs_tbl.LAST THEN
12246 
12247      l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) -
12248                                               nvl(l_cp_old_bs_tbl(l_cp_bs_ind).amount,0);
12249      l_top_bs_ind  := l_top_bs_ind + 1;
12250 
12251   END IF;
12252  END LOOP;
12253 
12254 ELSE           -----bill type = P
12255 
12256   /*mchandak Fix for Bug#16513761 */
12257     l_cp_old_bs_tbl.DELETE;
12258     l_index  := 1;
12259 
12260     FOR l_line_BS_rec IN l_line_BS_csr(p_old_cp_id )
12261     LOOP
12262       l_cp_old_bs_tbl(l_index).id                     := l_line_BS_rec.id;
12263       l_cp_old_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
12264       l_cp_old_bs_tbl(l_index).Amount                 := l_line_BS_rec.amount;
12265       l_cp_old_bs_tbl(l_index).date_transaction       := l_line_BS_rec.date_transaction;
12266       l_cp_old_bs_tbl(l_index).date_to_interface      := l_line_BS_rec.date_to_interface;
12267       l_cp_old_bs_tbl(l_index).date_completed         := l_line_BS_rec.date_completed;
12268       l_index := l_index + 1;
12269     END LOOP;
12270 
12271     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12272       fnd_log.STRING (fnd_log.level_statement,
12273                      G_MODULE_CURRENT || '.adjust_split_bill_sch.old_cp_bs_tbl',
12274                       'old cp lvl elements count = ' || l_cp_old_bs_tbl.count
12275                     );
12276     END IF;
12277   /* End of codefix for Bug#16513761 */
12278 
12279  OPEN l_amt_csr(p_old_cp_id);
12280  FETCH  l_amt_csr INTO l_total_amt;
12281  CLOSE l_amt_csr;
12282 
12283 END IF;       -----end of  'T' and E
12284 
12285 ------get sll for old sub line, so that sll amt can be prorated for new subline sll.
12286 
12287 Get_SLL_info(p_top_line_id       => l_top_line_id,
12288               p_line_id          => l_old_cp_rec.cp_id ,
12289               x_sll_tbl          => l_sll_in_tbl,
12290               x_sll_db_tbl       => l_sll_db_tbl,
12291               x_return_status    => x_return_status );
12292 
12293 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12294   fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.get_old_cp_sll',
12295                       'Get_SLL_info(x_return_status = '||x_return_status
12296                       ||', sll tbl out count = '||l_sll_db_tbl.count||')');
12297 END IF;
12298 
12299 IF x_return_status <> 'S' THEN
12300   RAISE G_EXCEPTION_HALT_VALIDATION;
12301 END IF;
12302 
12303 
12304 IF l_sll_db_tbl.COUNT = 0 THEN
12305   RETURN;
12306 END IF;
12307 
12308 FOR i IN p_new_cp_tbl.FIRST .. p_new_cp_tbl.LAST
12309 LOOP
12310    l_new_sll_tbl.DELETE;
12311 
12312    l_new_sll_tbl := l_sll_db_tbl;
12313 
12314 
12315    FOR l_index IN l_sll_db_tbl.FIRST .. l_sll_db_tbl.LAST
12316    LOOP
12317 
12318       l_new_sll_tbl(l_index).cle_id                    := p_new_cp_tbl(i).id;
12319       l_new_sll_tbl(l_index).id                        := NULL;
12320    END LOOP;
12321 
12322 
12323    ------------find out the new subline details
12324 
12325    Open l_Line_Csr(p_new_cp_tbl(i).id);
12326    Fetch l_Line_Csr Into l_Line_Rec;
12327 
12328    If l_Line_Csr%Notfound then
12329      Close l_Line_Csr;
12330      x_return_status := 'E';
12331      IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12332         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12333         'new sub line not found = ' || p_new_cp_tbl(i).id );
12334       END IF;
12335 
12336    End If;
12337    Close l_Line_Csr;
12338 
12339 
12340    l_new_cp_rec.cp_id          :=  l_line_rec.line_id ;
12341    l_new_cp_rec.cp_start_dt    :=  l_line_rec.start_dt;
12342    l_new_cp_rec.cp_end_dt      :=  l_line_rec.end_dt ;
12343    l_new_cp_rec.cp_amt         :=  l_line_rec.line_amt ;
12344 
12345    IF l_period_type is not null AND l_period_start is not NULL THEN
12346      OPEN l_line_amt_csr(p_new_cp_tbl(i).id);
12347      FETCH l_line_amt_csr INTO l_new_cp_rec.cp_amt;
12348      CLOSE l_line_amt_csr;
12349    END IF;
12350 
12351    IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12352 
12353       fnd_log.STRING (fnd_log.level_statement,
12354                       G_MODULE_CURRENT || '.adjust_split_bill_sch.new_cp_dtls',
12355                          'new subline id = ' || l_new_cp_rec.cp_id
12356                       || ', start date = ' || l_new_cp_rec.cp_start_dt
12357                       || ', end date = ' || l_new_cp_rec.cp_end_dt
12358                       || ', amount = ' || l_new_cp_rec.cp_amt
12359                       || ', top line id = ' || l_top_line_id
12360                      );
12361    END IF;
12362 
12363 
12364    IF l_line_rec.billing_schedule_type IS NULL OR
12365       l_line_rec.billing_schedule_type <> l_billing_type THEN
12366 
12367      UPDATE OKS_K_LINES_B SET billing_schedule_type = l_billing_type
12368      WHERE cle_id = l_new_cp_rec.cp_id;
12369 
12370 
12371      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12372         fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.update_bill_type',
12373                             'updated new sub line billing type = ' || sql%rowcount);
12374 
12375      END IF;
12376    END IF;
12377 
12378    IF l_billing_type IN ('E', 'P') THEN
12379      Prorate_sll_amt(
12380                      p_old_cp_amt     => l_old_cp_rec.cp_amt,
12381                      p_new_cp_amt     => l_new_cp_rec.cp_amt,
12382                      p_total_Amt      => l_total_amt,
12383                      p_new_sll_tbl    => l_new_sll_tbl,
12384                      p_old_sll_tbl    => l_sll_db_tbl,
12385                      x_return_status  =>  x_return_status);
12386 
12387      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12388         fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.prorate_sll_amt',
12389                             'Prorate_sll_amt status = ' || x_return_status
12390                       );
12391 
12392      END IF;
12393 
12394      IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12395        RAISE G_EXCEPTION_HALT_VALIDATION;
12396      END IF;
12397    END IF;
12398 
12399    l_strm_lvl_tbl_in.DELETE;
12400    l_index := 0;
12401 
12402    FOR l_index IN l_new_sll_tbl.FIRST .. l_new_sll_tbl.LAST
12403    LOOP
12404 
12405       l_strm_lvl_tbl_in(l_index).chr_id                   :=  l_new_sll_tbl(l_index).chr_id;
12406       l_strm_lvl_tbl_in(l_index).dnz_chr_id               :=  l_new_sll_tbl(l_index).dnz_chr_id;
12407       l_strm_lvl_tbl_in(l_index).sequence_no              :=  l_new_sll_tbl(l_index).sequence_no ;
12408       l_strm_lvl_tbl_in(l_index).uom_code                 :=  l_new_sll_tbl(l_index).uom_code;
12409       l_strm_lvl_tbl_in(l_index).start_date               :=  l_new_sll_tbl(l_index).start_date;
12410       l_strm_lvl_tbl_in(l_index).end_date                 :=  l_new_sll_tbl(l_index).end_date;
12411       l_strm_lvl_tbl_in(l_index).level_periods            :=  l_new_sll_tbl(l_index).level_periods;
12412       l_strm_lvl_tbl_in(l_index).uom_per_period           :=  l_new_sll_tbl(l_index).uom_per_period;
12413       l_strm_lvl_tbl_in(l_index).level_amount             :=  l_new_sll_tbl(l_index).level_amount;
12414       l_strm_lvl_tbl_in(l_index).invoice_offset_days      :=  l_new_sll_tbl(l_index).invoice_offset_days;
12415       l_strm_lvl_tbl_in(l_index).interface_offset_days    :=  l_new_sll_tbl(l_index).interface_offset_days;
12416 
12417       l_strm_lvl_tbl_in(l_index).id                        := NULL;
12418       l_strm_lvl_tbl_in(l_index).cle_id                    := p_new_cp_tbl(i).id;
12419 
12420 
12421       l_strm_lvl_tbl_in(l_index).object_version_number     := OKC_API.G_MISS_NUM;
12422       l_strm_lvl_tbl_in(l_index).created_by                := OKC_API.G_MISS_NUM;
12423       l_strm_lvl_tbl_in(l_index).creation_date             := SYSDATE;
12424       l_strm_lvl_tbl_in(l_index).last_updated_by           := OKC_API.G_MISS_NUM;
12425       l_strm_lvl_tbl_in(l_index).last_update_date          := SYSDATE;
12426 
12427 
12428    END LOOP;
12429 
12430 
12431    OKS_SLL_PVT.insert_row(
12432                   p_api_version        => l_api_version,
12433                   p_init_msg_list      => l_init_msg_list,
12434                   x_return_status      => x_return_status,
12435                   x_msg_count          => x_msg_count,
12436                   x_msg_data           => x_msg_data,
12437                   p_sllv_tbl           => l_strm_lvl_tbl_in,
12438                   x_sllv_tbl           => l_strm_lvl_tbl_out);
12439 
12440    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12441       fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.insert_sll',
12442                           'OKS_SLL_PVT.insert_row(x_return_status = '||x_return_status
12443                        ||', sll tbl out count = '||l_strm_lvl_tbl_out.count||')');
12444    END IF;
12445 
12446    IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12447       RAISE G_EXCEPTION_HALT_VALIDATION;
12448    END IF;
12449 
12450    l_cp_sll_out_tbl.DELETE;
12451 
12452    FOR l_tbl_index IN l_strm_lvl_tbl_out.FIRST .. l_strm_lvl_tbl_out.LAST
12453    LOOP
12454 
12455        l_cp_sll_out_tbl(l_tbl_index).chr_Id                := l_strm_lvl_tbl_out(l_tbl_index).chr_id;
12456        l_cp_sll_out_tbl(l_tbl_index).cle_Id                := l_strm_lvl_tbl_out(l_tbl_index).cle_id;
12457        l_cp_sll_out_tbl(l_tbl_index).dnz_chr_Id            := l_strm_lvl_tbl_out(l_tbl_index).dnz_chr_id;
12458        l_cp_sll_out_tbl(l_tbl_index).Id                    := l_strm_lvl_tbl_out(l_tbl_index).id;
12459        l_cp_sll_out_tbl(l_tbl_index).Seq_no                := l_strm_lvl_tbl_out(l_tbl_index).sequence_no;
12460        l_cp_sll_out_tbl(l_tbl_index).Dt_start              := l_strm_lvl_tbl_out(l_tbl_index).start_date;
12461        l_cp_sll_out_tbl(l_tbl_index).end_date              := l_strm_lvl_tbl_out(l_tbl_index).end_date;
12462        l_cp_sll_out_tbl(l_tbl_index).Level_Period          := l_strm_lvl_tbl_out(l_tbl_index).level_periods;
12463        l_cp_sll_out_tbl(l_tbl_index).uom_Per_Period        := l_strm_lvl_tbl_out(l_tbl_index).uom_per_period;
12464        l_cp_sll_out_tbl(l_tbl_index).uom                   := l_strm_lvl_tbl_out(l_tbl_index).uom_code;
12465        l_cp_sll_out_tbl(l_tbl_index).Amount                := l_strm_lvl_tbl_out(l_tbl_index).level_amount;
12466        l_cp_sll_out_tbl(l_tbl_index).invoice_offset_days   := l_strm_lvl_tbl_out(l_tbl_index).invoice_offset_days;
12467        l_cp_sll_out_tbl(l_tbl_index).Interface_offset_days := l_strm_lvl_tbl_out(l_tbl_index).interface_offset_days;
12468 
12469    END LOOP;
12470 
12471    IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12472 
12473       fnd_log.STRING (fnd_log.level_statement,
12474                       G_MODULE_CURRENT || '.adjust_split_bill_sch.before_new_lvl_ele',
12475                        'sll count passed to Create_cp_lvl_elements = ' || l_cp_sll_out_tbl.count);
12476    END IF;
12477 
12478    ------create lvl elements for new cp level ele
12479  -------------------------------------------------------------------------
12480  -- Begin partial period computation logic
12481  -- Developer Mani Choudhary
12482  -- Date 09-MAY-2005
12483  -- Added two new parameters p_period_start and p_period_type
12484  -------------------------------------------------------------------------
12485    Create_cp_lvl_elements(
12486                p_billing_type      =>   l_billing_type,
12487                p_cp_sll_tbl        =>   l_cp_sll_out_tbl,
12488                p_Line_Rec          =>   l_top_Line_Rec,
12489                p_SubLine_rec       =>   l_new_cp_rec,
12490                p_invoice_rulid     =>   l_inv_rule_id,
12491                p_top_line_bs       =>   l_top_bs_tbl,
12492                p_term_dt           =>   null,
12493                p_period_start      =>   l_period_start,
12494                p_period_type       =>   l_period_type,
12495                x_return_status     =>   x_return_status);
12496 
12497 
12498    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12499       fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.Create_cp_lvl_elements',
12500                           'Create_cp_lvl_elements(x_return_status = '||x_return_status
12501                           ||', l_top_bs_tbl count = '||l_top_bs_tbl.count||')');
12502    END IF;
12503 
12504    IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12505       RAISE G_EXCEPTION_HALT_VALIDATION;
12506    END IF;
12507 
12508    ----adjust lvl element amt for old cp and top bs
12509 
12510    Adjust_billed_lvl_element(p_new_cp_id     => l_new_cp_rec.cp_id,
12511                              p_old_cp_bs_tbl => l_cp_old_bs_tbl,
12512                              x_new_cp_bs_tbl => l_cp_new_bs_tbl,
12513                              x_return_status => x_return_status);
12514 
12515 
12516    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12517       fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.Adjust_billed_lvl_element',
12518                           'Adjust_billed_lvl_element(x_return_status = '||x_return_status
12519                           ||', l_cp_old_bs_tbl count = '||l_cp_old_bs_tbl.count||')');
12520    END IF;
12521 
12522    IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12523       RAISE G_EXCEPTION_HALT_VALIDATION;
12524    END IF;
12525 
12526 
12527    ---add new bill records in billing tables
12528 
12529    OKS_BILL_UTIL_PUB.ADJUST_SPLIT_BILL_REC(p_old_cp_id     => l_old_cp_rec.cp_id,
12530                                         p_new_cp_id        => l_new_cp_rec.cp_id,
12531                                         p_currency_code    => l_currency_code,
12532                                         p_rgp_id           => NULL,
12533                                         p_old_cp_lvl_tbl   => l_cp_old_bs_tbl,
12534                                         p_new_cp_lvl_tbl   => l_cp_new_bs_tbl,
12535                                         x_return_status    => x_return_status,
12536                                         x_msg_count        => x_msg_count,
12537                                         x_msg_data         => x_msg_data);
12538 
12539 
12540    IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12541       fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.bill_rec',
12542                        'oks_bill_util_pub.adjust_split_bill_rec(x_return_status = '||x_return_status
12543                        ||'old line id = ' || l_old_cp_rec.cp_id || ')');
12544    END IF;
12545 
12546    IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12547       ----errorout_aD('ADJUST_SPLIT_BILL_REC ststaus = ' || x_return_status);
12548       RAISE G_EXCEPTION_HALT_VALIDATION;
12549    END IF;
12550 
12551    l_total_amt := NVL(l_total_amt,0) - NVL(l_new_cp_rec.cp_amt,0);
12552 
12553 END LOOP;            ---loop for new sub line
12554 
12555 
12556 ---update old sll amount if billtype in E and P
12557 
12558 l_cp_sll_out_tbl.DELETE;
12559 
12560 FOR l_index in l_sll_db_tbl.FIRST .. l_sll_db_tbl.LAST
12561 LOOP
12562 
12563   IF l_billing_type IN ('E', 'P') THEN
12564 
12565     UPDATE oks_stream_levels_b
12566     SET level_amount = l_sll_db_tbl(l_index).level_amount
12567     WHERE id = l_sll_db_tbl(l_index).id;
12568 
12569 
12570     IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12571      fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.old_sll_amt_update',
12572                        'old sll amount update = '|| l_sll_db_tbl(l_index).level_amount
12573                        ||', sll id = '|| l_sll_db_tbl(l_index).id  );
12574     END IF;
12575   END IF;
12576 
12577 
12578   l_cp_sll_out_tbl(l_index).Id                    := l_sll_db_tbl(l_index).id;
12579   l_cp_sll_out_tbl(l_index).chr_Id                := NULL;
12580   l_cp_sll_out_tbl(l_index).cle_Id                := l_sll_db_tbl(l_index).cle_id;
12581   l_cp_sll_out_tbl(l_index).dnz_chr_Id            := l_sll_db_tbl(l_index).dnz_chr_Id;
12582   l_cp_sll_out_tbl(l_index).Seq_no                := l_sll_db_tbl(l_index).sequence_no;
12583   l_cp_sll_out_tbl(l_index).Dt_start              := l_sll_db_tbl(l_index).Start_Date;
12584   l_cp_sll_out_tbl(l_index).end_date              := l_sll_db_tbl(l_index).end_Date;
12585   l_cp_sll_out_tbl(l_index).Level_Period          := l_sll_db_tbl(l_index).level_periods;
12586   l_cp_sll_out_tbl(l_index).uom_Per_Period        := l_sll_db_tbl(l_index).uom_per_period;
12587   l_cp_sll_out_tbl(l_index).uom                   := l_sll_db_tbl(l_index).uom_code;
12588   l_cp_sll_out_tbl(l_index).Amount                := l_sll_db_tbl(l_index).level_amount;
12589   l_cp_sll_out_tbl(l_index).invoice_offset_days   := l_sll_db_tbl(l_index).invoice_offset_days;
12590   l_cp_sll_out_tbl(l_index).Interface_offset_days := l_sll_db_tbl(l_index).interface_offset_days;
12591 
12592 END LOOP;
12593 
12594 
12595 ----refresh billing sch for old cp.
12596  -------------------------------------------------------------------------
12597  -- Begin partial period computation logic
12598  -- Developer Mani Choudhary
12599  -- Date 09-MAY-2005
12600  -- Added two new parameters p_period_start and p_period_type
12601  -------------------------------------------------------------------------
12602 Create_cp_lvl_elements(
12603                p_billing_type      =>   l_billing_type,
12604                p_cp_sll_tbl        =>   l_cp_sll_out_tbl,
12605                p_Line_Rec          =>   l_top_Line_Rec,
12606                p_SubLine_rec       =>   l_old_cp_rec,
12607                p_invoice_rulid     =>   l_inv_rule_id,
12608                p_top_line_bs       =>   l_top_bs_tbl,
12609                p_term_dt           =>   NULL,
12610                p_period_start      =>   l_period_start,   --mchoudha fix for bug#4998167 added l_period_start
12611                p_period_type       =>   l_period_type,    --mchoudha fix for bug#4998167 added l_period_type
12612                x_return_status     =>   x_return_status);
12613 
12614 IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12615    fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.adjust_split_bill_sch.refresh_old_cp_lvl',
12616                        'Create_cp_lvl_elements(x_return_status = '||x_return_status
12617                        ||', l_top_bs_tbl count = '||l_top_bs_tbl.count||')');
12618 END IF;
12619 
12620 IF NVL(x_return_status,'!') <> OKC_API.G_RET_STS_SUCCESS THEN
12621    RAISE G_EXCEPTION_HALT_VALIDATION;
12622 END IF;
12623 
12624 
12625 IF l_top_bs_tbl.COUNT > 0 THEN
12626 
12627  FOR l_index IN l_top_bs_tbl.FIRST .. l_top_bs_tbl.LAST
12628  LOOP
12629 
12630   UPDATE OKS_LEVEL_ELEMENTS
12631      SET amount = l_top_bs_tbl(l_index).amount
12632      WHERE id = l_top_bs_tbl(l_index).id;
12633 
12634      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12635        fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Adjust_split_bill_sch.update_top_lvl_amt',
12636                          'updated level elemnets of top line= ' || sql%rowcount
12637                        || ' , id = ' || l_top_bs_tbl(l_index).id
12638                        || ' , amt = ' || l_top_bs_tbl(l_index).amount );
12639      END IF;
12640   END LOOP;
12641 END IF;
12642 
12643 
12644 EXCEPTION
12645  WHEN L_EXCEPTION_END THEN
12646       x_return_status := 'S';
12647  WHEN G_EXCEPTION_HALT_VALIDATION THEN
12648       x_return_status := 'E';
12649       IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
12650         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.adjust_split_bill_sch.EXCEPTION',
12651         'G_EXCEPTION_HALT_VALIDATION');
12652       END IF;
12653 
12654  WHEN OTHERS THEN
12655       IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12656         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.adjust_split_bill_sch.UNEXPECTED',
12657                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12658       END IF;
12659 
12660       OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
12661                             p_msg_name     => G_UNEXPECTED_ERROR,
12662                             p_token1       => G_SQLCODE_TOKEN,
12663                             p_token1_value => sqlcode,
12664                             p_token2       => G_SQLERRM_TOKEN,
12665                             p_token2_value => sqlerrm);
12666 
12667         x_return_status := G_RET_STS_UNEXP_ERROR;
12668 END adjust_split_bill_sch;
12669 
12670 
12671 
12672 Procedure Prorate_sll_amt(
12673                   p_old_cp_amt     IN NUMBER,
12674                   p_new_cp_amt     IN NUMBER,
12675                   p_total_amt      IN NUMBER,
12676                   p_new_sll_tbl    IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
12677                   p_old_sll_tbl    IN OUT NOCOPY oks_bill_sch.StreamLvl_tbl,
12678                   x_return_status  OUT NOCOPY  VARCHAR2)
12679 
12680 IS
12681 l_tot_amt    NUMBER;
12682 l_amt        NUMBER;
12683 
12684 BEGIN
12685 
12686 x_return_status := OKC_API.G_RET_STS_SUCCESS;
12687 
12688 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12689 
12690       fnd_log.STRING (fnd_log.level_statement,
12691                       G_MODULE_CURRENT || '.Prorate_sll_amt.passed_val',
12692                        'p_total_amt = ' || p_total_amt
12693                      ||', p_new_cp_amt = ' || p_new_cp_amt);
12694 END IF;
12695 
12696 l_tot_amt := nvl(p_total_amt,0);
12697 
12698 FOR l_index IN p_old_sll_tbl.FIRST .. p_old_sll_tbl.LAST
12699 LOOP
12700 
12701   IF l_tot_amt = 0 THEN
12702     l_amt := 0;
12703   ELSE
12704 
12705     l_Amt := (NVL(p_old_sll_tbl(l_index).level_amount,0)/l_tot_amt) * nvl(p_new_cp_amt,0);
12706   END IF;
12707 
12708   p_new_sll_tbl(l_index).level_amount := OKS_EXTWAR_UTIL_PVT.round_currency_amt
12709                                                    (l_Amt, l_currency_code);
12710 
12711 
12712   p_old_sll_tbl(l_index).level_amount := nvl(p_old_sll_tbl(l_index).level_amount,0) -
12713                                                p_new_sll_tbl(l_index).level_amount;
12714 
12715   IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12716      fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Prorate_sll_amt.lvl_amt',
12717                          'sll seq  = ' || p_old_sll_tbl(l_index).sequence_no
12718                          ||', old sll amt = '|| p_old_sll_tbl(l_index).level_amount
12719                          ||', new sll amt = '|| p_new_sll_tbl(l_index).level_amount
12720                          ||', total amt = '|| l_tot_amt
12721                     );
12722   END IF;
12723 
12724 END LOOP;
12725 
12726 EXCEPTION
12727 
12728  WHEN OTHERS THEN
12729       IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12730         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Prorate_sll_amt.UNEXPECTED',
12731                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12732       END IF;
12733 
12734       OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
12735                             p_msg_name     => G_UNEXPECTED_ERROR,
12736                             p_token1       => G_SQLCODE_TOKEN,
12737                             p_token1_value => sqlcode,
12738                             p_token2       => G_SQLERRM_TOKEN,
12739                             p_token2_value => sqlerrm);
12740 
12741         x_return_status := G_RET_STS_UNEXP_ERROR;
12742 
12743 END Prorate_sll_amt;
12744 
12745 
12746 PROCEDURE Adjust_billed_lvl_element(p_new_cp_id     IN NUMBER,
12747                                     p_old_cp_bs_tbl IN OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
12748                                     x_new_cp_bs_tbl OUT NOCOPY oks_bill_level_elements_pvt.letv_tbl_type,
12749                                     x_return_status OUT NOCOPY VARCHAR2)
12750 IS
12751 
12752 
12753 CURSOR l_line_BS_csr(p_line_id  NUMBER) IS
12754 
12755    SELECT id,trunc(date_start) date_start,
12756    amount,trunc(date_end) date_end,date_completed
12757    FROM oks_level_elements
12758    WHERE cle_id = p_line_id
12759    ORDER BY date_start;
12760 
12761 l_line_BS_rec      l_line_BS_csr%ROWTYPE;
12762 l_index            NUMBER;
12763 
12764 BEGIN
12765 
12766 x_return_status  := OKC_API.G_RET_STS_SUCCESS;
12767 
12768 l_index  := 1;
12769 x_new_cp_bs_tbl.DELETE;
12770 
12771 FOR l_line_BS_rec IN l_line_BS_csr(p_new_cp_id)
12772 LOOP
12773   x_new_cp_bs_tbl(l_index).id                     := l_line_BS_rec.id;
12774   x_new_cp_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
12775   x_new_cp_bs_tbl(l_index).date_end               := l_line_bs_rec.date_end;
12776   x_new_cp_bs_tbl(l_index).Amount                 := l_line_bs_rec.amount;
12777   x_new_cp_bs_tbl(l_index).date_completed         := l_line_BS_rec.date_completed;
12778 
12779   l_index := l_index + 1;
12780 END LOOP;
12781 
12782 
12783 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12784 
12785   fnd_log.STRING (fnd_log.level_statement,
12786                  G_MODULE_CURRENT || '.Adjust_billed_lvl_element.new_bs_tbl',
12787                  'new sub line lvl elements count = ' || x_new_cp_bs_tbl.count);
12788 END IF;
12789 
12790 
12791 -------adjust the old cp lvl element amt for billed records
12792 -----as old cp lvl amount = old amt - new cp lvl amt.
12793 
12794 
12795 FOR l_index IN p_old_cp_bs_tbl.FIRST .. p_old_cp_bs_tbl.LAST
12796 LOOP
12797 
12798   IF TRUNC(p_old_cp_bs_tbl(l_index).date_start) = TRUNC(x_new_cp_bs_tbl(l_index).date_start) AND
12799      p_old_cp_bs_tbl(l_index).date_completed IS NOT NULL THEN
12800 
12801      p_old_cp_bs_tbl(l_index).amount  := p_old_cp_bs_tbl(l_index).amount - x_new_cp_bs_tbl(l_index).amount;
12802      x_new_cp_bs_tbl(l_index).date_completed  := sysdate;
12803 
12804      UPDATE OKS_LEVEL_ELEMENTS
12805      SET amount = p_old_cp_bs_tbl(l_index).amount
12806      WHERE id = p_old_cp_bs_tbl(l_index).id;
12807 
12808      IF fnd_log.level_event >= fnd_log.g_current_runtime_level THEN
12809        fnd_log.string(fnd_log.level_event,G_MODULE_CURRENT||'.Adjust_billed_lvl_element.update_old_lvl_amt',
12810                          'updated level elemnets = ' || sql%rowcount
12811                        || ' , id = ' || p_old_cp_bs_tbl(l_index).id
12812                        || ' , amt = ' || p_old_cp_bs_tbl(l_index).amount );
12813 
12814      END IF;
12815 
12816   END IF;
12817 END LOOP;
12818 
12819 EXCEPTION
12820 
12821  WHEN OTHERS THEN
12822       IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
12823         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Adjust_billed_lvl_element.UNEXPECTED',
12824                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
12825       END IF;
12826 
12827       OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
12828                             p_msg_name     => G_UNEXPECTED_ERROR,
12829                             p_token1       => G_SQLCODE_TOKEN,
12830                             p_token1_value => sqlcode,
12831                             p_token2       => G_SQLERRM_TOKEN,
12832                             p_token2_value => sqlerrm);
12833 
12834         x_return_status := G_RET_STS_UNEXP_ERROR;
12835 
12836 END Adjust_billed_lvl_element;
12837 
12838 
12839 --[llc] Sts_change_subline_lvl_rule
12840 
12841 /* This procedure updates the amount on the top line when the status of sub-line is
12842    changed from 'Entered' to 'Cancelled' or 'Cancelled' to 'Entered'.
12843 */
12844 
12845         PROCEDURE Sts_change_subline_lvl_rule(
12846                                                p_cle_id            IN  NUMBER,
12847                                                p_from_ste_code     IN VARCHAR2,
12848                                                p_to_ste_code       IN VARCHAR2,
12849                                                 x_return_status    OUT NOCOPY VARCHAR2,
12850                                                 x_msg_count        OUT NOCOPY  NUMBER,
12851                                                 x_msg_data         OUT NOCOPY VARCHAR2)
12852         IS
12853 
12854         -- to get the top line details
12855 
12856         CURSOR l_line_BS_csr(l_top_line_id Number) IS
12857                  SELECT id, trunc(date_start) date_start,
12858                  amount, TRUNC(DATE_end) date_end, object_version_number
12859                  FROM oks_level_elements
12860                  WHERE cle_id = l_top_line_id
12861                  ORDER BY date_start;
12862 
12863         -- to get the sub-line details.
12864         CURSOR l_cp_BS_csr IS
12865                  SELECT id, trunc(date_start) date_start,
12866                  amount
12867                  FROM oks_level_elements
12868                  WHERE cle_id = p_cle_id
12869                  ORDER BY date_start;
12870 
12871         -- to get the billing schedule of the sub-line on which the status changes action is taken.
12872 
12873         CURSOR l_bill_type_csr IS
12874                SELECT nvl(billing_schedule_type,'T') billing_schedule_type
12875                FROM oks_k_lines_b
12876                WHERE cle_id = p_cle_id;
12877 
12878 
12879          CURSOR is_top_line_csr (p_cle_id number) IS
12880          select cle_id
12881          from okc_k_lines_b
12882          where id=p_cle_id;
12883 
12884 
12885 -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
12886 -- CURSOR to check if price_negotiated of topline equals to total SLL amount for this topline
12887 -- on billing form (table- oks_level_elements, column- amount)
12888 
12889         CURSOR csr_CheckBillSllAmount_PN (p_top_line_id number) IS
12890         SELECT  1
12891         FROM    okc_k_lines_b
12892         WHERE   id = p_top_line_id
12893         AND     price_negotiated = (select sum(amount) from oks_level_elements ole1
12894                                    where ole1.parent_cle_id = p_top_line_id
12895                                    and ole1.object_version_number = ( select max(object_version_number)
12896                                                                       from oks_level_elements ole2
12897                                                                       where ole2.parent_cle_id = p_top_line_id
12898                                                                     )
12899                                     );
12900 
12901 
12902         l_line_BS_rec        l_line_BS_csr%ROWTYPE;
12903         l_cp_BS_rec          l_cp_BS_csr%ROWTYPE;
12904         l_bill_type_rec      l_bill_type_csr%ROWTYPE;
12905 
12906 
12907         l_top_bs_tbl         oks_bill_level_elements_pvt.letv_tbl_type;
12908         l_cp_bs_tbl          oks_bill_level_elements_pvt.letv_tbl_type;
12909         x_letv_tbl           oks_bill_level_elements_pvt.letv_tbl_type;
12910 
12911 
12912         i                    NUMBER := 0;
12913         l_index              NUMBER := 0;
12914         l_cp_bs_ind          NUMBER;
12915         l_top_bs_ind         NUMBER;
12916 
12917         l_api_Version              Number      := 1;
12918         l_init_msg_list            VARCHAR2(2000) := OKC_API.G_FALSE;
12919         l_msg_list                 VARCHAR2(1) DEFAULT OKC_API.G_FALSE;
12920         l_msg_count                Number;
12921         l_msg_data                 Varchar2(2000) := NULL;
12922 
12923         l_top_line_id           Number;
12924 
12925         l_dummy                 NUMBER;
12926 
12927 
12928         BEGIN
12929 
12930         x_return_status := 'S';
12931 
12932         ---get bill type details
12933 
12934         Open is_top_line_csr(p_cle_id);
12935         Fetch is_top_line_csr Into l_top_line_id;
12936         Close is_top_line_csr;
12937 
12938         -- 18-JAN-2006-maanand-Fixed Enhancement#4930700
12939 
12940         IF (l_top_line_id is null) THEN
12941 
12942             IF ((p_from_ste_code = 'CANCELLED' ) AND (p_to_ste_code = 'ENTERED')) then
12943 
12944                  Open csr_CheckBillSllAmount_PN(p_cle_id);
12945                  Fetch csr_CheckBillSllAmount_PN into l_dummy;
12946                  Close csr_CheckBillSllAmount_PN;
12947 
12948                  -- If status of service line is changed from CANCELED TO ENTERED status, then
12949                  -- refresh the billing schedule. This will ensure that billing schedule
12950                  -- amount matches with that of the price_negotiated amount of the service line
12951 
12952                  IF (nvl(l_dummy, 2) <> 1 ) THEN
12953 
12954                         OKS_BILL_SCH.Cascade_Dates_SLL
12955                         (
12956                          p_top_line_id         => p_cle_id,
12957                          x_return_status       => x_return_status,
12958                          x_msg_count           => l_msg_count,
12959                          x_msg_data            => l_msg_data );
12960 
12961                  END IF;
12962 
12963             END IF; -- p_from_ste_code = 'CANCELLED'
12964 
12965           return;
12966 
12967          END IF; -- l_top_line_id is null
12968 
12969 
12970         Open l_bill_type_Csr;
12971         Fetch l_bill_type_Csr Into l_bill_type_Rec;
12972 
12973         If l_bill_type_csr%Notfound then
12974             Close l_bill_type_Csr;
12975             x_return_status := 'E';
12976              OKC_API.set_message(G_PKG_NAME, G_REQUIRED_VALUE,G_COL_NAME_TOKEN,'BILLING SCHEDULE TYPE NOT FOUND.');
12977             RAISE G_EXCEPTION_HALT_VALIDATION;
12978         End If;
12979 
12980         Close l_bill_type_Csr;
12981 
12982         IF l_bill_type_rec.billing_schedule_type = 'T' then
12983 
12984           l_index  := 0;
12985           l_top_bs_tbl.DELETE;
12986 
12987           FOR l_line_BS_rec IN l_line_BS_csr(l_top_line_id)
12988           LOOP
12989            l_top_bs_tbl(l_index).id                     := l_line_BS_rec.id;
12990            l_top_bs_tbl(l_index).date_start             := l_line_BS_rec.date_start;
12991            l_top_bs_tbl(l_index).Amount                 := l_line_BS_rec.amount;
12992            l_top_bs_tbl(l_index).date_end               := l_line_BS_rec.date_end;
12993            l_top_bs_tbl(l_index).object_version_number  := l_line_BS_rec.object_version_number;
12994 
12995            l_index := l_index + 1;
12996           END LOOP;
12997 
12998         -- check there is any billing schedule exists for this sub-line
12999            If l_index = 0 then
13000                 Return;
13001            End if;
13002 
13003           l_index  := 0;
13004           l_cp_bs_tbl.DELETE;
13005 
13006           FOR l_cp_BS_rec IN l_cp_BS_csr
13007           LOOP
13008             l_cp_bs_tbl(l_index).id              := l_cp_BS_rec.id;
13009             l_cp_bs_tbl(l_index).date_start      := l_cp_BS_rec.date_start;
13010             l_cp_bs_tbl(l_index).Amount          := l_cp_BS_rec.amount;
13011 
13012             l_index := l_index + 1;
13013           END LOOP;
13014 
13015           IF l_cp_bs_tbl.COUNT > 0 THEN
13016 
13017 
13018              l_cp_bs_ind  := l_cp_bs_tbl.FIRST;
13019              l_top_bs_ind := l_top_bs_tbl.FIRST;
13020 
13021              WHILE l_cp_bs_tbl(l_cp_bs_ind).date_start > l_top_bs_tbl(l_top_bs_ind).DATE_START
13022                      AND l_top_bs_ind < l_top_bs_tbl.LAST
13023              LOOP
13024                l_top_bs_ind := l_top_bs_tbl.NEXT(l_top_bs_ind);
13025              END LOOP;
13026 
13027 
13028            IF l_top_bs_ind = l_top_bs_tbl.first THEN
13029               NULL;
13030 
13031            ELSIF  l_top_bs_ind <= l_top_bs_tbl.LAST THEN
13032 
13033              l_top_bs_ind := l_top_bs_ind - 1;
13034 
13035              IF TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) >= l_top_bs_tbl(l_top_bs_ind  ).DATE_START
13036               AND TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) <= l_top_bs_tbl(l_top_bs_ind ).DATE_end THEN
13037 
13038                   NULL;
13039              ELSE
13040                  l_top_bs_ind := l_top_bs_ind + 1;
13041              END IF;
13042 
13043             elsif TRUNC(l_cp_bs_tbl(l_cp_bs_ind).date_start) = TRUNC(l_top_bs_tbl(l_top_bs_ind).DATE_START) THEN
13044                NULL;
13045 
13046            end if;
13047 
13048 
13049            FOR l_cp_bs_ind IN l_cp_bs_tbl.FIRST .. l_cp_bs_tbl.LAST
13050            LOOP
13051               IF ((p_from_ste_code = 'ENTERED' ) AND (p_to_ste_code = 'CANCELLED')) then
13052                 l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) - nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
13053              ElsIf ((p_from_ste_code = 'CANCELLED' ) AND (p_to_ste_code = 'ENTERED')) then
13054                 l_top_bs_tbl(l_top_bs_ind).amount := nvl(l_top_bs_tbl(l_top_bs_ind).amount,0) + nvl(l_cp_bs_tbl(l_cp_bs_ind).amount,0);
13055               End if;
13056                 l_top_bs_ind  := l_top_bs_ind + 1;
13057            END LOOP;
13058 
13059            OKS_BILL_LEVEL_ELEMENTS_PVT.update_row(
13060                        p_api_version                  => l_api_version,
13061                        p_init_msg_list                => l_init_msg_list,
13062                        x_return_status                => x_return_status,
13063                        x_msg_count                    => l_msg_count,
13064                        x_msg_data                     => l_msg_data,
13065                        p_letv_tbl                     => l_top_bs_tbl,
13066                        x_letv_tbl                     => l_lvl_ele_tbl_out);
13067 
13068              IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
13069                 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
13070              ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
13071                 RAISE OKC_API.G_EXCEPTION_ERROR;
13072              END IF;
13073 
13074           END IF;          ---l_cp_bs_tbl.COUNT > 0
13075 
13076 
13077         END IF;      ---l_bill_type = 'T'
13078 
13079 END Sts_change_subline_lvl_rule;
13080 
13081 /*Added for ER 16039680*/
13082 FUNCTION round_quantity(f_target_qty IN NUMBER )
13083 RETURN NUMBER
13084 IS
13085 l_round_quantity NUMBER;
13086 BEGIN
13087 SELECT (f_target_qty - f_target_qty) INTO l_round_quantity FROM DUAL ;
13088 RETURN l_round_quantity;
13089 END round_quantity;
13090 
13091 PROCEDURE Get_Billed_Amount(p_start_date IN Date,
13092                            p_end_date   IN Date,
13093                            p_total_amount IN NUMBER,
13094                            p_item_type    IN VARCHAR2,
13095                            p_org_id       IN NUMBER,
13096                            p_billingprofile_id   IN     NUMBER,
13097                            p_currency_code IN VARCHAR2,
13098                            p_substemplate_id IN NUMBER DEFAULT NULL,
13099                            x_bill_amount OUT NOCOPY NUMBER,
13100                            x_bill_enddate OUT NOCOPY DATE
13101                            )
13102 
13103 IS
13104 
13105 l_constant_sll_amt  number;
13106 l_return_status  varchar2(10);
13107 l_tce_code  VARCHAR2(100);
13108 l_uom_quantity NUMBER;
13109 l_remaining_amt  NUMBER;
13110 l_fnd_lvl_in_rec          oks_bill_util_pub.bill_det_inp_rec;
13111 l_fnd_lvl_out_rec         oks_bill_util_pub.bill_sch_rec;
13112 Strm_Start_Date   DATE;
13113 l_quantity   NUMBER;
13114 l_lvl_amt  NUMBER;
13115 --l_adjusted_amt NUMBER;
13116 l_msg_count NUMBER;
13117 l_msg_data VARCHAR2(2000);
13118 l_period_type  VARCHAR2(100) :=NULL;
13119 l_period_start VARCHAR2(100) :=NULL;
13120 l_price_uom VARCHAR2(100) :=NULL;
13121 l_period_freq  NUMBER;
13122 --p_item_type varchar2(100);
13123 l_timeunit varchar2(100);
13124 l_level_periods  NUMBER;
13125 l_target_qty NUMBER;
13126 r_target_qty NUMBER;
13127 l_unit_price  NUMBER;
13128 l_source_unit_price  NUMBER;
13129 l_uom varchar2(100);
13130 l_dur number;
13131 
13132  CURSOR l_billing_profile_csr(l_billing_profile_id NUMBER) IS
13133        SELECT BILLING_LEVEL,
13134             BILLING_TYPE,
13135             INTERVAL,
13136             INTERFACE_OFFSET,
13137             INVOICE_OFFSET,
13138             INVOICE_OBJECT1_ID1,
13139             ACCOUNT_OBJECT1_ID1
13140        FROM   OKS_BILLING_PROFILES_V
13141        WHERE  ID = l_billing_profile_Id;
13142        --l_return_status              VARCHAR2(200);
13143        l_billing_profile_Csr_Rec    l_billing_profile_csr%Rowtype;
13144        l_start_date                 Date;
13145        l_end_date                   Date;
13146        l_billing_profile_id         NUMBER;
13147        l_duration                   NUMBER := 0;
13148        --l_timeunit                   VARCHAR2(10);
13149        l_source_uom                 VARCHAR2(100) := NULL;
13150        p_billing_type varchar2(100);
13151        l_org_id NUMBER;
13152        l_tangible Boolean := FALSE;
13153        l_pricing_method varchar2(100);
13154 /*Added for bug 16293821 */
13155 Function is_tangible
13156                ( p_id        IN  NUMBER
13157                ) Return BOOLEAN IS
13158     Cursor subs_hdr Is
13159     Select item_type From oks_subscr_header_b Where id = p_id;
13160     l_type     Varchar2(240);
13161     l_tangible Boolean := FALSE;
13162   Begin
13163     Open subs_hdr;
13164     Fetch subs_hdr into l_type;
13165     IF l_type like '%T' THEN
13166       l_tangible := TRUE;
13167     END IF;
13168     Close subs_hdr;
13169     Return l_tangible;
13170   Exception
13171     When others then
13172       Return l_tangible;
13173   End is_tangible;
13174 /*Added for bug 16293821 */
13175 BEGIN
13176 
13177 l_start_date :=p_start_date;
13178 l_end_date :=p_end_date;
13179 l_org_id :=p_org_id;  /*Added for bug 16293821 */
13180 
13181 /*Added for bug 16293821 */
13182 If p_start_date is null or p_end_date is null or p_total_amount is null then
13183 RAISE G_EXCEPTION_HALT_VALIDATION;
13184 End if;
13185 
13186 oks_renew_util_pub.get_period_defaults
13187                                  (p_hdr_id             => NULL,
13188                                   p_org_id             => l_org_id,
13189                                   x_period_type        => l_period_type,
13190                                   x_period_start       => l_period_start,
13191                                   x_price_uom          => l_price_uom,
13192                                   x_return_status      => l_return_status
13193                                  );
13194 
13195  IF l_period_start IS NOT NULL AND
13196       l_period_type IS NOT NULL
13197    THEN
13198      IF p_item_type = 'SUBSCRIPTION' THEN
13199        --mchoudha fix for bug#5183011
13200        l_tangible  := OKS_SUBSCRIPTION_PUB.is_subs_tangible (p_substemplate_id);
13201        IF l_tangible THEN
13202          l_period_start := NULL;
13203          l_period_type := NULL;
13204        ELSE
13205          l_pricing_method :=FND_PROFILE.value('OKS_SUBS_PRICING_METHOD');
13206          IF nvl(l_pricing_method,'SUBSCRIPTION') <> 'EFFECTIVITY' THEN
13207            l_period_start := NULL;
13208            l_period_type := NULL;
13209          ELSE
13210            l_period_start := 'SERVICE';
13211          END IF;   -- l_pricing_method <> 'EFFECTIVITY'
13212        END IF;     -- IF l_tangible THEN
13213     ELSE
13214      l_period_start := 'SERVICE';
13215      END IF;       -- IF p_item_type = 'SUBSCRIPTION'
13216    END IF;
13217 
13218 /*Added for bug 16293821 */
13219 
13220 /* Commented for bug 16293821
13221 If p_item_type <> 'TANGIBLE' then
13222   p_period_type :=NULL  ;
13223   p_period_start :='SERVICE';
13224 End If;
13225 */
13226 
13227  If p_item_type ='SERVICE' then
13228  p_billing_type :='T';
13229  else
13230  p_billing_type :='E';
13231  end if;
13232 
13233 
13234 --dbms_output.put_line('l_billing_profile_Csr_Rec.BILLING_TYPE - '||p_billingprofile_id);
13235 
13236   If p_billingprofile_id is not null then
13237 
13238        OPEN  l_billing_profile_csr(p_billingprofile_id);
13239        FETCH l_billing_profile_csr INTO l_billing_profile_Csr_Rec;
13240        CLOSE l_billing_profile_csr;
13241 
13242        --dbms_output.put_line('l_billing_profile_Csr_Rec.BILLING_TYPE - '||l_billing_profile_Csr_Rec.BILLING_TYPE);
13243     IF l_billing_profile_Csr_Rec.BILLING_TYPE = 'ONETIME' THEN
13244 
13245            l_level_periods := 1;
13246            OKC_TIME_UTIL_PUB.get_duration(
13247                              p_start_date    => l_start_date
13248                            , p_end_date      => l_end_date
13249                            , x_duration      => l_duration
13250                            , x_timeunit      => l_timeunit
13251                            , x_return_status => l_return_status);
13252     ELSE
13253       IF l_billing_profile_Csr_Rec.BILLING_TYPE = 'RECURRING' THEN
13254 
13255           --dbms_output.put_line('l_billing_profile_Csr_Rec.interval - '||l_billing_profile_Csr_Rec.interval);
13256 
13257           l_target_qty := OKS_TIME_MEASURES_PUB.get_quantity(
13258                             l_start_date
13259                           , l_end_date
13260                           , l_billing_profile_Csr_Rec.interval);
13261 
13262           --dbms_output.put_line('l_target_qty - '||l_target_qty);
13263 
13264           r_target_qty := round_quantity( f_target_qty => l_target_qty);
13265           IF r_target_qty = 0 THEN  -- i.e get_quantity returns a whole number
13266             -- added function ceil to the variable l_target_qty for bug 3497141
13267             l_level_periods    := ceil(l_target_qty);
13268             l_duration           := 1; --UOM/PERIOD
13269             l_timeunit           := l_billing_profile_Csr_Rec.interval; -- UOM
13270 
13271           ELSE
13272            l_level_periods := 1;
13273            OKC_TIME_UTIL_PUB.get_duration(
13274                              p_start_date    => l_start_date
13275                            , p_end_date      => l_end_date
13276                            , x_duration      => l_duration
13277                            , x_timeunit      => l_timeunit
13278                            , x_return_status => l_return_status);
13279           END IF;
13280       END IF;
13281     END IF;
13282   END IF;
13283 
13284 
13285             OKS_BILL_UTIL_PUB.get_seeded_timeunit(
13286                 p_timeunit      => l_timeunit,
13287                 x_return_status => l_return_status,
13288                 x_quantity      => l_uom_quantity ,
13289                 x_timeunit      => l_tce_code);
13290 
13291            IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
13292               RAISE G_EXCEPTION_HALT_VALIDATION;
13293            END IF;
13294 
13295 
13296           l_remaining_amt := p_total_amount;
13297 
13298            -------------------------------------------------------------------------
13299            -- Begin partial period computation logic
13300            -- Developer Mani Choudhary
13301            -- Date 17-MAY-2005
13302            -- get the converted unit price per SLL UOM derived from the unit price stored at the
13303            -- subline.
13304            -------------------------------------------------------------------------
13305 
13306 
13307 IF l_period_start is not null  AND l_period_type is not null THEN
13308 
13309        /*    Commented for bug 16293821
13310 
13311    l_constant_sll_amt := OKS_BILL_SCH.Get_Unit_Price_Per_Uom
13312                                                       (Null,
13313                                                        l_timeunit,
13314                                                        p_period_start,
13315                                                        p_period_type,
13316                                                        l_duration,
13317                                                        l_end_date,
13318                                                        NULL);    */
13319 
13320 /*Added for bug 16293821 */
13321 
13322 okc_time_util_pub.get_duration(p_start_date,p_end_date,l_dur,l_uom,l_return_status);
13323 
13324         l_dur := OKS_TIME_MEASURES_PUB.get_quantity (
13325                                                         p_start_date   => p_start_date,
13326                                                         p_end_date     => p_end_date,
13327                                                         p_source_uom   => l_uom,
13328                                                         p_period_type  => l_period_type,
13329                                                         p_period_start => l_period_start
13330                                                         );
13331         l_source_unit_price := p_total_amount /l_dur;
13332 
13333  IF l_uom <> l_timeunit THEN
13334         l_unit_price := OKS_BILL_SCH.Get_Converted_price(
13335                                             p_price_uom        => l_timeunit,
13336                                             p_pl_uom               =>l_uom,
13337                                             p_period_start     =>l_period_start,
13338                                             p_period_type      =>l_period_type,
13339                                             p_price_negotiated =>p_total_amount,
13340                                             p_unit_price       =>l_source_unit_price,
13341                                             p_start_date       =>p_start_date,
13342                                             p_end_date         =>p_end_date
13343                                             );
13344         IF l_unit_price is NULL THEN
13345           RAISE G_EXCEPTION_HALT_VALIDATION;
13346         END IF;
13347 ELSE
13348         l_unit_price := l_source_unit_price;
13349 END IF;
13350 
13351 l_constant_sll_amt  :=nvl(l_unit_price*l_duration,0);
13352 
13353 /*Added for bug 16293821 */
13354 
13355 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13356                  fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13357                        'after calling OKS_BILL_SCH.Get_Unit_Price_Per_Uom  '
13358                      ||' result l_constant_sll_amt = ' || l_constant_sll_amt);
13359 END IF;
13360 IF l_constant_sll_amt IS NULL THEN
13361                 l_return_status := G_RET_STS_ERROR;
13362                 RAISE G_EXCEPTION_HALT_VALIDATION;
13363 END IF;
13364 
13365 ELSE
13366 /*Added for bug 16685173 */
13367  IF p_item_type = 'SUBSCRIPTION' then
13368  l_constant_sll_amt := ( p_total_amount /nvl(l_level_periods,1));
13369  l_constant_sll_amt := OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_constant_sll_amt, p_currency_code);
13370 
13371  IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13372                  fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Constant_sll_Amount',
13373                        ' Get_Constant_sll_Amount  for subscription '
13374                      ||'  l_constant_sll_amt = ' || l_constant_sll_amt);
13375  END IF;
13376 
13377  ELSE
13378    /*Added for bug 16685173 */
13379  	Get_Constant_sll_Amount(
13380                                  p_line_start_date       =>trunc(to_date(p_start_date)),
13381                                  p_line_end_date         => trunc(to_date(p_end_date)),
13382                                  p_cycle_start_date      => trunc(to_date(p_start_date)),
13383                                  p_remaining_amount      => p_total_amount,
13384                                  P_uom_quantity          => l_uom_quantity,
13385                                  P_tce_code              => l_tce_code,
13386                                  x_constant_sll_amt      => l_constant_sll_amt,
13387                                  x_return_status         => l_return_status);
13388  IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13389                  fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Constant_sll_Amount',
13390                        ' Get_Constant_sll_Amount  '
13391                      ||'  l_constant_sll_amt = ' || l_constant_sll_amt);
13392           END IF;
13393 END IF;  /*Added for bug 16685173 */
13394 END IF;
13395 
13396           l_fnd_lvl_in_rec.line_start_date           := trunc(to_date(p_start_date));
13397           l_fnd_lvl_in_rec.line_end_date             := trunc(to_date(p_end_date));
13398           l_fnd_lvl_in_rec.cycle_start_date          := trunc(to_date(p_start_date));
13399           l_fnd_lvl_in_rec.tuom_per_period           :=l_duration;
13400           l_fnd_lvl_in_rec.tuom                      := l_timeunit;
13401           l_fnd_lvl_in_rec.bill_type                 := p_billing_type;
13402           l_fnd_lvl_in_rec.total_amount              := p_total_amount ;
13403           l_fnd_lvl_in_rec.invoice_offset_days       := l_billing_profile_Csr_Rec.invoice_offset;
13404           l_fnd_lvl_in_rec.interface_offset_days     := l_billing_profile_Csr_Rec.Interface_offset;
13405           l_fnd_lvl_in_rec.uom_per_period            := l_level_periods;
13406 
13407          IF fnd_log.level_procedure >= fnd_log.g_current_runtime_level THEN
13408              fnd_log.string(fnd_log.level_procedure,G_MODULE_CURRENT||'.Get_Billed_Amount',
13409                        'Calling oks_bill_util_pub.Get_next_bill_sch with parameters '
13410                        ||'period start = ' || l_period_start
13411                        ||', period type = ' || l_period_type);
13412           END IF;
13413 
13414           --Dbms_Output.put_line('l_fnd_lvl_in_rec.line_start_date - '||l_fnd_lvl_in_rec.line_start_date);
13415 
13416           OKS_BILL_UTIL_PUB.Get_next_bill_sch
13417               (p_api_version             => l_api_version,
13418                x_return_status           => l_return_status,
13419                x_msg_count               => l_msg_count,
13420                x_msg_data                => l_msg_data,
13421                p_invoicing_rule_id       => l_billing_profile_Csr_Rec.INVOICE_OBJECT1_ID1,
13422                p_bill_sch_detail_rec     => l_fnd_lvl_in_rec,
13423                x_bill_sch_detail_rec     => l_fnd_lvl_out_rec,
13424                p_period_start            => l_period_start,
13425                p_period_type             => l_period_type,
13426                Strm_Start_Date           => trunc(to_date(p_start_date)));
13427 
13428 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13429                                fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13430                               'after calling OKS_TIME_MEASURES_PUB.get_quantity  with period start '||l_period_start||' ,l_period_type '||l_period_type
13431                                ||' l_fnd_lvl_out_rec.next_cycle_date = ' || l_fnd_lvl_out_rec.next_cycle_date);
13432 END IF;
13433 
13434 
13435 IF p_billing_type = 'T' then
13436 IF l_period_start is not null   AND l_period_type is not null THEN
13437 /* Commented for bug 16293821 as contracts created from OM will always have period_start as SERVICE and no partial period at beginning of schedule
13438 
13439 IF TRUNC(l_fnd_lvl_out_rec.next_cycle_date) > trunc(to_date(p_start_date)) THEN
13440 IF l_tce_code not in ('DAY','HOUR','MINUTE') THEN
13441 l_quantity:= OKS_TIME_MEASURES_PUB.get_quantity
13442                                            (p_start_date   => trunc(to_date(p_start_date)),
13443                                             p_end_date     => TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-1,
13444                                             p_source_uom   => l_fnd_lvl_in_rec.tuom,--nvl(p_SubLine_rec.cp_price_uom,l_uom), --line price uom
13445                                             p_period_type  => l_period_type ,
13446                                             p_period_start => l_period_start);
13447 
13448 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13449                                fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13450                               'after calling OKS_TIME_MEASURES_PUB.get_quantity  with period start '||l_period_start||' ,l_period_type '||l_period_type
13451                                ||' result l_quantity = ' || l_quantity);
13452 END IF;
13453 
13454 IF nvl(l_quantity,0) = 0 THEN
13455 l_return_status := G_RET_STS_ERROR;
13456 RAISE G_EXCEPTION_HALT_VALIDATION;
13457 END IF;
13458 l_lvl_amt :=  nvl(l_constant_sll_amt*l_quantity/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
13459 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13460                                fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13461                                ' result l_lvl_amt = ' || l_lvl_amt);
13462 END IF;                     --mchoudha added else logic for WEEK kind of uoms
13463 ELSE
13464 l_lvl_amt := nvl(l_constant_sll_amt*((TRUNC(l_fnd_lvl_out_rec.next_cycle_date)-TRUNC(trunc(to_date(p_start_date))))/l_uom_quantity)/l_fnd_lvl_in_rec.uom_per_period,0); --bugfix 5485442
13465 END IF;
13466 ELSE
13467 */
13468 l_lvl_amt :=  nvl(l_constant_sll_amt,0);
13469 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13470                                        fnd_log.string(fnd_log.level_statement,G_MODULE_CURRENT||'.Get_Billed_Amount',
13471                                       '  l_lvl_amt = ' || l_lvl_amt);
13472 END IF;
13473 ELSE
13474 
13475                       Get_Period_Frequency(p_line_start_date => trunc(to_date(p_start_date)),
13476                               p_line_end_date         => trunc(to_date(p_end_date)),
13477                               p_cycle_start_date      => trunc(to_date(p_start_date)),
13478                               p_next_billing_date     => trunc(l_fnd_lvl_out_rec.next_cycle_date),
13479                               P_uom_quantity          => l_uom_quantity,
13480                               P_tce_code              => l_tce_code,
13481                               p_uom_per_period        => l_duration,
13482                               x_period_freq           => l_period_freq,
13483                               x_return_status         => l_return_status);
13484 
13485 
13486                          -----errorout_ad('Get_Period_Frequency = ' || l_return_status);
13487                       IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
13488                          RAISE G_EXCEPTION_HALT_VALIDATION;
13489                       END IF;
13490 
13491                       l_lvl_amt := (NVL(l_period_freq,0) * NVL(l_constant_sll_amt,0) );
13492 END IF;
13493 ELSE
13494  l_lvl_amt :=  Nvl(l_constant_sll_amt,0);
13495 END IF;
13496 
13497 --dbms_output.put_line('l_constant_sll_amt - '||l_lvl_amt);
13498 
13499 x_bill_amount :=OKS_EXTWAR_UTIL_PVT.round_currency_amt(l_lvl_amt,p_currency_code);
13500 x_bill_enddate :=TRUNC(l_fnd_lvl_out_rec.next_cycle_date) - 1;
13501 
13502 /*Added for bug 16685173 */
13503 if (x_bill_enddate > p_end_date) then
13504 x_bill_enddate := p_end_date;
13505 end if;
13506 /*Added for bug 16685173 */
13507 
13508 --dbms_output.put_line('l_constant_sll_amt - '||l_lvl_amt);
13509 --dbms_output.put_line('x_bill_enddate - '||x_bill_enddate);
13510 EXCEPTION
13511 
13512  WHEN G_EXCEPTION_HALT_VALIDATION THEN
13513 
13514   IF FND_LOG.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level THEN
13515         fnd_log.string(fnd_log.level_exception,G_MODULE_CURRENT||'.Get_Billed_Amount.EXCEPTION',
13516                     'G_EXCEPTION_HALT_VALIDATION');
13517   END IF;
13518 
13519   x_bill_amount := NULL;
13520   x_bill_enddate := NULL;
13521 
13522  WHEN OTHERS THEN
13523 
13524    IF FND_LOG.LEVEL_UNEXPECTED >= fnd_log.g_current_runtime_level THEN
13525         fnd_log.string(fnd_log.level_unexpected,G_MODULE_CURRENT||'.Get_Billed_Amount.UNEXPECTED',
13526                                 'sqlcode = '||sqlcode||', sqlerrm = '||sqlerrm);
13527    END IF;
13528    x_bill_amount := NULL;
13529    x_bill_enddate := NULL;
13530    OKC_API.SET_MESSAGE(p_app_name     => G_APP_NAME_OKC,
13531                        p_msg_name     => G_UNEXPECTED_ERROR,
13532                        p_token1       => G_SQLCODE_TOKEN,
13533                        p_token1_value => sqlcode,
13534                        p_token2       => G_SQLERRM_TOKEN,
13535                        p_token2_value => sqlerrm);
13536 
13537 end;
13538 
13539 /*Added for ER 16039680*/
13540 
13541 
13542 
13543 
13544 END OKS_BILL_SCH;