DBA Data[Home] [Help]

PACKAGE BODY: APPS.PN_SCHEDULES_ITEMS

Source


1 PACKAGE BODY  pn_schedules_items AS
2   -- $Header: PNSCHITB.pls 120.40.12010000.11 2009/02/20 14:06:39 acprakas ship $
3 
4 -------------------------------------------------------------------------------
5 -- This is the MAIN procedure in this Package.
6 -- It's referenced in the Concurrent Program executable definition - PNSCHITM
7 -- It calls all the other procedures in this Package.
8 --
9 -- Args:
10 --   errbuf:           Needed for all PL/SQL Concurrent Programs
11 --   retcode:          Needed for all PL/SQL Concurrent Programs
12 --   p_lease_id:       The Lease Id
13 --   p_lease_context:  The Lease Context (one of - ABS, EXP, CON, ADD)
14 --   p_called_from:    Called from Main, Index or Variable Rent (MAIN,IND,VAR)
15 --   p_term_id:        Payment Term Id
16 --   p_term_end_dt:    Payment Term End Date
17 -------------------------------------------------------------------------------
18 
19 --------------------------------------------------------------------------------------------
20 --  CURSOR     : lease_con_cur_mini_retro
21 --  DESCRIPTION: This cursor fetches Payment Term related information for a lease when
22 --               the lease is contracted or expanded.
23 --  02-AUG-2005  piagrawa    o Created.
24 --  05-JAN-2007  Hareesha    o Bug 5742863 Removed index_period_id is null condition
25 --                             to consider RI terms too for contraction
26 --------------------------------------------------------------------------------------------
27    CURSOR lease_con_cur_mini_retro (p_lease_id NUMBER, p_active_lease_change_id NUMBER) IS
28 
29       SELECT ppt.payment_term_id,
30              ppt.lease_change_id,
31              ppt.schedule_day,
32              ppt.start_date,
33              ppt.end_date,
34              ppt.target_date,
35              ppt.frequency_code,
36              ppt.normalize,
37              ppt.actual_amount,
38              ppt.estimated_amount,
39              ppt.payment_term_type_code,
40              ppt.vendor_id,
41              ppt.vendor_site_id,
42              ppt.customer_id,
43              ppt.customer_site_use_id,
44              ppt.cust_ship_site_id,
45              ppt.set_of_books_id,
46              ppt.currency_code,
47              ppt.rate,
48              ppt.index_period_id,
49              ppt.norm_start_date
50       FROM   pn_payment_terms_all ppt
51       WHERE  ppt.lease_id = p_lease_id
52       AND    ppt.var_rent_inv_id IS NULL
53       AND    ppt.period_billrec_id IS NULL
54       AND    EXISTS (SELECT NULL
55                      FROM   pn_payment_items_all ppi
56                      WHERE  ppt.lease_id = p_lease_id
57                      AND    ppi.payment_term_id = ppt.payment_term_id)
58       UNION
59       SELECT ppt.payment_term_id,
60              ppt.lease_change_id,
61              ppt.schedule_day,
62              ppt.start_date,
63              ppt.end_date,
64              ppt.target_date,
65              ppt.frequency_code,
66              ppt.normalize,
67              ppt.actual_amount,
68              ppt.estimated_amount,
69              ppt.payment_term_type_code,
70              ppt.vendor_id,
71              ppt.vendor_site_id,
72              ppt.customer_id,
73              ppt.customer_site_use_id,
74              ppt.cust_ship_site_id,
75              ppt.set_of_books_id,
76              ppt.currency_code,
77              ppt.rate,
78              ppt.index_period_id,
79              ppt.norm_start_date
80       FROM   pn_payment_terms_all ppt
81       WHERE  ppt.lease_id = p_lease_id
82       AND    ppt.index_period_id IS NOT NULL
83       AND    ppt.status = 'APPROVED'
84       AND    ppt.index_term_indicator NOT IN ('BACKBILL','ATLEAST-BACKBILL')
85       AND    EXISTS (SELECT NULL
86                      FROM   pn_payment_items_all ppi
87                      WHERE  ppt.lease_id = p_lease_id
88                      AND    ppi.payment_term_id = ppt.payment_term_id);
89 
90 
91 --------------------------------------------------------------------------------------------
92 --  CURSOR     : payment_term_con_cur_retro
93 --  DESCRIPTION: This cursor fetches Payment Term related information for a lease when
94 --               when a Payment Term is contracted.
95 --  02-AUG-2005  piagrawa o Created.
96 --------------------------------------------------------------------------------------------
97    CURSOR payment_term_con_cur_retro (p_lease_id NUMBER,
98                                       p_payment_term_id NUMBER) IS
99 
100       SELECT ppt.payment_term_id,
101              ppt.lease_change_id,
102              ppt.schedule_day,
103              ppt.start_date,
104              ppt.end_date,
105              ppt.target_date,
106              ppt.frequency_code,
107              ppt.normalize,
108              ppt.actual_amount,
109              ppt.estimated_amount,
110              ppt.payment_term_type_code,
111              ppt.vendor_id,
112              ppt.vendor_site_id,
113              ppt.customer_id,
114              ppt.customer_site_use_id,
115              ppt.cust_ship_site_id,
116              ppt.set_of_books_id,
117              ppt.currency_code,
118              ppt.rate,
119              ppt.norm_start_date,
120              ppt.norm_end_date
121       FROM   pn_payment_terms_all ppt
122       WHERE  ppt.lease_id = p_lease_id
123       AND    ppt.payment_term_id = p_payment_term_id
124       AND    EXISTS (SELECT NULL
125                      FROM   pn_payment_items_all ppi
126                      WHERE  ppt.lease_id = p_lease_id
127                      AND    ppi.payment_term_id = ppt.payment_term_id)
128       FOR UPDATE;
129 
130 --------------------------------------------------------------------------------------------
131 --  CURSOR     : TERM_CON_EXP_CUR
132 --  DESCRIPTION: This cursor fetches Payment Term related information for a lease when
133 --               the lease is contracted or expanded.
134 --  25-JUN-2001  Mrinal Misra    o Created.
135 --               Mrinal Misra    o Added ppt.var_rent_inv_id IS NULL  for Var. rent addn.
136 --  26-APR-2002  modified  ftanudja   o added ppt.rate
137 --  10-DEC-2002  graghuna        o Added parameter p_active_lease_change_id for Month-to-
138 --                                 Month Re-Normalization issue. --MTM-I
139 --  29-AUG-2003  Satish Tripathi o Fixed for BUG# 3116986, added period_billrec_id IS NULL
140 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Added lease_change_id in SELECT.
141 --  18-APR-07    sdmahesh          Bug # 5985779. Enhancement for new profile
142 --                                 option for lease early termination
143 --------------------------------------------------------------------------------------------
144    CURSOR term_con_exp_cur (p_lease_id NUMBER, p_active_lease_change_id NUMBER) IS
145 
146       SELECT ppt.payment_term_id,
147              ppt.lease_change_id,
148              ppt.schedule_day,
149              ppt.start_date,
150              ppt.end_date,
151              ppt.target_date,
152              ppt.frequency_code,
153              ppt.normalize,
154              ppt.actual_amount,
155              ppt.estimated_amount,
156              ppt.payment_term_type_code,
157              ppt.vendor_id,
158              ppt.vendor_site_id,
159              ppt.customer_id,
160              ppt.customer_site_use_id,
161              ppt.cust_ship_site_id,
162              ppt.set_of_books_id,
163              ppt.currency_code,
164              ppt.rate,
165              ppt.index_period_id,
166              ppt.norm_start_date
167       FROM   pn_payment_terms_all ppt
168       WHERE  ppt.lease_id = p_lease_id
169       AND    NVL(ppt.normalize,'N') = 'Y'
170       AND    NVL(ppt.status,'APPROVED') = 'APPROVED'
171       AND    EXISTS (SELECT NULL
172                      FROM   pn_payment_items_all ppi
173                      WHERE  ppt.lease_id = p_lease_id
174                      AND    ppi.payment_term_id = ppt.payment_term_id);
175 
176 --------------------------------------------------------------------------------------------
177 --  CURSOR     : TERM_EXP_CUR
178 --  DESCRIPTION: This cursor fetches Payment Term related information for a lease when
179 --               the lease is expanded.
180 --  17-JAN-06  piagrawa  o Bug#4931780 Created.
181 --  22-SEP-08  jsundara  o Bug#6699877 Modified the cursor TERM_EXP_CUR to add null
182 --                         handling for norm_end_date.
183 --------------------------------------------------------------------------------------------
184    CURSOR TERM_EXP_CUR ( p_lease_id NUMBER
185                        , p_active_lease_change_id NUMBER
186                        , p_cutoff_date DATE) IS
187 
188       SELECT ppt.payment_term_id,
189              ppt.lease_change_id,
190              ppt.schedule_day,
191              ppt.start_date,
192              ppt.end_date,
193              ppt.target_date,
194              ppt.frequency_code,
195              ppt.normalize,
196              ppt.actual_amount,
197              ppt.estimated_amount,
198              ppt.payment_term_type_code,
199              ppt.vendor_id,
200              ppt.vendor_site_id,
201              ppt.customer_id,
202              ppt.customer_site_use_id,
203              ppt.cust_ship_site_id,
204              ppt.set_of_books_id,
205              ppt.currency_code,
206              ppt.rate,
207              ppt.index_period_id,
208              ppt.norm_start_date
209       FROM   pn_payment_terms_all ppt
210       WHERE  ppt.lease_id = p_lease_id
211       AND    ppt.var_rent_inv_id IS NULL
212       AND    ppt.period_billrec_id IS NULL
213       AND    (NVL(ppt.normalize,'N') = 'Y' AND NVL(ppt.norm_end_date, ppt.end_date) > p_cutoff_date) /* 6699877 */
214       AND    EXISTS (SELECT NULL
215                      FROM   pn_payment_items_all ppi
216                      WHERE  ppt.lease_id = p_lease_id
217                      AND    ppi.payment_term_id = ppt.payment_term_id)
218       UNION
219       SELECT ppt.payment_term_id,
220              ppt.lease_change_id,
221              ppt.schedule_day,
222              ppt.start_date,
223              ppt.end_date,
224              ppt.target_date,
225              ppt.frequency_code,
226              ppt.normalize,
227              ppt.actual_amount,
228              ppt.estimated_amount,
229              ppt.payment_term_type_code,
230              ppt.vendor_id,
231              ppt.vendor_site_id,
232              ppt.customer_id,
233              ppt.customer_site_use_id,
234              ppt.cust_ship_site_id,
235              ppt.set_of_books_id,
236              ppt.currency_code,
237              ppt.rate,
238              ppt.index_period_id,
239              ppt.norm_start_date
240       FROM   pn_payment_terms_all ppt
241       WHERE  ppt.lease_id = p_lease_id
242       AND    ppt.index_period_id IS NOT NULL
243       AND    ppt.status = 'APPROVED'
244       AND    ppt.index_term_indicator NOT IN ('BACKBILL','ATLEAST-BACKBILL')
245       AND    (( ppt.normalize = 'Y' AND NVL(ppt.norm_end_date, ppt.end_date) > p_cutoff_date) OR
246               ( NVL(ppt.normalize,'N') = 'N' AND ppt.end_date > p_cutoff_date))
247       AND    EXISTS (SELECT NULL
248                      FROM   pn_payment_items_all ppi
249                      WHERE  ppt.lease_id = p_lease_id
250                      AND    ppi.payment_term_id = ppt.payment_term_id);
251 
252 --------------------------------------------------------------------------------------------
253 --  CURSOR     : TERM_ADD_MAIN_CUR
254 --  DESCRIPTION: This cursor fetches Payment Term related information for a lease when
255 --               the a payment Term is added from Main Lease.
256 --  25-JUN-2001  Mrinal Misra    o Created.
257 --               Mrinal Misra    o Added ppt.var_rent_inv_id IS NULL  for Var. rent addn.
258 --               Mrinal Misra    o Added ppt.index_period_id IS NULL  Check for Variable Rent.
259 --  26-APR-2002  modified  ftanudja  o added attribute ppt.rate
260 --  29-AUG-2003  Satish Tripathi o Fixed for BUG# 3116986, added period_billrec_id IS NULL
261 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Added lease_change_id in SELECT,
262 --                                 Joined with pn_lease_changes to get change_type_lookup_code
263 --                                 and change_commencement_date.
264 --  21-OCT-2004 vmmehta          o Bug# 3936944. Added condition chnage_type_lookup_code in edit/amend
265 --------------------------------------------------------------------------------------------
266    CURSOR term_add_main_cur (p_lease_id NUMBER) IS
267 
268       SELECT ppt.payment_term_id,
269              ppt.lease_change_id,
270              ppt.schedule_day,
271              ppt.start_date,
272              ppt.end_date,
273              ppt.target_date,
274              ppt.frequency_code,
275              ppt.normalize,
276              ppt.actual_amount,
277              ppt.estimated_amount,
278              ppt.payment_term_type_code,
279              ppt.vendor_id,
280              ppt.vendor_site_id,
281              ppt.customer_id,
282              ppt.customer_site_use_id,
283              ppt.cust_ship_site_id,
284              ppt.set_of_books_id,
285              ppt.currency_code,
286              ppt.rate,
287              ppt.norm_start_date,
288              plc.change_type_lookup_code,
289              plc.change_commencement_date
290       FROM   pn_payment_terms_all ppt,
291              pn_lease_changes_all plc
292       WHERE  ppt.lease_id = p_lease_id
293       AND    ppt.lease_change_id = plc.lease_change_id
294       AND    ppt.index_period_id IS NULL
295       AND    ppt.var_rent_inv_id IS NULL
296       AND    ppt.period_billrec_id IS NULL
297       AND   plc.change_type_lookup_code IN ('EDIT', 'AMEND')
298       AND NOT EXISTS (SELECT NULL
299                       FROM   pn_payment_items_all ppi
300                       WHERE  ppt.lease_id = p_lease_id
301                       AND    ppi.payment_term_id = ppt.payment_term_id);
302 
303 --------------------------------------------------------------------------------------------
304 --  CURSOR     : TERM_ADD_IND_VAR_CUR
305 --  DESCRIPTION: This cursor fetches Payment Term related information for a lease when
306 --               the a payment Term is added from Index Rent.
307 --  25-JUN-2001  Mrinal Misra    o Created.
308 --  26-APR-2002  ftanudja        o added attribute ppt.rate
309 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Added lease_change_id in SELECT.
310 --------------------------------------------------------------------------------------------
311    CURSOR term_add_ind_var_cur (p_lease_id NUMBER,
312                                 p_term_id  NUMBER)
313    IS
314 
315       SELECT ppt.payment_term_id,
316              ppt.lease_change_id,
317              ppt.schedule_day,
318              ppt.start_date,
319              ppt.end_date,
320              ppt.target_date,
321              ppt.frequency_code,
322              ppt.normalize,
323              ppt.actual_amount,
324              ppt.estimated_amount,
325              ppt.payment_term_type_code,
326              ppt.vendor_id,
327              ppt.vendor_site_id,
328              ppt.customer_id,
329              ppt.customer_site_use_id,
330              ppt.cust_ship_site_id,
331              ppt.set_of_books_id,
332              ppt.currency_code,
333              ppt.rate,
334              ppt.norm_start_date
335       FROM   pn_payment_terms_all ppt
336       WHERE  ppt.payment_term_id = p_term_id
337       AND NOT EXISTS (SELECT NULL
338                       FROM   pn_payment_items_all ppi
339                       WHERE  ppt.lease_id = p_lease_id
340                       AND    ppi.payment_term_id = p_term_id);
341 
342 --------------------------------------------------------------------------------------------
343 --  CURSOR     : TERM_ABS_CUR
344 --  DESCRIPTION: This cursor fetches Payment Term related information for a lease when
345 --               the lease is abstracted.
346 --  25-JUN-2001  Mrinal Misra    o Created.
347 --               Mrinal Misra    o Added ppt.var_rent_inv_id IS NULL  for Var. rent addn.
348 --  25-APR-2002  ftanudja  modified   o added attribute ppt.rate
349 --  29-AUG-2003  Satish Tripathi o Fixed for BUG# 3116986, added period_billrec_id IS NULL
350 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Added lease_change_id in SELECT.
351 --------------------------------------------------------------------------------------------
352    CURSOR term_abs_cur (p_lease_id NUMBER) IS
353 
354       SELECT ppt.payment_term_id,
355              ppt.lease_change_id,
356              ppt.schedule_day,
357              ppt.start_date,
358              ppt.end_date,
359              ppt.target_date,
360              ppt.frequency_code,
361              ppt.normalize,
362              ppt.actual_amount,
363              ppt.estimated_amount,
364              ppt.payment_term_type_code,
365              ppt.vendor_id,
366              ppt.vendor_site_id,
367              ppt.customer_id,
368              ppt.customer_site_use_id,
369              ppt.cust_ship_site_id,
370              ppt.set_of_books_id,
371              ppt.currency_code,
372              ppt.rate,
373              ppt.norm_start_date
374       FROM   pn_payment_terms_all ppt
375       WHERE  lease_id = p_lease_id
376       AND    ppt.index_period_id IS NULL
377       AND    ppt.var_rent_inv_id IS NULL
378       AND    ppt.period_billrec_id IS NULL
379       AND    NOT EXISTS (SELECT NULL
380                          FROM   pn_payment_items_all ppi
381                          WHERE  ppt.lease_id = p_lease_id
382                          AND    ppi.payment_term_id = ppt.payment_term_id);
383 
384 --------------------------------------------------------------------------------------------
385 --  CURSOR     : PAYMENT_TERM_CON_CUR
386 --  DESCRIPTION: This cursor fetches Payment Term related information for a lease when
387 --               when a Payment Term is contracted.
388 --  01-FEB-2002  Satish Tripathi o Created.
389 --  26-APR-2002  modified   ftanudja   o added ppt.rate
390 --  10-DEC-2002  graghuna        o Added ppt.norm_end_date for Month-to-Month
391 --                                 Re-Normalization issue. --MTM-I
392 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Added lease_change_id in SELECT.
393 --------------------------------------------------------------------------------------------
394    CURSOR payment_term_con_cur (p_lease_id NUMBER) IS
395 
396       SELECT ppt.payment_term_id,
397              ppt.lease_change_id,
398              ppt.schedule_day,
399              ppt.start_date,
400              ppt.end_date,
401              ppt.target_date,
402              ppt.frequency_code,
403              ppt.normalize,
404              ppt.actual_amount,
405              ppt.estimated_amount,
406              ppt.payment_term_type_code,
407              ppt.vendor_id,
408              ppt.vendor_site_id,
409              ppt.customer_id,
410              ppt.customer_site_use_id,
411              ppt.cust_ship_site_id,
412              ppt.set_of_books_id,
413              ppt.currency_code,
414              ppt.rate,
415              ppt.norm_start_date,
416              ppt.norm_end_date
417       FROM   pn_payment_terms_all ppt
418       WHERE  ppt.lease_id = p_lease_id
419       AND    ppt.changed_flag = 'Y'
420       AND    EXISTS (SELECT NULL
421                      FROM   pn_payment_items_all ppi
422                      WHERE  ppt.lease_id = p_lease_id
423                      AND    ppi.payment_term_id = ppt.payment_term_id)
424       FOR UPDATE;
425 
426 -- Retro Start
427    TYPE tab_number IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
428 
429    term_id_tab   tab_number;
430    l_index       NUMBER;
431 -- Retro End
432 
433 --------------------------------------------------------------------------------------------
434 --  FUNCTION   : FIRST_DAY
435 --  DESCRIPTION: This function returns Date with the First Day of the Month.
436 --  20-AUG-2001  Mrinal Misra    o Created.
437 --------------------------------------------------------------------------------------------
438 FUNCTION First_Day (p_Date DATE)
439 RETURN   DATE
440 IS
441 BEGIN
442 
443   RETURN TO_DATE(TO_CHAR(p_Date,'YYYY/MM'),'YYYY/MM');
444 
445 END First_Day;
446 
447 --------------------------------------------------------------------------------------------
448 --  FUNCTION   : GET_FREQUENCY
449 --  DESCRIPTION: This function returns numeric value of a given CHAR frequency code.
450 --               This numeric value is directly used in various calculations.
451 --  25-JUN-2001  Mrinal Misra    o Created.
452 --------------------------------------------------------------------------------------------
453 FUNCTION get_frequency (p_freq_code VARCHAR2)
454 RETURN   NUMBER
455 IS
456 BEGIN
457 
458       IF p_freq_code = 'MON' THEN
459 
460          RETURN 1;
461 
462       ELSIF p_freq_code = 'QTR' THEN
463 
464             RETURN 3;
465 
466       ELSIF p_freq_code = 'SA' THEN
467 
468             RETURN 6;
469 
470       ELSIF p_freq_code = 'YR' THEN
471 
472             RETURN 12;
473 
474       ELSIF p_freq_code = 'OT' THEN
475 
476             RETURN 1;
477 
478       END IF;
479 
480 END get_frequency;
481 
482 ------------------------------------------------------------------------
483 --  FUNCTION  :- GET_FIRST_ITEM_DATE
484 --  DESCRIPTION: This function returns the due date if 1st cash item.
485 --  24-MAR-2004  Satish Tripathi o Created for BUG# 3295405.
486 ------------------------------------------------------------------------
487 FUNCTION Get_First_Item_Date (p_payment_term_id IN NUMBER)
488 RETURN   DATE
489 IS
490 
491    l_first_due_date                DATE;
492    l_due_date                      DATE;
493 
494    CURSOR first_item_cursor IS
495       SELECT MIN(due_date)
496       FROM   pn_payment_items_all
497       WHERE  payment_term_id = p_payment_term_id
498       AND    payment_item_type_lookup_code = 'CASH';
499 
500 BEGIN
501    pnp_debug_pkg.log('Get_First_Item_Date (+) - p_payment_term_id: ' || p_payment_term_id);
502 
503    OPEN first_item_cursor;
504    FETCH first_item_cursor INTO l_first_due_date;
505    CLOSE first_item_cursor;
506 
507    l_due_date := First_Day(l_first_due_date);
508 
509    pnp_debug_pkg.log('Get_First_Item_Date (-) - l_due_date: ' || l_due_date);
510 
511    RETURN l_due_date;
512 
513 END Get_First_Item_Date;
514 
515 
516 ------------------------------------------------------------------------
517 --  FUNCTION  :- GET_NORM_END_DATE
518 --  27-OCT-2003  Satish Tripathi o Created for BUG# 3178064.
519 ------------------------------------------------------------------------
520 FUNCTION Get_Norm_End_Date (p_lease_id IN NUMBER)
521 RETURN   DATE
522 IS
523 
524    l_lease_termination_date        DATE;
525    l_act_lease_found               BOOLEAN := FALSE;
526 
527    CURSOR lease_dt_hist_cursor IS
528       SELECT lease_change_id, lease_termination_date, lease_status
529       FROM   pn_lease_details_history
530       WHERE  lease_id = p_lease_id
531       ORDER BY 1 DESC;
532 
533 BEGIN
534 
535     FOR lease_dt_hist_rec in lease_dt_hist_cursor
536     LOOP
537 
538         IF lease_dt_hist_rec.lease_status = 'ACT' THEN
539             l_lease_termination_date := lease_dt_hist_rec.lease_termination_date;
540             EXIT;
541         END IF;
542 
543     END LOOP;
544 
545     IF l_lease_termination_date IS NULL THEN
546        l_lease_termination_date := g_new_lea_term_dt;
547     END IF;
548 
549     RETURN l_lease_termination_date;
550 
551 END Get_Norm_End_Date;
552 
553 
554 -------------------------------------------------------------------------------
555 --  PROCEDURE  : GET_SCH_INFO
556 --  DESCRIPTION: This procedure retrives schedule information of a particular
557 --               Payment Term like total no of schedules, 1st schedule date,
558 --               freq, no of schedules to skip (counter) in EXP and normalization
559 --               start date. These are the initial information used to process
560 --               the term.
561 --  25-JUN-01  MMisra    o Created.
562 --  07-FEB-02  STripathi o Added added parameter p_norm_str_dt. Added condition for
563 --                         Lease Context ADDAMD to set correct p_norm_str_dt.
564 --  26-MAR-02  STripathi o Added parameter p_sch_str_dt to correctly initialize the
565 --                         Schedule-Start-Date for NON MONTHLY Payment Term.
566 --  15-JAN-03  STripathi o Fix for BUG# 2733862. Modified calculation of l_mths_for_sch
567 --                         from MONTHS_BETWEEN(p_term_end_dt, p_term_start_dt)
568 --                         to   MONTHS_BETWEEN(p_term_end_dt+1, p_term_start_dt).
569 --  12-AUG-03  KkHegde   o Fix for bug#3009793. Changed the logic for determining
570 --                         p_sch_str_dt to avoid creating invalid dates.
571 --  16-OCT-03  STripathi o Fix for BUG# 3201091. Added parameter p_amd_comm_dt,
572 --                         to use instead of g_amd_comm_dt.
573 --  15-MAR-06  piagrawa  o Bug 5085901 - Modified to calculate l_sch_end_dt
574 --                         taking care if the schedule date is last date of
575 --                          month.
576 --  04-OCT-06  acprakas  o Bug#5489570 - Modified cursor csr_last_app_sch to ignore
577 --                         schedule day, while selecting last approved schedule.
578 --  19_dec-08 acprakas   o Bug#7626665. Reverted the fix done in bug#5489570
579 --------------------------------------------------------------------------------
580 PROCEDURE get_sch_info (p_lease_context        VARCHAR2,
581                         p_normalize_flag       VARCHAR2,
582                         p_mths                 NUMBER,
583                         p_term_start_dt        DATE,
584                         p_term_end_dt          DATE,
585                         p_freq_code            VARCHAR2,
586                         p_sch_day              NUMBER,
587                         p_new_lea_comm_dt      DATE,
588                         p_new_lea_term_dt      DATE,
589                         p_old_lea_term_dt      DATE,
590                         p_no_sch           OUT NOCOPY NUMBER,
591                         p_freq             OUT NOCOPY NUMBER,
592                         p_counter          OUT NOCOPY NUMBER,
593                         p_sch_dt           OUT NOCOPY DATE,
594                         p_pro_sch_dt       OUT NOCOPY DATE,
595                         p_norm_str_dt   IN OUT NOCOPY DATE,
596                         p_sch_str_dt       OUT NOCOPY DATE,
597                         p_lease_id             NUMBER,
598                         p_term_id              NUMBER,
599                         p_amd_comm_dt          DATE DEFAULT NULL)
600 IS
601 
602    l_mths_for_sch                  NUMBER;
603    l_no_sch                        NUMBER;
604    l_lst_sch_dt                    DATE;
605    l_counter                       NUMBER := 0;
606    l_pay_status                    pn_payment_schedules.payment_status_lookup_code%TYPE;
607    l_norm_str_dt                   DATE;
608    l_first_draft_sch               DATE;
609    l_last_app_sch                  DATE;
610    l_comm_dt                       DATE;
611 
612    CURSOR lst_sch_dt_cur (p_term_id  NUMBER)
613    IS
614       SELECT MAX(pps.schedule_date), COUNT(pps.schedule_date)
615       FROM   pn_payment_schedules_all pps,
616              pn_payment_items_all ppi
617       WHERE  ppi.payment_term_id = p_term_id
618       AND    pps.payment_schedule_id = ppi.payment_schedule_id
619       AND    ppi.actual_amount <> 0
620       AND    ppi.payment_item_type_lookup_code = 'CASH';
621 
622    CURSOR csr_first_draft_sch (p_lease_id   NUMBER,
623                                p_start_date DATE)
624    IS
625 
626       SELECT First_Day(MIN(pps.schedule_date))
627       FROM   pn_payment_schedules_all pps
628       WHERE  pps.lease_id = p_lease_id
629       AND    First_Day(pps.schedule_date) >= First_Day(p_start_date)
630       AND    TO_CHAR(pps.schedule_date,'DD') = p_sch_day
631       AND    pps.payment_status_lookup_code = 'DRAFT';
632 
633    CURSOR csr_last_app_sch (p_lease_id   NUMBER,
634                             p_start_date DATE)
635    IS
636 
637       SELECT ADD_MONTHS(First_Day(MAX(pps.schedule_date)) , 1)
638       FROM   pn_payment_schedules_all pps
639       WHERE  pps.lease_id = p_lease_id
640       AND    First_Day(pps.schedule_date) >= First_Day(p_start_date)
641     AND    TO_CHAR(pps.schedule_date,'DD') = p_sch_day
642       AND    pps.payment_status_lookup_code = 'APPROVED';
643 
644 BEGIN
645 
646    pnp_debug_pkg.log('get_sch_info +Start+ (+)');
647 
648    /* Get the frequency for a frequency code. */
649 
650    p_freq := get_frequency(p_freq_code => p_freq_code);
651 
652    pnp_debug_pkg.log('get_sch_info - Start  ****************         ');
653    pnp_debug_pkg.log('get_sch_info - IN: p_lease_context    : '||p_lease_context);
654    pnp_debug_pkg.log('get_sch_info - IN: p_normalize_flag   : '||p_normalize_flag);
655    pnp_debug_pkg.log('get_sch_info - IN: p_mths             : '||p_mths);
656    pnp_debug_pkg.log('get_sch_info - IN: p_term_start_dt    : '||p_term_start_dt);
657    pnp_debug_pkg.log('get_sch_info - IN: p_term_end_dt      : '||p_term_end_dt);
658    pnp_debug_pkg.log('get_sch_info - IN: p_freq_code        : '||p_freq_code);
659    pnp_debug_pkg.log('get_sch_info - IN: p_sch_day          : '||p_sch_day);
660    pnp_debug_pkg.log('get_sch_info - IN: p_new_lea_comm_dt  : '||p_new_lea_comm_dt);
661    pnp_debug_pkg.log('get_sch_info - IN: p_new_lea_term_dt  : '||p_new_lea_term_dt);
662    pnp_debug_pkg.log('get_sch_info - IN: p_old_lea_term_dt  : '||p_old_lea_term_dt);
663    pnp_debug_pkg.log('get_sch_info - IN: p_norm_str_dt      : '||p_norm_str_dt);
664    pnp_debug_pkg.log('get_sch_info - IN: p_lease_id         : '||p_lease_id);
665    pnp_debug_pkg.log('get_sch_info - IN: p_term_id          : '||p_term_id);
666    pnp_debug_pkg.log('get_sch_info - IN: p_amd_comm_dt      : '||p_amd_comm_dt);
667 
668    /* get the no. of schedules, first schedule date and the counter */
669 
670    IF p_lease_context = 'EXP' AND NVL(p_normalize_flag,'N') = 'Y' THEN
671 
672       /* Set the first schedule date for the cash item */
673 
674       p_sch_dt := TO_DATE(TO_CHAR(p_sch_day)||'/'
675                                   ||TO_CHAR(ADD_MONTHS(p_old_lea_term_dt,1),'MM/YYYY'),
676                           'DD/MM/YYYY');
677 
678       /* Schedule-Start-Date (p_sch_str_dt) should be the Term Start Day of the month of
679          the schedule YYYYMM. (Used only for a Non Monthly Term) */
680 
681       /* 3009793 */
682 
683       IF p_freq_code IN ('MON', 'OT') THEN
684 
685         p_sch_str_dt := NULL;
686 
687       ELSE
688 
689         IF TO_NUMBER(TO_CHAR(p_term_start_dt,'DD')) >
690            TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(p_old_lea_term_dt,1)),'DD')) THEN
691 
692           p_sch_str_dt := LAST_DAY(ADD_MONTHS(p_old_lea_term_dt,1));
693 
694         ELSE
695 
696           p_sch_str_dt := TO_DATE(TO_CHAR(p_term_start_dt,'DD')
697                                 ||'/'
698                                 ||TO_CHAR(ADD_MONTHS(p_old_lea_term_dt,1),'MM/YYYY'),
699                           'DD/MM/YYYY');
700         END IF;
701 
702       END IF;
703 
704       /* Store the term's normalization start date */
705 
706       l_norm_str_dt := p_norm_str_dt;
707 
708       /* If Retro is enabled - we need correct p_norm_start_date to be passed to
709          PN_NORM_RENORM_PKG.NORMALIZE_RENORMALIZE procedure. AMT-RETRO */
710       IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
711         OPEN csr_first_draft_sch(g_lease_id, p_norm_str_dt);
712            FETCH csr_first_draft_sch INTO l_first_draft_sch;
713         CLOSE csr_first_draft_sch;
714 
715         IF l_first_draft_sch is NULL THEN
716            p_norm_str_dt := FIRST_DAY(p_sch_dt);
717         ELSE
718            p_norm_str_dt := GREATEST(p_norm_str_dt, l_first_draft_sch);
719         END IF;
720       END IF;
721 
722       /* Total No. of schedules is the no. of schedules between the payment term norm. start date
723          and the new lease termination date */
724 
725       p_no_sch := CEIL(MONTHS_BETWEEN(LAST_DAY(p_new_lea_term_dt),
726                                       First_Day(l_norm_str_dt)));
727 
728 
729       /* If lease is expanded l_counter variable should be initialized to the number of
730          exisiting schedules so that only additional schedules are created. */
731 
732       p_counter := CEIL(MONTHS_BETWEEN(LAST_DAY(p_old_lea_term_dt), FIRST_DAY(l_norm_str_dt)));
733 
734       IF p_freq_code = 'MON' THEN
735 
736          p_pro_sch_dt := p_sch_dt;
737 
738       ELSIF p_freq_code = 'OT' THEN
739 
740          p_pro_sch_dt := l_norm_str_dt;
741 
742       ELSE
743 
744          OPEN lst_sch_dt_cur(p_term_id);
745             FETCH lst_sch_dt_cur INTO l_lst_sch_dt, l_counter;
746          CLOSE lst_sch_dt_cur;
747 
748          IF last_day(l_lst_sch_dt) = l_lst_sch_dt
749          THEN
750          /* last day of month */
751             p_pro_sch_dt := ADD_MONTHS(l_lst_sch_dt - 1, p_freq) + 1;
752          ELSE
753             p_pro_sch_dt := ADD_MONTHS(l_lst_sch_dt,p_freq);
754          END IF;
755 
756       END IF;
757 
758       pnp_debug_pkg.log('get_sch_info - EXP p_old_lea_term_dt: '||p_old_lea_term_dt);
759       pnp_debug_pkg.log('get_sch_info - EXP p_sch_day        : '||TO_CHAR(p_sch_day));
760       pnp_debug_pkg.log('get_sch_info - EXP p_no_sch         : '||TO_CHAR(p_no_sch));
761       pnp_debug_pkg.log('get_sch_info - EXP p_counter        : '||TO_CHAR(p_counter));
762       pnp_debug_pkg.log('get_sch_info - EXP p_sch_dt         : '||p_sch_dt);
763       pnp_debug_pkg.log('get_sch_info - EXP p_sch_str_dt     : '||p_sch_str_dt);
764       pnp_debug_pkg.log('get_sch_info - EXP p_norm_str_dt    : '||p_norm_str_dt);
765       pnp_debug_pkg.log('get_sch_info - EXP p_pro_sch_dt     : '||p_pro_sch_dt);
766       pnp_debug_pkg.log('get_sch_info - EXP l_lst_sch_dt     : '||l_lst_sch_dt);
767 
768 
769    ELSIF (p_lease_context IN ('ABS', 'ADD', 'ADDEDT', 'ADDAMD') AND p_normalize_flag = 'Y') THEN
770 
771       IF p_lease_context = 'ADDAMD' THEN
772          l_comm_dt := p_amd_comm_dt;
773       ELSE
774          l_comm_dt := p_new_lea_comm_dt;
775       END IF;
776 
777       /* If the payment term is added through ABSTRACT or EDIT, Normalization
778          should start from max(Lease Commencement Date, (first_day(last approved_schedule)+1 month)).
779          If the payment term is added through AMENDMENT, Normalization
780          should start from max(Amendment Commencement Date, (first_day(last approved_schedule)+1 month)).
781       */
782 
783       /* If the payment term is added through AMEND, Normalization should start
784          from Amendment Commencement Date, if all of the schedules after the amendment
785          commencement date are in DRAFT mode.
786 
787          Lease            ->  |--------------------------------------------|
788          Amend Comm Date  ->      ->|<-
789          Schedule         ->      |-----|-----|-----|-----| ...
790          Schedule Status  ->       DRAFT DRAFT DRAFT DRAFT
791          Normalize Item   ->        |---|-----|-----|-----| ...
792 
793          If some of the schedule starting from the Amendment Commencement Date are approved ,
794          Normalization should start from the 1st day of the month after the last APPROVED schedule.
795 
796          Lease            ->  |--------------------------------------------|
797          Amend Comm Date  ->      ->|<-
798          Schedule         ->      |-----|-----|-----|-----| ...
799          Schedule Status  ->       DRAFT APPRV DRAFT DRAFT
800          Normalize Item   ->                  |-----|-----| ...
801 
802       */
803 
804       /* AMT-RETRO */
805       IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
806         OPEN csr_last_app_sch (g_lease_id, l_comm_dt);
807            FETCH csr_last_app_sch INTO l_last_app_sch;
808         CLOSE csr_last_app_sch;
809 
810         IF l_last_app_sch IS NULL THEN
811            p_norm_str_dt := l_comm_dt;
812         ELSE
813            p_norm_str_dt := GREATEST(l_comm_dt, l_last_app_sch);
814         END IF;
815       ELSE
816         p_norm_str_dt := l_comm_dt;
817       END IF;
818 
819       /* Set the first schedule date for the cash item */
820 
821       p_sch_dt := TO_DATE(p_sch_day||'/'||TO_CHAR(LEAST(p_norm_str_dt, p_term_start_dt),'MM/YYYY'),'DD/MM/YYYY');
822 
823       /* Schedule-Start-Date (p_sch_str_dt) should be the Term Start Day of the month of
824          the schedule YYYYMM. (Used only for a Non Monthly Term) */
825 
826       /* 3009793 */
827 
828       IF p_freq_code IN ('MON', 'OT') THEN
829 
830         p_sch_str_dt := NULL;
831 
832       ELSE
833 
834         IF TO_NUMBER(TO_CHAR(p_term_start_dt,'DD')) >
835            TO_NUMBER(TO_CHAR(LAST_DAY(LEAST(p_norm_str_dt, p_term_start_dt)),'DD')) THEN
836 
837           p_sch_str_dt := LAST_DAY(LEAST(p_norm_str_dt, p_term_start_dt));
838 
839         ELSE
840 
841           p_sch_str_dt := TO_DATE(TO_CHAR(p_term_start_dt,'DD')
842                                 ||'/'
843                                 ||TO_CHAR(LEAST(p_norm_str_dt, p_term_start_dt),'MM/YYYY'),
844                           'DD/MM/YYYY');
845         END IF;
846 
847       END IF;
848 
849      /* No. of months for which the cash items have to be created */
850 
851       p_no_sch := CEIL(MONTHS_BETWEEN(LAST_DAY(p_new_lea_term_dt),
852                                       First_Day(p_sch_dt)));
853 
854       /* Counter for creation of the cash items */
855 
856       p_counter := 0;
857 
858       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_old_lea_term_dt: '
859                      ||p_old_lea_term_dt);
860       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_day        : '
861                      ||TO_CHAR(p_sch_day));
862       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_no_sch         : '
863                      ||TO_CHAR(p_no_sch));
864       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_counter        : '
865                      ||TO_CHAR(p_counter));
866       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_dt         : '
867                      ||p_sch_dt);
868       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_str_dt     : '
869                      ||p_sch_str_dt);
870       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_norm_str_dt    : '
871                      ||p_norm_str_dt);
872 
873    ELSIF p_lease_context IN ('ABS', 'ADD', 'ADDEDT', 'ADDAMD') AND (NVL(p_normalize_flag,'N') <> 'Y') THEN
874 
875       /* If payment term is not normalized then schedules are to be created depending
876          upon the frequency of payment. */
877 
878       IF p_freq_code = 'MON' THEN
879 
880          l_mths_for_sch := MONTHS_BETWEEN(LAST_DAY(p_term_end_dt)+1, FIRST_DAY(p_term_start_dt));
881          p_no_sch := l_mths_for_sch;
882 
883       ELSIF p_freq_code = 'OT' THEN
884 
885          p_no_sch := 1;
886 
887       ELSE
888 
889          l_mths_for_sch := CEIL(MONTHS_BETWEEN(p_term_end_dt+1, p_term_start_dt));
890          p_no_sch := CEIL(l_mths_for_sch/p_freq);
891 
892       END IF;
893 
894       p_sch_dt := TO_DATE(p_sch_day||'/'||TO_CHAR(p_term_start_dt,'MM/YYYY'),'DD/MM/YYYY');
895 
896       /* Schedule-Start-Date (p_sch_str_dt) should be the Term Start Day of the month of
897          the schedule YYYYMM. (Used only for a Non Monthly Term) */
898 
899       p_sch_str_dt := p_term_start_dt;
900       p_counter := 0;
901 
902       /* For Not Normalized Terms, Normalize Start Date is NULL. */
903 
904       p_norm_str_dt := NULL;
905 
906       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  mths_for_sch     : '
907                      ||TO_CHAR(l_mths_for_sch));
908       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_old_lea_term_dt: '
909                      ||p_old_lea_term_dt);
910       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_day        : '
911                      ||TO_CHAR(p_sch_day));
912       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_no_sch         : '
913                      ||TO_CHAR(p_no_sch));
914       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_counter        : '
915                      ||TO_CHAR(p_counter));
916       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_dt         : '
917                      ||p_sch_dt);
918       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_str_dt     : '
919                      ||p_sch_str_dt);
920       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_norm_str_dt    : '
921                      ||p_norm_str_dt);
922 
923    ELSIF p_lease_context = 'EXP' AND (NVL(p_normalize_flag,'N') <> 'Y') THEN
924 
925       IF p_freq_code = 'MON' THEN
926 
927          l_mths_for_sch := MONTHS_BETWEEN(LAST_DAY(p_term_end_dt)+1, FIRST_DAY(p_term_start_dt));
928          p_no_sch := l_mths_for_sch;
929 
930       ELSIF p_freq_code = 'OT' THEN
931 
932          p_no_sch := 1;
933 
934       ELSE
935 
936          l_mths_for_sch := CEIL(MONTHS_BETWEEN(p_term_end_dt+1, p_term_start_dt));
937          p_no_sch := CEIL(l_mths_for_sch/p_freq);
938 
939       END IF;
940 
941       OPEN lst_sch_dt_cur(p_term_id);
942          FETCH lst_sch_dt_cur INTO l_lst_sch_dt, l_counter;
943       CLOSE lst_sch_dt_cur;
944 
945       p_sch_dt := TO_DATE(TO_CHAR(p_sch_day)||'/'
946                                   ||TO_CHAR(ADD_MONTHS(l_lst_sch_dt,p_freq),'MM/YYYY'),
947                           'DD/MM/YYYY');
948 
949       /* Schedule-Start-Date (p_sch_str_dt) should be the Term Start Day of the month of
950          the schedule YYYYMM. (Used only for a Non Monthly Term) */
951 
952       /* 3009793 */
953 
954       IF p_freq_code IN ('MON', 'OT') THEN
955 
956         p_sch_str_dt := NULL;
957 
958       ELSE
959 
960         IF TO_NUMBER(TO_CHAR(p_term_start_dt,'DD')) >
961            TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(l_lst_sch_dt,p_freq)),'DD')) THEN
962 
963           p_sch_str_dt := LAST_DAY(ADD_MONTHS(l_lst_sch_dt,p_freq));
964 
965         ELSE
966 
967           p_sch_str_dt := TO_DATE(TO_CHAR(p_term_start_dt,'DD')
968                                 ||'/'
969                                 ||TO_CHAR(ADD_MONTHS(l_lst_sch_dt,p_freq),'MM/YYYY')
970                         ,'DD/MM/YYYY');
971         END IF;
972 
973       END IF;
974 
975       p_counter := l_counter;
976 
977       /* For Not Normalized Terms, Normalize Start Date is NULL. */
978 
979       p_norm_str_dt := NULL;
980 
981       /* Get the first date for which a non-zero cash item has to inserted in case of
982         normalized payment terms. */
983 
984       p_pro_sch_dt := p_sch_dt;
985 
986       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  mths_for_sch     : '
987                      ||TO_CHAR(l_mths_for_sch));
988       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_old_lea_term_dt: '
989                      ||p_old_lea_term_dt);
990       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_day        : '
991                      ||TO_CHAR(p_sch_day));
992       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_no_sch         : '
993                      ||TO_CHAR(p_no_sch));
994       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_counter        : '
995                      ||TO_CHAR(p_counter));
996       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_dt         : '
997                      ||p_sch_dt);
998       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_sch_str_dt     : '
999                      ||p_sch_str_dt);
1000       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_norm_str_dt    : '
1001                      ||p_norm_str_dt);
1002       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_pro_sch_dt     : '
1003                      ||p_pro_sch_dt);
1004       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  l_lst_sch_dt     : '
1005                      ||l_lst_sch_dt);
1006 
1007    END IF;
1008 
1009    /* Get the first date for which a non-zero cash item has to inserted in case of
1010       normalized payment terms. */
1011 
1012    IF p_lease_context in ('ABS','ADD', 'ADDEDT','ADDAMD') THEN
1013 
1014       p_pro_sch_dt := TO_DATE(p_sch_day||'/'||TO_CHAR(p_term_start_dt,'MM/YYYY'),'DD/MM/YYYY');
1015       pnp_debug_pkg.log('get_sch_info - ' || p_lease_context || '  p_pro_sch_dt     : '||p_pro_sch_dt);
1016 
1017    END IF;
1018 
1019    /* p_sch_str_dt is used only for Non Monthly Payment Terms.
1020       For One Time and Monthly Payment Terms, set p_sch_str_dt to NULL. */
1021 
1022    pnp_debug_pkg.log('get_sch_info - OUT: p_pro_sch_dt      : '||p_pro_sch_dt);
1023    pnp_debug_pkg.log('get_sch_info - OUT: p_no_sch          : '||p_no_sch);
1024    pnp_debug_pkg.log('get_sch_info - OUT: p_freq            : '||p_freq);
1025    pnp_debug_pkg.log('get_sch_info - OUT: p_counter         : '||p_counter);
1026    pnp_debug_pkg.log('get_sch_info - OUT: p_sch_dt          : '||p_sch_dt);
1027    pnp_debug_pkg.log('get_sch_info - OUT: p_norm_str_dt     : '||p_norm_str_dt);
1028    pnp_debug_pkg.log('get_sch_info - OUT: p_sch_str_dt      : '||p_sch_str_dt);
1029    pnp_debug_pkg.log('get_sch_info -End- (-)');
1030 
1031 END get_sch_info;
1032 
1033 
1034 --------------------------------------------------------------------------------------------
1035 --  FUNCTION   : GET_PRO_AMT
1036 --  DESCRIPTION: This function returns the actual amount of a particular schedule. If the
1037 --               partial start and/or partial end flags are true, the amount is prorated
1038 --               accordingly depending on the given schedule and tern start and end dates.
1039 --  25-JUN-2001  Mrinal Misra    o Created.
1040 --  26-MAR-2002  Satish Tripathi o Simplified.
1041 --  09-JAN-2003  Satish Tripathi o Modified to calculate pro amt with partial months logic
1042 --                                 for Days-in-Month and Non-Monthly terms. BUG# 2733753.
1043 --------------------------------------------------------------------------------------------
1044 FUNCTION get_pro_amt (p_sch_str_dt    DATE,
1045                       p_sch_end_dt    DATE,
1046                       p_trm_str_dt    DATE,
1047                       p_trm_end_dt    DATE,
1048                       p_mth_amt       NUMBER,
1049                       p_pr_rule       VARCHAR2,
1050                       p_partial_start VARCHAR2,
1051                       p_partial_end   VARCHAR2)
1052 RETURN   NUMBER
1053 IS
1054 
1055    l_mths                          NUMBER;
1056    l_pr_mths                       NUMBER;
1057    l_pr_rule                       NUMBER;
1058    l_pr_days                       NUMBER;
1059    l_pr_amt                        NUMBER;
1060    l_partial_start_days            NUMBER;
1061    l_partial_end_days              NUMBER;
1062    l_freq                          NUMBER;
1063    l_partial_start_mths            NUMBER;
1064    l_partial_end_mths              NUMBER;
1065    l_full_start_mths               NUMBER;
1066    l_full_end_mths                 NUMBER;
1067    l_pro_type                      VARCHAR2(1000) := p_pr_rule;
1068 
1069 BEGIN
1070 
1071    pnp_debug_pkg.log('get_pro_amt +Start+ (+) -In- p_pr_rule: '||p_pr_rule);
1072    pnp_debug_pkg.log('get_pro_amt IN: p_sch_str_dt     : '||p_sch_str_dt);
1073    pnp_debug_pkg.log('get_pro_amt IN: p_sch_end_dt     : '||p_sch_end_dt);
1074    pnp_debug_pkg.log('get_pro_amt IN: p_trm_str_dt     : '||p_trm_str_dt);
1075    pnp_debug_pkg.log('get_pro_amt IN: p_trm_end_dt     : '||p_trm_end_dt);
1076    pnp_debug_pkg.log('get_pro_amt IN: p_mth_amt        : '||p_mth_amt);
1077    pnp_debug_pkg.log('get_pro_amt IN: p_pr_rule        : '||p_pr_rule);
1078    pnp_debug_pkg.log('get_pro_amt IN: p_partial_start  : '||p_partial_start);
1079    pnp_debug_pkg.log('get_pro_amt IN: p_partial_end    : '||p_partial_end);
1080 
1081    l_mths := CEIL(MONTHS_BETWEEN(p_sch_end_dt, p_sch_str_dt));
1082    l_freq := l_mths;
1083    l_pr_days := ((p_sch_end_dt - p_sch_str_dt) + 1);
1084 
1085    IF p_pr_rule = 999 THEN
1086 
1087       l_pr_rule := TO_NUMBER(TO_CHAR(LAST_DAY(p_sch_str_dt),'DD'));
1088 
1089    ELSE
1090 
1091       l_pr_rule := p_pr_rule;
1092 
1093    END IF;
1094 
1095    IF p_partial_start = 'Y' THEN
1096 
1097       l_partial_start_days := ABS(p_sch_str_dt - p_trm_str_dt);
1098       l_full_start_mths    := FLOOR(ABS(MONTHS_BETWEEN(p_trm_str_dt, p_sch_str_dt)));
1099 
1100       l_partial_start_mths := l_full_start_mths +
1101                               ABS(p_trm_str_dt - ADD_MONTHS(p_sch_str_dt,l_full_start_mths))/TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(p_sch_str_dt, l_full_start_mths)),'DD'));
1102       pnp_debug_pkg.log('get_pro_amt -partial_start_days: '||l_partial_start_days||
1103                         ', l_partial_start_mths: '||l_partial_start_mths);
1104 
1105    END IF;
1106 
1107    IF p_partial_end = 'Y' THEN
1108 
1109       l_partial_end_days := ABS(p_sch_end_dt - p_trm_end_dt);
1110       l_full_end_mths    := FLOOR(ABS(MONTHS_BETWEEN(p_sch_end_dt, p_trm_end_dt)));
1111 
1112       l_partial_end_mths := l_full_end_mths +
1113                             ABS(ADD_MONTHS(p_sch_end_dt, -1 * l_full_end_mths) - p_trm_end_dt)/TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(p_sch_end_dt +1, -1 * (l_full_end_mths +1))),'DD'));
1114       pnp_debug_pkg.log('get_pro_amt -partial_end_days: '||l_partial_end_days||
1115                         ', l_partial_end_mths: '||l_partial_end_mths);
1116 
1117    END IF;
1118 
1119    IF p_partial_start = 'Y' OR p_partial_end = 'Y' THEN
1120 
1121       l_pr_days := l_pr_days - NVL(l_partial_start_days,0) - NVL(l_partial_end_days,0);
1122       l_pr_mths := l_mths - NVL(l_partial_start_mths,0) - NVL(l_partial_end_mths,0);
1123       pnp_debug_pkg.log('get_pro_amt -l_pr_days Final: '||l_pr_days||
1124                         ', l_pr_mths Final: '||l_pr_mths);
1125 
1126       IF p_pr_rule = 999 THEN
1127          IF l_freq = 1 THEN -- For Monthly Term, Use prorated days.
1128             l_pr_amt := ROUND((p_mth_amt / l_pr_rule) * l_pr_days, 2);
1129             l_pro_type := '999-MONTHLY';
1130          ELSE               -- For Non-Monthly Term, Use prorated months.
1131             l_pr_amt := ROUND(p_mth_amt  * l_pr_mths, 2);
1132             l_pro_type := '999-NON-MTH';
1133          END IF;
1134       ELSE
1135          l_pr_amt := ROUND((p_mth_amt * 12 / l_pr_rule) * l_pr_days, 2);
1136       END IF;
1137 
1138    ELSE
1139 
1140       l_pr_amt := ROUND(p_mth_amt * l_mths, 2);
1141 
1142    END IF;
1143 
1144    pnp_debug_pkg.log('get_pro_amt -End- (-) : Pro Type: '||l_pro_type||
1145                      ', l_pr_amt: '||l_pr_amt);
1146 
1147    RETURN l_pr_amt;
1148 
1149 END get_pro_amt;
1150 
1151 
1152 --------------------------------------------------------------------------------------------
1153 --  PROCEDURE  : GET_AMOUNT
1154 --  DESCRIPTION: This procedure checks whether the given schedule lies within or out NOCOPY of given
1155 --               term start and end date. It then sets the partial end flags accordingly and
1156 --               calls the function GET_PRO_AMT to get and return the Cash Amount.
1157 --  25-JUN-2001  Mrinal Misra    o Created.
1158 --  09-JAN-2002  Francisco T     o Added NVL(g_pr_rule, p_pro_rule). The point in doing NVL
1159 --                                 is so that p_pro_rule can substitute for g_pr_rule in the
1160 --                                 case that it is not defined, in which case the default
1161 --                                 will be null [refer to bug 1845607, and update_pnt_items()
1162 --                                 procedure in PNTPYTRB.pls]
1163 --  07-FEB-2002  Satish Tripathi o Added condition for Lease Context ADDAMD.
1164 --------------------------------------------------------------------------------------------
1165 PROCEDURE get_amount (p_sch_str_dt    IN  DATE,
1166                       p_sch_end_dt    IN  DATE,
1167                       p_trm_str_dt    IN  DATE,
1168                       p_trm_end_dt    IN  DATE,
1169                       p_act_amt       IN  NUMBER,
1170                       p_est_amt       IN  NUMBER,
1171                       p_freq          IN  NUMBER,
1172                       p_pro_rule      IN  VARCHAR2,
1173                       p_cash_act_amt  OUT NOCOPY NUMBER,
1174                       p_cash_est_amt  OUT NOCOPY NUMBER)
1175 IS
1176 
1177    l_cash_act_amt                  pn_payment_items.actual_amount%TYPE;
1178    l_partial_start                 VARCHAR2(1);
1179    l_partial_end                   VARCHAR2(1);
1180 
1181 BEGIN
1182 
1183    pnp_debug_pkg.log('get_amount +Start+ (+)');
1184    pnp_debug_pkg.log('get_amount IN: p_sch_str_dt : '||p_sch_str_dt);
1185    pnp_debug_pkg.log('get_amount IN: p_sch_end_dt : '||p_sch_end_dt);
1186    pnp_debug_pkg.log('get_amount IN: p_trm_str_dt : '||p_trm_str_dt);
1187    pnp_debug_pkg.log('get_amount IN: p_trm_end_dt : '||p_trm_end_dt);
1188    pnp_debug_pkg.log('get_amount IN: p_act_amt    : '||p_act_amt);
1189    pnp_debug_pkg.log('get_amount IN: p_est_amt    : '||p_est_amt);
1190    pnp_debug_pkg.log('get_amount IN: p_freq       : '||p_freq);
1191    pnp_debug_pkg.log('get_amount IN: p_pro_rule   : '||p_pro_rule);
1192 
1193    /* If the schedule lies completely outside the payment term range
1194       then the payment item amount will be equal to zero
1195 
1196       Payment Term ->        |------------|
1197       Schedule     ->  |---|
1198 
1199       Payment Term ->  |------------|
1200       Schedule     ->                  |---|
1201 
1202       Note : This condition will arise when the payment term is normalized and lies
1203              completely within the main lease commencement and termination date.
1204     */
1205 
1206       pnp_debug_pkg.log('get_amount -In- p_sch_str_dt:  '||TO_CHAR(p_sch_str_dt,'DD-MON-YYYY'));
1207       pnp_debug_pkg.log('get_amount -In- p_sch_end_dt:  '||TO_CHAR(p_sch_end_dt,'DD-MON-YYYY'));
1208       pnp_debug_pkg.log('get_amount -In- p_trm_str_dt:  '||TO_CHAR(p_trm_str_dt,'DD-MON-YYYY'));
1209       pnp_debug_pkg.log('get_amount -In- p_trm_end_dt:  '||TO_CHAR(p_trm_end_dt,'DD-MON-YYYY'));
1210 
1211       IF (p_sch_str_dt < p_trm_str_dt AND p_sch_end_dt < p_trm_str_dt) OR
1212          (p_sch_str_dt > p_trm_end_dt AND p_sch_end_dt > p_trm_end_dt) THEN
1213 
1214          p_cash_est_amt := NULL;
1215          p_cash_act_amt := 0;
1216 
1217    /* If the schedule lies completely within the payment term start
1218       date and payment term end date then the payment item amount
1219       will be equal to the amount specified in the payment term
1220 
1221       Payment Term ->  |--------------------------|
1222       Schedule     ->       |------|
1223     */
1224 
1225       ELSIF p_sch_str_dt > p_trm_str_dt AND p_sch_end_dt < p_trm_end_dt THEN
1226          p_cash_est_amt := p_est_amt;
1227          p_cash_act_amt := NVL(p_act_amt, p_est_amt);
1228 
1229       ELSE
1230 
1231          /* If the first day of the schedule date is earlier than the
1232             start date of the term and last day of the schedule is
1233             greater than the start date of the term
1234 
1235             Scenario 1 - partial start and partial end.
1236 
1237             Payment Term ->      |--|
1238             Schedule     ->    |------|
1239 
1240             Scenario 2 - partial start and full end.
1241 
1242             Payment Term ->      |--------------------------|
1243             Schedule     ->    |------|
1244 
1245             Scenario 3 - partial start and full end.
1246 
1247             Payment Term ->      |----|
1248             Schedule     ->    |------|
1249           */
1250 
1251           IF p_trm_str_dt > p_sch_str_dt  THEN
1252 
1253               /* If partial start and partial end set the flags apprioriately */
1254 
1255               IF (p_trm_end_dt > p_sch_str_dt AND p_trm_end_dt < p_sch_end_dt) THEN
1256 
1257                  pnp_debug_pkg.log('get amount - partial start partial end ');
1258                  l_partial_start := 'Y';
1259                  l_partial_end := 'Y';
1260 
1261               ELSE  /* partial start and full end */
1262 
1263                  pnp_debug_pkg.log('get amount - partial start full end ');
1264                  l_partial_start := 'Y';
1265                  l_partial_end := 'N';
1266 
1267               END IF;
1268 
1269           ELSIF p_trm_str_dt <= p_sch_str_dt THEN   /* full start */
1270 
1271              IF p_trm_end_dt >= p_sch_end_dt  THEN /* full start and full end */
1272 
1273                  pnp_debug_pkg.log('get amount - full start full end ');
1274 
1275                 l_partial_start := 'N';
1276                 l_partial_end := 'N';
1277 
1278              ELSE   /* full start and partial end */
1279 
1280                 pnp_debug_pkg.log('get amount - full start partial end ');
1281                 l_partial_start := 'N';
1282                 l_partial_end := 'Y';
1283 
1284              END IF;
1285 
1286           END IF;
1287 
1288           /* We will always need the pro-rated actual amount irrespective of whether
1289              we derive it from the estimated or actual term amount */
1290 
1291              l_cash_act_amt := get_pro_amt(p_sch_str_dt    => p_sch_str_dt,
1292                                            p_sch_end_dt    => p_sch_end_dt,
1293                                            p_trm_str_dt    => p_trm_str_dt,
1294                                            p_trm_end_dt    => p_trm_end_dt,
1295                                            p_mth_amt       => NVL(p_act_amt, p_est_amt)/p_freq,
1296                                            p_pr_rule       => NVL(g_pr_rule,p_pro_rule),
1297                                            p_partial_start => l_partial_start,
1298                                            p_partial_end   => l_partial_end);
1299 
1300              p_cash_act_amt := l_cash_act_amt;
1301 
1302           /* Get the pro-rated estimated amount only if the estimated and actual amounts
1303              of the term are not null */
1304 
1305           IF p_act_amt IS NOT NULL AND p_est_amt IS NOT NULL THEN
1306 
1307              p_cash_est_amt := get_pro_amt(p_sch_str_dt    => p_sch_str_dt,
1308                                            p_sch_end_dt    => p_sch_end_dt,
1309                                            p_trm_str_dt    => p_trm_str_dt,
1310                                            p_trm_end_dt    => p_trm_end_dt,
1311                                            p_mth_amt       => p_est_amt/p_freq,
1312                                            p_pr_rule       => NVL(g_pr_rule,p_pro_rule),
1313                                            p_partial_start => l_partial_start,
1314                                            p_partial_end   => l_partial_end);
1315 
1316           ELSIF p_act_amt IS NULL AND p_est_amt IS NOT NULL THEN
1317 
1318              p_cash_est_amt := l_cash_act_amt;
1319 
1320           END IF;
1321 
1322    END IF;
1323 
1324    pnp_debug_pkg.log('get_amount -OUT- p_cash_act_amt:  '||TO_CHAR(p_cash_act_amt));
1325    pnp_debug_pkg.log('get_amount -OUT- p_cash_est_amt:  '||TO_CHAR(p_cash_est_amt));
1326 
1327    pnp_debug_pkg.log('get_amount -End- (+)');
1328 
1329 END get_amount;
1330 
1331 
1332 --------------------------------------------------------------------------------------------
1333 --  PROCEDURE  : CREATE_SCHEDULE
1334 --  DESCRIPTION: This procedure checks whether a schedule exists for a given lease id and
1335 --               given schedule date. If no schedule exists, create the schedule and
1336 --               return back the schedule Id.
1337 --  25-JUN-2001  Mrinal Misra    o Created.
1338 -- 15-JUL-05  hareesha o Bug 4284035 - Replaced pn_payment_schedules with _ALL table.
1339 -- 28-NOV-06  Hareesha o Added p_payent_term_id as parameter. IF there exist items and
1340 --                       approved schedule due to LOF/SGN and then change to ACT and finalize,
1341 --                       the schedules for other terms on the approved schedule date was not
1342 --                       getting created.
1343 -- 24-AUG-08  rkartha o Bug	6829173 - In cursor check_sch, pick the DRAFT schedule if the
1344 --                      schedule date has both a draft and approved schedule.
1345 --------------------------------------------------------------------------------------------
1346 PROCEDURE create_schedule (p_lease_id            NUMBER,
1347                            p_lc_id               NUMBER,
1348                            p_sch_dt              DATE,
1349                            p_sch_id          OUT NOCOPY NUMBER,
1350                            p_pymnt_st_lkp_cd OUT NOCOPY VARCHAR2,
1351                            p_payment_term_id     NUMBER)
1352 IS
1353 
1354    l_sch_id                        pn_payment_schedules.payment_schedule_id%TYPE;
1355    l_pymnt_st_lkp_cd               pn_payment_schedules.payment_status_lookup_code%TYPE;
1356 
1357    CURSOR check_sch IS
1358       SELECT payment_schedule_id,
1359              payment_status_lookup_code
1360       FROM   pn_payment_schedules_all
1361       WHERE  schedule_date = p_sch_dt
1362       AND    lease_id      = p_lease_id
1363       ORDER BY payment_status_lookup_code DESC;
1364 
1365 
1366    CURSOR org_cur IS
1367      SELECT org_id
1368      FROM pn_leases_all
1369      WHERE lease_id = p_lease_id;
1370 
1371    CURSOR sched_exists(p_payment_term_id NUMBER,p_sch_dt DATE) IS
1372       SELECT sched.payment_schedule_id
1373       FROM pn_payment_items_all item,
1374            pn_payment_schedules_all sched
1375       WHERE item.payment_term_id = p_payment_term_id
1376       AND   item.payment_schedule_id = sched.payment_schedule_id
1377       AND   sched.schedule_date = p_sch_dt;
1378 
1379    l_org_id NUMBER;
1380    l_sched_exists VARCHAR2(1);
1381    l_schd_date          DATE;
1382 
1383 BEGIN
1384 
1385    FOR rec IN org_cur LOOP
1386      l_org_id := rec.org_id;
1387    END LOOP;
1388 
1389    OPEN  check_sch;
1390       FETCH check_sch INTO l_sch_id, l_pymnt_st_lkp_cd;
1391 
1392       IF check_sch%NOTFOUND THEN
1393 
1394          SELECT pn_payment_schedules_s.NEXTVAL
1395          INTO   l_sch_id
1396          FROM   DUAL;
1397 
1398          l_pymnt_st_lkp_cd := 'DRAFT';
1399 
1400          INSERT INTO pn_payment_schedules_all
1401 
1402            (payment_schedule_id,
1403             last_update_date,
1404             last_updated_by,
1405             creation_date,
1406             created_by,
1407             last_update_login,
1408             schedule_date,
1409             lease_id,
1410             lease_change_id,
1411             payment_status_lookup_code,
1412             org_id)
1413 
1414          VALUES
1415 
1416            (l_sch_id,
1417             SYSDATE,
1418             NVL(fnd_profile.value('USER_ID'),0),
1419             SYSDATE,
1420             NVL(fnd_profile.value('USER_ID'),0),
1421             NVL(fnd_profile.value('LOGIN_ID'),0),
1422             p_sch_dt,
1423             p_lease_id,
1424             p_lc_id,
1425             l_pymnt_st_lkp_cd,
1426             l_org_id);
1427 
1428          pnp_debug_pkg.log('create_schedule - created schedule id: '||TO_CHAR(l_sch_id)
1429                            ||' - ('||p_sch_dt||')');
1430 
1431       ELSIF l_pymnt_st_lkp_cd = 'APPROVED' THEN
1432 
1433          l_pymnt_st_lkp_cd := 'DRAFT';
1434          l_schd_date :=   p_sch_dt;
1435 
1436          /* check to see  if the schedule date is already used by this payment term
1437             in the payment items table,in this case the calling procedure
1438             should not create the terms */
1439 
1440          l_sched_exists := 'N';
1441          IF p_payment_term_id IS NOT NULL THEN
1442 
1443             FOR rec IN sched_exists(p_payment_term_id, l_schd_date) LOOP
1444                l_sched_exists := 'Y';
1445             END LOOP;
1446 
1447             IF l_sched_exists = 'N' THEN
1448                BEGIN
1449 
1450                   SELECT  payment_schedule_id,
1451                           payment_status_lookup_code
1452                   INTO l_sch_id, l_pymnt_st_lkp_cd
1453                   FROM  pn_payment_schedules_all
1454                   WHERE lease_id = p_lease_id
1455                   AND   schedule_date = l_schd_date
1456                   AND  payment_status_lookup_code = l_pymnt_st_lkp_cd
1457                   AND ROWNUM = 1;
1458 
1459                EXCEPTION WHEN NO_DATA_FOUND THEN
1460                   SELECT pn_payment_schedules_s.NEXTVAL INTO l_sch_id
1461                   FROM DUAL;
1462 
1463                   INSERT INTO pn_payment_schedules_all(
1464                                   payment_schedule_id,
1465                                   last_update_date,
1466                                   last_updated_by,
1467                                   creation_date,
1468                                   created_by,
1469                                   last_update_login,
1470                                   schedule_date,
1471                                   lease_id,
1472                                   lease_change_id,
1473                                   payment_status_lookup_code,
1474                                   org_id)
1475                    VALUES        (l_sch_id,
1476                                   SYSDATE,
1477                                   NVL(fnd_profile.value('USER_ID'),0),
1478                                   SYSDATE,
1479                                   NVL(fnd_profile.value('USER_ID'),0),
1480                                   NVL(fnd_profile.value('LOGIN_ID'),0),
1481                                   l_schd_date,
1482                                   p_lease_id,
1483                                   p_lc_id,
1484                                   l_pymnt_st_lkp_cd,
1485                                   l_org_id);
1486                END;
1487             END IF;
1488          END IF;
1489 
1490       END IF;
1491 
1492       p_sch_id           := l_sch_id;
1493       p_pymnt_st_lkp_cd  := l_pymnt_st_lkp_cd;
1494 
1495    CLOSE check_sch;
1496 
1497 END create_schedule;
1498 
1499 
1500 --------------------------------------------------------------------------------------------
1501 --  PROCEDURE  : CREATE_CASH_ITEMS
1502 --  DESCRIPTION: This procedure creates the cash items by inserting given amount, schedule Id
1503 --               and date, term Id etc. in the table PN_PAYMENT_ITEMS.
1504 --  25-JUN-2001  created    mmisra
1505 --  26-APR-2002  modified   ftanudja   o added p_rate
1506 -- 15-JUL-05  hareesha o Bug 4284035 - Replaced pn_payment_items with _ALL table.
1507 -- 09-JAN-07  Hareesha o M28#16 for Recurring backbills, populate the due_date as
1508 --                       calculation date into pn_payment_items_all
1509 --  24-APR-07  Hareesha  o Bug #5899113 Default inv-grping rule set at term-level to
1510 --                         items.
1511 --------------------------------------------------------------------------------------------
1512 PROCEDURE create_cash_items (p_est_amt           NUMBER,
1513                              p_act_amt           NUMBER,
1514                              p_sch_dt            DATE,
1515                              p_sch_id            NUMBER,
1516                              p_term_id           NUMBER,
1517                              p_vendor_id         NUMBER,
1518                              p_cust_id           NUMBER,
1519                              p_vendor_site_id    NUMBER,
1520                              p_cust_site_use_id  NUMBER,
1521                              p_cust_ship_site_id NUMBER,
1522                              p_sob_id            NUMBER,
1523                              p_curr_code         VARCHAR2,
1524                              p_rate              NUMBER)
1525 IS
1526 
1527    l_precision                     NUMBER;
1528    l_ext_precision                 NUMBER;
1529    l_min_acct_unit                 NUMBER;
1530    l_payment_item_id               pn_payment_items.payment_item_id%TYPE;
1531    l_actual_amount                 pn_payment_items.actual_amount%TYPE;
1532 
1533    CURSOR org_cur IS
1534      SELECT org_id
1535      FROM pn_payment_terms_all
1536      WHERE payment_term_id = p_term_id;
1537 
1538    CURSOR get_calc_date_recur_bb ( p_term_id IN NUMBER) IS
1539       SELECT recur_bb_calc_date
1540       FROM pn_payment_terms_all
1541       WHERE payment_term_id = p_term_id
1542       AND recur_bb_calc_date IS NOT NULL;
1543 
1544    CURSOR get_inv_grp_rule IS
1545       SELECT grouping_rule_id
1546       FROM pn_payment_terms_all
1547       WHERE payment_term_id = p_term_id;
1548 
1549    l_org_id NUMBER;
1550    l_sch_dt DATE := p_sch_dt;
1551    l_inv_grp_rule NUMBER := NULL;
1552 
1553 BEGIN
1554 
1555    /* Get the correct precision for the currency so that the amount can be rounded off
1556       before inserting */
1557 
1558    fnd_currency.get_info(p_curr_code, l_precision, l_ext_precision, l_min_acct_unit);
1559 
1560    FOR rec IN org_cur LOOP
1561      l_org_id := rec.org_id;
1562    END LOOP;
1563 
1564    IF NVL(fnd_profile.value('PN_RI_BACKBILL_TYPE'),'OT') = 'RECUR' THEN
1565 
1566       FOR rec IN get_calc_date_recur_bb(p_term_id) LOOP
1567          l_sch_dt := rec.recur_bb_calc_date;
1568       END LOOP;
1569 
1570    END IF;
1571 
1572    FOR rec IN get_inv_grp_rule LOOP
1573       l_inv_grp_rule := rec.grouping_rule_id;
1574    END LOOP;
1575 
1576    INSERT INTO pn_payment_items_all
1577    (payment_item_id,
1578     last_update_date,
1579     last_updated_by,
1580     creation_date,
1581     created_by,
1582     last_update_login,
1583     actual_amount,
1584     estimated_amount,
1585     due_date,
1586     payment_item_type_lookup_code,
1587     payment_term_id,
1588     payment_schedule_id,
1589     period_fraction,
1590     vendor_id,
1591     customer_id,
1592     vendor_site_id,
1593     customer_site_use_id,
1594     cust_ship_site_id,
1595     set_of_books_id,
1596     currency_code,
1597     export_currency_code,
1598     export_currency_amount,
1599     rate,
1600     org_id,
1601     grouping_rule_id)
1602 
1603    VALUES
1604    (PN_PAYMENT_ITEMS_S.NEXTVAL,
1605     SYSDATE,
1606     NVL(fnd_profile.value('USER_ID'),0),
1607     SYSDATE,
1608     NVL(fnd_profile.value('USER_ID'),0),
1609     NVL(fnd_profile.value('LOGIN_ID'),0),
1610     ROUND(p_act_amt,l_precision),
1611     ROUND(p_est_amt,l_precision),
1612     l_sch_dt,
1613     'CASH',
1614     p_term_id,
1615     p_sch_id,
1616     1,
1617     p_vendor_id,
1618     p_cust_id,
1619     p_vendor_site_id,
1620     p_cust_site_use_id,
1621     p_cust_ship_site_id,
1622     p_sob_id,
1623     p_curr_code,
1624     p_curr_code,
1625     ROUND(p_act_amt, l_precision),
1626     p_rate,
1627     l_org_id,
1628     l_inv_grp_rule)
1629     RETURNING payment_item_id, actual_amount INTO l_payment_item_id, l_actual_amount;
1630 
1631    pnp_debug_pkg.log('create_cash_items OUT: payment_item_id:  '||l_payment_item_id
1632                      ||', actual_amount: '||l_actual_amount);
1633 
1634 EXCEPTION
1635 
1636    WHEN OTHERS THEN
1637       RAISE;
1638 
1639 END create_cash_items;
1640 
1641 
1642 ------------------------------------------------------------------------------
1643 --  PROCEDURE  : CREATE_NORMALIZE_ITEMS
1644 --  DESCRIPTION:
1645 --   This procedure sums up the Cash amount of a given term,
1646 --   calculates the monthly normalize amount, prorated the first
1647 --   and/or last month's amount if needed and finally creates Normalize
1648 --   items by inserting row in table PN_PAYMENT_ITEMS.
1649 -- 25-JUN-01  Mrinal   o Created.
1650 -- 18-OCT-01  Mrinal   o Added parameter p_sch_day. Where ever using the
1651 --                       ADD_MONTHS function, derived date by concatination
1652 --                       of 'DD' component except for end dates.
1653 -- 04-DEC-01  Satish   o Fixed the problem of proration calculation of
1654 --                       normalized amount for partial-start and partial-end
1655 --                       month.
1656 -- 24-JAN-02  Satish   o Added parameters p_norm_str_dt, p_norm_end_dt.
1657 --                       Normalized items will be created from p_norm_str_dt
1658 --                       to p_norm_end_dt. The program calling
1659 --                       create_normalize_items will now have to calculate
1660 --                       and pass normalization start and end date paramaters
1661 -- 26-APR-02  ftanudja o Added parameter p_rate
1662 -- 07-OCT-02  Ashish   o BUG#2590872 $0 invoice enhancement
1663 --                       update the PN_PAYMENT_TERMS SET EVENT_TYPE_CODE
1664 --                                   = P_LEASE_CONTEXT
1665 -- 18-NOV-02  Satish   o Fix for BUG# 2646928. Modified to adjust the rounding
1666 --                       issue of Normalize amount. Adjust the difference
1667 --                       in the last iteration so that sum of Cash and
1668 --                       Normalize amounts are equal. Added variables
1669 --                       l_prec_norm_amt, l_tot_cum_diff_amt etc.
1670 -- 30-MAY-03  Satish   o Fix for BUG# 2957811. Modified SQL Select clause from
1671 --                       LEAST(p_norm_end_dt, LAST_DAY(MAX(pps.schedule_date))) to
1672 --                       LEAST(p_norm_end_dt,
1673 --                        NVL(LAST_DAY(MAX(pps.schedule_date)), p_norm_end_dt))
1674 --                       If there is no DRAFT schedule, don't return NULL
1675 --                       and error out. Added IF l_norm_mths > 0 THEN
1676 --                       to Exit create_normalize_items if l_norm_mths = 0.
1677 -- 16-OCT-03  Satish   o Fix for BUG# 3201091. Added parameter
1678 --                       p_lease_change_id, to use instead of g_lc_id.
1679 -- 24-DEC-03  Satish   o Fix for BUG# 3306681. If l_norm_mths <= 1 month then
1680 --                       l_monthly_norm_amt := l_total_cash_amt - l_la_amt.
1681 -- 14-JUL-05  hareesha o Bug 4284035 - Replaced pn_payment_items with _ALL.
1682 -- 24-NOV-05  Kiran    o Round amounts befor insert/uptdate into terms OR items.
1683 -- 09-JAN-07  Hareesha o M28#16 for Recurring backbills, populate the due_date as
1684 --                       calculation date into pn_payment_items_all
1685 --  24-APR-07  Hareesha  o Bug #5899113 Default inv-grping rule set at term-level to
1686 --                         items.
1687 --  24-AUG-08 RKARTHA o Bug 6829173 - When finding the number of approved schedules,
1688 --                      exclude those approved schedules for which on the same
1689 --                      schedule date, there is also a draft schedule.
1690 --  18-SEP-08 jsundara o Bug#6825797. Modified procedure to exclude amount that belong
1691 --                       to schedules in APPROVED or ON_HOLD status while determining
1692 --                       left alone amount.
1693 
1694 -------------------------------------------------------------------------------
1695 PROCEDURE create_normalize_items (p_lease_context      VARCHAR2,
1696                                   p_lease_id           NUMBER,
1697                                   p_term_id            NUMBER,
1698                                   p_vendor_id          NUMBER,
1699                                   p_cust_id            NUMBER,
1700                                   p_vendor_site_id     NUMBER,
1701                                   p_cust_site_use_id   NUMBER,
1702                                   p_cust_ship_site_id  NUMBER,
1703                                   p_sob_id             NUMBER,
1704                                   p_curr_code          VARCHAR2,
1705                                   p_sch_day            NUMBER,
1706                                   p_norm_str_dt        DATE,
1707                                   p_norm_end_dt        DATE,
1708                                   p_rate               NUMBER,
1709                                   p_lease_change_id    NUMBER)
1710 IS
1711 
1712    l_total_cash_amt                pn_payment_items_all.actual_amount%TYPE;
1713    l_la_amt                        NUMBER;
1714    l_norm_amt                      NUMBER;
1715    l_norm_sch_dt                   DATE;
1716    l_precision                     NUMBER;
1717    l_ext_precision                 NUMBER;
1718    l_min_acct_unit                 NUMBER;
1719    l_sch_id                        NUMBER;
1720    l_drft_mths                     NUMBER;
1721    l_norm_mths                     NUMBER;
1722    l_mths                          NUMBER;
1723    l_monthly_norm_amt              NUMBER;
1724    l_partial_start_fraction        NUMBER;
1725    l_partial_end_fraction          NUMBER;
1726    l_partial_start_flag            VARCHAR2(1) := 'N';
1727    l_partial_end_flag              VARCHAR2(1) := 'N';
1728    l_day_of_norm_start_dt          VARCHAR2(2) := NULL;
1729    l_day_of_norm_end_dt            VARCHAR2(2) := NULL;
1730    l_last_sch_dt                   DATE;
1731    l_pymnt_st_lkp_cd               pn_payment_schedules.payment_status_lookup_code%TYPE;
1732    l_counter                       NUMBER;
1733    l_app_sch                       NUMBER := 0;
1734    l_norm_end_dt                   DATE;
1735    l_prec_norm_amt                 NUMBER := 0;
1736    l_prec_norm_amt_upd             NUMBER := 0;
1737    l_rows_updated                  NUMBER := 0;
1738    l_tot_cum_norm_amt              NUMBER := 0;
1739    l_tot_cum_diff_amt              NUMBER := 0;
1740    l_org_id                        NUMBER;
1741 
1742    CURSOR get_org_id(l_term_id NUMBER) IS
1743      SELECT org_id
1744      FROM pn_payment_terms_all
1745      WHERE payment_term_id = l_term_id;
1746 
1747    l_due_date DATE;
1748 
1749    CURSOR get_calc_date_recur_bb ( p_term_id IN NUMBER) IS
1750       SELECT recur_bb_calc_date
1751       FROM pn_payment_terms_all
1752       WHERE payment_term_id = p_term_id
1753       AND recur_bb_calc_date IS NOT NULL ;
1754 
1755   CURSOR get_inv_grp_rule IS
1756       SELECT grouping_rule_id
1757       FROM pn_payment_terms_all
1758       WHERE payment_term_id = p_term_id;
1759 
1760    l_inv_grp_rule NUMBER := NULL;
1761 
1762 
1763 BEGIN
1764 
1765    pnp_debug_pkg.log('create_normalize_items +Start+ (+) - Lease Context: '||p_lease_context);
1766    pnp_debug_pkg.log('create_normalize_items IN: p_lease_id          : '||p_lease_id);
1767    pnp_debug_pkg.log('create_normalize_items IN: p_term_id           : '||p_term_id);
1768    pnp_debug_pkg.log('create_normalize_items IN: p_sch_day           : '||p_sch_day);
1769    pnp_debug_pkg.log('create_normalize_items IN: p_norm_str_dt       : '||p_norm_str_dt);
1770    pnp_debug_pkg.log('create_normalize_items IN: p_norm_end_dt       : '||p_norm_end_dt);
1771    pnp_debug_pkg.log('create_normalize_items IN: p_lease_change_id   : '||p_lease_change_id);
1772    pnp_debug_pkg.log('create_normalize_items IN: p_vendor_id         : '||p_vendor_id);
1773    pnp_debug_pkg.log('create_normalize_items IN: p_cust_id           : '||p_cust_id);
1774    pnp_debug_pkg.log('create_normalize_items IN: p_vendor_site_id    : '||p_vendor_site_id);
1775    pnp_debug_pkg.log('create_normalize_items IN: p_cust_site_use_id  : '||p_cust_site_use_id);
1776    pnp_debug_pkg.log('create_normalize_items IN: p_cust_ship_site_id : '||p_cust_ship_site_id);
1777    pnp_debug_pkg.log('create_normalize_items IN: p_sob_id            : '||p_sob_id);
1778    pnp_debug_pkg.log('create_normalize_items IN: p_rate              : '||p_rate);
1779    pnp_debug_pkg.log('create_normalize_items IN: p_curr_code         : '||p_curr_code);
1780 
1781    SELECT SUM(ppi.actual_amount)
1782    INTO   l_total_cash_amt
1783    FROM   pn_payment_items_all ppi
1784    WHERE  ppi.payment_term_id = p_term_id
1785    AND    ppi.payment_item_type_lookup_code = 'CASH';
1786 
1787    pnp_debug_pkg.log('create_normalize_items - total cash       : '||TO_CHAR(l_total_cash_amt));
1788 
1789    IF p_lease_context IN ('ABS', 'ADD', 'ADDEDT', 'ADDAMD') THEN
1790 
1791       l_la_amt := 0;
1792 
1793    ELSIF p_lease_context IN ('CON','EXP','CONTERM') THEN
1794 
1795       SELECT NVL(SUM(ppi.actual_amount),0)
1796       INTO   l_la_amt
1797       FROM   pn_payment_items_all ppi,
1798              pn_payment_schedules_all pps
1799       WHERE  ppi.payment_term_id = p_term_id
1800       AND    ppi.payment_item_type_lookup_code = 'NORMALIZED'
1801       AND    pps.payment_schedule_id = ppi.payment_schedule_id
1802       AND    pps.payment_status_lookup_code <> 'DRAFT';  --Bug#6825797 'APPROVED';
1803 
1804    END IF;
1805 
1806    pnp_debug_pkg.log('create_normalize_items - leave alone amt  : '||TO_CHAR(l_la_amt));
1807 
1808    /* Normalized Months required when Normalizing Partial Start,Partial end or both.*/
1809 
1810    l_mths      := CEIL(MONTHS_BETWEEN(LAST_DAY(p_norm_end_dt),
1811                                       First_Day(p_norm_str_dt)));
1812    l_norm_mths := l_mths;
1813 
1814    /* Find the last Schedule date of the term. */
1815 
1816    IF p_lease_context IN ('CON','EXP','CONTERM') THEN
1817 
1818       SELECT LEAST(p_norm_end_dt, NVL(LAST_DAY(MAX(pps.schedule_date)), p_norm_end_dt))
1819       INTO   l_norm_end_dt
1820       FROM   pn_payment_items_all ppi,
1821              pn_payment_schedules_all pps
1822       WHERE  ppi.payment_term_id = p_term_id
1823       AND    pps.payment_schedule_id = ppi.payment_schedule_id
1824       AND    pps.payment_status_lookup_code = 'DRAFT';
1825 
1826       pnp_debug_pkg.log('l_norm_end_dt    : '||TO_CHAR(l_norm_end_dt));
1827 
1828       SELECT COUNT(*)
1829       INTO   l_app_sch
1830       FROM   pn_payment_items_all ppi,
1831              pn_payment_schedules_all pps
1832       WHERE  ppi.payment_term_id = p_term_id
1833       AND    pps.payment_schedule_id = ppi.payment_schedule_id
1834       AND    pps.payment_status_lookup_code = 'APPROVED'
1835       AND    ppi.payment_item_type_lookup_code = 'CASH'
1836       AND    pps.schedule_date between First_Day(p_norm_str_dt) and LAST_DAY(l_norm_end_dt)
1837       AND    NOT EXISTS (
1838                          SELECT 1
1839                          FROM  pn_payment_schedules_all ppsi,
1840                                pn_payment_items_all ppii
1841                          WHERE ppsi.schedule_date = pps.schedule_date
1842                          AND   ppii.payment_term_id = ppi.payment_term_id
1843                          AND   ppsi.payment_schedule_id = ppii.payment_schedule_id
1844                          AND   ppsi.payment_status_lookup_code = 'DRAFT'
1845                          );
1846 
1847       l_norm_mths := l_norm_mths - l_app_sch;
1848 
1849    ELSE
1850 
1851       l_norm_end_dt := p_norm_end_dt;
1852 
1853    END IF;
1854 
1855    -- If l_norm_mths = 0 do not re-normalize, exit create_normalize_items.
1856    IF l_norm_mths > 0 THEN -- Exit create_normalize_items.
1857 
1858    pnp_debug_pkg.log('create_normalize_items - l_mths           : '||TO_CHAR(l_mths));
1859 
1860    l_last_sch_dt := TO_DATE(TO_CHAR(p_sch_day)||'/'||TO_CHAR(l_norm_end_dt,'MM/YYYY'),'DD/MM/YYYY');
1861 
1862    /* Find which day of month the lease starts.*/
1863 
1864    l_day_of_norm_start_dt := TO_CHAR(p_norm_str_dt,'DD');
1865 
1866    /* Find which day of month the lease ends. */
1867 
1868    l_day_of_norm_end_dt := TO_CHAR(l_norm_end_dt,'DD');
1869 
1870    /* If partial start month, then calculate the partial fraction of the start month. */
1871 
1872    IF l_day_of_norm_start_dt <> '01' THEN
1873 
1874       l_partial_start_flag := 'Y';
1875 
1876       IF g_pr_rule = 999 THEN
1877 
1878          l_partial_start_fraction := ((LAST_DAY(p_norm_str_dt) - p_norm_str_dt)+1)/
1879                                      TO_NUMBER(TO_CHAR(LAST_DAY(p_norm_str_dt),'DD'));
1880 
1881       ELSE
1882 
1883          l_partial_start_fraction := ((LAST_DAY(p_norm_str_dt) - p_norm_str_dt)+1)*12/g_pr_rule;
1884 
1885       END IF;
1886 
1887       l_norm_mths := (l_norm_mths - 1) + NVL(l_partial_start_fraction,0);
1888 
1889       pnp_debug_pkg.log('create_normalize_items - l_partial_start_fraction   : '
1890                         ||TO_CHAR(l_partial_start_fraction));
1891 
1892    END IF;
1893 
1894    /* If partial end month, then calculate the partial fraction of the end month.*/
1895 
1896    IF l_day_of_norm_end_dt <> TO_CHAR(LAST_DAY(l_norm_end_dt),'DD') THEN
1897 
1898       l_partial_end_flag := 'Y';
1899 
1900       IF  g_pr_rule = 999 THEN
1901 
1902          l_partial_end_fraction := TO_NUMBER(l_day_of_norm_end_dt)/
1903                                    TO_NUMBER(TO_CHAR(LAST_DAY(l_norm_end_dt),'DD'));
1904 
1905       ELSE
1906 
1907          l_partial_end_fraction := TO_NUMBER(l_day_of_norm_end_dt)*12/g_pr_rule;
1908 
1909       END IF;
1910 
1911       l_norm_mths := (l_norm_mths - 1) + NVL(l_partial_end_fraction,0);
1912 
1913       pnp_debug_pkg.log('create_normalize_items - l_partial_end_fraction     : '
1914                         ||TO_CHAR(l_partial_end_fraction));
1915 
1916    END IF;
1917 
1918    pnp_debug_pkg.log('create_normalize_items - l_norm_mths      : '||TO_CHAR(l_norm_mths));
1919 
1920    IF l_norm_mths <= 1 THEN
1921       l_monthly_norm_amt := l_total_cash_amt - l_la_amt;
1922       l_partial_end_flag := 'N';
1923       l_partial_start_flag := 'N';
1924    ELSE
1925       l_monthly_norm_amt := (l_total_cash_amt - l_la_amt)/l_norm_mths;
1926    END IF;
1927    l_norm_amt := l_monthly_norm_amt;
1928 
1929    pnp_debug_pkg.log('create_normalize_items - normalize amt    : '||TO_CHAR(l_norm_amt));
1930 
1931    fnd_currency.get_info(p_curr_code, l_precision, l_ext_precision, l_min_acct_unit);
1932 
1933    IF p_lease_context IN ('EXP', 'CONTERM') THEN
1934 
1935       DELETE pn_payment_items_all ppi
1936       WHERE  ppi.payment_schedule_id IN (SELECT pps.payment_schedule_id
1937                                          FROM   pn_payment_items_all ppi1,
1938                                                 pn_payment_schedules_all pps
1939                                          WHERE  ppi1.payment_term_id = p_term_id
1940                                          AND    ppi1.payment_item_type_lookup_code = 'CASH'
1941                                          AND    pps.payment_schedule_id = ppi1.payment_schedule_id
1942                                          AND    pps.payment_status_lookup_code = 'DRAFT')
1943       AND ppi.payment_item_type_lookup_code = 'NORMALIZED'
1944       AND ppi.payment_term_id = p_term_id;
1945 
1946       pnp_debug_pkg.log('create_normalize_items - deleted normalized items for EXP');
1947 
1948    END IF;
1949 
1950    IF p_lease_context IN ('ABS', 'ADD','ADDEDT', 'ADDAMD', 'EXP', 'CONTERM') THEN
1951 
1952       l_norm_sch_dt := TO_DATE(TO_CHAR(p_sch_day)||'/'||TO_CHAR(p_norm_str_dt,'MM/YYYY'),'DD/MM/YYYY');
1953 
1954       pnp_debug_pkg.log('create_normalize_items - 1st nor. sch.    : '
1955                         ||TO_CHAR(l_norm_sch_dt,'MM/DD/YYYY'));
1956 
1957       l_counter := 1;
1958 
1959       LOOP
1960 
1961       EXIT WHEN l_counter > l_mths;
1962 
1963       create_schedule(g_lease_id, p_lease_change_id, l_norm_sch_dt, l_sch_id, l_pymnt_st_lkp_cd);
1964 
1965       IF (l_pymnt_st_lkp_cd = 'DRAFT' AND p_lease_context IN ('EXP', 'CONTERM')) OR
1966          p_lease_context in ('ABS', 'ADD', 'ADDEDT', 'ADDAMD') THEN
1967 
1968          /* If partial start or partial end month, then norm amt for that month is
1969             monthly norm amt * corresponding partial fraction.*/
1970 
1971          l_norm_amt := l_monthly_norm_amt;
1972 
1973          IF l_partial_start_flag = 'Y' AND l_counter = 1 THEN
1974 
1975             l_norm_amt := l_monthly_norm_amt*l_partial_start_fraction;
1976 
1977          END IF;
1978 
1979          IF l_partial_end_flag = 'Y' AND l_counter = l_mths THEN
1980 
1981             l_norm_amt := l_monthly_norm_amt*l_partial_end_fraction;
1982 
1983          END IF;
1984 
1985          -- For last Item, adjust difference of Total Cash and Normalize amount
1986          -- so that sum of Cash and Normalize amounts are equal. (BUG# 2646928).
1987 
1988          l_prec_norm_amt := ROUND(l_norm_amt,l_precision);
1989          l_tot_cum_norm_amt := l_tot_cum_norm_amt + l_prec_norm_amt;
1990          IF l_counter = l_mths THEN
1991             l_tot_cum_diff_amt := (l_total_cash_amt - l_la_amt) - l_tot_cum_norm_amt;
1992             l_prec_norm_amt := l_prec_norm_amt + l_tot_cum_diff_amt;
1993          END IF;
1994 
1995          FOR rec IN get_org_id(p_term_id) LOOP
1996             l_org_id := rec.org_id;
1997          END LOOP;
1998 
1999          l_due_date := l_norm_sch_dt;
2000          IF NVL(fnd_profile.value('PN_RI_BACKBILL_TYPE'),'OT') = 'RECUR' THEN
2001 
2002             FOR rec IN get_calc_date_recur_bb(p_term_id) LOOP
2003                l_due_date := rec.recur_bb_calc_date;
2004             END LOOP;
2005 
2006          END IF;
2007 
2008          FOR rec IN get_inv_grp_rule LOOP
2009             l_inv_grp_rule := rec.grouping_rule_id;
2010          END LOOP;
2011 
2012          INSERT INTO pn_payment_items_all
2013          (payment_item_id,
2014           last_update_date,
2015           last_updated_by,
2016           creation_date,
2017           created_by,
2018           last_update_login,
2019           actual_amount,
2020           estimated_amount,
2021           due_date,
2022           payment_item_type_lookup_code,
2023           payment_term_id,
2024           payment_schedule_id,
2025           period_fraction,
2026           vendor_id,
2027           customer_id,
2028           vendor_site_id,
2029           customer_site_use_id,
2030           cust_ship_site_id,
2031           set_of_books_id,
2032           currency_code,
2033           export_currency_code,
2034           export_currency_amount,
2035           rate,
2036           org_id,
2037           grouping_rule_id)
2038 
2039          VALUES
2040 
2041          (PN_PAYMENT_ITEMS_S.NEXTVAL,
2042           SYSDATE,
2043           NVL(fnd_profile.value('USER_ID'),0),
2044           SYSDATE,
2045           NVL(fnd_profile.value('USER_ID'),0),
2046           NVL(fnd_profile.value('LOGIN_ID'),0),
2047           l_prec_norm_amt,
2048           NULL,
2049           l_norm_sch_dt,
2050           'NORMALIZED',
2051           p_term_id,
2052           l_sch_id,
2053           1,
2054           p_vendor_id,
2055           p_cust_id,
2056           p_vendor_site_id,
2057           p_cust_site_use_id,
2058           p_cust_ship_site_id,
2059           p_sob_id,
2060           p_curr_code,
2061           p_curr_code,
2062           l_prec_norm_amt,
2063           p_rate,
2064           l_org_id,
2065           l_inv_grp_rule);
2066 
2067       END IF;
2068 
2069       l_counter:= l_counter + 1;
2070       l_norm_sch_dt := TO_DATE(TO_CHAR(p_sch_day)||'/'||TO_CHAR(ADD_MONTHS(l_norm_sch_dt,1),'MM/YYYY')
2071                                ,'DD/MM/YYYY');
2072 
2073       END LOOP;
2074 
2075    ELSIF p_lease_context = 'CON' THEN
2076 
2077       l_norm_amt := l_monthly_norm_amt;
2078       l_prec_norm_amt := ROUND(l_norm_amt,l_precision);
2079 
2080       UPDATE pn_payment_items_all ppi
2081       SET    ppi.actual_amount = l_prec_norm_amt,
2082              ppi.export_currency_amount = l_prec_norm_amt,
2083              ppi.last_update_date = SYSDATE,
2084              ppi.last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
2085              ppi.last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
2086       WHERE  ppi.payment_schedule_id IN (SELECT pps.payment_schedule_id
2087                                          FROM   pn_payment_schedules_all pps,
2088                                                 pn_payment_items_all ppi1
2089                                          WHERE  pps.payment_schedule_id = ppi1.payment_schedule_id
2090                                          AND    pps.payment_status_lookup_code = 'DRAFT'
2091                                          AND    ppi1.payment_term_id = p_term_id)
2092       AND    ppi.payment_item_type_lookup_code = 'NORMALIZED'
2093       AND    ppi.payment_term_id = p_term_id;
2094 
2095       -- Sum normalize amount for difference in Total Cash and Normalize amount. (BUG# 2646928).
2096       l_rows_updated := SQL%ROWCOUNT;
2097       l_prec_norm_amt_upd := l_prec_norm_amt;
2098       l_tot_cum_norm_amt := l_rows_updated * l_prec_norm_amt_upd;
2099 
2100       /* If partial start month, then norm amt for the 1st month schedule is
2101          monthly norm amt * partial start fraction.*/
2102 
2103       IF l_partial_start_flag = 'Y' THEN
2104 
2105          l_norm_amt := l_monthly_norm_amt*l_partial_start_fraction;
2106          l_prec_norm_amt := ROUND(l_norm_amt,l_precision);
2107          l_norm_sch_dt := TO_DATE(TO_CHAR(p_sch_day)||'/'||TO_CHAR(p_norm_str_dt,'MM/YYYY')
2108                                   ,'DD/MM/YYYY');
2109          l_tot_cum_norm_amt := l_tot_cum_norm_amt - l_prec_norm_amt_upd + l_prec_norm_amt;
2110 
2111          UPDATE pn_payment_items_all ppi
2112          SET    ppi.actual_amount = l_prec_norm_amt,
2113                 ppi.export_currency_amount = l_prec_norm_amt,
2114                 ppi.last_update_date = SYSDATE,
2115                 ppi.last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
2116                 ppi.last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
2117          WHERE  ppi.payment_schedule_id = (SELECT pps.payment_schedule_id
2118                                            FROM   pn_payment_schedules_all pps,
2119                                                   pn_payment_items_all ppi1
2120                                            WHERE  pps.payment_schedule_id = ppi1.payment_schedule_id
2121                                            AND    pps.payment_status_lookup_code = 'DRAFT'
2122                                            AND    ppi1.payment_term_id = p_term_id
2123                                            AND    ppi1.payment_item_type_lookup_code = 'NORMALIZED'
2124                                            AND    pps.schedule_date = l_norm_sch_dt)
2125          AND    ppi.payment_item_type_lookup_code = 'NORMALIZED'
2126          AND    ppi.payment_term_id = p_term_id;
2127       END IF;
2128 
2129       /* If partial end month, then norm amt for the last month schedule is
2130          monthly norm amt * partial end fraction. */
2131 
2132       IF l_partial_end_flag = 'Y' THEN
2133          l_norm_amt := l_monthly_norm_amt*l_partial_end_fraction;
2134          l_prec_norm_amt := ROUND(l_norm_amt,l_precision);
2135          l_tot_cum_norm_amt := l_tot_cum_norm_amt - l_prec_norm_amt_upd + l_prec_norm_amt;
2136       END IF;
2137 
2138       -- For last Item, adjust difference of Total Cash and Normalize amount
2139       -- so that sum of Cash and Normalize amounts are equal. (BUG# 2646928).
2140 
2141       l_tot_cum_diff_amt := (l_total_cash_amt - l_la_amt) - l_tot_cum_norm_amt;
2142       l_prec_norm_amt := ROUND(l_prec_norm_amt + l_tot_cum_diff_amt, l_precision);
2143 
2144       IF l_partial_end_flag = 'Y' OR l_tot_cum_diff_amt <> 0 THEN
2145          UPDATE pn_payment_items_all ppi
2146          SET    ppi.actual_amount = l_prec_norm_amt,
2147                 ppi.export_currency_amount = l_prec_norm_amt,
2148                 ppi.last_update_date = SYSDATE,
2149                 ppi.last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
2150                 ppi.last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
2151          WHERE  ppi.payment_schedule_id = (SELECT pps.payment_schedule_id
2152                                            FROM   pn_payment_schedules_all pps,
2153                                                   pn_payment_items_all ppi1
2154                                            WHERE  pps.payment_schedule_id = ppi1.payment_schedule_id
2155                                            AND    pps.payment_status_lookup_code = 'DRAFT'
2156                                            AND    ppi1.payment_term_id = p_term_id
2157                                            AND    ppi1.payment_item_type_lookup_code = 'NORMALIZED'
2158                                            AND    pps.schedule_date = l_last_sch_dt)
2159          AND    ppi.payment_item_type_lookup_code = 'NORMALIZED'
2160          AND    ppi.payment_term_id = p_term_id;
2161       END IF;
2162 
2163    END IF;
2164 
2165     -- Added for BUG#2590872
2166     UPDATE pn_payment_terms_all
2167     SET event_type_code = p_lease_context
2168     WHERE normalize ='Y'
2169     AND   payment_term_id = p_term_id;
2170 
2171    ELSE -- Exit create_normalize_items.
2172       pnp_debug_pkg.log('create_normalize_items - Exit, No need to Normalize... l_norm_mths : '
2173                         ||TO_CHAR(l_norm_mths));
2174    END IF; -- Exit create_normalize_items.
2175 
2176    pnp_debug_pkg.log('create_normalize_items -End- (-)');
2177 
2178 END create_normalize_items;
2179 
2180 
2181 -------------------------------------------------------------------------------
2182 --  PROCEDURE  : PROCESS_TERM
2183 --  DESCRIPTION: This procedure creates Schedules and Cash Items for a given Term.
2184 --               It collects information for all schedules, get cash amount and
2185 --               creates the cash item, if term is normalized, then create
2186 --               Normalize Item as well.
2187 --  25-JUN-01  MMisra    o Created.
2188 --             MMisra    o For a payment term of type 'Pre payment' also create
2189 --                         the payment item for the reversal entry.
2190 --  30-JAN-02  STripathi o Added condition l_pre_pay_flag = 'N' to ensure
2191 --                         that 'Pre Payment' item is created only once.
2192 --  07-FEB-02  STripathi o Added added parameter p_norm_str_dt. Added condition
2193 --                         for Lease Context ADDAMD to set correct normalize
2194 --                         start date.
2195 --  26-MAR-02  STripathi o Added parameter p_sch_str_dt to correctly point the
2196 --                         Schedule-Start-Date for NON MONTHLY Payment Term.
2197 --  26-APR-02  ftanudja  o Added parameter p_rate
2198 --  08-Nov-02  Ashish      BUG#2657736 added the nvl(p_act_amt,p_est_amt for
2199 --                         the condition where p_freq_code = 'OT'
2200 --  16-OCT-03  STripathi o Fix for BUG# 3201091. Added parameter p_lease_change_id,
2201 --                         to use instead of g_lc_id.
2202 --  15-MAR-06  piagrawa  o Bug 5085901 - Modified to calculate l_sch_end_dt
2203 --                         taking care if the schedule date is last date of
2204 --                         month.
2205 --  27-NOV-06  Hareesha  o Passed p_payment_term_id to call to create_schedules.
2206 --  28-NOV-08  acprakas  o Bug#7585368. Modified not to create extra payment item
2207 --                         for annual term.
2208 --  20-FEB-2009 acprakas o Bug#8274729. Modified to set l_sch_start_dt to
2209 --                                   first day of term start date in case of monthly term
2210 --                                   also not to modify it unless one cash item has been
2211 --                                   generated.
2212 -------------------------------------------------------------------------------
2213 PROCEDURE process_term (p_no_sch               NUMBER,
2214                         p_counter              NUMBER,
2215                         p_sch_dt               DATE,
2216                         p_pro_sch_dt           DATE,
2217                         p_new_lea_term_dt      DATE,
2218                         p_freq                 NUMBER,
2219                         p_freq_code            VARCHAR2,
2220                         p_payment_term_id      NUMBER,
2221                         p_pay_trm_typ_code     VARCHAR2,
2222                         p_trgt_dt              DATE,
2223                         p_normalize_flag       VARCHAR2,
2224                         p_lease_context        VARCHAR2,
2225                         p_mths                 NUMBER,
2226                         p_vendor_id            NUMBER,
2227                         p_customer_id          NUMBER,
2228                         p_vendor_site_id       NUMBER,
2229                         p_customer_site_use_id NUMBER,
2230                         p_cust_ship_site_id    NUMBER,
2231                         p_set_of_books_id      NUMBER,
2232                         p_currency_code        VARCHAR2,
2233                         p_rate                 NUMBER,
2234                         p_term_start_date      DATE,
2235                         p_term_end_date        DATE,
2236                         p_sch_str_dt           DATE,
2237                         p_act_amt              NUMBER,
2238                         p_est_amt              NUMBER,
2239                         p_index_prd_id         NUMBER,
2240                         p_norm_str_dt          DATE,
2241                         p_lease_change_id      NUMBER)
2242 IS
2243 
2244    l_cash_act_amt                  pn_payment_items.actual_amount%TYPE := 0;
2245    l_cash_est_amt                  pn_payment_items.estimated_amount%TYPE := 0;
2246    l_sch_id                        pn_payment_schedules.payment_schedule_id%TYPE;
2247    l_sch_str_dt                    DATE := NULL;
2248    l_sch_end_dt                    DATE := NULL;
2249    l_sch_dt                        pn_payment_schedules.schedule_date%TYPE;
2250    l_pro_sch_dt                    pn_payment_schedules.schedule_date%TYPE;
2251    l_app_sch                       NUMBER;
2252    l_norm_mths                     NUMBER;
2253    l_sch_day                       VARCHAR2(240);
2254    l_pymnt_st_lkp_cd               pn_payment_schedules.payment_status_lookup_code%TYPE;
2255    l_pre_pay_flag                  VARCHAR2(1) := 'N';
2256    l_next_cash_duration_dt         DATE := NULL;
2257    l_prev_sch_str_dt               DATE := NULL;
2258    l_tmp_sch_str_dt                DATE := NULL;
2259    l_tmp_next_cash_duration_dt     DATE := null;
2260    l_perv_next_cash_duration_dt    DATE := null;
2261    l_first_cash_flag  VARCHAR2(1) := 'N';
2262 BEGIN
2263 
2264    pnp_debug_pkg.log('process_term +Start+ (+) - p_payment_term_id: '
2265                      ||TO_CHAR(p_payment_term_id)
2266                      ||', p_lease_context : '||p_lease_context);
2267    pnp_debug_pkg.log('process_term IN: p_no_sch                 : '||p_no_sch);
2268    pnp_debug_pkg.log('process_term IN: p_counter                : '||p_counter);
2269    pnp_debug_pkg.log('process_term IN: p_sch_dt                 : '||p_sch_dt);
2270    pnp_debug_pkg.log('process_term IN: p_pro_sch_dt             : '||p_pro_sch_dt);
2271    pnp_debug_pkg.log('process_term IN: p_new_lea_term_dt        : '||p_new_lea_term_dt);
2272    pnp_debug_pkg.log('process_term IN: p_freq                   : '||p_freq);
2273    pnp_debug_pkg.log('process_term IN: p_freq_code              : '||p_freq_code);
2274    pnp_debug_pkg.log('process_term IN: p_payment_term_id        : '||p_payment_term_id);
2275    pnp_debug_pkg.log('process_term IN: p_pay_trm_typ_code       : '||p_pay_trm_typ_code);
2276    pnp_debug_pkg.log('process_term IN: p_trgt_dt                : '||p_trgt_dt);
2277    pnp_debug_pkg.log('process_term IN: p_normalize_flag         : '||p_normalize_flag);
2278    pnp_debug_pkg.log('process_term IN: p_lease_context          : '||p_lease_context);
2279    pnp_debug_pkg.log('process_term IN: p_mths                   : '||p_mths);
2280    pnp_debug_pkg.log('process_term IN: p_vendor_id              : '||p_vendor_id);
2281    pnp_debug_pkg.log('process_term IN: p_customer_id            : '||p_customer_id);
2282    pnp_debug_pkg.log('process_term IN: p_vendor_site_id         : '||p_vendor_site_id);
2283    pnp_debug_pkg.log('process_term IN: p_customer_site_use_id   : '||p_customer_site_use_id);
2284    pnp_debug_pkg.log('process_term IN: p_cust_ship_site_id      : '||p_cust_ship_site_id);
2285    pnp_debug_pkg.log('process_term IN: p_set_of_books_id        : '||p_set_of_books_id);
2286    pnp_debug_pkg.log('process_term IN: p_currency_code          : '||p_currency_code);
2287    pnp_debug_pkg.log('process_term IN: p_rate                   : '||p_rate);
2288    pnp_debug_pkg.log('process_term IN: p_term_start_date        : '||p_term_start_date);
2289    pnp_debug_pkg.log('process_term IN: p_term_end_date          : '||p_term_end_date);
2290    pnp_debug_pkg.log('process_term IN: p_sch_str_dt             : '||p_sch_str_dt);
2291    pnp_debug_pkg.log('process_term IN: p_act_amt                : '||p_act_amt);
2292    pnp_debug_pkg.log('process_term IN: p_est_amt                : '||p_est_amt);
2293    pnp_debug_pkg.log('process_term IN: p_index_prd_id           : '||p_index_prd_id);
2294    pnp_debug_pkg.log('process_term IN: p_norm_str_dt            : '||p_norm_str_dt);
2295    pnp_debug_pkg.log('process_term IN: p_lease_change_id        : '||p_lease_change_id);
2296 
2297    /* Initialize the schedule date */
2298 
2299    l_sch_dt := p_sch_dt;
2300    l_sch_day := TO_CHAR(l_sch_dt,'DD');
2301 
2302    l_pro_sch_dt := p_pro_sch_dt;
2303 
2304 
2305    IF p_freq_code = 'OT' THEN
2306 
2307       l_sch_str_dt := FIRST_DAY(l_sch_dt);
2308 
2309   ELSIF   p_freq_code =  'MON' THEN
2310 
2311 	l_sch_str_dt := FIRST_DAY(p_term_start_date);
2312 
2313    ELSE
2314 
2315        l_sch_str_dt := p_sch_str_dt;
2316 
2317    END IF;
2318 
2319    pnp_debug_pkg.log('process_term (+) - l_sch_str_dt: '||l_sch_str_dt
2320                      ||', l_pro_sch_dt: '||l_pro_sch_dt);
2321 
2322    l_next_cash_duration_dt := l_sch_str_dt;
2323 
2324    FOR i IN (p_counter + 1) .. p_no_sch
2325    LOOP
2326 
2327       /* AMT-RETRO */
2328       IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
2329         create_schedule(g_lease_id, p_lease_change_id, l_sch_dt, l_sch_id, l_pymnt_st_lkp_cd,p_payment_term_id);
2330       ELSE
2331         PN_RETRO_ADJUSTMENT_PKG.find_schedule(g_lease_id,
2332                                               p_lease_change_id,
2333                                               p_payment_term_id,
2334                                               l_sch_dt,
2335                                               l_sch_id);
2336         l_pymnt_st_lkp_cd := 'DRAFT';
2337       END IF;
2338 
2339       IF p_freq_code IN ('MON', 'OT') THEN
2340          l_sch_end_dt := LAST_DAY(l_sch_dt);
2341       ELSE
2342          IF last_day(l_sch_str_dt) = l_sch_str_dt
2343          THEN
2344          /* last day of month */
2345             l_sch_end_dt := ADD_MONTHS(l_sch_str_dt - 1, p_freq);
2346          ELSE
2347             l_sch_end_dt := ADD_MONTHS(l_sch_str_dt, p_freq) -1;
2348          END IF;
2349       END IF;
2350 
2351       IF p_lease_context = 'EXP' THEN
2352 
2353           /* If the context is 'EXP' i.e. expansion then the cash items should be
2354              created with zero amounts */
2355 
2356          IF p_index_prd_id IS NULL THEN
2357 
2358              l_cash_est_amt := NULL;
2359              l_cash_act_amt := 0;
2360 
2361          ELSE
2362 
2363             IF l_sch_dt = l_pro_sch_dt and l_sch_str_dt = l_next_cash_duration_dt THEN
2364 
2365                get_amount(p_sch_str_dt    => l_sch_str_dt,
2366                           p_sch_end_dt    => l_sch_end_dt,
2367                           p_trm_str_dt    => p_term_start_date,
2368                           p_trm_end_dt    => p_term_end_date,
2369                           p_act_amt       => p_act_amt,
2370                           p_est_amt       => p_est_amt,
2371                           p_freq          => p_freq,
2372                           p_cash_act_amt  => l_cash_act_amt,
2373                           p_cash_est_amt  => l_cash_est_amt);
2374 
2375                /* Get the next schedule date which will have non zero amount */
2376 
2377                l_pro_sch_dt := TO_DATE(l_sch_day||'/'||TO_CHAR(ADD_MONTHS(l_pro_sch_dt,p_freq),
2378                                                                'MM/YYYY'),'DD/MM/YYYY');
2379 
2380 
2381           IF p_normalize_flag = 'Y' THEN
2382                FOR i in 1..p_freq
2383                LOOP
2384 	          l_tmp_next_cash_duration_dt := l_next_cash_duration_dt;
2385 
2386 		  IF to_char(l_next_cash_duration_dt,'MON') = 'FEB' AND to_number(to_char(l_next_cash_duration_dt,'DD')) < to_number(to_char(l_perv_next_cash_duration_dt,'DD'))
2387                   THEN
2388                       l_next_cash_duration_dt := TO_DATE(to_char(l_perv_next_cash_duration_dt,'DD') || '/' ||TO_CHAR(ADD_MONTHS(l_next_cash_duration_dt, 1),
2389                                                      'MM/YYYY'),'DD/MM/YYYY');
2390                   ELSIF last_day(l_next_cash_duration_dt) = l_next_cash_duration_dt
2391                   THEN
2392                       l_next_cash_duration_dt := ADD_MONTHS(l_next_cash_duration_dt - 1, 1) + 1;
2393                   ELSE
2394                       l_next_cash_duration_dt := ADD_MONTHS(l_next_cash_duration_dt, 1);
2395                   END IF;
2396 		  l_perv_next_cash_duration_dt := l_tmp_next_cash_duration_dt;
2397                END LOOP;
2398 
2399            ELSIF (NVL(p_normalize_flag,'N') <> 'Y') THEN
2400 
2401               IF last_day(l_next_cash_duration_dt) = l_next_cash_duration_dt
2402               THEN
2403                   l_next_cash_duration_dt := ADD_MONTHS(l_next_cash_duration_dt - 1, p_freq) + 1;
2404 	      ELSE
2405                   l_next_cash_duration_dt := ADD_MONTHS(l_next_cash_duration_dt, p_freq);
2406               END IF;
2407            END IF;
2408 
2409 
2410             ELSE
2411 
2412                /* Set the amounts to zero */
2413 
2414                l_cash_act_amt := 0;
2415                l_cash_est_amt := NULL;
2416 
2417             END IF;
2418 
2419             pnp_debug_pkg.log('process_term - l_cash_act_amt: '||TO_CHAR(l_cash_act_amt));
2420             pnp_debug_pkg.log('process_term - l_cash_est_amt: '||TO_CHAR(l_cash_est_amt));
2421          END IF;
2422 
2423       ELSIF p_lease_context IN ('ADDEDT', 'ADDAMD', 'ADD', 'ABS') THEN
2424 
2425          /* If schedule date is equal to the schedule date which
2426             should have a non zero amount then get the amounts */
2427 
2428 -- Bug 8270739         IF l_sch_dt = l_pro_sch_dt and l_sch_str_dt = l_next_cash_duration_dt THEN
2429 
2430          IF l_sch_dt = l_pro_sch_dt THEN
2431 
2432             IF p_freq_code = 'OT' THEN
2433 
2434                /* For 'One Time' payment, the payment item amounts will
2435                   be same as the payment term amounts. */
2436 
2437                l_cash_est_amt := p_est_amt;
2438                l_cash_act_amt :=nvl(p_act_amt,p_est_amt);--Bug#2657736 added nvl
2439 
2440                pnp_debug_pkg.log('process_term - l_cash_act_amt: '||TO_CHAR(l_cash_act_amt));
2441                pnp_debug_pkg.log('process_term - l_cash_est_amt: '||TO_CHAR(l_cash_est_amt));
2442 
2443             ELSE
2444 	     IF l_sch_str_dt = l_next_cash_duration_dt THEN
2445                pnp_debug_pkg.log('process_term - Calling get_amount, sch st dt    : '
2446                                   ||TO_CHAR(l_sch_str_dt,'MM/DD/YYYY'));
2447                pnp_debug_pkg.log('process_term - Calling get_amount, sch end dt   : '
2448                                   ||TO_CHAR(l_sch_end_dt,'MM/DD/YYYY'));
2449                pnp_debug_pkg.log('process_term - Calling get_amount, term st dt   : '
2450                                   ||TO_CHAR(p_term_start_date,'MM/DD/YYYY'));
2451                pnp_debug_pkg.log('process_term - Calling get_amount, term end dt  : '
2452                                   ||TO_CHAR(p_term_end_date,'MM/DD/YYYY'));
2453                pnp_debug_pkg.log('process_term - Calling get_amount, act amt      : '
2454                                   ||TO_CHAR(p_act_amt));
2455                pnp_debug_pkg.log('process_term - Calling get_amount, est amt      : '
2456                                   ||TO_CHAR(p_est_amt));
2457                pnp_debug_pkg.log('process_term - Calling get_amount, est amt      : '
2458                                   ||TO_CHAR(p_freq));
2459 
2460 		l_first_cash_flag := 'Y';
2461 
2462                get_amount(p_sch_str_dt    => l_sch_str_dt,
2463                           p_sch_end_dt    => l_sch_end_dt,
2464                           p_trm_str_dt    => p_term_start_date,
2465                           p_trm_end_dt    => p_term_end_date,
2466                           p_act_amt       => p_act_amt,
2467                           p_est_amt       => p_est_amt,
2468                           p_freq          => p_freq,
2469                           p_cash_act_amt  => l_cash_act_amt,
2470                           p_cash_est_amt  => l_cash_est_amt);
2471 
2472                pnp_debug_pkg.log('process_term - Returned from get_amount, cash act amt: '
2473                                   ||TO_CHAR(l_cash_act_amt));
2474                pnp_debug_pkg.log('process_term - Returned from get_amount, cash est amt: '
2475                                   ||TO_CHAR(l_cash_est_amt));
2476 
2477                /* Get the next schedule date which will have non zero amount */
2478 
2479                l_pro_sch_dt := TO_DATE(l_sch_day||'/'||TO_CHAR(ADD_MONTHS(l_pro_sch_dt,p_freq),
2480                                                                'MM/YYYY'),'DD/MM/YYYY');
2481 
2482               IF p_normalize_flag = 'Y' THEN
2483                FOR i in 1..p_freq
2484                LOOP
2485 	          l_tmp_next_cash_duration_dt := l_next_cash_duration_dt;
2486 
2487 		  IF to_char(l_next_cash_duration_dt,'MON') = 'FEB' AND to_number(to_char(l_next_cash_duration_dt,'DD')) < to_number(to_char(l_perv_next_cash_duration_dt,'DD'))
2488                   THEN
2489                       l_next_cash_duration_dt := TO_DATE(to_char(l_perv_next_cash_duration_dt,'DD') || '/' ||TO_CHAR(ADD_MONTHS(l_next_cash_duration_dt, 1),
2490                                                      'MM/YYYY'),'DD/MM/YYYY');
2491                   ELSIF last_day(l_next_cash_duration_dt) = l_next_cash_duration_dt
2492                   THEN
2493                       l_next_cash_duration_dt := ADD_MONTHS(l_next_cash_duration_dt - 1, 1) + 1;
2494                   ELSE
2495                       l_next_cash_duration_dt := ADD_MONTHS(l_next_cash_duration_dt, 1);
2496                   END IF;
2497 		  l_perv_next_cash_duration_dt := l_tmp_next_cash_duration_dt;
2498                END LOOP;
2499 
2500            ELSIF (NVL(p_normalize_flag,'N') <> 'Y') THEN
2501 
2502               IF last_day(l_next_cash_duration_dt) = l_next_cash_duration_dt
2503               THEN
2504                   l_next_cash_duration_dt := ADD_MONTHS(l_next_cash_duration_dt - 1, p_freq) + 1;
2505 	      ELSE
2506                   l_next_cash_duration_dt := ADD_MONTHS(l_next_cash_duration_dt, p_freq);
2507               END IF;
2508            END IF;
2509 
2510             END IF; --Bug 8270739.
2511             END IF;
2512 
2513          ELSE
2514 
2515             /* Set the amounts to zero */
2516 
2517             l_cash_act_amt := 0;
2518             l_cash_est_amt := NULL;
2519 
2520             pnp_debug_pkg.log('process_term - l_cash_act_amt: '||TO_CHAR(l_cash_act_amt));
2521             pnp_debug_pkg.log('process_term - l_cash_est_amt: '||TO_CHAR(l_cash_est_amt));
2522 
2523          END IF;
2524 
2525 
2526       END IF;
2527 
2528 
2529       IF l_pymnt_st_lkp_cd = 'DRAFT' THEN
2530 
2531          create_cash_items(p_est_amt           => l_cash_est_amt,
2532                            p_act_amt           => l_cash_act_amt,
2533                            p_sch_dt            => l_sch_dt,
2534                            p_sch_id            => l_sch_id,
2535                            p_term_id           => p_payment_term_id,
2536                            p_vendor_id         => p_vendor_id,
2537                            p_cust_id           => p_customer_id,
2538                            p_vendor_site_id    => p_vendor_site_id,
2539                            p_cust_site_use_id  => p_customer_site_use_id,
2540                            p_cust_ship_site_id => p_cust_ship_site_id,
2541                            p_sob_id            => p_set_of_books_id,
2542                            p_curr_code         => p_currency_code,
2543                            p_rate              => p_rate);
2544       END IF;
2545 
2546       IF p_pay_trm_typ_code = 'PRE' AND l_pre_pay_flag = 'N'
2547          AND (l_sch_dt = l_pro_sch_dt) THEN
2548 
2549          /* AMT-RETRO */
2550          IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
2551            create_schedule(g_lease_id, p_lease_change_id, p_trgt_dt, l_sch_id, l_pymnt_st_lkp_cd);
2552          ELSE
2553            PN_RETRO_ADJUSTMENT_PKG.find_schedule(g_lease_id,
2554                                                  p_lease_change_id,
2555                                                  p_payment_term_id,
2556                                                  p_trgt_dt,
2557                                                  l_sch_id);
2558            l_pymnt_st_lkp_cd := 'DRAFT';
2559          END IF;
2560 
2561          /* Insert the Negation/Adjustment amount with different sign */
2562 
2563          IF l_pymnt_st_lkp_cd = 'DRAFT' THEN
2564 
2565             create_cash_items(p_est_amt           => (-1 * l_cash_est_amt),
2566                               p_act_amt           => (-1 * l_cash_act_amt),
2567                               p_sch_dt            => p_trgt_dt,
2568                               p_sch_id            => l_sch_id,
2569                               p_term_id           => p_payment_term_id,
2570                               p_vendor_id         => p_vendor_id,
2571                               p_cust_id           => p_customer_id,
2572                               p_vendor_site_id    => p_vendor_site_id,
2573                               p_cust_site_use_id  => p_customer_site_use_id,
2574                               p_cust_ship_site_id => p_cust_ship_site_id,
2575                               p_sob_id            => p_set_of_books_id,
2576                               p_curr_code         => p_currency_code,
2577                               p_rate              => p_rate);
2578 
2579             l_pre_pay_flag := 'Y';
2580 
2581          END IF;
2582 
2583       END IF;
2584 
2585       /*--------------------------------------------------------------
2586        Get the next schedule date. In case of normalized term, monthly
2587        schedules will be created and in case of terms that are not
2588        normalized schedules will be created depending upon the
2589        frequency of the term.
2590        --------------------------------------------------------------*/
2591 
2592       /* For Normalize Term, next Schedule-Start-Date is next month.
2593          For Not Normalize Term, next Schedule-Start-Date is after p_freq months. */
2594 
2595       IF p_normalize_flag = 'Y' THEN
2596 
2597 
2598          l_sch_dt := TO_DATE(l_sch_day||'/'||TO_CHAR(ADD_MONTHS(l_sch_dt, 1),
2599                                                      'MM/YYYY'),'DD/MM/YYYY');
2600          IF  l_first_cash_flag = 'Y' THEN
2601 	 l_tmp_sch_str_dt := l_sch_str_dt;
2602 
2603 	 IF to_char(l_sch_str_dt,'MON') = 'FEB' AND to_number(to_char(l_sch_str_dt,'DD')) < to_number(to_char(l_prev_sch_str_dt,'DD'))
2604 	 THEN
2605 	     l_sch_str_dt := TO_DATE(to_char(l_prev_sch_str_dt,'DD') || '/' ||TO_CHAR(ADD_MONTHS(l_sch_str_dt, 1),
2606                                                      'MM/YYYY'),'DD/MM/YYYY');
2607          ELSIF last_day(l_sch_str_dt) = l_sch_str_dt
2608          THEN
2609             l_sch_str_dt := ADD_MONTHS(l_sch_str_dt - 1, 1) + 1;
2610          ELSE
2611             l_sch_str_dt := ADD_MONTHS(l_sch_str_dt, 1);
2612          END IF;
2613 
2614          l_prev_sch_str_dt := l_tmp_sch_str_dt;
2615        END IF;
2616 
2617       ELSIF (NVL(p_normalize_flag,'N') <> 'Y') THEN
2618 
2619          l_sch_dt := TO_DATE(l_sch_day||'/'||TO_CHAR(ADD_MONTHS(l_sch_dt, p_freq),
2620                                                      'MM/YYYY'),'DD/MM/YYYY');
2621          IF last_day(l_sch_str_dt) = l_sch_str_dt
2622          THEN
2623             l_sch_str_dt := ADD_MONTHS(l_sch_str_dt - 1, p_freq) + 1;
2624          ELSE
2625             l_sch_str_dt := ADD_MONTHS(l_sch_str_dt, p_freq);
2626          END IF;
2627 
2628       END IF;
2629 
2630    END LOOP;
2631 
2632    pnp_debug_pkg.log('process_term - Cash Items Completed, Normalize = '
2633                       ||NVL(p_normalize_flag,'N')||', p_lease_context : '||p_lease_context);
2634 
2635 
2636    IF NVL(p_normalize_flag,'N') = 'Y' THEN
2637 
2638       /* AMT-RETRO */
2639       IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
2640         create_normalize_items(p_lease_context      => p_lease_context,
2641                                p_lease_id           => g_lease_id,
2642                                p_term_id            => p_payment_term_id,
2643                                p_vendor_id          => p_vendor_id,
2644                                p_cust_id            => p_customer_id,
2645                                p_vendor_site_id     => p_vendor_site_id,
2646                                p_cust_site_use_id   => p_customer_site_use_id,
2647                                p_cust_ship_site_id  => p_cust_ship_site_id,
2648                                p_sob_id             => p_set_of_books_id,
2649                                p_curr_code          => p_currency_code,
2650                                p_sch_day            => l_sch_day,
2651                                p_norm_str_dt        => p_norm_str_dt,
2652                                p_norm_end_dt        => g_new_lea_term_dt,
2653                                p_rate               => p_rate,
2654                                p_lease_change_id    => p_lease_change_id);
2655       ELSE
2656         PN_NORM_RENORM_PKG.NORMALIZE_RENORMALIZE
2657                                (p_lease_context      => p_lease_context,
2658                                 p_lease_id           => g_lease_id,
2659                                 p_term_id            => p_payment_term_id,
2660                                 p_vendor_id          => p_vendor_id,
2661                                 p_cust_id            => p_customer_id,
2662                                 p_vendor_site_id     => p_vendor_site_id,
2663                                 p_cust_site_use_id   => p_customer_site_use_id,
2664                                 p_cust_ship_site_id  => p_cust_ship_site_id,
2665                                 p_sob_id             => p_set_of_books_id,
2666                                 p_curr_code          => p_currency_code,
2667                                 p_sch_day            => l_sch_day,
2668                                 p_norm_str_dt        => p_norm_str_dt,
2669                                 p_norm_end_dt        => g_new_lea_term_dt,
2670                                 p_rate               => p_rate,
2671                                 p_lease_change_id    => p_lease_change_id);
2672       END IF;
2673 
2674    END IF;
2675 
2676    pnp_debug_pkg.log('process_term -End- (-)');
2677 
2678 END process_term;
2679 
2680 --------------------------------------------------------------------------------------------
2681 --  PROCEDURE  : UPDATE_CASH_ITEM
2682 --  DESCRIPTION: This procedure is used in contracting last schedule of a given term/lease.
2683 --               It updates last Cash Item by updating table PN_PAYMENT_ITEMS with the new
2684 --               prorated amount calculated by procedure GET_AMOUNT..
2685 -- 01-FEB-02  Satish Tripathi o Created.
2686 -- 07-OCT-02  Satish Tripathi o Added payment_status_lookup_code = 'DRAFT' in Update Stmt.
2687 --                                Fix for BUG# 2551423.
2688 -- 24-NOV-05  Kiran           o Round amounts befor insert/uptdate into terms OR items.
2689 --------------------------------------------------------------------------------------------
2690 PROCEDURE update_cash_item (p_term_id       NUMBER,
2691                             p_term_str_dt   DATE,
2692                             p_term_end_dt   DATE,
2693                             p_schedule_dt   DATE,
2694                             p_sch_str_dt    DATE,
2695                             p_sch_end_dt    DATE,
2696                             p_act_amt       NUMBER,
2697                             p_est_amt       NUMBER,
2698                             p_freq          NUMBER)
2699 IS
2700 
2701    l_cash_act_amt                  NUMBER;
2702    l_cash_est_amt                  NUMBER;
2703 
2704    l_precision                    NUMBER;
2705    l_ext_precision                NUMBER;
2706    l_min_acct_unit                NUMBER;
2707 
2708    CURSOR currency_cur IS
2709      SELECT currency_code FROM pn_payment_terms_all WHERE payment_term_id = p_term_id;
2710 
2711 BEGIN
2712 
2713    pnp_debug_pkg.log('update_cash_item +Start+ (+)');
2714    pnp_debug_pkg.log('update_cash_item IN: p_term_id     : '||p_term_id);
2715    pnp_debug_pkg.log('update_cash_item IN: p_term_str_dt : '||p_term_str_dt);
2716    pnp_debug_pkg.log('update_cash_item IN: p_term_end_dt : '||p_term_end_dt);
2717    pnp_debug_pkg.log('update_cash_item IN: p_schedule_dt : '||p_schedule_dt);
2718    pnp_debug_pkg.log('update_cash_item IN: p_sch_str_dt  : '||p_sch_str_dt);
2719    pnp_debug_pkg.log('update_cash_item IN: p_sch_end_dt  : '||p_sch_end_dt);
2720    pnp_debug_pkg.log('update_cash_item IN: p_act_amt     : '||p_act_amt);
2721    pnp_debug_pkg.log('update_cash_item IN: p_est_amt     : '||p_est_amt);
2722    pnp_debug_pkg.log('update_cash_item IN: p_freq        : '||p_freq);
2723    /* Get the new amount for the schedule */
2724 
2725    get_amount(p_sch_str_dt    => p_sch_str_dt,
2726               p_sch_end_dt    => p_sch_end_dt,
2727               p_trm_str_dt    => p_term_str_dt,
2728               p_trm_end_dt    => p_term_end_dt,
2729               p_act_amt       => p_act_amt,
2730               p_est_amt       => p_est_amt,
2731               p_freq          => p_freq,
2732               p_cash_act_amt  => l_cash_act_amt,
2733               p_cash_est_amt  => l_cash_est_amt);
2734 
2735    /* update the cash amount for the schedule */
2736    FOR rec IN currency_cur LOOP
2737       fnd_currency.get_info( currency_code => rec.currency_code
2738                             ,precision     => l_precision
2739                             ,ext_precision => l_ext_precision
2740                             ,min_acct_unit => l_min_acct_unit);
2741    END LOOP;
2742    l_cash_act_amt := ROUND(l_cash_act_amt, l_precision);
2743    l_cash_est_amt := ROUND(l_cash_est_amt, l_precision);
2744 
2745    UPDATE pn_payment_items_all
2746    SET    estimated_amount = l_cash_est_amt,
2747           actual_amount    = l_cash_act_amt,
2748           export_currency_amount = l_cash_act_amt,
2749           last_update_date = SYSDATE,
2750           last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
2751           last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
2752    WHERE  payment_item_id  = (SELECT ppi1.payment_item_id
2753                               FROM   pn_payment_items_all ppi1,
2754                                      pn_payment_schedules_all pps
2755                               WHERE  ppi1.payment_term_id = p_term_id
2756                               AND    ppi1.payment_item_type_lookup_code = 'CASH'
2757                               AND    pps.payment_status_lookup_code = 'DRAFT'
2758                               AND    pps.payment_schedule_id = ppi1.payment_schedule_id
2759                               AND    pps.schedule_date = p_schedule_dt);
2760 
2761    pnp_debug_pkg.log('update_cash_item -End- (-)');
2762 
2763 END update_cash_item;
2764 
2765 -------------------------------------------------------------------------------
2766 --  PROCEDURE  : RECALCULATE_CASH
2767 --  DESCRIPTION: This procedure is used to contract a given lease. All payment
2768 --               terms of the lease are contracted, Cash Items are deleted.
2769 --               The last Cash Item is recalculated and updated by calling
2770 --               procedure UPDATE_CASH_ITEM.
2771 --  25-JUN-2001  Mrinal Misra    o Created.
2772 --  07-JAN-2002  Mrinal Misra    o Added condition "IF l_schedule_date
2773 --                                 IS NOT NULL", since l_schedule_date can be
2774 --                                 null if no approved DRAFT schedules
2775 --                                 are found, hence getting to the end of the
2776 --                                 loop.
2777 --  26-MAR-2002  Satish Tripathi o Added condition to correctly point the
2778 --                                 l_sch_str_dt Schedule-Start-Date) for
2779 --                                 NON MONTHLY Payment Term.
2780 --  03-OCT-2005  pikhar          o Added frequency_code check to cursor
2781 --                                 get_terms
2782 -------------------------------------------------------------------------------
2783 PROCEDURE recalculate_cash (p_new_lease_term_date DATE)
2784 IS
2785 
2786    l_sch_str_dt                    DATE;
2787    l_sch_end_dt                    DATE;
2788    l_schedule_date                 DATE;
2789    l_cash_est_amt                  pn_payment_items.estimated_amount%TYPE;
2790    l_cash_act_amt                  pn_payment_items.actual_amount%TYPE;
2791    l_frequency                     NUMBER;
2792 
2793    CURSOR get_terms IS
2794       SELECT payment_term_id,
2795              start_date,
2796              end_date,
2797              actual_amount,
2798              estimated_amount,
2799              frequency_code
2800       FROM   pn_payment_terms_all
2801       WHERE  lease_id = g_lease_id
2802       AND    end_date = p_new_lease_term_date
2803       AND    frequency_code <> 'OT';
2804 
2805    CURSOR get_last_schedule (p_payment_term_id NUMBER) IS
2806       SELECT MAX(schedule_date)
2807       FROM   pn_payment_schedules_all pps,
2808              pn_payment_items_all     ppi
2809       WHERE  ppi.payment_term_id = p_payment_term_id
2810       AND    ppi.payment_item_type_lookup_code = 'CASH'
2811       AND    ppi.actual_amount <> 0
2812       AND    pps.payment_schedule_id = ppi.payment_schedule_id
2813       AND    pps.payment_status_lookup_code = 'DRAFT';
2814 
2815 BEGIN
2816 
2817    pnp_debug_pkg.log('recalculate_cash +Start+ (+) IN: p_new_lease_term_date: '
2818                      ||p_new_lease_term_date);
2819    FOR term IN get_terms
2820    LOOP
2821 
2822       pnp_debug_pkg.log('recalculate_cash - Term Id : '||term.payment_term_id);
2823       /* get the last schedule with non zero amount */
2824 
2825       OPEN get_last_schedule (term.payment_term_id);
2826          FETCH get_last_schedule INTO l_schedule_date;
2827       CLOSE get_last_schedule;
2828 
2829       IF l_schedule_date IS NOT NULL THEN
2830 
2831          pnp_debug_pkg.log('recalculate_cash - l_schedule_date'||l_schedule_date);
2832 
2833          /* get the frequency */
2834 
2835          l_frequency := get_frequency(p_freq_code => term.frequency_code);
2836 
2837          /* get the applicable dates for the schedule */
2838 
2839          /* For Monthly and OT Term, Schedule-Start-Date is
2840             the First Day of the month of Schedule-Date.
2841             For Non Monthly Term, Schedule-Start-Date is
2842             Term Start Day of the month of the Schedule-Date. */
2843 
2844          IF term.frequency_code = 'MON' THEN
2845 
2846             l_sch_str_dt := First_Day(l_schedule_date);
2847             l_sch_end_dt := LAST_DAY(l_schedule_date);
2848 
2849          ELSE
2850 
2851             l_sch_str_dt := TO_DATE(TO_CHAR(term.start_date,'DD')||'/'
2852                                             ||TO_CHAR(l_schedule_date,'MM/YYYY')
2853                                     ,'DD/MM/YYYY');
2854             l_sch_end_dt := ADD_MONTHS(l_sch_str_dt, l_frequency)-1;
2855 
2856          END IF;
2857 
2858          update_cash_item(p_term_id       => term.payment_term_id,
2859                           p_term_str_dt   => term.start_date,
2860                           p_term_end_dt   => term.end_date,
2861                           p_schedule_dt   => l_schedule_date,
2862                           p_sch_str_dt    => l_sch_str_dt,
2863                           p_sch_end_dt    => l_sch_end_dt,
2864                           p_act_amt       => term.actual_amount,
2865                           p_est_amt       => term.estimated_amount,
2866                           p_freq          => l_frequency);
2867 
2868       END IF;
2869 
2870    END LOOP;
2871    pnp_debug_pkg.log('recalculate_cash -End- (-)');
2872 
2873 END recalculate_cash;
2874 
2875 
2876 --------------------------------------------------------------------------------------------
2877 --  PROCEDURE  : ADD_MAIN
2878 --  DESCRIPTION: This procedure is used to add a payment term in a given lease when lease is
2879 --               is added through EDIT or AMEND. GET_SCH_INFO gives information of the term,
2880 --               PROCESS_TERM creates schedules if required and the Cash / Normalized items.
2881 --  25-JUN-2001  Mrinal Misra    o Created.
2882 --  15-AUG-2001  Mrinal Misra    o Added calls to routine
2883 --                                 pn_index_rent_periods_pkg.process_payment_term_amendment.
2884 --  24-JAN-2002  Satish Tripathi o Removed the hard coding of p_lease_context being passed to
2885 --                                 GET_SCH_INFO and PROCESS_TERM.
2886 --  07-FEB-2002  Satish Tripathi o Added variable l_norm_str_dt to capture Normalize Start
2887 --                                 Date, if the term is added through AMEND.
2888 --  26-MAR-2002  Satish Tripathi o Added variable l_sch_str_dt to correctly point the
2889 --                                 Schedule-Start-Date for NON MONTHLY Payment Term.
2890 --  10-DEC-2002  graghuna        o Modified to update pn_payment_terms_all.norm_end_date
2891 --                                 for Month-to-Month Re-Normalization issue. --MTM-I
2892 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Conditionally pass lease_context
2893 --                                 depending on change_type_lookup_code of a particular term.
2894 --                                 Pass new parameter p_amd_comm_dt to get_sch_info and
2895 --                                 p_lease_change_id to process_term.
2896 --------------------------------------------------------------------------------------------
2897 PROCEDURE add_main (p_lease_id           NUMBER,
2898                     p_lease_context      VARCHAR2,
2899                     p_new_lea_term_dt    DATE,
2900                     p_new_lea_comm_dt    DATE,
2901                     p_mths               NUMBER)
2902 IS
2903 
2904    l_pro_sch_dt                    pn_payment_schedules.schedule_date%TYPE;
2905    l_no_sch                        NUMBER;
2906    l_freq                          NUMBER;
2907    l_counter                       NUMBER;
2908    l_sch_dt                        pn_payment_schedules.schedule_date%TYPE;
2909    l_msg                           VARCHAR2(2000);
2910    l_norm_str_dt                   DATE;
2911    l_sch_str_dt                    DATE;
2912    l_lease_context                 VARCHAR2(100);
2913 
2914 BEGIN
2915 
2916    pnp_debug_pkg.log('ADD_MAIN +Start+ (+)');
2917    pnp_debug_pkg.log('ADD_MAIN IN: p_lease_id           : '||p_lease_id);
2918    pnp_debug_pkg.log('ADD_MAIN IN: p_lease_context      : '||p_lease_context);
2919    pnp_debug_pkg.log('ADD_MAIN IN: p_new_lea_term_dt    : '||p_new_lea_term_dt);
2920    pnp_debug_pkg.log('ADD_MAIN IN: p_new_lea_comm_dt    : '||p_new_lea_comm_dt);
2921    pnp_debug_pkg.log('ADD_MAIN IN: p_mths               : '||p_mths);
2922    FOR add_main_cur IN term_add_main_cur(p_lease_id)
2923    LOOP
2924 
2925       IF add_main_cur.change_type_lookup_code = 'AMEND' THEN
2926          l_lease_context := 'ADDAMD';
2927       ELSIF add_main_cur.change_type_lookup_code = 'EDIT' THEN
2928          l_lease_context := 'ADDEDT';
2929       END IF;
2930 
2931       pnp_debug_pkg.log('ADD_MAIN lease_change_id: '||add_main_cur.lease_change_id
2932                         ||', l_lease_context: '||l_lease_context
2933                         ||', amd_comm_dt: '||add_main_cur.change_commencement_date);
2934 
2935       get_sch_info(p_lease_context            => l_lease_context,
2936                    p_normalize_flag           => add_main_cur.normalize,
2937                    p_mths                     => p_mths,
2938                    p_term_start_dt            => add_main_cur.start_date,
2939                    p_term_end_dt              => add_main_cur.end_date,
2940                    p_freq_code                => add_main_cur.frequency_code,
2941                    p_sch_day                  => add_main_cur.schedule_day,
2942                    p_new_lea_comm_dt          => p_new_lea_comm_dt,
2943                    p_new_lea_term_dt          => p_new_lea_term_dt,
2944                    p_old_lea_term_dt          => NULL,
2945                    p_no_sch                   => l_no_sch,
2946                    p_freq                     => l_freq,
2947                    p_counter                  => l_counter,
2948                    p_sch_dt                   => l_sch_dt,
2949                    p_pro_sch_dt               => l_pro_sch_dt,
2950                    p_sch_str_dt               => l_sch_str_dt,
2951                    p_norm_str_dt              => l_norm_str_dt,
2952                    p_lease_id                 => p_lease_id,
2953                    p_term_id                  => add_main_cur.payment_term_id,
2954                    p_amd_comm_dt              => add_main_cur.change_commencement_date);
2955 
2956       process_term(p_no_sch                   => l_no_sch,
2957                    p_counter                  => l_counter,
2958                    p_sch_dt                   => l_sch_dt,
2959                    p_pro_sch_dt               => l_pro_sch_dt,
2960                    p_new_lea_term_dt          => p_new_lea_term_dt ,
2961                    p_freq                     => l_freq,
2962                    p_freq_code                => add_main_cur.frequency_code,
2963                    p_payment_term_id          => add_main_cur.payment_term_id,
2964                    p_pay_trm_typ_code         => add_main_cur.payment_term_type_code,
2965                    p_trgt_dt                  => add_main_cur.target_date,
2966                    p_normalize_flag           => add_main_cur.normalize,
2967                    p_lease_context            => l_lease_context,
2968                    p_mths                     => p_mths,
2969                    p_vendor_id                => add_main_cur.vendor_id,
2970                    p_customer_id              => add_main_cur.customer_id,
2971                    p_vendor_site_id           => add_main_cur.vendor_site_id,
2972                    p_customer_site_use_id     => add_main_cur.customer_site_use_id,
2973                    p_cust_ship_site_id        => add_main_cur.cust_ship_site_id,
2974                    p_set_of_books_id          => add_main_cur.set_of_books_id,
2975                    p_currency_code            => add_main_cur.currency_code,
2976                    p_rate                     => add_main_cur.rate,
2977                    p_term_start_date          => add_main_cur.start_date,
2978                    p_term_end_date            => add_main_cur.end_date,
2979                    p_sch_str_dt               => l_sch_str_dt,
2980                    p_act_amt                  => add_main_cur.actual_amount,
2981                    p_est_amt                  => add_main_cur.estimated_amount,
2982                    p_index_prd_id             => NULL,
2983                    p_norm_str_dt              => l_norm_str_dt,
2984                    p_lease_change_id          => add_main_cur.lease_change_id);
2985 
2986       -- OT terms are not used in Index Rent calculations, ignore it.
2987       IF add_main_cur.frequency_code <> 'OT' THEN
2988 
2989          pn_index_rent_periods_pkg.process_payment_term_amendment(
2990                                    p_lease_id           => p_lease_id,
2991                                    p_payment_type_code  => add_main_cur.payment_term_type_code,
2992                                    p_payment_start_date => add_main_cur.start_date,
2993                                    p_payment_end_date   => add_main_cur.end_date,
2994                                    p_msg                => l_msg);
2995 
2996       END IF;
2997 
2998       IF add_main_cur.normalize = 'Y' THEN
2999          UPDATE pn_payment_terms_all
3000          SET    norm_start_date = NVL(l_norm_str_dt, p_new_lea_comm_dt),
3001                 norm_end_date   = g_new_lea_term_dt
3002          WHERE  payment_term_id = add_main_cur.payment_term_id;
3003       END IF;
3004 
3005    END LOOP;
3006    pnp_debug_pkg.log('ADD_MAIN -End- (-)');
3007 
3008 END add_main;
3009 
3010 
3011 --------------------------------------------------------------------------------------------
3012 --  FUNCTION   : LOCKED_AREA_EXPENSE_CLASS
3013 --  DESCRIPTION: This function checks if the area class of the associated area class with
3014 --               tenancy space assignment is locked or not.
3015 --  04-DEC-2003  Satish Tripathi o Created for BUG# 3284799.
3016 --------------------------------------------------------------------------------------------
3017 FUNCTION Locked_Area_Expense_Class (p_tenancy_id IN NUMBER,
3018                                     p_str_date   IN DATE,
3019                                     p_end_date   IN DATE)
3020 RETURN BOOLEAN
3021 IS
3022    l_exists                VARCHAR2(30) := 'N';
3023 BEGIN
3024    pnp_debug_pkg.log('LOCKED_AREA_EXPENSE_CLASS -Start- (+)');
3025 
3026    IF g_lease_class_code <> 'SUB_LEASE' THEN
3027 
3028       BEGIN
3029          SELECT 'Y'
3030          INTO   l_exists
3031          FROM   DUAL
3032          WHERE  EXISTS (SELECT NULL
3033                         FROM  pn_space_assign_cust_all psa
3034                         WHERE psa.tenancy_id = p_tenancy_id
3035                         AND  (EXISTS (SELECT NULL
3036                                       FROM   pn_rec_arcl_dtl_all   mst,
3037                                              pn_rec_arcl_dtlln_all dtl
3038                                       WHERE  mst.area_class_dtl_id = dtl.area_class_dtl_id
3039                                       AND    mst.status = 'LOCKED'
3040                                       AND    dtl.cust_space_assign_id = psa.cust_space_assign_id) OR
3041                               EXISTS (SELECT NULL
3042                                       FROM   pn_rec_expcl_dtl_all   mst,
3043                                              pn_rec_expcl_dtlln_all dtl
3044                                       WHERE  mst.expense_class_dtl_id = dtl.expense_class_dtl_id
3045                                       AND    mst.status = 'LOCKED'
3046                                       AND    dtl.cust_space_assign_id = psa.cust_space_assign_id))
3047                        );
3048       EXCEPTION
3049          WHEN OTHERS THEN
3050             l_exists := 'N';
3051       END;
3052 
3053    END IF;
3054 
3055    pnp_debug_pkg.log('LOCKED_AREA_EXPENSE_CLASS -End- (-) Return: '||l_exists);
3056    IF l_exists = 'Y' THEN
3057       RETURN TRUE;
3058    ELSE
3059       RETURN FALSE;
3060    END IF;
3061 
3062 END Locked_Area_Expense_Class;
3063 
3064 
3065 --------------------------------------------------------------------------------------------
3066 --  PROCEDURE  : CONTRACT_TENANCIES
3067 --  DESCRIPTION: This procedure is used to early terminate tenancies with Contraction.
3068 --               If these is associated area class with tenancy space assignment, Only that
3069 --               tenancy will not be early terminated and message will be logged.
3070 --  04-DEC-2003  Satish Tripathi o Created for BUG# 3284799.
3071 --  05-DEC-2003  Satish Tripathi o Pass p_cust_assign_end_dt as p_new_lea_term_dt when
3072 --                                 calling pn_tenancies_pkg.update_auto_space_assign.
3073 --                                 Update fin_oblig_end_date of pn_tenancies to p_new_lea_term_dt.
3074 --------------------------------------------------------------------------------------------
3075 PROCEDURE contract_tenancies(
3076                                 p_lease_id           NUMBER
3077                                ,p_new_lea_term_dt    DATE
3078                                 )
3079 IS
3080 
3081    l_tenancy_Id                    pn_tenancies_all.tenancy_id%TYPE;
3082    l_location_id                   pn_locations_all.location_id%TYPE;
3083    l_location_code                 pn_locations_all.location_code%TYPE;
3084    l_loc_type_code                 pn_locations_all.location_type_lookup_code%TYPE;
3085    l_action                        VARCHAR2(30) := NULL;
3086    l_message                       VARCHAR2(30) := NULL;
3087    l_tenancy_str_date              DATE;
3088    l_tenancy_end_date              DATE;
3089 
3090 
3091    CURSOR get_delete_tenancies_csr IS
3092       SELECT tenancy_id,
3093              location_id,
3094              occupancy_date,
3095              estimated_occupancy_date,
3096              expiration_date
3097       FROM   pn_tenancies_all pnt
3098       WHERE  pnt.lease_id = p_lease_id
3099       AND    NVL(pnt.occupancy_date, pnt.estimated_occupancy_date) > p_new_lea_term_dt;
3100 
3101    CURSOR get_update_tenancies_csr IS
3102       SELECT *
3103       FROM   pn_tenancies_all pnt
3104       WHERE  pnt.lease_id = p_lease_id
3105       AND    pnt.expiration_date > p_new_lea_term_dt;
3106 
3107    CURSOR get_location_type_csr (p_location_id NUMBER, p_start_date DATE) IS
3108       SELECT location_code,
3109              location_type_lookup_code
3110       FROM   pn_locations_all pnl
3111       WHERE  pnl.location_id = p_location_id
3112       AND    p_start_date BETWEEN pnl.active_start_date AND pnl.active_end_date;
3113 
3114 BEGIN
3115 
3116    pnp_debug_pkg.log('CONTRACT_TENANCIES of MAIN Lease +Start+ (+)');
3117    pnp_debug_pkg.log('CONTRACT_TENANCIES IN: p_lease_id        : '||p_lease_id);
3118    pnp_debug_pkg.log('CONTRACT_TENANCIES IN: p_new_lea_term_dt : '||p_new_lea_term_dt);
3119 
3120    FOR get_delete_tenancies IN get_delete_tenancies_csr
3121    LOOP
3122       l_action           := NULL;
3123       l_location_code    := NULL;
3124       l_loc_type_code    := NULL;
3125       l_location_id      := get_delete_tenancies.location_id;
3126       l_tenancy_Id       := get_delete_tenancies.tenancy_Id;
3127       l_tenancy_str_date := NVL(get_delete_tenancies.occupancy_date,
3128                                 get_delete_tenancies.estimated_occupancy_date);
3129       l_tenancy_end_date := get_delete_tenancies.expiration_date;
3130 
3131       pnp_debug_pkg.log('CON_TEN=>DEL : Deleting Tenancy_Id: '||l_tenancy_Id);
3132 
3133       OPEN get_location_type_csr(l_location_id, l_tenancy_str_date);
3134       FETCH get_location_type_csr INTO l_location_code, l_loc_type_code;
3135       CLOSE get_location_type_csr;
3136 
3137       IF Locked_Area_Expense_Class(l_tenancy_Id, l_tenancy_str_date, l_tenancy_end_date) THEN
3138          pnp_debug_pkg.put_log_msg('********************************************************************************');
3139          fnd_message.set_name ('PN','PN_SCHIT_LOCK_DEL');
3140          fnd_message.set_token ('LOC_CODE', l_location_code);
3141          fnd_message.set_token ('ODATE', l_tenancy_str_date);
3142          fnd_message.set_token ('EDATE', l_tenancy_end_date);
3143          pnp_debug_pkg.put_log_msg(fnd_message.get);
3144          pnp_debug_pkg.put_log_msg('********************************************************************************');
3145       ELSE
3146 
3147          pn_tenancies_pkg.delete_row(
3148                                 x_tenancy_id                    =>  get_delete_tenancies.tenancy_id
3149                                );
3150 
3151          pn_tenancies_pkg.delete_auto_space_assign(
3152                                 p_tenancy_id                    => get_delete_tenancies.tenancy_id
3153                                ,p_action                        => l_action
3154                                ,p_location_id                   => get_delete_tenancies.location_id
3155                                ,p_loc_type_code                 => l_loc_type_code
3156                                );
3157 
3158          pnp_debug_pkg.log('CON_TEN=>DEL : Tenancy and Space Assignments deleted. l_action:  '||l_action);
3159 
3160          IF l_action = 'R' THEN  --Regenerate
3161 
3162          pnp_debug_pkg.put_log_msg('********************************************************************************');
3163          fnd_message.set_name ('PN','PN_SCHIT_CUST');
3164          fnd_message.set_token ('LOC_CODE', l_location_code);
3165          fnd_message.set_token ('ODATE', l_tenancy_str_date);
3166          fnd_message.set_token ('EDATE', l_tenancy_end_date);
3167          pnp_debug_pkg.put_log_msg(fnd_message.get);
3168          pnp_debug_pkg.put_log_msg('********************************************************************************');
3169 
3170          END IF;
3171       END IF;
3172    END LOOP;
3173 
3174    pnp_debug_pkg.log('CON_TEN: Deleting Tenancies  complete. To Early Terminate Tenancies....');
3175 
3176    FOR get_update_tenancies IN get_update_tenancies_csr
3177    LOOP
3178       l_action           := NULL;
3179       l_message          := NULL;
3180       l_location_code    := NULL;
3181       l_loc_type_code    := NULL;
3182       l_location_id      := get_update_tenancies.location_id;
3183       l_tenancy_Id       := get_update_tenancies.tenancy_Id;
3184       l_tenancy_str_date := NVL(get_update_tenancies.occupancy_date,
3185                                 get_update_tenancies.estimated_occupancy_date);
3186       l_tenancy_end_date := get_update_tenancies.expiration_date;
3187 
3188       pnp_debug_pkg.log('CON_TEN=>UPD : Early Terminating Tenancy_Id: '||l_tenancy_Id);
3189 
3190       pn_tenancies_pkg.update_auto_space_assign
3191       (
3192          p_location_id                   => get_update_tenancies.location_id
3193         ,p_lease_id                      => p_lease_id
3194         ,p_customer_id                   => get_update_tenancies.customer_id
3195         ,p_cust_site_use_id              => get_update_tenancies.customer_site_use_id
3196         ,p_cust_assign_start_dt          => l_tenancy_str_date
3197         ,p_cust_assign_end_dt            => p_new_lea_term_dt
3198         ,p_recovery_space_std_code       => get_update_tenancies.recovery_space_std_code
3199         ,p_recovery_type_code            => get_update_tenancies.recovery_type_code
3200         ,p_fin_oblig_end_date            => p_new_lea_term_dt
3201         ,p_allocated_pct                 => get_update_tenancies.allocated_area_pct
3202         ,p_tenancy_id                    => get_update_tenancies.tenancy_id
3203         ,p_org_id                        => get_update_tenancies.org_id
3204         ,p_location_id_old               => get_update_tenancies.location_id
3205         ,p_customer_id_old               => get_update_tenancies.customer_id
3206         ,p_cust_site_use_id_old          => get_update_tenancies.customer_site_use_id
3207         ,p_cust_assign_start_dt_old      => l_tenancy_str_date
3208         ,p_cust_assign_end_dt_old        => get_update_tenancies.expiration_date
3209         ,p_recovery_space_std_code_old   => get_update_tenancies.recovery_space_std_code
3210         ,p_recovery_type_code_old        => get_update_tenancies.recovery_type_code
3211         ,p_fin_oblig_end_date_old        => get_update_tenancies.fin_oblig_end_date
3212         ,p_allocated_pct_old             => get_update_tenancies.allocated_area_pct
3213         ,p_action                        => l_action
3214         ,p_msg                           => l_message
3215       );
3216 
3217       pnp_debug_pkg.log('CON_TEN=>UPD : Space Assignments deleted. l_action:  '||l_action);
3218 
3219       IF l_action = 'S' THEN
3220          OPEN get_location_type_csr(l_location_id, l_tenancy_str_date);
3221          FETCH get_location_type_csr INTO l_location_code, l_loc_type_code;
3222          CLOSE get_location_type_csr;
3223 
3224          pnp_debug_pkg.put_log_msg('********************************************************************************');
3225          fnd_message.set_name ('PN','PN_SCHIT_LOCK_UPD');
3226          fnd_message.set_token ('LOC_CODE', l_location_code);
3227          fnd_message.set_token ('ODATE', l_tenancy_str_date);
3228          fnd_message.set_token ('EDATE', l_tenancy_end_date);
3229          pnp_debug_pkg.put_log_msg(fnd_message.get);
3230          pnp_debug_pkg.put_log_msg('********************************************************************************');
3231       ELSE
3232 
3233          UPDATE pn_tenancies_all
3234          SET    expiration_date = p_new_lea_term_dt,
3235                 fin_oblig_end_date = p_new_lea_term_dt,
3236                 last_update_date = SYSDATE,
3237                 last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
3238                 last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
3239          WHERE  tenancy_id = l_tenancy_Id;
3240 
3241          pnp_debug_pkg.log('CON_TEN=>UPD : Tenancy Early Terminated...');
3242 
3243          IF l_action = 'R' THEN  --Regenerate
3244             OPEN get_location_type_csr(l_location_id, l_tenancy_str_date);
3245             FETCH get_location_type_csr INTO l_location_code, l_loc_type_code;
3246             CLOSE get_location_type_csr;
3247 
3248             pnp_debug_pkg.put_log_msg('********************************************************************************');
3249             fnd_message.set_name ('PN','PN_SCHIT_CUST');
3250             fnd_message.set_token ('LOC_CODE', l_location_code);
3251             fnd_message.set_token ('ODATE', l_tenancy_str_date);
3252             fnd_message.set_token ('EDATE', l_tenancy_end_date);
3253             pnp_debug_pkg.put_log_msg(fnd_message.get);
3254             pnp_debug_pkg.put_log_msg('********************************************************************************');
3255          END IF;
3256       END IF;
3257    END LOOP;
3258 
3259    pnp_debug_pkg.log('CONTRACT_TENANCIES of MAIN Lease +End+ (-)');
3260 
3261 END contract_tenancies;
3262 
3263 
3264 --------------------------------------------------------------------------------------------
3265 --  PROCEDURE  : CONTRACTION
3266 --  DESCRIPTION: This procedure is used to contract a given lease. Extra schedules and Cash
3267 --               Items of all terms are deleted and the cash for last item is recalculeted.
3268 --               For Normalized term, items are re-Normalized.
3269 --  25-JUN-2001  Mrinal Misra    o Created.
3270 --  05-AUG-2001  Amita Singh     o Modified to take care of CON+ADD. Added call to ADD_MAIN.
3271 --  15-AUG-2001  Mrinal Misra    o Added calls to routine
3272 --                                 pn_index_rent_periods_pkg.process_main_lease_term_date.
3273 --  05-SEP-2001  Mrinal Misra    o Added to check for payment_term_id in the update statement
3274 --                                 of PN_PAYMENT_ITEMS.
3275 --  24-JAN-2002  Satish Tripathi o Removed the hard coding of p_lease_context being passed to
3276 --                                 CREATE_NORMALIZE_ITEMS.
3277 --  07-FEB-2002  Satish Tripathi o Added variable l_norm_str_dt to capture Normalize Start
3278 --                                 Date, if term was added through AMEND and pass it to
3279 --                                 routine CREATE_NORMALIZE_ITEMS.
3280 --  10-DEC-2002  graghuna        o Modified to get and pass p_active_lease_change_id to
3281 --                                 cursor and update pn_payment_terms_all.norm_end_date
3282 --                                 for Month-to-Month Re-Normalization issue. --MTM-I
3283 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Pass new parameter p_lease_change_id
3284 --                                 to create_normalize_items.
3285 --  03-DEC-2003  Satish Tripathi o Call Contract_Tenancies to early terminate tenancies only
3286 --                                 for Sub_Lease and Third_Party leases (BUG# 3284799).
3287 --  24-MAR-2004  Satish Tripathi o Fixed for BUG# 3295405. If norm_start_date is null
3288 --                                 (old data), use Get_First_Item_Date.
3289 --  21-Oct-2004 vmmehta          o Bug# 3942294 Do not delete VR terms during contraction
3290 --------------------------------------------------------------------------------------------
3291 PROCEDURE contraction (p_lease_id           NUMBER,
3292                        p_lease_context      VARCHAR2,
3293                        p_new_lea_term_dt    DATE,
3294                        p_new_lea_comm_dt    DATE,
3295                        p_mths               NUMBER)
3296 IS
3297 
3298    l_msg                           VARCHAR2(2000);
3299    l_old_lea_term_dt               DATE;
3300    l_norm_str_dt                   DATE;
3301    l_active_lease_change_id        pn_lease_details.lease_change_id%TYPE;
3302 
3303    CURSOR get_old_lea_term_dt IS
3304       SELECT plh.lease_termination_date
3305       FROM   pn_lease_details_history plh,
3306              pn_lease_details_all pld
3307       WHERE  pld.lease_change_id = plh.new_lease_change_id
3308       AND    pld.lease_id = p_lease_id;
3309 
3310 BEGIN
3311 
3312    pnp_debug_pkg.log('CONTRACTION of MAIN Lease +Start+ (+)');
3313    pnp_debug_pkg.log('CONTRACTION IN: p_lease_id         : '||p_lease_id);
3314    pnp_debug_pkg.log('CONTRACTION IN: p_lease_context    : '||p_lease_context);
3315    pnp_debug_pkg.log('CONTRACTION IN: p_new_lea_term_dt  : '||p_new_lea_term_dt);
3316    pnp_debug_pkg.log('CONTRACTION IN: p_new_lea_comm_dt  : '||p_new_lea_comm_dt);
3317    pnp_debug_pkg.log('CONTRACTION IN: p_mths             : '||p_mths);
3318 
3319    /* If lease is contracted from main lease form then delete payment
3320       items for the lease, for which payment schedules are in draft
3321       status and schedule date is greater than lease termination date. */
3322 
3323    OPEN get_old_lea_term_dt;
3324       FETCH get_old_lea_term_dt INTO l_old_lea_term_dt;
3325    CLOSE get_old_lea_term_dt;
3326 
3327    pnp_debug_pkg.log('CON - MAIN - Deleting Payment Items');
3328 
3329    DELETE pn_payment_items_all
3330    WHERE payment_schedule_id IN (SELECT payment_schedule_id
3331                                  FROM   pn_payment_schedules_all
3332                                  WHERE  lease_id = p_lease_id
3333                                  AND    schedule_date > p_new_lea_term_dt
3334                                  AND    payment_status_lookup_code = 'DRAFT')
3335    AND payment_term_id NOT IN (SELECT payment_term_id
3336                                FROM pn_payment_terms_all
3337                                WHERE lease_id = p_lease_id
3338                                AND var_rent_inv_id IS NOT NULL);
3339 
3340    /* Delete payment schedules for the lease which are in draft status
3341       and schedule date is greater than lease termination date. */
3342 
3343    pnp_debug_pkg.log('CON - MAIN - Deleting Payment Schedules');
3344 
3345    DELETE pn_payment_schedules_all psch
3346    WHERE lease_id = p_lease_id
3347    AND schedule_date > p_new_lea_term_dt
3348    AND payment_status_lookup_code = 'DRAFT'
3349    AND NOT EXISTS (SELECT null
3350                    FROM pn_payment_items_all pitm
3351                    WHERE pitm.payment_schedule_id = psch.payment_schedule_id);
3352 
3353    DELETE pn_payment_items_all
3354    WHERE  payment_term_id IN (SELECT payment_term_id
3355                               FROM   pn_payment_terms_all
3356                               WHERE  start_date > p_new_lea_term_dt
3357                               AND    lease_id = p_lease_id)
3358    AND payment_term_id NOT IN (SELECT payment_term_id
3359                                FROM pn_payment_terms_all
3360                                WHERE lease_id = p_lease_id
3361                                AND var_rent_inv_id IS NOT NULL);
3362 
3363    /* Delete payment terms for the lease which have term start date
3364       greater than lease termination date. */
3365 
3366    pnp_debug_pkg.log('CON - MAIN - Deleting Payment Terms');
3367 
3368    DELETE pn_payment_terms_all
3369    WHERE lease_id = p_lease_id
3370    AND start_date > p_new_lea_term_dt
3371    AND var_rent_inv_id IS NULL;
3372 
3373    /* Update end date of remaining payment terms for the lease to
3374       lease termination date. */
3375 
3376    pnp_debug_pkg.log('CON - MAIN - Updating end date of Payment Terms');
3377 
3378    UPDATE pn_payment_terms_all
3379    SET end_date = p_new_lea_term_dt,
3380        last_update_date = SYSDATE,
3381        last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
3382        last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
3383    WHERE lease_id = p_lease_id
3384    AND end_date > p_new_lea_term_dt
3385   AND frequency_code <> 'OT';
3386 
3387    /* Call the index rent contraction routine */
3388 
3389    pnp_debug_pkg.log('CON - MAIN - Contracting Index rent ');
3390 
3391    pn_index_rent_periods_pkg.process_main_lease_term_date(p_lease_id,
3392                                                           p_new_lea_term_dt,
3393                                                           l_old_lea_term_dt,
3394                                                           p_lease_context,
3395                                                           l_msg);
3396 
3397    /* Update the cash items with new amount, for the terms which have
3398       been contracted. */
3399 
3400    pnp_debug_pkg.log('CON - MAIN - Updating last non zero cash items with new pro. amt');
3401 
3402    recalculate_cash(p_new_lease_term_date => p_new_lea_term_dt);
3403 
3404    /*Get the normalized payment terms for which re-normalization needs
3405       to be done  */
3406 
3407    pnp_debug_pkg.log('CON - MAIN - Doing re-normalization');
3408 
3409    l_active_lease_change_id := Get_Lease_Change_Id(p_lease_id);
3410    FOR con_cur IN term_con_exp_cur(p_lease_id,l_active_lease_change_id)
3411    LOOP
3412 
3413       pnp_debug_pkg.log('CON - MAIN - Re-Normalization - Term Id : '||con_cur.payment_term_id);
3414 
3415       /* If the lease is Contracted, Normalization of term should start from
3416          the same date of normalization, when the term was Abstracted or Added. */
3417 
3418       l_norm_str_dt := NVL(con_cur.norm_start_date, Get_First_Item_Date(con_cur.payment_term_id));
3419 
3420       /* AMT-RETRO */
3421       IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
3422         create_normalize_items(p_lease_context      => p_lease_context,
3423                                p_lease_id           => p_lease_id,
3424                                p_term_id            => con_cur.payment_term_id,
3425                                p_vendor_id          => con_cur.vendor_id,
3426                                p_cust_id            => con_cur.customer_id,
3427                                p_vendor_site_id     => con_cur.vendor_site_id,
3428                                p_cust_site_use_id   => con_cur.customer_site_use_id,
3429                                p_cust_ship_site_id  => con_cur.cust_ship_site_id,
3430                                p_sob_id             => con_cur.set_of_books_id,
3431                                p_curr_code          => con_cur.currency_code,
3432                                p_sch_day            => con_cur.schedule_day,
3433                                p_norm_str_dt        => l_norm_str_dt,
3434                                p_norm_end_dt        => g_new_lea_term_dt,
3435                                p_rate               => con_cur.rate,
3436                                p_lease_change_id    => con_cur.lease_change_id);
3437       ELSE
3438         PN_NORM_RENORM_PKG.NORMALIZE_RENORMALIZE
3439                               (p_lease_context      => p_lease_context,
3440                                p_lease_id           => p_lease_id,
3441                                p_term_id            => con_cur.payment_term_id,
3442                                p_vendor_id          => con_cur.vendor_id,
3443                                p_cust_id            => con_cur.customer_id,
3444                                p_vendor_site_id     => con_cur.vendor_site_id,
3445                                p_cust_site_use_id   => con_cur.customer_site_use_id,
3446                                p_cust_ship_site_id  => con_cur.cust_ship_site_id,
3447                                p_sob_id             => con_cur.set_of_books_id,
3448                                p_curr_code          => con_cur.currency_code,
3449                                p_sch_day            => con_cur.schedule_day,
3450                                p_norm_str_dt        => l_norm_str_dt,
3451                                p_norm_end_dt        => g_new_lea_term_dt,
3452                                p_rate               => con_cur.rate,
3453                                p_lease_change_id    => con_cur.lease_change_id);
3454       END IF;
3455 
3456       pnp_debug_pkg.log('CON - MAIN - Renormalization done for Term   : '
3457                          ||TO_CHAR(con_cur.payment_term_id));
3458 
3459       UPDATE pn_payment_terms_all
3460       SET    norm_end_date   = g_new_lea_term_dt
3461       WHERE  payment_term_id = con_cur.payment_term_id;
3462 
3463    END LOOP;
3464 
3465    /* Now create the schedules and items for the new terms that have been added along with
3466       the contraction of the main lease */
3467 
3468    add_main(p_lease_id            => p_lease_id,
3469             p_lease_context       => 'ADDAMD',
3470             p_new_lea_term_dt     => p_new_lea_term_dt,
3471             p_new_lea_comm_dt     => p_new_lea_comm_dt,
3472             p_mths                => p_mths);
3473 
3474    /* For Sub_Lease and Third_Party lease, contract tenancies and associated
3475        space assignments as well. */
3476 
3477    IF g_lease_class_code <> 'DIRECT' THEN
3478       contract_tenancies(
3479                                 p_lease_id           => p_lease_id
3480                                ,p_new_lea_term_dt    => p_new_lea_term_dt
3481                                 );
3482    END IF;
3483 
3484    pnp_debug_pkg.log('CONTRACTION of MAIN Lease -End- (-)');
3485 
3486 END contraction;
3487 
3488 --------------------------------------------------------------------------------------------
3489 --  PROCEDURE  : CONTRACTION_BY_ITM_END_DT
3490 --  DESCRIPTION: This procedure is used to contract a given lease. Extra schedules and Cash
3491 --               Items of all terms are deleted and the cash for last item is recalculeted.
3492 --               For Normalized term, items are re-Normalized.The contraction is done based
3493 --               on item end dates of the terms
3494 -- 18-APR-07 sdmahesh         Bug # 5985779. Enhancement for new profile
3495 --                            option for lease early termination
3496 --------------------------------------------------------------------------------------------
3497 PROCEDURE contraction_by_itm_end_dt (p_lease_id           NUMBER,
3498                                      p_lease_context      VARCHAR2,
3499                                      p_new_lea_term_dt    DATE,
3500                                      p_new_lea_comm_dt    DATE,
3501                                      p_mths               NUMBER)
3502 IS
3503 
3504    l_msg                           VARCHAR2(2000);
3505    l_old_lea_term_dt               DATE;
3506    l_norm_str_dt                   DATE;
3507    l_active_lease_change_id        pn_lease_details.lease_change_id%TYPE;
3508    l_norm_trm_exsts                BOOLEAN := FALSE;
3509    l_item_end_dt_tbl               pnp_util_func.item_end_dt_tbl_type;
3510    i                               NUMBER;
3511    l_max_item_end_dt               DATE := TO_DATE('01/01/0001', 'MM/DD/YYYY');
3512    l_ri_end_dt                     DATE := TO_DATE('01/01/0001', 'MM/DD/YYYY');
3513    l_term_end_dt                   DATE := NULL;
3514    CURSOR get_old_lea_term_dt IS
3515       SELECT plh.lease_termination_date
3516       FROM   pn_lease_details_history plh,
3517              pn_lease_details_all pld
3518       WHERE  pld.lease_change_id = plh.new_lease_change_id
3519       AND    pld.lease_id = p_lease_id;
3520 
3521 BEGIN
3522 
3523    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT of MAIN Lease +Start+ (+)');
3524    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT IN: p_lease_id         : '||p_lease_id);
3525    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT IN: p_lease_context    : '||p_lease_context);
3526    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT IN: p_new_lea_term_dt  : '||p_new_lea_term_dt);
3527    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT IN: p_new_lea_comm_dt  : '||p_new_lea_comm_dt);
3528    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT IN: p_mths             : '||p_mths);
3529 
3530    /* If lease is contracted from main lease form then delete payment
3531       items for the lease, for which payment schedules are in draft
3532       status and schedule date is greater than lease termination date. */
3533 
3534    OPEN get_old_lea_term_dt;
3535       FETCH get_old_lea_term_dt INTO l_old_lea_term_dt;
3536    CLOSE get_old_lea_term_dt;
3537 
3538    l_item_end_dt_tbl := pnp_util_func.fetch_item_end_dates(p_lease_id);
3539 
3540    /* Call the index rent contraction routine */
3541 
3542    FOR i IN 1 .. l_item_end_dt_tbl.COUNT LOOP
3543       IF l_item_end_dt_tbl(i).index_period_id IS NOT NULL THEN
3544          pnp_debug_pkg.log('+++++++++++++For RI term:'||l_item_end_dt_tbl(i).term_id||' Item End Dt:'||l_item_end_dt_tbl(i).item_end_dt);
3545          IF l_ri_end_dt < l_item_end_dt_tbl(i).item_end_dt THEN
3546             l_ri_end_dt := l_item_end_dt_tbl(i).item_end_dt;
3547          pnp_debug_pkg.log('+++++++++++++Now l_ri_end_dt:'||l_ri_end_dt);
3548          END IF;
3549       END IF;
3550    END LOOP;
3551 
3552    IF  l_ri_end_dt < p_new_lea_term_dt THEN
3553       l_ri_end_dt := p_new_lea_term_dt;
3554    END IF;
3555    pnp_debug_pkg.log('+++++++++++++Now l_ri_end_dt:'||l_ri_end_dt);
3556    IF(NVL(fnd_profile.value('PN_RENT_INCREASE_TERM_END_DATE'),'END_LEASE') ='END_LEASE') THEN
3557       FOR i IN 1 .. l_item_end_dt_tbl.COUNT LOOP
3558          IF l_item_end_dt_tbl(i).index_period_id IS NOT NULL THEN
3559             IF l_item_end_dt_tbl(i).item_end_dt < p_new_lea_term_dt THEN
3560                l_item_end_dt_tbl(i).item_end_dt := p_new_lea_term_dt;
3561             END IF;
3562          END IF;
3563       END LOOP;
3564       l_term_end_dt := p_new_lea_term_dt;
3565    ELSE
3566       FOR i IN 1 .. l_item_end_dt_tbl.COUNT LOOP
3567          IF l_item_end_dt_tbl(i).index_period_id IS NOT NULL THEN
3568             l_item_end_dt_tbl(i).item_end_dt := l_ri_end_dt;
3569          END IF;
3570       END LOOP;
3571       l_term_end_dt := NULL;
3572    END IF;
3573    pn_index_rent_periods_pkg.process_main_lease_term_date( p_lease_id                   => p_lease_id
3574                                                           ,p_new_main_lease_term_date   => l_ri_end_dt
3575                                                           ,p_old_main_lease_term_date   => l_old_lea_term_dt
3576                                                           ,p_lease_context              => p_lease_context
3577                                                           ,p_msg                        => l_msg
3578                                                           ,p_cutoff_date                => NULL
3579                                                           ,p_term_end_dt                => l_term_end_dt);
3580 
3581    l_norm_trm_exsts := pnp_util_func.norm_trm_exsts(p_lease_id);
3582    IF l_norm_trm_exsts THEN
3583       FOR i IN 1 .. l_item_end_dt_tbl.COUNT LOOP
3584          IF l_item_end_dt_tbl(i).index_period_id IS NULL THEN
3585             l_item_end_dt_tbl(i).item_end_dt := p_new_lea_term_dt;
3586          END IF;
3587       END LOOP;
3588    ELSE
3589       FOR i IN 1 .. l_item_end_dt_tbl.COUNT LOOP
3590          IF l_item_end_dt_tbl(i).index_period_id IS NULL THEN
3591 
3592             pnp_debug_pkg.log('+++++++++++++Non-RI Term:'||
3593                               '  Term ID:' || l_item_end_dt_tbl(i).term_id ||
3594                               '  Item End Dt:' || l_item_end_dt_tbl(i).item_end_dt ||
3595                               '  Lease End Dt:' ||p_new_lea_term_dt);
3596 
3597             IF l_item_end_dt_tbl(i).item_end_dt < p_new_lea_term_dt THEN
3598                l_item_end_dt_tbl(i).item_end_dt := p_new_lea_term_dt;
3599             END IF;
3600          END IF;
3601       END LOOP;
3602    END IF;
3603    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT - MAIN - Deleting Items');
3604    FOR i IN 1 .. l_item_end_dt_tbl.COUNT LOOP
3605    pnp_debug_pkg.log('+++++++++++Deleting All Items for term:'||l_item_end_dt_tbl(i).term_id||
3606                      '  with schedule_date > ' ||l_item_end_dt_tbl(i).item_end_dt);
3607       DELETE pn_payment_items_all
3608       WHERE payment_schedule_id IN (SELECT payment_schedule_id
3609                                     FROM   pn_payment_schedules_all
3610                                     WHERE  lease_id = p_lease_id
3611                                     AND    schedule_date > l_item_end_dt_tbl(i).item_end_dt
3612                                     AND    payment_status_lookup_code = 'DRAFT')
3613       AND payment_term_id = l_item_end_dt_tbl(i).term_id;
3614    END LOOP;
3615 
3616    /* Delete payment schedules for the lease which are in draft status
3617       and schedule date is greater than lease termination date. */
3618 
3619    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT - MAIN - Deleting Payment Schedules');
3620    pnp_debug_pkg.log('+++++++++++Deleting Draft Empty Schedules for lease:'||p_lease_id||
3621                      '  with schedule_date > '||p_new_lea_term_dt);
3622    DELETE pn_payment_schedules_all psch
3623    WHERE lease_id = p_lease_id
3624    AND schedule_date > p_new_lea_term_dt
3625    AND payment_status_lookup_code = 'DRAFT'
3626    AND NOT EXISTS (SELECT 1
3627                    FROM pn_payment_items_all pitm
3628                    WHERE pitm.payment_schedule_id = psch.payment_schedule_id);
3629 
3630    /* Delete payment terms for the lease which have term start date
3631       greater than lease termination date. */
3632 
3633    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT - MAIN - Deleting Payment Terms');
3634 
3635    DELETE pn_payment_terms_all term
3636    WHERE lease_id = p_lease_id
3637    AND start_date > p_new_lea_term_dt
3638    AND index_period_id IS NULL
3639    AND NOT EXISTS(SELECT 1
3640                   FROM pn_payment_items_all item,
3641                        pn_payment_schedules_all schd
3642                   WHERE item.payment_term_id = term.payment_term_id
3643                   AND item.payment_schedule_id = schd.payment_schedule_id
3644                   AND schd.payment_status_lookup_code = 'APPROVED');
3645 
3646    /* Update end date of remaining payment terms for the lease to
3647       lease termination date. */
3648 
3649    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT - MAIN - Updating end date of Payment Terms');
3650 
3651    FOR i IN 1 .. l_item_end_dt_tbl.COUNT LOOP
3652       UPDATE pn_payment_terms_all
3653       SET end_date = l_item_end_dt_tbl(i).item_end_dt,
3654           last_update_date = SYSDATE,
3655           last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
3656           last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
3657       WHERE payment_term_id = l_item_end_dt_tbl(i).term_id
3658       AND end_date > l_item_end_dt_tbl(i).item_end_dt
3659       AND frequency_code <> 'OT';
3660    END LOOP;
3661 
3662    /* Update the cash items with new amount, for the terms which have
3663       been contracted. */
3664 
3665    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT - MAIN - Updating last non zero cash items with new pro. amt');
3666 
3667    recalculate_cash(p_new_lease_term_date => p_new_lea_term_dt);
3668 
3669    /*Get the normalized payment terms for which re-normalization needs
3670       to be done  */
3671 
3672    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT - MAIN - Doing re-normalization');
3673 
3674    l_active_lease_change_id := Get_Lease_Change_Id(p_lease_id);
3675    FOR con_cur IN term_con_exp_cur(p_lease_id,l_active_lease_change_id)
3676    LOOP
3677 
3678       pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT - MAIN - Re-Normalization - Term Id : '||con_cur.payment_term_id);
3679 
3680       /* If the lease is Contracted, Normalization of term should start from
3681          the same date of normalization, when the term was Abstracted or Added. */
3682 
3683       l_norm_str_dt := NVL(con_cur.norm_start_date, Get_First_Item_Date(con_cur.payment_term_id));
3684 
3685       /* AMT-RETRO */
3686      PN_NORM_RENORM_PKG.NORMALIZE_RENORMALIZE
3687                            (p_lease_context      => p_lease_context,
3688                             p_lease_id           => p_lease_id,
3689                             p_term_id            => con_cur.payment_term_id,
3690                             p_vendor_id          => con_cur.vendor_id,
3691                             p_cust_id            => con_cur.customer_id,
3692                             p_vendor_site_id     => con_cur.vendor_site_id,
3693                             p_cust_site_use_id   => con_cur.customer_site_use_id,
3694                             p_cust_ship_site_id  => con_cur.cust_ship_site_id,
3695                             p_sob_id             => con_cur.set_of_books_id,
3696                             p_curr_code          => con_cur.currency_code,
3697                             p_sch_day            => con_cur.schedule_day,
3698                             p_norm_str_dt        => l_norm_str_dt,
3699                             p_norm_end_dt        => p_new_lea_term_dt,
3700                             p_rate               => con_cur.rate,
3701                             p_lease_change_id    => con_cur.lease_change_id);
3702 
3703       pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT - MAIN - Renormalization done for Term   : '
3704                          ||TO_CHAR(con_cur.payment_term_id));
3705 
3706       UPDATE pn_payment_terms_all
3707       SET    norm_end_date   = p_new_lea_term_dt
3708       WHERE  payment_term_id = con_cur.payment_term_id;
3709 
3710    END LOOP;
3711 
3712    /* Now create the schedules and items for the new terms that have been added along with
3713       the contraction of the main lease */
3714 
3715    add_main(p_lease_id            => p_lease_id,
3716             p_lease_context       => 'ADDAMD',
3717             p_new_lea_term_dt     => p_new_lea_term_dt,
3718             p_new_lea_comm_dt     => p_new_lea_comm_dt,
3719             p_mths                => p_mths);
3720 
3721    /* For Sub_Lease and Third_Party lease, contract tenancies and associated
3722        space assignments as well. */
3723 
3724    IF g_lease_class_code <> 'DIRECT' THEN
3725       contract_tenancies(
3726                                 p_lease_id           => p_lease_id
3727                                ,p_new_lea_term_dt    => p_new_lea_term_dt
3728                                 );
3729    END IF;
3730 
3731    pnp_debug_pkg.log('CONTRACTION_BY_ITM_END_DT of MAIN Lease -End- (-)');
3732 
3733 END contraction_by_itm_end_dt;
3734 
3735 --------------------------------------------------------------------------------------------
3736 --  PROCEDURE  : EXPANSION
3737 --  DESCRIPTION: This procedure is used to expand a given lease, all terms of the given lease
3738 --               are expanded. GET_SCH_INFO gives information of the term, PROCESS_TERM
3739 --               creates schedules if required and the Cash / Normalized items.
3740 --  25-JUN-2001  Mrinal Misra    o Created.
3741 --  05-AUG-2001  Amita Singh     o Modified to take care of EXP+ADD. Added call to ADD_MAIN.
3742 --  15-AUG-2001  Mrinal Misra    o Added calls to routine
3743 --                                 pn_index_rent_periods_pkg.process_main_lease_term_date.
3744 --  25-SEP-2001  Mrinal Misra    o Changed for expanding Index Payment Terms.
3745 --  24-JAN-2002  Satish Tripathi o Removed the hard coding of p_lease_context being passed to
3746 --                                 GET_SCH_INFO and PROCESS_TERM.
3747 --  07-FEB-2002  Satish Tripathi o Added variable l_norm_str_dt to capture Normalize Start
3748 --                                 Date, if term was added through AMEND.
3749 --  26-MAR-2002  Satish Tripathi o Added variable l_sch_str_dt to correctly point the
3750 --                                 Schedule-Start-Date for NON MONTHLY Payment Term.
3751 --  10-DEC-2002  graghuna        o Modified to get and pass p_active_lease_change_id to
3752 --                                 cursor and update pn_payment_terms_all.norm_end_date
3753 --                                 for Month-to-Month Re-Normalization issue. --MTM-I
3754 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Pass new parameter p_lease_change_id
3755 --                                 to process_term.
3756 --  24-MAR-2004  Satish Tripathi o Fixed for BUG# 3295405. If norm_start_date is null
3757 --                                 (old data), use Get_First_Item_Date.
3758 --  19-jan-2006  piagrawa        o Bug#4931780 - Modified signature
3759 --  20-NOV-2006  Hareesha        o MTM Uptake - Added parameter p_extend_ri to extend
3760 --                                 RI agreement when lease moves from MTM/HLD to ACT.
3761 --  02-APR-2007  Hareesha        o Bug # 5962831 Added parameter for terms expansion.
3762 --------------------------------------------------------------------------------------------
3763 PROCEDURE expansion (p_lease_id           NUMBER,
3764                      p_lease_context      VARCHAR2,
3765                      p_new_lea_term_dt    DATE,
3766                      p_new_lea_comm_dt    DATE,
3767                      p_mths               NUMBER,
3768                      p_term_id            NUMBER DEFAULT NULL,
3769                      p_cutoff_date        DATE,
3770                      p_extend_ri          VARCHAR2,
3771                      p_ten_trm_context    VARCHAR2 DEFAULT 'N')
3772 IS
3773 
3774    l_old_lea_term_dt               pn_lease_details.lease_termination_date%TYPE;
3775    l_pro_sch_dt                    pn_payment_schedules.schedule_date%TYPE;
3776    l_no_sch                        NUMBER;
3777    l_freq                          NUMBER;
3778    l_counter                       NUMBER;
3779    l_sch_dt                        pn_payment_schedules.schedule_date%TYPE;
3780    l_msg                           VARCHAR2(2000);
3781    l_norm_str_dt                   DATE := NULL;
3782    l_sch_str_dt                    DATE;
3783    l_active_lease_change_id        pn_lease_details.lease_change_id%TYPE;
3784    l_cutoff_date                   DATE;
3785    l_ext_dt                        DATE;
3786    l_old_lease_end_date            DATE;
3787    l_payment_term_rec              pn_payment_terms_all%ROWTYPE;
3788    x_return_status                 VARCHAR2(100);
3789    x_return_message                VARCHAR2(100);
3790    l_lease_change_id               NUMBER;
3791    l_lease_status_old              VARCHAR2(30);
3792    l_lease_status_new              VARCHAR2(30);
3793    l_lease_comm_date               DATE;
3794    l_lease_term_date               DATE;
3795    l_lease_ext_end_date            DATE;
3796    l_amd_comm_date                 DATE;
3797    l_schd_date1                    DATE;
3798    l_schd_day                      NUMBER := NULL;
3799    l_first_draft_sch               DATE; -- Bug 7184211
3800 
3801    CURSOR get_old_lea_term_dt IS
3802       SELECT plh.lease_termination_date
3803       FROM   pn_lease_details_history plh,
3804              pn_lease_details_all pld
3805       WHERE  pld.lease_change_id = plh.new_lease_change_id
3806       AND    pld.lease_id = p_lease_id;
3807 
3808    CURSOR get_ext_dt IS
3809       SELECT NVL(plh.lease_extension_end_date,
3810                  plh.lease_termination_date) old_term_dt
3811       FROM   pn_lease_details_history plh,
3812              pn_lease_details_all pld
3813       WHERE  pld.lease_change_id = plh.new_lease_change_id
3814       AND    pld.lease_id = p_lease_id;
3815 
3816 
3817    CURSOR get_old_lease_end_date IS
3818       SELECT GREATEST( NVL(plh.lease_extension_end_date,
3819                            plh.lease_termination_date),
3820                        plh.lease_termination_date) old_lease_end_date
3821       FROM pn_lease_details_history plh,
3822            pn_lease_details_all pld
3823       WHERE pld.lease_change_id = plh.new_lease_change_id
3824       AND   pld.lease_id = p_lease_id;
3825 
3826    CURSOR get_main_lease_terms_to_expand( p_old_lease_end_date DATE) IS
3827       SELECT *
3828       FROM pn_payment_terms_all
3829       WHERE lease_id = p_lease_id
3830       AND end_date = p_old_lease_end_date
3831       AND index_period_id IS NULL
3832       AND var_rent_inv_id IS NULL
3833       AND period_billrec_id IS NULL
3834       AND frequency_code <>'OT';
3835 
3836    CURSOR get_lease_details IS
3837       SELECT details.lease_change_id              lease_change_id,
3838              det_history.lease_status             lease_status_old,
3839              lease.lease_status                   lease_status_new,
3840              details.lease_commencement_date      lease_comm_date,
3841              details.lease_termination_date       lease_term_date,
3842              det_history.lease_extension_end_date lease_ext_end_date,
3843              changes.change_commencement_date     amd_comm_date
3844       FROM pn_lease_details_all details,
3845            pn_lease_details_history det_history,
3846            pn_lease_changes_all changes,
3847            pn_leases_all        lease
3848       WHERE details.lease_id = p_lease_id
3849       AND   det_history.lease_id = p_lease_id
3850       AND   changes.lease_id = p_lease_id
3851       AND   lease.lease_id = p_lease_id
3852       AND   details.lease_change_id = det_history.new_lease_change_id
3853       AND   changes.lease_change_id = details.lease_change_id;
3854 
3855    CURSOR get_last_appr_schd_dt (p_lease_id NUMBER) IS
3856       SELECT MAX(pps.schedule_date) lst_schedule_date
3857       FROM pn_payment_schedules_all pps
3858       WHERE pps.payment_status_lookup_code = 'APPROVED'
3859       AND pps.lease_id = p_lease_id;
3860 
3861 -- Bug 7184211
3862    CURSOR csr_first_draft_sch (p_lease_id   NUMBER,
3863                                p_start_date DATE)
3864    IS
3865 
3866       SELECT First_Day(MIN(pps.schedule_date))
3867       FROM   pn_payment_schedules_all pps
3868       WHERE  pps.lease_id = p_lease_id
3869       AND    First_Day(pps.schedule_date) >= First_Day(p_start_date)
3870       AND    TO_CHAR(pps.schedule_date,'DD') = l_schd_day
3871       AND    pps.payment_status_lookup_code = 'DRAFT';
3872 
3873 BEGIN
3874 
3875    pnp_debug_pkg.log('EXPANSION +Start+ (+)');
3876    pnp_debug_pkg.log('EXPANSION IN: p_lease_id           : '||p_lease_id);
3877    pnp_debug_pkg.log('EXPANSION IN: p_lease_context      : '||p_lease_context);
3878    pnp_debug_pkg.log('EXPANSION IN: p_new_lea_term_dt    : '||p_new_lea_term_dt);
3879    pnp_debug_pkg.log('EXPANSION IN: p_new_lea_comm_dt    : '||p_new_lea_comm_dt);
3880    pnp_debug_pkg.log('EXPANSION IN: p_mths               : '||p_mths);
3881    pnp_debug_pkg.log('EXPANSION IN: p_term_id            : '||p_term_id);
3882    /* Find out NOCOPY the old lease termination date. */
3883 
3884    OPEN get_old_lea_term_dt;
3885       FETCH get_old_lea_term_dt INTO l_old_lea_term_dt;
3886    CLOSE get_old_lea_term_dt;
3887 
3888    FOR trm_dt_cur IN get_ext_dt LOOP
3889       l_ext_dt := trm_dt_cur.old_term_dt;
3890    END LOOP;
3891 
3892 
3893    /* Call the index rent expansion routine */
3894 
3895    pnp_debug_pkg.log('EXP - MAIN - Expanding Index rent ');
3896 
3897    pn_index_rent_periods_pkg.process_main_lease_term_date (p_lease_id,
3898                                                            p_new_lea_term_dt,
3899                                                            l_ext_dt,
3900                                                            p_lease_context,
3901                                                            l_msg,
3902                                                            p_cutoff_date);
3903 
3904    pnp_debug_pkg.log('EXPANSION - l_old_lea_term_dt          : '||l_old_lea_term_dt);
3905    l_active_lease_change_id := Get_Lease_Change_Id(p_lease_id);
3906    pnp_debug_pkg.log(' lease change id = '|| l_active_lease_change_id);
3907 
3908    l_cutoff_date := to_date(to_char(p_cutoff_date, 'yyyy-mm-dd') , 'yyyy-mm-dd');
3909    pnp_debug_pkg.log(' l_cutoff_date '|| l_cutoff_date);
3910 
3911    FOR con_cur IN term_exp_cur(p_lease_id,l_active_lease_change_id, p_cutoff_date)
3912    LOOP
3913       pnp_debug_pkg.log('EXPANSION - getting sch info for  term : '
3914                         ||TO_CHAR(con_cur.payment_term_id));
3915 
3916       /* If the lease is Expanded, Normalization of term should start from
3917          the same date of normalization, when the term was Abstracted or Added. */
3918 
3919       l_norm_str_dt := NVL(con_cur.norm_start_date, Get_First_Item_Date(con_cur.payment_term_id));
3920 
3921       get_sch_info(p_lease_context            => p_lease_context,
3922                    p_normalize_flag           => NVL(con_cur.normalize,'N'),
3923                    p_mths                     => p_mths,
3924                    p_term_start_dt            => con_cur.start_date,
3925                    p_term_end_dt              => con_cur.end_date,
3926                    p_freq_code                => con_cur.frequency_code,
3927                    p_sch_day                  => con_cur.schedule_day,
3928                    p_new_lea_comm_dt          => p_new_lea_comm_dt,
3929                    p_old_lea_term_dt          => l_old_lea_term_dt,
3930                    p_new_lea_term_dt          => p_new_lea_term_dt,
3931                    p_no_sch                   => l_no_sch,
3932                    p_freq                     => l_freq,
3933                    p_counter                  => l_counter,
3934                    p_sch_dt                   => l_sch_dt,
3935                    p_pro_sch_dt               => l_pro_sch_dt,
3936                    p_sch_str_dt               => l_sch_str_dt,
3937                    p_lease_id                 => p_lease_id,
3938                    p_term_id                  => con_cur.payment_term_id,
3939                    p_norm_str_dt              => l_norm_str_dt);
3940 
3941       pnp_debug_pkg.log('EXPANSION - p_no_sch    : '||TO_CHAR(l_no_sch));
3942       pnp_debug_pkg.log('EXPANSION - p_freq      : '||TO_CHAR(l_freq));
3943       pnp_debug_pkg.log('EXPANSION - p_counter   : '||TO_CHAR(l_counter));
3944       pnp_debug_pkg.log('EXPANSION - p_sch_dt    : '||TO_CHAR(l_sch_dt));
3945       pnp_debug_pkg.log('EXPANSION - p_pro_sch_dt: '||TO_CHAR(l_pro_sch_dt));
3946 
3947       process_term(p_no_sch                   => l_no_sch,
3948                    p_counter                  => l_counter,
3949                    p_sch_dt                   => l_sch_dt,
3950                    p_pro_sch_dt               => l_pro_sch_dt,
3951                    p_new_lea_term_dt          => p_new_lea_term_dt ,
3952                    p_freq                     => l_freq,
3953                    p_freq_code                => con_cur.frequency_code,
3954                    p_payment_term_id          => con_cur.payment_term_id,
3955                    p_pay_trm_typ_code         => con_cur.payment_term_type_code,
3956                    p_trgt_dt                  => con_cur.target_date,
3957                    p_normalize_flag           => NVL(con_cur.normalize,'N'),
3958                    p_lease_context            => p_lease_context,
3959                    p_mths                     => p_mths,
3960                    p_vendor_id                => con_cur.vendor_id,
3961                    p_customer_id              => con_cur.customer_id,
3962                    p_vendor_site_id           => con_cur.vendor_site_id,
3963                    p_customer_site_use_id     => con_cur.customer_site_use_id,
3964                    p_cust_ship_site_id        => con_cur.cust_ship_site_id,
3965                    p_set_of_books_id          => con_cur.set_of_books_id,
3966                    p_currency_code            => con_cur.currency_code,
3967                    p_rate                     => con_cur.rate,
3968                    p_term_start_date          => con_cur.start_date,
3969                    p_term_end_date            => con_cur.end_date,
3970                    p_sch_str_dt               => l_sch_str_dt,
3971                    p_act_amt                  => con_cur.actual_amount,
3972                    p_est_amt                  => con_cur.estimated_amount,
3973                    p_index_prd_id             => con_cur.index_period_id,
3974                    p_norm_str_dt              => l_norm_str_dt,
3975                    p_lease_change_id          => con_cur.lease_change_id);
3976 
3977          UPDATE pn_payment_terms_all
3978          SET    norm_end_date   = g_new_lea_term_dt
3979          WHERE  payment_term_id = con_cur.payment_term_id;
3980 
3981       pnp_debug_pkg.log('EXPANSION - processed term '||TO_CHAR(con_cur.payment_term_id));
3982 
3983    END LOOP;
3984 
3985    IF NVL(p_ten_trm_context,'N') = 'Y' THEN
3986 
3987       FOR rec IN get_old_lease_end_date LOOP
3988          l_old_lease_end_date := rec.old_lease_end_date;
3989       END LOOP;
3990 
3991       FOR rec IN get_lease_details LOOP
3992          l_lease_change_id   := rec.lease_change_id;
3993          l_lease_status_old  := rec.lease_status_old;
3994          l_lease_status_new  := rec.lease_status_new;
3995          l_lease_comm_date   := rec.lease_comm_date;
3996          l_lease_term_date   := rec.lease_term_date;
3997          l_lease_ext_end_date :=rec.lease_ext_end_date;
3998          l_amd_comm_date     := rec.amd_comm_date;
3999       END LOOP;
4000 
4001       IF l_lease_status_new = 'ACT' AND ( l_lease_status_old = 'MTM' OR l_lease_status_old ='HLD')
4002       AND l_lease_term_date > l_lease_ext_end_date THEN
4003 
4004          FOR base_terms_to_extend_rec IN get_main_lease_terms_to_expand(l_old_lease_end_date) LOOP
4005 
4006             l_payment_term_rec := base_terms_to_extend_rec;
4007 
4008             l_schd_date1 := pn_schedules_items.get_schedule_date
4009                            ( p_lease_id   => p_lease_id,
4010                              p_day        => l_payment_term_rec.schedule_day,
4011                              p_start_date => l_lease_ext_end_date + 1,
4012                              p_end_date   => l_lease_term_date,
4013                              p_freq       => pn_schedules_items.get_frequency(l_payment_term_rec.frequency_code)
4014                            );
4015             l_schd_day  := TO_NUMBER(TO_CHAR(l_schd_date1,'DD'));
4016 
4017             IF  NVL(l_payment_term_rec.index_norm_flag,'N') = 'Y' AND l_payment_term_rec.parent_term_id IS NOT NULL
4018             THEN
4019 
4020                FOR lst_appr_sched IN get_last_appr_schd_dt ( p_lease_id) LOOP
4021                   l_payment_term_rec.norm_start_date := lst_appr_sched.lst_schedule_date;
4022                END LOOP;
4023 
4024                IF l_amd_comm_date > l_payment_term_rec.start_date THEN
4025                   l_payment_term_rec.norm_start_date := l_amd_comm_date;
4026                END IF;
4027 
4028                l_payment_term_rec.normalize  := 'Y';
4029                l_payment_term_rec.start_date := l_lease_ext_end_date + 1;
4030                l_payment_term_rec.end_date   := l_lease_term_date;
4031                l_payment_term_rec.norm_end_date   := l_lease_term_date;
4032                l_payment_term_rec.parent_term_id := NVL(l_payment_term_rec.parent_term_id,
4033                                                         l_payment_term_rec.payment_term_id);
4034                l_payment_term_rec.lease_status := l_lease_status_new;
4035                l_payment_term_rec.index_norm_flag := NULL;
4036                l_payment_term_rec.lease_change_id := l_lease_change_id;
4037                l_payment_term_rec.status := 'DRAFT';
4038 
4039                pn_schedules_items.Insert_Payment_Term
4040               (  p_payment_term_rec              => l_payment_term_rec,
4041                  x_return_status                 => x_return_status,
4042                  x_return_message                => x_return_message   );
4043 
4044             ELSE
4045 
4046                IF l_schd_day <> l_payment_term_rec.schedule_day THEN
4047                   l_payment_term_rec.start_date   := l_lease_ext_end_date + 1;
4048                   l_payment_term_rec.end_date     := l_lease_term_date;
4049                   l_payment_term_rec.lease_change_id := l_lease_change_id;
4050                   l_payment_term_rec.status := 'DRAFT';
4051 
4052                    pn_schedules_items.Insert_Payment_Term
4053                    (  p_payment_term_rec              => l_payment_term_rec,
4054                       x_return_status                 => x_return_status,
4055                       x_return_message                => x_return_message   );
4056 
4057                ELSE
4058 
4059                   UPDATE pn_payment_terms_all
4060                   SET end_date          = l_lease_term_date,
4061                       lease_change_id   = l_lease_change_id,
4062                       last_update_date  = SYSDATE,
4063                       last_updated_by   = fnd_global.user_id,
4064                       last_update_login = fnd_global.login_id
4065                   WHERE payment_term_id = l_payment_term_rec.payment_term_id;
4066 
4067                   Extend_Payment_Term (
4068                                  p_payment_term_rec => l_payment_term_rec,
4069                                  p_new_lea_comm_dt   => p_new_lea_comm_dt,
4070                                  p_new_lea_term_dt   => g_new_lea_term_dt,
4071                                  p_mths              => p_mths,
4072                                  p_new_start_date    => l_payment_term_rec.end_date + 1,
4073                                  p_new_end_date      => g_new_lea_term_dt,
4074                                  x_return_status     => x_return_status,
4075                                  x_return_message    => x_return_message);
4076                END IF;
4077             END IF;
4078          END LOOP;
4079 
4080       ELSE
4081 
4082          FOR base_terms_to_extend_rec IN get_main_lease_terms_to_expand(l_old_lease_end_date) LOOP
4083 
4084             l_payment_term_rec := base_terms_to_extend_rec;
4085 
4086             Extend_Payment_Term (p_payment_term_rec => l_payment_term_rec,
4087                                  p_new_lea_comm_dt   => p_new_lea_comm_dt,
4088                                  p_new_lea_term_dt   => g_new_lea_term_dt,
4089                                  p_mths              => p_mths,
4090                                  p_new_start_date    => l_payment_term_rec.end_date + 1,
4091                                  p_new_end_date      => g_new_lea_term_dt,
4092                                  x_return_status     => x_return_status,
4093                                  x_return_message    => x_return_message);
4094 
4095             UPDATE pn_payment_terms_all
4096             SET end_date = g_new_lea_term_dt
4097             WHERE payment_term_id = l_payment_term_rec.payment_term_id;
4098 -- Added For Bug#7184211
4099             IF NVL(l_payment_term_rec.normalize,'N') = 'Y' THEN
4100 
4101               l_norm_str_dt := NVL(l_payment_term_rec.norm_start_date, Get_First_Item_Date(l_payment_term_rec.payment_term_id));
4102               l_schd_day := l_payment_term_rec.schedule_day;
4103               l_sch_dt := TO_DATE(TO_CHAR(l_payment_term_rec.schedule_day)||'/'
4104                                           ||TO_CHAR(ADD_MONTHS(l_old_lea_term_dt,1),'MM/YYYY'),
4105                                   'DD/MM/YYYY');
4106 
4107               IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
4108                 OPEN csr_first_draft_sch(g_lease_id, l_norm_str_dt);
4109                    FETCH csr_first_draft_sch INTO l_first_draft_sch;
4110                 CLOSE csr_first_draft_sch;
4111 
4112                 IF l_first_draft_sch is NULL THEN
4113                    l_norm_str_dt := FIRST_DAY(l_sch_dt);
4114                 ELSE
4115                    l_norm_str_dt := GREATEST(l_norm_str_dt, l_first_draft_sch);
4116                 END IF;
4117               END IF;
4118 
4119               /* AMT-RETRO */
4120               IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
4121                 create_normalize_items(p_lease_context      => p_lease_context,
4122                                        p_lease_id           => g_lease_id,
4123                                        p_term_id            => l_payment_term_rec.payment_term_id,
4124                                        p_vendor_id          => l_payment_term_rec.vendor_id,
4125                                        p_cust_id            => l_payment_term_rec.customer_id,
4126                                        p_vendor_site_id     => l_payment_term_rec.vendor_site_id,
4127                                        p_cust_site_use_id   => l_payment_term_rec.customer_site_use_id,
4128                                        p_cust_ship_site_id  => l_payment_term_rec.cust_ship_site_id,
4129                                        p_sob_id             => l_payment_term_rec.set_of_books_id,
4130                                        p_curr_code          => l_payment_term_rec.currency_code,
4131                                        p_sch_day            => l_payment_term_rec.schedule_day,
4132                                        p_norm_str_dt        => l_norm_str_dt,
4133                                        p_norm_end_dt        => g_new_lea_term_dt,
4134                                        p_rate               => l_payment_term_rec.rate,
4135                                        p_lease_change_id    => l_payment_term_rec.lease_change_id);
4136               ELSE
4137                 PN_NORM_RENORM_PKG.NORMALIZE_RENORMALIZE
4138                                        (p_lease_context      => p_lease_context,
4139                                         p_lease_id           => g_lease_id,
4140                                         p_term_id            => l_payment_term_rec.payment_term_id,
4141                                         p_vendor_id          => l_payment_term_rec.vendor_id,
4142                                         p_cust_id            => l_payment_term_rec.customer_id,
4143                                         p_vendor_site_id     => l_payment_term_rec.vendor_site_id,
4144                                         p_cust_site_use_id   => l_payment_term_rec.customer_site_use_id,
4145                                         p_cust_ship_site_id  => l_payment_term_rec.cust_ship_site_id,
4146                                         p_sob_id             => l_payment_term_rec.set_of_books_id,
4147                                         p_curr_code          => l_payment_term_rec.currency_code,
4148                                         p_sch_day            => l_payment_term_rec.schedule_day,
4149                                         p_norm_str_dt        => l_norm_str_dt,
4150                                         p_norm_end_dt        => g_new_lea_term_dt,
4151                                         p_rate               => l_payment_term_rec.rate,
4152                                         p_lease_change_id    => l_payment_term_rec.lease_change_id);
4153               END IF;
4154 
4155             END IF;
4156 -- End Bug#7184211
4157 
4158          END LOOP;
4159 
4160       END IF;
4161    END IF;
4162 
4163    /* Now create the schedules and items for the new terms that have been added along with
4164       the expansion of the main lease */
4165 
4166    pnp_debug_pkg.log('EXPANSION - adding terms - ... ');
4167    pnp_debug_pkg.log('EXPANSION - p_new_lea_term_dt: '||p_new_lea_term_dt);
4168    pnp_debug_pkg.log('EXPANSION - p_new_lea_comm_dt: '||p_new_lea_comm_dt);
4169    pnp_debug_pkg.log('EXPANSION - p_mths           : '||TO_CHAR(p_mths));
4170 
4171    add_main(p_lease_id            => p_lease_id,
4172             p_lease_context       => 'ADDAMD',
4173             p_new_lea_term_dt     => p_new_lea_term_dt,
4174             p_new_lea_comm_dt     => p_new_lea_comm_dt,
4175             p_mths                => p_mths);
4176 
4177    /* Extend the RI agreement and create/expand the periods
4178       if lease is extended and status changed from MTM/HLD to ACT */
4179    IF p_extend_ri = 'Y' THEN
4180 
4181      pn_index_rent_periods_pkg.process_main_lease_term_date(
4182          p_lease_id                     => p_lease_id,
4183          p_new_main_lease_term_date     => p_new_lea_term_dt,
4184          p_old_main_lease_term_date     => l_ext_dt,
4185          p_lease_context                => 'EXP_RI',
4186          p_msg                          => l_msg);
4187    END IF;
4188 
4189    pnp_debug_pkg.log('EXPANSION -End- (-)');
4190 
4191 END expansion;
4192 
4193 
4194 --------------------------------------------------------------------------------------------
4195 --  PROCEDURE  : ABSTRACT
4196 --  DESCRIPTION: This procedure is used to add a payment term in a given lease when lease is
4197 --               abstracted for the 1st time. GET_SCH_INFO gives information of the term,
4198 --               PROCESS_TERM creates schedules if required and the Cash / Normalized items.
4199 --  25-JUN-2001  Mrinal Misra    o Created.
4200 --  24-JAN-2002  Satish Tripathi o Removed the hard coding of p_lease_context being passed to
4201 --                                 GET_SCH_INFO and PROCESS_TERM.
4202 --  07-FEB-2002  Satish Tripathi o Added variable l_norm_str_dt to capture Normalize Start
4203 --                                 Date, if term was added through AMEND.
4204 --  26-MAR-2002  Satish Tripathi o Added variable l_sch_str_dt to correctly point the
4205 --                                 Schedule-Start-Date for NON MONTHLY Payment Term.
4206 --  10-DEC-2002  graghuna        o Modified to update pn_payment_terms_all.norm_end_date
4207 --                                 for Month-to-Month Re-Normalization issue. --MTM-I
4208 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Pass new parameter p_lease_change_id
4209 --                                 to process_term.
4210 --  20-NOV-2006  Hareesha        o MTM Uptake - Added handling for creating schedules and items
4211 --                                 LOF/SGN.
4212 --------------------------------------------------------------------------------------------
4213 PROCEDURE abstract (p_lease_id           NUMBER,
4214                     p_lease_context      VARCHAR2,
4215                     p_new_lea_term_dt    DATE,
4216                     p_new_lea_comm_dt    DATE,
4217                     p_mths               NUMBER)
4218 IS
4219 
4220    l_pro_sch_dt                    pn_payment_schedules.schedule_date%TYPE;
4221    l_no_sch                        NUMBER;
4222    l_freq                          NUMBER;
4223    l_counter                       NUMBER;
4224    l_sch_dt                        pn_payment_schedules.schedule_date%TYPE;
4225    l_norm_str_dt                   DATE;
4226    l_sch_str_dt                    DATE;
4227 
4228    CURSOR get_lease_status(p_lease_id NUMBER) IS
4229       SELECT lease_status
4230       FROM pn_leases_all
4231       WHERE lease_id = p_lease_id;
4232 
4233   CURSOR get_lof_terms(p_lease_id NUMBER) IS
4234      SELECT ppt.payment_term_id,
4235              ppt.lease_change_id,
4236              ppt.schedule_day,
4237              ppt.start_date,
4238              ppt.end_date,
4239              ppt.target_date,
4240              ppt.frequency_code,
4241              ppt.normalize,
4242              ppt.actual_amount,
4243              ppt.estimated_amount,
4244              ppt.payment_term_type_code,
4245              ppt.vendor_id,
4246              ppt.vendor_site_id,
4247              ppt.customer_id,
4248              ppt.customer_site_use_id,
4249              ppt.cust_ship_site_id,
4250              ppt.set_of_books_id,
4251              ppt.currency_code,
4252              ppt.rate,
4253              ppt.norm_start_date
4254       FROM   pn_payment_terms_all ppt
4255       WHERE  lease_id = p_lease_id
4256       AND    ppt.index_period_id IS NULL
4257       AND    ppt.var_rent_inv_id IS NULL
4258       AND    ppt.period_billrec_id IS NULL
4259       AND    NOT EXISTS (SELECT NULL
4260                          FROM   pn_payment_items_all ppi
4261                          WHERE  ppt.lease_id = p_lease_id
4262                          AND    ppi.payment_term_id = ppt.payment_term_id)
4263       AND    frequency_code = 'OT'
4264       AND    NVL(normalize,'N') = 'N';
4265 
4266    l_lease_status VARCHAR2(30) ;
4267 
4268 BEGIN
4269 
4270    pnp_debug_pkg.log('ABSTRACT +Start+ (+)');
4271    pnp_debug_pkg.log('ABSTRACT IN: p_lease_id        : '||p_lease_id);
4272    pnp_debug_pkg.log('ABSTRACT IN: p_lease_context   : '||p_lease_context);
4273    pnp_debug_pkg.log('ABSTRACT IN: p_new_lea_term_dt : '||p_new_lea_term_dt);
4274    pnp_debug_pkg.log('ABSTRACT IN: p_new_lea_comm_dt : '||p_new_lea_comm_dt);
4275    pnp_debug_pkg.log('ABSTRACT IN: p_mths            : '||p_mths);
4276 
4277    IF p_lease_context IN ('LOF','SGN') THEN
4278 
4279       FOR rec IN get_lease_status(p_lease_id) LOOP
4280          l_lease_status := rec.lease_status;
4281       END LOOP;
4282 
4283       IF l_lease_status IN ('LOF','SGN') THEN
4284          FOR abs_cur IN get_lof_terms(p_lease_id) LOOP
4285             get_sch_info(p_lease_context            => 'ABS',
4286                          p_normalize_flag           => abs_cur.normalize,
4287                          p_mths                     => p_mths,
4288                          p_term_start_dt            => abs_cur.start_date,
4289                          p_term_end_dt              => abs_cur.end_date,
4290                          p_freq_code                => abs_cur.frequency_code,
4291                          p_sch_day                  => abs_cur.schedule_day,
4292                          p_new_lea_comm_dt          => p_new_lea_comm_dt,
4293                          p_new_lea_term_dt          => p_new_lea_term_dt,
4294                          p_old_lea_term_dt          => NULL,
4295                          p_no_sch                   => l_no_sch,
4296                          p_freq                     => l_freq,
4297                          p_counter                  => l_counter,
4298                          p_sch_dt                   => l_sch_dt,
4299                          p_pro_sch_dt               => l_pro_sch_dt,
4300                          p_sch_str_dt               => l_sch_str_dt,
4301                          p_norm_str_dt              => l_norm_str_dt,
4302                          p_lease_id                 => p_lease_id,
4303                          p_term_id                  => abs_cur.payment_term_id);
4304 
4305             process_term(p_no_sch                   => l_no_sch,
4306                          p_counter                  => l_counter,
4307                          p_sch_dt                   => l_sch_dt,
4308                          p_pro_sch_dt               => l_pro_sch_dt,
4309                          p_new_lea_term_dt          => p_new_lea_term_dt ,
4310                          p_freq                     => l_freq,
4311                          p_freq_code                => abs_cur.frequency_code,
4312                          p_payment_term_id          => abs_cur.payment_term_id,
4313                          p_pay_trm_typ_code         => abs_cur.payment_term_type_code,
4314                          p_trgt_dt                  => abs_cur.target_date,
4315                          p_normalize_flag           => abs_cur.normalize,
4316                          p_lease_context            => 'ABS',
4317                          p_mths                     => p_mths,
4318                          p_vendor_id                => abs_cur.vendor_id,
4319                          p_customer_id              => abs_cur.customer_id,
4320                          p_vendor_site_id           => abs_cur.vendor_site_id,
4321                          p_customer_site_use_id     => abs_cur.customer_site_use_id,
4322                          p_cust_ship_site_id        => abs_cur.cust_ship_site_id,
4323                          p_set_of_books_id          => abs_cur.set_of_books_id,
4324                          p_currency_code            => abs_cur.currency_code,
4325                          p_rate                     => abs_cur.rate,
4326                          p_term_start_date          => abs_cur.start_date,
4327                          p_term_end_date            => abs_cur.end_date,
4328                          p_sch_str_dt               => l_sch_str_dt,
4329                          p_act_amt                  => abs_cur.actual_amount,
4330                          p_est_amt                  => abs_cur.estimated_amount,
4331                          p_index_prd_id             => NULL,
4332                          p_norm_str_dt              => l_norm_str_dt,
4333                          p_lease_change_id          => abs_cur.lease_change_id);
4334 
4335          END LOOP;
4336       END IF;
4337 
4338    ELSE
4339 
4340    FOR abs_cur IN term_abs_cur(p_lease_id)
4341    LOOP
4342       get_sch_info(p_lease_context            => p_lease_context,
4343                    p_normalize_flag           => abs_cur.normalize,
4344                    p_mths                     => p_mths,
4345                    p_term_start_dt            => abs_cur.start_date,
4346                    p_term_end_dt              => abs_cur.end_date,
4347                    p_freq_code                => abs_cur.frequency_code,
4348                    p_sch_day                  => abs_cur.schedule_day,
4349                    p_new_lea_comm_dt          => p_new_lea_comm_dt,
4350                    p_new_lea_term_dt          => p_new_lea_term_dt,
4351                    p_old_lea_term_dt          => NULL,
4352                    p_no_sch                   => l_no_sch,
4353                    p_freq                     => l_freq,
4354                    p_counter                  => l_counter,
4355                    p_sch_dt                   => l_sch_dt,
4356                    p_pro_sch_dt               => l_pro_sch_dt,
4357                    p_sch_str_dt               => l_sch_str_dt,
4358                    p_norm_str_dt              => l_norm_str_dt,
4359                    p_lease_id                 => p_lease_id,
4360                    p_term_id                  => abs_cur.payment_term_id);
4361 
4362       process_term(p_no_sch                   => l_no_sch,
4363                    p_counter                  => l_counter,
4364                    p_sch_dt                   => l_sch_dt,
4365                    p_pro_sch_dt               => l_pro_sch_dt,
4366                    p_new_lea_term_dt          => p_new_lea_term_dt ,
4367                    p_freq                     => l_freq,
4368                    p_freq_code                => abs_cur.frequency_code,
4369                    p_payment_term_id          => abs_cur.payment_term_id,
4370                    p_pay_trm_typ_code         => abs_cur.payment_term_type_code,
4371                    p_trgt_dt                  => abs_cur.target_date,
4372                    p_normalize_flag           => abs_cur.normalize,
4373                    p_lease_context            => p_lease_context,
4374                    p_mths                     => p_mths,
4375                    p_vendor_id                => abs_cur.vendor_id,
4376                    p_customer_id              => abs_cur.customer_id,
4377                    p_vendor_site_id           => abs_cur.vendor_site_id,
4378                    p_customer_site_use_id     => abs_cur.customer_site_use_id,
4379                    p_cust_ship_site_id        => abs_cur.cust_ship_site_id,
4380                    p_set_of_books_id          => abs_cur.set_of_books_id,
4381                    p_currency_code            => abs_cur.currency_code,
4382                    p_rate                     => abs_cur.rate,
4383                    p_term_start_date          => abs_cur.start_date,
4384                    p_term_end_date            => abs_cur.end_date,
4385                    p_sch_str_dt               => l_sch_str_dt,
4386                    p_act_amt                  => abs_cur.actual_amount,
4387                    p_est_amt                  => abs_cur.estimated_amount,
4388                    p_index_prd_id             => NULL,
4389                    p_norm_str_dt              => l_norm_str_dt,
4390                    p_lease_change_id          => abs_cur.lease_change_id);
4391 
4392       IF abs_cur.normalize = 'Y' THEN
4393          UPDATE pn_payment_terms_all
4394          SET    norm_start_date = NVL(l_norm_str_dt, p_new_lea_comm_dt),
4395                 norm_end_date   = g_new_lea_term_dt
4396          WHERE  payment_term_id = abs_cur.payment_term_id;
4397       END IF;
4398 
4399    END LOOP;
4400    END IF;
4401    pnp_debug_pkg.log('ABSTRACT -End- (-)');
4402 
4403 END abstract;
4404 
4405 
4406 --------------------------------------------------------------------------------------------
4407 --  PROCEDURE  : ADD_IND_VAR
4408 --  DESCRIPTION: This procedure is used to add a payment term in a given lease when lease is
4409 --               added through INDEX RENT increase. GET_SCH_INFO gives information of the term,
4410 --               PROCESS_TERM creates schedules if required and the Cash / Normalized items.
4411 --  25-JUN-2001  Mrinal Misra    o Created.
4412 --  24-JAN-2002  Satish Tripathi o Removed the hard coding of p_lease_context being passed to
4413 --                                 GET_SCH_INFO and PROCESS_TERM.
4414 --  07-FEB-2002  Satish Tripathi o Added variable l_norm_str_dt to capture Normalize Start
4415 --                                 Date, if term was added through AMEND.
4416 --  26-MAR-2002  Satish Tripathi o Added variable l_sch_str_dt to correctly point the
4417 --                                 Schedule-Start-Date for NON MONTHLY Payment Term.
4418 --  11-Jul-2002   Ashish Kumar      Fix for BUG#2445840 edit the  Procedure :add_ind_var
4419 --                                  Add  the parameter in the call to procedure : get_sch_info
4420 --                                  p_new_lea_term_dt          => p_new_lea_term_dt,
4421 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Pass new parameter p_lease_change_id
4422 --                                 to process_term.
4423 --  17-JAN-2006  piagrawa        o Bug#4931780 - modified to update norm end date.
4424 --  18-APR-2006  Hareesha        o Bug #5115291 - In case of RI term having the
4425 --                                 norm_Start_date, pass norm_start_date to
4426 --                                 get_sch_info
4427 -------------------------------------------------------------------------------------------
4428 PROCEDURE add_ind_var (p_lease_id           NUMBER,
4429                        p_lease_context      VARCHAR2,
4430                        p_term_id            NUMBER,
4431                        p_new_lea_term_dt    DATE,
4432                        p_new_lea_comm_dt    DATE,
4433                        p_mths               NUMBER)
4434 IS
4435 
4436    l_pro_sch_dt                    pn_payment_schedules.schedule_date%TYPE;
4437    l_no_sch                        NUMBER;
4438    l_freq                          NUMBER;
4439    l_counter                       NUMBER;
4440    l_sch_dt                        pn_payment_schedules.schedule_date%TYPE;
4441    l_norm_str_dt                   DATE;
4442    l_sch_str_dt                    DATE;
4443 
4444  BEGIN
4445 
4446    pnp_debug_pkg.log('ADD_IND_VAR +Start+ (+)');
4447    pnp_debug_pkg.log('ADD_IND_VAR IN: p_lease_id         : '||p_lease_id);
4448    pnp_debug_pkg.log('ADD_IND_VAR IN: p_lease_context    : '||p_lease_context);
4449    pnp_debug_pkg.log('ADD_IND_VAR IN: p_term_id          : '||p_term_id);
4450    pnp_debug_pkg.log('ADD_IND_VAR IN: p_new_lea_term_dt  : '||p_new_lea_term_dt);
4451    pnp_debug_pkg.log('ADD_IND_VAR IN: p_new_lea_comm_dt  : '||p_new_lea_comm_dt);
4452    pnp_debug_pkg.log('ADD_IND_VAR IN: p_mths             : '||p_mths);
4453    FOR add_ind_var_cur IN term_add_ind_var_cur(p_lease_id, p_term_id)
4454    LOOP
4455 
4456       l_norm_str_dt := add_ind_var_cur.norm_start_date;
4457 
4458       get_sch_info(p_lease_context            => p_lease_context,
4459                    p_normalize_flag           => add_ind_var_cur.normalize,
4460                    p_mths                     => p_mths,
4461                    p_term_start_dt            => add_ind_var_cur.start_date,
4462                    p_term_end_dt              => add_ind_var_cur.end_date,
4463                    p_freq_code                => add_ind_var_cur.frequency_code,
4464                    p_sch_day                  => add_ind_var_cur.schedule_day,
4465                    p_new_lea_comm_dt          => NVL(l_norm_str_dt,p_new_lea_comm_dt),
4466                    p_new_lea_term_dt          => p_new_lea_term_dt,      -- Added for BUG#2445840
4467                    p_old_lea_term_dt          => NULL,
4468                    p_no_sch                   => l_no_sch,
4469                    p_freq                     => l_freq,
4470                    p_counter                  => l_counter,
4471                    p_sch_dt                   => l_sch_dt,
4472                    p_pro_sch_dt               => l_pro_sch_dt,
4473                    p_sch_str_dt               => l_sch_str_dt,
4474                    p_norm_str_dt              => l_norm_str_dt,
4475                    p_lease_id                 => p_lease_id,
4476                    p_term_id                  => add_ind_var_cur.payment_term_id);
4477 
4478       process_term(p_no_sch                   => l_no_sch,
4479                    p_counter                  => l_counter,
4480                    p_sch_dt                   => l_sch_dt,
4481                    p_pro_sch_dt               => l_pro_sch_dt,
4482                    p_new_lea_term_dt          => p_new_lea_term_dt ,
4483                    p_freq                     => l_freq,
4484                    p_freq_code                => add_ind_var_cur.frequency_code,
4485                    p_payment_term_id          => add_ind_var_cur.payment_term_id,
4486                    p_pay_trm_typ_code         => add_ind_var_cur.payment_term_type_code,
4487                    p_trgt_dt                  => add_ind_var_cur.target_date,
4488                    p_normalize_flag           => add_ind_var_cur.normalize,
4489                    p_lease_context            => p_lease_context,
4490                    p_mths                     => p_mths,
4491                    p_vendor_id                => add_ind_var_cur.vendor_id,
4492                    p_customer_id              => add_ind_var_cur.customer_id,
4493                    p_vendor_site_id           => add_ind_var_cur.vendor_site_id,
4494                    p_customer_site_use_id     => add_ind_var_cur.customer_site_use_id,
4495                    p_cust_ship_site_id        => add_ind_var_cur.cust_ship_site_id,
4496                    p_set_of_books_id          => add_ind_var_cur.set_of_books_id,
4497                    p_currency_code            => add_ind_var_cur.currency_code,
4498                    p_rate                     => add_ind_var_cur.rate,
4499                    p_term_start_date          => add_ind_var_cur.start_date,
4500                    p_term_end_date            => add_ind_var_cur.end_date,
4501                    p_sch_str_dt               => l_sch_str_dt,
4502                    p_act_amt                  => add_ind_var_cur.actual_amount,
4503                    p_est_amt                  => add_ind_var_cur.estimated_amount,
4504                    p_index_prd_id             => NULL,
4505                    p_norm_str_dt              => l_norm_str_dt,
4506                    p_lease_change_id          => add_ind_var_cur.lease_change_id);
4507 
4508       IF add_ind_var_cur.normalize = 'Y' THEN
4509          UPDATE pn_payment_terms_all
4510          SET    norm_start_date = l_norm_str_dt,
4511                 norm_end_date   = g_new_lea_term_dt
4512          WHERE  payment_term_id = add_ind_var_cur.payment_term_id;
4513       END IF;
4514 
4515    END LOOP;
4516    pnp_debug_pkg.log('ADD_IND_VAR -End- (-)');
4517 
4518 END add_ind_var;
4519 
4520 
4521 --------------------------------------------------------------------------------
4522 --  PROCEDURE  : CONTRACT_PAY_TERM
4523 --  DESCRIPTION: This procedure is used to contract a given term. Extra
4524 --               schedules and Cash Items of all terms are deleted and the cash
4525 --               for last item is recalculeted.
4526 --               For Normalized term, items are re-Normalized.
4527 -- 01-FEB-02  Satish    o Created.
4528 -- 07-FEB-02  Satish    o Added l_norm_str_dt to capture Normalize Start Date,
4529 --                        if term was added through AMEND and pass it to
4530 --                        routine CREATE_NORMALIZE_ITEMS.
4531 -- 26-MAR-02  Satish    o Added condition to correctly point the l_sch_str_dt
4532 --                        (Schedule-Start-Date) for NON MONTHLY Payment Term.
4533 -- 31-MAY-02  Satish    o Modified cursor contract_pay_term, Bug# 2370889
4534 -- 07-OCT-02  Satish    o Removed payment_status_lookup_code = 'DRAFT' from
4535 --                        cursor. BUG # 2551423 - if term is contracted to last
4536 --                        day of last appr schedule, cursor was returning null.
4537 -- 10-DEC-02  graghuna  o Pass p_norm_end_date to create_normalize_items
4538 --                        for Month-to-Month Re-Normalization issue.
4539 -- 16-OCT-03  Satish    o BUG # 3201091. Pass new parameter p_lease_change_id
4540 --                        to create_normalize_items.
4541 -- 27-OCT-03  Satish    o BUG # 3178064. For ACT lease use lease termination
4542 --                        date for norm_end_date else use Get_Norm_End_Date.
4543 -- 14-DEC-03  Satish    o BUG # 3316671. Call add_main at end to create the
4544 --                        Schedules and items of of new terms added alongwith.
4545 -- 24-MAR-04  Satish    o BUG # 3295405. If norm_start_date is null (old data),
4546 --                        use Get_First_Item_Date.
4547 -- 07-MAY-04  Satish    o BUG # 3401162. Do not update cash item amount in any
4548 --                        ciscumstances for OT term.
4549 -- 13-MAR-05  Kiran     o Bug # 4146964. We do not look for non-zero CASH item
4550 --                        when contracting anymore. Changed cursor
4551 --                        lst_cash_sch_dt_cur. Update the actual amount in CASH
4552 --                        item only if the last period is partial.
4553 --------------------------------------------------------------------------------
4554 PROCEDURE contract_pay_term (p_lease_id           NUMBER,
4555                              p_lease_context      VARCHAR2,
4556                              p_new_lea_term_dt    DATE,
4557                              p_new_lea_comm_dt    DATE,
4558                              p_mths               NUMBER)
4559 IS
4560 
4561    l_frequency                     NUMBER;
4562    l_sch_str_dt                    DATE;
4563    l_sch_end_dt                    DATE;
4564    l_lst_cash_sch_dt               DATE;
4565    l_norm_str_dt                   DATE;
4566    l_lease_termination_date        DATE;
4567 
4568    CURSOR lst_cash_sch_dt_cur (p_term_id     NUMBER,
4569                                p_term_end_dt DATE)
4570    IS
4571       SELECT MAX(pps.schedule_date)
4572       FROM   pn_payment_schedules_all pps,
4573              pn_payment_items_all ppi
4574       WHERE  pps.payment_schedule_id = ppi.payment_schedule_id
4575       AND    ppi.payment_term_id = p_term_id
4576       AND    ppi.actual_amount IS NOT NULL
4577       AND    ppi.payment_item_type_lookup_code = 'CASH'
4578       AND    First_Day(pps.schedule_date) <= First_Day(p_term_end_dt);
4579 
4580 BEGIN
4581 
4582    pnp_debug_pkg.log('CONTRACT_PAY_TERM - Contraction of Payment Term - CONTERM +Start+ (+)');
4583    pnp_debug_pkg.log('CONTRACT_PAY_TERM IN: p_lease_id        : '||p_lease_id);
4584    pnp_debug_pkg.log('CONTRACT_PAY_TERM IN: p_lease_context   : '||p_lease_context);
4585    pnp_debug_pkg.log('CONTRACT_PAY_TERM IN: p_new_lea_term_dt : '||p_new_lea_term_dt);
4586    pnp_debug_pkg.log('CONTRACT_PAY_TERM IN: p_new_lea_comm_dt : '||p_new_lea_comm_dt);
4587    pnp_debug_pkg.log('CONTRACT_PAY_TERM IN: p_mths            : '||p_mths);
4588 
4589    IF g_lease_status = 'ACT' THEN
4590       l_lease_termination_date := g_new_lea_term_dt;
4591    ELSE
4592       l_lease_termination_date := Get_Norm_End_Date(p_lease_id);
4593    END IF;
4594 
4595    FOR pay_term_con_cur IN payment_term_con_cur (p_lease_id)
4596    LOOP
4597 
4598       pnp_debug_pkg.log('CONTRACT_PAY_TERM - Term ID          : '
4599                          ||TO_CHAR(pay_term_con_cur.payment_term_id)
4600                          ||' , Term End Date: '||pay_term_con_cur.end_date);
4601 
4602       IF pay_term_con_cur.frequency_code = 'OT' THEN
4603          pnp_debug_pkg.log('CONTRACT_PAY_TERM - Cash Amount Updation not required for OT Term.');
4604 
4605       ELSE
4606          OPEN lst_cash_sch_dt_cur(pay_term_con_cur.payment_term_id, pay_term_con_cur.end_date);
4607             FETCH lst_cash_sch_dt_cur INTO l_lst_cash_sch_dt;
4608          CLOSE lst_cash_sch_dt_cur;
4609 
4610          pnp_debug_pkg.log('CONTRACT_PAY_TERM - Term Freq: '||pay_term_con_cur.frequency_code
4611                             ||' , Last Cash Sch Dt : '||l_lst_cash_sch_dt);
4612 
4613          l_frequency  := get_frequency(p_freq_code => pay_term_con_cur.frequency_code);
4614 
4615          /* get the applicable dates for the schedule */
4616 
4617          /* For Monthly Term, Schedule-Start-Date is the First Day of the month of Schedule-Date.
4618             For Non Monthly Term, Schedule-Start-Date is Term Start Day of the month of the Schedule-Date.
4619          */
4620 
4621          IF pay_term_con_cur.frequency_code IN ('MON') THEN
4622 
4623             l_sch_str_dt := First_Day(l_lst_cash_sch_dt);
4624             l_sch_end_dt := LAST_DAY(l_lst_cash_sch_dt);
4625 
4626          ELSE
4627 
4628             l_sch_str_dt := TO_DATE(TO_CHAR(pay_term_con_cur.start_date,'DD')||'/'||
4629                                             TO_CHAR(l_lst_cash_sch_dt,'MM/YYYY')
4630                                     ,'DD/MM/YYYY');
4631             l_sch_end_dt := ADD_MONTHS(l_sch_str_dt, l_frequency)-1;
4632 
4633          END IF;
4634 
4635          IF l_sch_end_dt <> pay_term_con_cur.end_date THEN
4636 
4637            pnp_debug_pkg.log('CONTRACT_PAY_TERM - last schedule is partial');
4638            pnp_debug_pkg.log(' Term End Date: '||pay_term_con_cur.end_date||
4639                              ' - '||
4640                              ' Schedule End Date: '||l_sch_end_dt);
4641 
4642            update_cash_item(p_term_id       => pay_term_con_cur.payment_term_id,
4643                             p_term_str_dt   => pay_term_con_cur.start_date,
4644                             p_term_end_dt   => pay_term_con_cur.end_date,
4645                             p_schedule_dt   => l_lst_cash_sch_dt,
4646                             p_sch_str_dt    => l_sch_str_dt,
4647                             p_sch_end_dt    => l_sch_end_dt,
4648                             p_act_amt       => pay_term_con_cur.actual_amount,
4649                             p_est_amt       => pay_term_con_cur.estimated_amount,
4650                             p_freq          => l_frequency);
4651 
4652          END IF;
4653 
4654          IF pay_term_con_cur.normalize = 'Y' THEN
4655 
4656             UPDATE pn_payment_items_all
4657             SET    estimated_amount = 0,
4658                    actual_amount    = 0,
4659                    export_currency_amount = 0,
4660                    last_update_date = SYSDATE,
4661                    last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
4662                    last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
4663             WHERE  payment_item_id IN (SELECT ppi1.payment_item_id
4664                                        FROM   pn_payment_items_all ppi1,
4665                                               pn_payment_schedules_all pps
4666                                        WHERE  ppi1.payment_term_id = pay_term_con_cur.payment_term_id
4667                                        AND    ppi1.payment_item_type_lookup_code = 'CASH'
4668                                        AND    pps.payment_status_lookup_code = 'DRAFT'
4669                                        AND    pps.payment_schedule_id = ppi1.payment_schedule_id
4670                                        AND    pps.schedule_date > l_lst_cash_sch_dt);
4671 
4672             pnp_debug_pkg.log('CONTRACT_PAY_TERM - Updated Cash Items Amt to 0. - Normalize');
4673 
4674          ELSE
4675 
4676             DELETE pn_payment_items_all ppi
4677             WHERE  ppi.payment_term_id = pay_term_con_cur.payment_term_id
4678             AND    ppi.payment_schedule_id IN (SELECT pps1.payment_schedule_id
4679                                                FROM   pn_payment_schedules_all pps1,
4680                                                       pn_payment_items_all ppi1
4681                                                WHERE  ppi1.payment_term_id = pay_term_con_cur.payment_term_id
4682                                                AND    pps1.payment_schedule_id = ppi1.payment_schedule_id
4683                                                AND    pps1.payment_status_lookup_code = 'DRAFT'
4684                                                AND    pps1.schedule_date > l_lst_cash_sch_dt);
4685 
4686             DELETE pn_payment_schedules_all pps
4687             WHERE  pps.lease_id = p_lease_id
4688             AND    pps.payment_schedule_id IN (SELECT pps1.payment_schedule_id
4689                                                FROM   pn_payment_schedules_all pps1
4690                                                WHERE  pps1.lease_id = p_lease_id
4691                                                AND    TO_NUMBER(TO_CHAR(pps1.schedule_date,'DD'))
4692                                                       = pay_term_con_cur.schedule_day
4693                                                AND    pps1.schedule_date > l_lst_cash_sch_dt
4694                                                AND NOT EXISTS (SELECT NULL
4695                                                                FROM   pn_payment_items_all ppi
4696                                                                WHERE  ppi.payment_schedule_id
4697                                                                       = pps1.payment_schedule_id
4698                                                               )
4699                                               );
4700 
4701             pnp_debug_pkg.log('CONTRACT_PAY_TERM - Deleted Cash Items.');
4702 
4703          END IF;
4704       END IF;
4705 
4706 
4707       IF pay_term_con_cur.normalize = 'Y' THEN
4708 
4709          /* If the Term is Contracted, its Normalization should start from
4710             the same date of normalization, when the term was Abstracted or Added. */
4711 
4712          l_norm_str_dt := NVL(pay_term_con_cur.norm_start_date,
4713                               Get_First_Item_Date(pay_term_con_cur.payment_term_id));
4714 
4715          /* AMT-RETRO */
4716          IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
4717            create_normalize_items(p_lease_context      => p_lease_context,
4718                                   p_lease_id           => p_lease_id,
4719                                   p_term_id            => pay_term_con_cur.payment_term_id,
4720                                   p_vendor_id          => pay_term_con_cur.vendor_id,
4721                                   p_cust_id            => pay_term_con_cur.customer_id,
4722                                   p_vendor_site_id     => pay_term_con_cur.vendor_site_id,
4723                                   p_cust_site_use_id   => pay_term_con_cur.customer_site_use_id,
4724                                   p_cust_ship_site_id  => pay_term_con_cur.cust_ship_site_id,
4725                                   p_sob_id             => pay_term_con_cur.set_of_books_id,
4726                                   p_curr_code          => pay_term_con_cur.currency_code,
4727                                   p_sch_day            => pay_term_con_cur.schedule_day,
4728                                   p_norm_str_dt        => l_norm_str_dt,
4729                                   p_norm_end_dt        => NVL(pay_term_con_cur.norm_end_date,
4730                                                               l_lease_termination_date),
4731                                   p_rate               => pay_term_con_cur.rate,
4732                                   p_lease_change_id    => pay_term_con_cur.lease_change_id);
4733          ELSE
4734            PN_NORM_RENORM_PKG.NORMALIZE_RENORMALIZE
4735                                  (p_lease_context      => p_lease_context,
4736                                   p_lease_id           => p_lease_id,
4737                                   p_term_id            => pay_term_con_cur.payment_term_id,
4738                                   p_vendor_id          => pay_term_con_cur.vendor_id,
4739                                   p_cust_id            => pay_term_con_cur.customer_id,
4740                                   p_vendor_site_id     => pay_term_con_cur.vendor_site_id,
4741                                   p_cust_site_use_id   => pay_term_con_cur.customer_site_use_id,
4742                                   p_cust_ship_site_id  => pay_term_con_cur.cust_ship_site_id,
4743                                   p_sob_id             => pay_term_con_cur.set_of_books_id,
4744                                   p_curr_code          => pay_term_con_cur.currency_code,
4745                                   p_sch_day            => pay_term_con_cur.schedule_day,
4746                                   p_norm_str_dt        => l_norm_str_dt,
4747                                   p_norm_end_dt        => NVL(pay_term_con_cur.norm_end_date,
4748                                                               l_lease_termination_date),
4749                                   p_rate               => pay_term_con_cur.rate,
4750                                   p_lease_change_id    => pay_term_con_cur.lease_change_id);
4751 
4752          END IF;
4753 
4754       END IF;
4755 
4756       UPDATE pn_payment_terms_all
4757       SET    changed_flag = 'N'
4758       WHERE  payment_term_id = pay_term_con_cur.payment_term_id;
4759 
4760    END LOOP;
4761 
4762    /* Now create the schedules and items for the new terms that have been added along with
4763       the contraction of the main lease */
4764 
4765    add_main(p_lease_id            => p_lease_id,
4766             p_lease_context       => 'ADDEDT',
4767             p_new_lea_term_dt     => p_new_lea_term_dt,
4768             p_new_lea_comm_dt     => p_new_lea_comm_dt,
4769             p_mths                => p_mths);
4770 
4771 
4772    pnp_debug_pkg.log('CONTRACT_PAY_TERM - Contraction of Payment Term - CONTERM -End- (+)');
4773 
4774 END contract_pay_term;
4775 ------------------------------------------------------------------------
4776 --  FUNCTION  :- GET_LEASE_CHANGE_ID
4777 --  23-SEP-2002  graghuna        o created
4778 --  10-DEC-2002  graghuna        o Modified Cursor lease_dt_hist_cursor. Union to
4779 --                                 tables pn_lease_details_all and pn_leases_all
4780 --                                 for Month-to-Month Re-Normalization issue. --MTM-I
4781 ------------------------------------------------------------------------
4782 FUNCTION Get_Lease_Change_Id (p_lease_id IN NUMBER)
4783 RETURN   NUMBER
4784 IS
4785 
4786    l_lease_change_id               NUMBER := 0;
4787    l_act_lease_found               BOOLEAN := FALSE;
4788 
4789    CURSOR lease_dt_hist_cursor IS
4790       SELECT lease_change_id, lease_status
4791       FROM   pn_lease_details_history
4792       WHERE  lease_id = p_lease_id
4793       UNION
4794       SELECT b.lease_change_id, a.lease_status
4795       FROM   pn_leases_all a, pn_lease_details_all b
4796       WHERE  a.lease_id = b.lease_id
4797       AND    a.lease_id = p_lease_id
4798       ORDER BY 1 DESC;
4799 
4800 BEGIN
4801 
4802     FOR lease_dt_hist_rec in lease_dt_hist_cursor
4803     LOOP
4804 
4805         IF lease_dt_hist_rec.lease_status = 'ACT' THEN
4806             l_lease_change_id := lease_dt_hist_rec.lease_change_id;
4807             l_act_lease_found := TRUE;
4808         END IF;
4809 
4810         IF l_act_lease_found and lease_dt_hist_rec.lease_status not in ('ACT')  THEN
4811             EXIT;
4812         END IF;
4813 
4814     END LOOP;
4815 
4816     RETURN l_lease_change_id;
4817 
4818 END Get_Lease_Change_Id;
4819 
4820 
4821 ------------------------------------------------------------------------
4822 --  FUNCTION  :- GET_SCHEDULE_DATE
4823 --  DESCRIPTION :- Given the schedule_day and the lease dates this function
4824 --                 will return the schedule date for that period if there
4825 --                 are no approved payments for that date, otherwise it
4826 --                 will return the next day.
4827 -- 23-SEP-2002  graghuna o created
4828 -- 31-OCT-2002  Satish Tripathi o Changed TO_DATE format from MON-YYYY to MM/YYYY
4829 --                                for GSCC error.
4830 -- 18-DEC-2002  graghua         o modified to check for APRROVED status from the
4831 --                                payment term start date until lease extension end date
4832 -- 21-Oct-2004  vmmehta         o bug# 3934425 - Added parameter p_freq.
4833 ------------------------------------------------------------------------
4834 FUNCTION Get_Schedule_Date (p_lease_id   IN NUMBER,
4835                             p_day        IN NUMBER,
4836                             p_start_date IN DATE,
4837                             p_end_date   IN DATE,
4838                             p_freq       IN NUMBER)
4839 RETURN   DATE
4840 IS
4841    l_dummy                         NUMBER := NULL;
4842    l_sch_day                       NUMBER := NULL;
4843    l_schedule_date                 DATE := NULL;
4844    l_start_schedule_date           DATE := NULL;
4845    l_max_sch_date                  DATE := TO_DATE('28/'||TO_CHAR(p_start_date,'MM/YYYY'),'DD/MM/YYYY');
4846    l_found_apprvd_sch              BOOLEAN := FALSE;
4847 
4848    CURSOR check_sch_date (p_schedule_date DATE) IS
4849       SELECT payment_schedule_id
4850       FROM   pn_payment_schedules_all
4851       WHERE  lease_id = p_lease_id
4852       AND    schedule_date = p_schedule_date
4853       AND    payment_status_lookup_code = 'APPROVED';
4854 BEGIN
4855 
4856    pnp_debug_pkg.log('GET_SCHEDULE_DATE (+) LeaseId: '||p_lease_id||' Day: '||p_day);
4857 
4858    l_start_schedule_date := TO_DATE(TO_CHAR(p_day)||'/'||TO_CHAR(p_start_date,'MM/YYYY'),'DD/MM/YYYY');
4859 
4860    -- Check if there is any approved scheule for that date
4861    -- If so we will add 1 to the schedule_date.Using date will take care
4862    -- of leap year complexity. While inserting day in the payment terms table
4863    -- just strip off the DAY part from the date returned by this function
4864 
4865     WHILE l_start_schedule_date <=  l_max_sch_date
4866     LOOP
4867        l_found_apprvd_sch := FALSE;
4868        l_schedule_date := l_start_schedule_date;
4869        WHILE l_schedule_date < p_end_date LOOP
4870           -- If there is nothing in approved status for that
4871           -- date then no_Data_found will be raised and this
4872           -- loop will exit;
4873           l_dummy := NULL;
4874           OPEN check_sch_date(l_schedule_date);
4875              FETCH check_sch_date
4876              INTO  l_dummy;
4877              IF check_sch_date%NOTFOUND THEN
4878                 CLOSE check_sch_date;
4879              END IF;
4880 
4881              IF l_dummy IS NOT NULL THEN
4882                 l_found_apprvd_sch := TRUE;
4883                 CLOSE check_sch_date;
4884                 l_start_schedule_date := l_start_schedule_date  + 1;
4885                 IF l_start_schedule_date > l_max_sch_date THEN
4886                    -- This means that all days in the period
4887                    -- were used up.
4888                    l_schedule_date := NULL;
4889                 END IF;
4890                 EXIT;
4891              END IF;
4892                l_schedule_date  := ADD_MONTHS(l_schedule_date, p_freq);
4893           IF check_sch_date%ISOPEN THEN
4894              CLOSE check_sch_date;
4895           END IF;
4896        END LOOP;
4897        -- end loop for l_start_date
4898        -- if l_Found_apprvd_sch is false it means that all the schedule_dates
4899        -- until the p_end_date are unapprvoed so we can use the schedule day
4900        -- of the schedule date
4901        IF NOT(l_found_apprvd_sch) THEN
4902           EXIT;
4903        END IF;
4904     END LOOP;
4905 
4906    pnp_debug_pkg.log('GET_SCHEDULE_DATE (-) Schedule Date: '||l_schedule_date);
4907    RETURN l_schedule_date;
4908 
4909 EXCEPTION
4910    WHEN OTHERS THEN
4911        pnp_debug_pkg.log('GET_SCHEDULE_DATE - Others error ..' || sqlerrm);
4912        l_schedule_Date := NULL;
4913        RETURN l_schedule_date;
4914 
4915 END Get_Schedule_Date;
4916 
4917 -------------------------------------------------------------------------------
4918 --  PROCEDURE :- INSERT_PAYMENT_TERM
4919 --  DESCRIPTION :-  Procedure to create records in pn_payment_terms table
4920 -- 23-SEP-2002  graghuna o created
4921 -- 13-JAN-2002  psidhu   o Added logic to insert distribution information for new term
4922 --                         being created. Added parameter x_term_template_id in call to
4923 --                         pnt_payment_terms_pkg.insert_row. Fix for bug#2733889.
4924 --  29-AUG-2003  Satish Tripathi o Fixed for BUG# 3116986, added x_rec_agr_line_id,
4925 --                                 x_period_billrec_id and x_amount_type.
4926 -- 15-JUL-05  hareesha o Bug 4284035 - Replaced pn_distributions with _ALL table.
4927 -- 16-OCT-06  Hareesha o MTM - Populate parent_term_id and index_norm_flag
4928 --                       while insertion.
4929 -- 03-APR-07  Prabhakar o Bug #5958872. Added the two parameters area and
4930 --                        area_type_code in the call to inser_row handler.
4931 -------------------------------------------------------------------------------
4932 PROCEDURE Insert_Payment_Term (p_payment_term_rec              IN OUT NOCOPY pn_payment_terms_all%ROWTYPE,
4933                                x_return_status                    OUT NOCOPY VARCHAR2,
4934                                x_return_message                   OUT NOCOPY VARCHAR2)
4935 IS
4936 
4937    l_payment_term_id               NUMBER := NULL;
4938    l_rowid                         ROWID;
4939    l_distribution_id               NUMBER;
4940    l_dist_rowid                    ROWID;
4941 
4942  CURSOR csr_distributions (p_payment_term_id IN NUMBER)
4943    IS
4944    SELECT *
4945    FROM pn_distributions_all
4946    WHERE payment_term_id = p_payment_term_id;
4947 
4948 
4949 BEGIN
4950 
4951    pnp_debug_pkg.log('INSERT_PAYMENT_TERM (+) ');
4952 
4953    pnt_payment_terms_pkg.Insert_Row
4954    (
4955         x_rowid                         => l_rowid,
4956         x_payment_term_id               => l_payment_term_id,
4957         x_payment_purpose_code          => p_payment_term_rec.payment_purpose_code,
4958         x_payment_term_type_code        => p_payment_term_rec.payment_term_type_code,
4959         x_frequency_code                => p_payment_term_rec.frequency_code,
4960         x_lease_id                      => p_payment_term_rec.lease_id,
4961         x_lease_change_id               => p_payment_term_rec.lease_change_id,
4962         x_start_date                    => p_payment_term_rec.start_date,
4963         x_end_date                      => p_payment_term_rec.end_date,
4964         x_vendor_id                     => p_payment_term_rec.vendor_id,
4965         x_vendor_site_id                => p_payment_term_rec.vendor_site_id,
4966         x_customer_id                   => p_payment_term_rec.customer_id,
4967         x_customer_site_use_id          => p_payment_term_rec.customer_site_use_id,
4968         x_target_date                   => p_payment_term_rec.target_date,
4969         x_actual_amount                 => p_payment_term_rec.actual_amount,
4970         x_estimated_amount              => p_payment_term_rec.estimated_amount,
4971         x_set_of_books_id               => p_payment_term_rec.set_of_books_id,
4972         x_currency_code                 => p_payment_term_rec.currency_code,
4973         x_rate                          => p_payment_term_rec.rate,
4974         x_normalize                     => p_payment_term_rec.normalize,
4975         x_location_id                   => p_payment_term_rec.location_id,
4976         x_schedule_day                  => p_payment_term_rec.schedule_day,
4977         x_cust_ship_site_id             => p_payment_term_rec.cust_ship_site_id,
4978         x_ap_ar_term_id                 => p_payment_term_rec.ap_ar_term_id,
4979         x_cust_trx_type_id              => p_payment_term_rec.cust_trx_type_id,
4980         x_project_id                    => p_payment_term_rec.project_id,
4981         x_task_id                       => p_payment_term_rec.task_id,
4982         x_organization_id               => p_payment_term_rec.organization_id,
4983         x_expenditure_type              => p_payment_term_rec.expenditure_type,
4984         x_expenditure_item_date         => p_payment_term_rec.expenditure_item_date,
4985         x_tax_group_id                  => p_payment_term_rec.tax_group_id,
4986         x_tax_code_id                   => p_payment_term_rec.tax_code_id,
4987         x_tax_included                  => p_payment_term_rec.tax_included,
4988         x_distribution_set_id           => p_payment_term_rec.distribution_set_id,
4989         x_inv_rule_id                   => p_payment_term_rec.inv_rule_id,
4990         x_account_rule_id               => p_payment_term_rec.account_rule_id,
4991         x_salesrep_id                   => p_payment_term_rec.salesrep_id,
4992         x_approved_by                   => p_payment_term_rec.approved_by,
4993         x_status                        => p_payment_term_rec.status,
4994         x_index_period_id               => p_payment_term_rec.index_period_id,
4995         x_index_term_indicator          => p_payment_term_rec.index_term_indicator,
4996         x_po_header_id                  => p_payment_term_rec.po_header_id,
4997         x_cust_po_number                => p_payment_term_rec.cust_po_number,
4998         x_receipt_method_id             => p_payment_term_rec.receipt_method_id,
4999         x_var_rent_inv_id               => p_payment_term_rec.var_rent_inv_id,
5000         x_var_rent_type                 => p_payment_term_rec.var_rent_type,
5001         x_changed_flag                  => p_payment_term_rec.changed_flag,
5002         x_term_template_id              => p_payment_term_rec.term_template_id,
5003         x_attribute_category            => p_payment_term_rec.attribute_category,
5004         x_attribute1                    => p_payment_term_rec.attribute1,
5005         x_attribute2                    => p_payment_term_rec.attribute2,
5006         x_attribute3                    => p_payment_term_rec.attribute3,
5007         x_attribute4                    => p_payment_term_rec.attribute4,
5008         x_attribute5                    => p_payment_term_rec.attribute5,
5009         x_attribute6                    => p_payment_term_rec.attribute6,
5010         x_attribute7                    => p_payment_term_rec.attribute7,
5011         x_attribute8                    => p_payment_term_rec.attribute8,
5012         x_attribute9                    => p_payment_term_rec.attribute9,
5013         x_attribute10                   => p_payment_term_rec.attribute10,
5014         x_attribute11                   => p_payment_term_rec.attribute11,
5015         x_attribute12                   => p_payment_term_rec.attribute12,
5016         x_attribute13                   => p_payment_term_rec.attribute13,
5017         x_attribute14                   => p_payment_term_rec.attribute14,
5018         x_attribute15                   => p_payment_term_rec.attribute15,
5019         x_project_attribute_category    => p_payment_term_rec.project_attribute_category,
5020         x_project_attribute1            => p_payment_term_rec.project_attribute1,
5021         x_project_attribute2            => p_payment_term_rec.project_attribute2,
5022         x_project_attribute3            => p_payment_term_rec.project_attribute3,
5023         x_project_attribute4            => p_payment_term_rec.project_attribute4,
5024         x_project_attribute5            => p_payment_term_rec.project_attribute5,
5025         x_project_attribute6            => p_payment_term_rec.project_attribute6,
5026         x_project_attribute7            => p_payment_term_rec.project_attribute7,
5027         x_project_attribute8            => p_payment_term_rec.project_attribute8,
5028         x_project_attribute9            => p_payment_term_rec.project_attribute9,
5029         x_project_attribute10           => p_payment_term_rec.project_attribute10,
5030         x_project_attribute11           => p_payment_term_rec.project_attribute11,
5031         x_project_attribute12           => p_payment_term_rec.project_attribute12,
5032         x_project_attribute13           => p_payment_term_rec.project_attribute13,
5033         x_project_attribute14           => p_payment_term_rec.project_attribute14,
5034         x_project_attribute15           => p_payment_term_rec.project_attribute15,
5035         x_creation_date                 => SYSDATE,
5036         x_created_by                    => fnd_global.user_id,
5037         x_last_update_date              => SYSDATE,
5038         x_last_updated_by               => fnd_global.user_id,
5039         x_last_update_login             => fnd_global.login_id,
5040         x_lease_status                  => p_payment_term_rec.lease_status,
5041         x_org_id                        => p_payment_term_rec.org_id,
5042         x_rec_agr_line_id               => p_payment_term_rec.rec_agr_line_id,
5043         x_period_billrec_id             => p_payment_term_rec.period_billrec_id,
5044         x_amount_type                   => p_payment_term_rec.amount_type,
5045         x_recoverable_flag              => p_payment_term_rec.recoverable_flag,
5046         x_parent_term_id                => p_payment_term_rec.parent_term_id,
5047         x_index_norm_flag               => p_payment_term_rec.index_norm_flag,
5048         x_area                          => p_payment_term_rec.area,
5049         x_area_type_code                => p_payment_term_rec.area_type_code
5050    );
5051 
5052    pnp_debug_pkg.log('INSERT_PAYMENT_TERM (-) Created Payment Term Id: '||l_payment_term_id);
5053 
5054    -- Fix for bug#2733889
5055 
5056    FOR rec_distributions in csr_distributions(p_payment_term_rec.payment_term_id) LOOP
5057 
5058       pn_distributions_pkg.insert_row (
5059         x_rowid                => l_dist_rowid
5060        ,x_distribution_id      => l_distribution_id
5061        ,x_account_id           => rec_distributions.account_id
5062        ,x_payment_term_id      => l_payment_term_id
5063        ,x_term_template_id     => rec_distributions.term_template_id
5064        ,x_account_class        => rec_distributions.account_class
5065        ,x_percentage           => rec_distributions.percentage
5066        ,x_line_number          => rec_distributions.line_number
5067        ,x_last_update_date     => sysdate
5068        ,x_last_updated_by      => NVL(fnd_profile.VALUE ('USER_ID'), 0)
5069        ,x_creation_date        => sysdate
5070        ,x_created_by           => NVL(fnd_profile.VALUE ('USER_ID'), 0)
5071        ,x_last_update_login    => NVL(fnd_profile.value('LOGIN_ID'),0)
5072        ,x_attribute_category   => rec_distributions.attribute_category
5073        ,x_attribute1           => rec_distributions.attribute1
5074        ,x_attribute2           => rec_distributions.attribute2
5075        ,x_attribute3           => rec_distributions.attribute3
5076        ,x_attribute4           => rec_distributions.attribute4
5077        ,x_attribute5           => rec_distributions.attribute5
5078        ,x_attribute6           => rec_distributions.attribute6
5079        ,x_attribute7           => rec_distributions.attribute7
5080        ,x_attribute8           => rec_distributions.attribute8
5081        ,x_attribute9           => rec_distributions.attribute9
5082        ,x_attribute10          => rec_distributions.attribute10
5083        ,x_attribute11          => rec_distributions.attribute11
5084        ,x_attribute12          => rec_distributions.attribute12
5085        ,x_attribute13          => rec_distributions.attribute13
5086        ,x_attribute14          => rec_distributions.attribute14
5087        ,x_attribute15          => rec_distributions.attribute15
5088        ,x_org_id               => rec_distributions.org_id);
5089 
5090        pnp_debug_pkg.log('INSERT_PAYMENT_TERM : Created Distribution Id: '||l_distribution_id||
5091                          ' for Payment term id :'||l_payment_term_id);
5092 
5093        l_dist_rowid := NULL;
5094        l_distribution_id := NULL;
5095    END LOOP;
5096    ---
5097 
5098    p_payment_term_rec.payment_term_id := l_payment_term_id;
5099 
5100    pnp_debug_pkg.log('INSERT_PAYMENT_TERM (-)');
5101 
5102 END Insert_Payment_Term;
5103 
5104 --------------------------------------------------------------------------------
5105 --  PROCEDURE :- EXTEND_PAYMENT_TERM
5106 --  DESCRIPTION :- This procedure will be called to extend the end date
5107 --                 on a not normalized payment term. This procedure
5108 --                 is called from ROLLOVER_LEASE
5109 -- 13-DEC-02  graghuna o created  Month-2-Month enchancement.
5110 -- 06-AUG-04  Mrinal   o While updating actual and estimated amount
5111 --                       updated the export currency amount in items
5112 --                       table. Bug # 3804548.
5113 -- 10-JAN-05  Anand    o Code changes for Retro.
5114 -- 24-NOV-05  Kiran    o Round amounts befor insert/uptdate into terms OR items
5115 -- 27-NOV-06  Hareesha o MTM Uptake - Passed payment_term_id parameter to
5116 --                       create_schedules.
5117 --------------------------------------------------------------------------------
5118 
5119 PROCEDURE Extend_Payment_Term (p_payment_term_rec              IN pn_payment_terms_all%ROWTYPE,
5120                                p_new_lea_comm_dt               IN DATE,
5121                                p_new_lea_term_dt               IN DATE,
5122                                p_mths                          IN NUMBER,
5123                                p_new_start_date                IN DATE ,
5124                                p_new_end_date                  IN DATE,
5125                                x_return_status                 OUT NOCOPY VARCHAR2,
5126                                x_return_message                OUT NOCOPY VARCHAR2
5127                               )
5128 
5129 IS
5130    l_pro_sch_dt                    pn_payment_schedules.schedule_date%TYPE;
5131    l_no_sch                        NUMBER;
5132    l_freq                          NUMBER;
5133    l_counter                       NUMBER;
5134    l_sch_dt                        pn_payment_schedules.schedule_date%TYPE;
5135    l_sch_str_dt                    DATE;
5136    l_sch_end_dt                    DATE;
5137    l_norm_st_dt                    DATE;
5138    l_sch_id                        pn_payment_schedules.payment_schedule_id%TYPE;
5139    l_pymnt_st_lkp_cd               pn_payment_schedules.payment_status_lookup_code%TYPE;
5140    l_est_amt                       pn_payment_terms_all.estimated_amount%TYPE;
5141    l_act_amt                       pn_payment_terms_all.actual_amount%TYPE;
5142    l_cash_est_amt                  pn_payment_terms_all.estimated_amount%TYPE;
5143    l_cash_act_amt                  pn_payment_terms_all.actual_amount%TYPE;
5144    l_rec_found                     BOOLEAN := FALSE;
5145    l_sch_day                       VARCHAR2(240);
5146    l_exist_amount                  NUMBER;
5147 
5148    CURSOR existing_payment_item_cur (p_sch_id NUMBER) IS
5149       SELECT payment_item_id, actual_amount, estimated_amount
5150       FROM   pn_payment_items_all
5151       WHERE  payment_schedule_id = p_sch_id
5152       AND    payment_term_id = p_payment_term_rec.payment_term_id
5153       AND    payment_item_type_lookup_code = 'CASH';
5154 
5155    CURSOR exist_appr_item_amt IS
5156       SELECT NVL(SUM(pi.actual_amount),0) amount
5157       FROM   pn_payment_items_all pi,
5158              pn_payment_schedules_all ps
5159       WHERE  pi.payment_term_id = p_payment_term_rec.payment_term_id
5160       AND    pi.payment_schedule_id = ps.payment_schedule_id
5161       AND    ps.schedule_date = l_sch_dt
5162       AND    ps.payment_status_lookup_code = 'APPROVED';
5163 
5164    l_precision                    NUMBER;
5165    l_ext_precision                NUMBER;
5166    l_min_acct_unit                NUMBER;
5167 
5168 BEGIN
5169 
5170    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM (+) '||
5171                      ' Term Id: '|| p_payment_term_rec.payment_term_id||
5172                      ' Term End Date: '|| p_new_end_date);
5173    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM IN: p_new_lea_comm_dt    : '||p_new_lea_comm_dt);
5174    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM IN: p_new_lea_term_dt    : '||p_new_lea_term_dt);
5175    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM IN: p_mths               : '||p_mths);
5176    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM IN: p_new_start_date     : '||p_new_start_date);
5177    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM IN: p_new_end_date       : '||p_new_end_date);
5178 
5179    /* get currency info for rounding */
5180    fnd_currency.get_info( currency_code => p_payment_term_rec.currency_code
5181                          ,precision     => l_precision
5182                          ,ext_precision => l_ext_precision
5183                          ,min_acct_unit => l_min_acct_unit);
5184 
5185    get_sch_info(p_lease_context            => 'ABS',
5186                 p_normalize_flag           => 'N',
5187                 p_mths                     => p_mths,
5188                 p_term_start_dt            => p_payment_term_rec.start_date,
5189                 p_term_end_dt              => p_new_end_date,
5190                 p_freq_code                => p_payment_term_rec.frequency_code,
5191                 p_sch_day                  => p_payment_term_rec.schedule_day,
5192                 p_new_lea_comm_dt          => p_new_lea_comm_dt,
5193                 p_new_lea_term_dt          => p_new_lea_term_dt,
5194                 p_old_lea_term_dt          => NULL,
5195                 p_no_sch                   => l_no_sch,
5196                 p_freq                     => l_freq,
5197                 p_counter                  => l_counter,
5198                 p_sch_dt                   => l_sch_dt,
5199                 p_pro_sch_dt               => l_pro_sch_dt,
5200                 p_sch_str_dt               => l_sch_str_dt,
5201                 p_norm_str_dt              => l_norm_st_dt,
5202                 p_lease_id                 => p_payment_term_rec.lease_id,
5203                 p_term_id                  => p_payment_term_rec.payment_term_id);
5204 
5205    l_sch_day := TO_CHAR(l_sch_dt,'DD');
5206 
5207    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - l_sch dt: '||l_sch_dt||' l_sch day: '||l_sch_day);
5208 
5209    IF p_payment_term_rec.frequency_code IN ('MON', 'OT') THEN
5210       l_sch_str_dt := FIRST_DAY(l_sch_dt);
5211    END IF;
5212 
5213    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - l_sch_str dt: '||l_sch_str_dt||
5214                      ' l_counter: '||l_counter||
5215                      ' l_no_sch: '||l_no_sch);
5216 
5217    FOR i IN (l_counter + 1) .. l_no_sch
5218    LOOP
5219       pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Calling  create schedule ');
5220       /* AMT-RETRO */
5221       IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
5222         create_schedule(p_payment_term_rec.lease_id,
5223                         p_payment_term_rec.lease_change_id,
5224                         l_sch_dt,
5225                         l_sch_id,
5226                         l_pymnt_st_lkp_cd,
5227                         p_payment_term_rec.payment_term_id);
5228       ELSE
5229         PN_RETRO_ADJUSTMENT_PKG.find_schedule(p_payment_term_rec.lease_id,
5230                                               p_payment_term_rec.lease_change_id,
5231                                               p_payment_term_rec.payment_term_id,
5232                                               l_sch_dt,
5233                                               l_sch_id);
5234         l_pymnt_st_lkp_cd := 'DRAFT';
5235       END IF;
5236 
5237       IF p_payment_term_rec.frequency_code IN ('MON', 'OT') THEN
5238          l_sch_end_dt := LAST_DAY(l_sch_dt);
5239       ELSE
5240          l_sch_end_dt := ADD_MONTHS(l_sch_str_dt, l_freq) -1;
5241       END IF;
5242 
5243       pnp_debug_pkg.log('EXTEND_PAYMENT_TERM: l_sch_enddate_ = '||l_sch_end_dt||
5244                         ' l_sch_dt: '|| l_sch_dt||
5245                         ' l_pro_sch_dt: '||l_pro_sch_dt);
5246 
5247       IF l_sch_dt = l_pro_sch_dt THEN
5248          IF p_payment_term_rec.frequency_code = 'OT' THEN
5249 
5250             -- For 'One Time' payment, the payment item amounts will
5251             --   be same as the payment term amounts.
5252 
5253             l_cash_est_amt := p_payment_term_rec.estimated_amount;
5254             l_cash_act_amt :=nvl(p_payment_term_rec.actual_amount,
5255                                  p_payment_term_rec.estimated_amount);
5256          ELSE
5257 
5258             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Calling get_amount, sch st dt    : '
5259                                ||TO_CHAR(l_sch_str_dt,'MM/DD/YYYY'));
5260             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Calling get_amount, sch end dt   : '
5261                                ||TO_CHAR(l_sch_end_dt,'MM/DD/YYYY'));
5262             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Calling get_amount, term st dt   : '
5263                                ||TO_CHAR(p_payment_term_rec.start_date,'MM/DD/YYYY'));
5264             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Calling get_amount, term end dt  : '
5265                                ||TO_CHAR(p_new_end_date,'MM/DD/YYYY'));
5266             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Calling get_amount, act amt      : '
5267                                ||TO_CHAR(l_act_amt));
5268             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Calling get_amount, est amt      : '
5269                                ||TO_CHAR(l_est_amt));
5270             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Calling get_amount, freq : '
5271                                ||TO_CHAR(l_freq));
5272 
5273             get_amount(p_sch_str_dt    => l_sch_str_dt,
5274                        p_sch_end_dt    => l_sch_end_dt,
5275                        p_trm_str_dt    => p_payment_term_rec.start_date,
5276                        p_trm_end_dt    => p_new_end_date,
5277                        p_act_amt       => p_payment_term_rec.actual_amount,
5278                        p_est_amt       => p_payment_term_rec.estimated_amount,
5279                        p_freq          => l_freq,
5280                        p_cash_act_amt  => l_cash_act_amt,
5281                        p_cash_est_amt  => l_cash_est_amt);
5282 
5283             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Returned from get_amount, cash act amt: '
5284                                ||TO_CHAR(l_cash_act_amt));
5285             pnp_debug_pkg.log('EXTEND_PAYMENT_TERM - Returned from get_amount, cash est amt: '
5286                                ||TO_CHAR(l_cash_est_amt));
5287 
5288             -- Get the next schedule date which will have non zero amount
5289 
5290             l_pro_sch_dt := TO_DATE(l_sch_day||'/'||TO_CHAR(ADD_MONTHS(l_pro_sch_dt,l_freq),
5291                                                             'MM/YYYY'),'DD/MM/YYYY');
5292 
5293          END IF;
5294          -- end if of  freq_Code  = OT
5295 
5296       ELSE
5297          -- Set the amounts to zero
5298          l_cash_act_amt := 0;
5299          l_cash_est_amt := NULL;
5300       END IF;
5301 
5302       l_rec_found := FALSE;
5303       IF NOT PNP_UTIL_FUNC.RETRO_ENABLED THEN
5304 
5305         pnp_debug_pkg.log('Retro not enabled... ');
5306         FOR existing_items_rec in existing_payment_item_cur(l_sch_id) LOOP
5307           l_rec_found := TRUE;
5308           IF existing_items_rec.actual_amount <> l_cash_act_amt THEN
5309              UPDATE pn_payment_items_all
5310              SET    actual_amount = ROUND(l_cash_act_amt,l_precision),
5311                     export_currency_amount = ROUND(l_cash_act_amt,l_precision),
5312                     estimated_amount = ROUND(l_cash_est_amt,l_precision),
5313                     last_update_date = sysdate,
5314                     last_updated_by  = fnd_global.user_id
5315              WHERE  payment_item_id = existing_items_rec.payment_item_id;
5316           END IF;
5317           EXIT;
5318         END LOOP;
5319 
5320         IF NOT(l_rec_found) THEN
5321           create_cash_items(p_est_amt           => l_cash_est_amt,
5322                             p_act_amt           => l_cash_act_amt,
5323                             p_sch_dt            => l_sch_dt,
5324                             p_sch_id            => l_sch_id,
5325                             p_term_id           => p_payment_term_rec.payment_term_id,
5326                             p_vendor_id         => p_payment_term_rec.vendor_id,
5327                             p_cust_id           => p_payment_term_rec.customer_id,
5328                             p_vendor_site_id    => p_payment_term_rec.vendor_site_id,
5329                             p_cust_site_use_id  => p_payment_term_rec.customer_site_use_id,
5330                             p_cust_ship_site_id => p_payment_term_rec.cust_ship_site_id,
5331                             p_sob_id            => p_payment_term_rec.set_of_books_id,
5332                             p_curr_code         => p_payment_term_rec.currency_code,
5333                             p_rate              => p_payment_term_rec.rate);
5334         END IF;
5335 
5336       ELSE /* retro is enabled */
5337 
5338         pnp_debug_pkg.log('Retro enabled... ');
5339         l_exist_amount := 0;
5340         FOR amt_rec IN exist_appr_item_amt LOOP
5341           l_exist_amount := amt_rec.amount;
5342         END LOOP;
5343 
5344         FOR existing_items_rec IN existing_payment_item_cur(l_sch_id) LOOP
5345            l_rec_found := TRUE;
5346            IF existing_items_rec.actual_amount <> l_cash_act_amt THEN
5347               UPDATE pn_payment_items_all
5348               SET    actual_amount = ROUND(l_cash_act_amt - l_exist_amount, l_precision),
5349                      export_currency_amount = ROUND(l_cash_act_amt - l_exist_amount, l_precision),
5350                      estimated_amount = ROUND(l_cash_est_amt, l_precision),
5351                      last_update_date = sysdate,
5352                      last_updated_by  = fnd_global.user_id
5353               WHERE  payment_item_id = existing_items_rec.payment_item_id;
5354            END IF;
5355            EXIT;
5356         END LOOP;
5357         IF NOT(l_rec_found) THEN
5358           IF l_cash_act_amt - l_exist_amount <> 0 THEN
5359             create_cash_items(p_est_amt           => l_cash_est_amt,
5360                               p_act_amt           => l_cash_act_amt - l_exist_amount,
5361                               p_sch_dt            => l_sch_dt,
5362                               p_sch_id            => l_sch_id,
5363                               p_term_id           => p_payment_term_rec.payment_term_id,
5364                               p_vendor_id         => p_payment_term_rec.vendor_id,
5365                               p_cust_id           => p_payment_term_rec.customer_id,
5366                               p_vendor_site_id    => p_payment_term_rec.vendor_site_id,
5367                               p_cust_site_use_id  => p_payment_term_rec.customer_site_use_id,
5368                               p_cust_ship_site_id => p_payment_term_rec.cust_ship_site_id,
5369                               p_sob_id            => p_payment_term_rec.set_of_books_id,
5370                               p_curr_code         => p_payment_term_rec.currency_code,
5371                               p_rate              => p_payment_term_rec.rate);
5372           ELSE
5373             DELETE FROM PN_PAYMENT_SCHEDULES_ALL
5374             WHERE  payment_schedule_id = l_sch_id;
5375           END IF;
5376 
5377         END IF; /* NOT(l_rec_found) */
5378 
5379       END IF; /* retro */
5380       l_sch_dt := TO_DATE(l_sch_day||'/'||TO_CHAR(ADD_MONTHS(l_sch_dt, l_freq),
5381                                                      'MM/YYYY'),'DD/MM/YYYY');
5382       l_sch_str_dt := ADD_MONTHS(l_sch_str_dt, l_freq);
5383    END LOOP;
5384 
5385    pnp_debug_pkg.log('EXTEND_PAYMENT_TERM (-) ');
5386 EXCEPTION
5387 
5388    WHEN OTHERS THEN
5389    x_return_status := FND_API.G_RET_STS_ERROR;
5390 
5391 END Extend_Payment_Term;
5392 
5393 
5394 -------------------------------------------------------------------------------
5395 --  PROCEDURE :- CREATE_PAYMENT_TERM
5396 --  DESCRIPTION :- This procedure will be called to create a payment term
5397 --  13-DEC-2002   graghuna o created
5398 --  20-DEC-2002   graghuna o modified for Month-to-Month (MTM) Changes.
5399 --  16-OCT-2003  Satish Tripathi o Fix for BUG# 3201091. Pass new parameter p_lease_change_id
5400 --                                 to process_term.
5401 --  16-OCT-06  Hareesha o Populate index_norm_flag and parent_term_id while
5402 --                        creating not-normalized terms for rollover period.
5403 -------------------------------------------------------------------------------
5404 PROCEDURE Create_Payment_Term (p_payment_term_rec              IN pn_payment_terms_all%ROWTYPE,
5405                                p_lease_end_date                IN     DATE,
5406                                p_term_start_date               IN     DATE,
5407                                p_term_end_date                 IN     DATE,
5408                                p_new_lea_term_dt               IN     DATE,
5409                                p_new_lea_comm_dt               IN     DATE,
5410                                p_mths                          IN     NUMBER,
5411                                x_return_status                 OUT NOCOPY VARCHAR2,
5412                                x_return_message                OUT NOCOPY VARCHAR2)
5413 IS
5414 
5415    l_rowid                         ROWID;
5416    Invalid_Schd_Date               EXCEPTION;
5417    l_new_term_start_date           DATE := NULL;
5418    l_schedule_date                 DATE := NULL;
5419    l_sch_id                        NUMBER := NULL;
5420    l_curr_payment_term_id          NUMBER := NULL;
5421    l_payment_term_rec              pn_payment_terms_all%ROWTYPE;
5422    l_pro_sch_dt                    pn_payment_schedules.schedule_date%TYPE;
5423    l_no_sch                        NUMBER;
5424    l_freq                          NUMBER;
5425    l_counter                       NUMBER;
5426    l_sch_dt                        pn_payment_schedules.schedule_date%TYPE;
5427    l_sch_str_dt                    DATE;
5428    l_norm_st_dt                    DATE;
5429 
5430 BEGIN
5431 
5432    pnp_debug_pkg.log('CREATE_PAYMENT_TERM (+) Lease ID: '||p_payment_term_rec.lease_id||
5433                      ', p_lease_end_date: '||p_lease_end_date);
5434    pnp_debug_pkg.log('CREATE_PAYMENT_TERM IN: p_lease_end_date     : '||p_lease_end_date);
5435    pnp_debug_pkg.log('CREATE_PAYMENT_TERM IN: p_term_start_date    : '||p_term_start_date);
5436    pnp_debug_pkg.log('CREATE_PAYMENT_TERM IN: p_term_end_date      : '||p_term_end_date);
5437    pnp_debug_pkg.log('CREATE_PAYMENT_TERM IN: p_new_lea_term_dt    : '||p_new_lea_term_dt);
5438    pnp_debug_pkg.log('CREATE_PAYMENT_TERM IN: p_new_lea_comm_dt    : '||p_new_lea_comm_dt);
5439    pnp_debug_pkg.log('CREATE_PAYMENT_TERM IN: p_mths               : '||p_mths);
5440 
5441    l_payment_term_rec := p_payment_term_rec;
5442    l_curr_payment_term_id := l_payment_term_rec.payment_term_id ;
5443    l_payment_term_rec.start_date :=  p_term_start_date;
5444    l_payment_term_rec.end_date   :=  p_term_end_date;
5445    l_payment_term_rec.normalize :=  'N' ;
5446    l_payment_term_rec.lease_status :=  'MTM' ;
5447    l_payment_term_rec.frequency_code :=  p_payment_term_rec.frequency_code;
5448    l_payment_term_rec.status := 'DRAFT';
5449 
5450    pnp_debug_pkg.log('CREATE_PAYMENT_TERM - payment term_id  '||l_payment_term_rec.payment_Term_id);
5451 
5452    pn_schedules_items.Insert_Payment_Term (
5453       p_payment_term_rec => l_payment_term_rec,
5454       x_return_status     => x_return_status,
5455       x_return_message    => x_return_message);
5456 
5457    pnp_debug_pkg.log('CREATE_PAYMENT_TERM - Calling get_sch_info ...');
5458    get_sch_info(p_lease_context            => 'ABS',
5459                 p_normalize_flag           => 'N',
5460                 p_mths                     => p_mths,
5461                 p_term_start_dt            => p_term_start_date,
5462                 p_term_end_dt              => p_term_end_date,
5463                 p_freq_code                => l_payment_term_rec.frequency_code,
5464                 p_sch_day                  => l_payment_term_rec.schedule_day,
5465                 p_new_lea_comm_dt          => p_new_lea_comm_dt,
5466                 p_new_lea_term_dt          => p_new_lea_term_dt,
5467                 p_old_lea_term_dt          => NULL,
5468                 p_no_sch                   => l_no_sch,
5469                 p_freq                     => l_freq,
5470                 p_counter                  => l_counter,
5471                 p_sch_dt                   => l_sch_dt,
5472                 p_pro_sch_dt               => l_pro_sch_dt,
5473                 p_sch_str_dt               => l_sch_str_dt,
5474                 p_norm_str_dt              => l_norm_st_dt,
5475                p_lease_id                  => l_payment_term_rec.lease_id,
5476                 p_term_id                  => l_payment_term_rec.payment_term_id);
5477 
5478    pnp_debug_pkg.log('CREATE_PAYMENT_TERM - Calling process term...');
5479    process_term(p_no_sch                   => l_no_sch,
5480                 p_counter                  => l_counter,
5481                 p_sch_dt                   => l_sch_dt,
5482                 p_pro_sch_dt               => l_pro_sch_dt,
5483                 p_new_lea_term_dt          => p_new_lea_term_dt ,
5484                 p_freq                     => l_freq,
5485                 p_freq_code                => l_payment_term_rec.frequency_code,
5486                 p_payment_term_id          => l_payment_term_rec.payment_term_id,
5487                 p_pay_trm_typ_code         => l_payment_term_rec.payment_term_type_code,
5488                 p_trgt_dt                  => l_payment_term_rec.target_date,
5489                 p_normalize_flag           => 'N',
5490                 p_lease_context            => 'ABS',
5491                 p_mths                     => p_mths,
5492                 p_vendor_id                => l_payment_term_rec.vendor_id,
5493                 p_customer_id              => l_payment_term_rec.customer_id,
5494                 p_vendor_site_id           => l_payment_term_rec.vendor_site_id,
5495                 p_customer_site_use_id     => l_payment_term_rec.customer_site_use_id,
5496                 p_cust_ship_site_id        => l_payment_term_rec.cust_ship_site_id,
5497                 p_set_of_books_id          => l_payment_term_rec.set_of_books_id,
5498                 p_currency_code            => l_payment_term_rec.currency_code,
5499                 p_rate                     => l_payment_term_rec.rate,
5500                 p_term_start_date          => p_term_start_date,
5501                 p_term_end_date            => p_term_end_date,
5502                 p_sch_str_dt               => l_sch_str_dt,
5503                 p_act_amt                  => l_payment_term_rec.actual_amount,
5504                 p_est_amt                  => l_payment_term_rec.estimated_amount,
5505                 p_index_prd_id             => NULL,
5506                 p_norm_str_dt              => NULL,
5507                 p_lease_change_id          => l_payment_term_rec.lease_change_id);
5508 
5509 
5510    pnp_debug_pkg.log('CREATE_PAYMENT_TERM (-) ');
5511 
5512 EXCEPTION
5513    WHEN Invalid_Schd_Date THEN
5514        x_return_status := FND_API.G_RET_STS_ERROR;
5515 
5516    WHEN OTHERS THEN
5517        x_return_status := FND_API.G_RET_STS_ERROR;
5518        pnp_debug_pkg.log('CREATE_PAYMENT_TERM - Others error ..' || sqlerrm);
5519        fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
5520 
5521 END Create_Payment_Term;
5522 
5523 
5524 -------------------------------------------------------------------------------
5525 --  PROCEDURE :- ROLLOVER LEASE
5526 --  DESCRIPTION :- This procedure will be called to create a MTM lease
5527 --                 or while rollover of a MTM/ HLD lease. We will query
5528 --                 all current payment terms whose end_Date was the same
5529 --                 as the old lease_Termination_date that are not one time and
5530 --                 create new records for normalized terms and extend the
5531 --                 end date on payment terms .
5532 -- 23-SEP-2002  graghuna o created
5533 -- 13_NOV-2002  graghuna o Removed l_lease_term_date_old + 1 from log, instead
5534 --                         use new variable l_new_term_start_date(BUG#2665720)
5535 -- 22-OCT-2003  Satish   o Fix for BUG# 3201091. Use l_lease_change_id
5536 --                         instead of g_lc_id.
5537 -- 21-Oct-2004  vmmehta  o Bug# 3934425 - Fix for nonmonthly terms
5538 -- 10-JAN-2005  Anand    o Code changes for Retro.
5539 -- 09-OCT-06    Hareesha o Extend RI agreements upon lease extension
5540 --                         due to MTM/HLD.
5541 -- 09-Jan-07    lbala    o Removed code which changes schedule day to value returned
5542 --                         by get_schedule_date
5543 -- 02-APR-07    Hareesha o Bug # 5962831 Added handling for terms expansion,
5544 --                         based on user's choice.
5545 --------------------------------------------------------------------------------
5546 PROCEDURE Rollover_lease (p_lease_id                      IN     NUMBER,
5547                           p_lease_end_date                IN     DATE,
5548                           p_new_lea_term_dt               IN     DATE,
5549                           p_new_lea_comm_dt               IN     DATE,
5550                           p_mths                          IN     NUMBER,
5551                           p_extend_ri                     IN     VARCHAR2,
5552                           p_ten_trm_context               IN     VARCHAR2,
5553                           x_return_status                 OUT NOCOPY VARCHAR2,
5554                           x_return_message                OUT NOCOPY VARCHAR2)
5555 IS
5556 
5557 CURSOR payment_terms_cursor (p_date DATE) IS
5558   SELECT *
5559   FROM   pn_payment_terms_all
5560   WHERE  lease_id = p_lease_id
5561   AND    frequency_code <> 'OT'
5562   AND    index_period_id IS NULL
5563   AND    end_date = p_date;
5564 
5565 CURSOR last_sch_cur (p_term_id  NUMBER) IS
5566   SELECT MAX(sch.schedule_date)
5567   FROM   pn_payment_schedules_all sch,
5568          pn_payment_items_all itm
5569   WHERE  itm.payment_term_id = p_term_id
5570   AND    itm.payment_schedule_id = sch.payment_schedule_id
5571   AND    itm.payment_item_type_lookup_code = 'CASH';
5572 
5573 CURSOR get_lease_details IS
5574   SELECT GREATEST(NVL(plh.lease_extension_end_date, plh.lease_termination_date),
5575                       plh.lease_termination_date) lease_term_date_old,
5576          pld.lease_change_id lease_change_id
5577   FROM   pn_lease_details_history plh,
5578          pn_lease_details_all pld
5579   WHERE  pld.lease_change_id = plh.new_lease_change_id
5580   AND    pld.lease_id = p_lease_id;
5581 
5582 INVALID_SCHD_DATE          EXCEPTION;
5583 l_lease_term_date_old      DATE := NULL;
5584 l_payment_term_start_date  DATE := NULL;
5585 l_schd_date                DATE := NULL;
5586 l_schd_day                 NUMBER := NULL;
5587 l_lease_change_id          pn_lease_details.lease_change_id%TYPE;
5588 l_rollover_mode            VARCHAR2(30) := NULL;
5589 l_freq_code                pn_payment_terms_all.frequency_code%TYPE;
5590 l_freq                     NUMBER;
5591 l_no_of_sch                NUMBER;
5592 l_last_sch_date            DATE;
5593 l_duration_in_months       NUMBER;
5594 l_payment_status           pn_payment_schedules_all.payment_status_lookup_code%TYPE;
5595 l_create_term_flag         VARCHAR2(1);
5596 
5597 BEGIN
5598 
5599   pnp_debug_pkg.log('ROLLOVER_LEASE +Start+ (+)');
5600   pnp_debug_pkg.log('ROLLOVER_LEASE IN: p_lease_id           : '||p_lease_id);
5601   pnp_debug_pkg.log('ROLLOVER_LEASE IN: p_lease_end_date     : '||p_lease_end_date);
5602   pnp_debug_pkg.log('ROLLOVER_LEASE IN: p_new_lea_term_dt    : '||p_new_lea_term_dt);
5603   pnp_debug_pkg.log('ROLLOVER_LEASE IN: p_new_lea_comm_dt    : '||p_new_lea_comm_dt);
5604   pnp_debug_pkg.log('ROLLOVER_LEASE IN: p_mths               : '||p_mths);
5605 
5606   FOR lease IN get_lease_details LOOP
5607     l_lease_term_date_old := lease.lease_term_date_old;
5608     l_lease_change_id     := lease.lease_change_id;
5609   END LOOP;
5610 
5611   add_main(p_lease_id            => p_lease_id,
5612            p_lease_context       => 'ADDAMD',
5613            p_new_lea_term_dt     => p_lease_end_date,
5614            p_new_lea_comm_dt     => p_new_lea_comm_dt,
5615            p_mths                => p_mths);
5616 
5617    IF NVL(p_ten_trm_context,'N') ='Y' THEN
5618 
5619   FOR l_payment_term_rec IN payment_terms_cursor(l_lease_term_date_old)
5620   LOOP
5621     pnp_debug_pkg.log('ROLLOVER - Payment Term Id:  '||l_payment_term_rec.payment_Term_id||
5622                       ' Normalize: ' ||l_payment_term_rec.normalize);
5623 
5624     l_rollover_mode := NULL;
5625     l_schd_day      := NULL;
5626     l_schd_date     := NULL;
5627     l_payment_term_start_date := l_payment_term_rec.end_date + 1;
5628     IF PNP_UTIL_FUNC.RETRO_ENABLED THEN
5629       IF NVL(l_payment_term_rec.normalize,'N')= 'Y' THEN
5630 
5631         pnp_debug_pkg.log('ROLLOVER - Calling create payment term ..');
5632         l_payment_term_rec.lease_change_id := l_lease_change_id;
5633         Create_Payment_Term (p_payment_term_rec => l_payment_term_rec,
5634                              p_lease_end_date    => p_lease_end_date,
5635                              p_term_start_date   => l_payment_term_start_date,
5636                              p_term_end_date     => p_lease_end_date,
5637                              p_new_lea_term_dt   => l_lease_term_date_old,
5638                              p_new_lea_comm_dt   => p_new_lea_comm_dt,
5639                              p_mths              => p_mths,
5640                              x_return_status     => x_return_status,
5641                              x_return_message    => x_return_message);
5642 
5643       ELSE
5644 
5645         pnp_debug_pkg.log('ROLLOVER - Calling extend_payment_term ..');
5646         Extend_Payment_Term (p_payment_term_rec => l_payment_term_rec,
5647                              p_new_lea_comm_dt   => p_new_lea_comm_dt,
5648                              p_new_lea_term_dt   => l_lease_term_date_old,
5649                              p_mths              => p_mths,
5650                              p_new_start_date    => l_payment_term_start_date,
5651                              p_new_end_date      => p_lease_end_date,
5652                              x_return_status     => x_return_status,
5653                              x_return_message    => x_return_message);
5654 
5655         pnp_debug_pkg.log('ROLLOVER - Update end date of payment term..');
5656 
5657         UPDATE pn_payment_terms_all
5658         SET    end_date = p_lease_end_date,
5659                lease_status = 'MTM'
5660         WHERE  payment_term_id = l_payment_term_rec.payment_term_id;
5661 
5662       END IF;
5663 
5664     ELSE /* retro not enabled*/
5665 
5666       l_create_term_flag := 'N';
5667       l_freq_code := l_payment_term_rec.frequency_code;
5668       l_freq := get_frequency(p_freq_code => l_freq_code);
5669 
5670       IF l_freq_code <> 'MON' THEN
5671         pnp_debug_pkg.log('Non-monthly term...');
5672         -- Check if last period is partial and set start date accordingly
5673         l_duration_in_months := CEIL(MONTHS_BETWEEN(LAST_DAY(l_payment_term_rec.end_date), FIRST_DAY(l_payment_term_rec.start_date)));
5674 
5675         l_no_of_sch := l_duration_in_months/l_freq;
5676 
5677         /*IF TRUNC(l_no_of_sch) <> l_no_of_sch THEN
5678           -- Last period is partial, now check if last schedule is approved
5679           pnp_debug_pkg.log('last period is partial');
5680           OPEN last_sch_cur(l_payment_term_rec.payment_term_id);
5681             FETCH last_sch_cur INTO l_last_sch_date;
5682 
5683             select payment_status_lookup_code INTO l_payment_status
5684             from pn_payment_schedules_all
5685             where schedule_date = l_last_sch_date
5686             and lease_id = p_lease_id;
5687 
5688           CLOSE last_sch_cur;
5689 
5690           IF NVL(l_payment_status, 'DRAFT') = 'APPROVED' THEN
5691             l_create_term_flag := 'Y';
5692           ELSE
5693             -- last period is partial and last schedule is draft
5694             l_payment_term_start_date := l_last_sch_date;
5695           END IF;
5696         END IF;*/
5697       END IF;
5698 
5699       l_schd_date := Get_Schedule_Date (
5700                             p_lease_id   => l_payment_term_rec.lease_id,
5701                             p_day        => l_payment_term_rec.schedule_day,
5702                             p_start_date => l_payment_term_start_date,
5703                             p_end_date   => p_lease_end_date,
5704                             p_freq       => l_freq);
5705       l_schd_day  := TO_NUMBER(TO_CHAR(l_schd_date,'DD'));
5706       pnp_debug_pkg.log('ROLLOVER - Get_Schedule_Date:  '||l_schd_date||
5707                         ' l_schd_day: '||l_schd_day);
5708 
5709       IF ((NVL(l_payment_term_rec.normalize,'N')= 'Y') OR (l_create_term_flag = 'Y')) THEN
5710         l_rollover_mode := 'CREATE_NEW_TERM';
5711         l_payment_term_rec.parent_term_id := l_payment_term_rec.payment_term_id;
5712         l_payment_term_rec.index_norm_flag := 'Y';
5713       ELSE
5714         IF l_schd_day <> l_payment_term_rec.schedule_day THEN
5715           l_rollover_mode := 'CREATE_NEW_TERM';
5716         ELSE
5717           l_rollover_mode := 'EXTEND_TERM';
5718         END IF;
5719       END IF;
5720 
5721       l_payment_term_start_date := l_payment_term_rec.end_date + 1;
5722 
5723       IF l_rollover_mode = 'CREATE_NEW_TERM' THEN
5724 
5725         pnp_debug_pkg.log('ROLLOVER - Calling create payment term ..');
5726         l_payment_term_rec.lease_change_id := l_lease_change_id;
5727         Create_Payment_Term (p_payment_term_rec => l_payment_term_rec,
5728                              p_lease_end_date    => p_lease_end_date,
5729                              p_term_start_date   => l_payment_term_start_date,
5730                              p_term_end_date     => p_lease_end_date,
5731                              p_new_lea_term_dt   => l_lease_term_date_old,
5732                              p_new_lea_comm_dt   => p_new_lea_comm_dt,
5733                              p_mths              => p_mths,
5734                              x_return_status     => x_return_status,
5735                              x_return_message    => x_return_message);
5736       ELSIF l_rollover_mode = 'EXTEND_TERM' THEN
5737 
5738         pnp_debug_pkg.log('ROLLOVER - Calling extend_payment_term ..');
5739         Extend_Payment_Term (p_payment_term_rec => l_payment_term_rec,
5740                              p_new_lea_comm_dt   => p_new_lea_comm_dt,
5741                              p_new_lea_term_dt   => l_lease_term_date_old,
5742                              p_mths              => p_mths,
5743                              p_new_start_date    => l_payment_term_start_date,
5744                              p_new_end_date      => p_lease_end_date,
5745                              x_return_status     => x_return_status,
5746                              x_return_message    => x_return_message);
5747 
5748         pnp_debug_pkg.log('ROLLOVER - Update end date of payment term..');
5749         UPDATE pn_payment_terms_all
5750         SET    end_date = p_lease_end_date,
5751                lease_status = 'MTM'
5752         WHERE  payment_term_id = l_payment_term_rec.payment_term_id;
5753       END IF;
5754 
5755     END IF; /* retro */
5756 
5757   END LOOP; /* end of main loop */
5758 
5759   END IF;
5760 
5761   IF p_extend_ri = 'Y' THEN
5762 
5763      /* extend RI agreement and create/extend periods when lease extended due to MTM/HLD */
5764      pn_index_rent_periods_pkg.process_main_lease_term_date(
5765          p_lease_id                     => p_lease_id,
5766          p_new_main_lease_term_date     => p_lease_end_date,
5767          p_old_main_lease_term_date     => l_lease_term_date_old,
5768          p_lease_context                => 'ROLLOVER_RI',
5769          p_msg                          => x_return_message);
5770   ELSE
5771      pn_index_rent_periods_pkg.process_main_lease_term_date(
5772          p_lease_id                     => p_lease_id,
5773          p_new_main_lease_term_date     => p_lease_end_date,
5774          p_old_main_lease_term_date     => l_lease_term_date_old,
5775          p_lease_context                => 'ROLLOVER',
5776          p_msg                          => x_return_message);
5777   END IF;
5778 
5779   pnp_debug_pkg.log('ROLLOVER_LEASE +Start+ (-)');
5780 
5781 EXCEPTION
5782   WHEN INVALID_SCHD_DATE THEN
5783     x_return_status := FND_API.G_RET_STS_ERROR;
5784 
5785   WHEN OTHERS THEN
5786     x_return_status := FND_API.G_RET_STS_ERROR;
5787 
5788 END rollover_lease;
5789 
5790 -- Retro Start
5791 --------------------------------------------------------------------------------------------
5792 --  FUNCTION   : adjustment
5793 --  DESCRIPTION: This procedure is being called from add_main when lease_context is 'ADJ'.
5794 --               It creates adjustment entries for the adjustmented term and creates new
5795 --               term and its schedules, items in case of term is 'updated'.
5796 --
5797 --  15-NOV-2004   Mrinal Misra   o Created.
5798 --------------------------------------------------------------------------------------------
5799 PROCEDURE adjustment(p_lease_id           NUMBER,
5800                      p_lease_context      VARCHAR2,
5801                      p_new_lea_term_dt    DATE,
5802                      p_new_lea_comm_dt    DATE,
5803                      p_mths               NUMBER)
5804 IS
5805 
5806    l_term_hist_id      NUMBER;
5807    l_adj_type_code     pn_payment_terms_history.adjustment_type_code%TYPE;
5808    l_norm_str_dt       DATE;
5809    l_lease_trmn_date   DATE;
5810 
5811    CURSOR get_max_term_hist_cur(p_term_id IN NUMBER) IS
5812       SELECT term_history_id, adjustment_type_code
5813       FROM   pn_payment_terms_history
5814       WHERE  term_history_id = (SELECT max(pth.term_history_id)
5815                                 FROM   pn_payment_terms_history pth
5816                                 WHERE  pth.payment_term_id = p_term_id);
5817 
5818 BEGIN
5819 
5820    pnp_debug_pkg.log('ADJUSTMENT - Adjustment of Term - ADJ - Start (+)');
5821    pnp_debug_pkg.log('ADJUSTMENT IN: p_lease_id          : '||p_lease_id);
5822    pnp_debug_pkg.log('ADJUSTMENT IN: p_lease_context     : '||p_lease_context);
5823    pnp_debug_pkg.log('ADJUSTMENT IN: p_new_lea_term_dt   : '||p_new_lea_term_dt);
5824    pnp_debug_pkg.log('ADJUSTMENT IN: p_new_lea_comm_dt   : '||p_new_lea_comm_dt);
5825    pnp_debug_pkg.log('ADJUSTMENT IN: p_mths              : '||p_mths);
5826 
5827    FOR adj_term_rec IN payment_term_con_cur(p_lease_id)
5828    LOOP
5829 
5830    pnp_debug_pkg.log('adj_term_rec loop : payment_term_id   : '||adj_term_rec.payment_term_id);
5831 
5832       OPEN get_max_term_hist_cur(adj_term_rec.payment_term_id);
5833       FETCH get_max_term_hist_cur INTO l_term_hist_id, l_adj_type_code;
5834       CLOSE get_max_term_hist_cur;
5835 
5836    pnp_debug_pkg.log('adj_term_rec loop : l_term_hist_id   : '||l_term_hist_id);
5837    pnp_debug_pkg.log('adj_term_rec loop : l_adj_type_code  : '||l_adj_type_code);
5838    pnp_debug_pkg.log('adj_term_rec loop : lease_change_id  : '||adj_term_rec.lease_change_id);
5839    pnp_debug_pkg.log('adj_term_rec loop : start_date       : '||adj_term_rec.start_date);
5840    pnp_debug_pkg.log('adj_term_rec loop : end_date         : '||adj_term_rec.end_date);
5841    pnp_debug_pkg.log('adj_term_rec loop : schedule_day     : '||adj_term_rec.schedule_day);
5842    pnp_debug_pkg.log('adj_term_rec loop : actual_amount    : '||adj_term_rec.actual_amount);
5843    pnp_debug_pkg.log('adj_term_rec loop : frequency        : '||adj_term_rec.frequency_code);
5844    pnp_debug_pkg.log('Calling pn_retro_adjustment_pkg.create_retro_adjustments ...');
5845 
5846       pn_retro_adjustment_pkg.create_retro_adjustments
5847                              (p_lease_id      => p_lease_id,
5848                               p_lease_chg_id  => adj_term_rec.lease_change_id,
5849                               p_term_id       => adj_term_rec.payment_term_id,
5850                               p_term_start_dt => adj_term_rec.start_date,
5851                               p_term_end_dt   => adj_term_rec.end_date,
5852                               p_term_sch_day  => adj_term_rec.schedule_day,
5853                               p_term_act_amt  => adj_term_rec.actual_amount,
5854                               p_term_freq     => adj_term_rec.frequency_code,
5855                               p_term_hist_id  => l_term_hist_id,
5856                               p_adj_type_cd   => l_adj_type_code);
5857 
5858    pnp_debug_pkg.log('adj_term_rec loop : normalize            : '||adj_term_rec.normalize);
5859 
5860       IF NVL(adj_term_rec.normalize, 'N') = 'Y' THEN
5861 
5862          l_norm_str_dt := NVL(adj_term_rec.norm_start_date,
5863                               get_first_item_date(adj_term_rec.payment_term_id));
5864 
5865    pnp_debug_pkg.log('adj_term_rec loop : l_norm_str_dt        : '||l_norm_str_dt);
5866    pnp_debug_pkg.log('adj_term_rec loop : g_lease_status       : '||g_lease_status);
5867 
5868          IF g_lease_status = 'ACT' THEN
5869             l_lease_trmn_date := g_new_lea_term_dt;
5870          ELSE
5871             l_lease_trmn_date := get_norm_end_date(p_lease_id);
5872          END IF;
5873 
5874    pnp_debug_pkg.log('adj_term_rec loop : l_lease_trmn_date    : '||l_lease_trmn_date);
5875    pnp_debug_pkg.log('adj_term_rec loop : vendor_id            : '||adj_term_rec.vendor_id);
5876    pnp_debug_pkg.log('adj_term_rec loop : vendor_site_id       : '||adj_term_rec.vendor_site_id);
5877    pnp_debug_pkg.log('adj_term_rec loop : customer_id          : '||adj_term_rec.customer_id);
5878    pnp_debug_pkg.log('adj_term_rec loop : cust_ship_site_id    : '||adj_term_rec.cust_ship_site_id);
5879    pnp_debug_pkg.log('adj_term_rec loop : customer_site_use_id : '||adj_term_rec.customer_site_use_id);
5880    pnp_debug_pkg.log('adj_term_rec loop : set_of_books_id      : '||adj_term_rec.set_of_books_id);
5881    pnp_debug_pkg.log('adj_term_rec loop : currency_code        : '||adj_term_rec.currency_code);
5882    pnp_debug_pkg.log('adj_term_rec loop : schedule_day         : '||adj_term_rec.schedule_day);
5883    pnp_debug_pkg.log('adj_term_rec loop : norm_start_date      : '||adj_term_rec.norm_start_date);
5884    pnp_debug_pkg.log('adj_term_rec loop : norm_end_date        : '||adj_term_rec.norm_end_date);
5885    pnp_debug_pkg.log('adj_term_rec loop : rate                 : '||adj_term_rec.rate);
5886    pnp_debug_pkg.log('Calling pn_norm_renorm_pkg.normalize_renormalize ...');
5887 
5888          pn_norm_renorm_pkg.normalize_renormalize
5889                            (p_lease_context      => p_lease_context,
5890                             p_lease_id           => p_lease_id,
5891                             p_term_id            => adj_term_rec.payment_term_id,
5892                             p_vendor_id          => adj_term_rec.vendor_id,
5893                             p_cust_id            => adj_term_rec.customer_id,
5894                             p_vendor_site_id     => adj_term_rec.vendor_site_id,
5895                             p_cust_site_use_id   => adj_term_rec.customer_site_use_id,
5896                             p_cust_ship_site_id  => adj_term_rec.cust_ship_site_id,
5897                             p_sob_id             => adj_term_rec.set_of_books_id,
5898                             p_curr_code          => adj_term_rec.currency_code,
5899                             p_sch_day            => adj_term_rec.schedule_day,
5900                             p_norm_str_dt        => l_norm_str_dt,
5901                             p_norm_end_dt        => NVL(adj_term_rec.norm_end_date,
5902                                                         l_lease_trmn_date),
5903                             p_rate               => adj_term_rec.rate,
5904                             p_lease_change_id    => adj_term_rec.lease_change_id);
5905       END IF;
5906 
5907       l_index := NVL(l_index,0) + 1;
5908       term_id_tab(l_index) := adj_term_rec.payment_term_id;
5909    END LOOP;
5910 
5911    pnp_debug_pkg.log('Calling add_main ...');
5912 
5913    add_main(p_lease_id            => p_lease_id,
5914             p_lease_context       => p_lease_context,
5915             p_new_lea_term_dt     => g_new_lea_term_dt,
5916             p_new_lea_comm_dt     => g_new_lea_comm_dt,
5917             p_mths                => p_mths);
5918 
5919    pnp_debug_pkg.log('ADJUSTMENT - Adjustment of Term - ADJ - Start (-)');
5920 
5921 END adjustment;
5922 
5923 -- Retro End
5924 
5925 --------------------------------------------------------------------------------------------
5926 --  FUNCTION   : FORMAT_AMOUNT
5927 --  DESCRIPTION: Formats Amounts for the Normalization Report shown in Concurrent Log/OutPut
5928 --               Invoked from Schedules_Items above.
5929 --               Args: p_Amount: Some/Any Amount that needs to be formatted
5930 --  20-AUG-2001  Mrinal Misra    o Created.
5931 --------------------------------------------------------------------------------------------
5932 FUNCTION Format_Amount (p_Amount        NUMBER,
5933                         p_currency_code VARCHAR2)
5934 RETURN   VARCHAR2
5935 IS
5936 BEGIN
5937 
5938    RETURN LPAD(TO_CHAR(p_Amount, Fnd_Currency.Get_Format_Mask(p_currency_code, 20)),12);
5939 
5940 EXCEPTION
5941 
5942    WHEN OTHERS THEN
5943       RAISE;
5944 
5945 END Format_Amount;
5946 
5947 --------------------------------------------------------------------------------------------
5948 --  PROCEDURE  : NORM_REPORT
5949 --  DESCRIPTION: This procedure creates the Normalization Report in Concurrent Log/OutPut.
5950 --               Args: # of Schedules ovr which the Normalization figures should spread.
5951 --  25-JUN-2001  Mrinal Misra    o Created.
5952 --  28-AUG-2002  ftanudja        o restructured code to use one cursor
5953 --                               o removed variables and refer to cursor directly
5954 --                               o added grouping for currency code, ref bug 2478166
5955 --                               o new strategy for calculating differed liability
5956 --                                 :> separate for each currency
5957 --  21-JAN-2003  ftanudja        o replaced NULL with '0' in csr_get_schedules so that
5958 --                                 the default amounts will be 0. Ref bug 2726862.
5959 --  18-JUL-2003  Satish Tripathi o Fixed for BUG# 3005135. Print the Amount column
5960 --                                 headings depending upon g_lease_class_code.
5961 --  25-JAN-2005  vmmehta         o Fixed for BUG#4142299. Added missing variable l_message.
5962 --  16-FEB-2005  ftanudja        o Made l_message from VARCHAR 30 to 5000. #4189972.
5963 --  30-APR-2007  Prabhakar       o Modified to show the columns properly alligned in
5964 --                                 output report. Bug #5902202.
5965 --------------------------------------------------------------------------------------------
5966 PROCEDURE Norm_Report(p_lease_context VARCHAR2) IS
5967 
5968    CURSOR csr_get_schedules IS
5969     SELECT MIN(ppi.currency_code) currency_code,
5970            MIN(pps.schedule_date) schedule_date,
5971            SUM(DECODE(ppi.payment_item_type_lookup_code, 'CASH',
5972                  NVL(ppi.actual_amount,0), 0)) cash_amt,
5973            SUM(DECODE(ppi.payment_item_type_lookup_code, 'CASH',
5974                  DECODE(ppt.normalize,'Y',NVL(ppi.actual_amount,0), 0), 0)) cash_norm_amt,
5975            SUM(DECODE(ppi.payment_item_type_lookup_code, 'NORMALIZED',
5976                  NVL(ppi.actual_amount,0), 0)) norm_amt
5977     FROM pn_payment_items_all ppi,
5978          pn_payment_schedules_all pps,
5979          pn_payment_terms_all ppt
5980     WHERE ppt.lease_id = g_lease_id
5981       AND ppt.lease_id = pps.lease_id
5982       AND pps.payment_schedule_id = ppi.payment_schedule_id
5983       AND ppt.payment_term_id = ppi.payment_term_id
5984     GROUP BY ppi.currency_code, pps.schedule_date
5985     ORDER BY ppi.currency_code, pps.schedule_date;
5986 
5987     l_currency_code                 VARCHAR2(10) := 'qwerty';
5988     l_def_amt                       NUMBER;
5989     l_message                       VARCHAR2(5000) := NULL;
5990 
5991 BEGIN
5992 
5993 
5994    fnd_message.set_name ('PN','PN_SCHIT_DTLS');
5995    fnd_message.set_token ('ID', g_Lease_Id);
5996    fnd_message.set_token ('NUM', g_lease_num);
5997    fnd_message.set_token ('NAME', g_lease_name);
5998    fnd_message.set_token ('CONTXT', p_lease_context);
5999    pnp_debug_pkg.put_log_msg(fnd_message.get);
6000    pnp_debug_pkg.put_log_msg('');
6001 
6002    fnd_message.set_name ('PN','PN_SCHIT_CUR');
6003    l_message := '               '||fnd_message.get||'       ';
6004    fnd_message.set_name ('PN','PN_SCHIT_TOT');
6005    l_message := l_message||fnd_message.get||'       ';
6006    fnd_message.set_name ('PN','PN_SCHIT_NORM');
6007    l_message := l_message||fnd_message.get||' ';
6008    fnd_message.set_name ('PN','PN_SCHIT_ACC');
6009    l_message := l_message||fnd_message.get||'               ';
6010    fnd_message.set_name ('PN','PN_SCHIT_ACR');
6011    l_message := l_message||fnd_message.get;
6012    pnp_debug_pkg.put_log_msg(l_message);
6013 
6014    IF g_lease_class_code = 'DIRECT' THEN
6015       fnd_message.set_name ('PN','PN_RICAL_DATE');
6016       l_message := fnd_message.get||'           ';
6017       fnd_message.set_name ('PN','PN_SCHIT_CODE');
6018       l_message := l_message||fnd_message.get||'           ';
6019       fnd_message.set_name ('PN','PN_SCHIT_CASH');
6020       l_message := l_message||fnd_message.get||'        ';
6021       fnd_message.set_name ('PN','PN_SCHIT_CASH');
6022       l_message := l_message||fnd_message.get||'          ';
6023       fnd_message.set_name ('PN','PN_SCHIT_EXP');
6024       l_message := l_message||fnd_message.get||'   ';
6025       fnd_message.set_name ('PN','PN_SCHIT_ADJ');
6026       l_message := l_message||fnd_message.get||'  ';
6027       fnd_message.set_name ('PN','PN_SCHIT_LIA');
6028       l_message := l_message||fnd_message.get;
6029       pnp_debug_pkg.put_log_msg(l_message);
6030 
6031    ELSE
6032       fnd_message.set_name ('PN','PN_RICAL_DATE');
6033       l_message := fnd_message.get||'           ';
6034       fnd_message.set_name ('PN','PN_SCHIT_CODE');
6035       l_message := l_message||fnd_message.get||'           ';
6036       fnd_message.set_name ('PN','PN_SCHIT_CASH');
6037       l_message := l_message||fnd_message.get||'        ';
6038       fnd_message.set_name ('PN','PN_SCHIT_CASH');
6039       l_message := l_message||fnd_message.get||'          ';
6040       fnd_message.set_name ('PN','PN_SCHIT_REV');
6041       l_message := l_message||fnd_message.get||'   ';
6042       fnd_message.set_name ('PN','PN_SCHIT_ADJ');
6043       l_message := l_message||fnd_message.get||'  ';
6044       fnd_message.set_name ('PN','PN_SCHIT_AST');
6045       l_message := l_message||fnd_message.get;
6046       pnp_debug_pkg.put_log_msg(l_message);
6047    END IF;
6048 
6049    pnp_debug_pkg.put_log_msg
6050    ('============= '
6051      ||' ============= '
6052      ||' ========== '
6053      ||' ========== '
6054      ||' ========== '
6055      ||' ========== '
6056      ||' ========== '
6057    );
6058 
6059    FOR sch IN csr_get_schedules LOOP
6060 
6061        IF l_currency_code <> sch.currency_code THEN
6062           IF l_currency_code <> 'qwerty' THEN
6063              pnp_debug_pkg.put_log_msg('');
6064           END IF;
6065           l_currency_code := sch.currency_code;
6066           l_def_amt := 0;
6067        END IF;
6068 
6069        l_def_amt := l_def_amt + sch.norm_amt - sch.cash_norm_amt;
6070 
6071        pnp_debug_pkg.put_log_msg(TO_CHAR(sch.schedule_date)
6072                                 ||lpad(sch.currency_code,19)
6073                                 ||Format_Amount(sch.cash_amt, sch.currency_code)
6074                                 ||Format_Amount(sch.cash_norm_amt, sch.currency_code)
6075                                 ||Format_Amount(sch.norm_amt, sch.currency_code)
6076                                 ||Format_Amount(sch.norm_amt - sch.cash_norm_amt, sch.currency_code)
6077                                 ||Format_Amount(l_def_amt, sch.currency_code)
6078                                );
6079    END LOOP;
6080 END;
6081 
6082 -- Retro Start
6083 --------------------------------------------------------------------------------
6084 --
6085 --  NAME         : retro_rec_impact_report
6086 --  DESCRIPTION  : Prints a list of agreement name, number of the Recovery
6087 --                 Agreements whose lines are affected by Retro
6088 --  PURPOSE      : Inform the user of the possible impact of Retro on Recovery
6089 --                 Agreements
6090 --  INVOKED FROM : Schedules and items
6091 --  ARGUMENTS    :
6092 --  REFERENCE    : PN_COMMON.debug()
6093 --  HISTORY      :
6094 --
6095 --  12-NOV-2004   Kiran Hegde   o Created
6096 -- 15-JUL-05  hareesha o Bug 4284035 - Replaced pn_rec_agr_lines with _ALL table.
6097 --------------------------------------------------------------------------------
6098 PROCEDURE retro_rec_impact_report IS
6099 
6100 /* -- CURSORS -- */
6101 /* Get all the possibly affected recovery agreements
6102    for term with changed dates */
6103 CURSOR get_agreements_cur(p_term_id IN NUMBER) IS
6104   SELECT  agr.rec_agreement_name
6105          ,agr.rec_agreement_num
6106     FROM  pn_rec_agreements_all agr
6107          ,pn_rec_agr_lines_all  line
6108          ,pn_payment_terms_all  term
6109    WHERE  agr.lease_id = g_lease_id
6110      AND  agr.rec_agreement_id = line.rec_agreement_id
6111      AND  term.payment_term_id = p_term_id
6112      AND  line.purpose = term.payment_purpose_code
6113      AND  line.type = term.payment_term_type_code
6114      AND  line.start_date <= term.end_date
6115      AND  line.end_date >= term.start_date;
6116 
6117 BEGIN
6118    pnp_debug_pkg.log('retro_rec_impact_report - (+)');
6119 
6120    IF term_id_tab.count > 0 THEN
6121       pnp_debug_pkg.put_log_msg
6122       ('===========================================================================');
6123       fnd_message.set_name('PN', 'PN_RETRO_RECAGR_REPORT');
6124       pnp_debug_pkg.put_log_msg(fnd_message.get);
6125       pnp_debug_pkg.put_log_msg('');
6126 
6127       FOR i in 1..term_id_tab.count LOOP
6128          FOR rec IN get_agreements_cur(term_id_tab(i)) LOOP
6129 
6130            fnd_message.set_name('PN', 'PN_RECAGR_NAME_NUM');
6131            fnd_message.set_token('REC_AGR_NAME', rec.rec_agreement_name);
6132            fnd_message.set_token('REC_AGR_NUM', rec.rec_agreement_num);
6133 
6134            pnp_debug_pkg.put_log_msg(fnd_message.get);
6135            pnp_debug_pkg.put_log_msg('');
6136 
6137          END LOOP;
6138       END LOOP;
6139 
6140       pnp_debug_pkg.put_log_msg
6141       ('===========================================================================');
6142    END IF;
6143 
6144    pnp_debug_pkg.log('retro_rec_impact_report - (-)');
6145 EXCEPTION
6146 
6147   WHEN others THEN
6148     RAISE;
6149 
6150 END retro_rec_impact_report;
6151 
6152 --------------------------------------------------------------------------------
6153 --
6154 --  NAME         : retro_vr_impact_report
6155 --  DESCRIPTION  : Prints a list of VR Numbers that have abatements which will
6156 --                 be affected due to change in terms.
6157 --  PURPOSE      : Inform the user of the possible impact of Retro on VR
6158 --  INVOKED FROM :
6159 --  ARGUMENTS    :
6160 --  REFERENCE    : PN_COMMON.debug()
6161 --  HISTORY      :
6162 --
6163 --  12-NOV-2004   Kiran Hegde   o Created
6164 --------------------------------------------------------------------------------
6165 PROCEDURE retro_vr_impact_report IS
6166 
6167 /* -- CURSORS -- */
6168 
6169 CURSOR get_vr_cur(p_term_id IN NUMBER) IS
6170   SELECT  pvr.rent_num
6171     FROM  pn_var_rents_all      pvr
6172          ,pn_var_rent_inv_all   pvri
6173          ,pn_var_abatements_all pva
6174          ,pn_payment_terms_all  ppt
6175    WHERE  ppt.payment_term_id = p_term_id
6176      AND  pva.payment_term_id = ppt.payment_term_id
6177      AND  pvri.var_rent_inv_id = pva.var_rent_inv_id
6178      AND  pvri.invoice_date BETWEEN ppt.start_date
6179                                 AND ppt.end_date
6180      AND  pvr.var_rent_id = pvri.var_rent_id;
6181 
6182 BEGIN
6183    pnp_debug_pkg.log('retro_vr_impact_report - (+)');
6184 
6185    IF term_id_tab.count > 0 THEN
6186       pnp_debug_pkg.put_log_msg
6187       ('===========================================================================');
6188       fnd_message.set_name('PN', 'PN_RETRO_VARENT_REPORT');
6189       pnp_debug_pkg.put_log_msg(fnd_message.get);
6190       pnp_debug_pkg.put_log_msg('');
6191 
6192       FOR i in 1..term_id_tab.count LOOP
6193          FOR vr IN get_vr_cur(term_id_tab(i)) LOOP
6194 
6195            fnd_message.set_name('PN', 'PN_VARENT_NUM');
6196            fnd_message.set_token('VAR_RENT_NUM', vr.rent_num);
6197 
6198            pnp_debug_pkg.put_log_msg(fnd_message.get);
6199            pnp_debug_pkg.put_log_msg('');
6200 
6201          END LOOP;
6202       END LOOP;
6203 
6204       pnp_debug_pkg.put_log_msg
6205       ('===========================================================================');
6206    END IF;
6207 
6208    pnp_debug_pkg.log('retro_vr_impact_report - (-)');
6209 EXCEPTION
6210 
6211   WHEN others THEN
6212     RAISE;
6213 
6214 END retro_vr_impact_report;
6215 -- Retro End
6216 
6217 
6218 -------------------------------------------------------------------------------
6219 --  PROCEDURE    : UPDATE_TERM_DATES
6220 --  DESCRIPTION  : This procedure updates the term dates and amount for
6221 --                 contracted terms
6222 --  INVOKED FROM : mini_retro_contraction
6223 --  ARGUMENTS    : IN : p_new_lea_term_start_dt, p_new_lea_term_end_dt,
6224 --                      p_lease_id, p_payment_term_id, p_amount
6225 --  HISTORY      :
6226 -- 01-AUG-05  piagrawa  o Created for mini-retro
6227 -- 24-NOV-05  Kiran     o Round amounts befor insert/uptdate into terms OR items
6228 --------------------------------------------------------------------------------
6229 PROCEDURE update_term_dates(p_new_lea_term_start_dt DATE DEFAULT NULL,
6230                             p_new_lea_term_end_dt   DATE,
6231                             p_lease_id              NUMBER,
6232                             p_payment_term_id       NUMBER,
6233                             p_amount                NUMBER DEFAULT NULL)
6234 IS
6235 
6236    l_precision     NUMBER;
6237    l_ext_precision NUMBER;
6238    l_min_acct_unit NUMBER;
6239    l_act_amount    NUMBER;
6240 
6241    CURSOR currency_cur IS
6242       SELECT currency_code
6243       FROM pn_payment_terms_all
6244       WHERE payment_term_id = p_payment_term_id;
6245 
6246 BEGIN
6247    pnp_debug_pkg.log('UPDATE TERMS +Start+ (+)');
6248 
6249    pnp_debug_pkg.log('MINI-RETRO - CON - MAIN - Updating start/end date of Payment Terms');
6250 
6251    FOR rec IN currency_cur LOOP
6252       fnd_currency.get_info (  currency_code  => rec.currency_code
6253                               ,precision     => l_precision
6254                               ,ext_precision => l_ext_precision
6255                               ,min_acct_unit => l_min_acct_unit);
6256    END LOOP;
6257 
6258    IF p_amount IS NOT NULL THEN
6259       l_act_amount := ROUND(p_amount, l_precision);
6260    ELSE
6261       l_act_amount := TO_NUMBER(NULL);
6262    END IF;
6263 
6264    /* Updates the term with new term start/end date */
6265    UPDATE pn_payment_terms_all
6266    SET start_date = NVL(p_new_lea_term_start_dt, start_date),
6267        end_date = p_new_lea_term_end_dt,
6268        actual_amount = NVL(l_act_amount, actual_amount),
6269        last_update_date = SYSDATE,
6270        last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
6271        last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
6272    WHERE payment_term_id = p_payment_term_id;
6273 
6274    pnp_debug_pkg.log('UPDATE TERMS +Start+ (-)');
6275 END update_term_dates;
6276 
6277 
6278 -------------------------------------------------------------------------------
6279 --  PROCEDURE    : UPDATE_CASH_ITEM
6280 --  DESCRIPTION  : It updates last Cash Item by updating table
6281 --                 PN_PAYMENT_ITEMS_ALL with new adjustment amount
6282 --  NOTE         : It is overloaded for mini retro.
6283 --  INVOKED FROM : contract_pay_term_mini_retro
6284 --  ARGUMENTS    : IN : p_term_id, p_schedule_dt, p_act_amt
6285 --  HISTORY      :
6286 -- 01-AUG-05  piagrawa  o Created for mini-retro
6287 -- 24-NOV-05  Kiran     o Round amounts befor insert/uptdate into terms OR items.
6288 -- 24-jan-06  piagrawa  o Bug#4890236 - Did handling to add the adjustment
6289 --                        amount to the existing amount of the cash item.
6290 --------------------------------------------------------------------------------
6291 PROCEDURE  update_cash_item( p_item_id  NUMBER
6292                             ,p_term_id  NUMBER
6293                             ,p_sched_id NUMBER
6294                             ,p_act_amt  NUMBER)
6295 IS
6296 
6297    l_precision      NUMBER;
6298    l_ext_precision  NUMBER;
6299    l_min_acct_unit  NUMBER;
6300    l_exist_amount   NUMBER;
6301    l_act_amount     NUMBER;
6302    l_est_amount     NUMBER;
6303    l_adj_amount     NUMBER;
6304 
6305    CURSOR currency_cur IS
6306       SELECT currency_code
6307       FROM pn_payment_terms_all
6308       WHERE payment_term_id = p_term_id;
6309 
6310 BEGIN
6311    pnp_debug_pkg.log('update_cash_item +Start+ (-)');
6312 
6313    FOR rec IN currency_cur LOOP
6314       fnd_currency.get_info( currency_code => rec.currency_code
6315                             ,precision     => l_precision
6316                             ,ext_precision => l_ext_precision
6317                             ,min_acct_unit => l_min_acct_unit);
6318    END LOOP;
6319 
6320    IF p_item_id IS NOT NULL THEN
6321 
6322       UPDATE pn_payment_items_all
6323       SET    actual_amount = ROUND(actual_amount + NVL(p_act_amt,0), l_precision),
6324              export_currency_amount = ROUND(actual_amount + NVL(p_act_amt,0), l_precision),
6325              last_update_date = SYSDATE,
6326              last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
6327              last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
6328       WHERE  payment_item_id  = p_item_id;
6329 
6330    ELSE
6331 
6332       UPDATE pn_payment_items_all
6333       SET    actual_amount = ROUND(actual_amount + NVL(p_act_amt,0), l_precision),
6334              export_currency_amount = ROUND(actual_amount + NVL(p_act_amt,0), l_precision),
6335              last_update_date = SYSDATE,
6336              last_updated_by  = NVL(fnd_profile.value('USER_ID'),0),
6337              last_update_login= NVL(fnd_profile.value('LOGIN_ID'),0)
6338       WHERE  payment_item_id  = (SELECT ppi.payment_item_id
6339                                  FROM   pn_payment_items_all ppi,
6340                                         pn_payment_schedules_all pps
6341                                  WHERE  ppi.payment_term_id = p_term_id
6342                                  AND    ppi.payment_item_type_lookup_code = 'CASH'
6343                                  AND    pps.payment_schedule_id = ppi.payment_schedule_id
6344                                  AND    pps.payment_status_lookup_code = 'DRAFT'
6345                                  AND    pps.payment_schedule_id = p_sched_id);
6346 
6347    END IF;
6348 
6349    pnp_debug_pkg.log('update_cash_item +End+ (-)');
6350 
6351 EXCEPTION
6352    WHEN OTHERS THEN RAISE;
6353 
6354 END update_cash_item;
6355 
6356 --------------------------------------------------------------------------------
6357 --  PROCEDURE    : calculate_cash_item
6358 --  DESCRIPTION  : It calculates the new adjustment amount as
6359 --                 adjustment_amount = amount_due_to_term - amount_approved
6360 --  INVOKED FROM : contract_pay_term_mini_retro
6361 --  ARGUMENTS    : IN : p_term_id, p_term_str_dt, p_term_end_dt, p_act_amt
6362 --                      p_freq_code, p_schedule_day
6363 --  HISTORY      :
6364 --  01-AUG-05 piagrawa  o Created for mini-retro
6365 --  24-jan-06 piagrawa  o Bug#4890236 - Did handling to calculate the adjustment
6366 --                        amount as amount due to new term - amount due
6367 --                        to old term
6368 --------------------------------------------------------------------------------
6369 FUNCTION calculate_cash_item (p_term_id   NUMBER,
6370                               p_sched_tbl pn_retro_adjustment_pkg.payment_item_tbl_type)
6371 RETURN NUMBER
6372 IS
6373 
6374    l_cash_act_amt         NUMBER;
6375    l_cash_est_amt         NUMBER;
6376    l_amt_due_to_term      NUMBER;
6377    l_amt_due_to_old_term  NUMBER;
6378    l_payment_item_id      pn_payment_items_all.payment_item_id%TYPE;
6379 
6380    CURSOR total_amt_old_term_cur IS
6381       SELECT SUM(ppi.actual_amount) AS total_amount
6382       FROM  pn_payment_items_all ppi
6383       WHERE ppi.payment_term_id = p_term_id
6384       AND   ppi.payment_item_type_lookup_code = 'CASH';
6385 
6386 BEGIN
6387 
6388    pnp_debug_pkg.log('calculate_cash_item +Start+ (+)');
6389 
6390    /* update the cash amount for the schedule */
6391    l_amt_due_to_term := 0;
6392 
6393    /* iterating through table to calculate the total amount due to term */
6394    IF p_sched_tbl.COUNT > 0 THEN
6395 
6396       FOR i IN 0 .. p_sched_tbl.COUNT - 1 LOOP
6397          l_amt_due_to_term := l_amt_due_to_term + p_sched_tbl(i).amount ;
6398       END LOOP;
6399 
6400    END IF;
6401 
6402    /* Fetching the total amount approved for the term */
6403    l_amt_due_to_old_term := 0;
6404 
6405    FOR rec IN total_amt_old_term_cur LOOP
6406       l_amt_due_to_old_term := rec.total_amount;
6407    END LOOP;
6408 
6409    pnp_debug_pkg.log('amount due to new term .........' || l_amt_due_to_term);
6410    pnp_debug_pkg.log('amount due to old term .........' || l_amt_due_to_old_term);
6411 
6412    l_cash_act_amt := l_amt_due_to_term - NVL(l_amt_due_to_old_term, 0);
6413 
6414    pnp_debug_pkg.log('Returning amount .........' || l_cash_act_amt);
6415 
6416    pnp_debug_pkg.log('calculate_cash_item -End- (-)');
6417 
6418    RETURN l_cash_act_amt;
6419 
6420 EXCEPTION
6421    WHEN OTHERS THEN
6422       RAISE ;
6423 
6424 END calculate_cash_item;
6425 
6426 
6427 -------------------------------------------------------------------------------
6428 --  PROCEDURE    : DELETE_TERM
6429 --  DESCRIPTION  : Deletes a term
6430 --  INVOKED FROM : mini_retro_contraction
6431 --  ARGUMENTS    : IN : p_payment_term_id
6432 --  HISTORY      :
6433 --  01-AUG-05   piagrawa  o Created for mini-retro
6434 -------------------------------------------------------------------------------
6435 PROCEDURE delete_term(p_payment_term_id   NUMBER)
6436 AS
6437 BEGIN
6438    pnp_debug_pkg.log('Delete term start (+)');
6439 
6440    pnp_debug_pkg.log('Deleting all items for term ....'||p_payment_term_id);
6441    DELETE pn_payment_items_all
6442    WHERE  payment_term_id = p_payment_term_id;
6443 
6444    pnp_debug_pkg.log('Deleting term ....'||p_payment_term_id);
6445    DELETE pn_payment_terms_all
6446    WHERE  payment_term_id = p_payment_term_id;
6447 
6448 
6449    pnp_debug_pkg.log('Delete term End (-)');
6450 
6451 EXCEPTION
6452    WHEN OTHERS THEN
6453       RAISE ;
6454 END delete_term;
6455 
6456 
6457 --------------------------------------------------------------------------------
6458 --  PROCEDURE    : contract_pay_term_mini_retro
6459 --  DESCRIPTION  : This procedure is used to contract a given term. If term is
6460 --                 contracted beyond approved schedules then adjustment is made
6461 --                 else the last draft cash item is updated with the required
6462 --                 amount. For normalized items , renormalization is done.
6463 --  INVOKED FROM : schedules_items, MINI_RETRO_CONTRACTION
6464 --  ARGUMENTS    : IN : p_lease_id, p_lease_context, p_new_lea_term_dt,
6465 --                      p_new_lea_comm_dt, p_mths, p_normalize, p_adjustment,
6466 --                      p_payment_term_id
6467 --  HISTORY      :
6468 --  01-AUG-05 piagrawa  o Created for mini-retro
6469 --  24-JAN-06 hkulkarn  o Bug 4956314 : Create New Draft Schedule
6470 --                        [in find_schedule]based on the Context Passed. If its
6471 --                        'CON' Lease Contraction, use the lase schedule for new
6472 --                         Lease  Termination Date, otherwise use last schedule
6473 --                         for Term Termination.
6474 --  19-jan-06 piagrawa  o Bug#4931780 - Modified signature and added a check
6475 --                        before renormalizing the terms.
6476 --  04-APR-06  piagrawa  o Bug#5107134 - modified delete statement to include
6477 --                          status 'ON_HOLD'
6478 --  02-JAN-09  acprakas o Bug#7016892. Modified code to update changed_flag
6479 --                                 of pn_payment_terms_all only when lease context is
6480 --                                 CONTERM.
6481 --------------------------------------------------------------------------------
6482 
6483 PROCEDURE contract_pay_term_mini_retro (p_lease_id           NUMBER,
6484                                         p_lease_context      VARCHAR2,
6485                                         p_new_lea_term_dt    DATE,
6486                                         p_new_lea_comm_dt    DATE,
6487                                         p_mths               NUMBER,
6488                                         p_normalize          VARCHAR2,
6489                                         p_adjustment         VARCHAR2,
6490                                         p_payment_term_id    NUMBER,
6491                                         p_cutoff_date        DATE,
6492                                         p_add_main           VARCHAR2)
6493 IS
6494 
6495    l_frequency                  NUMBER;
6496    l_sch_str_dt                 DATE;
6497    l_sch_end_dt                 DATE;
6498    l_lst_cash_sch_dt            DATE;
6499    l_norm_str_dt                DATE;
6500    l_lease_termination_date     DATE;
6501    l_active_lease_change_id     pn_lease_details.lease_change_id%TYPE;
6502    l_payment_schedule_id        pn_payment_items_all.payment_schedule_id%TYPE;
6503    l_payment_item_id            pn_payment_items_all.payment_item_id%TYPE;
6504    l_payment_status_lookup_code pn_payment_schedules_all.payment_status_lookup_code%TYPE;
6505    l_adjustment                 VARCHAR2(1);
6506    l_adj_amount                 NUMBER;
6507 
6508    l_sched_tbl                  pn_retro_adjustment_pkg.payment_item_tbl_type;
6509    l_last_sched_draft           VARCHAR2(1);
6510    l_count                      NUMBER; -- Added for Bug 6154106.
6511 
6512    /* find id CASH item exists for a schedule */
6513    CURSOR cash_item_exist_cur(p_sched_id NUMBER) IS
6514       SELECT payment_item_id
6515       FROM   pn_payment_items_all
6516       WHERE  payment_item_type_lookup_code = 'CASH'
6517       AND    payment_schedule_id = p_sched_id
6518       AND    payment_term_id = p_payment_term_id;
6519 
6520    /* check if exists draft schedule for the given date for a lease */
6521    CURSOR draft_schedule_exists_cur (p_sched_date DATE) IS
6522       SELECT pps.payment_schedule_id
6523       FROM   pn_payment_schedules_all pps
6524       WHERE  pps.schedule_date = p_sched_date
6525       AND    pps.lease_id = p_lease_id
6526       AND    pps.payment_status_lookup_code = 'DRAFT';
6527 
6528 BEGIN
6529 
6530    pnp_debug_pkg.log('CONTRACT_PAY_TERM_MINI_RETRO - Contraction of Payment Term - CONTERM +Start+ (+)');
6531    pnp_debug_pkg.log('CONTRACT_PAY_TERM_MINI_RETRO IN: p_lease_id        : '||p_lease_id);
6532    pnp_debug_pkg.log('CONTRACT_PAY_TERM_MINI_RETRO IN: p_lease_context   : '||p_lease_context);
6533    pnp_debug_pkg.log('CONTRACT_PAY_TERM_MINI_RETRO IN: p_new_lea_term_dt : '||p_new_lea_term_dt);
6534    pnp_debug_pkg.log('CONTRACT_PAY_TERM_MINI_RETRO IN: p_new_lea_comm_dt : '||p_new_lea_comm_dt);
6535    pnp_debug_pkg.log('CONTRACT_PAY_TERM_MINI_RETRO IN: p_mths            : '||p_mths);
6536 
6537    IF g_lease_status = 'ACT' THEN
6538       l_lease_termination_date := g_new_lea_term_dt;
6539    ELSE
6540       l_lease_termination_date := Get_Norm_End_Date(p_lease_id);
6541    END IF;
6542 
6543    l_active_lease_change_id := Get_Lease_Change_Id(p_lease_id);
6544 
6545    FOR pay_term_con_cur IN payment_term_con_cur_retro(p_lease_id, p_payment_term_id )
6546    LOOP
6547 
6548       pnp_debug_pkg.log('CONTRACT_PAY_TERM_MINI_RETRO - Term ID : '
6549                          ||TO_CHAR(pay_term_con_cur.payment_term_id)
6550                          ||' , Term End Date: '||pay_term_con_cur.end_date);
6551 
6552       IF p_adjustment = 'Y' THEN
6553 
6554          /* delete items beyond the end date */
6555          DELETE pn_payment_items_all
6556          WHERE payment_schedule_id IN
6557               (SELECT payment_schedule_id
6558                FROM   pn_payment_schedules_all
6559                WHERE  lease_id = p_lease_id
6560                AND    schedule_date > pay_term_con_cur.end_date
6561                AND    payment_status_lookup_code IN ('DRAFT', 'ON_HOLD'))
6562          AND payment_term_id = pay_term_con_cur.payment_term_id;
6563 
6564          l_sched_tbl.DELETE;
6565 
6566          pn_retro_adjustment_pkg.create_virtual_schedules
6567             (p_start_date => pay_term_con_cur.start_date,
6568              p_end_date   => pay_term_con_cur.end_date,
6569              p_sch_day    => pay_term_con_cur.schedule_day,
6570              p_amount     => nvl(pay_term_con_cur.actual_amount,pay_term_con_cur.estimated_amount), /*5259155*/
6571              p_term_freq  => pay_term_con_cur.frequency_code,
6572              x_sched_tbl  => l_sched_tbl);
6573 
6574          l_adj_amount := calculate_cash_item
6575                            (p_term_id   => pay_term_con_cur.payment_term_id,
6576                             p_sched_tbl => l_sched_tbl);
6577 
6578          IF l_adj_amount <> 0 THEN
6579 
6580             l_last_sched_draft := 'N';
6581 
6582             IF p_lease_context = 'CON' THEN
6583 
6584                FOR rec IN draft_schedule_exists_cur(l_sched_tbl(l_sched_tbl.LAST).schedule_date)
6585                LOOP
6586                   l_last_sched_draft := 'Y';
6587                   l_payment_schedule_id := rec.payment_schedule_id;
6588                   l_lst_cash_sch_dt := l_sched_tbl(l_sched_tbl.LAST).schedule_date;
6589                END LOOP;
6590 
6591                IF l_last_sched_draft = 'N' THEN
6592 
6593                   l_lst_cash_sch_dt
6594                      := TO_DATE(TO_CHAR(pay_term_con_cur.schedule_day)
6595                                  ||'/'||TO_CHAR(pay_term_con_cur.end_date,'MM/YYYY')
6596                                ,'DD/MM/YYYY');
6597 
6598                   pn_retro_adjustment_pkg.find_schedule( p_lease_id
6599                                                         ,l_active_lease_change_id
6600                                                         ,p_payment_term_id
6601                                                         ,l_lst_cash_sch_dt
6602                                                         ,l_payment_schedule_id);
6603                END IF;
6604 
6605             ELSIF p_lease_context = 'CONTERM' THEN
6606 
6607                FOR rec IN draft_schedule_exists_cur(l_sched_tbl(l_sched_tbl.LAST).schedule_date)
6608                LOOP
6609                   l_last_sched_draft := 'Y';
6610                   l_payment_schedule_id := rec.payment_schedule_id;
6611                   l_lst_cash_sch_dt := l_sched_tbl(l_sched_tbl.LAST).schedule_date;
6612                END LOOP;
6613 
6614                IF l_last_sched_draft = 'N' THEN
6615 
6616                   l_lst_cash_sch_dt := l_sched_tbl(l_sched_tbl.LAST).schedule_date;
6617 
6618                   pn_retro_adjustment_pkg.find_schedule( p_lease_id
6619                                                         ,l_active_lease_change_id
6620                                                         ,p_payment_term_id
6621                                                         ,l_lst_cash_sch_dt
6622                                                         ,l_payment_schedule_id);
6623 
6624                END IF; /* IF l_last_sched_draft = 'N' */
6625 
6626             END IF; /* IF p_lease_context */
6627 
6628             l_payment_item_id := NULL;
6629             FOR rec IN cash_item_exist_cur(l_payment_schedule_id) LOOP
6630                l_payment_item_id := rec.payment_item_id;
6631             END LOOP;
6632 
6633             IF l_payment_item_id IS NOT NULL THEN
6634                update_cash_item( p_item_id  => l_payment_item_id
6635                                 ,p_term_id  => p_payment_term_id
6636                                 ,p_sched_id => l_payment_schedule_id
6637                                 ,p_act_amt  => l_adj_amount);
6638 
6639             ELSE
6640                create_cash_items(p_est_amt           => l_adj_amount,
6641                                  p_act_amt           => l_adj_amount,
6642                                  p_sch_dt            => l_lst_cash_sch_dt,
6643                                  p_sch_id            => l_payment_schedule_id,
6644                                  p_term_id           => p_payment_term_id,
6645                                  p_vendor_id         => pay_term_con_cur.vendor_id,
6646                                  p_cust_id           => pay_term_con_cur.customer_id,
6647                                  p_vendor_site_id    => pay_term_con_cur.vendor_site_id,
6648                                  p_cust_site_use_id  => pay_term_con_cur.customer_site_use_id,
6649                                  p_cust_ship_site_id => pay_term_con_cur.cust_ship_site_id,
6650                                  p_sob_id            => pay_term_con_cur.set_of_books_id,
6651                                  p_curr_code         => pay_term_con_cur.currency_code,
6652                                  p_rate              => pay_term_con_cur.rate);
6653 
6654             END IF; /* IF l_payment_item_id IS NOT NULL */
6655 
6656          END IF;
6657 
6658       END IF; /* p_adjustment = 'Y' */
6659 
6660       IF p_normalize = 'Y' THEN
6661 
6662          IF  pay_term_con_cur.norm_end_Date > p_cutoff_date  THEN
6663 
6664             l_norm_str_dt := NVL(pay_term_con_cur.norm_start_date,
6665                                  Get_First_Item_Date(pay_term_con_cur.payment_term_id));
6666 /* Added for Bug 6154106*/
6667             DELETE pn_payment_items_all
6668             WHERE payment_schedule_id IN
6669                  (SELECT payment_schedule_id
6670                   FROM   pn_payment_schedules_all
6671                   WHERE  lease_id = p_lease_id
6672                   AND    schedule_date > g_new_lea_term_dt
6673                   AND    payment_status_lookup_code IN ('DRAFT', 'ON_HOLD'))
6674             AND payment_term_id = pay_term_con_cur.payment_term_id;
6675             l_count := 0;
6676 --  Copied from PN_NORM_RENORM_PKG.NORMALIZE_RENORMALIZE
6677             SELECT count(*) into l_count
6678                 FROM   pn_payment_schedules_all pps,
6679                        pn_payment_items_all ppi
6680                 WHERE  pps.lease_id = p_lease_id
6681                 AND    pps.schedule_date BETWEEN PN_SCHEDULES_ITEMS.FIRST_DAY(l_norm_str_dt)
6682                                              AND LAST_DAY(g_new_lea_term_dt)
6683                 AND    pps.payment_status_lookup_code in ( 'DRAFT', 'ON_HOLD' )
6684                 AND    TO_CHAR(pps.schedule_date,'DD') = pay_term_con_cur.schedule_day
6685                 AND    ppi.PAYMENT_SCHEDULE_ID(+) = pps.PAYMENT_SCHEDULE_ID
6686                 AND    ppi.PAYMENT_TERM_ID(+) = pay_term_con_cur.payment_term_id
6687                 AND    ppi.PAYMENT_ITEM_TYPE_LOOKUP_CODE(+) = 'CASH'
6688                 AND    ppi.LAST_ADJUSTMENT_TYPE_CODE IS NULL
6689                 ORDER BY pps.schedule_date;
6690 
6691             IF l_count = 0 THEN
6692                 l_lst_cash_sch_dt
6693                    := TO_DATE(TO_CHAR(pay_term_con_cur.schedule_day)
6694                                ||'/'||TO_CHAR(g_new_lea_term_dt,'MM/YYYY')
6695                              ,'DD/MM/YYYY');
6696 
6697                 pn_retro_adjustment_pkg.find_schedule( p_lease_id
6698                                                        ,l_active_lease_change_id
6699                                                        ,p_payment_term_id
6700                                                        ,l_lst_cash_sch_dt
6701                                                        ,l_payment_schedule_id);
6702             END IF;
6703 /* End Bug 6154106 */
6704 
6705             PN_NORM_RENORM_PKG.NORMALIZE_RENORMALIZE
6706                (p_lease_context      => p_lease_context,
6707                 p_lease_id           => p_lease_id,
6708                 p_term_id            => pay_term_con_cur.payment_term_id,
6709                 p_vendor_id          => pay_term_con_cur.vendor_id,
6710                 p_cust_id            => pay_term_con_cur.customer_id,
6711                 p_vendor_site_id     => pay_term_con_cur.vendor_site_id,
6712                 p_cust_site_use_id   => pay_term_con_cur.customer_site_use_id,
6713                 p_cust_ship_site_id  => pay_term_con_cur.cust_ship_site_id,
6714                 p_sob_id             => pay_term_con_cur.set_of_books_id,
6715                 p_curr_code          => pay_term_con_cur.currency_code,
6716                 p_sch_day            => pay_term_con_cur.schedule_day,
6717                 p_norm_str_dt        => l_norm_str_dt,
6718                 p_norm_end_dt        => l_lease_termination_date,
6719                 p_rate               => pay_term_con_cur.rate,
6720                 p_lease_change_id    => pay_term_con_cur.lease_change_id);
6721 
6722          END IF;
6723 
6724       END IF; /* IF p_normalize = 'Y' */
6725 
6726       IF p_lease_context = 'CONTERM' THEN
6727           UPDATE pn_payment_terms_all
6728           SET    changed_flag = 'N'
6729           WHERE  payment_term_id = pay_term_con_cur.payment_term_id;
6730       END IF;
6731 
6732    END LOOP;
6733 
6734    /* Now create the schedules and items for the new terms that have been added along with
6735       the contraction of the main lease */
6736    IF p_add_main = 'Y' THEN
6737 
6738      add_main(p_lease_id            => p_lease_id,
6739               p_lease_context       => 'ADDEDT',
6740               p_new_lea_term_dt     => p_new_lea_term_dt,
6741               p_new_lea_comm_dt     => p_new_lea_comm_dt,
6742               p_mths                => p_mths);
6743 
6744    END IF;
6745 
6746    pnp_debug_pkg.log('CONTRACT_PAY_TERM - Contraction of Payment Term - CONTERM -End- (+)');
6747 
6748 EXCEPTION
6749    WHEN OTHERS THEN RAISE ;
6750 
6751 END contract_pay_term_mini_retro;
6752 
6753 
6754 -------------------------------------------------------------------------------
6755 --  PROCEDURE    : MINI_RETRO_CONTRACTION
6756 --  DESCRIPTION  : This procedure is used to contract a given lease.If lease is
6757 --                 contracted beyond approved schedules then adjustment is made
6758 --                 else the last draft cash item is updated with the required
6759 --                 amount. For normalized items , renormalization is done.
6760 --  INVOKED FROM : schedules_items
6761 --  ARGUMENTS    : IN : p_lease_id, p_lease_context, p_new_lea_term_dt,
6762 --                      p_new_lea_comm_dt, p_mths
6763 --  HISTORY      :
6764 --  01-AUG-05   piagrawa  o Created for mini-retro
6765 --  19-jan-06   piagrawa  o Bug#4931780 - Modified signature
6766 --  24-jan-06   piagrawa  o Bug#4890236 - Modified to delete the draft cash items
6767 --                          before processing the terms if their schedule date
6768 --                          is greater then lease end date.
6769 -------------------------------------------------------------------------------
6770 PROCEDURE mini_retro_contraction(p_lease_id           NUMBER,
6771                                  p_lease_context      VARCHAR2,
6772                                  p_new_lea_term_dt    DATE,
6773                                  p_new_lea_comm_dt    DATE,
6774                                  p_mths               NUMBER,
6775                                  p_cutoff_date        DATE)
6776 IS
6777 
6778    l_msg                           VARCHAR2(2000);
6779    l_old_lea_term_dt               DATE;
6780    l_is_norm                       VARCHAR2(1);
6781    l_active_lease_change_id        pn_lease_details.lease_change_id%TYPE;
6782    l_schedule_exists               VARCHAR2(1) := 'N';
6783 
6784    CURSOR get_old_lea_term_dt IS
6785       SELECT NVL(plh.lease_extension_end_date,
6786                  plh.lease_termination_date) lease_termination_date
6787       FROM   pn_lease_details_history plh,
6788              pn_lease_details_all pld
6789       WHERE  pld.lease_change_id = plh.new_lease_change_id
6790       AND    pld.lease_id = p_lease_id;
6791 
6792    -- retrieves the approved schedule for a payment term for a lease
6793    CURSOR approved_sched_exist_cur(p_lease_ID IN NUMBER, p_payment_term_id IN NUMBER)
6794    IS
6795       SELECT payment_schedule_id
6796       FROM pn_payment_schedules_all
6797       WHERE lease_id = p_lease_ID
6798       AND payment_status_lookup_code = 'APPROVED'
6799       AND payment_schedule_id IN (SELECT payment_schedule_id
6800                                   FROM   pn_payment_items_all
6801                                   WHERE  payment_term_id = p_payment_term_id);
6802 
6803 
6804 BEGIN
6805    pnp_debug_pkg.log('MINI RETRO CONTRACTION +Start+ (+)');
6806    pnp_debug_pkg.log('MINI RETRO CONTRACTION of MAIN Lease +Start+ (+)');
6807    pnp_debug_pkg.log('MINI RETRO CONTRACTION IN: p_lease_id         : '||p_lease_id);
6808    pnp_debug_pkg.log('MINI RETRO CONTRACTION IN: p_lease_context    : '||p_lease_context);
6809    pnp_debug_pkg.log('MINI RETRO CONTRACTION IN: p_new_lea_term_dt  : '||p_new_lea_term_dt);
6810    pnp_debug_pkg.log('MINI RETRO CONTRACTION IN: p_new_lea_comm_dt  : '||p_new_lea_comm_dt);
6811    pnp_debug_pkg.log('MINI RETRO CONTRACTION IN: p_mths             : '||p_mths);
6812 
6813    FOR rec IN get_old_lea_term_dt LOOP
6814       l_old_lea_term_dt := rec.lease_termination_date;
6815    END LOOP;
6816 
6817    pnp_debug_pkg.log('MINI RETRO CONTRACTION  - MAIN - Contracting Index rent ');
6818 
6819    pn_index_rent_periods_pkg.process_main_lease_term_date(p_lease_id,
6820                                                           p_new_lea_term_dt,
6821                                                           l_old_lea_term_dt,
6822                                                           p_lease_context,
6823                                                           l_msg,
6824                                                           p_cutoff_date);
6825 
6826    pnp_debug_pkg.log('MINI RETRO CONTRACTION - MAIN - Deleting Payment Items');
6827 
6828    /* Retrieve the active lease change id */
6829    l_active_lease_change_id := Get_Lease_Change_Id(p_lease_id);
6830 
6831    pnp_debug_pkg.log('MINI RETRO CONTRACTION IN: active lease change id : '||l_active_lease_change_id);
6832 
6833    /* Looping through all the terms associated with the lease. */
6834    FOR rec IN lease_con_cur_mini_retro(p_lease_id,l_active_lease_change_id)
6835    LOOP
6836 
6837       pnp_debug_pkg.log('TERM ID : term id        : '||rec.payment_term_id);
6838 
6839       l_is_norm := NVL(rec.normalize, 'N');
6840       l_schedule_exists := 'N';
6841 
6842       /* Check if the terms lie outside the new lease */
6843       IF rec.start_date > p_new_lea_term_dt AND
6844          rec.start_date <= l_old_lea_term_dt THEN
6845 
6846          FOR approved_sched_exist_rec IN approved_sched_exist_cur(p_lease_id, rec.payment_term_id) LOOP
6847             l_schedule_exists := 'Y';
6848          END LOOP;
6849 
6850          /* the start dates and end dates for a term will be updated if and only if
6851             there exists atleast one approved schedule for the term */
6852 
6853          IF (l_schedule_exists = 'Y') THEN
6854 
6855             /* The term start date lies outside the new lease */
6856 
6857             /* Update term with new term dates i.e. new lease end date and amount equal
6858                to 0 ,if the term lies outside the new lease and is a non-normalized term */
6859 
6860             update_term_dates(p_new_lea_term_start_dt => p_new_lea_term_dt,
6861                               p_new_lea_term_end_dt   => p_new_lea_term_dt,
6862                               p_lease_id              => p_lease_id,
6863                               p_payment_term_id       => rec.payment_term_id,
6864                               p_amount                => 0 );
6865 
6866             contract_pay_term_mini_retro (p_lease_id        => p_lease_id,
6867                                           p_lease_context   => p_lease_context,
6868                                           p_new_lea_term_dt => p_new_lea_term_dt,
6869                                           p_new_lea_comm_dt => p_new_lea_comm_dt,
6870                                           p_mths            => p_mths,
6871                                           p_normalize       => l_is_norm,
6872                                           p_adjustment      => 'Y',
6873                                           p_payment_term_id => rec.payment_term_id,
6874                                           p_cutoff_date     => p_cutoff_date,
6875                                           p_add_main        => 'N');
6876 
6877          ELSE
6878 
6879             delete_term(p_payment_term_id => rec.payment_term_id);
6880 
6881          END IF;
6882 
6883       ELSIF rec.start_date <= p_new_lea_term_dt THEN
6884 
6885          /* The term start date do not lie outside the new lease.
6886             Check if the term end date lies within new lease end date*/
6887 
6888          IF rec.end_date >= p_new_lea_term_dt THEN
6889 
6890             /* Update term with new term end date if the term lies partially outside the new
6891                lease is a normalized term   */
6892 
6893             update_term_dates(p_new_lea_term_end_dt => p_new_lea_term_dt,
6894                               p_lease_id            => p_lease_id,
6895                               p_payment_term_id     => rec.payment_term_id);
6896 
6897             contract_pay_term_mini_retro (p_lease_id        => p_lease_id,
6898                                           p_lease_context   => p_lease_context,
6899                                           p_new_lea_term_dt => p_new_lea_term_dt,
6900                                           p_new_lea_comm_dt => p_new_lea_comm_dt,
6901                                           p_mths            => p_mths,
6902                                           p_normalize       => l_is_norm,
6903                                           p_adjustment      => 'Y',
6904                                           p_payment_term_id => rec.payment_term_id,
6905                                           p_cutoff_date     => p_cutoff_date,
6906                                           p_add_main        => 'N');
6907 
6908 
6909          ELSE
6910 
6911             /* Renormalize the term if it is a normalized term  */
6912             IF l_is_norm = 'Y' THEN
6913 
6914                contract_pay_term_mini_retro (p_lease_id        => p_lease_id,
6915                                              p_lease_context   => p_lease_context,
6916                                              p_new_lea_term_dt => p_new_lea_term_dt,
6917                                              p_new_lea_comm_dt => p_new_lea_comm_dt,
6918                                              p_mths            => p_mths,
6919                                              p_normalize       => l_is_norm,
6920                                              p_adjustment      => 'N',
6921                                              p_payment_term_id => rec.payment_term_id,
6922                                              p_cutoff_date     => p_cutoff_date,
6923                                              p_add_main        => 'N');
6924 
6925             END IF; /* IF l_is_norm = 'Y' */
6926 
6927          END IF; /* IF  rec.end_date >= p_new_lea_term_dt */
6928 
6929       END IF; /* ELSIF rec.start_date <= p_new_lea_term_dt */
6930 
6931    END LOOP;
6932 
6933    /* Now create the schedules and items for the new terms that have been added along with
6934       the contraction of the main lease */
6935 
6936    add_main(p_lease_id        => p_lease_id,
6937             p_lease_context   => 'ADDAMD',
6938             p_new_lea_term_dt => p_new_lea_term_dt,
6939             p_new_lea_comm_dt => p_new_lea_comm_dt,
6940             p_mths            => p_mths);
6941 
6942    /* call clean up schedules to delete schedules which do not have any item or
6943       are draft and are outside the lease */
6944 
6945    pn_retro_adjustment_pkg.cleanup_schedules(p_lease_id);
6946 
6947    /* For Sub_Lease and Third_Party lease, contract tenancies and associated
6948        space assignments as well. */
6949 
6950    IF g_lease_class_code <> 'DIRECT' THEN
6951       contract_tenancies( p_lease_id           => p_lease_id
6952                          ,p_new_lea_term_dt    => p_new_lea_term_dt
6953                         );
6954    END IF;
6955 
6956    pnp_debug_pkg.log('MINI RETRO CONTRACTION of MAIN Lease -End- (-)');
6957 
6958 EXCEPTION
6959    WHEN OTHERS THEN RAISE ;
6960 
6961 END mini_retro_contraction;
6962 
6963 
6964 --------------------------------------------------------------------------------------------
6965 --  PROCEDURE  : SCHEDULES_ITEMS
6966 --  DESCRIPTION: This is the main procedure called by pld with lease id and lease context.
6967 --               Depending on the lease context, relevent routine is called for given ter,.
6968 --
6969 --  25-JUN-01  MMisra    o Created.
6970 --  18-JUL-03  STripathi o Fixed for BUG# 3005135. Added lease_class_code in
6971 --                         cursor get_lease_details.
6972 --  16-OCT-03  STripathi o Fix for BUG# 3201091. Removed CURSOR get_max_lease_change_id
6973 --                         and FETCH INTO global variables g_lc_id, g_amd_comm_dt.
6974 --  27-OCT-03  STripathi o Fixed for BUG# 3178064. Populate g_lease_status.
6975 --  21-OCT-04  VMmehta         o Bug# 3940200 - Added parameter p_calc_batch
6976 --  15-OCT-04  MMisra    o Added code to call proc. adjustment when lease_context is 'ADJ'.
6977 --  19-JAN-06  piagrawa  o Bug#4931780 - Modified signature
6978 --  21-JUL-06  Pikhar    o Codev. Recalculate Natural Breakpoint if any changes in
6979 --                         Lease Payment Terms
6980 --  09-OCT-06  Hareesha  o Added extend_ri parameter for extending RI agreement on
6981 --                         lease extension due to MTM/HLD.
6982 --  05-APR-07  Hareesha  o Added handling for user's choice to expand terms and tenancies.
6983 --  17-APR-07  Hareesha  o Bug # 5980300 Do not trigger PNCALNDX, if there exists no agreements
6984 --                         with periods generated.
6985 --  18-APR-07  sdmahesh  o Bug # 5985779. Enhancement for new profile
6986 --                         option for lease early termination
6987 --------------------------------------------------------------------------------------------
6988 PROCEDURE schedules_items (errbuf            OUT NOCOPY VARCHAR2,
6989                            retcode           OUT NOCOPY VARCHAR2,
6990                            p_lease_id        IN  NUMBER,
6991                            p_lease_context   IN  VARCHAR2,
6992                            p_called_from     IN  VARCHAR2,
6993                            p_term_id         IN  NUMBER,
6994                            p_term_end_dt     IN  DATE,
6995                            p_calc_batch      IN  VARCHAR2,
6996                            p_cutoff_date     IN  VARCHAR2,
6997                            p_extend_ri       IN  VARCHAR2,
6998                            p_ten_trm_context IN  VARCHAR2)
6999 IS
7000 
7001    l_mths                          NUMBER;
7002    l_return_status                 VARCHAR2(30) := NULL;
7003    l_return_message                VARCHAR2(32767) := NULL;
7004    l_requestId                     NUMBER := NULL;
7005    RETRO_NOT_ENABLED_EXCEPTION     EXCEPTION;
7006    l_cutoff_date                   DATE;
7007    l_process_nbp                   VARCHAR2(1);
7008    l_errbuf                        VARCHAR2(80);
7009    l_retcode                       VARCHAR2(80);
7010    l_update_nbp_flag               VARCHAR2(1);
7011    l_dummy                         VARCHAR2(1);
7012    l_var_rent_id                   NUMBER;
7013    l_calc_batch                    VARCHAR2(1);
7014 
7015    CURSOR get_lease_details IS
7016       SELECT pld.lease_commencement_date,
7017              pld.lease_termination_date,
7018              TRUNC(pld.lease_extension_end_date),
7019              pl.payment_term_proration_rule,
7020              pl.lease_status,
7021              pl.lease_class_code,
7022              pl.lease_num,
7023              pl.name
7024       FROM   pn_leases_all pl,
7025              pn_lease_details_all pld
7026       WHERE  pl.lease_id = p_lease_id
7027       AND    pld.lease_id = pl.lease_id;
7028 
7029    CURSOR var_cur(p1_lease_id IN NUMBER)
7030    IS
7031       SELECT var_rent_id
7032       FROM pn_var_rents_all
7033       WHERE lease_id = p1_lease_id;
7034 
7035    CURSOR terms_cur (p1_lease_id IN NUMBER)
7036    IS
7037       SELECT UPDATE_NBP_FLAG
7038       FROM PN_PAYMENT_TERMS_ALL
7039       WHERE lease_id = p1_lease_id
7040       FOR UPDATE NOWAIT;
7041 
7042    CURSOR bkhd_exists_cur
7043    IS
7044       select 'x'
7045       FROM DUAL
7046       where exists (select BKHD_DEFAULT_ID
7047                     from pn_var_bkpts_head_all
7048                     where period_id IN (select PERIOD_ID
7049                                         FROM pn_var_periods_all
7050                                         where VAR_RENT_ID = l_var_rent_id)
7051                     AND BKHD_DEFAULT_ID IS NOT NULL);
7052 
7053    CURSOR get_info IS
7054    SELECT    det_history.lease_status             lease_status_old,
7055              lease.lease_status                   lease_status_new,
7056              details.lease_termination_date       lease_term_date,
7057              det_history.lease_extension_end_date lease_ext_end_date
7058       FROM pn_lease_details_all details,
7059            pn_lease_details_history det_history,
7060            pn_leases_all        lease
7061       WHERE details.lease_id = p_lease_id
7062       AND   det_history.lease_id = p_lease_id
7063       AND   lease.lease_id = p_lease_id
7064       AND   details.lease_change_id = det_history.new_lease_change_id;
7065 
7066    CURSOR no_periods_exist_cur IS
7067       SELECT 'Y'
7068       FROM DUAL
7069       WHERE NOT EXISTS ( SELECT NULL
7070                          FROM pn_index_leases_all ilease, pn_index_lease_periods_all period
7071                          WHERE ilease.lease_id = p_lease_id
7072                          AND period.index_lease_id = ilease.index_lease_id);
7073 
7074    l_lease_status_old   VARCHAR2(30);
7075    l_lease_status_new   VARCHAR2(30);
7076    l_lease_term_date    DATE;
7077    l_lease_ext_end_date DATE;
7078    l_start_pos NUMBER := 1;     --Bug#7016892
7079    l_end_pos NUMBER;		--Bug#7016892
7080    l_lease_context VARCHAR2(30);  --Bug#7016892
7081 
7082 
7083 BEGIN
7084 
7085    g_lease_id := p_lease_id;
7086 
7087    pnp_debug_pkg.log('pn_schedules_items.schedule_items +Start+ (+)');
7088    pnp_debug_pkg.log('Lease_ID     : '||TO_CHAR(g_lease_id));
7089    pnp_debug_pkg.log('Lease Context: '||p_lease_context
7090                       ||', Called From: '||p_called_from);
7091 
7092    l_calc_batch := p_calc_batch;
7093    FOR rec IN get_info LOOP
7094       l_lease_status_old  :=   rec.lease_status_old  ;
7095       l_lease_status_new  :=   rec.lease_status_new  ;
7096       l_lease_term_date   :=   rec.lease_term_date   ;
7097       l_lease_ext_end_date :=  rec.lease_ext_end_date;
7098    END LOOP;
7099 
7100    IF l_lease_status_new = 'ACT' AND ( l_lease_status_old = 'MTM' OR l_lease_status_old ='HLD')
7101       AND l_lease_term_date > l_lease_ext_end_date
7102    THEN
7103       l_calc_batch:= 'N';
7104    END IF;
7105 
7106 
7107    /* Get the Lease Details */
7108 
7109    OPEN get_lease_details;
7110       FETCH get_lease_details
7111       INTO  g_new_lea_comm_dt,
7112             g_new_lea_term_dt,
7113             g_new_ext_end_date,
7114             g_pr_rule,
7115             g_lease_status,
7116             g_lease_class_code,
7117             g_lease_num,
7118             g_lease_name;
7119    CLOSE get_lease_details;
7120 
7121 
7122    pnp_debug_pkg.log('Cut Off Date in varchar2     : '||p_cutoff_date);
7123 
7124    l_cutoff_date := fnd_date.canonical_to_date(p_cutoff_date);
7125 
7126    IF l_cutoff_date IS NULL THEN
7127       l_cutoff_date := g_new_lea_comm_dt ;
7128    END IF;
7129 
7130    pnp_debug_pkg.log('lease_termination_date   : '||g_new_lea_term_dt);
7131    pnp_debug_pkg.log('lease_commencement_date  : '||g_new_lea_comm_dt);
7132    pnp_debug_pkg.log('Cut Off Date     : '||l_cutoff_date);
7133 
7134    /* Calculate number of months between lease commenecement date and termination date.*/
7135 
7136    l_mths := ROUND(MONTHS_BETWEEN(First_Day(g_new_lea_term_dt),First_Day(g_new_lea_comm_dt)))+1;
7137 
7138    pnp_debug_pkg.log('No. of Months between Lease Commencement and Termination Date: '||l_mths);
7139 
7140   WHILE(l_start_pos <= length(p_lease_context))
7141   LOOP
7142     select decode(instr(p_lease_context,':',l_start_pos),0,length(p_lease_context),instr(p_lease_context,':',l_start_pos)-1)
7143     into l_end_pos from dual;
7144     l_lease_context := substr(p_lease_context,l_start_pos,l_end_pos - l_start_pos + 1);
7145     l_start_pos := l_end_pos + 2;
7146 
7147    IF l_lease_context = 'CON' AND p_called_from = 'MAIN' THEN
7148 
7149       pnp_debug_pkg.log('schedules_items - Contraction +Start+ (+)');
7150       IF NVL(fnd_profile.value('PN_ERLY_TMNT_B4_LST_APP_SCHD'),'N') = 'Y' THEN
7151          IF NOT pnp_util_func.mini_retro_enabled THEN
7152             contraction(p_lease_id           => p_lease_id,
7153                         p_lease_context      => l_lease_context,
7154                         p_new_lea_term_dt    => g_new_lea_term_dt,
7155                         p_new_lea_comm_dt    => g_new_lea_comm_dt,
7156                         p_mths               => l_mths);
7157          ELSE
7158             mini_retro_contraction(p_lease_id   => p_lease_id,
7159                            p_lease_context      => l_lease_context,
7160                            p_new_lea_term_dt    => g_new_lea_term_dt,
7161                            p_new_lea_comm_dt    => g_new_lea_comm_dt,
7162                            p_mths               => l_mths,
7163                            p_cutoff_date        => l_cutoff_date);
7164          END IF;
7165       ELSE
7166          contraction_by_itm_end_dt(p_lease_id           => p_lease_id,
7167                      p_lease_context      => l_lease_context,
7168                      p_new_lea_term_dt    => g_new_lea_term_dt,
7169                      p_new_lea_comm_dt    => g_new_lea_comm_dt,
7170                      p_mths               => l_mths);
7171       END IF;
7172       pnp_debug_pkg.log('schedules_items - Contraction -End- (-)');
7173 
7174    ELSIF l_lease_context = 'EXP' AND p_called_from = 'MAIN' THEN
7175 
7176       pnp_debug_pkg.log('expansion from main +Start+ (+)');
7177 
7178       expansion(p_lease_id            => p_lease_id,
7179                 p_lease_context       => l_lease_context,
7180                 p_new_lea_term_dt     => g_new_lea_term_dt,
7181                 p_new_lea_comm_dt     => g_new_lea_comm_dt,
7182                 p_mths                => l_mths,
7183                 p_term_id             => p_term_id,
7184                 p_cutoff_date         => l_cutoff_date,
7185                 p_extend_ri           => p_extend_ri,
7186                 p_ten_trm_context     => p_ten_trm_context);
7187 
7188       pnp_debug_pkg.log('expansion from main -End- (-)');
7189 
7190    ELSIF l_lease_context IN ('ABS','LOF','SGN') THEN
7191 
7192       pnp_debug_pkg.log('abstraction +Start+ (+)');
7193 
7194       abstract(p_lease_id            => p_lease_id,
7195                p_lease_context       => l_lease_context,
7196                p_new_lea_term_dt     => g_new_lea_term_dt,
7197                p_new_lea_comm_dt     => g_new_lea_comm_dt,
7198                p_mths                => l_mths);
7199 
7200       pnp_debug_pkg.log('abstraction -End- (-)');
7201 
7202    ELSIF l_lease_context IN ('ADDEDT', 'ADDAMD') AND p_called_from = 'MAIN' THEN
7203 
7204       pnp_debug_pkg.log('addition from main +Start+ (+)');
7205 
7206       add_main(p_lease_id            => p_lease_id,
7207                p_lease_context       => l_lease_context,
7208                p_new_lea_term_dt     => g_new_lea_term_dt,
7209                p_new_lea_comm_dt     => g_new_lea_comm_dt,
7210                p_mths                => l_mths);
7211 
7212       pnp_debug_pkg.log('addition from main -End- (-)');
7213 
7214    ELSIF l_lease_context = 'ADD' AND p_called_from IN ('IND','VAR') THEN
7215 
7216       pnp_debug_pkg.log('addition from index/variable +Start+ (+)');
7217 
7218       add_ind_var(p_lease_id            => p_lease_id,
7219                   p_lease_context       => l_lease_context,
7220                   p_term_id             => p_term_id,
7221                   p_new_lea_term_dt     => g_new_lea_term_dt,
7222                   p_new_lea_comm_dt     => g_new_lea_comm_dt,
7223                   p_mths                => l_mths);
7224 
7225       PN_REC_CALC_PKG.lock_area_exp_cls_dtl(p_term_id);
7226 
7227 
7228       pnp_debug_pkg.log('addition from index/variable -End- (-)');
7229 
7230 
7231    ELSIF l_lease_context = 'CONTERM' AND p_called_from = 'MAIN' THEN
7232 
7233       pnp_debug_pkg.log('schedules_items - Payment Term Contraction +Start+ (+)');
7234       IF NVL(fnd_profile.value('PN_ERLY_TMNT_B4_LST_APP_SCHD'),'N') = 'Y' THEN
7235          IF NOT pnp_util_func.mini_retro_enabled THEN
7236             contract_pay_term(p_lease_id           => p_lease_id,
7237                               p_lease_context      => l_lease_context,
7238                               p_new_lea_term_dt    => g_new_lea_term_dt,
7239                               p_new_lea_comm_dt    => g_new_lea_comm_dt,
7240                               p_mths               => l_mths);
7241          ELSE
7242             FOR pay_term_con_cur IN payment_term_con_cur (p_lease_id)
7243             LOOP
7244                contract_pay_term_mini_retro (p_lease_id           => p_lease_id,
7245                                              p_lease_context      => l_lease_context,
7246                                              p_new_lea_term_dt    => g_new_lea_term_dt,
7247                                              p_new_lea_comm_dt    => g_new_lea_comm_dt,
7248                                              p_mths               => l_mths,
7249                                              p_normalize          => pay_term_con_cur.normalize,
7250                                              p_adjustment         => 'Y',
7251                                              p_payment_term_id    => pay_term_con_cur.payment_term_id,
7252                                              p_cutoff_date        => l_cutoff_date,
7253                                              p_add_main           => 'Y');
7254             END LOOP;
7255 
7256             /* call clean up schedules to delete schedules which do not have any item or
7257             are draft and are outside the lease */
7258 
7259             pn_retro_adjustment_pkg.cleanup_schedules(p_lease_id);
7260          END IF;
7261       ELSE
7262          contract_pay_term(p_lease_id           => p_lease_id,
7263                            p_lease_context      => l_lease_context,
7264                            p_new_lea_term_dt    => g_new_lea_term_dt,
7265                            p_new_lea_comm_dt    => g_new_lea_comm_dt,
7266                            p_mths               => l_mths);
7267       END IF;
7268       pnp_debug_pkg.log('schedules_items - Payment Term Contraction -End- (-)');
7269 
7270    -- Retro Start
7271    ELSIF l_lease_context = 'ADJ' AND p_called_from = 'MAIN' THEN
7272 
7273       IF pnp_util_func.retro_enabled THEN
7274 
7275         pnp_debug_pkg.log('schedules_items - Term Adjustment +Start+ (+)');
7276 
7277         term_id_tab.delete;
7278         l_index := 0;
7279 
7280         adjustment(p_lease_id           => p_lease_id,
7281                    p_lease_context      => l_lease_context,
7282                    p_new_lea_term_dt    => g_new_lea_term_dt,
7283                    p_new_lea_comm_dt    => g_new_lea_comm_dt,
7284                    p_mths               => l_mths);
7285 
7286         pnp_debug_pkg.log('schedules_items - Term Adjustment -End- (-)');
7287 
7288       ELSE
7289         RAISE RETRO_NOT_ENABLED_EXCEPTION;
7290       END IF;
7291       -- Retro End
7292 
7293    ELSIF l_lease_context IN ('ROLLOVER') AND p_called_from = 'MAIN' THEN
7294       pnp_debug_pkg.log('schedules_items - Lease Rollover to MTM/HLD+Start+ (+)');
7295 
7296       rollover_lease(p_lease_id         => p_lease_id ,
7297                      p_lease_end_date   => g_new_ext_end_date,
7298                      p_new_lea_term_dt  => g_new_lea_term_dt,
7299                      p_new_lea_comm_dt  => g_new_lea_comm_dt,
7300                      p_mths             => l_mths,
7301                      p_extend_ri        => p_extend_ri,
7302                      p_ten_trm_context  => p_ten_trm_context,
7303                      x_return_status    => l_return_status,
7304                      x_return_message   => l_return_message );
7305       IF NOT( l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
7306          Errbuf  := SQLERRM;
7307          Retcode := 2;
7308       END IF;
7309 
7310       pnp_debug_pkg.log('schedules_items - Lease Rollover to MTM/HLD+End+ (-)');
7311 
7312    END IF;
7313 END loop;  --While
7314 
7315    /* Generate the rent normalization report */
7316    Norm_Report(l_lease_context);
7317 
7318    -- Retro Start
7319    IF pnp_util_func.retro_enabled = TRUE THEN
7320      retro_rec_impact_report;
7321      retro_vr_impact_report;
7322    END IF;
7323    -- Retro End
7324 
7325 
7326 
7327    --Recalculate Natural Breakpoint if any changes in Lease Payment Terms
7328 
7329    l_update_nbp_flag := NULL;
7330    FOR terms_rec IN terms_cur(p1_lease_id => p_lease_id)
7331    LOOP
7332       IF terms_rec.UPDATE_NBP_FLAG = 'Y' THEN
7333          l_update_nbp_flag := 'Y';
7334          EXIT;
7335       END IF;
7336    END LOOP;
7337 
7338    IF l_update_nbp_flag = 'Y' THEN
7339       FOR var_rec in var_cur(p1_lease_id => p_lease_id)
7340       LOOP
7341 
7342          l_var_rent_id := var_rec.var_rent_id;
7343 
7344          OPEN bkhd_exists_cur;
7345          FETCH bkhd_exists_cur INTO l_dummy;
7346          CLOSE bkhd_exists_cur;
7347 
7348          pn_var_natural_bp_pkg.build_bkpt_details_main(errbuf        => l_errbuf,
7349                                                        retcode       => l_retcode,
7350                                                        p_var_rent_id => var_rec.var_rent_id);
7351 
7352          IF l_dummy IS NOT NULL THEN
7353             pn_var_defaults_pkg.create_setup_data (x_var_rent_id => var_rec.var_rent_id);
7354          END IF;
7355 
7356          pnp_debug_pkg.log('Updated Natural Breakpoints for VR - '||var_rec.var_rent_id);
7357 
7358 
7359       END LOOP;
7360 
7361       UPDATE pn_payment_terms_all
7362       SET UPDATE_NBP_FLAG = NULL
7363       WHERE lease_id = p_lease_id;
7364 
7365 
7366 
7367    END IF;
7368 
7369    -- Finished Recalculating Natural Breakpoint if any changes in Lease Payment Terms
7370 
7371    FOR no_periods_exist_rec IN no_periods_exist_cur LOOP
7372       l_calc_batch := 'N';
7373    END LOOP;
7374 
7375    IF l_calc_batch  = 'Y' THEN
7376       l_requestId := fnd_request.submit_request ('PN',
7377                                                  'PNCALNDX',
7378                                                  NULL,
7379                                                  NULL,
7380                                                  FALSE,
7381             null,null,null,null, null,g_lease_num,null,null,'Y',
7382             chr(0),  '', '',  '',
7383             '',  '',  '',  '',  '',  '',  '',  '',  '',  '',
7384             '',  '',  '',  '',  '',  '',  '',  '',  '',  '',
7385             '',  '',  '',  '',  '',  '',  '',  '',  '',  '',
7386             '',  '',  '',  '',  '',  '',  '',  '',  '',  '',
7387             '',  '',  '',  '',  '',  '',  '',  '',  '',  '',
7388             '',  '',  '',  '',  '',  '',  '',  '',  '',  '',
7389             '',  '',  '',  '',  '',  '',  '',  '',  '',  '',
7390             '',  '',  '',  '',  '',  '',  '',  '',  '',  '',
7391             '',  '',  '',  '',  '',  '',  ''
7392             );
7393 
7394       IF (l_requestId = 0 ) THEN
7395          pnp_debug_pkg.log(' ');
7396          pnp_debug_pkg.log('Could not submit Concurrent Request PNCALNDX'
7397                                    ||' (PN - Calculate Index Rent)');
7398          fnd_message.set_name('PN', 'PN_SCHIT_CONC_FAIL');
7399          pnp_debug_pkg.put_log_msg(fnd_message.get);
7400 
7401       ELSE                                        -- Got a request Id
7402          pnp_debug_pkg.log(' ');
7403          pnp_debug_pkg.log('Concurrent Request '||TO_CHAR(l_requestId)
7404                                    ||' has been submitted for: PN - Calculate Index Rent');
7405          fnd_message.set_name('PN', 'PN_SCHIT_CONC_SUCC');
7406          pnp_debug_pkg.put_log_msg(fnd_message.get);
7407       END IF;
7408    END IF;
7409 
7410    pnp_debug_pkg.log('');
7411    pnp_debug_pkg.log('');
7412    pnp_debug_pkg.log('pn_schedules_items.schedule_items -End- (-)');
7413 
7414 EXCEPTION
7415   WHEN RETRO_NOT_ENABLED_EXCEPTION THEN
7416     fnd_message.set_name ('PN', 'PN_RETRO_NOT_ENABLED');
7417     errbuf := fnd_message.get;
7418     pnp_debug_pkg.put_log_msg(errbuf);
7419     retcode := 2;
7420     RAISE;
7421 
7422   WHEN OTHERS THEN
7423     Errbuf  := SQLERRM;
7424     Retcode := 2;
7425     ROLLBACK;
7426     RAISE;
7427 
7428 END Schedules_Items;
7429 
7430 
7431 
7432 
7433 END pn_schedules_items;