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