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