DBA Data[Home] [Help]

PACKAGE BODY: APPS.PN_SCHEDULES_ITEMS

Source


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